2014-04-01 79 views
12

有沒有什麼方法可以將akka 2.3和play 2.2結合?現在,我在運行此類應用程序時遇到AbstractMethodError。我需要將它們放在一個應用程序中,因爲Akka 2.3帶有非常有用的akka​​持久性模塊,非常可靠(與其前身相反),這種可靠性對我而言非常重要。我試過編譯來源戲2.2.2和不斷變化的阿卡依賴有2.3,但我仍然得到同樣的錯誤:如何使用Akka 2.3.x運行Play 2.2.x?

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

「非常可靠的akka​​持久性模塊(反對它的前身)」......我很好奇什麼是不可靠的。 –

+0

就我所瞭解的兩個提到的功能而言,akka持久性將嘗試處理消息,直到它從日誌中刪除。例如,當jvm在處理消息期間崩潰時,akka持久性將再次處理該消息,如果它未從日記中刪除,而持久郵箱不會。 – user2963977

+3

不,耐用郵箱的使用嚴格不如Akka持久性,因爲後者解決了持續狀態的問題,而前者只會盡最大努力將郵件發送給收件人(郵箱中沒有安全的手動轉移,例)。 –

回答

6

不幸的是,你將不得不等待遊戲團隊發佈一份新聞稿中說是兼容與Akka 2.3,或者在他們的郵件列表上詢問如何正確構建Play分發(因爲您似乎沒有真正使用重建的JAR)。

9

Akka 2.3和Play 2.2只是二進制不兼容的,這意味着您可以將Play 2.2與Akka 2.3編譯爲依賴關係,並將其發佈到您當地的常春藤或公司存儲庫。

在我的情況下,修補後的Play版本沒有發生AbstractMethodError。嘗試補丁這樣玩:

  1. 結帳的標記播放版本的源代碼,例如,https://github.com/playframework/playframework/releases/tag/2.2.2
  2. 切換到framework文件夾(這是與project子目錄中的SBT項目)
  3. 更改版本播放和阿卡的依賴,例如數量,https://github.com/schleichardt/Play20/commit/14b45c44924ce5b3ef2159c772bc5b0544c94658
  4. sbt publishLocalsbt publish,後者則需要調整出版{常春藤,Maven的}庫和publishMavenStyle := trueframework/project/Build.scala
  5. (可選),除非你已經發布(使用publishLocal),你需要一個解析器添加到build.sbtproject/plugins.sbt
  6. project/plugins.sbt設置修補播放SBT插件,例如,addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.2-akka-2.3.1")遊戲的補丁版本到本地常春藤庫

演示在https://github.com/schleichardt/event-sourcing-with-the-play-framework/tree/bf171720c43a1349555726cb11cffae4d967cc4b。修補後的Play版本的源代碼位於https://github.com/schleichardt/Play20/tree/2.2.2-akka-2.3.1

對於Akka 2.3已編譯Play的問題,還請參閱https://stackoverflow.com/a/22651261/1575096,Jeff May無法使用WS庫。

請記住,其他庫(例如ReactiveMongo with Play iteratees)也可能依賴於Play庫,並可能將未打補丁的版本加載到類路徑中。 在這種情況下,像"group" %% "library" % "version" exclude("com.typesafe.play", "play")會有所幫助。在ReactiveMongo的情況下,您也需要爲Akka 2.3進行編譯。

With sbt 'show libraryDependencies'您可以檢查實際的依賴關係及其版本。