2015-10-16 76 views
0

我有一個場景,我使用的是Apache Camel(版本2.15.2)來提供允許創建「配置文件」的REST服務。該服務嘗試將Profile有效載荷分成多個不同類型的對象(第1,2和3節),並將每個對象類型的創建委託給不同的應用程序。複雜之處有被用來創建第2 & 3.下面是一個例子路由的定義,作爲第1,需要的部分創建的數據:駱駝路由響應與我路由中的最後一點不同

rest("/v1/Profile") 
    .post().consumes("application/json").produces("application/json") 
      .type(Profile.class) 
      .description("Create a new profile") 
      .route() 
      // Save the original JSON payload into an exchange property 
      .setProperty(ORIGINAL_PAYLOAD_KEY, simple("${in.body}")) 

      // validate the payload 
      .to(postProfileValidationEndpoint) 

      // Extract Section 1 from the request 
      .marshal().json(JsonLibrary.Jackson) 
      .transform().jsonpath("$.section1") 
      .marshal().json(JsonLibrary.Jackson) 

      // send the request to Section 1 app 
      .to(section1Queue) 
      .unmarshal().json(JsonLibrary.Jackson, Section1.class) 

      // Save the profile id of the newly created section 1 instance 
      .setHeader("profileId", new JsonPathExpression("$.profileId")) 

      // Based on the original payload (see above), extract Section 2 and 3 as separate messages 
      .split().method("profileSplitter", "generateProfileCreateMessages") 
       .parallelProcessing() 
       .choice() 
        .when(header(SECTION_2_REQUEST)) 
         .to(section2Queue) 
        .when(header(SECTION_3_REQUEST)) 
         .to(section3Queue) 
       .end() 

      // consolidate responses from section 2 and 3 applications 
      .aggregate(header("breadcrumbId"), profileAggregationStrategy) 
       .completionTimeout(timeout)                  
       .completionSize(exchangeProperty(COMPLETION_SIZE_PROPERTY)) 
      .to("log:com.example.profile.route?level=DEBUG&showAll=true&multiline=true"); 

我看到的問題是,日誌語句在路線的最後,打印響應體的確切方式,我期望它。但是,當我從PostMan調用這條路由時,返回值是「.unmarshal()。json(JsonLibrary.Jackson,Section1.class)」的結果。

我試過調試和啓用跟蹤的路線,我還沒有找到解釋爲什麼我的聚合結果(我已確認工作正常)不返回。

任何想法?

回答

0

集合的輸出運行在與輸入不同的線程中。因此,在REST響應發回給客戶端之後,正在進行日誌記錄。

分離器具有可用於在相同請求中聚合的內置聚合器,因此您可以將其用作REST響應的一部分。

+0

感謝您的回覆。我認爲你說的話可能會發生,但是,當我調試路由時,直到我的自定義聚合策略完成後,響應纔會返回給客戶端。 FWIW,我還分別配置了聚合部分,因此我可以使用自定義聚合策略類以及完成超時和完成大小條件。有沒有辦法做到這一點,並明確將聚合器綁定到split()的範圍? – JJensL