Playframework 如何使用Akka 2.3.x运行Play 2.2.x?
有没有办法把akka 2.3和play 2.2结合起来?目前,我在运行这样的应用程序时遇到AbstractMethodError。我需要将它们都放在一个应用程序中,因为Akka 2.3附带了非常有用的Akka持久化模块,它非常可靠(与它的前身相反),这种可靠性在我的例子中非常重要。我曾尝试从源代码处编译play 2.2.2,并将akka依赖项更改为2.3,但仍然出现相同的错误: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-
[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项目)sbt publishLocal
或sbt publish
,对于后者,您需要在framework/project/Build.scala
publishLocal
),否则您需要向build.sbt
和project/plugins.sbt
project/plugins.sbt
中设置打补丁的播放sbt插件,例如addSbtPlugin(“com.typesafe.Play“%”sbt plugin“%”2.2.2-akka-2.3.1”)
“组”%%“库”%%“版本”排除(“com.typesafe.play”、“play”)
的内容会有所帮助。如果是ReactiveMongo,您也需要为Akka 2.3编译它
使用
sbt“show Library dependencies”
可以检查实际的依赖项及其版本。“akka持久化模块非常可靠(与它的前身相反)”。。。我很好奇什么是不可靠的。据我所知,akka persistence将尝试处理消息,直到消息从日志中删除。例如,当jvm在处理消息过程中崩溃时,如果消息未从日志中删除,akka persistence将再次处理该消息,而持久邮箱则不会。不,持久邮箱严格来说不如akka persistence有用,因为后者解决了持久化状态的问题,而前者只尽最大努力将消息发送给收件人(例如,没有安全的邮箱切换)。