Как я могу регулировать количество сообщений, поступающих от ActiveMQ в моем приложении C #? - PullRequest
5 голосов
/ 25 ноября 2010

Я использую ActiveMQ в программе .Net, и меня переполняют события сообщений.

Короче говоря, когда я получаю событие очереди 'onMessage (IMessage receiveMsg)', я помещаю сообщение ввнутренняя очередь, из которой X-потоки делают свое дело.

Сначала у меня было: «AcknowledgementMode.AutoAcknowledge» при создании сеанса, поэтому я предполагаю, что все сообщения в очереди были отсосаны и помещены вочередь памяти (что рискованно, так как в случае сбоя все потеряно).

Итак, я использовал: «AcknowledgementMode.ClientAcknowledge» при создании сеанса, и когда рабочий был готов с сообщением, он вызываетМетод commit () для сообщения.Тем не менее, все сообщения высылаются из очереди.

Как я могу настроить его так, чтобы обрабатывалось ТОЛЬКО количество сообщений Х или они были во внутренней очереди, и что не все загружалось?прямо сейчас?

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Вы на .NET 4.0? Вы можете использовать BlockingCollection. Установите максимальную сумму, которую он может содержать. Как только поток попытается вставить лишний элемент, операция Add будет блокироваться, пока коллекция снова не опустится ниже порогового значения.

Может быть, это сделало бы это для регулирования?

Существует также API для регулирования в платформе Rx, но я не знаю, как это реализовано. Если вы реализуете свой источник очереди как Observable, этот API станет для вас доступным, но я не знаю, соответствует ли он вашим потребностям.

2 голосов
/ 26 ноября 2010

Вы можете установить предварительную выборку клиента, чтобы контролировать, сколько сообщений будет отправлено клиенту. Когда сеанс находится в режиме автоматического подтверждения, клиент будет подтверждать сообщение только после его доставки в ваше приложение посредством обратного вызова onMessage или посредством синхронного приема. По умолчанию клиент предварительно выберет 1000 сообщений от посредника. Если клиент отключится, эти сообщения будут доставлены другому клиенту, если это была Очередь, в противном случае для темы они просто отбрасываются, поскольку тема является каналом на основе широковещания. Если вы установите для предварительной выборки единицу, клиенту будет отправлено только одно сообщение от сервера, и каждый раз, когда ваш обратный вызов onMessage завершает работу, новое сообщение будет отправляться, как клиент будет подтверждать это сообщение, то есть если сеанс находится в режиме автоматического подтверждения. режим.

Обратитесь к странице конфигурации NMS для всех опций: http://activemq.apache.org/nms/configuring.html

Привет

Тим. FuseSource.com

...