0

私は現在、次のキャメルルートを持っています:

<camelContext id="my-camel-context" xmlns="http://camel.apache.org/schema/spring">
    <propertyPlaceholder id="envProps" location="classpath:myapp.properties" />
    <route id="my-camel-route"> 
        <from uri="{{start.uri}}"/>

        <setHeader headerName="id">
            <constant>1</constant>
        </setHeader>

        <to uri="bean:preProcessor?method=process" />

        <aggregate strategyRef="myAggregationStrategy" completionSize="1">
            <correlationExpression> 
                <simple>${header.id} == 1</simple> 
            </correlationExpression>
            <to uri="bean:postProcessor?method=process" /> 
        </aggregate> 

        <to uri="bean:mailer?method=process" /> 
    </route> 
</camelContext>

<bean id="myAggregationStrategy" class="com.me.myapp.MyAggregationStrategy" />
<bean id="postProcessor" class="com.me.myapp.PostProcessor" />
<bean id="mailer" class="com.me.myapp.Mailer" />

今のところ、意味のあるものを集約するつもりはありません ( completionSize=1)。本当にテストAggregationStrategyしているだけです。これが私の戦略です:

public class MyAggregationStrategy implements AggregationStrategy {
    @Override
    public Exchange aggregate(Exchange aggregatingExchange, Exchange incomingExchange) {
        AppPayload payload = null;

        if(aggregatingExchange == null)
            payload = new AppPayload(); // This should prevent it from being NULL below in PostProcessor...
        else
            payload = (AppPayload)incomingExchange.getIn().getBody();

        payload.setCargo((Order)incomingExchange.getIn().getBody());

        if(aggregatingExchange == null) {
            incomingExchange.getIn().setBody(payload);
            return incomingExchange;
        }
        else
            return aggregatingExchange;
    }
}

そしてまた私のpostProcessor豆:

public class PostProcessor implement Processor {
    @Override
    public void process(Exchange exchange) {
        try {
            System.out.println("In PostProcessor...");
            AppPayload payload = (AppPayload)exchange.getIn().getBody();
            System.out.println("\t...payload acquired...");

            if(payload == null)
                System.out.println("Payload is NULL.");
        } catch(Throwable throwable) {
            System.out.println(ExceptionUtils.getFullStackTrace(throwable));
        }
    }
}

このコードを実行すると、preProcessorBean が正しく実行されていることを示すログ メッセージが表示されます。また、メッセージを正しく「集約」し、最初のメッセージが到着MyAggregationStrategyした後にそれを渡すこともわかります(これも. ただし、次の出力が に表示されます。postProcessorcompletionSize=1postProcessor

In PostProcessor...
    ...payload acquired...
Payload is NULL.

なぜpayloadNULLになるのか誰にもわかりますか?内部で初期化されているはずではありませんMyAggregationStrategyか?!? もっと多くのコードを投稿できてうれしいですが、AggregationStrategyAPI の使い方が間違っていることが原因だと思います。

4

2 に答える 2

0

@hveiga が既に述べたことに追加します。メッセージにヘッダーを追加することで解決した同様の問題がありました。ただし、あなたの場合、スプリッターを使用しておらず、ヘッダーが既に定義されていることがわかります。したがって、Claus Ibssen から得た情報の一部は、最初の交換は空であり、null オブジェクトを確認する必要があるというものでした。

詳細については、これを参照してください - Apache Camel - 分割と集約 - 古い Exchange は常に null です

ここで完全な説明を追跡します - http://camel.465427.n5.nabble.com/Split-and-Aggregate-Old-Exchange-is-null-everytime-in-AggregationStrategy-td5746365.html

于 2014-01-29T18:43:01.080 に答える