将消息发送到完整的JMS队列

时间:2010-01-30 08:26:52

标签: java jms sonicmq

我正在编写一个将消息发送到JMS队列的Java代码。 我这样做是通过使用“QueueSender.send()”。

JMS队列itsels是sonicMQ,但这不是重点。

我的问题是,有时JMS队列已满,尝试向队列发送消息的线程会被饿死。

在发送邮件之前,有没有办法让我知道队列是否已满?在这种情况下,我宁愿在日志中打印一个例外。

顺便说一下,JMS队列代码本身是我无法企及的。我只能更改客户端代码。

谢谢。

3 个答案:

答案 0 :(得分:2)

  

JMS队列本身就是sonicMQ,但这不是重点。

不是真的,如果我没错,这个QueueMaxSize属性是SonicMQ特有的。

  

我的问题是,有时JMS队列已满,尝试向队列发送消息的线程会被饿死。

我对QueueMaxSize QueueMaxSize属性的理解是,这是正常的(和想要的)行为:

  

为队列存储的消息总大小为{{1}}。当一个队列发件人   尝试将消息传递到最大大小的队列,发送方将流动   受控制并且消息的发送将被阻止,直到空间可用。

现在,可能可以通过JMX客户端获取通知,但我不确定这在您的上下文中是否可行(如果您查看Progress Sonic MQ Performance Tuning Guide 7.5想进一步挖掘或联系支持部门)。但我真的不确定这会起作用。实际上,我不知道你想做什么是个好主意。

答案 1 :(得分:2)

您可以发送消息asynchronic,以便在ConnectionFactory中使用Constants.ASYNC_DELIVERY_MODE_ENABLED执行setAsynchronousDeliveryMode

使用弹簧

<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 :(得分:1)

您描述的行为是SonicMQ特有的,它被称为流量控制。在某些情况下,这是一个非常好的功能,在其他情况下,这可能会导致整行系统出现问题。不幸的是,我没有找到任何方法来改变基于队列的场景中的这种行为。

我可以想象处理此行为的唯一方案是使用Managemnt API或JMX客户端。一般有两种可能性:

  • 在发送消息之前检查队列的最大和实际大小
  • 当FlowControl发生时,SonicMQ可以生成通知,这里可以收听这些事件。

但是:这只能通过专有的SonicMQ API实现,您无法使用标准JMS执行此操作。我会要求SonicMQ环境的管理员观看FLOW Control事件并做出适当的反应......