如何在C#应用程序中限制来自ActiveMQ的消息量?

时间:2010-11-25 13:05:10

标签: c# .net message-queue activemq nms

我在.Net程序中使用ActiveMQ,而且我充斥着消息事件。

简而言之,当我得到一个队列事件'onMessage(IMessage receivedMsg)'时,我将消息放入一个内部队列,X线程就是这样做的。

起初我在创建会话时遇到了'AcknowledgementMode.AutoAcknowledge',所以我猜测队列中的所有消息都被吸了下来并放入内存队列(这是有风险的,因为崩溃,一切都丢失了)。

然后我在创建会话时使用了:'AcknowledgementMode.ClientAcknowledge',当工作人员准备好了消息时,它会在消息上调用'commit()'方法。但是,仍然会从队列中删除所有消息。

如何配置它只处理X条消息或处于内部队列中,并且不是所有内容都被立即“下载”了?

2 个答案:

答案 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