completed cassandra read/write (and bench) + added transactional vector and ref + cleaned up transactional state hierarchy + rewrote tx state wiring
This commit is contained in:
parent
e9f7162245
commit
7dec0a747c
60 changed files with 4481 additions and 6283 deletions
146
akka.ipr
146
akka.ipr
|
|
@ -15,11 +15,99 @@
|
||||||
<option name="BUILD_JARS_ON_MAKE" value="false" />
|
<option name="BUILD_JARS_ON_MAKE" value="false" />
|
||||||
</component>
|
</component>
|
||||||
<component name="CodeStyleSettingsManager">
|
<component name="CodeStyleSettingsManager">
|
||||||
<option name="PER_PROJECT_SETTINGS" />
|
<option name="PER_PROJECT_SETTINGS">
|
||||||
<option name="USE_PER_PROJECT_SETTINGS" value="false" />
|
<value>
|
||||||
|
<option name="USE_SAME_INDENTS" value="true" />
|
||||||
|
<option name="OTHER_INDENT_OPTIONS">
|
||||||
|
<value>
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="LINE_SEPARATOR" value=" " />
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="groovy">
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="gsp">
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="java">
|
||||||
|
<option name="INDENT_SIZE" value="4" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="js">
|
||||||
|
<option name="INDENT_SIZE" value="4" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="jsp">
|
||||||
|
<option name="INDENT_SIZE" value="4" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="scala">
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="2" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="sql">
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="xml">
|
||||||
|
<option name="INDENT_SIZE" value="4" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||||
</component>
|
</component>
|
||||||
<component name="CompilerConfiguration">
|
<component name="CompilerConfiguration">
|
||||||
<option name="DEFAULT_COMPILER" value="Javac" />
|
<option name="DEFAULT_COMPILER" value="Eclipse" />
|
||||||
<option name="DEPLOY_AFTER_MAKE" value="0" />
|
<option name="DEPLOY_AFTER_MAKE" value="0" />
|
||||||
<resourceExtensions>
|
<resourceExtensions>
|
||||||
<entry name=".+\.(properties|xml|html|dtd|tld)" />
|
<entry name=".+\.(properties|xml|html|dtd|tld)" />
|
||||||
|
|
@ -78,6 +166,35 @@
|
||||||
<file url="file://$PROJECT_DIR$/supervisor/test-code/test/scala/SupervisorSuite.scala" />
|
<file url="file://$PROJECT_DIR$/supervisor/test-code/test/scala/SupervisorSuite.scala" />
|
||||||
</files>
|
</files>
|
||||||
</module>
|
</module>
|
||||||
|
<module name="kernel">
|
||||||
|
<files>
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/ActiveObject.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/AkkaComponentProvider.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Boot.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Configuration.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/DataFlowVariable.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/ErrRef.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/HashCode.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Helpers.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Kernel.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Logging.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/NetCat.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Serializer.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/State.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Supervisor.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Transaction.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/collection/HashTrie.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/collection/Vector.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/AllSuite.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/GenericServerContainerSuite.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/GenericServerSpec.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/Messages.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala" />
|
||||||
|
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorStateSpec.scala" />
|
||||||
|
</files>
|
||||||
|
</module>
|
||||||
</modules>
|
</modules>
|
||||||
</facet-type>
|
</facet-type>
|
||||||
</autodetection-disabled>
|
</autodetection-disabled>
|
||||||
|
|
@ -253,18 +370,18 @@
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectFileVersion" converted="true" />
|
<component name="ProjectFileVersion" converted="true" />
|
||||||
<component name="ProjectKey">
|
<component name="ProjectKey">
|
||||||
<option name="state" value="project://C:\home\jboner\src\scala\akka\akka.ipr" />
|
<option name="state" value="project:///Users/jboner/src/scala/akka/akka.ipr" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectModuleManager">
|
<component name="ProjectModuleManager">
|
||||||
<modules>
|
<modules>
|
||||||
<module fileurl="file://$PROJECT_DIR$/akka.iml" filepath="$PROJECT_DIR$/akka.iml" />
|
<module fileurl="file://$PROJECT_DIR$/akka.iml" filepath="$PROJECT_DIR$/akka.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/api-java/api-java.iml" filepath="$PROJECT_DIR$/api-java/api-java.iml" />
|
<module fileurl="file://$PROJECT_DIR$/api-java/api-java.iml" filepath="$PROJECT_DIR$/api-java/api-java.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/kernel/kernel.iml" filepath="$PROJECT_DIR$/kernel/kernel.iml" />
|
<module fileurl="file://$PROJECT_DIR$/core/core.iml" filepath="$PROJECT_DIR$/core/core.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/util-java/util-java.iml" filepath="$PROJECT_DIR$/util-java/util-java.iml" />
|
<module fileurl="file://$PROJECT_DIR$/util-java/util-java.iml" filepath="$PROJECT_DIR$/util-java/util-java.iml" />
|
||||||
</modules>
|
</modules>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/out" />
|
<output url="file://$PROJECT_DIR$/build" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ResourceManagerContainer">
|
<component name="ResourceManagerContainer">
|
||||||
<option name="myResourceBundles">
|
<option name="myResourceBundles">
|
||||||
|
|
@ -288,23 +405,6 @@
|
||||||
<mapping directory="" vcs="Git" />
|
<mapping directory="" vcs="Git" />
|
||||||
</component>
|
</component>
|
||||||
<component name="WebServicesPlugin" addRequiredLibraries="true" />
|
<component name="WebServicesPlugin" addRequiredLibraries="true" />
|
||||||
<component name="libraryTable">
|
|
||||||
<library name="scala-2.7.3">
|
|
||||||
<CLASSES>
|
|
||||||
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/lib/scala-compiler.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/lib/scala-dbc.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/lib/scala-library.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/lib/scala-swing.jar!/" />
|
|
||||||
</CLASSES>
|
|
||||||
<JAVADOC />
|
|
||||||
<SOURCES>
|
|
||||||
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/src/scala-compiler-src.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/src/scala-dbc-src.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/src/scala-library-src.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/src/scala-swing-src.jar!/" />
|
|
||||||
</SOURCES>
|
|
||||||
</library>
|
|
||||||
</component>
|
|
||||||
<UsedPathMacros>
|
<UsedPathMacros>
|
||||||
<macro name="MAVEN_REPOSITORY" description="Maven Local Repostiry" />
|
<macro name="MAVEN_REPOSITORY" description="Maven Local Repostiry" />
|
||||||
</UsedPathMacros>
|
</UsedPathMacros>
|
||||||
|
|
|
||||||
457
akka.iws
457
akka.iws
|
|
@ -1,32 +1,9 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project relativePaths="false" version="4">
|
<project relativePaths="false" version="4">
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" name="Default" comment="">
|
<list default="true" name="Default" comment="" />
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/Transaction.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/Transaction.scala" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java" afterPath="$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java" />
|
|
||||||
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/Kernel.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/Kernel.scala" />
|
|
||||||
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java" />
|
|
||||||
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\lib\commons-lang-2.1.jar" afterPath="" />
|
|
||||||
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\lib\log4j-1.2.13.jar" afterPath="" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" afterPath="$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" />
|
|
||||||
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\lib\commons-collections-3.1.jar" afterPath="" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api-java/api-java.iml" afterPath="$PROJECT_DIR$/api-java/api-java.iml" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/nbproject/project.properties" afterPath="$PROJECT_DIR$/kernel/nbproject/project.properties" />
|
|
||||||
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\lib\commons-logging.jar" afterPath="" />
|
|
||||||
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" />
|
|
||||||
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\config\stores.xml" afterPath="" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/kernel.iml" afterPath="$PROJECT_DIR$/kernel/kernel.iml" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/State.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/State.scala" />
|
|
||||||
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\config\cluster.xml" afterPath="" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/bin/start-akka-server.sh" afterPath="$PROJECT_DIR$/bin/start-akka-server.sh" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iml" afterPath="$PROJECT_DIR$/akka.iml" />
|
|
||||||
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\config\server.properties" afterPath="" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
|
|
||||||
</list>
|
|
||||||
<ignored path="akka.iws" />
|
|
||||||
<ignored path=".idea/workspace.xml" />
|
<ignored path=".idea/workspace.xml" />
|
||||||
|
<ignored path="akka.iws" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
|
<component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
|
||||||
<component name="Commander">
|
<component name="Commander">
|
||||||
|
|
@ -76,22 +53,22 @@
|
||||||
</breakpoint_any>
|
</breakpoint_any>
|
||||||
<breakpoint_rules />
|
<breakpoint_rules />
|
||||||
<ui_properties>
|
<ui_properties>
|
||||||
<property name="line_breakpoints_groupByMethods" value="false" />
|
|
||||||
<property name="line_breakpoints_viewId" value="TABLE" />
|
|
||||||
<property name="exception_breakpoints_flattenPackages" value="true" />
|
<property name="exception_breakpoints_flattenPackages" value="true" />
|
||||||
<property name="method_breakpoints_flattenPackages" value="true" />
|
|
||||||
<property name="field_breakpoints_flattenPackages" value="true" />
|
|
||||||
<property name="exception_breakpoints_groupByMethods" value="false" />
|
|
||||||
<property name="line_breakpoints_groupByClasses" value="true" />
|
<property name="line_breakpoints_groupByClasses" value="true" />
|
||||||
|
<property name="exception_breakpoints_groupByMethods" value="false" />
|
||||||
<property name="method_breakpoints_viewId" value="TABLE" />
|
<property name="method_breakpoints_viewId" value="TABLE" />
|
||||||
<property name="field_breakpoints_groupByMethods" value="false" />
|
|
||||||
<property name="line_breakpoints_flattenPackages" value="true" />
|
|
||||||
<property name="field_breakpoints_groupByClasses" value="true" />
|
|
||||||
<property name="method_breakpoints_groupByClasses" value="true" />
|
|
||||||
<property name="exception_breakpoints_viewId" value="TABLE" />
|
|
||||||
<property name="exception_breakpoints_groupByClasses" value="true" />
|
<property name="exception_breakpoints_groupByClasses" value="true" />
|
||||||
<property name="field_breakpoints_viewId" value="TABLE" />
|
<property name="line_breakpoints_viewId" value="TABLE" />
|
||||||
<property name="method_breakpoints_groupByMethods" value="false" />
|
<property name="method_breakpoints_groupByMethods" value="false" />
|
||||||
|
<property name="field_breakpoints_flattenPackages" value="true" />
|
||||||
|
<property name="line_breakpoints_flattenPackages" value="true" />
|
||||||
|
<property name="exception_breakpoints_viewId" value="TABLE" />
|
||||||
|
<property name="field_breakpoints_groupByClasses" value="true" />
|
||||||
|
<property name="method_breakpoints_flattenPackages" value="true" />
|
||||||
|
<property name="field_breakpoints_viewId" value="TABLE" />
|
||||||
|
<property name="line_breakpoints_groupByMethods" value="false" />
|
||||||
|
<property name="method_breakpoints_groupByClasses" value="true" />
|
||||||
|
<property name="field_breakpoints_groupByMethods" value="false" />
|
||||||
</ui_properties>
|
</ui_properties>
|
||||||
</component>
|
</component>
|
||||||
<component name="FavoritesManager">
|
<component name="FavoritesManager">
|
||||||
|
|
@ -99,82 +76,10 @@
|
||||||
</component>
|
</component>
|
||||||
<component name="FileEditorManager">
|
<component name="FileEditorManager">
|
||||||
<leaf>
|
<leaf>
|
||||||
<file leaf-file-name="NetCat.scala" pinned="false" current="false" current-in-tab="false">
|
<file leaf-file-name="GenericServer.scala" pinned="false" current="true" current-in-tab="true">
|
||||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/NetCat.scala">
|
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state line="47" column="1" selection-start="1796" selection-end="1796" vertical-scroll-proportion="0.0">
|
<state line="15" column="22" selection-start="449" selection-end="449" vertical-scroll-proportion="0.18025751">
|
||||||
<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="50" column="1" selection-start="1316" selection-end="1316" vertical-scroll-proportion="0.0">
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
</file>
|
|
||||||
<file leaf-file-name="ActiveObjectGuiceConfigurator.java" pinned="false" current="false" current-in-tab="false">
|
|
||||||
<entry file="file://$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state line="59" column="15" selection-start="2579" selection-end="2579" vertical-scroll-proportion="0.0">
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
</file>
|
|
||||||
<file leaf-file-name="ActiveObjectGuiceConfiguratorTest.java" pinned="false" current="false" current-in-tab="false">
|
|
||||||
<entry file="file://$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state line="8" column="0" selection-start="195" selection-end="195" vertical-scroll-proportion="0.0">
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
</file>
|
|
||||||
<file leaf-file-name="InMemoryStateTest.java" pinned="false" current="false" current-in-tab="false">
|
|
||||||
<entry file="file://$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state line="9" column="0" selection-start="195" selection-end="250" vertical-scroll-proportion="0.0">
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
</file>
|
|
||||||
<file leaf-file-name="CassandraNode.scala" pinned="false" current="true" current-in-tab="true">
|
|
||||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state line="39" column="61" selection-start="1212" selection-end="1212" vertical-scroll-proportion="0.49462366">
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
</file>
|
|
||||||
<file leaf-file-name="storage-conf.xml" pinned="false" current="false" current-in-tab="false">
|
|
||||||
<entry file="file://$PROJECT_DIR$/config/storage-conf.xml">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state line="36" column="49" selection-start="1742" selection-end="1742" vertical-scroll-proportion="0.0">
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
</file>
|
|
||||||
<file leaf-file-name="start-akka-server.sh" pinned="false" current="false" current-in-tab="false">
|
|
||||||
<entry file="file://$PROJECT_DIR$/bin/start-akka-server.sh">
|
|
||||||
<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>
|
|
||||||
</file>
|
|
||||||
<file leaf-file-name="State.scala" pinned="false" current="false" current-in-tab="false">
|
|
||||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/State.scala">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state line="26" column="69" selection-start="581" selection-end="581" vertical-scroll-proportion="0.0">
|
|
||||||
<folding />
|
<folding />
|
||||||
</state>
|
</state>
|
||||||
</provider>
|
</provider>
|
||||||
|
|
@ -187,6 +92,16 @@
|
||||||
<setting name="OPEN_NEW_TAB" value="false" />
|
<setting name="OPEN_NEW_TAB" value="false" />
|
||||||
</FindUsagesManager>
|
</FindUsagesManager>
|
||||||
</component>
|
</component>
|
||||||
|
<component name="MavenImportPreferences">
|
||||||
|
<option name="generalSettings">
|
||||||
|
<MavenGeneralSettings>
|
||||||
|
<option name="workOffline" value="true" />
|
||||||
|
</MavenGeneralSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="MavenRunner">
|
||||||
|
<option name="jreName" value="#JAVA_INTERNAL" />
|
||||||
|
</component>
|
||||||
<component name="ModuleEditorState">
|
<component name="ModuleEditorState">
|
||||||
<option name="LAST_EDITED_MODULE_NAME" />
|
<option name="LAST_EDITED_MODULE_NAME" />
|
||||||
<option name="LAST_EDITED_TAB_NAME" />
|
<option name="LAST_EDITED_TAB_NAME" />
|
||||||
|
|
@ -212,74 +127,6 @@
|
||||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
|
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
|
||||||
</PATH_ELEMENT>
|
</PATH_ELEMENT>
|
||||||
</PATH>
|
</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="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="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="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="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>
|
||||||
<PATH_ELEMENT>
|
<PATH_ELEMENT>
|
||||||
<option name="myItemId" value="akka" />
|
<option name="myItemId" value="akka" />
|
||||||
|
|
@ -290,56 +137,6 @@
|
||||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
|
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
|
||||||
</PATH_ELEMENT>
|
</PATH_ELEMENT>
|
||||||
</PATH>
|
</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="akka" />
|
|
||||||
<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="akka" />
|
|
||||||
<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" />
|
|
||||||
<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="akka" />
|
|
||||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
|
||||||
</PATH_ELEMENT>
|
|
||||||
<PATH_ELEMENT>
|
|
||||||
<option name="myItemId" value="bin" />
|
|
||||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
|
||||||
</PATH_ELEMENT>
|
|
||||||
</PATH>
|
|
||||||
</subPane>
|
</subPane>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectReloadState">
|
<component name="ProjectReloadState">
|
||||||
|
|
@ -360,47 +157,47 @@
|
||||||
</navigator>
|
</navigator>
|
||||||
</component>
|
</component>
|
||||||
<component name="PropertiesComponent">
|
<component name="PropertiesComponent">
|
||||||
<property name="project.structure.last.edited" value="Modules" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth0" value="269" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth1" value="308" />
|
|
||||||
<property name="project.structure.proportion" value="0.15" />
|
<property name="project.structure.proportion" value="0.15" />
|
||||||
<property name="options.splitter.main.proportions" value="0.3" />
|
|
||||||
<property name="RunManagerConfig.showSettingsBeforeRunnig" value="false" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="290" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" />
|
|
||||||
<property name="MemberChooser.sorted" value="false" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder0" value="0" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth2" value="293" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth3" value="972" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth3" value="965" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth2" value="286" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth1" value="301" />
|
|
||||||
<property name="GoToClass.includeJavaFiles" value="false" />
|
<property name="GoToClass.includeJavaFiles" value="false" />
|
||||||
<property name="GoToClass.toSaveIncludeLibraries" value="false" />
|
<property name="MemberChooser.copyJavadoc" value="false" />
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder2" value="2" />
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder2" value="2" />
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder3" value="3" />
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder2" value="2" />
|
||||||
<property name="MemberChooser.showClasses" value="true" />
|
<property name="options.splitter.main.proportions" value="0.3" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth3" value="965" />
|
||||||
|
<property name="GoToFile.includeJavaFiles" value="false" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth0" value="269" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth2" value="286" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth2" value="293" />
|
||||||
<property name="GoToClass.includeLibraries" value="false" />
|
<property name="GoToClass.includeLibraries" value="false" />
|
||||||
<property name="options.splitter.details.proportions" value="0.2" />
|
<property name="options.splitter.details.proportions" value="0.2" />
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" />
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder0" value="0" />
|
||||||
<property name="GoToFile.includeJavaFiles" value="false" />
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder3" value="3" />
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" />
|
<property name="MemberChooser.showClasses" value="true" />
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder1" value="1" />
|
|
||||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder2" value="2" />
|
|
||||||
<property name="options.lastSelected" value="preferences.pluginManager" />
|
|
||||||
<property name="project.structure.side.proportion" value="0.2" />
|
<property name="project.structure.side.proportion" value="0.2" />
|
||||||
<property name="MemberChooser.copyJavadoc" value="false" />
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="290" />
|
||||||
<property name="dynamic.classpath" value="false" />
|
<property name="options.lastSelected" value="project.validation" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" />
|
||||||
|
<property name="GoToClass.toSaveIncludeLibraries" value="false" />
|
||||||
|
<property name="RunManagerConfig.showSettingsBeforeRunnig" value="false" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" />
|
||||||
|
<property name="project.structure.last.edited" value="Modules" />
|
||||||
<property name="options.searchVisible" value="true" />
|
<property name="options.searchVisible" value="true" />
|
||||||
|
<property name="MemberChooser.sorted" value="false" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder1" value="1" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth1" value="301" />
|
||||||
|
<property name="dynamic.classpath" value="false" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth3" value="972" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth1" value="308" />
|
||||||
|
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" />
|
||||||
</component>
|
</component>
|
||||||
<component name="RecentsManager">
|
<component name="RecentsManager">
|
||||||
<key name="CopyClassDialog.RECENTS_KEY">
|
<key name="CopyClassDialog.RECENTS_KEY">
|
||||||
<recent name="se.scalablesolutions.akka.api" />
|
<recent name="se.scalablesolutions.akka.api" />
|
||||||
</key>
|
</key>
|
||||||
</component>
|
</component>
|
||||||
<component name="RunManager" selected="Application.Kernel">
|
<component name="RunManager" selected="Scala Console.Scala Console">
|
||||||
<tempConfiguration default="false" name="Scala Console" type="ScalaScriptConsoleRunConfiguration" factoryName="Scala Console">
|
<tempConfiguration default="false" name="Scala Console" type="ScalaScriptConsoleRunConfiguration" factoryName="Scala Console">
|
||||||
<module name="kernel" />
|
<module name="" />
|
||||||
<setting name="vmparams" value="" />
|
<setting name="vmparams" value="" />
|
||||||
<setting name="consoleArgs" value="" />
|
<setting name="consoleArgs" value="" />
|
||||||
<RunnerSettings RunnerId="Run" />
|
<RunnerSettings RunnerId="Run" />
|
||||||
|
|
@ -409,11 +206,6 @@
|
||||||
<option name="Make" value="true" />
|
<option name="Make" value="true" />
|
||||||
</method>
|
</method>
|
||||||
</tempConfiguration>
|
</tempConfiguration>
|
||||||
<configuration default="true" type="ScalaScriptConsoleRunConfiguration" factoryName="Scala Console">
|
|
||||||
<module name="" />
|
|
||||||
<setting name="vmparams" value="" />
|
|
||||||
<setting name="consoleArgs" value="" />
|
|
||||||
</configuration>
|
|
||||||
<configuration default="true" type="Remote" factoryName="Remote">
|
<configuration default="true" type="Remote" factoryName="Remote">
|
||||||
<option name="USE_SOCKET_TRANSPORT" value="true" />
|
<option name="USE_SOCKET_TRANSPORT" value="true" />
|
||||||
<option name="SERVER_MODE" value="false" />
|
<option name="SERVER_MODE" value="false" />
|
||||||
|
|
@ -421,6 +213,23 @@
|
||||||
<option name="HOST" value="localhost" />
|
<option name="HOST" value="localhost" />
|
||||||
<option name="PORT" value="5005" />
|
<option name="PORT" value="5005" />
|
||||||
</configuration>
|
</configuration>
|
||||||
|
<configuration default="true" type="ScalaScriptConsoleRunConfiguration" factoryName="Scala Console">
|
||||||
|
<module name="" />
|
||||||
|
<setting name="vmparams" value="" />
|
||||||
|
<setting name="consoleArgs" value="" />
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="Applet" factoryName="Applet">
|
||||||
|
<module name="" />
|
||||||
|
<option name="MAIN_CLASS_NAME" />
|
||||||
|
<option name="HTML_FILE_NAME" />
|
||||||
|
<option name="HTML_USED" value="false" />
|
||||||
|
<option name="WIDTH" value="400" />
|
||||||
|
<option name="HEIGHT" value="300" />
|
||||||
|
<option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
|
||||||
|
<option name="VM_PARAMETERS" />
|
||||||
|
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
||||||
|
<option name="ALTERNATIVE_JRE_PATH" />
|
||||||
|
</configuration>
|
||||||
<configuration default="true" type="TestNG" factoryName="TestNG" enabled="false" merge="false" runner="emma">
|
<configuration default="true" type="TestNG" factoryName="TestNG" enabled="false" merge="false" runner="emma">
|
||||||
<module name="" />
|
<module name="" />
|
||||||
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
||||||
|
|
@ -447,31 +256,6 @@
|
||||||
<properties />
|
<properties />
|
||||||
<listeners />
|
<listeners />
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration default="true" type="Applet" factoryName="Applet">
|
|
||||||
<module name="" />
|
|
||||||
<option name="MAIN_CLASS_NAME" />
|
|
||||||
<option name="HTML_FILE_NAME" />
|
|
||||||
<option name="HTML_USED" value="false" />
|
|
||||||
<option name="WIDTH" value="400" />
|
|
||||||
<option name="HEIGHT" value="300" />
|
|
||||||
<option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
|
|
||||||
<option name="VM_PARAMETERS" />
|
|
||||||
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
|
||||||
<option name="ALTERNATIVE_JRE_PATH" />
|
|
||||||
</configuration>
|
|
||||||
<configuration default="true" type="Application" factoryName="Application" enabled="false" merge="false" runner="emma">
|
|
||||||
<option name="MAIN_CLASS_NAME" />
|
|
||||||
<option name="VM_PARAMETERS" />
|
|
||||||
<option name="PROGRAM_PARAMETERS" />
|
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
|
||||||
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
|
||||||
<option name="ALTERNATIVE_JRE_PATH" />
|
|
||||||
<option name="ENABLE_SWING_INSPECTOR" value="false" />
|
|
||||||
<option name="ENV_VARIABLES" />
|
|
||||||
<option name="PASS_PARENT_ENVS" value="true" />
|
|
||||||
<module name="" />
|
|
||||||
<envs />
|
|
||||||
</configuration>
|
|
||||||
<configuration default="true" type="JUnit" factoryName="JUnit" enabled="false" merge="false" runner="emma">
|
<configuration default="true" type="JUnit" factoryName="JUnit" enabled="false" merge="false" runner="emma">
|
||||||
<module name="" />
|
<module name="" />
|
||||||
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
||||||
|
|
@ -491,6 +275,19 @@
|
||||||
</option>
|
</option>
|
||||||
<envs />
|
<envs />
|
||||||
</configuration>
|
</configuration>
|
||||||
|
<configuration default="true" type="Application" factoryName="Application" enabled="false" merge="false" runner="emma">
|
||||||
|
<option name="MAIN_CLASS_NAME" />
|
||||||
|
<option name="VM_PARAMETERS" />
|
||||||
|
<option name="PROGRAM_PARAMETERS" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||||
|
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
||||||
|
<option name="ALTERNATIVE_JRE_PATH" />
|
||||||
|
<option name="ENABLE_SWING_INSPECTOR" value="false" />
|
||||||
|
<option name="ENV_VARIABLES" />
|
||||||
|
<option name="PASS_PARENT_ENVS" value="true" />
|
||||||
|
<module name="" />
|
||||||
|
<envs />
|
||||||
|
</configuration>
|
||||||
<configuration default="false" name="Kernel" type="Application" factoryName="Application" enabled="false" merge="false" sample_coverage="true" runner="emma">
|
<configuration default="false" name="Kernel" type="Application" factoryName="Application" enabled="false" merge="false" sample_coverage="true" runner="emma">
|
||||||
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.kernel.Kernel" />
|
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.kernel.Kernel" />
|
||||||
<option name="VM_PARAMETERS" value="-Dcassandra -Dstorage-config=config/ -Dpidfile=akka.pid" />
|
<option name="VM_PARAMETERS" value="-Dcassandra -Dstorage-config=config/ -Dpidfile=akka.pid" />
|
||||||
|
|
@ -533,7 +330,7 @@
|
||||||
<option name="MERGE_DIFF_USE_ANCESTRY" value="true" />
|
<option name="MERGE_DIFF_USE_ANCESTRY" value="true" />
|
||||||
<option name="UPDATE_LOCK_ON_DEMAND" value="false" />
|
<option name="UPDATE_LOCK_ON_DEMAND" value="false" />
|
||||||
<option name="IGNORE_SPACES_IN_MERGE" value="false" />
|
<option name="IGNORE_SPACES_IN_MERGE" value="false" />
|
||||||
<configuration useDefault="true">C:\Documents and Settings\jboner\Application Data\Subversion</configuration>
|
<configuration useDefault="true">$PROJECT_DIR$/../../../.subversion</configuration>
|
||||||
<myIsUseDefaultProxy>false</myIsUseDefaultProxy>
|
<myIsUseDefaultProxy>false</myIsUseDefaultProxy>
|
||||||
</component>
|
</component>
|
||||||
<component name="TodoView" selected-index="0">
|
<component name="TodoView" selected-index="0">
|
||||||
|
|
@ -557,32 +354,32 @@
|
||||||
</todo-panel>
|
</todo-panel>
|
||||||
</component>
|
</component>
|
||||||
<component name="ToolWindowManager">
|
<component name="ToolWindowManager">
|
||||||
<frame x="-4" y="-4" width="1928" height="1178" extended-state="6" />
|
<frame x="0" y="22" width="1436" height="878" extended-state="0" />
|
||||||
<editor active="false" />
|
<editor active="false" />
|
||||||
<layout>
|
<layout>
|
||||||
|
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32976654" sideWeight="0.5" order="13" 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="14" side_tool="false" />
|
||||||
|
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" />
|
||||||
<window_info id="Data Sources" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
|
<window_info id="Data Sources" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
|
||||||
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="7" side_tool="false" />
|
<window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" 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.32879376" sideWeight="0.5" order="6" side_tool="false" />
|
||||||
|
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3258832" sideWeight="0.67417216" 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.32879376" 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.24945295" sideWeight="0.84143966" 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.3165563" sideWeight="0.5" order="11" 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="12" 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="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.24986653" sideWeight="0.75" order="1" side_tool="false" />
|
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24986653" sideWeight="0.75" 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.32879376" sideWeight="0.5" 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.32879376" sideWeight="0.5" order="7" side_tool="false" />
|
||||||
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39980546" sideWeight="0.5" order="3" 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="14" 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="8" side_tool="false" />
|
|
||||||
<window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" 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="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.32879376" sideWeight="0.5" order="10" side_tool="false" />
|
|
||||||
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3180934" sideWeight="0.5" order="11" side_tool="false" />
|
|
||||||
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="6" side_tool="false" />
|
|
||||||
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24986653" sideWeight="0.84143966" order="0" side_tool="false" />
|
|
||||||
<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="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" />
|
|
||||||
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.35451147" sideWeight="0.6750973" order="1" 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="12" side_tool="false" />
|
|
||||||
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32976654" sideWeight="0.5" order="13" 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="Run" active="false" anchor="bottom" auto_hide="true" internal_type="DOCKED" type="FLOATING" visible="false" weight="0.47276264" sideWeight="0.5" order="2" side_tool="false" x="16" y="58" width="1798" height="1028" />
|
<window_info id="Run" active="false" anchor="bottom" auto_hide="true" internal_type="DOCKED" type="FLOATING" visible="false" weight="0.47276264" sideWeight="0.5" order="2" side_tool="false" x="16" y="58" width="1798" height="1028" />
|
||||||
<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="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.39980546" 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="8" side_tool="false" />
|
||||||
|
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="10" 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" />
|
<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" />
|
||||||
|
<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="9" 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" />
|
<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" />
|
||||||
</layout>
|
</layout>
|
||||||
</component>
|
</component>
|
||||||
|
|
@ -669,22 +466,6 @@
|
||||||
</state>
|
</state>
|
||||||
</provider>
|
</provider>
|
||||||
</entry>
|
</entry>
|
||||||
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state line="50" column="1" selection-start="1316" selection-end="1316" vertical-scroll-proportion="0.0">
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
<entry file="file://$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state line="59" column="15" selection-start="2579" selection-end="2579" vertical-scroll-proportion="0.0">
|
|
||||||
<folding>
|
|
||||||
<element signature="imports" expanded="true" />
|
|
||||||
</folding>
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
<entry file="file://$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java">
|
<entry file="file://$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state line="8" column="0" selection-start="195" selection-end="195" vertical-scroll-proportion="0.0">
|
<state line="8" column="0" selection-start="195" selection-end="195" vertical-scroll-proportion="0.0">
|
||||||
|
|
@ -722,7 +503,37 @@
|
||||||
</entry>
|
</entry>
|
||||||
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala">
|
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state line="39" column="61" selection-start="1212" selection-end="1212" vertical-scroll-proportion="0.49462366">
|
<state line="36" column="11" selection-start="1063" selection-end="1063" vertical-scroll-proportion="0.0">
|
||||||
|
<folding />
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
|
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/Messages.scala">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state line="7" column="12" selection-start="139" selection-end="139" 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="2" column="33" selection-start="49" selection-end="49" vertical-scroll-proportion="0.0">
|
||||||
|
<folding />
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
|
<entry file="file://$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state line="59" column="15" selection-start="2579" selection-end="2579" vertical-scroll-proportion="0.0">
|
||||||
|
<folding>
|
||||||
|
<element signature="imports" expanded="true" />
|
||||||
|
</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="15" column="22" selection-start="449" selection-end="449" vertical-scroll-proportion="0.18025751">
|
||||||
<folding />
|
<folding />
|
||||||
</state>
|
</state>
|
||||||
</provider>
|
</provider>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
<!-- Documentation is available at http://www.sublimetext.com/docs/projects -->
|
|
||||||
<project>
|
|
||||||
<mount dir="." direxclude=".svn"/>
|
|
||||||
</project>
|
|
||||||
|
|
@ -18,7 +18,6 @@
|
||||||
</library>
|
</library>
|
||||||
</orderEntry>
|
</orderEntry>
|
||||||
<orderEntry type="module" module-name="util-java" exported="" />
|
<orderEntry type="module" module-name="util-java" exported="" />
|
||||||
<orderEntry type="module" module-name="kernel" exported="" />
|
|
||||||
<orderEntry type="module-library" exported="">
|
<orderEntry type="module-library" exported="">
|
||||||
<library>
|
<library>
|
||||||
<CLASSES>
|
<CLASSES>
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,13 @@ is divided into following sections:
|
||||||
|
|
||||||
-->
|
-->
|
||||||
<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="api-java-impl">
|
<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="api-java-impl">
|
||||||
|
<fail message="Please build using Ant 1.7.1 or higher.">
|
||||||
|
<condition>
|
||||||
|
<not>
|
||||||
|
<antversion atleast="1.7.1"/>
|
||||||
|
</not>
|
||||||
|
</condition>
|
||||||
|
</fail>
|
||||||
<target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
|
<target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
|
||||||
<!--
|
<!--
|
||||||
======================
|
======================
|
||||||
|
|
@ -153,9 +160,15 @@ is divided into following sections:
|
||||||
<attribute default="${excludes}" name="excludes"/>
|
<attribute default="${excludes}" name="excludes"/>
|
||||||
<attribute default="${javac.debug}" name="debug"/>
|
<attribute default="${javac.debug}" name="debug"/>
|
||||||
<attribute default="/does/not/exist" name="sourcepath"/>
|
<attribute default="/does/not/exist" name="sourcepath"/>
|
||||||
|
<attribute default="/does/not/exist" name="gensrcdir"/>
|
||||||
<element name="customize" optional="true"/>
|
<element name="customize" optional="true"/>
|
||||||
<sequential>
|
<sequential>
|
||||||
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
|
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
|
||||||
|
<src>
|
||||||
|
<dirset dir="@{gensrcdir}" erroronmissingdir="false">
|
||||||
|
<include name="*"/>
|
||||||
|
</dirset>
|
||||||
|
</src>
|
||||||
<classpath>
|
<classpath>
|
||||||
<path path="@{classpath}"/>
|
<path path="@{classpath}"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
@ -271,6 +284,8 @@ is divided into following sections:
|
||||||
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
||||||
<jvmarg line="${debug-args-line}"/>
|
<jvmarg line="${debug-args-line}"/>
|
||||||
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
|
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
|
||||||
|
<jvmarg value="-Dfile.encoding=${source.encoding}"/>
|
||||||
|
<redirector errorencoding="${source.encoding}" inputencoding="${source.encoding}" outputencoding="${source.encoding}"/>
|
||||||
<jvmarg line="${run.jvmargs}"/>
|
<jvmarg line="${run.jvmargs}"/>
|
||||||
<classpath>
|
<classpath>
|
||||||
<path path="@{classpath}"/>
|
<path path="@{classpath}"/>
|
||||||
|
|
@ -287,12 +302,15 @@ is divided into following sections:
|
||||||
<target name="-init-macrodef-java">
|
<target name="-init-macrodef-java">
|
||||||
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
|
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||||
<attribute default="${main.class}" name="classname"/>
|
<attribute default="${main.class}" name="classname"/>
|
||||||
|
<attribute default="${run.classpath}" name="classpath"/>
|
||||||
<element name="customize" optional="true"/>
|
<element name="customize" optional="true"/>
|
||||||
<sequential>
|
<sequential>
|
||||||
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
||||||
|
<jvmarg value="-Dfile.encoding=${source.encoding}"/>
|
||||||
|
<redirector errorencoding="${source.encoding}" inputencoding="${source.encoding}" outputencoding="${source.encoding}"/>
|
||||||
<jvmarg line="${run.jvmargs}"/>
|
<jvmarg line="${run.jvmargs}"/>
|
||||||
<classpath>
|
<classpath>
|
||||||
<path path="${run.classpath}"/>
|
<path path="@{classpath}"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
<syspropertyset>
|
<syspropertyset>
|
||||||
<propertyref prefix="run-sys-prop."/>
|
<propertyref prefix="run-sys-prop."/>
|
||||||
|
|
@ -334,10 +352,15 @@ is divided into following sections:
|
||||||
<!-- You can override this target in the ../build.xml file. -->
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
</target>
|
</target>
|
||||||
<target if="do.depend.true" name="-compile-depend">
|
<target if="do.depend.true" name="-compile-depend">
|
||||||
<j2seproject3:depend/>
|
<pathconvert property="build.generated.subdirs">
|
||||||
|
<dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
|
||||||
|
<include name="*"/>
|
||||||
|
</dirset>
|
||||||
|
</pathconvert>
|
||||||
|
<j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
|
||||||
</target>
|
</target>
|
||||||
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
|
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
|
||||||
<j2seproject3:javac/>
|
<j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
|
||||||
<copy todir="${build.classes.dir}">
|
<copy todir="${build.classes.dir}">
|
||||||
<fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
<fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
||||||
</copy>
|
</copy>
|
||||||
|
|
@ -354,7 +377,7 @@ is divided into following sections:
|
||||||
<target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
|
<target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
|
||||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||||
<j2seproject3:force-recompile/>
|
<j2seproject3:force-recompile/>
|
||||||
<j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/>
|
<j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="-post-compile-single">
|
<target name="-post-compile-single">
|
||||||
<!-- Empty placeholder for easier customization. -->
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
|
@ -444,6 +467,10 @@ is divided into following sections:
|
||||||
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
|
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
|
||||||
<j2seproject1:java classname="${run.class}"/>
|
<j2seproject1:java classname="${run.class}"/>
|
||||||
</target>
|
</target>
|
||||||
|
<target depends="init,-do-not-recompile,compile-test-single" name="run-test-with-main">
|
||||||
|
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
|
||||||
|
<j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
|
||||||
|
</target>
|
||||||
<!--
|
<!--
|
||||||
=================
|
=================
|
||||||
DEBUGGING SECTION
|
DEBUGGING SECTION
|
||||||
|
|
@ -452,6 +479,9 @@ is divided into following sections:
|
||||||
<target depends="init" if="netbeans.home" name="-debug-start-debugger">
|
<target depends="init" if="netbeans.home" name="-debug-start-debugger">
|
||||||
<j2seproject1:nbjpdastart name="${debug.class}"/>
|
<j2seproject1:nbjpdastart name="${debug.class}"/>
|
||||||
</target>
|
</target>
|
||||||
|
<target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
|
||||||
|
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
|
||||||
|
</target>
|
||||||
<target depends="init,compile" name="-debug-start-debuggee">
|
<target depends="init,compile" name="-debug-start-debuggee">
|
||||||
<j2seproject3:debug>
|
<j2seproject3:debug>
|
||||||
<customize>
|
<customize>
|
||||||
|
|
@ -469,6 +499,11 @@ is divided into following sections:
|
||||||
<j2seproject3:debug classname="${debug.class}"/>
|
<j2seproject3:debug classname="${debug.class}"/>
|
||||||
</target>
|
</target>
|
||||||
<target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
|
<target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
|
||||||
|
<target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
|
||||||
|
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
|
||||||
|
<j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
|
||||||
<target depends="init" name="-pre-debug-fix">
|
<target depends="init" name="-pre-debug-fix">
|
||||||
<fail unless="fix.includes">Must set fix.includes</fail>
|
<fail unless="fix.includes">Must set fix.includes</fail>
|
||||||
<property name="javac.includes" value="${fix.includes}.java"/>
|
<property name="javac.includes" value="${fix.includes}.java"/>
|
||||||
|
|
@ -491,6 +526,9 @@ is divided into following sections:
|
||||||
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
|
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
|
||||||
<filename name="**/*.java"/>
|
<filename name="**/*.java"/>
|
||||||
</fileset>
|
</fileset>
|
||||||
|
<fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
|
||||||
|
<include name="**/*.java"/>
|
||||||
|
</fileset>
|
||||||
</javadoc>
|
</javadoc>
|
||||||
</target>
|
</target>
|
||||||
<target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
|
<target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
|
||||||
|
|
@ -552,7 +590,7 @@ is divided into following sections:
|
||||||
<j2seproject3:junit testincludes="**/*Test.java"/>
|
<j2seproject3:junit testincludes="**/*Test.java"/>
|
||||||
</target>
|
</target>
|
||||||
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
|
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
|
||||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
|
||||||
</target>
|
</target>
|
||||||
<target depends="init" if="have.tests" name="test-report"/>
|
<target depends="init" if="have.tests" name="test-report"/>
|
||||||
<target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
|
<target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
|
||||||
|
|
@ -565,7 +603,7 @@ is divided into following sections:
|
||||||
<j2seproject3:junit excludes="" includes="${test.includes}"/>
|
<j2seproject3:junit excludes="" includes="${test.includes}"/>
|
||||||
</target>
|
</target>
|
||||||
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
|
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
|
||||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
|
||||||
</target>
|
</target>
|
||||||
<target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
|
<target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
|
||||||
<!--
|
<!--
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
build.xml.data.CRC32=3e53666f
|
build.xml.data.CRC32=3e53666f
|
||||||
build.xml.script.CRC32=b65508dc
|
build.xml.script.CRC32=b65508dc
|
||||||
build.xml.stylesheet.CRC32=958a1d3e
|
build.xml.stylesheet.CRC32=958a1d3e@1.25.0.45
|
||||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||||
nbproject/build-impl.xml.data.CRC32=3e53666f
|
nbproject/build-impl.xml.data.CRC32=3e53666f
|
||||||
nbproject/build-impl.xml.script.CRC32=0784ec5f
|
nbproject/build-impl.xml.script.CRC32=1b57f6f0
|
||||||
nbproject/build-impl.xml.stylesheet.CRC32=65b8de21
|
nbproject/build-impl.xml.stylesheet.CRC32=ce896a9e@1.25.0.45
|
||||||
|
|
|
||||||
|
|
@ -3,5 +3,4 @@ do.depend=false
|
||||||
do.jar=true
|
do.jar=true
|
||||||
javac.debug=true
|
javac.debug=true
|
||||||
javadoc.preview=true
|
javadoc.preview=true
|
||||||
jaxws.endorsed.dir=C:\\Program Files\\NetBeans 6.5.1\\java2\\modules\\ext\\jaxws21\\api:C:\\Program Files\\NetBeans 6.5.1\\ide10\\modules\\ext\\jaxb\\api
|
user.properties.file=/Users/jboner/.netbeans/dev/build.properties
|
||||||
user.properties.file=C:\\Documents and Settings\\jboner\\.netbeans\\6.5\\build.properties
|
|
||||||
|
|
|
||||||
|
|
@ -23,18 +23,24 @@ dist.javadoc.dir=${dist.dir}/javadoc
|
||||||
excludes=
|
excludes=
|
||||||
file.reference.activation-1.1.jar=../lib/activation-1.1.jar
|
file.reference.activation-1.1.jar=../lib/activation-1.1.jar
|
||||||
file.reference.akka-util-java.jar=../lib/akka-util-java.jar
|
file.reference.akka-util-java.jar=../lib/akka-util-java.jar
|
||||||
|
file.reference.antlr-3.1.3.jar=../lib/antlr-3.1.3.jar
|
||||||
file.reference.aopalliance-1.0.jar=../lib/aopalliance-1.0.jar
|
file.reference.aopalliance-1.0.jar=../lib/aopalliance-1.0.jar
|
||||||
file.reference.asm-3.1.jar=../lib/asm-3.1.jar
|
file.reference.asm-3.1.jar=../lib/asm-3.1.jar
|
||||||
|
file.reference.asm-all-2.2.1.jar=../lib/asm-all-2.2.1.jar
|
||||||
|
file.reference.cassandra.jar=../lib/cassandra.jar
|
||||||
file.reference.catalina-ant.jar=../lib/catalina-ant.jar
|
file.reference.catalina-ant.jar=../lib/catalina-ant.jar
|
||||||
file.reference.cglib-2.2.jar=../lib/cglib-2.2.jar
|
file.reference.cglib-2.2.jar=../lib/cglib-2.2.jar
|
||||||
file.reference.colt-1.2.0.jar=../lib/colt-1.2.0.jar
|
file.reference.colt-1.2.0.jar=../lib/colt-1.2.0.jar
|
||||||
|
file.reference.commons-cli-1.1.jar=../lib/commons-cli-1.1.jar
|
||||||
file.reference.commons-codec-1.3.jar=../lib/commons-codec-1.3.jar
|
file.reference.commons-codec-1.3.jar=../lib/commons-codec-1.3.jar
|
||||||
file.reference.commons-collections-3.1.jar=../lib/commons-collections-3.1.jar
|
file.reference.commons-collections-3.2.1.jar=../lib/commons-collections-3.2.1.jar
|
||||||
file.reference.commons-dbcp-1.2.2.jar=../lib/commons-dbcp-1.2.2.jar
|
file.reference.commons-dbcp-1.2.2.jar=../lib/commons-dbcp-1.2.2.jar
|
||||||
file.reference.commons-httpclient-3.1.jar=../lib/commons-httpclient-3.1.jar
|
file.reference.commons-httpclient-3.1.jar=../lib/commons-httpclient-3.1.jar
|
||||||
file.reference.commons-io-1.3.2.jar=../lib/commons-io-1.3.2.jar
|
file.reference.commons-io-1.3.2.jar=../lib/commons-io-1.3.2.jar
|
||||||
file.reference.commons-lang-2.1.jar=../lib/commons-lang-2.1.jar
|
file.reference.commons-javaflow-1.0-SNAPSHOT.jar=../lib/commons-javaflow-1.0-SNAPSHOT.jar
|
||||||
file.reference.commons-logging.jar=../lib/commons-logging.jar
|
file.reference.commons-lang-2.4.jar=../lib/commons-lang-2.4.jar
|
||||||
|
file.reference.commons-logging-1.0.4.jar=../lib/commons-logging-1.0.4.jar
|
||||||
|
file.reference.commons-math-1.1.jar=../lib/commons-math-1.1.jar
|
||||||
file.reference.commons-pool-1.4.jar=../lib/commons-pool-1.4.jar
|
file.reference.commons-pool-1.4.jar=../lib/commons-pool-1.4.jar
|
||||||
file.reference.configgy-1.2.jar=../lib/configgy-1.2.jar
|
file.reference.configgy-1.2.jar=../lib/configgy-1.2.jar
|
||||||
file.reference.google-collect-snapshot-20090211.jar=../lib/google-collect-snapshot-20090211.jar
|
file.reference.google-collect-snapshot-20090211.jar=../lib/google-collect-snapshot-20090211.jar
|
||||||
|
|
@ -47,6 +53,7 @@ file.reference.grizzly-rcm-1.8.6.3.jar=../lib/grizzly-rcm-1.8.6.3.jar
|
||||||
file.reference.grizzly-servlet-webserver-1.8.6.3.jar=../lib/grizzly-servlet-webserver-1.8.6.3.jar
|
file.reference.grizzly-servlet-webserver-1.8.6.3.jar=../lib/grizzly-servlet-webserver-1.8.6.3.jar
|
||||||
file.reference.guice-core-2.0-SNAPSHOT.jar=../lib/guice-core-2.0-SNAPSHOT.jar
|
file.reference.guice-core-2.0-SNAPSHOT.jar=../lib/guice-core-2.0-SNAPSHOT.jar
|
||||||
file.reference.guice-jsr250-2.0-SNAPSHOT.jar=../lib/guice-jsr250-2.0-SNAPSHOT.jar
|
file.reference.guice-jsr250-2.0-SNAPSHOT.jar=../lib/guice-jsr250-2.0-SNAPSHOT.jar
|
||||||
|
file.reference.high-scale-lib.jar=../lib/high-scale-lib.jar
|
||||||
file.reference.jaxb-api-2.1.jar=../lib/jaxb-api-2.1.jar
|
file.reference.jaxb-api-2.1.jar=../lib/jaxb-api-2.1.jar
|
||||||
file.reference.jaxb-impl-2.1.jar=../lib/jaxb-impl-2.1.jar
|
file.reference.jaxb-impl-2.1.jar=../lib/jaxb-impl-2.1.jar
|
||||||
file.reference.jdom-1.0.jar=../lib/jdom-1.0.jar
|
file.reference.jdom-1.0.jar=../lib/jdom-1.0.jar
|
||||||
|
|
@ -58,23 +65,32 @@ file.reference.jersey-server-1.0.1.jar=../lib/jersey-server-1.0.1.jar
|
||||||
file.reference.jettison-1.0.1.jar=../lib/jettison-1.0.1.jar
|
file.reference.jettison-1.0.1.jar=../lib/jettison-1.0.1.jar
|
||||||
file.reference.jetty-6.1.6rc0.jar=../lib/jetty-6.1.6rc0.jar
|
file.reference.jetty-6.1.6rc0.jar=../lib/jetty-6.1.6rc0.jar
|
||||||
file.reference.jetty-util-6.1.6rc0.jar=../lib/jetty-util-6.1.6rc0.jar
|
file.reference.jetty-util-6.1.6rc0.jar=../lib/jetty-util-6.1.6rc0.jar
|
||||||
|
file.reference.JSAP-2.1.jar=../lib/JSAP-2.1.jar
|
||||||
file.reference.jsr250-api-1.0.jar=../lib/jsr250-api-1.0.jar
|
file.reference.jsr250-api-1.0.jar=../lib/jsr250-api-1.0.jar
|
||||||
file.reference.jsr311-api-1.0.jar=../lib/jsr311-api-1.0.jar
|
file.reference.jsr311-api-1.0.jar=../lib/jsr311-api-1.0.jar
|
||||||
file.reference.junit-3.8.2.jar=../lib/junit-3.8.2.jar
|
file.reference.junit-3.8.2.jar=../lib/junit-3.8.2.jar
|
||||||
|
file.reference.junit-4.5.jar=../lib/junit-4.5.jar
|
||||||
|
file.reference.junit4runner-1.0-SNAPSHOT.jar=../lib/junit4runner-1.0-SNAPSHOT.jar
|
||||||
|
file.reference.libfb303.jar=../lib/libfb303.jar
|
||||||
file.reference.libthrift-20080411p1.jar=../lib/libthrift-20080411p1.jar
|
file.reference.libthrift-20080411p1.jar=../lib/libthrift-20080411p1.jar
|
||||||
file.reference.log4j-1.2.13.jar=../lib/log4j-1.2.13.jar
|
file.reference.libthrift.jar=../lib/libthrift.jar
|
||||||
|
file.reference.log4j-1.2.15.jar=../lib/log4j-1.2.15.jar
|
||||||
|
file.reference.lucene-core-2.2.0.jar=../lib/lucene-core-2.2.0.jar
|
||||||
file.reference.main-java=src/main/java
|
file.reference.main-java=src/main/java
|
||||||
file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar=../lib/mina-core-2.0.0-M2-SNAPSHOT.jar
|
file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar=../lib/mina-core-2.0.0-M2-SNAPSHOT.jar
|
||||||
file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=../lib/mina-integration-scala-2.0.0-M2-SNAPSHOT.jar
|
file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=../lib/mina-integration-scala-2.0.0-M2-SNAPSHOT.jar
|
||||||
|
file.reference.pcj.jar=../lib/pcj.jar
|
||||||
file.reference.protobuf-java-2.0.3.jar=../lib/protobuf-java-2.0.3.jar
|
file.reference.protobuf-java-2.0.3.jar=../lib/protobuf-java-2.0.3.jar
|
||||||
file.reference.rome-0.9.jar=../lib/rome-0.9.jar
|
file.reference.rome-0.9.jar=../lib/rome-0.9.jar
|
||||||
file.reference.scala-library-2.7.3.jar=../lib/scala-library-2.7.3.jar
|
file.reference.scala-library-2.7.3.jar=../lib/scala-library-2.7.3.jar
|
||||||
|
file.reference.scala-library-2.7.3.zip=../lib/scala-library-2.7.3.zip
|
||||||
file.reference.scalatest-0.9.5.jar=../lib/scalatest-0.9.5.jar
|
file.reference.scalatest-0.9.5.jar=../lib/scalatest-0.9.5.jar
|
||||||
file.reference.scalatest-0.9.5.zip=../lib/scalatest-0.9.5.zip
|
file.reference.scalatest-0.9.5.zip=../lib/scalatest-0.9.5.zip
|
||||||
file.reference.servlet-api-2.5.jar=../lib/servlet-api-2.5.jar
|
file.reference.servlet-api-2.5.jar=../lib/servlet-api-2.5.jar
|
||||||
file.reference.slf4j-api-1.4.3.jar=../lib/slf4j-api-1.4.3.jar
|
file.reference.slf4j-api-1.4.3.jar=../lib/slf4j-api-1.4.3.jar
|
||||||
file.reference.slf4j-log4j12-1.4.3.jar=../lib/slf4j-log4j12-1.4.3.jar
|
file.reference.slf4j-log4j12-1.4.3.jar=../lib/slf4j-log4j12-1.4.3.jar
|
||||||
file.reference.stax-api-1.0-2.jar=../lib/stax-api-1.0-2.jar
|
file.reference.stax-api-1.0-2.jar=../lib/stax-api-1.0-2.jar
|
||||||
|
file.reference.stringtemplate-3.0.jar=../lib/stringtemplate-3.0.jar
|
||||||
file.reference.test-java=src/test/java
|
file.reference.test-java=src/test/java
|
||||||
file.reference.velocity-1.5.jar=../lib/velocity-1.5.jar
|
file.reference.velocity-1.5.jar=../lib/velocity-1.5.jar
|
||||||
file.reference.voldemort-0.4a.jar=../lib/voldemort-0.4a.jar
|
file.reference.voldemort-0.4a.jar=../lib/voldemort-0.4a.jar
|
||||||
|
|
@ -85,22 +101,26 @@ includes=**
|
||||||
jar.compress=false
|
jar.compress=false
|
||||||
javac.classpath=\
|
javac.classpath=\
|
||||||
${reference.akka-kernel.jar}:\
|
${reference.akka-kernel.jar}:\
|
||||||
${file.reference.guice-core-2.0-SNAPSHOT.jar}:\
|
|
||||||
${file.reference.guice-jsr250-2.0-SNAPSHOT.jar}:\
|
|
||||||
${file.reference.activation-1.1.jar}:\
|
${file.reference.activation-1.1.jar}:\
|
||||||
|
${file.reference.akka-util-java.jar}:\
|
||||||
|
${file.reference.antlr-3.1.3.jar}:\
|
||||||
${file.reference.aopalliance-1.0.jar}:\
|
${file.reference.aopalliance-1.0.jar}:\
|
||||||
${file.reference.asm-3.1.jar}:\
|
${file.reference.asm-3.1.jar}:\
|
||||||
|
${file.reference.asm-all-2.2.1.jar}:\
|
||||||
|
${file.reference.cassandra.jar}:\
|
||||||
${file.reference.catalina-ant.jar}:\
|
${file.reference.catalina-ant.jar}:\
|
||||||
${file.reference.cglib-2.2.jar}:\
|
${file.reference.cglib-2.2.jar}:\
|
||||||
${file.reference.colt-1.2.0.jar}:\
|
${file.reference.colt-1.2.0.jar}:\
|
||||||
${file.reference.akka-util-java.jar}:\
|
${file.reference.commons-cli-1.1.jar}:\
|
||||||
${file.reference.commons-codec-1.3.jar}:\
|
${file.reference.commons-codec-1.3.jar}:\
|
||||||
${file.reference.commons-collections-3.1.jar}:\
|
${file.reference.commons-collections-3.2.1.jar}:\
|
||||||
${file.reference.commons-dbcp-1.2.2.jar}:\
|
${file.reference.commons-dbcp-1.2.2.jar}:\
|
||||||
${file.reference.commons-httpclient-3.1.jar}:\
|
${file.reference.commons-httpclient-3.1.jar}:\
|
||||||
${file.reference.commons-io-1.3.2.jar}:\
|
${file.reference.commons-io-1.3.2.jar}:\
|
||||||
${file.reference.commons-lang-2.1.jar}:\
|
${file.reference.commons-javaflow-1.0-SNAPSHOT.jar}:\
|
||||||
${file.reference.commons-logging.jar}:\
|
${file.reference.commons-lang-2.4.jar}:\
|
||||||
|
${file.reference.commons-logging-1.0.4.jar}:\
|
||||||
|
${file.reference.commons-math-1.1.jar}:\
|
||||||
${file.reference.commons-pool-1.4.jar}:\
|
${file.reference.commons-pool-1.4.jar}:\
|
||||||
${file.reference.configgy-1.2.jar}:\
|
${file.reference.configgy-1.2.jar}:\
|
||||||
${file.reference.google-collect-snapshot-20090211.jar}:\
|
${file.reference.google-collect-snapshot-20090211.jar}:\
|
||||||
|
|
@ -111,6 +131,9 @@ javac.classpath=\
|
||||||
${file.reference.grizzly-portunif-1.8.6.3.jar}:\
|
${file.reference.grizzly-portunif-1.8.6.3.jar}:\
|
||||||
${file.reference.grizzly-rcm-1.8.6.3.jar}:\
|
${file.reference.grizzly-rcm-1.8.6.3.jar}:\
|
||||||
${file.reference.grizzly-servlet-webserver-1.8.6.3.jar}:\
|
${file.reference.grizzly-servlet-webserver-1.8.6.3.jar}:\
|
||||||
|
${file.reference.guice-core-2.0-SNAPSHOT.jar}:\
|
||||||
|
${file.reference.guice-jsr250-2.0-SNAPSHOT.jar}:\
|
||||||
|
${file.reference.high-scale-lib.jar}:\
|
||||||
${file.reference.jaxb-api-2.1.jar}:\
|
${file.reference.jaxb-api-2.1.jar}:\
|
||||||
${file.reference.jaxb-impl-2.1.jar}:\
|
${file.reference.jaxb-impl-2.1.jar}:\
|
||||||
${file.reference.jdom-1.0.jar}:\
|
${file.reference.jdom-1.0.jar}:\
|
||||||
|
|
@ -122,22 +145,31 @@ javac.classpath=\
|
||||||
${file.reference.jettison-1.0.1.jar}:\
|
${file.reference.jettison-1.0.1.jar}:\
|
||||||
${file.reference.jetty-6.1.6rc0.jar}:\
|
${file.reference.jetty-6.1.6rc0.jar}:\
|
||||||
${file.reference.jetty-util-6.1.6rc0.jar}:\
|
${file.reference.jetty-util-6.1.6rc0.jar}:\
|
||||||
|
${file.reference.JSAP-2.1.jar}:\
|
||||||
${file.reference.jsr250-api-1.0.jar}:\
|
${file.reference.jsr250-api-1.0.jar}:\
|
||||||
${file.reference.jsr311-api-1.0.jar}:\
|
${file.reference.jsr311-api-1.0.jar}:\
|
||||||
${file.reference.junit-3.8.2.jar}:\
|
${file.reference.junit-3.8.2.jar}:\
|
||||||
|
${file.reference.junit-4.5.jar}:\
|
||||||
|
${file.reference.junit4runner-1.0-SNAPSHOT.jar}:\
|
||||||
|
${file.reference.libfb303.jar}:\
|
||||||
${file.reference.libthrift-20080411p1.jar}:\
|
${file.reference.libthrift-20080411p1.jar}:\
|
||||||
${file.reference.log4j-1.2.13.jar}:\
|
${file.reference.libthrift.jar}:\
|
||||||
|
${file.reference.log4j-1.2.15.jar}:\
|
||||||
|
${file.reference.lucene-core-2.2.0.jar}:\
|
||||||
${file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar}:\
|
${file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar}:\
|
||||||
${file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar}:\
|
${file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar}:\
|
||||||
|
${file.reference.pcj.jar}:\
|
||||||
${file.reference.protobuf-java-2.0.3.jar}:\
|
${file.reference.protobuf-java-2.0.3.jar}:\
|
||||||
${file.reference.rome-0.9.jar}:\
|
${file.reference.rome-0.9.jar}:\
|
||||||
${file.reference.scala-library-2.7.3.jar}:\
|
${file.reference.scala-library-2.7.3.jar}:\
|
||||||
|
${file.reference.scala-library-2.7.3.zip}:\
|
||||||
${file.reference.scalatest-0.9.5.jar}:\
|
${file.reference.scalatest-0.9.5.jar}:\
|
||||||
${file.reference.scalatest-0.9.5.zip}:\
|
${file.reference.scalatest-0.9.5.zip}:\
|
||||||
${file.reference.servlet-api-2.5.jar}:\
|
${file.reference.servlet-api-2.5.jar}:\
|
||||||
${file.reference.slf4j-api-1.4.3.jar}:\
|
${file.reference.slf4j-api-1.4.3.jar}:\
|
||||||
${file.reference.slf4j-log4j12-1.4.3.jar}:\
|
${file.reference.slf4j-log4j12-1.4.3.jar}:\
|
||||||
${file.reference.stax-api-1.0-2.jar}:\
|
${file.reference.stax-api-1.0-2.jar}:\
|
||||||
|
${file.reference.stringtemplate-3.0.jar}:\
|
||||||
${file.reference.velocity-1.5.jar}:\
|
${file.reference.velocity-1.5.jar}:\
|
||||||
${file.reference.voldemort-0.4a.jar}:\
|
${file.reference.voldemort-0.4a.jar}:\
|
||||||
${file.reference.voldemort-contrib-0.4a.jar}:\
|
${file.reference.voldemort-contrib-0.4a.jar}:\
|
||||||
|
|
|
||||||
|
|
@ -103,58 +103,58 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase {
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface Foo {
|
interface Foo {
|
||||||
public String foo(String msg);
|
public String foo(String msg);
|
||||||
@oneway public void bar(String msg);
|
@oneway public void bar(String msg);
|
||||||
public void longRunning();
|
public void longRunning();
|
||||||
public void throwsException();
|
public void throwsException();
|
||||||
public Bar getBar();
|
public Bar getBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
class FooImpl implements Foo {
|
||||||
|
@Inject private Bar bar;
|
||||||
|
public Bar getBar() {
|
||||||
|
return bar;
|
||||||
}
|
}
|
||||||
|
public String foo(String msg) {
|
||||||
class FooImpl implements Foo {
|
return msg + "return_foo ";
|
||||||
@Inject private Bar bar;
|
}
|
||||||
public Bar getBar() {
|
public void bar(String msg) {
|
||||||
return bar;
|
bar.bar(msg);
|
||||||
}
|
}
|
||||||
public String foo(String msg) {
|
public void longRunning() {
|
||||||
return msg + "return_foo ";
|
try {
|
||||||
}
|
Thread.sleep(10000);
|
||||||
public void bar(String msg) {
|
} catch (InterruptedException e) {
|
||||||
bar.bar(msg);
|
|
||||||
}
|
|
||||||
public void longRunning() {
|
|
||||||
try {
|
|
||||||
Thread.sleep(10000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void throwsException() {
|
|
||||||
throw new RuntimeException("expected");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public void throwsException() {
|
||||||
interface Bar {
|
throw new RuntimeException("expected");
|
||||||
@oneway void bar(String msg);
|
|
||||||
Ext getExt();
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class BarImpl implements Bar {
|
interface Bar {
|
||||||
@Inject private Ext ext;
|
@oneway void bar(String msg);
|
||||||
public Ext getExt() {
|
Ext getExt();
|
||||||
return ext;
|
}
|
||||||
}
|
|
||||||
public void bar(String msg) {
|
class BarImpl implements Bar {
|
||||||
}
|
@Inject private Ext ext;
|
||||||
|
public Ext getExt() {
|
||||||
|
return ext;
|
||||||
}
|
}
|
||||||
|
public void bar(String msg) {
|
||||||
interface Ext {
|
|
||||||
void ext();
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class ExtImpl implements Ext {
|
interface Ext {
|
||||||
public void ext() {
|
void ext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ExtImpl implements Ext {
|
||||||
|
public void ext() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ import com.google.inject.Scopes;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
|
||||||
public class InMemoryStateTest extends TestCase {
|
public class InMemoryStateTest extends TestCase {
|
||||||
static String messageLog = "";
|
static String messageLog = "";
|
||||||
|
|
||||||
|
|
@ -22,57 +21,50 @@ public class InMemoryStateTest extends TestCase {
|
||||||
|
|
||||||
protected void setUp() {
|
protected void setUp() {
|
||||||
conf.configureActiveObjects(
|
conf.configureActiveObjects(
|
||||||
new RestartStrategy(new AllForOne(), 3, 5000), new Component[]{
|
new RestartStrategy(new AllForOne(), 3, 5000),
|
||||||
new Component(
|
new Component[] {
|
||||||
Stateful.class,
|
new Component(InMemStateful.class, InMemStatefulImpl.class, new LifeCycle(new Permanent(), 1000), 10000000),
|
||||||
StatefulImpl.class,
|
new Component(InMemFailer.class, InMemFailerImpl.class, new LifeCycle(new Permanent(), 1000), 1000),
|
||||||
new LifeCycle(new Permanent(), 1000),
|
new Component(InMemClasher.class, InMemClasherImpl.class, new LifeCycle(new Permanent(), 1000), 100000)
|
||||||
10000000),
|
|
||||||
new Component(
|
|
||||||
Failer.class,
|
|
||||||
FailerImpl.class,
|
|
||||||
new LifeCycle(new Permanent(), 1000),
|
|
||||||
1000),
|
|
||||||
new Component(
|
|
||||||
Clasher.class,
|
|
||||||
ClasherImpl.class,
|
|
||||||
new LifeCycle(new Permanent(), 1000),
|
|
||||||
100000)
|
|
||||||
}).inject().supervise();
|
}).inject().supervise();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() {
|
// public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() {
|
||||||
// Stateful stateful = conf.getActiveObject(Stateful.class);
|
// Stateful stateful = conf.getActiveObject(Stateful.class);
|
||||||
// stateful.setState("stateful", "init"); // set init state
|
// stateful.setState("stateful", "init"); // set init state
|
||||||
// stateful.success("stateful", "new state"); // transactional
|
// stateful.success("stateful", "new state"); // transactional
|
||||||
// assertEquals("new state", stateful.getState("stateful"));
|
// assertEquals("new state", stateful.getState("stateful"));
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// public void testShouldRollbackStateForStatefulServerInCaseOfFailure() {
|
// public void testShouldRollbackStateForStatefulServerInCaseOfFailure() {
|
||||||
// Stateful stateful = conf.getActiveObject(Stateful.class);
|
// Stateful stateful = conf.getActiveObject(Stateful.class);
|
||||||
// stateful.setState("stateful", "init"); // set init state
|
// stateful.setState("stateful", "init"); // set init state
|
||||||
//
|
//
|
||||||
// Failer failer = conf.getActiveObject(Failer.class);
|
// Failer failer = conf.getActiveObject(Failer.class);
|
||||||
// try {
|
// try {
|
||||||
// stateful.failure("stateful", "new state", failer); // call failing transactional method
|
// stateful.failure("stateful", "new state", failer); // call failing
|
||||||
// fail("should have thrown an exception");
|
// transactional method
|
||||||
// } catch (RuntimeException e) { } // expected
|
// fail("should have thrown an exception");
|
||||||
// assertEquals("init", stateful.getState("stateful")); // check that state is == init state
|
// } catch (RuntimeException e) { } // expected
|
||||||
// }
|
// assertEquals("init", stateful.getState("stateful")); // check that state is
|
||||||
|
// == init state
|
||||||
|
// }
|
||||||
|
|
||||||
public void testShouldRollbackStateForStatefulServerInCaseOfMessageClash() {
|
public void testShouldRollbackStateForStatefulServerInCaseOfMessageClash() {
|
||||||
Stateful stateful = conf.getActiveObject(Stateful.class);
|
InMemStateful stateful = conf.getActiveObject(InMemStateful.class);
|
||||||
stateful.setState("stateful", "init"); // set init state
|
stateful.setState("stateful", "init"); // set init state
|
||||||
|
|
||||||
Clasher clasher = conf.getActiveObject(Clasher.class);
|
InMemClasher clasher = conf.getActiveObject(InMemClasher.class);
|
||||||
clasher.setState("clasher", "init"); // set init state
|
clasher.setState("clasher", "init"); // set init state
|
||||||
|
|
||||||
// try {
|
// try {
|
||||||
// stateful.clashOk("stateful", "new state", clasher);
|
// stateful.clashOk("stateful", "new state", clasher);
|
||||||
// } catch (RuntimeException e) { } // expected
|
// } catch (RuntimeException e) { } // expected
|
||||||
// assertEquals("new state", stateful.getState("stateful")); // check that state is == init state
|
// assertEquals("new state", stateful.getState("stateful")); // check that
|
||||||
// assertEquals("was here", clasher.getState("clasher")); // check that state is == init state
|
// state is == init state
|
||||||
|
// assertEquals("was here", clasher.getState("clasher")); // check that
|
||||||
|
// state is == init state
|
||||||
|
|
||||||
try {
|
try {
|
||||||
stateful.clashNotOk("stateful", "new state", clasher);
|
stateful.clashNotOk("stateful", "new state", clasher);
|
||||||
|
|
@ -80,113 +72,111 @@ public class InMemoryStateTest extends TestCase {
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
System.out.println(e);
|
System.out.println(e);
|
||||||
} // expected
|
} // expected
|
||||||
assertEquals("init", stateful.getState("stateful")); // check that state is == init state
|
assertEquals("init", stateful.getState("stateful")); // check that state is
|
||||||
//assertEquals("init", clasher.getState("clasher")); // check that state is == init state
|
// == init state
|
||||||
}
|
// assertEquals("init", clasher.getState("clasher")); // check that state is
|
||||||
|
// == init state
|
||||||
|
|
||||||
interface Stateful {
|
|
||||||
// transactional
|
|
||||||
@transactional
|
|
||||||
public void success(String key, String msg);
|
|
||||||
|
|
||||||
@transactional
|
|
||||||
public void failure(String key, String msg, Failer failer);
|
|
||||||
|
|
||||||
@transactional
|
|
||||||
public void clashOk(String key, String msg, Clasher clasher);
|
|
||||||
|
|
||||||
@transactional
|
|
||||||
public void clashNotOk(String key, String msg, Clasher clasher);
|
|
||||||
|
|
||||||
// non-transactional
|
|
||||||
public String getState(String key);
|
|
||||||
|
|
||||||
public void setState(String key, String value);
|
|
||||||
}
|
|
||||||
|
|
||||||
class StatefulImpl implements Stateful {
|
|
||||||
@state
|
|
||||||
private
|
|
||||||
InMemoryState<String, Object> state = new InMemoryState<String, Object>();
|
|
||||||
|
|
||||||
public String getState(String key) {
|
|
||||||
return (String) state.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setState(String key, String msg) {
|
|
||||||
state.put(key, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void success(String key, String msg) {
|
|
||||||
state.put(key, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void failure(String key, String msg, Failer failer) {
|
|
||||||
state.put(key, msg);
|
|
||||||
failer.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clashOk(String key, String msg, Clasher clasher) {
|
|
||||||
state.put(key, msg);
|
|
||||||
clasher.clash();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clashNotOk(String key, String msg, Clasher clasher) {
|
|
||||||
state.put(key, msg);
|
|
||||||
clasher.clash();
|
|
||||||
clasher.clash();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Failer {
|
|
||||||
public void fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
class FailerImpl implements Failer {
|
|
||||||
public void fail() {
|
|
||||||
throw new RuntimeException("expected");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Clasher {
|
|
||||||
public void clash();
|
|
||||||
|
|
||||||
public String getState(String key);
|
|
||||||
|
|
||||||
public void setState(String key, String value);
|
|
||||||
}
|
|
||||||
|
|
||||||
class ClasherImpl implements Clasher {
|
|
||||||
@state
|
|
||||||
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
|
|
||||||
|
|
||||||
public String getState(String key) {
|
|
||||||
return (String) state.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setState(String key, String msg) {
|
|
||||||
state.put(key, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clash() {
|
|
||||||
state.put("clasher", "was here");
|
|
||||||
// spend some time here
|
|
||||||
for (long i = 0; i < 1000000000; i++) {
|
|
||||||
for (long j = 0; j < 10000000; j++) {
|
|
||||||
j += i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: this statement gives me this error:
|
|
||||||
// se.scalablesolutions.akka.kernel.ActiveObjectException:
|
|
||||||
// Unexpected message [!(scala.actors.Channel@c2b2f6,ErrRef[Right(null)])] to
|
|
||||||
// [GenericServer[se.scalablesolutions.akka.api.StatefulImpl]] from
|
|
||||||
// [GenericServer[se.scalablesolutions.akka.api.ClasherImpl]]]
|
|
||||||
//try { Thread.sleep(1000); } catch (InterruptedException e) {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface InMemStateful {
|
||||||
|
// transactional
|
||||||
|
@transactional
|
||||||
|
public void success(String key, String msg);
|
||||||
|
|
||||||
|
@transactional
|
||||||
|
public void failure(String key, String msg, InMemFailer failer);
|
||||||
|
|
||||||
|
@transactional
|
||||||
|
public void clashOk(String key, String msg, InMemClasher clasher);
|
||||||
|
|
||||||
|
@transactional
|
||||||
|
public void clashNotOk(String key, String msg, InMemClasher clasher);
|
||||||
|
|
||||||
|
// non-transactional
|
||||||
|
public String getState(String key);
|
||||||
|
|
||||||
|
public void setState(String key, String value);
|
||||||
|
}
|
||||||
|
|
||||||
|
class InMemStatefulImpl implements InMemStateful {
|
||||||
|
@state
|
||||||
|
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
|
||||||
|
|
||||||
|
public String getState(String key) {
|
||||||
|
return (String) state.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(String key, String msg) {
|
||||||
|
state.put(key, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void success(String key, String msg) {
|
||||||
|
state.put(key, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void failure(String key, String msg, InMemFailer failer) {
|
||||||
|
state.put(key, msg);
|
||||||
|
failer.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clashOk(String key, String msg, InMemClasher clasher) {
|
||||||
|
state.put(key, msg);
|
||||||
|
clasher.clash();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clashNotOk(String key, String msg, InMemClasher clasher) {
|
||||||
|
state.put(key, msg);
|
||||||
|
clasher.clash();
|
||||||
|
clasher.clash();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface InMemFailer {
|
||||||
|
public void fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
class InMemFailerImpl implements InMemFailer {
|
||||||
|
public void fail() {
|
||||||
|
throw new RuntimeException("expected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface InMemClasher {
|
||||||
|
public void clash();
|
||||||
|
|
||||||
|
public String getState(String key);
|
||||||
|
|
||||||
|
public void setState(String key, String value);
|
||||||
|
}
|
||||||
|
|
||||||
|
class InMemClasherImpl implements InMemClasher {
|
||||||
|
@state
|
||||||
|
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
|
||||||
|
|
||||||
|
public String getState(String key) {
|
||||||
|
return (String) state.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(String key, String msg) {
|
||||||
|
state.put(key, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clash() {
|
||||||
|
state.put("clasher", "was here");
|
||||||
|
// spend some time here
|
||||||
|
for (long i = 0; i < 1000000000; i++) {
|
||||||
|
for (long j = 0; j < 10000000; j++) {
|
||||||
|
j += i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: this statement gives me this error:
|
||||||
|
// se.scalablesolutions.akka.kernel.ActiveObjectException:
|
||||||
|
// Unexpected message [!(scala.actors.Channel@c2b2f6,ErrRef[Right(null)])]
|
||||||
|
// to
|
||||||
|
// [GenericServer[se.scalablesolutions.akka.api.StatefulImpl]] from
|
||||||
|
// [GenericServer[se.scalablesolutions.akka.api.ClasherImpl]]]
|
||||||
|
// try { Thread.sleep(1000); } catch (InterruptedException e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ import com.google.inject.Scopes;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
|
||||||
public class PersistentStateTest extends TestCase {
|
public class PersistentStateTest extends TestCase {
|
||||||
static String messageLog = "";
|
static String messageLog = "";
|
||||||
|
|
||||||
|
|
@ -22,131 +21,121 @@ public class PersistentStateTest extends TestCase {
|
||||||
|
|
||||||
protected void setUp() {
|
protected void setUp() {
|
||||||
conf.configureActiveObjects(
|
conf.configureActiveObjects(
|
||||||
new RestartStrategy(new AllForOne(), 3, 5000), new Component[]{
|
new RestartStrategy(new AllForOne(), 3, 5000),
|
||||||
new Component(
|
new Component[] {
|
||||||
Stateful.class,
|
new Component(PersistentStateful.class, PersistentStatefulImpl.class, new LifeCycle(new Permanent(), 1000), 10000000),
|
||||||
StatefulImpl.class,
|
new Component(PersistentFailer.class, PersistentFailerImpl.class, new LifeCycle(new Permanent(), 1000), 1000),
|
||||||
new LifeCycle(new Permanent(), 1000),
|
new Component(PersistentClasher.class, PersistentClasherImpl.class, new LifeCycle(new Permanent(), 1000), 100000)
|
||||||
10000000),
|
|
||||||
new Component(
|
|
||||||
Failer.class,
|
|
||||||
FailerImpl.class,
|
|
||||||
new LifeCycle(new Permanent(), 1000),
|
|
||||||
1000),
|
|
||||||
new Component(
|
|
||||||
Clasher.class,
|
|
||||||
ClasherImpl.class,
|
|
||||||
new LifeCycle(new Permanent(), 1000),
|
|
||||||
100000)
|
|
||||||
}).inject().supervise();
|
}).inject().supervise();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() {
|
public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() {
|
||||||
Stateful stateful = conf.getActiveObject(Stateful.class);
|
PersistentStateful stateful = conf.getActiveObject(PersistentStateful.class);
|
||||||
stateful.setState("stateful", "init"); // set init state
|
stateful.setState("stateful", "init"); // set init state
|
||||||
stateful.success("stateful", "new state"); // transactional
|
stateful.success("stateful", "new state"); // transactional
|
||||||
assertEquals("new state", stateful.getState("stateful"));
|
assertEquals("new state", stateful.getState("stateful"));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface Stateful {
|
interface PersistentStateful {
|
||||||
// transactional
|
// transactional
|
||||||
@transactional
|
@transactional
|
||||||
public void success(String key, String msg);
|
public void success(String key, String msg);
|
||||||
|
|
||||||
@transactional
|
@transactional
|
||||||
public void failure(String key, String msg, Failer failer);
|
public void failure(String key, String msg, PersistentFailer failer);
|
||||||
|
|
||||||
@transactional
|
@transactional
|
||||||
public void clashOk(String key, String msg, Clasher clasher);
|
public void clashOk(String key, String msg, PersistentClasher clasher);
|
||||||
|
|
||||||
@transactional
|
@transactional
|
||||||
public void clashNotOk(String key, String msg, Clasher clasher);
|
public void clashNotOk(String key, String msg, PersistentClasher clasher);
|
||||||
|
|
||||||
// non-transactional
|
// non-transactional
|
||||||
public String getState(String key);
|
public String getState(String key);
|
||||||
|
|
||||||
public void setState(String key, String value);
|
public void setState(String key, String value);
|
||||||
|
}
|
||||||
|
|
||||||
|
class PersistentStatefulImpl implements PersistentStateful {
|
||||||
|
@state
|
||||||
|
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
|
||||||
|
|
||||||
|
public String getState(String key) {
|
||||||
|
return (String) state.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
class StatefulImpl implements Stateful {
|
public void setState(String key, String msg) {
|
||||||
@state
|
state.put(key, msg);
|
||||||
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
|
|
||||||
|
|
||||||
public String getState(String key) {
|
|
||||||
return (String) state.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setState(String key, String msg) {
|
|
||||||
state.put(key, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void success(String key, String msg) {
|
|
||||||
state.put(key, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void failure(String key, String msg, Failer failer) {
|
|
||||||
state.put(key, msg);
|
|
||||||
failer.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clashOk(String key, String msg, Clasher clasher) {
|
|
||||||
state.put(key, msg);
|
|
||||||
clasher.clash();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clashNotOk(String key, String msg, Clasher clasher) {
|
|
||||||
state.put(key, msg);
|
|
||||||
clasher.clash();
|
|
||||||
clasher.clash();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Failer {
|
public void success(String key, String msg) {
|
||||||
public void fail();
|
state.put(key, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
class FailerImpl implements Failer {
|
public void failure(String key, String msg, PersistentFailer failer) {
|
||||||
public void fail() {
|
state.put(key, msg);
|
||||||
throw new RuntimeException("expected");
|
failer.fail();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Clasher {
|
public void clashOk(String key, String msg, PersistentClasher clasher) {
|
||||||
public void clash();
|
state.put(key, msg);
|
||||||
|
clasher.clash();
|
||||||
public String getState(String key);
|
|
||||||
|
|
||||||
public void setState(String key, String value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ClasherImpl implements Clasher {
|
public void clashNotOk(String key, String msg, PersistentClasher clasher) {
|
||||||
@state
|
state.put(key, msg);
|
||||||
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
|
clasher.clash();
|
||||||
|
clasher.clash();
|
||||||
public String getState(String key) {
|
}
|
||||||
return (String) state.get(key);
|
}
|
||||||
}
|
|
||||||
|
interface PersistentFailer {
|
||||||
public void setState(String key, String msg) {
|
public void fail();
|
||||||
state.put(key, msg);
|
}
|
||||||
}
|
|
||||||
|
class PersistentFailerImpl implements PersistentFailer {
|
||||||
public void clash() {
|
public void fail() {
|
||||||
state.put("clasher", "was here");
|
throw new RuntimeException("expected");
|
||||||
// spend some time here
|
}
|
||||||
for (long i = 0; i < 1000000000; i++) {
|
}
|
||||||
for (long j = 0; j < 10000000; j++) {
|
|
||||||
j += i;
|
interface PersistentClasher {
|
||||||
}
|
public void clash();
|
||||||
}
|
|
||||||
|
public String getState(String key);
|
||||||
// FIXME: this statement gives me this error:
|
|
||||||
// se.scalablesolutions.akka.kernel.ActiveObjectException:
|
public void setState(String key, String value);
|
||||||
// Unexpected message [!(scala.actors.Channel@c2b2f6,ErrRef[Right(null)])] to
|
}
|
||||||
// [GenericServer[se.scalablesolutions.akka.api.StatefulImpl]] from
|
|
||||||
// [GenericServer[se.scalablesolutions.akka.api.ClasherImpl]]]
|
class PersistentClasherImpl implements PersistentClasher {
|
||||||
//try { Thread.sleep(1000); } catch (InterruptedException e) {}
|
@state
|
||||||
}
|
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
|
||||||
|
|
||||||
|
public String getState(String key) {
|
||||||
|
return (String) state.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(String key, String msg) {
|
||||||
|
state.put(key, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clash() {
|
||||||
|
state.put("clasher", "was here");
|
||||||
|
// spend some time here
|
||||||
|
for (long i = 0; i < 1000000000; i++) {
|
||||||
|
for (long j = 0; j < 10000000; j++) {
|
||||||
|
j += i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: this statement gives me this error:
|
||||||
|
// se.scalablesolutions.akka.kernel.ActiveObjectException:
|
||||||
|
// Unexpected message [!(scala.actors.Channel@c2b2f6,ErrRef[Right(null)])]
|
||||||
|
// to
|
||||||
|
// [GenericServer[se.scalablesolutions.akka.api.StatefulImpl]] from
|
||||||
|
// [GenericServer[se.scalablesolutions.akka.api.ClasherImpl]]]
|
||||||
|
// try { Thread.sleep(1000); } catch (InterruptedException e) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
43
buildfile
43
buildfile
|
|
@ -22,25 +22,33 @@ JERSEY = ['com.sun.jersey:jersey-core:jar:1.0.1',
|
||||||
'com.sun.jersey:jersey-json:jar:1.0.1',
|
'com.sun.jersey:jersey-json:jar:1.0.1',
|
||||||
'com.sun.jersey:jersey-atom:jar:1.0.1',
|
'com.sun.jersey:jersey-atom:jar:1.0.1',
|
||||||
'javax.ws.rs:jsr311-api:jar:1.0']
|
'javax.ws.rs:jsr311-api:jar:1.0']
|
||||||
VOLDEMORT = ['voldemort:voldemort:jar:0.4a',
|
|
||||||
'voldemort:voldemort-contrib:jar:0.4a']
|
|
||||||
ZOOKEEPER = 'org.apache:zookeeper:jar:3.1.0'
|
|
||||||
GRIZZLY = 'com.sun.grizzly:grizzly-servlet-webserver:jar:1.8.6.3'
|
GRIZZLY = 'com.sun.grizzly:grizzly-servlet-webserver:jar:1.8.6.3'
|
||||||
MINA_CORE = 'com.assembla.scala.mina:mina-core:jar:2.0.0-M2-SNAPSHOT'
|
NETTY = 'org.jboss.netty:netty:jar:3.1.0.BETA2'
|
||||||
MINA_SCALA = 'com.assembla.scala.mina:mina-integration-scala:jar:2.0.0-M2-SNAPSHOT'
|
CASSANDRA = 'org.apache.cassandra:cassandra:jar:1.0'
|
||||||
|
THRIFT = 'com.facebook:thrift:jar:1.0'
|
||||||
|
FB303 = 'com.facebook:fb303:jar:1.0'
|
||||||
CONFIGGY = 'net.lag:configgy:jar:1.2'
|
CONFIGGY = 'net.lag:configgy:jar:1.2'
|
||||||
|
|
||||||
|
JSR_250 = 'javax.annotation:jsr250-api:jar:1.0'
|
||||||
|
|
||||||
SLF4J = ['org.slf4j:slf4j-log4j12:jar:1.4.3',
|
SLF4J = ['org.slf4j:slf4j-log4j12:jar:1.4.3',
|
||||||
'org.slf4j:slf4j-api:jar:1.4.3',
|
'org.slf4j:slf4j-api:jar:1.4.3',
|
||||||
'log4j:log4j:jar:1.2.13']
|
'log4j:log4j:jar:1.2.13']
|
||||||
JDOM = 'jdom:jdom:jar:1.0'
|
JDOM = 'jdom:jdom:jar:1.0'
|
||||||
|
CGLIB = 'cglib:cglib-nodep:jar:2.1_3'
|
||||||
|
AOPALLIANCE = 'aopalliance:aopalliance:jar:1.0'
|
||||||
GOOGLE_COLLECT = 'com.google.code.google-collections:google-collect:jar:snapshot-20080530'
|
GOOGLE_COLLECT = 'com.google.code.google-collections:google-collect:jar:snapshot-20080530'
|
||||||
|
|
||||||
SCALA = 'org.scala-lang:scala-library:jar:2.7.3'
|
SCALA = 'org.scala-lang:scala-library:jar:2.7.3'
|
||||||
SCALATEST = 'org.scala-tools.testing:scalatest:jar:0.9.5'
|
SCALATEST = 'org.scala-tools.testing:scalatest:jar:0.9.5'
|
||||||
JUNIT4 = 'junit:junit:jar:4.5'
|
JUNIT4 = 'junit:junit:jar:4.5'
|
||||||
JUNIT3 = 'junit:junit:jar:3.8.2'
|
JUNIT4RUNNER = 'com.jteigen.scalatest:junit4runner:jar:1.0'
|
||||||
#SCALATEST_JUNIT4_MVN_PLUGIN = 'com.jteigen.scalatest:junit4runner:jar:1.0-SNAPSHOT'
|
|
||||||
|
#VOLDEMORT = ['voldemort:voldemort:jar:0.4a',
|
||||||
|
# 'voldemort:voldemort-contrib:jar:0.4a']
|
||||||
|
#MINA_CORE = 'com.assembla.scala.mina:mina-core:jar:2.0.0-M2-SNAPSHOT'
|
||||||
|
#MINA_SCALA = 'com.assembla.scala.mina:mina-integration-scala:jar:2.0.0-M2-SNAPSHOT'
|
||||||
|
#ZOOKEEPER = 'org.apache:zookeeper:jar:3.1.0'
|
||||||
|
|
||||||
desc 'The Akka Actor Kernel'
|
desc 'The Akka Actor Kernel'
|
||||||
define 'akka' do
|
define 'akka' do
|
||||||
|
|
@ -55,16 +63,17 @@ define 'akka' do
|
||||||
package :jar
|
package :jar
|
||||||
end
|
end
|
||||||
|
|
||||||
desc 'Akka Actor kernel core implementation'
|
desc 'Akka Actor Kernel core implementation'
|
||||||
define 'kernel' do
|
define 'kernel' do
|
||||||
compile.with(AKKA_UTIL_JAVA, GUICEYFRUIT, MINA_CORE, MINA_SCALA, JERSEY, VOLDEMORT, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY)
|
compile.with(AKKA_UTIL_JAVA, GUICEYFRUIT, NETTY, JERSEY, GRIZZLY, CASSANDRA, THRIFT, FB303, SLF4J, CONFIGGY, JUNIT4RUNNER, JUNIT4, SCALATEST)
|
||||||
test.using :scalatest
|
test.using :junit
|
||||||
package :jar
|
package :jar
|
||||||
end
|
end
|
||||||
|
|
||||||
desc 'Akka Java API'
|
desc 'Akka Java API'
|
||||||
define 'api-java' do
|
define 'api-java' do
|
||||||
compile.with(AKKA_KERNEL, AKKA_UTIL_JAVA, GUICEYFRUIT)
|
compile.with(AKKA_KERNEL, AKKA_UTIL_JAVA, NETTY, JERSEY, GRIZZLY, CASSANDRA, THRIFT, FB303, SLF4J, CONFIGGY, GUICEYFRUIT, SCALA, GOOGLE_COLLECT, AOPALLIANCE, CGLIB, JSR_250)
|
||||||
|
test.using :junit
|
||||||
package :jar
|
package :jar
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -74,20 +83,12 @@ define 'akka' do
|
||||||
# test.using :scalatest
|
# test.using :scalatest
|
||||||
# package :jar
|
# package :jar
|
||||||
#end
|
#end
|
||||||
#desc 'Implementation of Erlangs Supervisor and GenericServer behaviors'
|
|
||||||
#define 'supervisor' do
|
|
||||||
# compile.with(CONFIGGY)
|
|
||||||
# test.using :scalatest
|
|
||||||
# package :jar
|
|
||||||
#end
|
|
||||||
|
|
||||||
|
|
||||||
package(:zip).include 'README'
|
package(:zip).include 'README'
|
||||||
package(:zip).include 'bin/*', :path=>'bin'
|
package(:zip).include 'bin/*', :path=>'bin'
|
||||||
package(:zip).include 'config/*', :path=>'config'
|
package(:zip).include 'config/*', :path=>'config'
|
||||||
package(:zip).include 'kernel/lib/*', :path=>'lib'
|
package(:zip).include 'kernel/lib/*', :path=>'lib'
|
||||||
package(:zip).include 'kernel/target/*.jar', :path=>'lib'
|
package(:zip).include 'kernel/target/*.jar', :path=>'lib'
|
||||||
#package(:zip).include 'supervisor/target/*.jar', :path=>'lib'
|
|
||||||
package(:zip).include 'api-java/target/*.jar', :path=>'lib'
|
package(:zip).include 'api-java/target/*.jar', :path=>'lib'
|
||||||
package(:zip).include 'util-java/target/*.jar', :path=>'lib'
|
package(:zip).include 'util-java/target/*.jar', :path=>'lib'
|
||||||
|
|
||||||
|
|
@ -100,7 +101,7 @@ define 'akka' do
|
||||||
# uri = URI("file://./lib")
|
# uri = URI("file://./lib")
|
||||||
# uri.upload file('kernel')
|
# uri.upload file('kernel')
|
||||||
|
|
||||||
cp = [SCALA, GUICEYFRUIT, JERSEY, VOLDEMORT, GOOGLE_COLLECT, JDOM, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY, project('kernel').package(:jar)]
|
cp = [SCALA, GUICEYFRUIT, JERSEY, CASSANDRA, GOOGLE_COLLECT, JDOM, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY, project('kernel').package(:jar)]
|
||||||
# Java.java('se.scalablesolutions.akka.kernel.Kernel', {:classpath => '-cp ' + cp})
|
# Java.java('se.scalablesolutions.akka.kernel.Kernel', {:classpath => '-cp ' + cp})
|
||||||
# cp = FileList[_('lib/*')].join(File::PATH_SEPARATOR)
|
# cp = FileList[_('lib/*')].join(File::PATH_SEPARATOR)
|
||||||
puts "Running with classpath:\n" + cp
|
puts "Running with classpath:\n" + cp
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
# and the pattern to %c instead of %l. (%l is slower.)
|
# and the pattern to %c instead of %l. (%l is slower.)
|
||||||
|
|
||||||
# output messages into a rolling log file as well as stdout
|
# output messages into a rolling log file as well as stdout
|
||||||
log4j.rootLogger=DEBUG,stdout,R
|
log4j.rootLogger=ERROR,stdout,R
|
||||||
|
|
||||||
# stdout
|
# stdout
|
||||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||||
|
|
|
||||||
|
|
@ -19,22 +19,22 @@
|
||||||
<ThriftPort>9160</ThriftPort>
|
<ThriftPort>9160</ThriftPort>
|
||||||
<ColumnIndexSizeInKB>256</ColumnIndexSizeInKB>
|
<ColumnIndexSizeInKB>256</ColumnIndexSizeInKB>
|
||||||
<HttpPort>7002</HttpPort>
|
<HttpPort>7002</HttpPort>
|
||||||
<MetadataDirectory>./storage/system</MetadataDirectory>
|
<MetadataDirectory>/Users/jboner/src/scala/akka/storage/system</MetadataDirectory>
|
||||||
<CommitLogDirectory>./storage/commitlog</CommitLogDirectory>
|
<CommitLogDirectory>/Users/jboner/src/scala/akka/storage/commitlog</CommitLogDirectory>
|
||||||
<CommitLogRotationThresholdInMB>128</CommitLogRotationThresholdInMB>
|
<CommitLogRotationThresholdInMB>128</CommitLogRotationThresholdInMB>
|
||||||
<GangliaServers>
|
<GangliaServers>
|
||||||
<GangliaServer>127.0.0.1:12000</GangliaServer>
|
<GangliaServer>127.0.0.1:12000</GangliaServer>
|
||||||
</GangliaServers>
|
</GangliaServers>
|
||||||
<DataFileDirectories>
|
<DataFileDirectories>
|
||||||
<DataFileDirectory>./storage/data</DataFileDirectory>
|
<DataFileDirectory>/Users/jboner/src/scala/akka/storage/data</DataFileDirectory>
|
||||||
</DataFileDirectories>
|
</DataFileDirectories>
|
||||||
<CalloutLocation>./storage/callouts</CalloutLocation>
|
<CalloutLocation>/Users/jboner/src/scala/akka/storage/callouts</CalloutLocation>
|
||||||
<BootstrapFileDirectory>./storage/bootstrap</BootstrapFileDirectory>
|
<BootstrapFileDirectory>/Users/jboner/src/scala/akka/storage/bootstrap</BootstrapFileDirectory>
|
||||||
<StagingFileDirectory>./storage/staging</StagingFileDirectory>
|
<StagingFileDirectory>/Users/jboner/src/scala/akka/storage/staging</StagingFileDirectory>
|
||||||
<CommitLogFastSync>false</CommitLogFastSync>
|
<CommitLogFastSync>false</CommitLogFastSync>
|
||||||
<Tables>
|
<Tables>
|
||||||
<Table Name = "akka">
|
<Table Name = "akka">
|
||||||
<ColumnFamily ColumnSort="Name" Name="hash"/>
|
<ColumnFamily ColumnSort="Name" Name="hashtrie"/>
|
||||||
<!--ColumnFamily ColumnType="Super" ColumnSort="Name" Name="Super2"/-->
|
<!--ColumnFamily ColumnType="Super" ColumnSort="Name" Name="Super2"/-->
|
||||||
</Table>
|
</Table>
|
||||||
</Tables>
|
</Tables>
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,6 @@
|
||||||
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/voldemort-contrib-0.4a.jar"/>
|
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/voldemort-contrib-0.4a.jar"/>
|
||||||
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/xerces.jar"/>
|
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/xerces.jar"/>
|
||||||
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/zookeeper-3.1.0.jar"/>
|
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/zookeeper-3.1.0.jar"/>
|
||||||
<classpathentry kind="var" path="JRE_LIB"/>
|
|
||||||
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/config"/>
|
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/config"/>
|
||||||
<classpathentry kind="output" path="build"/>
|
<classpathentry kind="output" path="build"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/scala" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src/main/scala" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/test/scala" isTestSource="true" />
|
<sourceFolder url="file://$MODULE_DIR$/src/test/scala" isTestSource="true" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="library" name="scala-2.7.3.final" level="application" />
|
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="module" module-name="util-java" />
|
<orderEntry type="module" module-name="util-java" />
|
||||||
|
|
@ -33,15 +32,6 @@
|
||||||
<SOURCES />
|
<SOURCES />
|
||||||
</library>
|
</library>
|
||||||
</orderEntry>
|
</orderEntry>
|
||||||
<orderEntry type="module-library">
|
|
||||||
<library>
|
|
||||||
<CLASSES>
|
|
||||||
<root url="jar://$MODULE_DIR$/../lib/scala-library-2.7.3.jar!/" />
|
|
||||||
</CLASSES>
|
|
||||||
<JAVADOC />
|
|
||||||
<SOURCES />
|
|
||||||
</library>
|
|
||||||
</orderEntry>
|
|
||||||
<orderEntry type="module-library">
|
<orderEntry type="module-library">
|
||||||
<library>
|
<library>
|
||||||
<CLASSES>
|
<CLASSES>
|
||||||
|
|
@ -60,15 +50,6 @@
|
||||||
<SOURCES />
|
<SOURCES />
|
||||||
</library>
|
</library>
|
||||||
</orderEntry>
|
</orderEntry>
|
||||||
<orderEntry type="module-library">
|
|
||||||
<library>
|
|
||||||
<CLASSES>
|
|
||||||
<root url="jar://$MODULE_DIR$/../lib/libthrift-20080411p1.jar!/" />
|
|
||||||
</CLASSES>
|
|
||||||
<JAVADOC />
|
|
||||||
<SOURCES />
|
|
||||||
</library>
|
|
||||||
</orderEntry>
|
|
||||||
<orderEntry type="module-library">
|
<orderEntry type="module-library">
|
||||||
<library>
|
<library>
|
||||||
<CLASSES>
|
<CLASSES>
|
||||||
|
|
@ -672,6 +653,15 @@
|
||||||
<SOURCES />
|
<SOURCES />
|
||||||
</library>
|
</library>
|
||||||
</orderEntry>
|
</orderEntry>
|
||||||
|
<orderEntry type="module-library">
|
||||||
|
<library>
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$MODULE_DIR$/../../../../bin/scala-2.7.4.RC1/lib/scala-compiler.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES />
|
||||||
|
</library>
|
||||||
|
</orderEntry>
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -389,7 +389,9 @@ Scala installation directory.
|
||||||
COMPILATION SECTION
|
COMPILATION SECTION
|
||||||
===================
|
===================
|
||||||
-->
|
-->
|
||||||
<target depends="init" name="deps-jar" unless="no.deps"/>
|
<target depends="init" name="deps-jar" unless="no.deps">
|
||||||
|
<ant antfile="${project.akka-util-java}/build.xml" inheritall="false" target="jar"/>
|
||||||
|
</target>
|
||||||
<target depends="init,deps-jar" name="-pre-pre-compile">
|
<target depends="init,deps-jar" name="-pre-pre-compile">
|
||||||
<mkdir dir="${build.classes.dir}"/>
|
<mkdir dir="${build.classes.dir}"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
@ -696,7 +698,9 @@ Scala installation directory.
|
||||||
CLEANUP SECTION
|
CLEANUP SECTION
|
||||||
===============
|
===============
|
||||||
-->
|
-->
|
||||||
<target depends="init" name="deps-clean" unless="no.deps"/>
|
<target depends="init" name="deps-clean" unless="no.deps">
|
||||||
|
<ant antfile="${project.akka-util-java}/build.xml" inheritall="false" target="clean"/>
|
||||||
|
</target>
|
||||||
<target depends="init" name="-do-clean">
|
<target depends="init" name="-do-clean">
|
||||||
<delete dir="${build.dir}"/>
|
<delete dir="${build.dir}"/>
|
||||||
<delete dir="${dist.dir}"/>
|
<delete dir="${dist.dir}"/>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,6 @@ build.xml.script.CRC32=c2aecc70
|
||||||
build.xml.stylesheet.CRC32=ca9d572e
|
build.xml.stylesheet.CRC32=ca9d572e
|
||||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||||
nbproject/build-impl.xml.data.CRC32=4c75645b
|
nbproject/build-impl.xml.data.CRC32=e25238a8
|
||||||
nbproject/build-impl.xml.script.CRC32=a2fb0c36
|
nbproject/build-impl.xml.script.CRC32=749b9ab1
|
||||||
nbproject/build-impl.xml.stylesheet.CRC32=371897b9
|
nbproject/build-impl.xml.stylesheet.CRC32=371897b9@1.3.0
|
||||||
|
|
|
||||||
|
|
@ -2,5 +2,4 @@ do.depend=false
|
||||||
do.jar=false
|
do.jar=false
|
||||||
javac.debug=true
|
javac.debug=true
|
||||||
javadoc.preview=true
|
javadoc.preview=true
|
||||||
jaxws.endorsed.dir=C:\\Program Files\\NetBeans 6.5.1\\java2\\modules\\ext\\jaxws21\\api
|
user.properties.file=/Users/jboner/.netbeans/dev/build.properties
|
||||||
user.properties.file=C:\\Documents and Settings\\jboner\\.netbeans\\6.5\\build.properties
|
|
||||||
|
|
|
||||||
|
|
@ -18,87 +18,91 @@ dist.dir=dist
|
||||||
dist.jar=${dist.dir}/akka-kernel.jar
|
dist.jar=${dist.dir}/akka-kernel.jar
|
||||||
dist.javadoc.dir=${dist.dir}/javadoc
|
dist.javadoc.dir=${dist.dir}/javadoc
|
||||||
excludes=
|
excludes=
|
||||||
file.reference.activation-1.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\activation-1.1.jar
|
file.reference.activation-1.1.jar=/Users/jboner/src/scala/akka/lib/activation-1.1.jar
|
||||||
file.reference.akka-util-java.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\akka-util-java.jar
|
file.reference.akka-util-java.jar=/Users/jboner/src/scala/akka/lib/akka-util-java.jar
|
||||||
file.reference.antlr-3.1.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\antlr-3.1.3.jar
|
file.reference.antlr-3.1.3.jar=/Users/jboner/src/scala/akka/lib/antlr-3.1.3.jar
|
||||||
file.reference.aopalliance-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\aopalliance-1.0.jar
|
file.reference.aopalliance-1.0.jar=/Users/jboner/src/scala/akka/lib/aopalliance-1.0.jar
|
||||||
file.reference.asm-3.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\asm-3.1.jar
|
file.reference.asm-3.1.jar=/Users/jboner/src/scala/akka/lib/asm-3.1.jar
|
||||||
file.reference.asm-all-2.2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\asm-all-2.2.1.jar
|
file.reference.asm-all-2.2.1.jar=/Users/jboner/src/scala/akka/lib/asm-all-2.2.1.jar
|
||||||
file.reference.cassandra.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\cassandra.jar
|
file.reference.cassandra.jar=/Users/jboner/src/scala/akka/lib/cassandra.jar
|
||||||
file.reference.catalina-ant.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\catalina-ant.jar
|
file.reference.catalina-ant.jar=/Users/jboner/src/scala/akka/lib/catalina-ant.jar
|
||||||
file.reference.cglib-2.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\cglib-2.2.jar
|
file.reference.cglib-2.2.jar=/Users/jboner/src/scala/akka/lib/cglib-2.2.jar
|
||||||
file.reference.colt-1.2.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\colt-1.2.0.jar
|
file.reference.colt-1.2.0.jar=/Users/jboner/src/scala/akka/lib/colt-1.2.0.jar
|
||||||
file.reference.commons-cli-1.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-cli-1.1.jar
|
file.reference.commons-cli-1.1.jar=/Users/jboner/src/scala/akka/lib/commons-cli-1.1.jar
|
||||||
file.reference.commons-codec-1.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-codec-1.3.jar
|
file.reference.commons-codec-1.3.jar=/Users/jboner/src/scala/akka/lib/commons-codec-1.3.jar
|
||||||
file.reference.commons-collections-3.2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-collections-3.2.1.jar
|
file.reference.commons-collections-3.2.1.jar=/Users/jboner/src/scala/akka/lib/commons-collections-3.2.1.jar
|
||||||
file.reference.commons-dbcp-1.2.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-dbcp-1.2.2.jar
|
file.reference.commons-dbcp-1.2.2.jar=/Users/jboner/src/scala/akka/lib/commons-dbcp-1.2.2.jar
|
||||||
file.reference.commons-httpclient-3.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-httpclient-3.1.jar
|
file.reference.commons-httpclient-3.1.jar=/Users/jboner/src/scala/akka/lib/commons-httpclient-3.1.jar
|
||||||
file.reference.commons-io-1.3.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-io-1.3.2.jar
|
file.reference.commons-io-1.3.2.jar=/Users/jboner/src/scala/akka/lib/commons-io-1.3.2.jar
|
||||||
file.reference.commons-javaflow-1.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-javaflow-1.0-SNAPSHOT.jar
|
file.reference.commons-javaflow-1.0-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/commons-javaflow-1.0-SNAPSHOT.jar
|
||||||
file.reference.commons-lang-2.4.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-lang-2.4.jar
|
file.reference.commons-lang-2.4.jar=/Users/jboner/src/scala/akka/lib/commons-lang-2.4.jar
|
||||||
file.reference.commons-logging-1.0.4.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-logging-1.0.4.jar
|
file.reference.commons-logging-1.0.4.jar=/Users/jboner/src/scala/akka/lib/commons-logging-1.0.4.jar
|
||||||
file.reference.commons-math-1.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-math-1.1.jar
|
file.reference.commons-math-1.1.jar=/Users/jboner/src/scala/akka/lib/commons-math-1.1.jar
|
||||||
file.reference.commons-pool-1.4.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-pool-1.4.jar
|
file.reference.commons-pool-1.4.jar=/Users/jboner/src/scala/akka/lib/commons-pool-1.4.jar
|
||||||
file.reference.configgy-1.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\configgy-1.2.jar
|
file.reference.configgy-1.2.jar=/Users/jboner/src/scala/akka/lib/configgy-1.2.jar
|
||||||
file.reference.google-collect-snapshot-20090211.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\google-collect-snapshot-20090211.jar
|
file.reference.google-collect-snapshot-20090211.jar=/Users/jboner/src/scala/akka/lib/google-collect-snapshot-20090211.jar
|
||||||
file.reference.grizzly-framework-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-framework-1.8.6.3.jar
|
file.reference.grizzly-framework-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-framework-1.8.6.3.jar
|
||||||
file.reference.grizzly-http-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-http-1.8.6.3.jar
|
file.reference.grizzly-http-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-http-1.8.6.3.jar
|
||||||
file.reference.grizzly-http-servlet-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-http-servlet-1.8.6.3.jar
|
file.reference.grizzly-http-servlet-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-http-servlet-1.8.6.3.jar
|
||||||
file.reference.grizzly-http-utils-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-http-utils-1.8.6.3.jar
|
file.reference.grizzly-http-utils-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-http-utils-1.8.6.3.jar
|
||||||
file.reference.grizzly-portunif-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-portunif-1.8.6.3.jar
|
file.reference.grizzly-portunif-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-portunif-1.8.6.3.jar
|
||||||
file.reference.grizzly-rcm-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-rcm-1.8.6.3.jar
|
file.reference.grizzly-rcm-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-rcm-1.8.6.3.jar
|
||||||
file.reference.grizzly-servlet-webserver-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-servlet-webserver-1.8.6.3.jar
|
file.reference.grizzly-servlet-webserver-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-servlet-webserver-1.8.6.3.jar
|
||||||
file.reference.guice-core-2.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\guice-core-2.0-SNAPSHOT.jar
|
file.reference.guice-core-2.0-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/guice-core-2.0-SNAPSHOT.jar
|
||||||
file.reference.guice-jsr250-2.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\guice-jsr250-2.0-SNAPSHOT.jar
|
file.reference.guice-jsr250-2.0-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/guice-jsr250-2.0-SNAPSHOT.jar
|
||||||
file.reference.high-scale-lib.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\high-scale-lib.jar
|
file.reference.high-scale-lib.jar=/Users/jboner/src/scala/akka/lib/high-scale-lib.jar
|
||||||
file.reference.jaxb-api-2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jaxb-api-2.1.jar
|
file.reference.jaxb-api-2.1.jar=/Users/jboner/src/scala/akka/lib/jaxb-api-2.1.jar
|
||||||
file.reference.jaxb-impl-2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jaxb-impl-2.1.jar
|
file.reference.jaxb-impl-2.1.jar=/Users/jboner/src/scala/akka/lib/jaxb-impl-2.1.jar
|
||||||
file.reference.jdom-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jdom-1.0.jar
|
file.reference.jdom-1.0.jar=/Users/jboner/src/scala/akka/lib/jdom-1.0.jar
|
||||||
file.reference.je-3.3.62.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\je-3.3.62.jar
|
file.reference.je-3.3.62.jar=/Users/jboner/src/scala/akka/lib/je-3.3.62.jar
|
||||||
file.reference.jersey-atom-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-atom-1.0.1.jar
|
file.reference.jersey-atom-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-atom-1.0.1.jar
|
||||||
file.reference.jersey-core-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-core-1.0.1.jar
|
file.reference.jersey-core-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-core-1.0.1.jar
|
||||||
file.reference.jersey-json-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-json-1.0.1.jar
|
file.reference.jersey-json-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-json-1.0.1.jar
|
||||||
file.reference.jersey-server-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-server-1.0.1.jar
|
file.reference.jersey-server-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-server-1.0.1.jar
|
||||||
file.reference.jettison-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jettison-1.0.1.jar
|
file.reference.jettison-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jettison-1.0.1.jar
|
||||||
file.reference.jetty-6.1.6rc0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jetty-6.1.6rc0.jar
|
file.reference.jetty-6.1.6rc0.jar=/Users/jboner/src/scala/akka/lib/jetty-6.1.6rc0.jar
|
||||||
file.reference.jetty-util-6.1.6rc0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jetty-util-6.1.6rc0.jar
|
file.reference.jetty-util-6.1.6rc0.jar=/Users/jboner/src/scala/akka/lib/jetty-util-6.1.6rc0.jar
|
||||||
file.reference.JSAP-2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\JSAP-2.1.jar
|
file.reference.JSAP-2.1.jar=/Users/jboner/src/scala/akka/lib/JSAP-2.1.jar
|
||||||
file.reference.jsr250-api-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jsr250-api-1.0.jar
|
file.reference.jsr250-api-1.0.jar=/Users/jboner/src/scala/akka/lib/jsr250-api-1.0.jar
|
||||||
file.reference.jsr311-api-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jsr311-api-1.0.jar
|
file.reference.jsr311-api-1.0.jar=/Users/jboner/src/scala/akka/lib/jsr311-api-1.0.jar
|
||||||
file.reference.junit-3.8.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit-3.8.2.jar
|
file.reference.junit-3.8.2.jar=/Users/jboner/src/scala/akka/lib/junit-3.8.2.jar
|
||||||
file.reference.junit-4.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit-4.5.jar
|
file.reference.junit-4.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit-4.5.jar
|
||||||
|
file.reference.junit-4.5.jar-1=/Users/jboner/src/scala/akka/lib/junit-4.5.jar
|
||||||
file.reference.junit4runner-1.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit4runner-1.0-SNAPSHOT.jar
|
file.reference.junit4runner-1.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit4runner-1.0-SNAPSHOT.jar
|
||||||
file.reference.libfb303.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\libfb303.jar
|
file.reference.junit4runner-1.0-SNAPSHOT.jar-1=/Users/jboner/src/scala/akka/lib/junit4runner-1.0-SNAPSHOT.jar
|
||||||
file.reference.libthrift-20080411p1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\libthrift-20080411p1.jar
|
file.reference.libfb303.jar=/Users/jboner/src/scala/akka/lib/libfb303.jar
|
||||||
file.reference.libthrift.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\libthrift.jar
|
file.reference.libthrift-20080411p1.jar=/Users/jboner/src/scala/akka/lib/libthrift-20080411p1.jar
|
||||||
file.reference.log4j-1.2.15.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\log4j-1.2.15.jar
|
file.reference.libthrift.jar=/Users/jboner/src/scala/akka/lib/libthrift.jar
|
||||||
file.reference.lucene-core-2.2.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\lucene-core-2.2.0.jar
|
file.reference.log4j-1.2.15.jar=/Users/jboner/src/scala/akka/lib/log4j-1.2.15.jar
|
||||||
|
file.reference.lucene-core-2.2.0.jar=/Users/jboner/src/scala/akka/lib/lucene-core-2.2.0.jar
|
||||||
file.reference.main-scala=src/main/scala
|
file.reference.main-scala=src/main/scala
|
||||||
file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\mina-core-2.0.0-M2-SNAPSHOT.jar
|
file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/mina-core-2.0.0-M2-SNAPSHOT.jar
|
||||||
file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\mina-integration-scala-2.0.0-M2-SNAPSHOT.jar
|
file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/mina-integration-scala-2.0.0-M2-SNAPSHOT.jar
|
||||||
file.reference.pcj.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\pcj.jar
|
file.reference.pcj.jar=/Users/jboner/src/scala/akka/lib/pcj.jar
|
||||||
file.reference.protobuf-java-2.0.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\protobuf-java-2.0.3.jar
|
file.reference.protobuf-java-2.0.3.jar=/Users/jboner/src/scala/akka/lib/protobuf-java-2.0.3.jar
|
||||||
file.reference.rome-0.9.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\rome-0.9.jar
|
file.reference.rome-0.9.jar=/Users/jboner/src/scala/akka/lib/rome-0.9.jar
|
||||||
file.reference.scala-library-2.7.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scala-library-2.7.3.jar
|
file.reference.scala-library-2.7.3.jar=/Users/jboner/src/scala/akka/lib/scala-library-2.7.3.jar
|
||||||
file.reference.scala-library-2.7.3.zip=C:\\home\\jboner\\src\\scala\\akka\\lib\\scala-library-2.7.3.zip
|
file.reference.scala-library-2.7.3.zip=/Users/jboner/src/scala/akka/lib/scala-library-2.7.3.zip
|
||||||
file.reference.scalatest-0.9.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.jar
|
file.reference.scalatest-0.9.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.jar
|
||||||
file.reference.scalatest-0.9.5.zip=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.zip
|
file.reference.scalatest-0.9.5.jar-1=/Users/jboner/src/scala/akka/lib/scalatest-0.9.5.jar
|
||||||
file.reference.servlet-api-2.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\servlet-api-2.5.jar
|
file.reference.scalatest-0.9.5.zip=/Users/jboner/src/scala/akka/lib/scalatest-0.9.5.zip
|
||||||
file.reference.slf4j-api-1.4.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\slf4j-api-1.4.3.jar
|
file.reference.servlet-api-2.5.jar=/Users/jboner/src/scala/akka/lib/servlet-api-2.5.jar
|
||||||
file.reference.slf4j-log4j12-1.4.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\slf4j-log4j12-1.4.3.jar
|
file.reference.slf4j-api-1.4.3.jar=/Users/jboner/src/scala/akka/lib/slf4j-api-1.4.3.jar
|
||||||
file.reference.stax-api-1.0-2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\stax-api-1.0-2.jar
|
file.reference.slf4j-log4j12-1.4.3.jar=/Users/jboner/src/scala/akka/lib/slf4j-log4j12-1.4.3.jar
|
||||||
file.reference.stringtemplate-3.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\stringtemplate-3.0.jar
|
file.reference.stax-api-1.0-2.jar=/Users/jboner/src/scala/akka/lib/stax-api-1.0-2.jar
|
||||||
|
file.reference.stringtemplate-3.0.jar=/Users/jboner/src/scala/akka/lib/stringtemplate-3.0.jar
|
||||||
file.reference.test-scala=src/test/scala
|
file.reference.test-scala=src/test/scala
|
||||||
file.reference.velocity-1.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\velocity-1.5.jar
|
file.reference.velocity-1.5.jar=/Users/jboner/src/scala/akka/lib/velocity-1.5.jar
|
||||||
file.reference.voldemort-0.4a.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\voldemort-0.4a.jar
|
file.reference.voldemort-0.4a.jar=/Users/jboner/src/scala/akka/lib/voldemort-0.4a.jar
|
||||||
file.reference.voldemort-contrib-0.4a.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\voldemort-contrib-0.4a.jar
|
file.reference.voldemort-contrib-0.4a.jar=/Users/jboner/src/scala/akka/lib/voldemort-contrib-0.4a.jar
|
||||||
file.reference.xerces.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\xerces.jar
|
file.reference.xerces.jar=/Users/jboner/src/scala/akka/lib/xerces.jar
|
||||||
file.reference.zookeeper-3.1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\zookeeper-3.1.0.jar
|
file.reference.zookeeper-3.1.0.jar=/Users/jboner/src/scala/akka/lib/zookeeper-3.1.0.jar
|
||||||
includes=**
|
includes=**
|
||||||
jar.compress=false
|
jar.compress=false
|
||||||
java.platform.active=java_default_platform
|
java.platform.active=java_default_platform
|
||||||
javac.classpath=\
|
javac.classpath=\
|
||||||
${file.reference.activation-1.1.jar}:\
|
${file.reference.activation-1.1.jar}:\
|
||||||
|
${reference.akka-util-java.jar}:\
|
||||||
${file.reference.akka-util-java.jar}:\
|
${file.reference.akka-util-java.jar}:\
|
||||||
${file.reference.antlr-3.1.3.jar}:\
|
${file.reference.antlr-3.1.3.jar}:\
|
||||||
${file.reference.aopalliance-1.0.jar}:\
|
${file.reference.aopalliance-1.0.jar}:\
|
||||||
|
|
@ -146,8 +150,8 @@ javac.classpath=\
|
||||||
${file.reference.jsr250-api-1.0.jar}:\
|
${file.reference.jsr250-api-1.0.jar}:\
|
||||||
${file.reference.jsr311-api-1.0.jar}:\
|
${file.reference.jsr311-api-1.0.jar}:\
|
||||||
${file.reference.junit-3.8.2.jar}:\
|
${file.reference.junit-3.8.2.jar}:\
|
||||||
${file.reference.junit-4.5.jar}:\
|
${file.reference.junit-4.5.jar-1}:\
|
||||||
${file.reference.junit4runner-1.0-SNAPSHOT.jar}:\
|
${file.reference.junit4runner-1.0-SNAPSHOT.jar-1}:\
|
||||||
${file.reference.libfb303.jar}:\
|
${file.reference.libfb303.jar}:\
|
||||||
${file.reference.libthrift-20080411p1.jar}:\
|
${file.reference.libthrift-20080411p1.jar}:\
|
||||||
${file.reference.libthrift.jar}:\
|
${file.reference.libthrift.jar}:\
|
||||||
|
|
@ -160,7 +164,7 @@ javac.classpath=\
|
||||||
${file.reference.rome-0.9.jar}:\
|
${file.reference.rome-0.9.jar}:\
|
||||||
${file.reference.scala-library-2.7.3.jar}:\
|
${file.reference.scala-library-2.7.3.jar}:\
|
||||||
${file.reference.scala-library-2.7.3.zip}:\
|
${file.reference.scala-library-2.7.3.zip}:\
|
||||||
${file.reference.scalatest-0.9.5.jar}:\
|
${file.reference.scalatest-0.9.5.jar-1}:\
|
||||||
${file.reference.scalatest-0.9.5.zip}:\
|
${file.reference.scalatest-0.9.5.zip}:\
|
||||||
${file.reference.servlet-api-2.5.jar}:\
|
${file.reference.servlet-api-2.5.jar}:\
|
||||||
${file.reference.slf4j-api-1.4.3.jar}:\
|
${file.reference.slf4j-api-1.4.3.jar}:\
|
||||||
|
|
@ -198,6 +202,8 @@ main.class=
|
||||||
manifest.file=manifest.mf
|
manifest.file=manifest.mf
|
||||||
meta.inf.dir=${src.dir}/META-INF
|
meta.inf.dir=${src.dir}/META-INF
|
||||||
platform.active=default_platform
|
platform.active=default_platform
|
||||||
|
project.akka-util-java=../util-java
|
||||||
|
reference.akka-util-java.jar=${project.akka-util-java}/dist/akka-util-java.jar
|
||||||
run.classpath=\
|
run.classpath=\
|
||||||
${javac.classpath}:\
|
${javac.classpath}:\
|
||||||
${build.classes.dir}
|
${build.classes.dir}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,15 @@
|
||||||
<root id="test.src.dir"/>
|
<root id="test.src.dir"/>
|
||||||
</test-roots>
|
</test-roots>
|
||||||
</data>
|
</data>
|
||||||
<references xmlns="http://www.netbeans.org/ns/ant-project-references/1"/>
|
<references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
|
||||||
|
<reference>
|
||||||
|
<foreign-project>akka-util-java</foreign-project>
|
||||||
|
<artifact-type>jar</artifact-type>
|
||||||
|
<script>build.xml</script>
|
||||||
|
<target>jar</target>
|
||||||
|
<clean-target>clean</clean-target>
|
||||||
|
<id>jar</id>
|
||||||
|
</reference>
|
||||||
|
</references>
|
||||||
</configuration>
|
</configuration>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,27 @@
|
||||||
<artifactId>jersey-atom</artifactId>
|
<artifactId>jersey-atom</artifactId>
|
||||||
<version>1.0.1</version>
|
<version>1.0.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
<groupId>org.jboss.netty</groupId>
|
||||||
|
<artifactId>netty</artifactId>
|
||||||
|
<version>3.1.0.BETA2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cassandra</groupId>
|
||||||
|
<artifactId>cassandra</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.facebook</groupId>
|
||||||
|
<artifactId>thrift</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.facebook</groupId>
|
||||||
|
<artifactId>fb303</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
|
<!--dependency>
|
||||||
<groupId>voldemort</groupId>
|
<groupId>voldemort</groupId>
|
||||||
<artifactId>voldemort</artifactId>
|
<artifactId>voldemort</artifactId>
|
||||||
<version>0.4a</version>
|
<version>0.4a</version>
|
||||||
|
|
@ -69,14 +89,12 @@
|
||||||
<groupId>voldemort</groupId>
|
<groupId>voldemort</groupId>
|
||||||
<artifactId>voldemort-contrib</artifactId>
|
<artifactId>voldemort-contrib</artifactId>
|
||||||
<version>0.4a</version>
|
<version>0.4a</version>
|
||||||
</dependency>
|
</dependency-->
|
||||||
<!--
|
<!--dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache</groupId>
|
<groupId>org.apache</groupId>
|
||||||
<artifactId>zookeeper</artifactId>
|
<artifactId>zookeeper</artifactId>
|
||||||
<version>3.1.0</version>
|
<version>3.1.0</version>
|
||||||
</dependency>
|
</dependency-->
|
||||||
-->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.assembla.scala.mina</groupId>
|
<groupId>com.assembla.scala.mina</groupId>
|
||||||
<artifactId>mina-core</artifactId>
|
<artifactId>mina-core</artifactId>
|
||||||
|
|
@ -108,16 +126,10 @@
|
||||||
<version>0.9.5</version>
|
<version>0.9.5</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<!--dependency>
|
||||||
<groupId>com.jteigen.scalatest</groupId>
|
<groupId>com.jteigen.scalatest</groupId>
|
||||||
<artifactId>junit4runner</artifactId>
|
<artifactId>junit4runner</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0</version>
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.scalacheck</groupId>
|
|
||||||
<artifactId>scalacheck</artifactId>
|
|
||||||
<version>1.5</version>
|
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
@ -125,7 +137,7 @@
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<version>4.5</version>
|
<version>4.5</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency-->
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
@ -177,7 +189,7 @@
|
||||||
</classpathContainers>
|
</classpathContainers>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<!--plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
|
|
@ -186,7 +198,7 @@
|
||||||
</includes>
|
</includes>
|
||||||
<junitArtifactName>junit:junit</junitArtifactName>
|
<junitArtifactName>junit:junit</junitArtifactName>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin-->
|
||||||
</plugins>
|
</plugins>
|
||||||
<resources>
|
<resources>
|
||||||
<resource>
|
<resource>
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import java.lang.annotation.Annotation
|
||||||
sealed class ActiveObjectException(msg: String) extends RuntimeException(msg)
|
sealed class ActiveObjectException(msg: String) extends RuntimeException(msg)
|
||||||
class ActiveObjectInvocationTimeoutException(msg: String) extends ActiveObjectException(msg)
|
class ActiveObjectInvocationTimeoutException(msg: String) extends ActiveObjectException(msg)
|
||||||
|
|
||||||
object Annotation {
|
object Annotations {
|
||||||
import se.scalablesolutions.akka.annotation._
|
import se.scalablesolutions.akka.annotation._
|
||||||
val transactional = classOf[transactional]
|
val transactional = classOf[transactional]
|
||||||
val oneway = classOf[oneway]
|
val oneway = classOf[oneway]
|
||||||
|
|
@ -84,17 +84,17 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I
|
||||||
private var targetInstance: AnyRef = _
|
private var targetInstance: AnyRef = _
|
||||||
private[kernel] def setTargetInstance(instance: AnyRef) = {
|
private[kernel] def setTargetInstance(instance: AnyRef) = {
|
||||||
targetInstance = instance
|
targetInstance = instance
|
||||||
getStateList(targetInstance) match {
|
val (maps, vectors, refs) = getTransactionalItemsFor(targetInstance)
|
||||||
case Nil => {}
|
server.transactionalMaps = maps
|
||||||
case states => server.states = states
|
server.transactionalVectors = vectors
|
||||||
}
|
server.transactionalRefs = refs
|
||||||
}
|
}
|
||||||
|
|
||||||
private[kernel] val server = new GenericServerContainer(target.getName, () => new Dispatcher(target.getName))
|
private[kernel] val server = new GenericServerContainer(target.getName, () => new Dispatcher(target.getName))
|
||||||
server.setTimeout(timeout)
|
server.setTimeout(timeout)
|
||||||
|
|
||||||
def invoke(proxy: AnyRef, m: Method, args: Array[AnyRef]): AnyRef = {
|
def invoke(proxy: AnyRef, m: Method, args: Array[AnyRef]): AnyRef = {
|
||||||
if (m.isAnnotationPresent(Annotation.transactional)) {
|
if (m.isAnnotationPresent(Annotations.transactional)) {
|
||||||
// FIXME: check if we are already in a transaction if so NEST (set parent)
|
// FIXME: check if we are already in a transaction if so NEST (set parent)
|
||||||
val newTx = new Transaction
|
val newTx = new Transaction
|
||||||
newTx.begin(server)
|
newTx.begin(server)
|
||||||
|
|
@ -122,7 +122,7 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I
|
||||||
|
|
||||||
private def invoke(invocation: Invocation): AnyRef = {
|
private def invoke(invocation: Invocation): AnyRef = {
|
||||||
val result: AnyRef =
|
val result: AnyRef =
|
||||||
if (invocation.method.isAnnotationPresent(Annotation.oneway)) server ! invocation
|
if (invocation.method.isAnnotationPresent(Annotations.oneway)) server ! invocation
|
||||||
else {
|
else {
|
||||||
val result: ErrRef[AnyRef] =
|
val result: ErrRef[AnyRef] =
|
||||||
server !!! (invocation, {
|
server !!! (invocation, {
|
||||||
|
|
@ -150,22 +150,29 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I
|
||||||
threadBoundTx.set(Some(tx))
|
threadBoundTx.set(Some(tx))
|
||||||
}
|
}
|
||||||
|
|
||||||
private def getStateList(targetInstance: AnyRef): List[State[_,_]] = {
|
private def getTransactionalItemsFor(targetInstance: AnyRef):
|
||||||
|
Tuple3[List[TransactionalMap[_, _]], List[TransactionalVector[_]], List[TransactionalRef[_]]] = {
|
||||||
require(targetInstance != null)
|
require(targetInstance != null)
|
||||||
import se.scalablesolutions.akka.kernel.configuration.ConfigurationException
|
var maps: List[TransactionalMap[_, _]] = Nil
|
||||||
val states: List[State[_,_]] = for {
|
var vectors: List[TransactionalVector[_]] = Nil
|
||||||
field <- target.getDeclaredFields.toArray.toList
|
var refs: List[TransactionalRef[_]] = Nil
|
||||||
if field.isAnnotationPresent(Annotation.state)
|
for {
|
||||||
state = {
|
field <- target.getDeclaredFields.toArray.toList.asInstanceOf[List[Field]]
|
||||||
|
fieldType = field.getType
|
||||||
|
if fieldType == classOf[TransactionalMap[_, _]] ||
|
||||||
|
fieldType == classOf[TransactionalVector[_]] ||
|
||||||
|
fieldType == classOf[TransactionalRef[_]]
|
||||||
|
txItem = {
|
||||||
field.setAccessible(true)
|
field.setAccessible(true)
|
||||||
field.get(targetInstance)
|
field.get(targetInstance)
|
||||||
}
|
}
|
||||||
if state != null
|
if txItem != null
|
||||||
} yield {
|
} {
|
||||||
if (!state.isInstanceOf[State[_, _]]) throw new ConfigurationException("Fields annotated with [@state] needs to to be a subtype of [se.scalablesolutions.akka.kernel.State[K, V]]")
|
if (txItem.isInstanceOf[TransactionalMap[_, _]]) maps ::= txItem.asInstanceOf[TransactionalMap[_, _]]
|
||||||
state.asInstanceOf[State[_,_]]
|
else if (txItem.isInstanceOf[TransactionalVector[_]]) vectors ::= txItem.asInstanceOf[TransactionalVector[_]]
|
||||||
|
else if (txItem.isInstanceOf[TransactionalRef[_]]) refs ::= txItem.asInstanceOf[TransactionalRef[_]]
|
||||||
}
|
}
|
||||||
states
|
(maps, vectors, refs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,90 @@ package se.scalablesolutions.akka.kernel
|
||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
|
import org.apache.cassandra.config.DatabaseDescriptor
|
||||||
|
import org.apache.cassandra.service._
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
|
*/
|
||||||
|
final object CassandraNode extends Logging {
|
||||||
|
|
||||||
|
val TABLE_NAME = "akka"
|
||||||
|
val ACTOR_KEY_PREFIX = "actor"
|
||||||
|
val ACTOR_MAP_COLUMN_FAMILY = "map"
|
||||||
|
|
||||||
|
// TODO: is this server thread-safe or needed to be wrapped up in an actor?
|
||||||
|
private[this] val server = new CassandraServer
|
||||||
|
|
||||||
|
def start = {
|
||||||
|
try {
|
||||||
|
server.start
|
||||||
|
log.info("Persistent storage has started up successfully");
|
||||||
|
} catch {
|
||||||
|
case e =>
|
||||||
|
log.error("Could not start up persistent storage")
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def stop = server.shutdown
|
||||||
|
|
||||||
|
def insertActorStorageEntry(actorName: String, entry: String, content: String) = {
|
||||||
|
server.insert(
|
||||||
|
TABLE_NAME,
|
||||||
|
ACTOR_KEY_PREFIX + ":" + actorName,
|
||||||
|
ACTOR_MAP_COLUMN_FAMILY + ":" + entry,
|
||||||
|
content,
|
||||||
|
System.currentTimeMillis)
|
||||||
|
}
|
||||||
|
|
||||||
|
def insertActorStorageEntries(actorName: String, entries: List[Tuple2[String, String]]) = {
|
||||||
|
import java.util.{Map, HashMap, List, ArrayList}
|
||||||
|
val columns: Map[String, List[column_t]] = new HashMap
|
||||||
|
for (entry <- entries) {
|
||||||
|
val cls: List[column_t] = new ArrayList
|
||||||
|
cls.add(new column_t(entry._1, entry._2, System.currentTimeMillis))
|
||||||
|
columns.put(ACTOR_MAP_COLUMN_FAMILY, cls)
|
||||||
|
}
|
||||||
|
server.batch_insert_blocking(new batch_mutation_t(
|
||||||
|
TABLE_NAME,
|
||||||
|
ACTOR_KEY_PREFIX + ":" + actorName,
|
||||||
|
columns,
|
||||||
|
new HashMap[String, List[column_t]]))
|
||||||
|
}
|
||||||
|
|
||||||
|
def getActorStorageEntryFor(actorName: String, entry: String): Option[String] = {
|
||||||
|
try {
|
||||||
|
val column = server.get_column(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY + ":" + entry)
|
||||||
|
Some(column.value)
|
||||||
|
} catch { case e => None }
|
||||||
|
}
|
||||||
|
|
||||||
|
def getActorStorageFor(actorName: String): List[Tuple2[String, String]] = {
|
||||||
|
val columns = server.get_columns_since(TABLE_NAME, ACTOR_KEY_PREFIX, ACTOR_MAP_COLUMN_FAMILY, -1)
|
||||||
|
.toArray.toList.asInstanceOf[List[org.apache.cassandra.service.column_t]]
|
||||||
|
for {
|
||||||
|
column <- columns
|
||||||
|
col = (column.columnName, column.value)
|
||||||
|
} yield col
|
||||||
|
}
|
||||||
|
|
||||||
|
def getActorStorageSizeFor(actorName: String): Int =
|
||||||
|
server.get_column_count(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY)
|
||||||
|
|
||||||
|
def removeActorStorageFor(actorName: String) =
|
||||||
|
server.remove(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY)
|
||||||
|
|
||||||
|
def getActorStorageRange(actorName: String, start: Int, count: Int): List[Tuple2[String, String]] =
|
||||||
|
server.get_slice(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY, start, count)
|
||||||
|
.toArray.toList.asInstanceOf[List[Tuple2[String, String]]]
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This code is only for starting up the Cassandra Thrift server, perhaps later
|
||||||
|
|
||||||
|
import scala.actors.Actor._
|
||||||
|
|
||||||
import com.facebook.thrift.protocol.TBinaryProtocol
|
import com.facebook.thrift.protocol.TBinaryProtocol
|
||||||
import com.facebook.thrift.protocol.TProtocolFactory
|
import com.facebook.thrift.protocol.TProtocolFactory
|
||||||
import com.facebook.thrift.server.TThreadPoolServer
|
import com.facebook.thrift.server.TThreadPoolServer
|
||||||
|
|
@ -14,24 +98,7 @@ import com.facebook.thrift.transport.TTransportException
|
||||||
import com.facebook.thrift.transport.TTransportFactory
|
import com.facebook.thrift.transport.TTransportFactory
|
||||||
import com.facebook.thrift.TProcessorFactory
|
import com.facebook.thrift.TProcessorFactory
|
||||||
|
|
||||||
import org.apache.cassandra.config.DatabaseDescriptor
|
private[this] val serverEngine: TThreadPoolServer = try {
|
||||||
import org.apache.cassandra.service._
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
final class CassandraNode extends Logging {
|
|
||||||
val server = try {
|
|
||||||
val cassandra = new CassandraServer
|
|
||||||
cassandra.start
|
|
||||||
cassandra
|
|
||||||
} catch {
|
|
||||||
case e =>
|
|
||||||
log.error("Could not start up persistent storage node")
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
|
|
||||||
private val serverEngine: TThreadPoolServer = try {
|
|
||||||
val pidFile = System.getProperty("pidfile")
|
val pidFile = System.getProperty("pidfile")
|
||||||
if (pidFile != null) new File(pidFile).deleteOnExit();
|
if (pidFile != null) new File(pidFile).deleteOnExit();
|
||||||
val listenPort = DatabaseDescriptor.getThriftPort
|
val listenPort = DatabaseDescriptor.getThriftPort
|
||||||
|
|
@ -54,20 +121,17 @@ final class CassandraNode extends Logging {
|
||||||
log.error("Could not start up persistent storage node.")
|
log.error("Could not start up persistent storage node.")
|
||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
|
private[this] val serverDaemon = actor {
|
||||||
def start = {
|
receive {
|
||||||
scala.actors.Actor.actor {
|
case Start =>
|
||||||
log.info("Persistent storage node starting up...");
|
log.info("Persistent storage node starting up...")
|
||||||
serverEngine.serve
|
serverEngine.serve
|
||||||
|
case Stop =>
|
||||||
|
log.info("Persistent storage node shutting down...")
|
||||||
|
serverEngine.stop
|
||||||
|
//case Insert(..) =>
|
||||||
|
// server.
|
||||||
}
|
}
|
||||||
log.info("Persistent storage node starting up 2222...");
|
}
|
||||||
server.insert("akka", "TestActor", "hash:data", "some data", System.currentTimeMillis)
|
*/
|
||||||
val column = server.get_column("akka", "TestActor", "hash:data")
|
|
||||||
log.info("column: " + column)
|
|
||||||
|
|
||||||
}
|
|
||||||
def stop = {
|
|
||||||
log.info("Persistent storage node shutting down...")
|
|
||||||
serverEngine.stop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -51,8 +51,8 @@ abstract class Server extends Configuration
|
||||||
// def transform = se.scalablesolutions.akka.kernel.kernelConfig(restartStrategy.transform, servers.toArray.toList.asInstanceOf[List[Server]].map(_.transform))
|
// def transform = se.scalablesolutions.akka.kernel.kernelConfig(restartStrategy.transform, servers.toArray.toList.asInstanceOf[List[Server]].map(_.transform))
|
||||||
//}
|
//}
|
||||||
class Component(@BeanProperty val intf: Class[_],
|
class Component(@BeanProperty val intf: Class[_],
|
||||||
@BeanProperty val target: Class[_],
|
@BeanProperty val target: Class[_],
|
||||||
@BeanProperty val lifeCycle: LifeCycle,
|
@BeanProperty val lifeCycle: LifeCycle,
|
||||||
@BeanProperty val timeout: Int) extends Server {
|
@BeanProperty val timeout: Int) extends Server {
|
||||||
def newWorker(proxy: ActiveObjectProxy) = se.scalablesolutions.akka.kernel.Worker(proxy.server, lifeCycle.transform)
|
def newWorker(proxy: ActiveObjectProxy) = se.scalablesolutions.akka.kernel.Worker(proxy.server, lifeCycle.transform)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ import java.util.concurrent.atomic.AtomicReference
|
||||||
import java.util.concurrent.{ConcurrentLinkedQueue, LinkedBlockingQueue}
|
import java.util.concurrent.{ConcurrentLinkedQueue, LinkedBlockingQueue}
|
||||||
|
|
||||||
object DataFlow {
|
object DataFlow {
|
||||||
|
|
||||||
def thread(body: => Unit) = {
|
def thread(body: => Unit) = {
|
||||||
val thread = new IsolatedEventBasedThread(body).start
|
val thread = new IsolatedEventBasedThread(body).start
|
||||||
thread ! 'start
|
thread ! 'start
|
||||||
|
|
|
||||||
|
|
@ -86,18 +86,49 @@ class GenericServerContainer(
|
||||||
private[kernel] var serverFactory: () => GenericServer) extends Logging {
|
private[kernel] var serverFactory: () => GenericServer) extends Logging {
|
||||||
require(id != null && id != "")
|
require(id != null && id != "")
|
||||||
|
|
||||||
// TODO: see if we can parameterize class and add type safe getActor method
|
|
||||||
//class GenericServerContainer[T <: GenericServer](var factory: () => T) {
|
|
||||||
//def getActor: T = server
|
|
||||||
|
|
||||||
private[kernel] var lifeCycle: Option[LifeCycle] = None
|
private[kernel] var lifeCycle: Option[LifeCycle] = None
|
||||||
private[kernel] var states: List[State[_,_]] = Nil
|
|
||||||
private[kernel] val lock = new ReadWriteLock
|
private[kernel] val lock = new ReadWriteLock
|
||||||
|
private[kernel] val txItemsLock = new ReadWriteLock
|
||||||
|
|
||||||
private var server: GenericServer = _
|
private var server: GenericServer = _
|
||||||
private var currentConfig: Option[AnyRef] = None
|
private var currentConfig: Option[AnyRef] = None
|
||||||
private var timeout = 5000
|
private var timeout = 5000
|
||||||
|
|
||||||
|
// TODO: see if we can parameterize class and add type safe getActor method
|
||||||
|
//class GenericServerContainer[T <: GenericServer](var factory: () => T) {
|
||||||
|
//def getActor: T = server
|
||||||
|
|
||||||
|
private[kernel] def transactionalItems: List[Transactional] = txItemsLock.withReadLock {
|
||||||
|
_transactionalMaps ::: _transactionalVectors ::: _transactionalRefs
|
||||||
|
}
|
||||||
|
|
||||||
|
// TX Maps
|
||||||
|
private[this] var _transactionalMaps: List[TransactionalMap[_, _]] = Nil
|
||||||
|
private[kernel] def transactionalMaps_=(maps: List[TransactionalMap[_, _]]) = txItemsLock.withWriteLock {
|
||||||
|
_transactionalMaps = maps
|
||||||
|
}
|
||||||
|
private[kernel] def transactionalMaps: List[TransactionalMap[_, _]] = txItemsLock.withReadLock {
|
||||||
|
_transactionalMaps
|
||||||
|
}
|
||||||
|
|
||||||
|
// TX Vectors
|
||||||
|
private[this] var _transactionalVectors: List[TransactionalVector[_]] = Nil
|
||||||
|
private[kernel] def transactionalVectors_=(vectors: List[TransactionalVector[_]]) = txItemsLock.withWriteLock {
|
||||||
|
_transactionalVectors = vectors
|
||||||
|
}
|
||||||
|
private[kernel] def transactionalVectors: List[TransactionalVector[_]] = txItemsLock.withReadLock {
|
||||||
|
_transactionalVectors
|
||||||
|
}
|
||||||
|
|
||||||
|
// TX Refs
|
||||||
|
private[this] var _transactionalRefs: List[TransactionalRef[_]] = Nil
|
||||||
|
private[kernel] def transactionalRefs_=(refs: List[TransactionalRef[_]]) = txItemsLock.withWriteLock {
|
||||||
|
_transactionalRefs = refs
|
||||||
|
}
|
||||||
|
private[kernel] def transactionalRefs: List[TransactionalRef[_]] = txItemsLock.withReadLock {
|
||||||
|
_transactionalRefs
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a one way message to the server - alias for <code>cast(message)</code>.
|
* Sends a one way message to the server - alias for <code>cast(message)</code>.
|
||||||
* <p>
|
* <p>
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ object Helpers extends Logging {
|
||||||
// implicit conversion between regular actor and actor with a type future
|
// implicit conversion between regular actor and actor with a type future
|
||||||
implicit def actorWithFuture(a: Actor) = new ActorWithTypedFuture(a)
|
implicit def actorWithFuture(a: Actor) = new ActorWithTypedFuture(a)
|
||||||
|
|
||||||
abstract class FutureWithTimeout[T](ch: InputChannel[Any]) extends Future[T](ch) {
|
abstract class FutureWithTimeout[T](ch: InputChannel[T]) extends Future[T](ch) {
|
||||||
def receiveWithin(timeout: Int) : Option[T]
|
def receiveWithin(timeout: Int) : Option[T]
|
||||||
override def respond(f: T => Unit): Unit = throw new UnsupportedOperationException("Does not support the Responder API")
|
override def respond(f: T => Unit): Unit = throw new UnsupportedOperationException("Does not support the Responder API")
|
||||||
}
|
}
|
||||||
|
|
@ -63,8 +63,8 @@ object Helpers extends Logging {
|
||||||
require(a != null)
|
require(a != null)
|
||||||
|
|
||||||
def !!: FutureWithTimeout[A] = {
|
def !!: FutureWithTimeout[A] = {
|
||||||
val ftch = new Channel[Any](Actor.self)
|
val ftch = new Channel[A](Actor.self)
|
||||||
a.send(msg, ftch)
|
a.send(msg, ftch.asInstanceOf[OutputChannel[Any]])
|
||||||
new FutureWithTimeout[A](ftch) {
|
new FutureWithTimeout[A](ftch) {
|
||||||
def apply() =
|
def apply() =
|
||||||
if (isSet) value.get.asInstanceOf[A]
|
if (isSet) value.get.asInstanceOf[A]
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ package se.scalablesolutions.akka.kernel
|
||||||
//import org.apache.zookeeper.server.ServerConfig
|
//import org.apache.zookeeper.server.ServerConfig
|
||||||
//import org.apache.zookeeper.server.NIOServerCnxn
|
//import org.apache.zookeeper.server.NIOServerCnxn
|
||||||
|
|
||||||
import voldemort.client.{SocketStoreClientFactory, StoreClient, StoreClientFactory}
|
//import voldemort.client.{SocketStoreClientFactory, StoreClient, StoreClientFactory}
|
||||||
import voldemort.server.{VoldemortConfig, VoldemortServer}
|
//import voldemort.server.{VoldemortConfig, VoldemortServer}
|
||||||
import voldemort.versioning.Versioned
|
//import voldemort.versioning.Versioned
|
||||||
|
|
||||||
import com.sun.grizzly.http.SelectorThread
|
import com.sun.grizzly.http.SelectorThread
|
||||||
import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory
|
import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory
|
||||||
|
|
@ -36,29 +36,29 @@ object Kernel extends Logging {
|
||||||
val JERSEY_REST_CLASSES_ROOT_PACKAGE = "se.scalablesolutions.akka.kernel"
|
val JERSEY_REST_CLASSES_ROOT_PACKAGE = "se.scalablesolutions.akka.kernel"
|
||||||
val JERSEY_BASE_URI = UriBuilder.fromUri(JERSEY_SERVER_URL).port(getPort(JERSEY_SERVER_PORT)).build()
|
val JERSEY_BASE_URI = UriBuilder.fromUri(JERSEY_SERVER_URL).port(getPort(JERSEY_SERVER_PORT)).build()
|
||||||
|
|
||||||
|
/*
|
||||||
val VOLDEMORT_SERVER_URL = "tcp://" + SERVER_URL
|
val VOLDEMORT_SERVER_URL = "tcp://" + SERVER_URL
|
||||||
val VOLDEMORT_SERVER_PORT = 6666
|
val VOLDEMORT_SERVER_PORT = 6666
|
||||||
val VOLDEMORT_BOOTSTRAP_URL = VOLDEMORT_SERVER_URL + ":" + VOLDEMORT_SERVER_PORT
|
val VOLDEMORT_BOOTSTRAP_URL = VOLDEMORT_SERVER_URL + ":" + VOLDEMORT_SERVER_PORT
|
||||||
|
|
||||||
val ZOO_KEEPER_SERVER_URL = SERVER_URL
|
val ZOO_KEEPER_SERVER_URL = SERVER_URL
|
||||||
val ZOO_KEEPER_SERVER_PORT = 9898
|
val ZOO_KEEPER_SERVER_PORT = 9898
|
||||||
|
private[this] var storageFactory: StoreClientFactory = _
|
||||||
private[this] var cassandraNode: CassandraNode = _
|
private[this] var storageServer: VoldemortServer = _
|
||||||
|
*/
|
||||||
//private[this] var storageFactory: StoreClientFactory = _
|
|
||||||
//private[this] var storageServer: VoldemortServer = _
|
|
||||||
|
|
||||||
def main(args: Array[String]): Unit = {
|
def main(args: Array[String]): Unit = {
|
||||||
log.info("Starting Akka kernel...")
|
log.info("Starting Akka kernel...")
|
||||||
//startZooKeeper
|
|
||||||
//startVoldemort
|
|
||||||
startCassandra
|
startCassandra
|
||||||
//val threadSelector = startJersey
|
cassandraBenchmark
|
||||||
|
|
||||||
|
//val threadSelector = startJersey
|
||||||
// TODO: handle shutdown of Jersey in separate thread
|
// TODO: handle shutdown of Jersey in separate thread
|
||||||
// TODO: spawn main in new thread an communicate using socket
|
// TODO: spawn main in new thread an communicate using socket
|
||||||
//System.in.read
|
//System.in.read
|
||||||
//threadSelector.stopEndpoint
|
//threadSelector.stopEndpoint
|
||||||
|
|
||||||
|
//startZooKeeper
|
||||||
|
//startVoldemort
|
||||||
}
|
}
|
||||||
|
|
||||||
private[akka] def startJersey: SelectorThread = {
|
private[akka] def startJersey: SelectorThread = {
|
||||||
|
|
@ -70,10 +70,51 @@ object Kernel extends Logging {
|
||||||
}
|
}
|
||||||
|
|
||||||
private[akka] def startCassandra = {
|
private[akka] def startCassandra = {
|
||||||
cassandraNode = new CassandraNode
|
CassandraNode.start
|
||||||
cassandraNode.start
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private def cassandraBenchmark = {
|
||||||
|
val NR_ENTRIES = 1000000
|
||||||
|
|
||||||
|
println("=================================================")
|
||||||
|
var start = System.currentTimeMillis
|
||||||
|
for (i <- 1 to NR_ENTRIES) CassandraNode.insertActorStorageEntry("test", i.toString, "data")
|
||||||
|
var end = System.currentTimeMillis
|
||||||
|
println("Writes per second: " + NR_ENTRIES / ((end - start).toDouble / 1000))
|
||||||
|
|
||||||
|
/*
|
||||||
|
FIXME: batch_insert fails with the following exception:
|
||||||
|
|
||||||
|
ERROR - Exception was generated at : 04/27/2009 15:26:35 on thread main
|
||||||
|
[B cannot be cast to org.apache.cassandra.db.WriteResponse
|
||||||
|
java.lang.ClassCastException: [B cannot be cast to org.apache.cassandra.db.WriteResponse
|
||||||
|
at org.apache.cassandra.service.WriteResponseResolver.resolve(WriteResponseResolver.java:50)
|
||||||
|
at org.apache.cassandra.service.WriteResponseResolver.resolve(WriteResponseResolver.java:31)
|
||||||
|
at org.apache.cassandra.service.QuorumResponseHandler.get(QuorumResponseHandler.java:101)
|
||||||
|
at org.apache.cassandra.service.StorageProxy.insertBlocking(StorageProxy.java:135)
|
||||||
|
at org.apache.cassandra.service.CassandraServer.batch_insert_blocking(CassandraServer.java:489)
|
||||||
|
at se.scalablesolutions.akka.kernel.CassandraNode$.insertHashEntries(CassandraNode.scala:59)
|
||||||
|
at se.scalablesolutions.akka.kernel.Kernel$.cassandraBenchmark(Kernel.scala:91)
|
||||||
|
at se.scalablesolutions.akka.kernel.Kernel$.main(Kernel.scala:52)
|
||||||
|
at se.scalablesolutions.akka.kernel.Kernel.main(Kernel.scala)
|
||||||
|
|
||||||
|
println("=================================================")
|
||||||
|
var start = System.currentTimeMillis
|
||||||
|
println(start)
|
||||||
|
val entries = new scala.collection.mutable.ArrayBuffer[Tuple2[String, String]]
|
||||||
|
for (i <- 1 to NR_ENTRIES) entries += (i.toString, "data")
|
||||||
|
CassandraNode.insertHashEntries("test", entries.toList)
|
||||||
|
var end = System.currentTimeMillis
|
||||||
|
println("Writes per second - batch: " + NR_ENTRIES / ((end - start).toDouble / 1000))
|
||||||
|
*/
|
||||||
|
println("=================================================")
|
||||||
|
start = System.currentTimeMillis
|
||||||
|
for (i <- 1 to NR_ENTRIES) CassandraNode.getActorStorageEntryFor("test", i.toString)
|
||||||
|
end = System.currentTimeMillis
|
||||||
|
println("Reads per second: " + NR_ENTRIES / ((end - start).toDouble / 1000))
|
||||||
|
|
||||||
|
System.exit(0)
|
||||||
|
}
|
||||||
// private[akka] def startVoldemort = {
|
// private[akka] def startVoldemort = {
|
||||||
// // Start Voldemort server
|
// // Start Voldemort server
|
||||||
// val config = VoldemortConfig.loadFromVoldemortHome(Boot.HOME)
|
// val config = VoldemortConfig.loadFromVoldemortHome(Boot.HOME)
|
||||||
|
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
package org.apache.mina.example.scala.netcat
|
|
||||||
|
|
||||||
import _root_.scala.actors.Actor
|
|
||||||
import _root_.scala.actors.Actor._
|
|
||||||
import _root_.scala.actors.Exit
|
|
||||||
import _root_.scala.collection.immutable
|
|
||||||
|
|
||||||
import java.net.InetSocketAddress
|
|
||||||
import java.nio.charset.Charset
|
|
||||||
|
|
||||||
import org.apache.mina.common._
|
|
||||||
import org.apache.mina.filter.codec.ProtocolCodecFilter
|
|
||||||
import org.apache.mina.filter.codec.textline.TextLineCodecFactory
|
|
||||||
import org.apache.mina.integration.scala.common._
|
|
||||||
import org.apache.mina.integration.scala.common.IoHandlerEvent._
|
|
||||||
import org.apache.mina.integration.scala.common.IoServiceEvent._
|
|
||||||
import org.apache.mina.integration.scala.common.IoSessionCall._
|
|
||||||
import org.apache.mina.integration.scala.common.IoSessionConfigOption._
|
|
||||||
import org.apache.mina.integration.scala.util._
|
|
||||||
import org.apache.mina.integration.scala.util.CallableActor._
|
|
||||||
import org.apache.mina.transport.socket.nio.NioSocketConnector
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (<b>Entry point</b>) NetCat client. NetCat client connects to the specified
|
|
||||||
* endpoint and prints out received data. NetCat client disconnects
|
|
||||||
* automatically when no data is read for 10 seconds.
|
|
||||||
*
|
|
||||||
* @author The Apache MINA Project (dev@mina.apache.org)
|
|
||||||
* @version $Rev:$
|
|
||||||
*/
|
|
||||||
object NetCat {
|
|
||||||
|
|
||||||
def handleSession(session: Actor) = {
|
|
||||||
loop {
|
|
||||||
react {
|
|
||||||
case Opened => {
|
|
||||||
// Set reader idle time to 10 seconds.
|
|
||||||
// sessionIdle(...) method will be invoked when no data is read
|
|
||||||
// for 10 seconds.
|
|
||||||
val config = immutable.Map.empty[Any, Any] + Tuple2(IdleTime(IdleStatus.READER_IDLE), 10)
|
|
||||||
session.callReact(SetConfig(config)) {
|
|
||||||
case OK(_) => ()
|
|
||||||
case Error(cause) => exit(('setConfigFailed, cause))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case Closed => {
|
|
||||||
// Print out total number of bytes read from the remote peer.
|
|
||||||
session.callReact(GetReadBytes) {
|
|
||||||
case OK(readBytes) => {
|
|
||||||
System.err.println
|
|
||||||
System.err.println("Total " + readBytes + " byte(s)");
|
|
||||||
exit()
|
|
||||||
}
|
|
||||||
case Error(cause) => exit(('getReadBytesFailed, cause))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case Idle(status) => {
|
|
||||||
// Close the connection if reader is idle.
|
|
||||||
if (status == IdleStatus.READER_IDLE) {
|
|
||||||
session.callReact(CloseOnFlush) {
|
|
||||||
case OK(_) => exit()
|
|
||||||
case Error(cause) => exit(('idleCloseFailed, cause))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case MessageReceived(buf: IoBuffer) => {
|
|
||||||
// Print out read buffer content.
|
|
||||||
while (buf.hasRemaining) {
|
|
||||||
System.out.print(buf.get.asInstanceOf[char])
|
|
||||||
}
|
|
||||||
System.out.flush()
|
|
||||||
}
|
|
||||||
// Consume other IoHandlerEvents, or exit if something goes wrong.
|
|
||||||
case ExceptionCaught(cause) => exit(('exceptionCaught, cause))
|
|
||||||
case _: IoHandlerEvent => () // Consume
|
|
||||||
case unexpected => exit(('unexpectedMessage, unexpected))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def main(args: Array[String]) {
|
|
||||||
var host = System.getProperty("netcat.host")
|
|
||||||
var portString = System.getProperty("netcat.port")
|
|
||||||
if ((host eq null) || (portString eq null)) {
|
|
||||||
// Read from command line
|
|
||||||
if (args.length != 2) {
|
|
||||||
System.out.println(this.getClass().getName() + " <hostname> <port>")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
host = args(0)
|
|
||||||
portString = args(1)
|
|
||||||
}
|
|
||||||
val port = Integer.parseInt(portString)
|
|
||||||
|
|
||||||
// Create TCP/IP connector.
|
|
||||||
val connector = new NioSocketConnector()
|
|
||||||
connector.setConnectTimeout(30)
|
|
||||||
|
|
||||||
// Hook up our code, and start service.
|
|
||||||
val handlingReference = IoSessionActor.installHandling(connector, handleSession(_))
|
|
||||||
val cf = connector.connect(new InetSocketAddress(host, port))
|
|
||||||
cf.awaitUninterruptibly()
|
|
||||||
cf.getSession().getCloseFuture().awaitUninterruptibly()
|
|
||||||
handlingReference.removeHandling
|
|
||||||
connector.dispose()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -13,7 +13,12 @@ trait Transactional {
|
||||||
private[kernel] def rollback
|
private[kernel] def rollback
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed trait State[K, V] extends Transactional {
|
/**
|
||||||
|
* Base trait for all state implementations (persistent or in-memory).
|
||||||
|
*
|
||||||
|
* TODO: Make this class inherit scala.collection.mutable.Map and/or java.util.Map
|
||||||
|
*/
|
||||||
|
trait TransactionalMap[K, V] extends Transactional {
|
||||||
def put(key: K, value: V)
|
def put(key: K, value: V)
|
||||||
def remove(key: K)
|
def remove(key: K)
|
||||||
def get(key: K): V
|
def get(key: K): V
|
||||||
|
|
@ -24,87 +29,134 @@ sealed trait State[K, V] extends Transactional {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Base class for all persistent state implementations should extend.
|
||||||
|
* Implements a Unit of Work, records changes into a change set.
|
||||||
|
*
|
||||||
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
|
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
|
||||||
*/
|
*/
|
||||||
sealed class InMemoryState[K, V] extends State[K, V] {
|
abstract class PersistentTransactionalMap[K, V] extends TransactionalMap[K, V] {
|
||||||
private[kernel] var state = new HashTrie[K, V]
|
protected[kernel] val changeSet = new HashMap[K, V]
|
||||||
private[kernel] var snapshot = state
|
|
||||||
|
|
||||||
private[kernel] override def begin = {
|
override def begin = {
|
||||||
snapshot = state
|
|
||||||
}
|
|
||||||
|
|
||||||
private[kernel] override def commit = {
|
|
||||||
snapshot = state
|
|
||||||
}
|
|
||||||
|
|
||||||
private[kernel] override def rollback = {
|
|
||||||
state = snapshot
|
|
||||||
}
|
|
||||||
|
|
||||||
override def put(key: K, value: V) = {
|
|
||||||
state = state.update(key, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
override def remove(key: K) = {
|
|
||||||
state = state - key
|
|
||||||
}
|
|
||||||
|
|
||||||
def get(key: K): V = state.get(key).getOrElse { throw new NoSuchElementException("No value for key [" + key + "]") }
|
|
||||||
|
|
||||||
def contains(key: K): Boolean = state.contains(key)
|
|
||||||
|
|
||||||
def elements: Iterator[(K, V)] = state.elements
|
|
||||||
|
|
||||||
def size: Int = state.size
|
|
||||||
|
|
||||||
def clear = state = new HashTrie[K, V]
|
|
||||||
}
|
|
||||||
|
|
||||||
//final class InMemoryStringState extends InMemoryState[String, String]
|
|
||||||
//final class InMemoryObjectState extends InMemoryState[String, AnyRef]
|
|
||||||
//
|
|
||||||
/**
|
|
||||||
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
|
|
||||||
*/
|
|
||||||
trait UnitOfWork[K, V] extends State[K, V] with Transactional {
|
|
||||||
this: InMemoryState[K, V] =>
|
|
||||||
private[kernel] val changeSet = new HashMap[K, V]
|
|
||||||
|
|
||||||
abstract override def begin = {
|
|
||||||
super.begin
|
|
||||||
changeSet.clear
|
changeSet.clear
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract override def put(key: K, value: V) = {
|
override def put(key: K, value: V) = {
|
||||||
super.put(key, value)
|
|
||||||
changeSet += key -> value
|
changeSet += key -> value
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract override def remove(key: K) = {
|
override def remove(key: K) = {
|
||||||
super.remove(key)
|
|
||||||
changeSet -= key
|
changeSet -= key
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def getRange(start: Int, count: Int)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
|
||||||
|
*/
|
||||||
|
class InMemoryTransactionalMap[K, V] extends TransactionalMap[K, V] {
|
||||||
|
protected[kernel] var state = new HashTrie[K, V]
|
||||||
|
protected[kernel] var snapshot = state
|
||||||
|
|
||||||
|
override def begin = snapshot = state
|
||||||
|
override def commit = snapshot = state
|
||||||
|
override def rollback = state = snapshot
|
||||||
|
|
||||||
|
override def put(key: K, value: V) = state = state.update(key, value)
|
||||||
|
override def get(key: K): V = state.get(key).getOrElse(throw new NoSuchElementException("No value for key [" + key + "]"))
|
||||||
|
override def remove(key: K) = state = state - key
|
||||||
|
override def contains(key: K): Boolean = state.contains(key)
|
||||||
|
override def elements: Iterator[(K, V)] = state.elements
|
||||||
|
override def size: Int = state.size
|
||||||
|
override def clear = state = new HashTrie[K, V]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements a persistent state based on the Cassandra distributed P2P key-value storage.
|
||||||
|
*/
|
||||||
|
class CassandraPersistentTransactionalMap(val actorName: String) extends PersistentTransactionalMap[String, String] {
|
||||||
|
override def begin = {}
|
||||||
|
override def rollback = {}
|
||||||
|
|
||||||
|
override def commit = {
|
||||||
|
// FIXME: should use batch function once the bug is resolved
|
||||||
|
for (entry <- changeSet) {
|
||||||
|
val (key, value) = entry
|
||||||
|
CassandraNode.insertActorStorageEntry(actorName, key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override def get(key: String): String = CassandraNode.getActorStorageEntryFor(actorName, key)
|
||||||
|
.getOrElse(throw new NoSuchElementException("Could not find element for key [" + key + "]"))
|
||||||
|
|
||||||
|
override def contains(key: String): Boolean = CassandraNode.getActorStorageEntryFor(actorName, key).isDefined
|
||||||
|
|
||||||
|
override def size: Int = CassandraNode.getActorStorageSizeFor(actorName)
|
||||||
|
|
||||||
|
override def clear = CassandraNode.removeActorStorageFor(actorName)
|
||||||
|
|
||||||
|
override def getRange(start: Int, count: Int) = CassandraNode.getActorStorageRange(actorName, start, count)
|
||||||
|
|
||||||
|
override def elements: Iterator[Tuple2[String, String]] = {
|
||||||
|
new Iterator[Tuple2[String, String]] {
|
||||||
|
private val originalList: List[Tuple2[String, String]] = CassandraNode.getActorStorageFor(actorName)
|
||||||
|
private var elements = originalList.reverse
|
||||||
|
|
||||||
|
override def next: Tuple2[String, String]= synchronized {
|
||||||
|
val element = elements.head
|
||||||
|
elements = elements.tail
|
||||||
|
element
|
||||||
|
}
|
||||||
|
|
||||||
|
override def hasNext: Boolean = synchronized { !elements.isEmpty }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//class VectorState[T] {
|
/**
|
||||||
// private[kernel] var state: Vector[T] = EmptyVector
|
* TODO: extend scala.Seq
|
||||||
// private[kernel] var snapshot = state
|
* Base for all transactional vector implementations.
|
||||||
// private[kernel] var unitOfWork: List[T] = Nil
|
*/
|
||||||
//
|
abstract class TransactionalVector[T] extends Transactional {
|
||||||
// private[kernel] def record = {
|
def add(elem: T)
|
||||||
// snapshot = state
|
def get(index: Int): T
|
||||||
// unitOfWork = Nil
|
def size: Int
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// def add(elem: T): VectorState[T] = {
|
/**
|
||||||
// state = state + elem
|
* Implements an in-memory transactional vector.
|
||||||
// unitOfWork ::= elem
|
*
|
||||||
// }
|
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
|
||||||
//
|
*/
|
||||||
// def get(index: Int): T = state(index)
|
class InMemoryTransactionalVector[T] extends TransactionalVector[T] {
|
||||||
//
|
private[kernel] var state: Vector[T] = EmptyVector
|
||||||
// def size: Int = state.size
|
private[kernel] var snapshot = state
|
||||||
//}
|
|
||||||
//
|
override def begin = snapshot = state
|
||||||
//
|
override def commit = snapshot = state
|
||||||
|
override def rollback = state = snapshot
|
||||||
|
|
||||||
|
override def add(elem: T) = state = state + elem
|
||||||
|
override def get(index: Int): T = state(index)
|
||||||
|
override def size: Int = state.size
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements a transactional reference.
|
||||||
|
*
|
||||||
|
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
|
||||||
|
*/
|
||||||
|
class TransactionalRef[T] extends Transactional {
|
||||||
|
private[kernel] var ref: Option[T] = None
|
||||||
|
private[kernel] var snapshot: Option[T] = None
|
||||||
|
|
||||||
|
override def begin = if (ref.isDefined) snapshot = Some(ref.get)
|
||||||
|
override def commit = if (ref.isDefined) snapshot = Some(ref.get)
|
||||||
|
override def rollback = if (snapshot.isDefined) ref = Some(snapshot.get)
|
||||||
|
|
||||||
|
def swap(elem: T) = ref = Some(elem)
|
||||||
|
def get: Option[T] = ref
|
||||||
|
def getOrElse(default: => T): T = ref.getOrElse(default)
|
||||||
|
def isDefined: Boolean= ref.isDefined
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ class Transaction extends Logging {
|
||||||
if (status == TransactionStatus.New) log.debug("Actor [%s] is starting NEW transaction", server)
|
if (status == TransactionStatus.New) log.debug("Actor [%s] is starting NEW transaction", server)
|
||||||
else log.debug("Actor [%s] is participating in transaction", server)
|
else log.debug("Actor [%s] is participating in transaction", server)
|
||||||
println("===== begin 2 " + server)
|
println("===== begin 2 " + server)
|
||||||
server.states.foreach(_.begin)
|
server.transactionalItems.foreach(_.begin)
|
||||||
participants ::= server
|
participants ::= server
|
||||||
status = TransactionStatus.Active
|
status = TransactionStatus.Active
|
||||||
}
|
}
|
||||||
|
|
@ -80,13 +80,13 @@ class Transaction extends Logging {
|
||||||
ensureIsActiveOrAborted
|
ensureIsActiveOrAborted
|
||||||
println("===== rollback " + server)
|
println("===== rollback " + server)
|
||||||
log.debug("Actor [%s] has initiated transaction rollback, rolling back [%s]" , server, participants)
|
log.debug("Actor [%s] has initiated transaction rollback, rolling back [%s]" , server, participants)
|
||||||
participants.foreach(_.states.foreach(_.rollback))
|
participants.foreach(_.transactionalItems.foreach(_.rollback))
|
||||||
status = TransactionStatus.Aborted
|
status = TransactionStatus.Aborted
|
||||||
}
|
}
|
||||||
|
|
||||||
def join(server: GenericServerContainer) = synchronized {
|
def join(server: GenericServerContainer) = synchronized {
|
||||||
println("===== joining " + server)
|
println("===== joining " + server)
|
||||||
server.states.foreach(_.begin)
|
server.transactionalItems.foreach(_.begin)
|
||||||
participants ::= server
|
participants ::= server
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,14 @@ package se.scalablesolutions.akka.kernel
|
||||||
import scala.actors._
|
import scala.actors._
|
||||||
import scala.actors.Actor._
|
import scala.actors.Actor._
|
||||||
|
|
||||||
|
import com.jteigen.scalatest.JUnit4Runner
|
||||||
|
import org.junit.runner.RunWith
|
||||||
import org.scalatest._
|
import org.scalatest._
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
*/
|
*/
|
||||||
|
@RunWith(classOf[JUnit4Runner])
|
||||||
class GenericServerContainerSpec extends Suite {
|
class GenericServerContainerSpec extends Suite {
|
||||||
|
|
||||||
var inner: GenericServerContainerActor = null
|
var inner: GenericServerContainerActor = null
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
package se.scalablesolutions.akka.kernel
|
package se.scalablesolutions.akka.kernel
|
||||||
|
|
||||||
|
import com.jteigen.scalatest.JUnit4Runner
|
||||||
|
import org.junit.runner.RunWith
|
||||||
import org.scalatest._
|
import org.scalatest._
|
||||||
|
|
||||||
import scala.actors.Actor._
|
import scala.actors.Actor._
|
||||||
|
|
@ -11,6 +13,7 @@ import scala.actors.Actor._
|
||||||
/**
|
/**
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
*/
|
*/
|
||||||
|
@RunWith(classOf[JUnit4Runner])
|
||||||
class GenericServerSpec extends Suite {
|
class GenericServerSpec extends Suite {
|
||||||
|
|
||||||
def testSendRegularMessage = {
|
def testSendRegularMessage = {
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,14 @@ import scala.actors.Actor._
|
||||||
import scala.collection.Map
|
import scala.collection.Map
|
||||||
import scala.collection.mutable.HashMap
|
import scala.collection.mutable.HashMap
|
||||||
|
|
||||||
|
import com.jteigen.scalatest.JUnit4Runner
|
||||||
|
import org.junit.runner.RunWith
|
||||||
import org.scalatest._
|
import org.scalatest._
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
*/
|
*/
|
||||||
|
@RunWith(classOf[JUnit4Runner])
|
||||||
class SupervisorSpec extends Suite {
|
class SupervisorSpec extends Suite {
|
||||||
|
|
||||||
var messageLog: String = ""
|
var messageLog: String = ""
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
package se.scalablesolutions.akka.kernel
|
package se.scalablesolutions.akka.kernel
|
||||||
|
|
||||||
|
import com.jteigen.scalatest.JUnit4Runner
|
||||||
|
import org.junit.runner.RunWith
|
||||||
import org.scalatest._
|
import org.scalatest._
|
||||||
|
|
||||||
import scala.actors.Actor._
|
import scala.actors.Actor._
|
||||||
|
|
@ -11,6 +13,7 @@ import scala.actors.Actor._
|
||||||
/**
|
/**
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
*/
|
*/
|
||||||
|
@RunWith(classOf[JUnit4Runner])
|
||||||
class SupervisorStateSpec extends Suite {
|
class SupervisorStateSpec extends Suite {
|
||||||
|
|
||||||
val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }}
|
val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }}
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
9
pom.xml
9
pom.xml
|
|
@ -51,8 +51,17 @@
|
||||||
</repository>
|
</repository>
|
||||||
<repository>
|
<repository>
|
||||||
<id>java.net</id>
|
<id>java.net</id>
|
||||||
|
<name>Java.net Legacy Repository for Maven</name>
|
||||||
<url>http://download.java.net/maven/1</url>
|
<url>http://download.java.net/maven/1</url>
|
||||||
<layout>legacy</layout>
|
<layout>legacy</layout>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>repository.jboss.org</id>
|
||||||
|
<name>JBoss Repository for Maven</name>
|
||||||
|
<url>http://repository.jboss.org/maven2</url>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</snapshots>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,214 +0,0 @@
|
||||||
--- OVERVIEW ---
|
|
||||||
Scala Actors Behavior Module
|
|
||||||
|
|
||||||
Implements Erlang-style Behaviors for Scala; Supervisor, GenericServer, GenericEvent and GenericFiniteStateMachine allowing creating fault-tolerant actor-based enterprise systems.
|
|
||||||
|
|
||||||
The implementation consists of four main abstractions;
|
|
||||||
|
|
||||||
* Supervisor -- The Supervisor manages hierarchies of Scala actors and provides fault-tolerance in terms of different restart
|
|
||||||
semantics. The configuration and semantics is almost a 1-1 port of the Erlang Supervisor implementation, explained
|
|
||||||
here: http://www.erlang.org/doc/design_principles/sup_princ.html, read this document in order to understand how to
|
|
||||||
configure the Supervisor properly.
|
|
||||||
|
|
||||||
* GenericServer -- The GenericServer (which subclasses Actor) is a trait that forms the base for a server to be managed by a Supervisor.
|
|
||||||
The GenericServer is wrapped by a GenericServerContainer instance providing a necessary indirection needed to be able to
|
|
||||||
fully manage the life-cycle of the GenericServer.
|
|
||||||
|
|
||||||
* GenericEvent -- TBD
|
|
||||||
|
|
||||||
* GenericFiniteStateMachine -- TBD
|
|
||||||
|
|
||||||
--- CHECK OUT ---
|
|
||||||
The SCM system used is Git.
|
|
||||||
|
|
||||||
1. Download and install Git (google git).
|
|
||||||
2. Invoke 'git clone git://github.com/jboner/scala-otp.git'.
|
|
||||||
|
|
||||||
--- BUILD ---
|
|
||||||
The build system used is Maven.
|
|
||||||
|
|
||||||
1. Download and install Maven 2.
|
|
||||||
2. Step into the root dir 'scala-otp'.
|
|
||||||
3. Invoke 'mvn install'
|
|
||||||
|
|
||||||
This will build the project, run all tests, create a jar and upload it to your local Maven repository ready for use.
|
|
||||||
|
|
||||||
--- RUNTIME DEPENDENCIES ---
|
|
||||||
1. Scala 2.7.1-final
|
|
||||||
2. SLF4J 1.5.2
|
|
||||||
3. LogBack Classic 0.9.9
|
|
||||||
|
|
||||||
--- USAGE ---
|
|
||||||
Here is a small step-by-step runnable tutorial on how to create a server, configure it, use it, hotswap its
|
|
||||||
implementation etc. For more details on the API, look at the code or the tests.
|
|
||||||
|
|
||||||
You can find this code in the sample.scala file in the root directory. Run it by invoking 'scala -cp
|
|
||||||
target/scala-behavior-0.1-SNAPSHOT.jar:<path to slf4j and logback jars> sample.scala'
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 1. Import statements and Server messages
|
|
||||||
|
|
||||||
import scala.actors._
|
|
||||||
import scala.actors.Actor._
|
|
||||||
|
|
||||||
import scala.actors.behavior._
|
|
||||||
import scala.actors.behavior.Helpers._
|
|
||||||
|
|
||||||
sealed abstract class SampleMessage
|
|
||||||
case object Ping extends SampleMessage
|
|
||||||
case object Pong extends SampleMessage
|
|
||||||
case object OneWay extends SampleMessage
|
|
||||||
case object Die extends SampleMessage
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 2. Create the GenericServer by extending the GenericServer trait and override the 'body' method
|
|
||||||
|
|
||||||
class SampleServer extends GenericServer {
|
|
||||||
|
|
||||||
// This method implements the core server logic and naturally has to be overridden
|
|
||||||
override def body: PartialFunction[Any, Unit] = {
|
|
||||||
case Ping =>
|
|
||||||
println("Received Ping"); reply(Pong)
|
|
||||||
|
|
||||||
case OneWay =>
|
|
||||||
println("Received OneWay")
|
|
||||||
|
|
||||||
case Die =>
|
|
||||||
println("Received Die..dying...")
|
|
||||||
throw new RuntimeException("Received Die message")
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenericServer also has some callback life-cycle methods, such as init(..) and shutdown(..)
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 3. Wrap our SampleServer in a GenericServerContainer and give it a name to be able to refer to it later.
|
|
||||||
|
|
||||||
object sampleServer1 extends GenericServerContainer("sample1", () => new SampleServer)
|
|
||||||
object sampleServer2 extends GenericServerContainer("sample2", () => new SampleServer)
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 4. Create a Supervisor configuration (and a SupervisorFactory) that is configuring our SampleServer (takes a list of
|
|
||||||
'Worker' configurations, one or many)
|
|
||||||
|
|
||||||
object factory extends SupervisorFactory {
|
|
||||||
override protected def getSupervisorConfig: SupervisorConfig = {
|
|
||||||
SupervisorConfig(
|
|
||||||
RestartStrategy(AllForOne, 3, 10000),
|
|
||||||
Worker(
|
|
||||||
sampleServer1,
|
|
||||||
LifeCycle(Permanent, 1000)) ::
|
|
||||||
Worker(
|
|
||||||
sampleServer2,
|
|
||||||
LifeCycle(Permanent, 1000)) ::
|
|
||||||
Nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 5. Create a new Supervisor with the custom factory
|
|
||||||
|
|
||||||
val supervisor = factory.newSupervisor
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 6. Start the Supervisor (which starts the server(s))
|
|
||||||
|
|
||||||
supervisor ! Start
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 7. Try to send a one way asyncronous message to our servers
|
|
||||||
|
|
||||||
sampleServer1 ! OneWay
|
|
||||||
|
|
||||||
// Try to get sampleServer2 from the Supervisor before sending a message
|
|
||||||
supervisor.getServer("sample2") match {
|
|
||||||
case Some(server2) => server2 ! OneWay
|
|
||||||
case None => println("server [sample2] could not be found")
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 8. Try to send an asyncronous message - receive a future - wait 100 ms (time-out) for the reply
|
|
||||||
|
|
||||||
val future = sampleServer1 !! Ping
|
|
||||||
val reply1 = future.receiveWithin(100) match {
|
|
||||||
case Some(reply) =>
|
|
||||||
println("Received reply: " + reply)
|
|
||||||
case None =>
|
|
||||||
println("Did not get a reply witin 100 ms")
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 9. Try to send a message (Die) telling the server to kill itself (throw an exception)
|
|
||||||
|
|
||||||
sampleServer1 ! Die
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 10. Send an asyncronous message and wait on a future. If it times out -> use error handler (in this case throw an
|
|
||||||
exception). It is likely that this call will time out since the server is in the middle of recovering from failure.
|
|
||||||
|
|
||||||
val reply2 = try {
|
|
||||||
sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 10) // time out is set to 10 ms (very low on purpose)
|
|
||||||
|
|
||||||
} catch { case e => println("Expected exception: " + e.toString); Pong }
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 11. Server should be up again. Try the same call again
|
|
||||||
|
|
||||||
val reply3 = try {
|
|
||||||
sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 1000)
|
|
||||||
} catch { case e => println("Expected exception: " + e.toString); Pong }
|
|
||||||
|
|
||||||
// Also check server number 2
|
|
||||||
sampleServer2 ! Ping
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 11. Try to hotswap the server implementation
|
|
||||||
|
|
||||||
sampleServer1.hotswap(Some({
|
|
||||||
case Ping =>
|
|
||||||
println("Hotswapped Ping")
|
|
||||||
}))
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 12. Try the hotswapped server out
|
|
||||||
|
|
||||||
sampleServer1 ! Ping
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 13. Hotswap again
|
|
||||||
|
|
||||||
sampleServer1.hotswap(Some({
|
|
||||||
case Pong =>
|
|
||||||
println("Hotswapped again, now doing Pong")
|
|
||||||
reply(Ping)
|
|
||||||
}))
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 14. Send an asyncronous message that will wait on a future. Method returns an Option[T] => if Some(result) -> return
|
|
||||||
result, if None -> print out an info message (or throw an exception or do whatever you like...)
|
|
||||||
|
|
||||||
val reply4 = (sampleServer1 !!! Pong).getOrElse({println("Time out when sending Pong"); Ping})
|
|
||||||
|
|
||||||
// Same invocation with pattern matching syntax.
|
|
||||||
|
|
||||||
val reply5 = sampleServer1 !!! Pong match {
|
|
||||||
case Some(result) => result
|
|
||||||
case None => println("Time out when sending Pong"); Ping
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 15. Hotswap back to original implementation by passing in None
|
|
||||||
|
|
||||||
sampleServer1.hotswap(None)
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 16. Test the final hotswap by sending an async message
|
|
||||||
|
|
||||||
sampleServer1 ! Ping
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 17. Shut down the supervisor and its server(s)
|
|
||||||
|
|
||||||
supervisor ! Stop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,164 +0,0 @@
|
||||||
// =============================================
|
|
||||||
// 1. Import statements and Server messages
|
|
||||||
|
|
||||||
import scala.actors._
|
|
||||||
import scala.actors.Actor._
|
|
||||||
|
|
||||||
import scala.actors.behavior._
|
|
||||||
import scala.actors.behavior.Helpers._
|
|
||||||
|
|
||||||
sealed abstract class SampleMessage
|
|
||||||
case object Ping extends SampleMessage
|
|
||||||
case object Pong extends SampleMessage
|
|
||||||
case object OneWay extends SampleMessage
|
|
||||||
case object Die extends SampleMessage
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 2. Create the GenericServer by extending the GenericServer trait and override the 'body' method
|
|
||||||
|
|
||||||
class SampleServer extends GenericServer {
|
|
||||||
|
|
||||||
// This method implements the core server logic and naturally has to be overridden
|
|
||||||
override def body: PartialFunction[Any, Unit] = {
|
|
||||||
case Ping =>
|
|
||||||
println("Received Ping"); reply(Pong)
|
|
||||||
|
|
||||||
case OneWay =>
|
|
||||||
println("Received OneWay")
|
|
||||||
|
|
||||||
case Die =>
|
|
||||||
println("Received Die..dying...")
|
|
||||||
throw new RuntimeException("Received Die message")
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenericServer also has some callback life-cycle methods, such as init(..) and shutdown(..)
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 3. Wrap our SampleServer in a GenericServerContainer and give it a name to be able to refer to it later.
|
|
||||||
|
|
||||||
object sampleServer1 extends GenericServerContainer("sample1", () => new SampleServer)
|
|
||||||
object sampleServer2 extends GenericServerContainer("sample2", () => new SampleServer)
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 4. Create a Supervisor configuration (and a SupervisorFactory) that is configuring our SampleServer (takes a list of 'Worker' configurations, one or many)
|
|
||||||
|
|
||||||
object factory extends SupervisorFactory {
|
|
||||||
override protected def getSupervisorConfig: SupervisorConfig = {
|
|
||||||
SupervisorConfig(
|
|
||||||
RestartStrategy(AllForOne, 3, 10000),
|
|
||||||
Worker(
|
|
||||||
sampleServer1,
|
|
||||||
LifeCycle(Permanent, 1000)) ::
|
|
||||||
Worker(
|
|
||||||
sampleServer2,
|
|
||||||
LifeCycle(Permanent, 1000)) ::
|
|
||||||
Nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 5. Create a new Supervisor with the custom factory
|
|
||||||
|
|
||||||
val supervisor = factory.newSupervisor
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 6. Start the Supervisor (which starts the server(s))
|
|
||||||
|
|
||||||
supervisor ! Start
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 7. Try to send a one way asyncronous message to our servers
|
|
||||||
|
|
||||||
sampleServer1 ! OneWay
|
|
||||||
|
|
||||||
// Try to get sampleServer2 from the Supervisor before sending a message
|
|
||||||
supervisor.getServer("sample2") match {
|
|
||||||
case Some(server2) => server2 ! OneWay
|
|
||||||
case None => println("server [sample2] could not be found")
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 8. Try to send an asyncronous message - receive a future - wait 100 ms (time-out) for the reply
|
|
||||||
|
|
||||||
val future = sampleServer1 !! Ping
|
|
||||||
val reply1 = future.receiveWithin(100) match {
|
|
||||||
case Some(reply) =>
|
|
||||||
println("Received reply: " + reply)
|
|
||||||
case None =>
|
|
||||||
println("Did not get a reply witin 100 ms")
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 9. Try to send a message (Die) telling the server to kill itself (throw an exception)
|
|
||||||
|
|
||||||
sampleServer1 ! Die
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 10. Send an asyncronous message and wait on a future. If it times out -> use error handler (in this case throw an exception). It is likely that this call will time out since the server is in the middle of recovering from failure.
|
|
||||||
|
|
||||||
val reply2 = try {
|
|
||||||
sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 10) // time out is set to 10 ms (very low on purpose)
|
|
||||||
|
|
||||||
} catch { case e => println("Expected exception: " + e.toString); Pong }
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 11. Server should be up again. Try the same call again
|
|
||||||
|
|
||||||
val reply3 = try {
|
|
||||||
sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 1000)
|
|
||||||
} catch { case e => println("Expected exception: " + e.toString); Pong }
|
|
||||||
|
|
||||||
// Also check server number 2
|
|
||||||
sampleServer2 ! Ping
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 11. Try to hotswap the server implementation
|
|
||||||
|
|
||||||
sampleServer1.hotswap(Some({
|
|
||||||
case Ping =>
|
|
||||||
println("Hotswapped Ping")
|
|
||||||
}))
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 12. Try the hotswapped server out
|
|
||||||
|
|
||||||
sampleServer1 ! Ping
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 13. Hotswap again
|
|
||||||
|
|
||||||
sampleServer1.hotswap(Some({
|
|
||||||
case Pong =>
|
|
||||||
println("Hotswapped again, now doing Pong")
|
|
||||||
reply(Ping)
|
|
||||||
}))
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 14. Send an asyncronous message that will wait on a future. Method returns an Option[T] => if Some(result) -> return result, if None -> print out an info message (or throw an exception or do whatever you like...)
|
|
||||||
|
|
||||||
val reply4 = (sampleServer1 !!! Pong).getOrElse({println("Time out when sending Pong"); Ping})
|
|
||||||
|
|
||||||
// Same invocation with pattern matching syntax.
|
|
||||||
|
|
||||||
val reply5 = sampleServer1 !!! Pong match {
|
|
||||||
case Some(result) => result
|
|
||||||
case None => println("Time out when sending Pong"); Ping
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 15. Hotswap back to original implementation by passing in None
|
|
||||||
|
|
||||||
sampleServer1.hotswap(None)
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 16. Test the final hotswap by sending an async message
|
|
||||||
|
|
||||||
sampleServer1 ! Ping
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// 17. Shut down the supervisor and its server(s)
|
|
||||||
|
|
||||||
supervisor ! Stop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,282 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.scalablesolutions.akka.supervisor
|
|
||||||
|
|
||||||
import scala.actors._
|
|
||||||
import scala.actors.Actor._
|
|
||||||
|
|
||||||
import com.scalablesolutions.akka.supervisor.Helpers._
|
|
||||||
|
|
||||||
sealed abstract class GenericServerMessage
|
|
||||||
case class Init(config: AnyRef) extends GenericServerMessage
|
|
||||||
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
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base trait for all user-defined servers/actors.
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
trait GenericServer extends Actor {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Template method implementing the server logic.
|
|
||||||
* To be implemented by subclassing server.
|
|
||||||
* <p/>
|
|
||||||
* Example code:
|
|
||||||
* <pre>
|
|
||||||
* override def body: PartialFunction[Any, Unit] = {
|
|
||||||
* case Ping =>
|
|
||||||
* println("got a ping")
|
|
||||||
* reply("pong")
|
|
||||||
*
|
|
||||||
* case OneWay =>
|
|
||||||
* println("got a oneway")
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
def body: PartialFunction[Any, Unit]
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback method that is called during initialization.
|
|
||||||
* To be implemented by subclassing server.
|
|
||||||
*/
|
|
||||||
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) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback method that is called during termination.
|
|
||||||
* To be implemented by subclassing server.
|
|
||||||
*/
|
|
||||||
def shutdown(reason: AnyRef) {}
|
|
||||||
|
|
||||||
def act = loop { react { genericBase orElse actorBase } }
|
|
||||||
|
|
||||||
private def actorBase: PartialFunction[Any, Unit] = hotswap getOrElse body
|
|
||||||
|
|
||||||
private var hotswap: Option[PartialFunction[Any, Unit]] = None
|
|
||||||
|
|
||||||
private val genericBase: 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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The container (proxy) for GenericServer, responsible for managing the life-cycle of the server;
|
|
||||||
* such as shutdown, restart, re-initialization etc.
|
|
||||||
* Each GenericServerContainer manages one GenericServer.
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class GenericServerContainer(val id: String, var serverFactory: () => GenericServer) extends Logging {
|
|
||||||
require(id != null && id != "")
|
|
||||||
|
|
||||||
// TODO: see if we can parameterize class and add type safe getActor method
|
|
||||||
//class GenericServerContainer[T <: GenericServer](var factory: () => T) {
|
|
||||||
//def getActor: T = server
|
|
||||||
|
|
||||||
var lifeCycle: Option[LifeCycle] = None
|
|
||||||
val lock = new ReadWriteLock
|
|
||||||
|
|
||||||
private var server: GenericServer = null
|
|
||||||
private var currentConfig: Option[AnyRef] = None
|
|
||||||
private var timeout = 5000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a one way message to the server - alias for <code>cast(message)</code>.
|
|
||||||
* <p>
|
|
||||||
* Example:
|
|
||||||
* <pre>
|
|
||||||
* server ! Message
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
def !(message: Any) = {
|
|
||||||
require(server != null)
|
|
||||||
lock.withReadLock { server ! message }
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a message to the server returns a FutureWithTimeout holding the future reply .
|
|
||||||
* <p>
|
|
||||||
* Example:
|
|
||||||
* <pre>
|
|
||||||
* val future = server !! Message
|
|
||||||
* future.receiveWithin(100) match {
|
|
||||||
* case None => ... // timed out
|
|
||||||
* case Some(reply) => ... // handle reply
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
def !: FutureWithTimeout[T] = {
|
|
||||||
require(server != null)
|
|
||||||
lock.withReadLock { server !!! message }
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a message to the server and blocks indefinitely (no time out), waiting for the reply.
|
|
||||||
* <p>
|
|
||||||
* Example:
|
|
||||||
* <pre>
|
|
||||||
* val result: String = server !? Message
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
def !?[T](message: Any): T = {
|
|
||||||
require(server != null)
|
|
||||||
val future: Future[T] = lock.withReadLock { server.! }
|
|
||||||
Actor.receive {
|
|
||||||
case (future.ch ! arg) => arg.asInstanceOf[T]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a message to the server and gets a future back with the reply. Returns
|
|
||||||
* an Option with either Some(result) if succesful or None if timeout.
|
|
||||||
* <p>
|
|
||||||
* Timeout specified by the <code>setTimeout(time: Int)</code> method.
|
|
||||||
* <p>
|
|
||||||
* Example:
|
|
||||||
* <pre>
|
|
||||||
* (server !!! Message).getOrElse(throw new RuntimeException("time out")
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
def !!: Option[T] = {
|
|
||||||
require(server != null)
|
|
||||||
val future: FutureWithTimeout[T] = lock.withReadLock { server !!! message }
|
|
||||||
future.receiveWithin(timeout)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a message to the server and gets a future back with the reply.
|
|
||||||
* <p>
|
|
||||||
* Tries to get the reply within the timeout specified in the GenericServerContainer
|
|
||||||
* and else execute the error handler (which can return a default value, throw an exception
|
|
||||||
* or whatever is appropriate).
|
|
||||||
* <p>
|
|
||||||
* Example:
|
|
||||||
* <pre>
|
|
||||||
* server !!! (Message, throw new RuntimeException("time out"))
|
|
||||||
* // OR
|
|
||||||
* server !!! (Message, DefaultReturnValue)
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
def !!: T = !!!(message, errorHandler, timeout)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends a message to the server and gets a future back with the reply.
|
|
||||||
* <p>
|
|
||||||
* Tries to get the reply within the timeout specified as parameter to the method
|
|
||||||
* and else execute the error handler (which can return a default value, throw an exception
|
|
||||||
* or whatever is appropriate).
|
|
||||||
* <p>
|
|
||||||
* Example:
|
|
||||||
* <pre>
|
|
||||||
* server !!! (Message, throw new RuntimeException("time out"), 1000)
|
|
||||||
* // OR
|
|
||||||
* server !!! (Message, DefaultReturnValue, 1000)
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
def !!: T = {
|
|
||||||
require(server != null)
|
|
||||||
val future: FutureWithTimeout[T] = lock.withReadLock { server !!! message }
|
|
||||||
future.receiveWithin(time) match {
|
|
||||||
case None => errorHandler
|
|
||||||
case Some(reply) => reply
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes the server by sending a Init(config) message.
|
|
||||||
*/
|
|
||||||
def init(config: AnyRef) = lock.withWriteLock {
|
|
||||||
currentConfig = Some(config)
|
|
||||||
server ! Init(config)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Re-initializes the server by sending a ReInit(config) message with the most recent configuration.
|
|
||||||
*/
|
|
||||||
def reinit = lock.withWriteLock {
|
|
||||||
currentConfig match {
|
|
||||||
case Some(config) => server ! ReInit(config)
|
|
||||||
case None => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hotswaps the server body by sending it a HotSwap(code) with the new code
|
|
||||||
* block (PartialFunction) to be executed.
|
|
||||||
*/
|
|
||||||
def hotswap(code: Option[PartialFunction[Any, Unit]]) = lock.withReadLock { server ! HotSwap(code) }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Swaps the server factory, enabling creating of a completely new server implementation
|
|
||||||
* (upon failure and restart).
|
|
||||||
*/
|
|
||||||
def swapFactory(newFactory: () => GenericServer) = serverFactory = newFactory
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the timeout for the call(..) method, e.g. the maximum time to wait for a reply
|
|
||||||
* before bailing out. Sets the timeout on the future return from the call to the server.
|
|
||||||
*/
|
|
||||||
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[supervisor] def newServer(): GenericServer = lock.withWriteLock {
|
|
||||||
server = serverFactory()
|
|
||||||
server
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts the server.
|
|
||||||
*/
|
|
||||||
private[supervisor] def start = lock.withReadLock { server.start }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Terminates the server with a reason by sending a Terminate(Some(reason)) message.
|
|
||||||
*/
|
|
||||||
private[supervisor] def terminate(reason: AnyRef) = lock.withReadLock { server ! Terminate(reason) }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Terminates the server with a reason by sending a Terminate(Some(reason)) message,
|
|
||||||
* the shutdownTime defines the maximal time to wait for the server to shutdown before
|
|
||||||
* killing it.
|
|
||||||
*/
|
|
||||||
private[supervisor] def terminate(reason: AnyRef, shutdownTime: Int) = lock.withReadLock {
|
|
||||||
if (shutdownTime > 0) {
|
|
||||||
log.debug("Waiting {} milliseconds for the server to shut down before killing it.", shutdownTime)
|
|
||||||
server !? (shutdownTime, Shutdown(reason)) match {
|
|
||||||
case Some('success) => log.debug("Server [{}] has been shut down cleanly.", id)
|
|
||||||
case None => log.warning("Server [{}] was **not able** to complete shutdown cleanly within its configured shutdown time [{}]", id, shutdownTime)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
server ! Terminate(reason)
|
|
||||||
}
|
|
||||||
|
|
||||||
private[supervisor] def reconfigure(reason: AnyRef, restartedServer: GenericServer, supervisor: Supervisor) = lock.withWriteLock {
|
|
||||||
server = restartedServer
|
|
||||||
reinit
|
|
||||||
}
|
|
||||||
|
|
||||||
private[supervisor] def getServer: GenericServer = server
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,101 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.scalablesolutions.akka.supervisor
|
|
||||||
|
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock
|
|
||||||
|
|
||||||
import scala.actors._
|
|
||||||
import scala.actors.Actor._
|
|
||||||
|
|
||||||
import net.lag.logging.Logger
|
|
||||||
|
|
||||||
class SystemFailure(cause: Throwable) extends RuntimeException(cause)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base trait for all classes that wants to be able use the logging infrastructure.
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
trait Logging {
|
|
||||||
@transient val log = Logger.get(this.getClass.getName)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
object Helpers extends Logging {
|
|
||||||
|
|
||||||
// ================================================
|
|
||||||
class ReadWriteLock {
|
|
||||||
private val rwl = new ReentrantReadWriteLock
|
|
||||||
private val readLock = rwl.readLock
|
|
||||||
private val writeLock = rwl.writeLock
|
|
||||||
|
|
||||||
def withWriteLock[T](body: => T): T = {
|
|
||||||
writeLock.lock
|
|
||||||
try {
|
|
||||||
body
|
|
||||||
} finally {
|
|
||||||
writeLock.unlock
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def withReadLock[T](body: => T): T = {
|
|
||||||
readLock.lock
|
|
||||||
try {
|
|
||||||
body
|
|
||||||
} finally {
|
|
||||||
readLock.unlock
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ================================================
|
|
||||||
// implicit conversion between regular actor and actor with a type future
|
|
||||||
implicit def actorWithFuture(a: Actor) = new ActorWithTypedFuture(a)
|
|
||||||
|
|
||||||
abstract class FutureWithTimeout[T](ch: InputChannel[Any]) extends Future[T](ch) {
|
|
||||||
def receiveWithin(timeout: Int) : Option[T]
|
|
||||||
override def respond(f: T => Unit): Unit = throw new UnsupportedOperationException("Does not support the Responder API")
|
|
||||||
}
|
|
||||||
|
|
||||||
def receiveOrFail[T](future: => FutureWithTimeout[T], timeout: Int, errorHandler: => T): T = {
|
|
||||||
future.receiveWithin(timeout) match {
|
|
||||||
case None => errorHandler
|
|
||||||
case Some(reply) => reply
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ActorWithTypedFuture(a: Actor) {
|
|
||||||
require(a != null)
|
|
||||||
|
|
||||||
def !!: FutureWithTimeout[A] = {
|
|
||||||
val ftch = new Channel[Any](Actor.self)
|
|
||||||
a.send(msg, ftch)
|
|
||||||
new FutureWithTimeout[A](ftch) {
|
|
||||||
def apply() =
|
|
||||||
if (isSet) value.get.asInstanceOf[A]
|
|
||||||
else ch.receive {
|
|
||||||
case a =>
|
|
||||||
value = Some(a)
|
|
||||||
value.get.asInstanceOf[A]
|
|
||||||
}
|
|
||||||
def isSet = receiveWithin(0).isDefined
|
|
||||||
def receiveWithin(timeout: Int): Option[A] = value match {
|
|
||||||
case None => ch.receiveWithin(timeout) {
|
|
||||||
case TIMEOUT =>
|
|
||||||
log.debug("Future timed out while waiting for actor: {}", a)
|
|
||||||
None
|
|
||||||
case a =>
|
|
||||||
value = Some(a)
|
|
||||||
value.asInstanceOf[Option[A]]
|
|
||||||
}
|
|
||||||
case a => a.asInstanceOf[Option[A]]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,358 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.scalablesolutions.akka.supervisor
|
|
||||||
|
|
||||||
import scala.actors._
|
|
||||||
import scala.actors.Actor._
|
|
||||||
import scala.collection.mutable.HashMap
|
|
||||||
|
|
||||||
import com.scalablesolutions.akka.supervisor.Helpers._
|
|
||||||
|
|
||||||
//====================================================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configuration classes - not to be used as messages.
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
sealed abstract class ConfigElement
|
|
||||||
|
|
||||||
abstract class Server extends ConfigElement
|
|
||||||
abstract class FailOverScheme extends ConfigElement
|
|
||||||
abstract class Scope extends ConfigElement
|
|
||||||
|
|
||||||
case class SupervisorConfig(restartStrategy: RestartStrategy, worker: List[Server]) extends Server
|
|
||||||
case class Worker(serverContainer: GenericServerContainer, lifeCycle: LifeCycle) extends Server
|
|
||||||
|
|
||||||
case class RestartStrategy(scheme: FailOverScheme, maxNrOfRetries: Int, withinTimeRange: Int) extends ConfigElement
|
|
||||||
|
|
||||||
case object AllForOne extends FailOverScheme
|
|
||||||
case object OneForOne extends FailOverScheme
|
|
||||||
|
|
||||||
case class LifeCycle(scope: Scope, shutdownTime: Int) extends ConfigElement
|
|
||||||
case object Permanent extends Scope
|
|
||||||
case object Transient extends Scope
|
|
||||||
case object Temporary extends Scope
|
|
||||||
|
|
||||||
//====================================================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Messages that the supervisor responds to and returns.
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
sealed abstract class SupervisorMessage
|
|
||||||
case object Start extends SupervisorMessage
|
|
||||||
case object Stop extends SupervisorMessage
|
|
||||||
case class Configure(config: SupervisorConfig, factory: SupervisorFactory) extends SupervisorMessage
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract base class for all supervisor factories.
|
|
||||||
* <p>
|
|
||||||
* Example usage:
|
|
||||||
* <pre>
|
|
||||||
* class MySupervisorFactory extends SupervisorFactory {
|
|
||||||
*
|
|
||||||
* override protected def getSupervisorConfig: SupervisorConfig = {
|
|
||||||
* SupervisorConfig(
|
|
||||||
* RestartStrategy(OneForOne, 3, 10),
|
|
||||||
* Worker(
|
|
||||||
* myFirstActorInstance,
|
|
||||||
* LifeCycle(Permanent, 1000))
|
|
||||||
* ::
|
|
||||||
* Worker(
|
|
||||||
* mySecondActorInstance,
|
|
||||||
* LifeCycle(Permanent, 1000))
|
|
||||||
* :: Nil)
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* Then create a concrete factory in which we mix in support for the specific implementation of the Service we want to use.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* object factory extends MySupervisorFactory
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* Then create a new Supervisor tree with the concrete Services we have defined.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* val supervisor = factory.newSupervisor
|
|
||||||
* supervisor ! Start // start up all managed servers
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
abstract class SupervisorFactory extends Logging {
|
|
||||||
def newSupervisor: Supervisor = newSupervisorFor(getSupervisorConfig)
|
|
||||||
|
|
||||||
def newSupervisorFor(config: SupervisorConfig): Supervisor = config match {
|
|
||||||
case SupervisorConfig(restartStrategy, _) =>
|
|
||||||
val supervisor = create(restartStrategy)
|
|
||||||
supervisor.start
|
|
||||||
supervisor !? Configure(config, this) match {
|
|
||||||
case 'success => log.debug("Supervisor successfully configured")
|
|
||||||
case _ => log.error("Supervisor could not be configured")
|
|
||||||
}
|
|
||||||
supervisor
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* To be overridden by concrete factory.
|
|
||||||
* Should return the SupervisorConfig for the supervisor.
|
|
||||||
*/
|
|
||||||
protected def getSupervisorConfig: SupervisorConfig
|
|
||||||
|
|
||||||
protected def create(strategy: RestartStrategy): Supervisor = strategy match {
|
|
||||||
case RestartStrategy(scheme, maxNrOfRetries, timeRange) =>
|
|
||||||
scheme match {
|
|
||||||
case AllForOne => new Supervisor(new AllForOneStrategy(maxNrOfRetries, timeRange))
|
|
||||||
case OneForOne => new Supervisor(new OneForOneStrategy(maxNrOfRetries, timeRange))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//====================================================
|
|
||||||
/**
|
|
||||||
* TODO: document
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class Supervisor(faultHandler: FaultHandlingStrategy) extends Actor with Logging {
|
|
||||||
|
|
||||||
private val state = new SupervisorState(this, faultHandler)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an Option with the GenericServerContainer for the server with the name specified.
|
|
||||||
* If the server is found then Some(server) is returned else None.
|
|
||||||
*/
|
|
||||||
def getServer(id: String): Option[GenericServerContainer] = state.getServerContainer(id)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an the GenericServerContainer for the server with the name specified.
|
|
||||||
* If the server is not found then the error handler is invoked.
|
|
||||||
*/
|
|
||||||
def getServerOrElse(id: String, errorHandler: => GenericServerContainer): GenericServerContainer = {
|
|
||||||
getServer(id) match {
|
|
||||||
case Some(serverContainer) => serverContainer
|
|
||||||
case None => errorHandler
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def act = {
|
|
||||||
self.trapExit = true
|
|
||||||
loop {
|
|
||||||
react {
|
|
||||||
case Configure(config, factory) =>
|
|
||||||
log.debug("Configuring supervisor:{} ", this)
|
|
||||||
configure(config, factory)
|
|
||||||
reply('success)
|
|
||||||
|
|
||||||
case Start =>
|
|
||||||
state.serverContainers.foreach { serverContainer =>
|
|
||||||
serverContainer.start
|
|
||||||
log.info("Starting server: {}", serverContainer.getServer)
|
|
||||||
}
|
|
||||||
|
|
||||||
case Stop =>
|
|
||||||
state.serverContainers.foreach { serverContainer =>
|
|
||||||
serverContainer.terminate('normal)
|
|
||||||
log.info("Stopping server: {}", serverContainer)
|
|
||||||
}
|
|
||||||
log.info("Stopping supervisor: {}", 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 [{}], ignoring...", unexpected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private def configure(config: SupervisorConfig, factory: SupervisorFactory) = config match {
|
|
||||||
case SupervisorConfig(_, servers) =>
|
|
||||||
servers.map(server =>
|
|
||||||
server match {
|
|
||||||
case Worker(serverContainer, lifecycle) =>
|
|
||||||
serverContainer.lifeCycle = Some(lifecycle)
|
|
||||||
spawnLink(serverContainer)
|
|
||||||
|
|
||||||
case SupervisorConfig(_, _) => // recursive configuration
|
|
||||||
val supervisor = factory.newSupervisorFor(server.asInstanceOf[SupervisorConfig])
|
|
||||||
supervisor ! Start
|
|
||||||
state.addSupervisor(supervisor)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private[supervisor] def spawnLink(serverContainer: GenericServerContainer): GenericServer = {
|
|
||||||
val newServer = serverContainer.newServer()
|
|
||||||
newServer.start
|
|
||||||
self.link(newServer)
|
|
||||||
log.debug("Linking actor [{}] to supervisor [{}]", newServer, this)
|
|
||||||
state.addServerContainer(serverContainer)
|
|
||||||
newServer
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//====================================================
|
|
||||||
/**
|
|
||||||
* TODO: document
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
abstract class FaultHandlingStrategy(val maxNrOfRetries: Int, val withinTimeRange: Int) extends Logging {
|
|
||||||
private[supervisor] var supervisor: Supervisor = _
|
|
||||||
private var nrOfRetries = 0
|
|
||||||
private var retryStartTime = currentTime
|
|
||||||
|
|
||||||
private[supervisor] def handleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = {
|
|
||||||
nrOfRetries += 1
|
|
||||||
if (timeRangeHasExpired) {
|
|
||||||
if (hasReachedMaximumNrOfRetries) {
|
|
||||||
log.info("Maximum of restarts [{}] for server [{}] has been reached - the supervisor including all its servers will now be shut down.", maxNrOfRetries, failedServer)
|
|
||||||
supervisor ! Stop // execution stops here
|
|
||||||
} else {
|
|
||||||
nrOfRetries = 0
|
|
||||||
retryStartTime = currentTime
|
|
||||||
}
|
|
||||||
}
|
|
||||||
doHandleFailure(state, failedServer, reason)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private[supervisor] def restart(serverContainer: GenericServerContainer, reason: AnyRef, state: SupervisorState) = {
|
|
||||||
preRestart(serverContainer)
|
|
||||||
serverContainer.lock.withWriteLock {
|
|
||||||
|
|
||||||
// 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)
|
|
||||||
serverContainer.lifeCycle match {
|
|
||||||
case None => throw new IllegalStateException("Server [" + serverContainer.id + "] does not have a life-cycle defined.")
|
|
||||||
case Some(LifeCycle(scope, shutdownTime)) =>
|
|
||||||
serverContainer.terminate(reason, shutdownTime)
|
|
||||||
|
|
||||||
scope match {
|
|
||||||
case Permanent =>
|
|
||||||
log.debug("Restarting server [{}] configured as PERMANENT.", serverContainer.id)
|
|
||||||
serverContainer.reconfigure(reason, supervisor.spawnLink(serverContainer), state.supervisor)
|
|
||||||
|
|
||||||
case Temporary =>
|
|
||||||
if (reason == 'normal) {
|
|
||||||
log.debug("Restarting server [{}] configured as TEMPORARY (since exited naturally).", serverContainer.id)
|
|
||||||
serverContainer.reconfigure(reason, supervisor.spawnLink(serverContainer), state.supervisor)
|
|
||||||
} else log.info("Server [{}] configured as TEMPORARY will not be restarted (received unnatural exit message).", serverContainer.id)
|
|
||||||
|
|
||||||
case Transient =>
|
|
||||||
log.info("Server [{}] configured as TRANSIENT will not be restarted.", serverContainer.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
postRestart(serverContainer)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* To be overriden by concrete strategies.
|
|
||||||
*/
|
|
||||||
protected def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* To be overriden by concrete strategies.
|
|
||||||
*/
|
|
||||||
protected def preRestart(serverContainer: GenericServerContainer) = {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* To be overriden by concrete strategies.
|
|
||||||
*/
|
|
||||||
protected def postRestart(serverContainer: GenericServerContainer) = {}
|
|
||||||
|
|
||||||
private def hasReachedMaximumNrOfRetries: Boolean = nrOfRetries > maxNrOfRetries
|
|
||||||
private def timeRangeHasExpired: Boolean = (currentTime - retryStartTime) > withinTimeRange
|
|
||||||
private def currentTime: Long = System.currentTimeMillis
|
|
||||||
}
|
|
||||||
|
|
||||||
//====================================================
|
|
||||||
/**
|
|
||||||
* TODO: document
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class AllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int)
|
|
||||||
extends FaultHandlingStrategy(maxNrOfRetries, withinTimeRange) {
|
|
||||||
override def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = {
|
|
||||||
log.error("Server [{}] has failed due to [{}] - scheduling restart - scheme: ALL_FOR_ONE.", failedServer, reason)
|
|
||||||
for (serverContainer <- state.serverContainers) restart(serverContainer, reason, state)
|
|
||||||
state.supervisors.foreach(_ ! Exit(failedServer, reason))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//====================================================
|
|
||||||
/**
|
|
||||||
* TODO: document
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class OneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int)
|
|
||||||
extends FaultHandlingStrategy(maxNrOfRetries, withinTimeRange) {
|
|
||||||
override def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = {
|
|
||||||
log.error("Server [{}] has failed due to [{}] - scheduling restart - scheme: ONE_FOR_ONE.", failedServer, reason)
|
|
||||||
var serverContainer: Option[GenericServerContainer] = None
|
|
||||||
state.serverContainers.foreach {
|
|
||||||
container => if (container.getServer == failedServer) serverContainer = Some(container)
|
|
||||||
}
|
|
||||||
serverContainer match {
|
|
||||||
case None => throw new RuntimeException("Could not find a generic server for actor: " + failedServer)
|
|
||||||
case Some(container) => restart(container, reason, state)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//====================================================
|
|
||||||
/**
|
|
||||||
* TODO: document
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
private[supervisor] class SupervisorState(val supervisor: Supervisor, val faultHandler: FaultHandlingStrategy) extends Logging {
|
|
||||||
faultHandler.supervisor = supervisor
|
|
||||||
|
|
||||||
private val _lock = new ReadWriteLock
|
|
||||||
private val _serverContainerRegistry = new HashMap[String, GenericServerContainer]
|
|
||||||
private var _supervisors: List[Supervisor] = Nil
|
|
||||||
|
|
||||||
def supervisors: List[Supervisor] = _lock.withReadLock {
|
|
||||||
_supervisors
|
|
||||||
}
|
|
||||||
|
|
||||||
def addSupervisor(supervisor: Supervisor) = _lock.withWriteLock {
|
|
||||||
_supervisors = supervisor :: _supervisors
|
|
||||||
}
|
|
||||||
|
|
||||||
def serverContainers: List[GenericServerContainer] = _lock.withReadLock {
|
|
||||||
_serverContainerRegistry.values.toList
|
|
||||||
}
|
|
||||||
|
|
||||||
def getServerContainer(id: String): Option[GenericServerContainer] = _lock.withReadLock {
|
|
||||||
if (_serverContainerRegistry.contains(id)) Some(_serverContainerRegistry(id))
|
|
||||||
else None
|
|
||||||
}
|
|
||||||
|
|
||||||
def addServerContainer(serverContainer: GenericServerContainer) = _lock.withWriteLock {
|
|
||||||
_serverContainerRegistry += serverContainer.id -> serverContainer
|
|
||||||
}
|
|
||||||
|
|
||||||
def removeServerContainer(id: String) = _lock.withWriteLock {
|
|
||||||
getServerContainer(id) match {
|
|
||||||
case Some(serverContainer) => _serverContainerRegistry - id
|
|
||||||
case None => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,202 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.scalablesolutions.akka.supervisor
|
|
||||||
|
|
||||||
import org.specs.runner.JUnit4
|
|
||||||
import org.specs.Specification
|
|
||||||
|
|
||||||
import scala.actors._
|
|
||||||
import scala.actors.Actor._
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class GenericServerContainerTest extends JUnit4(genericServerContainerSpec) // for JUnit4 and Maven
|
|
||||||
object genericServerContainerSpec extends Specification {
|
|
||||||
|
|
||||||
var inner: GenericServerContainerActor = null
|
|
||||||
var server: GenericServerContainer = null
|
|
||||||
def createProxy(f: () => GenericServer) = {
|
|
||||||
val server = new GenericServerContainer("server", f)
|
|
||||||
server.setTimeout(100)
|
|
||||||
server
|
|
||||||
}
|
|
||||||
|
|
||||||
inner = new GenericServerContainerActor
|
|
||||||
server = createProxy(() => inner)
|
|
||||||
server.newServer
|
|
||||||
server.start
|
|
||||||
|
|
||||||
"server should be initialized" in {
|
|
||||||
server.init("testInit")
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("initializing: testInit") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server should terminate with a reason " in {
|
|
||||||
server.terminate("testTerminateWithReason", 100)
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("terminating: testTerminateWithReason") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond to async oneway message" in {
|
|
||||||
server ! OneWay
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("got a oneway") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond to async ping message" in {
|
|
||||||
server ! Ping
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("got a ping") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond to !!!" in {
|
|
||||||
expect("pong") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
expect("got a ping") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond to !?" in {
|
|
||||||
expect("pong") {
|
|
||||||
val res: String = server !? Ping
|
|
||||||
res
|
|
||||||
}
|
|
||||||
expect("got a ping") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond to !!! with timeout" in {
|
|
||||||
expect("pong") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
expect("got a ping") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond to !!! with timeout" in {
|
|
||||||
expect("error handler") {
|
|
||||||
server !!! (OneWay, "error handler")
|
|
||||||
}
|
|
||||||
expect("got a oneway") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond to !!! and return future with timeout" in {
|
|
||||||
val future = server !! Ping
|
|
||||||
future.receiveWithin(100) match {
|
|
||||||
case None => fail("timed out") // timed out
|
|
||||||
case Some(reply) =>
|
|
||||||
expect("got a ping") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
assert("pong" === reply)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond to !!! and return future with timeout" in {
|
|
||||||
val future = server !! OneWay
|
|
||||||
future.receiveWithin(100) match {
|
|
||||||
case None =>
|
|
||||||
expect("got a oneway") {
|
|
||||||
inner.log
|
|
||||||
}
|
|
||||||
case Some(reply) =>
|
|
||||||
fail("expected a timeout, got Some(reply)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond do hotswap" in {
|
|
||||||
// using base
|
|
||||||
expect("pong") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
// hotswapping
|
|
||||||
server.hotswap(Some({
|
|
||||||
case Ping => reply("hotswapped pong")
|
|
||||||
}))
|
|
||||||
expect("hotswapped pong") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond do double hotswap" in {
|
|
||||||
// using base
|
|
||||||
expect("pong") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
// hotswapping
|
|
||||||
server.hotswap(Some({
|
|
||||||
case Ping => reply("hotswapped pong")
|
|
||||||
}))
|
|
||||||
expect("hotswapped pong") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
// hotswapping again
|
|
||||||
server.hotswap(Some({
|
|
||||||
case Ping => reply("hotswapped pong again")
|
|
||||||
}))
|
|
||||||
expect("hotswapped pong again") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"server respond do hotswap and then revert" in {
|
|
||||||
// using base
|
|
||||||
expect("pong") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
// hotswapping
|
|
||||||
server.hotswap(Some({
|
|
||||||
case Ping => reply("hotswapped pong")
|
|
||||||
}))
|
|
||||||
expect("hotswapped pong") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
// restoring original base
|
|
||||||
server.hotswap(None)
|
|
||||||
expect("pong") {
|
|
||||||
(server !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class GenericServerContainerActor extends GenericServer {
|
|
||||||
var log = ""
|
|
||||||
|
|
||||||
override def body: PartialFunction[Any, Unit] = {
|
|
||||||
case Ping =>
|
|
||||||
log = "got a ping"
|
|
||||||
reply("pong")
|
|
||||||
|
|
||||||
case OneWay =>
|
|
||||||
log = "got a oneway"
|
|
||||||
}
|
|
||||||
|
|
||||||
override def init(config: AnyRef) = log = "initializing: " + config
|
|
||||||
override def shutdown(reason: AnyRef) = log = "terminating: " + reason
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.scalablesolutions.akka.supervisor
|
|
||||||
|
|
||||||
import org.specs.runner.JUnit4
|
|
||||||
import org.specs.Specification
|
|
||||||
|
|
||||||
import scala.actors._
|
|
||||||
import scala.actors.Actor._
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class GenericServerTest extends JUnit4(genericServerSpec) // for JUnit4 and Maven
|
|
||||||
object genericServerSpec extends Specification {
|
|
||||||
|
|
||||||
"server should respond to a regular message" in {
|
|
||||||
val server = new TestGenericServerActor
|
|
||||||
server.start
|
|
||||||
server !? Ping match {
|
|
||||||
case reply: String =>
|
|
||||||
assert("got a ping" === server.log)
|
|
||||||
assert("pong" === reply)
|
|
||||||
case _ => fail()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class TestGenericServerActor extends GenericServer {
|
|
||||||
var log: String = ""
|
|
||||||
|
|
||||||
override def body: PartialFunction[Any, Unit] = {
|
|
||||||
case Ping =>
|
|
||||||
log = "got a ping"
|
|
||||||
reply("pong")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.scalablesolutions.akka.supervisor
|
|
||||||
|
|
||||||
sealed abstract class TestMessage
|
|
||||||
case object Ping extends TestMessage
|
|
||||||
case object Pong extends TestMessage
|
|
||||||
case object OneWay extends TestMessage
|
|
||||||
case object Die extends TestMessage
|
|
||||||
case object NotifySupervisorExit extends TestMessage
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.scalablesolutions.akka.supervisor
|
|
||||||
|
|
||||||
import org.specs.runner.JUnit4
|
|
||||||
import org.specs.Specification
|
|
||||||
|
|
||||||
import scala.actors._
|
|
||||||
import scala.actors.Actor._
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class SupervisorStateTest extends JUnit4(supervisorStateSpec) // for JUnit4 and Maven
|
|
||||||
object supervisorStateSpec extends Specification {
|
|
||||||
val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }}
|
|
||||||
val newDummyActor = () => dummyActor
|
|
||||||
var state: SupervisorState = _
|
|
||||||
var proxy: GenericServerContainer = _
|
|
||||||
var supervisor: Supervisor = _
|
|
||||||
|
|
||||||
proxy = new GenericServerContainer("server1", newDummyActor)
|
|
||||||
object factory extends SupervisorFactory {
|
|
||||||
override def getSupervisorConfig: SupervisorConfig = {
|
|
||||||
SupervisorConfig(
|
|
||||||
RestartStrategy(AllForOne, 3, 100),
|
|
||||||
Worker(
|
|
||||||
proxy,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
:: Nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
supervisor = factory.newSupervisor
|
|
||||||
state = new SupervisorState(supervisor, new AllForOneStrategy(3, 100))
|
|
||||||
|
|
||||||
"supervisor state should return added server" in {
|
|
||||||
state.addServerContainer(proxy)
|
|
||||||
state.getServerContainer("server1") match {
|
|
||||||
case None => fail("should have returned server")
|
|
||||||
case Some(server) =>
|
|
||||||
assert(server != null)
|
|
||||||
assert(server.isInstanceOf[GenericServerContainer])
|
|
||||||
assert(proxy === server)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"supervisor state should remove added server" in {
|
|
||||||
state.addServerContainer(proxy)
|
|
||||||
|
|
||||||
state.removeServerContainer("server1")
|
|
||||||
state.getServerContainer("server1") match {
|
|
||||||
case Some(_) => fail("should have returned None")
|
|
||||||
case None =>
|
|
||||||
}
|
|
||||||
state.getServerContainer("dummyActor") match {
|
|
||||||
case Some(_) => fail("should have returned None")
|
|
||||||
case None =>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"supervisor state should fail getting non-existent server by symbol" in {
|
|
||||||
state.getServerContainer("server2") match {
|
|
||||||
case Some(_) => fail("should have returned None")
|
|
||||||
case None =>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"supervisor state should fail getting non-existent server by actor" in {
|
|
||||||
state.getServerContainer("dummyActor") match {
|
|
||||||
case Some(_) => fail("should have returned None")
|
|
||||||
case None =>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,434 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009 Scalable Solutions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.scalablesolutions.akka.supervisor
|
|
||||||
|
|
||||||
import org.specs.runner.JUnit4
|
|
||||||
import org.specs.Specification
|
|
||||||
|
|
||||||
import scala.actors._
|
|
||||||
import scala.actors.Actor._
|
|
||||||
import scala.collection.Map
|
|
||||||
import scala.collection.mutable.HashMap
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
class SupervisorTest extends JUnit4(supervisorSpec) // for JUnit4 and Maven
|
|
||||||
object supervisorSpec extends Specification {
|
|
||||||
|
|
||||||
var messageLog: String = ""
|
|
||||||
val pingpong1 = new GenericServerContainer("pingpong1", () => new PingPong1Actor)
|
|
||||||
val pingpong2 = new GenericServerContainer("pingpong2", () => new PingPong2Actor)
|
|
||||||
val pingpong3 = new GenericServerContainer("pingpong3", () => new PingPong3Actor)
|
|
||||||
|
|
||||||
pingpong1.setTimeout(100)
|
|
||||||
pingpong2.setTimeout(100)
|
|
||||||
pingpong3.setTimeout(100)
|
|
||||||
|
|
||||||
@BeforeMethod
|
|
||||||
def setup = messageLog = ""
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"starting supervisor should start the servers" in {
|
|
||||||
val sup = getSingleActorAllForOneSupervisor
|
|
||||||
sup ! Start
|
|
||||||
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong1 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"started supervisor should be able to return started servers" in {
|
|
||||||
val sup = getSingleActorAllForOneSupervisor
|
|
||||||
sup ! Start
|
|
||||||
val server = sup.getServerOrElse("pingpong1", throw new RuntimeException("server not found"))
|
|
||||||
assert(server.isInstanceOf[GenericServerContainer])
|
|
||||||
assert(server === pingpong1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"started supervisor should fail returning non-existing server" in {
|
|
||||||
val sup = getSingleActorAllForOneSupervisor
|
|
||||||
sup ! Start
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
sup.getServerOrElse("wrong_name", throw new RuntimeException("server not found"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"supervisor should restart killed server with restart strategy one_for_one" in {
|
|
||||||
val sup = getSingleActorOneForOneSupervisor
|
|
||||||
sup ! Start
|
|
||||||
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("oneforone") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"supervisor should restart used killed server with restart strategy one_for_one" in {
|
|
||||||
val sup = getSingleActorOneForOneSupervisor
|
|
||||||
sup ! Start
|
|
||||||
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong1 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("ping") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingoneforone") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong1 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingoneforoneping") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"supervisor should restart killed server with restart strategy all_for_one" in {
|
|
||||||
val sup = getSingleActorAllForOneSupervisor
|
|
||||||
sup ! Start
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("allforone") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"supervisor should restart used killed server with restart strategy all_for_one" in {
|
|
||||||
val sup = getSingleActorAllForOneSupervisor
|
|
||||||
sup ! Start
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong1 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("ping") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingallforone") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong1 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingallforoneping") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"supervisor should restart killed multiple servers with restart strategy one_for_one" in {
|
|
||||||
val sup = getMultipleActorsOneForOneConf
|
|
||||||
sup ! Start
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
pingpong3 !!! (Die, throw new RuntimeException("TIME OUT"))
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("oneforone") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"supervisor should restart killed multiple servers with restart strategy one_for_one" in {
|
|
||||||
val sup = getMultipleActorsOneForOneConf
|
|
||||||
sup ! Start
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong1 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong2 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong3 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingpingping") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingpingpingoneforone") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong1 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong2 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong3 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingpingpingoneforonepingpingping") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"supervisor should restart killed muliple servers with restart strategy all_for_one" in {
|
|
||||||
val sup = getMultipleActorsAllForOneConf
|
|
||||||
sup ! Start
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("allforoneallforoneallforone") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===========================================
|
|
||||||
"supervisor should restart killed muliple servers with restart strategy all_for_one" in {
|
|
||||||
val sup = getMultipleActorsAllForOneConf
|
|
||||||
sup ! Start
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong1 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong2 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong3 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingpingping") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingpingpingallforoneallforoneallforone") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong1 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong2 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pong") {
|
|
||||||
(pingpong3 !!! Ping).getOrElse("nil")
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("pingpingpingallforoneallforoneallforonepingpingping") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"supervisor should restart killed first-level server with restart strategy all_for_one" in {
|
|
||||||
val sup = getNestedSupervisorsAllForOneConf
|
|
||||||
sup ! Start
|
|
||||||
intercept(classOf[RuntimeException]) {
|
|
||||||
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
|
|
||||||
}
|
|
||||||
Thread.sleep(100)
|
|
||||||
expect("allforoneallforoneallforone") {
|
|
||||||
messageLog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
// Creat some supervisors with different configurations
|
|
||||||
|
|
||||||
def getSingleActorAllForOneSupervisor: Supervisor = {
|
|
||||||
|
|
||||||
// Create an abstract SupervisorContainer that works for all implementations
|
|
||||||
// of the different Actors (Services).
|
|
||||||
//
|
|
||||||
// Then create a concrete container in which we mix in support for the specific
|
|
||||||
// implementation of the Actors we want to use.
|
|
||||||
|
|
||||||
object factory extends TestSupervisorFactory {
|
|
||||||
override def getSupervisorConfig: SupervisorConfig = {
|
|
||||||
SupervisorConfig(
|
|
||||||
RestartStrategy(AllForOne, 3, 100),
|
|
||||||
Worker(
|
|
||||||
pingpong1,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
:: Nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
factory.newSupervisor
|
|
||||||
}
|
|
||||||
|
|
||||||
def getSingleActorOneForOneSupervisor: Supervisor = {
|
|
||||||
object factory extends TestSupervisorFactory {
|
|
||||||
override def getSupervisorConfig: SupervisorConfig = {
|
|
||||||
SupervisorConfig(
|
|
||||||
RestartStrategy(OneForOne, 3, 100),
|
|
||||||
Worker(
|
|
||||||
pingpong1,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
:: Nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
factory.newSupervisor
|
|
||||||
}
|
|
||||||
|
|
||||||
def getMultipleActorsAllForOneConf: Supervisor = {
|
|
||||||
object factory extends TestSupervisorFactory {
|
|
||||||
override def getSupervisorConfig: SupervisorConfig = {
|
|
||||||
SupervisorConfig(
|
|
||||||
RestartStrategy(AllForOne, 3, 100),
|
|
||||||
Worker(
|
|
||||||
pingpong1,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
::
|
|
||||||
Worker(
|
|
||||||
pingpong2,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
::
|
|
||||||
Worker(
|
|
||||||
pingpong3,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
:: Nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
factory.newSupervisor
|
|
||||||
}
|
|
||||||
|
|
||||||
def getMultipleActorsOneForOneConf: Supervisor = {
|
|
||||||
object factory extends TestSupervisorFactory {
|
|
||||||
override def getSupervisorConfig: SupervisorConfig = {
|
|
||||||
SupervisorConfig(
|
|
||||||
RestartStrategy(OneForOne, 3, 100),
|
|
||||||
Worker(
|
|
||||||
pingpong1,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
::
|
|
||||||
Worker(
|
|
||||||
pingpong2,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
::
|
|
||||||
Worker(
|
|
||||||
pingpong3,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
:: Nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
factory.newSupervisor
|
|
||||||
}
|
|
||||||
|
|
||||||
def getNestedSupervisorsAllForOneConf: Supervisor = {
|
|
||||||
object factory extends TestSupervisorFactory {
|
|
||||||
override def getSupervisorConfig: SupervisorConfig = {
|
|
||||||
SupervisorConfig(
|
|
||||||
RestartStrategy(AllForOne, 3, 100),
|
|
||||||
Worker(
|
|
||||||
pingpong1,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
::
|
|
||||||
SupervisorConfig(
|
|
||||||
RestartStrategy(AllForOne, 3, 100),
|
|
||||||
Worker(
|
|
||||||
pingpong2,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
::
|
|
||||||
Worker(
|
|
||||||
pingpong3,
|
|
||||||
LifeCycle(Permanent, 100))
|
|
||||||
:: Nil)
|
|
||||||
:: Nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
factory.newSupervisor
|
|
||||||
}
|
|
||||||
|
|
||||||
class PingPong1Actor extends GenericServer {
|
|
||||||
override def body: PartialFunction[Any, Unit] = {
|
|
||||||
case Ping =>
|
|
||||||
messageLog += "ping"
|
|
||||||
reply("pong")
|
|
||||||
case Die =>
|
|
||||||
throw new RuntimeException("Recieved Die message")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class PingPong2Actor extends GenericServer {
|
|
||||||
override def body: PartialFunction[Any, Unit] = {
|
|
||||||
case Ping =>
|
|
||||||
messageLog += "ping"
|
|
||||||
reply("pong")
|
|
||||||
case Die =>
|
|
||||||
throw new RuntimeException("Recieved Die message")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class PingPong3Actor extends GenericServer {
|
|
||||||
override def body: PartialFunction[Any, Unit] = {
|
|
||||||
case Ping =>
|
|
||||||
messageLog += "ping"
|
|
||||||
reply("pong")
|
|
||||||
case Die =>
|
|
||||||
throw new RuntimeException("Recieved Die message")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================
|
|
||||||
|
|
||||||
class TestAllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends AllForOneStrategy(maxNrOfRetries, withinTimeRange) {
|
|
||||||
override def postRestart(serverContainer: GenericServerContainer) = {
|
|
||||||
messageLog += "allforone"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class TestOneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends OneForOneStrategy(maxNrOfRetries, withinTimeRange) {
|
|
||||||
override def postRestart(serverContainer: GenericServerContainer) = {
|
|
||||||
messageLog += "oneforone"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class TestSupervisorFactory extends SupervisorFactory {
|
|
||||||
override def create(strategy: RestartStrategy): Supervisor = strategy match {
|
|
||||||
case RestartStrategy(scheme, maxNrOfRetries, timeRange) =>
|
|
||||||
scheme match {
|
|
||||||
case AllForOne => new Supervisor(new TestAllForOneStrategy(maxNrOfRetries, timeRange))
|
|
||||||
case OneForOne => new Supervisor(new TestOneForOneStrategy(maxNrOfRetries, timeRange))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue