簡體   English   中英

按照Camel和JMS的高級隊列以正確的順序使用消息

[英]Consuming message in the correct order from an Advanced Queue by Camel and JMS

我將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();

這是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來消耗隊列中的第一條消息,只要它沒有被提交或移動到異常隊列? 我沒有找到在camel上直接配置它的選項...

我不是Oracle AQ專家,但據我所知,這是隊列中的設置,而不是客戶端。

sort_list參數確定消息出列的順序。 創建隊列表后,無法更改消息排序順序

來自: http//docs.oracle.com/cd/B19306_01/server.102/b14257/aq_admin.htm

您很可能已設置ENQ_TIME或COMMIT_TIME - 這可能已滿足您的需求。

當然,您的消費者必須是唯一的消費者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM