什么是在Play中初始化Akka EventStream监听器的正确方法

时间:2015-12-15 09:53:20

标签: scala playframework akka

我有一个内部审核日志,我在默认的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”的方式?

0 个答案:

没有答案