I looked at the test example again: https://svn.apache.org/repos/asf/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelTest.java * So then I changed my test routing to:*
*camelContext.addRoutes(new RouteBuilder() { public void configure() { from(inputUri).errorHandler( deadLetterChannel(MOCK_OUTPUT_ERROR_DESTINATION_URI) //.maximumRedeliveries(2) //.initialRedeliveryDelay(1) .loggingLevel(LoggingLevel.DEBUG) ).process(processor).to(MOCK_OUTPUT_DESTINATION_URI); } }); * * But I still have an error thrown in my console:* *[myproject] DEBUG [ActiveMQ Transport Stopper: vm://localhost#10] TransportConnection.doStop(927) | Stopping connection: vm://localhost#10 [myproject] DEBUG [DefaultMessageListenerContainer-1] EndpointMessageListener.onMessage(61) | Endpoint[activemq:queue:channel/changerequest/add] consumer receiving JMS message: ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId = ID:mickknutson-2702-1222362317888-2:5:1:1:1, origi nalDestination = null, originalTransactionId = null, producerId = ID:mickknutson-2702-1222362317888-2:5:1:1, destination = queue://channel/changerequest/add, transactionId = null, expiration = 0, timestamp = 1222362321716, arrival = 0, brokerInTime = 1222362321716, brokerOutTime = 1222362321716, cor relationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 1024, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, text = {"customerId":"abcd","changeRequestType":"BADREQUEST","quota":"xyz"}} [myproject] INFO [DefaultMessageListenerContainer-1] ChangeRequestControllerImpl.process(32) | ********************************* [myproject] INFO [DefaultMessageListenerContainer-1] ChangeRequestControllerImpl.process(33) | ChangeRequestControllerImpl.process(Exchange) [myproject] INFO [DefaultMessageListenerContainer-1] ChangeRequestControllerImpl.process(78) | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX [myproject] DEBUG [DefaultMessageListenerContainer-1] Pipeline.process(67) | Message exchange has failed so breaking out of pipeline: Exchange[JmsMessage: ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId = ID:mickknutson-2702-1222362317888-2:5:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:mickknutson-2702-1222362317888-2:5:1:1, destination = queue://channel/changerequest/add, transactionId = null, expiration = 0, timestamp = 1222362321716, arrival = 0, brokerInTime = 1222362321716, brokerOutTime = 1222362321716, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 1024, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, text = {"customerId":"abcd","changeRequestType":"BADREQUEST","quota":"xyz"}}] exception: java.lang.RuntimeE xception: org.codehaus.jettison.json.JSONException: JSONObject["customerId"] is not a number. fault: null [myproject] WARN [DefaultMessageListenerContainer-1] EndpointMessageListener.onMessage(80) | Endpoint[activemq:queue:channel/changerequest/add] consumer caught an exception while processing JMS message: ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId = ID:mickknutson-2702-1222362317888-2:5:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:mickknutson-2702-1222362317888-2:5:1:1, destination = queue://channel/changerequest/add, transactionId = null, expiration = 0, timestamp = 1222362321716, arrival = 0, brokerInTime = 1222362321716, brokerOu tTime = 1222362321716, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 1024, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, text = {"customerId":"abcd","changeRequestType":"BADREQUEST ","quota":"xyz"}} org.apache.camel.RuntimeCamelException: java.lang.RuntimeException: org.codehaus.jettison.json.JSONException: JSONObject["customerId"] is not a number. * 1st issue, is why does my MOCK_OUTPUT_DESTINATION_URI get the message when a RuntimeException is thrown. 2nd issue is why does my MOCK_OUTPUT_ERROR_DESTINATION_URI not get any messages at all. *Here is my TestNG results:* *<exception class="java.lang.AssertionError"> <message> <![CDATA[mock:outputDestinationURI Received message count. Expected: <0> but was: <1>]]> </message> * *So I also added this to my test as per the Unit Test listed above:* *Throwable t = resultErrorEndpoint.getExchanges().get(0).getProperty(DeadLetterChannel.EXCEPTION_CAUSE_PROPERTY, Throwable.class); * *Then I started getting:* *<full-stacktrace> <![CDATA[java.lang.ArrayIndexOutOfBoundsException: 0 at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:343) at com.servepath.changerequest.ChangeRequestTest.testCreateInvalidChangeRequest(ChangeRequestTest.java:138) * On Wed, Sep 24, 2008 at 11:13 PM, Willem Jiang <[EMAIL PROTECTED]>wrote: > The "mock:fail" is just for the testing, you can use your endpoint URI for > the error message receiving. > I just went through the codes in your mail, can you remove the below can > from router configure and try again? > > > exception(Exception.class).process(changeRequestInputExceptionProcessor).to(MOCK_OUTPUT_ERROR_DESTINATION_URI); > > > Willem. > > > Mick Knutson wrote: > >> But my test throws an exception, and created >> a*MOCK_OUTPUT_ERROR_DESTINATION_URI >> * Mock instead of the name used "mock:fail" or is there some reason I have >> to use "mock:fail" instead of my endpoint? >> >> >> >> >> On Wed, Sep 24, 2008 at 10:34 PM, Mick Knutson <[EMAIL PROTECTED] >> >wrote: >> >> >> >>> But my test throws an exception, and created >>> >>> On Wed, Sep 24, 2008 at 8:23 PM, Willem Jiang <[EMAIL PROTECTED] >>> >wrote: >>> >>> >>> >>>> Can you take a look at the below unit test, the message is only sent to >>>> the "mock:fail" endpoint when the exception is thrown. >>>> >>>> >>>> Willem Jiang wrote: >>>> >>>> >>>> >>>>> Hi >>>>> >>>>> You don't need to call the exchange.isFailed(), it just check if the >>>>> exchange's fault message or exception is set. >>>>> Here is a Unit test of DeadLetterChannel[1], which shows what you >>>>> want. >>>>> Please check it out. >>>>> >>>>> [1] >>>>> >>>>> https://svn.apache.org/repos/asf/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelTest.java >>>>> >>>>> Willem >>>>> >>>>> Mick Knutson wrote: >>>>> >>>>> >>>>> >>>>>> To give some background here is my process: >>>>>> >>>>>> *public void process(Exchange exchange) >>>>>> throws Exception { >>>>>> log.info("process ChangeRequestInputTransformer request"); >>>>>> >>>>>> String body = (String) exchange.getIn().getBody(); >>>>>> >>>>>> // Get a Map of Items from the input message >>>>>> JSONObject jsonIn = new JSONObject(body); >>>>>> >>>>>> // validate input message, route to verifyErrorEndpoint if there >>>>>> are >>>>>> errors. >>>>>> String customerId = jsonIn.getString(Constants.CUSTOMER_ID); >>>>>> String type = jsonIn.getString(Constants.CHANGEREQUST_TYPE); >>>>>> String quota = jsonIn.getString(Constants.QUOTA); >>>>>> >>>>>> ChangeRequest changeRequest = null; >>>>>> >>>>>> try { >>>>>> >>>>>> if (type.equalsIgnoreCase(Constants.PROVISION)) { >>>>>> log.info("***** PROVISION *****"); >>>>>> changeRequest = createProvisionChangeRequest(customerId, >>>>>> quota); // can throw Exception >>>>>> >>>>>> exchange.getOut().setHeader(Constants.REQUEST_DESTINATION, >>>>>> Constants.REQUEST_OUTPUT_CHANNEL); >>>>>> >>>>>> } else if (type.equalsIgnoreCase(Constants.DEPROVISION)) { >>>>>> log.info("DEPROVISION"); >>>>>> } else { >>>>>> log.error("Invalid Change Request"); >>>>>> >>>>>> exchange.getOut().setHeader(Constants.REQUEST_DESTINATION, >>>>>> Constants.REQUEST_INPUT_ERROR_CHANNEL); >>>>>> } >>>>>> >>>>>> String jsonOut = toJSON(body); >>>>>> >>>>>> >>>>>> exchange.getOut().setMessageId(changeRequest.getChangeRequestId() >>>>>> + ""); >>>>>> exchange.getOut().setHeader(Constants.CORRELATION_ID, >>>>>> changeRequest.getChangeRequestId()); >>>>>> exchange.getOut().setHeader(Constants.TIMEOUT, new >>>>>> Integer(5000)); // fixme: 5 seconds.... >>>>>> exchange.getOut().setHeader(Constants.CUSTOMER_ID, >>>>>> changeRequest.getCustomerId()); >>>>>> >>>>>> exchange.getOut().setBody(jsonOut); >>>>>> >>>>>> //todo need to rout to CR_INPUT_ERROR_CHANNEL if there is an >>>>>> error. >>>>>> >>>>>> log.info("*********************************"); >>>>>> } catch (Exception e) { >>>>>> exchange.isFailed(); >>>>>> throw new Exception("Error creating Change Request"); >>>>>> } >>>>>> } >>>>>> * >>>>>> >>>>>> Now, I get an exception with >>>>>> *exchange.getOut().setMessageId(changeRequest.getChangeRequestId() >>>>>> + ""); *but my mock still gets the expected number of messages. >>>>>> >>>>>> so I need to understand how to stop the current message, and redirect >>>>>> this >>>>>> to an error channel instead. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Tue, Sep 23, 2008 at 1:50 PM, Mick Knutson <[EMAIL PROTECTED] >>>>>> >>>>>> >>>>>>> wrote: >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> I have input messages that I am trying to process, and when there is >>>>>>> an >>>>>>> error, I want to create a new exceptionMessage and put it onto an >>>>>>> inputErrorChannel . >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> --- >>>>>>> Thank You… >>>>>>> >>>>>>> Mick Knutson >>>>>>> BASE Logic, inc. >>>>>>> (415) 354-4215 >>>>>>> >>>>>>> Website: http://baselogic.com >>>>>>> Blog: http://baselogic.com/blog >>>>>>> BLiNC Magazine: http://blincmagazine.com >>>>>>> Linked IN: http://linkedin.com/in/mickknutson >>>>>>> DJ Mick: http://djmick.com >>>>>>> MySpace: http://myspace.com/mickknutson >>>>>>> Vacation Rental: http://tahoe.baselogic.com >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> >>>> -- >>> --- >>> Thank You… >>> >>> Mick Knutson >>> BASE Logic, inc. >>> (415) 354-4215 >>> >>> Website: http://baselogic.com >>> Blog: http://baselogic.com/blog >>> BLiNC Magazine: http://blincmagazine.com >>> Linked IN: http://linkedin.com/in/mickknutson >>> DJ Mick: http://djmick.com >>> MySpace: http://myspace.com/mickknutson >>> Vacation Rental: http://tahoe.baselogic.com >>> >>> >>> >>> >> >> >> >> > > -- --- Thank You… Mick Knutson BASE Logic, inc. (415) 354-4215 Website: http://baselogic.com Blog: http://baselogic.com/blog BLiNC Magazine: http://blincmagazine.com Linked IN: http://linkedin.com/in/mickknutson DJ Mick: http://djmick.com MySpace: http://myspace.com/mickknutson Vacation Rental: http://tahoe.baselogic.com