我正在编写一个将消息发送到JMS队列的Java代码。 我这样做是通过使用“QueueSender.send()”。
JMS队列itsels是sonicMQ,但这不是重点。
我的问题是,有时JMS队列已满,尝试向队列发送消息的线程会被饿死。
在发送邮件之前,有没有办法让我知道队列是否已满?在这种情况下,我宁愿在日志中打印一个例外。
顺便说一下,JMS队列代码本身是我无法企及的。我只能更改客户端代码。
谢谢。
答案 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>
答案 2 :(得分:1)
您描述的行为是SonicMQ特有的,它被称为流量控制。在某些情况下,这是一个非常好的功能,在其他情况下,这可能会导致整行系统出现问题。不幸的是,我没有找到任何方法来改变基于队列的场景中的这种行为。
我可以想象处理此行为的唯一方案是使用Managemnt API或JMX客户端。一般有两种可能性:
但是:这只能通过专有的SonicMQ API实现,您无法使用标准JMS执行此操作。我会要求SonicMQ环境的管理员观看FLOW Control事件并做出适当的反应......