Java 在Apache Camel中配置线程名称
我对ApacheCamel有点陌生,正在测试它,以便在我的应用程序上使用它(取代已经实现的Spring集成) 在过去的几天里,我一直在网上搜索ApacheCamel的文档站点和stackoverflow,但似乎找不到关于如何通过JavaDSL在ApacheCamel中配置线程名称的答案。 我只看到了,但它只说明了如何通过SpringDSL实现它。同样的 给出一些上下文:Java 在Apache Camel中配置线程名称,java,spring,multithreading,apache-camel,Java,Spring,Multithreading,Apache Camel,我对ApacheCamel有点陌生,正在测试它,以便在我的应用程序上使用它(取代已经实现的Spring集成) 在过去的几天里,我一直在网上搜索ApacheCamel的文档站点和stackoverflow,但似乎找不到关于如何通过JavaDSL在ApacheCamel中配置线程名称的答案。 我只看到了,但它只说明了如何通过SpringDSL实现它。同样的 给出一些上下文: 现在我正在构建两个操作流程(第一个和第二个),每个流程都有一条路线 这两个路由都从不同的ActiveMQ队列读取,以不同的方
- 现在我正在构建两个操作流程(第一个和第二个),每个流程都有一条路线
- 这两个路由都从不同的ActiveMQ队列读取,以不同的方式处理消息,并将响应发送回不同的队列
- 我已经为每个路由配置了不同的concurrentConsumers和maxConcurrentConsumers(通过属性文件)
- 我想分配线程名称(或者至少是模式,因为我在每条路由上有很多消费者);在某种程度上,我可以有“FirstOp-X”和“SecondOp-X”(其中X是线程编号)
public class SampleCamelRouter extends RouteBuilder {
/**
* The first operation name
*/
public static final String FIRST_NAME = "first";
/**
* The second operation name
*/
public static final String SECOND_NAME = "second";
/**
* The ActiveMQ outbound queue format
*/
public static final String OUTBOUND_QUEUE_FORMAT = "activemq:queue:aq.%1$s.response";
/**
* The ActiveMQ inbound queue format
*/
public static final String INBOUND_QUEUE_FORMAT = "activemq:queue:aq.%1$s.request"
+ "?concurrentConsumers={{queue.%1$s.concurrentConsumers}}"
+ "&maxConcurrentConsumers={{queue.%1$s.maxConcurrentConsumers}}";
/*
* (non-Javadoc)
* @see org.apache.camel.builder.RouteBuilder#configure()
*/
@Override
public void configure() throws Exception {
from(String.format(INBOUND_QUEUE_FORMAT, FIRST_NAME))
.unmarshal().json(JsonLibrary.Jackson, FirstRequestMessage.class)
.bean(TestBean.class, "doFirst")
.marshal().json(JsonLibrary.Jackson)
.to(String.format(OUTBOUND_QUEUE_FORMAT, FIRST_NAME));
from(String.format(INBOUND_QUEUE_FORMAT, SECOND_NAME))
.unmarshal().json(JsonLibrary.Jackson, SecondRequestMessage.class)
.bean(TestBean.class, "doSecond")
.marshal().json(JsonLibrary.Jackson)
.to(String.format(OUTBOUND_QUEUE_FORMAT, SECOND_NAME));
}
我曾经在Spring集成中这样做(每个流):
所以基本上:我创建了不同的消息侦听器容器,这样,每个流有不同的线程名称。
在任何时候,如果线程被停止、阻塞,在线程转储中(甚至像打印日志一样简单),我都可以很容易地看到该线程所属的流
我看到ApacheCamel有一些变通方法(但不是每个路由,而是每个camelContext),但只使用SpringDSL而不是Java实现
如果每个路由的配置只有Spring才能实现,我不介意将配置更改为XML文件
请帮帮我,这对我来说是一个打破僵局的机会。对于我正在构建的应用程序,能够识别每个被隔离的线程是非常重要的;并且不喜欢默认的线程名称(Camel(Camel-1)thread#27-JmsConsumer[aa.first.request]):'-(.您可以通过
org.apache.Camel.impl.DefaultCamelContext#setExecutorServiceManager
为每个Camel上下文设置ExecutorServiceManager
-如果使用DefaultExecutorServiceManager
,则可以设置threadNamePattern
或者,您可以使用线程DSL,通过使用org.apache.camel.model.ProcessorDefinition#Threads(int,int,java.lang.String)
将线程池分配给路由,例如
from(String.format(INBOUND_QUEUE_FORMAT, FIRST_NAME))
.threads(1, 2, "first")
...
from(String.format(INBOUND_QUEUE_FORMAT, SECOND_NAME))
.threads(1, 2, "second")
...
请注意,使用threads()方法实际上意味着您将在Camel中使用异步处理模型
from(String.format(INBOUND_QUEUE_FORMAT, FIRST_NAME))
.threads(1, 2, "first")
...
from(String.format(INBOUND_QUEUE_FORMAT, SECOND_NAME))
.threads(1, 2, "second")
...