Java 在另一个线程上运行的camelbean方法

Java 在另一个线程上运行的camelbean方法,java,apache-camel,Java,Apache Camel,我有一个问题,希望很简单。。 我有一个驼峰路径,它执行一些操作,有一个处理器,这个处理器用一个相关id填充一个threadLocal变量。 在这之后,它运行一个.beanmybean,mymethod,在这个方法中,我试图从threadLocal变量中获取我的值,但它为null 我理解的一件事是在另一个线程上运行camel-runbean方法?这是真的吗 我添加了另一个bean方法调用.beanmyBean,myMethodForCorrelationIdcorrelationId,此方法设置t

我有一个问题,希望很简单。。 我有一个驼峰路径,它执行一些操作,有一个处理器,这个处理器用一个相关id填充一个threadLocal变量。 在这之后,它运行一个.beanmybean,mymethod,在这个方法中,我试图从threadLocal变量中获取我的值,但它为null

我理解的一件事是在另一个线程上运行camel-runbean方法?这是真的吗

我添加了另一个bean方法调用.beanmyBean,myMethodForCorrelationIdcorrelationId,此方法设置threadLocal变量,在.beanmyBean之后,mymethod可以访问threadLocal的正确值

守则:

private void getRoute() {

    from(RouteConstant.INTERNAL)
    // id
    .routeId("myroute")
    .setHeader(ElkKeys.EVENT_TYPE.getElkKey(), constant(EventType.EXCHANGE_REQUEST_REPLAY))
    // extract header from query uri
    .process(filtersListProcessor).choice()
    // caching predicate
    .when(cachePrediate)
    // get from cache
    .to(RouteConstant.GET_FROM_CACHE_ROUTE).otherwise()

    .bean(mybean,"myMethodForCorrelationId(${header.correlationId})") // first call fill the threadLocal

    // second call, the method use the previous threadLocal variable and it works
    .bean(mybean,
            "myMethod( ${header."
                    + ElkKeys.QUERY_PARAMETERS.getElkKey() + "})") 

    .multicast()
    // put in cache
    .to(ExchangePattern.InOnly, RouteConstant.PUT_INTO_CACHE_ROUTE).endChoice()

    .setHeader(ElkKeys.REPONSE_TIMESTAMP.getElkKey(), simple(RESPONSE_DATE_TIME))

    // send trace
    .to(ExchangePattern.InOnly, RouteConstant.SEND_SUCCESS_TRACE_TO_ELK);
}
我在谷歌上搜索,但我找不到任何关于这个的东西,是不是第一个bean方法的线程每次在任何情况下都会与第二个bean方法相同

如果有人知道答案,我希望你能帮助我


总之,你在问题中描述了一种奇怪的情况。事实上,我在您的路径中没有看到任何强制执行多线程的内容

Bean调用不会在其他线程中处理

默认情况下,驼峰路由由一个线程处理。这意味着您的from端点通常使用线程池来并行处理多个请求,例如HTTP或JMS端点,但每个请求都由一个线程完成。此线程通过完整路由发送消息

我很快创建了此路线,并向其发送了一条消息:

from("direct:input")
    .log("Camel Route: " + Thread.currentThread().getName())
    .process(new TestProcessor()) // writes Thread.currentThread().getName() to System.out
    .bean(new BeanThread()); // writes Thread.currentThread().getName() to System.out
控制台输出与预期一致:

Camel Route: main
Processor: main
Bean: main
但是,有两个有状态的组件,比如聚合器。一旦使用其中一个,管线上的线程视图就会变得更加复杂

但是,正如我在一开始所写的,我没有在你的路线中看到这些


然而,最大的问题是:为什么要使用ThreadLocal变量?为以后保存值的方法是将它们放入消息头中。这样,您就可以保证与给定消息相关的值在路由的后面仍然存在

嘿,谢谢你的回答,事实上,当我记录一些东西时,我需要记录一个相关ID。我试着用骆驼牌MDC,但它不起作用。因此,我尝试将我的关联ID放入处理器中的threadLocal变量中,并将其放入我的bean中,但它为null,因此我的结论是:我的bean方法在另一个线程上运行:/但是您所说的是我一开始所想的。。顺便说一句,我要看看我是否有强制多线程的东西:你可以把你的处理器重构成一个Bean。处理器接口陈旧而笨拙,Bean更易于测试,因为您不需要传递交换。看看如何将各种消息部分注入POJO方法。我不确定处理器,并进行了快速路由测试。处理器和Bean都由主线程处理。请参阅我的最新答案。