1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.outbound;
12
13 import org.mule.DefaultMuleMessage;
14 import org.mule.api.MessagingException;
15 import org.mule.api.MuleEvent;
16 import org.mule.api.MuleException;
17 import org.mule.api.MuleMessage;
18 import org.mule.api.endpoint.OutboundEndpoint;
19 import org.mule.api.processor.MessageProcessor;
20 import org.mule.api.routing.CouldNotRouteOutboundMessageException;
21 import org.mule.api.routing.RoutePathNotFoundException;
22 import org.mule.api.routing.RoutingException;
23 import org.mule.config.i18n.CoreMessages;
24 import org.mule.routing.CorrelationMode;
25
26 import java.util.ArrayList;
27 import java.util.List;
28
29
30
31
32
33
34 public class MulticastingRouter extends FilteringOutboundRouter
35 {
36 @Override
37 public MuleEvent route(MuleEvent event) throws RoutingException
38 {
39 MuleMessage message = event.getMessage();
40
41 if (routes == null || routes.size() == 0)
42 {
43 throw new RoutePathNotFoundException(CoreMessages.noEndpointsForRouter(), event, null);
44 }
45 if (enableCorrelation != CorrelationMode.NEVER)
46 {
47 boolean correlationSet = message.getCorrelationId() != null;
48 if (correlationSet && (enableCorrelation == CorrelationMode.IF_NOT_SET))
49 {
50 logger.debug("CorrelationId is already set, not setting Correlation group size");
51 }
52 else
53 {
54
55 message.setCorrelationGroupSize(routes.size());
56 }
57 }
58
59 List<MuleEvent> results = new ArrayList<MuleEvent>(routes.size());
60 try
61 {
62 for (int i = 0; i < routes.size(); i++)
63 {
64 MessageProcessor mp = routes.get(i);
65 OutboundEndpoint endpoint = mp instanceof OutboundEndpoint ? (OutboundEndpoint)mp : null;
66 if (endpoint == null || endpoint.getFilter() == null || (endpoint.getFilter() != null && endpoint.getFilter().accept(message)))
67 {
68 if (((DefaultMuleMessage) message).isConsumable())
69 {
70 throw new MessagingException(
71 CoreMessages.cannotCopyStreamPayload(message.getPayload().getClass().getName()),
72 event);
73 }
74
75 MuleMessage clonedMessage = new DefaultMuleMessage(message.getPayload(),
76 message, muleContext);
77 MuleEvent result = sendRequest(event, clonedMessage, mp, true);
78 if (result != null)
79 {
80 results.add(result);
81 }
82 }
83 }
84 }
85 catch (MuleException e)
86 {
87 throw new CouldNotRouteOutboundMessageException(event, routes.get(0), e);
88 }
89 return resultsHandler.aggregateResults(results, event, muleContext);
90 }
91 }