2

camel コンテキスト (camel 2.8) で jms エンドポイント (activemq 5.7) を構成しようとしてきたので、ロールバック時にメッセージの再配信を使用する必要があります。残念ながら、期待どおりには機能しません。メッセージをキューに返しますが、遅延パラメーターが指定されているにもかかわらず、コンシューマーはその直後にメッセージを受け取ります。

私の構成は次のとおりです。

...
<bean id="jmstx" class="org.apache.activemq.camel.component.ActiveMQComponent"> 
    <property name="configuration" ref="jmsTxConfig" /> 
</bean> 

<bean id="jmsTxConfig" class="org.apache.camel.component.jms.JmsConfiguration"> 
    <property name="connectionFactory" ref="jmsXaPoolConnectionFactory"/> 
    <property name="transactionManager" ref="osgiPlatformTransactionManager"/>
    <property name="transacted" value="false"/>
    <property name="cacheLevelName" value="CACHE_NONE"/>
    <property name="concurrentConsumers" value="${jms.concurrentConsumers}" />
</bean> 

<bean id="jmsXaPoolConnectionFactory" class="org.apache.activemq.pool.XaPooledConnectionFactory">
    <property name="maxConnections" value="${jms.maxConnections}" />
    <property name="connectionFactory" ref="jmsXaConnectionFactory" />
    <property name="transactionManager" ref="osgiJtaTransactionManager" />
</bean>

<bean id="jmsXaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
    <property name="brokerURL" value="${jms.broker.url}"/>
    <property name="redeliveryPolicy">
        <bean class="org.apache.activemq.RedeliveryPolicy">
            <property name="maximumRedeliveries" value="-1"/>
            <property name="initialRedeliveryDelay" value="2000" />
            <property name="redeliveryDelay" value="5000" />
        </bean>
    </property>
</bean>

エンドポイントの使用方法を示す小さなサンプル:

    <route id="main-route">
        <from uri="jmstx:queue:my-queue" />
        <to uri="direct:subroute" />
        ...
        <!-- some logic -->
    </route>

    <route id="subroute">
        <from uri="direct:subroute" />
        <transacted ref="PROPAGATION_MANDATORY"/>
        ...
        <!-- Rollback on some condition -->
        <rollback/>
        ...
    </route>

なぜそれが起こるのか誰か知っていますか?ありがとうございました。

4

1 に答える 1

0

はい、同じ問題が発生しました。ActiveMQ のソース コードをハッキングし、いくつかのログ情報を追加した後、いくつかの証拠を見つけて解決策をググりました。

答えが言ったように: https://developer.jboss.org/thread/266172 activemq コンポーネントで cacheLevel を CACHE_CONSUMER に設定した後、問題を解決しました。

元:

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration"> 
  <property name="connectionFactory" ref="jmsPooledConnectionFactory" />
  <property name="concurrentConsumers" value="1"/> 
  <property name="transacted" value="true"/>
  <property name="cacheLevelName" value="CACHE_CONSUMER"/>
  <property name="acknowledgementModeName" value="SESSION_TRANSACTED"/>
</bean> 
于 2017-05-27T14:53:29.153 に答える