37장. 생산자 및 소비자 템플릿


초록

Apache Camel의 생산자 및 소비자 템플릿은 Spring 컨테이너 API의 기능 후에 모델링되며, 여기서 리소스에 대한 액세스는 템플릿 이라는 간소화되고 사용하기 쉬운 API를 통해 제공됩니다. Apache Camel의 경우 생산자 템플릿과 소비자 템플릿은 생산자 끝점 및 소비자 끝점으로 메시지를 보내고 메시지를 수신하기 위한 단순화된 인터페이스를 제공합니다.

37.1. Producer 템플릿 사용

37.1.1. Producer 템플릿 소개

37.1.1.1. 개요

생산자 템플릿은 생산자 엔드포인트를 호출하는 다양한 방법을 지원합니다. 요청 메시지( Exchange 개체, 메시지 본문, 메시지 본문 등)에 대해 다양한 형식을 지원하는 메서드가 있으며 단일 헤더 설정이 있는 메시지 본문으로, 동기 및 비동기 호출 스타일을 모두 지원하는 방법이 있습니다. 전반적으로 생산자 템플릿 메서드를 다음 범주로 그룹화할 수 있습니다.

또는 37.2절. “Fluent Producer 템플릿 사용” 을 참조하십시오.

37.1.1.2. 동기 호출

끝점을 동기적으로 호출하는 방법에는 sendSuffix() 및 요청Suffix () 의 이름이 있습니다. 예를 들어 기본 메시지 교환 패턴(MEP) 또는 명시적으로 지정된 MEP를 사용하여 끝점을 호출하는 방법은 send(), sendBody()sendBodyAndHeader() (이 메서드 각각 교환 오브젝트, 메시지 본문 또는 메시지 본문 및 헤더 값을 전송하는)라는 이름이 지정됩니다. MEP를 InOut (request/reply semantics)으로 강제 적용하려면 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" );

37.1.1.3. 프로세서와 동기 호출

동기 호출의 특수한 경우는 Exchange 인수 대신 send() 메서드에 Processor 인수를 제공하는 것입니다. 이 경우 생산자 템플릿은 지정된 엔드포인트에서 교환 인스턴스를 생성하도록 암시적으로 요청합니다(일반적으로 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 클래스가 구현됩니다. 메시지 본문(여기에 표시됨)을 설정하는 것 외에도 메시지 헤더를 초기화하고 속성을 교환할 수 있습니다.

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>");
    }
}

37.1.1.4. 비동기 호출

끝점을 비동기적으로 호출하는 메서드의 이름은 asyncSendSuffix()asyncRequestSuffix() 형식의 이름이 있습니다. 예를 들어 기본 메시지 교환 패턴(MEP) 또는 명시적으로 지정된 MEP를 사용하여 끝점을 호출하는 방법은 asyncSend()asyncSendBody() 라는 이름이 지정됩니다(이러한 메서드는 각각 교환 개체 또는 메시지 본문을 보내는 경우). MEP를 InOut (request/reply semantics)으로 강제 적용하려면 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 개체에서 반환된 메시지 본문을 추출하기 위해 다음 도우미 메서드 중 하나를 사용할 수 있습니다.In this case, you can use one of the following helper methods to extract the returned message body from the Future object:

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

extractFutureBody() 메서드의 첫 번째 버전은 호출이 완료되고 응답 메시지를 사용할 수 있을 때까지 차단됩니다. extractFutureBody() 메서드의 두 번째 버전을 사용하면 시간 초과를 지정할 수 있습니다. 두 메서드 모두 반환된 메시지 본문을 기본 제공 형식 변환기를 사용하여 지정된 형식으로 캐스팅하는 형식 인수입니다.Both methods have a type argument, type , which casts the returned message body to the specified type using a built-in type converter.

다음 예제에서는 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);

37.1.1.5. 콜백을 사용한 비동기 호출

