Hi, I am currently trying to get transactions for SOAP/JMS running. I am using camel-cxf for SOAP handling and camel-jms for jms connections.
I have a request reply service that should be able to do three different things: - no exception occurs in the implementation: The jms Message should be committed and the normal reply should be sent - The implementation throws an exception defined in the service contract: The jms message should be committed and a fault should be sent - The implemementation throws another kind of exception: The message should be rolled back so it can be received again In my service impl I tried throwing a RuntimeException or Error. In both cases my jms message was committed and a fault was sent back to the client. I have attached my spring config. Is there anything I have to add to control how exceptions influence the transaction? I also have another question. When my transaction is rolled back, how can I avoid running into an endless loop where the server always consumes the message and then rolls it back because of the exception? 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 ------ <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" /> <bean id="configProps" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigure r"> <property name="locations"> <list> <value>classpath:jms.properties</value> </list> </property> </bean> <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://jms:queue.net.enbw.services.etg.examples.customerservice.Cu stomerService" 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://jms:queue.net.enbw.services.etg.examples.customerservice.Cu stomerService"> <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"> </camelContext> <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> <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>
