第37章 プロデューサーおよびコンシューマーテンプレート

概要

Apache Camel のプロデューサーテンプレートおよびコンシューマーテンプレートは、Spring コンテナー API の機能にちなんでモデル化されています。リソースへのアクセスは、テンプレート と呼ばれる単純で使いやすい API を使用して提供されます。Apache Camel の場合、プロデューサーテンプレートおよびコンシューマーテンプレートは、プロデューサーエンドポイントおよびコンシューマーエンドポイントとの間でメッセージを送受信するためのシンプルなインターフェイスを提供します。

37.1. プロデューサーテンプレートの使用

37.1.1. プロデューサーテンプレートの概要

概要

プロデューサーテンプレートは、プロデューサーエンドポイントを呼び出すさまざまな方法をサポートします。リクエストメッセージの異なる形式 (Exchange オブジェクト、メッセージボディー、単一のヘッダー設定を持つメッセージボディーなど) をサポートするメソッドや、呼び出しの同期と非同期スタイルの両方をサポートするメソッドがあります。全体的なプロデューサーテンプレートメソッドは、以下のカテゴリーにグループ化できます。

または、「Fluent Producer テンプレートの使用」 を参照してください。

同期呼び出し

エンドポイントを同期的に呼び出すメソッドには、sendSuffix() および requestSuffix() という形式の名前があります。たとえば、デフォルトのメッセージ交換パターン (MEP) または明示的に指定された MEP を使用してエンドポイントを呼び出すメソッドには、send()sendBody()、および sendBodyAndHeader() の名前が付けられます (これらのメソッドがそれぞれ Exchange オブジェクト、メッセージボディー、またはメッセージボディーおよびヘッダー値を送信する場合)。MEP を InOut (リクエスト/リプライセマンティクス) に強制するには、代わりに request()requestBody()、および requestBodyAndHeader() メソッドを呼び出します。

以下の例は、ProducerTemplate インスタンスを作成し、これを使用してメッセージボディーを activemq:MyQueue エンドポイントに送信する方法を示しています。この例は、sendBodyAndHeader() を使用してメッセージボディーとヘッダー値を送信する方法も示しています。

import org.apache.camel.ProducerTemplate
import org.apache.camel.impl.DefaultProducerTemplate
...
ProducerTemplate template = context.createProducerTemplate();

// Send to a specific queue
template.sendBody("activemq:MyQueue", "<hello>world!</hello>");

// Send with a body and header
template.sendBodyAndHeader(
    "activemq:MyQueue",
    "<hello>world!</hello>",
    "CustomerRating", "Gold" );

プロセッサーを使用した同期呼び出し

同期呼び出しの特別なケースとして、send() メソッドに引数 Exchange ではなく引数 Processor を指定することがあります。この場合、プロデューサーテンプレートは暗黙的に指定のエンドポイントに Exchange インスタンスを作成するよう指示します (常にではありませんが、通常はデフォルトで InOnly MEP を持ちます)。このデフォルトのエクスチェンジはプロセッサーに渡され、エクスチェンジオブジェクトの内容を初期化します。

以下の例は、MyProcessor プロセッサーによって初期化されたエクスチェンジを activemq:MyQueue エンドポイントに送信する方法を示しています。

import org.apache.camel.ProducerTemplate
import org.apache.camel.impl.DefaultProducerTemplate
...
ProducerTemplate template = context.createProducerTemplate();

// Send to a specific queue, using a processor to initialize
template.send("activemq:MyQueue", new MyProcessor());

MyProcessor クラスは以下の例のように実装されます。(ここで示したように) In メッセージボディーを設定する他に、メッセージヘッダーおよび交換プロパティーを初期化することもできます。

import org.apache.camel.Processor;
import org.apache.camel.Exchange;
...
public class MyProcessor implements Processor {
    public MyProcessor() { }

    public void process(Exchange ex) {
        ex.getIn().setBody("<hello>world!</hello>");
    }
}

非同期呼び出し

