3

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

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

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

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

顺便说一句,JMS 队列代码本身超出了我的范围。我只能更改客户端代码。

谢谢你。

4

3 回答 3

2

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

不是真的,QueueMaxSize如果我没记错的话,这个属性是特定于 SonicMQ 的。

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

我对Progress Sonic MQ Performance Tuning Guide 7.5关于该QueueMaxSize属性的理解是,这是正常的(和想要的)行为:

为队列存储的消息的总大小为QueueMaxSize. 当队列发送方尝试将消息传递到最大大小的队列时,发送方将受到流量控制,并且消息的发送将被阻止,直到空间可用。

现在,也许可以通过 JMX 客户端获得通知,但我不确定这在您的上下文中是否可行(如果您想进一步挖掘或联系,请查看Progress SonicMQ 管理编程指南 V7.5支撑)。但我真的不确定这会奏效。其实,我不知道你想做的是否是一个好主意。

于 2010-01-30T09:46:09.350 回答
2

您可以在 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>

在progress.message.jclient 类 ConnectionFactory中查看更多详细信息

于 2012-08-15T06:45:10.670 回答
1

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

我能想象的处理这种行为的唯一场景是使用 Managemnt API 或 JMX 客户端。一般有两种可能:

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

但是:这只有使用专有的 SonicMQ API 才能实现,而使用标准 JMS 则无法做到这一点。我会要求 SonicMQ 环境的管理员观看 Flow Control 事件并做出适当的反应......

于 2010-12-31T09:07:53.767 回答