我在.Net程序中使用ActiveMQ,而且我充斥着消息事件。
简而言之,当我得到一个队列事件'onMessage(IMessage receivedMsg)'时,我将消息放入一个内部队列,X线程就是这样做的。
起初我在创建会话时遇到了'AcknowledgementMode.AutoAcknowledge',所以我猜测队列中的所有消息都被吸了下来并放入内存队列(这是有风险的,因为崩溃,一切都丢失了)。
然后我在创建会话时使用了:'AcknowledgementMode.ClientAcknowledge',当工作人员准备好了消息时,它会在消息上调用'commit()'方法。但是,仍然会从队列中删除所有消息。
如何配置它只处理X条消息或处于内部队列中,并且不是所有内容都被立即“下载”了?
答案 0 :(得分:3)
您使用的是.NET 4.0吗?您可以使用BlockingCollection。将其设置为可能包含的最大金额。一旦线程试图放入多余的元素,Add操作将一直阻塞,直到该集合再次低于阈值。
也许那可以用来限制?
在Rx框架中还有一个用于限制的API,但我不知道它是如何实现的。如果您将Queue源实现为Observable,则此API将可供您使用,但我不知道这是否符合您的需求。
答案 1 :(得分:2)
您可以设置客户端预取以控制客户端将发送的消息数。当会话处于自动确认时,客户端只会在通过onMessage回调或同步接收将消息传递到您的应用时发送消息。默认情况下,客户端将从代理预取1000条消息,如果客户端发生故障,这些消息将被重新传送到另一个客户端,这是一个队列,否则对于一个主题,它们只是被丢弃,因为主题是基于广播的频道。如果您将预取设置为1,那么您的客户端将只从服务器发送一条消息,然后每次onMessage回调完成时,将调度新消息,因为客户端将确认该消息,即会话是否在Auto Ack中模式。
有关所有选项,请参阅NMS配置页面: http://activemq.apache.org/nms/configuring.html
此致
添。 FuseSource.com