From 47abc143a406b316591a566709fe42409c320ccb Mon Sep 17 00:00:00 2001 From: Jonas Boner Date: Wed, 24 Jun 2009 15:12:47 +0200 Subject: [PATCH] completed remote active objects (1:st iteration) - left todo are: TX semantics, supervision and remote references + tests --- akka.ipr | 22 +- akka.iws | 730 +++++++++++++----- fun-test-java/akka-funtest-java.iml | 7 +- .../akka/api/InMemFailer.java | 2 + .../akka/api/InMemStateful.java | 10 +- .../akka/api/InMemoryStateTest.java | 3 +- .../akka/api/NettyClient.java | 7 + .../akka/api/NettyServer.java | 7 + .../scalablesolutions/akka/api/NioTest.java | 31 + kernel/akka-kernel.iml | 2 +- kernel/pom.xml | 2 +- .../src/main/scala/actor/ActiveObject.scala | 126 +-- kernel/src/main/scala/nio/NettyClient.scala | 129 ++++ kernel/src/main/scala/nio/NettyServer.scala | 156 ++++ kernel/src/main/scala/nio/ProxyServer.scala | 97 +++ kernel/src/main/scala/nio/RequestReply.scala | 76 ++ .../EventBasedThreadPoolDispatcher.scala | 20 +- kernel/src/main/scala/reactor/Reactor.scala | 36 +- kernel/src/main/scala/state/State.scala | 34 +- kernel/src/main/scala/stm/ChangeSet.scala | 44 ++ kernel/src/main/scala/stm/Transaction.scala | 1 - lib/aspectwerkz-nodeps-jdk5-2.1.jar | Bin 1876429 -> 1876469 bytes 22 files changed, 1228 insertions(+), 314 deletions(-) create mode 100644 fun-test-java/src/test/java/se/scalablesolutions/akka/api/NettyClient.java create mode 100644 fun-test-java/src/test/java/se/scalablesolutions/akka/api/NettyServer.java create mode 100644 fun-test-java/src/test/java/se/scalablesolutions/akka/api/NioTest.java mode change 100755 => 100644 kernel/pom.xml create mode 100644 kernel/src/main/scala/nio/NettyClient.scala create mode 100644 kernel/src/main/scala/nio/NettyServer.scala create mode 100644 kernel/src/main/scala/nio/RequestReply.scala create mode 100644 kernel/src/main/scala/stm/ChangeSet.scala diff --git a/akka.ipr b/akka.ipr index 1cf265f7a2..c313f8bddf 100644 --- a/akka.ipr +++ b/akka.ipr @@ -747,17 +747,6 @@ - - - - - - - - - - - @@ -1187,6 +1176,17 @@ + + + + + + + + + + + diff --git a/akka.iws b/akka.iws index 5c5f96ec8a..916c141f70 100644 --- a/akka.iws +++ b/akka.iws @@ -1,14 +1,33 @@ + + + + + + + + + + - - - + + + + + + + + + + + + @@ -31,7 +50,7 @@ - + - + + + + + - @@ -1497,35 +1823,35 @@ - + - + - - + - - + + - - - - - + + + + + - - + + - - + + + - + @@ -1572,74 +1898,58 @@ - + - + - - - - - - - - + - + - + - + - + - + - - - - - - - - - - + - + - + - + - + - + - + @@ -1651,41 +1961,51 @@ - + - + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - - - - - + diff --git a/fun-test-java/akka-funtest-java.iml b/fun-test-java/akka-funtest-java.iml index d8c959959d..f8ae03bd9d 100644 --- a/fun-test-java/akka-funtest-java.iml +++ b/fun-test-java/akka-funtest-java.iml @@ -4,7 +4,6 @@ - @@ -21,10 +20,6 @@ - - - - @@ -52,7 +47,7 @@ - + diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemFailer.java b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemFailer.java index 1af3300300..2f55363956 100644 --- a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemFailer.java +++ b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemFailer.java @@ -1,5 +1,7 @@ package se.scalablesolutions.akka.api; +import java.io.Serializable; + public class InMemFailer { public void fail() { throw new RuntimeException("expected"); diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java index b02ed15169..8bd9db4c76 100644 --- a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java +++ b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java @@ -5,9 +5,10 @@ import se.scalablesolutions.akka.annotation.transactional; import se.scalablesolutions.akka.kernel.state.*; public class InMemStateful { - @state private TransactionalMap mapState = new InMemoryTransactionalMap(); - @state private TransactionalVector vectorState = new InMemoryTransactionalVector(); - @state private TransactionalRef refState = new TransactionalRef(); + private TransactionalState factory = new TransactionalState(); + private TransactionalMap mapState = factory.newMap(new InMemoryMapConfig()); + private TransactionalVector vectorState = factory.newVector(new InMemoryVectorConfig());; + private TransactionalRef refState = factory.newRef(new InMemoryRefConfig()); @transactional public String getMapState(String key) { @@ -47,11 +48,12 @@ public class InMemStateful { } @transactional - public void failure(String key, String msg, InMemFailer failer) { + public String failure(String key, String msg, InMemFailer failer) { mapState.put(key, msg); vectorState.add(msg); refState.swap(msg); failer.fail(); + return msg; } @transactional diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java index 0a0a921e21..0d2da0060d 100644 --- a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java +++ b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java @@ -24,7 +24,7 @@ public class InMemoryStateTest extends TestCase { //new Component("inmem-clasher", InMemClasher.class, InMemClasherImpl.class, new LifeCycle(new Permanent(), 1000), 100000) }).inject().supervise(); } - + protected void tearDown() { conf.stop(); } @@ -87,7 +87,6 @@ public class InMemoryStateTest extends TestCase { } // expected assertEquals("init", stateful.getRefState()); // check that state is == init state } - /* public void testNestedNonTransactionalMethodHangs() { InMemStateful stateful = conf.getActiveObject(InMemStateful.class); diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/NettyClient.java b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/NettyClient.java new file mode 100644 index 0000000000..15f6a9d113 --- /dev/null +++ b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/NettyClient.java @@ -0,0 +1,7 @@ +package se.scalablesolutions.akka.api; + +public class NettyClient { + public static void main(String[] args) { + new se.scalablesolutions.akka.kernel.nio.NettyClient(); + } +} diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/NettyServer.java b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/NettyServer.java new file mode 100644 index 0000000000..793d53af74 --- /dev/null +++ b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/NettyServer.java @@ -0,0 +1,7 @@ +package se.scalablesolutions.akka.api; + +public class NettyServer { + public static void main(String[] args) { + new se.scalablesolutions.akka.kernel.nio.NettyServer(); + } +} diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/NioTest.java b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/NioTest.java new file mode 100644 index 0000000000..ae7bf0ebf2 --- /dev/null +++ b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/NioTest.java @@ -0,0 +1,31 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.api; + +import org.junit.*; +import static org.junit.Assert.*; + +import junit.framework.TestSuite; +import se.scalablesolutions.akka.kernel.nio.ProxyServer; + +public class NioTest extends TestSuite { + + @BeforeClass + public static void initialize() { + } + + @AfterClass + public static void cleanup() { + } + + @Test + public void simpleRequestReply() { + ProxyServer server = new ProxyServer(); + server.start(); + + + } + +} \ No newline at end of file diff --git a/kernel/akka-kernel.iml b/kernel/akka-kernel.iml index 8e3e83eaa6..b67e97ac49 100644 --- a/kernel/akka-kernel.iml +++ b/kernel/akka-kernel.iml @@ -116,7 +116,7 @@ - + diff --git a/kernel/pom.xml b/kernel/pom.xml old mode 100755 new mode 100644 index 6dfd9e8ff7..17c49efd7f --- a/kernel/pom.xml +++ b/kernel/pom.xml @@ -58,7 +58,7 @@ org.jboss.netty netty - 3.1.0.BETA2 + 3.1.0.CR1 diff --git a/kernel/src/main/scala/actor/ActiveObject.scala b/kernel/src/main/scala/actor/ActiveObject.scala index f07d9fc61d..92b31568ac 100644 --- a/kernel/src/main/scala/actor/ActiveObject.scala +++ b/kernel/src/main/scala/actor/ActiveObject.scala @@ -11,10 +11,11 @@ import java.lang.annotation.Annotation import kernel.config.ActiveObjectGuiceConfigurator import kernel.config.ScalaConfig._ import kernel.camel.{MessageDriven, ActiveObjectProducer} +import kernel.nio.{RemoteRequest, NettyClient} +import kernel.stm.{ChangeSet, Transaction} import kernel.util.Helpers.ReadWriteLock import kernel.util.{HashCode, ResultOrFailure} import kernel.state.{Transactional, TransactionalMap, TransactionalRef, TransactionalVector} -import kernel.stm.Transaction import org.codehaus.aspectwerkz.intercept.{Advisable, AroundAdvice} import org.codehaus.aspectwerkz.joinpoint.{MethodRtti, JoinPoint} @@ -61,6 +62,8 @@ class ActiveObjectFactory { object ActiveObject { val AKKA_CAMEL_ROUTING_SCHEME = "akka" + val RemoteClient = new NettyClient + private[kernel] val threadBoundTx: ThreadLocal[Option[Transaction]] = { val tl = new ThreadLocal[Option[Transaction]] tl.set(None) @@ -95,7 +98,7 @@ object ActiveObject { */ // FIXME: STM that allows concurrent updates, detects collision, rolls back and restarts -sealed class SequentialTransactionalAroundAdvice(target: Class[_], targetInstance: AnyRef, actor: Actor) extends AroundAdvice { +@serializable sealed class SequentialTransactionalAroundAdvice(target: Class[_], targetInstance: AnyRef, actor: Actor) extends AroundAdvice { private val changeSet = new ChangeSet(target.getName) private val (maps, vectors, refs) = getTransactionalItemsFor(targetInstance) @@ -116,31 +119,60 @@ sealed class SequentialTransactionalAroundAdvice(target: Class[_], targetInstanc val rtti = joinpoint.getRtti.asInstanceOf[MethodRtti] val method = rtti.getMethod - tryToCommitTransaction - - if (isInExistingTransaction) { - joinExistingTransaction - } else { - if (method.isAnnotationPresent(Annotations.transactional)) startNewTransaction - } - - val result: AnyRef = try { - incrementTransaction -// if (rtti.getMethod.isAnnotationPresent(Annotations.oneway)) sendOneWay(joinpoint) // FIXME put in 2 different aspects -// else handleResult(sendAndReceiveEventually(joinpoint)) - val result = actor !! Invocation(joinpoint, activeTx) - val resultOrFailure = - if (result.isDefined) result.get.asInstanceOf[ResultOrFailure[AnyRef]] - else throw new ActiveObjectInvocationTimeoutException("TIMED OUT") - handleResult(resultOrFailure) - } finally { - decrementTransaction - if (isTransactionAborted) removeTransactionIfTopLevel - else tryToPrecommitTransaction - } + val remoteCall = true + val isOneWay = rtti.getMethod.getReturnType == java.lang.Void.TYPE + val result: AnyRef = + if (remoteCall) { + // FIXME: Make part of TX semantics?? + val future = ActiveObject.RemoteClient.send(new RemoteRequest(false, rtti.getParameterValues, rtti.getMethod.getName, target.getName, isOneWay)) + if (isOneWay) null // for void methods + else { + future.await_? + val resultOrFailure = getResultOrThrowException(future) + handleResult(resultOrFailure) + } + + } else { + // FIXME join TX with same id, do not COMMIT + tryToCommitTransaction + if (isInExistingTransaction) { + joinExistingTransaction + } else { + if (method.isAnnotationPresent(Annotations.transactional)) startNewTransaction + } + try { + incrementTransaction + if (isOneWay) actor ! Invocation(joinpoint, activeTx) + else { + val result = actor !! Invocation(joinpoint, activeTx) + val resultOrFailure = + if (result.isDefined) result.get.asInstanceOf[ResultOrFailure[AnyRef]] + else throw new ActiveObjectInvocationTimeoutException("TIMED OUT") + handleResult(resultOrFailure) + } + } finally { + decrementTransaction + if (isTransactionAborted) removeTransactionIfTopLevel + else tryToPrecommitTransaction + } + } result } + // TODO: create a method setCallee/setCaller to the joinpoint interface and compiler + private def nullOutTransientFieldsInJoinpoint(joinpoint: JoinPoint) = { + val clazz = joinpoint.getClass + val callee = clazz.getDeclaredField("CALLEE") + callee.setAccessible(true) + callee.set(joinpoint, null) + val caller = clazz.getDeclaredField("CALLER") + caller.setAccessible(true) + caller.set(joinpoint, null) + val interceptors = clazz.getDeclaredField("AROUND_INTERCEPTORS") + interceptors.setAccessible(true) + interceptors.set(joinpoint, null) + } + private def startNewTransaction = { val newTx = new Transaction newTx.begin(changeSet) @@ -167,7 +199,9 @@ sealed class SequentialTransactionalAroundAdvice(target: Class[_], targetInstanc true } else false - private def handleResult(result: ResultOrFailure[AnyRef]): AnyRef = { + + + private def handleResult(result: ResultOrFailure[AnyRef]): AnyRef = { try { result() } catch { @@ -265,41 +299,6 @@ sealed class SequentialTransactionalAroundAdvice(target: Class[_], targetInstanc } } -class ChangeSet(val id: String) { - private val lock = new ReadWriteLock - - private[kernel] def full: List[Transactional] = lock.withReadLock { - _maps ::: _vectors ::: _refs - } - - // TX Maps - private[kernel] var _maps: List[TransactionalMap[_, _]] = Nil - private[kernel] def maps_=(maps: List[TransactionalMap[_, _]]) = lock.withWriteLock { - _maps = maps - } - private[kernel] def maps: List[TransactionalMap[_, _]] = lock.withReadLock { - _maps - } - - // TX Vectors - private[kernel] var _vectors: List[TransactionalVector[_]] = Nil - private[kernel] def vectors_=(vectors: List[TransactionalVector[_]]) = lock.withWriteLock { - _vectors = vectors - } - private[kernel] def vectors: List[TransactionalVector[_]] = lock.withReadLock { - _vectors - } - - // TX Refs - private[kernel] var _refs: List[TransactionalRef[_]] = Nil - private[kernel] def refs_=(refs: List[TransactionalRef[_]]) = lock.withWriteLock { - _refs = refs - } - private[kernel] def refs: List[TransactionalRef[_]] = lock.withReadLock { - _refs - } -} - /** * Represents a snapshot of the current invocation. * @@ -333,6 +332,11 @@ class ChangeSet(val id: String) { */ private[kernel] class Dispatcher(val targetName: String) extends Actor { id = targetName + + // FIXME implement the pre/post restart methods and call annotated methods on the POJO + + // FIXME create new POJO on creation and swap POJO at restart - joinpoint.setTarget(new POJO) + override def receive: PartialFunction[Any, Unit] = { case Invocation(joinpoint: JoinPoint, tx: Option[Transaction]) => @@ -353,7 +357,7 @@ private[kernel] class Dispatcher(val targetName: String) extends Actor { /* ublic class CamelInvocationHandler implements InvocationHandler { - private final Endpoint endpoint; + private final Endpoint endpoint; private final Producer producer; private final MethodInfoCache methodInfoCache; diff --git a/kernel/src/main/scala/nio/NettyClient.scala b/kernel/src/main/scala/nio/NettyClient.scala new file mode 100644 index 0000000000..fa3fdc8ec2 --- /dev/null +++ b/kernel/src/main/scala/nio/NettyClient.scala @@ -0,0 +1,129 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel.nio + +import java.net.InetSocketAddress +import java.util.concurrent.atomic.AtomicLong +import java.util.concurrent.{Executors, ConcurrentMap, ConcurrentHashMap} + +import kernel.reactor.{NullFutureResult, DefaultCompletableFutureResult, CompletableFutureResult} +import kernel.util.{HashCode, Logging}; + +import org.jboss.netty.handler.codec.serialization.{ObjectEncoder, ObjectDecoder} +import org.jboss.netty.bootstrap.ClientBootstrap +import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory +import org.jboss.netty.channel._ + +class NettyClient extends Logging { + private val HOSTNAME = "localhost" + private val PORT = 9999 + + private val futures = new ConcurrentHashMap[Long, CompletableFutureResult] + + private val channelFactory = new NioClientSocketChannelFactory( + Executors.newCachedThreadPool, + Executors.newCachedThreadPool) + + private val bootstrap = new ClientBootstrap(channelFactory) + private val handler = new ObjectClientHandler(futures) + + bootstrap.getPipeline.addLast("handler", handler) + bootstrap.setOption("tcpNoDelay", true) + bootstrap.setOption("keepAlive", true) + + private val connection = bootstrap.connect(new InetSocketAddress(HOSTNAME, PORT)) + log.info("Starting NIO client at [%s:%s]", HOSTNAME, PORT) + + // Wait until the connection attempt succeeds or fails. + connection.awaitUninterruptibly + if (!connection.isSuccess) { + log.error("Connection has failed due to [%s]", connection.getCause) + connection.getCause.printStackTrace + } + + def shutdown = { + connection.getChannel.getCloseFuture.awaitUninterruptibly + channelFactory.releaseExternalResources + } + + def send(request: RemoteRequest): CompletableFutureResult = { + val escapedRequest = escapeRequest(request) + if (escapedRequest.isOneWay) { + connection.getChannel.write(escapedRequest) + new NullFutureResult + } else { + futures.synchronized { + val futureResult = new DefaultCompletableFutureResult(100000) + futures.put(request.id, futureResult) + connection.getChannel.write(escapedRequest) + futureResult + } + } + } + + private def escapeRequest(request: RemoteRequest) = { + if (request.message.isInstanceOf[Array[Object]]) { + val args = request.message.asInstanceOf[Array[Object]].toList.asInstanceOf[scala.List[Object]] + val escapedArgs = for (arg <- args) yield { + val clazz = arg.getClass + if (clazz.getName.contains("$$ProxiedByAW")) { + new ProxyWrapper(clazz.getSuperclass.getName) + } else arg + } + request.cloneWithNewMessage(escapedArgs) + } else request + } +} + +@ChannelPipelineCoverage { val value = "all" } +class ObjectClientHandler(val futures: ConcurrentMap[Long, CompletableFutureResult]) extends SimpleChannelUpstreamHandler with Logging { + + override def handleUpstream(ctx: ChannelHandlerContext, event: ChannelEvent) = { + if (event.isInstanceOf[ChannelStateEvent] && event.asInstanceOf[ChannelStateEvent].getState != ChannelState.INTEREST_OPS) { + log.debug(event.toString) + } + super.handleUpstream(ctx, event) + } + + override def channelOpen(ctx: ChannelHandlerContext, event: ChannelStateEvent) = { + // Add encoder and decoder as soon as a new channel is created so that + // a Java object is serialized and deserialized. + event.getChannel.getPipeline.addFirst("encoder", new ObjectEncoder) + event.getChannel.getPipeline.addFirst("decoder", new ObjectDecoder) + } + + override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) { + // Send the first message if this handler is a client-side handler. + // if (!firstMessage.isEmpty) e.getChannel.write(firstMessage) + } + + override def messageReceived(ctx: ChannelHandlerContext, event: MessageEvent) { + try { + val result = event.getMessage + if (result.isInstanceOf[RemoteReply]) { + val reply = result.asInstanceOf[RemoteReply] + val future = futures.get(reply.id) + if (reply.successful) { + future.completeWithResult(reply.message) + } else { + future.completeWithException(null, reply.exception) + } + } else throw new IllegalArgumentException("Unknown message received in NIO client handler: " + result) + } catch { + case e: Exception => log.error("Unexpected exception in NIO client handler: %s", e); throw e + } + } + + override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) { + log.error("Unexpected exception from downstream: %s", event.getCause) + event.getChannel.close + } +} + +object NettyClientRunner { + def main(args: Array[String]) = { + new NettyClient + } +} \ No newline at end of file diff --git a/kernel/src/main/scala/nio/NettyServer.scala b/kernel/src/main/scala/nio/NettyServer.scala new file mode 100644 index 0000000000..c02b74cd93 --- /dev/null +++ b/kernel/src/main/scala/nio/NettyServer.scala @@ -0,0 +1,156 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel.nio + +import java.lang.reflect.InvocationTargetException +import java.net.InetSocketAddress +import java.util.concurrent.{ConcurrentHashMap, Executors} +import kernel.actor.{ActiveObjectFactory, Dispatcher, ActiveObject, Invocation} +import kernel.util.Logging +import java.util.ArrayList +import java.util.List +import java.util.concurrent.atomic.AtomicLong +import java.util.logging.Level +import java.util.logging.Logger + +import org.jboss.netty.bootstrap.ServerBootstrap +import org.jboss.netty.channel._ +import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory +import org.jboss.netty.handler.codec.serialization.ObjectDecoder +import org.jboss.netty.handler.codec.serialization.ObjectEncoder + +class NettyServer extends Logging { + val HOSTNAME = "localhost" + val PORT = 9999 + val CONNECTION_TIMEOUT_MILLIS = 100 + + log.info("Starting NIO server at [%s:%s]", HOSTNAME, PORT) + + val factory = new NioServerSocketChannelFactory( + Executors.newCachedThreadPool, + Executors.newCachedThreadPool) + + val bootstrap = new ServerBootstrap(factory) + + // FIXME provide different codecs (Thrift, Avro, Protobuf, JSON) + val handler = new ObjectServerHandler + + bootstrap.getPipeline.addLast("handler", handler) + + bootstrap.setOption("child.tcpNoDelay", true) + bootstrap.setOption("child.keepAlive", true) + bootstrap.setOption("child.reuseAddress", true) + bootstrap.setOption("child.connectTimeoutMillis", CONNECTION_TIMEOUT_MILLIS) + + bootstrap.bind(new InetSocketAddress(HOSTNAME, PORT)) +} + +@ChannelPipelineCoverage {val value = "all"} +class ObjectServerHandler extends SimpleChannelUpstreamHandler with Logging { + private val activeObjectFactory = new ActiveObjectFactory + private val activeObjects = new ConcurrentHashMap[String, AnyRef] + + override def handleUpstream(ctx: ChannelHandlerContext, event: ChannelEvent) = { + if (event.isInstanceOf[ChannelStateEvent] && event.asInstanceOf[ChannelStateEvent].getState != ChannelState.INTEREST_OPS) { + log.debug(event.toString) + } + super.handleUpstream(ctx, event) + } + + override def channelOpen(ctx: ChannelHandlerContext, event: ChannelStateEvent) = { + event.getChannel.getPipeline.addFirst("encoder", new ObjectEncoder) + event.getChannel.getPipeline.addFirst("decoder", new ObjectDecoder) + } + + override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) = { + // Send the first message if this handler is a client-side handler. + // if (!firstMessage.isEmpty) e.getChannel.write(firstMessage) + } + + override def messageReceived(ctx: ChannelHandlerContext, event: MessageEvent) ={ + val message = event.getMessage + if (message == null) throw new IllegalStateException("Message in MessageEvent is null: " + event) + if (message.isInstanceOf[RemoteRequest]) handleRemoteRequest(message.asInstanceOf[RemoteRequest], event.getChannel) + } + + override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) = { + event.getCause.printStackTrace + log.error("Unexpected exception from downstream: %s", event.getCause) + event.getChannel.close + } + + private def handleRemoteRequest(request: RemoteRequest, channel: Channel) = { + try { + log.debug(request.toString) + if (request.isActor) { + log.debug("Dispatching to [receive :: %s]", request.target) + throw new UnsupportedOperationException("TODO: remote actors") + } else { + log.debug("Dispatching to [%s :: %s]", request.method, request.target) + val activeObject = createActiveObject(request.target) +// val args = request.message.asInstanceOf[scala.List[Object]] +// val argClassesList = args.map(_.getClass) +// val argClasses = argClassesList.map(_.getClass).toArray +// val method = activeObject.getClass.getDeclaredMethod(request.method, argClasses) + + val args = request.message.asInstanceOf[scala.List[AnyRef]] + val argClazzes = args.map(_.getClass)//.toArray.asInstanceOf[Array[Class[_]]] + val (unescapedArgs, unescapedArgClasses) = unescapeArgs(args, argClazzes) + val method = activeObject.getClass.getDeclaredMethod(request.method, unescapedArgClasses) + try { + if (request.isOneWay) method.invoke(activeObject, unescapedArgs) + else { + val result = method.invoke(activeObject, unescapedArgs) + log.debug("Returning result [%s]", result) + channel.write(request.newReplyWithMessage(result)) + } + } catch { + case e: InvocationTargetException => + log.error("Could not invoke remote active object or actor [%s :: %s] due to: %s", request.method, request.target, e.getCause) + e.getCause.printStackTrace + channel.write(request.newReplyWithException(e.getCause)) + } + } + } catch { + case e: Exception => + log.error("Could not invoke remote active object or actor [%s :: %s] due to: %s", request.method, request.target, e) + e.printStackTrace + } + } + + private def unescapeArgs(args: scala.List[AnyRef], argClasses: scala.List[Class[_]]) = { + val unescapedArgs = new Array[AnyRef](args.size) + val unescapedArgClasses = new Array[Class[_]](args.size) + + val escapedArgs = for (i <- 0 until args.size) { + if (args(i).isInstanceOf[ProxyWrapper]) { + val proxyName = args(i).asInstanceOf[ProxyWrapper].proxyName + val activeObject = createActiveObject(proxyName) + unescapedArgs(i) = activeObject + unescapedArgClasses(i) = Class.forName(proxyName) + } else { + unescapedArgs(i) = args(i) + unescapedArgClasses(i) = argClasses(i) + } + } + (unescapedArgs, unescapedArgClasses) + } + + private def createActiveObject(name: String) = { + val activeObjectOrNull = activeObjects.get(name) + if (activeObjectOrNull == null) { + val clazz = Class.forName(name) + val newInstance = clazz.newInstance.asInstanceOf[AnyRef] // activeObjectFactory.newInstance(clazz, new Dispatcher(invocation.target)).asInstanceOf[AnyRef] + activeObjects.put(name, newInstance) + newInstance + } else activeObjectOrNull + } +} + +object NettyServerRunner { + def main(args: Array[String]) = { + new NettyServer + } +} diff --git a/kernel/src/main/scala/nio/ProxyServer.scala b/kernel/src/main/scala/nio/ProxyServer.scala index e69de29bb2..934f1cf37c 100644 --- a/kernel/src/main/scala/nio/ProxyServer.scala +++ b/kernel/src/main/scala/nio/ProxyServer.scala @@ -0,0 +1,97 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel.nio + +import java.io.PrintWriter +import java.net.{Socket, InetAddress, InetSocketAddress} + +import java.util.concurrent.Executors +import java.util.{HashSet, Date} +import java.nio.channels.{Selector, ServerSocketChannel, SelectionKey} +import java.nio.channels.spi.SelectorProvider +import kernel.actor.Invocation +import kernel.reactor.{MessageQueue, MessageDemultiplexer, MessageHandle, MessageDispatcherBase} + +class ProxyServer extends MessageDispatcherBase { + val port = 9999 + val host = InetAddress.getLocalHost + + // Selector for incoming time requests + val acceptSelector = SelectorProvider.provider.openSelector + + // Create a new server socket and set to non blocking mode + val ssc = ServerSocketChannel.open + ssc.configureBlocking(true) + + // Bind the server socket to the local host and port + val address = new InetSocketAddress(host, port) + ssc.socket.bind(address) + + // Register accepts on the server socket with the selector. This + // step tells the selector that the socket wants to be put on the + // ready list when accept operations occur, so allowing multiplexed + // non-blocking I/O to take place. + val acceptKey = ssc.register(acceptSelector, SelectionKey.OP_ACCEPT) + + // FIXME: make configurable using configgy + JMX + // FIXME: create one executor per invocation to dispatch(..), grab config settings for specific actor (set in registerHandler) + private val threadPoolSize: Int = 100 + private val handlerExecutor = Executors.newCachedThreadPool() + + def start = if (!active) { + active = true + selectorThread = new Thread { + override def run = { + while (active) { + try { + guard.synchronized { /* empty */ } // prevents risk for deadlock as described in [http://developers.sun.com/learning/javaoneonline/2006/coreplatform/TS-1315.pdf] + + val keysAdded = acceptSelector.select + val readyKeys = acceptSelector.selectedKeys + val iter = readyKeys.iterator + while (iter.hasNext) { + val key = iter.next.asInstanceOf[SelectionKey] + iter.remove +/* + if (key.isValid && key.isReadable) { + eventHandler.onReadableEvent(key.channel) + } + if (key.isValid && key.isWritable) { + key.interestOps(SelectionKey.OP_READ) // reset to read only + eventHandler.onWriteableEvent(key.channel) + } +*/ + val channel = key.channel.asInstanceOf[ServerSocketChannel] + val socket = channel.accept.socket + socket.setKeepAlive(true) + + + val in = socket.getInputStream + val out = new PrintWriter(socket.getOutputStream, true) + out.println(new Date) + out.close + + /* handlerExecutor.execute(new Runnable { + override def run = { + try { + val result = handle.message.asInstanceOf[Invocation].joinpoint.proceed + handle.future.completeWithResult(result) + } catch { + case e: Exception => handle.future.completeWithException(e) + } + } + }) + */ + } + } finally { + } + } + } + } + selectorThread.start + } + + override protected def doShutdown = handlerExecutor.shutdownNow +} diff --git a/kernel/src/main/scala/nio/RequestReply.scala b/kernel/src/main/scala/nio/RequestReply.scala new file mode 100644 index 0000000000..6e0f5cab53 --- /dev/null +++ b/kernel/src/main/scala/nio/RequestReply.scala @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel.nio + +import java.util.concurrent.atomic.AtomicLong +import kernel.util.HashCode + +object IdFactory { + private val id = new AtomicLong + def nextId = id.getAndIncrement +} + +@serializable class ProxyWrapper(val proxyName: String) + +@serializable class RemoteRequest(val isActor: Boolean, val message: AnyRef, val method: String, val target: String, val isOneWay: Boolean) { + private[RemoteRequest] var _id = IdFactory.nextId + def id = _id + + override def toString: String = synchronized { + "RemoteRequest[isActor: " + isActor + " | message: " + message + " | method: " + method + " | target: " + target + " | isOneWay: " + isOneWay + "]" + } + + override def hashCode(): Int = synchronized { + var result = HashCode.SEED + result = HashCode.hash(result, isActor) + result = HashCode.hash(result, message) + result = HashCode.hash(result, method) + result = HashCode.hash(result, target) + result + } + + override def equals(that: Any): Boolean = synchronized { + that != null && + that.isInstanceOf[RemoteRequest] && + that.asInstanceOf[RemoteRequest].isActor == isActor && + that.asInstanceOf[RemoteRequest].message == message && + that.asInstanceOf[RemoteRequest].method == method && + that.asInstanceOf[RemoteRequest].target == target + } + + def newReplyWithMessage(message: AnyRef) = synchronized { new RemoteReply(true, id, message, null) } + + def newReplyWithException(error: Throwable) = synchronized { new RemoteReply(false, id, null, error) } + + def cloneWithNewMessage(message: AnyRef) = synchronized { + val request = new RemoteRequest(isActor, message, method, target, isOneWay) + request._id = id + request + } +} + +@serializable class RemoteReply(val successful: Boolean, val id: Long, val message: AnyRef, val exception: Throwable) { + override def toString: String = synchronized { + "RemoteReply[successful: " + successful + " | id: " + id + " | message: " + message + " | exception: " + exception + "]" + } + + override def hashCode(): Int = synchronized { + var result = HashCode.SEED + result = HashCode.hash(result, successful) + result = HashCode.hash(result, id) + result = HashCode.hash(result, message) + result = HashCode.hash(result, exception) + result + } + + override def equals(that: Any): Boolean = synchronized { + that != null && + that.isInstanceOf[RemoteReply] && + that.asInstanceOf[RemoteReply].successful == successful && + that.asInstanceOf[RemoteReply].id == id && + that.asInstanceOf[RemoteReply].message == message && + that.asInstanceOf[RemoteReply].exception == exception + } +} \ No newline at end of file diff --git a/kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala b/kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala index ec4f7711af..42b2aa9f37 100644 --- a/kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala +++ b/kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala @@ -10,15 +10,29 @@ */ package se.scalablesolutions.akka.kernel.reactor + +import java.util.concurrent.{LinkedBlockingQueue, TimeUnit, RejectedExecutionHandler, ThreadPoolExecutor} + class EventBasedThreadPoolDispatcher extends MessageDispatcherBase { import java.util.concurrent.Executors import java.util.HashSet // FIXME: make configurable using configgy + JMX - // FIXME: create one executor per invocation to dispatch(..), grab config settings for specific actor (set in registerHandler) - private val threadPoolSize: Int = 100 private val busyHandlers = new HashSet[AnyRef] - private val handlerExecutor = Executors.newCachedThreadPool() + + private val minNrThreads, maxNrThreads = 10 + private val timeOut = 1000L // ???? + private val timeUnit = TimeUnit.MILLISECONDS + private val threadFactory = new MonitorableThreadFactory("akka:kernel") + private val rejectedExecutionHandler = new RejectedExecutionHandler() { + def rejectedExecution(runnable: Runnable, threadPoolExecutor: ThreadPoolExecutor) { + + } + } + private val queue = new LinkedBlockingQueue[Runnable] + private val handlerExecutor = new ThreadPoolExecutor(minNrThreads, maxNrThreads, timeOut, timeUnit, queue, threadFactory, rejectedExecutionHandler) + + //private val handlerExecutor = Executors.newCachedThreadPool() def start = if (!active) { active = true diff --git a/kernel/src/main/scala/reactor/Reactor.scala b/kernel/src/main/scala/reactor/Reactor.scala index 461b7a8deb..86a9a73981 100644 --- a/kernel/src/main/scala/reactor/Reactor.scala +++ b/kernel/src/main/scala/reactor/Reactor.scala @@ -10,9 +10,10 @@ */ package se.scalablesolutions.akka.kernel.reactor +import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.ThreadFactory import java.util.{LinkedList, Queue} -import kernel.util.HashCode - +import kernel.util.{Logging, HashCode} trait MessageHandler { def handle(message: MessageHandle) } @@ -75,3 +76,34 @@ class MessageQueue { queue.notifyAll } } + +class MonitorableThreadFactory(val name: String) extends ThreadFactory { + def newThread(runnable: Runnable) = + //new MonitorableThread(runnable, name) + new Thread(runnable) +} + +object MonitorableThread { + val DEFAULT_NAME = "MonitorableThread" + val created = new AtomicInteger + val alive = new AtomicInteger + @volatile val debugLifecycle = false +} +class MonitorableThread(runnable: Runnable, name: String) + extends Thread(runnable, name + "-" + MonitorableThread.created.incrementAndGet) {//with Logging { + setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + def uncaughtException(thread: Thread, cause: Throwable) = {} //log.error("UNCAUGHT in thread [%s] cause [%s]", thread.getName, cause) + }) + + override def run = { + val debug = MonitorableThread.debugLifecycle + //if (debug) log.debug("Created %s", getName) + try { + MonitorableThread.alive.incrementAndGet + super.run + } finally { + MonitorableThread.alive.decrementAndGet + //if (debug) log.debug("Exiting %s", getName) + } + } +} diff --git a/kernel/src/main/scala/state/State.scala b/kernel/src/main/scala/state/State.scala index fbd2eb05dd..fec5b0871c 100644 --- a/kernel/src/main/scala/state/State.scala +++ b/kernel/src/main/scala/state/State.scala @@ -18,17 +18,17 @@ abstract class TransactionalRefConfig extends TransactionalStateConfig abstract class PersistentStorageConfig extends TransactionalStateConfig case class CassandraStorageConfig extends PersistentStorageConfig -case object TerracottaStorageConfig extends PersistentStorageConfig -case object TokyoCabinetStorageConfig extends PersistentStorageConfig +case class TerracottaStorageConfig extends PersistentStorageConfig +case class TokyoCabinetStorageConfig extends PersistentStorageConfig case class PersistentMapConfig(storage: PersistentStorageConfig) extends TransactionalMapConfig -case object InMemoryMapConfig extends TransactionalMapConfig +case class InMemoryMapConfig extends TransactionalMapConfig case class PersistentVectorConfig(storage: PersistentStorageConfig) extends TransactionalVectorConfig -case object InMemoryVectorConfig extends TransactionalVectorConfig +case class InMemoryVectorConfig extends TransactionalVectorConfig case class PersistentRefConfig(storage: PersistentStorageConfig) extends TransactionalRefConfig -case object InMemoryRefConfig extends TransactionalRefConfig +case class InMemoryRefConfig extends TransactionalRefConfig object TransactionalState extends TransactionalState class TransactionalState { @@ -39,13 +39,13 @@ class TransactionalState { * val myMap = TransactionalState.newMap(PersistentMapConfig(CassandraStorageConfig)) * */ - def newMap(config: TransactionalMapConfig): TransactionalMap = config match { + def newMap(config: TransactionalMapConfig) = config match { case PersistentMapConfig(storage) => storage match { case CassandraStorageConfig() => new CassandraPersistentTransactionalMap - case TerracottaStorageConfig => throw new UnsupportedOperationException - case TokyoCabinetStorageConfig => throw new UnsupportedOperationException + case TerracottaStorageConfig() => throw new UnsupportedOperationException + case TokyoCabinetStorageConfig() => throw new UnsupportedOperationException } - case InMemoryMapConfig => new InMemoryTransactionalMap + case InMemoryMapConfig() => new InMemoryTransactionalMap } /** @@ -54,13 +54,13 @@ class TransactionalState { * val myVector = TransactionalState.newVector(PersistentVectorConfig(CassandraStorageConfig)) * */ - def newVector(config: TransactionalVectorConfig): TransactionalVector = config match { + def newVector(config: TransactionalVectorConfig) = config match { case PersistentVectorConfig(storage) => storage match { case CassandraStorageConfig() => new CassandraPersistentTransactionalVector - case TerracottaStorageConfig => throw new UnsupportedOperationException - case TokyoCabinetStorageConfig => throw new UnsupportedOperationException + case TerracottaStorageConfig() => throw new UnsupportedOperationException + case TokyoCabinetStorageConfig() => throw new UnsupportedOperationException } - case InMemoryVectorConfig => new InMemoryTransactionalVector + case InMemoryVectorConfig() => new InMemoryTransactionalVector } /** @@ -69,13 +69,13 @@ class TransactionalState { * val myRef = TransactionalState.newRef(PersistentRefConfig(CassandraStorageConfig)) * */ - def newRef(config: TransactionalRefConfig): TransactionalRef = config match { + def newRef(config: TransactionalRefConfig) = config match { case PersistentRefConfig(storage) => storage match { case CassandraStorageConfig() => new CassandraPersistentTransactionalRef - case TerracottaStorageConfig => throw new UnsupportedOperationException - case TokyoCabinetStorageConfig => throw new UnsupportedOperationException + case TerracottaStorageConfig() => throw new UnsupportedOperationException + case TokyoCabinetStorageConfig() => throw new UnsupportedOperationException } - case InMemoryRefConfig => new TransactionalRef + case InMemoryRefConfig() => new TransactionalRef } } diff --git a/kernel/src/main/scala/stm/ChangeSet.scala b/kernel/src/main/scala/stm/ChangeSet.scala new file mode 100644 index 0000000000..e7ba12974b --- /dev/null +++ b/kernel/src/main/scala/stm/ChangeSet.scala @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel.stm + +import kernel.state.{Transactional, TransactionalMap, TransactionalVector, TransactionalRef} +import kernel.util.Helpers.ReadWriteLock + +class ChangeSet(val id: String) { + private val lock = new ReadWriteLock + + private[kernel] def full: List[Transactional] = lock.withReadLock { + _maps ::: _vectors ::: _refs + } + + // TX Maps + private[kernel] var _maps: List[TransactionalMap[_, _]] = Nil + private[kernel] def maps_=(maps: List[TransactionalMap[_, _]]) = lock.withWriteLock { + _maps = maps + } + private[kernel] def maps: List[TransactionalMap[_, _]] = lock.withReadLock { + _maps + } + + // TX Vectors + private[kernel] var _vectors: List[TransactionalVector[_]] = Nil + private[kernel] def vectors_=(vectors: List[TransactionalVector[_]]) = lock.withWriteLock { + _vectors = vectors + } + private[kernel] def vectors: List[TransactionalVector[_]] = lock.withReadLock { + _vectors + } + + // TX Refs + private[kernel] var _refs: List[TransactionalRef[_]] = Nil + private[kernel] def refs_=(refs: List[TransactionalRef[_]]) = lock.withWriteLock { + _refs = refs + } + private[kernel] def refs: List[TransactionalRef[_]] = lock.withReadLock { + _refs + } +} + diff --git a/kernel/src/main/scala/stm/Transaction.scala b/kernel/src/main/scala/stm/Transaction.scala index ef7d7290b5..8fa7384d00 100644 --- a/kernel/src/main/scala/stm/Transaction.scala +++ b/kernel/src/main/scala/stm/Transaction.scala @@ -5,7 +5,6 @@ package se.scalablesolutions.akka.kernel.stm import java.util.concurrent.atomic.{AtomicInteger, AtomicLong} -import kernel.actor.ChangeSet import kernel.util.Logging import scala.collection.mutable.{HashSet, HashMap} diff --git a/lib/aspectwerkz-nodeps-jdk5-2.1.jar b/lib/aspectwerkz-nodeps-jdk5-2.1.jar index c655479cbe3bd6c2646dffa1bce1ab2d1550a047..62725b9769865dae1f1c203c72ba2abaa8a1009b 100644 GIT binary patch delta 43259 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