ticket #1048
This commit is contained in:
parent
6a91ec0baa
commit
1b1720d65a
12 changed files with 85 additions and 26 deletions
28
akka-actor-tests/src/test/scala/akka/AkkaExceptionSpec.scala
Normal file
28
akka-actor-tests/src/test/scala/akka/AkkaExceptionSpec.scala
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
package akka;
|
||||||
|
|
||||||
|
import akka.actor._
|
||||||
|
import org.scalatest.matchers.MustMatchers
|
||||||
|
import org.scalatest.WordSpec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A spec that verified that the AkkaException has at least a single argument constructor of type String.
|
||||||
|
*
|
||||||
|
* This is required to make Akka Exceptions be friends with serialization/deserialization.
|
||||||
|
*/
|
||||||
|
class AkkaExceptionSpec extends WordSpec with MustMatchers {
|
||||||
|
|
||||||
|
"AkkaException" must {
|
||||||
|
"have a AkkaException(String msg) constructor to be serialization friendly" in {
|
||||||
|
//if the call to this method completes, we know what there is at least a single constructor which has
|
||||||
|
//the expected argument type.
|
||||||
|
verify(classOf[AkkaException])
|
||||||
|
|
||||||
|
//lets also try it for the exception that triggered this bug to be discovered.
|
||||||
|
verify(classOf[ActorKilledException])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def verify(clazz:java.lang.Class[_]):Unit = {
|
||||||
|
clazz.getConstructor(Array(classOf[String]): _*)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -26,6 +26,8 @@ class AkkaException(message: String = "", cause: Throwable = null) extends Runti
|
||||||
lazy val toLongString =
|
lazy val toLongString =
|
||||||
"%s: %s\n[%s]\n%s".format(getClass.getName, message, uuid, stackTraceToString)
|
"%s: %s\n[%s]\n%s".format(getClass.getName, message, uuid, stackTraceToString)
|
||||||
|
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
|
||||||
def stackTraceToString = {
|
def stackTraceToString = {
|
||||||
val trace = getStackTrace
|
val trace = getStackTrace
|
||||||
val sb = new StringBuffer
|
val sb = new StringBuffer
|
||||||
|
|
|
||||||
|
|
@ -80,12 +80,29 @@ case class MaximumNumberOfRestartsWithinTimeRangeReached(
|
||||||
@BeanProperty lastExceptionCausingRestart: Throwable) extends LifeCycleMessage
|
@BeanProperty lastExceptionCausingRestart: Throwable) extends LifeCycleMessage
|
||||||
|
|
||||||
// Exceptions for Actors
|
// Exceptions for Actors
|
||||||
class ActorStartException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
class ActorStartException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause){
|
||||||
class IllegalActorStateException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
def this(msg:String) = this(msg, null);
|
||||||
class ActorKilledException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
}
|
||||||
class ActorInitializationException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
|
||||||
class ActorTimeoutException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
class IllegalActorStateException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause) {
|
||||||
class InvalidMessageException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ActorKilledException private[akka] (message: String, cause: Throwable) extends AkkaException(message, cause){
|
||||||
|
def this(msg: String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ActorInitializationException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause) {
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ActorTimeoutException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause) {
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
class InvalidMessageException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause) {
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This message is thrown by default when an Actors behavior doesn't match a message
|
* This message is thrown by default when an Actors behavior doesn't match a message
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import java.util.concurrent._
|
||||||
import java.lang.RuntimeException
|
import java.lang.RuntimeException
|
||||||
|
|
||||||
object Scheduler {
|
object Scheduler {
|
||||||
import Actor._
|
|
||||||
|
|
||||||
case class SchedulerException(msg: String, e: Throwable) extends AkkaException(msg, e)
|
case class SchedulerException(msg: String, e: Throwable) extends AkkaException(msg, e)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,11 @@ import ReflectiveAccess._
|
||||||
import Actor._
|
import Actor._
|
||||||
|
|
||||||
import java.util.concurrent.{ CopyOnWriteArrayList, ConcurrentHashMap }
|
import java.util.concurrent.{ CopyOnWriteArrayList, ConcurrentHashMap }
|
||||||
import java.net.InetSocketAddress
|
|
||||||
import akka.config.Supervision._
|
import akka.config.Supervision._
|
||||||
|
|
||||||
class SupervisorException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
class SupervisorException private[akka] (message: String, cause: Throwable = null) extends AkkaException(message, cause) {
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory object for creating supervisors declarative. It creates instances of the 'Supervisor' class.
|
* Factory object for creating supervisors declarative. It creates instances of the 'Supervisor' class.
|
||||||
|
|
|
||||||
|
|
@ -10,18 +10,14 @@ import akka.actor._
|
||||||
import DeploymentConfig._
|
import DeploymentConfig._
|
||||||
import akka.dispatch.Future
|
import akka.dispatch.Future
|
||||||
import akka.config.Config
|
import akka.config.Config
|
||||||
import akka.util._
|
|
||||||
import akka.routing.RouterType
|
import akka.routing.RouterType
|
||||||
import akka.AkkaException
|
import akka.AkkaException
|
||||||
|
|
||||||
import com.eaio.uuid.UUID
|
import com.eaio.uuid.UUID
|
||||||
|
|
||||||
import java.net.InetSocketAddress
|
import java.net.InetSocketAddress
|
||||||
import java.util.concurrent.atomic.{ AtomicBoolean, AtomicInteger }
|
import java.util.concurrent.{ ConcurrentSkipListSet}
|
||||||
import java.util.concurrent.{ ConcurrentSkipListSet, ConcurrentHashMap }
|
|
||||||
|
|
||||||
import scala.collection.mutable.ConcurrentMap
|
|
||||||
import scala.collection.JavaConversions._
|
|
||||||
|
|
||||||
class ClusterException(message: String) extends AkkaException(message)
|
class ClusterException(message: String) extends AkkaException(message)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,13 @@ import java.net.InetAddress
|
||||||
|
|
||||||
import com.eaio.uuid.UUID
|
import com.eaio.uuid.UUID
|
||||||
|
|
||||||
class ConfigurationException(message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
class ConfigurationException(message: String, cause: Throwable = null) extends AkkaException(message, cause) {
|
||||||
class ModuleNotAvailableException(message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ModuleNotAvailableException(message: String, cause: Throwable = null) extends AkkaException(message, cause) {
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads up the configuration (from the akka.conf file).
|
* Loads up the configuration (from the akka.conf file).
|
||||||
|
|
|
||||||
|
|
@ -14,17 +14,16 @@ import akka.config._
|
||||||
import Config._
|
import Config._
|
||||||
import akka.util._
|
import akka.util._
|
||||||
import akka.actor._
|
import akka.actor._
|
||||||
import DeploymentConfig.{ ReplicationScheme, ReplicationStrategy, Transient, WriteThrough, WriteBehind }
|
import DeploymentConfig.{ ReplicationScheme}
|
||||||
import akka.event.EventHandler
|
import akka.event.EventHandler
|
||||||
import akka.dispatch.{ DefaultPromise, Promise, MessageInvocation }
|
import akka.dispatch.{ DefaultPromise, Promise, MessageInvocation }
|
||||||
import akka.remote.MessageSerializer
|
import akka.remote.MessageSerializer
|
||||||
import akka.cluster.zookeeper._
|
import akka.cluster.zookeeper._
|
||||||
import akka.serialization.{ Serializer, Serialization, Compression }
|
import akka.serialization.Compression
|
||||||
import Compression.LZF
|
import Compression.LZF
|
||||||
import akka.serialization.ActorSerialization._
|
import akka.serialization.ActorSerialization._
|
||||||
|
|
||||||
import java.util.Enumeration
|
import java.util.Enumeration
|
||||||
import java.util.concurrent.atomic.AtomicLong
|
|
||||||
|
|
||||||
// FIXME allow user to choose dynamically between 'async' and 'sync' tx logging (asyncAddEntry(byte[] data, AddCallback cb, Object ctx))
|
// FIXME allow user to choose dynamically between 'async' and 'sync' tx logging (asyncAddEntry(byte[] data, AddCallback cb, Object ctx))
|
||||||
// FIXME clean up old entries in log after doing a snapshot
|
// FIXME clean up old entries in log after doing a snapshot
|
||||||
|
|
|
||||||
|
|
@ -118,23 +118,31 @@ class VersionedData(val data: Array[Byte], val version: Long) {}
|
||||||
/**
|
/**
|
||||||
* An AkkaException thrown by the Storage module.
|
* An AkkaException thrown by the Storage module.
|
||||||
*/
|
*/
|
||||||
class StorageException(msg: String = null, cause: java.lang.Throwable = null) extends AkkaException(msg, cause)
|
class StorageException(msg: String = null, cause: java.lang.Throwable = null) extends AkkaException(msg, cause){
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* *
|
* *
|
||||||
* A StorageException thrown when an operation is done on a non existing node.
|
* A StorageException thrown when an operation is done on a non existing node.
|
||||||
*/
|
*/
|
||||||
class MissingDataException(msg: String = null, cause: java.lang.Throwable = null) extends StorageException(msg, cause)
|
class MissingDataException(msg: String = null, cause: java.lang.Throwable = null) extends StorageException(msg, cause) {
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A StorageException thrown when an operation is done on an existing node, but no node was expected.
|
* A StorageException thrown when an operation is done on an existing node, but no node was expected.
|
||||||
*/
|
*/
|
||||||
class DataExistsException(msg: String = null, cause: java.lang.Throwable = null) extends StorageException(msg, cause)
|
class DataExistsException(msg: String = null, cause: java.lang.Throwable = null) extends StorageException(msg, cause){
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A StorageException thrown when an operation causes an optimistic locking failure.
|
* A StorageException thrown when an operation causes an optimistic locking failure.
|
||||||
*/
|
*/
|
||||||
class BadVersionException(msg: String = null, cause: java.lang.Throwable = null) extends StorageException(msg, cause)
|
class BadVersionException(msg: String = null, cause: java.lang.Throwable = null) extends StorageException(msg, cause) {
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Storage implementation based on ZooKeeper.
|
* A Storage implementation based on ZooKeeper.
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,9 @@ import java.util.concurrent.atomic.{AtomicReference, AtomicBoolean}
|
||||||
import java.util.concurrent._
|
import java.util.concurrent._
|
||||||
import akka.AkkaException
|
import akka.AkkaException
|
||||||
|
|
||||||
class RemoteClientMessageBufferException(message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
class RemoteClientMessageBufferException(message: String, cause: Throwable = null) extends AkkaException(message, cause){
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
object RemoteEncoder {
|
object RemoteEncoder {
|
||||||
def encode(rmp: RemoteMessageProtocol): AkkaRemoteProtocol = {
|
def encode(rmp: RemoteMessageProtocol): AkkaRemoteProtocol = {
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import akka.event.EventHandler
|
||||||
import com.surftools.BeanstalkClient._
|
import com.surftools.BeanstalkClient._
|
||||||
import com.surftools.BeanstalkClientImpl._
|
import com.surftools.BeanstalkClientImpl._
|
||||||
|
|
||||||
class BeanstalkBasedMailboxException(message: String) extends AkkaException(message)
|
class BeanstalkBasedMailboxException(message: String) extends AkkaException(message) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,9 @@ import org.multiverse.api.exceptions.ControlFlowError
|
||||||
/**
|
/**
|
||||||
* Akka-specific exception for coordinated transactions.
|
* Akka-specific exception for coordinated transactions.
|
||||||
*/
|
*/
|
||||||
class CoordinatedTransactionException(message: String, cause: Throwable = null) extends AkkaException(message, cause)
|
class CoordinatedTransactionException(message: String, cause: Throwable = null) extends AkkaException(message, cause){
|
||||||
|
def this(msg:String) = this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Coordinated transactions across actors.
|
* Coordinated transactions across actors.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue