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