9.3. Fuse Online 확장 개발
Fuse Online에서 통합을 생성하는 데 필요한 기능을 제공하지 않으면 전문가 개발자가 필요한 동작을 제공하는 확장을 코딩할 수 있습니다. 통합 확장 리포지토리 https://github.com/syndesisio/syndesis-extensions 에는 확장의 예가 포함되어 있습니다.
비즈니스 통합자는 확장을 코딩하는 개발자와 요구 사항을 공유합니다. 개발자는 확장자가 포함된 .jar
파일을 제공합니다. 비즈니스 통합자는 Fuse Online에서 .jar
파일을 업로드하여 사용자 지정 커넥터, 사용자 지정 단계 또는 Fuse Online에서 사용할 수 있는 라이브러리 리소스를 만듭니다.
Red Hat Developer Studio의 Fuse Tooling 플러그인은 단계 확장 또는 커넥터 확장을 개발하는 데 도움이 되는 마법사를 제공합니다. Developer Studio에서 단계 확장 또는 커넥터 확장을 개발하도록 선택하는 경우 또는 다른 IDE에서 개인 기본 설정의 문제입니다. Developer Studio 플러그인 사용에 대한 자세한 내용은 Fuse Online 통합을 위한 확장 개발을 참조하십시오.
이 문서에서는 다음 항목에서는 절차를 간략하게 설명하고 요구 사항을 설명하고 선택한 IDE에서 확장 기능을 개발하기 위한 추가 예제를 제공합니다.
- 9.3.1절. “확장 개발을 위한 일반 절차”
- 9.3.2절. “확장 종류에 대한 설명”
- 9.3.3절. “확장 콘텐츠 및 구조 개요”
- 9.3.4절. “확장 정의 JSON 파일의 요구 사항”
- 9.3.5절. “사용자 인터페이스 속성에 대한 설명”
- 9.3.6절. “확장을 지원하는 Maven 플러그인에 대한 설명”
- 9.3.7절. “확장에서 데이터 도형을 지정하는 방법”
- 9.3.8절. “단계 확장 개발의 예”
- 9.3.9절. “커넥터 확장 개발 예”
- 9.3.10절. “라이브러리 확장을 개발하는 방법”
- 9.3.11절. “JDBC 드라이버 라이브러리 확장 생성”
9.3.1. 확장 개발을 위한 일반 절차
확장 기능을 개발하기 전에 수행해야 하는 작업에 익숙해집니다.
사전 요구 사항
통합 Pod는 플랫 클래스 경로를 사용하여 Java 프로세스에서 실행됩니다. 버전 충돌을 방지하려면 확장이 사용하는 종속 항목이 다음 모든 출처에서 가져온 자료 청구(BOM)와 일치하는지 확인합니다.
-
org.springframework.boot:spring-boot-dependencies:$SPRING_BOOT_VERSION
-
org.apache.camel:camel-spring-boot-dependencies:$CAMEL_VERSION
-
io.syndesis.integration:integration-bom:$SYNDESIS_VERSION
가져온 BOM의 일부가 아닌 추가 종속성이 있는 경우 다음을 수행해야 합니다.
-
lib
디렉터리에 있는 확장 JAR 파일에 패키징합니다. -
확장의 JSON 설명자 파일의
dependencies
속성에서 생략합니다.
절차
- 확장 기능을 이해해야 하는 작업을 파악합니다. 비즈니스 동료에게 문의하여 기능 요구 사항을 파악하십시오.
- 단계 확장, 커넥터 확장 또는 라이브러리 확장을 개발해야 하는지 여부를 결정합니다.
- 확장을 개발할 Maven 프로젝트를 설정합니다.
단계 확장을 개발하는 경우:
-
Camel 경로로 구현할지 또는 Syndesis
Step
API를 사용하여 구현할지 여부를 결정합니다. Syndesis API에 대한 정보는 http://javadoc.io/doc/io.syndesis.extension/extension-api. -
확장 기능을 Camel 경로로 구현하도록 선택하는 경우 XML 조각,
RouteBuilder
클래스 또는 Cryostat를 구현할지 여부를 결정합니다. -
Maven 프로젝트에서
schemaVersion
, 확장이름
,extensionId
등과 같은 필수 메타데이터를 지정합니다.
-
Camel 경로로 구현할지 또는 Syndesis
- 기능을 구현하는 클래스를 코딩합니다.
-
프로젝트의
pom.xml
파일에 종속 항목을 추가합니다. 커넥터 및 라이브러리 확장 및 XML에서 구현하는 단계 확장의 경우 확장을 정의하는 JSON 파일을 생성합니다.
Java에서 구현하는 단계 확장의 경우 Maven은 Maven 프로젝트에서 해당 데이터 구조 값을 지정할 때 JSON 확장 정의 파일을 생성할 수 있습니다.
- Maven을 실행하여 확장자를 빌드하고 확장 프로그램의 JAR 파일을 생성합니다.
- JAR 파일을 Fuse Online 개발 환경에 업로드하여 확장을 테스트합니다.
- Fuse Online 프로덕션 환경에 업로드한 비즈니스 동료에게 확장을 패키지하는 JAR 파일을 제공합니다. JAR 파일을 제공할 때 비즈니스 동료에게 Fuse Online 웹 인터페이스에 표시되는 것 이상으로 정보가 필요한 구성 설정에 대해 알려주십시오.
9.3.2. 확장 종류에 대한 설명
확장은 다음 중 하나를 정의합니다.
- 연결 간 통합 데이터에서 작동하는 하나 이상의 사용자 지정 단계입니다. 각 사용자 지정 단계는 하나의 작업을 수행합니다. 이는 단계 확장입니다.
- 통합 런타임에서 사용하는 라이브러리 리소스입니다. 예를 들어 라이브러리 확장은 Oracle과 같은 전용 SQL 데이터베이스에 연결하기 위한 JDBC 드라이버를 제공할 수 있습니다.
통합할 특정 애플리케이션 또는 서비스에 대한 연결을 생성하기 위한 단일 사용자 정의 커넥터입니다. 이는 커넥터 확장입니다.
참고Fuse Online에서는 OpenAPI 문서를 사용하여 REST API 클라이언트용 커넥터를 만들 수 있습니다. REST API 클라이언트 커넥터 개발을 참조하십시오.
비즈니스 통합자는 확장을 코딩하는 개발자와 요구 사항을 공유합니다. 개발자는 확장자가 포함된 .jar
파일을 제공합니다. 비즈니스 통합자는 Fuse Online에서 .jar
파일을 업로드하여 사용자 지정 커넥터, 사용자 지정 단계 또는 Fuse Online에서 사용할 수 있는 라이브러리 리소스를 만듭니다.
Fuse Online에 업로드하는 확장자 .jar
파일에는 항상 하나의 확장자가 포함되어 있습니다.
연결 간 데이터에서 작동하는 단계를 제공하는 확장을 업로드하고 사용하는 예는 AMQ to REST API 샘플 통합 튜토리얼을 참조하십시오.
9.3.3. 확장 콘텐츠 및 구조 개요
확장은 .jar
파일에 패키지로 제공되는 클래스, 종속 항목 및 리소스의 컬렉션입니다.
Fuse Online에서는 Spring Boot를 사용하여 확장을 로드합니다. 따라서 Spring Boot의 실행 가능한 JAR 형식에 따라 확장을 패키징해야 합니다. 예를 들어 ZipEntry.STORED()
메서드를 사용하여 중첩된 JAR 파일을 저장해야 합니다.
확장자를 패키지하는 .jar
파일의 구조는 다음과 같습니다.
extension.jar | +- META-INF | | | +- syndesis | | | +- syndesis-extension-definition.json 1 | +- mycompany | | | +-project | | | +-YourClasses.class 2 | +- lib 3 | +-dependency1.jar | +-dependency2.jar
9.3.4. 확장 정의 JSON 파일의 요구 사항
각 확장에는 이름, 설명, 지원되는 동작 및 종속 항목과 같은 데이터 구조의 값을 지정하여 확장을 정의하는 .json
파일이 있어야 합니다. 다음 표는 각 확장 유형에 대해 Maven이 확장 정의 JSON 파일을 생성할 수 있는지 여부와 필요한 데이터 구조를 나타냅니다.
확장 유형 | Maven에서 확장 정의를 생성할 수 있음 | 필수 데이터 structure |
---|---|---|
Java의 단계 확장 | 제공됨 |
|
XML의 단계 확장 | 없음 |
|
커넥터 확장 | 없음 |
|
라이브러리 확장 | 없음 |
|
* 종속
항목의 사양은 엄격하게 요구되지는 않지만 실제로는 거의 항상 지정해야 하는 종속성이 있습니다.
일반적으로 확장 정의 파일에는 다음과 같은 레이아웃이 있습니다.
{ "schemaVersion": "v1", "name": "", "description": "", "version": "", "extensionId": "", "extensionType": "", "properties": { }, "actions": [ ], "dependencies": [ ], }
- schemaVersion 은 확장 정의 스키마의 버전을 정의합니다. 내부적으로 Syndesis는 schemaVersion 을 사용하여 확장 확장 정의를 내부 모델에 매핑하는 방법을 결정합니다. 이를 통해 이전 버전의 Syndesis에 대해 개발된 확장 기능을 최신 버전의 Syndesis에 배포할 수 있습니다.
- 확장의 이름입니다.Is the name of the extension. Fuse Online에 확장을 업로드할 때 이 이름이 표시됩니다.
- 설명은 지정할 유용한 정보입니다. Fuse Online은 이 값을 사용하지 않습니다.
- 버전은 확장 업데이트를 구분하는 데 도움이 되는 편의를 위한 것입니다. Fuse Online은 이 값을 사용하지 않습니다.
- extensionId 는 확장에 대한 고유한 ID를 정의합니다. 이는 최소한 통합 환경에서 고유해야 합니다.
extensionType 은 확장이 제공하는 통합에 해당합니다. Syndesis 버전 1.3부터 다음과 같은 확장 유형이 지원됩니다.
-
단계
-
커넥터
-
라이브러리
-
커넥터 확장의 최상위 수준에 있는 속성이 필요합니다. Fuse Online 사용자가 커넥터를 선택하여 연결을 만들 때 표시되는 Fuse Online을 제어합니다. 이 속성 개체에는 연결을 만들기 위한 각 폼 컨트롤의 속성 세트가 포함되어 있습니다.This
properties
object contains a set of properties for each form control for creating a connection. 예를 들면 다음과 같습니다."myControlName": { "deprecated": true|false, "description": "", "displayName": "", "group": "", "kind": "", "label": "", "required": true|false, "secret": true|false, "javaType": "", "type": "", "defaultValue": "", "enum": { } }
커넥터 확장에서 중첩된
속성
오브젝트는 연결 작업을 구성하기 위한 HTML 양식 제어를 정의합니다. 단계 확장에서 작업 개체에는 속성 개체가 포함되어 있습니다.In step extensions, theactions
object contains aproperties
object.properties
오브젝트는 단계 구성을 위한 각 양식 컨트롤의 속성 세트를 정의합니다. 사용자 인터페이스 속성에 대한 설명도 참조하십시오.작업은 커넥터가 수행할 수 있는 작업 또는 연결 간 단계에서 수행할 수 있는 작업을 정의합니다. 커넥터 및 단계 확장만 지정한 작업을 사용합니다. 작업 사양의 형식은 다음과 같습니다.
{ "id": "", "name": "", "description": "", "actionType": "step|connector", "descriptor": { } }
- ID 는 작업의 고유 ID입니다. 이는 최소한 통합 환경 내에서 고유해야 합니다.
- name 은 Fuse Online에 표시되는 작업 이름입니다. 통합자는 이 값을 연결 동작의 이름 또는 연결 간 통합 데이터에서 작동하는 단계의 이름으로 확인합니다.
- 설명은 Fuse Online에 표시되는 동작 설명입니다. 이 필드를 사용하여 통합자가 해당 작업이 수행하는 작업을 이해하는 데 도움이 됩니다.
- actionType 은 연결이 연결인지 또는 연결 간 단계에서 작업을 수행할지 여부를 나타냅니다.
-
설명자 는
kind
,entrypoint
,inputDataType
,outputDatatype
등과 같은 중첩 특성을 지정합니다.
종속성 은 이 확장에서 Fuse Online이 제공하는 데 필요한 리소스를 정의합니다.
종속성을 다음과 같이 정의합니다.
{ "type": "MAVEN", "id" : "org.apache.camel:camel-telegram:jar:2.21.0" }
- type 은 종속성의 유형을 나타냅니다. MAVEN 을 지정합니다. (다른 유형은 나중에 지원될 것으로 예상됩니다.)
- ID 는 Maven GAV인 Maven 종속성의 ID입니다.
9.3.5. 사용자 인터페이스 속성에 대한 설명
커넥터 확장 및 단계 확장에서는 확장자 정의 JSON 파일 또는 Java 클래스 파일에서 사용자 인터페이스 속성을 지정합니다. 이러한 속성 설정은 Fuse Online 사용자가 연결을 만들거나, 연결 작업을 구성하거나, 확장 프로그램에서 제공하는 단계를 구성할 때 Fuse Online이 표시되는 HTML 양식 컨트롤을 정의합니다.
Fuse Online 콘솔의 확장 사용자 인터페이스에 표시할 각 양식 컨트롤의 속성을 지정해야 합니다. 각 폼 컨트롤에 대해 임의의 순서로 일부 또는 모든 속성을 지정합니다.For each form control, specify some or all properties in any order.
사용자 인터페이스 속성 사양의 예
IRC 커넥터의 일부인 JSON 파일에서 최상위 속성
오브젝트는 Fuse Online 사용자가 IRC 커넥터를 선택하여 연결을 생성한 후 표시되는 HTML 양식 컨트롤을 정의합니다. 세 가지 양식 제어에 대한 속성 정의에는 hostname
,password
, port
세 가지 유형이 있습니다.
"properties": { "hostname": { "description": "IRC Server hostname", "displayName": "Hostname", "labelHint": "Hostname of the IRC server to connect to", "order": "1", "required": true, "secret": false, "type": "string" }, "password": { "description": "IRC Server password", "displayName": "Password", "labelHint": "Required if IRC server requires it to join", "order": "3", "required": false, "secret": true, "type": "string" }, "port": { "description": "IRC Server port", "displayName": "Port", "labelHint": "Port of the IRC server to connect to", "order": "2", "required": true, "secret": false, "tags": [], "type": "int" } },
이러한 속성 사양을 기반으로 Fuse Online 사용자가 IRC 커넥터를 선택할 때 Fuse Online에 다음과 같은 대화 상자가 표시됩니다. 사용자가 두 개의 필수 필드에 값을 입력하고 Next 를 클릭하면 Fuse Online에서 Fuse Online 사용자가 입력하는 값으로 구성된 IRC 연결을 생성합니다.
확장 정의 JSON 파일의 속성
오브젝트 정보
커넥터 확장에서 다음을 수행합니다.
-
최상위
속성
개체가 필요합니다. Fuse Online 사용자가 커넥터를 선택하여 연결을 만들 때 표시되는 Fuse Online을 제어합니다. 이 속성 개체에는 연결을 만들기 위한 각 폼 컨트롤의 속성 세트가 포함되어 있습니다.Thisproperties
object contains a set of properties for each form control for creating a connection. -
actions
오브젝트에는 각 작업에 대한속성
개체가 있습니다. 이러한속성 개체 각각에
는 해당 작업을 구성하기 위한 각 양식 컨트롤의 속성 세트가 있습니다.
단계 확장에서 actions
오브젝트에는 속성
개체가 포함되어 있습니다. properties
오브젝트는 단계 구성을 위한 각 양식 컨트롤의 속성 세트를 정의합니다. JSON 계층 구조는 다음과 같습니다.
"actions": [ { ... "propertyDefinitionSteps": [ { ... "properties": { "control-ONE": { "type": "string", "displayName": "Topic Name", "order": "2", ..., } "control-TWO": { "type": "boolean", "displayName": "Urgent", "order": "3", ... } "control-THREE": { "type": "textarea", "displayName": "Comment", "order": "1", ..., } } } ]
Java 파일의 사용자 인터페이스 속성 정보
Java 파일에서 사용자 인터페이스 양식 제어를 정의하려면 연결, 작업 또는 단계의 사용자 구성을 정의하는 각 클래스 파일에서 io.syndesis.extension.api.annotations.ConfigurationProperty
를 가져옵니다. Fuse Online 콘솔이 표시할 각 양식 제어에 대해 @ConfigurationProperty
주석 뒤에 속성 목록을 지정합니다. 지정할 수 있는 속성에 대한 자세한 내용은 이 섹션의 끝에 있는 사용자 인터페이스 속성 참조 테이블을 참조하십시오.
다음 코드에서는 하나의 양식 컨트롤에 대한 속성 정의를 보여줍니다. 이 코드는 RouteBuilder
를 사용하여 Camel 경로를 개발하는 예입니다.
public class LogAction extends RouteBuilder { @ConfigurationProperty( name = "prefix", description = "The Log body prefix message", displayName = "Log Prefix", type = "string")
다음 코드에서는 두 개의 컨트롤에 대한 속성 정의를 보여줍니다. 이 코드는 Syndesis Step API 사용 예의 예입니다.
@Action(id = "split", name = "Split", description = "Split your exchange") public class SplitAction implements Step { @ConfigurationProperty( name = "language", displayName = "Language", description = "The language used for the expression") private String language; @ConfigurationProperty( name = "expression", displayName = "Expression", description = "The expression used to split the exchange private String language;
제어 양식 입력 유형에 대한 설명
각 HTML 양식 컨트롤의 속성 집합에서 type
속성은 Fuse Online에서 표시하는 폼 컨트롤의 입력 유형을 정의합니다. HTML 양식 입력 유형에 대한 자세한 내용은 https://www.w3schools.com/html/html_form_input_types.asp 을 참조하십시오.
다음 표에는 Fuse Online 양식 제어에 사용 가능한 입력 유형이 나열되어 있습니다. 컨트롤의 속성 집합에서 알 수 없는 유형
값을 지정하면 Fuse Online에서 한 줄의 텍스트를 허용하는 입력 필드를 표시합니다. 기본값은 "type": "text"
입니다.
속성 유형 값 | HTML | Fuse Online 디스플레이 |
---|---|---|
|
| 사용자가 선택할 수 있거나 선택할 수 없는 확인란입니다. |
|
Fuse Online 사용자가 시간 단위(밀리초, 초, 분, 시간 또는 일)를 선택할 수 있는 사용자 지정 컨트롤입니다. 또한 사용자가 번호를 입력하고 Fuse Online은 밀리초를 반환합니다. 예: | |
|
| 이 필드는 Fuse Online 콘솔에 표시되지 않습니다. 다른 속성을 사용하여 이 필드와 연결된 데이터(예: 어떤 종류의 텍스트 데이터)를 지정할 수 있습니다. Fuse Online 사용자는 이 데이터를 보거나 수정할 수 없지만 사용자가 Fuse Online 페이지에 대해 View Source 를 선택하면 숨겨진 필드가 소스 화면에 표시됩니다. 따라서 보안 목적으로 숨겨진 필드를 사용하지 마십시오. |
|
| 번호를 허용하는 입력 필드입니다. |
|
| Fuse Online에서 사용자가 입력한 문자를 마스킹하는 입력 필드(일반적으로 별표)입니다. |
|
< |
폼 컨트롤의 enum 속성에서 지정하는 각 레이블/값 쌍에 대한 항목이 포함된 드롭다운 목록입니다.A drop-down list with an entry for each label/value pair that you specify in the form control's |
|
| 한 줄의 텍스트를 허용하는 입력 필드입니다. |
|
| 텍스트 영역 요소가 사용됨 |
컨트롤 양식 사용자 인터페이스 속성에 대한 설명
커넥터 또는 단계 확장에서는 Fuse Online 콘솔에 표시되는 각 HTML 양식 컨트롤에 대해 다음 표에 설명된 속성 중 하나 이상을 지정할 수 있습니다. HTML 양식 입력 유형에 대한 자세한 내용은 https://www.w3schools.com/html/html_form_input_types.asp 을 참조하십시오.
속성 이름 | 유형 | 설명 |
---|---|---|
| string | Fuse Online에서 표시하는 양식 컨트롤의 종류를 제어합니다. 자세한 내용은 이전 표를 참조하십시오. |
| 숫자 |
|
| string |
설정하면 값이 form 컨트롤 요소의 HTML |
| array |
|
|
속성의 값에 따라 달라집니다.Depending according to the value of the |
Fuse Online은 처음에 양식 필드에 이 값을 표시합니다. |
| string | 설정된 경우 Fuse Online은 양식 제어 아래에 이 값을 표시합니다. 일반적으로 이 메시지는 제어에 대한 짧고 유용한 메시지입니다. |
| string | Fuse Online에서 이 값을 표시합니다. |
| array |
설정된 경우 Fuse Online은 |
| string |
설정하면 표시 이름 옆에 |
| 숫자 |
|
| 숫자 |
|
| 부울 |
|
| 숫자 |
Fuse Online 콘솔의 제어 순서를 결정합니다. Fuse Online에서는 오름차순, 즉 |
| string | 설정된 경우 Fuse Online은 사용자가 예상 입력을 이해하는 데 도움이 되도록 입력 필드에 이 값을 hazed font에 표시합니다. |
| 부울 |
|
| 숫자 |
형식 속성 값이 |
| 부울 |
지정된 경우, Fuse Online은 아직 설정이 아닌 경우 컨트롤의 |
9.3.6. 확장을 지원하는 Maven 플러그인에 대한 설명
extension-maven-plugin
은 확장을 유효한 Spring Boot 모듈로 패키징하여 확장 개발을 지원합니다. Java에서 구현하는 단계 확장의 경우 이 플러그인은 확장 정의 JSON 파일을 생성할 수 있습니다.
Maven 프로젝트의 pom.xml
파일에 다음 플러그인 선언을 추가합니다.
<plugin> <groupId>io.syndesis.extension</groupId> <artifactId>extension-maven-plugin</artifactId> <version>${syndesis.version}</version> <executions> <execution> <goals> <goal>generate-metadata</goal> <goal>repackage-extension</goal> </goals> </execution> </executions> </plugin>
extension-maven-plugin
은 다음 목표를 정의합니다.
generate-metadata 는 다음과 같이 생성된 JAR 파일에 있을 JSON 확장 정의 파일을 생성합니다.
Maven은
META-INF/syndesis/syndesis-extension-definition.json
파일에 있는 데이터 구조 사양으로 시작합니다.XML로 코딩하는 경우 확장 정의 JSON 파일을 직접 정의해야 하며 필요한 모든 데이터 구조를 지정해야 합니다.
커넥터 또는 라이브러리 확장을 개발하는 경우 확장 정의 JSON 파일을 직접 정의해야 하며 필요한 모든 데이터 구조를 지정해야 합니다.
Java에서 단계 확장을 개발하는 경우 다음을 수행할 수 있습니다.
- 확장자 정의 JSON 파일을 직접 생성합니다.
- Java 코드에서 필요한 모든 데이터 구조를 정의하는 주석을 지정합니다. 확장 정의 JSON 파일을 생성하지 않습니다.
- 확장 정의 JSON 파일을 생성하고 일부 데이터 구조를 지정합니다.
- Java에서 개발하는 단계 확장의 경우 Maven은 코드 주석에서 누락된 사양을 가져옵니다.
-
Maven은 제공된 범위와
extension-bom
을 통해 관리되는 종속성을 지정하는 종속 항목 목록을 추가합니다.
확장을 다시 패키징 하여 패키지합니다.
-
확장을 통해 관리되지 않는 종속성 및 관련 전달 종속성은
생성된 JAR의lib
폴더에 있습니다. -
라이브러리 확장의 경우 범위가 생성된 JAR의
lib
폴더에 있는 종속 항목입니다.
-
예를 들어 Maven 프로젝트에 다음 pom.xml
파일이 있다고 가정합니다.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.company</groupId> <artifactId>my-extension</artifactId> <version>1.0.0</version> <name>MyExtension</name> <description>A Sample Extension</description> <packaging>jar</packaging> <dependencyManagement> <dependencies> <dependency> <groupId>io.syndesis.extension</groupId> <artifactId>extension-bom</artifactId> <version>1.3.10</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>io.syndesis.extension</groupId> <artifactId>extension-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>com.github.lalyos</groupId> <artifactId>jfiglet</artifactId> <version>0.0.8</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>io.syndesis.extension</groupId> <artifactId>extension-maven-plugin</artifactId> <version>1.3.10</version> <executions> <execution> <goals> <goal>generate-metadata</goal> <goal>repackage-extension</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
이 pom.xml
파일을 기반으로 생성된 확장 정의 JSON 파일은 다음과 같습니다.
{ "name": "MyExtension", "description": "A Sample Extension", "extensionId": "com.company:my-extension", "version": "1.0.0", "dependencies": [ { "type": "MAVEN", "id": "io.syndesis.extension:extension-api:jar:1.3.10" } ], "extensionType": "Libraries", "schemaVersion": "v1" }
생성된 아카이브에는 이 구조와 콘텐츠가 있습니다.
my-extension-1.0.0.jar | +- lib | | | + jfiglet-0.0.8.jar | +- META-INF | +- MANIFEST.MF | +- syndesis | +- syndesis-extension-definition.json
9.3.7. 확장에서 데이터 도형을 지정하는 방법
데이터 셰이프는 데이터 매퍼에서 사용할 데이터 유형 메타데이터를 보유합니다.A data shape holds data type metadata for use by the data mapper. 데이터 매퍼는 이 메타데이터를 데이터 매퍼 사용자 인터페이스에서 소스 및 대상 데이터 필드를 표시하는 데 사용하는 내부 문서로 변환합니다. 커넥터 또는 사용자 지정 단계에 대한 확장 정의 JSON 파일에서 각 작업 사양은 입력 데이터 도형(inputDataShape
) 및 출력 데이터 도형(outputDataShape
)을 정의합니다.
확장을 개발할 때는 데이터 매퍼가 소스 및 대상 필드를 올바르게 처리하고 표시할 수 있는 데이터 셰이프 속성을 지정해야 합니다. 다음 데이터 셰이프 속성은 데이터 매퍼 동작에 영향을 미칩니다.
-
kind
-
type
-
사양
-
name
-
description
kind
속성 정보
데이터 셰이프 종류
속성은 DataShapeKinds
열거로 표시됩니다. kind
속성에 가능한 값은 다음과 같습니다.
any
는 데이터 유형이 구조화되지 않음을 나타냅니다. 예를 들어 바이트 배열 또는 무료 형식 텍스트일 수 있습니다. 데이터 매퍼는종류
속성이임의의
로 설정된 경우 데이터 모양을 무시합니다. 즉, 데이터는 데이터 매퍼에 표시되지 않으므로 이 데이터에 또는 이 데이터에 필드를 매핑할 수 없습니다.그러나 사용자 지정 커넥터의 경우
kind
속성이 로 설정된경우
사용자 지정 커넥터에서 만든 연결을 구성할 때 Fuse Online에서 입력 및/또는 출력 데이터 유형을 지정하라는 메시지를 표시합니다. 이는 통합에 연결을 추가할 때 발생합니다. 데이터 셰이프 스키마의 종류, 지정한 스키마 종류에 대한 적절한 문서 및 데이터 유형의 이름을 지정할 수 있습니다.-
none
은 데이터 유형이 없음을 나타냅니다. 입력 데이터 셰이프의 경우 연결 또는 단계가 데이터를 읽지 않음을 나타냅니다. 출력 데이터 셰이프의 경우 연결 또는 단계가 데이터를 수정하지 않음을 나타냅니다.For an output data shape, this indicates that the connection or step does not modify data. 예를 들어 입력 메시지 본문이 출력 메시지 본문으로 전송되는 경우kind
속성을none
으로 설정하면 데이터가 전달됨을 나타냅니다. 데이터 매퍼는kind
가none
으로 설정된 경우 데이터 셰이프를 무시합니다. 즉, 데이터는 데이터 매퍼에 표시되지 않으므로 이 데이터에 또는 이 데이터에 필드를 매핑할 수 없습니다. Java
는 데이터 유형이 Java 클래스로 표시됨을 나타냅니다.type
속성에 정규화된 클래스 이름을 지정하여"kind": "java"
선언을 따릅니다. 예를 들면 다음과 같습니다."outputDataShape": { "kind": "java", "type": "org.apache.camel.component.telegram.model.IncomingMessage" },
JSON-schema
는 데이터 유형이 JSON 스키마로 표시됨을 나타냅니다.kind
가json-schema
로 설정된 경우 JSON 스키마를 데이터 셰이프의specification
속성 값으로 지정합니다. 예를 들면 다음과 같습니다."inputDataShape": { "description": "Person data", "kind": "json-schema", "name": "Person", "specification": "{\"$schema\":\"http://json-schema.org/draft-04/schema#\",\"title\":\"Person\",\"type\":\"object\",\"properties\":{\"firstName\":{...}}}" }
SAP Concur 커넥터의 코드에는 JSON 스키마로 지정된 데이터 도형의 예가 포함되어 있습니다.
JSON-instance
는 데이터 유형이 JSON 인스턴스로 표시됨을 나타냅니다.kind
가json-instance
로 설정된 경우 JSON 인스턴스를 데이터 셰이프의specification
속성 값으로 지정합니다. 예를 들면 다음과 같습니다."inputDataShape": { "description": "Person data", "kind": "json-instance", "name": "Person", "specification": "{\"firstName\":\"John\",...}" }
XML-schema
는 데이터 유형이 XML 스키마로 표시됨을 나타냅니다.kind
가xml-schema
로 설정된 경우 XML 스키마를 데이터 셰이프의specification
속성 값으로 지정합니다. 예를 들면 다음과 같습니다."inputDataShape": { "description": "Person data", "kind": "xml-schema", "name": "Person", "specification": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">...</xs:schema>" }
XML-instance
는 데이터 유형이 XML 인스턴스로 표시됨을 나타냅니다.kind
가xml-instance
로 설정된 경우 XML 인스턴스를 데이터 셰이프의specification
속성 값으로 지정합니다. 예를 들면 다음과 같습니다."inputDataShape": { "description": "Person data", "kind": "xml-instance", "name": "Person", "specification": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Person><firstName>Jane</firstName></Person>" }
CSV-instance
는 데이터 유형이 CSV 인스턴스로 표시됨을 나타냅니다.kind
가csv-instance
로 설정된 경우 CSV 인스턴스를 데이터 셰이프의specification
속성 값으로 지정합니다. 예를 들면 다음과 같습니다."inputDataShape": { "description": "Person data", "kind": "csv-instance", "name": "Person", "specification": "John,Doe,120 Jefferson Street,Riverside, NJ, 08075" }
kind
가csv-instance
로 설정된 경우 다음부울
(true/false
) 매개변수를 지정할 수 있습니다.레이블 이름 설명 헤더 이름 허용
allowDuplicateHeaderNames
CSV 데이터의 헤더 줄에 중복 이름을 허용합니다.
Missing Column Names
allowMissingColumnNames
CSV 데이터의 헤더 행을 구문 분석할 때 누락된 열 이름을 허용합니다.
댓글 마크
commentMarker
CSV 데이터에서 주석 행의 시작을 나타내는 문자를 지정합니다.
구분 기호
구분 기호
CSV 데이터에서 값을 구분하는 문자(일반적으로 ";", "" 또는 "\t")를 지정합니다.
escape
escape
CSV 데이터의 이스케이프 문자를 지정합니다.
헤더로 첫 번째 레코드
firstRecordAsHeader
CSV 데이터의 첫 번째 레코드를 헤더 라인으로 사용합니다.
빈 줄 무시
ignoreEmptyLines
CSV 데이터의 빈 행을 무시합니다.
헤더 케이스 무시
ignoreHeaderCase
CSV 데이터의 헤더 줄에 있는 문자 케이스를 무시합니다.
주변 공간 무시
ignoreSurroundingSpaces
CSV 데이터를 포함하는 공백 문자를 무시합니다.
null 문자열
nullString
CSV 데이터에서 null로 변환하거나 null로 변환할 때 사용할 문자열을 지정합니다.
헤더 레코드 건너뛰기
skipHeaderRecord
CSV 데이터의 헤더 레코드를 건너뜁니다.
유형
속성 정보
kind
속성 값이 java
이면 "kind": "java"
선언 뒤에 정규화된 Java 클래스 이름을 지정하는 형식
선언이 옵니다. 예를 들면 다음과 같습니다.
"outputDataShape": { "kind": "java", "type": "org.apache.camel.component.telegram.model.IncomingMessage" },
kind
속성이 java
이외의 것으로 설정되면 type
속성에 대한 모든 설정이 무시됩니다.
사양
속성 정보
kind
속성 설정은 다음 표에 표시된 대로 specification
속성의 설정을 결정합니다.
kind 속성 설정 | 사양 속성 설정 |
---|---|
| Java 검사 결과
Java에서 작성하는 각 확장에 대해
미리 알림으로 Java로 작성된 단계 확장을 위해 |
| 실제 JSON 스키마 문서. 이 설정은 문서에 대한 참조일 수 없으며 JSON 스키마는 참조를 통해 다른 JSON 스키마 문서를 가리킬 수 없습니다. |
| 예제 데이터가 포함된 실제 JSON 문서입니다. 데이터 매퍼는 예제 데이터에서 데이터 유형을 파생합니다. 이 설정은 문서에 대한 참조일 수 없습니다. |
| 실제 XML 스키마 문서. 이 설정은 문서에 대한 참조일 수 없으며 XML 스키마는 참조를 통해 다른 XML 스키마 문서를 가리킬 수 없습니다. |
| 실제 XML 인스턴스 문서. 이 설정은 문서에 대한 참조일 수 없습니다. |
| 실제 CSV 인스턴스 문서. 이 설정은 문서에 대한 참조일 수 없습니다. |
|
|
|
|
name
속성 정보
data shape name
속성은 사람이 읽을 수 있는 데이터 유형의 이름을 지정합니다. 데이터 매퍼는 이 이름을 사용자 인터페이스에 데이터 필드의 레이블로 표시합니다. 다음 이미지에서 Person 은 name
속성의 값이 표시되는 예입니다.
이 이름은 Fuse Online 흐름 시각화의 데이터 유형 지표에도 나타납니다.
description
속성 정보
데이터 셰이프 설명
속성은 커서가 데이터 매퍼 사용자 인터페이스에서 데이터 유형 이름을 가리킬 때 툴팁으로 표시되는 텍스트를 지정합니다.
9.3.8. 단계 확장 개발의 예
단계 확장은 하나 이상의 사용자 지정 단계를 구현합니다. 각 사용자 지정 단계는 연결 간 통합 데이터를 처리하기 위한 하나의 작업을 구현합니다. 다음 예제에서는 단계 확장을 개발하는 대안을 보여줍니다.
Syndesis는 syndesis-extension-plugin
과 함께 사용할 수 있는 사용자 지정 Java 주석을 제공합니다. Java에서 단계 확장 또는 커넥터 확장을 구현하는 경우 Maven을 활성화하여 확장 정의 JSON 파일에 작업 정의를 추가할 수 있는 주석을 지정할 수 있습니다. 주석 처리를 활성화하려면 Maven 프로젝트에 다음 종속성을 추가합니다.
<dependency> <groupId>io.syndesis.extension</groupId> <artifactId>extension-annotation-processor</artifactId> <optional>true</optional> </dependency>
Spring Boot는 Camel 컨텍스트에 빈을 삽입하는 통합 런타임이므로 표준 Spring Boot 사례를 따라야 합니다. 예를 들어 자동 구성 클래스를 생성하고 여기에 빈을 생성합니다. 그러나 기본 동작은 확장 코드에 패키지 스캔이 적용되지 않는다는 것입니다. 따라서 단계 확장자에 META-INF/spring.factories
파일을 생성하고 채워야 합니다.
9.3.8.1. XML 조각을 사용하여 Camel 경로를 개발하는 예
사용자 지정 단계를 개발하려면 직접
와 같은 입력이 있는 Camel 경로인 XML 조각으로 작업을 구현할 수 있습니다. Syndesis 런타임은 다른 Camel 경로를 호출하는 것과 동일한 방식으로 이 경로를 호출합니다.
예를 들어 선택적 접두사를 사용하여 메시지 본문을 기록하는 단계를 생성한다고 가정합니다. 다음 XML은 이 작업을 수행하는 Camel 경로를 정의합니다.
<?xml version="1.0" encoding="UTF-8"?> <routes xmlns="http://camel.apache.org/schema/spring" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <route id="log-body-with-prefix"> <from uri="direct:log"/> <choice> <when> <simple>${header.prefix} != ''</simple> <log message="${header.prefix} ${body}"/> </when> <otherwise> <log message="Output ${body}"/> </otherwise> </choice> </route> </routes>
XML로 확장을 개발할 때는 확장자 정의 JSON 파일을 직접 생성해야 합니다. 이 XML 조각의 경우 src/main/resources/META-INF/syndesis/syndesis-extension-definition.json
파일은 다음과 같이 작업을 정의할 수 있습니다.
{ "actionType": "step", "id": "log-body-with-prefix", "name": "Log body with prefix", "description": "A simple body log with a prefix", "descriptor": { "kind": "ENDPOINT", 1 "entrypoint": "direct:log", 2 "resource": "classpath:log-body-action.xml", 3 "inputDataShape": { "kind": "none" }, "outputDataShape": { "kind": "none" }, "propertyDefinitionSteps": [ { "description": "extension-properties", "name": "extension-properties", "properties": { 4 "prefix": { "componentProperty": false, "deprecated": false, "description": "The Log body prefix message", "displayName": "Log Prefix", "javaType": "String", "kind": "parameter", "required": false, "secret": false, "type": "string" } } } ] } }
- 1
- 작업 유형은
ENDPOINT
로 설정됩니다. 런타임은 Camel 엔드포인트를 호출하여 이 사용자 지정 단계에서 제공하는 작업을 실행합니다. - 2
- 호출할 Camel 끝점은
direct:log
입니다. 경로의from
사양입니다. - 3
- XML 조각의 위치입니다.
- 4
- 이러한 속성은 이 사용자 지정 단계에서 정의한 작업이 통합 단계에 이 단계를 추가하는 통합업체에 노출되는 속성입니다. Fuse Online에서는 사용자 인터페이스에서 지정하는 각 값이 속성 이름과 동일한 메시지 헤더에 매핑됩니다. 이 예제에서 통합자는 로그 접두사 표시 이름이 있는 하나의 입력 필드를 볼 수 있습니다. 자세한 내용은 사용자 인터페이스 속성에 대한 설명을 참조하십시오.
Syndesis는 전체 Camel XML 구성을 지원하지 않습니다. Syndesis는 <routes> 태그만 지원합니다.
9.3.8.2. RouteBuilder
를 사용하여 Camel 경로 개발 예
RouteBuilder
클래스를 지원하는 Camel 경로로 작업을 개발하여 사용자 정의 단계를 구현할 수 있습니다. 이러한 경로에는 직접
과 같은 입력이 있습니다. Syndesis는 다른 Camel 경로를 호출하는 것과 동일한 방식으로 이 경로를 호출합니다.
선택적 접두사를 사용하여 메시지 본문을 기록하는 단계를 생성하는 예제를 구현하려면 다음과 같이 작성할 수 있습니다.
import org.apache.camel.builder.RouteBuilder; import io.syndesis.extension.api.annotations.Action; import io.syndesis.extension.api.annotations.ConfigurationProperty; @Action( 1 id = "log-body-with-prefix", name = "Log body with prefix", description = "A simple body log with a prefix", entrypoint = "direct:log") public class LogAction extends RouteBuilder { @ConfigurationProperty( 2 name = "prefix", description = "The Log body prefix message", displayName = "Log Prefix", type = "string") private String prefix; @Override public void configure() throws Exception { from("direct::start") 3 .choice() .when(simple("${header.prefix} != ''")) .log("${header.prefix} ${body}") .otherwise() .log("Output ${body}") .endChoice(); } }
- 1
@Action
주석은 작업 정의를 나타냅니다.- 2
@ConfigurationProperty
주석은 사용자 인터페이스 양식 제어의 정의를 나타냅니다. 자세한 내용은 사용자 인터페이스 속성 설명을 참조하십시오.- 3
- 이것이 action implementation입니다.
이 Java 코드는 Syndesis 주석을 사용합니다. 즉, extension-maven-plugin
이 작업 정의를 자동으로 생성할 수 있습니다. 확장 정의 JSON 파일에서 작업 정의는 다음과 같습니다.
{ "id": "log-body-with-prefix", "name": "Log body with prefix", "description": "A simple body log with a prefix", "descriptor": { "kind": "ENDPOINT", 1 "entrypoint": "direct:log", 2 "resource": "class:io.syndesis.extension.log.LogAction", 3 "inputDataShape": { "kind": "none" }, "outputDataShape": { "kind": "none" }, "propertyDefinitionSteps": [ { "description": "extension-properties", "name": "extension-properties", "properties": { 4 "prefix": { "componentProperty": false, "deprecated": false, "description": "The Log body prefix message", "displayName": "Log Prefix", "javaType": "java.lang.String", "kind": "parameter", "required": false, "secret": false, "type": "string", "raw": false } } } ] }, "actionType": "step" }
- 1
- 작업 유형은
ENDPOINT
입니다. 런타임은 Camel 엔드포인트를 호출하여 이 단계에서 구현하는 작업을 실행합니다. - 2
- 호출할 Camel 끝점입니다. 경로의
from
사양입니다. - 3
RoutesBuilder
를 구현하는 클래스입니다.- 4
- 이러한 속성은 이 사용자 지정 단계에서 정의한 작업이 통합 단계에 이 단계를 추가하는 통합업체에 노출되는 속성입니다. Fuse Online에서는 사용자 인터페이스에서 지정하는 각 값이 속성 이름과 동일한 메시지 헤더에 매핑됩니다. 이 예제에서 통합자는 로그 접두사 표시 이름이 있는 하나의 입력 필드를 볼 수 있습니다. 자세한 내용은 사용자 인터페이스 속성에 대한 설명을 참조하십시오.
9.3.8.3. RouteBuilder
및 Spring Boot를 사용하여 Camel 경로를 개발하는 예
RouteBuilder
클래스 및 Spring Boot를 지원하는 Camel 경로로 작업을 개발하여 사용자 정의 단계를 구현할 수 있습니다. 이 예에서 Spring Boot는 Camel 컨텍스트에서 RouteBuilder
오브젝트를 등록하는 기능입니다. Syndesis는 다른 Camel 경로를 호출하는 것과 동일한 방식으로 이 경로를 호출합니다.
선택적 접두사를 사용하여 메시지 본문을 기록하는 단계를 생성하는 예제를 구현하려면 다음과 같이 작성할 수 있습니다.
import io.syndesis.extension.api.annotations.Action; import io.syndesis.extension.api.annotations.ConfigurationProperty; import org.apache.camel.builder.RouteBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ActionsConfiguration { @Action( 1 id = "log-body-with-prefix", name = "Log body with prefix", description = "A simple body log with a prefix", entrypoint = "direct:log") @ConfigurationProperty( 2 name = "prefix", description = "The Log body prefix message", displayName = "Log Prefix", type = "string") @Bean 3 public RouteBuilder logBodyWithprefix() { return new RouteBuilder() { @Override public void configure() throws Exception { from("direct::start") 4 .choice() .when(simple("${header.prefix} != ''")) .log("${header.prefix} ${body}") .otherwise() .log("Output ${body}") .endChoice(); } }; } }
- 1
@Action
주석은 작업 정의를 나타냅니다.- 2
@ConfigurationProperty
주석은 사용자 인터페이스 양식 제어의 정의를 나타냅니다. 자세한 내용은 사용자 인터페이스 속성 설명을 참조하십시오.- 3
RouteBuilder
오브젝트를 8080으로 등록합니다.- 4
- 이것이 action implementation입니다.
이 Java 코드는 Syndesis 주석을 사용합니다. 즉, extension-maven-plugin
이 작업 정의를 자동으로 생성할 수 있습니다. 확장 정의 JSON 파일에서 작업 정의는 다음과 같습니다.
{ "id": "log-body-with-prefix", "name": "Log body with prefix", "description": "A simple body log with a prefix", "descriptor": { "kind": "ENDPOINT", 1 "entrypoint": "direct:log", 2 "inputDataShape": { "kind": "none" }, "outputDataShape": { "kind": "none" }, "propertyDefinitionSteps": [ { "description": "extension-properties", "name": "extension-properties", "properties": { 3 "prefix": { "componentProperty": false, "deprecated": false, "description": "The Log body prefix message", "displayName": "Log Prefix", "javaType": "java.lang.String", "kind": "parameter", "required": false, "secret": false, "type": "string", "raw": false } } } ] }, "actionType": "step" }
- 1
- 작업 유형은
ENDPOINT
입니다. 런타임은 Camel 엔드포인트를 호출하여 이 단계에서 구현하는 작업을 실행합니다. - 2
- 호출할 Camel 끝점입니다. 경로의
from
사양입니다. - 3
- 이러한 속성은 이 사용자 지정 단계에서 정의한 작업이 통합 단계에 이 단계를 추가하는 통합업체에 노출되는 속성입니다. Fuse Online에서는 사용자 인터페이스에서 지정하는 각 값이 속성 이름과 동일한 메시지 헤더에 매핑됩니다. 이 예제에서 통합자는 로그 접두사 표시 이름이 있는 하나의 입력 필드를 볼 수 있습니다. 자세한 내용은 사용자 인터페이스 속성에 대한 설명을 참조하십시오.
Spring Boot로 구성 클래스를 검색할 수 있도록 하려면 META-INF/spring.factories
라는 파일에 나열해야 합니다. 예를 들면 다음과 같습니다.
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.company.ActionsConfiguration
Spring Boot를 사용하면 결국 구성 클래스에 등록한 모든 Cryostat를 Camel 컨텍스트에 사용할 수 있습니다. 자세한 내용은 자체 자동 구성 생성에 대한 Spring Boot 설명서를 참조하십시오.
9.3.8.4. Camel 빈 사용 예
Camel 8080 프로세서로 작업을 개발하여 사용자 지정 단계를 구현할 수 있습니다. 선택적 접두사를 사용하여 메시지 본문을 기록하는 단계를 생성하는 예제를 구현하려면 다음과 같이 작성할 수 있습니다.
import org.apache.camel.Body;
import org.apache.camel.Handler;
import org.apache.camel.Header;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.syndesis.extension.api.annotations.Action;
import io.syndesis.extension.api.annotations.ConfigurationProperty;
@Action(
id = "log-body-with-prefix",
name = "Log body with prefix",
description = "A simple body log with a prefix")
public class LogAction {
private static final Logger LOGGER = LoggerFactory.getLogger(LogAction.class);
@ConfigurationProperty(
name = "prefix",
description = "The Log body prefix message",
displayName = "Log Prefix",
type = "string")
private String prefix;
@Handler 1
public void process(@Header("prefix") String prefix, @Body Object body) {
if (prefix == null) {
LOGGER.info("Output {}", body);
} else {
LOGGER.info("{} {}", prefix, body);
}
}
}
- 1
- 작업을 구현하는 함수입니다.
이 Java 코드는 Syndesis 주석을 사용합니다. 즉, extension-maven-plugin
이 작업 정의를 자동으로 생성할 수 있습니다. 확장 정의 JSON 파일에서 작업 정의는 다음과 같습니다.
{ "id": "log-body-with-prefix", "name": "Log body with prefix", "description": "A simple body log with a prefix", "descriptor": { "kind": "BEAN", 1 "entrypoint": "io.syndesis.extension.log.LogAction::process", 2 "inputDataShape": { "kind": "none" }, "outputDataShape": { "kind": "none" }, "propertyDefinitionSteps": [ { "description": "extension-properties", "name": "extension-properties", "properties": { "prefix": { 3 "componentProperty": false, "deprecated": false, "description": "The Log body prefix message", "displayName": "Log Prefix", "javaType": "java.lang.String", "kind": "parameter", "required": false, "secret": false, "type": "string", "raw": false } } } ] }, "actionType": "step" }
- 1
- 작업 유형은
BEAN
입니다. 런타임은 이 사용자 지정 단계에서 작업을 실행하기 위해 Camel 8080 프로세서를 호출합니다. - 2
- 호출할 Camel 빈입니다.
- 3
- 이러한 속성은 이 사용자 지정 단계에서 정의한 작업이 통합 단계에 이 단계를 추가하는 통합업체에 노출되는 속성입니다. Fuse Online에서는 사용자 인터페이스에서 지정하는 각 값이 속성 이름과 동일한 메시지 헤더에 매핑됩니다. 이 예제에서 통합자는 로그 접두사 표시 이름이 있는 하나의 입력 필드를 볼 수 있습니다. 자세한 내용은 사용자 인터페이스 속성에 대한 설명을 참조하십시오.
빈을 사용하면 교환 헤더에서 사용자 속성을 검색하는 대신 사용자 속성을 빈에 삽입하는 것이 편리할 수 있습니다. 이렇게 하려면 삽입하려는 속성에 대한 getter 및 setter 메서드를 구현합니다. 작업 구현은 다음과 같습니다.
import org.apache.camel.Body; import org.apache.camel.Handler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.syndesis.extension.api.annotations.Action; import io.syndesis.extension.api.annotations.ConfigurationProperty; @Action( id = "log-body-with-prefix", name = "Log body with prefix", description = "A simple body log with a prefix") public class LogAction { private static final Logger LOGGER = LoggerFactory.getLogger(LogAction.class); @ConfigurationProperty( name = "prefix", description = "The Log body prefix message", displayName = "Log Prefix", type = "string") private String prefix; public void setPrefix(String prefix) { 1 this.prefix = prefix; } public String getPrefix() { 2 return prefix; } @Handler public void process(@Body Object body) { if (this.prefix == null) { LOGGER.info("Output {}", body); } else { LOGGER.info("{} {}", this.prefix, body); } } }
9.3.8.5. 통합 단계 API 사용 예
통합 단계
API를 사용하여 사용자 지정 단계를 구현할 수 있습니다. 이를 통해 런타임 경로 생성과 상호 작용할 수 있습니다. ProcessorDefinition
클래스에서 제공하는 모든 메서드를 사용할 수 있으며 더 복잡한 경로를 생성할 수 있습니다. Syndesis API에 대한 정보는 http://javadoc.io/doc/io.syndesis.extension/extension-api.
다음은 통합 단계 API를 사용하여 분할 작업을 구현하는 단계
확장의 예입니다.
import java.util.Map;
import java.util.Optional;
import io.syndesis.extension.api.Step;
import io.syndesis.extension.api.annotations.Action;
import io.syndesis.extension.api.annotations.ConfigurationProperty;
import org.apache.camel.CamelContext;
import org.apache.camel.model.ProcessorDefinition;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.Expression;
import org.apache.camel.builder.Builder;
import org.apache.camel.processor.aggregate.AggregationStrategy;
import org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy;
import org.apache.camel.spi.Language;
@Action(id = "split", name = "Split", description = "Split your exchange")
public class SplitAction implements Step {
@ConfigurationProperty(
name = "language",
displayName = "Language",
description = "The language used for the expression")
private String language;
@ConfigurationProperty(
name = "expression",
displayName = "Expression",
description = "The expression used to split the exchange")
private String expression;
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
@Override
public Optional<ProcessorDefinition> configure(
CamelContext context,
ProcessorDefinition route,
Map<String, Object> parameters) { 1
String languageName = language;
String expressionDefinition = expression;
if (ObjectHelper.isEmpty(languageName) && ObjectHelper.isEmpty(expressionDefinition)) {
route = route.split(Builder.body());
} else if (ObjectHelper.isNotEmpty(expressionDefinition)) {
if (ObjectHelper.isEmpty(languageName)) {
languageName = "simple";
}
final Language splitLanguage = context.resolveLanguage(languageName);
final Expression splitExpression = splitLanguage.createExpression(expressionDefinition);
final AggregationStrategy aggreationStrategy = new UseOriginalAggregationStrategy(null, false);
route = route.split(splitExpression).aggregationStrategy(aggreationStrategy);
}
return Optional.of(route);
}
}
- 1
- 이는 사용자 지정 단계가 수행하는 작업의 구현입니다.
이 Java 코드는 Syndesis 주석을 사용합니다. 즉, extension-maven-plugin
이 작업 정의를 자동으로 생성할 수 있습니다. 확장 정의 JSON 파일에서 작업 정의는 다음과 같습니다.
{ "id": "split", "name": "Split", "description": "Split your exchange", "descriptor": { "kind": "STEP", 1 "entrypoint": "io.syndesis.extension.split.SplitAction", 2 "inputDataShape": { "kind": "none" }, "outputDataShape": { "kind": "none" }, "propertyDefinitionSteps": [ { "description": "extension-properties", "name": "extension-properties", "properties": { "language": { "componentProperty": false, "deprecated": false, "description": "The language used for the expression", "displayName": "Language", "javaType": "java.lang.String", "kind": "parameter", "required": false, "secret": false, "type": "string", "raw": false }, "expression": { "componentProperty": false, "deprecated": false, "description": "The expression used to split the exchange", "displayName": "Expression", "javaType": "java.lang.String", "kind": "parameter", "required": false, "secret": false, "type": "string", "raw": false } } } ] }, "tags": [], "actionType": "step" }
추가 리소스
사용자 인터페이스 속성에 대한 자세한 내용은 사용자 인터페이스 속성에 대한 설명을 참조하십시오.
9.3.9. 커넥터 확장 개발 예
Fuse Online에서 통합에서 연결하려는 애플리케이션 또는 서비스에 대한 커넥터를 제공하지 않는 경우 숙련된 개발자는 Fuse Online에 새 커넥터를 제공하는 확장을 코딩할 수 있습니다. 이 문서에서는 커넥터 확장 개발을 위한 소개를 제공합니다. 커넥터 개발에 대한 자세한 내용은 Syndesis 커뮤니티 사이트에서 통합 커넥터 개발을 참조하십시오.
커넥터 확장의 경우 Java 코드에서 확장자 정의 JSON 파일을 자동으로 생성할 수 없습니다.
커넥터는 기본적으로 Camel 구성 요소의 프록시입니다. 커넥터는 기본 구성 요소를 구성하고 확장 정의 및 Fuse Online 웹 인터페이스에서 수집하는 사용자 제공 옵션에 따라 끝점을 생성합니다.
커넥터 확장 정의는 다음과 같은 추가 데이터 구조를 사용하여 단계 확장에 필요한 확장 정의를 확장합니다.
componentScheme
커넥터가 사용하는 Camel 구성 요소를 정의합니다. 커넥터 또는 작업에 대해
componentScheme
을 설정할 수 있습니다. 커넥터와 작업에 대해componentScheme
을 설정하면 작업에 대한 설정이 우선합니다.connectorCustomizers
ComponentProxyCustomizer 클래스를 구현하는 클래스 목록을 지정합니다. 각 클래스는 커넥터의 동작을 사용자 지정합니다. 예를 들어 클래스는 기본 구성 요소/endpoint에 적용되기 전에 속성을 조작하거나 클래스가 사전/post 엔드포인트 논리를 추가할 수 있습니다. 각 클래스에 대해 구현의 전체 클래스 이름을 지정합니다(예:
com.mycomponent.MyCustomizer
). 동작 및 커넥터에 대해connectorCustomizers
를 설정할 수 있습니다. 설정되어 있는 내용에 따라 Fuse Online은 커넥터에 사용자 지정기를 먼저 적용한 다음 작업에 적용됩니다.connectorFactory
기본 구성 요소/endpoint를 생성 및/또는 구성하는 ComponentProxyFactory 클래스를 구현하는 클래스를 정의합니다. 구현의 전체 클래스 이름을 지정합니다. 커넥터 또는 작업에 대해
connectorFactory
를 설정할 수 있습니다. 작업이 우선합니다.
Customizer 예
다음 사용자 지정기 예제에서는 개별 옵션에서 DataSource를 설정합니다.The following customizer example sets up a DataSource
from individual options:
public class DataSourceCustomizer implements ComponentProxyCustomizer, CamelContextAware { private final static Logger LOGGER = LoggerFactory.getLogger(DataSourceCustomizer.class); private CamelContext camelContext; @Override public void setCamelContext(CamelContext camelContext) { 1 this.camelContext = camelContext; } @Override public CamelContext getCamelContext() { 2 return this.camelContext; } @Override public void customize(ComponentProxyComponent component, Map<String, Object> options) { if (!options.containsKey("dataSource")) { if (options.containsKey("user") && options.containsKey("password") && options.containsKey("url")) { try { BasicDataSource ds = new BasicDataSource(); consumeOption(camelContext, options, "user", String.class, ds::setUsername); 3 consumeOption(camelContext, options, "password", String.class, ds::setPassword); 4 consumeOption(camelContext, options, "url", String.class, ds::setUrl); 5 options.put("dataSource", ds); } catch (@SuppressWarnings("PMD.AvoidCatchingGenericException") Exception e) { throw new IllegalArgumentException(e); } } else { LOGGER.debug("Not enough information provided to set-up the DataSource"); } } } }
속성 삽입의 예
customizer가 Java 8080 규칙을 준수하면 이전 예제의 이 버전에 표시된 것처럼 속성을 삽입할 수도 있습니다.
public class DataSourceCustomizer implements ComponentProxyCustomizer, CamelContextAware { private final static Logger LOGGER = LoggerFactory.getLogger(DataSourceCustomizer.class); private CamelContext camelContext; private String userName; private String password; private String url; @Override public void setCamelContext(CamelContext camelContext) { 1 this.camelContext = camelContext; } @Override public CamelContext getCamelContext() { 2 return this.camelContext; } public void setUserName(String userName) { 3 this.userName = userName; } public String getUserName() { 4 return this.userName; } public void setPassword(String password) { 5 this.password = password; } public String getPassword() { 6 return this.password; } public void setUrl(String url) { 7 this.url = url; } public String getUrl() { 8 return this.url; } @Override public void customize(ComponentProxyComponent component, Map<String, Object> options) { if (!options.containsKey("dataSource")) { if (userName != null && password != null && url != null) { try { BasicDataSource ds = new BasicDataSource(); ds.setUserName(userName); ds.setPassword(password); ds.setUrl(url); options.put("dataSource", ds); } catch (@SuppressWarnings("PMD.AvoidCatchingGenericException") Exception e) { throw new IllegalArgumentException(e); } } else { LOGGER.debug("Not enough information provided to set-up the DataSource"); } } } }
사용자 지정기를 사용하여 논리 전/후 구성
이 예와 같이 사용자 지정기를 사용하여 논리 전/후를 구성할 수 있습니다.
public class AWSS3DeleteObjectCustomizer implements ComponentProxyCustomizer { private String filenameKey; public void setFilenameKey(String filenameKey) { this.filenameKey = filenameKey; } public String getFilenameKey() { return this.filenameKey; } @Override public void customize(ComponentProxyComponent component, Map<String, Object> options) { component.setBeforeProducer(this::beforeProducer); } public void beforeProducer(final Exchange exchange) throws IOException { exchange.getIn().setHeader(S3Constants.S3_OPERATION, S3Operations.deleteObject); if (filenameKey != null) { exchange.getIn().setHeader(S3Constants.KEY, filenameKey); } } }
ComponentProxyComponent
동작 사용자 정의
ComponentProxyFactory 클래스는 기본 구성 요소/endpoint를 생성 및/또는 구성합니다. ComponentProxyFactory
가 생성하는 ComponentProxyComponent 개체의 동작을 사용자 지정하려면 다음 메서드를 재정의할 수 있습니다.
createDelegateComponent()
Syndesis는 프록시가 시작될 때 이 메서드를 호출하고, 결국
componentScheme
옵션으로 정의된 스키마를 사용하여 구성 요소의 전용 인스턴스를 생성하는 데 사용됩니다.이 메서드의 기본 동작은 커넥터/작업 옵션이 구성 요소 수준에서 적용되는지 확인하는 것입니다. 엔드포인트에서 동일한 옵션을 적용할 수 없는 경우에만 이 방법은 사용자 지정 구성 요소 인스턴스를 생성하고 해당 옵션에 따라 구성합니다.
configureDelegateComponent()
Syndesis는 위임된 구성 요소 인스턴스의 추가 동작을 구성하기 위해 사용자 지정 구성 요소 인스턴스가 생성된 경우에만 이 메서드를 호출합니다.
createDelegateEndpoint()
Syndesis는 프록시가 끝점을 생성할 때 이 메서드를 호출하고 Camel 카탈로그 기능을 사용하여 기본적으로 엔드포인트를 생성합니다.
configureDelegateEndpoint()
위임된 엔드포인트가 생성되면 Syndesis는 이 메서드를 호출하여 위임된 끝점 인스턴스의 추가 동작을 구성합니다. 예를 들면 다음과 같습니다.
public class IrcComponentProxyFactory implements ComponentProxyFactory { @Override public ComponentProxyComponent newInstance(String componentId, String componentScheme) { return new ComponentProxyComponent(componentId, componentScheme) { @Override protected void configureDelegateEndpoint(ComponentDefinition definition, Endpoint endpoint, Map<String, Object> options) throws Exception { if (!(endpoint instanceof IrcEndpoint)) { throw new IllegalStateException("Endpoint should be of type IrcEndpoint"); } final IrcEndpoint ircEndpoint = (IrcEndpoint)endpoint; final String channels = (String)options.remove("channels"); if (ObjectHelper.isNotEmpty(channels)) { ircEndpoint.getConfiguration().setChannel( Arrays.asList(channels.split(",")) ); } } }; } }
9.3.10. 라이브러리 확장을 개발하는 방법
라이브러리 확장은 런타임 시 통합에 필요한 리소스를 제공합니다. 라이브러리 확장은 Fuse Online에 단계 또는 커넥터를 제공하지 않습니다.
통합을 저장하면 통합과 포함할 하나 이상의 가져온 라이브러리 확장을 선택적으로 선택할 수 있습니다.
라이브러리 확장에서는 작업을 정의하지 않습니다. 라이브러리 확장에 대한 샘플 정의는 다음과 같습니다.
{ "schemaVersion" : "v1", "name" : "Example Library Extension", "description" : "Syndesis Extension for adding a runtime library", "extensionId" : "io.syndesis.extensions:syndesis-library", "version" : "1.0.0", "tags" : [ "my-libraries-extension" ], "extensionType" : "Libraries" }
여기에서 샘플 라이브러리 확장도 참조하십시오. https://github.com/syndesisio/syndesis-extensions
작업 부족 외에도 라이브러리 확장의 구조는 단계 또는 커넥터 확장의 구조와 동일합니다.
라이브러리 확장을 생성하는 Maven 프로젝트에서 Maven 리포지토리에서 사용할 수 없는 종속성을 추가하려면 시스템
종속성을 지정합니다. 예를 들면 다음과 같습니다.
<dependency> <groupId>com.company</groupId> <artifactId>my-library-extension</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/my-library-extension.jar</systemPath> </dependency>
9.3.11. JDBC 드라이버 라이브러리 확장 생성
Apache Derby, MySQL 및 PostgreSQL 이외의 SQL 데이터베이스에 연결하려면 연결하려는 데이터베이스에 대한 JDBC 드라이버를 래핑하는 라이브러리 확장을 생성할 수 있습니다. 이 확장을 Fuse Online에 업로드한 후 Fuse 온라인 제공 데이터베이스 커넥터는 드라이버에 액세스하여 독점 데이터베이스에 대한 연결을 검증하고 생성할 수 있습니다. 특정 데이터베이스에 대한 새 커넥터를 생성하지 않습니다.
Syndesis 오픈 소스 커뮤니티는 JDBC 드라이버를 래핑하는 확장을 생성하기 위한 프로젝트를 제공합니다.
하나의 드라이버를 확장에서만 패키지합니다. 이렇게 하면 특정 데이터베이스를 관리하는 과정의 일부로 확장을 더 쉽게 관리할 수 있습니다. 그러나 두 개 이상의 드라이버를 래핑하는 라이브러리 확장을 생성할 수 있습니다.
사전 요구 사항
Syndesis 프로젝트를 사용하려면 GitHub 계정이 있어야 합니다.
절차
다음 중 하나를 수행하여 연결하려는 데이터베이스에 대해 JDBC 드라이버에 대한 액세스를 확인하십시오.
- 드라이버가 Maven 리포지토리에 있는지 확인합니다.
- 드라이버를 다운로드합니다.
- 브라우저 탭에서 https://github.com/syndesisio/syndesis-extensions로 이동합니다.
-
syndesis-extensions
리포지토리를 GitHub 계정에 분기합니다. - 포크에서 로컬 복제본을 생성합니다.
syndesis-extensions
복제본에서 다음을 수행합니다.-
드라이버가 Maven 리포지토리에 없는 경우 드라이버를
syndesis-jdbc-driver/lib
폴더에 복사합니다. syndesis- Cryostat-jdbc-driver/pom.xml
파일을 편집합니다.-
Name
요소의 값을 이 확장에 대해 선택한 이름으로 업데이트합니다. -
Description
요소의 값을 업데이트하여 이 확장에 대한 유용한 정보를 제공합니다. -
드라이버를
syndesis-jdbc-driver/lib
로 복사한 경우pom.xml
의systemPath
가 해당 드라이버 파일을 가리키는지 확인합니다. 필요한 경우 드라이버에 따라 적절한 값을 반영하도록groupId
,artifactId
및version
을 변경합니다. -
드라이버가 Maven 리포지토리에 있는 경우 해당 Maven 종속성에 대한 참조가
pom.xml
파일에 있는지 확인합니다. -
pom.xml
파일의 나머지 내용을 검사하고 필요에 따라 관련 메타데이터를 변경합니다.
-
-
./mvnw -pl :syndesis-jdbc-driver clean 패키지를
실행하여 확장을 빌드합니다.
-
드라이버가 Maven 리포지토리에 없는 경우 드라이버를
생성된 .jar
파일은 syndesis-jdbc-driver/target
폴더에 있습니다. 이 .jar
파일을 Fuse Online의 확장자로 가져옵니다.
라이브러리 확장을 가져온 후 Fuse Online의 통합을 저장하면 선택적으로 가져온 라이브러리 확장을 선택하고 통합과 연결할 수 있습니다.