1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.vm;
12
13 import org.mule.DefaultMuleEvent;
14 import org.mule.api.MuleEvent;
15 import org.mule.api.MuleMessage;
16 import org.mule.api.endpoint.EndpointURI;
17 import org.mule.api.endpoint.OutboundEndpoint;
18 import org.mule.api.transaction.TransactionCallback;
19 import org.mule.api.transport.DispatchException;
20 import org.mule.api.transport.NoReceiverForEndpointException;
21 import org.mule.config.i18n.CoreMessages;
22 import org.mule.transaction.TransactionTemplate;
23 import org.mule.transport.AbstractMessageDispatcher;
24 import org.mule.transport.vm.i18n.VMMessages;
25 import org.mule.util.queue.Queue;
26 import org.mule.util.queue.QueueSession;
27
28
29
30
31
32 public class VMMessageDispatcher extends AbstractMessageDispatcher
33 {
34 private final VMConnector connector;
35
36 public VMMessageDispatcher(OutboundEndpoint endpoint)
37 {
38 super(endpoint);
39 this.connector = (VMConnector) endpoint.getConnector();
40 }
41
42 @Override
43 protected void doDispatch(final MuleEvent event) throws Exception
44 {
45 EndpointURI endpointUri = endpoint.getEndpointURI();
46
47 if (endpointUri == null)
48 {
49 throw new DispatchException(CoreMessages.objectIsNull("Endpoint"), event,
50 getEndpoint());
51 }
52 MuleMessage newMessage = event.getMessage().createInboundMessage();
53 MuleEvent newEvent = new DefaultMuleEvent(newMessage, event);
54 QueueSession session = connector.getQueueSession();
55 Queue queue = session.getQueue(endpointUri.getAddress());
56 if (!queue.offer(newEvent, connector.getQueueTimeout()))
57 {
58
59 throw new DispatchException(VMMessages.queueIsFull(queue.getName(), queue.size()),
60 newEvent, getEndpoint());
61 }
62 if (logger.isDebugEnabled())
63 {
64 logger.debug("dispatched MuleEvent on endpointUri: " + endpointUri);
65 }
66 }
67
68 @Override
69 protected MuleMessage doSend(final MuleEvent event) throws Exception
70 {
71 MuleMessage retMessage;
72 final VMMessageReceiver receiver = connector.getReceiver(endpoint.getEndpointURI());
73
74
75 if (receiver == null)
76 {
77 throw new NoReceiverForEndpointException(VMMessages.noReceiverForEndpoint(connector.getName(),
78 endpoint.getEndpointURI()));
79 }
80
81 final MuleMessage message = event.getMessage().createInboundMessage();
82 TransactionTemplate<MuleMessage> tt = new TransactionTemplate<MuleMessage>(
83 receiver.getEndpoint().getTransactionConfig(),
84 event.getMuleContext());
85
86 TransactionCallback<MuleMessage> cb = new TransactionCallback<MuleMessage>()
87 {
88 public MuleMessage doInTransaction() throws Exception
89 {
90 return receiver.onCall(message);
91 }
92 };
93 retMessage = tt.execute(cb);
94
95 if (logger.isDebugEnabled())
96 {
97 logger.debug("sent event on endpointUri: " +endpoint.getEndpointURI());
98 }
99 if (retMessage != null)
100 {
101 retMessage = retMessage.createInboundMessage();
102 }
103 return retMessage;
104 }
105
106 @Override
107 protected void doDispose()
108 {
109
110 }
111
112 @Override
113 protected void doConnect() throws Exception
114 {
115 if (!endpoint.getExchangePattern().hasResponse())
116 {
117
118 connector.getQueueProfile().configureQueue(
119 connector.getMuleContext(), endpoint.getEndpointURI().getAddress(), connector.getQueueManager());
120 }
121 }
122
123 @Override
124 protected void doDisconnect() throws Exception
125 {
126
127 }
128
129 }