我有一个消息队列,在应用程序启动时没有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框架。
答案 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。