앞의 비동기 예제에서 요청 메시지는 하위 스레드에서 디스패치되는 반면, 기본 스레드에서 응답을 검색하고 처리합니다. 또한 프로듀서 템플릿은 옵션을 제공하지만, asyncCallback(), asyncCallbackSendBody() 또는 asyncCallbackRequestBody() 메서드 중 하나를 사용하여 하위 스레드의 응답 처리도 제공합니다. 이 경우 응답 메시지가 도달하는 즉시 하위 스레드에서 자동으로 호출되는 org.apache.camel.impl.SynchronizationAdapter 유형의 콜백 오브젝트를 제공합니다.

동기화 콜백 인터페이스는 다음과 같이 정의됩니다.

package org.apache.camel.spi;

import org.apache.camel.Exchange;

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

일반적인 응답을 수신할 때 onComplete() 메서드가 호출되고 오류 메시지 응답을 수신할 때 onFailure() 메서드가 호출됩니다. 이러한 메서드 중 하나만 다시 호출되므로 모든 유형의 응답을 처리하려면 두 메서드를 모두 재정의해야 합니다.

다음 예제에서는 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());
    }
});

여기서 Synchronization Adapter 클래스는 동기화 인터페이스의 기본 구현이며, 이를 재정의하여 onComplete()onFailure() 콜백 메서드에 대한 자체 정의를 제공할 수 있습니다.

asyncCallback() 메서드도 Future 개체가 반환되므로 기본 스레드에서 응답에 액세스하는 옵션이 있습니다. 예를 들면 다음과 같습니다.

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

37.1.2. 동기화 전송

37.1.2.1. 개요

동기 전송 방법은 메서드 호출이 완료되고 응답(있는 경우)이 수신될 때까지 현재 스레드가 차단되는 생산자 엔드포인트를 호출하는 데 사용할 수 있는 메서드 컬렉션입니다. 이러한 방법은 모든 종류의 메시지 교환 프로토콜과 호환됩니다.

37.1.2.2. 교환 보내기

basic send() 메서드는 교환의 MEP(메시지 교환 패턴)를 사용하여 교환 개체의 내용을 엔드포인트로 전송하는 범용 메서드입니다. 반환 값은 생산자 엔드포인트에서 처리한 후 얻을 수 있는 교환입니다(MEP에 따라 Out 메시지가 포함될 수 있음).

다음 방법 중 하나로 대상 엔드포인트를 지정하거나 엔드포인트 URI로 또는 Endpoint 개체로 지정할 수 있는 교환을 보내는 send() 메서드의 세 가지 유형이 있습니다.

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

37.1.2.3. 프로세서에 의해 채워진 교환 보내기

일반적인 send() 메서드의 간단한 변형은 교환 오브젝트를 명시적으로 제공하는 대신 프로세서를 사용하여 기본 교환을 채우는 것입니다(자세한 내용은 “프로세서와 동기 호출” 참조).

프로세서로 채워진 교환을 보내기 위한 send() 메서드를 사용하면 기본 끝점으로, 엔드포인트 URI로 또는 Endpoint 오브젝트로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다. 또한 기본값을 수락하는 대신 패턴 인수를 제공하여 교환의 MEP를 선택적으로 지정할 수 있습니다.

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
);

37.1.2.4. 메시지 본문 전송

보내려는 메시지 본문의 콘텐츠에만 관련된 경우 sendBody() 메서드를 사용하여 메시지 본문을 인수로 제공하고 생산자 템플릿에서 본문을 기본 교환 오브젝트에 삽입하도록 할 수 있습니다.

sendBody() 메서드를 사용하면 기본 엔드포인트, 엔드포인트 URI 또는 끝점 오브젝트로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다. 또한 기본값을 수락하는 대신 패턴 인수를 제공하여 교환의 MEP를 선택적으로 지정할 수 있습니다. 패턴 인수 반환 void없는 메서드(요청이 어떤 경우에는 회신을 발생시킬 수 있음)와 패턴 인수가 있는 메서드는 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
);

