검색

2.9. 경로 시작 및 연결 제어

download PDF

2.9.1. 개요

기본적으로 Apache Camel 애플리케이션( CamelContext 인스턴스에 표시된 대로)이 시작되고 Apache Camel 애플리케이션이 종료되면 경로가 자동으로 종료됩니다. 중요하지 않은 배포의 경우 종료 순서의 세부 사항은 일반적으로 중요하지 않습니다. 그러나 프로덕션 환경에서는 데이터 손실을 방지하기 위해 기존 작업을 종료 중에 완료해야 하는 경우가 많습니다. 또한 일반적으로 경로가 종료되는 순서를 제어하여 종속 항목이 위반되지 않도록 합니다(기존 작업이 완료되지 않도록).

이러한 이유로 Apache Camel은 애플리케이션의 정상 종료 를 지원하는 일련의 기능을 제공합니다. 정상 종료를 사용하면 경로 중지 및 시작을 완전히 제어할 수 있으므로 경로 종료 순서를 제어하고 현재 작업을 완료할 수 있습니다.

2.9.2. 경로 ID 설정

각 경로에 경로 ID를 할당하는 것이 좋습니다. 로깅 메시지 및 관리 기능을 보다 효과적으로 활용할 뿐만 아니라 경로 ID를 사용하면 경로 중지 및 시작을 보다 효과적으로 제어할 수 있습니다.

예를 들어 Java DSL에서는 다음과 같이 routeId() 명령을 호출하여 경로 ID인 myCustomerRouteId 를 경로에 할당할 수 있습니다.

from("SourceURI").routeId("myCustomRouteId").process(...).to(TargetURI);

XML DSL에서 다음과 같이 경로 요소의 id 속성을 설정합니다.

<camelContext id="CamelContextID" xmlns="http://camel.apache.org/schema/spring">
  <route id="myCustomRouteId" >
    <from uri="SourceURI"/>
    <process ref="someProcessorId"/>
    <to uri="TargetURI"/>
  </route>
</camelContext>

2.9.3. 경로 자동 시작 비활성화

기본적으로 CamelContext가 시작 시 알고 있는 모든 경로가 자동으로 시작됩니다. 그러나 특정 경로의 시작을 수동으로 제어하려는 경우 해당 경로에 대한 자동 시작을 비활성화할 수 있습니다.

Java DSL 경로가 자동으로 시작되는지 여부를 제어하려면 부울 인수(true 또는 false) 또는 문자열 인수(true 또는 false)를 사용하여 autoStartup 명령을 호출합니다. 예를 들어 다음과 같이 Java DSL에서 경로 자동 시작을 비활성화할 수 있습니다.

from("SourceURI")
  .routeId("nonAuto")
  .autoStartup(false)
  .to(TargetURI);

다음과 같이 autoStartup 속성을 false 로 설정하여 XML DSL에서 경로 자동 시작을 비활성화할 수 있습니다.

<camelContext id="CamelContextID" xmlns="http://camel.apache.org/schema/spring">
  <route id="nonAuto" autoStartup="false">
    <from uri="SourceURI"/>
    <to uri="TargetURI"/>
  </route>
</camelContext>

2.9.4. 수동으로 경로 시작 및 중지

CamelContext 인스턴스에서 startRoute()stopRoute() 메서드를 호출하여 언제든지 Java에서 경로를 수동으로 시작하거나 중지할 수 있습니다. 예를 들어, 경로 ID가 non auto인 경로를 시작하려면 다음과 같이 CamelContext 인스턴스인 context 에서 startRoute() 메서드를 호출합니다.

// Java
context.startRoute("nonAuto");

경로 ID가 아닌 자동 경로가 있는 경로를 중지하려면 다음과 같이 CamelContext 인스턴스인 context 에서 stopRoute() 메서드를 호출합니다.

// Java
context.stopRoute("nonAuto");

2.9.5. 경로의 시작 순서

기본적으로 Apache Camel은 결정적이지 않은 순서로 경로를 시작합니다. 그러나 일부 애플리케이션에서는 시작 순서를 제어하는 것이 중요할 수 있습니다. Java DSL에서 시작 순서를 제어하려면 양의 정수 값을 인수로 사용하는 startupOrder() 명령을 사용합니다. 가장 낮은 정수 값이 있는 경로가 먼저 시작되고 그 뒤에 시작 순서가 더 높은 경로가 있습니다.

