簡體   English   中英

JMS使用者阻止其他JMSXGroups

[英]JMS Consumer blocking other JMSXGroups

我試圖弄清楚在將消息回滾到隊列時是否仍然可以影響消費者的消息處理順序。 我下面有一些簡單的代碼,可以幫助我重現此問題。 我只是將消息按特定順序推入具有不同JMSXGroupIds的隊列中:

  1. “ A1”(JMSXGroupId:1)
  2. “ B1”(JMSXGroupId:2)
  3. “ A2”(JMSXGroupId:1)
  4. “ C1”(JMSXGroupId:3)
  5. “ B2”(JMSXGroupId:2)

該代碼使A1回滾(它最初重試消息3次),並延遲返回到隊列。 但是,消費者隨后等待,直到它可以再次取回A1(在等待了延遲的時間之后),這意味着B1和C1組被阻止在A1后面,並且從未得到處理。

理想情況下,我希望的是當A1放回隊列並被告知等待時,消費者將接走B1和C1 ...我最終想要做的是停止一個JMSXGroup阻止另一個消費者。 另外,可能值得補充的一點是,我需要保持A(A1,A2,A3 ...)的消息順序,並且希望通過將它們放在隊列中來做到這一點,而不是必須為異常構建一些管理解決方案。

onException(Exception.class)
            .log("Exception Caught !! ")
            .redeliveryDelay("1000")
            .maximumRedeliveries(3)
            .handled(false)
            .markRollbackOnly()
            .log("log:output");

    from("amq:queue:mailbox?concurrentConsumers=1")
            .to(logEndpoint)
            .process(exchange -> {
                if(exchange.getIn().getBody(String.class).contains("A")) {
                    throw new Exception("Found A");
                }
            });

我正在使用具有事務處理路由的基於Java的Apache Camel微服務。 沒什么不尋常的,但如果需要,我可以提供更多詳細信息/配置詳細信息。

提前致謝

由於隊列必須遵守其基本的先進先出(即FIFO)語義,因此嚴格排序隊列肯定會遇到類似問題。 即使在A1發生故障后立即拾取B1,您也必須等待消耗A2直到消耗A1才能保留順序,並且由於必須使用隊列,所以FIFO必須被使用,這會阻止C1和其他任何消息的消耗在它后面。

您正在使用Camel的重新交付,它將僅重新交付調用處理器方法(例如,失敗的地方),而不是整個路線。

您可能希望研究使用JMS事務,並讓消息一直回滾到JMS代理,並在消息代理上配置重新交付設置。

如果您擁有《駱駝在行動》一書的副本,那么我建議您閱讀事務一章和錯誤處理一章。

您的問題是由於使用者終結點上的concurrentConsumers=1 如果只有一個使用者,則不可能並行處理JMS組

有了這個限制,您就可以有效地擁有一個Exclusive Consumer ,並且JMS組頭不起作用,因為無論如何,只有一個使用者可以處理消息。

JMSXGroupId標頭可確保具有相同組ID的所有消息均由同一使用者處理 因此,如果您有3個使用者,則即使消息A1在一段時間內“阻止”了組A的使用者,示例中的3個組也可以並行處理。

但是,當使用者數量少於組數量時 ,當然會出現一條消息可以阻止其他組的情況,這僅僅是因為一個使用者可以處理多個組。

暫無
暫無

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

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