我正在编写一个将消息发送到 JMS 队列的 Java 代码。我通过使用“QueueSender.send()”来做到这一点。
JMS 队列本身是 sonicMQ 但这不是重点。
我的问题是,有时 JMS 队列已满,尝试向队列发送消息的线程被饿死。
有没有办法让我在发送消息之前知道队列是否已满?在这种情况下,我宁愿在日志中打印一个异常。
顺便说一句,JMS 队列代码本身超出了我的范围。我只能更改客户端代码。
谢谢你。
JMS 队列本身就是 sonicMQ,但这不是重点。
不是真的,QueueMaxSize
如果我没记错的话,这个属性是特定于 SonicMQ 的。
我的问题是,有时 JMS 队列已满,尝试向队列发送消息的线程被饿死。
我对Progress Sonic MQ Performance Tuning Guide 7.5关于该QueueMaxSize
属性的理解是,这是正常的(和想要的)行为:
为队列存储的消息的总大小为
QueueMaxSize
. 当队列发送方尝试将消息传递到最大大小的队列时,发送方将受到流量控制,并且消息的发送将被阻止,直到空间可用。
现在,也许可以通过 JMX 客户端获得通知,但我不确定这在您的上下文中是否可行(如果您想进一步挖掘或联系,请查看Progress SonicMQ 管理编程指南 V7.5支撑)。但我真的不确定这会奏效。其实,我不知道你想做的是否是一个好主意。
您可以在 ConnectionFactory 中使用 Constants.ASYNC_DELIVERY_MODE_ENABLED 异步发送消息来执行此操作
使用弹簧
<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>
您描述的行为是特定于 SonicMQ 的,称为流控制。在某些情况下,这是一个非常好的功能,在其他情况下,这可能会导致整个系统出现问题。不幸的是,我还没有找到任何方法来改变基于队列的场景中的这种行为。
我能想象的处理这种行为的唯一场景是使用 Managemnt API 或 JMX 客户端。一般有两种可能:
但是:这只有使用专有的 SonicMQ API 才能实现,而使用标准 JMS 则无法做到这一点。我会要求 SonicMQ 环境的管理员观看 Flow Control 事件并做出适当的反应......