我有一个内部审核日志,我在默认的AkkaSystem中发送到EventStream。发送事件没有问题,我刚刚插入了一个EventSteam,并在那里发布了我的事件。
问题是Play应用程序启动时启动EventStream侦听器。我尝试使用简单的guice配置,这不起作用,因为我预期因为Guice懒惰地创建这个bean
@Provides
@Singleton
@Named("auditEventListener")
def auditEventListener(actorSystem: ActorSystem, auditEventCollection: AuditEventCollection): ActorRef = {
val listenerRef = actorSystem.actorOf(Props(new AuditEventListener(auditEventCollection)))
val subscribed = actorSystem.eventStream.subscribe(listenerRef, classOf[AuditEvent])
if (!subscribed)
throw new IllegalArgumentException("Failed to subscribe to events")
listenerRef
}
所以我决定使用Global对象,并在那里移动初始化:
override def onStart(app: Application) = {
val listenerRef = actorSystem.actorOf(Props(new AuditEventListener(auditEventCollection)))
actorSystem.eventStream.subscribe(listenerRef, classOf[AuditEvent])
}
在这种情况下 - onStart在测试中被调用两次,同一事件在AuditLog中发布两次,Play也不再推荐这种情况。
因此。我选择了一个中间地带
override def onStart(app: Application) = {
app.injector.instanceOf(BindingKey(classOf[ActorRef]).qualifiedWith("auditEventListener"))
}
这项工作 - 监听器只接收事件并初始化一次。
因为我不喜欢发明轮子,我想知道。 我该怎么做“Scala / Playframework”的方式?