completed protobuf protocol for remoting

This commit is contained in:
jboner 2009-07-18 00:16:32 +02:00
parent a4d22af64b
commit f26110e55c
23 changed files with 795 additions and 385 deletions

15
LICENSE Normal file
View file

@ -0,0 +1,15 @@
This software is licensed under the Apache 2 license, quoted below.
Copyright 2009 Scalable Solutions AB <http://scalablesolutions.se>
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under
the License.

View file

@ -1202,17 +1202,6 @@
<root url="jar://$MAVEN_REPOSITORY$/org/scala-tools/testing/scalatest/0.9.5/scalatest-0.9.5-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.jteigen.scalatest:junit4runner:1.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/jteigen/scalatest/junit4runner/1.0/junit4runner-1.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/jteigen/scalatest/junit4runner/1.0/junit4runner-1.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/jteigen/scalatest/junit4runner/1.0/junit4runner-1.0-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.scala-lang:scala-library:2.7.5">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.5/scala-library-2.7.5.jar!/" />
@ -1445,6 +1434,17 @@
<root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/2.1.0/protobuf-java-2.1.0-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: sbinary:sbinary:0.3-alpha">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/sbinary/sbinary/0.3-alpha/sbinary-0.3-alpha.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/sbinary/sbinary/0.3-alpha/sbinary-0.3-alpha-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/sbinary/sbinary/0.3-alpha/sbinary-0.3-alpha-sources.jar!/" />
</SOURCES>
</library>
</component>
<UsedPathMacros>
<macro name="MAVEN_REPOSITORY" description="Maven Local Repostiry" />

592
akka.iws
View file

@ -9,21 +9,24 @@
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/akka-kernel.iml" afterPath="$PROJECT_DIR$/kernel/akka-kernel.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/akka-util-java-0.5.jar" afterPath="$PROJECT_DIR$/lib/akka-util-java-0.5.jar" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/fun-test-java/akka-fun-test-java.iml" afterPath="$PROJECT_DIR$/fun-test-java/akka-fun-test-java.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/RemoteActorSpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/RemoteActorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/samples-scala/akka-samples-scala.iml" afterPath="$PROJECT_DIR$/samples-scala/akka-samples-scala.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/CamelSpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/CamelSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/util-java/akka-util-java.iml" afterPath="$PROJECT_DIR$/util-java/akka-util-java.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/pom.xml" afterPath="$PROJECT_DIR$/kernel/pom.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java" afterPath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto" afterPath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/util-java/pom.xml" afterPath="$PROJECT_DIR$/util-java/pom.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" />
<change type="DELETED" beforePath="$PROJECT_DIR$/lib/protobuf-java-2.0.3.jar" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/samples-java/akka-samples-java.iml" afterPath="$PROJECT_DIR$/samples-java/akka-samples-java.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/README.textile" afterPath="$PROJECT_DIR$/README.textile" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala" />
</list>
<list readonly="true" id="6e842704-fac6-40e9-8a67-d02385f87db9" name="Default" comment="&#10;# Brief commit desciption here&#10;&#10;# Full commit description here (comment lines starting with '#' will not be included)&#10;&#10;" />
<ignored path=".idea/workspace.xml" />
@ -44,7 +47,46 @@
</component>
<component name="DebuggerManager">
<line_breakpoints>
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" line="48" class="Class at Serializer.scala:48" package="">
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" line="118" class="Class at RemoteServer.scala:118" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" line="111" class="Class at RemoteServer.scala:111" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" line="434" class="Class at Actor.scala:430" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" line="413" class="Class at Actor.scala:409" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
@ -120,82 +162,10 @@
<component name="FileColors" enabled="false" enabledForTabs="false" />
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="ActiveObject.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala">
<file leaf-file-name="RemoteSupervisorSpec.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="56" selection-start="362" selection-end="362" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="README.textile" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/README.textile">
<provider selected="true" editor-type-id="text-editor">
<state line="52" column="22" selection-start="3243" selection-end="3243" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="pom.xml" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="47" column="84" selection-start="1657" selection-end="1657" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="pom.xml" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/util-java/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="24" selection-start="954" selection-end="954" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteClient.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="154" column="0" selection-start="6361" selection-end="6361" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteServer.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="112" column="0" selection-start="4564" selection-end="4765" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteProtocol.proto" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto">
<provider selected="true" editor-type-id="text-editor">
<state line="51" column="33" selection-start="1162" selection-end="1162" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RequestReply.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="15" column="20" selection-start="325" selection-end="325" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Actor.scala" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="396" column="29" selection-start="14373" selection-end="14373" vertical-scroll-proportion="8.775623">
<state line="22" column="6" selection-start="544" selection-end="544" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@ -204,7 +174,79 @@
<file leaf-file-name="Serializer.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="42" column="21" selection-start="1093" selection-end="1107" vertical-scroll-proportion="0.0">
<state line="68" column="12" selection-start="2009" selection-end="2009" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteServer.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="182" column="3" selection-start="8098" selection-end="8098" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="SimpleChannelUpstreamHandler.java" pinned="false" current="false" current-in-tab="false">
<entry file="jar://$MAVEN_REPOSITORY$/org/jboss/netty/netty/3.1.0.CR1/netty-3.1.0.CR1-sources.jar!/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java">
<provider selected="true" editor-type-id="text-editor">
<state line="132" column="0" selection-start="5170" selection-end="5170" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Actor.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="36" column="62" selection-start="1366" selection-end="1366" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="pom.xml" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/kernel/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="81" column="24" selection-start="2869" selection-end="2869" vertical-scroll-proportion="0.3256445">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteProtocol.proto" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="0" selection-start="990" selection-end="990" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ActiveObject.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="441" column="48" selection-start="20020" selection-end="20020" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RequestReply.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="14" column="63" selection-start="398" selection-end="398" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteClient.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="142" column="35" selection-start="5897" selection-end="5907" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@ -223,22 +265,22 @@
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
<option value="$PROJECT_DIR$/kernel/src/main/scala/state/CassandraStorage.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/jersey/NodeWriter.scala" />
<option value="$PROJECT_DIR$/config/akka-reference.conf" />
<option value="$PROJECT_DIR$/README" />
<option value="$PROJECT_DIR$/config/storage-conf.xml" />
<option value="$PROJECT_DIR$/samples-scala/src/main/scala/SimpleService.scala" />
<option value="$PROJECT_DIR$/README.textile" />
<option value="$PROJECT_DIR$/util-java/pom.xml" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/CamelSpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/RemoteActorSpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" />
<option value="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" />
<option value="$PROJECT_DIR$/README.textile" />
<option value="$PROJECT_DIR$/kernel/pom.xml" />
<option value="$PROJECT_DIR$/util-java/pom.xml" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" />
<option value="$PROJECT_DIR$/kernel/pom.xml" />
</list>
</option>
</component>
@ -303,6 +345,88 @@
<option name="myItemId" value="akka-util-java" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka-util-java" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Maven: com.google.protobuf:protobuf-java:2.1.0" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf-java-2.1.0.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka-util-java" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Maven: com.google.protobuf:protobuf-java:2.1.0" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf-java-2.1.0.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka-util-java" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Maven: com.google.protobuf:protobuf-java:2.1.0" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf-java-2.1.0.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ByteString" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ClassTreeNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
@ -473,6 +597,10 @@
<option name="myItemId" value="akka-kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
@ -505,6 +633,14 @@
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="test" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="scala" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
@ -562,6 +698,36 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka-kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="main" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="scala" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="reactor" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
@ -622,6 +788,36 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka-kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="main" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="scala" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="config" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
@ -707,6 +903,92 @@
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="&lt; 1.6 &gt;" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="&lt; 1.6 &gt;" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="classes.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="&lt; 1.6 &gt;" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="classes.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="lang" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="&lt; 1.6 &gt;" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="classes.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="lang" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="RuntimeException" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ClassTreeNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
@ -788,7 +1070,7 @@
<recent name="actor" />
</key>
</component>
<component name="RunManager" selected="JUnit.All Tests Java">
<component name="RunManager" selected="JUnit.RemoteSupervisorSpec">
<configuration default="false" name="InMemoryStateTest.testRefShouldRollbackStateForStatefulServerInCaseOfFailure" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
<pattern>
<option name="PATTERN" value="se.scalablesolutions.akka.api.*" />
@ -1964,9 +2246,8 @@
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="9" side_tool="false" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4362245" sideWeight="0.0" order="2" side_tool="false" x="4" y="22" width="1436" height="878" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="6" side_tool="false" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.23576063" sideWeight="0.55484694" order="1" side_tool="false" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.18529199" sideWeight="0.55484694" order="1" side_tool="false" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39795917" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32142857" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.16818425" sideWeight="0.24354243" order="0" side_tool="true" x="1609" y="144" width="252" height="862" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32694763" sideWeight="0.5" order="13" side_tool="false" />
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32822478" sideWeight="0.5" order="16" side_tool="false" />
@ -1978,8 +2259,9 @@
<window_info id="Clojure REPL" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="8" side_tool="false" />
<window_info id="Data Sources" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3294881" sideWeight="0.6875" order="3" side_tool="false" />
<window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.26479077" sideWeight="0.24617347" order="2" side_tool="true" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32142857" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3265306" sideWeight="0.0" order="14" side_tool="false" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="FindBugs-IDEA" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32976654" sideWeight="0.5" order="12" side_tool="false" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24965987" sideWeight="0.5" order="2" side_tool="false" />
@ -2021,116 +2303,114 @@
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="14" selection-start="1697" selection-end="1697" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/jersey/NodeWriter.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="17" column="6" selection-start="379" selection-end="379" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/storage-conf.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="49" column="0" selection-start="1853" selection-end="1853" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/stm/Transaction.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="58" column="0" selection-start="1705" selection-end="1705" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/samples-scala/src/main/scala/SimpleService.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="29" column="50" selection-start="911" selection-end="911" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java">
<provider selected="true" editor-type-id="text-editor">
<state line="327" column="31" selection-start="13195" selection-end="13195" vertical-scroll-proportion="0.0">
<state line="305" column="0" selection-start="12209" selection-end="12209" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto">
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="51" column="33" selection-start="1162" selection-end="1162" vertical-scroll-proportion="0.0">
<state line="21" column="3" selection-start="587" selection-end="587" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="jar:///System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/../Classes/classes.jar!/java/lang/RuntimeException.class">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.5/scala-library-2.7.5-sources.jar!/scala/Predef.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="50" column="60" selection-start="1908" selection-end="1908" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/Future.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/RemoteActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="6" selection-start="652" selection-end="652" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="6" selection-start="544" selection-end="544" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="42" column="21" selection-start="1093" selection-end="1107" vertical-scroll-proportion="0.0">
<state line="68" column="12" selection-start="2009" selection-end="2009" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala">
<entry file="jar://$MAVEN_REPOSITORY$/org/jboss/netty/netty/3.1.0.CR1/netty-3.1.0.CR1-sources.jar!/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java">
<provider selected="true" editor-type-id="text-editor">
<state line="15" column="20" selection-start="325" selection-end="325" vertical-scroll-proportion="0.0">
<state line="132" column="0" selection-start="5170" selection-end="5170" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala">
<entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto">
<provider selected="true" editor-type-id="text-editor">
<state line="154" column="0" selection-start="6361" selection-end="6361" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="112" column="0" selection-start="4564" selection-end="4765" vertical-scroll-proportion="0.0">
<state line="46" column="0" selection-start="990" selection-end="990" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="56" selection-start="362" selection-end="362" vertical-scroll-proportion="0.0">
<state line="441" column="48" selection-start="20020" selection-end="20020" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/README.textile">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="52" column="22" selection-start="3243" selection-end="3243" vertical-scroll-proportion="0.0">
<state line="14" column="63" selection-start="398" selection-end="398" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/util-java/pom.xml">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="24" selection-start="954" selection-end="954" vertical-scroll-proportion="0.0">
<state line="142" column="35" selection-start="5897" selection-end="5907" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/pom.xml">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="47" column="84" selection-start="1657" selection-end="1657" vertical-scroll-proportion="0.0">
<state line="182" column="3" selection-start="8098" selection-end="8098" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="396" column="29" selection-start="14373" selection-end="14373" vertical-scroll-proportion="8.775623">
<state line="36" column="62" selection-start="1366" selection-end="1366" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="81" column="24" selection-start="2869" selection-end="2869" vertical-scroll-proportion="0.3256445">
<folding />
</state>
</provider>

