1
2
3
4
5
6
7
8
9
10 package org.mule.transport;
11
12 import org.mule.api.MessagingException;
13 import org.mule.api.MuleEvent;
14 import org.mule.api.MuleMessage;
15 import org.mule.api.MuleSession;
16 import org.mule.api.endpoint.InboundEndpoint;
17 import org.mule.api.transaction.Transaction;
18 import org.mule.api.transaction.TransactionCallback;
19 import org.mule.api.transaction.TransactionException;
20 import org.mule.api.transport.SessionHandler;
21 import org.mule.session.LegacySessionHandler;
22 import org.mule.session.MuleSessionHandler;
23 import org.mule.transaction.TransactionCoordination;
24 import org.mule.transaction.TransactionTemplate;
25
26 import java.io.OutputStream;
27 import java.util.ArrayList;
28 import java.util.List;
29
30 import javax.resource.spi.work.Work;
31
32 import org.apache.commons.lang.SerializationException;
33
34
35
36
37 public abstract class AbstractReceiverWorker implements Work
38 {
39 protected List<Object> messages;
40 protected InboundEndpoint endpoint;
41 protected AbstractMessageReceiver receiver;
42 protected OutputStream out;
43
44 public AbstractReceiverWorker(List<Object> messages, AbstractMessageReceiver receiver)
45 {
46 this(messages, receiver, null);
47 }
48
49 public AbstractReceiverWorker(List<Object> messages, AbstractMessageReceiver receiver, OutputStream out)
50 {
51 this.messages = messages;
52 this.receiver = receiver;
53 this.endpoint = receiver.getEndpoint();
54 this.out = out;
55 }
56
57
58
59
60
61 public final void run()
62 {
63 doRun();
64 release();
65 }
66
67 protected void doRun()
68 {
69 try
70 {
71 processMessages();
72 }
73 catch (MessagingException e)
74 {
75 receiver.getFlowConstruct().getExceptionListener().handleException(e, e.getEvent());
76 }
77 catch (Exception e)
78 {
79 receiver.getConnector().getMuleContext().getExceptionListener().handleException(e);
80 }
81 }
82
83
84
85
86
87
88 public void processMessages() throws Exception
89 {
90 TransactionTemplate tt = new TransactionTemplate(endpoint.getTransactionConfig(), receiver.getConnector().getMuleContext());
91
92
93
94
95 TransactionCallback<?> cb = new TransactionCallback()
96 {
97 public Object doInTransaction() throws Exception
98 {
99 Transaction tx = TransactionCoordination.getInstance().getTransaction();
100 if (tx != null)
101 {
102 bindTransaction(tx);
103 }
104 List<Object> results = new ArrayList<Object>(messages.size());
105
106 for (Object payload : messages)
107 {
108 payload = preProcessMessage(payload);
109 if (payload != null)
110 {
111 MuleMessage muleMessage = receiver.createMuleMessage(payload, endpoint.getEncoding());
112 preRouteMuleMessage(muleMessage);
113
114
115 SessionHandler handler;
116 if (endpoint.getConnector() instanceof AbstractConnector)
117 {
118 handler = ((AbstractConnector) endpoint.getConnector()).getSessionHandler();
119 }
120 else
121 {
122 handler = new MuleSessionHandler();
123 }
124 MuleSession session;
125 try
126 {
127 session = handler.retrieveSessionInfoFromMessage(muleMessage);
128 }
129 catch (SerializationException e)
130 {
131
132 session = new LegacySessionHandler().retrieveSessionInfoFromMessage(muleMessage);
133 }
134
135 MuleEvent resultEvent;
136 if (session != null)
137 {
138 resultEvent = receiver.routeMessage(muleMessage, session, tx, out);
139 }
140 else
141 {
142 resultEvent = receiver.routeMessage(muleMessage, tx, out);
143 }
144 MuleMessage result = resultEvent == null ? null : resultEvent.getMessage();
145 if (result != null)
146 {
147 payload = postProcessMessage(result);
148 if (payload != null)
149 {
150 results.add(payload);
151 }
152 }
153 }
154 }
155 return results;
156 }
157 };
158
159 try
160 {
161 List results = (List) tt.execute(cb);
162 handleResults(results);
163 }
164 finally
165 {
166 messages.clear();
167 }
168 }
169
170
171
172
173
174
175
176
177 protected void preRouteMuleMessage(MuleMessage message) throws Exception
178 {
179
180 }
181
182
183
184
185
186
187
188 protected abstract void bindTransaction(Transaction tx) throws TransactionException;
189
190
191
192
193
194
195
196 protected void handleResults(List messages) throws Exception
197 {
198
199 }
200
201
202
203
204
205
206
207
208 protected Object preProcessMessage(Object message) throws Exception
209 {
210
211 return message;
212 }
213
214
215
216
217
218
219
220
221
222 protected MuleMessage postProcessMessage(MuleMessage message) throws Exception
223 {
224
225 return message;
226 }
227
228
229
230
231
232
233 public void release()
234 {
235
236 }
237 }