View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.processor;
8   
9   import org.mule.api.MessagingException;
10  import org.mule.api.MuleEvent;
11  import org.mule.api.MuleException;
12  import org.mule.api.processor.MessageProcessor;
13  import org.mule.api.transaction.TransactionCallback;
14  import org.mule.api.transaction.TransactionConfig;
15  import org.mule.config.i18n.CoreMessages;
16  import org.mule.transaction.TransactionTemplate;
17  
18  /**
19   * Wraps the invocation of the next {@link MessageProcessor} with a transaction. If
20   * the {@link TransactionConfig} is null then no transaction is used and the next
21   * {@link MessageProcessor} is invoked directly.
22   */
23  public class TransactionalInterceptingMessageProcessor extends AbstractInterceptingMessageProcessor
24  {
25      protected TransactionConfig transactionConfig;
26  
27      public TransactionalInterceptingMessageProcessor(TransactionConfig transactionConfig)
28      {
29          this.transactionConfig = transactionConfig;
30      }
31  
32      public MuleEvent process(final MuleEvent event) throws MuleException
33      {
34          if (next == null)
35          {
36              return event;
37          }
38          else
39          {
40              TransactionTemplate<MuleEvent> tt = new TransactionTemplate<MuleEvent>(transactionConfig, event.getMuleContext());
41              TransactionCallback<MuleEvent> cb = new TransactionCallback<MuleEvent>()
42              {
43                  public MuleEvent doInTransaction() throws Exception
44                  {
45                      return processNext(event);
46                  }
47              };
48  
49              try
50              {
51                  return tt.execute(cb);
52              }
53              catch (MessagingException e)
54              {
55                  throw e;
56              }
57              catch (Exception e)
58              {
59                  throw new MessagingException(CoreMessages.errorInvokingMessageProcessorWithinTransaction(
60                      next, transactionConfig), event, e);
61              }
62          }
63      }
64  }