每个发件人的消息队列

问题描述:

我正在使用Glassfish 3.1.1,结合使用EJB 3.1体系结构和smack库来处理传入的XMPP数据包。每个发件人的消息队列

为此,我有一个从Singleton处理我的传入数据包的线程。

Packet packet = collector.nextResult(); 
if (packet != null) 
    processPacket(packet); // here i lookup my processing EJB and start working 

我所需要的是,其在一个时间排队分组以每发送方处理一个分组的队列。目前,我并行处理每个收到的数据包,这使我无法保持数据包的顺序。

任何想法如何我可以尽可能优雅地解决这个问题?

问候中号

PS:第一种方法是存储该客户端处理的时刻数据包,我遍历收集的数据包并找出不处理任何发件人。但是,如果缓冲区中没有数据包被允许处理,恐怕这会花费很多次迭代。

如果您提前知道发件人,那么您可以注册与每个发件人匹配的PacketFilter。因此每个收集器将排队来自每个发送者的数据包。

如果你不知道,那么你可以完成同样的事情,但你必须自己发送消息。使用PacketListener而不是收集器,并在收到它们时将每封邮件路由到发件人队列中。然后,您可以按需创建队列,如果它不存在。

+0

我之前尝试过PacketListener,但我更喜欢PacketCollector,因为当我想停止处理数据包时,我有更多的控制权。在heaver负载下,数据包监听器一直调用回调函数,直到它的缓冲区为空,即使我取消了它。通过收集器,我还可以通过获取排队数据包的数量(反射)来确定其健康状态。但不管怎么说。当我收到新包时,我需要为每个客户端高效排队。你有什么想法吗?我在PS中张贴了我的第一个方法。 – mkuff 2012-04-20 07:10:31