37.1.2.5. 메시지 본문 및 헤더 전송

테스트 목적을 위해 단일 헤더 설정의 효과를 시도하는 것이 중요하며 sendBodyAndHeader() 메서드는 이러한 종류의 헤더 테스트에 유용합니다. 메시지 본문 및 헤더 설정을 sendBodyAndHeader() 에 인수로 제공하고 생산자 템플릿에서 본문 및 헤더 설정을 기본 교환 오브젝트에 삽입하도록 합니다.

sendBodyAndHeader() 메서드를 사용하면 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다. 기본 끝점으로, 엔드포인트 URI로 또는 끝점 오브젝트로 지정할 수 있습니다. 또한 기본값을 수락하는 대신 패턴 인수를 제공하여 교환의 MEP를 선택적으로 지정할 수 있습니다. 패턴 인수 반환 void없는 메서드(요청이 어떤 경우에는 회신을 발생시킬 수 있음)와 패턴 인수가 있는 메서드는 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
);

37.1.2.6. 메시지 본문을 보내고 속성을 교환

sendBodyAndProperty() 메서드를 사용하여 단일 교환 속성을 설정하는 효과를 시도할 수 있습니다. 메시지 본문 및 속성 설정을 sendBodyAndProperty() 에 인수로 제공하고 생산자 템플릿에서 본문 삽입을 처리하고 속성을 기본 교환 오브젝트에 교환하도록 합니다.

sendBodyAndProperty() 메서드를 사용하면 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다. 기본 끝점으로, 엔드포인트 URI로 또는 끝점 개체로 지정할 수 있습니다. 또한 기본값을 수락하는 대신 패턴 인수를 제공하여 교환의 MEP를 선택적으로 지정할 수 있습니다. 패턴 인수 반환 void없는 메서드(요청이 어떤 경우에는 회신을 발생시킬 수 있음)와 패턴 인수가 있는 메서드는 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 패턴의 동기 요청

37.1.3.1. 개요

동기식 요청 방법은 메시지 교환 패턴이 InOut (요청/응답 의미)으로 강제된다는 점을 제외하고 동기 전송 방법과 유사합니다. 따라서 생산자 끝점에서 응답을 수신할 것으로 예상되는 경우 일반적으로 동기 요청 방법을 사용하는 것이 편리합니다.

37.1.3.2. 프로세서에 의해 채워진 교환 요청

기본 request() 메서드는 프로세서를 사용하여 기본 교환을 채우고 메시지 교환 패턴을 InOut 로 강제 적용하는 일반적인 용도의 메서드입니다. 반환 값은 생산자 엔드포인트에서 처리한 후 얻을 수 있는 교환으로, Out 메시지에 응답 메시지가 포함됩니다.

프로세서에 의해 채워진 교환을 보내기 위한 request() 메서드를 사용하면 다음과 같은 방법 중 하나로 대상 엔드포인트를 지정할 수 있습니다. 엔드포인트 URI로 또는 끝점 개체로 지정할 수 있습니다.

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

37.1.3.3. 메시지 본문 요청

요청의 메시지 본문 내용 및 응답에 대해서만 관심이 있는 경우 requestBody() 메서드를 사용하여 요청 메시지 본문을 인수로 제공하고 생산자 템플릿에서 본문을 기본 교환 오브젝트에 삽입하도록 할 수 있습니다.

requestBody() 메서드를 사용하면 기본 엔드포인트, 엔드포인트 URI 또는 끝점 오브젝트로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다. 반환 값은 응답 메시지 본문(Out message body)의 본문이며, 이는 일반 오브젝트로 반환되거나 내장형 유형인 T 로 변환될 수 있습니다( 34.3절. “붙박임 유형”참조).

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
);

37.1.3.4. 메시지 본문 및 헤더 요청

