1
2
3
4
5
6
7
8
9
10
11 package org.mule.providers.vm;
12
13 import org.mule.impl.MuleMessage;
14 import org.mule.providers.PollingReceiverWorker;
15 import org.mule.providers.TransactedPollingMessageReceiver;
16 import org.mule.umo.UMOComponent;
17 import org.mule.umo.UMOEvent;
18 import org.mule.umo.UMOException;
19 import org.mule.umo.UMOMessage;
20 import org.mule.umo.endpoint.UMOEndpoint;
21 import org.mule.umo.lifecycle.InitialisationException;
22 import org.mule.umo.provider.UMOConnector;
23 import org.mule.util.queue.Queue;
24 import org.mule.util.queue.QueueSession;
25
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(UMOConnector connector, UMOComponent component, UMOEndpoint endpoint)
42 throws InitialisationException
43 {
44 super(connector, component, endpoint);
45 this.setReceiveMessagesInTransaction(endpoint.getTransactionConfig().isTransacted());
46 this.connector = (VMConnector) connector;
47 }
48
49
50
51
52
53
54 protected void schedule()
55 throws RejectedExecutionException, NullPointerException, IllegalArgumentException
56 {
57 if (connector.isQueueEvents())
58 {
59 super.schedule();
60 }
61 }
62
63 protected void doDispose()
64 {
65
66 }
67
68 protected void doConnect() throws Exception
69 {
70 if (connector.isQueueEvents())
71 {
72
73 QueueSession queueSession = connector.getQueueSession();
74 Queue q = queueSession.getQueue(endpoint.getEndpointURI().getAddress());
75 if (logger.isDebugEnabled())
76 {
77 logger.debug("Current queue depth for queue: " + endpoint.getEndpointURI().getAddress()
78 + " is: " + q.size());
79 }
80 }
81 }
82
83 protected void doDisconnect() throws Exception
84 {
85
86 }
87
88 public void onEvent(UMOEvent event) throws UMOException
89 {
90
91
92
93
94
95 UMOMessage msg = new MuleMessage(event.getTransformedMessage(), event.getMessage());
96 synchronized (lock)
97 {
98 routeMessage(msg);
99 }
100 }
101
102 public Object onCall(UMOEvent event) throws UMOException
103 {
104 UMOMessage msg = new MuleMessage(event.getTransformedMessage(), event.getMessage());
105 return routeMessage(msg, event.isSynchronous());
106 }
107
108 protected List getMessages() throws Exception
109 {
110
111 QueueSession qs = connector.getQueueSession();
112 Queue queue = qs.getQueue(endpoint.getEndpointURI().getAddress());
113
114
115 List messages = new LinkedList();
116
117
118
119
120
121
122
123
124 int maxThreads = connector.getReceiverThreadingProfile().getMaxThreadsActive();
125
126 int batchSize = Math.max(1, Math.min(queue.size(), ((maxThreads / 2) - 1)));
127
128
129 UMOEvent event = (UMOEvent) queue.poll(connector.getQueueTimeout());
130
131 if (event != null)
132 {
133
134 messages.add(event);
135
136
137 for (int i = 0; i < batchSize && event != null; i++)
138 {
139 event = (UMOEvent) queue.poll(0);
140 if (event != null)
141 {
142 messages.add(event);
143 }
144 }
145 }
146
147
148 return messages;
149 }
150
151 protected void processMessage(Object msg) throws Exception
152 {
153
154 UMOEvent event = (UMOEvent) msg;
155 UMOMessage message = new MuleMessage(event.getTransformedMessage(), event.getMessage());
156 routeMessage(message);
157 }
158
159
160
161
162
163 protected PollingReceiverWorker createWork()
164 {
165 return new VMReceiverWorker(this);
166 }
167
168
169
170
171
172
173 protected static class VMReceiverWorker extends PollingReceiverWorker
174 {
175
176 public VMReceiverWorker(VMMessageReceiver pollingMessageReceiver)
177 {
178 super(pollingMessageReceiver);
179 }
180
181 public void run()
182 {
183
184
185
186
187
188 while (this.getReceiver().isConnected())
189 {
190 super.run();
191 }
192 }
193 }
194
195 }