エンドポイントを 非同期的 に呼び出すメソッドの名前の形式は、asyncSendSuffix() および asyncRequestSuffix() です。たとえば、デフォルトのメッセージ交換パターン (MEP) または明示的に指定された MEP を使用してエンドポイントを呼び出すメソッドには、asyncSend() および asyncSendBody() の名前が付けられます (これらのメソッドはそれぞれ Exchange オブジェクトまたはメッセージボディーを送信します)。MEP を InOut (リクエスト/リプライセマンティクス) に強制するには、代わりに asyncRequestBody()asyncRequestBodyAndHeader()、および asyncRequestBodyAndHeaders() メソッドを呼び出します。

以下の例は、direct:start エンドポイントにエクスチェンジを非同期的に送信する方法を示しています。asyncSend() メソッドは、後で呼び出しの結果を取得するために使用される java.util.concurrent.Future オブジェクトを返します。

import java.util.concurrent.Future;

import org.apache.camel.Exchange;
import org.apache.camel.impl.DefaultExchange;
...
Exchange exchange = new DefaultExchange(context);
exchange.getIn().setBody("Hello");

Future<Exchange> future = template.asyncSend("direct:start", exchange);

// You can do other things, whilst waiting for the invocation to complete
...
// Now, retrieve the resulting exchange from the Future
Exchange result = future.get();

プロデューサーテンプレートは、メッセージのボディーを非同期的に送信するメソッドも提供します (例: asyncSendBody() または asyncRequestBody() を使用します)。この場合、以下のヘルパーメソッドのいずれかを使用して、Future オブジェクトから返されたメッセージのボディーを抽出できます。

<T> T extractFutureBody(Future future, Class<T> type);
<T> T extractFutureBody(Future future, long timeout, TimeUnit unit, Class<T> type) throws TimeoutException;

呼び出しが完了し、リプライメッセージが表示されるまで extractFutureBody() メソッドの最初のバージョンはブロックされます。extractFutureBody() メソッドの 2 番目のバージョンでは、タイムアウトを指定できます。どちらのメソッドも type 引数 type を持ち、組み込み型コンバーターを使用して、返されるメッセージのボディーを指定された型にキャストします。

以下の例は、asyncRequestBody() メソッドを使用してメッセージボディーを direct:start エンドポイントに送信する方法を示しています。次に、ブロッキングしている extractFutureBody() メソッドを使用して Future オブジェクトからリプライメッセージのボディーを取得します。

Future<Object> future = template.asyncRequestBody("direct:start", "Hello");

// You can do other things, whilst waiting for the invocation to complete
...
// Now, retrieve the reply message body as a String type
String result = template.extractFutureBody(future, String.class);

コールバックを使用した非同期呼び出し

上記の非同期例では、リクエストメッセージはサブスレッドでディスパッチされ、応答はメインスレッドによって取得および処理されます。しかし、プロデューサーテンプレートでも、asyncCallback()asyncCallbackSendBody()、または asyncCallbackRequestBody() メソッドのいずれかを使用して、サブスレッドで返信を処理するオプションもあります。この場合、コールバックオブジェクト (org.apache.camel.impl.SynchronizationAdapter タイプ) を指定します。このオブジェクトは、リプライメッセージが到達するとすぐに自動的にサブスレッドで呼び出されます。

Synchronization コールバックインターフェイスは、以下のように定義されます。

package org.apache.camel.spi;

import org.apache.camel.Exchange;

public interface Synchronization {
    void onComplete(Exchange exchange);
    void onFailure(Exchange exchange);
}

ここで、通常の応答の受信時に onComplete() メソッドが呼び出され、障害メッセージの応答を受け取る際に onFailure() メソッドが呼び出されます。これらのメソッドの 1 つのみが呼び出されるため、両方のメソッドを上書きして、すべてのタイプの応答が処理されるようにする必要があります。

以下の例は、リプライメッセージが SynchronizationAdapter コールバックオブジェクトによってサブスレッドで処理される、direct:start エンドポイントにエクスチェンジを送信する方法を示しています。

import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