requestBodyAndHeader() 메서드를 사용하여 단일 헤더 값을 설정하는 효과를 시도할 수 있습니다. 메시지 본문 및 헤더 설정을 requestBodyAndHeader() 에 인수로 제공하고 생산자 템플릿에서 본문 삽입을 처리하고 속성을 기본 교환 오브젝트에 교환하도록 합니다.

requestBodyAndHeader() 메서드를 사용하면 끝점 URI로 또는 끝점 오브젝트로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다. 반환 값은 응답 메시지 본문(Out message body)의 본문이며, 이는 일반 오브젝트로 반환되거나 내장형 유형인 T 로 변환될 수 있습니다( 34.3절. “붙박임 유형”참조).

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
);

requestBodyAndHeaders() 메서드는 단일 헤더 설정만 제공하는 대신 헤더 설정에 대한 전체 해시 맵을 지정할 수 있다는 점을 제외하고 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. 비동기 전송

37.1.4.1. 개요

생산자 템플릿은 생산자 엔드포인트를 비동기적으로 호출하는 다양한 메서드를 제공하므로 기본 스레드가 호출이 완료될 때까지 기다리는 동안 차단되지 않고 나중에 응답 메시지를 검색할 수 있습니다. 이 섹션에 설명된 비동기 전송 방법은 모든 종류의 메시지 교환 프로토콜과 호환됩니다.

37.1.4.2. 교환 보내기

기본 asyncSend() 메서드는 Exchange 인수를 사용하여 지정된 교환의 메시지 교환 패턴(MEP)을 사용하여 비동기식으로 엔드포인트를 호출합니다. 반환 값은 java.util.concurrent.Future 오브젝트로, 나중에 Future 오브젝트에서 반환 값을 얻는 방법에 대한 자세한 내용은 “비동기 호출” 에서 응답 메시지를 수집하는 데 사용할 수 있는 티켓입니다.

다음 asyncSend() 메서드를 사용하면 끝점 URI로 또는 끝점 개체로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다.

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

37.1.4.3. 프로세서에 의해 채워진 교환 보내기

일반적인 비동기Send() 메서드의 간단한 변형은 교환 개체를 명시적으로 제공하는 대신 프로세서를 사용하여 기본 교환을 채우는 것입니다.

다음 asyncSend() 메서드를 사용하면 끝점 URI로 또는 끝점 개체로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다.

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

37.1.4.4. 메시지 본문 전송

보내려는 메시지 본문의 내용만 관련된 경우 asyncSendBody() 메서드를 사용하여 메시지 본문을 비동기적으로 전송하고 생산자 템플릿에서 본문을 기본 교환 오브젝트에 삽입하도록 할 수 있습니다.

asyncSendBody() 메서드를 사용하면 끝점 URI로 또는 끝점 개체로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다.

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

37.1.5. InOut 패턴을 사용한 비동기 요청

37.1.5.1. 개요

비동기 요청 메서드는 메시지 교환 패턴을 InOut (요청/반복)으로 강제 적용하는 것을 제외하고 비동기 send 메서드와 유사합니다. 따라서 생산자 끝점에서 응답을 수신하려는 경우 일반적으로 비동기 요청 방법을 사용하는 것이 편리합니다.

37.1.5.2. 메시지 본문 요청

요청의 메시지 본문 내용 및 응답에 대해서만 관심이 있는 경우 requestBody() 메서드를 사용하여 요청 메시지 본문을 인수로 제공하고 생산자 템플릿에서 본문을 기본 교환 오브젝트에 삽입하도록 할 수 있습니다.

asyncRequestBody() 메서드를 사용하면 끝점 URI로 또는 끝점 개체로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다. Future 오브젝트에서 검색할 수 있는 반환 값은 응답 메시지 본문(Out message body)의 본문입니다. 이 본문은 일반 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
);

37.1.5.3. 메시지 본문 및 헤더 요청

