【问题标题】:Sending a message to a full JMS queue将消息发送到完整的 JMS 队列
【发布时间】:2011-01-11 03:46:12
【问题描述】:

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

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

我的问题是,有时 JMS 队列已满,尝试向队列发送消息的线程处于饥饿状态。

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

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

谢谢。

【问题讨论】:

    标签: java jms sonicmq


    【解决方案1】:

    JMS 队列本身就是 sonicMQ,但这不是重点。

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

    我的问题是,有时 JMS 队列已满,尝试向队列发送消息的线程处于饥饿状态。

    我对@9​​87654321@ 关于QueueMaxSize 属性的理解是,这是正常(和想要的)行为:

    为队列存储的消息的总大小为QueueMaxSize。当队列发送者 尝试将消息传递到最大大小的队列,发件人将流 受到控制,消息的发送将被阻止,直到空间可用。

    现在,也许可以通过 JMX 客户端获得通知,但我不确定这在您的上下文中是否可行(如果您想查看Progress SonicMQ Administrative Programming Guide V7.5进一步挖掘或联系支持人员)。但我真的不确定这会奏效。其实我不知道你想做的好不好。

    【讨论】:

      【解决方案2】:

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

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

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

      但是:这只能通过专有的 SonicMQ API 实现,而标准 JMS 无法做到这一点。我会要求 SonicMQ 环境的管理员观看 Flow Control 事件并做出适当的反应......

      【讨论】:

        【解决方案3】:

        您可以通过在 ConnectionFactory 中使用 Constants.ASYNC_DELIVERY_MODE_ENABLED 异步发送消息来设置异步交付模式

        使用弹簧

        <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

        【讨论】:

        • 是否有与实现无关的解决方案(即不是特定于 sonicMQ,但通常适用于 JMS)?
        猜你喜欢
        • 2016-05-02
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        • 2015-02-19
        • 2014-11-20
        相关资源
        最近更新 更多