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