我正在编写一段将消息发送到JMS队列的Java代码。我使用"QueueSender.send()“来做这件事。
JMS queue itsels是sonicMQ,但这不是重点。
我的问题是,有时JMS队列已满,尝试向队列发送消息的线程会耗尽资源。
有没有办法让我在发送消息之前知道队列是否已满?在这种情况下,我更喜欢打印日志中的异常。
顺便说一句,JMS队列代码本身超出了我的能力范围。我只能更改客户端代码。
谢谢。
发布于 2012-08-15 14:45:11
您可以使用ConnectionFactory中的Constants.ASYNC_DELIVERY_MODE_ENABLED setAsynchronousDeliveryMode发送异步消息以执行此操作
使用spring
<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 Class ConnectionFactory中查看更多详细信息
发布于 2010-01-30 17:46:09
JMS队列本身是sonicMQ,但这不是重点。
不完全是,如果我没记错的话,这个QueueMaxSize属性是特定于SonicMQ的。
我的问题是,有时JMS队列是满的,而试图向队列发送消息的线程会耗尽资源。
我对QueueMaxSize属性的Progress Sonic MQ Performance Tuning Guide 7.5的理解是,这是正常的(和想要的)行为:
为队列存储的消息总大小是
QueueMaxSize。当队列发送者尝试将消息传递到达到其最大大小的队列时,发送者将受到流控制,并且消息的发送将被阻止,直到有可用空间为止。
现在,也许可以使用JMX客户端获得通知,但我不确定这在您的上下文中是否可行(如果您想进一步深入了解这一点或联系支持人员,请查看Progress SonicMQ Administrative Programming Guide V7.5 )。但我真的不确定这是否能行得通。实际上,我不知道你想做的是不是一个好主意。
发布于 2010-12-31 17:07:54
您所描述的行为是特定于SonicMQ的,它被称为流控制。在某些情况下,这是一个非常好的功能,在其他情况下,这可能会导致一整排系统出现问题。不幸的是,我还没有找到任何方法来改变基于队列的场景中的这种行为。
我能想到的处理此行为的唯一场景是使用Managemnt API或JMX客户端。通常有两种可能性:
但是:这只能通过专有的JMS实现,而不能通过Standard SonicMQ实现。我会要求SonicMQ环境的管理员观察FLow控件事件并做出适当的反应……
https://stackoverflow.com/questions/2167287
复制相似问题