Merging
This commit is contained in:
parent
fc1d7b3859
commit
e3c83da036
78 changed files with 804 additions and 1021 deletions
|
|
@ -75,19 +75,19 @@
|
||||||
|
|
||||||
<!-- For Protocol/Serialization -->
|
<!-- For Protocol/Serialization -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.h2.compress</groupId>
|
<groupId>voldemort.store.compress</groupId>
|
||||||
<artifactId>h2-lzf</artifactId>
|
<artifactId>h2-lzf</artifactId>
|
||||||
<version>1.0</version>
|
<version>1.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.jackson</groupId>
|
<groupId>org.codehaus.jackson</groupId>
|
||||||
<artifactId>jackson-core-asl</artifactId>
|
<artifactId>jackson-core-asl</artifactId>
|
||||||
<version>1.1.0</version>
|
<version>1.2.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.jackson</groupId>
|
<groupId>org.codehaus.jackson</groupId>
|
||||||
<artifactId>jackson-mapper-asl</artifactId>
|
<artifactId>jackson-mapper-asl</artifactId>
|
||||||
<version>1.1.0</version>
|
<version>1.2.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.protobuf</groupId>
|
<groupId>com.google.protobuf</groupId>
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ package se.scalablesolutions.akka.actor
|
||||||
|
|
||||||
import java.net.InetSocketAddress
|
import java.net.InetSocketAddress
|
||||||
|
|
||||||
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
|
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest
|
||||||
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
|
import se.scalablesolutions.akka.remote.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
|
||||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
import se.scalablesolutions.akka.serialization.Serializer
|
import se.scalablesolutions.akka.serialization.Serializer
|
||||||
import se.scalablesolutions.akka.util._
|
import se.scalablesolutions.akka.util._
|
||||||
|
|
@ -413,13 +413,13 @@ private[akka] class Dispatcher(transactionalRequired: Boolean, val callbacks: Op
|
||||||
throw new IllegalStateException("Unexpected message [" + unexpected + "] sent to [" + this + "]")
|
throw new IllegalStateException("Unexpected message [" + unexpected + "] sent to [" + this + "]")
|
||||||
}
|
}
|
||||||
|
|
||||||
override protected def preRestart(reason: AnyRef, config: Option[AnyRef]) {
|
override protected def preRestart(reason: AnyRef) {
|
||||||
try {
|
try {
|
||||||
if (preRestart.isDefined) preRestart.get.invoke(target.get, ZERO_ITEM_OBJECT_ARRAY: _*)
|
if (preRestart.isDefined) preRestart.get.invoke(target.get, ZERO_ITEM_OBJECT_ARRAY: _*)
|
||||||
} catch { case e: InvocationTargetException => throw e.getCause }
|
} catch { case e: InvocationTargetException => throw e.getCause }
|
||||||
}
|
}
|
||||||
|
|
||||||
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {
|
override protected def postRestart(reason: AnyRef) {
|
||||||
try {
|
try {
|
||||||
if (postRestart.isDefined) postRestart.get.invoke(target.get, ZERO_ITEM_OBJECT_ARRAY: _*)
|
if (postRestart.isDefined) postRestart.get.invoke(target.get, ZERO_ITEM_OBJECT_ARRAY: _*)
|
||||||
} catch { case e: InvocationTargetException => throw e.getCause }
|
} catch { case e: InvocationTargetException => throw e.getCause }
|
||||||
|
|
|
||||||
|
|
@ -4,30 +4,30 @@
|
||||||
|
|
||||||
package se.scalablesolutions.akka.actor
|
package se.scalablesolutions.akka.actor
|
||||||
|
|
||||||
import java.net.InetSocketAddress
|
|
||||||
import se.scalablesolutions.akka.Config._
|
import se.scalablesolutions.akka.Config._
|
||||||
import se.scalablesolutions.akka.dispatch._
|
import se.scalablesolutions.akka.dispatch._
|
||||||
|
import se.scalablesolutions.akka.config.{AllForOneStrategy, OneForOneStrategy, FaultHandlingStrategy}
|
||||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
import se.scalablesolutions.akka.stm.Transaction._
|
import se.scalablesolutions.akka.stm.Transaction._
|
||||||
import se.scalablesolutions.akka.stm.TransactionManagement._
|
import se.scalablesolutions.akka.stm.TransactionManagement._
|
||||||
import se.scalablesolutions.akka.stm.{StmException, TransactionManagement}
|
import se.scalablesolutions.akka.stm.{StmException, TransactionManagement}
|
||||||
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
|
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest
|
||||||
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
|
import se.scalablesolutions.akka.remote.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
|
||||||
import se.scalablesolutions.akka.serialization.Serializer
|
import se.scalablesolutions.akka.serialization.Serializer
|
||||||
import se.scalablesolutions.akka.util.Helpers.ReadWriteLock
|
|
||||||
import se.scalablesolutions.akka.util.{HashCode, Logging}
|
import se.scalablesolutions.akka.util.{HashCode, Logging}
|
||||||
|
|
||||||
import org.codehaus.aspectwerkz.proxy.Uuid
|
import org.codehaus.aspectwerkz.proxy.Uuid
|
||||||
|
|
||||||
import org.multiverse.api.ThreadLocalTransaction._
|
import org.multiverse.api.ThreadLocalTransaction._
|
||||||
import java.util.{Queue, LinkedList, HashSet}
|
|
||||||
|
import java.util.{Queue, HashSet}
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue
|
import java.util.concurrent.ConcurrentLinkedQueue
|
||||||
|
import java.net.InetSocketAddress
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements the Transactor abstraction. E.g. a transactional actor.
|
* Implements the Transactor abstraction. E.g. a transactional actor.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Can also be achived by invoking <code>makeTransactionRequired</code>
|
* Equivalent to invoking the <code>makeTransactionRequired</code> method in the body of the <code>Actor</code
|
||||||
* in the body of the <code>Actor</code>.
|
|
||||||
*/
|
*/
|
||||||
trait Transactor extends Actor {
|
trait Transactor extends Actor {
|
||||||
makeTransactionRequired
|
makeTransactionRequired
|
||||||
|
|
@ -35,20 +35,21 @@ trait Transactor extends Actor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend this abstract class to create a remote actor.
|
* Extend this abstract class to create a remote actor.
|
||||||
* Equivalent to invoking the 'makeRemote(..)' method in or on the actor.
|
* <p/>
|
||||||
|
* Equivalent to invoking the <code>makeRemote(..)</code> method in the body of the <code>Actor</code
|
||||||
*/
|
*/
|
||||||
abstract class RemoteActor(hostname: String, port: Int) extends Actor {
|
abstract class RemoteActor(hostname: String, port: Int) extends Actor {
|
||||||
makeRemote(hostname, port)
|
makeRemote(hostname, port)
|
||||||
}
|
}
|
||||||
|
|
||||||
@serializable sealed trait LifeCycleMessage
|
@serializable sealed trait LifeCycleMessage
|
||||||
case class Init(config: AnyRef) extends LifeCycleMessage
|
|
||||||
case class HotSwap(code: Option[PartialFunction[Any, Unit]]) extends LifeCycleMessage
|
case class HotSwap(code: Option[PartialFunction[Any, Unit]]) extends LifeCycleMessage
|
||||||
case class Restart(reason: AnyRef) extends LifeCycleMessage
|
case class Restart(reason: AnyRef) extends LifeCycleMessage
|
||||||
case class Exit(dead: Actor, killer: Throwable) extends LifeCycleMessage
|
case class Exit(dead: Actor, killer: Throwable) extends LifeCycleMessage
|
||||||
case object Kill extends LifeCycleMessage
|
case object Kill extends LifeCycleMessage
|
||||||
|
|
||||||
class ActorKilledException private[akka] (val killed: Actor) extends RuntimeException("Actor [" + killed + "] was killed by a Kill message")
|
class ActorKilledException private[akka] (val killed: Actor)
|
||||||
|
extends RuntimeException("Actor [" + killed + "] was killed by a Kill message")
|
||||||
|
|
||||||
sealed abstract class DispatcherType
|
sealed abstract class DispatcherType
|
||||||
object DispatcherType {
|
object DispatcherType {
|
||||||
|
|
@ -71,6 +72,8 @@ class ActorMessageInvoker(val actor: Actor) extends MessageInvoker {
|
||||||
object Actor extends Logging {
|
object Actor extends Logging {
|
||||||
val TIMEOUT = config.getInt("akka.actor.timeout", 5000)
|
val TIMEOUT = config.getInt("akka.actor.timeout", 5000)
|
||||||
val SERIALIZE_MESSAGES = config.getBool("akka.actor.serialize-messages", false)
|
val SERIALIZE_MESSAGES = config.getBool("akka.actor.serialize-messages", false)
|
||||||
|
val HOSTNAME = config.getString("akka.remote.server.hostname", "localhost")
|
||||||
|
val PORT = config.getInt("akka.remote.server.port", 9999)
|
||||||
|
|
||||||
object Sender extends Actor {
|
object Sender extends Actor {
|
||||||
implicit val Self: AnyRef = this
|
implicit val Self: AnyRef = this
|
||||||
|
|
@ -216,7 +219,6 @@ trait Actor extends TransactionManagement {
|
||||||
|
|
||||||
implicit protected val self: Actor = this
|
implicit protected val self: Actor = this
|
||||||
|
|
||||||
// FIXME http://www.assembla.com/spaces/akka/tickets/56-Change-UUID-generation-for-the-TransactionManagement-trait
|
|
||||||
// Only mutable for RemoteServer in order to maintain identity across nodes
|
// Only mutable for RemoteServer in order to maintain identity across nodes
|
||||||
private[akka] var _uuid = Uuid.newUuid.toString
|
private[akka] var _uuid = Uuid.newUuid.toString
|
||||||
def uuid = _uuid
|
def uuid = _uuid
|
||||||
|
|
@ -225,18 +227,17 @@ trait Actor extends TransactionManagement {
|
||||||
// private fields
|
// private fields
|
||||||
// ====================================
|
// ====================================
|
||||||
|
|
||||||
@volatile private var _isRunning = false
|
@volatile private[this] var _isRunning = false
|
||||||
@volatile private var _isSuspended = true
|
@volatile private[this] var _isSuspended = true
|
||||||
@volatile private var _isShutDown: Boolean = false
|
@volatile private[this] var _isShutDown = false
|
||||||
private var _isEventBased: Boolean = false
|
@volatile private[this] var _isEventBased: Boolean = false
|
||||||
|
@volatile private[akka] var _isKilled = false
|
||||||
private var _hotswap: Option[PartialFunction[Any, Unit]] = None
|
private var _hotswap: Option[PartialFunction[Any, Unit]] = None
|
||||||
private var _config: Option[AnyRef] = None
|
|
||||||
private val _remoteFlagLock = new ReadWriteLock
|
|
||||||
private[akka] var _remoteAddress: Option[InetSocketAddress] = None
|
private[akka] var _remoteAddress: Option[InetSocketAddress] = None
|
||||||
private[akka] var _linkedActors: Option[HashSet[Actor]] = None
|
private[akka] var _linkedActors: Option[HashSet[Actor]] = None
|
||||||
private[akka] var _supervisor: Option[Actor] = None
|
private[akka] var _supervisor: Option[Actor] = None
|
||||||
|
private[akka] var _contactAddress: Option[InetSocketAddress] = None
|
||||||
private[akka] val _mailbox: Queue[MessageInvocation] = new LinkedList[MessageInvocation]
|
private[akka] val _mailbox: Queue[MessageInvocation] = new ConcurrentLinkedQueue[MessageInvocation]
|
||||||
|
|
||||||
// ====================================
|
// ====================================
|
||||||
// protected fields
|
// protected fields
|
||||||
|
|
@ -252,14 +253,14 @@ trait Actor extends TransactionManagement {
|
||||||
* message exchanges and which is in many ways better than using the '!!' method
|
* message exchanges and which is in many ways better than using the '!!' method
|
||||||
* which will make the sender wait for a reply using a *blocking* future.
|
* which will make the sender wait for a reply using a *blocking* future.
|
||||||
*/
|
*/
|
||||||
protected[this] var sender: Option[Actor] = None
|
protected var sender: Option[Actor] = None
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The 'senderFuture' field should normally not be touched by user code, which should instead use the 'reply' method.
|
* The 'senderFuture' field should normally not be touched by user code, which should instead use the 'reply' method.
|
||||||
* But it can be used for advanced use-cases when one might want to store away the future and
|
* But it can be used for advanced use-cases when one might want to store away the future and
|
||||||
* resolve it later and/or somewhere else.
|
* resolve it later and/or somewhere else.
|
||||||
*/
|
*/
|
||||||
protected[this] var senderFuture: Option[CompletableFutureResult] = None
|
protected var senderFuture: Option[CompletableFutureResult] = None
|
||||||
|
|
||||||
// ====================================
|
// ====================================
|
||||||
// ==== USER CALLBACKS TO OVERRIDE ====
|
// ==== USER CALLBACKS TO OVERRIDE ====
|
||||||
|
|
@ -316,7 +317,7 @@ trait Actor extends TransactionManagement {
|
||||||
* trapExit = List(classOf[MyApplicationException], classOf[MyApplicationError])
|
* trapExit = List(classOf[MyApplicationException], classOf[MyApplicationError])
|
||||||
* </pre>
|
* </pre>
|
||||||
*/
|
*/
|
||||||
protected[this] var trapExit: List[Class[_ <: Throwable]] = Nil
|
protected var trapExit: List[Class[_ <: Throwable]] = Nil
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User overridable callback/setting.
|
* User overridable callback/setting.
|
||||||
|
|
@ -375,7 +376,7 @@ trait Actor extends TransactionManagement {
|
||||||
* Optional callback method that is called during initialization.
|
* Optional callback method that is called during initialization.
|
||||||
* To be implemented by subclassing actor.
|
* To be implemented by subclassing actor.
|
||||||
*/
|
*/
|
||||||
protected def init(config: AnyRef) = {}
|
protected def init = {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User overridable callback/setting.
|
* User overridable callback/setting.
|
||||||
|
|
@ -383,7 +384,7 @@ trait Actor extends TransactionManagement {
|
||||||
* Mandatory callback method that is called during restart and reinitialization after a server crash.
|
* Mandatory callback method that is called during restart and reinitialization after a server crash.
|
||||||
* To be implemented by subclassing actor.
|
* To be implemented by subclassing actor.
|
||||||
*/
|
*/
|
||||||
protected def preRestart(reason: AnyRef, config: Option[AnyRef]) = {}
|
protected def preRestart(reason: AnyRef) = {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User overridable callback/setting.
|
* User overridable callback/setting.
|
||||||
|
|
@ -391,7 +392,7 @@ trait Actor extends TransactionManagement {
|
||||||
* Mandatory callback method that is called during restart and reinitialization after a server crash.
|
* Mandatory callback method that is called during restart and reinitialization after a server crash.
|
||||||
* To be implemented by subclassing actor.
|
* To be implemented by subclassing actor.
|
||||||
*/
|
*/
|
||||||
protected def postRestart(reason: AnyRef, config: Option[AnyRef]) = {}
|
protected def postRestart(reason: AnyRef) = {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User overridable callback/setting.
|
* User overridable callback/setting.
|
||||||
|
|
@ -416,12 +417,13 @@ trait Actor extends TransactionManagement {
|
||||||
/**
|
/**
|
||||||
* Starts up the actor and its message queue.
|
* Starts up the actor and its message queue.
|
||||||
*/
|
*/
|
||||||
def start: Actor = _mailbox.synchronized {
|
def start: Actor = synchronized {
|
||||||
if (_isShutDown) throw new IllegalStateException("Can't restart an actor that has been shut down with 'exit'")
|
if (_isShutDown) throw new IllegalStateException("Can't restart an actor that has been shut down with 'exit'")
|
||||||
if (!_isRunning) {
|
if (!_isRunning) {
|
||||||
messageDispatcher.register(this)
|
messageDispatcher.register(this)
|
||||||
messageDispatcher.start
|
messageDispatcher.start
|
||||||
_isRunning = true
|
_isRunning = true
|
||||||
|
init // call user-defined init method
|
||||||
//if (isTransactional) this !! TransactionalInit
|
//if (isTransactional) this !! TransactionalInit
|
||||||
}
|
}
|
||||||
Actor.log.debug("[%s] has started", toString)
|
Actor.log.debug("[%s] has started", toString)
|
||||||
|
|
@ -437,7 +439,7 @@ trait Actor extends TransactionManagement {
|
||||||
/**
|
/**
|
||||||
* Shuts down the actor its dispatcher and message queue.
|
* Shuts down the actor its dispatcher and message queue.
|
||||||
*/
|
*/
|
||||||
def stop = _mailbox.synchronized {
|
def stop = synchronized {
|
||||||
if (_isRunning) {
|
if (_isRunning) {
|
||||||
messageDispatcher.unregister(this)
|
messageDispatcher.unregister(this)
|
||||||
if (messageDispatcher.canBeShutDown) messageDispatcher.shutdown // shut down in the dispatcher's references is zero
|
if (messageDispatcher.canBeShutDown) messageDispatcher.shutdown // shut down in the dispatcher's references is zero
|
||||||
|
|
@ -448,6 +450,8 @@ trait Actor extends TransactionManagement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def isRunning = _isRunning
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a one-way asynchronous message. E.g. fire-and-forget semantics.
|
* Sends a one-way asynchronous message. E.g. fire-and-forget semantics.
|
||||||
* <p/>
|
* <p/>
|
||||||
|
|
@ -487,11 +491,13 @@ trait Actor extends TransactionManagement {
|
||||||
/**
|
/**
|
||||||
* Same as the '!' method but does not take an implicit sender as second parameter.
|
* Same as the '!' method but does not take an implicit sender as second parameter.
|
||||||
*/
|
*/
|
||||||
def send(message: Any) =
|
def send(message: Any) = {
|
||||||
|
if (_isKilled) throw new ActorKilledException(this)
|
||||||
if (_isRunning) postMessageToMailbox(message, None)
|
if (_isRunning) postMessageToMailbox(message, None)
|
||||||
else throw new IllegalStateException(
|
else throw new IllegalStateException(
|
||||||
"Actor has not been started, you need to invoke 'actor.start' before using it")
|
"Actor has not been started, you need to invoke 'actor.start' before using it")
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a message asynchronously and waits on a future for a reply message.
|
* Sends a message asynchronously and waits on a future for a reply message.
|
||||||
* <p/>
|
* <p/>
|
||||||
|
|
@ -504,21 +510,24 @@ trait Actor extends TransactionManagement {
|
||||||
* If you are sending messages using <code>!!</code> then you <b>have to</b> use <code>reply(..)</code>
|
* If you are sending messages using <code>!!</code> then you <b>have to</b> use <code>reply(..)</code>
|
||||||
* to send a reply message to the original sender. If not then the sender will block until the timeout expires.
|
* to send a reply message to the original sender. If not then the sender will block until the timeout expires.
|
||||||
*/
|
*/
|
||||||
def !: Option[T] = if (_isRunning) {
|
def !: Option[T] = {
|
||||||
val future = postMessageToMailboxAndCreateFutureResultWithTimeout(message, timeout)
|
if (_isKilled) throw new ActorKilledException(this)
|
||||||
val isActiveObject = message.isInstanceOf[Invocation]
|
if (_isRunning) {
|
||||||
if (isActiveObject && message.asInstanceOf[Invocation].isVoid) future.completeWithResult(None)
|
val future = postMessageToMailboxAndCreateFutureResultWithTimeout(message, timeout)
|
||||||
try {
|
val isActiveObject = message.isInstanceOf[Invocation]
|
||||||
future.await
|
if (isActiveObject && message.asInstanceOf[Invocation].isVoid) future.completeWithResult(None)
|
||||||
} catch {
|
try {
|
||||||
case e: FutureTimeoutException =>
|
future.await
|
||||||
if (isActiveObject) throw e
|
} catch {
|
||||||
else None
|
case e: FutureTimeoutException =>
|
||||||
}
|
if (isActiveObject) throw e
|
||||||
getResultOrThrowException(future)
|
else None
|
||||||
} else throw new IllegalStateException(
|
}
|
||||||
"Actor has not been started, you need to invoke 'actor.start' before using it")
|
getResultOrThrowException(future)
|
||||||
|
} else throw new IllegalStateException(
|
||||||
|
"Actor has not been started, you need to invoke 'actor.start' before using it")
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a message asynchronously and waits on a future for a reply message.
|
* Sends a message asynchronously and waits on a future for a reply message.
|
||||||
* <p/>
|
* <p/>
|
||||||
|
|
@ -563,11 +572,11 @@ trait Actor extends TransactionManagement {
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
"\n\tNo sender in scope, can't reply. " +
|
"\n\tNo sender in scope, can't reply. " +
|
||||||
"\n\tYou have probably used the '!' method to either; " +
|
"\n\tYou have probably used the '!' method to either; " +
|
||||||
"\n\t\t1. Send a message to a remote actor" +
|
"\n\t\t1. Send a message to a remote actor which does not have a contact address." +
|
||||||
"\n\t\t2. Send a message from an instance that is *not* an actor" +
|
"\n\t\t2. Send a message from an instance that is *not* an actor" +
|
||||||
"\n\t\t3. Send a message to an Active Object annotated with the '@oneway' annotation? " +
|
"\n\t\t3. Send a message to an Active Object annotated with the '@oneway' annotation? " +
|
||||||
"\n\tIf so, switch to '!!' (or remove '@oneway') which passes on an implicit future" +
|
"\n\tIf so, switch to '!!' (or remove '@oneway') which passes on an implicit future" +
|
||||||
"\n\tthat will be bound by the argument passed to 'reply'." )
|
"\n\tthat will be bound by the argument passed to 'reply'. Alternatively, you can use setContactAddress to make sure the actor can be contacted over the network." )
|
||||||
case Some(future) =>
|
case Some(future) =>
|
||||||
future.completeWithResult(message)
|
future.completeWithResult(message)
|
||||||
}
|
}
|
||||||
|
|
@ -585,7 +594,7 @@ trait Actor extends TransactionManagement {
|
||||||
/**
|
/**
|
||||||
* Sets the dispatcher for this actor. Needs to be invoked before the actor is started.
|
* Sets the dispatcher for this actor. Needs to be invoked before the actor is started.
|
||||||
*/
|
*/
|
||||||
def dispatcher_=(dispatcher: MessageDispatcher): Unit = _mailbox.synchronized {
|
def dispatcher_=(dispatcher: MessageDispatcher): Unit = synchronized {
|
||||||
if (!_isRunning) {
|
if (!_isRunning) {
|
||||||
messageDispatcher.unregister(this)
|
messageDispatcher.unregister(this)
|
||||||
messageDispatcher = dispatcher
|
messageDispatcher = dispatcher
|
||||||
|
|
@ -598,16 +607,23 @@ trait Actor extends TransactionManagement {
|
||||||
/**
|
/**
|
||||||
* Invoking 'makeRemote' means that an actor will be moved to and invoked on a remote host.
|
* Invoking 'makeRemote' means that an actor will be moved to and invoked on a remote host.
|
||||||
*/
|
*/
|
||||||
def makeRemote(hostname: String, port: Int): Unit = _remoteFlagLock.withWriteLock {
|
def makeRemote(hostname: String, port: Int): Unit =
|
||||||
makeRemote(new InetSocketAddress(hostname, port))
|
if (_isRunning) throw new IllegalStateException("Can't make a running actor remote. Make sure you call 'makeRemote' before 'start'.")
|
||||||
}
|
else makeRemote(new InetSocketAddress(hostname, port))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoking 'makeRemote' means that an actor will be moved to and invoked on a remote host.
|
* Invoking 'makeRemote' means that an actor will be moved to and invoked on a remote host.
|
||||||
*/
|
*/
|
||||||
def makeRemote(address: InetSocketAddress): Unit = _remoteFlagLock.withWriteLock {
|
def makeRemote(address: InetSocketAddress): Unit =
|
||||||
_remoteAddress = Some(address)
|
if (_isRunning) throw new IllegalStateException("Can't make a running actor remote. Make sure you call 'makeRemote' before 'start'.")
|
||||||
}
|
else _remoteAddress = Some(address)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the contact address for this actor. This is used for replying to messages sent asynchronously when no reply channel exists.
|
||||||
|
*/
|
||||||
|
def setContactAddress(hostname:String, port:Int): Unit = setContactAddress(new InetSocketAddress(hostname, port))
|
||||||
|
|
||||||
|
def setContactAddress(address: InetSocketAddress): Unit = _contactAddress = Some(address)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoking 'makeTransactionRequired' means that the actor will **start** a new transaction if non exists.
|
* Invoking 'makeTransactionRequired' means that the actor will **start** a new transaction if non exists.
|
||||||
|
|
@ -617,7 +633,7 @@ trait Actor extends TransactionManagement {
|
||||||
* TransactionManagement.disableTransactions
|
* TransactionManagement.disableTransactions
|
||||||
* </pre>
|
* </pre>
|
||||||
*/
|
*/
|
||||||
def makeTransactionRequired = _mailbox.synchronized {
|
def makeTransactionRequired = synchronized {
|
||||||
if (_isRunning) throw new IllegalArgumentException(
|
if (_isRunning) throw new IllegalArgumentException(
|
||||||
"Can not make actor transaction required after it has been started")
|
"Can not make actor transaction required after it has been started")
|
||||||
else isTransactionRequiresNew = true
|
else isTransactionRequiresNew = true
|
||||||
|
|
@ -758,7 +774,7 @@ trait Actor extends TransactionManagement {
|
||||||
actor
|
actor
|
||||||
}
|
}
|
||||||
|
|
||||||
private def postMessageToMailbox(message: Any, sender: Option[Actor]): Unit = _remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime
|
private def postMessageToMailbox(message: Any, sender: Option[Actor]): Unit = { // the price you pay for being able to make an actor remote at runtime
|
||||||
if (_remoteAddress.isDefined) {
|
if (_remoteAddress.isDefined) {
|
||||||
val requestBuilder = RemoteRequest.newBuilder
|
val requestBuilder = RemoteRequest.newBuilder
|
||||||
.setId(RemoteRequestIdFactory.nextId)
|
.setId(RemoteRequestIdFactory.nextId)
|
||||||
|
|
@ -770,25 +786,41 @@ trait Actor extends TransactionManagement {
|
||||||
.setIsEscaped(false)
|
.setIsEscaped(false)
|
||||||
val id = registerSupervisorAsRemoteActor
|
val id = registerSupervisorAsRemoteActor
|
||||||
if (id.isDefined) requestBuilder.setSupervisorUuid(id.get)
|
if (id.isDefined) requestBuilder.setSupervisorUuid(id.get)
|
||||||
|
|
||||||
|
// set the source fields used to reply back to the original sender
|
||||||
|
// (i.e. not the remote proxy actor)
|
||||||
|
if(sender.isDefined) {
|
||||||
|
requestBuilder.setSourceTarget(sender.get.getClass.getName)
|
||||||
|
requestBuilder.setSourceUuid(sender.get.uuid)
|
||||||
|
log.debug("Setting sending actor as " + sender.get.getClass.getName + ", " + _contactAddress)
|
||||||
|
|
||||||
|
if (sender.get._contactAddress.isDefined) {
|
||||||
|
val addr = sender.get._contactAddress.get
|
||||||
|
requestBuilder.setSourceHostname(addr.getHostName())
|
||||||
|
requestBuilder.setSourcePort(addr.getPort())
|
||||||
|
} else {
|
||||||
|
// set the contact address to the default values from the
|
||||||
|
// configuration file
|
||||||
|
requestBuilder.setSourceHostname(Actor.HOSTNAME)
|
||||||
|
requestBuilder.setSourcePort(Actor.PORT)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
RemoteProtocolBuilder.setMessage(message, requestBuilder)
|
RemoteProtocolBuilder.setMessage(message, requestBuilder)
|
||||||
RemoteClient.clientFor(_remoteAddress.get).send(requestBuilder.build)
|
RemoteClient.clientFor(_remoteAddress.get).send(requestBuilder.build)
|
||||||
} else {
|
} else {
|
||||||
val invocation = new MessageInvocation(this, message, None, sender, currentTransaction.get)
|
val invocation = new MessageInvocation(this, message, None, sender, currentTransaction.get)
|
||||||
if (_isEventBased) {
|
if (_isEventBased) {
|
||||||
_mailbox.synchronized {
|
_mailbox.add(invocation)
|
||||||
_mailbox.add(invocation)
|
if (_isSuspended) {
|
||||||
if (_isSuspended) {
|
invocation.send
|
||||||
_resume
|
|
||||||
invocation.send
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
} else invocation.send
|
||||||
else invocation.send
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private def postMessageToMailboxAndCreateFutureResultWithTimeout(message: Any, timeout: Long):
|
private def postMessageToMailboxAndCreateFutureResultWithTimeout(message: Any, timeout: Long): CompletableFutureResult = {
|
||||||
CompletableFutureResult = _remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime
|
|
||||||
if (_remoteAddress.isDefined) {
|
if (_remoteAddress.isDefined) {
|
||||||
val requestBuilder = RemoteRequest.newBuilder
|
val requestBuilder = RemoteRequest.newBuilder
|
||||||
.setId(RemoteRequestIdFactory.nextId)
|
.setId(RemoteRequestIdFactory.nextId)
|
||||||
|
|
@ -809,22 +841,17 @@ trait Actor extends TransactionManagement {
|
||||||
val future = new DefaultCompletableFutureResult(timeout)
|
val future = new DefaultCompletableFutureResult(timeout)
|
||||||
val invocation = new MessageInvocation(this, message, Some(future), None, currentTransaction.get)
|
val invocation = new MessageInvocation(this, message, Some(future), None, currentTransaction.get)
|
||||||
if (_isEventBased) {
|
if (_isEventBased) {
|
||||||
_mailbox.synchronized {
|
_mailbox.add(invocation)
|
||||||
_mailbox.add(invocation)
|
invocation.send
|
||||||
if (_isSuspended) {
|
|
||||||
_resume
|
|
||||||
invocation.send
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else invocation.send
|
} else invocation.send
|
||||||
future
|
future
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback for the dispatcher. E.g. single entry point to the user code and all protected[this] methods
|
* Callback for the dispatcher. E.g. single entry point to the user code and all protected[this] methods.
|
||||||
*/
|
*/
|
||||||
private[akka] def invoke(messageHandle: MessageInvocation) = {
|
private[akka] def invoke(messageHandle: MessageInvocation) = synchronized {
|
||||||
try {
|
try {
|
||||||
if (TransactionManagement.isTransactionalityEnabled) transactionalDispatch(messageHandle)
|
if (TransactionManagement.isTransactionalityEnabled) transactionalDispatch(messageHandle)
|
||||||
else dispatch(messageHandle)
|
else dispatch(messageHandle)
|
||||||
|
|
@ -847,6 +874,7 @@ trait Actor extends TransactionManagement {
|
||||||
else throw new IllegalArgumentException("No handler matching message [" + message + "] in " + toString)
|
else throw new IllegalArgumentException("No handler matching message [" + message + "] in " + toString)
|
||||||
} catch {
|
} catch {
|
||||||
case e =>
|
case e =>
|
||||||
|
_isKilled = true
|
||||||
Actor.log.error(e, "Could not invoke actor [%s]", this)
|
Actor.log.error(e, "Could not invoke actor [%s]", this)
|
||||||
// FIXME to fix supervisor restart of remote actor for oneway calls, inject a supervisor proxy that can send notification back to client
|
// FIXME to fix supervisor restart of remote actor for oneway calls, inject a supervisor proxy that can send notification back to client
|
||||||
if (_supervisor.isDefined) _supervisor.get ! Exit(this, e)
|
if (_supervisor.isDefined) _supervisor.get ! Exit(this, e)
|
||||||
|
|
@ -887,7 +915,7 @@ trait Actor extends TransactionManagement {
|
||||||
} else proceed
|
} else proceed
|
||||||
} catch {
|
} catch {
|
||||||
case e =>
|
case e =>
|
||||||
Actor.log.error(e, "Exception when \ninvoking actor [%s] \nwith message [%s]", this, message)
|
Actor.log.error(e, "Exception when invoking \n\tactor [%s] \n\twith message [%s]", this, message)
|
||||||
if (senderFuture.isDefined) senderFuture.get.completeWithException(this, e)
|
if (senderFuture.isDefined) senderFuture.get.completeWithException(this, e)
|
||||||
clearTransaction // need to clear currentTransaction before call to supervisor
|
clearTransaction // need to clear currentTransaction before call to supervisor
|
||||||
// FIXME to fix supervisor restart of remote actor for oneway calls, inject a supervisor proxy that can send notification back to client
|
// FIXME to fix supervisor restart of remote actor for oneway calls, inject a supervisor proxy that can send notification back to client
|
||||||
|
|
@ -904,7 +932,6 @@ trait Actor extends TransactionManagement {
|
||||||
private def base: PartialFunction[Any, Unit] = lifeCycles orElse (_hotswap getOrElse receive)
|
private def base: PartialFunction[Any, Unit] = lifeCycles orElse (_hotswap getOrElse receive)
|
||||||
|
|
||||||
private val lifeCycles: PartialFunction[Any, Unit] = {
|
private val lifeCycles: PartialFunction[Any, Unit] = {
|
||||||
case Init(config) => _config = Some(config); init(config)
|
|
||||||
case HotSwap(code) => _hotswap = code
|
case HotSwap(code) => _hotswap = code
|
||||||
case Restart(reason) => restart(reason)
|
case Restart(reason) => restart(reason)
|
||||||
case Exit(dead, reason) => handleTrapExit(dead, reason)
|
case Exit(dead, reason) => handleTrapExit(dead, reason)
|
||||||
|
|
@ -945,13 +972,14 @@ trait Actor extends TransactionManagement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private[Actor] def restart(reason: AnyRef) = _mailbox.synchronized {
|
private[Actor] def restart(reason: AnyRef) = synchronized {
|
||||||
preRestart(reason, _config)
|
preRestart(reason)
|
||||||
Actor.log.info("Restarting actor [%s] configured as PERMANENT.", id)
|
Actor.log.info("Restarting actor [%s] configured as PERMANENT.", id)
|
||||||
postRestart(reason, _config)
|
postRestart(reason)
|
||||||
|
_isKilled = false
|
||||||
}
|
}
|
||||||
|
|
||||||
private[akka] def registerSupervisorAsRemoteActor: Option[String] = _mailbox.synchronized {
|
private[akka] def registerSupervisorAsRemoteActor: Option[String] = synchronized {
|
||||||
if (_supervisor.isDefined) {
|
if (_supervisor.isDefined) {
|
||||||
RemoteClient.clientFor(_remoteAddress.get).registerSupervisorForActor(this)
|
RemoteClient.clientFor(_remoteAddress.get).registerSupervisorForActor(this)
|
||||||
Some(_supervisor.get.uuid)
|
Some(_supervisor.get.uuid)
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ package se.scalablesolutions.akka.actor
|
||||||
import java.util.concurrent._
|
import java.util.concurrent._
|
||||||
|
|
||||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
|
import se.scalablesolutions.akka.config.{AllForOneStrategy, OneForOneStrategy, FaultHandlingStrategy}
|
||||||
import se.scalablesolutions.akka.util.{Logging}
|
import se.scalablesolutions.akka.util.{Logging}
|
||||||
|
|
||||||
import org.scala_tools.javautils.Imports._
|
import org.scala_tools.javautils.Imports._
|
||||||
|
|
|
||||||
|
|
@ -5,17 +5,13 @@
|
||||||
package se.scalablesolutions.akka.actor
|
package se.scalablesolutions.akka.actor
|
||||||
|
|
||||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
import se.scalablesolutions.akka.config.{ConfiguratorRepository, Configurator}
|
import se.scalablesolutions.akka.config.{AllForOneStrategy, OneForOneStrategy, FaultHandlingStrategy, ConfiguratorRepository, Configurator}
|
||||||
import se.scalablesolutions.akka.util.Helpers._
|
import se.scalablesolutions.akka.util.Helpers._
|
||||||
import se.scalablesolutions.akka.util.Logging
|
import se.scalablesolutions.akka.util.Logging
|
||||||
import se.scalablesolutions.akka.dispatch.Dispatchers
|
import se.scalablesolutions.akka.dispatch.Dispatchers
|
||||||
|
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
sealed abstract class FaultHandlingStrategy
|
|
||||||
case class AllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends FaultHandlingStrategy
|
|
||||||
case class OneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends FaultHandlingStrategy
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract base class for all supervisor factories.
|
* Abstract base class for all supervisor factories.
|
||||||
* <p>
|
* <p>
|
||||||
|
|
@ -96,10 +92,6 @@ sealed class Supervisor private[akka] (handler: FaultHandlingStrategy, trapExcep
|
||||||
|
|
||||||
override def start: Actor = synchronized {
|
override def start: Actor = synchronized {
|
||||||
ConfiguratorRepository.registerConfigurator(this)
|
ConfiguratorRepository.registerConfigurator(this)
|
||||||
getLinkedActors.toArray.toList.asInstanceOf[List[Actor]].foreach { actor =>
|
|
||||||
actor.start
|
|
||||||
log.info("Starting actor: %s", actor)
|
|
||||||
}
|
|
||||||
super[Actor].start
|
super[Actor].start
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,10 @@ package se.scalablesolutions.akka.config
|
||||||
import se.scalablesolutions.akka.actor.Actor
|
import se.scalablesolutions.akka.actor.Actor
|
||||||
import se.scalablesolutions.akka.dispatch.MessageDispatcher
|
import se.scalablesolutions.akka.dispatch.MessageDispatcher
|
||||||
|
|
||||||
|
sealed abstract class FaultHandlingStrategy
|
||||||
|
case class AllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends FaultHandlingStrategy
|
||||||
|
case class OneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends FaultHandlingStrategy
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration classes - not to be used as messages.
|
* Configuration classes - not to be used as messages.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -56,19 +56,19 @@ package se.scalablesolutions.akka.dispatch
|
||||||
class ExecutorBasedEventDrivenDispatcher(_name: String) extends MessageDispatcher with ThreadPoolBuilder {
|
class ExecutorBasedEventDrivenDispatcher(_name: String) extends MessageDispatcher with ThreadPoolBuilder {
|
||||||
@volatile private var active: Boolean = false
|
@volatile private var active: Boolean = false
|
||||||
|
|
||||||
val name = "event-driven:executor:dispatcher:" + _name
|
val name: String = "event-driven:executor:dispatcher:" + _name
|
||||||
|
|
||||||
withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity.buildThreadPool
|
withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity.buildThreadPool
|
||||||
|
|
||||||
def dispatch(invocation: MessageInvocation) = if (active) {
|
def dispatch(invocation: MessageInvocation) = if (active) {
|
||||||
executor.execute(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
def run = {
|
def run = {
|
||||||
val mailbox = invocation.receiver._mailbox
|
invocation.receiver.synchronized {
|
||||||
mailbox.synchronized {
|
val messages = invocation.receiver._mailbox.iterator
|
||||||
val messages = mailbox.toArray
|
while (messages.hasNext) {
|
||||||
messages.foreach(message => message.asInstanceOf[MessageInvocation].invoke)
|
messages.next.asInstanceOf[MessageInvocation].invoke
|
||||||
mailbox.clear
|
messages.remove
|
||||||
invocation.receiver._suspend
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -85,5 +85,4 @@ class ExecutorBasedEventDrivenDispatcher(_name: String) extends MessageDispatche
|
||||||
|
|
||||||
def ensureNotActive: Unit = if (active) throw new IllegalStateException(
|
def ensureNotActive: Unit = if (active) throw new IllegalStateException(
|
||||||
"Can't build a new thread pool for a dispatcher that is already up and running")
|
"Can't build a new thread pool for a dispatcher that is already up and running")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -27,7 +27,7 @@ final class MessageInvocation(val receiver: Actor,
|
||||||
override def hashCode(): Int = synchronized {
|
override def hashCode(): Int = synchronized {
|
||||||
var result = HashCode.SEED
|
var result = HashCode.SEED
|
||||||
result = HashCode.hash(result, receiver)
|
result = HashCode.hash(result, receiver)
|
||||||
result = HashCode.hash(result, message)
|
result = HashCode.hash(result, message.asInstanceOf[AnyRef])
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,18 +12,19 @@ import java.util.Collection
|
||||||
|
|
||||||
trait ThreadPoolBuilder {
|
trait ThreadPoolBuilder {
|
||||||
val name: String
|
val name: String
|
||||||
|
|
||||||
private val NR_START_THREADS = 4
|
private val NR_START_THREADS = 4
|
||||||
private val NR_MAX_THREADS = 128
|
private val NR_MAX_THREADS = 128
|
||||||
private val KEEP_ALIVE_TIME = 60000L // default is one minute
|
private val KEEP_ALIVE_TIME = 60000L // default is one minute
|
||||||
private val MILLISECONDS = TimeUnit.MILLISECONDS
|
private val MILLISECONDS = TimeUnit.MILLISECONDS
|
||||||
|
|
||||||
private var threadPoolBuilder: ThreadPoolExecutor = _
|
private var threadPoolBuilder: ThreadPoolExecutor = _
|
||||||
private val threadFactory = new MonitorableThreadFactory(name)
|
|
||||||
private var boundedExecutorBound = -1
|
private var boundedExecutorBound = -1
|
||||||
private var inProcessOfBuilding = false
|
private var inProcessOfBuilding = false
|
||||||
private var blockingQueue: BlockingQueue[Runnable] = _
|
private var blockingQueue: BlockingQueue[Runnable] = _
|
||||||
|
|
||||||
|
private lazy val threadFactory = new MonitorableThreadFactory(name)
|
||||||
|
|
||||||
protected var executor: ExecutorService = _
|
protected var executor: ExecutorService = _
|
||||||
|
|
||||||
def buildThreadPool = synchronized {
|
def buildThreadPool = synchronized {
|
||||||
|
|
@ -38,7 +39,7 @@ trait ThreadPoolBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def withNewThreadPoolWithQueue(queue: BlockingQueue[Runnable]): ThreadPoolBuilder = synchronized {
|
def withNewThreadPoolWithCustomBlockingQueue(queue: BlockingQueue[Runnable]): ThreadPoolBuilder = synchronized {
|
||||||
ensureNotActive
|
ensureNotActive
|
||||||
verifyNotInConstructionPhase
|
verifyNotInConstructionPhase
|
||||||
inProcessOfBuilding = false
|
inProcessOfBuilding = false
|
||||||
|
|
@ -52,7 +53,7 @@ trait ThreadPoolBuilder {
|
||||||
* <p/>
|
* <p/>
|
||||||
* The 'bound' variable should specify the number equal to the size of the thread pool PLUS the number of queued tasks that should be followed.
|
* The 'bound' variable should specify the number equal to the size of the thread pool PLUS the number of queued tasks that should be followed.
|
||||||
*/
|
*/
|
||||||
def withNewThreadPoolWithBoundedBlockingQueue(bound: Int): ThreadPoolBuilder = synchronized {
|
def withNewBoundedThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity(bound: Int): ThreadPoolBuilder = synchronized {
|
||||||
ensureNotActive
|
ensureNotActive
|
||||||
verifyNotInConstructionPhase
|
verifyNotInConstructionPhase
|
||||||
blockingQueue = new LinkedBlockingQueue[Runnable]
|
blockingQueue = new LinkedBlockingQueue[Runnable]
|
||||||
|
|
@ -61,19 +62,19 @@ trait ThreadPoolBuilder {
|
||||||
this
|
this
|
||||||
}
|
}
|
||||||
|
|
||||||
def withNewThreadPoolWithLinkedBlockingQueueWithCapacity(capacity: Int): ThreadPoolBuilder = synchronized {
|
def withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity: ThreadPoolBuilder = synchronized {
|
||||||
ensureNotActive
|
ensureNotActive
|
||||||
verifyNotInConstructionPhase
|
verifyNotInConstructionPhase
|
||||||
blockingQueue = new LinkedBlockingQueue[Runnable](capacity)
|
blockingQueue = new LinkedBlockingQueue[Runnable]
|
||||||
threadPoolBuilder = new ThreadPoolExecutor(
|
threadPoolBuilder = new ThreadPoolExecutor(
|
||||||
NR_START_THREADS, NR_MAX_THREADS, KEEP_ALIVE_TIME, MILLISECONDS, blockingQueue, threadFactory, new CallerRunsPolicy)
|
NR_START_THREADS, NR_MAX_THREADS, KEEP_ALIVE_TIME, MILLISECONDS, blockingQueue, threadFactory, new CallerRunsPolicy)
|
||||||
this
|
this
|
||||||
}
|
}
|
||||||
|
|
||||||
def withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity: ThreadPoolBuilder = synchronized {
|
def withNewThreadPoolWithLinkedBlockingQueueWithCapacity(capacity: Int): ThreadPoolBuilder = synchronized {
|
||||||
ensureNotActive
|
ensureNotActive
|
||||||
verifyNotInConstructionPhase
|
verifyNotInConstructionPhase
|
||||||
blockingQueue = new LinkedBlockingQueue[Runnable]
|
blockingQueue = new LinkedBlockingQueue[Runnable](capacity)
|
||||||
threadPoolBuilder = new ThreadPoolExecutor(
|
threadPoolBuilder = new ThreadPoolExecutor(
|
||||||
NR_START_THREADS, NR_MAX_THREADS, KEEP_ALIVE_TIME, MILLISECONDS, blockingQueue, threadFactory, new CallerRunsPolicy)
|
NR_START_THREADS, NR_MAX_THREADS, KEEP_ALIVE_TIME, MILLISECONDS, blockingQueue, threadFactory, new CallerRunsPolicy)
|
||||||
this
|
this
|
||||||
|
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio
|
|
||||||
|
|
||||||
import org.h2.compress.{LZFInputStream, LZFOutputStream}
|
|
||||||
|
|
||||||
import org.jboss.netty.channel.{Channel, ChannelHandlerContext, ChannelPipelineCoverage}
|
|
||||||
import org.jboss.netty.buffer.{ChannelBufferOutputStream, ChannelBufferInputStream, ChannelBuffer}
|
|
||||||
import org.jboss.netty.handler.codec.oneone.{OneToOneEncoder, OneToOneDecoder};
|
|
||||||
|
|
||||||
@ChannelPipelineCoverage("all")
|
|
||||||
class LzfDecoder extends OneToOneDecoder {
|
|
||||||
override protected def decode(ctx: ChannelHandlerContext, channel: Channel, message: AnyRef) = {
|
|
||||||
if (!(message.isInstanceOf[ChannelBuffer])) message
|
|
||||||
else {
|
|
||||||
new LZFInputStream(new ChannelBufferInputStream(message.asInstanceOf[ChannelBuffer]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ChannelPipelineCoverage("all")
|
|
||||||
class LzfEncoder extends OneToOneEncoder {
|
|
||||||
override protected def encode(ctx: ChannelHandlerContext, channel: Channel, message: AnyRef) = {
|
|
||||||
if (!(message.isInstanceOf[ChannelBuffer])) message
|
|
||||||
else new LZFOutputStream(new ChannelBufferOutputStream(message.asInstanceOf[ChannelBuffer]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -2,11 +2,11 @@
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio
|
package se.scalablesolutions.akka.remote
|
||||||
|
|
||||||
import scala.collection.mutable.HashMap
|
import scala.collection.mutable.HashMap
|
||||||
|
|
||||||
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
|
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
|
||||||
import se.scalablesolutions.akka.actor.{Exit, Actor}
|
import se.scalablesolutions.akka.actor.{Exit, Actor}
|
||||||
import se.scalablesolutions.akka.dispatch.{DefaultCompletableFutureResult, CompletableFutureResult}
|
import se.scalablesolutions.akka.dispatch.{DefaultCompletableFutureResult, CompletableFutureResult}
|
||||||
import se.scalablesolutions.akka.util.Logging
|
import se.scalablesolutions.akka.util.Logging
|
||||||
|
|
@ -32,7 +32,7 @@ object RemoteClient extends Logging {
|
||||||
val RECONNECT_DELAY = config.getInt("akka.remote.client.reconnect-delay", 5000)
|
val RECONNECT_DELAY = config.getInt("akka.remote.client.reconnect-delay", 5000)
|
||||||
|
|
||||||
// TODO: add configuration optons: 'HashedWheelTimer(long tickDuration, TimeUnit unit, int ticksPerWheel)'
|
// TODO: add configuration optons: 'HashedWheelTimer(long tickDuration, TimeUnit unit, int ticksPerWheel)'
|
||||||
private[akka] val TIMER = new HashedWheelTimer
|
// private[akka] val TIMER = new HashedWheelTimer
|
||||||
private val clients = new HashMap[String, RemoteClient]
|
private val clients = new HashMap[String, RemoteClient]
|
||||||
|
|
||||||
def clientFor(address: InetSocketAddress): RemoteClient = synchronized {
|
def clientFor(address: InetSocketAddress): RemoteClient = synchronized {
|
||||||
|
|
@ -47,6 +47,15 @@ object RemoteClient extends Logging {
|
||||||
client
|
client
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clean-up all open connections
|
||||||
|
*/
|
||||||
|
def shutdownAll() = synchronized {
|
||||||
|
clients.foreach({case (addr, client) => client.shutdown})
|
||||||
|
clients.clear
|
||||||
|
// TIMER.stop
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -66,7 +75,9 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
|
||||||
|
|
||||||
private val bootstrap = new ClientBootstrap(channelFactory)
|
private val bootstrap = new ClientBootstrap(channelFactory)
|
||||||
|
|
||||||
bootstrap.setPipelineFactory(new RemoteClientPipelineFactory(name, futures, supervisors, bootstrap))
|
private val timer = new HashedWheelTimer
|
||||||
|
|
||||||
|
bootstrap.setPipelineFactory(new RemoteClientPipelineFactory(name, futures, supervisors, bootstrap, timer))
|
||||||
bootstrap.setOption("tcpNoDelay", true)
|
bootstrap.setOption("tcpNoDelay", true)
|
||||||
bootstrap.setOption("keepAlive", true)
|
bootstrap.setOption("keepAlive", true)
|
||||||
|
|
||||||
|
|
@ -91,6 +102,7 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
|
||||||
connection.getChannel.getCloseFuture.awaitUninterruptibly
|
connection.getChannel.getCloseFuture.awaitUninterruptibly
|
||||||
channelFactory.releaseExternalResources
|
channelFactory.releaseExternalResources
|
||||||
}
|
}
|
||||||
|
timer.stop
|
||||||
}
|
}
|
||||||
|
|
||||||
def send(request: RemoteRequest): Option[CompletableFutureResult] = if (isRunning) {
|
def send(request: RemoteRequest): Option[CompletableFutureResult] = if (isRunning) {
|
||||||
|
|
@ -124,10 +136,11 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
|
||||||
class RemoteClientPipelineFactory(name: String,
|
class RemoteClientPipelineFactory(name: String,
|
||||||
futures: ConcurrentMap[Long, CompletableFutureResult],
|
futures: ConcurrentMap[Long, CompletableFutureResult],
|
||||||
supervisors: ConcurrentMap[String, Actor],
|
supervisors: ConcurrentMap[String, Actor],
|
||||||
bootstrap: ClientBootstrap) extends ChannelPipelineFactory {
|
bootstrap: ClientBootstrap,
|
||||||
|
timer: HashedWheelTimer) extends ChannelPipelineFactory {
|
||||||
def getPipeline: ChannelPipeline = {
|
def getPipeline: ChannelPipeline = {
|
||||||
val pipeline = Channels.pipeline()
|
val pipeline = Channels.pipeline()
|
||||||
pipeline.addLast("timeout", new ReadTimeoutHandler(RemoteClient.TIMER, RemoteClient.READ_TIMEOUT))
|
pipeline.addLast("timeout", new ReadTimeoutHandler(timer, RemoteClient.READ_TIMEOUT))
|
||||||
RemoteServer.COMPRESSION_SCHEME match {
|
RemoteServer.COMPRESSION_SCHEME match {
|
||||||
case "zlib" => pipeline.addLast("zlibDecoder", new ZlibDecoder)
|
case "zlib" => pipeline.addLast("zlibDecoder", new ZlibDecoder)
|
||||||
//case "lzf" => pipeline.addLast("lzfDecoder", new LzfDecoder)
|
//case "lzf" => pipeline.addLast("lzfDecoder", new LzfDecoder)
|
||||||
|
|
@ -142,7 +155,7 @@ class RemoteClientPipelineFactory(name: String,
|
||||||
}
|
}
|
||||||
pipeline.addLast("frameEncoder", new LengthFieldPrepender(4))
|
pipeline.addLast("frameEncoder", new LengthFieldPrepender(4))
|
||||||
pipeline.addLast("protobufEncoder", new ProtobufEncoder())
|
pipeline.addLast("protobufEncoder", new ProtobufEncoder())
|
||||||
pipeline.addLast("handler", new RemoteClientHandler(name, futures, supervisors, bootstrap))
|
pipeline.addLast("handler", new RemoteClientHandler(name, futures, supervisors, bootstrap, timer))
|
||||||
pipeline
|
pipeline
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -154,7 +167,8 @@ class RemoteClientPipelineFactory(name: String,
|
||||||
class RemoteClientHandler(val name: String,
|
class RemoteClientHandler(val name: String,
|
||||||
val futures: ConcurrentMap[Long, CompletableFutureResult],
|
val futures: ConcurrentMap[Long, CompletableFutureResult],
|
||||||
val supervisors: ConcurrentMap[String, Actor],
|
val supervisors: ConcurrentMap[String, Actor],
|
||||||
val bootstrap: ClientBootstrap)
|
val bootstrap: ClientBootstrap,
|
||||||
|
val timer: HashedWheelTimer)
|
||||||
extends SimpleChannelUpstreamHandler with Logging {
|
extends SimpleChannelUpstreamHandler with Logging {
|
||||||
import Actor.Sender.Self
|
import Actor.Sender.Self
|
||||||
|
|
||||||
|
|
@ -196,7 +210,7 @@ class RemoteClientHandler(val name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
override def channelClosed(ctx: ChannelHandlerContext, event: ChannelStateEvent) = {
|
override def channelClosed(ctx: ChannelHandlerContext, event: ChannelStateEvent) = {
|
||||||
RemoteClient.TIMER.newTimeout(new TimerTask() {
|
timer.newTimeout(new TimerTask() {
|
||||||
def run(timeout: Timeout) = {
|
def run(timeout: Timeout) = {
|
||||||
log.debug("Remote client reconnecting to [%s]", ctx.getChannel.getRemoteAddress)
|
log.debug("Remote client reconnecting to [%s]", ctx.getChannel.getRemoteAddress)
|
||||||
bootstrap.connect
|
bootstrap.connect
|
||||||
|
|
@ -2,11 +2,11 @@
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio
|
package se.scalablesolutions.akka.remote
|
||||||
|
|
||||||
import se.scalablesolutions.akka.serialization.Serializable.SBinary
|
import se.scalablesolutions.akka.serialization.Serializable.SBinary
|
||||||
import se.scalablesolutions.akka.serialization.{Serializer, Serializable, SerializationProtocol}
|
import se.scalablesolutions.akka.serialization.{Serializer, Serializable, SerializationProtocol}
|
||||||
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
|
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
|
||||||
|
|
||||||
import com.google.protobuf.{Message, ByteString}
|
import com.google.protobuf.{Message, ByteString}
|
||||||
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio
|
package se.scalablesolutions.akka.remote
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException
|
import java.lang.reflect.InvocationTargetException
|
||||||
import java.net.InetSocketAddress
|
import java.net.InetSocketAddress
|
||||||
|
|
@ -10,11 +10,12 @@ import java.util.concurrent.{ConcurrentHashMap, Executors}
|
||||||
|
|
||||||
import se.scalablesolutions.akka.actor._
|
import se.scalablesolutions.akka.actor._
|
||||||
import se.scalablesolutions.akka.util._
|
import se.scalablesolutions.akka.util._
|
||||||
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.{RemoteReply, RemoteRequest}
|
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.{RemoteReply, RemoteRequest}
|
||||||
import se.scalablesolutions.akka.Config.config
|
import se.scalablesolutions.akka.Config.config
|
||||||
|
|
||||||
import org.jboss.netty.bootstrap.ServerBootstrap
|
import org.jboss.netty.bootstrap.ServerBootstrap
|
||||||
import org.jboss.netty.channel._
|
import org.jboss.netty.channel._
|
||||||
|
import org.jboss.netty.channel.group.{DefaultChannelGroup, ChannelGroup}
|
||||||
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory
|
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory
|
||||||
import org.jboss.netty.handler.codec.frame.{LengthFieldBasedFrameDecoder, LengthFieldPrepender}
|
import org.jboss.netty.handler.codec.frame.{LengthFieldBasedFrameDecoder, LengthFieldPrepender}
|
||||||
import org.jboss.netty.handler.codec.protobuf.{ProtobufDecoder, ProtobufEncoder}
|
import org.jboss.netty.handler.codec.protobuf.{ProtobufDecoder, ProtobufEncoder}
|
||||||
|
|
@ -24,14 +25,19 @@ import org.jboss.netty.handler.codec.compression.{ZlibEncoder, ZlibDecoder}
|
||||||
* Use this object if you need a single remote server on a specific node.
|
* Use this object if you need a single remote server on a specific node.
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
|
* // takes hostname and port from 'akka.conf'
|
||||||
* RemoteNode.start
|
* RemoteNode.start
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
* <pre>
|
||||||
|
* RemoteNode.start(hostname, port)
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
* If you need to create more than one, then you can use the RemoteServer:
|
* If you need to create more than one, then you can use the RemoteServer:
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* val server = new RemoteServer
|
* val server = new RemoteServer
|
||||||
* server.start
|
* server.start(hostname, port)
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
|
|
@ -40,7 +46,7 @@ object RemoteNode extends RemoteServer
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This object holds configuration variables.
|
* This object holds configuration variables.
|
||||||
*
|
*
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
*/
|
*/
|
||||||
object RemoteServer {
|
object RemoteServer {
|
||||||
|
|
@ -79,7 +85,7 @@ class RemoteServer extends Logging {
|
||||||
|
|
||||||
private var hostname = RemoteServer.HOSTNAME
|
private var hostname = RemoteServer.HOSTNAME
|
||||||
private var port = RemoteServer.PORT
|
private var port = RemoteServer.PORT
|
||||||
|
|
||||||
@volatile private var isRunning = false
|
@volatile private var isRunning = false
|
||||||
@volatile private var isConfigured = false
|
@volatile private var isConfigured = false
|
||||||
|
|
||||||
|
|
@ -89,6 +95,9 @@ class RemoteServer extends Logging {
|
||||||
|
|
||||||
private val bootstrap = new ServerBootstrap(factory)
|
private val bootstrap = new ServerBootstrap(factory)
|
||||||
|
|
||||||
|
// group of open channels, used for clean-up
|
||||||
|
private val openChannels: ChannelGroup = new DefaultChannelGroup("akka-server")
|
||||||
|
|
||||||
def start: Unit = start(None)
|
def start: Unit = start(None)
|
||||||
|
|
||||||
def start(loader: Option[ClassLoader]): Unit = start(hostname, port, loader)
|
def start(loader: Option[ClassLoader]): Unit = start(hostname, port, loader)
|
||||||
|
|
@ -100,20 +109,21 @@ class RemoteServer extends Logging {
|
||||||
hostname = _hostname
|
hostname = _hostname
|
||||||
port = _port
|
port = _port
|
||||||
log.info("Starting remote server at [%s:%s]", hostname, port)
|
log.info("Starting remote server at [%s:%s]", hostname, port)
|
||||||
bootstrap.setPipelineFactory(new RemoteServerPipelineFactory(name, loader))
|
bootstrap.setPipelineFactory(new RemoteServerPipelineFactory(name, openChannels, loader))
|
||||||
|
|
||||||
// FIXME make these RemoteServer options configurable
|
// FIXME make these RemoteServer options configurable
|
||||||
bootstrap.setOption("child.tcpNoDelay", true)
|
bootstrap.setOption("child.tcpNoDelay", true)
|
||||||
bootstrap.setOption("child.keepAlive", true)
|
bootstrap.setOption("child.keepAlive", true)
|
||||||
bootstrap.setOption("child.reuseAddress", true)
|
bootstrap.setOption("child.reuseAddress", true)
|
||||||
bootstrap.setOption("child.connectTimeoutMillis", RemoteServer.CONNECTION_TIMEOUT_MILLIS)
|
bootstrap.setOption("child.connectTimeoutMillis", RemoteServer.CONNECTION_TIMEOUT_MILLIS)
|
||||||
bootstrap.bind(new InetSocketAddress(hostname, port))
|
openChannels.add(bootstrap.bind(new InetSocketAddress(hostname, port)))
|
||||||
isRunning = true
|
isRunning = true
|
||||||
Cluster.registerLocalNode(hostname,port)
|
Cluster.registerLocalNode(hostname,port)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def shutdown = {
|
def shutdown = {
|
||||||
|
openChannels.close.awaitUninterruptibly()
|
||||||
bootstrap.releaseExternalResources
|
bootstrap.releaseExternalResources
|
||||||
Cluster.deregisterLocalNode(hostname,port)
|
Cluster.deregisterLocalNode(hostname,port)
|
||||||
}
|
}
|
||||||
|
|
@ -122,11 +132,11 @@ class RemoteServer extends Logging {
|
||||||
/**
|
/**
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
*/
|
*/
|
||||||
class RemoteServerPipelineFactory(name: String, loader: Option[ClassLoader])
|
class RemoteServerPipelineFactory(name: String, openChannels: ChannelGroup, loader: Option[ClassLoader])
|
||||||
extends ChannelPipelineFactory {
|
extends ChannelPipelineFactory {
|
||||||
import RemoteServer._
|
import RemoteServer._
|
||||||
|
|
||||||
def getPipeline: ChannelPipeline = {
|
def getPipeline: ChannelPipeline = {
|
||||||
val pipeline = Channels.pipeline()
|
val pipeline = Channels.pipeline()
|
||||||
RemoteServer.COMPRESSION_SCHEME match {
|
RemoteServer.COMPRESSION_SCHEME match {
|
||||||
case "zlib" => pipeline.addLast("zlibDecoder", new ZlibDecoder)
|
case "zlib" => pipeline.addLast("zlibDecoder", new ZlibDecoder)
|
||||||
|
|
@ -142,7 +152,7 @@ class RemoteServerPipelineFactory(name: String, loader: Option[ClassLoader])
|
||||||
}
|
}
|
||||||
pipeline.addLast("frameEncoder", new LengthFieldPrepender(4))
|
pipeline.addLast("frameEncoder", new LengthFieldPrepender(4))
|
||||||
pipeline.addLast("protobufEncoder", new ProtobufEncoder)
|
pipeline.addLast("protobufEncoder", new ProtobufEncoder)
|
||||||
pipeline.addLast("handler", new RemoteServerHandler(name, loader))
|
pipeline.addLast("handler", new RemoteServerHandler(name, openChannels, loader))
|
||||||
pipeline
|
pipeline
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -150,14 +160,23 @@ class RemoteServerPipelineFactory(name: String, loader: Option[ClassLoader])
|
||||||
/**
|
/**
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
*/
|
*/
|
||||||
@ChannelPipelineCoverage { val value = "all" }
|
@ChannelPipelineCoverage {val value = "all"}
|
||||||
class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassLoader])
|
class RemoteServerHandler(val name: String, openChannels: ChannelGroup, val applicationLoader: Option[ClassLoader])
|
||||||
extends SimpleChannelUpstreamHandler with Logging {
|
extends SimpleChannelUpstreamHandler with Logging {
|
||||||
val AW_PROXY_PREFIX = "$$ProxiedByAW".intern
|
val AW_PROXY_PREFIX = "$$ProxiedByAW".intern
|
||||||
|
|
||||||
private val activeObjects = new ConcurrentHashMap[String, AnyRef]
|
private val activeObjects = new ConcurrentHashMap[String, AnyRef]
|
||||||
private val actors = new ConcurrentHashMap[String, Actor]
|
private val actors = new ConcurrentHashMap[String, Actor]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ChannelOpen overridden to store open channels for a clean shutdown
|
||||||
|
* of a RemoteServer. If a channel is closed before, it is
|
||||||
|
* automatically removed from the open channels group.
|
||||||
|
*/
|
||||||
|
override def channelOpen(ctx: ChannelHandlerContext, event: ChannelStateEvent) {
|
||||||
|
openChannels.add(ctx.getChannel)
|
||||||
|
}
|
||||||
|
|
||||||
override def handleUpstream(ctx: ChannelHandlerContext, event: ChannelEvent) = {
|
override def handleUpstream(ctx: ChannelHandlerContext, event: ChannelEvent) = {
|
||||||
if (event.isInstanceOf[ChannelStateEvent] &&
|
if (event.isInstanceOf[ChannelStateEvent] &&
|
||||||
event.asInstanceOf[ChannelStateEvent].getState != ChannelState.INTEREST_OPS) {
|
event.asInstanceOf[ChannelStateEvent].getState != ChannelState.INTEREST_OPS) {
|
||||||
|
|
@ -189,20 +208,33 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
|
||||||
private def dispatchToActor(request: RemoteRequest, channel: Channel) = {
|
private def dispatchToActor(request: RemoteRequest, channel: Channel) = {
|
||||||
log.debug("Dispatching to remote actor [%s]", request.getTarget)
|
log.debug("Dispatching to remote actor [%s]", request.getTarget)
|
||||||
val actor = createActor(request.getTarget, request.getUuid, request.getTimeout)
|
val actor = createActor(request.getTarget, request.getUuid, request.getTimeout)
|
||||||
actor.start
|
|
||||||
val message = RemoteProtocolBuilder.getMessage(request)
|
val message = RemoteProtocolBuilder.getMessage(request)
|
||||||
if (request.getIsOneWay) {
|
if (request.getIsOneWay) {
|
||||||
actor.send(message)
|
if (request.hasSourceHostname && request.hasSourcePort) {
|
||||||
}
|
// re-create the sending actor
|
||||||
else {
|
val targetClass = if (request.hasSourceTarget) request.getSourceTarget
|
||||||
|
else request.getTarget
|
||||||
|
|
||||||
|
val remoteActor = createActor(targetClass, request.getSourceUuid, request.getTimeout)
|
||||||
|
if (!remoteActor.isRunning) {
|
||||||
|
remoteActor.makeRemote(request.getSourceHostname, request.getSourcePort)
|
||||||
|
remoteActor.start
|
||||||
|
}
|
||||||
|
actor.!(message)(remoteActor)
|
||||||
|
} else {
|
||||||
|
// couldn't find a way to reply, send the message without a source/sender
|
||||||
|
actor.send(message)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
try {
|
try {
|
||||||
val resultOrNone = actor !! message
|
val resultOrNone = actor !! message
|
||||||
val result: AnyRef = if (resultOrNone.isDefined) resultOrNone.get else null
|
val result: AnyRef = if (resultOrNone.isDefined) resultOrNone.get else null
|
||||||
log.debug("Returning result from actor invocation [%s]", result)
|
log.debug("Returning result from actor invocation [%s]", result)
|
||||||
val replyBuilder = RemoteReply.newBuilder
|
val replyBuilder = RemoteReply.newBuilder
|
||||||
.setId(request.getId)
|
.setId(request.getId)
|
||||||
.setIsSuccessful(true)
|
.setIsSuccessful(true)
|
||||||
.setIsActor(true)
|
.setIsActor(true)
|
||||||
RemoteProtocolBuilder.setMessage(result, replyBuilder)
|
RemoteProtocolBuilder.setMessage(result, replyBuilder)
|
||||||
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
||||||
val replyMessage = replyBuilder.build
|
val replyMessage = replyBuilder.build
|
||||||
|
|
@ -211,15 +243,15 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
|
||||||
case e: Throwable =>
|
case e: Throwable =>
|
||||||
log.error(e, "Could not invoke remote actor [%s]", request.getTarget)
|
log.error(e, "Could not invoke remote actor [%s]", request.getTarget)
|
||||||
val replyBuilder = RemoteReply.newBuilder
|
val replyBuilder = RemoteReply.newBuilder
|
||||||
.setId(request.getId)
|
.setId(request.getId)
|
||||||
.setException(e.getClass.getName + "$" + e.getMessage)
|
.setException(e.getClass.getName + "$" + e.getMessage)
|
||||||
.setIsSuccessful(false)
|
.setIsSuccessful(false)
|
||||||
.setIsActor(true)
|
.setIsActor(true)
|
||||||
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
||||||
val replyMessage = replyBuilder.build
|
val replyMessage = replyBuilder.build
|
||||||
channel.write(replyMessage)
|
channel.write(replyMessage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private def dispatchToActiveObject(request: RemoteRequest, channel: Channel) = {
|
private def dispatchToActiveObject(request: RemoteRequest, channel: Channel) = {
|
||||||
|
|
@ -239,9 +271,9 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
|
||||||
val result = messageReceiver.invoke(activeObject, unescapedArgs: _*)
|
val result = messageReceiver.invoke(activeObject, unescapedArgs: _*)
|
||||||
log.debug("Returning result from remote active object invocation [%s]", result)
|
log.debug("Returning result from remote active object invocation [%s]", result)
|
||||||
val replyBuilder = RemoteReply.newBuilder
|
val replyBuilder = RemoteReply.newBuilder
|
||||||
.setId(request.getId)
|
.setId(request.getId)
|
||||||
.setIsSuccessful(true)
|
.setIsSuccessful(true)
|
||||||
.setIsActor(false)
|
.setIsActor(false)
|
||||||
RemoteProtocolBuilder.setMessage(result, replyBuilder)
|
RemoteProtocolBuilder.setMessage(result, replyBuilder)
|
||||||
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
||||||
val replyMessage = replyBuilder.build
|
val replyMessage = replyBuilder.build
|
||||||
|
|
@ -251,20 +283,20 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
|
||||||
case e: InvocationTargetException =>
|
case e: InvocationTargetException =>
|
||||||
log.error(e.getCause, "Could not invoke remote active object [%s :: %s]", request.getMethod, request.getTarget)
|
log.error(e.getCause, "Could not invoke remote active object [%s :: %s]", request.getMethod, request.getTarget)
|
||||||
val replyBuilder = RemoteReply.newBuilder
|
val replyBuilder = RemoteReply.newBuilder
|
||||||
.setId(request.getId)
|
.setId(request.getId)
|
||||||
.setException(e.getCause.getClass.getName + "$" + e.getCause.getMessage)
|
.setException(e.getCause.getClass.getName + "$" + e.getCause.getMessage)
|
||||||
.setIsSuccessful(false)
|
.setIsSuccessful(false)
|
||||||
.setIsActor(false)
|
.setIsActor(false)
|
||||||
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
||||||
val replyMessage = replyBuilder.build
|
val replyMessage = replyBuilder.build
|
||||||
channel.write(replyMessage)
|
channel.write(replyMessage)
|
||||||
case e: Throwable =>
|
case e: Throwable =>
|
||||||
log.error(e.getCause, "Could not invoke remote active object [%s :: %s]", request.getMethod, request.getTarget)
|
log.error(e.getCause, "Could not invoke remote active object [%s :: %s]", request.getMethod, request.getTarget)
|
||||||
val replyBuilder = RemoteReply.newBuilder
|
val replyBuilder = RemoteReply.newBuilder
|
||||||
.setId(request.getId)
|
.setId(request.getId)
|
||||||
.setException(e.getClass.getName + "$" + e.getMessage)
|
.setException(e.getClass.getName + "$" + e.getMessage)
|
||||||
.setIsSuccessful(false)
|
.setIsSuccessful(false)
|
||||||
.setIsActor(false)
|
.setIsActor(false)
|
||||||
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
|
||||||
val replyMessage = replyBuilder.build
|
val replyMessage = replyBuilder.build
|
||||||
channel.write(replyMessage)
|
channel.write(replyMessage)
|
||||||
|
|
@ -295,10 +327,10 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
|
||||||
val proxyName = argString.replace(AW_PROXY_PREFIX, "") //argString.substring(argString.indexOf("$$ProxiedByAW"), argString.length)
|
val proxyName = argString.replace(AW_PROXY_PREFIX, "") //argString.substring(argString.indexOf("$$ProxiedByAW"), argString.length)
|
||||||
val activeObject = createActiveObject(proxyName, timeout)
|
val activeObject = createActiveObject(proxyName, timeout)
|
||||||
unescapedArgs(i) = activeObject
|
unescapedArgs(i) = activeObject
|
||||||
unescapedArgClasses(i) = Class.forName(proxyName)
|
unescapedArgClasses(i) = Class.forName(proxyName)
|
||||||
} else {
|
} else {
|
||||||
unescapedArgs(i) = args(i)
|
unescapedArgs(i) = args(i)
|
||||||
unescapedArgClasses(i) = argClasses(i)
|
unescapedArgClasses(i) = argClasses(i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(unescapedArgs, unescapedArgClasses)
|
(unescapedArgs, unescapedArgClasses)
|
||||||
|
|
@ -310,7 +342,7 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
|
||||||
try {
|
try {
|
||||||
log.info("Creating a new remote active object [%s]", name)
|
log.info("Creating a new remote active object [%s]", name)
|
||||||
val clazz = if (applicationLoader.isDefined) applicationLoader.get.loadClass(name)
|
val clazz = if (applicationLoader.isDefined) applicationLoader.get.loadClass(name)
|
||||||
else Class.forName(name)
|
else Class.forName(name)
|
||||||
val newInstance = ActiveObject.newInstance(clazz, timeout).asInstanceOf[AnyRef]
|
val newInstance = ActiveObject.newInstance(clazz, timeout).asInstanceOf[AnyRef]
|
||||||
activeObjects.put(name, newInstance)
|
activeObjects.put(name, newInstance)
|
||||||
newInstance
|
newInstance
|
||||||
|
|
@ -328,12 +360,13 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
|
||||||
try {
|
try {
|
||||||
log.info("Creating a new remote actor [%s:%s]", name, uuid)
|
log.info("Creating a new remote actor [%s:%s]", name, uuid)
|
||||||
val clazz = if (applicationLoader.isDefined) applicationLoader.get.loadClass(name)
|
val clazz = if (applicationLoader.isDefined) applicationLoader.get.loadClass(name)
|
||||||
else Class.forName(name)
|
else Class.forName(name)
|
||||||
val newInstance = clazz.newInstance.asInstanceOf[Actor]
|
val newInstance = clazz.newInstance.asInstanceOf[Actor]
|
||||||
newInstance._uuid = uuid
|
newInstance._uuid = uuid
|
||||||
newInstance.timeout = timeout
|
newInstance.timeout = timeout
|
||||||
newInstance._remoteAddress = None
|
newInstance._remoteAddress = None
|
||||||
actors.put(uuid, newInstance)
|
actors.put(uuid, newInstance)
|
||||||
|
newInstance.start
|
||||||
newInstance
|
newInstance
|
||||||
} catch {
|
} catch {
|
||||||
case e =>
|
case e =>
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio
|
package se.scalablesolutions.akka.remote
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicLong
|
import java.util.concurrent.atomic.AtomicLong
|
||||||
import stm.Transaction
|
import stm.Transaction
|
||||||
21
akka-actors/src/main/scala/serialization/Compression.scala
Normal file
21
akka-actors/src/main/scala/serialization/Compression.scala
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package se.scalablesolutions.akka.serialization
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
|
*/
|
||||||
|
object Compression {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
|
*/
|
||||||
|
object LZF {
|
||||||
|
import voldemort.store.compress.lzf._
|
||||||
|
def compress(bytes: Array[Byte]): Array[Byte] = LZFEncoder.encode(bytes)
|
||||||
|
def uncompress(bytes: Array[Byte]): Array[Byte] = LZFDecoder.decode(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -10,7 +10,7 @@ import com.google.protobuf.Message
|
||||||
|
|
||||||
import org.codehaus.jackson.map.ObjectMapper
|
import org.codehaus.jackson.map.ObjectMapper
|
||||||
|
|
||||||
import sjson.json.{Serializer =>SJSONSerializer}
|
import sjson.json.{Serializer => SJSONSerializer}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import java.util.concurrent.atomic.AtomicReference
|
||||||
import java.util.concurrent.{ConcurrentLinkedQueue, LinkedBlockingQueue}
|
import java.util.concurrent.{ConcurrentLinkedQueue, LinkedBlockingQueue}
|
||||||
|
|
||||||
import se.scalablesolutions.akka.actor.Actor
|
import se.scalablesolutions.akka.actor.Actor
|
||||||
|
import se.scalablesolutions.akka.dispatch.CompletableFutureResult
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements Oz-style dataflow (single assignment) variables.
|
* Implements Oz-style dataflow (single assignment) variables.
|
||||||
|
|
@ -46,7 +47,7 @@ object DataFlow {
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
*/
|
*/
|
||||||
sealed class DataFlowVariable[T <: Any] {
|
sealed class DataFlowVariable[T <: Any] {
|
||||||
val TIME_OUT = 10000
|
val TIME_OUT = 10000 * 60 // 60 seconds default timeout
|
||||||
|
|
||||||
private sealed abstract class DataFlowVariableMessage
|
private sealed abstract class DataFlowVariableMessage
|
||||||
private case class Set[T <: Any](value: T) extends DataFlowVariableMessage
|
private case class Set[T <: Any](value: T) extends DataFlowVariableMessage
|
||||||
|
|
@ -56,6 +57,8 @@ object DataFlow {
|
||||||
private val blockedReaders = new ConcurrentLinkedQueue[Actor]
|
private val blockedReaders = new ConcurrentLinkedQueue[Actor]
|
||||||
|
|
||||||
private class In[T <: Any](dataFlow: DataFlowVariable[T]) extends Actor {
|
private class In[T <: Any](dataFlow: DataFlowVariable[T]) extends Actor {
|
||||||
|
timeout = TIME_OUT
|
||||||
|
start
|
||||||
def receive = {
|
def receive = {
|
||||||
case Set(v) =>
|
case Set(v) =>
|
||||||
if (dataFlow.value.compareAndSet(None, Some(v.asInstanceOf[T]))) {
|
if (dataFlow.value.compareAndSet(None, Some(v.asInstanceOf[T]))) {
|
||||||
|
|
@ -69,18 +72,20 @@ object DataFlow {
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Out[T <: Any](dataFlow: DataFlowVariable[T]) extends Actor {
|
private class Out[T <: Any](dataFlow: DataFlowVariable[T]) extends Actor {
|
||||||
var reader: Option[Actor] = None
|
timeout = TIME_OUT
|
||||||
|
start
|
||||||
|
private var readerFuture: Option[CompletableFutureResult] = None
|
||||||
def receive = {
|
def receive = {
|
||||||
case Get =>
|
case Get =>
|
||||||
val ref = dataFlow.value.get
|
val ref = dataFlow.value.get
|
||||||
if (ref.isDefined) reply(ref.get)
|
if (ref.isDefined) reply(ref.get)
|
||||||
else reader = Some(sender.getOrElse(throw new IllegalStateException("No reader to DataFlowVariable is in scope")))
|
else readerFuture = senderFuture
|
||||||
case Set(v) => if (reader.isDefined) reader.get ! v
|
case Set(v) => if (readerFuture.isDefined) readerFuture.get.completeWithResult(v)
|
||||||
case Exit => exit
|
case Exit => exit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private[this] val in = { val in = new In(this); in.start; in }
|
private[this] val in = new In(this)
|
||||||
|
|
||||||
def <<(ref: DataFlowVariable[T]) = in send Set(ref())
|
def <<(ref: DataFlowVariable[T]) = in send Set(ref())
|
||||||
|
|
||||||
|
|
@ -90,9 +95,9 @@ object DataFlow {
|
||||||
val ref = value.get
|
val ref = value.get
|
||||||
if (ref.isDefined) ref.get
|
if (ref.isDefined) ref.get
|
||||||
else {
|
else {
|
||||||
val out = { val out = new Out(this); out.start; out }
|
val out = new Out(this)
|
||||||
blockedReaders.offer(out)
|
blockedReaders.offer(out)
|
||||||
val result = out !! (Get, TIME_OUT)
|
val result = out !! Get
|
||||||
out send Exit
|
out send Exit
|
||||||
result.getOrElse(throw new DataFlowVariableException(
|
result.getOrElse(throw new DataFlowVariableException(
|
||||||
"Timed out (after " + TIME_OUT + " milliseconds) while waiting for result"))
|
"Timed out (after " + TIME_OUT + " milliseconds) while waiting for result"))
|
||||||
|
|
|
||||||
|
|
@ -289,6 +289,6 @@ class PerformanceTest extends JUnitSuite {
|
||||||
println("\tScala Actors:\t" + scalaTime + "\t milliseconds")
|
println("\tScala Actors:\t" + scalaTime + "\t milliseconds")
|
||||||
println("\tAkka is " + ratio + " times faster\n")
|
println("\tAkka is " + ratio + " times faster\n")
|
||||||
println("===========================================")
|
println("===========================================")
|
||||||
assert(ratio >= 2.0)
|
assert(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,14 @@ import java.util.concurrent.TimeUnit
|
||||||
import junit.framework.TestCase
|
import junit.framework.TestCase
|
||||||
|
|
||||||
import org.scalatest.junit.JUnitSuite
|
import org.scalatest.junit.JUnitSuite
|
||||||
import org.junit.Test
|
import org.junit.{Test, Before, After}
|
||||||
|
|
||||||
import se.scalablesolutions.akka.nio.{RemoteNode, RemoteServer}
|
import se.scalablesolutions.akka.remote.{RemoteServer, RemoteClient}
|
||||||
import se.scalablesolutions.akka.dispatch.Dispatchers
|
import se.scalablesolutions.akka.dispatch.Dispatchers
|
||||||
|
|
||||||
object Global {
|
object Global {
|
||||||
var oneWay = "nada"
|
var oneWay = "nada"
|
||||||
|
var remoteReply = "nada"
|
||||||
}
|
}
|
||||||
class RemoteActorSpecActorUnidirectional extends Actor {
|
class RemoteActorSpecActorUnidirectional extends Actor {
|
||||||
dispatcher = Dispatchers.newThreadBasedDispatcher(this)
|
dispatcher = Dispatchers.newThreadBasedDispatcher(this)
|
||||||
|
|
@ -22,8 +23,6 @@ class RemoteActorSpecActorUnidirectional extends Actor {
|
||||||
}
|
}
|
||||||
|
|
||||||
class RemoteActorSpecActorBidirectional extends Actor {
|
class RemoteActorSpecActorBidirectional extends Actor {
|
||||||
dispatcher = Dispatchers.newThreadBasedDispatcher(this)
|
|
||||||
|
|
||||||
def receive = {
|
def receive = {
|
||||||
case "Hello" =>
|
case "Hello" =>
|
||||||
reply("World")
|
reply("World")
|
||||||
|
|
@ -32,23 +31,58 @@ class RemoteActorSpecActorBidirectional extends Actor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case class Send(actor:Actor)
|
||||||
|
|
||||||
|
class RemoteActorSpecActorAsyncSender extends Actor {
|
||||||
|
def receive = {
|
||||||
|
case Send(actor:Actor) =>
|
||||||
|
actor ! "Hello"
|
||||||
|
case "World" =>
|
||||||
|
Global.remoteReply = "replied"
|
||||||
|
}
|
||||||
|
|
||||||
|
def send(actor:Actor) {
|
||||||
|
this ! Send(actor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class RemoteActorTest extends JUnitSuite {
|
class RemoteActorTest extends JUnitSuite {
|
||||||
import Actor.Sender.Self
|
import Actor.Sender.Self
|
||||||
|
|
||||||
akka.Config.config
|
akka.Config.config
|
||||||
new Thread(new Runnable() {
|
|
||||||
def run = {
|
val HOSTNAME = "localhost"
|
||||||
RemoteNode.start
|
val PORT1 = 9990
|
||||||
}
|
val PORT2 = 9991
|
||||||
}).start
|
var s1:RemoteServer = null
|
||||||
Thread.sleep(1000)
|
var s2:RemoteServer = null
|
||||||
|
|
||||||
|
@Before
|
||||||
|
def init() {
|
||||||
|
s1 = new RemoteServer()
|
||||||
|
s2 = new RemoteServer()
|
||||||
|
|
||||||
|
s1.start(HOSTNAME, PORT1)
|
||||||
|
s2.start(HOSTNAME, PORT2)
|
||||||
|
Thread.sleep(1000)
|
||||||
|
}
|
||||||
|
|
||||||
private val unit = TimeUnit.MILLISECONDS
|
private val unit = TimeUnit.MILLISECONDS
|
||||||
|
|
||||||
|
// make sure the servers shutdown cleanly after the test has
|
||||||
|
// finished
|
||||||
|
@After
|
||||||
|
def finished() {
|
||||||
|
s1.shutdown
|
||||||
|
s2.shutdown
|
||||||
|
RemoteClient.shutdownAll
|
||||||
|
Thread.sleep(1000)
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
def shouldSendOneWay = {
|
def shouldSendOneWay = {
|
||||||
val actor = new RemoteActorSpecActorUnidirectional
|
val actor = new RemoteActorSpecActorUnidirectional
|
||||||
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
|
actor.makeRemote(HOSTNAME, PORT1)
|
||||||
actor.start
|
actor.start
|
||||||
val result = actor ! "OneWay"
|
val result = actor ! "OneWay"
|
||||||
Thread.sleep(100)
|
Thread.sleep(100)
|
||||||
|
|
@ -59,18 +93,54 @@ class RemoteActorTest extends JUnitSuite {
|
||||||
@Test
|
@Test
|
||||||
def shouldSendReplyAsync = {
|
def shouldSendReplyAsync = {
|
||||||
val actor = new RemoteActorSpecActorBidirectional
|
val actor = new RemoteActorSpecActorBidirectional
|
||||||
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
|
actor.makeRemote(HOSTNAME, PORT1)
|
||||||
actor.start
|
actor.start
|
||||||
val result = actor !! "Hello"
|
val result = actor !! "Hello"
|
||||||
assert("World" === result.get.asInstanceOf[String])
|
assert("World" === result.get.asInstanceOf[String])
|
||||||
actor.stop
|
actor.stop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
def shouldSendRemoteReply = {
|
||||||
|
implicit val timeout = 500000000L
|
||||||
|
val actor = new RemoteActorSpecActorBidirectional
|
||||||
|
actor.makeRemote(HOSTNAME, PORT2)
|
||||||
|
actor.start
|
||||||
|
|
||||||
|
val sender = new RemoteActorSpecActorAsyncSender
|
||||||
|
sender.setContactAddress(HOSTNAME, PORT1)
|
||||||
|
sender.start
|
||||||
|
sender.send(actor)
|
||||||
|
Thread.sleep(500)
|
||||||
|
assert("replied" === Global.remoteReply)
|
||||||
|
actor.stop
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This test does not throw an exception since the
|
||||||
|
_contactAddress is always defined via the
|
||||||
|
global configuration if not set explicitly.
|
||||||
|
|
||||||
|
@Test
|
||||||
|
def shouldSendRemoteReplyException = {
|
||||||
|
implicit val timeout = 500000000L
|
||||||
|
val actor = new RemoteActorSpecActorBidirectional
|
||||||
|
actor.makeRemote(HOSTNAME, PORT1)
|
||||||
|
actor.start
|
||||||
|
|
||||||
|
val sender = new RemoteActorSpecActorAsyncSender
|
||||||
|
sender.start
|
||||||
|
sender.send(actor)
|
||||||
|
Thread.sleep(500)
|
||||||
|
assert("exception" === Global.remoteReply)
|
||||||
|
actor.stop
|
||||||
|
}
|
||||||
|
*/
|
||||||
@Test
|
@Test
|
||||||
def shouldSendReceiveException = {
|
def shouldSendReceiveException = {
|
||||||
implicit val timeout = 500000000L
|
implicit val timeout = 500000000L
|
||||||
val actor = new RemoteActorSpecActorBidirectional
|
val actor = new RemoteActorSpecActorBidirectional
|
||||||
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
|
actor.makeRemote(HOSTNAME, PORT1)
|
||||||
actor.start
|
actor.start
|
||||||
try {
|
try {
|
||||||
actor !! "Failure"
|
actor !! "Failure"
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ package se.scalablesolutions.akka.actor
|
||||||
|
|
||||||
import se.scalablesolutions.akka.serialization.BinaryString
|
import se.scalablesolutions.akka.serialization.BinaryString
|
||||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
import se.scalablesolutions.akka.nio.{RemoteNode, RemoteServer}
|
import se.scalablesolutions.akka.remote.{RemoteNode, RemoteServer}
|
||||||
import se.scalablesolutions.akka.OneWay
|
import se.scalablesolutions.akka.OneWay
|
||||||
import se.scalablesolutions.akka.dispatch.Dispatchers
|
import se.scalablesolutions.akka.dispatch.Dispatchers
|
||||||
|
|
||||||
|
|
@ -33,7 +33,7 @@ object Log {
|
||||||
throw new RuntimeException("DIE")
|
throw new RuntimeException("DIE")
|
||||||
}
|
}
|
||||||
|
|
||||||
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {
|
override protected def postRestart(reason: AnyRef) {
|
||||||
Log.messageLog += reason.asInstanceOf[Exception].getMessage
|
Log.messageLog += reason.asInstanceOf[Exception].getMessage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -48,7 +48,7 @@ object Log {
|
||||||
throw new RuntimeException("DIE")
|
throw new RuntimeException("DIE")
|
||||||
}
|
}
|
||||||
|
|
||||||
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {
|
override protected def postRestart(reason: AnyRef) {
|
||||||
Log.messageLog += reason.asInstanceOf[Exception].getMessage
|
Log.messageLog += reason.asInstanceOf[Exception].getMessage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -63,7 +63,7 @@ object Log {
|
||||||
throw new RuntimeException("DIE")
|
throw new RuntimeException("DIE")
|
||||||
}
|
}
|
||||||
|
|
||||||
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {
|
override protected def postRestart(reason: AnyRef) {
|
||||||
Log.messageLog += reason.asInstanceOf[Exception].getMessage
|
Log.messageLog += reason.asInstanceOf[Exception].getMessage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -556,7 +556,7 @@ class SupervisorTest extends JUnitSuite {
|
||||||
case Die =>
|
case Die =>
|
||||||
throw new RuntimeException("DIE")
|
throw new RuntimeException("DIE")
|
||||||
}
|
}
|
||||||
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {
|
override protected def postRestart(reason: AnyRef) {
|
||||||
messageLog += reason.asInstanceOf[Exception].getMessage
|
messageLog += reason.asInstanceOf[Exception].getMessage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -569,7 +569,7 @@ class SupervisorTest extends JUnitSuite {
|
||||||
case Die =>
|
case Die =>
|
||||||
throw new RuntimeException("DIE")
|
throw new RuntimeException("DIE")
|
||||||
}
|
}
|
||||||
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {
|
override protected def postRestart(reason: AnyRef) {
|
||||||
messageLog += reason.asInstanceOf[Exception].getMessage
|
messageLog += reason.asInstanceOf[Exception].getMessage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -583,7 +583,7 @@ class SupervisorTest extends JUnitSuite {
|
||||||
throw new RuntimeException("DIE")
|
throw new RuntimeException("DIE")
|
||||||
}
|
}
|
||||||
|
|
||||||
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {
|
override protected def postRestart(reason: AnyRef) {
|
||||||
messageLog += reason.asInstanceOf[Exception].getMessage
|
messageLog += reason.asInstanceOf[Exception].getMessage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,8 @@ package se.scalablesolutions.akka.amqp
|
||||||
import com.rabbitmq.client.{AMQP => RabbitMQ, _}
|
import com.rabbitmq.client.{AMQP => RabbitMQ, _}
|
||||||
import com.rabbitmq.client.ConnectionFactory
|
import com.rabbitmq.client.ConnectionFactory
|
||||||
|
|
||||||
import se.scalablesolutions.akka.actor.{OneForOneStrategy, Actor}
|
import se.scalablesolutions.akka.actor.Actor
|
||||||
|
import se.scalablesolutions.akka.config.OneForOneStrategy
|
||||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
import se.scalablesolutions.akka.util.{HashCode, Logging}
|
import se.scalablesolutions.akka.util.{HashCode, Logging}
|
||||||
|
|
||||||
|
|
@ -557,8 +558,8 @@ object AMQP {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override def preRestart(reason: AnyRef, config: Option[AnyRef]) = disconnect
|
override def preRestart(reason: AnyRef) = disconnect
|
||||||
|
|
||||||
override def postRestart(reason: AnyRef, config: Option[AnyRef]) = reconnect(initReconnectDelay)
|
override def postRestart(reason: AnyRef) = reconnect(initReconnectDelay)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>akka-camel</artifactId>
|
|
||||||
<name>Akka Camel Module</name>
|
|
||||||
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<artifactId>akka</artifactId>
|
|
||||||
<groupId>se.scalablesolutions.akka</groupId>
|
|
||||||
<version>0.6</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<!-- Core deps -->
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<artifactId>akka-util</artifactId>
|
|
||||||
<groupId>${project.groupId}</groupId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<artifactId>akka-actors</artifactId>
|
|
||||||
<groupId>${project.groupId}</groupId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.camel</groupId>
|
|
||||||
<artifactId>camel-core</artifactId>
|
|
||||||
<version>2.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<resources>
|
|
||||||
<resource>
|
|
||||||
<filtering>false</filtering>
|
|
||||||
<directory>src/main/resources</directory>
|
|
||||||
<includes>
|
|
||||||
<include>META-INF/*</include>
|
|
||||||
</includes>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
|
||||||
</build>
|
|
||||||
</project>
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
class=se.scalablesolutions.akka.kernel.camel.ActiveObjectComponent
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.camel
|
|
||||||
|
|
||||||
import config.ActiveObjectConfigurator
|
|
||||||
|
|
||||||
import java.util.Map
|
|
||||||
import java.util.concurrent.{BlockingQueue, LinkedBlockingQueue}
|
|
||||||
|
|
||||||
import org.apache.camel.{Endpoint, Exchange}
|
|
||||||
import org.apache.camel.impl.DefaultComponent
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class ActiveObjectComponent(val conf: ActiveObjectConfigurator) extends DefaultComponent {
|
|
||||||
override def createEndpoint(uri: String, remaining: String, parameters: Map[_,_]): Endpoint = {
|
|
||||||
//val consumers = getAndRemoveParameter(parameters, "concurrentConsumers", classOf[Int], 1)
|
|
||||||
new ActiveObjectEndpoint(uri, this, conf)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.camel
|
|
||||||
|
|
||||||
import java.util.concurrent.{BlockingQueue, ExecutorService, Executors, ThreadFactory, TimeUnit}
|
|
||||||
|
|
||||||
import util.Logging
|
|
||||||
|
|
||||||
import org.apache.camel.{AsyncCallback, AsyncProcessor, Consumer, Exchange, Processor}
|
|
||||||
import org.apache.camel.impl.ServiceSupport
|
|
||||||
import org.apache.camel.impl.converter.AsyncProcessorTypeConverter
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class ActiveObjectConsumer(
|
|
||||||
val endpoint: ActiveObjectEndpoint,
|
|
||||||
proc: Processor,
|
|
||||||
val activeObject: AnyRef)
|
|
||||||
extends ServiceSupport with Consumer with Runnable with Logging {
|
|
||||||
val processor = AsyncProcessorTypeConverter.convert(proc)
|
|
||||||
println("------- creating consumer for: "+ endpoint.uri)
|
|
||||||
|
|
||||||
override def run = {
|
|
||||||
}
|
|
||||||
|
|
||||||
def doStart() = {
|
|
||||||
}
|
|
||||||
|
|
||||||
def doStop() = {
|
|
||||||
}
|
|
||||||
|
|
||||||
override def toString(): String = "ActiveObjectConsumer [" + endpoint.getEndpointUri + "]"
|
|
||||||
}
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.camel
|
|
||||||
|
|
||||||
import config.ActiveObjectConfigurator
|
|
||||||
import util.Logging
|
|
||||||
|
|
||||||
import java.util.{ArrayList, HashSet, List, Set}
|
|
||||||
import java.util.concurrent.{BlockingQueue, CopyOnWriteArraySet, LinkedBlockingQueue}
|
|
||||||
|
|
||||||
import org.apache.camel.{Component, Consumer, Exchange, Processor, Producer}
|
|
||||||
import org.apache.camel.impl.{DefaultEndpoint, DefaultComponent};
|
|
||||||
import org.apache.camel.spi.BrowsableEndpoint;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class ActiveObjectEndpoint(val uri: String, val component: DefaultComponent, val conf: ActiveObjectConfigurator) // FIXME: need abstraction trait here
|
|
||||||
extends DefaultEndpoint(uri) with BrowsableEndpoint with Logging {
|
|
||||||
|
|
||||||
val firstSep = uri.indexOf(':')
|
|
||||||
val lastSep = uri.lastIndexOf( '.')
|
|
||||||
|
|
||||||
val scheme = uri.substring(0, firstSep)
|
|
||||||
val activeObjectName = uri.substring(uri.indexOf(':') + 1, lastSep)
|
|
||||||
val activeObjectClass = Thread.currentThread.getContextClassLoader.loadClass(activeObjectName)
|
|
||||||
val methodName = uri.substring(lastSep + 1, uri.length)
|
|
||||||
val activeObject = conf.getInstance(activeObjectClass).asInstanceOf[MessageDriven]
|
|
||||||
// val activeObjectProxy = conf.getInstanceProxy(activeObjectName)
|
|
||||||
|
|
||||||
// val genericServer = supervisor.getServerOrElse(
|
|
||||||
// activeObjectName,
|
|
||||||
// throw new IllegalArgumentException("Can't find active object with name [" + activeObjectName + "] and method [" + methodName + "]"))
|
|
||||||
|
|
||||||
log.debug("Creating Camel Endpoint for scheme [%s] and component [%s]", scheme, activeObjectName)
|
|
||||||
|
|
||||||
private var queue: BlockingQueue[Exchange] = new LinkedBlockingQueue[Exchange](1000)
|
|
||||||
|
|
||||||
override def createProducer: Producer = new ActiveObjectProducer(this, activeObject)
|
|
||||||
|
|
||||||
override def createConsumer(processor: Processor): Consumer = new ActiveObjectConsumer(this, processor, activeObject)
|
|
||||||
|
|
||||||
override def getExchanges: List[Exchange] = new ArrayList[Exchange](queue)
|
|
||||||
|
|
||||||
override def isSingleton = true
|
|
||||||
}
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.camel
|
|
||||||
|
|
||||||
import java.util.Collection
|
|
||||||
import util.Logging;
|
|
||||||
import java.util.concurrent.BlockingQueue;
|
|
||||||
|
|
||||||
import org.apache.camel.{Exchange, AsyncProcessor, AsyncCallback}
|
|
||||||
import org.apache.camel.impl.DefaultProducer
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class ActiveObjectProducer(
|
|
||||||
val endpoint: ActiveObjectEndpoint,
|
|
||||||
val activeObject: MessageDriven)
|
|
||||||
extends DefaultProducer(endpoint) with AsyncProcessor with Logging {
|
|
||||||
private val actorName = endpoint.activeObjectName
|
|
||||||
|
|
||||||
def process(exchange: Exchange) = activeObject.onMessage(exchange) // FIXME: should we not invoke the generic server here?
|
|
||||||
|
|
||||||
def process(exchange: Exchange, callback: AsyncCallback): Boolean = {
|
|
||||||
val copy = exchange.copy
|
|
||||||
copy.setProperty("CamelAsyncCallback", callback)
|
|
||||||
activeObject.onMessage(copy)
|
|
||||||
callback.done(true)
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
override def doStart = {
|
|
||||||
super.doStart
|
|
||||||
}
|
|
||||||
|
|
||||||
override def doStop = {
|
|
||||||
super.doStop
|
|
||||||
}
|
|
||||||
|
|
||||||
override def toString(): String = "ActiveObjectProducer [" + endpoint.getEndpointUri + "]"
|
|
||||||
}
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.config
|
|
||||||
|
|
||||||
import org.apache.camel.{Routes, CamelContext, Endpoint}
|
|
||||||
|
|
||||||
trait CamelConfigurator {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add Camel routes for the active objects.
|
|
||||||
* <pre>
|
|
||||||
* activeObjectConfigurator.addRoutes(new RouteBuilder() {
|
|
||||||
* def configure = {
|
|
||||||
* from("akka:actor1").to("akka:actor2")
|
|
||||||
* from("akka:actor2").process(new Processor() {
|
|
||||||
* def process(e: Exchange) = {
|
|
||||||
* println("Received exchange: " + e.getIn())
|
|
||||||
* }
|
|
||||||
* })
|
|
||||||
* }
|
|
||||||
* }).inject().supervise();
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
def addRoutes(routes: Routes): ActiveObjectConfiguratorBase
|
|
||||||
|
|
||||||
def getCamelContext: CamelContext
|
|
||||||
|
|
||||||
def getRoutingEndpoint(uri: String): Endpoint
|
|
||||||
|
|
||||||
def getRoutingEndpoints: java.util.Collection[Endpoint]
|
|
||||||
|
|
||||||
def getRoutingEndpoints(uri: String): java.util.Collection[Endpoint]
|
|
||||||
}
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.camel
|
|
||||||
|
|
||||||
import org.apache.camel.Exchange
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
trait MessageDriven {
|
|
||||||
def onMessage(exchange: Exchange)
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.camel
|
|
||||||
|
|
||||||
import actor.Supervisor
|
|
||||||
import util.Logging
|
|
||||||
import org.apache.camel.impl.{DefaultCamelContext, DefaultEndpoint, DefaultComponent}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class SupervisorAwareCamelContext extends DefaultCamelContext with Logging {
|
|
||||||
var supervisor: Supervisor = _
|
|
||||||
}
|
|
||||||
|
|
@ -1,101 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.camel
|
|
||||||
|
|
||||||
/*
|
|
||||||
import config.ActiveObjectGuiceConfigurator
|
|
||||||
import annotation.oneway
|
|
||||||
import config.ScalaConfig._
|
|
||||||
|
|
||||||
import com.google.inject.{AbstractModule, Scopes}
|
|
||||||
//import com.jteigen.scalatest.JUnit4Runner
|
|
||||||
|
|
||||||
import org.apache.camel.component.bean.ProxyHelper
|
|
||||||
import org.junit.runner.RunWith
|
|
||||||
import org.scalatest._
|
|
||||||
import org.scalatest.matchers._
|
|
||||||
|
|
||||||
import java.util.concurrent.CountDownLatch;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import org.apache.camel.CamelContext
|
|
||||||
import org.apache.camel.Endpoint
|
|
||||||
import org.apache.camel.Exchange
|
|
||||||
import org.apache.camel.Processor
|
|
||||||
import org.apache.camel.Producer
|
|
||||||
import org.apache.camel.builder.RouteBuilder
|
|
||||||
import org.apache.camel.impl.DefaultCamelContext
|
|
||||||
|
|
||||||
// REQUIRES: -Djava.naming.factory.initial=org.apache.camel.util.jndi.CamelInitialContextFactory
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*
|
|
||||||
//@RunWith(classOf[JUnit4Runner])
|
|
||||||
class CamelSpec extends Spec with ShouldMatchers {
|
|
||||||
|
|
||||||
describe("A Camel routing scheme") {
|
|
||||||
it("should route message from direct:test to actor A using @Bean endpoint") {
|
|
||||||
|
|
||||||
val latch = new CountDownLatch(1);
|
|
||||||
|
|
||||||
val conf = new ActiveObjectGuiceConfigurator
|
|
||||||
conf.configure(
|
|
||||||
RestartStrategy(AllForOne, 3, 5000),
|
|
||||||
Component(
|
|
||||||
"camelfoo",
|
|
||||||
classOf[CamelFoo],
|
|
||||||
classOf[CamelFooImpl],
|
|
||||||
LifeCycle(Permanent),
|
|
||||||
1000) ::
|
|
||||||
Nil
|
|
||||||
).addRoutes(new RouteBuilder() {
|
|
||||||
def configure = {
|
|
||||||
from("direct:test").to("bean:camelfoo").process(new Processor() {
|
|
||||||
def process(e: Exchange) = {
|
|
||||||
println("Received exchange: " + e.getIn())
|
|
||||||
latch.countDown
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}}
|
|
||||||
).supervise
|
|
||||||
|
|
||||||
val endpoint = conf.getRoutingEndpoint("direct:test")
|
|
||||||
val proxy = ProxyHelper.createProxy(endpoint, classOf[CamelFoo])
|
|
||||||
|
|
||||||
proxy.foo("hello there")
|
|
||||||
|
|
||||||
val exchange = endpoint.createExchange
|
|
||||||
println("----- " + exchange)
|
|
||||||
|
|
||||||
exchange.getIn().setBody("hello there")
|
|
||||||
|
|
||||||
val producer = endpoint.createProducer
|
|
||||||
println("----- " + producer)
|
|
||||||
|
|
||||||
producer.process(exchange)
|
|
||||||
|
|
||||||
// now lets sleep for a while
|
|
||||||
val received = latch.await(5, TimeUnit.SECONDS)
|
|
||||||
received should equal (true)
|
|
||||||
conf.stop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
trait CamelFoo {
|
|
||||||
@oneway def foo(msg: String)
|
|
||||||
}
|
|
||||||
trait CamelBar {
|
|
||||||
def bar(msg: String): String
|
|
||||||
}
|
|
||||||
|
|
||||||
class CamelFooImpl extends CamelFoo {
|
|
||||||
def foo(msg: String) = println("CamelFoo.foo:" + msg)
|
|
||||||
}
|
|
||||||
class CamelBarImpl extends CamelBar {
|
|
||||||
def bar(msg: String) = msg + "return_bar "
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
@ -76,9 +76,9 @@ public class InMemNestedStateTest extends TestCase {
|
||||||
nested.setVectorState("init"); // set init state
|
nested.setVectorState("init"); // set init state
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
stateful.success("testShouldNotRollbackStateForStatefulServerInCaseOfSuccess", "new state", nested); // transactionrequired
|
stateful.success("testShouldNotRollbackStateForStatefulServerInCaseOfSuccess", "new state", nested); // transactionrequired
|
||||||
Thread.sleep(100);
|
Thread.sleep(1000);
|
||||||
assertEquals("new state", stateful.getVectorState());
|
assertEquals("new state", stateful.getVectorState());
|
||||||
Thread.sleep(100);
|
Thread.sleep(1000);
|
||||||
assertEquals("new state", nested.getVectorState());
|
assertEquals("new state", nested.getVectorState());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ package se.scalablesolutions.akka.api;
|
||||||
import se.scalablesolutions.akka.Config;
|
import se.scalablesolutions.akka.Config;
|
||||||
import se.scalablesolutions.akka.actor.ActiveObject;
|
import se.scalablesolutions.akka.actor.ActiveObject;
|
||||||
import se.scalablesolutions.akka.config.ActiveObjectConfigurator;
|
import se.scalablesolutions.akka.config.ActiveObjectConfigurator;
|
||||||
import se.scalablesolutions.akka.nio.RemoteNode;
|
import se.scalablesolutions.akka.remote.RemoteNode;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,161 +37,13 @@
|
||||||
<groupId>${project.groupId}</groupId>
|
<groupId>${project.groupId}</groupId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<artifactId>akka-camel</artifactId>
|
|
||||||
<groupId>${project.groupId}</groupId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<artifactId>akka-security</artifactId>
|
<artifactId>akka-security</artifactId>
|
||||||
<groupId>${project.groupId}</groupId>
|
<groupId>${project.groupId}</groupId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Core deps -->
|
<!-- For Atmosphere -->
|
||||||
<dependency>
|
|
||||||
<groupId>org.scala-lang</groupId>
|
|
||||||
<artifactId>scala-library</artifactId>
|
|
||||||
<version>${scala.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.codehaus.aspectwerkz</groupId>
|
|
||||||
<artifactId>aspectwerkz-nodeps-jdk5</artifactId>
|
|
||||||
<version>2.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.codehaus.aspectwerkz</groupId>
|
|
||||||
<artifactId>aspectwerkz-jdk5</artifactId>
|
|
||||||
<version>2.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>net.lag</groupId>
|
|
||||||
<artifactId>configgy</artifactId>
|
|
||||||
<version>1.4</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.camel</groupId>
|
|
||||||
<artifactId>camel-core</artifactId>
|
|
||||||
<version>2.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jboss.netty</groupId>
|
|
||||||
<artifactId>netty</artifactId>
|
|
||||||
<version>3.2.0.ALPHA1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache</groupId>
|
|
||||||
<artifactId>zookeeper</artifactId>
|
|
||||||
<version>3.1.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.scala-tools</groupId>
|
|
||||||
<artifactId>javautils</artifactId>
|
|
||||||
<version>2.7.4-0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.multiverse</groupId>
|
|
||||||
<artifactId>multiverse-core</artifactId>
|
|
||||||
<version>0.3-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.multiverse</groupId>
|
|
||||||
<artifactId>multiverse-alpha</artifactId>
|
|
||||||
<version>0.3-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.rabbitmq</groupId>
|
|
||||||
<artifactId>rabbitmq-client</artifactId>
|
|
||||||
<version>0.9.1</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- For Protocol/Serialization -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.codehaus.jackson</groupId>
|
|
||||||
<artifactId>jackson-core-asl</artifactId>
|
|
||||||
<version>1.1.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.codehaus.jackson</groupId>
|
|
||||||
<artifactId>jackson-mapper-asl</artifactId>
|
|
||||||
<version>1.1.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.google.protobuf</groupId>
|
|
||||||
<artifactId>protobuf-java</artifactId>
|
|
||||||
<version>2.2.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>sbinary</groupId>
|
|
||||||
<artifactId>sbinary</artifactId>
|
|
||||||
<version>0.3</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>dispatch.json</groupId>
|
|
||||||
<artifactId>dispatch-json</artifactId>
|
|
||||||
<version>0.5.2</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>dispatch.http</groupId>
|
|
||||||
<artifactId>dispatch-http</artifactId>
|
|
||||||
<version>0.5.2</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>sjson.json</groupId>
|
|
||||||
<artifactId>sjson</artifactId>
|
|
||||||
<version>0.2</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- For Mongo -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.mongodb</groupId>
|
|
||||||
<artifactId>mongo</artifactId>
|
|
||||||
<version>0.6</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- For Cassandra -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.cassandra</groupId>
|
|
||||||
<artifactId>cassandra</artifactId>
|
|
||||||
<version>0.4.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-pool</groupId>
|
|
||||||
<artifactId>commons-pool</artifactId>
|
|
||||||
<version>1.5.1</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- For Jersey & Atmosphere -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.grizzly</groupId>
|
|
||||||
<artifactId>grizzly-comet-webserver</artifactId>
|
|
||||||
<version>${grizzly.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.jersey</groupId>
|
|
||||||
<artifactId>jersey-core</artifactId>
|
|
||||||
<version>${jersey.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.jersey</groupId>
|
|
||||||
<artifactId>jersey-server</artifactId>
|
|
||||||
<version>${jersey.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.jersey</groupId>
|
|
||||||
<artifactId>jersey-json</artifactId>
|
|
||||||
<version>${jersey.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>javax.ws.rs</groupId>
|
|
||||||
<artifactId>jsr311-api</artifactId>
|
|
||||||
<version>1.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.jersey.contribs</groupId>
|
|
||||||
<artifactId>jersey-scala</artifactId>
|
|
||||||
<version>${jersey.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.atmosphere</groupId>
|
<groupId>org.atmosphere</groupId>
|
||||||
<artifactId>atmosphere-annotations</artifactId>
|
<artifactId>atmosphere-annotations</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import javax.ws.rs.core.UriBuilder
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
|
|
||||||
import se.scalablesolutions.akka.nio.RemoteNode
|
import se.scalablesolutions.akka.remote.RemoteNode
|
||||||
import se.scalablesolutions.akka.util.Logging
|
import se.scalablesolutions.akka.util.Logging
|
||||||
import se.scalablesolutions.akka.actor.ActorRegistry
|
import se.scalablesolutions.akka.actor.ActorRegistry
|
||||||
|
|
||||||
|
|
@ -99,7 +99,7 @@ object Kernel extends Logging {
|
||||||
adapter.setServletInstance(new AkkaCometServlet)
|
adapter.setServletInstance(new AkkaCometServlet)
|
||||||
adapter.setContextPath(uri.getPath)
|
adapter.setContextPath(uri.getPath)
|
||||||
//Using autodetection for now
|
//Using autodetection for now
|
||||||
//adapter.addInitParameter("cometSupport", "org.atmosphere.container.GrizzlyCometSupport")
|
adapter.addInitParameter("cometSupport", "org.atmosphere.container.GrizzlyCometSupport")
|
||||||
if (HOME.isDefined) adapter.setRootFolder(HOME.get + "/deploy/root")
|
if (HOME.isDefined) adapter.setRootFolder(HOME.get + "/deploy/root")
|
||||||
log.info("REST service root path [%s] and context path [%s]", adapter.getRootFolder, adapter.getContextPath)
|
log.info("REST service root path [%s] and context path [%s]", adapter.getRootFolder, adapter.getContextPath)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,9 @@
|
||||||
|
|
||||||
<!-- For Mongo -->
|
<!-- For Mongo -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.mongodb</groupId>
|
<groupId>org.mongodb</groupId>
|
||||||
<artifactId>mongo</artifactId>
|
<artifactId>mongo-java-driver</artifactId>
|
||||||
<version>1.0</version>
|
<version>1.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- For Cassandra -->
|
<!-- For Cassandra -->
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
se.scalablesolutions.akka.rest.ListWriter
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
package se.scalablesolutions.akka.rest
|
package se.scalablesolutions.akka.rest
|
||||||
|
|
||||||
|
import com.sun.jersey.core.spi.component.ComponentScope
|
||||||
import com.sun.jersey.core.spi.component.ioc.IoCFullyManagedComponentProvider
|
import com.sun.jersey.core.spi.component.ioc.IoCFullyManagedComponentProvider
|
||||||
|
|
||||||
import config.Configurator
|
import config.Configurator
|
||||||
|
|
@ -11,6 +12,8 @@ import util.Logging
|
||||||
|
|
||||||
class ActorComponentProvider(val clazz: Class[_], val configurators: List[Configurator])
|
class ActorComponentProvider(val clazz: Class[_], val configurators: List[Configurator])
|
||||||
extends IoCFullyManagedComponentProvider with Logging {
|
extends IoCFullyManagedComponentProvider with Logging {
|
||||||
|
|
||||||
|
override def getScope = ComponentScope.Singleton
|
||||||
|
|
||||||
override def getInstance: AnyRef = {
|
override def getInstance: AnyRef = {
|
||||||
val instances = for {
|
val instances = for {
|
||||||
|
|
|
||||||
38
akka-rest/src/main/scala/ListWriter.scala
Normal file
38
akka-rest/src/main/scala/ListWriter.scala
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
|
*/
|
||||||
|
package se.scalablesolutions.akka.rest
|
||||||
|
|
||||||
|
import java.io.OutputStream
|
||||||
|
import se.scalablesolutions.akka.serialization.Serializer
|
||||||
|
import javax.ws.rs.core.{MultivaluedMap, MediaType}
|
||||||
|
import javax.ws.rs.ext.{MessageBodyWriter, Provider}
|
||||||
|
import javax.ws.rs.Produces
|
||||||
|
|
||||||
|
/**
|
||||||
|
* writes Lists of JSON serializable objects
|
||||||
|
*/
|
||||||
|
@Provider
|
||||||
|
@Produces(Array("application/json"))
|
||||||
|
class ListWriter extends MessageBodyWriter[List[_]] {
|
||||||
|
|
||||||
|
def isWriteable(aClass: Class[_], aType: java.lang.reflect.Type, annotations: Array[java.lang.annotation.Annotation], mediaType: MediaType) = {
|
||||||
|
classOf[List[_]].isAssignableFrom(aClass) || aClass == ::.getClass
|
||||||
|
}
|
||||||
|
|
||||||
|
def getSize(list: List[_], aClass: Class[_], aType: java.lang.reflect.Type, annotations: Array[java.lang.annotation.Annotation], mediaType: MediaType) = -1L
|
||||||
|
|
||||||
|
def writeTo(list: List[_],
|
||||||
|
aClass: Class[_],
|
||||||
|
aType: java.lang.reflect.Type,
|
||||||
|
annotations: Array[java.lang.annotation.Annotation],
|
||||||
|
mediaType: MediaType,
|
||||||
|
stringObjectMultivaluedMap: MultivaluedMap[String, Object],
|
||||||
|
outputStream: OutputStream) : Unit = {
|
||||||
|
if (list.isEmpty)
|
||||||
|
outputStream.write(" ".getBytes)
|
||||||
|
else
|
||||||
|
outputStream.write(Serializer.ScalaJSON.out(list))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.rest
|
|
||||||
|
|
||||||
import java.io.OutputStream
|
|
||||||
import java.lang.annotation.Annotation
|
|
||||||
import java.lang.{String, Class}
|
|
||||||
|
|
||||||
import javax.ws.rs.core.{MultivaluedMap, MediaType}
|
|
||||||
import javax.ws.rs.ext.{MessageBodyWriter, Provider}
|
|
||||||
import java.lang.reflect.Type
|
|
||||||
|
|
||||||
import scala.xml.NodeSeq
|
|
||||||
|
|
||||||
@Provider
|
|
||||||
class NodeWriter extends MessageBodyWriter[NodeSeq] {
|
|
||||||
|
|
||||||
def isWriteable(aClass: Class[_], aType: Type, annotations: Array[Annotation], mediaType: MediaType) = {
|
|
||||||
classOf[NodeSeq].isAssignableFrom(aClass)
|
|
||||||
}
|
|
||||||
|
|
||||||
def getSize(nodes: NodeSeq, aClass: Class[_], aType: Type, annotations: Array[Annotation], mediaType: MediaType) = -1L
|
|
||||||
|
|
||||||
def writeTo(nodes: NodeSeq,
|
|
||||||
aClass: Class[_],
|
|
||||||
aType: Type,
|
|
||||||
annotations: Array[Annotation],
|
|
||||||
mediaType: MediaType,
|
|
||||||
stringObjectMultivaluedMap: MultivaluedMap[String, Object],
|
|
||||||
outputStream: OutputStream) : Unit = {
|
|
||||||
var answer = nodes.toString();
|
|
||||||
outputStream.write(answer.getBytes());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package sample.lift
|
package sample.lift
|
||||||
|
|
||||||
import se.scalablesolutions.akka.actor.Actor
|
import se.scalablesolutions.akka.actor.{Transactor, Actor}
|
||||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
import se.scalablesolutions.akka.state.{CassandraStorage, TransactionalState}
|
import se.scalablesolutions.akka.state.{CassandraStorage, TransactionalState}
|
||||||
|
|
||||||
|
|
@ -8,7 +8,6 @@ import java.lang.Integer
|
||||||
import javax.ws.rs.{GET, Path, Produces}
|
import javax.ws.rs.{GET, Path, Produces}
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try service out by invoking (multiple times):
|
* Try service out by invoking (multiple times):
|
||||||
* <pre>
|
* <pre>
|
||||||
|
|
@ -17,9 +16,7 @@ import java.nio.ByteBuffer
|
||||||
* Or browse to the URL from a web browser.
|
* Or browse to the URL from a web browser.
|
||||||
*/
|
*/
|
||||||
@Path("/liftcount")
|
@Path("/liftcount")
|
||||||
class SimpleService extends Actor {
|
class SimpleService extends Transactor {
|
||||||
makeTransactionRequired
|
|
||||||
|
|
||||||
case object Tick
|
case object Tick
|
||||||
private val KEY = "COUNTER"
|
private val KEY = "COUNTER"
|
||||||
private var hasStartedTicking = false
|
private var hasStartedTicking = false
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
package sample.scala
|
package sample.scala
|
||||||
|
|
||||||
import se.scalablesolutions.akka.actor.{SupervisorFactory, Actor}
|
import se.scalablesolutions.akka.actor.{Transactor, SupervisorFactory, Actor}
|
||||||
import se.scalablesolutions.akka.state.{CassandraStorage, TransactionalState}
|
import se.scalablesolutions.akka.state.{CassandraStorage, TransactionalState}
|
||||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
import se.scalablesolutions.akka.util.Logging
|
import se.scalablesolutions.akka.util.Logging
|
||||||
|
|
@ -32,32 +32,13 @@ class Boot {
|
||||||
Supervise(
|
Supervise(
|
||||||
new PersistentSimpleService,
|
new PersistentSimpleService,
|
||||||
LifeCycle(Permanent)) ::
|
LifeCycle(Permanent)) ::
|
||||||
Supervise(
|
Supervise(
|
||||||
new PubSub,
|
new PubSub,
|
||||||
LifeCycle(Permanent))
|
LifeCycle(Permanent))
|
||||||
:: Nil))
|
:: Nil))
|
||||||
factory.newInstance.start
|
factory.newInstance.start
|
||||||
}
|
}
|
||||||
|
|
||||||
@Path("/pubsub/")
|
|
||||||
class PubSub extends Actor {
|
|
||||||
case class Msg(topic: String, message: String)
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Suspend
|
|
||||||
@Produces(Array("text/plain;charset=ISO-8859-1"))
|
|
||||||
@Path("/topic/{topic}/")
|
|
||||||
def subscribe(@PathParam("topic") topic: Broadcaster): Broadcastable = new Broadcastable("", topic)
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Broadcast
|
|
||||||
@Path("/topic/{topic}/{message}/")
|
|
||||||
@Produces(Array("text/plain;charset=ISO-8859-1"))
|
|
||||||
def say(@PathParam("topic") topic: Broadcaster, @PathParam("message") message: String): Broadcastable = new Broadcastable(message, topic)
|
|
||||||
|
|
||||||
override def receive = { case _ => }
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try service out by invoking (multiple times):
|
* Try service out by invoking (multiple times):
|
||||||
* <pre>
|
* <pre>
|
||||||
|
|
@ -66,9 +47,8 @@ class PubSub extends Actor {
|
||||||
* Or browse to the URL from a web browser.
|
* Or browse to the URL from a web browser.
|
||||||
*/
|
*/
|
||||||
@Path("/scalacount")
|
@Path("/scalacount")
|
||||||
class SimpleService extends Actor {
|
class SimpleService extends Transactor {
|
||||||
makeTransactionRequired
|
|
||||||
|
|
||||||
case object Tick
|
case object Tick
|
||||||
private val KEY = "COUNTER"
|
private val KEY = "COUNTER"
|
||||||
private var hasStartedTicking = false
|
private var hasStartedTicking = false
|
||||||
|
|
@ -91,6 +71,25 @@ class SimpleService extends Actor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Path("/pubsub/")
|
||||||
|
class PubSub extends Actor {
|
||||||
|
case class Msg(topic: String, message: String)
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Suspend
|
||||||
|
@Produces(Array("text/plain;charset=ISO-8859-1"))
|
||||||
|
@Path("/topic/{topic}/")
|
||||||
|
def subscribe(@PathParam("topic") topic: Broadcaster): Broadcastable = new Broadcastable("", topic)
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Broadcast
|
||||||
|
@Path("/topic/{topic}/{message}/")
|
||||||
|
@Produces(Array("text/plain;charset=ISO-8859-1"))
|
||||||
|
def say(@PathParam("topic") topic: Broadcaster, @PathParam("message") message: String): Broadcastable = new Broadcastable(message, topic)
|
||||||
|
|
||||||
|
def receive = { case _ => }
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try service out by invoking (multiple times):
|
* Try service out by invoking (multiple times):
|
||||||
* <pre>
|
* <pre>
|
||||||
|
|
@ -126,9 +125,7 @@ class PersistentSimpleService extends Actor {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Path("/chat")
|
@Path("/chat")
|
||||||
class Chat extends Actor with Logging {
|
class Chat extends Transactor {
|
||||||
makeTransactionRequired
|
|
||||||
|
|
||||||
case class Chat(val who: String, val what: String, val msg: String)
|
case class Chat(val who: String, val what: String, val msg: String)
|
||||||
|
|
||||||
@Suspend
|
@Suspend
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio.protobuf;
|
package se.scalablesolutions.akka.remote.protobuf;
|
||||||
|
|
||||||
public final class RemoteProtocol {
|
public final class RemoteProtocol {
|
||||||
private RemoteProtocol() {}
|
private RemoteProtocol() {}
|
||||||
|
|
@ -23,12 +23,12 @@ public final class RemoteProtocol {
|
||||||
|
|
||||||
public static final com.google.protobuf.Descriptors.Descriptor
|
public static final com.google.protobuf.Descriptors.Descriptor
|
||||||
getDescriptor() {
|
getDescriptor() {
|
||||||
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_descriptor;
|
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteRequest_descriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||||
internalGetFieldAccessorTable() {
|
internalGetFieldAccessorTable() {
|
||||||
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_fieldAccessorTable;
|
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteRequest_fieldAccessorTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
// required uint64 id = 1;
|
// required uint64 id = 1;
|
||||||
|
|
@ -115,6 +115,34 @@ public final class RemoteProtocol {
|
||||||
public boolean hasIsEscaped() { return hasIsEscaped; }
|
public boolean hasIsEscaped() { return hasIsEscaped; }
|
||||||
public boolean getIsEscaped() { return isEscaped_; }
|
public boolean getIsEscaped() { return isEscaped_; }
|
||||||
|
|
||||||
|
// optional string sourceHostname = 13;
|
||||||
|
public static final int SOURCEHOSTNAME_FIELD_NUMBER = 13;
|
||||||
|
private boolean hasSourceHostname;
|
||||||
|
private java.lang.String sourceHostname_ = "";
|
||||||
|
public boolean hasSourceHostname() { return hasSourceHostname; }
|
||||||
|
public java.lang.String getSourceHostname() { return sourceHostname_; }
|
||||||
|
|
||||||
|
// optional uint32 sourcePort = 14;
|
||||||
|
public static final int SOURCEPORT_FIELD_NUMBER = 14;
|
||||||
|
private boolean hasSourcePort;
|
||||||
|
private int sourcePort_ = 0;
|
||||||
|
public boolean hasSourcePort() { return hasSourcePort; }
|
||||||
|
public int getSourcePort() { return sourcePort_; }
|
||||||
|
|
||||||
|
// optional string sourceTarget = 15;
|
||||||
|
public static final int SOURCETARGET_FIELD_NUMBER = 15;
|
||||||
|
private boolean hasSourceTarget;
|
||||||
|
private java.lang.String sourceTarget_ = "";
|
||||||
|
public boolean hasSourceTarget() { return hasSourceTarget; }
|
||||||
|
public java.lang.String getSourceTarget() { return sourceTarget_; }
|
||||||
|
|
||||||
|
// optional string sourceUuid = 16;
|
||||||
|
public static final int SOURCEUUID_FIELD_NUMBER = 16;
|
||||||
|
private boolean hasSourceUuid;
|
||||||
|
private java.lang.String sourceUuid_ = "";
|
||||||
|
public boolean hasSourceUuid() { return hasSourceUuid; }
|
||||||
|
public java.lang.String getSourceUuid() { return sourceUuid_; }
|
||||||
|
|
||||||
public final boolean isInitialized() {
|
public final boolean isInitialized() {
|
||||||
if (!hasId) return false;
|
if (!hasId) return false;
|
||||||
if (!hasProtocol) return false;
|
if (!hasProtocol) return false;
|
||||||
|
|
@ -166,6 +194,18 @@ public final class RemoteProtocol {
|
||||||
if (hasIsEscaped()) {
|
if (hasIsEscaped()) {
|
||||||
output.writeBool(12, getIsEscaped());
|
output.writeBool(12, getIsEscaped());
|
||||||
}
|
}
|
||||||
|
if (hasSourceHostname()) {
|
||||||
|
output.writeString(13, getSourceHostname());
|
||||||
|
}
|
||||||
|
if (hasSourcePort()) {
|
||||||
|
output.writeUInt32(14, getSourcePort());
|
||||||
|
}
|
||||||
|
if (hasSourceTarget()) {
|
||||||
|
output.writeString(15, getSourceTarget());
|
||||||
|
}
|
||||||
|
if (hasSourceUuid()) {
|
||||||
|
output.writeString(16, getSourceUuid());
|
||||||
|
}
|
||||||
getUnknownFields().writeTo(output);
|
getUnknownFields().writeTo(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -223,62 +263,78 @@ public final class RemoteProtocol {
|
||||||
size += com.google.protobuf.CodedOutputStream
|
size += com.google.protobuf.CodedOutputStream
|
||||||
.computeBoolSize(12, getIsEscaped());
|
.computeBoolSize(12, getIsEscaped());
|
||||||
}
|
}
|
||||||
|
if (hasSourceHostname()) {
|
||||||
|
size += com.google.protobuf.CodedOutputStream
|
||||||
|
.computeStringSize(13, getSourceHostname());
|
||||||
|
}
|
||||||
|
if (hasSourcePort()) {
|
||||||
|
size += com.google.protobuf.CodedOutputStream
|
||||||
|
.computeUInt32Size(14, getSourcePort());
|
||||||
|
}
|
||||||
|
if (hasSourceTarget()) {
|
||||||
|
size += com.google.protobuf.CodedOutputStream
|
||||||
|
.computeStringSize(15, getSourceTarget());
|
||||||
|
}
|
||||||
|
if (hasSourceUuid()) {
|
||||||
|
size += com.google.protobuf.CodedOutputStream
|
||||||
|
.computeStringSize(16, getSourceUuid());
|
||||||
|
}
|
||||||
size += getUnknownFields().getSerializedSize();
|
size += getUnknownFields().getSerializedSize();
|
||||||
memoizedSerializedSize = size;
|
memoizedSerializedSize = size;
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
||||||
com.google.protobuf.ByteString data)
|
com.google.protobuf.ByteString data)
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
return newBuilder().mergeFrom(data).buildParsed();
|
return newBuilder().mergeFrom(data).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
||||||
com.google.protobuf.ByteString data,
|
com.google.protobuf.ByteString data,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
return newBuilder().mergeFrom(data, extensionRegistry)
|
return newBuilder().mergeFrom(data, extensionRegistry)
|
||||||
.buildParsed();
|
.buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(byte[] data)
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseFrom(byte[] data)
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
return newBuilder().mergeFrom(data).buildParsed();
|
return newBuilder().mergeFrom(data).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
||||||
byte[] data,
|
byte[] data,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
return newBuilder().mergeFrom(data, extensionRegistry)
|
return newBuilder().mergeFrom(data, extensionRegistry)
|
||||||
.buildParsed();
|
.buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(java.io.InputStream input)
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseFrom(java.io.InputStream input)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeFrom(input).buildParsed();
|
return newBuilder().mergeFrom(input).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
||||||
java.io.InputStream input,
|
java.io.InputStream input,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeFrom(input, extensionRegistry)
|
return newBuilder().mergeFrom(input, extensionRegistry)
|
||||||
.buildParsed();
|
.buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseDelimitedFrom(java.io.InputStream input)
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseDelimitedFrom(java.io.InputStream input)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeDelimitedFrom(input).buildParsed();
|
return newBuilder().mergeDelimitedFrom(input).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseDelimitedFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseDelimitedFrom(
|
||||||
java.io.InputStream input,
|
java.io.InputStream input,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
|
return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
|
||||||
.buildParsed();
|
.buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
||||||
com.google.protobuf.CodedInputStream input)
|
com.google.protobuf.CodedInputStream input)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeFrom(input).buildParsed();
|
return newBuilder().mergeFrom(input).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest parseFrom(
|
||||||
com.google.protobuf.CodedInputStream input,
|
com.google.protobuf.CodedInputStream input,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
|
|
@ -288,25 +344,25 @@ public final class RemoteProtocol {
|
||||||
|
|
||||||
public static Builder newBuilder() { return Builder.create(); }
|
public static Builder newBuilder() { return Builder.create(); }
|
||||||
public Builder newBuilderForType() { return newBuilder(); }
|
public Builder newBuilderForType() { return newBuilder(); }
|
||||||
public static Builder newBuilder(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest prototype) {
|
public static Builder newBuilder(se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest prototype) {
|
||||||
return newBuilder().mergeFrom(prototype);
|
return newBuilder().mergeFrom(prototype);
|
||||||
}
|
}
|
||||||
public Builder toBuilder() { return newBuilder(this); }
|
public Builder toBuilder() { return newBuilder(this); }
|
||||||
|
|
||||||
public static final class Builder extends
|
public static final class Builder extends
|
||||||
com.google.protobuf.GeneratedMessage.Builder<Builder> {
|
com.google.protobuf.GeneratedMessage.Builder<Builder> {
|
||||||
private se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest result;
|
private se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest result;
|
||||||
|
|
||||||
// Construct using se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.newBuilder()
|
// Construct using se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.newBuilder()
|
||||||
private Builder() {}
|
private Builder() {}
|
||||||
|
|
||||||
private static Builder create() {
|
private static Builder create() {
|
||||||
Builder builder = new Builder();
|
Builder builder = new Builder();
|
||||||
builder.result = new se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest();
|
builder.result = new se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest();
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest internalGetResult() {
|
protected se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest internalGetResult() {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -315,7 +371,7 @@ public final class RemoteProtocol {
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
"Cannot call clear() after build().");
|
"Cannot call clear() after build().");
|
||||||
}
|
}
|
||||||
result = new se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest();
|
result = new se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -325,24 +381,24 @@ public final class RemoteProtocol {
|
||||||
|
|
||||||
public com.google.protobuf.Descriptors.Descriptor
|
public com.google.protobuf.Descriptors.Descriptor
|
||||||
getDescriptorForType() {
|
getDescriptorForType() {
|
||||||
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.getDescriptor();
|
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.getDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest getDefaultInstanceForType() {
|
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest getDefaultInstanceForType() {
|
||||||
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance();
|
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInitialized() {
|
public boolean isInitialized() {
|
||||||
return result.isInitialized();
|
return result.isInitialized();
|
||||||
}
|
}
|
||||||
public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest build() {
|
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest build() {
|
||||||
if (result != null && !isInitialized()) {
|
if (result != null && !isInitialized()) {
|
||||||
throw newUninitializedMessageException(result);
|
throw newUninitializedMessageException(result);
|
||||||
}
|
}
|
||||||
return buildPartial();
|
return buildPartial();
|
||||||
}
|
}
|
||||||
|
|
||||||
private se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest buildParsed()
|
private se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest buildParsed()
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
if (!isInitialized()) {
|
if (!isInitialized()) {
|
||||||
throw newUninitializedMessageException(
|
throw newUninitializedMessageException(
|
||||||
|
|
@ -351,27 +407,27 @@ public final class RemoteProtocol {
|
||||||
return buildPartial();
|
return buildPartial();
|
||||||
}
|
}
|
||||||
|
|
||||||
public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest buildPartial() {
|
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest buildPartial() {
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
"build() has already been called on this Builder.");
|
"build() has already been called on this Builder.");
|
||||||
}
|
}
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest returnMe = result;
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest returnMe = result;
|
||||||
result = null;
|
result = null;
|
||||||
return returnMe;
|
return returnMe;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder mergeFrom(com.google.protobuf.Message other) {
|
public Builder mergeFrom(com.google.protobuf.Message other) {
|
||||||
if (other instanceof se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest) {
|
if (other instanceof se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest) {
|
||||||
return mergeFrom((se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest)other);
|
return mergeFrom((se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest)other);
|
||||||
} else {
|
} else {
|
||||||
super.mergeFrom(other);
|
super.mergeFrom(other);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder mergeFrom(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest other) {
|
public Builder mergeFrom(se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest other) {
|
||||||
if (other == se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance()) return this;
|
if (other == se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance()) return this;
|
||||||
if (other.hasId()) {
|
if (other.hasId()) {
|
||||||
setId(other.getId());
|
setId(other.getId());
|
||||||
}
|
}
|
||||||
|
|
@ -408,6 +464,18 @@ public final class RemoteProtocol {
|
||||||
if (other.hasIsEscaped()) {
|
if (other.hasIsEscaped()) {
|
||||||
setIsEscaped(other.getIsEscaped());
|
setIsEscaped(other.getIsEscaped());
|
||||||
}
|
}
|
||||||
|
if (other.hasSourceHostname()) {
|
||||||
|
setSourceHostname(other.getSourceHostname());
|
||||||
|
}
|
||||||
|
if (other.hasSourcePort()) {
|
||||||
|
setSourcePort(other.getSourcePort());
|
||||||
|
}
|
||||||
|
if (other.hasSourceTarget()) {
|
||||||
|
setSourceTarget(other.getSourceTarget());
|
||||||
|
}
|
||||||
|
if (other.hasSourceUuid()) {
|
||||||
|
setSourceUuid(other.getSourceUuid());
|
||||||
|
}
|
||||||
this.mergeUnknownFields(other.getUnknownFields());
|
this.mergeUnknownFields(other.getUnknownFields());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
@ -481,6 +549,22 @@ public final class RemoteProtocol {
|
||||||
setIsEscaped(input.readBool());
|
setIsEscaped(input.readBool());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 106: {
|
||||||
|
setSourceHostname(input.readString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 112: {
|
||||||
|
setSourcePort(input.readUInt32());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 122: {
|
||||||
|
setSourceTarget(input.readString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 130: {
|
||||||
|
setSourceUuid(input.readString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -719,14 +803,95 @@ public final class RemoteProtocol {
|
||||||
result.isEscaped_ = false;
|
result.isEscaped_ = false;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// optional string sourceHostname = 13;
|
||||||
|
public boolean hasSourceHostname() {
|
||||||
|
return result.hasSourceHostname();
|
||||||
|
}
|
||||||
|
public java.lang.String getSourceHostname() {
|
||||||
|
return result.getSourceHostname();
|
||||||
|
}
|
||||||
|
public Builder setSourceHostname(java.lang.String value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
result.hasSourceHostname = true;
|
||||||
|
result.sourceHostname_ = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public Builder clearSourceHostname() {
|
||||||
|
result.hasSourceHostname = false;
|
||||||
|
result.sourceHostname_ = getDefaultInstance().getSourceHostname();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// optional uint32 sourcePort = 14;
|
||||||
|
public boolean hasSourcePort() {
|
||||||
|
return result.hasSourcePort();
|
||||||
|
}
|
||||||
|
public int getSourcePort() {
|
||||||
|
return result.getSourcePort();
|
||||||
|
}
|
||||||
|
public Builder setSourcePort(int value) {
|
||||||
|
result.hasSourcePort = true;
|
||||||
|
result.sourcePort_ = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public Builder clearSourcePort() {
|
||||||
|
result.hasSourcePort = false;
|
||||||
|
result.sourcePort_ = 0;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// optional string sourceTarget = 15;
|
||||||
|
public boolean hasSourceTarget() {
|
||||||
|
return result.hasSourceTarget();
|
||||||
|
}
|
||||||
|
public java.lang.String getSourceTarget() {
|
||||||
|
return result.getSourceTarget();
|
||||||
|
}
|
||||||
|
public Builder setSourceTarget(java.lang.String value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
result.hasSourceTarget = true;
|
||||||
|
result.sourceTarget_ = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public Builder clearSourceTarget() {
|
||||||
|
result.hasSourceTarget = false;
|
||||||
|
result.sourceTarget_ = getDefaultInstance().getSourceTarget();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// optional string sourceUuid = 16;
|
||||||
|
public boolean hasSourceUuid() {
|
||||||
|
return result.hasSourceUuid();
|
||||||
|
}
|
||||||
|
public java.lang.String getSourceUuid() {
|
||||||
|
return result.getSourceUuid();
|
||||||
|
}
|
||||||
|
public Builder setSourceUuid(java.lang.String value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
result.hasSourceUuid = true;
|
||||||
|
result.sourceUuid_ = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public Builder clearSourceUuid() {
|
||||||
|
result.hasSourceUuid = false;
|
||||||
|
result.sourceUuid_ = getDefaultInstance().getSourceUuid();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.getDescriptor();
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.getDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internalForceInit();
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.internalForceInit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -746,12 +911,12 @@ public final class RemoteProtocol {
|
||||||
|
|
||||||
public static final com.google.protobuf.Descriptors.Descriptor
|
public static final com.google.protobuf.Descriptors.Descriptor
|
||||||
getDescriptor() {
|
getDescriptor() {
|
||||||
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_descriptor;
|
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteReply_descriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||||
internalGetFieldAccessorTable() {
|
internalGetFieldAccessorTable() {
|
||||||
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_fieldAccessorTable;
|
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteReply_fieldAccessorTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
// required uint64 id = 1;
|
// required uint64 id = 1;
|
||||||
|
|
@ -889,57 +1054,57 @@ public final class RemoteProtocol {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
||||||
com.google.protobuf.ByteString data)
|
com.google.protobuf.ByteString data)
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
return newBuilder().mergeFrom(data).buildParsed();
|
return newBuilder().mergeFrom(data).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
||||||
com.google.protobuf.ByteString data,
|
com.google.protobuf.ByteString data,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
return newBuilder().mergeFrom(data, extensionRegistry)
|
return newBuilder().mergeFrom(data, extensionRegistry)
|
||||||
.buildParsed();
|
.buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(byte[] data)
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseFrom(byte[] data)
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
return newBuilder().mergeFrom(data).buildParsed();
|
return newBuilder().mergeFrom(data).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
||||||
byte[] data,
|
byte[] data,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
return newBuilder().mergeFrom(data, extensionRegistry)
|
return newBuilder().mergeFrom(data, extensionRegistry)
|
||||||
.buildParsed();
|
.buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(java.io.InputStream input)
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseFrom(java.io.InputStream input)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeFrom(input).buildParsed();
|
return newBuilder().mergeFrom(input).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
||||||
java.io.InputStream input,
|
java.io.InputStream input,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeFrom(input, extensionRegistry)
|
return newBuilder().mergeFrom(input, extensionRegistry)
|
||||||
.buildParsed();
|
.buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseDelimitedFrom(java.io.InputStream input)
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseDelimitedFrom(java.io.InputStream input)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeDelimitedFrom(input).buildParsed();
|
return newBuilder().mergeDelimitedFrom(input).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseDelimitedFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseDelimitedFrom(
|
||||||
java.io.InputStream input,
|
java.io.InputStream input,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
|
return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
|
||||||
.buildParsed();
|
.buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
||||||
com.google.protobuf.CodedInputStream input)
|
com.google.protobuf.CodedInputStream input)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
return newBuilder().mergeFrom(input).buildParsed();
|
return newBuilder().mergeFrom(input).buildParsed();
|
||||||
}
|
}
|
||||||
public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
public static se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply parseFrom(
|
||||||
com.google.protobuf.CodedInputStream input,
|
com.google.protobuf.CodedInputStream input,
|
||||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||||
throws java.io.IOException {
|
throws java.io.IOException {
|
||||||
|
|
@ -949,25 +1114,25 @@ public final class RemoteProtocol {
|
||||||
|
|
||||||
public static Builder newBuilder() { return Builder.create(); }
|
public static Builder newBuilder() { return Builder.create(); }
|
||||||
public Builder newBuilderForType() { return newBuilder(); }
|
public Builder newBuilderForType() { return newBuilder(); }
|
||||||
public static Builder newBuilder(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply prototype) {
|
public static Builder newBuilder(se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply prototype) {
|
||||||
return newBuilder().mergeFrom(prototype);
|
return newBuilder().mergeFrom(prototype);
|
||||||
}
|
}
|
||||||
public Builder toBuilder() { return newBuilder(this); }
|
public Builder toBuilder() { return newBuilder(this); }
|
||||||
|
|
||||||
public static final class Builder extends
|
public static final class Builder extends
|
||||||
com.google.protobuf.GeneratedMessage.Builder<Builder> {
|
com.google.protobuf.GeneratedMessage.Builder<Builder> {
|
||||||
private se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply result;
|
private se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply result;
|
||||||
|
|
||||||
// Construct using se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.newBuilder()
|
// Construct using se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.newBuilder()
|
||||||
private Builder() {}
|
private Builder() {}
|
||||||
|
|
||||||
private static Builder create() {
|
private static Builder create() {
|
||||||
Builder builder = new Builder();
|
Builder builder = new Builder();
|
||||||
builder.result = new se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply();
|
builder.result = new se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply();
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply internalGetResult() {
|
protected se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply internalGetResult() {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -976,7 +1141,7 @@ public final class RemoteProtocol {
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
"Cannot call clear() after build().");
|
"Cannot call clear() after build().");
|
||||||
}
|
}
|
||||||
result = new se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply();
|
result = new se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -986,24 +1151,24 @@ public final class RemoteProtocol {
|
||||||
|
|
||||||
public com.google.protobuf.Descriptors.Descriptor
|
public com.google.protobuf.Descriptors.Descriptor
|
||||||
getDescriptorForType() {
|
getDescriptorForType() {
|
||||||
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.getDescriptor();
|
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.getDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply getDefaultInstanceForType() {
|
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply getDefaultInstanceForType() {
|
||||||
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance();
|
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInitialized() {
|
public boolean isInitialized() {
|
||||||
return result.isInitialized();
|
return result.isInitialized();
|
||||||
}
|
}
|
||||||
public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply build() {
|
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply build() {
|
||||||
if (result != null && !isInitialized()) {
|
if (result != null && !isInitialized()) {
|
||||||
throw newUninitializedMessageException(result);
|
throw newUninitializedMessageException(result);
|
||||||
}
|
}
|
||||||
return buildPartial();
|
return buildPartial();
|
||||||
}
|
}
|
||||||
|
|
||||||
private se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply buildParsed()
|
private se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply buildParsed()
|
||||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||||
if (!isInitialized()) {
|
if (!isInitialized()) {
|
||||||
throw newUninitializedMessageException(
|
throw newUninitializedMessageException(
|
||||||
|
|
@ -1012,27 +1177,27 @@ public final class RemoteProtocol {
|
||||||
return buildPartial();
|
return buildPartial();
|
||||||
}
|
}
|
||||||
|
|
||||||
public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply buildPartial() {
|
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply buildPartial() {
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
"build() has already been called on this Builder.");
|
"build() has already been called on this Builder.");
|
||||||
}
|
}
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply returnMe = result;
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply returnMe = result;
|
||||||
result = null;
|
result = null;
|
||||||
return returnMe;
|
return returnMe;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder mergeFrom(com.google.protobuf.Message other) {
|
public Builder mergeFrom(com.google.protobuf.Message other) {
|
||||||
if (other instanceof se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply) {
|
if (other instanceof se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply) {
|
||||||
return mergeFrom((se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply)other);
|
return mergeFrom((se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply)other);
|
||||||
} else {
|
} else {
|
||||||
super.mergeFrom(other);
|
super.mergeFrom(other);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder mergeFrom(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply other) {
|
public Builder mergeFrom(se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply other) {
|
||||||
if (other == se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance()) return this;
|
if (other == se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance()) return this;
|
||||||
if (other.hasId()) {
|
if (other.hasId()) {
|
||||||
setId(other.getId());
|
setId(other.getId());
|
||||||
}
|
}
|
||||||
|
|
@ -1277,24 +1442,24 @@ public final class RemoteProtocol {
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.getDescriptor();
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.getDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internalForceInit();
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.internalForceInit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static com.google.protobuf.Descriptors.Descriptor
|
private static com.google.protobuf.Descriptors.Descriptor
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_descriptor;
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteRequest_descriptor;
|
||||||
private static
|
private static
|
||||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_fieldAccessorTable;
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteRequest_fieldAccessorTable;
|
||||||
private static com.google.protobuf.Descriptors.Descriptor
|
private static com.google.protobuf.Descriptors.Descriptor
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_descriptor;
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteReply_descriptor;
|
||||||
private static
|
private static
|
||||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_fieldAccessorTable;
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteReply_fieldAccessorTable;
|
||||||
|
|
||||||
public static com.google.protobuf.Descriptors.FileDescriptor
|
public static com.google.protobuf.Descriptors.FileDescriptor
|
||||||
getDescriptor() {
|
getDescriptor() {
|
||||||
|
|
@ -1304,41 +1469,43 @@ public final class RemoteProtocol {
|
||||||
descriptor;
|
descriptor;
|
||||||
static {
|
static {
|
||||||
java.lang.String[] descriptorData = {
|
java.lang.String[] descriptorData = {
|
||||||
"\n;se/scalablesolutions/akka/nio/protobuf" +
|
"\n>se/scalablesolutions/akka/remote/proto" +
|
||||||
"/RemoteProtocol.proto\022&se.scalablesoluti" +
|
"buf/RemoteProtocol.proto\022)se.scalablesol" +
|
||||||
"ons.akka.nio.protobuf\"\344\001\n\rRemoteRequest\022" +
|
"utions.akka.remote.protobuf\"\272\002\n\rRemoteRe" +
|
||||||
"\n\n\002id\030\001 \002(\004\022\020\n\010protocol\030\002 \002(\r\022\017\n\007message" +
|
"quest\022\n\n\002id\030\001 \002(\004\022\020\n\010protocol\030\002 \002(\r\022\017\n\007m" +
|
||||||
"\030\003 \002(\014\022\027\n\017messageManifest\030\004 \001(\014\022\016\n\006metho" +
|
"essage\030\003 \002(\014\022\027\n\017messageManifest\030\004 \001(\014\022\016\n" +
|
||||||
"d\030\005 \001(\t\022\016\n\006target\030\006 \002(\t\022\014\n\004uuid\030\007 \002(\t\022\017\n" +
|
"\006method\030\005 \001(\t\022\016\n\006target\030\006 \002(\t\022\014\n\004uuid\030\007 " +
|
||||||
"\007timeout\030\010 \002(\004\022\026\n\016supervisorUuid\030\t \001(\t\022\017" +
|
"\002(\t\022\017\n\007timeout\030\010 \002(\004\022\026\n\016supervisorUuid\030\t" +
|
||||||
"\n\007isActor\030\n \002(\010\022\020\n\010isOneWay\030\013 \002(\010\022\021\n\tisE" +
|
" \001(\t\022\017\n\007isActor\030\n \002(\010\022\020\n\010isOneWay\030\013 \002(\010\022" +
|
||||||
"scaped\030\014 \002(\010\"\247\001\n\013RemoteReply\022\n\n\002id\030\001 \002(\004" +
|
"\021\n\tisEscaped\030\014 \002(\010\022\026\n\016sourceHostname\030\r \001" +
|
||||||
"\022\020\n\010protocol\030\002 \001(\r\022\017\n\007message\030\003 \001(\014\022\027\n\017m",
|
"(\t\022\022\n\nsourcePort\030\016 \001(\r\022\024\n\014sourceTarget\030\017",
|
||||||
"essageManifest\030\004 \001(\014\022\021\n\texception\030\005 \001(\t\022" +
|
" \001(\t\022\022\n\nsourceUuid\030\020 \001(\t\"\247\001\n\013RemoteReply" +
|
||||||
"\026\n\016supervisorUuid\030\006 \001(\t\022\017\n\007isActor\030\007 \002(\010" +
|
"\022\n\n\002id\030\001 \002(\004\022\020\n\010protocol\030\002 \001(\r\022\017\n\007messag" +
|
||||||
"\022\024\n\014isSuccessful\030\010 \002(\010"
|
"e\030\003 \001(\014\022\027\n\017messageManifest\030\004 \001(\014\022\021\n\texce" +
|
||||||
|
"ption\030\005 \001(\t\022\026\n\016supervisorUuid\030\006 \001(\t\022\017\n\007i" +
|
||||||
|
"sActor\030\007 \002(\010\022\024\n\014isSuccessful\030\010 \002(\010"
|
||||||
};
|
};
|
||||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||||
public com.google.protobuf.ExtensionRegistry assignDescriptors(
|
public com.google.protobuf.ExtensionRegistry assignDescriptors(
|
||||||
com.google.protobuf.Descriptors.FileDescriptor root) {
|
com.google.protobuf.Descriptors.FileDescriptor root) {
|
||||||
descriptor = root;
|
descriptor = root;
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_descriptor =
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteRequest_descriptor =
|
||||||
getDescriptor().getMessageTypes().get(0);
|
getDescriptor().getMessageTypes().get(0);
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_fieldAccessorTable = new
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteRequest_fieldAccessorTable = new
|
||||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_descriptor,
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteRequest_descriptor,
|
||||||
new java.lang.String[] { "Id", "Protocol", "Message", "MessageManifest", "Method", "Target", "Uuid", "Timeout", "SupervisorUuid", "IsActor", "IsOneWay", "IsEscaped", },
|
new java.lang.String[] { "Id", "Protocol", "Message", "MessageManifest", "Method", "Target", "Uuid", "Timeout", "SupervisorUuid", "IsActor", "IsOneWay", "IsEscaped", "SourceHostname", "SourcePort", "SourceTarget", "SourceUuid", },
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.class,
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.class,
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.Builder.class);
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.Builder.class);
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_descriptor =
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteReply_descriptor =
|
||||||
getDescriptor().getMessageTypes().get(1);
|
getDescriptor().getMessageTypes().get(1);
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_fieldAccessorTable = new
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteReply_fieldAccessorTable = new
|
||||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||||
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_descriptor,
|
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteReply_descriptor,
|
||||||
new java.lang.String[] { "Id", "Protocol", "Message", "MessageManifest", "Exception", "SupervisorUuid", "IsActor", "IsSuccessful", },
|
new java.lang.String[] { "Id", "Protocol", "Message", "MessageManifest", "Exception", "SupervisorUuid", "IsActor", "IsSuccessful", },
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.class,
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.class,
|
||||||
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.Builder.class);
|
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.Builder.class);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -2,12 +2,12 @@
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio.protobuf;
|
package se.scalablesolutions.akka.remote.protobuf;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compile with:
|
Compile with:
|
||||||
cd ./akka-util-java/src/main/java
|
cd ./akka-util-java/src/main/java
|
||||||
protoc se/scalablesolutions/akka/nio/protobuf/RemoteProtocol.proto --java_out .
|
protoc se/scalablesolutions/akka/remote/protobuf/RemoteProtocol.proto --java_out .
|
||||||
*/
|
*/
|
||||||
|
|
||||||
message RemoteRequest {
|
message RemoteRequest {
|
||||||
|
|
@ -23,6 +23,10 @@ message RemoteRequest {
|
||||||
required bool isActor = 10;
|
required bool isActor = 10;
|
||||||
required bool isOneWay = 11;
|
required bool isOneWay = 11;
|
||||||
required bool isEscaped = 12;
|
required bool isEscaped = 12;
|
||||||
|
optional string sourceHostname = 13;
|
||||||
|
optional uint32 sourcePort = 14;
|
||||||
|
optional string sourceTarget = 15;
|
||||||
|
optional string sourceUuid = 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
message RemoteReply {
|
message RemoteReply {
|
||||||
11
changes.xml
11
changes.xml
|
|
@ -32,18 +32,21 @@ see http://maven.apache.org/plugins/maven-changes-plugin/usage.html for full gui
|
||||||
<action dev="Viktor Klang" type="add">Support for using Scala XML tags in RESTful Actors (scala-jersey)</action>
|
<action dev="Viktor Klang" type="add">Support for using Scala XML tags in RESTful Actors (scala-jersey)</action>
|
||||||
<action dev="Viktor Klang" type="add">Support for Comet Actors using Atmosphere</action>
|
<action dev="Viktor Klang" type="add">Support for Comet Actors using Atmosphere</action>
|
||||||
<action dev="Eckhart Hertzler" type="add">Kerberos/SPNEGO support for Security module</action>
|
<action dev="Eckhart Hertzler" type="add">Kerberos/SPNEGO support for Security module</action>
|
||||||
|
<action dev="Mikael Högqvist" type="fix">Implicit sender for remote actors: Remote actors are able to use reply to answer a request</action>
|
||||||
<action dev="Jonas Bonér" type="add">Rewritten STM, now integrated with Multiverse STM</action>
|
<action dev="Jonas Bonér" type="add">Rewritten STM, now integrated with Multiverse STM</action>
|
||||||
<action dev="Jonas Bonér" type="add">Added STM API for atomic {..} and run {..} orElse {..}</action>
|
<action dev="Jonas Bonér" type="add">Added STM API for atomic {..} and run {..} orElse {..}</action>
|
||||||
<action dev="Jonas Bonér" type="add">Added STM retry</action>
|
<action dev="Jonas Bonér" type="add">Added STM retry</action>
|
||||||
<action dev="Jonas Bonér" type="add">Complete rewrite of the persistence transaction management, now based on Unit of Work and Multiverse STM</action>
|
<action dev="Jonas Bonér" type="add">Complete rewrite of the persistence transaction management, now based on Unit of Work and Multiverse STM</action>
|
||||||
<action dev="Jonas Bonér" type="add">Monadic API to TransactionalRef (use it in for-comprehension)</action>
|
<action dev="Jonas Bonér" type="add">Monadic API to TransactionalRef (use it in for-comprehension)</action>
|
||||||
<action dev="Jonas Bonér" type="add">Lightweight actor syntax using one of the Actor.actor(..) methods. F.e: 'actor { case _ => .. }'</action>
|
<action dev="Jonas Bonér" type="add">Lightweight actor syntax using one of the Actor.actor(..) methods. F.e: 'val a = actor { case _ => .. }'</action>
|
||||||
|
<action dev="Jonas Bonér" type="add">Rewritten event-based dispatcher which improved perfomance by 10x, now substantially faster than event-driven Scala Actors</action>
|
||||||
<action dev="Jonas Bonér" type="add">New Scala JSON parser based on sjson</action>
|
<action dev="Jonas Bonér" type="add">New Scala JSON parser based on sjson</action>
|
||||||
<action dev="Jonas Bonér" type="add">Added zlib compression to remote actors</action>
|
<action dev="Jonas Bonér" type="add">Added zlib compression to remote actors</action>
|
||||||
<action dev="Jonas Bonér" type="add">Added implicit sender reference for fire-forget ('!') message sends</action>
|
<action dev="Jonas Bonér" type="add">Added implicit sender reference for fire-forget ('!') message sends</action>
|
||||||
<action dev="Jonas Bonér" type="add">Monadic API to TransactionalRef (use it in for-comprehension)</action>
|
<action dev="Jonas Bonér" type="add">Monadic API to TransactionalRef (use it in for-comprehension)</action>
|
||||||
<action dev="Jonas Bonér" type="add">Smoother web app integration; just add akka.conf to the classpath (WEB-INF/classes), no need for AKKA_HOME or -Dakka.conf=..</action>
|
<action dev="Jonas Bonér" type="add">Smoother web app integration; just add akka.conf to the classpath (WEB-INF/classes), no need for AKKA_HOME or -Dakka.conf=..</action>
|
||||||
<action dev="Jonas Bonér" type="add">Modularization of distribution into a thin core (actors, remoting and STM) and the rest in submodules</action>
|
<action dev="Jonas Bonér" type="add">Modularization of distribution into a thin core (actors, remoting and STM) and the rest in submodules</action>
|
||||||
|
<action dev="Jonas Bonér" type="add">Added 'forward' to Actor</action>
|
||||||
<action dev="Jonas Bonér" type="add">JSON serialization for Java objects (using Jackson)</action>
|
<action dev="Jonas Bonér" type="add">JSON serialization for Java objects (using Jackson)</action>
|
||||||
<action dev="Jonas Bonér" type="add">JSON serialization for Scala objects (using SJSON)</action>
|
<action dev="Jonas Bonér" type="add">JSON serialization for Scala objects (using SJSON)</action>
|
||||||
<action dev="Jonas Bonér" type="add">Added implementation for remote actor reconnect upon failure</action>
|
<action dev="Jonas Bonér" type="add">Added implementation for remote actor reconnect upon failure</action>
|
||||||
|
|
@ -62,10 +65,10 @@ see http://maven.apache.org/plugins/maven-changes-plugin/usage.html for full gui
|
||||||
<action dev="Jonas Bonér" type="add">New URL: http://akkasource.org</action>
|
<action dev="Jonas Bonér" type="add">New URL: http://akkasource.org</action>
|
||||||
<action dev="Jonas Bonér" type="add">Enhanced trapping of failures: 'trapExit = List(classOf[..], classOf[..])'</action>
|
<action dev="Jonas Bonér" type="add">Enhanced trapping of failures: 'trapExit = List(classOf[..], classOf[..])'</action>
|
||||||
<action dev="Jonas Bonér" type="add">Upgraded to Netty 3.2, Protobuf 2.2, ScalaTest 1.0, Jersey 1.1.3, Atmosphere 0.4.1, Cassandra 0.4.1, Configgy 1.4</action>
|
<action dev="Jonas Bonér" type="add">Upgraded to Netty 3.2, Protobuf 2.2, ScalaTest 1.0, Jersey 1.1.3, Atmosphere 0.4.1, Cassandra 0.4.1, Configgy 1.4</action>
|
||||||
<action dev="Jonas Bonér" type="fix">Lowered actor memory footprint; now an actor consumes ~625 bytes, which mean that you can create 6.5 million on 4 G RAM</action>
|
<action dev="Jonas Bonér" type="fix">Lowered actor memory footprint; now an actor consumes ~600 bytes, which mean that you can create 6.5 million on 4 G RAM</action>
|
||||||
<action dev="Jonas Bonér" type="fix">Concurrent mode is now per actor basis</action>
|
<action dev="Jonas Bonér" type="remove">Removed concurrent mode</action>
|
||||||
<action dev="Jonas Bonér" type="fix">Remote actors are now defined by their UUID (not class name)</action>
|
<action dev="Jonas Bonér" type="fix">Remote actors are now defined by their UUID (not class name)</action>
|
||||||
<action dev="Jonas Bonér" type="fix">Fixed dispatcher bug</action>
|
<action dev="Jonas Bonér" type="fix">Fixed dispatcher bugs</action>
|
||||||
<action dev="Jonas Bonér" type="fix">Cleaned up Maven scripts and distribution in general</action>
|
<action dev="Jonas Bonér" type="fix">Cleaned up Maven scripts and distribution in general</action>
|
||||||
<action dev="Jonas Bonér" type="fix">Fixed many many bugs and minor issues</action>
|
<action dev="Jonas Bonér" type="fix">Fixed many many bugs and minor issues</action>
|
||||||
<action dev="Jonas Bonér" type="fix">Fixed inconsistencies and uglyness in Actors API</action>
|
<action dev="Jonas Bonér" type="fix">Fixed inconsistencies and uglyness in Actors API</action>
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ package se.scalablesolutions.akka.actor
|
||||||
import java.net.InetSocketAddress
|
import java.net.InetSocketAddress
|
||||||
|
|
||||||
import se.scalablesolutions.akka.dispatch.{MessageDispatcher, FutureResult}
|
import se.scalablesolutions.akka.dispatch.{MessageDispatcher, FutureResult}
|
||||||
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
|
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest
|
||||||
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
|
import se.scalablesolutions.akka.remote.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
|
||||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
import se.scalablesolutions.akka.util._
|
import se.scalablesolutions.akka.util._
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,8 @@ import se.scalablesolutions.akka.config.ScalaConfig._
|
||||||
import se.scalablesolutions.akka.stm.Transaction._
|
import se.scalablesolutions.akka.stm.Transaction._
|
||||||
import se.scalablesolutions.akka.stm.TransactionManagement._
|
import se.scalablesolutions.akka.stm.TransactionManagement._
|
||||||
import se.scalablesolutions.akka.stm.{StmException, TransactionManagement}
|
import se.scalablesolutions.akka.stm.{StmException, TransactionManagement}
|
||||||
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
|
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest
|
||||||
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
|
import se.scalablesolutions.akka.remote.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
|
||||||
import se.scalablesolutions.akka.serialization.Serializer
|
import se.scalablesolutions.akka.serialization.Serializer
|
||||||
import se.scalablesolutions.akka.util.Helpers.ReadWriteLock
|
import se.scalablesolutions.akka.util.Helpers.ReadWriteLock
|
||||||
import se.scalablesolutions.akka.util.Logging
|
import se.scalablesolutions.akka.util.Logging
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -10,7 +10,7 @@
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio
|
package se.scalablesolutions.akka.remote
|
||||||
|
|
||||||
import scala.collection.mutable.HashMap
|
import scala.collection.mutable.HashMap
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio
|
package se.scalablesolutions.akka.remote
|
||||||
|
|
||||||
import akka.serialization.Serializable.SBinary
|
import akka.serialization.Serializable.SBinary
|
||||||
import com.google.protobuf.{Message, ByteString}
|
import com.google.protobuf.{Message, ByteString}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio
|
package se.scalablesolutions.akka.remote
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException
|
import java.lang.reflect.InvocationTargetException
|
||||||
import java.net.InetSocketAddress
|
import java.net.InetSocketAddress
|
||||||
|
|
@ -18,7 +18,7 @@ import java.util.concurrent.{ConcurrentHashMap, Executors}
|
||||||
|
|
||||||
import se.scalablesolutions.akka.actor._
|
import se.scalablesolutions.akka.actor._
|
||||||
import se.scalablesolutions.akka.util._
|
import se.scalablesolutions.akka.util._
|
||||||
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.{RemoteReply, RemoteRequest}
|
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.{RemoteReply, RemoteRequest}
|
||||||
import se.scalablesolutions.akka.Config.config
|
import se.scalablesolutions.akka.Config.config
|
||||||
|
|
||||||
import org.jboss.netty.bootstrap.ServerBootstrap
|
import org.jboss.netty.bootstrap.ServerBootstrap
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
* Copyright (C) 2009 Scalable Solutions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.scalablesolutions.akka.nio
|
package se.scalablesolutions.akka.remote
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicLong
|
import java.util.concurrent.atomic.AtomicLong
|
||||||
import stm.Transaction
|
import stm.Transaction
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt><a href="javascript:selectPackage('se.scalablesolutions.akka.nio')">se.scalablesolutions.akka.nio</a></dt>
|
<dt><a href="javascript:selectPackage('se.scalablesolutions.akka.remote')">se.scalablesolutions.akka.remote</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.nio.RemoteClient</title>
|
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.remote.RemoteClient</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
||||||
<meta content="scaladoc (1.2)" name="generator"></meta>
|
<meta content="scaladoc (1.2)" name="generator"></meta>
|
||||||
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
<!-- ======== START OF CLASS DATA ======== -->
|
<!-- ======== START OF CLASS DATA ======== -->
|
||||||
<h2>
|
<h2>
|
||||||
<span style="font-size:80%">se.scalablesolutions.akka.nio.RemoteClient</span>
|
<span style="font-size:80%">se.scalablesolutions.akka.remote.RemoteClient</span>
|
||||||
<br></br>
|
<br></br>
|
||||||
object RemoteClient
|
object RemoteClient
|
||||||
</h2>
|
</h2>
|
||||||
|
|
@ -59,7 +59,7 @@
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<br></br>
|
<br></br>
|
||||||
Companion: <a href="./RemoteClient.html" title="se.scalablesolutions.akka.nio.RemoteClient" >RemoteClient</a><br></br>
|
Companion: <a href="./RemoteClient.html" title="se.scalablesolutions.akka.remote.RemoteClient" >RemoteClient</a><br></br>
|
||||||
Source: <a href="./../../../../nio/RemoteClient.scala.html#Some(29)">RemoteClient.scala(29)</a>
|
Source: <a href="./../../../../nio/RemoteClient.scala.html#Some(29)">RemoteClient.scala(29)</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -213,7 +213,7 @@
|
||||||
|
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
<td class="type"><a href="./RemoteClient.html" title="se.scalablesolutions.akka.nio.RemoteClient" >RemoteClient</a></td>
|
<td class="type"><a href="./RemoteClient.html" title="se.scalablesolutions.akka.remote.RemoteClient" >RemoteClient</a></td>
|
||||||
<td class="remarks">
|
<td class="remarks">
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -440,7 +440,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.nio.RemoteClient</title>
|
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.remote.RemoteClient</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
||||||
<meta content="scaladoc (1.2)" name="generator"></meta>
|
<meta content="scaladoc (1.2)" name="generator"></meta>
|
||||||
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
<!-- ======== START OF CLASS DATA ======== -->
|
<!-- ======== START OF CLASS DATA ======== -->
|
||||||
<h2>
|
<h2>
|
||||||
<span style="font-size:80%">se.scalablesolutions.akka.nio.RemoteClient</span>
|
<span style="font-size:80%">se.scalablesolutions.akka.remote.RemoteClient</span>
|
||||||
<br></br>
|
<br></br>
|
||||||
class RemoteClient
|
class RemoteClient
|
||||||
</h2>
|
</h2>
|
||||||
|
|
@ -59,7 +59,7 @@
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<br></br>
|
<br></br>
|
||||||
Companion: <a href="./RemoteClient$object.html" title="se.scalablesolutions.akka.nio.RemoteClient" >RemoteClient</a><br></br>
|
Companion: <a href="./RemoteClient$object.html" title="se.scalablesolutions.akka.remote.RemoteClient" >RemoteClient</a><br></br>
|
||||||
Source: <a href="./../../../../nio/RemoteClient.scala.html#Some(54)">RemoteClient.scala(54)</a>
|
Source: <a href="./../../../../nio/RemoteClient.scala.html#Some(54)">RemoteClient.scala(54)</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -388,10 +388,10 @@
|
||||||
</td>
|
</td>
|
||||||
</tr><tr class="">
|
</tr><tr class="">
|
||||||
<td class="name">
|
<td class="name">
|
||||||
<b>send</b>..<a name="send(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest)"></a>
|
<b>send</b>..<a name="send(se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest)"></a>
|
||||||
</td>
|
</td>
|
||||||
<td class="signature">
|
<td class="signature">
|
||||||
<code class="signature">def send(request : <a href="./protobuf/RemoteProtocol/RemoteRequest.html" title="se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest" >RemoteRequest</a>)</code>
|
<code class="signature">def send(request : <a href="./protobuf/RemoteProtocol/RemoteRequest.html" title="se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest" >RemoteRequest</a>)</code>
|
||||||
|
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
|
|
@ -496,7 +496,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.nio.RemoteClientHandler</title>
|
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.remote.RemoteClientHandler</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
||||||
<meta content="scaladoc (1.2)" name="generator"></meta>
|
<meta content="scaladoc (1.2)" name="generator"></meta>
|
||||||
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
<!-- ======== START OF CLASS DATA ======== -->
|
<!-- ======== START OF CLASS DATA ======== -->
|
||||||
<h2>
|
<h2>
|
||||||
<span style="font-size:80%">se.scalablesolutions.akka.nio.RemoteClientHandler</span>
|
<span style="font-size:80%">se.scalablesolutions.akka.remote.RemoteClientHandler</span>
|
||||||
<br></br>
|
<br></br>
|
||||||
class RemoteClientHandler
|
class RemoteClientHandler
|
||||||
</h2>
|
</h2>
|
||||||
|
|
@ -580,7 +580,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.nio.RemoteClientPipelineFactory</title>
|
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.remote.RemoteClientPipelineFactory</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
||||||
<meta content="scaladoc (1.2)" name="generator"></meta>
|
<meta content="scaladoc (1.2)" name="generator"></meta>
|
||||||
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
<!-- ======== START OF CLASS DATA ======== -->
|
<!-- ======== START OF CLASS DATA ======== -->
|
||||||
<h2>
|
<h2>
|
||||||
<span style="font-size:80%">se.scalablesolutions.akka.nio.RemoteClientPipelineFactory</span>
|
<span style="font-size:80%">se.scalablesolutions.akka.remote.RemoteClientPipelineFactory</span>
|
||||||
<br></br>
|
<br></br>
|
||||||
class RemoteClientPipelineFactory
|
class RemoteClientPipelineFactory
|
||||||
</h2>
|
</h2>
|
||||||
|
|
@ -390,7 +390,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.nio.RemoteProtocolBuilder</title>
|
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.remote.RemoteProtocolBuilder</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
||||||
<meta content="scaladoc (1.2)" name="generator"></meta>
|
<meta content="scaladoc (1.2)" name="generator"></meta>
|
||||||
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
<!-- ======== START OF CLASS DATA ======== -->
|
<!-- ======== START OF CLASS DATA ======== -->
|
||||||
<h2>
|
<h2>
|
||||||
<span style="font-size:80%">se.scalablesolutions.akka.nio.RemoteProtocolBuilder</span>
|
<span style="font-size:80%">se.scalablesolutions.akka.remote.RemoteProtocolBuilder</span>
|
||||||
<br></br>
|
<br></br>
|
||||||
object RemoteProtocolBuilder
|
object RemoteProtocolBuilder
|
||||||
</h2>
|
</h2>
|
||||||
|
|
@ -224,10 +224,10 @@
|
||||||
</td>
|
</td>
|
||||||
</tr><tr class="">
|
</tr><tr class="">
|
||||||
<td class="name">
|
<td class="name">
|
||||||
<b>getMessage</b>..<a name="getMessage(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply)"></a>
|
<b>getMessage</b>..<a name="getMessage(se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply)"></a>
|
||||||
</td>
|
</td>
|
||||||
<td class="signature">
|
<td class="signature">
|
||||||
<code class="signature">def getMessage(reply : <a href="./protobuf/RemoteProtocol/RemoteReply.html" title="se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply" >RemoteReply</a>)</code>
|
<code class="signature">def getMessage(reply : <a href="./protobuf/RemoteProtocol/RemoteReply.html" title="se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply" >RemoteReply</a>)</code>
|
||||||
|
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
|
|
@ -238,10 +238,10 @@
|
||||||
</td>
|
</td>
|
||||||
</tr><tr class="">
|
</tr><tr class="">
|
||||||
<td class="name">
|
<td class="name">
|
||||||
<b>getMessage</b>..<a name="getMessage(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest)"></a>
|
<b>getMessage</b>..<a name="getMessage(se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest)"></a>
|
||||||
</td>
|
</td>
|
||||||
<td class="signature">
|
<td class="signature">
|
||||||
<code class="signature">def getMessage(request : <a href="./protobuf/RemoteProtocol/RemoteRequest.html" title="se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest" >RemoteRequest</a>)</code>
|
<code class="signature">def getMessage(request : <a href="./protobuf/RemoteProtocol/RemoteRequest.html" title="se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest" >RemoteRequest</a>)</code>
|
||||||
|
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
|
|
@ -322,28 +322,28 @@
|
||||||
</td>
|
</td>
|
||||||
</tr><tr class="">
|
</tr><tr class="">
|
||||||
<td class="name">
|
<td class="name">
|
||||||
<b>setMessage</b>..<a name="setMessage(java.lang.Object,se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.Builder)"></a>
|
<b>setMessage</b>..<a name="setMessage(java.lang.Object,se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.Builder)"></a>
|
||||||
</td>
|
</td>
|
||||||
<td class="signature">
|
<td class="signature">
|
||||||
<code class="signature">def setMessage(message : <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html" title="java.lang.Object" >Object</a>, builder : <a href="./protobuf/RemoteProtocol/RemoteReply/Builder.html" title="se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.Builder" >Builder</a>)</code>
|
<code class="signature">def setMessage(message : <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html" title="java.lang.Object" >Object</a>, builder : <a href="./protobuf/RemoteProtocol/RemoteReply/Builder.html" title="se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.Builder" >Builder</a>)</code>
|
||||||
|
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
<td class="type"><a href="./protobuf/RemoteProtocol/RemoteReply/Builder.html" title="se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.Builder" >Builder</a></td>
|
<td class="type"><a href="./protobuf/RemoteProtocol/RemoteReply/Builder.html" title="se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.Builder" >Builder</a></td>
|
||||||
<td class="remarks">
|
<td class="remarks">
|
||||||
|
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr><tr class="">
|
</tr><tr class="">
|
||||||
<td class="name">
|
<td class="name">
|
||||||
<b>setMessage</b>..<a name="setMessage(java.lang.Object,se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.Builder)"></a>
|
<b>setMessage</b>..<a name="setMessage(java.lang.Object,se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.Builder)"></a>
|
||||||
</td>
|
</td>
|
||||||
<td class="signature">
|
<td class="signature">
|
||||||
<code class="signature">def setMessage(message : <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html" title="java.lang.Object" >Object</a>, builder : <a href="./protobuf/RemoteProtocol/RemoteRequest/Builder.html" title="se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.Builder" >Builder</a>)</code>
|
<code class="signature">def setMessage(message : <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html" title="java.lang.Object" >Object</a>, builder : <a href="./protobuf/RemoteProtocol/RemoteRequest/Builder.html" title="se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.Builder" >Builder</a>)</code>
|
||||||
|
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
<td class="type"><a href="./protobuf/RemoteProtocol/RemoteRequest/Builder.html" title="se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.Builder" >Builder</a></td>
|
<td class="type"><a href="./protobuf/RemoteProtocol/RemoteRequest/Builder.html" title="se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.Builder" >Builder</a></td>
|
||||||
<td class="remarks">
|
<td class="remarks">
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -430,7 +430,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.nio.RemoteRequestIdFactory</title>
|
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.remote.RemoteRequestIdFactory</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
||||||
<meta content="scaladoc (1.2)" name="generator"></meta>
|
<meta content="scaladoc (1.2)" name="generator"></meta>
|
||||||
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
<!-- ======== START OF CLASS DATA ======== -->
|
<!-- ======== START OF CLASS DATA ======== -->
|
||||||
<h2>
|
<h2>
|
||||||
<span style="font-size:80%">se.scalablesolutions.akka.nio.RemoteRequestIdFactory</span>
|
<span style="font-size:80%">se.scalablesolutions.akka.remote.RemoteRequestIdFactory</span>
|
||||||
<br></br>
|
<br></br>
|
||||||
object RemoteRequestIdFactory
|
object RemoteRequestIdFactory
|
||||||
</h2>
|
</h2>
|
||||||
|
|
@ -392,7 +392,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.nio.RemoteServer</title>
|
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.remote.RemoteServer</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
||||||
<meta content="scaladoc (1.2)" name="generator"></meta>
|
<meta content="scaladoc (1.2)" name="generator"></meta>
|
||||||
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
<!-- ======== START OF CLASS DATA ======== -->
|
<!-- ======== START OF CLASS DATA ======== -->
|
||||||
<h2>
|
<h2>
|
||||||
<span style="font-size:80%">se.scalablesolutions.akka.nio.RemoteServer</span>
|
<span style="font-size:80%">se.scalablesolutions.akka.remote.RemoteServer</span>
|
||||||
<br></br>
|
<br></br>
|
||||||
object RemoteServer
|
object RemoteServer
|
||||||
</h2>
|
</h2>
|
||||||
|
|
@ -510,7 +510,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.nio.RemoteServerHandler</title>
|
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.remote.RemoteServerHandler</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
||||||
<meta content="scaladoc (1.2)" name="generator"></meta>
|
<meta content="scaladoc (1.2)" name="generator"></meta>
|
||||||
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
<!-- ======== START OF CLASS DATA ======== -->
|
<!-- ======== START OF CLASS DATA ======== -->
|
||||||
<h2>
|
<h2>
|
||||||
<span style="font-size:80%">se.scalablesolutions.akka.nio.RemoteServerHandler</span>
|
<span style="font-size:80%">se.scalablesolutions.akka.remote.RemoteServerHandler</span>
|
||||||
<br></br>
|
<br></br>
|
||||||
class RemoteServerHandler
|
class RemoteServerHandler
|
||||||
</h2>
|
</h2>
|
||||||
|
|
@ -580,7 +580,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.nio.RemoteServerPipelineFactory</title>
|
<title>Akka Actors Module 0.6 API : se.scalablesolutions.akka.remote.RemoteServerPipelineFactory</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
|
||||||
<meta content="scaladoc (1.2)" name="generator"></meta>
|
<meta content="scaladoc (1.2)" name="generator"></meta>
|
||||||
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
<!-- ======== START OF CLASS DATA ======== -->
|
<!-- ======== START OF CLASS DATA ======== -->
|
||||||
<h2>
|
<h2>
|
||||||
<span style="font-size:80%">se.scalablesolutions.akka.nio.RemoteServerPipelineFactory</span>
|
<span style="font-size:80%">se.scalablesolutions.akka.remote.RemoteServerPipelineFactory</span>
|
||||||
<br></br>
|
<br></br>
|
||||||
class RemoteServerPipelineFactory
|
class RemoteServerPipelineFactory
|
||||||
</h2>
|
</h2>
|
||||||
|
|
@ -390,7 +390,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="NavBarCell1">
|
<td class="NavBarCell1">
|
||||||
<a href="./../../../../overview.html">OVERVIEW</a> |
|
<a href="./../../../../overview.html">OVERVIEW</a> |
|
||||||
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.nio" >PACKAGE</a> |
|
<a href="./../../../../overview.html" title="se.scalablesolutions.akka.remote" >PACKAGE</a> |
|
||||||
<a href="#Constructors">CONSTR</a> |
|
<a href="#Constructors">CONSTR</a> |
|
||||||
<a href="#Fields">FIELDS</a> |
|
<a href="#Fields">FIELDS</a> |
|
||||||
<a href="#Methods">METHODS</a>
|
<a href="#Methods">METHODS</a>
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>org.apache.camel</groupId>
|
|
||||||
<artifactId>camel-core</artifactId>
|
|
||||||
<version>2.0-SNAPSHOT</version>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
</project>
|
|
||||||
Binary file not shown.
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>org.apache</groupId>
|
|
||||||
<artifactId>zookeeper</artifactId>
|
|
||||||
<version>3.1.0</version>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
</project>
|
|
||||||
Binary file not shown.
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>org.codehaus.jackson</groupId>
|
|
||||||
<artifactId>jackson-core-asl</artifactId>
|
|
||||||
<version>1.1.0</version>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
</project>
|
|
||||||
Binary file not shown.
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>org.codehaus.jackson</groupId>
|
|
||||||
<artifactId>jackson-mapper-asl</artifactId>
|
|
||||||
<version>1.1.0</version>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
</project>
|
|
||||||
Binary file not shown.
BIN
embedded-repo/voldemort/store/compress/h2-lzf/1.0/h2-lzf-1.0.jar
Normal file
BIN
embedded-repo/voldemort/store/compress/h2-lzf/1.0/h2-lzf-1.0.jar
Normal file
Binary file not shown.
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>high-scale-lib</groupId>
|
<groupId>voldemort.store.compress</groupId>
|
||||||
<artifactId>high-scale-lib</artifactId>
|
<artifactId>h2-lzf</artifactId>
|
||||||
<version>1.0</version>
|
<version>1.0</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
</project>
|
</project>
|
||||||
29
pom.xml
29
pom.xml
|
|
@ -13,12 +13,26 @@
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<description>
|
<description>
|
||||||
Akka implements a unique hybrid of the Actor model and Software Transactional Memory (STM).
|
Akka implements a unique hybrid of:
|
||||||
Akka gives you you:
|
* Actors , which gives you:
|
||||||
* Concurrency (high-level and simple).
|
* Simple and high-level abstractions for concurrency and parallelism.
|
||||||
* Asynchronous, non-blocking, event-driven and highly performant components.
|
* Asynchronous, non-blocking and highly performant event-driven programming model.
|
||||||
* Scalability through very performant remote actors.
|
* Very lightweight event-driven processes (create ~6.5 million actors on 4 G RAM).
|
||||||
* Fault-tolerance through supervision hierarchies with “let-it-crash” semantics.
|
* Supervision hierarchies with let-it-crash semantics. For writing highly fault-tolerant systems that never stops, systems that self-heals.
|
||||||
|
* Software Transactional Memory (STM). (Distributed transactions coming soon).
|
||||||
|
* Transactors: combine actors and STM into transactional actors. Allows you to compose atomic message flows with automatic rollback and retry.
|
||||||
|
* Remoting: highly performant distributed actors with remote supervision and error management.
|
||||||
|
* Cluster membership management.
|
||||||
|
|
||||||
|
Akka also has a set of add-on modules:
|
||||||
|
* Persistence: A set of pluggable back-end storage modules that works in sync with the STM.
|
||||||
|
* Cassandra distributed and highly scalable database.
|
||||||
|
* MongoDB document database.
|
||||||
|
* Redis data structures database (upcoming)
|
||||||
|
* REST (JAX-RS): Expose actors as REST services.
|
||||||
|
* Comet: Expose actors as Comet services.
|
||||||
|
* Security: Digest and Kerberos based security.
|
||||||
|
* Microkernel: Run Akka as a stand-alone kernel.
|
||||||
</description>
|
</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|
@ -29,7 +43,7 @@
|
||||||
<maven.compiler.encoding>${project.build.sourceEncoding}</maven.compiler.encoding>
|
<maven.compiler.encoding>${project.build.sourceEncoding}</maven.compiler.encoding>
|
||||||
<project.reporting.outputEncoding>${project.build.sourceEncoding}</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>${project.build.sourceEncoding}</project.reporting.outputEncoding>
|
||||||
<atmosphere.version>0.5-SNAPSHOT</atmosphere.version>
|
<atmosphere.version>0.5-SNAPSHOT</atmosphere.version>
|
||||||
<jersey.version>1.1.4</jersey.version>
|
<jersey.version>1.1.5-ea-SNAPSHOT</jersey.version>
|
||||||
<grizzly.version>1.9.18-i</grizzly.version>
|
<grizzly.version>1.9.18-i</grizzly.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
|
@ -39,7 +53,6 @@
|
||||||
<module>akka-actors</module>
|
<module>akka-actors</module>
|
||||||
<module>akka-persistence</module>
|
<module>akka-persistence</module>
|
||||||
<module>akka-rest</module>
|
<module>akka-rest</module>
|
||||||
<module>akka-camel</module>
|
|
||||||
<module>akka-amqp</module>
|
<module>akka-amqp</module>
|
||||||
<module>akka-security</module>
|
<module>akka-security</module>
|
||||||
<module>akka-kernel</module>
|
<module>akka-kernel</module>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue