2016-01-23 102 views
0

我读:http://www.javaworld.com/article/2074123/java-web-development/transaction-and-redelivery-in-jms.html?page=2如何执行对于UN重新传递确认JMS消息

“一般地,确认特定消息确认会话接收所有先前消息”(在客户端的确认模式)

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

我的问题交还:

  1. 我怎么能ENS每当我收到一条消息时(但重用连接),都会有一个新会话?
  2. 如何执行未确认消息的重新传送?使用这种CONFIGRATION

林:

<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作为单

回答

0

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

您还可以通过检查“org.apache.camel.component.jms.JmsComponent”上的exceptionListener来配置如何管理异常,甚至在当前选项不适合您的需求时编写自己的异常。

+0

谢谢。请问一些问题:我知道PooledConnectionFactory/cachedConnectionFactory缓存连接和会话(以及可选的接收器/生产者)。因此,是否为每个新消息创建新会话?如果不是的话 - 我读了这个确认是针对会话中的所有消息 - 非常糟糕......我需要为每条消息创建一个新会话......但在这种情况下,会话如何汇集?并且 - 如果连接是所有会话的连接,那么在我重新启动我的应用程序之前不会传递确认消息,不是?也不好。 – user5157427

+0

如果我们正在专门讨论ActiveMQ Pooled连接工厂。我最近用过。会话根据每个连接进行配置。这意味着如果你有一个错误(IE:超时或事务失败),你可以配置工厂在错误中销毁并重新创建连接,当你销毁连接时,会话将被破坏并重新创建。有点棘手的配置,当你得到更复杂的事务设置,但基础是如果你摧毁了连接,你还销毁了相关的会话。 –

+0

是的,但未连接的消息将会在delivar而连接没有重新启动(连接正在被合并而不是关闭对于每条消息)?如果不是 - 我已经触发了我的应用程序代码每隔一段逻辑时间重新启动一次连接,不是? – user5157427