Отправка сообщения в полную очередь JMS

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

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

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

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

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

Спасибо.

3 ответа

Решение

Вы можете отправлять сообщения асинхронно, чтобы сделать это 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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам