View Javadoc

1   /*
2    * $Id: VMMessageDispatcher.java 19749 2010-09-28 04:37:54Z 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.transport.vm;
12  
13  import org.mule.api.MuleEvent;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.endpoint.EndpointURI;
16  import org.mule.api.endpoint.OutboundEndpoint;
17  import org.mule.api.transaction.TransactionCallback;
18  import org.mule.api.transport.DispatchException;
19  import org.mule.api.transport.NoReceiverForEndpointException;
20  import org.mule.config.i18n.CoreMessages;
21  import org.mule.transaction.TransactionTemplate;
22  import org.mule.transport.AbstractMessageDispatcher;
23  import org.mule.transport.vm.i18n.VMMessages;
24  import org.mule.util.queue.Queue;
25  import org.mule.util.queue.QueueSession;
26  
27  /**
28   * <code>VMMessageDispatcher</code> is used for providing in memory interaction
29   * between components.
30   */
31  public class VMMessageDispatcher extends AbstractMessageDispatcher
32  {
33      private final VMConnector connector;
34  
35      public VMMessageDispatcher(OutboundEndpoint endpoint)
36      {
37          super(endpoint);
38          this.connector = (VMConnector) endpoint.getConnector();
39      }
40  
41      @Override
42      protected void doDispatch(final MuleEvent event) throws Exception
43      {
44          EndpointURI endpointUri = endpoint.getEndpointURI();
45  
46          if (endpointUri == null)
47          {
48              throw new DispatchException(CoreMessages.objectIsNull("Endpoint"), event,
49                  (OutboundEndpoint) endpoint);
50          }
51          QueueSession session = connector.getQueueSession();
52          Queue queue = session.getQueue(endpointUri.getAddress());
53          if (!queue.offer(event, connector.getQueueTimeout()))
54          {
55              // queue is full
56              throw new DispatchException(VMMessages.queueIsFull(queue.getName(), queue.size()),
57                      event, (OutboundEndpoint) endpoint);
58          }
59          if (logger.isDebugEnabled())
60          {
61              logger.debug("dispatched MuleEvent on endpointUri: " + endpointUri);
62          }
63      }
64  
65      @Override
66      protected MuleMessage doSend(final MuleEvent event) throws Exception
67      {
68          MuleMessage retMessage;
69          EndpointURI endpointUri = event.getEndpoint().getEndpointURI();
70          final VMMessageReceiver receiver = connector.getReceiver(endpointUri);
71          // Apply any outbound transformers on this event before we dispatch
72  
73          if (receiver == null)
74          {
75              throw new NoReceiverForEndpointException(VMMessages.noReceiverForEndpoint(connector.getName(),
76                                                                                        event.getEndpoint().getEndpointURI()));
77          }
78  
79          MuleMessage message = event.getMessage();
80          connector.getSessionHandler().storeSessionInfoToMessage(event.getSession(), message);
81          TransactionTemplate<MuleMessage> tt = new TransactionTemplate<MuleMessage>(
82                                                              receiver.getEndpoint().getTransactionConfig(),
83                                                              event.getMuleContext());
84  
85          TransactionCallback<MuleMessage> cb = new TransactionCallback<MuleMessage>()
86          {
87              public MuleMessage doInTransaction() throws Exception
88              {
89                  return receiver.onCall(event.getMessage());
90              }
91          };
92          retMessage = tt.execute(cb);
93          
94          if (logger.isDebugEnabled())
95          {
96              logger.debug("sent event on endpointUri: " + event.getEndpoint().getEndpointURI());
97          }
98          return retMessage;
99      }
100 
101     @Override
102     protected void doDispose()
103     {
104         // template method
105     }
106 
107     @Override
108     protected void doConnect() throws Exception
109     {
110         if (!endpoint.getExchangePattern().hasResponse())
111         {
112             // use the default queue profile to configure this queue.
113             connector.getQueueProfile().configureQueue(
114                     endpoint.getEndpointURI().getAddress(), connector.getQueueManager());
115         }
116     }
117 
118     @Override
119     protected void doDisconnect() throws Exception
120     {
121         // template method
122     }
123 
124 }