View Javadoc

1   /*
2    * $Id: MulticastingRouter.java 20465 2010-12-05 18:14:15Z mike.schilling $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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   * <code>MulticastingRouter</code> will broadcast the current message to every endpoint
31   * registed with the router.
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                  // the correlationId will be set by the AbstractOutboundRouter
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 = cloneMessage(message);
76                      MuleEvent result = sendRequest(event, clonedMessage, mp, true);
77                      if (result != null)
78                      {
79                          results.add(result);
80                      }
81                  }
82              }
83          }
84          catch (MuleException e)
85          {
86              throw new CouldNotRouteOutboundMessageException(event, routes.get(0), e);
87          }
88          return resultsHandler.aggregateResults(results, event, muleContext);
89      }
90  }