JBoss 퓨즈-퀵 가이드

이 장에서는 Enterprise Service Bus의 필수 사항부터 시작합니다. 아래에 ESB에 대한 자세한 설명과 장점, 단점 및 이해하기 쉽도록 몇 가지 다이어그램이 있습니다.

ESB 란 무엇입니까?

ESB는 Enterprise Service Bus를 의미합니다. 가장 단순한 형태의 ESB는 여러 애플리케이션이 통신하는 데 도움이되는 정보 고속도로 역할을하는 미들웨어입니다.

기업 세계에서 우리는 많은 것을위한 솔루션을 개발합니다. 이러한 솔루션은 다른 기술과 다른 데이터 형식을 사용할 수 있습니다. 이러한 기술에서 통신 또는 데이터 형식의 호환성 차이로 인해 이러한 솔루션을 함께 사용하는 것은 번거 롭습니다. 따라서 우리는loosely coupled integration 이러한 서로 다른 솔루션간에.

ESB는 모든 애플리케이션의 중간에 위치하고 애플리케이션 간의 메시지 라우팅을 용이하게하는 '허브'가 됨으로써 이러한 통합 문제를 단순화하는 것을 목표로합니다. ESB는 중재자 역할을하며 정보 고속도로 역할을하며 데이터 변환 라우팅을 처리하며 Coder 또는 개발자는 자신의 애플리케이션 논리에 집중할 수 있습니다.

ESB를 이해하는 것은 특별히 설계된 문제를 이해하고 해결이 쉬워 질 때 매우 간단 해집니다. 정보를 공유하고 통합 된 비즈니스 플랫폼을 형성하기 위해 서로 다른 언어로 작성되고 서로 다른 시스템에서 실행되는 여러 서로 다른 시스템을 활성화하는 방법을 명확하게 이해해야합니다.

통합 문제

엔터프라이즈 플랫폼에서는 여러 응용 프로그램이 공동으로 작업하고 비즈니스 기능을 전체적으로 제공하는 것이 일반적이지만 이러한 응용 프로그램의 통합이 가장 자주 발생하는 문제입니다. 애플리케이션이 증가함에 따라 시간이 지남에 따라 더욱 어려워집니다.

각 응용 프로그램은 자체 형식으로 데이터를 입력하고 출력 할 수 있습니다. 이 접근 방식은 애플리케이션 수가 적을 경우 잘 작동하지만 애플리케이션 수가 증가함에 따라 통합 휠도 더 나은 접근 방식으로 전환되어야합니다. 예를 들어, 비즈니스 용 특정 응용 프로그램을 변경해야하는 경우 해당 마스터 응용 프로그램에 종속 된 모든 응용 프로그램의 출력 또는 입력 데이터 형식이 영향을받습니다.

이러한 접근 방식은 긴밀하게 결합 된 아키텍처를 기대하는 통합의 가장 큰 장애물 역할을합니다. 이것이 ESB가 등장하는 곳입니다. 각 애플리케이션은 다른 애플리케이션과 직접 통신 할 필요가 없습니다. 대신 모든 애플리케이션이 ESB와 통신하고 ESB는 정보 라우팅 및 내부 데이터 형식 변환을 처리합니다.

왜 ESB인가?

다음은 Enterprise Service Bus가 필수적인 이유를 설명하는 몇 가지 사항입니다.

  • ESB는 변형 호환 애플리케이션과의 통합 문제를 단순화하는 것을 목표로합니다.

  • 모든 애플리케이션의 중개자 역할을하고 애플리케이션 간의 메시지 라우팅을 용이하게하는 미들웨어 역할을합니다.

  • 모든 응용 프로그램이 다른 모든 응용 프로그램과 직접 인터페이스하는 대신 이제 각 응용 프로그램은 ESB에 대한 하나의 인터페이스 만 갖습니다.

  • ESB는 메시지를 공통 형식으로 /에서 변환하고 대상으로 라우팅하는 역할을합니다.

  • 기존 애플리케이션을 교체해야하는 경우이 접근 방식을 크게 절약 할 수 있습니다. 완전히 새로운 인터페이스를 작성하는 대신, 이제는 하나의 인터페이스 (애플리케이션과 ESB 사이) 만 고려할 수 있습니다.

SOA 및 ESB?

SOA와 ESB는 일반적으로 같은 의미로 사용되지만 완전히 다릅니다.

SOA는 애플리케이션이 통신 프로토콜을 통해 네트워크를 통해 서비스로서의 기능을 노출 할 수있는 디자인 패턴 인 반면, ESB는 이종 시스템 간의 통신을 용이하게하는 모델이지만 ESB는 SOA를 구현하는 동안 백본으로 사용할 수 있습니다.

JBoss Fuse는 Redhat의 오픈 소스 ESB 솔루션입니다. 커뮤니티 프로젝트 인 Apache Servicemix를 기반으로하는 엔터프라이즈 솔루션입니다.

퓨즈에 통합

JBoss Fuse는 엔터프라이즈 애플리케이션을 신속하게 통합 할 수있는 가볍고 유연한 통합 플랫폼입니다.

Fuse는 처음에 2012 년 Redhat에 인수 된 Progressive software Inc.에서 개발했습니다. JBoss Fuse 6.1.0.redhat-379 GA는 공식 웹 사이트에서 다운로드 할 수있는 안정적인 버전의 Fuse입니다.

건축물

Fuse는 다양한 기술을 단일 제품으로 결합합니다.

구성품

Apache CXF

Apache CXF는 SOAP 및 Rest 웹 서비스 개발도 지원하는 오픈 소스 웹 서비스 개발 프레임 워크입니다.

Apache Camel

Apache Camel은 EIP 기반 통합 프레임 워크입니다. EIP 또는 엔터프라이즈 통합 패턴은 엔터프라이즈 통합에서 반복되는 문제에 대한 식별 된 솔루션입니다. 이러한 사전 정의 된 즉시 사용 가능한 패턴의 조합을 통해 완벽한 통합 솔루션을 실현할 수 있습니다.

Java, Spring DSL 및 Scala 등과 같은 여러 도메인 특정 언어로 라우팅 논리를 작성할 수 있습니다.

Apache AMQ

Apache AMQ는 JMS 표준에 따라 안정적인 메시징 시스템을 제공하는 JMS입니다. JMS 사양을 지원할뿐만 아니라 JMS 사양에 포함되지 않은 흥미롭고 유용한 기능도 제공합니다.

Apache Karaf

Apache Karaf는 아티팩트의 런타임 역할을하는 경량 OSGi 컨테이너입니다. Apache Karaf는 JVM에 비해 본질적으로 더 동적입니다. 런타임에 모듈을 설치하거나 제거 할 수 있습니다. Fuse의 모든 아티팩트는 Karaf에 배포됩니다.

구조

Fabric은 대규모 분산 환경에서 아티팩트 배포를 쉽게 관리 할 수있는 방법을 제공합니다. 모든 다중 퓨즈 인스턴스에 대한 중앙 집중식 관리를 제공합니다.

퓨즈 설치

퓨즈 설치는 아주 간단합니다. 다른 JBoss 제품과 마찬가지로 Fuse는 압축을 풀 수있는 zip 파일로 제공되며 일부 사소한 구성 변경 후 직접 시작할 수 있습니다.

