finished actor library together with tests
This commit is contained in:
parent
74bd8dea6d
commit
7f60a4a93e
10 changed files with 583 additions and 396 deletions
572
akka.iws
572
akka.iws
|
|
@ -2,12 +2,15 @@
|
|||
<project relativePaths="false" version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" name="Default" comment=" # Brief commit desciption here # Full commit description here (comment lines starting with '#' will not be included) ">
|
||||
<change type="DELETED" beforePath="$PROJECT_DIR$/api-java/akka-funtest-java.iml" afterPath="" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iml" afterPath="$PROJECT_DIR$/akka.iml" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/reactor/EventDrivenDispatcher.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/reactor/EventDrivenDispatcher.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" />
|
||||
<change type="MOVED" beforePath="$PROJECT_DIR$/kernel/src/main/scala/reactor/EventDrivenDispatcher.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/reactor/EventBasedDispatcher.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/GenericServerContainerSuite.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/GenericServerContainerSuite.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/Supervisor.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/Supervisor.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/reactor/Future.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/reactor/Future.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$/kernel/src/main/scala/ActiveObject.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/ActiveObject.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
|
||||
<change type="DELETED" beforePath="$PROJECT_DIR$/fun-test-java/api-java.iml" afterPath="" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/reactor/Reactor.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/reactor/Reactor.scala" />
|
||||
</list>
|
||||
<ignored path="akka.iws" />
|
||||
|
|
@ -27,6 +30,112 @@
|
|||
<disable_hints />
|
||||
</component>
|
||||
<component name="DebuggerManager">
|
||||
<line_breakpoints>
|
||||
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala" line="104" class="Class at GenericServer.scala:104" 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/Supervisor.scala" line="174" class="Class at Supervisor.scala:174" 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/Supervisor.scala" line="159" class="Class at Supervisor.scala:159" 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/Supervisor.scala" line="67" class="Class at Supervisor.scala:67" 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/GenericServer.scala" line="76" class="Class at GenericServer.scala:76" 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/GenericServer.scala" line="78" class="Class at GenericServer.scala:78" 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/GenericServer.scala" line="87" class="Class at GenericServer.scala:87" 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/GenericServer.scala" line="101" class="Class at GenericServer.scala:101" 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>
|
||||
</line_breakpoints>
|
||||
<breakpoint_any>
|
||||
<breakpoint>
|
||||
<option name="NOTIFY_CAUGHT" value="true" />
|
||||
|
|
@ -87,16 +196,16 @@
|
|||
<file leaf-file-name="ActiveObject.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/ActiveObject.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="222" column="132" selection-start="8013" selection-end="8013" vertical-scroll-proportion="0.0">
|
||||
<state line="215" column="69" selection-start="7755" selection-end="7755" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="EventDrivenDispatcher.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/EventDrivenDispatcher.scala">
|
||||
<file leaf-file-name="EventBasedDispatcher.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/EventBasedDispatcher.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="15" column="6" selection-start="502" selection-end="502" vertical-scroll-proportion="0.0">
|
||||
<state line="33" column="0" selection-start="1265" selection-end="1265" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
|
|
@ -105,16 +214,70 @@
|
|||
<file leaf-file-name="GenericServer.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="25" column="0" selection-start="800" selection-end="800" vertical-scroll-proportion="0.0">
|
||||
<state line="76" column="0" selection-start="2333" selection-end="2333" vertical-scroll-proportion="-4.6153846">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="Reactor.scala" pinned="false" current="true" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/Reactor.scala">
|
||||
<file leaf-file-name="GenericServerContainerSuite.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/GenericServerContainerSuite.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="13" column="0" selection-start="432" selection-end="432" vertical-scroll-proportion="0.21701603">
|
||||
<state line="17" column="6" selection-start="352" selection-end="352" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="GenericServerSpec.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/GenericServerSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="17" column="22" selection-start="364" selection-end="364" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="JerseySpec.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="30" column="6" selection-start="0" selection-end="2793" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="SupervisorSpec.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="43" column="30" selection-start="1227" selection-end="1227" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="Supervisor.scala" pinned="false" current="true" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/Supervisor.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="61" column="183" selection-start="1819" selection-end="1819" vertical-scroll-proportion="0.03956479">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="Object.class" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="jar:///System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/../Classes/classes.jar!/java/lang/Object.class">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="25" column="27" selection-start="684" selection-end="684" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="Product.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.3/scala-library-2.7.3-sources.jar!/scala/Product.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="19" column="0" selection-start="767" selection-end="767" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
|
|
@ -166,126 +329,6 @@
|
|||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
|
||||
</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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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" />
|
||||
<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>
|
||||
</subPane>
|
||||
</component>
|
||||
<component name="ProjectReloadState">
|
||||
|
|
@ -344,7 +387,7 @@
|
|||
<recent name="se.scalablesolutions.akka.api" />
|
||||
</key>
|
||||
</component>
|
||||
<component name="RunManager" selected="JUnit.ActiveObjectGuiceConfiguratorTest">
|
||||
<component name="RunManager" selected="JUnit.SupervisorSpec">
|
||||
<tempConfiguration default="false" name="Scala Console" type="ScalaScriptConsoleRunConfiguration" factoryName="Scala Console">
|
||||
<module name="" />
|
||||
<setting name="vmparams" value="" />
|
||||
|
|
@ -623,7 +666,67 @@
|
|||
<option name="Make" value="false" />
|
||||
</method>
|
||||
</configuration>
|
||||
<list size="8">
|
||||
<configuration default="false" name="GenericServerContainerSpec" type="JUnit" factoryName="JUnit" enabled="false" merge="false" sample_coverage="true" runner="emma">
|
||||
<module name="akka-kernel" />
|
||||
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="" />
|
||||
<option name="PACKAGE_NAME" value="" />
|
||||
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.kernel.GenericServerContainerSpec" />
|
||||
<option name="METHOD_NAME" value="" />
|
||||
<option name="TEST_OBJECT" value="class" />
|
||||
<option name="VM_PARAMETERS" value="" />
|
||||
<option name="PARAMETERS" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
|
||||
<option name="ENV_VARIABLES" />
|
||||
<option name="PASS_PARENT_ENVS" value="true" />
|
||||
<option name="ADDITIONAL_CLASS_PATH" />
|
||||
<option name="TEST_SEARCH_SCOPE">
|
||||
<value defaultName="moduleWithDependencies" />
|
||||
</option>
|
||||
<envs />
|
||||
<RunnerSettings RunnerId="Debug">
|
||||
<option name="DEBUG_PORT" value="51254" />
|
||||
<option name="TRANSPORT" value="0" />
|
||||
<option name="LOCAL" value="true" />
|
||||
</RunnerSettings>
|
||||
<RunnerSettings RunnerId="Run" />
|
||||
<ConfigurationWrapper RunnerId="Debug" />
|
||||
<ConfigurationWrapper RunnerId="Run" />
|
||||
<method>
|
||||
<option name="Make" value="false" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="false" name="SupervisorSpec" type="JUnit" factoryName="JUnit" enabled="false" merge="false" sample_coverage="true" runner="emma">
|
||||
<module name="akka-kernel" />
|
||||
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="" />
|
||||
<option name="PACKAGE_NAME" value="" />
|
||||
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.kernel.SupervisorSpec" />
|
||||
<option name="METHOD_NAME" value="" />
|
||||
<option name="TEST_OBJECT" value="class" />
|
||||
<option name="VM_PARAMETERS" value="" />
|
||||
<option name="PARAMETERS" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
|
||||
<option name="ENV_VARIABLES" />
|
||||
<option name="PASS_PARENT_ENVS" value="true" />
|
||||
<option name="ADDITIONAL_CLASS_PATH" />
|
||||
<option name="TEST_SEARCH_SCOPE">
|
||||
<value defaultName="moduleWithDependencies" />
|
||||
</option>
|
||||
<envs />
|
||||
<RunnerSettings RunnerId="Debug">
|
||||
<option name="DEBUG_PORT" value="51284" />
|
||||
<option name="TRANSPORT" value="0" />
|
||||
<option name="LOCAL" value="true" />
|
||||
</RunnerSettings>
|
||||
<RunnerSettings RunnerId="Run" />
|
||||
<ConfigurationWrapper RunnerId="Debug" />
|
||||
<ConfigurationWrapper RunnerId="Run" />
|
||||
<method>
|
||||
<option name="Make" value="false" />
|
||||
</method>
|
||||
</configuration>
|
||||
<list size="10">
|
||||
<item index="0" class="java.lang.String" itemvalue="Application.Kernel" />
|
||||
<item index="1" class="java.lang.String" itemvalue="JUnit.CamelSpec" />
|
||||
<item index="2" class="java.lang.String" itemvalue="JUnit.InMemoryStateTest" />
|
||||
|
|
@ -631,7 +734,9 @@
|
|||
<item index="4" class="java.lang.String" itemvalue="JUnit.ActiveObjectGuiceConfiguratorTest" />
|
||||
<item index="5" class="java.lang.String" itemvalue="JUnit.JerseySpec" />
|
||||
<item index="6" class="java.lang.String" itemvalue="JUnit.REST" />
|
||||
<item index="7" class="java.lang.String" itemvalue="Scala Console.Scala Console" />
|
||||
<item index="7" class="java.lang.String" itemvalue="JUnit.GenericServerContainerSpec" />
|
||||
<item index="8" class="java.lang.String" itemvalue="JUnit.SupervisorSpec" />
|
||||
<item index="9" class="java.lang.String" itemvalue="Scala Console.Scala Console" />
|
||||
</list>
|
||||
<configuration name="<template>" type="WebApp" default="true" selected="false">
|
||||
<Host>localhost</Host>
|
||||
|
|
@ -677,8 +782,8 @@
|
|||
</todo-panel>
|
||||
</component>
|
||||
<component name="ToolWindowManager">
|
||||
<frame x="1" y="22" width="1916" height="1178" extended-state="0" />
|
||||
<editor active="true" />
|
||||
<frame x="4" y="22" width="1916" height="1178" extended-state="6" />
|
||||
<editor active="false" />
|
||||
<layout>
|
||||
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32908162" sideWeight="0.5" order="14" side_tool="false" />
|
||||
<window_info id="Dataflow to this" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="15" side_tool="false" />
|
||||
|
|
@ -686,18 +791,18 @@
|
|||
<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="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3294881" sideWeight="0.59183675" order="4" side_tool="false" />
|
||||
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32780612" 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.3299411" sideWeight="0.77398527" order="1" side_tool="false" />
|
||||
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32564574" sideWeight="0.5" order="1" side_tool="false" />
|
||||
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.20353508" sideWeight="0.6918819" order="1" side_tool="false" />
|
||||
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32473734" 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.24873829" sideWeight="0.74165636" order="0" 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="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.2195572" sideWeight="0.5" order="12" side_tool="false" />
|
||||
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24489796" sideWeight="0.5" order="12" side_tool="false" />
|
||||
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="13" side_tool="false" />
|
||||
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" />
|
||||
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24945927" sideWeight="0.6875" order="1" side_tool="false" />
|
||||
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32780612" sideWeight="0.5" order="7" side_tool="false" />
|
||||
<window_info id="Run" active="false" anchor="bottom" auto_hide="true" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.78505534" sideWeight="0.5" order="2" side_tool="false" x="4" y="22" width="1436" height="878" />
|
||||
<window_info id="Run" active="false" anchor="bottom" auto_hide="true" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.7844388" sideWeight="0.5" order="2" side_tool="false" x="4" y="22" width="1436" height="878" />
|
||||
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39989322" sideWeight="0.75" order="0" side_tool="false" />
|
||||
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.2698556" sideWeight="0.5" order="3" side_tool="false" />
|
||||
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3016605" sideWeight="0.5" order="3" side_tool="false" />
|
||||
<window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="9" side_tool="false" />
|
||||
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32780612" sideWeight="0.5" order="11" side_tool="false" />
|
||||
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" />
|
||||
|
|
@ -748,107 +853,114 @@
|
|||
</buildFile>
|
||||
</component>
|
||||
<component name="editorHistoryManager">
|
||||
<entry file="file://$PROJECT_DIR$/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java">
|
||||
<entry file="jar:///System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/../Classes/classes.jar!/java/util/concurrent/LinkedBlockingQueue.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="file://$PROJECT_DIR$/../../java/aspectwerkz4/src/main/org/codehaus/aspectwerkz/intercept/AdvisableImpl.java">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="114" column="0" selection-start="5095" selection-end="5095" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/Logging.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="5" column="42" selection-start="0" selection-end="92" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/DataFlowVariable.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="95" column="1" selection-start="2947" selection-end="2947" 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="26" column="85" selection-start="719" selection-end="719" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="68" column="16" selection-start="2395" selection-end="2395" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/GenericServerContainerSuite.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="95" column="123" selection-start="1873" selection-end="1873" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<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="7" column="66" selection-start="207" selection-end="207" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/ResultOrFailure.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="32" column="47" selection-start="663" selection-end="663" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/fun-test-java/pom.xml">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="6" column="27" selection-start="330" selection-end="330" 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="38" column="60" selection-start="1203" selection-end="1203" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/ActiveObject.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="222" column="132" selection-start="8013" selection-end="8013" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="25" column="0" selection-start="800" selection-end="800" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/EventDrivenDispatcher.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="15" column="6" selection-start="502" selection-end="502" vertical-scroll-proportion="0.0">
|
||||
<state line="27" column="2" selection-start="722" selection-end="722" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/Reactor.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="13" column="0" selection-start="432" selection-end="432" vertical-scroll-proportion="0.21701603">
|
||||
<state line="51" column="45" selection-start="1535" selection-end="1535" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="21" column="2" selection-start="868" selection-end="868" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorStateSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="19" column="6" selection-start="435" selection-end="435" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/config/ActiveObjectGuiceConfigurator.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="98" column="78" selection-start="4514" selection-end="4514" vertical-scroll-proportion="-3.9615386">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/EventBasedDispatcher.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="33" column="0" selection-start="1265" selection-end="1265" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/ActiveObject.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="215" column="69" selection-start="7755" selection-end="7755" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.3/scala-library-2.7.3-sources.jar!/scala/Product.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="19" column="0" selection-start="767" selection-end="767" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="30" column="6" selection-start="0" selection-end="2793" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="43" column="30" selection-start="1227" selection-end="1227" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/GenericServerSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="17" column="22" selection-start="364" selection-end="364" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/GenericServerContainerSuite.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="17" column="6" selection-start="352" selection-end="352" 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/Object.class">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="25" column="27" selection-start="684" selection-end="684" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="76" column="0" selection-start="2333" selection-end="2333" vertical-scroll-proportion="-4.6153846">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/Supervisor.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="61" column="183" selection-start="1819" selection-end="1819" vertical-scroll-proportion="0.03956479">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ sealed class TransactionalAroundAdvice(target: Class[_],
|
|||
private def sendOneWay(joinpoint: JoinPoint) = server ! Invocation(joinpoint, activeTx)
|
||||
|
||||
private def sendAndReceiveEventually(joinpoint: JoinPoint): ResultOrFailure[AnyRef] = {
|
||||
server !!! (Invocation(joinpoint, activeTx), {
|
||||
server !! (Invocation(joinpoint, activeTx), {
|
||||
var resultOrFailure = ResultOrFailure(activeTx)
|
||||
resultOrFailure() = throw new ActiveObjectInvocationTimeoutException("Invocation to active object [" + targetInstance.getClass.getName + "] timed out after " + server.timeout + " milliseconds")
|
||||
resultOrFailure
|
||||
|
|
@ -228,7 +228,7 @@ private[kernel] class Dispatcher(val targetName: String) extends GenericServer {
|
|||
}
|
||||
|
||||
case 'exit =>
|
||||
exit; reply()
|
||||
exit
|
||||
|
||||
/* case exchange: Exchange =>
|
||||
println("=============> Exchange From Actor: " + exchange)
|
||||
|
|
|
|||
|
|
@ -4,11 +4,12 @@
|
|||
|
||||
package se.scalablesolutions.akka.kernel
|
||||
|
||||
import scala.actors._
|
||||
import scala.actors.Actor._
|
||||
import java.util.concurrent.{LinkedBlockingQueue, TimeUnit}
|
||||
|
||||
import se.scalablesolutions.akka.kernel.config.ScalaConfig._
|
||||
import se.scalablesolutions.akka.kernel.Helpers._
|
||||
import kernel.config.ScalaConfig._
|
||||
import kernel.Helpers._
|
||||
import kernel.reactor._
|
||||
import scala.collection.mutable.HashSet
|
||||
|
||||
sealed abstract class GenericServerMessage
|
||||
case class Init(config: AnyRef) extends GenericServerMessage
|
||||
|
|
@ -16,13 +17,21 @@ case class ReInit(config: AnyRef) extends GenericServerMessage
|
|||
case class Shutdown(reason: AnyRef) extends GenericServerMessage
|
||||
case class Terminate(reason: AnyRef) extends GenericServerMessage
|
||||
case class HotSwap(code: Option[PartialFunction[Any, Unit]]) extends GenericServerMessage
|
||||
case class Killed(victim: GenericServer, reason: AnyRef) extends GenericServerMessage
|
||||
|
||||
/**
|
||||
* Base trait for all user-defined servers.
|
||||
*
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
*/
|
||||
trait GenericServer extends Actor {
|
||||
trait GenericServer {
|
||||
private val unit = TimeUnit.MILLISECONDS
|
||||
private[kernel] var sender: GenericServerContainer = _
|
||||
private[kernel] var container: GenericServerContainer = _
|
||||
private[kernel] var mailbox: MessageQueue = _
|
||||
@volatile protected[this] var isRunning = true
|
||||
protected var trapExit: Boolean = false
|
||||
|
||||
/**
|
||||
* Template method implementing the server logic.
|
||||
* To be implemented by subclassing server.
|
||||
|
|
@ -39,39 +48,93 @@ trait GenericServer extends Actor {
|
|||
* }
|
||||
* </pre>
|
||||
*/
|
||||
def body: PartialFunction[Any, Unit]
|
||||
protected def body: PartialFunction[Any, Unit]
|
||||
|
||||
/**
|
||||
* Callback method that is called during initialization.
|
||||
* To be implemented by subclassing server.
|
||||
*/
|
||||
def init(config: AnyRef) {}
|
||||
protected def init(config: AnyRef) {}
|
||||
|
||||
/**
|
||||
* Callback method that is called during reinitialization after a server crash.
|
||||
* To be implemented by subclassing server.
|
||||
*/
|
||||
def reinit(config: AnyRef) {}
|
||||
protected def reinit(config: AnyRef) {}
|
||||
|
||||
/**
|
||||
* Callback method that is called during termination.
|
||||
* To be implemented by subclassing server.
|
||||
*/
|
||||
def shutdown(reason: AnyRef) {}
|
||||
protected def shutdown(reason: AnyRef) {}
|
||||
|
||||
def act = loop { react { genericBase orElse base } }
|
||||
protected def reply(message: AnyRef) = sender ! message
|
||||
|
||||
private[kernel] def link(server: GenericServer) = container.link(server)
|
||||
|
||||
private def base: PartialFunction[Any, Unit] = hotswap getOrElse body
|
||||
private[kernel] def unlink(server: GenericServer) = container.unlink(server)
|
||||
|
||||
private[kernel] def !(message: AnyRef) = mailbox.put(new MessageHandle(this, message, new NullFutureResult))
|
||||
|
||||
private[kernel] def !(implicit timeout: Long): Option[T] = {
|
||||
val future = new GenericFutureResult(unit.toNanos(timeout))
|
||||
mailbox.put(new MessageHandle(this, message, future))
|
||||
future.await
|
||||
val result = future.result
|
||||
if (result == null) None
|
||||
else Some(result.asInstanceOf[T])
|
||||
}
|
||||
|
||||
private[kernel] def !?(message: AnyRef): AnyRef = {
|
||||
val future = new GenericFutureResult(unit.toNanos(100000))
|
||||
mailbox.put(new MessageHandle(this, message, future))
|
||||
future.await
|
||||
future.result.asInstanceOf[AnyRef]
|
||||
}
|
||||
|
||||
private[kernel] def start = {} //try { act } catch { case e: SuspendServerException => act }
|
||||
|
||||
private[kernel] def shutdown(shutdownTime: Int, reason: AnyRef) {
|
||||
//FIXME: how to implement?
|
||||
}
|
||||
|
||||
private[kernel] def handle(message: AnyRef, future: CompletableFutureResult) = {
|
||||
react(message) { lifecycle orElse base }
|
||||
/*
|
||||
try {
|
||||
val result = message.asInstanceOf[Invocation].joinpoint.proceed
|
||||
future.completeWithResult(result)
|
||||
} catch {
|
||||
case e: Exception => future.completeWithException(e)
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
//private[kernel] def act = while(isRunning) { react { lifecycle orElse base } }
|
||||
|
||||
private[this] def base: PartialFunction[Any, Unit] = hotswap getOrElse body
|
||||
|
||||
private var hotswap: Option[PartialFunction[Any, Unit]] = None
|
||||
|
||||
private val genericBase: PartialFunction[Any, Unit] = {
|
||||
private val lifecycle: PartialFunction[Any, Unit] = {
|
||||
case Init(config) => init(config)
|
||||
case ReInit(config) => reinit(config)
|
||||
case HotSwap(code) => hotswap = code
|
||||
case Shutdown(reason) => shutdown(reason); reply('success)
|
||||
case Terminate(reason) => exit(reason)
|
||||
case Terminate(reason) => shutdown(reason); exit
|
||||
}
|
||||
|
||||
protected[this] def react(message: AnyRef)(f: PartialFunction[AnyRef, Unit]): Unit = {
|
||||
// FIXME: loop over all elements, grab the first that matches
|
||||
if (f.isDefinedAt(message)) {
|
||||
// sender = message.sender.asInstanceOf[GenericServerContainer]
|
||||
f(message)
|
||||
} else {
|
||||
throw new IllegalArgumentException("Message not defined: " + message)
|
||||
}
|
||||
//throw new SuspendServerException
|
||||
}
|
||||
|
||||
private[this] def exit = isRunning = false
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -83,17 +146,18 @@ trait GenericServer extends Actor {
|
|||
*/
|
||||
class GenericServerContainer(
|
||||
val id: String,
|
||||
private[kernel] var serverFactory: () => GenericServer) extends Logging {
|
||||
private[this] var serverFactory: () => GenericServer) extends Logging {
|
||||
require(id != null && id != "")
|
||||
|
||||
private[kernel] var lifeCycle: Option[LifeCycle] = None
|
||||
private[kernel] val lock = new ReadWriteLock
|
||||
private[kernel] val txItemsLock = new ReadWriteLock
|
||||
private[kernel] val serializer = new JavaSerializationSerializer
|
||||
private[this] val txItemsLock = new ReadWriteLock
|
||||
private[this] val serializer = new JavaSerializationSerializer
|
||||
private[this] val linkedServers = new HashSet[GenericServer]
|
||||
private[kernel] var server: GenericServer = serverFactory()
|
||||
private[this] var currentConfig: Option[AnyRef] = None
|
||||
|
||||
private var server: GenericServer = _
|
||||
private var currentConfig: Option[AnyRef] = None
|
||||
private[kernel] var timeout = 5000
|
||||
private[kernel] val lock = new ReadWriteLock
|
||||
private[kernel] var lifeCycle: Option[LifeCycle] = None
|
||||
private[kernel] implicit var timeout = 5000L
|
||||
|
||||
private[kernel] def transactionalItems: List[Transactional] = txItemsLock.withReadLock {
|
||||
_transactionalMaps ::: _transactionalVectors ::: _transactionalRefs
|
||||
|
|
@ -126,15 +190,19 @@ class GenericServerContainer(
|
|||
_transactionalRefs
|
||||
}
|
||||
|
||||
def link(server: GenericServer) = lock.withWriteLock { linkedServers + server }
|
||||
|
||||
def unlink(server: GenericServer) = lock.withWriteLock { linkedServers - server }
|
||||
|
||||
/**
|
||||
* Sends a one way message to the server - alias for <code>cast(message)</code>.
|
||||
* Sends a one way message to the server.
|
||||
* <p>
|
||||
* Example:
|
||||
* <pre>
|
||||
* server ! Message
|
||||
* </pre>
|
||||
*/
|
||||
def !(message: Any) = {
|
||||
def !(message: AnyRef) = {
|
||||
require(server != null)
|
||||
lock.withReadLock { server ! message }
|
||||
}
|
||||
|
|
@ -147,13 +215,12 @@ class GenericServerContainer(
|
|||
* <p>
|
||||
* Example:
|
||||
* <pre>
|
||||
* (server !!! Message).getOrElse(throw new RuntimeException("time out")
|
||||
* (server !! Message).getOrElse(throw new RuntimeException("time out")
|
||||
* </pre>
|
||||
*/
|
||||
def !!: Option[T] = {
|
||||
def !: Option[T] = {
|
||||
require(server != null)
|
||||
val future: FutureWithTimeout[T] = lock.withReadLock { server !!! message }
|
||||
future.receiveWithin(timeout)
|
||||
lock.withReadLock { server !! message }
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -165,13 +232,16 @@ class GenericServerContainer(
|
|||
* <p>
|
||||
* Example:
|
||||
* <pre>
|
||||
* server !!! (Message, throw new RuntimeException("time out"))
|
||||
* server !! (Message, throw new RuntimeException("time out"))
|
||||
* // OR
|
||||
* server !!! (Message, DefaultReturnValue)
|
||||
* server !! (Message, DefaultReturnValue)
|
||||
* </pre>
|
||||
*/
|
||||
def !!: T = !!!(message, errorHandler, timeout)
|
||||
|
||||
def !: T = {
|
||||
require(server != null)
|
||||
lock.withReadLock { (server !! message).getOrElse(errorHandler).asInstanceOf[T] }
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a message to the server and gets a future back with the reply.
|
||||
* <p>
|
||||
|
|
@ -181,18 +251,27 @@ class GenericServerContainer(
|
|||
* <p>
|
||||
* Example:
|
||||
* <pre>
|
||||
* server !!! (Message, throw new RuntimeException("time out"), 1000)
|
||||
* server !! (Message, throw new RuntimeException("time out"), 1000)
|
||||
* // OR
|
||||
* server !!! (Message, DefaultReturnValue, 1000)
|
||||
* server !! (Message, DefaultReturnValue, 1000)
|
||||
* </pre>
|
||||
*/
|
||||
def !!: T = {
|
||||
def !: T = {
|
||||
require(server != null)
|
||||
val future: FutureWithTimeout[T] = lock.withReadLock { server !!! message }
|
||||
future.receiveWithin(time) match {
|
||||
case None => errorHandler
|
||||
case Some(reply) => reply
|
||||
}
|
||||
lock.withReadLock { (server.!!(message)(time)).getOrElse(errorHandler).asInstanceOf[T] }
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a synchronous message to the server.
|
||||
* <p>
|
||||
* Example:
|
||||
* <pre>
|
||||
* val result = server !? Message
|
||||
* </pre>
|
||||
*/
|
||||
def !?(message: AnyRef) = {
|
||||
require(server != null)
|
||||
lock.withReadLock { server !? message }
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -231,16 +310,12 @@ class GenericServerContainer(
|
|||
*/
|
||||
def setTimeout(time: Int) = timeout = time
|
||||
|
||||
/**
|
||||
* Returns the next message in the servers mailbox.
|
||||
*/
|
||||
def nextMessage = lock.withReadLock { server ? }
|
||||
|
||||
/**
|
||||
* Creates a new actor for the GenericServerContainer, and return the newly created actor.
|
||||
*/
|
||||
private[kernel] def newServer(): GenericServer = lock.withWriteLock {
|
||||
server = serverFactory()
|
||||
server.container = this
|
||||
server
|
||||
}
|
||||
|
||||
|
|
@ -262,10 +337,7 @@ class GenericServerContainer(
|
|||
private[kernel] def terminate(reason: AnyRef, shutdownTime: Int) = lock.withReadLock {
|
||||
if (shutdownTime > 0) {
|
||||
log.debug("Waiting [%s milliseconds for the server to shut down before killing it.", shutdownTime)
|
||||
server !? (shutdownTime, Shutdown(reason)) match {
|
||||
case Some('success) => log.debug("Server [%s] has been shut down cleanly.", id)
|
||||
case None => log.warning("Server [%s] was **not able** to complete shutdown cleanly within its configured shutdown time [%s]", id, shutdownTime)
|
||||
}
|
||||
server.shutdown(shutdownTime, Shutdown(reason))
|
||||
}
|
||||
server ! Terminate(reason)
|
||||
}
|
||||
|
|
@ -285,8 +357,12 @@ class GenericServerContainer(
|
|||
|
||||
private[kernel] def swapServer(newServer: GenericServer) = lock.withWriteLock {
|
||||
server = newServer
|
||||
server.container = this
|
||||
}
|
||||
|
||||
override def toString(): String = "GenericServerContainer[" + server + "]"
|
||||
}
|
||||
|
||||
private[kernel] class SuspendServerException extends Throwable {
|
||||
override def fillInStackTrace(): Throwable = this
|
||||
}
|
||||
|
|
@ -4,8 +4,7 @@
|
|||
|
||||
package se.scalablesolutions.akka.kernel
|
||||
|
||||
import scala.actors._
|
||||
import scala.actors.Actor._
|
||||
import kernel.reactor.{MessageQueue, GenericServerMessageHandler, EventBasedDispatcher}
|
||||
import scala.collection.mutable.HashMap
|
||||
|
||||
import se.scalablesolutions.akka.kernel.Helpers._
|
||||
|
|
@ -68,7 +67,7 @@ abstract class SupervisorFactory extends Logging {
|
|||
supervisor.start
|
||||
supervisor !? Configure(config, this) match {
|
||||
case 'configSuccess => log.debug("Supervisor successfully configured")
|
||||
case _ => log.error("Supervisor could not be configured")
|
||||
case error => log.error("Supervisor could not be configured due to [" + error + "]")
|
||||
}
|
||||
supervisor
|
||||
}
|
||||
|
|
@ -94,7 +93,15 @@ abstract class SupervisorFactory extends Logging {
|
|||
*
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
*/
|
||||
class Supervisor(faultHandler: FaultHandlingStrategy) extends Actor with Logging {
|
||||
class Supervisor(faultHandler: FaultHandlingStrategy) extends GenericServer with Logging {
|
||||
trapExit = true
|
||||
|
||||
private[kernel] val messageQueue = new MessageQueue
|
||||
mailbox = messageQueue
|
||||
|
||||
// FIXME: make dispatcher configurable
|
||||
private[kernel] val messageDispatcher = new EventBasedDispatcher
|
||||
messageDispatcher.dispatch(messageQueue)
|
||||
|
||||
private val state = new SupervisorState(this, faultHandler)
|
||||
|
||||
|
|
@ -115,40 +122,37 @@ class Supervisor(faultHandler: FaultHandlingStrategy) extends Actor with Logging
|
|||
}
|
||||
}
|
||||
|
||||
def stop = Actor.self ! Stop
|
||||
|
||||
def act = {
|
||||
self.trapExit = true
|
||||
loop {
|
||||
react {
|
||||
case Configure(config, factory) =>
|
||||
log.debug("Configuring supervisor:%s ", this)
|
||||
configure(config, factory)
|
||||
reply('configSuccess)
|
||||
def stop = this ! Stop
|
||||
|
||||
case Start =>
|
||||
state.serverContainers.foreach { serverContainer =>
|
||||
override def body: PartialFunction[Any, Unit] = {
|
||||
case Configure(config, factory) =>
|
||||
log.debug("Configuring supervisor: %s ", this)
|
||||
configure(config, factory)
|
||||
reply('configSuccess)
|
||||
|
||||
case Start =>
|
||||
state.serverContainers.foreach {
|
||||
serverContainer =>
|
||||
serverContainer.start
|
||||
log.info("Starting server: %s", serverContainer.getServer)
|
||||
}
|
||||
|
||||
case Stop =>
|
||||
state.serverContainers.foreach { serverContainer =>
|
||||
serverContainer.terminate('normal)
|
||||
log.info("Stopping ser-ver: %s", serverContainer)
|
||||
}
|
||||
log.info("Stopping supervisor: %s", this)
|
||||
exit('normal)
|
||||
|
||||
case Exit(failedServer, reason) =>
|
||||
reason match {
|
||||
case 'forced => {} // do nothing
|
||||
case _ => state.faultHandler.handleFailure(state, failedServer, reason)
|
||||
}
|
||||
|
||||
case unexpected => log.warning("Unexpected message [%s] from [%s] ignoring...", unexpected, sender)
|
||||
}
|
||||
}
|
||||
|
||||
case Stop =>
|
||||
state.serverContainers.foreach {
|
||||
serverContainer =>
|
||||
serverContainer.terminate('normal)
|
||||
log.info("Stopping server: %s", serverContainer)
|
||||
}
|
||||
log.info("Stopping supervisor: %s", this)
|
||||
exit
|
||||
|
||||
case Killed(failedServer, reason) =>
|
||||
reason match {
|
||||
case 'forced => {} // do nothing
|
||||
case _ => state.faultHandler.handleFailure(state, failedServer, reason)
|
||||
}
|
||||
|
||||
case unexpected => log.warning("Unexpected message [%s] from [%s] ignoring...", unexpected, sender)
|
||||
}
|
||||
|
||||
private def configure(config: SupervisorConfig, factory: SupervisorFactory) = config match {
|
||||
|
|
@ -167,10 +171,13 @@ class Supervisor(faultHandler: FaultHandlingStrategy) extends Actor with Logging
|
|||
}
|
||||
|
||||
private[kernel] def spawnLink(serverContainer: GenericServerContainer): GenericServer = {
|
||||
println("----------------- SPAWN LINK")
|
||||
val newServer = serverContainer.newServer()
|
||||
messageDispatcher.registerHandler(serverContainer.id, new GenericServerMessageHandler(newServer));
|
||||
newServer.mailbox = messageQueue
|
||||
newServer.start
|
||||
self.link(newServer)
|
||||
log.debug("Linking actor [%s] to supervisor [%s]", newServer, this)
|
||||
link(newServer)
|
||||
log.debug("Linking server [%s] to supervisor [%s]", newServer, this)
|
||||
state.addServerContainer(serverContainer)
|
||||
newServer
|
||||
}
|
||||
|
|
@ -186,7 +193,7 @@ abstract class FaultHandlingStrategy(val maxNrOfRetries: Int, val withinTimeRang
|
|||
private var nrOfRetries = 0
|
||||
private var retryStartTime = currentTime
|
||||
|
||||
private[kernel] def handleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = {
|
||||
private[kernel] def handleFailure(state: SupervisorState, failedServer: GenericServer, reason: AnyRef) = {
|
||||
nrOfRetries += 1
|
||||
if (timeRangeHasExpired) {
|
||||
if (hasReachedMaximumNrOfRetries) {
|
||||
|
|
@ -206,7 +213,7 @@ abstract class FaultHandlingStrategy(val maxNrOfRetries: Int, val withinTimeRang
|
|||
// TODO: this is the place to fail-over all pending messages in the failing actor's mailbox, if possible to get a hold of them
|
||||
// e.g. something like 'serverContainer.getServer.getPendingMessages.map(newServer ! _)'
|
||||
|
||||
self.unlink(serverContainer.getServer)
|
||||
supervisor.unlink(serverContainer.getServer)
|
||||
serverContainer.lifeCycle match {
|
||||
case None =>
|
||||
throw new IllegalStateException("Server [" + serverContainer.id + "] does not have a life-cycle defined.")
|
||||
|
|
@ -237,7 +244,7 @@ abstract class FaultHandlingStrategy(val maxNrOfRetries: Int, val withinTimeRang
|
|||
/**
|
||||
* To be overriden by concrete strategies.
|
||||
*/
|
||||
protected def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef)
|
||||
protected def doHandleFailure(state: SupervisorState, failedServer: GenericServer, reason: AnyRef)
|
||||
|
||||
/**
|
||||
* To be overriden by concrete strategies.
|
||||
|
|
@ -262,10 +269,10 @@ abstract class FaultHandlingStrategy(val maxNrOfRetries: Int, val withinTimeRang
|
|||
*/
|
||||
class AllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int)
|
||||
extends FaultHandlingStrategy(maxNrOfRetries, withinTimeRange) {
|
||||
override def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = {
|
||||
override def doHandleFailure(state: SupervisorState, failedServer: GenericServer, reason: AnyRef) = {
|
||||
log.error("Server [%s] has failed due to [%s] - scheduling restart - scheme: ALL_FOR_ONE.", failedServer, reason)
|
||||
for (serverContainer <- state.serverContainers) restart(serverContainer, reason, state)
|
||||
state.supervisors.foreach(_ ! Exit(failedServer, reason))
|
||||
state.supervisors.foreach(_ ! Killed(failedServer, reason))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -277,7 +284,7 @@ extends FaultHandlingStrategy(maxNrOfRetries, withinTimeRange) {
|
|||
*/
|
||||
class OneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int)
|
||||
extends FaultHandlingStrategy(maxNrOfRetries, withinTimeRange) {
|
||||
override def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = {
|
||||
override def doHandleFailure(state: SupervisorState, failedServer: GenericServer, reason: AnyRef) = {
|
||||
log.error("Server [%s] has failed due to [%s] - scheduling restart - scheme: ONE_FOR_ONE.", failedServer, reason)
|
||||
var serverContainer: Option[GenericServerContainer] = None
|
||||
state.serverContainers.foreach {
|
||||
|
|
|
|||
|
|
@ -11,13 +11,12 @@
|
|||
package se.scalablesolutions.akka.kernel.reactor
|
||||
|
||||
import java.util.concurrent.{ConcurrentMap, ConcurrentHashMap}
|
||||
import java.util.{LinkedList, Queue}
|
||||
import java.util.{LinkedList, Queue}
|
||||
|
||||
class EventDrivenDispatcher extends MessageDispatcher {
|
||||
class EventBasedDispatcher extends MessageDispatcher {
|
||||
private val handlers = new ConcurrentHashMap[AnyRef, MessageHandler]
|
||||
private var selectorThread: Thread = _
|
||||
@volatile private var active: Boolean = false
|
||||
private val guard = new Object
|
||||
|
||||
def registerHandler(key: AnyRef, handler: MessageHandler) = handlers.put(key, handler)
|
||||
|
||||
|
|
@ -25,17 +24,15 @@ class EventDrivenDispatcher extends MessageDispatcher {
|
|||
|
||||
def dispatch(messageQueue: MessageQueue) = if (!active) {
|
||||
active = true
|
||||
val messageDemultiplexer = new EventDrivenDemultiplexer(messageQueue)
|
||||
val messageDemultiplexer = new EventBasedDemultiplexer(messageQueue)
|
||||
selectorThread = new Thread {
|
||||
override def run = {
|
||||
while (active) {
|
||||
guard.synchronized { /* empty */ }
|
||||
messageDemultiplexer.select
|
||||
val handles = messageDemultiplexer.acquireSelectedQueue
|
||||
val handlesList = handles.toArray.toList.asInstanceOf[List[MessageHandle]]
|
||||
for (index <- 0 to handles.size) {
|
||||
val handle = handles.remove
|
||||
val handler = handlers.get(handle.key)
|
||||
val queue = messageDemultiplexer.acquireSelectedQueue
|
||||
for (index <- 0 to queue.size) {
|
||||
val handle = queue.remove
|
||||
val handler = handlers.get(handle.sender)
|
||||
if (handler != null) handler.handle(handle)
|
||||
}
|
||||
}
|
||||
|
|
@ -50,18 +47,14 @@ class EventDrivenDispatcher extends MessageDispatcher {
|
|||
}
|
||||
}
|
||||
|
||||
class EventDrivenDemultiplexer(private val messageQueue: MessageQueue) extends MessageDemultiplexer {
|
||||
class EventBasedDemultiplexer(private val messageQueue: MessageQueue) extends MessageDemultiplexer {
|
||||
private val selectedQueue: Queue[MessageHandle] = new LinkedList[MessageHandle]
|
||||
|
||||
def select = messageQueue.read(selectedQueue)
|
||||
|
||||
def acquireSelectedQueue: Queue[MessageHandle] = selectedQueue
|
||||
|
||||
def releaseSelectedQueue = {
|
||||
throw new UnsupportedOperationException
|
||||
}
|
||||
def releaseSelectedQueue = throw new UnsupportedOperationException("EventBasedDemultiplexer can't release its queue since it is always alive and kicking")
|
||||
|
||||
def wakeUp = {
|
||||
throw new UnsupportedOperationException
|
||||
}
|
||||
def wakeUp = throw new UnsupportedOperationException("EventBasedDemultiplexer can't be woken up isince always alive and kicking")
|
||||
}
|
||||
|
|
@ -25,6 +25,7 @@ trait CompletableFutureResult extends FutureResult {
|
|||
}
|
||||
|
||||
class GenericFutureResult(val timeoutInNanos: Long) extends CompletableFutureResult {
|
||||
|
||||
private val _startTimeInNanos = currentTimeInNanos
|
||||
private val _lock = new ReentrantLock
|
||||
private val _signal = _lock.newCondition
|
||||
|
|
@ -82,7 +83,6 @@ class GenericFutureResult(val timeoutInNanos: Long) extends CompletableFutureRes
|
|||
_completed = true
|
||||
_result = result
|
||||
}
|
||||
|
||||
} finally {
|
||||
_signal.signalAll
|
||||
_lock.unlock
|
||||
|
|
|
|||
|
|
@ -26,11 +26,11 @@ trait MessageDemultiplexer {
|
|||
def wakeUp
|
||||
}
|
||||
|
||||
class MessageHandle(val key: AnyRef, val message: AnyRef, val future: CompletableFutureResult) {
|
||||
class MessageHandle(val sender: AnyRef, val message: AnyRef, val future: CompletableFutureResult) {
|
||||
|
||||
override def hashCode(): Int = {
|
||||
var result = HashCode.SEED
|
||||
result = HashCode.hash(result, key)
|
||||
result = HashCode.hash(result, sender)
|
||||
result = HashCode.hash(result, message)
|
||||
result = HashCode.hash(result, future)
|
||||
result
|
||||
|
|
@ -39,7 +39,7 @@ class MessageHandle(val key: AnyRef, val message: AnyRef, val future: Completabl
|
|||
override def equals(that: Any): Boolean =
|
||||
that != null &&
|
||||
that.isInstanceOf[MessageHandle] &&
|
||||
that.asInstanceOf[MessageHandle].key == key &&
|
||||
that.asInstanceOf[MessageHandle].sender == sender &&
|
||||
that.asInstanceOf[MessageHandle].message == message &&
|
||||
that.asInstanceOf[MessageHandle].future == future
|
||||
}
|
||||
|
|
@ -48,6 +48,9 @@ trait MessageHandler {
|
|||
def handle(message: MessageHandle)
|
||||
}
|
||||
|
||||
class GenericServerMessageHandler(val server: GenericServer) extends MessageHandler {
|
||||
def handle(handle: MessageHandle) = server.handle(handle.message, handle.future)
|
||||
}
|
||||
|
||||
class MessageQueue {
|
||||
private val handles: Queue[MessageHandle] = new LinkedList[MessageHandle]
|
||||
|
|
@ -59,16 +62,9 @@ class MessageQueue {
|
|||
}
|
||||
|
||||
def read(destination: Queue[MessageHandle]) = handles.synchronized {
|
||||
while (handles.isEmpty && !interrupted) {
|
||||
handles.wait
|
||||
}
|
||||
if (!interrupted) {
|
||||
while (!handles.isEmpty) {
|
||||
destination.offer(handles.remove)
|
||||
}
|
||||
} else {
|
||||
interrupted = false
|
||||
}
|
||||
while (handles.isEmpty && !interrupted) handles.wait
|
||||
if (!interrupted) while (!handles.isEmpty) destination.offer(handles.remove)
|
||||
else interrupted = false
|
||||
}
|
||||
|
||||
def interrupt = handles.synchronized {
|
||||
|
|
|
|||
|
|
@ -14,16 +14,18 @@ import java.util.concurrent.{ConcurrentHashMap, Executors}
|
|||
import java.util.concurrent.locks.ReentrantLock
|
||||
import java.util.{HashSet, LinkedList, Queue}
|
||||
|
||||
// FIXME: lift up common stuff in base
|
||||
class ThreadBasedDispatcher(val threadPoolSize: Int) extends MessageDispatcher {
|
||||
private val handlers = new ConcurrentHashMap[AnyRef, MessageHandler]
|
||||
private val busyHandlers = new HashSet[AnyRef]
|
||||
private val handlerExecutor = Executors.newFixedThreadPool(threadPoolSize)
|
||||
@volatile private var selectorThread: Thread = null
|
||||
private var selectorThread: Thread = null
|
||||
@volatile private var active: Boolean = false
|
||||
private val guard = new Object
|
||||
|
||||
def registerHandler(key: AnyRef, handler: MessageHandler) = handlers.put(key, handler)
|
||||
def registerHandler(key: AnyRef, handler: MessageHandler) = guard.synchronized { handlers.put(key, handler) }
|
||||
|
||||
def unregisterHandler(key: AnyRef) = handlers.remove(key)
|
||||
def unregisterHandler(key: AnyRef) = guard.synchronized { handlers.remove(key) }
|
||||
|
||||
def dispatch(messageQueue: MessageQueue) = {
|
||||
if (!active) {
|
||||
|
|
@ -33,16 +35,17 @@ class ThreadBasedDispatcher(val threadPoolSize: Int) extends MessageDispatcher {
|
|||
override def run = {
|
||||
while (active) {
|
||||
try {
|
||||
guard.synchronized { /* empty */ } // prevents risk for deadlock as described in [http://developers.sun.com/learning/javaoneonline/2006/coreplatform/TS-1315.pdf]
|
||||
messageDemultiplexer.select
|
||||
val handles = messageDemultiplexer.acquireSelectedQueue
|
||||
for (index <- 0 to handles.size) {
|
||||
val handle = handles.peek
|
||||
val handler = checkIfNotBusyThenGet(handle.key)
|
||||
val handler = checkIfNotBusyThenGet(handle.sender)
|
||||
if (handler.isDefined) {
|
||||
handlerExecutor.execute(new Runnable {
|
||||
override def run = {
|
||||
handler.get.handle(handle)
|
||||
free(handle.key)
|
||||
free(handle.sender)
|
||||
messageDemultiplexer.wakeUp
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ class GenericServerContainerSpec extends Suite {
|
|||
def test_bangbangbang = {
|
||||
setup
|
||||
expect("pong") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
expect("got a ping") {
|
||||
inner.log
|
||||
|
|
@ -77,7 +77,7 @@ class GenericServerContainerSpec extends Suite {
|
|||
def test_bangbangbang_Timeout1 = {
|
||||
setup
|
||||
expect("pong") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
expect("got a ping") {
|
||||
inner.log
|
||||
|
|
@ -87,7 +87,7 @@ class GenericServerContainerSpec extends Suite {
|
|||
def test_bangbangbang_Timeout2 = {
|
||||
setup
|
||||
expect("error handler") {
|
||||
server !!! (OneWay, "error handler")
|
||||
server !! (OneWay, "error handler")
|
||||
}
|
||||
expect("got a oneway") {
|
||||
inner.log
|
||||
|
|
@ -98,7 +98,7 @@ class GenericServerContainerSpec extends Suite {
|
|||
setup
|
||||
// using base
|
||||
expect("pong") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
|
||||
// hotswapping
|
||||
|
|
@ -106,7 +106,7 @@ class GenericServerContainerSpec extends Suite {
|
|||
case Ping => reply("hotswapped pong")
|
||||
}))
|
||||
expect("hotswapped pong") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -114,7 +114,7 @@ class GenericServerContainerSpec extends Suite {
|
|||
setup
|
||||
// using base
|
||||
expect("pong") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
|
||||
// hotswapping
|
||||
|
|
@ -122,7 +122,7 @@ class GenericServerContainerSpec extends Suite {
|
|||
case Ping => reply("hotswapped pong")
|
||||
}))
|
||||
expect("hotswapped pong") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
|
||||
// hotswapping again
|
||||
|
|
@ -130,7 +130,7 @@ class GenericServerContainerSpec extends Suite {
|
|||
case Ping => reply("hotswapped pong again")
|
||||
}))
|
||||
expect("hotswapped pong again") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -139,7 +139,7 @@ class GenericServerContainerSpec extends Suite {
|
|||
setup
|
||||
// using base
|
||||
expect("pong") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
|
||||
// hotswapping
|
||||
|
|
@ -147,13 +147,13 @@ class GenericServerContainerSpec extends Suite {
|
|||
case Ping => reply("hotswapped pong")
|
||||
}))
|
||||
expect("hotswapped pong") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
|
||||
// restoring original base
|
||||
server.hotswap(None)
|
||||
expect("pong") {
|
||||
(server !!! Ping).getOrElse("nil")
|
||||
(server !! Ping).getOrElse("nil")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ class SupervisorSpec extends Suite {
|
|||
sup ! Start
|
||||
|
||||
expect("pong") {
|
||||
(pingpong1 !!! Ping).getOrElse("nil")
|
||||
(pingpong1 !! Ping).getOrElse("nil")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -63,7 +63,7 @@ class SupervisorSpec extends Suite {
|
|||
sup ! Start
|
||||
|
||||
intercept(classOf[RuntimeException]) {
|
||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
||||
pingpong1 !! (Die, throw new RuntimeException("TIME OUT"))
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("oneforone") {
|
||||
|
|
@ -77,21 +77,21 @@ class SupervisorSpec extends Suite {
|
|||
sup ! Start
|
||||
|
||||
expect("pong") {
|
||||
(pingpong1 !!! Ping).getOrElse("nil")
|
||||
(pingpong1 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("ping") {
|
||||
messageLog
|
||||
}
|
||||
intercept(classOf[RuntimeException]) {
|
||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
||||
pingpong1 !! (Die, throw new RuntimeException("TIME OUT"))
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingoneforone") {
|
||||
messageLog
|
||||
}
|
||||
expect("pong") {
|
||||
(pingpong1 !!! Ping).getOrElse("nil")
|
||||
(pingpong1 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingoneforoneping") {
|
||||
|
|
@ -104,7 +104,7 @@ class SupervisorSpec extends Suite {
|
|||
val sup = getSingleActorAllForOneSupervisor
|
||||
sup ! Start
|
||||
intercept(classOf[RuntimeException]) {
|
||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
||||
pingpong1 !! (Die, throw new RuntimeException("TIME OUT"))
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("allforone") {
|
||||
|
|
@ -117,21 +117,21 @@ class SupervisorSpec extends Suite {
|
|||
val sup = getSingleActorAllForOneSupervisor
|
||||
sup ! Start
|
||||
expect("pong") {
|
||||
(pingpong1 !!! Ping).getOrElse("nil")
|
||||
(pingpong1 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("ping") {
|
||||
messageLog
|
||||
}
|
||||
intercept(classOf[RuntimeException]) {
|
||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
||||
pingpong1 !! (Die, throw new RuntimeException("TIME OUT"))
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingallforone") {
|
||||
messageLog
|
||||
}
|
||||
expect("pong") {
|
||||
(pingpong1 !!! Ping).getOrElse("nil")
|
||||
(pingpong1 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingallforoneping") {
|
||||
|
|
@ -144,7 +144,7 @@ class SupervisorSpec extends Suite {
|
|||
val sup = getMultipleActorsOneForOneConf
|
||||
sup ! Start
|
||||
intercept(classOf[RuntimeException]) {
|
||||
pingpong3 !!! (Die, throw new RuntimeException("TIME OUT"))
|
||||
pingpong3 !! (Die, throw new RuntimeException("TIME OUT"))
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("oneforone") {
|
||||
|
|
@ -157,37 +157,37 @@ class SupervisorSpec extends Suite {
|
|||
val sup = getMultipleActorsOneForOneConf
|
||||
sup ! Start
|
||||
expect("pong") {
|
||||
(pingpong1 !!! Ping).getOrElse("nil")
|
||||
(pingpong1 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pong") {
|
||||
(pingpong2 !!! Ping).getOrElse("nil")
|
||||
(pingpong2 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pong") {
|
||||
(pingpong3 !!! Ping).getOrElse("nil")
|
||||
(pingpong3 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingpingping") {
|
||||
messageLog
|
||||
}
|
||||
intercept(classOf[RuntimeException]) {
|
||||
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
|
||||
pingpong2 !! (Die, throw new RuntimeException("TIME OUT"))
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingpingpingoneforone") {
|
||||
messageLog
|
||||
}
|
||||
expect("pong") {
|
||||
(pingpong1 !!! Ping).getOrElse("nil")
|
||||
(pingpong1 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pong") {
|
||||
(pingpong2 !!! Ping).getOrElse("nil")
|
||||
(pingpong2 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pong") {
|
||||
(pingpong3 !!! Ping).getOrElse("nil")
|
||||
(pingpong3 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingpingpingoneforonepingpingping") {
|
||||
|
|
@ -200,7 +200,7 @@ class SupervisorSpec extends Suite {
|
|||
val sup = getMultipleActorsAllForOneConf
|
||||
sup ! Start
|
||||
intercept(classOf[RuntimeException]) {
|
||||
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
|
||||
pingpong2 !! (Die, throw new RuntimeException("TIME OUT"))
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("allforoneallforoneallforone") {
|
||||
|
|
@ -213,37 +213,37 @@ class SupervisorSpec extends Suite {
|
|||
val sup = getMultipleActorsAllForOneConf
|
||||
sup ! Start
|
||||
expect("pong") {
|
||||
(pingpong1 !!! Ping).getOrElse("nil")
|
||||
(pingpong1 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pong") {
|
||||
(pingpong2 !!! Ping).getOrElse("nil")
|
||||
(pingpong2 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pong") {
|
||||
(pingpong3 !!! Ping).getOrElse("nil")
|
||||
(pingpong3 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingpingping") {
|
||||
messageLog
|
||||
}
|
||||
intercept(classOf[RuntimeException]) {
|
||||
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
|
||||
pingpong2 !! (Die, throw new RuntimeException("TIME OUT"))
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingpingpingallforoneallforoneallforone") {
|
||||
messageLog
|
||||
}
|
||||
expect("pong") {
|
||||
(pingpong1 !!! Ping).getOrElse("nil")
|
||||
(pingpong1 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pong") {
|
||||
(pingpong2 !!! Ping).getOrElse("nil")
|
||||
(pingpong2 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pong") {
|
||||
(pingpong3 !!! Ping).getOrElse("nil")
|
||||
(pingpong3 !! Ping).getOrElse("nil")
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("pingpingpingallforoneallforoneallforonepingpingping") {
|
||||
|
|
@ -256,7 +256,7 @@ class SupervisorSpec extends Suite {
|
|||
val sup = getNestedSupervisorsAllForOneConf
|
||||
sup ! Start
|
||||
intercept(classOf[RuntimeException]) {
|
||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
||||
pingpong1 !! (Die, throw new RuntimeException("TIME OUT"))
|
||||
}
|
||||
Thread.sleep(100)
|
||||
expect("allforoneallforoneallforone") {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue