コード例 #1
0
  @Test
  public void testRouterWithCatchAll() throws Exception {
    final int[] count1 = new int[] {0};
    final int[] count2 = new int[] {0};
    final int[] catchAllCount = new int[] {0};

    DefaultOutboundRouterCollection messageRouter = new DefaultOutboundRouterCollection();

    FilteringOutboundRouter filterRouter1 =
        new FilteringOutboundRouter() {
          @Override
          public MuleEvent route(MuleEvent event) throws RoutingException {
            count1[0]++;
            return event;
          }
        };

    FilteringOutboundRouter filterRouter2 =
        new FilteringOutboundRouter() {
          @Override
          public MuleEvent route(MuleEvent event) throws RoutingException {
            count2[0]++;
            return event;
          }
        };

    filterRouter1.setFilter(new PayloadTypeFilter(Exception.class));
    filterRouter2.setFilter(new PayloadTypeFilter(StringBuilder.class));
    messageRouter.addRoute(filterRouter1);
    messageRouter.addRoute(filterRouter2);

    AbstractCatchAllStrategy strategy =
        new AbstractCatchAllStrategy() {
          @Override
          public MuleEvent doCatchMessage(MuleEvent event) throws RoutingException {
            catchAllCount[0]++;
            return null;
          }
        };

    messageRouter.setCatchAllStrategy(strategy);

    MuleEvent event = getTestEvent("hello");
    messageRouter.process(event);
    assertEquals(1, catchAllCount[0]);
    assertEquals(0, count1[0]);
    assertEquals(0, count2[0]);

    event = getTestEvent(new StringBuilder());
    messageRouter.process(event);
    assertEquals(1, catchAllCount[0]);
    assertEquals(0, count1[0]);
    assertEquals(1, count2[0]);

    event = getTestEvent(new Exception());
    messageRouter.process(event);
    assertEquals(1, catchAllCount[0]);
    assertEquals(1, count1[0]);
    assertEquals(1, count2[0]);
  }
コード例 #2
0
 public void testCorrelation() throws Exception {
   FilteringOutboundRouter filterRouter = new FilteringOutboundRouter();
   UMOSession session = getTestSession(getTestComponent(getTestDescriptor("test", "test")));
   UMOMessage message = new MuleMessage(new DefaultMessageAdapter(new StringBuffer()));
   UMOEndpoint endpoint = getTestEndpoint("test", "sender");
   filterRouter.setMessageProperties(session, message, endpoint);
   assertNotNull(message.getCorrelationId());
 }
コード例 #3
0
 @Test
 public void testCorrelation() throws Exception {
   FilteringOutboundRouter filterRouter = new FilteringOutboundRouter();
   MuleMessage message = new DefaultMuleMessage(new StringBuilder(), muleContext);
   OutboundEndpoint endpoint = getTestOutboundEndpoint("test");
   filterRouter.setMessageProperties(getTestService(), message, endpoint);
   assertNotNull(message.getCorrelationId());
 }
コード例 #4
0
  public void testRouterWithCatchAll() throws Exception {
    final int[] count1 = new int[] {0};
    final int[] count2 = new int[] {0};
    final int[] catchAllCount = new int[] {0};

    OutboundRouterCollection messageRouter = new OutboundRouterCollection();

    FilteringOutboundRouter filterRouter1 =
        new FilteringOutboundRouter() {
          public UMOMessage route(UMOMessage message, UMOSession session, boolean synchronous)
              throws RoutingException {
            count1[0]++;
            return message;
          }
        };

    FilteringOutboundRouter filterRouter2 =
        new FilteringOutboundRouter() {
          public UMOMessage route(UMOMessage message, UMOSession session, boolean synchronous)
              throws RoutingException {
            count2[0]++;
            return message;
          }
        };

    filterRouter1.setFilter(new PayloadTypeFilter(Exception.class));
    filterRouter2.setFilter(new PayloadTypeFilter(StringBuffer.class));
    messageRouter.addRouter(filterRouter1);
    messageRouter.addRouter(filterRouter2);

    LoggingCatchAllStrategy strategy =
        new LoggingCatchAllStrategy() {
          public UMOMessage catchMessage(
              UMOMessage message, UMOSession session, boolean synchronous) throws RoutingException {
            catchAllCount[0]++;
            return null;
          }
        };

    messageRouter.setCatchAllStrategy(strategy);

    UMOSession session = getTestSession(getTestComponent(getTestDescriptor("test", "test")));

    messageRouter.route(new MuleMessage("hello"), session, true);
    assertEquals(1, catchAllCount[0]);
    assertEquals(0, count1[0]);
    assertEquals(0, count2[0]);

    messageRouter.route(new MuleMessage(new StringBuffer()), session, true);
    assertEquals(1, catchAllCount[0]);
    assertEquals(0, count1[0]);
    assertEquals(1, count2[0]);

    messageRouter.route(new MuleMessage(new Exception()), session, true);
    assertEquals(1, catchAllCount[0]);
    assertEquals(1, count1[0]);
    assertEquals(1, count2[0]);
  }