예를 들어 다음 예에서 처음 두 경로는 seda:buffer 엔드포인트를 통해 함께 연결됩니다. 다음과 같이 시작 순서 (2 및 1)를 할당하여 두 번째 경로 세그먼트 이후 첫 번째 경로 세그먼트가 시작되도록 할 수 있습니다.

예 2.5. Java DSL의 시작 순서

from("jetty:http://fooserver:8080")
    .routeId("first")
    .startupOrder(2)
    .to("seda:buffer");

from("seda:buffer")
    .routeId("second")
    .startupOrder(1)
    .to("mock:result");

// This route's startup order is unspecified
from("jms:queue:foo").to("jms:queue:bar");

또는 Spring XML에서는 다음과 같이 경로 요소의 startupOrder 특성을 설정하여 동일한 효과를 얻을 수 있습니다.

예 2.6. XML DSL의 시작 순서

<route id="first" startupOrder="2">
    <from uri="jetty:http://fooserver:8080"/>
    <to uri="seda:buffer"/>
</route>

<route id="second" startupOrder="1">
    <from uri="seda:buffer"/>
    <to uri="mock:result"/>
</route>

<!-- This route's startup order is unspecified -->
<route>
    <from uri="jms:queue:foo"/>
    <to uri="jms:queue:bar"/>
</route>

각 경로에 고유한 시작 순서 값을 할당해야 합니다. 1000보다 작은 양의 정수 값을 선택할 수 있습니다. 1000개 이상의 값은 Apache Camel용으로 예약되어 있으며, 명시적 시작 값 없이 이러한 값을 경로에 자동으로 할당합니다. 예를 들어 위 예제의 마지막 경로에 시작 값 1000이 자동으로 할당되므로 처음 두 경로 후에 시작됩니다.

2.9.6. 종료 순서

CamelContext 인스턴스가 종료되면 Apache Camel은 플러그형 종료 전략을 사용하여 종료 순서를 제어합니다. 기본 shutdown 전략은 다음과 같은 종료 순서를 구현합니다.

  1. 경로는 시작 순서의 반대로 종료됩니다.
  2. 일반적으로 종료 전략은 현재 활성화된 교환이 처리 될 때까지 기다립니다. 그러나 작업 실행의 처리는 구성할 수 있습니다.
  3. 전반적으로 종료 시퀀스는 시간 초과(기본값, 300초)에 의해 바인딩됩니다. 종료 시퀀스가 이 시간 초과를 초과하면 일부 작업이 여전히 실행 중인 경우에도 shutdown 전략이 강제 종료됩니다.

2.9.7. 경로 종료 순서

경로는 시작 순서의 반대로 종료됩니다. 즉, 시작 순서가 startupOrder() 명령(Java DSL에서) 또는 startupOrder 특성( XML DSL에서)을 사용하여 정의되는 경우 종료되는 첫 번째 경로는 시작 순서에 의해 할당되는 가장 높은 정수 값을 가진 경로이며 종료할 마지막 경로는 시작 순서에 의해 할당되는 가장 낮은 정수 값을 가진 경로입니다.

예를 들어 예 2.5. “Java DSL의 시작 순서” 에서 종료할 첫 번째 경로 세그먼트는 ID가 번째인 경로입니다. 두 번째 경로 세그먼트는 ID가 있는 경로이고 두 번째 경로 세그먼트는 ID가 있는 경로입니다. 이 예제에서는 경로를 종료할 때 관찰해야 합니다. 외부에서 액세스 가능한 소비자 끝점을 노출하는 경로는 먼저 종료되어야 합니다. 이는 나머지 경로 그래프를 통한 메시지 흐름을 방지하는 데 도움이 되기 때문입니다.

참고

Apache Camel은 또한 shutdownRoute(Defer) 옵션을 제공합니다. 이 옵션을 사용하면 경로를 종료하려면 마지막 경로(시작 순서 값 제외)에 경로를 지정할 수 있습니다. 그러나 이 옵션은 거의 필요하지 않습니다. 이 옵션은 주로 이전 버전의 Apache Camel(또는 2.3에 대한 해결 방법)에 대한 해결 방법으로 필요한 경우 시작 순서와 동일한 순서로 경로가 종료될 수 있습니다.

