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.