簡體   English   中英

如何從兩個不同的連接工廠加入Spring JMS事務?

[英]How to join Spring JMS transactions from two different connection factories?

我正在使用不同的連接工廠來發送和接收消息,如果發生交付失敗,則會遇到部分提交問題。 jms:message-driven-channel-adapter使用receiveConnectionFactory ro接收來自隊列的消息。 jms:outbound-channel-adapter使用deliverConnectionFactory將消息多個發送到下游隊列。 我們只有一個JmsTransactionManager它使用receiveConnectionFactoryjms:outbound-channel-adapter與配置session-transacted="true"

<beans>
    <bean id="transactionManager"
        class="org.springframework.jms.connection.JmsTransactionManager">
        <property name="connectionFactory" ref="receiveConnectionFactory" />
    </bean>
    <bean id="receiveConnectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory">
            <bean class="com.ibm.mq.jms.MQQueueConnectionFactory">
                <property name="hostName" value="${mq.host}" />
                <property name="channel" value="${mq.channel}" />
                <property name="port" value="${mq.port}" />
            </bean>
        </property>
        <property name="sessionCacheSize" value="${receive.factory.cachesize}" />
        <property name="cacheProducers" value="${receive.cache.producers.enabled}" />
        <property name="cacheConsumers" value="${receive.cache.consumers.enabled}" />
    </bean>

    <bean id="deliverConnectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory">
            <bean class="com.ibm.mq.jms.MQQueueConnectionFactory">
                <property name="hostName" value="${mq.host}" />
                <property name="channel" value="${mq.channel}" />
                <property name="port" value="${mq.port}" />
            </bean>
        </property>
        <property name="sessionCacheSize" value="${send.factory.cachesize}" />
        <property name="cacheProducers" value="${send.cache.producers.enabled}" />
        <property name="cacheConsumers" value="${send.cache.consumers.enabled}" />
    </bean>

    <tx:advice id="txAdviceNew" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="send" propagation="REQUIRES_NEW" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:advisor advice-ref="txAdviceNew" pointcut="bean(inputChannel)" />
        <aop:advisor advice-ref="txAdviceNew" pointcut="bean(errorChannel)" />
    </aop:config>

    <jms:message-driven-channel-adapter
        id="mdchanneladapter" channel="inputChannel" task-executor="myTaskExecutor"
        connection-factory="receiveConnectionFactory" destination="inputQueue"
        error-channel="errorChannel" concurrent-consumers="${num.consumers}"
        max-concurrent-consumers="${max.num.consumers}" max-messages-per-task="${max.messagesPerTask}"
        transaction-manager="transactionManager" />

    <jms:outbound-channel-adapter
        connection-factory="deliverConnectionFactory" session-transacted="true"
        destination-expression="headers.get('Deliver')" explicit-qos-enabled="true" />
</beans>

當任一目標上存在MQ異常時,將發生部分提交,然后發生故障隊列提交。 我正在尋找是否缺少一些配置來加入事務,以便永遠不會發生部分提交。

我只嘗試了一個用於發送和接收的連接工廠( receiveConnectionFactory ),並且沒有發生receiveConnectionFactory提交,所有操作都按預期進行。

我只嘗試了一個用於發送和接收的連接工廠( receiveConnectionFactory ),並且沒有發生receiveConnectionFactory提交,所有操作都按預期進行。

這是適合您情況的正確方法。

我看到您的兩個ConnectionFactories僅在對象方面有所不同。 其余的一切看起來都像同一台目標MQ服務器。

如果您絕對不能只使用一個ConnectionFactory ,則應考慮使用JtaTransactionManager或為兩個JmsTransactionManagers配置org.springframework.data.transaction.ChainedTransactionManager每個連接工廠一個。

請參閱Dave Syer關於此事的文章: https : //www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM