2016-11-15 177 views
0

親愛的社區。Apache的駱駝:春天組播+處理

我試圖添加多播聚合策略在Spring配置XML以不同的方式,這是我在Apache論壇,計算器和其他很多從Java DSL轉換的發現。

東西我得到錯過了,你可以想,可以如何配置以獲取下面描述的情況的正確行爲。

我有一些名稱列表(所有的bean被正確定義),

<to id="_to85" uri="bean:otrsCIApi?method=ConfigItemNameList()"/> 

那麼我就需要做一個電話後分割對方在兩個不同的系統:

<split streaming="true"> 
    <simple>${body}</simple> 
    <!-- iterate in JsonArray --> 
    <choice> 
     <when> 
      <simple>${body} != ''</simple> 
      <multicast stopOnException="true" parallelProcessing="true" strategyRef="OtrsZabbixCiAggregationStrategy" > 
       <to uri="direct:zabbix_multicast"/> 
       <to uri="direct:otrs_multicast"/> 
       <to uri="log:jms_apachemq3"/> 
      </multicast> 
      <to id="_to92" uri="log:jms_apachemq4"/> 
     </when> 
     <when> 
      <simple>${body} == ''</simple> 

     </when> 
    </choice> 
</split> 

每個直接由具有後調用的方法,這是正常工作(並返回JSONObject.toString()):

<route> 
    <from uri="direct:zabbix_multicast"/> 
    <to uri="bean:zabbixApi?method=getHostBody(body)"/> 
    <to uri="log:multicast_zab1"/> 
</route> 

<route> 
    <from uri="direct:otrs_multicast"/> 
    <to uri="bean:otrsCIApi?method=searchCI(body)"/> 
    <to uri="log:multicast_otrs1"/> 
    <to uri="bean:otrsCIApi?method=getCIBodyByID(body)"/> 
    <to uri="log:multicast_otrs2"/> 
</route> 

聚合策略是非常簡單的,應該工作:

import org.apache.camel.Exchange; 
import org.apache.camel.processor.aggregate.AggregationStrategy; 
public class OtrsZabbixCiAggregationStrategy implements AggregationStrategy{ 
    public Exchange aggregate(Exchange exchange1, Exchange exchange2) { 
      String body1 = exchange1.getIn().getBody().toString(); 
      String body2 = exchange2.getIn().getBody().toString(); 
      String merged = body1 + "," + body2; 
      exchange1.getIn().setBody(merged); 
      return exchange1; 
    } 
} 

那麼我就非常奇怪的輸出,如沒有聚集起:

[fc8135) thread #39 - Multicast] jms_apachemq3     INFO Exchange[ExchangePattern: InOnly, BodyType: String, Body: Zabbix server] 
[fc8135) thread #37 - Multicast] multicast_zab1     INFO Exchange[ExchangePattern: InOnly, BodyType: String, Body: [{"available":"1","description":"","disable_until":"0","error":"","errors_from":"0","flags":"0","host":"Zabbix server","hostid":"10084","ipmi_authtype":"-1","ipmi_available":"0","ipmi_disable_until":"0","ipmi_error":"","ipmi_errors_from":"0","ipmi_password":"","ipmi_privilege":"2","ipmi_username":"","jmx_available":"0","jmx_disable_until":"0","jmx_error":"","jmx_errors_from":"0","lastaccess":"0","maintenance_from":"0","maintenance_status":"0","maintenance_type":"0","maintenanceid":"0","name":"Zabbix server","proxy_hostid":"0","snmp_available":"0","snmp_disable_until":"0","snmp_error":"","snmp_errors_from":"0","status":"0","templateid":"0","tls_accept":"1","tls_connect":"1","tls_issuer":"","tls_psk":"","tls_psk_identity":"","tls_subject":""}]] 
[fc8135) thread #38 - Multicast] multicast_otrs1    INFO Exchange[ExchangePattern: InOnly, BodyType: com.alibaba.fastjson.JSONArray, Body: 2] 
[fc8135) thread #38 - Multicast] multicast_otrs2    INFO Exchange[ExchangePattern: InOnly, BodyType: String, Body: {"ConfigItem":[{"CurInciState":"Operational","ConfigItemID":"2","InciStateType":"operational","CurInciStateType":"operational","Number":"1022000002","CreateBy":"2","LastVersionID":"2","DeplState":"Production","CurDeplState":"Production","CreateTime":"2016-11-01 13:47:44","DefinitionID":"1","VersionID":"2","DeplStateType":"productive","CIXMLData":{"SerialNumber":"","Ram":"","WarrantyExpirationDate":"2016-11-01","Vendor":"","CPU":"","Model":"","Owner":"","Type":"","HardDisk":{"HardDisk":"","Capacity":""},"GraphicAdapter":"","FQDN":"","OperatingSystem":"","Description":""},"Class":"Computer","InciState":"Operational","CurDeplStateType":"productive","Name":"Zabbix server"}]}] 
[hread #32 - JmsConsumer[queue]] jms_apachemq4     INFO Exchange[ExchangePattern: InOnly, BodyType: String, Body: Zabbix server] 

所以我希望身體與分裂兩個String JSON逗號(就像在聚合策略類中一樣),但是我只有body,它會發送到其他路由。

任何想法?

回答

2

我相信你有你的AggregationStrategy一個NullPointerException。 當它被稱爲第一次,exchange1是NULL和exchange2是從你第一次運行的交換對象。 由於參數stopOnException="true"異常被忽略,多播停止。 因此,你必須事後你原來的交換對象。

你只需要一個需要檢查它應該工作:

public Exchange aggregate(Exchange exchange1, Exchange exchange2) { 
     if (exchange1==null){ 
      return exchange2; 
     } 
     String body1 = exchange1.getIn().getBody().toString(); 
     String body2 = exchange2.getIn().getBody().toString(); 
     String merged = body1 + "," + body2; 
     exchange1.getIn().setBody(merged); 
     return exchange1; 
} 
+0

它真的幫助我,謝謝! 我剛剛加入 如果(Exchange1中== NULL){ 回報Exchange2中; } 並得到了妥善的身體上<以ID = 「_ TO92」 URI = 「日誌:jms_apachemq4」/>點。 – smartydoc