Отправка сообщения в полную очередь 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 и реагировать соответствующим образом...