diff --git a/akka-core/pom.xml b/akka-core/pom.xml deleted file mode 100644 index b9753200c8..0000000000 --- a/akka-core/pom.xml +++ /dev/null @@ -1,127 +0,0 @@ - - 4.0.0 - - akka-core - Akka Core - Actors, Remote Actors, Transactors and STM Module - - jar - - - akka - se.scalablesolutions.akka - 0.7-SNAPSHOT - - - - - - akka-util-java - ${project.groupId} - ${project.version} - - - akka-util - ${project.groupId} - ${project.version} - - - org.scala-lang - scala-library - ${scala.version} - - - org.codehaus.aspectwerkz - aspectwerkz-nodeps-jdk5 - 2.1 - - - org.codehaus.aspectwerkz - aspectwerkz-jdk5 - 2.1 - - - org.jboss.netty - netty - 3.2.0.ALPHA3 - - - org.scala-tools - javautils - 2.7.4-0.1 - - - - - voldemort.store.compress - h2-lzf - 1.0 - - - org.codehaus.jackson - jackson-core-asl - 1.2.1 - - - org.codehaus.jackson - jackson-mapper-asl - 1.2.1 - - - sbinary - sbinary - 0.3 - - - net.databinder - dispatch-json_2.7.7 - 0.6.4 - - - commons-io - commons-io - 1.4 - - - net.databinder - dispatch-http_2.7.7 - 0.6.4 - - - sjson.json - sjson - 0.4 - - - - - org.scalatest - scalatest - 1.0 - test - - - junit - junit - 4.5 - test - - - - - - - org.apache.felix - maven-bundle-plugin - - - - se.scalablesolutions.akka.*;version=${project.version};-split-package:=merge-first - - - - - - - diff --git a/akka-core/src/test/scala/SchedulerSpec.scala b/akka-core/src/test/scala/SchedulerSpec.scala index 0fe7c45ea5..08be87d728 100644 --- a/akka-core/src/test/scala/SchedulerSpec.scala +++ b/akka-core/src/test/scala/SchedulerSpec.scala @@ -3,11 +3,20 @@ package se.scalablesolutions.akka.actor import org.scalatest.junit.JUnitSuite import Actor._ import java.util.concurrent.{CountDownLatch, TimeUnit} -import org.junit.{After, Test} +import se.scalablesolutions.akka.config.ScalaConfig._ +import org.multiverse.api.latches.StandardLatch +import org.junit.Test class SchedulerSpec extends JUnitSuite { - @Test def schedulerShouldScheduleMoreThanOnce = { + def withCleanEndState(action: => Unit) { + action + Scheduler.restart + ActorRegistry.shutdownAll + } + + + @Test def schedulerShouldScheduleMoreThanOnce = withCleanEndState { case object Tick val countDownLatch = new CountDownLatch(3) @@ -21,7 +30,7 @@ class SchedulerSpec extends JUnitSuite { assert(countDownLatch.await(1, TimeUnit.SECONDS)) } - @Test def schedulerShouldScheduleOnce = { + @Test def schedulerShouldScheduleOnce = withCleanEndState { case object Tick val countDownLatch = new CountDownLatch(2) val tickActor = actor { @@ -35,4 +44,44 @@ class SchedulerSpec extends JUnitSuite { // should still be 1 left assert(countDownLatch.getCount == 1) } + + /** + * ticket #307 + */ + @Test def actorRestartShouldPickUpScheduleAgain = withCleanEndState { + + object Ping + object Crash + + val restartLatch = new StandardLatch + val pingLatch = new CountDownLatch(6) + + val actor = actorOf(new Actor { + self.lifeCycle = Some(LifeCycle(Permanent)) + + def receive = { + case Ping => pingLatch.countDown + case Crash => throw new Exception("CRASH") + } + + override def postRestart(reason: Throwable) = restartLatch.open + }) + + Supervisor( + SupervisorConfig( + RestartStrategy(AllForOne, 3, 1000, + List(classOf[Exception])), + Supervise( + actor, + LifeCycle(Permanent)) + :: Nil)).start + + Scheduler.schedule(actor, Ping, 500, 500, TimeUnit.MILLISECONDS) + // appx 2 pings before crash + Scheduler.scheduleOnce(actor, Crash, 1000, TimeUnit.MILLISECONDS) + + assert(restartLatch.tryAwait(2, TimeUnit.SECONDS)) + // should be enough time for the ping countdown to recover and reach 6 pings + assert(pingLatch.await(4, TimeUnit.SECONDS)) + } } diff --git a/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala b/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala index d5581b373b..950165567d 100644 --- a/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala +++ b/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala @@ -78,10 +78,8 @@ private[akka] object MongoStorageBackend extends val o = dbo.get(VALUE).asInstanceOf[Map[AnyRef, AnyRef]] o.putAll(m) - // remove existing reference - removeMapStorageFor(name) - // and insert - coll.insert(new BasicDBObject().append(KEY, name).append(VALUE, o)) + val newdbo = new BasicDBObject().append(KEY, name).append(VALUE, o) + coll.update(new BasicDBObject().append(KEY, name), newdbo, true, false) } } } diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 505800a66d..7af21abe06 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -167,7 +167,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val log4j = "log4j" % "log4j" % "1.2.15" % "compile" - lazy val mongo = "org.mongodb" % "mongo-java-driver" % "1.4" % "compile" + lazy val mongo = "org.mongodb" % "mongo-java-driver" % "2.0" % "compile" lazy val multiverse = "org.multiverse" % "multiverse-alpha" % MULTIVERSE_VERSION % "compile" intransitive diff --git a/project/build/AkkaWrappersProject.scala b/project/build/AkkaWrappersProject.scala deleted file mode 100644 index f92e91d191..0000000000 --- a/project/build/AkkaWrappersProject.scala +++ /dev/null @@ -1,88 +0,0 @@ - /*---------------------------------------------------------------------------\ -| Copyright (C) 2009-2010 Scalable Solutions AB | -\---------------------------------------------------------------------------*/ - -import sbt._ -import sbt.CompileOrder._ -import spde._ - -import java.util.jar.Attributes -import java.util.jar.Attributes.Name._ -import java.io.File - -import com.weiglewilczek.bnd4sbt._ - -trait AkkaWrappersProject extends DefaultProject { - - // ------------------------------------------------------------ - // project versions - val JERSEY_VERSION:String - val ATMO_VERSION:String - val CASSANDRA_VERSION:String - val LIFT_VERSION:String - val SCALATEST_VERSION:String - val MULTIVERSE_VERSION:String - - // OSGi wrappers - lazy val akka_wrappers = project("akka-wrap", "akka-wrap", new AkkaWrappersParentProject(_)) - - import Process._ - lazy val publishLocalMvnWrapped = runMvnInstallWrapped - def runMvnInstallWrapped = task { - for (absPath <- wrappedArtifacts.getPaths) { - val artifactRE = """.*/([^/]+)-([^-]+).jar""".r - val artifactRE(artifactId, artifactVersion) = absPath - val command = "mvn install:install-file" + - " -Dfile=" + absPath + - " -DgroupId=se.scalablesolutions.akka.akka-wrap" + - " -DartifactId=" + artifactId + - " -Dversion=" + artifactVersion + - " -Dpackaging=jar -DgeneratePom=true" - command ! log - } - None - } dependsOn(`package`) describedAs("Run mvn install for wrapped artifacts in akka-wrap.") - - // ================= OSGi Wrappers ================== - class JgroupsWrapperProject(info: ProjectInfo) extends OSGiWrapperProject(info) { - override def wrappedVersion = "2.9.0.GA" - override def bndImportPackage = Seq("org.testng.*;resolution:=optional", - "org.bouncycastle.jce.provider;resolution:=optional", - "bsh;resolution:=optional", - "*") - - val jgroups = "jgroups" % "jgroups" % wrappedVersion % "compile" - } - - class DispatchJsonWrapperProject(info: ProjectInfo) extends OSGiWrapperProject(info) { - override def wrappedVersion = "0.7.4" - - val dispatch_json = "net.databinder" % "dispatch-json_2.8.0.RC3" % wrappedVersion % "compile" - } - - class MultiverseWrapperProject(info: ProjectInfo) extends OSGiWrapperProject(info) { - override def wrappedVersion = "0.5.2" - - val multiverse = "org.multiverse" % "multiverse-alpha" % wrappedVersion % "compile" - } - - class AkkaWrappersParentProject(info: ProjectInfo) extends ParentProject(info) { - lazy val jgroups_wrapper = project("jgroups-wrapper", "jgroups-wrapper", - new JgroupsWrapperProject(_)) - lazy val dispath_json = project("dispatch-json", "dispatch-json", - new DispatchJsonWrapperProject(_)) - lazy val multiverse_wrapper = project("multiverse-wrapper", "multiverse-wrapper", - new MultiverseWrapperProject(_)) - } - - def wrappedArtifacts = descendents(info.projectPath / "akka-wrap", "*" + buildScalaVersion + "_osgi-" + "*.jar") - - abstract class OSGiWrapperProject(info: ProjectInfo) extends DefaultProject(info) with BNDPlugin { - def wrappedVersion:String - override def version = OpaqueVersion(wrappedVersion) - override def artifactID = moduleID + "_osgi" - override def bndExportPackage = Seq("*") - } - - -}