1
2
3
4
5
6
7
8
9
10 package org.mule.transport;
11
12 import org.mule.DefaultMuleMessage;
13 import org.mule.MuleServer;
14 import org.mule.api.MuleContext;
15 import org.mule.api.MuleMessage;
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.MessageAdapter;
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.Iterator;
27 import java.util.List;
28
29 import javax.resource.spi.work.Work;
30
31
32
33
34 public abstract class AbstractReceiverWorker implements Work
35 {
36 protected List messages;
37 protected InboundEndpoint endpoint;
38 protected AbstractMessageReceiver receiver;
39 protected OutputStream out;
40
41 public AbstractReceiverWorker(List messages, AbstractMessageReceiver receiver)
42 {
43 this(messages, receiver, null);
44 }
45
46
47 public AbstractReceiverWorker(List 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
60 public final void run()
61 {
62 doRun();
63 release();
64 }
65
66
67
68
69
70
71 protected void doRun()
72 {
73
74
75
76 MuleContext muleContext = MuleServer.getMuleContext();
77 TransactionTemplate tt = new TransactionTemplate(endpoint.getTransactionConfig(),
78 endpoint.getConnector().getExceptionListener(),
79 muleContext);
80
81
82
83
84 TransactionCallback cb = new TransactionCallback()
85 {
86 public Object doInTransaction() throws Exception
87 {
88 Transaction tx = TransactionCoordination.getInstance().getTransaction();
89 if (tx != null)
90 {
91 bindTransaction(tx);
92 }
93 List results = new ArrayList(messages.size());
94
95 for (Iterator iterator = messages.iterator(); iterator.hasNext();)
96 {
97 Object o = iterator.next();
98
99 o = preProcessMessage(o);
100 if (o != null)
101 {
102 MessageAdapter adapter;
103 if (o instanceof MessageAdapter)
104 {
105 adapter = (MessageAdapter) o;
106 }
107 else
108 {
109 adapter = endpoint.getConnector().getMessageAdapter(o);
110 }
111
112 DefaultMuleMessage muleMessage = new DefaultMuleMessage(adapter);
113 preRouteMuleMessage(muleMessage);
114 MuleMessage result = receiver.routeMessage(muleMessage, tx, tx != null || endpoint.isSynchronous(), out);
115 if (result != null)
116 {
117 o = postProcessMessage(result);
118 if (o != null)
119 {
120 results.add(o);
121 }
122 }
123 }
124 }
125 return results;
126 }
127 };
128
129 try
130 {
131 List results = (List) tt.execute(cb);
132 handleResults(results);
133 }
134 catch (Exception e)
135 {
136 handleException(e);
137 }
138 finally
139 {
140 messages.clear();
141 }
142 }
143
144
145
146
147
148
149
150
151 protected void preRouteMuleMessage(DefaultMuleMessage message) throws Exception
152 {
153
154 }
155
156
157
158
159
160
161
162 protected abstract void bindTransaction(Transaction tx) throws TransactionException;
163
164
165
166
167
168 protected void handleException(Exception e)
169 {
170 endpoint.getConnector().handleException(e);
171 }
172
173
174
175
176
177
178
179 protected void handleResults(List messages) throws Exception
180 {
181
182 }
183
184
185
186
187
188
189
190
191 protected Object preProcessMessage(Object message) throws Exception
192 {
193
194 return message;
195 }
196
197
198
199
200
201
202
203
204
205 protected MuleMessage postProcessMessage(MuleMessage message) throws Exception
206 {
207
208 return message;
209 }
210
211
212
213
214
215
216 public void release()
217 {
218
219 }
220 }