1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.outbound;
12
13 import org.mule.DefaultMuleEvent;
14 import org.mule.api.MuleEvent;
15 import org.mule.api.MuleException;
16 import org.mule.api.MuleMessage;
17 import org.mule.api.lifecycle.InitialisationException;
18 import org.mule.api.processor.MessageProcessor;
19 import org.mule.api.routing.CouldNotRouteOutboundMessageException;
20 import org.mule.api.routing.RoutePathNotFoundException;
21 import org.mule.api.routing.RoutingException;
22 import org.mule.config.i18n.CoreMessages;
23 import org.mule.transport.NullPayload;
24
25
26
27
28
29 public class ChainingRouter extends FilteringOutboundRouter
30 {
31 @Override
32 public void initialise() throws InitialisationException
33 {
34 super.initialise();
35 if (routes == null || routes.size() == 0)
36 {
37 throw new InitialisationException(CoreMessages.objectIsNull("targets"), this);
38 }
39 }
40
41 @Override
42 public MuleEvent route(MuleEvent event) throws RoutingException
43 {
44 MuleEvent resultToReturn = event;
45 if (routes == null || routes.size() == 0)
46 {
47 throw new RoutePathNotFoundException(CoreMessages.noEndpointsForRouter(), event, null);
48 }
49
50 final int endpointsCount = routes.size();
51 if (logger.isDebugEnabled())
52 {
53 logger.debug("About to chain " + endpointsCount + " targets.");
54 }
55
56
57 MessageProcessor endpoint = null;
58 try
59 {
60 MuleMessage intermediaryResult = event.getMessage();
61
62 for (int i = 0; i < endpointsCount; i++)
63 {
64 endpoint = getRoute(i, resultToReturn);
65
66
67 boolean lastEndpointInChain = (i == endpointsCount - 1);
68
69 if (logger.isDebugEnabled())
70 {
71 logger.debug("Sending Chained message '" + i + "': "
72 + (intermediaryResult == null ? "null" : intermediaryResult.toString()));
73 }
74
75 if (!lastEndpointInChain)
76 {
77 MuleEvent endpointResult = sendRequest(resultToReturn, intermediaryResult, endpoint, true);
78 resultToReturn = endpointResult != null ? endpointResult : resultToReturn;
79 MuleMessage localResult = endpointResult == null ? null : endpointResult.getMessage();
80
81
82
83 if (localResult != null &&
84
85 localResult.getPayload() != NullPayload.getInstance() &&
86 intermediaryResult != null)
87 {
88 processIntermediaryResult(localResult, intermediaryResult);
89 }
90 intermediaryResult = localResult;
91
92 if (logger.isDebugEnabled())
93 {
94 logger.debug("Received Chain result '" + i + "': "
95 + (intermediaryResult != null ? intermediaryResult.toString() : "null"));
96 }
97
98 if (intermediaryResult == null || intermediaryResult.getPayload() == NullPayload.getInstance())
99 {
100
101
102 resultToReturn = intermediaryResult == null ? null : new DefaultMuleEvent(intermediaryResult, resultToReturn);
103 logger.warn("Chaining router cannot process any further targets. "
104 + "There was no result returned from endpoint invocation: " + endpoint);
105 break;
106 }
107 }
108 else
109 {
110
111
112 resultToReturn = sendRequest(resultToReturn, intermediaryResult, endpoint, true);
113 if (logger.isDebugEnabled())
114 {
115 MuleMessage resultMessage = resultToReturn == null ? null : resultToReturn.getMessage();
116 logger.debug("Received final Chain result '" + i + "': "
117 + (resultMessage == null ? "null" : resultMessage.toString()));
118 }
119 }
120 }
121
122 }
123 catch (MuleException e)
124 {
125 throw new CouldNotRouteOutboundMessageException(resultToReturn, endpoint, e);
126 }
127 return resultToReturn;
128 }
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 protected void processIntermediaryResult(MuleMessage localResult, MuleMessage intermediaryResult)
151 {
152 localResult.setCorrelationId(intermediaryResult.getCorrelationId());
153 localResult.setCorrelationSequence(intermediaryResult.getCorrelationSequence());
154 localResult.setCorrelationGroupSize(intermediaryResult.getCorrelationGroupSize());
155 localResult.setReplyTo(intermediaryResult.getReplyTo());
156 }
157 }