41장. 소비자 인터페이스

초록

이 장에서는 Apache Camel 구성 요소를 구현하는 데 중요한 단계인 Consumer 인터페이스를 구현하는 방법을 설명합니다.

41.1. 소비자 인터페이스

41.1.1. 개요

org.apache.camel.Consumer 유형의 인스턴스는 경로의 소스 끝점을 나타냅니다. 소비자를 구현하는 방법에는 여러 가지가 있으며( 38.1.3절. “소비자 패턴 및 스레드”참조) 이러한 유연성은 소비자를 구현하기 위한 여러 가지 기본 클래스를 포함하는 상속 계층( 그림 41.1. “소비자 상속 계층 구조”참조)에 반영됩니다.

그림 41.1. 소비자 상속 계층 구조

소비자 상속 계층

41.1.2. 소비자 매개변수 삽입

예약된 폴링 패턴을 따르는 소비자의 경우( “예약된 폴링 패턴”참조) Apache Camel은 소비자 인스턴스에 매개변수 삽입을 지원합니다. 예를 들어 사용자 지정 접두사로 식별되는 구성 요소에 대해 다음 끝점 URI를 고려하십시오.

custom:destination?consumer.myConsumerParam

Apache Camel은 소비자의 쿼리 옵션을 자동으로 삽입할 수 있도록 지원합니다.\*. consumer.myConsumerParam 매개변수의 경우 다음과 같이 Consumer 구현 클래스에서 해당 setter 및 getter 메서드를 정의해야 합니다.

public class CustomConsumer extends ScheduledPollConsumer {
    ...
    String getMyConsumerParam() { ... }
    void setMyConsumerParam(String s) { ... }
    ...
}

여기서 getter 및 setter 메서드는 일반적인 Java 빈 규칙을 따릅니다(속성 이름의 첫 번째 문자를 대문자 포함).

Consumer 구현에서 Quarkus 메서드를 정의하는 것 외에도 Endpoint.createConsumer() ()를 구현할 때 configureConsumer() 메서드를 호출해야 합니다( “예약된 폴링 끝점 구현”참조).

예 41.1. “FileEndpoint createConsumer() 구현” 파일 구성 요소의 FileEndpoint 클래스에서 가져온 createConsumer() 메서드 구현 예를 보여줍니다.

예 41.1. FileEndpoint createConsumer() 구현

...
public class FileEndpoint extends ScheduledPollEndpoint {
    ...
    public Consumer createConsumer(Processor processor) throws Exception {
        Consumer result = new FileConsumer(this, processor);
        configureConsumer(result);
        return result;
    }
    ...
    }

런타임 시 소비자 매개변수 삽입은 다음과 같이 작동합니다.

  1. 엔드포인트가 생성되면 DefaultComponent.createEndpoint(String uri) 의 기본 구현은 소비자 매개 변수를 추출하기 위해 URI를 구문 분석하고 ScheduledPollEndpoint.configureProperties() 를 호출하여 엔드포인트 인스턴스에 저장합니다.
  2. createConsumer() 가 호출되면 메서드 구현에서 configureConsumer() 를 호출하여 소비자 매개변수를 삽입합니다( 예 41.1. “FileEndpoint createConsumer() 구현”참조).
  3. configureConsumer() 메서드는 Java 리플렉션을 사용하여 소비자가 제거된 후 이름이 관련 옵션과 일치하는 setter 메서드를 호출합니다.

41.1.3. 예약된 폴링 매개변수

예약된 폴링 패턴을 따르는 소비자는 표 41.1. “예약된 Poll 매개변수” 에 표시된 소비자 매개변수( endpoint URI에서 쿼리 옵션으로 표시될 수 있음)를 자동으로 지원합니다.

표 41.1. 예약된 Poll 매개변수

이름기본설명

initialDelay

1000

첫 번째 폴링 전 지연(밀리초)입니다.

delay

500

useFixedDelay 플래그의 값에 따라 달라집니다(시간 단위는 밀리초).

useFixedDelay

false

false 인 경우 delay 매개변수가 폴링 기간으로 해석됩니다. 폴링은 initialDelay,initialDelay+delay,initialDelay+2\*delay 등에서 발생합니다.

true 인 경우 delay 매개변수는 이전 실행과 다음 실행 사이에 경과된 시간으로 해석됩니다. 폴링은 initialDelay,initialDelay+[ProcessingTime]+delay 에서 발생합니다. 여기서 ProcessingTime 은 현재 스레드에서 교환 개체를 처리하는 데 걸린 시간입니다.

41.1.4. 이벤트 중심 소비자와 폴링 소비자 간 변환

Apache Camel은 이벤트 중심 소비자와 폴링 소비자 간에 변환하는 데 사용할 수 있는 두 가지 특수 소비자 구현을 제공합니다. 다음과 같은 변환 클래스가 제공됩니다.

  • org.apache.camel.impl.EventDrivenPollingConsumer Cryostat- Cryostat는 이벤트 중심 소비자 인스턴스를 폴링 소비자 인스턴스로 변환합니다.
  • org.apache.camel.impl.DefaultScheduledPollConsumer Cryostat- Cryostat는 폴링 소비자를 이벤트 중심 소비자 인스턴스로 변환합니다.

실제로 이러한 클래스는 끝점 유형을 구현하는 작업을 단순화하는 데 사용됩니다. Endpoint 인터페이스는 소비자 인스턴스를 생성하는 다음 두 가지 방법을 정의합니다.

