Java 在Apache Camel中配置线程名称

Java 在Apache Camel中配置线程名称,java,spring,multithreading,apache-camel,Java,Spring,Multithreading,Apache Camel,我对ApacheCamel有点陌生,正在测试它,以便在我的应用程序上使用它(取代已经实现的Spring集成) 在过去的几天里,我一直在网上搜索ApacheCamel的文档站点和stackoverflow,但似乎找不到关于如何通过JavaDSL在ApacheCamel中配置线程名称的答案。 我只看到了,但它只说明了如何通过SpringDSL实现它。同样的 给出一些上下文: 现在我正在构建两个操作流程(第一个和第二个),每个流程都有一条路线 这两个路由都从不同的ActiveMQ队列读取,以不同的方

我对ApacheCamel有点陌生,正在测试它,以便在我的应用程序上使用它(取代已经实现的Spring集成)

在过去的几天里,我一直在网上搜索ApacheCamel的文档站点和stackoverflow,但似乎找不到关于如何通过JavaDSL在ApacheCamel中配置线程名称的答案。 我只看到了,但它只说明了如何通过SpringDSL实现它。同样的

给出一些上下文:

  • 现在我正在构建两个操作流程(第一个和第二个),每个流程都有一条路线
  • 这两个路由都从不同的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")
    ...