View file

@ -41,6 +41,7 @@
<orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: sbinary:sbinary:0.3-alpha" level="project" />
<orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" />

View file

@ -57,6 +57,7 @@
<orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: sbinary:sbinary:0.3-alpha" level="project" />
<orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" />
@ -82,7 +83,6 @@
<orderEntry type="library" exported="" name="Maven: org.slf4j:slf4j-api:1.4.3" level="project" />
<orderEntry type="library" exported="" name="Maven: log4j:log4j:1.2.13" level="project" />
<orderEntry type="library" name="Maven: org.scala-tools.testing:scalatest:0.9.5" level="project" />
<orderEntry type="library" name="Maven: com.jteigen.scalatest:junit4runner:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.sun.jersey:jersey-client:1.1.0-ea" level="project" />
</component>
</module>

View file

@ -76,6 +76,11 @@
<artifactId>protobuf-java</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>sbinary</groupId>
<artifactId>sbinary</artifactId>
<version>0.3</version>
</dependency>
<!-- For Cassandra -->
<dependency>
@ -155,12 +160,12 @@
<version>0.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<!--dependency>
<groupId>com.jteigen.scalatest</groupId>
<artifactId>junit4runner</artifactId>
<version>1.0</version>
<scope>test</scope>
</dependency>
</dependency-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>

View file

