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