1

I am trying to use Apache Camel resequence EIP to reorder the incoming messages in batches. This reordering should be done based on the field in message body. But documents that I came across in the EIP site and Apache camel do not talk about how to create a custom resequence based on the body content. The message will be of JSON string.

I even tried to resequence using header but I am getting below error.

@Component
public class SampleJmsRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("jms:src").
        resequence(header("time_stamp")).
        to("jms:dest");

    }

}

Sample request

curl -X POST \ 'http://localhost:8161/api/message/src?type=queue' \ -H 'cache-control: no-cache' \ -H 'content-type: application/json' \ -H 'time_stamp: 1012' \ -d '{ "name" : "Test user", "id" : 2 }'

Stacktrace

2019-12-03 11:14:26.984 ERROR 85709 --- [msConsumer[src]] o.a.camel.processor.DefaultErrorHandler  : Failed delivery for (MessageId: ID:blr-mp9nq-63869-1575273657184-4:3:1:1:18 on ExchangeId: ID-blr-mp9nq-1575351186925-7-1). Exhausted after delivery attempt: 1 caught: org.apache.camel.CamelExchangeException: Exchange is not valid to be used by the BatchProcessor. Exchange[ID-blr-mp9nq-1575351186925-7-1]

Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[route7            ] [route7            ] [jms://src                                                                     ] [         1]
[route7            ] [resequence7       ] [resequencer[header(time_stamp)]                                               ] [         0]

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------

org.apache.camel.CamelExchangeException: Exchange is not valid to be used by the BatchProcessor. Exchange[ID-blr-mp9nq-1575351186925-7-1]
    at org.apache.camel.processor.BatchProcessor.process(BatchProcessor.java:303) ~[camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) ~[camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) [camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) [camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) [camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:113) [camel-jms-2.24.2.jar:2.24.2]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:736) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:696) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1190) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1180) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1077) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_121]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121]

2019-12-03 11:14:26.985  WARN 85709 --- [msConsumer[src]] o.a.c.c.jms.EndpointMessageListener      : Execution of JMS message listener failed. Caused by: [org.apache.camel.RuntimeCamelException - org.apache.camel.CamelExchangeException: Exchange is not valid to be used by the BatchProcessor. Exchange[ID-blr-mp9nq-1575351186925-7-1]]

org.apache.camel.RuntimeCamelException: org.apache.camel.CamelExchangeException: Exchange is not valid to be used by the BatchProcessor. Exchange[ID-blr-mp9nq-1575351186925-7-1]
    at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1826) ~[camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.component.jms.EndpointMessageListener$EndpointMessageListenerAsyncCallback.done(EndpointMessageListener.java:196) ~[camel-jms-2.24.2.jar:2.24.2]
    at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:117) ~[camel-jms-2.24.2.jar:2.24.2]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:736) ~[spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:696) ~[spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674) ~[spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1190) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1180) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1077) [spring-jms-5.1.12.BUILD-SNAPSHOT.jar:5.1.12.BUILD-SNAPSHOT]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_121]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121]
Caused by: org.apache.camel.CamelExchangeException: Exchange is not valid to be used by the BatchProcessor. Exchange[ID-blr-mp9nq-1575351186925-7-1]
    at org.apache.camel.processor.BatchProcessor.process(BatchProcessor.java:303) ~[camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) ~[camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) ~[camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) ~[camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) ~[camel-core-2.24.2.jar:2.24.2]
    at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:113) ~[camel-jms-2.24.2.jar:2.24.2]
    ... 11 common frames omitted

Could anyone please help me in re-sequencing the messages based on field in body.

Justin Bertram
  • 29,372
  • 4
  • 21
  • 43
CrazyCoder
  • 2,465
  • 8
  • 36
  • 57
  • Don't know if this is a typo but you've specified `header("time_stamp")` as resequencer definition while you send in `timestamp` as header. If you only send in one message, you won't see any difference. According to the [official documentation](https://camel.apache.org/manual/latest/resequence-eip.html) it is used for batches or streams of incoming data that can be compared and thus resorted. – Roman Vottner Dec 03 '19 at 06:12
  • @RomanVottner It is a typo. I have fixed it in the question. Thanks – CrazyCoder Dec 03 '19 at 06:23
  • This exception occurs when the exchange is not according to the expression. If needed the invalid exchanges can be skipped (See https://camel.apache.org/manual/latest/resequence-eip.html and https://camel.apache.org/manual/latest/batch-config-eip.html) – R.Groote Dec 03 '19 at 07:03

0 Answers0