import org.apache.camel.Exchange;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.impl.SynchronizationAdapter;
...
Exchange exchange = context.getEndpoint("direct:start").createExchange();
exchange.getIn().setBody("Hello");

Future<Exchange> future = template.asyncCallback("direct:start", exchange, new SynchronizationAdapter() {
    @Override
    public void onComplete(Exchange exchange) {
        assertEquals("Hello World", exchange.getIn().getBody());
    }
});

SynchronizationAdapter クラスは Synchronization インターフェイスのデフォルト実装で、onComplete() および onFailure() コールバックメソッドの独自の定義を上書きできます。

asyncCallback() メソッドによって Future object vulkan-conditionals も返すため、メインスレッドから応答にアクセスするオプションは依然としてあります。

// Retrieve the reply from the main thread, specifying a timeout
Exchange reply = future.get(10, TimeUnit.SECONDS);

37.1.2. 同期送信

概要

同期送信 メソッドは、プロデューサーエンドポイントの呼び出しに使用できるメソッドのコレクションです。メソッド呼び出しが完了し、応答 (ある場合) が受信されるまで現在のスレッドをブロックします。これらのメソッドは、あらゆる種類のメッセージ交換プロトコルと互換性があります。

エクスチェンジの送信

基本的な send() メソッドは、エクスチェンジのメッセージ交換パターン (MEP) を使用して、Exchange オブジェクトのコンテンツをエンドポイントに送信する汎用メソッドです。戻り値は、プロデューサーエンドポイントによって処理された後に取得するエクスチェンジです (MEP によっては Out メッセージが含まれる可能性があります)。

デフォルトのエンドポイント、エンドポイント URI、または send() オブジェクトとしてターゲットエンドポイントを指定できるエクスチェンジの送信では、3 種類の Endpoint メソッドががあります。

Exchange send(Exchange exchange);
Exchange send(String endpointUri, Exchange exchange);
Exchange send(Endpoint endpoint, Exchange exchange);

プロセッサーによって提供されたエクスチェンジの送信

一般的な send() メソッドは、エクスチェンジオブジェクトを明示的に提供するのではなく、プロセッサーを使用してデフォルトのエクスチェンジを設定することです (詳細は 「プロセッサーを使用した同期呼び出し」 を参照してください)。

プロセッサーによって設定されるエクスチェンジを送信する send() メソッドにより、デフォルトのエンドポイント、エンドポイント URI、または Endpoint オブジェクトとしてターゲットエンドポイントを指定できます。さらに、オプションでエクスチェンジの MEP を指定するには、デフォルトを許可せずに、pattern 引数を指定します。

Exchange send(Processor processor);
Exchange send(String endpointUri, Processor processor);
Exchange send(Endpoint endpoint, Processor processor);
Exchange send(
    String endpointUri,
    ExchangePattern pattern,
    Processor processor
);
Exchange send(
    Endpoint endpoint,
    ExchangePattern pattern,
    Processor processor
);

メッセージボディーの送信

送信するメッセージボディーの内容のみに関心がある場合は、sendBody() メソッドを使用してメッセージボディーを引数として提供し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。

sendBody() メソッドにより、ターゲットエンドポイントをデフォルトのエンドポイント、エンドポイント URI、または Endpoint オブジェクトとして指定できます。さらに、オプションでエクスチェンジの MEP を指定するには、デフォルトを許可せずに、pattern 引数を指定します。pattern 引数の ない メソッドは、void を返します (呼び出しによって応答が発生する可能性もあります)。また、pattern 引数の ある メソッドは、Out メッセージのボディー (ある場合) または In メッセージのボディー (それ以外の場合) のいずれかを返します。

void sendBody(Object body);
void sendBody(String endpointUri, Object body);
void sendBody(Endpoint endpoint, Object body);
Object sendBody(
    String endpointUri,
    ExchangePattern pattern,
    Object body
);
Object sendBody(
    Endpoint endpoint,
    ExchangePattern pattern,
    Object body
);

メッセージボディーとヘッダーの送信

