...
Transaction Oriented Endpoints (Camel Toes) like JMS support using a transaction for both inbound and outbound message exchanges. Endpoints that support transactions will participate in the current transaction context that they are called from.
...
...
The redelivery in transacted mode is not handled by Camel but by the backing system (the transaction manager). In such cases you should resort to the backing system how to configure the redelivery.
You should use the SpringRouteBuilder to setup the routes since you will need to setup the spring context with the TransactionTemplates that will define the transaction manager configuration and policies.
...
You first define needed object in the spring configuration.
...
...
Then you look them up and use them to create the JmsComponent.
...
...
Transaction Policies
Outbound endpoints will automatically enlist in the current transaction context. But what if you do not want your outbound endpoint to enlist in the same transaction as your inbound endpoint? The solution is to add a Transaction Policy to the processing route. You first have to define transaction policies that you will be using. The policies use a spring TransactionTemplate under the covers for declaring the transaction demarcation to use. So you will need to add something like the following to your spring xml:
...
...
Then in your SpringRouteBuilder, you just need to create new SpringTransactionPolicy objects for each of the templates.
...
...
Once created, you can use the Policy objects in your processing routes:
...
...
OSGi Blueprint
If you are using OSGi Blueprint then you most likely have to explicit declare a policy and refer to the policy from the transacted in the route.
...
...
And then refer to "required" from the route:
...
Database Sample
In this sample we want to ensure that two endpoints is under transaction control. These two endpoints inserts data into a database.
The sample is in its full as a unit test.
...
As we use the new convention over configuration we do not need to configure a transaction policy bean, so we do not have any PROPAGATION_REQUIRED
beans. All the beans needed to be configured is standard Spring beans only, eg. there are no Camel specific configuration at all.
...
...
Then we are ready to define our Camel routes. We have two routes: 1 for success conditions, and 1 for a forced rollback condition.
This is after all based on a unit test. Notice that we mark each route as transacted using the transacted tag.
...
...
That is all that is needed to configure a Camel route as being transacted. Just remember to use the transacted DSL. The rest is standard Spring XML to setup the transaction manager.
...
First we configure the standard Spring XML to declare a JMS connection factory, a JMS transaction manager and our ActiveMQ component that we use in our routing.
...
...
And then we configure our routes. Notice that all we have to do is mark the route as transacted using the transacted tag.
...
...
When a route is marked as transacted using transacted Camel will automatic use the TransactionErrorHandler as Error Handler. It supports basically the same feature set as the DefaultErrorHandler, so you can for instance use Exception Clause as well.
Integration Testing with Spring
...
An Integration Test here means a test runner class annotated @RunWith(SpringJUnit4ClassRunner.class).
...
This is configured in the Spring XML file:
...
...
Then in the routes you use transacted DSL to indicate which of these two propagations it uses.
...
...
Notice how we have configured the onException
in the 2nd route to indicate in case of any exceptions we should handle it and just rollback this transaction. This is done using the markRollbackOnlyLast
which tells Camel to only do it for the current transaction and not globally.
...
...