2014-10-31 32 views
0

我有一個要求是如下:駱駝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條迴應。

所以,我的問題是,我將如何去實現這樣的行爲?我曾考慮過使用隊列等,但理想情況下,如果可能,最好避免使用這些組件。

+0

你是說,你迴應了兩次,一次同步和異步一次,這充其量是陌生的,在最壞的情況 - 是不可能的。你可以做的是使用像Websockets或像Atmosphere這樣的抽象來繼續向客戶端推送消息,但是所有的消息都是異步的(這對你來說可能是一件好事)。 要獲得Camel中的異步行爲,請參閱:http://camel.apache.org/async.html – kaqqao 2015-04-26 18:47:47

+0

他們是我們的業務需求。客戶想要一個同步響應來表明我們已經成功接收到他們的消息,並且他們想要在我們成功處理消息時進行異步回調。 – chrishern 2015-07-17 20:12:13

回答

0

使用Camel Websocket組件異步響應調用者。

Camel documentation

from("activemq:topic:newsTopic") 
    .routeId("fromJMStoWebSocket") 
    .to("websocket://localhost:8443/newsTopic?sendToAll=true&staticResources=classpath:webapp");