camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mick Knutson" <mknut...@baselogic.com>
Subject Re: Trying to understand how to deal with process() errors and creating an exceptionChannel for bad messages.
Date Wed, 24 Sep 2008 20:00:50 GMT
*So here is my configure now:*

        c*amelContext.addRoutes(new RouteBuilder() {
            public void configure() {


exception(Exception.class).process(changeRequestInputExceptionProcessor).to(MOCK_OUTPUT_ERROR_DESTINATION_URI);


errorHandler(deadLetterChannel(MOCK_OUTPUT_ERROR_DESTINATION_URI));

                // create the routes for async-processing:
                from(inputUri).process(processor).to(outputUri);

                /*exception(Exception.class)
                        .setHeader("MESSAGE_INFO", constant("Damm just
exception"))
                        .to(MOCK_OUTPUT_ERROR_DESTINATION_URI);*/
            }
        });
*

So when I run my test with bad data, my console shows the following error:


[myproject] INFO [DefaultMessageListenerContainer-1]
ChangeRequestControllerImpl.process(31) |
ChangeRequestControllerImpl.process(Exchange)
*[myproject] INFO [DefaultMessageListenerContainer-1]
ChangeRequestControllerImpl.process(82) |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX*
[myproject] DEBUG [DefaultMessageListenerContainer-1] Pipeline.process(67) |
Message exchange has failed so breaking out of pipeline: Exchange[JmsMess
age: ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId
= ID:mickknutson-1489-1222285987396-2:6:1:1:1, originalDestination = null,
 originalTransactionId = null, producerId =
ID:mickknutson-1489-1222285987396-2:6:1:1, destination =
queue://channel/changerequest/add, transactionId
= null, expiration = 0, timestamp = 1222285992458, arrival = 0, brokerInTime
= 1222285992458, brokerOutTime = 1222285992458, correlationId = null, rep
lyTo = null, persistent = true, type = null, priority = 4, groupID = null,
groupSequence = 0, targetConsumerId = null, compressed = false, userID = nu
ll, content = null, marshalledProperties = null, dataStructure = null,
redeliveryCounter = 0, size = 1024, properties = null, readOnlyProperties =
tru
e, readOnlyBody = true, droppable = false, text = {"customerId":"*abcd*
","changeRequestType":"BADREQUEST","quota":"*xyz*"}}] exception:
java.lang.Exceptio
n: 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] consum
er caught an exception while processing JMS message: ActiveMQTextMessage
{commandId = 5, responseRequired = true, messageId =
ID:mickknutson-1489-1222
285987396-2:6:1:1:1, originalDestination = null, originalTransactionId =
null, producerId = ID:mickknutson-1489-1222285987396-2:6:1:1, destination =
q
ueue://channel/changerequest/add, transactionId = null, expiration = 0,
timestamp = 1222285992458, arrival = 0, brokerInTime = 1222285992458,
brokerOu
tTime = 1222285992458, correlationId = null, replyTo = null, persistent =
true, type = null, priority = 4, groupID = null, groupSequence = 0, targetCo
nsumerId = null, compressed = false, userID = null, content = null,
marshalledProperties = null, dataStructure = null, redeliveryCounter = 0,
size = 1
024, properties = null, readOnlyProperties = true, readOnlyBody = true,
droppable = false, text =
{"customerId":"abcd","changeRequestType":"BADREQUEST
","quota":"xyz"}}
org.apache.camel.RuntimeCamelException: java.lang.Exception:
org.codehaus.jettison.json.JSONException: JSONObject["customerId"] is not a
number.
        at
org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:71)
        at
org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:531)
        at
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:466)
        at
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:435)
        at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:3
22)
        at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:260
)
        at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer
.java:944)
        at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:875)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.Exception: org.codehaus.jettison.json.JSONException:
JSONObject["customerId"] is not a number.
        at
com.servepath.gogrid.changerequest.impl.ChangeRequestControllerImpl.process(ChangeRequestControllerImpl.java:83)


*Now here is the method itself:*

    public void process(Exchange exchange)
            throws Exception {

        try {
            String body = (String) exchange.getIn().getBody();
            JSONObject jsonIn = new JSONObject(body);

            // validate input message, route to verifyErrorEndpoint if there
are errors.
            Long customerId = jsonIn.getLong(Constants.CUSTOMER_ID);
            String type = jsonIn.getString(Constants.CHANGEREQUST_TYPE);
            int quota = jsonIn.getInt(Constants.QUOTA);

            ChangeRequest changeRequest = null;

            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);
                throw new Exception("Invalid Change Request Type");
            }

            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);

        } catch (Exception e) {
            log.info("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

            throw new Exception(e);
        }
    }


*Here is my test method:*

    @Test(groups = {"functional"})
    @Parameters({"inputDestinationURI", "messageInputBody",
"messageOutputBody"})
    public void testCreateInvalidChangeRequest(String inputDestinationURI,
                                               String messageInputBody,
                                               String messageOutputBody
    )
            throws Exception {

        *resultEndpoint.expectedMessageCount(0);
        resultErrorEndpoint.expectedMessageCount(1);*

        // setup RouteBuilder...
        setRoutes(inputDestinationURI, changeRequestControllerImpl,
MOCK_OUTPUT_DESTINATION_URI);

        // Create and Send message to input queue
        createMessage(inputDestinationURI, messageInputBody);

        MockEndpoint.assertIsSatisfied(resultEndpoint, resultErrorEndpoint);
        // verify that the destination channel
        log.debug("----------------------------------------------------");
    }


*But now my test assertion fails:*

          *<exception class="java.lang.AssertionError">
            <message>
              <![CDATA[mock:outputDestinationURI Received message
count. Expected:
<0> but was: <1>]]>
            </message>*

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message