View Javadoc

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