簡體   English   中英

Spring amqp - 異步請求/響應場景中的消息關聯

[英]Spring amqp - message correlation in asynchronous request/response scenario

目前我開發了一個小型履帶/刮刀應用程序,它分為兩部分。 第一部分(請求者)基於某種模式構建URL並將其發送給消費者(secound部分),其執行acutal scraping並返回結果。 然后進一步處理結果,並將其發送到另一個隊列,依此類推。

所以我認為使用spring-amqp項目和RabbitMQ消息服務的消息傳遞來排隊所有請求是個好主意。 這樣我就可以設置多個消費者,這些消費者都會監聽請求隊列。 現在我使用convertAndSend從請求者發出異步請求

@Autowired
private RabbitTemplate messagingTemplate;

public void doMessaging(String url){
    ...
    messagingTemplate.convertAndSend(queueName, url);

}

並在MessageListener中接收結果,該偵聽器響應隊列。 到目前為止一切正常,但我的問題是請求者的發送部分和接收部分是獨立的,我不知道如何確保我得到每個請求消息的響應(就像我使用convertSendAndReceive時一樣)。

所以我的問題是:這個問題是否有任何好的模式,或者我是否必須使用一些correlationId緩存所有請求並手動檢查響應是否到達?

在此輸入圖像描述

更新:

基本上我一直在尋找模式,因為spring-amqp提供的convertAndSend()的異步性很好。

我的場景更詳細:我在diagramm中調用“requestor”的組件從數據庫中讀取一些可配置的值。 基於這些信息,它創建了一個對象,比如說“爬行”,它包含有關爬行活動的信息。 在“階段1”開始之后,請求者根據可配置的值構建URL並將它們發送到queue1。 Queue1使用者廢棄網頁並將響應發送到response-queue1。

請求者偵聽response-queue1,獲取結果並將新消息推送到request-queue2(“階段2”)等......

我的問題是:我怎么知道例如“爬行”的所有階段都被解決/完成以存儲關於此運行的一些元數據並關閉它?

一個想法可能是,為每個請求消息創建一個correlationId,將它存儲在一個映射中,並在具有相同correlationId的響應到達時刪除該條目,但我認為這可能不是最好的做法。 是否有任何建議的解決方案或模式來處理此異步請求響應方案?

Spring Integration Project具有您需要的所有組件。

確切的實現將取決於您的要求 - 您可以使用屏障暫停調用線程直到收到回復,或者使用聚合器進行完全異步處理,例如,如果沒有收到回復,聚合器可以發送錯誤消息。

如果您能提供有關您的確切要求的更多詳細信息,我們可以幫助您入門。

如果由於某種原因不想使用Spring Integration,可以使用帶有MessagePostProcessor的模板的convertAndSend變量,以便設置相關ID。

您可以使用@RabbitListener接收POJO方法獲取轉換的有效負載和相關ID標頭的回復。

聽起來你的問題不是RabbitMQ問題; 相反,它是您的應用程序如何跟蹤長時間運行的任務的問題。

從概念的角度來看,您需要在某處跟蹤任務狀態,因為這是您感興趣的內容.RabbitMQ將不允許您查看排隊的消息。 因此,您需要擁有應用程序的單獨組件,以跟蹤其中各種作業的狀態。

暫無
暫無

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

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