PlayFramework 1.2.x的EventBus实现

时间:2012-02-16 16:51:09

标签: events event-handling playframework persistence publish-subscribe

随着我的Play 1.2.x项目的增长,我发现自己在这里添加了一些东西 在做某些事情(持久对象等)时,我的代码变得非常混乱。 我认为处理这类用例的最佳方法是使用Eventbus ..但是哪一个? 那里有

可能还有一些......

我已经看到Play 2.x能够使用akka 2.0事件总线......但由于scala插件仍在使用旧的sbt / scala版本,我无法使用Akka 2播放1.2.x

我很高兴看到您在Play项目中使用的消息总线。 还请解释您的解决方案如何处理持久性操作,例如如何从侦听器使用JPA Session。

谢谢, 多米尼克

2 个答案:

答案 0 :(得分:2)

你还在考虑将AKKA与Play 1.2集成吗?我刚刚完成了与Play 1.2.5的集成。我查看了AKKA的模块,但它已经过时了,所以我决定自己整合AKKA。

这里有一些非常简单的基本步骤:

  • 在您的dependencies.yml文件中包含行

    com.typesafe.akka -> akka-actor_2.10 2.1.0 // this was the latest version at time of writing

  • 从命令行执行播放代码,将相关库下载到您的lib文件夹中

  • 做一些IDE的好处来获取库依赖项 在conf目录中设置一个reference.conf文件(这将包含启动时akka的配置信息) - 请查看:http://doc.akka.io/docs/akka/2.1.0/general/configuration.html
  • "-Dconfig.file=reference.conf"添加到您的VM选项
  • 在AkkaSystem中加载一个静态类AppContext或类似的东西 - 这只是为了你创建一次并且可以从任何地方引用。
  • 使用以下命令加载AKKA系统:

    Config config = ConfigFactory.load();
    public static final notificationSystem = ActorSystem.create("notification", config);
    

这应该足以让你跑步,然后你只需创建一些演员来进行竞价。

我也有JPA工作 - 如果您尝试访问模型和查找数据,最终会出现未初始化的实体管理器错误。

以下是具有JPA访问权限的actor的一些示例代码:

    @Override
    public void onReceive(Object o) throws Exception {
        if (o instanceof SomeMessageType) { // create your own serializable class to transfer message data
            SomeMessageType message = (SomeMessageType) o;
            JPAPlugin.startTx(true); // true is to start this as a readonly transaction
            // Do all the JPA goodness

            JPAPlugin.closeTx(false); // false is for rollback - I use this because I am doing a readonly transaction

        } else {
            unhandled(o);
        }
    }

希望这会有所帮助。我花了几个小时试图让一切都运转起来。我现在能够构建我的异步任务,而不仅仅是吐出Play Jobs。

答案 1 :(得分:0)

Akka EventBus只在一个文件中,您可以随时按来源添加(当然保留标题):https://github.com/jboner/akka/blob/master/akka-actor/src/main/scala/akka/event/EventBus.scala