1
2
3
4
5
6
7
8
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
29
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
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
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
105 }
106
107 @Override
108 protected void doConnect() throws Exception
109 {
110 if (!endpoint.getExchangePattern().hasResponse())
111 {
112
113 connector.getQueueProfile().configureQueue(
114 endpoint.getEndpointURI().getAddress(), connector.getQueueManager());
115 }
116 }
117
118 @Override
119 protected void doDisconnect() throws Exception
120 {
121
122 }
123
124 }