The*_*odo 7 java jms advanced-queuing apache-camel
我将Apache Camel与Oracle Advanced Queues和JMS结合使用时遇到了问题.
它是关于分发消息的应用程序.在Camel的帮助下,消息在Oracle Advanced Queues中接收并入队.然后将它们与Camel一起使用并转发到目标系统.对于消息传递失败的情况,高级队列中定义了重试计数,以便重复传递消息.
如果Camel现在将消息出列并将其发送到不可用的目标系统,则抛出HttpOperationFailedException或NoSuchEndpointException.这些被捕获并且执行了回滚.
此时,期望消息传递将按照重试计数中定义的频率重试,然后移动到异常队列.但是,发生的事情是队列中的下一条消息是发送的.
由于消息的内容部分地相互依赖,因此必须按顺序处理它们.
我认为JMS库的使用存在错误配置,但我不确定并且没有发现任何可以影响此行为的内容.
使用的JMS库是Oracle AqApi v 11.2.0.3.
以下是Camel路线的代码:
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();
Run Code Online (Sandbox Code Playgroud)
这是JmsComponent配置:
JmsComponent jmsComponent = new JmsComponent(scc);
jmsComponent.setConnectionFactory(connectionFactory);
jmsComponent.setTransactionManager(tm);
jmsComponent.setMaxConcurrentConsumers(1);
jmsComponent.setMaxMessagesPerTask(1);
jmsComponent.setIncludeSentJMSMessageID(true);
Run Code Online (Sandbox Code Playgroud)
预先感谢您的帮助!
UPDATE
我想,我已经找到了描述行为的原因.高级队列上配置了延迟.只要延迟持续,队列中的下一条消息就会出列.消息不是随机出列的,它们根据优先级出列.
我真的认为这是必须在消费者身上配置的东西.是否有任何技巧可以配置camel-jms-component来消耗队列中的第一条消息,只要它没有被提交或移动到异常队列?我没有找到在camel上直接配置它的选项...
我不是 Oracle AQ 专家,但据我所知,这是队列上的设置,而不是客户端上的设置。
sort_list 参数确定消息出队的顺序。创建队列表后无法更改消息排序顺序
来自: http: //docs.oracle.com/cd/B19306_01/server.102/b14257/aq_admin.htm
您很可能设置了 ENQ_TIME 或 COMMIT_TIME - 这可能已经满足您的需求。
当然,您的消费者必须是唯一的消费者。
| 归档时间: |
|
| 查看次数: |
1401 次 |
| 最近记录: |