Отправка сообщения в полную очередь JMS - PullRequest
3 голосов
/ 30 января 2010

Я пишу код Java, который отправляет сообщения в очередь JMS. Я делаю это с помощью «QueueSender.send ()».

В очереди JMS есть sonicMQ, но это не относится к делу.

Моя проблема в том, что иногда очередь JMS переполнена, и поток, пытающийся отправить сообщения в очередь, голодает.

Есть ли способ узнать, заполнена ли очередь перед отправкой сообщения? В этом случае я бы предпочел распечатать исключение из журнала.

Кстати, сам код очереди JMS вне моей досягаемости. Я могу изменить только код клиента.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 15 августа 2012

Вы можете отправлять сообщения асинхронно, чтобы сделать это setAsynchronousDeliveryMode с Constants.ASYNC_DELIVERY_MODE_ENABLED в ConnectionFactory

с помощью пружины

<bean id="connectionFactory" class="progress.message.jclient.QueueConnectionFactory">
...
 <property name="asynchronousDeliveryMode">
  <util:constant static-field=  "progress.message.jclient.Constants.ASYNC_DELIVERY_MODE_ENABLED"/>
</property>
</bean>

подробности см. В progress.message.jclient Class ConnectionFactory

2 голосов
/ 30 января 2010

Сама очередь JMS - sonicMQ, но это не относится к делу.

Не совсем, это QueueMaxSize свойство специфично для SonicMQ, если я не ошибаюсь.

Моя проблема в том, что иногда очередь JMS переполнена, а поток, пытающийся отправить сообщения в очередь, голодает.

Мое понимание Руководства по настройке производительности Progress Sonic MQ 7.5 о свойстве QueueMaxSize состоит в том, что это нормальное (и требуемое) поведение:

Общий размер сообщений, хранящихся в очереди, равен QueueMaxSize. Когда отправитель очереди пытается доставить сообщение в очередь, которая имеет максимальный размер, отправитель будет поток контролируется, и отправка сообщения будет заблокирована до тех пор, пока не освободится место.

Теперь, было бы возможно возможно получить Уведомление с клиентом JMX, но я не уверен, что это возможно в вашем контексте (взгляните на Руководство по административному программированию Progress SonicMQ V7.5 , если вы хотите копать дальше или обратитесь в службу поддержки). Но я действительно не уверен, что это сработает. На самом деле, я не знаю, является ли то, что вы хотите сделать, хорошей идеей.

1 голос
/ 31 декабря 2010

Поведение, которое вы описываете, специфично для SonicMQ, оно называется Flow Control. В некоторых сценариях это довольно хорошая функция, в других это может вызвать проблемы с целым рядом систем. К сожалению, я не нашел никакого способа изменить это поведение в сценариях, основанных на очереди.

Единственный сценарий, который я могу себе представить, чтобы справиться с этим поведением, это использовать API Managemnt или клиент JMX. Есть две основные возможности:

  • Проверьте максимальный и фактический размер очереди перед отправкой сообщения
  • когда происходит FlowControl, SonicMQ может генерировать уведомление, здесь можно прослушать эти события.

Однако: это возможно только с проприетарным API SonicMQ, вы не можете сделать это со Стандартной JMS. Я бы попросил администраторов среды SonicMQ наблюдать за событиями FLow Control и реагировать соответствующим образом ...

...