/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.processor; import java.util.Map; import org.apache.camel.Body; import org.apache.camel.ContextTestSupport; import org.apache.camel.Headers; import org.apache.camel.OutHeaders; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; /** * Unit test to verify that handled policy is working as expected for wiki documentation. */ public class DeadLetterChannelHandledExampleTest extends ContextTestSupport { public void testOrderOK() throws Exception { MockEndpoint result = getMockEndpoint("mock:result"); result.expectedBodiesReceived("Order OK"); result.expectedHeaderReceived("orderid", "123"); MockEndpoint error = getMockEndpoint("mock:error"); error.expectedMessageCount(0); Object out = template.requestBodyAndHeader("direct:start", "Order: MacBook Pro", "customerid", "444"); assertEquals("Order OK", out); assertMockEndpointsSatisfied(); } public void testOrderERROR() throws Exception { MockEndpoint error = getMockEndpoint("mock:error"); error.expectedBodiesReceived("Order ERROR"); error.expectedHeaderReceived("orderid", "failed"); MockEndpoint result = getMockEndpoint("mock:result"); result.expectedMessageCount(0); Object out = template.requestBodyAndHeader("direct:start", "Order: kaboom", "customerid", "555"); assertEquals("Order ERROR", out); assertMockEndpointsSatisfied(); } protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { public void configure() throws Exception { // START SNIPPET: e1 // we do special error handling for when OrderFailedException is thrown onException(OrderFailedException.class) // we mark the exchange as handled so the caller doesn't receive the // OrderFailedException but whatever we want to return instead .handled(true) // this bean handles the error handling where we can customize the error // response using java code .bean(OrderService.class, "orderFailed") // and since this is an unit test we use mocks for testing .to("mock:error"); // this is just the generic error handler where we set the destination // and the number of redeliveries we want to try errorHandler(deadLetterChannel("mock:error").maximumRedeliveries(1)); // this is our route where we handle orders from("direct:start") // this bean is our order service .bean(OrderService.class, "handleOrder") // this is the destination if the order is OK .to("mock:result"); // END SNIPPET: e1 } }; } // START SNIPPET: e2 /** * Order service as a plain POJO class */ public static class OrderService { /** * This method handle our order input and return the order * * @param in the in headers * @param payload the in payload * @param out the out headers * @return the out payload * @throws OrderFailedException is thrown if the order cannot be processed */ public Object handleOrder(@Headers Map<?, ?> in, @Body String payload, @OutHeaders Map<String, Object> out) throws OrderFailedException { out.put("customerid", in.get("customerid")); if ("Order: kaboom".equals(payload)) { throw new OrderFailedException("Cannot order: kaboom"); } else { out.put("orderid", "123"); return "Order OK"; } } /** * This method creates the response to the caller if the order could not be processed * @param in the in headers * @param payload the in payload * @param out the out headers * @return the out payload */ public Object orderFailed(@Headers Map<?, ?> in, @Body String payload, @OutHeaders Map<String, Object> out) { out.put("customerid", in.get("customerid")); out.put("orderid", "failed"); return "Order ERROR"; } } // END SNIPPET: e2 // START SNIPPET: e3 /** * Exception thrown if the order cannot be processed */ public static class OrderFailedException extends Exception { private static final long serialVersionUID = 1L; public OrderFailedException(String message) { super(message); } } // END SNIPPET: e3 }