Hi

You have to wait for the next release, where we plan to improve the transaction 
error handler to fully support the RedliveryPolicy options, as far as we can.

However there is a trick that another end-user has used to use the 
DeadLetterChannel but still in transacted mode.

You should not set all the spring PROPOGATION_REQUIRED and NOT use the <policy>.

PROPOGATION_REQUIRED is default anyway, so then the DeadLetterChannel will 
still be active (policy not used) and you can control the number of 
redeliveries, delay etc.

So you should just set the "transacted=true" on the ActiveMQ. However notice 
that the message will still be rolled back on the ActiveMQ and using its 
feature for redelivery handling. 



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 07:37
To: camel-user@activemq.apache.org
Subject: RE: Can DeadLetterChannel be used in Transaction?


Hi,

Thanks for answering my question~

However, I did exactly what
http://activemq.apache.org/camel/transactional-client.html said and found
that neither the delay nor the maximumRedeliveries worked (the message is
redeliveried 7 times whatever maximumRedeliveries is). So I tried to change
the xml configuration to java DSL. But I didn't find how to use
transactionErrorHandler in DSL. Could you give me an example?

And I noticed that CAMEL-706 said delay not working in **all** conditions,
while you are saying "delay is **some** situations are not working". Is
there any hope that I can make the delay working in Camel 1.4 or I have to
wait for the next release? Thank you.


Claus Ibsen wrote:
> 
> 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.
> 
> 
> 

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

Reply via email to