java - Camel AggregationStrategy 生成 NULL 消息体

标签 java nullpointerexception apache-camel aggregate enterprise-integration

我目前有以下 Camel 路线:

<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 bean:

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));
        }
    }
}

当我运行此代码时,我看到来 self 的 preProcessor bean 的日志消息,表明它正在正确执行。我还看到 MyAggregationStrategy 正确地“聚合”了消息,然后在第一条消息到达后让它传递给 postProcessor (同样,因为 completionSize=1 )。但是,我在 postProcessor 中得到以下输出:

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

有人能明白为什么payload将为NULL吗?它不应该在MyAggregationStrategy内部初始化吗?!?我很高兴发布更多代码,但我相信这是因为我错误地使用了 AggregationStrategy API。

最佳答案

我相信您对聚合 Exchange传入 Exchange 感到困惑。你能试试这个吗:

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)aggregatingExchange.getIn().getBody();
        }

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

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

关于java - Camel AggregationStrategy 生成 NULL 消息体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21410330/

相关文章:

java - ResourcePool 无法从其主要工厂或来源获取资源

java - 如何实现通用计算器类

java - 硬件 : Java program generating NullPointerException error message

apache-camel - Apache Camel 使用 HTTP 定义路由

具有不同结果的Java JLabel setHorizo​​ntalAlignment

java - 为什么字节数组不能存储在java中的整数数组中

具有 fragment 空指针异常的Android RecyclerView适配器

java - 使用 DatatypeConverter.parseHexBinary() 时出现 NullPointerException

apache-camel - Apache Camel 生产者消费者术语困境

java - 如何使用 Camel 创建数据源?