Hi, It looks like you are using some kind of MOCK API to throw the exception. Can you show me the code how did you setup the mocked POJO bean? -- Willem Jiang
Red Hat, Inc. Web: http://www.redhat.com Blog: http://willemjiang.blogspot.com (English) http://jnn.iteye.com (Chinese) Twitter: willemjiang Weibo: 姜宁willem On July 8, 2014 at 11:36:38 PM, atg roxx (atgr...@gmail.com) wrote: > Hi Team, > > I am using multicast with AggreationStrategy an also using onException on > my route. > > Happy case is working fine, > > But when there is any exception, my exception processor handle it and set a > header and add error message in the body of the exchange. > > When call go back to aggregator, it check whether the body of the exchange > received is not null and of type Class A or not. if not then we know this > exchange is returned by the Exception handler. and we return that exchange. > > When testing for exception , my mock end point does not receive exchange > set by the exception processor. > > Kindly guide me where I am getting things wrong.: > > Below is the source code: > > Route definition :------------------------------------- > > onException(RecoverableException.class) > .maximumRedeliveries(2) > .handled(true) > .beanRef("myCustomeExceptionHandler","handleException"); > > > from("{{route.direct.endpoint}}") > .routeId(ROUTE_ID) > .multicast(new MyAggregationStrategy()) > .parallelProcessing() > .timeout(COMPLETION_TIMEOUT) > .to(GET_DETAILS, GET_SUMMARY, GET_IMAGE) > .end() > .marshal(responseFormat); > > from(GET_SUMMARY) > .choice() > .when(summaryIsRequested) > .beanRef("myCustomeService", "getSummary") > .otherwise() > .setBody().constant(null) > .log(LoggingLevel.DEBUG, "Skipping summary - not > requested.") > .end(); > > from(GET_DETAILS) > .choice() > .when(detailsAreRequested) > .beanRef("myCustomeService", "getDetails") > .otherwise() > .setBody().constant(null) > .log(LoggingLevel.DEBUG, "Skipping details - not > requested.") > .end(); > > from(GET_IMAGE) > .routeId("podImageRoute") > .choice() > .when(podImageIsRequested) > .beanRef("myCustomeService", "getImage") > .otherwise() > .setBody().constant(null) > .log(LoggingLevel.DEBUG, "Skipping image - not requested.") > .end(); > > Exception Handler > :------------------------------------------------------------------ > public class HttpResponseExceptionHandler implements ExceptionHandler { > @Override > public void handleRecoverableException(Exchange exchange) { > Throwable cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, > Exception.class); > String failureRouteId = exchange.getProperty(Exchange.FAILURE_ROUTE_ID, > String.class); > String errorMessage = cause.getMessage(); > LOGGER.error("Exception occurred in the route {}. Exception details are: > {}", failureRouteId, errorMessage); > exchange.getIn().removeHeaders("*"); > exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, statusCode); > exchange.getIn().setBody(errorMessage); > } > } > > Aggregator code: ---------------------------- > > public class MyCustomeAggregationStrategy implements AggregationStrategy { > > @Override > public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { > > if (oldExchange == null) { // occurs for a new group > return newExchange; > } > > if (exchangeHasNonNullBody(oldExchange) && > exchangeContainBodyofTypeClassA(oldExchange)) { > oldBody=oldExchange.getIn().getBody(); > } else { > return oldExchange; // assuming that body contain string > message set in Exception Handler > } > } > > if (exchangeHasNonNullBody(newExchange) && > exchangeContainBodyofTypeClassA(newExchange)) { > newBody=newExchange.getIn().getBody(); > } else { > return newExchange; // assuming that body contain string > message set in Exception Handler > } > } > > MergeBodyofOldAndNewExchange(oldExchange,oldBody,newBody); > > return oldExchange; > } > > ---------------------- > > Test case :--------------------- > > > @DirtiesContext > @Test > public void testExceptionHandeling() throws Exception { > > // Given > when(myService.getImage(anyString(), anyString())).thenThrow(new > ConnectionException("Exception of type ConnectionException")); > mockEndpointResult.expectedMessageCount(1); > > // When > try { > template.sendBody("{{route.direct.endpoint}}", request); > Thread.sleep(1000); // wait a few moments... > //then > mockEndpointResult.assertIsSatisfied(); // fails here > > } catch (CamelExecutionException ex) { > //then > fail(); > } > } > > > -- Regards, > atg roxx >