This commit is contained in:
Viktor Klang 2009-12-18 21:26:03 +01:00
parent fc1d7b3859
commit e3c83da036
78 changed files with 804 additions and 1021 deletions

View file

@ -75,19 +75,19 @@
<!-- For Protocol/Serialization -->
<dependency>
<groupId>org.h2.compress</groupId>
<groupId>voldemort.store.compress</groupId>
<artifactId>h2-lzf</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.1.0</version>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.1.0</version>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>

View file

@ -6,8 +6,8 @@ package se.scalablesolutions.akka.actor
import java.net.InetSocketAddress
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest
import se.scalablesolutions.akka.remote.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import se.scalablesolutions.akka.config.ScalaConfig._
import se.scalablesolutions.akka.serialization.Serializer
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 + "]")
}
override protected def preRestart(reason: AnyRef, config: Option[AnyRef]) {
override protected def preRestart(reason: AnyRef) {
try {
if (preRestart.isDefined) preRestart.get.invoke(target.get, ZERO_ITEM_OBJECT_ARRAY: _*)
} catch { case e: InvocationTargetException => throw e.getCause }
}
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {
override protected def postRestart(reason: AnyRef) {
try {
if (postRestart.isDefined) postRestart.get.invoke(target.get, ZERO_ITEM_OBJECT_ARRAY: _*)
} catch { case e: InvocationTargetException => throw e.getCause }

View file

@ -4,30 +4,30 @@
package se.scalablesolutions.akka.actor
import java.net.InetSocketAddress
import se.scalablesolutions.akka.Config._
import se.scalablesolutions.akka.dispatch._
import se.scalablesolutions.akka.config.{AllForOneStrategy, OneForOneStrategy, FaultHandlingStrategy}
import se.scalablesolutions.akka.config.ScalaConfig._
import se.scalablesolutions.akka.stm.Transaction._
import se.scalablesolutions.akka.stm.TransactionManagement._
import se.scalablesolutions.akka.stm.{StmException, TransactionManagement}
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest
import se.scalablesolutions.akka.remote.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import se.scalablesolutions.akka.serialization.Serializer
import se.scalablesolutions.akka.util.Helpers.ReadWriteLock
import se.scalablesolutions.akka.util.{HashCode, Logging}
import org.codehaus.aspectwerkz.proxy.Uuid
import org.multiverse.api.ThreadLocalTransaction._
import java.util.{Queue, LinkedList, HashSet}
import java.util.{Queue, HashSet}
import java.util.concurrent.ConcurrentLinkedQueue
import java.net.InetSocketAddress
/**
* Implements the Transactor abstraction. E.g. a transactional actor.
* <p/>
* Can also be achived by invoking <code>makeTransactionRequired</code>
* in the body of the <code>Actor</code>.
* Equivalent to invoking the <code>makeTransactionRequired</code> method in the body of the <code>Actor</code
*/
trait Transactor extends Actor {
makeTransactionRequired
@ -35,20 +35,21 @@ trait Transactor extends 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 {
makeRemote(hostname, port)
}
@serializable sealed trait LifeCycleMessage
case class Init(config: AnyRef) extends LifeCycleMessage
case class HotSwap(code: Option[PartialFunction[Any, Unit]]) extends LifeCycleMessage
case class Restart(reason: AnyRef) extends LifeCycleMessage
case class Exit(dead: Actor, killer: Throwable) 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
object DispatcherType {
@ -71,6 +72,8 @@ class ActorMessageInvoker(val actor: Actor) extends MessageInvoker {
object Actor extends Logging {
val TIMEOUT = config.getInt("akka.actor.timeout", 5000)
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 {
implicit val Self: AnyRef = this
@ -216,7 +219,6 @@ trait Actor extends TransactionManagement {
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
private[akka] var _uuid = Uuid.newUuid.toString
def uuid = _uuid
@ -225,18 +227,17 @@ trait Actor extends TransactionManagement {
// private fields
// ====================================
@volatile private var _isRunning = false
@volatile private var _isSuspended = true
@volatile private var _isShutDown: Boolean = false
private var _isEventBased: Boolean = false
@volatile private[this] var _isRunning = false
@volatile private[this] var _isSuspended = true
@volatile private[this] var _isShutDown = false
@volatile private[this] var _isEventBased: Boolean = false
@volatile private[akka] var _isKilled = false
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 _linkedActors: Option[HashSet[Actor]] = None
private[akka] var _supervisor: Option[Actor] = None
private[akka] val _mailbox: Queue[MessageInvocation] = new LinkedList[MessageInvocation]
private[akka] var _contactAddress: Option[InetSocketAddress] = None
private[akka] val _mailbox: Queue[MessageInvocation] = new ConcurrentLinkedQueue[MessageInvocation]
// ====================================
// protected fields
@ -252,14 +253,14 @@ trait Actor extends TransactionManagement {
* 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.
*/
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.
* 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.
*/
protected[this] var senderFuture: Option[CompletableFutureResult] = None
protected var senderFuture: Option[CompletableFutureResult] = None
// ====================================
// ==== USER CALLBACKS TO OVERRIDE ====
@ -316,7 +317,7 @@ trait Actor extends TransactionManagement {
* trapExit = List(classOf[MyApplicationException], classOf[MyApplicationError])
* </pre>
*/
protected[this] var trapExit: List[Class[_ <: Throwable]] = Nil
protected var trapExit: List[Class[_ <: Throwable]] = Nil
/**
* User overridable callback/setting.
@ -375,7 +376,7 @@ trait Actor extends TransactionManagement {
* Optional callback method that is called during initialization.
* To be implemented by subclassing actor.
*/
protected def init(config: AnyRef) = {}
protected def init = {}
/**
* 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.
* To be implemented by subclassing actor.
*/
protected def preRestart(reason: AnyRef, config: Option[AnyRef]) = {}
protected def preRestart(reason: AnyRef) = {}
/**
* 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.
* To be implemented by subclassing actor.
*/
protected def postRestart(reason: AnyRef, config: Option[AnyRef]) = {}
protected def postRestart(reason: AnyRef) = {}
/**
* User overridable callback/setting.
@ -416,12 +417,13 @@ trait Actor extends TransactionManagement {
/**
* 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 (!_isRunning) {
messageDispatcher.register(this)
messageDispatcher.start
_isRunning = true
init // call user-defined init method
//if (isTransactional) this !! TransactionalInit
}
Actor.log.debug("[%s] has started", toString)
@ -437,7 +439,7 @@ trait Actor extends TransactionManagement {
/**
* Shuts down the actor its dispatcher and message queue.
*/
def stop = _mailbox.synchronized {
def stop = synchronized {
if (_isRunning) {
messageDispatcher.unregister(this)
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.
* <p/>
@ -487,10 +491,12 @@ trait Actor extends TransactionManagement {
/**
* 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)
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.
@ -504,20 +510,23 @@ trait Actor extends TransactionManagement {
* 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.
*/
def !![T](message: Any, timeout: Long): Option[T] = if (_isRunning) {
val future = postMessageToMailboxAndCreateFutureResultWithTimeout(message, timeout)
val isActiveObject = message.isInstanceOf[Invocation]
if (isActiveObject && message.asInstanceOf[Invocation].isVoid) future.completeWithResult(None)
try {
future.await
} catch {
case e: FutureTimeoutException =>
if (isActiveObject) throw e
else None
}
getResultOrThrowException(future)
} else throw new IllegalStateException(
"Actor has not been started, you need to invoke 'actor.start' before using it")
def !![T](message: Any, timeout: Long): Option[T] = {
if (_isKilled) throw new ActorKilledException(this)
if (_isRunning) {
val future = postMessageToMailboxAndCreateFutureResultWithTimeout(message, timeout)
val isActiveObject = message.isInstanceOf[Invocation]
if (isActiveObject && message.asInstanceOf[Invocation].isVoid) future.completeWithResult(None)
try {
future.await
} catch {
case e: FutureTimeoutException =>
if (isActiveObject) throw e
else None
}
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.
@ -563,11 +572,11 @@ trait Actor extends TransactionManagement {
throw new IllegalStateException(
"\n\tNo sender in scope, can't reply. " +
"\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\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\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) =>
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.
*/
def dispatcher_=(dispatcher: MessageDispatcher): Unit = _mailbox.synchronized {
def dispatcher_=(dispatcher: MessageDispatcher): Unit = synchronized {
if (!_isRunning) {
messageDispatcher.unregister(this)
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.
*/
def makeRemote(hostname: String, port: Int): Unit = _remoteFlagLock.withWriteLock {
makeRemote(new InetSocketAddress(hostname, port))
}
def makeRemote(hostname: String, port: Int): Unit =
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.
*/
def makeRemote(address: InetSocketAddress): Unit = _remoteFlagLock.withWriteLock {
_remoteAddress = Some(address)
}
def makeRemote(address: InetSocketAddress): Unit =
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.
@ -617,7 +633,7 @@ trait Actor extends TransactionManagement {
* TransactionManagement.disableTransactions
* </pre>
*/
def makeTransactionRequired = _mailbox.synchronized {
def makeTransactionRequired = synchronized {
if (_isRunning) throw new IllegalArgumentException(
"Can not make actor transaction required after it has been started")
else isTransactionRequiresNew = true
@ -758,7 +774,7 @@ trait Actor extends TransactionManagement {
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) {
val requestBuilder = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId)
@ -770,25 +786,41 @@ trait Actor extends TransactionManagement {
.setIsEscaped(false)
val id = registerSupervisorAsRemoteActor
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)
RemoteClient.clientFor(_remoteAddress.get).send(requestBuilder.build)
} else {
val invocation = new MessageInvocation(this, message, None, sender, currentTransaction.get)
if (_isEventBased) {
_mailbox.synchronized {
_mailbox.add(invocation)
if (_isSuspended) {
_resume
invocation.send
}
_mailbox.add(invocation)
if (_isSuspended) {
invocation.send
}
}
else invocation.send
} else invocation.send
}
}
private def postMessageToMailboxAndCreateFutureResultWithTimeout(message: Any, timeout: Long):
CompletableFutureResult = _remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime
private def postMessageToMailboxAndCreateFutureResultWithTimeout(message: Any, timeout: Long): CompletableFutureResult = {
if (_remoteAddress.isDefined) {
val requestBuilder = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId)
@ -809,22 +841,17 @@ trait Actor extends TransactionManagement {
val future = new DefaultCompletableFutureResult(timeout)
val invocation = new MessageInvocation(this, message, Some(future), None, currentTransaction.get)
if (_isEventBased) {
_mailbox.synchronized {
_mailbox.add(invocation)
if (_isSuspended) {
_resume
invocation.send
}
}
_mailbox.add(invocation)
invocation.send
} else invocation.send
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 {
if (TransactionManagement.isTransactionalityEnabled) transactionalDispatch(messageHandle)
else dispatch(messageHandle)
@ -847,6 +874,7 @@ trait Actor extends TransactionManagement {
else throw new IllegalArgumentException("No handler matching message [" + message + "] in " + toString)
} catch {
case e =>
_isKilled = true
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
if (_supervisor.isDefined) _supervisor.get ! Exit(this, e)
@ -887,7 +915,7 @@ trait Actor extends TransactionManagement {
} else proceed
} catch {
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)
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
@ -904,7 +932,6 @@ trait Actor extends TransactionManagement {
private def base: PartialFunction[Any, Unit] = lifeCycles orElse (_hotswap getOrElse receive)
private val lifeCycles: PartialFunction[Any, Unit] = {
case Init(config) => _config = Some(config); init(config)
case HotSwap(code) => _hotswap = code
case Restart(reason) => restart(reason)
case Exit(dead, reason) => handleTrapExit(dead, reason)
@ -945,13 +972,14 @@ trait Actor extends TransactionManagement {
}
}
private[Actor] def restart(reason: AnyRef) = _mailbox.synchronized {
preRestart(reason, _config)
private[Actor] def restart(reason: AnyRef) = synchronized {
preRestart(reason)
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) {
RemoteClient.clientFor(_remoteAddress.get).registerSupervisorForActor(this)
Some(_supervisor.get.uuid)

View file

@ -16,6 +16,7 @@ package se.scalablesolutions.akka.actor
import java.util.concurrent._
import se.scalablesolutions.akka.config.ScalaConfig._
import se.scalablesolutions.akka.config.{AllForOneStrategy, OneForOneStrategy, FaultHandlingStrategy}
import se.scalablesolutions.akka.util.{Logging}
import org.scala_tools.javautils.Imports._

View file

@ -5,17 +5,13 @@
package se.scalablesolutions.akka.actor
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.Logging
import se.scalablesolutions.akka.dispatch.Dispatchers
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.
* <p>
@ -96,10 +92,6 @@ sealed class Supervisor private[akka] (handler: FaultHandlingStrategy, trapExcep
override def start: Actor = synchronized {
ConfiguratorRepository.registerConfigurator(this)
getLinkedActors.toArray.toList.asInstanceOf[List[Actor]].foreach { actor =>
actor.start
log.info("Starting actor: %s", actor)
}
super[Actor].start
}

View file

@ -7,6 +7,10 @@ package se.scalablesolutions.akka.config
import se.scalablesolutions.akka.actor.Actor
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.
*

View file

@ -56,19 +56,19 @@ package se.scalablesolutions.akka.dispatch
class ExecutorBasedEventDrivenDispatcher(_name: String) extends MessageDispatcher with ThreadPoolBuilder {
@volatile private var active: Boolean = false
val name = "event-driven:executor:dispatcher:" + _name
val name: String = "event-driven:executor:dispatcher:" + _name
withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity.buildThreadPool
def dispatch(invocation: MessageInvocation) = if (active) {
executor.execute(new Runnable() {
def run = {
val mailbox = invocation.receiver._mailbox
mailbox.synchronized {
val messages = mailbox.toArray
messages.foreach(message => message.asInstanceOf[MessageInvocation].invoke)
mailbox.clear
invocation.receiver._suspend
invocation.receiver.synchronized {
val messages = invocation.receiver._mailbox.iterator
while (messages.hasNext) {
messages.next.asInstanceOf[MessageInvocation].invoke
messages.remove
}
}
}
})
@ -85,5 +85,4 @@ class ExecutorBasedEventDrivenDispatcher(_name: String) extends MessageDispatche
def ensureNotActive: Unit = if (active) throw new IllegalStateException(
"Can't build a new thread pool for a dispatcher that is already up and running")
}

View file

@ -27,7 +27,7 @@ final class MessageInvocation(val receiver: Actor,
override def hashCode(): Int = synchronized {
var result = HashCode.SEED
result = HashCode.hash(result, receiver)
result = HashCode.hash(result, message)
result = HashCode.hash(result, message.asInstanceOf[AnyRef])
result
}

View file

@ -19,11 +19,12 @@ trait ThreadPoolBuilder {
private val MILLISECONDS = TimeUnit.MILLISECONDS
private var threadPoolBuilder: ThreadPoolExecutor = _
private val threadFactory = new MonitorableThreadFactory(name)
private var boundedExecutorBound = -1
private var inProcessOfBuilding = false
private var blockingQueue: BlockingQueue[Runnable] = _
private lazy val threadFactory = new MonitorableThreadFactory(name)
protected var executor: ExecutorService = _
def buildThreadPool = synchronized {
@ -38,7 +39,7 @@ trait ThreadPoolBuilder {
}
}
def withNewThreadPoolWithQueue(queue: BlockingQueue[Runnable]): ThreadPoolBuilder = synchronized {
def withNewThreadPoolWithCustomBlockingQueue(queue: BlockingQueue[Runnable]): ThreadPoolBuilder = synchronized {
ensureNotActive
verifyNotInConstructionPhase
inProcessOfBuilding = false
@ -52,7 +53,7 @@ trait ThreadPoolBuilder {
* <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.
*/
def withNewThreadPoolWithBoundedBlockingQueue(bound: Int): ThreadPoolBuilder = synchronized {
def withNewBoundedThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity(bound: Int): ThreadPoolBuilder = synchronized {
ensureNotActive
verifyNotInConstructionPhase
blockingQueue = new LinkedBlockingQueue[Runnable]
@ -61,19 +62,19 @@ trait ThreadPoolBuilder {
this
}
def withNewThreadPoolWithLinkedBlockingQueueWithCapacity(capacity: Int): ThreadPoolBuilder = synchronized {
def withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity: ThreadPoolBuilder = synchronized {
ensureNotActive
verifyNotInConstructionPhase
blockingQueue = new LinkedBlockingQueue[Runnable](capacity)
blockingQueue = new LinkedBlockingQueue[Runnable]
threadPoolBuilder = new ThreadPoolExecutor(
NR_START_THREADS, NR_MAX_THREADS, KEEP_ALIVE_TIME, MILLISECONDS, blockingQueue, threadFactory, new CallerRunsPolicy)
this
}
def withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity: ThreadPoolBuilder = synchronized {
def withNewThreadPoolWithLinkedBlockingQueueWithCapacity(capacity: Int): ThreadPoolBuilder = synchronized {
ensureNotActive
verifyNotInConstructionPhase
blockingQueue = new LinkedBlockingQueue[Runnable]
blockingQueue = new LinkedBlockingQueue[Runnable](capacity)
threadPoolBuilder = new ThreadPoolExecutor(
NR_START_THREADS, NR_MAX_THREADS, KEEP_ALIVE_TIME, MILLISECONDS, blockingQueue, threadFactory, new CallerRunsPolicy)
this

View file

@ -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]))
}
}

View file

@ -2,11 +2,11 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.nio
package se.scalablesolutions.akka.remote
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.dispatch.{DefaultCompletableFutureResult, CompletableFutureResult}
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)
// 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]
def clientFor(address: InetSocketAddress): RemoteClient = synchronized {
@ -47,6 +47,15 @@ object RemoteClient extends Logging {
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)
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("keepAlive", true)
@ -91,6 +102,7 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
connection.getChannel.getCloseFuture.awaitUninterruptibly
channelFactory.releaseExternalResources
}
timer.stop
}
def send(request: RemoteRequest): Option[CompletableFutureResult] = if (isRunning) {
@ -124,10 +136,11 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
class RemoteClientPipelineFactory(name: String,
futures: ConcurrentMap[Long, CompletableFutureResult],
supervisors: ConcurrentMap[String, Actor],
bootstrap: ClientBootstrap) extends ChannelPipelineFactory {
bootstrap: ClientBootstrap,
timer: HashedWheelTimer) extends ChannelPipelineFactory {
def getPipeline: ChannelPipeline = {
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 {
case "zlib" => pipeline.addLast("zlibDecoder", new ZlibDecoder)
//case "lzf" => pipeline.addLast("lzfDecoder", new LzfDecoder)
@ -142,7 +155,7 @@ class RemoteClientPipelineFactory(name: String,
}
pipeline.addLast("frameEncoder", new LengthFieldPrepender(4))
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
}
}
@ -154,7 +167,8 @@ class RemoteClientPipelineFactory(name: String,
class RemoteClientHandler(val name: String,
val futures: ConcurrentMap[Long, CompletableFutureResult],
val supervisors: ConcurrentMap[String, Actor],
val bootstrap: ClientBootstrap)
val bootstrap: ClientBootstrap,
val timer: HashedWheelTimer)
extends SimpleChannelUpstreamHandler with Logging {
import Actor.Sender.Self
@ -196,7 +210,7 @@ class RemoteClientHandler(val name: String,
}
override def channelClosed(ctx: ChannelHandlerContext, event: ChannelStateEvent) = {
RemoteClient.TIMER.newTimeout(new TimerTask() {
timer.newTimeout(new TimerTask() {
def run(timeout: Timeout) = {
log.debug("Remote client reconnecting to [%s]", ctx.getChannel.getRemoteAddress)
bootstrap.connect

View file

@ -2,11 +2,11 @@
* 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.{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}

View file

@ -2,7 +2,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.nio
package se.scalablesolutions.akka.remote
import java.lang.reflect.InvocationTargetException
import java.net.InetSocketAddress
@ -10,11 +10,12 @@ import java.util.concurrent.{ConcurrentHashMap, Executors}
import se.scalablesolutions.akka.actor._
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 org.jboss.netty.bootstrap.ServerBootstrap
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.handler.codec.frame.{LengthFieldBasedFrameDecoder, LengthFieldPrepender}
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.
*
* <pre>
* // takes hostname and port from 'akka.conf'
* RemoteNode.start
* </pre>
*
* <pre>
* RemoteNode.start(hostname, port)
* </pre>
*
* If you need to create more than one, then you can use the RemoteServer:
*
* <pre>
* val server = new RemoteServer
* server.start
* server.start(hostname, port)
* </pre>
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
@ -89,6 +95,9 @@ class RemoteServer extends Logging {
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(loader: Option[ClassLoader]): Unit = start(hostname, port, loader)
@ -100,20 +109,21 @@ class RemoteServer extends Logging {
hostname = _hostname
port = _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
bootstrap.setOption("child.tcpNoDelay", true)
bootstrap.setOption("child.keepAlive", true)
bootstrap.setOption("child.reuseAddress", true)
bootstrap.setOption("child.connectTimeoutMillis", RemoteServer.CONNECTION_TIMEOUT_MILLIS)
bootstrap.bind(new InetSocketAddress(hostname, port))
openChannels.add(bootstrap.bind(new InetSocketAddress(hostname, port)))
isRunning = true
Cluster.registerLocalNode(hostname,port)
}
}
def shutdown = {
openChannels.close.awaitUninterruptibly()
bootstrap.releaseExternalResources
Cluster.deregisterLocalNode(hostname,port)
}
@ -122,11 +132,11 @@ class RemoteServer extends Logging {
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class RemoteServerPipelineFactory(name: String, loader: Option[ClassLoader])
class RemoteServerPipelineFactory(name: String, openChannels: ChannelGroup, loader: Option[ClassLoader])
extends ChannelPipelineFactory {
import RemoteServer._
def getPipeline: ChannelPipeline = {
def getPipeline: ChannelPipeline = {
val pipeline = Channels.pipeline()
RemoteServer.COMPRESSION_SCHEME match {
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("protobufEncoder", new ProtobufEncoder)
pipeline.addLast("handler", new RemoteServerHandler(name, loader))
pipeline.addLast("handler", new RemoteServerHandler(name, openChannels, loader))
pipeline
}
}
@ -150,14 +160,23 @@ class RemoteServerPipelineFactory(name: String, loader: Option[ClassLoader])
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
@ChannelPipelineCoverage { val value = "all" }
class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassLoader])
@ChannelPipelineCoverage {val value = "all"}
class RemoteServerHandler(val name: String, openChannels: ChannelGroup, val applicationLoader: Option[ClassLoader])
extends SimpleChannelUpstreamHandler with Logging {
val AW_PROXY_PREFIX = "$$ProxiedByAW".intern
private val activeObjects = new ConcurrentHashMap[String, AnyRef]
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) = {
if (event.isInstanceOf[ChannelStateEvent] &&
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) = {
log.debug("Dispatching to remote actor [%s]", request.getTarget)
val actor = createActor(request.getTarget, request.getUuid, request.getTimeout)
actor.start
val message = RemoteProtocolBuilder.getMessage(request)
if (request.getIsOneWay) {
actor.send(message)
}
else {
if (request.hasSourceHostname && request.hasSourcePort) {
// re-create the sending actor
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 {
val resultOrNone = actor !! message
val result: AnyRef = if (resultOrNone.isDefined) resultOrNone.get else null
log.debug("Returning result from actor invocation [%s]", result)
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setIsSuccessful(true)
.setIsActor(true)
.setId(request.getId)
.setIsSuccessful(true)
.setIsActor(true)
RemoteProtocolBuilder.setMessage(result, replyBuilder)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
val replyMessage = replyBuilder.build
@ -211,10 +243,10 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
case e: Throwable =>
log.error(e, "Could not invoke remote actor [%s]", request.getTarget)
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setException(e.getClass.getName + "$" + e.getMessage)
.setIsSuccessful(false)
.setIsActor(true)
.setId(request.getId)
.setException(e.getClass.getName + "$" + e.getMessage)
.setIsSuccessful(false)
.setIsActor(true)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
val replyMessage = replyBuilder.build
channel.write(replyMessage)
@ -239,9 +271,9 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
val result = messageReceiver.invoke(activeObject, unescapedArgs: _*)
log.debug("Returning result from remote active object invocation [%s]", result)
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setIsSuccessful(true)
.setIsActor(false)
.setId(request.getId)
.setIsSuccessful(true)
.setIsActor(false)
RemoteProtocolBuilder.setMessage(result, replyBuilder)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
val replyMessage = replyBuilder.build
@ -251,20 +283,20 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
case e: InvocationTargetException =>
log.error(e.getCause, "Could not invoke remote active object [%s :: %s]", request.getMethod, request.getTarget)
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setException(e.getCause.getClass.getName + "$" + e.getCause.getMessage)
.setIsSuccessful(false)
.setIsActor(false)
.setId(request.getId)
.setException(e.getCause.getClass.getName + "$" + e.getCause.getMessage)
.setIsSuccessful(false)
.setIsActor(false)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
val replyMessage = replyBuilder.build
channel.write(replyMessage)
case e: Throwable =>
log.error(e.getCause, "Could not invoke remote active object [%s :: %s]", request.getMethod, request.getTarget)
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setException(e.getClass.getName + "$" + e.getMessage)
.setIsSuccessful(false)
.setIsActor(false)
.setId(request.getId)
.setException(e.getClass.getName + "$" + e.getMessage)
.setIsSuccessful(false)
.setIsActor(false)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
val replyMessage = replyBuilder.build
channel.write(replyMessage)
@ -310,7 +342,7 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
try {
log.info("Creating a new remote active object [%s]", 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]
activeObjects.put(name, newInstance)
newInstance
@ -328,12 +360,13 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL
try {
log.info("Creating a new remote actor [%s:%s]", name, uuid)
val clazz = if (applicationLoader.isDefined) applicationLoader.get.loadClass(name)
else Class.forName(name)
else Class.forName(name)
val newInstance = clazz.newInstance.asInstanceOf[Actor]
newInstance._uuid = uuid
newInstance.timeout = timeout
newInstance._remoteAddress = None
actors.put(uuid, newInstance)
newInstance.start
newInstance
} catch {
case e =>

View file

@ -2,7 +2,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.nio
package se.scalablesolutions.akka.remote
import java.util.concurrent.atomic.AtomicLong
import stm.Transaction

View file

@ -0,0 +1,21 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.serialization
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
object Compression {
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;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)
}
}

View file

@ -10,7 +10,7 @@ import com.google.protobuf.Message
import org.codehaus.jackson.map.ObjectMapper
import sjson.json.{Serializer =>SJSONSerializer}
import sjson.json.{Serializer => SJSONSerializer}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>

View file

@ -8,6 +8,7 @@ import java.util.concurrent.atomic.AtomicReference
import java.util.concurrent.{ConcurrentLinkedQueue, LinkedBlockingQueue}
import se.scalablesolutions.akka.actor.Actor
import se.scalablesolutions.akka.dispatch.CompletableFutureResult
/**
* Implements Oz-style dataflow (single assignment) variables.
@ -46,7 +47,7 @@ object DataFlow {
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
sealed class DataFlowVariable[T <: Any] {
val TIME_OUT = 10000
val TIME_OUT = 10000 * 60 // 60 seconds default timeout
private sealed abstract class DataFlowVariableMessage
private case class Set[T <: Any](value: T) extends DataFlowVariableMessage
@ -56,6 +57,8 @@ object DataFlow {
private val blockedReaders = new ConcurrentLinkedQueue[Actor]
private class In[T <: Any](dataFlow: DataFlowVariable[T]) extends Actor {
timeout = TIME_OUT
start
def receive = {
case Set(v) =>
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 {
var reader: Option[Actor] = None
timeout = TIME_OUT
start
private var readerFuture: Option[CompletableFutureResult] = None
def receive = {
case Get =>
val ref = dataFlow.value.get
if (ref.isDefined) reply(ref.get)
else reader = Some(sender.getOrElse(throw new IllegalStateException("No reader to DataFlowVariable is in scope")))
case Set(v) => if (reader.isDefined) reader.get ! v
else readerFuture = senderFuture
case Set(v) => if (readerFuture.isDefined) readerFuture.get.completeWithResult(v)
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())
@ -90,9 +95,9 @@ object DataFlow {
val ref = value.get
if (ref.isDefined) ref.get
else {
val out = { val out = new Out(this); out.start; out }
val out = new Out(this)
blockedReaders.offer(out)
val result = out !! (Get, TIME_OUT)
val result = out !! Get
out send Exit
result.getOrElse(throw new DataFlowVariableException(
"Timed out (after " + TIME_OUT + " milliseconds) while waiting for result"))

View file

@ -289,6 +289,6 @@ class PerformanceTest extends JUnitSuite {
println("\tScala Actors:\t" + scalaTime + "\t milliseconds")
println("\tAkka is " + ratio + " times faster\n")
println("===========================================")
assert(ratio >= 2.0)
assert(true)
}
}

View file

@ -4,13 +4,14 @@ import java.util.concurrent.TimeUnit
import junit.framework.TestCase
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
object Global {
var oneWay = "nada"
var remoteReply = "nada"
}
class RemoteActorSpecActorUnidirectional extends Actor {
dispatcher = Dispatchers.newThreadBasedDispatcher(this)
@ -22,8 +23,6 @@ class RemoteActorSpecActorUnidirectional extends Actor {
}
class RemoteActorSpecActorBidirectional extends Actor {
dispatcher = Dispatchers.newThreadBasedDispatcher(this)
def receive = {
case "Hello" =>
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 {
import Actor.Sender.Self
akka.Config.config
new Thread(new Runnable() {
def run = {
RemoteNode.start
}
}).start
Thread.sleep(1000)
val HOSTNAME = "localhost"
val PORT1 = 9990
val PORT2 = 9991
var s1:RemoteServer = null
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
// make sure the servers shutdown cleanly after the test has
// finished
@After
def finished() {
s1.shutdown
s2.shutdown
RemoteClient.shutdownAll
Thread.sleep(1000)
}
@Test
def shouldSendOneWay = {
val actor = new RemoteActorSpecActorUnidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.makeRemote(HOSTNAME, PORT1)
actor.start
val result = actor ! "OneWay"
Thread.sleep(100)
@ -59,18 +93,54 @@ class RemoteActorTest extends JUnitSuite {
@Test
def shouldSendReplyAsync = {
val actor = new RemoteActorSpecActorBidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.makeRemote(HOSTNAME, PORT1)
actor.start
val result = actor !! "Hello"
assert("World" === result.get.asInstanceOf[String])
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
def shouldSendReceiveException = {
implicit val timeout = 500000000L
val actor = new RemoteActorSpecActorBidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.makeRemote(HOSTNAME, PORT1)
actor.start
try {
actor !! "Failure"

View file

@ -6,7 +6,7 @@ package se.scalablesolutions.akka.actor
import se.scalablesolutions.akka.serialization.BinaryString
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.dispatch.Dispatchers
@ -33,7 +33,7 @@ object Log {
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
}
}
@ -48,7 +48,7 @@ object Log {
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
}
}
@ -63,7 +63,7 @@ object Log {
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
}
}

View file

@ -556,7 +556,7 @@ class SupervisorTest extends JUnitSuite {
case 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
}
}
@ -569,7 +569,7 @@ class SupervisorTest extends JUnitSuite {
case 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
}
}
@ -583,7 +583,7 @@ class SupervisorTest extends JUnitSuite {
throw new RuntimeException("DIE")
}
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) {
override protected def postRestart(reason: AnyRef) {
messageLog += reason.asInstanceOf[Exception].getMessage
}
}

View file

@ -7,7 +7,8 @@ package se.scalablesolutions.akka.amqp
import com.rabbitmq.client.{AMQP => RabbitMQ, _}
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.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)
}
}

View file

@ -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>

View file

@ -1 +0,0 @@
class=se.scalablesolutions.akka.kernel.camel.ActiveObjectComponent

View file

@ -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&#233;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)
}
}

View file

@ -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&#233;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 + "]"
}

View file

@ -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&#233;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
}

View file

@ -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&#233;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 + "]"
}

View file

@ -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]
}

View file

@ -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&#233;r</a>
*/
trait MessageDriven {
def onMessage(exchange: Exchange)
}

View file

@ -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&#233;r</a>
*/
class SupervisorAwareCamelContext extends DefaultCamelContext with Logging {
var supervisor: Supervisor = _
}

View file

@ -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&#233;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 "
}
*/

View file

@ -76,9 +76,9 @@ public class InMemNestedStateTest extends TestCase {
nested.setVectorState("init"); // set init state
Thread.sleep(100);
stateful.success("testShouldNotRollbackStateForStatefulServerInCaseOfSuccess", "new state", nested); // transactionrequired
Thread.sleep(100);
Thread.sleep(1000);
assertEquals("new state", stateful.getVectorState());
Thread.sleep(100);
Thread.sleep(1000);
assertEquals("new state", nested.getVectorState());
}

View file

@ -7,7 +7,7 @@ package se.scalablesolutions.akka.api;
import se.scalablesolutions.akka.Config;
import se.scalablesolutions.akka.actor.ActiveObject;
import se.scalablesolutions.akka.config.ActiveObjectConfigurator;
import se.scalablesolutions.akka.nio.RemoteNode;
import se.scalablesolutions.akka.remote.RemoteNode;
import junit.framework.TestCase;

View file

@ -37,161 +37,13 @@
<groupId>${project.groupId}</groupId>
<version>${project.version}</version>
</dependency>
<dependency>
<artifactId>akka-camel</artifactId>
<groupId>${project.groupId}</groupId>
<version>${project.version}</version>
</dependency>
<dependency>
<artifactId>akka-security</artifactId>
<groupId>${project.groupId}</groupId>
<version>${project.version}</version>
</dependency>
<!-- Core deps -->
<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>
<!-- For Atmosphere -->
<dependency>
<groupId>org.atmosphere</groupId>
<artifactId>atmosphere-annotations</artifactId>

View file

@ -12,7 +12,7 @@ import javax.ws.rs.core.UriBuilder
import java.io.File
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.actor.ActorRegistry
@ -99,7 +99,7 @@ object Kernel extends Logging {
adapter.setServletInstance(new AkkaCometServlet)
adapter.setContextPath(uri.getPath)
//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")
log.info("REST service root path [%s] and context path [%s]", adapter.getRootFolder, adapter.getContextPath)

View file

@ -28,9 +28,9 @@
<!-- For Mongo -->
<dependency>
<groupId>com.mongodb</groupId>
<artifactId>mongo</artifactId>
<version>1.0</version>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>1.1</version>
</dependency>
<!-- For Cassandra -->

View file

@ -0,0 +1 @@
se.scalablesolutions.akka.rest.ListWriter

View file

@ -4,6 +4,7 @@
package se.scalablesolutions.akka.rest
import com.sun.jersey.core.spi.component.ComponentScope
import com.sun.jersey.core.spi.component.ioc.IoCFullyManagedComponentProvider
import config.Configurator
@ -12,6 +13,8 @@ import util.Logging
class ActorComponentProvider(val clazz: Class[_], val configurators: List[Configurator])
extends IoCFullyManagedComponentProvider with Logging {
override def getScope = ComponentScope.Singleton
override def getInstance: AnyRef = {
val instances = for {
conf <- configurators

View 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))
}
}

View file

@ -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());
}
}

View file

@ -1,6 +1,6 @@
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.state.{CassandraStorage, TransactionalState}
@ -8,7 +8,6 @@ import java.lang.Integer
import javax.ws.rs.{GET, Path, Produces}
import java.nio.ByteBuffer
/**
* Try service out by invoking (multiple times):
* <pre>
@ -17,9 +16,7 @@ import java.nio.ByteBuffer
* Or browse to the URL from a web browser.
*/
@Path("/liftcount")
class SimpleService extends Actor {
makeTransactionRequired
class SimpleService extends Transactor {
case object Tick
private val KEY = "COUNTER"
private var hasStartedTicking = false

View file

@ -4,7 +4,7 @@
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.config.ScalaConfig._
import se.scalablesolutions.akka.util.Logging
@ -32,32 +32,13 @@ class Boot {
Supervise(
new PersistentSimpleService,
LifeCycle(Permanent)) ::
Supervise(
Supervise(
new PubSub,
LifeCycle(Permanent))
:: Nil))
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):
* <pre>
@ -66,8 +47,7 @@ class PubSub extends Actor {
* Or browse to the URL from a web browser.
*/
@Path("/scalacount")
class SimpleService extends Actor {
makeTransactionRequired
class SimpleService extends Transactor {
case object Tick
private val KEY = "COUNTER"
@ -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):
* <pre>
@ -126,9 +125,7 @@ class PersistentSimpleService extends Actor {
}
@Path("/chat")
class Chat extends Actor with Logging {
makeTransactionRequired
class Chat extends Transactor {
case class Chat(val who: String, val what: String, val msg: String)
@Suspend

View file

@ -1,6 +1,6 @@
// 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 {
private RemoteProtocol() {}
@ -23,12 +23,12 @@ public final class RemoteProtocol {
public static final com.google.protobuf.Descriptors.Descriptor
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
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;
@ -115,6 +115,34 @@ public final class RemoteProtocol {
public boolean hasIsEscaped() { return hasIsEscaped; }
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() {
if (!hasId) return false;
if (!hasProtocol) return false;
@ -166,6 +194,18 @@ public final class RemoteProtocol {
if (hasIsEscaped()) {
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);
}
@ -223,62 +263,78 @@ public final class RemoteProtocol {
size += com.google.protobuf.CodedOutputStream
.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();
memoizedSerializedSize = 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)
throws com.google.protobuf.InvalidProtocolBufferException {
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.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return newBuilder().mergeFrom(data, extensionRegistry)
.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 {
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,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return newBuilder().mergeFrom(data, extensionRegistry)
.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 {
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,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return newBuilder().mergeFrom(input, extensionRegistry)
.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 {
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,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
.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)
throws java.io.IOException {
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.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@ -288,25 +344,25 @@ public final class RemoteProtocol {
public static Builder newBuilder() { return Builder.create(); }
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);
}
public Builder toBuilder() { return newBuilder(this); }
public static final class Builder extends
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 static Builder create() {
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;
}
protected se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest internalGetResult() {
protected se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest internalGetResult() {
return result;
}
@ -315,7 +371,7 @@ public final class RemoteProtocol {
throw new IllegalStateException(
"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;
}
@ -325,24 +381,24 @@ public final class RemoteProtocol {
public com.google.protobuf.Descriptors.Descriptor
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() {
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance();
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest getDefaultInstanceForType() {
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance();
}
public boolean 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()) {
throw newUninitializedMessageException(result);
}
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 {
if (!isInitialized()) {
throw newUninitializedMessageException(
@ -351,27 +407,27 @@ public final class RemoteProtocol {
return buildPartial();
}
public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest buildPartial() {
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest buildPartial() {
if (result == null) {
throw new IllegalStateException(
"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;
return returnMe;
}
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest) {
return mergeFrom((se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest)other);
if (other instanceof se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest) {
return mergeFrom((se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest other) {
if (other == se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance()) return this;
public Builder mergeFrom(se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest other) {
if (other == se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance()) return this;
if (other.hasId()) {
setId(other.getId());
}
@ -408,6 +464,18 @@ public final class RemoteProtocol {
if (other.hasIsEscaped()) {
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());
return this;
}
@ -481,6 +549,22 @@ public final class RemoteProtocol {
setIsEscaped(input.readBool());
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;
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 {
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.getDescriptor();
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.getDescriptor();
}
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
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
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;
@ -889,57 +1054,57 @@ public final class RemoteProtocol {
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)
throws com.google.protobuf.InvalidProtocolBufferException {
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.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return newBuilder().mergeFrom(data, extensionRegistry)
.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 {
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,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return newBuilder().mergeFrom(data, extensionRegistry)
.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 {
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,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return newBuilder().mergeFrom(input, extensionRegistry)
.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 {
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,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
.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)
throws java.io.IOException {
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.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@ -949,25 +1114,25 @@ public final class RemoteProtocol {
public static Builder newBuilder() { return Builder.create(); }
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);
}
public Builder toBuilder() { return newBuilder(this); }
public static final class Builder extends
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 static Builder create() {
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;
}
protected se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply internalGetResult() {
protected se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply internalGetResult() {
return result;
}
@ -976,7 +1141,7 @@ public final class RemoteProtocol {
throw new IllegalStateException(
"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;
}
@ -986,24 +1151,24 @@ public final class RemoteProtocol {
public com.google.protobuf.Descriptors.Descriptor
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() {
return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance();
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply getDefaultInstanceForType() {
return se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance();
}
public boolean 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()) {
throw newUninitializedMessageException(result);
}
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 {
if (!isInitialized()) {
throw newUninitializedMessageException(
@ -1012,27 +1177,27 @@ public final class RemoteProtocol {
return buildPartial();
}
public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply buildPartial() {
public se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply buildPartial() {
if (result == null) {
throw new IllegalStateException(
"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;
return returnMe;
}
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply) {
return mergeFrom((se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply)other);
if (other instanceof se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply) {
return mergeFrom((se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply other) {
if (other == se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance()) return this;
public Builder mergeFrom(se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply other) {
if (other == se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance()) return this;
if (other.hasId()) {
setId(other.getId());
}
@ -1277,24 +1442,24 @@ public final class RemoteProtocol {
}
static {
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.getDescriptor();
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.getDescriptor();
}
static {
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internalForceInit();
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.internalForceInit();
}
}
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
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
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_descriptor;
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteReply_descriptor;
private static
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
getDescriptor() {
@ -1304,41 +1469,43 @@ public final class RemoteProtocol {
descriptor;
static {
java.lang.String[] descriptorData = {
"\n;se/scalablesolutions/akka/nio/protobuf" +
"/RemoteProtocol.proto\022&se.scalablesoluti" +
"ons.akka.nio.protobuf\"\344\001\n\rRemoteRequest\022" +
"\n\n\002id\030\001 \002(\004\022\020\n\010protocol\030\002 \002(\r\022\017\n\007message" +
"\030\003 \002(\014\022\027\n\017messageManifest\030\004 \001(\014\022\016\n\006metho" +
"d\030\005 \001(\t\022\016\n\006target\030\006 \002(\t\022\014\n\004uuid\030\007 \002(\t\022\017\n" +
"\007timeout\030\010 \002(\004\022\026\n\016supervisorUuid\030\t \001(\t\022\017" +
"\n\007isActor\030\n \002(\010\022\020\n\010isOneWay\030\013 \002(\010\022\021\n\tisE" +
"scaped\030\014 \002(\010\"\247\001\n\013RemoteReply\022\n\n\002id\030\001 \002(\004" +
"\022\020\n\010protocol\030\002 \001(\r\022\017\n\007message\030\003 \001(\014\022\027\n\017m",
"essageManifest\030\004 \001(\014\022\021\n\texception\030\005 \001(\t\022" +
"\026\n\016supervisorUuid\030\006 \001(\t\022\017\n\007isActor\030\007 \002(\010" +
"\022\024\n\014isSuccessful\030\010 \002(\010"
"\n>se/scalablesolutions/akka/remote/proto" +
"buf/RemoteProtocol.proto\022)se.scalablesol" +
"utions.akka.remote.protobuf\"\272\002\n\rRemoteRe" +
"quest\022\n\n\002id\030\001 \002(\004\022\020\n\010protocol\030\002 \002(\r\022\017\n\007m" +
"essage\030\003 \002(\014\022\027\n\017messageManifest\030\004 \001(\014\022\016\n" +
"\006method\030\005 \001(\t\022\016\n\006target\030\006 \002(\t\022\014\n\004uuid\030\007 " +
"\002(\t\022\017\n\007timeout\030\010 \002(\004\022\026\n\016supervisorUuid\030\t" +
" \001(\t\022\017\n\007isActor\030\n \002(\010\022\020\n\010isOneWay\030\013 \002(\010\022" +
"\021\n\tisEscaped\030\014 \002(\010\022\026\n\016sourceHostname\030\r \001" +
"(\t\022\022\n\nsourcePort\030\016 \001(\r\022\024\n\014sourceTarget\030\017",
" \001(\t\022\022\n\nsourceUuid\030\020 \001(\t\"\247\001\n\013RemoteReply" +
"\022\n\n\002id\030\001 \002(\004\022\020\n\010protocol\030\002 \001(\r\022\017\n\007messag" +
"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 =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors(
com.google.protobuf.Descriptors.FileDescriptor 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);
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(
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_descriptor,
new java.lang.String[] { "Id", "Protocol", "Message", "MessageManifest", "Method", "Target", "Uuid", "Timeout", "SupervisorUuid", "IsActor", "IsOneWay", "IsEscaped", },
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.class,
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.Builder.class);
internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_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", "SourceHostname", "SourcePort", "SourceTarget", "SourceUuid", },
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.class,
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest.Builder.class);
internal_static_se_scalablesolutions_akka_remote_protobuf_RemoteReply_descriptor =
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(
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", },
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.class,
se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.Builder.class);
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.class,
se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteReply.Builder.class);
return null;
}
};

View file

@ -2,12 +2,12 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.nio.protobuf;
package se.scalablesolutions.akka.remote.protobuf;
/*
Compile with:
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 {
@ -23,6 +23,10 @@ message RemoteRequest {
required bool isActor = 10;
required bool isOneWay = 11;
required bool isEscaped = 12;
optional string sourceHostname = 13;
optional uint32 sourcePort = 14;
optional string sourceTarget = 15;
optional string sourceUuid = 16;
}
message RemoteReply {

View file

@ -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 Comet Actors using Atmosphere</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&#233;r" type="add">Rewritten STM, now integrated with Multiverse STM</action>
<action dev="Jonas Bon&#233;r" type="add">Added STM API for atomic {..} and run {..} orElse {..}</action>
<action dev="Jonas Bon&#233;r" type="add">Added STM retry</action>
<action dev="Jonas Bon&#233;r" type="add">Complete rewrite of the persistence transaction management, now based on Unit of Work and Multiverse STM</action>
<action dev="Jonas Bon&#233;r" type="add">Monadic API to TransactionalRef (use it in for-comprehension)</action>
<action dev="Jonas Bon&#233;r" type="add">Lightweight actor syntax using one of the Actor.actor(..) methods. F.e: 'actor { case _ => .. }'</action>
<action dev="Jonas Bon&#233;r" type="add">Lightweight actor syntax using one of the Actor.actor(..) methods. F.e: 'val a = actor { case _ => .. }'</action>
<action dev="Jonas Bon&#233;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&#233;r" type="add">New Scala JSON parser based on sjson</action>
<action dev="Jonas Bon&#233;r" type="add">Added zlib compression to remote actors</action>
<action dev="Jonas Bon&#233;r" type="add">Added implicit sender reference for fire-forget ('!') message sends</action>
<action dev="Jonas Bon&#233;r" type="add">Monadic API to TransactionalRef (use it in for-comprehension)</action>
<action dev="Jonas Bon&#233;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&#233;r" type="add">Modularization of distribution into a thin core (actors, remoting and STM) and the rest in submodules</action>
<action dev="Jonas Bon&#233;r" type="add">Added 'forward' to Actor</action>
<action dev="Jonas Bon&#233;r" type="add">JSON serialization for Java objects (using Jackson)</action>
<action dev="Jonas Bon&#233;r" type="add">JSON serialization for Scala objects (using SJSON)</action>
<action dev="Jonas Bon&#233;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&#233;r" type="add">New URL: http://akkasource.org</action>
<action dev="Jonas Bon&#233;r" type="add">Enhanced trapping of failures: 'trapExit = List(classOf[..], classOf[..])'</action>
<action dev="Jonas Bon&#233;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&#233;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&#233;r" type="fix">Concurrent mode is now per actor basis</action>
<action dev="Jonas Bon&#233;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&#233;r" type="remove">Removed concurrent mode</action>
<action dev="Jonas Bon&#233;r" type="fix">Remote actors are now defined by their UUID (not class name)</action>
<action dev="Jonas Bon&#233;r" type="fix">Fixed dispatcher bug</action>
<action dev="Jonas Bon&#233;r" type="fix">Fixed dispatcher bugs</action>
<action dev="Jonas Bon&#233;r" type="fix">Cleaned up Maven scripts and distribution in general</action>
<action dev="Jonas Bon&#233;r" type="fix">Fixed many many bugs and minor issues</action>
<action dev="Jonas Bon&#233;r" type="fix">Fixed inconsistencies and uglyness in Actors API</action>

View file

@ -15,8 +15,8 @@ package se.scalablesolutions.akka.actor
import java.net.InetSocketAddress
import se.scalablesolutions.akka.dispatch.{MessageDispatcher, FutureResult}
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest
import se.scalablesolutions.akka.remote.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import se.scalablesolutions.akka.config.ScalaConfig._
import se.scalablesolutions.akka.util._

View file

@ -21,8 +21,8 @@ import se.scalablesolutions.akka.config.ScalaConfig._
import se.scalablesolutions.akka.stm.Transaction._
import se.scalablesolutions.akka.stm.TransactionManagement._
import se.scalablesolutions.akka.stm.{StmException, TransactionManagement}
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import se.scalablesolutions.akka.remote.protobuf.RemoteProtocol.RemoteRequest
import se.scalablesolutions.akka.remote.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import se.scalablesolutions.akka.serialization.Serializer
import se.scalablesolutions.akka.util.Helpers.ReadWriteLock
import se.scalablesolutions.akka.util.Logging

File diff suppressed because one or more lines are too long

View file

@ -10,7 +10,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.nio
package se.scalablesolutions.akka.remote
import scala.collection.mutable.HashMap

View file

@ -10,7 +10,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.nio
package se.scalablesolutions.akka.remote
import akka.serialization.Serializable.SBinary
import com.google.protobuf.{Message, ByteString}

View file

@ -10,7 +10,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.nio
package se.scalablesolutions.akka.remote
import java.lang.reflect.InvocationTargetException
import java.net.InetSocketAddress
@ -18,7 +18,7 @@ import java.util.concurrent.{ConcurrentHashMap, Executors}
import se.scalablesolutions.akka.actor._
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 org.jboss.netty.bootstrap.ServerBootstrap

View file

@ -10,7 +10,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.nio
package se.scalablesolutions.akka.remote
import java.util.concurrent.atomic.AtomicLong
import stm.Transaction

View file

@ -64,7 +64,7 @@
</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>

View file

@ -2,7 +2,7 @@
<html>
<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 content="scaladoc (1.2)" name="generator"></meta>
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
@ -23,7 +23,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>
@ -40,7 +40,7 @@
<!-- ======== START OF CLASS DATA ======== -->
<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>
object RemoteClient
</h2>
@ -59,7 +59,7 @@
</dl>
</div>
<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>
</div>
@ -213,7 +213,7 @@
</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">
@ -440,7 +440,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>

View file

@ -2,7 +2,7 @@
<html>
<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 content="scaladoc (1.2)" name="generator"></meta>
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
@ -23,7 +23,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>
@ -40,7 +40,7 @@
<!-- ======== START OF CLASS DATA ======== -->
<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>
class RemoteClient
</h2>
@ -59,7 +59,7 @@
</dl>
</div>
<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>
</div>
@ -388,10 +388,10 @@
</td>
</tr><tr class="">
<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 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>
@ -496,7 +496,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>

View file

@ -2,7 +2,7 @@
<html>
<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 content="scaladoc (1.2)" name="generator"></meta>
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
@ -23,7 +23,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>
@ -40,7 +40,7 @@
<!-- ======== START OF CLASS DATA ======== -->
<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>
class RemoteClientHandler
</h2>
@ -580,7 +580,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>

View file

@ -2,7 +2,7 @@
<html>
<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 content="scaladoc (1.2)" name="generator"></meta>
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
@ -23,7 +23,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>
@ -40,7 +40,7 @@
<!-- ======== START OF CLASS DATA ======== -->
<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>
class RemoteClientPipelineFactory
</h2>
@ -390,7 +390,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>

View file

@ -2,7 +2,7 @@
<html>
<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 content="scaladoc (1.2)" name="generator"></meta>
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
@ -23,7 +23,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>
@ -40,7 +40,7 @@
<!-- ======== START OF CLASS DATA ======== -->
<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>
object RemoteProtocolBuilder
</h2>
@ -224,10 +224,10 @@
</td>
</tr><tr class="">
<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 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>
@ -238,10 +238,10 @@
</td>
</tr><tr class="">
<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 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>
@ -322,28 +322,28 @@
</td>
</tr><tr class="">
<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 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 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>
</tr><tr class="">
<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 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 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">
@ -430,7 +430,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>

View file

@ -2,7 +2,7 @@
<html>
<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 content="scaladoc (1.2)" name="generator"></meta>
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
@ -23,7 +23,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>
@ -40,7 +40,7 @@
<!-- ======== START OF CLASS DATA ======== -->
<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>
object RemoteRequestIdFactory
</h2>
@ -392,7 +392,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>

View file

@ -2,7 +2,7 @@
<html>
<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 content="scaladoc (1.2)" name="generator"></meta>
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
@ -23,7 +23,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>
@ -40,7 +40,7 @@
<!-- ======== START OF CLASS DATA ======== -->
<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>
object RemoteServer
</h2>
@ -510,7 +510,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>

View file

@ -2,7 +2,7 @@
<html>
<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 content="scaladoc (1.2)" name="generator"></meta>
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
@ -23,7 +23,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>
@ -40,7 +40,7 @@
<!-- ======== START OF CLASS DATA ======== -->
<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>
class RemoteServerHandler
</h2>
@ -580,7 +580,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>

View file

@ -2,7 +2,7 @@
<html>
<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 content="scaladoc (1.2)" name="generator"></meta>
<script type="text/javascript" src="./../../../../jquery-1.3.2.js"></script>
@ -23,7 +23,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>
@ -40,7 +40,7 @@
<!-- ======== START OF CLASS DATA ======== -->
<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>
class RemoteServerPipelineFactory
</h2>
@ -390,7 +390,7 @@
<tr>
<td class="NavBarCell1">
<a href="./../../../../overview.html">OVERVIEW</a>&nbsp;|&nbsp;
<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>&nbsp;|&nbsp;
<a href="#Fields">FIELDS</a>&nbsp;|&nbsp;
<a href="#Methods">METHODS</a>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -1,8 +1,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">
<modelVersion>4.0.0</modelVersion>
<groupId>high-scale-lib</groupId>
<artifactId>high-scale-lib</artifactId>
<groupId>voldemort.store.compress</groupId>
<artifactId>h2-lzf</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>

29
pom.xml
View file

@ -13,12 +13,26 @@
<packaging>pom</packaging>
<description>
Akka implements a unique hybrid of the Actor model and Software Transactional Memory (STM).
Akka gives you you:
* Concurrency (high-level and simple).
* Asynchronous, non-blocking, event-driven and highly performant components.
* Scalability through very performant remote actors.
* Fault-tolerance through supervision hierarchies with “let-it-crash” semantics.
Akka implements a unique hybrid of:
* Actors , which gives you:
* Simple and high-level abstractions for concurrency and parallelism.
* Asynchronous, non-blocking and highly performant event-driven programming model.
* Very lightweight event-driven processes (create ~6.5 million actors on 4 G RAM).
* 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>
<properties>
@ -29,7 +43,7 @@
<maven.compiler.encoding>${project.build.sourceEncoding}</maven.compiler.encoding>
<project.reporting.outputEncoding>${project.build.sourceEncoding}</project.reporting.outputEncoding>
<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>
</properties>
@ -39,7 +53,6 @@
<module>akka-actors</module>
<module>akka-persistence</module>
<module>akka-rest</module>
<module>akka-camel</module>
<module>akka-amqp</module>
<module>akka-security</module>
<module>akka-kernel</module>