我有一個要求是如下:駱駝Reslet元器件與異步處理
- 接受包含XML到一定URL的HTTP POST請求。
- 執行先決條件操作,例如將請求XML保存到文件。
- 驗證傳入的XML是否與相應的模式匹配。
- 如果模式驗證失敗,則使用HTTP 400響應代碼進行同步響應。
- 如果模式驗證通過,則同步響應HTTP 200響應代碼。
- 傳遞XML消息以進一步處理。
- 當這個進一步的處理完成時,用一個HTTP 200響應代碼異步地響應調用者。
這是目前我如何有配置的路由:
onException(IOException.class)
.log(LoggingLevel.INFO, "Schema validation error on incoming message: ${id}")
.handled(true)
.maximumRedeliveries(0)
.process(schemaValidationErrorProcessor);
from("restlet:http://localhost:" + portNum + "/api/XX/XXX?restletMethod=POST")
.log(LoggingLevel.INFO, "Received message")
.convertBodyTo(String.class)
.multicast()
.parallelProcessing()
.to(SAVE_REQUEST_TO_FILE_QUEUE, PROCESS_PROVISIONING_REQUEST_QUEUE);
from(SAVE_REQUEST_TO_FILE_QUEUE)
.log(LoggingLevel.INFO, "Storing message: ${id}")
.to("file://" + requestLogFolder);
from(PROCESS_PROVISIONING_REQUEST_QUEUE)
.log(LoggingLevel.INFO, "Processing provisioning request: ${id}")
.process(requestGate)
.choice()
.when(header(SYSTEM_STATUS_HEADER).isEqualTo(true))
.unmarshal(xmlParser)
.inOnly("bean:requestHandler?method=handle")
.when(header(SYSTEM_STATUS_HEADER).isEqualTo(false))
.log(LoggingLevel.INFO, "Intentially dropping message")
.endChoice();
的模式驗證一部分經由.unmarshal實現(XMLPARSER)線(我一個JaxbDataFormat對象別處與集的模式配置那)。當架構驗證失敗時,拋出一個IOException,這由我的schemaValidationErrorProcessor處理,它將HTTP 400添加到響應中。
這一切工作正常。
我遇到的問題是傳遞XML消息進行進一步處理。基本上,我需要這是異步完成的,因爲當模式驗證通過時,我需要以200響應進行同步響應。我需要做的處理是在.inOnly(「bean:requestHandler?method = handle」)行中。
我天真地認爲設置路由到我的bean到inOnly會設置這是異步的,主路由不會等待響應。但是,requestHandler.handle方法拋出異常時情況並非如此,這會被拋回到REST端點的調用者。我不希望發生這種情況,因爲我希望所有這些處理都在「後臺」完成,因爲消費者已經收到了200條迴應。
所以,我的問題是,我將如何去實現這樣的行爲?我曾考慮過使用隊列等,但理想情況下,如果可能,最好避免使用這些組件。
你是說,你迴應了兩次,一次同步和異步一次,這充其量是陌生的,在最壞的情況 - 是不可能的。你可以做的是使用像Websockets或像Atmosphere這樣的抽象來繼續向客戶端推送消息,但是所有的消息都是異步的(這對你來說可能是一件好事)。 要獲得Camel中的異步行爲,請參閱:http://camel.apache.org/async.html – kaqqao 2015-04-26 18:47:47
他們是我們的業務需求。客戶想要一個同步響應來表明我們已經成功接收到他們的消息,並且他們想要在我們成功處理消息時進行異步回調。 – chrishern 2015-07-17 20:12:13