@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]); }
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()); }
@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()); }
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]); }
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; }
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(); }
@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); }