繁体   English   中英

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

[英]How can I throttle the amount of messages coming from ActiveMQ in my C# app?

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

简而言之,当我收到一个队列事件“ onMessage(IMessage receiveMsg)”时,我将消息放入一个内部队列,X线程在该内部队列中执行其任务。

刚开始时,我有:创建会话时使用“ AcknowledgementMode.AutoAcknowledge”,因此我猜测队列中的所有消息都被吸收并放入了内存队列(这很危险,因为崩溃会导致一切丢失)。

因此,我在创建会话时使用了“ AcknowledgementMode.ClientAcknowledge”,并且当工作人员准备好该消息时,它将在消息上调用“ commit()”方法。 但是,所有消息仍然从队列中被吸走。

如何配置它,使其仅处理X个消息或将其置于内部队列中,而不是立即“下载”所有内容?

您是否在.NET 4.0上? 您可以使用BlockingCollection。 将其设置为可能包含的最大数量。 一旦线程尝试放入多余的元素,Add操作将阻塞,直到集合再次降至阈值以下。

也许这样做会节流吗?

在Rx框架中也有一个用于节流的API,但我不知道它是如何实现的。 如果将Queue源实现为Observable,则该API对您可用,但是我不知道这是否满足您的需求。

您可以设置客户端预取来控制将向客户端发送多少消息。 当会话处于“自动确认”状态时,客户端仅会在通过onMessage回调或同步接收将消息传递到您的应用程序后确认消息。 默认情况下,客户端将从代理中预取1000条消息,如果客户端关闭,这些消息将重新发送到另一个客户端(这是一个队列),否则对于主题,它们将被丢弃,因为主题是基于广播的频道。 如果将预取设置为1,则只会向服务器发送一条来自客户端的消息,然后每次onMessage回调完成时都会调度一条新消息,因为客户端会确认该消息,即会话处于自动确认状态模式。

有关所有选项,请参考NMS配置页面: http : //activemq.apache.org/nms/configuring.html

问候

蒂姆 FuseSource.com

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM