42.2. Producer 인터페이스 구현

42.2.1. 생산자를 구현하는 다른 방법

다음 방법 중 하나로 생산자를 구현할 수 있습니다.

42.2.2. 동기 생산자를 구현하는 방법

예 42.4. “DefaultProducer 구현” 동기 생산자를 구현하는 방법을 간략하게 설명합니다. 이 경우 응답을 수신할 때까지 Producer.process() 블록을 호출합니다.

예 42.4. DefaultProducer 구현

import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
import org.apache.camel.Producer;
import org.apache.camel.impl.DefaultProducer;

public class CustomProducer extends DefaultProducer { 1

    public CustomProducer(Endpoint endpoint) { 2
        super(endpoint);
        // Perform other initialization tasks...
    }

    public void process(Exchange exchange) throws Exception { 3
        // Process exchange synchronously.
        // ...
    }
}
1
org.apache.camel.impl.DefaultProducer 클래스를 확장하여 사용자 정의 동기 생산자 클래스인 CustomProducer 를 구현합니다.
2
상위 끝점에 대한 참조를 사용하는 생성자를 구현합니다.
3
process() 메서드 구현은 생산자 코드의 코어를 나타냅니다. process() 메서드의 구현은 구현 중인 구성 요소의 유형에 따라 전적으로 달라집니다.

개요에서 process() 메서드는 일반적으로 다음과 같이 구현됩니다.

  • 교환에 In 메시지가 포함되어 있고 지정된 교환 패턴과 일치하는 경우 In 메시지를 지정된 엔드포인트로 보냅니다.
  • 교환 패턴에서 Out 메시지를 수신할 것으로 예상되는 경우 Out 메시지가 수신될 때까지 기다립니다. 이 경우 process() 메서드가 상당한 시간 동안 차단됩니다.
  • 응답이 수신되면 exchange.setOut() 을 호출하여 응답을 교환 오브젝트에 연결합니다. 응답에 fault 메시지가 포함된 경우 Message.setFault(true) 를 사용하여 Out 메시지의 fault 플래그를 설정합니다.

42.2.3. 비동기 생산자 구현 방법

예 42.5. “CollectionProducer 구현” 비동기 생산자를 구현하는 방법을 간략하게 설명합니다. 이 경우 동기 프로세스() 메서드와 비동기 프로세스() 메서드를 모두 구현해야 합니다(추가 AsyncCallback 인수를 사용합니다).

예 42.5. CollectionProducer 구현

import org.apache.camel.AsyncCallback;
import org.apache.camel.AsyncProcessor;
import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
import org.apache.camel.Producer;
import org.apache.camel.impl.DefaultProducer;

public class _CustomProducer_ extends DefaultProducer implements AsyncProcessor { 1

    public _CustomProducer_(Endpoint endpoint) { 2
        super(endpoint);
        // ...
    }

    public void process(Exchange exchange) throws Exception { 3
        // Process exchange synchronously.
        // ...
    }

    public boolean process(Exchange exchange, AsyncCallback callback) { 4
        // Process exchange asynchronously.
        CustomProducerTask task = new CustomProducerTask(exchange, callback);
        // Process 'task' in a separate thread...
        // ...
        return false; 5
    }
}

public class CustomProducerTask implements Runnable { 6
    private Exchange exchange;
    private AsyncCallback callback;

    public CustomProducerTask(Exchange exchange, AsyncCallback callback) {
        this.exchange = exchange;
        this.callback = callback;
    }

    public void run() { 7
        // Process exchange.
        // ...
        callback.done(false);
    }
}
1
org.apache.camel.impl.DefaultProducer 클래스를 확장하고 AsyncProcessor 인터페이스를 구현하여 사용자 지정 비동기 생산자 클래스인 CustomProducer 를 구현합니다.
2
상위 끝점에 대한 참조를 사용하는 생성자를 구현합니다.
3
동기 프로세스() 메서드를 구현합니다.
4
비동기 프로세스() 메서드를 구현합니다. 비동기 메서드를 여러 가지 방법으로 구현할 수 있습니다. 여기에 표시된 접근 방식은 하위 스레드에서 실행되는 코드를 나타내는 java.lang.Runnable 인스턴스인 task 를 생성하는 것입니다. 그런 다음 Java 스레딩 API를 사용하여 하위 스레드에서 작업을 실행합니다(예: 새 스레드를 생성하거나 기존 스레드 풀에 작업을 할당하여).
5
일반적으로 비동기 프로세스() 메서드에서 false 를 반환하여 교환이 비동기적으로 처리되었음을 나타냅니다.
6
CustomProducerTask 클래스는 하위 스레드에서 실행되는 처리 코드를 캡슐화합니다. 이 클래스는 Exchange 개체의 복사본, 교환AsyncCallback 개체, 콜백 을 프라이빗 멤버 변수로 저장해야 합니다.
7
run() 메서드에는 In 메시지를 생산자 엔드포인트에 전송하고 응답을 수신할 때까지 대기하는 코드가 포함되어 있습니다. 응답(Out message 또는 Fault message)을 수신하고 이를 교환 오브젝트에 삽입한 후 callback.done() 을 호출하여 호출자에게 처리가 완료되었음을 알려야 합니다.