首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向已满的JMS队列发送消息

向已满的JMS队列发送消息
EN

Stack Overflow用户
提问于 2010-01-30 16:26:52
回答 3查看 4.5K关注 0票数 3

我正在编写一段将消息发送到JMS队列的Java代码。我使用"QueueSender.send()“来做这件事。

JMS queue itsels是sonicMQ,但这不是重点。

我的问题是,有时JMS队列已满,尝试向队列发送消息的线程会耗尽资源。

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

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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-15 14:45:11

您可以使用ConnectionFactory中的Constants.ASYNC_DELIVERY_MODE_ENABLED setAsynchronousDeliveryMode发送异步消息以执行此操作

使用spring

代码语言:javascript
复制
<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中查看更多详细信息

票数 2
EN

Stack Overflow用户

发布于 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 )。但我真的不确定这是否能行得通。实际上,我不知道你想做的是不是一个好主意。

票数 2
EN

Stack Overflow用户

发布于 2010-12-31 17:07:54

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

我能想到的处理此行为的唯一场景是使用Managemnt API或JMX客户端。通常有两种可能性:

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

但是:这只能通过专有的JMS实现,而不能通过Standard SonicMQ实现。我会要求SonicMQ环境的管理员观察FLow控件事件并做出适当的反应……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2167287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档