툴링 튜토리얼


Red Hat Fuse 7.10

CodeReady Studio에서 Fuse Tooling을 사용하는 방법의 예

Red Hat Fuse Documentation Team

초록

이 안내서에는 Red Hat Fuse Tooling에서 제공하는 툴을 사용하여 애플리케이션을 개발하고 테스트하는 방법을 보여주는 여러 가지 간단한 튜토리얼이 포함되어 있습니다.

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

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지에서 참조하십시오.

1장. Fuse 툴링 튜토리얼 정보

Red Hat Fuse Tooling 튜토리얼에서는 Fuse Tooling을 사용하여 Apache Camel 애플리케이션을 개발, 실행, 테스트 및 배포하는 방법을 소개합니다.

1.1. 사전 요구 사항

시작하기 전에 다음 소프트웨어에 대해 잘 알고 있어야 합니다.

1.2. Fuse Tooling 튜토리얼 개요

다음은 튜토리얼과 각 튜토리얼에서 수행하는 사항에 대한 요약입니다.

  • 2장. 환경 설정

    Fuse Integration 프로젝트를 생성하고 튜토리얼 리소스 파일(예: 메시지 및 라우팅 컨텍스트 파일)을 설정합니다. 프로젝트를 생성할 때 라우팅 컨텍스트와 예비 경로를 자동으로 생성합니다.

  • 3장. 경로 정의

    폴더에서 메시지를 검색하고 다른 폴더에 복사하는 간단한 경로에 대한 끝점을 정의합니다.

  • 4장. 경로 실행

    테스트 메시지를 확인합니다. 경로를 실행하고 테스트 메시지가 소스 폴더에서 대상 폴더로 복사되었는지 확인하여 작동하는지 확인합니다.

  • 5장. 콘텐츠 기반 라우터 추가

    메시지를 필터링하고 메시지의 콘텐츠를 기반으로 다른 대상 폴더에 복사하는 콘텐츠 기반 라우터를 추가합니다.

  • 6장. 라우팅 컨텍스트에 다른 경로 추가

    메시지를 추가로 필터링하고 메시지의 콘텐츠를 기반으로 다른 대상 폴더에 복사하는 다른 경로를 추가합니다.

  • 7장. 라우팅 컨텍스트 디버깅

    Camel 디버거를 사용하여 Cryostat를 설정한 다음 경로를 단계별로 설정하여 경로 및 메시지 변수를 검사합니다.

  • 8장. 경로를 통해 메시지 추적

    경로에 메시지를 드롭하고 모든 경로 노드를 통해 메시지를 추적합니다.

  • 9장. JUnit을 사용하여 경로 테스트

    경로에 대한 JUnit 테스트 케이스를 생성한 다음 경로를 테스트합니다.

  • 10장. Red Hat Fuse에 프로젝트 게시

    Red Hat Fuse에 Apache Camel 프로젝트 게시 프로세스를 안내합니다. 로컬 서버를 정의하고, 게시 옵션을 구성하고, 서버를 시작하고, 프로젝트를 게시하고, 서버에 연결하고, 프로젝트가 성공적으로 빌드 및 게시되었는지 확인합니다.

Fuse Tooling 기능에 대한 자세한 내용은 도구 사용자 가이드를 참조하십시오.

1.3. 샘플 애플리케이션 정보

Fuse Tooling 튜토리얼에서 빌드하는 샘플 애플리케이션은 Zoos가 개를 주문하기 위한 간단한 애플리케이션을 시뮬레이션합니다. 샘플 XML 메시지가 제공됩니다. 각 XML 메시지에는 고객 정보(오브젝트의 이름, 도시 및 국가) 및 주문 정보(요청되는 양과 수, 허용되는 최대 수)가 포함됩니다.

Fuse Tooling을 사용하여 들어오는 샘플 메시지를 사용하고, 콘텐츠(유효한 주문과 유효하지 않은 주문)를 기반으로 필터링한 블루프린트 프로젝트를 생성한 다음, Zoo의 위치(국가)에 따라 유효한 순서를 추가로 정렬합니다. 이후 튜토리얼에서는 샘플 애플리케이션을 사용하여 라우팅 컨텍스트를 디버그하고, 경로를 통해 메시지를 추적하고, JUnit으로 경로를 테스트하고, 마지막으로 Fuse 프로젝트를 게시합니다.

1. 리소스 파일 정보

각 튜토리얼은 이전 튜토리얼을 기반으로 구축됩니다. 하나의 튜토리얼에서 생성된 코드는 다음 튜토리얼의 시작점으로, 튜토리얼을 순서대로 완료할 수 있습니다. 또는 첫 번째 튜토리얼을 완료한 후 제공된 컨텍스트 파일 중 하나를 시작점으로 사용하여 다른 튜토리얼을 시퀀스로 수행할 수 있습니다.

튜토리얼은 여기에 있는 Fuse-tooling-tutorials-jbds-10.3.zip 파일에 제공된 리소스 파일을 사용합니다. 이 zip 파일에는 두 폴더가 포함되어 있습니다.

메시지
이 폴더에는 message1.xml,message2.xml, …​ , message6.xml 이라는 6개의 메시지 파일이 포함되어 있습니다. 첫 번째 튜토리얼인 2장. 환경 설정 에서는 이러한 메시지 파일을 저장할 디렉터리를 생성하고 해당 콘텐츠도 확인합니다. 모든 튜토리얼에 대해 이러한 메시지 파일이 필요합니다.
blueprintContexts

이 폴더에는 다음 세 개의 라우팅 컨텍스트 파일이 포함되어 있습니다.

2장. 환경 설정

이 튜토리얼에서는 Fuse Integration 프로젝트를 생성하는 과정을 안내합니다. 프로젝트에는 초기 경로와 기본 CamelContext가 포함됩니다. 경로는 메시지가 이동하는 프로세서 체인입니다. CamelContext는 경로 구성 컨텍스트를 정의하는 단일 라우팅 규칙 기반이며 엔드포인트 간 메시지 교환 중에 사용할 정책을 지정합니다(메시지 소스 및 대상).

다른 튜토리얼을 수행하기 전에 이 튜토리얼을 완료해야 합니다.

2.1. 목표

이 튜토리얼에서는 다음 작업을 완료합니다.

  • Fuse Integration 프로젝트 생성
  • 프로젝트에 대한 테스트 메시지( XML 파일) 다운로드
  • 테스트 메시지 보기

2.2. 시작하기 전

Fuse Integration 프로젝트를 설정하려면 먼저 Red Hat CodeReady Studio with Fuse Tooling을 설치해야 합니다. CodeReady Studio를 설치하는 방법에 대한 자세한 내용은 Red Hat 고객 포털 로 이동하여 플랫폼 설치 가이드를 참조하십시오.

10장. Red Hat Fuse에 프로젝트 게시 튜토리얼의 단계를 수행하기 전에 Java 8을 설치해야 합니다.

2.3. Fuse Integration 프로젝트 생성

  1. Red Hat CodeReady Studio를 엽니다.

    CodeReady Studio를 처음 시작하면 JBoss 관점에서 열립니다.

    시작 시 JBoss 관점

    그렇지 않으면 이전 CodeReady Studio 세션에서 사용 중인 관점에서 열립니다.

  2. 메뉴에서 FileNewFuse Integration Project 를 선택하여 New Fuse Integration Project 마법사를 엽니다.

    새 프로젝트 마법사
  3. 프로젝트 이름 필드에 ZooOrderApp 을 입력합니다.

    Use default workspace location 옵션을 선택한 상태로 둡니다.

  4. 다음을 클릭하여 대상 런타임 선택 페이지를 엽니다.

    대상 런타임 페이지 선택
  5. 배포 플랫폼에 대해 독립 실행형 을 선택합니다.
  6. Karaf에서 Karaf/Fuse 를 선택하고 런타임 시 선택한 None 을 수락합니다.

    참고

    나중에 10장. Red Hat Fuse에 프로젝트 게시 튜토리얼에서 런타임을 추가합니다.

  7. 기본 Apache Camel 버전을 수락합니다.

    대상 런타임 페이지가 입력됨 선택
  8. 다음을 클릭하여 고급 프로젝트 설정 페이지를 연 다음 Empty - 블루프린트 DSL 템플릿을 선택합니다.

    고급 프로젝트 설정
  9. 완료를 클릭합니다.

    Fuse Tooling은 Maven 리포지토리에서 다운로드를 시작합니다. 프로젝트를 빌드하는 데 필요한 모든 파일을 Project Explorer 보기에 추가합니다.

    CodeReady Studio가 Fuse Integration 관점이 표시되지 않는 경우 현재로 전환할지 여부를 묻는 메시지가 표시됩니다.

    tutSwitchToFIP
  10. 예를 클릭합니다.

    ZooOrderApp 프로젝트가 Fuse 통합 관점에서 열립니다.

    tutEmptyProjectOpen

    ZooOrderApp 프로젝트에는 다음을 포함하여 경로를 생성하고 실행하는 데 필요한 모든 파일이 포함되어 있습니다.

    • ZooOrderApp/pom.xml Cryostat- CryostatA Maven 프로젝트 파일.

      생성된 블루프린트.xml 및 pom.xml 파일
    • ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml Cryostat- CryostatA 블루프린트 XML 파일은 Camel 라우팅 컨텍스트 및 초기 빈 경로가 포함되어 있습니다.
  11. 사전 라우팅 컨텍스트를 보려면 편집기 보기에서 블루프린트.xml 파일을 열고 소스 탭을 클릭합니다.

    tutRouteSource

2.4. ID 값을 표시하도록 구성 요소 레이블 설정

디자인 캔버스에 배치한 패턴 및 구성 요소의 레이블이 도구 자습서에 표시된 라벨과 동일한지 확인하려면 다음을 수행하십시오.

  1. 편집기 기본 설정 페이지를 엽니다.

    • Linux 및 Windows 시스템에서 Windows기본 설정Fuse 툴링편집기 를 선택합니다.
    • OS X에서 CodeReady StudioPreferencesFuse ToolingEditor 를 선택합니다.
  2. 모든 구성 요소 레이블 옵션에 대해 Use ID 값을 선택합니다.

    편집기 기본 설정 - ID 값 사용 옵션
  3. 적용 및 닫기를 클릭합니다.

2.5. 프로젝트의 테스트 메시지 다운로드

샘플 XML 메시지 파일이 제공되어 도구 자습서를 통해 작업할 때 ZooOrderApp 프로젝트를 테스트할 수 있습니다. 이 메시지에는 동물원에 대한 주문 정보가 포함되어 있습니다. 예를 들어, 시카고 주원에 대한 5 개의 wommgrs 주문.

제공된 테스트 메시지( XML 파일)를 다운로드하여 프로젝트에 복사하려면 다음을 수행합니다.

  1. CodeReady Studio Project Explorer 보기에서 테스트 메시지를 포함할 폴더를 생성합니다.

    1. ZooOrderApp/src 폴더를 마우스 오른쪽 버튼으로 클릭한 다음 폴더 를 선택합니다. 새 폴더 마법사가 열립니다.
    2. 폴더 이름의 경우 data 를 입력합니다.
    3. 완료를 클릭합니다.
  2. 웹 브라우저를 클릭하여 제공된 도구 자습서 리소스 Fuse-tooling-tutorials-jbds-10.3.zip 파일의 위치에 대한 웹 브라우저를 엽니다. https://github.com/FuseByExample/fuse-tooling-tutorials/archive/jbds-10.3.zip

    Fuse-tooling-tutorials-jbds-10.3.zip 파일을 ZooOrderApp 프로젝트 작업 공간 외부에 있는 편리한 위치에 다운로드한 다음 압축을 풉니다. 1장. Fuse 툴링 튜토리얼 정보 에 설명된 대로 두 개의 폴더가 포함되어 있습니다.

  3. messages 폴더에서 6개의 XML 파일을 ZooOrderApp 프로젝트의 src/data 폴더에 복사합니다.

    프로젝트의 데이터 폴더에 있는 메시지 파일
    참고

    XML 파일에서 Warning icon 를 안전하게 무시할 수 있습니다.

2.6. 테스트 메시지 보기

각 XML 메시지 파일에는 수의 수에 대한 Zoo(고객)의 주문이 포함되어 있습니다. 예를 들어 'message1.xml' 파일에는 12 wom strategics의 Brooklyn Zoo의 순서가 포함되어 있습니다.

편집기 보기에서 메시지 XML 파일을 열어 내용을 검사할 수 있습니다.

  1. Project Explorer 보기에서 메시지 파일을 마우스 오른쪽 버튼으로 클릭합니다.
  2. 팝업 메뉴에서 열기 를 선택합니다.
  3. 소스 탭을 클릭합니다.

    XML 파일이 편집기 보기에서 열립니다.

    예를 들어 message1.xml 파일의 내용은 Bronx Zoo의 12 wom iqns의 순서를 보여줍니다.

    <?xml version="1.0" encoding="UTF-8"?>
    
    <order>
      <customer>
        <name>Bronx Zoo</name>
        <city>Bronx NY</city>
        <country>USA</country>
      </customer>
      <orderline>
        <animal>wombat</animal>
        <quantity>12</quantity>
      </orderline>
    </order>
    Copy to Clipboard Toggle word wrap
참고