@ -4,16 +4,16 @@
package se.scalablesolutions.akka.kernel.actor
import com.google.protobuf.ByteString
import java.io.File
import java.lang.reflect.{InvocationTargetException, Method}
import java.net.InetSocketAddress
import kernel.config.ScalaConfig._
import kernel.reactor.{MessageDispatcher, FutureResult}
import kernel.util.{HashCode, Serializer, JSONSerializer}
import kernel.nio.RemoteRequestIdFactory
import kernel.config.JavaConfig.RestartCallbacks
import kernel.nio.protobuf.RemoteProtocol.RemoteRequest
import kernel.util.{HashCode, Serializer, JavaJSONSerializer}
import kernel.nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
import kernel.nio.{RemoteClient, RemoteServer, RemoteRequestIdFactory}
import org.codehaus.aspectwerkz.intercept.{Advisable, AroundAdvice}
import org.codehaus.aspectwerkz.joinpoint.{MethodRtti, JoinPoint}
@ -38,8 +38,6 @@ object Annotations {
*/
class ActiveObjectFactory {
protected[this] val serializer: Serializer = JSONSerializer
// FIXME How to pass the MessageDispatcher on from active object to child???????
def newInstance[T](target: Class[T], timeout: Long): T =
@ -257,6 +255,8 @@ sealed class ActorAroundAdvice(val target: Class[_],
val actor: Dispatcher,
val remoteAddress: Option[InetSocketAddress],
val timeout: Long) extends AroundAdvice {
private val serializer: Serializer = JavaJSONSerializer
val id = target.getName
actor.timeout = timeout
actor.start
@ -281,19 +281,24 @@ sealed class ActorAroundAdvice(val target: Class[_],
private def remoteDispatch(joinpoint: JoinPoint): AnyRef = {
val rtti = joinpoint.getRtti.asInstanceOf[MethodRtti]
val oneWay = isOneWay(rtti)
val message = rtti.getParameterValues
val (message: AnyRef, isEscaped) = escapeArguments(rtti.getParameterValues)
val supervisorId = {
val id = actor.registerSupervisorAsRemoteActor
if (id.isDefined) id.get
else null
}
val request = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId)
.setMessage(serializer.out(message))
.setMessageType(message.getClass.getName)
.setMethod(rtti.getMethod.getName)
.setTarget(target.getName)
.setTimeout(timeout)
.setSupervisorUuid(actor.registerSupervisorAsRemoteActor)
.setIsActor(false)
.setIsOneWay(oneWay)
.setIsEscaped(false)
.build
.setId(RemoteRequestIdFactory.nextId)
.setMessage(ByteString.copyFrom(serializer.out(message)))
.setMessageType(message.getClass.getName)
.setMethod(rtti.getMethod.getName)
.setTarget(target.getName)
.setTimeout(timeout)
.setSupervisorUuid(supervisorId)
.setIsActor(false)
.setIsOneWay(oneWay)
.setIsEscaped(false)
.build
val future = RemoteClient.clientFor(remoteAddress.get).send(request)
if (oneWay) null // for void methods
else {
@ -315,6 +320,18 @@ sealed class ActorAroundAdvice(val target: Class[_],
private def isOneWay(rtti: MethodRtti) =
rtti.getMethod.getReturnType == java.lang.Void.TYPE ||
rtti.getMethod.isAnnotationPresent(Annotations.oneway)
private def escapeArguments(args: Array[Object]): Tuple2[Array[Object], Boolean] = {
var isEscaped = false
val escapedArgs = for (arg <- args) yield {
val clazz = arg.getClass
if (clazz.getName.contains("$$ProxiedByAW")) {
isEscaped = true
"$$ProxiedByAW" + clazz.getSuperclass.getName
} else arg
}
(escapedArgs, isEscaped)
}
}
/**
@ -414,12 +431,14 @@ private[kernel] class Dispatcher(val callbacks: Option[RestartCallbacks]) extend
var hasMutableArgument = false
for (arg <- args.toList) {
if (!arg.isInstanceOf[String] &&
!arg.isInstanceOf[Byte] &&
!arg.isInstanceOf[Int] &&
!arg.isInstanceOf[Long] &&
!arg.isInstanceOf[Float] &&
!arg.isInstanceOf[Double] &&
!arg.isInstanceOf[Boolean] &&
!arg.isInstanceOf[Char] &&
!arg.isInstanceOf[java.lang.Byte] &&
!arg.isInstanceOf[java.lang.Integer] &&
!arg.isInstanceOf[java.lang.Long] &&
!arg.isInstanceOf[java.lang.Float] &&

View file

@ -4,6 +4,7 @@
package se.scalablesolutions.akka.kernel.actor
import com.google.protobuf.ByteString
import java.net.InetSocketAddress
import java.util.concurrent.CopyOnWriteArraySet
@ -11,9 +12,10 @@ import kernel.reactor._
import kernel.config.ScalaConfig._
import kernel.stm.TransactionManagement
import kernel.util.Helpers.ReadWriteLock
import kernel.util.{Serializer, JSONSerializer, Logging}
import kernel.nio._
import kernel.util.{Serializer, ScalaJSONSerializer, Logging}
import kernel.nio.protobuf._
import kernel.nio.{RemoteServer, RemoteClient, RemoteRequestIdFactory}
import nio.protobuf.RemoteProtocol.RemoteRequest
sealed abstract class LifecycleMessage
@ -34,6 +36,10 @@ class ActorMessageInvoker(val actor: Actor) extends MessageInvoker {
def invoke(handle: MessageInvocation) = actor.invoke(handle)
}
def deserialize(array : Array[Byte]) : MediaContent = fromByteArray[MediaContent](array)
def serialize(content : MediaContent) : Array[Byte] = toByteArray(content)
object Actor {
val TIMEOUT = kernel.Kernel.config.getInt("akka.actor.timeout", 5000)
val SERIALIZE_MESSAGES = kernel.Kernel.config.getBool("akka.actor.serialize-messages", false)
@ -44,6 +50,7 @@ trait Actor extends Logging with TransactionManagement {
private[this] val remoteFlagLock = new ReadWriteLock
private[this] val transactionalFlagLock = new ReadWriteLock
private var hotswap: Option[PartialFunction[Any, Unit]] = None
private var config: Option[AnyRef] = None
@volatile protected[this] var isTransactional = false
@ -54,7 +61,7 @@ trait Actor extends Logging with TransactionManagement {
protected[this] val linkedActors = new CopyOnWriteArraySet[Actor]
protected[actor] var lifeCycleConfig: Option[LifeCycle] = None
protected[this] val serializer: Serializer = JSONSerializer
protected[this] val serializer: Serializer = ScalaJSONSerializer
// ====================================
// ==== USER CALLBACKS TO OVERRIDE ====
@ -312,6 +319,7 @@ trait Actor extends Logging with TransactionManagement {
if (!linkedActors.contains(actor)) throw new IllegalStateException("Actor [" + actor + "] is not a linked actor, can't unlink")
linkedActors.remove(actor)
actor.supervisor = None
log.debug("Unlinking actor [%s] from actor [%s]", actor, this)
} else throw new IllegalStateException("Actor has not been started, you need to invoke 'actor.start' before using it")
}
@ -393,19 +401,18 @@ trait Actor extends Logging with TransactionManagement {
private def postMessageToMailbox(message: AnyRef): Unit = remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime
if (remoteAddress.isDefined) {
val request = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId)
.setMessage(serializer.out(message))
.setMessageType(message.getClass.getName)
.setMethod(null)
.setTarget(this.getClass.getName)
.setTimeout(timeout)
.setSupervisorUuid(registerSupervisorAsRemoteActor)
.setIsActor(true)
.setIsOneWay(true)
.setIsEscaped(false)
.build
RemoteClient.clientFor(remoteAddress.get).send(request)
val requestBuilder = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId)
.setMessage(ByteString.copyFrom(serializer.out(message)))
.setMessageType(message.getClass.getName)
.setTarget(this.getClass.getName)
.setTimeout(timeout)
.setIsActor(true)
.setIsOneWay(true)
.setIsEscaped(false)
val id = registerSupervisorAsRemoteActor
if (id.isDefined) requestBuilder.setSupervisorUuid(id.get)
RemoteClient.clientFor(remoteAddress.get).send(requestBuilder.build)
} else {
val handle = new MessageInvocation(this, message, None, TransactionManagement.threadBoundTx.get)
mailbox.append(handle)
@ -415,19 +422,18 @@ trait Actor extends Logging with TransactionManagement {
private def postMessageToMailboxAndCreateFutureResultWithTimeout(message: AnyRef, timeout: Long): CompletableFutureResult = remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime
if (remoteAddress.isDefined) {
val request = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId)
.setMessage(serializer.out(message))
.setMethod(null)
.setMessageType(message.getClass.getName)
.setTarget(this.getClass.getName)
.setTimeout(timeout)
.setSupervisorUuid(registerSupervisorAsRemoteActor)
.setIsActor(true)
.setIsOneWay(false)
.setIsEscaped(false)
.build
val future = RemoteClient.clientFor(remoteAddress.get).send(request)
val requestBuilder = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId)
.setMessage(ByteString.copyFrom(serializer.out(message)))
.setMessageType(message.getClass.getName)
.setTarget(this.getClass.getName)
.setTimeout(timeout)
.setIsActor(true)
.setIsOneWay(false)
.setIsEscaped(false)
val id = registerSupervisorAsRemoteActor
if (id.isDefined) requestBuilder.setSupervisorUuid(id.get)
val future = RemoteClient.clientFor(remoteAddress.get).send(requestBuilder.build)
if (future.isDefined) future.get
else throw new IllegalStateException("Expected a future from remote call to actor " + toString)
} else {
@ -579,25 +585,31 @@ trait Actor extends Logging with TransactionManagement {
dispatcher.registerHandler(this, new ActorMessageInvoker(this))
}
/*
private def serializeMessage(message: AnyRef): AnyRef = if (Actor.SERIALIZE_MESSAGES) {
if (!message.isInstanceOf[String] &&
!message.isInstanceOf[Byte] &&
!message.isInstanceOf[Int] &&
!message.isInstanceOf[Long] &&
!message.isInstanceOf[Float] &&
!message.isInstanceOf[Double] &&
!message.isInstanceOf[Boolean] &&
!message.isInstanceOf[Char] &&
!message.isInstanceOf[java.lang.Integer] &&
!message.isInstanceOf[java.lang.Long] &&
!message.isInstanceOf[java.lang.Float] &&
!message.isInstanceOf[java.lang.Double] &&
!message.isInstanceOf[java.lang.Boolean] &&
!message.isInstanceOf[java.lang.Character] &&
!message.isInstanceOf[Tuple2[_,_]] &&
!message.isInstanceOf[Tuple3[_,_,_]] &&
!message.isInstanceOf[Tuple4[_,_,_,_]] &&
!message.isInstanceOf[Tuple5[_,_,_,_,_]] &&
!message.isInstanceOf[Tuple6[_,_,_,_,_,_]] &&
!message.isInstanceOf[Tuple7[_,_,_,_,_,_,_]] &&
!message.isInstanceOf[Tuple8[_,_,_,_,_,_,_,_]] &&
!message.isInstanceOf[Array[_]] &&
!message.isInstanceOf[List[_]] &&
!message.isInstanceOf[scala.collection.immutable.Map[_,_]] &&
!message.isInstanceOf[scala.collection.immutable.Set[_]] &&
!message.isInstanceOf[scala.collection.immutable.Tree[_,_]] &&
!message.getClass.isAnnotationPresent(Annotations.immutable)) {
serializer.deepClone(message)
} else message
} else message
*/
override def toString(): String = "Actor[" + uuid + ":" + id + "]"
}

View file

@ -7,15 +7,18 @@ package se.scalablesolutions.akka.kernel.nio
import java.net.InetSocketAddress
import java.util.concurrent.{Executors, ConcurrentMap, ConcurrentHashMap}
import kernel.nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
import kernel.actor.{Exit, Actor}
import kernel.reactor.{DefaultCompletableFutureResult, CompletableFutureResult}
import kernel.util.{JSONSerializer, Logging}
import kernel.util.{Serializer, ScalaJSONSerializer, JavaJSONSerializer, Logging}
import org.jboss.netty.bootstrap.ClientBootstrap
import org.jboss.netty.channel._
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory
import org.jboss.netty.handler.codec.serialization.{ObjectEncoder, ObjectDecoder}
import org.jboss.netty.bootstrap.ClientBootstrap
import org.jboss.netty.handler.codec.frame.{LengthFieldBasedFrameDecoder, LengthFieldPrepender}
import org.jboss.netty.handler.codec.protobuf.{ProtobufDecoder, ProtobufEncoder}
import protobuf.RemoteProtocol.RemoteReply
import protobuf.RemoteProtocol
import scala.collection.mutable.HashMap
object RemoteClient extends Logging {
@ -45,9 +48,8 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
Executors.newCachedThreadPool)
private val bootstrap = new ClientBootstrap(channelFactory)
private val handler = new RemoteClientHandler(futures, supervisors)
bootstrap.getPipeline.addLast("handler", handler)
bootstrap.setPipelineFactory(new RemoteClientPipelineFactory(futures, supervisors))
bootstrap.setOption("tcpNoDelay", true)
bootstrap.setOption("keepAlive", true)
@ -76,15 +78,14 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
}
def send(request: RemoteRequest): Option[CompletableFutureResult] = if (isRunning) {
val escapedRequest = request//escapeRequest(request)
if (escapedRequest.isOneWay) {
connection.getChannel.write(escapedRequest)
if (request.getIsOneWay) {
connection.getChannel.write(request)
None
} else {
futures.synchronized {
val futureResult = new DefaultCompletableFutureResult(request.timeout)
futures.put(request.id, futureResult)
connection.getChannel.write(escapedRequest)
val futureResult = new DefaultCompletableFutureResult(request.getTimeout)
futures.put(request.getId, futureResult)
connection.getChannel.write(request)
Some(futureResult)
}
}
@ -99,20 +100,18 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
else supervisors.remove(actor.supervisor.get.uuid)
def deregisterSupervisorWithUuid(uuid: String) = supervisors.remove(uuid)
}
private def escapeRequest(request: RemoteRequest) = {
if (request.message.isInstanceOf[Array[Object]]) {
val args = request.message.asInstanceOf[Array[Object]].toList.asInstanceOf[scala.List[Object]]
var isEscaped = false
val escapedArgs = for (arg <- args) yield {
val clazz = arg.getClass
if (clazz.getName.contains("$$ProxiedByAW")) {
isEscaped = true
new ProxyWrapper(clazz.getSuperclass.getName)
} else arg
}
request.cloneWithNewMessage(escapedArgs, isEscaped)
} else request
class RemoteClientPipelineFactory(futures: ConcurrentMap[Long, CompletableFutureResult],
supervisors: ConcurrentMap[String, Actor]) extends ChannelPipelineFactory {
def getPipeline: ChannelPipeline = {
val p = Channels.pipeline()
p.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4));
p.addLast("protobufDecoder", new ProtobufDecoder(RemoteProtocol.RemoteReply.getDefaultInstance));
p.addLast("frameEncoder", new LengthFieldPrepender(4));
p.addLast("protobufEncoder", new ProtobufEncoder());
p.addLast("handler", new RemoteClientHandler(futures, supervisors))
p
}
}
@ -128,41 +127,36 @@ class RemoteClientHandler(val futures: ConcurrentMap[Long, CompletableFutureResu
super.handleUpstream(ctx, event)
}
override def channelOpen(ctx: ChannelHandlerContext, event: ChannelStateEvent) = {
//event.getChannel.getPipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4));
//event.getChannel.getPipeline.addLast("protobufDecoder", new ProtobufDecoder(LocalTimeProtocol.LocalTimes.getDefaultInstance()));
//event.getChannel.getPipeline.addLast("frameEncoder", new LengthFieldPrepender(4));
//event.getChannel.getPipeline.addLast("protobufEncoder", new ProtobufEncoder());
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]
log.debug("Received RemoteReply[\n%s]", reply.toString)
val future = futures.get(reply.getId)
val messageBytes = reply.getMessage
val messageType = reply.getMessageType
val messageClass = Class.forName(messageType)
val message = JSONSerializer.in(messageBytes, messageClass)
if (reply.successful) future.completeWithResult(message)
else {
val supervisorUuid = reply.getSupervisorUuid
if (supervisorUuid != null) {
if (reply.getIsSuccessful) {
val messageBytes = reply.getMessage.toByteArray
val messageType = reply.getMessageType
val messageClass = Class.forName(messageType)
val message =
if (reply.isActor) ScalaJSONSerializer.in(messageBytes, Some(messageClass))
else JavaJSONSerializer.in(messageBytes, Some(messageClass))
future.completeWithResult(message)
} else {
if (reply.hasSupervisorUuid) {
val supervisorUuid = reply.getSupervisorUuid
if (!supervisors.containsKey(supervisorUuid)) throw new IllegalStateException("Expected a registered supervisor for UUID [" + supervisorUuid + "] but none was found")
val supervisedActor = supervisors.get(supervisorUuid)
if (!supervisedActor.supervisor.isDefined) throw new IllegalStateException("Can't handle restart for remote actor " + supervisedActor + " since its supervisor has been removed")
else supervisedActor.supervisor.get ! Exit(supervisedActor, new RuntimeException(reply.getException))
}
future.completeWithException(null, new RuntimeException(reply.getException))
val exception = reply.getException
val exceptionType = Class.forName(exception.substring(0, exception.indexOf('$')))
val exceptionMessage = exception.substring(exception.indexOf('$') + 1, exception.length)
val exceptionInstance = exceptionType
.getConstructor(Array[Class[_]](classOf[String]): _*)
.newInstance(exceptionMessage).asInstanceOf[Throwable]
future.completeWithException(null, exceptionInstance)
}
futures.remove(reply.getId)
} else throw new IllegalArgumentException("Unknown message received in remote client handler: " + result)
@ -175,6 +169,7 @@ class RemoteClientHandler(val futures: ConcurrentMap[Long, CompletableFutureResu
override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) {
log.error("Unexpected exception from downstream in remote client: %s", event.getCause)
event.getCause.printStackTrace
event.getChannel.close
}
}

View file

@ -9,18 +9,18 @@ import java.net.InetSocketAddress
import java.util.concurrent.{ConcurrentHashMap, Executors}
import kernel.actor._
import kernel.stm.TransactionManagement
import kernel.util.{JSONSerializer, Logging}
import kernel.util.{Serializer, ScalaJSONSerializer, JavaJSONSerializer, Logging}
import protobuf.RemoteProtocol
import protobuf.RemoteProtocol.{RemoteReply, RemoteRequest}
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.frame.{LengthFieldBasedFrameDecoder, LengthFieldPrepender}
import org.jboss.netty.handler.codec.protobuf.{ProtobufDecoder, ProtobufEncoder}
import org.jboss.netty.handler.codec.serialization.ObjectDecoder
import org.jboss.netty.handler.codec.serialization.ObjectEncoder
import protobuf.RemoteProtocol.{RemoteReply, RemoteRequest}
import com.google.protobuf.ByteString
class RemoteServer extends Logging {
def start = RemoteServer.start
}
@ -41,8 +41,8 @@ object RemoteServer extends Logging {
private val bootstrap = new ServerBootstrap(factory)
// FIXME provide different codecs (Thrift, Avro, Protobuf, JSON)
private val handler = new AkkaServerHandler
bootstrap.getPipeline.addLast("handler", handler)
private val handler = new RemoteServerHandler
bootstrap.setPipelineFactory(new RemoteServerPipelineFactory)
bootstrap.setOption("child.tcpNoDelay", true)
bootstrap.setOption("child.keepAlive", true)
bootstrap.setOption("child.reuseAddress", true)
@ -57,12 +57,24 @@ object RemoteServer extends Logging {
}
}
class RemoteServerPipelineFactory extends ChannelPipelineFactory {
def getPipeline: ChannelPipeline = {
val p = Channels.pipeline()
p.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4))
p.addLast("protobufDecoder", new ProtobufDecoder(RemoteProtocol.RemoteRequest.getDefaultInstance))
p.addLast("frameEncoder", new LengthFieldPrepender(4))
p.addLast("protobufEncoder", new ProtobufEncoder)
p.addLast("handler", new RemoteServerHandler)
p
}
}
@ChannelPipelineCoverage { val value = "all" }
class AkkaServerHandler extends SimpleChannelUpstreamHandler with Logging {
class RemoteServerHandler extends SimpleChannelUpstreamHandler with Logging {
private val activeObjectFactory = new ActiveObjectFactory
private val activeObjects = new ConcurrentHashMap[String, AnyRef]
private val actors = new ConcurrentHashMap[String, Actor]
override def handleUpstream(ctx: ChannelHandlerContext, event: ChannelEvent) = {
if (event.isInstanceOf[ChannelStateEvent] && event.asInstanceOf[ChannelStateEvent].getState != ChannelState.INTEREST_OPS) {
log.debug(event.toString)
@ -70,20 +82,6 @@ class AkkaServerHandler extends SimpleChannelUpstreamHandler with Logging {
super.handleUpstream(ctx, event)
}
override def channelOpen(ctx: ChannelHandlerContext, event: ChannelStateEvent) = {
//event.getChannel.getPipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4));
//event.getChannel.getPipeline.addLast("protobufDecoder", new ProtobufDecoder(LocalTimeProtocol.LocalTimes.getDefaultInstance()));
//event.getChannel.getPipeline.addLast("frameEncoder", new LengthFieldPrepender(4));
//event.getChannel.getPipeline.addLast("protobufEncoder", new ProtobufEncoder());
event.getChannel.getPipeline.addFirst("encoder", new ObjectEncoder)
event.getChannel.getPipeline.addFirst("decoder", new ObjectDecoder)
}
override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) = {
//e.getChannel.write(firstMessage)
}
override def messageReceived(ctx: ChannelHandlerContext, event: MessageEvent) = {
val message = event.getMessage
if (message == null) throw new IllegalStateException("Message in remote MessageEvent is null: " + event)
@ -91,82 +89,100 @@ class AkkaServerHandler extends SimpleChannelUpstreamHandler with Logging {
}
override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) = {
event.getCause.printStackTrace
log.error("Unexpected exception from remote downstream: %s", event.getCause)
event.getCause.printStackTrace
event.getChannel.close
}
private def handleRemoteRequest(request: RemoteRequest, channel: Channel) = {
log.debug(request.toString)
if (request.isActor) dispatchToActor(request, channel)
log.debug("Received RemoteRequest[\n%s]", request.toString)
if (request.getIsActor) dispatchToActor(request, channel)
else dispatchToActiveObject(request, channel)
}
private def dispatchToActor(request: RemoteRequest, channel: Channel) = {
log.debug("Dispatching to remote actor [%s]", request.target)
val actor = createActor(request.target, request.timeout)
log.debug("Dispatching to remote actor [%s]", request.getTarget)
val actor = createActor(request.getTarget, request.getTimeout)
actor.start
val messageBytes = request.getMessage
val messageType = request.getMessageType
val messageClass = Class.forName(messageType)
val message = JSONSerializer.in(messageBytes, messageClass)
if (request.isOneWay) actor ! message
val messageClass = Class.forName(request.getMessageType)
val message = ScalaJSONSerializer.in(request.getMessage.toByteArray, Some(messageClass))
if (request.getIsOneWay) actor ! 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 replyMessage = JSONSerializer.out(result)
val reply = RemoteReply.newBuilder
.setId(request.getId)
.setMessage(replyMessage)
.setMessageType(result.getClass.getName)
.setIsSuccessful(true)
.setSupervisorUuid(request.getSupervisorUuid)
.build
channel.write(reply)
val replyMessage = ScalaJSONSerializer.out(result)
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setMessage(ByteString.copyFrom(replyMessage))
.setMessageType(result.getClass.getName)
.setIsSuccessful(true)
.setIsActor(true)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(replyBuilder.build)
} catch {
case e: Throwable =>
log.error("Could not invoke remote actor [%s] due to: %s", request.target, e)
log.error("Could not invoke remote actor [%s] due to: %s", request.getTarget, e)
e.printStackTrace
val reply = RemoteReply.newBuilder
.setId(request.getId)
.setException(e.toString)
.setIsSuccessful(false)
.setSupervisorUuid(request.getSupervisorUuid)
.build
channel.write(reply)
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setException(e.getClass.getName + "$" + e.getMessage)
.setIsSuccessful(false)
.setIsActor(true)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(replyBuilder.build)
}
}
}
private def dispatchToActiveObject(request: RemoteRequest, channel: Channel) = {
log.debug("Dispatching to remote active object [%s :: %s]", request.method, request.target)
val activeObject = createActiveObject(request.target, request.timeout)
log.debug("Dispatching to remote active object [%s :: %s]", request.getMethod, request.getTarget)
val activeObject = createActiveObject(request.getTarget, request.getTimeout)
val args = request.message.asInstanceOf[scala.List[AnyRef]]
val args: scala.List[AnyRef] = JavaJSONSerializer.in(request.getMessage.toByteArray, Some(classOf[scala.List[AnyRef]]))
val argClasses = args.map(_.getClass)
val (unescapedArgs, unescapedArgClasses) = unescapeArgs(args, argClasses, request.timeout)
val (unescapedArgs, unescapedArgClasses) = unescapeArgs(args, argClasses, request.getTimeout)
//continueTransaction(request)
try {
val messageReceiver = activeObject.getClass.getDeclaredMethod(request.method, unescapedArgClasses: _*)
if (request.isOneWay) messageReceiver.invoke(activeObject, unescapedArgs: _*)
val messageReceiver = activeObject.getClass.getDeclaredMethod(request.getMethod, unescapedArgClasses: _*)
if (request.getIsOneWay) messageReceiver.invoke(activeObject, unescapedArgs: _*)
else {
val result = messageReceiver.invoke(activeObject, unescapedArgs: _*)
log.debug("Returning result from remote active object invocation [%s]", result)
//channel.write(request.newReplyWithMessage(result, TransactionManagement.threadBoundTx.get))
channel.write(request.newReplyWithMessage(result, null))
val replyMessage = JavaJSONSerializer.out(result)
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setMessage(ByteString.copyFrom(replyMessage))
.setMessageType(result.getClass.getName)
.setIsSuccessful(true)
.setIsActor(false)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(replyBuilder.build)
}
} catch {
case e: InvocationTargetException =>
log.error("Could not invoke remote active object [%s :: %s] due to: %s", request.method, request.target, e.getCause)
log.error("Could not invoke remote active object [%s :: %s] due to: %s", request.getMethod, request.getTarget, e.getCause)
e.getCause.printStackTrace
channel.write(request.newReplyWithException(e.getCause))
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setException(e.getCause.getClass.getName + "$" + e.getCause.getMessage)
.setException(e.getCause.toString)
.setIsSuccessful(false)
.setIsActor(false)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(replyBuilder.build)
case e: Throwable =>
log.error("Could not invoke remote active object [%s :: %s] due to: %s", request.method, request.target, e)
log.error("Could not invoke remote active object [%s :: %s] due to: %s", request.getMethod, request.getTarget, e)
e.printStackTrace
channel.write(request.newReplyWithException(e))
val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setException(e.getClass.getName + "$" + e.getMessage)
.setIsSuccessful(false)
.setIsActor(false)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(replyBuilder.build)
}
}
@ -184,8 +200,10 @@ class AkkaServerHandler extends SimpleChannelUpstreamHandler with Logging {
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 arg = args(i)
if (arg.isInstanceOf[String] && arg.asInstanceOf[String] == "$$ProxiedByAW") {
val argString = arg.asInstanceOf[String]
val proxyName = argString.substring(argString.indexOf("$$ProxiedByAW"), argString.length)
val activeObject = createActiveObject(proxyName, timeout)
unescapedArgs(i) = activeObject
unescapedArgClasses(i) = Class.forName(proxyName)

View file

@ -8,12 +8,12 @@ import java.util.concurrent.atomic.AtomicLong
import kernel.stm.Transaction
import kernel.util.HashCode
// FIXME: will not work - can clash with other host's requests - need te prepend with hostname
object RemoteRequestIdFactory {
private val id = new AtomicLong
def nextId = id.getAndIncrement
}
@serializable class ProxyWrapper(val proxyName: String)
/*
@serializable class RemoteRequest(val message: AnyRef,
val method: String,

View file

@ -40,7 +40,33 @@ object JavaSerializationSerializer extends Serializer {
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
object JSONSerializer extends Serializer {
object JavaJSONSerializer extends Serializer {
import org.codehaus.jackson.map.ObjectMapper
private val json = new ObjectMapper
def out(obj: AnyRef): Array[Byte] = {
if (!json.canSerialize(obj.getClass)) throw new IllegalArgumentException("Can not serialize [" + obj + "] to JSON, please provide a JSON serializable object.")
val bos = new ByteArrayOutputStream
val out = new ObjectOutputStream(bos)
json.writeValue(out, obj)
out.close
bos.toByteArray
}
def in(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
if (!clazz.isDefined) throw new IllegalArgumentException("Can't deserialize JSON to instance if no class is provided")
val in = new ObjectInputStream(new ByteArrayInputStream(bytes))
val obj = json.readValue(in, clazz.get).asInstanceOf[AnyRef]
in.close
obj
}
}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
object ScalaJSONSerializer extends Serializer {
import org.codehaus.jackson.map.ObjectMapper
private val json = new ObjectMapper

View file

@ -9,7 +9,7 @@ import annotation.oneway
import kernel.config.ScalaConfig._
import com.google.inject.{AbstractModule, Scopes}
import com.jteigen.scalatest.JUnit4Runner
//import com.jteigen.scalatest.JUnit4Runner
import org.apache.camel.component.bean.ProxyHelper
import org.junit.runner.RunWith
@ -32,7 +32,7 @@ import org.apache.camel.impl.DefaultCamelContext
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
@RunWith(classOf[JUnit4Runner])
//@RunWith(classOf[JUnit4Runner])
class CamelSpec extends Spec with ShouldMatchers {
describe("A Camel routing scheme") {

View file

@ -19,7 +19,7 @@ import com.google.inject.{AbstractModule, Scopes}
import org.scalatest.Spec
import org.scalatest.matchers.ShouldMatchers
import com.jteigen.scalatest.JUnit4Runner
//simport com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith
import org.junit.Test
import org.junit.Assert._
@ -27,7 +27,7 @@ import org.junit.Assert._
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
@RunWith(classOf[JUnit4Runner])
//@RunWith(classOf[JUnit4Runner])
class JerseySpec extends Spec with ShouldMatchers {
describe("A Jersey REST service") {

View file

@ -40,7 +40,7 @@ class RemoteActorSpec extends TestCase {
@Test
def testSendOneWay = {
implicit val timeout = 5000L
implicit val timeout = 500000000L
val actor = new RemoteActorSpecActorUnidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.start
@ -52,7 +52,7 @@ class RemoteActorSpec extends TestCase {
@Test
def testSendReplySync = {
implicit val timeout = 5000L
implicit val timeout = 500000000L
val actor = new RemoteActorSpecActorBidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.start
@ -63,7 +63,7 @@ class RemoteActorSpec extends TestCase {
@Test
def testSendReplyAsync = {
implicit val timeout = 5000L
implicit val timeout = 500000000L
val actor = new RemoteActorSpecActorBidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.start
@ -74,7 +74,7 @@ class RemoteActorSpec extends TestCase {
@Test
def testSendReceiveException = {
implicit val timeout = 5000L
implicit val timeout = 500000000L
val actor = new RemoteActorSpecActorBidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.start

View file

@ -8,7 +8,7 @@ import kernel.nio.{RemoteClient, RemoteServer}
import kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor}
import kernel.config.ScalaConfig._
import com.jteigen.scalatest.JUnit4Runner
//import com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith
import org.scalatest.Suite
@ -19,7 +19,7 @@ object Log {
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
@RunWith(classOf[JUnit4Runner])
//@RunWith(classOf[JUnit4Runner])
class RemoteSupervisorSpec extends junit.framework.TestCase with Suite {
Kernel.config

View file

@ -7,14 +7,14 @@ package se.scalablesolutions.akka.kernel
import kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor}
import kernel.config.ScalaConfig._
import com.jteigen.scalatest.JUnit4Runner
//import com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith
import org.scalatest.Suite
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
@RunWith(classOf[JUnit4Runner])
//@RunWith(classOf[JUnit4Runner])
class SupervisorSpec extends junit.framework.TestCase with Suite {
var messageLog: String = ""

Binary file not shown.

BIN
lib/sbinary-0.3.jar Normal file

Binary file not shown.

View file

@ -41,6 +41,7 @@
<orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: sbinary:sbinary:0.3-alpha" level="project" />
<orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" />

View file

@ -41,6 +41,7 @@
<orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: sbinary:sbinary:0.3-alpha" level="project" />
<orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" />

View file

@ -39,7 +39,7 @@ public final class RemoteProtocol {
public boolean hasMessage() { return hasMessage; }
public com.google.protobuf.ByteString getMessage() { return message_; }
// required string method = 2;
// optional string method = 2;
public static final int METHOD_FIELD_NUMBER = 2;
private boolean hasMethod;
private java.lang.String method_ = "";
@ -60,7 +60,7 @@ public final class RemoteProtocol {
public boolean hasTimeout() { return hasTimeout; }
public long getTimeout() { return timeout_; }
// required string supervisorUuid = 5;
// optional string supervisorUuid = 5;
public static final int SUPERVISORUUID_FIELD_NUMBER = 5;
private boolean hasSupervisorUuid;
private java.lang.String supervisorUuid_ = "";
@ -105,10 +105,8 @@ public final class RemoteProtocol {
@Override
public final boolean isInitialized() {
if (!hasMessage) return false;
if (!hasMethod) return false;
if (!hasTarget) return false;
if (!hasTimeout) return false;
if (!hasSupervisorUuid) return false;
if (!hasIsActor) return false;
if (!hasIsOneWay) return false;
if (!hasIsEscaped) return false;
@ -471,7 +469,7 @@ public final class RemoteProtocol {
return this;
}
// required string method = 2;
// optional string method = 2;
public boolean hasMethod() {
return result.hasMethod();
}
@ -531,7 +529,7 @@ public final class RemoteProtocol {
return this;
}
// required string supervisorUuid = 5;
// optional string supervisorUuid = 5;
public boolean hasSupervisorUuid() {
return result.hasSupervisorUuid();
}
@ -690,42 +688,46 @@ public final class RemoteProtocol {
public boolean hasId() { return hasId; }
public long getId() { return id_; }
// required bytes message = 3;
// optional bytes message = 3;
public static final int MESSAGE_FIELD_NUMBER = 3;
private boolean hasMessage;
private com.google.protobuf.ByteString message_ = com.google.protobuf.ByteString.EMPTY;
public boolean hasMessage() { return hasMessage; }
public com.google.protobuf.ByteString getMessage() { return message_; }
// required string exception = 4;
// optional string exception = 4;
public static final int EXCEPTION_FIELD_NUMBER = 4;
private boolean hasException;
private java.lang.String exception_ = "";
public boolean hasException() { return hasException; }
public java.lang.String getException() { return exception_; }
// required string supervisorUuid = 5;
// optional string supervisorUuid = 5;
public static final int SUPERVISORUUID_FIELD_NUMBER = 5;
private boolean hasSupervisorUuid;
private java.lang.String supervisorUuid_ = "";
public boolean hasSupervisorUuid() { return hasSupervisorUuid; }
public java.lang.String getSupervisorUuid() { return supervisorUuid_; }
// required string messageType = 6;
// optional string messageType = 6;
public static final int MESSAGETYPE_FIELD_NUMBER = 6;
private boolean hasMessageType;
private java.lang.String messageType_ = "";
public boolean hasMessageType() { return hasMessageType; }
public java.lang.String getMessageType() { return messageType_; }
// required bool isActor = 7;
public static final int ISACTOR_FIELD_NUMBER = 7;
private boolean hasIsActor;
private boolean isActor_ = false;
public boolean hasIsActor() { return hasIsActor; }
public boolean getIsActor() { return isActor_; }
@Override
public final boolean isInitialized() {
if (!hasIsSuccessful) return false;
if (!hasId) return false;
if (!hasMessage) return false;
if (!hasException) return false;
if (!hasSupervisorUuid) return false;
if (!hasMessageType) return false;
if (!hasIsActor) return false;
return true;
}
@ -750,6 +752,9 @@ public final class RemoteProtocol {
if (hasMessageType()) {
output.writeString(6, getMessageType());
}
if (hasIsActor()) {
output.writeBool(7, getIsActor());
}
getUnknownFields().writeTo(output);
}
@ -784,6 +789,10 @@ public final class RemoteProtocol {
size += com.google.protobuf.CodedOutputStream
.computeStringSize(6, getMessageType());
}
if (hasIsActor()) {
size += com.google.protobuf.CodedOutputStream
.computeBoolSize(7, getIsActor());
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
@ -943,6 +952,9 @@ public final class RemoteProtocol {
if (other.hasMessageType()) {
setMessageType(other.getMessageType());
}
if (other.hasIsActor()) {
setIsActor(other.getIsActor());
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
}
@ -1001,6 +1013,10 @@ public final class RemoteProtocol {
setMessageType(input.readString());
break;
}
case 56: {
setIsActor(input.readBool());
break;
}
}
}
}
@ -1042,7 +1058,7 @@ public final class RemoteProtocol {
return this;
}
// required bytes message = 3;
// optional bytes message = 3;
public boolean hasMessage() {
return result.hasMessage();
}
@ -1063,7 +1079,7 @@ public final class RemoteProtocol {
return this;
}
// required string exception = 4;
// optional string exception = 4;
public boolean hasException() {
return result.hasException();
}
@ -1084,7 +1100,7 @@ public final class RemoteProtocol {
return this;
}
// required string supervisorUuid = 5;
// optional string supervisorUuid = 5;
public boolean hasSupervisorUuid() {
return result.hasSupervisorUuid();
}
@ -1105,7 +1121,7 @@ public final class RemoteProtocol {
return this;
}
// required string messageType = 6;
// optional string messageType = 6;
public boolean hasMessageType() {
return result.hasMessageType();
}
@ -1125,6 +1141,24 @@ public final class RemoteProtocol {
result.messageType_ = "";
return this;
}
// required bool isActor = 7;
public boolean hasIsActor() {
return result.hasIsActor();
}
public boolean getIsActor() {
return result.getIsActor();
}
public Builder setIsActor(boolean value) {
result.hasIsActor = true;
result.isActor_ = value;
return this;
}
public Builder clearIsActor() {
result.hasIsActor = false;
result.isActor_ = false;
return this;
}
}
static {
@ -1155,14 +1189,14 @@ public final class RemoteProtocol {
"rotobuf/RemoteProtocol.proto\022-se.scalabl" +
"esolutions.akka.kernel.nio.protobuf\"\300\001\n\r" +
"RemoteRequest\022\017\n\007message\030\001 \002(\014\022\016\n\006method" +
"\030\002 \002(\t\022\016\n\006target\030\003 \002(\t\022\017\n\007timeout\030\004 \002(\004\022" +
"\026\n\016supervisorUuid\030\005 \002(\t\022\017\n\007isActor\030\006 \002(\010" +
"\030\002 \001(\t\022\016\n\006target\030\003 \002(\t\022\017\n\007timeout\030\004 \002(\004\022" +
"\026\n\016supervisorUuid\030\005 \001(\t\022\017\n\007isActor\030\006 \002(\010" +
"\022\020\n\010isOneWay\030\007 \002(\010\022\021\n\tisEscaped\030\010 \002(\010\022\n\n" +
"\002id\030\t \002(\004\022\023\n\013messageType\030\n \002(\t\"\200\001\n\013Remot" +
"\002id\030\t \002(\004\022\023\n\013messageType\030\n \002(\t\"\221\001\n\013Remot" +
"eReply\022\024\n\014isSuccessful\030\001 \002(\010\022\n\n\002id\030\002 \002(\004" +
"\022\017\n\007message\030\003 \002(\014\022\021\n\texception\030\004 \002(\t\022\026\n\016" +
"supervisorUuid\030\005 \002(\t\022\023\n\013messageType\030\006 \002(" +
"\tB\002H\001";
"\022\017\n\007message\030\003 \001(\014\022\021\n\texception\030\004 \001(\t\022\026\n\016" +
"supervisorUuid\030\005 \001(\t\022\023\n\013messageType\030\006 \001(" +
"\t\022\017\n\007isActor\030\007 \002(\010B\002H\001";
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors(
@ -1181,7 +1215,7 @@ public final class RemoteProtocol {
internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_descriptor,
new java.lang.String[] { "IsSuccessful", "Id", "Message", "Exception", "SupervisorUuid", "MessageType", },
new java.lang.String[] { "IsSuccessful", "Id", "Message", "Exception", "SupervisorUuid", "MessageType", "IsActor", },
se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.class,
se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder.class);
return null;

View file

@ -13,7 +13,6 @@ package se.scalablesolutions.akka.kernel.nio.protobuf;
option optimize_for = SPEED;
/*
val id: Long,
val message: Array[Byte],
val method: String,
val target: String,
@ -22,13 +21,15 @@ val supervisorUuid: String
val isOneWay: Boolean,
val isActor: Boolean,
val isEscaped: Boolean,
val id: Long,
val messageType: String,
*/
message RemoteRequest {
required bytes message = 1;
required string method = 2;
optional string method = 2;
required string target = 3;
required uint64 timeout = 4;
required string supervisorUuid = 5;
optional string supervisorUuid = 5;
required bool isActor = 6;
required bool isOneWay = 7;
required bool isEscaped = 8;
@ -42,12 +43,14 @@ val id: Long,
val message: Array[Byte],
val exception: Throwable,
val supervisorUuid: String
val isActor: Boolean,
*/
message RemoteReply {
required bool isSuccessful = 1;
required uint64 id = 2;
required bytes message = 3;
required string exception = 4;
required string supervisorUuid = 5;
required string messageType = 6;
optional bytes message = 3;
optional string exception = 4;
optional string supervisorUuid = 5;
optional string messageType = 6;
required bool isActor = 7;
}