2010-01-30 90 views
3

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

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

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

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

顺便说一下,JMS队列代码本身不在我的范围之内。我只能更改客户端代码。

谢谢。

回答

2

您可以发送消息asynchronic使用弹簧

做Constants.ASYNC_DELIVERY_MODE_ENABLED所以setAsynchronousDeliveryMode在ConnectionFactory

<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

+0

更多细节有一个实现无关的解决方案(即一个不特定的SonicMQ,但一般应用程能为JMS)? – bacar 2013-06-12 18:06:57

2

JMS队列本身是sonicMQ,但那不在重点。

不是真的,这QueueMaxSize属性是SonicMQ具体如果我没有错。

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

我的Progress Sonic MQ Performance Tuning Guide 7.5有关QueueMaxSize物业的理解是,这是正常的(并希望)行为:

存储队列消息的总大小是QueueMaxSize。当队列发件人 尝试将邮件传递到最大大小的队列时,将控制发件人流程 ,并且邮件的发送将被阻止,直到空间可用。现在

,这将是也许可能得到一个JMX客户端通知,但我不知道这是在你的情况下是可行的(有一个看看Progress SonicMQ Administrative Programming Guide V7.5如果你想这个进一步,挖掘联系支持)。但我真的不确定这会起作用。其实,我不知道你想做什么是一个好主意。

1

您描述的行为是SonicMQ特有的,它被称为流量控制。在某些情况下,这是一个相当不错的功能,在其他情况下,这可能会导致整行系统成为问题。不幸的是,我没有找到任何方法在基于队列的场景中改变这种行为。

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

  • 检查发送消息
  • 流量控制时发生的SonicMQ可以生成一个通知,在这里就可以监听这些事件前的队列的最大和实际尺寸。

但是:这只适用于专有的SonicMQ API,您无法使用标准JMS来执行此操作。我想请的SonicMQ环境的管理员观看流控制事件,并作出适当的反应......