Hi

No DeadLetterChannel is supposed to only be used for *non* transactional routes.

You should use the transactionErrorHandler instead = new feature in Camel 
1.4.0. 
In Camel 1.4.0, the DeadLetterChannel is skipped if the routing is in 
transacted mode. You can see this as it will log this at DEBUG level:
"This is a transacted exchange, bypassing this DeadLetterChannel..."

See:
http://activemq.apache.org/camel/transactional-client.html
for samples, options etc.

You should be able to set the redelivery delay on the transactionErrorHandler 
also. Notice that it should actually be the the backing systems 
TransactionManager where you should set number of redeliveries, redelivery 
delay etc. if it's supported.

Mind that we have an issue reported in JIRA: CAMEL-706 that the delay is some 
situations are not working.

Med venlig hilsen
 
Claus Ibsen
......................................
Silverbullet
Skovsgårdsvænget 21
8362 Hørning
Tlf. +45 2962 7576
Web: www.silverbullet.dk
-----Original Message-----
From: Lin.Zhang [mailto:[EMAIL PROTECTED] 
Sent: 9. september 2008 05:25
To: camel-user@activemq.apache.org
Subject: Can DeadLetterChannel be used in Transaction?


I tried to use DeadLetterChannel to add some redelivery delay when some
exception occured. The problem I have now is if transaction is not used, the
dlc works fine. But if in a transaction, the dlc just seems not work. I use
ActiveMQ as the datasource and spring for transaction support. Can somebody
tell me whether DLC can work in transactions? Here are my source files,
Thanks.

[[aplicationContext.xml]]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans";
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
       xmlns:camel="http://activemq.apache.org/camel/schema/spring";
       xmlns:amq="http://activemq.apache.org/schema/core";
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://activemq.apache.org/camel/schema/spring
http://activemq.apache.org/camel/schema/spring/camel-spring.xsd
        http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core.xsd";>

        <camel:camelContext id="camel" />       
        
        <bean id="jmsConfig"
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="activemq" class="org.apache.camel.component.jms.JmsComponent">
                <property name="configuration" ref="jmsConfig" />
        </bean>
        
        <bean id="PROPAGATION_REQUIRED"
class="org.springframework.transaction.support.TransactionTemplate">
                <property name="transactionManager" ref="jmsTransactionManager" 
/>
        </bean> 
        
        <bean id="PROPAGATION_NOT_SUPPORTED"
class="org.springframework.transaction.support.TransactionTemplate">
                <property name="transactionManager" 
ref="jmsTransactionManager"/>
                <property name="propagationBehaviorName"
value="PROPAGATION_NOT_SUPPORTED"/>
        </bean>

        <bean id="PROPAGATION_REQUIRES_NEW"
class="org.springframework.transaction.support.TransactionTemplate">
                <property name="transactionManager" 
ref="jmsTransactionManager"/>
                <property name="propagationBehaviorName"
value="PROPAGATION_REQUIRES_NEW"/>
        </bean> 
                
        <bean id="jmsTransactionManager"
class="org.springframework.jms.connection.JmsTransactionManager">
                <property name="connectionFactory" ref="jmsConnectionFactory" />
        </bean>         
        
        <bean id="jmsConnectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory" depends-on="broker">
                <property name="brokerURL" value="tcp://localhost:61616" />
        </bean>
        
        <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
                <property name="config" value="/activemq.xml" />
        </bean>
</beans>

[[Main.java]]
package com.abc.actxii;

import org.apache.camel.CamelContext;
import org.apache.camel.CamelTemplate;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.spi.Policy;
import org.apache.camel.spring.SpringCamelContext;
import org.apache.camel.spring.SpringRouteBuilder;
import org.apache.camel.spring.spi.SpringTransactionPolicy;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.transaction.support.TransactionTemplate;

public class Main {

        private static ApplicationContext springContext;
        private static CamelContext camelContext;
        private static CamelTemplate camelTemplate;
        
        public static void main(String[] args) throws Exception {
                springContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
                camelContext = getCamelContext(springContext);
                
                camelTemplate = getCamelTemplate(camelContext);
                
                camelContext.addRoutes(new SpringRouteBuilder() {
                        @Override
                        public void configure() throws Exception {
                                Policy required = new
SpringTransactionPolicy(bean(TransactionTemplate.class,
"PROPAGATION_REQUIRED"));
                                                                                
                
                                from("activemq:com.abc.actxii.dest")
                                
.errorHandler(deadLetterChannel("file://failure").maximumRedeliveries(5).initialRedeliveryDelay(2500).maximumRedeliveryDelay(30000))
                                        .policy(required)
                                        .process(new Processor() {              
                                                
                                                public void process(Exchange 
exchange) throws Exception {
                                                        
System.out.println("message = " +
exchange.getIn().getBody().toString() + ", " + System.currentTimeMillis() );
                                                        throw new 
Exception("test");
                                                }
                                        }).to("file://success");
                        }
                });
                                
                camelTemplate.sendBody("activemq:com.stubhub.actxii.dest", 
"Hello World");
        }

        private static CamelTemplate getCamelTemplate(CamelContext 
camelContext) {
                return new CamelTemplate(camelContext);
        }

        private static SpringCamelContext getCamelContext(
                        ApplicationContext springContext) {
                return (SpringCamelContext)springContext.getBean("camel");
        }

}

-- 
View this message in context: 
http://www.nabble.com/Can-DeadLetterChannel-be-used-in-Transaction--tp19385266s22882p19385266.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to