새로 생성된 message1.xml 파일의 첫 번째 줄에서 Warning icon 를 무시하면 문서에서 참조하는 문법 제약 조건(DTD 또는 XML 스키마)이 없음을 알리는 메시지가 표시됩니다.

다음 표에서는 6개의 메시지 파일의 내용을 요약합니다.

Expand
표 2.1. 제공된 테스트 메시지
msg#<name><city><country><animal><quantity>

1

Bronx Zoo

Bronx Cryostat

USA

웨이브(Wom B)

12

2

San Diego Zoo

San Diego CA

USA

giraffe

3

3

sea Life Centre

뮌헨

독일

Penguin

15

4

Cryostat Zoo

Cdk

독일

emu

6

5

phyamadelphia Zoo

Philapelphia PA

USA

giraffe

2

6

st Louis Zoo

더 알아보기

USA

Penguin

10

2.7. 다음 단계

CodeReady Studio 프로젝트를 설정했으므로 XML 메시지를 처리하는 경로를 정의하는 3장. 경로 정의 튜토리얼로 계속 작업할 수 있습니다.

3장. 경로 정의

이 튜토리얼에서는 경로에 끝점을 추가하고 구성하는 방법을 안내합니다. 끝점은 경로를 통과하는 메시지의 소스 및 싱크를 정의합니다. ZooOrderApp 프로젝트의 경우 시작(소스) 끝점은 XML 메시지 파일이 포함된 폴더입니다. 싱크(완료) 끝점은 프로젝트에 지정하는 또 다른 폴더입니다.

3.1. 목표

이 튜토리얼에서는 다음 작업을 완료합니다.

  • 경로에 소스 및 싱크 끝점 추가
  • 끝점 구성
  • 끝점 연결

3.2. 사전 준비 사항

이 튜토리얼을 시작하기 전에:

  1. 2장. 환경 설정 튜토리얼에 설명된 대로 작업 공간 환경을 설정해야 합니다.
  2. CodeReady Studio에서 편집기 보기에서 ZooOrderApp 프로젝트의 /src/main/resources/OSGI-INF/blueprint/blueprint.xml 파일을 엽니다.
  3. 필요한 경우 편집기 보기 하단의 디자인 탭을 클릭하여 Route_route1 이라는 레이블이 지정된 초기 경로의 그래픽 표시를 확인합니다.

3.3. 소스 끝점 구성

다음 단계에 따라 src/data 폴더를 경로의 소스 엔드포인트로 구성합니다.

  1. Personlets 'sComponents drawer에서 캔버스로 파일 구성 요소( File icon )를 드래그하고 Route_route1 컨테이너 노드에 놓습니다.

    File 구성 요소는 Route _route1 컨테이너 노드 내의 _from 1 노드로 변경합니다.

  2. 캔버스에서 From _from1 노드를 선택합니다.

    캔버스 아래에 있는 속성 보기는 편집할 노드의 속성 필드를 표시합니다.

  3. 메시지 파일의 소스 디렉터리를 지정하려면 속성 보기에서 고급 탭을 클릭합니다.

    FileSysCompProps1Tut
  4. Directory Name 필드에 src/data 를 입력합니다.

    FileSystemCompPropsTut

    path src/data 는 프로젝트의 디렉터리를 기준으로 합니다.

  5. Consumer 탭에서 확인란을 클릭하여 Noop 옵션을 활성화합니다.

    Noop 옵션을 사용하면 message#.xml 파일이 src/data 폴더에서 삭제되지 않도록 하고, idempotency를 통해 각 message#.xml 파일이 한 번만 사용되도록 할 수 있습니다.

  6. 세부 정보 탭을 선택하여 파일 노드의 세부 정보 페이지를 엽니다.

    툴링은 고급 탭에서 구성한 Directory NameNoop 속성으로 Uri 필드를 자동으로 채웁니다. 또한 자동 생성된 ID(_from1)로 Id 필드를 채웁니다.

    FileSystemCompPropsTut2
    참고

    툴링 접두사는 밑줄(_)을 사용하여 자동 생성된 ID 값을 지정합니다. 선택적으로 ID 값을 변경할 수 있습니다. 밑줄 접두사는 필수 조건이 아닙니다.

    자동 생성된 ID 는 그대로 둡니다.

  7. 파일저장을 선택하여 경로를 저장합니다.

3.4. 싱크 끝점 구성

경로의 싱크(대상) 끝점을 추가하고 구성하려면 다음을 수행합니다.

  1. ImageChange의Components drawer에서 다른 File 구성 요소를 드래그하여 Route_route1 컨테이너 노드에 놓습니다.

    File 구성 요소는 Route_route1 컨테이너 노드 내의 To_to1 노드로 변경합니다.

  2. 캔버스에서 To_to1 노드를 선택합니다.

    캔버스 아래에 있는 속성 보기는 편집할 노드의 속성 필드를 표시합니다.

  3. 세부 정보 탭에서 다음을 수행합니다.

    1. Uri 필드에 file:target/messages/received 를 입력합니다.
    2. Id 필드에 _Received 를 입력합니다.

      FilesysTargetCompPropsTut
      참고

      툴링은 런타임 시 target/messages/received 폴더를 생성합니다.

  4. Route_route1 컨테이너에서 _from1 노드에서 From _from1 노드를 선택하고 To_Received 노드를 통해 해당 커넥터 화살표( connector arrow icon )를 드래그한 다음 릴리스하십시오.

    CompletedRoute1
    참고

    두 파일 노드는 경로 편집기의 레이아웃 방향 기본 설정에 따라 캔버스에 연결되고 정렬됩니다. 선택 사항은 Down (기본값) 및 right 입니다.

    경로 편집기의 레이아웃 기본 설정에 액세스하려면 다음을 수행합니다.

    • Linux 및 Windows 시스템에서 Windows기본 설정Fuse 툴링편집기다이어그램 편집기의 레이아웃 방향을 선택합니다.
    • OS X에서 CodeReady StudioPreferencesFuse ToolingEditordiagram 편집기의 레이아웃 방향을 선택합니다.
    참고

    프로젝트를 종료하기 전에 노드를 연결하지 않으면 툴에서 노드를 다시 열 때 자동으로 연결됩니다.

  5. 경로를 저장합니다.
  6. 캔버스 하단에서 소스 탭을 클릭하여 경로에 대한 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">
                <from id="_from1" uri="file:src/data?noop=true"/>
                <to id="_Received" uri="file:target/messages/received"/>
            </route>
        </camelContext>
    </blueprint>
    Copy to Clipboard Toggle word wrap

3.5. 다음 단계

이제 경로에 끝점을 추가하고 구성했으므로 4장. 경로 실행 튜토리얼에 설명된 대로 경로를 실행할 수 있습니다.

4장. 경로 실행

이 튜토리얼에서는 경로를 실행하여 경로가 소스 끝점에서 싱크 끝점으로 메시지를 올바르게 전송하는지 확인하는 프로세스를 안내합니다.

4.1. 목표

이 튜토리얼에서는 다음 작업을 완료합니다.

  • 로컬 Camel 컨텍스트로 경로를 실행합니다(테스트를 설정하지 않았으므로 테스트 제외)
  • 경로를 통해 메시지 전송
  • 싱크 끝점에서 수신한 메시지를 검사하여 경로가 테스트 메시지를 올바르게 처리했는지 확인합니다.

4.2. 사전 요구 사항

이 튜토리얼을 시작하려면 다음과 같은 ZooOrderApp 프로젝트가 필요합니다.

  1. 2장. 환경 설정 튜토리얼을 완료합니다.
  2. 다음 중 하나:

4.3. 경로 실행

