diff --git a/akka-core/src/main/scala/actor/Actor.scala b/akka-core/src/main/scala/actor/Actor.scala
index 976e451216..807355d95e 100644
--- a/akka-core/src/main/scala/actor/Actor.scala
+++ b/akka-core/src/main/scala/actor/Actor.scala
@@ -40,52 +40,56 @@ abstract class RemoteActor(hostname: String, port: Int) extends Actor {
*
* @author Jonas Bonér
*/
-trait SerializableActor[T] extends Actor {
+trait SerializableActor extends Actor {
val serializer: Serializer
def toBinary: Array[Byte]
}
/**
- * Mix in this trait to create a serializable actor, serializable through
- * Protobuf. This trait needs to be mixed in with a Protobuf
- * 'com.google.protobuf.Message' generated class holding the state.
+ * Mix in this trait to create a serializable actor, serializable through
+ * Protobuf.
*
* @author Jonas Bonér
*/
-trait ProtobufSerializableActor[T] extends SerializableActor[T] { this: Message =>
+trait ProtobufSerializableActor[T <: Message] extends SerializableActor {
val serializer = Serializer.Protobuf
- def toBinary: Array[Byte] = this.toByteArray
+ def toBinary: Array[Byte] = toProtobuf.toByteArray
+ def fromBinary(bytes: Array[Byte]) = fromProtobuf(serializer.fromBinary(bytes, Some(clazz)).asInstanceOf[T])
+
+ val clazz: Class[T]
+ def toProtobuf: T
+ def fromProtobuf(message: T): Unit
}
/**
- * Mix in this trait to create a serializable actor, serializable through
+ * Mix in this trait to create a serializable actor, serializable through
* Java serialization.
*
* @author Jonas Bonér
*/
-trait JavaSerializableActor[T] extends SerializableActor[T] {
+trait JavaSerializableActor extends SerializableActor {
@transient val serializer = Serializer.Java
def toBinary: Array[Byte] = serializer.toBinary(this)
}
/**
- * Mix in this trait to create a serializable actor, serializable through
+ * Mix in this trait to create a serializable actor, serializable through
* a Java JSON parser (Jackson).
*
* @author Jonas Bonér
*/
-trait JavaJSONSerializableActor[T] extends SerializableActor[T] {
+trait JavaJSONSerializableActor extends SerializableActor {
val serializer = Serializer.JavaJSON
def toBinary: Array[Byte] = serializer.toBinary(this)
}
/**
- * Mix in this trait to create a serializable actor, serializable through
+ * Mix in this trait to create a serializable actor, serializable through
* a Scala JSON parser (SJSON).
*
* @author Jonas Bonér
*/
-trait ScalaJSONSerializableActor[T] extends SerializableActor[T] {
+trait ScalaJSONSerializableActor extends SerializableActor {
val serializer = Serializer.ScalaJSON
def toBinary: Array[Byte] = serializer.toBinary(this)
}
diff --git a/akka-core/src/main/scala/actor/ActorRef.scala b/akka-core/src/main/scala/actor/ActorRef.scala
index 3a1b315a79..b9bcd08938 100644
--- a/akka-core/src/main/scala/actor/ActorRef.scala
+++ b/akka-core/src/main/scala/actor/ActorRef.scala
@@ -89,9 +89,9 @@ object ActorRef {
def fromBinaryToLocalActorRef(bytes: Array[Byte]): ActorRef =
fromProtobufToLocalActorRef(SerializedActorRefProtocol.newBuilder.mergeFrom(bytes).build, None)
- /**
- * Deserializes a byte array (Array[Byte]) into an LocalActorRef instance.
- */
+ /**
+ * Deserializes a byte array (Array[Byte]) into an LocalActorRef instance.
+ */
def fromBinaryToLocalActorRef(bytes: Array[Byte], loader: ClassLoader): ActorRef =
fromProtobufToLocalActorRef(SerializedActorRefProtocol.newBuilder.mergeFrom(bytes).build, Some(loader))
@@ -334,7 +334,7 @@ trait ActorRef extends TransactionManagement {
/**
* Is the actor is serializable?
*/
- def isSerializable: Boolean = actor.isInstanceOf[SerializableActor[_]]
+ def isSerializable: Boolean = actor.isInstanceOf[SerializableActor]
/**
* Returns the 'Serializer' instance for the Actor as an Option.
@@ -342,7 +342,7 @@ trait ActorRef extends TransactionManagement {
* It returns 'Some(serializer)' if the Actor is serializable and 'None' if not.
*/
def serializer: Option[Serializer] =
- if (isSerializable) Some(actor.asInstanceOf[SerializableActor[_]].serializer)
+ if (isSerializable) Some(actor.asInstanceOf[SerializableActor].serializer)
else None
/**
@@ -695,7 +695,15 @@ sealed class LocalActorRef private[akka](
__hotswap: Option[PartialFunction[Any, Unit]],
__loader: ClassLoader,
__serializer: Serializer) = {
- this(() => __serializer.fromBinary(__actorBytes, Some(__loader.loadClass(__actorClassName))).asInstanceOf[Actor])
+ this(() => {
+ val actorClass = __loader.loadClass(__actorClassName)
+ val actorInstance = actorClass.newInstance
+ if (actorInstance.isInstanceOf[ProtobufSerializableActor[_]]) {
+ val instance = actorInstance.asInstanceOf[ProtobufSerializableActor[_]]
+ instance.fromBinary(__actorBytes)
+ instance
+ } else __serializer.fromBinary(__actorBytes, Some(actorClass)).asInstanceOf[Actor]
+ })
loader = Some(__loader)
isDeserialized = true
_uuid = __uuid
@@ -783,7 +791,7 @@ sealed class LocalActorRef private[akka](
.setUuid(uuid)
.setId(id)
.setActorClassname(actorClass.getName)
- .setActorInstance(ByteString.copyFrom(actor.asInstanceOf[SerializableActor[_]].toBinary))
+ .setActorInstance(ByteString.copyFrom(actor.asInstanceOf[SerializableActor].toBinary))
.setSerializerClassname(serializerClassname)
.setOriginalAddress(originalAddress)
.setIsTransactor(isTransactor)
diff --git a/akka-core/src/main/scala/actor/Scheduler.scala b/akka-core/src/main/scala/actor/Scheduler.scala
index 7bc9f6d48f..41d418c6e8 100644
--- a/akka-core/src/main/scala/actor/Scheduler.scala
+++ b/akka-core/src/main/scala/actor/Scheduler.scala
@@ -30,21 +30,22 @@ object Scheduler {
private var service = Executors.newSingleThreadScheduledExecutor(SchedulerThreadFactory)
private val schedulers = new ConcurrentHashMap[ActorRef, ActorRef]
- def schedule(receiver: ActorRef, message: AnyRef, initialDelay: Long, delay: Long, timeUnit: TimeUnit) = {
+ def schedule(receiver: ActorRef, message: AnyRef, initialDelay: Long, delay: Long, timeUnit: TimeUnit): ActorRef = {
try {
val future = service.scheduleAtFixedRate(
new Runnable { def run = receiver ! message },
initialDelay, delay, timeUnit).asInstanceOf[ScheduledFuture[AnyRef]]
val scheduler = actorOf(new ScheduleActor(future)).start
schedulers.put(scheduler, scheduler)
+ scheduler
} catch {
case e => throw SchedulerException(message + " could not be scheduled on " + receiver, e)
}
}
- def unschedule(actorRef: ActorRef) = {
- actorRef ! UnSchedule
- schedulers.remove(actorRef)
+ def unschedule(scheduleActor: ActorRef) = {
+ scheduleActor ! UnSchedule
+ schedulers.remove(scheduleActor)
}
def shutdown = {
@@ -78,6 +79,4 @@ private object SchedulerThreadFactory extends ThreadFactory {
thread.setDaemon(true)
thread
}
-}
-
-
+}
\ No newline at end of file
diff --git a/akka-core/src/main/scala/util/Logging.scala b/akka-core/src/main/scala/util/Logging.scala
index fc68e27178..8c6ea0fb99 100644
--- a/akka-core/src/main/scala/util/Logging.scala
+++ b/akka-core/src/main/scala/util/Logging.scala
@@ -17,7 +17,7 @@ import java.net.UnknownHostException
* @author Jonas Bonér
*/
trait Logging {
- @transient lazy val log = Logger.get(this.getClass.getName)
+ @sjson.json.JSONProperty(ignore = true) @transient lazy val log = Logger.get(this.getClass.getName)
}
/**
diff --git a/akka-core/src/test/java/se/scalablesolutions/akka/actor/ProtobufProtocol.java b/akka-core/src/test/java/se/scalablesolutions/akka/actor/ProtobufProtocol.java
index 0f9455e13c..8d9ab752ee 100644
--- a/akka-core/src/test/java/se/scalablesolutions/akka/actor/ProtobufProtocol.java
+++ b/akka-core/src/test/java/se/scalablesolutions/akka/actor/ProtobufProtocol.java
@@ -376,11 +376,301 @@ public final class ProtobufProtocol {
// @@protoc_insertion_point(class_scope:se.scalablesolutions.akka.actor.ProtobufPOJO)
}
+ public static final class Counter extends
+ com.google.protobuf.GeneratedMessage {
+ // Use Counter.newBuilder() to construct.
+ private Counter() {
+ initFields();
+ }
+ private Counter(boolean noInit) {}
+
+ private static final Counter defaultInstance;
+ public static Counter getDefaultInstance() {
+ return defaultInstance;
+ }
+
+ public Counter getDefaultInstanceForType() {
+ return defaultInstance;
+ }
+
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return se.scalablesolutions.akka.actor.ProtobufProtocol.internal_static_se_scalablesolutions_akka_actor_Counter_descriptor;
+ }
+
+ protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return se.scalablesolutions.akka.actor.ProtobufProtocol.internal_static_se_scalablesolutions_akka_actor_Counter_fieldAccessorTable;
+ }
+
+ // required uint32 count = 1;
+ public static final int COUNT_FIELD_NUMBER = 1;
+ private boolean hasCount;
+ private int count_ = 0;
+ public boolean hasCount() { return hasCount; }
+ public int getCount() { return count_; }
+
+ private void initFields() {
+ }
+ public final boolean isInitialized() {
+ if (!hasCount) return false;
+ return true;
+ }
+
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ getSerializedSize();
+ if (hasCount()) {
+ output.writeUInt32(1, getCount());
+ }
+ getUnknownFields().writeTo(output);
+ }
+
+ private int memoizedSerializedSize = -1;
+ public int getSerializedSize() {
+ int size = memoizedSerializedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (hasCount()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeUInt32Size(1, getCount());
+ }
+ size += getUnknownFields().getSerializedSize();
+ memoizedSerializedSize = size;
+ return size;
+ }
+
+ public static se.scalablesolutions.akka.actor.ProtobufProtocol.Counter parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return newBuilder().mergeFrom(data).buildParsed();
+ }
+ public static se.scalablesolutions.akka.actor.ProtobufProtocol.Counter 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.actor.ProtobufProtocol.Counter parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return newBuilder().mergeFrom(data).buildParsed();
+ }
+ public static se.scalablesolutions.akka.actor.ProtobufProtocol.Counter parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return newBuilder().mergeFrom(data, extensionRegistry)
+ .buildParsed();
+ }
+ public static se.scalablesolutions.akka.actor.ProtobufProtocol.Counter parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return newBuilder().mergeFrom(input).buildParsed();
+ }
+ public static se.scalablesolutions.akka.actor.ProtobufProtocol.Counter 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.actor.ProtobufProtocol.Counter parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ Builder builder = newBuilder();
+ if (builder.mergeDelimitedFrom(input)) {
+ return builder.buildParsed();
+ } else {
+ return null;
+ }
+ }
+ public static se.scalablesolutions.akka.actor.ProtobufProtocol.Counter parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ Builder builder = newBuilder();
+ if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+ return builder.buildParsed();
+ } else {
+ return null;
+ }
+ }
+ public static se.scalablesolutions.akka.actor.ProtobufProtocol.Counter parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return newBuilder().mergeFrom(input).buildParsed();
+ }
+ public static se.scalablesolutions.akka.actor.ProtobufProtocol.Counter parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return newBuilder().mergeFrom(input, extensionRegistry)
+ .buildParsed();
+ }
+
+ public static Builder newBuilder() { return Builder.create(); }
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder(se.scalablesolutions.akka.actor.ProtobufProtocol.Counter prototype) {
+ return newBuilder().mergeFrom(prototype);
+ }
+ public Builder toBuilder() { return newBuilder(this); }
+
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessage.Builder {
+ private se.scalablesolutions.akka.actor.ProtobufProtocol.Counter result;
+
+ // Construct using se.scalablesolutions.akka.actor.ProtobufProtocol.Counter.newBuilder()
+ private Builder() {}
+
+ private static Builder create() {
+ Builder builder = new Builder();
+ builder.result = new se.scalablesolutions.akka.actor.ProtobufProtocol.Counter();
+ return builder;
+ }
+
+ protected se.scalablesolutions.akka.actor.ProtobufProtocol.Counter internalGetResult() {
+ return result;
+ }
+
+ public Builder clear() {
+ if (result == null) {
+ throw new IllegalStateException(
+ "Cannot call clear() after build().");
+ }
+ result = new se.scalablesolutions.akka.actor.ProtobufProtocol.Counter();
+ return this;
+ }
+
+ public Builder clone() {
+ return create().mergeFrom(result);
+ }
+
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return se.scalablesolutions.akka.actor.ProtobufProtocol.Counter.getDescriptor();
+ }
+
+ public se.scalablesolutions.akka.actor.ProtobufProtocol.Counter getDefaultInstanceForType() {
+ return se.scalablesolutions.akka.actor.ProtobufProtocol.Counter.getDefaultInstance();
+ }
+
+ public boolean isInitialized() {
+ return result.isInitialized();
+ }
+ public se.scalablesolutions.akka.actor.ProtobufProtocol.Counter build() {
+ if (result != null && !isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return buildPartial();
+ }
+
+ private se.scalablesolutions.akka.actor.ProtobufProtocol.Counter buildParsed()
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ if (!isInitialized()) {
+ throw newUninitializedMessageException(
+ result).asInvalidProtocolBufferException();
+ }
+ return buildPartial();
+ }
+
+ public se.scalablesolutions.akka.actor.ProtobufProtocol.Counter buildPartial() {
+ if (result == null) {
+ throw new IllegalStateException(
+ "build() has already been called on this Builder.");
+ }
+ se.scalablesolutions.akka.actor.ProtobufProtocol.Counter returnMe = result;
+ result = null;
+ return returnMe;
+ }
+
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof se.scalablesolutions.akka.actor.ProtobufProtocol.Counter) {
+ return mergeFrom((se.scalablesolutions.akka.actor.ProtobufProtocol.Counter)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(se.scalablesolutions.akka.actor.ProtobufProtocol.Counter other) {
+ if (other == se.scalablesolutions.akka.actor.ProtobufProtocol.Counter.getDefaultInstance()) return this;
+ if (other.hasCount()) {
+ setCount(other.getCount());
+ }
+ this.mergeUnknownFields(other.getUnknownFields());
+ return this;
+ }
+
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+ com.google.protobuf.UnknownFieldSet.newBuilder(
+ this.getUnknownFields());
+ while (true) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ this.setUnknownFields(unknownFields.build());
+ return this;
+ default: {
+ if (!parseUnknownField(input, unknownFields,
+ extensionRegistry, tag)) {
+ this.setUnknownFields(unknownFields.build());
+ return this;
+ }
+ break;
+ }
+ case 8: {
+ setCount(input.readUInt32());
+ break;
+ }
+ }
+ }
+ }
+
+
+ // required uint32 count = 1;
+ public boolean hasCount() {
+ return result.hasCount();
+ }
+ public int getCount() {
+ return result.getCount();
+ }
+ public Builder setCount(int value) {
+ result.hasCount = true;
+ result.count_ = value;
+ return this;
+ }
+ public Builder clearCount() {
+ result.hasCount = false;
+ result.count_ = 0;
+ return this;
+ }
+
+ // @@protoc_insertion_point(builder_scope:se.scalablesolutions.akka.actor.Counter)
+ }
+
+ static {
+ defaultInstance = new Counter(true);
+ se.scalablesolutions.akka.actor.ProtobufProtocol.internalForceInit();
+ defaultInstance.initFields();
+ }
+
+ // @@protoc_insertion_point(class_scope:se.scalablesolutions.akka.actor.Counter)
+ }
+
private static com.google.protobuf.Descriptors.Descriptor
internal_static_se_scalablesolutions_akka_actor_ProtobufPOJO_descriptor;
private static
com.google.protobuf.GeneratedMessage.FieldAccessorTable
internal_static_se_scalablesolutions_akka_actor_ProtobufPOJO_fieldAccessorTable;
+ private static com.google.protobuf.Descriptors.Descriptor
+ internal_static_se_scalablesolutions_akka_actor_Counter_descriptor;
+ private static
+ com.google.protobuf.GeneratedMessage.FieldAccessorTable
+ internal_static_se_scalablesolutions_akka_actor_Counter_fieldAccessorTable;
public static com.google.protobuf.Descriptors.FileDescriptor
getDescriptor() {
@@ -392,7 +682,8 @@ public final class ProtobufProtocol {
java.lang.String[] descriptorData = {
"\n\026ProtobufProtocol.proto\022\037se.scalablesol" +
"utions.akka.actor\"8\n\014ProtobufPOJO\022\n\n\002id\030" +
- "\001 \002(\004\022\014\n\004name\030\002 \002(\t\022\016\n\006status\030\003 \002(\010"
+ "\001 \002(\004\022\014\n\004name\030\002 \002(\t\022\016\n\006status\030\003 \002(\010\"\030\n\007C" +
+ "ounter\022\r\n\005count\030\001 \002(\r"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -407,6 +698,14 @@ public final class ProtobufProtocol {
new java.lang.String[] { "Id", "Name", "Status", },
se.scalablesolutions.akka.actor.ProtobufProtocol.ProtobufPOJO.class,
se.scalablesolutions.akka.actor.ProtobufProtocol.ProtobufPOJO.Builder.class);
+ internal_static_se_scalablesolutions_akka_actor_Counter_descriptor =
+ getDescriptor().getMessageTypes().get(1);
+ internal_static_se_scalablesolutions_akka_actor_Counter_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+ internal_static_se_scalablesolutions_akka_actor_Counter_descriptor,
+ new java.lang.String[] { "Count", },
+ se.scalablesolutions.akka.actor.ProtobufProtocol.Counter.class,
+ se.scalablesolutions.akka.actor.ProtobufProtocol.Counter.Builder.class);
return null;
}
};
diff --git a/akka-core/src/test/protocol/ProtobufProtocol.proto b/akka-core/src/test/protocol/ProtobufProtocol.proto
index 4014652bc3..17e5357750 100644
--- a/akka-core/src/test/protocol/ProtobufProtocol.proto
+++ b/akka-core/src/test/protocol/ProtobufProtocol.proto
@@ -15,3 +15,7 @@ message ProtobufPOJO {
required string name = 2;
required bool status = 3;
}
+
+message Counter {
+ required uint32 count = 1;
+}
diff --git a/akka-core/src/test/scala/SerializableActorSpec.scala b/akka-core/src/test/scala/SerializableActorSpec.scala
index b9303e4fed..a743a5eb0b 100644
--- a/akka-core/src/test/scala/SerializableActorSpec.scala
+++ b/akka-core/src/test/scala/SerializableActorSpec.scala
@@ -9,6 +9,8 @@ import org.scalatest.BeforeAndAfterAll
import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
+import com.google.protobuf.Message
+
@RunWith(classOf[JUnitRunner])
class SerializableActorSpec extends
Spec with
@@ -19,19 +21,95 @@ class SerializableActorSpec extends
it("should be able to serialize and deserialize a JavaSerializableActor") {
val actor1 = actorOf[JavaSerializableTestActor].start
val serializer = actor1.serializer.getOrElse(fail("Serializer not defined"))
- (actor1 !! "hello").getOrElse("_") should equal("world")
+ (actor1 !! "hello").getOrElse("_") should equal("world 1")
val bytes = actor1.toBinary
val actor2 = ActorRef.fromBinaryToLocalActorRef(bytes)
actor2.start
- (actor2 !! "hello").getOrElse("_") should equal("world")
+ (actor2 !! "hello").getOrElse("_") should equal("world 2")
}
+
+ it("should be able to serialize and deserialize a ProtobufSerializableActor") {
+ val actor1 = actorOf[ProtobufSerializableTestActor].start
+ val serializer = actor1.serializer.getOrElse(fail("Serializer not defined"))
+ (actor1 !! "hello").getOrElse("_") should equal("world 1")
+ (actor1 !! "hello").getOrElse("_") should equal("world 2")
+
+ val bytes = actor1.toBinary
+ val actor2 = ActorRef.fromBinaryToLocalActorRef(bytes)
+
+ actor2.start
+ (actor2 !! "hello").getOrElse("_") should equal("world 3")
+ }
+
+
+/*
+ it("should be able to serialize and deserialize a JavaJSONSerializableActor") {
+ val actor1 = actorOf[JavaJSONSerializableTestActor].start
+ val serializer = actor1.serializer.getOrElse(fail("Serializer not defined"))
+ (actor1 !! "hello").getOrElse("_") should equal("world 1")
+ (actor1 !! "hello").getOrElse("_") should equal("world 2")
+
+ val bytes = actor1.toBinary
+ val actor2 = ActorRef.fromBinaryToLocalActorRef(bytes)
+
+ actor2.start
+ (actor2 !! "hello").getOrElse("_") should equal("world 3")
+ }
+
+ it("should be able to serialize and deserialize a ScalaJSONSerializableActor") {
+ val actor1 = actorOf[ScalaJSONSerializableTestActor].start
+ val serializer = actor1.serializer.getOrElse(fail("Serializer not defined"))
+ (actor1 !! "hello").getOrElse("_") should equal("world 1")
+
+ val bytes = actor1.toBinary
+ val actor2 = ActorRef.fromBinaryToLocalActorRef(bytes)
+
+ actor2.start
+ (actor2 !! "hello").getOrElse("_") should equal("world 2")
+ }
+*/
}
}
-@serializable class JavaSerializableTestActor extends JavaSerializableActor[JavaSerializableTestActor] {
+@serializable class JavaSerializableTestActor extends JavaSerializableActor {
+ private var count = 0
def receive = {
- case "hello" => reply("world")
+ case "hello" =>
+ count = count + 1
+ self.reply("world " + count)
+ }
+}
+
+class ProtobufSerializableTestActor extends ProtobufSerializableActor[ProtobufProtocol.Counter] {
+ val clazz = classOf[ProtobufProtocol.Counter]
+ private var count = 0
+
+ def toProtobuf = ProtobufProtocol.Counter.newBuilder.setCount(count).build
+ def fromProtobuf(message: ProtobufProtocol.Counter) = count = message.getCount
+
+ def receive = {
+ case "hello" =>
+ count = count + 1
+ self.reply("world " + count)
+ }
+}
+
+class JavaJSONSerializableTestActor extends JavaJSONSerializableActor {
+ private var count = 0
+ def receive = {
+ case "hello" =>
+ count = count + 1
+ self.reply("world " + count)
+ }
+}
+
+@scala.reflect.BeanInfo class ScalaJSONSerializableTestActor extends ScalaJSONSerializableActor {
+ private var count = 0
+ def receive = {
+ case "hello" =>
+ count = count + 1
+ self.reply("world " + count)
}
}
\ No newline at end of file
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 648dec2be3..97419f3231 100644
--- a/akka-persistence/akka-persistence-cassandra/src/test/scala/CassandraPersistentActorSpec.scala
+++ b/akka-persistence/akka-persistence-cassandra/src/test/scala/CassandraPersistentActorSpec.scala
@@ -150,7 +150,7 @@ class CassandraPersistentActorSpec extends JUnitSuite {
}
/*
import org.apache.cassandra.service.CassandraDaemon
-object EmbeddedCassandraService {
+object // EmbeddedCassandraService {
System.setProperty("storage-config", "src/test/resources");