1
2
3
4
5
6
7
8
9
10 package org.mule.transport;
11
12 import org.mule.api.MuleContext;
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
68
69
70
71
72 protected void doRun()
73 {
74
75
76 final MuleContext muleContext = receiver.getConnector().getMuleContext();
77 TransactionTemplate tt = new TransactionTemplate(endpoint.getTransactionConfig(), muleContext);
78
79
80
81
82 TransactionCallback<?> cb = new TransactionCallback()
83 {
84 public Object doInTransaction() throws Exception
85 {
86 Transaction tx = TransactionCoordination.getInstance().getTransaction();
87 if (tx != null)
88 {
89 bindTransaction(tx);
90 }
91 List<Object> results = new ArrayList<Object>(messages.size());
92
93 for (Object payload : messages)
94 {
95 payload = preProcessMessage(payload);
96 if (payload != null)
97 {
98 MuleMessage muleMessage = receiver.createMuleMessage(payload, endpoint.getEncoding());
99 preRouteMuleMessage(muleMessage);
100
101
102 SessionHandler handler;
103 if (endpoint.getConnector() instanceof AbstractConnector)
104 {
105 handler = ((AbstractConnector) endpoint.getConnector()).getSessionHandler();
106 }
107 else
108 {
109 handler = new MuleSessionHandler();
110 }
111 MuleSession session;
112 try
113 {
114 session = handler.retrieveSessionInfoFromMessage(muleMessage);
115 }
116 catch (SerializationException e)
117 {
118
119 session = new LegacySessionHandler().retrieveSessionInfoFromMessage(muleMessage);
120 }
121
122 MuleEvent resultEvent;
123 if (session != null)
124 {
125 resultEvent = receiver.routeMessage(muleMessage, session, tx, out);
126 }
127 else
128 {
129 resultEvent = receiver.routeMessage(muleMessage, tx, out);
130 }
131 MuleMessage result = resultEvent == null ? null : resultEvent.getMessage();
132 if (result != null)
133 {
134 payload = postProcessMessage(result);
135 if (payload != null)
136 {
137 results.add(payload);
138 }
139 }
140 }
141 }
142 return results;
143 }
144 };
145
146 try
147 {
148 List results = (List) tt.execute(cb);
149 handleResults(results);
150 }
151 catch (Exception e)
152 {
153 muleContext.getExceptionListener().handleException(e);
154 }
155 finally
156 {
157 messages.clear();
158 }
159 }
160
161
162
163
164
165
166
167
168 protected void preRouteMuleMessage(MuleMessage message) throws Exception
169 {
170
171 }
172
173
174
175
176
177
178
179 protected abstract void bindTransaction(Transaction tx) throws TransactionException;
180
181
182
183
184
185
186
187 protected void handleResults(List messages) throws Exception
188 {
189
190 }
191
192
193
194
195
196
197
198
199 protected Object preProcessMessage(Object message) throws Exception
200 {
201
202 return message;
203 }
204
205
206
207
208
209
210
211
212
213 protected MuleMessage postProcessMessage(MuleMessage message) throws Exception
214 {
215
216 return message;
217 }
218
219
220
221
222
223
224 public void release()
225 {
226
227 }
228 }