如何使用Play Framework获取特定Web套接字端点上的Actors列表?

时间:2017-03-19 23:34:54

标签: java playframework playframework-2.0

我有一个消息队列,在应用程序启动时没有Actor概念或任何其他内容我想启动消息队列使用者,然后继续从队列中获取消息。现在,Play框架为每个Web套接字连接创建一个Actor,我希望能够将所有持有Web Socket连接的Actors分组到特定的ws端点,这样我就可以广播我从消息队列中收到的所有消息。主题为那些演员组。

例如,每当客户端向下面的任何终点发起请求时,以下端点将创建一个Actor。所以我们称之为 Foo演员演员

ws://localshost/foo

ws://localshost/bar

https://www.playframework.com/documentation/2.5.x/JavaWebSockets

现在我想做的就是这个

伪代码:

 messages = ReceiveMessagesFromQueue; // This is a live stream and it never stops.
 for message in messages:
     if message has key1:
           List<FooActors> foo_list = getAllFooActors
           broadcast(message, foo_list)
     else if message has key2:
           List<BarActors> bar_list = getAllBarActors
           broadcast(message, bar_list)

我使用的是最新版本的Play框架。

1 个答案:

答案 0 :(得分:0)

我会避免维护演员名单的负担,而是使用Akka的Event Bus来寻求更加分离的方法。

这样做,您可以按主题(foo和bar)对wensocket演员进行逻辑分组。这是松散耦合的,因为你的websocket actor和消息队列消费者都不需要知道另一方。他们只需要订阅或发布到特定主题。

以下代码基于lookup classification下显示的示例。

启动时,你的websocket演员只需要订阅相应的主题,粗略地说:

LookupBusImpl lookupBus = new LookupBusImpl();
lookupBus.subscribe(getSelf(), "foo"); // or "bar"

您的队列使用者只需要在伪代码的基础上将消息发布到相应的主题:

LookupBusImpl lookupBus = new LookupBusImpl();
messages = ReceiveMessagesFromQueue;
for message in messages:
  if message has key1:
    lookupBus.publish(new MsgEnvelope("foo", System.currentTimeMillis()))
 else if message has key2:
   lookupBus.publish(new MsgEnvelope("bar", System.currentTimeMillis()))

对于分布式版本,请使用Distributed Publish Subscribe in Cluster