1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.vm;
12
13 import org.mule.DefaultMuleMessage;
14 import org.mule.api.DefaultMuleException;
15 import org.mule.api.MuleEvent;
16 import org.mule.api.MuleException;
17 import org.mule.api.MuleMessage;
18 import org.mule.api.construct.FlowConstruct;
19 import org.mule.api.endpoint.InboundEndpoint;
20 import org.mule.api.lifecycle.CreateException;
21 import org.mule.api.transport.Connector;
22 import org.mule.api.transport.PropertyScope;
23 import org.mule.transport.PollingReceiverWorker;
24 import org.mule.transport.TransactedPollingMessageReceiver;
25 import org.mule.util.queue.Queue;
26 import org.mule.util.queue.QueueSession;
27
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.LinkedList;
31 import java.util.List;
32 import java.util.Map;
33
34 import javax.activation.DataHandler;
35
36 import edu.emory.mathcs.backport.java.util.concurrent.RejectedExecutionException;
37
38
39
40
41
42 public class VMMessageReceiver extends TransactedPollingMessageReceiver
43 {
44
45 private VMConnector connector;
46
47 public VMMessageReceiver(Connector connector, FlowConstruct flowConstruct, InboundEndpoint endpoint)
48 throws CreateException
49 {
50 super(connector, flowConstruct, endpoint);
51 this.setReceiveMessagesInTransaction(endpoint.getTransactionConfig().isTransacted());
52 this.connector = (VMConnector) connector;
53 }
54
55
56
57
58
59 @Override
60 protected void schedule() throws RejectedExecutionException, NullPointerException, IllegalArgumentException
61 {
62 if (!endpoint.getExchangePattern().hasResponse())
63 {
64 super.schedule();
65 }
66 }
67
68 @Override
69 protected void doDispose()
70 {
71
72 }
73
74 @Override
75 protected void doConnect() throws Exception
76 {
77 if (!endpoint.getExchangePattern().hasResponse())
78 {
79
80 QueueSession queueSession = connector.getQueueSession();
81 Queue q = queueSession.getQueue(endpoint.getEndpointURI().getAddress());
82 if (logger.isDebugEnabled())
83 {
84 logger.debug("Current queue depth for queue: " + endpoint.getEndpointURI().getAddress() + " is: "
85 + q.size());
86 }
87 }
88 }
89
90 @Override
91 protected void doDisconnect() throws Exception
92 {
93
94 }
95
96 public void onMessage(MuleMessage message) throws MuleException
97 {
98
99 MuleMessage newMessage = new DefaultMuleMessage(message.getPayload(), message, connector.getMuleContext());
100 routeMessage(newMessage);
101 }
102
103 public MuleMessage onCall(MuleMessage message, boolean synchronous) throws MuleException
104 {
105 try
106 {
107
108 MuleMessage newMessage = message.createInboundMessage();
109 MuleEvent event = routeMessage(newMessage);
110 MuleMessage returnedMessage = event == null ? null : event.getMessage();
111 if (returnedMessage != null)
112 {
113 returnedMessage = returnedMessage.createInboundMessage();
114 }
115 return returnedMessage;
116 }
117 catch (Exception e)
118 {
119 throw new DefaultMuleException(e);
120 }
121 }
122
123
124
125
126 @Override
127 protected List<MuleMessage> getMessages() throws Exception
128 {
129 if (isReceiveMessagesInTransaction())
130 {
131 MuleEvent message = getFirstMessage();
132 if (message == null)
133 {
134 return null;
135 }
136
137 List<MuleMessage> messages = new ArrayList<MuleMessage>(1);
138 messages.add(message.getMessage());
139 return messages;
140 }
141 else
142 {
143 return getFirstMessages();
144 }
145 }
146
147 protected List<MuleMessage> getFirstMessages() throws Exception
148 {
149
150 QueueSession qs = connector.getQueueSession();
151 Queue queue = qs.getQueue(endpoint.getEndpointURI().getAddress());
152
153
154 List<MuleMessage> messages = new LinkedList<MuleMessage>();
155
156
157
158
159
160
161
162 int maxThreads = connector.getReceiverThreadingProfile().getMaxThreadsActive();
163
164 int batchSize = Math.max(1, Math.min(queue.size(), ((maxThreads / 2) - 1)));
165
166
167 MuleEvent message = (MuleEvent) queue.poll(connector.getQueueTimeout());
168
169 if (message != null)
170 {
171
172 messages.add(message.getMessage());
173
174
175 for (int i = 0; i < batchSize && message != null; i++)
176 {
177 message = (MuleEvent)queue.poll(0);
178 if (message != null)
179 {
180 messages.add(message.getMessage());
181 }
182 }
183 }
184
185
186 return messages;
187 }
188
189 protected MuleEvent getFirstMessage() throws Exception
190 {
191
192 QueueSession qs = connector.getQueueSession();
193 Queue queue = qs.getQueue(endpoint.getEndpointURI().getAddress());
194
195 return (MuleEvent) queue.poll(connector.getQueueTimeout());
196 }
197
198 @Override
199 protected void processMessage(Object msg) throws Exception
200 {
201 MuleMessage message = (MuleMessage) msg;
202
203
204 MuleMessage newMessage = message.createInboundMessage();
205 routeMessage(newMessage);
206 }
207
208
209
210
211 @Override
212 protected PollingReceiverWorker createWork()
213 {
214 return new VMReceiverWorker(this);
215 }
216
217
218
219
220
221
222 protected static class VMReceiverWorker extends PollingReceiverWorker
223 {
224
225 public VMReceiverWorker(VMMessageReceiver pollingMessageReceiver)
226 {
227 super(pollingMessageReceiver);
228 }
229
230 @Override
231 public void run()
232 {
233
234
235
236
237
238 while (this.getReceiver().isConnected())
239 {
240 super.run();
241 }
242 }
243 }
244
245 }