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