6장. 라우팅 컨텍스트에 다른 경로 추가
이 튜토리얼에서는 ZooOrderApp
프로젝트의 블루프린트.xml
파일에서 camel 컨텍스트에 두 번째 경로를 추가하는 방법을 보여줍니다. 두 번째 경로:
- 첫 번째 경로의 기타 분기의 터미널 끝에서 메시지(유효한 주문)를 가져옵니다.
- 고객 국가에 따라 유효한 메시지를 정렬합니다.
-
각 메시지를
ZooOrderApp/target/messages
폴더의 해당국가
폴더에 보냅니다. 예를 들어, 시카고 Zoo의 주문은 미국 폴더에 복사됩니다.
6.1. 목표
이 튜토리얼에서는 다음 작업을 완료합니다.
- 두 번째 경로로 직접 연결하기 위해 기존 경로 재구성
- Camel 컨텍스트에 두 번째 경로 추가
- 첫 번째 경로의 기타 분기에서 메시지를 직접 가져오도록 두 번째 경로를 구성합니다.
- 두 번째 경로에 콘텐츠 기반 라우터 추가
- 두 번째 경로의 콘텐츠 기반 라우터의 각 출력 분기에 메시지 헤더, 로깅 및 대상 대상을 추가하고 구성합니다.
6.2. 사전 요구 사항
이 튜토리얼을 시작하려면 다음 중 하나에서 생성된 ZooOrderApp 프로젝트가 필요합니다.
5장. 콘텐츠 기반 라우터 추가 튜토리얼을 완료합니다.
또는
-
2장. 환경 설정 튜토리얼을 완료하고 “리소스 파일 정보” 에 설명된 대로 프로젝트의
블루프린트Contexts/blueprint2.xml
파일을 제공된블루프린트Contexts/blueprint2.xml
파일로 교체합니다.
6.3. 기존 경로의 끝점 재구성
기존 경로는 모든 유효한 주문을 target/messages/validOrders
폴더에 보냅니다.
이 섹션에서는 기존 경로의 엔드포인트를 다시 구성하여 대신 두 번째 경로(다음 섹션에서 생성하는)에 연결합니다.
두 번째 경로와 직접 연결하기 위해 기존 경로를 구성하려면 다음을 수행합니다.
-
경로 편집기에서
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
을 엽니다. - 캔버스에서 Route_route1 컨테이너를 선택하여 속성 보기에서 해당 속성을 엽니다.
- 아래로 스크롤하여 Route 속성으로 이동한 다음 기본값 을 선택합니다.
- 캔버스에서 터미널 파일 노드 To_Valid 를 선택하여 속성 보기에 해당 속성을 표시합니다.
-
Uri 필드에 기존 텍스트를 삭제한 다음
direct:OrderFulfillment
를 입력합니다. -
Id 필드에
_Fulfill
을 입력합니다.
기존 To_Valid
터미널 파일 노드를 교체하는 대신 Components To_Valid
노드와 동일한 속성 값으로 구성할 수 있습니다.
직접 구성 요소에 대한 자세한 내용은 Apache Camel 구성 요소 참조를 참조하십시오.
6.4. 두 번째 경로 추가
라우팅 컨텍스트에 다른 경로를 추가하려면 다음을 수행합니다.
- Personlets 에서 라우팅 서랍을 열고 경로 ( ) 패턴을 클릭합니다.
캔버스에서
Route_route1
컨테이너의 오른쪽을 클릭합니다.경로 패턴은 캔버스의
Route_route2
컨테이너 노드가 됩니다.-
Route_route2
컨테이너 노드를 클릭하여 속성 보기에 해당 속성을 표시합니다. 속성을 그대로 둡니다. - 파일을 저장합니다.
라우팅 컨텍스트가 복잡성이 증가함에 따라 작업하는 동안 경로 편집기에 개별 경로에 중점을 둘 수 있습니다. 이렇게 하려면 Project Explorer 에서 경로 편집기가 캔버스에 표시할 경로를 두 번 클릭합니다(예: Route_route2
).
캔버스의 라우팅 컨텍스트의 모든 경로를 표시하려면 Camel
컨텍스트 폴더 상단에 있는 프로젝트의 .xml
컨텍스트 파일 항목(src/main/resources/OSGI-INF/…
)을 두 번 클릭합니다.
6.5. 미국 주문을 처리하기 위해 선택 분기 구성
이 섹션에서는 경로에 선택 분기를 추가하고 미국 주문을 새 target/messages/validOrders/USA
폴더에 전송하도록 경로를 구성합니다. 메시지 헤더 및 로그 파일 구성 요소도 설정합니다.
- selet 에서 구성 요소 서랍을 열고 직접 구성 요소( )를 선택합니다.
캔버스에서
Route_route2
컨테이너를 클릭합니다.Route_route2
컨테이너는 직접 구성 요소(From_from2
노드)를 수용하도록 확장됩니다.-
캔버스에서
From_from2
노드를 클릭하여 속성 보기에서 속성을 엽니다. Uri 필드에서
name
(직접:
)을OrderFulfillment
로 바꾸고 Id 필드에_direct:OrderFulfillment
를 입력합니다.- selet 에서 Routing drawer를 열고 선택 ( ) 패턴을 선택합니다.
캔버스에서
From _direct:OrderFulfillment
노드를 클릭합니다.Route_route2
컨테이너가 확장되어Choice_choice2
노드를 수용합니다.속성 보기에서
Choice_choice2
노드의 속성을 그대로 둡니다.- selet에서 Routing drawer를 열고 When ( ) 패턴을 선택합니다.
캔버스에서
Choice_choice2
노드를 클릭합니다.Choice_choice2
컨테이너는When_when2
노드를 수용하도록 확장됩니다.-
캔버스에서
When_when2
노드를 선택하여 속성 보기에서 해당 속성을 엽니다. 다음과 같이
When_when2
노드의 속성을 설정합니다.- Expression 드롭다운 목록에서 xpath 를 선택합니다.
-
들여쓰기된 표현식 필드에
/order/customer/country = 'USA'
를 입력합니다. - Trim 을 활성화한 상태로 둡니다.
두 번째 Id 필드에
_when/usa
를 입력합니다.
- selet 에서 Components drawer를 열고 파일 구성 요소( )를 선택합니다.
캔버스에서
When_when/usa
컨테이너를 클릭합니다.When_when/usa
컨테이너가 확장되어To_to1
노드를 수용할 수 있습니다.속성 보기에서 다음을 수행합니다.
-
Uri 필드에서
directoryName
을target/messages/validOrders/USA
로 바꿉니다. -
Id 필드에
_US
를 입력합니다.
-
Uri 필드에서
- 파일을 저장합니다.
메시지 헤더를 설정하고 로그 구성 요소를 추가하려면 다음을 수행합니다.
- Person lets 에서 drawer 를 열고 Set Header 패턴을 선택합니다.
캔버스에서
When_when/usa
노드를 클릭합니다.When_when/usa
컨테이너가 확장되어SetHeader_setHeader3
노드를 수용합니다.-
캔버스에서
SetHeader_setHeader3
노드를 선택하여 속성 보기에서 해당 속성을 엽니다. 다음과 같이 노드의 속성을 설정합니다.
- Expression 드롭다운 메뉴에서 상수 를 선택합니다.
-
들여쓰기된 표현식 필드에 다음과 같이 입력합니다.
USA
- Trim 을 활성화한 상태로 둡니다.
-
헤더 이름 필드에:
대상
을 입력합니다. 두 번째 Id 필드에
_setHead_usa
를 입력합니다.
- selet 에서 Components drawer를 열고 로그 구성 요소( )를 선택합니다.
캔버스에서
SetHeader
노드를 클릭합니다.When_when/usa
컨테이너가 확장되어Log_log3
노드를 수용합니다.캔버스에서
Log_log3
노드를 선택하여 속성 보기에서 해당 속성을 엽니다.속성 보기에서 다음을 수행합니다.
-
Message 필드에
Valid order - 미국 고객에게 LUN을
제공합니다. -
Id 필드에
_usa
를 입력합니다. 로깅 수준을 그대로 둡니다.
-
Message 필드에
파일을 저장합니다.
Route_route2
의 미국 분기는 다음과 같아야 합니다.
6.6. 독일 주문을 처리하기 위해 otherwise 분기 구성
캔버스에 Route_route2
가 표시되는 경우:
- selet 에서 Routing drawer를 열고 otherwise 패턴( )을 선택합니다.
캔버스에서
Choice_choice2
컨테이너를 클릭합니다.Choice_choice2
컨테이너는otherwise_otherwise1 노드를
수용하도록 확장됩니다.-
otherwise_otherwise1
노드를 선택하여 Properties 보기에서 속성을 엽니다. -
속성 보기에서 Id 필드에
_else/ger
를 입력합니다. - selet 에서 drawer를 열고 Set Header 패턴( )을 선택합니다.
캔버스에서 otherwise
_else/ger
노드를 클릭합니다.Otherwise_else/ger
컨테이너는 확장되어SetHeader_setHeader3
노드를 수용합니다.-
캔버스에서
SetHeader_setHeader3
노드를 선택하여 속성 보기에서 해당 속성을 엽니다. 속성 보기에서 다음을 수행합니다.
- Expression 드롭다운 목록에서 상수 를 선택합니다.
-
두 번째 표현식 필드에
Germany
을 입력합니다. - 트리밍 을 그대로 둡니다.
-
헤더 이름 필드에
대상
을 입력합니다. -
두 번째 Id 필드에
_setHead_ger
를 입력합니다.
- selet 에서 Components drawer를 열고 로그 패턴( )을 선택합니다.
캔버스에서
SetHeader_setHead_ger
노드 아래를 클릭합니다.Otherwise_else/ger
컨테이너는Log_log3
노드를 수용하도록 확장됩니다. 필요한 경우Log_log3
노드에서SetHeader_setHead_ger
노드로 커넥터 오류를 드래그합니다.-
캔버스에서
Log_log3
노드를 선택하여 속성 보기에서 해당 속성을 엽니다. 속성 보기에서 다음을 수행합니다.
-
Message 필드에
Valid order - 발송물 독일 고객에게
있습니다. -
Id 필드에
_ger
를 입력합니다. - 로깅 수준을 그대로 둡니다.
-
Message 필드에
구성 요소 서랍에서 파일 패턴( )을 선택한 다음
Log_ger
노드 아래에서 클릭합니다.Otherwise_else/ger
컨테이너는 확장되어To_to1
노드를 수용할 수 있습니다. 필요한 경우SetHeader_setHead_ger
노드에서To_to1
노드로 커넥터 오류를 드래그합니다.-
캔버스에서
To_to1
노드를 선택하여 속성 보기에서 해당 속성을 엽니다. 속성 보기에서 다음을 수행합니다.
-
Uri 필드에서
directoryName
을target/messages/validOrders/Germany
로 바꿉니다. -
Id 필드에
_GER
를 입력합니다.
-
Uri 필드에서
- 파일을 저장합니다.
Route_route2
의 독일 분기는 다음과 같아야 합니다.
6.7. 두 번째 경로 확인
캔버스의 경로는 다음과 같아야 합니다.
완료된 route1
완료된 route2
캔버스 하단의 소스 탭에서 camelContext 요소의 XML은 예 6.1. “이중 경로 콘텐츠 기반 라우터를 위한 XML” 에 표시된 것과 같아야 합니다.
예 6.1. 이중 경로 콘텐츠 기반 라우터를 위한 XML
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd"> <camelContext id="_context1" xmlns="http://camel.apache.org/schema/blueprint"> <route id="_route1" shutdownRoute="Default"> <from id="_from1" uri="file:src/data?noop=true"/> <choice id="_choice1"> <when id="_when1"> <xpath>/order/orderline/quantity/text() > 10</xpath> <log id="_log1" message="The quantity requested exceeds the maximum allowed - contact customer."/> <setHeader headerName="Destination" id="_setHeader1"> <constant>Invalid</constant> </setHeader> <to id="_Invalid" uri="file:target/messages/invalidOrders"/> </when> <otherwise id="_elseValid"> <log id="_log2" message="This is a valid order - OK to process."/> <setHeader headerName="Destination" id="_setHeader2"> <constant>ReadyForDispatcher</constant> </setHeader> <to id="_Fulfill" uri="direct:OrderFulfillment"/> </otherwise> </choice> </route> <route id="_route2"> <from id="_direct:OrderFulfillment" uri="direct:OrderFulfillment"/> <choice id="_choice2"> <when id="when/usa"> <xpath>/order/customer/country = 'USA'</xpath> <log id="_usa" message="Valid order - ship animals to USA customer"/> <setHeader headerName="Destination" id="_setHead_usa"> <constant>USA</constant> </setHeader> <to id="_US" uri="file:target/messages/validOrders/USA"/> </when> <otherwise id="_else/ger"> <log id="_ger" message="Valid order - ship animals to Germany customer"/> <setHeader headerName="Destination" id="_setHead_ger"> <constant>Germany</constant> </setHeader> <to id="_GER" uri="file:target/messages/validOrders/Germany"/> </otherwise> </choice> </route> </camelContext> </blueprint>
툴링에서 두 번째 경로 요소( <routeid="route2"> )에
속성을 추가한 경우 해당 속성을 삭제합니다. 그렇지 않으면 shutdownRoute=" "
ZooOrderApp
프로젝트가 실행되지 않을 수 있습니다.
업데이트된 프로젝트가 예상대로 작동하는지 확인하려면 다음 단계를 따르십시오.
-
ZooOrderApp/Camel Contexts/blueprint.xml
을 로컬 Camel Context(테스트 제외)로 실행합니다. 콘솔 출력의 끝을 확인합니다. 다음 행이 표시됩니다.
대상 대상 폴더를 확인하여 경로가 올바르게 실행되었는지 확인합니다.
-
Project Explorer 에서
ZooOrderApp
을 마우스 오른쪽 버튼으로 클릭한 다음 새로 고침을 선택합니다. target/messages/
폴더를 확장합니다.다음과 같이
message*.xml
파일은 대상에 분산되어야 합니다.그림 6.1. Project Explorer의 대상 메시지 대상
-
Project Explorer 에서
6.8. 다음 단계
다음 튜토리얼에서 7장. 라우팅 컨텍스트 디버깅 에서는 Fuse Tooling 디버거를 사용하는 방법을 알아봅니다.