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