【问题标题】:how to enforce the redelivery for un acknowledge jms message如何强制重新传递未确认 jms 消息
【发布时间】:2016-01-23 20:34:22
【问题描述】:

我继续阅读:http://www.javaworld.com/article/2074123/java-web-development/transaction-and-redelivery-in-jms.html?page=2

“通常,确认特定消息会确认会话接收到的所有先前消息”(在客户端确认模式下)

“消息重新传递不是自动的,但在某些情况下会重新传递消息”

我的问题:

  1. 如何确保每次收到消息时都有一个新会话(但重复使用连接)?
  2. 如何强制重新发送未确认消息?

我正在使用这个配置:

<bean id="jmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"
            lazy-init="true">
            <property name="queueManager" value="${queueManager}" />
            <property name="hostName" value="${hostName}" />
            <property name="transportType" value="${transportType}" />
            <property name="port" value="${port}" />
            <property name="channel" value="${channel}" />
            <property name="SSLCipherSuite" value="${SSLCipherSuite}" />
      </bean>
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
    <property name="maxConnections" value="10"/>
    <property name="maximumActive" value="100"/>
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactory"/>
    <property name="transacted" value="false"/>
 </bean>

<bean id="mqNonJmsDestRes" class="calypsox.tk.util.NonJmsMQQueueDestinationResolver" />

<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
      <property name="configuration" ref="jmsConfig" />
       <property name="acknowledgementModeName" value="CLIENT_ACKNOWLEDGE" />
       <property name="destinationResolver" ref="mqNonJmsDestRes" />
 </bean>

我使用骆驼处理器作为端点 bean 作为单例

【问题讨论】:

    标签: java jms apache-camel


    【解决方案1】:

    您引用的那篇文章是 2002 年的。从那时起,所有基于 MQ 的系统都收到了大量的工作。在您的 AMQ PooledConnectionFactory 上,有一些设置可以控制连接在它们被破坏之前的持续时间以及遇到错误时应该做什么。我建议阅读一些较新的文档,因为在过去的 14 年中发生了很多变化。所以有些事情变得容易多了。

    您还可以检查“org.apache.camel.component.jms.JmsComponent”上的异常侦听器来配置如何管理异常,如果当前选项不适合您的需要,甚至可以自己编写。

    【讨论】:

    • 谢谢。请提出一些问题:我了解 PooledConnectionFactory /cachedConnectionFactory 缓存连接和会话(以及可选的接收器/生产者)。那么是否正在为每条新消息创建一个新会话?如果不是 - 我读到确认适用于会话中的所有消息 - 非常糟糕......我需要为每条消息创建一个新会话.. 但在这种情况下如何合并会话?而且-如果连接是所有会话的连接,则在我重新启动应用程序之前不会传递未确认消息,不是吗?也不好。
    • 如果我们专门讨论 ActiveMQ 池连接工厂。我最近用过。会话是按每个连接配置的。意思是如果你有一个错误(IE:超时或事务失败“你可以配置工厂来销毁并在出现错误时重新创建连接。当你销毁连接时,会话将与它一起被销毁然后重新创建。事情可以得到一个当您获得更复杂的事务设置时配置有点棘手,但基础是如果您破坏连接,您也会破坏关联的会话。
    • 是的,但是当连接没有重新启动时,未传递的消息是否会被传递(连接被池化并且不会为每条消息关闭)?如果不是 - 我确实在我的应用程序代码上触发了每隔一些逻辑时间重新启动连接,不是吗?
    • 所以澄清一下。您要确保当消息收到异常时,您希望 ActiveMQ 代理立即重新传递消息。只要您破坏消息正在使用的连接,就会出现这种情况,因此代理不会等待重试尝试,它会自动重新传递您的消息
    猜你喜欢
    • 2016-05-09
    • 2018-03-21
    • 1970-01-01
    • 2013-06-22
    • 2020-03-29
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多