コード例 #5
0
  public MuleMessage route(MuleMessage message, MuleSession session) throws RoutingException {
    if (messageSize == 0 && numberOfMessages < 2) {
      return super.route(message, session);
    } else if (messageSize > 0) {
      byte[] data = new byte[0];
      try {
        data = message.getPayloadAsBytes();
      } catch (Exception e) {
        throw new RoutingException(
            CoreMessages.failedToReadPayload(), message, getEndpoint(0, message), e);
      }

      int parts = data.length / messageSize;
      if ((parts * messageSize) < data.length) {
        parts++;
      }
      int len = messageSize;
      MuleMessage part = null;
      int count = 0;
      int pos = 0;
      byte[] buffer = null;
      try {
        for (; count < parts; count++) {
          if ((pos + len) > data.length) {
            len = data.length - pos;
          }
          buffer = new byte[len];
          System.arraycopy(data, pos, buffer, 0, buffer.length);
          pos += len;
          part = new DefaultMuleMessage(buffer, message);
          part.setCorrelationId(message.getUniqueId());
          part.setCorrelationGroupSize(parts);
          part.setCorrelationSequence(count);
          // TODO - remove or downgrade once MULE-1718 is fixed,
          // for now these really help see the problem if you set the level for this class to INFO
          if (logger.isInfoEnabled()) {
            logger.info("sending part " + count + " of " + parts);
          }
          super.route(part, session);
          if (logger.isInfoEnabled()) {
            logger.info("sent");
          }
        }

      } catch (RoutingException e) {
        // we'll want to send the whole message to the Exception handler
        e =
            new RoutingException(
                e.getI18nMessage(), e.getMuleMessage(), e.getEndpoint(), e.getCause());
        // e.addInfo("chunking", "true");
        // buffer = new byte[data.length - len];
        // System.arraycopy(data, len, buffer, 0, buffer.length);
        // e.addInfo("remaining data", buffer);
        throw e;
      }
    }
    return message;
  }
コード例 #6
0
  public void testOutboundMessageRouter() throws Exception {
    Mock session = MuleTestUtils.getMockSession();
    session.expectAndReturn("getComponent", getTestComponent(getTestDescriptor("test", "blah")));
    OutboundRouterCollection messageRouter = new OutboundRouterCollection();
    messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
    assertNotNull(messageRouter.getCatchAllStrategy());

    UMOEndpoint endpoint1 = getTestEndpoint("Test1Provider", UMOEndpoint.ENDPOINT_TYPE_SENDER);
    assertNotNull(endpoint1);

    UMOEndpoint endpoint2 = getTestEndpoint("Test2Provider", UMOEndpoint.ENDPOINT_TYPE_SENDER);
    assertNotNull(endpoint2);

    FilteringOutboundRouter router1 = new FilteringOutboundRouter();
    PayloadTypeFilter filter = new PayloadTypeFilter(String.class);
    router1.setFilter(filter);
    List endpoints = new ArrayList();
    endpoints.add(endpoint1);
    router1.setEndpoints(endpoints);

    FilteringOutboundRouter router2 = new FilteringOutboundRouter();
    PayloadTypeFilter filter2 = new PayloadTypeFilter();
    filter2.setExpectedType(Exception.class);
    router2.setFilter(filter2);
    endpoints = new ArrayList();
    endpoints.add(endpoint2);
    router2.setEndpoints(endpoints);

    messageRouter.addRouter(router1);
    assertEquals(1, messageRouter.getRouters().size());
    assertNotNull(messageRouter.removeRouter(router1));
    assertEquals(0, messageRouter.getRouters().size());
    List list = new ArrayList();
    list.add(router1);
    list.add(router2);
    messageRouter.setRouters(list);

    UMOMessage message = new MuleMessage("test event");

    session.expect("dispatchEvent", C.eq(message, endpoint1));
    messageRouter.route(message, (UMOSession) session.proxy(), false);
    session.verify();

    message = new MuleMessage(new IllegalArgumentException());

    session.expectAndReturn("getComponent", getTestComponent(getTestDescriptor("test", "blah")));
    session.expect("dispatchEvent", C.eq(message, endpoint2));
    messageRouter.route(message, (UMOSession) session.proxy(), false);
    session.verify();

    FilteringOutboundRouter router3 = new FilteringOutboundRouter();
    router3.setFilter(new PayloadTypeFilter(Object.class));
    endpoints = new ArrayList();
    endpoints.add(endpoint2);
    router3.setEndpoints(endpoints);
    messageRouter.addRouter(router3);

    // now the message should be routed twice to different endpoints
    message = new MuleMessage("testing multiple routing");
    session.expectAndReturn("getComponent", getTestComponent(getTestDescriptor("test", "blah")));
    session.expectAndReturn("getComponent", getTestComponent(getTestDescriptor("test", "blah")));

    session.expect("dispatchEvent", C.eq(message, endpoint1));
    session.expect("dispatchEvent", C.eq(message, endpoint2));
    messageRouter.setMatchAll(true);
    messageRouter.route(message, (UMOSession) session.proxy(), false);
    session.verify();
  }
