diff --git a/akka-core/src/main/scala/actor/Actor.scala b/akka-core/src/main/scala/actor/Actor.scala index 732d3fabcd..a1eb6bd309 100644 --- a/akka-core/src/main/scala/actor/Actor.scala +++ b/akka-core/src/main/scala/actor/Actor.scala @@ -203,8 +203,6 @@ trait Actor extends TransactionManagement { // Only mutable for RemoteServer in order to maintain identity across nodes private[akka] var _uuid = UUID.newUuid.toString - def uuid = _uuid - // ==================================== // private fields // ==================================== @@ -259,7 +257,7 @@ trait Actor extends TransactionManagement { * use a custom name to be able to retrieve the "correct" persisted state * upon restart, remote restart etc. */ - protected[akka] var id: String = this.getClass.getName + protected var id: String = this.getClass.getName /** * User overridable callback/setting. @@ -269,8 +267,6 @@ trait Actor extends TransactionManagement { */ @volatile var timeout: Long = Actor.TIMEOUT - ActorRegistry.register(this) - /** * User overridable callback/setting. *

@@ -418,6 +414,7 @@ trait Actor extends TransactionManagement { init } Actor.log.debug("[%s] has started", toString) + ActorRegistry.register(this) this } @@ -760,6 +757,16 @@ trait Actor extends TransactionManagement { actor } + /** + * Returns the id for the actor. + */ + def getId = id + + /** + * Returns the uuid for the actor. + */ + def uuid = _uuid + // ========================================= // ==== INTERNAL IMPLEMENTATION DETAILS ==== // ========================================= diff --git a/akka-core/src/main/scala/actor/ActorRegistry.scala b/akka-core/src/main/scala/actor/ActorRegistry.scala index 63314ae051..509750340e 100644 --- a/akka-core/src/main/scala/actor/ActorRegistry.scala +++ b/akka-core/src/main/scala/actor/ActorRegistry.scala @@ -65,7 +65,7 @@ object ActorRegistry extends Logging { case Some(instances) => actorsByClassName + (className -> (actor :: instances)) case None => actorsByClassName + (className -> (actor :: Nil)) } - val id = actor.id + val id = actor.getId if (id eq null) throw new IllegalStateException("Actor.id is null " + actor) actorsById.get(id) match { case Some(instances) => actorsById + (id -> (actor :: instances)) diff --git a/akka-core/src/main/scala/actor/Supervisor.scala b/akka-core/src/main/scala/actor/Supervisor.scala index f8cb687c84..ac5dc32303 100644 --- a/akka-core/src/main/scala/actor/Supervisor.scala +++ b/akka-core/src/main/scala/actor/Supervisor.scala @@ -117,7 +117,7 @@ sealed class Supervisor private[akka] (handler: FaultHandlingStrategy, trapExcep actors.put(actor.getClass.getName, actor) actor.lifeCycle = Some(lifeCycle) startLink(actor) - remoteAddress.foreach(address => RemoteServer.actorsFor(RemoteServer.Address(address.hostname, address.port)).actors.put(actor.id, actor)) + remoteAddress.foreach(address => RemoteServer.actorsFor(RemoteServer.Address(address.hostname, address.port)).actors.put(actor.getId, actor)) case supervisorConfig @ SupervisorConfig(_, _) => // recursive supervisor configuration val supervisor = factory.newInstanceFor(supervisorConfig).start diff --git a/akka-core/src/main/scala/remote/RemoteServer.scala b/akka-core/src/main/scala/remote/RemoteServer.scala index 5288bd7bd4..6da2ceea99 100644 --- a/akka-core/src/main/scala/remote/RemoteServer.scala +++ b/akka-core/src/main/scala/remote/RemoteServer.scala @@ -196,8 +196,8 @@ class RemoteServer extends Logging { * Register Remote Actor by the Actor's 'id' field. */ def register(actor: Actor) = if (isRunning) { - log.info("Registering server side remote actor [%s] with id [%s]", actor.getClass.getName, actor.id) - RemoteServer.actorsFor(RemoteServer.Address(hostname, port)).actors.put(actor.id, actor) + log.info("Registering server side remote actor [%s] with id [%s]", actor.getClass.getName, actor.getId) + RemoteServer.actorsFor(RemoteServer.Address(hostname, port)).actors.put(actor.getId, actor) } /** diff --git a/akka-persistence/akka-persistence-cassandra/src/test/scala/CassandraPersistentActorSpec.scala b/akka-persistence/akka-persistence-cassandra/src/test/scala/CassandraPersistentActorSpec.scala index 690c69625e..0e232f5ce9 100644 --- a/akka-persistence/akka-persistence-cassandra/src/test/scala/CassandraPersistentActorSpec.scala +++ b/akka-persistence/akka-persistence-cassandra/src/test/scala/CassandraPersistentActorSpec.scala @@ -9,6 +9,7 @@ import org.junit.Assert._ import org.apache.cassandra.service.CassandraDaemon import org.junit.BeforeClass import org.junit.Before +import org.scalatest.junit.JUnitSuite case class GetMapState(key: String) case object GetVectorState @@ -73,7 +74,7 @@ class CassandraPersistentActor extends Actor { } } -class CassandraPersistentActorTest { +class CassandraPersistentActorSpec extends JUnitSuite { @Before def startCassandra = EmbeddedCassandraService.start diff --git a/akka-samples/akka-sample-chat/src/main/scala/ChatServer.scala b/akka-samples/akka-sample-chat/src/main/scala/ChatServer.scala index 9528ad4da7..f605fc7cba 100644 --- a/akka-samples/akka-sample-chat/src/main/scala/ChatServer.scala +++ b/akka-samples/akka-sample-chat/src/main/scala/ChatServer.scala @@ -10,9 +10,8 @@ import se.scalablesolutions.akka.remote.RemoteServer import se.scalablesolutions.akka.util.Logging import se.scalablesolutions.akka.config.ScalaConfig._ import se.scalablesolutions.akka.config.OneForOneStrategy -import se.scalablesolutions.akka.state.RedisStorage - import scala.collection.mutable.HashMap +import se.scalablesolutions.akka.state.{PersistentVector, RedisStorage} /****************************************************************************** To run the sample: @@ -77,7 +76,11 @@ trait ChatStorage extends Actor class RedisChatStorage extends ChatStorage { lifeCycle = Some(LifeCycle(Permanent)) - private var chatLog = RedisStorage.getVector("akka.chat.log") + private var chatLog: PersistentVector[Array[Byte]] = _ + + override def initTransactionalState = chatLog = RedisStorage.getVector("akka.chat.log") + + chatLog = RedisStorage.getVector("akka.chat.log") log.info("Redis-based chat storage is starting up...") diff --git a/akka-samples/akka-sample-lift/src/main/scala/akka/SimpleService.scala b/akka-samples/akka-sample-lift/src/main/scala/akka/SimpleService.scala index 471c8f12b3..3f18f7d357 100644 --- a/akka-samples/akka-sample-lift/src/main/scala/akka/SimpleService.scala +++ b/akka-samples/akka-sample-lift/src/main/scala/akka/SimpleService.scala @@ -20,7 +20,7 @@ class SimpleService extends Transactor { case object Tick private val KEY = "COUNTER" private var hasStartedTicking = false - private val storage = TransactionalState.newMap[String, Integer] + private lazy val storage = TransactionalState.newMap[String, Integer] @GET @Produces(Array("text/html")) @@ -52,7 +52,7 @@ class PersistentSimpleService extends Transactor { case object Tick private val KEY = "COUNTER" private var hasStartedTicking = false - private val storage = CassandraStorage.newMap + private lazy val storage = CassandraStorage.newMap @GET @Produces(Array("text/html")) diff --git a/akka-samples/akka-sample-rest-java/src/main/java/sample/java/PersistentSimpleService.java b/akka-samples/akka-sample-rest-java/src/main/java/sample/java/PersistentSimpleService.java index 24f6ad585e..9a0a38f619 100644 --- a/akka-samples/akka-sample-rest-java/src/main/java/sample/java/PersistentSimpleService.java +++ b/akka-samples/akka-sample-rest-java/src/main/java/sample/java/PersistentSimpleService.java @@ -29,11 +29,12 @@ public class PersistentSimpleService { private String KEY = "COUNTER"; private boolean hasStartedTicking = false; - private PersistentMap storage = CassandraStorage.newMap(); + private PersistentMap storage; @GET @Produces({"application/html"}) public String count() { + if (storage == null) storage = CassandraStorage.newMap(); if (!hasStartedTicking) { storage.put(KEY.getBytes(), ByteBuffer.allocate(2).putInt(0).array()); hasStartedTicking = true; diff --git a/akka-samples/akka-sample-rest-java/src/main/java/sample/java/SimpleService.java b/akka-samples/akka-sample-rest-java/src/main/java/sample/java/SimpleService.java index 69f9e8379f..54468495bc 100644 --- a/akka-samples/akka-sample-rest-java/src/main/java/sample/java/SimpleService.java +++ b/akka-samples/akka-sample-rest-java/src/main/java/sample/java/SimpleService.java @@ -27,11 +27,12 @@ public class SimpleService { private String KEY = "COUNTER"; private boolean hasStartedTicking = false; - private TransactionalMap storage = TransactionalState.newMap(); + private TransactionalMap storage; @GET @Produces({"application/json"}) public String count() { + if (storage == null) storage = TransactionalState.newMap(); if (!hasStartedTicking) { storage.put(KEY, 0); hasStartedTicking = true; diff --git a/akka-samples/akka-sample-rest-scala/src/main/scala/SimpleService.scala b/akka-samples/akka-sample-rest-scala/src/main/scala/SimpleService.scala index 2d83607f2d..39a6a2a0d2 100644 --- a/akka-samples/akka-sample-rest-scala/src/main/scala/SimpleService.scala +++ b/akka-samples/akka-sample-rest-scala/src/main/scala/SimpleService.scala @@ -53,7 +53,7 @@ class SimpleService extends Transactor { case object Tick private val KEY = "COUNTER" private var hasStartedTicking = false - private val storage = TransactionalState.newMap[String, Integer] + private lazy val storage = TransactionalState.newMap[String, Integer] @GET @Produces(Array("text/html")) @@ -105,7 +105,7 @@ class PersistentSimpleService extends Transactor { case object Tick private val KEY = "COUNTER" private var hasStartedTicking = false - private val storage = CassandraStorage.newMap + private lazy val storage = CassandraStorage.newMap @GET @Produces(Array("text/html")) diff --git a/akka-samples/akka-sample-security/src/main/scala/SimpleService.scala b/akka-samples/akka-sample-security/src/main/scala/SimpleService.scala index 853d51e7ad..59e3a5c85e 100644 --- a/akka-samples/akka-sample-security/src/main/scala/SimpleService.scala +++ b/akka-samples/akka-sample-security/src/main/scala/SimpleService.scala @@ -96,7 +96,7 @@ class SecureTickActor extends Actor with Logging { case object Tick private val KEY = "COUNTER" private var hasStartedTicking = false - private val storage = TransactionalState.newMap[String, Integer] + private lazy val storage = TransactionalState.newMap[String, Integer] /** * allow access for any user to "/secureticker/public"