2016-07-13 19 views
1

私はApache Camelには新しく、アプリケーションで使用するためにテストしています(すでにSpring Integrationを実装しています)。Apache Camelでのスレッド名の設定

私はApache Camelのドキュメンテーションサイトと最終回のstackoverflowを検索してきましたが、Java DSL経由でApache Camelでスレッドの名前を設定する方法についての回答は見つからないようです。 私はthisthis other questionしか見ることができませんでしたが、それはSpring DSLを介して行う方法しか述べていません。 Apache Camel documentation pageと同じです。

いくつかのコンテキストを与える:

  • は、今私は2つの操作の流れ(第1、第2)を構築していますし、それぞれが、それは1つのルートのしています。
  • 両方のルートが異なる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)); 
} 

は、私が(フローごと)このようなもので春の統合でそれを行うために使用される:

@Bean 
public static IntegrationFlow setUpFirstFlow() { 

    final DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer(); 
    messageListenerContainer.setBeanName("FirstOp"); 
    messageListenerContainer.setDestinationName("aq.first.request"); 
    messageListenerContainer.setConcurrentConsumers(concurrentConsumers); 
    messageListenerContainer.setMaxConcurrentConsumers(maxConcurrentConsumers); 

    return IntegrationFlows.from(Jms.messageDrivenChannelAdapter(messageListenerContainer)) 
      .transform(new JsonToObjectTransformer(FirstRequestMessage.class)) 
      .handle(TestBean.class, "doFirst") 
      .transform(new ObjectToJsonTransformer()) 
      .handle(Jms.outboundAdapter(.......)).get(); 
} 

だから、基本的に:私は別のメッセージリスナーを作成コンテナであり、その方法では、フローごとに異なるスレッド名があります。 スレッドダンプ内でスレッドが停止、ブロックされた場合(またはログを印刷するだけでも)、スレッドが属するフローを簡単に確認できます。

Apache Camelには回避策がいくつかありますが(経路ごとではなくcamelContextごとに)、JavaではなくSpring DSLを使用して実装されています。

このルート単位の設定がSpringのみで可能な場合は、設定をXMLファイルに変更しても構いません。

私を助けてください、それは私のためのタイブレーカーのようなものです。私が構築しているアプリケーションでは、分離された各スレッドを識別できることが非常に重要です。本当にデフォルトのスレッド名(キャメル(ラクダ-1)スレッド#27 - JmsConsumer [aa.first.request])のようにしないでください。 ' - (

答えて

0

をあなたは経由キャメルコンテキストごとExecutorServiceManagerを設定することができますorg.apache.camel.impl.DefaultCamelContext#setExecutorServiceManager - あるいはあなたがDefaultExecutorServiceManagerを使用する場合はthreadNamePatternを設定することができます

、あなたは、スレッドを使用していることなど

from(String.format(INBOUND_QUEUE_FORMAT, FIRST_NAME)) 
    .threads(1, 2, "first") 
    ... 

from(String.format(INBOUND_QUEUE_FORMAT, SECOND_NAME)) 
    .threads(1, 2, "second") 
    ... 

注スレッドDLSを使用してorg.apache.camel.model.ProcessorDefinition#threads(int, int, java.lang.String)を使用してルーティングするために、スレッドプールを割り当てることができます()メソッドは事実上、あなたのCamelの非同期処理モデルを使用します。

関連する問題