12

Is there any way to combine akka 2.3 and play 2.2? For now I'm getting AbstractMethodError while running such application. I need to have them both in one app because Akka 2.3 comes with very useful akka persistence module which is very reliable(in opposition to it's predecessor) and such reliability is really important in my case. I've tried compiling play 2.2.2 from sources and changing akka dependency there to 2.3 but i still get the same error:

[ERROR] [04/01/2014 09:42:26.105] [play-akka.actor.default-dispatcher-6] [ActorSystem(play)] Uncaught error from thread [play-akka.actor.default-dispatcher-6] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled
 java.lang.AbstractMethodError
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
    at akka.actor.ActorCell.invoke(ActorCell.scala:487)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
    at akka.dispatch.Mailbox.run(Mailbox.scala:220)
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Jacek Laskowski
  • 72,696
  • 27
  • 242
  • 420
user2963977
  • 572
  • 5
  • 17
  • 1
    "akka persistence module which is very reliable (in opposition to it's predecessor)" ... I'm curious what is unreliable. – Paul Draper Apr 01 '14 at 08:04
  • as far as I understand both of mentioned features akka persistence will try to process message until it's removed from journal. For example when jvm will crash during processing message akka persistence will process that message again if it's not removed from journal while durable mailboxes won't. – user2963977 Apr 01 '14 at 08:09
  • 3
    No, durable mailboxes are strictly less useful than Akka Persistence, since the latter solves the problem of persisting state while the former only makes a best effort to get the message to the recipient (there is no safe hand-off into the mailbox, for example). – Roland Kuhn Apr 02 '14 at 07:49

2 Answers2

9

Akka 2.3 and Play 2.2 are just binary incompatible that means that you can compile Play 2.2 with Akka 2.3 as dependency and publish it to your local ivy or company repository.

In my case no AbstractMethodError occurred with the patched Play version. Try to patch Play this way:

  1. Checkout the source code of a tagged Play version, e.g., https://github.com/playframework/playframework/releases/tag/2.2.2
  2. Switch into the framework folder (that's the sbt project with the project subdirectory)
  3. Change the version number of Play and Akka dependency, e.g., https://github.com/schleichardt/Play20/commit/14b45c44924ce5b3ef2159c772bc5b0544c94658
  4. sbt publishLocal or sbt publish, for the latter you need to adjust publishing{Ivy,Maven}Repository and publishMavenStyle := true in framework/project/Build.scala
  5. (optional) Unless you've published the patch version of Play to your local Ivy repository (using publishLocal), you need to add a resolver to build.sbt and project/plugins.sbt
  6. In project/plugins.sbt set the patched Play sbt plugin, e.g., addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.2-akka-2.3.1")

A demo is in https://github.com/schleichardt/event-sourcing-with-the-play-framework/tree/bf171720c43a1349555726cb11cffae4d967cc4b. The source code for the patched Play version is in https://github.com/schleichardt/Play20/tree/2.2.2-akka-2.3.1.

Refer also to https://stackoverflow.com/a/22651261/1575096 for problems with an Akka 2.3 compiled Play, Jeff May was not able to use the WS library.

Keep in mind that other libraries, for example ReactiveMongo with Play iteratees, may also depend on Play libraries and may load the unpatched version into the class path. In that case something like "group" %% "library" % "version" exclude("com.typesafe.play", "play") would help. In case of ReactiveMongo you need to compile it for Akka 2.3, too.

With sbt 'show libraryDependencies' you can inspect the actual dependencies and their versions.

Community
  • 1
  • 1
Schleichardt
  • 7,502
  • 1
  • 27
  • 37
6

Unfortunately you will have to wait for the Play team to publish a release that is compatible with Akka 2.3, or ask on their mailing list for instructions on how to properly build a Play distribution (since it seems that you didn’t actually use your rebuilt JARs).

Roland Kuhn
  • 15,412
  • 2
  • 36
  • 45