2.9. 경로 시작 및 연결 제어
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 전략은 다음과 같은 종료 순서를 구현합니다.
- 경로는 시작 순서의 반대로 종료됩니다.
- 일반적으로 종료 전략은 현재 활성화된 교환이 처리 될 때까지 기다립니다. 그러나 작업 실행의 처리는 구성할 수 있습니다.
- 전반적으로 종료 시퀀스는 시간 초과(기본값, 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를 가져올 수 있습니다.