テストの目的で、単一 のヘッダー設定の影響を試すことが望ましいことが多く、sendBodyAndHeader() メソッドはこのようなヘッダーテストに役立ちます。メッセージボディーとヘッダー設定を引数として sendBodyAndHeader() に提供し、プロデューサーテンプレートがボディーとヘッダー設定をデフォルトのエクスチェンジオブジェクトに挿入できるようにします。

sendBodyAndHeader() メソッドにより、ターゲットエンドポイントをデフォルトのエンドポイント、エンドポイント URI、または Endpoint オブジェクトとして指定できます。さらに、オプションでエクスチェンジの MEP を指定するには、デフォルトを許可せずに、pattern 引数を指定します。pattern 引数の ない メソッドは、void を返します (呼び出しによって応答が発生する可能性もあります)。また、pattern 引数の ある メソッドは、Out メッセージのボディー (ある場合) または In メッセージのボディー (それ以外の場合) のいずれかを返します。

void sendBodyAndHeader(
    Object body,
    String header,
    Object headerValue
);
void sendBodyAndHeader(
    String endpointUri,
    Object body,
    String header,
    Object headerValue
);
void sendBodyAndHeader(
    Endpoint endpoint,
    Object body,
    String header,
    Object headerValue
);
Object sendBodyAndHeader(
    String endpointUri,
    ExchangePattern pattern,
    Object body,
    String header,
    Object headerValue
);
Object sendBodyAndHeader(
    Endpoint endpoint,
    ExchangePattern pattern,
    Object body,
    String header,
    Object headerValue
);

sendBodyAndHeaders() メソッドは sendBodyAndHeader() メソッドと似ていますが、単一のヘッダー設定を指定する代わりに、ヘッダー設定の完全なハッシュマップを指定することができます。

void sendBodyAndHeaders(
    Object body,
    Map<String, Object> headers
);
void sendBodyAndHeaders(
    String endpointUri,
    Object body,
    Map<String, Object> headers
);
void sendBodyAndHeaders(
    Endpoint endpoint,
    Object body,
    Map<String, Object> headers
);
Object sendBodyAndHeaders(
    String endpointUri,
    ExchangePattern pattern,
    Object body,
    Map<String, Object> headers
);
Object sendBodyAndHeaders(
    Endpoint endpoint,
    ExchangePattern pattern,
    Object body,
    Map<String, Object> headers
);

メッセージボディーおよびエクスチェンジプロパティーの送信

sendBodyAndProperty() メソッドを使用して、単一のエクスチェンジプロパティーを設定する効果を試すことができます。sendBodyAndProperty() にメッセージボディーとプロパティー設定を引数として提供し、プロデューサーテンプレートがボディーを挿入し、エクスチェンジプロパティーをデフォルトのエクスチェンジオブジェクトに挿入できるようにします。

sendBodyAndProperty() メソッドにより、ターゲットエンドポイントをデフォルトのエンドポイント、エンドポイント URI、または Endpoint オブジェクトとして指定できます。さらに、オプションでエクスチェンジの MEP を指定するには、デフォルトを許可せずに、pattern 引数を指定します。pattern 引数の ない メソッドは、void を返します (呼び出しによって応答が発生する可能性もあります)。また、pattern 引数の ある メソッドは、Out メッセージのボディー (ある場合) または In メッセージのボディー (それ以外の場合) のいずれかを返します。

void sendBodyAndProperty(
    Object body,
    String property,
    Object propertyValue
);
void sendBodyAndProperty(
    String endpointUri,
    Object body,
    String property,
    Object propertyValue
);
void sendBodyAndProperty(
    Endpoint endpoint,
    Object body,
    String property,
    Object propertyValue
);
Object sendBodyAndProperty(
    String endpoint,
    ExchangePattern pattern,
    Object body,
    String property,
    Object propertyValue
);
Object sendBodyAndProperty(
    Endpoint endpoint,
    ExchangePattern pattern,
    Object body,
    String property,
    Object propertyValue
);

37.1.3. InOut パターンでの同期リクエスト

概要

