Java中Akka事件总线(EventBus)的示例

8

需要一些如何在Java中(而非Scala)使用Akka提供的EventBus的建议。网站上的文档似乎不完整:http://doc.akka.io/docs/akka/2.0.1/java/event-bus.html

据我所了解,应该创建actor来对特定的消息做出反应,例如:

final ActorSystem actorSystem = ActorSystem.create("ServerEvents");
final ActorRef actor = actorSystem.actorOf(new Props(SeverEventHandler.class));
actorSystem.eventStream().subscribe(actor,ServerMessage.class);

但现在不清楚如何将消息发送到事件总线。

能否有人分享一些好的教程/示例等?


1
我已经提交了一张工单来改进文档,同时请先学习API:http://doc.akka.io/api/akka/2.0.1/#akka.event.EventStream - Viktor Klang
实际上,我也非常想看到一个例子。目前我们正在使用Guava的EventBus来处理简单的GUI事件。然而,对于重型工作,我想引入Akka并完全摆脱Guava。在同一应用程序中保留两个事件处理库有点愚蠢... - Jan Goyvaerts
2个回答

11

我认为你只是少了一行代码:

final ActorSystem actorSystem = ActorSystem.create("ServerEvents");
final ActorRef actor = actorSystem.actorOf(new Props(SeverEventHandler.class));
actorSystem.eventStream().subscribe(actor,ServerMessage.class);

actorSystem.eventStream().publish(new ServerMessage()); <<== add this

ServerEventHandler应该是类似于

public class ServerEventHandler extends UntypedActor {
  @Override
  public void onReceive(final Object message) {
    System.out.println("Got event in thread: " + Thread.currentThread().getName());
    System.out.println("Event: " + message);
  }
}

0

我不能确定@Jan Goyvaerts代码是否仍然是最新的,截至2019年9月,这行代码没有在运作:

final ActorRef actor = actorSystem.actorOf(new Props(SeverEventHandler.class));

我认为现在做这件事的正确方式可能是:

ActorRef newActor = system.actorOf(Props.create(AATestAkkaEventBus.class));

我并不确定这一点,如果我错了,请纠正我


似乎在Play Framework 2.6或更高版本中,一种方法是定义一个静态的getProps(),例如public static Props getProps() {return Props.create(HelloActor.class);},然后在你的actor中调用该getProps,例如helloActor = system.actorOf(HelloActor.getProps()); - Manabu Tokunaga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接