퓨즈 설치는 4 단계 과정입니다.

다운로드

다음 링크에서 Fuse 6.1.0 GA를 다운로드하십시오. http://www.jboss.org/

압축 해제

다른 모든 JBoss 제품과 마찬가지로 Fuse도 플랫폼 독립적 인 zip입니다.

Fuse 설치 디렉토리로 사용할 대상 디렉토리에 다운로드 한 파일의 압축을 풉니 다. 이 디렉토리는 Fuse 인스턴스의 수명 동안 동일하게 유지되어야하므로 현명하게 선택하십시오.

Note − Fuse가 다른 JBoss 제품처럼 압축을 풀고 시작하더라도 설치가 완료된 후 Fuse 설치를 한 위치에서 다른 위치로 이동하지 않는 것이 좋습니다.

구성

퓨즈의 압축을 풀면 압축을 푼 디렉토리에서 다음 디렉토리를 찾을 수 있습니다.

  • bin
  • etc
  • deploy
  • lib
  • licenses
  • extras
  • quickstarts

그 중에서 우리는 두 개의 디렉토리 만 사용할 것입니다. bin & etc.

사실상 퓨즈를 추출한 후 퓨즈를 직접 시작할 수 있어야하지만 프로덕션 환경에는 권장되지 않는 모든 기본 구성으로 퓨즈가 시작됩니다. 퓨즈를 시작하기 전에 다음 변경을 수행하는 것이 좋습니다.

환경 변수 설정

  • 다음 환경 변수를 설정합니다. JAVA_HOME

  • 변수는 Java 설치 디렉토리를 가리켜 야합니다. M2_HOME

  • 변수는 Maven 설치 디렉토리를 가리켜 야합니다. PATH

  • Java 및 Maven 실행 파일을 포함하도록 경로 변수를 설정합니다.

윈도우

Windows에서는 아래의 지침에 따라 설정을 수행 할 수 있습니다.

시작 → 내 컴퓨터 → 오른쪽 클릭 → 속성 → 고급 시스템 설정 → 환경 변수.

UNIX 및 클론

각 사용자에 대해 bash 프로필이 *nix운영체제. 이 파일을 변경하여 기존 시스템 변수를 추가하거나 편집 할 수 있습니다.

$ vi ~/.bash_proflle

Note−이 파일의 모든 변경 사항은 영구적입니다. 원본을 변경하기 전에 기존 파일을 백업하는 것이 좋습니다.

기본 구성