asyncRequestBodyAndHeader() 메서드를 사용하여 단일 헤더 값을 설정하는 효과를 시도할 수 있습니다. 메시지 본문 및 헤더 설정을 asyncRequestBodyAndHeader() 에 인수로 제공하고 생산자 템플릿에서 본문을 삽입하고 속성을 기본 교환 오브젝트에 교환하도록 합니다.

asyncRequestBodyAndHeader() 메서드를 사용하면 끝점 URI로 또는 끝점 개체로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다. Future 오브젝트에서 검색할 수 있는 반환 값은 응답 메시지 본문(Out message body)의 본문입니다. 이 본문은 일반 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
);

asyncRequestBodyAndHeaders() 메서드는 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. 콜백을 사용하여 비동기 전송

37.1.6.1. 개요

생산자 템플릿은 생산자 엔드포인트를 호출하는 데 사용되는 동일한 하위 스레드에서 응답 메시지를 처리하는 옵션도 제공합니다. 이 경우 응답 메시지가 수신되는 즉시 하위 스레드에서 자동으로 호출되는 콜백 오브젝트를 제공합니다. 즉, 콜백 메서드를 사용한 비동기 전송을 사용하면 주 스레드에서 호출을 시작한 다음 생산자 끝점의 모든 관련 처리의 모든 관련 처리를 가질 수 있으며 응답을 대기하고 응답을 처리하고 하위 스레드에서 비동기적으로 발생합니다.In other words, the asynchronous send with callback methods enable you to initiate an invocation in your main thread and then have all of the associated processing Cryostat- Cryostatinvocation of the producer endpoint, waiting for a reply and processing the reply Cryostat- Cryostatoccur asynchronously in a subthread.

37.1.6.2. 교환 보내기

기본 asyncCallback() 메서드는 Exchange 인수를 사용하여 지정된 교환의 메시지 교환 패턴(MEP)을 사용하여 비동기식으로 엔드포인트를 호출합니다. 이 방법은 교환을 위한 asyncSend() 방법과 유사하지만 추가 org.apache.camel.spi.Synchronization 인수가 필요합니다. 이 인수는 onComplete()onFailure() 의 두 가지 방법이 있는 콜백 인터페이스입니다. 동기화 콜백을 사용하는 방법에 대한 자세한 내용은 “콜백을 사용한 비동기 호출” 을 참조하십시오.

다음 asyncCallback() 메서드를 사용하면 끝점 URI로 또는 끝점 개체로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다.

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

37.1.6.3. 프로세서에 의해 채워진 교환 보내기

프로세서의 asyncCallback() 메서드는 프로세서를 호출하여 기본 교환을 채우고 메시지 교환 패턴을 InOut 으로 강제 적용합니다(즉, 호출이 요청/반복을 따르도록).

다음 asyncCallback() 메서드를 사용하면 끝점 URI로 또는 끝점 개체로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다.

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

37.1.6.4. 메시지 본문 전송

보내려는 메시지 본문의 콘텐츠에만 관련된 경우 asyncCallbackSendBody() 메서드를 사용하여 메시지 본문을 비동기적으로 전송하고 생산자 템플릿에서 본문을 기본 교환 오브젝트에 삽입하도록 할 수 있습니다.

asyncCallbackSendBody() 메서드를 사용하면 끝점 URI로 또는 끝점 개체로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다.

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

37.1.6.5. 메시지 본문 요청

요청에 있는 메시지 본문의 내용 및 응답에 대해서만 관심이 있는 경우 asyncCallbackRequestBody() 메서드를 사용하여 요청 메시지 본문을 인수로 제공하고 생산자 템플릿에서 본문을 기본 교환 오브젝트에 삽입하도록 할 수 있습니다.

asyncCallbackRequestBody() 메서드를 사용하면 끝점 URI 또는 끝점 개체로 다음과 같은 방법 중 하나로 대상 끝점을 지정할 수 있습니다.

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

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.