【问题标题】:Sharing JMS deadLetterChannel across direct route with Transaction in Apache Camel使用 Apache Camel 中的 Transaction 跨直接路由共享 JMS deadLetterChannel
【发布时间】:2019-06-25 05:31:48
【问题描述】:

我有一个 Camel 路由,它从 jboss JMS 队列读取消息发送到两个直接路由,其中​​一个直接路由成功处理消息并发送到另一个 JMS 队列,另一个直接路由无法处理消息。

我的期望是原始交换移动到死信通道,并且第一个直接路由不应该提交使用回滚将消息发送到 JMS 队列。

我尝试了很多可能性,但都没有成功。下面我提供了骆驼路线。请帮助我。

 <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate" ref="jndiTemplate"/>
        <property name="jndiName" value="jms/RemoteConnectionFactory"/>
    </bean>

    <bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
    </bean>

    <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
    </bean>

    <bean id="jmsConfigTx" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
        <property name="transactionManager" ref="jmsTransactionManager"/>
        <property name="transacted" value="true"/>
    </bean>

    <bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
        <property name="configuration" ref="jmsConfig"/>
    </bean>

    <bean id="jmstx" class="org.apache.camel.component.jms.JmsComponent">
        <property name="configuration" ref="jmsConfigTx"/>
    </bean>

    <bean id="successProcessor" class="com.test.SuccessTestProcessor"/>
    <bean id="errorProcessor" class="com.test.ErrorTestProcessor"/>
    <bean id="deadChannelProcessor" class="com.test.DeadChannelTestProcessor"/>

    <bean id="myDeadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
        <property name="deadLetterUri" value="direct:error_channel"/>
    </bean>

    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route id="route-one" errorHandlerRef="myDeadLetterErrorHandler">
            <from uri="jmstx:queue:JMS_IN"/>
            <transacted/>
            <to uri="direct:success-route"/>
            <to uri="direct:error-route"/>
        </route>

        <route id="direct-success-route">
            <from uri="direct:success-route"/>
            <process ref="successProcessor"/>
            <to uri="jmstx:queue:JMS_OUT_1"/>
        </route>

        <route id="direct-error-route">
            <from uri="direct:error-route"/>
            <process ref="errorProcessor"/>
            <to uri="jmstx:queue:JMS_OUT_2"/>
        </route>

        <route id="direct_error_channel">
            <from uri="direct:error_channel"/>
            <process ref="deadChannelProcessor"/>
            <to uri="jmstx:queue:ERROR"/>
        </route>
    </camelContext>

【问题讨论】:

    标签: java apache-camel jms spring-transactions spring-jms


    【解决方案1】:
    <-- error -->
    
    <bean id="jmsConfigTx" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
        <property name="transactionManager" ref="jmsTransactionManager"/>
        <property name="transacted" value="true"/>
    </bean>
    
    in the above code snippet  already Transactionfactory refers to the jmsConnectionFactory internally , is there any need to write one more property to refer jmsConnectionFactory .
    

    【讨论】:

    • 这不是 Transactionfactory* 它是 jmsTransactionManager
    • 谢谢@anil。据我了解,创建更多属性不会影响交易行为。你能在这方面进一步帮助我吗?在过去的几天里,我对此感到震惊。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多