sujin
sujin

Reputation: 2853

Sharing JMS deadLetterChannel across direct route with Transaction in Apache Camel

I have a Camel route which read the message from the jboss JMS queue send to the tow direct route, where one direct route successfully process the message and send to another JMS queue, another direct route failed to process the message.

My expectation is original exchange moved to dead letter channel and first direct route should not commit send the message to JMS queue using rollback.

I have tried many possibilites nothing succeeded yet. Below i provided the Camel route. Kindly help me.

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

Upvotes: 0

Views: 167

Answers (1)

anil
anil

Reputation: 43

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

Upvotes: 1

Related Questions