On Wed, Nov 4, 2009 at 2:56 PM, Schneider Christian
<[email protected]> wrote:
> Hi Willem,
>
> that is fine with me. I have closed the ticket.
>
> I have another exception problem though. I want to define a rule for the
> other exceptions that should not return a fault. I want these exceptions to
> be forwarded into something like a dead letter queue after some retries.
>
> I see two different ways to achieve this.
>
> 1) I could simply let them be rolled back and then use a filter for the jms
> header JMSXDeliveryCount>n. So I could route any message that is redelivered
> for the n´th time to a dead letter queue.
>

The JMS Broker have a build in dead letter queue mechanism.


> 2) I could use an onException clause like below. To let camel do the
> redeliveries and send to a dead letter queue after 4 tries.
>                <route>
>                        <from
> uri="jms://queue.net.enbw.services.etg.examples.customerservice.CustomerServ
> ice" />
>                        <onException>
>                                <exception>java.lang.Exception</exception>
>                                <handled>
>                                        <constant>true</constant>
>                                </handled>
>                                <to uri="jms:queue.deadLetter" />
>                        </onException>
>                        <transacted />
>                        <to uri="direct:server" />
>                </route>
>
> I have not yet done 1) but have a problem with 2). It seems that when I set
> handled to true then the "to" part is not executed. If I leave out "handled"
> then the message is put into the deadLetter queue but rolled back later.
> The only way I was able to really send to the deadLetter queue wasby turning
> of transactions completely.
>
> Any idea what I am doing wrong?
>
> Greetings
>
> Christian
>
>
> Christian Schneider
> Team Handel und Risikomanagement
> Informationsverarbeitung Business Solutions Trading
> EnBW Systeme Infrastruktur Support GmbH
>
> Informationsverarbeitung
> Business Solutions
> Handel und Dispatching
> Durlacher Allee 93
> 76131 Karlsruhe
>
> Tel : +49-(0)721-63-15482
> Mail: [email protected]
>
> Sitz der Gesellschaft: Karlsruhe
> Handelsregister: Amtsgericht Mannheim   HRB 108550
> Vorsitzender des Aufsichtsrats: Dr. Bernhard Beck
> Geschäftsführer: Jochen Adenau, Dr. Peter Krampf
>
> -----Ursprüngliche Nachricht-----
> Von: Willem Jiang [mailto:[email protected]]
> Gesendet: Mittwoch, 4. November 2009 03:51
> An: [email protected]
> Betreff: Re: AW: AW: AW: Problem with SOAP/JMS and transactions
>
> Hi Christian,
>
> I saw the issue and submitted a patch for it.
> BTW, I think onException is a good way to resolve your customer
> exception issue.
>
> Willem
> Schneider Christian wrote:
>> Hi Willem,
>>
>> I have built a camel-cxf module that includes your patch. Now the rollback
>> basically works.
>> The problem is that it happens for all exceptions. I think a good default
>> would be to return a fault for all exceptions that the service explicitly
>> defines and roll back for all other exceptions. The problem is I have no
>> idea how this could be done.
>>
>> In the meantime I will try to use a onException() clause to do this
>> differentiation.
>>
>> I have also created a jira issue for the whole problem.
>> https://issues.apache.org/activemq/browse/CAMEL-2128
>>
>>
>> Greetings
>>
>> Christian
>>
>> Christian Schneider
>> Team Handel und Risikomanagement
>> Informationsverarbeitung Business Solutions Trading
>> EnBW Systeme Infrastruktur Support GmbH
>>
>> Informationsverarbeitung
>> Business Solutions
>> Handel und Dispatching
>> Durlacher Allee 93
>> 76131 Karlsruhe
>>
>> Tel : +49-(0)721-63-15482
>> Mail: [email protected]
>>
>> Sitz der Gesellschaft: Karlsruhe
>> Handelsregister: Amtsgericht Mannheim   HRB 108550
>> Vorsitzender des Aufsichtsrats: Dr. Bernhard Beck
>> Geschäftsführer: Jochen Adenau, Dr. Peter Krampf
>>
>> -----Ursprüngliche Nachricht-----
>> Von: Willem Jiang [mailto:[email protected]]
>> Gesendet: Montag, 2. November 2009 15:40
>> An: [email protected]
>> Betreff: Re: AW: AW: Problem with SOAP/JMS and transactions
>>
>> Hi Christian,
>>
>> I'm glade it works on camel side.
>> For the CXF side , I think we need to check the CXF message's exception
>> in the Camel transport and let camel throw the exception.
>>
>> Here is my patch on the latest trunk code (not be verified yet), please
>> feel free to give it a try.
>>
>> ### Eclipse Workspace Patch 1.0
>> #P camel-cxf
>> Index:
>>
> src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java
>> ===================================================================
>> ---
>>
> src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java
>>
>> (revision 831871)
>> +++
>>
> src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java
>>
>> (working copy)
>> @@ -271,6 +271,12 @@
>>
>>               propagateResponseHeadersToCamel(outMessage, camelExchange);
>>
>> +            // check if the outMessage has an exception
>> +            Exception exception = outMessage.getContent(Exception.class);
>> +            if (exception != null) {
>> +                camelExchange.setException(exception);
>> +            }
>> +
>>               CachedOutputStream outputStream =
>> (CachedOutputStream)outMessage.getContent(OutputStream.class);
>>               camelExchange.getOut().setBody(outputStream.getBytes());
>>               getLogger().log(Level.FINE, "send the response message: "
>> + outputStream);
>>
>>
>>
>> Schneider Christian wrote:
>>> Hi Claus,
>>>
>>> I have replaced the cxf server with the folowing route:
>>> <route>
>>>      <from
>>>
>>
> uri="jms://queue.net.enbw.services.etg.examples.customerservice.CustomerServ
>>> ice" />
>>>      <transacted/>
>>>      <to uri="serviceImplProc"/>
>>> </route>
>>>
>>> Inside the Processor I simply throw a RuntimeException again. This
>>> configuration works like expected. The transaction is rolled back and the
>>> message gets redelivered. I also had to configure my queue now for
>>> maxRedeliveries to avoid a endless loop.
>>>
>>> Btw. I think the redlivery could also be easily controlled inside camel
> as
>>> Tibco sets the property JMSXDeliveryCount. So I think this could also be
>>> handled in the route if the developer has no access to the jms server
>>> config.
>>>
>>> So this part works great.
>>>
>>> Thanks already for your help
>>>
>>> Christian
>>>
>>> Christian Schneider
>>> Team Handel und Risikomanagement
>>> Informationsverarbeitung Business Solutions Trading
>>> EnBW Systeme Infrastruktur Support GmbH
>>>
>>> Informationsverarbeitung
>>> Business Solutions
>>> Handel und Dispatching
>>> Durlacher Allee 93
>>> 76131 Karlsruhe
>>>
>>> Tel : +49-(0)721-63-15482
>>> Mail: [email protected]
>>>
>>> Sitz der Gesellschaft: Karlsruhe
>>> Handelsregister: Amtsgericht Mannheim   HRB 108550
>>> Vorsitzender des Aufsichtsrats: Dr. Bernhard Beck
>>> Geschäftsführer: Jochen Adenau, Dr. Peter Krampf
>>>
>>> -----Ursprüngliche Nachricht-----
>>> Von: Claus Ibsen [mailto:[email protected]]
>>> Gesendet: Montag, 2. November 2009 14:56
>>> An: [email protected]
>>> Betreff: Re: AW: Problem with SOAP/JMS and transactions
>>>
>>> On Mon, Nov 2, 2009 at 2:47 PM, Schneider Christian
>>> <[email protected]> wrote:
>>>> Hi Willem,
>>>>
>>>> I also suspected it has to do with CXF Wrapping the Exception and not
>>> simply
>>>> rethrowing it. Do you think it would help to use pure CXF JMS Transport?
>>>>
>>>> For the start I will try how Claus suggested to get transactions working
>>>> without CXF. When this works I will try again to get Camel CXF working
>>> with
>>>> it.
>>>>
>>> You may be able to use
>>>
>>> // catch the exceptions here you want to rollback
>>> onException(Exception.class).markRollbackOnly();
>>>
>>> Which let Camel mark it as rollback in the spring TX manager.
>>>
>>> And which hopefully is sufficient to mark it as rollback on the JMS
>>> broker even thought CXF is wrapping the exception.
>>> However this requires that Camel detects the exception before CXF does :)
>>>
>>> And to use the latest code from trunk.
>>>
>>> But try out with CXF at first to get it working.
>>>
>>>
>>>> Greetings
>>>>
>>>> Christian
>>>>
>>>> Christian Schneider
>>>> Team Handel und Risikomanagement
>>>> Informationsverarbeitung Business Solutions Trading
>>>> EnBW Systeme Infrastruktur Support GmbH
>>>>
>>>> Informationsverarbeitung
>>>> Business Solutions
>>>> Handel und Dispatching
>>>> Durlacher Allee 93
>>>> 76131 Karlsruhe
>>>>
>>>> Tel : +49-(0)721-63-15482
>>>> Mail: [email protected]
>>>>
>>>> Sitz der Gesellschaft: Karlsruhe
>>>> Handelsregister: Amtsgericht Mannheim   HRB 108550
>>>> Vorsitzender des Aufsichtsrats: Dr. Bernhard Beck
>>>> Geschäftsführer: Jochen Adenau, Dr. Peter Krampf
>>>>
>>>> -----Ursprüngliche Nachricht-----
>>>> Von: Willem Jiang [mailto:[email protected]]
>>>> Gesendet: Montag, 2. November 2009 14:27
>>>> An: [email protected]
>>>> Betreff: Re: AW: Problem with SOAP/JMS and transactions
>>>>
>>>> Hi Christian,
>>>>
>>>> I think it may relate to the CamelDestination just deal with input and
>>>> output stream.
>>>> As you know if you throw the exception from the service impl, the
>>>> exception will be caught by the CXF interceptor chain and it will be
>>>> turned into a soap fault message, then be passed back to the client.
>>>>
>>>> Since the CamelDestination can't know the under layer message is the
>>>> fault message, it can't throw the exception to let the camel-jms
>>>> component roll back.
>>>>
>>>> Maybe we need to find another way to resolve your issue.
>>>>
>>>> Willem
>>>>
>>>> Schneider Christian wrote:
>>>>> Hi Willem,
>>>>>
>>>>> I have adjusted my applicationContext but still my message gets
>>>> acknowledged
>>>>> instead of being rolled back.
>>>>>
>>>>> My service impl contains:
>>>>>   throw new RuntimeException("Test for transaction");
>>>>>
>>>>> Any idea what still goes wrong?
>>>>>
>>>>> Greetings
>>>>>
>>>>> Christian
>>>>>
>>>>> ----
>>>>>
>>>>> My applicationcontext now looks like the following. I have also added
>>>>> <transacted/> to the route for the server.
>>>>>
>>>>>
>>>>>
>>>>> <beans xmlns="http://www.springframework.org/schema/beans";
>>>>>       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>>>>       xmlns:context="http://www.springframework.org/schema/context";
>>>>>       xsi:schemaLocation="http://www.springframework.org/schema/beans
>>>>> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
>>>>>               http://cxf.apache.org/core
>>>>> http://cxf.apache.org/schemas/core.xsd
>>>>>               http://cxf.apache.org/jaxws
>>>>> http://cxf.apache.org/schemas/jaxws.xsd
>>>>>               http://www.springframework.org/schema/context
>>>>> http://www.springframework.org/schema/context/spring-context-2.5.xsd
>>>>>               http://camel.apache.org/schema/spring
>>>>> http://camel.apache.org/schema/spring/camel-spring.xsd
>>>>>               http://cxf.apache.org/transports/camel
>>>>> http://cxf.apache.org/transports/camel.xsd";
>>>>> <context:annotation-config/>
>>>>>
>>>>>       <import resource="classpath:META-INF/cxf/cxf.xml" />
>>>>>       <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"
>> />
>>>>>       <import resource="classpath:META-INF/cxf/cxf-extension-camel.xml"
>>> />
>>>>>       <import resource="classpath:serviceRuntimeContext.xml" />
>>>>>
>>>>>       <bean id="configProps"
>>>>>
>>>>>
>>
> class="org.springframework.beans.factory.config.PropertyPlaceholderConfigure
>>>>> r">
>>>>>               <property name="locations">
>>>>>                       <list>
>>>>>                               <value>classpath:jms.properties</value>
>>>>>                       </list>
>>>>>               </property>
>>>>>       </bean>
>>>>>
>>>>>       <!-- Make sure to read the best practices for design and
>>>>> implementation before
>>>>>                developing a service for production use.
>>>>>                http://wissen.enbw.net/display/etgsoa/3+-+Design
>>>>>                http://wissen.enbw.net/display/etgsoa/4+-+Entwicklung
>>>>>       -->
>>>>>       <bean id="appModule" class="net.enbw.endur.AppModule">
>>>>>               <property name="customerService" ref="customerService"/>
>>>>>       </bean>
>>>>>
>>>>>       <bean id="serviceImpl" class="net.enbw.endur.ServiceImpl">
>>>>>       </bean>
>>>>>
>>>>>       <!-- SOA configs below  -->
>>>>>
>>>>>       <endpoint id="customerServiceEndpoint"
>>>>> xmlns="http://cxf.apache.org/jaxws";
>>>>>               xmlns:service="http://examples.etg.services.enbw.net/";
>>>>>               serviceName="service:CustomerService"
>>>>>               endpointName="service:CustomerServiceEndpoint"
>>>>>               address="camel://direct:server"
>>>>>               implementor="#serviceImpl">
>>>>>               <features>
>>>>>                       <!-- Enables logging of SOAP messages. -->
>>>>>                       <logging xmlns="http://cxf.apache.org/core"; />
>>>>>               </features>
>>>>>       </endpoint>
>>>>>
>>>>>       <client id="customerService" xmlns="http://cxf.apache.org/jaxws";
>>>>>               xmlns:service="http://examples.etg.services.enbw.net/";
>>>>>               serviceName="service:CustomerService"
>>>>>               endpointName="service:CustomerServiceEndpoint"
>>>>>
>>>>>
>>
> serviceClass="net.enbw.services.etg.examples.customerservice.CustomerService
>>>>> V1"
>>>>>               address="camel://direct:client">
>>>>>               <features>
>>>>>                       <!-- Enables logging of SOAP messages. -->
>>>>>                       <!-- logging xmlns="http://cxf.apache.org/core";
>>> /-->
>>>>>               </features>
>>>>>       </client>
>>>>>
>>>>>       <camelContext id="camelContext" trace="false"
>>>>> xmlns="http://camel.apache.org/schema/spring";>
>>>>>               <route>
>>>>>               <from uri="direct:client"/>
>>>>>               <to
>>>>>
>>
> uri="jms://queue.net.enbw.services.etg.examples.customerservice.CustomerServ
>>>>> ice" />
>>>>>               </route>
>>>>>               <route>
>>>>>               <from
>>>>>
>>
> uri="jms://queue.net.enbw.services.etg.examples.customerservice.CustomerServ
>>>>> ice" />
>>>>>               <transacted/>
>>>>>               <to uri="direct:server" />
>>>>>               </route>
>>>>>       </camelContext>
>>>>>
>>>>>       <!-- See http://camel.apache.org/jms.html -->
>>>>>       <bean id="jms"
>>>>>               class="org.apache.camel.component.jms.JmsComponent">
>>>>>               <constructor-arg index="0">
>>>>>                       <ref bean="jmsConfiguration" />
>>>>>               </constructor-arg>
>>>>>               <property name="connectionFactory"
>>>>> ref="jmsConnectionFactory" />
>>>>>       </bean>
>>>>>       <bean id="jmsConfiguration"
>>>>>               class="org.apache.camel.component.jms.JmsConfiguration">
>>>>>               <property name="useMessageIDAsCorrelationID" value="true"
>>> />
>>>>>               <property name="acknowledgementModeName"
>> value="TRANSACTED"
>>>>> />
>>>>>               <property name="explicitQosEnabled" value="true" />
>>>>>               <property name="receiveTimeout"
>>>>> value="${jms.receiveTimeout}" />
>>>>>               <property name="requestTimeout"
>>>>> value="${jms.requestTimeout}" />
>>>>>               <property name="recoveryInterval"
>>>>> value="${jms.recoveryInterval}" />
>>>>>               <property name="timeToLive" value="${jms.timeToLive}" />
>>>>>               <property name="transacted" value="true" />
>>>>>               <property name="transactedInOut" value="true" />
>>>>>               <property name="transactionManager"
>>>>> ref="jmsTransactionManager"/>
>>>>>       </bean>
>>>>>
>>>>>       <bean id="jmsTransactionManager"
>>>>> class="org.springframework.jms.connection.JmsTransactionManager">
>>>>>               <property name="connectionFactory"
>>>>> ref="jmsConnectionFactory" />
>>>>>       </bean>
>>>>>
>>>>>       <!--  See Tibco EMS documentation  -->
>>>>>       <bean id="jmsConnectionFactory"
>>>>>               class="com.tibco.tibjms.TibjmsConnectionFactory">
>>>>>               <property name="serverUrl" value="${jms.serverUrl}" />
>>>>>               <property name="userName" value="${jms.userName}" />
>>>>>               <property name="userPassword" value="${jms.userPassword}"
>>> />
>>>>>               <property name="reconnAttemptCount"
>>>>> value="${jms.reconnAttemptCount}" />
>>>>>               <property name="reconnAttemptDelay"
>>>>> value="${jms.reconnAttemptDelay}" />
>>>>>       </bean>
>>>>>
>>>>> </beans>
>>>>>
>>>
>>>
>>
>>
>
>



-- 
Claus Ibsen
Apache Camel Committer

Author of Camel in Action: http://www.manning.com/ibsen/
Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus

Reply via email to