同期リクエスト メソッドは同期送信メソッドと似ていますが、リクエストメソッドはメッセージ交換パターンを強制的に InOut にします (リクエスト/リプライセマンティクスに準拠)。そのため、プロデューサーエンドポイントから応答を受信することが予想される場合は、一般的に同期リクエストメソッドを使用することが推奨されます。

プロセッサーによって設定されたエクスチェンジの要求

基本的な request() メソッドは、プロセッサーを使用してデフォルトのエクスチェンジの設定を行い、メッセージ交換パターンを InOut に強制する (よって呼び出しがリクエスト/リプライセマンティクスに従う) 汎用メソッドです。戻り値は、プロデューサーエンドポイントによって処理された後に得られるエクスチェンジです。Out メッセージにはリプライメッセージが含まれます。

プロセッサーによって設定されるエクスチェンジを送信するために request() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとしてターゲットエンドポイントを指定できます。

Exchange request(String endpointUri, Processor processor);
Exchange request(Endpoint endpoint, Processor processor);

メッセージボディーの要求

リクエストと応答のメッセージボディーの内容のみに関心がある場合は、requestBody() メソッドを使用してリクエストメッセージのボディーを引数として提供し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。

requestBody() メソッドにより、ターゲットエンドポイントをデフォルトのエンドポイント、エンドポイント URI、または Endpoint オブジェクトとして指定できます。戻り値は、リプライメッセージのボディー (Out メッセージボディー) で、プレーン Object として返されるか、組み込み型コンバーター (「組み込み型コンバーター」 を参照) を使用して特定のタイプ T に変換されます。

Object requestBody(Object body);
<T> T requestBody(Object body, Class<T> type);
Object requestBody(
    String endpointUri,
    Object body
);
<T> T requestBody(
    String endpointUri,
    Object body,
    Class<T> type
);
Object requestBody(
    Endpoint endpoint,
    Object body
);
<T> T requestBody(
    Endpoint endpoint,
    Object body,
    Class<T> type
);

メッセージのボディーおよびヘッダーの要求

requestBodyAndHeader() メソッドを使用して、単一のヘッダー値を設定する効果を試すことができます。メッセージボディーとヘッダー設定を引数として requestBodyAndHeader() に提供し、プロデューサーテンプレートがボディーを挿入し、プロパティーをデフォルトのエクスチェンジオブジェクトに挿入できるようにします。

requestBodyAndHeader() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。戻り値は、リプライメッセージのボディー (Out メッセージボディー) で、プレーン Object として返されるか、組み込み型コンバーター (「組み込み型コンバーター」 を参照) を使用して特定のタイプ T に変換されます。

Object requestBodyAndHeader(
    String endpointUri,
    Object body,
    String header,
    Object headerValue
);
<T> T requestBodyAndHeader(
    String endpointUri,
    Object body,
    String header,
    Object headerValue,
    Class<T> type
);
Object requestBodyAndHeader(
    Endpoint endpoint,
    Object body,
    String header,
    Object headerValue
);
<T> T requestBodyAndHeader(
    Endpoint endpoint,
    Object body,
    String header,
    Object headerValue,
    Class<T> type
);

requiestBodyAndHeaders() メソッドは requestBodyAndHeader() メソッドと似ていますが、単一のヘッダー設定を指定する代わりに、ヘッダー設定の完全なハッシュマップを指定することができます。

Object requestBodyAndHeaders(
    String endpointUri,
    Object body,
    Map<String, Object> headers
);
<T> T requestBodyAndHeaders(
    String endpointUri,
    Object body,
    Map<String, Object> headers,
    Class<T> type
);
Object requestBodyAndHeaders(
    Endpoint endpoint,
    Object body,
    Map<String, Object> headers
);
<T> T requestBodyAndHeaders(
    Endpoint endpoint,
    Object body,
    Map<String, Object> headers,
    Class<T> type
);

37.1.4. 非同期送信

概要

プロデューサーテンプレートは、プロデューサーエンドポイントを非同期的に呼び出すさまざまな方法を提供します。これにより、メインスレッドが呼び出しの完了を待機している間にブロックされず、リプライメッセージが後で取得できます。本項で説明されている非同期送信方法は、あらゆる種類のメッセージ交換プロトコルと互換性があります。

