向一个满了的JMS队列发送消息

3
我正在编写一段Java代码以向JMS队列发送消息。我使用的是"QueueSender.send()"方法。
JMS队列本身是sonicMQ,但这并不是重点。
我的问题是有时候JMS队列会满,尝试发送消息到队列的线程会被饿死。
我是否有办法在发送消息之前知道队列是否已满?在这种情况下,我希望将异常打印到日志中。
顺便说一下,JMS队列代码本身超出了我的范围。我只能更改客户端代码。
谢谢。
3个回答

2

您可以使用 ConnectionFactory 中的 Constants.ASYNC_DELIVERY_MODE_ENABLED 设置 setAsynchronousDeliveryMode 以异步方式发送消息。

使用 Spring:

<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类连接工厂以获取更多详细信息。

有没有一种与实现无关的解决方案(即不特定于sonicMQ,而是通用于JMS)? - bacar

2
JMS队列本身是SonicMQ,但这并不重要。如果我没记错的话,QueueMaxSize属性是特定于SonicMQ的。我的问题是有时JMS队列已满,并且试图向队列发送消息的线程被饿死。根据Progress Sonic MQ性能调整指南7.5对QueueMaxSize属性的理解是这是正常(和期望的)行为:队列存储的消息总大小是QueueMaxSize。当队列发送器尝试将消息传递到已达到最大大小的队列时,发送器将被流量控制,并且消息的发送将被阻止,直到有可用空间为止。
现在,也许可以通过JMX客户端获取通知,但我不确定在您的情况下是否可行(如果您想深入了解,请查看Progress SonicMQ Administrative Programming Guide V7.5或联系支持)。但我真的不确定这会起作用。实际上,我不知道你想做什么是一个好主意。

1
你描述的行为是SonicMQ特有的,它被称为流控制。在某些情况下,这是一个相当好的功能,但在其他情况下,这可能导致整个系统出现问题。不幸的是,在基于队列的情况下,我没有找到任何改变这种行为的方法。
我能想象处理此行为的唯一方案是使用管理API或JMX客户端。有两种常见的可能性:
  • 在发送消息之前检查队列的最大和实际大小
  • 当发生流控制时,SonicMQ可以生成通知,在这里可以监听这些事件。
然而:这只适用于专有的SonicMQ API,不能使用标准的JMS。我建议SonicMQ环境的管理员关注流控制事件,并采取适当的措施...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接