Java 从Bean内部调用处理器

Java 从Bean内部调用处理器,java,spring,groovy,apache-camel,Java,Spring,Groovy,Apache Camel,Camel是新手,所以我可能误解了处理器和bean应该如何交互。我们有一些数据库的日志记录,我们想在整个驼峰路线中进行。这个想法是在处理器中实现的。但是,我们也希望从bean中的w/进行日志记录。可能吗?我知道我可以将它作为返回字段从bean中传递回来……但是它已经在传递返回了 一个相关的问题是如何传递该状态,认为它将是交换属性或头 基本上,我想要的是类似于 处理机 class EventStatusProcessor implements Processor { @Override

Camel是新手,所以我可能误解了处理器和bean应该如何交互。我们有一些数据库的日志记录,我们想在整个驼峰路线中进行。这个想法是在处理器中实现的。但是,我们也希望从bean中的w/进行日志记录。可能吗?我知道我可以将它作为返回字段从bean中传递回来……但是它已经在传递返回了

一个相关的问题是如何传递该状态,认为它将是交换属性或头

基本上,我想要的是类似于

处理机

class EventStatusProcessor implements Processor {

    @Override
    void process(Exchange exchange) throws Exception {

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

豆子

您也可以传递给使用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));
    }
}

如果您真的需要在bean中调用处理器,当您在标题中编写时,将处理器提取到
直接
路由,然后使用调用它

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

谢谢,抱歉耽搁了。我学到了很多,并与一些人讨论了这一点。他们不太喜欢将bean传递给exchange的想法(看起来它实际上是一个处理器,伪装成bean:),但我们想不出另一种方法:/最后,我认为我们将坚持从路线上这样做。所以,这稍微改变了我的问题。现在每个“日志”有两行:*setProperty('statusName','status')*。process(statusProcessor)我们希望做一行,.recordStatus(“Started”)有什么方法可以做到吗?这应该是一个单独的帖子吗?是的,问一个新问题。在评论中没有足够的空间用于此。但我不明白你们对“把豆子传给交易所”的看法,所以若你们想提出新问题,请详细说明。好的,谢谢。我在评论中解释这一点的篇幅太长了。这么好的建议。谢谢你的时间
from("direct:log")
        .process(new EventStatusProcessor());
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");
    }
}