package org.apache.camel;

public interface Endpoint {
    ...
    Consumer createConsumer(Processor processor) throws Exception;
    PollingConsumer createPollingConsumer() throws Exception;
}

createConsumer() 는 이벤트 중심 소비자를 반환하고 createPollingConsumer() 는 폴링 소비자를 반환합니다. 이러한 방법 중 하나만 구현합니다. 예를 들어 소비자에 대한 이벤트 중심 패턴을 따르는 경우 createConsumer() 메서드를 구현하여 예외를 발생시키는 createPollingConsumer() 에 대한 메서드 구현을 제공합니다. 그러나 변환 클래스를 사용하면 Apache Camel에서 보다 유용한 기본 구현을 제공할 수 있습니다.

예를 들어 이벤트 중심 패턴에 따라 소비자를 구현하려는 경우 DefaultEndpoint 를 확장하고 createConsumer() 메서드를 구현하여 끝점을 구현합니다. createPollingConsumer() 의 구현은 다음과 같이 정의된 DefaultEndpoint 에서 상속됩니다.

public PollingConsumer<E> createPollingConsumer() throws Exception {
    return new EventDrivenPollingConsumer<E>(this);
}

EventDrivenPollingConsumer 생성자는 이벤트 중심 소비자에 대한 참조를 가져와 효과적으로 래핑하여 폴링 소비자로 변환합니다. 변환을 구현하기 위해 EventDrivenPollingConsumer 인스턴스는 수신 이벤트를 버퍼링하고 필요에 따라 receive(), receive(long timeout)receiveNoWait() 메서드를 통해 사용할 수 있도록 합니다.

마찬가지로 폴링 패턴에 따라 소비자를 구현하는 경우 DefaultPollingEndpoint 를 확장하고 createPollingConsumer() 메서드를 구현하여 끝점을 구현합니다. 이 경우 createConsumer() 메서드의 구현은 DefaultPollingEndpoint 에서 상속되고 기본 구현에서는 DefaultScheduledPollConsumer 인스턴스를 반환합니다 (이는 폴링 소비자를 이벤트 중심 소비자로 변환).

41.1.5. CryostatPrepared 인터페이스

소비자 클래스는 선택적으로 org.apache.camel.spi.ShutdownPrepared 인터페이스를 구현하여 사용자 정의 소비자 엔드포인트에서 종료 알림을 수신할 수 있습니다.

예 41.2. “CryostatPrepared Interface”미리 구문 분석된 인터페이스 의 정의를 표시합니다.

예 41.2. CryostatPrepared Interface

package org.apache.camel.spi;

public interface ShutdownPrepared {

    void prepareShutdown(boolean forced);

}

Cryo statPrepared 인터페이스는 다음 메서드를 정의합니다.

prepareShutdown

다음과 같이 하나 또는 두 단계로 소비자 끝점을 종료하라는 알림을 받습니다.

  1. 강제 인수의 값이 false 인 경우 정상 종료. 리소스를 정상적으로 정리합니다. 예를 들어 스레드를 정상적으로 중지하면 됩니다.
  2. 강제 종료 시 강제 인수의 값이 true 입니다. 즉, 종료 시간이 초과되었으므로 리소스를 더 공격적으로 정리해야 합니다. 프로세스가 종료되기 전에 리소스를 정리할 수 있는 마지막 방법입니다.

41.1.6. CryostatAware 인터페이스

소비자 클래스는 선택 사항으로 정상 종료 메커니즘과 상호 작용하는 org.apache.camel.spi.ShutdownAware 인터페이스를 구현하여 사용자가 종료하는데 추가 시간을 요청할 수 있습니다. 이는 일반적으로 내부 큐에 대기 중인 교환을 저장할 수 있는 SEDA와 같은 구성 요소에 필요합니다. 일반적으로 SEDA 소비자를 종료하기 전에 큐의 모든 교환을 처리하고 싶습니다.

예 41.3. “CryostatAware 인터페이스” 에는 인터페이스 정의가 표시됩니다.

예 41.3. CryostatAware 인터페이스

// Java
package org.apache.camel.spi;

import org.apache.camel.ShutdownRunningTask;

public interface ShutdownAware extends ShutdownPrepared {

    boolean deferShutdown(ShutdownRunningTask shutdownRunningTask);

    int getPendingExchangesSize();
}

Cryo statAware 인터페이스는 다음 방법을 정의합니다.

deferShutdown

소비자 종료를 지연하려면 이 메서드에서 true 를 반환합니다. shutdownRunningTask 인수는 다음 값 중 하나를 사용할 수 있는 enum 입니다.

  • 현재 소비자 의 스레드 풀에서 처리 중인 교환을 처리하지만 그 이상의 교환을 처리하지는 않습니다.
  • CryostatRunningTask.CompleteAllTasks Cryo stat->-<process 모든 보류 중인 거래입니다. 예를 들어, SEDA 구성 요소의 경우 소비자는 들어오는 큐에서 모든 교환을 처리합니다.
getPendingExchangesSize
소비자가 처리할 수 있는 상호 작용 수를 나타냅니다. 0 값은 처리가 완료되고 소비자를 종료할 수 있음을 나타냅니다.

예 41.7. “사용자 정의 스레드 구현”참조하십시오.