Hi Robert,

this doc from redhat might help:
https://access.redhat.com/documentation/en-us/red_hat_jboss_fuse/6.2.1/html/transaction_guide/xajms

The key part is to use an ActiveMQXAConnectionFactory and wrap it with a
JcaPooledConnectionFactory. There you inject the transaction manager.

Christian



Am Do., 25. Okt. 2018 um 10:09 Uhr schrieb Robert . <
[email protected]>:

> I'm using CXF 3.2.6 and Spring 5.1.0 to create a HTTP SOAP webservice that
> uses a JaxWsProxyFactoryBean to call a (one-way) webservice over SOAP JMS.
> I would like the message not to be sent if an exception occurs in the
> (local) webservice method. So I would like the method to run in a
> transaction that commits or rollbacks sending a JMS message.
>
> I have tried several ways to inject the transactional behavior I added the
> Transactional annotation to MyHttpWebServiceImpl and defined a
> JmsTransactionManager bean, create a JMSConfiguration that sets the
> transaction manager, and add the feature to the endpoint. However this has
> no effect. The setTransactionManager is also deprecated, but it doesn't
> specify what I should do instead. The ActiveMQConnectionFactory
> unfortunately also has no method to set a transaction manager. I found very
> little documentation how Spring transactions and CXF should play together.
> Example code without transactional support:
>
> @Servicepublic class MyHttpWebServiceImpl implements MyHttpWebService {
>     private MyJmsWebService client;
>
>     public void set(MyJmsWebService client) {
>         this.client = client;
>     }
>
>     public MyResponse update(MyRequest request) {
>         client.update(request);
>         throw new RuntimeException("test rollback"); //doesn't work
>     }    }
> @Configurationpublic class MyConfiguration {
>     // JMS webservice endpoint configuration ommitted
>     private MyHttpWebService webService;
>
>     @AutoWired
>     public void setWebService(MyHttpWebService webService) {
>         this.webService = webService;
>     }
>
>     @Bean
>     public ConnectionFactory getConnectionFactory() {
>         ActiveMQConnectionFactory factory = new
> ActiveMQConnectionFactory();
>         factory.setBrokerURL("tcp://localhost:61616");
>         return factory;
>     }
>
>     @Bean(name = Bus.DEFAULT_BUS_ID)
>     public SpringBus springBus() {
>         return new SpringBus();
>     }
>
>     @Bean
>     public Endpoint httpSoapEndpoint() {
>         EndpointImpl endpoint = new EndpointImpl(springBus(), webService);
>         endpoint.publish("/myws");
>         return endpoint;
>     }
>
>     @Bean
>     public MyJmsWebService client() {
>         return (MyJmsWebService) proxyFactoryBean().create();
>     }
>
>     @Bean
>     public JaxWsProxyFactoryBean proxyFactoryBean() {
>         String address = "jms:queue:MyQueue?sessionTransacted=true";
>         JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
>         factory.setFeatures(Collections.singletonList(new
> ConnectionFactoryFeature(connectionFactory)));
>
> factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
>         factory.setServiceClass(MyJmsWebService.class);
>         factory.setAddress(address);
>         return factory;
>     }}
>


-- 
-- 
Christian Schneider
http://www.liquid-reality.de

Computer Scientist
http://www.adobe.com

Reply via email to