39.2. 구성 요소 인터페이스 구현

39.2.1. DefaultComponent 클래스

일부 메서드에 대한 표준 기능 및 기본 구현을 제공하는 org.apache.camel.impl.DefaultComponent 클래스를 확장하여 새 구성 요소를 구현합니다. 특히 DefaultComponent 클래스는 URI 구문 분석을 지원하고 예약된 executor(예약된 폴링 패턴에 사용)를 생성합니다.

39.2.2. URI 구문 분석

기본 구성 요소 인터페이스에 정의된 createEndpoint(String uri) 메서드는 유일한 인수로 작성되지 않은 완전한 엔드포인트 URI를 사용합니다. 반면 DefaultComponent 클래스는 다음 시그니처와 함께 createEndpoint() 메서드의 세 가지 통합 버전을 정의합니다.

protected abstract Endpoint createEndpoint(
    String uri,
    String remaining,
    Map parameters
)
throws Exception;

URI는 원래의 정리되지 않은 URI입니다. 나머지는 시작 시 구성 요소 접두사를 제거하고 끝에 쿼리 옵션을 중단한 후 남은 URI의 일부이며, 매개 변수에 는 구문 분석된 쿼리 옵션이 포함됩니다. DefaultComponent 에서 상속할 때 재정의해야 하는 createEndpoint() 메서드의 이 버전입니다. 이는 엔드포인트 URI를 이미 구문 분석하는 이점이 있습니다.

파일 구성 요소에 대한 다음 샘플 끝점 URI에서는 URI 구문 분석이 실제로 작동하는 방식을 보여줍니다.

file:///tmp/messages/foo?delete=true&moveNamePostfix=.old

이 URI에서 다음 인수는 createEndpoint() 의 세 가지 통합 버전에 전달됩니다.

인수샘플 값

uri

file:///tmp/messages/foo?delete=true&moveNamePostfix=.old

남아 있음

/tmp/messages/foo

parameters

두 개의 항목은 java.util.Map 에서 설정됩니다.

  • 매개 변수 삭제 는 부울 true입니다.
  • 매개변수 moveNamePostfix 에는 문자열 값 .old 가 있습니다.

39.2.3. 매개변수 삽입

기본적으로 URI 쿼리 옵션에서 추출된 매개 변수는 끝점의 빈 속성에 삽입됩니다. DefaultComponent 클래스는 매개변수를 자동으로 삽입합니다.

예를 들어 두 가지 URI 쿼리 옵션인 deletemoveNamePostfix 를 지원하는 사용자 정의 끝점을 정의하려는 경우입니다. 엔드포인트 클래스에서 해당 8080 메서드(getECDSA 및 setECDSA)를 정의하는 것은 모두 수행해야 합니다.

public class FileEndpoint extends ScheduledPollEndpoint {
    ...
    public boolean isDelete() {
        return delete;
    }
    public void setDelete(boolean delete) {
        this.delete = delete;
    }
    ...
    public String getMoveNamePostfix() {
        return moveNamePostfix;
    }
    public void setMoveNamePostfix(String moveNamePostfix) {
        this.moveNamePostfix = moveNamePostfix;
    }
}

또한 소비자 매개변수에 URI 쿼리 옵션을 삽입할 수도 있습니다. 자세한 내용은 “소비자 매개변수 삽입”의 내용을 참조하십시오.

39.2.4. 끝점 매개변수 삽입 비활성화

Endpoint 클래스에 정의된 매개변수가 없는 경우 엔드포인트 매개 변수 주입을 비활성화하여 끝점 생성 프로세스를 최적화할 수 있습니다. 끝점에서 매개변수 삽입을 비활성화하려면 useIntrospectionOnEndpoint() 메서드를 재정의하고 다음과 같이 false 를 반환하도록 구현합니다.

protected boolean useIntrospectionOnEndpoint() {
  return false;
}
참고

useIntrospectionOnEndpoint() 메서드는 소비자 클래스에서 수행할 수 있는 매개 변수 주입에 영향을 미치지 않습니다. 해당 수준에서 매개변수 삽입은 Endpoint.configureProperties() 메서드에서 제어합니다( 40.2절. “끝점 인터페이스 구현”참조).

39.2.5. 예약된 executor 서비스

예약된 executor는 예약된 폴링 패턴에서 사용되며, 소비자 끝점의 주기적인 폴링을 주도합니다(예약된 executor는 효과적으로 스레드 풀 구현임).

