Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何强制执行取消确认jms消息的重新传递_Java_Jms_Apache Camel - Fatal编程技术网

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">

我读到:

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

邮件重新传递不是自动的,但在某些情况下会重新传递邮件

我的问题是:

  • 如何确保每次收到消息时都有新会话(但重新使用连接)
  • 如何强制未确认邮件的重新交付
  • Im使用此配置:

    <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等待重试尝试,它将自动重新传递您的邮件