コード例 #7
0
  @Test
  public void testOutboundMessageRouter() throws Exception {
    DefaultOutboundRouterCollection messageRouter =
        createObject(DefaultOutboundRouterCollection.class);
    messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
    assertNotNull(messageRouter.getCatchAllStrategy());

    OutboundEndpoint endpoint1 =
        getTestOutboundEndpoint("Test1Provider", "test://Test1Provider?exchangePattern=one-way");
    assertNotNull(endpoint1);
    OutboundEndpoint mockendpoint1 = RouterTestUtils.createMockEndpoint(endpoint1);

    OutboundEndpoint endpoint2 = getTestOutboundEndpoint("Test2Provider");
    assertNotNull(endpoint2);
    OutboundEndpoint mockendpoint2 = RouterTestUtils.createMockEndpoint(endpoint2);

    FilteringOutboundRouter router1 = new FilteringOutboundRouter();
    PayloadTypeFilter filter = new PayloadTypeFilter(String.class);
    router1.setFilter(filter);
    List<MessageProcessor> endpoints = new ArrayList<MessageProcessor>();
    endpoints.add(mockendpoint1);
    router1.setRoutes(endpoints);

    FilteringOutboundRouter router2 = new FilteringOutboundRouter();
    PayloadTypeFilter filter2 = new PayloadTypeFilter();
    filter2.setExpectedType(Exception.class);
    router2.setFilter(filter2);
    endpoints = new ArrayList<MessageProcessor>();
    endpoints.add(mockendpoint2);
    router2.setRoutes(endpoints);

    messageRouter.addRoute(router1);
    assertEquals(1, messageRouter.getRoutes().size());
    messageRouter.removeRoute(router1);
    assertEquals(0, messageRouter.getRoutes().size());

    List<MatchableMessageProcessor> list = new ArrayList<MatchableMessageProcessor>();
    list.add(router1);
    list.add(router2);
    messageRouter.setMessageProcessors(list);

    MuleSession session = mock(MuleSession.class);
    MuleEvent event = getTestEvent("test event", session);

    when(mockendpoint1.process(any(MuleEvent.class))).thenAnswer(new MuleEventCheckAnswer());
    messageRouter.process(event);

    event = getTestEvent(new IllegalArgumentException(), session);

    when(mockendpoint2.process(any(MuleEvent.class))).thenAnswer(new MuleEventCheckAnswer());
    messageRouter.process(event);

    FilteringOutboundRouter router3 = new FilteringOutboundRouter();
    router3.setFilter(new PayloadTypeFilter(Object.class));
    endpoints = new ArrayList<MessageProcessor>();
    endpoints.add(mockendpoint2);
    router3.setRoutes(endpoints);
    messageRouter.addRoute(router3);

    // now the message should be routed twice to different targets
    event = getTestEvent("testing multiple routing", session);

    messageRouter.setMatchAll(true);
    messageRouter.process(event);
  }