Java 如何强制执行取消确认jms消息的重新传递
我读到: “通常,确认特定消息会确认会话收到的所有先前消息”(在客户端确认模式下) 邮件重新传递不是自动的,但在某些情况下会重新传递邮件 我的问题是:Java 如何强制执行取消确认jms消息的重新传递,java,jms,apache-camel,Java,Jms,Apache Camel,我读到: “通常,确认特定消息会确认会话收到的所有先前消息”(在客户端确认模式下) 邮件重新传递不是自动的,但在某些情况下会重新传递邮件 我的问题是: 如何确保每次收到消息时都有新会话(但重新使用连接) 如何强制未确认邮件的重新交付 Im使用此配置: <bean id="jmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory" lazy-init="true">
<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>
我使用camel处理器作为端点bean作为singleton您引用的那篇文章是2002年的。从那时起,所有基于MQ的系统都得到了大量的工作。在AMQ PooledConnectionFactory上,有一些设置可以控制连接在被破坏之前的持续时间,以及在遇到错误时应该做什么。我建议阅读一些较新的文档,因为在过去的14年中发生了很多变化。所以有些事情变得容易多了
您还可以查看“org.apache.camel.component.jms.JmsComponent”上的exceptionListener,以配置如何管理异常,甚至在当前选项不适合您的需要时编写自己的异常。谢谢。请回答一些问题:我知道PooledConnectionFactory/cachedConnectionFactory缓存连接和会话(以及可选的接收器/生产者)。那么是否为每个新消息创建新会话?如果没有-我读到确认适用于会话中的所有消息-非常糟糕。。。每封邮件我都需要一个新的会话。。但在这种情况下,会话如何合并?而且-如果连接是所有会话的连接,则在我重新启动应用程序之前不会传递取消确认消息,不是吗?也不是很好。如果我们专门讨论ActiveMQ池连接工厂。我最近用过。会话是根据每个连接配置的。这意味着如果您有错误(即:超时或事务失败)"您可以将工厂配置为在出现错误时销毁并重新创建连接。当您销毁连接时,会话将随之销毁,然后重新创建。当您获得更复杂的事务设置时,配置工作可能会变得有点棘手,但其基础是,如果您销毁连接,您也会销毁关联延迟的会话。是,但未取消传递的消息将在连接未重新启动时传递(连接被池化,并且不是每条消息都关闭)?如果没有-我在我的应用程序代码上有do trigger,每隔一段逻辑时间就会重新启动一次连接,不是吗?为了澄清这一点。您希望确保当消息接收到异常时,您希望ActiveMQ代理立即重新传递消息。只要您破坏消息正在使用的连接,那么代理就不会重新启动t等待重试尝试,它将自动重新传递您的邮件