Java 向完整JMS队列发送消息

Java 向完整JMS队列发送消息,java,jms,sonicmq,Java,Jms,Sonicmq,我正在编写一个向JMS队列发送消息的Java代码。 我使用“QueueSender.send()”来完成此操作 JMS队列itsels是sonicMQ,但这不是重点 我的问题是,有时JMS队列已满,而尝试向队列发送消息的线程却没有消息 在发送消息之前,是否有方法让我知道队列是否已满?在这种情况下,我更愿意在日志中打印一个异常 顺便说一句,JMS队列代码本身是我够不着的。我只能更改客户端代码 多谢各位 JMS队列本身是sonicMQ,但这与问题无关 不是真的,如果我没有错的话,这个QueueMax

我正在编写一个向JMS队列发送消息的Java代码。 我使用“QueueSender.send()”来完成此操作

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

我的问题是,有时JMS队列已满,而尝试向队列发送消息的线程却没有消息

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

顺便说一句,JMS队列代码本身是我够不着的。我只能更改客户端代码

多谢各位

JMS队列本身是sonicMQ,但这与问题无关

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

我的问题是,有时JMS队列已满,而尝试向队列发送消息的线程却没有消息

我对
QueueMaxSize
属性的理解是,这是一种正常的(也是需要的)行为:

为队列存储的消息的总大小为
QueueMaxSize
。当队列发送者 如果尝试将消息传递到最大大小的队列,则发送方将被拒绝 已控制,消息的发送将被阻止,直到空间可用


现在,也许可以通过JMX客户端获得通知,但我不确定这在您的环境中是否可行(如果您想进一步了解这一点或联系支持人员,请查看)。但我真的不确定这是否有效。实际上,我不知道你想做的是不是一个好主意。

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

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

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

但是:这仅在专有的SonicMQ API中才可能实现,而在标准JMS中则无法实现。我会要求SonicMQ环境的管理员观察流控制事件,并做出适当的反应…

您可以异步发送消息,以便在ConnectionFactory中启用常数设置AsynchronousDeliveryMode。ASYNC_DELIVERY_MODE_

使用弹簧

<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,但通常适用于JMS的解决方案)?