JBoss Fuse의 기본 구성에 대해 논의하고이를 위해 다음 명령으로 시작해야합니다. Edit $FUSE_INSTALLATION_DIR/etc/

  • user.properties

    • #admin=admin,admin

    • 이것은 우리가 원하는 사용자 이름을 가진 첫 번째 관리자, 암호를 가진 두 번째 관리자에 따라 변경되어야합니다. 세 번째는 역할을 나타내며 제거하는 것을 잊지 않기 때문에 그대로 유지 될 수 있습니다.

    • 예 : FuseAdmin = FusePAss, admin

    • System.properties

      • karafName = 루트

        • Karaf 인스턴스에 부여 할 이름을 나타냅니다.

        • Cont1처럼 원하는 이름을 지정할 수 있습니다.

        • 제공하는이 이름이 고유 한 이름이고 다른 Fuse 인스턴스에서 이미 사용되고 있지 않은지 확인하십시오.

    • org.ops4j.pax.web.cfg

      • Org.osgi.service.http.port = 8181

      • 이 속성은 Fuse에서 제공하는 브라우저 기반 인터페이스 HAWTIO에 액세스하는 데 사용할 포트를 나타냅니다.

      • HAWTIO는 6.0 이상에서 사용할 수있는 Fuse에 대한 내장 브라우저 인터페이스입니다.

    • org.ops4j.pax.url.mvn.cfg

      • org.ops4j.pax.url.mvn.localRepository = D : / repository

      • 이 속성은 Fuse가 아티팩트를 설치할 Maven의 localRepository 경로를 나타냅니다.

      • org.ops4j.pax.url.mvn.settings = D : /Maven/conf/settings.xml

      • 이 속성은 Fuse가 Maven에서 아티팩트를 가져 오는 데 사용해야하는 settings.xml을 나타냅니다.

    Maven 구성

    Maven은 Fuse를 설치하기위한 전제 조건입니다. maven이 무엇인지 모르는 경우 참조하십시오http://www.tutorialspoint.com/maven/

    Maven은 Fuse 아티팩트를 빌드하는 데 사용되는 빌드 도구입니다. Fuse는 먼저 아티팩트 설치 명령을 실행할 때 Maven 로컬 저장소에서 아티팩트를 검색합니다. 따라서 Fuse에 Maven이 설치된 위치와 Maven의 로컬 저장소 경로를 알려야합니다.

    $ FUSE_INSTALLATION_DIR / etc / 편집org.ops4j.paxurl.mvn.cfg

    다음 두 속성 업데이트-

    • org.ops4j.pax.url.mvn.settings = $ M2_HOME / conf /settings.xml
    • org.ops4j.pax.url.mvn.localRepository = $ local_repo

    Note − 변경하십시오 $local_repo Mavens settings.xml에 언급 된 로컬 저장소의 실제 경로를 사용합니다.

    운영

    기본 구성 변경을 수행 한 후 이제 Fuse를 시작할 수 있습니다. Fuse와 함께 작동하는 모든 바이너리 파일은 다음 위치에 있습니다.$FUSE_INSTALLATION_DIR.

    Fuse를 시작하는 방법은 두 가지가 있습니다.

    • 사용 ./fuse

      • 이렇게하면 Fuse를 시작한 동일한 창에서 모든 진행 상황과 로그를 볼 수 있습니다.

      • 아래와 같은 터미널에서 Karaf 콘솔을 제공합니다.

    Note− 콘솔 모드에서 퓨즈가 시작됩니다. 즉, 사용자가 세션에서 로그 아웃하거나 생산 또는 개발 시나리오에서 바람직하지 않은 터미널을 닫을 때 퓨즈 프로세스도 중지됩니다. 이 스크립트는 퓨즈 디버깅에만 사용해야합니다.

    • 사용 ./start

      • 진행 상황이 아니라 화면에 로그가 표시되지 않지만 백그라운드에서 Fuse가 시작되고 사용자가 세션을 종료하거나 터미널을 닫을 때 Fuse 서비스가 중지되지 않습니다.

      • 실제 응용 프로그램에서는 이러한 유형의 동작이 필요합니다. 터미널을 닫아도 퓨즈는 백그라운드에서 실행되어야합니다.

      • 백그라운드에서 실행되는 Fuse에 연결하려면 다음을 사용할 수 있습니다. client 같은 폴더에있는 스크립트.

      • 다음 스크린 샷과 같이 표시되어야합니다.

      • 클라이언트 스크립트를 종료해도 Fuse 서비스가 중지되지 않습니다. 퓨즈 콘솔을 닫습니다.

    HAWTIO

    Fuse는 FMC (Fuse 관리 콘솔)를 사용하여 완전한 GUI 액세스를 제공합니다. 아래 URL에서 GUI를 찾을 수 있습니다.http://localhost:8181.

    명령을 실행하여 수행 한 모든 작업은이 브라우저 기반 GUI에 액세스하여 수행 할 수도 있습니다. 컨테이너가 두 개 이상 있고 Fabric 환경에서 실행중인 경우 매우 유용합니다.

    이 장에서는 Apache Karaf에 대해 설명하고 장점 및 기타 중요한 기능과 함께 경량 OSGi 컨테이너로 불리는 이유에 대해 설명합니다.

    JVM 문제

    JVM 또는 Java 가상 머신은 실제 가상 머신으로 작동하지 않습니다. 내부에서 실행중인 구성 요소를 즉시 중지, 시작 또는 다시 시작할 수있는 시스템입니다. 때로는 클래스 수준에서 핫 배포를 허용 할 수 있지만 다시 시작하지 않고 가상 머신에서 애플리케이션의 구성 요소를 배포하거나 배포 취소 할 수있는 방법은 없습니다.

    이 문제를 해결하고 Java 애플리케이션에서 모듈화를 허용하기 위해 Fuse는 Apache Karaf로 알려진 OSGi 기반 런타임을 사용합니다.

    OSGi

    OSGi 기술은 Java 용 동적 구성 요소 시스템을 정의하는 일련의 사양입니다. 이러한 사양은 응용 프로그램이 (동적으로) 여러 다른 (재사용 가능) 구성 요소로 구성된 개발 모델을 허용합니다.

    OSGi의 이점

    • Reduced Complexity − 애플리케이션은 서로의 구현 세부 사항을 숨기는 협업 구성 요소로 구축되어 복잡성이 감소합니다.

    • Reusability − 많은 구성 요소가 컨테이너에 배포 된 동일한 구성 요소를 활용할 수 있습니다.

    • Deployment − OSGi는 컨테이너를 다시 시작하지 않고도 수명주기 관리 API를 통해 구성 요소의 시작, 중지 및 업데이트를 즉시 지원합니다.

    번들 대 기능

    다음은 번들과 기능을 비교 한 것입니다.

    묶음

    번들은 JVM에 대한 jar가 무엇인지 OSGi와 동일합니다. 번들은 OSGi 컨테이너에 배포 할 수있는 아티팩트입니다. 번들은 응용 프로그램을 형성하기 위해 함께 또는 독립적으로 작동하는 구성 요소입니다.

    이러한 번들은 컨테이너를 다시 시작하지 않고도 런타임에 설치, 제거, 업데이트, 시작 또는 중지 할 수 있습니다.

    풍모

    기능은 여러 번들을 함께 배포하는 방법입니다. 때로는 그룹으로 번들을 배포하는 것이 더 합리적입니다. 기능을 통해 단 하나의 명령으로 번들 그룹을 배포 할 수 있습니다.

    왜 다른 컨테이너인가?

    Apache Karaf는 OSGi 기반 런타임이며 애플리케이션 번들이 실행되는 곳입니다. Fuse는 번들이 실행되고 협업하여 비즈니스 기능을 제공하는 런타임으로 Apache Karaf를 사용합니다.

    Karaf는 OSGi 프레임 워크 인 Felix 및 equinox를 기반으로합니다.

    Karaf 아키텍처

    Apache Karaf는 기본 OSGi 런타임에 다음과 같은 추가 기능을 추가합니다.

    핫 배포

    Karaf는 핫 배포를 지원합니다. 핫 배포 디렉터리가 포함되어 있습니다. 이 디렉토리에있는 모든 항목은 Karaf에 번들로 자동 배포 및 설치됩니다.

    벌채 반출

    Karaf는 모든 번들에 대한 로그를 생성하여 중앙 집중식 로깅을 제공합니다. $Fuse_home/data/log. 로거 구성을 편집 할 수 있습니다.org.ops4j.pax.logging.cfg$Fuse_home/etc directory.

    관리 콘솔

    Karaf는 실행중인 fuse 인스턴스와 상호 작용할 수있는 정교하고 명쾌한 관리 콘솔을 제공합니다. 또한 런타임에 구성 요소 (번들)를 관리하고 모니터링하는 데 사용할 수있는 사전 설치된 명령 집합을 제공합니다. 이 콘솔은 확장 가능하므로 콘솔에 새 번들을 추가하여 콘솔에 새 명령을 추가 할 수 있습니다.

    SSH 액세스

    Karaf는 SSH를 통해이 관리 콘솔에 대한 원격 액세스를 허용합니다. 유효한 자격 증명을 가진 사람은 누구나 SSH 터미널을 통해 karaf 관리 콘솔에 연결할 수 있습니다.

    이 장에서는 몇 가지 예와 함께 Apache Camel이 무엇이며 어떻게 엔드 포인트간에 데이터를 효과적으로 라우팅하는지 설명합니다.

    Apache Camel이란 무엇입니까?

    Apache Camel은 2007 년 초에 시작된 오픈 소스 통합 프레임 워크입니다.

    EIP (Enterprise Integration Pattern) 기반 접근 방식으로 엔터프라이즈 통합 문제를 해결하는 데 사용할 수있는 몇 가지 기본 패턴 구현을 제공합니다. EIP는 기업 통합에서 잘 문서화되고 반복되는 문제에 대한 입증 된 솔루션 일뿐입니다.

    Camel은 데이터 형식 변환, 엔드 포인트 연결 등과 같은 많은 부하를 감수하면서 엔드 포인트간에 데이터를 효과적으로 라우팅하기 때문에 라우팅 및 중재 엔진이라고도합니다.

    기본 예

    Apache Camel을 사용하기위한 전제 조건은 다음과 같습니다.

    • Java
    • Maven
    • Redhat JBoss 퓨즈 6.1-GA-379

    애플리케이션의 기본 스켈레톤 생성

    mvn:archetype generate 
    –DgroupId = com.tutorialpoint.app 
    –DartifactId = camel-first-app 
    –DarchetypeGroupId = org.apache.camel.archetypes
    –DarchetypeArtifactId = camel-archetype-spring 
    –DinteractiveMode = false -X

    이렇게하면 다음 디렉터리 구조가 생성됩니다.

    이것은 생성되는 Camel 애플리케이션의 기본 골격입니다.

    camel-context.xml 편집

    편집하다 camel-first-app → src → main → resources → META-INF\spring\camel-context.xml은 아래와 같이 일치합니다.

    <?xml version = "1.0" encoding = "UTF-8"?>
    <!-- Configures the Camel Context-->
    <beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring
       http://camel.apache.org/schema/spring/camel-spring.xsd">
    
       <camelContext xmlns = "http://camel.apache.org/schema/spring">
          <!-- here is a sample which processes the input file
             (leaving them in place - see the 'noop' flag) 
             then performs content based routing on the message using XPath -->
    			
          <route>
             <from uri = "file:///d:/src/data?noop=false"/>
             <choice>
                <when>
                   <xpath>/person/city = 'London'</xpath>
                   <log message = "UK message"/>
                   <to uri = "file:///d:/target/messages/uk"/>
                </when>
    				
                <otherwise>
                   <log message = "Other message"/>
                   <to uri = "file:///d:/target/messages/others"/>
                </otherwise>
    				
             </choice>
    			
          </route>
       </camelContext>
    </beans>

    pom.xml 편집

    <plugins> </ plugins> 안에 다음 코드를 추가합니다.

    <plugin>
       <groupId>org.apache.felix</groupId>
       <artifactId>maven-bundle-plugin</artifactId>
       <version>2.3.4</version>
       <extensions>true</extensions>
    	
       <configuration>
          <instructions>
             <Bundle-SymbolicName>
                ${project.artifactId}
             </Bundle-SymbolicName>
             <Import-Package>*</Import-Package>
          </instructions>
       </configuration>
    	
    </plugin>

    포장 유형 변경 jar → bundle.

    <packaging>bundle</packaging>

    다음 명령을 사용하여 프로젝트를 빌드하십시오-

    mvn clean install

    Fuse에 프로젝트 설치

    다음을 사용하여 퓨즈 시작 Fuse.bat/start.bat. 다음을 사용하여 퓨즈를 시작하는 경우start.bat, 사용하다 client.bat퓨즈에 연결합니다. 다음 스크린 샷과 같이 UI를 가져와야합니다.

    Karaf 및 Fuse 명령에 액세스하기위한 CLI입니다.

    install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT

    프로젝트가 실행 중인지 테스트

    이제 애플리케이션이 Fuse에 설치되어야합니다. 내부 데이터 디렉토리 복사camel-first-app 그리고 그것을 D:/src/ 그리고 city = London을 갖는 메시지를 D:/target/merssages/uk.

    입력 파일을 D:/src/data

    Input

    Message1.xml

    <?xml version = "1.0" encoding = "UTF-8"?>
    <person user = "james">
       <firstName>James</firstName>
       <lastName>Strachan</lastName>
       <city>London</city>
    </person>

    Message2.xml

    <?xml version = "1.0" encoding = "UTF-8"?>
    <person user = "hiram">
       <firstName>Hiram</firstName>
       <lastName>Chirino</lastName>
       <city>Tampa</city>
    </person>

    Output

    D : / target / messages / uk에서

    <?xml version = "1.0" encoding = "UTF-8"?>
    <person user = "james">
       <firstName>James</firstName>
       <lastName>Strachan</lastName>
       <city>London</city>
    </person>

    D : / target / messages / others에서

    <?xml version = "1.0" encoding = "UTF-8"?>
    <person user = "hiram">
       <firstName>Hiram</firstName>
       <lastName>Chirino</lastName>
       <city>Tampa</city>
    </person>

    이 장에서는 다양한 Camel 개념을 이해합니다. 시작해야 할 핵심 개념을 이해하기 위해 기본적인 예를 들어 보겠습니다.

    CamelContext

    모든 낙타 애플리케이션에는 최소한 하나의 CamelContext가 있습니다. 이곳은 낙타 루트를 추가하는 곳입니다. 유사하다ApplicationContext

    낙타 컨텍스트는 모든 것을 함께 보관하는 컨테이너로 생각할 수 있습니다. 하나의 낙타 컨텍스트에는 내부에 여러 경로가있을 수 있습니다.

    노선

    CamelContext는 하나 이상의 경로를 포함 할 수 있습니다. 경로는 데이터가 한 끝점에서 다른 끝점으로 낙타 컨텍스트로 흐르는 방식을 정의하는 통합 논리입니다.

    끝점

    엔드 포인트는 시스템이 메시지를 보내거나받을 수있는 채널의 끝입니다. 이것은 우리가 의사 소통 언어에서 목적지 또는 소스라고 부르는 것입니다.

    구성품

    구성 요소는 Camel의 확장 지점입니다. 구성 요소는 기술, 데이터 형식, 변환기 등에 대한 인터페이스가 될 수 있습니다. 또한 엔드 포인트의 공장 역할을 할 수 있습니다.

    EIP

    EIP는 Enterprise Integration Pattern을 나타냅니다. 이들은 반복되는 문제에 대해 식별되고 잘 알려진 솔루션입니다. Camel은 대부분의 엔터프라이즈 통합 패턴을 지원합니다.

    콘텐츠 기반 라우터

    CBR 패턴을 사용하면 입력 파일의 내용에 따라 데이터를 라우팅 할 수 있습니다.

    이 패턴은 입력 본문의 내용에 따라 값을 라우팅해야 할 때 사용됩니다.

    다음 예제는 다음에서 데이터를 읽습니다. D:/data/input예배 규칙서. 읽은 후 데이터 태그 내부의 값 태그를 확인합니다. 값 태그에value1,로 전송됩니다. D:/value1, 포함 된 경우 value2,로 전송됩니다. D:/value2 이 두 가지가 모두 없으면 다른 사람에게 전송됩니다.

    <CamelContext xmlns = "http://camel.apache.org/schema/spring">
       <route>
          <from uri = "file:///D:/data/input"/>
          <choice>
             <when>
                <xpath>/data/value = 'value1'</xpath>
                <to uri = "file:///D:/value1"/>
             </when> 
             <when>
                <xpath>/data/value = 'value2'</xpath>
                <to uri = "file:///D:/value2"/>
             </when>  
    			
             <otherwise>
                <to uri = "file:///D:/others "/>
             </otherwise>
    			
          </choice>
       </route>
    </camelContext>

    Input

    D : /data/input/message1.xml

    <data>
       <value>value1</value>
    </data>

    D : /data/input/message2.xml

    <data>
       <value>value2</value>
    </data>

    Output

    D : / 값 1 /

    <data>
       <value>value1</value>
    </data>

    D : / 값 2 /

    <data>
       <value>value2</value>
    </data>

    쪼개는 도구

    분할기 패턴은 입력 데이터를 더 작은 청크로 분할하는 데 사용됩니다.

    이 패턴은 청크로 분할해야하는 대용량 데이터 입력과 함께 대부분 사용되므로 처리 가능하게됩니다. 입력 토큰 문자열을 기반으로 입력을 더 작은 조각으로 나눕니다.

    <CamelContext xmlns = "http://camel.apache.org/schema/spring">
       <route>
          <from uri = "file:///D:/inbox"/>
          <split streaming = "true">
             <tokenize token = "order" xml = "true"/>
             <to uri = "activemq:queue:order"/>
          </split>
       </route>
    </CamelContext>

    Input

    D : /inbox/message.xml

    <order>
       <data>
          <value>value1</value>
       </data>
    </order>
    
    <order>
       <data>
          <value>value2</value>
       </data>
    </order>
    
    <order>
       <data>
          <value>value3</value>
       </data>
    </order>

    Output

    AMQ를 확인하면 3 개의 메시지가 게시됩니다.

    <order>
       <data>
          <value>value4</value>
       </data>
    </order>

    수신자 목록

    수신자 목록 패턴은 메시지 본문 자체에서 수신자 목록을 검색해야 할 때 사용됩니다.

    다음 예에서는 고객 태그에 쉼표로 구분 된 문자열 목록으로 나열된 모든 수신자에게 메시지가 전송됩니다.

    <CamelContext xmlns = "http://camel.apache.org/schema/spring">
       <route>
          <from uri = "jms:xmlOrders" />
          <recipientList>
             <xpath>/order/customer</xpath>
          </recipientList>
       </route>
    </camelContext>

    기타 EIP

    Camel은 식별 된 거의 모든 EIP를 지원합니다. 일반적으로 사용되는 EIP 중 일부는 다음과 같습니다.

    • Log − 전체 메시지 또는 그 일부를 기록하려면

    • Message Filter − 메시지 내용 필터링

    • Re-Sequencer − 모든 토큰을 순서대로 얻으려면

    • Wiretap − 여행 메시지를 검사하려면

    EIP의 전체 목록과 사용법은 Camel의 공식 문서에서 찾을 수 있습니다. http://camel.apache.org/eip.html

    Camel의 예외 처리

    Using Error Handler − 이것은 낙타에서 예외를 처리하는 가장 쉬운 방법입니다.

    이를 사용하려면 오류 핸들러 클래스 빈을 구성하고이를 참조로 제공해야합니다. CamelContext errorHandlerRef 속성.

    <bean id = "loggingErrorHandler" class = "org.apache.camel.builder.LoggingErrorHandler">
       <property name = "logName" value = "mylogger.name"/>
       <property name = "level" value = "DEBUG"/>
    </bean>
    
    <camelContext errorHandlerRef = ” loggingErrorHandler” >
       …
    </camelContext>

    Try Catch finally 사용

    Camel은 Java 스타일도 지원합니다. Try Catch Finally block 오류 처리를 위해.

    Java와 마찬가지로 다음과 같은 세 개의 블록이 있습니다.

    • doTry 블록에는 예외를 생성 할 수있는 코드가 있습니다.

    • doCatch 블록은 예외 발생시 실행해야하는 코드를 포함합니다.

    • doFinally블록에는 예외에 관계없이 실행되어야하는 코드가 있습니다. 예외가 발생했는지 여부에 관계없이 항상 실행됩니다.

    Note− Mock은 테스트 구성 요소이며 다른 목적으로 권장되지 않습니다. 테스트 주도 개발의 jMOck 구성 요소와 마찬가지로 테스트에 사용되는 camel 구성 요소입니다.

    <route>
       <from uri = "direct:start"/>
       <doTry>
          <process ref = "someProcesorThatmayFail"/>
          <to uri = "mock:result"/>
    		
          <doCatch>
             <exception>java.io.IOException</exception>
             <exception>java.lang.IllegalStateException</exception>
             <to uri = "mock:catch"/>
          </doCatch>
    		
          <doFinally>
             <to uri = "mock:finally"/>
          </doFinally>
    		
       </doTry>
    </route>

    위의 예에서는 catch 블록에서 처리해야하는 예외 목록을 제공 할 수 있습니다.

    퓨즈에 번들 배포

    다음을 사용하여 퓨즈 시작 Fuse.bat/start.bat.

    start.bat를 사용하여 Fuse를 시작하는 경우 client.bat를 사용하여 Fuse에 연결하십시오. 다음 스크린 샷과 같이 UI를 가져와야합니다.

    Karaf 및 Fuse 명령에 액세스하기위한 CLI입니다.

    install –s mvn:group.id /artifact.id/version 
    e.g. install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT

    이 장에서는 Apache CXF가 무엇이며 SOAP 및 Rest 웹 서비스를 개발하는 데 어떻게 도움이 될 수 있는지에 대해 논의하겠습니다.

    Apache CXF 란 무엇입니까?

    Apache CXF는 SOAP 및 Rest 웹 서비스를 개발하는 데 사용할 수있는 웹 서비스 개발 프레임 워크입니다. CXF는JAX-RS and JAX-Ws 표준.

    현재 가장 널리 사용되는 웹 서비스 개발 프레임 워크입니다. CXF는 현재 점차 CXF로 대체되고있는 Axis2에 대해 학습하고 개선했습니다.

    CXF 대 Axis2

    CXF 축 2
    개량

    CXF는 현재 가장 많이 사용되는 프레임 워크입니다.

    Axis2보다 많이 개선 되었습니다.

    Axis2는 점차 CXf로 대체되고 있습니다.

    CXF에 비해 더 많은 코드가 필요합니다.

    코드 필요

    CXF는 Axis2에 비해 더 적은 코드를 필요로합니다.

    Axis2에는 상대적으로 더 많은 코드가 필요합니다.

    표준 준수

    CSF는 JAX-RS 및 JAX-WS와 완전히 호환됩니다.

    Axis2는 JAX-RS 및 JAX-WS와 완전히 호환되지 않습니다.

    Spring과 호환

    아니

    프런트 엔드 분리

    JAX-WS 코드에서 프런트 엔드를 깔끔하게 분리

    깨끗한 분리가 제공되지 않습니다.

    비누

    SOAP는 Simple Object Access Protocol을 나타냅니다. 두 시스템간에 웹 서비스를 통해 구조화 된 정보를 교환하기위한 프로토콜입니다. 주로 데이터 구조화를 위해 XML에 의존하고 메시지 협상 및 전송을 위해 HTTP 또는 SMTP를 사용합니다.

    SOAP 웹 서비스를 개발하는 데는 두 가지 접근 방식이 있습니다.

    • Code first −이 접근 방식에서 WSDL은 코드에서 생성됩니다.

    • Contract first − 계약에서 먼저 WSDL에서 코드가 생성됩니다.

    CXF를 사용한 SOAP 개발

    Maven 구성

    Maven의 settings.xml에 다음 프로필을 추가합니다.

    <profiles>
       <profile>
          <id>Jboss-Fuse</id>
    		
          <activation>
             <activeByDefault>true</activeByDefault>
          </activation>
    		
          <repositories>
             <repository>
                <id>fusesource</id>
                <url>http://repo.fusesource.com/nexus/content/groups/public/</url>
                <snapshots>
                   <enabled>false</enabled>
                </snapshots>
                <releases>
                   <enabled>true</enabled>
                </releases>
             </repository>
          </repositories>
    		
       </profile>
    </profiles>

    스켈레톤 생성

    mvn archetype:generate
    -DarchetypeGroupId = org.apache.servicemix.tooling 
    -DarchetypeArtifactId = servicemix-cxf-code-first-osgi-bundle 
    -DarchetypeVersion=2012.01.0.redhat-60024 
    -DgroupId = org.fusesource.example 
    -DartifactId = cxf-basic 
    -Dversion = 1.0-SNAPSHOT

    Build Web Service Project.

    mvn clean install

    Install web-service into Fuse using the following command.

    JBossFuse:karaf@root>install -s mvn:org.fusesource.example/cxf-basic/1.0-SNAPSH

    Check if bundle has registered SOQP web-service

    URL 열기 http://localhost:8181/cxf

    웹 서비스는 다음과 같이 나열되어야합니다.

    Testing Web-Service

    mvn -Pclient

    INFO − 서비스 생성 {http://ws.totorials.com/} com.to 클래스의 PersonService

    torials.ws.Person
    Invoking getPerson...
    getPerson._getPerson_personId = Guillaume
    getPerson._getPerson_ssn = 000-000-0000
    getPerson._getPerson_name = Guillaume
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 30.668 s
    [INFO] Finished at: 2016-02-15T21:01:20+05:30
    [INFO] Final Memory: 10M/37M
    [INFO] ------------------------------------------------------------------------

    우선 REST는 Representational State Transfer를 의미합니다. 이는 대부분의 경우 HTTP 인 상태 비 저장, 캐시 가능, 클라이언트-서버 프로토콜을 기반으로 웹 서비스를 개발하는 방법입니다.

    REST 웹 서비스는 HTTP 요청을 사용하여 네트워크에서 데이터를 게시, 가져 오기, 삭제합니다.

    CXF를 사용한 REST 개발

    간단한 Maven 빠른 시작 프로젝트 만들기

    mvn archetype:generate 
    -DgroupId = com.tuts.abhinav 
    -DartifactId = rest-service
    -DarchetypeArtifactId = maven-archetype-quickstart 
    -DinteractiveMode = false

    종속성 추가

    <dependency>
       <groupId>org.apache.servicemix.specs</groupId>
       <artifactId>org.apache.servicemix.specs.jsr311-api-1.1.1</artifactId>
       <version>1.9.0</version>
       <scope>provided</scope>
    </dependency>
    
    <dependency>
       <groupId>org.apache.servicemix</groupId>
       <artifactId>servicemix-http</artifactId>
       <version>2013.01</version>
    </dependency>
    
    <dependency>
       <groupId>log4j</groupId>
       <artifactId>log4j</artifactId>
       <version>1.2.16</version>
    </dependency>

    빌드 지침 추가

    <build>
       <defaultGoal>install</defaultGoal>
       <plugins>
          <plugin>
             <groupId>org.apache.felix</groupId>
             <artifalctId>maven-bundle-plugin</artifactId>
             <version>2.3.4</version>
             <extensions>true</extensions>
    			
             <configuration>
                <instructions>
                   <Bundle-SymbolicName>rest-example-database-post-method
                      </Bundle-SymbolicName>
                   <Import-Package>* </Import-Package>
                </instructions>
             </configuration>
    			
          </plugin>
       </plugins>
    </build>

    퓨즈 플러그인 저장소 추가

    <pluginRepositories>
       <pluginRepository>
          <id>fusesource.m2</id>
          <name>FuseSource Community Release Repository</name>
          <url>http://repo.fusesource.com/nexus/content/repositories/releases</url>
          <snapshots>
             <enabled>false</enabled>
          </snapshots>
    		
          <releases>
             <enabled>true</enabled>
          </releases>
       </pluginRepository>
    <pluginRepositories>

    저장소 추가

    <repositories>
       <repository>
          <id>fusesource.m2</id>
          <name>FuseSource Community Release Repository</name>
          <url>http://repo.fusesource.com/nexus/content/repositories/releases</url>
          <snapshots>
             <enabled>false</enabled>
          </snapshots>
    		
          <releases>
             <enabled>true</enabled>
          </releases>
    		
       </repository>
    	
       <repository>
          <id>fusesource.ea</id>
          <name>FuseSource Community Early Access Release Repository</name>
          <url>http://repo.fusesource.com/nexus/content/groups/ea</url>
          <snapshots>
             <enabled>false</enabled>
          </snapshots>
          <releases>
             <enabled>true</enabled>
          </releases>
       </repository>
    	
    </repositories>

    서비스 클래스 생성

    com / tuts / 아래에 UserService.java 클래스를 만듭니다.

    package com.tuts;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    @Path("/UserService_1")
    public class UserService {
       @GET
       @Path("/get_data")
       @Produces(MediaType.APPLICATION_JSON)
    	
       public String getUser() {
          String reponse = "This is standard response from REST";
          return reponse;
       }
    }

    Blueprint.xml 생성

    / src / main / resources / OSGI-INF / blueprint blueprint.xml 아래에 blueprint.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" 
       xmlns:jaxrs = "http://cxf.apache.org/blueprint/jaxrs"
       xsi:schemaLocation = "http://www.osgi.org/xmlns/blueprint/v1.0.0 
       http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://cxf.apache.org/blueprint/jaxrs 
       http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">
    	
       <jaxrs:server id = "service" address = "/users">
          <jaxrs:serviceBeans>
             <ref component-id = "userService" />
          </jaxrs:serviceBeans>
       </jaxrs:server>
    	
       <bean id = "userService" class = "com.tuts.UserService" />
    </blueprint>

    퓨즈에 휴식 서비스 설치

    install -s mvn:com.tuts.abhinav/rest-service/1.0-SNAPSHOT

    번들에 등록 된 웹 서비스가 있는지 확인

    URL 열기 http://localhost:8181/cxf

    웹 서비스 테스트

    URL 열기 http://localhost:8181/cxf/users12/UserService_1/get_data

    이 장에서는 ActiveMQ와 응용 프로그램이 서로 통신 할 수 있도록하는 메시지 브로커 역할을하는 방법에 대해 알아 봅니다.

    AMQ 란 무엇입니까?

    ActiveMQ는 Java로 작성된 오픈 소스 메시지 브로커입니다. JMS 1.1 표준을 완벽하게 준수합니다.

    JMS는 메시지 기반 시스템을 개발할 수있는 사양입니다. ActiveMQ는 애플리케이션 사이에 위치하며 비동기적이고 안정적인 방식으로 통신 할 수있는 메시지 브로커 역할을합니다.

    메시징 유형

    더 나은 이해를 위해 아래에 설명 된 두 가지 유형의 메시징 옵션이 있습니다.

    포인트 투 포인트

    이러한 유형의 통신에서 브로커는 한 소비자에게만 메시지를 보내고 다른 소비자는 브로커에서 메시지를받을 때까지 기다립니다. 소비자는 동일한 메시지를받지 않습니다.

    소비자가 없으면 브로커는 소비자를 얻을 때까지 메시지를 보유합니다. 이러한 유형의 통신을Queue based communication생산자가 큐에 메시지를 보내고 한 소비자 만 큐에서 하나의 메시지를 가져옵니다. 소비자가 둘 이상인 경우 다음 메시지를받을 수 있지만 다른 소비자와 동일한 메시지를받지는 않습니다.

    게시 / 구독

    이러한 유형의 통신에서 브로커는 모든 활성 소비자에게 동일한 메시지 복사본을 보냅니다. 이러한 유형의 통신은 다음과 같이 알려져 있습니다.Topic based communication브로커는 특정 주제를 구독 한 모든 활성 소비자에게 동일한 메시지를 보냅니다. 이 모델은 전송 된 메시지의 확인이 예상되지 않는 단방향 통신을 지원합니다.

    대기열 및 주제 생성

    퓨즈는 ActiveMQ와 함께 제공됩니다. FMC 콘솔 (AMQ와 함께 작동하는 브라우저 기반 인터페이스)을 사용하여 ActiveMQ에 액세스 할 수 있습니다.

    다음을 사용하여 FMC에 로그인합니다. localhost:8181 그리고 선택 ActiveMQ 탭.

    • + Create 클릭
    • 대기열 / 주제 이름 입력
    • 라디오 버튼에서 대기열 / 주제 선택
    • 대기열 만들기 / 주제 만들기를 클릭합니다.

    이제 당신은 볼 수 있어야 TestQ 루트 → 대기열 →

    생성 된 토픽을 확인하려면 루트 → 토픽을 따르십시오.

    대기열 내용 찾아보기 / 삭제

    • 다음을 사용하여 FMC에 로그인합니다. localhost:8181

    • ActiveMQ 탭 선택

    • 루트 → 대기열 → TestQ <찾으려는 대기열 선택> → 찾아보기

    • 이 메시지의 내용을 확인하려면 해당 메시지를 클릭하십시오.
    • 오른쪽 상단에 표시된 삭제 버튼을 클릭하여 특정 메시지를 삭제할 수 있습니다.

    이 장에서는 ActiveMQ가 Camel과 함께 작동하는 방법에 대한 기본 사항을 배웁니다.

    ActiveMQ 구성 요소로 구성

    코드에서 ActiveMQ 큐 또는 토픽을 사용하기 전에 ActiveMQComponent를 구성해야합니다. ActiveMQComponent의 최소 구성은 다음 프로그램과 같이 수행 할 수 있습니다.

    <bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent">
       <property name = "brokerURL" value = "tcp://localhost:61616"/>
       <property name = "userName" value = "admin"/>
       <property name = "password" value = "admin"/>
    </bean>
    • brokerURL − AMQ 브로커의 호스트 및 포트를 지정합니다.

    • username − AMQ 브로커 연결에 사용할 사용자 이름을 지정합니다.

    • password − AMQ 브로커에 연결하기위한 암호를 지정합니다.

    대기열에 연결

    이제 ActiveMQComponent를 구성 했으므로 CamelContext에서 엔드 포인트로 사용할 수 있습니다.

    AMQ 끝점을 다음 형식으로 사용합니다.

    Activemq:[queue|topic]:[queueName|topicName]

    AMQ에 메시지 쓰기

    <?xml version = "1.0" encoding="UTF-8"?>
    <!-- Configures the Camel Context-->
    <beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring
       http://camel.apache.org/schema/spring/camel-spring.xsd">

    이 번들을 Fuse 컨테이너에 배포 한 후 AMQ에 게시 된 메시지를 볼 수 있어야합니다. D:/src/data.

    Input

    D : /src/data/input.txt

    Test me

    Output

    AMQ에서 읽기

    <?xml version = "1.0" encoding = "UTF-8"?>
    <!-- Configures the Camel Context-->
    
    <beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation = "
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring
       http://camel.apache.org/schema/spring/camel-spring.xsd">
    	
       <camelContext xmlns = "http://camel.apache.org/schema/spring">
          <!-- here is a sample which processes the input files
             (leaving them in place - see the 'noop' flag)
              then performs content based routing on the message using XPath -->
    			 
          <route>
             <from uri = "activemq:queue:TestQ"/>
             <to uri = "file:///d:/src"/>
          </route>
       </camelContext>
    	
       <bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent">
          <property name = "brokerURL" value = "tcp://localhost:61616"/>
          <property name = "userName" value = "admin"/>
          <property name = "password" value = "admin"/>
       </bean>
    	
    </beans>

    Input

    이 번들을 배포 한 후 D : / src에서 파일이 생성되고 메시지가 사용되는 것을 볼 수 있습니다. 또한 해당 대기열에 대한 소비자가 표시되어야합니다.

    Output

    D : / src

    Test me

    주제에 쓰기

    <?xml version = "1.0" encoding = "UTF-8"?>
    <!-- Configures the Camel Context-->
    <beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring 
       http://camel.apache.org/schema/spring/camel-spring.xsd">
    	
       <camelContext xmlns = "http://camel.apache.org/schema/spring">
          <!-- here is a sample which processes the input files
             (leaving them in place - see the 'noop' flag)
              then performs content based routing on the message using XPath -->
    			 
          <route>
             <from uri = "file:///d:/src"/>
             <to uri = "activemq:topic:TestTopic” />
          </route>
       </camelContext>
    	
       <bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent">
          <property name = "brokerURL" value = "tcp://localhost:61616"/>
          <property name = "userName" value = "admin"/>
          <property name = "password" value = "admin"/>
       </bean>
    	
    </beans>

주제에서 읽기

<?xml version = "1.0" encoding = "UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "
   http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://camel.apache.org/schema/spring 
   http://camel.apache.org/schema/spring/camel-spring.xsd">
	
   <camelContext xmlns = "http://camel.apache.org/schema/spring">
      <!-- here is a sample which processes the input files
         (leaving them in place - see the 'noop' flag)
         then performs content based routing on the message using XPath -->
			
      <route>
         <from uri = "activemq:topic:TestTopic"/>
         <to uri = "file:///d:/src2"/>
      </route>
   </camelContext>
	
   <bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent">
      <property name = "brokerURL" value="tcp://localhost:61616"/>
      <property name = "userName" value = "admin"/>
      <property name = "password" value = "admin"/>
   </bean>
	
</beans>

Input

D : /src/file1.xml

<order>
   <data>
      <value>value1</value>
   </data>
</order>

<order>
   <data>
      <value>value2</value>
   </data>
</order>

<order>
   <data>
      <value>value3</value>
   </data>
</order>

Output

D : / src /

<order>
   <data>
      <value>value1</value>
   </data>
</order>

<order>
   <data>
      <value>value2</value>
   </data>
</order>

<order>
   <data>
      <value>value3</value>
   </data>
</order>

패브릭이란?

Fabric은 여러 Fuse 인스턴스에 대한 관리 및 오케스트레이션 기능을 제공합니다. Fabric을 사용하면 단일 지점에서 연결된 모든 Fuse 인스턴스를 제어 할 수 있습니다. 일반 퓨즈 컨테이너는 패브릭으로 작동하도록 변환 할 수 있습니다. Fabric에는 컨테이너에 관한 모든 정보를 포함하는 데이터 저장소 역할을하는 Fabric 레지스트리가 있으며 관리합니다.

왜 패브릭인가?

Fabric은 분산 환경에서 사용하기에 이상적인 후보로 만드는 다음과 같은 특수 기능을 가지고 있습니다.

  • 패브릭에있는 모든 컨테이너의 상태를 모니터링합니다.
  • 원격 컨테이너 시작 및 중지.
  • 특정 애플리케이션을 실행하기 위해 원격 컨테이너를 프로비저닝합니다.
  • 라이브 시스템에서 애플리케이션을 업그레이드하고 패치를 배포합니다.
  • 예를 들어 시스템의 증가 된 부하에 대처하기 위해 새 컨테이너로 빠르게 시작하고 프로비저닝합니다.

패브릭 설정

패브릭 생성

다음 명령을 사용하여 일반 퓨즈 컨테이너를 Fabric으로 변환 할 수 있습니다.

fabric: create --clean --zookeeper-password myZooPass

Fabric에 다른 컨테이너 연결-

fabric:join --zookeeper-password myZooPass <fabric_host>:2181 Cont1

Note − <fabric_host>를 fabric이 실행중인 실제 호스트 이름으로 바꾸십시오.

브라우저에서 Fuse Management Console에 로그인 할 때 localhost:8181, 다음 스크린 샷과 같이 두 개의 컨테이너를 볼 수 있어야합니다. Fabric 컨테이너는 앞에 작은 구름 기호로 표시됩니다.

프로필

프로필은 다음 정보를 포함합니다-

  • 설치할 번들
  • 설치할 기능
  • 적용 할 구성

프로파일은 패브릭 환경에서 여러 서버에 동일한 번들, 기능 및 구성 세트를 설치하는 방법을 제공합니다.

동일한 프로필이 여러 컨테이너에 적용되고 모든 컨테이너에서 해당 프로필을 변경하면 유사한 변경 사항이 적용되는 나머지 컨테이너에 자동으로 배포됩니다.

프로필 생성

  • FMC에 로그인 localhost:8181

  • 런타임 → 관리

  • 프로필 메뉴의 왼쪽에서 +

프로필에 부여 할 이름을 입력하고 만들기를 클릭합니다.

그런 다음 프로필을 만들어야합니다.

컨테이너에 프로필 적용

런타임 → 컨테이너 → 루트 (원하는 컨테이너 선택)

딸깍 하는 소리 Add팝업 상자가 나타납니다. 원하는 프로필을 검색 한 다음 다시 클릭하십시오.Add.

다음 스크린 샷과 같이 프로필이 목록에 표시되어야합니다.

번들 배포

번들을 배포하려면 다음 경로를 사용하십시오.

런타임 → 컨테이너 → 루트 (원하는 컨테이너 선택) → First_profile (프로필 선택)

번들 탭을 클릭합니다. 다음 형식으로 번들 경로를 설정 한 다음+.

mvn:group.id/artifact.id/version

예를 들면 : mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT

번들이 프로필에 추가되고 프로필이 할당 된 모든 컨테이너에 배포됩니다.

번들 배포 해제

번들을 배포 해제하려면 다음 경로를 사용하십시오.

런타임 → 컨테이너 → 루트 (원하는 컨테이너 선택) → First_profile (프로필 선택)

번들 탭을 클릭하고 삭제하려는 번들을 검색 한 다음 X. 프로필이 적용된 모든 컨테이너에서 번들이 삭제됩니다.

하위 컨테이너는 증가하는로드를 관리하는 가장 쉬운 방법을 제공합니다. 시스템에서 갑작스런 트래픽 부하가 발생하고 단일 컨테이너가 부하를 처리 할 수없는 경우 완전히 새로운 컨테이너를 만드는 대신 자식 컨테이너 세트를 쉽게 만들고 그 사이에 부하를 분산 할 수 있습니다.

자식 컨테이너 만들기

다음을 사용하여 FMC에 로그인합니다. localhost:8181

이제 경로를 따르십시오. 런타임 → 컨테이너 → + 생성 (오른쪽 버튼)

하위 이름, 상위 컨테이너 인스턴스 수 등과 같은 세부 정보를 입력합니다.

딸깍 하는 소리 Create And Start Container

자식 컨테이너 관리

자식 컨테이너는 일반 컨테이너로만 작동합니다.

자식 컨테이너 중지

하위 컨테이너를 중지하려면 런타임 → 컨테이너 → Child1 경로를 따르십시오.

중지를 클릭하여 자식 컨테이너를 중지합니다.

자식 컨테이너 시작

하위 컨테이너를 시작하려면 런타임 → 컨테이너 → Child1 경로를 따르십시오.

시작을 클릭하여 자식 컨테이너를 시작합니다.

이 장에서는 Fuse로 작업하는 동안 발생할 수있는 몇 가지 알려진 문제에 대해 설명합니다. 또한 이러한 문제를 극복하는 방법에 대해서도 논의 할 것입니다.

코드 변경 사항이 반영되지 않음

클라이언트 스크립트를 사용하여 Fuse 인스턴스에 연결합니다. 다음 명령을 사용하여 문제가 발생한 번들을 검색하십시오.

JBossFuse:karaf@root > list|grep <Bundle Description>
For Example:
JBossFuse:karaf@root > list|grep Camel
[ 255] [Active ] [ ] [ ] [ 60] Fabric8 :: Camel Component (1.0.0.redhat-379)
[ 266] [Active ] [ ] [Started] [ 60] A Camel Spring Route (1.0.0.SNAPSHOT)

Note − 위 명령의 출력에서 ​​번들의 번들 ID로 아래 명령을 사용합니다.

JBossFuse:karaf@root > update <bundle id>
JBossFuse:karaf@root > update 266

번들이 다운로드되지 않음

다음 두 가지 이유로 발생할 수 있습니다.

  • Maven 저장소가 지정되지 않았습니다.
  • 저장소에 번들이 없습니다.

Maven 저장소가 지정되지 않았습니다.

Maven은 Fuse 아티팩트를 빌드하는 데 사용되는 빌드 도구입니다. Fuse는 먼저 아티팩트를 설치하라는 명령을 실행할 때 Maven 로컬 저장소에서 아티팩트를 검색합니다. 따라서 Fuse에 Maven이 설치된 위치와 Mavens 로컬 저장소의 경로를 알려야합니다.

$ FUSE_INSTALLATION_DIR / etc / 편집org.ops4j.paxurl.mvn.cfg

다음 두 속성 업데이트-

  • org.ops4j.pax.url.mvn.settings = $ M2_HOME / conf /settings.xml
  • org.ops4j.pax.url.mvn.localRepository = $ local_repo

Note − Mavens settings.xml에 언급 된 로컬 저장소의 실제 경로로 $ local_repo를 변경하십시오.

저장소에 번들이 없음

Maven 설정이 있지만 번들을 다운로드하는 동안 문제가 발생하는 경우 번들을 확인하십시오. JAR Maven Repository의 올바른 위치에 있습니다.

예를 들어, 다음 번들이 다운로드 중에 오류를 발생시키는 경우-

mvn:com.tutorialpoint.app/camel-first-app/1.0-SNAPSHOT

실제 JAR이있는 경우 $ M2_REPO / com / tutorialpoint / app / camel-first-app / 1.0-SNAPSHOT에서 확인해야합니다.

Note − $ M2_REPO는 Fuse가 사용하도록 구성된 Maven 저장소의 실제 경로로 대체되어야합니다.

FMC (브라우저 기반 GUI)에 로그인 할 수 없음

Users not Created − 다음 UI가 표시되지만 "로그인 실패, 금지됨"메시지와 함께 로그인 할 수없는 경우.

사용자를 추가했는지 확인 $FUSE_INSTALLATION_HOME/etc/users.properties

사용자를 추가하는 올바른 형식은 다음과 같습니다.

Username = Password,Role

HAWTIO 포트가 다릅니다.

브라우저의 localhost : 8181에서 UI를 가져올 수없는 경우 URL에 올바른 포트를 언급했는지 확인하십시오.

$FUSE_INSTALLATION_HOME/etc/org.ops4j.pax.web.cfg

액세스하려는 포트를 사용하려면 파일에서 다음 속성을 편집하십시오.

org.osgi.service.http.port=8181

AMQ 브로커가 작동하지 않습니다.

61616 포트가 열려 있고 현재 다른 포트에서 사용하고 있지 않은지 확인하십시오. 동일하게 기본 61616 포트를 변경하려면 다음에서 편집 할 수 있습니다.$FUSE_INSTALLATION_HOME/etc/System.properties

activemq.port = 61616