gpt4 book ai didi

java - Camel bean方法在另一个线程上运行

转载 作者:行者123 更新时间:2023-12-02 09:08:52 24 4
gpt4 key购买 nike

我有一个问题,希望它很简单。我有一个 Camel 路线,它做出一些 Action ,有一个处理器,这个处理器用相关ID填充一个threadLocal变量。之后,它运行一个 .bean(mybean, "mymethod"),在这个方法中我尝试从 threadLocal 变量获取我的值,但它是空的。

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

我添加了另一个bean方法调用.bean(myBean, "myMethodForCorrelationId(correlationId)"),该方法设置了threadLocal变量,并且在.bean(mybean, "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 方法相同(每次在每种情况下)?

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

谢谢大家,

最佳答案

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

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

默认情况下,Camel 路由由 1 个线程处理。这意味着您的 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

但是,有一些“有状态”组件,例如聚合器。一旦您使用其中之一,路线上的线程 View 就会变得更加复杂。

但是,正如我在开头所写的,我在您的 route 没有看到其中一个。

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

关于java - Camel bean方法在另一个线程上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59575725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com