代码之家  ›  专栏  ›  技术社区  ›  Toad

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

  •  5
  • Toad  · 技术社区  · 14 年前

    我在一个.NET程序中使用ActiveMQ,我被消息事件淹没了。

    简而言之,当我得到一个队列事件“onmessage(IMessage receiveDMSG)”时,我将该消息放入一个内部队列,x个线程从中执行它们的操作。

    起初,我在创建会话时使用了“acknowledgementMode.autoAcknowledge”,因此我猜测队列中的所有消息都被吸走并放入内存队列(这很危险,因为发生崩溃时,所有信息都会丢失)。

    因此,我在创建会话时使用了:“acknowledgementMode.clientAcknowledge”,当工作人员准备好消息时,它会对消息调用“commit()”方法。但是,仍然会从队列中吸出所有消息。

    我如何配置它:只有x条消息正在被处理,或者在一个内部队列中,而不是所有的消息都立即被“下载”?

    2 回复  |  直到 14 年前
        1
  •  3
  •   flq    14 年前

    你在.NET 4.0上吗?您可以使用BlockingCollection。将其设置为可能包含的最大值。一旦一个线程试图放入一个多余的元素,添加操作将阻塞,直到集合再次低于阈值。

    也许这可以用于节流?

    RX框架中还有一个用于节流的API,但我不知道它是如何实现的。如果您将队列源实现为可观察的,那么这个API将对您可用,但我不知道这是否符合您的需要。

        2
  •  2
  •   Tim Bish    14 年前

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

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

    当做

    提姆。 fussesource.com网站