按照骆驼和JMS的高级队列以正确的顺序使用消息
通过将Apache Camel与Oracle Advanced Queues和JMS结合使用,我遇到了一个问题。
这是关于分发消息的应用程序。 在Camel的帮助下,收到消息并在Oracle高级队列中入队。 然后他们与骆驼消耗并转发到目标系统。 对于消息传递失败的情况,在高级队列中定义了重试计数,以便重复消息传递。
如果Camel现在将邮件出列并将其发送到不可用的目标系统,则会抛出HttpOperationFailedException或NoSuchEndpointException。 这些被捕获并执行回滚。
此时,预期消息传递将按照重试计数中定义的频率重试,然后移至异常队列。 但是,发生的情况是发送队列中的下一条消息。
由于消息的内容部分相互依赖,因此必须按顺序处理。
我认为在使用JMS库时存在配置错误,但我不确定并且没有发现任何可以影响此行为的内容。
使用的JMS库是Oracle AqApi v 11.2.0.3。
这里是骆驼路线的代码:
from("jms-camel-component:myComponent.AQ?jmsMessageType=Text").routeId("deliveryToTarget")
.transacted()
.setExchangePattern(ExchangePattern.InOut)
.setHeader(Exchange.HTTP_QUERY, constant("throwExceptionOnFailure=false"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/xml; charset=UTF-8"))
.doTry()
.recipientList(header("endpointTarget"))
.endDoTry()
.process(ResponseProzessor.getInstance())
.log("Message was delivererd.")
.doCatch(HttpOperationFailedException.class, NoSuchEndpointException.class)
.process(ResponseProzessor.getInstance())
.log("Error occured.")
.rollback()
.end();
这是JmsComponent配置:
JmsComponent jmsComponent = new JmsComponent(scc);
jmsComponent.setConnectionFactory(connectionFactory);
jmsComponent.setTransactionManager(tm);
jmsComponent.setMaxConcurrentConsumers(1);
jmsComponent.setMaxMessagesPerTask(1);
jmsComponent.setIncludeSentJMSMessageID(true);
预先感谢您的帮助!
UPDATE
我想,我已经找到了描述行为的原因。 高级队列上配置了延迟。 只要延迟持续,队列中的下一条消息就会出队。 消息没有随机出列,它们根据优先级排队。
我真的认为这是必须在消费者身上配置的东西。 有没有什么技巧可以配置camel-jms-component使用队列中的第一条消息,只要它没有被提交或移动到异常队列中? 我没有找到直接在骆驼上配置它的选项...
我不是Oracle AQ专家,但据我所知,这是队列中的一个设置,而不是客户端。
sort_list参数确定消息出队的顺序。 创建队列表后,您不能更改消息排序顺序
来自:http://docs.oracle.com/cd/B19306_01/server.102/b14257/aq_admin.htm
您最有可能已经设置了ENQ_TIME或COMMIT_TIME - 这可能已经满足您的需求。
当然,你的消费者必须是唯一的。
链接地址: http://www.djcxy.com/p/29053.html上一篇: Consuming message in the correct order from an Advanced Queue by Camel and JMS