2.9.8. 경로에서 실행 중인 작업 종료

종료 시 경로가 계속 메시지를 처리하는 경우 shutdown 전략은 일반적으로 경로를 종료하기 전에 현재 활성 교환이 처리를 완료할 때까지 기다립니다. 이 동작은 다음 값 중 하나를 사용할 수 있는 shutdownRunningTask 옵션을 사용하여 각 경로에 구성할 수 있습니다.

ShutdownRunningTask.CompleteCurrentTaskOnly
일반적으로 경로는 한 번에 하나의 메시지에서만 작동하므로 현재 작업이 완료된 후 안전하게 경로를 종료할 수 있습니다.
ShutdownRunningTask.CompleteAllTasks
배치 소비자를 정상적으로 종료하려면 이 옵션을 지정합니다. 일부 소비자 끝점(예: 파일, FTP, 메일, iBATIS, JPA)은 한 번에 메시지 배치에서 작동합니다. 이러한 끝점의 경우 현재 배치의 모든 메시지가 완료될 때까지 기다리는 것이 더 적절합니다.

예를 들어 파일 소비자 끝점을 정상적으로 종료하려면 다음 Java DSL 조각에 표시된 것처럼 CompleteAllTasks 옵션을 지정해야 합니다.

// Java
public void configure() throws Exception {
    from("file:target/pending")
        .routeId("first").startupOrder(2)
        .shutdownRunningTask(ShutdownRunningTask.CompleteAllTasks)
        .delay(1000).to("seda:foo");

    from("seda:foo")
        .routeId("second").startupOrder(1)
        .to("mock:bar");
}

다음과 같이 XML DSL에 동일한 경로를 정의할 수 있습니다.

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <!-- let this route complete all its pending messages when asked to shut down -->
    <route id="first"
           startupOrder="2"
           shutdownRunningTask="CompleteAllTasks">
        <from uri="file:target/pending"/>
        <delay><constant>1000</constant></delay>
        <to uri="seda:foo"/>
    </route>

    <route id="second" startupOrder="1">
        <from uri="seda:foo"/>
        <to uri="mock:bar"/>
    </route>
</camelContext>

2.9.9. 종료 시간

종료 시간 초과의 기본값은 300초입니다. shutdown 전략에서 setTimeout() 메서드를 호출하여 시간 초과 값을 변경할 수 있습니다. 예를 들어 다음과 같이 시간 초과 값을 600초로 변경할 수 있습니다.

// Java
// context = CamelContext instance
context.getShutdownStrategy().setTimeout(600);

2.9.10. 사용자 정의 구성 요소와 통합

사용자 지정 Apache Camel 구성 요소( org.apache.camel.Service 인터페이스에서 상속됨)를 구현하는 경우 사용자 정의 코드가 org.apache.camel.spi.ShutdownPrepared 인터페이스를 구현하여 종료 알림을 받을 수 있습니다. 그러면 구성 요소에 종료를 준비하여 사용자 정의 코드를 실행할 수 있습니다.

2.9.1. RouteIdFactory

소비자 끝점에 따라 논리 이름으로 경로 ID를 할당할 수 있는 RouteIdFactory 를 추가할 수 있습니다.

예를 들어 seda가 있는 경로를 경로 입력으로 사용하거나 직접 구성 요소를 사용하는 경우 해당 이름을 경로 ID(예:)로 사용할 수 있습니다.

  • direct:foo- foo
  • Seda:bar- bar
  • JMS:orders- 순서

자동 할당된 이름을 사용하는 대신 경로에 논리 이름을 할당할 수 있는 NodeIdFactory 를 사용할 수 있습니다. 또한 경로 URL의 컨텍스트 경로를 이름으로 사용할 수도 있습니다. 예를 들어 RouteIDFactory 를 사용하려면 다음을 실행합니다.

context.setNodeIdFactory(new RouteIdFactory());
참고

나머지 엔드포인트에서 사용자 정의 경로 ID를 가져올 수 있습니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.