从Bean内部调用处理器

时间:2018-07-26 18:17:07

标签: java spring groovy apache-camel

Camel的新手,所以也许我误会了处理器和bean应该如何交互。我们在骆驼路线中记录了一些我们想做的数据库。想法是在处理器中执行此操作。但是,我们也想从bean中进行此日志记录。那可能吗?我知道我可以将它作为bean的返回字段传递回来...但是它已经传递了返回值。

一个相关的问题是,如何认为该身份是交换属性或标头,如何传递该身份。

基本上我想要一些类似的东西

处理器

class EventStatusProcessor implements Processor {

    @Override
    void process(Exchange exchange) throws Exception {

        // do some stuff, thinking this will be a header
    }
}

路线

from("direct:route1")
                .bean(doSomething, 'doSomething')
                .process(new EventStatusProcessor())

bean

@Component
@Slf4j
class DoSomething{
    String doSomething()

        //doing stuff

        new EventStatusProcessor().process()

1 个答案:

答案 0 :(得分:0)

您也可以将Exchange传递给使用bean组件调用的方法,并根据需要在其中设置标题/属性/正文/任何内容。

class DoSomething {
    @SuppressWarnings("unused") //called via Camel bean invocation
    public void doSomething(Exchange exchange){
        exchange.setProperty("propertyFromDoSomething", "Hello, I am property");
        exchange.getIn().setHeader("headerFromDoSomething", "Hi, I am header");
        exchange.getIn().setBody("It's me, body!");
    }
}

class EventStatusProcessor implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        System.out.println(exchange.getIn().getHeader("headerFromDoSomething", String.class));
        System.out.println(exchange.getProperty("propertyFromDoSomething", String.class));
        System.out.println(exchange.getIn().getBody(String.class));
    }
}

如果您确实需要在标题中调用处理器 inside bean,请提取处理器到direct路由,然后用ProducerTemplate调用它。

RouteBuilder

from("direct:log")
        .process(new EventStatusProcessor());

DoSomething类

public class DoSomething {
    @SuppressWarnings("unused") //called via Camel bean invocation
    public void doSomething(Exchange exchange){
        exchange.getContext().createProducerTemplate().sendBody("direct:log", "I am body and I will be passed to EventStatusProcessor");
    }
}