294장. Camel SCR(더 이상 사용되지 않음)


Camel 2.15에서 사용 가능

SCR은 서비스 구성 요소 런타임을 나타내며 OSGi Dececative Services 사양을 구현한 것입니다. SCR을 사용하면 일반 Java 오브젝트가 상용구 코드 없이 OSGi 서비스를 노출하고 사용할 수 있습니다.

OSGi 프레임워크는 번들의 SCR 설명자 파일을 보고 오브젝트를 알고 있으며, 이러한 파일은 일반적으로 org.apache.felix:maven-scr-plugin 과 같은 Java 주석에서 생성됩니다.

SCR 번들에서 Camel을 실행하는 것은 Spring DM 및ECDHE 기반 솔루션에 비해 OSGi 프레임워크와 OSGi 프레임워크 간의 코드 라인이 크게 줄어듭니다. 번들은 Java 환경에서 완전히 유지될 수 있으며 XML 또는 속성 파일을 편집할 필요가 없습니다. 이렇게하면 모든 것을 완전히 제어 할 수 있으며 선택의 IDE가 프로젝트에서 어떤 일이 진행되고 있는지 정확히 알고 있음을 의미합니다.

294.1. Camel SCR 지원

Camel-scr 번들은 Apache Camel 버전 2.15.0에 포함되어 있지 않지만 2.12.0 이후의 모든 Camel 버전에서 아티팩트 자체를 사용할 수 있습니다.

org.apache.camel/camel-scr 번들에서는 단위 테스트에서 SCR 속성을 사용하기 위해 Camel 컨텍스트와 도우미 클래스를 관리하는 기본 클래스인 AbstractCamelRunner 를 제공합니다. Apache Karaf용 Camel-scr 기능은 SCR 번들에서 Camel을 실행하는 데 필요한 모든 기능 및 번들을 정의합니다.

AbstractCamelRunner 클래스는 CamelContext의 라이프사이클을 Service Component의 라이프사이클에 연결하고 Camel의 PropertiesComponent를 통해 구성을 처리합니다. java 클래스에서 서비스 구성 요소를 제거하기 위해 수행해야 하는 것은 AbstractCamelRunner 에서 서비스를 확장하고 클래스 수준에 다음 org.apache.felix.scr.annotations 를 추가하는 것입니다.

필수 주석 추가

@Component
@References({
    @Reference(name = "camelComponent",referenceInterface = ComponentResolver.class,
        cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy = ReferencePolicy.DYNAMIC,
        policyOption = ReferencePolicyOption.GREEDY, bind = "gotCamelComponent", unbind = "lostCamelComponent")
})
Copy to Clipboard Toggle word wrap

그런 다음 실행하려는 Camel 경로를 반환하는 getRouteBuilders() 메서드를 구현합니다.

Implement getRouteBuilders()

    @Override
    protected List<RoutesBuilder> getRouteBuilders() {
        List<RoutesBuilder> routesBuilders = new ArrayList<>();
        routesBuilders.add(new YourRouteBuilderHere(registry));
        routesBuilders.add(new AnotherRouteBuilderHere(registry));
        return routesBuilders;
    }
Copy to Clipboard Toggle word wrap

마지막으로 기본 구성을 제공합니다.

주석의 기본 구성

@Properties({
   @Property(name = "camelContextId", value = "my-test"),
   @Property(name = "active", value = "true"),
   @Property(name = "...", value = "..."),
   ...
})
Copy to Clipboard Toggle word wrap

 

이것이 전부입니다. 그리고 프로젝트를 생성하기 위해 camel-archetype-scr 을 사용한 경우 이 모든 것이 이미 처리되고 있습니다.

다음은 camel-archetype-scr에서 생성된 전체 Service Component 클래스의 예입니다.

CamelScrExample.java

// This file was generated from org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example;

import java.util.ArrayList;
import java.util.List;

import org.apache.camel.scr.AbstractCamelRunner;
import example.internal.CamelScrExampleRoute;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.spi.ComponentResolver;
import org.apache.felix.scr.annotations.*;

@Component(label = CamelScrExample.COMPONENT_LABEL, description = CamelScrExample.COMPONENT_DESCRIPTION, immediate = true, metatype = true)
@Properties({
    @Property(name = "camelContextId", value = "camel-scr-example"),
    @Property(name = "camelRouteId", value = "foo/timer-log"),
    @Property(name = "active", value = "true"),
    @Property(name = "from", value = "timer:foo?period=5000"),
    @Property(name = "to", value = "log:foo?showHeaders=true"),
    @Property(name = "messageOk", value = "Success: {{from}} -> {{to}}"),
    @Property(name = "messageError", value = "Failure: {{from}} -> {{to}}"),
    @Property(name = "maximumRedeliveries", value = "0"),
    @Property(name = "redeliveryDelay", value = "5000"),
    @Property(name = "backOffMultiplier", value = "2"),
    @Property(name = "maximumRedeliveryDelay", value = "60000")
})
@References({
    @Reference(name = "camelComponent",referenceInterface = ComponentResolver.class,
        cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy = ReferencePolicy.DYNAMIC,
        policyOption = ReferencePolicyOption.GREEDY, bind = "gotCamelComponent", unbind = "lostCamelComponent")
})
public class CamelScrExample extends AbstractCamelRunner {

    public static final String COMPONENT_LABEL = "example.CamelScrExample";
    public static final String COMPONENT_DESCRIPTION = "This is the description for camel-scr-example.";

    @Override
    protected List<RoutesBuilder> getRouteBuilders() {
        List<RoutesBuilder> routesBuilders = new ArrayList<>();
        routesBuilders.add(new CamelScrExampleRoute(registry));
        return routesBuilders;
    }
}
Copy to Clipboard Toggle word wrap

 

CamelContextId 및 active 속성은 CamelContext의 이름(기본값: "camel-runner-default")과 시작 여부를 제어합니다(기본값: "false"). 이 외에도 원하는 수만큼 속성을 추가하고 사용할 수 있습니다. Camel의 PropertiesComponent는 재귀 속성 및 문제 없이 폴백 접두사를 처리합니다.

AbstractCamelRunner 는 Camel의 PropertiesComponent를 통해 이러한 속성을 RouteBuilders에서 사용할 수 있도록 하며 이름이 일치하면 서비스 구성 요소 및 RouteBuilder의 필드에 이러한 값을 삽입합니다. 필드는 모든 가시성 수준으로 선언할 수 있으며 많은 유형이 지원됩니다(String, int, boolean, URL, …​).

다음은 camel-archetype-scr 에서 생성된 RouteBuilder 클래스의 예입니다.

 

CamelScrExampleRoute.java

// This file was generated from org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example.internal;

import org.apache.camel.LoggingLevel;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.SimpleRegistry;
import org.apache.commons.lang.Validate;

public class CamelScrExampleRoute extends RouteBuilder {

    SimpleRegistry registry;

    // Configured fields
    private String camelRouteId;
    private Integer maximumRedeliveries;
    private Long redeliveryDelay;
    private Double backOffMultiplier;
    private Long maximumRedeliveryDelay;

    public CamelScrExampleRoute(final SimpleRegistry registry) {
        this.registry = registry;
    }

    @Override
    public void configure() throws Exception {
        checkProperties();

        // Add a bean to Camel context registry
        registry.put("test", "bean");

        errorHandler(defaultErrorHandler()
            .retryAttemptedLogLevel(LoggingLevel.WARN)
            .maximumRedeliveries(maximumRedeliveries)
            .redeliveryDelay(redeliveryDelay)
            .backOffMultiplier(backOffMultiplier)
            .maximumRedeliveryDelay(maximumRedeliveryDelay));

        from("{{from}}")
            .startupOrder(2)
            .routeId(camelRouteId)
            .onCompletion()
                .to("direct:processCompletion")
            .end()
            .removeHeaders("CamelHttp*")
            .to("{{to}}");


        from("direct:processCompletion")
            .startupOrder(1)
            .routeId(camelRouteId + ".completion")
            .choice()
                .when(simple("${exception} == null"))
                    .log("{{messageOk}}")
                .otherwise()
                    .log(LoggingLevel.ERROR, "{{messageError}}")
            .end();
        }
    }

    public void checkProperties() {
        Validate.notNull(camelRouteId, "camelRouteId property is not set");
        Validate.notNull(maximumRedeliveries, "maximumRedeliveries property is not set");
        Validate.notNull(redeliveryDelay, "redeliveryDelay property is not set");
        Validate.notNull(backOffMultiplier, "backOffMultiplier property is not set");
        Validate.notNull(maximumRedeliveryDelay, "maximumRedeliveryDelay property is not set");
    }
}
Copy to Clipboard Toggle word wrap

 

CamelScrECDHERoute 에 대해 자세히 살펴보겠습니다.

 

    // Configured fields
    private String camelRouteId;
    private Integer maximumRedeliveries;
    private Long redeliveryDelay;
    private Double backOffMultiplier;
    private Long maximumRedeliveryDelay;
Copy to Clipboard Toggle word wrap

이러한 필드의 값은 해당 이름과 일치하여 속성의 값으로 설정됩니다.

 

        // Add a bean to Camel context registry
        registry.put("test", "bean");
Copy to Clipboard Toggle word wrap

경로에 대한 CamelContext의 레지스트리에 months을 추가해야 하는 경우 다음과 같이 수행할 수 있습니다.

 

    public void checkProperties() {
        Validate.notNull(camelRouteId, "camelRouteId property is not set");
        Validate.notNull(maximumRedeliveries, "maximumRedeliveries property is not set");
        Validate.notNull(redeliveryDelay, "redeliveryDelay property is not set");
        Validate.notNull(backOffMultiplier, "backOffMultiplier property is not set");
        Validate.notNull(maximumRedeliveryDelay, "maximumRedeliveryDelay property is not set");
    }
Copy to Clipboard Toggle word wrap

필요한 매개변수가 설정되어 있고 경로가 시작되기 전에 의미 있는 값이 있는지 확인하는 것이 좋습니다.

 

        from("{{from}}")
            .startupOrder(2)
            .routeId(camelRouteId)
            .onCompletion()
                .to("direct:processCompletion")
            .end()
            .removeHeaders("CamelHttp*")
            .to("{{to}}");


        from("direct:processCompletion")
            .startupOrder(1)
            .routeId(camelRouteId + ".completion")
            .choice()
                .when(simple("${exception} == null"))
                    .log("{{messageOk}}")
                .otherwise()
                    .log(LoggingLevel.ERROR, "{{messageError}}")
            .end();
Copy to Clipboard Toggle word wrap

경로의 거의 모든 속성은 속성으로 구성됩니다. 기본적으로 RouteBuilder를 템플릿으로 만듭니다. SCR을 사용하면 대체 구성을 제공하여 경로의 인스턴스를 더 생성할 수 있습니다. Camel SCR 번들을 템플릿으로 사용 섹션에서 자세히 설명합니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2025 Red Hat