Playframework 如何使用Akka 2.3.x运行Play 2.2.x?

Playframework 如何使用Akka 2.3.x运行Play 2.2.x?,playframework,akka,playframework-2.2,akka-persistence,Playframework,Akka,Playframework 2.2,Akka Persistence,有没有办法把akka 2.3和play 2.2结合起来?目前,我在运行这样的应用程序时遇到AbstractMethodError。我需要将它们都放在一个应用程序中,因为Akka 2.3附带了非常有用的Akka持久化模块,它非常可靠(与它的前身相反),这种可靠性在我的例子中非常重要。我曾尝试从源代码处编译play 2.2.2,并将akka依赖项更改为2.3,但仍然出现相同的错误: [ERROR] [04/01/2014 09:42:26.105] [play-akka.actor.default-

有没有办法把akka 2.3和play 2.2结合起来?目前,我在运行这样的应用程序时遇到AbstractMethodError。我需要将它们都放在一个应用程序中,因为Akka 2.3附带了非常有用的Akka持久化模块,它非常可靠(与它的前身相反),这种可靠性在我的例子中非常重要。我曾尝试从源代码处编译play 2.2.2,并将akka依赖项更改为2.3,但仍然出现相同的错误:

[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)

不幸的是,您必须等待游戏团队发布与Akka 2.3兼容的版本,或者在他们的邮件列表上询问如何正确构建游戏发行版的说明(因为您似乎没有实际使用重建的JAR).

Akka 2.3和Play 2.2只是二进制不兼容,这意味着您可以使用Akka 2.3作为依赖项编译Play 2.2,并将其发布到本地常春藤或公司存储库

在我的情况下,修补后的播放版本没有发生AbstractMethodError错误。尝试通过以下方式进行修补:

  • 签出已标记播放版本的源代码,例如
  • 切换到
    framework
    文件夹(这是包含
    project
    子目录的sbt项目)
  • 更改播放和Akka依赖项的版本号,例如
  • sbt publishLocal
    sbt publish
    ,对于后者,您需要在
    framework/project/Build.scala
  • (可选)除非您已将Play的补丁版本发布到本地常春藤存储库(使用
    publishLocal
    ),否则您需要向
    build.sbt
    project/plugins.sbt
  • project/plugins.sbt
    中设置打补丁的播放sbt插件,例如
    addSbtPlugin(“com.typesafe.Play“%”sbt plugin“%”2.2.2-akka-2.3.1”)
  • 演示正在进行中。已修补播放版本的源代码位于中

    关于Akka 2.3编译剧本的问题,请参阅,Jeff May无法使用WS-library

    请记住,其他库(例如带有Play iteratees的ReactiveMongo)也可能依赖于Play库,并且可能会将未修补的版本加载到类路径中。 在这种情况下,类似于
    “组”%%“库”%%“版本”排除(“com.typesafe.play”、“play”)
    的内容会有所帮助。如果是ReactiveMongo,您也需要为Akka 2.3编译它


    使用
    sbt“show Library dependencies”
    可以检查实际的依赖项及其版本。

    “akka持久化模块非常可靠(与它的前身相反)”。。。我很好奇什么是不可靠的。据我所知,akka persistence将尝试处理消息,直到消息从日志中删除。例如,当jvm在处理消息过程中崩溃时,如果消息未从日志中删除,akka persistence将再次处理该消息,而持久邮箱则不会。不,持久邮箱严格来说不如akka persistence有用,因为后者解决了持久化状态的问题,而前者只尽最大努力将消息发送给收件人(例如,没有安全的邮箱切换)。