9.3. 开发 Fuse 在线扩展
如果 Fuse Online 不提供创建集成所需的功能,则专家开发人员就可以对提供所需行为的扩展进行编码。Syndesis 扩展存储库 https://github.com/syndesisio/syndesis-extensions 包含扩展示例。
商业集成商与编码扩展的开发人员共享要求。开发人员提供了一个包含 .jar
扩展的 .jar 文件。商业集成商上传 Fuse Online 中的 .jar
文件,使自定义连接器、自定义步骤或库资源可用于 Fuse Online。
Red Hat Developer Studio 的 Fuse Tooling 插件提供了一个向导,可帮助您开发步骤扩展或连接器扩展。无论您选择开发一个步骤扩展,还是在 Developer Studio 中还是在某些其他 IDE 中,最好选择开发步骤扩展。有关使用 Developer Studio 插件的详情,请参考为 Fuse Online 集成开发扩展。
在本文档中,以下主题概述了流程,描述要求,并提供您在您选择的 IDE 中开发扩展的其他示例。
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 的一部分,您必须:
-
将它们打包在扩展名 JAR 文件中,该文件位于
lib
目录中。 -
从扩展的 JSON 描述符文件的
dependencies
属性中省略它们。
步骤
- 了解扩展功能必须做什么。与您的业务沟通以了解功能要求。
- 确定您需要开发一个步骤扩展、连接器扩展还是库扩展。
- 设置 Maven 项目,在其中开发扩展。
如果您要开发一个步骤扩展:
-
决定是否将其作为 Camel 路由使用 Syndesis
Step
API 实现。Syndesis API 的信息位于 http://javadoc.io/doc/io.syndesis.extension/extension-api。 -
如果您选择将扩展实施为 Camel 路由,决定是否实现 XML 片段、
RouteBuilder
类还是 bean。 -
在 Maven 项目中,指定所需的元数据,如
schemaVersion
、扩展名称
、extensionId
等等。
-
决定是否将其作为 Camel 路由使用 Syndesis
- 对实施该功能的类进行编码。
-
向项目的
pom.xml
文件添加依赖项。 对于连接器和库扩展,以及您在 XML 中实施的步骤扩展,请创建用于定义扩展的 JSON 文件。
对于您在 Java 中实施的步骤扩展,当您在 Maven 项目中指定对应的数据结构值时,Maven 可以为您生成 JSON 扩展定义文件。
- 运行 Maven 以构建扩展并创建扩展的 JAR 文件。
- 通过将 JAR 文件上传到 Fuse 在线开发环境来测试扩展。
- 提供 JAR 文件,将扩展打包给您的业务 colleague,该文件将其上传到 Fuse 在线生产环境。当您提供 JAR 文件时,请让您的业务人员了解除 Fuse 在线 Web 界面中显示的信息以外的任何需要信息的配置设置。
9.3.2. 扩展类型的描述
扩展定义了以下之一:
- 对连接之间的集成数据操作的一个或多个自定义步骤。每个自定义步骤都执行一个操作。这是一个步骤扩展。
- 集成运行时使用的库资源。例如,库扩展可以提供 JDBC 驱动程序以连接到专有 SQL 数据库,如 Oracle。
一个单一自定义连接器,用于创建到您要集成的特定应用程序或服务的连接。这是连接器扩展。
注意Fuse Online 可以使用 OpenAPI 文档为 REST API 客户端创建连接器。请参阅 开发 REST API 客户端连接器。
商业集成商与编码扩展的开发人员共享要求。开发人员提供了一个包含 .jar
扩展的 .jar 文件。商业集成商上传 Fuse Online 中的 .jar
文件,使自定义连接器、自定义步骤或库资源可在 Fuse Online 中使用。
上传到 Fuse Online 的扩展 .jar
文件始终包含一个扩展。
有关上传和使用提供连接间数据步骤的扩展示例,请参阅 AMQ 到 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 可以生成扩展定义 | 所需的数据结构 |
---|---|---|
Java 中的步骤扩展 | 是 |
|
XML 中的步骤扩展 | 否 |
|
连接器扩展 | 否 |
|
库扩展 | 否 |
|
* 虽然规格不严格要求,但在实践中,您几乎需要指定依赖项。
通常,扩展定义文件具有以下布局:
{ "schemaVersion": "v1", "name": "", "description": "", "version": "", "extensionId": "", "extensionType": "", "properties": { }, "actions": [ ], "dependencies": [ ], }
- schemaVersion 定义扩展定义模式的版本。在内部,Syndesis 使用 schemaVersion 来确定如何将扩展定义映射到内部模型。这允许针对旧版本 Syndesis 开发的扩展部署在较新版本的 Syndesis 中。
- name 是扩展的名称。将扩展上传到 Fuse Online 时,将显示此名称。
- description 是您要指定的任何有用信息。Fuse Online 不对这个值进行操作。
- 版本 是为了方便您区分对扩展的更新。Fuse Online 不对这个值进行操作。
- extensionId 为扩展定义唯一 ID。这应该至少可在 Syndesis 环境中唯一。
extensionType 表示扩展所提供的扩展。从 Syndesis 版本 1.3 开始,支持以下扩展类型:
-
步骤
-
连接器
-
库
-
需要连接器扩展中的顶级 属性。它控制 Fuse Online 用户在 Fuse Online 用户选择创建连接的连接器时显示的内容。
这个属性
对象包含用于创建连接的每个表单控制的一组属性。例如:"myControlName": { "deprecated": true|false, "description": "", "displayName": "", "group": "", "kind": "", "label": "", "required": true|false, "secret": true|false, "javaType": "", "type": "", "defaultValue": "", "enum": { } }
在连接器扩展中,嵌套属性对象定义了 HTML 表单控制来配置连接操作。
在步骤扩展中
,
action 对象包含一个properties
对象。properties
对象定义了一组属性,用于配置步骤的每个表单控制。另请参阅: 用户界面属性的描述。操作 定义了连接器可以执行的操作,或者连接间步骤可以执行的操作。只有连接器和步骤扩展使用您指定的操作。操作规格的格式类似如下:
{ "id": "", "name": "", "description": "", "actionType": "step|connector", "descriptor": { } }
- id 是操作的唯一 ID。这应该至少在 Syndesis 环境中唯一。
- name 是 Fuse Online 中出现的操作名称。整合商将此值视为连接操作的名称,或作为连接之间集成数据运行的步骤名称。
- description 是 Fuse Online 中显示的操作描述。使用此字段帮助集成商了解该操作的作用。
- actionType 指示通过连接执行该操作还是连接之间的步骤。
-
描述符 指定嵌套属性,如
kind
,entrypoint
,inputDataType
,outputDatatype
等。
依赖项 定义此扩展需要 Fuse 在线提供的资源。
定义依赖项,如下所示:
{ "type": "MAVEN", "id" : "org.apache.camel:camel-telegram:jar:2.21.0" }
- type 表示依赖项的类型。指定 MAVEN。(预计将来将支持其他类型。)
- ID 是 Maven 依赖项的 ID,它是一个 Maven GAV。
9.3.5. 用户界面属性的描述
在连接器扩展和步骤扩展中,在扩展定义 JSON 文件或 Java 类文件中指定用户界面属性。这些属性的设置定义 HTML 表单控制 Fuse Online 在 Fuse Online 用户创建连接时显示,配置连接操作,或者配置扩展提供的步骤。
您必须为每个要出现在 Fuse Online 控制台中的扩展用户界面中的表单控制指定属性。对于每个表单控制,按任何顺序指定 some 或 all 属性。
用户界面属性规格示例
在作为 IRC 连接器一部分的 JSON 文件中,顶级 属性
对象定义了在 Fuse Online 用户选择 IRC 连接器来创建连接的 HTML 表单控制。三种形式有三组属性定义: 主机名
、密码
和端口
:
"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 创建一个 IRC 连接,该连接配置了 Fuse Online 用户输入的值。
关于扩展定义 JSON 文件中的 属性
对象
在连接器扩展中:
-
顶级
属性
对象是必需的。它控制 Fuse Online 用户在 Fuse Online 用户选择创建连接的连接器时显示的内容。这个属性
对象包含用于创建连接的每个表单控制的一组属性。 -
在
actions
对象中,每个操作都有一个properties
对象。在每个属性
对象中,每个表单控制都有一组属性来配置该操作。
在步骤扩展中,action
对象包含一个 properties
对象。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 表单控制的可能输入类型。在控制的一组属性中,如果您指定了一个未知的 type
值,Fuse Online 会显示一个接受一行文本的输入字段。也就是说,默认值为 "type": "text
"。
type 属性的值 | HTML | Fuse Online 显示 |
---|---|---|
|
| 用户可以选择或无法选择的复选框。 |
|
允许 Fuse Online 用户选择一整时间的自定义控制:毫秒、秒、分钟、小时或天。用户也输入数字,Fuse Online 返回了几毫秒。例如: | |
|
| 此字段不会出现在 Fuse Online 控制台中。您可以使用其他属性指定与此字段关联的数据,例如某些类型的文本数据。虽然 Fuse Online 用户无法查看或修改此数据,如果用户为 Fuse Online 页面选择 View Source,但隐藏的字段在源显示中可见。因此,不要将隐藏字段用于安全目的。 |
|
| 接受数字的输入字段。 |
|
| Fuse Online 屏蔽用户输入的字符的输入字段,通常是星号。 |
|
一个 & |
带有您在表单控制的 |
|
| 接受一行文本的输入字段。 |
|
| 使用 textarea 元素 |
控制格式用户界面属性的描述
在连接器或步骤扩展中,对于 Fuse Online 控制台中的每个 HTML 表单控制,您可以指定下表中描述的一个或多个属性。有关 HTML 表单输入类型的详情,请参考 https://www.w3schools.com/html/html_form_input_types.asp。
属性名称 | 类型 | 描述 |
---|---|---|
| 字符串 | 控制 Fuse 在线显示的表单控制。详情请查看上表。 |
| number |
如果为 |
| 字符串 |
如果设置,该值将映射到表单控制元素的 HTML |
| 数组 |
如果 |
|
根据 |
Fuse Online 最初在表单字段中显示这个值。 |
| 字符串 | 如果设置,Fuse Online 会在表单控制的下面显示这个值。通常,这是关于控制的简短有用消息。 |
| 字符串 | Fuse Online 显示这个值。 |
| 数组 |
如果设置,Fuse Online 会覆盖 |
| 字符串 |
如果设置,显示名称旁边会出现 |
| number |
如果为 |
| number |
如果为 |
| 布尔值 |
如果为 |
| number |
决定 Fuse 在线控制台中的控制顺序。Fuse Online 应用升序,即首先出现 |
| 字符串 | 如果设置,Fuse Online 会在输入字段中的 hazed font 中显示这个值,以帮助用户了解预期的输入。 |
| 布尔值 |
控制控制上是否设置了所需的属性。 |
| number |
如果 |
| 布尔值 |
如果指定,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 生成 JSON 扩展定义文件,该文件将在生成的 JAR 文件中,如下所示:
Maven 从数据结构规格开始,如果位于
META-INF/syndesis/syndesis/syndesis-extension-definition.json
文件中。如果要在 XML 中编码,则必须自行定义扩展定义 JSON 文件,并且必须指定所有必需的数据结构。
如果要开发连接器或库扩展,则必须自行定义扩展定义 JSON 文件,并且必须指定所有必需的数据结构。
如果要在 Java 中开发步骤扩展,您可以:
- 自行创建扩展定义 JSON 文件。
- 在 Java 代码中,指定定义所有所需的数据结构的注解。您不创建扩展定义 JSON 文件。
- 创建扩展定义 JSON 文件,并指定一些但并非所有数据结构。
- 对于您使用 Java 开发的步骤扩展,Maven 从代码注解中获取缺少的规格
-
Maven 添加依赖项列表,指定提供范围提供的依赖项,并且通过
extension-bom
管理。
repackage-extension 软件包扩展。
-
不通过
extension-bom
管理的依赖项和相关传输依赖关系位于生成的 JAR 的lib
文件夹中。 -
对于库扩展,其范围为
system
的依赖项位于生成的 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. 如何在扩展中指定数据形成
数据形成包含数据映射器使用的数据类型元数据。数据映射器将此元数据转换为内部文档,用于显示数据映射器用户界面中的源和目标数据字段。在连接器或自定义步骤的扩展定义 JSON 文件中,每个操作规格都会定义一个输入数据(inputDataShape
)和一个输出数据组成(outputDataShape
)。
当您开发扩展时,务必要指定数据形成的属性,允许数据映射器正确处理和显示源和目标字段。以下数据形成的属性会影响数据映射程序行为:
-
kind
-
type
-
规格
-
name
-
description
关于 kind
属性
data form kind
属性由 DataShapeKinds
enum 表示。kind
属性的可能值为:
any
表示数据类型不是结构化的。例如,它可能是字节数组或自由格式文本。当其kind
属性设为任何
时,数据映射程序会忽略数据。换句话说,数据不会出现在数据映射程序中,因此您无法将任何字段映射到或来自这些数据。但是,对于自定义连接器,当其
kind
属性设置为任何
时,Fuse Online 会提示您在配置从自定义连接器创建的连接时指定输入和输出数据类型。当您向集成添加连接时会出现这种情况。您可以指定数据表单的模式类型、您指定的模式类型的适当文档,以及数据类型的名称。-
none
表示没有数据类型。对于形成输入数据,这表示连接或步骤不会读取数据。对于一个输出数据,这表示连接或步骤不会修改数据。例如,当输入消息正文传输到输出消息正文时,将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 模式作为 data 组成的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 实例作为 datamed 的specification
属性的值。例如:"inputDataShape": { "description": "Person data", "kind": "json-instance", "name": "Person", "specification": "{\"firstName\":\"John\",...}" }
xml-schema
表示数据类型由 XML 模式表示。当kind
设为xml-schema
时,指定 XML Schema 作为 datamed 的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 实例指定为 datamed 的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 实例指定为 datamed 的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 数据的标题行中重复名称。
allow Missing Column Names
allowMissingColumnNames
在解析 CSV 数据的标头行时,允许缺少列名称。
注释标记
commentMarker
指定指示 CSV 数据中注释行开头的字符。
Delimiter
delimiter
指定去除 CSV 数据中值(通常是 ";"、"," 或 "\t")的字符。
Escape
Escape
指定 CSV 数据的转义字符。
第一个记录作为标头
firstRecordAsHeader
使用 CSV 数据中的第一个记录作为标题行。
忽略空行
ignoreEmptyLines
忽略 CSV 数据中的任何空行。
忽略标头问题单
ignoreHeaderCase
忽略 CSV 数据的标头行中的字母大小写。
忽略 Surrounding Spaces
ignoreSurroundingSpaces
忽略 CSV 数据周围的任何空格字符。
null 字符串
nullString
指定 CSV 数据中转换到 null 时使用的字符串。
跳过标头记录
skipHeaderRecord
跳过 CSV 数据中的标头记录。
关于 type
属性
当 kind
属性的值为 java
时,"kind": "java"
声明将后跟一个 type
声明,用于指定完全限定的 Java 类名称。例如:
"outputDataShape": { "kind": "java", "type": "org.apache.camel.component.telegram.model.IncomingMessage" },
当 kind
属性设为 java
以外的任何设置时,会忽略 type
属性的任何设置。
关于 规格
属性
kind
属性的设置决定了 规格
属性的设置,如下表所示。
kind 属性设置 | 规格 属性设置 |
---|---|
| Java 检查结果.
对于您在 Java 中写入的每个扩展,请使用
提醒,对于使用 Java 编写的步骤扩展, |
| 实际 JSON 模式文档。此设置不能是文档的引用,JSON 模式无法通过参考方式指向其他 JSON 架构文档。 |
| 包含示例数据的实际 JSON 文档。数据映射器从示例数据中获取数据类型。此设置不能是文档的引用。 |
| 实际的 XML 模式文档。此设置不能是文档的引用,XML 模式无法通过参考方式指向其他 XML 模式文档。 |
| 实际的 XML 实例文档。此设置不能是文档的引用。 |
| 实际的 CSV 实例文档。此设置不能是文档的引用。 |
|
不需要 |
|
不需要 |
关于 name
属性
data form name
属性指定数据类型的人类可读名称。数据映射器在其用户界面中显示此名称作为数据字段的标签。在以下镜像中,Person 是看到 name
属性的值的示例。
此名称也会出现在 Fuse Online 流视觉化的数据类型指示符中。
关于 description
属性
datamed description
属性指定当光标悬停在数据映射器用户界面中数据类型名称时显示为工具提示的文本。
9.3.8. 开发步骤扩展示例
步骤扩展实现了一个或多个自定义步骤。每个自定义步骤都实施一个用于在连接之间处理集成数据的操作。以下示例演示了开发步骤扩展的替代方案:
Syndesis 提供自定义 Java 注解,您可以将这些注解与 syndesis-extension-plugin
一起使用。当您在 Java 中实现步骤扩展或连接器扩展时,您可以指定启用 Maven 的注解来向扩展定义中添加操作定义。要启用注解处理,请在 Maven 项目中添加以下依赖项:
<dependency> <groupId>io.syndesis.extension</groupId> <artifactId>extension-annotation-processor</artifactId> <optional>true</optional> </dependency>
由于 Spring Boot 是集成运行时,因此要将 Bean 注入 Camel 上下文,因此请务必遵循标准的 Spring Boot 实践。例如,创建一个自动配置类,并在那里创建 Bean。但是,默认行为是扩展代码不受到软件包扫描的影响。因此,您必须在步骤扩展中创建并填充 META-INF/spring.factories
文件。
9.3.8.1. 使用 XML 片段开发 Camel 路由示例
要开发自定义步骤,您可以将该操作作为 XML 片段实施,该片段是一个 Camel 路由,具有输入,如 direct
。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" } } } ] } }
Syndesis 不支持完整的 Camel XML 配置。Syndesis 仅支持 <routes> 标签。
9.3.8.2. 使用 RouteBuilder
开发 Camel 路由示例
您可以通过开发一个操作作为 Camel 路由来实现自定义步骤,并支持 RouteBuilder
类。此类路由具有一个输入,如 直接
。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(); } }
此 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" }
9.3.8.3. 使用 RouteBuilder
和 Spring Boot 开发 Camel 路由示例
您可以通过开发一个操作作为 Camel 路由来实现自定义步骤,并支持 RouteBuilder
类和 Spring Boot。在本例中,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(); } }; } }
此 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" }
要使配置类可以被 Spring Boot 发现,您必须将它们列在名为 META-INF/spring.factories
的文件中,例如:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.company.ActionsConfiguration
使用 Spring Boot 时,您最终在配置类中注册的每个 bean 都可用于 Camel 上下文。详情请参阅 Spring Boot 文档来创建自己的自动配置。
9.3.8.4. 使用 Camel bean 的示例
您可以通过开发一个操作作为 Camel bean 处理器来实现自定义步骤。要实现示例,它会创建一个步骤,该步骤使用可选前缀记录消息的正文,您可以写类似如下的内容:
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" }
使用 Bean 时,您可能会发现将用户属性注入到 bean 中,而不是从交换标头中检索它们。为此,请实施您要注入的属性的 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. 使用 Syndesis Step API 的示例
您可以使用 Syndesis Step
API 实施自定义步骤。这提供了一种与运行时路由创建交互的方法。您可以使用 ProcessorDefinition
类提供的任何方法,您可以创建更复杂的路由。Syndesis API 的信息位于 http://javadoc.io/doc/io.syndesis.extension/extension-api。
以下是使用 Syndesis Step
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 社区站点上的开发 Syndesis 连接器。
对于连接器扩展,还没有从 Java 代码自动生成扩展定义 JSON 文件。
连接器本质上是 Camel 组件的代理。连接器配置底层组件,并根据在扩展定义中定义的选项以及 Fuse Online Web 界面收集的用户提供的选项来创建端点。
连接器扩展定义通过以下附加数据结构扩展步骤扩展所需的扩展定义:
componentScheme
定义连接器使用的 Camel 组件。您可以为连接器或操作设置
componentScheme
。如果您为连接器和操作设置了componentScheme
,则操作的设置具有优先权。connectorCustomizers
指定实现 component ProxyCustomizer 类的类列表。每个类自定义连接器的行为。例如,一个类可能会在应用到底层组件/端点前操作属性,或者类可能会添加 pre/post 端点逻辑。对于每个类,指定实现的完整类名称,例如
com.mycomponent.MyCustomizer
。您可以对操作以及连接器设置connectorCustomizers
。根据设置的内容,Fuse Online 首先对连接器应用定制程序,然后用于操作。connectorFactory
定义实现 ComponentProxyFactory 类的类,它创建和/或配置底层组件/端点。指定实现的完整类名称。您可以为连接器或操作设置
connectorFactory
。操作具有优先权。
Customizer 示例
以下自定义器示例从独立选项设置 DataSource
:
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"); } } } }
注入属性的示例
如果自定义器遵循 Java bean 惯例,您也可以注入属性,如上例的修订版本所示:
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"); } } } }
使用自定义器配置 before/after 逻辑
您可以使用自定义器配置 before/after 逻辑,如下例所示:
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); } } }
自定义 component ProxyComponent
的行为
ComponentProxyFactory 类创建和/或配置底层组件/端点。要自定义 component ProxyComponent 对象 的行为
,您可以使用以下方法覆盖任何方法:
createDelegateComponent()
当代理启动时,Syndesis 调用此方法,并最终使用
componentScheme
选项定义的方案来创建专用组件实例。这个方法的默认行为是确定任何连接器/操作选项是否适用于组件级别。只有在端点中无法应用同一选项时,该方法才会创建一个自定义组件实例,并根据适用的选项进行配置。
configureDelegateComponent()
只有在创建了自定义组件实例来配置委派的组件实例的额外行为时,才会调用此方法。
createDelegateEndpoint()
当代理创建端点并且默认使用 Camel 目录设施创建端点时,Syndesis 调用此方法。
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 Online 提供的数据库连接器可以访问驱动程序来验证和创建与专有数据库的连接。您不会为特定数据库创建新连接器。
Syndesis 开源社区提供了一个项目,用于创建打包 JDBC 驱动程序的扩展。
仅在扩展中打包一个驱动程序。这样可以更轻松地管理扩展,作为管理特定数据库的一部分。但是,您可以创建一个库扩展来打包多个驱动程序。
先决条件
要使用 Syndesis 项目,您必须有一个 GitHub 帐户。
步骤
通过执行以下操作之一来确保访问您要连接的数据库的 JDBC 驱动程序:
- 确认驱动程序位于 Maven 存储库中。
- 下载驱动程序。
- 在浏览器标签页中,进入 https://github.com/syndesisio/syndesis-extensions
-
将
syndesis-extensions
存储库派生到您的 GitHub 帐户。 - 从 fork 创建本地克隆。
在
syndesis-extensions
clone 中:-
如果驱动程序不在 Maven 存储库中,请将驱动程序复制到
syndesis-library-jdbc-driver/lib
文件夹中。 编辑
syndesis-library-jdbc-driver/pom.xml
文件:-
将
Name
元素的值更新为您为这个扩展选择的名称。 -
更新
Description
元素的值,以提供有关此扩展的有用信息。 -
如果您将驱动程序复制到
syndesis-library-jdbc-driver/lib
中,请确保pom.xml
中的systemPath
指向该驱动程序文件。(可选)更改groupId
、artifactId
和version
,以根据驱动程序反映正确的值。 -
如果驱动程序位于 Maven 存储库中,请确保对 Maven 依赖项的引用位于
pom.xml
文件中。 -
检查
pom.xml
文件的其余部分,并根据需要更改所有相关元数据。
-
将
-
执行
./mvnw -pl :syndesis-library-jdbc-driver clean 软件包
以构建扩展。
-
如果驱动程序不在 Maven 存储库中,请将驱动程序复制到
生成的 .jar
文件位于 syndesis-library-jdbc-driver/target
文件夹中。将此 .jar
文件作为 Fuse Online 中的扩展导入。
导入库扩展后,当您在 Fuse Online 中保存集成时,您可以选择导入的库扩展并将其与集成相关联。