随着我的Play 1.2.x项目的发展,我发现自己在这里添加了一些东西在做某些事情(持久化对象等)时,我的代码会变得很混乱。我认为处理这类用例的最好方法是使用Eventbus。。但是哪一个?有
- http://code.google.com/p/simpleeventbus/
- 来自谷歌的Guavahttp://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/eventbus/package-summary.html
可能还有更多。。。。
我已经看到Play 2.x能够使用akka 2.0事件总线。。。但是由于scala插件仍然使用旧的sbt/scala版本,我无法使用带有play 1.2.x 的Akka 2
我很乐意阅读您在游戏项目中使用的消息总线。还请解释您的解决方案如何处理持久性操作,例如如何能够从侦听器使用JPA会话。
谢谢,Dominik
您是否仍在考虑将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
-
从命令行执行playdeps将相关库下载到您的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访问权限的参与者的一些示例代码:
@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吐出来。
Akka EventBus只在一个文件中,您可以随时通过源代码添加它(当然保留标头):https://github.com/jboner/akka/blob/master/akka-actor/src/main/scala/akka/event/EventBus.scala