エクスチェンジの送信

基本的な asyncSend() メソッドは Exchange 引数を取り、指定されたエクスチェンジのメッセージ交換パターン (MEP) を使用してエンドポイントを非同期的に呼び出します。戻り値は java.util.concurrent.Future オブジェクトで、後でリプライメッセージを収集するために使用できるチケットです。Future オブジェクトから戻り値を取得する方法の詳細は、「非同期呼び出し」 を参照してください。

以下の asyncSend() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。

Future<Exchange> asyncSend(String endpointUri, Exchange exchange);
Future<Exchange> asyncSend(Endpoint endpoint, Exchange exchange);

プロセッサーによって提供されたエクスチェンジの送信

一般的な asyncSend() メソッドは、エクスチェンジオブジェクトを明示的に提供するのではなく、プロセッサーを使用してデフォルトのエクスチェンジを設定することです。

以下の asyncSend() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。

Future<Exchange> asyncSend(String endpointUri, Processor processor);
Future<Exchange> asyncSend(Endpoint endpoint, Processor processor);

メッセージボディーの送信

送信するメッセージボディーの内容のみに関心がある場合は、asyncSendBody() メソッドを使用してメッセージボディーを非同期的に送信し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。

asyncSendBody() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。

Future<Object> asyncSendBody(String endpointUri, Object body);
Future<Object> asyncSendBody(Endpoint endpoint, Object body);

37.1.5. InOut パターンを使用した非同期リクエスト

概要

非同期リクエスト メソッドは非同期送信メソッドと似ていますが、リクエストメソッドはメッセージ交換パターンを強制的に InOut にします (リクエスト/リプライセマンティクスに準拠)。そのため、プロデューサーエンドポイントから応答を受信することが予想される場合は、通常は非同期リクエストメソッドを使用することが推奨されます。

メッセージボディーの要求

リクエストと応答のメッセージボディーの内容のみに関心がある場合は、requestBody() メソッドを使用してリクエストメッセージのボディーを引数として提供し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。

asyncRequestBody() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。Future オブジェクトから取得できる戻り値は、リプライメッセージのボディー (Out メッセージボディー) です。これは、プレーン Object として返されるか、組み込み型コンバーターを使用して特定タイプ T に変換されます (「非同期呼び出し」 を参照)。

Future<Object> asyncRequestBody(
    String endpointUri,
    Object body
);
<T> Future<T> asyncRequestBody(
    String endpointUri,
    Object body,
    Class<T> type
);
Future<Object> asyncRequestBody(
    Endpoint endpoint,
    Object body
);
<T> Future<T> asyncRequestBody(
    Endpoint endpoint,
    Object body,
    Class<T> type
);

メッセージのボディーおよびヘッダーの要求

asyncRequestBodyAndHeader() メソッドを使用して、単一のヘッダー値を設定する効果を試すことができます。メッセージボディーとヘッダー設定を引数として asyncRequestBodyAndHeader() に提供し、プロデューサーテンプレートがボディーを挿入し、プロパティーをデフォルトのエクスチェンジオブジェクトに挿入できるようにします。

asyncRequestBodyAndHeader() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。Future オブジェクトから取得できる戻り値は、リプライメッセージのボディー (Out メッセージボディー) です。これは、プレーン Object として返されるか、組み込み型コンバーターを使用して特定タイプ T に変換されます (「非同期呼び出し」 を参照)。

Future<Object> asyncRequestBodyAndHeader(
    String endpointUri,
    Object body,
    String header,
    Object headerValue
);
<T> Future<T> asyncRequestBodyAndHeader(
    String endpointUri,
    Object body,
    String header,
    Object headerValue,
    Class<T> type
);
Future<Object> asyncRequestBodyAndHeader(
    Endpoint endpoint,
    Object body,
    String header,
    Object headerValue
);
<T> Future<T> asyncRequestBodyAndHeader(
    Endpoint endpoint,
    Object body,
    String header,
    Object headerValue,
    Class<T> type
);