예약된 executor 서비스를 인스턴스화하려면 CamelContext.getExecutorServiceStrategy() 메서드에서 반환하는 ExecutorServiceStrategy 오브젝트를 사용합니다. Apache Camel 스레딩 모델에 대한 자세한 내용은 2.8절. “스레드 모델” 에서 참조하십시오.

참고

Apache Camel 2.3 이전에는 DefaultComponent 클래스에서 스레드 풀 인스턴스를 생성하기 위한 getExecutorService() 메서드를 제공했습니다. 그러나 2.3 이후 스레드 풀 생성은 이제 ExecutorServiceStrategy 개체에 의해 중앙에서 관리됩니다.

39.2.6. URI 검증

끝점 인스턴스를 만들기 전에 URI의 유효성을 검사하려면 다음 서명이 있는 DefaultComponent 클래스에서 validateURI() 메서드를 재정의할 수 있습니다.

protected void validateURI(String uri,
                           String path,
                           Map parameters)
   throws ResolveEndpointFailedException;

제공된 URI에 필요한 형식이 없는 경우 validateURI() 를 구현하면 org.apache.camel.ResolveEndpointFailedException 예외가 발생합니다.

39.2.7. 끝점 생성

예 39.2. “Implementation of createEndpoint() 필요에 따라 엔드포인트 인스턴스를 생성하는 DefaultComponent.createEndpoint() 메서드를 구현하는 방법을 간략하게 설명합니다.

예 39.2. Implementation of createEndpoint()

public class CustomComponent extends DefaultComponent { 1
    ...
    protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { 2
        CustomEndpoint result = new CustomEndpoint(uri, this); 3
        // ...
        return result;
    }
}
1
CustomComponentDefaultComponent 클래스를 확장하여 정의된 사용자 지정 구성 요소 클래스의 이름입니다.
2
DefaultComponent 를 확장하는 경우 세 개의 인수를 사용하여 createEndpoint() 메서드를 구현해야 합니다( “URI 구문 분석”참조).
3
해당 생성자를 호출하여 사용자 지정 끝점 유형인 CustomEndpoint 의 인스턴스를 만듭니다. 최소한 이 생성자는 원래 URI 문자열 uri 의 복사본과 이 구성 요소 인스턴스에 대한 참조를 가져옵니다.

39.2.8. 예제

예 39.3. “FileComponent Implementation” FileComponent 클래스의 샘플 구현을 보여 줍니다.Shows a sample implementation of a FileComponent class.

예 39.3. FileComponent Implementation

package org.apache.camel.component.file;

import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.impl.DefaultComponent;

import java.io.File;
import java.util.Map;

public class FileComponent extends DefaultComponent {
    public static final String HEADER_FILE_NAME = "org.apache.camel.file.name";

    public FileComponent() { 1
    }

    public FileComponent(CamelContext context) { 2
        super(context);
    }

    protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { 3
        File file = new File(remaining);
        FileEndpoint result = new FileEndpoint(file, uri, this);
        return result;
    }
}
1
클래스의 자동 인스턴스화를 용이하게 하기 위해 구성 요소 클래스에 대한 no-argument 생성자를 항상 정의합니다.
2
상위 CamelContext 인스턴스를 인수로 사용하는 생성자는 프로그래밍을 통해 구성 요소 인스턴스를 생성할 때 편리합니다.
3
FileComponent.createEndpoint() 메서드의 구현은 예 39.2. “Implementation of createEndpoint() 에 설명된 패턴을 따릅니다. 구현에서 FileEndpoint 오브젝트를 생성합니다.

39.2.9. SynchronizationRouteAware 인터페이스

SynchronizationRouteAware 인터페이스를 사용하면 교환이 라우팅되기 전과 후에 콜백을 사용할 수 있습니다.

  • OnBeforeRoute: 지정된 경로에서 교환을 라우팅하기 전에 취소되었습니다. 그러나 경로를 시작한 후 UnitOfWorkSynchronizationRouteAware 구현을 추가하는 경우 이 콜백이 호출되지 않을 수 있습니다.
  • OnAfterRoute: 지정된 경로에서 교환을 라우팅한 후 수신됩니다. 그러나 교환이 여러 경로를 통해 라우팅되는 경우 각 경로에 대한 호출 백이 생성됩니다.

    이 호출은 다음 콜백 전에 수행됩니다.

    1. 경로 소비자는 모든 응답을 호출자에 다시 씁니다( InOut 모드인 경우)
    2. UnitOfWorkSynchronization.onComplete(org.apache.camel.Exchange) 또는 Synchronization.onFailure(org.apache.camel.Exchange)를 호출하여 수행됩니다.