按照骆驼和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

下一篇: shell) headlessly on linux server through Nightmare.js