asyncRequiestBodyAndHeaders() メソッドは asyncRequestBodyAndHeader() メソッドと似ていますが、単一のヘッダー設定を指定する代わりに、ヘッダー設定の完全なハッシュマップを指定することができます。

Future<Object> asyncRequestBodyAndHeaders(
    String endpointUri,
    Object body,
    Map<String, Object> headers
);
<T> Future<T> asyncRequestBodyAndHeaders(
    String endpointUri,
    Object body,
    Map<String, Object> headers,
    Class<T> type
);
Future<Object> asyncRequestBodyAndHeaders(
    Endpoint endpoint,
    Object body,
    Map<String, Object> headers
);
<T> Future<T> asyncRequestBodyAndHeaders(
    Endpoint endpoint,
    Object body,
    Map<String, Object> headers,
    Class<T> type
);

37.1.6. コールバックを使用した非同期送信

概要

プロデューサーテンプレートは、プロデューサーエンドポイントを呼び出すために使用される同じサブスレッドでリプライメッセージを処理するオプションも提供します。この場合、コールバックオブジェクトを作成します。このオブジェクトは、リプライメッセージが受信されるとすぐに自動的にサブスレッドで呼び出されます。つまり、コールバックメソッドを使用した非同期送信 により、メインスレッドで呼び出しを開始でき、(サブスレッドで非同期的に発生する) プロデューサーエンドポイントの呼び出し、応答の待機、応答の処理をすべて実行できます。

エクスチェンジの送信

基本的な asyncCallback() メソッドは Exchange 引数を取り、指定されたエクスチェンジのメッセージ交換パターン (MEP) を使用してエンドポイントを非同期的に呼び出します。このメソッドはエクスチェンジの asyncSend() メソッドと似ていますが、onComplete() および onFailure() という 2 つのメソッドを持つコールバックインターフェイスである org.apache.camel.spi.Synchronization を追加の引数で必要とする点が異なります。Synchronization コールバックの使用方法の詳細は、「コールバックを使用した非同期呼び出し」 を参照してください。

以下の asyncCallback() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。

Future<Exchange> asyncCallback(
    String endpointUri,
    Exchange exchange,
    Synchronization onCompletion
);
Future<Exchange> asyncCallback(
    Endpoint endpoint,
    Exchange exchange,
    Synchronization onCompletion
);

プロセッサーによって提供されたエクスチェンジの送信

プロセッサーの asyncCallback() メソッドは、プロセッサーを呼び出してデフォルトのエクスチェンジの設定を行い、メッセージ交換パターンを強制的に InOut にします (よって呼び出しがリクエスト/リプライセマンティクスに従います)。

以下の asyncCallback() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。

Future<Exchange> asyncCallback(
    String endpointUri,
    Processor processor,
    Synchronization onCompletion
);
Future<Exchange> asyncCallback(
    Endpoint endpoint,
    Processor processor,
    Synchronization onCompletion
);

メッセージボディーの送信

送信するメッセージボディーの内容のみに関心がある場合は、asyncCallbackSendBody() メソッドを使用してメッセージボディーを非同期的に送信し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。

asyncCallbackSendBody() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。

Future<Object> asyncCallbackSendBody(
    String endpointUri,
    Object body,
    Synchronization onCompletion
);
Future<Object> asyncCallbackSendBody(
    Endpoint endpoint,
    Object body,
    Synchronization onCompletion
);

メッセージボディーの要求

リクエストと応答のメッセージボディーの内容のみに関心がある場合は、asyncCallbackRequestBody() メソッドを使用してリクエストメッセージのボディーを引数として提供し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。

asyncCallbackRequestBody() メソッドを使用すると、エンドポイント URI または Endpoint オブジェクトとして、ターゲットエンドポイントを指定することができます。

Future<Object> asyncCallbackRequestBody(
    String endpointUri,
    Object body,
    Synchronization onCompletion
);
Future<Object> asyncCallbackRequestBody(
    Endpoint endpoint,
    Object body,
    Synchronization onCompletion
);