경로를 실행하려면 다음을 수행합니다.

  1. ZooOrderApp 프로젝트를 엽니다.
  2. Project Explorer 에서 ZooOrderApp/Camel Contexts/blueprint.xml :을 선택합니다.

    tutRunCBRrouteCamContext
  3. 블루프린트.xml 을 마우스 오른쪽 버튼으로 클릭한 다음 Run AsLocal Camel Context (Test 제외)를 선택합니다.

    참고

    대신 Local Camel Context 를 선택하면 툴링에서 제공된 JUnit 테스트에 대해 라우팅 컨텍스트를 자동으로 실행하려고 합니다. JUnit 테스트가 존재하지 않기 때문에 툴링은 테스트 없이 라우팅 컨텍스트를 실행하는 것으로 되돌아갑니다. 9장. JUnit을 사용하여 경로 테스트 튜토리얼에서 JUnit 테스트 케이스를 생성하여 ZooOrderApp 프로젝트를 테스트합니다.

    콘솔 패널이 열리고 프로젝트 실행 진행 상황을 반영하는 로그 메시지가 표시됩니다. 처음에 Maven은 로컬 Maven 리포지토리를 업데이트하는 데 필요한 리소스를 다운로드합니다. Maven 다운로드 프로세스에는 몇 분이 걸릴 수 있습니다.

  4. 출력 끝에 메시지(다음과 유사)가 표시될 때까지 기다립니다. 이러한 메시지는 경로가 성공적으로 실행되었음을 나타냅니다.

    ...
    [Blueprint Event Dispatcher: 1] BlueprintCamelContext INFO  Route: _route1 started and consuming from:Endpoint[file://src/data?noop=true]
    [Blueprint Event Dispatcher: 1] BlueprintCamelContext INFO  Total 1 routes, of which 1 are started.
    [Blueprint Event Dispatcher: 1]BlueprintCamelContext INFO  Apache Camel 2.21.0.redhat-3 (CamelContext: ...) started in 0.163 seconds
    [Blueprint Event Dispatcher: 1] BlueprintCamelContext INFO  Apache Camel 2.21.0.redhat-3 (CamelContext: ...) started in 0.918 seconds
    Copy to Clipboard Toggle word wrap
  5. 경로를 종료하려면 콘솔 보기 상단에 있는 console’s shutdown button 를 클릭합니다.

4.4. 경로 확인

경로가 올바르게 실행되었는지 확인하려면 메시지 XML 파일이 소스 폴더(src/data)에서 대상 폴더(target/messages/received)로 복사되었는지 확인합니다.

  1. Project Explorer 에서 ZooOrderApp 을 선택합니다.
  2. 마우스 오른쪽 버튼으로 클릭하고 새로 고침을 선택합니다.
  3. Project Explorer 에서 target/messages/ 폴더를 찾아서 확장하여 target/messages/received 폴더에 message6.xml ~ message6 .xml 이라는 6개의 메시지 파일이 포함되어 있는지 확인합니다.

    메시지 대상
  4. message1.xml 을 두 번 클릭하여 경로 편집기의 디자인 탭에서 연 다음 소스 탭을 선택하여 XML 코드를 확인합니다.

    <?xml version="1.0" encoding="UTF-8"?>
    
    <order>
      <customer>
        <name>Bronx Zoo</name>
        <city>Bronx NY</city>
        <country>USA</country>
      </customer>
      <orderline>
        <animal>wombat</animal>
        <quantity>12</quantity>
      </orderline>
    </order>
    Copy to Clipboard Toggle word wrap

4.5. 다음 단계

5장. 콘텐츠 기반 라우터 추가 튜토리얼에서는 메시지의 콘텐츠를 사용하여 대상을 결정하는 콘텐츠 기반 라우터를 추가합니다.

5장. 콘텐츠 기반 라우터 추가

이 튜토리얼에서는 CBR(Content-Based Router) 및 경로에 로깅을 추가하는 방법을 보여줍니다.

CBR은 콘텐츠를 기반으로 대상으로 메시지를 라우팅합니다. 이 튜토리얼에서는 각 메시지의 수량 필드 값(순서의 주문 수)에 따라 다른 폴더(유효성 또는 유효하지 않음)로 메시지를 라우팅하는 CBR입니다. 각 주문의 최대 수치는 10입니다. CBR은 수량이 10보다 큰지 여부에 따라 다른 폴더에 메시지를 라우팅합니다. 예를 들어, Zoo가 5 zebras를 주문하고 zebras만 사용할 수 있는 경우 주문은 유효하지 않은 주문 대상 폴더에 복사됩니다.

5.1. 목표

이 튜토리얼에서는 다음 작업을 완료합니다.

  • 경로에 콘텐츠 기반 라우터 추가
  • 콘텐츠 기반 라우터를 구성합니다.

    • 콘텐츠 기반 라우터의 각 출력 분기에 로그 끝점을 추가합니다.
    • 각 로그 끝점 뒤에 Set Header EIP 추가
    • 콘텐츠 기반 라우터에 otherwise branch를 추가합니다.

5.2. 사전 요구 사항

이 튜토리얼을 시작하려면 다음 중 하나에서 생성된 ZooOrderApp 프로젝트가 필요합니다.

5.3. 콘텐츠 기반 라우터 추가 및 구성

경로에 대한 콘텐츠 기반 라우터를 추가하고 구성하려면 다음을 수행합니다.

  1. Project Explorer 에서 ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml 을 두 번 클릭하여 편집기 보기에서 엽니다.
  2. 디자인 캔버스에서 To_Received 노드를 선택한 다음 휴지통 아이콘을 선택하여 삭제할 수 있습니다.
  3. Personlets 에서 Routing drawer를 열고 선택 ( Choice icon ) 패턴을 클릭한 다음 (디케이블 캔버스에서) From_from1 노드를 클릭합니다.

    tutCBRaddChoice1

    Route_route1 컨테이너가 확장되어 Choice_choice1 노드를 수용할 수 있습니다. 오류 아이콘은 Choice_choice1 노드에 다음에 추가하는 하위 노드가 필요함을 나타냅니다.

  4. 라우팅 서랍에서 When ( When icon ) 패턴을 클릭한 다음 캔버스에서 Choice_choice1 노드를 클릭합니다.

    Choice_choice1 컨테이너는 When_when1 노드를 수용하도록 확장됩니다.

    tutCBRaddWhen1

    warning icon When_when1 노드를 데코레이션하면 하나 이상의 필수 속성 값을 설정해야 함을 나타냅니다.

    참고

    툴링을 사용하면 경로 컨테이너의 잘못된 드롭 지점에 패턴을 추가할 수 없습니다.

  5. 캔버스에서 When_when1 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.

    tutCBRWhen1OpenProps
  6. 표현식 필드에서 drop-down menu icon 버튼을 클릭하여 사용 가능한 옵션 목록을 엽니다.
  7. 테스트 메시지가 XML로 작성되므로 xpath ( XML 쿼리 언어의 경우)를 선택합니다.

    참고

    Expression 언어를 선택하면 속성 보기에 식 필드 바로 아래에 들여쓰기된 목록에 해당 속성이 표시됩니다. 이 들여쓰기된 목록의 Id 속성은 표현식의 ID를 설정합니다. Description 필드에 있는 Id 속성은 When 노드의 ID를 설정합니다.

  8. 들여쓰기된 표현식 필드에 /order/orderline/quantity/text() > 10을 입력합니다.

    이 표현식은 quantity 필드의 값이 10보다 큰 메시지만 경로에서 이 경로를 이동하도록 지정합니다(InvalidOrders 폴더).

  9. 나머지 속성을 각각 그대로 둡니다.

    참고

    Trim 옵션(기본적으로 사용)은 메시지에서 선행 또는 후행 공백 및 줄 바꿈을 제거합니다.

    tutCBRWhen1Props
  10. 라우팅 컨텍스트 파일을 저장합니다.
  11. 소스 탭을 클릭하여 경로에 대한 XML을 확인합니다.

    tutCBRaddedSourceV

5.4. 로깅 추가 및 구성

ZooOrder 애플리케이션 예제의 경우 경로를 통과할 때 XML 메시지를 추적할 수 있도록 로그 메시지를 추가합니다. 경로를 실행하면 콘솔 보기에 로그 메시지가 표시됩니다.

다음 단계에 따라 CBR 경로에 로깅을 추가합니다.

  1. 디자인 탭에서 구성 요소 서랍을 열고 로그 구성 요소 ( Log icon )를 클릭합니다.
  2. 캔버스에서 When_when1 노드를 클릭합니다.

    When_when1 컨테이너가 확장되어 Log_log1 노드를 수용합니다.

    tutCBRlog1Added
  3. 캔버스에서 Log_log1 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.
  4. 메시지 필드에 입력: 요청된 수량이 허용되는 최대 허용 수를 초과하여 고객에게 문의합니다.

    tutCBRlog1Properties

나머지 속성은 그대로 둡니다.

+

참고

툴링은 로그 노드 id 값을 자동으로 생성합니다. Fuse 통합 화면의 메시지 보기에서 툴링은 경로에서 추적이 활성화된 경우 메시지 인스턴스에 대한 추적 노드 ID 열에 로그 노드의 Id 필드의 내용을 삽입합니다( 8장. 경로를 통해 메시지 추적 튜토리얼 참조). 콘솔에서 경로가 실행될 때마다 로그 노드의 Message 필드의 내용을 로그 데이터에 추가합니다.

  1. 라우팅 컨텍스트 파일을 저장합니다.

5.5. 메시지 헤더 추가 및 구성

메시지 헤더에는 메시지를 처리하는 정보가 포함됩니다.

메시지 헤더를 추가하고 구성하려면 다음을 수행합니다.

  1. Cryo stat drawer를 열고 Set Header ( Set Header icon ) 패턴을 클릭합니다.
  2. 캔버스에서 Log_log1 노드를 클릭합니다.

    When_when1 컨테이너가 확장되어 SetHeader_setHeader1 노드를 수용합니다.

    tutSetHead1Added
  3. 캔버스에서 SetHeader_setHeader1 노드를 선택하여 속성 뷰에서 속성을 엽니다.On the canvas, select the SetHeader_setHeader1 node to open its properties in the Properties view:

    tutSetHeadPropEdNew
  4. 표현식 필드에서 drop-down menu icon 버튼을 클릭하여 사용 가능한 언어 목록을 연 다음 상수 를 선택합니다.
  5. 들여쓰기된 표현식 필드에 Invalid 를 입력합니다.
  6. 헤더 이름 필드에 대상 을 입력합니다.
  7. 나머지 속성은 그대로 둡니다.

    tutSetHead1Properties2
  8. lets 에서 구성 요소 서랍을 열고 파일 ( File icon ) 구성 요소를 클릭합니다.
  9. 캔버스에서 SetHeader_setHeader1 노드를 클릭합니다.

    When_when1 컨테이너가 확장되어 To_to1 노드를 수용할 수 있습니다.

    tutCBRWhen1TargetFile
  10. 캔버스에서 To_to1 노드를 선택하여 속성 뷰에서 속성을 엽니다.On the canvas, select the To_to1 node to open its properties in the Properties view:

    tutCBRNewTargetFileProps1
  11. 세부 정보 탭에서 directoryNameUri 필드에 target/messages/invalidOrders 로 바꾸고 Id 필드에 _Invalid 를 입력합니다.

    tutCBRNewTargetFileProps2
  12. 라우팅 컨텍스트 파일을 저장합니다.
  13. 소스 탭을 클릭하여 경로에 대한 XML을 확인합니다.

    tutCBRLogHeaderSourceV

5.6. 유효한 주문을 처리하도록 분기 추가 및 구성

지금까지 CBR은 유효하지 않은 주문이 포함된 메시지를 처리합니다(량 값이 10보다 큰 순서).

유효한 주문(즉, When_when1 노드에 설정된 Cryostat 표현식과 일치하지 않는 모든 XML 메시지)을 처리하도록 경로의 다른 분기를 추가하고 구성하려면 다음을 수행합니다.

  1. selet 에서 Routing drawer를 열고 otherwise ( Otherwise icon ) 패턴을 클릭합니다.
  2. 캔버스에서 Choice_choice1 컨테이너를 클릭합니다.

    tutCBRaddOtherwise

    Choice_choice1 컨테이너가 확장되어 otherwise_otherwise1 노드를 수용할 수 있습니다.

  3. 캔버스에서 otherwise_otherwise1 노드를 선택하여 속성 보기에서 속성을 엽니다.
  4. Id 필드에서 _otherwise1_elseValid:로 변경합니다.

    tutCBROtherwiseProps

다른 분기에 대한 로깅을 구성하려면 다음을 수행합니다.

  1. lets 에서 구성 요소 서랍을 열고 로그 ( Log icon ) 구성 요소를 클릭합니다.
  2. 캔버스에서 otherwise _elseValid 노드를 클릭합니다.

    otherwise -elseValid 컨테이너는 Log_log2 노드를 수용하도록 확장됩니다.

    tutCBROtherwiseLogAdd
  3. 캔버스에서 Log_log2 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.
  4. Message 필드에 This is a valid order - OK to process를 입력합니다.

    tutCBROtherwiseLog2

    나머지 속성은 그대로 둡니다.

  5. 경로를 저장합니다.

otherwise 분기에 대한 메시지 헤더를 구성하려면 다음을 수행합니다.

  1. Person lets 에서 drawer 열고 Set Header 패턴을 클릭합니다.
  2. 캔버스에서 Log_log2 노드를 클릭합니다.

    Otherwise_elseValid 컨테이너는 SetHeader_setHeader2 노드를 수용하도록 확장됩니다.

    tutCBRSetHead2Add
    참고

    다이어그램이 혼잡될 때 컨테이너를 축소하여 공간을 확보할 수 있습니다. 이렇게 하려면 축소할 컨테이너를 선택한 다음 collapse icon 버튼을 클릭합니다.

    tutCBRcollapseWhen1Container

    컨테이너를 다시 열려면 컨테이너를 선택한 다음 expand icon 버튼을 클릭합니다.

    tutCBRexpandWhen1Container

    디자인 탭에서 컨테이너를 분리하고 확장해도 라우팅 컨텍스트 파일에 영향을 미치지 않습니다. 변경되지 않은 상태로 유지됩니다.

  3. 캔버스에서 SetHeader_setHeader2 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.
  4. 표현식 필드에서 drop-down menu icon 버튼을 클릭하여 사용 가능한 언어 목록을 열고 상수 를 선택합니다.
  5. 들여쓰기된 표현식 필드에 ReadyForDispatcher 를 입력합니다.
  6. 헤더 이름 필드에 대상 을 입력합니다.
  7. 나머지 속성은 그대로 둡니다.

    tutCBROtherwiseSetHeadProps2

유효한 메시지의 대상 폴더를 지정하려면 다음을 수행합니다.

  1. lets 에서 구성 요소 서랍을 열고 파일 ( File icon ) 구성 요소를 선택합니다.
  2. 캔버스에서 SetHeader_setHeader2 노드를 클릭합니다.

    Otherwise_elseValid 컨테이너는 To_to1 노드를 수용하도록 확장됩니다.

    tutCBROtherwiseFileAdd
  3. 캔버스에서 To_to1 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.
  4. URI 필드에서 directoryNametarget/messages/validOrders 로 바꾸고 Id 필드에 _Valid 를 입력합니다.

    tutCBROtherwiseTargFile2
  5. 라우팅 컨텍스트 파일을 저장합니다.

    완료된 콘텐츠 기반 라우터는 다음과 같아야 합니다.

    tutCBRfinalDesignV
  6. 캔버스 왼쪽 하단에서 소스 탭을 클릭하여 경로에 대한 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">
                <from id="_from1" uri="file:src/data?noop=true"/>
                <choice id="_choice1">
                    <when id="_when1">
                        <xpath>/order/orderline/quantity/text() &gt; 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="_Valid" uri="file:target/messages/validOrders"/>
                    </otherwise>
                </choice>
            </route>
        </camelContext>
    </blueprint>
    Copy to Clipboard Toggle word wrap

5.7. CBR 확인

“경로 실행” 튜토리얼에 설명된 대로 새 경로를 실행하고 콘솔 보기를 확인하여 로그 메시지를 확인할 수 있습니다.

이를 실행한 후 경로가 올바르게 실행되었는지 확인하려면 Project Explorer 에서 대상 폴더를 확인합니다.

  1. ZooOrderApp 을 선택합니다.
  2. 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 연 다음 새로 고침을 선택합니다.
  3. 프로젝트 루트 노드(ZooOrderApp)에서 target/messages/ 폴더를 찾아 확장합니다.

    메시지 대상
  4. target/messages/invalidOrders 폴더에 message1.xmlmessage3.xml 이 포함되어 있는지 확인합니다.

    이러한 메시지에서 quantity 요소의 값은 10을 초과합니다.

  5. target/messages/validOrders 폴더에 유효한 주문이 포함된 4개의 메시지 파일이 포함되어 있는지 확인합니다.

    • message2.xml
    • message4.xml
    • message5.xml
    • message6.xml

      이러한 메시지에서 quantity 요소의 값은 10보다 작거나 같습니다.

      참고

      메시지 콘텐츠를 보려면 각 메시지를 두 번 클릭하여 경로 편집기의 XML 편집기에서 엽니다.

5.8. 다음 단계

다음 튜토리얼에서는 6장. 라우팅 컨텍스트에 다른 경로 추가 에서 유효한 주문 메시지를 추가로 처리하는 두 번째 경로를 추가합니다.

6장. 라우팅 컨텍스트에 다른 경로 추가

이 튜토리얼에서는 ZooOrderApp 프로젝트의 블루프린트.xml 파일에서 camel 컨텍스트에 두 번째 경로를 추가하는 방법을 보여줍니다. 두 번째 경로:

  • 첫 번째 경로의 기타 분기의 터미널 끝에서 메시지(유효한 주문)를 가져옵니다.
  • 고객 국가에 따라 유효한 메시지를 정렬합니다.
  • 각 메시지를 ZooOrderApp/target/messages 폴더의 해당 국가 폴더에 보냅니다. 예를 들어, 시카고 Zoo의 주문은 미국 폴더에 복사됩니다.

6.1. 목표

이 튜토리얼에서는 다음 작업을 완료합니다.

  • 두 번째 경로로 직접 연결하기 위해 기존 경로 재구성
  • Camel 컨텍스트에 두 번째 경로 추가
  • 첫 번째 경로의 기타 분기에서 메시지를 직접 가져오도록 두 번째 경로를 구성합니다.
  • 두 번째 경로에 콘텐츠 기반 라우터 추가
  • 두 번째 경로의 콘텐츠 기반 라우터의 각 출력 분기에 메시지 헤더, 로깅 및 대상 대상을 추가하고 구성합니다.

6.2. 사전 요구 사항

이 튜토리얼을 시작하려면 다음 중 하나에서 생성된 ZooOrderApp 프로젝트가 필요합니다.

6.3. 기존 경로의 끝점 재구성

기존 경로는 모든 유효한 주문을 target/messages/validOrders 폴더에 보냅니다.

이 섹션에서는 기존 경로의 엔드포인트를 다시 구성하여 대신 두 번째 경로(다음 섹션에서 생성하는)에 연결합니다.

두 번째 경로와 직접 연결하기 위해 기존 경로를 구성하려면 다음을 수행합니다.

  1. 경로 편집기에서 ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml 을 엽니다.
  2. 캔버스에서 Route_route1 컨테이너를 선택하여 속성 보기에서 해당 속성을 엽니다.
  3. 아래로 스크롤하여 Route 속성으로 이동한 다음 기본값 을 선택합니다.
  4. 캔버스에서 터미널 파일 노드 To_Valid 를 선택하여 속성 보기에 해당 속성을 표시합니다.
  5. Uri 필드에 기존 텍스트를 삭제한 다음 direct:OrderFulfillment 를 입력합니다.
  6. Id 필드에 _Fulfill 을 입력합니다.
참고

기존 To_Valid 터미널 파일 노드를 교체하는 대신 ComponentsDirect 구성 요소로 교체하여 용도 변경된 To_Valid 노드와 동일한 속성 값으로 구성할 수 있습니다.

직접 구성 요소에 대한 자세한 내용은 Apache Camel 구성 요소 참조를 참조하십시오.

6.4. 두 번째 경로 추가

라우팅 컨텍스트에 다른 경로를 추가하려면 다음을 수행합니다.

  1. Personlets 에서 라우팅 서랍을 열고 경로 ( Route icon ) 패턴을 클릭합니다.
  2. 캔버스에서 Route_route1 컨테이너의 오른쪽을 클릭합니다.

    tutRte2DropOnCanvas

    경로 패턴은 캔버스의 Route_route2 컨테이너 노드가 됩니다.

  3. Route_route2 컨테이너 노드를 클릭하여 속성 보기에 해당 속성을 표시합니다. 속성을 그대로 둡니다.
  4. 파일을 저장합니다.
참고

라우팅 컨텍스트가 복잡성이 증가함에 따라 작업하는 동안 경로 편집기에 개별 경로에 중점을 둘 수 있습니다. 이렇게 하려면 Project Explorer 에서 경로 편집기가 캔버스에 표시할 경로를 두 번 클릭합니다(예: Route_route2 ).

tutProjExSwitchRtesOnCanvas

캔버스의 라우팅 컨텍스트의 모든 경로를 표시하려면 Camel 컨텍스트 폴더 상단에 있는 프로젝트의 .xml 컨텍스트 파일 항목(src/main/resources/OSGI-INF/…​)을 두 번 클릭합니다.

6.5. 미국 주문을 처리하기 위해 선택 분기 구성

이 섹션에서는 경로에 선택 분기를 추가하고 미국 주문을 새 target/messages/validOrders/USA 폴더에 전송하도록 경로를 구성합니다. 메시지 헤더 및 로그 파일 구성 요소도 설정합니다.

  1. selet 에서 구성 요소 서랍을 열고 직접 구성 요소( Direct icon )를 선택합니다.
  2. 캔버스에서 Route_route2 컨테이너를 클릭합니다.

    Route_route2 컨테이너는 직접 구성 요소( From_from2 노드)를 수용하도록 확장됩니다.

    tutCBRrte2From2Add
  3. 캔버스에서 From_from2 노드를 클릭하여 속성 보기에서 속성을 엽니다.
  4. Uri 필드에서 name ( 직접:)을 OrderFulfillment 로 바꾸고 Id 필드에 _direct:OrderFulfillment 를 입력합니다.

    tutCBRrte2From2Props
  5. selet 에서 Routing drawer를 열고 선택 ( Choice icon ) 패턴을 선택합니다.
  6. 캔버스에서 From _direct:OrderFulfillment 노드를 클릭합니다.

    Route_route2 컨테이너가 확장되어 Choice_choice2 노드를 수용합니다.

    tutCBRrte2Choice2Added

    속성 보기에서 Choice_choice2 노드의 속성을 그대로 둡니다.

  7. selet에서 Routing drawer를 열고 When ( When icon ) 패턴을 선택합니다.
  8. 캔버스에서 Choice_choice2 노드를 클릭합니다.

    Choice_choice2 컨테이너는 When_when2 노드를 수용하도록 확장됩니다.

    tutCBRrte2When2Added
  9. 캔버스에서 When_when2 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.
  10. 다음과 같이 When_when2 노드의 속성을 설정합니다.

    • Expression 드롭다운 목록에서 xpath 를 선택합니다.
    • 들여쓰기된 표현식 필드에 /order/customer/country = 'USA' 를 입력합니다.
    • Trim 을 활성화한 상태로 둡니다.
    • 두 번째 Id 필드에 _when/usa를 입력합니다.

      tutCBRrte2WhenUSAprops
  11. selet 에서 Components drawer를 열고 파일 구성 요소( File icon )를 선택합니다.
  12. 캔버스에서 When_when/usa 컨테이너를 클릭합니다.

    When_when/usa 컨테이너가 확장되어 To_to1 노드를 수용할 수 있습니다.

  13. 속성 보기에서 다음을 수행합니다.

    tutRte2EndptUSA
    • Uri 필드에서 directoryNametarget/messages/validOrders/USA 로 바꿉니다.
    • Id 필드에 _US 를 입력합니다.
  14. 파일을 저장합니다.

메시지 헤더를 설정하고 로그 구성 요소를 추가하려면 다음을 수행합니다.

  1. Person lets 에서 drawer 열고 Set Header 패턴을 선택합니다.
  2. 캔버스에서 When_when/usa 노드를 클릭합니다.

    When_when/usa 컨테이너가 확장되어 SetHeader_setHeader3 노드를 수용합니다.

    tutCBRrte2SetHeadUSAadd
  3. 캔버스에서 SetHeader_setHeader3 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.
  4. 다음과 같이 노드의 속성을 설정합니다.

    • Expression 드롭다운 메뉴에서 상수 를 선택합니다.
    • 들여쓰기된 표현식 필드에 다음과 같이 입력합니다. USA
    • Trim 을 활성화한 상태로 둡니다.
    • 헤더 이름 필드에: 대상을 입력합니다.
    • 두 번째 Id 필드에 _setHead_usa를 입력합니다.

      tutCRErte2SetHeadusaProps
  5. selet 에서 Components drawer를 열고 로그 구성 요소( Log icon )를 선택합니다.
  6. 캔버스에서 SetHeader 노드를 클릭합니다.

    When_when/usa 컨테이너가 확장되어 Log_log3 노드를 수용합니다.

    tutCBRrte2Log3Added
  7. 캔버스에서 Log_log3 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.

    tutCBRrteLog3Props
  8. 속성 보기에서 다음을 수행합니다.

    • Message 필드에 Valid order - 미국 고객에게 LUN을 제공합니다.
    • Id 필드에 _usa 를 입력합니다.
    • 로깅 수준을 그대로 둡니다.

      tutCBRrte2Log3usaAdded
  9. 파일을 저장합니다.

    Route_route2 의 미국 분기는 다음과 같아야 합니다.

    tutUSAbranchRte2

6.6. 독일 주문을 처리하기 위해 otherwise 분기 구성

캔버스에 Route_route2 가 표시되는 경우:

  1. selet 에서 Routing drawer를 열고 otherwise 패턴( Otherwise icon )을 선택합니다.
  2. 캔버스에서 Choice_choice2 컨테이너를 클릭합니다.

    Choice_choice2 컨테이너는 otherwise_otherwise1 노드를 수용하도록 확장됩니다.

    tutCBRrte2WhenGERAdd
  3. otherwise_otherwise1 노드를 선택하여 Properties 보기에서 속성을 엽니다.
  4. 속성 보기에서 Id 필드에 _else/ger 를 입력합니다.
  5. selet 에서 drawer를 열고 Set Header 패턴( Set Header icon )을 선택합니다.
  6. 캔버스에서 otherwise _else/ger 노드를 클릭합니다.

    Otherwise_else/ger 컨테이너는 확장되어 SetHeader_setHeader3 노드를 수용합니다.

    tutCBRrte2SetHeadGERAdd
  7. 캔버스에서 SetHeader_setHeader3 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.
  8. 속성 보기에서 다음을 수행합니다.

    • Expression 드롭다운 목록에서 상수 를 선택합니다.
    • 두 번째 표현식 필드에 Germany 을 입력합니다.
    • 트리밍 을 그대로 둡니다.
    • 헤더 이름 필드에 대상 을 입력합니다.
    • 두 번째 Id 필드에 _setHead_ger 를 입력합니다.
  9. selet 에서 Components drawer를 열고 로그 패턴( Log icon )을 선택합니다.
  10. 캔버스에서 SetHeader_setHead_ger 노드 아래를 클릭합니다.

    Otherwise_else/ger 컨테이너는 Log_log3 노드를 수용하도록 확장됩니다. 필요한 경우 Log_log3 노드에서 SetHeader_setHead_ger 노드로 커넥터 오류를 드래그합니다.

    tutCBRrte2LogGERAdd
  11. 캔버스에서 Log_log3 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.
  12. 속성 보기에서 다음을 수행합니다.

    • Message 필드에 Valid order - 발송물 독일 고객에게 있습니다.
    • Id 필드에 _ger 를 입력합니다.
    • 로깅 수준을 그대로 둡니다.
  13. 구성 요소 서랍에서 파일 패턴( File icon )을 선택한 다음 Log_ger 노드 아래에서 클릭합니다.

    Otherwise_else/ger 컨테이너는 확장되어 To_to1 노드를 수용할 수 있습니다. 필요한 경우 SetHeader_setHead_ger 노드에서 To_to1 노드로 커넥터 오류를 드래그합니다.

    tutCBRrte2GERtermFile
  14. 캔버스에서 To_to1 노드를 선택하여 속성 보기에서 해당 속성을 엽니다.
  15. 속성 보기에서 다음을 수행합니다.

    • Uri 필드에서 directoryNametarget/messages/validOrders/Germany로 바꿉니다.
    • Id 필드에 _GER 를 입력합니다.
  16. 파일을 저장합니다.

Route_route2 의 독일 분기는 다음과 같아야 합니다.

tutGERbranchRte2

6.7. 두 번째 경로 확인

캔버스의 경로는 다음과 같아야 합니다.

완료된 route1

ZooOrderApp 라우팅 컨텍스트에서 첫 번째 경로 완료

완료된 route2

ZooOrderApp 라우팅 컨텍스트에서 두 번째 경로 완료

캔버스 하단의 소스 탭에서 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() &gt; 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>
Copy to Clipboard Toggle word wrap
중요

툴링에서 두 번째 경로 요소( <routeid="route2"> )에 shutdownRoute=" " 속성을 추가한 경우 해당 속성을 삭제합니다. 그렇지 않으면 ZooOrderApp 프로젝트가 실행되지 않을 수 있습니다.

업데이트된 프로젝트가 예상대로 작동하는지 확인하려면 다음 단계를 따르십시오.

  1. ZooOrderApp/Camel Contexts/blueprint.xml 을 로컬 Camel Context(테스트 제외)로 실행합니다.
  2. 콘솔 출력의 끝을 확인합니다. 다음 행이 표시됩니다.

    tutCBRrte2Console
  3. 대상 대상 폴더를 확인하여 경로가 올바르게 실행되었는지 확인합니다.

    1. Project Explorer 에서 ZooOrderApp 을 마우스 오른쪽 버튼으로 클릭한 다음 새로 고침을 선택합니다.
    2. target/messages/ 폴더를 확장합니다.

      다음과 같이 message*.xml 파일은 대상에 분산되어야 합니다.

      그림 6.1. Project Explorer의 대상 메시지 대상

      메시지 대상

6.8. 다음 단계

다음 튜토리얼에서 7장. 라우팅 컨텍스트 디버깅 에서는 Fuse Tooling 디버거를 사용하는 방법을 알아봅니다.

7장. 라우팅 컨텍스트 디버깅

이 튜토리얼에서는 Camel 디버거를 사용하여 로컬에서 실행 중인 라우팅 컨텍스트에 대한 논리 오류를 찾는 방법을 보여줍니다.

7.1. 목표

이 튜토리얼에서는 다음 작업을 완료합니다.

  • 두 경로에 관심 있는 노드에 있는 Cryostat를 설정합니다.
  • 디버그 관점에서 경로를 살펴보고 메시지 변수 값을 검사합니다.
  • 경로를 다시 진행하여 메시지 변수의 값을 변경하고 효과를 관찰합니다.

7.2. 사전 요구 사항

이 튜토리얼을 시작하려면 다음 중 하나에서 생성된 ZooOrderApp 프로젝트가 필요합니다.

7.3. Cryostat 설정

Debugger에서는 조건적 및 무조건적 Cryostat를 둘 다 설정할 수 있습니다. 이 튜토리얼에서는 unconditional Cryostat만 설정합니다. 디버깅 세션 중에 특정 조건이 충족될 때 트리거되는 조건부 Cryostat를 설정하는 방법을 알아보려면 도구 사용자 가이드를 참조하십시오.

unconditional Cryostats를 설정하려면 다음을 수행합니다.

  1. 필요한 경우 경로 편집기에서 ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml 을 엽니다.
  2. Project Explorer 에서 Camel Contextssrc/main/resources/OSGI-INF/blueprint/blueprint.xml 을 확장하여 두 경로 항목을 모두 노출합니다.
  3. Design 탭에서 Route_route1 항목을 두 번 클릭하여 Route_route1 로 전환합니다.
  4. 캔버스에서 Choice_choice1 노드를 선택한 다음 red icon 아이콘을 클릭하여 조건 없는 Cryostat를 설정합니다.

    BPnodeIcons
    정방향 nav
    BPnodeIcons2
    참고

    경로 편집기에서 노드의 gray icon 아이콘 또는 delete icon 아이콘을 각각 클릭하여 특정 Cryostat를 비활성화하거나 삭제할 수 있습니다. 캔버스를 마우스 오른쪽 버튼으로 클릭하고 모든 Cryostat 삭제를 선택하여 모든 set Cryostat를 삭제할 수 있습니다.

  5. 다음 Route_Route1 노드에서 unconditional Cryostats를 설정합니다.

    • Log_log1
    • SetHeader_setHeader1
    • To_Invalid
    • Log_log2
    • SetHeader_setHeader2
    • To_Fulfill
  6. Project Explorer 에서 src/main/resources/OSGI-INF/blueprint 아래의 Route_route2 를 두 번 클릭하여 캔버스에서 Route_route2 를 엽니다.
  7. 다음 Route_Route2 노드에서 unconditional Cryostats를 설정합니다.

    • Choice_choice2
    • SetHeader_setHead_usa
    • Log_usa
    • To_US
    • SetHeader_setHead_ger
    • Log_ger
    • To_GER

7.4. 라우팅 컨텍스트를 통해 처리

다음 두 가지 방법으로 라우팅 컨텍스트를 단계별로 수행할 수 있습니다.

  • step over ( Step Over icon ) - Cryostat와 관계없이 라우팅 컨텍스트에서 다음 실행 노드로 이동합니다.
  • resume( Resume icon ) - 라우팅 컨텍스트에서 다음 활성 Cryostat로 이동합니다.

    1. Project Explorer 에서 ZooOrderApp 프로젝트의 Camel Contexts 폴더를 확장하여 블루프린트.xml 파일을 노출합니다.
    2. 블루프린트.xml 파일을 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 연 다음 Debug AsLocal Camel Context ( tests 제외) 를 클릭합니다.

      Camel 디버거는 발생하는 첫 번째 Cryostat에서 실행을 일시 중지하고 이제 디버그 화면을 열지 여부를 요청합니다.

      tutCnfrmPerspSwitch
    3. 예를 클릭합니다.

      참고

      아니요 를 클릭하면 확인 창이 여러 번 표시됩니다. 세 번째 거부 후 사라집니다. Camel 디버거는 실행을 다시 시작합니다. 이 시점에서 디버거와 상호 작용하려면 관점 열기 → 디버그를 클릭하여 디버그 관점을 열어야 합니다.

      디버그 보기에 표시된 것처럼 _ route1 [blueprint.xml]에서 _choice1 에서 일시 중지된 라우팅 컨텍스트로 디버그 모드가 열립니다.

      tutDebugPerspOpen1
      참고

      Cryostat는 디버거가 자동으로 다시 시작되기까지 최대 5분 동안 유지되며, 다음 Cryostat로 이동하거나, 라우팅 컨텍스트의 끝까지 어느 쪽이오면 됩니다.

    4. 변수 보기에서 노드를 확장하여 각 노드에 사용 가능한 변수와 값을 노출합니다.

      라우팅 컨텍스트를 단계별로 살펴보면 마지막 Cryostat 이후 값이 변경된 변수는 노란색으로 강조 표시됩니다. 각 Cryostat에서 노드를 확장하여 변경된 변수를 공개해야 할 수 있습니다.

    5. Resume icon 을 클릭하여 다음 Cryostat로 이동합니다 . _route1 [blueprint.xml]:

      tutDBResumeLog2Rte1
    6. 변수 보기의 노드를 확장하여 Route1 [blueprintxt.xml]의 _choice1 의 마지막 Cryostat 이후 변경된 변수를 검사합니다.
    7. Resume icon 을 클릭하여 Route1 [blueprint.xml]의 다음 Cryostat, _setHeader2 로 이동합니다.

      Route1 [blueprint.xml]의 _log2에 있는 _log2에서 변경된 변수(하위로 강조 표시)를 검사합니다.

    8. 디버그 보기에서 _route1 [blueprint.xml]에서 _log2 를 클릭하여 빠른 비교를 위해 _ route1 [blueprint.xml]의 Cryostat _log2 의 변수 값으로 변수 뷰를 채웁니다.

      디버그 보기에서 동일한 메시지 흐름 내의 Cryostat를 전환하여 변수 보기에서 변경 변수 값을 빠르게 비교 및 모니터링할 수 있습니다.

      참고

      메시지 흐름은 길이에 따라 다를 수 있습니다. Route_route1InvalidOrders 분기를 전송하는 메시지의 경우 메시지 흐름이 짧습니다. Route_route1ValidOrders 분기를 전송하는 메시지의 경우 Route_route2 로 계속되는 메시지 흐름은 더 길 수 있습니다.

    9. 라우팅 컨텍스트를 계속 진행합니다. 하나의 메시지가 라우팅 컨텍스트를 완료하고 다음 메시지를 입력하면 새 이동 경로 ID가 태그된 디버그 뷰에 새 메시지 흐름이 표시됩니다.

      tutDBviewNextMsg

      이 경우 ID-janemurpheysmbp-home-55846-1471374645179-0-3 은 라우팅 컨텍스트를 입력한 message2.xml 에 해당하는 두 번째 메시지 흐름을 식별합니다. 이동 경로 ID는 2로 증가합니다.

      참고

      교환 및 메시지 ID는 동일하며 라우팅 컨텍스트를 통해 메시지 통과 동안 변경되지 않은 상태로 유지됩니다. 해당 ID는 메시지 흐름의 이동 경로 ID에서 구성되며 1씩 증가합니다. 따라서 message2.xml 의 경우 해당 ExchangeIdMessageIdID-janemurpheysmbp-home-55846-1471374645179-0-4 입니다.

    10. message3.xml 이 _ route_route1 [blueprint.xml]에 Cryostat _choice1 을 입력하면 Processor 변수를 검사합니다. 표시된 값은 message1.xmlmessage2.xml 에 누적된 메트릭으로, 이전에 라우팅 컨텍스트를 전송했습니다.

      tutMsg3Choice1Stats

      타이밍 메트릭은 밀리초 단위입니다.

    11. 라우팅 컨텍스트를 통해 각 메시지를 계속 진행하여 각 처리 단계에서 변수 및 콘솔 출력을 검사합니다. message6.xmlRoute2 [blueprint.xml]에 Cryostat To_GER 를 입력하면 디버거가 이동 경로 스레드를 종료하기 시작합니다.
    12. 메뉴 모음에서 Terminate icon 를 클릭하여 Camel 디버거를 종료합니다. 콘솔은 종료되지만 출력을 수동으로 지워야 합니다.

      참고

      디버그 보기에서 Camel Context 노드에서 선택한 스레드 또는 끝점을 사용하면 먼저 Terminate icon 를 두 번 클릭하여 스레드 또는 끝점을 종료하고 두 번째는 Camel 컨텍스트를 종료하여 세션을 종료해야 합니다.

    13. 메뉴 모음에서 tutDebugPersp 를 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 연 다음 닫기 를 선택하여 디버그 화면을 닫습니다.

      CodeReady Studio는 Camel 디버거를 시작한 관점으로 자동으로 돌아갑니다.

    14. Project Explorer 에서 프로젝트를 마우스 오른쪽 버튼으로 클릭한 다음 새로 고침을 선택하여 디스플레이를 새로 고칩니다.

      참고

      세션을 조기에 종료한 경우 모든 메시지가 라우팅 컨텍스트를 전송하기 전에 다음과 같은 메시지인 message3.xml.camelLock 에서 ZooOrderApp/src/data 폴더에서 볼 수 있습니다. 프로젝트에서 디버거를 다시 실행하기 전에 제거해야 합니다. 이렇게 하려면 .camelLock 메시지를 두 번 클릭하여 컨텍스트 메뉴를 연 다음 삭제 를 선택합니다. 메시지가 표시되면 OK 를 클릭하여 삭제를 확인합니다.

    15. ZooOrderApp/target/messages/ 디렉터리를 확장하여 메시지가 예상 대상으로 전달되었는지 확인합니다.

      tutDualCBRrteVerify

모든 Cryostat가 설정되고 활성화된 라우팅 컨텍스트를 그대로 둡니다.

7.5. 변수 값 변경

이 섹션에서는 감시 목록에 변수를 추가하여 메시지가 라우팅 컨텍스트를 통과할 때 값이 어떻게 변경되는지 쉽게 확인할 수 있습니다. 메시지 본문에서 변수 값을 변경한 다음 변경 사항이 라우팅 컨텍스트를 통해 메시지 경로에 미치는 영향을 관찰합니다.

  1. ZooOrderApp 프로젝트에서 Camel 디버거를 다시 실행하려면 블루프린트.xml 파일을 마우스 오른쪽 버튼으로 클릭한 다음 Debug AsLocal Camel Context (Test 제외) 를 클릭합니다.
  2. message1 이 첫 번째 Cryostat에서 중지되었으므로 _route1 [blueprint.xml]의 _choice 1 변수를 감시 목록에 NodeIdRouteId ( Exchange 카테고리의) 및 Message BodyCamelFileName 을 추가합니다.

    4개의 변수 각각에 대해 다음을 수행합니다.

    1. 변수 보기에서 적절한 카테고리를 확장하여 대상 변수를 노출합니다.
    2. 변수를 마우스 오른쪽 버튼으로 클릭하여(이 경우 교환 카테고리에서 NodeId ) 컨텍스트 메뉴를 열고 Watch:을 선택합니다.

      FTVarNodeIDWatch

      조사하도록 선택한 변수가 나열되는 표현식 탭이 열립니다.

      FTWatchM1NodeId
      참고

      감시 목록을 생성하면 관심 있는 여러 변수의 현재 값을 빠르게 확인할 수 있습니다.

  3. _ route1 [blueprint.xml]에 있는 _Fulfill에 도달할 때까지 라우팅 컨텍스트를 통한 step message1 .
  4. 변수 보기에서 메시지 범주를 확장합니다.
  5. 조사 목록에 변수 Destination 을 추가합니다.

    이제 Expressions 뷰에 다음 변수가 포함되어야 합니다.

    FTWatchM1R1toFfil
    참고
    • 변수 목록 아래의 창에는 선택한 변수의 값이 표시됩니다.
    • Expressions 뷰에는 명시적으로 제거할 때까지 목록에 추가한 모든 변수가 유지됩니다.
  6. 나머지 라우팅 컨텍스트를 통해 message1 단계를 수행한 다음 message2 를 모두 통과합니다.
  7. _ route1 [blueprint.xml]의 _choice1에서 message3 을 중지합니다.
  8. 변수 보기에서 Message 카테고리를 확장하여 MessageBody 변수를 노출합니다.
  9. MessageBody 를 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 열고 값 변경:을 선택합니다.

    tutVarChngMenuMsg2
  10. 수량 값을 15 에서 10 으로 변경합니다 (잘못된 주문에서 유효한 주문으로 변경하십시오).

    tutChgVarsMsg2

    이렇게 하면 메모리 내 값만 변경됩니다( message3.xml 파일을 편집하지 않음).

  11. OK를 클릭합니다.
  12. 표현식 보기로 전환하고 MessageBody 변수를 선택합니다.

    변수 목록 아래의 창에는 message3 의 전체 본문이 표시되어 현재 주문 항목 값을 쉽게 확인할 수 있습니다.

    FTWatchM2R1toFfilVarChng
  13. Resume icon 을 클릭하여 다음 Cryostat로 이동합니다.

    To_Invalid 로 이어지는 분기를 따르는 대신message3 은 이제To_FulfillRoute_route2 로 이어지는 분기를 따릅니다.

7.6. Camel 디버거의 초점 축소

일시적으로 좁은 다음 디버거를 비활성화 및 다시 활성화하여 디버거의 초점을 다시 노출할 수 있습니다.

  1. 라우팅 컨텍스트를 통해 메시지4 단계, 디버그 보기, 변수 보기 및 콘솔 출력을 각 단계에서 확인합니다.
  2. _ route1 [blueprint.xml]의 _choice1에서 message4 를 중지합니다.
  3. Breakpoints 뷰로 전환하고 아래에 나열된 Cryostat 옆에 있는 각 확인란의 선택을 해제합니다. _choice1. Cryostat의 확인란을 지우면 임시로 비활성화됩니다.

    tutBreakptsDisabled
  4. Resume icon 을 클릭하여 다음 Cryostat로 이동합니다.

    tutMsg3toFulfillRte1

    디버거는 비활성화된 Cryostat를 건너뛰고 _route1 [blueprint.xml] 에서 _FulFill 로 이동합니다.

  5. Resume icon 를 다시 클릭하여 다음 Cryostat로 이동합니다.

    tutMsg3toUKRte2

    디버거는 _route2 [blueprint.xml]의 _GER 로 이동합니다.

  6. Resume icon 를 반복적으로 클릭하여 라우팅 컨텍스트를 통해 message5message6 을 빠르게 단계별로 수행합니다.
  7. Breakpoints 뷰로 전환한 다음 모든 Cryostat 옆에 있는 확인란을 선택하여 다시 활성화합니다.

7.7. 메시지 변수 값 변경의 영향 확인

디버거를 중지하고 'message1's quantity 변수의 값을 변경하는 결과를 확인하려면 다음을 수행하십시오.

  1. 툴 모음에서 Terminate icon 을 클릭하여 Camel 디버거를 종료합니다.

    tutDBTerminateNorm
  2. 콘솔의 Clear output icon 버튼을 클릭하여 출력을 지웁니다.
  3. 디버그 화면을 닫고 Camel 디버거를 시작한 관점으로 돌아갑니다.
  4. Project Explorer 에서 디스플레이를 새로 고칩니다.
  5. ZooOrderApp/target/messages/ 디렉토리를 확장하여 메시지가 예상대로 전달되었는지 확인합니다.

    tutPETargetDestsChngedVars

    message1invalidOrders 로 전송되었으며 message3.xml유효한Orders/Germany 폴더에 표시됩니다.

7.8. 다음 단계

8장. 경로를 통해 메시지 추적 튜토리얼에서는 라우팅 컨텍스트를 통해 메시지를 추적하여 라우팅 컨텍스트를 최적화하고 라우팅 컨텍스트의 성능을 미세 조정할 수 있는 위치를 결정합니다.

8장. 경로를 통해 메시지 추적

추적을 사용하면 한 노드에서 다른 노드로 라우팅되므로 메시지를 가로챌 수 있습니다. 라우팅 컨텍스트를 통해 메시지를 추적하여 라우팅 컨텍스트의 성능을 최적화하고 미세 조정할 수 있는 위치를 확인할 수 있습니다. 이 튜토리얼에서는 경로를 통해 메시지를 추적하는 방법을 보여줍니다.

8.1. 목표

이 튜토리얼에서는 다음 작업을 완료합니다.

  • Fuse 통합 관점에서 ZooOrderApp 실행
  • ZooOrderApp에서 추적 활성화
  • ZooOrderApp 에 메시지를 삭제하고 모든 경로 노드를 통해 추적

8.2. 사전 요구 사항

이 튜토리얼을 시작하려면 다음 중 하나에서 생성된 ZooOrderApp 프로젝트가 필요합니다.

8.3. Fuse 통합 화면 설정

메시지 추적을 용이하게하기 위해 작업 공간을 설정하려면 다음을 수행합니다.

  1. 툴 모음 오른쪽에 있는 Open Perspective icon 버튼을 클릭한 다음 목록에서 Fuse Integration 을 선택합니다.

    tutPerspListFIPselected

    Fuse Integration 모드가 기본 레이아웃에서 열립니다.

    TutFIP 63
  2. Cryo stat Navigator 탭을 터미널 탭의 맨 오른쪽으로 끌어 여기에 놓습니다.

    ftTutFIPrearrange

    이 정렬은 라우팅 컨텍스트의 노드를 그래픽으로 표시하는 데 더 많은 공간을 제공하므로 메시지가 라우팅 컨텍스트를 통과하는 경로를 시각적으로 추적할 수 있습니다.

    참고

    라우팅 컨텍스트 .xml 파일에 쉽게 액세스할 수 있도록, 특히 프로젝트가 여러 컨텍스트로 구성된 경우 툴링은 Project ExplorerCamel 컨텍스트 폴더 아래에 해당 컨텍스트를 나열합니다.

    또한 라우팅 컨텍스트의 모든 경로는 컨텍스트 파일 항목 아래에 직접 아이콘으로 표시됩니다. 캔버스의 라우팅 컨텍스트에서 단일 경로를 표시하려면 Project Explorer 에서 해당 아이콘을 두 번 클릭합니다. 라우팅 컨텍스트의 모든 경로를 표시하려면 컨텍스트 파일 항목을 두 번 클릭합니다.

    TutCamelContextsFolderPE

8.4. 메시지 추적 시작

ZooOrderApp 프로젝트에서 메시지 추적을 시작하려면 다음을 수행합니다.

  1. Project Explorer 에서 ZooOrderApp 프로젝트를 확장하여 src/main/resources/OSGI-INF/blueprint/blueprint.xml 을 노출합니다.
  2. src/main/resources/OSGI-INF/blueprint/blueprint.xml 을 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 엽니다.
  3. Run asLocal Camel Context(테스트 제외) 를 선택합니다.

    참고

    로컬 Camel 컨텍스트 를 선택하면 ZooOrderApp 프로젝트에 대한 JUnit 테스트를 아직 생성하지 않았기 때문에 툴링이 테스트 없이 실행 중으로 되돌아갑니다. 나중에 9장. JUnit을 사용하여 경로 테스트 에서 이 작업을 수행합니다.

  4. Cryo stat Navigator 에서 로컬 프로세스를 확장합니다.

    tutMsgTrJMXLocalProcessess
  5. maven [ID] 노드를 마우스 오른쪽 버튼으로 클릭한 다음 연결을 선택합니다.
  6. 경로의 요소를 확장합니다.

    tutMsgTrJMXLCCexpanded
  7. 경로 노드를 마우스 오른쪽 버튼으로 클릭한 다음 추적 시작을 선택합니다.

    tutTraceStart

    툴에는 Diagram View 에서 라우팅 컨텍스트의 그래픽 표현이 표시됩니다.

    tutDiagramNodes

    모든 메시지 흐름 경로를 명확하게 보려면 Diagram View 탭에 깔끔하게 맞게 노드를 드래그하여 노드를 다시 정렬해야 할 수 있습니다. Diagram View 탭이 확장될 수 있도록 Red Hat CodeReady Studio의 다른 보기 및 탭의 크기를 조정해야 할 수도 있습니다.

8.5. 실행 중인 ZooOrderApp 프로젝트에서 메시지 삭제

실행 중인 ZooOrderApp 프로젝트에 메시지를 삭제하려면 다음을 수행합니다.

  1. Project Explorer 에서 ZooOrderApp/src/data 를 확장하여 메시지 파일(message1.xml through message6.xml)에 액세스할 수 있습니다.

    tutMsgFiles
  2. Drag message1.xml 을 사용하여 _context1>Endpoints>file>file>src/data?noop=true 노드에 삭제합니다.

    tutJMXLocalCntxtExpanded

    메시지가 경로를 통과하면 툴링은 경로를 추적하여 각 단계에서 통과를 기록합니다.

8.6. 메시지 뷰 구성

메시지 추적을 표시하려면 메시지 뷰 를 새로 고쳐야 합니다. 또한 모든 메시지 추적에 걸쳐 메시지를 유지하려면 메시지 보기에서 열을 구성해야 합니다.

  1. 메시지 보기를 엽니다.
  2. 패널의 메뉴 표시줄 오른쪽에 있는 상단에 있는 refresh (새로 고침 버튼)를 클릭하여 뷰를 message1.xml 의 메시지 추적으로 채웁니다.
  3. 패널의 메뉴 모음에서 View Menu icon 아이콘을 클릭하고 열 구성을 선택하여 열 구성 마법사 엽니다.

    TutConfigColsDefaults
    참고

    라우팅 컨텍스트의 메시지에 대해 설정한 메시지 헤더인 Destination 이 목록에 표시됩니다.

    메시지 뷰에서 항목을 선택하거나 선택 해제하여 항목을 포함하거나 제외할 수 있습니다. 개별 항목을 강조 표시하고 목록에서 위로 이동하거나 아래로 이동하여 메시지 뷰에 표시되는 columnar 순서를 다시 정렬할 수 있습니다.

  4. 열 구성 마법사에서 다음과 같이 열을 선택하고 순서를 정렬합니다.In the Configure Columns wizard, select and order the columns this way:

    tutMsgVCnfgColsMnu

    이러한 열과 순서는 메시지 뷰에서 다시 변경할 때까지 유지됩니다.

참고

모든 툴링 테이블에서 columnar 레이아웃을 제어할 수 있습니다. 드래그 방법을 사용하여 임시로 테이블 형식을 다시 정렬합니다. 예를 들어 열의 테두리 규칙을 드래그하여 너비를 확장하거나 계약합니다. 열을 숨기려면 해당 경계를 완전히 계약합니다. 열 헤더를 드래그하여 테이블 내의 열을 재배치합니다. 구성을 유지하려면 대신 ViewConfigure Columns 방법을 사용해야 합니다.

8.7. 메시지 추적을 단계별로 처리

메시지 추적을 진행하려면 다음을 수행합니다.

  1. message2.xml 을 드래그하여 _context1>Endpoints>file>src/data?noop=true 노드에 놓습니다.
  2. 콘솔에서 메시지 보기로 전환합니다.
  3. 메시지 보기에서 refresh (새로 고침 버튼)을 클릭하여 뷰를 message2.xml 메시지 추적으로 채웁니다.

    에 메시지를 삭제할 때마다 messages View를 새로 고쳐 메시지 추적으로 채워야 합니다.

  4. 메시지 추적 중 하나를 클릭하여 속성 보기에서 이에 대한 자세한 정보를 확인합니다.

    tutTraceDetails2

    툴링은 속성 보기의 상단 절반에 메시지 추적(메시지 헤더 포함)에 대한 세부 정보와 속성 뷰의 하단 부분에 메시지 인스턴스의 내용을 표시합니다. 따라서 애플리케이션이 경로 내의 모든 단계에서 헤더를 설정하는 경우 메시지 세부 정보를 확인하여 예상대로 설정되었는지 확인할 수 있습니다.

    각 메시지를 강조 표시하여 메시지 인스턴스를 진행하여 특정 메시지가 경로를 통과하는 방법과 경로의 각 단계에서 예상대로 처리되었는지 확인할 수 있습니다.

  5. 다이어그램 보기를 열어 경로의 연결된 단계가 강조 표시되었는지 확인합니다.

    TutMsgTraceDiagNode

    툴링은 Diagram View 에서 경로를 가져오고 타이밍 및 성능 메트릭(밀리초)을 사용하여 처리 단계를 종료합니다. 다이어그램에는 총 메트릭 교환 만 표시됩니다.

  6. 표시된 메트릭 위에 마우스 포인터를 이동하여 메시지 흐름에 대한 추가 지표를 표시합니다.

    tutDVnodeMetrics
    • 메시지를 처리하는 데 걸리는 시간입니다.
    • 메시지를 처리하는 데 걸리는 최대 시간
    • 메시지를 처리하는 데 필요한 최소 시간
  7. 선택적으로, ZooOrderApp/src/data/ data/의 나머지 메시지를 _context1>Endpoints>file>src/data?noop=true 노드는 추적이 활성화된 상태로 유지되는 한 언제든지 삭제할 수 있습니다.

    이후 각 드롭다운에서 refresh (새로 고침 버튼)를 클릭하여 메시지 뷰를 새 메시지 추적으로 채워야 합니다.

  8. 완료되면 다음을 수행합니다.

    • Cryo stat Navigator 에서 _context1 을 마우스 오른쪽 버튼으로 클릭하고 추적 컨텍스트 중지를 선택합니다.
    • 콘솔 을 열고 패널 오른쪽 상단에 있는 Stop icon 버튼을 클릭하여 콘솔을 중지합니다. 그런 다음 Clear icon 버튼을 클릭하여 콘솔 출력을 지웁니다.

8.8. 다음 단계

9장. JUnit을 사용하여 경로 테스트 튜토리얼에서는 프로젝트에 대한 JUnit 테스트 케이스를 생성하고 로컬 Camel 컨텍스트 로 프로젝트를 실행합니다.

9장. JUnit을 사용하여 경로 테스트

이 튜토리얼에서는 새 Camel 테스트 케이스 마법사를 사용하여 경로에 대한 테스트 케이스를 생성한 다음 경로를 테스트하는 방법을 보여줍니다.

9.1. 개요

새 Camel 테스트 케이스 마법사는 상용구 JUnit 테스트 케이스를 생성합니다. 경로를 만들거나 수정할 때(예: 더 많은 프로세서 추가) 생성 또는 업데이트된 경로와 관련된 기대치 및 어설션을 추가하도록 생성된 테스트 케이스를 생성하거나 수정해야 합니다. 이렇게 하면 테스트가 경로에 유효한지 확인할 수 있습니다.

9.2. 목표

이 튜토리얼에서는 다음 작업을 완료합니다.

  • JUnit 테스트 케이스를 저장할 /src/test/ 폴더를 생성합니다.
  • ZooOrderApp 프로젝트에 대한 JUnit 테스트 케이스 생성
  • 새로 생성된 JUnit 테스트 케이스 수정
  • ZooOrderApp 프로젝트의 pom.xml 파일 수정
  • 새 JUnit 테스트 케이스를 사용하여 ZooOrderApp 실행
  • 출력 보기

9.3. 사전 요구 사항

  1. 이 튜토리얼을 시작하려면 다음 중 하나에서 생성된 ZooOrderApp 프로젝트가 필요합니다.

  2. Project ExplorerZooOrderApp 프로젝트의 /src/data/ 디렉터리 및 /target/messages/ 하위 디렉터리에서 추적 생성 메시지를 삭제합니다. 추적 생성 메시지는 ID- 접두사로 시작합니다. 예를 들어 그림 9.1. “추적 생성 메시지” 에는 8개의 추적 생성 메시지가 표시됩니다.

    그림 9.1. 추적 생성 메시지

    tutTraceGenMsgs

    일괄 처리로 모든 추적 생성 메시지를 선택하고 마우스 오른쪽 버튼으로 클릭한 다음 삭제 를 선택합니다.

9.4. src/test 폴더 생성

ZooOrderApp 프로젝트에 대한 JUnit 테스트 케이스를 생성하기 전에 빌드 경로에 포함된 폴더를 생성해야 합니다.

  1. Project Explorer 에서 ZooOrderApp 프로젝트를 마우스 오른쪽 버튼으로 클릭한 다음 폴더 를 선택합니다.
  2. 새 폴더 대화 상자의 프로젝트 트리 창에서 ZooOrderApp 노드를 확장하고 src 폴더를 선택합니다.

    Enter에 ZooOrderApp/src 가 표시되는지 확인하거나 상위 폴더 필드를 선택합니다.

  3. 폴더 이름 에서 /test/java:을 입력합니다.

    tutCreateJUnitTestFolder
  4. 완료를 클릭합니다.

    Project Explorer 에서 새 src/test/java 폴더가 src/main/resources 폴더 아래에 나타납니다.

    tutTestFolderAdded
  5. /src/test/java 폴더가 빌드 경로에 포함되어 있는지 확인합니다.

    1. Project Explorer 에서 /src/test/java 폴더를 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 엽니다.
    2. 빌드 경로를 선택하여 메뉴 옵션을 확인합니다.

      Remove from Build Path 메뉴 옵션은 /src/test/java 폴더가 현재 빌드 경로에 포함되어 있는지 확인합니다.

      tutJavaFolderOnBldPath

9.5. JUnit 테스트 케이스 생성

ZooOrderApp 프로젝트에 대한 JUnit 테스트 케이스를 생성하려면 다음을 수행합니다.

  1. Project Explorer 에서 src/test/java 를 선택합니다.
  2. 마우스 오른쪽 버튼으로 클릭한 다음 Camel 테스트 케이스 를 선택합니다.

    NewCamTstCaseTut
  3. Camel JUnit 테스트 케이스 마법사에서 소스 폴더 필드에 ZooOrderApp/src/test/java 가 포함되어 있는지 확인합니다. 적절한 폴더를 찾으려면 browse button 을 클릭합니다.
  4. Package 필드에 tutorial.zooapp.route 를 입력합니다. 이 패키지에는 새 테스트 케이스가 포함됩니다.
  5. 테스트 중인 Camel XML 파일에서 browse button 를 클릭하여 XML 파일을 필터링하도록 구성된 파일 탐색기를 연 다음 ZooOrderApp 프로젝트의 블루프린트.xml 파일을 선택합니다.

    tutCamXMLUnderTst
  6. OK를 클릭합니다. Name 필드의 기본값은 블루프린트Test 입니다.

    tutCamJUnitTstPgComplete
  7. 다음을 클릭하여 Test Endpoints 페이지를 엽니다.

    기본적으로 모든 끝점이 선택되며 테스트 사례에 포함됩니다.

  8. 완료를 클릭합니다.

    참고

    메시지가 표시되면 빌드 경로에 JUnit을 추가합니다.

테스트 아티팩트가 프로젝트에 추가되고 src/test/java 아래의 Project Explorer 에 표시됩니다. 테스트 케이스를 구현하는 클래스는 툴링의 Java 편집기에서 열립니다.

package tutorial.zooapp.route;

import org.apache.camel.EndpointInject;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
import org.junit.Test;

public class BlueprintXmlTest extends CamelBlueprintTestSupport {

	// TODO Create test message bodies that work for the route(s) being tested
	// Expected message bodies
	protected Object[] expectedBodies = { "<something id='1'>expectedBody1</something>",
			"<something id='2'>expectedBody2</something>" };
	// Templates to send to input endpoints
	@Produce(uri = "file:src/data?noop=true")
	protected ProducerTemplate inputEndpoint;
	@Produce(uri = "direct:OrderFulfillment")
	protected ProducerTemplate input2Endpoint;
	// Mock endpoints used to consume messages from the output endpoints and then perform assertions
	@EndpointInject(uri = "mock:output")
	protected MockEndpoint outputEndpoint;
	@EndpointInject(uri = "mock:output2")
	protected MockEndpoint output2Endpoint;
	@EndpointInject(uri = "mock:output3")
	protected MockEndpoint output3Endpoint;
	@EndpointInject(uri = "mock:output4")
	protected MockEndpoint output4Endpoint;

	@Test
	public void testCamelRoute() throws Exception {
		// Create routes from the output endpoints to our mock endpoints so we can assert expectations
		context.addRoutes(new RouteBuilder() {
			@Override
			public void configure() throws Exception {
				from("file:target/messages/invalidOrders").to(outputEndpoint);
				from("file:target/messages/validOrders/USA").to(output3Endpoint);
				from("file:target/messages/validOrders/Germany").to(output4Endpoint);
			}
		});

		// Define some expectations

		// TODO Ensure expectations make sense for the route(s) we're testing
		outputEndpoint.expectedBodiesReceivedInAnyOrder(expectedBodies);

		// Send some messages to input endpoints
		for (Object expectedBody : expectedBodies) {
			inputEndpoint.sendBody(expectedBody);
		}

		// Validate our expectations
		assertMockEndpointsSatisfied();
	}

	@Override
	protected String getBlueprintDescriptor() {
		return "OSGI-INF/blueprint/blueprint.xml";
	}

}
Copy to Clipboard Toggle word wrap

생성된 이 JUnit 테스트 케이스는 ZooOrderApp 프로젝트에 충분하지 않으며 성공적으로 실행되지 않습니다. “블루프린트Test 파일 수정”“pom.xml 파일 수정” 에 설명된 대로 이 파일과 프로젝트의 pom.xml 을 수정해야 합니다.

9.6. 블루프린트Test 파일 수정

블루프린트 CryostatTest.java 파일을 다음과 같이 수정해야 합니다.

  • 필요한 파일 함수를 지원하는 여러 클래스 가져오기
  • 다양한 소스 .xml 파일의 내용을 보관하기 위한 변수 생성
  • 소스 .xml 파일의 내용 읽기
  • 적절한 기대치 정의

블루프린트Test.java 파일을 수정하려면 다음 단계를 따르십시오.

  1. Project Explorer 에서 ZooOrderApp 프로젝트를 확장하여 블루프린트 CryostatTest.java 파일을 노출합니다.

    tutBlueprintXMLTestProjExp
  2. 블루프린트Test.java 파일을 엽니다.
  3. Java 편집기에서 org.apache.camel.EndpointInject; 가져오기 옆에 있는 확장 버튼을 클릭하여 목록을 확장합니다.
  4. 굵은 텍스트로 표시된 두 행을 추가합니다. 첫 번째 행을 추가하면 다음 섹션의 지시에 따라 pom.xml 파일을 업데이트할 때 해결되는 오류가 발생합니다.

    package tutorial.zooapp.route;
    
    import org.apache.camel.EndpointInject;
    import org.apache.camel.Produce;
    import org.apache.camel.ProducerTemplate;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.component.mock.MockEndpoint;
    import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
    import org.apache.commons.io.FileUtils;
    import org.junit.Test;
    import java.io.File;
    Copy to Clipboard Toggle word wrap
  5. // Expected message body 뒤에 바로 이어지는 줄까지 아래로 스크롤합니다.
  6. 해당 줄의 protected Object[] expectedBodies={ …​ expectedBody2</something>"}; Cryostat- Cryostat를 이러한 보호된 문자열 본문# 으로 바꿉니다.

    protected String body1; protected String body2; protected String body3; protected String body4; protected String body5; protected String body6;
    Copy to Clipboard Toggle word wrap
  7. 공용 void testCamelRoute() 줄로 아래로 스크롤하면 Exception { )을 throw하고 그 줄 body# = FileUtils.readFileToString(new File("src/data/message#.xml"), "UTF-8") 을 바로 삽입합니다. 이러한 줄은 다음 섹션에 설명된 대로 pom.xml 파일을 업데이트할 때까지 오류를 나타냅니다.

    // Valid orders body2 = FileUtils.readFileToString(new File("src/data/message2.xml"), "UTF-8"); body4 = FileUtils.readFileToString(new File("src/data/message4.xml"), "UTF-8"); body5 = FileUtils.readFileToString(new File("src/data/message5.xml"), "UTF-8"); body6 = FileUtils.readFileToString(new File("src/data/message6.xml"), "UTF-8"); // Invalid orders body1 = FileUtils.readFileToString(new File("src/data/message1.xml"), "UTF-8"); body3 = FileUtils.readFileToString(new File("src/data/message3.xml"), "UTF-8");
    Copy to Clipboard Toggle word wrap
  8. // TODO 후 직접 따르는 행까지 아래로 스크롤하면 테스트 중인 경로에 대한 기대치가 의미가 있습니다.
  9. outputEndpoint.expectedBodiesReceivedInAnyOrder(expectedBodies); …​inputEndpoint.sendBody(expectedBody) 로 시작하는 코드 블록을 여기에 표시된 행으로 교체합니다.

    // Invalid orders outputEndpoint.expectedBodiesReceived(body1, body3); // Valid orders for USA output3Endpoint.expectedBodiesReceived(body2, body5, body6); // Valid order for Germany output4Endpoint.expectedBodiesReceived(body4);
    Copy to Clipboard Toggle word wrap

    나머지 코드는 그대로 둡니다.

  10. 파일을 저장합니다.
  11. 업데이트된 블루프린트 CryostatTest.java 파일에 필요한 수정 사항이 있는지 확인합니다. 다음과 같이 표시됩니다.

    package tutorial.zooapp.route;
    
    import org.apache.camel.EndpointInject;
    import org.apache.camel.Produce;
    import org.apache.camel.ProducerTemplate;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.component.mock.MockEndpoint;
    import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
    import org.apache.commons.io.FileUtils;
    import org.junit.Test;
    import java.io.file;
    
    public class BlueprintXmlTest extends CamelBlueprintTestSupport {
    
    	// TODO Create test message bodies that work for the route(s) being tested
    	// Expected message bodies
    	protected String body1;
    	protected String body2;
    	protected String body3;
    	protected String body4;
    	protected String body5;
    	protected String body6;
    	// Templates to send to input endpoints
    	@Produce(uri = "file:src/data?noop=true")
    	protected ProducerTemplate inputEndpoint;
    	@Produce(uri = "direct:OrderFulfillment")
    	protected ProducerTemplate input2Endpoint;
    	// Mock endpoints used to consume messages from the output endpoints and then perform assertions
    	@EndpointInject(uri = "mock:output")
    	protected MockEndpoint outputEndpoint;
    	@EndpointInject(uri = "mock:output2")
    	protected MockEndpoint output2Endpoint;
    	@EndpointInject(uri = "mock:output3")
    	protected MockEndpoint output3Endpoint;
    	@EndpointInject(uri = "mock:output4")
    	protected MockEndpoint output4Endpoint;
    
    	@Test
    	public void testCamelRoute() throws Exception {
    		// Create routes from the output endpoints to our mock endpoints so we can assert expectations
    		context.addRoutes(new RouteBuilder() {
    			@Override
    			public void configure() throws Exception {
    				// Valid orders
    				body2 = FileUtils.readFileToString(new File("src/data/message2.xml"), "UTF-8");
    				body4 = FileUtils.readFileToString(new File("src/data/message4.xml"), "UTF-8");
    				body5 = FileUtils.readFileToString(new File("src/data/message5.xml"), "UTF-8");
    				body6 = FileUtils.readFileToString(new File("src/data/message6.xml"), "UTF-8");
    
    				// Invalid orders
    				body1 = FileUtils.readFileToString(new File("src/data/message1.xml"), "UTF-8");
    				body3 = FileUtils.readFileToString(new File("src/data/message3.xml"), "UTF-8");
    
    				from("file:target/messages/invalidOrders").to(outputEndpoint);
    				from("file:target/messages/validOrders/USA").to(output3Endpoint);
    				from("file:target/messages/validOrders/Germany").to(output4Endpoint);
    				from("direct:OrderFulfillment").to(output2Endpoint);
    			}
    		});
    
    		// Define some expectations
    
    		// TODO Ensure expectations make sense for the route(s) we're testing
    		// Invalid orders
    		outputEndpoint.expectedBodiesReceived(body1, body3);
    
    		// Valid orders for USA
    		output3Endpoint.expectedBodiesReceived(body2, body5, body6);
    
    		// Valid order for Germany
    		output4Endpoint.expectedBodiesReceived(body4);
    
    		// Validate our expectations
    		assertMockEndpointsSatisfied();
    	}
    
    	@Override
    	protected String getBlueprintDescriptor() {
    		return "OSGI-INF/blueprint/blueprint.xml";
    	}
    
    }
    Copy to Clipboard Toggle word wrap

9.7. pom.xml 파일 수정

commons-io 프로젝트에 대한 종속성을 ZooOrderApp 프로젝트의 pom.xml 파일에 추가해야 합니다.

  1. Project Explorer 에서 target 폴더 아래에 있는 pom.xml 을 선택하고 툴의 XML 편집기에서 엽니다.
  2. 페이지 하단에서 pom.xml 탭을 클릭하여 편집을 위해 파일을 엽니다.
  3. 다음 행을 < dependencies> 섹션 끝에 추가합니다.

    <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
           <version>2.5</version>
           <scope>test</scope>
    </dependency>
    Copy to Clipboard Toggle word wrap
  4. 파일을 저장합니다.

9.8. JUnit 테스트 실행

테스트를 실행하려면 다음을 수행합니다.

  1. JBoss 관점으로 전환하여 더 많은 작업 공간을 확보합니다.
  2. Project Explorer 에서 ZooOrderApp 프로젝트를 마우스 오른쪽 버튼으로 클릭합니다.
  3. Run asJUnit Test 를 선택합니다.

    기본적으로 JUnit 뷰가 사이드바에 열립니다. (더 나은 보기를 제공하려면 콘솔 , 서버 및 속성 탭을 표시하는 오른쪽 패널로 드래그하십시오.)

    참고

    프로젝트에서 JUnit을 처음 실행할 때 테스트가 실패하는 경우가 있습니다. 테스트를 다시 실행하면 성공적인 결과가 발생합니다.

    테스트가 성공적으로 실행되면 다음과 같은 내용이 표시됩니다.

    그림 9.2. 성공적인 JUnit 실행

    JUnit 성공

    테스트가 실패하면 다음과 같은 내용이 표시됩니다.

    그림 9.3. 실패한 JUnit 실행

    JUnit 실패
    참고

    실행 환경이 Java SE 8로 설정되지 않은 경우 JUnit이 실패합니다. JUnit 탭 상단에 있는 메시지 표시줄에는 올바른 SDK를 찾을 수 없음을 나타내는 오류 메시지가 표시됩니다.

    이 문제를 해결하려면 프로젝트의 컨텍스트 메뉴를 열고 Run AsRun ConfigurationsJRE 를 선택합니다. *실행 환경 필드 옆에 있는 환경] 버튼을 클릭하여 Java SE 8 환경을 찾아서 선택합니다.

  4. 출력을 검사하고 모든 테스트 오류를 해결하기 위해 조치를 취합니다.

    JUnit 패널에 표시되는 오류를 더 보려면 패널의 메뉴 모음에서 Maximize button 를 클릭하여 뷰를 극대화합니다.

    JUnit 테스트 케이스를 다시 실행하기 전에 Project Explorer 의 ZooOrderApp 프로젝트의 /src/data 폴더에서 JUnit 생성 테스트 메시지를 삭제합니다( 그림 9.1. “추적 생성 메시지”참조).

9.9. 추가 읽기

JUnit 테스트에 대한 자세한 내용은 JUnit 을 참조하십시오.

9.10. 다음 단계

10장. Red Hat Fuse에 프로젝트 게시 튜토리얼에서는 Apache Camel 프로젝트를 Red Hat Fuse에 게시하는 방법을 알아봅니다.

10장. Red Hat Fuse에 프로젝트 게시

이 튜토리얼에서는 Red Hat Fuse에 프로젝트를 게시하는 프로세스를 안내합니다. Red Hat Fuse Tooling을 실행하는 것과 동일한 시스템에 Red Hat Fuse 인스턴스가 설치되어 있다고 가정합니다.

10.1. 목표

이 튜토리얼에서는 다음 작업을 완료합니다.

  • Red Hat Fuse 서버 정의
  • 게시 옵션 구성
  • Red Hat Fuse 서버를 시작하고 ZooOrderApp 프로젝트를 게시합니다.
  • Red Hat Fuse 서버에 연결
  • ZooOrderApp 프로젝트의 번들이 성공적으로 빌드 및 게시되었는지 확인합니다.
  • ZooOrderApp 프로젝트 제거

10.2. 사전 요구 사항

이 튜토리얼을 시작하기 전에 다음이 필요합니다.

10.3. Red Hat Fuse Server 정의

서버를 정의하려면 다음을 수행합니다.

  1. Fuse 통합 화면을 엽니다.
  2. 아래쪽의 오른쪽 패널에서 Servers 탭을 클릭하여 서버 뷰를 엽니다.
  3. 사용 가능한 서버가 없음을 클릭합니다. 새 서버 정의 페이지를 열려면 이 링크를 클릭하여 새 서버…​ 링크를 생성합니다.

    참고

    이미 정의된 경우 새 서버를 정의하려면 서버 보기 내에서 마우스 오른쪽 버튼으로 클릭한 다음 서버 를 선택합니다.

  4. Red Hat JBoss Middleware 노드를 확장하여 사용 가능한 서버 옵션을 노출합니다.

    tutDefineNewServer
  5. Red Hat Fuse 서버를 선택합니다.
  6. 서버의 호스트 이름(localhost) 및 서버 이름 (Fuse n.n Runtime Server)의 기본값을 수락한 다음 Next 를 클릭하여 런타임 페이지를 엽니다.

    tutFuseRuntimeDef1
    참고

    Fuse가 아직 설치되지 않은 경우 이제 Download and install runtime link를 사용하여 다운로드할 수 있습니다.

    이미 서버를 정의한 경우 툴링은 이 페이지를 건너뛰고 대신 구성 세부 정보 페이지를 표시합니다.

  7. Name 의 기본값을 수락합니다.
  8. 디렉터리 필드 옆에 있는 찾아보기 를 클릭하여 설치로 이동하여 선택합니다.
  9. 실행 환경 옆에 있는 드롭다운 메뉴에서 런타임 JRE를 선택합니다.

    JavaSE-1.8을 선택합니다(권장). 필요한 경우 환경 버튼을 클릭하여 목록에서 선택합니다.

    참고

    Fuse 서버에는 Java 8(권장)이 필요합니다. 실행 환경에 대해 선택하려면 이전에 설치되어 있어야 합니다.

  10. Alternate JRE 옵션을 그대로 둡니다.
  11. 다음을 클릭하여 Fuse Server의 런타임 정의를 저장하고 Fuse 서버 구성 세부 정보 페이지를 엽니다.

    NewServerDetailsTut
  12. SSH 포트의 기본값(8101)을 수락합니다.

    런타임은 SSH 포트를 사용하여 서버의 Karaf 쉘에 연결합니다. 이 기본값이 잘못된 경우 Red Hat Fuse installDir/etc/org.apache.karaf.shell.cfg 파일을 확인하여 올바른 포트 번호를 확인할 수 있습니다.

  13. 사용자 이름에 서버에 로그인하는 데 사용되는 이름을 입력합니다.

    이는 Red Hat Fuse installDir'/etc/users.properties' 파일에 저장된 사용자 이름입니다.

    참고

    /etc/users.properties 파일에서 기본 사용자가 활성화(커밋되지 않음)된 경우 툴링은 사용자 이름과 암호를 기본 사용자 이름과 암호로 자동으로 채웁니다.

    설정되지 않은 경우 user=password,role (예: joe=secret,Administrator) 형식을 사용하여 파일에 하나를 추가하거나 karaf jaas 명령 세트를 사용하여 설정할 수 있습니다.

    • JAAS:realms Cryo stat- Cryostatto 영역 목록
    • JAAS:manage --index 1 kafka -ECDHEto edit the first (server) realm
    • JAAS:useradd <username> <password > Cryostat-ECDHE to add a user and associated password
    • JAAS:roleadd <username> Administrator Cryostat- Cryostatto 새 사용자의 역할을 지정
    • JAAS:update Cryostat-property-새 사용자 정보로 영역을 업데이트

      서버에 대해 jaas 영역을 이미 선택한 경우 JBossFuse:karaf@root>jaas: users명령을 실행하여 사용자 이름을 검색할 수 있습니다.

  14. 암호 에서 사용자 이름에 서버에 로그인하는 데 필요한 암호를 입력합니다.

    이는 Red Hat Fuse의 installDir/etc/users.properties 파일 또는 karaf jaas 명령에 설정된 암호입니다.

  15. 완료를 클릭합니다.

    런타임 서버 [중지, Synchronized]서버 뷰에 나타납니다.

  16. 서버 보기에서 런타임 서버를 확장합니다.

    JBFuseServersView

    Cryostat[Disconnected]Runtime Server [stopped, Synchronized] 항목 아래에 노드로 표시됩니다.

10.4. 게시 옵션 구성

게시 옵션을 사용하면 ZooOrderApp 프로젝트가 실행 중인 서버에 게시되는 방법과 시기를 구성할 수 있습니다.

  • 프로젝트에 대한 변경 사항을 저장하면 즉시 자동으로
  • 프로젝트를 변경하고 저장한 후 구성된 간격으로 자동으로
  • 게시 작업을 선택할 때 수동으로

이 튜토리얼에서는 ZooOrderApp 프로젝트에 변경 사항을 저장할 때 즉시 게시를 구성합니다. 이렇게 하려면 다음을 수행합니다.

  1. Servers 보기에서 Runtime Server [stopped, Synchronized] 항목을 두 번 클릭하여 개요를 표시합니다.
  2. 서버의 개요 페이지에서 게시 섹션을 확장하여 옵션을 노출합니다.

    srvEditorPubOpts

    리소스 변경이 활성화되면 옵션이 자동으로 게시 되는지 확인합니다.

    필요한 경우 게시 간격 값을 변경하여 변경 시 프로젝트 게시 속도를 높이거나 지연할 수 있습니다.

  3. 서버 보기에서 Start the server 을 클릭합니다.
  4. 서버가 시작될 때까지 몇 초 정도 기다립니다. 수행 시 다음을 수행합니다.

    • 터미널 보기에 시작 화면이 표시됩니다.

      tutServerStartShellV
    • 서버 보기가 표시됩니다.

      tutServerStartServerV
    • Cryo stat Navigatorn.n Runtime Server[Disconnected:)가 표시됩니다.

      tutServerStartJMXNav
  5. 서버 보기에서n .n 런타임 서버 [시작] 을 마우스 오른쪽 버튼으로 클릭한 다음 추가 및 제거를 선택하여 추가 및 제거를 선택하여 추가 및 제거 페이지를 엽니다.

    tutAddRemove1

    서버가 시작되면 게시 변경 사항이 즉시 선택됩니다.

  6. ZooOrderApp 을 선택하고 추가 를 클릭하여 Fuse 서버에 할당합니다.

    tutAddRemove2
  7. 완료를 클릭합니다.

    서버 보기에는 다음이 표시되어야 합니다.

    tutCBRrtePublishedSrvV
    • Runtime Server [Started, Synchronized]

      참고

      서버의 경우 동기화 됨은 서버에 게시된 모든 모듈이 로컬 카운터와 동일함을 의미합니다.

    • ZooOrderApp [Started, Synchronized]

      참고

      모듈의 경우 synchronized 는 게시된 모듈이 해당 local counterpart와 동일하다는 것을 의미합니다. 자동 게시가 활성화되므로 ZooOrderApp 프로젝트에 대한 변경 사항은 초 단위로 게시됩니다( 게시 간격의 값에 따라).

    • JMX[Disconnected]

10.5. 런타임 서버에 연결

런타임 서버에 연결한 후 ZooOrderApp 프로젝트의 게시된 요소를 확인하고 상호 작용할 수 있습니다.

  1. 서버 보기에서 Cryostat [Disconnected] 를 두 번 클릭하여 런타임 서버에 연결합니다.
  2. Cryostat Navigator 에서 Camel 폴더를 확장하여 ZooOrderApp 의 요소를 노출합니다.

    tutJMXconnected
  3. Bundles 노드를 클릭하여 런타임 서버에 설치된 번들 목록으로 속성 보기를 채웁니다.

    tutCBRrouteBundleInstall
  4. 검색 필드에 ZooOrderApp을 입력합니다. 해당 번들이 표시됩니다.

    tutCBRrouteBundleSearch
    참고

    또는 터미널 보기에서 osgi:list 명령을 실행하여 서버 런타임에 설치된 생성된 번들 목록을 확인할 수 있습니다. 툴링은 osgi:list 명령으로 표시되는 OSGi 번들에 대해 다른 이름 체계를 사용합니다. 이 경우 명령은 설치된 번들 목록 끝에 표시되는 Camel 블루프린트 빠른 시작을 반환합니다.

    프로젝트의 pom.xml 파일의 < build > 섹션에서 maven-bundle-plugin 항목에 나열된 번들의 심볼릭 이름과 OSGi를 찾을 수 있습니다.

    tutBundleNamesPom

10.6. ZooOrderApp 프로젝트 설치 제거

참고

게시된 리소스를 제거하기 위해 Cryostat 연결을 끊거나 서버를 중지하지 않아도 됩니다.

런타임 서버에서 ZooOrderApp 리소스를 제거하려면 다음을 수행합니다.

  1. 서버 보기에서n .n Runtime Server 를 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 엽니다.
  2. 추가 및 제거를 선택합니다.

    tutUnpubCBRroute
  3. Configured 열에서 ZooOrderApp 을 선택한 다음 제거를 클릭하여 ZooOrderApp 리소스를 사용 가능한 열로 이동합니다.
  4. 완료를 클릭합니다.
  5. 서버 보기에서 Cryo stat [Connected]를 마우스 오른쪽 버튼으로 클릭한 다음 새로 고침을 클릭합니다.

    Camel 트리( 연결됨) 아래에 있는 Camel 트리가 사라집니다.

    참고

    Cryo stat Navigator 에서 서버 연결 > n.n Runtime Server[Connected] 아래의 Camel 트리도 사라집니다.

  6. 속성 보기에 번들 페이지가 표시되면 목록의 끝에 아래로 스크롤하여 ZooOrderApp의 번들이 더 이상 나열되지 않는지 확인합니다.

법적 공지

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2026 Red Hat
맨 위로 이동