Camel Spring Boot 参考 3.14
Camel Spring Boot 参考
fuse-docs-support@redhat.com
Integration Support Team
http://access.redhat.com/support 摘要
前言
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
第 1 章 AWS CloudWatch
仅支持制作者
AWS2 Cloudwatch 组件允许消息发送到 Amazon CloudWatch 指标。Amazon API 的实现由 AWS SDK 提供。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并被签名才能使用 Amazon CloudWatch。如需更多信息,请参阅 Amazon CloudWatch。
1.1. URI 格式
aws2-cw://namespace[?options]
如果指标不存在,则会创建它们。您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
1.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
1.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
1.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
1.3. 组件选项
AWS CloudWatch 组件支持 18 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonCwClient (生成器) | Autowired 使用 AmazonCloudWatch 作为客户端。 | CloudWatchClient | |
| 配置 (生成器) | 组件配置。 | Cw2Configuration | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| Name (producer) | 指标名称。 | 字符串 | |
| overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| proxyHost (producer) | 在实例化 CW 客户端时定义代理主机。 | 字符串 | |
| proxyPort (producer) | 在实例化 CW 客户端时定义代理端口。 | 整数 | |
| proxyprotocol (producer) | 在实例化 CW 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| 区域 (生成者) | CW 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| 时间戳 (生成器) | 指标时间戳。 | instant | |
| trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| 单元 (生成者) | 指标单元。 | 字符串 | |
| uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (producer) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
| 值 (生成者) | 指标值。 | 双 | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
1.4. 端点选项
AWS CloudWatch 端点使用 URI 语法进行配置:
aws2-cw:namespace
使用以下路径和查询参数:
1.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 命名空间 (生成器) | 所需的 指标命名空间。 | 字符串 |
1.4.2. 查询参数(16 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonCwClient (生成器) | Autowired 使用 AmazonCloudWatch 作为客户端。 | CloudWatchClient | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| Name (producer) | 指标名称。 | 字符串 | |
| overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| proxyHost (producer) | 在实例化 CW 客户端时定义代理主机。 | 字符串 | |
| proxyPort (producer) | 在实例化 CW 客户端时定义代理端口。 | 整数 | |
| proxyprotocol (producer) | 在实例化 CW 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| 区域 (生成者) | CW 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| 时间戳 (生成器) | 指标时间戳。 | instant | |
| trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| 单元 (生成者) | 指标单元。 | 字符串 | |
| uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (producer) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
| 值 (生成者) | 指标值。 | 双 | |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
所需的 CW 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonCwClient,才能访问 Amazon 的 CloudWatch。
1.5. 使用方法
1.5.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java system properties - aws.accessKeyId and aws.secretKey
- 环境变量 - AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。
- AWS STS 的 Web Identity Token。
- 共享凭证和配置文件。
- Amazon ECS 容器凭证 - 如果设置了环境变量 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,则从 Amazon ECS 加载。
- Amazon EC2 实例配置集凭据。
有关此信息的更多信息,您可以查看 AWS 凭证文档
1.5.2. 由 CW producer 评估的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| Amazon CW 指标名称。 |
|
|
| Amazon CW 指标值。 |
|
|
| Amazon CW 指标单元。 |
|
|
| Amazon CW 指标命名空间。 |
|
|
| Amazon CW 指标时间戳。 |
|
|
| Amazon CW 指标维度名称。 |
|
|
| Amazon CW 指标维度值。 |
|
|
| 维度名称和维度值的映射. |
1.5.3. 高级 CloudWatchClient 配置
如果您需要对 CloudWatchClient 实例配置进行更多控制,您可以创建自己的实例并从 URI 引用它:
from("direct:start")
.to("aws2-cw://namespace?amazonCwClient=#client");
#client 指的是 Registry 中的 CloudWatchClient。
1.6. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws2-cw</artifactId>
<version>${camel-version}</version>
</dependency>
其中 {camel-version} 必须替换为 Camel 的实际版本。
1.7. 例子
1.7.1. 制作者示例
from("direct:start")
.to("aws2-cw://http://camel.apache.org/aws-cw");和发送类似内容
exchange.getIn().setHeader(Cw2Constants.METRIC_NAME, "ExchangesCompleted"); exchange.getIn().setHeader(Cw2Constants.METRIC_VALUE, "2.0"); exchange.getIn().setHeader(Cw2Constants.METRIC_UNIT, "Count");
1.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-cw 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-aws2-cw-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 19 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.aws2-cw.access-key | Amazon AWS 访问密钥. | 字符串 | |
| camel.component.aws2-cw.amazon-cw-client | 将 AmazonCloudWatch 用作客户端。选项是一个 software.amazon.awssdk.services.cloudwatch.CloudWatchClient 类型。 | CloudWatchClient | |
| camel.component.aws2-cw.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.aws2-cw.configuration | 组件配置。选项是 org.apache.camel.component.aws2.cw.Cw2Configuration 类型。 | Cw2Configuration | |
| camel.component.aws2-cw.enabled | 是否启用 aws2-cw 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.aws2-cw.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.aws2-cw.name | 指标名称。 | 字符串 | |
| camel.component.aws2-cw.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| camel.component.aws2-cw.proxy-host | 在实例化 CW 客户端时定义代理主机。 | 字符串 | |
| camel.component.aws2-cw.proxy-port | 在实例化 CW 客户端时定义代理端口。 | 整数 | |
| camel.component.aws2-cw.proxy-protocol | 在实例化 CW 客户端时定义代理协议。 | 协议 | |
| camel.component.aws2-cw.region | CW 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| camel.component.aws2-cw.secret-key | Amazon AWS 机密密钥. | 字符串 | |
| camel.component.aws2-cw.timestamp | 指标时间戳。选项是一个 java.time.Instant 类型。 | instant | |
| camel.component.aws2-cw.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| camel.component.aws2-cw.unit | 指标单元。 | 字符串 | |
| camel.component.aws2-cw.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| camel.component.aws2-cw.use-default-credentials-provider | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
| camel.component.aws2-cw.value | 指标值。 | 双 |
第 2 章 AWS DynamoDB
仅支持制作者
AWS2 DynamoDB 组件支持从/向服务存储和检索数据。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并签名以使用 Amazon DynamoDB。如需更多信息,请参阅 Amazon DynamoDB。
2.1. URI 格式
aws2-ddb://domainName[?options]
您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
2.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
2.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
2.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
2.3. 组件选项
AWS DynamoDB 组件支持 22 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonDDBClient (生成器) | Autowired 使用 AmazonDynamoDB 作为客户端。 | DynamoDbClient | |
| 配置 (生成器) | 组件配置。 | Ddb2Configuration | |
| consistentRead (producer) | 决定在读取数据时是否应强制执行强一致性。 | false | 布尔值 |
| enabledInitialDescribeTable (producer) | 设置 DDB 端点中是否必须完成的初始 Describe 表操作,还是不完成。 | true | 布尔值 |
| keyAttributeName (producer) | 创建表时的属性名称。 | 字符串 | |
| keyAttributeType (producer) | 创建表时的属性类型。 | 字符串 | |
| keyScalarType (producer) | key scalar 类型,可以是 S (字符串)、N (Number)和 B (Bytes)。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 操作 (生成) | 要执行的操作。 Enum 值:
| PutItem | Ddb2Operations |
| overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| proxyHost (producer) | 在实例化 DDB 客户端时定义代理主机。 | 字符串 | |
| proxyPort (producer) | DynamoDB 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 整数 | |
| proxyprotocol (producer) | 在实例化 DDB 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| readCapacity (producer) | 要从您的表中读取资源的置备吞吐量。 | Long | |
| 区域 (生成者) | DDB 客户端需要工作的区域。 | 字符串 | |
| trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (producer) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
| writeCapacity (producer) | 为向表写入资源而保留置备的吞吐量。 | Long | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
2.4. 端点选项
AWS DynamoDB 端点使用 URI 语法进行配置:
aws2-ddb:tableName
使用以下路径和查询参数:
2.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| tableName (producer) | 需要 当前有效的表的名称。 | 字符串 |
2.4.2. 查询参数(20 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonDDBClient (生成器) | Autowired 使用 AmazonDynamoDB 作为客户端。 | DynamoDbClient | |
| consistentRead (producer) | 决定在读取数据时是否应强制执行强一致性。 | false | 布尔值 |
| enabledInitialDescribeTable (producer) | 设置 DDB 端点中是否必须完成的初始 Describe 表操作,还是不完成。 | true | 布尔值 |
| keyAttributeName (producer) | 创建表时的属性名称。 | 字符串 | |
| keyAttributeType (producer) | 创建表时的属性类型。 | 字符串 | |
| keyScalarType (producer) | key scalar 类型,可以是 S (字符串)、N (Number)和 B (Bytes)。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 操作 (生成) | 要执行的操作。 Enum 值:
| PutItem | Ddb2Operations |
| overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| proxyHost (producer) | 在实例化 DDB 客户端时定义代理主机。 | 字符串 | |
| proxyPort (producer) | DynamoDB 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 整数 | |
| proxyprotocol (producer) | 在实例化 DDB 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| readCapacity (producer) | 要从您的表中读取资源的置备吞吐量。 | Long | |
| 区域 (生成者) | DDB 客户端需要工作的区域。 | 字符串 | |
| trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (producer) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
| writeCapacity (producer) | 为向表写入资源而保留置备的吞吐量。 | Long | |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
所需的 DDB 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonDDBClient,才能访问 Amazon 的 DynamoDB。
2.5. 使用方法
2.5.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java system properties - aws.accessKeyId and aws.secretKey
- 环境变量 - AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。
- AWS STS 的 Web Identity Token。
- 共享凭证和配置文件。
- Amazon ECS 容器凭证 - 如果设置了环境变量 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,则从 Amazon ECS 加载。
- Amazon EC2 实例配置集凭据。
有关此信息的更多信息,您可以查看 AWS 凭证文档
2.5.2. 由 DDB producer 评估的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 表名称和对应项目的映射,由主密钥获取。 |
|
|
| 此操作的表名称。 |
|
|
| 唯一标识表中的每个项目的主要键。 |
|
|
| 如果您要在修改前或之后获取属性 name-value 对(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW),则使用此参数。 |
|
|
| 为条件修改指定属性。 |
|
|
| 如果没有指定属性名称,则返回所有属性。 |
|
|
| 如果设置为 true,则会发出一致的读取,否则最终会使用一致性。 |
|
|
| 如果设置将用作查询操作的 Secondary Index。 |
|
|
| 项目的属性映射,必须包含定义项目的主要键值。 |
|
|
| 如果设置为 true,Amazon DynamoDB 会返回与查询参数匹配的项目总数,而不是匹配的项目及其属性的列表。 |
|
|
| 此标头指定查询的选择条件,并合并两个旧的标头 CamelAwsDdbHashKeyValue 和 CamelAwsDdbScanRangeKeyCondition |
|
|
| 项目的主密钥,以便从中继续之前的查询。 |
|
|
| 复合主密钥的 hash 组件的值。 |
|
|
| 要返回的项目的最大数量。 |
|
|
| 用于查询的属性值和比较运算符的容器。 |
|
|
| 指定索引的正向和反向遍历。 |
|
|
| 评估扫描结果,仅返回所需的值。 |
|
|
| 将属性名称映射到更新的新值和操作。 |
2.5.3. 在 BatchGetItems 操作过程中设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 表中表名称和对应的项目属性。 |
|
|
| 包含表映射及其对应的键,这些键没有使用当前响应进行处理。 |
2.5.4. 在 DeleteItem 操作过程中设置消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 操作返回的属性列表。 |
2.5.5. 在 DeleteTable 操作过程中设置消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
| ||
|
| 此表的 ProvisionedThroughput 属性的值 | |
|
|
| 此表的创建日期时间. |
|
|
| 表的项目数。 |
|
|
| 标识此表的主键的 KeySchema。在 Camel 2.16.0 中,此标头的类型是 List<KeySchemaElement> 而不是 KeySchema |
|
|
| 表名称。 |
|
|
| 表大小(以字节为单位)。 |
|
|
| 表的状态:CREATING, UPDATING, DELETING, ACTIVE |
2.5.6. 在 DescribeTable 操作过程中设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
| \{{ProvisionedThroughputDescription}} | 此表的 ProvisionedThroughput 属性的值 |
|
|
| 此表的创建日期时间. |
|
|
| 表的项目数。 |
|
| \{{KeySchema}} | 标识此表的主键的 KeySchema。 |
|
|
| 表名称。 |
|
|
| 表大小(以字节为单位)。 |
|
|
| 表的状态:CREATING, UPDATING, DELETING, ACTIVE |
|
|
| 此表的 ReadCapacityUnits 属性。 |
|
|
| 此表的 WriteCapacityUnits 属性。 |
2.5.7. 在 GetItem 操作过程中设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 操作返回的属性列表。 |
2.5.8. 在 PutItem 操作过程中设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 操作返回的属性列表。 |
2.5.9. 在 Query 操作过程中设置消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 操作返回的属性列表。 |
|
|
| 查询操作停止的项目的主要键,其中包含上一个结果集。 |
|
|
| 操作期间消耗的表的置备吞吐量数。 |
|
|
| 响应中的项目数。 |
2.5.10. 扫描操作期间设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 操作返回的属性列表。 |
|
|
| 查询操作停止的项目的主要键,其中包含上一个结果集。 |
|
|
| 操作期间消耗的表的置备吞吐量数。 |
|
|
| 响应中的项目数。 |
|
|
| 应用任何过滤器前,完成扫描中的项目数。 |
2.5.11. 在 UpdateItem 操作过程中设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 操作返回的属性列表。 |
2.5.12. 高级 AmazonDynamoDB 配置
如果您需要对 AmazonDynamoDB 实例配置进行更多控制,您可以创建自己的实例并从 URI 引用它:
from("direct:start")
.to("aws2-ddb://domainName?amazonDDBClient=#client");
#client 指的是 Registry 中的 DynamoDbClient。
2.6. 支持的制作者操作
- BatchGetItems
- DeleteItem
- DeleteTable
- DescribeTable
- GetItem
- PutItem
- 查询
- 扫描
- UpdateItem
- UpdateTable
2.7. 例子
2.7.1. 制作者示例
- PutItem:此操作将在 DynamoDB 中创建一个条目
from("direct:start")
.setHeader(Ddb2Constants.OPERATION, Ddb2Operations.PutItem)
.setHeader(Ddb2Constants.CONSISTENT_READ, "true")
.setHeader(Ddb2Constants.RETURN_VALUES, "ALL_OLD")
.setHeader(Ddb2Constants.ITEM, attributeMap)
.setHeader(Ddb2Constants.ATTRIBUTE_NAMES, attributeMap.keySet());
.to("aws2-ddb://" + tableName + "?keyAttributeName=" + attributeName + "&keyAttributeType=" + KeyType.HASH
+ "&keyScalarType=" + ScalarAttributeType.S
+ "&readCapacity=1&writeCapacity=1");Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws2-ddb</artifactId>
<version>${camel-version}</version>
</dependency>
其中 3.14.2 必须替换为 Camel 的实际版本。
2.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-ddb 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-aws2-ddb-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 40 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.aws2-ddb.access-key | Amazon AWS 访问密钥. | 字符串 | |
| camel.component.aws2-ddb.amazon-d-d-b-client | 使用 AmazonDynamoDB 作为客户端。选项是一个 software.amazon.awssdk.services.dynamodb.DynamoDbClient 类型。 | DynamoDbClient | |
| camel.component.aws2-ddb.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.aws2-ddb.configuration | 组件配置。选项是 org.apache.camel.component.aws2.ddb.Ddb2Configuration 类型。 | Ddb2Configuration | |
| camel.component.aws2-ddb.consistent-read | 决定在读取数据时是否应强制执行强一致性。 | false | 布尔值 |
| camel.component.aws2-ddb.enabled | 是否启用 aws2-ddb 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.aws2-ddb.enabled-initial-describe-table | 设置 DDB 端点中是否必须完成的初始 Describe 表操作,还是不完成。 | true | 布尔值 |
| camel.component.aws2-ddb.key-attribute-name | 创建表时的属性名称。 | 字符串 | |
| camel.component.aws2-ddb.key-attribute-type | 创建表时的属性类型。 | 字符串 | |
| camel.component.aws2-ddb.key-scalar-type | key scalar 类型,可以是 S (字符串)、N (Number)和 B (Bytes)。 | 字符串 | |
| camel.component.aws2-ddb.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.aws2-ddb.operation | 要执行的操作。 | Ddb2Operations | |
| camel.component.aws2-ddb.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| camel.component.aws2-ddb.proxy-host | 在实例化 DDB 客户端时定义代理主机。 | 字符串 | |
| camel.component.aws2-ddb.proxy-port | DynamoDB 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 整数 | |
| camel.component.aws2-ddb.proxy-protocol | 在实例化 DDB 客户端时定义代理协议。 | 协议 | |
| camel.component.aws2-ddb.read-capacity | 要从您的表中读取资源的置备吞吐量。 | Long | |
| camel.component.aws2-ddb.region | DDB 客户端需要工作的区域。 | 字符串 | |
| camel.component.aws2-ddb.secret-key | Amazon AWS 机密密钥. | 字符串 | |
| camel.component.aws2-ddb.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| camel.component.aws2-ddb.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| camel.component.aws2-ddb.use-default-credentials-provider | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
| camel.component.aws2-ddb.write-capacity | 为向表写入资源而保留置备的吞吐量。 | Long | |
| camel.component.aws2-ddbstream.access-key | Amazon AWS 访问密钥. | 字符串 | |
| camel.component.aws2-ddbstream.amazon-dynamo-db-streams-client | 用于此端点的所有请求的 Amazon DynamoDB 客户端。选项是一个 software.amazon.awssdk.services.dynamodb.streams.DynamoDbStreamsClient 类型。 | DynamoDbStreamsClient | |
| camel.component.aws2-ddbstream.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.aws2-ddbstream.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.aws2-ddbstream.configuration | 组件配置。选项是 org.apache.camel.component.aws2.ddbstream.Ddb2StreamConfiguration 类型。 | Ddb2StreamConfiguration | |
| camel.component.aws2-ddbstream.enabled | 是否启用 aws2-ddbstream 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.aws2-ddbstream.max-results-per-request | 每次轮询中将获取的最大记录数。 | 整数 | |
| camel.component.aws2-ddbstream.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| camel.component.aws2-ddbstream.proxy-host | 在实例化 DDBStreams 客户端时定义代理主机。 | 字符串 | |
| camel.component.aws2-ddbstream.proxy-port | 在实例化 DDBStreams 客户端时定义代理端口。 | 整数 | |
| camel.component.aws2-ddbstream.proxy-protocol | 在实例化 DDBStreams 客户端时定义代理协议。 | 协议 | |
| camel.component.aws2-ddbstream.region | DDBStreams 客户端需要工作的区域。 | 字符串 | |
| camel.component.aws2-ddbstream.secret-key | Amazon AWS 机密密钥. | 字符串 | |
| camel.component.aws2-ddbstream.stream-iterator-type | 定义 DynamoDB 流中开始获取记录的位置。请注意,使用 FROM_START 可能会导致流及时出现大量延迟。 | Ddb2StreamConfiguration$StreamIteratorType | |
| camel.component.aws2-ddbstream.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| camel.component.aws2-ddbstream.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| camel.component.aws2-ddbstream.use-default-credentials-provider | 设置 DynamoDB Streams 客户端是否应该预期通过默认凭据提供商加载凭据,或希望传递静态凭据。 | false | 布尔值 |
第 3 章 AWS Kinesis
支持制作者和使用者
AWS2 Kinesis 组件支持接收来自 Amazon Kinesis (不支持 Batch)服务的信息。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并使用 Amazon Kinesis 注册。如需更多信息,请参阅 AWS Kinesis。
3.1. URI 格式
aws2-kinesis://stream-name[?options]
需要在使用前创建流。您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
3.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
3.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
3.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
3.3. 组件选项
AWS Kinesis 组件支持 22 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonKinesisClient (common) | Autowired Amazon Kinesis 客户端用于此端点的所有请求。 | KinesisClient | |
| cborEnabled (common) | 此选项将在执行期间设置 CBOR_ENABLED 属性。 | true | 布尔值 |
| 配置 (common) | 组件配置. | Kinesis2Configuration | |
| overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| proxyHost (common) | 在实例化 Kinesis 客户端时定义代理主机。 | 字符串 | |
| proxyPort (common) | 在实例化 Kinesis 客户端时定义代理端口。 | 整数 | |
| proxyprotocol (common) | 在实例化 Kinesis 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| 区域 (通用) | Kinesis Firehose 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| trustAllCertificates (common) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (common) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (common) | 设置 Kinesis 客户端是否应该希望通过默认凭证提供程序加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| iteratorType (consumer) | 定义在 Kinesis 流中开始获取记录的位置。 Enum 值:
| TRIM_HORIZON | ShardIteratorType |
| maxResultsPerRequest (consumer) | 每次轮询中将获取的最大记录数。 | 1 | int |
| resumeStrategy (consumer) | 为 AWS Kinesis 定义恢复策略。如果提供,默认策略将读取 sequenceNumber。 | KinesisUserConfigurationResumeStrategy | KinesisResumeStrategy |
| sequenceNumber (consumer) | 开始轮询的序列号。如果 iteratorType 设置为 AFTER_SEQUENCE_NUMBER 或 AT_SEQUENCE_NUMBER,则需要此项。 | 字符串 | |
| shardClosed (消费者) | 定义在分片关闭时的行为是什么。可能的值有 ignore, silent 和 fail。如果忽略了消息,并且消费者将从开始重新启动,如果为 silent,则消费者将从开始记录。如果开始,消费者将引发故障关闭状态异常。 Enum 值:
| Ignore | Kinesis2ShardClosedStrategyEnum |
| shardId (consumer) | 定义 Kinesis 流中要从哪些分片 ID 获取记录。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
3.4. 端点选项
AWS Kinesis 端点使用 URI 语法进行配置:
aws2-kinesis:streamName
使用以下路径和查询参数:
3.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| streamName (common) | 流的 所需 名称。 | 字符串 |
3.4.2. 查询参数(38 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonKinesisClient (common) | Autowired Amazon Kinesis 客户端用于此端点的所有请求。 | KinesisClient | |
| cborEnabled (common) | 此选项将在执行期间设置 CBOR_ENABLED 属性。 | true | 布尔值 |
| overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| proxyHost (common) | 在实例化 Kinesis 客户端时定义代理主机。 | 字符串 | |
| proxyPort (common) | 在实例化 Kinesis 客户端时定义代理端口。 | 整数 | |
| proxyprotocol (common) | 在实例化 Kinesis 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| 区域 (通用) | Kinesis Firehose 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| trustAllCertificates (common) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (common) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (common) | 设置 Kinesis 客户端是否应该希望通过默认凭证提供程序加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| iteratorType (consumer) | 定义在 Kinesis 流中开始获取记录的位置。 Enum 值:
| TRIM_HORIZON | ShardIteratorType |
| maxResultsPerRequest (consumer) | 每次轮询中将获取的最大记录数。 | 1 | int |
| resumeStrategy (consumer) | 为 AWS Kinesis 定义恢复策略。如果提供,默认策略将读取 sequenceNumber。 | KinesisUserConfigurationResumeStrategy | KinesisResumeStrategy |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| sequenceNumber (consumer) | 开始轮询的序列号。如果 iteratorType 设置为 AFTER_SEQUENCE_NUMBER 或 AT_SEQUENCE_NUMBER,则需要此项。 | 字符串 | |
| shardClosed (消费者) | 定义在分片关闭时的行为是什么。可能的值有 ignore, silent 和 fail。如果忽略了消息,并且消费者将从开始重新启动,如果为 silent,则消费者将从开始记录。如果开始,消费者将引发故障关闭状态异常。 Enum 值:
| Ignore | Kinesis2ShardClosedStrategyEnum |
| shardId (consumer) | 定义 Kinesis 流中要从哪些分片 ID 获取记录。 | 字符串 | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
所需的 Kinesis 组件选项
您必须在 Registry 中提供 KinesisClient,并配置了代理和相关凭证。
3.5. batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
3.6. 使用方法
3.6.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java system properties - aws.accessKeyId and aws.secretKey
- 环境变量 - AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。
- AWS STS 的 Web Identity Token。
- 共享凭证和配置文件。
- Amazon ECS 容器凭证 - 如果设置了环境变量 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,则从 Amazon ECS 加载。
- Amazon EC2 实例配置集凭据。
有关此信息的更多信息,您可以查看 AWS 凭证文档
3.6.2. 由 Kinesis consumer 设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 记录的序列号。这表示为一个字符串,因为它的大小不是由 API 定义。如果要将它用作数字类型,则使用 |
|
|
| 为记录的 arrival 时间分配的时间 AWS。 |
|
|
| 标识数据记录的流中分配给的分片。 |
3.6.3. AmazonKinesis 配置
然后,您必须在 amazonKinesisClient URI 选项中引用 KinesisClientClient。
from("aws2-kinesis://mykinesisstream?amazonKinesisClient=#kinesisClient")
.to("log:out?showAll=true");3.6.4. 提供 AWS 凭证
建议您使用 DefaultAWSCredentialsProviderChain 获取凭证,这是创建新 ClientConfiguration 实例时的默认设置,但在调用 createClient (…)时可以指定不同的 AWSCredentialsProvider。
3.6.5. Kinesis producer 用来写入 Kinesis 的消息标头。生产者希望消息正文是 字节[]。
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 要传递给 Kinesis 来存储此记录的 PartitionKey。 |
|
|
| 可选参数以指示此记录的序列号。 |
3.6.6. 在记录成功存储时由 Kinesis producer 设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 记录的序列号,如 Response Syntax中定义的 |
|
|
| 存储记录的分片 ID |
3.7. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws2-kinesis</artifactId>
<version>${camel-version}</version>
</dependency>
其中 3.14.2 必须替换为 Camel 的实际版本。
3.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-kinesis 时,请确保使用以下 Maven 依赖项支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-aws2-kinesis-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- use your Camel Spring Boot version -->
</dependency>组件支持 40 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.aws2-kinesis-firehose.access-key | Amazon AWS 访问密钥. | 字符串 | |
| camel.component.aws2-kinesis-firehose.amazon-kinesis-firehose-client | Amazon Kinesis Firehose 客户端用于此端点的所有请求。选项是一个 software.amazon.awssdk.services.firehose.FirehoseClient 类型。 | FirehoseClient | |
| camel.component.aws2-kinesis-firehose.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.aws2-kinesis-firehose.cbor-enabled | 此选项将在执行期间设置 CBOR_ENABLED 属性。 | true | 布尔值 |
| camel.component.aws2-kinesis-firehose.configuration | 组件配置.选项是 org.apache.camel.component.aws2.firehose.KinesisFirehose2Configuration 类型。 | KinesisFirehose2Configuration | |
| camel.component.aws2-kinesis-firehose.enabled | 是否启用 aws2-kinesis-firehose 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.aws2-kinesis-firehose.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.aws2-kinesis-firehose.operation | 当用户不希望只发送记录时,要执行的操作。 | KinesisFirehose2Operations | |
| camel.component.aws2-kinesis-firehose.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| camel.component.aws2-kinesis-firehose.proxy-host | 在实例化 Kinesis Firehose 客户端时定义代理主机。 | 字符串 | |
| camel.component.aws2-kinesis-firehose.proxy-port | 在实例化 Kinesis Firehose 客户端时定义代理端口。 | 整数 | |
| camel.component.aws2-kinesis-firehose.proxy-protocol | 在实例化 Kinesis Firehose 客户端时定义代理协议。 | 协议 | |
| camel.component.aws2-kinesis-firehose.region | Kinesis Firehose 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| camel.component.aws2-kinesis-firehose.secret-key | Amazon AWS 机密密钥. | 字符串 | |
| camel.component.aws2-kinesis-firehose.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| camel.component.aws2-kinesis-firehose.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| camel.component.aws2-kinesis-firehose.use-default-credentials-provider | 设置 Kinesis Firehose 客户端是否应该通过默认凭据提供商加载凭据,还是希望传递静态凭据。 | false | 布尔值 |
| camel.component.aws2-kinesis.access-key | Amazon AWS 访问密钥. | 字符串 | |
| camel.component.aws2-kinesis.amazon-kinesis-client | Amazon Kinesis 客户端用于此端点的所有请求。选项是一个 software.amazon.awssdk.services.kinesis.KinesisClient 类型。 | KinesisClient | |
| camel.component.aws2-kinesis.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.aws2-kinesis.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.aws2-kinesis.cbor-enabled | 此选项将在执行期间设置 CBOR_ENABLED 属性。 | true | 布尔值 |
| camel.component.aws2-kinesis.configuration | 组件配置.选项是 org.apache.camel.component.aws2.kinesis.Kinesis2Configuration 类型。 | Kinesis2Configuration | |
| camel.component.aws2-kinesis.enabled | 是否启用 aws2-kinesis 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.aws2-kinesis.iterator-type | 定义在 Kinesis 流中开始获取记录的位置。 | ShardIteratorType | |
| camel.component.aws2-kinesis.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.aws2-kinesis.max-results-per-request | 每次轮询中将获取的最大记录数。 | 1 | 整数 |
| camel.component.aws2-kinesis.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| camel.component.aws2-kinesis.proxy-host | 在实例化 Kinesis 客户端时定义代理主机。 | 字符串 | |
| camel.component.aws2-kinesis.proxy-port | 在实例化 Kinesis 客户端时定义代理端口。 | 整数 | |
| camel.component.aws2-kinesis.proxy-protocol | 在实例化 Kinesis 客户端时定义代理协议。 | 协议 | |
| camel.component.aws2-kinesis.region | Kinesis Firehose 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| camel.component.aws2-kinesis.resume-strategy | 为 AWS Kinesis 定义恢复策略。如果提供,默认策略将读取 sequenceNumber。选项是一个 org.apache.camel.component.aws2.kinesis.consumer.KinesisResumeStrategy 类型。 | KinesisResumeStrategy | |
| camel.component.aws2-kinesis.secret-key | Amazon AWS 机密密钥. | 字符串 | |
| camel.component.aws2-kinesis.sequence-number | 开始轮询的序列号。如果 iteratorType 设置为 AFTER_SEQUENCE_NUMBER 或 AT_SEQUENCE_NUMBER,则需要此项。 | 字符串 | |
| camel.component.aws2-kinesis.shard-closed | 定义在分片关闭时的行为是什么。可能的值有 ignore, silent 和 fail。如果忽略了消息,并且消费者将从开始重新启动,如果为 silent,则消费者将从开始记录。如果开始,消费者将引发故障关闭状态异常。 | Kinesis2ShardClosedStrategyEnum | |
| camel.component.aws2-kinesis.shard-id | 定义 Kinesis 流中要从哪些分片 ID 获取记录。 | 字符串 | |
| camel.component.aws2-kinesis.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| camel.component.aws2-kinesis.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| camel.component.aws2-kinesis.use-default-credentials-provider | 设置 Kinesis 客户端是否应该希望通过默认凭证提供程序加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
第 4 章 AWS 2 Lambda
仅支持制作者
AWS2 Lambda 组件支持 create, get, list, delete and invoke AWS Lambda 功能。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并使用 Amazon Lambda 注册。如需更多信息,请参阅 AWS Lambda。
在创建 Lambda 功能时,您需要指定一个 IAM 角色,该角色至少附加了 AWSLambdaBasicExecuteRole 策略。
4.1. URI 格式
aws2-lambda://functionName[?options]
您可以将查询选项附加到 URI 中,格式为 options=value&option2=value&…
4.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
4.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
4.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
4.3. 组件选项
AWS Lambda 组件支持 16 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 配置 (生成器) | 组件配置. | Lambda2Configuration | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 操作 (生成) | 要执行的操作。它可以是 listFunctions、getFunction、createFunction、deleteFunction 或 invokeFunction。 Enum 值:
| invokeFunction | Lambda2Operations |
| overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| pojoRequest (producer) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
| 区域 (生成者) | Lambda 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (producer) | 设置 Lambda 客户端是否应该预期通过默认凭据提供商加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| awsLambdaClient (advanced) | Autowired To 使用现有配置的 AwsLambdaClient 作为客户端。 | LambdaClient | |
| proxyHost (proxy) | 在实例化 Lambda 客户端时定义代理主机。 | 字符串 | |
| proxyPort (proxy) | 在实例化 Lambda 客户端时定义代理端口。 | 整数 | |
| proxyprotocol (proxy) | 在实例化 Lambda 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
4.4. 端点选项
AWS Lambda 端点使用 URI 语法进行配置:
aws2-lambda:function
使用以下路径和查询参数:
4.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 功能 (生成器) | Lambda 函数的 必需 名称。 | 字符串 |
4.4.2. 查询参数(14 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 操作 (生成) | 要执行的操作。它可以是 listFunctions、getFunction、createFunction、deleteFunction 或 invokeFunction。 Enum 值:
| invokeFunction | Lambda2Operations |
| overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| pojoRequest (producer) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
| 区域 (生成者) | Lambda 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (producer) | 设置 Lambda 客户端是否应该预期通过默认凭据提供商加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
| awsLambdaClient (advanced) | Autowired To 使用现有配置的 AwsLambdaClient 作为客户端。 | LambdaClient | |
| proxyHost (proxy) | 在实例化 Lambda 客户端时定义代理主机。 | 字符串 | |
| proxyPort (proxy) | 在实例化 Lambda 客户端时定义代理端口。 | 整数 | |
| proxyprotocol (proxy) | 在实例化 Lambda 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
所需的 Lambda 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 awsLambdaClient,以访问 Amazon Lambda 服务。
4.5. 使用方法
4.5.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java system properties - aws.accessKeyId and aws.secretKey
- 环境变量 - AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。
- AWS STS 的 Web Identity Token。
- 共享凭证和配置文件。
- Amazon ECS 容器凭证 - 如果设置了环境变量 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,则从 Amazon ECS 加载。
- Amazon EC2 实例配置集凭据。
有关此信息的更多信息,您可以查看 AWS 凭证文档
4.5.2. 由 Lambda producer 评估的消息标头
| 操作 | 标头 | 类型 | 描述 | 必填 |
|---|---|---|---|---|
| All |
|
| 我们要执行的操作。覆盖作为查询参数传递的操作 | 是 |
| createFunction |
|
| 存储包含部署软件包的 .zip 文件的 Amazon S3 bucket 名称。此存储桶必须位于您要创建 Lambda 功能的同一 AWS 区域。 | 否 |
| createFunction |
|
| 要上传的 Amazon S3 对象(部署软件包)密钥名称。 | 否 |
| createFunction |
| 字符串 | 要上传的 Amazon S3 对象(部署软件包)版本。 | 否 |
| createFunction |
|
| zip 文件的本地路径(部署软件包)。zip 文件的内容也可以放在消息正文中。 | 否 |
| createFunction |
|
| 当执行您的功能来访问任何其他 Amazon Web Services (AWS)资源时,Larmbda 假定 IAM 角色的 Amazon Resource Name (ARN)。 | 是 |
| createFunction |
| 字符串 | 您上传的 Lambda 功能的运行时环境。(nodejs, nodejs4.3, nodejs6.10, java8, python2.7, python3.6, dotnetcore1.0, odejs4.3-edge) | 是 |
| createFunction |
|
| Lambda 调用的代码中的功能,开始执行。对于 Node.js,它是您的函数中的 module-name.export 值。对于 Java,它可以是 package.class-name::handler 或 package.class-name。 | 是 |
| createFunction |
|
| 用户提供的描述。 | 否 |
| createFunction |
|
| 包含 Amazon SQS 队列或 Amazon SNS 主题的目标 ARN (Amazon Resource Name)的父对象。 | 否 |
| createFunction |
|
| 为该功能配置的内存大小(以 MB 为单位)。必须是 64 MB 的倍数。 | 否 |
| createFunction |
|
| 用于加密功能环境变量的 KMS 密钥的 Amazon 资源名称(ARN)。如果没有提供,AWS Lambda 将使用默认服务密钥。 | 否 |
| createFunction |
|
| 此布尔值参数可用于请求 AWS Lambda 来创建 Lambda 功能,并将版本作为原子操作发布。 | 否 |
| createFunction |
|
| Lambda 应该终止函数的功能执行时间。默认值为 3 秒。 | 否 |
| createFunction |
|
| 您功能的追踪设置(活跃或传递)。 | 否 |
| createFunction |
|
| 代表您的环境配置设置的键值对。 | 否 |
| createFunction |
|
| 分配给新功能的标签(键值对)列表。 | 否 |
| createFunction |
|
| 如果您的 Lambda 功能访问 VPC 中的资源,则 VPC 中的一个或多个安全组 ID 列表。 | 否 |
| createFunction |
|
| 如果您的 Lambda 功能访问 VPC 中的资源,则 VPC 中的一个或多个子网 ID 列表。 | 否 |
| createAlias |
|
| 在别名中设置的功能版本 | 是 |
| createAlias |
|
| 在别名中设置的函数名称 | 是 |
| createAlias |
|
| 在别名中设置的函数描述 | 否 |
| deleteAlias |
|
| 别名的功能名称 | 是 |
| getAlias |
|
| 别名的功能名称 | 是 |
| listAliases |
|
| 在别名中设置的功能版本 | 否 |
4.6. 可运行的操作列表
- listFunctions
- getFunction
- createFunction
- deleteFunction
- invokeFunction
- updateFunction
- createEventSourceMapping
- deleteEventSourceMapping
- listEventSourceMapping
- listTags
- tagResource
- untagResource
- publishVersion
- listVersions
- createAlias
- deleteAlias
- getAlias
- listAliases
4.7. 例子
4.7.1. 制作者示例
要完全了解组件的工作方式,您可以参阅这些 集成测试。
4.7.2. 制作者示例
- CreateFunction:此操作将在 AWS Lambda 中为您创建一个功能
from("direct:createFunction").to("aws2-lambda://GetHelloWithName?operation=createFunction").to("mock:result");并通过发送
template.send("direct:createFunction", ExchangePattern.InOut, new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(Lambda2Constants.RUNTIME, "nodejs6.10");
exchange.getIn().setHeader(Lambda2Constants.HANDLER, "GetHelloWithName.handler");
exchange.getIn().setHeader(Lambda2Constants.DESCRIPTION, "Hello with node.js on Lambda");
exchange.getIn().setHeader(Lambda2Constants.ROLE,
"arn:aws:iam::643534317684:role/lambda-execution-role");
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(
classLoader
.getResource("org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.zip")
.getFile());
FileInputStream inputStream = new FileInputStream(file);
exchange.getIn().setBody(inputStream);
}
});4.8. 使用 POJO 作为正文
由于多个选项,有时构建 AWS Request 可能会很复杂。我们介绍可能将 POJO 用作正文。在 AWS Lambda 中,您可以提交多个操作,如 Get Function 请求,您可以执行以下操作:
from("direct:getFunction")
.setBody(GetFunctionRequest.builder().functionName("test").build())
.to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=getFunction&pojoRequest=true")这样,您将直接传递请求,而无需专门传递与此操作相关的标头和选项。
4.9. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws2-lambda</artifactId>
<version>${camel-version}</version>
</dependency>
其中 3.14.2 必须替换为 Camel 的实际版本。
4.10. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-lambda 时,请确保使用以下 Maven 依赖项支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-aws2-lambda-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- use your Camel Spring Boot version -->
</dependency>组件支持 17 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.aws2-lambda.access-key | Amazon AWS 访问密钥. | 字符串 | |
| camel.component.aws2-lambda.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.aws2-lambda.aws-lambda-client | 使用现有配置的 AwsLambdaClient 作为客户端。选项是一个 software.amazon.awssdk.services.lambda.LambdaClient 类型。 | LambdaClient | |
| camel.component.aws2-lambda.configuration | 组件配置.选项是 org.apache.camel.component.aws2.lambda.Lambda2Configuration 类型。 | Lambda2Configuration | |
| camel.component.aws2-lambda.enabled | 是否启用 aws2-lambda 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.aws2-lambda.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.aws2-lambda.operation | 要执行的操作。它可以是 listFunctions、getFunction、createFunction、deleteFunction 或 invokeFunction。 | Lambda2Operations | |
| camel.component.aws2-lambda.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| camel.component.aws2-lambda.pojo-request | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
| camel.component.aws2-lambda.proxy-host | 在实例化 Lambda 客户端时定义代理主机。 | 字符串 | |
| camel.component.aws2-lambda.proxy-port | 在实例化 Lambda 客户端时定义代理端口。 | 整数 | |
| camel.component.aws2-lambda.proxy-protocol | 在实例化 Lambda 客户端时定义代理协议。 | 协议 | |
| camel.component.aws2-lambda.region | Lambda 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| camel.component.aws2-lambda.secret-key | Amazon AWS 机密密钥. | 字符串 | |
| camel.component.aws2-lambda.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| camel.component.aws2-lambda.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| camel.component.aws2-lambda.use-default-credentials-provider | 设置 Lambda 客户端是否应该预期通过默认凭据提供商加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
第 5 章 AWS S3 Storage Service
支持制作者和使用者
AWS2 S3 组件支持从/到 Amazon 的 S3 服务存储和检索对象。
先决条件
您必须拥有有效的 Amazon Web Services 开发人员帐户,并签名才能使用 Amazon S3。如需更多信息,请访问 link:https://aws.amazon.com/s3 [Amazon S3]。
5.1. URI 格式
aws2-s3://bucketNameOrArn[?options]
如果存储桶不存在,则会创建存储桶。您可以以以下格式将查询选项附加到 URI 中,
options=value&option2=value&…
5.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
5.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
5.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
5.3. 组件选项
AWS S3 Storage Service 组件支持 50 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonS3Client (通用) | 对 registry 中的 com.amazonaws.services.s3.AmazonS3 的 Autowired Reference。 | S3Client | |
| amazonS3Presigner (common) | Autowired An S3 Presigner for Request,主要在 createDownloadLink 操作中使用。 | S3Presigner | |
| autoCreateBucket (common) | 设置 S3 存储桶存储桶Name 的自动创建。如果启用了 moveAfterRead 选项,则也会应用它,如果尚未存在 moveAfterRead 选项,它将创建 destinationBucket。 | false | 布尔值 |
| 配置 (common) | 组件配置。 | AWS2S3Configuration | |
| overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| pojoRequest (common) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
| 策略 (common) | 此队列的策略在 com.amazonaws.services.s3.AmazonS3#setBucketPolicy ()方法中设置。 | 字符串 | |
| proxyHost (common) | 在实例化 SQS 客户端时定义代理主机。 | 字符串 | |
| proxyPort (common) | 指定要在客户端定义中使用的代理端口。 | 整数 | |
| proxyprotocol (common) | 在实例化 S3 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| 区域 (通用) | S3 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| trustAllCertificates (common) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (common) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (common) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
| 客户算法 (通用(高级) | 定义在启用了 CustomerKey 时要使用的客户算法。 | 字符串 | |
| customerKeyId (通用(高级) | 定义在启用 CustomerKey 时要使用的 Customer key 的 id。 | 字符串 | |
| 客户密钥MD5 (通用(高级) | 定义在启用 CustomerKey 时要使用的客户密钥的 MD5。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| deleteAfterRead (consumer) | 在检索后,从 S3 删除对象。只有在提交 Exchange 时,才会执行删除。如果进行回滚,则对象不会被删除。如果此选项为 false,则同一对象将被通过并再次在轮询上检索。因此,您需要使用路由中的 Idempotent Consumer EIP 来过滤重复项。您可以使用 AWS2S3Constants#BUCKET_NAME 和 AWS2S3Constants#KEY 标头过滤,或者只过滤 AWS2S3Constants#KEY 标头。 | true | 布尔值 |
| 分隔符 (消费者) | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的分隔符仅消耗我们感兴趣的对象。 | 字符串 | |
| destinationBucket (使用者) | 定义当 moveAfterRead 设置为 true 时必须移动对象的目标存储桶。 | 字符串 | |
| destinationBucketPrefix (consumer) | 定义在必须移动对象并将 moveAfterRead 设置为 true 时使用的目标存储桶前缀。 | 字符串 | |
| destinationBucketSuffix (consumer) | 定义在必须移动对象并将 moveAfterRead 设置为 true 时使用的目标存储桶后缀。 | 字符串 | |
| doneFileName (consumer) | 如果提供,Camel 仅在文件存在时使用文件。 | 字符串 | |
| fileName (consumer) | 要从具有给定文件名的存储桶获取对象。 | 字符串 | |
| ignoreBody (consumer) | 如果为 true,则 S3 对象正文将完全忽略,如果设为 false,则 S3 对象将放入正文中。把它设置为 true,将覆盖 includeBody 选项定义的任何行为。 | false | 布尔值 |
| includeBody (consumer) | 如果为 true,则 S3Object Exchange 将被使用并放入正文和关闭中。如果为 false,S3Object 流将原始放在正文中,标头将使用 S3 对象元数据设置。这个选项与 autocloseBody 选项密切相关。如果将 includeBody 设为 true,因为 S3Object 流将被消耗,然后也会关闭它,而在 includeBody false 时,它将是关闭 S3Object 流的调用者。但是,当 includeBody 为 false 时,将 autocloseBody 设置为 true,它将在交换完成时自动关闭 S3Object 流。 | true | 布尔值 |
| 包含Folders (使用者) | 如果为 true,将消耗文件夹/目录。如果是 false,则忽略它们,且不会为那些交换创建。 | true | 布尔值 |
| moveAfterRead (consumer) | 在检索后,将对象从 S3 存储桶移到不同的存储桶。要完成操作,必须设置 destinationBucket 选项。仅当 Exchange 提交时,才会执行复制存储桶操作。如果进行回滚,则对象不会被移动。 | false | 布尔值 |
| 前缀 (消费者) | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的前缀,仅用于消耗我们感兴趣的对象。 | 字符串 | |
| autocloseBody (使用者(高级) | 如果此选项为 true,且 includeBody 为 false,则在交换完成时调用 S3Object.close ()方法。此选项与 includeBody 选项密切相关。如果将 includeBody 设为 false,autocloseBody 设为 false,它将是关闭 S3Object 流的调用者。将 autocloseBody 设置为 true,将自动关闭 S3Object 流。 | true | 布尔值 |
| batchMessageNumber (producer) | 在流传输上传模式中制作批处理的消息数量。 | 10 | int |
| batchSize (producer) | 流上传模式的批处理大小(以字节为单位)。 | 1000000 | int |
| deleteAfterWrite (producer) | 在 S3 文件上传后删除文件对象。 | false | 布尔值 |
| KeyName (producer) | 通过端点参数在存储桶中设置元素的密钥名称。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| multipartUpload (producer) | 如果为 true,则 camel 将上传带有多部分格式的 文件,由 partSize 选项决定部分大小。 | false | 布尔值 |
| namingStrategy (producer) | 在流上传模式中使用的命名策略。 Enum 值:
| progressive | AWSS3NamingStrategyEnum |
| 操作 (生成) | 当用户不希望只进行上传时,要执行的操作。 Enum 值:
| AWS2S3Operations | |
| partSize (producer) | 设置多部分上传中使用的 partSize,默认大小为 25M。 | 26214400 | long |
| RestartPolicy (producer) | 在流上传模式中使用的重启策略。 Enum 值:
| 覆盖 | AWSS3RestartingPolicyEnum |
| storageClass (producer) | 在 com.amazonaws.services.s3.model.PutObjectRequest 请求中设置的存储类。 | 字符串 | |
| streamingUploadMode (producer) | 当流模式为 true 时,上传到存储桶将以流传输方式进行。 | false | 布尔值 |
| streamingUploadTimeout (producer) | 在流上传模式为 true 时,此选项会将超时设置为完成上传。 | long | |
| awsKMSKeyId (producer (advanced)) | 定义在启用 KMS 时要使用的 KMS 密钥 ID。 | 字符串 | |
| useAwsKMS (producer (advanced)) | 定义是否必须使用 KMS。 | false | 布尔值 |
| useCustomerKey (producer (advanced)) | 定义是否需要使用客户密钥。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
5.4. 端点选项
AWS S3 Storage Service 端点使用 URI 语法进行配置:
aws2-s3://bucketNameOrArn
使用以下路径和查询参数:
5.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bucketNameOrArn (common) | 所需的 Bucket 名称或 ARN。 | 字符串 |
5.4.2. 查询参数(68 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonS3Client (通用) | 对 registry 中的 com.amazonaws.services.s3.AmazonS3 的 Autowired Reference。 | S3Client | |
| amazonS3Presigner (common) | Autowired An S3 Presigner for Request,主要在 createDownloadLink 操作中使用。 | S3Presigner | |
| autoCreateBucket (common) | 设置 S3 存储桶存储桶Name 的自动创建。如果启用了 moveAfterRead 选项,则也会应用它,如果尚未存在 moveAfterRead 选项,它将创建 destinationBucket。 | false | 布尔值 |
| overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| pojoRequest (common) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
| 策略 (common) | 此队列的策略在 com.amazonaws.services.s3.AmazonS3#setBucketPolicy ()方法中设置。 | 字符串 | |
| proxyHost (common) | 在实例化 SQS 客户端时定义代理主机。 | 字符串 | |
| proxyPort (common) | 指定要在客户端定义中使用的代理端口。 | 整数 | |
| proxyprotocol (common) | 在实例化 S3 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| 区域 (通用) | S3 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| trustAllCertificates (common) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (common) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (common) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
| 客户算法 (通用(高级) | 定义在启用了 CustomerKey 时要使用的客户算法。 | 字符串 | |
| customerKeyId (通用(高级) | 定义在启用 CustomerKey 时要使用的 Customer key 的 id。 | 字符串 | |
| 客户密钥MD5 (通用(高级) | 定义在启用 CustomerKey 时要使用的客户密钥的 MD5。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| deleteAfterRead (consumer) | 在检索后,从 S3 删除对象。只有在提交 Exchange 时,才会执行删除。如果进行回滚,则对象不会被删除。如果此选项为 false,则同一对象将被通过并再次在轮询上检索。因此,您需要使用路由中的 Idempotent Consumer EIP 来过滤重复项。您可以使用 AWS2S3Constants#BUCKET_NAME 和 AWS2S3Constants#KEY 标头过滤,或者只过滤 AWS2S3Constants#KEY 标头。 | true | 布尔值 |
| 分隔符 (消费者) | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的分隔符仅消耗我们感兴趣的对象。 | 字符串 | |
| destinationBucket (使用者) | 定义当 moveAfterRead 设置为 true 时必须移动对象的目标存储桶。 | 字符串 | |
| destinationBucketPrefix (consumer) | 定义在必须移动对象并将 moveAfterRead 设置为 true 时使用的目标存储桶前缀。 | 字符串 | |
| destinationBucketSuffix (consumer) | 定义在必须移动对象并将 moveAfterRead 设置为 true 时使用的目标存储桶后缀。 | 字符串 | |
| doneFileName (consumer) | 如果提供,Camel 仅在文件存在时使用文件。 | 字符串 | |
| fileName (consumer) | 要从具有给定文件名的存储桶获取对象。 | 字符串 | |
| ignoreBody (consumer) | 如果为 true,则 S3 对象正文将完全忽略,如果设为 false,则 S3 对象将放入正文中。把它设置为 true,将覆盖 includeBody 选项定义的任何行为。 | false | 布尔值 |
| includeBody (consumer) | 如果为 true,则 S3Object Exchange 将被使用并放入正文和关闭中。如果为 false,S3Object 流将原始放在正文中,标头将使用 S3 对象元数据设置。这个选项与 autocloseBody 选项密切相关。如果将 includeBody 设为 true,因为 S3Object 流将被消耗,然后也会关闭它,而在 includeBody false 时,它将是关闭 S3Object 流的调用者。但是,当 includeBody 为 false 时,将 autocloseBody 设置为 true,它将在交换完成时自动关闭 S3Object 流。 | true | 布尔值 |
| 包含Folders (使用者) | 如果为 true,将消耗文件夹/目录。如果是 false,则忽略它们,且不会为那些交换创建。 | true | 布尔值 |
| maxConnections (consumer) | 在 S3 客户端配置中设置 maxConnections 参数。 | 60 | int |
| maxMessagesPerPoll (使用者) | 获取最大消息数,作为每次轮询轮询的限制。获取最大消息数,作为每次轮询轮询的限制。默认值为 10。使用 0 或负数设置为无限。 | 10 | int |
| moveAfterRead (consumer) | 在检索后,将对象从 S3 存储桶移到不同的存储桶。要完成操作,必须设置 destinationBucket 选项。仅当 Exchange 提交时,才会执行复制存储桶操作。如果进行回滚,则对象不会被移动。 | false | 布尔值 |
| 前缀 (消费者) | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的前缀,仅用于消耗我们感兴趣的对象。 | 字符串 | |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| autocloseBody (使用者(高级) | 如果此选项为 true,且 includeBody 为 false,则在交换完成时调用 S3Object.close ()方法。此选项与 includeBody 选项密切相关。如果将 includeBody 设为 false,autocloseBody 设为 false,它将是关闭 S3Object 流的调用者。将 autocloseBody 设置为 true,将自动关闭 S3Object 流。 | true | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| batchMessageNumber (producer) | 在流传输上传模式中制作批处理的消息数量。 | 10 | int |
| batchSize (producer) | 流上传模式的批处理大小(以字节为单位)。 | 1000000 | int |
| deleteAfterWrite (producer) | 在 S3 文件上传后删除文件对象。 | false | 布尔值 |
| KeyName (producer) | 通过端点参数在存储桶中设置元素的密钥名称。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| multipartUpload (producer) | 如果为 true,则 camel 将上传带有多部分格式的 文件,由 partSize 选项决定部分大小。 | false | 布尔值 |
| namingStrategy (producer) | 在流上传模式中使用的命名策略。 Enum 值:
| progressive | AWSS3NamingStrategyEnum |
| 操作 (生成) | 当用户不希望只进行上传时,要执行的操作。 Enum 值:
| AWS2S3Operations | |
| partSize (producer) | 设置多部分上传中使用的 partSize,默认大小为 25M。 | 26214400 | long |
| RestartPolicy (producer) | 在流上传模式中使用的重启策略。 Enum 值:
| 覆盖 | AWSS3RestartingPolicyEnum |
| storageClass (producer) | 在 com.amazonaws.services.s3.model.PutObjectRequest 请求中设置的存储类。 | 字符串 | |
| streamingUploadMode (producer) | 当流模式为 true 时,上传到存储桶将以流传输方式进行。 | false | 布尔值 |
| streamingUploadTimeout (producer) | 在流上传模式为 true 时,此选项会将超时设置为完成上传。 | long | |
| awsKMSKeyId (producer (advanced)) | 定义在启用 KMS 时要使用的 KMS 密钥 ID。 | 字符串 | |
| useAwsKMS (producer (advanced)) | 定义是否必须使用 KMS。 | false | 布尔值 |
| useCustomerKey (producer (advanced)) | 定义是否需要使用客户密钥。 | false | 布尔值 |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
所需的 S3 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonS3Client,才能访问 Amazon 的 S3。
5.5. batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
5.6. 使用方法
例如,要从存储桶 helloBucket 读取文件 hello.txt,请使用以下片断:
from("aws2-s3://helloBucket?accessKey=yourAccessKey&secretKey=yourSecretKey&prefix=hello.txt")
.to("file:/var/downloaded");5.6.1. S3 producer 评估的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 此对象的 bucket 名称将存储或用于当前操作 |
|
|
| 用于当前操作的存储桶目标名称 |
|
|
| 此对象的内容长度。 |
|
|
| 此对象的内容类型。 |
|
|
| 此对象的内容控制。 |
|
|
| 此对象的内容分布。 |
|
|
| 此对象的内容编码。 |
|
|
| 此对象的 md5 checksum。 |
|
|
| 用于当前操作的 Destination 键 |
|
|
| 此对象将存储或用于当前操作的密钥 |
|
|
| 此对象的最后修改的时间戳。 |
|
|
| 要执行的操作。允许的值有 copyObject, deleteObject, listBuckets, deleteBucket, listObjects |
|
|
| 此对象的存储类。 |
|
|
|
将应用于对象的 canned acl。请参阅 |
|
|
|
一个精心构建的 Amazon S3 Access Control List 对象。请参阅 |
|
| 字符串 | 在使用 AWS 管理的密钥加密对象时设置服务器端加密算法。例如,使用 AES256。 |
|
|
| 要存储或从当前操作返回的对象的版本 Id |
|
|
| 要与 S3 中对象存储的元数据映射。有关元数据的更多详细信息。 |
5.6.2. S3 producer 设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 新上传对象的 ETag 值。 |
|
|
| 新上传对象 的可选 版本 ID。 |
5.6.3. S3 使用者设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 存储此对象的密钥。 |
|
|
| 包含此对象的存储桶的名称。 |
|
|
| 根据 RFC 1864,对相关对象的十六进制编码的 128 位 MD5 摘要。此数据用作完整性检查,以验证调用者收到的数据是否与 Amazon S3 发送的数据相同。 |
|
|
| Last-Modified 标头的值,指示 Amazon S3 最后记录对关联对象的修改的日期和时间。 |
|
|
| 关联的 Amazon S3 对象的版本 ID (如果可用)。只有当对象上传到启用了对象版本控制的 Amazon S3 存储桶时,才会将版本 ID 分配给对象。 |
|
|
| Content-Type HTTP 标头,它表示存储在关联对象中的内容类型。此标头的值是标准 MIME 类型。 |
|
|
| 根据 RFC 1864,使用 base64 编码的相关对象(content - 不包括标头)的 base64 编码 MD5 摘要。此数据用作消息完整性检查,以验证 Amazon S3 收到的数据是否与调用者发送的数据相同。 |
|
|
| Content-Length HTTP 标头表示关联对象的大小(以字节为单位)。 |
|
|
| 可选的 Content-Encoding HTTP 标头指定将什么内容编码应用到对象,必须应用哪些解码机制来获取 Content-Type 字段引用的 media-type。 |
|
|
| 可选的 Content-Disposition HTTP 标头,它指定要保存的对象的建议文件名等。 |
|
|
| 可选的 Cache-Control HTTP 标头,允许用户在 HTTP 请求/恢复链中指定缓存行为。 |
|
| 字符串 | 使用 AWS 管理的密钥加密对象时的服务器端加密算法。 |
|
|
| 与 S3 中对象存储的元数据映射。有关元数据的更多详细信息。 |
5.6.4. S3 Producer 操作
Camel-AWS2-S3 组件在制作者端提供以下操作:
- copyObject
- deleteObject
- listBuckets
- deleteBucket
- listObjects
- GetObject (这将返回 S3Object 实例)
- getObjectRange (这将返回 S3Object 实例)
- createDownloadLink
如果您没有显式指定制作者将执行的操作: - 单个文件上传 - 如果启用了 multiPartUpload 选项,则多部分上传。
5.6.5. 高级 AmazonS3 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 S3Client 实例配置拥有更多控制,您可以创建自己的实例,并在 Camel aws2-s3 组件配置中引用它:
from("aws2-s3://MyBucket?amazonS3Client=#client&delay=5000&maxMessagesPerPoll=5")
.to("mock:result");5.6.6. 将 KMS 与 S3 组件一起使用
要使用 AWS KMS 加密/解密数据,您可以使用 2.21.x 中引入的选项,如下例所示
from("file:tmp/test?fileName=test.txt")
.setHeader(S3Constants.KEY, constant("testFile"))
.to("aws2-s3://mybucket?amazonS3Client=#client&useAwsKMS=true&awsKMSKeyId=3f0637ad-296a-3dfe-a796-e60654fb128c");这样,您将要求 S3 使用 KMS 密钥 3f0637ad-296a-3dfe-a796-e60654fb128c 来加密文件 test.txt。当您要求下载该文件时,将在下载前直接进行解密。
5.6.7. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java system properties - aws.accessKeyId and aws.secretKey
- 环境变量 - AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。
- AWS STS 的 Web Identity Token。
- 共享凭证和配置文件。
- Amazon ECS 容器凭证 - 如果设置了环境变量 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,则从 Amazon ECS 加载。
- Amazon EC2 实例配置集凭据。
有关此信息的更多信息,您可以查看 AWS 凭证文档
5.6.8. S3 Producer 操作示例
- 单上传:此操作将根据正文内容上传文件到 S3
from("direct:start").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(S3Constants.KEY, "camel.txt");
exchange.getIn().setBody("Camel rocks!");
}
})
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client")
.to("mock:result");此操作将上传文件 camel.txt,其内容为 mycamelbucket bucket 中的内容 "Camel rocks!"
- 多部分上传:此操作将根据正文内容执行文件的多部分上传到 S3
from("direct:start").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(AWS2S3Constants.KEY, "empty.txt");
exchange.getIn().setBody(new File("src/empty.txt"));
}
})
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&multiPartUpload=true&autoCreateBucket=true&partSize=1048576")
.to("mock:result");此操作将执行文件 empty.txt 的多部分上传,它基于 mycamelbucket bucket 中文件 src/empty.txt 的内容
- CopyObject:此操作将对象从一个存储桶复制到不同的存储桶
from("direct:start").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(S3Constants.BUCKET_DESTINATION_NAME, "camelDestinationBucket");
exchange.getIn().setHeader(S3Constants.KEY, "camelKey");
exchange.getIn().setHeader(S3Constants.DESTINATION_KEY, "camelDestinationKey");
}
})
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=copyObject")
.to("mock:result");此操作会将带有标头 camelDestinationKey 中的名称的对象复制到 Bucket mycamelbucket 中的 camelDestinationBucket 存储桶。
- DeleteObject:此操作从存储桶中删除对象
from("direct:start").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(S3Constants.KEY, "camelKey");
}
})
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteObject")
.to("mock:result");此操作将从 bucket mycamelbucket 中删除对象 camelKey。
- ListBuckets:此操作列出了此区域中此帐户的存储桶
from("direct:start")
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=listBuckets")
.to("mock:result");此操作将列出此帐户的存储桶
- DeleteBucket:此操作删除指定为 URI 参数或标头的存储桶
from("direct:start")
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteBucket")
.to("mock:result");此操作将删除存储桶 mycamelbucket
- ListObjects :此操作列表在特定存储桶中的对象
from("direct:start")
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=listObjects")
.to("mock:result");此操作将列出 mycamelbucket bucket 中的对象
- GetObject:此操作获取特定存储桶中的单个对象
from("direct:start").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(S3Constants.KEY, "camelKey");
}
})
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObject")
.to("mock:result");此操作将返回与 mycamelbucket bucket 中 camelKey 对象相关的 S3Object 实例。
- GetObjectRange:此操作获得特定存储桶中的单个对象范围
from("direct:start").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(S3Constants.KEY, "camelKey");
exchange.getIn().setHeader(S3Constants.RANGE_START, "0");
exchange.getIn().setHeader(S3Constants.RANGE_END, "9");
}
})
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObjectRange")
.to("mock:result");此操作将返回与 mycamelbucket bucket 中 camelKey 对象相关的 S3Object 实例,其中包含从 0 到 9 的字节数。
- CreateDownloadLink:此操作将通过 S3 Presigner 返回下载链接
from("direct:start").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(S3Constants.KEY, "camelKey");
}
})
.to("aws2-s3://mycamelbucket?accessKey=xxx&secretKey=yyy®ion=region&operation=createDownloadLink")
.to("mock:result");此操作将返回存储桶 mycamelbucket 和 region 区域中的 camel-key 文件的下载链接 url
5.7. 流上传模式
启用流模式后,用户可以通过多部分上传将数据上传到 S3,而无需提前了解数据维度的时间。上传将在完成后完成: batchSize 已完成,或者达到 batchMessageNumber。有两个可能的命名策略:
progressive
使用 progressive 策略,每个文件的名称都由 keyName 选项和一个 progressive 计数器组成,最终文件扩展名(若有)
随机.
使用随机策略时,将在 keyName 后添加 UUID,最终会附加文件扩展名。
例如:
from(kafka("topic1").brokers("localhost:9092"))
.log("Kafka Message is: ${body}")
.to(aws2S3("camel-bucket").streamingUploadMode(true).batchMessageNumber(25).namingStrategy(AWS2S3EndpointBuilderFactory.AWSS3NamingStrategyEnum.progressive).keyName("{{kafkaTopic1}}/{{kafkaTopic1}}.txt"));
from(kafka("topic2").brokers("localhost:9092"))
.log("Kafka Message is: ${body}")
.to(aws2S3("camel-bucket").streamingUploadMode(true).batchMessageNumber(25).namingStrategy(AWS2S3EndpointBuilderFactory.AWSS3NamingStrategyEnum.progressive).keyName("{{kafkaTopic2}}/{{kafkaTopic2}}.txt"));批处理的默认大小为 1 Mb,但您可以根据您的要求进行调整。
当您停止制作者路由时,生产者将负责刷新剩余的缓冲消息,并完成上传。
在流上传中,您将能够从离开的时间点重新启动制作者。务必要注意,只有在使用进度命名策略时,此功能才至关重要。
通过将 restartPolicy 设置为 lastPart,您将重启从制作者左侧最后一个部分编号上传文件和内容。
示例
- 使用 progressive naming strategy 和 keyname 等于 camel.txt 来启动路由,batchMessageNumber 等于 20,restartPolicy 等于 lastPart - Send 70 消息。
- 停止路由
在您的 S3 存储桶中,您现在应该看到 4 个文件:* camel.txt
- camel-1.txt
- camel-2.txt
camel-3.txt
前三个消息将有 20 个消息,而最后一个消息仅有 10 个。
- 重新启动路由。
- 发送 25 个消息。
- 停止路由。
- 您的存储桶中现在有 2 个其他文件: camel-5.txt 和 camel-6.txt,第一个带有 20 个消息,第二个文件为 5 个信息。
- 请访问
使用随机命名策略时不需要这样做。
相反,您可以指定覆盖重启策略。在这种情况下,您可以覆盖您在存储桶上之前(用于该特定 keyName)写入的任何内容。
在流上传模式中,将考虑的唯一 keyName 选项是端点选项。使用标头将抛出 NPE,这由设计完成。设置标头意味着可能会更改每个交换上的文件名,这针对流上传制作者的动画。keyName 需要修复和静态。所选命名策略将执行其余工作。
另一个可能是使用 batchMessageNumber 和 batchSize 选项指定 streamingUploadTimeout。使用此选项时,用户可以在特定时间通过后完成文件上传。这样,上传完成将在三个层上传递:超时、消息数和批处理大小。
例如:
from(kafka("topic1").brokers("localhost:9092"))
.log("Kafka Message is: ${body}")
.to(aws2S3("camel-bucket").streamingUploadMode(true).batchMessageNumber(25).streamingUploadTimeout(10000).namingStrategy(AWS2S3EndpointBuilderFactory.AWSS3NamingStrategyEnum.progressive).keyName("{{kafkaTopic1}}/{{kafkaTopic1}}.txt"));在这种情况下,上传将在 10 秒后完成。
5.8. bucket 自动创建
使用选项 autoCreateBucket 用户可以在 S3 Bucket 不存在时避免自动创建。此选项的默认值是 true。如果设置为 false 对 AWS 中不存在的存储桶的操作,则不会成功,并返回错误。
5.9. 在存储桶和其他存储桶间移动操作
有些用户(如从存储桶中消耗大量),并在不同的中移动内容,而无需使用这个组件的 copyObject 功能。如果是这样,请不要忘记从消费者的传入交换中删除 bucketName 标头,否则该文件将始终覆盖同一原始存储桶。
5.10. MoveAfterRead consumer 选项
除了 deleteAfterRead 外,还添加了另一个选项 moveAfterRead。启用此选项后,消耗的对象将移到目标 destinationBucket 中,而不是只被删除。这将需要指定 destinationBucket 选项。例如:
from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket")
.to("mock:result");在这种情况下,消耗的对象将移到 myothercamelbucket bucket,并从原始存储桶中删除(因为 deleteAfterRead 设置为 true )。
您还可以在将文件移动到其他存储桶时使用密钥前缀/suffix。这些选项是 destinationBucketPrefix 和 destinationBucketSuffix。
使用以上示例,您可以执行以下操作:
from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket&destinationBucketPrefix=RAW(pre-)&destinationBucketSuffix=RAW(-suff)")
.to("mock:result");在这种情况下,消耗的对象将移到 myothercamelbucket bucket,并从原始存储桶中删除(因为 deleteAfterRead 设置为 true )。
因此,如果文件名是 test,在 myothercamelbucket 中,您应该会看到一个名为 pre-test-suff 的文件。
5.11. 使用客户密钥加密
我们还引入了客户密钥支持(使用 KMS 的替代方案)。以下代码显示了一个示例。
String key = UUID.randomUUID().toString();
byte[] secretKey = generateSecretKey();
String b64Key = Base64.getEncoder().encodeToString(secretKey);
String b64KeyMd5 = Md5Utils.md5AsBase64(secretKey);
String awsEndpoint = "aws2-s3://mycamel?autoCreateBucket=false&useCustomerKey=true&customerKeyId=RAW(" + b64Key + ")&customerKeyMD5=RAW(" + b64KeyMd5 + ")&customerAlgorithm=" + AES256.name();
from("direct:putObject")
.setHeader(AWS2S3Constants.KEY, constant("test.txt"))
.setBody(constant("Test"))
.to(awsEndpoint);5.12. 使用 POJO 作为正文
由于多个选项,有时构建 AWS Request 可能会很复杂。我们介绍可能将 POJO 用作正文。在 AWS S3 中,您可以提交多个操作,作为 List 代理请求示例,您可以执行以下操作:
from("direct:aws2-s3")
.setBody(ListObjectsRequest.builder().bucket(bucketName).build())
.to("aws2-s3://test?amazonS3Client=#amazonS3Client&operation=listObjects&pojoRequest=true")这样,您将直接传递请求,而无需专门传递与此操作相关的标头和选项。
5.13. 创建 S3 客户端并在 registry 中添加组件
有时,您要使用 AWS2S3Configuration 执行一些高级配置,这还允许设置 S3 客户端。您可以在组件配置中创建和设置 S3 客户端,如下例所示
String awsBucketAccessKey = "your_access_key";
String awsBucketSecretKey = "your_secret_key";
S3Client s3Client = S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(awsBucketAccessKey, awsBucketSecretKey)))
.region(Region.US_EAST_1).build();
AWS2S3Configuration configuration = new AWS2S3Configuration();
configuration.setAmazonS3Client(s3Client);
configuration.setAutoDiscoverClient(true);
configuration.setBucketName("s3bucket2020");
configuration.setRegion("us-east-1");现在,您可以配置 S3 组件(使用上面创建的配置对象),并在路由初始化前将其添加到配置方法中的 registry 中。
AWS2S3Component s3Component = new AWS2S3Component(getContext());
s3Component.setConfiguration(configuration);
s3Component.setLazyStartProducer(true);
camelContext.addComponent("aws2-s3", s3Component);现在,您的组件将用于在 camel 路由中实施的所有操作。
5.14. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws2-s3</artifactId>
<version>${camel-version}</version>
</dependency>
其中 3.14.2 必须替换为 Camel 的实际版本。
5.15. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-s3 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-aws2-s3-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 51 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.aws2-s3.access-key | Amazon AWS 访问密钥. | 字符串 | |
| camel.component.aws2-s3.amazon-s3-client | 对 registry 中的 com.amazonaws.services.s3.AmazonS3 的引用。选项是一个 software.amazon.awssdk.services.s3.S3Client 类型。 | S3Client | |
| camel.component.aws2-s3.amazon-s3-presigner | 用于 Request 的 S3 Presigner 主要在 createDownloadLink 操作中使用。选项是一个 software.amazon.awssdk.services.s3.presigner.S3Presigner 类型。 | S3Presigner | |
| camel.component.aws2-s3.auto-create-bucket | 设置 S3 存储桶存储桶Name 的自动创建。如果启用了 moveAfterRead 选项,则也会应用它,如果尚未存在 moveAfterRead 选项,它将创建 destinationBucket。 | false | 布尔值 |
| camel.component.aws2-s3.autoclose-body | 如果此选项为 true,且 includeBody 为 false,则在交换完成时调用 S3Object.close ()方法。此选项与 includeBody 选项密切相关。如果将 includeBody 设为 false,autocloseBody 设为 false,它将是关闭 S3Object 流的调用者。将 autocloseBody 设置为 true,将自动关闭 S3Object 流。 | true | 布尔值 |
| camel.component.aws2-s3.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.aws2-s3.aws-k-m-s-key-id | 定义在启用 KMS 时要使用的 KMS 密钥 ID。 | 字符串 | |
| camel.component.aws2-s3.batch-message-number | 在流传输上传模式中制作批处理的消息数量。 | 10 | 整数 |
| camel.component.aws2-s3.batch-size | 流上传模式的批处理大小(以字节为单位)。 | 1000000 | 整数 |
| camel.component.aws2-s3.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.aws2-s3.configuration | 组件配置。选项是 org.apache.camel.component.aws2.s3.AWS2S3Configuration 类型。 | AWS2S3Configuration | |
| camel.component.aws2-s3.customer-algorithm | 定义在启用了 CustomerKey 时要使用的客户算法。 | 字符串 | |
| camel.component.aws2-s3.customer-key-id | 定义在启用 CustomerKey 时要使用的 Customer key 的 id。 | 字符串 | |
| camel.component.aws2-s3.customer-key-m-d5 | 定义在启用 CustomerKey 时要使用的客户密钥的 MD5。 | 字符串 | |
| camel.component.aws2-s3.delete-after-read | 在检索后,从 S3 删除对象。只有在提交 Exchange 时,才会执行删除。如果进行回滚,则对象不会被删除。如果此选项为 false,则同一对象将被通过并再次在轮询上检索。因此,您需要使用路由中的 Idempotent Consumer EIP 来过滤重复项。您可以使用 AWS2S3Constants#BUClKET_NAME 和 AWS2S3Constants#KEY 标头过滤,或者只过滤 AWS2S3Constants#KEY 标头。 | true | 布尔值 |
| camel.component.aws2-s3.delete-after-write | 在 S3 文件上传后删除文件对象。 | false | 布尔值 |
| camel.component.aws2-s3.delimiter | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的分隔符仅消耗我们感兴趣的对象。 | 字符串 | |
| camel.component.aws2-s3.destination-bucket | 定义当 moveAfterRead 设置为 true 时必须移动对象的目标存储桶。 | 字符串 | |
| camel.component.aws2-s3.destination-bucket-prefix | 定义在必须移动对象并将 moveAfterRead 设置为 true 时使用的目标存储桶前缀。 | 字符串 | |
| camel.component.aws2-s3.destination-bucket-suffix | 定义在必须移动对象并将 moveAfterRead 设置为 true 时使用的目标存储桶后缀。 | 字符串 | |
| camel.component.aws2-s3.done-file-name | 如果提供,Camel 仅在文件存在时使用文件。 | 字符串 | |
| camel.component.aws2-s3.enabled | 是否启用 aws2-s3 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.aws2-s3.file-name | 要从具有给定文件名的存储桶获取对象。 | 字符串 | |
| camel.component.aws2-s3.ignore-body | 如果为 true,则 S3 对象正文将完全忽略,如果设为 false,则 S3 对象将放入正文中。把它设置为 true,将覆盖 includeBody 选项定义的任何行为。 | false | 布尔值 |
| camel.component.aws2-s3.include-body | 如果为 true,则 S3Object Exchange 将被使用并放入正文和关闭中。如果为 false,S3Object 流将原始放在正文中,标头将使用 S3 对象元数据设置。这个选项与 autocloseBody 选项密切相关。如果将 includeBody 设为 true,因为 S3Object 流将被消耗,然后也会关闭它,而在 includeBody false 时,它将是关闭 S3Object 流的调用者。但是,当 includeBody 为 false 时,将 autocloseBody 设置为 true,它将在交换完成时自动关闭 S3Object 流。 | true | 布尔值 |
| camel.component.aws2-s3.include-folders | 如果为 true,将消耗文件夹/目录。如果是 false,则忽略它们,且不会为那些交换创建。 | true | 布尔值 |
| camel.component.aws2-s3.key-name | 通过端点参数在存储桶中设置元素的密钥名称。 | 字符串 | |
| camel.component.aws2-s3.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.aws2-s3.move-after-read | 在检索后,将对象从 S3 存储桶移到不同的存储桶。要完成操作,必须设置 destinationBucket 选项。仅当 Exchange 提交时,才会执行复制存储桶操作。如果进行回滚,则对象不会被移动。 | false | 布尔值 |
| camel.component.aws2-s3.multi-part-upload | 如果为 true,则 camel 将上传带有多部分格式的 文件,由 partSize 选项决定部分大小。 | false | 布尔值 |
| camel.component.aws2-s3.naming-strategy | 在流上传模式中使用的命名策略。 | AWSS3NamingStrategyEnum | |
| camel.component.aws2-s3.operation | 当用户不希望只进行上传时,要执行的操作。 | AWS2S3Operations | |
| camel.component.aws2-s3.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| camel.component.aws2-s3.part-size | 设置多部分上传中使用的 partSize,默认大小为 25M。 | 26214400 | Long |
| camel.component.aws2-s3.pojo-request | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
| camel.component.aws2-s3.policy | 此队列的策略在 com.amazonaws.services.s3.AmazonS3#setBucketPolicy ()方法中设置。 | 字符串 | |
| camel.component.aws2-s3.prefix | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的前缀,仅用于消耗我们感兴趣的对象。 | 字符串 | |
| camel.component.aws2-s3.proxy-host | 在实例化 SQS 客户端时定义代理主机。 | 字符串 | |
| camel.component.aws2-s3.proxy-port | 指定要在客户端定义中使用的代理端口。 | 整数 | |
| camel.component.aws2-s3.proxy-protocol | 在实例化 S3 客户端时定义代理协议。 | 协议 | |
| camel.component.aws2-s3.region | S3 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| camel.component.aws2-s3.restarting-policy | 在流上传模式中使用的重启策略。 | AWSS3RestartingPolicyEnum | |
| camel.component.aws2-s3.secret-key | Amazon AWS 机密密钥. | 字符串 | |
| camel.component.aws2-s3.storage-class | 在 com.amazonaws.services.s3.model.PutObjectRequest 请求中设置的存储类。 | 字符串 | |
| camel.component.aws2-s3.streaming-upload-mode | 当流模式为 true 时,上传到存储桶将以流传输方式进行。 | false | 布尔值 |
| camel.component.aws2-s3.streaming-upload-timeout | 在流上传模式为 true 时,此选项会将超时设置为完成上传。 | Long | |
| camel.component.aws2-s3.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| camel.component.aws2-s3.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| camel.component.aws2-s3.use-aws-k-m-s | 定义是否必须使用 KMS。 | false | 布尔值 |
| camel.component.aws2-s3.use-customer-key | 定义是否需要使用客户密钥。 | false | 布尔值 |
| camel.component.aws2-s3.use-default-credentials-provider | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
第 6 章 AWS Simple Notification System (SNS)
仅支持制作者
AWS2 SNS 组件允许消息发送到 Amazon Simple Notification Topic。Amazon API 的实现由 AWS SDK 提供。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并签名以使用 Amazon SNS。如需更多信息,请参阅 Amazon SNS。
6.1. URI 格式
aws2-sns://topicNameOrArn[?options]
如果主题不存在,则会创建它们。您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
6.2. URI 选项
6.2.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
6.2.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
6.2.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
6.3. 组件选项
AWS Simple Notification System (SNS)组件支持 24 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonSNSClient (producer) | Autowired 使用 AmazonSNS 作为客户端。 | SnsClient | |
| autoCreateTopic (producer) | 设置主题的自动创建。 | false | 布尔值 |
| 配置 (生成器) | 组件配置. | Sns2Configuration | |
| kmsMasterKeyId (producer) | 用于 Amazon SNS 或自定义 CMK 的 AWS 管理的客户主密钥(CMK)的 ID。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| messageDeduplicationIdStrategy (producer) | 仅适用于 FIFO 主题。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:使用ExchangeId,使用ContentBasedDeduplication。对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 Enum 值:
| useExchangeId | 字符串 |
| messageGroupIdStrategy (producer) | 仅适用于 FIFO 主题。在消息上设置 messageGroupId 的策略。可以是以下选项之一:使用Constant、useExchangeId、usePropertyValue。对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 Enum 值:
| 字符串 | |
| messageStructure (producer) | 使用 json 的消息结构。 | 字符串 | |
| overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| 策略 (生成程序) | 本主题的策略。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| proxyHost (producer) | 在实例化 SNS 客户端时定义代理主机。 | 字符串 | |
| proxyPort (producer) | 在实例化 SNS 客户端时定义代理端口。 | 整数 | |
| proxyprotocol (producer) | 在实例化 SNS 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| queueUrl (producer) | 要订阅的 queueUrl。 | 字符串 | |
| 区域 (生成者) | SNS 客户端需要在其中工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| serverSideEncryptionEnabled (producer) | 定义是否在主题中启用 Server Side Encryption。 | false | 布尔值 |
| 主题 (生成者) | 如果邮件标头 'CamelAwsSnsSubject' 不存在,则使用主题。 | 字符串 | |
| subscribeSNStoSQS (producer) | 定义 SNS 主题和 SQS 之间的订阅是否必须完成。 | false | 布尔值 |
| trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (producer) | 设置 SNS 客户端是否应该预期在 AWS infra 实例上加载凭证,或希望传递静态凭证。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
6.4. 端点选项
AWS Simple Notification System (SNS)端点使用 URI 语法进行配置:
aws2-sns:topicNameOrArn
使用以下路径和查询参数:
6.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| topicNameOrArn (producer) | 所需的 主题名称或 ARN。 | 字符串 |
6.4.2. 查询参数(23 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonSNSClient (producer) | Autowired 使用 AmazonSNS 作为客户端。 | SnsClient | |
| autoCreateTopic (producer) | 设置主题的自动创建。 | false | 布尔值 |
| headerFilterStrategy (producer) | 使用自定义 HeaderFilterStrategy 将标头映射到/来自 Camel。 | HeaderFilterStrategy | |
| kmsMasterKeyId (producer) | 用于 Amazon SNS 或自定义 CMK 的 AWS 管理的客户主密钥(CMK)的 ID。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| messageDeduplicationIdStrategy (producer) | 仅适用于 FIFO 主题。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:使用ExchangeId,使用ContentBasedDeduplication。对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 Enum 值:
| useExchangeId | 字符串 |
| messageGroupIdStrategy (producer) | 仅适用于 FIFO 主题。在消息上设置 messageGroupId 的策略。可以是以下选项之一:使用Constant、useExchangeId、usePropertyValue。对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 Enum 值:
| 字符串 | |
| messageStructure (producer) | 使用 json 的消息结构。 | 字符串 | |
| overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| 策略 (生成程序) | 本主题的策略。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| proxyHost (producer) | 在实例化 SNS 客户端时定义代理主机。 | 字符串 | |
| proxyPort (producer) | 在实例化 SNS 客户端时定义代理端口。 | 整数 | |
| proxyprotocol (producer) | 在实例化 SNS 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| queueUrl (producer) | 要订阅的 queueUrl。 | 字符串 | |
| 区域 (生成者) | SNS 客户端需要在其中工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| serverSideEncryptionEnabled (producer) | 定义是否在主题中启用 Server Side Encryption。 | false | 布尔值 |
| 主题 (生成者) | 如果邮件标头 'CamelAwsSnsSubject' 不存在,则使用主题。 | 字符串 | |
| subscribeSNStoSQS (producer) | 定义 SNS 主题和 SQS 之间的订阅是否必须完成。 | false | 布尔值 |
| trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (producer) | 设置 SNS 客户端是否应该预期在 AWS infra 实例上加载凭证,或希望传递静态凭证。 | false | 布尔值 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
所需的 SNS 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSNSClient,才能访问 Amazon 的 SNS。
6.5. 使用方法
6.5.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java system properties - aws.accessKeyId and aws.secretKey
- 环境变量 - AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。
- AWS STS 的 Web Identity Token。
- 共享凭证和配置文件。
- Amazon ECS 容器凭证 - 如果设置了环境变量 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,则从 Amazon ECS 加载。
- Amazon EC2 实例配置集凭据。
有关此信息的更多信息,您可以查看 AWS 凭证文档。
6.5.2. 由 SNS producer 评估的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
|
Amazon SNS 消息主题。如果没有设置,则使用 |
6.5.3. SNS producer 设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| Amazon SNS 消息 ID。 |
6.5.4. 高级 AmazonSNS 配置
如果需要对 SnsClient 实例配置进行更多控制,您可以创建自己的实例,并从 URI 引用它:
from("direct:start")
.to("aws2-sns://MyTopic?amazonSNSClient=#client");
#client 指的是 Registry 中的 AmazonSNS。
6.5.5. 在 AWS SNS 主题和 AWS SQS Queue 之间创建订阅
您可以创建一个 SQS Queue 订阅到 SNS 主题:
from("direct:start")
.to("aws2-sns://test-camel-sns1?amazonSNSClient=#amazonSNSClient&subscribeSNStoSQS=true&queueUrl=https://sqs.eu-central-1.amazonaws.com/780410022472/test-camel");
#amazonSNSClient 是指 Registry 中的 SnsClient。通过将 subscribeSNStoSQS 指定为 true,并且指定现有 SQS 队列的 queueUrl,您可以将 SQS Queue 订阅到您的 SNS 主题。
此时,您可以通过 SQS Queue 使用来自 SNS 主题的消息
from("aws2-sqs://test-camel?amazonSQSClient=#amazonSQSClient&delay=50&maxMessagesPerPoll=5")
.to(...);6.6. Topic Autocreation
通过选项 autoCreateTopic 用户,如果 SNS Topic 不存在,可以避免自动创建它。此选项的默认值是 true。如果设置为 false 任何对 AWS 中不存在的主题的操作,则不会成功,并返回错误。
6.7. SNS FIFO
支持 SNS FIFO。在创建 SQS 队列时,您将订阅 SNS 主题,需要记住,您需要让 SNS Topic 发送消息到 SQS Queue。
示例
假设您创建一个名为 Order.fifo 的 SNS FIFO 主题,以及一个名为 QueueSub.fifo 的 SQS Queue。
在 QueueSub.fifo 的访问策略中,您应该提交如下内容:
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__owner_statement",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::780560123482:root"
},
"Action": "SQS:*",
"Resource": "arn:aws:sqs:eu-west-1:780560123482:QueueSub.fifo"
},
{
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:eu-west-1:780560123482:QueueSub.fifo",
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:sns:eu-west-1:780410022472:Order.fifo"
}
}
}
]
}这是使订阅正常工作的关键步骤。
6.7.1. SNS Fifo Topic 消息组 Id Strategy 和消息 Deduplication Id Strategy
向 FIFO 主题发送一些时,您需要始终设置消息组 Id 策略。
如果 SNS Fifo 主题上启用了基于内容的消息 deduplication,则不需要设置消息 deduplication id 策略,否则您必须对其进行设置。
6.8. 例子
6.8.1. 制作者示例
发送到主题
from("direct:start")
.to("aws2-sns://camel-topic?subject=The+subject+message&autoCreateTopic=true");
6.9. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws2-sns</artifactId>
<version>${camel-version}</version>
</dependency>
其中 3.14.2 必须替换为 Camel 的实际版本。
6.10. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-sns 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-aws2-sns-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 25 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.aws2-sns.access-key | Amazon AWS 访问密钥. | 字符串 | |
| camel.component.aws2-sns.amazon-s-n-s-client | 将 AmazonSNS 用作客户端。选项是一个 software.amazon.awssdk.services.sns.SnsClient 类型。 | SnsClient | |
| camel.component.aws2-sns.auto-create-topic | 设置主题的自动创建。 | false | 布尔值 |
| camel.component.aws2-sns.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.aws2-sns.configuration | 组件配置.选项是 org.apache.camel.component.aws2.sns.Sns2Configuration 类型。 | Sns2Configuration | |
| camel.component.aws2-sns.enabled | 是否启用 aws2-sns 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.aws2-sns.kms-master-key-id | 用于 Amazon SNS 或自定义 CMK 的 AWS 管理的客户主密钥(CMK)的 ID。 | 字符串 | |
| camel.component.aws2-sns.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.aws2-sns.message-deduplication-id-strategy | 仅适用于 FIFO 主题。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:使用ExchangeId,使用ContentBasedDeduplication。对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 | useExchangeId | 字符串 |
| camel.component.aws2-sns.message-group-id-strategy | 仅适用于 FIFO 主题。在消息上设置 messageGroupId 的策略。可以是以下选项之一:使用Constant、useExchangeId、usePropertyValue。对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 | 字符串 | |
| camel.component.aws2-sns.message-structure | 使用 json 的消息结构。 | 字符串 | |
| camel.component.aws2-sns.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| camel.component.aws2-sns.policy | 本主题的策略。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| camel.component.aws2-sns.proxy-host | 在实例化 SNS 客户端时定义代理主机。 | 字符串 | |
| camel.component.aws2-sns.proxy-port | 在实例化 SNS 客户端时定义代理端口。 | 整数 | |
| camel.component.aws2-sns.proxy-protocol | 在实例化 SNS 客户端时定义代理协议。 | 协议 | |
| camel.component.aws2-sns.queue-url | 要订阅的 queueUrl。 | 字符串 | |
| camel.component.aws2-sns.region | SNS 客户端需要在其中工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| camel.component.aws2-sns.secret-key | Amazon AWS 机密密钥. | 字符串 | |
| camel.component.aws2-sns.server-side-encryption-enabled | 定义是否在主题中启用 Server Side Encryption。 | false | 布尔值 |
| camel.component.aws2-sns.subject | 如果邮件标头 'CamelAwsSnsSubject' 不存在,则使用主题。 | 字符串 | |
| camel.component.aws2-sns.subscribe-s-n-sto-s-q-s | 定义 SNS 主题和 SQS 之间的订阅是否必须完成。 | false | 布尔值 |
| camel.component.aws2-sns.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| camel.component.aws2-sns.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| camel.component.aws2-sns.use-default-credentials-provider | 设置 SNS 客户端是否应该预期在 AWS infra 实例上加载凭证,或希望传递静态凭证。 | false | 布尔值 |
第 7 章 AWS Simple Queue Service (SQS)
支持制作者和使用者
AWS2 SQS 组件支持向 Amazon 的 SQS 服务发送和接收信息。
先决条件
您必须拥有有效的 Amazon Web Services 开发人员帐户,并且注册为使用 Amazon SQS。如需更多信息,请参阅 Amazon SQS。
7.1. URI 格式
aws2-sqs://queueNameOrArn[?options]
如果队列不存在,将创建队列。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
7.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
7.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
7.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
7.3. 组件选项
AWS Simple Queue Service (SQS)组件支持 43 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonAWSHost (common) | Amazon AWS 云的主机名。 | amazonaws.com | 字符串 |
| amazonSQSClient (通用) | Autowired 以将 AmazonSQS 用作客户端。 | SqsClient | |
| autoCreateQueue (common) | 设置队列的自动创建. | false | 布尔值 |
| 配置 (common) | AWS SQS 默认配置。 | Sqs2Configuration | |
| overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| 协议 (common) | 用于与 SQS 通信的底层协议。 | https | 字符串 |
| proxyprotocol (common) | 在实例化 SQS 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| queueOwnerAWSAccountId (common) | 当您需要将队列与不同的帐户所有者连接时,指定队列所有者 aws 帐户 ID。 | 字符串 | |
| 区域 (通用) | SQS 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| trustAllCertificates (common) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (common) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (common) | 设置 SQS 客户端是否应该预期在 AWS infra 实例上加载凭证,或希望传递静态凭证。 | false | 布尔值 |
| attributeNames (consumer) | 在消耗时要接收的属性名称列表。可以使用逗号分隔多个名称。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| concurrentConsumers (consumer) | 允许您使用多个线程轮询 sqs 队列来提高吞吐量。 | 1 | int |
| defaultVisibilityTimeout (consumer) | 默认可见性超时(以秒为单位)。 | 整数 | |
| deleteAfterRead (consumer) | 读取后,从 SQS 删除消息。 | true | 布尔值 |
| DeleteIfFiltered (consumer) | 如果交换具有键 Sqs2Constants#SQS_DELETE_FILTERED (CamelAwsSqsDeleteFiltered),则是否将 DeleteMessage 发送到 SQS 队列。 | true | 布尔值 |
| scalingMessageVisibility (consumer) | 如果启用,则调度的后台任务将在 SQS 上保持消息可见性。如果处理消息需要很长时间。如果设置为 true defaultVisibilityTimeout,则必须设置。 | false | 布尔值 |
| kmsDataKeyReusePeriodSeconds (consumer) | Amazon SQS 在再次调用 AWS KMS 之前,以便 Amazon SQS 可以重复使用或解密信息的时间长度(以秒为单位)。代表 60 秒(1 分钟)和 86,400 秒(24 小时)之间的整数。默认:300 (5 分钟)。 | 整数 | |
| kmsMasterKeyId (consumer) | Amazon SQS 或自定义 CMK 的 AWS 管理的客户主密钥(CMK)的 ID。 | 字符串 | |
| messageAttributeNames (consumer) | 在消耗时要接收的消息属性名称列表。可以使用逗号分隔多个名称。 | 字符串 | |
| serverSideEncryptionEnabled (consumer) | 定义是否在队列中启用服务器 Side 加密。 | false | 布尔值 |
| visibilityTimeout (consumer) | 在由 ReceiveMessage 请求检索后,收到的消息会被隐藏在 com.amazonaws.services.sqs.model.SetQueueAttributesRequest 中检索的持续时间(以秒为单位)。这只有在与 defaultVisibilityTimeout 不同时才有意义。它永久更改队列可见性超时属性。 | 整数 | |
| waitTimeSeconds (consumer) | ReceiveMessage 操作调用的持续时间(0 到 20)将等待直到队列中消息包含在响应中。 | 整数 | |
| batchSeparator (producer) | 在传递 String 以发送批处理消息操作时,设置分隔符。 | , | 字符串 |
| delaySeconds (producer) | 延迟发送消息的秒数。 | 整数 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| messageDeduplicationIdStrategy (producer) | 仅适用于 FIFO 队列。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:使用ExchangeId,使用ContentBasedDeduplication。对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 Enum 值:
| useExchangeId | 字符串 |
| messageGroupIdStrategy (producer) | 仅适用于 FIFO 队列。在消息上设置 messageGroupId 的策略。可以是以下选项之一:使用Constant、useExchangeId、usePropertyValue。对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 Enum 值:
| 字符串 | |
| 操作 (生成) | 当用户不想发送消息时,要执行的操作。 Enum 值:
| Sqs2Operations | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| delayQueue (高级) | 定义您是否要将 delaySeconds 选项应用到队列或单个消息。 | false | 布尔值 |
| queueUrl (advanced) | 明确定义 queueUrl:所有其他参数(会影响 queueUrl)将被忽略。这个参数被用来连接到 SQS 的模拟实施,用于测试。 | 字符串 | |
| proxyHost (proxy) | 在实例化 SQS 客户端时定义代理主机。 | 字符串 | |
| proxyPort (proxy) | 在实例化 SQS 客户端时定义代理端口。 | 整数 | |
| maximumMessageSize (queue) | maximumMessageSize (以字节为单位)SQS 消息可以包含此队列。 | 整数 | |
| messageRetentionPeriod (queue) | 此队列的 SQS 保留了 messageRetentionPeriod (以秒为单位)。 | 整数 | |
| policy (queue) | 此队列的策略。它默认从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| receiveMessageWaitTimeSeconds (queue) | 如果您没有在请求中指定 WaitTimeSeconds,则使用 queue 属性 ReceiveMessageWaitTimeSeconds 来确定要等待的时长。 | 整数 | |
| redrivePolicy (queue) | 指定发送消息到 DeadLetter 队列的策略。请参阅 Amazon 文档。 | 字符串 | |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
7.4. 端点选项
AWS Simple Queue Service (SQS)端点使用 URI 语法进行配置:
aws2-sqs:queueNameOrArn
使用以下路径和查询参数:
7.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| queueNameOrArn (common) | 所需的 队列名称或 ARN。 | 字符串 |
7.4.2. 查询参数(61 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| amazonAWSHost (common) | Amazon AWS 云的主机名。 | amazonaws.com | 字符串 |
| amazonSQSClient (通用) | Autowired 以将 AmazonSQS 用作客户端。 | SqsClient | |
| autoCreateQueue (common) | 设置队列的自动创建. | false | 布尔值 |
| headerFilterStrategy (common) | 使用自定义 HeaderFilterStrategy 将标头映射到/来自 Camel。 | HeaderFilterStrategy | |
| overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| 协议 (common) | 用于与 SQS 通信的底层协议。 | https | 字符串 |
| proxyprotocol (common) | 在实例化 SQS 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
| queueOwnerAWSAccountId (common) | 当您需要将队列与不同的帐户所有者连接时,指定队列所有者 aws 帐户 ID。 | 字符串 | |
| 区域 (通用) | SQS 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| trustAllCertificates (common) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| uriEndpointOverride (common) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| useDefaultCredentialsProvider (common) | 设置 SQS 客户端是否应该预期在 AWS infra 实例上加载凭证,或希望传递静态凭证。 | false | 布尔值 |
| attributeNames (consumer) | 在消耗时要接收的属性名称列表。可以使用逗号分隔多个名称。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| concurrentConsumers (consumer) | 允许您使用多个线程轮询 sqs 队列来提高吞吐量。 | 1 | int |
| defaultVisibilityTimeout (consumer) | 默认可见性超时(以秒为单位)。 | 整数 | |
| deleteAfterRead (consumer) | 读取后,从 SQS 删除消息。 | true | 布尔值 |
| DeleteIfFiltered (consumer) | 如果交换具有键 Sqs2Constants#SQS_DELETE_FILTERED (CamelAwsSqsDeleteFiltered),则是否将 DeleteMessage 发送到 SQS 队列。 | true | 布尔值 |
| scalingMessageVisibility (consumer) | 如果启用,则调度的后台任务将在 SQS 上保持消息可见性。如果处理消息需要很长时间。如果设置为 true defaultVisibilityTimeout,则必须设置。请参阅 Amazon 文档的详情。 | false | 布尔值 |
| kmsDataKeyReusePeriodSeconds (consumer) | Amazon SQS 在再次调用 AWS KMS 之前,以便 Amazon SQS 可以重复使用或解密信息的时间长度(以秒为单位)。代表 60 秒(1 分钟)和 86,400 秒(24 小时)之间的整数。默认:300 (5 分钟)。 | 整数 | |
| kmsMasterKeyId (consumer) | Amazon SQS 或自定义 CMK 的 AWS 管理的客户主密钥(CMK)的 ID。 | 字符串 | |
| maxMessagesPerPoll (使用者) | 获取最大消息数,作为每次轮询轮询的限制。默认没有限制,但使用 0 或负数将其禁用为无限。 | int | |
| messageAttributeNames (consumer) | 在消耗时要接收的消息属性名称列表。可以使用逗号分隔多个名称。 | 字符串 | |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| serverSideEncryptionEnabled (consumer) | 定义是否在队列中启用服务器 Side 加密。 | false | 布尔值 |
| visibilityTimeout (consumer) | 在由 ReceiveMessage 请求检索后,收到的消息会被隐藏在 com.amazonaws.services.sqs.model.SetQueueAttributesRequest 中检索的持续时间(以秒为单位)。这只有在与 defaultVisibilityTimeout 不同时才有意义。它永久更改队列可见性超时属性。 | 整数 | |
| waitTimeSeconds (consumer) | ReceiveMessage 操作调用的持续时间(0 到 20)将等待直到队列中消息包含在响应中。 | 整数 | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| batchSeparator (producer) | 在传递 String 以发送批处理消息操作时,设置分隔符。 | , | 字符串 |
| delaySeconds (producer) | 延迟发送消息的秒数。 | 整数 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| messageDeduplicationIdStrategy (producer) | 仅适用于 FIFO 队列。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:使用ExchangeId,使用ContentBasedDeduplication。对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 Enum 值:
| useExchangeId | 字符串 |
| messageGroupIdStrategy (producer) | 仅适用于 FIFO 队列。在消息上设置 messageGroupId 的策略。可以是以下选项之一:使用Constant、useExchangeId、usePropertyValue。对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 Enum 值:
| 字符串 | |
| 操作 (生成) | 当用户不想发送消息时,要执行的操作。 Enum 值:
| Sqs2Operations | |
| delayQueue (高级) | 定义您是否要将 delaySeconds 选项应用到队列或单个消息。 | false | 布尔值 |
| queueUrl (advanced) | 明确定义 queueUrl:所有其他参数(会影响 queueUrl)将被忽略。这个参数被用来连接到 SQS 的模拟实施,用于测试。 | 字符串 | |
| proxyHost (proxy) | 在实例化 SQS 客户端时定义代理主机。 | 字符串 | |
| proxyPort (proxy) | 在实例化 SQS 客户端时定义代理端口。 | 整数 | |
| maximumMessageSize (queue) | maximumMessageSize (以字节为单位)SQS 消息可以包含此队列。 | 整数 | |
| messageRetentionPeriod (queue) | 此队列的 SQS 保留了 messageRetentionPeriod (以秒为单位)。 | 整数 | |
| policy (queue) | 此队列的策略。它默认从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| receiveMessageWaitTimeSeconds (queue) | 如果您没有在请求中指定 WaitTimeSeconds,则使用 queue 属性 ReceiveMessageWaitTimeSeconds 来确定要等待的时长。 | 整数 | |
| redrivePolicy (queue) | 指定发送消息到 DeadLetter 队列的策略。请参阅 Amazon 文档。 | 字符串 | |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| AccessKey ( 安全) | Amazon AWS 访问密钥. | 字符串 | |
| secretKey (security) | Amazon AWS 机密密钥. | 字符串 |
所需的 SQS 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSQSClient,才能访问 Amazon 的 SQS。
7.5. batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
7.6. 使用方法
7.6.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
-
Java system properties -
aws.accessKeyIdandaws.secretKey -
环境变量 -
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。 - AWS STS 的 Web Identity Token。
- 共享凭证和配置文件。
-
Amazon ECS 容器凭证 - 如果设置了环境变量
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,则从 Amazon ECS 加载。 - Amazon EC2 实例配置集凭据。
有关此信息的更多信息,您可以查看 AWS 凭证文档
7.6.2. SQS producer 设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| Amazon SQS 消息的 MD5 校验和。 |
|
|
| Amazon SQS 消息 ID。 |
|
|
| Amazon SQS 消息可看到的延迟时间。 |
7.6.3. SQS consumer 设置的消息标头
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| Amazon SQS 消息的 MD5 校验和。 |
|
|
| Amazon SQS 消息 ID。 |
|
|
| Amazon SQS 消息接收处理。 |
|
|
| Amazon SQS 消息属性。 |
7.6.4. 高级 AmazonSQS 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 SqsClient 实例配置拥有更多控制,您可以创建自己的实例:
from("aws2-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5")
.to("mock:result");7.6.5. 创建或更新 SQS Queue
在 SQS 组件中,当启动端点时,将执行检查来获取队列是否存在的信息。您可以使用 SQSConfiguration 选项通过 QueueAttributeName 映射自定义创建。
from("aws2-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5")
.to("mock:result");
在本例中,如果 AWS 上尚未创建 MyQueue 队列(并且 autoCreateQueue 选项设为 true),它将使用 SQS 配置中的默认参数创建。如果已在 AWS 上启动,则使用 SQS 配置选项来覆盖现有的 AWS 配置。
7.6.6. DelayQueue VS Delay 用于单消息
当选项 delayQueue 设为 true 时,SQS Queue 将是一个带有 DelaySeconds 选项的 DelayQueue。有关 DelayQueue 的更多信息,请参阅 AWS SQS 文档。要考虑的一个重要信息如下:
- 对于标准队列,每个队列的延迟设置不会改变设置不会影响队列中已存在的消息的延迟。
- 对于 FIFO 队列,每个队列延迟设置是重新发生的,设置会影响队列中已存在的消息的延迟。
如官方文档中所述。如果要在单个消息上指定延迟,您可以忽略 delayQueue 选项,而您可以忽略 delayQueue 选项,而您可以将此选项设置为 true (如果需要向所有消息添加固定延迟)。
7.6.7. 服务器段加密
队列有一组服务器回送加密属性。相关选项包括 serverSideEncryptionEnabled,keyMasterKeyId 和 kmsDataKeyReusePeriod。默认情况下禁用 SSE。您需要明确将选项设置为 true,并将相关参数设置为队列属性。
7.7. JMS 样式的 Selectors
SQS 不允许选择器,但您可以使用 Camel Filter EIP 并设置相应的 visibilityTimeout 来有效地达到此目的。当 SQS 分配消息时,它将等待可见性超时,然后再尝试将消息分配到不同的消费者,除非收到 DeleteMessage。默认情况下,Camel 始终在路由末尾发送 DeleteMessage,除非路由失败。要实现适当的过滤,且没有在成功完成路由时发送 DeleteMessage,请使用 Filter:
from("aws2-sqs://MyQueue?amazonSQSClient=#client&defaultVisibilityTimeout=5000&deleteIfFiltered=false&deleteAfterRead=false")
.filter("${header.login} == true")
.setProperty(Sqs2Constants.SQS_DELETE_FILTERED, constant(true))
.to("mock:filter");在上面的代码中,如果交换没有适当的标头,它将不会通过过滤器,也不会从 SQS 队列中删除。5000 毫秒后,消息将对其他用户可见。
请注意,我们必须将属性 Sqs2Constants.SQS_DELETE_FILTERED 设置为 true,以指示 Camel 发送 DeleteMessage (如果被过滤)。
7.8. 可用的 Producer 操作
- 单个消息(默认)
- sendBatchMessage
- deleteMessage
- listQueues
7.9. 发送消息
您可以设置 SendMessageBatchRequest 或 Iterable
from("direct:start")
.setBody(constant("Camel rocks!"))
.to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");7.10. 发送批处理消息
您可以设置 SendMessageBatchRequest 或 Iterable
from("direct:start")
.setHeader(SqsConstants.SQS_OPERATION, constant("sendBatchMessage"))
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Collection c = new ArrayList();
c.add("team1");
c.add("team2");
c.add("team3");
c.add("team4");
exchange.getIn().setBody(c);
}
})
.to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");
因此,您将获得一个包含 SendMessageBatchResponse 实例的交换,您可以核实消息是成功的,以及消息是什么。对批处理的每个消息设置的 id 将是一个随机 UUID。
7.11. 删除单个消息
使用 deleteMessage 操作删除单个消息。您需要为您要删除的消息设置接收处理标头。
from("direct:start")
.setHeader(SqsConstants.SQS_OPERATION, constant("deleteMessage"))
.setHeader(SqsConstants.RECEIPT_HANDLE, constant("123456"))
.to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");
因此,您将获得包含 DeleteMessageResponse 实例的交换,您可以使用它来检查消息是否已删除。
7.12. 列表队列
使用 listQueues 操作来列出队列。
from("direct:start")
.setHeader(SqsConstants.SQS_OPERATION, constant("listQueues"))
.to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");
因此,您将获得包含 ListQueuesResponse 实例的交换,您可以进行检查实际队列。
7.13. 清除队列
使用 purgeQueue 操作清除队列。
from("direct:start")
.setHeader(SqsConstants.SQS_OPERATION, constant("purgeQueue"))
.to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");
因此,您将获得包含 PurgeQueueResponse 实例的交换。
7.14. 队列自动创建
使用选项 autoCreateQueue 用户可以通过 autoCreateQueue 用户避免 SQS Queue 的自动创建(如果 SQS Queue 不存在)。此选项的默认值是 true。如果设置为 false 对 AWS 中不存在的队列的操作,则不会成功,并返回错误。
7.15. 发送批处理消息和消息重复数据删除策略
如果使用 SendBatchMessage Operation,您可以设置两种不同类型的消息重复数据删除策略: - useExchangeId - useContentBasedDeduplication
第一个将使用 ExchangeIdMessageDeduplicationIdStrategy,它将使用 Exchange ID 作为参数。其他地址将使用 NullMessageDeduplicationIdStrategy,它将使用正文作为 deduplication 元素。
如果是发送批处理消息操作,您需要使用 useContentBasedDeduplication,并在 Queue 上指向您需要 启用基于内容的 deduplication 选项。
7.16. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws2-sqs</artifactId>
<version>${camel-version}</version>
</dependency>
其中 3.14.2 必须替换为 Camel 的实际版本。
7.17. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-sqs 时,请确保使用以下 Maven 依赖项支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-aws2-sqs-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 44 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.aws2-sqs.access-key | Amazon AWS 访问密钥. | 字符串 | |
| camel.component.aws2-sqs.amazon-a-w-s-host | Amazon AWS 云的主机名。 | amazonaws.com | 字符串 |
| camel.component.aws2-sqs.amazon-s-q-s-client | 将 AmazonSQS 用作客户端。选项是一个 software.amazon.awssdk.services.sqs.SqsClient 类型。 | SqsClient | |
| camel.component.aws2-sqs.attribute-names | 在消耗时要接收的属性名称列表。可以使用逗号分隔多个名称。 | 字符串 | |
| camel.component.aws2-sqs.auto-create-queue | 设置队列的自动创建. | false | 布尔值 |
| camel.component.aws2-sqs.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.aws2-sqs.batch-separator | 在传递 String 以发送批处理消息操作时,设置分隔符。 | , | 字符串 |
| camel.component.aws2-sqs.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.aws2-sqs.concurrent-consumers | 允许您使用多个线程轮询 sqs 队列来提高吞吐量。 | 1 | 整数 |
| camel.component.aws2-sqs.configuration | AWS SQS 默认配置。选项是 org.apache.camel.component.aws2.sqs.Sqs2Configuration 类型。 | Sqs2Configuration | |
| camel.component.aws2-sqs.default-visibility-timeout | 默认可见性超时(以秒为单位)。 | 整数 | |
| camel.component.aws2-sqs.delay-queue | 定义您是否要将 delaySeconds 选项应用到队列或单个消息。 | false | 布尔值 |
| camel.component.aws2-sqs.delay-seconds | 延迟发送消息的秒数。 | 整数 | |
| camel.component.aws2-sqs.delete-after-read | 读取后,从 SQS 删除消息。 | true | 布尔值 |
| camel.component.aws2-sqs.delete-if-filtered | 如果交换具有键 Sqs2Constants#SQS_DELETE_FILTERED (CamelAwsSqsDeleteFiltered),则是否将 DeleteMessage 发送到 SQS 队列。 | true | 布尔值 |
| camel.component.aws2-sqs.enabled | 是否启用 aws2-sqs 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.aws2-sqs.extend-message-visibility | 如果启用,则调度的后台任务将在 SQS 上保持消息可见性。如果处理消息需要很长时间。如果设置为 true defaultVisibilityTimeout,则必须设置。请参阅 Amazon 文档的详情。 | false | 布尔值 |
| camel.component.aws2-sqs.kms-data-key-reuse-period-seconds | Amazon SQS 在再次调用 AWS KMS 之前,以便 Amazon SQS 可以重复使用或解密信息的时间长度(以秒为单位)。代表 60 秒(1 分钟)和 86,400 秒(24 小时)之间的整数。默认:300 (5 分钟)。 | 整数 | |
| camel.component.aws2-sqs.kms-master-key-id | Amazon SQS 或自定义 CMK 的 AWS 管理的客户主密钥(CMK)的 ID。 | 字符串 | |
| camel.component.aws2-sqs.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.aws2-sqs.maximum-message-size | maximumMessageSize (以字节为单位)SQS 消息可以包含此队列。 | 整数 | |
| camel.component.aws2-sqs.message-attribute-names | 在消耗时要接收的消息属性名称列表。可以使用逗号分隔多个名称。 | 字符串 | |
| camel.component.aws2-sqs.message-deduplication-id-strategy | 仅适用于 FIFO 队列。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:使用ExchangeId,使用ContentBasedDeduplication。对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 | useExchangeId | 字符串 |
| camel.component.aws2-sqs.message-group-id-strategy | 仅适用于 FIFO 队列。在消息上设置 messageGroupId 的策略。可以是以下选项之一:使用Constant、useExchangeId、usePropertyValue。对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 | 字符串 | |
| camel.component.aws2-sqs.message-retention-period | 此队列的 SQS 保留了 messageRetentionPeriod (以秒为单位)。 | 整数 | |
| camel.component.aws2-sqs.operation | 当用户不想发送消息时,要执行的操作。 | Sqs2Operations | |
| camel.component.aws2-sqs.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
| camel.component.aws2-sqs.policy | 此队列的策略。它默认从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| camel.component.aws2-sqs.protocol | 用于与 SQS 通信的底层协议。 | https | 字符串 |
| camel.component.aws2-sqs.proxy-host | 在实例化 SQS 客户端时定义代理主机。 | 字符串 | |
| camel.component.aws2-sqs.proxy-port | 在实例化 SQS 客户端时定义代理端口。 | 整数 | |
| camel.component.aws2-sqs.proxy-protocol | 在实例化 SQS 客户端时定义代理协议。 | 协议 | |
| camel.component.aws2-sqs.queue-owner-a-w-s-account-id | 当您需要将队列与不同的帐户所有者连接时,指定队列所有者 aws 帐户 ID。 | 字符串 | |
| camel.component.aws2-sqs.queue-url | 明确定义 queueUrl:所有其他参数(会影响 queueUrl)将被忽略。这个参数被用来连接到 SQS 的模拟实施,用于测试。 | 字符串 | |
| camel.component.aws2-sqs.receive-message-wait-time-seconds | 如果您没有在请求中指定 WaitTimeSeconds,则使用 queue 属性 ReceiveMessageWaitTimeSeconds 来确定要等待的时长。 | 整数 | |
| camel.component.aws2-sqs.redrive-policy | 指定发送消息到 DeadLetter 队列的策略。请参阅 Amazon 文档。 | 字符串 | |
| camel.component.aws2-sqs.region | SQS 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
| camel.component.aws2-sqs.secret-key | Amazon AWS 机密密钥. | 字符串 | |
| camel.component.aws2-sqs.server-side-encryption-enabled | 定义是否在队列中启用服务器 Side 加密。 | false | 布尔值 |
| camel.component.aws2-sqs.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
| camel.component.aws2-sqs.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
| camel.component.aws2-sqs.use-default-credentials-provider | 设置 SQS 客户端是否应该预期在 AWS infra 实例上加载凭证,或希望传递静态凭证。 | false | 布尔值 |
| camel.component.aws2-sqs.visibility-timeout | 在由 ReceiveMessage 请求检索后,收到的消息会被隐藏在 com.amazonaws.services.sqs.model.SetQueueAttributesRequest 中检索的持续时间(以秒为单位)。这只有在与 defaultVisibilityTimeout 不同时才有意义。它永久更改队列可见性超时属性。 | 整数 | |
| camel.component.aws2-sqs.wait-time-seconds | ReceiveMessage 操作调用的持续时间(0 到 20)将等待直到队列中消息包含在响应中。 | 整数 |
第 8 章 Azure Storage Blob Service
支持制作者和使用者
Azure Storage Blob 组件用于使用 Azure API v12 从 Azure Storage Blob Service 存储和检索 Blob。但是,如果版本高于 v12,我们将看到此组件是否可以根据变化量而采用这些更改。
先决条件
您必须具有有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-azure-storage-blob</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>8.1. URI 格式
azure-storage-blob://accountName[/containerName][?options]
如果是 consumer,则需要 accountName,则需要containerName。如果是制作者,它依赖于所请求的操作,例如,如果操作位于容器级别,如 createContainer、accountName 和 containerName 才是必需的,但在 blob 级别中请求操作时,如 getBlob、accountName、containerName 和 blobName。
如果这些 Blob 不存在,则会创建 blob。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
8.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
8.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
8.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
8.3. 组件选项
Azure Storage Blob Service 组件支持 31 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| blobName (common) | blob 名称,用于消耗容器中的特定 blob。但是,在制作者上,只需要 blob 级别的操作。 | 字符串 | |
| blobOffset (common) | 为上传或下载操作设置 blob 偏移,默认为 0。 | 0 | long |
| blobType (common) | blob 类型,以便为每个 blob 类型启动适当的设置。 Enum 值:
| blockblob | BlobType |
| closeStreamAfterRead (common) | 在读取或保持打开流后关闭流,默认为 true。 | true | 布尔值 |
| 配置 (common) | 组件配置。 | BlobConfiguration | |
| 凭证 (通用) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,这会包含重要的身份验证信息。 | StorageSharedKeyCredential | |
| dataCount (common) | 范围中包含多少个字节。如果指定,则必须大于或等于 0。 | Long | |
| fileDir (common) | 下载的 blob 将保存到的项目目录,这可用于生成者和消费者。 | 字符串 | |
| maxResultsPerPage (common) | 指定要返回的最大 Blob 数量,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 的值,服务器将返回到 5,000 个项目。 | 整数 | |
| maxRetryRequests (common) | 指定从响应正文读取数据时将发出的额外 HTTP 获取请求的最大数量。 | 0 | int |
| prefix (common) | 过滤结果,以仅返回名称以指定前缀开头的 Blob。可能为空,返回所有 Blob。 | 字符串 | |
| regex (common) | 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。如果同时设置了 prefix 和 regex,则可以是 null,则 regex 会采用 priority 和 prefix。 | 字符串 | |
| serviceClient (common) | Autowired Client 到存储帐户。此客户端不保存特定存储帐户的任何状态,而是一种将适当请求发送到服务中的资源的便捷方式。它还可用于为 blob 和容器构造 URL。此客户端包含服务帐户上的操作。容器上的操作可以通过 BlobServiceClient#getBlobContainerClient (String)在 BlobClient 上提供,对 blob 的操作可在 BlobClient 到 BlobContainerClient (String)上提供。 | BlobServiceClient | |
| 超时 (通用) | 将引发 RuntimeException 之外的可选超时值。 | Duration | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| blobSequenceNumber (producer) | 用户控制的值,可用于跟踪请求。序列号的值必须在 0 到 263 - 1 之间。默认值为 0。 | 0 | Long |
| blockListType (producer) | 指定要返回的块类型。 Enum 值:
| 已提交 | BlockListType |
| changeFeedContext (producer) | 使用 getChangeFeed producer 操作时,这将提供额外的上下文,这些上下文在服务调用期间通过 Http 管道传递。 | Context | |
| changeFeedEndTime (producer) | 使用 getChangeFeed producer 操作时,这将过滤结果,以大约在结束时间前返回事件。注意:也可以返回属于下一小时的几个事件。可以缺少属于此小时的几个事件;若要确保所有事件都返回,每小时舍入结束时间。 | OffsetDateTime | |
| changeFeedStartTime (producer) | 使用 getChangeFeed producer 操作时,这将过滤结果,以大约在开始时间后返回事件。注意:也可以返回属于上小时的几个事件。可以缺少属于此小时的几个事件;若要确保所有事件都返回,每小时舍入开始时间。 | OffsetDateTime | |
| closeStreamAfterWrite (producer) | 在写入或保持打开流后关闭流,默认为 true。 | true | 布尔值 |
| commitBlockListLater (producer) | 当设置为 true 时,暂存的块不会直接提交。 | true | 布尔值 |
| createAppendBlob (producer) | 当设置为 true 时,会在提交附加块时创建附加块。 | true | 布尔值 |
| createPageBlob (producer) | 当设置为 true 时,在上传页面 blob 时会创建页面 blob。 | true | 布尔值 |
| downloadLinkExpiration (producer) | 覆盖 URL 下载链接的默认过期时间(millis)。 | Long | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 操作 (生成) | 可以在生产者中与这个组件一起使用的 blob 操作。 Enum 值:
| listBlobContainers | BlobOperationsDefinition |
| pageBlobSize (producer) | 指定页面 blob 的最大大小,最多 8 TB。页面 blob 大小必须与 512 字节边界一致。 | 512 | Long |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| AccessKey ( 安全) | 用于使用 azure blob 服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
| sourceBlobAccessKey (security) | Source Blob Access Key:用于 copyblob 操作,在 sadly 中,我们需要为源 blob 具有 accessKey,我们希望复制 accessKey 作为标头,因此我们可以设置为密钥。 | 字符串 |
8.4. 端点选项
Azure Storage Blob Service 端点使用 URI 语法进行配置:
azure-storage-blob:accountName/containerName
使用以下路径和查询参数:
8.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| accountName (common) | 用于使用 azure blob 服务进行身份验证的 Azure 帐户名称。 | 字符串 | |
| containerName (common) | blob 容器名称。 | 字符串 |
8.4.2. 查询参数(48 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| blobName (common) | blob 名称,用于消耗容器中的特定 blob。但是,在制作者上,只需要 blob 级别的操作。 | 字符串 | |
| blobOffset (common) | 为上传或下载操作设置 blob 偏移,默认为 0。 | 0 | long |
| blobServiceClient (common) | 客户端到存储帐户。此客户端不保存特定存储帐户的任何状态,而是一种将适当请求发送到服务中的资源的便捷方式。它还可用于为 blob 和容器构造 URL。此客户端包含服务帐户上的操作。容器上的操作通过 getBlobContainerClient (String)在 BlobContainerClient (String)上提供,对 blob 的操作可通过 getBlobContainerClient (String).getBlobClient (String)在 BlobClient 上提供。 | BlobServiceClient | |
| blobType (common) | blob 类型,以便为每个 blob 类型启动适当的设置。 Enum 值:
| blockblob | BlobType |
| closeStreamAfterRead (common) | 在读取或保持打开流后关闭流,默认为 true。 | true | 布尔值 |
| 凭证 (通用) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,这会包含重要的身份验证信息。 | StorageSharedKeyCredential | |
| dataCount (common) | 范围中包含多少个字节。如果指定,则必须大于或等于 0。 | Long | |
| fileDir (common) | 下载的 blob 将保存到的项目目录,这可用于生成者和消费者。 | 字符串 | |
| maxResultsPerPage (common) | 指定要返回的最大 Blob 数量,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 的值,服务器将返回到 5,000 个项目。 | 整数 | |
| maxRetryRequests (common) | 指定从响应正文读取数据时将发出的额外 HTTP 获取请求的最大数量。 | 0 | int |
| prefix (common) | 过滤结果,以仅返回名称以指定前缀开头的 Blob。可能为空,返回所有 Blob。 | 字符串 | |
| regex (common) | 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。如果同时设置了 prefix 和 regex,则可以是 null,则 regex 会采用 priority 和 prefix。 | 字符串 | |
| serviceClient (common) | Autowired Client 到存储帐户。此客户端不保存特定存储帐户的任何状态,而是一种将适当请求发送到服务中的资源的便捷方式。它还可用于为 blob 和容器构造 URL。此客户端包含服务帐户上的操作。容器上的操作可以通过 BlobServiceClient#getBlobContainerClient (String)在 BlobClient 上提供,对 blob 的操作可在 BlobClient 到 BlobContainerClient (String)上提供。 | BlobServiceClient | |
| 超时 (通用) | 将引发 RuntimeException 之外的可选超时值。 | Duration | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| blobSequenceNumber (producer) | 用户控制的值,可用于跟踪请求。序列号的值必须在 0 到 263 - 1 之间。默认值为 0。 | 0 | Long |
| blockListType (producer) | 指定要返回的块类型。 Enum 值:
| 已提交 | BlockListType |
| changeFeedContext (producer) | 使用 getChangeFeed producer 操作时,这将提供额外的上下文,这些上下文在服务调用期间通过 Http 管道传递。 | Context | |
| changeFeedEndTime (producer) | 使用 getChangeFeed producer 操作时,这将过滤结果,以大约在结束时间前返回事件。注意:也可以返回属于下一小时的几个事件。可以缺少属于此小时的几个事件;若要确保所有事件都返回,每小时舍入结束时间。 | OffsetDateTime | |
| changeFeedStartTime (producer) | 使用 getChangeFeed producer 操作时,这将过滤结果,以大约在开始时间后返回事件。注意:也可以返回属于上小时的几个事件。可以缺少属于此小时的几个事件;若要确保所有事件都返回,每小时舍入开始时间。 | OffsetDateTime | |
| closeStreamAfterWrite (producer) | 在写入或保持打开流后关闭流,默认为 true。 | true | 布尔值 |
| commitBlockListLater (producer) | 当设置为 true 时,暂存的块不会直接提交。 | true | 布尔值 |
| createAppendBlob (producer) | 当设置为 true 时,会在提交附加块时创建附加块。 | true | 布尔值 |
| createPageBlob (producer) | 当设置为 true 时,在上传页面 blob 时会创建页面 blob。 | true | 布尔值 |
| downloadLinkExpiration (producer) | 覆盖 URL 下载链接的默认过期时间(millis)。 | Long | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 操作 (生成) | 可以在生产者中与这个组件一起使用的 blob 操作。 Enum 值:
| listBlobContainers | BlobOperationsDefinition |
| pageBlobSize (producer) | 指定页面 blob 的最大大小,最多 8 TB。页面 blob 大小必须与 512 字节边界一致。 | 512 | Long |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| AccessKey ( 安全) | 用于使用 azure blob 服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
| sourceBlobAccessKey (security) | Source Blob Access Key:用于 copyblob 操作,在 sadly 中,我们需要为源 blob 具有 accessKey,我们希望复制 accessKey 作为标头,因此我们可以设置为密钥。 | 字符串 |
所需信息选项
要使用此组件,有 3 个选项来提供所需的 Azure 身份验证信息:
-
为 Azure 帐户提供
accountName和accessKey,这是启动最简单的方法。accessKey 可以通过 Azure 门户生成。 -
提供 StorageSharedKeyCredential 实例,它可以提供给
credentials选项。 -
提供 BlobServiceClient 实例,它可以提供给
blobServiceClient。注意:您不需要创建特定的客户端,如 BlockBlobClient,BacksServiceClient 代表高级别,可用于检索较低级别的客户端。
8.5. 使用方法
例如,要从 camelazure 存储帐户中的 container1 上的 block blob hello.txt 下载 blob 内容,请使用以下代码片段:
from("azure-storage-blob://camelazure/container1?blobName=hello.txt&accessKey=yourAccessKey").
to("file://blobdirectory");8.5.1. 由组件制作者评估的消息标头
| 标头 | 变量名称 | 类型 | 操作 | 描述 |
|---|---|---|---|---|
|
|
|
| All | 将引发 {@link RuntimeException} 的可选超时值。 |
|
|
|
| 与容器和 blob 相关的操作 | 与容器或 blob 关联的元数据。 |
|
|
|
|
|
指定此容器中的数据如何可供公共使用。传递 |
|
|
|
| 与容器和 blob 相关的操作 | 这将包含值,这会将各种请求的成功操作限制为存在的条件。这些条件完全是可选的。 |
|
|
|
|
| 列出特定 Blob 的详细信息 |
|
|
|
|
| 过滤结果,以仅返回名称以指定前缀开头的 Blob。可能为空,返回所有 Blob。 |
|
|
|
|
| 指定要返回的最大 Blob 数量,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 的值,服务器将返回到 5,000 个项目。 |
|
|
|
|
| 定义可用于配置 {@link BlobContainerClient} 对象上对 listBlobsFlatSegment 的调用行为的选项。 |
|
|
|
|
| 一组操作的其他参数。 |
|
|
|
|
| 定义 AccessTier 的值。 |
|
|
|
| 大多数与上传 blob 相关的操作 | 块内容的 MD5 哈希。此哈希用于在传输过程中验证块的完整性。当指定此标头时,存储服务会将已到达此标头值的内容的哈希值进行比较。请注意,这个 MD5 哈希没有使用 blob 存储。如果两个哈希不匹配,则操作将失败。 |
|
|
|
| 与页面 blob 相关的操作 | {@link PageRange} 对象。由于页面必须与 512 字节边界一致,启动偏移必须是 modulus 为 512,最终偏移必须是 modulus 为 512 - 1。有效字节范围的示例为 0-511、512-1023 等。 |
|
|
|
|
|
当设置为 |
|
|
|
|
|
当设置为 |
|
|
|
|
|
当设置为 |
|
|
|
|
| 指定要返回的块类型。 |
|
|
|
|
| 指定页面 blob 的最大大小,最多 8 TB。页面 blob 大小必须与 512 字节边界一致。 |
|
|
|
|
| 用户控制的值,可用于跟踪请求。序列号的值必须在 0 到 2^63 - 1 之间。默认值为 0。 |
|
|
|
|
| 指定删除此 blob 上的快照的行为。\{@code Include} 将删除基础 blob 和所有快照。\{@code Only} 将只删除快照。如果删除了快照,则必须传递 null。 |
|
|
|
|
| {@link ListBlobContainersOptions},用于指定服务应返回哪些数据。 |
|
|
|
|
| {@link ParallelTransferOptions} 用于下载至文件。并行传输参数的数量将被忽略。 |
|
|
|
|
| 下载 Blob 将保存到的项目目录。 |
|
|
|
|
| 覆盖 URL 下载链接的默认过期时间(millis)。 |
|
|
|
| 与 blob 相关的操作 | 覆盖/设置交换标头中的 Blob 名称。 |
|
|
|
| 与容器和 blob 相关的操作 | 覆盖/设置交换标头中的容器名称。 |
|
|
|
| All | 指定要执行的制作者操作,请参阅此页面中的与制作者操作相关的 doc。 |
|
|
|
|
| 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。可能为空以返回所有.如果同时设置了 prefix 和 regex,则 regex 将采用优先级和前缀。 |
|
|
|
|
| 它过滤结果,以大约在开始时间后返回事件。注意:也可以返回属于上小时的几个事件。可以缺少属于此小时的几个事件;若要确保所有事件都返回,每小时舍入开始时间。 |
|
|
|
|
| 它过滤结果,以大约在结束时间前返回事件。注意:也可以返回属于下一小时的几个事件。可以缺少属于此小时的几个事件;若要确保所有事件都返回,每小时舍入结束时间。 |
|
|
|
|
| 这提供了在服务调用过程中通过 Http 管道传递的额外上下文。 |
|
|
|
|
| 在 copy blob 操作中用作源帐户名称的源 blob 帐户名称 |
|
|
|
|
| 在 copy blob 操作中用作源容器名称的源 blob 容器名称 |
8.5.2. 由组件制作者或消费者设置的消息标头
| 标头 | 变量名称 | 类型 | 描述 |
|---|---|---|---|
|
|
|
| blob 的访问层。 |
|
|
|
| blob 最后更改的访问层时的日期。 |
|
|
|
| blob 的归档状态。 |
|
|
|
| blob 的创建时间。 |
|
|
|
| 页面 blob 的当前序列号。 |
|
|
|
| blob 的大小。 |
|
|
|
| blob 的类型。 |
|
|
|
| 为 blob 指定的缓存控制。 |
|
|
|
| 提交到附加 blob 的块数 |
|
|
|
| 为 blob 指定的内容分布。 |
|
|
|
| 为 blob 指定的内容编码。 |
|
|
|
| 为 blob 指定的内容语言。 |
|
|
|
| 为 blob 指定的内容 MD5。 |
|
|
|
| 为 blob 指定的内容类型。 |
|
|
|
| blob 已完成上一次副本操作时。 |
|
|
|
| blob 最后一次增量复制快照的快照标识符。 |
|
|
|
| blob 上执行的最后一个复制操作的标识符。 |
|
|
|
| 对 blob 执行的最后一个复制操作的进度。 |
|
|
|
| 对 blob 执行的最后一个复制操作的源。 |
|
|
|
| 对 blob 执行的最后一个复制操作的状态。 |
|
|
|
| blob 上最后一次复制操作的描述。 |
|
|
|
| blob 的 E Tag |
|
|
|
| 表示 blob 的访问层是否从 blob 的属性中推断出来。 |
|
|
|
| 指明 blob 是否递增复制的标记。 |
|
|
|
| 指明 blob 内容是否在服务器中加密的标志。 |
|
|
|
| 最后一次修改 blob 时的日期时间。 |
|
|
|
| blob 中的租期类型。 |
|
|
|
| blob 上租期的状态。 |
|
|
|
| blob 上租期的状态。 |
|
|
|
| 与 blob 关联的其他元数据。 |
|
|
|
| 块提交到块 blob 的偏移。 |
|
|
|
|
从操作 |
|
|
|
|
由 |
|
|
|
| 返回可由用户使用的非解析的 httpHeaders。 |
8.5.3. 高级 Azure Storage Blob 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 BlobServiceClient 实例配置拥有更多控制,您可以创建自己的实例:
StorageSharedKeyCredential credential = new StorageSharedKeyCredential("yourAccountName", "yourAccessKey");
String uri = String.format("https://%s.blob.core.windows.net", "yourAccountName");
BlobServiceClient client = new BlobServiceClientBuilder()
.endpoint(uri)
.credential(credential)
.buildClient();
// This is camel context
context.getRegistry().bind("client", client);
然后,在 Camel azure-storage-blob 组件配置中引用这个实例:
from("azure-storage-blob://cameldev/container1?blobName=myblob&serviceClient=#client")
.to("mock:result");8.5.4. 在 registry 中自动检测 BlobServiceClient 客户端
组件可以在 registry 中检测 BlobServiceClient bean 的存在。如果是该类型的唯一实例,它将用作客户端,并且不必将它定义为 uri 参数,如上例所示。这可能对端点的更智能配置非常有用。
8.5.5. Azure Storage Blob Producer 操作
Camel Azure Storage Blob 组件在制作者端提供广泛的操作:
服务级别的操作
对于这些操作,需要 accountName。
| 操作 | 描述 |
|---|---|
|
| 获取 blob 的内容。您可以将此操作的输出限制为 blob 范围。 |
|
| 返回存储帐户中所有更改的事务日志,以及您的存储帐户中的 blob 元数据。更改源提供有顺序、有保证、持久、不可变的、这些更改的只读日志。 |
容器级别的操作
对于这些操作,需要 accountName 和 containerName。
| 操作 | 描述 |
|---|---|
|
| 在存储帐户内创建新容器。如果存在具有相同名称的容器,则制作者将忽略它。 |
|
| 删除存储帐户中指定的容器。如果容器不存在,操作会失败。 |
|
| 返回此容器中的 Blob 列表,以及文件夹结构扁平化。 |
blob 级别的操作
对于这些操作,需要 accountName、containerName 和 blobName。
| 操作 | blob 类型 | 描述 |
|---|---|---|
|
| Common | 获取 blob 的内容。您可以将此操作的输出限制为 blob 范围。 |
|
| Common | 删除 blob。 |
|
| Common | 将整个 blob 下载到路径指定的文件中。如果文件已存在一个 {@link FileAlreadyExistsException},则文件必须不存在。 |
|
| Common | 使用共享访问签名(SAS)为指定的 blob 生成下载链接。默认情况下,此限制仅限制为 1 小时允许访问。但是,您可以通过标头覆盖默认的过期持续时间。 |
|
| BlockBlob | 创建新的块 blob,或更新现有块 blob 的内容。更新现有的块 blob 覆盖 blob 上的任何现有元数据。PutBlob 不支持部分更新;新内容会覆盖现有 blob 的内容。 |
|
|
|
将指定的块上传到块 blob 的"staging 区域",以便稍后由调用提交到 commitBlobBlockList。但是,如果标头 |
|
|
|
通过指定要组成 blob 的块 ID 列表来写入 blob。要作为 blob 的一部分编写,块必须在之前的 |
|
|
| 使用指定的块列表过滤器,返回已作为块 blob 一部分的块列表。 |
|
|
| 创建一个 0-length 附加 blob。调用 commitAppendBlo'b 操作,将数据附加到附加 blob 中。 |
|
|
|
将新数据块提交到现有 append blob 的末尾。如果标头 |
|
|
|
创建指定长度的页面 blob。调用 |
|
|
|
将一个或多个页面写入页面 blob。写入大小必须是 512 的倍数。如果标头 |
|
|
| 将页面 blob 调整为指定大小(必须是 512 的倍数)。 |
|
|
| 从 blob 页面释放指定的页面。范围的大小必须是 512 的倍数。 |
|
|
| 返回页面 blob 或页面 blob 快照的有效页面范围列表。 |
|
|
| 将 blob 从一个容器复制到另一个容器,即使来自不同帐户。 |
请参阅此页面中的示例部分,了解如何在您的 camel 应用程序中使用这些操作。
8.5.6. 消费者示例
要使用文件组件将 blob 消耗到一个文件中,如下所示:
from("azure-storage-blob://camelazure/container1?blobName=hello.txt&accountName=yourAccountName&accessKey=yourAccessKey").
to("file://blobdirectory");
但是,您还可以直接写入文件,而无需使用文件组件,您将需要指定 fileDir 文件夹路径,以便在机器中保存 blob。
from("azure-storage-blob://camelazure/container1?blobName=hello.txt&accountName=yourAccountName&accessKey=yourAccessKey&fileDir=/var/to/awesome/dir").
to("mock:results");此外,组件支持批处理使用者,因此您可以使用只指定容器名称的多个 Blob,因此消费者将根据容器中的 Blob 数量返回多个交换。
示例
from("azure-storage-blob://camelazure/container1?accountName=yourAccountName&accessKey=yourAccessKey&fileDir=/var/to/awesome/dir").
to("mock:results");
8.5.7. 制作者操作示例
-
listBlobContainers
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(BlobConstants.LIST_BLOB_CONTAINERS_OPTIONS, new ListBlobContainersOptions().setMaxResultsPerPage(10));
})
.to("azure-storage-blob://camelazure?operation=listBlobContainers&client&serviceClient=#client")
.to("mock:result");-
createBlobContainer
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(BlobConstants.BLOB_CONTAINER_NAME, "newContainerName");
})
.to("azure-storage-blob://camelazure/container1?operation=createBlobContainer&serviceClient=#client")
.to("mock:result");-
deleteBlobContainer:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(BlobConstants.BLOB_CONTAINER_NAME, "overridenName");
})
.to("azure-storage-blob://camelazure/container1?operation=deleteBlobContainer&serviceClient=#client")
.to("mock:result");-
listBlobs:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(BlobConstants.BLOB_CONTAINER_NAME, "overridenName");
})
.to("azure-storage-blob://camelazure/container1?operation=listBlobs&serviceClient=#client")
.to("mock:result");-
getBlob:
我们可以在交换正文中设置 outputStream,并将数据写入其中。例如:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(BlobConstants.BLOB_CONTAINER_NAME, "overridenName");
// set our body
exchange.getIn().setBody(outputStream);
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=getBlob&serviceClient=#client")
.to("mock:result");
如果没有设置正文,则此操作会给我们提供一个 InputStream 实例,该实例可以进行进一步的下游:
from("direct:start")
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=getBlob&serviceClient=#client")
.process(exchange -> {
InputStream inputStream = exchange.getMessage().getBody(InputStream.class);
// We use Apache common IO for simplicity, but you are free to do whatever dealing
// with inputStream
System.out.println(IOUtils.toString(inputStream, StandardCharsets.UTF_8.name()));
})
.to("mock:result");-
deleteBlob:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(BlobConstants.BLOB_NAME, "overridenName");
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=deleteBlob&serviceClient=#client")
.to("mock:result");-
downloadBlobToFile:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(BlobConstants.BLOB_NAME, "overridenName");
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=downloadBlobToFile&fileDir=/var/mydir&serviceClient=#client")
.to("mock:result");-
downloadLink
from("direct:start")
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=downloadLink&serviceClient=#client")
.process(exchange -> {
String link = exchange.getMessage().getHeader(BlobConstants.DOWNLOAD_LINK, String.class);
System.out.println("My link " + link);
})
.to("mock:result");-
uploadBlockBlob
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(BlobConstants.BLOB_NAME, "overridenName");
exchange.getIn().setBody("Block Blob");
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=uploadBlockBlob&serviceClient=#client")
.to("mock:result");-
stageBlockBlobList
from("direct:start")
.process(exchange -> {
final List<BlobBlock> blocks = new LinkedList<>();
blocks.add(BlobBlock.createBlobBlock(new ByteArrayInputStream("Hello".getBytes())));
blocks.add(BlobBlock.createBlobBlock(new ByteArrayInputStream("From".getBytes())));
blocks.add(BlobBlock.createBlobBlock(new ByteArrayInputStream("Camel".getBytes())));
exchange.getIn().setBody(blocks);
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=stageBlockBlobList&serviceClient=#client")
.to("mock:result");-
commitBlockBlobList
from("direct:start")
.process(exchange -> {
// We assume here you have the knowledge of these blocks you want to commit
final List<Block> blocksIds = new LinkedList<>();
blocksIds.add(new Block().setName("id-1"));
blocksIds.add(new Block().setName("id-2"));
blocksIds.add(new Block().setName("id-3"));
exchange.getIn().setBody(blocksIds);
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=commitBlockBlobList&serviceClient=#client")
.to("mock:result");-
getBlobBlockList
from("direct:start")
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=getBlobBlockList&serviceClient=#client")
.log("${body}")
.to("mock:result");-
createAppendBlob
from("direct:start")
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=createAppendBlob&serviceClient=#client")
.to("mock:result");-
commitAppendBlob
from("direct:start")
.process(exchange -> {
final String data = "Hello world from my awesome tests!";
final InputStream dataStream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
exchange.getIn().setBody(dataStream);
// of course you can set whatever headers you like, refer to the headers section to learn more
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=commitAppendBlob&serviceClient=#client")
.to("mock:result");-
createPageBlob
from("direct:start")
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=createPageBlob&serviceClient=#client")
.to("mock:result");-
uploadPageBlob
from("direct:start")
.process(exchange -> {
byte[] dataBytes = new byte[512]; // we set range for the page from 0-511
new Random().nextBytes(dataBytes);
final InputStream dataStream = new ByteArrayInputStream(dataBytes);
final PageRange pageRange = new PageRange().setStart(0).setEnd(511);
exchange.getIn().setHeader(BlobConstants.PAGE_BLOB_RANGE, pageRange);
exchange.getIn().setBody(dataStream);
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=uploadPageBlob&serviceClient=#client")
.to("mock:result");-
resizePageBlob
from("direct:start")
.process(exchange -> {
final PageRange pageRange = new PageRange().setStart(0).setEnd(511);
exchange.getIn().setHeader(BlobConstants.PAGE_BLOB_RANGE, pageRange);
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=resizePageBlob&serviceClient=#client")
.to("mock:result");-
clearPageBlob
from("direct:start")
.process(exchange -> {
final PageRange pageRange = new PageRange().setStart(0).setEnd(511);
exchange.getIn().setHeader(BlobConstants.PAGE_BLOB_RANGE, pageRange);
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=clearPageBlob&serviceClient=#client")
.to("mock:result");-
getPageBlobRanges
from("direct:start")
.process(exchange -> {
final PageRange pageRange = new PageRange().setStart(0).setEnd(511);
exchange.getIn().setHeader(BlobConstants.PAGE_BLOB_RANGE, pageRange);
})
.to("azure-storage-blob://camelazure/container1?blobName=blob&operation=getPageBlobRanges&serviceClient=#client")
.log("${body}")
.to("mock:result");-
copyBlob
from("direct:copyBlob")
.process(exchange -> {
exchange.getIn().setHeader(BlobConstants.BLOB_NAME, "file.txt");
exchange.getMessage().setHeader(BlobConstants.SOURCE_BLOB_CONTAINER_NAME, "containerblob1");
exchange.getMessage().setHeader(BlobConstants.SOURCE_BLOB_ACCOUNT_NAME, "account");
})
.to("azure-storage-blob://account/containerblob2?operation=copyBlob&sourceBlobAccessKey=RAW(accessKey)")
.to("mock:result");这样,帐户 'account' 的容器 containerblob1 中的 file.txt 将复制到同一帐户的容器 containerblob2 中。
8.5.8. 开发备注(Important)
所有集成测试都使用 Testcontainers 并默认运行。需要获取 Azure accessKey 和 accountName,才能使用 Azure 服务运行所有集成测试。除了模拟的单元测试外,还需要针对您进行的每个更改运行集成测试,甚至客户端升级,因为 Azure 客户端即使在次版本升级时也会出现问题。要运行集成测试,在这个组件目录中运行以下 maven 命令:
mvn verify -PfullTests -DaccountName=myacc -DaccessKey=mykey
其中,by accountName 是 Azure 帐户名称,accessKey 是从 Azure 门户生成的访问密钥。
8.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 azure-storage-blob 时,请确保使用以下 Maven 依赖项支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-azure-storage-blob-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 32 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.azure-storage-blob.access-key | 用于使用 azure blob 服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
| camel.component.azure-storage-blob.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.azure-storage-blob.blob-name | blob 名称,用于消耗容器中的特定 blob。但是,在制作者上,只需要 blob 级别的操作。 | 字符串 | |
| camel.component.azure-storage-blob.blob-offset | 为上传或下载操作设置 blob 偏移,默认为 0。 | 0 | Long |
| camel.component.azure-storage-blob.blob-sequence-number | 用户控制的值,可用于跟踪请求。序列号的值必须在 0 到 263 - 1 之间。默认值为 0。 | 0 | Long |
| camel.component.azure-storage-blob.blob-type | blob 类型,以便为每个 blob 类型启动适当的设置。 | BlobType | |
| camel.component.azure-storage-blob.block-list-type | 指定要返回的块类型。 | BlockListType | |
| camel.component.azure-storage-blob.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.azure-storage-blob.change-feed-context | 使用 getChangeFeed producer 操作时,这将提供额外的上下文,这些上下文在服务调用期间通过 Http 管道传递。选项是一个 com.azure.core.util.Context 类型。 | Context | |
| camel.component.azure-storage-blob.change-feed-end-time | 使用 getChangeFeed producer 操作时,这将过滤结果,以大约在结束时间前返回事件。注意:也可以返回属于下一小时的几个事件。可以缺少属于此小时的几个事件;若要确保所有事件都返回,每小时舍入结束时间。选项是一个 java.time.OffsetDateTime 类型。 | OffsetDateTime | |
| camel.component.azure-storage-blob.change-feed-start-time | 使用 getChangeFeed producer 操作时,这将过滤结果,以大约在开始时间后返回事件。注意:也可以返回属于上小时的几个事件。可以缺少属于此小时的几个事件;若要确保所有事件都返回,每小时舍入开始时间。选项是一个 java.time.OffsetDateTime 类型。 | OffsetDateTime | |
| camel.component.azure-storage-blob.close-stream-after-read | 在读取或保持打开流后关闭流,默认为 true。 | true | 布尔值 |
| camel.component.azure-storage-blob.close-stream-after-write | 在写入或保持打开流后关闭流,默认为 true。 | true | 布尔值 |
| camel.component.azure-storage-blob.commit-block-list-later | 当设置为 true 时,暂存的块不会直接提交。 | true | 布尔值 |
| camel.component.azure-storage-blob.configuration | 组件配置。选项是一个 org.apache.camel.component.azure.storage.blob.BlobConfiguration 类型。 | BlobConfiguration | |
| camel.component.azure-storage-blob.create-append-blob | 当设置为 true 时,会在提交附加块时创建附加块。 | true | 布尔值 |
| camel.component.azure-storage-blob.create-page-blob | 当设置为 true 时,在上传页面 blob 时会创建页面 blob。 | true | 布尔值 |
| camel.component.azure-storage-blob.credentials | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,这会包含重要的身份验证信息。选项是一个 com.azure.storage.common.StorageSharedKeyCredential 类型。 | StorageSharedKeyCredential | |
| camel.component.azure-storage-blob.data-count | 范围中包含多少个字节。如果指定,则必须大于或等于 0。 | Long | |
| camel.component.azure-storage-blob.download-link-expiration | 覆盖 URL 下载链接的默认过期时间(millis)。 | Long | |
| camel.component.azure-storage-blob.enabled | 是否启用 azure-storage-blob 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.azure-storage-blob.file-dir | 下载的 blob 将保存到的项目目录,这可用于生成者和消费者。 | 字符串 | |
| camel.component.azure-storage-blob.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.azure-storage-blob.max-results-per-page | 指定要返回的最大 Blob 数量,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 的值,服务器将返回到 5,000 个项目。 | 整数 | |
| camel.component.azure-storage-blob.max-retry-requests | 指定从响应正文读取数据时将发出的额外 HTTP 获取请求的最大数量。 | 0 | 整数 |
| camel.component.azure-storage-blob.operation | 可以在生产者中与这个组件一起使用的 blob 操作。 | BlobOperationsDefinition | |
| camel.component.azure-storage-blob.page-blob-size | 指定页面 blob 的最大大小,最多 8 TB。页面 blob 大小必须与 512 字节边界一致。 | 512 | Long |
| camel.component.azure-storage-blob.prefix | 过滤结果,以仅返回名称以指定前缀开头的 Blob。可能为空,返回所有 Blob。 | 字符串 | |
| camel.component.azure-storage-blob.regex | 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。如果同时设置了 prefix 和 regex,则可以是 null,则 regex 会采用 priority 和 prefix。 | 字符串 | |
| camel.component.azure-storage-blob.service-client | 客户端到存储帐户。此客户端不保存特定存储帐户的任何状态,而是一种将适当请求发送到服务中的资源的便捷方式。它还可用于为 blob 和容器构造 URL。此客户端包含服务帐户上的操作。容器上的操作可以通过 BlobServiceClient#getBlobContainerClient (String)在 BlobClient 上提供,对 blob 的操作可在 BlobClient 到 BlobContainerClient (String)上提供。选项是一个 com.azure.storage.blob.BlobServiceClient 类型。 | BlobServiceClient | |
| camel.component.azure-storage-blob.source-blob-access-key | Source Blob Access Key:用于 copyblob 操作,在 sadly 中,我们需要为源 blob 具有 accessKey,我们希望复制 accessKey 作为标头,因此我们可以设置为密钥。 | 字符串 | |
| camel.component.azure-storage-blob.timeout | 将引发 RuntimeException 之外的可选超时值。选项是一个 java.time.Duration 类型。 | Duration |
第 9 章 Azure Storage Queue Service
支持制作者和使用者
Azure Storage Queue 组件支持使用 Azure API v12 将信息存储和检索到 Azure Storage Queue 服务。但是,如果版本高于 v12,我们将看到此组件是否可以根据变化量而采用这些更改。
先决条件
您必须具有有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-azure-storage-queue</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>9.1. URI 格式
azure-storage-queue://accountName[/queueName][?options]
如果是 consumer,则需要 accountName 和 queueName。如果是制作者,它依赖于所请求的操作,例如,如果操作位于服务级别,e.b: listQueues,只需要 accountName,但在队列级别上请求某个操作,如 createQueue、sendMessage. 等,同时需要 accountName 和 queueName。
如果队列尚不存在,则会创建该队列。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
9.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
9.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
9.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
9.3. 组件选项
Azure Storage Queue Service 组件支持 15 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 配置 (common) | 组件配置。 | QueueConfiguration | |
| serviceClient (common) | Autowired Service 客户端到存储帐户,以便与队列服务交互。此客户端不保存特定存储帐户的任何状态,而是一种将适当请求发送到服务中的资源的便捷方式。此客户端包含与 Azure Storage 中队列帐户交互的所有操作。客户端允许的操作创建、列出和删除队列,检索帐户的属性,以及检索帐户的统计数据。 | QueueServiceClient | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| createQueue (producer) | 当设置为 true 时,当向队列发送消息时会自动创建队列。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 操作 (生成) | 对制作者的队列服务操作提示。 Enum 值:
| QueueOperationDefinition | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| maxMessages (queue) | 如果队列中存在的消息少于请求的所有消息,则要获取的最大消息数。如果只检索空白的 1 消息,则允许的范围为 1 到 32 个消息。 | 1 | 整数 |
| messageId (queue) | 要删除或更新的消息的 ID。 | 字符串 | |
| popReceipt (queue) | 必须匹配的唯一标识符,才能删除或更新消息。 | 字符串 | |
| 超时 (队列) | 应用到操作的可选超时。如果在超时结束前没有返回响应,则会抛出 RuntimeException。 | Duration | |
| timeToLive (queue) | 邮件将在队列中显示多久。如果未设置,则值将默认为 7 天,如果传递了 -1,则消息不会过期。生存时间必须是 -1 或任何正数。格式应该采用此形式:PnDTnHnMn.nS.,例如: PT20.345Srhacm-rhacmparses 为 20.345 秒,P2D 如果要使用数据为 2 天,如果您正在使用 EndpointDsl/ComponentDsl,则您可以执行类似 Duration.ofSeconds ()的内容,因为这些 Java API 类型安全。 | Duration | |
| visibilityTimeout (queue) | 消息在队列中不可见的超时时间。超时必须在 1 秒到 7 天之间。格式应该采用此形式:PnDTnHnMn.nS.,例如: PT20.345Srhacm-rhacmparses 为 20.345 秒,P2D 如果要使用数据为 2 天,如果您正在使用 EndpointDsl/ComponentDsl,则您可以执行类似 Duration.ofSeconds ()的内容,因为这些 Java API 类型安全。 | Duration | |
| AccessKey ( 安全) | 用于与 azure 队列服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
| 凭证 (安全) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,这会包含重要的身份验证信息。 | StorageSharedKeyCredential |
9.4. 端点选项
Azure Storage Queue Service 端点使用 URI 语法进行配置:
azure-storage-queue:accountName/queueName
使用以下路径和查询参数:
9.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| accountName (common) | 用于通过 azure 队列服务进行身份验证的 Azure 帐户名称。 | 字符串 | |
| queueName (common) | 队列资源名称。 | 字符串 |
9.4.2. 查询参数(31 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| serviceClient (common) | Autowired Service 客户端到存储帐户,以便与队列服务交互。此客户端不保存特定存储帐户的任何状态,而是一种将适当请求发送到服务中的资源的便捷方式。此客户端包含与 Azure Storage 中队列帐户交互的所有操作。客户端允许的操作创建、列出和删除队列,检索帐户的属性,以及检索帐户的统计数据。 | QueueServiceClient | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| createQueue (producer) | 当设置为 true 时,当向队列发送消息时会自动创建队列。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 操作 (生成) | 对制作者的队列服务操作提示。 Enum 值:
| QueueOperationDefinition | |
| maxMessages (queue) | 如果队列中存在的消息少于请求的所有消息,则要获取的最大消息数。如果只检索空白的 1 消息,则允许的范围为 1 到 32 个消息。 | 1 | 整数 |
| messageId (queue) | 要删除或更新的消息的 ID。 | 字符串 | |
| popReceipt (queue) | 必须匹配的唯一标识符,才能删除或更新消息。 | 字符串 | |
| 超时 (队列) | 应用到操作的可选超时。如果在超时结束前没有返回响应,则会抛出 RuntimeException。 | Duration | |
| timeToLive (queue) | 邮件将在队列中显示多久。如果未设置,则值将默认为 7 天,如果传递了 -1,则消息不会过期。生存时间必须是 -1 或任何正数。格式应该采用此形式:PnDTnHnMn.nS.,例如: PT20.345Srhacm-rhacmparses 为 20.345 秒,P2D 如果要使用数据为 2 天,如果您正在使用 EndpointDsl/ComponentDsl,则您可以执行类似 Duration.ofSeconds ()的内容,因为这些 Java API 类型安全。 | Duration | |
| visibilityTimeout (queue) | 消息在队列中不可见的超时时间。超时必须在 1 秒到 7 天之间。格式应该采用此形式:PnDTnHnMn.nS.,例如: PT20.345Srhacm-rhacmparses 为 20.345 秒,P2D 如果要使用数据为 2 天,如果您正在使用 EndpointDsl/ComponentDsl,则您可以执行类似 Duration.ofSeconds ()的内容,因为这些 Java API 类型安全。 | Duration | |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| AccessKey ( 安全) | 用于与 azure 队列服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
| 凭证 (安全) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,这会包含重要的身份验证信息。 | StorageSharedKeyCredential |
所需信息选项
要使用此组件,有 3 个选项来提供所需的 Azure 身份验证信息:
-
为 Azure 帐户提供
accountName和accessKey,这是启动最简单的方法。accessKey 可以通过 Azure 门户生成。 -
提供 StorageSharedKeyCredential 实例,它可以提供给
credentials选项。 -
提供 QueueServiceClient 实例,它可以提供给
serviceClient。注意:您不需要创建特定的客户端,如 QueueClient,QueueServiceClient 代表高级级别,可用于检索较低级别的客户端。
9.5. 使用方法
例如,若要从 storageAccount 存储帐户中的 queue messageQueue 获取消息内容,并使用以下代码片段:
from("azure-storage-queue://storageAccount/messageQueue?accessKey=yourAccessKey").
to("file://queuedirectory");9.5.1. 由组件制作者评估的消息标头
| 标头 | 变量名称 | 类型 | 操作 | 描述 |
|---|---|---|---|---|
|
|
|
|
| 列出队列的选项 |
|
|
|
| All | 将引发 \{@link RuntimeException} 之外的可选超时值。 |
|
|
|
|
| 与队列关联的元数据 |
|
|
|
|
| 邮件将在队列中显示多久。如果未设置,则值将默认为 7 天,如果传递了 -1,则消息不会过期。生存时间必须是 -1 或任何正数。 |
|
|
|
|
| 消息在队列中不可见的超时时间。如果未设置,则默认值为 0,则消息将立即可见。超时必须在 0 秒到 7 天之间。 |
|
|
|
|
|
当设置为 |
|
|
|
|
| 必须匹配的唯一标识符,才能删除或更新消息。 |
|
|
|
|
| 要删除或更新的消息的 ID。 |
|
|
|
|
| 如果队列中存在的消息少于请求的所有消息,则要获取的最大消息数。如果只检索空白的 1 消息,则允许的范围为 1 到 32 个消息。 |
|
|
|
| All | 指定要执行的制作者操作,请参阅此页面中的与制作者操作相关的 doc。 |
|
|
|
| All | 覆盖队列名称。 |
9.5.2. 由组件制作者或消费者设置的消息标头
| 标头 | 变量名称 | 类型 | 描述 |
|---|---|---|---|
|
|
|
| 发送到队列的消息 ID。 |
|
|
|
| 消息插入到队列中的时间。 |
|
|
|
| 消息将过期并自动删除的时间。 |
|
|
|
| 删除/更新消息需要这个值。如果删除操作失败,则消息被另一个客户端取消排队。 |
|
|
|
| 在 Queue 中,消息再次变为可见的时间。 |
|
|
|
| 消息已排队的次数。 |
|
|
|
| 返回可由用户使用的非解析的 httpHeaders。 |
9.5.3. 高级 Azure Storage Queue 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 QueueServiceClient 实例配置拥有更多控制,您可以创建自己的实例:
StorageSharedKeyCredential credential = new StorageSharedKeyCredential("yourAccountName", "yourAccessKey");
String uri = String.format("https://%s.queue.core.windows.net", "yourAccountName");
QueueServiceClient client = new QueueServiceClientBuilder()
.endpoint(uri)
.credential(credential)
.buildClient();
// This is camel context
context.getRegistry().bind("client", client);
然后,在 Camel azure-storage-queue 组件配置中引用这个实例:
from("azure-storage-queue://cameldev/queue1?serviceClient=#client")
.to("file://outputFolder?fileName=output.txt&fileExist=Append");9.5.4. 在注册表中自动检测 QueueServiceClient 客户端
组件能够检测 QueueServiceClient bean 在注册表中的存在。如果是该类型的唯一实例,它将用作客户端,并且不必将它定义为 uri 参数,如上例所示。这可能对端点的更智能配置非常有用。
9.5.5. Azure Storage Queue Producer 操作
Camel Azure Storage Queue 组件在制作者端提供广泛的操作:
服务级别的操作
对于这些操作,需要 accountName。
| 操作 | 描述 |
|---|---|
|
| 列出存储帐户中从指定标记开始传递过滤器的队列。 |
队列级别的操作
对于这些操作,需要 accountName 和 queueName。
| 操作 | 描述 |
|---|---|
|
| 创建新队列。 |
|
| 永久删除队列。 |
|
| 删除队列中的所有消息。 |
|
|
默认 Producer Operation Sends 消息带有给定时间到实时,以及消息在队列中不可见的超时时间。消息文本从交换消息正文评估。默认情况下,如果队列不存在,它将首先创建一个空队列。如果要禁用此功能,请将 config |
|
| 删除队列中的指定消息。 |
|
| 从队列检索最多消息数量,并在超时时间内从其他操作隐藏它们。但是,由于可靠性的原因,它将不会从队列中取消排队。 |
|
| 从队列前进到最大消息数。 |
|
| 使用新消息更新队列中的特定消息并重置可见性超时。消息文本从交换消息正文评估。 |
请参阅此页面中的示例部分,了解如何在您的 camel 应用程序中使用这些操作。
9.5.6. 消费者示例
要将队列消耗到一个批处理中最多 5 个消息的文件组件,请执行如下操作:
from("azure-storage-queue://cameldev/queue1?serviceClient=#client&maxMessages=5")
.to("file://outputFolder?fileName=output.txt&fileExist=Append");9.5.7. 制作者操作示例
-
listQueues:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g, to only returns list of queues with 'awesome' prefix:
exchange.getIn().setHeader(QueueConstants.QUEUES_SEGMENT_OPTIONS, new QueuesSegmentOptions().setPrefix("awesome"));
})
.to("azure-storage-queue://cameldev?serviceClient=#client&operation=listQueues")
.log("${body}")
.to("mock:result");-
createQueue:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(QueueConstants.QUEUE_NAME, "overrideName");
})
.to("azure-storage-queue://cameldev/test?serviceClient=#client&operation=createQueue");-
deleteQueue:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(QueueConstants.QUEUE_NAME, "overrideName");
})
.to("azure-storage-queue://cameldev/test?serviceClient=#client&operation=deleteQueue");-
clearQueue:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setHeader(QueueConstants.QUEUE_NAME, "overrideName");
})
.to("azure-storage-queue://cameldev/test?serviceClient=#client&operation=clearQueue");-
sendMessage:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setBody("message to send");
// we set a visibility of 1min
exchange.getIn().setHeader(QueueConstants.VISIBILITY_TIMEOUT, Duration.ofMinutes(1));
})
.to("azure-storage-queue://cameldev/test?serviceClient=#client");-
deleteMessage:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
// Mandatory header:
exchange.getIn().setHeader(QueueConstants.MESSAGE_ID, "1");
// Mandatory header:
exchange.getIn().setHeader(QueueConstants.POP_RECEIPT, "PAAAAHEEERXXX-1");
})
.to("azure-storage-queue://cameldev/test?serviceClient=#client&operation=deleteMessage");-
receiveMessages:
from("direct:start")
.to("azure-storage-queue://cameldev/test?serviceClient=#client&operation=receiveMessages")
.process(exchange -> {
final List<QueueMessageItem> messageItems = exchange.getMessage().getBody(List.class);
messageItems.forEach(messageItem -> System.out.println(messageItem.getMessageText()));
})
.to("mock:result");-
PaesMessages:
from("direct:start")
.to("azure-storage-queue://cameldev/test?serviceClient=#client&operation=peekMessages")
.process(exchange -> {
final List<PeekedMessageItem> messageItems = exchange.getMessage().getBody(List.class);
messageItems.forEach(messageItem -> System.out.println(messageItem.getMessageText()));
})
.to("mock:result");-
updateMessage:
from("direct:start")
.process(exchange -> {
// set the header you want the producer to evaluate, refer to the previous
// section to learn about the headers that can be set
// e.g:
exchange.getIn().setBody("new message text");
// Mandatory header:
exchange.getIn().setHeader(QueueConstants.MESSAGE_ID, "1");
// Mandatory header:
exchange.getIn().setHeader(QueueConstants.POP_RECEIPT, "PAAAAHEEERXXX-1");
// Mandatory header:
exchange.getIn().setHeader(QueueConstants.VISIBILITY_TIMEOUT, Duration.ofMinutes(1));
})
.to("azure-storage-queue://cameldev/test?serviceClient=#client&operation=updateMessage");9.5.8. 开发备注(Important)
在此组件上开发时,您需要获取 Azure accessKey 来运行集成测试。除了模拟的单元测试外,还需要针对您进行的每个更改运行集成测试,甚至客户端升级,因为 Azure 客户端即使在次版本升级时也会出现问题。要运行集成测试,在这个组件目录中运行以下 maven 命令:
mvn verify -PfullTests -DaccountName=myacc -DaccessKey=mykey
其中,by accountName 是 Azure 帐户名称,accessKey 是从 Azure 门户生成的访问密钥。
9.6. Spring Boot Auto-Configuration
当将 azure-storage-queue 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-azure-storage-queue-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 16 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.azure-storage-queue.access-key | 用于与 azure 队列服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
| camel.component.azure-storage-queue.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.azure-storage-queue.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.azure-storage-queue.configuration | 组件配置。选项是一个 org.apache.camel.component.azure.storage.queue.QueueConfiguration 类型。 | QueueConfiguration | |
| camel.component.azure-storage-queue.create-queue | 当设置为 true 时,当向队列发送消息时会自动创建队列。 | false | 布尔值 |
| camel.component.azure-storage-queue.credentials | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,这会包含重要的身份验证信息。选项是一个 com.azure.storage.common.StorageSharedKeyCredential 类型。 | StorageSharedKeyCredential | |
| camel.component.azure-storage-queue.enabled | 是否启用 azure-storage-queue 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.azure-storage-queue.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.azure-storage-queue.max-messages | 如果队列中存在的消息少于请求的所有消息,则要获取的最大消息数。如果只检索空白的 1 消息,则允许的范围为 1 到 32 个消息。 | 1 | 整数 |
| camel.component.azure-storage-queue.message-id | 要删除或更新的消息的 ID。 | 字符串 | |
| camel.component.azure-storage-queue.operation | 对制作者的队列服务操作提示。 | QueueOperationDefinition | |
| camel.component.azure-storage-queue.pop-receipt | 必须匹配的唯一标识符,才能删除或更新消息。 | 字符串 | |
| camel.component.azure-storage-queue.service-client | 服务客户端到存储帐户,以便与队列服务交互。此客户端不保存特定存储帐户的任何状态,而是一种将适当请求发送到服务中的资源的便捷方式。此客户端包含与 Azure Storage 中队列帐户交互的所有操作。客户端允许的操作创建、列出和删除队列,检索帐户的属性,以及检索帐户的统计数据。选项是一个 com.azure.storage.queue.QueueServiceClient 类型。 | QueueServiceClient | |
| camel.component.azure-storage-queue.time-to-live | 邮件将在队列中显示多久。如果未设置,则值将默认为 7 天,如果传递了 -1,则消息不会过期。生存时间必须是 -1 或任何正数。格式应该采用此形式:PnDTnHnMn.nS.,例如: PT20.345Srhacm-rhacmparses 为 20.345 秒,P2D 如果要使用数据为 2 天,如果您正在使用 EndpointDsl/ComponentDsl,则您可以执行类似 Duration.ofSeconds ()的内容,因为这些 Java API 类型安全。选项是一个 java.time.Duration 类型。 | Duration | |
| camel.component.azure-storage-queue.timeout | 应用到操作的可选超时。如果在超时结束前没有返回响应,则会抛出 RuntimeException。选项是一个 java.time.Duration 类型。 | Duration | |
| camel.component.azure-storage-queue.visibility-timeout | 消息在队列中不可见的超时时间。超时必须在 1 秒到 7 天之间。格式应该采用此形式:PnDTnHnMn.nS.,例如: PT20.345Srhacm-rhacmparses 为 20.345 秒,P2D 如果要使用数据为 2 天,如果您正在使用 EndpointDsl/ComponentDsl,则您可以执行类似 Duration.ofSeconds ()的内容,因为这些 Java API 类型安全。选项是一个 java.time.Duration 类型。 | Duration |
第 10 章 bean
仅支持制作者
Bean 组件将 Bean 绑定到 Camel 消息交换。
10.1. URI 格式
bean:beanName[?options]
其中 beanID 可以是在 Registry 中查找 bean 的任何字符串
10.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
10.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
10.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
10.3. 组件选项
Bean 组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 缓存 (生成器) | 弃用了 使用单例选项。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 范围 (生成者) | bean 范围.在使用单例范围(默认)时,bean 会被创建或仅查找一次,并在端点的生命周期内重复使用。当并发线程同时调用 bean 时,bean 应当是 thread-safe。使用请求范围时,会为每个请求(交换)创建或查找一次。如果要在处理请求时将状态存储在 bean 上,并且您希望在处理请求时多次调用同一 bean 实例。Bean 不必为线程安全,因为实例仅从同一请求调用。使用委派范围时,将为每个调用查找或创建 bean。但是,如果查找,则这被委派给 bean 注册表,如 Spring 或 CDI (如果使用),这取决于其配置可以充当单例或原型范围。因此,这取决于委派的 registry。 Enum 值:
| singleton | BeanScope |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
10.4. 端点选项
Bean 端点使用 URI 语法进行配置:
bean:beanName
使用以下路径和查询参数:
10.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| beanName (common) | 必需 设置要调用的 bean 的名称。 | 字符串 |
10.4.2. 查询参数(5 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 缓存 (通用) | 弃用的 Use scope 选项替代。 | 布尔值 | |
| 方法 (通用) | 设置在 bean 上调用的方法的名称。 | 字符串 | |
| scope (common) | bean 范围.在使用单例范围(默认)时,bean 会被创建或仅查找一次,并在端点的生命周期内重复使用。当并发线程同时调用 bean 时,bean 应当是 thread-safe。使用请求范围时,会为每个请求(交换)创建或查找一次。如果要在处理请求时将状态存储在 bean 上,并且您希望在处理请求时多次调用同一 bean 实例。Bean 不必为线程安全,因为实例仅从同一请求调用。在使用原型范围时,会为每个调用查找或创建 bean。但是,如果查找,则这被委派给 bean 注册表,如 Spring 或 CDI (如果使用),这取决于其配置可以充当单例或原型范围。因此,这取决于委派的 registry。 Enum 值:
| singleton | BeanScope |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 参数 (高级) | 用于在 bean 上配置其他属性。 | map |
10.5. 使用
使用消息的对象实例必须在 Registry 中明确注册。例如,如果您使用 Spring,则必须在 Spring 配置 XML 文件中定义 bean。
您还可以使用 bind 方法通过 Camel 的 Registry 手动注册 Bean。
注册端点后,您可以构建可使用它来处理交换的 Camel 路由。
一个 bean: 端点不能定义为对路由的输入;即您无法使用它,您只能以输出形式从一些入站消息 Endpoint 路由到 bean 端点。因此请考虑使用 direct: 或 queue: endpoint 作为输入。
您可以使用 ProxyHelper 上的 createProxy () 方法创建一个代理,该代理将生成交换并将其发送到任何端点:
使用 XML DSL 和相同的路由:
<route> <from uri="direct:hello"/> <to uri="bean:bye"/> </route>
10.6. bean 作为端点
Camel 还支持将 Bean 作为端点调用。发生什么情况是,当交换路由到 myBean Camel 时,将使用 Bean Binding 来调用 bean。bean 的源只是一个普通 POJO。
Camel 将使用 Bean Binding 来调用 sayHello 方法,方法是将 Exchange 的 In body 转换为 String 类型,并将方法的输出存储在 Exchange Out 正文上。
10.7. Java DSL bean 语法
Java DSL 附带组件的语法。您可以使用以下语法,而不是将 bean 明确指定为端点(即 to ("bean:beanName"):
// Send message to the bean endpoint
// and invoke method resolved using Bean Binding.
from("direct:start").bean("beanName");
// Send message to the bean endpoint
// and invoke given method.
from("direct:start").bean("beanName", "methodName");您可以指定 bean,而不是传递对 bean 的引用的名称(因此 Camel 会在 registry 中查找它),您可以指定 bean 本身:
// Send message to the given bean instance.
from("direct:start").bean(new ExampleBean());
// Explicit selection of bean method to be invoked.
from("direct:start").bean(new ExampleBean(), "methodName");
// Camel will create the instance of bean and cache it for you.
from("direct:start").bean(ExampleBean.class);10.8. Bean Binding
如何选择要调用的 bean 方法(如果通过 method 参数明确指定),以及如何从 Message 构建参数值的方式,它们都由 Bean Binding 机制定义,该机制在 Camel 中所有各种 Bean 集成机制中使用。
10.9. Spring Boot Auto-Configuration
当将 bean 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-bean-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>组件支持 13 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.bean.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.bean.enabled | 是否启用 bean 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.bean.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.bean.scope | bean 范围.在使用单例范围(默认)时,bean 会被创建或仅查找一次,并在端点的生命周期内重复使用。当并发线程同时调用 bean 时,bean 应当是 thread-safe。使用请求范围时,会为每个请求(交换)创建或查找一次。如果要在处理请求时将状态存储在 bean 上,并且您希望在处理请求时多次调用同一 bean 实例。Bean 不必为线程安全,因为实例仅从同一请求调用。使用委派范围时,将为每个调用查找或创建 bean。但是,如果查找,则这被委派给 bean 注册表,如 Spring 或 CDI (如果使用),这取决于其配置可以充当单例或原型范围。因此,这取决于委派的 registry。 | BeanScope | |
| camel.component.class.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.class.enabled | 是否启用类组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.class.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.class.scope | bean 范围.在使用单例范围(默认)时,bean 会被创建或仅查找一次,并在端点的生命周期内重复使用。当并发线程同时调用 bean 时,bean 应当是 thread-safe。使用请求范围时,会为每个请求(交换)创建或查找一次。如果要在处理请求时将状态存储在 bean 上,并且您希望在处理请求时多次调用同一 bean 实例。Bean 不必为线程安全,因为实例仅从同一请求调用。使用委派范围时,将为每个调用查找或创建 bean。但是,如果查找,则这被委派给 bean 注册表,如 Spring 或 CDI (如果使用),这取决于其配置可以充当单例或原型范围。因此,这取决于委派的 registry。 | BeanScope | |
| camel.language.bean.enabled | 是否启用 bean 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.bean.scope | bean 范围.在使用单例范围(默认)时,bean 会被创建或仅查找一次,并在端点的生命周期内重复使用。当并发线程同时调用 bean 时,bean 应当是 thread-safe。使用请求范围时,会为每个请求(交换)创建或查找一次。如果要在处理请求时将状态存储在 bean 上,并且您希望在处理请求时多次调用同一 bean 实例。Bean 不必为线程安全,因为实例仅从同一请求调用。在使用原型范围时,会为每个调用查找或创建 bean。但是,如果查找,则这被委派给 bean registry,如 Spring 或 CDI (如果使用),这取决于其配置可以充当单例或原型范围。因此,在使用原型范围时,这取决于 bean registry 的实施。 | singleton | 字符串 |
| camel.language.bean.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.component.bean.cache | 弃用了 使用单例选项。 | true | 布尔值 |
| camel.component.class.cache | 弃用了 使用单例选项。 | true | 布尔值 |
第 11 章 Bean Validator
仅支持制作者
Validator 组件使用 Java Bean Validation API ()执行消息正文的 bean 验证。Camel 使用参考实施,即 Hibernate 验证器。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-bean-validator</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>11.1. URI 格式
bean-validator:label[?options]
其中 label 是一个描述端点的任意文本值。您可以以以下格式将查询选项附加到 URI 中,
?option=value&option=value&…
11.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
11.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
11.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
11.3. 组件选项
Bean Validator 组件支持 8 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| ignoreXmlConfiguration (producer) | 是否忽略 META-INF/validation.xml 文件中的数据。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| constraintValidatorFactory (advanced) | 使用自定义 ConstraintValidatorFactory。 | ConstraintValidatorFactory | |
| messageInterpolator (advanced) | 使用自定义 MessageInterpolator。 | MessageInterpolator | |
| 遍历解决者 (高级) | 使用自定义 TraversableResolver。 | TraversableResolver | |
| validationProviderResolver (高级) | 使用自定义 ValidationProviderResolver。 | ValidationProviderResolver | |
| validatorFactory (高级) | Autowired To 使用自定义验证器Factory。 | ValidatorFactory |
11.4. 端点选项
Bean Validator 端点使用 URI 语法进行配置:
bean-validator:label
使用以下路径和查询参数:
11.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| label (producer) | 必需,其中标签是描述端点的任意文本值。 | 字符串 |
11.4.2. 查询参数(8 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 组 (生成者) | 使用自定义验证组。 | javax.validation.groups.Default | 字符串 |
| ignoreXmlConfiguration (producer) | 是否忽略 META-INF/validation.xml 文件中的数据。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| constraintValidatorFactory (advanced) | 使用自定义 ConstraintValidatorFactory。 | ConstraintValidatorFactory | |
| messageInterpolator (advanced) | 使用自定义 MessageInterpolator。 | MessageInterpolator | |
| 遍历解决者 (高级) | 使用自定义 TraversableResolver。 | TraversableResolver | |
| validationProviderResolver (高级) | 使用自定义 ValidationProviderResolver。 | ValidationProviderResolver | |
| validatorFactory (高级) | 使用自定义验证器Factory。 | ValidatorFactory |
11.5. OSGi 部署
要在 OSGi 环境中使用 Hibernate 验证器,请使用专用 ValidationProviderResolver 实施,就像 org.apache.camel.component.bean.validator.HibernateValidationProviderResolver 一样。以下代码片段演示了这种方法。您还可以使用 HibernateValidationProviderResolver。
Using HibernateValidationProviderResolver
from("direct:test").
to("bean-validator://ValidationProviderResolverTest?validationProviderResolver=#myValidationProviderResolver");
<bean id="myValidationProviderResolver" class="org.apache.camel.component.bean.validator.HibernateValidationProviderResolver"/>
如果没有定义自定义 ValidationProviderResolver,并且验证器组件已部署到 OSGi 环境中,则会自动使用 HibernateValidationProviderResolver。
11.6. 示例
假设我们有一个具有以下注解的 java bean
car.java
public class Car {
@NotNull
private String manufacturer;
@NotNull
@Size(min = 5, max = 14, groups = OptionalChecks.class)
private String licensePlate;
// getter and setter
}
以及自定义验证组的接口定义
OptionalChecks.java
public interface OptionalChecks {
}
使用以下 Camel 路由,只有 @NotNull 对属性 manufacturer 和 licensePlate 约束将被验证(Camel 使用默认组 javax.validation.groups.Default)。
from("direct:start")
.to("bean-validator://x")
.to("mock:end")
如果要从组 OptionalChecks 检查限制,您必须定义如下路由:
from("direct:start")
.to("bean-validator://x?group=OptionalChecks")
.to("mock:end")如果要检查这两个组中的限制,您必须首先定义一个新接口
AllChecks.java
@GroupSequence({Default.class, OptionalChecks.class})
public interface AllChecks {
}
然后您的路由定义应如下所示
from("direct:start")
.to("bean-validator://x?group=AllChecks")
.to("mock:end")另外,如果您必须提供自己的消息交换器、遍历解析器和约束验证器,您必须编写类似如下的路由
<bean id="myMessageInterpolator" class="my.ConstraintValidatorFactory" /> <bean id="myTraversableResolver" class="my.TraversableResolver" /> <bean id="myConstraintValidatorFactory" class="my.ConstraintValidatorFactory" />
from("direct:start")
.to("bean-validator://x?group=AllChecks&messageInterpolator=#myMessageInterpolator
&traversableResolver=#myTraversableResolver&constraintValidatorFactory=#myConstraintValidatorFactory")
.to("mock:end")
也可以将您的限制描述为 XML,而不是 Java 注解。在这种情况下,您必须提供 META-INF/validation.xml 文件,该文件可能如下所示:
validation.xml
<validation-config
xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">
<default-provider>org.hibernate.validator.HibernateValidator</default-provider>
<message-interpolator>org.hibernate.validator.engine.ResourceBundleMessageInterpolator</message-interpolator>
<traversable-resolver>org.hibernate.validator.engine.resolver.DefaultTraversableResolver</traversable-resolver>
<constraint-validator-factory>org.hibernate.validator.engine.ConstraintValidatorFactoryImpl</constraint-validator-factory>
<constraint-mapping>/constraints-car.xml</constraint-mapping>
</validation-config>
和 constraints-car.xml 文件
constraints-car.xml
<constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd"
xmlns="http://jboss.org/xml/ns/javax/validation/mapping">
<default-package>org.apache.camel.component.bean.validator</default-package>
<bean class="CarWithoutAnnotations" ignore-annotations="true">
<field name="manufacturer">
<constraint annotation="javax.validation.constraints.NotNull" />
</field>
<field name="licensePlate">
<constraint annotation="javax.validation.constraints.NotNull" />
<constraint annotation="javax.validation.constraints.Size">
<groups>
<value>org.apache.camel.component.bean.validator.OptionalChecks</value>
</groups>
<element name="min">5</element>
<element name="max">14</element>
</constraint>
</field>
</bean>
</constraint-mappings>
以下是 OrderedChecks 的示例路由定义的 XML 语法。
请注意,正文应包含要验证的类实例。
<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 id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start"/>
<to uri="bean-validator://x?group=org.apache.camel.component.bean.validator.OrderedChecks"/>
</route>
</camelContext>
</beans>11.7. Spring Boot Auto-Configuration
在 Spring Boot 中使用 bean-validator 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-bean-validator-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 9 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.bean-validator.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.bean-validator.constraint-validator-factory | 使用自定义 ConstraintValidatorFactory。选项是 javax.validation.ConstraintValidatorFactory 类型。 | ConstraintValidatorFactory | |
| camel.component.bean-validator.enabled | 是否启用 bean-validator 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.bean-validator.ignore-xml-configuration | 是否忽略 META-INF/validation.xml 文件中的数据。 | false | 布尔值 |
| camel.component.bean-validator.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.bean-validator.message-interpolator | 使用自定义 MessageInterpolator。选项是 javax.validation.MessageInterpolator 类型。 | MessageInterpolator | |
| camel.component.bean-validator.traversable-resolver | 使用自定义 TraversableResolver。选项是 javax.validation.TraversableResolver 类型。 | TraversableResolver | |
| camel.component.bean-validator.validation-provider-resolver | 使用自定义 ValidationProviderResolver。选项是 javax.validation.ValidationProviderResolver 类型。 | ValidationProviderResolver | |
| camel.component.bean-validator.validator-factory | 使用自定义验证器Factory。选项是 javax.validation.ValidatorFactory 类型。 | ValidatorFactory |
第 12 章 浏览
支持制作者和使用者
Browse 组件提供了一个简单的 BrowsableEndpoint,可用于测试、可视化工具或调试。发送到端点的交换可以浏览。
12.1. URI 格式
browse:someName[?options]
其中 someName 可以是任意字符串来唯一标识端点。
12.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
12.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
12.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
12.3. 组件选项
Browse 组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
12.4. 端点选项
Browse 端点使用 URI 语法进行配置:
browse:name
使用以下路径和查询参数:
12.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 名称 (common) | 必需 的名称,可以是任意字符串来唯一标识端点。 | 字符串 |
12.4.2. 查询参数(4 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
12.5. 示例
在以下路由中,我们插入 浏览 组件,以便可以浏览要经过的 Exchanges:
from("activemq:order.in").to("browse:orderReceived").to("bean:processOrder");现在,我们可以从 Java 代码内检查收到的交换:
private CamelContext context;
public void inspectReceivedOrders() {
BrowsableEndpoint browse = context.getEndpoint("browse:orderReceived", BrowsableEndpoint.class);
List<Exchange> exchanges = browse.getExchanges();
// then we can inspect the list of received exchanges from Java
for (Exchange exchange : exchanges) {
String payload = exchange.getIn().getBody();
// do something with payload
}
}12.6. Spring Boot Auto-Configuration
在通过 Spring Boot 使用 浏览时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-browse-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.browse.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.browse.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.browse.enabled | 是否启用 浏览组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.browse.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 13 章 Cassandra CQL
支持制作者和使用者
Apache Cassandra 是一个开源 NoSQL 数据库,用于在商用硬件上处理大量。与 Amazon 的 DynamoDB 一样,Cassandra 具有 peer-to-peer 和 master-less 架构,以避免单点故障和 garanty 高可用性。与 Google 的 BigTable 一样,Cassandra 数据的结构使用列系列(可以通过 Thrift RPC API 或名为 CQL 的 SQL 类似 API 访问)。
此组件旨在使用 CQL3 API (而不是 Thrift API)集成 Cassandra 2.0+。它基于由 DataStax 提供的 Cassandra Java Driver。
13.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
13.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
13.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
13.2. 组件选项
Cassandra CQL 组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
13.3. 端点选项
Cassandra CQL 端点使用 URI 语法进行配置:
cql:beanRef:hosts:port/keyspace
使用以下路径和查询参数:
13.3.1. 路径参数(4 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| beanRef (common) | beanRef 使用 bean:id 定义。 | 字符串 | |
| 主机 (通用) | 主机名(s) Cassandra 服务器。可以使用逗号分隔多个主机。 | 字符串 | |
| 端口 (common) | Cassandra 服务器的端口号。 | 整数 | |
| Keyspace (common) | 要使用的键空间。 | 字符串 |
13.3.2. 查询参数(30 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| ClusterName (common) | 集群名称。 | 字符串 | |
| 一致性级别 (common) | 要使用的一致性级别。 Enum 值:
| DefaultConsistencyLevel | |
| CQL ( common) | 要执行的 CQL 查询。可以通过密钥 CamelCqlQuery 来覆盖消息标头。 | 字符串 | |
| 数据中心 (通用) | 要使用的数据中心。 | datacenter1 | 字符串 |
| loadBalancingPolicyClass (common) | 使用特定的 LoadBalancingPolicyClass。 | 字符串 | |
| 密码 (通用) | 用于会话身份验证的密码。 | 字符串 | |
| prepareStatements (common) | 是否使用准备状态或常规声明。 | true | 布尔值 |
| resultSetConversionStrategy (common) | 要使用实施 ResultSet 的逻辑将 ResultSet 转换为消息 body ALL, ONE, LIMIT_10, LIMIT_100… 的自定义类 | ResultSetConversionStrategy | |
| 会话 (通用) | 要使用 Session 实例(通常不会使用这个选项)。 | CqlSession | |
| 用户名 (通用) | 用于会话身份验证的用户名。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
13.4. 端点连接语法
端点可以启动 Cassandra 连接,也可以使用现有的连接。
| URI | 描述 |
|---|---|
|
| 单台主机默认端口,通常用于测试 |
|
| 多主机,默认端口 |
|
| 多主机,自定义端口 |
|
| 默认端口和键空间 |
|
| 提供的会话参考 |
|
| 提供的集群参考 |
要微调 Cassandra 连接(SSL 选项、池选项、负载平衡策略、重试策略、重新连接策略…),请创建自己的 Cluster 实例,并将其提供给 Camel 端点。
13.5. messages
13.5.1. 传入消息
Camel Cassandra 端点需要一个 bunch 简单对象(Object 或 Object[] 或 Collection<Object>),它将绑定到 CQL 语句作为查询参数。如果消息正文为空或为空,则将在不绑定参数的情况下执行 CQL 查询。
Headers
CamelCqlQuery(可选、字符串或常规状态)CQL 查询为普通字符串,或者使用
QueryBuilder进行构建。
13.5.2. 传出消息
根据 resultSetConversionStrategy,Camel Cassandra 端点会生成一个或多个 Cassandra Row 对象:
-
list<Row> ifresultSetConversionStrategyisALL或LIMIT_[0-9]+ -
如果
resultSetConversionStrategy为ONE,则单行' -
否则,如果
resultSetConversionStrategy是ResultSetConversionStrategy的自定义实现
13.6. 软件仓库
Cassandra 可用于存储幂等和聚合 EIP 的消息密钥或消息。
Cassandra 可能还没有是排队用例的最佳工具,读取 Cassandra 反模式队列和队列,如数据集。我们建议对这些表使用 LeveledCompaction 和一个小的 GC 宽限期设置来允许快速删除 tombstoned 行。
13.7. 幂等软件仓库
NamedCassandraIdempotentRepository 将消息密钥存储在 Cassandra 表中,如下所示:
CAMEL_IDEMPOTENT.cql
CREATE TABLE CAMEL_IDEMPOTENT (
NAME varchar, -- Repository name
KEY varchar, -- Message key
PRIMARY KEY (NAME, KEY)
) WITH compaction = {'class':'LeveledCompactionStrategy'}
AND gc_grace_seconds = 86400;
此存储库实施使用轻量级事务(也称为 Compare 和 Set),并且需要 Cassandra 2.0.7+。
或者,CassandraIdempotentRepository 没有 NAME 列,并可扩展为使用不同的数据模型。
| 选项 | 默认值 | 描述 |
|---|---|---|
|
|
| 表名称 |
|
|
| 主键列 |
|
|
Repository name,用于 | |
|
| 实时的关键时间 | |
|
|
用于插入/删除密钥的一致性级别: | |
|
|
用于读取/检查密钥的一致性级别: |
13.8. 聚合存储库
NamedCassandraAggregationRepository 通过在 Cassandra 表中关联键存储交换,如下所示:
CAMEL_AGGREGATION.cql
CREATE TABLE CAMEL_AGGREGATION (
NAME varchar, -- Repository name
KEY varchar, -- Correlation id
EXCHANGE_ID varchar, -- Exchange id
EXCHANGE blob, -- Serialized exchange
PRIMARY KEY (NAME, KEY)
) WITH compaction = {'class':'LeveledCompactionStrategy'}
AND gc_grace_seconds = 86400;
或者,CassandraAggregationRepository 没有 NAME 列,并可扩展为使用不同的数据模型。
| 选项 | 默认值 | 描述 |
|---|---|---|
|
|
| 表名称 |
|
|
| 主键列 |
|
|
| Exchange Id 列 |
|
|
| Exchange content 列 |
|
|
Repository name,用于 | |
|
| 交换生存时间 | |
|
|
用于插入/删除交换的一致性级别: | |
|
|
用于读取/检查交换的一致性级别: |
13.9. 例子
要在表中插入一些内容,您可以使用以下代码:
String CQL = "insert into camel_user(login, first_name, last_name) values (?, ?, ?)";
from("direct:input")
.to("cql://localhost/camel_ks?cql=" + CQL);此时,您应能够通过将列表用作正文来插入数据
Arrays.asList("davsclaus", "Claus", "Ibsen")相同的方法可用于更新或查询表。
13.10. Spring Boot Auto-Configuration
在 Spring Boot 中使用 cql 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-cassandraql-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.cql.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.cql.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.cql.enabled | 是否启用 cql 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.cql.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 14 章 控制总线
仅支持制作者
来自 EIP 模式的控制总线 允许从框架内监控和管理集成系统。
使用控制总线来管理企业集成系统。控制总线使用与应用数据中使用的相同消息传递机制,但使用单独的通道来传输与消息流中涉及的组件管理相关的数据。
在 Camel 中,您可以使用 JMX 管理和监控,或使用来自 CamelContext 的 Java API,或者从 org.apache.camel.api.management 软件包中或使用具有示例的事件通知程序。
ControlBus 组件根据控制总线 EIP 模式提供简单管理 Camel 应用程序。例如,向 Endpoint 发送消息,您可以控制路由的生命周期或收集性能统计信息。
controlbus:command[?options]
其中 command 可以是任何字符串,用于识别要使用的命令类型。
14.1. 命令
| 命令 | 描述 |
|---|---|
|
|
使用 |
|
| 允许您指定用于评估邮件正文的。如果评估中有任何结果,则结果将置于邮件正文中。 |
14.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
14.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
14.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
14.3. 组件选项
控制总线组件支持 2 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
14.4. 端点选项
Control Bus 端点使用 URI 语法进行配置:
controlbus:command:language
使用以下路径和查询参数:
14.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 命令 (生成者) | 所需 命令可以是 route 或 language。 Enum 值:
| 字符串 | |
| 语言 (生成) | 允许您指定用于评估邮件正文的语言名称。如果评估中有任何结果,则结果将置于邮件正文中。 Enum 值:
| 语言 |
14.4.1.1. 查询参数(6 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 操作 (生成) | 表示可以是:start、stop 或 status 的操作。要启动或停止路由,或者作为消息正文中的输出获取路由的状态。您可以使用 suspend 和 resume from Camel 2.11.1 onwards 来挂起或恢复路由。从 Camel 2.11.1 开始,您可以使用 stats 以 XML 格式获取性能静态; routeId 选项可用于定义哪个路由来获取性能统计,如果未定义 routeId,则获取整个 CamelContext 的统计信息。restart 操作将重启路由。 Enum 值:
| 字符串 | |
| async (生成器) | 是否异步执行控制总线任务。重要:如果启用了这个选项,则不会在 Exchange 上设置任务中的任何结果。这只有在同步执行任务时才可能。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| loggingLevel (producer) | 完成任务时用于日志记录的日志记录级别,或者任务处理过程中发生了任何异常。 Enum 值:
| INFO | LoggingLevel |
| restartDelay (producer) | 重启路由时要使用的延迟。 | 1000 | int |
| routeId (producer) | 通过其 id 指定路由。special 关键字 current 表示当前的路由。 | 字符串 |
14.5. 使用 route 命令
route 命令允许您在给定路由上轻松执行常见任务,例如启动路由,您可以向此端点发送空消息:
template.sendBody("controlbus:route?routeId=foo&action=start", null);要获取路由的状态,您可以:
String status = template.requestBody("controlbus:route?routeId=foo&action=status", null, String.class);14.6. 获取性能统计
这要求启用 JMX (默认为 ),然后您可以获得每个路由的性能统计信息,或用于 CamelContext。例如,要获取名为 foo 的路由的统计信息,可以:
String xml = template.requestBody("controlbus:route?routeId=foo&action=stats", null, String.class);
返回的统计信息采用 XML 格式。其在 ManagedRouteMBean 上可以使用 dumpRouteStatsAsXml 操作从 JMX 获得相同的数据。
要获取整个 CamelContext 的统计信息,只需省略 routeId 参数,如下所示:
String xml = template.requestBody("controlbus:route?action=stats", null, String.class);14.7. 使用简单语言
您可以将 简单 语言与控制总线一起使用,例如停止特定路由,您可以向 "controlbus:language:simple" 端点发送一条消息,其中包含以下消息:
template.sendBody("controlbus:language:simple", "${camelContext.getRouteController().stopRoute('myRoute')}");因为这是一个 void 操作,因此不会返回。但是,如果您希望路由状态,您可以执行以下操作:
String status = template.requestBody("controlbus:language:simple", "${camelContext.getRouteStatus('myRoute')}", String.class);
使用 route 命令控制路由的生命周期是更容易的。您可以通过 language 命令执行具有更强大的功能(如 Groovy 或一些 简单 语言)的语言脚本。
例如,要关闭 Camel 本身,您可以:
template.sendBody("controlbus:language:simple?async=true", "${camelContext.stop()}");
我们使用 async=true 异步停止 Camel,否则我们将在处理发送到控制总线组件的消息时尝试停止 Camel。
您还可以使用其他语言,如 Groovy 等。
14.8. Spring Boot Auto-Configuration
在 Spring Boot 中使用 controlbus 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-controlbus-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.controlbus.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.controlbus.enabled | 是否启用 controlbus 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.controlbus.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 15 章 cron
仅支持消费者
Cron 组件是一个通用接口组件,它允许在特定时间间隔内使用 Unix cron 语法触发事件(例如 0/2 * * * ? 用来每两秒触发事件)。
作为接口组件,Cron 组件不包含默认的实施,而是要求用户插入所选实施。
以下标准 Camel 组件支持 Cron 端点:
- Camel-quartz
- Camel-spring
Camel K 还支持 Cron 组件,它可在 cron 表达式需要时使用 Kubernetes 调度程序触发路由。当使用与 Kubernetes cron 语法兼容的 cron 表达式时,Camel K 不需要插入额外的库。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-cron</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>可能需要额外的库来插入特定的实施。
15.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
15.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
15.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
15.2. 组件选项
Cron 组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| cronService (高级) | 提供了多个实施时,要使用的 CamelCronService 的 ID。 | 字符串 |
15.3. 端点选项
Cron 端点是使用 URI 语法配置的:
cron:name
使用以下路径和查询参数:
15.3.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 名称 (使用者) | 所需的 cron 触发器名称。 | 字符串 |
15.3.2. 查询参数(4 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| 计划 (消费者) | 需要一个 用于生成事件的 cron 表达式。 | 字符串 | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern |
15.4. 使用方法
组件可用于在指定时间触发事件,如下例所示:
from("cron:tab?schedule=0/1+*+*+*+*+?")
.setBody().constant("event")
.log("${body}");
调度表达式 0/3+10+114 +? 也可以写为 十分钟内每三个秒触发一次事件。
0/3 10945?,并在每小时的
调度表达式中的部分表示(按顺序):
- 秒(可选)
- 分钟
- hours
- 几号
- 月
- 星期几
- 年(可选)
计划表达式可分为 5 到 7 个部分。当表达式由 6 个部分组成时,第一个项是"秒"部分(并被视为缺失年)。
调度表达式的其他有效示例有:
-
0/2 * * * ?(5 部分,每两分钟一个事件) -
0 0/2 * * MON-FRI 2030(7 部分,每两分钟一次事件,共 2030 年一次。)
路由也可以使用 XML DSL 编写。
<route>
<from uri="cron:tab?schedule=0/1+*+*+*+*+?"/>
<setBody>
<constant>event</constant>
</setBody>
<to uri="log:info"/>
</route>15.5. Spring Boot Auto-Configuration
当将 cron 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-cron-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.cron.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.cron.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.cron.cron-service | 提供了多个实施时,要使用的 CamelCronService 的 ID。 | 字符串 | |
| camel.component.cron.enabled | 是否启用 cron 组件的自动配置。这默认是启用的。 | 布尔值 |
第 16 章 CXF
支持制作者和使用者
CXF 组件提供与 Apache CXF 集成,用于连接 CXF 上托管的 JAX-WS 服务。
在流模式中使用 CXF (请参阅 DataFormat 选项),然后读取流缓存。
Maven 用户必须在其 pom.xml 中为这个组件添加以下依赖项:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-cxf-soap</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>16.1. URI 格式
此端点有两个 URI 格式: cxfEndpoint 和 someAddress。
cxf:bean:cxfEndpoint[?options]
其中 cxfEndpoint 代表一个 Bean ID,它引用 Spring bean registry 中的 bean。使用这个 URI 格式,大多数端点详情都在 bean 定义中指定。
cxf://someAddress[?options]
其中 someAddress 指定 CXF 端点的地址。使用这个 URI 格式,大多数端点详情都是使用选项来指定。
对于以上任何一种样式,您可以在 URI 中附加选项,如下所示:
cxf:bean:cxfEndpoint?wsdlURL=wsdl/hello_world.wsdl&dataFormat=PAYLOAD
16.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
16.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
16.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为 配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
16.3. 组件选项
CXF 组件支持 6 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| allowStreaming (高级) | 这个选项控制在 PAYLOAD 模式下运行 CXF 组件时,将 DOM 解析传入的消息到 DOM Elements,或者将有效负载保留为 javax.xml.transform.Source 对象,该对象在某些情况下允许流。 | 布尔值 | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| headerFilterStrategy (filter) | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| useGlobalSslContextParameters (security) | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
16.4. 端点选项
CXF 端点使用 URI 语法进行配置:
cxf:beanId:address
使用以下路径和查询参数:
16.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| beanId (common) | 查找现有的配置的 CxfEndpoint。必须使用 bean: 作为前缀。 | 字符串 | |
| 地址 (服务) | 服务发布地址。 | 字符串 |
16.4.2. 查询参数(35 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| dataFormat (common) | CXF 端点支持的数据类型消息。 Enum 值:
| POJO | DataFormat |
| wrapStyle (common) | WSDL 风格,它描述了在 SOAP 正文中如何表示参数。如果值为 false,则 CXF 将选择 document-literal unwrapped 样式,如果值为 true,则 CXF 将选择文档嵌套样式。 | 布尔值 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| cookieHandler (producer) | 配置 Cookie 处理程序,以维护 HTTP 会话。 | CookieHandler | |
| defaultOperationName (producer) | 此选项将设置默认 operationName,它将由调用远程服务的 CxfProducer 使用。 | 字符串 | |
| defaultOperationNamespace (producer) | 此选项将设置默认 operationNamespace,它将由调用远程服务的 CxfProducer 使用。 | 字符串 | |
| hostnameVerifier (producer) | 要使用的主机名验证器。使用 # 表示法引用 registry 中的 HostnameVerifier。 | HostnameVerifier | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| sslContextParameters (producer) | Camel SSL 设置参考。使用 # 表示法引用 SSL 上下文。 | SSLContextParameters | |
| 包装 (生成) | CXF 端点制作者将调用的种类。 | false | 布尔值 |
| 同步 (生成(高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| allowStreaming (高级) | 这个选项控制在 PAYLOAD 模式下运行 CXF 组件时,将 DOM 解析传入的消息到 DOM Elements,或者将有效负载保留为 javax.xml.transform.Source 对象,该对象在某些情况下允许流。 | 布尔值 | |
| 总线 (高级) | 使用自定义配置的 CXF 总线。 | 总线 | |
| continuationTimeout (高级) | 这个选项用于设置 CXF continuation 超时,在 CXF 服务器使用 Jetty 或 Servlet 传输时,默认可在 CxfConsumer 中使用它。 | 30000 | long |
| cxfBinding (高级) | 使用自定义 CxfBinding 控制 Camel 消息和 CXF 消息之间的绑定。 | CxfBinding | |
| cxfConfigurer (高级) | 这个选项可以应用 org.apache.camel.component.cxf.CxfEndpointConfigurer 的实现,它支持以编程方式配置 CXF 端点。用户可通过实施 CxfEndpointConfigurer 的 configure{ServerClient} 方法来配置 CXF 服务器和客户端。 | CxfConfigurer | |
| defaultBus (高级) | 当 CXF 端点自行创建总线时,将设置默认总线。 | false | 布尔值 |
| headerFilterStrategy (高级) | 使用自定义 HeaderFilterStrategy 过滤标题到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| mergeProtocolHeaders (高级) | 是否合并协议标头。如果启用,则在 Camel 和 CXF 之间传播标头会变得更加一致且类似。如需了解更多详细信息,请参阅 CAMEL-6393。 | false | 布尔值 |
| mtomEnabled (高级) | 启用 MTOM (attachments)。这需要使用 POJO 或 PAYLOAD 数据格式模式。 | false | 布尔值 |
| 属性 (高级) | 要使用映射中的键/值对设置额外的 CXF 选项。例如,要在 SOAP 故障中打开 stacktraces,属性.faultStackTraceEnabled=true。 | map | |
| skipPayloadMessagePartCheck (高级) | 设置是否应禁用 SOAP 消息验证。 | false | 布尔值 |
| loggingFeatureEnabled (logging) | 这个选项启用 CXF Logging 功能,它将入站和出站 SOAP 消息写入日志中。 | false | 布尔值 |
| loggingSizeLimit (logging) | 为限制在启用了日志记录功能时,日志记录器将输出的字节数,-1 代表没有限制。 | 49152 | int |
| skipFaultLogging (logging) | 这个选项控制 PhaseInterceptorChain 是否跳过记录它捕获的信息。 | false | 布尔值 |
| 密码 (安全) | 这个选项用于为 CXF 客户端设置密码的基本身份验证信息。 | 字符串 | |
| 用户名 (安全) | 这个选项用于为 CXF 客户端设置 username 的基本身份验证信息。 | 字符串 | |
| bindingId (service) | 要使用的服务模型的 bindingId。 | 字符串 | |
| PortName (service) | 此服务实施的端点名称,它映射到 wsdl:portname。在 ns:PORT_NAME 格式中,其中 ns 是在这个范围内有效的命名空间前缀。 | 字符串 | |
| publishedEndpointUrl (service) | 此选项可覆盖从 WSDL 中发布的 endpointUrl,该DL 可通过服务地址 url 和 wsd 进行访问。 | 字符串 | |
| serviceClass (service) | SEI (Service Endpoint Interface)类的类名称,它可能具有 JSR181 注解。 | 类 | |
| serviceName (service) | 此服务实施的服务名称,它映射到 wsdl:servicename。 | 字符串 | |
| wsdlURL (service) | WSDL 的位置。可以在类路径、文件系统或远程托管上。 | 字符串 |
serviceName 和 portName 是 QNames,因此如果您为其提供 {namespace} 前缀,如上例中所示。
16.4.3. 数据格式的描述
在 Apache Camel 中,Camel CXF 组件是将路由与 Web 服务集成的关键。您可以使用 Camel CXF 组件创建 CXF 端点,该端点可通过以下任一方式使用:
- consumer - (在路由开始时)代表一个 Web 服务实例,它与路由集成。注入路由的有效负载类型取决于端点的 dataFormat 选项的值。
- producer - (路由中的其他点)代表 WS 客户端代理,它将当前的交换对象转换为远程 Web 服务上的操作调用。当前交换的格式必须与端点的 dataFormat 设置匹配。
| DataFormat | 描述 |
|---|---|
|
| POJO (旧 Java 对象)是目标服务器上调用的方法的 Java 参数。支持协议和逻辑 JAX-WS 处理程序。 |
|
|
应用 CXF 端点中的消息配置后, |
|
|
|
|
|
|
您可以通过检索 Exchange 属性 CamelCXFDataFormat 来确定交换的数据格式模式。Exchange key constant 在 org.apache.camel.component.cxf.common.message.CxfConstants.DATA_FORMAT_PROPERTY 中定义。
16.4.4. 如何在 RAW 模式中启用 CXF 的 LoggingOutInterceptor
cxf 的 LoggingOutInterceptor 输出出站消息,这些消息会线路记录系统(Java Util Logging)。由于 LoggingOutInterceptor 处于 PRE_STREAM 阶段(但 PRE_STREAM 阶段在 RAW 模式中被删除),因此您必须将 LoggingOutInterceptor 配置为在 WRITE 阶段运行。以下是一个示例:
@Bean
public CxfEndpoint serviceEndpoint(LoggingOutInterceptor loggingOutInterceptor) {
CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
cxfEndpoint.setAddress("http://localhost:" + port
+ "/services" + SERVICE_ADDRESS);
cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("dataFormat", "RAW");
cxfEndpoint.setProperties(properties);
cxfEndpoint.getOutInterceptors().add(loggingOutInterceptor);
return cxfEndpoint;
}
@Bean
public LoggingOutInterceptor loggingOutInterceptor() {
LoggingOutInterceptor logger = new LoggingOutInterceptor("write");
return logger;
}16.4.5. relayHeaders 选项的描述
从 JAXWS WSDL-first 开发人员的角度来看,有带外 的标头。
in-band 标头是标头,作为端点(如 SOAP 标头)的 WSDL 绑定合同的一部分被明确定义。
带外管理 标头是通过线序列化但不是 WSDL 绑定合同的一部分的标头。
标头转发/过滤是双向的。
当路由具有 CXF 端点并且开发人员需要具有在线标头(如 SOAP 标头)时,与另一个 JAXWS 端点使用的路由进行转发,那么 relayHeaders 应设置为 true,这是默认值。
16.4.6. 只在 POJO 模式中可用
relayHeaders=true 表示转发标头的意图。给定标头是否转发的实际决定被委派给实施 MessageHeadersRelay 接口的可插拔实例。将查阅 MessageHeadersRelay 的 Concrete 实现,以确定是否需要转发标头。已经有一个 SoapMessageHeadersRelay 的实现,它将自己绑定到众所周知的 SOAP 名称空间。目前只过滤带外标头,当 relayHeaders=true 时,才会转发带中的标头。如果有线上有名称空间未知给运行时的标头,则会使用回退到 DefaultMessageHeadersRelay,它只是允许转发所有标头。
relayHeaders=false 设置指定所有标头 in-band 和 out-band 都应丢弃。
您可以插入自己的 MessageHeadersRelay 实施覆盖,或者在中继列表中添加其他插件。要覆盖预先加载的中继实例,只需确保您的 MessageHeadersRelay 实现服务与您要覆盖的名称空间相同。另请注意,覆盖中继必须作为您查找覆盖的所有命名空间服务,否则路由启动时的其他运行时异常将被抛出,因为这会在命名空间到中继实例映射中引入模糊性。
<cxf:cxfEndpoint ...>
<cxf:properties>
<entry key="org.apache.camel.cxf.message.headers.relays">
<list>
<ref bean="customHeadersRelay"/>
</list>
</entry>
</cxf:properties>
</cxf:cxfEndpoint>
<bean id="customHeadersRelay" class="org.apache.camel.component.cxf.soap.headers.CustomHeadersRelay"/>查看测试,其中显示了如何进行转发/过滤标头:
-
支持
POJO和PAYLOAD模式。在POJO模式中,只有带外消息标头才能过滤,因为没有 CXF 从标头列表中处理并删除在带中的标头列表中。in-band 标头合并到 POJO 模式的MessageContentList中。camel-cxf组件会导致尝试从MessageContentList中删除带外标头。如果需要过滤 in-band 标头,请使用PAYLOAD模式或插件(pretty simple) CXF 拦截器/JAXWS Handler 到 CXF 端点。 -
Message Header Relay 机制已合并到
CxfHeaderFilterStrategy中。relayHeaders选项、其语义和默认值保持不变,但它是CxfHeaderFilterStrategy的属性。以下是配置它的示例:
@Bean
public HeaderFilterStrategy dropAllMessageHeadersStrategy() {
CxfHeaderFilterStrategy headerFilterStrategy = new CxfHeaderFilterStrategy();
headerFilterStrategy.setRelayHeaders(false);
return headerFilterStrategy;
}
然后,您的端点可以引用 CxfHeaderFilterStrategy。
@Bean
public CxfEndpoint routerNoRelayEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
cxfEndpoint.setWsdlURL("soap_header.wsdl");
cxfEndpoint.setEndpointNameAsQName(
QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
cxfEndpoint.setServiceNameAsQName(SERVICENAME);
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("dataFormat", "PAYLOAD");
cxfEndpoint.setProperties(properties);
cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
return cxfEndpoint;
}
@Bean
public CxfEndpoint serviceNoRelayEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpointBackend");
cxfEndpoint.setWsdlURL("soap_header.wsdl");
cxfEndpoint.setEndpointNameAsQName(
QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
cxfEndpoint.setServiceNameAsQName(SERVICENAME);
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("dataFormat", "PAYLOAD");
cxfEndpoint.setProperties(properties);
cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
return cxfEndpoint;
}然后配置路由,如下所示:
rom("cxf:bean:routerNoRelayEndpoint")
.to("cxf:bean:serviceNoRelayEndpoint");-
MessageHeadersRelay接口已稍有变化,并被重命名为MessageHeaderFilter。它是CxfHeaderFilterStrategy的属性。以下是配置用户定义的消息标头过滤器的示例:
@Bean
public HeaderFilterStrategy customMessageFilterStrategy() {
CxfHeaderFilterStrategy headerFilterStrategy = new CxfHeaderFilterStrategy();
List<MessageHeaderFilter> headerFilterList = new ArrayList<MessageHeaderFilter>();
headerFilterList.add(new SoapMessageHeaderFilter());
headerFilterList.add(new CustomHeaderFilter());
headerFilterStrategy.setMessageHeaderFilters(headerFilterList);
return headerFilterStrategy;
}-
除了
relayHeaders外,也可以在CxfHeaderFilterStrategy中配置以下属性。
| 名称 | 必填 | 描述 |
|---|---|---|
|
| 否 |
所有消息标头都将由 Message Header Filters Type: |
|
| 否 |
所有消息标头都将传播(不由 Message Header Filters 处理) 类型: |
|
| 否 |
如果激活命名空间中的两个过滤器重叠,则属性控制应如何处理它。如果值为 |
16.5. 使用 Spring 配置 CXF 端点
您可以使用以下的 Spring 配置文件配置 CXF 端点,也可以将端点嵌入到 camelContext 标签中。当您调用服务端点时,您可以将 operationName 和 operationNamespace 标头设置为明确声明您要调用的操作。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://camel.apache.org/schema/cxf"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<cxf:cxfEndpoint id="routerEndpoint" address="http://localhost:9003/CamelContext/RouterPort"
serviceClass="org.apache.hello_world_soap_http.GreeterImpl"/>
<cxf:cxfEndpoint id="serviceEndpoint" address="http://localhost:9000/SoapContext/SoapPort"
wsdlURL="testutils/hello_world.wsdl"
serviceClass="org.apache.hello_world_soap_http.Greeter"
endpointName="s:SoapPort"
serviceName="s:SOAPService"
xmlns:s="http://apache.org/hello_world_soap_http" />
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="cxf:bean:routerEndpoint" />
<to uri="cxf:bean:serviceEndpoint" />
</route>
</camelContext>
</beans>
务必包含 root beans 元素上指定的 JAX-WS schemaLocation 属性。这允许 CXF 验证文件并是必需的。另请注意,< cxf:cxfEndpoint/& gt; 标签末尾的命名空间声明。这些声明是必需的,因为该标签的属性值不支持组合 {namespace}localName 语法。
cxf:cxfEndpoint 元素支持许多其他属性:
| 名称 | 值 |
|---|---|
|
|
此服务实施的端点名称,它将映射到 |
|
|
此服务正在实施的服务名称,它将映射到 |
|
| WSDL 的位置。可以在类路径、文件系统或远程托管上。 |
|
|
要使用的服务模型的 |
|
| 服务发布地址。 |
|
| JAX-WS 端点中使用的总线名称。 |
|
| SEI (Service Endpoint Interface)类的类名称,它可能具有 JSR181 注解。 |
它还支持许多子元素:
| 名称 | 值 |
|---|---|
|
|
此端点的传入拦截器。< |
|
|
此端点的传入故障拦截器。< |
|
|
此端点的传出拦截器。< |
|
|
此端点的传出故障拦截器。< |
|
| 应提供给 JAX-WS 端点的属性映射。请参见以下。 |
|
| JAX-WS 处理程序列表,应当提供给 JAX-WS 端点。请参见以下。 |
|
|
您可以指定要在端点中使用的 |
|
|
您可以指定 |
|
| 保存此端点的拦截器的功能。Bean 或 refs 列表 |
|
| 要使用的端点的架构位置。schemaLocations 列表 |
|
|
此端点使用的服务工厂。这可以通过 Spring < |
您可以找到更高级的示例,它演示了如何在 CXF JAX-WS Configuration 页面上 提供拦截器、属性和处理程序。
您可以使用 cxf:properties 设置 camel-cxf 端点的 dataFormat,并从 spring 配置文件中设置DefaultBus 属性。
<cxf:cxfEndpoint id="testEndpoint" address="http://localhost:9000/router"
serviceClass="org.apache.camel.component.cxf.HelloService"
endpointName="s:PortName"
serviceName="s:ServiceName"
xmlns:s="http://www.example.com/test">
<cxf:properties>
<entry key="dataFormat" value="RAW"/>
<entry key="setDefaultBus" value="true"/>
</cxf:properties>
</cxf:cxfEndpoint>
在 SpringBoot 中,您可以使用 Spring XML 文件配置 camel-cxf,并使用类似以下示例的代码来创建 XML 配置的 Bean:
@ImportResource({
"classpath:spring-configuration.xml"
})但是,使用配置了 Java 代码的 Bean (如其他示例中所示)是 SpringBoot 中的最佳实践。
16.6. 如何使 camel-cxf 组件使用 log4j 而不是 java.util.logging
CXF 的默认日志记录器是 java.util.logging。如果要将其更改为 log4j,请按如下所示继续。在 classpath 中创建一个名为 META-INF/cxf/org.apache.cxf.logger 的文件。此文件应包含类的完全限定名称 org.apache.cxf.common.logging.Log4jLogger,且无注释。
16.7. 如何使用 xml 处理指令使 camel-cxf 响应开头
如果您使用一些 SOAP 客户端,如 PHP,您会收到此类错误,因为 CXF 不会添加 XML 处理指令 < ?xml version="1.0" encoding="utf-8"?> :
Error:sendSms: SoapFault exception: [Client] looks like we got no XML document in [...]
要解决这个问题,您只需要告诉 StaxOutInterceptor 为您编写 XML 启动文档,如下面的 WriteXmlDeclarationInterceptor 中:
public class WriteXmlDeclarationInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
public WriteXmlDeclarationInterceptor() {
super(Phase.PRE_STREAM);
addBefore(StaxOutInterceptor.class.getName());
}
public void handleMessage(SoapMessage message) throws Fault {
message.put("org.apache.cxf.stax.force-start-document", Boolean.TRUE);
}
}作为替代方案,您可以添加消息标头,如 CxfConsumerTest 中所示:
// set up the response context which force start document
Map<String, Object> map = new HashMap<String, Object>();
map.put("org.apache.cxf.stax.force-start-document", Boolean.TRUE);
exchange.getOut().setHeader(Client.RESPONSE_CONTEXT, map);16.8. 如何覆盖消息标头中的 CXF 制作者地址
camel-cxf producer 支持通过设置消息标头 CamelDestinationOverrideUrl 来覆盖目标服务地址。
// set up the service address from the message header to override the setting of CXF endpoint exchange.getIn().setHeader(Exchange.DESTINATION_OVERRIDE_URL, constant(getServiceAddress()));
16.9. 如何使用来自 POJO 数据格式的 camel-cxf 端点的消息
camel-cxf endpoint consumer POJO 数据格式基于 CXF 调用器,因此消息标头具有名称 CxfConstants.OPERATION_NAME 的属性,消息正文是 SEI 方法参数的列表。
考虑 PersonProcessor 示例代码:
public class PersonProcessor implements Processor {
private static final Logger LOG = LoggerFactory.getLogger(PersonProcessor.class);
@Override
@SuppressWarnings("unchecked")
public void process(Exchange exchange) throws Exception {
LOG.info("processing exchange in camel");
BindingOperationInfo boi = (BindingOperationInfo) exchange.getProperty(BindingOperationInfo.class.getName());
if (boi != null) {
LOG.info("boi.isUnwrapped" + boi.isUnwrapped());
}
// Get the parameters list which element is the holder.
MessageContentsList msgList = (MessageContentsList) exchange.getIn().getBody();
Holder<String> personId = (Holder<String>) msgList.get(0);
Holder<String> ssn = (Holder<String>) msgList.get(1);
Holder<String> name = (Holder<String>) msgList.get(2);
if (personId.value == null || personId.value.length() == 0) {
LOG.info("person id 123, so throwing exception");
// Try to throw out the soap fault message
org.apache.camel.wsdl_first.types.UnknownPersonFault personFault
= new org.apache.camel.wsdl_first.types.UnknownPersonFault();
personFault.setPersonId("");
org.apache.camel.wsdl_first.UnknownPersonFault fault
= new org.apache.camel.wsdl_first.UnknownPersonFault("Get the null value of person name", personFault);
exchange.getMessage().setBody(fault);
return;
}
name.value = "Bonjour";
ssn.value = "123";
LOG.info("setting Bonjour as the response");
// Set the response message, first element is the return value of the operation,
// the others are the holders of method parameters
exchange.getMessage().setBody(new Object[] { null, personId, ssn, name });
}
}16.10. 如何以 POJO 数据格式为 camel-cxf 端点准备消息
camel-cxf 端点制作者基于 CXF 客户端 API。首先,您需要在消息标头中指定操作名称,然后将方法参数添加到列表中,并使用此参数列表初始化消息。响应消息的正文是 messageContentsList,您可以从该列表中获取结果。
如果您没有在消息标头中指定操作名称,CxfProducer 将尝试从 CxfEndpoint 使用 defaultOperationName,如果没有在 上设置 CxfEndpoint defaultOperationName,它将从 Operation 列表中选择第一个 operationName。
如果要从邮件正文获取对象数组,您可以使用 message.getBody (Object[].class) 获取正文,如 CxfProducerRouterTest.testInvokingSimpleServerWithParams:
Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut);
final List<String> params = new ArrayList<>();
// Prepare the request message for the camel-cxf procedure
params.add(TEST_MESSAGE);
senderExchange.getIn().setBody(params);
senderExchange.getIn().setHeader(CxfConstants.OPERATION_NAME, ECHO_OPERATION);
Exchange exchange = template.send("direct:EndpointA", senderExchange);
org.apache.camel.Message out = exchange.getMessage();
// The response message's body is an MessageContentsList which first element is the return value of the operation,
// If there are some holder parameters, the holder parameter will be filled in the reset of List.
// The result will be extract from the MessageContentsList with the String class type
MessageContentsList result = (MessageContentsList) out.getBody();
LOG.info("Received output text: " + result.get(0));
Map<String, Object> responseContext = CastUtils.cast((Map<?, ?>) out.getHeader(Client.RESPONSE_CONTEXT));
assertNotNull(responseContext);
assertEquals("UTF-8", responseContext.get(org.apache.cxf.message.Message.ENCODING),
"We should get the response context here");
assertEquals("echo " + TEST_MESSAGE, result.get(0), "Reply body on Camel is wrong");16.11. 如何以 PAYLOAD 数据格式处理 camel-cxf 端点的消息
PAYLOAD 表示从 SOAP 信封作为原生 CxfPayload 处理载荷。message .getBody () 将返回一个 org.apache.camel.component.cxf.CxfPayload 对象,其中包含 SOAP 消息标头和 SOAP 正文的 getters。
请参阅 CxfConsumerPayloadTest :
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
from(simpleEndpointURI + "&dataFormat=PAYLOAD").to("log:info").process(new Processor() {
@SuppressWarnings("unchecked")
public void process(final Exchange exchange) throws Exception {
CxfPayload<SoapHeader> requestPayload = exchange.getIn().getBody(CxfPayload.class);
List<Source> inElements = requestPayload.getBodySources();
List<Source> outElements = new ArrayList<>();
// You can use a customer toStringConverter to turn a CxfPayLoad message into String as you want
String request = exchange.getIn().getBody(String.class);
XmlConverter converter = new XmlConverter();
String documentString = ECHO_RESPONSE;
Element in = new XmlConverter().toDOMElement(inElements.get(0));
// Just check the element namespace
if (!in.getNamespaceURI().equals(ELEMENT_NAMESPACE)) {
throw new IllegalArgumentException("Wrong element namespace");
}
if (in.getLocalName().equals("echoBoolean")) {
documentString = ECHO_BOOLEAN_RESPONSE;
checkRequest("ECHO_BOOLEAN_REQUEST", request);
} else {
documentString = ECHO_RESPONSE;
checkRequest("ECHO_REQUEST", request);
}
Document outDocument = converter.toDOMDocument(documentString, exchange);
outElements.add(new DOMSource(outDocument.getDocumentElement()));
// set the payload header with null
CxfPayload<SoapHeader> responsePayload = new CxfPayload<>(null, outElements, null);
exchange.getMessage().setBody(responsePayload);
}
});
}
};
}16.12. 如何在 POJO 模式下获取和设置 SOAP 标头
POJO 表示当 camel-cxf 端点生成或消耗 Camel 交换时,数据格式是 Java 对象的"列表"。虽然 Camel 在此模式中将邮件正文公开为 POJO,但 camel-cxf 仍然提供对读取和写入 SOAP 标头的访问。但是,由于 CXF 拦截器在处理后从标头列表中删除带带 SOAP 标头,因此只有带外 SOAP 标头才能在 POJO 模式中的 camel-cxf 可用。
以下示例演示了如何获取/设置 SOAP 标头。假设我们有一个路由,它从一个 Camel-cxf 端点转发到另一个。也就是说,SOAP Client → Camel → CXF 服务。在请求进入 CXF 服务前,我们可以通过(1)附加两个处理器来获取/插入 SOAP 标头,并在响应返回 SOAP 客户端前(2)。本例中的处理器(1)和(2)是 InsertRequestOutHeaderProcessor 和 InsertResponseOutHeaderProcessor。我们的路由如下:
from("cxf:bean:routerRelayEndpointWithInsertion")
.process(new InsertRequestOutHeaderProcessor())
.to("cxf:bean:serviceRelayEndpointWithInsertion")
.process(new InsertResponseOutHeaderProcessor());
Bean routerRelayEndpointWithInsertion 和 serviceRelayEndpointWithInsertion 定义如下:
@Bean
public CxfEndpoint routerRelayEndpointWithInsertion() {
CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertion");
cxfEndpoint.setWsdlURL("soap_header.wsdl");
cxfEndpoint.setEndpointNameAsQName(
QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelayWithInsertion"));
cxfEndpoint.setServiceNameAsQName(SERVICENAME);
cxfEndpoint.getFeatures().add(new LoggingFeature());
return cxfEndpoint;
}
@Bean
public CxfEndpoint serviceRelayEndpointWithInsertion() {
CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertionBackend");
cxfEndpoint.setWsdlURL("soap_header.wsdl");
cxfEndpoint.setEndpointNameAsQName(
QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelayWithInsertion"));
cxfEndpoint.setServiceNameAsQName(SERVICENAME);
cxfEndpoint.getFeatures().add(new LoggingFeature());
return cxfEndpoint;
}SOAP 标头通过 Camel 消息标头传播。Camel 消息标头名称为 "org.apache.cxf.headers.Header.list",它是 CXF 中定义的常态(org.apache.cxf.headers.headers.Header.HEADER_LIST)。标头值是一个 CXF SoapHeader 对象(org.apache.cxf.binding.soap.SoapHeader)的列表。以下片段是 InsertResponseOutHeaderProcessor (它在响应消息中插入一个新的 SOAP 标头)。在 InsertResponseOutHeaderProcessor 和 InsertRequestOutHeaderProcessor 中访问 SOAP 标头的方式实际上相同。两个处理器之间的唯一区别是设置插入 SOAP 标头的方向。
您可以在 CxfMessageHeadersRelayTest 中找到 InsertResponseOutHeaderProcessor 示例:
public static class InsertResponseOutHeaderProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
List<SoapHeader> soapHeaders = CastUtils.cast((List<?>)exchange.getIn().getHeader(Header.HEADER_LIST));
// Insert a new header
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><outofbandHeader "
+ "xmlns=\"http://cxf.apache.org/outofband/Header\" hdrAttribute=\"testHdrAttribute\" "
+ "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" soap:mustUnderstand=\"1\">"
+ "<name>New_testOobHeader</name><value>New_testOobHeaderValue</value></outofbandHeader>";
SoapHeader newHeader = new SoapHeader(soapHeaders.get(0).getName(),
DOMUtils.readXml(new StringReader(xml)).getDocumentElement());
// make sure direction is OUT since it is a response message.
newHeader.setDirection(Direction.DIRECTION_OUT);
//newHeader.setMustUnderstand(false);
soapHeaders.add(newHeader);
}
}16.13. 如何在 PAYLOAD 模式中获取和设置 SOAP 标头
我们已在 PAYLOAD 模式中以 CxfPayload 对象的形式显示如何以 CxfPayload 对象来访问 SOAP 消息,第 How to processing the message for a camel-cxf endpoint in PAYLOAD data format.
获取 CxfPayload 对象后,您可以调用返回 DOM Elements (SOAP 标头)列表的 CxfPayload.getHeaders ()方法。
例如,请参阅 CxfPayLoadSoapHeaderTest :
from(getRouterEndpointURI()).process(new Processor() {
@SuppressWarnings("unchecked")
public void process(Exchange exchange) throws Exception {
CxfPayload<SoapHeader> payload = exchange.getIn().getBody(CxfPayload.class);
List<Source> elements = payload.getBodySources();
assertNotNull(elements, "We should get the elements here");
assertEquals(1, elements.size(), "Get the wrong elements size");
Element el = new XmlConverter().toDOMElement(elements.get(0));
elements.set(0, new DOMSource(el));
assertEquals("http://camel.apache.org/pizza/types",
el.getNamespaceURI(), "Get the wrong namespace URI");
List<SoapHeader> headers = payload.getHeaders();
assertNotNull(headers, "We should get the headers here");
assertEquals(1, headers.size(), "Get the wrong headers size");
assertEquals("http://camel.apache.org/pizza/types",
((Element) (headers.get(0).getObject())).getNamespaceURI(), "Get the wrong namespace URI");
// alternatively you can also get the SOAP header via the camel header:
headers = exchange.getIn().getHeader(Header.HEADER_LIST, List.class);
assertNotNull(headers, "We should get the headers here");
assertEquals(1, headers.size(), "Get the wrong headers size");
assertEquals("http://camel.apache.org/pizza/types",
((Element) (headers.get(0).getObject())).getNamespaceURI(), "Get the wrong namespace URI");
}
})
.to(getServiceEndpointURI());您还可以使用与子章节" How to set SOAP header in POJO 模式"中所述的方法相同,以设置或获取 SOAP 标头。因此,您可以使用标头 "org.apache.cxf.headers.Header.list" 获取和设置 SOAP 标头列表。这也意味着,如果您有一个路由从一个 Camel-cxf 端点转发到另一个 Camel-cxf 端点(SOAP Client → Camel → CXF 服务),现在也由 SOAP 客户端发送的 SOAP 标头转发到 CXF 服务。如果您不希望这些标头被转发,您必须在 Camel 标头 "org.apache.cxf.headers.Header.list" 中删除它们。
16.14. RAW 模式中不提供 SOAP 标头
在 RAW 模式中无法使用 SOAP 标头,因为跳过 SOAP 处理。
16.15. 如何从 Camel 丢弃 SOAP 失败
如果您使用 camel-cxf 端点来消耗 SOAP 请求,您可能需要从 camel 上下文中抛出 SOAP Fault。
基本上,您可以使用 throwFault DSL 来执行此操作;它适用于 POJO、PAYLOAD 和 MESSAGE 数据格式。
您可以按照 CxfCustomizedExceptionTest 定义 soap 错误:
SOAP_FAULT = new SoapFault(EXCEPTION_MESSAGE, SoapFault.FAULT_CODE_CLIENT); Element detail = SOAP_FAULT.getOrCreateDetail(); Document doc = detail.getOwnerDocument(); Text tn = doc.createTextNode(DETAIL_TEXT); detail.appendChild(tn);
然后将它作为您喜欢的样板
from(routerEndpointURI).setFaultBody(constant(SOAP_FAULT));
如果您的 CXF 端点采用 MESSAGE 数据格式工作,您可以在消息正文中设置 SOAP Fault 消息,并在消息标头中设置响应代码,如 CxfMessageStreamExceptionTest所示
from(routerEndpointURI).process(new Processor() {
public void process(Exchange exchange) throws Exception {
Message out = exchange.getOut();
// Set the message body with the
out.setBody(this.getClass().getResourceAsStream("SoapFaultMessage.xml"));
// Set the response code here
out.setHeader(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500));
}
});与使用 POJO 数据格式相同。您可以在外部正文上设置 SOAPFault。
16.16. 如何传播 camel-cxf 端点的请求和响应上下文
CXF 客户端 API 提供了一种通过请求和响应上下文调用操作的方法。如果您使用 camel-cxf 端点制作者调用外部 web 服务,您可以使用以下代码设置请求上下文并获取响应上下文:
CxfExchange exchange = (CxfExchange)template.send(getJaxwsEndpointUri(), new Processor() {
public void process(final Exchange exchange) {
final List<String> params = new ArrayList<String>();
params.add(TEST_MESSAGE);
// Set the request context to the inMessage
Map<String, Object> requestContext = new HashMap<String, Object>();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, JAXWS_SERVER_ADDRESS);
exchange.getIn().setBody(params);
exchange.getIn().setHeader(Client.REQUEST_CONTEXT , requestContext);
exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION);
}
});
org.apache.camel.Message out = exchange.getOut();
// The output is an object array, the first element of the array is the return value
Object\[\] output = out.getBody(Object\[\].class);
LOG.info("Received output text: " + output\[0\]);
// Get the response context form outMessage
Map<String, Object> responseContext = CastUtils.cast((Map)out.getHeader(Client.RESPONSE_CONTEXT));
assertNotNull(responseContext);
assertEquals("Get the wrong wsdl operation name", "{http://apache.org/hello_world_soap_http}greetMe",
responseContext.get("javax.xml.ws.wsdl.operation").toString());16.17. 附加支持
POJO 模式: 支持 Attachment 和 MTOM 的 SOAP 和 MTOM (请参阅启用 MTOM 的 Payload 模式示例)。但是,带有 Attachment 的 SOAP 不会被测试。由于附件被分解并解压缩到 POJO 中,用户通常不需要自己处理附件。如果没有启用 MTOM,则会传播到 Camel 消息附件。因此,可以通过 Camel Message API 检索附加
DataHandler Message.getAttachment(String id)
有效负载模式: 组件支持 MTOM。上述 Camel Message API 可以检索附件。支持带有 Attachment (SwA)的 SOAP,并可检索附件。SwA 是默认值(当将 CXF 端点属性"mtom-enabled"设置为 false 时相同)。
要启用 MTOM,请将 CXF 端点属性 "mtom-enabled" 设置为 true。
@Bean
public CxfEndpoint routerEndpoint() {
CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
cxfEndpoint.setAddress("/" + getClass().getSimpleName()+ "/jaxws-mtom/hello");
cxfEndpoint.setWsdlURL("mtom.wsdl");
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("dataFormat", "PAYLOAD");
properties.put("mtom-enabled", true);
cxfEndpoint.setProperties(properties);
return cxfEndpoint;
}您可以使用附加生成 Camel 消息,以发送到 Payload 模式的 CXF 端点。
Exchange exchange = context.createProducerTemplate().send("direct:testEndpoint", new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.setPattern(ExchangePattern.InOut);
List<Source> elements = new ArrayList<Source>();
elements.add(new DOMSource(DOMUtils.readXml(new StringReader(MtomTestHelper.REQ_MESSAGE)).getDocumentElement()));
CxfPayload<SoapHeader> body = new CxfPayload<SoapHeader>(new ArrayList<SoapHeader>(),
elements, null);
exchange.getIn().setBody(body);
exchange.getIn().addAttachment(MtomTestHelper.REQ_PHOTO_CID,
new DataHandler(new ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, "application/octet-stream")));
exchange.getIn().addAttachment(MtomTestHelper.REQ_IMAGE_CID,
new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
}
});
// process response
CxfPayload<SoapHeader> out = exchange.getOut().getBody(CxfPayload.class);
Assert.assertEquals(1, out.getBody().size());
Map<String, String> ns = new HashMap<String, String>();
ns.put("ns", MtomTestHelper.SERVICE_TYPES_NS);
ns.put("xop", MtomTestHelper.XOP_NS);
XPathUtils xu = new XPathUtils(ns);
Element oute = new XmlConverter().toDOMElement(out.getBody().get(0));
Element ele = (Element)xu.getValue("//ns:DetailResponse/ns:photo/xop:Include", oute,
XPathConstants.NODE);
String photoId = ele.getAttribute("href").substring(4); // skip "cid:"
ele = (Element)xu.getValue("//ns:DetailResponse/ns:image/xop:Include", oute,
XPathConstants.NODE);
String imageId = ele.getAttribute("href").substring(4); // skip "cid:"
DataHandler dr = exchange.getOut().getAttachment(photoId);
Assert.assertEquals("application/octet-stream", dr.getContentType());
MtomTestHelper.assertEquals(MtomTestHelper.RESP_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
dr = exchange.getOut().getAttachment(imageId);
Assert.assertEquals("image/jpeg", dr.getContentType());
BufferedImage image = ImageIO.read(dr.getInputStream());
Assert.assertEquals(560, image.getWidth());
Assert.assertEquals(300, image.getHeight());您还可以在 Payload 模式中使用从 CXF 端点接收的 Camel 消息。CxfMtomConsumerPayloadModeTest 演示了它的工作方式:
public static class MyProcessor implements Processor {
@SuppressWarnings("unchecked")
public void process(Exchange exchange) throws Exception {
CxfPayload<SoapHeader> in = exchange.getIn().getBody(CxfPayload.class);
// verify request
Assert.assertEquals(1, in.getBody().size());
Map<String, String> ns = new HashMap<String, String>();
ns.put("ns", MtomTestHelper.SERVICE_TYPES_NS);
ns.put("xop", MtomTestHelper.XOP_NS);
XPathUtils xu = new XPathUtils(ns);
Element body = new XmlConverter().toDOMElement(in.getBody().get(0));
Element ele = (Element)xu.getValue("//ns:Detail/ns:photo/xop:Include", body,
XPathConstants.NODE);
String photoId = ele.getAttribute("href").substring(4); // skip "cid:"
Assert.assertEquals(MtomTestHelper.REQ_PHOTO_CID, photoId);
ele = (Element)xu.getValue("//ns:Detail/ns:image/xop:Include", body,
XPathConstants.NODE);
String imageId = ele.getAttribute("href").substring(4); // skip "cid:"
Assert.assertEquals(MtomTestHelper.REQ_IMAGE_CID, imageId);
DataHandler dr = exchange.getIn().getAttachment(photoId);
Assert.assertEquals("application/octet-stream", dr.getContentType());
MtomTestHelper.assertEquals(MtomTestHelper.REQ_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
dr = exchange.getIn().getAttachment(imageId);
Assert.assertEquals("image/jpeg", dr.getContentType());
MtomTestHelper.assertEquals(MtomTestHelper.requestJpeg, IOUtils.readBytesFromStream(dr.getInputStream()));
// create response
List<Source> elements = new ArrayList<Source>();
elements.add(new DOMSource(DOMUtils.readXml(new StringReader(MtomTestHelper.RESP_MESSAGE)).getDocumentElement()));
CxfPayload<SoapHeader> sbody = new CxfPayload<SoapHeader>(new ArrayList<SoapHeader>(),
elements, null);
exchange.getOut().setBody(sbody);
exchange.getOut().addAttachment(MtomTestHelper.RESP_PHOTO_CID,
new DataHandler(new ByteArrayDataSource(MtomTestHelper.RESP_PHOTO_DATA, "application/octet-stream")));
exchange.getOut().addAttachment(MtomTestHelper.RESP_IMAGE_CID,
new DataHandler(new ByteArrayDataSource(MtomTestHelper.responseJpeg, "image/jpeg")));
}
}Raw Mode: 不支持附件,因为它根本不处理消息。
CXF_RAW 模式 :支持 MTOM,上面提到的 Camel 消息 API 可以检索附件。请注意,当收到多部分(例如 MTOM)消息时,默认 SOAPMessage to String converter 将提供正文上的完整的多部分有效负载。如果您只需要 SOAP XML 作为字符串,您可以使用 message.getSOAPPart ()设置消息正文,Camel convert 可以为您进行其余的工作。
16.18. PAYLOAD 模式中的流支持
现在,在使用 PAYLOAD 模式时,camel-cxf 组件支持流传输传入的信息。在以前的版本中,传入的信息将完全解析 DOM。对于大型消息,这是消耗时间并使用大量内存。在进行路由时,传入消息可以保留为 javax.xml.transform.Source,如果没有修改载荷,则可以直接流传输到目标目的地。对于常见的"简单代理"用例(例如: from ("cxf:…").to ("cxf:…")),这可提供显著的性能增加,并显著降低的内存要求。
然而,在有些情况下,流可能并不合适或需要。由于流化性质,在稍后处理链中之前,无效的传入 XML 可能无法捕获。另外,某些操作可能需要消息为 DOM 解析任何方式(如 WS-Security 或消息追踪),在这种情况下,流的优点有限。此时,可以通过两种方式控制流:
- endpoint 属性:您可以添加 "allowStreaming=false" 作为端点属性,来打开流 on/off。
- 组件属性:CxfComponent 对象也有一个 allowStreaming 属性,可以为从该组件创建的端点设置默认值。
全局系统属性:您可以将 "org.apache.camel.component.cxf.streaming" 的系统属性添加到 "false" 以将其关闭。这会设置全局默认值,但设置上面的 endpoint 属性将覆盖该端点的这个值。
16.19. 使用通用 CXF Dispatch 模式
camel-cxf 组件支持通用 CXF 分配模式,它可以传输任意结构的消息(即,不绑定到特定的 XML 模式)。要使用此模式,只需省略 CXF 端点的 wsdlURL 和 serviceClass 属性。
<cxf:cxfEndpoint id="testEndpoint" address="http://localhost:9000/SoapContext/SoapAnyPort">
<cxf:properties>
<entry key="dataFormat" value="PAYLOAD"/>
</cxf:properties>
</cxf:cxfEndpoint>请注意,默认的 CXF 分配客户端不会发送特定的 SOAPAction 标头。因此,当目标服务需要特定的 SOAPAction 值时,它将使用键 SOAPAction (不区分大小写)在 Camel 标头中提供。
16.20. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 cxf 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-cxf-soap-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 13 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.cxf.allow-streaming | 这个选项控制在 PAYLOAD 模式下运行 CXF 组件时,将 DOM 解析传入的消息到 DOM Elements,或者将有效负载保留为 javax.xml.transform.Source 对象,该对象在某些情况下允许流。 | 布尔值 | |
| camel.component.cxf.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.cxf.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.cxf.enabled | 是否启用 cxf 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.cxf.header-filter-strategy | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
| camel.component.cxf.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.cxf.use-global-ssl-context-parameters | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| camel.component.cxfrs.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.cxfrs.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.cxfrs.enabled | 是否启用 cxfrs 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.cxfrs.header-filter-strategy | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
| camel.component.cxfrs.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.cxfrs.use-global-ssl-context-parameters | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
第 17 章 数据格式
仅支持制作者
Dataformat 组件允许使用数据格式 作为 Camel 组件。
17.1. URI 格式
dataformat:name:(marshal|unmarshal)[?options]
其中 name 是数据格式的名称。然后,在操作后面是 marshal 或 。选项用于配置 正在使用的数据格式。请参阅数据格式文档,了解它支持的选项。
unmarshal
17.2. DataFormat Options
17.2.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
17.2.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
17.2.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
17.3. 组件选项
数据格式组件支持 2 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
17.4. 端点选项
Data Format 端点使用 URI 语法进行配置:
dataformat:name:operation
使用以下路径和查询参数:
17.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| Name (producer) | 所需 数据格式的名称。 | 字符串 | |
| 操作 (生成) | 需要的操作 使用 marshal 或 unmarshal。 Enum 值:
| 字符串 |
17.4.2. 查询参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
17.5. Samples
例如,要使用 JAXB 数据格式,可以按照如下所示进行:
from("activemq:My.Queue").
to("dataformat:jaxb:unmarshal?contextPath=com.acme.model").
to("mqseries:Another.Queue");在 XML DSL 中,您的作用:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="activemq:My.Queue"/>
<to uri="dataformat:jaxb:unmarshal?contextPath=com.acme.model"/>
<to uri="mqseries:Another.Queue"/>
</route>
</camelContext>17.6. Spring Boot Auto-Configuration
当将 dataformat 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-dataformat-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.dataformat.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.dataformat.enabled | 是否启用 dataformat 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.dataformat.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 18 章 dataset
支持制作者和使用者
测试分布式和异步处理非常困难。Mock、Test 和 DataSet 端点与 Camel 测试框架配合使用,以简化您的单元和集成测试,结合使用 企业集成模式 和 Camel 的大型组件与强大的 Bean 集成。
DataSet 组件提供了一种容易执行系统的负载和 soak 测试的机制。它的工作原理是,允许您创建 DataSet 实例作为 消息源,并作为接收数据集的方法。
Camel 在发送数据集 时使用吞吐量日志记录器。
18.1. URI 格式
dataset:name[?options]
其中 name 用于在 Registry 中查找 DataSet 实例
Camel 附带一个 org.apache.camel.component.dataset.DataSet ( org.apache.camel.component.dataset.DataSetSupport 类)的支持实施,可用作实施您自己的 DataSet 的基础。Camel 还提供一些可用于测试的实现: org.apache.camel.component.dataset.SimpleDataSet、org.apache.camel.component.dataset.ListDataSet 和 org.apache.camel.component.dataset.FileDataSet,所有这些扩展 DataSetSupport。
18.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
18.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
18.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
18.3. 组件选项
Dataset 组件支持 5 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 日志 (生成器) | 当模拟收到传入消息时打开日志记录。这将仅在 INFO 级别记录传入消息的时间。如需更详细的日志记录,请将 org.apache.camel.component.mock.MockEndpoint 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| ExchangeFormatter (高级) | Autowired set a custom ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认使用 DefaultExchangeFormatter。 | ExchangeFormatter |
18.4. 端点选项
Dataset 端点使用 URI 语法进行配置:
dataset:name
使用以下路径和查询参数:
18.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 名称 (common) | 在 registry 中查找 所需的 DataSet 名称。 | DataSet |
18.4.2. 查询参数(21 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| dataSetIndex (common) | 控制 CamelDataSetIndex 标头的行为。对于 Consumers: - off = 标题将不会被设置 - strict/lenient = header will be set For Producers: - off = off = the header 值不会被验证,如果没有 present,则不会设置。 Enum 值:
| lenient | 字符串 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| initialDelay (消费者) | 在开始发送消息前等待 millis 中的时间段。 | 1000 | long |
| minRate (consumer) | 等待 DataSet 至少包含这个数量的消息。 | 0 | int |
| preloadSize (consumer) | 设置路由完成初始化前应预加载(sent)的消息数量。 | 0 | long |
| produceDelay (使用者) | 允许指定延迟,这会导致在消费者发送消息时造成延迟(模拟缓慢处理)。 | 3 | long |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| assertPeriod (producer) | 设置一个宽限期,之后模拟端点将重新排序,以确保初始断言仍有效。例如,这用于对正好有多个消息到达的模拟。例如,如果 expectedMessageCount (int)被设置为 5,则在 5 个或更多消息到达时满足断言。为确保完全有 5 个消息到达,您需要等待一些 period 以确保进一步的消息到达。这就是您可以使用此方法。默认情况下禁用此周期。 | long | |
| UseDelay (producer) | 允许指定延迟,这会导致在制作者消耗消息时造成延迟(模拟缓慢处理)。 | 0 | long |
| expectedCount (producer) | 指定此端点应接收的预期消息交换数量。注意:如果您希望有 0 个消息,请额外小心,因为测试启动时为 0 匹配,因此您需要设置一个断言期限时间,以便让测试运行一段时间,以确保仍没有消息到达;对于该使用 setAssertPeriod (长)。另一种方法是使用 NotifyBuilder,并在您调用模拟上的 assertIsSatisfied ()方法前,了解 Camel 何时进行路由。这可让您不要使用固定断言周期来加快测试时间。如果您希望使第 n 个消息到达这个模拟端点,请参阅 setAssertPeriod (long)方法以了解更多详情。 | -1 | int |
| FAILfast (producer) | 设置 assertIsSatisfied ()应该在第一次检测到的失败时快速失败,否则可能会等待所有预期消息到达,然后执行预期验证。默认为 true。设置为 false 以使用 Camel 2.x 中的行为。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 日志 (生成器) | 当模拟收到传入消息时打开日志记录。这将仅在 INFO 级别记录传入消息的时间。如需更详细的日志记录,请将 org.apache.camel.component.mock.MockEndpoint 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
| reportGroup (producer) | 一个数字,用于根据大小的组打开吞吐量日志记录。 | int | |
| resultMinimumWaitTime (producer) | 设置 assertIsSatisfied ()的最小预期时间(在 millis 中)将等待到满足为止。 | long | |
| resultWaitTime (producer) | 设置 assertIsSatisfied ()的最长时间(在 millis 中)将等待到满足为止。 | long | |
| 保留First (producer) | 指定只保留前 n 个接收交换数。这在测试大数据时使用,通过不存储此模拟端点接收的每个 Exchange 的副本来减少内存消耗。重要:使用此限制时,getReceivedCounter ()仍会返回收到的实际收到的交换数。例如,如果我们收到 5000 Exchanges,并且已配置为只保留前 10 个交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()和 getReceivedExchanges ()方法中只有前 10 Exchanges。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到的第一个正文数量上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个收到的第一个和最后一个方法。 | -1 | int |
| retainLast (producer) | 指定只保留最后 n 个接收交换数。这在测试大数据时使用,通过不存储此模拟端点接收的每个 Exchange 的副本来减少内存消耗。重要:使用此限制时,getReceivedCounter ()仍会返回收到的实际收到的交换数。例如,如果我们收到 5000 Exchanges,并且已配置为仅保留最后 20 交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()和 getReceivedExchanges ()方法中只有最后 20 Exchanges。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到的第一个正文数量上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个收到的第一个和最后一个方法。 | -1 | int |
| sleepForEmptyTest (producer) | 当 expectedMessageCount (int)被调用为零时,允许一个 sleep 指定等待检查此端点是否为空。 | long | |
| copyOnExchange (producer (advanced)) | 设置在此模拟端点接收时是否生成传入 Exchange 的深度副本。默认为 true。 | true | 布尔值 |
18.5. Configuring DataSet
Camel 将在注册表中查找实施 DataSet 接口的 Bean。您可以将自己的 DataSet 注册为:
<bean id="myDataSet" class="com.mycompany.MyDataSet"> <property name="size" value="100"/> </bean>
18.6. 示例
例如,要测试一组信息是否发送到队列,然后从队列使用,而不会丢失任何消息:
// send the dataset to a queue
from("dataset:foo").to("activemq:SomeQueue");
// now lets test that the messages are consumed correctly
from("activemq:SomeQueue").to("dataset:foo");以上将查看 Registry 以查找用于创建消息的 foo DataSet 实例。
然后,您可以创建一个 DataSet 实现,比如使用 SimpleDataSet,如下所述,配置数据集的大小以及消息类似的内容。
18.7. DataSetSupport (abstract class)
DataSetSupport abstract 类是新 DataSets 的 nice 起点,为派生类提供了一些有用的功能。
18.7.1. DataSetSupport 的属性
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
|
|
|
|
指定默认邮件正文。对于 SimpleDataSet,它是一个恒定的有效负载;但是,如果要为每个消息创建自定义有效负载,请自行创建 |
|
|
| null | |
|
|
|
| 指定要发送/恢复的消息数量。 |
|
|
|
|
指定报告进度前要接收的消息数量。可用于显示大型负载测试的进度。如果 < 0,则 |
18.8. SimpleDataSet
SimpleDataSet 扩展 DataSetSupport,并添加默认正文。
18.8.1. SimpleDataSet 中的其他属性
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
|
|
|
|
指定默认邮件正文。默认情况下, |
18.9. ListDataSet
List'DataSet' extends DataSetSupport,并添加默认正文列表。
18.9.1. ListDataSet 的额外属性
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
|
|
|
|
指定默认邮件正文。默认情况下, |
|
|
| defaultBodies 列表的大小 |
指定要发送/恢复的消息数量。这个值可以与 |
18.10. FileDataSet
FileDataSet 扩展 ListDataSet,并添加了对从文件中加载正文的支持。
18.10.1. FileDataSet 的额外属性
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
|
|
| null | 指定有效负载的源文件 |
|
|
| \z |
指定 |
18.11. Spring Boot Auto-Configuration
在 Spring Boot 中使用 dataset 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-dataset-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 11 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.dataset-test.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.dataset-test.enabled | 是否启用 dataset-test 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.dataset-test.exchange-formatter | 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认使用 DefaultExchangeFormatter。选项是 org.apache.camel.spi.ExchangeFormatter 类型。 | ExchangeFormatter | |
| camel.component.dataset-test.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.dataset-test.log | 当模拟收到传入消息时打开日志记录。这将仅在 INFO 级别记录传入消息的时间。如需更详细的日志记录,请将 org.apache.camel.component.mock.MockEndpoint 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
| camel.component.dataset.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.dataset.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.dataset.enabled | 是否启用 dataset 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.dataset.exchange-formatter | 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认使用 DefaultExchangeFormatter。选项是 org.apache.camel.spi.ExchangeFormatter 类型。 | ExchangeFormatter | |
| camel.component.dataset.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.dataset.log | 当模拟收到传入消息时打开日志记录。这将仅在 INFO 级别记录传入消息的时间。如需更详细的日志记录,请将 org.apache.camel.component.mock.MockEndpoint 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
第 19 章 direct
支持制作者和使用者
当生产者发送消息交换时,Direct 组件为任何消费者提供直接的同步调用。
此端点可用于连接 同一 camel 上下文中的现有路由。
异步
SEDA 组件在生产者发送消息交换时提供任何用户的异步调用。
19.1. URI 格式
direct:someName[?options]
其中 someName 可以是任意字符串来唯一标识端点
19.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
19.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
19.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
19.3. 组件选项
Direct 组件支持 5 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| Block (producer) | 如果向没有活动消费者的直接端点发送消息,那么我们可以告诉制作者阻止并等待使用者变为活动状态。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 超时 (生成者) | 如果启用了块,要使用的超时值。 | 30000 | long |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
19.4. 端点选项
Direct 端点是使用 URI 语法配置的:
direct:name
使用以下路径和查询参数:
19.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 名称 (common) | 直接端点的 所需 名称。 | 字符串 |
19.4.2. 查询参数(8 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| Block (producer) | 如果向没有活动消费者的直接端点发送消息,那么我们可以告诉制作者阻止并等待使用者变为活动状态。 | true | 布尔值 |
| failIfNoConsumers (producer) | 当发送到没有活跃消费者的 DIRECT 端点时,生产者是否应通过抛出异常失败。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 超时 (生成者) | 如果启用了块,要使用的超时值。 | 30000 | long |
| 同步 (高级) | 是否强制同步处理。如果启用,则制作者线程将强制等待消息完成,然后让同一线程继续处理。如果禁用(默认),则制作者线程可以释放,并可进行其他工作,而消息则继续由其他线程(reactive)处理。 | false | 布尔值 |
19.5. Samples
在以下路由中,我们使用直接组件将两个路由链接在一起:
from("activemq:queue:order.in")
.to("bean:orderServer?method=validate")
.to("direct:processOrder");
from("direct:processOrder")
.to("bean:orderService?method=process")
.to("activemq:queue:order.out");使用 spring DSL 示例:
<route> <from uri="activemq:queue:order.in"/> <to uri="bean:orderService?method=validate"/> <to uri="direct:processOrder"/> </route> <route> <from uri="direct:processOrder"/> <to uri="bean:orderService?method=process"/> <to uri="activemq:queue:order.out"/> </route>
另请参阅 SEDA 组件中的示例,它们如何一起使用。
19.6. Spring Boot Auto-Configuration
当与 Spring Boot 一起使用直接时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-direct-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 6 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.direct.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.direct.block | 如果向没有活动消费者的直接端点发送消息,那么我们可以告诉制作者阻止并等待使用者变为活动状态。 | true | 布尔值 |
| camel.component.direct.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.direct.enabled | 是否启用直接组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.direct.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.direct.timeout | 如果启用了块,要使用的超时值。 | 30000 | Long |
第 20 章 FHIR
支持制作者和使用者
FHIR 组件与 HAPI-FHIR 库集成,该库是 Java 中的 FHIR (Fast Healthcare Interoperability Resources)规范的开源实施。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-fhir</artifactId>
<version>${camel-version}</version>
</dependency>20.1. URI 格式
FHIR 组件使用以下 URI 格式:
fhir://endpoint-prefix/endpoint?[options]
端点前缀可以是以下之一:
- 功能
- create
- delete
- history
- 负载均衡
- meta
- operation
- patch
- 读取
- search
- 事务
- update
- validate
20.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
20.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
20.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
20.3. 组件选项
FHIR 组件支持 27 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 编码 (common) | 用于所有请求的编码。 Enum 值:
| 字符串 | |
| fhirVersion (common) | 要使用的 FHIR 版本。 Enum 值:
| R4 | 字符串 |
| log (common) | 将记录每个请求和响应。 | false | 布尔值 |
| prettyPrint (common) | pretty 打印所有请求。 | false | 布尔值 |
| serverurl (common) | FHIR 服务器基础 URL。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 客户端 (高级) | 使用自定义客户端。 | IGenericClient | |
| clientFactory (高级) | 使用自定义客户端工厂。 | IRestfulClientFactory | |
| 压缩 (高级) | 将传出(POST/PUT)内容压缩为 GZIP 格式。 | false | 布尔值 |
| 配置 (高级) | 使用共享配置。 | FhirConfiguration | |
| connectionTimeout (高级) | 尝试并建立初始 TCP 连接(在 ms 中)的时间。 | 10000 | 整数 |
| deferModelScanning (高级) | 设置此选项时,在实际访问给定类型的子列表之前,模型类将不会扫描。 | false | 布尔值 |
| fhirContext (高级) | FhirContext 是要创建的昂贵对象。为避免创建多个实例,可以直接设置。 | FhirContext | |
| forceConformanceCheck (advanced) | 强制检查。 | false | 布尔值 |
| sessionCookie (高级) | 要添加到每个请求的 HTTP 会话 Cookie。 | 字符串 | |
| socketTimeout (高级) | 阻止单个读/写操作的时间(以 ms 为单位)。 | 10000 | 整数 |
| Summary (高级) | 请求服务器使用 _summary 参数修改响应。 Enum 值:
| 字符串 | |
| validationMode (高级) | 当 Camel 验证 FHIR 服务器的一致声明时。 Enum 值:
| ONCE | 字符串 |
| proxyHost (proxy) | 代理主机。 | 字符串 | |
| proxyPassword (proxy) | 代理密码。 | 字符串 | |
| proxyPort (proxy) | 代理端口。 | 整数 | |
| proxyUser (proxy) | 代理用户名。 | 字符串 | |
| accessToken (security) | OAuth 访问令牌。 | 字符串 | |
| 密码 (安全) | 用于基本身份验证的用户名。 | 字符串 | |
| 用户名 (安全) | 用于基本身份验证的用户名。 | 字符串 |
20.4. 端点选项
FHIR 端点使用 URI 语法进行配置:
fhir:apiName/methodName
使用以下路径和查询参数:
20.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| apiName (common) | 需要 执行什么操作。 Enum 值:
| FhirApiName | |
| methodName (common) | 所选操作需要哪些子操作。 | 字符串 |
20.4.2. 查询参数(44 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 编码 (common) | 用于所有请求的编码。 Enum 值:
| 字符串 | |
| fhirVersion (common) | 要使用的 FHIR 版本。 Enum 值:
| R4 | 字符串 |
| inBody (common) | 设置要在交换中传递的参数名称。 | 字符串 | |
| log (common) | 将记录每个请求和响应。 | false | 布尔值 |
| prettyPrint (common) | pretty 打印所有请求。 | false | 布尔值 |
| serverurl (common) | FHIR 服务器基础 URL。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 客户端 (高级) | 使用自定义客户端。 | IGenericClient | |
| clientFactory (高级) | 使用自定义客户端工厂。 | IRestfulClientFactory | |
| 压缩 (高级) | 将传出(POST/PUT)内容压缩为 GZIP 格式。 | false | 布尔值 |
| connectionTimeout (高级) | 尝试并建立初始 TCP 连接(在 ms 中)的时间。 | 10000 | 整数 |
| deferModelScanning (高级) | 设置此选项时,在实际访问给定类型的子列表之前,模型类将不会扫描。 | false | 布尔值 |
| fhirContext (高级) | FhirContext 是要创建的昂贵对象。为避免创建多个实例,可以直接设置。 | FhirContext | |
| forceConformanceCheck (advanced) | 强制检查。 | false | 布尔值 |
| sessionCookie (高级) | 要添加到每个请求的 HTTP 会话 Cookie。 | 字符串 | |
| socketTimeout (高级) | 阻止单个读/写操作的时间(以 ms 为单位)。 | 10000 | 整数 |
| Summary (高级) | 请求服务器使用 _summary 参数修改响应。 Enum 值:
| 字符串 | |
| validationMode (高级) | 当 Camel 验证 FHIR 服务器的一致声明时。 Enum 值:
| ONCE | 字符串 |
| proxyHost (proxy) | 代理主机。 | 字符串 | |
| proxyPassword (proxy) | 代理密码。 | 字符串 | |
| proxyPort (proxy) | 代理端口。 | 整数 | |
| proxyUser (proxy) | 代理用户名。 | 字符串 | |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| accessToken (security) | OAuth 访问令牌。 | 字符串 | |
| 密码 (安全) | 用于基本身份验证的用户名。 | 字符串 | |
| 用户名 (安全) | 用于基本身份验证的用户名。 | 字符串 |
20.5. API 参数(13 API)
@FHIR 端点是基于 API 的组件,具有额外的参数,基于哪些 API 名称和 API 方法。API 名称和 API 方法位于端点 URI 中,作为 apiName/methodName 路径参数:
fhir:apiName/methodName
下表列出了 13 个 API 名称:
| API 名称 | 类型 | 描述 |
|---|---|---|
| both | API 到 Fetch 的服务器的 capabilities 语句 | |
| both | 创建操作的 API,这会在服务器上创建新资源实例 | |
| both | delete 操作的 API,它会在服务器资源上执行逻辑删除 | |
| both | history 方法的 API | |
| both | 使用 atom 捆绑包中链接 type=next 标签中指定的链接 type=next 标签中指定的链接,从页面集中加载前/下一步资源捆绑包的 API | |
| both | meta 操作的 API,可用于获取、添加和删除资源或服务器中的标签和其他 Meta 元素 | |
| both | 用于扩展 FHIR 操作的 API | |
| both | patch 操作的 API,它对服务器资源执行逻辑补丁 | |
| both | 读取操作的 API 方法 | |
| both | API 用于搜索与给定一组条件匹配的资源 | |
| both | 用于将事务(资源集合)发送到要作为一个单元执行的服务器的 API | |
| both | 更新操作的 API,它会在服务器资源上执行逻辑删除 | |
| both | 用于验证资源的 API |
每个 API 记录在以下部分。
20.5.1. API: 功能
支持制作者和使用者
capabilities API 在语法中定义,如下所示:
fhir:capabilities/methodName?[parameters]
此方法在下表中列出,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 使用给定的模型类型检索合规语句 |
20.5.1.1. Type 方法
签名:
- org.hl7.fhir.instance.model.api.IBaseConformance ofType (Class<org.hl7.fhir.instance.model.api.IBaseConformance> 类型, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/ofType API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| type | 模型类型 | 类 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.2. api: create
支持制作者和使用者
创建 API 在语法中定义,如下所示:
fhir:create/methodName?[parameters]
1 方法在下表中列出,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 在服务器上创建一个 IBaseResource |
20.5.2.1. 方法资源
签名:
- ca.uhn.fhir.rest.api.MethodOutcome 资源(String resourceAsString, String url, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- ca.uhn.fhir.rest.api.MethodOutcome 资源(org.hl7.fhir.instance.model.api.IBaseResource resource, String url, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, ObjectParameters);
fhir/resource API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| preferReturn | 在请求中添加 Prefer 标头,请求服务器包括或禁止资源正文作为结果的一部分。如果服务器返回资源,它将通过 MethodOutcome#getResource ()解析给客户端,则可能为 null | PreferReturnEnum |
| resource | 要创建的资源 | IBaseResource |
| resourceAsString | 要创建的资源 | 字符串 |
| url | 要使用的搜索 URL。此 URL 的格式应为 ResourceTypeParameters 格式,例如: Patientname=Smith&identifier=13.2.4.11.4%7C847366 | 字符串 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.3. api: delete
支持制作者和使用者
删除 API 在语法中定义,如下所示:
fhir:delete/methodName?[parameters]
下表中列出了 3 种方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 删除给定资源 | |
| 按资源类型 e 删除资源 | |
| 指定应根据给定的搜索 URL 以条件删除形式执行删除 |
20.5.3.1. 方法资源
签名:
- org.hl7.fhir.instance.model.api.IBaseOperationOutcome 资源(org.hl7.fhir.instance.model.api.IBaseResource resource, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resource API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| resource | 要删除的 IBaseResource | IBaseResource |
20.5.3.2. method resourceById
签名:
- org.hl7.fhir.instance.model.api.IBaseOperationOutcome resourceById (String type, String stringId, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseOperationOutcome resourceById (org.hl7.fhir.instance.model.api.IIdType id, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resourceById API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| id | 使用 IIdType 引用资源 | IIdType |
| stringId | 它是 id | 字符串 |
| type | 资源类型,如 Patient | 字符串 |
20.5.3.3. method resourceConditionalByUrl
签名:
- org.hl7.fhir.instance.model.api.IBaseOperationOutcome resourceConditionalByUrl (String url, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resourceConditionalByUrl API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| url | 要使用的搜索 URL。此 URL 的格式应为 ResourceTypeParameters 格式,例如: Patientname=Smith&identifier=13.2.4.11.4%7C847366 | 字符串 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.4. API: history
支持制作者和使用者
history API 在语法中定义,如下所示:
fhir:history/methodName?[parameters]
下表中列出了 3 种方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 对服务器上特定资源(按 ID 和类型)的所有版本执行操作 | |
| 对服务器上所有类型的所有资源都执行操作 | |
| 对服务器上给定类型的所有资源的所有版本执行操作 |
20.5.4.1. 对Instance 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle onInstance (org.hl7.fhir.instance.model.api.IIdType id, Class<org.hl7.fhir.instance.model.api.IBaseBundle> returnType, Integer count, java.util.Date cutoff, org.hl7.fhir.instance.model.api.IPrimitiveType<java.util.Date> iCutoff, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onInstance API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| 数量 | 请求服务器仅返回最多Count 个资源数,可能为 NULL | 整数 |
| cutoff | 请求服务器仅返回在给定时间(含)创建的资源版本,可能为 NULL | Date |
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| iCutoff | 请求服务器仅返回在给定时间(含)创建的资源版本,可能为 NULL | IPrimitiveType |
| id | IIdType 必须使用资源类型和资源 ID 填充 | IIdType |
| returnType | 请求方法返回 Bundle 资源(如 ca.uhn.fhir.model.dstu2.resource.Bundle)。如果您要访问 DSTU2 服务器,请使用此方法。 | 类 |
20.5.4.2. Server 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle onServer (Class<org.hl7.fhir.instance.model.api.IBaseBundle> returnType, Integer count, java.util.Date cutoff, org.hl7.fhir.instance.model.api.IPrimitiveType<java.util.Date> iCutoff, iCutoff java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onServer API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| 数量 | 请求服务器仅返回最多Count 个资源数,可能为 NULL | 整数 |
| cutoff | 请求服务器仅返回在给定时间(含)创建的资源版本,可能为 NULL | Date |
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| iCutoff | 请求服务器仅返回在给定时间(含)创建的资源版本,可能为 NULL | IPrimitiveType |
| returnType | 请求方法返回 Bundle 资源(如 ca.uhn.fhir.model.dstu2.resource.Bundle)。如果您要访问 DSTU2 服务器,请使用此方法。 | 类 |
20.5.4.3. Type 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle onType (Class<org.hl7.fhir.instance.model.api.IBaseResource> resourceType, Class<org.hl7.fhir.instance.model.api.IBaseBundle> returnType, Integer count, java.util.Date cutoff, org.hl7.fhir.instance.model.api.IPrimitiveType<java.util.Date> iCutoff, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onType API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| 数量 | 请求服务器仅返回最多Count 个资源数,可能为 NULL | 整数 |
| cutoff | 请求服务器仅返回在给定时间(含)创建的资源版本,可能为 NULL | Date |
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| iCutoff | 请求服务器仅返回在给定时间(含)创建的资源版本,可能为 NULL | IPrimitiveType |
| resourceType | 要搜索的资源类型 | 类 |
| returnType | 请求方法返回 Bundle 资源(如 ca.uhn.fhir.model.dstu2.resource.Bundle)。如果您要访问 DSTU2 服务器,请使用此方法。 | 类 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.5. api: Load-page
支持制作者和使用者
负载均衡 API 在语法中定义,如下所示:
fhir:load-page/methodName?[parameters]
下表中列出了 3 种方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 使用给定 URL 和捆绑包类型加载结果页面并返回 DSTU1 Atom 捆绑包 | |
| 使用与捆绑包中的相关链接来加载下一页的结果 | |
| 使用与捆绑包中相关的链接来加载前面的结果页面 |
20.5.5.1. method byUrl
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle byUrl (String url, Class<org.hl7.fhir.instance.model.api.IBaseBundle> returnType, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters; Object> extraParameters);
fhir/byUrl API 方法有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| returnType | 返回类型 | 类 |
| url | 搜索 url | 字符串 |
20.5.5.2. 下一步方法
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle next (org.hl7.fhir.instance.model.api.IBaseBundle bundle, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/next API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| bundle | IBaseBundle | IBaseBundle |
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
20.5.5.3. 之前的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle previous (org.hl7.fhir.instance.model.api.IBaseBundle bundle, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/previous API 方法有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| bundle | IBaseBundle | IBaseBundle |
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.6. api: meta
支持制作者和使用者
meta API 在语法中定义,如下所示:
fhir:meta/methodName?[parameters]
下表中列出了 5 种方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 将给定元数据中的元素添加到已经存在的集合(不要删除任何) | |
| 从给定的 id 删除给定元数据中的元素 | |
| 从特定资源获取当前元数据 | |
| 从整个服务器获取当前元数据 | |
| 从特定类型的获取当前元数据 |
20.5.6.1. 方法添加
签名:
- org.hl7.fhir.instance.model.api.IBaseMetaType add (org.hl7.fhir.instance.model.api.IBaseMetaType meta, org.hl7.fhir.instance.model.api.IIdType id, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/add API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| id | id | IIdType |
| meta | IBaseMetaType 类 | IBaseMetaType |
20.5.6.2. 删除方法
签名:
- org.hl7.fhir.instance.model.api.IBaseMetaType delete (org.hl7.fhir.instance.model.api.IBaseMetaType meta, org.hl7.fhir.instance.model.api.IIdType id, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/delete API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| id | id | IIdType |
| meta | IBaseMetaType 类 | IBaseMetaType |
20.5.6.3. 方法 getFromResource
签名:
- org.hl7.fhir.instance.model.api.IBaseMetaType getFromResource (Class<org.hl7.fhir.instance.model.api.IBaseMetaType> metaType, org.hl7.fhir.instance.model.api.IIdType id, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters> extra;
fhir/getFromResource API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| id | id | IIdType |
| metaType | IBaseMetaType 类 | 类 |
20.5.6.4. 方法 getFromServer
签名:
- org.hl7.fhir.instance.model.api.IBaseMetaType getFromServer (Class<org.hl7.fhir.instance.model.api.IBaseMetaType> metaType, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/getFromServer API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| metaType | 给定 FHIR 模型版本的 meta 数据类型(应该为 MetaDt.class 或 MetaType.class) | 类 |
20.5.6.5. 方法 getFromType
签名:
- org.hl7.fhir.instance.model.api.IBaseMetaType getFromType (Class<org.hl7.fhir.instance.model.api.IBaseMetaType> metaType, String resourceType, java.util.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/getFromType API 方法有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| metaType | IBaseMetaType 类 | 类 |
| resourceType | 资源类型,如 Patient | 字符串 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.7. api: 操作
支持制作者和使用者
操作 API 在语法中定义,如下所示:
fhir:operation/methodName?[parameters]
下表中列出了 5 种方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 对服务器上特定资源(按 ID 和类型)的所有版本执行操作 | |
| 此操作在资源的特定版本上运行 | |
| 对服务器上所有类型的所有资源都执行操作 | |
| 对服务器上给定类型的所有资源的所有版本执行操作 | |
| 此操作称为 FHIR 规格定义的 $process-message |
20.5.7.1. 对Instance 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseResource onInstance (org.hl7.fhir.instance.model.api.IIdType id, String name, org.hl7.fhir.instance.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputType, 布尔值 useHttpGet, Class<org.hl7.fhir.instance.model.api.IBaseResource> returnType, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onInstance API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| id | 资源(版本将被剥离) | IIdType |
| name | 操作名称 | 字符串 |
| outputParameterType | 用于输出参数的 type (这应该设置为 Parameters.class 从您使用的 FHIR 结构版本中提取),可能是 NULL | 类 |
| parameters | 用作输入的参数。如果操作不需要任何输入参数,也可能为空。 | IBaseParameters |
| returnType | 如果此操作返回单个资源正文作为其返回类型,而不是 Parameters 资源,则使用此方法指定该资源类型。这对某些操作(如 Patient/NNN/$everything)(返回捆绑包而不是 Parameters 资源)非常有用,这可能是 NULL | 类 |
| useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
20.5.7.2. 对InstanceVersion 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseResource onInstanceVersion (org.hl7.fhir.instance.model.api.IIdType id, String name, org.hl7.fhir.instance.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputType, 布尔值 useHttpGet, Class<org.hl7.fhir.instance.model.api.IBaseResource> returnType, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onInstanceVersion API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| id | 资源版本 | IIdType |
| name | 操作名称 | 字符串 |
| outputParameterType | 用于输出参数的 type (这应该设置为 Parameters.class 从您使用的 FHIR 结构版本中提取),可能是 NULL | 类 |
| parameters | 用作输入的参数。如果操作不需要任何输入参数,也可能为空。 | IBaseParameters |
| returnType | 如果此操作返回单个资源正文作为其返回类型,而不是 Parameters 资源,则使用此方法指定该资源类型。这对某些操作(如 Patient/NNN/$everything)(返回捆绑包而不是 Parameters 资源)非常有用,这可能是 NULL | 类 |
| useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
20.5.7.3. Server 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseResource onServer (String name, org.hl7.fhir.instance.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputParameterType, boolean useHttpGet, Class<org.hl7.fhir.instance.model.api.api. java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onServer API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| name | 操作名称 | 字符串 |
| outputParameterType | 用于输出参数的 type (这应该设置为 Parameters.class 从您使用的 FHIR 结构版本中提取),可能是 NULL | 类 |
| parameters | 用作输入的参数。如果操作不需要任何输入参数,也可能为空。 | IBaseParameters |
| returnType | 如果此操作返回单个资源正文作为其返回类型,而不是 Parameters 资源,则使用此方法指定该资源类型。这对某些操作(如 Patient/NNN/$everything)(返回捆绑包而不是 Parameters 资源)非常有用,这可能是 NULL | 类 |
| useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
20.5.7.4. Type 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseResource onType (Class<org.hl7.fhir.instance.model.api.IBaseResource> resourceType, String name, org.hl7.fhir.instance.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputType, 布尔值 useHttpGet, Class<org.hl7.fhir.instance.model.api.IBaseResource> returnType, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onType API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| name | 操作名称 | 字符串 |
| outputParameterType | 用于输出参数的 type (这应该设置为 Parameters.class 从您使用的 FHIR 结构版本中提取),可能是 NULL | 类 |
| parameters | 用作输入的参数。如果操作不需要任何输入参数,也可能为空。 | IBaseParameters |
| resourceType | 要操作的资源类型 | 类 |
| returnType | 如果此操作返回单个资源正文作为其返回类型,而不是 Parameters 资源,则使用此方法指定该资源类型。这对某些操作(如 Patient/NNN/$everything)(返回捆绑包而不是 Parameters 资源)非常有用,这可能是 NULL | 类 |
| useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
20.5.7.5. method processMessage
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle processMessage (String respondToUri, org.hl7.fhir.instance.model.api.IBaseBundle msgBundle, boolean asynchronous, Class<org.hl7.fhir.instance.model.api.IBaseBundle> responseClass, java.util.Map<org.apache.camel.fhir.fhir.api.api.api.
fhir/processMessage API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| asynchronous | 无论是异步或同步处理消息,默认为同步。 | 布尔值 |
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| msgBundle | 将 Message Bundle 设置为 POST 到消息传递服务器 | IBaseBundle |
| respondToUri | 可选的查询参数表示来自接收服务器的响应应发送到此 URI,可能为 NULL | 字符串 |
| responseClass | 响应类 | 类 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.8. API: patch
支持制作者和使用者
patch API 在语法中定义,如下所示:
fhir:patch/methodName?[parameters]
下表中列出了 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 将补丁应用到给定资源 ID | |
| 指定更新应作为针对给定搜索 URL 创建的条件创建 |
20.5.8.1. 方法 patchById
签名:
- ca.uhn.fhir.rest.api.MethodOutcome patchById (String patchBody, String stringId, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- ca.uhn.fhir.rest.api.MethodOutcome patchById (String patchBody, org.hl7.fhir.instance.model.api.IIdType id, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters> 额外;
fhir/patchById API 方法有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| id | 要修补的资源 ID | IIdType |
| patchBody | 补丁文档的正文以符合 XML 或 JSON 进行序列化 | 字符串 |
| preferReturn | 在请求中添加 Prefer 标头,请求服务器包括或禁止资源正文作为结果的一部分。如果服务器返回资源,它将通过 MethodOutcome#getResource ()解析一个客户端可访问的资源 | PreferReturnEnum |
| stringId | 要修补的资源 ID | 字符串 |
20.5.8.2. 方法 patchByUrl
签名:
- ca.uhn.fhir.rest.api.MethodOutcome patchByUrl (String patchBody, String url, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/patchByUrl API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| patchBody | 补丁文档的正文以符合 XML 或 JSON 进行序列化 | 字符串 |
| preferReturn | 在请求中添加 Prefer 标头,请求服务器包括或禁止资源正文作为结果的一部分。如果服务器返回资源,它将通过 MethodOutcome#getResource ()解析一个客户端可访问的资源 | PreferReturnEnum |
| url | 要使用的搜索 URL。此 URL 的格式应为 ResourceTypeParameters 格式,例如: Patientname=Smith&identifier=13.2.4.11.4%7C847366 | 字符串 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.9. API: read
支持制作者和使用者
读取 API 在语法中定义,如下所示:
fhir:read/methodName?[parameters]
下表中列出了 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 按 id 读取服务器上的 IBaseResource | |
| 按 url 在服务器上读取 IBaseResource |
20.5.9.1. method resourceById
签名:
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, LongId, String ifVersionMatches, Boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, String stringId, String version, String ifVersionMatches, Boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, org.hl7.fhir.instance.model.api.IIdType id, String ifVersionMatches, BooleanNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (String resourceClass, Long longId, String ifVersionMatches, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource, Boolean throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, ObjectParameters> 额外;
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (String resourceClass, String stringId, String ifVersionMatches, String version, Boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, boolean throwError, java.util.Map<org.apache.camel.component.fhir.api.api.api, ObjectParameters;ExtraParameters;
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (String resourceClass, org.hl7.fhir.instance.model.api.IIdType id, String ifVersionMatches, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resourceById API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| id | 使用 IIdType 引用资源 | IIdType |
| ifVersionMatches | 与服务器上最新版本匹配的版本 | 字符串 |
| longId | 资源 ID | Long |
| resource | 要读取的资源(如 Patient) | 类 |
| resourceClass | 要读取的资源(如 Patient) | 字符串 |
| returnNull | 如果版本匹配,则返回 null | 布尔值 |
| returnResource | 如果版本匹配,则返回资源 | IBaseResource |
| stringId | 资源 ID | 字符串 |
| throwError | 如果版本匹配,请抛出错误 | 布尔值 |
| version | 资源版本 | 字符串 |
20.5.9.2. method resourceByUrl
签名:
- org.hl7.fhir.instance.model.api.IBaseResource resourceByUrl (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, String url, String ifVersionMatches, Boolean returnNull, org.hl7.fhir.instance.v.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseResource resourceByUrl (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, org.hl7.fhir.instance.model.api.IIdType iUrl, String ifVersionMatches, 布尔值 returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseResource resourceByUrl (String resourceClass, String url, String ifVersionMatches, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, Boolean throwError, java.util.Map<org.camel.component.fhir.api.ExtraParameters, ObjectParameters>, ObjectParameters; extra
- org.hl7.fhir.instance.model.api.IBaseResource resourceByUrl (String resourceClass, org.hl7.fhir.instance.model.api.IIdType iUrl, String ifVersionMatches, Boolean returnNull, org.hl7.fhir.instance.v.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resourceByUrl API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| iUrl | 使用绝对 url 引用资源的 IIdType | IIdType |
| ifVersionMatches | 与服务器上最新版本匹配的版本 | 字符串 |
| resource | 要读取的资源(如 Patient) | 类 |
| resourceClass | 要读取的资源(如 Patient.class) | 字符串 |
| returnNull | 如果版本匹配,则返回 null | 布尔值 |
| returnResource | 如果版本匹配,则返回资源 | IBaseResource |
| throwError | 如果版本匹配,请抛出错误 | 布尔值 |
| url | 通过绝对 url 引用资源 | 字符串 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.10. API:搜索
支持制作者和使用者
搜索 API 在语法中定义,如下所示:
fhir:search/methodName?[parameters]
1 方法在下表中列出,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 按 URL 直接执行搜索 |
20.5.10.1. 方法 searchByUrl
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle searchByUrl (String url, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/searchByUrl API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| url | 要搜索的 URL。请注意,这个 URL 可能已完成(如 ),在这种情况下,客户端的基本 URL 将被忽略。或者可以是 relative (如 Patientname=foo),在这种情况下,将使用客户端的基本 URL。 | 字符串 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.11. API: transaction
支持制作者和使用者
事务 API 在语法中定义,如下所示:
fhir:transaction/methodName?[parameters]
下表中列出了 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 使用给定的原始文本(应该为 Bundle 资源)作为事务输入 | |
| 使用资源列表作为事务输入 |
20.5.11.1. 带有Bundle 的方法
签名:
- 带有Bundle (String stringBundle, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseBundles (org.hl7.fhir.instance.model.api.IBaseBundle bundle, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/withBundle API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| bundle | 在事务中使用的捆绑包 | IBaseBundle |
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| stringBundle | 在事务中使用的捆绑包 | 字符串 |
20.5.11.2. method withResources
签名:
- java.util.List<org.hl7.fhir.instance.model.api.IBaseResource> withResources (java.util.List<org.hl7.fhir.instance.model.api.IBaseResource> resources, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/withResources API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| resources | 在事务中使用的资源 | list |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.12. API: update
支持制作者和使用者
更新 API 在语法中定义,如下所示:
fhir:update/methodName?[parameters]
下表中列出了 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 按 id 更新服务器上的 IBaseResource | |
| 通过搜索 url 更新服务器上的 IBaseResource |
20.5.12.1. 方法资源
签名:
- ca.uhn.fhir.rest.api.MethodOutcome resource (String resourceAsString, String stringId, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- ca.uhn.fhir.rest.api.MethodOutcome 资源(String resourceAsString, org.hl7.fhir.instance.model.api.IIdType id, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters> extra);
- ca.uhn.fhir.rest.api.MethodOutcome 资源(org.hl7.fhir.instance.model.api.IBaseResource resource, String stringId, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters> extra);
- ca.uhn.fhir.rest.api.MethodOutcome 资源(org.hl7.fhir.instance.model.api.IBaseResource resource, org.hl7.fhir.instance.model.api.IIdType id, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resource API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| id | 使用 IIdType 引用资源 | IIdType |
| preferReturn | 服务器是否包含或抑制资源正文作为结果的一部分 | PreferReturnEnum |
| resource | 要更新的资源(如 Patient) | IBaseResource |
| resourceAsString | 要更新的资源正文 | 字符串 |
| stringId | 引用资源的 ID | 字符串 |
20.5.12.2. method resourceBySearchUrl
签名:
- ca.uhn.fhir.rest.api.MethodOutcome resourceBySearchUrl (String resourceAsString, String url, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- ca.uhn.fhir.rest.api.MethodOutcome resourceBySearchUrl (org.hl7.fhir.instance.model.api.IBaseResource resource, String url, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.camel.component.fhir.api.ExtraParameters>, ObjectParameters>; extra
fhir/resourceBySearchUrl API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| preferReturn | 服务器是否包含或抑制资源正文作为结果的一部分 | PreferReturnEnum |
| resource | 要更新的资源(如 Patient) | IBaseResource |
| resourceAsString | 要更新的资源正文 | 字符串 |
| url | 指定更新应作为针对给定搜索 URL 创建的条件创建 | 字符串 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.5.13. api: validate
支持制作者和使用者
validate API 在语法中定义,如下所示:
fhir:validate/methodName?[parameters]
1 方法在下表中列出,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可以在语法中使用,而不是名称。)
| 方法 | 描述 |
|---|---|
| 验证资源 |
20.5.13.1. 方法资源
签名:
- ca.uhn.fhir.rest.api.MethodOutcome resource (String resourceAsString, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- ca.uhn.fhir.rest.api.MethodOutcome 资源(org.hl7.fhir.instance.model.api.IBaseResource resource, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resource API 方法具有下表中列出的参数:
| 参数 | 描述 | 类型 |
|---|---|---|
| extraParameters | 如需可以传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | map |
| resource | 用于验证的 IBaseResource | IBaseResource |
| resourceAsString | 用于验证的原始资源 | 字符串 |
除了上述参数外,fhir API 也可以使用任何 Query 参数。
任何参数都可以在端点 URI 中提供,或者在消息标头中动态提供。邮件标题名称必须是 CamelFhir.parameter 的格式。inBody 参数覆盖消息标头,即 Body=myParameterNameHere 中的端点参数将覆盖 CamelFhir.myParameterNameHere 标头。
20.6. Spring Boot Auto-Configuration
在 Spring Boot 中使用 fhir 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-fhir-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 56 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.fhir.access-token | OAuth 访问令牌。 | 字符串 | |
| camel.component.fhir.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.fhir.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.fhir.client | 使用自定义客户端。选项是 ca.uhn.fhir.rest.client.api.IGenericClient 类型。 | IGenericClient | |
| camel.component.fhir.client-factory | 使用自定义客户端工厂。选项是 ca.uhn.fhir.rest.client.api.IRestfulClientFactory 类型。 | IRestfulClientFactory | |
| camel.component.fhir.compress | 将传出(POST/PUT)内容压缩为 GZIP 格式。 | false | 布尔值 |
| camel.component.fhir.configuration | 使用共享配置。选项是 org.apache.camel.component.fhir.FhirConfiguration 类型。 | FhirConfiguration | |
| camel.component.fhir.connection-timeout | 尝试并建立初始 TCP 连接(在 ms 中)的时间。 | 10000 | 整数 |
| camel.component.fhir.defer-model-scanning | 设置此选项时,在实际访问给定类型的子列表之前,模型类将不会扫描。 | false | 布尔值 |
| camel.component.fhir.enabled | 是否启用 fhir 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.fhir.encoding | 用于所有请求的编码。 | 字符串 | |
| camel.component.fhir.fhir-context | FhirContext 是要创建的昂贵对象。为避免创建多个实例,可以直接设置。选项是一个 ca.uhn.fhir.context.FhirContext 类型。 | FhirContext | |
| camel.component.fhir.fhir-version | 要使用的 FHIR 版本。 | R4 | 字符串 |
| camel.component.fhir.force-conformance-check | 强制检查。 | false | 布尔值 |
| camel.component.fhir.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.fhir.log | 将记录每个请求和响应。 | false | 布尔值 |
| camel.component.fhir.password | 用于基本身份验证的用户名。 | 字符串 | |
| camel.component.fhir.pretty-print | pretty 打印所有请求。 | false | 布尔值 |
| camel.component.fhir.proxy-host | 代理主机。 | 字符串 | |
| camel.component.fhir.proxy-password | 代理密码。 | 字符串 | |
| camel.component.fhir.proxy-port | 代理端口。 | 整数 | |
| camel.component.fhir.proxy-user | 代理用户名。 | 字符串 | |
| camel.component.fhir.server-url | FHIR 服务器基础 URL。 | 字符串 | |
| camel.component.fhir.session-cookie | 要添加到每个请求的 HTTP 会话 Cookie。 | 字符串 | |
| camel.component.fhir.socket-timeout | 阻止单个读/写操作的时间(以 ms 为单位)。 | 10000 | 整数 |
| camel.component.fhir.summary | 请求服务器使用 _summary 参数修改响应。 | 字符串 | |
| camel.component.fhir.username | 用于基本身份验证的用户名。 | 字符串 | |
| camel.component.fhir.validation-mode | 当 Camel 验证 FHIR 服务器的一致声明时。 | ONCE | 字符串 |
| camel.dataformat.fhirjson.content-type-header | 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | true | 布尔值 |
| camel.dataformat.fhirjson.dont-encode-elements | 如果提供,则指定不应编码的元素。此字段的有效值包括: Patient.name - Don't对病人名称 Patient.name.family 进行编码 - Don't对病人的系列名称 .text 进行编码 - 禁止对任何资源(只有第一个位置可能包含通配符)进行文本元素编码: 请注意,包括 meta 的值(如 Patient.meta )适用于 DSTU2 解析器,但含有子元素的值(如 Patient.meta.lastUpdated)只能在 DSTU3 模式中工作。 | Set | |
| camel.dataformat.fhirjson.dont-strip-versions-from-references-at-paths | 如果提供的值,则指定路径中的任何资源引用都会对资源版本进行编码,而不是在编码过程中自动剥离。此设置对解析过程没有影响。这个方法提供比 setStripVersionsFromReferences (String)和此方法指定的任何路径的精细控制级别,即使 setStripVersionsFromReferences (String)已设为 true (这是默认设置)。 | list | |
| camel.dataformat.fhirjson.enabled | 是否启用 fhirJson 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.fhirjson.encode-elements | 如果提供,则指定应编码的元素,到所有其他项的排除。此字段的有效值包括:Patient - Encode patient 和其所有子人的 Patient.name - Encode 仅包括病人的名称 Patient.name.family - Encode 仅含有任何资源的家族名称 .text - 请编码任何资源(仅第一个位置可能包含通配符)上的文本元素。(必需)- 这是一个特殊情况,从而导致任何资源(需要包括通配符)进行编码。 | Set | |
| camel.dataformat.fhirjson.encode-elements-applies-to-child-resources-only | 如果设置为 true (默认为 false),则提供给 setEncodeElements (Set)的值不会应用到 root 资源(通常是一个捆绑包),但会应用到其中包含的任何子资源(例如,搜索该捆绑包中的搜索结果资源)。 | false | 布尔值 |
| camel.dataformat.fhirjson.fhir-version | 要使用的 FHIR 版本。可能的值有: DSTU2,DSTU2_HL7ORG,DSTU2_1,DSTU3,R4。 | DSTU3 | 字符串 |
| camel.dataformat.fhirjson.omit-resource-id | 如果设置为 true (默认为 false),则正在编码的任何资源的 ID 都不会包含在输出中。请注意,这不适用于包含的资源,仅适用于 root 资源。换句话说,如果设为 true,则包含的资源仍会具有本地 ID,但外部/包含 ID 将不会具有 ID。 | false | 布尔值 |
| camel.dataformat.fhirjson.override-resource-id-with-bundle-entry-full-url | 如果设置为 true (默认值),Bundle.entry.fullUrl 将覆盖 Bundle.entry.resource 资源 ID (如果定义了 fullUrl)。将源数据解析为 Bundle 对象时会发生此行为。如果这不是所需的行为(例如,客户端代码希望在 fullUrl 和资源 id 之间执行额外的验证检查),则将其设置为 false。 | false | 布尔值 |
| camel.dataformat.fhirjson.pretty-print | 设置用户良好的打印标志,这意味着解析器将使用人类可读的空间和元素之间的新行来编码资源,而不是尽可能精简输出。 | false | 布尔值 |
| camel.dataformat.fhirjson.server-base-url | 设置此解析器使用的服务器基本 URL。如果设置了值,则如果以绝对 URL 提供资源引用,则会将资源引用转换为相对引用,但具有与给定基础匹配的基础。 | 字符串 | |
| camel.dataformat.fhirjson.strip-versions-from-references | 如果设置为 true (默认值),在对资源进行编码时,包含版本的资源引用将被删除。这通常很好,因为在大多数情况下,从一个资源引用应该通过 ID 对资源的引用,而不是 ID 和版本。然而,在某些情况下,可能需要在资源链接中保留版本。在这种情况下,这个值应设为 false。此方法提供全局禁用参考编码的功能。如果需要精细控制,请使用 setDontStripVersionsFromReferencesAtPaths (List)。 | false | 布尔值 |
| camel.dataformat.fhirjson.summary-mode | 如果设置为 true (默认为 false)则仅包含由 FHIR 规格标记为作为摘要元素的元素。 | false | 布尔值 |
| camel.dataformat.fhirjson.suppress-narratives | 如果设置为 true (默认为 false),则编码的值中不会包括 narratives。 | false | 布尔值 |
| camel.dataformat.fhirxml.content-type-header | 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | true | 布尔值 |
| camel.dataformat.fhirxml.dont-encode-elements | 如果提供,则指定不应编码的元素。此字段的有效值包括: Patient.name - Don't对病人名称 Patient.name.family 进行编码 - Don't对病人的系列名称 .text 进行编码 - 禁止对任何资源(只有第一个位置可能包含通配符)进行文本元素编码: 请注意,包括 meta 的值(如 Patient.meta )适用于 DSTU2 解析器,但含有子元素的值(如 Patient.meta.lastUpdated)只能在 DSTU3 模式中工作。 | Set | |
| camel.dataformat.fhirxml.dont-strip-versions-from-references-at-paths | 如果提供的值,则指定路径中的任何资源引用都会对资源版本进行编码,而不是在编码过程中自动剥离。此设置对解析过程没有影响。这个方法提供比 setStripVersionsFromReferences (String)和此方法指定的任何路径的精细控制级别,即使 setStripVersionsFromReferences (String)已设为 true (这是默认设置)。 | list | |
| camel.dataformat.fhirxml.enabled | 是否启用 fhirXml 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.fhirxml.encode-elements | 如果提供,则指定应编码的元素,到所有其他项的排除。此字段的有效值包括:Patient - Encode patient 和其所有子人的 Patient.name - Encode 仅包括病人的名称 Patient.name.family - Encode 仅含有任何资源的家族名称 .text - 请编码任何资源(仅第一个位置可能包含通配符)上的文本元素。(必需)- 这是一个特殊情况,从而导致任何资源(需要包括通配符)进行编码。 | Set | |
| camel.dataformat.fhirxml.encode-elements-applies-to-child-resources-only | 如果设置为 true (默认为 false),则提供给 setEncodeElements (Set)的值不会应用到 root 资源(通常是一个捆绑包),但会应用到其中包含的任何子资源(例如,搜索该捆绑包中的搜索结果资源)。 | false | 布尔值 |
| camel.dataformat.fhirxml.fhir-version | 要使用的 FHIR 版本。可能的值有: DSTU2,DSTU2_HL7ORG,DSTU2_1,DSTU3,R4。 | DSTU3 | 字符串 |
| camel.dataformat.fhirxml.omit-resource-id | 如果设置为 true (默认为 false),则正在编码的任何资源的 ID 都不会包含在输出中。请注意,这不适用于包含的资源,仅适用于 root 资源。换句话说,如果设为 true,则包含的资源仍会具有本地 ID,但外部/包含 ID 将不会具有 ID。 | false | 布尔值 |
| camel.dataformat.fhirxml.override-resource-id-with-bundle-entry-full-url | 如果设置为 true (默认值),Bundle.entry.fullUrl 将覆盖 Bundle.entry.resource 资源 ID (如果定义了 fullUrl)。将源数据解析为 Bundle 对象时会发生此行为。如果这不是所需的行为(例如,客户端代码希望在 fullUrl 和资源 id 之间执行额外的验证检查),则将其设置为 false。 | false | 布尔值 |
| camel.dataformat.fhirxml.pretty-print | 设置用户良好的打印标志,这意味着解析器将使用人类可读的空间和元素之间的新行来编码资源,而不是尽可能精简输出。 | false | 布尔值 |
| camel.dataformat.fhirxml.server-base-url | 设置此解析器使用的服务器基本 URL。如果设置了值,则如果以绝对 URL 提供资源引用,则会将资源引用转换为相对引用,但具有与给定基础匹配的基础。 | 字符串 | |
| camel.dataformat.fhirxml.strip-versions-from-references | 如果设置为 true (默认值),在对资源进行编码时,包含版本的资源引用将被删除。这通常很好,因为在大多数情况下,从一个资源引用应该通过 ID 对资源的引用,而不是 ID 和版本。然而,在某些情况下,可能需要在资源链接中保留版本。在这种情况下,这个值应设为 false。此方法提供全局禁用参考编码的功能。如果需要精细控制,请使用 setDontStripVersionsFromReferencesAtPaths (List)。 | false | 布尔值 |
| camel.dataformat.fhirxml.summary-mode | 如果设置为 true (默认为 false)则仅包含由 FHIR 规格标记为作为摘要元素的元素。 | false | 布尔值 |
| camel.dataformat.fhirxml.suppress-narratives | 如果设置为 true (默认为 false),则编码的值中不会包括 narratives。 | false | 布尔值 |
第 21 章 File
支持制作者和使用者
文件组件提供对文件系统的访问,允许由任何其他 Camel 组件或来自其他组件的消息处理文件到磁盘。
21.1. URI 格式
file:directoryName[?options]
其中 directoryName 代表底层文件目录。
仅目录
Camel 仅支持使用起始目录配置的端点。因此,catalogName 必须是目录。如果只想使用单个文件,您可以使用 fileName 选项,例如通过设置 fileName=thefilename。另外,起始目录不得包含带有 ${ } 占位符的动态表达式。再次使用 fileName 选项指定文件名的动态部分。
避免读取当前由另一个应用程序写入的文件
中的 JDK 文件 IO API 是用来检测另一个应用程序当前是否写入/复制文件的一个限制。此外,该实施也可以根据操作系统平台而不同。这可能会导致 Camel 认为文件不会被另一个进程锁定,并开始消耗该文件。因此,您必须自行调查您的环境套件。为了帮助此 Camel 提供不同的 readLock 选项和 doneFileName 选项,您可以使用它们。另请参阅 部分中使用文件夹 中的文件,其中其他将直接丢弃文件。
21.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
21.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
21.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
21.3. 组件选项
文件组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
21.4. 端点选项
File 端点使用 URI 语法进行配置:
file:directoryName
使用以下路径和查询参数:
21.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| directoryName (common) | 所需的 起始目录。 | File |
21.4.2. 查询参数(94 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| charset (common) | 此选项用于指定文件的编码。您可以在消费者上使用此功能,以指定文件的编码,允许 Camel 知道计费集应在访问文件内容时加载文件内容。类似地,在编写文件时,您可以使用此选项来也指定写入该文件的 charset。请记住,在编写文件 Camel 时,必须将消息内容读取在内存中才能将数据转换为配置的字符集,因此如果您有大消息,请不要使用它。 | 字符串 | |
| doneFileName (common) | 制作者:如果提供,则 Camel 将在写入原始文件时写入第二文件。完成的文件将为空。此选项配置要使用的文件名。您可以指定一个固定名称。或者,您可以使用动态占位符。完成的 文件始终写入到与原始文件相同的文件夹中。消费者:如果提供,Camel 仅在文件存在时使用文件。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。执行的文件始终位于与原始文件相同的文件夹中。仅支持 $\\{file.name} 和 $\\{file.name.next} 作为动态占位符。 | 字符串 | |
| 文件名( common) | 使用表达式(如文件语言)来动态设置文件名。对于消费者,它被用作文件名过滤器。对于制作者,用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注:标头本身也可以是表达式)。表达式选项支持 String 和 Expression 类型。如果表达式是 String 类型,则始终使用文件语言评估。如果表达式是 Expression 类型,则使用指定的 Expression 类型 - 例如,这允许您使用 OGNL 表达式。对于消费者,您可以使用它来过滤文件名,以便实例使用文件语言语法:mydata-$\\{date:now:yyyMMdd}.txt。生产者支持 CamelOverruleFileName 标头,其优先级高于任何现有的 CamelFileName 标头;CamelOverruleFileName 是一个仅使用一次的标头,因此可以更容易地避免临时存储 CamelFileName 并在以后恢复。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| 删除 (使用者) | 如果为 true,则会在成功处理后删除该文件。 | false | 布尔值 |
| moveFailed (consumer) | 根据简单语言设置移动失败表达式。例如,要将文件移动到 .error 子目录,请使用: .error。注意:将文件移动到故障位置时,Camel 将处理错误,不会再次获取该文件。 | 字符串 | |
| noop (消费者) | 如果为 true,则文件不会以任何方式移动或删除。这个选项适用于只读数据,或 ETL 类型要求。如果 noop=true,Camel 也设置 idempotent=true,以避免再次消耗相同的文件。 | false | 布尔值 |
| preMove (consumer) | 表达式(如文件语言)用于在处理之前动态设置文件名。例如,要将 in-progress 文件移动到 order 目录中,则将此值设置为 order。 | 字符串 | |
| preSort (consumer) | 启用预排序后,消费者将在轮询期间对文件和目录名称进行排序,该名称从文件系统检索。如果您需要按排序顺序对文件执行操作,您可能需要执行此操作。预排序在消费者开始过滤前执行,并接受 Camel 处理的文件。这个选项是 default=false 代表禁用。 | false | 布尔值 |
| 递归 (使用者) | 如果一个目录,也会在所有子目录中查找文件。 | false | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| directoryMustExist (使用者(高级) | 与 startDirectoryMustExist 选项类似,但在轮询期间应用(在启动消费者后)。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| ExtendedAttributes (使用者(高级) | 定义所需的文件属性:与 posix:permissions,posix:owner,basic:lastAccessTime,它支持基本通配符,如 posix:, basic:lastAccessTime。 | 字符串 | |
| inProgressRepository (使用者(高级) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository.in-progress 存储库用于考虑当前正在使用的进度文件。默认情况下使用基于内存的存储库。 | IdempotentRepository | |
| localWorkDirectory (消费者) | 消耗时,本地工作目录可以直接将远程文件内容存储在本地文件中,以避免将内容加载到内存中。这很有用,如果您消耗一个非常大的远程文件,因此可以节省内存。 | 字符串 | |
| onCompletionExceptionHandler (consumer (advanced)) | 要使用自定义 org.apache.camel.spi.ExceptionHandler 来处理在完成过程中的文件期间发生的任何抛出异常,其中使用者执行提交或回滚。默认实施将在 WARN 级别记录任何异常并忽略。 | ExceptionHandler | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| probeContentType (使用者(高级) | 是否启用内容类型的探测。如果启用,使用者使用 Files#probeContentType (java.nio.file.Path)来确定文件的内容类型,并将其存储在消息上存储为 key Exchange#FILE_CONTENT_TYPE 的标头。 | false | 布尔值 |
| processStrategy (使用者(高级) | 可插拔 org.apache.camel.component.file.GenericFileProcessStrategy 允许您实施自己的 readLock 选项或类似选项。也可以在消耗文件之前满足特殊条件时使用,如特殊就绪的文件存在。如果设置了这个选项,则不会应用 readLock 选项。 | GenericFileProcessStrategy | |
| resumeStrategy (使用者(高级) | 为文件设置恢复策略。这样,可以在停止应用程序前定义在上点后恢复读取文件的策略。有关实现详情,请参阅 FileConsumerResumeStrategy。 | FileConsumerResumeStrategy | |
| startingDirectoryMustExist (consumer (advanced)) | 启动目录是否必须存在。请记住,autoCreate 选项是默认启用的,这意味着如果起始目录不存在,则通常会自动创建。您可以禁用 autoCreate 并启用此功能,以确保起始目录必须存在。如果目录不存在,将抛出异常。 | false | 布尔值 |
| startingDirectoryMustHaveAccess (consumer (advanced)) | 启动目录是否有访问权限。请记住,startDirectoryMustExist 参数必须设置为 true 才能验证该目录是否存在。如果目录没有读写权限,将抛出异常。 | false | 布尔值 |
| appendChars (producer) | 用于在编写文件后附加字符(文本)。例如,在编写和附加新文件或现有文件时,这可用于添加新行或其他分隔符。要指定新行(slash-n 或 slash-r)或 tab (slash-t)字符,然后使用额外的斜杠(eg slash-slash-n 转义。 | 字符串 | |
| fileExist (producer) | 如果文件已具有相同名称,则需要做什么。覆盖(默认)替换现有文件。- Append - 向现有文件添加内容。- Fail - 抛出 GenericFileOperationException,表示已存在已存在文件。- Ignore - 静默忽略问题,且不会覆盖现有文件,但假设一切都正常。- Move - 选项需要使用 moveExisting 选项进行配置。选项 eagerDeleteTargetFile 可用于控制移动文件时要执行的操作,并且存在现有文件,否则会导致移动操作失败。在编写目标文件前,Move 选项将移动任何现有文件。- TryRename 仅在使用 tempFileName 选项时才适用。这允许尝试将文件从临时名称重命名为实际名称,而无需执行任何存在检查。在某些文件系统中,这个检查可能会更快,特别是 FTP 服务器。 Enum 值:
| 覆盖 | GenericFileExist |
| Flatten (producer) | Flatlat 用于扁平化文件名路径以剥离任何前导路径,因此它只是文件名。这可让您递归地消耗到子目录中,但当您将文件写入单个目录中时。在制作者上将其设置为 true 可强制 CamelFileName 标头中的任何文件名被剥离任何领先路径。 | false | 布尔值 |
| jailStartingDirectory (producer) | 仅用于定位(限制)只向起始目录(和子)写入文件。这默认是启用的,不允许 Camel 将文件写入外部目录(开箱即用更为安全)。您可以关闭此功能,以允许将文件写入起始目录之外的目录,如父目录或根文件夹。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| moveExisting (producer) | 用于计算文件名在配置 fileExist=Move 时使用的表达式(如文件语言)。要将文件移动到备份子目录中,只需输入备份。这个选项只支持以下文件语言令牌:file:name、file:name.ext、file:name.noext、file:onlyname、file:onlyname.noext、file:ext 和 file:parent。请注意,FTP 组件不支持 file:parent,因为 FTP 组件只能将任何现有的文件移到基于当前 dir 的相对目录中。 | 字符串 | |
| tempFileName (producer) | 与 tempPrefix 选项相同,但可以对使用文件语言的临时文件名命名提供更精细的控制。tempFilename 的位置相对于选项 'fileName' 中的最终文件位置,而不是 base uri 中的目标目录。例如,如果选项 fileName 包含目录前缀:dir/finalFilename,tempFileName 相对于那个子目录 dir。 | 字符串 | |
| tempPrefix (producer) | 此选项用于使用临时名称写入文件,然后在写入完成后将它重命名为实际名称。可用于识别要写入的文件,并且避免消费者(不使用专用读取锁定)读取进度文件。在上传大型文件时,FTP 通常使用。 | 字符串 | |
| allowNullBody (producer (advanced)) | 用于指定在文件写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,如果设为 false,并且尝试发送 null 正文到文件组件,"Cannot writing null bodyException of 'Cannot write null body to file.' 将会抛出。如果 fileExist 选项设置为 'Override',则文件将被截断,如果设为 append,则文件将保持不变。 | false | 布尔值 |
| chmod (生成者(高级) | 指定由制作者发送的文件权限,chmod 值必须在 000 到 777 之间;如果一个前导数字,如 0755,则我们会忽略它。 | 字符串 | |
| chmodDirectory (生成者) | 指定制作者创建缺少的目录时使用的目录权限,chmod 值必须在 000 到 777 之间;如果出现类似 0755 的前导数字,则我们会忽略它。 | 字符串 | |
| eagerDeleteTargetFile (producer (advanced)) | 是否强制删除任何现有目标文件。这个选项只适用于使用 fileExists=Override 和 tempFileName 选项。在写入 temp 文件前,您可以使用它禁用(将其设置为 false)删除目标文件。例如,您可以编写大型文件,并希望在编写 temp 文件期间存在目标文件。这样可保证目标文件在最后一次时间之前,只要将 temp 文件重命名为目标文件名之前。这个选项还用来控制是否在启用 fileExist=Move 时删除任何现有的文件,并且存在现有文件。如果此选项 copyAndDeleteOnRenameFails false,则如果现有文件存在,则会抛出异常(如果其为 true),然后在移动操作前删除现有文件。 | true | 布尔值 |
| forceWrites (生成者(高级) | 是否强制同步对文件系统的写入。如果您不希望此级别保证,您可以关闭此项,例如,如果写入日志/审计日志等,这会产生更好的性能。 | true | 布尔值 |
| keepLastModified (producer (advanced)) | 将从源文件(如果有)中保留最后修改的时间戳。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或带有时间戳的长时间。如果时间戳存在,并且启用了 选项,它将在写入文件中设置此时间戳。注意:此选项仅适用于文件制作者。您不能将此选项用于任何 ftp 制作者。 | false | 布尔值 |
| moveExistingFileStrategy (producer (advanced)) | 策略(Custom Strategy),用于在配置了 fileExist=Move 时移动具有特殊命名令牌的文件。默认情况下,如果没有提供自定义策略,则使用实施。 | FileMoveExistingStrategy | |
| autoCreate (高级) | 在文件路径名称中自动创建缺少的目录。对于文件消费者,这意味着创建起始目录。对于文件制作者,这表示应写入文件的目录。 | true | 布尔值 |
| bufferSize (advanced) | 用于编写文件的缓冲区大小(或如果是 FTP 用于下载和上传文件)的缓冲区大小(以字节为单位)。 | 131072 | int |
| copyAndDeleteOnRenameFail (advanced) | 如果文件无法直接重命名,并且是否回退到复制和删除文件。此选项不适用于 FTP 组件。 | true | 布尔值 |
| renameUsingCopy (高级) | 使用 copy 和 delete 策略执行重命名操作。这主要用于常规重命名操作不可靠的环境(例如在不同文件系统或网络之间)。这个选项优先于 copyAndDeleteOnRenameFail 参数,该参数将自动回退到复制和删除策略,但只有在额外的延迟后才会返回。 | false | 布尔值 |
| 同步 (高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| antExclude (filter) | ant 样式过滤排除。如果同时使用 antInclude 和 antExclude,则 antExclude 优先于 antInclude。可以使用逗号分隔的格式指定多个排除项。 | 字符串 | |
| antFilterCaseSensitive (filter) | 在 ant 过滤器中设置区分大小写的标志。 | true | 布尔值 |
| antInclude (filter) | Ant 风格的过滤器包含.可以使用逗号分隔的格式指定多个包含内容。 | 字符串 | |
| eagerMaxMessagesPerPoll (filter) | 允许控制 maxMessagesPerPoll 中的限制是否 eager。如果 eager,则限制是在扫描文件的过程中。其中,false 会扫描所有文件,然后执行排序。将此选项设置为 false 可先排序所有文件,然后限制轮询。请注意,这需要较高的内存用量,因为所有文件都在内存中执行排序。 | true | 布尔值 |
| exclude (filter) | 用于排除文件,如果文件名与 regex 模式匹配(匹配时不区分大小写)。请注意,如果您使用加号等符号,如果将其配置为 endpoint uri,则需要使用 RAW ()语法进行配置。有关配置 endpoint uris 的更多详细信息。 | 字符串 | |
| excludeExt (filter) | 用于排除匹配文件扩展名文件(不区分大小写)的文件。例如,要排除 bak 文件,然后使用 excludeExt=bak。多个扩展可以用逗号分开,例如要排除 bak 和 dat 文件,请使用 excludeExt=bak,dat。请注意,文件扩展包含所有部分,例如,名为 mydata.tar.gz 的文件将扩展为 tar.gz。要获得更大的灵活性,请使用 include/exclude 选项。 | 字符串 | |
| filter (filter) | 可插拔过滤器作为 org.apache.camel.component.file.GenericFileFilter 类。将跳过文件,如果过滤器在其 accept ()方法中返回 false。 | GenericFileFilter | |
| filterDirectory (filter) | 根据简单语言过滤目录。例如,要根据当前日期进行过滤,您可以使用一个简单的日期模式,如 $\\{date:now:yyMMdd}。 | 字符串 | |
| filterFile (filter) | 根据简单语言过滤文件。例如,要过滤文件大小,您可以使用 $\\{file:size} 5000。 | 字符串 | |
| idempotent (filter) | 使用 Idempotent EIP 模式的选项,让 Camel 跳过已处理的文件。默认情况下,将使用基于内存的 LRUCache,其中包含 1000 个条目。如果 noop=true,则也会启用幂等性,以避免再次消耗相同的文件。 | false | 布尔值 |
| idempotentKey (filter) | 使用自定义幂等密钥。默认情况下,使用文件的绝对路径。您可以使用文件语言(例如,使用文件名和文件大小),您可以执行以下操作: idempotentKey=$\\{file:name}-$\\{file:size}。 | 字符串 | |
| idempotentRepository (filter) | 可插拔存储库 org.apache.camel.spi.IdempotentRepository,如果未指定且幂等为 true,则默认使用 MemoryIdempotentRepository。 | IdempotentRepository | |
| include (filter) | 用于包含文件,如果文件名与 regex 模式匹配(匹配时不区分大小写)。请注意,如果您使用加号等符号,如果将其配置为 endpoint uri,则需要使用 RAW ()语法进行配置。有关配置 endpoint uris 的更多详细信息。 | 字符串 | |
| includeExt (filter) | 用于包括匹配文件扩展名名称的文件(区分大小写)。例如,要包含 txt 文件,然后使用 includeExt=txt。多个扩展可以用逗号分开,例如要包含 txt 和 xml 文件,请使用 includeExt=txt,xml。请注意,文件扩展包含所有部分,例如,名为 mydata.tar.gz 的文件将扩展为 tar.gz。要获得更大的灵活性,请使用 include/exclude 选项。 | 字符串 | |
| maxDepth (filter) | 递归处理目录时要遍历的最大深度。 | 2147483647 | int |
| maxMessagesPerPoll (filter) | 定义每个轮询收集的最大消息。默认情况下不设置最大值。可用于设置 e.g. 1000 的限制,以避免在启动有数千个文件的服务器时避免。设置一个 0 或负值以禁用它。注意:如果此选项正在使用中,则文件和 FTP 组件将在任何排序前限制。例如,如果您有 100000 文件并使用 maxMessagesPerPoll=500,则只会获取前 500 个文件,然后排序。您可以使用 eagerMaxMessagesPerPoll 选项,并将此选项设置为 false,以允许首先扫描所有文件,然后排序。 | int | |
| minDepth (filter) | 递归处理目录时开始处理的最小深度。使用 minDepth=1 表示基础目录。使用 minDepth=2 表示第一个子目录。 | int | |
| move (filter) | 表达式(如简单语言)用于在处理后动态设置文件名。要将文件移动到 .done 子目录中,请输入 .done。 | 字符串 | |
| exclusiveReadLockStrategy (lock) | 可插拔 read-lock 作为 org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy 实施。 | GenericFileExclusiveReadLockStrategy | |
| readLock (lock) | 由消费者使用,仅当文件有独占的 read-lock (例如,该文件不进行中或被写入)时轮询文件。Camel 将等到赋予文件锁定为止。此选项提供构建策略的构建: - none - 使用 - markerFile - Camel 创建一个标志文件(fileName.camelLock),然后保存该锁定。此选项不适用于 FTP 组件 - 已更改 - 更改正在使用文件长度/修改时间戳来检测当前是否正在复制该文件。至少将使用 1 sec 来确定这一点,因此此选项无法像其他人一样使用文件,但可以更可靠,因为 JDK IO API 始终无法确定文件当前是否被其他进程使用。选项 readLockCheckInterval 可用于设置检查频率。- fileLock - 正在使用 java.nio.channels.FileLock。这个选项不适用于 Windows OS 和 FTP 组件。在通过 mount/share 访问远程文件系统时,应避免使用这种方法,除非该文件系统支持分布式文件锁定。- 重命名 - 使用重命名 - 将其重新命名文件作为测试,是否可以获得独占的 read-lock。- 幂等 - (文件组件)的幂等性是将 idempotentRepository 用作 read-lock。这允许使用读取锁定,在幂等存储库实施支持时支持集群。- idempotent-changed - (仅限文件组件)使用幂等的Repository,并作为组合的 read-lock 更改。这允许使用读取锁定,在幂等存储库实施支持时支持集群。- idempotent-rename - (仅限文件组件)幂等-rename 使用幂等的Repository,并重命名为组合的 read-lock。这允许使用读取锁定,在幂等存储库实施支持时支持集群。注意:各种读取锁不是在集群模式下工作的,不同节点上的并发用户对共享文件系统上的相同文件是竞争的。使用接近 atomic 操作的 markerFile 创建空标志文件,但不保证在集群中工作。fileLock 可能更好,但文件系统需要支持分布式文件锁定等。如果幂等存储库支持集群,如 Hazelcast 组件或 Infinispan,则使用幂等的读取锁定可以支持集群。 Enum 值:
| none | 字符串 |
| readLockCheckInterval (lock) | read-lock 的 millis 间隔(如果读锁定支持)。这个间隔用于尝试获取读取锁定的休眠。例如,在使用更改的读取锁定时,您可以将一个更高的间隔周期设置为 cater 以进行慢的写操作。默认 1 sec。如果制作者的写入速度非常慢,则可能很快。注意:对于 FTP,默认的 readLockCheckInterval 为 5000。readLockTimeout 值必须高于 readLockCheckInterval,但经验规则是至少有 2 个或多于 readLockCheckInterval 的超时。这是为了确保读取锁定进程允许时间试图在超时被命中前获取锁定。 | 1000 | long |
| readLockDeleteOrphanLockFiles (lock) | 如果 Camel 没有被正确关闭(如 JVM 崩溃),则在启动时是否应通过标志文件读取任何孤立的读取锁定文件(如 JVM 崩溃)。如果将此选项变为 false,则任何孤立锁定文件将导致 Camel 不会尝试提取该文件,这也可能是因为另一个节点同时从同一共享目录读取文件。 | true | 布尔值 |
| readLockIdempotentReleaseAsync (lock) | 延迟发行任务是否应同步或异步。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | false | 布尔值 |
| readLockIdempotentReleaseAsyncPoolSize (lock) | 使用异步发布任务时,调度线程池中的线程数量。在几乎所有用例中,使用默认值 1 核心线程应足够了,只有在更新幂等存储库缓慢或者有很多文件进行处理时,才会将其设置为更高的值。如果您使用共享线程池,配置 readLockIdempotentReleaseExecutorService 选项,则此选项不会被使用。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | int | |
| readLockIdempotentReleaseDelay (lock) | 是否在 millis 期间延迟发布任务。这可用于延迟发行版本任务,在具有共享幂等存储库的主动/主动集群场景中,延迟扩展窗口,以便确保其他节点由于竞争条件而无法扫描和获取同一文件。通过扩展发行版本任务的时间窗口有助于防止出现以下情况。请注意,只有在将 readLockRemoveOnCommit 配置为 true 时才需要延迟。 | int | |
| readLockIdempotentReleaseExecutorService (lock) | 使用自定义和共享线程池进行异步发布任务。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | ScheduledExecutorService | |
| readLockLoggingLevel (lock) | 无法获取读取锁定时使用的日志记录级别。默认情况下会记录 DEBUG。您可以更改此级别,例如 OFF 没有任何日志记录。这个选项仅适用于 readLock 类型: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename。 Enum 值:
| DEBUG | LoggingLevel |
| readLockMarkerFile (lock) | 是否使用带更改的标记文件、重命名或专用读取锁定类型。默认情况下,使用标志文件以及保护其他进程获取同一文件。通过将这个选项设置为 false 可关闭此行为。例如,如果您不想通过 Camel 应用程序将标志文件写入文件系统。 | true | 布尔值 |
| readLockMinAge (lock) | 这个选项仅适用于 readLock=changed。它允许在尝试获取读取锁定前指定文件的最短期限。例如,使用 readLockMinAge=300s 来要求文件持续 5 分钟。这可以加快更改的读取锁定,因为它只会尝试获取至少给定期限的文件。 | 0 | long |
| readLockMinLength (lock) | 这个选项仅适用于 readLock=changed。它允许您配置最小文件长度。默认情况下,Camel 期望文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度的文件。 | 1 | long |
| readLockRemoveOnCommit (lock) | 这个选项仅适用于 readLock=idempotent。它允许您指定在处理文件成功并发生提交时是否从幂等存储库中删除文件名条目。默认情况下,不会删除该文件,这样可确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可能会支持驱除策略,您可以在 X 分钟后驱除文件名条目 - 这样可确保竞争条件出现问题。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | false | 布尔值 |
| readLockRemoveOnRollback (lock) | 这个选项仅适用于 readLock=idempotent。它允许您指定在处理文件失败时是否从幂等存储库中删除文件名条目。如果此选项为 false,则确认文件名条目(就像文件执行了提交一样)。 | true | 布尔值 |
| readLockTimeout (lock) | 如果 read-lock 支持,则 millis 为 read-lock 的可选超时时间。如果无法授予 read-lock 并触发超时,则 Camel 将跳过该文件。在下一次轮询 Camel 时,将再次尝试文件,此时可能会授予 read-lock。使用 0 或更低的值来代表永久值。目前 fileLock,更改并重命名支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000 而不是 10000。readLockTimeout 值必须高于 readLockCheckInterval,但经验规则是至少有 2 个或多于 readLockCheckInterval 的超时。这是为了确保读取锁定进程允许时间试图在超时被命中前获取锁定。 | 10000 | long |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| shuffle (sort) | 影响文件列表(按随机顺序排序)。 | false | 布尔值 |
| sortBy (sort) | 使用文件语言进行内置排序.支持嵌套排序,因此您可以按照文件名排序,并根据修改的日期作为第二组排序。 | 字符串 | |
| 排序 器(sort) | 可插拔排序器作为一个 java.util.Comparator 类。 | 比较器 |
默认情况下 ,文件生成者
的默认行为将覆盖任何现有的文件(如果存在文件相同)。
21.5. 移动和删除操作
所有 move 或 delete 操作都会在(post 命令)完成后执行;因此,在处理 Exchange 时,该文件仍在 inbox 文件夹中。
我们通过以下示例进行演示:
from("file://inbox?move=.done").to("bean:handleOrder");
当 inbox 文件夹中丢弃文件时,文件使用者会通知这一点,并创建一个新的 FileExchange,它被路由到 handleOrder bean。然后,bean 处理 File 对象。此时,该文件仍位于 inbox 文件夹中。在 bean 完成后,因此路由完成,因此文件使用者将执行 move 操作,并将文件移到 .done 子文件夹。
move 和 preMove 选项被视为目录名称(即使您使用了 文件 语言等表达式,或者 简单,然后是表达式评估的结果是要使用的文件名。例如,如果设置了:
move=../backup/copy-of-${file:name}然后,使用 文件 语言,我们所使用的文件语言返回要使用的文件名,可以是相对或绝对的。如果相对,目录会从使用该文件的文件夹内作为子文件夹创建。
默认情况下,Camel 会将消耗的文件移到相对于使用文件的目录的 .camel 子文件夹。
如果要在处理后删除文件,路由应该是:
from("file://inbox?delete=true").to("bean:handleOrder");我们引入了 预 移动操作,以便在文件被处理 前 移动文件。这可让您在处理前标记哪些文件已被扫描到这个子文件夹中。
from("file://inbox?preMove=inprogress").to("bean:handleOrder");您可以组合 前 移动和常规移动:
from("file://inbox?preMove=inprogress&move=.done").to("bean:handleOrder");
因此,在处理和处理后,该文件位于 inprogress 文件夹中,而是移到 .done 文件夹。
21.6. 对 Move 和 PreMove 选项进行精细控制
move 和 preMove 选项基于 Expression,因此我们拥有 文件 语言的完整功能,以执行目录和名称模式的高级配置。
实际上,Camel 将内部将您输入的目录名称转换为 文件 语言表达式。因此,当我们输入 move=.done Camel 时,会将此转换为 :${file:parent}/.done/${file:onlyname}。只有 Camel 检测到您在选项值中未提供 $\{ } 时才执行此操作。因此,当您输入 $\{ } Camel 时,不会 转换它,因此您有完整的电源。
因此,如果我们希望将文件移到备份文件夹中,且当前日期作为模式,可以:
move=backup/${date:now:yyyyMMdd}/${file:name}21.7. 关于 moveFailed
moveFailed 选项允许您将无法成功处理的文件移到其他位置,如您选择的错误文件夹。例如,要使用 moveFailed=/error/${}.
file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.${\'\'file:ext
要查看更多示例,请访问
21.8. 消息标头
此组件支持以下标头:
21.8.1. 仅限文件制作者
| 标头 | 描述 |
|---|---|
|
|
指定要写入的文件的名称(相对于端点目录)。此名称可以是 |
|
| 写入的输出文件的实际绝对文件路径(路径 + 名称)。此标头由 Camel 设置,其用途为最终用户提供所写入文件的名称。 |
|
|
用于覆盖 |
21.8.2. 仅限文件消费者
| 标头 | 描述 |
|---|---|
|
| 在端点中配置的起始目录中以相对文件路径使用的文件名称。 |
|
| 仅文件名(没有前导路径的名称)。 |
|
|
|
|
| 文件的绝对路径。对于此路径保存相对路径的相对文件。 |
|
| 文件路径。对于相对文件,这是起始目录 + 相对文件名。对于绝对文件,这是绝对路径。 |
|
| 相对路径。 |
|
| 父路径。 |
|
|
包含文件大小 |
|
|
包含文件上次修改时间戳的 |
21.9. batch Consumer
这个组件实现了 Batch Consumer。
21.10. 仅限交换属性、文件使用者
由于文件使用者实施 BatchConsumer,它支持批量处理它轮询的文件。通过批处理,我们表示 Camel 将在 Exchange 中添加以下附加属性,因此您知道轮询的文件数量、当前索引以及批处理是否已完成。
| 属性 | 描述 |
|---|---|
|
| 在此批处理中轮询的文件总数。 |
|
| 批处理的当前索引。从 0 开始。 |
|
|
指示批处理中最后一个交换的布尔值。 |
这样,您可以让实例知道此批处理中存在多少个文件,而对于实例,会让 Aggregator2 将这一文件聚合起来。
21.11. 使用 charset
charset 选项允许在消费者和制作者端点上配置文件的编码。例如,如果您读取 utf-8 文件,并希望将文件转换为 iso-8859-1,您可以执行以下操作:
from("file:inbox?charset=utf-8")
.to("file:outbox?charset=iso-8859-1")
您也可以在路由中使用 convertBodyTo。在以下示例中,我们仍然有 utf-8 格式的输入文件,但我们希望将文件内容转换为 iso-8859-1 格式的字节阵列。然后让 bean 处理数据。在使用当前字符集将内容写入 outbox 文件夹之前。
from("file:inbox?charset=utf-8")
.convertBodyTo(byte[].class, "iso-8859-1")
.to("bean:myBean")
.to("file:outbox");
如果您省略了消费者端点上的 charset,则 Camel 不知道文件的字符集,默认情况下将使用 "UTF-8"。但是,您可以配置 JVM 系统属性来覆盖并将不同的默认编码与密钥 org.apache.camel.default.charset 搭配使用。
在以下示例中,如果文件不是 UTF-8 编码,则这是读取文件的默认编码,这可能会出现问题。
在这个示例中,在编写文件时,内容已转换为字节数组,因此直接将内容写为 (无需进一步编码)。
from("file:inbox")
.convertBodyTo(byte[].class, "iso-8859-1")
.to("bean:myBean")
.to("file:outbox");
您还可以在编写文件时覆盖和控制编码动态,方法是在交换上设置属性 Exchange.CHARSET_NAME。例如,在以下路由中,我们使用消息标头中的值设置 属性。
from("file:inbox")
.convertBodyTo(byte[].class, "iso-8859-1")
.to("bean:myBean")
.setProperty(Exchange.CHARSET_NAME, header("someCharsetHeader"))
.to("file:outbox");
我们建议使事情保持简单,因此如果您选择具有相同编码的文件,并希望在特定编码中写入文件,则最好在端点上使用 charset 选项。
请注意,如果您在端点上明确配置了 charset 选项,那么无论 Exchange.CHARSET_NAME 属性如何,都会使用该配置。
如果您有一些问题,您可以使用特定的 charset 在 org.apache.camel.component.file 上启用 DEBUG 日志记录,在文件读/写时进行 Camel 日志。
例如,以下路由将记录以下内容:
from("file:inbox?charset=utf-8")
.to("file:outbox?charset=iso-8859-1")和日志:
DEBUG GenericFileConverter - Read file /Users/davsclaus/workspace/camel/camel-core/target/charset/input/input.txt with charset utf-8 DEBUG FileOperations - Using Reader to write file: target/charset/output.txt with charset: iso-8859-1
21.12. 使用文件夹和文件名共同购买
当 Camel 生成文件时(写入文件)有一些影响如何设置您选择的文件名。默认情况下,Camel 将使用消息 ID 作为文件名,并且由于消息 ID 通常是唯一生成的 ID,因此您将以文件名开头,例如: ID-MACHINENAME-2443-1211718892437-1-0。如果不需要此类文件名,则必须在 CamelFileName 消息标头中提供一个文件名。还可以使用恒定的 Exchange.FILE_NAME。
以下示例代码使用消息 ID 作为文件名生成文件:
from("direct:report").to("file:target/reports");
要使用 report.txt 作为您必须执行的文件名:
from("direct:report").setHeader(Exchange.FILE_NAME, constant("report.txt")).to( "file:target/reports");-
与以上地址相同,但使用
CamelFileName:
from("direct:report").setHeader("CamelFileName", constant("report.txt")).to( "file:target/reports");以及用于使用 fileName URI 选项在端点上设置文件名的语法。
from("direct:report").to("file:target/reports/?fileName=report.txt");21.13. 文件名表达式
文件名可以使用 expression 选项,或者在 Camel File Name 标头中用作基于字符串的文件语言表达式。有关语法和示例,请参见 文件 语言。
21.14. 从其他人直接丢弃文件的文件夹消耗文件
如果您从其他应用程序直接写入文件的文件夹使用文件,请注意。查看不同的 readLock 选项,以查看适合您的用例。但是,最好的方法是写入另一个文件夹,并在写入移动 drop 文件夹后写入。但是,如果您直接向 drop 文件夹写入文件,则更改选项可能会更好地检测文件当前是否被写入/复制,因为它使用了文件更改的算法,以查看文件在一段时间内是否更改。另一个 readLock 选项依赖于具有期望的 Java 文件 API,在检测这一点时并不总是非常好。您可能还想查看 doneFileName 选项,该选项使用标志文件(一个文件)在文件完成并准备好使用时信号。
21.15. 使用完成的文件
另请参阅下面 写完成的文件 部分。
如果您只想在文件存在时消耗文件,您可以在端点上使用 doneFileName 选项。
from("file:bar?doneFileName=done");
如果与目标文件位于同一个目录中,将仅使用 bar 文件夹中的文件。在完成使用文件时,Camel 将自动删除该操作的文件。如果配置了 noop=true,则 Camel 不会自动删除 完成的文件。
但是,更常见的是每个 目标文件有一个文件。这意味着有 1:1 关联。要做到这一点,您必须在 doneFileName 选项中使用动态占位符。目前,Camel 支持以下两个动态令牌: file:name 和 file:name.noext,它必须包括在 $\{ } 中。使用者只支持将完整 文件名 作为前缀或后缀(不支持两者)的静态部分。
from("file:bar?doneFileName=${file:name}.done");在本示例中,如果存在带有名称文件名 .done 的完整文件,则仅轮询 文件。例如:
-
hello.txt- 是要使用的文件 -
hello.txt.done- 是关联的完成文件
您还可以为 done 文件使用前缀,例如:
from("file:bar?doneFileName=ready-${file:name}");-
hello.txt- 是要使用的文件 -
ready-hello.txt- 是关联的完成文件
21.16. 编写完成的文件
编写一个文件后,您可能希望将额外的 done文件 写为一种标记,以指示该文件已完成并已写入的其他人。为此,您可以在文件制作者端点上使用 doneFileName 选项。
.to("file:bar?doneFileName=done");
只需在与目标 文件相同的目录中 创建一个名为 的文件。
但是,更常见的是每个目标文件有一个文件。这意味着有 1:1 关联。要做到这一点,您必须在 doneFileName 选项中使用动态占位符。目前,Camel 支持以下两个动态令牌: file:name 和 file:name.noext,它必须包括在 $\{ } 中。
.to("file:bar?doneFileName=done-${file:name}");
如果目标文件与目标文件位于同一个目录中,将创建一个名为 done- 的文件。
foo.txt
.to("file:bar?doneFileName=${file:name}.done");
如果目标文件与目标文件位于同一个目录中,将创建名为 的文件。
foo.txt.done
.to("file:bar?doneFileName=${file:name.noext}.done");
如果目标文件与目标文件位于同一个目录中,将创建名为 的文件。
foo. done
21.17. Samples
21.17.1. 从目录读取并写入另一个目录
from("file://inputdir/?delete=true").to("file://outputdir")21.17.2. 从目录读取并使用 overrule 动态名称写入另一个目录
from("file://inputdir/?delete=true").to("file://outputdir?overruleFile=copy-of-${file:name}")
侦听目录并在其中为每个文件创建一个信息。将内容复制到 outputdir,再删除 inputdir 中的 文件。
21.17.3. 从目录中递归读取并写入另一个目录
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir")
侦听目录并在其中为每个文件创建一个信息。将内容复制到 outputdir,再删除 inputdir 中的 文件。将递归扫描到子目录中。会将文件放在 outputdir 中与 inputdir 相同的目录结构中,包括任何子目录。
inputdir/foo.txt inputdir/sub/bar.txt
将导致以下输出布局:
outputdir/foo.txt outputdir/sub/bar.txt
21.18. 使用 flatten
如果要将文件存储在 outputdir 目录中,忽略源目录布局(例如,扁平化路径),只需在文件制作者端添加 flatten=true 选项:
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir?flatten=true")将导致以下输出布局:
outputdir/foo.txt outputdir/bar.txt
21.19. 从目录和默认移动操作读取
Camel 默认会将任何已处理的文件移动到文件从中消耗的目录中的 .camel 子目录中。
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir")
按如下所示影响布局:
前
inputdir/foo.txt inputdir/sub/bar.txt
after
inputdir/.camel/foo.txt inputdir/sub/.camel/bar.txt outputdir/foo.txt outputdir/sub/bar.txt
21.20. 从目录读取,并处理 java 中的消息
from("file://inputdir/").process(new Processor() {
public void process(Exchange exchange) throws Exception {
Object body = exchange.getIn().getBody();
// do some business logic with the input body
}
});
正文将是指向文件的文件对象,而该文件刚刚被丢弃到 inputdir 目录中。
21.21. 写入文件
Camel 还能够编写文件,即生成文件。在以下示例中,我们收到有关 SEDA 队列的一些报告,这些报告在写入目录之前我们处理。
21.21.1. 使用 Exchange.FILE_NAME写入子目录
通过使用单个路由,可以将文件写入到任意数量的子目录。如果您有路由设置,如:
<route> <from uri="bean:myBean"/> <to uri="file:/rootDirectory"/> </route>
您可以将 myBean 将标头 Exchange.FILE_NAME 设置为值,例如:
Exchange.FILE_NAME = hello.txt => /rootDirectory/hello.txt Exchange.FILE_NAME = foo/bye.txt => /rootDirectory/foo/bye.txt
这可让您有一个路由将文件写入多个目的地。
21.21.2. 通过相对于最终目的地的临时目录写入文件
有时,您需要临时将文件写入相对于目标目录的一些目录。当一些具有有限过滤功能的外部进程从您要写入的目录中读取时,会出现这种情况。在以下示例中,以下文件将写入 /var/myapp/filesInProgress 目录,在数据传输完成后,它们将原子移到' /var/myapp/finalDirectory 'directory。
from("direct:start").
to("file:///var/myapp/finalDirectory?tempPrefix=/../filesInProgress/");21.22. 使用表达式作为文件名
在这个示例中,我们希望使用日期作为子文件夹将消耗的文件移到备份文件夹中:
from("file://inbox?move=backup/${date:now:yyyyMMdd}/${file:name}").to("...");如需更多示例,请参阅 文件语言。
21.23. 避免多次读取同一文件(回想消费者)
Camel 支持组件中的 Idempotent Consumer,因此它将跳过已处理的文件。这个功能可以通过设置 idempotent=true 选项来启用。
from("file://inbox?idempotent=true").to("...");Camel 使用绝对文件名作为幂等键,以检测重复的文件。您可以使用 idempotentKey 选项中的表达式来自定义此密钥。例如,使用名称和文件大小作为键
<route>
<from uri="file://inbox?idempotent=true&idempotentKey=${file:name}-${file:size}"/>
<to uri="bean:processInbox"/>
</route>
默认情况下,Camel 使用基于内存的存储来跟踪消耗的文件,它使用最早使用最多 1000 个条目的缓存。您可以使用值中的 # 符号使用 idempotentRepository 选项来插件此存储实施,以指示它在带有指定 id 的 Registry 中引用 Bean。
<!-- define our store as a plain spring bean --> <bean id="myStore" class="com.mycompany.MyIdempotentStore"/> <route> <from uri="file://inbox?idempotent=true&idempotentRepository=#myStore"/> <to uri="bean:processInbox"/> </route>
如果 Camel 跳过了文件,Camel 将以 DEBUG 级别记录,因为它已在之前被使用:
DEBUG FileConsumer is idempotent and the file has been consumed before. Will skip this file: target\idempotent\report.txt
21.24. 使用基于文件的幂等存储库
在本节中,我们将使用基于文件的幂等存储库 org.apache.camel.processor.idempotent.FileIdempotentRepository,而不是默认基于内存的内存。
此仓库使用第一级缓存以避免读取文件存储库。它将仅使用文件存储库来存储第一级别缓存的内容。因此,存储库可以保留服务器重启。它将在启动时将文件的内容加载到第一级别缓存中。文件结构非常简单,因为它将密钥存储在文件的单独行中。默认情况下,文件存储的大小限制为 1mb。文件增长更大的 Camel 将截断文件存储,通过将 1st 级别缓存刷新到全新的空文件来重建内容。
我们使用 Spring XML 创建文件幂等存储库配置存储库,并定义我们的文件消费者使用我们的带有 idempotentRepository 的存储库,使用 # 符号来指示 Registry 查找:
21.25. 使用基于 JPA 的幂等存储库
在本节中,我们将使用基于 JPA 的幂等存储库,而不是默认的内存中。
首先,我们需要 META-INF/persistence.xml 中的 persistence-unit,其中我们需要使用类 org.apache.camel.processor.idempotent.jpa.MessageProcessed 作为型号。
<persistence-unit name="idempotentDb" transaction-type="RESOURCE_LOCAL">
<class>org.apache.camel.processor.idempotent.jpa.MessageProcessed</class>
<properties>
<property name="openjpa.ConnectionURL" value="jdbc:derby:target/idempotentTest;create=true"/>
<property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
<property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
<property name="openjpa.Multithreaded" value="true"/>
</properties>
</persistence-unit>接下来,我们也可以在 spring XML 文件中创建 JPA 幂等存储库:
<!-- we define our jpa based idempotent repository we want to use in the file consumer -->
<bean id="jpaStore" class="org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository">
<!-- Here we refer to the entityManagerFactory -->
<constructor-arg index="0" ref="entityManagerFactory"/>
<!-- This 2nd parameter is the name (= a category name).
You can have different repositories with different names -->
<constructor-arg index="1" value="FileConsumer"/>
</bean>
然后,是的,我们只需要使用 # 语法选项使用 idempotentRepository 来引用文件消费者端点中的 jpaStore bean:
<route> <from uri="file://inbox?idempotent=true&idempotentRepository=#jpaStore"/> <to uri="bean:processInbox"/> </route>
21.26. Filter using org.apache.camel.component.file.GenericFileFilter
Camel 支持可插拔过滤策略。然后,您可以使用此类过滤器配置端点,以跳过正在处理的某些文件。
在示例中,我们构建了自己的过滤器,跳过文件名中跳过的文件:
然后,我们可以使用 filter 属性配置我们的路由,以引用我们在 spring XML 文件中定义的过滤器(使用 # 表示法):
<!-- define our filter as a plain spring bean --> <bean id="myFilter" class="com.mycompany.MyFileFilter"/> <route> <from uri="file://inbox?filter=#myFilter"/> <to uri="bean:processInbox"/> </route>
21.27. 使用 ANT 路径匹配器进行过滤
ANT 路径匹配器基于 AntPathMatcher。
文件路径与以下规则匹配:
-
?匹配一个字符 -
*匹配零个或多个字符 -
**匹配路径中的零个或多个目录
antInclude 和 antExclude 选项易于指定 ANT 样式包含/exclude,而无需定义过滤器。如需更多信息,请参阅上面的 URI 选项。
以下示例演示了如何使用它:
21.27.1. 使用 Comparator 排序
Camel 支持可插拔排序策略。这个策略,它使用 Java 中的 java.util.Comparator 中的构建。然后,您可以使用此类比较器配置端点,并使 Camel 在被处理前对文件进行排序。
在示例中,我们构建了自己的比较器,它们按文件名排序:
然后,我们可以使用 sorter 选项配置我们的路由,以引用在 spring XML 文件中定义的排序程序(我的)。
<!-- define our sorter as a plain spring bean --> <bean id="mySorter" class="com.mycompany.MyFileSorter"/> <route> <from uri="file://inbox?sorter=#mySorter"/> <to uri="bean:processInbox"/> </route>
URI 选项可以使用上面的 Spring DSL 路由中的 # 语法
来引用 Bean,方法是通过使用 # 为 id 前缀指向 Registry 中的 Bean。因此,编写 sorter=#mySorter 指示 Camel 进入 Registry 的 ID 为 ID 为 mySorter 的 bean。
21.27.2. 使用 sortBy 排序
Camel 支持可插拔排序策略。此策略它使用 文件 语言来配置排序。sortBy 选项配置如下:
sortBy=group 1;group 2;group 3;...
其中,每个组用半冒号分隔。在简单情况下,您只使用一个组,因此一个简单的示例可以是:
sortBy=file:name
这会按文件名排序,您可以通过将前缀向组来 反转 顺序来反转,因此排序现在为 Z...A:
sortBy=reverse:file:name
因为我们拥有 文件 语言的完整功能,所以我们可以使用其他一些参数,因此如果我们想要按文件大小排序:
sortBy=file:length
您可以将 配置为忽略大小写,使用 ignoreCase: 进行字符串比较,因此如果您想要使用文件名排序,但要忽略大小写,然后我们这样做:
sortBy=ignoreCase:file:name
您可以组合忽略问题单和反向,但必须首先指定反向:
sortBy=reverse:ignoreCase:file:name
在以下示例中,我们希望按最后修改的文件排序,因此我们这样做:
sortBy=file:modified
然后,我们希望按照名称来分组第二选项,因此具有相同 modifcation 的文件按名称排序:
sortBy=file:modified;file:name
现在这里存在一个问题,您可以发现它吗?文件修改的时间戳太正常,因为它将以毫秒为单位,但如果我们只希望按日期排序,然后按名称进行子组?
另外,我们拥有 文件 语言的真正力量,我们可以使用其支持模式的 date 命令。因此,这可以被解决:
sortBy=date:file:yyyyMMdd;file:name
是的,这非常强大,您也可以通过每个组使用反向的方式,因此可以撤销文件名:
sortBy=date:file:yyyyMMdd;reverse:file:name
21.28. Using GenericFileProcessStrategy
选项 processStrategy 可用于使用自定义 GenericFileProcessStrategy,供您实现自己的 开始、提交 和回滚 逻辑。
例如,允许 假设系统在文件夹中写入文件,您应该消耗。但是,在编写另一个 就绪的 文件之前,您不应该启动消耗该文件。
因此,通过实施自己的 GenericFileProcessStrategy,我们可以将其实现:
-
在
begin ()方法中,我们可以测试特殊的 就绪 文件是否存在。begin 方法返回一个布尔值,以指示我们是否可以消耗该文件。 -
在
abort ()方法特殊逻辑中,可以在开始操作返回false时执行,例如清除资源等。 -
在
commit ()方法中,我们可以移动实际文件并删除 就绪 的文件。
21.29. 使用过滤器
过滤器 选项允许您通过实施 org.apache.camel.component.file.GenericFileFilter 接口,在 Java 代码中实施自定义过滤器。此接口具有返回布尔值的 accept 方法。返回 true 以包括文件,为 false 可跳过该文件。GenericFile 上有 isDirectory 方法,该文件是否为目录。这可让您过滤不需要的目录,以避免遍历不需要的目录。
例如,要跳过名称中以 "skip" 开头的任何目录,可按如下方式实施:
21.30. 使用 bridgeErrorHandler
如果要使用 Camel Error Handler 处理文件消费者中出现的任何异常,您可以启用 bridgeErrorHandler 选项,如下所示:
// to handle any IOException being thrown
onException(IOException.class)
.handled(true)
.log("IOException occurred due: ${exception.message}")
.transform().simple("Error ${exception.message}")
.to("mock:error");
// this is the file route that pickup files, notice how we bridge the consumer to use the Camel routing error handler
// the exclusiveReadLockStrategy is only configured because this is from an unit test, so we use that to simulate exceptions
from("file:target/nospace?bridgeErrorHandler=true")
.convertBodyTo(String.class)
.to("mock:result");因此,您只需要启用这个选项,路由中的错误处理程序将从那里获取。
当使用 bridgeErrorHandler
时,当使用 bridgeErrorHandler 时,拦截器 不会应用 OnCompletions。Exchange 由 Camel Error Handler 直接处理,不允许在Completion 中采取行动。
21.31. 调试日志记录
此组件具有日志级别 TRACE,如果您出现问题,这非常有用。
21.32. Spring Boot Auto-Configuration
当将文件与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-file-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 11 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.cluster.file.acquire-lock-delay | 开始尝试获取锁定前等待的时间。 | 字符串 | |
| camel.cluster.file.acquire-lock-interval | 尝试获取锁定之间等待的时间。 | 字符串 | |
| camel.cluster.file.attributes | 自定义服务属性. | map | |
| camel.cluster.file.enabled | 如果应启用文件集群服务,则设置此项,默认为 false。 | false | 布尔值 |
| camel.cluster.file.id | 集群服务 ID。 | 字符串 | |
| camel.cluster.file.order | 服务查找顺序/优先级. | 整数 | |
| camel.cluster.file.root | 根路径。 | 字符串 | |
| camel.component.file.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.file.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.file.enabled | 是否启用文件组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.file.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 22 章 FTP
支持制作者和使用者
此组件提供对通过 FTP 和 SFTP 协议的远程文件系统的访问。
从远程 FTP 服务器使用 时,请确保在下面的 消耗文件时阅读标题为 Default 的部分,以了解与消耗文件相关的详细信息。
不支持 绝对路径。Camel 通过修剪来自 directoryname 的所有前导斜杠将绝对路径转换为相对。会在日志中打印 WARN 消息。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ftp</artifactId>
<version>{CamelSBVersion}</version>See the documentation of the Apache Commons
<!-- use the same version as your Camel core version -->
</dependency>22.1. URI 格式
ftp://[username@]hostname[:port]/directoryname[?options] sftp://[username@]hostname[:port]/directoryname[?options] ftps://[username@]hostname[:port]/directoryname[?options]
其中 directoryname 代表底层目录。目录名称是相对路径。不支持 绝对路径。相对路径可以包含嵌套文件夹,如 /inbox/us。
支持 autoCreate 选项。当消费者启动时,在调度轮询前,执行额外的 FTP 操作来创建为端点配置的目录。autoCreate 的默认值为 true。
如果没有提供 用户名,则尝试 使用任何密码进行匿名 登录。
如果没有提供 端口号,Camel 将根据协议(ftp = 21, sftp = 22, ftps = 2222)提供默认值。
您可以将查询选项附加到 URI 中,格式为 ?option=value&option=value&…
此组件使用两个不同的库来进行实际 FTP 工作。FTP 和 FTPS 使用 Apache Commons Net,而 SFTP 使用 JCraft JSCH。
FTPS (也称为 FTP 安全)是 FTP 的扩展,它增加了对传输层安全(TLS)和安全套接字层(SSL)加密协议的支持。
22.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
22.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
22.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
22.3. 组件选项
FTP 组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
22.4. 端点选项
FTP 端点使用 URI 语法进行配置:
ftp:host:port/directoryName
使用以下路径和查询参数:
22.4.1. 路径参数(3 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 主机 (通用) | FTP 服务器所需的主机名. | 字符串 | |
| 端口 (common) | FTP 服务器的端口。 | int | |
| directoryName (common) | 启动目录。 | 字符串 |
22.4.2. 查询参数(111 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 二进制 (common) | 指定文件传输模式 BINARY 或 ASCII。默认为 ASCII (false)。 | false | 布尔值 |
| charset (common) | 此选项用于指定文件的编码。您可以在消费者上使用此功能,以指定文件的编码,允许 Camel 知道计费集应在访问文件内容时加载文件内容。类似地,在编写文件时,您可以使用此选项来也指定写入该文件的 charset。请记住,在编写文件 Camel 时,必须将消息内容读取在内存中才能将数据转换为配置的字符集,因此如果您有大消息,请不要使用它。 | 字符串 | |
| 断开连接 (通用) | 使用后是否断开与远程 FTP 服务器的连接。断开连接只会断开当前与 FTP 服务器的连接。如果您有一个要停止的消费者,则需要改为停止消费者/路由。 | false | 布尔值 |
| doneFileName (common) | 制作者:如果提供,则 Camel 将在写入原始文件时写入第二文件。完成的文件将为空。此选项配置要使用的文件名。您可以指定一个固定名称。或者,您可以使用动态占位符。完成的 文件始终写入到与原始文件相同的文件夹中。消费者:如果提供,Camel 仅在文件存在时使用文件。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。执行的文件始终位于与原始文件相同的文件夹中。仅支持 $\\{file.name} 和 $\\{file.name.next} 作为动态占位符。 | 字符串 | |
| 文件名( common) | 使用表达式(如文件语言)来动态设置文件名。对于消费者,它被用作文件名过滤器。对于制作者,用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注:标头本身也可以是表达式)。表达式选项支持 String 和 Expression 类型。如果表达式是 String 类型,则始终使用文件语言评估。如果表达式是 Expression 类型,则使用指定的 Expression 类型 - 例如,这允许您使用 OGNL 表达式。对于消费者,您可以使用它来过滤文件名,以便实例使用文件语言语法:mydata-$\\{date:now:yyyMMdd}.txt。生产者支持 CamelOverruleFileName 标头,其优先级高于任何现有的 CamelFileName 标头;CamelOverruleFileName 是一个仅使用一次的标头,因此可以更容易地避免临时存储 CamelFileName 并在以后恢复。 | 字符串 | |
| passiveMode (common) | 设置被动模式连接。默认为活动模式连接。 | false | 布尔值 |
| 分隔符 (通用) | 设置要使用的路径分隔符。UNIX = 使用 unix 风格的路径分隔符 Windows = 使用窗口风格的路径分隔符 Auto = (默认)在文件名中使用现有路径分隔符。 Enum 值:
| UNIX | PathSeparator |
| transferLoggingIntervalSeconds (common) | 配置记录上传进度和下载正在进行的操作时使用的间隔(以秒为单位)。当操作需要更长的时间时,这用于日志记录进度。 | 5 | int |
| transferLoggingLevel (common) | 配置日志记录上传和下载操作的进度时使用的日志记录级别。 Enum 值:
| DEBUG | LoggingLevel |
| transferLoggingVerbose (common) | 配置上传和下载操作进度的执行详细(细粒度)日志。 | false | 布尔值 |
| fastExistsCheck (通用(高级) | 如果将此选项设置为 true,则 camel-ftp 将直接使用列表文件来检查文件是否存在。由于某些 FTP 服务器可能不支持直接列出文件,如果选项为 false,则 camel-ftp 将使用旧方法列出该目录并检查文件是否存在。这个选项还影响 readLock=changed,以控制它是否执行快速检查来更新文件信息。如果 FTP 服务器有很多文件,这可用于加快进程的速度。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| 删除 (使用者) | 如果为 true,则会在成功处理后删除该文件。 | false | 布尔值 |
| moveFailed (consumer) | 根据简单语言设置移动失败表达式。例如,要将文件移动到 .error 子目录,请使用: .error。注意:将文件移动到故障位置时,Camel 将处理错误,不会再次获取该文件。 | 字符串 | |
| noop (消费者) | 如果为 true,则文件不会以任何方式移动或删除。这个选项适用于只读数据,或 ETL 类型要求。如果 noop=true,Camel 也设置 idempotent=true,以避免再次消耗相同的文件。 | false | 布尔值 |
| preMove (consumer) | 表达式(如文件语言)用于在处理之前动态设置文件名。例如,要将 in-progress 文件移动到 order 目录中,则将此值设置为 order。 | 字符串 | |
| preSort (consumer) | 启用预排序后,消费者将在轮询期间对文件和目录名称进行排序,该名称从文件系统检索。如果您需要按排序顺序对文件执行操作,您可能需要执行此操作。预排序在消费者开始过滤前执行,并接受 Camel 处理的文件。这个选项是 default=false 代表禁用。 | false | 布尔值 |
| 递归 (使用者) | 如果一个目录,也会在所有子目录中查找文件。 | false | 布尔值 |
| 恢复下载 (消费者) | 配置是否启用恢复下载。这必须被 FTP 服务器支持(大多数所有 FTP 服务器都支持它)。此外,还需要配置 localWorkDirectory 选项,以便下载的文件存储在本地目录中,并且必须启用选项二进制文件,以支持恢复下载所必需的。 | false | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| 流下载 (消费者) | 设置在不使用本地工作目录时要使用的下载方法。如果设置为 true,则远程文件在读取时流传输到路由。当设置为 false 时,远程文件会在发送到路由之前加载到内存中。如果启用这个选项,则必须设置 stepwise=false,因为无法同时启用这两个选项。 | false | 布尔值 |
| 下载 (使用者(高级) | FTP 使用者是否应下载该文件。如果此选项设为 false,则消息正文将为 null,但使用者仍会触发 Camel Exchange,其中包含文件的详细信息,如文件名、文件大小等。只是不会下载该文件。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| handleDirectoryParserAbsoluteResult (消费者(高级) | 如果目录解析程序生成了绝对路径,则允许您设置消费者处理子文件夹和文件的方式。这是某些 FTP 服务器可能会使用绝对路径返回文件名,如果是,则 FTP 组件需要通过将返回的路径转换为相对路径来处理该文件。 | false | 布尔值 |
| ignoreFileNotFoundOrPermissionError (consumer (advanced)) | 是否要在 (尝试列出目录中的文件或下载文件时),这些文件不存在,或因为权限错误而忽略。默认情况下,当目录或文件没有权限不足时,会抛出异常。将这个选项设置为 true 允许忽略它。 | false | 布尔值 |
| inProgressRepository (使用者(高级) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository.in-progress 存储库用于考虑当前正在使用的进度文件。默认情况下使用基于内存的存储库。 | IdempotentRepository | |
| localWorkDirectory (消费者) | 消耗时,本地工作目录可以直接将远程文件内容存储在本地文件中,以避免将内容加载到内存中。这很有用,如果您消耗一个非常大的远程文件,因此可以节省内存。 | 字符串 | |
| onCompletionExceptionHandler (consumer (advanced)) | 要使用自定义 org.apache.camel.spi.ExceptionHandler 来处理在完成过程中的文件期间发生的任何抛出异常,其中使用者执行提交或回滚。默认实施将在 WARN 级别记录任何异常并忽略。 | ExceptionHandler | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| processStrategy (使用者(高级) | 可插拔 org.apache.camel.component.file.GenericFileProcessStrategy 允许您实施自己的 readLock 选项或类似选项。也可以在消耗文件之前满足特殊条件时使用,如特殊就绪的文件存在。如果设置了这个选项,则不会应用 readLock 选项。 | GenericFileProcessStrategy | |
| 使用List (使用者(高级) | 下载文件时是否允许使用 LIST 命令。默认为 true。在某些情况下,您可能想要下载特定的文件,且不允许使用 LIST 命令,因此您可以将这个选项设置为 false。请注意,在使用此选项时,要下载的具体文件不包含元数据信息,如文件大小、时间戳、权限等,因为这些信息只能在 LIST 命令正在使用时检索。 | true | 布尔值 |
| fileExist (producer) | 如果文件已具有相同名称,则需要做什么。覆盖(默认)替换现有文件。- Append - 向现有文件添加内容。- Fail - 抛出 GenericFileOperationException,表示已存在已存在文件。- Ignore - 静默忽略问题,且不会覆盖现有文件,但假设一切都正常。- Move - 选项需要使用 moveExisting 选项进行配置。选项 eagerDeleteTargetFile 可用于控制移动文件时要执行的操作,并且存在现有文件,否则会导致移动操作失败。在编写目标文件前,Move 选项将移动任何现有文件。- TryRename 仅在使用 tempFileName 选项时才适用。这允许尝试将文件从临时名称重命名为实际名称,而无需执行任何存在检查。在某些文件系统中,这个检查可能会更快,特别是 FTP 服务器。 Enum 值:
| 覆盖 | GenericFileExist |
| Flatten (producer) | Flatlat 用于扁平化文件名路径以剥离任何前导路径,因此它只是文件名。这可让您递归地消耗到子目录中,但当您将文件写入单个目录中时。在制作者上将其设置为 true 可强制 CamelFileName 标头中的任何文件名被剥离任何领先路径。 | false | 布尔值 |
| jailStartingDirectory (producer) | 仅用于定位(限制)只向起始目录(和子)写入文件。这默认是启用的,不允许 Camel 将文件写入外部目录(开箱即用更为安全)。您可以关闭此功能,以允许将文件写入起始目录之外的目录,如父目录或根文件夹。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| moveExisting (producer) | 用于计算文件名在配置 fileExist=Move 时使用的表达式(如文件语言)。要将文件移动到备份子目录中,只需输入备份。这个选项只支持以下文件语言令牌:file:name、file:name.ext、file:name.noext、file:onlyname、file:onlyname.noext、file:ext 和 file:parent。请注意,FTP 组件不支持 file:parent,因为 FTP 组件只能将任何现有的文件移到基于当前 dir 的相对目录中。 | 字符串 | |
| tempFileName (producer) | 与 tempPrefix 选项相同,但可以对使用文件语言的临时文件名命名提供更精细的控制。tempFilename 的位置相对于选项 'fileName' 中的最终文件位置,而不是 base uri 中的目标目录。例如,如果选项 fileName 包含目录前缀:dir/finalFilename,tempFileName 相对于那个子目录 dir。 | 字符串 | |
| tempPrefix (producer) | 此选项用于使用临时名称写入文件,然后在写入完成后将它重命名为实际名称。可用于识别要写入的文件,并且避免消费者(不使用专用读取锁定)读取进度文件。在上传大型文件时,FTP 通常使用。 | 字符串 | |
| allowNullBody (producer (advanced)) | 用于指定在文件写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,如果设为 false,并且尝试发送 null 正文到文件组件,"Cannot writing null bodyException of 'Cannot write null body to file.' 将会抛出。如果 fileExist 选项设置为 'Override',则文件将被截断,如果设为 append,则文件将保持不变。 | false | 布尔值 |
| chmod (生成者(高级) | 允许您在存储的文件上设置 chmod。例如 chmod=640。 | 字符串 | |
| disconnectOnBatchComplete (producer (advanced) | Batch 上传完成后是否从远程 FTP 服务器断开连接。disconnectOnBatchComplete 只会断开当前与 FTP 服务器的连接。 | false | 布尔值 |
| eagerDeleteTargetFile (producer (advanced)) | 是否强制删除任何现有目标文件。这个选项只适用于使用 fileExists=Override 和 tempFileName 选项。在写入 temp 文件前,您可以使用它禁用(将其设置为 false)删除目标文件。例如,您可以编写大型文件,并希望在编写 temp 文件期间存在目标文件。这样可保证目标文件在最后一次时间之前,只要将 temp 文件重命名为目标文件名之前。这个选项还用来控制是否在启用 fileExist=Move 时删除任何现有的文件,并且存在现有文件。如果此选项 copyAndDeleteOnRenameFails false,则如果现有文件存在,则会抛出异常(如果其为 true),然后在移动操作前删除现有文件。 | true | 布尔值 |
| keepLastModified (producer (advanced)) | 将从源文件(如果有)中保留最后修改的时间戳。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或带有时间戳的长时间。如果时间戳存在,并且启用了 选项,它将在写入文件中设置此时间戳。注意:此选项仅适用于文件制作者。您不能将此选项用于任何 ftp 制作者。 | false | 布尔值 |
| moveExistingFileStrategy (producer (advanced)) | 策略(Custom Strategy),用于在配置了 fileExist=Move 时移动具有特殊命名令牌的文件。默认情况下,如果没有提供自定义策略,则使用实施。 | FileMoveExistingStrategy | |
| sendNoop (生成的(高级) | 在将文件上传到 FTP 服务器之前,是否以预写检查的形式发送 noop 命令。这默认是启用的,因为连接的验证仍然有效,允许静默重新连接能够上传该文件。但是,如果这导致问题,您可以关闭这个选项。 | true | 布尔值 |
| ActivePortRange (高级) | 将客户端侧端口范围设置为活动模式。语法为:minPort-maxPort Both 端口号包含 inclusive, eg 10000-19999,以包含所有 1xxxx 端口。 | 字符串 | |
| autoCreate (高级) | 在文件路径名称中自动创建缺少的目录。对于文件消费者,这意味着创建起始目录。对于文件制作者,这表示应写入文件的目录。 | true | 布尔值 |
| bufferSize (advanced) | 用于编写文件的缓冲区大小(或如果是 FTP 用于下载和上传文件)的缓冲区大小(以字节为单位)。 | 131072 | int |
| connectTimeout (高级) | 设置等待连接被 FTPClient 和 JSCH 使用的连接超时。 | 10000 | int |
| ftpClient (高级) | 使用 FTPClient 的自定义实例。 | FTPClient | |
| ftpClientConfig (advanced) | 要使用 FTPClientConfig 的自定义实例,请配置端点应使用的 FTP 客户端。 | FTPClientConfig | |
| ftpClientConfigParameters (advanced) | FtpComponent 用来为 FTPClientConfig 提供附加参数。 | map | |
| ftpClientParameters (高级) | FtpComponent 用来为 FTPClient 提供附加参数。 | map | |
| maximumReconnectAttempts (advanced) | 指定 Camel 尝试连接到远程 FTP 服务器时的最大重新连接尝试。使用 0 禁用此行为。 | int | |
| reconnectDelay (高级) | 在执行重新连接尝试前,millis Camel 将等待延迟。 | 1000 | long |
| siteCommand (advanced) | 设置在成功登录后要执行的可选站点命令。可以使用新行字符来分隔多个站点命令。 | 字符串 | |
| soTimeout (高级) | 在 millis 中设置 so timeout FTP 和 FTPS Is the SocketOptions.SO_TIMEOUT 值。推荐的选项是将其设置为 300000,以便没有挂起的连接。在 SFTP 上,此选项被设置为 JSCH Session 实例的超时时间。 | 300000 | int |
| 步骤更好 (高级) | 设置在下载文件时,还是在上传文件时,还是在将文件上传到目录时,我们是否应逐步更改目录。例如,由于安全原因您无法更改 FTP 服务器上的目录,您可以禁用此功能。Stepwise 无法与 streamDownload 一起使用。 | true | 布尔值 |
| 同步 (高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| throwExceptionOnConnectFailed (advanced) | 如果连接失败(驱除)By 默认异常,并且记录 WARN,则抛出异常。您可以使用它来启用异常,并处理 org.apache.camel.spi.PollingConsumerPollStrategy rollback 方法的抛出异常。 | false | 布尔值 |
| 超时 (高级) | 设置等待仅由 FTPClient 使用的回复的数据超时。 | 30000 | int |
| antExclude (filter) | ant 样式过滤排除。如果同时使用 antInclude 和 antExclude,则 antExclude 优先于 antInclude。可以使用逗号分隔的格式指定多个排除项。 | 字符串 | |
| antFilterCaseSensitive (filter) | 在 ant 过滤器中设置区分大小写的标志。 | true | 布尔值 |
| antInclude (filter) | Ant 风格的过滤器包含.可以使用逗号分隔的格式指定多个包含内容。 | 字符串 | |
| eagerMaxMessagesPerPoll (filter) | 允许控制 maxMessagesPerPoll 中的限制是否 eager。如果 eager,则限制是在扫描文件的过程中。其中,false 会扫描所有文件,然后执行排序。将此选项设置为 false 可先排序所有文件,然后限制轮询。请注意,这需要较高的内存用量,因为所有文件都在内存中执行排序。 | true | 布尔值 |
| exclude (filter) | 用于排除文件,如果文件名与 regex 模式匹配(匹配时不区分大小写)。请注意,如果您使用加号等符号,如果将其配置为 endpoint uri,则需要使用 RAW ()语法进行配置。有关配置 endpoint uris 的更多详细信息。 | 字符串 | |
| excludeExt (filter) | 用于排除匹配文件扩展名文件(不区分大小写)的文件。例如,要排除 bak 文件,然后使用 excludeExt=bak。多个扩展可以用逗号分开,例如要排除 bak 和 dat 文件,请使用 excludeExt=bak,dat。请注意,文件扩展包含所有部分,例如,名为 mydata.tar.gz 的文件将扩展为 tar.gz。要获得更大的灵活性,请使用 include/exclude 选项。 | 字符串 | |
| filter (filter) | 可插拔过滤器作为 org.apache.camel.component.file.GenericFileFilter 类。将跳过文件,如果过滤器在其 accept ()方法中返回 false。 | GenericFileFilter | |
| filterDirectory (filter) | 根据简单语言过滤目录。例如,要根据当前日期进行过滤,您可以使用一个简单的日期模式,如 $\\{date:now:yyMMdd}。 | 字符串 | |
| filterFile (filter) | 根据简单语言过滤文件。例如,要过滤文件大小,您可以使用 $\\{file:size} 5000。 | 字符串 | |
| idempotent (filter) | 使用 Idempotent EIP 模式的选项,让 Camel 跳过已处理的文件。默认情况下,将使用基于内存的 LRUCache,其中包含 1000 个条目。如果 noop=true,则也会启用幂等性,以避免再次消耗相同的文件。 | false | 布尔值 |
| idempotentKey (filter) | 使用自定义幂等密钥。默认情况下,使用文件的绝对路径。您可以使用文件语言(例如,使用文件名和文件大小),您可以执行以下操作: idempotentKey=$\\{file:name}-$\\{file:size}。 | 字符串 | |
| idempotentRepository (filter) | 可插拔存储库 org.apache.camel.spi.IdempotentRepository,如果未指定且幂等为 true,则默认使用 MemoryIdempotentRepository。 | IdempotentRepository | |
| include (filter) | 用于包含文件,如果文件名与 regex 模式匹配(匹配时不区分大小写)。请注意,如果您使用加号等符号,如果将其配置为 endpoint uri,则需要使用 RAW ()语法进行配置。有关配置 endpoint uris 的更多详细信息。 | 字符串 | |
| includeExt (filter) | 用于包括匹配文件扩展名名称的文件(区分大小写)。例如,要包含 txt 文件,然后使用 includeExt=txt。多个扩展可以用逗号分开,例如要包含 txt 和 xml 文件,请使用 includeExt=txt,xml。请注意,文件扩展包含所有部分,例如,名为 mydata.tar.gz 的文件将扩展为 tar.gz。要获得更大的灵活性,请使用 include/exclude 选项。 | 字符串 | |
| maxDepth (filter) | 递归处理目录时要遍历的最大深度。 | 2147483647 | int |
| maxMessagesPerPoll (filter) | 定义每个轮询收集的最大消息。默认情况下不设置最大值。可用于设置 e.g. 1000 的限制,以避免在启动有数千个文件的服务器时避免。设置一个 0 或负值以禁用它。注意:如果此选项正在使用中,则文件和 FTP 组件将在任何排序前限制。例如,如果您有 100000 文件并使用 maxMessagesPerPoll=500,则只会获取前 500 个文件,然后排序。您可以使用 eagerMaxMessagesPerPoll 选项,并将此选项设置为 false,以允许首先扫描所有文件,然后排序。 | int | |
| minDepth (filter) | 递归处理目录时开始处理的最小深度。使用 minDepth=1 表示基础目录。使用 minDepth=2 表示第一个子目录。 | int | |
| move (filter) | 表达式(如简单语言)用于在处理后动态设置文件名。要将文件移动到 .done 子目录中,请输入 .done。 | 字符串 | |
| exclusiveReadLockStrategy (lock) | 可插拔 read-lock 作为 org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy 实施。 | GenericFileExclusiveReadLockStrategy | |
| readLock (lock) | 由消费者使用,仅当文件有独占的 read-lock (例如,该文件不进行中或被写入)时轮询文件。Camel 将等到赋予文件锁定为止。此选项提供构建策略的构建: - none - 使用 - markerFile - Camel 创建一个标志文件(fileName.camelLock),然后保存该锁定。此选项不适用于 FTP 组件 - 已更改 - 更改正在使用文件长度/修改时间戳来检测当前是否正在复制该文件。至少将使用 1 sec 来确定这一点,因此此选项无法像其他人一样使用文件,但可以更可靠,因为 JDK IO API 始终无法确定文件当前是否被其他进程使用。选项 readLockCheckInterval 可用于设置检查频率。- fileLock - 正在使用 java.nio.channels.FileLock。这个选项不适用于 Windows OS 和 FTP 组件。在通过 mount/share 访问远程文件系统时,应避免使用这种方法,除非该文件系统支持分布式文件锁定。- 重命名 - 使用重命名 - 将其重新命名文件作为测试,是否可以获得独占的 read-lock。- 幂等 - (文件组件)的幂等性是将 idempotentRepository 用作 read-lock。这允许使用读取锁定,在幂等存储库实施支持时支持集群。- idempotent-changed - (仅限文件组件)使用幂等的Repository,并作为组合的 read-lock 更改。这允许使用读取锁定,在幂等存储库实施支持时支持集群。- idempotent-rename - (仅限文件组件)幂等-rename 使用幂等的Repository,并重命名为组合的 read-lock。这允许使用读取锁定,在幂等存储库实施支持时支持集群。注意:各种读取锁不是在集群模式下工作的,不同节点上的并发用户对共享文件系统上的相同文件是竞争的。使用接近 atomic 操作的 markerFile 创建空标志文件,但不保证在集群中工作。fileLock 可能更好,但文件系统需要支持分布式文件锁定等。如果幂等存储库支持集群,如 Hazelcast 组件或 Infinispan,则使用幂等的读取锁定可以支持集群。 Enum 值:
| none | 字符串 |
| readLockCheckInterval (lock) | read-lock 的 millis 间隔(如果读锁定支持)。这个间隔用于尝试获取读取锁定的休眠。例如,在使用更改的读取锁定时,您可以将一个更高的间隔周期设置为 cater 以进行慢的写操作。默认 1 sec。如果制作者的写入速度非常慢,则可能很快。注意:对于 FTP,默认的 readLockCheckInterval 为 5000。readLockTimeout 值必须高于 readLockCheckInterval,但经验规则是至少有 2 个或多于 readLockCheckInterval 的超时。这是为了确保读取锁定进程允许时间试图在超时被命中前获取锁定。 | 1000 | long |
| readLockDeleteOrphanLockFiles (lock) | 如果 Camel 没有被正确关闭(如 JVM 崩溃),则在启动时是否应通过标志文件读取任何孤立的读取锁定文件(如 JVM 崩溃)。如果将此选项变为 false,则任何孤立锁定文件将导致 Camel 不会尝试提取该文件,这也可能是因为另一个节点同时从同一共享目录读取文件。 | true | 布尔值 |
| readLockLoggingLevel (lock) | 无法获取读取锁定时使用的日志记录级别。默认情况下会记录 DEBUG。您可以更改此级别,例如 OFF 没有任何日志记录。这个选项仅适用于 readLock 类型: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename。 Enum 值:
| DEBUG | LoggingLevel |
| readLockMarkerFile (lock) | 是否使用带更改的标记文件、重命名或专用读取锁定类型。默认情况下,使用标志文件以及保护其他进程获取同一文件。通过将这个选项设置为 false 可关闭此行为。例如,如果您不想通过 Camel 应用程序将标志文件写入文件系统。 | true | 布尔值 |
| readLockMinAge (lock) | 这个选项仅适用于 readLock=changed。它允许在尝试获取读取锁定前指定文件的最短期限。例如,使用 readLockMinAge=300s 来要求文件持续 5 分钟。这可以加快更改的读取锁定,因为它只会尝试获取至少给定期限的文件。 | 0 | long |
| readLockMinLength (lock) | 这个选项仅适用于 readLock=changed。它允许您配置最小文件长度。默认情况下,Camel 期望文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度的文件。 | 1 | long |
| readLockRemoveOnCommit (lock) | 这个选项仅适用于 readLock=idempotent。它允许您指定在处理文件成功并发生提交时是否从幂等存储库中删除文件名条目。默认情况下,不会删除该文件,这样可确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可能会支持驱除策略,您可以在 X 分钟后驱除文件名条目 - 这样可确保竞争条件出现问题。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | false | 布尔值 |
| readLockRemoveOnRollback (lock) | 这个选项仅适用于 readLock=idempotent。它允许您指定在处理文件失败时是否从幂等存储库中删除文件名条目。如果此选项为 false,则确认文件名条目(就像文件执行了提交一样)。 | true | 布尔值 |
| readLockTimeout (lock) | 如果 read-lock 支持,则 millis 为 read-lock 的可选超时时间。如果无法授予 read-lock 并触发超时,则 Camel 将跳过该文件。在下一次轮询 Camel 时,将再次尝试文件,此时可能会授予 read-lock。使用 0 或更低的值来代表永久值。目前 fileLock,更改并重命名支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000 而不是 10000。readLockTimeout 值必须高于 readLockCheckInterval,但经验规则是至少有 2 个或多于 readLockCheckInterval 的超时。这是为了确保读取锁定进程允许时间试图在超时被命中前获取锁定。 | 10000 | long |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| 帐户 (安全) | 用于登录的帐户。 | 字符串 | |
| 密码 (安全) | 用于登录的密码。 | 字符串 | |
| 用户名 (安全) | 用于登录的用户名。 | 字符串 | |
| shuffle (sort) | 影响文件列表(按随机顺序排序)。 | false | 布尔值 |
| sortBy (sort) | 使用文件语言进行内置排序.支持嵌套排序,因此您可以按照文件名排序,并根据修改的日期作为第二组排序。 | 字符串 | |
| 排序 器(sort) | 可插拔排序器作为一个 java.util.Comparator 类。 | 比较器 |
22.5. FTPS 组件默认信任存储
当使用与 FTPS 组件 SSL 相关的 ftpClient. 属性时,信任存储接受所有证书。如果您只想信任选择的证书,则必须使用 ftpClient.trustStore.xxx 选项或配置自定义 ftpClient 来配置信任存储。
使用 sslContextParameters 时,信任存储由提供的 SSLContextParameters 实例的配置管理。
您可以使用 ftpClient. 或 前缀直接从 URI 上配置 ftpClient 和 ftpClientConfig 上的附加选项。
.ftpClient Config
例如,要将 FTPClient 上的 setDataTimeout 设置为 30 秒,您可以执行以下操作:
from("ftp://foo@myserver?password=secret&ftpClient.dataTimeout=30000").to("bean:foo");您可以混合和匹配,并同时使用这两个前缀,例如配置日期格式或时区。
from("ftp://foo@myserver?password=secret&ftpClient.dataTimeout=30000&ftpClientConfig.serverLanguageCode=fr").to("bean:foo");您可以按照以下方式拥有多个这些选项。
有关可能的选项和更多详情,请参阅 Apache Commons FTP FTPClientConfig 文档。以及 Apache Commons FTP FTPClient。
如果您不喜欢在 url 中包含许多长配置,您可以通过在 Registry 中让 Camel 查找用于引用 ftpClient 或 ftpClientConfig 来使用它。
例如:
<bean id="myConfig" class="org.apache.commons.net.ftp.FTPClientConfig">
<property name="lenientFutureDates" value="true"/>
<property name="serverLanguageCode" value="fr"/>
</bean>然后,当您在 url 中使用 # 表示法时,Camel 查找这个 bean。
from("ftp://foo@myserver?password=secret&ftpClientConfig=#myConfig").to("bean:foo");22.6. 例子
ftp://someone@someftpserver.com/public/upload/images/holiday2008?password=secret&binary=true ftp://someoneelse@someotherftpserver.co.uk:12049/reports/2008/password=secret&binary=false ftp://publicftpserver.com/download
22.7. 并发
FTP Consumer 不支持并发
FTP 使用者(具有相同端点)不支持并发(后备 FTP 客户端不安全线程)。
您可以使用多个 FTP 用户从不同的端点轮询。它只是一个不支持并发用户的端点。
FTP 制作者 没有 这个问题,它支持并发。
22.8. 更多信息
此组件是文件组件的扩展。因此,File 组件页面中还有更多示例和详情。
22.9. 消耗文件时的默认
FTP 使用者默认保留远程 FTP 服务器上未处理的文件。如果您希望删除文件或将它们移到其他位置,则必须明确进行配置。例如,您可以使用 delete=true 删除文件,或者使用 move=.done 将文件移到隐藏的 done 子目录中。
常规文件使用者不同,因为它默认将文件移动到 .camel 子目录。FTP 消费者默认情况下,Camel 不 默认执行此操作,因此默认情况下可能会缺少权限才能移动或删除文件。
22.9.1. 限制
选项 readLock 可用于强制 Camel 不 消耗当前正在写入的文件。但是,此选项默认是关闭的,因为它要求用户具有写访问权限。有关读锁的详情,请查看 File2 中的选项表。
还有其他解决方案可以避免消耗当前通过 FTP 编写的文件;例如,您可以写入到临时目标并在写入后移动文件。
使用 move 或 preMove 选项移动文件时,文件将仅限于 FTP_ROOT 文件夹。这会阻止您在 FTP 区域外移动文件。如果要将文件移动到其他区域,您可以使用软链接并将文件移动到软链接文件夹中。
22.10. 消息标头
以下消息标头可用于影响组件的行为
| 标头 | 描述 |
|---|---|
|
| 指定发送到端点时用于输出消息的输出文件名(相对于端点目录)。如果这不存在并且没有表达式,则生成的消息 ID 将被用作文件名。 |
|
| 写入的输出文件的实际文件路径(路径 + name)。此标头由 Camel 设置,其用途为最终用户提供所写入文件的名称。 |
|
| 所消耗的文件的文件名 |
|
| 远程主机名。 |
|
| 如果使用本地工作目录,则本地工作文件的路径。 |
此外,FTP/FTPS 使用者和生产者将使用以下标头增强 Camel 消息
| 标头 | 描述 |
|---|---|
|
| FTP 客户端回复代码(类型是一个整数) |
|
| FTP 客户端回复字符串 |
22.10.1. Exchange 属性
Camel 设置以下交换属性
| 标头 | 描述 |
|---|---|
|
| 当前索引超出此批处理中消耗的文件总数。 |
|
| 此批处理中消耗的文件总数。 |
|
| 如果此批处理中没有更多文件,则为 true。 |
22.11. 关于超时
这两组库(请参见 top)有不同的 API 来设置超时。您可以将 connectTimeout 选项用于这两个选项,以设置 millis 中超时来建立网络连接。还可以在 FTP/FTPS 上设置单个 soTimeout,它对应于使用 ftpClient.soTimeout。请注意,SFTP 将自动使用 connectTimeout 作为其 soTimeout。timeout 选项仅适用于 FTP/FTPS 作为数据超时,对应于 ftpClient.dataTimeout 值。所有超时值都为 millis。
22.12. 使用本地工作目录
Camel 支持从远程 FTP 服务器使用,并将文件直接下载到本地工作目录中。这可避免在使用 FileOutputStream 将整个远程文件内容直接流传输到本地文件时将其读取到内存中。
Camel 将存储到名称与远程文件相同的本地文件,但在下载文件时使用 .inprogress 作为扩展名。之后,会重命名该文件以删除 .inprogress 后缀。最后,当 Exchange 完成本地文件后,将删除该文件。
因此,如果要从远程 FTP 服务器下载文件并将其保存为文件,则需要路由到文件端点,例如:
from("ftp://someone@someserver.com?password=secret&localWorkDirectory=/tmp").to("file://inbox");
以上路由非常高效,因为它可避免将整个文件内容读取到内存中。它将将远程文件直接下载到本地文件流中。然后,java.io.File handle 用作 Exchange 正文。文件制作者利用这个事实,可以直接在工作文件 java.io.File 处理并执行 java.io.File.rename 到目标文件名。由于 Camel 知道它是本地工作文件,它可以优化并使用重命名(而不是文件副本),因为工作文件旨在删除。
22.13. 分步更改目录
在消耗文件(如下载)或生成文件(例如上传)时,Camel FTP 可以在两种模式下操作。
- 分步
- 不分行
根据您的情况和安全问题,您可能要选择一个。有些 Camel 最终用户只能在使用步骤时下载文件,而其他人只能下载文件。
您可以使用 分步 选项来控制行为。
请注意,在大多数情况下,目录更改将仅在用户限制为其主目录以及当主目录报告为 "/" 时起作用。
这两者之间的差别最好是示例所示。假设我们在远程 FTP 服务器上有以下目录结构,我们需要遍历并下载文件:
/ /one /one/two /one/two/sub-a /one/two/sub-b
并且我们在每个子中有一个文件(a.txt)和子b (b.txt)文件夹。
22.14. 使用步骤wise=true (默认模式)
TYPE A 200 Type set to A PWD 257 "/" is current directory. CWD one 250 CWD successful. "/one" is current directory. CWD two 250 CWD successful. "/one/two" is current directory. SYST 215 UNIX emulated by FileZilla PORT 127,0,0,1,17,94 200 Port command successful LIST 150 Opening data channel for directory list. 226 Transfer OK CWD sub-a 250 CWD successful. "/one/two/sub-a" is current directory. PORT 127,0,0,1,17,95 200 Port command successful LIST 150 Opening data channel for directory list. 226 Transfer OK CDUP 200 CDUP successful. "/one/two" is current directory. CWD sub-b 250 CWD successful. "/one/two/sub-b" is current directory. PORT 127,0,0,1,17,96 200 Port command successful LIST 150 Opening data channel for directory list. 226 Transfer OK CDUP 200 CDUP successful. "/one/two" is current directory. CWD / 250 CWD successful. "/" is current directory. PWD 257 "/" is current directory. CWD one 250 CWD successful. "/one" is current directory. CWD two 250 CWD successful. "/one/two" is current directory. PORT 127,0,0,1,17,97 200 Port command successful RETR foo.txt 150 Opening data channel for file transfer. 226 Transfer OK CWD / 250 CWD successful. "/" is current directory. PWD 257 "/" is current directory. CWD one 250 CWD successful. "/one" is current directory. CWD two 250 CWD successful. "/one/two" is current directory. CWD sub-a 250 CWD successful. "/one/two/sub-a" is current directory. PORT 127,0,0,1,17,98 200 Port command successful RETR a.txt 150 Opening data channel for file transfer. 226 Transfer OK CWD / 250 CWD successful. "/" is current directory. PWD 257 "/" is current directory. CWD one 250 CWD successful. "/one" is current directory. CWD two 250 CWD successful. "/one/two" is current directory. CWD sub-b 250 CWD successful. "/one/two/sub-b" is current directory. PORT 127,0,0,1,17,99 200 Port command successful RETR b.txt 150 Opening data channel for file transfer. 226 Transfer OK CWD / 250 CWD successful. "/" is current directory. QUIT 221 Goodbye disconnected.
正如您在启用步骤时所看到的那样,它将使用 CD xxx 遍历目录结构。
22.15. 使用步骤wise=false
230 Logged on TYPE A 200 Type set to A SYST 215 UNIX emulated by FileZilla PORT 127,0,0,1,4,122 200 Port command successful LIST one/two 150 Opening data channel for directory list 226 Transfer OK PORT 127,0,0,1,4,123 200 Port command successful LIST one/two/sub-a 150 Opening data channel for directory list 226 Transfer OK PORT 127,0,0,1,4,124 200 Port command successful LIST one/two/sub-b 150 Opening data channel for directory list 226 Transfer OK PORT 127,0,0,1,4,125 200 Port command successful RETR one/two/foo.txt 150 Opening data channel for file transfer. 226 Transfer OK PORT 127,0,0,1,4,126 200 Port command successful RETR one/two/sub-a/a.txt 150 Opening data channel for file transfer. 226 Transfer OK PORT 127,0,0,1,4,127 200 Port command successful RETR one/two/sub-b/b.txt 150 Opening data channel for file transfer. 226 Transfer OK QUIT 221 Goodbye disconnected.
正如您在不使用步骤时所看到的那样,根本不调用 CD 操作。
22.16. Samples
在以下示例中,我们将 Camel 设置为每小时从 FTP 服务器下载所有报告(60 分钟)作为 BINARY 内容并将其存储为本地文件系统中的文件。
使用 XML DSL 和路由:
<route>
<from uri="ftp://scott@localhost/public/reports?password=tiger&binary=true&delay=60000"/>
<to uri="file://target/test-reports"/>
</route>22.16.1. 消耗远程 FTPS 服务器(请求 SSL)和客户端身份验证
from("ftps://admin@localhost:2222/public/camel?password=admin&securityProtocol=SSL&implicit=true
&ftpClient.keyStore.file=./src/test/resources/server.jks
&ftpClient.keyStore.password=password&ftpClient.keyStore.keyPassword=password")
.to("bean:foo");22.16.2. 消耗远程 FTPS 服务器(请求 TLS)和自定义信任存储配置
from("ftps://admin@localhost:2222/public/camel?password=admin&ftpClient.trustStore.file=./src/test/resources/server.jks&ftpClient.trustStore.password=password")
.to("bean:foo");22.17. 自定义过滤
Camel 支持可插拔过滤策略。此策略它使用 Java 中的 org.apache.camel.component.file.GenericFileFilter 中的构建。然后,您可以使用此类过滤器配置端点,以便在处理前跳过某些过滤器。
在示例中,我们构建了自己的过滤器,该过滤器只接受以文件名中报告开头的文件。
然后,我们可以使用 filter 属性配置我们的路由,以引用我们在 spring XML 文件中定义的过滤器(使用 # 表示法):
<!-- define our sorter as a plain spring bean -->
<bean id="myFilter" class="com.mycompany.MyFileFilter"/>
<route>
<from uri="ftp://someuser@someftpserver.com?password=secret&filter=#myFilter"/>
<to uri="bean:processInbox"/>
</route>22.18. 使用 ANT 路径匹配器进行过滤
ANT 路径匹配器是一个在 camel-spring jar 中附带的过滤器。因此,如果您使用 Maven,则需要依赖 camel-spring。
原因在于,我们利用 Spring 的 AntPathMatcher 进行实际匹配。
文件路径与以下规则匹配:
-
?匹配一个字符 -
*匹配零个或多个字符 -
**匹配路径中的零个或多个目录
以下示例演示了如何使用它:
22.19. 使用带有 SFTP 的代理
要使用 HTTP 代理连接到远程主机,您可以使用以下方法配置路由:
<!-- define our sorter as a plain spring bean --> <bean id="proxy" class="com.jcraft.jsch.ProxyHTTP"> <constructor-arg value="localhost"/> <constructor-arg value="7777"/> </bean> <route> <from uri="sftp://localhost:9999/root?username=admin&password=admin&proxy=#proxy"/> <to uri="bean:processFile"/> </route>
如果需要,您还可以为代理分配用户名和密码。有关 com.jcraft.jsch.Proxy 的文档,以发现所有选项。
22.20. 设置首选的 SFTP 验证方法
如果要明确指定 sftp 组件应使用的身份验证方法列表,请使用 preferredAuthentications 选项。例如,如果您想 Camel 尝试使用私钥/公共 SSH 密钥进行身份验证,并在没有公钥可用时回退到用户/密码身份验证,请使用以下路由配置:
from("sftp://localhost:9999/root?username=admin&password=admin&preferredAuthentications=publickey,password").
to("bean:processFile");22.21. 使用固定名称消耗单个文件
当您要下载单个文件并知道文件名时,您可以使用 fileName=myFileName.txt 告知 Camel 要下载的文件的名称。默认情况下,消费者仍将 FTP LIST 命令执行目录列表,然后根据 fileName 选项过滤这些文件。虽然在这个用例中,可能需要通过设置 useList=false 来关闭目录列表。例如,用于登录到 FTP 服务器的用户帐户可能没有执行 FTP LIST 命令的权限。因此,您可以使用 useList=false 关闭它,然后提供文件的固定名称来下载 fileName=myFileName.txt,然后 FTP 使用者仍然可以下载该文件。如果出于某种原因的文件不存在,则 Camel 默认会抛出异常,您可以通过设置 ignoreFileNotFoundOrPermissionError=true 来关闭此异常并忽略它。
例如,要有一个 Camel 路由选择单个文件,并在使用后将其删除
from("ftp://admin@localhost:21/nolist/?password=admin&stepwise=false&useList=false&ignoreFileNotFoundOrPermissionError=true&fileName=report.txt&delete=true")
.to("activemq:queue:report");请注意,我们使用了以上介绍的所有选项。
您还可以在 ConsumerTemplate 中使用它。例如,要下载单个文件(如果存在),并将文件内容作为 String 类型获取:
String data = template.retrieveBodyNoWait("ftp://admin@localhost:21/nolist/?password=admin&stepwise=false&useList=false&ignoreFileNotFoundOrPermissionError=true&fileName=report.txt&delete=true", String.class);22.22. 调试日志记录
此组件具有日志级别 TRACE,如果您出现问题,这非常有用。
22.23. Spring Boot Auto-Configuration
当将 ftp 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-ftp-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 13 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.ftp.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.ftp.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.ftp.enabled | 是否启用 ftp 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.ftp.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.ftps.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.ftps.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.ftps.enabled | 是否启用 ftps 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.ftps.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.ftps.use-global-ssl-context-parameters | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| camel.component.sftp.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.sftp.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.sftp.enabled | 是否启用 sftp 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.sftp.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 23 章 HTTP
仅支持制作者
HTTP 组件提供基于 HTTP 的端点来调用外部 HTTP 资源(作为客户端使用 HTTP 调用外部服务器)。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>23.1. URI 格式
http:hostname[:port][/resourceUri][?options]
默认情况下,HTTPS 使用端口 80 用于 HTTP 和 443。
23.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
23.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
23.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
23.3. 组件选项
HTTP 组件支持 37 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| cookieStore (producer) | 使用自定义 org.apache.http.client.CookieStore。默认情况下,使用 org.apache.http.impl.client.BasicCookieStore,它是一个仅限内存的 Cookie 存储。请注意,如果 bridgeEndpoint=true,则 Cookie 存储被强制为 noop cookie 存储,因为 Cookie 不能像我们刚刚桥接一样存储(例如作为代理)。 | CookieStore | |
| CopyHeaders (producer) | 如果这个选项为 true,则 IN Exchange 标头将根据复制策略复制到 OUT Exchange 标头。把它设置为 false,仅允许仅包含 HTTP 响应中的标头(不传播 IN 标头)。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| responsePayloadStreamingThreshold (producer) | 这个阈值(以字节为单位)控制响应有效负载是否应该存储在内存中作为字节数组还是基于流处理。把它设置为 -1 以始终使用流模式。 | 8192 | int |
| skipRequestHeaders (producer (advanced)) | 是否跳过将所有 Camel 标头映射为 HTTP 请求标头。如果需要包含来自 Camel 标头的数据,则这可以避免为 JVM 垃圾收集器解析带有许多对象分配的开销。 | false | 布尔值 |
| skipResponseHeaders (producer (advanced)) | 是否跳过将所有 HTTP 响应标头映射到 Camel 标头。如果 HTTP 标头不需要数据,这可以避免为 JVM 垃圾收集器使用多个对象分配解析开销。 | false | 布尔值 |
| allowJavaSerializedObject (advanced) | 当请求使用 context-type=application/x-java-serialized-object 时,是否允许 java 序列化。默认情况下是关闭的。如果您启用它,Java 将把请求中的传入数据反序列化到 Java,这可能会带来潜在的安全风险。 | false | 布尔值 |
| authCachingDisabled (高级) | 禁用身份验证方案缓存。 | false | 布尔值 |
| automaticRetriesDisabled (advanced) | 禁用自动请求恢复和重新执行。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| clientConnectionManager (高级) | 要使用自定义和共享 HttpClientConnectionManager 来管理连接。如果已经进行了配置,则始终将此用于此组件创建的所有端点。 | HttpClientConnectionManager | |
| connectionsPerRoute (高级) | 每个路由的最大连接数。 | 20 | int |
| connectionStateDisabled (advanced) | 禁用连接状态跟踪。 | false | 布尔值 |
| connectionTimeToLive (高级) | 连接到实时的时间,单位为毫秒,默认值为始终保持 alive。 | long | |
| contentCompressionDisabled (advanced) | 禁用自动内容解压缩。 | false | 布尔值 |
| cookieManagementDisabled (advanced) | 禁用状态(cookie)管理。 | false | 布尔值 |
| defaultUserAgentDisabled (advanced) | 如果用户未提供,则禁用此构建器设置的默认用户代理。 | false | 布尔值 |
| httpBinding (高级) | 使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。 | HttpBinding | |
| httpClientConfigurer (advanced) | 使用自定义 HttpClientConfigurer 执行将使用的 HttpClient 的配置。 | HttpClientConfigurer | |
| httpConfiguration (高级) | 使用共享 HttpConfiguration 作为基本配置。 | HttpConfiguration | |
| httpContext (高级) | 在执行请求时使用自定义 org.apache.http.protocol.HttpContext。 | HttpContext | |
| maxTotalConnections (高级) | 连接的最大数量。 | 200 | int |
| redirect处理Disabled (高级) | 禁用自动重定向处理。 | false | 布尔值 |
| headerFilterStrategy (filter) | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| proxyAuthDomain (proxy) | 要使用的代理身份验证域。 | 字符串 | |
| proxyAuthHost (proxy) | 代理身份验证主机。 | 字符串 | |
| proxyAuthMethod (proxy) | 要使用的代理身份验证方法。 Enum 值:
| 字符串 | |
| proxyAuthNtHost (proxy) | 与 NTML 搭配使用的代理身份验证域(workstation 名称)。 | 字符串 | |
| proxyAuthPassword (proxy) | 代理身份验证密码。 | 字符串 | |
| proxyAuthPort (proxy) | 代理身份验证端口。 | 整数 | |
| proxyAuthUsername (proxy) | 代理身份验证用户名。 | 字符串 | |
| sslContextParameters (security) | 使用 SSLContextParameters 配置安全性。重要: 每个 HttpComponent 仅支持 org.apache.camel.support.jsse.SSLContextParameters 的一个实例。如果您需要使用 2 个或更多不同的实例,您需要为每个实例定义一个新的 HttpComponent。 | SSLContextParameters | |
| useGlobalSslContextParameters (security) | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| x509HostnameVerifier (security) | 使用自定义 X509HostnameVerifier,如 DefaultHostnameVerifier 或 NoopHostnameVerifier。 | HostnameVerifier | |
| connectionRequestTimeout (timeout) | 从连接管理器请求连接时使用的超时时间(毫秒)。超时值为零被解释为无限超时。超时值为零被解释为无限超时。负值解释为未定义(系统默认值)。 | -1 | int |
| connectTimeout (timeout) | 确定连接建立前的超时时间(毫秒)。超时值为零被解释为无限超时。超时值为零被解释为无限超时。负值解释为未定义(系统默认值)。 | -1 | int |
| socketTimeout (timeout) | 以毫秒为单位定义套接字超时,即等待数据的超时时间,或者以不同的方式设置,在两个连续的数据数据包之间处于最长期限不活跃状态。超时值为零被解释为无限超时。负值解释为未定义(系统默认值)。 | -1 | int |
23.4. 端点选项
HTTP 端点使用 URI 语法进行配置:
http://httpUri
使用以下路径和查询参数:
23.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| httpUri (common) | 需要 调用的 HTTP 端点的 url。 | URI |
23.4.2. 查询参数(51 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| chunked (producer) | 如果此选项为 false,则 Servlet 将禁用 HTTP 流,并为响应设置 content-length 标头。 | true | 布尔值 |
| disableStreamCache (common) | 确定是否缓存来自 Servlet 的原始输入流(Camel 将流读取到内存/覆盖流到文件,流缓存)缓存。默认情况下,Camel 将缓存 Servlet 输入流,以支持多次读取它,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流时,您可以将这个选项设置为 true,例如将其直接流传输到文件或其他持久性存储。DefaultHttpBinding 会将请求输入流复制到流缓存中,如果此选项为 false,则将其放入消息正文中,以便支持多次读取流。如果您使用 Servlet 来桥接/代理端点,请考虑启用此选项来提高性能,以防不需要多次读取消息有效负载。http 制作者将默认缓存响应正文流。如果将此选项设置为 true,则制作者不会缓存响应正文流,而是将响应流用作消息正文。 | false | 布尔值 |
| headerFilterStrategy (common) | 使用自定义 HeaderFilterStrategy 过滤标题到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| httpBinding (通用(高级) | 使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。 | HttpBinding | |
| bridgeEndpoint (producer) | 如果选项为 true,HttpProducer 将忽略 Exchange.HTTP_URI 标头,并将端点的 URI 用于请求。您还可以将选项 throwExceptionOnFailure 设置为 false,使 HttpProducer 发送所有错误响应。 | false | 布尔值 |
| clearExpiredCookies (producer) | 在发送 HTTP 请求前是否清除过期的 Cookie。这样可确保 Cookie 存储不会通过添加新的 Cookie (在它们过期时被删除)来保持增长。如果组件禁用了 Cookie 管理,这个选项也会禁用。 | true | 布尔值 |
| connectionClose (producer) | 指定是否必须在 HTTP 请求中添加 Connection Close 标头。默认情况下,connectionClose 为 false。 | false | 布尔值 |
| CopyHeaders (producer) | 如果这个选项为 true,则 IN Exchange 标头将根据复制策略复制到 OUT Exchange 标头。把它设置为 false,仅允许仅包含 HTTP 响应中的标头(不传播 IN 标头)。 | true | 布尔值 |
| customHostHeader (producer) | 将自定义主机标头用于制作者。如果没有在查询中设置,将忽略。当设置时,将覆盖从 url 派生的主机标头。 | 字符串 | |
| httpMethod (producer) | 配置要使用的 HTTP 方法。如果设置,HttpMethod 标头无法覆盖这个选项。 Enum 值:
| HttpMethods | |
| ignoreResponseBody (producer) | 如果此选项为 true,http 制作者不会读取响应正文并缓存输入流。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| preserveHostHeader (producer) | 如果选项为 true,HttpProducer 会将 Host 标头设置为当前交换主机标头中包含的值,这可用于反向代理应用程序,其中您希望下游服务器收到的 Host 标头反映上游客户端调用的 URL,这允许使用 Host 标头为代理服务生成准确的 URL。 | false | 布尔值 |
| throwExceptionOnFailure (producer) | 在远程服务器失败时,禁用抛出 HttpOperationFailedException 的选项。无论 HTTP 状态代码是什么,都允许您获取所有响应。 | true | 布尔值 |
| transferException (producer) | 如果对消费者端启用和交换失败处理,如果导致 Exception 在响应中发送回序列化,作为 application/x-java-serialized-object 内容类型。在制作者一端,异常将被反序列化并按原样丢弃,而不是 HttpOperationFailedException。原因例外是需要序列化的。默认情况下是关闭的。如果您启用它,Java 将把请求中的传入数据反序列化到 Java,这可能会带来潜在的安全风险。 | false | 布尔值 |
| cookieHandler (生成者(高级) | 配置 Cookie 处理程序,以维护 HTTP 会话。 | CookieHandler | |
| cookieStore (producer (advanced)) | 使用自定义 CookieStore。默认情况下,使用 BasicCookieStore,它是一个只内存的 Cookie 存储。请注意,如果 bridgeEndpoint=true,则 Cookie 存储被强制为 noop cookie 存储,因为 Cookie 不能像我们刚刚桥接一样存储(例如作为代理)。如果设置了 cookieHandler,则 Cookie 存储也被迫成为 noop cookie 存储,因为 cookieHandler 执行 Cookie 处理。 | CookieStore | |
| deleteWithBody (producer (advanced)) | HTTP DELETE 是否应包含邮件正文。默认情况下,HTTP DELETE 不包含任何 HTTP 正文。但是,在一些罕见的情形中,用户可能需要包含邮件正文。 | false | 布尔值 |
| getWithBody (producer (advanced)) | HTTP GET 是否应该包含邮件正文。默认情况下,HTTP GET 不包含任何 HTTP 正文。但是,在一些罕见的情形中,用户可能需要包含邮件正文。 | false | 布尔值 |
| okStatusCodeRange (producer (advanced)) | 被视为成功响应的状态代码。值为 inclusive。可以定义多个范围,用逗号分开,例如 200-204,209,301-304。每个范围都必须是一个数字,或使用包含短划线的 from-to。 | 200-299 | 字符串 |
| skipRequestHeaders (producer (advanced)) | 是否跳过将所有 Camel 标头映射为 HTTP 请求标头。如果需要包含来自 Camel 标头的数据,则这可以避免为 JVM 垃圾收集器解析带有许多对象分配的开销。 | false | 布尔值 |
| skipResponseHeaders (producer (advanced)) | 是否跳过将所有 HTTP 响应标头映射到 Camel 标头。如果 HTTP 标头不需要数据,这可以避免为 JVM 垃圾收集器使用多个对象分配解析开销。 | false | 布尔值 |
| userAgent (producer (advanced)) | 要设置自定义 HTTP User-Agent 请求标头。 | 字符串 | |
| ClientBuilder (高级) | 提供对此端点生产者或使用者使用的新 RequestConfig 实例使用的 http 客户端请求参数的访问权限。 | HttpClientBuilder | |
| clientConnectionManager (高级) | 使用自定义 HttpClientConnectionManager 来管理连接。 | HttpClientConnectionManager | |
| connectionsPerRoute (高级) | 每个路由的最大连接数。 | 20 | int |
| httpclient ( 高级) | 设置供制作者使用的自定义 HttpClient。 | HttpClient | |
| httpClientConfigurer (advanced) | 为由生产者或消费者创建的新 HttpClient 实例注册自定义配置策略,如 配置身份验证机制等。 | HttpClientConfigurer | |
| httpClientOptions (高级) | 使用 map 中的键/值来配置 HttpClient。 | map | |
| httpContext (高级) | 使用自定义 HttpContext 实例。 | HttpContext | |
| maxTotalConnections (高级) | 连接的最大数量。 | 200 | int |
| useSystemProperties (高级) | 将系统属性用作配置的回退。 | false | 布尔值 |
| proxyAuthDomain (proxy) | 与 NTML 搭配使用的代理身份验证域。 | 字符串 | |
| proxyAuthHost (proxy) | 代理身份验证主机。 | 字符串 | |
| proxyAuthMethod (proxy) | 要使用的代理身份验证方法。 Enum 值:
| 字符串 | |
| proxyAuthNtHost (proxy) | 与 NTML 搭配使用的代理身份验证域(workstation 名称)。 | 字符串 | |
| proxyAuthPassword (proxy) | 代理身份验证密码。 | 字符串 | |
| proxyAuthPort (proxy) | 代理身份验证端口。 | int | |
| proxyAuthScheme (proxy) | 要使用的代理身份验证方案。 Enum 值:
| 字符串 | |
| proxyAuthUsername (proxy) | 代理身份验证用户名。 | 字符串 | |
| proxyHost (proxy) | 要使用的代理主机名。 | 字符串 | |
| proxyPort (proxy) | 要使用的代理端口。 | int | |
| authDomain (security) | 与 NTML 搭配使用的身份验证域。 | 字符串 | |
| authenticationPreemptive (security) | 如果这个选项为 true,则 camel-http 会将抢占基本身份验证发送到服务器。 | false | 布尔值 |
| authHost (security) | 与 NTML 搭配使用的身份验证主机。 | 字符串 | |
| authmethod (安全) | 可以使用身份验证方法作为以逗号分隔的值 Basic、Digest 或 NTLM 列表。 | 字符串 | |
| authMethodPriority (security) | 优先选择使用哪种身份验证方法,可以是 Basic、Digest 或 NTLM。 Enum 值:
| 字符串 | |
| authPassword (security) | 身份验证密码。 | 字符串 | |
| authUsername (security) | 身份验证用户名. | 字符串 | |
| sslContextParameters (security) | 使用 SSLContextParameters 配置安全性。重要: 每个 HttpComponent 仅支持 org.apache.camel.util.jsse.SSLContextParameters 的一个实例。如果您需要使用 2 个或更多不同的实例,您需要为每个实例定义一个新的 HttpComponent。 | SSLContextParameters | |
| x509HostnameVerifier (security) | 使用自定义 X509HostnameVerifier,如 DefaultHostnameVerifier 或 NoopHostnameVerifier。 | HostnameVerifier |
23.5. 消息标头
| 名称 | 类型 | 描述 |
|---|---|---|
|
|
| 要调用的 URI。将覆盖在端点上直接设置的现有 URI。此 uri 是要调用的 http 服务器的 uri。它与 Camel endpoint uri 不同,您可以在其中配置端点选项,如安全性等。此标头不支持,它只支持 http 服务器的 uri。 |
|
|
| 请求 URI 的路径,标头将使用 HTTP_URI 来构建请求 URI。 |
|
|
| URI 参数。将覆盖在端点上直接设置的现有 URI 参数。 |
|
|
| 来自外部服务器的 HTTP 响应代码。确定为 200。 |
|
|
| 来自外部服务器的 HTTP 响应文本。 |
|
|
| 字符编码. |
|
|
|
HTTP 内容类型。在 IN 和 OUT 消息上设置,以提供内容类型,如 |
|
|
|
HTTP 内容编码。在 IN 和 OUT 消息上设置,以提供内容编码,如 |
23.6. 消息正文
Camel 将在 OUT 正文上存储来自外部服务器的 HTTP 响应。IN 消息中的所有标头将复制到 OUT 消息,因此在路由期间保留标头。另外,Camel 会将 HTTP 响应标头和 OUT 消息标头添加。
23.7. 使用系统属性
当将 useSystemProperties 设置为 true 时,HTTP 客户端将查找以下系统属性,它将使用它:
- ssl.TrustManagerFactory.algorithm
- javax.net.ssl.trustStoreType
- javax.net.ssl.trustStore
- javax.net.ssl.trustStoreProvider
- javax.net.ssl.trustStorePassword
- java.home
- ssl.KeyManagerFactory.algorithm
- javax.net.ssl.keyStoreType
- javax.net.ssl.keyStore
- javax.net.ssl.keyStoreProvider
- javax.net.ssl.keyStorePassword
- http.proxyHost
- http.proxyPort
- http.nonProxyHosts
- http.keepAlive
- http.maxConnections
23.8. 响应代码
Camel 将根据 HTTP 响应代码处理:
- 响应代码在 100..299 之间,Camel 将其视为成功响应。
-
响应代码在 300..399 之间,Camel 将其视为重定向响应,并将引发
HttpOperationFailedException及信息。 -
响应代码为 400+,Camel 将其视为外部服务器故障,并将引发包含信息的
HttpOperationFailedException。
throwExceptionOnFailure 选项 throwExceptionOnFailure 可设为 false,以防止 HttpOperationFailedException 为失败的响应代码抛出。这样,您可以从远程服务器获得任何响应。
下面显示了一个示例来说明这一点。
23.9. 例外
HttpOperationFailedException 异常包含以下信息:
- HTTP 状态代码
- HTTP 状态行(状态代码文本)
- 重定向位置,如果服务器返回重定向
-
响应正文作为
java.lang.String,如果服务器提供正文作为响应
23.10. 将使用哪些 HTTP 方法
以下算法用于决定应使用哪些 HTTP 方法:
1。使用作为端点配置提供的方法(httpMethod)。
2.使用标头中提供的方法(Exchange.HTTP_METHOD)。
3.GET 如果标头中提供了查询字符串。
4.GET 如果端点配置了查询字符串。
5.如果有要发送的数据(用户不是 null),则 POST。
6.否则 GET。
23.11. 如何获取 HttpServletRequest 和 HttpServletResponse 的访问权限
您可以使用 Camel 类型转换器系统访问这两个系统
HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class); HttpServletResponse response = exchange.getIn().getBody(HttpServletResponse.class);
您可以只获取 camel-jetty 或 camel-cxf 端点后的处理器请求和响应。
23.12. 配置 URI 来调用
您可以直接设置 HTTP 制作者的 URI 来形成端点 URI。在以下路由中,Camel 将使用 HTTP 调用外部服务器 oldhost。
from("direct:start")
.to("http://oldhost");以及等效的 Spring 示例:
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="direct:start"/>
<to uri="http://oldhost"/>
</route>
</camelContext>
您可以通过在消息上添加带有键 Exchange.HTTP_URI 的标头来覆盖 HTTP 端点 URI。
from("direct:start")
.setHeader(Exchange.HTTP_URI, constant("http://newhost"))
.to("http://oldhost");
在上面的示例中,尽管端点配置了 http://newhost/,Camel 将调用 http://oldhost/。
如果 http 端点在网桥模式下工作,它将忽略 Exchange.HTTP_URI 的消息标题。
23.13. 配置 URI 参数
http 制作者支持将 URI 参数发送到 HTTP 服务器。URI 参数可以直接在端点 URI 上设置,也可以作为带有消息密钥 Exchange.HTTP_QUERY 的标头设置。
from("direct:start")
.to("http://oldhost?order=123&detail=short");或在标头中提供的选项:
from("direct:start")
.setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
.to("http://oldhost");23.14. 如何将 http 方法(GET/PATCH/POST/PUT/DELETE/HEAD/OPTIONS/TRACE)设置为 HTTP 制作者
HTTP 组件提供了一种通过设置消息标头来设置 HTTP 请求方法的方法。下面是一个示例:
from("direct:start")
.setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http.HttpMethods.POST))
.to("http://www.google.com")
.to("mock:results");可使用字符串常量编写一个较短的方法:
.setHeader("CamelHttpMethod", constant("POST"))以及等效的 Spring 示例:
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="direct:start"/>
<setHeader name="CamelHttpMethod">
<constant>POST</constant>
</setHeader>
<to uri="http://www.google.com"/>
<to uri="mock:results"/>
</route>
</camelContext>23.15. 使用客户端超时 - SO_TIMEOUT
请参阅 HttpSOTimeoutTest 单元测试。
23.16. 配置代理
HTTP 组件提供配置代理的方法。
from("direct:start")
.to("http://oldhost?proxyAuthHost=www.myproxy.com&proxyAuthPort=80");
还支持通过 proxyAuthUsername 和 proxyAuthPassword 选项进行代理身份验证。
23.16.1. 使用 URI 之外的代理设置
为了避免系统属性冲突,您只能从 CamelContext 或 URI 设置代理配置。
Java DSL :
context.getGlobalOptions().put("http.proxyHost", "172.168.18.9");
context.getGlobalOptions().put("http.proxyPort", "8080");Spring XML
<camelContext>
<properties>
<property key="http.proxyHost" value="172.168.18.9"/>
<property key="http.proxyPort" value="8080"/>
</properties>
</camelContext>
Camel 将首先设置 Java 系统或 CamelContext 属性的设置,如果提供,则端点代理选项。
因此,您可以使用端点选项覆盖系统属性。
另外,还有一个 http.proxyScheme 属性,您可以明确配置要使用的方案。
23.17. 配置 charset
如果您使用 POST 来发送数据,您可以使用 Exchange 属性配置 charset :
exchange.setProperty(Exchange.CHARSET_NAME, "ISO-8859-1");
23.17.1. 带有调度轮询的示例
这个示例每 10 秒轮询 Google 主页,并将页面写入文件 message.html :
from("timer://foo?fixedRate=true&delay=0&period=10000")
.to("http://www.google.com")
.setHeader(FileComponent.HEADER_FILE_NAME, "message.html")
.to("file:target/google");23.17.2. 端点 URI 中的 URI 参数
在本例中,我们有一个完整的 URI 端点,该端点只是您在 Web 浏览器中键入的内容。可以使用 和 字符作为分隔符来设置多个 URI 参数,就像您在 Web 浏览器中一样。Camel 在此处不做任何技巧。
// we query for Camel at the Google page
template.sendBody("http://www.google.com/search?q=Camel", null);23.17.3. 来自消息的 URI 参数
Map headers = new HashMap();
headers.put(Exchange.HTTP_QUERY, "q=Camel&lr=lang_en");
// we query for Camel and English language at Google
template.sendBody("http://www.google.com/search", null, headers);
在上面的标头值中,它不应 带有前缀 ?, 您可以像使用 & amp; char 那样分隔参数。
23.17.4. 获取响应代码
您可以通过 Exchange.HTTP_RESPONSE_CODE 从 Out 消息标头中获取 HTTP 响应代码。
Exchange exchange = template.send("http://www.google.com/search", new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(Exchange.HTTP_QUERY, constant("hl=en&q=activemq"));
}
});
Message out = exchange.getOut();
int responseCode = out.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);23.18. 禁用 Cookie
要禁用 Cookie,您可以通过添加此 URI 选项:httpClient.cookieSpec=ignoreCookies来设置 HTTP 客户端来忽略 Cookie
23.19. 带有流消息正文的基本身份验证
为了避免 NonRepeatableRequestException,您需要通过添加选项:authenticationPreemptive=true来进行 Preemptive Basic Authentication
23.20. 高级用法
如果您需要更多地控制 HTTP 制作者,您应该使用 HttpComponent,在其中设置各种类来为您提供自定义行为。
23.20.1. 为 HTTP 客户端设置 SSL
使用 JSSE 配置实用程序
HTTP 组件通过 Camel JSSE 配置实用程序 支持 SSL/TLS 配置。这个工具可大大减少您需要编写的组件特定代码,并在端点和组件级别进行配置。以下示例演示了如何将 实用程序与 HTTP 组件一起使用。
组件的编程配置
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");
SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
HttpComponent httpComponent = getContext().getComponent("https", HttpComponent.class);
httpComponent.setSslContextParameters(scp);
基于端点的 Spring DSL 配置
<camel:sslContextParameters
id="sslContextParameters">
<camel:keyManagers
keyPassword="keyPassword">
<camel:keyStore
resource="/users/home/server/keystore.jks"
password="keystorePassword"/>
</camel:keyManagers>
</camel:sslContextParameters>
<to uri="https://127.0.0.1/mail/?sslContextParameters=#sslContextParameters"/>
直接配置 Apache HTTP 客户端
基本上 camel-http 组件内置在 Apache HttpClient 之上。请参阅 SSL/TLS 自定义 以了解详细信息,或查看 org.apache.camel.component.http.HttpsServerTestSupport 单元测试基本类。
您还可以实施自定义 org.apache.camel.component.http.HttpClientConfigurer,以便在需要完全控制 http 客户端时进行一些配置。
但是,如果您只想 指定密钥存储和信任存储,您可以使用 Apache HTTP HttpClientConfigurer 完成此操作,例如:
KeyStore keystore = ...;
KeyStore truststore = ...;
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", 443, new SSLSocketFactory(keystore, "mypassword", truststore)));
然后,您需要创建一个实施 HttpClientConfigurer 的类,并注册 https 协议为每个示例提供密钥存储或信任存储。然后,从您的 camel 路由构建器类中,您可以将其 hook 如下所示:
HttpComponent httpComponent = getContext().getComponent("http", HttpComponent.class);
httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());
如果使用 Spring DSL 执行此操作,您可以使用 URI 指定 HttpClientConfigurer。例如:
<bean id="myHttpClientConfigurer" class="my.https.HttpClientConfigurer"> </bean> <to uri="https://myhostname.com:443/myURL?httpClientConfigurer=myHttpClientConfigurer"/>
只要您实施 HttpClientConfigurer 并如上所述配置密钥存储和信任存储,它就可以正常工作。
使用 HTTPS 验证进行购买
最终用户报告,他对 HTTPS 进行身份验证有问题。这个问题最终通过提供自定义的 org.apache.http.protocol.HttpContext 来解决这个问题:
- 1.为 HttpContexts 创建(Spring)工厂:
public class HttpContextFactory {
private String httpHost = "localhost";
private String httpPort = 9001;
private BasicHttpContext httpContext = new BasicHttpContext();
private BasicAuthCache authCache = new BasicAuthCache();
private BasicScheme basicAuth = new BasicScheme();
public HttpContext getObject() {
authCache.put(new HttpHost(httpHost, httpPort), basicAuth);
httpContext.setAttribute(ClientContext.AUTH_CACHE, authCache);
return httpContext;
}
// getter and setter
}- 2.在 Spring 应用上下文中声明 HttpContext:
<bean id="myHttpContext" factory-bean="httpContextFactory" factory-method="getObject"/>
- 3.在 http URL 中引用上下文:
<to uri="https://myhostname.com:443/myURL?httpContext=myHttpContext"/>
使用不同的 SSLContextParameters
HTTP 组件只支持每个组件的 org.apache.camel.support.jsse.SSLContextParameters 实例。如果您需要使用 2 个或更多不同的实例,则需要设置多个 HTTP 组件,如下所示。我们有 2 个组件,各自使用其自己的 sslContextParameters 属性实例。
<bean id="http-foo" class="org.apache.camel.component.http.HttpComponent"> <property name="sslContextParameters" ref="sslContextParams1"/> <property name="x509HostnameVerifier" ref="hostnameVerifier"/> </bean> <bean id="http-bar" class="org.apache.camel.component.http.HttpComponent"> <property name="sslContextParameters" ref="sslContextParams2"/> <property name="x509HostnameVerifier" ref="hostnameVerifier"/> </bean>
23.21. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 http 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-http-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 38 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.http.allow-java-serialized-object | 当请求使用 context-type=application/x-java-serialized-object 时,是否允许 java 序列化。默认情况下是关闭的。如果您启用它,Java 将把请求中的传入数据反序列化到 Java,这可能会带来潜在的安全风险。 | false | 布尔值 |
| camel.component.http.auth-caching-disabled | 禁用身份验证方案缓存。 | false | 布尔值 |
| camel.component.http.automatic-retries-disabled | 禁用自动请求恢复和重新执行。 | false | 布尔值 |
| camel.component.http.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.http.client-connection-manager | 要使用自定义和共享 HttpClientConnectionManager 来管理连接。如果已经进行了配置,则始终将此用于此组件创建的所有端点。选项是 org.apache.http.conn.HttpClientConnectionManager 类型。 | HttpClientConnectionManager | |
| camel.component.http.connect-timeout | 确定连接建立前的超时时间(毫秒)。超时值为零被解释为无限超时。超时值为零被解释为无限超时。负值解释为未定义(系统默认值)。 | -1 | 整数 |
| camel.component.http.connection-request-timeout | 从连接管理器请求连接时使用的超时时间(毫秒)。超时值为零被解释为无限超时。超时值为零被解释为无限超时。负值解释为未定义(系统默认值)。 | -1 | 整数 |
| camel.component.http.connection-state-disabled | 禁用连接状态跟踪。 | false | 布尔值 |
| camel.component.http.connection-time-to-live | 连接到实时的时间,单位为毫秒,默认值为始终保持 alive。 | Long | |
| camel.component.http.connections-per-route | 每个路由的最大连接数。 | 20 | 整数 |
| camel.component.http.content-compression-disabled | 禁用自动内容解压缩。 | false | 布尔值 |
| camel.component.http.cookie-management-disabled | 禁用状态(cookie)管理。 | false | 布尔值 |
| camel.component.http.cookie-store | 使用自定义 org.apache.http.client.CookieStore。默认情况下,使用 org.apache.http.impl.client.BasicCookieStore,它是一个仅限内存的 Cookie 存储。请注意,如果 bridgeEndpoint=true,则 Cookie 存储被强制为 noop cookie 存储,因为 Cookie 不能像我们刚刚桥接一样存储(例如作为代理)。选项是 org.apache.http.client.CookieStore 类型。 | CookieStore | |
| camel.component.http.copy-headers | 如果这个选项为 true,则 IN Exchange 标头将根据复制策略复制到 OUT Exchange 标头。把它设置为 false,仅允许仅包含 HTTP 响应中的标头(不传播 IN 标头)。 | true | 布尔值 |
| camel.component.http.default-user-agent-disabled | 如果用户未提供,则禁用此构建器设置的默认用户代理。 | false | 布尔值 |
| camel.component.http.enabled | 是否启用 http 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.http.header-filter-strategy | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
| camel.component.http.http-binding | 使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。选项是一个 org.apache.camel.http.common.HttpBinding 类型。 | HttpBinding | |
| camel.component.http.http-client-configurer | 使用自定义 HttpClientConfigurer 执行将使用的 HttpClient 的配置。选项是一个 org.apache.camel.component.http.HttpClientConfigurer 类型。 | HttpClientConfigurer | |
| camel.component.http.http-configuration | 使用共享 HttpConfiguration 作为基本配置。选项是一个 org.apache.camel.http.common.HttpConfiguration 类型。 | HttpConfiguration | |
| camel.component.http.http-context | 在执行请求时使用自定义 org.apache.http.protocol.HttpContext。选项是 org.apache.http.protocol.HttpContext 类型。 | HttpContext | |
| camel.component.http.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.http.max-total-connections | 连接的最大数量。 | 200 | 整数 |
| camel.component.http.proxy-auth-domain | 要使用的代理身份验证域。 | 字符串 | |
| camel.component.http.proxy-auth-host | 代理身份验证主机。 | 字符串 | |
| camel.component.http.proxy-auth-method | 要使用的代理身份验证方法。 | 字符串 | |
| camel.component.http.proxy-auth-nt-host | 与 NTML 搭配使用的代理身份验证域(workstation 名称)。 | 字符串 | |
| camel.component.http.proxy-auth-password | 代理身份验证密码。 | 字符串 | |
| camel.component.http.proxy-auth-port | 代理身份验证端口。 | 整数 | |
| camel.component.http.proxy-auth-username | 代理身份验证用户名。 | 字符串 | |
| camel.component.http.redirect-handling-disabled | 禁用自动重定向处理。 | false | 布尔值 |
| camel.component.http.response-payload-streaming-threshold | 这个阈值(以字节为单位)控制响应有效负载是否应该存储在内存中作为字节数组还是基于流处理。把它设置为 -1 以始终使用流模式。 | 8192 | 整数 |
| camel.component.http.skip-request-headers | 是否跳过将所有 Camel 标头映射为 HTTP 请求标头。如果需要包含来自 Camel 标头的数据,则这可以避免为 JVM 垃圾收集器解析带有许多对象分配的开销。 | false | 布尔值 |
| camel.component.http.skip-response-headers | 是否跳过将所有 HTTP 响应标头映射到 Camel 标头。如果 HTTP 标头不需要数据,这可以避免为 JVM 垃圾收集器使用多个对象分配解析开销。 | false | 布尔值 |
| camel.component.http.socket-timeout | 以毫秒为单位定义套接字超时,即等待数据的超时时间,或者以不同的方式设置,在两个连续的数据数据包之间处于最长期限不活跃状态。超时值为零被解释为无限超时。负值解释为未定义(系统默认值)。 | -1 | 整数 |
| camel.component.http.ssl-context-parameters | 使用 SSLContextParameters 配置安全性。重要: 每个 HttpComponent 仅支持 org.apache.camel.support.jsse.SSLContextParameters 的一个实例。如果您需要使用 2 个或更多不同的实例,您需要为每个实例定义一个新的 HttpComponent。选项是 org.apache.camel.support.jsse.SSLContextParameters 类型。 | SSLContextParameters | |
| camel.component.http.use-global-ssl-context-parameters | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| camel.component.http.x509-hostname-verifier | 使用自定义 X509HostnameVerifier,如 DefaultHostnameVerifier 或 NoopHostnameVerifier。选项是一个 javax.net.ssl.HostnameVerifier 类型。 | HostnameVerifier |
第 24 章 Infinispan
支持制作者和使用者
此组件允许您使用 Hot Rod procol 与 Infinispan 分布式数据网格 / 缓存进行交互。Infinispan 是一个高度可扩展的、高度可用的键/值数据存储和使用 Java 编写的数据网格平台。
如果使用 Maven,您必须将以下依赖项添加到 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-infinispan</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>24.1. URI 格式
infinispan://cacheName?[options]
生产者允许使用 HotRod 协议发送消息到远程缓存。消费者允许使用 HotRod 协议从远程缓存中侦听事件。
24.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
24.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
24.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
24.3. 组件选项
Infinispan 组件支持 26 个选项,它们列在下方。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 配置 (common) | 组件配置. | InfinispanRemoteConfiguration | |
| 主机 (通用) | 指定 Infinispan 实例上的缓存主机。 | 字符串 | |
| queryBuilder (common) | 指定查询构建器。 | InfinispanQueryBuilder | |
| 安全 (通用) | 定义我们是否连接到安全 Infinispan 实例。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| customListener (consumer) | 如果提供,则返回正在使用的自定义监听程序。 | InfinispanRemoteCustomListener | |
| eventTypes (consumer) | 指定要由 consumer.Multiple 事件注册的一组事件类型可以使用逗号分开。可能的事件类型是:CLIENT_CACHE_ENTRY_CREATED, CLIENT_CACHE_ENTRY_MODIFIED, CLIENT_CACHE_ENTRY_REMOVED, CLIENT_CACHE_ENTRY_EXPIRED, CLIENT_CACHE_FAILOVER。 | 字符串 | |
| defaultValue (producer) | 为某些制作者操作设置特定的默认值。 | 对象 | |
| Key (producer) | 为制作者操作设置特定的密钥。 | 对象 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| oldValue (producer) | 为某些制作者操作设置特定的旧值。 | 对象 | |
| 操作 (生成) | 要执行的操作。 Enum 值:
| PUT | InfinispanOperation |
| 值 (生成者) | 为制作者操作设置特定值。 | 对象 | |
| 密码 (安全) | 定义用于访问 infinispan 实例的密码。 | 字符串 | |
| saslMechanism (安全) | 定义 SASL Mechanism 以访问 infinispan 实例。 | 字符串 | |
| securityRealm ( security) | 定义安全域来访问 infinispan 实例。 | 字符串 | |
| securityServerName ( security) | 定义用于访问 infinispan 实例的安全服务器名称。 | 字符串 | |
| 用户名 (安全) | 定义用于访问 infinispan 实例的用户名。 | 字符串 | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| cacheContainer (高级) | Autowired 指定要连接的缓存容器。 | RemoteCacheManager | |
| cacheContainerConfiguration (高级) | Autowired CacheContainer 配置。如果未定义 cacheContainer,则使用。 | 配置 | |
| configurationProperties (高级) | CacheManager 的实施特定属性。 | map | |
| configurationUri (高级) | CacheManager 的特定实施 URI。 | 字符串 | |
| 标记 (高级) | 在每个缓存调用中默认应用 org.infinispan.client.hotrod.Flag 的逗号分隔列表。 | 字符串 | |
| 重新映射( 高级) | 设置要在计算操作中使用的特定重新映射。 | BiFunction | |
| 结果标头 (高级) | 将操作结果存储在标头中,而不是邮件正文中。默认情况下,resultHeader == null 和查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值用作用于存储查询结果的标头名称,并保留原始消息正文。这个值可以被名为 CamelInfinispanOperationResultHeader 的消息标头中覆盖。 | 字符串 |
24.4. 端点选项
Infinispan 端点使用 URI 语法进行配置:
infinispan:cacheName
使用以下路径和查询参数:
24.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| cacheName (common) | 需要使用的缓存的名称。使用 current 使用当前配置的缓存管理器中的现有缓存名称。或者将 default 用于默认的缓存管理器名称。 | 字符串 |
24.4.2. 查询参数(26 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 主机 (通用) | 指定 Infinispan 实例上的缓存主机。 | 字符串 | |
| queryBuilder (common) | 指定查询构建器。 | InfinispanQueryBuilder | |
| 安全 (通用) | 定义我们是否连接到安全 Infinispan 实例。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| customListener (consumer) | 如果提供,则返回正在使用的自定义监听程序。 | InfinispanRemoteCustomListener | |
| eventTypes (consumer) | 指定要由 consumer.Multiple 事件注册的一组事件类型可以使用逗号分开。可能的事件类型是:CLIENT_CACHE_ENTRY_CREATED, CLIENT_CACHE_ENTRY_MODIFIED, CLIENT_CACHE_ENTRY_REMOVED, CLIENT_CACHE_ENTRY_EXPIRED, CLIENT_CACHE_FAILOVER。 | 字符串 | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| defaultValue (producer) | 为某些制作者操作设置特定的默认值。 | 对象 | |
| Key (producer) | 为制作者操作设置特定的密钥。 | 对象 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| oldValue (producer) | 为某些制作者操作设置特定的旧值。 | 对象 | |
| 操作 (生成) | 要执行的操作。 Enum 值:
| PUT | InfinispanOperation |
| 值 (生成者) | 为制作者操作设置特定值。 | 对象 | |
| 密码 (安全) | 定义用于访问 infinispan 实例的密码。 | 字符串 | |
| saslMechanism (安全) | 定义 SASL Mechanism 以访问 infinispan 实例。 | 字符串 | |
| securityRealm ( security) | 定义安全域来访问 infinispan 实例。 | 字符串 | |
| securityServerName ( security) | 定义用于访问 infinispan 实例的安全服务器名称。 | 字符串 | |
| 用户名 (安全) | 定义用于访问 infinispan 实例的用户名。 | 字符串 | |
| cacheContainer (高级) | Autowired 指定要连接的缓存容器。 | RemoteCacheManager | |
| cacheContainerConfiguration (高级) | Autowired CacheContainer 配置。如果未定义 cacheContainer,则使用。 | 配置 | |
| configurationProperties (高级) | CacheManager 的实施特定属性。 | map | |
| configurationUri (高级) | CacheManager 的特定实施 URI。 | 字符串 | |
| 标记 (高级) | 在每个缓存调用中默认应用 org.infinispan.client.hotrod.Flag 的逗号分隔列表。 | 字符串 | |
| 重新映射( 高级) | 设置要在计算操作中使用的特定重新映射。 | BiFunction | |
| 结果标头 (高级) | 将操作结果存储在标头中,而不是邮件正文中。默认情况下,resultHeader == null 和查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值用作用于存储查询结果的标头名称,并保留原始消息正文。这个值可以被名为 CamelInfinispanOperationResultHeader 的消息标头中覆盖。 | 字符串 |
24.5. Camel 操作
本节列出所有可用的操作,以及它们的标题信息。
表 24.1. 表 1。放置操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.PUT | 在缓存中放置一个键/值对,可以选择使用过期 |
| InfinispanOperation.PUTASYNC | 异步在缓存中放置一个键/值对,可以选择使用过期 |
| InfinispanOperation.PUTIFABSENT | 如果缓存不存在,在缓存中放置一个键/值对,可以选择使用过期 |
| InfinispanOperation.PUTIFABSENTASYNC | 如果缓存中异步放置一个键/值对(如果其不存在),可以选择使用过期 |
必需的标头 :
- CamelInfinispanKey
- CamelInfinispanValue
可选的 Headers :
- CamelInfinispanLifespanTime
- CamelInfinispanLifespanTimeUnit
- CamelInfinispanMaxIdleTime
- CamelInfinispanMaxIdleTimeUnit
结果标题 :
- CamelInfinispanOperationResult
表 24.2. 表 2。放置所有操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.PUTALL | 在缓存中添加多个条目,可以选择过期 |
| CamelInfinispanOperation.PUTALLASYNC | 异步向缓存中添加多个条目,可以选择使用过期 |
必需的标头 :
- CamelInfinispanMap
可选的 Headers :
- CamelInfinispanLifespanTime
- CamelInfinispanLifespanTimeUnit
- CamelInfinispanMaxIdleTime
- CamelInfinispanMaxIdleTimeUnit
表 24.3. 表 3获取操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.GET | 从缓存检索与特定密钥关联的值 |
| InfinispanOperation.GETORDEFAULT | 从缓存中检索与特定密钥关联的值或默认值 |
必需的标头 :
- CamelInfinispanKey
表 24.4. 表 4包含密钥操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.CONTAINSKEY | 确定缓存是否包含特定的密钥 |
所需的标头
- CamelInfinispanKey
结果标题
- CamelInfinispanOperationResult
表 24.5. 表 5包含值操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.CONTAINSVALUE | 决定缓存是否包含特定值 |
必需的标头 :
- CamelInfinispanKey
表 24.6. 表 6删除操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.REMOVE | 从缓存中删除条目,只有在值与给定值匹配时才有选择 |
| InfinispanOperation.REMOVEASYNC | 异步从缓存中删除条目,只有在值与给定值匹配时才有选择 |
必需的标头 :
- CamelInfinispanKey
可选的 Headers :
- CamelInfinispanValue
结果标题 :
- CamelInfinispanOperationResult
表 24.7. 表 7.替换操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.REPLACE | 在有条件的情况下将缓存中的条目(可选)替换为过期 |
| InfinispanOperation.REPLACEASYNC | 异步地将缓存中的条目(可选)替换为过期 |
必需的标头 :
- CamelInfinispanKey
- CamelInfinispanValue
- CamelInfinispanOldValue
可选的 Headers :
- CamelInfinispanLifespanTime
- CamelInfinispanLifespanTimeUnit
- CamelInfinispanMaxIdleTime
- CamelInfinispanMaxIdleTimeUnit
结果标题 :
- CamelInfinispanOperationResult
表 24.8. 表 8。清除操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.CLEAR | 清除缓存 |
| InfinispanOperation.CLEARASYNC | 异步清除缓存 |
表 24.9. 表 9。大小操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.SIZE | 返回缓存中的条目数 |
结果标题
- CamelInfinispanOperationResult
表 24.10. 表 10。stats 操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.STATS | 返回缓存的统计信息 |
结果标题 :
- CamelInfinispanOperationResult
表 24.11. 表11:查询操作
| 操作名称 | 描述 |
|---|---|
| InfinispanOperation.QUERY | 在缓存上执行查询 |
必需的标头 :
- CamelInfinispanQueryBuilder
结果标题 :
- CamelInfinispanOperationResult
默认情况下,put (key, value)和 remove (key)等写方法不会返回前面的值。
24.6. 消息标头
| 名称 | 默认值 | 类型 | Context | 描述 |
|---|---|---|---|---|
| CamelInfinispanCacheName |
| 字符串 | 共享 | 参与操作或事件的缓存。 |
| CamelInfinispanOperation |
| InfinispanOperation | 制作者 | 要执行的操作。 |
| CamelInfinispanMap |
| map | 制作者 | CamelInfinispanOperationPutAll 操作时要使用的映射 |
| CamelInfinispanKey |
| 对象 | 共享 | 在生成事件时执行操作的密钥。 |
| CamelInfinispanValue |
| 对象 | 制作者 | 用于操作的值。 |
| CamelInfinispanEventType |
| 字符串 | 消费者 | 接收的事件的类型。 |
| CamelInfinispanLifespanTime |
| long | 制作者 | 缓存内值的 Lifespan 时间。负值解释为 infinity。 |
| CamelInfinispanTimeUnit |
| 字符串 | 制作者 | 条目生命周期时间的生存时间单位. |
| CamelInfinispanMaxIdleTime |
| long | 制作者 | 在条目被视为过期前允许闲置的最大时间。 |
| CamelInfinispanMaxIdleTimeUnit |
| 字符串 | 制作者 | 条目的时间范围 Max Idle Time。 |
| CamelInfinispanQueryBuilder | null | InfinispanQueryBuilder | 制作者 | 用于 QUERY 命令的 QueryBuilde (如果没有将命令默认为 InifinispanConfiguration) |
| CamelInfinispanOperationResultHeader | null | 字符串 | 制作者 | 将操作结果存储在标头中,而不是邮件正文中 |
24.7. 例子
将键/值放在命名的缓存中:
from("direct:start") .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUT) (1) .setHeader(InfinispanConstants.KEY).constant("123") (2) .to("infinispan:myCacheName&cacheContainer=#cacheContainer"); (3)其中,
- 1 - 设置要执行的操作
- 2 - 设置用于识别缓存中元素的密钥
3 - 使用 registry 中配置的缓存管理器
cacheContainer将元素放在名为myCacheName的缓存中可以在条目过期前配置生命周期和/或空闲时间,并从缓存中驱除,例如:
from("direct:start") .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GET) .setHeader(InfinispanConstants.KEY).constant("123") .setHeader(InfinispanConstants.LIFESPAN_TIME).constant(100L) (1) .setHeader(InfinispanConstants.LIFESPAN_TIME_UNIT.constant(TimeUnit.MILLISECONDS.toString()) (2) .to("infinispan:myCacheName");
其中,
- 1 - 设置条目的寿命
- 2 - 为 lifespan 设置时间单位
queries
from("direct:start")
.setHeader(InfinispanConstants.OPERATION, InfinispanConstants.QUERY)
.setHeader(InfinispanConstants.QUERY_BUILDER, new InfinispanQueryBuilder() {
@Override
public Query build(QueryFactory<Query> qf) {
return qf.from(User.class).having("name").like("%abc%").build();
}
})
.to("infinispan:myCacheName?cacheContainer=#cacheManager") ;
域对象的 .proto 描述符必须注册到远程 Data Grid 服务器,请参阅官方 Infinispan 文档中的 Remote Query Example。
自定义 Listeners
from("infinispan://?cacheContainer=#cacheManager&customListener=#myCustomListener")
.to("mock:result");
myCustomListener 实例必须存在,Camel 应该可以从 Registry 中查找它。我们鼓励用户扩展 org.apache.camel.component.infinispan.remote.InfinispanRemoteCustomListener 类,并使用 @ClientListener 标注生成的类,该类可以在 org.infinispan.client.hotrod.annotation 中找到。
24.8. 使用基于 Infinispan 的幂等 存储库
在本节中,我们将使用基于 Infinispan 的幂等存储库。
Java 示例
InfinispanRemoteConfiguration conf = new InfinispanRemoteConfiguration(); (1)
conf.setHosts("localhost:1122")
InfinispanRemoteIdempotentRepository repo = new InfinispanRemoteIdempotentRepository("idempotent"); (2)
repo.setConfiguration(conf);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() {
from("direct:start")
.idempotentConsumer(header("MessageID"), repo) (3)
.to("mock:result");
}
});其中,
- 1 - 配置缓存
- 2 - 配置存储库 bean
- 3 - 将存储库设置为路由
XML 示例
<bean id="infinispanRepo" class="org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository" destroy-method="stop">
<constructor-arg value="idempotent"/> (1)
<property name="configuration"> (2)
<bean class="org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration">
<property name="hosts" value="localhost:11222"/>
</bean>
</property>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start" />
<idempotentConsumer messageIdRepositoryRef="infinispanRepo"> (3)
<header>MessageID</header>
<to uri="mock:result" />
</idempotentConsumer>
</route>
</camelContext>
其中,
- 1 - 设置存储库将使用的缓存名称
- 2 - 配置存储库 bean
- 3 - 将存储库设置为路由
24.9. 使用基于 Infinispan 的聚合存储库
在本节中,我们将使用基于 Infinispan 的聚合存储库。
Java 示例
InfinispanRemoteConfiguration conf = new InfinispanRemoteConfiguration(); (1)
conf.setHosts("localhost:1122")
InfinispanRemoteAggregationRepository repo = new InfinispanRemoteAggregationRepository(); (2)
repo.setCacheName("aggregation");
repo.setConfiguration(conf);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() {
from("direct:start")
.aggregate(header("MessageID"))
.completionSize(3)
.aggregationRepository(repo) (3)
.aggregationStrategyRef("myStrategy")
.to("mock:result");
}
});其中,
- 1 - 配置缓存
- 2 - 创建存储库 bean
- 3 - 将存储库设置为路由
XML 示例
<bean id="infinispanRepo" class="org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository" destroy-method="stop">
<constructor-arg value="aggregation"/> (1)
<property name="configuration"> (2)
<bean class="org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration">
<property name="hosts" value="localhost:11222"/>
</bean>
</property>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start" />
<aggregate strategyRef="myStrategy"
completionSize="3"
aggregationRepositoryRef="infinispanRepo"> (3)
<correlationExpression>
<header>MessageID</header>
</correlationExpression>
<to uri="mock:result"/>
</aggregate>
</route>
</camelContext>
其中,
- 1 - 设置存储库将使用的缓存名称
- 2 - 配置存储库 bean
- 3 - 将存储库设置为路由
随着 Infinispan 11 的发布,需要在创建的任何缓存上设置编码配置。这对消耗事件也是如此。如需更多信息,请参阅官方 Infinispan 文档中的 Data Encoding 和 MediaTypes。
24.10. Spring Boot Auto-Configuration
在 Spring Boot 中使用 infinispan 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-infinispan-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 23 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.infinispan.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.infinispan.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.infinispan.cache-container | 指定要连接的缓存容器。选项是一个 org.infinispan.client.hotrod.RemoteCacheManager 类型。 | RemoteCacheManager | |
| camel.component.infinispan.cache-container-configuration | CacheContainer 配置。如果未定义 cacheContainer,则使用。选项是一个 org.infinispan.client.hotrod.configuration.Configuration 类型。 | 配置 | |
| camel.component.infinispan.configuration | 组件配置.选项是 org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration 类型。 | InfinispanRemoteConfiguration | |
| camel.component.infinispan.configuration-properties | CacheManager 的实施特定属性。 | map | |
| camel.component.infinispan.configuration-uri | CacheManager 的特定实施 URI。 | 字符串 | |
| camel.component.infinispan.custom-listener | 如果提供,则返回正在使用的自定义监听程序。选项是 org.apache.camel.component.infinispan.remote.InfinispanRemoteCustomListener 类型。 | InfinispanRemoteCustomListener | |
| camel.component.infinispan.enabled | 是否启用 infinispan 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.infinispan.event-types | 指定要由 consumer.Multiple 事件注册的一组事件类型可以使用逗号分开。可能的事件类型是:CLIENT_CACHE_ENTRY_CREATED, CLIENT_CACHE_ENTRY_MODIFIED, CLIENT_CACHE_ENTRY_REMOVED, CLIENT_CACHE_ENTRY_EXPIRED, CLIENT_CACHE_FAILOVER。 | 字符串 | |
| camel.component.infinispan.flags | 在每个缓存调用中默认应用 org.infinispan.client.hotrod.Flag 的逗号分隔列表。 | 字符串 | |
| camel.component.infinispan.hosts | 指定 Infinispan 实例上的缓存主机。 | 字符串 | |
| camel.component.infinispan.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.infinispan.operation | 要执行的操作。 | InfinispanOperation | |
| camel.component.infinispan.password | 定义用于访问 infinispan 实例的密码。 | 字符串 | |
| camel.component.infinispan.query-builder | 指定查询构建器。选项是 org.apache.camel.component.infinispan.InfinispanQueryBuilder 类型。 | InfinispanQueryBuilder | |
| camel.component.infinispan.remapping-function | 设置要在计算操作中使用的特定重新映射。选项是一个 java.util.function.BiFunction 类型。 | BiFunction | |
| camel.component.infinispan.result-header | 将操作结果存储在标头中,而不是邮件正文中。默认情况下,resultHeader == null 和查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值用作用于存储查询结果的标头名称,并保留原始消息正文。这个值可以被名为 CamelInfinispanOperationResultHeader 的消息标头中覆盖。 | 字符串 | |
| camel.component.infinispan.sasl-mechanism | 定义 SASL Mechanism 以访问 infinispan 实例。 | 字符串 | |
| camel.component.infinispan.secure | 定义我们是否连接到安全 Infinispan 实例。 | false | 布尔值 |
| camel.component.infinispan.security-realm | 定义安全域来访问 infinispan 实例。 | 字符串 | |
| camel.component.infinispan.security-server-name | 定义用于访问 infinispan 实例的安全服务器名称。 | 字符串 | |
| camel.component.infinispan.username | 定义用于访问 infinispan 实例的用户名。 | 字符串 |
第 25 章 JIRA
支持制作者和使用者
JIRA 组件通过封装 Atlassian 的 REST Java Client for JIRA 与 JIRA API 交互。它目前为新的问题和新注释提供轮询。它还能够创建新问题、添加注释、更改问题、添加/删除监视器、添加附加和转换问题状态。
此端点依赖于简单的轮询,而不是 Webhook。原因包括:
- 可靠性/stability的关注
- 我们轮询的有效负载类型通常不大(另外,API 中提供分页)
- 需要支持在无法公开访问的、webhook 失败的应用程序
请注意,JIRA API 是非常快速的。因此,此组件可轻松扩展,以提供额外的交互。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jira</artifactId>
<version>${camel-version}</version>
</dependency>25.1. URI 格式
jira://type[?options]
JIRA 类型接受以下操作:
对于消费者:
- newIssues:仅检索路由启动后的新问题
- newComments:仅在路由启动后检索新注释
- watchUpdates: 根据提供的 jql 检索更新的字段/问题
对于制作者:
- addIssue:添加问题
- addComment:对给定问题添加注释
- attach :在给定问题中添加附加
- deleteIssue:删除给定问题
- updateIssue:更新给定问题的字段
- transitionIsue:转换给定问题的状态
- watchers:添加/删除给定问题的观察者
当 JIRA 可以完全自定义时,您必须确保项目和工作流存在字段 ID,因为它们可以在不同的 JIRA 服务器间有所变化。
25.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
25.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
25.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
25.3. 组件选项
JIRA 组件支持 12 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| delay (common) | 下次轮询所经过的时间(毫秒)。 | 6000 | 整数 |
| jiraUrl (common) | 需要 JIRA 服务器 url,例如: | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 配置 (高级) | 使用共享基础 jira 配置。 | JiraConfiguration | |
| accessToken (security) | (仅限 OAuth)通过 JIRA 服务器生成的访问令牌。 | 字符串 | |
| consumerKey (security) | (仅限 OAuth) JIRA 设置中的使用者密钥。 | 字符串 | |
| 密码 (安全) | (仅限基本身份验证)用于向 JIRA 服务器进行身份验证的密码。仅在使用用户名基本身份验证时使用。 | 字符串 | |
| privateKey (security) | (仅限 OAuth)客户端生成的私钥来加密与服务器的对话。 | 字符串 | |
| 用户名 (安全) | (仅限基本身份验证)用于向 JIRA 服务器进行身份验证的用户名。仅在 JIRA 服务器上没有启用 OAuth 时才使用。如果没有设置 username 和 OAuth 令牌参数,请不要设置它们,则用户名基本身份验证具有优先权。 | 字符串 | |
| 验证代码 (安全) | (仅限 OAuth)授权流程的第一步中生成的 JIRA 验证代码。 | 字符串 |
25.4. 端点选项
JIRA 端点使用 URI 语法进行配置:
jira:type
使用以下路径和查询参数:
25.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 类型 (common) | 要执行的操作.消费者:NewIssues、NewComments.制作者:AddIssue, AttachFile, DeleteIssue, TransitionIssue, UpdateIssue, Watchers.如需更多信息,请参阅这个类 javadoc 描述。 Enum 值:
| JiraType |
25.4.2. 查询参数(16 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| delay (common) | 下次轮询所经过的时间(毫秒)。 | 6000 | 整数 |
| jiraUrl (common) | 需要 JIRA 服务器 url,例如: | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| jql (consumer) | JQL 是 JIRA 的查询语言,允许您检索您想要的数据。例如 jql=project=MyProject Where MyProject 是 JIRA 中的产品密钥。使用 RAW ()并在其中设置 JQL 非常重要,以防止相机解析它,例如: RAW (project in (MYP, COM) AND resolution = Unresolved)。 | 字符串 | |
| maxResults (consumer) | 要搜索的最大问题数。 | 50 | 整数 |
| sendOnlyUpdatedField (consumer) | 在交换正文或发布对象中仅发送已更改字段的指示符。默认情况下,消费者仅发送更改的字段。 | true | 布尔值 |
| watchedFields (consumer) | 要监视更改的字段的逗号分隔列表。status,Priority 是默认值。 | status,Priority | 字符串 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| accessToken (security) | (仅限 OAuth)通过 JIRA 服务器生成的访问令牌。 | 字符串 | |
| consumerKey (security) | (仅限 OAuth) JIRA 设置中的使用者密钥。 | 字符串 | |
| 密码 (安全) | (仅限基本身份验证)用于向 JIRA 服务器进行身份验证的密码。仅在使用用户名基本身份验证时使用。 | 字符串 | |
| privateKey (security) | (仅限 OAuth)客户端生成的私钥来加密与服务器的对话。 | 字符串 | |
| 用户名 (安全) | (仅限基本身份验证)用于向 JIRA 服务器进行身份验证的用户名。仅在 JIRA 服务器上没有启用 OAuth 时才使用。如果没有设置 username 和 OAuth 令牌参数,请不要设置它们,则用户名基本身份验证具有优先权。 | 字符串 | |
| 验证代码 (安全) | (仅限 OAuth)授权流程的第一步中生成的 JIRA 验证代码。 | 字符串 |
25.5. 客户端工厂
您可以将 JIRARestClientFactory 绑定到 registry 中名为 JIRARestClientFactory,使其在 JIRA 端点中自动设置。
25.6. 身份验证
Camel-jira 支持 基本身份验证 和 OAuth 3 legged 身份验证。
我们建议尽可能使用 OAuth,因为它为您的用户和系统提供最佳安全性。
25.6.1. 基本身份验证要求:
- 用户名和密码
25.6.2. OAuth 身份验证要求:
按照 JIRA OAuth 文档中的 教程生成客户端私钥、消费者密钥、验证代码和访问令牌。
- 私钥,在您的系统中本地生成。
- 由 JIRA 服务器生成的验证代码。
- consumer 键,在 JIRA 服务器设置中设置。
- 由 JIRA 服务器生成的访问令牌。
25.7. JQL
JQL URI 选项由两个消费者端点使用。理论上,诸如"project 键"等项目,也可以是 URI 选项本身。但是,由于要求使用 JQL,消费者变得更为灵活、更强大。
至少,消费者需要以下内容:
jira://[type]?[required options]&jql=project=[project key]
需要注意的一点是,newIssues 消费者会自动将 JQL 设置为:
-
将
ORDER BY key desc附加到 JQL -
prepend
id > latestIssueId来检索在 camel 路由启动后添加的问题。
这是为了优化启动处理,而不必对项目中的每一个问题进行索引。
另一个值得注意的是,newComments 消费者必须对项目中的每一个问题 和注释 进行索引。因此,对于大型项目 , 优化 JQL 表达式非常重要。例如,JIRA Toolkit Plugin 在查询中包含 "Number of comments" custom field to use '"Number of comments" > 0'。另外,尝试根据状态(status=Open)最小化,增加轮询延迟等。例如:
jira://[type]?[required options]&jql=RAW(project=[project key] AND status in (Open, \"Coding In Progress\") AND \"Number of comments\">0)"
25.8. 操作
在使用 JIRA 操作时,请参阅要设置的所需标头列表。producer 的 author 字段会自动设置为 JIRA 端的经过身份验证的用户。
如果没有设置任何必填字段,则抛出 IllegalArgumentException。
对于字段,需要 id 的操作,如: issue type, priority, transition。检查 jira 项目上的有效 id,因为它们可能会在 jira 安装和项目工作流上有所不同。
25.9. AddIssue
必需:
-
ProjectKey:项目密钥,例如:CAMEL、HHH、MYP。 -
IssueTypeId或IssueTypeName: 问题类型 ID 或问题类型的名称,您可以在http://jira_server/rest/api/2/issue/createmeta?projectKeys=SAMPLE_KEY中看到有效列表。 -
IssueSummary:问题的摘要。
可选:
-
IssueAssignee:分配用户 -
IssuePriorityId或IssuePriorityName:问题的优先级,您可以在http://jira_server/rest/api/2/priority中看到有效列表。 -
IssueComponents:带有有效组件名称的字符串列表。 -
IssueWatchersAdd:一个字符串列表,其中包含要添加到 watcher 列表中的用户名。 -
IssueDescription:问题的描述。
25.10. AddComment
必需:
-
IssueKey:问题密钥标识符。 - 交换正文是描述。
25.11. attach
每个调用仅应附加一个文件。
必需:
-
IssueKey:问题密钥标识符。 -
交换的正文应当是
文件类型
25.12. DeleteIssue
必需:
-
IssueKey:问题密钥标识符。
25.13. TransitionIsue
必需:
-
IssueKey:问题密钥标识符。 -
IssueTransitionId:问题转换 ID。 - 交换正文是描述。
25.14. UpdateIssue
-
IssueKey:问题密钥标识符。 -
IssueTypeId或IssueTypeName: 问题类型 ID 或问题类型的名称,您可以在http://jira_server/rest/api/2/issue/createmeta?projectKeys=SAMPLE_KEY中看到有效列表。 -
IssueSummary:问题的摘要。 -
IssueAssignee:分配用户 -
IssuePriorityId或IssuePriorityName:问题的优先级,您可以在http://jira_server/rest/api/2/priority中看到有效列表。 -
IssueComponents:带有有效组件名称的字符串列表。 -
IssueDescription:问题的描述。
25.15. watcher
-
IssueKey:问题密钥标识符。 -
IssueWatchersAdd:一个字符串列表,其中包含要添加到 watcher 列表中的用户名。 -
IssueWatchersRemove:一个字符串列表,其中包含要从 watcher 列表中删除的用户名。
25.16. WatchUpdates (consumer)
-
watchedFieldsComma separated 项列表,用于监视更改 i.eStatus,Priority,Assignee,Components等。 -
sendOnlyUpdatedFieldBy 默认只发送 changed 字段作为正文。
所有消息还包含以下标头,它们添加了有关更改的额外信息:
-
issueKey:更新的问题的密钥 -
changed: 更新字段的名称(i.e Status) -
watchedIssues: 在更新时监视的所有问题键列表
25.17. Spring Boot Auto-Configuration
在 Spring Boot 中使用 jira 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jira-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 13 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.jira.access-token | (仅限 OAuth)通过 JIRA 服务器生成的访问令牌。 | 字符串 | |
| camel.component.jira.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.jira.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.jira.configuration | 使用共享基础 jira 配置。选项是 org.apache.camel.component.jira.JIRAConfiguration 类型。 | JiraConfiguration | |
| camel.component.jira.consumer-key | (仅限 OAuth) JIRA 设置中的使用者密钥。 | 字符串 | |
| camel.component.jira.delay | 下次轮询所经过的时间(毫秒)。 | 6000 | 整数 |
| camel.component.jira.enabled | 是否启用 jira 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.jira.jira-url | JIRA 服务器 url,例如: http://my_jira.com:8081/。 | 字符串 | |
| camel.component.jira.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.jira.password | (仅限基本身份验证)用于向 JIRA 服务器进行身份验证的密码。仅在使用用户名基本身份验证时使用。 | 字符串 | |
| camel.component.jira.private-key | (仅限 OAuth)客户端生成的私钥来加密与服务器的对话。 | 字符串 | |
| camel.component.jira.username | (仅限基本身份验证)用于向 JIRA 服务器进行身份验证的用户名。仅在 JIRA 服务器上没有启用 OAuth 时才使用。如果没有设置 username 和 OAuth 令牌参数,请不要设置它们,则用户名基本身份验证具有优先权。 | 字符串 | |
| camel.component.jira.verification-code | (仅限 OAuth)授权流程的第一步中生成的 JIRA 验证代码。 | 字符串 |
第 26 章 JMS
支持制作者和使用者
此组件允许消息发送到 JMS 队列或主题。它使用 Spring 的 JMS 支持声明式事务,包括 Spring 的 JmsTemplate 用于 发送和接收消息ListenerContainer。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jms</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>
如果使用 ActiveMQ
,如果您正在使用 Apache ActiveMQ,您应该像 ActiveMQ 进行了优化时首选 ActiveMQ 组件。此页面上的所有选项和示例也对 ActiveMQ 组件有效。
如果您使用 JMS 的事务处理并缓存
,请参阅下面的部分交易和 缓存级别,因为它可能会影响性能。
请求/通过 JMS
,确保阅读本页中进一步的 Request-reply 一节,以获得有关请求/恢复的重要备注,因为 Camel 提供了多个选项来配置性能和集群环境。
26.1. URI 格式
jms:[queue:|topic:]destinationName[?options]
其中 destinationName 是 JMS 队列或主题名称。默认情况下,destinationName 解释为队列名称。例如,要连接到队列,FOO.BAR 使用:
jms:FOO.BAR
如果愿意,您可以包含可选的 queue: 前缀:
jms:queue:FOO.BAR
要连接到某个主题,您必须 包含 topic: 前缀。例如,要连接到主题,Stocks .Prices,请使用:
jms:topic:Stocks.Prices
您可以使用以下格式将查询选项附加到 URI 中,
?option=value&option=value&…
26.1.1. 使用 ActiveMQ
JMS 组件重复使用 Spring 2 的 JmsTemplate 来发送消息。这不是适用于非J2EE 容器的理想选择,通常需要 JMS 提供程序中的一些缓存来避免 性能不佳。
如果要将 Apache ActiveMQ 用作您的消息代理,则建议您进行以下操作之一:
- 使用 ActiveMQ 组件,该组件已优化为高效地使用 ActiveMQ
-
在 ActiveMQ 中使用
PoolingConnectionFactory。
26.1.2. 事务和缓存级别
如果您使用消息并使用事务(transacted=true),则缓存级别的默认设置可能会影响性能。
如果您使用 XA 事务,那么您无法缓存,因为它可能会导致 XA 事务无法正常工作。
如果您不使用 XA,则应考虑缓存,因为它会加快性能,如设置 cacheLevelName=CACHE_CONSUMER。
cacheLevelName 的默认设置是 CACHE_AUTO。这个默认自动检测模式,并相应地设置缓存级别:
-
CACHE_CONSUMERiftransacted=false -
CACHE_NONEiftransacted=true
因此,您可以说默认设置比较保守。如果您使用非 XA 事务,请考虑使用 cacheLevelName=CACHE_CONSUMER。
26.1.3. 持久化订阅
如果要使用持久主题订阅,则需要指定 clientId 和 durableSubscriptionName。clientId 的值必须是唯一的,且只能供整个网络中的单个 JMS 连接实例使用。您可能更喜欢使用 Virtual Topics 来避免此限制。此处,有关可持久化消息传递的更多背景信息.
26.1.4. 消息标头映射
在使用消息标头时,JMS 规范指出标头名称必须是有效的 Java 标识符。因此,尝试将标头命名为有效的 Java 标识符。执行此操作的一个优点是,您可以在 JMS Selector 中使用您的标头(其 SQL92 语法强制使用标头的 Java 标识符语法)。
默认使用映射标头名称的简单策略。该策略是替换标头名称中的任何句点和连字符,如下方所示,并从通过线发送的 JMS 消息恢复标头名称时反向替换。这意味着什么?在 bean 组件上调用的更多方法名称,不再丢失 File 组件的文件名,以此类推。
Camel 中接受标头名称的当前标头名称策略如下:
- 点由 'DOT' 替代,当 Camel 使用消息时,会撤销替换点
- hyphen 被 'HYPHEN' 替代,当 Camel 使用消息时替换会被撤销
您可以在 JMS 端点上配置许多不同的属性,它映射到 JMSConfiguration 对象上的属性。
映射到这些属性的 Spring JMS
很多属性映射到 Spring JMS 上的属性,Camel 用来发送和接收信息。因此,您可以通过咨询相关的 Spring 文档来获取这些属性的更多信息。
26.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
26.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
26.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
26.3. 组件选项
JMS 组件支持 98 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| clientID (common) | 设置要使用的 JMS 客户端 ID。请注意,这个值(如果指定)必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只需要持久化的主题订阅。如果使用 Apache ActiveMQ,您可能需要改为使用虚拟主题。 | 字符串 | |
| ConnectionFactory (common) | 要使用的连接工厂。必须在组件或端点上配置连接工厂。 | ConnectionFactory | |
| disableReplyTo (common) | 指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目的地发送回复。如果您希望 Camel 从路由使用,并且您不希望 Camel 自动发送回复消息,则可使用此选项,因为代码中的另一个组件处理回复消息。如果您要将 Camel 用作不同消息代理之间的代理,并且希望将消息从一个系统路由到另一个系统,您也可以使用这个选项。 | false | 布尔值 |
| durableSubscriptionName (common) | 用于指定持久主题订阅的持久订阅者名称。还必须配置 clientId 选项。 | 字符串 | |
| jmsMessageType (common) | 允许您强制使用特定的 javax.jms.Message 实施来发送 JMS 消息。可能的值有:Bytes, Map, Object, Stream, Text。默认情况下,Camel 将决定从 In body 类型中使用的 JMS 消息类型。这个选项允许您指定它。 Enum 值:
| JmsMessageType | |
| replyTo (common) | 提供明确的 ReplyTo destination (会覆盖消费者中的 Message.getJMSReplyTo ()的任何传入值)。 | 字符串 | |
| testConnectionOnStartup (common) | 指定是否在启动时测试连接。这可确保 Camel 启动所有 JMS 用户具有与 JMS 代理的有效连接。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS 制作者也经过测试。 | false | 布尔值 |
| acknowledgementModeName (consumer) | JMS 确认名称,即 SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE。 Enum 值:
| AUTO_ACKNOWLEDGE | 字符串 |
| artemisConsumerPriority (consumer) | 通过使用者优先级,您可以确保高优先级消费者在信息处于活动状态时收到信息。通常,连接到队列的活动消费者以轮循方式接收来自它的消息。当使用消费者优先级时,如果存在多个具有同样高优先级的活跃使用者,则消息将按循环发送。只有高优先级消费者没有可用的信用时,消息才会降低优先级消费者,或者那些高优先级消费者接受消息(例如,因为它不符合与消费者关联的任何选择器标准)。 | int | |
| asyncConsumer (consumer) | JmsConsumer 异步处理 Exchange。如果启用,JmsConsumer 可能会从 JMS 队列中选取下一个消息,而前面的消息被异步处理(通过异步路由引擎)。这意味着消息可能会按顺序处理,而不是严格处理。如果禁用(默认),则交换在 JmsConsumer 将从 JMS 队列中选取下一消息之前完全处理。请注意,如果启用了 transacted,则 asyncConsumer=true 不会异步运行,因为事务必须异步执行(Camel 3.0 可能会支持 async 事务)。 | false | 布尔值 |
| autoStartup (consumer) | 指定消费者容器是否应该自动启动。 | true | 布尔值 |
| cacheLevel (consumer) | 根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。 | int | |
| cacheLevelName (consumer) | 根据底层 JMS 资源的名称设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。 Enum 值:
| CACHE_AUTO | 字符串 |
| concurrentConsumers (consumer) | 指定从 JMS 消耗时的默认并发消费者数量(而不是通过 JMS 进行请求/恢复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当对 JMS 进行请求/恢复时,选项 replyToConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | 1 | int |
| maxConcurrentConsumers (consumer) | 指定从 JMS 消耗时的最大并发消费者数(而不是通过 JMS 请求/恢复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当对 JMS 进行请求时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发使用者数量。 | int | |
| replyToDeliveryPersistent (consumer) | 指定默认情况下是否使用持久发送进行回复。 | true | 布尔值 |
| 选择器 (使用者) | 设置要使用的 JMS 选择器。 | 字符串 | |
| subscriptionDurable (consumer) | 设置是否使订阅持久化。可以通过 subscriptionName 属性指定要使用的订阅名称。默认为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非消息监听程序类名称足够足够为订阅名称)。只有在侦听一个主题(pub-sub 域)时,仅有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
| subscriptionName (consumer) | 设置要创建的订阅的名称。在带有共享或持久订阅的主题(pub-sub 域)时应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:除了共享订阅外,每个订阅都只允许 1 个并发消费者(这是此消息监听程序容器的默认值),但共享订阅除外(需要 JMS 2.0)。 | 字符串 | |
| subscriptionShared (consumer) | 设置是否共享订阅。要使用的共享订阅名称可以通过 subscriptionName 属性指定。默认为 false。把它设置为 true 以注册共享订阅,通常使用 subscriptionName 值(除非您的消息监听程序类名称足够足以满足订阅名称)。请注意,共享的订阅也可能高度可用,因此此标志也可以(并且经常)与 subscriptionDurable 结合使用。只有在侦听一个主题(pub-sub 域)时,仅有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
| acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止期间是否接受消息。如果您在运行时启动和停止 JMS 路由,您可能会考虑启用此选项,而队列中仍存在消息排队。如果此选项为 false,并且您停止 JMS 路由,那么消息可能会被拒绝,并且 JMS 代理必须尝试红色的提示,但可能再次被拒绝,最终可能会在 JMS 代理上的死信队列中移动消息。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
| allowReplyManagerQuickStop (使用者(高级) | 回复管理器中是否使用了 DefaultMessageListenerContainer 进行 request-reply 消息,允许 DefaultMessageListenerContainer.runningAllowed 标志在 JmsConfiguration#isAcceptMessagesWhileStopping 已启用时,org.apache.camel.CamelContext 当前已停止。在常规 JMS 使用者中默认启用这种快速停止功能,但要为回复管理器启用此标志。 | false | 布尔值 |
| consumerType (使用者(高级) | 要使用的消费者类型,可以是一个简单的、默认或 Custom 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,简单将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,由 messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 将决定使用哪个 org.springframework.jms.listener.AbstractMessageListenerContainer。 Enum 值:
| 默认 | ConsumerType |
| defaultTaskExecutorType (consumer (advanced)) | 指定 DefaultMessageListenerContainer 中使用的默认 TaskExecutor 类型,用于消费者端点和制作者端点的 ReplyTo consumer。可能的值: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用 Spring 的 ThreadPoolTaskExecutor,带有最佳值 - 缓存线程池)。如果没有设置,则默认为前面的行为,它会对消费者端点使用缓存的线程池,对回复消费者使用 SimpleAsync。建议使用 ThreadPool 来减少弹性配置中线程垃圾箱,并动态增加和减少并发用户。 Enum 值:
| DefaultTaskExecutorType | |
| eagerLoadingOfProperties (使用者(高级) | 加载消息后,立即启用 JMS 属性和有效负载,这通常效率低下,因为 JMS 属性可能不需要,但有时可能会捕获底层 JMS 提供程序以及使用 JMS 属性的早期问题。另请参阅 eagerPoisonBody 选项。 | false | 布尔值 |
| eagerPoisonBody (使用者(高级) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)为 poison (不能读取/映射),则将此文本设置为消息正文,因此可以处理消息(中毒的原因已存储为 Exchange 上的异常)。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅 eagerLoadingOfProperties 选项。 | 因为 $\{exception.message} 导致 Poison JMS 消息 | 字符串 |
| exposeListenerSession (使用者(高级) | 指定在使用信息时是否应公开监听程序会话。 | false | 布尔值 |
| replyToSameDestinationAllowed (消费者(高级) | 是否允许 JMS 使用者向消费者使用的同一目的地发送回复消息。这可防止最终循环消耗并将相同的消息发送到其自身。 | false | 布尔值 |
| taskExecutor (consumer (advanced)) | 允许您为使用消息指定自定义任务执行器。 | TaskExecutor | |
| deliveryDelay (producer) | 设置用于为 JMS 发送调用的交付延迟。这个选项需要兼容 JMS 2.0 的代理。 | -1 | long |
| deliveryMode (producer) | 指定要使用的交付模式。可能的值由 javax.jms.DeliveryMode 定义。NON_PERSISTENT = 1 和 PERSISTENT = 2. Enum 值:
| 整数 | |
| deliveryPersistent (producer) | 指定是否默认使用持久性发送。 | true | 布尔值 |
| explicitQosEnabled (producer) | 设置在发送消息时是否应使用 deliveryMode、priority 或 timeToLive 服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用于当前端点。这与 preserveMessageQos 选项(以消息粒度运行)不同,读取来自 Camel In 消息标头的 QoS 属性。 | false | 布尔值 |
| formatDateHeadersToIso8601 (producer) | 设置 JMS date 属性是否应根据 ISO 8601 标准进行格式化。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| preserveMessageQos (producer) | 如果要使用在消息上指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置,则设置为 true。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中一些。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖端点中的值。相反,explicitQosEnabled 选项将使用端点上设置的选项,而不使用消息标头中的值。 | false | 布尔值 |
| 优先级 (生成器) | 大于 1 的值在发送时指定消息优先级(其中 1 是最低优先级,9 是最高)。还必须启用 explicitQosEnabled 选项,以便这个选项起作用。 Enum 值:
| 4 | int |
| replyToConcurrentConsumers (producer) | 指定通过 JMS 进行请求/恢复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | 1 | int |
| replyToMaxConcurrentConsumers (producer) | 指定使用请求/通过 JMS 时的最大并发消费者数。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | int | |
| replyToOnTimeoutMaxConcurrentConsumers (producer) | 指定在使用 request/reply over JMS 时发生超时时的最大并发消费者数。 | 1 | int |
| replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo destination,它将覆盖 replyTo 的设置。如果您要将消息转发到远程 Queue,并从 ReplyTo 目的地接收回复消息,这很有用。 | 字符串 | |
| replyToType (producer) | 允许在通过 JMS 发出请求/恢复请求时明确指定要用于 replyTo 队列的策略。可能的值有: Temporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。这个选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档以了解更多详情,特别是有关在集群环境中运行时的指示,以及共享回复队列的性能低于其替代 Temporary 和 Exclusive 的情况。 Enum 值:
| ReplyToType | |
| requestTimeout (producer) | 使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时时间。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此具有不同的超时值。另请参阅 requestTimeoutCheckerInterval 选项。 | 20000 | long |
| timeToLive (producer) | 发送消息时,指定消息的生存时间(以毫秒为单位)。 | -1 | long |
| allowAdditionalHeaders (producer (advanced)) | 此选项用于允许其他标头,这些标头可能具有根据 JMS 规范无效的值。例如,WMQ 等消息系统利用前缀 JMS_IBM_MQMD_ 包含具有字节数组或其他无效类型的值的标头名称来执行此操作。您可以指定多个以逗号分开的标头名称,用作通配符匹配的后缀。 | 字符串 | |
| allowNullBody (producer (advanced)) | 是否允许发送没有正文的消息。如果此选项为 false 且邮件正文为 null,则抛出 JMSException。 | true | 布尔值 |
| alwaysCopyMessage (producer (advanced)) | 如果为 true,Camel 将始终在消息传递给制作者时进行 JMS 消息副本以进行发送。在某些情况下需要复制消息,例如当设置了 replyToDestinationSelectorName 时(如果设置了 replyToDestinationSelectorName),Camel 会将 alwaysCopyMessage 选项设置为 true。 | false | 布尔值 |
| correlationProperty (producer (advanced)) | 在使用 InOut Exchange 模式时,请使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置的消息仅关联此属性 JMSCorrelationID 属性的值,则 Camel 不会设置它。 | 字符串 | |
| disableTimeToLive (producer (advanced)) | 使用这个选项强制禁用生存时间。例如,当您通过 JMS 进行请求/恢复时,Camel 默认将使用 requestTimeout 值作为在发送的消息上生存的时间。问题是,发件人和接收器系统必须同步其时钟,因此它们保持同步。这并非总是可以归档。因此,您可以使用 disableTimeToLive=true 不对发送的消息将时间设置为实时值。然后,消息不会在接收器系统中过期。如需了解更多详细信息,请参见关于生存时间一节中的。 | false | 布尔值 |
| forceSendOriginalMessage (producer (advanced)) | 使用 mapJmsMessage=false Camel 时,如果您接触路由期间的标头(get 或 set)将创建一个新的 JMS 消息,以发送到新的 JMS 目的地。将此选项设置为 true,以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
| includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly (例如触发和忘记)发送到 JMS 目的地时才适用。启用此选项将增强 Camel Exchange 与将消息发送到 JMS 目的地时由 JMS 客户端使用的实际 JMSMessageID。 | false | 布尔值 |
| replyToCacheLevelName (producer (advanced)) | 在通过 JMS 发出请求/回复消费者时,按名称设置缓存级别。这个选项仅在使用固定回复队列(非临时)时适用。Camel 默认使用:CACHE_CONSUMER 用于专用或者共享 w/ replyToSelectorName。和 CACHE_SESSION 用于没有 replyToSelectorName 共享。一些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能正常工作。注意:如果不允许使用临时队列,则不允许使用 CACHE_NONE,则必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
| replyToDestinationSelectorName (producer (advanced)) | 使用固定名称来设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(也就是说,如果您不使用临时回复队列)。 | 字符串 | |
| streamMessageTypeEnabled (producer (advanced)) | 设置是否启用了 StreamMessage 类型。消息流传输类型的消息有效负载,如 files、InputStream 等,它将通过发送为 BytesMessage 或 StreamMessage。此选项控制将使用的 kind。默认情况下,使用 BytesMessage,它将强制将整个消息有效负载读到内存中。通过启用这个选项,消息有效负载会在块中读取到内存中,然后每个块被写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
| allowAutoWiredConnectionFactory (高级) | 如果尚未配置任何连接工厂,是否从 registry 中自动发现 ConnectionFactory。如果只找到 ConnectionFactory 的一个实例,则会使用它。这默认是启用的。 | true | 布尔值 |
| allowAutoWiredDestinationResolver (advanced) | 如果尚未配置目标解析器,是否从 registry 中自动发现目标解析程序。如果只找到 DestinationResolver 的一个实例,则会使用它。这默认是启用的。 | true | 布尔值 |
| allowSerializedHeaders (高级) | 控制是否包含序列化标头。仅在 transferExchange 为 true 时才适用。这要求对象是串行的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。 | false | 布尔值 |
| artemisStreamingEnabled (advanced) | 是否针对 Apache Artemis 流模式进行优化。这在使用带有 JMS StreamMessage 类型的 Artemis 时,这可以减少内存开销。只有在使用 Apache Artemis 时,才必须启用此选项。 | false | 布尔值 |
| asyncStartListener (高级) | 在启动一个路由时,是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法获得到远程 JMS 代理的连接,那么在重试和/或故障转移时可能会阻断它。这会导致 Camel 在启动路由时阻止。通过将这个选项设置为 true,您将让路由启动,而 JmsConsumer 使用专用线程以异步模式连接到 JMS 代理。如果使用这个选项,请注意,如果无法建立连接,则会在 WARN 级别上记录异常,消费者将无法接收消息;然后,您可以重启路由来重试。 | false | 布尔值 |
| asyncStopListener (高级) | 在停止路由时,是否异步停止 JmsConsumer 消息监听程序。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 配置 (高级) | 使用共享 JMS 配置。 | JmsConfiguration | |
| destinationResolver (advanced) | 可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找实际目的地)。 | DestinationResolver | |
| errorHandler (高级) | 指定在处理消息时任何未捕获异常时调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置 errorHandler,则会在 WARN 级别记录这些例外。您可以使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项配置日志记录级别以及堆栈跟踪是否被记录。这样可以更容易配置,而不必对自定义错误处理程序进行编码。 | ErrorHandler | |
| exceptionListener (高级) | 指定 JMS Exception Listener,用于通知任何底层 JMS 异常。 | ExceptionListener | |
| idleConsumerLimit (advanced) | 指定在任意给定时间允许闲置的使用者数量限制。 | 1 | int |
| idleTaskExecutionLimit (advanced) | 指定接收任务的空闲执行限制,而不在其执行中收到任何消息。如果达到这个限制,任务将关闭并保持进入其他执行任务(如果是动态调度);请参阅 maxConcurrentConsumers 设置。Spring 提供了额外的 doc。 | 1 | int |
| 包含AllJMSXProperties (高级) | 从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则此选项不适用。 | false | 布尔值 |
| jmsKeyFormatStrategy (advanced) | 用于编码和解码 JMS 密钥的可插拔策略,以便它们可以与 JMS 规范兼容。Camel 开箱即用两种实施:default 和 passthrough。默认策略将安全分类点和连字符(. 和 -)。passthrough 策略原样保留密钥。可用于 JMS 代理,不关心 JMS 标头键是否包含非法字符。您可以提供对 org.apache.camel.component.jms.JmsKeyFormatStrategy 自己的实施,并使用 # 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
| mapJmsMessage (高级) | 指定 Camel 是否应自动将收到的 JMS 消息映射到合适的载荷类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
| maxMessagesPerTask (高级) | 每个任务的消息数。-1 代表没有限制。如果您对并发消费者使用范围(如 min max),那么此选项可用于设置值 eg 100 来控制用户在需要较少工作时如何缩小。 | -1 | int |
| messageConverter (advanced) | 要使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
| messageCreatedStrategy (advanced) | 要使用给定的 MessageCreatedStrategy,可在 Camel 发送 JMS 消息时创建 javax.jms.Message 对象的新实例时调用。 | MessageCreatedStrategy | |
| messageIdEnabled (高级) | 发送时,指定是否应添加消息 ID。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将消息 ID 设置为 null;如果提供程序忽略了 hint,消息 ID 必须设为其普通唯一值。 | true | 布尔值 |
| messageListenerContainerFactory (advanced) | 用于决定使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 MessageListenerContainer 的 registry ID。设置此选项会自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
| messageTimestampEnabled (advanced) | 指定在发送消息时是否默认启用时间戳。这只是对 JMS 代理的提示。如果 JMS 供应商接受此提示,则这些消息必须将时间戳设置为零;如果供应商忽略了提示,时间戳必须设置为其正常值。 | true | 布尔值 |
| pubSubNoLocal (高级) | 指定是否禁止提供由其自身连接发布的消息。 | false | 布尔值 |
| queueBrowseStrategy (advanced) | 在浏览队列时使用自定义 QueueBrowseStrategy。 | QueueBrowseStrategy | |
| receiveTimeout (高级) | 接收消息的超时时间(以毫秒为单位)。 | 1000 | long |
| recoveryInterval (高级) | 指定恢复尝试之间的间隔,例如在刷新连接时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。 | 5000 | long |
| requestTimeoutCheckerInterval (advanced) | 配置 Camel 在通过 JMS 执行此操作时应如何检查超时交换。默认情况下,Camel 每秒检查一次。但是,如果在发生超时时必须更快地响应,那么您可以降低此间隔,才能更频繁地检查。超时由选项 requestTimeout 决定。 | 1000 | long |
| 同步 (高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| transferException (高级) | 如果启用并且您正在使用 Request Reply messaging (InOut),而 Exchange 在消费者一侧失败,则原因 Exception 将发回以 javax.jms.ObjectMessage 的响应。如果客户端是 Camel,则返回的 Exception 会被重新浏览。这允许您在路由中使用 Camel JMS 作为网桥 - 例如,使用持久队列启用可靠的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。必须使相关例外是串行的。消费者端的原始 Exception 可以封装在外部异常中,如 org.apache.camel.RuntimeCamelException (当返回到制作者时)。请谨慎使用它,因为数据使用 Java 对象序列化,需要收到的才能在类级别上反序列化数据,这会强制生产者和消费者之间进行强耦合! | false | 布尔值 |
| transferExchange (advanced) | 您可以通过线来传输交换,而不只是正文和标头。以下字段已传输:在正文、出口正文、错误正文、标头、出口标头、交换属性、交换异常中。这要求对象是串行的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用这个选项,因此 Camel 知道有效负载是 Exchanges,而不是常规有效负载。请谨慎使用它,因为数据正在使用 Java 对象序列化,并且需要接收器能够在类级别上反序列化数据,这会强制在使用兼容 Camel 版本的用户之间强制进行强大的耦合! | false | 布尔值 |
| useMessageIDAsCorrelationID (高级) | 指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
| waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在启用使用MessageIDAsCorrelationID 时,等待调配关联 ID 更新为实际关联 ID 的次数。 | 50 | int |
| waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | millis 在等待配置关联 ID 进行更新时的睡眠时间。 | 100 | long |
| headerFilterStrategy (filter) | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| errorHandlerLoggingLevel (logging) | 允许为日志未捕获异常配置默认错误处理程序日志记录级别。 Enum 值:
| WARN | LoggingLevel |
| errorHandlerLogStackTrace (logging) | 允许根据默认的 errorHandler 控制是否应记录堆栈追踪。 | true | 布尔值 |
| 密码 (安全) | 要用于 ConnectionFactory 的密码。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
| 用户名 (安全) | 用于 ConnectionFactory 的用户名。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
| 转换( 事务) | 指定是否使用转换模式。 | false | 布尔值 |
| TranactedInOut (transaction) | 如果此标志设为 true,则指定 InOut 操作(请求回复)是否默认使用 transacted 模式,则 Spring JmsTemplate 将把 sessionTransacted 设置为 true,并在用于 InOut 操作的 JmsTemplate 上将确认Mode 作为转换。来自 Spring JMS:在 JTA 事务中,传递给 createQueue 的参数不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器会根据这些值自行做出决定。类似地,这些参数不会考虑在本地管理的事务内,因为本例中的 Spring JMS 在现有的 JMS Session 上运行。将此标志设置为 true 会在受管事务之外运行时使用简短的本地 JMS 事务,并在存在受管事务(除 XA 事务外)时,使用同步的本地 JMS 事务。这具有与主事务(可能是原生 JDBC 事务)管理的本地 JMS 事务的影响,并在主事务后提交 JMS 事务。 | false | 布尔值 |
| lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,Camel 将创建一个 JmsTransactionManager,如果没有在选项transacted=true 时注入 transactionManager。 | true | 布尔值 |
| transactionManager (事务处理(高级) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
| transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
| transactionTimeout (事务处理(高级) | 如果使用转换模式,事务的超时值(以秒为单位)。 | -1 | int |
26.4. 端点选项
JMS 端点是使用 URI 语法配置的:
jms:destinationType:destinationName
使用以下路径和查询参数:
26.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| destinationType (common) | 要使用的目标类型。 Enum 值:
| queue | 字符串 |
| destinationName (common) | 用作目的地的队列或主题的 必需 名称。 | 字符串 |
26.4.2. 查询参数(95 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| clientID (common) | 设置要使用的 JMS 客户端 ID。请注意,这个值(如果指定)必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只需要持久化的主题订阅。如果使用 Apache ActiveMQ,您可能需要改为使用虚拟主题。 | 字符串 | |
| ConnectionFactory (common) | 要使用的连接工厂。必须在组件或端点上配置连接工厂。 | ConnectionFactory | |
| disableReplyTo (common) | 指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目的地发送回复。如果您希望 Camel 从路由使用,并且您不希望 Camel 自动发送回复消息,则可使用此选项,因为代码中的另一个组件处理回复消息。如果您要将 Camel 用作不同消息代理之间的代理,并且希望将消息从一个系统路由到另一个系统,您也可以使用这个选项。 | false | 布尔值 |
| durableSubscriptionName (common) | 用于指定持久主题订阅的持久订阅者名称。还必须配置 clientId 选项。 | 字符串 | |
| jmsMessageType (common) | 允许您强制使用特定的 javax.jms.Message 实施来发送 JMS 消息。可能的值有:Bytes, Map, Object, Stream, Text。默认情况下,Camel 将决定从 In body 类型中使用的 JMS 消息类型。这个选项允许您指定它。 Enum 值:
| JmsMessageType | |
| replyTo (common) | 提供明确的 ReplyTo destination (会覆盖消费者中的 Message.getJMSReplyTo ()的任何传入值)。 | 字符串 | |
| testConnectionOnStartup (common) | 指定是否在启动时测试连接。这可确保 Camel 启动所有 JMS 用户具有与 JMS 代理的有效连接。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS 制作者也经过测试。 | false | 布尔值 |
| acknowledgementModeName (consumer) | JMS 确认名称,即 SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE。 Enum 值:
| AUTO_ACKNOWLEDGE | 字符串 |
| artemisConsumerPriority (consumer) | 通过使用者优先级,您可以确保高优先级消费者在信息处于活动状态时收到信息。通常,连接到队列的活动消费者以轮循方式接收来自它的消息。当使用消费者优先级时,如果存在多个具有同样高优先级的活跃使用者,则消息将按循环发送。只有高优先级消费者没有可用的信用时,消息才会降低优先级消费者,或者那些高优先级消费者接受消息(例如,因为它不符合与消费者关联的任何选择器标准)。 | int | |
| asyncConsumer (consumer) | JmsConsumer 异步处理 Exchange。如果启用,JmsConsumer 可能会从 JMS 队列中选取下一个消息,而前面的消息被异步处理(通过异步路由引擎)。这意味着消息可能会按顺序处理,而不是严格处理。如果禁用(默认),则交换在 JmsConsumer 将从 JMS 队列中选取下一消息之前完全处理。请注意,如果启用了 transacted,则 asyncConsumer=true 不会异步运行,因为事务必须异步执行(Camel 3.0 可能会支持 async 事务)。 | false | 布尔值 |
| autoStartup (consumer) | 指定消费者容器是否应该自动启动。 | true | 布尔值 |
| cacheLevel (consumer) | 根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。 | int | |
| cacheLevelName (consumer) | 根据底层 JMS 资源的名称设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。 Enum 值:
| CACHE_AUTO | 字符串 |
| concurrentConsumers (consumer) | 指定从 JMS 消耗时的默认并发消费者数量(而不是通过 JMS 进行请求/恢复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当对 JMS 进行请求/恢复时,选项 replyToConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | 1 | int |
| maxConcurrentConsumers (consumer) | 指定从 JMS 消耗时的最大并发消费者数(而不是通过 JMS 请求/恢复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当对 JMS 进行请求时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发使用者数量。 | int | |
| replyToDeliveryPersistent (consumer) | 指定默认情况下是否使用持久发送进行回复。 | true | 布尔值 |
| 选择器 (使用者) | 设置要使用的 JMS 选择器。 | 字符串 | |
| subscriptionDurable (consumer) | 设置是否使订阅持久化。可以通过 subscriptionName 属性指定要使用的订阅名称。默认为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非消息监听程序类名称足够足够为订阅名称)。只有在侦听一个主题(pub-sub 域)时,仅有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
| subscriptionName (consumer) | 设置要创建的订阅的名称。在带有共享或持久订阅的主题(pub-sub 域)时应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:除了共享订阅外,每个订阅都只允许 1 个并发消费者(这是此消息监听程序容器的默认值),但共享订阅除外(需要 JMS 2.0)。 | 字符串 | |
| subscriptionShared (consumer) | 设置是否共享订阅。要使用的共享订阅名称可以通过 subscriptionName 属性指定。默认为 false。把它设置为 true 以注册共享订阅,通常使用 subscriptionName 值(除非您的消息监听程序类名称足够足以满足订阅名称)。请注意,共享的订阅也可能高度可用,因此此标志也可以(并且经常)与 subscriptionDurable 结合使用。只有在侦听一个主题(pub-sub 域)时,仅有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
| acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止期间是否接受消息。如果您在运行时启动和停止 JMS 路由,您可能会考虑启用此选项,而队列中仍存在消息排队。如果此选项为 false,并且您停止 JMS 路由,那么消息可能会被拒绝,并且 JMS 代理必须尝试红色的提示,但可能再次被拒绝,最终可能会在 JMS 代理上的死信队列中移动消息。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
| allowReplyManagerQuickStop (使用者(高级) | 回复管理器中是否使用了 DefaultMessageListenerContainer 进行 request-reply 消息,允许 DefaultMessageListenerContainer.runningAllowed 标志在 JmsConfiguration#isAcceptMessagesWhileStopping 已启用时,org.apache.camel.CamelContext 当前已停止。在常规 JMS 使用者中默认启用这种快速停止功能,但要为回复管理器启用此标志。 | false | 布尔值 |
| consumerType (使用者(高级) | 要使用的消费者类型,可以是一个简单的、默认或 Custom 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,简单将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,由 messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 将决定使用哪个 org.springframework.jms.listener.AbstractMessageListenerContainer。 Enum 值:
| 默认 | ConsumerType |
| defaultTaskExecutorType (consumer (advanced)) | 指定 DefaultMessageListenerContainer 中使用的默认 TaskExecutor 类型,用于消费者端点和制作者端点的 ReplyTo consumer。可能的值: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用 Spring 的 ThreadPoolTaskExecutor,带有最佳值 - 缓存线程池)。如果没有设置,则默认为前面的行为,它会对消费者端点使用缓存的线程池,对回复消费者使用 SimpleAsync。建议使用 ThreadPool 来减少弹性配置中线程垃圾箱,并动态增加和减少并发用户。 Enum 值:
| DefaultTaskExecutorType | |
| eagerLoadingOfProperties (使用者(高级) | 加载消息后,立即启用 JMS 属性和有效负载,这通常效率低下,因为 JMS 属性可能不需要,但有时可能会捕获底层 JMS 提供程序以及使用 JMS 属性的早期问题。另请参阅 eagerPoisonBody 选项。 | false | 布尔值 |
| eagerPoisonBody (使用者(高级) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)为 poison (不能读取/映射),则将此文本设置为消息正文,因此可以处理消息(中毒的原因已存储为 Exchange 上的异常)。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅 eagerLoadingOfProperties 选项。 | 因为 $\{exception.message} 导致 Poison JMS 消息 | 字符串 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| exposeListenerSession (使用者(高级) | 指定在使用信息时是否应公开监听程序会话。 | false | 布尔值 |
| replyToSameDestinationAllowed (消费者(高级) | 是否允许 JMS 使用者向消费者使用的同一目的地发送回复消息。这可防止最终循环消耗并将相同的消息发送到其自身。 | false | 布尔值 |
| taskExecutor (consumer (advanced)) | 允许您为使用消息指定自定义任务执行器。 | TaskExecutor | |
| deliveryDelay (producer) | 设置用于为 JMS 发送调用的交付延迟。这个选项需要兼容 JMS 2.0 的代理。 | -1 | long |
| deliveryMode (producer) | 指定要使用的交付模式。可能的值由 javax.jms.DeliveryMode 定义。NON_PERSISTENT = 1 和 PERSISTENT = 2. Enum 值:
| 整数 | |
| deliveryPersistent (producer) | 指定是否默认使用持久性发送。 | true | 布尔值 |
| explicitQosEnabled (producer) | 设置在发送消息时是否应使用 deliveryMode、priority 或 timeToLive 服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用于当前端点。这与 preserveMessageQos 选项(以消息粒度运行)不同,读取来自 Camel In 消息标头的 QoS 属性。 | false | 布尔值 |
| formatDateHeadersToIso8601 (producer) | 设置 JMS date 属性是否应根据 ISO 8601 标准进行格式化。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| preserveMessageQos (producer) | 如果要使用在消息上指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置,则设置为 true。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中一些。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖端点中的值。相反,explicitQosEnabled 选项将使用端点上设置的选项,而不使用消息标头中的值。 | false | 布尔值 |
| 优先级 (生成器) | 大于 1 的值在发送时指定消息优先级(其中 1 是最低优先级,9 是最高)。还必须启用 explicitQosEnabled 选项,以便这个选项起作用。 Enum 值:
| 4 | int |
| replyToConcurrentConsumers (producer) | 指定通过 JMS 进行请求/恢复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | 1 | int |
| replyToMaxConcurrentConsumers (producer) | 指定使用请求/通过 JMS 时的最大并发消费者数。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | int | |
| replyToOnTimeoutMaxConcurrentConsumers (producer) | 指定在使用 request/reply over JMS 时发生超时时的最大并发消费者数。 | 1 | int |
| replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo destination,它将覆盖 replyTo 的设置。如果您要将消息转发到远程 Queue,并从 ReplyTo 目的地接收回复消息,这很有用。 | 字符串 | |
| replyToType (producer) | 允许在通过 JMS 发出请求/恢复请求时明确指定要用于 replyTo 队列的策略。可能的值有: Temporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。这个选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档以了解更多详情,特别是有关在集群环境中运行时的指示,以及共享回复队列的性能低于其替代 Temporary 和 Exclusive 的情况。 Enum 值:
| ReplyToType | |
| requestTimeout (producer) | 使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时时间。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此具有不同的超时值。另请参阅 requestTimeoutCheckerInterval 选项。 | 20000 | long |
| timeToLive (producer) | 发送消息时,指定消息的生存时间(以毫秒为单位)。 | -1 | long |
| allowAdditionalHeaders (producer (advanced)) | 此选项用于允许其他标头,这些标头可能具有根据 JMS 规范无效的值。例如,WMQ 等消息系统利用前缀 JMS_IBM_MQMD_ 包含具有字节数组或其他无效类型的值的标头名称来执行此操作。您可以指定多个以逗号分开的标头名称,用作通配符匹配的后缀。 | 字符串 | |
| allowNullBody (producer (advanced)) | 是否允许发送没有正文的消息。如果此选项为 false 且邮件正文为 null,则抛出 JMSException。 | true | 布尔值 |
| alwaysCopyMessage (producer (advanced)) | 如果为 true,Camel 将始终在消息传递给制作者时进行 JMS 消息副本以进行发送。在某些情况下需要复制消息,例如当设置了 replyToDestinationSelectorName 时(如果设置了 replyToDestinationSelectorName),Camel 会将 alwaysCopyMessage 选项设置为 true。 | false | 布尔值 |
| correlationProperty (producer (advanced)) | 在使用 InOut Exchange 模式时,请使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置的消息仅关联此属性 JMSCorrelationID 属性的值,则 Camel 不会设置它。 | 字符串 | |
| disableTimeToLive (producer (advanced)) | 使用这个选项强制禁用生存时间。例如,当您通过 JMS 进行请求/恢复时,Camel 默认将使用 requestTimeout 值作为在发送的消息上生存的时间。问题是,发件人和接收器系统必须同步其时钟,因此它们保持同步。这并非总是可以归档。因此,您可以使用 disableTimeToLive=true 不对发送的消息将时间设置为实时值。然后,消息不会在接收器系统中过期。如需了解更多详细信息,请参见关于生存时间一节中的。 | false | 布尔值 |
| forceSendOriginalMessage (producer (advanced)) | 使用 mapJmsMessage=false Camel 时,如果您接触路由期间的标头(get 或 set)将创建一个新的 JMS 消息,以发送到新的 JMS 目的地。将此选项设置为 true,以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
| includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly (例如触发和忘记)发送到 JMS 目的地时才适用。启用此选项将增强 Camel Exchange 与将消息发送到 JMS 目的地时由 JMS 客户端使用的实际 JMSMessageID。 | false | 布尔值 |
| replyToCacheLevelName (producer (advanced)) | 在通过 JMS 发出请求/回复消费者时,按名称设置缓存级别。这个选项仅在使用固定回复队列(非临时)时适用。Camel 默认使用:CACHE_CONSUMER 用于专用或者共享 w/ replyToSelectorName。和 CACHE_SESSION 用于没有 replyToSelectorName 共享。一些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能正常工作。注意:如果不允许使用临时队列,则不允许使用 CACHE_NONE,则必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
| replyToDestinationSelectorName (producer (advanced)) | 使用固定名称来设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(也就是说,如果您不使用临时回复队列)。 | 字符串 | |
| streamMessageTypeEnabled (producer (advanced)) | 设置是否启用了 StreamMessage 类型。消息流传输类型的消息有效负载,如 files、InputStream 等,它将通过发送为 BytesMessage 或 StreamMessage。此选项控制将使用的 kind。默认情况下,使用 BytesMessage,它将强制将整个消息有效负载读到内存中。通过启用这个选项,消息有效负载会在块中读取到内存中,然后每个块被写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
| allowSerializedHeaders (高级) | 控制是否包含序列化标头。仅在 transferExchange 为 true 时才适用。这要求对象是串行的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。 | false | 布尔值 |
| artemisStreamingEnabled (advanced) | 是否针对 Apache Artemis 流模式进行优化。这在使用带有 JMS StreamMessage 类型的 Artemis 时,这可以减少内存开销。只有在使用 Apache Artemis 时,才必须启用此选项。 | false | 布尔值 |
| asyncStartListener (高级) | 在启动一个路由时,是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法获得到远程 JMS 代理的连接,那么在重试和/或故障转移时可能会阻断它。这会导致 Camel 在启动路由时阻止。通过将这个选项设置为 true,您将让路由启动,而 JmsConsumer 使用专用线程以异步模式连接到 JMS 代理。如果使用这个选项,请注意,如果无法建立连接,则会在 WARN 级别上记录异常,消费者将无法接收消息;然后,您可以重启路由来重试。 | false | 布尔值 |
| asyncStopListener (高级) | 在停止路由时,是否异步停止 JmsConsumer 消息监听程序。 | false | 布尔值 |
| destinationResolver (advanced) | 可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找实际目的地)。 | DestinationResolver | |
| errorHandler (高级) | 指定在处理消息时任何未捕获异常时调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置 errorHandler,则会在 WARN 级别记录这些例外。您可以使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项配置日志记录级别以及堆栈跟踪是否被记录。这样可以更容易配置,而不必对自定义错误处理程序进行编码。 | ErrorHandler | |
| exceptionListener (高级) | 指定 JMS Exception Listener,用于通知任何底层 JMS 异常。 | ExceptionListener | |
| headerFilterStrategy (高级) | 使用自定义 HeaderFilterStrategy 过滤标题到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| idleConsumerLimit (advanced) | 指定在任意给定时间允许闲置的使用者数量限制。 | 1 | int |
| idleTaskExecutionLimit (advanced) | 指定接收任务的空闲执行限制,而不在其执行中收到任何消息。如果达到这个限制,任务将关闭并保持进入其他执行任务(如果是动态调度);请参阅 maxConcurrentConsumers 设置。Spring 提供了额外的 doc。 | 1 | int |
| 包含AllJMSXProperties (高级) | 从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则此选项不适用。 | false | 布尔值 |
| jmsKeyFormatStrategy (advanced) | 用于编码和解码 JMS 密钥的可插拔策略,以便它们可以与 JMS 规范兼容。Camel 开箱即用两种实施:default 和 passthrough。默认策略将安全分类点和连字符(. 和 -)。passthrough 策略原样保留密钥。可用于 JMS 代理,不关心 JMS 标头键是否包含非法字符。您可以提供对 org.apache.camel.component.jms.JmsKeyFormatStrategy 自己的实施,并使用 # 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
| mapJmsMessage (高级) | 指定 Camel 是否应自动将收到的 JMS 消息映射到合适的载荷类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
| maxMessagesPerTask (高级) | 每个任务的消息数。-1 代表没有限制。如果您对并发消费者使用范围(如 min max),那么此选项可用于设置值 eg 100 来控制用户在需要较少工作时如何缩小。 | -1 | int |
| messageConverter (advanced) | 要使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
| messageCreatedStrategy (advanced) | 要使用给定的 MessageCreatedStrategy,可在 Camel 发送 JMS 消息时创建 javax.jms.Message 对象的新实例时调用。 | MessageCreatedStrategy | |
| messageIdEnabled (高级) | 发送时,指定是否应添加消息 ID。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将消息 ID 设置为 null;如果提供程序忽略了 hint,消息 ID 必须设为其普通唯一值。 | true | 布尔值 |
| messageListenerContainerFactory (advanced) | 用于决定使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 MessageListenerContainer 的 registry ID。设置此选项会自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
| messageTimestampEnabled (advanced) | 指定在发送消息时是否默认启用时间戳。这只是对 JMS 代理的提示。如果 JMS 供应商接受此提示,则这些消息必须将时间戳设置为零;如果供应商忽略了提示,时间戳必须设置为其正常值。 | true | 布尔值 |
| pubSubNoLocal (高级) | 指定是否禁止提供由其自身连接发布的消息。 | false | 布尔值 |
| receiveTimeout (高级) | 接收消息的超时时间(以毫秒为单位)。 | 1000 | long |
| recoveryInterval (高级) | 指定恢复尝试之间的间隔,例如在刷新连接时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。 | 5000 | long |
| requestTimeoutCheckerInterval (advanced) | 配置 Camel 在通过 JMS 执行此操作时应如何检查超时交换。默认情况下,Camel 每秒检查一次。但是,如果在发生超时时必须更快地响应,那么您可以降低此间隔,才能更频繁地检查。超时由选项 requestTimeout 决定。 | 1000 | long |
| 同步 (高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| transferException (高级) | 如果启用并且您正在使用 Request Reply messaging (InOut),而 Exchange 在消费者一侧失败,则原因 Exception 将发回以 javax.jms.ObjectMessage 的响应。如果客户端是 Camel,则返回的 Exception 会被重新浏览。这允许您在路由中使用 Camel JMS 作为网桥 - 例如,使用持久队列启用可靠的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。必须使相关例外是串行的。消费者端的原始 Exception 可以封装在外部异常中,如 org.apache.camel.RuntimeCamelException (当返回到制作者时)。请谨慎使用它,因为数据使用 Java 对象序列化,需要收到的才能在类级别上反序列化数据,这会强制生产者和消费者之间进行强耦合! | false | 布尔值 |
| transferExchange (advanced) | 您可以通过线来传输交换,而不只是正文和标头。以下字段已传输:在正文、出口正文、错误正文、标头、出口标头、交换属性、交换异常中。这要求对象是串行的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用这个选项,因此 Camel 知道有效负载是 Exchanges,而不是常规有效负载。请谨慎使用它,因为数据正在使用 Java 对象序列化,并且需要接收器能够在类级别上反序列化数据,这会强制在使用兼容 Camel 版本的用户之间强制进行强大的耦合! | false | 布尔值 |
| useMessageIDAsCorrelationID (高级) | 指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
| waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在启用使用MessageIDAsCorrelationID 时,等待调配关联 ID 更新为实际关联 ID 的次数。 | 50 | int |
| waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | millis 在等待配置关联 ID 进行更新时的睡眠时间。 | 100 | long |
| errorHandlerLoggingLevel (logging) | 允许为日志未捕获异常配置默认错误处理程序日志记录级别。 Enum 值:
| WARN | LoggingLevel |
| errorHandlerLogStackTrace (logging) | 允许根据默认的 errorHandler 控制是否应记录堆栈追踪。 | true | 布尔值 |
| 密码 (安全) | 要用于 ConnectionFactory 的密码。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
| 用户名 (安全) | 用于 ConnectionFactory 的用户名。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
| 转换( 事务) | 指定是否使用转换模式。 | false | 布尔值 |
| TranactedInOut (transaction) | 如果此标志设为 true,则指定 InOut 操作(请求回复)是否默认使用 transacted 模式,则 Spring JmsTemplate 将把 sessionTransacted 设置为 true,并在用于 InOut 操作的 JmsTemplate 上将确认Mode 作为转换。来自 Spring JMS:在 JTA 事务中,传递给 createQueue 的参数不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器会根据这些值自行做出决定。类似地,这些参数不会考虑在本地管理的事务内,因为本例中的 Spring JMS 在现有的 JMS Session 上运行。将此标志设置为 true 会在受管事务之外运行时使用简短的本地 JMS 事务,并在存在受管事务(除 XA 事务外)时,使用同步的本地 JMS 事务。这具有与主事务(可能是原生 JDBC 事务)管理的本地 JMS 事务的影响,并在主事务后提交 JMS 事务。 | false | 布尔值 |
| lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,Camel 将创建一个 JmsTransactionManager,如果没有在选项transacted=true 时注入 transactionManager。 | true | 布尔值 |
| transactionManager (事务处理(高级) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
| transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
| transactionTimeout (事务处理(高级) | 如果使用转换模式,事务的超时值(以秒为单位)。 | -1 | int |
26.5. Samples
JMS 也用于其他组件的很多示例。但是,我们提供以下几个示例以开始。
26.5.1. 从 JMS 接收
在以下示例中,我们配置接收 JMS 消息的路由,并将消息路由到 POJO:
from("jms:queue:foo").
to("bean:myBusinessLogic");您可以使用任何 EIP 模式,以便路由可以基于上下文。例如,如何过滤大开支的订购主题:
from("jms:topic:OrdersTopic").
filter().method("myBean", "isGoldCustomer").
to("jms:queue:BigSpendersQueue");26.5.2. 发送到 JMS
在以下示例中,我们轮询文件文件夹并将文件内容发送到 JMS 主题。由于我们希望文件的内容为 TextMessage 而不是 BytesMessage,因此我们需要将正文转换为 String :
from("file://orders").
convertBodyTo(String.class).
to("jms:topic:OrdersTopic");26.5.3. 使用注解
Camel 还具有注释,因此您可以使用 POJO Consuming 和 POJO Producing。
26.5.4. Spring DSL 示例
前面的示例使用 Java DSL。Camel 还支持 Spring XML DSL。以下是使用 Spring DSL 的大量成本示例:
<route>
<from uri="jms:topic:OrdersTopic"/>
<filter>
<method ref="myBean" method="isGoldCustomer"/>
<to uri="jms:queue:BigSpendersQueue"/>
</filter>
</route>26.5.5. 其他示例
JMS 出现在许多用于其他组件和 EIP 模式的示例,以及 Camel 文档。因此,您可以自由浏览文档。
26.5.6. 使用 JMS 作为死信队列存储交换
通常,当使用 JMS 作为传输时,它只会将正文和标头作为载荷传输。如果要将 JMS 与 Dead Letter Channel 搭配使用,请将 JMS 队列用作 Dead Letter Queue,则通常导致的 Exception 不会存储在 JMS 消息中。但是,您可以使用 JMS 死信队列上的 transferExchange 选项指示 Camel 将整个 Exchange 存储在队列中,作为包含 org.apache.camel.support.DefaultExchangeHolder 的 javax.jms.ObjectMessage。这可让您从死信队列使用,并在 Exchange.EXCEPTION_CAUGHT 的 Exchange 属性中检索原因例外。以下演示演示了这一点:
// setup error handler to use JMS as queue and store the entire Exchange
errorHandler(deadLetterChannel("jms:queue:dead?transferExchange=true"));然后,您可以使用 JMS 队列并分析问题:
from("jms:queue:dead").to("bean:myErrorAnalyzer");
// and in our bean
String body = exchange.getIn().getBody();
Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
// the cause message is
String problem = cause.getMessage();26.5.7. 将 JMS 用作死信频道存储错误
您可以使用 JMS 存储原因错误消息或存储自定义正文,您可以自行初始化。以下示例使用 Message Translator EIP 在移至 JMS 死信队列之前对失败交换进行转换:
// we sent it to a seda dead queue first
errorHandler(deadLetterChannel("seda:dead"));
// and on the seda dead queue we can do the custom transformation before its sent to the JMS queue
from("seda:dead").transform(exceptionMessage()).to("jms:queue:dead");此处我们仅将原始原因信息存储在转换中。但是,您可以使用任何表达式来发送任何喜欢的内容。例如,您可以在 Bean 上调用方法或使用自定义处理器。
26.6. JMS 和 Camel 之间的消息映射
Camel 自动映射 javax.jms.Message 和 org.apache.camel.Message 之间的消息。
发送 JMS 消息时,Camel 会将邮件正文转换为以下 JMS 消息类型:
| 正文类型 | JMS 消息 | 注释 |
|---|---|---|
|
|
| |
|
|
|
DOM 将转换为 |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
|
收到 JMS 消息时,Camel 会将 JMS 消息转换为以下正文类型:
| JMS 消息 | 正文类型 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
26.6.1. 禁用 JMS 消息的自动映射
您可以使用 mapJmsMessage 选项禁用上面的 auto-mapping。如果禁用,Camel 不会尝试映射收到的 JMS 消息,而是直接将其用作载荷。这可让您避免映射开销,让 Camel 仅通过 JMS 消息。例如,它甚至允许您路由 javax.jms.ObjectMessage JMS 消息,并带有您在 classpath 上不存在的类。
26.6.2. 使用自定义 MessageConverter
您可以使用 messageConverter 选项自己在 Spring org.springframework.jms.support.converter.MessageConverter 类中进行映射。
例如,在以下路由中,在向 JMS 顺序队列发送消息时,我们使用自定义消息转换程序:
from("file://inbox/order").to("jms:queue:order?messageConverter=#myMessageConverter");在从 JMS 目的地消耗时,也可以使用自定义消息转换器。
26.6.3. 控制所选映射策略
您可以在端点 URL 上使用 jmsMessageType 选项,以强制所有消息类型。
在以下路由中,我们轮询文件夹中的文件,并将其作为 javax.jms.TextMessage 发送,因为我们强制 JMS producer 端点使用文本消息:
from("file://inbox/order").to("jms:queue:order?jmsMessageType=Text");
您还可以通过使用密钥 CamelJmsMessageType 设置标头来指定要用于每个消息的消息类型。例如:
from("file://inbox/order").setHeader("CamelJmsMessageType", JmsMessageType.Text).to("jms:queue:order");
可能的值在 enum 类 org.apache.camel.jms.JmsMessageType 中定义。
26.7. 发送时的消息格式
通过 JMS 线发送的交换必须符合 JMS 消息规格。
对于 exchange.in.header,以下适用于标头 键 的规则:
-
以
JMS或JMSX开头的密钥被保留。 -
Exchange.in.headers键必须为 literals,并且所有有效 Java 标识符都必须是有效的 Java 标识符(请勿使用键名称中的句点)。 -
Camel 在消耗 JMS 消息时替换句点和连字符,在 Camel 使用消息时被 'DOT' 替代,并在 Camel 使用消息时替换反向替换。
-被 'HYPHEN' 替换,并在 Camel 消耗消息时替换反向替换。
-
另请参阅
jmsKeyFormatStrategy选项,该选项允许使用您自己的自定义策略来格式化密钥。
对于 exchange.in.header,以下规则适用于 标头值 :
-
该值必须是原语或其计数器对象(如
Integer、Long、Character)。类型、字符串、CharSequence、Date、BigDecimal和BigInteger都转换为其toString ()表示。所有其他类型都被丢弃。
如果 Camel 丢弃给定的标头值,Camel 将以 DEBUG 级别的类别记录 org.apache.camel.component.jms.JmsBinding。例如:
2008-07-09 06:43:04,046 [main ] DEBUG JmsBinding
- Ignoring non primitive header: order of class: org.apache.camel.component.jms.issues.DummyOrder with value: DummyOrder{orderId=333, itemId=4444, quantity=2}26.8. 接收时的消息格式
Camel 在收到消息时在 Exchange 中添加以下属性:
| 属性 | 类型 | 描述 |
|---|---|---|
|
|
| 回复目的地。 |
Camel 在收到 JMS 消息时向 In 消息标头添加以下 JMS 属性:
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| JMS 关联 ID。 |
|
|
| JMS 交付模式。 |
|
|
| JMS 目的地。 |
|
|
| JMS 过期时间。 |
|
|
| JMS 唯一消息 ID。 |
|
|
| JMS 优先级(具有 0 作为最低优先级,最高为 9)。 |
|
|
| 是 redelivered 的 JMS 消息。 |
|
|
| JMS 回复到目的地。 |
|
|
| JMS 时间戳。 |
|
|
| JMS 类型。 |
|
|
| JMS 组 ID。 |
由于以上所有信息都是标准的 JMS,您可以检查 JMS 文档 以了解更多详情。
26.9. 关于使用 Camel 发送和接收消息和 JMSReplyTo
JMS 组件比较复杂,您必须密切关注它在一些情况下的工作方式。这是要查找的一些区域/pitfall的简短总结。
当 Camel 使用其 JMSProducer 发送消息时,它会检查以下条件:
- 消息交换模式,
-
是否在端点或消息标头中设置
JMSReplyTo, -
在 JMS 端点上是否设置了下列任何选项:
disableReplyTo,preserveMessageQos,explicitQosEnabled。
这可能很复杂,可以理解和配置以支持您的用例。
26.9.1. JmsProducer
JmsProducer 的行为如下,具体取决于配置:
| Exchange Pattern | 其他选项 | 描述 |
|---|---|---|
| InOut | - |
Camel 将预期一个回复,设置一个临时 |
| InOut |
|
Camel 将期望回复并在发送邮件后,它将开始侦听指定 |
| 仅限 | - | Camel 将发送消息 而不是 期望回复。 |
| 仅限 |
|
默认情况下,Camel 丢弃 |
26.9.2. JmsConsumer
JmsConsumer 的行为如下,具体取决于配置:
| Exchange Pattern | 其他选项 | 描述 |
|---|---|---|
| InOut | - |
Camel 将回复发送回 |
| 仅限 | - | Camel 不会发送回复,因为模式是 InOnly。 |
| - |
| 这个选项会阻止回复。 |
因此,请注意交换上设置的消息交换模式。
如果您在路由中间向 JMS 目的地发送一条消息,您可以指定要使用的交换模式,请参阅 Request Reply。
如果您要向 JMS 主题发送 InOnly 消息,这很有用:
from("activemq:queue:in")
.to("bean:validateOrder")
.to(ExchangePattern.InOnly, "activemq:topic:order")
.to("bean:handleOrder");26.10. 重复使用端点并发送到运行时计算的不同目的地
如果您需要发送消息到许多不同的 JMS 目的地,则重复利用 JMS 端点并在消息标头中指定实际目的地。这允许 Camel 重复使用同一端点,但会发送到不同的目的地。这可大大减少内存和线程资源中创建的端点数量。
您可以在以下标头中指定目的地:
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 目标对象。 |
|
|
| 目标名称。 |
例如,以下路由演示了如何在运行时计算目的地,并使用它来覆盖出现在 JMS URL 中的目的地:
from("file://inbox")
.to("bean:computeDestination")
.to("activemq:queue:dummy");
队列名称 dummy 只是一个占位符。它必须作为 JMS 端点 URL 的一部分提供,但本例中将忽略。
在 computeDestination bean 中,通过设置 CamelJmsDestinationName 标头来指定真实目的地,如下所示:
public void setJmsHeader(Exchange exchange) {
String id = ....
exchange.getIn().setHeader("CamelJmsDestinationName", "order:" + id");
}
然后,Camel 将读取此标头并将其用作目的地,而不是在端点上配置的目的地。因此,在本示例中,Camel 会将消息发送到 activemq:queue:order:2,假设 id 值为 2。
如果设置了 CamelJmsDestination 和 CamelJmsDestinationName 标头,则 CamelJmsDestination 将具有优先权。请记住,JMS 制作者从交换中删除 标头和 CamelJmsDestinationName 标头,且不会将它们传播到所创建的 JMS 消息,以避免路由中的意外循环(当消息将转发到另一个 JMS 端点时)。
CamelJmsDestination Name
26.11. 配置不同的 JMS 提供程序
您可以在 Spring XML 中配置 JMS 供应商,如下所示:
基本上,您可以根据需要配置 JMS 组件实例,并使用 id 属性 为它们指定唯一名称。前面的示例配置了 activemq 组件。您可以执行相同的操作来配置 MQ 系列、TibCo、BEA、Sonnic 等。
一旦您拥有命名 JMS 组件,就可以使用 URI 来引用该组件内的端点。例如,作为组件名称 activemq,您可以使用 URI 格式 activemq:[queue:|topic:]destinationName 引用目的地。您可以将相同的方法用于所有其他 JMS 提供程序。
这由 SpringCamelContext lazily 获取组件适用于 Endpoint URI 的方案名称,并让组件解析端点 URI。
26.11.1. 使用 JNDI 查找 ConnectionFactory
如果您使用 J2EE 容器,您可能需要查找 JNDI 来查找 JMS ConnectionFactory,而不是使用 Spring 中的常见的 < bean> 机制。您可以使用 Spring 的 factory bean 或新的 Spring XML 命名空间进行此操作。例如:
<bean id="weblogic" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory" ref="myConnectionFactory"/> </bean> <jee:jndi-lookup id="myConnectionFactory" jndi-name="jms/connectionFactory"/>
有关 JNDI 查找的更多详细信息,请参阅 Spring 参考文档中的 jee 模式。
26.12. 并发使用
JMS 的常见要求是在多个线程中同时消耗消息,以便应用更快响应。您可以设置 concurrentConsumers 选项来指定为 JMS 端点提供服务的线程数量,如下所示:
from("jms:SomeQueue?concurrentConsumers=20").
bean(MyClass.class);您可以使用以下方法之一配置这个选项:
-
在
JmsComponent上, - 在端点 URI 上,或者
-
通过在
JmsEndpoint上直接调用setConcurrentConsumers ()。
26.12.1. 使用 async consumer 的并发使用
请注意,当当前消息被完全处理时,每个并发使用者只会从 JMS 代理获取下一个可用消息。您可以设置 asyncConsumer=true 选项,以便消费者从 JMS 队列中选取下一个消息,而前面的消息被异步处理(通过异步路由引擎)。请参阅有关 asyncConsumer 选项的页面顶部的详情。
from("jms:SomeQueue?concurrentConsumers=20&asyncConsumer=true").
bean(MyClass.class);26.13. 通过 JMS 请求
Camel 支持通过 JMS 进行请求。当您发送消息到 JMS 队列时,交换的 MEP 应为 InOut。
Camel 提供多种选项,用于配置请求/比 JMS 影响性能和集群环境。下表总结了选项。
| 选项 | 性能 | 集群 | 描述 |
|---|---|---|---|
|
| 速度快 | 是 |
临时队列用作回复队列,由 Camel 自动创建。使用这个选项 没有指定 replyTo 队列名称。另外,您还可以配置 |
|
| slow | 是 |
共享持久队列用作回复队列。必须先创建队列,但有些代理可以在 Apache ActiveMQ 等实时创建它们。要使用它,您必须指定 replyTo 队列名称。另外,您还可以配置 |
|
| 速度快 | 否(*是) |
专用持久队列用作回复队列。必须先创建队列,但有些代理可以在 Apache ActiveMQ 等实时创建它们。要使用它,您必须指定 replyTo 队列名称。另外,您必须配置 |
|
| 速度快 | 是 |
允许使用并发消息监听程序同时处理回复消息。您可以使用 |
|
| 速度快 | 是 |
允许使用并发消息监听程序同时处理回复消息。您可以使用 |
JmsProducer 检测到 InOut,并提供 JMSReplyTo 标头,其中包含要使用的回复目的地。默认情况下,Camel 使用临时队列,但您可以在端点上使用 replyTo 选项指定固定的回复队列(请参阅以下有关固定回复队列的更多信息)。
Camel 将自动设置侦听回复队列的消费者,因此 您不应 进行任何操作。
此使用者是一个 Spring DefaultMessageListenerContainer,它侦听回复。但是,它被修复为 1 个并发消费者。
这意味着将按顺序处理回复,因为只有 1 个线程来处理回复。您可以使用 concurrentConsumers 和 maxConcurrentConsumers 选项,将监听程序配置为使用并发线程。这可让您在 Camel 中更轻松地配置,如下所示:
from(xxx)
.inOut().to("activemq:queue:foo?concurrentConsumers=5")
.to(yyy)
.to(zzz);在这个路由中,我们指示 Camel 使用带有 5 个线程的线程池异步路由回复。
26.13.1. 请求通过 JMS 并使用共享的固定回复队列
如果您在执行 Request Reply over JMS 时使用固定的回复队列,如以下示例所示,请留意。
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar")
.to(yyy)
本例中使用了名为"bar"的固定回复队列。默认情况下,Camel 假设队列在使用固定回复队列时被共享,因此它使用 JMSSelector 来仅选取预期的回复消息(例如,基于 JMSCorrelationID)。有关独有的固定回复队列的下一部分。这意味着它不能像临时队列一样快。您可以使用 receiveTimeout 选项加快 Camel 将拉取回复消息的频率。默认情况下,其 1000 millis。因此,您可以更快地将其设置为 250 个 millis,以便每秒拉取 4 倍,如下所示:
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&receiveTimeout=250")
.to(yyy)
请注意,这将导致 Camel 更频繁地向消息代理发送拉取请求,因此需要更多网络流量。
通常建议尽可能使用临时队列。
26.13.2. 请求通过 JMS 并使用专用固定回复队列
在上例中,Camel 将预测名为"bar"的固定回复队列,因此它使用 JMSSelector 来仅使用期望的回复消息。但是,由于 JMS 选择器较慢,这样做存在缺陷。另外,回复队列中的使用者速度较慢,使用新的 JMS 选择器 ID 进行更新。实际上,它只在 receiveTimeout 选项超时时更新,这默认为 1 秒。因此,在理论上,回复信息可能会占用大约 1 sec 的时间。另一方面,如果固定的回复队列专用于 Camel 回复消费者,那么我们可以避免使用 JMS 选择器,因此更高性能。实际上,使用临时队列一样快。有 ReplyToType 选项,您可以将它配置为 Exclusive
来告知 Camel 回复队列是独占的,如下例所示:
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)请记住,队列必须专用于每个端点和每个端点。因此,如果您有两个路由,则每个路由都需要一个唯一的回复队列,如下例所示:
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)
from(aaa)
.inOut().to("activemq:queue:order?replyTo=order.reply&replyToType=Exclusive")
.to(bbb)如果您在集群环境中运行时也是如此。然后,集群中的每个节点都必须使用唯一的回复队列名称。否则,集群中的每个节点可能会选择在另一节点上回复的信息。对于集群环境,建议使用共享的回复队列。
26.14. 在发送者和接收器间同步时钟
在系统间执行消息传递时,其要求系统已同步时钟。例如,在发送 JMS 消息时,您可以在消息上设置一个生存时间值。然后,接收器可以检查这个值,并确定信息是否已过期,从而丢弃消息而不是消耗并处理它。但是,这需要发送者和接收器都已同步时钟。如果使用 ActiveMQ,您可以使用 时间戳插件来 同步时钟。
26.15. 关于生存时间
先阅读关于已同步时钟的上面。
当您使用 Camel 通过 JMS 进行请求/恢复(InOut)时,Camel 使用发送者侧的超时,即 requestTimeout 选项中的 20 秒。您可以通过设置更高的/较低值来控制它。但是,生存时间值仍然在要发送的消息上设置。以便在系统之间同步时钟。如果没有,您可能要禁用设置的实时值。现在,可以使用 Camel 2.8 中的 disableTimeToLive 选项来实现。因此,如果您将此选项设置为 disableTimeToLive=true,则 Camel 在发送 JMS 消息时 不会将 任何时间设置为实时值。但是 请求超时仍处于活动状态。例如,如果您对 JMS 进行请求/恢复,并且已禁用生存时间,则 Camel 仍会使用超时为 20 秒( requestTimeout 选项)。也可以为课程配置该选项。因此,两个选项 requestTimeout 和 disableTimeToLive 可让您在发出请求/回复时进行精细控制。
您可以在消息中提供标头来覆盖,并将其用作请求超时值,而不是端点配置的值。例如:
from("direct:someWhere")
.to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
.to("bean:processReply");
在上面的路由中,我们有一个端点配置的 requestTimeout 为 30 秒。因此,Camel 将等待 till 30 秒,以便该回复消息返回条队列。如果没有收到回复消息,则 Exchange 上设置了 org.apache.camel.ExchangeTimedOutException,Camel 会继续路由消息,然后 Camel 的错误处理程序会响应。
如果要使用每个消息超时值,您可以使用键 org.apache.camel.component.jms.JmsConstants#JMS_REQUEST_TIMEOUT 设置标头,其具有恒定值 "CamelJmsRequestTimeout",其超时值为长类型。
例如,我们可以使用 bean 按各个消息计算超时值,如在服务 Bean 上调用 "whatIsTheTimeout" 方法,如下所示:
from("direct:someWhere")
.setHeader("CamelJmsRequestTimeout", method(ServiceBean.class, "whatIsTheTimeout"))
.to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
.to("bean:processReply");
当您使用 Camel 对 JMS 进行触发和忘记(InOut)时,Camel 默认 不会将 消息上的任何时间设置为实时值。您可以使用 timeToLive 选项配置值。例如,要指明 5 sec。,您可以设置 timeToLive=5000。选项 disableTimeToLive 选项可用于强制禁用生存时间,以及仅限消息传递。requestTimeout 选项不用于 InOnly messaging。
26.16. 启用 Transacted Consumption
常见要求是从事务中的队列使用,然后使用 Camel 路由处理消息。要做到这一点,只请确定在组件/端点上设置以下属性:
-
Transacted= true -
transactionManager= Transsaction Manager - 通常是JmsTransactionManager
详情请查看 Transactional Client EIP 模式。
JMS 上的事务和 [Request Reply]
使用 Request Reply over JMS 时,您无法使用单个事务;在提交之前,JMS 不会发送任何消息,因此在事务提交之前,服务器端都不会收到任何内容。因此,若要在发送请求后使用 Request Reply 提交事务,然后使用单独的事务来接收响应。
要解决这个问题,JMS 组件使用不同的属性来指定用于单向消息传递和请求回复消息传递的事务使用:
转换属性 仅适用于 InOnly message Exchange Pattern (MEP)。
您可以使用组件/端点中的以下属性利用 DMLC 转换会话 API :
-
Transacted= true -
lazyCreateTransactionManager= false
这样做的好处是,当在没有配置的 TransactionManager 的情况下使用本地事务时,cacheLevel 设置将得到遵守。配置 TransactionManager 时,在 DMLC 级别上不会发生缓存,需要依赖池的连接工厂。有关此类设置的详情,请查看 此处 和 此处。
26.17. 使用 JMSReplyTo 进行后回复
当使用 Camel 作为 JMS 侦听器时,它会设置 Exchange 属性,其值为 ReplyTo javax.jms.Destination 对象,其键为 ReplyTo。您可以按照以下方法获取 此 目的:
Destination replyDestination = exchange.getIn().getHeader(JmsConstants.JMS_REPLY_DESTINATION, Destination.class);
之后,使用它来发送使用常规 JMS 或 Camel 的回复。
// we need to pass in the JMS component, and in this sample we use ActiveMQ JmsEndpoint endpoint = JmsEndpoint.newInstance(replyDestination, activeMQComponent); // now we have the endpoint we can use regular Camel API to send a message to it template.sendBody(endpoint, "Here is the late reply.");
发送回复的另一个解决方案是在发送时在同一 Exchange 属性中提供 回复 对象。然后,Camel 将提取此属性并将其用于实际目的地。然而,端点 URI 必须包含 dummy 目的地。例如:
// we pretend to send it to some non existing dummy queue
template.send("activemq:queue:dummy, new Processor() {
public void process(Exchange exchange) throws Exception {
// and here we override the destination with the ReplyTo destination object so the message is sent to there instead of dummy
exchange.getIn().setHeader(JmsConstants.JMS_DESTINATION, replyDestination);
exchange.getIn().setBody("Here is the late reply.");
}
}26.18. 使用请求超时
在以下示例中,我们将 Request Reply 风格的消息 Exchange (我们使用 requestBody 方法 = InOut)发送到缓慢的队列,以便在 Camel 中进一步处理,并等待返回回复:
26.19. 发送 InOnly 消息并保持 JMSReplyTo 标头
使用 camel-jms 发送到 JMS 目的地时,生产者将使用 MEP 来检测其 InOnly 或 InOut 消息传递。但是,有时您可能需要发送 InOnly 消息,但保留 JMSReplyTo 标头。为此,您必须指示 Camel 保留它,否则将丢弃 JMSReplyTo 标头。
例如,要将 InOnly 消息发送到 foo 队列,但带有 JMSReplyTo 及 bar 队列,您可以按照以下方法执行以下操作:
template.send("activemq:queue:foo?preserveMessageQos=true", new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody("World");
exchange.getIn().setHeader("JMSReplyTo", "bar");
}
});
请注意,我们使用 preserveMessageQos=true 来指示 Camel 保持 JMSReplyTo 标头。
26.20. 在目的地上设置 JMS 提供程序选项
某些 JMS 提供程序,如 IBM 的 WebSphere MQ 需要对 JMS 目的地设置选项。例如,您可能需要指定 targetClient 选项。由于 targetClient 是 WebSphere MQ 选项,而不是 Camel URI 选项,您需要在 JMS 目标名称上设置该 URI,如下所示:
// ...
.setHeader("CamelJmsDestinationName", constant("queue:///MY_QUEUE?targetClient=1"))
.to("wmq:queue:MY_QUEUE?useMessageIDAsCorrelationID=true");一些版本的 WMQ 在目标名称上不接受这个选项,您将获得如下例外:
com.ibm.msg.client.jms.DetailedJMSException: JMSCC0005: The specified value 'MY_QUEUE?targetClient=1' is not allowed for 'XMSC_DESTINATION_NAME'
临时解决方案是使用自定义 DestinationResolver:
JmsComponent wmq = new JmsComponent(connectionFactory);
wmq.setDestinationResolver(new DestinationResolver() {
public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException {
MQQueueSession wmqSession = (MQQueueSession) session;
return wmqSession.createQueue("queue:///" + destinationName + "?targetClient=1");
}
});26.21. Spring Boot Auto-Configuration
将 jms 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jms-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 99 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.jms.accept-messages-while-stopping | 指定消费者在停止期间是否接受消息。如果您在运行时启动和停止 JMS 路由,您可能会考虑启用此选项,而队列中仍存在消息排队。如果此选项为 false,并且您停止 JMS 路由,那么消息可能会被拒绝,并且 JMS 代理必须尝试红色的提示,但可能再次被拒绝,最终可能会在 JMS 代理上的死信队列中移动消息。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
| camel.component.jms.acknowledgement-mode-name | JMS 确认名称,即 SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE。 | AUTO_ACKNOWLEDGE | 字符串 |
| camel.component.jms.allow-additional-headers | 此选项用于允许其他标头,这些标头可能具有根据 JMS 规范无效的值。例如,WMQ 等消息系统利用前缀 JMS_IBM_MQMD_ 包含具有字节数组或其他无效类型的值的标头名称来执行此操作。您可以指定多个以逗号分开的标头名称,用作通配符匹配的后缀。 | 字符串 | |
| camel.component.jms.allow-auto-wired-connection-factory | 如果尚未配置任何连接工厂,是否从 registry 中自动发现 ConnectionFactory。如果只找到 ConnectionFactory 的一个实例,则会使用它。这默认是启用的。 | true | 布尔值 |
| camel.component.jms.allow-auto-wired-destination-resolver | 如果尚未配置目标解析器,是否从 registry 中自动发现目标解析程序。如果只找到 DestinationResolver 的一个实例,则会使用它。这默认是启用的。 | true | 布尔值 |
| camel.component.jms.allow-null-body | 是否允许发送没有正文的消息。如果此选项为 false 且邮件正文为 null,则抛出 JMSException。 | true | 布尔值 |
| camel.component.jms.allow-reply-manager-quick-stop | 回复管理器中是否使用了 DefaultMessageListenerContainer 进行 request-reply 消息,允许 DefaultMessageListenerContainer.runningAllowed 标志在 JmsConfiguration#isAcceptMessagesWhileStopping 已启用时,org.apache.camel.CamelContext 当前已停止。在常规 JMS 使用者中默认启用这种快速停止功能,但要为回复管理器启用此标志。 | false | 布尔值 |
| camel.component.jms.allow-serialized-headers | 控制是否包含序列化标头。仅在 transferExchange 为 true 时才适用。这要求对象是串行的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。 | false | 布尔值 |
| camel.component.jms.always-copy-message | 如果为 true,Camel 将始终在消息传递给制作者时进行 JMS 消息副本以进行发送。在某些情况下需要复制消息,例如当设置了 replyToDestinationSelectorName 时(如果设置了 replyToDestinationSelectorName),Camel 会将 alwaysCopyMessage 选项设置为 true。 | false | 布尔值 |
| camel.component.jms.artemis-consumer-priority | 通过使用者优先级,您可以确保高优先级消费者在信息处于活动状态时收到信息。通常,连接到队列的活动消费者以轮循方式接收来自它的消息。当使用消费者优先级时,如果存在多个具有同样高优先级的活跃使用者,则消息将按循环发送。只有高优先级消费者没有可用的信用时,消息才会降低优先级消费者,或者那些高优先级消费者接受消息(例如,因为它不符合与消费者关联的任何选择器标准)。 | 整数 | |
| camel.component.jms.artemis-streaming-enabled | 是否针对 Apache Artemis 流模式进行优化。这在使用带有 JMS StreamMessage 类型的 Artemis 时,这可以减少内存开销。只有在使用 Apache Artemis 时,才必须启用此选项。 | false | 布尔值 |
| camel.component.jms.async-consumer | JmsConsumer 异步处理 Exchange。如果启用,JmsConsumer 可能会从 JMS 队列中选取下一个消息,而前面的消息被异步处理(通过异步路由引擎)。这意味着消息可能会按顺序处理,而不是严格处理。如果禁用(默认),则交换在 JmsConsumer 将从 JMS 队列中选取下一消息之前完全处理。请注意,如果启用了 transacted,则 asyncConsumer=true 不会异步运行,因为事务必须异步执行(Camel 3.0 可能会支持 async 事务)。 | false | 布尔值 |
| camel.component.jms.async-start-listener | 在启动一个路由时,是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法获得到远程 JMS 代理的连接,那么在重试和/或故障转移时可能会阻断它。这会导致 Camel 在启动路由时阻止。通过将这个选项设置为 true,您将让路由启动,而 JmsConsumer 使用专用线程以异步模式连接到 JMS 代理。如果使用这个选项,请注意,如果无法建立连接,则会在 WARN 级别上记录异常,消费者将无法接收消息;然后,您可以重启路由来重试。 | false | 布尔值 |
| camel.component.jms.async-stop-listener | 在停止路由时,是否异步停止 JmsConsumer 消息监听程序。 | false | 布尔值 |
| camel.component.jms.auto-startup | 指定消费者容器是否应该自动启动。 | true | 布尔值 |
| camel.component.jms.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.jms.cache-level | 根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。 | 整数 | |
| camel.component.jms.cache-level-name | 根据底层 JMS 资源的名称设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。 | CACHE_AUTO | 字符串 |
| camel.component.jms.client-id | 设置要使用的 JMS 客户端 ID。请注意,这个值(如果指定)必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只需要持久化的主题订阅。如果使用 Apache ActiveMQ,您可能需要改为使用虚拟主题。 | 字符串 | |
| camel.component.jms.concurrent-consumers | 指定从 JMS 消耗时的默认并发消费者数量(而不是通过 JMS 进行请求/恢复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当对 JMS 进行请求/恢复时,选项 replyToConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | 1 | 整数 |
| camel.component.jms.configuration | 使用共享 JMS 配置。选项是 org.apache.camel.component.jms.JmsConfiguration 类型。 | JmsConfiguration | |
| camel.component.jms.connection-factory | 要使用的连接工厂。必须在组件或端点上配置连接工厂。选项是 javax.jms.ConnectionFactory 类型。 | ConnectionFactory | |
| camel.component.jms.consumer-type | 要使用的消费者类型,可以是一个简单的、默认或 Custom 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,简单将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,由 messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 将决定使用哪个 org.springframework.jms.listener.AbstractMessageListenerContainer。 | ConsumerType | |
| camel.component.jms.correlation-property | 在使用 InOut Exchange 模式时,请使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置的消息仅关联此属性 JMSCorrelationID 属性的值,则 Camel 不会设置它。 | 字符串 | |
| camel.component.jms.default-task-executor-type | 指定 DefaultMessageListenerContainer 中使用的默认 TaskExecutor 类型,用于消费者端点和制作者端点的 ReplyTo consumer。可能的值: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用 Spring 的 ThreadPoolTaskExecutor,带有最佳值 - 缓存线程池)。如果没有设置,则默认为前面的行为,它会对消费者端点使用缓存的线程池,对回复消费者使用 SimpleAsync。建议使用 ThreadPool 来减少弹性配置中线程垃圾箱,并动态增加和减少并发用户。 | DefaultTaskExecutorType | |
| camel.component.jms.delivery-delay | 设置用于为 JMS 发送调用的交付延迟。这个选项需要兼容 JMS 2.0 的代理。 | -1 | Long |
| camel.component.jms.delivery-mode | 指定要使用的交付模式。可能的值由 javax.jms.DeliveryMode 定义。NON_PERSISTENT = 1 和 PERSISTENT = 2. | 整数 | |
| camel.component.jms.delivery-persistent | 指定是否默认使用持久性发送。 | true | 布尔值 |
| camel.component.jms.destination-resolver | 可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找实际目的地)。选项是 org.springframework.jms.support.destination.DestinationResolver 类型。 | DestinationResolver | |
| camel.component.jms.disable-reply-to | 指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目的地发送回复。如果您希望 Camel 从路由使用,并且您不希望 Camel 自动发送回复消息,则可使用此选项,因为代码中的另一个组件处理回复消息。如果您要将 Camel 用作不同消息代理之间的代理,并且希望将消息从一个系统路由到另一个系统,您也可以使用这个选项。 | false | 布尔值 |
| camel.component.jms.disable-time-to-live | 使用这个选项强制禁用生存时间。例如,当您通过 JMS 进行请求/恢复时,Camel 默认将使用 requestTimeout 值作为在发送的消息上生存的时间。问题是,发件人和接收器系统必须同步其时钟,因此它们保持同步。这并非总是可以归档。因此,您可以使用 disableTimeToLive=true 不对发送的消息将时间设置为实时值。然后,消息不会在接收器系统中过期。如需了解更多详细信息,请参见关于生存时间一节中的。 | false | 布尔值 |
| camel.component.jms.durable-subscription-name | 用于指定持久主题订阅的持久订阅者名称。还必须配置 clientId 选项。 | 字符串 | |
| camel.component.jms.eager-loading-of-properties | 加载消息后,立即启用 JMS 属性和有效负载,这通常效率低下,因为 JMS 属性可能不需要,但有时可能会捕获底层 JMS 提供程序以及使用 JMS 属性的早期问题。另请参阅 eagerPoisonBody 选项。 | false | 布尔值 |
| camel.component.jms.eager-poison-body | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)为 poison (不能读取/映射),则将此文本设置为消息正文,因此可以处理消息(中毒的原因已存储为 Exchange 上的异常)。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅 eagerLoadingOfProperties 选项。 | 因为 $\{exception.message} 导致 Poison JMS 消息 | 字符串 |
| camel.component.jms.enabled | 是否启用 jms 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.jms.error-handler | 指定在处理消息时任何未捕获异常时调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置 errorHandler,则会在 WARN 级别记录这些例外。您可以使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项配置日志记录级别以及堆栈跟踪是否被记录。这样可以更容易配置,而不必对自定义错误处理程序进行编码。选项是 org.springframework.util.ErrorHandler 类型。 | ErrorHandler | |
| camel.component.jms.error-handler-log-stack-trace | 允许根据默认的 errorHandler 控制是否应记录堆栈追踪。 | true | 布尔值 |
| camel.component.jms.error-handler-logging-level | 允许为日志未捕获异常配置默认错误处理程序日志记录级别。 | LoggingLevel | |
| camel.component.jms.exception-listener | 指定 JMS Exception Listener,用于通知任何底层 JMS 异常。选项是 javax.jms.ExceptionListener 类型。 | ExceptionListener | |
| camel.component.jms.explicit-qos-enabled | 设置在发送消息时是否应使用 deliveryMode、priority 或 timeToLive 服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用于当前端点。这与 preserveMessageQos 选项(以消息粒度运行)不同,读取来自 Camel In 消息标头的 QoS 属性。 | false | 布尔值 |
| camel.component.jms.expose-listener-session | 指定在使用信息时是否应公开监听程序会话。 | false | 布尔值 |
| camel.component.jms.force-send-original-message | 使用 mapJmsMessage=false Camel 时,如果您接触路由期间的标头(get 或 set)将创建一个新的 JMS 消息,以发送到新的 JMS 目的地。将此选项设置为 true,以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
| camel.component.jms.format-date-headers-to-iso8601 | 设置 JMS date 属性是否应根据 ISO 8601 标准进行格式化。 | false | 布尔值 |
| camel.component.jms.header-filter-strategy | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
| camel.component.jms.idle-consumer-limit | 指定在任意给定时间允许闲置的使用者数量限制。 | 1 | 整数 |
| camel.component.jms.idle-task-execution-limit | 指定接收任务的空闲执行限制,而不在其执行中收到任何消息。如果达到这个限制,任务将关闭并保持进入其他执行任务(如果是动态调度);请参阅 maxConcurrentConsumers 设置。Spring 提供了额外的 doc。 | 1 | 整数 |
| camel.component.jms.include-all-j-m-s-x-properties | 从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则此选项不适用。 | false | 布尔值 |
| camel.component.jms.include-sent-j-m-s-message-i-d | 仅在使用 InOnly (例如触发和忘记)发送到 JMS 目的地时才适用。启用此选项将增强 Camel Exchange 与将消息发送到 JMS 目的地时由 JMS 客户端使用的实际 JMSMessageID。 | false | 布尔值 |
| camel.component.jms.jms-key-format-strategy | 用于编码和解码 JMS 密钥的可插拔策略,以便它们可以与 JMS 规范兼容。Camel 开箱即用两种实施:default 和 passthrough。默认策略将安全分类点和连字符(. 和 -)。passthrough 策略原样保留密钥。可用于 JMS 代理,不关心 JMS 标头键是否包含非法字符。您可以提供对 org.apache.camel.component.jms.JmsKeyFormatStrategy 自己的实施,并使用 # 表示法引用它。 | JmsKeyFormatStrategy | |
| camel.component.jms.jms-message-type | 允许您强制使用特定的 javax.jms.Message 实施来发送 JMS 消息。可能的值有:Bytes, Map, Object, Stream, Text。默认情况下,Camel 将决定从 In body 类型中使用的 JMS 消息类型。这个选项允许您指定它。 | JmsMessageType | |
| camel.component.jms.lazy-create-transaction-manager | 如果为 true,Camel 将创建一个 JmsTransactionManager,如果没有在选项transacted=true 时注入 transactionManager。 | true | 布尔值 |
| camel.component.jms.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.jms.map-jms-message | 指定 Camel 是否应自动将收到的 JMS 消息映射到合适的载荷类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
| camel.component.jms.max-concurrent-consumers | 指定从 JMS 消耗时的最大并发消费者数(而不是通过 JMS 请求/恢复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当对 JMS 进行请求时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发使用者数量。 | 整数 | |
| camel.component.jms.max-messages-per-task | 每个任务的消息数。-1 代表没有限制。如果您对并发消费者使用范围(如 min max),那么此选项可用于设置值 eg 100 来控制用户在需要较少工作时如何缩小。 | -1 | 整数 |
| camel.component.jms.message-converter | 要使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。选项是 org.springframework.jms.support.converter.MessageConverter 类型。 | MessageConverter | |
| camel.component.jms.message-created-strategy | 要使用给定的 MessageCreatedStrategy,可在 Camel 发送 JMS 消息时创建 javax.jms.Message 对象的新实例时调用。选项是 org.apache.camel.component.jms.MessageCreatedStrategy 类型。 | MessageCreatedStrategy | |
| camel.component.jms.message-id-enabled | 发送时,指定是否应添加消息 ID。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将消息 ID 设置为 null;如果提供程序忽略了 hint,消息 ID 必须设为其普通唯一值。 | true | 布尔值 |
| camel.component.jms.message-listener-container-factory | 用于决定使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 MessageListenerContainer 的 registry ID。设置此选项会自动将 consumerType 设置为 Custom。选项是 org.apache.camel.component.jms.MessageListenerContainerFactory 类型。 | MessageListenerContainerFactory | |
| camel.component.jms.message-timestamp-enabled | 指定在发送消息时是否默认启用时间戳。这只是对 JMS 代理的提示。如果 JMS 供应商接受此提示,则这些消息必须将时间戳设置为零;如果供应商忽略了提示,时间戳必须设置为其正常值。 | true | 布尔值 |
| camel.component.jms.password | 要用于 ConnectionFactory 的密码。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
| camel.component.jms.preserve-message-qos | 如果要使用在消息上指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置,则设置为 true。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中一些。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖端点中的值。相反,explicitQosEnabled 选项将使用端点上设置的选项,而不使用消息标头中的值。 | false | 布尔值 |
| camel.component.jms.priority | 大于 1 的值在发送时指定消息优先级(其中 1 是最低优先级,9 是最高)。还必须启用 explicitQosEnabled 选项,以便这个选项起作用。 | 4 | 整数 |
| camel.component.jms.pub-sub-no-local | 指定是否禁止提供由其自身连接发布的消息。 | false | 布尔值 |
| camel.component.jms.queue-browse-strategy | 在浏览队列时使用自定义 QueueBrowseStrategy。选项是 org.apache.camel.component.jms.QueueBrowseStrategy 类型。 | QueueBrowseStrategy | |
| camel.component.jms.receive-timeout | 接收消息的超时时间(以毫秒为单位)。选项是一个长类型。 | 1000 | Long |
| camel.component.jms.recovery-interval | 指定恢复尝试之间的间隔,例如在刷新连接时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。选项是一个长类型。 | 5000 | Long |
| camel.component.jms.reply-to | 提供明确的 ReplyTo destination (会覆盖消费者中的 Message.getJMSReplyTo ()的任何传入值)。 | 字符串 | |
| camel.component.jms.reply-to-cache-level-name | 在通过 JMS 发出请求/回复消费者时,按名称设置缓存级别。这个选项仅在使用固定回复队列(非临时)时适用。Camel 默认使用:CACHE_CONSUMER 用于专用或者共享 w/ replyToSelectorName。和 CACHE_SESSION 用于没有 replyToSelectorName 共享。一些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能正常工作。注意:如果不允许使用临时队列,则不允许使用 CACHE_NONE,则必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 | 字符串 | |
| camel.component.jms.reply-to-concurrent-consumers | 指定通过 JMS 进行请求/恢复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | 1 | 整数 |
| camel.component.jms.reply-to-delivery-persistent | 指定默认情况下是否使用持久发送进行回复。 | true | 布尔值 |
| camel.component.jms.reply-to-destination-selector-name | 使用固定名称来设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(也就是说,如果您不使用临时回复队列)。 | 字符串 | |
| camel.component.jms.reply-to-max-concurrent-consumers | 指定使用请求/通过 JMS 时的最大并发消费者数。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | 整数 | |
| camel.component.jms.reply-to-on-timeout-max-concurrent-consumers | 指定在使用 request/reply over JMS 时发生超时时的最大并发消费者数。 | 1 | 整数 |
| camel.component.jms.reply-to-override | 在 JMS 消息中提供显式 ReplyTo destination,它将覆盖 replyTo 的设置。如果您要将消息转发到远程 Queue,并从 ReplyTo 目的地接收回复消息,这很有用。 | 字符串 | |
| camel.component.jms.reply-to-same-destination-allowed | 是否允许 JMS 使用者向消费者使用的同一目的地发送回复消息。这可防止最终循环消耗并将相同的消息发送到其自身。 | false | 布尔值 |
| camel.component.jms.reply-to-type | 允许在通过 JMS 发出请求/恢复请求时明确指定要用于 replyTo 队列的策略。可能的值有: Temporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。这个选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档以了解更多详情,特别是有关在集群环境中运行时的指示,以及共享回复队列的性能低于其替代 Temporary 和 Exclusive 的情况。 | ReplyToType | |
| camel.component.jms.request-timeout | 使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时时间。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此具有不同的超时值。另请参阅 requestTimeoutCheckerInterval 选项。选项是一个长类型。 | 20000 | Long |
| camel.component.jms.request-timeout-checker-interval | 配置 Camel 在通过 JMS 执行此操作时应如何检查超时交换。默认情况下,Camel 每秒检查一次。但是,如果在发生超时时必须更快地响应,那么您可以降低此间隔,才能更频繁地检查。超时由选项 requestTimeout 决定。选项是一个长类型。 | 1000 | Long |
| camel.component.jms.selector | 设置要使用的 JMS 选择器。 | 字符串 | |
| camel.component.jms.stream-message-type-enabled | 设置是否启用了 StreamMessage 类型。消息流传输类型的消息有效负载,如 files、InputStream 等,它将通过发送为 BytesMessage 或 StreamMessage。此选项控制将使用的 kind。默认情况下,使用 BytesMessage,它将强制将整个消息有效负载读到内存中。通过启用这个选项,消息有效负载会在块中读取到内存中,然后每个块被写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
| camel.component.jms.subscription-durable | 设置是否使订阅持久化。可以通过 subscriptionName 属性指定要使用的订阅名称。默认为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非消息监听程序类名称足够足够为订阅名称)。只有在侦听一个主题(pub-sub 域)时,仅有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
| camel.component.jms.subscription-name | 设置要创建的订阅的名称。在带有共享或持久订阅的主题(pub-sub 域)时应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:除了共享订阅外,每个订阅都只允许 1 个并发消费者(这是此消息监听程序容器的默认值),但共享订阅除外(需要 JMS 2.0)。 | 字符串 | |
| camel.component.jms.subscription-shared | 设置是否共享订阅。要使用的共享订阅名称可以通过 subscriptionName 属性指定。默认为 false。把它设置为 true 以注册共享订阅,通常使用 subscriptionName 值(除非您的消息监听程序类名称足够足以满足订阅名称)。请注意,共享的订阅也可能高度可用,因此此标志也可以(并且经常)与 subscriptionDurable 结合使用。只有在侦听一个主题(pub-sub 域)时,仅有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
| camel.component.jms.synchronous | 设置是否应严格使用同步处理。 | false | 布尔值 |
| camel.component.jms.task-executor | 允许您为使用消息指定自定义任务执行器。选项是一个 org.springframework.core.task.TaskExecutor 类型。 | TaskExecutor | |
| camel.component.jms.test-connection-on-startup | 指定是否在启动时测试连接。这可确保 Camel 启动所有 JMS 用户具有与 JMS 代理的有效连接。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS 制作者也经过测试。 | false | 布尔值 |
| camel.component.jms.time-to-live | 发送消息时,指定消息的生存时间(以毫秒为单位)。 | -1 | Long |
| camel.component.jms.transacted | 指定是否使用转换模式。 | false | 布尔值 |
| camel.component.jms.transacted-in-out | 如果此标志设为 true,则指定 InOut 操作(请求回复)是否默认使用 transacted 模式,则 Spring JmsTemplate 将把 sessionTransacted 设置为 true,并在用于 InOut 操作的 JmsTemplate 上将确认Mode 作为转换。来自 Spring JMS:在 JTA 事务中,传递给 createQueue 的参数不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器会根据这些值自行做出决定。类似地,这些参数不会考虑在本地管理的事务内,因为本例中的 Spring JMS 在现有的 JMS Session 上运行。将此标志设置为 true 会在受管事务之外运行时使用简短的本地 JMS 事务,并在存在受管事务(除 XA 事务外)时,使用同步的本地 JMS 事务。这具有与主事务(可能是原生 JDBC 事务)管理的本地 JMS 事务的影响,并在主事务后提交 JMS 事务。 | false | 布尔值 |
| camel.component.jms.transaction-manager | 要使用的 Spring 事务管理器。选项是一个 org.springframework.transaction.PlatformTransactionManager 类型。 | PlatformTransactionManager | |
| camel.component.jms.transaction-name | 要使用的事务的名称。 | 字符串 | |
| camel.component.jms.transaction-timeout | 如果使用转换模式,事务的超时值(以秒为单位)。 | -1 | 整数 |
| camel.component.jms.transfer-exception | 如果启用并且您正在使用 Request Reply messaging (InOut),而 Exchange 在消费者一侧失败,则原因 Exception 将发回以 javax.jms.ObjectMessage 的响应。如果客户端是 Camel,则返回的 Exception 会被重新浏览。这允许您在路由中使用 Camel JMS 作为网桥 - 例如,使用持久队列启用可靠的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。必须使相关例外是串行的。消费者端的原始 Exception 可以封装在外部异常中,如 org.apache.camel.RuntimeCamelException (当返回到制作者时)。请谨慎使用它,因为数据使用 Java 对象序列化,需要收到的才能在类级别上反序列化数据,这会强制生产者和消费者之间进行强耦合! | false | 布尔值 |
| camel.component.jms.transfer-exchange | 您可以通过线来传输交换,而不只是正文和标头。以下字段已传输:在正文、出口正文、错误正文、标头、出口标头、交换属性、交换异常中。这要求对象是串行的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用这个选项,因此 Camel 知道有效负载是 Exchanges,而不是常规有效负载。请谨慎使用它,因为数据正在使用 Java 对象序列化,并且需要接收器能够在类级别上反序列化数据,这会强制在使用兼容 Camel 版本的用户之间强制进行强大的耦合! | false | 布尔值 |
| camel.component.jms.use-message-i-d-as-correlation-i-d | 指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
| camel.component.jms.username | 用于 ConnectionFactory 的用户名。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
| camel.component.jms.wait-for-provision-correlation-to-be-updated-counter | 在启用使用MessageIDAsCorrelationID 时,等待调配关联 ID 更新为实际关联 ID 的次数。 | 50 | 整数 |
| camel.component.jms.wait-for-provision-correlation-to-be-updated-thread-sleeping-time | millis 在等待配置关联 ID 进行更新时的睡眠时间。选项是一个长类型。 | 100 | Long |
第 27 章 Kafka
支持制作者和使用者
Kafka 组件用于与 Apache Kafka 消息代理通信。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-kafka</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>27.1. URI 格式
kafka:topic[?options]
27.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
27.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
27.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
27.3. 组件选项
Kafka 组件支持 104 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| additionalProperties (common) | 如果无法直接在 camel 配置上设置 kafka consumer 或 kafka producer 的额外属性(例如:尚未反映在 Camel 配置中的新 Kafka 属性),属性必须加上额外的Properties。e.g: additionalProperties.transactional.id=12345&additionalProperties.schema.registry.url=http://localhost:8811/avro。 | map | |
| 代理 (common) | 要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理的子集,也可以是指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。 | 字符串 | |
| clientID (common) | 客户端 id 是每个请求中发送的用户指定的字符串,以帮助追踪调用。它应该以逻辑方式识别提出请求的应用。 | 字符串 | |
| 配置 (common) | 允许使用端点将重复使用的通用选项预配置 Kafka 组件。 | KafkaConfiguration | |
| headerFilterStrategy (common) | 使用自定义 HeaderFilterStrategy 过滤标题到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| reconnectBackoffMaxMs (common) | 当重新连接到重复连接失败的代理时,需要等待的最大时间(毫秒)。如果提供,每个主机的 backoff 将为每个连续的连接失败指数增加,直到最高值。在计算 backoff 增长后,会添加 20% 随机的 jitter 以避免连接 storms。 | 1000 | 整数 |
| shutdownTimeout (common) | 超时时间(毫秒),以毫秒为单位,等待消费者或制作者关闭并终止其 worker 线程。 | 30000 | int |
| allowManualCommit (consumer) | 是否允许通过 KafkaManualCommit 进行手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange 消息标头中,它允许最终用户访问此 API 并通过 Kafka 使用者执行手动偏移提交。 | false | 布尔值 |
| autoCommitEnable (consumer) | 如果为 true,请定期提交到 ZooKeeper,以偏移已由消费者获取的信息。当进程失败时,会使用这个提交的偏移,因为新消费者开始的位置。 | true | 布尔值 |
| autoCommitIntervalMs (consumer) | 消费者偏移的 ms 频率被提交到 zookeeper。 | 5000 | 整数 |
| autoCommitOnStop (consumer) | 当消费者停止时是否执行显式自动提交,以确保代理具有上次消耗的消息的提交。这要求打开自动CommitEnable 选项。可能的值有: sync、async 或 none。和 sync 是默认值。 Enum 值:
| sync | 字符串 |
| autoOffsetReset (consumer) | 当 ZooKeeper 中没有初始偏移时,或者偏移范围不足: earliest : 自动将偏移重置为最早偏移最新的 : 自动将偏移重置为最新的偏移失败:将偏移重置为最新的偏移失败:向消费者抛出异常。 Enum 值:
| latest | 字符串 |
| breakOnFirstError (consumer) | 此选项控制消费者处理交换时会发生什么,并且失败。如果选项为 false,则使用者将继续执行下一个消息并处理它。如果选项为 true,则消费者会中断,并将返回到导致失败的消息偏移,然后重新尝试处理此消息。但是,如果其绑定每次都失败,这可能会导致无法处理同一消息,例如中毒消息。因此,建议您使用 Camel 的错误处理程序处理示例。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| checkCrcs (consumer) | 自动检查已使用的记录的 CRC32。这样可确保发生消息的在线或磁盘损坏。此检查添加了一些开销,因此在寻求极端性能的情况下可能会禁用它。 | true | 布尔值 |
| commitTimeoutMs (consumer) | 代码将等待同步提交完成的最长时间(以毫秒为单位)。 | 5000 | Long |
| consumerRequestTimeoutMs (consumer) | 配置控制客户端等待请求响应的最长时间。如果响应在超时前收到,客户端会在必要时重新发送请求,或者在重试已耗尽时失败请求。 | 40000 | 整数 |
| consumer Count (消费者) | 连接到 kafka 服务器的消费者数量。每个使用者在单独的线程上运行,后者检索和处理传入的数据。 | 1 | int |
| fetchMaxBytes (consumer) | 服务器应该为获取请求返回的最大数据量。如果 fetch 的第一个非空分区中的第一个消息大于这个值,则消息仍会返回,以确保消费者进行进度。代理接受的最大消息大小通过 message.max.bytes (broker config)或 max.message.bytes (topic config)定义。请注意,消费者并行执行多个获取。 | 52428800 | 整数 |
| fetchMinBytes (consumer) | 服务器应该为获取请求返回的最小数据量。如果数据不足,请求将在回答请求之前等待大量数据。 | 1 | 整数 |
| fetchWaitMaxMs (consumer) | 如果没有足够的数据来满足 fetch.min.bytes,则服务器在回答获取请求前将阻止的最大时间。 | 500 | 整数 |
| groupId (consumer) | 唯一标识此使用者进程组的字符串。通过设置相同的组 id 多个进程,表示它们都是同一消费者组的一部分。消费者需要这个选项。 | 字符串 | |
| groupInstanceId (consumer) | 最终用户提供的使用者实例的唯一标识符。仅允许非空字符串。如果设置,使用者将被视为静态成员,这意味着任何消费者组中只允许具有此 ID 的一个实例。这可以与更大的会话超时结合使用,以避免由临时不可用(如进程重启)导致的组重新平衡。如果没有设置,使用者将作为动态成员加入组,这是传统的行为。 | 字符串 | |
| headerDeserializer (consumer) | 使用自定义 KafkaHeaderDeserializer 来反序列化 kafka 标头值。 | KafkaHeaderDeserializer | |
| heartbeatIntervalMs (consumer) | 使用 Kafka 的组管理功能时,心跳到消费者协调器之间的预期时间。心跳用于确保消费者的会话保持活跃状态,并在新消费者加入或离开组时进行重新平衡。该值必须小于 session.timeout.ms,但设置的值通常不应超过该值的 1/3。它甚至可以降低以控制正常重新平衡的预期时间。 | 3000 | 整数 |
| keyDeserializer (consumer) | 为实现 Deserializer 接口的密钥反序列化器类。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
| maxPartitionFetchBytes (consumer) | 服务器将返回的每个分区的最大数据量。请求使用的最大内存为 #partitions max.partition.fetch.bytes。此大小必须至少与服务器允许的最大消息大小相同,否则生成者可能会发送大于消费者的消息。如果发生这种情况,使用者可能会卡住尝试在特定分区上获取大型消息。 | 1048576 | 整数 |
| maxPollIntervalMs (使用者) | 使用消费者组管理时轮询()调用之间的最大延迟。这会在获取更多记录前,在消费者闲置的时间上绑定上。如果在此超时过期之前没有调用 poll (),那么消费者将被视为失败,并且组将重新平衡,以便将分区重新分配给另一个成员。 | Long | |
| maxPollRecords (consumer) | 在要 poll ()的单个调用中返回的最大记录数。 | 500 | 整数 |
| offsetRepository (consumer) | 要使用的偏移存储库,以便本地存储主题的每个分区的偏移量。定义一个将禁用 autocommit。 | StateRepository | |
| partitionAssignor (consumer) | 使用组管理时,客户端将使用的分区分配策略的类名称在消费者实例之间分发分区所有权。 | org.apache.kafka.clients.consumer.RangeAssignor | 字符串 |
| pollOnError (consumer) | 如果 kafka threw 异常在轮询新消息时,应该做什么。默认情况下,将使用组件配置中的值,除非在端点级别上配置了显式值。DISCARD 将丢弃消息并继续轮询下一个消息。ERROR_HANDLER 将使用 Camel 的错误处理程序来处理异常,之后继续轮询下一个消息。RECONNECT 将重新连接消费者,并尝试再次轮询消息,使消费者再次轮询同一消息将停止消费者(如果消费者应可以再次使用,则必须手动启动/重新启动)。 Enum 值:
| ERROR_HANDLER | PollOnError |
| pollTimeoutMs (consumer) | 轮询 KafkaConsumer 时使用的超时。 | 5000 | Long |
| resumeStrategy (consumer) | 这个选项允许用户设置自定义恢复策略。当分配分区时(例如:连接或重新连接时),执行恢复策略。它允许实施自定义如何恢复操作,并作为 seekTo 和 offsetRepository 机制的更灵活的替代方案。有关实现详情,请参阅 KafkaConsumerResumeStrategy。此选项不会影响自动提交设置。使用此设置的实现可能还要使用手动提交选项来评估。 | KafkaConsumerResumeStrategy | |
| seekTo (consumer) | 设置 KafkaConsumer 将在启动时从开始或结尾读取:从开始开始读取 : read from end : read from end This is replace the earlier attribute seekToBeginning。 Enum 值:
| 字符串 | |
| sessionTimeoutMs (consumer) | 使用 Kafka 组管理功能时用于检测故障的超时。 | 10000 | 整数 |
| specificAvroReader (consumer) | 这可让特定的 Avro reader 用于 Confluent Platform schema registry 和 io.confluent.kafka.serializers.KafkaAvroDeserializer。这个选项只在 Confluent Platform (不是标准 Apache Kafka)中可用。 | false | 布尔值 |
| topicIsPattern (consumer) | 主题是否为模式(正则表达式)。这可以用于订阅与模式匹配的动态主题数。 | false | 布尔值 |
| 值Deserializer (使用者) | deserializer 类用于实现 Deserializer 接口的值。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
| kafkaManualCommitFactory (使用者(高级) | Autowired Factory 用于创建 KafkaManualCommit 实例。当从开箱即用的默认实现中手动提交时,这允许自定义工厂创建自定义 KafkaManualCommit 实例,以防需要进行特殊逻辑。 | KafkaManualCommitFactory | |
| pollExceptionStrategy (consumer (advanced)) | Autowired To 使用带有消费者的自定义策略来控制如何在池消息时处理 Kafka 代理中的异常。 | PollExceptionStrategy | |
| bufferMemorySize (producer) | 制作者可用于缓冲记录的总字节,用于等待发送到服务器。如果记录发送速度快于服务器,则生产者将根据 block.on.buffer.full 指定的首选项来阻止或抛出异常。此设置应当与制作者要使用的内存大致对应,但并非者所使用的所有内存都不会被硬绑定。一些额外的内存将用于压缩(如果启用了压缩),以及维护 in-flight 请求。 | 33554432 | 整数 |
| compressionCodec (producer) | 此参数允许您为此制作者生成的所有数据指定压缩代码。有效值为 none、gzip 和 snappy。 Enum 值:
| none | 字符串 |
| connectionMaxIdleMs (producer) | 在此配置指定的毫秒数后关闭闲置连接。 | 540000 | 整数 |
| deliveryTimeoutMs (producer) | 在调用 send ()后报告成功或失败的时间上限。这限制了在发送前延迟记录的总时间,从代理等待确认时间(如预期),以及可重新发送失败的时间。 | 120000 | 整数 |
| enableIdempotence (producer) | 如果设置为 'true',则制作者将确保在流中写入每个消息的确切副本。如果为 'false',则制作者重试可能会在流中写入重试消息的重复。如果设置为 true,这个选项将需要 max.in.flight.requests.per.connection 设置为 1,重试不能为零,另外的 acks 必须设为 'all'。 | false | 布尔值 |
| headerSerializer (producer) | 使用自定义 KafkaHeaderSerializer 来序列化 kafka 标头值。 | KafkaHeaderSerializer | |
| Key (producer) | 记录密钥(如果没有指定任何密钥,则为 null)。如果配置了这个选项,则其优先于标头 KafkaConstants#KEY。 | 字符串 | |
| keySerializer (producer) | 键的序列化类(如果没有提供,默认为与消息相同)。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| lingerMs (producer) | 生产者组将请求传输到单个批处理请求之间的任何记录组合在一起。通常,只有在记录到达的速度超过发送时,才会在负载下进行。然而,在某些情况下,客户端可能需要减少请求数量,即使是中等负载。此设置通过添加少量人工延迟来实现此目的,而不是立即发送一个记录者将等待给定的延迟,以允许发送其他记录。这可以被认为与 TCP 中的 Nagle 的算法类似。此设置给出了批处理延迟的上限:当我们获得批处理时,无论此设置如何立即发送分区,则设置将立即发送,但如果我们为这个分区有多个字节,我们将在等待更多记录进行"闲置"时显示。此设置默认为 0 (例如,没有延迟)。例如,设置 linger.ms=5 将具有减少发送的请求数量的影响,但会向负载发送的记录增加最多 5ms 的延迟。 | 0 | 整数 |
| maxBlockMs (producer) | 配置控制发送到 kafka 的块的时长。这些方法可能会因为多种原因而被阻止。对于 e.g: buffer full,元数据不可用。此配置对获取元数据、键和值序列化、分区和值在进行发送时分配缓冲区内存的总时间施加最大限制。如果是 partitionFor (),此配置在等待元数据时会实施最大时间阈值。 | 60000 | 整数 |
| maxInFlightRequest (producer) | 在阻塞前,客户端将在单个连接上发送的最大未确认请求数量。请注意,如果将此设置设定为大于 1,并且有失败发送,则会因为重试而重新排序消息的风险(例如,如果启用了重试)。 | 5 | 整数 |
| maxRequestSize (producer) | 请求的最大大小。这也是最大记录大小上限。请注意,服务器在记录大小上具有自己的 cap 值,可能不同于此大小。此设置将限制制作者在单个请求中发送的记录批处理数,以避免发送大型请求。 | 1048576 | 整数 |
| metadataMaxAgeMs (producer) | 以毫秒为单位的时间,我们强制刷新元数据,即使我们未看到任何分区领导更改来主动发现任何新的代理或分区。 | 300000 | 整数 |
| metricReporters (producer) | 用作指标报告器的类列表。通过实施 MetricReporter 接口,可以插入新指标创建通知的类。JmxReporter 始终包含在注册 JMX 统计数据中。 | 字符串 | |
| metricsSampleWindowMs (producer) | 维护到计算指标的示例数量。 | 30000 | 整数 |
| noOfMetricsSample (producer) | 维护到计算指标的示例数量。 | 2 | 整数 |
| Partitioner (producer) | 在子主题之间分区信息的分区类。默认分区器基于密钥的哈希。 | org.apache.kafka.clients.producer.internals.DefaultPartitioner | 字符串 |
| partitionKey (producer) | 将向其发送记录的分区(如果没有指定分区,则为 null)。如果配置了这个选项,则它优先于标头 KafkaConstants#PARTITION_KEY。 | 整数 | |
| producerBatchSize (producer) | 每当将多个记录发送到同一分区时,生产者都将尝试将记录一起批处理为更少的请求。这有助于客户端和服务器上的性能。此配置控制默认的批处理大小,以字节为单位。不尝试批处理记录大于这个大小。发送到代理的批处理将包含多个批处理,每个分区都有可用的数据。小型批处理大小将不太常见,并且可能会减少吞吐量(零的批处理大小将完全禁用批量)。非常大的批处理大小可能会更加浪费地使用内存,因为我们将始终在分析额外记录时分配指定批处理大小的缓冲区。 | 16384 | 整数 |
| queueBufferingMaxMessages (producer) | 在使用 async 模式时可以排队制作者时可以排队制作者的最大未发送消息数,然后才能被阻塞,或者必须丢弃数据。 | 10000 | 整数 |
| receiveBufferBytes (producer) | 读取数据时使用的 TCP 接收缓冲区的大小(SO_RCVBUF)。 | 65536 | 整数 |
| reconnectBackoffMs (producer) | 尝试重新连接到给定主机前等待的时间。这可避免在紧张循环中重复连接到主机。这个 backoff 适用于消费者向代理发送的所有请求。 | 50 | 整数 |
| recordMetadata (producer) | 制作者是否应该存储 RecordMetadata 结果到 Kafka。结果存储在包含 RecordMetadata 元数据的列表中。该列表存储在带有键 KafkaConstants#KAFKA_RECORDMETA 的标头中。 | true | 布尔值 |
| requestRequiredAcks (producer) | 在考虑请求完成前,生产者需要收到该制作者的确认数量。这控制发送的记录的持久性。以下设置很常见:acks=0 如果设为零,则制作者不会等待服务器中的任何确认。记录将立即添加到套接字缓冲区中,并被视为已发送。不保证服务器在这种情况下收到了记录,重试配置将无效(因为客户端通常不知道任何故障)。每个记录给出的偏移始终设为 -1。acks=1 意味着领导会将记录写入其本地日志,但不会等待所有后续者完全确认。在这种情况下,领导会在确认记录后立即失败,但在后续者复制该记录之前,记录将会丢失。acks=all 意味着领导机将等待一整组同步副本确认记录。这样可保证,只要至少有一个同步副本保持活跃,记录就不会被丢失。这是最强的可用保证。 Enum 值:
| 1 | 字符串 |
| requestTimeoutMs (producer) | 在向客户端发送错误前,代理会等待尝试满足 request.required.acks 要求的时间。 | 30000 | 整数 |
| retries (producer) | 设置大于零的值将导致客户端重新发送发送失败的任何记录,并具有潜在的瞬时错误。请注意,如果客户端在收到错误时重新显示记录,则这个重试不会不同。允许重试可能会更改记录的排序,因为如果两个记录被发送到一个分区,并且第一个记录失败,但重试,但第二次记录可能会首先出现。 | 0 | 整数 |
| retryBackoffMs (producer) | 在每个重试前,生产者会刷新相关主题的元数据,以查看是否已选择新的领导。由于领导选举需要一些时间,此属性指定制作者在刷新元数据前等待的时间。 | 100 | 整数 |
| sendBufferBytes (producer) | 套接字写入缓冲区大小。 | 131072 | 整数 |
| valueSerializer (producer) | 消息的序列化类。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
| Workerpool (producer) | 要在 kafka 服务器确认消息从 KafkaProducer 使用异步非阻塞处理,使用自定义 worker 池继续路由 Exchange。如果使用这个选项,则必须处理线程池的生命周期,以便在需要时关闭池。 | ExecutorService | |
| workerPoolCoreSize (producer) | 在 kafka 服务器确认从 KafkaProducer 使用异步非阻塞处理发送到 KafkaProducer 的消息后,worker 池的核心线程数量将继续路由 Exchange。 | 10 | 整数 |
| workerPoolMaxSize (producer) | 在 kafka 服务器确认从 KafkaProducer 使用异步非阻塞处理发送到 KafkaProducer 的消息后,worker 池的最大线程数量可以继续路由 Exchange。 | 20 | 整数 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| kafkaClientFactory (高级) | Autowired Factory 用于创建 org.apache.kafka.clients.consumer.KafkaConsumer 和 org.apache.kafka.clients.producer.KafkaProducer 实例。这允许配置自定义工厂,以使用扩展 vanilla Kafka 客户端的逻辑创建实例。 | KafkaClientFactory | |
| 同步 (高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| schemaRegistryURL (confluent) | 要使用的 Confluent Platform 模式 registry 服务器的 URL。格式为 host1:port1,host2:port2。这在 Confluent Platform 文档中被称为 schema.registry.url。这个选项只在 Confluent Platform (不是标准 Apache Kafka)中可用。 | 字符串 | |
| interceptorClasses (monitoring) | 为生产者或消费者设置拦截器。生产者拦截器必须作为类实施 org.apache.kafka.clients.producer.ProducerInterceptor Consumer interceptors 必须是实施 org.apache.kafka.clients.consumer.ConsumerInterceptor 的类,如果您对消费者使用 Producer 拦截器,它将在运行时抛出一个类广播异常。 | 字符串 | |
| kerberosBeforeReloginMinTime (security) | 刷新尝试之间的登录线程睡眠时间。 | 60000 | 整数 |
| kerberosInitCmd (security) | Kerberos kinit 命令路径。默认为 /usr/bin/kinit。 | /usr/bin/kinit | 字符串 |
| kerberosPrincipalToLocalRules (security) | 从主体名称映射到短名称(通常是操作系统用户名)的规则列表。规则按顺序评估,第一个匹配主体名称的规则用于将其映射到短名称。列表中的任何后续规则都会被忽略。默认情况下,{username}/{hostname}{REALM} 形式的主体名称映射到 {username}。有关格式的详情,请查看安全授权和 acls 文档。可以使用逗号分隔多个值。 | DEFAULT | 字符串 |
| kerberosRenewJitter (security) | 添加到续订时间的随机 jitter 百分比。 | 0.05 | 双 |
| kerberosRenewWindowFactor (security) | 登录线程会处于睡眠状态,直到最后一次刷新到票据到期时间的指定窗口因子被达到,此时它将尝试续订票据。 | 0.8 | 双 |
| saslJaasConfig (security) | 公开 kafka sasl.jaas.config 参数示例: org.apache.kafka.common.security.plain.PlainLoginModule 需要 username=USERNAME password=PASSWORD;。 | 字符串 | |
| saslKerberosServiceName (security) | Kafka 运行的 Kerberos 主体名称。这可以在 Kafka 的 JAAS 配置或 Kafka 配置中定义。 | 字符串 | |
| saslMechanism (security) | 使用简单身份验证和安全层(SASL)机制。有关有效值,请参阅。 | GSSAPI | 字符串 |
| securityProtocol (security) | 用于与代理通信的协议。支持 SASL_PLAINTEXT、PLAINTEXT 和 SSL。 | PLAINTEXT | 字符串 |
| sslCipherSuites (security) | 密码套件列表。这是身份验证、加密、MAC 和密钥交换算法的命名组合,用于使用 TLS 或 SSL 网络协议协商网络连接的安全设置。By 默认支持所有可用的密码套件。 | 字符串 | |
| sslContextParameters (security) | 使用 Camel SSLContextParameters 对象的 SSL 配置.如果在其他 SSL 端点参数之前已进行了配置,则应用它。注意:Kafka 只支持从文件位置加载密钥存储,以便在 KeyStoreParameters.resource 选项中使用 file: 前缀。 | SSLContextParameters | |
| sslEnabledProtocols (security) | 为 SSL 连接启用的协议列表。TLSv1.2、TLSv1.1 和 TLSv1 默认启用。 | 字符串 | |
| sslEndpointAlgorithm (security) | 使用服务器证书验证服务器主机名的端点标识算法。 | https | 字符串 |
| sslKeymanagerAlgorithm (security) | 用于 SSL 连接的密钥管理器工厂使用的算法。Default 值是为 Java 虚拟机配置的密钥管理器工厂算法。 | SunX509 | 字符串 |
| sslKeyPassword (security) | 密钥存储文件中私钥的密码。这对客户端是可选的。 | 字符串 | |
| sslKeystoreLocation (security) | 密钥存储文件的位置。这是可选的,可用于客户端双向身份验证。 | 字符串 | |
| sslKeystorePassword (security) | 密钥存储文件的存储密码。这对客户端是可选的,只有在配置了 ssl.keystore.location 时才需要。 | 字符串 | |
| sslKeystoreType (security) | 密钥存储文件的文件格式。这对客户端是可选的。默认值为 JKS。 | JKS | 字符串 |
| SSLProtocol ( 安全) | 用于生成 SSLContext 的 SSL 协议。默认设置为 TLS,对于大多数情况来说都可以正常工作。最近的 JVM 中允许的值是 TLS、TLSv1.1 和 TLSv1.2。较旧的 JVM 中可能支持 SSL、SSLv2 和 SSLv3,但由于已知的安全漏洞,不建议使用它们。 | 字符串 | |
| sslProvider (安全) | 用于 SSL 连接的安全提供程序的名称。默认值为 JVM 的默认安全提供程序。 | 字符串 | |
| sslTrustmanagerAlgorithm (security) | 信任管理器工厂用于 SSL 连接的算法。Default 值是为 Java 虚拟机配置的信任管理器工厂算法。 | PKIX | 字符串 |
| sslTruststoreLocation (security) | 信任存储文件的位置。 | 字符串 | |
| sslTruststorePassword (security) | 信任存储文件的密码。 | 字符串 | |
| sslTruststoreType (security) | 信任存储文件的文件格式。默认值为 JKS。 | JKS | 字符串 |
| useGlobalSslContextParameters (security) | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
27.4. 端点选项
Kafka 端点使用 URI 语法进行配置:
kafka:topic
使用以下路径和查询参数:
27.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| Topic (common) | 要使用的主题的 必需 名称。在消费者上,您可以使用逗号分隔多个主题。制作者只能发送消息到单个主题。 | 字符串 |
27.4.2. 查询参数(102 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| additionalProperties (common) | 如果无法直接在 camel 配置上设置 kafka consumer 或 kafka producer 的额外属性(例如:尚未反映在 Camel 配置中的新 Kafka 属性),属性必须加上额外的Properties。e.g: additionalProperties.transactional.id=12345&additionalProperties.schema.registry.url=http://localhost:8811/avro。 | map | |
| 代理 (common) | 要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理的子集,也可以是指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。 | 字符串 | |
| clientID (common) | 客户端 id 是每个请求中发送的用户指定的字符串,以帮助追踪调用。它应该以逻辑方式识别提出请求的应用。 | 字符串 | |
| headerFilterStrategy (common) | 使用自定义 HeaderFilterStrategy 过滤标题到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| reconnectBackoffMaxMs (common) | 当重新连接到重复连接失败的代理时,需要等待的最大时间(毫秒)。如果提供,每个主机的 backoff 将为每个连续的连接失败指数增加,直到最高值。在计算 backoff 增长后,会添加 20% 随机的 jitter 以避免连接 storms。 | 1000 | 整数 |
| shutdownTimeout (common) | 超时时间(毫秒),以毫秒为单位,等待消费者或制作者关闭并终止其 worker 线程。 | 30000 | int |
| allowManualCommit (consumer) | 是否允许通过 KafkaManualCommit 进行手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange 消息标头中,它允许最终用户访问此 API 并通过 Kafka 使用者执行手动偏移提交。 | false | 布尔值 |
| autoCommitEnable (consumer) | 如果为 true,请定期提交到 ZooKeeper,以偏移已由消费者获取的信息。当进程失败时,会使用这个提交的偏移,因为新消费者开始的位置。 | true | 布尔值 |
| autoCommitIntervalMs (consumer) | 消费者偏移的 ms 频率被提交到 zookeeper。 | 5000 | 整数 |
| autoCommitOnStop (consumer) | 当消费者停止时是否执行显式自动提交,以确保代理具有上次消耗的消息的提交。这要求打开自动CommitEnable 选项。可能的值有: sync、async 或 none。和 sync 是默认值。 Enum 值:
| sync | 字符串 |
| autoOffsetReset (consumer) | 当 ZooKeeper 中没有初始偏移时,或者偏移范围不足: earliest : 自动将偏移重置为最早偏移最新的 : 自动将偏移重置为最新的偏移失败:将偏移重置为最新的偏移失败:向消费者抛出异常。 Enum 值:
| latest | 字符串 |
| breakOnFirstError (consumer) | 此选项控制消费者处理交换时会发生什么,并且失败。如果选项为 false,则使用者将继续执行下一个消息并处理它。如果选项为 true,则消费者会中断,并将返回到导致失败的消息偏移,然后重新尝试处理此消息。但是,如果其绑定每次都失败,这可能会导致无法处理同一消息,例如中毒消息。因此,建议您使用 Camel 的错误处理程序处理示例。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| checkCrcs (consumer) | 自动检查已使用的记录的 CRC32。这样可确保发生消息的在线或磁盘损坏。此检查添加了一些开销,因此在寻求极端性能的情况下可能会禁用它。 | true | 布尔值 |
| commitTimeoutMs (consumer) | 代码将等待同步提交完成的最长时间(以毫秒为单位)。 | 5000 | Long |
| consumerRequestTimeoutMs (consumer) | 配置控制客户端等待请求响应的最长时间。如果响应在超时前收到,客户端会在必要时重新发送请求,或者在重试已耗尽时失败请求。 | 40000 | 整数 |
| consumer Count (消费者) | 连接到 kafka 服务器的消费者数量。每个使用者在单独的线程上运行,后者检索和处理传入的数据。 | 1 | int |
| fetchMaxBytes (consumer) | 服务器应该为获取请求返回的最大数据量。如果 fetch 的第一个非空分区中的第一个消息大于这个值,则消息仍会返回,以确保消费者进行进度。代理接受的最大消息大小通过 message.max.bytes (broker config)或 max.message.bytes (topic config)定义。请注意,消费者并行执行多个获取。 | 52428800 | 整数 |
| fetchMinBytes (consumer) | 服务器应该为获取请求返回的最小数据量。如果数据不足,请求将在回答请求之前等待大量数据。 | 1 | 整数 |
| fetchWaitMaxMs (consumer) | 如果没有足够的数据来满足 fetch.min.bytes,则服务器在回答获取请求前将阻止的最大时间。 | 500 | 整数 |
| groupId (consumer) | 唯一标识此使用者进程组的字符串。通过设置相同的组 id 多个进程,表示它们都是同一消费者组的一部分。消费者需要这个选项。 | 字符串 | |
| groupInstanceId (consumer) | 最终用户提供的使用者实例的唯一标识符。仅允许非空字符串。如果设置,使用者将被视为静态成员,这意味着任何消费者组中只允许具有此 ID 的一个实例。这可以与更大的会话超时结合使用,以避免由临时不可用(如进程重启)导致的组重新平衡。如果没有设置,使用者将作为动态成员加入组,这是传统的行为。 | 字符串 | |
| headerDeserializer (consumer) | 使用自定义 KafkaHeaderDeserializer 来反序列化 kafka 标头值。 | KafkaHeaderDeserializer | |
| heartbeatIntervalMs (consumer) | 使用 Kafka 的组管理功能时,心跳到消费者协调器之间的预期时间。心跳用于确保消费者的会话保持活跃状态,并在新消费者加入或离开组时进行重新平衡。该值必须小于 session.timeout.ms,但设置的值通常不应超过该值的 1/3。它甚至可以降低以控制正常重新平衡的预期时间。 | 3000 | 整数 |
| keyDeserializer (consumer) | 为实现 Deserializer 接口的密钥反序列化器类。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
| maxPartitionFetchBytes (consumer) | 服务器将返回的每个分区的最大数据量。请求使用的最大内存为 #partitions max.partition.fetch.bytes。此大小必须至少与服务器允许的最大消息大小相同,否则生成者可能会发送大于消费者的消息。如果发生这种情况,使用者可能会卡住尝试在特定分区上获取大型消息。 | 1048576 | 整数 |
| maxPollIntervalMs (使用者) | 使用消费者组管理时轮询()调用之间的最大延迟。这会在获取更多记录前,在消费者闲置的时间上绑定上。如果在此超时过期之前没有调用 poll (),那么消费者将被视为失败,并且组将重新平衡,以便将分区重新分配给另一个成员。 | Long | |
| maxPollRecords (consumer) | 在要 poll ()的单个调用中返回的最大记录数。 | 500 | 整数 |
| offsetRepository (consumer) | 要使用的偏移存储库,以便本地存储主题的每个分区的偏移量。定义一个将禁用 autocommit。 | StateRepository | |
| partitionAssignor (consumer) | 使用组管理时,客户端将使用的分区分配策略的类名称在消费者实例之间分发分区所有权。 | org.apache.kafka.clients.consumer.RangeAssignor | 字符串 |
| pollOnError (consumer) | 如果 kafka threw 异常在轮询新消息时,应该做什么。默认情况下,将使用组件配置中的值,除非在端点级别上配置了显式值。DISCARD 将丢弃消息并继续轮询下一个消息。ERROR_HANDLER 将使用 Camel 的错误处理程序来处理异常,之后继续轮询下一个消息。RECONNECT 将重新连接消费者,并尝试再次轮询消息,使消费者再次轮询同一消息将停止消费者(如果消费者应可以再次使用,则必须手动启动/重新启动)。 Enum 值:
| ERROR_HANDLER | PollOnError |
| pollTimeoutMs (consumer) | 轮询 KafkaConsumer 时使用的超时。 | 5000 | Long |
| resumeStrategy (consumer) | 这个选项允许用户设置自定义恢复策略。当分配分区时(例如:连接或重新连接时),执行恢复策略。它允许实施自定义如何恢复操作,并作为 seekTo 和 offsetRepository 机制的更灵活的替代方案。有关实现详情,请参阅 KafkaConsumerResumeStrategy。此选项不会影响自动提交设置。使用此设置的实现可能还要使用手动提交选项来评估。 | KafkaConsumerResumeStrategy | |
| seekTo (consumer) | 设置 KafkaConsumer 将在启动时从开始或结尾读取:从开始开始读取 : read from end : read from end This is replace the earlier attribute seekToBeginning。 Enum 值:
| 字符串 | |
| sessionTimeoutMs (consumer) | 使用 Kafka 组管理功能时用于检测故障的超时。 | 10000 | 整数 |
| specificAvroReader (consumer) | 这可让特定的 Avro reader 用于 Confluent Platform schema registry 和 io.confluent.kafka.serializers.KafkaAvroDeserializer。这个选项只在 Confluent Platform (不是标准 Apache Kafka)中可用。 | false | 布尔值 |
| topicIsPattern (consumer) | 主题是否为模式(正则表达式)。这可以用于订阅与模式匹配的动态主题数。 | false | 布尔值 |
| 值Deserializer (使用者) | deserializer 类用于实现 Deserializer 接口的值。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| kafkaManualCommitFactory (使用者(高级) | 创建 KafkaManualCommit 实例的工厂。当从开箱即用的默认实现中手动提交时,这允许自定义工厂创建自定义 KafkaManualCommit 实例,以防需要进行特殊逻辑。 | KafkaManualCommitFactory | |
| bufferMemorySize (producer) | 制作者可用于缓冲记录的总字节,用于等待发送到服务器。如果记录发送速度快于服务器,则生产者将根据 block.on.buffer.full 指定的首选项来阻止或抛出异常。此设置应当与制作者要使用的内存大致对应,但并非者所使用的所有内存都不会被硬绑定。一些额外的内存将用于压缩(如果启用了压缩),以及维护 in-flight 请求。 | 33554432 | 整数 |
| compressionCodec (producer) | 此参数允许您为此制作者生成的所有数据指定压缩代码。有效值为 none、gzip 和 snappy。 Enum 值:
| none | 字符串 |
| connectionMaxIdleMs (producer) | 在此配置指定的毫秒数后关闭闲置连接。 | 540000 | 整数 |
| deliveryTimeoutMs (producer) | 在调用 send ()后报告成功或失败的时间上限。这限制了在发送前延迟记录的总时间,从代理等待确认时间(如预期),以及可重新发送失败的时间。 | 120000 | 整数 |
| enableIdempotence (producer) | 如果设置为 'true',则制作者将确保在流中写入每个消息的确切副本。如果为 'false',则制作者重试可能会在流中写入重试消息的重复。如果设置为 true,这个选项将需要 max.in.flight.requests.per.connection 设置为 1,重试不能为零,另外的 acks 必须设为 'all'。 | false | 布尔值 |
| headerSerializer (producer) | 使用自定义 KafkaHeaderSerializer 来序列化 kafka 标头值。 | KafkaHeaderSerializer | |
| Key (producer) | 记录密钥(如果没有指定任何密钥,则为 null)。如果配置了这个选项,则其优先于标头 KafkaConstants#KEY。 | 字符串 | |
| keySerializer (producer) | 键的序列化类(如果没有提供,默认为与消息相同)。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| lingerMs (producer) | 生产者组将请求传输到单个批处理请求之间的任何记录组合在一起。通常,只有在记录到达的速度超过发送时,才会在负载下进行。然而,在某些情况下,客户端可能需要减少请求数量,即使是中等负载。此设置通过添加少量人工延迟来实现此目的,而不是立即发送一个记录者将等待给定的延迟,以允许发送其他记录。这可以被认为与 TCP 中的 Nagle 的算法类似。此设置给出了批处理延迟的上限:当我们获得批处理时,无论此设置如何立即发送分区,则设置将立即发送,但如果我们为这个分区有多个字节,我们将在等待更多记录进行"闲置"时显示。此设置默认为 0 (例如,没有延迟)。例如,设置 linger.ms=5 将具有减少发送的请求数量的影响,但会向负载发送的记录增加最多 5ms 的延迟。 | 0 | 整数 |
| maxBlockMs (producer) | 配置控制发送到 kafka 的块的时长。这些方法可能会因为多种原因而被阻止。对于 e.g: buffer full,元数据不可用。此配置对获取元数据、键和值序列化、分区和值在进行发送时分配缓冲区内存的总时间施加最大限制。如果是 partitionFor (),此配置在等待元数据时会实施最大时间阈值。 | 60000 | 整数 |
| maxInFlightRequest (producer) | 在阻塞前,客户端将在单个连接上发送的最大未确认请求数量。请注意,如果将此设置设定为大于 1,并且有失败发送,则会因为重试而重新排序消息的风险(例如,如果启用了重试)。 | 5 | 整数 |
| maxRequestSize (producer) | 请求的最大大小。这也是最大记录大小上限。请注意,服务器在记录大小上具有自己的 cap 值,可能不同于此大小。此设置将限制制作者在单个请求中发送的记录批处理数,以避免发送大型请求。 | 1048576 | 整数 |
| metadataMaxAgeMs (producer) | 以毫秒为单位的时间,我们强制刷新元数据,即使我们未看到任何分区领导更改来主动发现任何新的代理或分区。 | 300000 | 整数 |
| metricReporters (producer) | 用作指标报告器的类列表。通过实施 MetricReporter 接口,可以插入新指标创建通知的类。JmxReporter 始终包含在注册 JMX 统计数据中。 | 字符串 | |
| metricsSampleWindowMs (producer) | 维护到计算指标的示例数量。 | 30000 | 整数 |
| noOfMetricsSample (producer) | 维护到计算指标的示例数量。 | 2 | 整数 |
| Partitioner (producer) | 在子主题之间分区信息的分区类。默认分区器基于密钥的哈希。 | org.apache.kafka.clients.producer.internals.DefaultPartitioner | 字符串 |
| partitionKey (producer) | 将向其发送记录的分区(如果没有指定分区,则为 null)。如果配置了这个选项,则它优先于标头 KafkaConstants#PARTITION_KEY。 | 整数 | |
| producerBatchSize (producer) | 每当将多个记录发送到同一分区时,生产者都将尝试将记录一起批处理为更少的请求。这有助于客户端和服务器上的性能。此配置控制默认的批处理大小,以字节为单位。不尝试批处理记录大于这个大小。发送到代理的批处理将包含多个批处理,每个分区都有可用的数据。小型批处理大小将不太常见,并且可能会减少吞吐量(零的批处理大小将完全禁用批量)。非常大的批处理大小可能会更加浪费地使用内存,因为我们将始终在分析额外记录时分配指定批处理大小的缓冲区。 | 16384 | 整数 |
| queueBufferingMaxMessages (producer) | 在使用 async 模式时可以排队制作者时可以排队制作者的最大未发送消息数,然后才能被阻塞,或者必须丢弃数据。 | 10000 | 整数 |
| receiveBufferBytes (producer) | 读取数据时使用的 TCP 接收缓冲区的大小(SO_RCVBUF)。 | 65536 | 整数 |
| reconnectBackoffMs (producer) | 尝试重新连接到给定主机前等待的时间。这可避免在紧张循环中重复连接到主机。这个 backoff 适用于消费者向代理发送的所有请求。 | 50 | 整数 |
| recordMetadata (producer) | 制作者是否应该存储 RecordMetadata 结果到 Kafka。结果存储在包含 RecordMetadata 元数据的列表中。该列表存储在带有键 KafkaConstants#KAFKA_RECORDMETA 的标头中。 | true | 布尔值 |
| requestRequiredAcks (producer) | 在考虑请求完成前,生产者需要收到该制作者的确认数量。这控制发送的记录的持久性。以下设置很常见:acks=0 如果设为零,则制作者不会等待服务器中的任何确认。记录将立即添加到套接字缓冲区中,并被视为已发送。不保证服务器在这种情况下收到了记录,重试配置将无效(因为客户端通常不知道任何故障)。每个记录给出的偏移始终设为 -1。acks=1 意味着领导会将记录写入其本地日志,但不会等待所有后续者完全确认。在这种情况下,领导会在确认记录后立即失败,但在后续者复制该记录之前,记录将会丢失。acks=all 意味着领导机将等待一整组同步副本确认记录。这样可保证,只要至少有一个同步副本保持活跃,记录就不会被丢失。这是最强的可用保证。 Enum 值:
| 1 | 字符串 |
| requestTimeoutMs (producer) | 在向客户端发送错误前,代理会等待尝试满足 request.required.acks 要求的时间。 | 30000 | 整数 |
| retries (producer) | 设置大于零的值将导致客户端重新发送发送失败的任何记录,并具有潜在的瞬时错误。请注意,如果客户端在收到错误时重新显示记录,则这个重试不会不同。允许重试可能会更改记录的排序,因为如果两个记录被发送到一个分区,并且第一个记录失败,但重试,但第二次记录可能会首先出现。 | 0 | 整数 |
| retryBackoffMs (producer) | 在每个重试前,生产者会刷新相关主题的元数据,以查看是否已选择新的领导。由于领导选举需要一些时间,此属性指定制作者在刷新元数据前等待的时间。 | 100 | 整数 |
| sendBufferBytes (producer) | 套接字写入缓冲区大小。 | 131072 | 整数 |
| valueSerializer (producer) | 消息的序列化类。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
| Workerpool (producer) | 要在 kafka 服务器确认消息从 KafkaProducer 使用异步非阻塞处理,使用自定义 worker 池继续路由 Exchange。如果使用这个选项,则必须处理线程池的生命周期,以便在需要时关闭池。 | ExecutorService | |
| workerPoolCoreSize (producer) | 在 kafka 服务器确认从 KafkaProducer 使用异步非阻塞处理发送到 KafkaProducer 的消息后,worker 池的核心线程数量将继续路由 Exchange。 | 10 | 整数 |
| workerPoolMaxSize (producer) | 在 kafka 服务器确认从 KafkaProducer 使用异步非阻塞处理发送到 KafkaProducer 的消息后,worker 池的最大线程数量可以继续路由 Exchange。 | 20 | 整数 |
| kafkaClientFactory (高级) | 创建 org.apache.kafka.clients.consumer.KafkaConsumer 和 org.apache.kafka.clients.producer.KafkaProducer 实例的工厂。这允许配置自定义工厂,以使用扩展 vanilla Kafka 客户端的逻辑创建实例。 | KafkaClientFactory | |
| 同步 (高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| schemaRegistryURL (confluent) | 要使用的 Confluent Platform 模式 registry 服务器的 URL。格式为 host1:port1,host2:port2。这在 Confluent Platform 文档中被称为 schema.registry.url。这个选项只在 Confluent Platform (不是标准 Apache Kafka)中可用。 | 字符串 | |
| interceptorClasses (monitoring) | 为生产者或消费者设置拦截器。生产者拦截器必须作为类实施 org.apache.kafka.clients.producer.ProducerInterceptor Consumer interceptors 必须是实施 org.apache.kafka.clients.consumer.ConsumerInterceptor 的类,如果您对消费者使用 Producer 拦截器,它将在运行时抛出一个类广播异常。 | 字符串 | |
| kerberosBeforeReloginMinTime (security) | 刷新尝试之间的登录线程睡眠时间。 | 60000 | 整数 |
| kerberosInitCmd (security) | Kerberos kinit 命令路径。默认为 /usr/bin/kinit。 | /usr/bin/kinit | 字符串 |
| kerberosPrincipalToLocalRules (security) | 从主体名称映射到短名称(通常是操作系统用户名)的规则列表。规则按顺序评估,第一个匹配主体名称的规则用于将其映射到短名称。列表中的任何后续规则都会被忽略。默认情况下,{username}/{hostname}{REALM} 形式的主体名称映射到 {username}。有关格式的详情,请查看安全授权和 acls 文档。可以使用逗号分隔多个值。 | DEFAULT | 字符串 |
| kerberosRenewJitter (security) | 添加到续订时间的随机 jitter 百分比。 | 0.05 | 双 |
| kerberosRenewWindowFactor (security) | 登录线程会处于睡眠状态,直到最后一次刷新到票据到期时间的指定窗口因子被达到,此时它将尝试续订票据。 | 0.8 | 双 |
| saslJaasConfig (security) | 公开 kafka sasl.jaas.config 参数示例: org.apache.kafka.common.security.plain.PlainLoginModule 需要 username=USERNAME password=PASSWORD;。 | 字符串 | |
| saslKerberosServiceName (security) | Kafka 运行的 Kerberos 主体名称。这可以在 Kafka 的 JAAS 配置或 Kafka 配置中定义。 | 字符串 | |
| saslMechanism (security) | 使用简单身份验证和安全层(SASL)机制。有关有效值,请参阅。 | GSSAPI | 字符串 |
| securityProtocol (security) | 用于与代理通信的协议。支持 SASL_PLAINTEXT、PLAINTEXT 和 SSL。 | PLAINTEXT | 字符串 |
| sslCipherSuites (security) | 密码套件列表。这是身份验证、加密、MAC 和密钥交换算法的命名组合,用于使用 TLS 或 SSL 网络协议协商网络连接的安全设置。By 默认支持所有可用的密码套件。 | 字符串 | |
| sslContextParameters (security) | 使用 Camel SSLContextParameters 对象的 SSL 配置.如果在其他 SSL 端点参数之前已进行了配置,则应用它。注意:Kafka 只支持从文件位置加载密钥存储,以便在 KeyStoreParameters.resource 选项中使用 file: 前缀。 | SSLContextParameters | |
| sslEnabledProtocols (security) | 为 SSL 连接启用的协议列表。TLSv1.2、TLSv1.1 和 TLSv1 默认启用。 | 字符串 | |
| sslEndpointAlgorithm (security) | 使用服务器证书验证服务器主机名的端点标识算法。 | https | 字符串 |
| sslKeymanagerAlgorithm (security) | 用于 SSL 连接的密钥管理器工厂使用的算法。Default 值是为 Java 虚拟机配置的密钥管理器工厂算法。 | SunX509 | 字符串 |
| sslKeyPassword (security) | 密钥存储文件中私钥的密码。这对客户端是可选的。 | 字符串 | |
| sslKeystoreLocation (security) | 密钥存储文件的位置。这是可选的,可用于客户端双向身份验证。 | 字符串 | |
| sslKeystorePassword (security) | 密钥存储文件的存储密码。这对客户端是可选的,只有在配置了 ssl.keystore.location 时才需要。 | 字符串 | |
| sslKeystoreType (security) | 密钥存储文件的文件格式。这对客户端是可选的。默认值为 JKS。 | JKS | 字符串 |
| SSLProtocol ( 安全) | 用于生成 SSLContext 的 SSL 协议。默认设置为 TLS,对于大多数情况来说都可以正常工作。最近的 JVM 中允许的值是 TLS、TLSv1.1 和 TLSv1.2。较旧的 JVM 中可能支持 SSL、SSLv2 和 SSLv3,但由于已知的安全漏洞,不建议使用它们。 | 字符串 | |
| sslProvider (安全) | 用于 SSL 连接的安全提供程序的名称。默认值为 JVM 的默认安全提供程序。 | 字符串 | |
| sslTrustmanagerAlgorithm (security) | 信任管理器工厂用于 SSL 连接的算法。Default 值是为 Java 虚拟机配置的信任管理器工厂算法。 | PKIX | 字符串 |
| sslTruststoreLocation (security) | 信任存储文件的位置。 | 字符串 | |
| sslTruststorePassword (security) | 信任存储文件的密码。 | 字符串 | |
| sslTruststoreType (security) | 信任存储文件的文件格式。默认值为 JKS。 | JKS | 字符串 |
有关 Producer/Consumer 配置的更多信息,请参阅:
27.5. 消息标头
27.5.1. 消费者标头
使用 Kafka 信息时,可以使用以下标头。
| 标头常数 | 标头值 | 类型 | 描述 |
|---|---|---|---|
|
|
|
| 消息源自的主题 |
|
|
|
| 存储消息的分区 |
|
|
|
| 消息的偏移 |
|
|
|
| 如果配置,消息的密钥 |
|
|
|
| 记录标头 |
|
|
|
|
提交前是否是最后一个记录(仅在 |
|
|
|
|
表示当前轮询请求中的最后一个记录(仅在 |
|
|
|
| 在使用 Kafka 使用者时,可用于强制手动偏移提交。 |
27.5.2. 制作者标头
在向 Kafka 发送消息前,您可以配置以下标头。
| 标头常数 | 标头值 | 类型 | 描述 |
|---|---|---|---|
|
|
|
| 需要 消息的密钥以确保所有相关消息在同一分区中 |
|
|
|
| 发送消息(override 和 take 优先级)和标头没有保留的主题。 |
|
|
|
| ProducerRecord 也具有关联的时间戳。如果用户提供了时间戳,则制作者会将记录与提供的时间戳的命名,并且不会保留标头。 |
|
|
|
| 明确指定分区 |
如果要将消息发送到动态主题,则使用 KafkaConstants.OVERRIDE_TOPIC 作为其用作没有随消息一起发送的一次性标头,作为在制作者中被删除。
消息发送到 Kafka 后,以下标头可用
| 标头常数 | 标头值 | 类型 | 描述 |
|---|---|---|---|
|
|
|
|
元数据(仅在 |
27.6. 消费者错误处理
虽然 kafka 消费者正在从 kafka 代理轮询信息,但可能会出现错误。本节描述了情况以及您可以配置的内容。
在调用 Kafka poll API 时,使用者可能会抛出异常。例如,如果消息因为无效数据而不能反序列化,并且有很多其他类型的错误。这些错误采用 KafkaException 的形式,它们是 retryable 或 not。可以重试的异常(RetriableException)将再次重试(在 之间轮询超时)。所有其他例外情况都根据 pollOnError 配置进行处理。此配置有以下值:
- DISCARD 将丢弃消息并继续轮询下一个消息。
- ERROR_HANDLER 将使用 Camel 的错误处理程序来处理异常,之后继续轮询下一个消息。
- RECONNECT 将重新连接消费者,然后再次尝试轮询消息。
- RETRY 将让使用者再次尝试轮询相同的消息
- STOP 将停止使用者(如果消费者应可以再次使用消息,则必须手动启动/重新启动)。
默认为 ERROR_HANDLER,它允许 Camel 的错误处理程序(如果有)处理原因例外。然后,继续轮询下一个消息。这个行为与 Camel 组件具有的 bridgeErrorHandler 选项类似。
对于高级控制,可以在组件级别上配置 org.apache.camel.component.kafka.PollExceptionStrategy 的自定义实现,允许控制上述策略的例外原因。
27.7. Samples
27.7.1. 使用 Kafka 的信息
以下是从 Kafka 读取信息所需的最小路由。
from("kafka:test?brokers=localhost:9092")
.log("Message received from Kafka : ${body}")
.log(" on the topic ${headers[kafka.TOPIC]}")
.log(" on the partition ${headers[kafka.PARTITION]}")
.log(" with the offset ${headers[kafka.OFFSET]}")
.log(" with the key ${headers[kafka.KEY]}")如果您需要消耗来自多个主题的消息,您可以使用以逗号分隔的主题名称列表。
from("kafka:test,test1,test2?brokers=localhost:9092")
.log("Message received from Kafka : ${body}")
.log(" on the topic ${headers[kafka.TOPIC]}")
.log(" on the partition ${headers[kafka.PARTITION]}")
.log(" with the offset ${headers[kafka.OFFSET]}")
.log(" with the key ${headers[kafka.KEY]}")
也可以订阅多个主题,将模式作为主题名称,并使用 topicIsPattern 选项。
from("kafka:test*?brokers=localhost:9092&topicIsPattern=true")
.log("Message received from Kafka : ${body}")
.log(" on the topic ${headers[kafka.TOPIC]}")
.log(" on the partition ${headers[kafka.PARTITION]}")
.log(" with the offset ${headers[kafka.OFFSET]}")
.log(" with the key ${headers[kafka.KEY]}")
当使用 Kafka 的消息时,您可以使用自己的偏移管理,而不是将此管理委派给 Kafka。为了保持偏移,组件需要 StateRepository 实施,如 FileStateRepository。此 Bean 应该在注册表中可用。如何使用它:
// Create the repository in which the Kafka offsets will be persisted
FileStateRepository repository = FileStateRepository.fileStateRepository(new File("/path/to/repo.dat"));
// Bind this repository into the Camel registry
Registry registry = createCamelRegistry();
registry.bind("offsetRepo", repository);
// Configure the camel context
DefaultCamelContext camelContext = new DefaultCamelContext(registry);
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("kafka:" + TOPIC + "?brokers=localhost:{{kafkaPort}}" +
// Setup the topic and broker address
"&groupId=A" +
// The consumer processor group ID
"&autoOffsetReset=earliest" +
// Ask to start from the beginning if we have unknown offset
"&offsetRepository=#offsetRepo")
// Keep the offsets in the previously configured repository
.to("mock:result");
}
});27.7.2. 将信息生成到 Kafka
以下是将信息写入 Kafka 所需的最小路由。
from("direct:start")
.setBody(constant("Message from Camel")) // Message to send
.setHeader(KafkaConstants.KEY, constant("Camel")) // Key of the message
.to("kafka:test?brokers=localhost:9092");27.8. SSL 配置
您可以使用两种不同的方法在 Kafka 组件中配置 SSL 通信。
第一种方式是通过许多 SSL 端点参数
from("kafka:" + TOPIC + "?brokers=localhost:{{kafkaPort}}" +
"&groupId=A" +
"&sslKeystoreLocation=/path/to/keystore.jks" +
"&sslKeystorePassword=changeit" +
"&sslKeyPassword=changeit" +
"&securityProtocol=SSL")
.to("mock:result");
第二种方法是使用 sslContextParameters 端点参数。
// Configure the SSLContextParameters object
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/path/to/keystore.jks");
ksp.setPassword("changeit");
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("changeit");
SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
// Bind this SSLContextParameters into the Camel registry
Registry registry = createCamelRegistry();
registry.bind("ssl", scp);
// Configure the camel context
DefaultCamelContext camelContext = new DefaultCamelContext(registry);
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("kafka:" + TOPIC + "?brokers=localhost:{{kafkaPort}}" +
// Setup the topic and broker address
"&groupId=A" +
// The consumer processor group ID
"&sslContextParameters=#ssl" +
// The security protocol
"&securityProtocol=SSL)
// Reference the SSL configuration
.to("mock:result");
}
});27.9. 使用 Kafka 幂等存储库
camel-kafka 库提供了一个基于 Kafka 主题的幂等存储库。
此软件仓库将广播对 Kafka 主题中的幂等状态(add/remove)的所有更改,并通过事件源为每个存储库的进程实例填充本地内存缓存。使用的主题必须为每个幂等存储库实例唯一。
机制对主题分区的数量没有任何要求;因为存储库会同时消耗所有分区。它还对主题的复制因子有任何要求。
每个使用主题的仓库实例(例如,通常并行运行的不同机器上)控制自己的消费者组,因此在 10 个 Camel 进程集群中,每个主题都控制自己的偏移量。
在启动时,实例订阅该主题,并将偏移重新构建到起始位置,将缓存重新构建到最新的状态。在轮转 DurationM 长度的轮询返回 0 记录之前,该缓存不会被考虑。在缓存结束前,启动不会完成,或由 30 秒为止;如果后者发生幂等存储库,则启动可能处于不一致的状态,直到其消费者捕获到主题的末尾。
请注意用于唯一检查的标头格式。默认情况下,它使用 String 作为数据类型。使用原语数字格式时,标头必须相应地反序列化。检查以下示例。
KafkaIdempotentRepository 具有以下属性:
| 属性 | 描述 |
|---|---|
|
| 用于广播更改的 Kafka 主题的名称。(必需) |
|
|
内部 Kafka 制作者和消费者上的 |
|
|
设置由 Kafka producer 用于广播更改的属性。覆盖 |
|
|
设置 Kafka 使用者将使用的属性,从主题填充缓存。覆盖 |
|
| 最近使用的密钥应存储在内存中数量(默认值 1000)。 |
|
|
Kafka 消费者的轮询持续时间。本地缓存会立即更新。这个值将影响从主题更新其缓存的其他对等点的对等点与发送缓存操作消息的幂等消费者实例。默认值为 100 ms。 |
可以通过定义 主题和 bootstrapServers 或 producerConfig 和 consumerConfig 属性集来实例化存储库,以启用 SSL/SASL 等功能。要使用此存储库,必须手动将此存储库放在 Camel 注册表中,或者通过注册为 Spring/Blueprint 中的 bean,因为它是 CamelContext aware。
示例用法如下:
KafkaIdempotentRepository kafkaIdempotentRepository = new KafkaIdempotentRepository("idempotent-db-inserts", "localhost:9091");
SimpleRegistry registry = new SimpleRegistry();
registry.put("insertDbIdemRepo", kafkaIdempotentRepository); // must be registered in the registry, to enable access to the CamelContext
CamelContext context = new CamelContext(registry);
// later in RouteBuilder...
from("direct:performInsert")
.idempotentConsumer(header("id")).messageIdRepositoryRef("insertDbIdemRepo")
// once-only insert into database
.end()在 XML 中:
<!-- simple -->
<bean id="insertDbIdemRepo"
class="org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository">
<property name="topic" value="idempotent-db-inserts"/>
<property name="bootstrapServers" value="localhost:9091"/>
</bean>
<!-- complex -->
<bean id="insertDbIdemRepo"
class="org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository">
<property name="topic" value="idempotent-db-inserts"/>
<property name="maxCacheSize" value="10000"/>
<property name="consumerConfig">
<props>
<prop key="bootstrap.servers">localhost:9091</prop>
</props>
</property>
<property name="producerConfig">
<props>
<prop key="bootstrap.servers">localhost:9091</prop>
</props>
</property>
</bean>
使用带有数字标识符的 idempotency 时需要 3 种替代方案。第一个方法是使用 org.apache.camel.component.kafka.serde.KafkaSerdeHelper 中的静态方法 数字标头 方法为您执行转换:
from("direct:performInsert")
.idempotentConsumer(numericHeader("id")).messageIdRepositoryRef("insertDbIdemRepo")
// once-only insert into database
.end()另外,也可以使用通过路由 URL 配置的自定义序列化器来执行转换:
public class CustomHeaderDeserializer extends DefaultKafkaHeaderDeserializer {
private static final Logger LOG = LoggerFactory.getLogger(CustomHeaderDeserializer.class);
@Override
public Object deserialize(String key, byte[] value) {
if (key.equals("id")) {
BigInteger bi = new BigInteger(value);
return String.valueOf(bi.longValue());
} else {
return super.deserialize(key, value);
}
}
}最后,也可以在处理器中这样做:
from(from).routeId("foo")
.process(exchange -> {
byte[] id = exchange.getIn().getHeader("id", byte[].class);
BigInteger bi = new BigInteger(id);
exchange.getIn().setHeader("id", String.valueOf(bi.longValue()));
})
.idempotentConsumer(header("id"))
.messageIdRepositoryRef("kafkaIdempotentRepository")
.to(to);27.10. 在 Kafka 使用者中使用手动提交
默认情况下,Kafka 使用者将使用自动提交,其中偏移将使用给定间隔自动在后台提交。
如果要强制提交,您可以使用 Camel Exchange 中的 KafkaManualCommit API,存储在消息标头中。这要求通过将 KafkaComponent 或端点上的选项 allowManualCommit 设置为 true 来手动提交,例如:
KafkaComponent kafka = new KafkaComponent();
kafka.setAllowManualCommit(true);
...
camelContext.addComponent("kafka", kafka);
然后,您可以使用 Java 代码中的 KafkaManualCommit,如 Camel Processor :
public void process(Exchange exchange) {
KafkaManualCommit manual =
exchange.getIn().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
manual.commit();
}
这将强制同步提交,直到在 Kafka 上确认提交,或者是否抛出异常。您还可以使用异步提交,使用 'DefaultKafkaManualAsyncCommitFactory'implementation 配置 KafkaManualCommitFactory 'implementation。
然后,提交将使用 kafka 异步 commit api 在下一个消费者循环中进行。请注意,分区中的记录必须由唯一的线程处理和提交。如果没有,这可能会导致不一致的行为。这主要用于聚合的完成超时策略。
如果要使用 KafkaManualCommit 的自定义实现,您可以在 KafkaComponent 上配置自定义 KafkaManualCommitFactory,以创建自定义实现实例。
27.11. Kafka Headers propagation
当使用 Kafka 的消息时,标头将自动传播到 camel Exchange 标头。由相同行为支持的生成流 - 特定交换的 camel 标头将传播到 kafka 消息标头。
由于 kafka 标头只允许 byte[] 值,因此,为了传播它的值,应序列化为 bytes[],否则将跳过标头。支持以下标头值类型: String,Integer,Long, Double, 布尔值,byte[]。注: 所有标头 从 kafka 传播到 camel Exchange 将默认包含 byte[] 值。若要覆盖默认功能 uri 参数,可以设置: headerDeserializer for from route 和 headerSerializer 用于路由。例如:
from("kafka:my_topic?headerDeserializer=#myDeserializer")
...
.to("kafka:my_topic?headerSerializer=#mySerializer")
默认情况下,所有标头都会被 KafkaHeaderFilterStrategy 过滤。策略过滤掉以 Camel 或 org.apache.camel 前缀开头的标头。可以使用 中 到 路由中的 headerFilterStrategy uri 参数和路由覆盖默认策略:
from("kafka:my_topic?headerFilterStrategy=#myStrategy")
...
.to("kafka:my_topic?headerFilterStrategy=#myStrategy")
myStrategy 对象应该是 HeaderFilterStrategy 的子类,且必须放置到 Camel registry 中,也可以作为 Bean 在 Spring/Blueprint 中注册,因为它是 CamelContext aware。
27.12. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 kafka 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-kafka-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 105 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.kafka.additional-properties | 如果无法直接在 camel 配置上设置 kafka consumer 或 kafka producer 的额外属性(例如:尚未反映在 Camel 配置中的新 Kafka 属性),属性必须加上额外的Properties。e.g: additionalProperties.transactional.id=12345&additionalProperties.schema.registry.url=http://localhost:8811/avro。 | map | |
| camel.component.kafka.allow-manual-commit | 是否允许通过 KafkaManualCommit 进行手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange 消息标头中,它允许最终用户访问此 API 并通过 Kafka 使用者执行手动偏移提交。 | false | 布尔值 |
| camel.component.kafka.auto-commit-enable | 如果为 true,请定期提交到 ZooKeeper,以偏移已由消费者获取的信息。当进程失败时,会使用这个提交的偏移,因为新消费者开始的位置。 | true | 布尔值 |
| camel.component.kafka.auto-commit-interval-ms | 消费者偏移的 ms 频率被提交到 zookeeper。 | 5000 | 整数 |
| camel.component.kafka.auto-commit-on-stop | 当消费者停止时是否执行显式自动提交,以确保代理具有上次消耗的消息的提交。这要求打开自动CommitEnable 选项。可能的值有: sync、async 或 none。和 sync 是默认值。 | sync | 字符串 |
| camel.component.kafka.auto-offset-reset | 当 ZooKeeper 中没有初始偏移时,或者偏移范围不足: earliest : 自动将偏移重置为最早偏移最新的 : 自动将偏移重置为最新的偏移失败:将偏移重置为最新的偏移失败:向消费者抛出异常。 | latest | 字符串 |
| camel.component.kafka.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.kafka.break-on-first-error | 此选项控制消费者处理交换时会发生什么,并且失败。如果选项为 false,则使用者将继续执行下一个消息并处理它。如果选项为 true,则消费者会中断,并将返回到导致失败的消息偏移,然后重新尝试处理此消息。但是,如果其绑定每次都失败,这可能会导致无法处理同一消息,例如中毒消息。因此,建议您使用 Camel 的错误处理程序处理示例。 | false | 布尔值 |
| camel.component.kafka.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.kafka.brokers | 要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理的子集,也可以是指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。 | 字符串 | |
| camel.component.kafka.buffer-memory-size | 制作者可用于缓冲记录的总字节,用于等待发送到服务器。如果记录发送速度快于服务器,则生产者将根据 block.on.buffer.full 指定的首选项来阻止或抛出异常。此设置应当与制作者要使用的内存大致对应,但并非者所使用的所有内存都不会被硬绑定。一些额外的内存将用于压缩(如果启用了压缩),以及维护 in-flight 请求。 | 33554432 | 整数 |
| camel.component.kafka.check-crcs | 自动检查已使用的记录的 CRC32。这样可确保发生消息的在线或磁盘损坏。此检查添加了一些开销,因此在寻求极端性能的情况下可能会禁用它。 | true | 布尔值 |
| camel.component.kafka.client-id | 客户端 id 是每个请求中发送的用户指定的字符串,以帮助追踪调用。它应该以逻辑方式识别提出请求的应用。 | 字符串 | |
| camel.component.kafka.commit-timeout-ms | 代码将等待同步提交完成的最长时间(以毫秒为单位)。选项是一个 java.lang.Long 类型。 | 5000 | Long |
| camel.component.kafka.compression-codec | 此参数允许您为此制作者生成的所有数据指定压缩代码。有效值为 none、gzip 和 snappy。 | none | 字符串 |
| camel.component.kafka.configuration | 允许使用端点将重复使用的通用选项预配置 Kafka 组件。选项是一个 org.apache.camel.component.kafka.KafkaConfiguration 类型。 | KafkaConfiguration | |
| camel.component.kafka.connection-max-idle-ms | 在此配置指定的毫秒数后关闭闲置连接。 | 540000 | 整数 |
| camel.component.kafka.consumer-request-timeout-ms | 配置控制客户端等待请求响应的最长时间。如果响应在超时前收到,客户端会在必要时重新发送请求,或者在重试已耗尽时失败请求。 | 40000 | 整数 |
| camel.component.kafka.consumers-count | 连接到 kafka 服务器的消费者数量。每个使用者在单独的线程上运行,后者检索和处理传入的数据。 | 1 | 整数 |
| camel.component.kafka.delivery-timeout-ms | 在调用 send ()后报告成功或失败的时间上限。这限制了在发送前延迟记录的总时间,从代理等待确认时间(如预期),以及可重新发送失败的时间。 | 120000 | 整数 |
| camel.component.kafka.enable-idempotence | 如果设置为 'true',则制作者将确保在流中写入每个消息的确切副本。如果为 'false',则制作者重试可能会在流中写入重试消息的重复。如果设置为 true,这个选项将需要 max.in.flight.requests.per.connection 设置为 1,重试不能为零,另外的 acks 必须设为 'all'。 | false | 布尔值 |
| camel.component.kafka.enabled | 是否启用 kafka 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.kafka.fetch-max-bytes | 服务器应该为获取请求返回的最大数据量。如果 fetch 的第一个非空分区中的第一个消息大于这个值,则消息仍会返回,以确保消费者进行进度。代理接受的最大消息大小通过 message.max.bytes (broker config)或 max.message.bytes (topic config)定义。请注意,消费者并行执行多个获取。 | 52428800 | 整数 |
| camel.component.kafka.fetch-min-bytes | 服务器应该为获取请求返回的最小数据量。如果数据不足,请求将在回答请求之前等待大量数据。 | 1 | 整数 |
| camel.component.kafka.fetch-wait-max-ms | 如果没有足够的数据来满足 fetch.min.bytes,则服务器在回答获取请求前将阻止的最大时间。 | 500 | 整数 |
| camel.component.kafka.group-id | 唯一标识此使用者进程组的字符串。通过设置相同的组 id 多个进程,表示它们都是同一消费者组的一部分。消费者需要这个选项。 | 字符串 | |
| camel.component.kafka.group-instance-id | 最终用户提供的使用者实例的唯一标识符。仅允许非空字符串。如果设置,使用者将被视为静态成员,这意味着任何消费者组中只允许具有此 ID 的一个实例。这可以与更大的会话超时结合使用,以避免由临时不可用(如进程重启)导致的组重新平衡。如果没有设置,使用者将作为动态成员加入组,这是传统的行为。 | 字符串 | |
| camel.component.kafka.header-deserializer | 使用自定义 KafkaHeaderDeserializer 来反序列化 kafka 标头值。选项是一个 org.apache.camel.component.kafka.serde.KafkaHeaderDeserializer 类型。 | KafkaHeaderDeserializer | |
| camel.component.kafka.header-filter-strategy | 使用自定义 HeaderFilterStrategy 过滤标题到 Camel 消息或从 Camel 消息过滤。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
| camel.component.kafka.header-serializer | 使用自定义 KafkaHeaderSerializer 来序列化 kafka 标头值。选项是一个 org.apache.camel.component.kafka.serde.KafkaHeaderSerializer 类型。 | KafkaHeaderSerializer | |
| camel.component.kafka.heartbeat-interval-ms | 使用 Kafka 的组管理功能时,心跳到消费者协调器之间的预期时间。心跳用于确保消费者的会话保持活跃状态,并在新消费者加入或离开组时进行重新平衡。该值必须小于 session.timeout.ms,但设置的值通常不应超过该值的 1/3。它甚至可以降低以控制正常重新平衡的预期时间。 | 3000 | 整数 |
| camel.component.kafka.interceptor-classes | 为生产者或消费者设置拦截器。生产者拦截器必须作为类实施 org.apache.kafka.clients.producer.ProducerInterceptor Consumer interceptors 必须是实施 org.apache.kafka.clients.consumer.ConsumerInterceptor 的类,如果您对消费者使用 Producer 拦截器,它将在运行时抛出一个类广播异常。 | 字符串 | |
| camel.component.kafka.kafka-client-factory | 创建 org.apache.kafka.clients.consumer.KafkaConsumer 和 org.apache.kafka.clients.producer.KafkaProducer 实例的工厂。这允许配置自定义工厂,以使用扩展 vanilla Kafka 客户端的逻辑创建实例。选项是一个 org.apache.camel.component.kafka.KafkaClientFactory 类型。 | KafkaClientFactory | |
| camel.component.kafka.kafka-manual-commit-factory | 创建 KafkaManualCommit 实例的工厂。当从开箱即用的默认实现中手动提交时,这允许自定义工厂创建自定义 KafkaManualCommit 实例,以防需要进行特殊逻辑。选项是一个 org.apache.camel.component.kafka.KafkaManualCommitFactory 类型。 | KafkaManualCommitFactory | |
| camel.component.kafka.kerberos-before-relogin-min-time | 刷新尝试之间的登录线程睡眠时间。 | 60000 | 整数 |
| camel.component.kafka.kerberos-init-cmd | Kerberos kinit 命令路径。默认为 /usr/bin/kinit。 | /usr/bin/kinit | 字符串 |
| camel.component.kafka.kerberos-principal-to-local-rules | 从主体名称映射到短名称(通常是操作系统用户名)的规则列表。规则按顺序评估,第一个匹配主体名称的规则用于将其映射到短名称。列表中的任何后续规则都会被忽略。默认情况下,{username}/{hostname}{REALM} 形式的主体名称映射到 {username}。有关格式的详情,请查看安全授权和 acls 文档。可以使用逗号分隔多个值。 | DEFAULT | 字符串 |
| camel.component.kafka.kerberos-renew-jitter | 添加到续订时间的随机 jitter 百分比。 | 双 | |
| camel.component.kafka.kerberos-renew-window-factor | 登录线程会处于睡眠状态,直到最后一次刷新到票据到期时间的指定窗口因子被达到,此时它将尝试续订票据。 | 双 | |
| camel.component.kafka.key | 记录密钥(如果没有指定任何密钥,则为 null)。如果配置了这个选项,则其优先于标头 KafkaConstants#KEY。 | 字符串 | |
| camel.component.kafka.key-deserializer | 为实现 Deserializer 接口的密钥反序列化器类。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
| camel.component.kafka.key-serializer | 键的序列化类(如果没有提供,默认为与消息相同)。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
| camel.component.kafka.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.kafka.linger-ms | 生产者组将请求传输到单个批处理请求之间的任何记录组合在一起。通常,只有在记录到达的速度超过发送时,才会在负载下进行。然而,在某些情况下,客户端可能需要减少请求数量,即使是中等负载。此设置通过添加少量人工延迟来实现此目的,而不是立即发送一个记录者将等待给定的延迟,以允许发送其他记录。这可以被认为与 TCP 中的 Nagle 的算法类似。此设置给出了批处理延迟的上限:当我们获得批处理时,无论此设置如何立即发送分区,则设置将立即发送,但如果我们为这个分区有多个字节,我们将在等待更多记录进行"闲置"时显示。此设置默认为 0 (例如,没有延迟)。例如,设置 linger.ms=5 将具有减少发送的请求数量的影响,但会向负载发送的记录增加最多 5ms 的延迟。 | 0 | 整数 |
| camel.component.kafka.max-block-ms | 配置控制发送到 kafka 的块的时长。这些方法可能会因为多种原因而被阻止。对于 e.g: buffer full,元数据不可用。此配置对获取元数据、键和值序列化、分区和值在进行发送时分配缓冲区内存的总时间施加最大限制。如果是 partitionFor (),此配置在等待元数据时会实施最大时间阈值。 | 60000 | 整数 |
| camel.component.kafka.max-in-flight-request | 在阻塞前,客户端将在单个连接上发送的最大未确认请求数量。请注意,如果将此设置设定为大于 1,并且有失败发送,则会因为重试而重新排序消息的风险(例如,如果启用了重试)。 | 5 | 整数 |
| camel.component.kafka.max-partition-fetch-bytes | 服务器将返回的每个分区的最大数据量。请求使用的最大内存为 #partitions max.partition.fetch.bytes。此大小必须至少与服务器允许的最大消息大小相同,否则生成者可能会发送大于消费者的消息。如果发生这种情况,使用者可能会卡住尝试在特定分区上获取大型消息。 | 1048576 | 整数 |
| camel.component.kafka.max-poll-interval-ms | 使用消费者组管理时轮询()调用之间的最大延迟。这会在获取更多记录前,在消费者闲置的时间上绑定上。如果在此超时过期之前没有调用 poll (),那么消费者将被视为失败,并且组将重新平衡,以便将分区重新分配给另一个成员。选项是一个 java.lang.Long 类型。 | Long | |
| camel.component.kafka.max-poll-records | 在要 poll ()的单个调用中返回的最大记录数。 | 500 | 整数 |
| camel.component.kafka.max-request-size | 请求的最大大小。这也是最大记录大小上限。请注意,服务器在记录大小上具有自己的 cap 值,可能不同于此大小。此设置将限制制作者在单个请求中发送的记录批处理数,以避免发送大型请求。 | 1048576 | 整数 |
| camel.component.kafka.metadata-max-age-ms | 以毫秒为单位的时间,我们强制刷新元数据,即使我们未看到任何分区领导更改来主动发现任何新的代理或分区。 | 300000 | 整数 |
| camel.component.kafka.metric-reporters | 用作指标报告器的类列表。通过实施 MetricReporter 接口,可以插入新指标创建通知的类。JmxReporter 始终包含在注册 JMX 统计数据中。 | 字符串 | |
| camel.component.kafka.metrics-sample-window-ms | 维护到计算指标的示例数量。 | 30000 | 整数 |
| camel.component.kafka.no-of-metrics-sample | 维护到计算指标的示例数量。 | 2 | 整数 |
| camel.component.kafka.offset-repository | 要使用的偏移存储库,以便本地存储主题的每个分区的偏移量。定义一个将禁用 autocommit。选项是一个 org.apache.camel.spi.StateRepository<java.lang.String, java.lang.String> 类型。 | StateRepository | |
| camel.component.kafka.partition-assignor | 使用组管理时,客户端将使用的分区分配策略的类名称在消费者实例之间分发分区所有权。 | org.apache.kafka.clients.consumer.RangeAssignor | 字符串 |
| camel.component.kafka.partition-key | 将向其发送记录的分区(如果没有指定分区,则为 null)。如果配置了这个选项,则它优先于标头 KafkaConstants#PARTITION_KEY。 | 整数 | |
| camel.component.kafka.partitioner | 在子主题之间分区信息的分区类。默认分区器基于密钥的哈希。 | org.apache.kafka.clients.producer.internals.DefaultPartitioner | 字符串 |
| camel.component.kafka.poll-exception-strategy | 使用带有消费者的自定义策略来控制如何在池消息时处理 Kafka 代理中的异常。选项是一个 org.apache.camel.component.kafka.PollExceptionStrategy 类型。 | PollExceptionStrategy | |
| camel.component.kafka.poll-on-error | 如果 kafka threw 异常在轮询新消息时,应该做什么。默认情况下,将使用组件配置中的值,除非在端点级别上配置了显式值。DISCARD 将丢弃消息并继续轮询下一个消息。ERROR_HANDLER 将使用 Camel 的错误处理程序来处理异常,之后继续轮询下一个消息。RECONNECT 将重新连接消费者,并尝试再次轮询消息,使消费者再次轮询同一消息将停止消费者(如果消费者应可以再次使用,则必须手动启动/重新启动)。 | PollOnError | |
| camel.component.kafka.poll-timeout-ms | 轮询 KafkaConsumer 时使用的超时。选项是一个 java.lang.Long 类型。 | 5000 | Long |
| camel.component.kafka.producer-batch-size | 每当将多个记录发送到同一分区时,生产者都将尝试将记录一起批处理为更少的请求。这有助于客户端和服务器上的性能。此配置控制默认的批处理大小,以字节为单位。不尝试批处理记录大于这个大小。发送到代理的批处理将包含多个批处理,每个分区都有可用的数据。小型批处理大小将不太常见,并且可能会减少吞吐量(零的批处理大小将完全禁用批量)。非常大的批处理大小可能会更加浪费地使用内存,因为我们将始终在分析额外记录时分配指定批处理大小的缓冲区。 | 16384 | 整数 |
| camel.component.kafka.queue-buffering-max-messages | 在使用 async 模式时可以排队制作者时可以排队制作者的最大未发送消息数,然后才能被阻塞,或者必须丢弃数据。 | 10000 | 整数 |
| camel.component.kafka.receive-buffer-bytes | 读取数据时使用的 TCP 接收缓冲区的大小(SO_RCVBUF)。 | 65536 | 整数 |
| camel.component.kafka.reconnect-backoff-max-ms | 当重新连接到重复连接失败的代理时,需要等待的最大时间(毫秒)。如果提供,每个主机的 backoff 将为每个连续的连接失败指数增加,直到最高值。在计算 backoff 增长后,会添加 20% 随机的 jitter 以避免连接 storms。 | 1000 | 整数 |
| camel.component.kafka.reconnect-backoff-ms | 尝试重新连接到给定主机前等待的时间。这可避免在紧张循环中重复连接到主机。这个 backoff 适用于消费者向代理发送的所有请求。 | 50 | 整数 |
| camel.component.kafka.record-metadata | 制作者是否应该存储 RecordMetadata 结果到 Kafka。结果存储在包含 RecordMetadata 元数据的列表中。该列表存储在带有键 KafkaConstants#KAFKA_RECORDMETA 的标头中。 | true | 布尔值 |
| camel.component.kafka.request-required-acks | 在考虑请求完成前,生产者需要收到该制作者的确认数量。这控制发送的记录的持久性。以下设置很常见:acks=0 如果设为零,则制作者不会等待服务器中的任何确认。记录将立即添加到套接字缓冲区中,并被视为已发送。不保证服务器在这种情况下收到了记录,重试配置将无效(因为客户端通常不知道任何故障)。每个记录给出的偏移始终设为 -1。acks=1 意味着领导会将记录写入其本地日志,但不会等待所有后续者完全确认。在这种情况下,领导会在确认记录后立即失败,但在后续者复制该记录之前,记录将会丢失。acks=all 意味着领导机将等待一整组同步副本确认记录。这样可保证,只要至少有一个同步副本保持活跃,记录就不会被丢失。这是最强的可用保证。 | 1 | 字符串 |
| camel.component.kafka.request-timeout-ms | 在向客户端发送错误前,代理会等待尝试满足 request.required.acks 要求的时间。 | 30000 | 整数 |
| camel.component.kafka.resume-strategy | 这个选项允许用户设置自定义恢复策略。当分配分区时(例如:连接或重新连接时),执行恢复策略。它允许实施自定义如何恢复操作,并作为 seekTo 和 offsetRepository 机制的更灵活的替代方案。有关实现详情,请参阅 KafkaConsumerResumeStrategy。此选项不会影响自动提交设置。使用此设置的实现可能还要使用手动提交选项来评估。选项是一个 org.apache.camel.component.kafka.consumer.support.KafkaConsumerResumeStrategy 类型。 | KafkaConsumerResumeStrategy | |
| camel.component.kafka.retries | 设置大于零的值将导致客户端重新发送发送失败的任何记录,并具有潜在的瞬时错误。请注意,如果客户端在收到错误时重新显示记录,则这个重试不会不同。允许重试可能会更改记录的排序,因为如果两个记录被发送到一个分区,并且第一个记录失败,但重试,但第二次记录可能会首先出现。 | 0 | 整数 |
| camel.component.kafka.retry-backoff-ms | 在每个重试前,生产者会刷新相关主题的元数据,以查看是否已选择新的领导。由于领导选举需要一些时间,此属性指定制作者在刷新元数据前等待的时间。 | 100 | 整数 |
| camel.component.kafka.sasl-jaas-config | 公开 kafka sasl.jaas.config 参数示例: org.apache.kafka.common.security.plain.PlainLoginModule 需要 username=USERNAME password=PASSWORD;。 | 字符串 | |
| camel.component.kafka.sasl-kerberos-service-name | Kafka 运行的 Kerberos 主体名称。这可以在 Kafka 的 JAAS 配置或 Kafka 配置中定义。 | 字符串 | |
| camel.component.kafka.sasl-mechanism | 使用简单身份验证和安全层(SASL)机制。有关有效值,请参阅。 | GSSAPI | 字符串 |
| camel.component.kafka.schema-registry-u-r-l | 要使用的 Confluent Platform 模式 registry 服务器的 URL。格式为 host1:port1,host2:port2。这在 Confluent Platform 文档中被称为 schema.registry.url。这个选项只在 Confluent Platform (不是标准 Apache Kafka)中可用。 | 字符串 | |
| camel.component.kafka.security-protocol | 用于与代理通信的协议。支持 SASL_PLAINTEXT、PLAINTEXT 和 SSL。 | PLAINTEXT | 字符串 |
| camel.component.kafka.seek-to | 设置 KafkaConsumer 将在启动时从开始或结尾读取:从开始开始读取 : read from end : read from end This is replace the earlier attribute seekToBeginning。 | 字符串 | |
| camel.component.kafka.send-buffer-bytes | 套接字写入缓冲区大小。 | 131072 | 整数 |
| camel.component.kafka.session-timeout-ms | 使用 Kafka 组管理功能时用于检测故障的超时。 | 10000 | 整数 |
| camel.component.kafka.shutdown-timeout | 超时时间(毫秒),以毫秒为单位,等待消费者或制作者关闭并终止其 worker 线程。 | 30000 | 整数 |
| camel.component.kafka.specific-avro-reader | 这可让特定的 Avro reader 用于 Confluent Platform schema registry 和 io.confluent.kafka.serializers.KafkaAvroDeserializer。这个选项只在 Confluent Platform (不是标准 Apache Kafka)中可用。 | false | 布尔值 |
| camel.component.kafka.ssl-cipher-suites | 密码套件列表。这是身份验证、加密、MAC 和密钥交换算法的命名组合,用于使用 TLS 或 SSL 网络协议协商网络连接的安全设置。By 默认支持所有可用的密码套件。 | 字符串 | |
| camel.component.kafka.ssl-context-parameters | 使用 Camel SSLContextParameters 对象的 SSL 配置.如果在其他 SSL 端点参数之前已进行了配置,则应用它。注意:Kafka 只支持从文件位置加载密钥存储,以便在 KeyStoreParameters.resource 选项中使用 file: 前缀。选项是 org.apache.camel.support.jsse.SSLContextParameters 类型。 | SSLContextParameters | |
| camel.component.kafka.ssl-enabled-protocols | 为 SSL 连接启用的协议列表。TLSv1.2、TLSv1.1 和 TLSv1 默认启用。 | 字符串 | |
| camel.component.kafka.ssl-endpoint-algorithm | 使用服务器证书验证服务器主机名的端点标识算法。 | https | 字符串 |
| camel.component.kafka.ssl-key-password | 密钥存储文件中私钥的密码。这对客户端是可选的。 | 字符串 | |
| camel.component.kafka.ssl-keymanager-algorithm | 用于 SSL 连接的密钥管理器工厂使用的算法。Default 值是为 Java 虚拟机配置的密钥管理器工厂算法。 | SunX509 | 字符串 |
| camel.component.kafka.ssl-keystore-location | 密钥存储文件的位置。这是可选的,可用于客户端双向身份验证。 | 字符串 | |
| camel.component.kafka.ssl-keystore-password | 密钥存储文件的存储密码。这对客户端是可选的,只有在配置了 ssl.keystore.location 时才需要。 | 字符串 | |
| camel.component.kafka.ssl-keystore-type | 密钥存储文件的文件格式。这对客户端是可选的。默认值为 JKS。 | JKS | 字符串 |
| camel.component.kafka.ssl-protocol | 用于生成 SSLContext 的 SSL 协议。默认设置为 TLS,对于大多数情况来说都可以正常工作。最近的 JVM 中允许的值是 TLS、TLSv1.1 和 TLSv1.2。较旧的 JVM 中可能支持 SSL、SSLv2 和 SSLv3,但由于已知的安全漏洞,不建议使用它们。 | 字符串 | |
| camel.component.kafka.ssl-provider | 用于 SSL 连接的安全提供程序的名称。默认值为 JVM 的默认安全提供程序。 | 字符串 | |
| camel.component.kafka.ssl-trustmanager-algorithm | 信任管理器工厂用于 SSL 连接的算法。Default 值是为 Java 虚拟机配置的信任管理器工厂算法。 | PKIX | 字符串 |
| camel.component.kafka.ssl-truststore-location | 信任存储文件的位置。 | 字符串 | |
| camel.component.kafka.ssl-truststore-password | 信任存储文件的密码。 | 字符串 | |
| camel.component.kafka.ssl-truststore-type | 信任存储文件的文件格式。默认值为 JKS。 | JKS | 字符串 |
| camel.component.kafka.synchronous | 设置是否应严格使用同步处理。 | false | 布尔值 |
| camel.component.kafka.topic-is-pattern | 主题是否为模式(正则表达式)。这可以用于订阅与模式匹配的动态主题数。 | false | 布尔值 |
| camel.component.kafka.use-global-ssl-context-parameters | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| camel.component.kafka.value-deserializer | deserializer 类用于实现 Deserializer 接口的值。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
| camel.component.kafka.value-serializer | 消息的序列化类。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
| camel.component.kafka.worker-pool | 要在 kafka 服务器确认消息从 KafkaProducer 使用异步非阻塞处理,使用自定义 worker 池继续路由 Exchange。如果使用这个选项,则必须处理线程池的生命周期,以便在需要时关闭池。选项是一个 java.util.concurrent.ExecutorService 类型。 | ExecutorService | |
| camel.component.kafka.worker-pool-core-size | 在 kafka 服务器确认从 KafkaProducer 使用异步非阻塞处理发送到 KafkaProducer 的消息后,worker 池的核心线程数量将继续路由 Exchange。 | 10 | 整数 |
| camel.component.kafka.worker-pool-max-size | 在 kafka 服务器确认从 KafkaProducer 使用异步非阻塞处理发送到 KafkaProducer 的消息后,worker 池的最大线程数量可以继续路由 Exchange。 | 20 | 整数 |
第 28 章 Kamelet
支持制作者和使用者
Kamelet 组件支持使用端点语义与 Camel 路由模板 引擎交互。
28.1. URI 格式
kamelet:templateId/routeId[?options]
28.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
28.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
28.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
28.3. 组件选项
Kamelet 组件支持 9 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 位置 (通用) | Kamelets 文件系统中的位置。可以用逗号分隔多个位置。 | classpath:/kamelets | 字符串 |
| routeProperties (common) | 设置路由本地参数。 | map | |
| templateProperties (common) | 设置模板本地参数。 | map | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| Block (producer) | 如果向没有活跃的消费者的 kamelet 端点发送消息,那么我们可以告诉制作者阻止并等待消费者变为活动状态。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 超时 (生成者) | 如果启用了块,要使用的超时值。 | 30000 | long |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| routeTemplateLoaderListener (advanced) | Autowired To 插件一个自定义监听程序,当 Kamelet 组件从外部资源加载 Kamelets 时。 | RouteTemplateLoaderListener |
28.4. 端点选项
Kamelet 端点使用 URI 语法进行配置:
kamelet:templateId/routeId
使用以下路径和查询参数:
28.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| templateId (common) | 所需的 路由模板 ID。 | 字符串 | |
| routeId (common) | 路由 ID。默认值 notice:如果未提供,则 ID 会被自动生成。 | 字符串 |
28.4.2. 查询参数(8 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 位置 (通用) | Kamelet 使用的位置,它可以指定为来自文件系统、classpath 等资源。位置无法使用通配符,并且必须引用包括扩展名的文件,例如 file:/etc/foo-kamelet.xml。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| Block (producer) | 如果向没有活动消费者的直接端点发送消息,那么我们可以告诉制作者阻止并等待使用者变为活动状态。 | true | 布尔值 |
| failIfNoConsumers (producer) | 当发送到 kamelet 端点且无活动消费者时,生产者是否应通过抛出异常失败。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 超时 (生成者) | 如果启用了块,要使用的超时值。 | 30000 | long |
kamelet 端点 很好,这意味着端点接受传递给引擎的额外参数,并在路由材料后使用。
28.5. Discovery(发现)
如果没有找到 Route 模板,kamelet 端点会尝试从文件系统加载相关的 kamelet 定义(通过默认的 classpath:/kamelets)。默认解析机制预期 kamelet 文件具有扩展名 .kamelet.yaml。
28.6. Samples
Kamelets 可以像标准 Camel 组件一样使用。例如,假设我们创建了路由模板,如下所示:
routeTemplate("setMyBody")
.templateParameter("bodyValue")
.from("kamelet:source")
.setBody().constant("{{bodyValue}}");
要让 Kamelet 组件将材料路由到调用者处理器,我们需要能够识别路由的输入和输出端点,方法是使用 kamele:source 为输出端点标记输入端点和 kamelet:sink。
然后,模板可以实例化并调用,如下所示:
from("direct:setMyBody")
.to("kamelet:setMyBody?bodyValue=myKamelet");在 scenes 后,K Kamelet 组件执行以下操作:
-
它实例化由给定
templateIdpath 参数标识的 Route 模板的路由(本例中为setBody) -
它将像
直接组件一样,并将当前路由连接到材料化的材料。
如果您需要以编程方式完成此操作,则应该如下:
routeTemplate("setMyBody")
.templateParameter("bodyValue")
.from("direct:{{foo}}")
.setBody().constant("{{bodyValue}}");
TemplatedRouteBuilder.builder(context, "setMyBody")
.parameter("foo", "bar")
.parameter("bodyValue", "myKamelet")
.add();
from("direct:template")
.to("direct:bar");28.7. Spring Boot Auto-Configuration
在 Spring Boot 中使用 kamelet 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-kamelet-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 10 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.kamelet.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.kamelet.block | 如果向没有活跃的消费者的 kamelet 端点发送消息,那么我们可以告诉制作者阻止并等待消费者变为活动状态。 | true | 布尔值 |
| camel.component.kamelet.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.kamelet.enabled | 是否启用 kamelet 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.kamelet.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.kamelet.location | Kamelets 文件系统中的位置。可以用逗号分隔多个位置。 | classpath:/kamelets | 字符串 |
| camel.component.kamelet.route-properties | 设置路由本地参数。 | map | |
| camel.component.kamelet.route-template-loader-listener | 为从外部资源加载 Kamelets 时插件自定义监听程序。选项是 org.apache.camel.spi.RouteTemplateLoaderListener 类型。 | RouteTemplateLoaderListener | |
| camel.component.kamelet.template-properties | 设置模板本地参数。 | map | |
| camel.component.kamelet.timeout | 如果启用了块,要使用的超时值。 | 30000 | Long |
第 29 章 语言
仅支持制作者
Language 组件允许您将 Exchange 发送到端点,该端点由 Camel 中的任何受支持语言执行脚本。通过让组件执行语言脚本,它允许更多动态路由功能。例如,使用路由 Slip 或 Dynamic Router EIPs,您也可以发送消息到也定义有动态定义脚本的语言端点。
此组件在 camel-core 中提供,因此不需要额外的 JAR。只有选择的语言需要包括额外的 Camel 组件,比如使用 Groovy 或 JavaScript 语言。
29.1. URI 格式
language://languageName[:script][?options]
您可以使用与 Camel 中 其他语言 支持的相同表示法引用脚本的外部资源。
language://languageName:resource:scheme:location][?options]
29.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
29.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
29.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
29.3. 组件选项
Language 组件支持 2 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
29.4. 端点选项
Language 端点使用 URI 语法进行配置:
language:languageName:resourceUri
使用以下路径和查询参数:
29.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| languageName (producer) | 必需 设置要使用的语言名称。 Enum 值:
| 字符串 | |
| resourceUri (producer) | 资源的路径,或引用在注册表中查找用作资源的 bean。 | 字符串 |
29.4.2. 查询参数(7 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| allowContextMapAll (producer) | 设置上下文映射是否应允许访问所有详细信息。默认情况下,只能访问邮件正文和标头。可启用这个选项,以完全访问当前 Exchange 和 CamelContext。这样做会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问权限。 | false | 布尔值 |
| 二进制 (生成者) | 脚本是二进制内容还是文本内容。默认情况下,脚本将读取为文本内容(如 java.lang.String)。 | false | 布尔值 |
| cacheScript (producer) | 是否缓存编译的脚本并重复使用 Notice 可能会导致脚本处理一个 Camel org.apache.camel.Exchange 到下一个 org.apache.camel.Exchange 的副作用。 | false | 布尔值 |
| ContentCache (producer) | 设置是否使用资源内容缓存。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 脚本 (生成器) | 设置要执行的脚本。 | 字符串 | |
| 转换 (生成者) | 脚本的结果是否应该用作邮件正文。这个选项默认为 true。 | true | 布尔值 |
29.5. 消息标头
以下消息标头可用于影响组件的行为
| 标头 | 描述 |
|---|---|
|
| 标头中提供的执行的脚本。优先于在端点上配置的脚本。 |
29.6. 例子
例如,您可以使用 简单 语言向 Message Translator 消息。
您也可以将脚本作为标头提供,如下所示。在这里,我们使用 XPath 语言从 <foo> 标签中提取文本。
Object out = producer.requestBodyAndHeader("language:xpath", "<foo>Hello World</foo>", Exchange.LANGUAGE_SCRIPT, "/foo/text()");
assertEquals("Hello World", out);29.7. 从资源载入脚本
您可以为脚本指定 resource uri 以在端点 uri 中加载,或者在 Exchange.LANGUAGE_SCRIPT 标头中加载。uri 必须以以下方案之一开头:file:、classpath: 或 http :
默认情况下,该脚本被加载一次并缓存。但是,您可以禁用 contentCache 选项,并在每次评估时载入脚本。例如,如果磁盘上更改了 myscript.txt 文件,则使用更新的脚本:
您可以通过使用 "resource:" 前缀引用 Camel 中与 其他语言 类似的资源,如下所示。
29.8. Spring Boot Auto-Configuration
当将语言与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-language-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.language.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.language.enabled | 是否启用语言组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.language.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 30 章 Log
仅支持制作者
日志组件日志消息交换到底层的日志机制。
Camel 使用 SLF4J,它允许您通过其他配置日志记录:
- Log4j
- Logback
- Java Util Logging
30.1. URI 格式
log:loggingCategory[?options]
其中 loggingCategory 是要使用的日志记录类别的名称。您可以以以下格式将查询选项附加到 URI 中,
?option=value&option=value&…
使用 Registry
中的 Logger 实例,如果 Registry 中有单一的 org.slf4j.Logger,则 loggingCategory 不再用于创建日志记录器实例。改为使用注册的实例。另外,也可以使用 ?logger=#my URI 参数来引用特定的 Logger 实例。最终,如果没有注册并且 URI Logger 日志记录器 参数,则使用 loggingCategory 创建日志记录器实例。
例如,日志端点通常使用 level 选项指定 日志级别,如下所示:
log:org.apache.camel.example?level=DEBUG
默认日志记录器记录每个交换(常规日志记录)。但是,Camel 还附带了 throughput put 日志记录器,每当指定 groupSize 选项时使用它。
另外,在 DSL
中也有一个直接在 DSL 中的日志,但它具有不同的目的。它旨在用于轻量级和人类日志。请参阅 LogEIP 的更多详细信息。
30.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
30.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
30.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
30.3. 组件选项
日志组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| ExchangeFormatter (高级) | Autowired set a custom ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认使用 DefaultExchangeFormatter。 | ExchangeFormatter |
30.4. 端点选项
日志端点使用 URI 语法进行配置:
log:loggerName
使用以下路径和查询参数:
30.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| loggerName (producer) | 要使用的日志类别 所需的 名称。 | 字符串 |
30.4.2. 查询参数(27 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| groupActiveOnly (producer) | 如果为 true,则当没有以时间间隔收到新消息时,将隐藏统计信息,如果为 false,则显示 stats,而不考虑消息流量。 | true | 布尔值 |
| groupDelay (producer) | 为 stats 设置初始延迟(在 millis 中)。 | Long | |
| groupInterval (producer) | 如果指定 将为此时间间隔对消息统计信息进行分组(以 millis 为单位)。 | Long | |
| groupSize (producer) | 指定吞吐量日志记录的组群大小的整数。 | 整数 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| level (生成者) | 要使用的日志记录级别。默认值为 INFO。 Enum 值:
| INFO | 字符串 |
| logMask (producer) | 如果为 true,在日志中屏蔽敏感信息,如密码或密码短语。 | 布尔值 | |
| 标记 (生成) | 要使用的可选标记名称。 | 字符串 | |
| ExchangeFormatter (高级) | 使用自定义交换格式器。 | ExchangeFormatter | |
| MaxChars (formatting) | 限制每行记录的字符数。 | 10000 | int |
| 多行 (格式化) | 如果启用,则会在新行上输出每个信息。 | false | 布尔值 |
| showAll (格式化) | 用于打开所有选项的快速选项(如果正在使用,则必须手动设置 maxChars)。 | false | 布尔值 |
| showAllProperties (formatting) | 显示所有交换属性(内部和自定义)。 | false | 布尔值 |
| showBody (格式) | 显示邮件正文。 | true | 布尔值 |
| showBodyType (formatting) | 显示正文 Java 类型。 | true | 布尔值 |
| showCaughtException (formatting) | 如果交换有一个捕获异常,请显示异常消息(无堆栈追踪)。捕获异常作为属性存储在交换上(使用密钥 org.apache.camel.Exchange#EXCEPTION_CAUGHT)以及实例: doCatch 可以捕获异常。 | false | 布尔值 |
| showException (格式) | 如果交换有一个例外,请显示异常消息(no stacktrace)。 | false | 布尔值 |
| showExchangeId (formatting) | 显示唯一的交换 ID。 | false | 布尔值 |
| showExchangePattern (formatting) | 显示消息交换模式(或 MEP 代表短)。 | true | 布尔值 |
| showFiles (格式化) | 如果启用了 Camel 将输出文件。 | false | 布尔值 |
| showFuture (formatting) | 如果启用 Camel 将在 Future 对象上等待它完成,以获取有效负载记录。 | false | 布尔值 |
| showHeaders (formatting) | 显示消息标头。 | false | 布尔值 |
| showProperties (格式) | 显示交换属性(仅自定义)。使用 showAllProperties 显示内部和外部属性。 | false | 布尔值 |
| showStackTrace (格式) | 如果交换有一个例外,显示堆栈跟踪。只有其中一个 showAll、showException 或 showCaughtException 才会生效。 | false | 布尔值 |
| showStreams (formatting) | Camel 是否应该显示流正文(如 java.io.InputStream)。如果您启用此选项,您可能无法稍后访问消息正文,因为流已由这个日志记录器读取。要补救这一点,您必须使用流缓存。 | false | 布尔值 |
| skipBodyLineSeparator (formatting) | 在记录邮件正文时是否跳过行分隔符。这允许在一行中记录邮件正文,将此选项设置为 false 将保留正文中的任何行分隔符,然后记录正文(如下所示)。 | true | 布尔值 |
| 样式 (格式化) | 设置要使用的输出风格。 Enum 值:
| 默认 | OutputStyle |
30.5. 常规日志记录器示例
在以下路由中,在处理顺序前,在 DEBUG 级别上记录传入的顺序:
from("activemq:orders").to("log:com.mycompany.order?level=DEBUG").to("bean:processOrder");或使用 Spring XML 定义路由:
<route> <from uri="activemq:orders"/> <to uri="log:com.mycompany.order?level=DEBUG"/> <to uri="bean:processOrder"/> </route>
30.6. 带有格式器示例的常规日志记录器
在以下路由中,在处理订购前,我们会在 INFO 级别记录传入的顺序。
from("activemq:orders").
to("log:com.mycompany.order?showAll=true&multiline=true").to("bean:processOrder");30.7. 带有 groupSize 示例的吞吐量日志记录器
在以下路由中,我们记录 DEBUG 级别上传入顺序的吞吐量,按 10 个消息分组。
from("activemq:orders").
to("log:com.mycompany.order?level=DEBUG&groupSize=10").to("bean:processOrder");30.8. 带有 groupInterval 示例的吞吐量日志记录器
此路由将导致每 10 秒记录消息统计,即使没有任何消息流量,也应该会显示初始 60s 延迟和统计数据。
from("activemq:orders").
to("log:com.mycompany.order?level=DEBUG&groupInterval=10000&groupDelay=60000&groupActiveOnly=false").to("bean:processOrder");将记录以下内容:
"Received: 1000 new messages, with total 2000 so far. Last group took: 10000 millis which is: 100 messages per second. average: 100"
30.9. 屏蔽密码等敏感信息
您可以通过将 logMask 标志设置为 true 来为日志记录启用安全掩码。请注意,这个选项也会影响日志 EIP。
在 CamelContext 级别启用 Java DSL 中启用掩码:
camelContext.setLogMask(true);
在 XML 中:
<camelContext logMask="true">
您还可以在端点级别打开|关闭。要在端点级别的 Java DSL 中启用掩码,请在日志端点的 URI 中添加 logMask=true 选项:
from("direct:start").to("log:foo?logMask=true");在 XML 中:
<route> <from uri="direct:foo"/> <to uri="log:foo?logMask=true"/> </route>
org.apache.camel.support.processor.DefaultMaskingFormatter 默认用于屏蔽。如果要使用自定义屏蔽格式器,请使用名称 CamelCustomLogMask 将其放入 registry 中。请注意,掩码格式器必须实施 org.apache.camel.spi.MaskingFormatter。
30.10. 日志输出的完整自定义
通过部分中所述的选项,您可以控制日志记录器的大部分输出。但是,日志行总是遵循此结构:
Exchange[Id:ID-machine-local-50656-1234567901234-1-2, ExchangePattern:InOut,
Properties:{CamelToEndpoint=log://org.apache.camel.component.log.TEST?showAll=true,
CamelCreatedTimestamp=Thu Mar 28 00:00:00 WET 2013},
Headers:{breadcrumbId=ID-machine-local-50656-1234567901234-1-1}, BodyType:String, Body:Hello World, Out: null]在某些情况下这种格式不可理解,这可能是因为您需要…
- 过滤所打印的标头和属性,使其与洞察和详细程度之间的平衡。
- 将日志消息调整为您认为最易读的任何消息。
- 通过日志采集系统来定制日志消息,如 Splunk。
- 不同的打印特定正文类型。
每当需要绝对自定义时,您可以创建实施接口的类。在您可以访问完整交换 的格式(Exchange) 方法中,您可以选择并提取您需要的确切信息,以自定义方式对其进行格式化并返回。返回值将变为最终日志消息。
您可以通过以下两种方式之一获取您的自定义 交换格式 :
在 registry 中显式实例化 LogComponent:
<bean name="log" class="org.apache.camel.component.log.LogComponent"> <property name="exchangeFormatter" ref="myCustomFormatter" /> </bean>
30.10.1. 与配置相关的约定
只需使用名称 logFormatter 注册 bean,日志组件就足够智能,可自动选取它。
<bean name="logFormatter" class="com.xyz.MyCustomExchangeFormatter" />
ExchangeFormatter 应用到该 Camel 上下文 中的所有日志端点。如果您不同的端点需要不同的 ExchangeFormatters,请根据需要实例化 LogComponent,并使用相关的 Bean 名称作为端点前缀。
使用自定义日志格式ter 时,您可以在 log uri 中指定参数,这在自定义日志格式器上配置。虽然当您这样做时,您应该将"logFormatter"定义为有原型范围,因此如果您具有不同的参数,则其不共享,例如:
<bean name="logFormatter" class="com.xyz.MyCustomExchangeFormatter" scope="prototype"/>
然后,我们可以使用带有不同选项的 log uri 进行 Camel 路由:
<to uri="log:foo?param1=foo&param2=100"/> <to uri="log:bar?param1=bar&param2=200"/>
30.11. Spring Boot Auto-Configuration
在 Spring Boot 中使用日志时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-log-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.log.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.log.enabled | 是否启用日志组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.log.exchange-formatter | 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认使用 DefaultExchangeFormatter。选项是 org.apache.camel.spi.ExchangeFormatter 类型。 | ExchangeFormatter | |
| camel.component.log.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 31 章 mail
支持制作者和使用者
邮件组件通过 Spring 邮件支持和底层 JavaMail 系统提供对电子邮件的访问。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mail</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>
POP3 或 IMAP
POP3 有一些限制,因此鼓励最终用户使用 IMAP (如果可能)。
使用 mock-mail 测试
,您可以使用模拟框架进行单元测试,这允许您在不需要真实邮件服务器的情况下进行测试。但是,当您需要向真实邮件服务器发送邮件时,您应记得不要包含模拟电子邮件。只在 classpath 上存在 mock-javamail.jar 意味着它将启动并避免发送邮件。
31.1. URI 格式
邮件端点可以分别采用以下 URI 格式之一(用于协议、SMTP、POP3 或 IMAP):
smtp://[username@]host[:port][?options] pop3://[username@]host[:port][?options] imap://[username@]host[:port][?options]
邮件组件还支持这些协议的安全变体(通过 SSL 进行分层)。您可以通过在方案中添加 s 来启用安全协议:
smtps://[username@]host[:port][?options] pop3s://[username@]host[:port][?options] imaps://[username@]host[:port][?options]
31.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
31.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
31.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
31.3. 组件选项
邮件组件支持 43 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| 关闭Folder (使用者) | 消费者是否应该在轮询后关闭文件夹。将这个选项设置为 false 并在轮询之间保持 disconnect=false,然后消费者保持打开文件夹。 | true | 布尔值 |
| copyTo (consumer) | 处理邮件消息后,可以将其复制到具有给定名称的邮件文件夹。您可以用带有键 copyTo 的标头覆盖此配置值,允许您将消息复制到运行时配置的文件夹名称。 | 字符串 | |
| decodeFilename (consumer) | 如果设置为 true,则 MimeUtility.decodeText 方法将用于解码文件名。这与设置 JVM 系统属性 mail.mime.encodefilename 类似。 | false | 布尔值 |
| 删除 (使用者) | 在消息被处理后删除它们。这可以通过在邮件消息上设置 DELETED 标志来完成。如果为 false,则设置 SEEN 标志。从 Camel 2.10 开始,您可以通过使用密钥 delete 设置标头来确定是否应删除邮件,来覆盖此配置选项。 | false | 布尔值 |
| 断开连接 (消费者) | 轮询后消费者是否应断开。如果启用此项,则强制 Camel 在每个轮询上连接。 | false | 布尔值 |
| handleFailedMessage (consumer) | 如果邮件使用者无法检索给定的邮件,则此选项允许处理使用者错误处理程序所导致的异常。通过在消费者上启用网桥错误处理程序,Camel 路由错误处理程序可以处理异常。默认行为是消费者抛出异常,并且来自批处理中的邮件都无法由 Camel 路由。 | false | 布尔值 |
| mimeDecodeHeaders (consumer) | 此选项为邮件标头启用透明 MIME 解码和取消折叠。 | false | 布尔值 |
| MoveTo (消费者) | 处理邮件后,可以将其移动到具有给定名称的邮件文件夹。您可以使用键 moveTo 的标头覆盖此配置值,允许您在运行时将消息移到文件夹名称。 | 字符串 | |
| Site (consumer) | 将 javax.mail.Message 标记为 openmpied,然后再处理邮件邮件。这只适用于 IMAPMessage 消息类型。通过使用在邮件服务器上立即标记为 SEEN 的邮件,那么当 Camel 中出现错误处理时,我们就可以回滚邮件消息。 | true | 布尔值 |
| skipFailedMessage (consumer) | 如果邮件使用者无法检索给定的邮件,则此选项将允许跳过邮件并移动以检索下一个邮件。默认行为是消费者抛出异常,并且来自批处理中的邮件都无法由 Camel 路由。 | false | 布尔值 |
| 不可预见 (消费者) | 是否仅受不可预见的邮件的限制。 | true | 布尔值 |
| fetchSize (consumer (advanced)) | 设置轮询期间要消耗的消息的最大数量。如果邮箱文件夹包含大量消息,这可用于避免加载邮件服务器。默认值 -1 表示没有获取大小,所有消息都会被使用。将值设为 0 是一个特殊情况,Camel 根本不消耗任何消息。 | -1 | int |
| folderName (使用者(高级) | 要轮询的文件夹。 | INBOX | 字符串 |
| mapMailMessage (consumer (advanced)) | 指定 Camel 是否应该将收到的邮件映射到 Camel 正文/headers/attachments。如果设置为 true,邮件正文将映射到 Camel IN 消息的正文,邮件标题将映射到 IN 标头,并附加至 Camel IN attachment 消息。如果此选项设为 false,则 IN 消息将包含原始 javax.mail.Message。您可以通过调用 exchange.getIn ().getBody (javax.mail.Message.class)来检索此原始消息。 | true | 布尔值 |
| bcc (producer) | 设置 BCC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| CC (生成者) | 设置 CC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| from (producer) | 来自电子邮件地址。 | camel@localhost | 字符串 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| replyTo (producer) | Reply-To 收件人(响应邮件的接收器)。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| 主题 (生成者) | 要发送的消息的 Subject。注:在标头中设置主题优先于这个选项。 | 字符串 | |
| 到 (生成者) | 设置电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| javaMailSender (producer (advanced)) | 要使用自定义 org.apache.camel.component.mail.JavaMailSender 来发送电子邮件。 | JavaMailSender | |
| 其他JavaMailProperties (高级) | 设置其他 java 邮件属性,这将附加/覆盖根据所有其他选项设置的任何默认属性。如果您需要添加一些特殊选项,但希望保留其他选项,这将非常有用。 | Properties | |
| alternativeBodyHeader (advanced) | 指定包含替代电子邮件正文的 IN 消息标头的密钥。例如,如果您以 text/html 格式发送电子邮件,并希望为非HTML 电子邮件客户端提供替代邮件正文,请将这个密钥的替代邮件正文设置为标头。 | CamelMailAlternativeBody | 字符串 |
| attachmentsContentTransferEncodingResolver (advanced) | 要使用自定义 AttachmentsContentTransferEncodingResolver 来解析用于附件的 content-type-encoding。 | AttachmentsContentTransferEncodingResolver | |
| 验证器 (高级) | 用于登录的验证器。如果设置,则忽略密码和用户名。可用于可以过期的令牌,因此必须动态读取。 | MailAuthenticator | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 配置 (高级) | 设置邮件配置。 | MailConfiguration | |
| connectionTimeout (高级) | 连接超时(以毫秒为单位)。 | 30000 | int |
| ContentType (advanced) | 邮件内容类型。将 text/html 用于 HTML 邮件。 | text/plain | 字符串 |
| contentTypeResolver (advanced) | 解析器决定 Content-Type 用于文件附加。 | ContentTypeResolver | |
| debugMode (高级) | 在底层邮件框架上启用调试模式。默认情况下,SUN 邮件框架会将调试消息记录到 System.out。 | false | 布尔值 |
| ignoreUnsupportedCharset (advanced) | 选项可使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果不支持 charset,则 charset=XXX (其中 XXX 代表不支持的字符集)已从 content-type 中删除,它依赖于平台默认值。 | false | 布尔值 |
| ignoreUriScheme (advanced) | 选项可使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果不支持 charset,则 charset=XXX (其中 XXX 代表不支持的字符集)已从 content-type 中删除,它依赖于平台默认值。 | false | 布尔值 |
| javaMailProperties (高级) | 设置 java 邮件选项。将清除任何默认属性,并且仅使用为此方法提供的属性。 | Properties | |
| 会话 (高级) | 指定 camel 应该用于所有邮件交互的邮件会话。在由某些其他资源(如 JavaEE 容器)创建和管理邮件会话的情形中,可使用。使用自定义邮件会话时,将使用邮件会话的主机名和端口(如果在会话上配置)。 | session | |
| useInlineAttachments (高级) | 是否使用 disposition inline 或 attachment。 | false | 布尔值 |
| headerFilterStrategy (filter) | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| 密码 (安全) | 登录的密码。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
| sslContextParameters (security) | 使用 SSLContextParameters 配置安全性。 | SSLContextParameters | |
| useGlobalSslContextParameters (security) | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| 用户名 (安全) | 登录的用户名。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 |
31.4. 端点选项
Mail 端点使用 URI 语法进行配置:
imap:host:port
使用以下路径和查询参数:
31.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 主机 (通用) | 需要 邮件服务器主机名。 | 字符串 | |
| 端口 (common) | 邮件服务器的端口号。 | int |
31.4.2. 查询参数(66 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| 关闭Folder (使用者) | 消费者是否应该在轮询后关闭文件夹。将这个选项设置为 false 并在轮询之间保持 disconnect=false,然后消费者保持打开文件夹。 | true | 布尔值 |
| copyTo (consumer) | 处理邮件消息后,可以将其复制到具有给定名称的邮件文件夹。您可以用带有键 copyTo 的标头覆盖此配置值,允许您将消息复制到运行时配置的文件夹名称。 | 字符串 | |
| decodeFilename (consumer) | 如果设置为 true,则 MimeUtility.decodeText 方法将用于解码文件名。这与设置 JVM 系统属性 mail.mime.encodefilename 类似。 | false | 布尔值 |
| 删除 (使用者) | 在消息被处理后删除它们。这可以通过在邮件消息上设置 DELETED 标志来完成。如果为 false,则设置 SEEN 标志。从 Camel 2.10 开始,您可以通过使用密钥 delete 设置标头来确定是否应删除邮件,来覆盖此配置选项。 | false | 布尔值 |
| 断开连接 (消费者) | 轮询后消费者是否应断开。如果启用此项,则强制 Camel 在每个轮询上连接。 | false | 布尔值 |
| handleFailedMessage (consumer) | 如果邮件使用者无法检索给定的邮件,则此选项允许处理使用者错误处理程序所导致的异常。通过在消费者上启用网桥错误处理程序,Camel 路由错误处理程序可以处理异常。默认行为是消费者抛出异常,并且来自批处理中的邮件都无法由 Camel 路由。 | false | 布尔值 |
| maxMessagesPerPoll (使用者) | 指定每个轮询收集的最大消息数。默认情况下,不会设置最大值。可用于设置 e.g. 1000 的限制,以避免在服务器启动时下载数千文件。将值设为 0 或负数以禁用这个选项。 | int | |
| mimeDecodeHeaders (consumer) | 此选项为邮件标头启用透明 MIME 解码和取消折叠。 | false | 布尔值 |
| MoveTo (消费者) | 处理邮件后,可以将其移动到具有给定名称的邮件文件夹。您可以使用键 moveTo 的标头覆盖此配置值,允许您在运行时将消息移到文件夹名称。 | 字符串 | |
| Site (consumer) | 将 javax.mail.Message 标记为 openmpied,然后再处理邮件邮件。这只适用于 IMAPMessage 消息类型。通过使用在邮件服务器上立即标记为 SEEN 的邮件,那么当 Camel 中出现错误处理时,我们就可以回滚邮件消息。 | true | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| skipFailedMessage (consumer) | 如果邮件使用者无法检索给定的邮件,则此选项将允许跳过邮件并移动以检索下一个邮件。默认行为是消费者抛出异常,并且来自批处理中的邮件都无法由 Camel 路由。 | false | 布尔值 |
| 不可预见 (消费者) | 是否仅受不可预见的邮件的限制。 | true | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| fetchSize (consumer (advanced)) | 设置轮询期间要消耗的消息的最大数量。如果邮箱文件夹包含大量消息,这可用于避免加载邮件服务器。默认值 -1 表示没有获取大小,所有消息都会被使用。将值设为 0 是一个特殊情况,Camel 根本不消耗任何消息。 | -1 | int |
| folderName (使用者(高级) | 要轮询的文件夹。 | INBOX | 字符串 |
| mailUidGenerator (使用者(高级) | 可插拔 MailUidGenerator,允许使用自定义逻辑来生成邮件消息的 UUID。 | MailUidGenerator | |
| mapMailMessage (consumer (advanced)) | 指定 Camel 是否应该将收到的邮件映射到 Camel 正文/headers/attachments。如果设置为 true,邮件正文将映射到 Camel IN 消息的正文,邮件标题将映射到 IN 标头,并附加至 Camel IN attachment 消息。如果此选项设为 false,则 IN 消息将包含原始 javax.mail.Message。您可以通过调用 exchange.getIn ().getBody (javax.mail.Message.class)来检索此原始消息。 | true | 布尔值 |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| postProcessAction (使用者) | 在正常处理结束后,指的是 mailBoxPostProcessAction,用于处理邮箱上的任务。 | MailBoxPostProcessAction | |
| bcc (producer) | 设置 BCC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| CC (生成者) | 设置 CC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| from (producer) | 来自电子邮件地址。 | camel@localhost | 字符串 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| replyTo (producer) | Reply-To 收件人(响应邮件的接收器)。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| 主题 (生成者) | 要发送的消息的 Subject。注:在标头中设置主题优先于这个选项。 | 字符串 | |
| 到 (生成者) | 设置电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| javaMailSender (producer (advanced)) | 要使用自定义 org.apache.camel.component.mail.JavaMailSender 来发送电子邮件。 | JavaMailSender | |
| 其他JavaMailProperties (高级) | 设置其他 java 邮件属性,这将附加/覆盖根据所有其他选项设置的任何默认属性。如果您需要添加一些特殊选项,但希望保留其他选项,这将非常有用。 | Properties | |
| alternativeBodyHeader (advanced) | 指定包含替代电子邮件正文的 IN 消息标头的密钥。例如,如果您以 text/html 格式发送电子邮件,并希望为非HTML 电子邮件客户端提供替代邮件正文,请将这个密钥的替代邮件正文设置为标头。 | CamelMailAlternativeBody | 字符串 |
| attachmentsContentTransferEncodingResolver (advanced) | 要使用自定义 AttachmentsContentTransferEncodingResolver 来解析用于附件的 content-type-encoding。 | AttachmentsContentTransferEncodingResolver | |
| 验证器 (高级) | 用于登录的验证器。如果设置,则忽略密码和用户名。可用于可以过期的令牌,因此必须动态读取。 | MailAuthenticator | |
| 绑定 (高级) | 设置用于从 Camel 消息转换为邮件消息的绑定。 | MailBinding | |
| connectionTimeout (高级) | 连接超时(以毫秒为单位)。 | 30000 | int |
| ContentType (advanced) | 邮件内容类型。将 text/html 用于 HTML 邮件。 | text/plain | 字符串 |
| contentTypeResolver (advanced) | 解析器决定 Content-Type 用于文件附加。 | ContentTypeResolver | |
| debugMode (高级) | 在底层邮件框架上启用调试模式。默认情况下,SUN 邮件框架会将调试消息记录到 System.out。 | false | 布尔值 |
| headerFilterStrategy (高级) | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头。 | HeaderFilterStrategy | |
| ignoreUnsupportedCharset (advanced) | 选项可使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果不支持 charset,则 charset=XXX (其中 XXX 代表不支持的字符集)已从 content-type 中删除,它依赖于平台默认值。 | false | 布尔值 |
| ignoreUriScheme (advanced) | 选项可使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果不支持 charset,则 charset=XXX (其中 XXX 代表不支持的字符集)已从 content-type 中删除,它依赖于平台默认值。 | false | 布尔值 |
| javaMailProperties (高级) | 设置 java 邮件选项。将清除任何默认属性,并且仅使用为此方法提供的属性。 | Properties | |
| 会话 (高级) | 指定 camel 应该用于所有邮件交互的邮件会话。在由某些其他资源(如 JavaEE 容器)创建和管理邮件会话的情形中,可使用。使用自定义邮件会话时,将使用邮件会话的主机名和端口(如果在会话上配置)。 | session | |
| useInlineAttachments (高级) | 是否使用 disposition inline 或 attachment。 | false | 布尔值 |
| idempotentRepository (filter) | 可插拔存储库 org.apache.camel.spi.IdempotentRepository,它允许从同一邮箱使用集群,并让存储库协调邮件是否有效供消费者处理。默认情况下,不使用存储库。 | IdempotentRepository | |
| idempotentRepositoryRemoveOnCommit (filter) | 使用 idempotent 存储库时,当邮件被成功处理并被提交后,消息 ID 会从幂等存储库(默认)中删除,或保存在存储库中。默认情况下,它假定消息 id 是唯一的,并且没有值保留在存储库中,因为邮件将被标记为 seen/moved 或 deleted,以防止再次消耗它。因此,在 idempotent 存储库中存储的消息 id 具有很少的值。但是,这个选项允许您根据任何原因存储消息 id。 | true | 布尔值 |
| searchTerm (filter) | 指的是 javax.mail.search.SearchTerm,它可根据特定日期等搜索条件(如主题、正文等)过滤邮件。 | SearchTerm | |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 60000 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| 密码 (安全) | 登录的密码。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
| sslContextParameters (security) | 使用 SSLContextParameters 配置安全性。 | SSLContextParameters | |
| 用户名 (安全) | 登录的用户名。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
| sortTerm (sort) | 为消息排序顺序。仅原生支持 IMAP。使用 POP3 或 IMAP 服务器没有 SORT 能力时,将模拟为某种程度。 | SortTerm[] |
31.4.3. 端点示例
通常,您可以指定带有登录凭证的 URI (例如,使用 SMTP):
smtp://[username@]host[:port][?password=somepwd]
另外,也可以将用户名和密码指定为查询选项:
smtp://host[:port]?password=somepwd&username=someuser
例如:
smtp://mycompany.mailserver:30?password=tiger&username=scott
31.4.4. 组件别名名称
- IMAP
- IMAPs
- POP3s
- SMTP
- SMTPs
31.4.5. 默认端口
支持默认端口号。如果省略了端口号,Camel 会根据协议决定要使用的端口号。
| 协议 | 默认端口号 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31.5. SSL 支持
底层邮件框架负责提供 SSL 支持。您可以通过完全指定必要的 Java 邮件 API 配置选项来配置 SSL/TLS 支持,或者您可以通过组件或端点配置提供配置的 SSLContextParameters。
31.5.1. 使用 JSSE 配置实用程序
邮件组件通过 Camel JSSE 配置实用程序 支持 SSL/TLS 配置。这个工具可大大减少您需要编写的组件特定代码,并在端点和组件级别进行配置。以下示例演示了如何将 实用程序与邮件组件一起使用。
端点的编程配置
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/truststore.jks");
ksp.setPassword("keystorePassword");
TrustManagersParameters tmp = new TrustManagersParameters();
tmp.setKeyStore(ksp);
SSLContextParameters scp = new SSLContextParameters();
scp.setTrustManagers(tmp);
Registry registry = ...
registry.bind("sslContextParameters", scp);
...
from(...)
.to("smtps://smtp.google.com?username=user@gmail.com&password=password&sslContextParameters=#sslContextParameters");
基于端点的 Spring DSL 配置
...
<camel:sslContextParameters id="sslContextParameters">
<camel:trustManagers>
<camel:keyStore resource="/users/home/server/truststore.jks" password="keystorePassword"/>
</camel:trustManagers>
</camel:sslContextParameters>...
...
<to uri="smtps://smtp.google.com?username=user@gmail.com&password=password&sslContextParameters=#sslContextParameters"/>...
31.5.2. 直接配置 JavaMail
Camel 使用 Jakarta JavaMail,它只信任由已知的证书颁发机构(默认的 JVM 信任配置)发布的证书。如果您发布自己的证书,您必须将 CA 证书导入到 JVM 的 Java 信任/密钥存储文件中,覆盖默认的 JVM 信任/密钥存储文件(请参阅 JavaMail 中的 SSLNOTES.txt )。
31.6. 邮件消息内容
Camel 使用消息交换的 IN 正文作为 MimeMessage 文本内容。正文转换为 String.class。
Camel 将所有交换的 IN 标头复制到 MimeMessage 标头。
MimeMessage 的主题可以使用 IN 消息的 header 属性进行配置。以下代码演示了这一点:
同样的适用于其他 MimeMessage 标头,如接收者,您可以使用类似如下的 header 属性:
当使用 MailProducer 将邮件发送到服务器时,您应该能够从 Camel 邮件标头中获取 MimeMessage 的消息 ID。
31.7. 标头优先于预先配置的接收者
消息标头中指定的接收者始终优先于端点 URI 中预先配置的接收者。理念是,如果您在消息标头中提供任何接收者,这是您得到的。在端点 URI 中预先配置的接收者被视为回退。
在以下示例代码中,电子邮件消息发送到 davsclaus@apache.org,因为它优先于预配置的接收者 info@mycompany.com。端点 URI 中的任何 CC 和 BCC 设置也会被忽略,这些接收者不会接收任何邮件。标头和预配置设置之间的选择是全部或无任何内容:邮件组件从头或仅从预先配置的设置中获取收件人。无法混合和匹配标头和预先配置的设置。
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("to", "davsclaus@apache.org");
template.sendBodyAndHeaders("smtp://admin@localhost?to=info@mycompany.com", "Hello World", headers);31.8. 多个接收者以便更轻松地配置
可以使用逗号或分号分隔的列表来设置多个接收者。这同时适用于标头设置,也适用于端点 URI 中的设置。例如:
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("to", "davsclaus@apache.org ; jstrachan@apache.org ; ningjiang@apache.org");
前面的示例使用分号 ; 作为分隔符字符。
31.9. 设置发件人名称和电子邮件
您可以使用 名称 <email> 来指定接收者,使其包含接收者的名称和电子邮件地址。
例如,您可以在消息中定义以下标头:
Map headers = new HashMap();
map.put("To", "Claus Ibsen <davsclaus@apache.org>");
map.put("From", "James Strachan <jstrachan@apache.org>");
map.put("Subject", "Camel is cool");31.10. javamail API (ex SUN JavaMail)
javamail API 在 hood 下用于消耗和生成邮件。当使用 POP3 或 IMAP 协议时,我们鼓励最终用户参考。注意 POP3 具有比 IMAP 更有限的功能集合。
31.11. Samples
我们从一个简单的路由开始,发送从 JMS 队列接收的消息作为电子邮件。电子邮件帐户是 mymailserver.com 上的 admin 帐户。
from("jms://queue:subscription").to("smtp://admin@mymailserver.com?password=secret");在下一个示例中,我们每分钟轮询一次新电子邮件的邮箱。
from("imap://admin@mymailserver.com?password=secret&unseen=true&delay=60000")
.to("seda://mails");31.12. 使用附加示例发送邮件
所有 Camel 组件都不支持附件
附件 API 基于 Java 激活框架,通常仅由 Mail API 使用。由于很多其他 Camel 组件不支持附件,因此这些附件可能会在路由之间传播时丢失。因此,在向邮件端点发送邮件之前,要添加经验的规则。
邮件组件支持附件。在以下示例中,我们发送包含带有徽标文件附加的纯文本消息的邮件。
31.13. SSL 示例
在本例中,我们想要轮询 Google 邮件中的邮件。要将邮件下载到本地邮件客户端,Google 邮件要求您启用和配置 SSL。这可以通过登录到 Google 邮件帐户并更改您的设置以允许 IMAP 访问来实现。Google 提供了有关如何执行此操作的广泛文档。
from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD"
+ "&delete=false&unseen=true&delay=60000").to("log:newmail");
前面的路由每分钟轮询一次新邮件的 Google mail inbox,并将收到的消息记录到 新的电子邮件 日志记录器类别。
运行启用了 DEBUG 日志记录的示例,我们可以监控日志中的进度:
2008-05-08 06:32:09,640 DEBUG MailConsumer - Connecting to MailStore imaps//imap.gmail.com:993 (SSL enabled), folder=INBOX 2008-05-08 06:32:11,203 DEBUG MailConsumer - Polling mailfolder: imaps//imap.gmail.com:993 (SSL enabled), folder=INBOX 2008-05-08 06:32:11,640 DEBUG MailConsumer - Fetching 1 messages. Total 1 messages. 2008-05-08 06:32:12,171 DEBUG MailConsumer - Processing message: messageNumber=[332], from=[James Bond <007@mi5.co.uk>], to=YOUR_USERNAME@gmail.com], subject=[... 2008-05-08 06:32:12,187 INFO newmail - Exchange[MailMessage: messageNumber=[332], from=[James Bond <007@mi5.co.uk>], to=YOUR_USERNAME@gmail.com], subject=[...
31.14. 使用带有附加示例的邮件
在该示例中,我们轮询邮箱并将邮件中的所有附件存储为文件。首先,我们定义一个路由来轮询邮箱。因为这个示例基于 google 邮件,它使用与 SSL 示例中显示的相同路由:
from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD"
+ "&delete=false&unseen=true&delay=60000").process(new MyMailProcessor());我们使用处理器从 java 代码处理邮件,而不是记录邮件:
public void process(Exchange exchange) throws Exception {
// the API is a bit clunky so we need to loop
AttachmentMessage attachmentMessage = exchange.getMessage(AttachmentMessage.class);
Map<String, DataHandler> attachments = attachmentMessage.getAttachments();
if (attachments.size() > 0) {
for (String name : attachments.keySet()) {
DataHandler dh = attachments.get(name);
// get the file name
String filename = dh.getName();
// get the content and convert it to byte[]
byte[] data = exchange.getContext().getTypeConverter()
.convertTo(byte[].class, dh.getInputStream());
// write the data to a file
FileOutputStream out = new FileOutputStream(filename);
out.write(data);
out.flush();
out.close();
}
}
}
正如您看到处理附件的 API 非常明显,但它有点不错,因此您可以获得 javax.activation.DataHandler,以便您可以使用标准 API 处理附件。
31.15. 如何使用附件分割邮件消息
在本例中,我们使用可能有多个附件的邮件。我们想要做的是每个附件使用 Splitter EIP 来单独处理附件。例如,如果邮件消息有 5 个附件,我们希望 Splitter 处理五个消息,每个消息都有一个附件。为此,我们需要为 Splitter 提供自定义表达式,其中提供了一个 List<Message>,其中包含带有单一附件的五个信息。
该代码在 Camel 2.10 onwards in the camel-mail 组件后提供。代码位于类中: org.apache.camel.component.mail.SplitAttachmentsExpression,您可以在这里 的源代码中找到该代码。
然后,在 Camel 路由中,您需要在路由中使用此 Expression,如下所示:
如果使用 XML DSL,则需要在 Splitter 中声明方法调用表达式,如下所示
<split> <method beanType="org.apache.camel.component.mail.SplitAttachmentsExpression"/> <to uri="mock:split"/> </split>
您还可以将附件分成 byte[],以存储为消息正文。这可以通过创建带有布尔值 true 的表达式来完成
SplitAttachmentsExpression split = SplitAttachmentsExpression(true);
然后使用带分割 EIP 的表达式。
31.16. 使用自定义搜索终端
您可以在 MailEndpoint 上配置 searchTerm,它允许您过滤掉不需要的邮件。
例如,在 Subject 或 Text 中过滤要包含 Camel 的邮件,如下所示:
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subjectOrBody=Camel"/> <to uri="bean:myBean"/> </route>
请注意,我们使用 "searchTerm.subjectOrBody" 作为参数键表示,我们希望在邮件主体或正文上搜索包含单词 "Camel"。
类 org.apache.camel.component.mail.SimpleSearchTerm 具有多个选项,您可以配置:
或者让新的不可预见的电子邮件恢复 24 小时,您可以做。注意"now-24h"语法。详情请查看下表。
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.fromSentDate=now-24h"/> <to uri="bean:myBean"/> </route>
您可以在 endpoint uri 配置中有多个 searchTerm。然后,它们将使用 AND 运算符来合并,例如,这两个条件都必须匹配。例如,要获取最后 24 小时发出的未观察电子邮件,该电子邮件在邮件主题中有 Camel,您可以执行以下操作:
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subject=Camel&searchTerm.fromSentDate=now-24h"/> <to uri="bean:myBean"/> </route>
SimpleSearchTerm 设计为可以从 POJO 中轻松配置,因此您也可以使用 XML 中的 <bean> 样式进行配置
<bean id="mySearchTerm" class="org.apache.camel.component.mail.SimpleSearchTerm"> <property name="subject" value="Order"/> <property name="to" value="acme-order@acme.com"/> <property name="fromSentDate" value="now"/> </bean>
然后,您可以使用 Camel 路由中的 #beanId 引用此 bean,如下所示:
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm=#mySearchTerm"/> <to uri="bean:myBean"/> </route>
在 Java 中,有一个 builder 类可用于使用 org.apache.camel.component.mail.SearchTermBuilder 类来构建复合 SearchTerms。这可让您构建复杂术语,例如:
// we just want the unseen mails which is not spam
SearchTermBuilder builder = new SearchTermBuilder();
builder.unseen().body(Op.not, "Spam").subject(Op.not, "Spam")
// which was sent from either foo or bar
.from("foo@somewhere.com").from(Op.or, "bar@somewhere.com");
// .. and we could continue building the terms
SearchTerm term = builder.build();31.17. 轮询优化
参数 maxMessagePerPoll 和 fetchSize 允许您限制应为每个轮询处理的数字消息。在使用包含大量邮件的文件夹时,这些参数应有助于防止性能不良。在以前的版本中,这些参数的评估太晚,因此大型邮箱仍然可以造成性能问题。使用 Camel 3.1 这些参数之前在轮询过程中评估,以避免这些问题。
31.18. 使用带有其他 Java 邮件发送程序属性的标头
在发送邮件时,您可以从 Exchange 为 JavaMailSender 提供动态 java 邮件属性,作为消息标题,并以 java.smtp 开始的键。
您可以设置 Java 邮件文档中找到的任何 java.smtp 属性。
例如,要在 java.smtp.from (SMTP MAIL 命令)中提供动态 uuid:
.setHeader("from", constant("reply2me@foo.com"));
.setHeader("java.smtp.from", method(UUID.class, "randomUUID"));
.to("smtp://mymailserver:1234");
仅在 不使用 自定义 JavaMailSender 时支持。
31.19. Spring Boot Auto-Configuration
当将 imap 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-mail-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 50 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.mail.additional-java-mail-properties | 设置其他 java 邮件属性,这将附加/覆盖根据所有其他选项设置的任何默认属性。如果您需要添加一些特殊选项,但希望保留其他选项,这将非常有用。选项是一个 java.util.Properties 类型。 | Properties | |
| camel.component.mail.alternative-body-header | 指定包含替代电子邮件正文的 IN 消息标头的密钥。例如,如果您以 text/html 格式发送电子邮件,并希望为非HTML 电子邮件客户端提供替代邮件正文,请将这个密钥的替代邮件正文设置为标头。 | CamelMailAlternativeBody | 字符串 |
| camel.component.mail.attachments-content-transfer-encoding-resolver | 要使用自定义 AttachmentsContentTransferEncodingResolver 来解析用于附件的 content-type-encoding。选项是 org.apache.camel.component.mail.AttachmentsContentTransferEncodingResolver 类型。 | AttachmentsContentTransferEncodingResolver | |
| camel.component.mail.authenticator | 用于登录的验证器。如果设置,则忽略密码和用户名。可用于可以过期的令牌,因此必须动态读取。选项是 org.apache.camel.component.mail.MailAuthenticator 类型。 | MailAuthenticator | |
| camel.component.mail.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.mail.bcc | 设置 BCC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| camel.component.mail.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.mail.cc | 设置 CC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| camel.component.mail.close-folder | 消费者是否应该在轮询后关闭文件夹。将这个选项设置为 false 并在轮询之间保持 disconnect=false,然后消费者保持打开文件夹。 | true | 布尔值 |
| camel.component.mail.configuration | 设置邮件配置。选项是 org.apache.camel.component.mail.MailConfiguration 类型。 | MailConfiguration | |
| camel.component.mail.connection-timeout | 连接超时(以毫秒为单位)。 | 30000 | 整数 |
| camel.component.mail.content-type | 邮件内容类型。将 text/html 用于 HTML 邮件。 | text/plain | 字符串 |
| camel.component.mail.content-type-resolver | 解析器决定 Content-Type 用于文件附加。选项是一个 org.apache.camel.component.mail.ContentTypeResolver 类型。 | ContentTypeResolver | |
| camel.component.mail.copy-to | 处理邮件消息后,可以将其复制到具有给定名称的邮件文件夹。您可以用带有键 copyTo 的标头覆盖此配置值,允许您将消息复制到运行时配置的文件夹名称。 | 字符串 | |
| camel.component.mail.debug-mode | 在底层邮件框架上启用调试模式。默认情况下,SUN 邮件框架会将调试消息记录到 System.out。 | false | 布尔值 |
| camel.component.mail.decode-filename | 如果设置为 true,则 MimeUtility.decodeText 方法将用于解码文件名。这与设置 JVM 系统属性 mail.mime.encodefilename 类似。 | false | 布尔值 |
| camel.component.mail.delete | 在消息被处理后删除它们。这可以通过在邮件消息上设置 DELETED 标志来完成。如果为 false,则设置 SEEN 标志。从 Camel 2.10 开始,您可以通过使用密钥 delete 设置标头来确定是否应删除邮件,来覆盖此配置选项。 | false | 布尔值 |
| camel.component.mail.disconnect | 轮询后消费者是否应断开。如果启用此项,则强制 Camel 在每个轮询上连接。 | false | 布尔值 |
| camel.component.mail.enabled | 是否启用邮件组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.mail.fetch-size | 设置轮询期间要消耗的消息的最大数量。如果邮箱文件夹包含大量消息,这可用于避免加载邮件服务器。默认值 -1 表示没有获取大小,所有消息都会被使用。将值设为 0 是一个特殊情况,Camel 根本不消耗任何消息。 | -1 | 整数 |
| camel.component.mail.folder-name | 要轮询的文件夹。 | INBOX | 字符串 |
| camel.component.mail.from | 来自电子邮件地址。 | camel@localhost | 字符串 |
| camel.component.mail.handle-failed-message | 如果邮件使用者无法检索给定的邮件,则此选项允许处理使用者错误处理程序所导致的异常。通过在消费者上启用网桥错误处理程序,Camel 路由错误处理程序可以处理异常。默认行为是消费者抛出异常,并且来自批处理中的邮件都无法由 Camel 路由。 | false | 布尔值 |
| camel.component.mail.header-filter-strategy | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
| camel.component.mail.ignore-unsupported-charset | 选项可使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果不支持 charset,则 charset=XXX (其中 XXX 代表不支持的字符集)已从 content-type 中删除,它依赖于平台默认值。 | false | 布尔值 |
| camel.component.mail.ignore-uri-scheme | 选项可使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果不支持 charset,则 charset=XXX (其中 XXX 代表不支持的字符集)已从 content-type 中删除,它依赖于平台默认值。 | false | 布尔值 |
| camel.component.mail.java-mail-properties | 设置 java 邮件选项。将清除任何默认属性,并且仅使用为此方法提供的属性。选项是一个 java.util.Properties 类型。 | Properties | |
| camel.component.mail.java-mail-sender | 要使用自定义 org.apache.camel.component.mail.JavaMailSender 来发送电子邮件。选项是 org.apache.camel.component.mail.JavaMailSender 类型。 | JavaMailSender | |
| camel.component.mail.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.mail.map-mail-message | 指定 Camel 是否应该将收到的邮件映射到 Camel 正文/headers/attachments。如果设置为 true,邮件正文将映射到 Camel IN 消息的正文,邮件标题将映射到 IN 标头,并附加至 Camel IN attachment 消息。如果此选项设为 false,则 IN 消息将包含原始 javax.mail.Message。您可以通过调用 exchange.getIn ().getBody (javax.mail.Message.class)来检索此原始消息。 | true | 布尔值 |
| camel.component.mail.mime-decode-headers | 此选项为邮件标头启用透明 MIME 解码和取消折叠。 | false | 布尔值 |
| camel.component.mail.move-to | 处理邮件后,可以将其移动到具有给定名称的邮件文件夹。您可以使用键 moveTo 的标头覆盖此配置值,允许您在运行时将消息移到文件夹名称。 | 字符串 | |
| camel.component.mail.password | 登录的密码。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
| camel.component.mail.peek | 将 javax.mail.Message 标记为 openmpied,然后再处理邮件邮件。这只适用于 IMAPMessage 消息类型。通过使用在邮件服务器上立即标记为 SEEN 的邮件,那么当 Camel 中出现错误处理时,我们就可以回滚邮件消息。 | true | 布尔值 |
| camel.component.mail.reply-to | Reply-To 收件人(响应邮件的接收器)。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| camel.component.mail.session | 指定 camel 应该用于所有邮件交互的邮件会话。在由某些其他资源(如 JavaEE 容器)创建和管理邮件会话的情形中,可使用。使用自定义邮件会话时,将使用邮件会话的主机名和端口(如果在会话上配置)。选项是 javax.mail.Session 类型。 | session | |
| camel.component.mail.skip-failed-message | 如果邮件使用者无法检索给定的邮件,则此选项将允许跳过邮件并移动以检索下一个邮件。默认行为是消费者抛出异常,并且来自批处理中的邮件都无法由 Camel 路由。 | false | 布尔值 |
| camel.component.mail.ssl-context-parameters | 使用 SSLContextParameters 配置安全性。选项是 org.apache.camel.support.jsse.SSLContextParameters 类型。 | SSLContextParameters | |
| camel.component.mail.subject | 要发送的消息的 Subject。注:在标头中设置主题优先于这个选项。 | 字符串 | |
| camel.component.mail.to | 设置电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
| camel.component.mail.unseen | 是否仅受不可预见的邮件的限制。 | true | 布尔值 |
| camel.component.mail.use-global-ssl-context-parameters | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| camel.component.mail.use-inline-attachments | 是否使用 disposition inline 或 attachment。 | false | 布尔值 |
| camel.component.mail.username | 登录的用户名。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
| camel.dataformat.mime-multipart.binary-content | 定义 MIME 多部分中的二进制部分的内容是否为二进制(true)或 Base-64 编码(false)默认为 false。 | false | 布尔值 |
| camel.dataformat.mime-multipart.enabled | 是否启用 mime-multipart 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.mime-multipart.headers-inline | 定义 MIME-Multipart 标头是否为消息正文(true)的一部分,或者设置为 Camel 标头(false)。默认为 false。 | false | 布尔值 |
| camel.dataformat.mime-multipart.include-headers | 定义哪些 Camel 标头的正则表达式也作为 MIME 标头包含在 MIME 多部分。这只有在 headerInline 设为 true 时才可以正常工作。默认为不包含标头。 | 字符串 | |
| camel.dataformat.mime-multipart.multipart-sub-type | 指定 MIME 多部分的子类型。默认为 mixed。 | mixed | 字符串 |
| camel.dataformat.mime-multipart.multipart-without-attachment | 定义没有附件的消息是否也被放入 MIME 多部分(只有一个正文部分)。默认为 false。 | false | 布尔值 |
第 32 章 Master
仅支持消费者
Camel-Master 端点提供了一种方式,可以确保集群中只有一个消费者从给定端点消耗;如果该 JVM 死机,则自动故障转移。
如果您需要从一些传统后端(不支持并发使用)或由于商业或稳定性原因,在任何时间点上只能有一个连接,这将非常有用。
32.1. 使用 master 端点
只是使用 master:someName: 前缀任何 camel 端点:其中 someName 是逻辑名称,用于获取主锁定。例如。
from("master:cheese:jms:foo").to("activemq:wine");
在本例中,master 组件确保路由在任何给定时间只在一个节点中活跃。因此,如果集群中有 8 个节点,则 master 组件将选择一个路由作为领导,并且只有此路由处于活动状态,因此只有此路由将消耗来自 jms:foo 的消息。如果此路由停止或意外终止,则 master 组件将检测到它,并再次激活另一个节点,这样将变为 active,并从 jms:foo 开始使用消息。
Apache ActiveMQ 5.x 具有这样的功能,称为 Exclusive Consumers。
32.2. URI 格式
master:namespace:endpoint[?options]
其中 endpoint 是您要以 master/slave 模式运行的任何 Camel 端点。
32.3. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
32.3.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
32.3.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
32.4. 组件选项
Master 组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 服务 (高级) | 注入要使用的服务。 | CamelClusterService | |
| serviceSelector (advanced) | 注入用于查找要使用的 CamelClusterService 的服务选择器。 | 选择器 |
32.5. 端点选项
Master 端点是使用 URI 语法配置的:
master:namespace:delegateUri
使用以下路径和查询参数:
32.5.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 命名空间 (使用者) | 需要使用的集群命名空间的名称。 | 字符串 | |
| delegateUri (consumer) | 必需 在主/从模式中使用的 endpoint uri。 | 字符串 |
32.5.2. 查询参数(3 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern |
32.6. 示例
您可以保护集群 Camel 应用程序,使其只消耗一个活跃的节点的文件。
// the file endpoint we want to consume from
String url = "file:target/inbox?delete=true";
// use the camel master component in the clustered group named myGroup
// to run a master/slave mode in the following Camel url
from("master:myGroup:" + url)
.log(name + " - Received file: ${file:name}")
.delay(delay)
.log(name + " - Done file: ${file:name}")
.to("file:target/outbox");master 组件利用您可以使用的 CamelClusterService 配置
Java
ZooKeeperClusterService service = new ZooKeeperClusterService(); service.setId("camel-node-1"); service.setNodes("myzk:2181"); service.setBasePath("/camel/cluster"); context.addService(service)XML (Spring/Blueprint)
<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"> <bean id="cluster" class="org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService"> <property name="id" value="camel-node-1"/> <property name="basePath" value="/camel/cluster"/> <property name="nodes" value="myzk:2181"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring" autoStartup="false"> ... </camelContext> </beans>Spring boot
camel.component.zookeeper.cluster.service.enabled = true camel.component.zookeeper.cluster.service.id = camel-node-1 camel.component.zookeeper.cluster.service.base-path = /camel/cluster camel.component.zookeeper.cluster.service.nodes = myzk:2181
32.7. 实现
Camel 提供以下 ClusterService 实现:
- camel-consul
- Camel-file
- camel-infinispan
- camel-jgroups-raft
- camel-jgroups
- camel-kubernetes
- camel-zookeeper
32.8. Spring Boot Auto-Configuration
当将 master 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-master-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 5 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.master.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.master.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.master.enabled | 是否启用 master 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.master.service | 注入要使用的服务。选项是一个 org.apache.camel.cluster.CamelClusterService 类型。 | CamelClusterService | |
| camel.component.master.service-selector | 注入用于查找要使用的 CamelClusterService 的服务选择器。选项是一个 org.apache.camel.cluster.CamelClusterService.Selector 类型。 | CamelClusterService$Selector |
第 33 章 MLLP
支持制作者和使用者
MLLP 组件专门用于处理 MLLP 协议的细微功能,并提供 Healthcare 提供程序使用 MLLP 协议与其他系统通信所需的功能。
MLLP 组件提供简单的配置 URI,自动化 HL7 确认生成和自动确认。
MLLP 协议通常不使用大量并发 TCP 连接,一个活跃的 TCP 连接是正常情况。因此,MLLP 组件使用基于标准 Java 套接字的简单 thread-per-connection 模型。这样可以保持实施简单,并消除了对仅 Camel 本身的依赖项。
组件支持以下内容:
- 使用 TCP 服务器的 Camel 使用者
- 使用 TCP 客户端的 Camel 制作者
MLLP 组件使用 byte[] 有效负载,并依赖于 Camel 类型转换,将 byte[] 转换为其他类型。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mllp</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>33.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
33.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
33.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
33.2. 组件选项
MLLP 组件支持 30 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| autoAck (common) | 启用/禁用 MLLP Acknowledgement MLLP Consumers 的自动生成。 | true | 布尔值 |
| charsetName (common) | 设置要使用的默认 charset。 | 字符串 | |
| 配置 (common) | 设置创建 MLLP 端点时要使用的默认配置。 | MllpConfiguration | |
| hl7Headers (common) | 只在 HL7 Message MLLP Consumers 中启用/禁用自动生成消息标头。 | true | 布尔值 |
| requireEndOfData (common) | 启用/禁用对 MLLP 标准的严格合规性。MLLP 标准指定 START_OF_BLOCKhl7 有效负载END_OF_BLOCKEND_OF_DATA,但有些系统不会发送最终的 END_OF_DATA 字节。此设置控制是否需要最终的 END_OF_DATA 字节。 | true | 布尔值 |
| stringPayload (common) | 启用/禁用将有效负载转换为字符串。如果启用,则从外部系统接收的 HL7 Payloads 将验证转换为字符串。如果设置了 charsetName 属性,则该字符集将用于转换。如果没有设置 charsetName 属性,则将使用 MSH-18 的值来确定第三字符集。如果没有设置 MSH-18,则会使用默认的 ISO-8859-1 字符集。 | true | 布尔值 |
| validatePayload (common) | 启用/禁用 HL7 Payloads 验证如果启用,则从外部系统接收的 HL7 Payloads 会被验证(请参阅 Hl7Util.generateInvalidPayloadExceptionMessage)。如果检测到无效的有效负载,则会抛出 MllpInvalidMessageException (使用者)或 MllpInvalidAcknowledgementException。 | false | 布尔值 |
| acceptTimeout (consumer) | 在等待 TCP 连接 TCP 服务器时,超时(以毫秒为单位)。 | 60000 | int |
| 积压 (consumer) | 传入连接的最大队列长度(要连接的请求)设置为 backlog 参数。如果队列满时显示连接到达,则连接将被拒绝。 | 5 | 整数 |
| bindRetryInterval (consumer) | 仅限 TCP 服务器 - 绑定尝试之间要等待的毫秒数。 | 5000 | int |
| bindTimeout (consumer) | 仅限 TCP 服务器 - 重试到服务器端口的毫秒数。 | 30000 | int |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着消费者试图接收传入的消息或类似信息时发生任何异常,现在将作为消息处理并由路由 Error 处理程序处理。如果禁用,使用者将使用 org.apache.camel.spi.ExceptionHandler 来通过记录在 WARN 或 ERROR 级别时处理异常,并忽略。 | true | 布尔值 |
| lenientBind (消费者) | TCP Server Only - 允许端点在绑定 TCP ServerSocket 之前启动。在某些环境中,可能需要允许端点在绑定 TCP ServerSocket 之前启动。 | false | 布尔值 |
| maxConcurrentConsumers (consumer) | 允许的最大并发 MLLP Consumer 连接数。如果收到一个新的连接,并且已建立最大值,则新连接将立即重置。 | 5 | int |
| reuseAddress (consumer) | 启用/禁用 SO_REUSEADDR 套接字选项。 | false | 布尔值 |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| InOut | ExchangePattern |
| connectTimeout (producer) | 仅为 TCP 连接 TCP 客户端建立的超时(以毫秒为单位)。 | 30000 | int |
| idleTimeoutStrategy (producer) | 决定在空闲超时时要执行的操作。可能的值有 : RESET:将 SO_LINGER 设置为 0,并重置套接字 CLOSE: 关闭套接字正常默认值为 RESET。 Enum 值:
| RESET | MllpIdleTimeoutStrategy |
| keepalive ( producer) | 启用/禁用 SO_KEEPALIVE 套接字选项。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| tcpNoDelay (producer) | 启用/禁用 TCP_NODELAY 套接字选项。 | true | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 默认Charset (高级) | 将默认字符设置为用于字节为/从 String 转换。 | ISO-8859-1 | 字符串 |
| logPhi (高级) | 是否记录 PHI。 | true | 布尔值 |
| logPhiMaxBytes (高级) | 设置将登录到日志条目的最大 PHI 字节数。 | 5120 | 整数 |
| readTimeout (高级) | 收到 MLLP 帧后使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 5000 | int |
| receiveBufferSize (advanced) | 将 SO_RCVBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
| receiveTimeout (高级) | 等待 MLLP 帧开始时使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 15000 | int |
| sendBufferSize (advanced) | 将 SO_SNDBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
| idleTimeout (tcp) | 在重置客户端 TCP 连接之前允许的大约闲置时间。小于或等于零的 null 值或值将禁用空闲超时。 | 整数 |
33.3. 端点选项
MLLP 端点使用 URI 语法进行配置:
mllp:hostname:port
使用以下路径和查询参数:
33.3.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 主机名 (common) | TCP 连接的连接所需的主机名或 IP。默认值为 null,这意味着任何本地 IP 地址。 | 字符串 | |
| 端口 (common) | TCP 连接 所需的 端口号。 | int |
33.3.2. 查询参数(26 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| autoAck (common) | 启用/禁用 MLLP Acknowledgement MLLP Consumers 的自动生成。 | true | 布尔值 |
| charsetName (common) | 设置要使用的默认 charset。 | 字符串 | |
| hl7Headers (common) | 只在 HL7 Message MLLP Consumers 中启用/禁用自动生成消息标头。 | true | 布尔值 |
| requireEndOfData (common) | 启用/禁用对 MLLP 标准的严格合规性。MLLP 标准指定 START_OF_BLOCKhl7 有效负载END_OF_BLOCKEND_OF_DATA,但有些系统不会发送最终的 END_OF_DATA 字节。此设置控制是否需要最终的 END_OF_DATA 字节。 | true | 布尔值 |
| stringPayload (common) | 启用/禁用将有效负载转换为字符串。如果启用,则从外部系统接收的 HL7 Payloads 将验证转换为字符串。如果设置了 charsetName 属性,则该字符集将用于转换。如果没有设置 charsetName 属性,则将使用 MSH-18 的值来确定第三字符集。如果没有设置 MSH-18,则会使用默认的 ISO-8859-1 字符集。 | true | 布尔值 |
| validatePayload (common) | 启用/禁用 HL7 Payloads 验证如果启用,则从外部系统接收的 HL7 Payloads 会被验证(请参阅 Hl7Util.generateInvalidPayloadExceptionMessage)。如果检测到无效的有效负载,则会抛出 MllpInvalidMessageException (使用者)或 MllpInvalidAcknowledgementException。 | false | 布尔值 |
| acceptTimeout (consumer) | 在等待 TCP 连接 TCP 服务器时,超时(以毫秒为单位)。 | 60000 | int |
| 积压 (consumer) | 传入连接的最大队列长度(要连接的请求)设置为 backlog 参数。如果队列满时显示连接到达,则连接将被拒绝。 | 5 | 整数 |
| bindRetryInterval (consumer) | 仅限 TCP 服务器 - 绑定尝试之间要等待的毫秒数。 | 5000 | int |
| bindTimeout (consumer) | 仅限 TCP 服务器 - 重试到服务器端口的毫秒数。 | 30000 | int |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着消费者试图接收传入的消息或类似信息时发生任何异常,现在将作为消息处理并由路由 Error 处理程序处理。如果禁用,使用者将使用 org.apache.camel.spi.ExceptionHandler 来通过记录在 WARN 或 ERROR 级别时处理异常,并忽略。 | true | 布尔值 |
| lenientBind (消费者) | TCP Server Only - 允许端点在绑定 TCP ServerSocket 之前启动。在某些环境中,可能需要允许端点在绑定 TCP ServerSocket 之前启动。 | false | 布尔值 |
| maxConcurrentConsumers (consumer) | 允许的最大并发 MLLP Consumer 连接数。如果收到一个新的连接,并且已建立最大值,则新连接将立即重置。 | 5 | int |
| reuseAddress (consumer) | 启用/禁用 SO_REUSEADDR 套接字选项。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| InOut | ExchangePattern |
| connectTimeout (producer) | 仅为 TCP 连接 TCP 客户端建立的超时(以毫秒为单位)。 | 30000 | int |
| idleTimeoutStrategy (producer) | 决定在空闲超时时要执行的操作。可能的值有 : RESET:将 SO_LINGER 设置为 0,并重置套接字 CLOSE: 关闭套接字正常默认值为 RESET。 Enum 值:
| RESET | MllpIdleTimeoutStrategy |
| keepalive ( producer) | 启用/禁用 SO_KEEPALIVE 套接字选项。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| tcpNoDelay (producer) | 启用/禁用 TCP_NODELAY 套接字选项。 | true | 布尔值 |
| readTimeout (高级) | 收到 MLLP 帧后使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 5000 | int |
| receiveBufferSize (advanced) | 将 SO_RCVBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
| receiveTimeout (高级) | 等待 MLLP 帧开始时使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 15000 | int |
| sendBufferSize (advanced) | 将 SO_SNDBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
| idleTimeout (tcp) | 在重置客户端 TCP 连接之前允许的大约闲置时间。小于或等于零的 null 值或值将禁用空闲超时。 | 整数 |
33.4. MLLP Consumer
MLLP Consumer 支持接收 MLLP-framed 消息并发送 HL7 Acknowledgements。MLLP Consumer 可以自动生成 HL7 Acknowledgement (HL7 Application Acknowledgements - AA, AE 和 AR),也可以使用 CamelMllpAcknowledge Exchange 属性指定确认。此外,可通过设置 CamelMllpAcknowledgementType Exchange 属性来控制将生成的确认类型。如果自动确认是禁用并且交换模式为 InOnly,则 MLLP Consumer 可以读取消息而不发送任何 HL7 Acknowledgement。
33.4.1. 消息标头
MLLP Consumer 在 Camel 信息上添加了这些标头:
| 键 | 描述 |
| CamelMllpLocalAddress | 套接字的本地 TCP 地址 |
| CamelMllpRemoteAddress | 套接字的本地 TCP 地址 |
| CamelMllpSendingApplication | MSH-3 值 |
| CamelMllpSendingFacility | MSH-4 值 |
| CamelMllpReceivingApplication | MSH-5 值 |
| CamelMllpReceivingFacility | MSH-6 值 |
| CamelMllpTimestamp | MSH-7 值 |
| CamelMllpSecurity | MSH-8 值 |
| CamelMllpMessageType | MSH-9 值 |
| CamelMllpEventType | MSH-9-1 值 |
| CamelMllpTriggerEvent | MSH-9-2 值 |
| CamelMllpMessageControlId | MSH-10 值 |
| CamelMllpProcessingId | MSH-11 值 |
| CamelMllpVersionId | MSH-12 value |
| CamelMllpCharset | MSH-18 value |
所有标头都是字符串类型。如果缺少标头值,则其值为 null。
33.4.2. Exchange 属性
MLLP Consumer 生成和状态的 MLLP 消费者类型可由 Camel 交换上的这些属性控制:
| 键 | 类型 | 描述 |
|---|---|---|
| CamelMllpAcknowledgement | byte[] | 如果存在,此属性将作为 MLLP Acknowledgement 发送到客户端 |
| CamelMllpAcknowledgementString | 字符串 | 如果现在和 CamelMllpAcknowledgement 不存在,此属性将作为 MLLP Acknowledgement 发送到客户端 |
| CamelMllpAcknowledgementMsaText | 字符串 | 如果没有 CamelMllpAcknowledgement 或 CamelMllpAcknowledgementString,且 autoAck 为 true,则此属性可用于在生成的 HL7 确认中指定 MSA-3 的内容 |
| CamelMllpAcknowledgementType | 字符串 | 如果没有 CamelMllpAcknowledgement 或 CamelMllpAcknowledgementString,且 autoAck 为 true,则此属性可用于指定 HL7 确认类型(如 AA、AE、AR) |
| CamelMllpAutoAcknowledge | 布尔值 | 覆盖 autoAck 查询参数 |
| CamelMllpCloseConnectionBeforeSend | 布尔值 | 如果为 true,则套接字将在发送数据前关闭 |
| CamelMllpResetConnectionBeforeSend | 布尔值 | 如果为 true,则会在发送数据前重置套接字 |
| CamelMllpCloseConnectionAfterSend | 布尔值 | 如果为 true,则发送数据后套接字会立即关闭 |
| CamelMllpResetConnectionAfterSend | 布尔值 | 如果为 true,则发送任何数据后,套接字将立即重置 |
33.5. MLLP Producer
MLLP Producer 支持发送 MLLP-framed 消息并接收 HL7 Acknowledgements。MLLP Producer betweenrogates HL7 Acknowledgments 在收到负确认时引发异常。收到的确认是 Interrogated,如果出现负确认,会引发异常。在配置了 InOnly exchange 模式时,MLLP Producer 可以忽略确认。
33.5.1. 消息标头
MLLP Producer 在 Camel 消息中添加以下标头:
| 键 | 描述 |
|---|---|
| CamelMllpLocalAddress | 套接字的本地 TCP 地址 |
| CamelMllpRemoteAddress | 套接字的远程 TCP 地址 |
| CamelMllpAcknowledgement | HL7 Acknowledgment byte[] 收到 |
| CamelMllpAcknowledgementString | 收到 HL7 Acknowledgment,转换为字符串 |
33.5.2. Exchange 属性
TCP 套接字的状态可由 Camel 交换中的这些属性控制:
| 键 | 类型 | 描述 |
|---|---|---|
| CamelMllpCloseConnectionBeforeSend | 布尔值 | 如果为 true,则套接字将在发送数据前关闭 |
| CamelMllpResetConnectionBeforeSend | 布尔值 | 如果为 true,则会在发送数据前重置套接字 |
| CamelMllpCloseConnectionAfterSend | 布尔值 | 如果为 true,则发送数据后套接字会立即关闭 |
| CamelMllpResetConnectionAfterSend | 布尔值 | 如果为 true,则发送任何数据后,套接字将立即重置 |
33.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 mllp 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-mllp-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 31 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.mllp.accept-timeout | 在等待 TCP 连接 TCP 服务器时,超时(以毫秒为单位)。 | 60000 | 整数 |
| camel.component.mllp.auto-ack | 启用/禁用 MLLP Acknowledgement MLLP Consumers 的自动生成。 | true | 布尔值 |
| camel.component.mllp.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.mllp.backlog | 传入连接的最大队列长度(要连接的请求)设置为 backlog 参数。如果队列满时显示连接到达,则连接将被拒绝。 | 5 | 整数 |
| camel.component.mllp.bind-retry-interval | 仅限 TCP 服务器 - 绑定尝试之间要等待的毫秒数。 | 5000 | 整数 |
| camel.component.mllp.bind-timeout | 仅限 TCP 服务器 - 重试到服务器端口的毫秒数。 | 30000 | 整数 |
| camel.component.mllp.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着消费者试图接收传入的消息或类似信息时发生任何异常,现在将作为消息处理并由路由 Error 处理程序处理。如果禁用,使用者将使用 org.apache.camel.spi.ExceptionHandler 来通过记录在 WARN 或 ERROR 级别时处理异常,并忽略。 | true | 布尔值 |
| camel.component.mllp.charset-name | 设置要使用的默认 charset。 | 字符串 | |
| camel.component.mllp.configuration | 设置创建 MLLP 端点时要使用的默认配置。选项是 org.apache.camel.component.mllp.MllpConfiguration 类型。 | MllpConfiguration | |
| camel.component.mllp.connect-timeout | 仅为 TCP 连接 TCP 客户端建立的超时(以毫秒为单位)。 | 30000 | 整数 |
| camel.component.mllp.default-charset | 将默认字符设置为用于字节为/从 String 转换。 | ISO-8859-1 | 字符串 |
| camel.component.mllp.enabled | 是否启用 mllp 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.mllp.exchange-pattern | 在消费者创建交换时设置交换模式。 | ExchangePattern | |
| camel.component.mllp.hl7-headers | 只在 HL7 Message MLLP Consumers 中启用/禁用自动生成消息标头。 | true | 布尔值 |
| camel.component.mllp.idle-timeout | 在重置客户端 TCP 连接之前允许的大约闲置时间。小于或等于零的 null 值或值将禁用空闲超时。 | 整数 | |
| camel.component.mllp.idle-timeout-strategy | 决定在空闲超时时要执行的操作。可能的值有 : RESET:将 SO_LINGER 设置为 0,并重置套接字 CLOSE: 关闭套接字正常默认值为 RESET。 | MllpIdleTimeoutStrategy | |
| camel.component.mllp.keep-alive | 启用/禁用 SO_KEEPALIVE 套接字选项。 | true | 布尔值 |
| camel.component.mllp.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.mllp.lenient-bind | TCP Server Only - 允许端点在绑定 TCP ServerSocket 之前启动。在某些环境中,可能需要允许端点在绑定 TCP ServerSocket 之前启动。 | false | 布尔值 |
| camel.component.mllp.log-phi | 是否记录 PHI。 | true | 布尔值 |
| camel.component.mllp.log-phi-max-bytes | 设置将登录到日志条目的最大 PHI 字节数。 | 5120 | 整数 |
| camel.component.mllp.max-concurrent-consumers | 允许的最大并发 MLLP Consumer 连接数。如果收到一个新的连接,并且已建立最大值,则新连接将立即重置。 | 5 | 整数 |
| camel.component.mllp.read-timeout | 收到 MLLP 帧后使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 5000 | 整数 |
| camel.component.mllp.receive-buffer-size | 将 SO_RCVBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
| camel.component.mllp.receive-timeout | 等待 MLLP 帧开始时使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 15000 | 整数 |
| camel.component.mllp.require-end-of-data | 启用/禁用对 MLLP 标准的严格合规性。MLLP 标准指定 START_OF_BLOCKhl7 有效负载END_OF_BLOCKEND_OF_DATA,但有些系统不会发送最终的 END_OF_DATA 字节。此设置控制是否需要最终的 END_OF_DATA 字节。 | true | 布尔值 |
| camel.component.mllp.reuse-address | 启用/禁用 SO_REUSEADDR 套接字选项。 | false | 布尔值 |
| camel.component.mllp.send-buffer-size | 将 SO_SNDBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
| camel.component.mllp.string-payload | 启用/禁用将有效负载转换为字符串。如果启用,则从外部系统接收的 HL7 Payloads 将验证转换为字符串。如果设置了 charsetName 属性,则该字符集将用于转换。如果没有设置 charsetName 属性,则将使用 MSH-18 的值来确定第三字符集。如果没有设置 MSH-18,则会使用默认的 ISO-8859-1 字符集。 | true | 布尔值 |
| camel.component.mllp.tcp-no-delay | 启用/禁用 TCP_NODELAY 套接字选项。 | true | 布尔值 |
| camel.component.mllp.validate-payload | 启用/禁用 HL7 Payloads 验证如果启用,则从外部系统接收的 HL7 Payloads 会被验证(请参阅 Hl7Util.generateInvalidPayloadExceptionMessage)。如果检测到无效的有效负载,则会抛出 MllpInvalidMessageException (使用者)或 MllpInvalidAcknowledgementException。 | false | 布尔值 |
第 34 章 Mock
仅支持制作者
测试分布式和异步处理非常困难。Mock、Test 和 Dataset 端点与 Camel 测试框架配合使用,以简化您的单元和集成测试,结合使用 企业集成模式 和 Camel 的大型组件与强大的 Bean 集成。
Mock 组件提供了一个强大的声明性测试机制,它类似于 jMock,它允许在测试开始前在任何 Mock 端点上创建声明预期。然后,测试会运行,它通常会向一个或多个端点触发消息,最后,在测试案例中可以符合预期预期,以确保系统按预期工作。
这可让您测试各种内容,例如:
模拟端点会无限期保留收到的 Exchange。
请记住,Mock 是专为测试而设计的。当您将 Mock 端点添加到路由时,发送到端点的每个交换都将在内存中存储(以允许以后验证),直到显式重置或 JVM 重新启动。如果您发送大量卷和/或大信息,这可能会导致过量内存使用。如果您的目标是测试内联可部署路由,请考虑在测试中使用 NotifyBuilder 或 AdviceWith,而不是将 Mock 端点添加到路由。有两个新选项保留First,并且 keepLast 可用于限制 Mock 端点在内存中保留的消息数量。
34.1. URI 格式
mock:someName[?options]
其中 someName 可以是唯一标识端点的任何字符串。
34.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
34.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
34.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
34.3. 组件选项
Mock 组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 日志 (生成器) | 当模拟收到传入消息时打开日志记录。这将仅在 INFO 级别记录传入消息的时间。如需更详细的日志记录,请将 org.apache.camel.component.mock.MockEndpoint 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| ExchangeFormatter (高级) | Autowired set a custom ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认使用 DefaultExchangeFormatter。 | ExchangeFormatter |
34.4. 端点选项
Mock 端点是使用 URI 语法配置的:
mock:name
使用以下路径和查询参数:
34.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| Name (producer) | 所需 模拟端点的名称。 | 字符串 |
34.4.2. 查询参数(12 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| assertPeriod (producer) | 设置一个宽限期,之后模拟端点将重新排序,以确保初始断言仍有效。例如,这用于对正好有多个消息到达的模拟。例如,如果 expectedMessageCount (int)被设置为 5,则在 5 个或更多消息到达时满足断言。为确保完全有 5 个消息到达,您需要等待一些 period 以确保进一步的消息到达。这就是您可以使用此方法。默认情况下禁用此周期。 | long | |
| expectedCount (producer) | 指定此端点应接收的预期消息交换数量。注意:如果您希望有 0 个消息,请额外小心,因为测试启动时为 0 匹配,因此您需要设置一个断言期限时间,以便让测试运行一段时间,以确保仍没有消息到达;对于该使用 setAssertPeriod (长)。另一种方法是使用 NotifyBuilder,并在您调用模拟上的 assertIsSatisfied ()方法前,了解 Camel 何时进行路由。这可让您不要使用固定断言周期来加快测试时间。如果您希望使第 n 个消息到达这个模拟端点,请参阅 setAssertPeriod (long)方法以了解更多详情。 | -1 | int |
| FAILfast (producer) | 设置 assertIsSatisfied ()应该在第一次检测到的失败时快速失败,否则可能会等待所有预期消息到达,然后执行预期验证。默认为 true。设置为 false 以使用 Camel 2.x 中的行为。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 日志 (生成器) | 当模拟收到传入消息时打开日志记录。这将仅在 INFO 级别记录传入消息的时间。如需更详细的日志记录,请将 org.apache.camel.component.mock.MockEndpoint 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
| reportGroup (producer) | 一个数字,用于根据大小的组打开吞吐量日志记录。 | int | |
| resultMinimumWaitTime (producer) | 设置 assertIsSatisfied ()的最小预期时间(在 millis 中)将等待到满足为止。 | long | |
| resultWaitTime (producer) | 设置 assertIsSatisfied ()的最长时间(在 millis 中)将等待到满足为止。 | long | |
| 保留First (producer) | 指定只保留前 n 个接收交换数。这在测试大数据时使用,通过不存储此模拟端点接收的每个 Exchange 的副本来减少内存消耗。重要:使用此限制时,getReceivedCounter ()仍会返回收到的实际收到的交换数。例如,如果我们收到 5000 Exchanges,并且已配置为只保留前 10 个交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()和 getReceivedExchanges ()方法中只有前 10 Exchanges。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到的第一个正文数量上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个收到的第一个和最后一个方法。 | -1 | int |
| retainLast (producer) | 指定只保留最后 n 个接收交换数。这在测试大数据时使用,通过不存储此模拟端点接收的每个 Exchange 的副本来减少内存消耗。重要:使用此限制时,getReceivedCounter ()仍会返回收到的实际收到的交换数。例如,如果我们收到 5000 Exchanges,并且已配置为仅保留最后 20 交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()和 getReceivedExchanges ()方法中只有最后 20 Exchanges。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到的第一个正文数量上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个收到的第一个和最后一个方法。 | -1 | int |
| sleepForEmptyTest (producer) | 当 expectedMessageCount (int)被调用为零时,允许一个 sleep 指定等待检查此端点是否为空。 | long | |
| copyOnExchange (producer (advanced)) | 设置在此模拟端点接收时是否生成传入 Exchange 的深度副本。默认为 true。 | true | 布尔值 |
34.5. 简单示例
以下是使用 Mock 端点的简单示例:首先,端点在上下文中解析。然后,我们设置了预期,然后在测试运行后,我们就符合我们的预期:
MockEndpoint resultEndpoint = context.getEndpoint("mock:foo", MockEndpoint.class);
// set expectations
resultEndpoint.expectedMessageCount(2);
// send some messages
// now lets assert that the mock:foo endpoint received 2 messages
resultEndpoint.assertIsSatisfied();您通常会调用方法测试在运行测试后是否达到预期。
当被调用 assertIsSatisfied () 时,Camel 默认等待 10 秒。这可以通过设置 setResultWaitTime (millis) 方法来配置。
34.6. 使用 assertPeriod
当断言满意时,Camel 将停止等待,并从 assertIsSatisfied 方法继续。这意味着,如果新消息到达模拟端点,稍后只是稍等,则 arrival 不会影响断言的结果。假设您想要测试之后没有新消息到达,那么您可以通过设置 setAssertPeriod 方法来实现,例如:
MockEndpoint resultEndpoint = context.getEndpoint("mock:foo", MockEndpoint.class);
resultEndpoint.setAssertPeriod(5000);
resultEndpoint.expectedMessageCount(2);
// send some messages
// now lets assert that the mock:foo endpoint received 2 messages
resultEndpoint.assertIsSatisfied();34.7. 设置预期
您可以从 MockEndpoint 的 Javadoc 中看到,您可以使用它设置预期。主要方法如下:
| 方法 | 描述 |
|---|---|
| 在端点上定义预期的消息计数。 | |
| 在端点上定义所需信息的最小数量。 | |
| 定义应收到的预期正文(按顺序)。 | |
| 定义应收到的预期标头 | |
| 要添加预期消息按顺序接收,请使用给定的表达式来比较消息。 | |
| 要添加预期消息按顺序接收,请使用给定的表达式来比较消息。 | |
|
要添加预期不会收到重复的消息;使用 Expression 来计算每个消息的唯一标识符。如果使用 JMS,或者消息中的某些唯一参考号,这可能与 |
以下是另一个示例:
resultEndpoint.expectedBodiesReceived("firstMessageBody", "secondMessageBody", "thirdMessageBody");34.8. 为特定消息添加预期
另外,您可以使用 message (int messageIndex) 方法添加有关收到的特定消息的断言。
例如,要添加第一个消息的标头或正文的期望(使用基于零的索引,如 java.util.List),您可以使用以下代码:
resultEndpoint.message(0).header("foo").isEqualTo("bar");
在 camel-core 处理器测试 中使用 Mock 端点的一些示例。
34.9. 模拟现有端点
Camel 现在允许您自动模拟 Camel 路由中的现有端点。
它的工作原理
端点仍在操作中。不同的情况是,Mock 端点被先注入并接收消息,然后将消息委派给目标端点。您可以将它视为一种拦截器和委派或端点监听程序。
假设您有以下给定路由:
Route(路由)
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").routeId("start")
.to("direct:foo").to("log:foo").to("mock:result");
from("direct:foo").routeId("foo")
.transform(constant("Bye World"));
}
};
}
然后,您可以使用 Camel 中的 recommendations With 功能模拟单元测试中给定路由中的所有端点,如下所示:
使用 建议进行所有端点
@Test
public void testAdvisedMockEndpoints() throws Exception {
// advice the start route using the inlined AdviceWith lambda style route builder
// which has extended capabilities than the regular route builder
AdviceWith.adviceWith(context, "start", a ->
// mock all endpoints
a.mockEndpoints());
getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:direct:foo").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World");
getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
// additional test to ensure correct endpoints in registry
assertNotNull(context.hasEndpoint("direct:start"));
assertNotNull(context.hasEndpoint("direct:foo"));
assertNotNull(context.hasEndpoint("log:foo"));
assertNotNull(context.hasEndpoint("mock:result"));
// all the endpoints was mocked
assertNotNull(context.hasEndpoint("mock:direct:start"));
assertNotNull(context.hasEndpoint("mock:direct:foo"));
assertNotNull(context.hasEndpoint("mock:log:foo"));
}
请注意,模拟端点被授予 URI mock:<endpoint>,如 mock:direct:foo。在 INFO 级别对被模拟的端点进行 Camel 日志:
INFO Adviced endpoint [direct://foo] with mock endpoint [mock:direct:foo]
模拟的端点没有参数
端点,这些端点会被模拟,其参数会剥离。例如,端点 log:foo?showAll=true 将被模拟到以下端点 mock:log:foo。请注意,删除了这些参数。
它还只能使用模式模拟某些端点。例如,模拟 您执行 的所有日志端点,如下所示:
建议 只使用一个模式模拟日志端点
@Test
public void testAdvisedMockEndpointsWithPattern() throws Exception {
// advice the start route using the inlined AdviceWith lambda style route builder
// which has extended capabilities than the regular route builder
AdviceWith.adviceWith(context, "start", a ->
// mock only log endpoints
a.mockEndpoints("log*"));
// now we can refer to log:foo as a mock and set our expectations
getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World");
getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
// additional test to ensure correct endpoints in registry
assertNotNull(context.hasEndpoint("direct:start"));
assertNotNull(context.hasEndpoint("direct:foo"));
assertNotNull(context.hasEndpoint("log:foo"));
assertNotNull(context.hasEndpoint("mock:result"));
// only the log:foo endpoint was mocked
assertNotNull(context.hasEndpoint("mock:log:foo"));
assertNull(context.hasEndpoint("mock:direct:start"));
assertNull(context.hasEndpoint("mock:direct:foo"));
}支持的模式可以是通配符或正则表达式。请参阅 Intercept 将其与 Camel 使用的匹配功能相同的匹配功能的更多详情。
请记住,模拟端点会在消息到达模拟时复制消息。
这意味着 Camel 将使用更多内存。当您发送许多消息时,这可能不适用。
34.10. 使用 camel-test 组件模拟现有端点
您可以使用 camel-test Test Kit ( 使用 camel-test Test Kit),而不是使用建议 来指示 Camel 模拟端点,而是在使用 camel-test Test Kit 时轻松启用此行为。
同一路由可以测试,如下所示:请注意,我们从 isMockEndpoints 方法返回 "*",它会告知 Camel 模拟所有端点。
如果您只想模拟所有日志端点,您可以改为返回 " "。
log *
isMockEndpoints 使用 camel-test kit
public class IsMockEndpointsJUnit4Test extends CamelTestSupport {
@Override
public String isMockEndpoints() {
// override this method and return the pattern for which endpoints to mock.
// use * to indicate all
return "*";
}
@Test
public void testMockAllEndpoints() throws Exception {
// notice we have automatic mocked all endpoints and the name of the endpoints is "mock:uri"
getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:direct:foo").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World");
getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
// additional test to ensure correct endpoints in registry
assertNotNull(context.hasEndpoint("direct:start"));
assertNotNull(context.hasEndpoint("direct:foo"));
assertNotNull(context.hasEndpoint("log:foo"));
assertNotNull(context.hasEndpoint("mock:result"));
// all the endpoints was mocked
assertNotNull(context.hasEndpoint("mock:direct:start"));
assertNotNull(context.hasEndpoint("mock:direct:foo"));
assertNotNull(context.hasEndpoint("mock:log:foo"));
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").to("direct:foo").to("log:foo").to("mock:result");
from("direct:foo").transform(constant("Bye World"));
}
};
}
}34.11. 使用 XML DSL 模拟现有端点
如果不使用 camel-test 组件进行单元测试(如上所示),您可以在将 XML 文件用于路由时使用不同的方法。
解决方案是创建新 XML 文件,供单元测试使用,然后包含包含您要测试的路由的预期 XML 文件。
假设我们在 camel-route.xml 文件中有路由:
camel-route.xml
<!-- this camel route is in the camel-route.xml file -->
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start"/>
<to uri="direct:foo"/>
<to uri="log:foo"/>
<to uri="mock:result"/>
</route>
<route>
<from uri="direct:foo"/>
<transform>
<constant>Bye World</constant>
</transform>
</route>
</camelContext>
然后,我们创建一个新的 XML 文件,其中我们包含 camel-route.xml 文件,并使用类 org.apache.camel.impl.InterceptSendToMockEndpointStrategy 定义 spring bean,它告知 Camel 模拟所有端点:
test-camel-route.xml
<!-- the Camel route is defined in another XML file -->
<import resource="camel-route.xml"/>
<!-- bean which enables mocking all endpoints -->
<bean id="mockAllEndpoints" class="org.apache.camel.component.mock.InterceptSendToMockEndpointStrategy"/>
然后,在您的单元测试中载入新的 XML 文件(test-camel-route.xml)而不是 camel-route.xml。
要只模拟所有日志端点,您可以在 bean 的构造器中定义模式: https://access.redhat.com/documentation/zh-cn/red_hat_integration/2022.q4/html-single/camel_spring_boot_reference_3.14/index#csb-camel-log-component-starter
<bean id="mockAllEndpoints" class="org.apache.camel.impl.InterceptSendToMockEndpointStrategy">
<constructor-arg index="0" value="log*"/>
</bean>34.12. 模拟端点并跳过发送到原始端点
有时,您想要轻松模拟并跳过发送到某个端点。因此,消息被处理,仅发送到模拟端点。现在,您可以使用 AdviceWith 的 mockEndpointsAndSkip 方法。以下示例将跳过发送到两个端点 "direct:foo" 和 "direct:bar" 的发送。
使用建议进行模拟并跳过发送到端点
@Test
public void testAdvisedMockEndpointsWithSkip() throws Exception {
// advice the first route using the inlined AdviceWith route builder
// which has extended capabilities than the regular route builder
AdviceWith.adviceWith(context.getRouteDefinitions().get(0), context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// mock sending to direct:foo and direct:bar and skip send to it
mockEndpointsAndSkip("direct:foo", "direct:bar");
}
});
getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:direct:foo").expectedMessageCount(1);
getMockEndpoint("mock:direct:bar").expectedMessageCount(1);
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
// the message was not send to the direct:foo route and thus not sent to
// the seda endpoint
SedaEndpoint seda = context.getEndpoint("seda:foo", SedaEndpoint.class);
assertEquals(0, seda.getCurrentQueueSize());
}使用 Test Kit 的同一示例
isMockEndpointsAndSkip using camel-test kit
public class IsMockEndpointsAndSkipJUnit4Test extends CamelTestSupport {
@Override
public String isMockEndpointsAndSkip() {
// override this method and return the pattern for which endpoints to mock,
// and skip sending to the original endpoint.
return "direct:foo";
}
@Test
public void testMockEndpointAndSkip() throws Exception {
// notice we have automatic mocked the direct:foo endpoints and the name of the endpoints is "mock:uri"
getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:direct:foo").expectedMessageCount(1);
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
// the message was not send to the direct:foo route and thus not sent to the seda endpoint
SedaEndpoint seda = context.getEndpoint("seda:foo", SedaEndpoint.class);
assertEquals(0, seda.getCurrentQueueSize());
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").to("direct:foo").to("mock:result");
from("direct:foo").transform(constant("Bye World")).to("seda:foo");
}
};
}
}34.13. 限制要保留的消息数量
Mock 端点将默认保留收到的每个交换的副本。因此,如果您使用大量消息进行测试,那么它将消耗内存。
我们引入了两个选项,它保留了 First 和 retainLast,它们可以用来仅保留第 N 个和/或最后一个交换的 N 个。
例如,在下面的代码中,我们只想保留模拟接收的第一个 5 和最后一个 5 Exchange 的副本。
MockEndpoint mock = getMockEndpoint("mock:data");
mock.setRetainFirst(5);
mock.setRetainLast(5);
mock.expectedMessageCount(2000);
mock.assertIsSatisfied();
这样做有一些限制。MockEndpoint 上的 getExchanges () 和 getReceivedExchanges () 方法仅返回 Exchanges 的保留副本。因此,在上面的示例中,列表将包含 10 个交换、前五个和前五个。keepFirst 和 retainLast 选项还有一些预期使用方法的限制。例如,处理消息正文、标头等 的预期XXX 方法只会对保留的消息进行操作。在上例中,他们只能测试保留 10 个消息的预期。
34.14. 使用 arrival 次进行测试
Mock 端点将消息的 arrival 时间存储为 Exchange 上的属性
Date time = exchange.getProperty(Exchange.RECEIVED_TIMESTAMP, Date.class);
您可以使用这些信息来知道消息何时到达模拟。此外,它还为了解之前和下一消息之间相隔的时间间隔提供基础。您可以使用此选项在 Mock 端点上通过 reachs DSL 设置预期。
例如,在下一个操作前,第一个信息应该在 0-2 秒之间达到:
mock.message(0).arrives().noLaterThan(2).seconds().beforeNext();
您还可以将其定义为 2nd 消息(基于索引)在上一个后没有达到 0-2 秒的时间:
mock.message(1).arrives().noLaterThan(2).seconds().afterPrevious();
您还可以在 间使用 设置下限。例如,假设它应该在 1 到 4 秒之间:
mock.message(1).arrives().between(1, 4).seconds().afterPrevious();
您还可以设置所有信息的预期,例如,它们之间的差距应该至少为 1 秒:
mock.allMessages().arrives().noLaterThan(1).seconds().beforeNext();
上面示例中的 时间单元
使用 seconds 作为时区,但 Camel 也提供 毫秒 和 分钟。
34.15. Spring Boot Auto-Configuration
在 Spring Boot 中使用 mock 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-mock-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 5 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.mock.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.mock.enabled | 是否启用模拟组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.mock.exchange-formatter | 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认使用 DefaultExchangeFormatter。选项是 org.apache.camel.spi.ExchangeFormatter 类型。 | ExchangeFormatter | |
| camel.component.mock.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.mock.log | 当模拟收到传入消息时打开日志记录。这将仅在 INFO 级别记录传入消息的时间。如需更详细的日志记录,请将 org.apache.camel.component.mock.MockEndpoint 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
第 35 章 MongoDB
支持制作者和使用者
据 Wikipedia:"NoSQL 是一个移动,推动了松散定义的非关系数据存储类,而这会破坏相关数据库和 ACID 保障的长历史记录"。 近几年来,NoSQL 解决方案已逐渐流行,而且主要利用的网站和服务(如 Facebook、LinkedIn、Twitter 等)被认定为实现可扩展性和灵活性。
基本上,NoSQL 解决方案不同于传统的 RDBMS (Relational Database Management Systems),它们不使用 SQL 作为其查询语言,通常不提供类似 ACID 的事务行为或关系数据。相反,它们围绕灵活的数据结构和架构概念而设计(这意味着丢弃了具有固定模式的数据库表的传统概念),在商用硬件和快速处理时具有极佳的可扩展性。
MongoDB 是一个非常流行的 NoSQL 解决方案,而 camel-mongodb 组件将 Camel 与 MongoDB 集成,允许您将 MongoDB 集合作为生产者(集合上的性能操作)以及消费者(来自 MongoDB 集合中的大量文档)。
MongoDB 会围绕文档的概念(不是办公室文档,而是在 JSON/BSON 中定义的分层数据)和集合。此组件页面将假设您熟悉它们。否则,请访问 http://www.mongodb.org/。
MongoDB Camel 组件使用 Mongo Java Driver 4.x。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mongodb</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>35.1. URI 格式
mongodb:connectionBean?database=databaseName&collection=collectionName&operation=operationName[&moreOptions...]
35.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
35.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
35.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
35.3. 组件选项
MongoDB 组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| mongoConnection (common) | 用于连接的 Auto wired 共享客户端。组件生成的所有端点将共享此连接客户端。 | MongoClient | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
35.4. 端点选项
MongoDB 端点使用 URI 语法进行配置:
mongodb:connectionBean
使用以下路径和查询参数:
35.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| connectionBean (common) | 必需 设置连接 bean 引用,用于查找用于连接数据库的客户端。 | 字符串 |
35.4.2. 查询参数(27 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 集合 (通用) | 设置要绑定到此端点的 MongoDB 集合的名称。 | 字符串 | |
| collectionIndex (common) | 设置集合索引(JSON FORMAT : \\{ field1 : order1, field2 : order2})。 | 字符串 | |
| createCollection (common) | 在初始期间创建集合(如果它不存在)。默认为 true。 | true | 布尔值 |
| 数据库 (通用) | 将 MongoDB 数据库的名称设置为 target。 | 字符串 | |
| 主机 (通用) | host:port 格式的 mongodb 服务器主机地址。也可以将多个地址用作以逗号分隔的主机列表:host1:port1,host2:port2。如果指定了 hosts 参数,则忽略提供的 connectionBean。 | 字符串 | |
| mongoConnection (common) | 设置连接 bean,用作连接到数据库的客户端。 | MongoClient | |
| 操作 (common) | 设置此端点将根据 MongoDB 执行的操作。 Enum 值:
| MongoDbOperation | |
| outputType (common) | 将制作者的输出转换为所选类型 : DocumentList Document 或 MongoIterable。DocumentList 或 MongoIterable 适用于 findAll 和 aggregate。文档适用于所有其他操作。 Enum 值:
| MongoDbOutputType | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| consumerType (consumer) | 消费者类型。 | 字符串 | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| cursorRegenerationDelay (高级) | MongoDB 可跟踪光标将阻止到新数据到达为止。如果没有插入新数据,则在一段时间后,MongoDB 服务器将自动释放和关闭光标。如果需要,客户端会重新生成光标。这个值指定在尝试获取新光标之前等待的时间,如果尝试失败,下一次尝试前等待多长时间。默认值为 1000ms。 | 1000 | long |
| 动态度 (高级) | 设置此端点将尝试动态解析目标数据库和来自传入 Exchange 属性的集合。可用于在运行时覆盖在其他静态端点 URI 上指定的数据库和集合。它默认是禁用的,以提高性能。启用它将需要最少的性能命中。 | false | 布尔值 |
| ReadPreference (高级) | 配置 MongoDB 客户端如何将读取操作路由到副本集的成员。可能的值有 PRIMARY, PRIMARY_PREFERRED, SECONDARY, SECONDARY_PREFERRED 或 NEAREST。 Enum 值:
| 主 | 字符串 |
| writeConcern (高级) | 使用从 MongoDB 请求的确认级别配置连接 bean,以便将操作写入独立的 mongod、replicaset 或 cluster。可能的值有 ACKNOWLEDGED, W1, W2, W3, UNACKNOWLEDGED, JOURNALED 或 MAJORITY。 Enum 值:
| 已确认 | 字符串 |
| writeResultAsHeader (advanced) | 在写入操作中,它会确定是否将 WriteResult 作为 OUT 消息的正文,将 IN 消息传送到 OUT,并将 WriteResult 作为一个标头附加。 | false | 布尔值 |
| streamFilter (changeStream) | 更改流消费者的过滤条件。 | 字符串 | |
| 密码 (安全) | mongodb 连接的用户密码。 | 字符串 | |
| 用户名 (安全) | mongodb 连接的用户名。 | 字符串 | |
| persistentId (tail) | 一个尾部跟踪集合可为多个可尾部消费者托管多个跟踪器。为了保持它们分开,每个 tracker 应该有自己的唯一的 persistentId。 | 字符串 | |
| persistentTailTracking (tail) | 启用持久的尾部跟踪,这是跟踪系统重启后最近消耗的消息的机制。系统下次启动时,端点将从上次停止的记录点恢复光标。 | false | 布尔值 |
| tailTrackCollection (tail) | 将保留尾部跟踪信息的集合。如果没有指定,则默认使用 MongoDbTailTrackingConfig#DEFAULT_COLLECTION。 | 字符串 | |
| tailTrackDb (tail) | 指明尾部跟踪机制将保留的数据库。如果没有指定,则默认选择当前的数据库。即使已启用,也不会考虑动态性,即 tail 跟踪数据库不会有变化。 | 字符串 | |
| tailTrackField (tail) | 将放置最后一次跟踪值的字段。如果没有指定,则默认使用 MongoDbTailTrackingConfig#DEFAULT_FIELD。 | 字符串 | |
| tailTrackIncreasingField (tail) | 传入记录中的关联字段具有更大的性质,将在每次生成时都用于定位尾部光标。可以通过类型为 tail 的查询创建光标: tailTrackIncreasingField 大于 lastValue (可能从持久跟踪中恢复)。可以是 Integer、Date、String 等。注意:当前不支持点表示法,因此字段应位于文档的最顶层。 | 字符串 |
35.5. 在 Spring XML 中配置数据库
以下 Spring XML 创建一个 Bean,用于定义与 MongoDB 实例的连接。
由于 mongo java 驱动程序 3,WriteConcern 和 readPreference 选项不可动态修改。它们在 mongoClient 对象中定义
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<mongo:mongo-client id="mongoBean" host="${mongo.url}" port="${mongo.port}" credentials="${mongo.user}:${mongo.pass}@${mongo.dbname}">
<mongo:client-options write-concern="NORMAL" />
</mongo:mongo-client>
</beans>35.6. 路由示例
Spring XML 中定义的以下路由在集合上执行操作 getDbStats。
获取指定集合的 DB 统计
<route>
<from uri="direct:start" />
<!-- using bean 'mongoBean' defined above -->
<to uri="mongodb:mongoBean?database=${mongodb.database}&collection=${mongodb.collection}&operation=getDbStats" />
<to uri="direct:result" />
</route>35.7. MongoDB 操作 - 制作者端点
35.7.1. 查询操作
35.7.1.1. findById
此操作仅检索一个元素,其 _id 字段与 IN 消息正文的内容匹配。incoming 对象可以是等同于 Bson 类型的任何对象。请参阅 http://bsonspec.org/spec.html 和 http://www.mongodb.org/display/DOCS/Java+Types。
from("direct:findById")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
.to("mock:resultFindById");
请注意,默认的 _id 由 Mongo 视为 和 ObjectId 类型,因此您可能需要正确转换。
from("direct:findById")
.convertBodyTo(ObjectId.class)
.to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
.to("mock:resultFindById");
支持可选参数
。此操作支持投射操作器。请参阅 指定字段过滤器(项目 )。
35.7.1.2. findOneByQuery
从与 MongoDB 查询选择器匹配的集合中检索第一个元素。如果设置了 CamelMongoDbCriteria 标头,则其值将用作查询选择器。如果 CamelMongoDbCriteria 标头为 null,则将使用 IN 消息正文作为查询选择器。在这两种情况下,查询选择器都应是 Bson 类型,或转换为 Bson (例如,JSON 字符串或 HashMap)。如需更多信息,请参阅类型转换。
使用 MongoDB 驱动程序提供的 过滤器 创建查询选择器。
35.7.1.3. 没有查询选择器的示例(返回集合中的第一个文档)
from("direct:findOneByQuery")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");35.7.1.4. 使用查询选择器的示例(返回集合中的第一个匹配文档):
from("direct:findOneByQuery")
.setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani")))
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
支持可选参数
。此操作支持预测运算符和排序条款。请参阅 指定字段过滤器(项目),指定 sort 子句。
35.7.1.5. findAll
findAll 操作会返回与查询匹配的所有文档,或根本不返回所有文档,在这种情况下,返回集合中包含的所有文档。query 对象会被提取 CamelMongoDbCriteria 标头。如果 CamelMongoDbCriteria 标头是 null,查询对象是提取的消息正文,即:它应当是 Bson 类型,或转换为 Bson。它可以是 JSON 字符串或哈希映射。如需更多信息,请参阅类型转换。
35.7.1.5.1. 没有查询选择器的示例(重新返回集合中的所有文档)
from("direct:findAll")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
.to("mock:resultFindAll");35.7.1.5.2. 使用查询选择器的示例(重新返回集合中的所有匹配文档)
from("direct:findAll")
.setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani"))
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
.to("mock:resultFindAll");通过以下标头支持分页和高效检索:
| 标头键 | 快速持续 | 描述(从 MongoDB API 文档中提取) | 预期类型 |
|---|---|---|---|
|
|
| 在光标的开头丢弃给定数量元素。 | int/Integer |
|
|
| 限制返回的元素数量。 | int/Integer |
|
|
| 限制一个批处理中返回的元素数量。光标通常获取结果对象的批处理,并将它们存储在本地。如果 batchSize 为正数,它代表检索的每个对象批处理的大小。可以对其进行调整以优化性能并限制数据传输。如果 batchSize 为负数,它将限制返回的对象数量,该数量适合最大批处理大小限制(通常为 4MB),光标将被关闭。例如,如果 batchSize 是 -10,则服务器会返回最多 10 个文档,并且尽可能在 4MB 中容纳,然后关闭光标。请注意,此功能与文档中必须适合最大大小的 limit ()不同,并且无需发送请求以关闭光标服务器端。即使在光标迭代后也可以更改批处理大小,在这种情况下,设置将应用到下一个批处理检索。 | int/Integer |
|
|
| 设置 allowDiskUse MongoDB 标志。从 MongoDB Server 4.3.1 开始,支持它。将此标头与旧的 MongoDB 服务器版本搭配使用可能会导致查询失败。 | boolean/Boolean |
35.7.1.5.3. 带有选项 outputType=MongoIterable 和 batch size 的示例
from("direct:findAll")
.setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
.setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani")))
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll&outputType=MongoIterable")
.to("mock:resultFindAll");
findAll 操作还会返回以下 OUT 标头,以便在使用分页时迭代结果页面:
| 标头键 | 快速持续 | 描述(从 MongoDB API 文档中提取) | 数据类型 |
|---|---|---|---|
|
|
| 与查询匹配的对象数量。这不会考虑 limit/skip。 | int/Integer |
|
|
| 与查询匹配的对象数量。这不会考虑 limit/skip。 | int/Integer |
支持可选参数
。此操作支持预测运算符和排序条款。请参阅 指定字段过滤器(项目),指定 sort 子句。
35.7.1.6. 数量
返回集合中对象总数,返回 Long 作为 OUT 消息正文。
以下示例将计算"dynamicCollectionName"集合中的记录数。请注意如何启用动态性,因此操作不会针对 "notableScientists" 集合运行,而是针对 "dynamicCollectionName" 集合。
// from("direct:count").to("mongodb:myDb?database=tickets&collection=flights&operation=count&dynamicity=true");
Long result = template.requestBodyAndHeader("direct:count", "irrelevantBody", MongoDbConstants.COLLECTION, "dynamicCollectionName");
assertTrue("Result is not of type Long", result instanceof Long);
您可以提供一个查询。查询对象会被提取的 CamelMongoDbCriteria 标头。如果 CamelMongoDbCriteria 标头是 null,则查询对象所提取的消息正文(例如,它应当为 Bson 或可转换为 Bson.,并且操作将返回与此条件匹配的文档数量。
Document query = ...
Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");35.7.1.7. 指定字段过滤器(投射)
默认情况下,查询操作将返回其整个匹配对象(及其所有字段)。如果您的文档比较大,且您只需要检索其字段子集,您可以在所有查询操作中指定字段过滤器,只需通过设置相关的 Bson (或类型转换为 Bson,如 JSON 字符串、映射等)在 CamelMongoDbFieldsProjection 标头、恒定快捷键上指定字段过滤器:Mongo DbConstants.FIELDS_PROJECTION。
以下是使用 MongoDB 的预测来简化 Bson 的创建的示例。它检索除 _id 和 boringField 以外的所有字段:
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
Bson fieldProjection = Projection.exclude("_id", "boringField");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.FIELDS_PROJECTION, fieldProjection);
以下是使用 MongoDB 的预测来简化 Bson 的创建的示例。它检索除 _id 和 boringField 以外的所有字段:
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
Bson fieldProjection = Projection.exclude("_id", "boringField");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.FIELDS_PROJECTION, fieldProjection);35.7.1.8. 指定 sort 子句
通常,需要从集合中获取 min/max 记录,它根据使用 MongoDB 的 Sorts 的特定字段排序来获取 min/max 记录来简化 Bson 的创建。它检索除 _id 和 boringField 以外的所有字段:
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
Bson sorts = Sorts.descending("_id");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.SORT_BY, sorts);
在 Camel 路由中,SORT_BY 标头可与 findOneByQuery 操作一起使用,以实现相同的结果。如果还指定了 FIELDS_PROJECTION 标头,则操作将返回可直接传递给另一个组件(例如,参数化 MyBatis SELECT 查询)的单个字段/值对。本例演示了根据 documentTimestamp 字段从集合中获取最新文档,并将结果减少到单个字段:
.from("direct:someTriggeringEvent")
.setHeader(MongoDbConstants.SORT_BY).constant(Sorts.descending("documentTimestamp"))
.setHeader(MongoDbConstants.FIELDS_PROJECTION).constant(Projection.include("documentTimestamp"))
.setBody().constant("{}")
.to("mongodb:myDb?database=local&collection=myDemoCollection&operation=findOneByQuery")
.to("direct:aMyBatisParameterizedSelect");35.7.2. 创建/更新操作
35.7.2.1. insert
将新对象插入到 MongoDB 集合中,从 IN 消息正文中获取。尝试将其转换为 文档或 列表。
支持两种模式:单一插入和多个插入。对于多个插入,端点将预期一个任何类型的对象的列表、数组或集合,只要它们是 - 或可转换为 - 文档。例如:
from("direct:insert")
.to("mongodb:myDb?database=flights&collection=tickets&operation=insert");
该操作将返回 WriteResult,具体取决于 WriteConcern 或 invokeGetLastError 选项的值,getLastError () 将被称为 already 或 not。如果要访问写操作的 ultimate 结果,则需要通过在 Write 结果。然后,您可以通过调用 Result 上调用 getLastError () 或 getCachedLastError () 来检索命令CommandResult.ok (), CommandResult.getErrorMessage () 和/或 CommandResult.getException () 来验证结果。
请注意,新对象的 _id 在集合中必须是唯一的。如果没有指定值,MongoDB 会自动为您生成一个。但是,如果您确实指定了它,则插入操作将失败(并且对于 Camel 注意,您需要启用 invokeGetLastError 或设置 WriteConcern 来等待写入结果)。
这不是组件的限制,但它是 MongoDB 中如何实现更高的吞吐量。如果您使用自定义 _id,则应该确保应用程序级别是唯一的(这也是一个好的做法)。
插入记录的 OID 存储在 CamelMongoOid 密钥(MongoDbConstants.OID 常态)下的消息标头中。存储的值是 org.bson.types.ObjectId,用于单个插入,如果插入了多个记录,则为 java.util.List<org.bson.types.ObjectId >。
在 MongoDB Java Driver 3.x 中,insertOne 和 insertMany 操作返回 void。Camel 插入操作返回插入文档或文档列表。请注意,如果需要,每个文档都由新的 OID 更新。
35.7.2.2. save
save 操作等同于一个 upsert (UPdate,inSERT)操作,记录将更新的位置,如果记录不存在,它将在一个原子操作中插入。MongoDB 将根据 _id 字段执行匹配。
请注意,如果更新,对象将被完全替换,并且不允许使用 MongoDB 的 $modifier。因此,如果您要操作对象(如果已存在),有两个选项:
- 执行查询,以便首先检索整个对象及其所有字段(效率不高),在 Camel 中更改它,然后保存它。
- 将 update 操作与 $modifiers 搭配使用,这将在服务器端执行更新。您可以启用 upsert 标志,在这种情况下,MongoDB 会将 $modifiers 应用到过滤器查询对象并插入结果。
如果要保存的文档不包含 _id 属性,则操作将是插入的,所创建的新 _id 将放置在 CamelMongoOid 标头中。
例如:
from("direct:insert")
.to("mongodb:myDb?database=flights&collection=tickets&operation=save");// route: from("direct:insert").to("mongodb:myDb?database=flights&collection=tickets&operation=save");
org.bson.Document docForSave = new org.bson.Document();
docForSave.put("key", "value");
Object result = template.requestBody("direct:insert", docForSave);35.7.2.3. update
更新集合上的一个或多个记录。需要过滤器查询和更新规则。
您可以使用 MongoDBConstants.CRITERIA 标头定义为 Bson,并在 Body 中将更新规则定义为 Bson。
在增强 后,使用 MongoDBConstants.CRITERIA 标头作为 Bson 来查询 mongodb,在进行更新前,您应该注意到,在聚合策略中使用了 mongodb 更新时,您需要在聚合策略过程中从生成的 camel Exchange 中删除它,然后应用 mongodb 更新。
如果您在聚合和/或重新定义 MongoDBConstants.CRITERIA 标头期间没有删除此标头,然后再向 mongodb producer 端点发送 camel Exchange payload,在更新 mongodb 时可能会最终使用无效的 camel Exchange payload。
第二种方法 Require a List<Bson> 作为 IN 消息正文,其中包含正好 2 个元素:
- 元素 1 (index 0) TOKEN 过滤器查询 TOKEN 确定将影响哪些对象,与典型的查询对象相同
- 元素 2 (index 1) TOKEN update rules TOKEN 如何更新匹配的对象。支持 MongoDB 中的所有 修饰符操作。
Multiupdates
默认情况下,MongoDB 只会更新 1 个对象,即使多个对象与过滤器查询匹配。要指示 MongoDB 更新所有 匹配的记录,请将 CamelMongoDbMultiUpdate IN 消息标头设置为 true。
带有密钥 CamelMongoDbRecordsAffected 的标头将被返回(MongoDbConstants.RECORDS_AFFECTED 常度)已更新的记录数(从 WriteResult.getN ()中复制)。
支持以下 IN 消息标头:
| 标头键 | 快速持续 | 描述(从 MongoDB API 文档中提取) | 预期类型 |
|---|---|---|---|
|
|
| 如果更新应当应用到与所有对象匹配的所有对象。请参阅 http://www.mongodb.org/display/DOCS/Atomic+Operations | boolean/Boolean |
|
|
| 如果数据库应该创建元素(如果不存在) | boolean/Boolean |
例如,以下命令将通过将 "scientist" 字段的值设置为 "Darwin" 字段来更新 all records,其 filterField 字段等于 true :
// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update");
List<Bson> body = new ArrayList<>();
Bson filterField = Filters.eq("filterField", true);
body.add(filterField);
BsonDocument updateObj = new BsonDocument().append("$set", new BsonDocument("scientist", new BsonString("Darwin")));
body.add(updateObj);
Object result = template.requestBodyAndHeader("direct:update", body, MongoDbConstants.MULTIUPDATE, true);// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update");
Maps<String, Object> headers = new HashMap<>(2);
headers.add(MongoDbConstants.MULTIUPDATE, true);
headers.add(MongoDbConstants.FIELDS_FILTER, Filters.eq("filterField", true));
String updateObj = Updates.set("scientist", "Darwin");;
Object result = template.requestBodyAndHeaders("direct:update", updateObj, headers);// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update");
String updateObj = "[{\"filterField\": true}, {\"$set\", {\"scientist\", \"Darwin\"}}]";
Object result = template.requestBodyAndHeader("direct:update", updateObj, MongoDbConstants.MULTIUPDATE, true);35.7.3. 删除操作
35.7.3.1. remove
从集合中删除匹配记录。IN 消息正文将充当删除过滤器查询,并且预期为 DBObject 类型,或者对它转换的类型。
以下示例将删除所有字段 'conditionField' 等于 true 的对象,位于 Science 数据库, notableScientists 集合中:
// route: from("direct:remove").to("mongodb:myDb?database=science&collection=notableScientists&operation=remove");
Bson conditionField = Filters.eq("conditionField", true);
Object result = template.requestBody("direct:remove", conditionField);
返回带有键 CamelMongoDbRecordsAffected 的标头(MongoDbConstants.RECORDS_AFFECTED constant),其中包含从 WriteResult.getN ()中删除的记录数。
35.7.4. 批量写操作
35.7.4.1. bulkWrite
在批量执行写入操作时,使用控制顺序执行。需要 List<WriteModel<Document >> 作为 IN 消息正文,其中包含插入、更新和删除操作的命令。
以下示例将插入一个新的科学家"Pierre Curie",通过将"scientist"字段的值设置为"Marie Curie"并删除 ID 为"3"的记录来更新记录:
// route: from("direct:bulkWrite").to("mongodb:myDb?database=science&collection=notableScientists&operation=bulkWrite");
List<WriteModel<Document>> bulkOperations = Arrays.asList(
new InsertOneModel<>(new Document("scientist", "Pierre Curie")),
new UpdateOneModel<>(new Document("_id", "5"),
new Document("$set", new Document("scientist", "Marie Curie"))),
new DeleteOneModel<>(new Document("_id", "3")));
BulkWriteResult result = template.requestBody("direct:bulkWrite", bulkOperations, BulkWriteResult.class);
默认情况下,操作按顺序执行,并在第一个写入错误上中断,而不处理列表中任何剩余的写操作。要指示 MongoDB 继续处理列表中剩余的写入操作,请将 CamelMongoDbBulkOrdered IN 消息标头设置为 false。未排序的操作是并行执行的,此行为无法保证。
| 标头键 | 快速持续 | 描述(从 MongoDB API 文档中提取) | 预期类型 |
|---|---|---|---|
|
|
| 执行有序或未排序的操作执行。默认值为 true。 | boolean/Boolean |
35.7.5. 其他操作
35.7.5.1. 聚合
对正文中包含的给定管道执行聚合。聚合可能比较长且繁重的操作。请谨慎使用。
// route: from("direct:aggregate").to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate");
List<Bson> aggregate = Arrays.asList(match(or(eq("scientist", "Darwin"), eq("scientist",
group("$scientist", sum("count", 1)));
from("direct:aggregate")
.setBody().constant(aggregate)
.to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate")
.to("mock:resultAggregate");支持以下 IN 消息标头:
| 标头键 | 快速持续 | 描述(从 MongoDB API 文档中提取) | 预期类型 |
|---|---|---|---|
|
|
| 设置每个批处理要返回的文档数量。 | int/Integer |
|
|
| 启用聚合管道阶段将数据写入临时文件。 | boolean/Boolean |
默认情况下,返回所有结果的列表。根据结果的大小,这可能会给内存造成重度。更安全的替代方案是设置您的 outputType=MongoIterable。下一处理器会在消息正文中看到可迭代性,以便它逐一逐步执行结果。因此设置批处理大小并返回可移动性,从而可以有效地检索和处理结果。
例如:
List<Bson> aggregate = Arrays.asList(match(or(eq("scientist", "Darwin"), eq("scientist",
group("$scientist", sum("count", 1)));
from("direct:aggregate")
.setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
.setBody().constant(aggregate)
.to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate&outputType=MongoIterable")
.split(body())
.streaming()
.to("mock:resultAggregate");
请注意,调用 .split (body ()) 足以逐个发送路由的条目,但它仍然会首先将所有条目加载到内存中。因此,需要调用 .streaming () 来通过批处理将数据加载到内存中。
35.7.5.2. getDbStats
等同于在 MongoDB shell 中运行 db.stats () 命令,该命令显示有关数据库的有用统计图。
例如:
> db.stats();
{
"db" : "test",
"collections" : 7,
"objects" : 719,
"avgObjSize" : 59.73296244784423,
"dataSize" : 42948,
"storageSize" : 1000058880,
"numExtents" : 9,
"indexes" : 4,
"indexSize" : 32704,
"fileSize" : 1275068416,
"nsSizeMB" : 16,
"ok" : 1
}使用示例:
// from("direct:getDbStats").to("mongodb:myDb?database=flights&collection=tickets&operation=getDbStats");
Object result = template.requestBody("direct:getDbStats", "irrelevantBody");
assertTrue("Result is not of type Document", result instanceof Document);
该操作将返回类似于 shell 中显示的数据结构,其格式为 OUT 消息正文中的 Document。
35.7.5.3. getColStats
等同于在 MongoDB shell 中运行 db.collection.stats () 命令,该命令显示有关集合的有用统计图。
例如:
> db.camelTest.stats();
{
"ns" : "test.camelTest",
"count" : 100,
"size" : 5792,
"avgObjSize" : 57.92,
"storageSize" : 20480,
"numExtents" : 2,
"nindexes" : 1,
"lastExtentSize" : 16384,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}使用示例:
// from("direct:getColStats").to("mongodb:myDb?database=flights&collection=tickets&operation=getColStats");
Object result = template.requestBody("direct:getColStats", "irrelevantBody");
assertTrue("Result is not of type Document", result instanceof Document);
该操作将返回类似于 shell 中显示的数据结构,其格式为 OUT 消息正文中的 Document。
35.7.5.4. 命令
在数据库上运行正文作为命令。在获取主机信息、复制或分片状态时,管理员操作非常有用。
collection 参数不用于此操作。
// route: from("command").to("mongodb:myDb?database=science&operation=command");
DBObject commandBody = new BasicDBObject("hostInfo", "1");
Object result = template.requestBody("direct:command", commandBody);35.7.6. 动态操作
Exchange 可以通过设置 MongoDbConstants.OPERATION_HEADER 常量定义的 CamelMongoDbOperation 标头来覆盖端点的固定操作。
支持的值由 MongoDbOperation enumeration 决定,并与端点 URI 上的 operation 参数的接受值匹配。
例如:
// from("direct:insert").to("mongodb:myDb?database=flights&collection=tickets&operation=insert");
Object result = template.requestBodyAndHeader("direct:insert", "irrelevantBody", MongoDbConstants.OPERATION_HEADER, "count");
assertTrue("Result is not of type Long", result instanceof Long);35.8. 消费者
使用者有几种类型:
- Tailable Cursor Consumer
- 更改 Streams Consumer
35.8.1. Tailable Cursor Consumer
MongoDB 提供了一种机制来即时消耗集合中持续数据,方法是将光标保持开放,就像 *nix 系统的 tail -f 命令一样。这种机制比调度的轮询更高效,因为服务器在客户端可用时推送新数据,而不是让客户端 ping 重新调度的间隔以获取新数据。它还减少了冗余网络流量。
只有一个必要条件才能使用尾部光标:集合必须是"捕获集合",即仅保存 N 个对象,并且达到限制时,MongoDB 会按最初插入的顺序清除旧对象。如需更多信息,请参阅 http://www.mongodb.org/display/DOCS/Tailable+Cursors。
Camel MongoDB 组件实施可尾部的光标消费者,使此功能供您在 Camel 路由中使用。当插入新对象时,MongoDB 将以自然的方式将其推送为 Document,以便将其转换为 Exchange,并将触发您的路由逻辑。
35.9. 尾部光标消费者的工作方式
要将光标转换为可尾部光标,在首次生成光标时,需要向 MongoDB 发出一些特殊标志。创建后,光标将保持打开状态,并将在调用 MongoCursor.next () 方法后保持打开,直到新数据到达为止。但是,如果新数据在确定期后没有出现,MongoDB 服务器会保留终止您的光标的权利。如果您有兴趣继续使用新数据,则必须重新生成光标。为此,您必须记住您离开的位置,否则您将再次从 top 开始使用的位置。
Camel MongoDB tailable cursor consumer 会为您处理所有这些任务。您只需在提高性质的数据中为某些字段提供密钥,该特性将作为在每次重新生成光标时定位光标的标记,例如时间戳、顺序 ID 等。它可以是 MongoDB 支持的任何数据类型。日期、String 和 Integers 可以正常工作。我们在此组件上下文中称为"tail 跟踪"。
消费者将记住此字段的最后一个值,并且每当重新生成光标时,它将使用类似: increasingField > lastValue 的过滤器运行查询,以便只消耗未读取的数据。
设置 increasing 字段: 设置端点 URI tailTreasingField 选项上增加字段 的密钥。在 Camel 2.10 中,它必须是数据中的顶级字段,因为尚不支持此字段的嵌套导航。也就是说,"timestamp"字段是 okay,但 "nested.timestamp" 无法正常工作。如果您需要对嵌套增加字段的支持,请在 Camel JIRA 中打开一个 ticket。
光标重新生成延迟: 需要注意的是,如果新数据在初始时不可用,MongoDB 会立即终止光标。由于我们不希望在此例中避免了服务器,因此引进了 cursorRegenerationDelay 选项(默认值为 1000ms)。您可以对其进行修改以符合您的需求。
例如:
from("mongodb:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime")
.id("tailableCursorConsumer1")
.autoStartup(false)
.to("mock:test");以上路由将使用 "flights. Cancellations" capped 集合,使用 "departureTime" 作为增加字段,默认重新生成光标延迟为 1000ms。
35.10. 持久性跟踪
标准跟踪是易失性,最后一个值仅保存在内存中。但是,在实践中,您需要立即重启您的 Camel 容器,然后,您的最后一个值将会丢失,并且您的尾部光标消费者将再次消耗 top,可能会再次将重复记录发送到您的路由。
要解决这种情况,您可以启用 持久的 tail 跟踪 功能,来跟踪 MongoDB 数据库中特殊集合中最近使用的值。当消费者进行初始时,它将恢复最后跟踪的值,就像没有发生一样继续。
最后的读取值会保留在两个 Concasions 中:每次重新生成光标以及消费者关闭时。如果需求存在,我们可能会考虑以后的间隔保留时间(每 5 秒清空一次)。要请求此功能,请在 Camel JIRA 中打开一个 ticket。
35.11. 启用持久的尾部跟踪
要启用此功能,请在端点 URI 中设置至少以下选项:
-
persistentTailTracking选项为true -
在这个消费者的唯一标识符中
persistentId选项,以便在很多用户间重复使用相同的集合
另外,您还可以将 tailTrackDb,tailTrackCollection 和 tailTrackField 选项设置为自定义存储运行时信息的位置。有关每个选项的描述,请参阅此页面顶部的端点选项表。
例如,以下路由将从 "flights. canceledlations" capped 集合使用,使用 "departureTime" 作为 increasing 字段,默认重新生成光标延迟为 1000ms,并打开持久的 tail 跟踪,并在"flights.camelTailTracking"的 " cancellationsTracker" 下保留。 在 "lastTrackingValue" 字段中存储最后一个已处理的值(camelTailTracking 和 lastTrackingValue 为 defaults)。
from("mongodb:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime&persistentTailTracking=true" +
"&persistentId=cancellationsTracker")
.id("tailableCursorConsumer2")
.autoStartup(false)
.to("mock:test");以下是与上例相同的另一个示例,但持久尾部跟踪运行时信息将存储在"trackers.camelTrackers"集合中,位于"lastProcessedDepartureTime"字段中:
from("mongodb:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime&persistentTailTracking=true" +
"&persistentId=cancellationsTracker&tailTrackDb=trackers&tailTrackCollection=camelTrackers" +
"&tailTrackField=lastProcessedDepartureTime")
.id("tailableCursorConsumer3")
.autoStartup(false)
.to("mock:test");35.11.1. 更改 Streams Consumer
更改流允许应用程序访问实时数据更改,而不需要跟踪 MongoDB oplog 的复杂性和风险。应用程序可以使用更改流来订阅集合上的所有数据更改,并立即响应它们。由于更改流使用聚合框架,应用程序也可以过滤特定更改或转换通知。交换正文将包含任何更改的完整文档。
要配置 Change Streams Consumer,您需要指定 consumerType、数据库、集合 和可选 JSON 属性 流Filter 来过滤事件。该 JSON 属性是标准的 MongoDB $match 聚合。可以使用 XML DSL 配置轻松指定:
<route id="filterConsumer">
<from uri="mongodb:myDb?consumerType=changeStreams&database=flights&collection=tickets&streamFilter={ '$match':{'$or':[{'fullDocument.stringValue': 'specificValue'}]} }"/>
<to uri="mock:test"/>
</route>Java 配置:
from("mongodb:myDb?consumerType=changeStreams&database=flights&collection=tickets&streamFilter={ '$match':{'$or':[{'fullDocument.stringValue': 'specificValue'}]} }")
.to("mock:test");您可以将 streamFilter 值外部化到属性占位符,允许端点 URI 参数 清理 并便于阅读。
changeStreams 消费者类型也会返回以下 OUT 标头:
| 标头键 | 快速持续 | 描述(从 MongoDB API 文档中提取) | 数据类型 |
|---|---|---|---|
|
|
| 发生的操作类型。可以是以下值之一: insert, delete, replace, update, drop, rename, dropDatabase, invalidate。 | 字符串 |
|
|
| 包含插入、替换、删除、更新操作(如 CRUD 操作)创建或修改的文档的文档。对于分片集合,还显示文档的完整分片密钥。如果 _id 字段已经是 shard 密钥的一部分,则不会重复它。 | ObjectId |
35.12. 类型转换
MongoDbBasicConverters 类型转换程序包含在 camel-mongodb 组件中,提供以下转换:
| 名称 | 从类型 | 要键入 | 如何? |
|---|---|---|---|
| fromMapToDocument |
|
|
通过 |
| fromDocumentToMap |
|
|
|
| fromStringToDocument |
|
|
使用 |
| fromStringToObjectId |
|
|
通过新的 |
| fromFileToDocument |
|
|
在 hood 下使用 |
| fromInputStreamToDocument |
|
|
将 inputstream 字节转换为 |
| fromStringToList |
|
|
使用 |
这个类型转换器会自动发现,因此您不需要手动配置任何内容。
35.13. Spring Boot Auto-Configuration
当将 mongodb 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-mongodb-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 5 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.mongodb.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.mongodb.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.mongodb.enabled | 是否启用 mongodb 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.mongodb.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.mongodb.mongo-connection | 用于连接的共享客户端。组件生成的所有端点将共享此连接客户端。选项是一个 com.mongodb.client.MongoClient 类型。 | MongoClient |
第 36 章 Netty
支持制作者和使用者
Camel 中的 Netty 组件是基于 Netty 项目版本 4 的套接字通信组件。
Netty 是一个 NIO 客户端服务器框架,可快速轻松地开发 networkServerInitializerFactory 应用程序,如协议服务器和客户端。
Netty 大大简化并简化了网络编程,如 TCP 和 UDP 套接字服务器。
此 camel 组件支持制作者和消费者端点。
Netty 组件有几个选项,并允许精细控制多个 TCP/UDP 通信参数(缓冲大小、keepAlives、tcpNoDelay 等),并促进 Camel 路由的 In-Only 和 In-Out 通信。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>36.1. URI 格式
netty 组件的 URI 方案如下
netty:tcp://0.0.0.0:99999[?options] netty:udp://remotehost:99999/[?options]
此组件支持 TCP 和 UDP 的生产者和消费者端点。
36.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
36.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置,身份验证的凭证,urls 用于网络连接,以此类推。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)或通过 Java 代码直接配置 组件。
36.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为 配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
36.3. 组件选项
Netty 组件支持 73 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 配置 (common) | 在创建端点时,将 NettyConfiguration 用作配置。 | NettyConfiguration | |
| 断开连接 (通用) | 使用后是否断开(关闭)与 Netty 频道的连接。可用于使用者和制作者。 | false | 布尔值 |
| keepalive ( common) | 设置 以确保套接字因为不活跃而不会被关闭。 | true | 布尔值 |
| reuseAddress (common) | 设置 有助于套接字多路复用. | true | 布尔值 |
| reuseChannel (common) | 此选项允许生产者和消费者(客户端模式)在处理 Exchange 的生命周期中重复使用相同的 Netty Channel。如果您需要在 Camel 路由中多次调用服务器,并希望使用相同的网络连接,这将非常有用。使用这个选项时,频道不会返回到连接池,直到 Exchange 完成为止,如果 disconnect 选项设为 true,则频道不会返回到连接池。重复使用的频道保存在 Exchange 上,使用密钥 NettyConstants#NETTY_CHANNEL (允许您在路由期间获取频道并使用它)。 | false | 布尔值 |
| sync (common) | 设置为将端点设置为单向或请求响应。 | true | 布尔值 |
| tcpNoDelay (common) | 设置 以提高 TCP 协议性能。 | true | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| Broadcast (消费者) | 设置 以选择通过 UDP 进行多播。 | false | 布尔值 |
| clientMode (consumer) | 如果 clientMode 为 true,netty 使用者会将地址作为 TCP 客户端连接。 | false | 布尔值 |
| Reconnect (consumer) | 仅在消费者中的 clientMode 中使用,如果启用此功能,消费者将尝试重新连接。 | true | 布尔值 |
| reconnectInterval (consumer) | 如果启用了 reconnect 和 clientMode,则使用。尝试重新连接的时间间隔(以秒为单位)。 | 10000 | int |
| 积压 (消费者) | 允许为 netty 使用者(server)配置积压。请注意,积压只是根据操作系统的最佳努力。将此选项设置为值,如 200、500 或 1000,告诉 TCP 堆栈接受队列在没有配置此选项时的时长,则 backlog 依赖于 OS 设置。 | int | |
| bossCount (使用者(高级) | 当 netty 在 nio 模式下工作时,它使用 Netty 中的默认 bossCount 参数,即 1。用户可以使用此选项覆盖 Netty 中的默认 bossCount。 | 1 | int |
| bossGroup (使用者(高级) | 设置 BossGroup,可用于处理 NettyEndpoint 之间的服务器端的新连接。 | EventLoopGroup | |
| NoReply disconnectOnNoReply (使用者(高级) | 如果启用了同步,则此选项将指定 NettyConsumer (如果应该断开没有回复发送)。 | true | 布尔值 |
| executorService (使用者(高级) | 使用给定的 EventExecutorGroup。 | EventExecutorGroup | |
| maximumPoolSize (使用者(高级) | 为 netty consumer 排序线程池设置最大线程池大小。默认大小为 2 x cpu_core 加 1。将此值设置为 eg 10 将随后使用 10 个线程,除非 2 x cpu_core 加 1 是一个更高的值,然后会被覆盖和使用。例如,如果有 8 个内核,则消费者线程池将为 17。此线程池用于路由 Camel 从 Netty 接收的消息。我们使用单独的线程池来确保对消息的排序,在某些消息中将阻止,然后 nettys worker 线程(事件循环)不受影响。 | int | |
| nettyServerBootstrapFactory (使用者(高级) | 使用自定义 NettyServerBootstrapFactory。 | NettyServerBootstrapFactory | |
| NetworkInterface (使用者(高级) | 使用 UDP 时,此选项可用于按照其名称指定网络接口,如 eth0 以加入多播组。 | 字符串 | |
| noReplyLogLevel (consumer (advanced)) | 如果启用了 sync,则此选项指定了在记录没有回复发送时要使用的 NettyConsumer 的日志记录级别。 Enum 值:
| WARN | LoggingLevel |
| serverClosedChannelExceptionCaughtLogLevel (consumer (advanced)) | 如果服务器(NettyConsumer)捕获 java.nio.channels.ClosedChannelException,则使用此日志记录级别记录。这用于避免记录关闭的频道异常,因为客户端可能会断开停滞,然后在 Netty 服务器中造成大量关闭异常。 Enum 值:
| DEBUG | LoggingLevel |
| serverExceptionCaughtLogLevel (consumer (advanced)) | 如果服务器(NettyConsumer)捕获了一个异常,则使用这个日志记录级别记录。 Enum 值:
| WARN | LoggingLevel |
| serverInitializerFactory (使用者(高级) | 使用自定义 ServerInitializerFactory。 | ServerInitializerFactory | |
| usingExecutorService (consumer (advanced)) | 是否使用 ordered 线程池,以确保事件在同一频道中按顺序处理。 | true | 布尔值 |
| connectTimeout (producer) | 等待套接字连接可用的时间。值以毫秒为单位。 | 10000 | int |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| requestTimeout (producer) | 在调用远程服务器时,允许在 Netty producer 中使用超时。默认情况下,不使用超时。该值以秒为单位,因此 eg 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 来触发超时。 | long | |
| clientInitializerFactory (producer (advanced)) | 使用自定义 ClientInitializerFactory。 | ClientInitializerFactory | |
| correlationManager (producer (advanced)) | 要使用自定义关联管理器,在将 request/reply 与 netty producer 搭配使用时,管理请求和回复消息的方式。只有当您有办法将请求与回复一起映射时,才应使用此参数,例如,在请求和回复消息中存在关联 ids 时。如果您希望在 netty 的同一频道(也称为 连接)上的多路并发消息,则可以使用它。执行此操作时,您必须有一种方法来关联请求和回复消息,以便您可以在 inflight Camel Exchange 上存储正确的回复,然后再继续路由。我们建议在构建自定义关联管理器时扩展 TimeoutCorrelationManagerSupport。这支持超时和其他复杂性,否则您还需要实施。如需了解更多详细信息,请参阅 producerPoolEnabled 选项。 | NettyCamelStateCorrelationManager | |
| lazyChannelCreation (生成者(高级) | 如果远程服务器没有启动并在 Camel 制作者启动时运行,则可以创建频道以避免异常。 | true | 布尔值 |
| producerPoolEnabled (producer (advanced)) | 是否启用了制作者池。重要:如果您关闭这个连接,则也会将单个共享连接用于制作者。这意味着,如果回复没有排序,则可能会出现交错响应的问题。因此,您需要在请求和回复消息中有一个关联 id,以便您可以正确地将回复与负责继续处理 Camel 消息的 Camel 回调相关联。为此,您需要实施 NettyCamelStateCorrelationManager 作为关联管理器,并通过 correlationManager 选项进行配置。如需更多详细信息,请参阅 correlationManager 选项。 | true | 布尔值 |
| producerPoolMaxIdle (producer (advanced)) | 根据池中空闲实例的数量设置 cap。 | 100 | int |
| producerPoolMaxTotal (生成者(高级) | 设置给定时间上可由池分配(签出给客户端)或闲置等待签出的对象数量上限。对没有限制使用负值。 | -1 | int |
| producerPoolMinEvictableIdle (producer (advanced)) | 设置对象可能处于空闲时间的最小值(以millis 中的值),然后才能被闲置对象驱除器进行驱除。 | 300000 | long |
| producerPoolMinIdle (producer (advanced)) | 在驱除器线程(如果为 active)生成新对象前,设置制作者池中允许的最小实例数量。 | int | |
| udpConnectionlessSending (生成(高级) | 这个选项支持连接较少的 udp 发送,这些连接是实际触发和忘记。如果没有侦听接收端口,则连接的 udp 会接收 PortUnreachableException。 | false | 布尔值 |
| useByteBuf (producer (advanced)) | 如果 useByteBuf 为 true,netty producer 会在发送邮件前将消息正文转换为 ByteBuf。 | false | 布尔值 |
| hostnameVerification ( security) | 要在 SSLEngine 上启用/禁用主机名验证。 | false | 布尔值 |
| allowSerializedHeaders (高级) | 仅在 transferExchange 为 true 时用于 TCP。当设置为 true 时,标头和属性中的串行对象将添加到交换中。否则,Camel 将排除任何非序列化对象,并在 WARN 级别记录它。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| channelGroup (高级) | 使用显式 ChannelGroup。 | ChannelGroup | |
| nativeTransport (高级) | 是否使用原生传输而不是 NIO。原生传输利用主机操作系统,且只在某些平台上受支持。您需要为您使用的主机操作系统添加 netty JAR。要查看更多详情,请访问: | false | 布尔值 |
| 选项 (高级) | 允许使用 选项配置额外的 netty 选项。作为前缀。例如 option.child.keepAlive=false 来设置 netty 选项 sub.keepAlive=false。有关可以使用的选项,请参阅 Netty 文档。 | map | |
| receiveBufferSize (advanced) | 在入站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | int |
| receiveBufferSizePredictor (advanced) | 配置缓冲区大小预测器。请参阅 Jetty 文档和此邮件线程的详细信息。 | int | |
| sendBufferSize (advanced) | 在出站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | int |
| transferExchange (advanced) | 仅用于 TCP。您可以通过线路来传输交换,而不只是正文。以下字段已传输:在正文、出口正文、错误正文、In headers、out 标头、错误标头、交换属性、交换属性中。这要求对象是串行的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。 | false | 布尔值 |
| udpByteArrayCodec (advanced) | 仅针对 UDP。如果启用使用字节数组 codec 而不是 Java 序列化协议。 | false | 布尔值 |
| workerCount (高级) | 当 netty 在 nio 模式下工作时,它使用 Netty (cpu_core_threads x 2)的默认 workerCount 参数。用户可以使用此选项覆盖 Netty 中的默认 workerCount。 | int | |
| WorkerGroup (高级) | 使用显式 EventLoopGroup 作为 boss 线程池。例如,与多个消费者或生成者共享线程池。默认情况下,每个使用者或制作者都有自己的 worker 池,具有 2 x cpu count core 线程。 | EventLoopGroup | |
| allowDefaultCodec (codec) | netty 组件同时会安装一个默认的 codec,编码器/解码器为 null,textline 为 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件将默认 codec 安装为过滤器链中的第一个元素。 | true | 布尔值 |
| autoAppendDelimiter (codec) | 使用文本代码c发送时是否自动附加缺少的结束分隔符。 | true | 布尔值 |
| decoderMaxLineLength (codec) | 用于文本line codec 的最大行长度。 | 1024 | int |
| decoders (codec) | 要使用的解码器列表。您可以使用带有逗号分隔值的 String,并在 Registry 中查找值。只需记得使用 # 为值添加前缀,以便 Camel 知道它应该查找。 | list | |
| 分隔符 (codec) | 用于文本解码器的分隔符。可能的值有 LINE 和 NULL。 Enum 值:
| 行 | TextLineDelimiter |
| 编码器 (codec) | 要使用的编码器列表。您可以使用带有逗号分隔值的 String,并在 Registry 中查找值。只需记得使用 # 为值添加前缀,以便 Camel 知道它应该查找。 | list | |
| 编码 (codec) | 用于文本代码的编码(charset name)。如果没有提供,Camel 将使用 JVM 默认 Charset。 | 字符串 | |
| 文本行 (codec) | 仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的标志。如果没有指定,或者值为 false,则通过 TCP 假定 Object Serialization,但默认只允许 String 序列化。 | false | 布尔值 |
| enabledProtocols (security) | 使用 SSL 时要启用哪些协议。 | TLSv1,TLSv1.1,TLSv1.2 | 字符串 |
| keyStoreFile (安全) | 用于加密的客户端证书密钥存储。 | File | |
| keyStoreFormat (security) | 用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS。 | 字符串 | |
| keyStoreResource (security) | 用于加密的客户端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| needClientAuth (security) | 配置服务器在使用 SSL 时是否需要客户端身份验证。 | false | 布尔值 |
| 密码短语 (安全) | 使用的密码设置,以便加密/解密使用 SSH 发送的载荷。 | 字符串 | |
| securityProvider (security) | 用于有效负载加密的安全供应商。如果没有设置,则默认为 SunX509。 | 字符串 | |
| SSL (安全) | 设置以指定是否将 SSL 加密应用到此端点。 | false | 布尔值 |
| sslClientCertHeaders (security) | 在 SSL 模式中和启用后,Netty consumer 将增强 Camel 消息及标头有关客户端证书的信息,如主题名称、签发者名称、序列号和有效日期范围。 | false | 布尔值 |
| sslContextParameters (security) | 使用 SSLContextParameters 配置安全性。 | SSLContextParameters | |
| SSLHandler (安全) | 对可用于返回 SSL 处理程序的类的引用。 | SslHandler | |
| trustStoreFile (security) | 用于加密的服务器端证书密钥存储。 | File | |
| trustStoreResource (security) | 用于加密的服务器端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| useGlobalSslContextParameters (security) | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
36.4. 端点选项
Netty 端点使用 URI 语法进行配置:
netty:protocol://host:port
使用以下路径和查询参数:
36.4.1. 路径参数(3 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 协议 (common) | 需要 使用的协议可以是 tcp 或 udp。 Enum 值:
| 字符串 | |
| 主机 (通用) | 必需 主机名。对于消费者,主机名是 localhost 或 0.0.0.0。对于制作者,主机名是要连接的远程主机。 | 字符串 | |
| 端口 (common) | 需要 主机端口号。 | int |
36.4.2. 查询参数(71 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 断开连接 (通用) | 使用后是否断开(关闭)与 Netty 频道的连接。可用于使用者和制作者。 | false | 布尔值 |
| keepalive ( common) | 设置 以确保套接字因为不活跃而不会被关闭。 | true | 布尔值 |
| reuseAddress (common) | 设置 有助于套接字多路复用. | true | 布尔值 |
| reuseChannel (common) | 此选项允许生产者和消费者(客户端模式)在处理 Exchange 的生命周期中重复使用相同的 Netty Channel。如果您需要在 Camel 路由中多次调用服务器,并希望使用相同的网络连接,这将非常有用。使用这个选项时,频道不会返回到连接池,直到 Exchange 完成为止,如果 disconnect 选项设为 true,则频道不会返回到连接池。重复使用的频道保存在 Exchange 上,使用密钥 NettyConstants#NETTY_CHANNEL (允许您在路由期间获取频道并使用它)。 | false | 布尔值 |
| sync (common) | 设置为将端点设置为单向或请求响应。 | true | 布尔值 |
| tcpNoDelay (common) | 设置 以提高 TCP 协议性能。 | true | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| Broadcast (消费者) | 设置 以选择通过 UDP 进行多播。 | false | 布尔值 |
| clientMode (consumer) | 如果 clientMode 为 true,netty 使用者会将地址作为 TCP 客户端连接。 | false | 布尔值 |
| Reconnect (consumer) | 仅在消费者中的 clientMode 中使用,如果启用此功能,消费者将尝试重新连接。 | true | 布尔值 |
| reconnectInterval (consumer) | 如果启用了 reconnect 和 clientMode,则使用。尝试重新连接的时间间隔(以秒为单位)。 | 10000 | int |
| 积压 (消费者) | 允许为 netty 使用者(server)配置积压。请注意,积压只是根据操作系统的最佳努力。将此选项设置为值,如 200、500 或 1000,告诉 TCP 堆栈接受队列在没有配置此选项时的时长,则 backlog 依赖于 OS 设置。 | int | |
| bossCount (使用者(高级) | 当 netty 在 nio 模式下工作时,它使用 Netty 中的默认 bossCount 参数,即 1。用户可以使用此选项覆盖 Netty 中的默认 bossCount。 | 1 | int |
| bossGroup (使用者(高级) | 设置 BossGroup,可用于处理 NettyEndpoint 之间的服务器端的新连接。 | EventLoopGroup | |
| NoReply disconnectOnNoReply (使用者(高级) | 如果启用了同步,则此选项将指定 NettyConsumer (如果应该断开没有回复发送)。 | true | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| nettyServerBootstrapFactory (使用者(高级) | 使用自定义 NettyServerBootstrapFactory。 | NettyServerBootstrapFactory | |
| NetworkInterface (使用者(高级) | 使用 UDP 时,此选项可用于按照其名称指定网络接口,如 eth0 以加入多播组。 | 字符串 | |
| noReplyLogLevel (consumer (advanced)) | 如果启用了 sync,则此选项指定了在记录没有回复发送时要使用的 NettyConsumer 的日志记录级别。 Enum 值:
| WARN | LoggingLevel |
| serverClosedChannelExceptionCaughtLogLevel (consumer (advanced)) | 如果服务器(NettyConsumer)捕获 java.nio.channels.ClosedChannelException,则使用此日志记录级别记录。这用于避免记录关闭的频道异常,因为客户端可能会断开停滞,然后在 Netty 服务器中造成大量关闭异常。 Enum 值:
| DEBUG | LoggingLevel |
| serverExceptionCaughtLogLevel (consumer (advanced)) | 如果服务器(NettyConsumer)捕获了一个异常,则使用这个日志记录级别记录。 Enum 值:
| WARN | LoggingLevel |
| serverInitializerFactory (使用者(高级) | 使用自定义 ServerInitializerFactory。 | ServerInitializerFactory | |
| usingExecutorService (consumer (advanced)) | 是否使用 ordered 线程池,以确保事件在同一频道中按顺序处理。 | true | 布尔值 |
| connectTimeout (producer) | 等待套接字连接可用的时间。值以毫秒为单位。 | 10000 | int |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| requestTimeout (producer) | 在调用远程服务器时,允许在 Netty producer 中使用超时。默认情况下,不使用超时。该值以秒为单位,因此 eg 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 来触发超时。 | long | |
| clientInitializerFactory (producer (advanced)) | 使用自定义 ClientInitializerFactory。 | ClientInitializerFactory | |
| correlationManager (producer (advanced)) | 要使用自定义关联管理器,在将 request/reply 与 netty producer 搭配使用时,管理请求和回复消息的方式。只有当您有办法将请求与回复一起映射时,才应使用此参数,例如,在请求和回复消息中存在关联 ids 时。如果您希望在 netty 的同一频道(也称为 连接)上的多路并发消息,则可以使用它。执行此操作时,您必须有一种方法来关联请求和回复消息,以便您可以在 inflight Camel Exchange 上存储正确的回复,然后再继续路由。我们建议在构建自定义关联管理器时扩展 TimeoutCorrelationManagerSupport。这支持超时和其他复杂性,否则您还需要实施。如需了解更多详细信息,请参阅 producerPoolEnabled 选项。 | NettyCamelStateCorrelationManager | |
| lazyChannelCreation (生成者(高级) | 如果远程服务器没有启动并在 Camel 制作者启动时运行,则可以创建频道以避免异常。 | true | 布尔值 |
| producerPoolEnabled (producer (advanced)) | 是否启用了制作者池。重要:如果您关闭这个连接,则也会将单个共享连接用于制作者。这意味着,如果回复没有排序,则可能会出现交错响应的问题。因此,您需要在请求和回复消息中有一个关联 id,以便您可以正确地将回复与负责继续处理 Camel 消息的 Camel 回调相关联。为此,您需要实施 NettyCamelStateCorrelationManager 作为关联管理器,并通过 correlationManager 选项进行配置。如需更多详细信息,请参阅 correlationManager 选项。 | true | 布尔值 |
| producerPoolMaxIdle (producer (advanced)) | 根据池中空闲实例的数量设置 cap。 | 100 | int |
| producerPoolMaxTotal (生成者(高级) | 设置给定时间上可由池分配(签出给客户端)或闲置等待签出的对象数量上限。对没有限制使用负值。 | -1 | int |
| producerPoolMinEvictableIdle (producer (advanced)) | 设置对象可能处于空闲时间的最小值(以millis 中的值),然后才能被闲置对象驱除器进行驱除。 | 300000 | long |
| producerPoolMinIdle (producer (advanced)) | 在驱除器线程(如果为 active)生成新对象前,设置制作者池中允许的最小实例数量。 | int | |
| udpConnectionlessSending (生成(高级) | 这个选项支持连接较少的 udp 发送,这些连接是实际触发和忘记。如果没有侦听接收端口,则连接的 udp 会接收 PortUnreachableException。 | false | 布尔值 |
| useByteBuf (producer (advanced)) | 如果 useByteBuf 为 true,netty producer 会在发送邮件前将消息正文转换为 ByteBuf。 | false | 布尔值 |
| hostnameVerification ( security) | 要在 SSLEngine 上启用/禁用主机名验证。 | false | 布尔值 |
| allowSerializedHeaders (高级) | 仅在 transferExchange 为 true 时用于 TCP。当设置为 true 时,标头和属性中的串行对象将添加到交换中。否则,Camel 将排除任何非序列化对象,并在 WARN 级别记录它。 | false | 布尔值 |
| channelGroup (高级) | 使用显式 ChannelGroup。 | ChannelGroup | |
| nativeTransport (高级) | 是否使用原生传输而不是 NIO。原生传输利用主机操作系统,且只在某些平台上受支持。您需要为您使用的主机操作系统添加 netty JAR。要查看更多详情,请访问: | false | 布尔值 |
| 选项 (高级) | 允许使用 选项配置额外的 netty 选项。作为前缀。例如 option.child.keepAlive=false 来设置 netty 选项 sub.keepAlive=false。有关可以使用的选项,请参阅 Netty 文档。 | map | |
| receiveBufferSize (advanced) | 在入站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | int |
| receiveBufferSizePredictor (advanced) | 配置缓冲区大小预测器。请参阅 Jetty 文档和此邮件线程的详细信息。 | int | |
| sendBufferSize (advanced) | 在出站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | int |
| 同步 (高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| transferExchange (advanced) | 仅用于 TCP。您可以通过线路来传输交换,而不只是正文。以下字段已传输:在正文、出口正文、错误正文、In headers、out 标头、错误标头、交换属性、交换属性中。这要求对象是串行的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。 | false | 布尔值 |
| udpByteArrayCodec (advanced) | 仅针对 UDP。如果启用使用字节数组 codec 而不是 Java 序列化协议。 | false | 布尔值 |
| workerCount (高级) | 当 netty 在 nio 模式下工作时,它使用 Netty (cpu_core_threads x 2)的默认 workerCount 参数。用户可以使用此选项覆盖 Netty 中的默认 workerCount。 | int | |
| WorkerGroup (高级) | 使用显式 EventLoopGroup 作为 boss 线程池。例如,与多个消费者或生成者共享线程池。默认情况下,每个使用者或制作者都有自己的 worker 池,具有 2 x cpu count core 线程。 | EventLoopGroup | |
| allowDefaultCodec (codec) | netty 组件同时会安装一个默认的 codec,编码器/解码器为 null,textline 为 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件将默认 codec 安装为过滤器链中的第一个元素。 | true | 布尔值 |
| autoAppendDelimiter (codec) | 使用文本代码c发送时是否自动附加缺少的结束分隔符。 | true | 布尔值 |
| decoderMaxLineLength (codec) | 用于文本line codec 的最大行长度。 | 1024 | int |
| decoders (codec) | 要使用的解码器列表。您可以使用带有逗号分隔值的 String,并在 Registry 中查找值。只需记得使用 # 为值添加前缀,以便 Camel 知道它应该查找。 | list | |
| 分隔符 (codec) | 用于文本解码器的分隔符。可能的值有 LINE 和 NULL。 Enum 值:
| 行 | TextLineDelimiter |
| 编码器 (codec) | 要使用的编码器列表。您可以使用带有逗号分隔值的 String,并在 Registry 中查找值。只需记得使用 # 为值添加前缀,以便 Camel 知道它应该查找。 | list | |
| 编码 (codec) | 用于文本代码的编码(charset name)。如果没有提供,Camel 将使用 JVM 默认 Charset。 | 字符串 | |
| 文本行 (codec) | 仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的标志。如果没有指定,或者值为 false,则通过 TCP 假定 Object Serialization,但默认只允许 String 序列化。 | false | 布尔值 |
| enabledProtocols (security) | 使用 SSL 时要启用哪些协议。 | TLSv1,TLSv1.1,TLSv1.2 | 字符串 |
| keyStoreFile (安全) | 用于加密的客户端证书密钥存储。 | File | |
| keyStoreFormat (security) | 用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS。 | 字符串 | |
| keyStoreResource (security) | 用于加密的客户端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| needClientAuth (security) | 配置服务器在使用 SSL 时是否需要客户端身份验证。 | false | 布尔值 |
| 密码短语 (安全) | 使用的密码设置,以便加密/解密使用 SSH 发送的载荷。 | 字符串 | |
| securityProvider (security) | 用于有效负载加密的安全供应商。如果没有设置,则默认为 SunX509。 | 字符串 | |
| SSL (安全) | 设置以指定是否将 SSL 加密应用到此端点。 | false | 布尔值 |
| sslClientCertHeaders (security) | 在 SSL 模式中和启用后,Netty consumer 将增强 Camel 消息及标头有关客户端证书的信息,如主题名称、签发者名称、序列号和有效日期范围。 | false | 布尔值 |
| sslContextParameters (security) | 使用 SSLContextParameters 配置安全性。 | SSLContextParameters | |
| SSLHandler (安全) | 对可用于返回 SSL 处理程序的类的引用。 | SslHandler | |
| trustStoreFile (security) | 用于加密的服务器端证书密钥存储。 | File | |
| trustStoreResource (security) | 用于加密的服务器端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 |
36.5. 基于 registry 的选项
codec 处理程序和 SSL Keystores 可以在 Registry 中列出,如在 Spring XML 文件中。可以传递的值如下:
| 名称 | 描述 |
|---|---|
|
| 使用的密码设置,以便加密/解密使用 SSH 发送的有效负载 |
|
| 用于有效负载加密的密钥存储格式。如果没有设置,则默认为 "JKS" |
|
| 用于有效负载加密的安全供应商。如果没有设置,则默认为 "SunX509"。 |
|
| 弃用: 用于加密的客户端证书密钥存储 |
|
| 弃用: 用于加密的服务器端证书密钥存储 |
|
|
用于加密的客户端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 |
|
|
用于加密的服务器端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 |
|
| 对可用于返回 SSL 处理程序的类的引用 |
|
|
一个自定义 |
|
| 要使用的编码器列表。您可以使用带有逗号分隔值的 String,并在 Registry 中查找值。只需记得使用 # 为值添加前缀,以便 Camel 知道它应该查找。 |
|
|
一个自定义 |
|
| 要使用的解码器列表。您可以使用带有逗号分隔值的 String,并在 Registry 中查找值。只需记得使用 # 为值添加前缀,以便 Camel 知道它应该查找。 |
参阅以下有关使用不可共享编码器/解码器的信息。
36.5.1. 使用不可共享编码器或解码器
如果您的编码器或解码器不可共享(例如,它们没有 @Shareable 类注解),则您的编码器/解码器必须实施 org.apache.camel.component.netty.ChannelHandlerFactory 接口,并在 新的ChannelHandler 方法中返回新实例。这是为了确保安全使用编码器/解码器。否则,在创建端点时 Netty 组件会记录 WARN。
Netty 组件提供了一个 org.apache.camel.component.netty.ChannelHandlerFactories factory 类,它具有多个常用的方法。
36.6. 将消息发送到/从 Netty 端点发送
36.6.1. Netty Producer
在 Producer 模式中,组件提供使用 TCP 或 UDP 协议(可选的 SSL 支持)将有效负载发送到套接字端点的功能。
制作者模式支持基于单向和请求响应的操作。
36.6.2. Netty Consumer
在 Consumer 模式中,组件提供以下功能:
- 使用 TCP 或 UDP 协议(具有可选 SSL 支持)侦听指定的套接字,
- 使用基于文本/xml、二进制和序列化对象有效负载和序列化对象接收套接字上的请求
- 在路由上作为消息交换发送。
消费者模式支持基于单向和请求响应的操作。
36.7. 例子
36.7.1. 使用 Request-Reply 和 serialized 对象有效负载的 UDP Netty 端点
请注意,默认不允许对象序列化,因此必须配置解码器。
@BindToRegistry("decoder")
public ChannelHandler getDecoder() throws Exception {
return new DefaultChannelHandlerFactory() {
@Override
public ChannelHandler newChannelHandler() {
return new DatagramPacketObjectDecoder(ClassResolvers.weakCachingResolver(null));
}
};
}
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("netty:udp://0.0.0.0:5155?sync=true&decoders=#decoder")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
Poetry poetry = (Poetry) exchange.getIn().getBody();
// Process poetry in some way
exchange.getOut().setBody("Message received);
}
}
}
};36.7.2. 使用单向通信的基于 TCP 的 Netty consumer 端点
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("netty:tcp://0.0.0.0:5150")
.to("mock:result");
}
};36.7.3. 使用 Request-Reply 通信的基于 SSL/TCP 的 Netty consumer 端点
使用 JSSE 配置实用程序
Netty 组件通过 Camel JSSE 配置实用程序 支持 SSL/TLS 配置。这个工具可大大减少您需要编写的组件特定代码,并在端点和组件级别进行配置。以下示例演示了如何将 实用程序与 Netty 组件一起使用。
组件的编程配置
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");
SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
NettyComponent nettyComponent = getContext().getComponent("netty", NettyComponent.class);
nettyComponent.setSslContextParameters(scp);
基于端点的 Spring DSL 配置
...
<camel:sslContextParameters
id="sslContextParameters">
<camel:keyManagers
keyPassword="keyPassword">
<camel:keyStore
resource="/users/home/server/keystore.jks"
password="keystorePassword"/>
</camel:keyManagers>
</camel:sslContextParameters>...
...
<to uri="netty:tcp://0.0.0.0:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/>
...
在 Jetty 组件中使用基本 SSL/TLS 配置
Registry registry = context.getRegistry();
registry.bind("password", "changeit");
registry.bind("ksf", new File("src/test/resources/keystore.jks"));
registry.bind("tsf", new File("src/test/resources/keystore.jks"));
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty:tcp://0.0.0.0:5150?sync=true&ssl=true&passphrase=#password"
+ "&keyStoreFile=#ksf&trustStoreFile=#tsf";
String return_string =
"When You Go Home, Tell Them Of Us And Say,"
+ "For Your Tomorrow, We Gave Our Today.";
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});
获取 SSLSession 和客户端证书的访问权限
如果需要获取客户端证书的详细信息,您可以获取 javax.net.ssl.SSLSession 的访问权限。当 ssl=true 后,Netty 组件会将 SSLSession 存储为 Camel 消息上的标头,如下所示:
SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class); // get the first certificate which is client certificate javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0]; Principal principal = cert.getSubjectDN();
请记住,设置 needClientAuth=true 以验证客户端,否则 SSLSession 无法访问客户端证书的信息,您可能会获得一个例外 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated。如果客户端证书过期或无效等,您可能还会收到此例外。
选项 sslClientCertHeaders 可以设为 true,然后使用带有带有客户端证书详细信息的标头来增强 Camel 消息。例如,主题名称在标题 CamelNettySSLClientCertSubjectName 中可用。
36.7.4. 使用多个代码
在某些情况下,可能需要将编码器和解码器链添加到 netty 管道。要将 multpile codecs 添加到 camel netty 端点中,应使用 'encoders' 和 'decoders' uri 参数。与 'encoder' 和 'decoder' 参数类似,它们用来提供应添加到管道中的 ChannelUpstreamHandlers 和 ChannelDownstreamHandlers 的引用。请注意,如果指定了编码器,则忽略编码器参数,类似于解码器和解码器参数。
更多有关使用不可共享编码器/解码器的信息。
需要将 codec 列表添加到 Camel 的 registry 中,以便在创建端点时解析它们。
ChannelHandlerFactory lengthDecoder = ChannelHandlerFactories.newLengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4);
StringDecoder stringDecoder = new StringDecoder();
registry.bind("length-decoder", lengthDecoder);
registry.bind("string-decoder", stringDecoder);
LengthFieldPrepender lengthEncoder = new LengthFieldPrepender(4);
StringEncoder stringEncoder = new StringEncoder();
registry.bind("length-encoder", lengthEncoder);
registry.bind("string-encoder", stringEncoder);
List<ChannelHandler> decoders = new ArrayList<ChannelHandler>();
decoders.add(lengthDecoder);
decoders.add(stringDecoder);
List<ChannelHandler> encoders = new ArrayList<ChannelHandler>();
encoders.add(lengthEncoder);
encoders.add(stringEncoder);
registry.bind("encoders", encoders);
registry.bind("decoders", decoders);Spring 的原生集合支持可用于在应用程序上下文中指定 codec 列表
<util:list id="decoders" list-class="java.util.LinkedList">
<bean class="org.apache.camel.component.netty.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder">
<constructor-arg value="1048576"/>
<constructor-arg value="0"/>
<constructor-arg value="4"/>
<constructor-arg value="0"/>
<constructor-arg value="4"/>
</bean>
<bean class="io.netty.handler.codec.string.StringDecoder"/>
</util:list>
<util:list id="encoders" list-class="java.util.LinkedList">
<bean class="io.netty.handler.codec.LengthFieldPrepender">
<constructor-arg value="4"/>
</bean>
<bean class="io.netty.handler.codec.string.StringEncoder"/>
</util:list>
<bean id="length-encoder" class="io.netty.handler.codec.LengthFieldPrepender">
<constructor-arg value="4"/>
</bean>
<bean id="string-encoder" class="io.netty.handler.codec.string.StringEncoder"/>
<bean id="length-decoder" class="org.apache.camel.component.netty.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder">
<constructor-arg value="1048576"/>
<constructor-arg value="0"/>
<constructor-arg value="4"/>
<constructor-arg value="0"/>
<constructor-arg value="4"/>
</bean>
<bean id="string-decoder" class="io.netty.handler.codec.string.StringDecoder"/>然后,bean 名称可以在 netty 端点定义中使用,可以是逗号分隔列表或包含在 List e.g 中。
from("direct:multiple-codec").to("netty:tcp://0.0.0.0:{{port}}?encoders=#encoders&sync=false");
from("netty:tcp://0.0.0.0:{{port}}?decoders=#length-decoder,#string-decoder&sync=false").to("mock:multiple-codec");或通过 XML.
<camelContext id="multiple-netty-codecs-context" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:multiple-codec"/>
<to uri="netty:tcp://0.0.0.0:5150?encoders=#encoders&sync=false"/>
</route>
<route>
<from uri="netty:tcp://0.0.0.0:5150?decoders=#length-decoder,#string-decoder&sync=false"/>
<to uri="mock:multiple-codec"/>
</route>
</camelContext>36.8. 完成后关闭频道
当充当服务器时,有时您想要在频道后关闭该频道,例如,客户端转换已完成。
只需设置 endpoint 选项 disconnect=true 即可完成此操作。
但是,您也可以在每条消息上指示 Camel,如下所示:
要指示 Camel 关闭频道,您应该添加一个将密钥 CamelNettyCloseChannelWhenComplete 设置为布尔值 true 的标头。
例如,以下示例会在将 bye 消息写回客户端后关闭该频道:
from("netty:tcp://0.0.0.0:8080").process(new Processor() {
public void process(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
exchange.getOut().setBody("Bye " + body);
// some condition which determines if we should close
if (close) {
exchange.getOut().setHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, true);
}
}
});添加自定义频道管道工厂以完全控制所创建的管道。
36.9. 自定义管道
自定义频道管道通过插入自定义处理器、编码程序和解码器,为用户提供对处理程序/中断链的完整控制,而无需以非常简单的方式在 Netty Endpoint URL 中指定它们。
要添加自定义管道,必须创建一个自定义频道管道工厂,并通过上下文 registry (Registry)或 camel-spring ApplicationContextRegistry 等上下文注册。
必须构建自定义管道工厂,如下所示
-
Producer 链接频道管道工厂必须扩展抽象类
ClientPipelineFactory。 -
Consumer linked 频道管道工厂必须扩展抽象类
ServerInitializerFactory。 -
类应覆盖 initChannel ()方法,以插入自定义处理程序、编码器和解码器。不覆盖
initChannel ()方法会创建一个没有处理程序、编码器或解码器到管道的管道。
以下示例显示了如何创建 ServerInitializerFactory factory
36.9.1. 使用自定义管道工厂
public class SampleServerInitializerFactory extends ServerInitializerFactory {
private int maxLineSize = 1024;
protected void initChannel(Channel ch) throws Exception {
ChannelPipeline channelPipeline = ch.pipeline();
channelPipeline.addLast("encoder-SD", new StringEncoder(CharsetUtil.UTF_8));
channelPipeline.addLast("decoder-DELIM", new DelimiterBasedFrameDecoder(maxLineSize, true, Delimiters.lineDelimiter()));
channelPipeline.addLast("decoder-SD", new StringDecoder(CharsetUtil.UTF_8));
// here we add the default Camel ServerChannelHandler for the consumer, to allow Camel to route the message etc.
channelPipeline.addLast("handler", new ServerChannelHandler(consumer));
}
}然后,可以通过以下方法将自定义频道管道工厂添加到 registry 中,并在 camel 路由上实例化/使用
Registry registry = camelContext.getRegistry();
ServerInitializerFactory factory = new TestServerInitializerFactory();
registry.bind("spf", factory);
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty:tcp://0.0.0.0:5150?serverInitializerFactory=#spf"
String return_string =
"When You Go Home, Tell Them Of Us And Say,"
+ "For Your Tomorrow, We Gave Our Today.";
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});36.10. 重新使用 Netty boss 和 worker 线程池
Netty 具有两种类型的线程池:bos 和 worker。默认情况下,每个 Netty consumer 和 producer 都有自己的私有线程池。如果要在多个消费者或生成者中重复使用这些线程池,则必须在 Registry 中创建并列出线程池。
例如,我们可以使用带有 2 个 worker 线程的 NettyWorkerPoolBuilder 创建共享 worker 线程池,如下所示:
<!-- use the worker pool builder to help create the shared thread pool -->
<bean id="poolBuilder" class="org.apache.camel.component.netty.NettyWorkerPoolBuilder">
<property name="workerCount" value="2"/>
</bean>
<!-- the shared worker thread pool -->
<bean id="sharedPool" class="org.jboss.netty.channel.socket.nio.WorkerPool"
factory-bean="poolBuilder" factory-method="build" destroy-method="shutdown">
</bean>
对于 boss 线程池,有一个 org.apache.camel.component.netty.NettyServerBossPoolBuilder 构建器用于 Netty 用户,而 org.apache.camel.component.netty.NettyClientBossPoolBuilder 用于 Netty producers。
然后,在 Camel 路由中,通过配置 URI 中的 workerPool 选项,如下所示:
<route> <from uri="netty:tcp://0.0.0.0:5021?textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/> <to uri="log:result"/> ... </route>
如果我们有另一个路由,我们可以引用共享 worker 池:
<route> <from uri="netty:tcp://0.0.0.0:5022?textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/> <to uri="log:result"/> ... </route>
以此类推。
36.11. 通过带有请求/恢复的单个连接进行多路并发消息
当通过 netty producer 使用 Netty 进行请求/恢复消息传递时,默认情况下,每个消息都会通过非共享连接(池)发送。这样可确保回复自动映射到正确的请求线程,以便在 Camel 中进一步路由。请求/回复之间的其他词语关联发生开箱即用,因为回复回到用于发送请求的同一连接上;此连接不与他人共享。当响应返回时,连接会返回连接池,以供其他人重复使用。
但是,如果您想要在单个共享连接上有多个并发请求/响应,则需要通过设置 producerPoolEnabled=false 来关闭连接池。现在,如果回复没有顺序,则可能会出现交集响应的问题。因此,您需要在请求和回复消息中有一个关联 id,以便您可以正确地将回复与负责继续处理 Camel 消息的 Camel 回调相关联。为此,您需要实施 NettyCamelStateCorrelationManager 作为相关管理器,并通过 correlationManager=#myManager 选项进行配置。
我们建议在构建自定义关联管理器时扩展 TimeoutCorrelationManagerSupport。这支持超时和其他复杂性,否则您还需要实施。
您可以在 camel-example-netty-custom-correlation 目录下的 examples 目录中找到 Apache Camel 源代码的示例。
36.12. Spring Boot Auto-Configuration
当将 netty 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-netty-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 74 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.netty.allow-default-codec | netty 组件同时会安装一个默认的 codec,编码器/解码器为 null,textline 为 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件将默认 codec 安装为过滤器链中的第一个元素。 | true | 布尔值 |
| camel.component.netty.allow-serialized-headers | 仅在 transferExchange 为 true 时用于 TCP。当设置为 true 时,标头和属性中的串行对象将添加到交换中。否则,Camel 将排除任何非序列化对象,并在 WARN 级别记录它。 | false | 布尔值 |
| camel.component.netty.auto-append-delimiter | 使用文本代码c发送时是否自动附加缺少的结束分隔符。 | true | 布尔值 |
| camel.component.netty.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.netty.backlog | 允许为 netty 使用者(server)配置积压。请注意,积压只是根据操作系统的最佳努力。将此选项设置为值,如 200、500 或 1000,告诉 TCP 堆栈接受队列在没有配置此选项时的时长,则 backlog 依赖于 OS 设置。 | 整数 | |
| camel.component.netty.boss-count | 当 netty 在 nio 模式下工作时,它使用 Netty 中的默认 bossCount 参数,即 1。用户可以使用此选项覆盖 Netty 中的默认 bossCount。 | 1 | 整数 |
| camel.component.netty.boss-group | 设置 BossGroup,可用于处理 NettyEndpoint 之间的服务器端的新连接。选项是一个 io.netty.channel.EventLoopGroup 类型。 | EventLoopGroup | |
| camel.component.netty.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.netty.broadcast | 设置 以选择通过 UDP 进行多播。 | false | 布尔值 |
| camel.component.netty.channel-group | 使用显式 ChannelGroup。选项是一个 io.netty.channel.group.ChannelGroup 类型。 | ChannelGroup | |
| camel.component.netty.client-initializer-factory | 使用自定义 ClientInitializerFactory。选项是 org.apache.camel.component.netty.ClientInitializerFactory 类型。 | ClientInitializerFactory | |
| camel.component.netty.client-mode | 如果 clientMode 为 true,netty 使用者会将地址作为 TCP 客户端连接。 | false | 布尔值 |
| camel.component.netty.configuration | 在创建端点时,将 NettyConfiguration 用作配置。选项是 org.apache.camel.component.netty.NettyConfiguration 类型。 | NettyConfiguration | |
| camel.component.netty.connect-timeout | 等待套接字连接可用的时间。值以毫秒为单位。 | 10000 | 整数 |
| camel.component.netty.correlation-manager | 要使用自定义关联管理器,在将 request/reply 与 netty producer 搭配使用时,管理请求和回复消息的方式。只有当您有办法将请求与回复一起映射时,才应使用此参数,例如,在请求和回复消息中存在关联 ids 时。如果您希望在 netty 的同一频道(也称为 连接)上的多路并发消息,则可以使用它。执行此操作时,您必须有一种方法来关联请求和回复消息,以便您可以在 inflight Camel Exchange 上存储正确的回复,然后再继续路由。我们建议在构建自定义关联管理器时扩展 TimeoutCorrelationManagerSupport。这支持超时和其他复杂性,否则您还需要实施。如需了解更多详细信息,请参阅 producerPoolEnabled 选项。选项是一个 org.apache.camel.component.netty.NettyCamelStateCorrelationManager 类型。 | NettyCamelStateCorrelationManager | |
| camel.component.netty.decoder-max-line-length | 用于文本line codec 的最大行长度。 | 1024 | 整数 |
| camel.component.netty.decoders | 要使用的解码器列表。您可以使用带有逗号分隔值的 String,并在 Registry 中查找值。只需记得使用 # 为值添加前缀,以便 Camel 知道它应该查找。 | 字符串 | |
| camel.component.netty.delimiter | 用于文本解码器的分隔符。可能的值有 LINE 和 NULL。 | TextLineDelimiter | |
| camel.component.netty.disconnect | 使用后是否断开(关闭)与 Netty 频道的连接。可用于使用者和制作者。 | false | 布尔值 |
| camel.component.netty.disconnect-on-no-reply | 如果启用了同步,则此选项将指定 NettyConsumer (如果应该断开没有回复发送)。 | true | 布尔值 |
| camel.component.netty.enabled | 是否启用 netty 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.netty.enabled-protocols | 使用 SSL 时要启用哪些协议。 | TLSv1,TLSv1.1,TLSv1.2 | 字符串 |
| camel.component.netty.encoders | 要使用的编码器列表。您可以使用带有逗号分隔值的 String,并在 Registry 中查找值。只需记得使用 # 为值添加前缀,以便 Camel 知道它应该查找。 | 字符串 | |
| camel.component.netty.encoding | 用于文本代码的编码(charset name)。如果没有提供,Camel 将使用 JVM 默认 Charset。 | 字符串 | |
| camel.component.netty.executor-service | 使用给定的 EventExecutorGroup。选项是一个 io.netty.util.concurrent.EventExecutorGroup 类型。 | EventExecutorGroup | |
| camel.component.netty.hostname-verification | 要在 SSLEngine 上启用/禁用主机名验证。 | false | 布尔值 |
| camel.component.netty.keep-alive | 设置 以确保套接字因为不活跃而不会被关闭。 | true | 布尔值 |
| camel.component.netty.key-store-file | 用于加密的客户端证书密钥存储。 | File | |
| camel.component.netty.key-store-format | 用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS。 | 字符串 | |
| camel.component.netty.key-store-resource | 用于加密的客户端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| camel.component.netty.lazy-channel-creation | 如果远程服务器没有启动并在 Camel 制作者启动时运行,则可以创建频道以避免异常。 | true | 布尔值 |
| camel.component.netty.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.netty.maximum-pool-size | 为 netty consumer 排序线程池设置最大线程池大小。默认大小为 2 x cpu_core 加 1。将此值设置为 eg 10 将随后使用 10 个线程,除非 2 x cpu_core 加 1 是一个更高的值,然后会被覆盖和使用。例如,如果有 8 个内核,则消费者线程池将为 17。此线程池用于路由 Camel 从 Netty 接收的消息。我们使用单独的线程池来确保对消息的排序,在某些消息中将阻止,然后 nettys worker 线程(事件循环)不受影响。 | 整数 | |
| camel.component.netty.native-transport | 是否使用原生传输而不是 NIO。原生传输利用主机操作系统,且只在某些平台上受支持。您需要为您使用的主机操作系统添加 netty JAR。要查看更多详情,请访问: | false | 布尔值 |
| camel.component.netty.need-client-auth | 配置服务器在使用 SSL 时是否需要客户端身份验证。 | false | 布尔值 |
| camel.component.netty.netty-server-bootstrap-factory | 使用自定义 NettyServerBootstrapFactory。选项是一个 org.apache.camel.component.netty.NettyServerBootstrapFactory 类型。 | NettyServerBootstrapFactory | |
| camel.component.netty.network-interface | 使用 UDP 时,此选项可用于按照其名称指定网络接口,如 eth0 以加入多播组。 | 字符串 | |
| camel.component.netty.no-reply-log-level | 如果启用了 sync,则此选项指定了在记录没有回复发送时要使用的 NettyConsumer 的日志记录级别。 | LoggingLevel | |
| camel.component.netty.options | 允许使用 选项配置额外的 netty 选项。作为前缀。例如 option.child.keepAlive=false 来设置 netty 选项 sub.keepAlive=false。有关可以使用的选项,请参阅 Netty 文档。 | map | |
| camel.component.netty.passphrase | 使用的密码设置,以便加密/解密使用 SSH 发送的载荷。 | 字符串 | |
| camel.component.netty.producer-pool-enabled | 是否启用了制作者池。重要:如果您关闭这个连接,则也会将单个共享连接用于制作者。这意味着,如果回复没有排序,则可能会出现交错响应的问题。因此,您需要在请求和回复消息中有一个关联 id,以便您可以正确地将回复与负责继续处理 Camel 消息的 Camel 回调相关联。为此,您需要实施 NettyCamelStateCorrelationManager 作为关联管理器,并通过 correlationManager 选项进行配置。如需更多详细信息,请参阅 correlationManager 选项。 | true | 布尔值 |
| camel.component.netty.producer-pool-max-idle | 根据池中空闲实例的数量设置 cap。 | 100 | 整数 |
| camel.component.netty.producer-pool-max-total | 设置给定时间上可由池分配(签出给客户端)或闲置等待签出的对象数量上限。对没有限制使用负值。 | -1 | 整数 |
| camel.component.netty.producer-pool-min-evictable-idle | 设置对象可能处于空闲时间的最小值(以millis 中的值),然后才能被闲置对象驱除器进行驱除。 | 300000 | Long |
| camel.component.netty.producer-pool-min-idle | 在驱除器线程(如果为 active)生成新对象前,设置制作者池中允许的最小实例数量。 | 整数 | |
| camel.component.netty.receive-buffer-size | 在入站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | 整数 |
| camel.component.netty.receive-buffer-size-predictor | 配置缓冲区大小预测器。请参阅 Jetty 文档和此邮件线程的详细信息。 | 整数 | |
| camel.component.netty.reconnect | 仅在消费者中的 clientMode 中使用,如果启用此功能,消费者将尝试重新连接。 | true | 布尔值 |
| camel.component.netty.reconnect-interval | 如果启用了 reconnect 和 clientMode,则使用。尝试重新连接的时间间隔(以秒为单位)。 | 10000 | 整数 |
| camel.component.netty.request-timeout | 在调用远程服务器时,允许在 Netty producer 中使用超时。默认情况下,不使用超时。该值以秒为单位,因此 eg 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 来触发超时。 | Long | |
| camel.component.netty.reuse-address | 设置 有助于套接字多路复用. | true | 布尔值 |
| camel.component.netty.reuse-channel | 此选项允许生产者和消费者(客户端模式)在处理 Exchange 的生命周期中重复使用相同的 Netty Channel。如果您需要在 Camel 路由中多次调用服务器,并希望使用相同的网络连接,这将非常有用。使用这个选项时,频道不会返回到连接池,直到 Exchange 完成为止,如果 disconnect 选项设为 true,则频道不会返回到连接池。重复使用的频道保存在 Exchange 上,使用密钥 NettyConstants#NETTY_CHANNEL (允许您在路由期间获取频道并使用它)。 | false | 布尔值 |
| camel.component.netty.security-provider | 用于有效负载加密的安全供应商。如果没有设置,则默认为 SunX509。 | 字符串 | |
| camel.component.netty.send-buffer-size | 在出站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | 整数 |
| camel.component.netty.server-closed-channel-exception-caught-log-level | 如果服务器(NettyConsumer)捕获 java.nio.channels.ClosedChannelException,则使用此日志记录级别记录。这用于避免记录关闭的频道异常,因为客户端可能会断开停滞,然后在 Netty 服务器中造成大量关闭异常。 | LoggingLevel | |
| camel.component.netty.server-exception-caught-log-level | 如果服务器(NettyConsumer)捕获了一个异常,则使用这个日志记录级别记录。 | LoggingLevel | |
| camel.component.netty.server-initializer-factory | 使用自定义 ServerInitializerFactory。选项是 org.apache.camel.component.netty.ServerInitializerFactory 类型。 | ServerInitializerFactory | |
| camel.component.netty.ssl | 设置以指定是否将 SSL 加密应用到此端点。 | false | 布尔值 |
| camel.component.netty.ssl-client-cert-headers | 在 SSL 模式中和启用后,Netty consumer 将增强 Camel 消息及标头有关客户端证书的信息,如主题名称、签发者名称、序列号和有效日期范围。 | false | 布尔值 |
| camel.component.netty.ssl-context-parameters | 使用 SSLContextParameters 配置安全性。选项是 org.apache.camel.support.jsse.SSLContextParameters 类型。 | SSLContextParameters | |
| camel.component.netty.ssl-handler | 对可用于返回 SSL 处理程序的类的引用。选项是 io.netty.handler.ssl.SslHandler 类型。 | SslHandler | |
| camel.component.netty.sync | 设置为将端点设置为单向或请求响应。 | true | 布尔值 |
| camel.component.netty.tcp-no-delay | 设置 以提高 TCP 协议性能。 | true | 布尔值 |
| camel.component.netty.textline | 仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的标志。如果没有指定,或者值为 false,则通过 TCP 假定 Object Serialization,但默认只允许 String 序列化。 | false | 布尔值 |
| camel.component.netty.transfer-exchange | 仅用于 TCP。您可以通过线路来传输交换,而不只是正文。以下字段已传输:在正文、出口正文、错误正文、In headers、out 标头、错误标头、交换属性、交换属性中。这要求对象是串行的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。 | false | 布尔值 |
| camel.component.netty.trust-store-file | 用于加密的服务器端证书密钥存储。 | File | |
| camel.component.netty.trust-store-resource | 用于加密的服务器端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
| camel.component.netty.udp-byte-array-codec | 仅针对 UDP。如果启用使用字节数组 codec 而不是 Java 序列化协议。 | false | 布尔值 |
| camel.component.netty.udp-connectionless-sending | 这个选项支持连接较少的 udp 发送,这些连接是实际触发和忘记。如果没有侦听接收端口,则连接的 udp 会接收 PortUnreachableException。 | false | 布尔值 |
| camel.component.netty.use-byte-buf | 如果 useByteBuf 为 true,netty producer 会在发送邮件前将消息正文转换为 ByteBuf。 | false | 布尔值 |
| camel.component.netty.use-global-ssl-context-parameters | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| camel.component.netty.using-executor-service | 是否使用 ordered 线程池,以确保事件在同一频道中按顺序处理。 | true | 布尔值 |
| camel.component.netty.worker-count | 当 netty 在 nio 模式下工作时,它使用 Netty (cpu_core_threads x 2)的默认 workerCount 参数。用户可以使用此选项覆盖 Netty 中的默认 workerCount。 | 整数 | |
| camel.component.netty.worker-group | 使用显式 EventLoopGroup 作为 boss 线程池。例如,与多个消费者或生成者共享线程池。默认情况下,每个使用者或制作者都有自己的 worker 池,具有 2 x cpu count core 线程。选项是一个 io.netty.channel.EventLoopGroup 类型。 | EventLoopGroup |
第 37 章 Paho
支持制作者和使用者
Paho 组件使用 Eclipse Paho 库 为 MQTT 消息传递协议提供连接器。Paho 是最流行的 MQTT 库之一,因此如果您想将其与 Java 项目集成 - Camel Paho connector 是进入的一种方法。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-paho</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>37.1. URI 格式
paho:topic[?options]
其中 topic 是主题的名称。
37.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
37.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
37.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。
换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
37.3. 组件选项
Paho 组件支持 31 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| automaticReconnect (common) | 如果连接丢失,设置客户端是否会自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动重新连接到服务器。如果设置为 true,如果连接丢失,客户端将尝试重新连接到服务器。在尝试重新连接 1 秒前,它会首先等待 1 秒,每次尝试失败的重新连接尝试时,延迟会加倍,直到延迟时间为 2 分钟。 | true | 布尔值 |
| brokerUrl (common) | MQTT 代理的 URL。 | tcp://localhost:1883 | 字符串 |
| cleanSession (common) | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,则客户端和服务器在重新启动客户端后将保持状态、服务器和连接。维护状态:消息交付将满足指定的 QOS,即使客户端、服务器或连接被重启也是如此。服务器会将订阅视为持久。如果设置为 true,则客户端和服务器在重启客户端、服务器或连接后不会维护状态。这意味着,如果客户端、服务器或连接被重启,则消息发送到指定的 QOS 不能被维护。服务器会将订阅视为不可配置。 | true | 布尔值 |
| clientID (common) | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
| 配置 (common) | 使用共享 Paho 配置。 | PahoConfiguration | |
| connectionTimeout (common) | 设置连接超时值。此值以秒为单位测量,定义客户端将等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。值 0 禁用超时处理,这意味着客户端将等到网络连接成功或失败。 | 30 | int |
| filePersistenceDirectory (common) | 文件持久性使用的基础目录。默认情况下,将使用 user 目录。 | 字符串 | |
| keepAliveInterval (common) | 设置 keep alive 间隔。这个值(以秒为单位)定义发送或接收消息之间的最长时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保至少一条消息在各个网络间传输,并保持上线时间。在一段时间内没有与数据相关的消息,客户端会发送非常小的 ping 消息,服务器将确认。值 0 可禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | int |
| maxInflight (common) | 设置最大 inflight。请在高流量环境中增加这个值。默认值为 10。 | 10 | int |
| maxReconnectDelay (common) | 获取在重新连接之间等待的最长时间(在 millis 中)。 | 128000 | int |
| mqttVersion (common) | 设置 MQTT 版本。默认操作是连接到 3.1.1 版本,如果失败,则回退到 3.1。通过分别使用 MQTT_VERSION_3_1_1 或 MQTT_VERSION_3_1 选项,可以专门选择版本 3.1.1 或 3.1,无回退。 | int | |
| 持久性 (通用) | 要使用的客户端持久性 - 内存或文件。 Enum 值:
| 内存 | PahoPersistence |
| QoS (common) | 客户端服务质量级别(0-2)。 | 2 | int |
| 保留 (common) | 保留选项。 | false | 布尔值 |
| serverURIs (common) | 设置客户端可以连接到的一个或多个 serverURIs 列表。可以用逗号分隔多个服务器。每个 serverURI 指定客户端可以连接的服务器的地址。对于 TCP 连接,支持两种连接,tcp:// 用于 TCP 连接,ssl:// 用于 SSL/TLS 保护的 TCP 连接。例如:如果未指定端口,则 tcp://localhost:1883 ssl://localhost:8883 将默认为 tcp:// URIs 的 1883,ssl:// URI 的 8883 将默认为 8883。如果设置了 serverURIs,则会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接时,客户端将从列表中的第一个 serverURI 开始,并操作列表,直到与服务器建立连接为止。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接多个用途的服务器列表:高可用性和可靠的消息发送某些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,无论客户端连接到哪个服务器是什么,都可确保消息得到可靠地交付和持久化订阅。如果需要持久化订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可以指定不相等的一组服务器(如高可用性选项中所示)。因为没有状态在服务器间共享,可靠的消息发送和持久化订阅无效。如果使用 hunt 列表模式,则 cleansession 标志必须设置为 true。 | 字符串 | |
| willPayload (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | 字符串 | |
| willQos (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | int | |
| willRetained (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | false | 布尔值 |
| willTopic (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 客户端 (高级) | 使用共享 Paho 客户端。 | MqttClient | |
| customWebSocketHeaders (高级) | 设置 WebSocket 连接的自定义 WebSocket 标头。 | Properties | |
| executorServiceTimeout (高级) | 设置在强制终止前 executor 服务在终止时应等待的时间(以秒为单位)。除非绝对确定您需要,否则不建议更改此值。 | 1 | int |
| httpsHostnameVerificationEnabled (security) | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
| 密码 (安全) | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
| socketFactory (security) | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 来提供特定于应用的安全设置。 | SocketFactory | |
| sslClientProps (security) | 设置连接的 SSL 属性。请注意,只有实施 Java 安全套接字扩展(JSSE)时,这些属性才有效。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性:com.ibm.ssl.protocol One of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的文件名称。例如,/mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 是您希望 KeyManager 使用的 KeyStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key store,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider Key 存储供应商,如 IBMJCE 或 IBMJCEFIPS. com.ibm .SSL.trustStore 包含信任管理器要使用的 KeyStore 对象的文件名。com.ibm.ssl.trustStorePassword 是您希望 TrustManager 使用的 TrustStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 您希望默认 TrustManager 使用的 KeyStore 对象类型。与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表启用了哪些密码。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置将用于实例化 KeyManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中可用的默认算法。示例值:PKIX 或 IBMJ9X509. | Properties | |
| sslHostnameVerifier (security) | 为 SSL 连接设置 HostnameVerifier。请注意,它将在连接的握手后使用,当主机名验证错误时,应自行执行操作。没有默认的 HostnameVerifier。 | HostnameVerifier | |
| 用户名 (安全) | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 |
37.4. 端点选项
Paho 端点使用 URI 语法进行配置:
paho:topic
使用以下路径和查询参数:
37.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| Topic (common) | 主题 所需的 名称。 | 字符串 |
37.4.2. 查询参数(31 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| automaticReconnect (common) | 如果连接丢失,设置客户端是否会自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动重新连接到服务器。如果设置为 true,如果连接丢失,客户端将尝试重新连接到服务器。在尝试重新连接 1 秒前,它会首先等待 1 秒,每次尝试失败的重新连接尝试时,延迟会加倍,直到延迟时间为 2 分钟。 | true | 布尔值 |
| brokerUrl (common) | MQTT 代理的 URL。 | tcp://localhost:1883 | 字符串 |
| cleanSession (common) | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,则客户端和服务器在重新启动客户端后将保持状态、服务器和连接。维护状态:消息交付将满足指定的 QOS,即使客户端、服务器或连接被重启也是如此。服务器会将订阅视为持久。如果设置为 true,则客户端和服务器在重启客户端、服务器或连接后不会维护状态。这意味着,如果客户端、服务器或连接被重启,则消息发送到指定的 QOS 不能被维护。服务器会将订阅视为不可配置。 | true | 布尔值 |
| clientID (common) | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
| connectionTimeout (common) | 设置连接超时值。此值以秒为单位测量,定义客户端将等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。值 0 禁用超时处理,这意味着客户端将等到网络连接成功或失败。 | 30 | int |
| filePersistenceDirectory (common) | 文件持久性使用的基础目录。默认情况下,将使用 user 目录。 | 字符串 | |
| keepAliveInterval (common) | 设置 keep alive 间隔。这个值(以秒为单位)定义发送或接收消息之间的最长时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保至少一条消息在各个网络间传输,并保持上线时间。在一段时间内没有与数据相关的消息,客户端会发送非常小的 ping 消息,服务器将确认。值 0 可禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | int |
| maxInflight (common) | 设置最大 inflight。请在高流量环境中增加这个值。默认值为 10。 | 10 | int |
| maxReconnectDelay (common) | 获取在重新连接之间等待的最长时间(在 millis 中)。 | 128000 | int |
| mqttVersion (common) | 设置 MQTT 版本。默认操作是连接到 3.1.1 版本,如果失败,则回退到 3.1。通过分别使用 MQTT_VERSION_3_1_1 或 MQTT_VERSION_3_1 选项,可以专门选择版本 3.1.1 或 3.1,无回退。 | int | |
| 持久性 (通用) | 要使用的客户端持久性 - 内存或文件。 Enum 值:
| 内存 | PahoPersistence |
| QoS (common) | 客户端服务质量级别(0-2)。 | 2 | int |
| 保留 (common) | 保留选项。 | false | 布尔值 |
| serverURIs (common) | 设置客户端可以连接到的一个或多个 serverURIs 列表。可以用逗号分隔多个服务器。每个 serverURI 指定客户端可以连接的服务器的地址。对于 TCP 连接,支持两种连接,tcp:// 用于 TCP 连接,ssl:// 用于 SSL/TLS 保护的 TCP 连接。例如:如果未指定端口,则 tcp://localhost:1883 ssl://localhost:8883 将默认为 tcp:// URIs 的 1883,ssl:// URI 的 8883 将默认为 8883。如果设置了 serverURIs,则会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接时,客户端将从列表中的第一个 serverURI 开始,并操作列表,直到与服务器建立连接为止。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接多个用途的服务器列表:高可用性和可靠的消息发送某些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,无论客户端连接到哪个服务器是什么,都可确保消息得到可靠地交付和持久化订阅。如果需要持久化订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可以指定不相等的一组服务器(如高可用性选项中所示)。因为没有状态在服务器间共享,可靠的消息发送和持久化订阅无效。如果使用 hunt 列表模式,则 cleansession 标志必须设置为 true。 | 字符串 | |
| willPayload (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | 字符串 | |
| willQos (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | int | |
| willRetained (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | false | 布尔值 |
| willTopic (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 客户端 (高级) | 使用现有的 mqtt 客户端。 | MqttClient | |
| customWebSocketHeaders (高级) | 设置 WebSocket 连接的自定义 WebSocket 标头。 | Properties | |
| executorServiceTimeout (高级) | 设置在强制终止前 executor 服务在终止时应等待的时间(以秒为单位)。除非绝对确定您需要,否则不建议更改此值。 | 1 | int |
| httpsHostnameVerificationEnabled (security) | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
| 密码 (安全) | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
| socketFactory (security) | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 来提供特定于应用的安全设置。 | SocketFactory | |
| sslClientProps (security) | 设置连接的 SSL 属性。请注意,只有实施 Java 安全套接字扩展(JSSE)时,这些属性才有效。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性:com.ibm.ssl.protocol One of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的文件名称。例如,/mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 是您希望 KeyManager 使用的 KeyStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key store,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider Key 存储供应商,如 IBMJCE 或 IBMJCEFIPS. com.ibm .SSL.trustStore 包含信任管理器要使用的 KeyStore 对象的文件名。com.ibm.ssl.trustStorePassword 是您希望 TrustManager 使用的 TrustStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 您希望默认 TrustManager 使用的 KeyStore 对象类型。与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表启用了哪些密码。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置将用于实例化 KeyManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中可用的默认算法。示例值:PKIX 或 IBMJ9X509. | Properties | |
| sslHostnameVerifier (security) | 为 SSL 连接设置 HostnameVerifier。请注意,它将在连接的握手后使用,当主机名验证错误时,应自行执行操作。没有默认的 HostnameVerifier。 | HostnameVerifier | |
| 用户名 (安全) | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 |
37.5. Headers
以下标头由 Paho 组件识别:
| 标头 | Java 常数 | 端点类型 | 值类型 | 描述 |
|---|---|---|---|---|
| CamelMqttTopic | PahoConstants.MQTT_TOPIC | 消费者 | 字符串 | 主题的名称 |
| CamelMqttQoS | PahoConstants.MQTT_QOS | 消费者 | 整数 | 传入消息的 QualityOfService |
| CamelPahoOverrideTopic | PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC | 制作者 | 字符串 | 覆盖并发送到的主题名称,而不是在端点中指定的主题 |
37.6. 默认有效负载类型
默认情况下,Camel Paho 组件在提取的二进制有效负载上运行(或放入)MQTT 消息:
// Receive payload
byte[] payload = (byte[]) consumerTemplate.receiveBody("paho:topic");
// Send payload
byte[] payload = "message".getBytes();
producerTemplate.sendBody("paho:topic", payload);
但是,Camel build-in 类型转换 API 可以为您执行自动数据类型转换。在以下示例中,Camel 会自动将二进制有效负载转换为 字符串 (并传递):
// Receive payload
String payload = consumerTemplate.receiveBody("paho:topic", String.class);
// Send payload
String payload = "message";
producerTemplate.sendBody("paho:topic", payload);37.7. Samples
例如,以下片段从在与 Camel 路由器相同的主机上安装的 MQTT 代理读取消息:
from("paho:some/queue")
.to("mock:test");以下片段将信息发送到 MQTT 代理:
from("direct:test")
.to("paho:some/target/queue");例如,如何从远程 MQTT 代理中读取信息:
from("paho:some/queue?brokerUrl=tcp://iot.eclipse.org:1883")
.to("mock:test");在这里,我们覆盖默认主题,并设置为动态主题
from("direct:test")
.setHeader(PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC, simple("${header.customerId}"))
.to("paho:some/target/queue");37.8. Spring Boot Auto-Configuration
在 Spring Boot 中使用 paho 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-paho-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 32 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.paho.automatic-reconnect | 如果连接丢失,设置客户端是否会自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动重新连接到服务器。如果设置为 true,如果连接丢失,客户端将尝试重新连接到服务器。在尝试重新连接 1 秒前,它会首先等待 1 秒,每次尝试失败的重新连接尝试时,延迟会加倍,直到延迟时间为 2 分钟。 | true | 布尔值 |
| camel.component.paho.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.paho.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.paho.broker-url | MQTT 代理的 URL。 | tcp://localhost:1883 | 字符串 |
| camel.component.paho.clean-session | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,则客户端和服务器在重新启动客户端后将保持状态、服务器和连接。维护状态:消息交付将满足指定的 QOS,即使客户端、服务器或连接被重启也是如此。服务器会将订阅视为持久。如果设置为 true,则客户端和服务器在重启客户端、服务器或连接后不会维护状态。这意味着,如果客户端、服务器或连接被重启,则消息发送到指定的 QOS 不能被维护。服务器会将订阅视为不可配置。 | true | 布尔值 |
| camel.component.paho.client | 使用共享 Paho 客户端。选项是一个 org.eclipse.paho.client.mqttv3.MqttClient 类型。 | MqttClient | |
| camel.component.paho.client-id | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
| camel.component.paho.configuration | 使用共享 Paho 配置。选项是 org.apache.camel.component.paho.PahoConfiguration 类型。 | PahoConfiguration | |
| camel.component.paho.connection-timeout | 设置连接超时值。此值以秒为单位测量,定义客户端将等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。值 0 禁用超时处理,这意味着客户端将等到网络连接成功或失败。 | 30 | 整数 |
| camel.component.paho.custom-web-socket-headers | 设置 WebSocket 连接的自定义 WebSocket 标头。选项是一个 java.util.Properties 类型。 | Properties | |
| camel.component.paho.enabled | 是否启用 paho 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.paho.executor-service-timeout | 设置在强制终止前 executor 服务在终止时应等待的时间(以秒为单位)。除非绝对确定您需要,否则不建议更改此值。 | 1 | 整数 |
| camel.component.paho.file-persistence-directory | 文件持久性使用的基础目录。默认情况下,将使用 user 目录。 | 字符串 | |
| camel.component.paho.https-hostname-verification-enabled | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
| camel.component.paho.keep-alive-interval | 设置 keep alive 间隔。这个值(以秒为单位)定义发送或接收消息之间的最长时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保至少一条消息在各个网络间传输,并保持上线时间。在一段时间内没有与数据相关的消息,客户端会发送非常小的 ping 消息,服务器将确认。值 0 可禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | 整数 |
| camel.component.paho.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.paho.max-inflight | 设置最大 inflight。请在高流量环境中增加这个值。默认值为 10。 | 10 | 整数 |
| camel.component.paho.max-reconnect-delay | 获取在重新连接之间等待的最长时间(在 millis 中)。 | 128000 | 整数 |
| camel.component.paho.mqtt-version | 设置 MQTT 版本。默认操作是连接到 3.1.1 版本,如果失败,则回退到 3.1。通过分别使用 MQTT_VERSION_3_1_1 或 MQTT_VERSION_3_1 选项,可以专门选择版本 3.1.1 或 3.1,无回退。 | 整数 | |
| camel.component.paho.password | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
| camel.component.paho.persistence | 要使用的客户端持久性 - 内存或文件。 | PahoPersistence | |
| camel.component.paho.qos | 客户端服务质量级别(0-2)。 | 2 | 整数 |
| camel.component.paho.retained | 保留选项。 | false | 布尔值 |
| camel.component.paho.server-u-r-is | 设置客户端可以连接到的一个或多个 serverURIs 列表。可以用逗号分隔多个服务器。每个 serverURI 指定客户端可以连接的服务器的地址。对于 TCP 连接,支持两种连接,tcp:// 用于 TCP 连接,ssl:// 用于 SSL/TLS 保护的 TCP 连接。例如:如果未指定端口,则 tcp://localhost:1883 ssl://localhost:8883 将默认为 tcp:// URIs 的 1883,ssl:// URI 的 8883 将默认为 8883。如果设置了 serverURIs,则会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接时,客户端将从列表中的第一个 serverURI 开始,并操作列表,直到与服务器建立连接为止。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接多个用途的服务器列表:高可用性和可靠的消息发送某些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,无论客户端连接到哪个服务器是什么,都可确保消息得到可靠地交付和持久化订阅。如果需要持久化订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可以指定不相等的一组服务器(如高可用性选项中所示)。因为没有状态在服务器间共享,可靠的消息发送和持久化订阅无效。如果使用 hunt 列表模式,则 cleansession 标志必须设置为 true。 | 字符串 | |
| camel.component.paho.socket-factory | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 来提供特定于应用的安全设置。选项是 javax.net.SocketFactory 类型。 | SocketFactory | |
| camel.component.paho.ssl-client-props | 设置连接的 SSL 属性。请注意,只有实施 Java 安全套接字扩展(JSSE)时,这些属性才有效。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性:com.ibm.ssl.protocol One of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的文件名称。例如,/mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 是您希望 KeyManager 使用的 KeyStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key store,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider Key 存储供应商,如 IBMJCE 或 IBMJCEFIPS. com.ibm .SSL.trustStore 包含信任管理器要使用的 KeyStore 对象的文件名。com.ibm.ssl.trustStorePassword 是您希望 TrustManager 使用的 TrustStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 您希望默认 TrustManager 使用的 KeyStore 对象类型。与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表启用了哪些密码。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置将用于实例化 KeyManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中可用的默认算法。示例值:PKIX 或 IBMJ9X509.选项是一个 java.util.Properties 类型。 | Properties | |
| camel.component.paho.ssl-hostname-verifier | 为 SSL 连接设置 HostnameVerifier。请注意,它将在连接的握手后使用,当主机名验证错误时,应自行执行操作。没有默认的 HostnameVerifier。选项是一个 javax.net.ssl.HostnameVerifier 类型。 | HostnameVerifier | |
| camel.component.paho.user-name | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 | |
| camel.component.paho.will-payload | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | 字符串 | |
| camel.component.paho.will-qos | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | 整数 | |
| camel.component.paho.will-retained | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | false | 布尔值 |
| camel.component.paho.will-topic | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。消息是否应保留。 | 字符串 |
第 38 章 Paho MQTT 5
支持制作者和使用者
Paho MQTT5 组件使用带有 MQTT v5 的 Eclipse Paho 库为 MQTT 消息传递协议提供连接器。Paho 是最流行的 MQTT 库之一,因此如果您想将其与 Java 项目集成 - Camel Paho connector 是进入的一种方法。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-paho-mqtt5</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>38.1. URI 格式
paho-mqtt5:topic[?options]
其中 topic 是主题的名称。
38.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
38.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
38.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
38.3. 组件选项
Paho MQTT 5 组件支持 32 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| automaticReconnect (common) | 如果连接丢失,设置客户端是否会自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动重新连接到服务器。如果设置为 true,如果连接丢失,客户端将尝试重新连接到服务器。在尝试重新连接 1 秒前,它会首先等待 1 秒,每次尝试失败的重新连接尝试时,延迟会加倍,直到延迟时间为 2 分钟。 | true | 布尔值 |
| brokerUrl (common) | MQTT 代理的 URL。 | tcp://localhost:1883 | 字符串 |
| cleanStart (common) | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,则客户端和服务器在重新启动客户端后将保持状态、服务器和连接。维护状态:消息交付将满足指定的 QOS,即使客户端、服务器或连接被重启也是如此。服务器会将订阅视为持久。如果设置为 true,则客户端和服务器在重启客户端、服务器或连接后不会维护状态。这意味着,如果客户端、服务器或连接被重启,则消息发送到指定的 QOS 不能被维护。服务器会将订阅视为不可配置。 | true | 布尔值 |
| clientID (common) | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
| 配置 (common) | 使用共享 Paho 配置。 | PahoMqtt5Configuration | |
| connectionTimeout (common) | 设置连接超时值。此值以秒为单位测量,定义客户端将等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。值 0 禁用超时处理,这意味着客户端将等到网络连接成功或失败。 | 30 | int |
| filePersistenceDirectory (common) | 文件持久性使用的基础目录。默认情况下,将使用 user 目录。 | 字符串 | |
| keepAliveInterval (common) | 设置 keep alive 间隔。这个值(以秒为单位)定义发送或接收消息之间的最长时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保至少一条消息在各个网络间传输,并保持上线时间。在一段时间内没有与数据相关的消息,客户端会发送非常小的 ping 消息,服务器将确认。值 0 可禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | int |
| maxReconnectDelay (common) | 获取在重新连接之间等待的最长时间(在 millis 中)。 | 128000 | int |
| 持久性 (通用) | 要使用的客户端持久性 - 内存或文件。 Enum 值:
| 内存 | PahoMqtt5Persistence |
| QoS (common) | 客户端服务质量级别(0-2)。 | 2 | int |
| receiveMaximum (common) | 设置最大 Receive 的最大值。这个值代表了客户端将同时处理 QoS 1 和 QoS 2 出版物的限制。没有可限制服务器可能会尝试发送的 QoS 0 出版物的数量。默认值为 65535。 | 65535 | int |
| 保留 (common) | 保留选项。 | false | 布尔值 |
| serverURIs (common) | 设置客户端可以连接到的一个或多个 serverURIs 列表。可以用逗号分隔多个服务器。每个 serverURI 指定客户端可以连接的服务器的地址。对于 TCP 连接,支持两种连接,tcp:// 用于 TCP 连接,ssl:// 用于 SSL/TLS 保护的 TCP 连接。例如:如果未指定端口,则 tcp://localhost:1883 ssl://localhost:8883 将默认为 tcp:// URIs 的 1883,ssl:// URI 的 8883 将默认为 8883。如果设置了 serverURIs,则会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接时,客户端将从列表中的第一个 serverURI 开始,并操作列表,直到与服务器建立连接为止。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接多个用途的服务器列表:高可用性和可靠的消息发送某些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,无论客户端连接到哪个服务器是什么,都可确保消息得到可靠地交付和持久化订阅。如果需要持久化订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可以指定不相等的一组服务器(如高可用性选项中所示)。因为没有状态在服务器间共享,可靠的消息发送和持久化订阅无效。如果使用 hunt 列表模式,则 cleansession 标志必须设置为 true。 | 字符串 | |
| sessionExpiryInterval (common) | 设置会话过期间隔。这个值以秒为单位定义代理在客户端断开连接后维护会话的最长时间。如果客户端打算稍后连接到服务器,则客户端应只与较长的会话过期间隔连接。默认情况下,这个值为 -1,因此不会发送,在这种情况下,会话不会过期。如果发送了 0,则在网络连接关闭后,会话会立即结束。当客户端确定其不再用于会话时,它应该断开会话过期间隔设为 0。 | -1 | long |
| willMqttProperties (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。为消息设置的 MQTT 属性。 | MqttProperties | |
| willPayload (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。消息的字节有效负载。 | 字符串 | |
| willQos (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。发布消息的服务质量(0、1 或 2)。 | 1 | int |
| willRetained (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。消息是否应保留。 | false | 布尔值 |
| willTopic (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布的主题。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 客户端 (高级) | 使用共享 Paho 客户端。 | MqttClient | |
| customWebSocketHeaders (高级) | 设置 WebSocket 连接的自定义 WebSocket 标头。 | map | |
| executorServiceTimeout (高级) | 设置在强制终止前 executor 服务在终止时应等待的时间(以秒为单位)。除非绝对确定您需要,否则不建议更改此值。 | 1 | int |
| httpsHostnameVerificationEnabled (security) | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
| 密码 (安全) | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
| socketFactory (security) | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 来提供特定于应用的安全设置。 | SocketFactory | |
| sslClientProps (security) | 设置连接的 SSL 属性。请注意,只有实施 Java 安全套接字扩展(JSSE)时,这些属性才有效。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性:com.ibm.ssl.protocol One of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的文件名称。例如,/mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 是您希望 KeyManager 使用的 KeyStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key store,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider Key 存储供应商,如 IBMJCE 或 IBMJCEFIPS. com.ibm .SSL.trustStore 包含信任管理器要使用的 KeyStore 对象的文件名。com.ibm.ssl.trustStorePassword 是您希望 TrustManager 使用的 TrustStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 您希望默认 TrustManager 使用的 KeyStore 对象类型。与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表启用了哪些密码。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置将用于实例化 KeyManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中可用的默认算法。示例值:PKIX 或 IBMJ9X509. | Properties | |
| sslHostnameVerifier (security) | 为 SSL 连接设置 HostnameVerifier。请注意,它将在连接的握手后使用,当主机名验证错误时,应自行执行操作。没有默认的 HostnameVerifier。 | HostnameVerifier | |
| 用户名 (安全) | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 |
38.4. 端点选项
Paho MQTT 5 端点使用 URI 语法进行配置:
paho-mqtt5:topic
使用以下路径和查询参数:
38.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| Topic (common) | 主题 所需的 名称。 | 字符串 |
38.4.2. 查询参数(32 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| automaticReconnect (common) | 如果连接丢失,设置客户端是否会自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动重新连接到服务器。如果设置为 true,如果连接丢失,客户端将尝试重新连接到服务器。在尝试重新连接 1 秒前,它会首先等待 1 秒,每次尝试失败的重新连接尝试时,延迟会加倍,直到延迟时间为 2 分钟。 | true | 布尔值 |
| brokerUrl (common) | MQTT 代理的 URL。 | tcp://localhost:1883 | 字符串 |
| cleanStart (common) | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,则客户端和服务器在重新启动客户端后将保持状态、服务器和连接。维护状态:消息交付将满足指定的 QOS,即使客户端、服务器或连接被重启也是如此。服务器会将订阅视为持久。如果设置为 true,则客户端和服务器在重启客户端、服务器或连接后不会维护状态。这意味着,如果客户端、服务器或连接被重启,则消息发送到指定的 QOS 不能被维护。服务器会将订阅视为不可配置。 | true | 布尔值 |
| clientID (common) | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
| connectionTimeout (common) | 设置连接超时值。此值以秒为单位测量,定义客户端将等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。值 0 禁用超时处理,这意味着客户端将等到网络连接成功或失败。 | 30 | int |
| filePersistenceDirectory (common) | 文件持久性使用的基础目录。默认情况下,将使用 user 目录。 | 字符串 | |
| keepAliveInterval (common) | 设置 keep alive 间隔。这个值(以秒为单位)定义发送或接收消息之间的最长时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保至少一条消息在各个网络间传输,并保持上线时间。在一段时间内没有与数据相关的消息,客户端会发送非常小的 ping 消息,服务器将确认。值 0 可禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | int |
| maxReconnectDelay (common) | 获取在重新连接之间等待的最长时间(在 millis 中)。 | 128000 | int |
| 持久性 (通用) | 要使用的客户端持久性 - 内存或文件。 Enum 值:
| 内存 | PahoMqtt5Persistence |
| QoS (common) | 客户端服务质量级别(0-2)。 | 2 | int |
| receiveMaximum (common) | 设置最大 Receive 的最大值。这个值代表了客户端将同时处理 QoS 1 和 QoS 2 出版物的限制。没有可限制服务器可能会尝试发送的 QoS 0 出版物的数量。默认值为 65535。 | 65535 | int |
| 保留 (common) | 保留选项。 | false | 布尔值 |
| serverURIs (common) | 设置客户端可以连接到的一个或多个 serverURIs 列表。可以用逗号分隔多个服务器。每个 serverURI 指定客户端可以连接的服务器的地址。对于 TCP 连接,支持两种连接,tcp:// 用于 TCP 连接,ssl:// 用于 SSL/TLS 保护的 TCP 连接。例如:如果未指定端口,则 tcp://localhost:1883 ssl://localhost:8883 将默认为 tcp:// URIs 的 1883,ssl:// URI 的 8883 将默认为 8883。如果设置了 serverURIs,则会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接时,客户端将从列表中的第一个 serverURI 开始,并操作列表,直到与服务器建立连接为止。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接多个用途的服务器列表:高可用性和可靠的消息发送某些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,无论客户端连接到哪个服务器是什么,都可确保消息得到可靠地交付和持久化订阅。如果需要持久化订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可以指定不相等的一组服务器(如高可用性选项中所示)。因为没有状态在服务器间共享,可靠的消息发送和持久化订阅无效。如果使用 hunt 列表模式,则 cleansession 标志必须设置为 true。 | 字符串 | |
| sessionExpiryInterval (common) | 设置会话过期间隔。这个值以秒为单位定义代理在客户端断开连接后维护会话的最长时间。如果客户端打算稍后连接到服务器,则客户端应只与较长的会话过期间隔连接。默认情况下,这个值为 -1,因此不会发送,在这种情况下,会话不会过期。如果发送了 0,则在网络连接关闭后,会话会立即结束。当客户端确定其不再用于会话时,它应该断开会话过期间隔设为 0。 | -1 | long |
| willMqttProperties (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。为消息设置的 MQTT 属性。 | MqttProperties | |
| willPayload (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。消息的字节有效负载。 | 字符串 | |
| willQos (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。发布消息的服务质量(0、1 或 2)。 | 1 | int |
| willRetained (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。消息是否应保留。 | false | 布尔值 |
| willTopic (common) | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布的主题。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 客户端 (高级) | 使用现有的 mqtt 客户端。 | MqttClient | |
| customWebSocketHeaders (高级) | 设置 WebSocket 连接的自定义 WebSocket 标头。 | map | |
| executorServiceTimeout (高级) | 设置在强制终止前 executor 服务在终止时应等待的时间(以秒为单位)。除非绝对确定您需要,否则不建议更改此值。 | 1 | int |
| httpsHostnameVerificationEnabled (security) | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
| 密码 (安全) | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
| socketFactory (security) | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 来提供特定于应用的安全设置。 | SocketFactory | |
| sslClientProps (security) | 设置连接的 SSL 属性。请注意,只有实施 Java 安全套接字扩展(JSSE)时,这些属性才有效。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性:com.ibm.ssl.protocol One of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的文件名称。例如,/mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 是您希望 KeyManager 使用的 KeyStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key store,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider Key 存储供应商,如 IBMJCE 或 IBMJCEFIPS. com.ibm .SSL.trustStore 包含信任管理器要使用的 KeyStore 对象的文件名。com.ibm.ssl.trustStorePassword 是您希望 TrustManager 使用的 TrustStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 您希望默认 TrustManager 使用的 KeyStore 对象类型。与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表启用了哪些密码。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置将用于实例化 KeyManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中可用的默认算法。示例值:PKIX 或 IBMJ9X509. | Properties | |
| sslHostnameVerifier (security) | 为 SSL 连接设置 HostnameVerifier。请注意,它将在连接的握手后使用,当主机名验证错误时,应自行执行操作。没有默认的 HostnameVerifier。 | HostnameVerifier | |
| 用户名 (安全) | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 |
38.5. Headers
以下标头由 Paho 组件识别:
| 标头 | Java 常数 | 端点类型 | 值类型 | 描述 |
|---|---|---|---|---|
| CamelMqttTopic | PahoConstants.MQTT_TOPIC | 消费者 | 字符串 | 主题的名称 |
| CamelMqttQoS | PahoConstants.MQTT_QOS | 消费者 | 整数 | 传入消息的 QualityOfService |
| CamelPahoOverrideTopic | PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC | 制作者 | 字符串 | 覆盖并发送到的主题名称,而不是在端点中指定的主题 |
38.6. 默认有效负载类型
默认情况下,Camel Paho 组件在提取的二进制有效负载上运行(或放入)MQTT 消息:
// Receive payload
byte[] payload = (byte[]) consumerTemplate.receiveBody("paho:topic");
// Send payload
byte[] payload = "message".getBytes();
producerTemplate.sendBody("paho:topic", payload);
但是,Camel build-in 类型转换 API 可以为您执行自动数据类型转换。在以下示例中,Camel 会自动将二进制有效负载转换为 字符串 (并传递):
// Receive payload
String payload = consumerTemplate.receiveBody("paho:topic", String.class);
// Send payload
String payload = "message";
producerTemplate.sendBody("paho:topic", payload);38.7. Samples
例如,以下片段从在与 Camel 路由器相同的主机上安装的 MQTT 代理读取消息:
from("paho:some/queue")
.to("mock:test");以下片段将信息发送到 MQTT 代理:
from("direct:test")
.to("paho:some/target/queue");例如,如何从远程 MQTT 代理中读取信息:
from("paho:some/queue?brokerUrl=tcp://iot.eclipse.org:1883")
.to("mock:test");在这里,我们覆盖默认主题,并设置为动态主题
from("direct:test")
.setHeader(PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC, simple("${header.customerId}"))
.to("paho:some/target/queue");38.8. Spring Boot Auto-Configuration
当将 paho-mqtt5 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-paho-mqtt5-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 33 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.paho-mqtt5.automatic-reconnect | 如果连接丢失,设置客户端是否会自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动重新连接到服务器。如果设置为 true,如果连接丢失,客户端将尝试重新连接到服务器。在尝试重新连接 1 秒前,它会首先等待 1 秒,每次尝试失败的重新连接尝试时,延迟会加倍,直到延迟时间为 2 分钟。 | true | 布尔值 |
| camel.component.paho-mqtt5.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.paho-mqtt5.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.paho-mqtt5.broker-url | MQTT 代理的 URL。 | tcp://localhost:1883 | 字符串 |
| camel.component.paho-mqtt5.clean-start | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,则客户端和服务器在重新启动客户端后将保持状态、服务器和连接。维护状态:消息交付将满足指定的 QOS,即使客户端、服务器或连接被重启也是如此。服务器会将订阅视为持久。如果设置为 true,则客户端和服务器在重启客户端、服务器或连接后不会维护状态。这意味着,如果客户端、服务器或连接被重启,则消息发送到指定的 QOS 不能被维护。服务器会将订阅视为不可配置。 | true | 布尔值 |
| camel.component.paho-mqtt5.client | 使用共享 Paho 客户端。选项是 org.eclipse.paho.mqttv5.client.MqttClient 类型。 | MqttClient | |
| camel.component.paho-mqtt5.client-id | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
| camel.component.paho-mqtt5.configuration | 使用共享 Paho 配置。选项是 org.apache.camel.component.paho.mqtt5.PahoMqtt5Configuration 类型。 | PahoMqtt5Configuration | |
| camel.component.paho-mqtt5.connection-timeout | 设置连接超时值。此值以秒为单位测量,定义客户端将等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。值 0 禁用超时处理,这意味着客户端将等到网络连接成功或失败。 | 30 | 整数 |
| camel.component.paho-mqtt5.custom-web-socket-headers | 设置 WebSocket 连接的自定义 WebSocket 标头。 | map | |
| camel.component.paho-mqtt5.enabled | 是否启用 paho-mqtt5 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.paho-mqtt5.executor-service-timeout | 设置在强制终止前 executor 服务在终止时应等待的时间(以秒为单位)。除非绝对确定您需要,否则不建议更改此值。 | 1 | 整数 |
| camel.component.paho-mqtt5.file-persistence-directory | 文件持久性使用的基础目录。默认情况下,将使用 user 目录。 | 字符串 | |
| camel.component.paho-mqtt5.https-hostname-verification-enabled | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
| camel.component.paho-mqtt5.keep-alive-interval | 设置 keep alive 间隔。这个值(以秒为单位)定义发送或接收消息之间的最长时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保至少一条消息在各个网络间传输,并保持上线时间。在一段时间内没有与数据相关的消息,客户端会发送非常小的 ping 消息,服务器将确认。值 0 可禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | 整数 |
| camel.component.paho-mqtt5.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.paho-mqtt5.max-reconnect-delay | 获取在重新连接之间等待的最长时间(在 millis 中)。 | 128000 | 整数 |
| camel.component.paho-mqtt5.password | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
| camel.component.paho-mqtt5.persistence | 要使用的客户端持久性 - 内存或文件。 | PahoMqtt5Persistence | |
| camel.component.paho-mqtt5.qos | 客户端服务质量级别(0-2)。 | 2 | 整数 |
| camel.component.paho-mqtt5.receive-maximum | 设置最大 Receive 的最大值。这个值代表了客户端将同时处理 QoS 1 和 QoS 2 出版物的限制。没有可限制服务器可能会尝试发送的 QoS 0 出版物的数量。默认值为 65535。 | 65535 | 整数 |
| camel.component.paho-mqtt5.retained | 保留选项。 | false | 布尔值 |
| camel.component.paho-mqtt5.server-u-r-is | 设置客户端可以连接到的一个或多个 serverURIs 列表。可以用逗号分隔多个服务器。每个 serverURI 指定客户端可以连接的服务器的地址。对于 TCP 连接,支持两种连接,tcp:// 用于 TCP 连接,ssl:// 用于 SSL/TLS 保护的 TCP 连接。例如:如果未指定端口,则 tcp://localhost:1883 ssl://localhost:8883 将默认为 tcp:// URIs 的 1883,ssl:// URI 的 8883 将默认为 8883。如果设置了 serverURIs,则会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接时,客户端将从列表中的第一个 serverURI 开始,并操作列表,直到与服务器建立连接为止。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接多个用途的服务器列表:高可用性和可靠的消息发送某些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,无论客户端连接到哪个服务器是什么,都可确保消息得到可靠地交付和持久化订阅。如果需要持久化订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可以指定不相等的一组服务器(如高可用性选项中所示)。因为没有状态在服务器间共享,可靠的消息发送和持久化订阅无效。如果使用 hunt 列表模式,则 cleansession 标志必须设置为 true。 | 字符串 | |
| camel.component.paho-mqtt5.session-expiry-interval | 设置会话过期间隔。这个值以秒为单位定义代理在客户端断开连接后维护会话的最长时间。如果客户端打算稍后连接到服务器,则客户端应只与较长的会话过期间隔连接。默认情况下,这个值为 -1,因此不会发送,在这种情况下,会话不会过期。如果发送了 0,则在网络连接关闭后,会话会立即结束。当客户端确定其不再用于会话时,它应该断开会话过期间隔设为 0。 | -1 | Long |
| camel.component.paho-mqtt5.socket-factory | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 来提供特定于应用的安全设置。选项是 javax.net.SocketFactory 类型。 | SocketFactory | |
| camel.component.paho-mqtt5.ssl-client-props | 设置连接的 SSL 属性。请注意,只有实施 Java 安全套接字扩展(JSSE)时,这些属性才有效。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性:com.ibm.ssl.protocol One of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的文件名称。例如,/mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 是您希望 KeyManager 使用的 KeyStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key store,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider Key 存储供应商,如 IBMJCE 或 IBMJCEFIPS. com.ibm .SSL.trustStore 包含信任管理器要使用的 KeyStore 对象的文件名。com.ibm.ssl.trustStorePassword 是您希望 TrustManager 使用的 TrustStore 对象的密码。密码可以采用纯文本,也可以使用静态方法进行模糊处理:com.ibm.micro.security.Password.obfuscate (char password)。这会使用简单不安全的 XOR 和 Base64 编码机制来混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 您希望默认 TrustManager 使用的 KeyStore 对象类型。与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表启用了哪些密码。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置将用于实例化 KeyManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中可用的默认算法。示例值:PKIX 或 IBMJ9X509.选项是一个 java.util.Properties 类型。 | Properties | |
| camel.component.paho-mqtt5.ssl-hostname-verifier | 为 SSL 连接设置 HostnameVerifier。请注意,它将在连接的握手后使用,当主机名验证错误时,应自行执行操作。没有默认的 HostnameVerifier。选项是一个 javax.net.ssl.HostnameVerifier 类型。 | HostnameVerifier | |
| camel.component.paho-mqtt5.user-name | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 | |
| camel.component.paho-mqtt5.will-mqtt-properties | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。为消息设置的 MQTT 属性。选项是一个 org.eclipse.paho.mqttv5.common.packet.MqttProperties 类型。 | MqttProperties | |
| camel.component.paho-mqtt5.will-payload | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。消息的字节有效负载。 | 字符串 | |
| camel.component.paho-mqtt5.will-qos | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。发布消息的服务质量(0、1 或 2)。 | 1 | 整数 |
| camel.component.paho-mqtt5.will-retained | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。消息是否应保留。 | false | 布尔值 |
| camel.component.paho-mqtt5.will-topic | 设置连接的 Last Will 和 Testament (LWT)。如果此客户端意外丢失了服务器的连接,服务器将使用提供的详细信息向其自身发布消息。要发布的主题。 | 字符串 |
第 39 章 Quartz
仅支持消费者
Quartz 组件使用 Quartz 调度程序 2.x 提供已调度的消息发送。每个端点代表不同的计时器(在 Quartz 术语、Trigger 和 JobDetail 中)。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-quartz</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>39.1. URI 格式
quartz://timerName?options quartz://groupName/timerName?options quartz://groupName/timerName?cron=expression quartz://timerName?cron=expression
组件使用 CronTrigger 或 SimpleTrigger。如果没有提供 cron 表达式,则组件将使用一个简单的触发器。如果没有提供 groupName,则 quartz 组件将使用 Camel 组名称。
39.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
39.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
39.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
39.3. 组件选项
Quartz 组件支持 13 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| enableJmx (consumer) | 是否启用 Quartz JMX,允许从 JMX 管理 Quartz 调度程序。这个选项默认为 true。 | true | 布尔值 |
| prefixInstanceName (consumer) | 是否使用 CamelContext 名称前缀 Quartz Scheduler 实例名称。这默认为启用,让每个 CamelContext 默认使用自己的 Quartz 调度程序实例。您可以将这个选项设置为 false,以在多个 CamelContext 之间重复使用 Quartz 调度程序实例。 | true | 布尔值 |
| prefixJobNameWithEndpointId (consumer) | 是否使用端点 ID 为 quartz 作业添加前缀。这个选项是默认的 false。 | false | 布尔值 |
| 属性 (消费者) | 配置 Quartz 调度程序的属性。 | map | |
| PropertiesFile (consumer) | 从 classpath 加载的属性的文件名。 | 字符串 | |
| propertiesRef (consumer) | 对现有属性或映射的引用在 registry 中用于配置 quartz。 | 字符串 | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 调度程序 (高级) | 要使用自定义配置的 Quartz 调度程序,而不是创建新的调度程序。 | scheduler | |
| schedulerFactory (高级) | 使用用于创建调度程序的自定义 SchedulerFactory。 | SchedulerFactory | |
| autoStartScheduler (scheduler) | 调度程序是否应自动启动。这个选项默认为 true。 | true | 布尔值 |
| interruptJobsOnShutdown (scheduler) | 是否中断关闭时的作业,这将强制调度程序更快地关闭,并尝试中断任何正在运行的作业。如果启用此项,则任何正在运行的作业可能会因为中断而失败。当作业中断时,Camel 会将交换标记为停止继续路由,并设置 java.util.concurrent.RejectedExecutionException。因此请小心使用它,因为最好允许 Camel 作业正常完成和关闭。 | false | 布尔值 |
| startDelayedSeconds (scheduler) | 启动 quartz 调度程序前等待的秒数。 | int |
39.4. 端点选项
Quartz 端点使用 URI 语法进行配置:
quartz:groupName/triggerName
使用以下路径和查询参数:
39.4.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| groupname ( consumer) | 要使用的 quartz 组名称。组名称和触发器名称的组合应该是唯一的。 | Camel | 字符串 |
| triggerName (consumer) | 需要使用 quartz 触发器名称。组名称和触发器名称的组合应该是唯一的。 | 字符串 |
39.4.2. 查询参数(17 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| Cron (消费者) | 指定用于定义要触发的时间的 cron 表达式。 | 字符串 | |
| deleteJob (consumer) | 如果设置为 true,则触发器会在路由停止时自动删除。否则设为 false,它将保留在调度程序中。当设置为 false 时,它也意味着用户可能会重复利用带有 camel Uri 的预配置触发器。只需确保名称匹配。请注意,您无法 deleteJob 和 pauseJob 设置为 true。 | true | 布尔值 |
| durableJob (consumer) | 作业是否应在被孤立后保留存储(没有触发器指向它)。 | false | 布尔值 |
| pauseJob (consumer) | 如果设置为 true,则触发器会在路由停止时自动暂停。否则设为 false,它将保留在调度程序中。当设置为 false 时,它也意味着用户可能会重复利用带有 camel Uri 的预配置触发器。只需确保名称匹配。请注意,您无法 deleteJob 和 pauseJob 设置为 true。 | false | 布尔值 |
| recoverableJob (consumer) | 当遇到 'recovery' 或 'fail-over' 的情况,指示调度程序是否应该重新执行作业。 | false | 布尔值 |
| Stateful (消费者) | 使用 Quartz PersistJobDataAfterExecution 和 DisallowConcurrentExecution 而不是默认作业。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| customCalendar (高级) | 指定自定义日历以避免特定日期范围。 | 日历 | |
| jobParameters (高级) | 要在作业上配置附加选项。 | map | |
| prefixJobNameWithEndpointId (advanced) | 作业名称是否应该加上端点 ID 前缀。 | false | 布尔值 |
| triggerParameters (高级) | 在触发器中配置其他选项。 | map | |
| usingFixedCamelContextName (advanced) | 如果为 true,JobDataMap 直接使用 CamelContext 名称来引用 CamelContext,如果为 false,则 JobDataMap 将使用 CamelContext 管理名称,可在部署期间更改。 | false | 布尔值 |
| autoStartScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| startDelayedSeconds (scheduler) | 启动 quartz 调度程序前等待的秒数。 | int | |
| triggerStartDelay (scheduler) | 如果已经启动调度程序,则在作业启动启动前,我们希望触发器在当前时间之后稍有启动,以确保端点完全启动。负值改变过去的触发器开始时间。 | 500 | long |
39.4.3. 配置 quartz.properties 文件
默认情况下,Qartz 将在 classpath 的 org/quartz 目录中查找 quartz.properties 文件。如果您使用 WAR 部署,这意味着仅在 WEB-INF/classes/org/quartz 中丢弃 quartz.properties。
但是 Camel Quartz 组件还允许您配置属性:
| 参数 | 默认 | 类型 | 描述 |
|---|---|---|---|
|
|
|
|
您可以配置 |
|
|
|
| 从 classpath 加载的属性的文件名 |
要做到这一点,您可以在 Spring XML 中进行配置,如下所示
<bean id="quartz" class="org.apache.camel.component.quartz.QuartzComponent">
<property name="propertiesFile" value="com/mycompany/myquartz.properties"/>
</bean>39.5. 在 JMX 中启用 Quartz 调度程序
您需要配置 quartz 调度程序属性来启用 JMX。
这通常将选项 "org.quartz.scheduler.jmx.export" 设置为配置文件中的 true 值。
除非明确禁用,否则此选项默认设置为 true。
39.6. 启动 Quartz 调度程序
Quartz 组件提供了一个选项,可以让 Quartz 调度程序启动延迟,或者根本不自动启动。
这是一个示例:
<bean id="quartz" class="org.apache.camel.component.quartz.QuartzComponent">
<property name="startDelayedSeconds" value="5"/>
</bean>39.7. 集群
如果您在集群模式中使用 Quartz,如 JobStore 已被集群。然后,当节点被停止/关闭时,Qart z 组件不会暂停/删除触发器。这允许触发器在集群中的其他节点上运行。
在集群节点上运行时,不会进行检查,以确保端点的唯一作业名称/组。
39.8. 消息标头
Camel 将 Quartz Execution Context 中的 getter 添加为标头值。以下标头会被添加:calendar,fireTime,jobDetail,jobInstance,jobRuntTime,mergedJobDataMap,nextFireTime,previousFireTime,refireCount, result, scheduledFireTime,scheduler,trigger,triggerName,triggerGroup.
fireTime 标头包含交换触发时的 java.util.Date。
39.9. 使用 Cron Triggers
Quartz 支持类似于 Cron 的表达式,以通过方便的格式指定计时器。您可以在 cron URI 参数中使用这些表达式;但是,为了保留允许 + 而不是空格使用的有效 URI 编码。
例如,以下命令会在一周天上每五分钟触发一次消息(从 12pm (noon)到 6pm ):
from("quartz://myGroup/myTimerName?cron=0+0/5+12-18+?+*+MON-FRI")
.to("activemq:Totally.Rocks");等同于使用 cron 表达式
0 0/5 12-18 ? * MON-FRI
下表显示了我们用来保留有效 URI 语法的 URI 字符编码:
| URI Character | Cron 字符 |
|---|---|
|
| space |
39.10. 指定时区
Quartz 调度程序允许您为每个触发器配置时区。例如,要使用您所在国家的时区,您可以按照以下方法执行以下操作:
quartz://groupName/timerName?cron=0+0/5+12-18+?+*+MON-FRI&trigger.timeZone=Europe/Stockholm
timeZone 值是 java.util.TimeZone 接受的值。
39.11. 配置错误指令
可以使用错误指令配置 quartz 调度程序,以处理触发的错误情况。您正在使用的 concrete 触发器类型将定义一组额外的 MISFIRE_INSTRUCTION_XXX 常数,可以设置为此属性的值。
例如,要将简单触发器配置为使用错误指令 4:
quartz://myGroup/myTimerName?trigger.repeatInterval=2000&trigger.misfireInstruction=4
同样,您也可以使用一个错误指令配置 cron 触发器:
quartz://myGroup/myTimerName?cron=0/2+*+*+*+*+?&trigger.misfireInstruction=2
simple 和 cron 触发器有以下错误指令代表:
39.11.1. SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW = 1 (default)
指示发生错误情况的调度程序,只需由调度程序触发 SimpleTrigger。
此指令通常仅应用于"one-shot" (非重复)触发器。如果它用于带有重复数 > 0 的触发器,则它等同于指令 MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT。
39.11.2. SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT = 2
指示发生错误情况的调度程序,SimpleTrigger 希望重新调度到"现在" (即使相关的 Calendar 排除"now),带有重复计数(即使相关的 Calendar 排除为"now))。这会使 Trigger 端到端,因此如果 "now' 在结束后,Trigger 不会再次触发。
使用这个指令会使触发器 'forget' 开始和重复计数,它是最初通过 设置的(如果您出于某种原因希望能够告诉稍后出现什么原始值)时,这才有问题。
39.11.3. SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT = 3
指示发生错误情况的调度程序,简单触发器希望重新调度到"现在" (即使相关的 Calendar 排除了 'now'),并将重复数设置为该情况(如果尚未错过任何触发)。这会使 Trigger 端到端,因此如果 "now' 在结束后,Trigger 不会再次触发。
使用这个指令会使触发器 'forget' 开始时间,并重复其最初设置的时间。相反,触发器上的重复计数将更改为任何剩余的重复计数(只有在出于某种原因时才有问题是这样,希望在以后会知道原始值是什么)。
如果出现 "now',则此指令可能会导致 Trigger 进入 'COMPLETE' 状态,如果缺少所有重复时间。
39.11.4. SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT = 4
指示发生错误情况的调度程序,只需在"现在"后重新调度到下一个计划时间 - 考虑任何关联的 Calendar,并将重复计数设置为该情况(如果尚未错过任何触发)。
如果缺少所有 fire-times,则此指令可能会导致 Trigger 直接进入 'COMPLETE' 状态。
39.11.5. SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT = 5
指示发生错误情况的调度程序,只需在"现在"后重新调度到下一个计划时间 - 考虑任何关联的 Calendar,并且重复计数保持不变。
如果触发器的结束时间到达,则此指令可能会导致 Trigger 直接进入 'COMPLETE' 状态。
39.11.6. CronTrigger.MISFIRE_INSTRUCTION_FIRE_ONCE_NOW = 1 (default)
指示在某种情况出现 CronTrigger 的调度程序希望由调度程序触发。
39.11.7. CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING = 2
指示在发生错误情况时的调度程序,CronTrigger 希望在当前时间后(考虑任何关联的 Calendar 被考虑任何关联的 Calendar )使其在下次计划中更新。
39.12. 使用 QuartzScheduledPollConsumerScheduler
Quartz 组件提供了一个 Polling Consumer 调度程序,它允许对 Polling Consumer (如文件和 FTP 用户)使用基于 cron 的调度。
例如,要使用基于 cron 的表达式每秒轮询一次文件,可将 Camel 路由定义为:
from("file:inbox?scheduler=quartz&scheduler.cron=0/2+*+*+*+*+?")
.to("bean:process");
请注意,我们定义 scheduler=quartz 以指示 Camel 使用基于 Quartz 的调度程序。然后,我们使用 scheduler.xxx 选项来配置调度程序。Quartz 调度程序需要设置 cron 选项。
支持以下选项:
| 参数 | 默认 | 类型 | 描述 |
|---|---|---|---|
|
|
|
| 使用自定义 Quartz 调度程序。如果没有配置,则使用来自组件的共享调度程序。 |
|
|
|
| Mandatory :定义用于触发轮询的 cron 表达式。 |
|
|
|
| 指定触发器 id。如果未提供,则生成和使用 UUID。 |
|
|
|
| 指定触发器组。 |
|
|
|
| 用于 CRON 触发器的时区。 |
记住从端点 URI 配置这些选项必须使用 调度程序 作为前缀。
例如,配置 trigger id 和 group :
from("file:inbox?scheduler=quartz&scheduler.cron=0/2+*+*+*+*+?&scheduler.triggerId=myId&scheduler.triggerGroup=myGroup")
.to("bean:process");Spring 中还有一个 CRON 调度程序,因此您也可以使用以下内容:
from("file:inbox?scheduler=spring&scheduler.cron=0/2+*+*+*+*+?")
.to("bean:process");39.13. Cron 组件支持
Quartz 组件可用作 Camel Cron 组件的实施。
Maven 用户需要将以下额外依赖项添加到其 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-cron</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>然后,用户可以使用 cron 组件而不是 quartz 组件,如以下路由中所示:
from("cron://name?schedule=0+0/5+12-18+?+*+MON-FRI")
.to("activemq:Totally.Rocks");39.14. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 quartz 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-quartz-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 14 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.quartz.auto-start-scheduler | 调度程序是否应自动启动。这个选项默认为 true。 | true | 布尔值 |
| camel.component.quartz.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.quartz.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.quartz.enable-jmx | 是否启用 Quartz JMX,允许从 JMX 管理 Quartz 调度程序。这个选项默认为 true。 | true | 布尔值 |
| camel.component.quartz.enabled | 是否启用 quartz 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.quartz.interrupt-jobs-on-shutdown | 是否中断关闭时的作业,这将强制调度程序更快地关闭,并尝试中断任何正在运行的作业。如果启用此项,则任何正在运行的作业可能会因为中断而失败。当作业中断时,Camel 会将交换标记为停止继续路由,并设置 java.util.concurrent.RejectedExecutionException。因此请小心使用它,因为最好允许 Camel 作业正常完成和关闭。 | false | 布尔值 |
| camel.component.quartz.prefix-instance-name | 是否使用 CamelContext 名称前缀 Quartz Scheduler 实例名称。这默认为启用,让每个 CamelContext 默认使用自己的 Quartz 调度程序实例。您可以将这个选项设置为 false,以在多个 CamelContext 之间重复使用 Quartz 调度程序实例。 | true | 布尔值 |
| camel.component.quartz.prefix-job-name-with-endpoint-id | 是否使用端点 ID 为 quartz 作业添加前缀。这个选项是默认的 false。 | false | 布尔值 |
| camel.component.quartz.properties | 配置 Quartz 调度程序的属性。 | map | |
| camel.component.quartz.properties-file | 从 classpath 加载的属性的文件名。 | 字符串 | |
| camel.component.quartz.properties-ref | 对现有属性或映射的引用在 registry 中用于配置 quartz。 | 字符串 | |
| camel.component.quartz.scheduler | 要使用自定义配置的 Quartz 调度程序,而不是创建新的调度程序。选项是 org.quartz.Scheduler 类型。 | scheduler | |
| camel.component.quartz.scheduler-factory | 使用用于创建调度程序的自定义 SchedulerFactory。选项是 org.quartz.SchedulerFactory 类型。 | SchedulerFactory | |
| camel.component.quartz.start-delayed-seconds | 启动 quartz 调度程序前等待的秒数。 | 整数 |
第 40 章 Ref
支持制作者和使用者
Ref 组件用于查找 Registry 中绑定的现有端点。
40.1. URI 格式
ref:someName[?options]
其中 someName 是 Registry 中的端点名称(通常,但不是始终为 Spring registry)。如果您使用 Spring registry,someName 是 Spring registry 中端点的 bean ID。
40.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
40.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
40.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
40.3. 组件选项
Ref 组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
40.4. 端点选项
Ref 端点是使用 URI 语法配置的:
ref:name
使用以下路径和查询参数:
40.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 名称 (common) | 在 registry 中要查找 所需的 端点名称。 | 字符串 |
40.4.2. 查询参数(4 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
40.5. 运行时查找
当您需要在运行时计算 URI 的 Registry 中的端点时,可以使用此组件。然后,您可以使用以下代码查找端点:
// lookup the endpoint
String myEndpointRef = "bigspenderOrder";
Endpoint endpoint = context.getEndpoint("ref:" + myEndpointRef);
Producer producer = endpoint.createProducer();
Exchange exchange = producer.createExchange();
exchange.getIn().setBody(payloadToSend);
// send the exchange
producer.process(exchange);您可以在 Registry 中定义了一个端点列表,例如:
<camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
<endpoint id="normalOrder" uri="activemq:order.slow"/>
<endpoint id="bigspenderOrder" uri="activemq:order.high"/>
</camelContext>40.6. 示例
在以下示例中,我们使用 URI 中的 ref: 使用 spring ID ( endpoint 2)来引用端点 :
您可以改为使用 ref 属性:
<to uri="ref:endpoint2"/>
这是一种更常见的编写方式。
40.7. Spring Boot Auto-Configuration
当将 ref 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-ref-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.ref.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.ref.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.ref.enabled | 是否启用 ref 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.ref.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 41 章 REST
支持制作者和使用者
REST 组件允许使用 Rest DSL 和插件来定义 REST 端点(使用者),作为 REST 传输。
其余组件也可以用作调用 REST 服务的客户端(生成者)。
41.1. URI 格式
rest://method:path[:uriTemplate]?[options]
41.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
41.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
41.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
41.3. 组件选项
REST 组件支持 8 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| consumerComponentName (consumer) | 用于(消费者)REST 传输的 Camel Rest 组件,如 jetty、servlet、undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| apidoc (producer) | 要使用的 swagger api doc 资源。资源默认从 classpath 加载,且必须采用 JSON 格式。 | 字符串 | |
| componentName (producer) | 弃用了 Camel Rest 组件,用于(生成)REST 传输,如 http, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestProducerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| 主机 (生成器) | 要使用的 HTTP 服务的主机和端口(在 swagger 架构中的框架主机)。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| producerComponentName (producer) | 用于(生成)REST 传输(如 http, undertow)的 Camel Rest 组件。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestProducerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
41.4. 端点选项
REST 端点使用 URI 语法进行配置:
rest:method:path:uriTemplate
使用以下路径和查询参数:
41.4.1. 路径参数(3 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 方法 (通用) | 要使用 所需的 HTTP 方法。 Enum 值:
| 字符串 | |
| 路径 (common) | 所需的 基本路径。 | 字符串 | |
| uritemplate (common) | uri 模板。 | 字符串 |
41.4.2. 查询参数(16 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 使用 (common) | 此 REST 服务接受的介质类型,如 'text/xml' 或 'application/json'。默认情况下,我们接受所有类型。 | 字符串 | |
| inType (common) | 将传入的 POJO 绑定类型声明为 FQN 类名称。 | 字符串 | |
| outType (common) | 将传出 POJO 绑定类型声明为 FQN 类名称。 | 字符串 | |
| generate (common) | 此 REST 服务返回的介质类型,如 'text/xml' 或 'application/json'。 | 字符串 | |
| routeId (common) | 此 REST 服务创建的路由的名称。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| consumerComponentName (consumer) | 用于(消费者)REST 传输的 Camel Rest 组件,如 jetty、servlet、undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| 描述 (使用者) | 记录此 REST 服务的人为描述。 | 字符串 | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| apidoc (producer) | 要使用的 openapi api doc 资源。资源默认从 classpath 加载,且必须采用 JSON 格式。 | 字符串 | |
| bindingMode (producer) | 配置制作者的绑定模式。如果设置为 'off' 以外的任何内容,则制作者会尝试将传入消息的正文从 inType 转换为 json 或 xml,以及从 json 或 xml 的响应转换为 outType。 Enum 值:
| RestBindingMode | |
| 主机 (生成器) | 要使用的 HTTP 服务的主机和端口(在 openapi schema 中的override 主机)。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| producerComponentName (producer) | 用于(生成)REST 传输(如 http, undertow)的 Camel Rest 组件。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestProducerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| queryParameters (producer) | 要调用的 HTTP 服务的查询参数。查询参数可以包含多个参数,如 foo=123&bar=456。 | 字符串 |
41.5. 支持的其余组件
以下组件支持 rest 使用者(Rest DSL):
- camel-servlet
以下组件支持 rest producer:
- camel-http
41.6. path 和 uriTemplate 语法
path 和 uriTemplate 选项使用 REST 语法定义,您可以使用对参数的支持来定义 REST 上下文路径。
如果没有配置 uriTemplate,则 path 选项的工作方式相同。如果您只配置路径,或者配置这两个选项,则这无关紧要。虽然配置 path 和 uriTemplate 是使用 REST 的更常见做法。
以下是仅使用路径的 Camel 路由
from("rest:get:hello")
.transform().constant("Bye World");以下路由使用参数,该参数使用键为"me"的 Camel 标头。
from("rest:get:hello/{me}")
.transform().simple("Bye ${header.me}");以下示例已将基本路径配置为"hello",然后使用 uriTemplates 配置两个 REST 服务。
from("rest:get:hello:/{me}")
.transform().simple("Hi ${header.me}");
from("rest:get:hello:/french/{me}")
.transform().simple("Bonjour ${header.me}");41.7. REST producer 示例
您可以使用其余组件调用 REST 服务,如任何其他 Camel 组件。
例如,要使用 hello/{me} 在 上调用 REST 服务,您可以执行以下操作
from("direct:start")
.to("rest:get:hello/{me}");
然后,动态值 {me} 映射到具有相同名称的 Camel 消息。为了调用此 REST 服务,您可以发送空消息正文和标头,如下所示:
template.sendBodyAndHeader("direct:start", null, "me", "Donald Duck");Rest producer 需要知道 REST 服务的主机名和端口,您可以使用 host 选项进行配置,如下所示:
from("direct:start")
.to("rest:get:hello/{me}?host=myserver:8080/foo");
您可以在 restConfiguration 中配置主机,而不是使用 host 选项,如下所示:
restConfiguration().host("myserver:8080/foo");
from("direct:start")
.to("rest:get:hello/{me}");
您可以使用 producerComponent 选择将哪个 Camel 组件用作 HTTP 客户端,例如要使用 http :
restConfiguration().host("myserver:8080/foo").producerComponent("http");
from("direct:start")
.to("rest:get:hello/{me}");41.8. REST producer 绑定
REST 制作者支持使用 JSon 或 XML (如 rest-dsl)的绑定。
例如,要将 jetty 与 json 绑定模式一起使用,您可以在其他配置中配置它:
restConfiguration().component("jetty").host("localhost").port(8080).bindingMode(RestBindingMode.json);
from("direct:start")
.to("rest:post:user");然后,在使用 rest producer 调用 REST 服务时,它会在调用 REST 服务前自动将任何 POJO 绑定到 json:
UserPojo user = new UserPojo();
user.setId(123);
user.setName("Donald Duck");
template.sendBody("direct:start", user);
在上例中,我们发送 POJO 实例 UserPojo 作为邮件正文。由于我们已在其他配置中打开 JSon 绑定,因此在调用 REST 服务前,POJO 将从 POJO 打包为 JSon。
但是,如果您还要为响应消息(如 REST 服务发回回响应)执行绑定,您需要配置 outType 选项,以指定 POJO 的类名称从 JSon 解放至 POJO。
例如,如果 REST 服务返回一个绑定到 com.foo.MyResponsePojo 的 JSon 有效负载,您可以进行此配置,如下所示:
restConfiguration().component("jetty").host("localhost").port(8080).bindingMode(RestBindingMode.json);
from("direct:start")
.to("rest:post:user?outType=com.foo.MyResponsePojo");
如果您希望从调用 REST 服务收到的响应消息发生 POJO 绑定,则必须配置 outType 选项。
41.9. 更多示例
请参阅 Rest DSL,它提供更多示例,以及如何使用 Rest DSL 以 nicer RESTful 方式定义它们。
Apache Camel 发行版中有一个 camel-example-servlet-rest-tomcat 示例,它演示了如何将 Rest DSL 与 SERVLET 用作可在 Apache Tomcat 或类似的 Web 容器上部署的传输。
41.10. Spring Boot Auto-Configuration
当将 rest 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-rest-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 12 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.rest-api.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.rest-api.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.rest-api.enabled | 是否启用 rest-api 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.rest.api-doc | 要使用的 swagger api doc 资源。资源默认从 classpath 加载,且必须采用 JSON 格式。 | 字符串 | |
| camel.component.rest.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.rest.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.rest.consumer-component-name | 用于(消费者)REST 传输的 Camel Rest 组件,如 jetty、servlet、undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.component.rest.enabled | 是否启用其余组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.rest.host | 要使用的 HTTP 服务的主机和端口(在 swagger 架构中的框架主机)。 | 字符串 | |
| camel.component.rest.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.rest.producer-component-name | 用于(生成)REST 传输(如 http, undertow)的 Camel Rest 组件。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestProducerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.component.rest.component-name | 弃用了 Camel Rest 组件,用于(生成)REST 传输,如 http, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestProducerFactory。如果找到其中任何一个,则使用它。 | 字符串 |
第 42 章 saga
仅支持制作者
Saga 组件提供了一个网桥,用于使用 Saga EIP 在路由内执行自定义操作。
组件应该用于高级任务,如决定完成或编译 Saga,并将 completionMode 设置为 MANUAL。
有关在常见场景中使用 sagas 的帮助信息,请参阅 Saga EIP 文档。
42.1. URI 格式
saga:action
42.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
42.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
42.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
42.3. 组件选项
Saga 组件支持 2 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
42.4. 端点选项
Saga 端点使用 URI 语法进行配置:
saga:action
使用以下路径和查询参数:
42.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 操作 (生成) | 执行 所需操作(完成或补配)。 Enum 值:
| SagaEndpointAction |
42.4.2. 查询参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
42.5. Spring Boot Auto-Configuration
在 Spring Boot 中使用 saga 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-saga-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.saga.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.saga.enabled | 是否启用 saga 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.saga.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 43 章 Salesforce
支持制作者和使用者
此组件支持生成者和消费者端点,以便使用 Java DTO 与 Salesforce 通信。
有一个附带的 maven 插件 Camel Salesforce 插件可生成这些 DTO (参见下文)。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-salesforce</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>希望向组件贡献的开发人员将指示查看 README.md 文件,了解如何启动和设置您的环境以运行集成测试。
43.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
43.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
43.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
43.2. 组件选项
Salesforce 组件支持 90 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| apexMethod (common) | APEX 方法名称。 | 字符串 | |
| apexQueryParams (common) | 查询参数 APEX 方法。 | map | |
| apiVersion (common) | Salesforce API 版本. | 53.0 | 字符串 |
| backoffIncrement (common) | backoff 间隔递增,用于流连接重启尝试超过 CometD auto-reconnect 失败。 | 1000 | long |
| batchId (common) | 批量 API 批处理 ID. | 字符串 | |
| ContentType (common) | 批量 API 内容类型,其中一个 XML、CSV、ZZ_XML、ZZ_CSV。 Enum 值:
| ContentType | |
| defaultReplayId (common) | 如果没有在 initialReplayIdMap 中找到值,则默认的 replayId 设置。 | -1 | Long |
| fallBackReplayId (common) | ReplayId 在无效 Replay Id 响应后回退到。 | -1 | Long |
| 格式 (common) | 用于 Salesforce API 调用的有效负载格式(JSON 或 XML)默认为 JSON。自 Camel 3.12 起,此选项仅适用于 Raw 操作。 Enum 值:
| PayloadFormat | |
| httpclient ( common) | 自定义 Jetty Http Client 用于连接到 Salesforce。 | SalesforceHttpClient | |
| httpClientConnectionTimeout (common) | 连接到 Salesforce 服务器时 HttpClient 使用的连接超时。 | 60000 | long |
| httpClientIdleTimeout (common) | HttpClient 在等待 Salesforce 服务器响应时使用的超时。 | 10000 | long |
| httpMaxContentLength (common) | HTTP 响应的最大内容长度。 | 整数 | |
| httpRequestBufferSize (common) | HTTP 请求缓冲区大小。对于大型 SOQL 查询,可能需要增加。 | 8192 | 整数 |
| includeDetails (common) | 在 Salesforce1 分析报告中包含详细信息,默认为 false。 | 布尔值 | |
| initialReplayIdMap (common) | 重播 ID 从每个频道名称开始。 | map | |
| InstanceID (common) | Salesforce1 分析报告执行实例 ID. | 字符串 | |
| jobId (common) | 批量 API 作业 ID。 | 字符串 | |
| 限制 (通用) | 对返回的记录数量限制。适用于某些 API,检查 Salesforce 文档。 | 整数 | |
| 定位器 (common) | assumes Bulk 2.0 API 提供的定位器,用于获取查询作业的结果。 | 字符串 | |
| maxBackoff (common) | 与 CometD auto-reconnect 之外的失败流连接重启尝试的最大 backoff 间隔。 | 30000 | long |
| maxRecords (common) | 为 Bulk 2.0 Query 检索每个结果的最大记录数。请求仍会受到大小限制。如果您正在使用大量查询结果,在接收来自 Salesforce 的所有数据之前可能会出现超时问题。要防止超时,请指定客户端预期在 maxRecords 参数中接收的最大记录数。这会将结果分成较小的集合,其值为最大大小。 | 整数 | |
| notFoundBehaviour (common) | 设置从 Salesforce API 收到的 404 尚未找到的状态。如果正文设置为 NULL NotFoundBehaviour#NULL,或者应在 Exchange NotFoundBehaviour#EXCEPTION 上发送一个例外。 Enum 值:
| 例外 | NotFoundBehaviour |
| notifyForFields (common) | 通知字段,选项为 ALL、REFERENCED、SELECT、WHERE。 Enum 值:
| NotifyForFieldsEnum | |
| notifyForOperationCreate (common) | notify for create operation,默认为 false (API version = 29.0)。 | 布尔值 | |
| notifyForOperationDelete (common) | 通知删除操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
| notifyForOperations (common) | 通知操作,选项为 ALL、CREATE、EXTENDED、UPDATE (API 版本 29.0)。 Enum 值:
| NotifyForOperationsEnum | |
| notifyForOperationUndelete (common) | notify for un-delete 操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
| notifyForOperationUpdate (common) | 通知更新操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
| objectMapper (common) | 自定义 Jackson ObjectMapper,用于序列化/反序列化 Salesforce 对象。 | ObjectMapper | |
| 软件包 (通用) | 在哪些软件包中,生成的 DTO 类。通常,该类将使用 camel-salesforce-maven-plugin 生成。使用生成的 DTOs 来设置它,以获取在 parameters/header 值中使用简短的 SObject 名称的好处。可以使用逗号分隔多个软件包。 | 字符串 | |
| pkChunking (common) | 使用 PK Chunking。仅用于原始 Bulk API。如有必要,批量 2.0 API 会自动执行 PK 块。 | 布尔值 | |
| pkChunkingChunkSize (common) | 与 PK Chunking 搭配使用的块大小。如果未指定,reforced 默认为 100,000。最大大小为 250,000。 | 整数 | |
| pkChunkingParent (common) | 在启用 PK 块以在共享对象上启用查询时,指定父对象。块基于父对象的记录,而不是共享对象的记录。例如,在 AccountShare 上查询时,将 Account 指定为父对象。只要支持父对象,支持 PK 块。 | 字符串 | |
| pkChunkingStartRow (common) | 指定 15 个字符或 18 个字符的记录 ID,用作第一个块的下限。在重启批处理之间失败的作业时,使用此参数指定起始 ID。 | 字符串 | |
| queryLocator (common) | 当查询结果超过一个调用中检索记录时,查询为使用查询器提供的查询定位器。在后续调用中使用这个值来检索其他记录。 | 字符串 | |
| rawPayload (common) | 使用原始有效负载字符串作为请求和响应(默认情况下,JSON 或 XML 取决于格式),而不是 DTOs。 | false | 布尔值 |
| reportId (common) | Salesforce1 分析报告 Id. | 字符串 | |
| reportMetadata (common) | 用于过滤的 Salesforce1 分析报告元数据。 | ReportMetadata | |
| resultId (common) | 批量 API 结果 ID。 | 字符串 | |
| sObjectBlobFieldName (common) | SObject blob 字段名称。 | 字符串 | |
| sObjectClass (common) | 完全限定的 SObject 类名称,通常使用 camel-salesforce-maven-plugin 生成。 | 字符串 | |
| sObjectFields (common) | 要检索的 SObject 字段。 | 字符串 | |
| sObjectId (common) | API 需要 SObject ID。 | 字符串 | |
| sObjectIdName (common) | SObject 外部 ID 字段名称。 | 字符串 | |
| sObjectIdValue (common) | SObject 外部 ID 字段值。 | 字符串 | |
| sObjectName (common) | 如果 API 需要或支持,则 SObject 名称。 | 字符串 | |
| sObjectQuery (common) | Salesforce SOQL 查询字符串. | 字符串 | |
| sObjectSearch (common) | Salesforce SOSL 搜索字符串. | 字符串 | |
| updateTopic (common) | 在使用 Streaming API 时是否更新现有的 Push Topic,默认为 false。 | false | 布尔值 |
| 配置 (通用(高级) | 全局端点配置 - 用于设置适用于所有端点的值。 | SalesforceEndpointConfig | |
| httpClientProperties (通用(高级) | 用于设置底层 HTTP 客户端上配置的任何属性。了解所有可用选项的 SalesforceHttpClient 和 Jetty HttpClient 的属性。 | map | |
| longPollingTransportProperties (通用(高级) | 用于设置流 api 使用的 BayeuxClient (CometD)使用的 LongPollingTransport 上配置的任何属性。 | map | |
| workerPoolMaxSize (通用(高级) | 用于处理 HTTP 响应的线程池的最大大小。 | 20 | int |
| workerPoolSize (通用(高级) | 用于处理 HTTP 响应的线程池大小。 | 10 | int |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| allOrNone (producer) | 复合 API 选项,以指示在任何记录不成功时回滚所有记录。 | false | 布尔值 |
| apexUrl (producer) | APEX 方法 URL。 | 字符串 | |
| compositeMethod (producer) | 复合(原始)方法。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| rawHttpHeaders (producer) | 以逗号分隔的消息标头列表,以包含 作为 Raw 操作的 HTTP 参数。 | 字符串 | |
| rawMethod (producer) | 用于 Raw 操作的 HTTP 方法。 | 字符串 | |
| rawPath (producer) | 域名后面的端点 URL 部分。E.g., '/services/data/v52.0/sobjects/Account/'. | 字符串 | |
| rawQueryParameters (producer) | 以逗号分隔的消息标头列表,来作为 Raw 操作的查询参数。不要 url-encode 值,因为这将自动执行。 | 字符串 | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| httpProxyExcludedAddresses (proxy) | 不应使用 HTTP 代理服务器的地址列表。 | Set | |
| httpProxyHost (proxy) | 要使用的 HTTP 代理服务器的主机名。 | 字符串 | |
| httpProxyIncludedAddresses (proxy) | 应使用 HTTP 代理服务器的地址列表。 | Set | |
| httpProxyPort (proxy) | 要使用的 HTTP 代理服务器的端口号。 | 整数 | |
| httpProxySocks4 (proxy) | 如果设置为 true,则将 HTTP 代理配置为用作 SOCKS4 代理。 | false | 布尔值 |
| AuthenticationType (security) | 要使用的显式身份验证方法、USERNAME_PASSWORD、REFRESH_TOKEN 或 JWT 之一。Salesforce 组件可以从属性集自动确定要使用的身份验证方法,将此属性设置为消除任何不确定性。 Enum 值:
| AuthenticationType | |
| clientId (安全) | 在 Salesforce 实例设置中配置的连接应用程序的 OAuth 消费者密钥。通常,需要配置连接的应用程序,但可以通过安装软件包来提供。 | 字符串 | |
| clientSecret (security) | 在 Salesforce 实例设置中配置的连接应用程序的 OAuth Consumer Secret。 | 字符串 | |
| httpProxyAuthUri (security) | 用于针对 HTTP 代理服务器进行身份验证,需要匹配代理服务器的 URI,以便 httpProxyUsername 和 httpProxyPassword 用于身份验证。 | 字符串 | |
| httpProxyPassword (security) | 用于针对 HTTP 代理服务器进行身份验证的密码。 | 字符串 | |
| httpProxyRealm (security) | 代理服务器的域,用于针对 HTTP 代理服务器抢占 Basic/Digest 身份验证方法。 | 字符串 | |
| httpProxySecure (安全) | 如果设置为 false,则禁用在访问 HTTP 代理时使用 TLS。 | true | 布尔值 |
| httpProxyUseDigestAuth (security) | 如果设置为 true Digest 身份验证,将在向 HTTP 代理进行身份验证时使用,否则将使用基本授权方法。 | false | 布尔值 |
| httpProxyUsername (security) | 用于针对 HTTP 代理服务器进行身份验证的用户名。 | 字符串 | |
| instanceUrl (安全) | 身份验证后使用的 Salesforce 实例的 URL,在成功身份验证时从 Salesforce 中收到。 | 字符串 | |
| jwtAudience (security) | 使用 OAuth JWT 流时,用于 Audience 声明(aud)的值。如果没有设置,则使用登录 URL,这适用于大多数情况。 | 字符串 | |
| Keystore (安全) | 在 OAuth JWT 流中使用的密钥存储参数。KeyStore 应该仅包含一个带有私钥和证书的条目。Salesforce 不验证证书链,因此这可轻松是一个自签名证书。确保您将证书上传到对应的连接应用程序。 | KeyStoreParameters | |
| lazyLogin (security) | 如果设置为 true 可防止组件开始向 Salesforce 进行身份验证。您通常会将其设置为 (默认)false,并提前进行身份验证,并立即了解任何身份验证问题。 | false | 布尔值 |
| loginConfig (security) | 在一个嵌套 bean 中的所有身份验证配置,所有属性都可以直接在组件上设置。 | SalesforceLoginConfig | |
| loginUrl (security) | 用于身份验证的 Salesforce 实例的 必需 URL,默认设置为 https://login.salesforce.com。 | 字符串 | |
| 密码 (安全) | OAuth 流中使用的密码,以获取访问令牌的访问权限。使用密码 OAuth 流轻松开始,但在一般情况下,应该避免使用它,因为它认为比其他流不太安全。如果使用密码,请确保将安全令牌附加到密码的末尾。 | 字符串 | |
| refreshToken (security) | 刷新令牌已在刷新令牌 OAuth 流中获取。一个需要设置 Web 应用并配置回调 URL 以接收刷新令牌,或使用内置回调 https://login.salesforce.com/services/oauth2/success 或 https://test.salesforce.com/services/oauth2/success 配置,然后在流末尾从 URL 重新获取 refresh_token。请注意,在开发组织中,Salesforce 允许在 localhost 上托管回调 Web 应用程序。 | 字符串 | |
| sslContextParameters (security) | 要使用的 SSL 参数,请参阅所有可用选项的 SSLContextParameters 类。 | SSLContextParameters | |
| useGlobalSslContextParameters (security) | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| 用户名 (安全) | OAuth 流中使用的用户名,以获取访问令牌的访问权限。使用密码 OAuth 流轻松开始,但在一般情况下,应该避免使用它,因为它认为比其他流不太安全。 | 字符串 |
43.3. 端点选项
Salesforce 端点使用 URI 语法进行配置:
salesforce:operationName:topicName
使用以下路径和查询参数:
43.3.1. 路径参数(2 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| operationName (producer) | 要使用的操作。 Enum 值:
| OperationName | |
| topicName (consumer) | 要使用的主题/通道的名称。 | 字符串 |
43.3.2. 查询参数(57 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| apexMethod (common) | APEX 方法名称。 | 字符串 | |
| apexQueryParams (common) | 查询参数 APEX 方法。 | map | |
| apiVersion (common) | Salesforce API 版本. | 53.0 | 字符串 |
| backoffIncrement (common) | backoff 间隔递增,用于流连接重启尝试超过 CometD auto-reconnect 失败。 | 1000 | long |
| batchId (common) | 批量 API 批处理 ID. | 字符串 | |
| ContentType (common) | 批量 API 内容类型,其中一个 XML、CSV、ZZ_XML、ZZ_CSV。 Enum 值:
| ContentType | |
| defaultReplayId (common) | 如果没有在 initialReplayIdMap 中找到值,则默认的 replayId 设置。 | -1 | Long |
| fallBackReplayId (common) | ReplayId 在无效 Replay Id 响应后回退到。 | -1 | Long |
| 格式 (common) | 用于 Salesforce API 调用的有效负载格式(JSON 或 XML)默认为 JSON。自 Camel 3.12 起,此选项仅适用于 Raw 操作。 Enum 值:
| PayloadFormat | |
| httpclient ( common) | 自定义 Jetty Http Client 用于连接到 Salesforce。 | SalesforceHttpClient | |
| includeDetails (common) | 在 Salesforce1 分析报告中包含详细信息,默认为 false。 | 布尔值 | |
| initialReplayIdMap (common) | 重播 ID 从每个频道名称开始。 | map | |
| InstanceID (common) | Salesforce1 分析报告执行实例 ID. | 字符串 | |
| jobId (common) | 批量 API 作业 ID。 | 字符串 | |
| 限制 (通用) | 对返回的记录数量限制。适用于某些 API,检查 Salesforce 文档。 | 整数 | |
| 定位器 (common) | assumes Bulk 2.0 API 提供的定位器,用于获取查询作业的结果。 | 字符串 | |
| maxBackoff (common) | 与 CometD auto-reconnect 之外的失败流连接重启尝试的最大 backoff 间隔。 | 30000 | long |
| maxRecords (common) | 为 Bulk 2.0 Query 检索每个结果的最大记录数。请求仍会受到大小限制。如果您正在使用大量查询结果,在接收来自 Salesforce 的所有数据之前可能会出现超时问题。要防止超时,请指定客户端预期在 maxRecords 参数中接收的最大记录数。这会将结果分成较小的集合,其值为最大大小。 | 整数 | |
| notFoundBehaviour (common) | 设置从 Salesforce API 收到的 404 尚未找到的状态。如果正文设置为 NULL NotFoundBehaviour#NULL,或者应在 Exchange NotFoundBehaviour#EXCEPTION 上发送一个例外。 Enum 值:
| 例外 | NotFoundBehaviour |
| notifyForFields (common) | 通知字段,选项为 ALL、REFERENCED、SELECT、WHERE。 Enum 值:
| NotifyForFieldsEnum | |
| notifyForOperationCreate (common) | notify for create operation,默认为 false (API version = 29.0)。 | 布尔值 | |
| notifyForOperationDelete (common) | 通知删除操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
| notifyForOperations (common) | 通知操作,选项为 ALL、CREATE、EXTENDED、UPDATE (API 版本 29.0)。 Enum 值:
| NotifyForOperationsEnum | |
| notifyForOperationUndelete (common) | notify for un-delete 操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
| notifyForOperationUpdate (common) | 通知更新操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
| objectMapper (common) | 自定义 Jackson ObjectMapper,用于序列化/反序列化 Salesforce 对象。 | ObjectMapper | |
| pkChunking (common) | 使用 PK Chunking。仅用于原始 Bulk API。如有必要,批量 2.0 API 会自动执行 PK 块。 | 布尔值 | |
| pkChunkingChunkSize (common) | 与 PK Chunking 搭配使用的块大小。如果未指定,reforced 默认为 100,000。最大大小为 250,000。 | 整数 | |
| pkChunkingParent (common) | 在启用 PK 块以在共享对象上启用查询时,指定父对象。块基于父对象的记录,而不是共享对象的记录。例如,在 AccountShare 上查询时,将 Account 指定为父对象。只要支持父对象,支持 PK 块。 | 字符串 | |
| pkChunkingStartRow (common) | 指定 15 个字符或 18 个字符的记录 ID,用作第一个块的下限。在重启批处理之间失败的作业时,使用此参数指定起始 ID。 | 字符串 | |
| queryLocator (common) | 当查询结果超过一个调用中检索记录时,查询为使用查询器提供的查询定位器。在后续调用中使用这个值来检索其他记录。 | 字符串 | |
| rawPayload (common) | 使用原始有效负载字符串作为请求和响应(默认情况下,JSON 或 XML 取决于格式),而不是 DTOs。 | false | 布尔值 |
| reportId (common) | Salesforce1 分析报告 Id. | 字符串 | |
| reportMetadata (common) | 用于过滤的 Salesforce1 分析报告元数据。 | ReportMetadata | |
| resultId (common) | 批量 API 结果 ID。 | 字符串 | |
| sObjectBlobFieldName (common) | SObject blob 字段名称。 | 字符串 | |
| sObjectClass (common) | 完全限定的 SObject 类名称,通常使用 camel-salesforce-maven-plugin 生成。 | 字符串 | |
| sObjectFields (common) | 要检索的 SObject 字段。 | 字符串 | |
| sObjectId (common) | API 需要 SObject ID。 | 字符串 | |
| sObjectIdName (common) | SObject 外部 ID 字段名称。 | 字符串 | |
| sObjectIdValue (common) | SObject 外部 ID 字段值。 | 字符串 | |
| sObjectName (common) | 如果 API 需要或支持,则 SObject 名称。 | 字符串 | |
| sObjectQuery (common) | Salesforce SOQL 查询字符串. | 字符串 | |
| sObjectSearch (common) | Salesforce SOSL 搜索字符串. | 字符串 | |
| updateTopic (common) | 在使用 Streaming API 时是否更新现有的 Push Topic,默认为 false。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| replayId (consumer) | 订阅时要使用的 replayId 值。 | Long | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| allOrNone (producer) | 复合 API 选项,以指示在任何记录不成功时回滚所有记录。 | false | 布尔值 |
| apexUrl (producer) | APEX 方法 URL。 | 字符串 | |
| compositeMethod (producer) | 复合(原始)方法。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| rawHttpHeaders (producer) | 以逗号分隔的消息标头列表,以包含 作为 Raw 操作的 HTTP 参数。 | 字符串 | |
| rawMethod (producer) | 用于 Raw 操作的 HTTP 方法。 | 字符串 | |
| rawPath (producer) | 域名后面的端点 URL 部分。E.g., '/services/data/v52.0/sobjects/Account/'. | 字符串 | |
| rawQueryParameters (producer) | 以逗号分隔的消息标头列表,来作为 Raw 操作的查询参数。不要 url-encode 值,因为这将自动执行。 | 字符串 |
43.4. 向 Salesforce 进行身份验证
组件支持三个 OAuth 身份验证流:
对于每个流程,需要设置不同的属性集合:
表 43.1. 表 1。为每个身份验证流设置的属性
| 属性 | 在 Salesforce 上找到它的位置 | 流 |
|---|---|---|
| clientId | 连接的应用程序,消费者密钥 | 所有流 |
| clientSecret | Connect App, Consumer Secret | username-Password, Refresh Token |
| userName | Salesforce 用户用户名 | username-Password, JWT Bearer Token |
| password | Salesforce 用户密码 | username-Password |
| refreshToken | 从 OAuth 流回调 | 刷新令牌 |
| keystore | Connect App, Digital Certificate | JWT Bearer 令牌 |
组件自动决定您要配置的流,删除 ambiguity 设置 authenticationType 属性。
不建议在生产环境中使用 Username-Password Flow。
JWT Bearer 令牌流中使用的证书可以是自签名证书。包含证书和私钥的 KeyStore 必须仅包含单个 certificate-private key 条目。
43.5. URI 格式
当用作消费者时,接收流事件时,URI 方案为:
salesforce:topic?options
当用作制作者时,调用 Salesforce REST API,URI 方案为:
salesforce:operationName?options
43.6. 传递 Salesforce 标头并获取 Salesforce 响应标头
有支持通过入站消息 标头传递 Salesforce 标头,在 Camel 消息上以 Sforce 或 x-sfdc 开头的标头名称将在请求中传递,并且以 Sforce 开头的响应标头将在出站消息标头中显示。
例如,要获取 API 限制,您可以指定:
// in your Camel route set the header before Salesforce endpoint
//...
.setHeader("Sforce-Limit-Info", constant("api-usage"))
.to("salesforce:getGlobalObjects")
.to(myProcessor);
// myProcessor will receive `Sforce-Limit-Info` header on the outbound
// message
class MyProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
Message in = exchange.getIn();
String apiLimits = in.getHeader("Sforce-Limit-Info", String.class);
}
}
此外,HTTP 响应代码和文本可作为标头 Exchange.HTTP_RESPONSE_CODE 和 Exchange.HTTP_RESPONSE_TEXT 提供。
43.7. 支持的 Salesforce API
组件支持以下 Salesforce API
制作者端点可以使用以下 API:大多数 API 处理一次一个记录,Query API 可以检索多个记录。
43.7.1. REST API
您可以将以下内容用于 operationName :
- getVersions - 获取受支持的 Salesforce REST API 版本
- GetResources - 获取可用的 Salesforce REST 资源端点
- getGlobalObjects - 获取所有可用 SObject 类型的元数据
- getBasicInfo - 获取特定 SObject 类型的基本元数据
- getDescription - 获取特定 SObject 类型的综合元数据
- getSObject - 使用其 Salesforce Id 获取 SObject
- createSObject - 创建 SObject
- updateSObject - 使用 Id 更新 SObject
- deleteSObject - 使用 Id 删除 SObject
- getSObjectWithId - 使用外部(用户定义的)id 字段获取 SObject
- upsertSObject - 更新或使用外部 ID 插入 SObject
- deleteSObjectWithId - 使用外部 ID 删除 SObject
- query - 运行 Salesforce SOQL 查询
- queryMore - 使用从 'query' API 返回的结果链接获取更多结果(对于大量结果的情况)
- search - Runs a Salesforce SOSL query
- 限制 - 获取机构 API 用量限制
- recent - 获取最近的项
- Approval - 提交记录或记录(批量)用于批准过程
- Approvals - 获取所有批准过程列表
- 复合 - 提交最多 25 个相关 REST 请求并接收单个响应。也可以在不限制的情况下使用"原始"复合。
- composite-tree - 最多创建 200 个记录,其中带有父子关系(最多 5 个级别)
- composite-batch - 提交批处理中的请求组成
- compositeRetrieveSObjectCollections - Retrieve 同一对象类型的一个或多个记录。
- compositeCreateSObjectCollections - Add up to 200 记录,返回 SaveSObjectResult 对象列表。
- compositeUpdateSObjectCollections - 更新最多 200 记录,返回 SaveSObjectResult 对象列表。
- compositeUpsertSObjectCollections - 根据外部 ID 字段创建或更新(upsert)最多 200 个记录。返回 UpsertSObjectResult 对象列表。
- compositeDeleteSObjectCollections - 删除最多 200 记录,返回 SaveSObjectResult 对象列表。
- queryAll - 运行 SOQL 查询。它会返回因为合并(最多三个记录)而删除删除的结果,同时删除其他记录,并删除所有相关记录。另外,还会返回有关归档任务和事件记录的信息。
- getBlobField - 从单个记录检索指定的 blob 字段。
- apexCall - 执行用户定义的 APEX REST API 调用。
- Raw - 将请求发送到 Netavark,并对端点、参数、正文等具有完整的原始控制。
例如,以下制作者端点使用 upsertSObject API,并将 sObjectIdName 参数指定 'Name' 作为外部 id 字段。请求消息正文应该是使用 maven 插件生成的 SObject DTO。如果更新了现有记录,或者新记录 ID 为 id,则响应消息为 null,或者在创建新对象时出现错误列表。
...to("salesforce:upsertSObject?sObjectIdName=Name")...43.7.2. 批量 2.0 API
Bulk 2.0 API 在原始 Bulk API 上有一个简化的模型。使用它来快速将大量数据加载到 Netavark 中,或者查询大量数据 from of sales。数据必须以 CSV 格式提供。Bulk 2.0 的最低 API 版本是 v41.0。Bulk Queries 的最小 API 版本为 v47.0。以下 DTO 类来自 org.apache.camel.component.salesforce.api.dto.bulkv2 软件包。支持以下操作:
-
bulk2CreateJob - 创建批量作业。在邮件正文中提供
作业实例。 -
bulk2GetJob - 获取现有作业。
jobId参数是必需的。 -
bulk2CreateBatch - 向作业添加 CSV 记录的批处理。在邮件正文中提供 CSV 数据。第一行必须包含标头。
jobId参数是必需的。 -
bulk2CloseJob - 关闭作业。您必须关闭作业,以便其处理或中止/删除。
jobId参数是必需的。 -
bulk2AbortJob - Abort a job.
jobId参数是必需的。 -
bulk2DeleteJob - 删除作业。
jobId参数是必需的。 -
bulk2GetSuccessfulResults - 获取作业成功的结果。返回的消息正文将包含 CSV 数据的 InputStream。
jobId参数是必需的。 -
bulk2GetFailedResults - 获取作业失败的结果。返回的消息正文将包含 CSV 数据的 InputStream。
jobId参数是必需的。 -
bulk2GetUnprocessedRecords - 为作业获取未处理的记录。返回的消息正文将包含 CSV 数据的 InputStream。
jobId参数是必需的。 -
bulk2GetAllJobs - 获取所有作业。响应正文是
作业的实例。如果done属性为 false,则需要额外的页面来获取,nextRecordsUrl属性包含在后续调用的queryLocator参数中设置的值。 -
bulk2CreateQueryJob - 创建批量查询作业。在邮件正文中提供
QueryJob实例。 -
bulk2GetQueryJob - 获取批量查询作业。
jobId参数是必需的。 -
bulk2GetQueryJobResults - 获取批量查询作业结果。
jobId参数是必需的。接受maxRecords和locator参数。响应消息标头包括Sforce-NumberOfRecords和Sforce-Locator标头。Sforce-Locator的值可通过locator参数传递给后续调用中。 -
bulk2AbortQueryJob - Abort a bulk query job.
jobId参数是必需的。 -
bulk2DeleteQueryJob - 删除批量查询作业。
jobId参数是必需的。 -
bulk2GetAllQueryJobs - 获取所有作业。响应正文是
QueryJobs的实例。如果done属性为 false,则需要额外的页面来获取,nextRecordsUrl属性包含在后续调用的queryLocator参数中设置的值。
43.7.3. REST Bulk (原始)API
制作者端点可以使用以下 API:支持所有作业数据格式,即 xml、csv、zip/xml 和 zip/csv。
路由必须全部使用请求和响应。通常,请求会像 CSV 文件一样,一些流源
,响应也可能被保存到与请求关联的文件中。
您可以将以下内容用于 operationName :
-
createJob - Creates a Salesforce Bulk Job.必须在正文中提供
JobInfo实例。PK Chunking 通过 pkChunking* 选项支持。请查看 这里 的说明。 - getJob - Gets a Job using its Salesforce Id
- closeJob - Closes a Job
- abortJob - Aborts a Job
- createBatch - 在 Bulk 作业中提交 Batch
- getBatch - 使用 Id 获取批处理
- getAllBatches - 获取 Bulk Job Id 的所有批处理
- getRequest - 获取批处理的请求数据(XML/CSV)
- getResults - 完成后获取 Batch 的结果
- createBatchQuery - 从 SOQL 查询创建批处理
- getQueryResultIds - 为 Batch Query 获取 Result Ids 列表
- getQueryResult - 获取结果 Result Id
- getRecentReports - 通过向 Report List 资源发送 GET 请求,获取最多 200 个报告报告报告。
- getReportDescription - 按 tabular 或 summary 或 matrix 格式查找报告、报告类型和相关元数据。
- executeSyncReport - 同步或不更改过滤器的报告并返回最新的摘要数据。
- executeAsyncReport - 使用或不带过滤器异步运行报告实例,并通过或不详情返回摘要数据。
- getReportInstances - 返回您请求异步运行的报告的实例列表。列表中的每一项被视为报告的单独实例。
- getReportResults :包含运行报告的结果。
例如,以下制作者端点使用 createBatch API 来创建作业 Batch:in 消息必须包含可转换为 InputStream (通常是 UTF-8 CSV 或 XML 内容)和标题字段 'jobId' 的正文,以及作业内容类型的 'contentType',可以是 XML、CSV、JZ_XML 或 ZIP_CSV。put 消息正文将包含 BatchInfo 成功,或抛出 SalesforceException 错误。
...to("salesforce:createBatch")..43.7.4. REST Streaming API
消费者端点可以使用以下语法在创建/更新时接收 Salesforce 通知。
创建并订阅一个主题
from("salesforce:CamelTestTopic?notifyForFields=ALL¬ifyForOperations=ALL&sObjectName=Merchandise__c&updateTopic=true&sObjectQuery=SELECT Id, Name FROM Merchandise__c")...订阅现有主题
from("salesforce:CamelTestTopic&sObjectName=Merchandise__c")...43.7.5. 平台事件
要发送平台事件,请使用 createSObject 操作。并设置消息正文可以是 JSON 字符串或 InputStream,带有键-值 data network- 软件仓库,在这种情况下 sObjectName 需要设置为事件的 API 名称,或使用适当的类名称从 AbstractDTOBase 进行扩展。
例如,使用 DTO:
class Order_Event__e extends AbstractDTOBase {
@JsonProperty("OrderNumber")
private String orderNumber;
// ... other properties and getters/setters
}
from("timer:tick")
.process(exchange -> {
final Message in = exchange.getIn();
String orderNumber = "ORD" + exchange.getProperty(Exchange.TIMER_COUNTER);
Order_Event__e event = new Order_Event__e();
event.setOrderNumber(orderNumber);
in.setBody(event);
})
.to("salesforce:createSObject");或使用 JSON 事件数据:
from("timer:tick")
.process(exchange -> {
final Message in = exchange.getIn();
String orderNumber = "ORD" + exchange.getProperty(Exchange.TIMER_COUNTER);
in.setBody("{\"OrderNumber\":\"" + orderNumber + "\"}");
})
.to("salesforce:createSObject?sObjectName=Order_Event__e");
要接收平台事件,使用带有前缀 event/(或 / event/ )的 API 事件的使用者端点,例如:Salesforce :events/Order_Event_e。从该端点消耗的处理器将分别收到 org.apache.camel.component.salesforce.api.dto.PlatformEvent 对象或 org.cometd.bayeux.Message,具体取决于正文中的 rawPayload 为 false 或 true。
例如,使用最简单的形式来消耗一个事件:
PlatformEvent event = consumer.receiveBody("salesforce:event/Order_Event__e", PlatformEvent.class);43.7.6. 更改数据捕获事件
一次,可以将 Salesforce 配置为发出通知以记录所选对象的记录更改。另一方面,Camel Salesforce 组件可能会响应此类通知,允许实例 将这些更改同步到外部系统。
可以通过订阅频道在 Camel 路由的 from ("Salesforce:XXX") 子句中指定感兴趣的通知,例如:
from("salesforce:data/ChangeEvents?replayId=-1").log("being notified of all change events")
from("salesforce:data/AccountChangeEvent?replayId=-1").log("being notified of change events for Account records")
from("salesforce:data/Employee__ChangeEvent?replayId=-1").log("being notified of change events for Employee__c custom object")
根据正文中的 rawPayload 为 false 或 true,收到的消息包含 java.util.Map<String,Object > 或 org.cometd.bayeux.Message。CamelSalesforceChangeType 标头的值可以是 CREATE、UPDATE、DELETE 或 UNDELETE 之一。
有关如何使用 Camel Salesforce 组件更改数据捕获功能的更多详细信息,请参阅 ChangeEventsConsumerIntegrationTest。
Salesforce 开发人员指南 非常适合更好地了解如何实施更改数据捕获应用程序。更改事件正文字段的动态性质,高级复制步骤以及安全注意事项可能会值得关注。
43.8. 例子
43.8.1. 上传文档到内容工作空间
使用 Processor 实例在 Java 中创建 ContentVersion:
public class ContentProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
Message message = exchange.getIn();
ContentVersion cv = new ContentVersion();
ContentWorkspace cw = getWorkspace(exchange);
cv.setFirstPublishLocationId(cw.getId());
cv.setTitle("test document");
cv.setPathOnClient("test_doc.html");
byte[] document = message.getBody(byte[].class);
ObjectMapper mapper = new ObjectMapper();
String enc = mapper.convertValue(document, String.class);
cv.setVersionDataUrl(enc);
message.setBody(cv);
}
protected ContentWorkspace getWorkSpace(Exchange exchange) {
// Look up the content workspace somehow, maybe use enrich() to add it to a
// header that can be extracted here
----
}
}将处理器的输出提供给 Salesforce 组件:
from("file:///home/camel/library")
.to(new ContentProcessor()) // convert bytes from the file into a ContentVersion SObject
// for the salesforce component
.to("salesforce:createSObject");43.9. Using Salesforce Limits API
使用 oforce:limits 操作,您可以从 Salesforce 获取 API 限制,然后对接收的数据采取措施。Guide :limits 操作的结果映射到 org.apache.camel.component.salesforce.api.dto.Limits 类,并可用于自定义处理器或表达式。
例如,请考虑您需要限制 Salesforce 的 API 使用量,以便其他路由保留 10% 的每日 API 请求。输出消息正文包含 org.apache.camel.component.salesforce.api.dto.Limits 对象的实例,可与基于 Content Based Router 和 Content Based Router 和 Spring Expression Language (SpEL) 一起使用,用于选择何时执行查询。
请注意,在 body.dailyApiRequests.remaining 中保存的整数值的 1.0 如何使表达式评估为与浮点算一样的表达式评估,而不包括浮动点,则最终最终产生集成块,从而导致有 0 (一些 API 限制消耗的 API 限制)或 1 ( 不使用 API 限制)。
from("direct:querySalesforce")
.to("salesforce:limits")
.choice()
.when(spel("#{1.0 * body.dailyApiRequests.remaining / body.dailyApiRequests.max < 0.1}"))
.to("salesforce:query?...")
.otherwise()
.setBody(constant("Used up Salesforce API limits, leaving 10% for critical routes"))
.endChoice()43.10. 使用批准
所有属性的名称与前缀为 approval 的 Salesforce REST API 中的名称完全相同。您可以通过设置 Endpoint 的 approval.PropertyName 来设置批准属性,这些属性将用作 templateDAEMON-rhacmmean,正文或标头中不存在的任何属性都将从 Endpoint 配置中获取。或者,您可以通过将 批准 属性分配给对 Registry 中的 Bean 的引用,在 Endpoint 上设置批准策略。
您还可以使用传入消息标头中相同的 approval.PropertyName 提供标头值。
最后,正文可以包含一个 AprovalRequest 或 ApprovalRequest 对象的 Iterable of ApprovalRequest,以便作为批处理处理。
请记住的一个重要事项是以下三种机制中指定的值的优先级:
- 正文中的值在任何其他值之前优先
- 消息标头中的值在模板值之前具有优先权
- 如果给出了标头或正文中没有其他值,则会设置模板中的值
例如,要使用标头中的值发送一个记录进行批准:
给定路由:
from("direct:example1")//
.setHeader("approval.ContextId", simple("${body['contextId']}"))
.setHeader("approval.NextApproverIds", simple("${body['nextApproverIds']}"))
.to("salesforce:approval?"//
+ "approval.actionType=Submit"//
+ "&approval.comments=this is a test"//
+ "&approval.processDefinitionNameOrId=Test_Account_Process"//
+ "&approval.skipEntryCriteria=true");您可以使用以下方法发送记录进行批准:
final Map<String, String> body = new HashMap<>();
body.put("contextId", accountIds.iterator().next());
body.put("nextApproverIds", userId);
final ApprovalResult result = template.requestBody("direct:example1", body, ApprovalResult.class);43.11. 使用 Salesforce Recent Items API
若要获取最近的项目,请使用 Netavark:recent 操作。此操作会返回一个 org.apache.camel.component.salesforce.api.dto.RecentItem 对象(List<RecentItem>)的 ,其中包含 java.util.List Id、Name 和 Attributes (带 type 和 url 属性)。您可以通过将 limit 参数设置为要返回的最大记录数来限制返回的项目数量。例如:
from("direct:fetchRecentItems")
to("salesforce:recent")
.split().body()
.log("${body.name} at ${body.attributes.url}");43.12. 使用 Salesforce Composite API 提交 SObject 树
要创建包含父子关系在内的 200 个记录,请使用 Netavark:composite-tree 操作。这需要在输入消息中包括 org.apache.camel.component.salesforce.api.dto.composite.SObjectTree 实例,并在输出消息中返回相同的对象树。树中的 org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase 实例会使用标识符值(Id 属性)或对应的 org.apache.camel.component.salesforce.api.dto.composite.SObjectNode 实例进行更新,并出现错误。
请注意,对于某些记录操作,某些记录操作可能会成功,且在某些记录中,您需要手动检查错误。
使用此功能的最简单方法是使用 camel-salesforce-maven-plugin 生成的 DTOs,但您也可以选择自定义引用来标识树中的每个对象,用于您的数据库中的实例主密钥。
让我们来看看:
Account account = ...
Contact president = ...
Contact marketing = ...
Account anotherAccount = ...
Contact sales = ...
Asset someAsset = ...
// build the tree
SObjectTree request = new SObjectTree();
request.addObject(account).addChildren(president, marketing);
request.addObject(anotherAccount).addChild(sales).addChild(someAsset);
final SObjectTree response = template.requestBody("salesforce:composite-tree", tree, SObjectTree.class);
final Map<Boolean, List<SObjectNode>> result = response.allNodes()
.collect(Collectors.groupingBy(SObjectNode::hasErrors));
final List<SObjectNode> withErrors = result.get(true);
final List<SObjectNode> succeeded = result.get(false);
final String firstId = succeeded.get(0).getId();43.13. 使用 Salesforce Composite API 在批处理中提交多个请求
Composite API 批处理操作(复合-batch)允许您在批处理中积累多个请求,然后一次性提交它们,从而节省多个单独请求的往返成本。然后,每个响应都会在保留顺序的响应列表中收到,因此第 n 个请求响应位于响应的第 n 个位置。
结果可能因 API 和 API 不同,因此请求的结果会作为 java.lang.Object 提供。在大多数情况下,结果将是 java.util.Map,它带有字符串键和值,或其他 java.util.Map 作为值。请求以 JSON 格式发出并存放了一些类型信息(例如,它知道哪些值是字符串,以及数值是什么)。
让我们来看看:
final String acountId = ...
final SObjectBatch batch = new SObjectBatch("38.0");
final Account updates = new Account();
updates.setName("NewName");
batch.addUpdate("Account", accountId, updates);
final Account newAccount = new Account();
newAccount.setName("Account created from Composite batch API");
batch.addCreate(newAccount);
batch.addGet("Account", accountId, "Name", "BillingPostalCode");
batch.addDelete("Account", accountId);
final SObjectBatchResponse response = template.requestBody("salesforce:composite-batch", batch, SObjectBatchResponse.class);
boolean hasErrors = response.hasErrors(); // if any of the requests has resulted in either 4xx or 5xx HTTP status
final List<SObjectBatchResult> results = response.getResults(); // results of three operations sent in batch
final SObjectBatchResult updateResult = results.get(0); // update result
final int updateStatus = updateResult.getStatusCode(); // probably 204
final Object updateResultData = updateResult.getResult(); // probably null
final SObjectBatchResult createResult = results.get(1); // create result
@SuppressWarnings("unchecked")
final Map<String, Object> createData = (Map<String, Object>) createResult.getResult();
final String newAccountId = createData.get("id"); // id of the new account, this is for JSON, for XML it would be createData.get("Result").get("id")
final SObjectBatchResult retrieveResult = results.get(2); // retrieve result
@SuppressWarnings("unchecked")
final Map<String, Object> retrieveData = (Map<String, Object>) retrieveResult.getResult();
final String accountName = retrieveData.get("Name"); // Name of the retrieved account, this is for JSON, for XML it would be createData.get("Account").get("Name")
final String accountBillingPostalCode = retrieveData.get("BillingPostalCode"); // Name of the retrieved account, this is for JSON, for XML it would be createData.get("Account").get("BillingPostalCode")
final SObjectBatchResult deleteResult = results.get(3); // delete result
final int updateStatus = deleteResult.getStatusCode(); // probably 204
final Object updateResultData = deleteResult.getResult(); // probably null43.14. 使用 Salesforce Composite API 提交多个链请求
复合 操作允许提交最多 25 个请求,这些请求可串联前面请求中生成的实例标识符,可在后续请求中使用。单个请求和响应与提供的 参考 相关联。
复合 API 仅支持 JSON 载荷。
与批处理 API 一样,结果可能因 API 和 API 不同,因此请求的结果会作为 java.lang.Object 提供。在大多数情况下,结果将是 java.util.Map,它带有字符串键和值,或其他 java.util.Map 作为值。以 JSON 格式发出请求会保存一些类型信息(例如,它知道哪个值是字符串的值,以及数字是什么)。
让我们来看看:
SObjectComposite composite = new SObjectComposite("38.0", true);
// first insert operation via an external id
final Account updateAccount = new TestAccount();
updateAccount.setName("Salesforce");
updateAccount.setBillingStreet("Landmark @ 1 Market Street");
updateAccount.setBillingCity("San Francisco");
updateAccount.setBillingState("California");
updateAccount.setIndustry(Account_IndustryEnum.TECHNOLOGY);
composite.addUpdate("Account", "001xx000003DIpcAAG", updateAccount, "UpdatedAccount");
final Contact newContact = new TestContact();
newContact.setLastName("John Doe");
newContact.setPhone("1234567890");
composite.addCreate(newContact, "NewContact");
final AccountContactJunction__c junction = new AccountContactJunction__c();
junction.setAccount__c("001xx000003DIpcAAG");
junction.setContactId__c("@{NewContact.id}");
composite.addCreate(junction, "JunctionRecord");
final SObjectCompositeResponse response = template.requestBody("salesforce:composite", composite, SObjectCompositeResponse.class);
final List<SObjectCompositeResult> results = response.getCompositeResponse();
final SObjectCompositeResult accountUpdateResult = results.stream().filter(r -> "UpdatedAccount".equals(r.getReferenceId())).findFirst().get()
final int statusCode = accountUpdateResult.getHttpStatusCode(); // should be 200
final Map<String, ?> accountUpdateBody = accountUpdateResult.getBody();
final SObjectCompositeResult contactCreationResult = results.stream().filter(r -> "JunctionRecord".equals(r.getReferenceId())).findFirst().get()43.15. 使用"原始" Salesforce 复合
由于 rawPayload 选项,可以通过准备路由中的 Salesforce JSON 请求直接调用 Salesforce 复合。
例如,您可以有以下路由:
from("timer:fire?period=2000").setBody(constant("{\n" +
" \"allOrNone\" : true,\n" +
" \"records\" : [ { \n" +
" \"attributes\" : {\"type\" : \"FOO\"},\n" +
" \"Name\" : \"123456789\",\n" +
" \"FOO\" : \"XXXX\",\n" +
" \"ACCOUNT\" : 2100.0\n" +
" \"ExternalID\" : \"EXTERNAL\"\n"
" }]\n" +
"}")
.to("salesforce:composite?rawPayload=true")
.log("${body}");
该路由直接创建正文为 JSON,并使用 rawPayload=true 选项直接提交到 tmux 端点。
通过此方法,您可以对 Salesforce 请求进行完全控制。
POST 是用来发送原始 Composite 请求到 Netavark 的默认 HTTP 方法。使用 compositeMethod 选项覆盖其他支持的值 GET,这将返回其他可用复合资源列表。
43.16. 使用 Raw 操作
通过对调用的所有方面具有完全原始控制,将 HTTP 请求发送到具有完整的原始控制。路由中必须执行任何请求和响应正文的序列化或反序列化。Content-Type HTTP 标头将根据 format 选项自动设置,但可以通过 rawHttpHeaders 选项覆盖。
| 参数 | 类型 | 描述 | 默认 | 必填 |
|---|---|---|---|---|
| request body |
| HTTP 请求正文 | ||
| rawPath |
| 域名后端点 URL 部分,如 '/services/data/v51.0/sobjects/Account/' | x | |
| rawMethod |
| HTTP 方法 | x | |
| rawQueryParameters |
| 要作为查询参数包含的消息标头的逗号分隔列表。不要 url-encode 值,因为这将自动执行。 | ||
| rawHttpHeaders |
| 以逗号分隔的消息标头列表,来作为 HTTP 标头包含 |
43.16.1. 查询示例
在本例中,我们将发送查询到 REST API。查询必须在名为"q"的 URL 参数中传递,因此我们将创建一个名为 q 的消息标头并告知原始操作将消息标头作为 URL 参数包含:
from("direct:queryExample")
.setHeader("q", "SELECT Id, LastName FROM Contact")
.to("salesforce:raw?format=JSON&rawMethod=GET&rawQueryParameters=q&rawPath=/services/data/v51.0/query")
// deserialize JSON results or handle in some other way43.16.2. SObject 示例
在这个示例中,我们将在 创建 操作中传递 REST API。由于 raw 操作不执行任何序列化,因此我们确保在消息正文中传递 XML
from("direct:createAContact")
.setBody(constant("<Contact><LastName>TestLast</LastName></Contact>"))
.to("salesforce:raw?format=XML&rawMethod=POST&rawPath=/services/data/v51.0/sobjects/Contact")响应是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Result>
<id>0034x00000RnV6zAAF</id>
<success>true</success>
</Result>43.17. 使用 Composite SObject Collections
SObject Collections API 对一个请求中的多个记录执行操作。使用 sObject Collections 减少客户端和服务器间的往返次数。整个请求计算为对 API 限制的单个调用。此资源在 API 版本 42.0 及更高版本中可用。向这些操作提供的 SObject 记录(aka DTOs)必须是 AbstractDescribedSObjectBase 的子类实例。有关生成这些 DTO 类的信息,请参阅 Maven 插件部分。这些操作序列化为 JSON 提供的 DTO。
43.17.1. compositeRetrieveSObjectCollections
检索同一对象类型的一个或多个记录。
| 参数 | 类型 | 描述 | 默认 | 必填 |
|---|---|---|---|---|
| ID | String 或 comma 分隔字符串列表 | 要返回的一个或多个对象 ID 的列表。所有 ID 必须属于同一对象类型。 | x | |
| fields | String 或 comma 分隔字符串列表 | 响应中要包含的字段列表。您指定的字段名称必须有效,并且每个字段必须具有 read-level 权限。 | x | |
| sObjectName | 字符串 |
SObject 的类型,如 | x | |
| sObjectClass | 字符串 | 用于反序列化响应的 DTO 类的完全限定类名称。 |
如果 |
43.17.2. compositeCreateSObjectCollections
添加最多 200 记录,返回 SaveSObjectResult 对象列表。支持混合 SObject 类型。
| 参数 | 类型 | 描述 | 默认 | 必填 |
|---|---|---|---|---|
| request body |
| 要创建的 SObjects 列表 | x | |
| allOrNone | 布尔值 | 指明在创建任何对象失败时(true)还是继续在请求中独立创建其他对象时回滚整个请求。 | false |
43.17.3. compositeUpdateSObjectCollections
更新 200 记录,返回 SaveSObjectResult 对象列表。支持混合 SObject 类型。
| 参数 | 类型 | 描述 | 默认 | 必填 |
|---|---|---|---|---|
| request body |
| 要更新的 SObjects 列表 | x | |
| allOrNone | 布尔值 | 指明在任何对象更新失败时(true)还是继续独立于请求中其他对象的更新,是否回滚整个请求。 | false |
43.17.4. compositeUpsertSObjectCollections
根据外部 ID 字段创建或更新(upsert)最多 200 记录,返回一个 UpsertSObjectResult 对象列表。不支持混合 SObject 类型。
| 参数 | 类型 | 描述 | 默认 | 必填 |
|---|---|---|---|---|
| request body |
| SObjects to upsert 列表 | x | |
| allOrNone | 布尔值 | 指明在任何对象的 upsert 失败时(true)还是继续与请求中其他对象的独立 upsert 时回滚整个请求。 | false | |
| sObjectName | 字符串 |
SObject 的类型,如 | x | |
| sObjectIdName | 字符串 | External ID 字段的名称 | x |
43.17.5. compositeDeleteSObjectCollections
删除最多 200 记录,返回 DeleteSObjectResult 对象列表。支持混合 SObject 类型。
| 参数 | 类型 | 描述 | 默认 | 必填 |
|---|---|---|---|---|
|
| String 或 comma 分隔字符串列表 | 要删除的对象最多 200 个 ID 的列表。 | x | |
|
| 布尔值 | 指明在删除任何对象失败时(true)还是继续独立删除请求时是否回滚整个请求。 | false |
43.18. 将 null 值发送到 HEKETI
默认情况下,带有 null 值的 SObject 字段不会发送到 Netavark。要将 null 值发送到 exercise,请使用 fieldsToNull 属性,如下所示:
accountSObject.getFieldsToNull().add("Site");43.19. 生成 SOQL 查询字符串
org.apache.camel.component.salesforce.api.utils.QueryHelper 包含生成 SOQL 查询的帮助方法。例如,若要从 帐户 SObject 获取所有自定义字段,只需通过调用来只生成 SOQL SELECT :
String allCustomFieldsQuery = QueryHelper.queryToFetchFilteredFieldsOf(new Account(), SObjectField::isCustom);
43.20. Camel Salesforce Maven 插件
此 Maven 插件为 Camel 生成 DTO。
显然,建议不要在 pom.xml 中设置 clientId、clientSecret、userName 和 password 字段。该插件应该为其余属性配置,并可以使用以下命令来执行:
mvn camel-salesforce:generate -DcamelSalesforce.clientId=<clientid> -DcamelSalesforce.clientSecret=<clientsecret> \
-DcamelSalesforce.userName=<username> -DcamelSalesforce.password=<password>
生成的 DTOs 使用 Jackson 注解。所有 Salesforce 字段类型都被支持。日期和时间字段默认映射到 java.time.ZonedDateTime,picklist 字段映射到生成的 Java Enumerations。
有关如何生成 DTO 的详细信息,请参阅 README.md。
43.21. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 tmux 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-salesforce-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 91 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.salesforce.all-or-none | 复合 API 选项,以指示在任何记录不成功时回滚所有记录。 | false | 布尔值 |
| camel.component.salesforce.apex-method | APEX 方法名称。 | 字符串 | |
| camel.component.salesforce.apex-query-params | 查询参数 APEX 方法。 | map | |
| camel.component.salesforce.apex-url | APEX 方法 URL。 | 字符串 | |
| camel.component.salesforce.api-version | Salesforce API 版本. | 53.0 | 字符串 |
| camel.component.salesforce.authentication-type | 要使用的显式身份验证方法、USERNAME_PASSWORD、REFRESH_TOKEN 或 JWT 之一。Salesforce 组件可以从属性集自动确定要使用的身份验证方法,将此属性设置为消除任何不确定性。 | AuthenticationType | |
| camel.component.salesforce.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.salesforce.backoff-increment | backoff 间隔递增,用于流连接重启尝试超过 CometD auto-reconnect 失败。选项是一个长类型。 | 1000 | Long |
| camel.component.salesforce.batch-id | 批量 API 批处理 ID. | 字符串 | |
| camel.component.salesforce.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.salesforce.client-id | 在 Salesforce 实例设置中配置的已连接的应用程序的 OAuth 消费者密钥。通常,需要配置连接的应用程序,但可以通过安装软件包来提供。 | 字符串 | |
| camel.component.salesforce.client-secret | 在 Salesforce 实例设置中配置的连接应用程序的 OAuth Consumer Secret。 | 字符串 | |
| camel.component.salesforce.composite-method | 复合(原始)方法。 | 字符串 | |
| camel.component.salesforce.config | 全局端点配置 - 用于设置适用于所有端点的值。选项是 org.apache.camel.component.salesforce.SalesforceEndpointConfig 类型。 | SalesforceEndpointConfig | |
| camel.component.salesforce.content-type | 批量 API 内容类型,其中一个 XML、CSV、ZZ_XML、ZZ_CSV。 | ContentType | |
| camel.component.salesforce.default-replay-id | 如果没有在 initialReplayIdMap 中找到值,则默认的 replayId 设置。 | -1 | Long |
| camel.component.salesforce.enabled | 是否启用 Salesforce 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.salesforce.fall-back-replay-id | ReplayId 在无效 Replay Id 响应后回退到。 | -1 | Long |
| camel.component.salesforce.format | 用于 Salesforce API 调用的有效负载格式(JSON 或 XML)默认为 JSON。自 Camel 3.12 起,此选项仅适用于 Raw 操作。 | PayloadFormat | |
| camel.component.salesforce.http-client | 自定义 Jetty Http Client 用于连接到 Salesforce。选项是 org.apache.camel.component.salesforce.SalesforceHttpClient 类型。 | SalesforceHttpClient | |
| camel.component.salesforce.http-client-connection-timeout | 连接到 Salesforce 服务器时 HttpClient 使用的连接超时。 | 60000 | Long |
| camel.component.salesforce.http-client-idle-timeout | HttpClient 在等待 Salesforce 服务器响应时使用的超时。 | 10000 | Long |
| camel.component.salesforce.http-client-properties | 用于设置底层 HTTP 客户端上配置的任何属性。了解所有可用选项的 SalesforceHttpClient 和 Jetty HttpClient 的属性。 | map | |
| camel.component.salesforce.http-max-content-length | HTTP 响应的最大内容长度。 | 整数 | |
| camel.component.salesforce.http-proxy-auth-uri | 用于针对 HTTP 代理服务器进行身份验证,需要匹配代理服务器的 URI,以便 httpProxyUsername 和 httpProxyPassword 用于身份验证。 | 字符串 | |
| camel.component.salesforce.http-proxy-excluded-addresses | 不应使用 HTTP 代理服务器的地址列表。 | Set | |
| camel.component.salesforce.http-proxy-host | 要使用的 HTTP 代理服务器的主机名。 | 字符串 | |
| camel.component.salesforce.http-proxy-included-addresses | 应使用 HTTP 代理服务器的地址列表。 | Set | |
| camel.component.salesforce.http-proxy-password | 用于针对 HTTP 代理服务器进行身份验证的密码。 | 字符串 | |
| camel.component.salesforce.http-proxy-port | 要使用的 HTTP 代理服务器的端口号。 | 整数 | |
| camel.component.salesforce.http-proxy-realm | 代理服务器的域,用于针对 HTTP 代理服务器抢占 Basic/Digest 身份验证方法。 | 字符串 | |
| camel.component.salesforce.http-proxy-secure | 如果设置为 false,则禁用在访问 HTTP 代理时使用 TLS。 | true | 布尔值 |
| camel.component.salesforce.http-proxy-socks4 | 如果设置为 true,则将 HTTP 代理配置为用作 SOCKS4 代理。 | false | 布尔值 |
| camel.component.salesforce.http-proxy-use-digest-auth | 如果设置为 true Digest 身份验证,将在向 HTTP 代理进行身份验证时使用,否则将使用基本授权方法。 | false | 布尔值 |
| camel.component.salesforce.http-proxy-username | 用于针对 HTTP 代理服务器进行身份验证的用户名。 | 字符串 | |
| camel.component.salesforce.http-request-buffer-size | HTTP 请求缓冲区大小。对于大型 SOQL 查询,可能需要增加。 | 8192 | 整数 |
| camel.component.salesforce.include-details | 在 Salesforce1 分析报告中包含详细信息,默认为 false。 | 布尔值 | |
| camel.component.salesforce.initial-replay-id-map | 重播 ID 从每个频道名称开始。 | map | |
| camel.component.salesforce.instance-id | Salesforce1 分析报告执行实例 ID. | 字符串 | |
| camel.component.salesforce.instance-url | 身份验证后使用的 Salesforce 实例的 URL,在成功身份验证时从 Salesforce 中收到。 | 字符串 | |
| camel.component.salesforce.job-id | 批量 API 作业 ID。 | 字符串 | |
| camel.component.salesforce.jwt-audience | 使用 OAuth JWT 流时,用于 Audience 声明(aud)的值。如果没有设置,则使用登录 URL,这适用于大多数情况。 | 字符串 | |
| camel.component.salesforce.keystore | 在 OAuth JWT 流中使用的密钥存储参数。KeyStore 应该仅包含一个带有私钥和证书的条目。Salesforce 不验证证书链,因此这可轻松是一个自签名证书。确保您将证书上传到对应的连接应用程序。选项是 org.apache.camel.support.jsse.KeyStoreParameters 类型。 | KeyStoreParameters | |
| camel.component.salesforce.lazy-login | 如果设置为 true 可防止组件开始向 Salesforce 进行身份验证。您通常会将其设置为 (默认)false,并提前进行身份验证,并立即了解任何身份验证问题。 | false | 布尔值 |
| camel.component.salesforce.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.salesforce.limit | 对返回的记录数量限制。适用于某些 API,检查 Salesforce 文档。 | 整数 | |
| camel.component.salesforce.locator | assumes Bulk 2.0 API 提供的定位器,用于获取查询作业的结果。 | 字符串 | |
| camel.component.salesforce.login-config | 在一个嵌套 bean 中的所有身份验证配置,所有属性都可以直接在组件上设置。选项是一个 org.apache.camel.component.salesforce.SalesforceLoginConfig 类型。 | SalesforceLoginConfig | |
| camel.component.salesforce.login-url | 用于身份验证的 Salesforce 实例的 URL,默认设置为。 | 字符串 | |
| camel.component.salesforce.long-polling-transport-properties | 用于设置流 api 使用的 BayeuxClient (CometD)使用的 LongPollingTransport 上配置的任何属性。 | map | |
| camel.component.salesforce.max-backoff | 与 CometD auto-reconnect 之外的失败流连接重启尝试的最大 backoff 间隔。选项是一个长类型。 | 30000 | Long |
| camel.component.salesforce.max-records | 为 Bulk 2.0 Query 检索每个结果的最大记录数。请求仍会受到大小限制。如果您正在使用大量查询结果,在接收来自 Salesforce 的所有数据之前可能会出现超时问题。要防止超时,请指定客户端预期在 maxRecords 参数中接收的最大记录数。这会将结果分成较小的集合,其值为最大大小。 | 整数 | |
| camel.component.salesforce.not-found-behaviour | 设置从 Salesforce API 收到的 404 尚未找到的状态。如果正文设置为 NULL NotFoundBehaviour#NULL,或者应在 Exchange NotFoundBehaviour#EXCEPTION 上发送一个例外。 | NotFoundBehaviour | |
| camel.component.salesforce.notify-for-fields | 通知字段,选项为 ALL、REFERENCED、SELECT、WHERE。 | NotifyForFieldsEnum | |
| camel.component.salesforce.notify-for-operation-create | notify for create operation,默认为 false (API version = 29.0)。 | 布尔值 | |
| camel.component.salesforce.notify-for-operation-delete | 通知删除操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
| camel.component.salesforce.notify-for-operation-undelete | notify for un-delete 操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
| camel.component.salesforce.notify-for-operation-update | 通知更新操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
| camel.component.salesforce.notify-for-operations | 通知操作,选项为 ALL、CREATE、EXTENDED、UPDATE (API 版本 29.0)。 | NotifyForOperationsEnum | |
| camel.component.salesforce.object-mapper | 自定义 Jackson ObjectMapper,用于序列化/反序列化 Salesforce 对象。选项是一个 com.fasterxml.jackson.databind.ObjectMapper 类型。 | ObjectMapper | |
| camel.component.salesforce.packages | 在哪些软件包中,生成的 DTO 类。通常,该类将使用 camel-salesforce-maven-plugin 生成。使用生成的 DTOs 来设置它,以获取在 parameters/header 值中使用简短的 SObject 名称的好处。可以使用逗号分隔多个软件包。 | 字符串 | |
| camel.component.salesforce.password | OAuth 流中使用的密码,以获取访问令牌的访问权限。使用密码 OAuth 流轻松开始,但在一般情况下,应该避免使用它,因为它认为比其他流不太安全。如果使用密码,请确保将安全令牌附加到密码的末尾。 | 字符串 | |
| camel.component.salesforce.pk-chunking | 使用 PK Chunking。仅用于原始 Bulk API。如有必要,批量 2.0 API 会自动执行 PK 块。 | 布尔值 | |
| camel.component.salesforce.pk-chunking-chunk-size | 与 PK Chunking 搭配使用的块大小。如果未指定,reforced 默认为 100,000。最大大小为 250,000。 | 整数 | |
| camel.component.salesforce.pk-chunking-parent | 在启用 PK 块以在共享对象上启用查询时,指定父对象。块基于父对象的记录,而不是共享对象的记录。例如,在 AccountShare 上查询时,将 Account 指定为父对象。只要支持父对象,支持 PK 块。 | 字符串 | |
| camel.component.salesforce.pk-chunking-start-row | 指定 15 个字符或 18 个字符的记录 ID,用作第一个块的下限。在重启批处理之间失败的作业时,使用此参数指定起始 ID。 | 字符串 | |
| camel.component.salesforce.query-locator | 当查询结果超过一个调用中检索记录时,查询为使用查询器提供的查询定位器。在后续调用中使用这个值来检索其他记录。 | 字符串 | |
| camel.component.salesforce.raw-http-headers | 以逗号分隔的消息标头列表,以包含 作为 Raw 操作的 HTTP 参数。 | 字符串 | |
| camel.component.salesforce.raw-method | 用于 Raw 操作的 HTTP 方法。 | 字符串 | |
| camel.component.salesforce.raw-path | 域名后面的端点 URL 部分。E.g., '/services/data/v52.0/sobjects/Account/'. | 字符串 | |
| camel.component.salesforce.raw-payload | 使用原始有效负载字符串作为请求和响应(默认情况下,JSON 或 XML 取决于格式),而不是 DTOs。 | false | 布尔值 |
| camel.component.salesforce.raw-query-parameters | 以逗号分隔的消息标头列表,来作为 Raw 操作的查询参数。不要 url-encode 值,因为这将自动执行。 | 字符串 | |
| camel.component.salesforce.refresh-token | 刷新令牌已在刷新令牌 OAuth 流中获取。一个需要设置 Web 应用并配置回调 URL 以接收刷新令牌,或使用内置回调进行配置,然后在流程结束时从 URL 中获取 refresh_token。请注意,在开发组织中,Salesforce 允许在 localhost 上托管回调 Web 应用程序。 | 字符串 | |
| camel.component.salesforce.report-id | Salesforce1 分析报告 Id. | 字符串 | |
| camel.component.salesforce.report-metadata | 用于过滤的 Salesforce1 分析报告元数据。选项是一个 org.apache.camel.component.salesforce.api.dto.analytics.reports.ReportMetadata 类型。 | ReportMetadata | |
| camel.component.salesforce.result-id | 批量 API 结果 ID。 | 字符串 | |
| camel.component.salesforce.s-object-blob-field-name | SObject blob 字段名称。 | 字符串 | |
| camel.component.salesforce.s-object-class | 完全限定的 SObject 类名称,通常使用 camel-salesforce-maven-plugin 生成。 | 字符串 | |
| camel.component.salesforce.s-object-fields | 要检索的 SObject 字段。 | 字符串 | |
| camel.component.salesforce.s-object-id | API 需要 SObject ID。 | 字符串 | |
| camel.component.salesforce.s-object-id-name | SObject 外部 ID 字段名称。 | 字符串 | |
| camel.component.salesforce.s-object-id-value | SObject 外部 ID 字段值。 | 字符串 | |
| camel.component.salesforce.s-object-name | 如果 API 需要或支持,则 SObject 名称。 | 字符串 | |
| camel.component.salesforce.s-object-query | Salesforce SOQL 查询字符串. | 字符串 | |
| camel.component.salesforce.s-object-search | Salesforce SOSL 搜索字符串. | 字符串 | |
| camel.component.salesforce.ssl-context-parameters | 要使用的 SSL 参数,请参阅所有可用选项的 SSLContextParameters 类。选项是 org.apache.camel.support.jsse.SSLContextParameters 类型。 | SSLContextParameters | |
| camel.component.salesforce.update-topic | 在使用 Streaming API 时是否更新现有的 Push Topic,默认为 false。 | false | 布尔值 |
| camel.component.salesforce.use-global-ssl-context-parameters | 启用对全局 SSL 上下文参数的使用。 | false | 布尔值 |
| camel.component.salesforce.user-name | OAuth 流中使用的用户名,以获取访问令牌的访问权限。使用密码 OAuth 流轻松开始,但在一般情况下,应该避免使用它,因为它认为比其他流不太安全。 | 字符串 | |
| camel.component.salesforce.worker-pool-max-size | 用于处理 HTTP 响应的线程池的最大大小。 | 20 | 整数 |
| camel.component.salesforce.worker-pool-size | 用于处理 HTTP 响应的线程池大小。 | 10 | 整数 |
第 44 章 scheduler
仅支持消费者
Scheduler 组件用于在调度程序触发时生成消息交换。此组件与 Timer 组件类似,但在调度方面提供了更多功能。另外,此组件使用 JDK ScheduledExecutorService。其中,作为计时器使用 JDK 计时器。
您只能从此端点消耗事件。
44.1. URI 格式
scheduler:name[?options]
其中 name 是调度程序的名称,它在端点之间创建和共享。因此,如果您为所有调度程序端点使用相同的名称,则只会使用一个调度程序线程池和线程 - 但是,您可以将线程池配置为允许更多并发线程。
生成的交换的 IN 正文是 null。因此 exchange.getIn ().getBody () 返回 null。
44.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
44.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
44.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
44.3. 组件选项
Scheduler 组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| poolSize (scheduler) | 调度线程池中使用的线程池中的核心线程数量。默认使用单个线程。 | 1 | int |
44.4. 端点选项
Scheduler 端点使用 URI 语法进行配置:
scheduler:name
使用以下路径和查询参数:
44.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 名称 (使用者) | 调度程序的名称 是必需的。 | 字符串 |
44.4.2. 查询参数(21 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| 同步 (高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| poolSize (scheduler) | 调度线程池中使用的线程池中的核心线程数量。默认使用单个线程。 | 1 | int |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
44.5. 更多信息
此组件是一个调度程序 轮询消费者,您可以在其中找到有关以上选项的更多信息,以及 Polling Consumer 页面的示例。
44.6. Exchange 属性
当计时器被触发时,它会将以下信息作为属性添加到 Exchange 中:
| 名称 | 类型 | 描述 |
|---|---|---|
|
|
|
|
|
|
| 消费者触发的时间。 |
44.7. 示例
要设置每 60 秒生成事件的路由:
from("scheduler://foo?delay=60000").to("bean:myBean?method=someMethodName");
以上路由将生成一个事件,然后对 Registry 中名为 myBean 的 bean (如 JNDI 或 Spring)调用 someMethodName 方法。
和 Spring DSL 中的路由:
<route> <from uri="scheduler://foo?delay=60000"/> <to uri="bean:myBean?method=someMethodName"/> </route>
44.8. 强制调度程序在完成后立即触发
要在上一任务完成后立即让调度程序触发,您可以设置 greedy=true 选项。但是,调度程序会一直触发所有时间。因此请谨慎使用它。
44.9. 强制调度程序闲置
在有些情况下,您可能希望调度程序触发并灰显。但有时候,您希望"停止调度程序"没有任务轮询,因此调度程序可以使用 backoff 选项更改为空闲模式。为此,您需要将密钥 Exchange.SCHEDULER_POLLED_MESSAGES 的交换上的属性设置为布尔值 false。这将导致消费者表示没有轮询消息。
消费者将默认返回 1 消息轮询到调度程序,只要使用者完成交换处理。
44.10. Spring Boot Auto-Configuration
当将调度程序与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-scheduler-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.scheduler.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.scheduler.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.scheduler.enabled | 是否启用调度程序组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.scheduler.pool-size | 调度线程池中使用的线程池中的核心线程数量。默认使用单个线程。 | 1 | 整数 |
第 45 章 SEDA
支持制作者和使用者
SEDA 组件提供异步 SEDA 行为,以便消息在 BlockingQueue 上交换,用户会在来自生产者的独立线程中调用。
请注意,队列只在 单个 CamelContext 中可见。如果要在 CamelContext 实例之间进行通信(例如,在 Web 应用程序间进行通信),请参阅组件。
如果虚拟机在处理消息期间终止,则此组件不会实施任何类型的持久性或恢复。如果您需要持久性、可靠性或分布式 SEDA,请尝试使用 JMS 或 ActiveMQ。
45.1. URI 格式
seda:someName[?options]
其中 someName 可以是在当前 CamelContext 中唯一标识端点的任何字符串。
45.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
45.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
45.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
45.3. 组件选项
SEDA 组件支持 10 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| concurrentConsumers (consumer) | 设置默认并发线程处理交换数。 | 1 | int |
| defaultPollTimeout (使用者(高级) | 轮询时使用的超时时间(以毫秒为单位)。发生超时时,使用者可以检查是否允许它继续运行。设置较低的值可让消费者在关闭时更快地响应。 | 1000 | int |
| defaultBlockWhenFull (producer) | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将改为阻止并等待消息被接受。 | false | 布尔值 |
| defaultDiscardWhenFull (producer) | 是否丢弃将消息发送到完整 SEDA 队列的线程。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将放弃发送并继续,即消息没有发送到 SEDA 队列。 | false | 布尔值 |
| defaultOfferTimeout (producer) | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用这个选项,可以将配置的超时添加到块问题单中。利用低水位 java 队列的 .offer (timeout)方法。 | long | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| DefaultQueueFactory (高级) | 设置默认队列工厂。 | BlockingQueueFactory | |
| queueSize (advanced) | 设置 SEDA 队列的默认最大容量(例如,它可以保存的消息数量)。 | 1000 | int |
45.4. 端点选项
SEDA 端点使用 URI 语法进行配置:
seda:name
使用以下路径和查询参数:
45.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 名称 (common) | 所需 队列的名称. | 字符串 |
45.4.2. 查询参数(18 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 大小 (通用) | SEDA 队列的最大容量(例如,它可以保存的消息数)。默认情况下,将使用 SEDA 组件上设置的 defaultSize。 | 1000 | int |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| concurrentConsumers (consumer) | 并发线程处理交换数量。 | 1 | int |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| limitConcurrentConsumers (使用者(高级) | 是否要将 concurrentConsumers 的数量限制为最多 500。默认情况下,如果端点配置了数字,则会抛出异常。您可以通过关闭这个选项来禁用该检查。 | true | 布尔值 |
| multipleConsumers (使用者(高级) | 指定是否允许多个用户。如果启用,您可以将 SEDA 用于 Publish-Subscribe 消息传递。也就是说,您可以向 SEDA 队列发送消息,并让每个使用者收到消息的副本。启用后,应在每个消费者端点上指定这个选项。 | false | 布尔值 |
| pollTimeout (使用者(高级) | 轮询时使用的超时时间(以毫秒为单位)。发生超时时,使用者可以检查是否允许它继续运行。设置较低的值可让消费者在关闭时更快地响应。 | 1000 | int |
| purgeWhenStopping (使用者(高级) | 在停止消费者/路由时是否清除任务队列。这可以更快地停止,因为队列中的任何待处理消息都会被丢弃。 | false | 布尔值 |
| blockWhenFull (producer) | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将改为阻止并等待消息被接受。 | false | 布尔值 |
| discardIfNoConsumers (producer) | 当发送到没有活跃消费者的队列时,生产者是否应该丢弃消息(不要将消息添加到队列中)。如果同时只能启用NoConsumers,则只有一个选项 discardIfNoConsumers。 | false | 布尔值 |
| discardWhenFull (producer) | 是否丢弃将消息发送到完整 SEDA 队列的线程。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将放弃发送并继续,即消息没有发送到 SEDA 队列。 | false | 布尔值 |
| failIfNoConsumers (producer) | 当发送到没有活跃消费者的队列时,生产者是否应通过抛出异常失败。如果同时只能启用NoConsumers,则只有一个选项 discardIfNoConsumers。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| offerTimeout (producer) | 当队列满时,可以将超时时间(以毫秒为单位)添加到块问题单中。您可以使用 0 或负值禁用超时。 | long | |
| 超时 (生成者) | SEDA 制作者之前超时(以毫秒为单位)将停止等待异步任务完成。您可以使用 0 或负值禁用超时。 | 30000 | long |
| waitForTaskToComplete (producer) | 选项指定调用者是否应该等待 async 任务完成的选项,然后再继续。支持以下三个选项: Always、Never 或 IfReplyExpected。前两个值是自我解释。最后的值 IfReplyExpected 只有在消息是 Request Reply based 时才会等待。默认选项为 IfReplyExpected。 Enum 值:
| IfReplyExpected | WaitForTaskToComplete |
| 队列 (高级) | 定义供端点使用的队列实例。 | BlockingQueue |
45.5. 选择 BlockingQueue 实现
默认情况下,SEDA 组件总是 intantiates LinkedBlockingQueue,但您可以使用不同的实现,您可以引用您自己的 BlockingQueue 实现,在这种情况下,不使用 size 选项
<bean id="arrayQueue" class="java.util.ArrayBlockingQueue"> <constructor-arg index="0" value="10" ><!-- size --> <constructor-arg index="1" value="true" ><!-- fairness --> </bean> <!-- ... and later --> <from>seda:array?queue=#arrayQueue</from>
或者,您可以引用 BlockingQueueFactory 实现,提供了 3 个实现,即 LinkBlockingQueueFactory、ArrayBlockingQueueFactory 和 PriorityBlockingQueueFactory:
<bean id="priorityQueueFactory" class="org.apache.camel.component.seda.PriorityBlockingQueueFactory">
<property name="comparator">
<bean class="org.apache.camel.demo.MyExchangeComparator" />
</property>
</bean>
<!-- ... and later -->
<from>seda:priority?queueFactory=#priorityQueueFactory&size=100</from>45.6. 使用 Request Reply
SEDA 组件支持使用 Request Reply,其中调用者将等待 Async 路由完成。例如:
from("mina:tcp://0.0.0.0:9876?textline=true&sync=true").to("seda:input");
from("seda:input").to("bean:processInput").to("bean:createResponse");
在上面的路由中,我们在端口 9876 上有一个 TCP 侦听器,它接受传入的请求。请求路由到 seda:input 队列。由于它是 Request Reply 消息,我们等待响应。当 seda:input 队列中的使用者完成时,它会将响应复制到原始消息响应。
45.7. 并发消费者
默认情况下,SEDA 端点使用单个消费者线程,但您可以将其配置为使用并发消费者线程。因此,您可以使用:
from("seda:stageName?concurrentConsumers=5").process(...)与两者之间的差别一样,请注意,线程池 可以在运行时动态增加/shrink,具体取决于负载,而并发消费者的数量始终被修复。
45.8. 线程池
请注意,通过执行以下方法将线程池添加到 SEDA 端点:
from("seda:stageName").thread(5).process(...)
可以使用两个 BlockQueues: 一个来自 SEDA 端点,另一个来自线程池的工作队列,这可能不是您想要的。相反,您可能希望使用线程池配置直接端点,这可以同步和异步处理消息。例如:
from("direct:stageName").thread(5).process(...)
您还可以使用 concurrentConsumers 选项直接配置处理 SEDA 端点上消息的线程数量。
45.9. 示例
在以下路由中,我们使用 SEDA 队列将请求发送到这个 async 队列,以便能够向另一个线程发送 fire-and-forget 消息,并将此线程中的恒定回复返回到原始调用者。
我们发送 Hello World 消息,并期望回复正常。
@Test
public void testSendAsync() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedBodiesReceived("Hello World");
// START SNIPPET: e2
Object out = template.requestBody("direct:start", "Hello World");
assertEquals("OK", out);
// END SNIPPET: e2
assertMockEndpointsSatisfied();
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
// START SNIPPET: e1
public void configure() throws Exception {
from("direct:start")
// send it to the seda queue that is async
.to("seda:next")
// return a constant response
.transform(constant("OK"));
from("seda:next").to("mock:result");
}
// END SNIPPET: e1
};
}
"Hello World"消息将从另一个线程中的 SEDA 队列消耗,以进一步处理。由于这来自单元测试,它将发送到 模拟 端点,在单元测试中我们可以执行断言。
45.10. 使用多个Consumers
在这个示例中,我们定义了两个消费者。
@Test
public void testSameOptionsProducerStillOkay() throws Exception {
getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:bar").expectedBodiesReceived("Hello World");
template.sendBody("seda:foo", "Hello World");
assertMockEndpointsSatisfied();
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("seda:foo?multipleConsumers=true").routeId("foo").to("mock:foo");
from("seda:foo?multipleConsumers=true").routeId("bar").to("mock:bar");
}
};
}由于我们在 seda foo 端点上 指定了多个Consumers=true,因此我们可以让这两个用户将其自己的消息副本作为 pub-sub 风格的消息传递而接收。
由于 Bean 是单元测试的一部分,它们只是将消息发送到模拟端点。
45.11. 提取队列信息
如果需要,可以在不使用 JMX 的情况下获取队列大小等信息:
SedaEndpoint seda = context.getEndpoint("seda:xxxx");
int size = seda.getExchanges().size();45.12. Spring Boot Auto-Configuration
在 Spring Boot 中使用 seda 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-seda-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 11 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.seda.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.seda.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.seda.concurrent-consumers | 设置默认并发线程处理交换数。 | 1 | 整数 |
| camel.component.seda.default-block-when-full | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将改为阻止并等待消息被接受。 | false | 布尔值 |
| camel.component.seda.default-discard-when-full | 是否丢弃将消息发送到完整 SEDA 队列的线程。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将放弃发送并继续,即消息没有发送到 SEDA 队列。 | false | 布尔值 |
| camel.component.seda.default-offer-timeout | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用这个选项,可以将配置的超时添加到块问题单中。利用低水位 java 队列的 .offer (timeout)方法。 | Long | |
| camel.component.seda.default-poll-timeout | 轮询时使用的超时时间(以毫秒为单位)。发生超时时,使用者可以检查是否允许它继续运行。设置较低的值可让消费者在关闭时更快地响应。 | 1000 | 整数 |
| camel.component.seda.default-queue-factory | 设置默认队列工厂。选项是一个 org.apache.camel.component.seda.BlockingQueueFactory<org.apache.camel.Exchange> 类型。 | BlockingQueueFactory | |
| camel.component.seda.enabled | 是否启用 seda 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.seda.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.seda.queue-size | 设置 SEDA 队列的默认最大容量(例如,它可以保存的消息数量)。 | 1000 | 整数 |
第 46 章 Servlet
仅支持消费者
Servlet 组件提供基于 HTTP 的端点,用于消耗到达绑定到公布的 Servlet 的 HTTP 端点。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-servlet</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>Stream
Servlet 基于流,这意味着它收到的输入作为流提交到 Camel。这意味着您只能够读取 一次 流的内容。如果发现邮件正文显示为空白的情况,或者您需要多次访问数据(例如:进行多播或重新传送错误处理)时,您应该使用 Stream 缓存,或将消息正文转换为 字符串,以安全地读取多次。
46.1. URI 格式
servlet://relative_path[?options]
46.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
46.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已预先配置了常用的默认值,因此通常只需要在组件上配置几个选项,或完全不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
46.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为 配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
46.3. 组件选项
Servlet 组件支持 11 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生任何异常,现在将作为消息处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| muteException (consumer) | 如果启用并且交换在消费者上失败处理,则响应正文不包含异常堆栈追踪。 | false | 布尔值 |
| servletName (consumer) | 要使用的默认 servlet 名称。默认名称为 CamelServlet。 | CamelServlet | 字符串 |
| attachmentMultipartBinding (使用者(高级) | 是否在 Camel Exchange 上自动绑定多部分/数据作为附件。选项 attachmentMultipartBinding=true 和 disableStreamCache=false 无法一起工作。删除 disableStreamCache 以使用 AttachmentMultipartBinding。默认情况下是关闭的,因为这可能要求 servlet 特定的配置在使用 Servlet 时启用此功能。 | false | 布尔值 |
| fileNameExtWhitelist (consumer (advanced)) | 接受上传的文件的可接受的文件名扩展白名单。多个扩展可以使用逗号分开,如 txt、xml。 | 字符串 | |
| httpRegistry (使用者(高级) | 使用自定义 org.apache.camel.component.servlet.HttpRegistry。 | HttpRegistry | |
| allowJavaSerializedObject (advanced) | 当请求使用 context-type=application/x-java-serialized-object 时,是否允许 java 序列化。默认情况下是关闭的。如果您启用它,Java 将把请求中的传入数据反序列化到 Java,这可能会带来潜在的安全风险。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| httpBinding (高级) | 使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。 | HttpBinding | |
| httpConfiguration (高级) | 使用共享 HttpConfiguration 作为基本配置。 | HttpConfiguration | |
| headerFilterStrategy (filter) | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy |
46.4. 端点选项
Servlet 端点使用 URI 语法进行配置:
servlet:contextPath
使用以下路径和查询参数:
46.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| contextPath (consumer) | 需要使用 context-path。 | 字符串 |
46.4.2. 查询参数(22 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 块 (使用者) | 如果此选项为 false,则 Servlet 将禁用 HTTP 流,并为响应设置 content-length 标头。 | true | 布尔值 |
| disableStreamCache (common) | 确定是否缓存来自 Servlet 的原始输入流(Camel 将流读取到内存/覆盖流到文件,流缓存)缓存。默认情况下,Camel 将缓存 Servlet 输入流,以支持多次读取它,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流时,您可以将这个选项设置为 true,例如将其直接流传输到文件或其他持久性存储。DefaultHttpBinding 会将请求输入流复制到流缓存中,如果此选项为 false,则将其放入消息正文中,以便支持多次读取流。如果您使用 Servlet 来桥接/代理端点,请考虑启用此选项来提高性能,以防不需要多次读取消息有效负载。http 制作者将默认缓存响应正文流。如果此选项设为 true,则制作者不会缓存响应正文流,而是将响应流用作消息正文。 | false | 布尔值 |
| headerFilterStrategy (common) | 使用自定义 HeaderFilterStrategy 过滤标题到 Camel 消息或从 Camel 消息过滤。 | HeaderFilterStrategy | |
| httpBinding (通用(高级) | 使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。 | HttpBinding | |
| async (消费者) | 将消费者配置为以 async 模式工作。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生任何异常,现在将作为消息处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| httpMethodRestrict (consumer) | 仅在 HttpMethod 匹配时(如 GET/POST/PUT 等)才允许使用。可以使用逗号分开指定多个方法。 | 字符串 | |
| matchOnUriPrefix (consumer) | 如果没有找到完全匹配项,消费者是否应该尝试通过匹配 URI 前缀来查找目标消费者。 | false | 布尔值 |
| muteException (consumer) | 如果启用并且交换在消费者上失败处理,则响应正文不包含异常堆栈追踪。 | false | 布尔值 |
| responseBufferSize (consumer) | 要在 javax.servlet.ServletResponse 上使用自定义缓冲区大小。 | 整数 | |
| servletName (consumer) | 要使用的 servlet 的名称。 | CamelServlet | 字符串 |
| transferException (消费者) | 如果对消费者端启用和交换失败处理,如果导致 Exception 在响应中发送回序列化,作为 application/x-java-serialized-object 内容类型。在制作者一端,异常将被反序列化并按原样丢弃,而不是 HttpOperationFailedException。原因例外是需要序列化的。默认情况下是关闭的。如果您启用它,Java 将把请求中的传入数据反序列化到 Java,这可能会带来潜在的安全风险。 | false | 布尔值 |
| attachmentMultipartBinding (使用者(高级) | 是否在 Camel Exchange 上自动绑定多部分/数据作为附件。选项 attachmentMultipartBinding=true 和 disableStreamCache=false 无法一起工作。删除 disableStreamCache 以使用 AttachmentMultipartBinding。默认情况下是关闭的,因为这可能要求 servlet 特定的配置在使用 Servlet 时启用此功能。 | false | 布尔值 |
| eagerCheckContentAvailable (使用者(高级) | 如果 content-length 标头是 0 还是不存在,则 HTTP 请求是否具有内容。如果 HTTP 客户端没有发送流数据,则可以打开它。 | false | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| fileNameExtWhitelist (consumer (advanced)) | 接受上传的文件的可接受的文件名扩展白名单。多个扩展可以使用逗号分开,如 txt、xml。 | 字符串 | |
| mapHttpMessageBody (consumer (advanced)) | 如果此选项为 true,则交换的 IN Exchange Body 将映射到 HTTP 正文。把它设置为 false 将避免 HTTP 映射。 | true | 布尔值 |
| mapHttpMessageFormUrlEncodedBody (consumer (advanced)) | 如果此选项为 true,则交换的 IN Exchange Form Encoded body 将映射到 HTTP。把它设置为 false 将避免 HTTP Form Encoded body 映射。 | true | 布尔值 |
| mapHttpMessageHeaders (consumer (advanced)) | 如果此选项为 true,则交换的 IN exchange Headers 将映射到 HTTP 标头。把它设置为 false 将避免 HTTP Headers 映射。 | true | 布尔值 |
| optionsEnabled (使用者) | 指定是否为这个 Servlet 消费者启用 HTTP OPTIONS。默认情况下关闭 OPTIONS。 | false | 布尔值 |
| traceEnabled (使用者(高级) | 指定是否为这个 Servlet 消费者启用 HTTP TRACE。默认情况下,TRACE 已关闭。 | false | 布尔值 |
46.5. 消息标头
Camel 将应用与 HTTP 组件相同的消息标头。
Camel 也会填充 所有 request.parameter 和 request.headers。例如,如果客户端请求的 URL 为 http://myserver/myserver?orderid=123,则交换将包含名为 orderid 的标头,其值为 123。
46.6. 使用方法
您只能从 Servlet 组件生成的端点使用。因此,它应只用作 Camel 路由的输入。要针对其他 HTTP 端点发出 HTTP 请求,请使用 HTTP 组件。
46.7. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 servlet 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-servlet-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 15 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.servlet.allow-java-serialized-object | 当请求使用 context-type=application/x-java-serialized-object 时,是否允许 java 序列化。默认情况下是关闭的。如果您启用它,Java 将把请求中的传入数据反序列化到 Java,这可能会带来潜在的安全风险。 | false | 布尔值 |
| camel.component.servlet.attachment-multipart-binding | 是否在 Camel Exchange 上自动绑定多部分/数据作为附件。选项 attachmentMultipartBinding=true 和 disableStreamCache=false 无法一起工作。删除 disableStreamCache 以使用 AttachmentMultipartBinding。默认情况下是关闭的,因为这可能要求 servlet 特定的配置在使用 Servlet 时启用此功能。 | false | 布尔值 |
| camel.component.servlet.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.servlet.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生任何异常,现在将作为消息处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.servlet.enabled | 是否启用 servlet 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.servlet.file-name-ext-whitelist | 接受上传的文件的可接受的文件名扩展白名单。多个扩展可以使用逗号分开,如 txt、xml。 | 字符串 | |
| camel.component.servlet.header-filter-strategy | 要使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息或从 Camel 消息过滤。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
| camel.component.servlet.http-binding | 使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。选项是一个 org.apache.camel.http.common.HttpBinding 类型。 | HttpBinding | |
| camel.component.servlet.http-configuration | 使用共享 HttpConfiguration 作为基本配置。选项是一个 org.apache.camel.http.common.HttpConfiguration 类型。 | HttpConfiguration | |
| camel.component.servlet.http-registry | 使用自定义 org.apache.camel.component.servlet.HttpRegistry。选项是一个 org.apache.camel.http.common.HttpRegistry 类型。 | HttpRegistry | |
| camel.component.servlet.mute-exception | 如果启用并且交换在消费者上失败处理,则响应正文不包含异常堆栈追踪。 | false | 布尔值 |
| camel.component.servlet.servlet-name | 要使用的默认 servlet 名称。默认名称为 CamelServlet。 | CamelServlet | 字符串 |
| camel.servlet.mapping.context-path | servlet 组件用于自动映射的上下文路径。 | /camel/* | 字符串 |
| camel.servlet.mapping.enabled | 启用 servlet 组件到 Spring Web 上下文的自动映射。 | true | 布尔值 |
| camel.servlet.mapping.servlet-name | Camel servlet 的名称。 | CamelServlet | 字符串 |
第 47 章 Slack
支持制作者和使用者
Slack 组件允许您连接到 Slack 实例,并通过预先建立的 Slack 传入的 webhook 传递邮件正文中包含的消息。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-slack</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>47.1. URI 格式
发送消息到频道。
slack:#channel[?options]
向 slackuser 发送直接消息。
slack:@userID[?options]
47.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
47.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
47.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
47.3. 组件选项
Slack 组件支持 5 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 令牌 (令牌) | 要使用的令牌。 | 字符串 | |
| webhookUrl (webhook) | 传入的 webhook URL。 | 字符串 |
47.4. 端点选项
Slack 端点使用 URI 语法进行配置:
slack:channel
使用以下路径和查询参数:
47.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 频道 (common) | 需要 通道名称(syntax #name)或 slackuser (syntax userName)来直接向用户发送消息。 | 字符串 |
47.4.2. 查询参数(29 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| Token (common) | 要使用的令牌。 | 字符串 | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| conversationType (consumer) | 对话类型. Enum 值:
| PUBLIC_CHANNEL | ConversationType |
| maxResults (consumer) | 轮询的 Max Result。 | 10 | 字符串 |
| naturalOrder (consumer) | 以自然顺序(最旧的到最新)创建交换。 | false | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| serverUrl (consumer) | Slack 实例的服务器 URL。 | 字符串 | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| iconEmoji (producer) | 弃用了 Use a Slack emoji 作为 avatar。 | 字符串 | |
| iconUrl (producer) | 弃用了 向频道或用户发送消息时组件要使用的 avatar。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 用户名 (生成器) | 弃用了 这是 bot 将消息发送到频道或用户的用户名。 | 字符串 | |
| webhookUrl (producer) | 传入的 webhook URL。 | 字符串 | |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
47.5. 在print XML 中配置
带有 XML 的 Slack 组件必须配置为 Spring 或 Blueprint bean,其包含传入的 webhook url 或用于集成的应用程序令牌作为参数。
<bean id="slack" class="org.apache.camel.component.slack.SlackComponent">
<property name="webhookUrl" value="https://hooks.slack.com/services/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"/>
<property name="token" value="xoxb-12345678901-1234567890123-xxxxxxxxxxxxxxxxxxxxxxxx"/>
</bean>对于 Java,您可以使用 Java 代码进行配置。
47.6. 示例
具有 Blueprint 的 CamelContext 可以:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
<bean id="slack" class="org.apache.camel.component.slack.SlackComponent">
<property name="webhookUrl" value="https://hooks.slack.com/services/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"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
<route>
<from uri="direct:test"/>
<to uri="slack:#channel?iconEmoji=:camel:&username=CamelTest"/>
</route>
</camelContext>
</blueprint>47.7. 制作者
现在,您可以使用令牌来发送消息而不是 WebhookUrl。
from("direct:test")
.to("slack:#random?token=RAW(<YOUR_TOKEN>)");现在,您可以使用 Slack API 模型来创建块。您可以在此处阅读有关它的更多信息 https://api.slack.com/block-kit。
public void testSlackAPIModelMessage() {
Message message = new Message();
message.setBlocks(Collections.singletonList(SectionBlock
.builder()
.text(MarkdownTextObject
.builder()
.text("*Hello from Camel!*")
.build())
.build()));
template.sendBody(test, message);
}47.8. 消费者
您还可以将消费者用于频道中的信息。
from("slack://general?token=RAW(<YOUR_TOKEN>)&maxResults=1")
.to("mock:result");这样,您将从常规频道获取最后一条信息。消费者将跟踪最近使用以及下一次轮询过程中使用的时间戳,它将从该时间戳中检查。
您需要创建一个 Slack 应用程序并在您的工作区中使用它。
使用"Bot User OAuth 访问令牌"作为消费者端点的令牌。
将对应的历史记录(频道:history 或 groups:history 或 mpim:history 或 im :history )和读取(频道:read 或 mpim:read 或 im:read)用户令牌范围授予应用程序查看相应频道的信息。您需要使用 conversationType 选项(PUBLIC_CHANNEL,PRIVATE_CHANNEL,MPIM,IM)
naturalOrder 选项允许消耗从最旧到最新消息。最初,您将得到最新的先后消息并消耗后(message 3 TOKEN 消息 2 TOKEN 消息 1)
您可以使用 conversationType 选项从不仅是公共的频道读取历史记录和消息(PUBLIC_CHANNEL,PRIVATE_CHANNEL,MPIM,IM)
47.9. Spring Boot Auto-Configuration
在 Spring Boot 中使用 slack 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-slack-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 6 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.slack.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.slack.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.slack.enabled | 是否启用 slack 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.slack.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.slack.token | 要使用的令牌。 | 字符串 | |
| camel.component.slack.webhook-url | 传入的 webhook URL。 | 字符串 |
第 48 章 SQL
支持制作者和使用者
SQL 组件允许您使用 JDBC 查询来使用数据库。此组件和 JDBC 组件之间的区别在于,如果 SQL 查询是端点的属性,它将消息有效负载用作传递给查询的参数。
此组件使用 spring-jdbc 在 scenes 后面用于实际 SQL 处理。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-sql</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>SQL 组件还支持:
- 基于 JDBC 的存储库,用于 Idempotent Consumer EIP 模式。请参阅以下进一步。
- 基于 JDBC 的存储库,用于聚合器 EIP 模式。请参阅以下进一步。
48.1. URI 格式
此组件可用作 交易客户端。
SQL 组件使用以下端点 URI 表示法:
sql:select * from table where id=# order by name[?options]
您可以使用 :'#name_of_the_parameter' 样式来使用命名参数,如下所示:
sql:select * from table where id=:#myId order by name[?options]
使用命名参数时,Camel 将以给定优先级从中查找名称:
-
如果其
java.util.Map,则来自邮件正文 - 来自消息标头
如果无法解析指定参数,则抛出异常。
您可以使用简单表达式作为参数,如下所示:
sql:select * from table where id=:#${exchangeProperty.myId} order by name[?options]请注意,表示 SQL 查询参数的标准 ? 符号被替换为 # 符号,因为 ? 符号用于指定端点的选项。可以基于端点配置 ? 符号替换。
您可以将 SQL 查询外部化到 classpath 或文件系统中的文件,如下所示:
sql:classpath:sql/myquery.sql[?options]
myquery.sql 文件位于 classpath 中,只是一个纯文本
-- this is a comment
select *
from table
where
id = :#${exchangeProperty.myId}
order by
name在文件中,您可以使用多行并根据需要格式化 SQL。和 也使用注释,如 - dash 行。
48.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
48.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
48.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
48.3. 组件选项
SQL 组件支持 5 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| Datasource (common) | Autowired Sets the DataSource 用来与数据库通信。 | DataSource | |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| usePlaceholder (高级) | 设置是否使用占位符,并使用 SQL 查询中的符号替换所有占位符字符。这个选项默认为 true。 | true | 布尔值 |
48.4. 端点选项
SQL 端点是使用 URI 语法配置的:
sql:query
使用以下路径和查询参数:
48.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 查询 (common) | 需要 设置要执行的 SQL 查询。您可以使用 file: 或 classpath: 作为前缀来外部化查询,并指定文件的位置。 | 字符串 |
48.4.2. 查询参数(45 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| allowNamedParameters (common) | 是否允许在查询中使用命名参数。 | true | 布尔值 |
| Datasource (common) | Autowired Sets the DataSource,用于在端点级别与数据库通信。 | DataSource | |
| outputClass (common) | 指定在 outputType=SelectOne 时用作转换的完整软件包和类名称。 | 字符串 | |
| outputHeader (common) | 将查询结果存储在标头中,而不是邮件正文。默认情况下,outputHeader == null 并且查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 outputHeader,则该值将用作用于存储查询结果的标头名称,并保留原始消息正文。 | 字符串 | |
| outputType (common) | 将消费者或生成者的输出作为映射列表,或选择如下方式作为单个 Java 对象:a)如果查询只有一个列,则返回 JDBC Column 对象。(如 SELECT COUNT ()FROM PROJECT 将以以下方式返回 Long object. b),如果查询具有多个列,则返回 JDBC Column 对象。 然后,它将返回该结果的映射。c)如果设置了 outputClass,则它将调用与列名称匹配的所有设置者,将查询结果转换为 Java bean 对象。如果查询导致多个行,则会假定您的类有一个默认构造器来创建实例。d)如果查询导致多个行,它会抛出一个非唯一结果异常。StreamList 使用迭代器来流传输查询的结果。这可以在流模式中与 Splitter EIP 一同使用,以流传输模式处理 ResultSet。 Enum 值:
| SelectList | SqlOutputType |
| 分隔符 (通用) | 当从邮件正文中获取参数值(如果正文为 String 类型)时,要使用的分隔符在 # 占位符中插入。注意如果您使用命名的参数,则改为使用 Map 类型。默认值为 comma。 | , | char |
| breakBatchOnConsumeFail (consumer) | 如果 onConsume 失败,设置是否会破坏批处理。 | false | 布尔值 |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| expectedUpdateCount (consumer) | 设置预期的更新数,以便在使用 onConsume 时进行验证。 | -1 | int |
| maxMessagesPerPoll (使用者) | 设置要轮询的最大消息数。 | int | |
| onConsume (consumer) | 处理每行后,可以执行此查询,如果交换成功处理,例如,将行标记为已处理。查询可以有 参数。 | 字符串 | |
| onConsumeBatchComplete (consumer) | 处理整个批处理后,可以对批量更新行等执行此查询。查询不能有参数。 | 字符串 | |
| onConsumeFailed (consumer) | 处理每行后,可以执行此查询,如果 Exchange 失败,例如将行标记为失败。查询可以有 参数。 | 字符串 | |
| routeEmptyResultSet (consumer) | 设置是否允许空 resultset 发送到下一跃点。默认为false。因此,空结果集将被过滤掉。 | false | 布尔值 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| 转换( 消费者) | 启用或禁用事务。如果启用,如果处理交换失败,则消费者会中断处理任何进一步的交换会导致立即回滚。 | false | 布尔值 |
| useIterator (consumer) | 设置结果集应如何传送到路由。将 delivery 指定为列表或单独的对象。默认为 true。 | true | 布尔值 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| processingStrategy (使用者(高级) | 允许插件使用自定义 org.apache.camel.component.sql.SqlProcessingStrategy 在消费者处理行/batch 时执行查询。 | SqlProcessingStrategy | |
| batch (producer) | 启用或禁用批处理模式。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| noop (生成器) | 如果设置,将忽略 SQL 查询的结果,并使用现有 IN 消息作为 OUT 消息进行处理。 | false | 布尔值 |
| useMessageBodyForSql (producer) | 是否使用消息正文作为 SQL,然后用于参数的标头。如果启用了这个选项,则不使用 uri 中的 SQL。请注意,消息正文中的查询参数由问号而不是 # 符号表示。 | false | 布尔值 |
| alwaysPopulateStatement (高级) | 如果启用,则始终调用 org.apache.camel.component.sql.SqlPrepareStatementStrategy 中的 populateStatement 方法,如果没有准备预期参数。当它为 false 时,只有在要设置 1 个或更多预期参数时,才会调用 populateStatement;例如,这避免读取没有参数的 SQL 查询的消息正文/headers。 | false | 布尔值 |
| parametersCount (高级) | 如果设置大于零,则 Camel 将使用此计数值的参数替换,而不是通过 JDBC 元数据 API 进行查询。如果 JDBC 供应商无法返回正确的参数数,则用户可能会覆盖它。 | int | |
| 占位符 (高级) | 指定在 SQL 查询中替换的字符。请注意,它是简单的 String.replaceAll ()操作,不涉及 SQL 解析(加引号的字符串也会更改)。 | # | 字符串 |
| prepareStatementStrategy (advanced) | 允许插件使用自定义 org.apache.camel.component.sql.SqlPrepareStatementStrategy 来控制查询和准备好的声明。 | SqlPrepareStatementStrategy | |
| templateOptions (高级) | 使用 map 中的键/值配置 Spring JdbcTemplate。 | map | |
| usePlaceholder (高级) | 设置是否使用占位符,并使用 SQL 查询中的符号替换所有占位符字符。 | true | 布尔值 |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
48.5. 消息正文的处理
SQL 组件会尝试将消息正文转换为 java.util.Iterator 类型的对象,然后使用此迭代器填充查询参数(每个查询参数由端点 URI 中的 # 符号(或配置的占位符)表示。如果消息正文不是数组或集合,则转换会导致迭代仅迭代一个对象(即正文本身)的迭代器。
例如,如果邮件正文是 java.util.List 的实例,则列表中的第一个项将被替换为 SQL 查询中的第一个出现的 #,该列表中的第二个项将被替换为第二个 # 发生位置,以此类推。
如果 batch 设为 true,则对入站消息正文的解释稍有变化,而不是参数迭代,则组件需要一个包含迭代参数的迭代器;外部迭代器的大小决定了批处理大小。
您可以使用选项 useMessageBodyForSql,该选项允许使用消息正文作为 SQL 语句,然后在带有键 SqlConstants.SQL_PARAMETERS 的标头中提供 SQL 参数。这允许 SQL 组件在来自邮件正文时动态地工作。使用模板(如 Velocity、Freemarker)进行条件处理,例如,根据查询参数的存在,包括或排除 where 子句。
48.6. 查询的结果
对于 选择 操作,结果是一个 List<Map<String, Object>& gt; 类型的实例,如 JdbcTemplate.queryForList () 方法返回。对于 更新操作,返回 NULL 正文,因为 更新操作 只被设置为标头,而不是作为正文设置。
默认情况下,结果将放置在邮件正文中。如果设置了 outputHeader 参数,则结果将放置在标头中。这是使用完整消息增强模式添加标头的替代选择,它提供了一个简洁的语法,用于在标头中查询序列或其它小值。可以轻松地将 outputHeader 和 outputType 结合使用:
from("jms:order.inbox")
.to("sql:select order_seq.nextval from dual?outputHeader=OrderId&outputType=SelectOne")
.to("jms:order.booking");48.7. 使用 StreamList
制作者支持 outputType=StreamList,它使用迭代器来流传输查询的输出。这允许以流式方式处理数据,例如 Splitter EIP 一次处理每行,并根据需要从数据库中加载数据。
from("direct:withSplitModel")
.to("sql:select * from projects order by id?outputType=StreamList&outputClass=org.apache.camel.component.sql.ProjectModel")
.to("log:stream")
.split(body()).streaming()
.to("log:row")
.to("mock:result")
.end();48.8. 标头值
在 执行更新 操作时,SQL 组件会将更新计数存储在以下消息标头中:
| 标头 | 描述 |
|---|---|
|
|
更新操作 |
|
|
为 |
|
|
要执行的查询。此查询优先于端点 URI 中指定的查询。请注意,标头中的查询参数由 |
在执行 插入 操作时,SQL 组件将行与生成的键存储,并在以下消息标头中存储这些行的数量:
| 标头 | 描述 |
|---|---|
| CamelSqlGeneratedKeysRowCount | 标头中包含生成的键的行数。 |
| CamelSqlGeneratedKeyRows | 包含生成的键的行(键映射列表)。 |
48.9. 生成的密钥
如果您使用 SQL INSERT 插入数据,则 RDBMS 可能会支持自动生成的密钥。您可以指示 SQL producer 在标头中返回生成的密钥。
为此,请设置标头 CamelSqlRetrieveGeneratedKeys=true。然后,生成的密钥将作为标头提供,并包含上表中列出的密钥。
要指定应该检索生成的列,请将标头 CamelSqlGeneratedColumns 设置为 String[] 或 int[],分别表示列名称或索引。有些数据库需要这个,如 Oracle。如果驱动程序无法正确确定参数数量,可能还需要使用 parametersCount 选项。
您可以在这个 单元测试 中看到更多详细信息。
48.10. DataSource
您可以直接对 URI 中的 DataSource 的引用设置:
sql:select * from table where id=# order by name?dataSource=#myDS
48.11. 使用命名参数
在下面的给定路由中,我们希望从 projects 表中获取所有项目。请注意,SQL 查询有 2 个命名的参数,:#lic 和 :#min。
Camel 随后会从邮件正文或消息标头中查找这些参数。请注意,在上面的示例中,为命名参数设置两个带有恒定值的标头
:
from("direct:projects")
.setHeader("lic", constant("ASF"))
.setHeader("min", constant(123))
.to("sql:select * from projects where license = :#lic and id > :#min order by id")
尽管邮件正文是 java.util.Map,则命名参数将从正文中获取。
from("direct:projects")
.to("sql:select * from projects where license = :#lic and id > :#min order by id")48.12. 在制作者中使用表达式参数
在以下给定路由中,我们希望从数据库获取所有项目。它使用交换正文来定义许可证,并将属性的值用作第二个参数。
from("direct:projects")
.setBody(constant("ASF"))
.setProperty("min", constant(123))
.to("sql:select * from projects where license = :#${body} and id > :#${exchangeProperty.min} order by id")48.12.1. 在消费者中使用表达式参数
在将 SQL 组件用作消费者时,您现在可以使用表达式参数(简单语言)构建动态查询参数,如对 Bean 调用方法以检索 id、date 或 something。
例如,在以下示例中,我们调用 bean myIdGenerator 上的 nextId 方法:
from("sql:select * from projects where id = :#${bean:myIdGenerator.nextId}")
.to("mock:result");Bean 有以下方法:
public static class MyIdGenerator {
private int id = 1;
public int nextId() {
return id++;
}
请注意,没有带有消息正文和标头的现有 Exchange,因此您可以在消费者中使用的简单表达式可用于调用 bean 方法,如本例中所示。
48.13. 使用带有动态值的 IN 查询
SQL 制作者允许在计算 IN 值的 IN 语句中使用 SQL 查询。例如,来自邮件正文或标头等。
要使用 IN,您需要:
-
为参数名称添加前缀
: -
在参数中添加()
一个示例可以更好地阐述。使用以下查询:
-- this is a comment select * from projects where project in (:#in:names) order by id
在以下路由中:
from("direct:query")
.to("sql:classpath:sql/selectProjectsIn.sql")
.to("log:query")
.to("mock:query");然后,IN 查询可以使用带有键名称的标头和动态值,例如:
// use an array
template.requestBodyAndHeader("direct:query", "Hi there!", "names", new String[]{"Camel", "AMQ"});
// use a list
List<String> names = new ArrayList<String>();
names.add("Camel");
names.add("AMQ");
template.requestBodyAndHeader("direct:query", "Hi there!", "names", names);
// use a string separated values with comma
template.requestBodyAndHeader("direct:query", "Hi there!", "names", "Camel,AMQ");也可以在端点中指定查询,而不是外部化(注意,外部化可以更轻松地维护 SQL 查询)
from("direct:query")
.to("sql:select * from projects where project in (:#in:names) order by id")
.to("log:query")
.to("mock:query");48.14. 使用基于 JDBC 的幂等存储库
在本节中,我们将使用基于 JDBC 的幂等存储库。
抽象 类
是一个抽象类 org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository,您可以扩展为构建自定义 JDBC 幂等存储库。
首先,必须创建由幂等存储库使用的数据库表。我们使用以下模式:
CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255), messageId VARCHAR(100) )
我们添加了 createdAt 列:
CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255), messageId VARCHAR(100), createdAt TIMESTAMP )
SQL Server TIMESTAMP 类型是一个固定长度的二进制字符串类型。它不映射到 JDBC 时间类型: DATE、TIME 或 TIMESTAMP。
使用并发消费者时,在列 processorName 和 messageId 上创建唯一约束至关重要。由于此约束的语法与数据库的不同,我们不会显示在此处。
48.14.1. 自定义 JDBC idempotency 存储库
您有几个选项来根据您的需要调整 org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository :
| 参数 | 默认值 | 描述 |
|---|---|---|
| createTableIfNotExists | true | 定义 Camel 是否应该尝试创建表(如果不存在)。 |
| tableName | CAMEL_MESSAGEPROCESSED | 使用自定义表名称而不是默认名称:CAMEL_MESSAGEPROCESSED。 |
| tableExistsString | SELECT 1 FROM CAMEL_MESSAGEPROCESSED WHERE 1 = 0 | 此查询用于找出表是否已存在。必须抛出异常,以指示表不存在。 |
| createString | CREATE TABLE CAMEL_MESSAGEPROCESSED (processorName VARCHAR (255), messageId VARCHAR (100), createdAt TIMESTAMP) | 用于创建表的 语句。 |
| queryString | SELECT COUNT(*) FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?AND messageId = ? |
用于识别存储库中是否已存在消息的查询(结果不等于 '0')。它取两个参数:第一个是处理器名称( |
| insertString | INSERT INTO CAMEL_MESSAGEPROCESSED (processorName, messageId, createdAt) VALUES (?, ?, ?) |
用于将条目添加到表中的语句。它采用三个参数。第一个是处理器名称( |
| deleteString | DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?AND messageId = ? |
用于从数据库中删除条目的声明。它取两个参数。第一个是处理器名称( |
选项 tableName 可用于使用默认 SQL 查询,但使用不同的表名称。但是,如果要自定义 SQL 查询,您可以单独配置每个查询。
48.14.2. Orphan Lock aware Jdbc IdempotentRepository
org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository 的一个限制是,它不会处理由 JVM 崩溃或非正常关闭导致的孤立锁定。如果您需要解决孤立锁定处理,则使用 org.apache.camel.processor.idempotent.jdbc.jdbc.JdbcOrphanLockAwareIdempotent.jdbc.JdbcOrphanLockAwareIdempotentRepository,则可能会导致未处理的文件/信息。此存储库跟踪由应用程序实例保存的锁定。对于每个保留锁定,应用程序将向锁定存储库发送实时信号,从而使用当前的 Timestamp 更新 createdAt 列。当应用程序实例试图获取锁定时,如果存在三个可能性:
-
锁定条目不存在,然后使用
JdbcMessageIdRepository的基本实现来提供锁定。 - 锁定已存在,createdAt < System.currentTimeMillis ()- lockMaxAgeMillis。在这种情况下,假设一个活跃的实例具有锁定,且锁定没有被提供给请求锁定的新实例
- 锁定已存在,并且 createdAt > = System.currentTimeMillis ()- lockMaxAgeMillis。在这种情况下,假设没有活跃的实例具有锁定,并且该锁定提供给请求实例。背后的原因是,如果原始有锁定的实例仍在运行,它将使用其 keepAlive 机制更新 createdAt 上的 Timestamp
此软件仓库有两个额外的配置参数
| 参数 | 描述 |
|---|---|
| lockMaxAgeMillis | 这指的是锁定被视为孤立的 i.e. 的持续时间。如果 currentTimestamp - createdAt >= lockMaxAgeMillis then lock is孤立。 |
| lockKeepAliveIntervalMillis | 保持 alive 更新的频率为 createdAt Timestamp 列。 |
48.14.3. Caching Jdbc IdempotentRepository
一些 SQL 实现不会在每次查询时快。JdbcMessageIdRepository 实施在 SQL 事务内单独执行其幂等检查。检查 mere 100 键可能需要几分钟的时间。JdbcCachedMessageIdRepository 假定为 上的内存缓存以整个密钥列表开头。然后首先检查此缓存,然后再通过原始实施。
与所有缓存实施一样,应该考虑陈旧数据和特定用途的注意事项。
48.15. 使用基于 JDBC 的聚合存储库
JdbcAggregationRepository 是一个 AggregationRepository,用于持久保留聚合的消息。这样可确保您不会松散消息,因为默认聚合器只会在内存中使用 AggregationRepository。JdbcAggregationRepository 允许与 Camel 一起提供对聚合器的持久支持。
只有在成功处理交换后,它将被标记为 complete,当在 AggregationRepository 上调用 确认 方法时会出现这种情况。这意味着,如果同一交换再次失败,它将在成功前保持重试。
您可以使用选项 maximumRedeliveries 来限制给定恢复的交换的最大重新发送尝试次数。您还必须设置 deadLetterUri 选项,因此 Camel 知道在达到 maximumRedeliveries 时发送 Exchange 的位置。
您可以在 camel-sql 的单元测试中看到一些示例,如 JdbcAggregateRecoverDeadLetterChannelTest.java
48.15.1. 数据库
要正常工作,每个聚合器使用两个表:聚合和完成。按照惯例,完成的名称与聚合的名称与 "_COMPLETED" 后缀相同。名称必须在 Spring bean 中使用 RepositoryName 属性配置。在以下示例中,将使用下列聚合:
这两个表的表结构定义相同:如果 String 值用作键(id),而 Blob 包含以字节数组的交换序列化。
但是,应记住一个区别: id 字段没有与表相同的内容。
在聚合 表中,保存组件用于聚合消息的关联 Id。在完成的表格中,id 保存在对应的 blob 字段中。
以下是用于创建表的 SQL 查询,将 "aggregation" 替换为您的聚合器存储库名称。
CREATE TABLE aggregation ( id varchar(255) NOT NULL, exchange blob NOT NULL, version BIGINT NOT NULL, constraint aggregation_pk PRIMARY KEY (id) ); CREATE TABLE aggregation_completed ( id varchar(255) NOT NULL, exchange blob NOT NULL, version BIGINT NOT NULL, constraint aggregation_completed_pk PRIMARY KEY (id) );
48.16. 将正文和标头存储为文本
您可以配置 JdbcAggregationRepository 以存储消息正文,并在单独的列中选择(ed)标头作为字符串。例如,要存储正文,以下两个标头 companyName 和 accountName 均使用以下 SQL:
CREATE TABLE aggregationRepo3 ( id varchar(255) NOT NULL, exchange blob NOT NULL, version BIGINT NOT NULL, body varchar(1000), companyName varchar(1000), accountName varchar(1000), constraint aggregationRepo3_pk PRIMARY KEY (id) ); CREATE TABLE aggregationRepo3_completed ( id varchar(255) NOT NULL, exchange blob NOT NULL, version BIGINT NOT NULL, body varchar(1000), companyName varchar(1000), accountName varchar(1000), constraint aggregationRepo3_completed_pk PRIMARY KEY (id) );
然后,配置存储库以启用此行为,如下所示:
<bean id="repo3"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
<property name="repositoryName" value="aggregationRepo3"/>
<property name="transactionManager" ref="txManager3"/>
<property name="dataSource" ref="dataSource3"/>
<!-- configure to store the message body and following headers as text in the repo -->
<property name="storeBodyAsText" value="true"/>
<property name="headersToStoreAsText">
<list>
<value>companyName</value>
<value>accountName</value>
</list>
</property>
</bean>48.16.1. codec (Serialization)
由于它们可以包含任何类型的载荷,因此交换不可按设计序列化。它将转换为字节数组,以存储在数据库 BLOB 字段中。所有这些转换都由 JdbcCodec 类处理。代码的一个详细信息需要注意: ClassLoadingAwareObjectInputStream。
ClassLoadingAwareObjectInputStream 已从 Apache ActiveMQ 项目中重复使用。它打包 ObjectInputStream,并将它与 ContextClassLoader 而不是 当前的Threader 一起使用。这样做的好处是能够加载由其他捆绑包公开的类。这允许交换正文和标头具有自定义类型对象引用。
48.16.2. 事务
需要 Spring PlatformTransactionManager 来编配事务。
48.16.2.1. 服务(Start/Stop)
start 方法验证数据库的连接以及是否存在所需的表。如果有任何错误,它将在启动过程中失败。
48.16.3. 聚合器配置
根据目标环境,聚合器可能需要进行一些配置。正如您已经了解,每个聚合器应具有自己的存储库(在数据库中创建对应的表对)和数据源。如果默认的 lobHandler 没有适应您的数据库系统,它可以使用 lobHandler 属性注入。
以下是 Oracle 的声明:
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler"> <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/> </bean> <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/> <bean id="repo" class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository"> <property name="transactionManager" ref="transactionManager"/> <property name="repositoryName" value="aggregation"/> <property name="dataSource" ref="dataSource"/> <!-- Only with Oracle, else use default --> <property name="lobHandler" ref="lobHandler"/> </bean>
48.16.4. 光驱锁定
您可以在集群环境中打开 optimisticLocking 并使用此 JDBC 的聚合存储库,其中多个 Camel 应用程序为聚合存储库共享同一数据库。如果出现 JDBC 驱动程序的竞争条件,则 JdbcAggregationRepository 可以响应特定的供应商异常。要了解 JDBC 驱动程序中的例外情况被视为 optimistick locking 错误,我们需要一个映射程序来执行此操作。因此,有 org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper 允许您在需要时实施自定义逻辑。有默认的实现 org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper,其工作如下:
完成以下检查:
-
如果导致的例外是
SQLException,则如果以 23 开始,则会检查 SQLState。 -
如果导致的例外是
DataIntegrityViolationException - 如果导致的异常类名称在其名称中具有 "ConstraintViolation"。
- 如果配置了任何类名称,可选检查会匹配 FQN 类名称。
您还可以添加 FQN 类名称,如果任何导致的异常(或任何嵌套)等于任何 FQN 类名称,则它有一个 optimistick 锁定错误。
下面是一个例子,其中从 JDBC 供应商定义了 2 个额外的 FQN 类名称。
<bean id="repo"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
<property name="transactionManager" ref="transactionManager"/>
<property name="repositoryName" value="aggregation"/>
<property name="dataSource" ref="dataSource"/>
<property name="jdbcOptimisticLockingExceptionMapper" ref="myExceptionMapper"/>
</bean>
<!-- use the default mapper with extraFQN class names from our JDBC driver -->
<bean id="myExceptionMapper" class="org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper">
<property name="classNames">
<util:set>
<value>com.foo.sql.MyViolationExceptoion</value>
<value>com.foo.sql.MyOtherViolationExceptoion</value>
</util:set>
</property>
</bean>48.16.5. 传播行为
JdbcAggregationRepository 使用来自 Spring-TX 的两个不同的 事务模板。一个是只读的,一个用于读写操作。
但是,当在自己使用 < transacted /> 和使用通用平台 事务管理器的 路由中使用 JdbcAggregationRepository 时,可能需要配置 JdbcAggregationRepository 内事务模板所使用的 传播行为。
以下是进行该操作的方法:
<bean id="repo" class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository"> <property name="propagationBehaviorName" value="PROPAGATION_NESTED" /> </bean>
传播是由 org.springframework.transaction.TransactionDefinition 接口的常量指定,因此 传播BehaviorName 是方便的设置,允许使用常量名称。
48.16.6. PostgreSQL 问题单
有特殊的数据库可能会导致 JdbcAggregationRepository 使用优化的锁定问题。如果数据完整性冲突异常(SQLState 23505)除外),PostgreSQL 会将连接标记为无效。这使得连接在嵌套事务中有效不可用。详情请参考 文档。
org.apache.camel.processor.aggregate.jdbc.PostgresAggregationRepository 扩展 JdbcAggregationRepository,并使用特殊的 INSERT。ON CONFLICT .. 语句提供优化锁定行为。
此声明为 (带有默认的聚合表定义):
INSERT INTO aggregation (id, exchange) values (?, ?) ON CONFLICT DO NOTHING
详情请参考 PostgreSQL 文档。
当使用此 子句时,java.sql.PreparedStatement.executeUpdate () 调用返回 0, 而不是抛出 SQLState=23505 的 SQLException。进一步处理与通用 JdbcAggregationRepository 相同,但没有将 PostgreSQL 连接标记为无效。
48.17. Camel Sql Starter
spring-boot 用户可使用 starter 模块。使用初学者时,可以使用 spring-boot 属性直接配置 DataSource。
# Example for a mysql datasource spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.jdbc.Driver
要使用这个功能,请在 spring boot pom.xml 文件中添加以下依赖项:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-sql-starter</artifactId>
<version>${camel.version}</version> <!-- use the same version as your Camel core version -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>${spring-boot-version}</version>
</dependency>如果需要,您还应包含特定的数据库驱动程序。
48.18. Spring Boot Auto-Configuration
在 Spring Boot 中使用 sql 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-sql-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 8 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.sql-stored.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.sql-stored.enabled | 是否启用 sql-stored 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.sql-stored.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.sql.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.sql.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.sql.enabled | 是否启用 sql 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.sql.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.sql.use-placeholder | 设置是否使用占位符,并使用 SQL 查询中的符号替换所有占位符字符。这个选项默认为 true。 | true | 布尔值 |
第 49 章 Stub
支持制作者和使用者
Stub 组件在开发或测试过程中提供了存根任何物理端点的简单方法,允许您运行路由,而无需实际连接到特定的 SMTP 或 HTTP 端点。只需添加 stub : 在任何端点 URI 前,添加存根到存根端点。
Stub 组件内部 创建虚拟机 端点。Stub 和 VM 之间的主要区别在于,虚拟机将验证您提供的 URI 和参数,因此在带有查询参数的典型 URI 前放置 vm: 通常将失败。存根并不会这样做,因为它基本上会忽略所有查询参数,从而让您暂时存出一个或多个路由中的端点。
49.1. URI 格式
stub:someUri
其中 someUri 可以是具有任何查询参数的任何 URI。
49.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
49.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
49.2.1.1. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
49.3. 组件选项
Stub 组件支持 10 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| concurrentConsumers (consumer) | 设置默认并发线程处理交换数。 | 1 | int |
| defaultPollTimeout (使用者(高级) | 轮询时使用的超时时间(以毫秒为单位)。发生超时时,使用者可以检查是否允许它继续运行。设置较低的值可让消费者在关闭时更快地响应。 | 1000 | int |
| defaultBlockWhenFull (producer) | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将改为阻止并等待消息被接受。 | false | 布尔值 |
| defaultDiscardWhenFull (producer) | 是否丢弃将消息发送到完整 SEDA 队列的线程。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将放弃发送并继续,即消息没有发送到 SEDA 队列。 | false | 布尔值 |
| defaultOfferTimeout (producer) | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用这个选项,可以将配置的超时添加到块问题单中。利用低水位 java 队列的 .offer (timeout)方法。 | long | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| DefaultQueueFactory (高级) | 设置默认队列工厂。 | BlockingQueueFactory | |
| queueSize (advanced) | 设置 SEDA 队列的默认最大容量(例如,它可以保存的消息数量)。 | 1000 | int |
49.4. 端点选项
Stub 端点使用 URI 语法进行配置:
stub:name
使用以下路径和查询参数:
49.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 名称 (common) | 所需 队列的名称. | 字符串 |
49.4.2. 查询参数(18 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 大小 (通用) | SEDA 队列的最大容量(例如,它可以保存的消息数)。默认情况下,将使用 SEDA 组件上设置的 defaultSize。 | 1000 | int |
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| concurrentConsumers (consumer) | 并发线程处理交换数量。 | 1 | int |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| limitConcurrentConsumers (使用者(高级) | 是否要将 concurrentConsumers 的数量限制为最多 500。默认情况下,如果端点配置了数字,则会抛出异常。您可以通过关闭这个选项来禁用该检查。 | true | 布尔值 |
| multipleConsumers (使用者(高级) | 指定是否允许多个用户。如果启用,您可以将 SEDA 用于 Publish-Subscribe 消息传递。也就是说,您可以向 SEDA 队列发送消息,并让每个使用者收到消息的副本。启用后,应在每个消费者端点上指定这个选项。 | false | 布尔值 |
| pollTimeout (使用者(高级) | 轮询时使用的超时时间(以毫秒为单位)。发生超时时,使用者可以检查是否允许它继续运行。设置较低的值可让消费者在关闭时更快地响应。 | 1000 | int |
| purgeWhenStopping (使用者(高级) | 在停止消费者/路由时是否清除任务队列。这可以更快地停止,因为队列中的任何待处理消息都会被丢弃。 | false | 布尔值 |
| blockWhenFull (producer) | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将改为阻止并等待消息被接受。 | false | 布尔值 |
| discardIfNoConsumers (producer) | 当发送到没有活跃消费者的队列时,生产者是否应该丢弃消息(不要将消息添加到队列中)。如果同时只能启用NoConsumers,则只有一个选项 discardIfNoConsumers。 | false | 布尔值 |
| discardWhenFull (producer) | 是否丢弃将消息发送到完整 SEDA 队列的线程。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将放弃发送并继续,即消息没有发送到 SEDA 队列。 | false | 布尔值 |
| failIfNoConsumers (producer) | 当发送到没有活跃消费者的队列时,生产者是否应通过抛出异常失败。如果同时只能启用NoConsumers,则只有一个选项 discardIfNoConsumers。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| offerTimeout (producer) | 当队列满时,可以将超时时间(以毫秒为单位)添加到块问题单中。您可以使用 0 或负值禁用超时。 | long | |
| 超时 (生成者) | SEDA 制作者之前超时(以毫秒为单位)将停止等待异步任务完成。您可以使用 0 或负值禁用超时。 | 30000 | long |
| waitForTaskToComplete (producer) | 选项指定调用者是否应该等待 async 任务完成的选项,然后再继续。支持以下三个选项: Always、Never 或 IfReplyExpected。前两个值是自我解释。最后的值 IfReplyExpected 只有在消息是 Request Reply based 时才会等待。默认选项为 IfReplyExpected。 Enum 值:
| IfReplyExpected | WaitForTaskToComplete |
| 队列 (高级) | 定义供端点使用的队列实例。 | BlockingQueue |
49.5. 例子
以下是一些 stubbing endpoint uris 示例
stub:smtp://somehost.foo.com?user=whatnot&something=else stub:http://somehost.bar.com/something
49.6. Spring Boot Auto-Configuration
当将 stub 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-stub-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 11 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.stub.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.stub.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.stub.concurrent-consumers | 设置默认并发线程处理交换数。 | 1 | 整数 |
| camel.component.stub.default-block-when-full | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将改为阻止并等待消息被接受。 | false | 布尔值 |
| camel.component.stub.default-discard-when-full | 是否丢弃将消息发送到完整 SEDA 队列的线程。默认情况下,会抛出异常,表示该队列已满。通过启用此选项,调用线程将放弃发送并继续,即消息没有发送到 SEDA 队列。 | false | 布尔值 |
| camel.component.stub.default-offer-timeout | 如果线程是否向完整 SEDA 队列发送消息,将阻止到队列的容量不再耗尽为止。默认情况下,会抛出异常,表示该队列已满。通过启用这个选项,可以将配置的超时添加到块问题单中。利用低水位 java 队列的 .offer (timeout)方法。 | Long | |
| camel.component.stub.default-poll-timeout | 轮询时使用的超时时间(以毫秒为单位)。发生超时时,使用者可以检查是否允许它继续运行。设置较低的值可让消费者在关闭时更快地响应。 | 1000 | 整数 |
| camel.component.stub.default-queue-factory | 设置默认队列工厂。选项是一个 org.apache.camel.component.seda.BlockingQueueFactory<org.apache.camel.Exchange> 类型。 | BlockingQueueFactory | |
| camel.component.stub.enabled | 是否启用 stub 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.stub.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.stub.queue-size | 设置 SEDA 队列的默认最大容量(例如,它可以保存的消息数量)。 | 1000 | 整数 |
第 50 章 Telegram
支持制作者和使用者
Telegram 组件提供对 Telegram Bot API 的访问。它允许基于 Camel 的应用通过充当 Bot 来发送和接收消息,参与与普通用户、私有和公共组或频道直接对话。
在使用这个组件前,必须创建一个 Telegram Botram Bot,遵循 Telegram Bot developers 主页中的说明。当创建新的 Bot 时,BotFather 提供了与 Bot 对应的 授权令牌。授权令牌是 camel-telegram 端点的强制参数。
为了让 Bot 接收在组或通道内交换的所有消息(不仅仅是以 '/' 字符开头),请 BotFather 使用 /set privacy 命令禁用隐私模式。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-telegram</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>50.1. URI 格式
telegram:type[?options]
50.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
50.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
50.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
50.3. 组件选项
Telegram 组件支持 7 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| baseURI (高级) | 可用于设置替代的基础 URI,例如,您想要根据模拟电话 API 测试组件。 | 字符串 | |
| 客户端 (高级) | 使用自定义 AsyncHttpClient。 | AsyncHttpClient | |
| clientConfig (高级) | 要将 AsyncHttpClient 配置为使用自定义 com.ning.http.client.AsyncHttpClientConfig 实例。 | AsyncHttpClientConfig | |
| authorizationToken (security) | 当端点中没有提供信息时,要使用的默认 Telegram 身份验证令牌。 | 字符串 |
50.4. 端点选项
Telegram 端点使用 URI 语法进行配置:
telegram:type
使用以下路径和查询参数:
50.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| 类型 (common) | 所需的 端点类型。目前,只支持 'bots' 类型。 Enum 值:
| 字符串 |
50.4.2. 查询参数(30 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| 限制 (使用者) | 限制在单个轮询请求中可以接收的更新数量。 | 100 | 整数 |
| sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
| 超时 (使用者) | 长时间轮询的超时时间(以秒为单位)。将 0 置于短轮询或更大数字进行长时间轮询。长时间轮询会产生较短的响应时间。 | 30 | 整数 |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| pollStrategy (使用者(高级) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
| chatId (producer) | 将接收生成的消息的聊天的标识符。聊天 id 首次从传入消息获取(例如,当电话用户开始与 bot 对话时,其客户端会自动发送包含聊天 id 的"/start"消息)。这是一个可选参数,因为 chat id 可以为每个传出消息动态设置(使用正文或标头)。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| baseURI (高级) | 可用于设置替代的基础 URI,例如,您想要根据模拟电话 API 测试组件。 | 字符串 | |
| bufferSize (advanced) | 在 Camel 和 AHC 客户端之间传输数据时使用的初始内存缓冲区大小。 | 4096 | int |
| clientConfig (高级) | 要将 AsyncHttpClient 配置为使用自定义 com.ning.http.client.AsyncHttpClientConfig 实例。 | AsyncHttpClientConfig | |
| proxyHost (proxy) | 发送消息时可以使用的 HTTP 代理主机。 | 字符串 | |
| proxyPort (proxy) | 发送消息时可以使用的 HTTP 代理端口。 | 整数 | |
| proxyType (proxy) | 发送消息时可以使用的 HTTP 代理类型。 Enum 值:
| HTTP | TelegramProxyType |
| backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
| backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
| backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
| delay (scheduler) | 下一次轮询前的毫秒。 | 500 | long |
| greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
| initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
| repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
| runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
| scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
| 调度程序 (调度程序) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
| schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | map | |
| 启动Scheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
| timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
| 使用FixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
| authorizationToken (security) | 需要使用 bot 的身份验证令牌(询问 BotFather)。 | 字符串 |
50.4.3. 消息标头
| 名称 | 描述 |
|---|---|
|
|
此标头供制作者端点用于解析将接收消息的 chat id。接收者 chat id 可以在邮件正文、 |
|
|
当传出消息由纯二进制数据组成时,此标头用于识别介质类型。可能的值有字符串或枚举的值,属于 |
|
| 此标头用于为传出二进制消息提供标题或标题。 |
|
|
此标头用于使用 HTML 或 Markdown 格式化文本消息(请参阅 |
50.5. 使用方法
Telegram 组件同时支持消费者和制作者端点。它还可用于 被动聊天模式( 使用,然后生成消息)。
50.6. 制作者示例
以下是如何通过 Telegram Bot API 发送消息到 Telegram chat 的基本示例。
in Java DSL
from("direct:start").to("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere");或在 Spring XML 中
<route>
<from uri="direct:start"/>
<to uri="telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere"/>
<route>
代码 123456789:insertYourAuthorizationTokenHere 是与 Bot 对应的 授权令牌。
在不指定 chat id 选项的情况下使用制作者端点时,目标聊天将使用消息的正文或标头中包含的信息来识别。制作者端点允许以下消息正文(类型为 OutgoingXXXMessage 的消息属于软件包 org.apache.camel.component.telegram.model)
| Java 类型 | 描述 |
|---|---|
|
| 向聊天发送文本消息 |
|
| 将照片(JPG、PNG)发送到聊天 |
|
| 向聊天发送 mp3 音频 |
|
| 将 mp4 视频发送到聊天 |
|
| 要将文件发送到聊天(任何介质类型) |
|
| 向聊天(WEBP)发送老板 |
|
| 向内联查询发送答案 |
|
| 编辑文本和游戏消息(editMessageText) |
|
| 编辑消息标题(editMessageCaption) |
|
| 要编辑动画、音频、文档、图片或视频消息。(editMessageMedia) |
|
| 仅编辑消息的回复标记。(editMessageReplyMarkup) |
|
| 删除包括服务消息的消息。(deleteMessage) |
|
| 要发送位置(setSendLocation) |
|
| 发送更改到实时位置(editMessageLiveLocation) |
|
| 在 live_period 过期(stopMessageLiveLocation)前,停止通过 bot 发送的实时位置消息或通过 bot (内联 bot) |
|
| 要发送有关场地的信息(sendVenue) |
|
|
发送支持的任何媒体类型。要求将 |
|
|
向聊天发送文本消息。它会自动转换为 |
50.7. 消费者示例
以下是如何接收电话用户要发送到配置的 Bot 的所有消息的基本示例。In Java DSL
from("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere")
.bean(ProcessorBean.class)或在 Spring XML 中
<route>
<from uri="telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere"/>
<bean ref="myBean" />
<route>
<bean id="myBean" class="com.example.MyBean"/>
MyBean 是一个简单的 bean,它将接收消息
public class MyBean {
public void process(String message) {
// or Exchange, or org.apache.camel.component.telegram.model.IncomingMessage (or both)
// do process
}
}支持传入消息的类型有
| Java 类型 | 描述 |
|---|---|
|
| 传入消息的完整对象表示 |
|
| 消息内容,仅用于文本消息 |
50.8. reactive Chat-Bot 示例
reactive chat-bot 模式是使用 Camel 组件构建简单的 chat bot,直接回复从 Telegram 用户收到的聊天消息的简单方法。
以下是 Java DSL 中 chat-bot 的基本配置
from("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere")
.bean(ChatBotLogic.class)
.to("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere");或在 Spring XML 中
<route>
<from uri="telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere"/>
<bean ref="chatBotLogic" />
<to uri="telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere"/>
<route>
<bean id="chatBotLogic" class="com.example.ChatBotLogic"/>
ChatBotLogic 是可实施通用字符串到字符串方法的简单 bean。
public class ChatBotLogic {
public String chatBotProcess(String message) {
if( "do-not-reply".equals(message) ) {
return null; // no response in the chat
}
return "echo from the bot: " + message; // echoes the message
}
}
chatBotProcess 方法返回的每个非null 字符串都自动路由到源自该请求的聊天(因为 CamelTelegramChatId 标头用于路由消息)。
50.9. 获取 Chat ID
如果要在事件发生时将消息推送到特定的 Telegram chat,您需要检索对应的 chat ID。聊天 ID 目前没有在电话客户端中显示,但您可以使用一个简单的路由获取它。
首先,将 bot 添加到您要推送消息的聊天中,然后运行类似以下的路由:
from("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere")
.to("log:INFO?showHeaders=true");
bot 收到的任何消息将转储到日志以及有关聊天(CamelTelegramChatId 标头)的信息。
获得聊天 ID 后,您可以使用以下示例路由向它推送消息。
from("timer:tick")
.setBody().constant("Hello")
to("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere&chatId=123456")
请注意,对应的 URI 参数只是 chatId。
50.10. 自定义键盘
您可以自定义用户键盘,而不是询问他写一个选项。OutgoingTextMessage 具有属性 ReplyMarkup,可用于此类操作。
from("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere")
.process(exchange -> {
OutgoingTextMessage msg = new OutgoingTextMessage();
msg.setText("Choose one option!");
InlineKeyboardButton buttonOptionOneI = InlineKeyboardButton.builder()
.text("Option One - I").build();
InlineKeyboardButton buttonOptionOneII = InlineKeyboardButton.builder()
.text("Option One - II").build();
InlineKeyboardButton buttonOptionTwoI = InlineKeyboardButton.builder()
.text("Option Two - I").build();
ReplyKeyboardMarkup replyMarkup = ReplyKeyboardMarkup.builder()
.keyboard()
.addRow(Arrays.asList(buttonOptionOneI, buttonOptionOneII))
.addRow(Arrays.asList(buttonOptionTwoI))
.close()
.oneTimeKeyboard(true)
.build();
msg.setReplyMarkup(replyMarkup);
exchange.getIn().setBody(msg);
})
.to("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere");
如果要禁用它,下一个消息必须在 ReplyKeyboardMarkup 对象上设置属性 removeKeyboard。
from("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere")
.process(exchange -> {
OutgoingTextMessage msg = new OutgoingTextMessage();
msg.setText("Your answer was accepted!");
ReplyKeyboardMarkup replyMarkup = ReplyKeyboardMarkup.builder()
.removeKeyboard(true)
.build();
msg.setReplyKeyboardMarkup(replyMarkup);
exchange.getIn().setBody(msg);
})
.to("telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere");50.11. Webhook 模式
Telegram 组件支持使用 camel- webhook 组件在 Webhook 模式中使用。
要启用 webhook 模式,用户首先需要为其应用添加 REST 实现。例如,Maven 用户可将 netty-http 添加到其 pom.xml 文件中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty-http</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>完成后,您需要将 Webhook URI 添加到您要使用的电话 URI 中。
在 Java DSL 中:
from("webhook:telegram:bots?authorizationToken=123456789:insertYourAuthorizationTokenHere").to("log:info");有些端点将由您的应用程序公开,并且 Telegram 将配置为向它们发送信息。您需要确保服务器向互联网公开,并传递 camel.component.webhook.configuration.webhook-external-url 属性的正确值。
有关如何设置它的说明,请参阅 camel-webhook 组件文档。
50.12. Spring Boot Auto-Configuration
在 Spring Boot 中使用 telegram 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-telegram-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 8 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.telegram.authorization-token | 当端点中没有提供信息时,要使用的默认 Telegram 身份验证令牌。 | 字符串 | |
| camel.component.telegram.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.telegram.base-uri | 可用于设置替代的基础 URI,例如,您想要根据模拟电话 API 测试组件。 | 字符串 | |
| camel.component.telegram.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.telegram.client | 使用自定义 AsyncHttpClient。选项是一个 org.asynchttpclient.AsyncHttpClient 类型。 | AsyncHttpClient | |
| camel.component.telegram.client-config | 要将 AsyncHttpClient 配置为使用自定义 com.ning.http.client.AsyncHttpClientConfig 实例。选项是一个 org.asynchttpclient.AsyncHttpClientConfig 类型。 | AsyncHttpClientConfig | |
| camel.component.telegram.enabled | 是否启用 telegram 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.telegram.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 51 章 timer
仅支持消费者
Timer 组件用于在计时器触发时生成消息交换,您只能使用此端点中的事件。
51.1. URI 格式
timer:name[?options]
其中 name 是 Timer 对象的名称,它在端点之间创建和共享。因此,如果您为所有计时器端点使用相同的名称,则只会使用一个 Timer 对象和线程。
生成的交换的 IN 正文是 null。因此 exchange.getIn ().getBody () 返回 null。
高级调度程序
另请参阅支持更多高级调度的 Quartz 组件。
51.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
51.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
51.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
51.3. 组件选项
Timer 组件支持 2 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
51.4. 端点选项
Timer 端点使用 URI 语法进行配置:
timer:timerName
使用以下路径和查询参数:
51.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| timerName (consumer) | 需要 计时器的名称。 | 字符串 |
51.4.2. 查询参数(13 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| 延迟 (使用者) | 触发第一个事件前的延迟。 | 1000 | long |
| 固定( 使用者) | 事件约为常规间隔,由指定的周期分隔。 | false | 布尔值 |
| includeMetadata (consumer) | 是否在交换中包含元数据,如触发的时间、计时器名称、计时器数等。包括了此信息。 | true | 布尔值 |
| 周期 (消费者) | 如果大于 0,则每个期间都生成定期事件。 | 1000 | long |
| repeatCount (消费者) | 指定触发的最大数量。因此,如果您将其设置为 1,计时器将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | long | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
| 守护进程 (高级) | 指定与计时器端点关联的线程是否作为守护进程运行。默认值为 true。 | true | 布尔值 |
| Pattern (高级) | 允许您指定自定义日期模式,用于使用 URI 语法设置时间选项。 | 字符串 | |
| 同步 (高级) | 设置是否应严格使用同步处理。 | false | 布尔值 |
| 时间 (高级) | java.util.Date 应生成第一个事件。如果使用 URI,则模式为:yyyy-MM-dd HH:mm:s 或 yyyy-MM-dd'T'HH:mm:s。 | Date | |
| timer (高级) | 使用自定义计时器。 | timer |
51.5. Exchange 属性
当计时器被触发时,它会将以下信息作为属性添加到 Exchange 中:
| 名称 | 类型 | 描述 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 消费者触发的时间。 |
|
|
| 当前触发的计数器。从 1 开始. |
51.6. 示例
要设置每 60 秒生成事件的路由:
from("timer://foo?fixedRate=true&period=60000").to("bean:myBean?method=someMethodName");
以上路由将生成一个事件,然后对 Registry 中名为 myBean 的 bean 调用 someMethodName 方法。
和 Spring DSL 中的路由:
<route> <from uri="timer://foo?fixedRate=true&period=60000"/> <to uri="bean:myBean?method=someMethodName"/> </route>
51.7. 尽快触发
自 Camel 2.17 起
您可能希望尽快在 Camel 路由中触发信息,您可以使用负延迟:
<route> <from uri="timer://foo?delay=-1"/> <to uri="bean:myBean?method=someMethodName"/> </route>
这样,计时器会立即触发消息。
您还可以指定一个 repeatCount 参数,以及一个负延迟,以在达到固定数后停止触发的消息。
如果没有指定 repeatCount,则计时器将继续触发的消息,直到路由停止为止。
51.8. 仅触发一次
您可能希望仅在 Camel 路由中触发一条消息一次,比如在启动路由时。要做到这一点,您可以使用 repeatCount 选项,如下所示:
<route> <from uri="timer://foo?repeatCount=1"/> <to uri="bean:myBean?method=someMethodName"/> </route>
51.9. Spring Boot Auto-Configuration
当将 timer 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-timer-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.timer.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.timer.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.timer.enabled | 是否启用计时器组件的自动配置。这默认是启用的。 | 布尔值 |
第 52 章 验证器
仅支持制作者
Validation 组件使用 JAXP Validation API 执行邮件正文的 XML 验证,并根据任何受支持的 XML 架构语言(默认为 XML Schema)执行 XML 验证。
请注意,组件还支持以下有用的模式语言:
MSV 组件还支持 RelaxNG XML 语法。
52.1. URI 格式
validator:someLocalOrRemoteResource
其中 someLocalOrRemoteResource 是 classpath 上本地资源的一些 URL,或者包含 XSD 要进行验证的文件系统上的远程资源或资源的完整 URL。例如:
-
msv:org/foo/bar.xsd -
msv:file:../foo/bar.xsd -
msv:http://acme.com/cheese.xsd -
validator:com/mypackage/myschema.xsd
Validation 组件直接在 camel-core 中提供。
52.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
52.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
52.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
52.3. 组件选项
Validator 组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| resourceResolverFactory (高级) | 要使用依赖于动态端点资源 URI 的自定义 LSResourceResolver。 | ValidatorResourceResolverFactory |
52.4. 端点选项
Validator 端点使用 URI 语法进行配置:
validator:resourceUri
使用以下路径和查询参数:
52.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| resourceUri (producer) | classpath 上本地资源 所需的 URL,或引用在 Registry 中查找 bean,或者指向包含 XSD 要进行验证的文件系统上的远程资源或资源的完整 URL。 | 字符串 |
52.4.2. 查询参数(10 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| failOnNullBody (producer) | 是否存在正文是否失败。 | true | 布尔值 |
| failOnNullHeader (producer) | 在针对标头验证时是否没有标头。 | true | 布尔值 |
| headerName (producer) | 对标头而不是邮件正文进行验证。 | 字符串 | |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| errorHandler (高级) | 使用自定义 org.apache.camel.processor.validation.ValidatorErrorHandler。默认错误处理程序捕获错误并抛出异常。 | ValidatorErrorHandler | |
| 资源解析器 (高级) | 使用自定义 LSResourceResolver。不要与 resourceResolverFactory 一起使用。 | LSResourceResolver | |
| resourceResolverFactory (高级) | 要使用依赖于动态端点资源 URI 的自定义 LSResourceResolver。默认资源解析器为资源解析器而言,资源解析器可以从类路径和文件系统中读取文件。不要与 resourceResolver 一起使用。 | ValidatorResourceResolverFactory | |
| schemaFactory (高级) | 使用自定义 javax.xml.validation.SchemaFactory。 | SchemaFactory | |
| 模式语言 (高级) | 配置 W3C XML Schema 命名空间 URI。 | 字符串 | |
| useSharedSchema (advanced) | Schema 实例是否应共享。引入了这个选项来临时解决 JDK 1.6.x 错误。Xerces 应没有这个问题。 | true | 布尔值 |
52.5. 示例
以下示例演示了如何配置 来自 endpoint direct:start 的路由,然后进入两个端点之一,可以是 mock:valid 或 mock:invalid,具体取决于 XML 是否与给定的 schema 匹配(在 classpath 上提供)。
52.6. 高级:JMX 方法 clearCachedSchema
您可以强制在验证器端点中缓存的模式被清除,并使用下一个进程调用使用 JMX 操作 clearCachedSchema 重新读取。您还可以使用此方法以编程方式清除缓存。此方法位于 ValidatorEndpoint 类中。
52.7. Spring Boot Auto-Configuration
在 Spring Boot 中使用验证器时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-validator-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.validator.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.validator.enabled | 是否启用验证器组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.validator.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.validator.resource-resolver-factory | 要使用依赖于动态端点资源 URI 的自定义 LSResourceResolver。选项是一个 org.apache.camel.component.validator.ValidatorResourceResolverFactory 类型。 | ValidatorResourceResolverFactory |
第 53 章 Webhook
仅支持消费者
Webhook meta 组件允许其他 Camel 组件在远程 webhook 提供程序中配置 webhook 并侦听它们。
以下组件目前提供 Webhook 端点:
- Telegram
Maven 用户可以将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-webhook</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>通常,支持 Webhook 的其他组件会传输此依赖关系。
53.1. URI 格式
webhook:endpoint[?options]
53.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
53.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
53.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
53.3. 组件选项
Webhook 组件支持 8 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| webhookAutoRegister (consumer) | 在启动时自动注册 webhook,并在关闭时取消注册。 | true | 布尔值 |
| webhookBasePath (consumer) | Webhook 将公开的第一个(基础)路径元素。最好将其设置为随机字符串,因此无法被未授权的方猜测。 | 字符串 | |
| webhookComponentName (consumer) | 用于 REST 传输的 Camel Rest 组件,如 netty-http。 | 字符串 | |
| webhookExternalUrl (consumer) | Webhook 提供程序所见的当前服务的 URL。 | 字符串 | |
| webhookPath (consumer) | 公开 Webhook 端点的路径(与 basePath 相对)。 | 字符串 | |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| 配置 (高级) | 设置 webhook meta-component 的默认配置。 | WebhookConfiguration |
53.4. 端点选项
Webhook 端点使用 URI 语法进行配置:
webhook:endpointUri
使用以下路径和查询参数:
53.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| endpointUri (consumer) | 必需 delegate uri。必须属于支持 Webhook 的组件。 | 字符串 |
53.4.2. 查询参数(8 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| webhookAutoRegister (consumer) | 在启动时自动注册 webhook,并在关闭时取消注册。 | true | 布尔值 |
| webhookBasePath (consumer) | Webhook 将公开的第一个(基础)路径元素。最好将其设置为随机字符串,因此无法被未授权的方猜测。 | 字符串 | |
| webhookComponentName (consumer) | 用于 REST 传输的 Camel Rest 组件,如 netty-http。 | 字符串 | |
| webhookExternalUrl (consumer) | Webhook 提供程序所见的当前服务的 URL。 | 字符串 | |
| webhookPath (consumer) | 公开 Webhook 端点的路径(与 basePath 相对)。 | 字符串 | |
| exceptionHandler (消费者) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不在使用。默认情况下,使用者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
| ExchangePattern (消费者) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern |
53.5. 例子
Webhook 组件的示例在支持它的委派组件文档中提供。
53.6. Spring Boot Auto-Configuration
当将 webhook 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-webhook-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 9 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.webhook.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.webhook.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.webhook.configuration | 设置 webhook meta-component 的默认配置。选项是一个 org.apache.camel.component.webhook.WebhookConfiguration 类型。 | WebhookConfiguration | |
| camel.component.webhook.enabled | 是否启用 webhook 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.webhook.webhook-auto-register | 在启动时自动注册 webhook,并在关闭时取消注册。 | true | 布尔值 |
| camel.component.webhook.webhook-base-path | Webhook 将公开的第一个(基础)路径元素。最好将其设置为随机字符串,因此无法被未授权的方猜测。 | 字符串 | |
| camel.component.webhook.webhook-component-name | 用于 REST 传输的 Camel Rest 组件,如 netty-http。 | 字符串 | |
| camel.component.webhook.webhook-external-url | Webhook 提供程序所见的当前服务的 URL。 | 字符串 | |
| camel.component.webhook.webhook-path | 公开 Webhook 端点的路径(与 basePath 相对)。 | 字符串 |
第 54 章 XSLT
仅支持制作者
XSLT 组件允许您使用 XSLT 模板处理消息。在使用 Templating 生成请求响应时,这是理想的选择。
54.1. URI 格式
xslt:templateName[?options]
URI 格式包含 templateName,可以是以下之一:
- 要调用的模板的 classpath-local URI
- 远程模板的完整 URL。
您可以以以下格式在 URI 中附加查询选项:
?option=value&option=value&…
表 54.1. 表 1。URI 示例
| URI | 描述 |
|---|---|
| xslt:com/acme/mytransform.xsl | 指的是 classpath 上的 com/acme/mytransform.xsl 文件 |
| xslt:file:///foo/bar.xsl | 指的是文件 /foo/bar.xsl |
| xslt:http://acme.com/cheese/foo.xsl | 指的是远程 http 资源 |
54.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
54.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能有许多。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
54.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项也归类到端点是否用作消费者(来自)还是用作制作者(到)还是用于两者。
配置端点最常在端点 URI 中作为路径和查询参数进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首先用于组件,后跟端点。
54.3. 组件选项
XSLT 组件支持 7 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| ContentCache (producer) | 加载资源内容的缓存(样式表文件)。如果设置为 false Camel,则会在每个消息处理时重新加载样式表文件。这对于开发是一个不错的选择。可以使用 clearCachedStylesheet 操作强制在运行时通过 JMX 重新加载缓存的样式表。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| autowiredEnabled (高级) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| transformerFactoryClass (高级) | 要使用自定义 XSLT 转换工厂,请将 指定为 FQN 类名称。 | 字符串 | |
| transformerFactoryConfigurationStrategy (advanced) | 应用新创建的 TransformerFactory 实例的配置策略。 | TransformerFactoryConfigurationStrategy | |
| uriResolver (高级) | 使用自定义的 UriResolver。不应与选项 'uriResolverFactory' 一起使用。 | URIResolver | |
| uriResolverFactory (高级) | 使用依赖于动态端点资源 URI 的自定义 UriResolver。不应与选项 'uriResolver' 一起使用。 | XsltUriResolverFactory |
54.4. 端点选项
XSLT 端点使用 URI 语法进行配置:
xslt:resourceUri
使用以下路径和查询参数:
54.4.1. 路径参数(1 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| resourceUri (producer) | 模板所需的路径。以下被默认的 URIResolver 支持。您可以使用:classpath、file、http、ref 或 bean. classpath、file 和 http 用于使用这些协议(classpath 为 default)来加载资源。ref 将查找 registry 中的资源。bean 将调用要用作资源的 bean 的方法。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。 | 字符串 |
54.4.2. 查询参数(13 参数)
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| ContentCache (producer) | 加载资源内容的缓存(样式表文件)。如果设置为 false Camel,则会在每个消息处理时重新加载样式表文件。这对于开发是一个不错的选择。可以使用 clearCachedStylesheet 操作强制在运行时通过 JMX 重新加载缓存的样式表。 | true | 布尔值 |
| deleteOutputFile (producer) | 如果您有 output=file,则此选项指定在 Exchange 完成处理时是否应删除输出文件。例如,假设输出文件是一个临时文件,那么最好在使用后将其删除。 | false | 布尔值 |
| failOnNullBody (producer) | 如果输入正文为 null,是否抛出异常。 | true | 布尔值 |
| lazyStartProducer (producer) | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| 输出 (生成器) | 选项,指定要使用的输出类型。可能的值有: string, bytes, DOM, file。前三个选项都基于内存,其中文件直接流传输到 java.io.File。对于 file,您必须使用密钥 Exchange.XSLT_FILE_NAME (也是 CamelXsltFileName )在 IN 标头中指定文件名。另外,必须事先创建指向文件名的所有路径,否则会在运行时抛出异常。 Enum 值:
| 字符串 | XsltOutput |
| transformerCacheSize (producer) | 缓存的 javax.xml.transform.Transformer 对象的数量,以避免调用 Template.newTransformer ()。 | 0 | int |
| EntityResolver (advanced) | 使用带有 javax.xml.transform.sax.SAXSource 的自定义 org.xml.sax.EntityResolver。 | EntityResolver | |
| errorListener (高级) | 允许将 配置为使用自定义 javax.xml.transform.ErrorListener。在执行此操作时,默认的错误监听程序会捕获任何错误或致命错误,并在 Exchange 上存储信息,因为属性没有被使用。因此,仅将这个选项用于特殊用例。 | ErrorListener | |
| 结果HandlerFactory (高级) | 允许您使用自定义 org.apache.camel.builder.xml.ResultHandlerFactory,它能够使用自定义 org.apache.camel.builder.xml.ResultHandler 类型。 | ResultHandlerFactory | |
| 转换程序工厂 (高级) | 使用自定义 XSLT 转换工厂。 | TransformerFactory | |
| transformerFactoryClass (高级) | 要使用自定义 XSLT 转换工厂,请将 指定为 FQN 类名称。 | 字符串 | |
| transformerFactoryConfigurationStrategy (advanced) | 应用新创建的 TransformerFactory 实例的配置策略。 | TransformerFactoryConfigurationStrategy | |
| uriResolver (高级) | 使用自定义 javax.xml.transform.URIResolver。 | URIResolver |
54.5. 使用 XSLT 端点
以下是使用 XSLT 模板公式为 InOut 消息交换的消息的响应(其中有一个 JMSReplyTo 标头)的示例。
from("activemq:My.Queue").
to("xslt:com/acme/mytransform.xsl");如果要使用 InOnly 并消耗信息并将其发送到另一个目的地,您可以使用以下路由:
from("activemq:My.Queue").
to("xslt:com/acme/mytransform.xsl").
to("activemq:Another.Queue");54.6. 在 XSLT 中获取可使用的参数
默认情况下,所有标头都添加为参数,然后在 XSLT 中提供。
要使参数可以使用,您需要声明这些参数。
<setHeader name="myParam"><constant>42</constant></setHeader> <to uri="xslt:MyTransform.xsl"/>
该参数需要在 XSLT 的顶层声明,以便其可用:
<xsl: ...... >
<xsl:param name="myParam"/>
<xsl:template ...>54.7. Spring XML 版本
要在 Spring XML 中使用上述示例,您可以使用类似以下代码的内容:
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="activemq:My.Queue"/>
<to uri="xslt:org/apache/camel/spring/processor/example.xsl"/>
<to uri="activemq:Another.Queue"/>
</route>
</camelContext>54.8. 使用 xsl:include
Camel 提供自己的 URIResolver 实施。这允许 Camel 从 classpath 中加载包含的文件。
例如,以下代码中的 include 文件将相对于起始端点定位。
<xsl:include href="staff_template.xsl"/>
这意味着 Camel 将 类路径中 的 文件作为 org/apache/camel/component/xslt/staff_template.xsl来查找
您可以使用 classpath: 或 file: 指示 Camel 在 classpath 或文件系统中查找。如果省略前缀,则 Camel 会使用端点配置中的前缀。如果端点配置中没有指定前缀,则默认为 classpath:。
您也可以在 include 路径中向后引用。在以下示例中,xsl 文件将在 org/apache/camel/component 下解析。
<xsl:include href="../staff_other_template.xsl"/>
54.9. 使用 xsl:include 和默认前缀
Camel 将使用端点配置中的前缀作为默认前缀。
您可以明确指定 file: 或 classpath: loading。如果需要,可以在 XSLT 脚本中混合这两种加载类型。
54.10. 动态风格表
要在运行时提供动态风格表,您可以定义动态 URI。如需更多信息,请参阅 如何在 to ()中使用动态 URI。
54.11. 访问警告、错误和严重错误(来自 XSLT ErrorListener)
任何警告/错误或严重错误都存储在当前交换中,作为带有密钥 Exchange.XSLT_ERROR、Exchange.XSLT_FATAL_ERROR 或 Exchange.XSLT_WARNING 的属性,允许最终用户在转换过程中发生任何错误。
例如,在下面的样式表中,如果员工有一个空的 dob 字段,我们想要终止。和 使用 xsl:message 来包括自定义错误消息。
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="staff/programmer">
<p>Name: <xsl:value-of select="name"/><br />
<xsl:if test="dob=''">
<xsl:message terminate="yes">Error: DOB is an empty string!</xsl:message>
</xsl:if>
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
异常存储在 Exchange 上,作为关键 Exchange.XSLT_WARNING 的警告。
54.12. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 xslt 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-xslt-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>组件支持 8 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.xslt.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.xslt.content-cache | 加载资源内容的缓存(样式表文件)。如果设置为 false Camel,则会在每个消息处理时重新加载样式表文件。这对于开发是一个不错的选择。可以使用 clearCachedStylesheet 操作强制在运行时通过 JMX 重新加载缓存的样式表。 | true | 布尔值 |
| camel.component.xslt.enabled | 是否启用 xslt 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.xslt.lazy-start-producer | 制作者是否应启动 lazy (在第一个消息中)。通过启动 lazy,您可以使用此选项来允许 CamelContext 和路由在制作者启动期间启动,并导致路由启动失败。通过将这个启动延迟到延迟,那么可以通过 Camel 的路由错误处理程序路由消息期间,可以处理启动失败。请注意,在处理第一个消息时,创建并启动制作者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.xslt.transformer-factory-class | 要使用自定义 XSLT 转换工厂,请将 指定为 FQN 类名称。 | 字符串 | |
| camel.component.xslt.transformer-factory-configuration-strategy | 应用新创建的 TransformerFactory 实例的配置策略。选项是一个 org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy 类型。 | TransformerFactoryConfigurationStrategy | |
| camel.component.xslt.uri-resolver | 使用自定义的 UriResolver。不应与选项 'uriResolverFactory' 一起使用。选项是一个 javax.xml.transform.URIResolver 类型。 | URIResolver | |
| camel.component.xslt.uri-resolver-factory | 使用依赖于动态端点资源 URI 的自定义 UriResolver。不应与选项 'uriResolver' 一起使用。选项是 org.apache.camel.component.xslt.XsltUriResolverFactory 类型。 | XsltUriResolverFactory |
第 55 章 avro
此组件为 avro 提供数据格式,允许使用 Apache Avro 的二进制数据格式序列化和反序列化消息。由于 Camel 3.2 rpc 功能被移到单独的 camel-avro-rpc 组件中。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-avro</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>您可以使用 maven 和 ant 等 schema 轻松生成类。请参阅 Apache Avro 文档。
55.1. Avro Dataformat Options
Avro 数据格式支持 1 选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| instanceClassName |
| 用于 marshal 和 unmarshalling 的类名称。 |
55.2. Avro 数据格式使用
使用 avro 数据格式与指定您要在路由中的 marshal 或 unmarshal 的类一样简单。
AvroDataFormat format = new AvroDataFormat(Value.SCHEMA$);
from("direct:in").marshal(format).to("direct:marshal");
from("direct:back").unmarshal(format).to("direct:unmarshal");其中 Value 是 Avro Maven 插件生成类。
或在 XML 中
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:in"/>
<marshal>
<avro instanceClass="org.apache.camel.dataformat.avro.Message"/>
</marshal>
<to uri="log:out"/>
</route>
</camelContext>另一种方法是指定上下文内的 dataformat,并从您的路由引用它。
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<dataFormats>
<avro id="avro" instanceClass="org.apache.camel.dataformat.avro.Message"/>
</dataFormats>
<route>
<from uri="direct:in"/>
<marshal><custom ref="avro"/></marshal>
<to uri="log:out"/>
</route>
</camelContext>同样,您可以使用 avro 数据格式进行 umarshal。
55.3. Spring Boot Auto-Configuration
在 Spring Boot 中使用 avro 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-avro-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 2 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.avro.enabled | 是否启用 avro 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.avro.instance-class-name | 用于 marshal 和 unmarshalling 的类名称。 | 字符串 |
第 56 章 Avro Jackson
jackson Avro 是一个数据格式,它使用带 Avro 扩展的 Jackson 库 将 Avro 有效负载合并到 Java 对象中或将 Java 对象合并到 Avro 有效负载中。
如果您熟悉 Jackson,则此 Avro 数据格式的行为方式与其 JSON 对应部分相同,因此可用于注解 JSON 序列化/反序列化的类。
from("kafka:topic").
unmarshal().avro(AvroLibrary.Jackson, JsonNode.class).
to("log:info");56.1. 配置 SchemaResolver
由于 Avro 序列化基于 schema,因此此数据格式需要您提供一个 SchemaResolver 对象,该对象能够查找将要被归档/解放的每个交换的 schema。
您可以向 registry 添加单个 SchemaResolver,它将被自动查找。或者,您可以明确指定对自定义 SchemaResolver 的引用。
56.2. Avro Jackson 选项
Avro Jackson 数据格式支持 18 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| objectMapper |
| 使用 Jackson 时查找并使用现有的 ObjectMapper 和给定 ID。 | |
| useDefaultObjectMapper |
| 是否从注册表查找和使用默认 Jackson ObjectMapper。 | |
| unmarshalType |
| 在 unmarshalling 时使用的 java 类型的类名称。 | |
| jsonView |
| 将 POJO 打包到 JSON 时,您可能希望从 JSON 输出中排除某些字段。借助 Jackson,您可以使用 JSON 视图来完成此操作。此选项是引用具有 JsonView 注释的类。 | |
| Include |
| 如果您想将 pojo 链接到 JSON,而 pojo 则有一些字段具有 null 值。您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | |
| allowJmsType |
| 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。 | |
| collectionType |
| 指的是要在 registry 中使用的自定义集合类型。这个选项应该很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。 | |
| useList |
| 要取消组合到映射列表或 Pojo 的列表,请执行以下操作: | |
| moduleClassNames |
| 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module,指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。 | |
| moduleRefs |
| 使用 Camel 注册表中提到的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | |
| enableFeatures |
| 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | |
| disableFeatures |
| Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | |
| allowUnmarshallType |
| 如果启用,则 Jackson 允许在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只在需要使用时才启用。 | |
| timezone |
| 如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。 | |
| autoDiscoverObjectMapper |
| 如果设置为 true,则 Jackson 将向 registry 中查找 objectMapper。 | |
| contentTypeHeader |
| 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | |
| schemaResolver |
| 用于查找传输中数据的模式解析器的可选模式。 | |
| autoDiscoverSchemaResolver |
| 如果不禁用,SchemaResolver 将进入 registry。 |
56.3. 使用自定义 AvroMapper
您可以将 JacksonAvroDataFormat 配置为使用自定义 AvroMapper,以防需要更多对映射配置进行控制。
如果您在注册表中设置单个 AvroMapper,则 Camel 将自动查找并使用此 AvroMapper。
56.4. 依赖项
要在 camel 路由中使用 Avro Jackson,您需要添加对 camel-jackson-avro 的依赖,它实现此数据格式。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson-avro</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>56.5. Spring Boot Auto-Configuration
在 Spring Boot 中使用 avro-jackson 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jackson-avro-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 19 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.avro-jackson.allow-jms-type | 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。 | false | 布尔值 |
| camel.dataformat.avro-jackson.allow-unmarshall-type | 如果启用,则 Jackson 允许在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只在需要使用时才启用。 | false | 布尔值 |
| camel.dataformat.avro-jackson.auto-discover-object-mapper | 如果设置为 true,则 Jackson 将向 registry 中查找 objectMapper。 | false | 布尔值 |
| camel.dataformat.avro-jackson.auto-discover-schema-resolver | 如果不禁用,SchemaResolver 将进入 registry。 | true | 布尔值 |
| camel.dataformat.avro-jackson.collection-type | 指的是要在 registry 中使用的自定义集合类型。这个选项应该很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。 | 字符串 | |
| camel.dataformat.avro-jackson.content-type-header | 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | true | 布尔值 |
| camel.dataformat.avro-jackson.disable-features | Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | 字符串 | |
| camel.dataformat.avro-jackson.enable-features | 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | 字符串 | |
| camel.dataformat.avro-jackson.enabled | 是否启用 avro-jackson 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.avro-jackson.include | 如果您想将 pojo 链接到 JSON,而 pojo 则有一些字段具有 null 值。您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | 字符串 | |
| camel.dataformat.avro-jackson.json-view | 将 POJO 打包到 JSON 时,您可能希望从 JSON 输出中排除某些字段。借助 Jackson,您可以使用 JSON 视图来完成此操作。此选项是引用具有 JsonView 注释的类。 | 字符串 | |
| camel.dataformat.avro-jackson.module-class-names | 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module,指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。 | 字符串 | |
| camel.dataformat.avro-jackson.module-refs | 使用 Camel 注册表中提到的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | 字符串 | |
| camel.dataformat.avro-jackson.object-mapper | 使用 Jackson 时查找并使用现有的 ObjectMapper 和给定 ID。 | 字符串 | |
| camel.dataformat.avro-jackson.schema-resolver | 用于查找传输中数据的模式解析器的可选模式。 | 字符串 | |
| camel.dataformat.avro-jackson.timezone | 如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。 | 字符串 | |
| camel.dataformat.avro-jackson.unmarshal-type | 在 unmarshalling 时使用的 java 类型的类名称。 | 字符串 | |
| camel.dataformat.avro-jackson.use-default-object-mapper | 是否从注册表查找和使用默认 Jackson ObjectMapper。 | true | 布尔值 |
| camel.dataformat.avro-jackson.use-list | 要取消组合到映射列表或 Pojo 的列表,请执行以下操作: | false | 布尔值 |
第 57 章 Bindy
此组件的目标是允许解析/绑定非结构化数据(或更精确的非XML 数据)到/来自使用注解定义的绑定映射的 Java Beans。使用 Bindy,您可以从 等源绑定数据:
- CSV 记录,
- 固定长度记录,
- FIXED 消息,
- 或者几乎任何其他非结构化数据
到一个或多个 Plain Old Java 对象(POJO)。Bindy 根据 java 属性的类型转换数据。在某些情况下,POJO 可以与一对多关系相关联。此外,对于数据类型,如 Date, Double, Float, Integer, Short, Long and BigDecimal,您可以提供在属性格式化过程中应用的模式。
对于 BigDecimal 数字,您还可以定义精度和十进制或分组分隔符。
| 类型 | 格式类型 | 特征示例 | Link |
|---|---|---|---|
| Date |
|
| https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/SimpleDateFormat.html |
| 十进制* |
|
| https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/DecimalFormat.html |
其中 Decimal = Double, Integer, Float, Short, Long
支持的格式
第一个发行版本只支持用逗号分开的值字段和键值对字段(如 : FIX 消息)。
要使用 camel-bindy,您必须首先在软件包中定义模型(如 com.acme.model)和每个模型类(如 Order、Client、Instrument、…)将所需的注解(这里介绍)添加到 Class 或字段中。
多模型
您可以使用类名称而不是软件包名称配置绑定,您可以在同一个软件包中放入多个模型。
57.1. 选项
Bindy 数据格式支持 5 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| type |
| 必需 是否使用 Csv、修复或 KeyValue。 Enum 值:
| |
| classType |
| 要使用的模型类的名称。 | |
| locale |
| 要将默认区域设置配置为使用,例如 us 为单元状态。要使用 JVM 平台默认区域设置,请使用名称 default。 | |
| unwrapSingleInstance |
| 当 unmarshalling 应该一个实例被解封并返回,而不是嵌套在 java.util.List 中。 | |
| allowEmptyStream |
| 是否在 unmarshal 进程中允许空流。如果为 true,则在提供不带记录的正文时不会抛出异常。 |
57.2. 注解
创建的注解允许将模型的不同概念映射到 POJO,如下所示:
- 记录类型(CSV、键值对(如 FIX 消息)、固定 length …)
- 链接(指向另一个对象中的链接对象),
- DataField 及其属性(int、type、…)
- KeyValuePairField (用于 key = value 格式,如我们在修复财务消息中一样)
- 部分(用于识别标头、正文和页脚部分),
- OneToMany,
- BindyConverter,
- FormatFactories
本节将描述它们。
57.2.1. 1.CsvRecord
CsvRecord 注解用于识别模型的根类。它代表记录 = " CSV 文件行",并可链接到多个子模型类。
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| CsvRecord | CSV | 类 |
| 参数名称 | 类型 | 必填 | 默认值 | info |
|---|---|---|---|---|
| 分隔符 | 字符串 | ✓ | 用于在令牌中分割记录的分隔符(必需)- 可以是 ',' 或 ';' 或 'anything'。支持的唯一空格字符是 tab (\t)。不支持其他空格字符(空格)。这个值被解释为正则表达式。如果要使用在正则表达式中具有特殊含义的符号,如 '|' 符号,您必须屏蔽它,如 '|'。 | |
| allowEmptyStream | 布尔值 | false | allowEmptyStream 参数将允许 prcoess CSV 文件无法查询的流。 | |
| autospanLine | 布尔值 | false | 最后一个记录涵盖其余行(可选)- 如果启用,则最后一列会自动跨越行尾,例如,如果其注释,则允许行包含所有字符,也是分隔符字符。 | |
| CRLF | 字符串 | WINDOWS | 用于在每次记录后(可选)添加回车符的字符 - 允许定义要使用的回车符。如果您指定之前列出的三个值,则您输入的值(custom)将用作 CRLF 字符。可以使用三个值:WINDOWS、UNIX、MAC 或自定义。 | |
| endWithLineBreak | 布尔值 | true | 如果 CSV 文件应该以换行符或没有行结尾(可选) | |
| generateHeaderColumns | 布尔值 | false | generateHeaderColumns 参数允许在 CSV 中添加,生成的标头包含列的名称 | |
| isOrdered | 布尔值 | false | 指明信息是否必须在输出中排序 | |
| name | 字符串 | 描述记录的名称(可选) | ||
| quote | 字符串 | " | 是否使用给定引号字符(可选)替换列(可选)- 在生成 CSV 时可以指定字段的引号字符。此注解与模型的根类关联,必须一次性声明。 | |
| 引用 | 布尔值 | false | 指明值(和标头)是否在 marshaling 时加上引号(可选) | |
| quotingEscaped | 布尔值 | false | 指明值在 quoting 时是否必须转义(可选) | |
| removeQuotes | 布尔值 | true | 如果 unmarshalling 应该为每个字段删除引号,则 remove quotes 参数标志 | |
| skipField | 布尔值 | false | skipField 参数将允许跳过 CSV 文件的字段。如果不需要一些字段,可以跳过它们。 | |
| skipFirstLine | 布尔值 | false | skipFirstLine 参数将允许跳过或不跳过 CSV 文件的第一行。此行通常包含列定义 |
case 1 : separator = ','
用于隔离 CSV 记录中字段的分隔符是 ,
10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500, USD, 08-01-2009
@CsvRecord( separator = "," )
public Class Order {
}case 2 : separator = ';'
与前面的情况相比,这里的分隔符为 ; 而不是 :
10; J; Pauline; M; XD12345678; Fortis Dynamic 15/15; 2500; USD; 08-01-2009
@CsvRecord( separator = ";" )
public Class Order {
}case 3 : separator = '|'
与前面的情况相比,这里的分隔符为 | 而不是 ; :
10| J| Pauline| M| XD12345678| Fortis Dynamic 15/15| 2500| USD| 08-01-2009
@CsvRecord( separator = "\\|" )
public Class Order {
}case 4 : separator = '\",\"'
适用于 Camel 2.8.2 或更早版本
当要解析 CSV 记录的字段包含 , 或 ; (也用作分隔符)时,我们应找到另一个策略以告诉 camel bindy 如何处理这种情况。要使用逗号定义包含数据的字段,您可以使用单引号或双引号作为分隔符(例如: '10', 'Street 10, NY', 'USA' 或 "10", "Street 10, NY", "USA")。
| __ | 在这种情况下,将通过 bindy 删除行的第一个和最后一个字符,即单引号或双引号。 |
"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
@CsvRecord( separator = "\",\"" )
public Class Order {
}Bindy 会自动检测记录是否用单引号或双引号括起来,并在从 CSV 重复到对象时自动删除这些引号。因此 ,不要在 分隔符中包含引号,而是不要如下所示:
"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15","2500","USD","08-01-2009"
@CsvRecord( separator = "," )
public Class Order {
}
请注意,如果要从对象到 CSV 并使用引号,则需要使用 @CsvRecord 上的 quote 属性来指定要使用的引号字符,如下所示:
@CsvRecord( separator = ",", quote = "\"" )
public Class Order {
}case 5 : 分隔符和跳过FirstLine
当客户端要在文件的第一行(数据字段的名称)中时,这个功能非常有趣:
order id, client id, first name, last name, isin code, instrument name, quantity, currency, date
要告知绑定此第一行在解析过程中必须跳过,那么我们使用属性 :
@CsvRecord(separator = ",", skipFirstLine = true)
public Class Order {
}case 6 : generateHeaderColumns
要在生成的 CSV 第一行中添加,注解中的 generateHeaderColumns 属性必须设置为 true,如下所示:
@CsvRecord( generateHeaderColumns = true )
public Class Order {
}因此,在 unmarshaling 过程中绑定会生成 CSV,如下所示:
order id, client id, first name, last name, isin code, instrument name, quantity, currency, date 10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500, USD, 08-01-2009
问题单 7:回车符
如果运行 camel-bindy 的平台不是 Windows,而是 Macintosh 或 Unix,则您可以更改类似如下的 crlf 属性。可用的三个值有:WINDOWS、UNIX 或 MAC
@CsvRecord(separator = ",", crlf="MAC")
public Class Order {
}另外,如果出于某种原因您需要添加不同的行尾字符,您可以使用 crlf 参数指定它。在以下示例中,我们可以使用逗号结束行,后跟换行符:
@CsvRecord(separator = ",", crlf=",\n")
public Class Order {
}case 8 : isOrdered
有时,在从模型创建 CSV 记录时要遵循的顺序与解析过程中使用的顺序不同。然后,在这种情况下,我们可以使用属性 isOrdered = true 来指示这一点与 DataField 注解的属性 位置 相结合。
@CsvRecord(isOrdered = true)
public Class Order {
@DataField(pos = 1, position = 11)
private int orderNr;
@DataField(pos = 2, position = 10)
private String clientNr;
}| __ |
|
57.2.2. 2.Link
link 注解将允许将对象链接到一起。
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| Link | all | 类和属性 |
| 参数名称 | 类型 | 必填 | 默认值 | info |
|---|---|---|---|---|
| linkType | LinkType | OneToOne | 标识类间关系的链接类型 |
从当前版本中,只允许一对一的关系。
例如:如果模型类客户端链接到 Order 类,则使用 Order 类中的注解 Link,如下所示:
属性链接
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@Link
private Client client;
}对于类客户端:
类链接
@Link
public class Client {
}57.2.3. 3.DataField
DataField 注解定义字段的属性。每个 datafield 都由记录中的位置、类型(字符串、int、date、…)以及可选的模式来标识。
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| DataField | all | 属性 |
| 参数名称 | 类型 | 必填 | 默认值 | info |
|---|---|---|---|---|
| pos | int | ✓ | 输入记录中数据的位置,必须从 1 开始(必需)。查看 position 参数。 | |
| align | 字符串 | R | 将文本与右侧或左对齐。使用值 <tt>R</tt> 或 <tt>L</tt>。 | |
| Clip | 布尔值 | false | 如果在使用固定长度时超过允许的长度,则指示在字段中允许的数据。 | |
| columnName | 字符串 |
标头列的名称(可选)。将属性的名称用作默认值。仅在 | ||
| decimalSeparator | 字符串 | 用于 BigDecimal 数字的十进制 Separator | ||
| defaultValue | 字符串 | 如果没有设置值,则字段的默认值 | ||
| delimiter | 字符串 | 如果字段有变量长度,则使用可选分隔符 | ||
| groupingSeparator | 字符串 | 当我们将 Separator 分组到要与 BigDecimal 号一起使用的 Separator,使用分组,例如 123,456.789 | ||
| impliedDecimalSeparator | 布尔值 | false | 指明是否有十进制点代表在指定位置 | |
| length | int | 0 | 如果记录设置为固定长度,则数据块的长度(字符数) | |
| lengthPos | int | 0 | 在记录中标识定义此字段预期的固定长度的 data 字段 | |
| 方法 | 字符串 | 在 DataField 上调用以应用此类自定义的方法名称。这必须是 datafield 本身的方法,或者您必须提供类方法的静态完全限定名称,如:请参阅单元测试 org.apache.camel.dataformat.bindy.csv.BindySimpleCsvFunctionWithExternalMethodTest.replaceToBar | ||
| name | 字符串 | 字段的名称(可选) | ||
| paddingChar | char | 如果记录被设置为固定长度,则带有 char to pad | ||
| pattern | 字符串 | Java 格式化器(例如 simpleDateFormat)的模式,它将用于转换数据(可选)。如果使用模式,则建议在绑定数据格式中设置 locale。设置为已知区域设置,如 "us" 或 "default" 来使用平台默认区域设置。 | ||
| position | int | 0 | 生成输出消息中的字段位置(应该从 1 开始)。在 CSV 生成的字段的位置(输出消息)的位置必须与输入位置(pos)不同时,必须使用。请参阅 pos 参数。 | |
| 精度 | int | 0 | 要创建的 \{@link java.math.BigDecimal} 号 | |
| required | 布尔值 | false | 指明字段是否强制 | |
| rounding | 字符串 | CEILING | round 模式用于舍入/scale a BigDecimal Values : UP, DOWN, CEILING, FLOOR, HALF_UP, HALF_DOWN,HALF_EVEN, UNNECESSARY e.g : Number = 123456.789, Precision = 2, Rounding = CEILING Result: 123456.79. | |
| timezone | 字符串 | 要使用的时区。 | ||
| trim | 布尔值 | false | 指明值是否应该修剪 |
问题单 1:pos
此参数/attribute 代表 CSV 记录中字段的位置。
position
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5)
private String isinCode;
}
如本例中所示,位置从 1 开始,但在类 Order 中继续 5。从 2 到 4 的数字在类客户端中定义(请参阅之后)。
在另一个模型类中继续
public class Client {
@DataField(pos = 2)
private String clientNr;
@DataField(pos = 3)
private String firstName;
@DataField(pos = 4)
private String lastName;
}问题单 2:模式
模式允许增强或验证数据的格式
pattern
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5)
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
@DataField(pos = 7, precision = 2)
private BigDecimal amount;
@DataField(pos = 8)
private String currency;
// pattern used during parsing or when the date is created
@DataField(pos = 9, pattern = "dd-MM-yyyy")
private Date orderDate;
}案例 3:精度
当您要定义数字的十进制部分时,精度很有用。
精度
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@Link
private Client client;
@DataField(pos = 5)
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
@DataField(pos = 7, precision = 2)
private BigDecimal amount;
@DataField(pos = 8)
private String currency;
@DataField(pos = 9, pattern = "dd-MM-yyyy")
private Date orderDate;
}问题单 4:位置在输出中有所不同
position 属性将通知如何将字段放在 CSV 记录中。默认情况下,所用的位置与通过属性 pos 定义的位置对应。如果位置不同(这意味着我们有一个身份统计进程与 unmarshaling 的比较),那么我们可以使用 位置 来指明这一点。
下面是一个示例:
在输出中位置不同
@CsvRecord(separator = ",", isOrdered = true)
public class Order {
// Positions of the fields start from 1 and not from 0
@DataField(pos = 1, position = 11)
private int orderNr;
@DataField(pos = 2, position = 10)
private String clientNr;
@DataField(pos = 3, position = 9)
private String firstName;
@DataField(pos = 4, position = 8)
private String lastName;
@DataField(pos = 5, position = 7)
private String instrumentCode;
@DataField(pos = 6, position = 6)
private String instrumentNumber;
}
注释 @DataField 的此属性必须与注释 @CsvRecord 的 attribute isOrdered = true 结合使用。
问题单 5:必需
如果某个字段是必需的,只需使用 所需的 属性设为 true。
必填
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 2, required = true)
private String clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4, required = true)
private String lastName;
}如果记录中没有此字段,解析器将使用以下信息引发错误:
Some fields are missing (optional or mandatory), line :
问题单 6:修剪
如果字段在处理前应该删除的前导和/或尾随空格,只需使用属性 trim 设为 true。
Trim
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1, trim = true)
private int orderNr;
@DataField(pos = 2, trim = true)
private Integer clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4)
private String lastName;
}case 7 : defaultValue
如果未定义字段,则使用 defaultValue 属性指示的值。
默认值
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 2)
private Integer clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4, defaultValue = "Barin")
private String lastName;
}case 8 : columnName
仅在 @CsvRecord 具有注解 generateHeaderColumns = true 时指定属性的列名称。
列名称
@CsvRecord(separator = ",", generateHeaderColumns = true)
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5, columnName = "ISIN")
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
}此属性仅适用于可选字段。
57.2.4. 4.FixedLengthRecord
FixedLengthRecord 注解用于识别模型的根类。它代表记录 = "一个文件/消息行包含数据固定长度(字符数)格式",并可链接到多个子模型类。这个格式是有点的,因为字段的数据可以与右侧或左侧一致。
当数据的大小没有完全填满字段的长度时,我们可以添加"平板"字符。
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| FixedLengthRecord | 已修复 | 类 |
| 参数名称 | 类型 | 必填 | 默认值 | info |
|---|---|---|---|---|
| countGrapheme | 布尔值 | false | 指明如何计算收费 | |
| CRLF | 字符串 | WINDOWS | 用于在每次记录后添加回车符(可选)。可能的值: WINDOWS、UNIX、MAC 或自定义。这个选项仅在 marshalling 期间使用,除非自定义 eol,否则 unmarshalling 使用系统默认 JDK 提供的行分隔符。 | |
| EOL | 字符串 | 用来在 unmarshalling 时处理在各个记录后考虑行结尾的字符(可选 - default: "",它有助于使用默认 JDK 提供的行分隔符),除非提供任何其他行分隔符,否则此选项仅在 unmarshalling 期间使用,其中 marshalling 使用系统默认行分隔符作为"WINDOWS",除非提供了任何其他值。 | ||
| footer | 类 | void | 表示此类型的记录后可以跟随文件末尾的单个页脚记录 | |
| header | 类 | void | 表示此类型的记录在文件的开头之间可以加上一个标头记录 | |
| ignoreMissingChars | 布尔值 | false | 指明是否忽略短行 | |
| ignoreTrailingChars | 布尔值 | false | 当解压缩 / 解析时,可以忽略超出最后一个映射文件的字符。此注解与模型的根类关联,必须一次性声明。 | |
| length | int | 0 | 记录的固定长度(字符数)。这意味着记录始终是带有 \{#paddingChar ()} 的较长的 padded。 | |
| name | 字符串 | 描述记录的名称(可选) | ||
| paddingChar | char | 收费到平板, | ||
| skipFooter | 布尔值 | false | 配置数据格式以跳过页脚记录的 / unmarshalling。在主记录上配置此参数(例如,而不是标头或页脚)。 | |
| skipHeader | 布尔值 | false | 配置数据格式以跳过标题记录的 / unmarshalling / unmarshalling。在主记录上配置此参数(例如,而不是标头或页脚)。 |
记录可能不是标头/页脚和主固定长度记录。
问题单 1:简单固定长度记录
这个简单示例演示了如何设计模型来解析/格式化固定消息
10A9PaulineMISINXD12345678BUYShare2500.45USD01-08-2009
fixed-simple
@FixedLengthRecord(length=54, paddingChar=' ')
public static class Order {
@DataField(pos = 1, length=2)
private int orderNr;
@DataField(pos = 3, length=2)
private String clientNr;
@DataField(pos = 5, length=7)
private String firstName;
@DataField(pos = 12, length=1, align="L")
private String lastName;
@DataField(pos = 13, length=4)
private String instrumentCode;
@DataField(pos = 17, length=10)
private String instrumentNumber;
@DataField(pos = 27, length=3)
private String orderType;
@DataField(pos = 30, length=5)
private String instrumentType;
@DataField(pos = 35, precision = 2, length=7)
private BigDecimal amount;
@DataField(pos = 42, length=3)
private String currency;
@DataField(pos = 45, length=10, pattern = "dd-MM-yyyy")
private Date orderDate;
}问题单 2:修复带有校准和 padding 的长度记录
这更高级的示例演示了如何为字段定义对齐以及如何分配"这里 "的 padding 字符:
10A9 PaulineM ISINXD12345678BUYShare2500.45USD01-08-2009
fixed-padding-align
@FixedLengthRecord(length=60, paddingChar=' ')
public static class Order {
@DataField(pos = 1, length=2)
private int orderNr;
@DataField(pos = 3, length=2)
private String clientNr;
@DataField(pos = 5, length=9)
private String firstName;
@DataField(pos = 14, length=5, align="L") // align text to the LEFT zone of the block
private String lastName;
@DataField(pos = 19, length=4)
private String instrumentCode;
@DataField(pos = 23, length=10)
private String instrumentNumber;
@DataField(pos = 33, length=3)
private String orderType;
@DataField(pos = 36, length=5)
private String instrumentType;
@DataField(pos = 41, precision = 2, length=7)
private BigDecimal amount;
@DataField(pos = 48, length=3)
private String currency;
@DataField(pos = 51, length=10, pattern = "dd-MM-yyyy")
private Date orderDate;
}问题单 3: Field padding
有时,为记录定义的默认 padding 不能应用于字段,因为我们有一个数字格式,我们想使用 '0' 而不是 ' '。在这种情况下,您可以在模型中使用 @DataField 属性 paddingChar,以设置此值。
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
fixed-padding-field
@FixedLengthRecord(length = 65, paddingChar = ' ')
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 3, length = 2)
private String clientNr;
@DataField(pos = 5, length = 9)
private String firstName;
@DataField(pos = 14, length = 5, align = "L")
private String lastName;
@DataField(pos = 19, length = 4)
private String instrumentCode;
@DataField(pos = 23, length = 10)
private String instrumentNumber;
@DataField(pos = 33, length = 3)
private String orderType;
@DataField(pos = 36, length = 5)
private String instrumentType;
@DataField(pos = 41, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 53, length = 3)
private String currency;
@DataField(pos = 56, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}问题单 4:带有分隔符的固定长度记录
固定长度记录有时在记录中有分隔的内容。firstName 和 lastName 字段在以下示例中用 ^ 字符分隔:
10A9Pauline^M^ISINXD12345678BUYShare000002500.45USD01-08-2009
fixed- separated
@FixedLengthRecord
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, delimiter = "^")
private String firstName;
@DataField(pos = 4, delimiter = "^")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 10)
private String instrumentNumber;
@DataField(pos = 7, length = 3)
private String orderType;
@DataField(pos = 8, length = 5)
private String instrumentType;
@DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 10, length = 3)
private String currency;
@DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
可以使用 ordinal、sequential 值而不是精确的列号来定义固定长度记录中的 pos 值。
案例 5:修复长度的长度记录,记录定义的字段长度
有时,固定长度记录可能包含一个字段,用来定义同一记录中另一个字段的预期长度。在以下示例中,instrumentNumber 字段值的长度由记录中的 instrumentNumberLen 字段的值定义。
10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009
fixed- separated
@FixedLengthRecord
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, delimiter = "^")
private String firstName;
@DataField(pos = 4, delimiter = "^")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 2, align = "R", paddingChar = '0')
private int instrumentNumberLen;
@DataField(pos = 7, lengthPos=6)
private String instrumentNumber;
@DataField(pos = 8, length = 3)
private String orderType;
@DataField(pos = 9, length = 5)
private String instrumentType;
@DataField(pos = 10, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 11, length = 3)
private String currency;
@DataField(pos = 12, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}问题单 6:使用标头和页脚修复长度记录
Bindy 将发现配置为模型一部分的固定长度标头和页脚记录 - 如果注解的类与主 @FixedLengthRecord 类相同,或者在配置的扫描软件包之一内存在。以下文本演示了一个标题记录和页脚记录所括号的两个固定长度记录。
101-08-2009 10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009 10A9 RichN ISINXD12345678BUYShare000002700.45USD01-08-2009 9000000002
fixed-header-and-footer-main-class
@FixedLengthRecord(header = OrderHeader.class, footer = OrderFooter.class)
public class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, length = 9)
private String firstName;
@DataField(pos = 4, length = 5, align = "L")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 10)
private String instrumentNumber;
@DataField(pos = 7, length = 3)
private String orderType;
@DataField(pos = 8, length = 5)
private String instrumentType;
@DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 10, length = 3)
private String currency;
@DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@FixedLengthRecord
public class OrderHeader {
@DataField(pos = 1, length = 1)
private int recordType = 1;
@DataField(pos = 2, length = 10, pattern = "dd-MM-yyyy")
private Date recordDate;
}
@FixedLengthRecord
public class OrderFooter {
@DataField(pos = 1, length = 1)
private int recordType = 9;
@DataField(pos = 2, length = 9, align = "R", paddingChar = '0')
private int numberOfRecordsInTheFile;
}case 7:在解析固定长度记录时跳过内容
通常,与提供固定长度记录的系统集成,其中包括超过目标用例所需的信息。在这种情况下,可以跳过我们不需要的这些字段的声明和解析。为保证这一点,如果下一个声明的字段的 pos 值超过最后一次解析字段的光标位置,Bindy 将跳过到记录中的下一个映射字段。对感兴趣的字段使用绝对位置(而不是 ordinal 值)会导致 Bindy 在两个字段之间跳过内容。
同样,除某些字段以外的任何内容都不是感兴趣的。在这种情况下,您可以通过在 @FixedLengthRecord 声明上设置 ignoreTrailingChars 属性,告知 Bindy 跳过最后一个映射字段以外的解析。
@FixedLengthRecord(ignoreTrailingChars = true)
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 3, length = 2)
private String clientNr;
// any characters that appear beyond the last mapped field will be ignored
}57.2.5. 5.消息
Message 注解用于识别模型的类,它们将包含键值对字段。这种格式主要在财务交换协议消息(FIX)中使用。但是,此注解可用于任何其他格式,其中数据由键标识。密钥对值可以通过分隔符相互分隔,可以是类似 tab delimitor (unicode 表示 : \u0009)或头头(unicode 表示 : \u0001)的特殊字符。
要处理 FIX 消息,模型必须包含链接到根消息类的标头和 Trailer 类,可以是 Order 类。这不是强制性的,但当您结合使用 camel-bindy 与 camel-fix 的组合时,这是基于快速Fix 项目的修复网关。
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| 消息 | 键值对 | 类 |
| 参数名称 | 类型 | 必填 | 默认值 | info |
|---|---|---|---|---|
| keyValuePairSeparator | 字符串 | ✓ | 键值对分隔符用于从其键中分离值(必需)。可以是 '\u0001', '\u0009', '#', 或 'anything'。 | |
| pairSeparator | 字符串 | ✓ | 用于分割令牌中的键值对的对分隔符(必需)。可以是 '='、';' 或 'anything'。 | |
| CRLF | 字符串 | WINDOWS | 用于在每次记录后添加回车符(可选)。可能的值 = WINDOWS、UNIX、MAC 或自定义.如果您指定之前列出的三个值,则您输入的值(custom)将用作 CRLF 字符。 | |
| isOrdered | 布尔值 | false | 指明消息是否必须在输出中排序。此注解与模型的消息类关联,必须一次性声明。 | |
| name | 字符串 | 描述消息的名称(可选) | ||
| type | 字符串 | 修复 | type 用于定义消息的类型(如 FIX、EMX、…)(可选) | |
| version | 字符串 | 4.1 | version 定义消息的版本(如 4.1、…)(可选) |
问题单 1:分隔符 = 'u0001'
用于隔离 FIX 消息的键值对字段的分隔符是 ASCII 01 字符,或者采用 unicode 格式 \u0001。此字符必须再次转义,以避免 java 运行时错误。下面是一个示例:
8=FIX.4.1 9=20 34=1 35=0 49=INVMGR 56=BRKR 1=BE.CHM.001 11=CHM0001-01 22=4 ...
以及如何使用注解:
FIX - 消息
@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {
}查看测试情况
选项卡等 ASCII 字符 … 无法在 WIKI 页面中显示。因此,请看 camel-bindy 的测试案例,以查看 FIX 信息是如何显示的(https://github.com/apache/camel/blob/main/components/camel-bindy/src/test/data/fix/fix.txt)和 Order, Trailer, Header class (https://github.com/apache/camel/blob/main/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/fix/simple/Order.java)。
57.2.6. 6.KeyValuePairField
KeyValuePairField 注解定义键值对字段的属性。每个 KeyValuePairField 都由标签(= key)及其值关联、类型(字符串、int、date、…)标识,可选模式,如果需要该字段。
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| KeyValuePairField | Key Value Pair - FIX | 属性 |
| 参数名称 | 类型 | 必填 | 默认值 | info |
|---|---|---|---|---|
| tag | int | ✓ | 标识消息中的字段的标签(必需)- 必须是唯一的 | |
| impliedDecimalSeparator | 布尔值 | false | <b>Camel 2.11:</b> 表示是否有十进制点表示在指定位置 | |
| name | 字符串 | 字段的名称(可选) | ||
| pattern | 字符串 | 格式器将用于转换数据的模式(可选) | ||
| position | int | 0 | 生成消息中的字段位置 - 在 FIX 消息中的 key/tag 的位置必须不同时使用 | |
| 精度 | int | 0 | 要创建的 BigDecimal 数量的精度 | |
| required | 布尔值 | false | 指明字段是否强制 | |
| timezone | 字符串 | 要使用的时区。 |
问题单 1:标签
此参数代表消息中的字段键:
FIX message - Tag
@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1) // Client reference
private String Account;
@KeyValuePairField(tag = 11) // Order reference
private String ClOrdId;
@KeyValuePairField(tag = 22) // Fund ID type (Sedol, ISIN, ...)
private String IDSource;
@KeyValuePairField(tag = 48) // Fund code
private String SecurityId;
@KeyValuePairField(tag = 54) // Movement type ( 1 = Buy, 2 = sell)
private String Side;
@KeyValuePairField(tag = 58) // Free text
private String Text;
}问题单 2:输出中的不同位置
如果我们将放入 FIX 消息中的 tags/keys 根据预定义的顺序进行排序,则使用注释 @KeyValuePairField 的属性 位置。
FIX message - Tag - sort
@Message(keyValuePairSeparator = "=", pairSeparator = "\\u0001", type = "FIX", version = "4.1", isOrdered = true)
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1, position = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11, position = 3) // Order reference
private String clOrdId;
}57.2.7. 7.节
在修复固定长度记录的消息中,在信息 : header、body 和 部分表示中,通常有不同的部分。注释 @Section 的目的是通知模型的绑定表示标头(= 第 1 节)、正文(= 部分 2)和页脚(= 第 3 节)
此注释仅存在一个属性/参数。
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| 节 | 修复 | 类 |
| 参数名称 | 类型 | 必填 | 默认值 | info |
|---|---|---|---|---|
| number | int | ✓ | 部分的数量 |
问题单 1:部分
标头部分的定义:
FIX message - Section - Header
@Section(number = 1)
public class Header {
@KeyValuePairField(tag = 8, position = 1) // Message Header
private String beginString;
@KeyValuePairField(tag = 9, position = 2) // Checksum
private int bodyLength;
}body 部分的定义:
FIX message - Section - Body
@Section(number = 2)
@Message(keyValuePairSeparator = "=", pairSeparator = "\\u0001", type = "FIX", version = "4.1", isOrdered = true)
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1, position = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11, position = 3) // Order reference
private String clOrdId;footer 部分的定义:
FIX message - Section - Footer
@Section(number = 3)
public class Trailer {
@KeyValuePairField(tag = 10, position = 1)
// CheckSum
private int checkSum;
public int getCheckSum() {
return checkSum;
}57.2.8. 8.OneToMany
注释 @OneToMany 的目的是允许使用 List<?> 字段来定义 POJO 类,或者从包含重复组的记录。
OneToMany
的限制要小心,很多绑定都不允许处理在几个层次结构级别上定义的重复请求。
在以下情况下,关系 oneToMany ONLY WORKS:
- 读取包含重复组(= 标签/密钥组)的 FIX 消息。
- 使用重复数据生成 CSV
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| OneToMany | all | 属性 |
| 参数名称 | 类型 | 必填 | 默认值 | info |
|---|---|---|---|---|
| mappedTo | 字符串 | 与 Class> 的 List<Type 类型关联的类名称 |
问题单 1:使用重复数据生成 CSV
以下是我们想要的 CSV 输出:
Claus,Ibsen,Camel in Action 1,2010,35 Claus,Ibsen,Camel in Action 2,2012,35 Claus,Ibsen,Camel in Action 3,2013,35 Claus,Ibsen,Camel in Action 4,2014,35
在首次、姓氏和年龄时,重复数据涉及书的标题及其发布日期是常见,用于建模的类。Author 类包含 Book 的列表。
使用重复数据生成 CSV
@CsvRecord(separator=",")
public class Author {
@DataField(pos = 1)
private String firstName;
@DataField(pos = 2)
private String lastName;
@OneToMany
private List<Book> books;
@DataField(pos = 5)
private String Age;
}
public class Book {
@DataField(pos = 3)
private String title;
@DataField(pos = 4)
private String year;
}问题单 2:阅读包含标签/密钥组的消息
以下是要在我们模型中处理的消息:
8=FIX 4.19=2034=135=049=INVMGR56=BRKR 1=BE.CHM.00111=CHM0001-0158=this is a camel - bindy test 22=448=BE000124567854=1 22=548=BE000987654354=2 22=648=BE000999999954=3 10=220
标签 22、48 和 54 会重复。
和代码:
读取包含 tags/keys 组的 FIX 消息
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11) // Order reference
private String clOrdId;
@KeyValuePairField(tag = 58) // Free text
private String text;
@OneToMany(mappedTo = "org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Security")
List<Security> securities;
}
public class Security {
@KeyValuePairField(tag = 22) // Fund ID type (Sedol, ISIN, ...)
private String idSource;
@KeyValuePairField(tag = 48) // Fund code
private String securityCode;
@KeyValuePairField(tag = 54) // Movement type ( 1 = Buy, 2 = sell)
private String side;
}57.2.9. 9.BindyConverter
注释 @BindyConverter 的目的是定义一个用于字段级别的转换器。提供的类必须实施 Format 接口。
@FixedLengthRecord(length = 10, paddingChar = ' ')
public static class DataModel {
@DataField(pos = 1, length = 10, trim = true)
@BindyConverter(CustomConverter.class)
public String field1;
}
public static class CustomConverter implements Format<String> {
@Override
public String format(String object) throws Exception {
return (new StringBuilder(object)).reverse().toString();
}
@Override
public String parse(String string) throws Exception {
return (new StringBuilder(string)).reverse().toString();
}
}57.2.10. 10.FormatFactories
注释 @FormatFactories 的目的是在记录级别定义一组转换器。提供的类必须实施 FormatFactoryInterface 接口。
@CsvRecord(separator = ",")
@FormatFactories({OrderNumberFormatFactory.class})
public static class Order {
@DataField(pos = 1)
private OrderNumber orderNr;
@DataField(pos = 2)
private String firstName;
}
public static class OrderNumber {
private int orderNr;
public static OrderNumber ofString(String orderNumber) {
OrderNumber result = new OrderNumber();
result.orderNr = Integer.valueOf(orderNumber);
return result;
}
}
public static class OrderNumberFormatFactory extends AbstractFormatFactory {
{
supportedClasses.add(OrderNumber.class);
}
@Override
public Format<?> build(FormattingOptions formattingOptions) {
return new Format<OrderNumber>() {
@Override
public String format(OrderNumber object) throws Exception {
return String.valueOf(object.orderNr);
}
@Override
public OrderNumber parse(String string) throws Exception {
return OrderNumber.ofString(string);
}
};
}
}57.3. 支持的数据类型
DefaultFormatFactory 通过根据提供的 FormattingOptions 返回接口 FormatFactoryInterface 的实例来提供以下 datatype 格式化:
- BigDecimal
- BigInteger
- 布尔值
- byte
- 字符
- Date
- 双
- Enums
- 浮点值
- 整数
- LocalDate
- LocalDateTime
- LocalTime
- Long
- short
- 字符串
DefaultFormatFactory 可以通过在 registry 中使用(如 Spring 或 JNDI)中提供 FactoryRegistry 实例来覆盖。
57.4. 使用 Java DSL
下一步实例化与此记录类型关联的 DataFormat bindy 类,并提供类作为参数。
例如,以下命令使用类 BindyCsvDataFormat (对应于与 CSV 记录类型关联的类),该类配置了 com.acme.model.MyModel.class 来初始化在此软件包中配置的模型对象。
DataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);
57.4.1. 设置区域设置
Bindy 支持在 dataformat 上配置区域设置,如
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);
bindy.setLocale("us");或者使用平台默认区域设置,然后使用"default"作为区域设置的名称。
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);
bindy.setLocale("default");57.4.2. unmarshaling
from("file://inbox")
.unmarshal(bindy)
.to("direct:handleOrders");另外,您可以使用对数据格式的命名引用,然后可以在 Registry 中定义,例如您的 Spring XML 文件:
from("file://inbox")
.unmarshal("myBindyDataFormat")
.to("direct:handleOrders");
Camel 路由将获取 inbox 目录中的文件,unmarshall CSV 记录为模型对象的集合,并将集合
发送到由 handleOrders 引用的路由。
返回的集合是 Map 对象列表。列表中的每一映射都包含在 CSV 每行中模糊的模型对象。其背后的原因是 每行可以与多个对象对应。当您只期望每行返回一个对象时,这可能会造成混淆。
每个对象都可以使用其类名称来检索。
List<Map<String, Object>> unmarshaledModels = (List<Map<String, Object>>) exchange.getIn().getBody();
int modelCount = 0;
for (Map<String, Object> model : unmarshaledModels) {
for (String className : model.keySet()) {
Object obj = model.get(className);
LOG.info("Count : " + modelCount + ", " + obj.toString());
}
modelCount++;
}
LOG.info("Total CSV records received by the csv bean : " + modelCount);假设您要从此映射中提取单个 Order 对象以在路由中处理,您可以使用 Splitter 和一个 Processor 的组合,如下所示:
from("file://inbox")
.unmarshal(bindy)
.split(body())
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
Message in = exchange.getIn();
Map<String, Object> modelMap = (Map<String, Object>) in.getBody();
in.setBody(modelMap.get(Order.class.getCanonicalName()));
}
})
.to("direct:handleSingleOrder")
.end();请注意,Bindy 使用 CHARSET_NAME 属性或 CHARSET_NAME 标头,如 Exchange 界面中所定义,为 unmarshalling 接收输入流的字符转换。在一些制作者(如 file-endpoint)中,您可以定义一个 characterset。字符集转换过程可能已经由此制作者完成。有时,您需要从交换中删除此属性或标头,然后再将其发送到 unmarshal。如果您没有删除它,则转换可能会进行两次,这可能会导致不必要的结果。
from("file://inbox?charset=Cp922")
.removeProperty(Exchange.CHARSET_NAME)
.unmarshal("myBindyDataFormat")
.to("direct:handleOrders");57.4.3. marshaling
要从模型对象集合生成 CSV 记录,您需要创建以下路由:
from("direct:handleOrders")
.marshal(bindy)
.to("file://outbox")57.5. 使用 Spring XML
这非常容易使用 Spring 作为您首选的 DSL 语言,以声明用于 camel-bindy 的路由。以下示例显示了两个路由,其中第一个将从文件中选取记录,解封内容并将其绑定到模型。然后,结果是发送到 pojo (什么什么特别),并将它们放入队列中。
第二个路由将从队列中提取 pojos,并生成包含 CSV 记录的文件。
Spring DSL
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- Queuing engine - ActiveMq - work locally in mode virtual memory -->
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL" value="vm://localhost:61616"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<dataFormats>
<bindy id="bindyDataformat" type="Csv" classType="org.apache.camel.bindy.model.Order"/>
</dataFormats>
<route>
<from uri="file://src/data/csv/?noop=true" />
<unmarshal ref="bindyDataformat" />
<to uri="bean:csv" />
<to uri="activemq:queue:in" />
</route>
<route>
<from uri="activemq:queue:in" />
<marshal ref="bindyDataformat" />
<to uri="file://src/data/csv/out/" />
</route>
</camelContext>
</beans>
请验证您的模型类是否可实施序列化,否则队列管理器将引发错误。
57.6. 依赖项
要在 camel 路由中使用 Bindy,您需要添加依赖 camel-bindy 来实现此数据格式。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-bindy</artifactId>
<version>{CamelSBVersion}</version>
</dependency>57.7. Spring Boot Auto-Configuration
当将 bindy-csv 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-bindy-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 18 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.bindy-csv.allow-empty-stream | 是否在 unmarshal 进程中允许空流。如果为 true,则在提供不带记录的正文时不会抛出异常。 | false | 布尔值 |
| camel.dataformat.bindy-csv.class-type | 要使用的模型类的名称。 | 字符串 | |
| camel.dataformat.bindy-csv.enabled | 是否启用 bindy-csv 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.bindy-csv.locale | 要将默认区域设置配置为使用,例如 us 为单元状态。要使用 JVM 平台默认区域设置,请使用名称 default。 | 字符串 | |
| camel.dataformat.bindy-csv.type | 是否使用 Csv、修复或 KeyValue。 | 字符串 | |
| camel.dataformat.bindy-csv.unwrap-single-instance | 当 unmarshalling 应该一个实例被解封并返回,而不是嵌套在 java.util.List 中。 | true | 布尔值 |
| camel.dataformat.bindy-fixed.allow-empty-stream | 是否在 unmarshal 进程中允许空流。如果为 true,则在提供不带记录的正文时不会抛出异常。 | false | 布尔值 |
| camel.dataformat.bindy-fixed.class-type | 要使用的模型类的名称。 | 字符串 | |
| camel.dataformat.bindy-fixed.enabled | 是否启用绑定修复数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.bindy-fixed.locale | 要将默认区域设置配置为使用,例如 us 为单元状态。要使用 JVM 平台默认区域设置,请使用名称 default。 | 字符串 | |
| camel.dataformat.bindy-fixed.type | 是否使用 Csv、修复或 KeyValue。 | 字符串 | |
| camel.dataformat.bindy-fixed.unwrap-single-instance | 当 unmarshalling 应该一个实例被解封并返回,而不是嵌套在 java.util.List 中。 | true | 布尔值 |
| camel.dataformat.bindy-kvp.allow-empty-stream | 是否在 unmarshal 进程中允许空流。如果为 true,则在提供不带记录的正文时不会抛出异常。 | false | 布尔值 |
| camel.dataformat.bindy-kvp.class-type | 要使用的模型类的名称。 | 字符串 | |
| camel.dataformat.bindy-kvp.enabled | 是否启用 bindy-kvp 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.bindy-kvp.locale | 要将默认区域设置配置为使用,例如 us 为单元状态。要使用 JVM 平台默认区域设置,请使用名称 default。 | 字符串 | |
| camel.dataformat.bindy-kvp.type | 是否使用 Csv、修复或 KeyValue。 | 字符串 | |
| camel.dataformat.bindy-kvp.unwrap-single-instance | 当 unmarshalling 应该一个实例被解封并返回,而不是嵌套在 java.util.List 中。 | true | 布尔值 |
第 58 章 HL7
HL7 组件用于使用 HAPI 库 来处理 HL7 MLLP 协议和 HL7 v2 消息。
这个组件支持以下组件:
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-hl7</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>58.1. HL7 MLLP 协议
HL7 通常与 HL7 MLLP 协议一起使用,该协议是基于文本的基于 TCP 套接字的协议。此组件附带了 Mina 和 Netty Codec,它符合 MLLP 协议,以便您可以轻松地通过 TCP 传输层公开 HL7 侦听器。要公开 HL7 侦听器服务,camel-mina 或 link:camel-netty 组件与 HL7MLLPCodec (mina)或 HL7MLLPNettyDecoder/HL7MLLPNettyEncoder (Netty)一起使用。
HL7 MLLP codec 可以配置如下:
| 名称 | 默认值 | 描述 |
|---|---|---|
|
|
| 跨越 HL7 有效负载的开始字节。 |
|
|
| 跨越 HL7 有效负载的第一个最终字节。 |
|
|
| 跨越 HL7 有效负载的第二端字节。 |
|
| JVM 默认值 | 用于 codec 的编码( charset name)。如果没有提供,Camel 将使用 JVM 默认Charset。 |
|
|
| 如果为 true,则 codec 使用定义的 charset 创建一个字符串。如果为 false,则 codec 将纯文本数组发送到路由,以便 HL7 数据格式可以确定 HL7 消息内容的实际字符集。 |
|
|
|
会将 |
58.1.1. 使用 Mina 公开 HL7 侦听器
在 Spring XML 文件中,我们配置 mina 端点,以使用端口 8888 上的 TCP 侦听 HL7 请求:
<endpoint id="hl7MinaListener" uri="mina:tcp://localhost:8888?sync=true&codec=#hl7codec"/>
sync=true 表示此监听程序是同步的,因此会将 HL7 响应返回给调用者。HL7 codec 使用 codec=#hl7codec 设置。请注意,hl7codec 只是一个 Spring bean ID,因此可以命名为 mygreatcodecforhl7 或任何内容。codec 也在 Spring XML 文件中设置:
<bean id="hl7codec" class="org.apache.camel.component.hl7.HL7MLLPCodec">
<property name="charset" value="iso-8859-1"/>
</bean>然后,端点 hl7MinaLlistener 可以在作为消费者的路由中使用,因为此 Java DSL 示例演示了:
from("hl7MinaListener")
.bean("patientLookupService");这是一个非常简单的路由,它将侦听 HL7 并将其路由到名为 patient LookupService 的服务。这也是 Spring XML 中的 Spring bean ID,如下所示:
<bean id="patientLookupService" class="com.mycompany.healthcare.service.PatientLookupService"/>
业务逻辑可以在不依赖于 Camel 的 POJO 类中实施,如下所示:
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.model.v24.segment.QRD;
public class PatientLookupService {
public Message lookupPatient(Message input) throws HL7Exception {
QRD qrd = (QRD)input.get("QRD");
String patientId = qrd.getWhoSubjectFilter(0).getIDNumber().getValue();
// find patient data based on the patient id and create a HL7 model object with the response
Message response = ... create and set response data
return response
}58.1.2. 使用 Netty 公开 HL7 侦听器(可从 Camel 2.15 开始提供)
在 Spring XML 文件中,我们配置 netty 端点,以使用端口 8888 上的 TCP 侦听 HL7 请求:
<endpoint id="hl7NettyListener" uri="netty:tcp://localhost:8888?sync=true&encoders=#hl7encoder&decoders=#hl7decoder"/>
sync=true 表示此监听程序是同步的,因此会将 HL7 响应返回给调用者。HL7 codec 是带有 encoders=#hl7encoder*and*decoders=#hl7decoder 的设置。请注意,hl7encoder 和 hl7 解码器 只是 bean ID,因此它们可能会以不同的方式被命名。Bean 可以在 Spring XML 文件中设置:
<bean id="hl7decoder" class="org.apache.camel.component.hl7.HL7MLLPNettyDecoderFactory"/> <bean id="hl7encoder" class="org.apache.camel.component.hl7.HL7MLLPNettyEncoderFactory"/>
然后,端点 hl7NettyListener 可以在作为消费者的路由中使用,因为此 Java DSL 示例演示了:
from("hl7NettyListener")
.bean("patientLookupService");58.2. 使用 java.lang.String 或 byte[] 的 HL7 Model
HL7 MLLP codec 使用普通字符串作为其数据格式。Camel 使用其 Type Converter 将字符串转换为 HAPI HL7 模型对象,但如果您愿意自行解析数据,您可以使用普通字符串对象。
您还可以通过将 generate String 属性设置为 false,使 Mina 和 Netty codecs 都使用 plain 字节[] 作为其数据格式。Type Converter 也可以将 byte[] 转换为/from HAPI HL7 模型对象。
58.3. 使用 HAPI 的 HL7v2 Model
HL7v2 模型使用 HAPI 库中的 Java 对象。使用此库,您可以对主要用于 HL7v2 的 EDI 格式(ER7)进行编码和解码。
以下示例是使用病人 ID 0101701234 查找医疗请求。
MSH|^~\\&|MYSENDER|MYRECEIVER|MYAPPLICATION||200612211200||QRY^A19|1234|P|2.4 QRD|200612211200|R|I|GetPatient|||1^RD|0101701234|DEM||
使用 HL7 模型,您可以操作 ca.uhn.hl7v2.model.Message 对象,例如检索病人 ID:
Message msg = exchange.getIn().getBody(Message.class);
QRD qrd = (QRD)msg.get("QRD");
String patientId = qrd.getWhoSubjectFilter(0).getIDNumber().getValue(); // 0101701234
这在与 HL7 侦听器结合使用时非常强大,因为您不必使用 byte[]、String 或任何其他简单对象格式。只能使用 HAPI HL7v2 模型对象。如果提前知道消息类型,您可以更多 type-safe :
QRY_A19 msg = exchange.getIn().getBody(QRY_A19.class); String patientId = msg.getQRD().getWhoSubjectFilter(0).getIDNumber().getValue();
58.4. HL7 DataFormat
camel-hl7 JAR 附带了 HL7 数据格式,可用于 marshal 或 unmarshal HL7 模型对象。
HL7 数据格式支持 1 选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| validate |
| 默认情况下,是否验证 HL7 消息为 true。 |
-
marshal= from Message to byte stream (可以使用 HL7 MLLP codec) -
unmarshal= 从字节流到消息(可以在从 HL7 MLLP 接收流数据时使用。
要使用数据格式,只需实例化一个实例并在路由构建器中调用 marshal 或 unmarshal 操作:
DataFormat hl7 = new HL7DataFormat();
from("direct:hl7in")
.marshal(hl7)
.to("jms:queue:hl7out");
在上例中,HL7 将从 HAPI Message 对象到字节流并放入 JMS 队列。
下一个示例相反:
DataFormat hl7 = new HL7DataFormat();
from("jms:queue:hl7out")
.unmarshal(hl7)
.to("patientLookupService");在这里,我们将字节流解成一个 HAPI Message 对象,后者将传递给我们的病人查找服务。
58.4.1. 片段分隔符
unmarshalling 无法通过将 \n 转换为 \r 来自动修复片段分隔符。如果
需要此转换,org.apache.camel.component.hl7.HL7#convertLFToCR 提供此目的的手动 表达式。
58.4.2. charset
marshal 和 unmarshal 均评估字段 MSH-18 中提供的字符集。如果此字段为空,则默认情况下,假定对应的 Camel charset 属性/header 中包含的 charset。在从 HL7DataFormat 类中继承时,您甚至可以通过覆盖 guessCharsetName 方法来更改此默认行为。
Camel 中适用于知名数据格式的简写语法,通常使用它们。然后,您不需要创建 HL7DataFormat 对象的实例:
from("direct:hl7in")
.marshal().hl7()
.to("jms:queue:hl7out");
from("jms:queue:hl7out")
.unmarshal().hl7()
.to("patientLookupService");58.5. 消息标头
unmarshal 操作会将 MSH 片段中的这些字段作为 Camel 信息上的标头添加:
| 键 | MSH 字段 | 示例 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| `` |
|
|
|
|
|
除 CamelHL7Context 外的所有标头 都是 字符串类型。如果缺少标头值,则其值为 null。
58.6. 依赖项
要在 Camel 路由中使用 HL7,您需要添加上述 camel-hl7 的依赖关系,它将实施此数据格式。
HAPI 库被分成一个基本库和几个结构 库,每个 HL7v2 消息版本对应一个:
默认情况下,camel-hl7 仅引用 HAPI 基础库。应用程序负责包括结构库本身。例如,如果应用程序与 HL7v2 消息版本 2.4 和 2.5 一起工作,则必须添加以下依赖项:
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v24</artifactId>
<version>2.2</version>
<!-- use the same version as your hapi-base version -->
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v25</artifactId>
<version>2.2</version>
<!-- use the same version as your hapi-base version -->
</dependency>或者,包含基本库的 OSGi 捆绑包,可以从 中央 Maven 存储库下载 所有结构库和所需依赖项(在捆绑类路径上)。
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-osgi-base</artifactId>
<version>2.2</version>
</dependency>58.7. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 hl7 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-hl7-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.hl7.enabled | 是否启用 hl7 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.hl7.validate | 默认情况下,是否验证 HL7 消息为 true。 | true | 布尔值 |
| camel.language.hl7terser.enabled | 是否启用 hl7terser 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.hl7terser.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
第 59 章 JacksonXML
jackson XML 是一个数据格式,它使用带有 XMLMapper 扩展的 Jackson 库来 将 XML 有效负载分离到 Java 对象或将 marshal Java 对象合并到 XML 有效负载中。注意:如果您熟悉 Jackson,则此 XML 数据格式的行为方式与其 JSON 对应部分相同,因此可用于注解 JSON 序列化/反序列化的类。
此扩展还模拟 JAXB 的"代码先行"方法。
这个数据格式依赖于 Woodstox (特别是对于用户友善打印等功能),它是一个快速高效的 XML 处理器。
from("activemq:My.Queue").
unmarshal().jacksonxml().
to("mqseries:Another.Queue");59.1. JacksonXML 选项
JacksonXML 数据格式支持 15 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| xmlMapper |
| 查找并使用具有给定 ID 的现有 XmlMapper。 | |
| prettyPrint | false |
| 支持格式良好的用户打印输出:默认为 false。 |
| unmarshalType |
| 在 unmarshalling 时使用的 java 类型的类名称。 | |
| jsonView |
| 将 POJO 打包到 JSON 时,您可能希望从 JSON 输出中排除某些字段。借助 Jackson,您可以使用 JSON 视图来完成此操作。此选项是引用具有 JsonView 注释的类。 | |
| Include |
| 如果您想将 pojo 链接到 JSON,而 pojo 则有一些字段具有 null 值。您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | |
| allowJmsType |
| 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。 | |
| collectionType |
| 指的是要在 registry 中使用的自定义集合类型。这个选项应该很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。 | |
| useList |
| 要取消组合到映射列表或 Pojo 的列表,请执行以下操作: | |
| enableJaxbAnnotationModule |
| 使用 jackson 时是否启用 JAXB 注释模块。启用后,Jackson 可以使用 JAXB 注释。 | |
| moduleClassNames |
| 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module,指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。 | |
| moduleRefs |
| 使用 Camel 注册表中提到的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | |
| enableFeatures |
| 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | |
| disableFeatures |
| Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | |
| allowUnmarshallType |
| 如果启用,则 Jackson 允许在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只在需要使用时才启用。 | |
| contentTypeHeader |
| 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 |
59.1.1. 在 Spring DSL 中使用 Jackson XML
在 Spring DSL 中使用数据格式时,您需要首先声明数据格式。这在 DataFormats XML tag 中完成。
<dataFormats>
<!-- here we define a Xml data format with the id jack and that it should use the TestPojo as the class type when
doing unmarshal. The unmarshalType is optional, if not provided Camel will use a Map as the type -->
<jacksonxml id="jack" unmarshalType="org.apache.camel.component.jacksonxml.TestPojo"/>
</dataFormats>然后您可以在路由中引用这个 id :
<route>
<from uri="direct:back"/>
<unmarshal><custom ref="jack"/></unmarshal>
<to uri="mock:reverse"/>
</route>59.1.2. 将 POJO 字段排除在 marshalling 中
当将 POJO 打包到 XML 时,您可能想从 XML 输出中排除某些字段。借助 Jackson,您可以使用 JSON 视图 来完成此操作。首先创建一个或多个标记类。
将标记类与 @JsonView 注释一起使用,以包含/排除某些字段。该注释也适用于 getters。
最后,使用 Camel JacksonXMLDataFormat 将上述 POJO 结合到 XML。
请注意,生成的 XML 中缺少 weight 字段:
<pojo age="30" weight="70"/>
59.2. 使用带有 'JacksonXML'DataFormat 的 jsonView 属性的 include/Exclude 字段
例如,您可以使用此属性而不是:
JacksonXMLDataFormat ageViewFormat = new JacksonXMLDataFormat(TestPojoView.class, Views.Age.class);
from("direct:inPojoAgeView").
marshal(ageViewFormat);直接将 Java DSL 中的 JSON 视图 指定为:
from("direct:inPojoAgeView").
marshal().jacksonxml(TestPojoView.class, Views.Age.class);在 XML DSL 中相同:
<from uri="direct:inPojoAgeView"/>
<marshal>
<jacksonxml unmarshalType="org.apache.camel.component.jacksonxml.TestPojoView" jsonView="org.apache.camel.component.jacksonxml.Views$Age"/>
</marshal>59.3. 设置序列化包括选项
如果您想将 pojo 链接到 XML,而 pojo 则有一些带有 null 值的字段。您想要跳过这些空值,然后您需要在 pojo 上设置注解。
@JsonInclude(Include.NON_NULL)
public class MyPojo {
...
}但这需要您在 pojo 源代码中包含该注解。您还可以配置 Camel JacksonXMLDataFormat 来设置 include 选项,如下所示:
JacksonXMLDataFormat format = new JacksonXMLDataFormat();
format.setInclude("NON_NULL");或来自您将其配置为的 XML DSL
<dataFormats>
<jacksonxml id="jacksonxml" include="NON_NULL"/>
</dataFormats>59.4. 使用动态类名称从 XML 总结到 POJO
如果您使用 jackson 将 jackson 取消marshal XML 到 POJO,那么您现在可以在消息中指定一个标头,指出哪个类名称为 unmarshal to。
如果消息中存在该标头,则标头有关键 CamelJacksonUnmarshalType,则 Jackson 将使用该标头作为 POJO 类的 FQN,以将 XML 有效负载分离为:
For JMS end users there is the JMSType header from the JMS spec that indicates that also. To enable support for JMSType you would need to turn that on, on the jackson data format as shown:
JacksonDataFormat format = new JacksonDataFormat(); format.setAllowJmsType(true);
或来自您将其配置为的 XML DSL
<dataFormats>
<jacksonxml id="jacksonxml" allowJmsType="true"/>
</dataFormats>59.5. unmarshalling from XML to List<Map> 或 List<pojo>
如果您使用 Jackson 将 Jackson 结合到映射/pojo 列表,您现在可以通过设置 useList="true" 或使用 org.apache.camel.component.jacksonxml.ListJacksonXMLDataFormat 来指定。例如,对于 Java,您可以如下所示:
JacksonXMLDataFormat format = new ListJacksonXMLDataFormat(); // or JacksonXMLDataFormat format = new JacksonXMLDataFormat(); format.useList(); // and you can specify the pojo class type also format.setUnmarshalType(MyPojo.class);
然后,如果您使用 XML DSL,则使用 useList 属性将列表配置为使用列表,如下所示:
<dataFormats>
<jacksonxml id="jack" useList="true"/>
</dataFormats>您也可以指定 pojo 类型
<dataFormats>
<jacksonxml id="jack" useList="true" unmarshalType="com.foo.MyPojo"/>
</dataFormats>59.6. 使用自定义 Jackson 模块
您可以使用 moduleClassNames 选项指定它们的类名称来使用自定义 Jackson 模块,如下所示。
<dataFormats>
<jacksonxml id="jack" useList="true" unmarshalType="com.foo.MyPojo" moduleClassNames="com.foo.MyModule,com.foo.MyOtherModule"/>
</dataFormats>当使用 moduleClassNames 时,不会配置自定义 jackson 模块,方法是使用默认构造器创建并使用 as-is。如果自定义模块需要任何自定义配置,则可以创建和配置模块实例,然后使用 modulesRefs 引用该模块,如下所示:
<bean id="myJacksonModule" class="com.foo.MyModule">
... // configure the module as you want
</bean>
<dataFormats>
<jacksonxml id="jacksonxml" useList="true" unmarshalType="com.foo.MyPojo" moduleRefs="myJacksonModule"/>
</dataFormats>Multiple modules can be specified separated by comma, such as moduleRefs="myJacksonModule,myOtherModule"
59.7. 使用 Jackson 启用或禁用功能
jackson 具有多个功能,您可以启用或禁用其 ObjectMapper 使用的功能。例如,要在 marshalling 时禁用对未知属性失败,您可以使用 disableFeatures 进行配置:
<dataFormats>
<jacksonxml id="jacksonxml" unmarshalType="com.foo.MyPojo" disableFeatures="FAIL_ON_UNKNOWN_PROPERTIES"/>
</dataFormats>您可以使用逗号分隔值来禁用多个功能。功能值必须是来自以下 enum 类的 Jackson 的 enums 名称
- com.fasterxml.jackson.databind.SerializationFeature
- com.fasterxml.jackson.databind.DeserializationFeature
- com.fasterxml.jackson.databind.MapperFeature
要启用功能,请使用 enableFeatures 选项。
在 Java 代码中,您可以使用 camel-jackson 模块中的类型安全方法:
JacksonDataFormat df = new JacksonDataFormat(MyPojo.class); df.disableFeature(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); df.disableFeature(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES);
59.8. 使用 Jackson 将映射转换为 POJO
jackson ObjectMapper 可用于将映射转换为 POJO 对象。jackson 组件附带数据转换器,可用于将 java.util.Map 实例转换为非字符串、非primitive 和 non-Number 对象。
Map<String, Object> invoiceData = new HashMap<String, Object>();
invoiceData.put("netValue", 500);
producerTemplate.sendBody("direct:mapToInvoice", invoiceData);
...
// Later in the processor
Invoice invoice = exchange.getIn().getBody(Invoice.class);
如果 Camel 注册表中有单个 ObjectMapper 实例,它将被转换程序用来执行转换。否则将使用默认映射程序。
59.9. 格式化的 XML marshalling (pretty-printing)
使用 prettyPrint 选项时,可以在 marshalling 时输出一个格式良好的 XML:
<dataFormats>
<jacksonxml id="jack" prettyPrint="true"/>
</dataFormats>在 Java DSL 中:
from("direct:inPretty").marshal().jacksonxml(true);
请注意,有 5 种不同的超载 jacksonxml () DSL 方法,它们支持 prettyPrint 选项和其他 unmarshalType、jsonView 等设置。
59.10. 依赖项
要在 camel 路由中使用 Jackson XML,您需要添加依赖 camel-jacksonxml 来实现此数据格式。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jacksonxml</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>59.11. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 jacksonxml 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jacksonxml-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 16 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.jacksonxml.allow-jms-type | 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。 | false | 布尔值 |
| camel.dataformat.jacksonxml.allow-unmarshall-type | 如果启用,则 Jackson 允许在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只在需要使用时才启用。 | false | 布尔值 |
| camel.dataformat.jacksonxml.collection-type | 指的是要在 registry 中使用的自定义集合类型。这个选项应该很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。 | 字符串 | |
| camel.dataformat.jacksonxml.content-type-header | 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | true | 布尔值 |
| camel.dataformat.jacksonxml.disable-features | Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | 字符串 | |
| camel.dataformat.jacksonxml.enable-features | 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | 字符串 | |
| camel.dataformat.jacksonxml.enable-jaxb-annotation-module | 使用 jackson 时是否启用 JAXB 注释模块。启用后,Jackson 可以使用 JAXB 注释。 | false | 布尔值 |
| camel.dataformat.jacksonxml.enabled | 是否启用 jacksonxml 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.jacksonxml.include | 如果您想将 pojo 链接到 JSON,而 pojo 则有一些字段具有 null 值。您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | 字符串 | |
| camel.dataformat.jacksonxml.json-view | 将 POJO 打包到 JSON 时,您可能希望从 JSON 输出中排除某些字段。借助 Jackson,您可以使用 JSON 视图来完成此操作。此选项是引用具有 JsonView 注释的类。 | 字符串 | |
| camel.dataformat.jacksonxml.module-class-names | 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module,指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。 | 字符串 | |
| camel.dataformat.jacksonxml.module-refs | 使用 Camel 注册表中提到的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | 字符串 | |
| camel.dataformat.jacksonxml.pretty-print | 支持格式良好的用户打印输出:默认为 false。 | false | 布尔值 |
| camel.dataformat.jacksonxml.unmarshal-type | 在 unmarshalling 时使用的 java 类型的类名称。 | 字符串 | |
| camel.dataformat.jacksonxml.use-list | 要取消组合到映射列表或 Pojo 的列表,请执行以下操作: | false | 布尔值 |
| camel.dataformat.jacksonxml.xml-mapper | 查找并使用具有给定 ID 的现有 XmlMapper。 | 字符串 |
第 60 章 JAXB
JAXB 是一个数据格式,它使用 JAXB2 XML marshalling 标准,该标准包含在 Java 6 中,将 XML 有效负载解放到 Java 对象或将 Java 对象嵌套到 XML 有效负载中。
60.1. 选项
JAXB 数据格式支持 19 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| contextPath |
| 您的 JAXB 类所在的 必需 软件包名称。 | |
| contextPathIsClassName |
| 这可设为 true,以标记 contextPath 引用一个 classname 而不是一个软件包名称。 | |
| schema |
| 针对现有架构进行验证。您可以使用前缀 classpath:、file: 或 http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个模式文件。 | |
| schemaSeverityLevel |
| 设置针对 schema 验证时使用的模式严重性级别。此级别决定了触发 JAXB 停止继续解析的最小严重性错误。默认值 0 (警告)表示任何错误(warning、error 或 fatal 错误)都会触发 JAXB 停止。有三个级别:0=warning, 1=error, 2=fatal error。 Enum 值:
| |
| prettyPrint |
| 支持格式良好的用户打印输出:默认为 false。 | |
| objectFactory |
| 是否允许使用 ObjectFactory 类在 marshalling 过程中创建 POJO 类。这只适用于没有向 JAXB 标注的 POJO 类,并提供 jaxb.index 描述符文件。 | |
| ignoreJAXBElement |
| 是否忽略 JAXBElement 元素 - 在非常特殊用例中,只需要设置为 false。 | |
| mustBeJAXBElement |
| marhsalling 都必须是具有 JAXB 标注的 java 对象。如果不是,则失败。这个选项可设为 false 以放宽,例如当数据已采用 XML 格式时。 | |
| filterNonXmlChars |
| 要忽略非 xml 费用,并将其替换为空空间。 | |
| encoding |
| 到 overrule 并使用特定的编码。 | |
| 片段 |
| 打开 marshalling XML 片段树。默认情况下,JAXB 会查找给定类上的 XmlRootElement 注释,以便在整个 XML 树上运行。这很有用,但有时生成的代码没有 XmlRootElement 注解,有时您需要 unmarshall 只属于树的一部分。在这种情况下,您可以使用部分 unmarshalling。要启用此行为,您需要设置属性 partClass。Camel 将这个类传递给 JAXB 的 unmarshaler。 | |
| partClass |
| 用于片段解析的类名称。请参阅片段选项的更多详情。 | |
| partNamespace |
| 用于片段解析的 XML 命名空间。请参阅片段选项的更多详情。 | |
| namespacePrefixRef |
| 当使用 JAXB 或 SOAP 时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。为了控制此映射,Camel 允许您引用包含所需映射的映射。 | |
| xmlStreamWriterWrapper |
| 使用自定义 xml 流写入器。 | |
| schemaLocation |
| 定义架构的位置。 | |
| noNamespaceSchemaLocation |
| 定义无命名空间模式的位置。 | |
| jaxbProviderProperties |
| 在包含自定义 JAXB 提供程序属性的注册表中,引用一个自定义 java.util.Map 进行查找,以用于 JAXB marshaller。 | |
| contentTypeHeader |
| 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 |
60.2. 使用 Java DSL
例如,以下命令使用名为 DataFormat of jaxb,它配置有多个 Java 软件包名称来初始化 JAXBContext。
DataFormat jaxb = new JaxbDataFormat("com.acme.model");
from("activemq:My.Queue").
unmarshal(jaxb).
to("mqseries:Another.Queue");如果您更喜欢使用指定引用数据格式,那么可以在 registry 中定义,例如通过 Spring XML 文件。
from("activemq:My.Queue").
unmarshal("myJaxbDataType").
to("mqseries:Another.Queue");60.3. 使用 Spring XML
以下示例演示了如何配置 JaxbDataFormat 并在多个路由中使用它。
<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">
<bean id="myJaxb" class="org.apache.camel.converter.jaxb.JaxbDataFormat">
<property name="contextPath" value="org.apache.camel.example"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start"/>
<marshal><custom ref="myJaxb"/></marshal>
<to uri="direct:marshalled"/>
</route>
<route>
<from uri="direct:marshalled"/>
<unmarshal><custom ref="myJaxb"/></unmarshal>
<to uri="mock:result"/>
</route>
</camelContext>
</beans>多个上下文路径
可以使用带有多个上下文路径的数据格式。您可以使用 : 作为分隔符来指定上下文路径,如 com.mycompany:com.mycompany2。请注意,这由 JAXB 实施处理,如果您使用与 RI 不同的供应商,可能会改变。
60.4. partial marshalling/unmarshalling
JAXB 2 支持 marshalling 和 unmarshalling XML 树片段。默认情况下,JAXB 会查找给定类上的 @XmlRootElement 注释,以便在整个 XML 树上运行。这很有用,但并不总是 - 有时生成的代码没有 @XmlRootElement 注释,有时您需要 unmarshall 只属于树的一部分。
在这种情况下,您可以使用部分 unmarshalling。要启用此行为,您需要设置属性 partClass。Camel 将这个类传递给 JAXB 的 unmarshaler。如果 JaxbConstants.JAXB_PART_CLASS 被设置为标头之一(即使 DataFormat 设置了 partClass 属性),则 DataFormat 的属性会被超过,并使用标头中设置的属性。
对于 marshalling,您必须使用目标命名空间的 QName 添加 partNamespace 属性。您可以找到的 Spring DSL 示例。
如果 JaxbConstants.JAXB_PART_NAMESPACE 被设置为标头之一(即使 DataFormat 设置了 partNamespace 属性),则 DataFormat 的属性会被超过,并使用标头中设置的属性。虽然通过 JaxbConstants.JAXB_PART_NAMESPACE 设置 partNamespace 时,请注意您需要指定其值 \{[namespaceUri]}[localPart]
...
.setHeader(JaxbConstants.JAXB_PART_NAMESPACE, simple("{http://www.camel.apache.org/jaxb/example/address/1}address"));
...60.5. 片段
JaxbDataFormat 具有新的属性片段,可在 JAXB Marshaller 上设置 Marshaller.JAXB_FRAGMENT 编码属性。如果您不希望 JAXB Marshaller 生成 XML 声明,您可以将这个选项设置为 true。这个属性的默认值为 false。
60.6. 忽略非 XML Character
JaxbDataFormat 支持忽略 NonXML Character,您只需将 filterNonXmlChars 属性设置为 true,JxbDataFormat 将 NonXML 字符替换为 " (当其为 marshaling 或 unmarshaling 时)。您还可以通过设置 Exchange 属性 Exchange.FILTER_NON_XML_CHARS 来达到此目的。
| JDK 1.5 | JDK 1.6+ | |
|---|---|---|
| 使用过滤 | stax API 和实现 | 否 |
| 不使用过滤 | 仅限 stax API | 否 |
此功能已使用 Woodstox 3.2.9 和 Sun JDK 1.6 StAX 实现进行测试。
JaxbDataFormat 现在允许您自定义流到 XML 的 XMLStreamWriter。使用这个配置,您可以添加自己的流写入器来完全删除、转义或替换非xml 字符。
JaxbDataFormat customWriterFormat = new JaxbDataFormat("org.apache.camel.foo.bar");
customWriterFormat.setXmlStreamWriterWrapper(new TestXmlStreamWriter());以下示例显示了使用 Spring DSL 并同时启用 Camel 的 NonXML 过滤:
<bean id="testXmlStreamWriterWrapper" class="org.apache.camel.jaxb.TestXmlStreamWriter"/> <jaxb filterNonXmlChars="true" contextPath="org.apache.camel.foo.bar" xmlStreamWriterWrapper="#testXmlStreamWriterWrapper" />
60.7. 使用 ObjectFactory
如果使用 XJC 从 schema 创建 java 类,您将获得 JAXB 上下文的 ObjectFactory。由于 ObjectFactory 使用 JAXBElement 来存放 schema 和 element 实例值的引用,jaxbDataformat 默认会忽略 JAXBElement,并获取元素实例值而不是 JAXBElement 对象形成 unmarshaled 消息正文。
如果要获取 JAXBElement 对象形成 unmarshaled 消息正文,您需要将 JaxbDataFormat 对象的 ignoreJAXBElement 属性设置为 false。
60.8. 设置编码
您可以将 编码 选项设置为在 marshalling 时使用。其 Marshaller.JAXB_ENCODING 编码属性位于 JAXB Marshaller。
您可以在声明 JAXB 数据格式时设置要使用的编码。您也可以在 Exchange 属性 Exchange.CHARSET_NAME 中提供编码。此属性将对 JAXB 数据格式设置的编码进行规则。
在此 Spring DSL 中,我们定义为使用 iso-8859-1 作为编码。
60.9. 控制命名空间前缀映射
当使用 JAXB 或 SOAP 时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。为了控制此映射,Camel 允许您引用包含所需映射的映射。
请注意,这需要在类路径上具有 JAXB-RI 2.1 或更好(来自 SUN),因为映射功能取决于 JAXB 的实施,无论是支持。
例如,在 Spring XML 中,我们可以通过映射来定义映射。在下面的映射文件中,我们将 SOAP 映射到使用 soap 作为前缀。虽然我们的自定义命名空间 "http://www.mycompany.com/foo/2" 没有使用任何前缀。
<util:map id="myMap">
<entry key="http://www.w3.org/2003/05/soap-envelope" value="soap"/>
<!-- we dont want any prefix for our namespace -->
<entry key="http://www.mycompany.com/foo/2" value=""/>
</util:map>
要在 JAXB 或 SOAP 中使用它,您可以使用 namespacePrefixRef 属性来引用此映射,如下所示。然后,Camel 将在注册表中查找 java.util.Map,其 ID 为"myMap",这是上面定义的内容。
<marshal>
<soapjaxb version="1.2" contextPath="com.mycompany.foo" namespacePrefixRef="myMap"/>
</marshal>60.10. 模式验证
JAXB 数据格式通过 marshalling 和 unmarshalling from/to XML 来支持验证。您可以使用前缀 classpath:、file: 或 http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个模式文件。
使用 Java DSL,您可以使用以下方法进行配置:
JaxbDataFormat jaxbDataFormat = new JaxbDataFormat();
jaxbDataFormat.setContextPath(Person.class.getPackage().getName());
jaxbDataFormat.setSchema("classpath:person.xsd,classpath:address.xsd");您可以使用 XML DSL 执行相同的操作:
<marshal>
<jaxb id="jaxb" schema="classpath:person.xsd,classpath:address.xsd"/>
</marshal>
Camel 将即时创建和池 underling SchemaFactory 实例,因为 JDK 提供的 SchemaFactory 不安全。
但是,如果您有一个是线程的 SchemaFactory 实施,您可以将 JAXB 数据格式配置为使用此格式:
JaxbDataFormat jaxbDataFormat = new JaxbDataFormat(); jaxbDataFormat.setSchemaFactory(thradSafeSchemaFactory);
60.11. 模式位置
JAXB 数据格式支持在处理 XML 时指定 SchemaLocation。
使用 Java DSL,您可以使用以下方法进行配置:
JaxbDataFormat jaxbDataFormat = new JaxbDataFormat();
jaxbDataFormat.setContextPath(Person.class.getPackage().getName());
jaxbDataFormat.setSchemaLocation("schema/person.xsd");您可以使用 XML DSL 执行相同的操作:
<marshal>
<jaxb id="jaxb" schemaLocation="schema/person.xsd"/>
</marshal>60.12. marshal 数据,它们已经是 XML
JAXB marshaller 要求消息正文与 JAXB 兼容,例如其 JAXBElement,例如具有 JAXB 注释或扩展 JAXBElement 的 java 实例。有些情况下,邮件正文已在 XML 中,例如来自 String 类型。
有一个新的选项 mustBeJAXBElement,您可以设置为 false,要放松此检查,因此 JAXB marshaller 仅尝试 marshal JAXBElements (javax.xml.bind.JAXBIntrospector#isElement 返回 true)。在这些情况下,marshaller 回退到将消息正文命名为-is。
60.13. 依赖项
要在 camel 路由中使用 JAXB,您需要添加依赖 camel-jaxb 来实现此数据格式。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jaxb</artifactId>
<version>{CamelSBVersion}</version>
</dependency>60.14. Spring Boot Auto-Configuration
当将 jaxb 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jaxb-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 20 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.jaxb.content-type-header | 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | true | 布尔值 |
| camel.dataformat.jaxb.context-path | JAXB 类所在的软件包名称。 | 字符串 | |
| camel.dataformat.jaxb.context-path-is-class-name | 这可设为 true,以标记 contextPath 引用一个 classname 而不是一个软件包名称。 | false | 布尔值 |
| camel.dataformat.jaxb.enabled | 是否启用 jaxb 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.jaxb.encoding | 到 overrule 并使用特定的编码。 | 字符串 | |
| camel.dataformat.jaxb.filter-non-xml-chars | 要忽略非 xml 费用,并将其替换为空空间。 | false | 布尔值 |
| camel.dataformat.jaxb.fragment | 打开 marshalling XML 片段树。默认情况下,JAXB 会查找给定类上的 XmlRootElement 注释,以便在整个 XML 树上运行。这很有用,但有时生成的代码没有 XmlRootElement 注解,有时您需要 unmarshall 只属于树的一部分。在这种情况下,您可以使用部分 unmarshalling。要启用此行为,您需要设置属性 partClass。Camel 将这个类传递给 JAXB 的 unmarshaler。 | false | 布尔值 |
| camel.dataformat.jaxb.ignore-j-a-x-b-element | 是否忽略 JAXBElement 元素 - 在非常特殊用例中,只需要设置为 false。 | false | 布尔值 |
| camel.dataformat.jaxb.jaxb-provider-properties | 在包含自定义 JAXB 提供程序属性的注册表中,引用一个自定义 java.util.Map 进行查找,以用于 JAXB marshaller。 | 字符串 | |
| camel.dataformat.jaxb.must-be-j-a-x-b-element | marhsalling 都必须是具有 JAXB 标注的 java 对象。如果不是,则失败。这个选项可设为 false 以放宽,例如当数据已采用 XML 格式时。 | false | 布尔值 |
| camel.dataformat.jaxb.namespace-prefix-ref | 当使用 JAXB 或 SOAP 时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。为了控制此映射,Camel 允许您引用包含所需映射的映射。 | 字符串 | |
| camel.dataformat.jaxb.no-namespace-schema-location | 定义无命名空间模式的位置。 | 字符串 | |
| camel.dataformat.jaxb.object-factory | 是否允许使用 ObjectFactory 类在 marshalling 过程中创建 POJO 类。这只适用于没有向 JAXB 标注的 POJO 类,并提供 jaxb.index 描述符文件。 | false | 布尔值 |
| camel.dataformat.jaxb.part-class | 用于片段解析的类名称。请参阅片段选项的更多详情。 | 字符串 | |
| camel.dataformat.jaxb.part-namespace | 用于片段解析的 XML 命名空间。请参阅片段选项的更多详情。 | 字符串 | |
| camel.dataformat.jaxb.pretty-print | 支持格式良好的用户打印输出:默认为 false。 | false | 布尔值 |
| camel.dataformat.jaxb.schema | 针对现有架构进行验证。您可以使用前缀 classpath:、file: 或 http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个模式文件。 | 字符串 | |
| camel.dataformat.jaxb.schema-location | 定义架构的位置。 | 字符串 | |
| camel.dataformat.jaxb.schema-severity-level | 设置针对 schema 验证时使用的模式严重性级别。此级别决定了触发 JAXB 停止继续解析的最小严重性错误。默认值 0 (警告)表示任何错误(warning、error 或 fatal 错误)都会触发 JAXB 停止。有三个级别:0=warning, 1=error, 2=fatal error。 | 0 | 整数 |
| camel.dataformat.jaxb.xml-stream-writer-wrapper | 使用自定义 xml 流写入器。 | 字符串 |
第 61 章 JSON Gson
gson 是使用 Gson 库 的数据格式。
from("activemq:My.Queue").
marshal().json(JsonLibrary.Gson).
to("mqseries:Another.Queue");61.1. gson 选项
JSON Gson 数据格式支持 3 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| prettyPrint |
| 支持格式良好的用户打印输出:默认为 false。 | |
| unmarshalType |
| 在 unmarshalling 时使用的 java 类型的类名称。 | |
| contentTypeHeader |
| 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 |
61.2. 依赖项
要在 camel 路由中使用 Gson,您需要添加实施此数据格式的 camel-gson 的依赖关系。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-gson</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>61.3. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 json-gson 时,请确保使用以下 Maven 依赖项支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-gson-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 4 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.json-gson.content-type-header | 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | true | 布尔值 |
| camel.dataformat.json-gson.enabled | 是否启用 json-gson 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.json-gson.pretty-print | 支持格式良好的用户打印输出:默认为 false。 | false | 布尔值 |
| camel.dataformat.json-gson.unmarshal-type | 在 unmarshalling 时使用的 java 类型的类名称。 | 字符串 |
第 62 章 JSON Jackson
jackson 是一个数据格式,它使用 Jackson 库
from("activemq:My.Queue").
marshal().json(JsonLibrary.Jackson).
to("mqseries:Another.Queue");62.1. jackson 选项
JSON Jackson 数据格式支持 20 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| objectMapper |
| 使用 Jackson 时查找并使用现有的 ObjectMapper 和给定 ID。 | |
| useDefaultObjectMapper |
| 是否从注册表查找和使用默认 Jackson ObjectMapper。 | |
| prettyPrint |
| 支持格式良好的用户打印输出:默认为 false。 | |
| unmarshalType |
| 在 unmarshalling 时使用的 java 类型的类名称。 | |
| jsonView |
| 将 POJO 打包到 JSON 时,您可能希望从 JSON 输出中排除某些字段。借助 Jackson,您可以使用 JSON 视图来完成此操作。此选项是引用具有 JsonView 注释的类。 | |
| Include |
| 如果您想将 pojo 链接到 JSON,而 pojo 则有一些字段具有 null 值。您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | |
| allowJmsType |
| 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。 | |
| collectionType |
| 指的是要在 registry 中使用的自定义集合类型。这个选项应该很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。 | |
| useList |
| 要取消组合到映射列表或 Pojo 的列表,请执行以下操作: | |
| moduleClassNames |
| 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module,指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。 | |
| moduleRefs |
| 使用 Camel 注册表中提到的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | |
| enableFeatures |
| 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | |
| disableFeatures |
| Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | |
| allowUnmarshallType |
| 如果启用,则 Jackson 允许在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只在需要使用时才启用。 | |
| timezone |
| 如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项不会影响其他 Json DataFormat,如 gson、fastjson 和 xstream。 | |
| autoDiscoverObjectMapper |
| 如果设置为 true,则 Jackson 将向 registry 中查找 objectMapper。 | |
| contentTypeHeader |
| 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | |
| schemaResolver |
| 用于查找传输中数据的模式解析器的可选模式。 | |
| autoDiscoverSchemaResolver |
| 如果不禁用,SchemaResolver 将进入 registry。 | |
| namingStrategy |
| 如果设置为 then,则 Jackson 将使用定义的 Property Naming Strategy.Possible 值: LOWER_CAMEL_CASE, LOWER_DOT_CASE, LOWER_CASE, KEBAB_CASE, SNAKE_CASE 和 UPPER_CAMEL_CASE. |
62.2. 使用自定义 ObjectMapper
您可以将 JacksonDataFormat 配置为在需要更多控制映射配置时使用自定义 ObjectMapper。
如果在注册表中设置单个 ObjectMapper,则 Camel 将自动查找并使用此 ObjectMapper。例如,如果您使用 Spring Boot,如果启用了 Spring MVC,则 Spring Boot 可以为提供默认的 ObjectMapper。这将允许 Camel 检测 Spring Boot bean registry 中是否有一种 ObjectMapper 类类型,然后使用它。当发生这种情况时,您应该从 Camel 设置 INFO 日志记录。
62.3. 使用 Jackson 进行自动类型转换
camel-jackson 模块允许将 Jackson 集成为 类型 Converter。这在与 Camel 类型转换器集成的 JAXB 类似。
要使用此 camel-jackson,这通过在 CamelContext 全局选项中设置以下选项来完成,如下所示:
@Bean
CamelContextConfiguration contextConfiguration() {
return new CamelContextConfiguration() {
@Override
public void beforeApplicationStart(CamelContext context) {
// Enable Jackson JSON type converter.
context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true");
// Allow Jackson JSON to convert to pojo types also
// (by default Jackson only converts to String and other simple types)
getContext().getGlobalOptions().put(JacksonConstants.TYPE_CONVERTER_TO_POJO, "true");
}
@Override
public void afterApplicationStart(CamelContext camelContext) {
}
};
}
camel-jackson 类型转换器与 JAXB 集成,这意味着您可以使用的 JAXB 注释为 POJO 类添加注解。您还可以在 POJO 类中使用 Jackson 自己的注解。
62.4. 依赖项
要在 camel 路由中使用 Jackson,您需要添加实施此数据格式的 camel-jackson 的依赖关系。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>62.5. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 json-jackson 时,请确保使用以下 Maven 依赖项支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jackson-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 21 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.json-jackson.allow-jms-type | 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。 | false | 布尔值 |
| camel.dataformat.json-jackson.allow-unmarshall-type | 如果启用,则 Jackson 允许在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只在需要使用时才启用。 | false | 布尔值 |
| camel.dataformat.json-jackson.auto-discover-object-mapper | 如果设置为 true,则 Jackson 将向 registry 中查找 objectMapper。 | false | 布尔值 |
| camel.dataformat.json-jackson.auto-discover-schema-resolver | 如果不禁用,SchemaResolver 将进入 registry。 | true | 布尔值 |
| camel.dataformat.json-jackson.collection-type | 指的是要在 registry 中使用的自定义集合类型。这个选项应该很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。 | 字符串 | |
| camel.dataformat.json-jackson.content-type-header | 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | true | 布尔值 |
| camel.dataformat.json-jackson.disable-features | Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | 字符串 | |
| camel.dataformat.json-jackson.enable-features | 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | 字符串 | |
| camel.dataformat.json-jackson.enabled | 是否启用 json-jackson 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.json-jackson.include | 如果您想将 pojo 链接到 JSON,而 pojo 则有一些字段具有 null 值。您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | 字符串 | |
| camel.dataformat.json-jackson.json-view | 将 POJO 打包到 JSON 时,您可能希望从 JSON 输出中排除某些字段。借助 Jackson,您可以使用 JSON 视图来完成此操作。此选项是引用具有 JsonView 注释的类。 | 字符串 | |
| camel.dataformat.json-jackson.module-class-names | 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module,指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。 | 字符串 | |
| camel.dataformat.json-jackson.module-refs | 使用 Camel 注册表中提到的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | 字符串 | |
| camel.dataformat.json-jackson.naming-strategy | 如果设置为 then,则 Jackson 将使用定义的 Property Naming Strategy.Possible 值: LOWER_CAMEL_CASE, LOWER_DOT_CASE, LOWER_CASE, KEBAB_CASE, SNAKE_CASE 和 UPPER_CAMEL_CASE. | 字符串 | |
| camel.dataformat.json-jackson.object-mapper | 使用 Jackson 时查找并使用现有的 ObjectMapper 和给定 ID。 | 字符串 | |
| camel.dataformat.json-jackson.pretty-print | 支持格式良好的用户打印输出:默认为 false。 | false | 布尔值 |
| camel.dataformat.json-jackson.schema-resolver | 用于查找传输中数据的模式解析器的可选模式。 | 字符串 | |
| camel.dataformat.json-jackson.timezone | 如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项不会影响其他 Json DataFormat,如 gson、fastjson 和 xstream。 | 字符串 | |
| camel.dataformat.json-jackson.unmarshal-type | 在 unmarshalling 时使用的 java 类型的类名称。 | 字符串 | |
| camel.dataformat.json-jackson.use-default-object-mapper | 是否从注册表查找和使用默认 Jackson ObjectMapper。 | true | 布尔值 |
| camel.dataformat.json-jackson.use-list | 要取消组合到映射列表或 Pojo 的列表,请执行以下操作: | false | 布尔值 |
第 63 章 protobuf Jackson
jackson Protobuf 是一个数据格式,它使用带有 Protobuf 扩展的 Jackson 库 将 Protobuf 有效负载合并到 Java 对象或将 marshal Java 对象合并到 Protobuf 有效负载中。
如果您熟悉 Jackson,则此 Protobuf 数据格式的行为方式与其 JSON 对应部分相同,因此可用于注解 JSON 序列化/反序列化的类。
from("kafka:topic").
unmarshal().protobuf(ProtobufLibrary.Jackson, JsonNode.class).
to("log:info");63.1. 配置 SchemaResolver
由于 Protobuf 序列化基于 schema,因此此数据格式需要您提供一个 SchemaResolver 对象,该对象能够查找即将被封锁/解放的每个交换的 schema。
您可以向 registry 添加单个 SchemaResolver,它将被自动查找。或者,您可以明确指定对自定义 SchemaResolver 的引用。
63.2. protobuf Jackson 选项
Protobuf Jackson 数据格式支持 18 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| contentTypeHeader |
| 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | |
| objectMapper |
| 使用 Jackson 时查找并使用现有的 ObjectMapper 和给定 ID。 | |
| useDefaultObjectMapper |
| 是否从注册表查找和使用默认 Jackson ObjectMapper。 | |
| unmarshalType |
| 在 unmarshalling 时使用的 java 类型的类名称。 | |
| jsonView |
| 将 POJO 打包到 JSON 时,您可能希望从 JSON 输出中排除某些字段。借助 Jackson,您可以使用 JSON 视图来完成此操作。此选项是引用具有 JsonView 注释的类。 | |
| Include |
| 如果您想将 pojo 链接到 JSON,而 pojo 则有一些字段具有 null 值。您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | |
| allowJmsType |
| 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。 | |
| collectionType |
| 指的是要在 registry 中使用的自定义集合类型。这个选项应该很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。 | |
| useList |
| 要取消组合到映射列表或 Pojo 的列表,请执行以下操作: | |
| moduleClassNames |
| 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module,指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。 | |
| moduleRefs |
| 使用 Camel 注册表中提到的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | |
| enableFeatures |
| 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | |
| disableFeatures |
| Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | |
| allowUnmarshallType |
| 如果启用,则 Jackson 允许在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只在需要使用时才启用。 | |
| timezone |
| 如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。 | |
| autoDiscoverObjectMapper |
| 如果设置为 true,则 Jackson 将向 registry 中查找 objectMapper。 | |
| schemaResolver |
| 用于查找传输中数据的模式解析器的可选模式。 | |
| autoDiscoverSchemaResolver |
| 如果不禁用,SchemaResolver 将进入 registry。 |
63.3. 使用自定义 ProtobufMapper
您可以在需要更多对映射配置控制时,将 JacksonProtobufDataFormat 配置为使用自定义 ProtobufMapper。
如果您在 registry 中设置单个 ProtobufMapper,则 Camel 将自动查找并使用此 ProtobufMapper。
63.4. 依赖项
要在 camel 路由中使用 Protobuf Jackson,您需要添加依赖 camel-jackson-protobuf 来实现此数据格式。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson-protobuf</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>63.5. Spring Boot Auto-Configuration
当将 protobuf-jackson 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jackson-protobuf-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>组件支持 19 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.protobuf-jackson.allow-jms-type | 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。 | false | 布尔值 |
| camel.dataformat.protobuf-jackson.allow-unmarshall-type | 如果启用,则 Jackson 允许在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只在需要使用时才启用。 | false | 布尔值 |
| camel.dataformat.protobuf-jackson.auto-discover-object-mapper | 如果设置为 true,则 Jackson 将向 registry 中查找 objectMapper。 | false | 布尔值 |
| camel.dataformat.protobuf-jackson.auto-discover-schema-resolver | 如果不禁用,SchemaResolver 将进入 registry。 | true | 布尔值 |
| camel.dataformat.protobuf-jackson.collection-type | 指的是要在 registry 中使用的自定义集合类型。这个选项应该很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。 | 字符串 | |
| camel.dataformat.protobuf-jackson.content-type-header | 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 示例到 XML,或者用于数据格式的应用程序/json 到 JSON。 | true | 布尔值 |
| camel.dataformat.protobuf-jackson.disable-features | Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | 字符串 | |
| camel.dataformat.protobuf-jackson.enable-features | 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature 的多个功能匹配的名称。 | 字符串 | |
| camel.dataformat.protobuf-jackson.enabled | 是否启用 protobuf-jackson 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.protobuf-jackson.include | 如果您想将 pojo 链接到 JSON,而 pojo 则有一些字段具有 null 值。您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | 字符串 | |
| camel.dataformat.protobuf-jackson.json-view | 将 POJO 打包到 JSON 时,您可能希望从 JSON 输出中排除某些字段。借助 Jackson,您可以使用 JSON 视图来完成此操作。此选项是引用具有 JsonView 注释的类。 | 字符串 | |
| camel.dataformat.protobuf-jackson.module-class-names | 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module,指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。 | 字符串 | |
| camel.dataformat.protobuf-jackson.module-refs | 使用 Camel 注册表中提到的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | 字符串 | |
| camel.dataformat.protobuf-jackson.object-mapper | 使用 Jackson 时查找并使用现有的 ObjectMapper 和给定 ID。 | 字符串 | |
| camel.dataformat.protobuf-jackson.schema-resolver | 用于查找传输中数据的模式解析器的可选模式。 | 字符串 | |
| camel.dataformat.protobuf-jackson.timezone | 如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。 | 字符串 | |
| camel.dataformat.protobuf-jackson.unmarshal-type | 在 unmarshalling 时使用的 java 类型的类名称。 | 字符串 | |
| camel.dataformat.protobuf-jackson.use-default-object-mapper | 是否从注册表查找和使用默认 Jackson ObjectMapper。 | true | 布尔值 |
| camel.dataformat.protobuf-jackson.use-list | 要取消组合到映射列表或 Pojo 的列表,请执行以下操作: | false | 布尔值 |
第 64 章 SOAP
SOAP 是一种数据格式,它使用 JAXB2 和 JAX-WS 注释 marshal 和 unmarshal SOAP 载荷。它提供 Apache CXF 的基本功能,而无需 CXF 堆栈。
命名空间前缀映射
如需有关如何使用 SOAP 数据格式控制命名空间前缀映射时,请参阅 JAXB。
64.1. SOAP 选项
SOAP 数据格式支持 6 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| contextPath |
| 您的 JAXB 类所在的 必需 软件包名称。 | |
| encoding |
| 到 overrule 并使用特定的编码。 | |
| elementNameStrategyRef |
| 指的是用于从 registry 查找的元素策略。元素名称策略用于两个目的。第一个是查找给定对象的 xml 元素名称,在将对象放入 SOAP 消息时查找 soap 操作。第二个是查找给定 soap 故障名称的 Exception 类。以下三元素策略类名称开箱即用。QNameStrategy - 使用实例化时配置的固定 qName。不支持 TypeNameStrategy 异常查找 - 使用给定类型的 XMLType 注解中的名称和命名空间。如果没有设置 namespace,则使用 package-info。异常查找不支持 ServiceInterfaceStrategy - 使用 web 服务界面的信息来确定类型名称,并查找 SOAP 故障的异常类。所有这三个类位于软件包名称 org.apache.camel.dataformat.soap.name (如果您已经生成了带有 cxf-codegen 或类似工具的 web 服务 stub 代码,则您可能想使用 ServiceInterfaceStrategy)。如果没有注解的服务接口,您应该使用 QNameStrategy 或 TypeNameStrategy。 | |
| version |
| SOAP 版本应为 1.1 或 1.2。默认是 1.1。 | |
| namespacePrefixRef |
| 当使用 JAXB 或 SOAP 时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。为了控制此映射,Camel 允许您引用包含所需映射的映射。 | |
| schema |
| 针对现有架构进行验证。您可以使用前缀 classpath:、file: 或 http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个模式文件。 |
64.2. ElementNameStrategy
元素名称策略用于两个目的。第一个是查找给定对象的 xml 元素名称,在将对象放入 SOAP 消息时查找 soap 操作。第二个是查找给定 soap 故障名称的 Exception 类。
| 策略 | 使用方法 |
|---|---|
| QNameStrategy | 使用实例化时配置的固定 qName。不支持异常查找 |
| TypeNameStrategy | 使用给定类型的 @XMLType 注释中的名称和命名空间。如果没有设置 namespace,则使用 package-info。不支持异常查找 |
| ServiceInterfaceStrategy | 使用 webservice 界面中的信息来确定类型名称,并查找 SOAP 故障的异常类 |
如果您使用 cxf-codegen 或类似的工具生成 web 服务存根代码,那么您可能想使用 ServiceInterfaceStrategy。如果没有注解的服务接口,您应该使用 QNameStrategy 或 TypeNameStrategy。
64.3. 使用 Java DSL
以下示例使用了名为 soap 的命名数据格式,它使用软件包 com.example.customerservice 初始化 JAXBContext。第二个参数是 ElementNameStrategy。路由能够处理普通对象和例外。(请注意,下面的操作只是将 SOAP Envelope 发送到队列。Web 服务提供商实际上需要侦听实际发生 SOAP 调用的队列,在这种情况下,它是 SOAP 请求的一种方式。如果您需要请求回复,那么您应该查看下一个示例。)
SoapJaxbDataFormat soap = new SoapJaxbDataFormat("com.example.customerservice", new ServiceInterfaceStrategy(CustomerService.class));
from("direct:start")
.marshal(soap)
.to("jms:myQueue");
另请参阅
,因为 SOAP 数据格式继承来自 JAXB 数据格式的大部分设置。
64.3.1. 使用 SOAP 1.2
由于 Camel 2.11
SoapJaxbDataFormat soap = new SoapJaxbDataFormat("com.example.customerservice", new ServiceInterfaceStrategy(CustomerService.class));
soap.setVersion("1.2");
from("direct:start")
.marshal(soap)
.to("jms:myQueue");当使用 XML DSL 时,您可以在 <soapjaxb> 元素上设置一个 version 属性。
<!-- Defining a ServiceInterfaceStrategy for retrieving the element name when marshalling -->
<bean id="myNameStrategy" class="org.apache.camel.dataformat.soap.name.ServiceInterfaceStrategy">
<constructor-arg value="com.example.customerservice.CustomerService"/>
<constructor-arg value="true"/>
</bean>在 Camel 路由中
<route>
<from uri="direct:start"/>
<marshal>
<soapjaxb contentPath="com.example.customerservice" version="1.2" elementNameStrategyRef="myNameStrategy"/>
</marshal>
<to uri="jms:myQueue"/>
</route>64.4. 多部分消息
ServiceInterfaceStrategy 支持多部分 SOAP 信息。ServiceInterfaceStrategy 必须使用符合 JAX-WS 2.2 的服务接口定义初始化,并满足 Document Bare 风格的要求。根据 JAX-WS 规格,目标方法必须满足以下条件:1)它必须最多有 in 或 non-header 参数;如果它有返回类型 2,则它必须最多有返回类型,而不是 in/out ,则它必须最多有 void in/ non-header 参数。
out 或 out
ServiceInterfaceStrategy 应该使用布尔值参数初始化,该参数指示映射策略应用到请求参数或响应参数。
ServiceInterfaceStrategy strat = new ServiceInterfaceStrategy(com.example.customerservice.multipart.MultiPartCustomerService.class, true);
SoapJaxbDataFormat soapDataFormat = new SoapJaxbDataFormat("com.example.customerservice.multipart", strat);64.4.1. 拥有者对象映射
JAX-WS 指定将 type-parameterized javax.xml.ws.Holder 对象用于 In/Out 和 Out 参数。您可以直接使用参数ized-type 的实例。camel-soap DataFormat marshals Holder 值遵循 Holder 的值的 JAXB 映射。没有为 \'Holder 对象提供 unmarshalled 响应中的映射。
64.5. 例子
64.5.1. WebService 客户端
以下路由支持 marshalling 请求并解放响应或错误。
String WS_URI = "cxf://http://myserver/customerservice?serviceClass=com.example.customerservice&dataFormat=RAW";
SoapJaxbDataFormat soapDF = new SoapJaxbDataFormat("com.example.customerservice", new ServiceInterfaceStrategy(CustomerService.class));
from("direct:customerServiceClient")
.onException(Exception.class)
.handled(true)
.unmarshal(soapDF)
.end()
.marshal(soapDF)
.to(WS_URI)
.unmarshal(soapDF);以下片段为服务接口创建代理,并为上述路由发出 SOAP 调用。
import org.apache.camel.Endpoint;
import org.apache.camel.component.bean.ProxyHelper;
...
Endpoint startEndpoint = context.getEndpoint("direct:customerServiceClient");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// CustomerService below is the service endpoint interface, *not* the javax.xml.ws.Service subclass
CustomerService proxy = ProxyHelper.createProxy(startEndpoint, classLoader, CustomerService.class);
GetCustomersByNameResponse response = proxy.getCustomersByName(new GetCustomersByName());64.5.2. WebService Server
使用以下路由设置 Web 服务服务器,该服务器侦听 jms 队列 customerServiceQueue,并使用类 customerServiceImpl 处理请求。客户服务课程应实施接口 CustomerService。它可以在 spring 上下文中定义,而不是直接实例化服务器类,而是作为常规 Bean 在 spring 上下文中定义。
SoapJaxbDataFormat soapDF = new SoapJaxbDataFormat("com.example.customerservice", new ServiceInterfaceStrategy(CustomerService.class));
CustomerService serverBean = new CustomerServiceImpl();
from("jms://queue:customerServiceQueue")
.onException(Exception.class)
.handled(true)
.marshal(soapDF)
.end()
.unmarshal(soapDF)
.bean(serverBean)
.marshal(soapDF);64.6. 依赖项
要在 camel 路由中使用 SOAP 数据格式,您需要将以下依赖项添加到您的 pom 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-soap</artifactId>
<version>{CamelSBVersion}</version>
</dependency>64.7. Spring Boot Auto-Configuration
在 Spring Boot 中使用 soapjaxb 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-soap-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 7 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.soapjaxb.context-path | JAXB 类所在的软件包名称。 | 字符串 | |
| camel.dataformat.soapjaxb.element-name-strategy-ref | 指的是用于从 registry 查找的元素策略。元素名称策略用于两个目的。第一个是查找给定对象的 xml 元素名称,在将对象放入 SOAP 消息时查找 soap 操作。第二个是查找给定 soap 故障名称的 Exception 类。以下三元素策略类名称开箱即用。QNameStrategy - 使用实例化时配置的固定 qName。不支持 TypeNameStrategy 异常查找 - 使用给定类型的 XMLType 注解中的名称和命名空间。如果没有设置 namespace,则使用 package-info。异常查找不支持 ServiceInterfaceStrategy - 使用 web 服务界面的信息来确定类型名称,并查找 SOAP 故障的异常类。所有这三个类位于软件包名称 org.apache.camel.dataformat.soap.name (如果您已经生成了带有 cxf-codegen 或类似工具的 web 服务 stub 代码,则您可能想使用 ServiceInterfaceStrategy)。如果没有注解的服务接口,您应该使用 QNameStrategy 或 TypeNameStrategy。 | 字符串 | |
| camel.dataformat.soapjaxb.enabled | 是否启用 soapjaxb 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.soapjaxb.encoding | 到 overrule 并使用特定的编码。 | 字符串 | |
| camel.dataformat.soapjaxb.namespace-prefix-ref | 当使用 JAXB 或 SOAP 时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。为了控制此映射,Camel 允许您引用包含所需映射的映射。 | 字符串 | |
| camel.dataformat.soapjaxb.schema | 针对现有架构进行验证。您可以使用前缀 classpath:、file: 或 http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个模式文件。 | 字符串 | |
| camel.dataformat.soapjaxb.version | SOAP 版本应为 1.1 或 1.2。默认是 1.1。 | 1.1 | 字符串 |
第 65 章 zip 文件
Zip File Data Format 是消息压缩和解压缩格式。可将消息解压缩(解压缩)到包含单个条目的 Zip 文件,而包含单个条目的 Zip 文件可以解压缩(解压缩)到原始文件内容。这个数据格式支持 ZIP64,只要使用 Java 7 或更高版本。
65.1. zipfile 选项
Zip File dataformat 支持 4 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| usingIterator |
| 如果 zip 文件有多个条目,则将此选项设置为 true,允许使用分割 EIP 在流模式中使用迭代器分割数据。 | |
| allowEmptyDirectory |
| 如果 zip 文件有多个条目,则将此选项设置为 true,则即使目录为空,也允许获取迭代器。 | |
| preservePathElements |
| 如果文件名包含 path 元素,请将此选项设置为 true,允许在 zip 文件中维护该路径。 | |
| maxDecompressedSize |
| 设置 zip 文件的最大解压缩大小(以字节为单位)。若未指定,则默认值对应于 1GB。如果解压缩的大小超过这个数量,将抛出 IOException。设置为 -1,以禁用设置最大压缩大小。 |
65.2. marshal
在本例中,我们使用 Zip 文件压缩将常规文本/XML 有效负载组合成压缩载荷,并将它发送到名为 MY_QUEUE 的 ActiveMQ 队列。
from("direct:start")
.marshal().zipFile()
.to("activemq:queue:MY_QUEUE");
创建的 Zip 文件中的 Zip 条目名称基于传入的 CamelFileName 消息标头,这是文件组件使用的标准消息标头。另外,传出 CamelFileName 消息标头会自动设置为传入 CamelFileName 消息标头的值,并带有 ".zip" 后缀。例如,如果以下路由在输入目录中找到一个名为"test.txt"的文件,则输出将是名为"test.txt.zip"的 Zip 文件,其中包含一个名为 "test.txt" 的单个 Zip 条目:
from("file:input/directory?antInclude=*/.txt")
.marshal().zipFile()
.to("file:output/directory");
如果没有传入的 CamelFileName 消息标头(例如,如果文件组件不是消费者),则默认使用消息 ID,因为消息 ID 通常是一个唯一生成的 ID,以文件名(如 ID-MACHINENAME-2443-1211718892437-1-0.zip )结尾。如果要覆盖此行为,您可以在路由中明确设置 CamelFileName 标头的值:
from("direct:start")
.setHeader(Exchange.FILE_NAME, constant("report.txt"))
.marshal().zipFile()
.to("file:output/directory");此路由会在输出目录中生成名为 "report.txt.zip" 的 Zip 文件,其中包含一个名为 "report.txt" 的单个 Zip 条目。
65.3. unmarshal
在本例中,我们将 Zip 文件有效负载从名为 MY_QUEUE 的 ActiveMQ 队列继承到其原始格式,并将它转发到 UnZippedMessageProcessor。
from("activemq:queue:MY_QUEUE")
.unmarshal().zipFile()
.process(new UnZippedMessageProcessor());如果 zip 文件有多个条目,则 ZipFileDataFormat 的 usingIterator 选项为 true,您可以使用 splitter 来进一步工作。
ZipFileDataFormat zipFile = new ZipFileDataFormat();
zipFile.setUsingIterator(true);
from("file:src/test/resources/org/apache/camel/dataformat/zipfile/?delay=1000&noop=true")
.unmarshal(zipFile)
.split(body(Iterator.class)).streaming()
.process(new UnZippedMessageProcessor())
.end();或者,您可以将 ZipSplitter 用作分割器的表达式,如下所示
from("file:src/test/resources/org/apache/camel/dataformat/zipfile?delay=1000&noop=true")
.split(new ZipSplitter()).streaming()
.process(new UnZippedMessageProcessor())
.end();65.3.1. 聚合
此聚合策略需要强制完成检查才能正常工作。
在这个示例中,我们将输入目录中找到的所有文本文件聚合到存储在输出目录中的单个 Zip 文件中。
from("file:input/directory?antInclude=*/.txt")
.aggregate(constant(true), new ZipAggregationStrategy())
.completionFromBatchConsumer().eagerCheckCompletion()
.to("file:output/directory");
传出的 CamelFileName 消息标头使用 java.io.File.createTempFile 创建,并带有 ".zip" 后缀。如果要覆盖此行为,您可以在路由中明确设置 CamelFileName 标头的值:
from("file:input/directory?antInclude=*/.txt")
.aggregate(constant(true), new ZipAggregationStrategy())
.completionFromBatchConsumer().eagerCheckCompletion()
.setHeader(Exchange.FILE_NAME, constant("reports.zip"))
.to("file:output/directory");65.4. 依赖项
要在 camel 路由中使用 Zip 文件,您需要添加有关实现此数据格式的 camel-zipfile 的依赖关系。
如果使用 Maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-zipfile</artifactId>
<version>{CamelSBVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>65.5. Spring Boot Auto-Configuration
当将 zipfile 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-zipfile-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 5 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.dataformat.zipfile.allow-empty-directory | 如果 zip 文件有多个条目,则将此选项设置为 true,则即使目录为空,也允许获取迭代器。 | false | 布尔值 |
| camel.dataformat.zipfile.enabled | 是否启用 zip 文件数据格式的自动配置。这默认是启用的。 | 布尔值 | |
| camel.dataformat.zipfile.max-decompressed-size | 设置 zip 文件的最大解压缩大小(以字节为单位)。若未指定,则默认值对应于 1GB。如果解压缩的大小超过这个数量,将抛出 IOException。设置为 -1,以禁用设置最大压缩大小。 | 1073741824 | Long |
| camel.dataformat.zipfile.preserve-path-elements | 如果文件名包含 path 元素,请将此选项设置为 true,允许在 zip 文件中维护该路径。 | false | 布尔值 |
| camel.dataformat.zipfile.using-iterator | 如果 zip 文件有多个条目,则将此选项设置为 true,允许使用分割 EIP 在流模式中使用迭代器分割数据。 | false | 布尔值 |
第 66 章 常数
Constant 表达式语言实际上只是使用常量值或对象的方法。
这是仅在启动路由期间设置一次的固定常量值(或对象),如果您在路由期间需要动态值,请不要使用它。
66.1. 恒定选项
Constant 语言支持 2 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| resultType |
| 设置常数类型的类名称。 | |
| trim |
| 是否修剪值以移除前导和尾随空格和换行符。 |
66.2. 示例
setHeader EIP 可以使用一个常量表达式,如下所示:
<route>
<from uri="seda:a"/>
<setHeader name="theHeader">
<constant>the value</constant>
</setHeader>
<to uri="mock:b"/>
</route>
在这种情况下,来自 seda:a 端点的消息会有一个标头 ,其标题设为Header 的值 (字符串 type)。
使用 Java DSL 以及相同的示例:
from("seda:a")
.setHeader("theHeader", constant("the value"))
.to("mock:b");66.2.1. 指定值类型
选项 resultType 可用于指定值的类型,当值指定为 String 值时,在使用 XML 或 YAML DSL 时会出现这种情况:
例如,使用 int 类型设置标头,您可以:
<route>
<from uri="seda:a"/>
<setHeader name="zipCode">
<constant resultType="int">90210</constant>
</setHeader>
<to uri="mock:b"/>
</route>66.3. 从外部资源载入常数
您可以对常态进行外部化,并让 Camel 从资源(如 "classpath:"、"file:" 或 "http:" )加载它。
这可以通过以下语法完成:" resource:scheme:location",例如引用您可以进行的类路径中的文件:
.setHeader("myHeader").constant("resource:classpath:constant.txt")66.4. 依赖项
Constant 语言是 camel-core 的一部分。
66.5. Spring Boot Auto-Configuration
在 Spring Boot 中使用 constant 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-core-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>组件支持 147 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.cloud.consul.service-discovery.acl-token | 设置要与 Consul 一起使用的 ACL 令牌。 | 字符串 | |
| camel.cloud.consul.service-discovery.block-seconds | 等待监视事件的秒数,默认为 10 秒。 | 10 | 整数 |
| camel.cloud.consul.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.consul.service-discovery.connect-timeout-millis | OkHttpClient 的连接超时。 | Long | |
| camel.cloud.consul.service-discovery.datacenter | 数据中心。 | 字符串 | |
| camel.cloud.consul.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.consul.service-discovery.password | 设置用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.consul.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.consul.service-discovery.read-timeout-millis | OkHttpClient 的读取超时。 | Long | |
| camel.cloud.consul.service-discovery.url | Consul 代理 URL。 | 字符串 | |
| camel.cloud.consul.service-discovery.user-name | 设置用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.consul.service-discovery.write-timeout-millis | OkHttpClient 的写入超时。 | Long | |
| camel.cloud.dns.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.dns.service-discovery.domain | 域名; | 字符串 | |
| camel.cloud.dns.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.dns.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.dns.service-discovery.proto | 所需服务的传输协议。 | _tcp | 字符串 |
| camel.cloud.etcd.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.etcd.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.etcd.service-discovery.password | 用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.etcd.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.etcd.service-discovery.service-path | 用于查找服务发现的路径。 | /services/ | 字符串 |
| camel.cloud.etcd.service-discovery.timeout | 要设置操作完成的最长时间。 | Long | |
| camel.cloud.etcd.service-discovery.type | 要设置发现类型,有效的值为 on-demand 和 watch。 | 按需 | 字符串 |
| camel.cloud.etcd.service-discovery.uris | 客户端可以连接的 URI。 | 字符串 | |
| camel.cloud.etcd.service-discovery.user-name | 用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.api-version | 使用客户端查找时设置 API 版本。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-data | 使用客户端查找时设置证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-file | 设置在使用客户端查找时从文件加载的证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-data | 使用客户端查找时设置客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-file | 设置在使用客户端查找时从文件加载的客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-algo | 在使用客户端查找时设置客户端密钥存储算法,如 RSA。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-data | 在使用客户端查找时设置 Client Keystore 数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-file | 设置在使用客户端查找时从文件加载的客户端密钥存储数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-passphrase | 在使用客户端查找时设置客户端密钥存储密码短语。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.kubernetes.service-discovery.dns-domain | 设置用于 DNS 查找的 DNS 域。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.kubernetes.service-discovery.lookup | 如何执行服务查找。可能的值: client, dns, environment。在使用客户端时,客户端查询 kubernetes master 以获取提供服务的活动 pod 列表,然后随机(或循环)选择一个 pod。使用 dns 时,服务名称被解析为 name.namespace.svc.dnsDomain。当使用 dnssrv 时,服务名称通过 SRV 查询解析 .…svc… when 使用环境变量来查找该服务。默认情况下使用环境。 | 环境 | 字符串 |
| camel.cloud.kubernetes.service-discovery.master-url | 使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用 ENV 变量 KUBERNETES_MASTER 中的 namespace。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.oauth-token | 在使用客户端查找时,设置用于身份验证的 OAUTH 令牌(而不是用户名/密码)。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.password | 在使用客户端查找时,设置用于身份验证的密码。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-name | 设置 DNS/DNSSRV 查找时使用的端口名称。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-protocol | 设置用于 DNS/DNSSRV 查找的端口协议。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.kubernetes.service-discovery.trust-certs | 设置在使用客户端查找时是否打开信任证书检查。 | false | 布尔值 |
| camel.cloud.kubernetes.service-discovery.username | 在使用客户端查找时,设置用于身份验证的用户名。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.client-name | 设置 Ribbon 客户端名称。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.configurations | 定义其他配置定义。 | map | |
| camel.cloud.ribbon.load-balancer.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.ribbon.load-balancer.namespace | 命名空间。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.password | 密码。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.ribbon.load-balancer.username | 用户名。 | 字符串 | |
| camel.hystrix.allow-maximum-size-to-diverge-from-core-size | 允许配置 maximumSize 生效。然后该值可以等于或大于 coreSize。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-enabled | 是否使用 HystrixCircuitBreaker。如果为 false,则将使用 断路器 逻辑,并且允许的所有请求。这与 circuitBreakerForceClosed ()类似,除了继续跟踪指标并知道它是否应该处于打开/关闭状态外,此属性也不会实例化断路器。 | true | 布尔值 |
| camel.hystrix.circuit-breaker-error-threshold-percentage | 错误百分比阈值(如 50)指向断路器将开放和拒绝请求。它将保持在 circuitBreakerSleepWindowInMilliseconds 中定义的持续时间;与 HystrixCommandMetrics.getHealthCounts ()进行比较的错误百分比。 | 50 | 整数 |
| camel.hystrix.circuit-breaker-force-closed | 如果为 true,HystrixCircuitBreaker#allowRequest ()将始终返回 true 以允许请求,而不考虑 HystrixCommandMetrics.getHealthCounts ()中的错误百分比。circuitBreakerForceOpen ()属性具有优先权,因此如果设为 true,则此属性不会执行。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(条带)并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-request-volume-threshold | 指标RollingStatisticalWindowInMilliseconds ()中必须存在于 HystrixCircuitBreaker 的最小请求数。如果在这个数量下,无论错误百分比如何,电路不会条带化。 | 20 | 整数 |
| camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreakertrips 打开 HystrixCircuitBreaker 往返时间(以毫秒为单位),在尝试请求前应等待的时间(毫秒)。 | 5000 | 整数 |
| camel.hystrix.configurations | 定义其他配置定义。 | map | |
| camel.hystrix.core-pool-size | 传递给 java.util.concurrent.ThreadPoolExecutor#setCorePoolSize (int)的核心 thread-pool 大小。 | 10 | 整数 |
| camel.hystrix.enabled | 启用组件。 | true | 布尔值 |
| camel.hystrix.execution-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.run ()的并发请求数。超出并发限制的请求将被拒绝。Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | 整数 |
| camel.hystrix.execution-isolation-strategy | 将通过以下方式执行哪些隔离策略 HystrixCommand.run ():如果 THREAD,它将在单独的线程上执行,并且并发请求受 thread-pool 中的线程数量限制。如果 SEMAPHORE,它将在调用线程上执行,并且由 semaphore 数限制的并发请求。 | 线程 | 字符串 |
| camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 Future# canceled )。仅在 executionIsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
| camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
| camel.hystrix.execution-timeout-in-milliseconds | 命令超时并停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 并且命令是 thread-isolated,则执行线程将中断。如果命令是 semaphore-isolated 和 HystrixObservableCommand,则该命令将被取消订阅。 | 1000 | 整数 |
| camel.hystrix.fallback-enabled | 出现故障时是否应该尝试 HystrixCommand.getFallback ()。 | true | 布尔值 |
| camel.hystrix.fallback-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.getFallback ()的并发请求数。超出并发限制的请求将很快失败,且不会尝试检索回退。 | 10 | 整数 |
| camel.hystrix.group-key | 设置要使用的组密钥。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
| camel.hystrix.keep-alive-time | keep-alive 时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
| camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会意外地更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
| camel.hystrix.maximum-size | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) .这是在没有开始拒绝 HystrixCommands 的情况下支持的最大并发数。请注意,只有在您还设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
| camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 允许计算成功和错误百分比并影响 HystrixCircuitBreaker.isOpen ()状态的健康快照之间等待的时间(毫秒)。在高容量电路上,错误百分比的持续计算可能会成为 CPU 密集型,从而控制它计算的频率。 | 500 | 整数 |
| camel.hystrix.metrics-rolling-percentile-bucket-size | 存储在滚动百分比的每个存储桶中的最大值数。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 在 HystrixCommandMetrics 中捕获百分比的指标。 | true | 布尔值 |
| camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动百分比窗口的 bucket 数量已分为.这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 6 | 整数 |
| camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的百分比滚动窗口。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10000 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这传递到 HystrixCommandMetrics 中的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-in-milliseconds | 此属性设置统计滚动窗口的持续时间,以毫秒为单位。这是为线程池保留指标的时间。窗口被分成 bucket,按这些递增来滚动。 | 10000 | 整数 |
| camel.hystrix.queue-size-rejection-threshold | 队列大小拒绝阈值是一个人为最大大小,即使未达到 maxQueueSize,也会发生拒绝的大小。这是因为 BlockingQueue 的 maxQueueSize 无法动态更改,我们希望支持动态更改会影响拒绝的队列大小。在排队线程执行时,HystrixCommand 使用它。 | 5 | 整数 |
| camel.hystrix.request-log-enabled | HystrixCommand 执行和事件是否应记录到 HystrixRequestLog。 | true | 布尔值 |
| camel.hystrix.thread-pool-key | 设置要使用的线程池密钥。默认情况下,将使用与 groupKey 相同的值。 | CamelHystrix | 字符串 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-in-milliseconds | 统计滚动窗口的持续时间(以毫秒为单位)。这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10000 | 整数 |
| camel.language.constant.enabled | 是否启用恒定语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.constant.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.csimple.enabled | 是否启用 csimple 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.csimple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.exchangeproperty.enabled | 是否启用 ExchangeProperty 语言自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.exchangeproperty.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.file.enabled | 是否启用文件语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.file.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.header.enabled | 是否启用标头语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.header.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.ref.enabled | 是否启用 ref 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.ref.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.simple.enabled | 是否启用简单语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.simple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.tokenize.enabled | 是否启用令牌语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.tokenize.group-delimiter | 设置分组时要使用的分隔符。如果没有设置,则令牌将用作分隔符。 | 字符串 | |
| camel.language.tokenize.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.resilience4j.automatic-transition-from-open-to-half-open-enabled | 在 waitDurationInOpenState 通过后,启用从 OPEN 自动过渡到 HALF_OPEN 状态。 | false | 布尔值 |
| camel.resilience4j.circuit-breaker-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreaker 实例,以便从 registry 查找和使用。在使用它时,不使用任何其他断路器选项。 | 字符串 | |
| camel.resilience4j.config-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreakerConfig 实例,用于从 registry 查找和使用。 | 字符串 | |
| camel.resilience4j.configurations | 定义其他配置定义。 | map | |
| camel.resilience4j.enabled | 启用组件。 | true | 布尔值 |
| camel.resilience4j.failure-rate-threshold | 配置故障率阈值(以百分比表示)。如果失败率相等或大于 CircuitBreaker 转换的阈值,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 50 个百分比。 | 浮点值 | |
| camel.resilience4j.minimum-number-of-calls | 配置 CircuitBreaker 可以计算错误率前所需的最少调用数(每个滑动窗口期限)。例如,如果 minimumNumberOfCalls 为 10,则必须记录至少 10 个调用,然后才能计算失败率。如果只记录 9 个调用,则 CircuitBreaker 不会过渡到 open,即使所有 9 调用都失败。默认 minimumNumberOfCalls 为 100。 | 100 | 整数 |
| camel.resilience4j.permitted-number-of-calls-in-half-open-state | 当 CircuitBreaker 为一半打开时,配置允许的调用数量。大小必须大于 0。默认大小为 10。 | 10 | 整数 |
| camel.resilience4j.sliding-window-size | 配置 sliding 窗口的大小,用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置 sliding 窗口的大小。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。slidingWindowSize 必须大于 0。minimumNumberOfCalls 必须大于 0。如果 slidingWindowType 是 COUNT_BASED,则 minimumNumberOfCalls 无法大于 slidingWindowSize。如果 slidingWindowType 是 TIME_BASED,您可以选择任何您想要的。默认 slidingWindowSize 为 100。 | 100 | 整数 |
| camel.resilience4j.sliding-window-type | 配置 sliding 窗口的类型,用于在 CircuitBreaker 关闭时记录调用的结果。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。默认 slidingWindowType 为 COUNT_BASED。 | COUNT_BASED | 字符串 |
| camel.resilience4j.slow-call-duration-threshold | 配置上面的持续时间阈值(秒),其调用被视为较慢,并增加较慢的调用百分比。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.slow-call-rate-threshold | 配置一个阈值(以百分比表示)。当调用持续时间大于 slowCallDurationThreshold Duration 时,CircuitBreaker 会将一个调用视为 slowCallDurationThreshold Duration。当较慢的调用百分比相等或大于阈值时,CircuitBreaker 过渡到 open,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 100 百分比,这意味着所有记录的调用都必须比 slowCallDurationThreshold 慢。 | 浮点值 | |
| camel.resilience4j.wait-duration-in-open-state | 配置等待持续时间(以秒为单位),用于指定 CircuitBreaker 应该打开的时间,然后再切换到一半打开。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.writable-stack-trace-enabled | 启用可写堆栈跟踪。当设置为 false 时,Exception.getStackTrace 返回零长度数组。当断路器处于开路时,这可用于减少日志垃圾邮件,因为已经知道例外原因(断路器是短路调用)。 | true | 布尔值 |
| camel.rest.api-component | 用作 REST API (如 swagger)的 Camel 组件的名称(如 swagger)没有明确配置 API 组件,则 Camel 组件将查找,如果 registry 中注册了 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.api-context-path | 设置领先的 API 上下文路径,即 REST API 服务要使用的路径。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。 | 字符串 | |
| camel.rest.api-context-route-id | 设置路由 id,以用于服务 REST API 的路由。路由默认使用自动分配的路由 ID。 | 字符串 | |
| camel.rest.api-host | 要将特定主机名用于 API 文档(如 swagger),可以使用这个配置的主机名覆盖生成的主机。 | 字符串 | |
| camel.rest.api-property | 允许为 api 文档(swagger)配置任意数量的附加属性。例如,将属性 api.title 设置为我的冷却。 | map | |
| camel.rest.api-vendor-extension | 在 Rest API 中是否启用了供应商扩展。如果启用,Camel 将包括附加信息作为厂商扩展(如以 x- 开头的密钥),如路由 ID、类名称等。在导入 API 文档时,并非所有第三方 API 网关和工具都支持 vendor-extensions。 | false | 布尔值 |
| camel.rest.binding-mode | 设置要使用的绑定模式。默认值为 off。 | RestBindingMode | |
| camel.rest.client-request-validation | 是否启用客户端请求的验证,以检查客户端的 Content-Type 和 Accept 标头是否受其消耗/生成的设置的 Rest-DSL 配置支持。这可打开,以启用此检查。如果验证错误,则返回 HTTP Status Code 415 或 406。默认值为 false。 | false | 布尔值 |
| camel.rest.component | 用于 REST 传输(使用者)的 Camel Rest 组件,如 netty-http, jetty, servlet, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.component-property | 允许为正在使用的其余组件配置更多附加属性。 | map | |
| camel.rest.consumer-property | 允许为正在使用的其余使用者配置更多附加属性。 | map | |
| camel.rest.context-path | 设置 REST 服务将使用的前导 context-path。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。或用于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
| camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | map | |
| camel.rest.data-format-property | 允许为使用中的数据格式配置任意数量的附加属性。例如,将 property prettyPrint 设置为 true 以将 json 输出设置为 pretty 模式。属性可以加上前缀,表示选项仅适用于 JSON 或 XML,对于 IN 或 OUT。前缀为: json.in. json.out. xml.in. xml.out。例如,值为 xml.out.mustBeJAXBElement 的键仅适用于传出的 XML 数据格式。没有前缀的密钥是所有情况的通用键。 | map | |
| camel.rest.enable-cors | 是否在 HTTP 响应中启用 CORS 标头。默认值为 false。 | false | 布尔值 |
| camel.rest.endpoint-property | 允许为正在使用的其余端点配置更多附加属性。 | map | |
| camel.rest.host | 用于公开 REST 服务的主机名。 | 字符串 | |
| camel.rest.host-name-resolver | 如果没有配置主机名,则使用此解析器计算 REST 服务将使用的主机名。 | RestHostNameResolver | |
| camel.rest.json-data-format | 要使用的特定 json 数据格式的名称。默认情况下将使用 json-jackson。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.port | 用于公开 REST 服务的端口号。请注意,如果您使用 servlet 组件,则此处配置的端口号不适用,因为使用中的端口号是 servlet 组件使用的实际端口号。例如,使用 Apache Tomcat 将其 tomcat http 端口用于 tomcat http 端口(如果在 firewall 中默认使用端口 8181 )虽然在这些情况下,这里设置端口号,但允许工具和 JMX 知道端口号,因此建议将端口号设置为 servlet 引擎使用的数字。 | 字符串 | |
| camel.rest.producer-api-doc | 设置 REST 制作者将用来验证 REST uri 和查询参数的 api 文档(swagger api)的位置,对 api 文档相应地生效。这需要将 camel-swagger-java 添加到 classpath 中,任何未命中配置都让 Camel 在启动时失败并报告错误。默认情况下,api 文档的位置从类路径加载,但您可以使用 file: 或 http: 引用从文件或 http url 加载的资源。 | 字符串 | |
| camel.rest.producer-component | 设置要用作 REST producer 的 Camel 组件的名称。 | 字符串 | |
| camel.rest.scheme | 用于公开 REST 服务的方案。通常支持 http 或 https。默认值为 http。 | 字符串 | |
| camel.rest.skip-binding-on-error-code | 如果存在自定义 HTTP 错误代码标头,是否跳过输出绑定。这允许构建不绑定到 json / xml 等自定义错误消息,否则成功信息会这样做。 | false | 布尔值 |
| camel.rest.use-x-forward-headers | 是否将 X-Forward 标头用于主机和相关设置。默认值为 true。 | true | 布尔值 |
| camel.rest.xml-data-format | 要使用的特定 XML 数据格式的名称。默认情况下将使用 jaxb。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.api-context-id-pattern | 弃用了 CamelContext id 模式,以只允许 CamelContext 中名称与模式匹配的其他服务的 Rest API。模式 名称 指的是 CamelContext 名称,仅匹配当前的 CamelContext。对于任何其他值,模式使用 PatternHelper#matchPattern (String,String)中的规则。 | 字符串 | |
| camel.rest.api-context-listing | 弃用了 设置是否启用了 JVM 中带有 REST 服务的所有可用 CamelContext 的列表。如果启用它允许发现这些上下文,如果为 false,则只使用当前的 CamelContext。 | false | 布尔值 |
第 67 章 CSimple
C Simple 语言 编译了简单 语言。
67.1. CSimple 和 Simple 之间的区别
简单语言是动态表达式语言,运行时被解析为一组 Camel Expressions 或 Predicates。
csimple 语言被解析为常规 Java 源代码,并与所有其他源代码一起编译,或者在通过 camel-csimple-joor 模块引导期间编译一次。
简单的语言通常非常轻便且快速,但对于某些通过 OGNL 路径进行动态方法调用的用例,简单语言执行运行时内省和反应。这对性能具有开销,这也是创建 csimple 的原因之一。
csimple 语言需要通过 OGNL 路径键入safe 和 method 调用,需要在解析过程中知道类型。这意味着,对于 csimple 语言表达式,您需要在 脚本中提供类类型,而 simple 会在运行时内省它。
换言之,简单语言是使用 duck 输入 (如果看起来像 duck,像 duck),这是 duck,而 csimple 使用的是 Java 类型(typesafety)。如果存在类型错误,则 simple 会在运行时报告它,并且 csimple 将会出现 Java 编译错误。
67.1.1. 其他 CSimple 功能
csimple 语言包括一些额外的功能,它们支持处理 集合、映射或 数组类型的常见用例。以下函数 bodyAsIndex,headerAsIndex, 和 exchangePropertyAsIndex 用于在输入时使用这些用例。
| 功能 | 类型 | 描述 |
|---|---|---|
| bodyAsIndex (类型,index) | 类型 |
用于从现有 |
| mandatoryBodyAsIndex (类型,index) | 类型 |
用于从现有 |
| headerAsIndex (键,type,index) | 类型 |
用于从现有 |
| mandatoryHeaderAsIndex (键,type,index) | 类型 |
用于从现有 |
| ExchangePropertyAsIndex (key,type,index) | 类型 |
用于从现有 |
| mandatoryExchangePropertyAsIndex (键,type,index) | 类型 |
用于从现有 |
例如,给出以下简单表达式:
Hello $\{body[0].name}
此脚本没有类型信息,而 simple 语言在运行时将通过内省消息正文来解决此问题,如果它是基于集合的,则通过反射来调用名为 getName 的方法。
在 csimple (compiled)中,我们希望预先编译这一点,因此最终用户必须提供 bodyAsIndex 函数的类型信息:
Hello $\{bodyAsIndex(com.foo.MyUser, 0).name}67.2. 编译
csimple 语言被解析为常规 Java 源代码,并与所有其他源代码一起编译,也可以在通过 camel-csimple-joor 模块引导期间编译一次。
有两种编译方法
-
使用
camel-csimple-maven-plugin在构建时生成源代码。 -
使用
camel-csimple-joor,在 Camel 引导期间执行运行时内存编译。
67.2.1. 使用 camel-csimple-maven-plugin
camel-csimple-maven-plugin Maven 插件用于从源代码发现所有 csimple 脚本,然后在 src/generated/java 文件夹中自动生成源代码,然后与所有其他源一起编译。
maven 插件将对 .java 和 .xml 文件(Java 和 XML DSL)进行源代码扫描。扫描程序限制了检测某些代码模式,如果以不常/使用,则可能会发现一些简单脚本。
使用 camel-csimple-joor 的运行时编译没有这个限制。
好处是使用常规 Java 编译器编译的,因此在应用 JAR 文件中以 .class 文件的形式包括一切都作为 .class 文件,且在运行时不需要额外的依赖项。
要使用 camel-csimple-maven-plugin,您需要将其添加到 pom.xml 文件中,如下所示:
<plugins>
<!-- generate source code for csimple languages -->
<plugin>
<groupId>org.apache.camel</groupId>
<artifactId>camel-csimple-maven-plugin</artifactId>
<version>${camel.version}</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- include source code generated to maven sources paths -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
<goal>add-resource</goal>
</goals>
<configuration>
<sources>
<source>src/generated/java</source>
</sources>
<resources>
<resource>
<directory>src/generated/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
然后,您还必须添加 build-helper-maven-plugin Maven 插件,使其包含 src/generated 到 Java 编译器的源文件夹列表中,以确保生成的源代码已编译并包含在应用程序 JAR 文件中。
请参阅 Camel Examples 的 camel-example-csimple 示例,它使用 maven 插件。
67.2.2. 使用 camel-csimple-joor
jOOR 库与 Java 编译器集成,并执行 Java 代码运行时编译。
使用 camel-simple-joor 时支持的运行时适用于 Java 独立、Spring Boot、Camel Quarkus 和其他微服务运行时。OSGi、Camel Karaf 或任何种类的 Java Application Server 运行时不支持它。
JOOR 不支持使用 fat jar 打包(https://github.com/jOOQ/jOOR/issues/69)来编译 Spring Boot,它与展开的类路径一起工作。
要使用 camel-simple-joor,只需将它作为依赖项添加到 classpath 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-csimple-joor</artifactId>
<version>{CamelSBProjectVersion}</version>
</dependency>
不需要将 Maven 插件添加到 pom.xml 文件中。
请参阅 Camel Examples 的 camel-example-csimple-jo or 示例,它使用 jOOR 编译器。
67.3. CSimple Language 选项
CSimple 语言支持 2 选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| resultType |
| 设置结果类型的类名称(从输出中键入)。 | |
| trim |
| 是否修剪值以移除前导和尾随空格和换行符。 |
67.4. 限制
目前,csimple 语言 不支持 :
- 嵌套功能(功能内部也称为功能)
-
空 安全运算符 (
?)。
例如,以下脚本无法编译:
Hello ${bean:greeter(${body}, ${header.counter})} ${bodyAs(MyUser)?.address?.zip} > 1000067.5. 自动导入
csimple 语言将自动从中导入:
import java.util.*; import java.util.concurrent.*; import java.util.stream.*; import org.apache.camel.*; import org.apache.camel.util.*;
67.6. 配置文件
您可以在 camel-csimple.properties 文件中配置 csimple 语言,该文件是从根类路径加载的。
例如,您可以通过添加在 camel-csimple.properties 文件中添加额外的导入:
import com.foo.MyUser; import com.bar.*; import static com.foo.MyHelper.*;
您还可以添加别名(key=value),其中别名将被用作代码中的简写替换。
echo()=${bodyAs(String)} ${bodyAs(String)}允许在 csimple 语言脚本中使用 echo (),例如:
from("direct:hello")
.transform(csimple("Hello echo()"))
.log("You said ${body}");echo () 别名将替换为其值,导致脚本:
.transform(csimple("Hello ${bodyAs(String)} ${bodyAs(String)}"))67.7. 另请参阅
请参阅 简单 语言,因为 csimple 具有与简单语言相同的功能集合。
67.8. Spring Boot Auto-Configuration
在 Spring Boot 中使用 csimple 可确保使用以下 Maven 依赖项支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-core-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 147 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.cloud.consul.service-discovery.acl-token | 设置要与 Consul 一起使用的 ACL 令牌。 | 字符串 | |
| camel.cloud.consul.service-discovery.block-seconds | 等待监视事件的秒数,默认为 10 秒。 | 10 | 整数 |
| camel.cloud.consul.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.consul.service-discovery.connect-timeout-millis | OkHttpClient 的连接超时。 | Long | |
| camel.cloud.consul.service-discovery.datacenter | 数据中心。 | 字符串 | |
| camel.cloud.consul.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.consul.service-discovery.password | 设置用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.consul.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.consul.service-discovery.read-timeout-millis | OkHttpClient 的读取超时。 | Long | |
| camel.cloud.consul.service-discovery.url | Consul 代理 URL。 | 字符串 | |
| camel.cloud.consul.service-discovery.user-name | 设置用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.consul.service-discovery.write-timeout-millis | OkHttpClient 的写入超时。 | Long | |
| camel.cloud.dns.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.dns.service-discovery.domain | 域名; | 字符串 | |
| camel.cloud.dns.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.dns.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.dns.service-discovery.proto | 所需服务的传输协议。 | _tcp | 字符串 |
| camel.cloud.etcd.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.etcd.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.etcd.service-discovery.password | 用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.etcd.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.etcd.service-discovery.service-path | 用于查找服务发现的路径。 | /services/ | 字符串 |
| camel.cloud.etcd.service-discovery.timeout | 要设置操作完成的最长时间。 | Long | |
| camel.cloud.etcd.service-discovery.type | 要设置发现类型,有效的值为 on-demand 和 watch。 | 按需 | 字符串 |
| camel.cloud.etcd.service-discovery.uris | 客户端可以连接的 URI。 | 字符串 | |
| camel.cloud.etcd.service-discovery.user-name | 用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.api-version | 使用客户端查找时设置 API 版本。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-data | 使用客户端查找时设置证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-file | 设置在使用客户端查找时从文件加载的证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-data | 使用客户端查找时设置客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-file | 设置在使用客户端查找时从文件加载的客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-algo | 在使用客户端查找时设置客户端密钥存储算法,如 RSA。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-data | 在使用客户端查找时设置 Client Keystore 数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-file | 设置在使用客户端查找时从文件加载的客户端密钥存储数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-passphrase | 在使用客户端查找时设置客户端密钥存储密码短语。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.kubernetes.service-discovery.dns-domain | 设置用于 DNS 查找的 DNS 域。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.kubernetes.service-discovery.lookup | 如何执行服务查找。可能的值: client, dns, environment。在使用客户端时,客户端查询 kubernetes master 以获取提供服务的活动 pod 列表,然后随机(或循环)选择一个 pod。使用 dns 时,服务名称被解析为 name.namespace.svc.dnsDomain。当使用 dnssrv 时,服务名称通过 SRV 查询解析 .…svc… when 使用环境变量来查找该服务。默认情况下使用环境。 | 环境 | 字符串 |
| camel.cloud.kubernetes.service-discovery.master-url | 使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用 ENV 变量 KUBERNETES_MASTER 中的 namespace。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.oauth-token | 在使用客户端查找时,设置用于身份验证的 OAUTH 令牌(而不是用户名/密码)。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.password | 在使用客户端查找时,设置用于身份验证的密码。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-name | 设置 DNS/DNSSRV 查找时使用的端口名称。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-protocol | 设置用于 DNS/DNSSRV 查找的端口协议。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.kubernetes.service-discovery.trust-certs | 设置在使用客户端查找时是否打开信任证书检查。 | false | 布尔值 |
| camel.cloud.kubernetes.service-discovery.username | 在使用客户端查找时,设置用于身份验证的用户名。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.client-name | 设置 Ribbon 客户端名称。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.configurations | 定义其他配置定义。 | map | |
| camel.cloud.ribbon.load-balancer.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.ribbon.load-balancer.namespace | 命名空间。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.password | 密码。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.ribbon.load-balancer.username | 用户名。 | 字符串 | |
| camel.hystrix.allow-maximum-size-to-diverge-from-core-size | 允许配置 maximumSize 生效。然后该值可以等于或大于 coreSize。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-enabled | 是否使用 HystrixCircuitBreaker。如果为 false,则将使用 断路器 逻辑,并且允许的所有请求。这与 circuitBreakerForceClosed ()类似,除了继续跟踪指标并知道它是否应该处于打开/关闭状态外,此属性也不会实例化断路器。 | true | 布尔值 |
| camel.hystrix.circuit-breaker-error-threshold-percentage | 错误百分比阈值(如 50)指向断路器将开放和拒绝请求。它将保持在 circuitBreakerSleepWindowInMilliseconds 中定义的持续时间;与 HystrixCommandMetrics.getHealthCounts ()进行比较的错误百分比。 | 50 | 整数 |
| camel.hystrix.circuit-breaker-force-closed | 如果为 true,HystrixCircuitBreaker#allowRequest ()将始终返回 true 以允许请求,而不考虑 HystrixCommandMetrics.getHealthCounts ()中的错误百分比。circuitBreakerForceOpen ()属性具有优先权,因此如果设为 true,则此属性不会执行。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(条带)并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-request-volume-threshold | 指标RollingStatisticalWindowInMilliseconds ()中必须存在于 HystrixCircuitBreaker 的最小请求数。如果在这个数量下,无论错误百分比如何,电路不会条带化。 | 20 | 整数 |
| camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreakertrips 打开 HystrixCircuitBreaker 往返时间(以毫秒为单位),在尝试请求前应等待的时间(毫秒)。 | 5000 | 整数 |
| camel.hystrix.configurations | 定义其他配置定义。 | map | |
| camel.hystrix.core-pool-size | 传递给 java.util.concurrent.ThreadPoolExecutor#setCorePoolSize (int)的核心 thread-pool 大小。 | 10 | 整数 |
| camel.hystrix.enabled | 启用组件。 | true | 布尔值 |
| camel.hystrix.execution-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.run ()的并发请求数。超出并发限制的请求将被拒绝。Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | 整数 |
| camel.hystrix.execution-isolation-strategy | 将通过以下方式执行哪些隔离策略 HystrixCommand.run ():如果 THREAD,它将在单独的线程上执行,并且并发请求受 thread-pool 中的线程数量限制。如果 SEMAPHORE,它将在调用线程上执行,并且由 semaphore 数限制的并发请求。 | 线程 | 字符串 |
| camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 Future# canceled )。仅在 executionIsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
| camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
| camel.hystrix.execution-timeout-in-milliseconds | 命令超时并停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 并且命令是 thread-isolated,则执行线程将中断。如果命令是 semaphore-isolated 和 HystrixObservableCommand,则该命令将被取消订阅。 | 1000 | 整数 |
| camel.hystrix.fallback-enabled | 出现故障时是否应该尝试 HystrixCommand.getFallback ()。 | true | 布尔值 |
| camel.hystrix.fallback-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.getFallback ()的并发请求数。超出并发限制的请求将很快失败,且不会尝试检索回退。 | 10 | 整数 |
| camel.hystrix.group-key | 设置要使用的组密钥。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
| camel.hystrix.keep-alive-time | keep-alive 时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
| camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会意外地更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
| camel.hystrix.maximum-size | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) .这是在没有开始拒绝 HystrixCommands 的情况下支持的最大并发数。请注意,只有在您还设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
| camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 允许计算成功和错误百分比并影响 HystrixCircuitBreaker.isOpen ()状态的健康快照之间等待的时间(毫秒)。在高容量电路上,错误百分比的持续计算可能会成为 CPU 密集型,从而控制它计算的频率。 | 500 | 整数 |
| camel.hystrix.metrics-rolling-percentile-bucket-size | 存储在滚动百分比的每个存储桶中的最大值数。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 在 HystrixCommandMetrics 中捕获百分比的指标。 | true | 布尔值 |
| camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动百分比窗口的 bucket 数量已分为.这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 6 | 整数 |
| camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的百分比滚动窗口。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10000 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这传递到 HystrixCommandMetrics 中的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-in-milliseconds | 此属性设置统计滚动窗口的持续时间,以毫秒为单位。这是为线程池保留指标的时间。窗口被分成 bucket,按这些递增来滚动。 | 10000 | 整数 |
| camel.hystrix.queue-size-rejection-threshold | 队列大小拒绝阈值是一个人为最大大小,即使未达到 maxQueueSize,也会发生拒绝的大小。这是因为 BlockingQueue 的 maxQueueSize 无法动态更改,我们希望支持动态更改会影响拒绝的队列大小。在排队线程执行时,HystrixCommand 使用它。 | 5 | 整数 |
| camel.hystrix.request-log-enabled | HystrixCommand 执行和事件是否应记录到 HystrixRequestLog。 | true | 布尔值 |
| camel.hystrix.thread-pool-key | 设置要使用的线程池密钥。默认情况下,将使用与 groupKey 相同的值。 | CamelHystrix | 字符串 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-in-milliseconds | 统计滚动窗口的持续时间(以毫秒为单位)。这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10000 | 整数 |
| camel.language.constant.enabled | 是否启用恒定语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.constant.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.csimple.enabled | 是否启用 csimple 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.csimple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.exchangeproperty.enabled | 是否启用 ExchangeProperty 语言自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.exchangeproperty.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.file.enabled | 是否启用文件语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.file.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.header.enabled | 是否启用标头语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.header.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.ref.enabled | 是否启用 ref 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.ref.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.simple.enabled | 是否启用简单语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.simple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.tokenize.enabled | 是否启用令牌语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.tokenize.group-delimiter | 设置分组时要使用的分隔符。如果没有设置,则令牌将用作分隔符。 | 字符串 | |
| camel.language.tokenize.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.resilience4j.automatic-transition-from-open-to-half-open-enabled | 在 waitDurationInOpenState 通过后,启用从 OPEN 自动过渡到 HALF_OPEN 状态。 | false | 布尔值 |
| camel.resilience4j.circuit-breaker-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreaker 实例,以便从 registry 查找和使用。在使用它时,不使用任何其他断路器选项。 | 字符串 | |
| camel.resilience4j.config-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreakerConfig 实例,用于从 registry 查找和使用。 | 字符串 | |
| camel.resilience4j.configurations | 定义其他配置定义。 | map | |
| camel.resilience4j.enabled | 启用组件。 | true | 布尔值 |
| camel.resilience4j.failure-rate-threshold | 配置故障率阈值(以百分比表示)。如果失败率相等或大于 CircuitBreaker 转换的阈值,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 50 个百分比。 | 浮点值 | |
| camel.resilience4j.minimum-number-of-calls | 配置 CircuitBreaker 可以计算错误率前所需的最少调用数(每个滑动窗口期限)。例如,如果 minimumNumberOfCalls 为 10,则必须记录至少 10 个调用,然后才能计算失败率。如果只记录 9 个调用,则 CircuitBreaker 不会过渡到 open,即使所有 9 调用都失败。默认 minimumNumberOfCalls 为 100。 | 100 | 整数 |
| camel.resilience4j.permitted-number-of-calls-in-half-open-state | 当 CircuitBreaker 为一半打开时,配置允许的调用数量。大小必须大于 0。默认大小为 10。 | 10 | 整数 |
| camel.resilience4j.sliding-window-size | 配置 sliding 窗口的大小,用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置 sliding 窗口的大小。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。slidingWindowSize 必须大于 0。minimumNumberOfCalls 必须大于 0。如果 slidingWindowType 是 COUNT_BASED,则 minimumNumberOfCalls 无法大于 slidingWindowSize。如果 slidingWindowType 是 TIME_BASED,您可以选择任何您想要的。默认 slidingWindowSize 为 100。 | 100 | 整数 |
| camel.resilience4j.sliding-window-type | 配置 sliding 窗口的类型,用于在 CircuitBreaker 关闭时记录调用的结果。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。默认 slidingWindowType 为 COUNT_BASED。 | COUNT_BASED | 字符串 |
| camel.resilience4j.slow-call-duration-threshold | 配置上面的持续时间阈值(秒),其调用被视为较慢,并增加较慢的调用百分比。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.slow-call-rate-threshold | 配置一个阈值(以百分比表示)。当调用持续时间大于 slowCallDurationThreshold Duration 时,CircuitBreaker 会将一个调用视为 slowCallDurationThreshold Duration。当较慢的调用百分比相等或大于阈值时,CircuitBreaker 过渡到 open,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 100 百分比,这意味着所有记录的调用都必须比 slowCallDurationThreshold 慢。 | 浮点值 | |
| camel.resilience4j.wait-duration-in-open-state | 配置等待持续时间(以秒为单位),用于指定 CircuitBreaker 应该打开的时间,然后再切换到一半打开。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.writable-stack-trace-enabled | 启用可写堆栈跟踪。当设置为 false 时,Exception.getStackTrace 返回零长度数组。当断路器处于开路时,这可用于减少日志垃圾邮件,因为已经知道例外原因(断路器是短路调用)。 | true | 布尔值 |
| camel.rest.api-component | 用作 REST API (如 swagger)的 Camel 组件的名称(如 swagger)没有明确配置 API 组件,则 Camel 组件将查找,如果 registry 中注册了 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.api-context-path | 设置领先的 API 上下文路径,即 REST API 服务要使用的路径。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。 | 字符串 | |
| camel.rest.api-context-route-id | 设置路由 id,以用于服务 REST API 的路由。路由默认使用自动分配的路由 ID。 | 字符串 | |
| camel.rest.api-host | 要将特定主机名用于 API 文档(如 swagger),可以使用这个配置的主机名覆盖生成的主机。 | 字符串 | |
| camel.rest.api-property | 允许为 api 文档(swagger)配置任意数量的附加属性。例如,将属性 api.title 设置为我的冷却。 | map | |
| camel.rest.api-vendor-extension | 在 Rest API 中是否启用了供应商扩展。如果启用,Camel 将包括附加信息作为厂商扩展(如以 x- 开头的密钥),如路由 ID、类名称等。在导入 API 文档时,并非所有第三方 API 网关和工具都支持 vendor-extensions。 | false | 布尔值 |
| camel.rest.binding-mode | 设置要使用的绑定模式。默认值为 off。 | RestBindingMode | |
| camel.rest.client-request-validation | 是否启用客户端请求的验证,以检查客户端的 Content-Type 和 Accept 标头是否受其消耗/生成的设置的 Rest-DSL 配置支持。这可打开,以启用此检查。如果验证错误,则返回 HTTP Status Code 415 或 406。默认值为 false。 | false | 布尔值 |
| camel.rest.component | 用于 REST 传输(使用者)的 Camel Rest 组件,如 netty-http, jetty, servlet, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.component-property | 允许为正在使用的其余组件配置更多附加属性。 | map | |
| camel.rest.consumer-property | 允许为正在使用的其余使用者配置更多附加属性。 | map | |
| camel.rest.context-path | 设置 REST 服务将使用的前导 context-path。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。或用于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
| camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | map | |
| camel.rest.data-format-property | 允许为使用中的数据格式配置任意数量的附加属性。例如,将 property prettyPrint 设置为 true 以将 json 输出设置为 pretty 模式。属性可以加上前缀,表示选项仅适用于 JSON 或 XML,对于 IN 或 OUT。前缀为: json.in. json.out. xml.in. xml.out。例如,值为 xml.out.mustBeJAXBElement 的键仅适用于传出的 XML 数据格式。没有前缀的密钥是所有情况的通用键。 | map | |
| camel.rest.enable-cors | 是否在 HTTP 响应中启用 CORS 标头。默认值为 false。 | false | 布尔值 |
| camel.rest.endpoint-property | 允许为正在使用的其余端点配置更多附加属性。 | map | |
| camel.rest.host | 用于公开 REST 服务的主机名。 | 字符串 | |
| camel.rest.host-name-resolver | 如果没有配置主机名,则使用此解析器计算 REST 服务将使用的主机名。 | RestHostNameResolver | |
| camel.rest.json-data-format | 要使用的特定 json 数据格式的名称。默认情况下将使用 json-jackson。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.port | 用于公开 REST 服务的端口号。请注意,如果您使用 servlet 组件,则此处配置的端口号不适用,因为使用中的端口号是 servlet 组件使用的实际端口号。例如,使用 Apache Tomcat 将其 tomcat http 端口用于 tomcat http 端口(如果在 firewall 中默认使用端口 8181 )虽然在这些情况下,这里设置端口号,但允许工具和 JMX 知道端口号,因此建议将端口号设置为 servlet 引擎使用的数字。 | 字符串 | |
| camel.rest.producer-api-doc | 设置 REST 制作者将用来验证 REST uri 和查询参数的 api 文档(swagger api)的位置,对 api 文档相应地生效。这需要将 camel-swagger-java 添加到 classpath 中,任何未命中配置都让 Camel 在启动时失败并报告错误。默认情况下,api 文档的位置从类路径加载,但您可以使用 file: 或 http: 引用从文件或 http url 加载的资源。 | 字符串 | |
| camel.rest.producer-component | 设置要用作 REST producer 的 Camel 组件的名称。 | 字符串 | |
| camel.rest.scheme | 用于公开 REST 服务的方案。通常支持 http 或 https。默认值为 http。 | 字符串 | |
| camel.rest.skip-binding-on-error-code | 如果存在自定义 HTTP 错误代码标头,是否跳过输出绑定。这允许构建不绑定到 json / xml 等自定义错误消息,否则成功信息会这样做。 | false | 布尔值 |
| camel.rest.use-x-forward-headers | 是否将 X-Forward 标头用于主机和相关设置。默认值为 true。 | true | 布尔值 |
| camel.rest.xml-data-format | 要使用的特定 XML 数据格式的名称。默认情况下将使用 jaxb。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.api-context-id-pattern | 弃用了 CamelContext id 模式,以只允许 CamelContext 中名称与模式匹配的其他服务的 Rest API。模式 名称 指的是 CamelContext 名称,仅匹配当前的 CamelContext。对于任何其他值,模式使用 PatternHelper#matchPattern (String,String)中的规则。 | 字符串 | |
| camel.rest.api-context-listing | 弃用了 设置是否启用了 JVM 中带有 REST 服务的所有可用 CamelContext 的列表。如果启用它允许发现这些上下文,如果为 false,则只使用当前的 CamelContext。 | false | 布尔值 |
第 68 章 ExchangeProperty
ExchangeProperty Expression Language 允许您提取命名交换属性的值。
68.1. Exchange Property 选项
ExchangeProperty 语言支持 1 选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| trim |
| 是否修剪值以移除前导和尾随空格和换行符。 |
68.2. 示例
接收者List EIP 可以使用如下交换属性:
<route>
<from uri="direct:a" />
<recipientList>
<exchangeProperty>myProperty</exchangeProperty>
</recipientList>
</route>在这种情况下,接收者列表包含在属性 'myProperty' 中。
以及 Java DSL 中的同一示例:
from("direct:a").recipientList(exchangeProperty("myProperty"));68.3. 依赖项
ExchangeProperty 语言是 camel-core 的一部分。
68.4. Spring Boot Auto-Configuration
在 Spring Boot 中使用 exchangeProperty 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-core-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 147 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.cloud.consul.service-discovery.acl-token | 设置要与 Consul 一起使用的 ACL 令牌。 | 字符串 | |
| camel.cloud.consul.service-discovery.block-seconds | 等待监视事件的秒数,默认为 10 秒。 | 10 | 整数 |
| camel.cloud.consul.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.consul.service-discovery.connect-timeout-millis | OkHttpClient 的连接超时。 | Long | |
| camel.cloud.consul.service-discovery.datacenter | 数据中心。 | 字符串 | |
| camel.cloud.consul.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.consul.service-discovery.password | 设置用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.consul.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.consul.service-discovery.read-timeout-millis | OkHttpClient 的读取超时。 | Long | |
| camel.cloud.consul.service-discovery.url | Consul 代理 URL。 | 字符串 | |
| camel.cloud.consul.service-discovery.user-name | 设置用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.consul.service-discovery.write-timeout-millis | OkHttpClient 的写入超时。 | Long | |
| camel.cloud.dns.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.dns.service-discovery.domain | 域名; | 字符串 | |
| camel.cloud.dns.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.dns.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.dns.service-discovery.proto | 所需服务的传输协议。 | _tcp | 字符串 |
| camel.cloud.etcd.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.etcd.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.etcd.service-discovery.password | 用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.etcd.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.etcd.service-discovery.service-path | 用于查找服务发现的路径。 | /services/ | 字符串 |
| camel.cloud.etcd.service-discovery.timeout | 要设置操作完成的最长时间。 | Long | |
| camel.cloud.etcd.service-discovery.type | 要设置发现类型,有效的值为 on-demand 和 watch。 | 按需 | 字符串 |
| camel.cloud.etcd.service-discovery.uris | 客户端可以连接的 URI。 | 字符串 | |
| camel.cloud.etcd.service-discovery.user-name | 用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.api-version | 使用客户端查找时设置 API 版本。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-data | 使用客户端查找时设置证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-file | 设置在使用客户端查找时从文件加载的证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-data | 使用客户端查找时设置客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-file | 设置在使用客户端查找时从文件加载的客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-algo | 在使用客户端查找时设置客户端密钥存储算法,如 RSA。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-data | 在使用客户端查找时设置 Client Keystore 数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-file | 设置在使用客户端查找时从文件加载的客户端密钥存储数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-passphrase | 在使用客户端查找时设置客户端密钥存储密码短语。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.kubernetes.service-discovery.dns-domain | 设置用于 DNS 查找的 DNS 域。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.kubernetes.service-discovery.lookup | 如何执行服务查找。可能的值: client, dns, environment。在使用客户端时,客户端查询 kubernetes master 以获取提供服务的活动 pod 列表,然后随机(或循环)选择一个 pod。使用 dns 时,服务名称被解析为 name.namespace.svc.dnsDomain。当使用 dnssrv 时,服务名称通过 SRV 查询解析 .…svc… when 使用环境变量来查找该服务。默认情况下使用环境。 | 环境 | 字符串 |
| camel.cloud.kubernetes.service-discovery.master-url | 使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用 ENV 变量 KUBERNETES_MASTER 中的 namespace。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.oauth-token | 在使用客户端查找时,设置用于身份验证的 OAUTH 令牌(而不是用户名/密码)。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.password | 在使用客户端查找时,设置用于身份验证的密码。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-name | 设置 DNS/DNSSRV 查找时使用的端口名称。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-protocol | 设置用于 DNS/DNSSRV 查找的端口协议。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.kubernetes.service-discovery.trust-certs | 设置在使用客户端查找时是否打开信任证书检查。 | false | 布尔值 |
| camel.cloud.kubernetes.service-discovery.username | 在使用客户端查找时,设置用于身份验证的用户名。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.client-name | 设置 Ribbon 客户端名称。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.configurations | 定义其他配置定义。 | map | |
| camel.cloud.ribbon.load-balancer.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.ribbon.load-balancer.namespace | 命名空间。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.password | 密码。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.ribbon.load-balancer.username | 用户名。 | 字符串 | |
| camel.hystrix.allow-maximum-size-to-diverge-from-core-size | 允许配置 maximumSize 生效。然后该值可以等于或大于 coreSize。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-enabled | 是否使用 HystrixCircuitBreaker。如果为 false,则将使用 断路器 逻辑,并且允许的所有请求。这与 circuitBreakerForceClosed ()类似,除了继续跟踪指标并知道它是否应该处于打开/关闭状态外,此属性也不会实例化断路器。 | true | 布尔值 |
| camel.hystrix.circuit-breaker-error-threshold-percentage | 错误百分比阈值(如 50)指向断路器将开放和拒绝请求。它将保持在 circuitBreakerSleepWindowInMilliseconds 中定义的持续时间;与 HystrixCommandMetrics.getHealthCounts ()进行比较的错误百分比。 | 50 | 整数 |
| camel.hystrix.circuit-breaker-force-closed | 如果为 true,HystrixCircuitBreaker#allowRequest ()将始终返回 true 以允许请求,而不考虑 HystrixCommandMetrics.getHealthCounts ()中的错误百分比。circuitBreakerForceOpen ()属性具有优先权,因此如果设为 true,则此属性不会执行。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(条带)并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-request-volume-threshold | 指标RollingStatisticalWindowInMilliseconds ()中必须存在于 HystrixCircuitBreaker 的最小请求数。如果在这个数量下,无论错误百分比如何,电路不会条带化。 | 20 | 整数 |
| camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreakertrips 打开 HystrixCircuitBreaker 往返时间(以毫秒为单位),在尝试请求前应等待的时间(毫秒)。 | 5000 | 整数 |
| camel.hystrix.configurations | 定义其他配置定义。 | map | |
| camel.hystrix.core-pool-size | 传递给 java.util.concurrent.ThreadPoolExecutor#setCorePoolSize (int)的核心 thread-pool 大小。 | 10 | 整数 |
| camel.hystrix.enabled | 启用组件。 | true | 布尔值 |
| camel.hystrix.execution-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.run ()的并发请求数。超出并发限制的请求将被拒绝。Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | 整数 |
| camel.hystrix.execution-isolation-strategy | 将通过以下方式执行哪些隔离策略 HystrixCommand.run ():如果 THREAD,它将在单独的线程上执行,并且并发请求受 thread-pool 中的线程数量限制。如果 SEMAPHORE,它将在调用线程上执行,并且由 semaphore 数限制的并发请求。 | 线程 | 字符串 |
| camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 Future# canceled )。仅在 executionIsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
| camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
| camel.hystrix.execution-timeout-in-milliseconds | 命令超时并停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 并且命令是 thread-isolated,则执行线程将中断。如果命令是 semaphore-isolated 和 HystrixObservableCommand,则该命令将被取消订阅。 | 1000 | 整数 |
| camel.hystrix.fallback-enabled | 出现故障时是否应该尝试 HystrixCommand.getFallback ()。 | true | 布尔值 |
| camel.hystrix.fallback-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.getFallback ()的并发请求数。超出并发限制的请求将很快失败,且不会尝试检索回退。 | 10 | 整数 |
| camel.hystrix.group-key | 设置要使用的组密钥。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
| camel.hystrix.keep-alive-time | keep-alive 时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
| camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会意外地更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
| camel.hystrix.maximum-size | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) .这是在没有开始拒绝 HystrixCommands 的情况下支持的最大并发数。请注意,只有在您还设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
| camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 允许计算成功和错误百分比并影响 HystrixCircuitBreaker.isOpen ()状态的健康快照之间等待的时间(毫秒)。在高容量电路上,错误百分比的持续计算可能会成为 CPU 密集型,从而控制它计算的频率。 | 500 | 整数 |
| camel.hystrix.metrics-rolling-percentile-bucket-size | 存储在滚动百分比的每个存储桶中的最大值数。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 在 HystrixCommandMetrics 中捕获百分比的指标。 | true | 布尔值 |
| camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动百分比窗口的 bucket 数量已分为.这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 6 | 整数 |
| camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的百分比滚动窗口。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10000 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这传递到 HystrixCommandMetrics 中的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-in-milliseconds | 此属性设置统计滚动窗口的持续时间,以毫秒为单位。这是为线程池保留指标的时间。窗口被分成 bucket,按这些递增来滚动。 | 10000 | 整数 |
| camel.hystrix.queue-size-rejection-threshold | 队列大小拒绝阈值是一个人为最大大小,即使未达到 maxQueueSize,也会发生拒绝的大小。这是因为 BlockingQueue 的 maxQueueSize 无法动态更改,我们希望支持动态更改会影响拒绝的队列大小。在排队线程执行时,HystrixCommand 使用它。 | 5 | 整数 |
| camel.hystrix.request-log-enabled | HystrixCommand 执行和事件是否应记录到 HystrixRequestLog。 | true | 布尔值 |
| camel.hystrix.thread-pool-key | 设置要使用的线程池密钥。默认情况下,将使用与 groupKey 相同的值。 | CamelHystrix | 字符串 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-in-milliseconds | 统计滚动窗口的持续时间(以毫秒为单位)。这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10000 | 整数 |
| camel.language.constant.enabled | 是否启用恒定语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.constant.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.csimple.enabled | 是否启用 csimple 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.csimple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.exchangeproperty.enabled | 是否启用 ExchangeProperty 语言自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.exchangeproperty.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.file.enabled | 是否启用文件语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.file.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.header.enabled | 是否启用标头语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.header.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.ref.enabled | 是否启用 ref 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.ref.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.simple.enabled | 是否启用简单语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.simple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.tokenize.enabled | 是否启用令牌语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.tokenize.group-delimiter | 设置分组时要使用的分隔符。如果没有设置,则令牌将用作分隔符。 | 字符串 | |
| camel.language.tokenize.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.resilience4j.automatic-transition-from-open-to-half-open-enabled | 在 waitDurationInOpenState 通过后,启用从 OPEN 自动过渡到 HALF_OPEN 状态。 | false | 布尔值 |
| camel.resilience4j.circuit-breaker-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreaker 实例,以便从 registry 查找和使用。在使用它时,不使用任何其他断路器选项。 | 字符串 | |
| camel.resilience4j.config-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreakerConfig 实例,用于从 registry 查找和使用。 | 字符串 | |
| camel.resilience4j.configurations | 定义其他配置定义。 | map | |
| camel.resilience4j.enabled | 启用组件。 | true | 布尔值 |
| camel.resilience4j.failure-rate-threshold | 配置故障率阈值(以百分比表示)。如果失败率相等或大于 CircuitBreaker 转换的阈值,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 50 个百分比。 | 浮点值 | |
| camel.resilience4j.minimum-number-of-calls | 配置 CircuitBreaker 可以计算错误率前所需的最少调用数(每个滑动窗口期限)。例如,如果 minimumNumberOfCalls 为 10,则必须记录至少 10 个调用,然后才能计算失败率。如果只记录 9 个调用,则 CircuitBreaker 不会过渡到 open,即使所有 9 调用都失败。默认 minimumNumberOfCalls 为 100。 | 100 | 整数 |
| camel.resilience4j.permitted-number-of-calls-in-half-open-state | 当 CircuitBreaker 为一半打开时,配置允许的调用数量。大小必须大于 0。默认大小为 10。 | 10 | 整数 |
| camel.resilience4j.sliding-window-size | 配置 sliding 窗口的大小,用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置 sliding 窗口的大小。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。slidingWindowSize 必须大于 0。minimumNumberOfCalls 必须大于 0。如果 slidingWindowType 是 COUNT_BASED,则 minimumNumberOfCalls 无法大于 slidingWindowSize。如果 slidingWindowType 是 TIME_BASED,您可以选择任何您想要的。默认 slidingWindowSize 为 100。 | 100 | 整数 |
| camel.resilience4j.sliding-window-type | 配置 sliding 窗口的类型,用于在 CircuitBreaker 关闭时记录调用的结果。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。默认 slidingWindowType 为 COUNT_BASED。 | COUNT_BASED | 字符串 |
| camel.resilience4j.slow-call-duration-threshold | 配置上面的持续时间阈值(秒),其调用被视为较慢,并增加较慢的调用百分比。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.slow-call-rate-threshold | 配置一个阈值(以百分比表示)。当调用持续时间大于 slowCallDurationThreshold Duration 时,CircuitBreaker 会将一个调用视为 slowCallDurationThreshold Duration。当较慢的调用百分比相等或大于阈值时,CircuitBreaker 过渡到 open,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 100 百分比,这意味着所有记录的调用都必须比 slowCallDurationThreshold 慢。 | 浮点值 | |
| camel.resilience4j.wait-duration-in-open-state | 配置等待持续时间(以秒为单位),用于指定 CircuitBreaker 应该打开的时间,然后再切换到一半打开。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.writable-stack-trace-enabled | 启用可写堆栈跟踪。当设置为 false 时,Exception.getStackTrace 返回零长度数组。当断路器处于开路时,这可用于减少日志垃圾邮件,因为已经知道例外原因(断路器是短路调用)。 | true | 布尔值 |
| camel.rest.api-component | 用作 REST API (如 swagger)的 Camel 组件的名称(如 swagger)没有明确配置 API 组件,则 Camel 组件将查找,如果 registry 中注册了 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.api-context-path | 设置领先的 API 上下文路径,即 REST API 服务要使用的路径。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。 | 字符串 | |
| camel.rest.api-context-route-id | 设置路由 id,以用于服务 REST API 的路由。路由默认使用自动分配的路由 ID。 | 字符串 | |
| camel.rest.api-host | 要将特定主机名用于 API 文档(如 swagger),可以使用这个配置的主机名覆盖生成的主机。 | 字符串 | |
| camel.rest.api-property | 允许为 api 文档(swagger)配置任意数量的附加属性。例如,将属性 api.title 设置为我的冷却。 | map | |
| camel.rest.api-vendor-extension | 在 Rest API 中是否启用了供应商扩展。如果启用,Camel 将包括附加信息作为厂商扩展(如以 x- 开头的密钥),如路由 ID、类名称等。在导入 API 文档时,并非所有第三方 API 网关和工具都支持 vendor-extensions。 | false | 布尔值 |
| camel.rest.binding-mode | 设置要使用的绑定模式。默认值为 off。 | RestBindingMode | |
| camel.rest.client-request-validation | 是否启用客户端请求的验证,以检查客户端的 Content-Type 和 Accept 标头是否受其消耗/生成的设置的 Rest-DSL 配置支持。这可打开,以启用此检查。如果验证错误,则返回 HTTP Status Code 415 或 406。默认值为 false。 | false | 布尔值 |
| camel.rest.component | 用于 REST 传输(使用者)的 Camel Rest 组件,如 netty-http, jetty, servlet, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.component-property | 允许为正在使用的其余组件配置更多附加属性。 | map | |
| camel.rest.consumer-property | 允许为正在使用的其余使用者配置更多附加属性。 | map | |
| camel.rest.context-path | 设置 REST 服务将使用的前导 context-path。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。或用于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
| camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | map | |
| camel.rest.data-format-property | 允许为使用中的数据格式配置任意数量的附加属性。例如,将 property prettyPrint 设置为 true 以将 json 输出设置为 pretty 模式。属性可以加上前缀,表示选项仅适用于 JSON 或 XML,对于 IN 或 OUT。前缀为: json.in. json.out. xml.in. xml.out。例如,值为 xml.out.mustBeJAXBElement 的键仅适用于传出的 XML 数据格式。没有前缀的密钥是所有情况的通用键。 | map | |
| camel.rest.enable-cors | 是否在 HTTP 响应中启用 CORS 标头。默认值为 false。 | false | 布尔值 |
| camel.rest.endpoint-property | 允许为正在使用的其余端点配置更多附加属性。 | map | |
| camel.rest.host | 用于公开 REST 服务的主机名。 | 字符串 | |
| camel.rest.host-name-resolver | 如果没有配置主机名,则使用此解析器计算 REST 服务将使用的主机名。 | RestHostNameResolver | |
| camel.rest.json-data-format | 要使用的特定 json 数据格式的名称。默认情况下将使用 json-jackson。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.port | 用于公开 REST 服务的端口号。请注意,如果您使用 servlet 组件,则此处配置的端口号不适用,因为使用中的端口号是 servlet 组件使用的实际端口号。例如,使用 Apache Tomcat 将其 tomcat http 端口用于 tomcat http 端口(如果在 firewall 中默认使用端口 8181 )虽然在这些情况下,这里设置端口号,但允许工具和 JMX 知道端口号,因此建议将端口号设置为 servlet 引擎使用的数字。 | 字符串 | |
| camel.rest.producer-api-doc | 设置 REST 制作者将用来验证 REST uri 和查询参数的 api 文档(swagger api)的位置,对 api 文档相应地生效。这需要将 camel-swagger-java 添加到 classpath 中,任何未命中配置都让 Camel 在启动时失败并报告错误。默认情况下,api 文档的位置从类路径加载,但您可以使用 file: 或 http: 引用从文件或 http url 加载的资源。 | 字符串 | |
| camel.rest.producer-component | 设置要用作 REST producer 的 Camel 组件的名称。 | 字符串 | |
| camel.rest.scheme | 用于公开 REST 服务的方案。通常支持 http 或 https。默认值为 http。 | 字符串 | |
| camel.rest.skip-binding-on-error-code | 如果存在自定义 HTTP 错误代码标头,是否跳过输出绑定。这允许构建不绑定到 json / xml 等自定义错误消息,否则成功信息会这样做。 | false | 布尔值 |
| camel.rest.use-x-forward-headers | 是否将 X-Forward 标头用于主机和相关设置。默认值为 true。 | true | 布尔值 |
| camel.rest.xml-data-format | 要使用的特定 XML 数据格式的名称。默认情况下将使用 jaxb。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.api-context-id-pattern | 弃用了 CamelContext id 模式,以只允许 CamelContext 中名称与模式匹配的其他服务的 Rest API。模式 名称 指的是 CamelContext 名称,仅匹配当前的 CamelContext。对于任何其他值,模式使用 PatternHelper#matchPattern (String,String)中的规则。 | 字符串 | |
| camel.rest.api-context-listing | 弃用了 设置是否启用了 JVM 中带有 REST 服务的所有可用 CamelContext 的列表。如果启用它允许发现这些上下文,如果为 false,则只使用当前的 CamelContext。 | false | 布尔值 |
第 69 章 File
文件表达式语言是语言的扩展,添加文件相关功能。这些功能与使用文件路径和名称的常见用例相关。目标是允许表达式与
用于为消费者和生产者设置动态文件模式的组件。
文件语言与语言合并,这意味着您可以在简单语言中直接使用所有文件语法。
69.1. 文件语言选项
文件语言支持 2 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| resultType |
| 设置结果类型的类名称(从输出中键入)。 | |
| trim |
| 是否修剪值以移除前导和尾随空格和换行符。 |
69.2. 语法
此语言是该语言的 扩展,因此也会应用语法。因此,下表仅列出其他与文件相关的功能。
所有文件令牌都使用与 java.io.File 对象上的方法相同的表达式名称,用于实例 文件:absolute 是指 java.io.File.getAbsolute () 方法。请注意,当前交换不支持所有表达式。例如,组件支持一些选项,而 File 组件支持所有选项。
| 表达式 | 类型 | file Consumer | 文件 Producer | FTP Consumer | FTP Producer | 描述 |
|---|---|---|---|---|---|---|
| file:name | 字符串 | 是 | 否 | 是 | 否 | 指的是文件名(相对于起始目录,请参见下文) |
| file:name.ext | 字符串 | 是 | 否 | 是 | 否 | 仅引用文件扩展 |
| file:name.ext.single | 字符串 | 是 | 否 | 是 | 否 | 指的是文件扩展名。如果文件扩展名有多个点,则此表达式将剥离,并且仅返回最后一个部分。 |
| file:name.noext | 字符串 | 是 | 否 | 是 | 否 | 代表没有扩展名的文件名(相对于起始目录,请参考下面的注释) |
| file:name.noext.single | 字符串 | 是 | 否 | 是 | 否 | 代表没有扩展名的文件名(相对于起始目录,请参考下面的注释)。如果文件扩展有多个点,则此表达式只剥离最后一个部分,并保留其他部分。 |
| file:onlyname | 字符串 | 是 | 否 | 是 | 否 | 仅引用没有前导路径的文件名。 |
| file:onlyname.noext | 字符串 | 是 | 否 | 是 | 否 | 仅引用没有扩展名的文件名,没有前导路径。 |
| file:onlyname.noext.single | 字符串 | 是 | 否 | 是 | 否 | 仅引用没有扩展名的文件名,没有前导路径。如果文件扩展有多个点,则此表达式只剥离最后一个部分,并保留其他部分。 |
| file:ext | 字符串 | 是 | 否 | 是 | 否 | 仅引用文件扩展 |
| file:parent | 字符串 | 是 | 否 | 是 | 否 | 指的是文件父项 |
| file:path | 字符串 | 是 | 否 | 是 | 否 | 指的是文件路径 |
| file:absolute | 布尔值 | 是 | 否 | 否 | 否 | 指示该文件是否被视为绝对或相对 |
| file:absolute.path | 字符串 | 是 | 否 | 否 | 否 | 指的是绝对路径 |
| file:length | Long | 是 | 否 | 是 | 否 | 将文件长度指定为 Long 类型 |
| file:size | Long | 是 | 否 | 是 | 否 | 将文件长度指定为 Long 类型 |
| file:modified | Date | 是 | 否 | 是 | 否 | 指的是最后修改的文件作为日期类型 |
| date:_command:pattern_ | 字符串 | 是 | 是 | 是 | 是 |
对于使用 |
69.3. 文件令牌示例
69.3.1. 相对路径
在以下 相对 目录中,我们有一个 java.io.File handle for the file hello.txt : .\filelanguage\test。并且我们将端点配置为使用此起始目录 .\filelanguage。文件令牌将返回:
| 表达式 | 返回 |
|---|---|
| file:name | test\hello.txt |
| file:name.ext | txt |
| file:name.noext | test\hello |
| file:onlyname | hello.txt |
| file:onlyname.noext | hello |
| file:ext | txt |
| file:parent | filelanguage\test |
| file:path | filelanguage\test\hello.txt |
| file:absolute | false |
| file:absolute.path | \workspace\camel\camel-core\target\filelanguage\test\hello.txt |
69.3.2. 绝对路径
在以下 绝对 目录中为 hello.txt 文件有一个 java.io.File handle: \workspace\camel\camel-core\target\filelanguage\test。我们将端点配置为使用绝对起始目录 \workspace\camel\camel-core\target\filelanguage。文件令牌将返回:
| 表达式 | 返回 |
|---|---|
| file:name | test\hello.txt |
| file:name.ext | txt |
| file:name.noext | test\hello |
| file:onlyname | hello.txt |
| file:onlyname.noext | hello |
| file:ext | txt |
| file:parent | \workspace\camel\camel-core\target\filelanguage\test |
| file:path | \workspace\camel\camel-core\target\filelanguage\test\hello.txt |
| file:absolute | true |
| file:absolute.path | \workspace\camel\camel-core\target\filelanguage\test\hello.txt |
69.4. Samples
您可以输入固定的文件名,如 myfile.txt :
fileName="myfile.txt"
我们假设我们使用文件消费者读取文件,并希望将读取文件移至文件夹,并以当前日期作为子文件夹来备份文件夹。这可以通过以下表达式来完成:
fileName="backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"
也支持相对文件夹名称,因此假设备份文件夹应当是同级文件夹,然后您可以附加 . .。 如下所示:
fileName="../backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"因为这是我们从此语言访问所有好的语言的扩展,因此,在这种用例中,我们希望使用 in.header.type 作为动态表达式中的参数:
fileName="../backup/${date:now:yyyyMMdd}/type-${in.header.type}/backup-of-${file:name.noext}.bak"如果您在表达式中有一个自定义日期,则 Camel 支持从消息标头中检索日期:
fileName="orders/order-${in.header.customerId}-${date:in.header.orderDate:yyyyMMdd}.xml"最后,我们还可使用 bean 表达式来调用 POJO 类,该类会生成一些字符串输出(或转换为字符串):
fileName="uniquefile-${bean:myguidgenerator.generateid}.txt"当然,这在一个表达式中可以合并,您可以在一个组合表达式中使用 和 语言。这对这些常见的文件路径模式非常强大。
69.5. 依赖项
文件语言是 camel-core 的一部分。
69.6. Spring Boot Auto-Configuration
当将文件与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-core-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 147 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.cloud.consul.service-discovery.acl-token | 设置要与 Consul 一起使用的 ACL 令牌。 | 字符串 | |
| camel.cloud.consul.service-discovery.block-seconds | 等待监视事件的秒数,默认为 10 秒。 | 10 | 整数 |
| camel.cloud.consul.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.consul.service-discovery.connect-timeout-millis | OkHttpClient 的连接超时。 | Long | |
| camel.cloud.consul.service-discovery.datacenter | 数据中心。 | 字符串 | |
| camel.cloud.consul.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.consul.service-discovery.password | 设置用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.consul.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.consul.service-discovery.read-timeout-millis | OkHttpClient 的读取超时。 | Long | |
| camel.cloud.consul.service-discovery.url | Consul 代理 URL。 | 字符串 | |
| camel.cloud.consul.service-discovery.user-name | 设置用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.consul.service-discovery.write-timeout-millis | OkHttpClient 的写入超时。 | Long | |
| camel.cloud.dns.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.dns.service-discovery.domain | 域名; | 字符串 | |
| camel.cloud.dns.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.dns.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.dns.service-discovery.proto | 所需服务的传输协议。 | _tcp | 字符串 |
| camel.cloud.etcd.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.etcd.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.etcd.service-discovery.password | 用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.etcd.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.etcd.service-discovery.service-path | 用于查找服务发现的路径。 | /services/ | 字符串 |
| camel.cloud.etcd.service-discovery.timeout | 要设置操作完成的最长时间。 | Long | |
| camel.cloud.etcd.service-discovery.type | 要设置发现类型,有效的值为 on-demand 和 watch。 | 按需 | 字符串 |
| camel.cloud.etcd.service-discovery.uris | 客户端可以连接的 URI。 | 字符串 | |
| camel.cloud.etcd.service-discovery.user-name | 用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.api-version | 使用客户端查找时设置 API 版本。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-data | 使用客户端查找时设置证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-file | 设置在使用客户端查找时从文件加载的证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-data | 使用客户端查找时设置客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-file | 设置在使用客户端查找时从文件加载的客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-algo | 在使用客户端查找时设置客户端密钥存储算法,如 RSA。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-data | 在使用客户端查找时设置 Client Keystore 数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-file | 设置在使用客户端查找时从文件加载的客户端密钥存储数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-passphrase | 在使用客户端查找时设置客户端密钥存储密码短语。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.kubernetes.service-discovery.dns-domain | 设置用于 DNS 查找的 DNS 域。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.kubernetes.service-discovery.lookup | 如何执行服务查找。可能的值: client, dns, environment。在使用客户端时,客户端查询 kubernetes master 以获取提供服务的活动 pod 列表,然后随机(或循环)选择一个 pod。使用 dns 时,服务名称被解析为 name.namespace.svc.dnsDomain。当使用 dnssrv 时,服务名称通过 SRV 查询解析 .…svc… when 使用环境变量来查找该服务。默认情况下使用环境。 | 环境 | 字符串 |
| camel.cloud.kubernetes.service-discovery.master-url | 使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用 ENV 变量 KUBERNETES_MASTER 中的 namespace。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.oauth-token | 在使用客户端查找时,设置用于身份验证的 OAUTH 令牌(而不是用户名/密码)。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.password | 在使用客户端查找时,设置用于身份验证的密码。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-name | 设置 DNS/DNSSRV 查找时使用的端口名称。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-protocol | 设置用于 DNS/DNSSRV 查找的端口协议。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.kubernetes.service-discovery.trust-certs | 设置在使用客户端查找时是否打开信任证书检查。 | false | 布尔值 |
| camel.cloud.kubernetes.service-discovery.username | 在使用客户端查找时,设置用于身份验证的用户名。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.client-name | 设置 Ribbon 客户端名称。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.configurations | 定义其他配置定义。 | map | |
| camel.cloud.ribbon.load-balancer.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.ribbon.load-balancer.namespace | 命名空间。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.password | 密码。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.ribbon.load-balancer.username | 用户名。 | 字符串 | |
| camel.hystrix.allow-maximum-size-to-diverge-from-core-size | 允许配置 maximumSize 生效。然后该值可以等于或大于 coreSize。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-enabled | 是否使用 HystrixCircuitBreaker。如果为 false,则将使用 断路器 逻辑,并且允许的所有请求。这与 circuitBreakerForceClosed ()类似,除了继续跟踪指标并知道它是否应该处于打开/关闭状态外,此属性也不会实例化断路器。 | true | 布尔值 |
| camel.hystrix.circuit-breaker-error-threshold-percentage | 错误百分比阈值(如 50)指向断路器将开放和拒绝请求。它将保持在 circuitBreakerSleepWindowInMilliseconds 中定义的持续时间;与 HystrixCommandMetrics.getHealthCounts ()进行比较的错误百分比。 | 50 | 整数 |
| camel.hystrix.circuit-breaker-force-closed | 如果为 true,HystrixCircuitBreaker#allowRequest ()将始终返回 true 以允许请求,而不考虑 HystrixCommandMetrics.getHealthCounts ()中的错误百分比。circuitBreakerForceOpen ()属性具有优先权,因此如果设为 true,则此属性不会执行。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(条带)并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-request-volume-threshold | 指标RollingStatisticalWindowInMilliseconds ()中必须存在于 HystrixCircuitBreaker 的最小请求数。如果在这个数量下,无论错误百分比如何,电路不会条带化。 | 20 | 整数 |
| camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreakertrips 打开 HystrixCircuitBreaker 往返时间(以毫秒为单位),在尝试请求前应等待的时间(毫秒)。 | 5000 | 整数 |
| camel.hystrix.configurations | 定义其他配置定义。 | map | |
| camel.hystrix.core-pool-size | 传递给 java.util.concurrent.ThreadPoolExecutor#setCorePoolSize (int)的核心 thread-pool 大小。 | 10 | 整数 |
| camel.hystrix.enabled | 启用组件。 | true | 布尔值 |
| camel.hystrix.execution-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.run ()的并发请求数。超出并发限制的请求将被拒绝。Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | 整数 |
| camel.hystrix.execution-isolation-strategy | 将通过以下方式执行哪些隔离策略 HystrixCommand.run ():如果 THREAD,它将在单独的线程上执行,并且并发请求受 thread-pool 中的线程数量限制。如果 SEMAPHORE,它将在调用线程上执行,并且由 semaphore 数限制的并发请求。 | 线程 | 字符串 |
| camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 Future# canceled )。仅在 executionIsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
| camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
| camel.hystrix.execution-timeout-in-milliseconds | 命令超时并停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 并且命令是 thread-isolated,则执行线程将中断。如果命令是 semaphore-isolated 和 HystrixObservableCommand,则该命令将被取消订阅。 | 1000 | 整数 |
| camel.hystrix.fallback-enabled | 出现故障时是否应该尝试 HystrixCommand.getFallback ()。 | true | 布尔值 |
| camel.hystrix.fallback-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.getFallback ()的并发请求数。超出并发限制的请求将很快失败,且不会尝试检索回退。 | 10 | 整数 |
| camel.hystrix.group-key | 设置要使用的组密钥。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
| camel.hystrix.keep-alive-time | keep-alive 时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
| camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会意外地更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
| camel.hystrix.maximum-size | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) .这是在没有开始拒绝 HystrixCommands 的情况下支持的最大并发数。请注意,只有在您还设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
| camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 允许计算成功和错误百分比并影响 HystrixCircuitBreaker.isOpen ()状态的健康快照之间等待的时间(毫秒)。在高容量电路上,错误百分比的持续计算可能会成为 CPU 密集型,从而控制它计算的频率。 | 500 | 整数 |
| camel.hystrix.metrics-rolling-percentile-bucket-size | 存储在滚动百分比的每个存储桶中的最大值数。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 在 HystrixCommandMetrics 中捕获百分比的指标。 | true | 布尔值 |
| camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动百分比窗口的 bucket 数量已分为.这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 6 | 整数 |
| camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的百分比滚动窗口。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10000 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这传递到 HystrixCommandMetrics 中的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-in-milliseconds | 此属性设置统计滚动窗口的持续时间,以毫秒为单位。这是为线程池保留指标的时间。窗口被分成 bucket,按这些递增来滚动。 | 10000 | 整数 |
| camel.hystrix.queue-size-rejection-threshold | 队列大小拒绝阈值是一个人为最大大小,即使未达到 maxQueueSize,也会发生拒绝的大小。这是因为 BlockingQueue 的 maxQueueSize 无法动态更改,我们希望支持动态更改会影响拒绝的队列大小。在排队线程执行时,HystrixCommand 使用它。 | 5 | 整数 |
| camel.hystrix.request-log-enabled | HystrixCommand 执行和事件是否应记录到 HystrixRequestLog。 | true | 布尔值 |
| camel.hystrix.thread-pool-key | 设置要使用的线程池密钥。默认情况下,将使用与 groupKey 相同的值。 | CamelHystrix | 字符串 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-in-milliseconds | 统计滚动窗口的持续时间(以毫秒为单位)。这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10000 | 整数 |
| camel.language.constant.enabled | 是否启用恒定语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.constant.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.csimple.enabled | 是否启用 csimple 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.csimple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.exchangeproperty.enabled | 是否启用 ExchangeProperty 语言自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.exchangeproperty.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.file.enabled | 是否启用文件语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.file.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.header.enabled | 是否启用标头语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.header.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.ref.enabled | 是否启用 ref 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.ref.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.simple.enabled | 是否启用简单语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.simple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.tokenize.enabled | 是否启用令牌语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.tokenize.group-delimiter | 设置分组时要使用的分隔符。如果没有设置,则令牌将用作分隔符。 | 字符串 | |
| camel.language.tokenize.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.resilience4j.automatic-transition-from-open-to-half-open-enabled | 在 waitDurationInOpenState 通过后,启用从 OPEN 自动过渡到 HALF_OPEN 状态。 | false | 布尔值 |
| camel.resilience4j.circuit-breaker-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreaker 实例,以便从 registry 查找和使用。在使用它时,不使用任何其他断路器选项。 | 字符串 | |
| camel.resilience4j.config-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreakerConfig 实例,用于从 registry 查找和使用。 | 字符串 | |
| camel.resilience4j.configurations | 定义其他配置定义。 | map | |
| camel.resilience4j.enabled | 启用组件。 | true | 布尔值 |
| camel.resilience4j.failure-rate-threshold | 配置故障率阈值(以百分比表示)。如果失败率相等或大于 CircuitBreaker 转换的阈值,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 50 个百分比。 | 浮点值 | |
| camel.resilience4j.minimum-number-of-calls | 配置 CircuitBreaker 可以计算错误率前所需的最少调用数(每个滑动窗口期限)。例如,如果 minimumNumberOfCalls 为 10,则必须记录至少 10 个调用,然后才能计算失败率。如果只记录 9 个调用,则 CircuitBreaker 不会过渡到 open,即使所有 9 调用都失败。默认 minimumNumberOfCalls 为 100。 | 100 | 整数 |
| camel.resilience4j.permitted-number-of-calls-in-half-open-state | 当 CircuitBreaker 为一半打开时,配置允许的调用数量。大小必须大于 0。默认大小为 10。 | 10 | 整数 |
| camel.resilience4j.sliding-window-size | 配置 sliding 窗口的大小,用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置 sliding 窗口的大小。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。slidingWindowSize 必须大于 0。minimumNumberOfCalls 必须大于 0。如果 slidingWindowType 是 COUNT_BASED,则 minimumNumberOfCalls 无法大于 slidingWindowSize。如果 slidingWindowType 是 TIME_BASED,您可以选择任何您想要的。默认 slidingWindowSize 为 100。 | 100 | 整数 |
| camel.resilience4j.sliding-window-type | 配置 sliding 窗口的类型,用于在 CircuitBreaker 关闭时记录调用的结果。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。默认 slidingWindowType 为 COUNT_BASED。 | COUNT_BASED | 字符串 |
| camel.resilience4j.slow-call-duration-threshold | 配置上面的持续时间阈值(秒),其调用被视为较慢,并增加较慢的调用百分比。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.slow-call-rate-threshold | 配置一个阈值(以百分比表示)。当调用持续时间大于 slowCallDurationThreshold Duration 时,CircuitBreaker 会将一个调用视为 slowCallDurationThreshold Duration。当较慢的调用百分比相等或大于阈值时,CircuitBreaker 过渡到 open,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 100 百分比,这意味着所有记录的调用都必须比 slowCallDurationThreshold 慢。 | 浮点值 | |
| camel.resilience4j.wait-duration-in-open-state | 配置等待持续时间(以秒为单位),用于指定 CircuitBreaker 应该打开的时间,然后再切换到一半打开。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.writable-stack-trace-enabled | 启用可写堆栈跟踪。当设置为 false 时,Exception.getStackTrace 返回零长度数组。当断路器处于开路时,这可用于减少日志垃圾邮件,因为已经知道例外原因(断路器是短路调用)。 | true | 布尔值 |
| camel.rest.api-component | 用作 REST API (如 swagger)的 Camel 组件的名称(如 swagger)没有明确配置 API 组件,则 Camel 组件将查找,如果 registry 中注册了 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.api-context-path | 设置领先的 API 上下文路径,即 REST API 服务要使用的路径。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。 | 字符串 | |
| camel.rest.api-context-route-id | 设置路由 id,以用于服务 REST API 的路由。路由默认使用自动分配的路由 ID。 | 字符串 | |
| camel.rest.api-host | 要将特定主机名用于 API 文档(如 swagger),可以使用这个配置的主机名覆盖生成的主机。 | 字符串 | |
| camel.rest.api-property | 允许为 api 文档(swagger)配置任意数量的附加属性。例如,将属性 api.title 设置为我的冷却。 | map | |
| camel.rest.api-vendor-extension | 在 Rest API 中是否启用了供应商扩展。如果启用,Camel 将包括附加信息作为厂商扩展(如以 x- 开头的密钥),如路由 ID、类名称等。在导入 API 文档时,并非所有第三方 API 网关和工具都支持 vendor-extensions。 | false | 布尔值 |
| camel.rest.binding-mode | 设置要使用的绑定模式。默认值为 off。 | RestBindingMode | |
| camel.rest.client-request-validation | 是否启用客户端请求的验证,以检查客户端的 Content-Type 和 Accept 标头是否受其消耗/生成的设置的 Rest-DSL 配置支持。这可打开,以启用此检查。如果验证错误,则返回 HTTP Status Code 415 或 406。默认值为 false。 | false | 布尔值 |
| camel.rest.component | 用于 REST 传输(使用者)的 Camel Rest 组件,如 netty-http, jetty, servlet, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.component-property | 允许为正在使用的其余组件配置更多附加属性。 | map | |
| camel.rest.consumer-property | 允许为正在使用的其余使用者配置更多附加属性。 | map | |
| camel.rest.context-path | 设置 REST 服务将使用的前导 context-path。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。或用于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
| camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | map | |
| camel.rest.data-format-property | 允许为使用中的数据格式配置任意数量的附加属性。例如,将 property prettyPrint 设置为 true 以将 json 输出设置为 pretty 模式。属性可以加上前缀,表示选项仅适用于 JSON 或 XML,对于 IN 或 OUT。前缀为: json.in. json.out. xml.in. xml.out。例如,值为 xml.out.mustBeJAXBElement 的键仅适用于传出的 XML 数据格式。没有前缀的密钥是所有情况的通用键。 | map | |
| camel.rest.enable-cors | 是否在 HTTP 响应中启用 CORS 标头。默认值为 false。 | false | 布尔值 |
| camel.rest.endpoint-property | 允许为正在使用的其余端点配置更多附加属性。 | map | |
| camel.rest.host | 用于公开 REST 服务的主机名。 | 字符串 | |
| camel.rest.host-name-resolver | 如果没有配置主机名,则使用此解析器计算 REST 服务将使用的主机名。 | RestHostNameResolver | |
| camel.rest.json-data-format | 要使用的特定 json 数据格式的名称。默认情况下将使用 json-jackson。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.port | 用于公开 REST 服务的端口号。请注意,如果您使用 servlet 组件,则此处配置的端口号不适用,因为使用中的端口号是 servlet 组件使用的实际端口号。例如,使用 Apache Tomcat 将其 tomcat http 端口用于 tomcat http 端口(如果在 firewall 中默认使用端口 8181 )虽然在这些情况下,这里设置端口号,但允许工具和 JMX 知道端口号,因此建议将端口号设置为 servlet 引擎使用的数字。 | 字符串 | |
| camel.rest.producer-api-doc | 设置 REST 制作者将用来验证 REST uri 和查询参数的 api 文档(swagger api)的位置,对 api 文档相应地生效。这需要将 camel-swagger-java 添加到 classpath 中,任何未命中配置都让 Camel 在启动时失败并报告错误。默认情况下,api 文档的位置从类路径加载,但您可以使用 file: 或 http: 引用从文件或 http url 加载的资源。 | 字符串 | |
| camel.rest.producer-component | 设置要用作 REST producer 的 Camel 组件的名称。 | 字符串 | |
| camel.rest.scheme | 用于公开 REST 服务的方案。通常支持 http 或 https。默认值为 http。 | 字符串 | |
| camel.rest.skip-binding-on-error-code | 如果存在自定义 HTTP 错误代码标头,是否跳过输出绑定。这允许构建不绑定到 json / xml 等自定义错误消息,否则成功信息会这样做。 | false | 布尔值 |
| camel.rest.use-x-forward-headers | 是否将 X-Forward 标头用于主机和相关设置。默认值为 true。 | true | 布尔值 |
| camel.rest.xml-data-format | 要使用的特定 XML 数据格式的名称。默认情况下将使用 jaxb。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.api-context-id-pattern | 弃用了 CamelContext id 模式,以只允许 CamelContext 中名称与模式匹配的其他服务的 Rest API。模式 名称 指的是 CamelContext 名称,仅匹配当前的 CamelContext。对于任何其他值,模式使用 PatternHelper#matchPattern (String,String)中的规则。 | 字符串 | |
| camel.rest.api-context-listing | 弃用了 设置是否启用了 JVM 中带有 REST 服务的所有可用 CamelContext 的列表。如果启用它允许发现这些上下文,如果为 false,则只使用当前的 CamelContext。 | false | 布尔值 |
第 70 章 标头
标头表达式语言允许您提取指定标头的值。
70.1. 标头选项
标头语言支持 1 选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| trim |
| 是否修剪值以移除前导和尾随空格和换行符。 |
70.2. 用法示例
接收者List EIP 可以使用标头:
<route>
<from uri="direct:a" />
<recipientList>
<header>myHeader</header>
</recipientList>
</route>在这种情况下,接收者列表包含在标头 'myHeader' 中。
以及 Java DSL 中的同一示例:
from("direct:a").recipientList(header("myHeader"));70.3. 依赖项
标头语言是 camel-core 的一部分。
70.4. Spring Boot Auto-Configuration
当将标头与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-core-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 147 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.cloud.consul.service-discovery.acl-token | 设置要与 Consul 一起使用的 ACL 令牌。 | 字符串 | |
| camel.cloud.consul.service-discovery.block-seconds | 等待监视事件的秒数,默认为 10 秒。 | 10 | 整数 |
| camel.cloud.consul.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.consul.service-discovery.connect-timeout-millis | OkHttpClient 的连接超时。 | Long | |
| camel.cloud.consul.service-discovery.datacenter | 数据中心。 | 字符串 | |
| camel.cloud.consul.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.consul.service-discovery.password | 设置用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.consul.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.consul.service-discovery.read-timeout-millis | OkHttpClient 的读取超时。 | Long | |
| camel.cloud.consul.service-discovery.url | Consul 代理 URL。 | 字符串 | |
| camel.cloud.consul.service-discovery.user-name | 设置用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.consul.service-discovery.write-timeout-millis | OkHttpClient 的写入超时。 | Long | |
| camel.cloud.dns.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.dns.service-discovery.domain | 域名; | 字符串 | |
| camel.cloud.dns.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.dns.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.dns.service-discovery.proto | 所需服务的传输协议。 | _tcp | 字符串 |
| camel.cloud.etcd.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.etcd.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.etcd.service-discovery.password | 用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.etcd.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.etcd.service-discovery.service-path | 用于查找服务发现的路径。 | /services/ | 字符串 |
| camel.cloud.etcd.service-discovery.timeout | 要设置操作完成的最长时间。 | Long | |
| camel.cloud.etcd.service-discovery.type | 要设置发现类型,有效的值为 on-demand 和 watch。 | 按需 | 字符串 |
| camel.cloud.etcd.service-discovery.uris | 客户端可以连接的 URI。 | 字符串 | |
| camel.cloud.etcd.service-discovery.user-name | 用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.api-version | 使用客户端查找时设置 API 版本。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-data | 使用客户端查找时设置证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-file | 设置在使用客户端查找时从文件加载的证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-data | 使用客户端查找时设置客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-file | 设置在使用客户端查找时从文件加载的客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-algo | 在使用客户端查找时设置客户端密钥存储算法,如 RSA。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-data | 在使用客户端查找时设置 Client Keystore 数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-file | 设置在使用客户端查找时从文件加载的客户端密钥存储数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-passphrase | 在使用客户端查找时设置客户端密钥存储密码短语。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.kubernetes.service-discovery.dns-domain | 设置用于 DNS 查找的 DNS 域。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.kubernetes.service-discovery.lookup | 如何执行服务查找。可能的值: client, dns, environment。在使用客户端时,客户端查询 kubernetes master 以获取提供服务的活动 pod 列表,然后随机(或循环)选择一个 pod。使用 dns 时,服务名称被解析为 name.namespace.svc.dnsDomain。当使用 dnssrv 时,服务名称通过 SRV 查询解析 .…svc… when 使用环境变量来查找该服务。默认情况下使用环境。 | 环境 | 字符串 |
| camel.cloud.kubernetes.service-discovery.master-url | 使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用 ENV 变量 KUBERNETES_MASTER 中的 namespace。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.oauth-token | 在使用客户端查找时,设置用于身份验证的 OAUTH 令牌(而不是用户名/密码)。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.password | 在使用客户端查找时,设置用于身份验证的密码。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-name | 设置 DNS/DNSSRV 查找时使用的端口名称。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-protocol | 设置用于 DNS/DNSSRV 查找的端口协议。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.kubernetes.service-discovery.trust-certs | 设置在使用客户端查找时是否打开信任证书检查。 | false | 布尔值 |
| camel.cloud.kubernetes.service-discovery.username | 在使用客户端查找时,设置用于身份验证的用户名。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.client-name | 设置 Ribbon 客户端名称。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.configurations | 定义其他配置定义。 | map | |
| camel.cloud.ribbon.load-balancer.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.ribbon.load-balancer.namespace | 命名空间。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.password | 密码。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.ribbon.load-balancer.username | 用户名。 | 字符串 | |
| camel.hystrix.allow-maximum-size-to-diverge-from-core-size | 允许配置 maximumSize 生效。然后该值可以等于或大于 coreSize。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-enabled | 是否使用 HystrixCircuitBreaker。如果为 false,则将使用 断路器 逻辑,并且允许的所有请求。这与 circuitBreakerForceClosed ()类似,除了继续跟踪指标并知道它是否应该处于打开/关闭状态外,此属性也不会实例化断路器。 | true | 布尔值 |
| camel.hystrix.circuit-breaker-error-threshold-percentage | 错误百分比阈值(如 50)指向断路器将开放和拒绝请求。它将保持在 circuitBreakerSleepWindowInMilliseconds 中定义的持续时间;与 HystrixCommandMetrics.getHealthCounts ()进行比较的错误百分比。 | 50 | 整数 |
| camel.hystrix.circuit-breaker-force-closed | 如果为 true,HystrixCircuitBreaker#allowRequest ()将始终返回 true 以允许请求,而不考虑 HystrixCommandMetrics.getHealthCounts ()中的错误百分比。circuitBreakerForceOpen ()属性具有优先权,因此如果设为 true,则此属性不会执行。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(条带)并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-request-volume-threshold | 指标RollingStatisticalWindowInMilliseconds ()中必须存在于 HystrixCircuitBreaker 的最小请求数。如果在这个数量下,无论错误百分比如何,电路不会条带化。 | 20 | 整数 |
| camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreakertrips 打开 HystrixCircuitBreaker 往返时间(以毫秒为单位),在尝试请求前应等待的时间(毫秒)。 | 5000 | 整数 |
| camel.hystrix.configurations | 定义其他配置定义。 | map | |
| camel.hystrix.core-pool-size | 传递给 java.util.concurrent.ThreadPoolExecutor#setCorePoolSize (int)的核心 thread-pool 大小。 | 10 | 整数 |
| camel.hystrix.enabled | 启用组件。 | true | 布尔值 |
| camel.hystrix.execution-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.run ()的并发请求数。超出并发限制的请求将被拒绝。Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | 整数 |
| camel.hystrix.execution-isolation-strategy | 将通过以下方式执行哪些隔离策略 HystrixCommand.run ():如果 THREAD,它将在单独的线程上执行,并且并发请求受 thread-pool 中的线程数量限制。如果 SEMAPHORE,它将在调用线程上执行,并且由 semaphore 数限制的并发请求。 | 线程 | 字符串 |
| camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 Future# canceled )。仅在 executionIsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
| camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
| camel.hystrix.execution-timeout-in-milliseconds | 命令超时并停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 并且命令是 thread-isolated,则执行线程将中断。如果命令是 semaphore-isolated 和 HystrixObservableCommand,则该命令将被取消订阅。 | 1000 | 整数 |
| camel.hystrix.fallback-enabled | 出现故障时是否应该尝试 HystrixCommand.getFallback ()。 | true | 布尔值 |
| camel.hystrix.fallback-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.getFallback ()的并发请求数。超出并发限制的请求将很快失败,且不会尝试检索回退。 | 10 | 整数 |
| camel.hystrix.group-key | 设置要使用的组密钥。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
| camel.hystrix.keep-alive-time | keep-alive 时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
| camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会意外地更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
| camel.hystrix.maximum-size | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) .这是在没有开始拒绝 HystrixCommands 的情况下支持的最大并发数。请注意,只有在您还设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
| camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 允许计算成功和错误百分比并影响 HystrixCircuitBreaker.isOpen ()状态的健康快照之间等待的时间(毫秒)。在高容量电路上,错误百分比的持续计算可能会成为 CPU 密集型,从而控制它计算的频率。 | 500 | 整数 |
| camel.hystrix.metrics-rolling-percentile-bucket-size | 存储在滚动百分比的每个存储桶中的最大值数。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 在 HystrixCommandMetrics 中捕获百分比的指标。 | true | 布尔值 |
| camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动百分比窗口的 bucket 数量已分为.这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 6 | 整数 |
| camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的百分比滚动窗口。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10000 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这传递到 HystrixCommandMetrics 中的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-in-milliseconds | 此属性设置统计滚动窗口的持续时间,以毫秒为单位。这是为线程池保留指标的时间。窗口被分成 bucket,按这些递增来滚动。 | 10000 | 整数 |
| camel.hystrix.queue-size-rejection-threshold | 队列大小拒绝阈值是一个人为最大大小,即使未达到 maxQueueSize,也会发生拒绝的大小。这是因为 BlockingQueue 的 maxQueueSize 无法动态更改,我们希望支持动态更改会影响拒绝的队列大小。在排队线程执行时,HystrixCommand 使用它。 | 5 | 整数 |
| camel.hystrix.request-log-enabled | HystrixCommand 执行和事件是否应记录到 HystrixRequestLog。 | true | 布尔值 |
| camel.hystrix.thread-pool-key | 设置要使用的线程池密钥。默认情况下,将使用与 groupKey 相同的值。 | CamelHystrix | 字符串 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-in-milliseconds | 统计滚动窗口的持续时间(以毫秒为单位)。这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10000 | 整数 |
| camel.language.constant.enabled | 是否启用恒定语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.constant.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.csimple.enabled | 是否启用 csimple 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.csimple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.exchangeproperty.enabled | 是否启用 ExchangeProperty 语言自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.exchangeproperty.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.file.enabled | 是否启用文件语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.file.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.header.enabled | 是否启用标头语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.header.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.ref.enabled | 是否启用 ref 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.ref.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.simple.enabled | 是否启用简单语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.simple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.tokenize.enabled | 是否启用令牌语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.tokenize.group-delimiter | 设置分组时要使用的分隔符。如果没有设置,则令牌将用作分隔符。 | 字符串 | |
| camel.language.tokenize.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.resilience4j.automatic-transition-from-open-to-half-open-enabled | 在 waitDurationInOpenState 通过后,启用从 OPEN 自动过渡到 HALF_OPEN 状态。 | false | 布尔值 |
| camel.resilience4j.circuit-breaker-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreaker 实例,以便从 registry 查找和使用。在使用它时,不使用任何其他断路器选项。 | 字符串 | |
| camel.resilience4j.config-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreakerConfig 实例,用于从 registry 查找和使用。 | 字符串 | |
| camel.resilience4j.configurations | 定义其他配置定义。 | map | |
| camel.resilience4j.enabled | 启用组件。 | true | 布尔值 |
| camel.resilience4j.failure-rate-threshold | 配置故障率阈值(以百分比表示)。如果失败率相等或大于 CircuitBreaker 转换的阈值,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 50 个百分比。 | 浮点值 | |
| camel.resilience4j.minimum-number-of-calls | 配置 CircuitBreaker 可以计算错误率前所需的最少调用数(每个滑动窗口期限)。例如,如果 minimumNumberOfCalls 为 10,则必须记录至少 10 个调用,然后才能计算失败率。如果只记录 9 个调用,则 CircuitBreaker 不会过渡到 open,即使所有 9 调用都失败。默认 minimumNumberOfCalls 为 100。 | 100 | 整数 |
| camel.resilience4j.permitted-number-of-calls-in-half-open-state | 当 CircuitBreaker 为一半打开时,配置允许的调用数量。大小必须大于 0。默认大小为 10。 | 10 | 整数 |
| camel.resilience4j.sliding-window-size | 配置 sliding 窗口的大小,用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置 sliding 窗口的大小。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。slidingWindowSize 必须大于 0。minimumNumberOfCalls 必须大于 0。如果 slidingWindowType 是 COUNT_BASED,则 minimumNumberOfCalls 无法大于 slidingWindowSize。如果 slidingWindowType 是 TIME_BASED,您可以选择任何您想要的。默认 slidingWindowSize 为 100。 | 100 | 整数 |
| camel.resilience4j.sliding-window-type | 配置 sliding 窗口的类型,用于在 CircuitBreaker 关闭时记录调用的结果。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。默认 slidingWindowType 为 COUNT_BASED。 | COUNT_BASED | 字符串 |
| camel.resilience4j.slow-call-duration-threshold | 配置上面的持续时间阈值(秒),其调用被视为较慢,并增加较慢的调用百分比。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.slow-call-rate-threshold | 配置一个阈值(以百分比表示)。当调用持续时间大于 slowCallDurationThreshold Duration 时,CircuitBreaker 会将一个调用视为 slowCallDurationThreshold Duration。当较慢的调用百分比相等或大于阈值时,CircuitBreaker 过渡到 open,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 100 百分比,这意味着所有记录的调用都必须比 slowCallDurationThreshold 慢。 | 浮点值 | |
| camel.resilience4j.wait-duration-in-open-state | 配置等待持续时间(以秒为单位),用于指定 CircuitBreaker 应该打开的时间,然后再切换到一半打开。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.writable-stack-trace-enabled | 启用可写堆栈跟踪。当设置为 false 时,Exception.getStackTrace 返回零长度数组。当断路器处于开路时,这可用于减少日志垃圾邮件,因为已经知道例外原因(断路器是短路调用)。 | true | 布尔值 |
| camel.rest.api-component | 用作 REST API (如 swagger)的 Camel 组件的名称(如 swagger)没有明确配置 API 组件,则 Camel 组件将查找,如果 registry 中注册了 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.api-context-path | 设置领先的 API 上下文路径,即 REST API 服务要使用的路径。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。 | 字符串 | |
| camel.rest.api-context-route-id | 设置路由 id,以用于服务 REST API 的路由。路由默认使用自动分配的路由 ID。 | 字符串 | |
| camel.rest.api-host | 要将特定主机名用于 API 文档(如 swagger),可以使用这个配置的主机名覆盖生成的主机。 | 字符串 | |
| camel.rest.api-property | 允许为 api 文档(swagger)配置任意数量的附加属性。例如,将属性 api.title 设置为我的冷却。 | map | |
| camel.rest.api-vendor-extension | 在 Rest API 中是否启用了供应商扩展。如果启用,Camel 将包括附加信息作为厂商扩展(如以 x- 开头的密钥),如路由 ID、类名称等。在导入 API 文档时,并非所有第三方 API 网关和工具都支持 vendor-extensions。 | false | 布尔值 |
| camel.rest.binding-mode | 设置要使用的绑定模式。默认值为 off。 | RestBindingMode | |
| camel.rest.client-request-validation | 是否启用客户端请求的验证,以检查客户端的 Content-Type 和 Accept 标头是否受其消耗/生成的设置的 Rest-DSL 配置支持。这可打开,以启用此检查。如果验证错误,则返回 HTTP Status Code 415 或 406。默认值为 false。 | false | 布尔值 |
| camel.rest.component | 用于 REST 传输(使用者)的 Camel Rest 组件,如 netty-http, jetty, servlet, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.component-property | 允许为正在使用的其余组件配置更多附加属性。 | map | |
| camel.rest.consumer-property | 允许为正在使用的其余使用者配置更多附加属性。 | map | |
| camel.rest.context-path | 设置 REST 服务将使用的前导 context-path。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。或用于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
| camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | map | |
| camel.rest.data-format-property | 允许为使用中的数据格式配置任意数量的附加属性。例如,将 property prettyPrint 设置为 true 以将 json 输出设置为 pretty 模式。属性可以加上前缀,表示选项仅适用于 JSON 或 XML,对于 IN 或 OUT。前缀为: json.in. json.out. xml.in. xml.out。例如,值为 xml.out.mustBeJAXBElement 的键仅适用于传出的 XML 数据格式。没有前缀的密钥是所有情况的通用键。 | map | |
| camel.rest.enable-cors | 是否在 HTTP 响应中启用 CORS 标头。默认值为 false。 | false | 布尔值 |
| camel.rest.endpoint-property | 允许为正在使用的其余端点配置更多附加属性。 | map | |
| camel.rest.host | 用于公开 REST 服务的主机名。 | 字符串 | |
| camel.rest.host-name-resolver | 如果没有配置主机名,则使用此解析器计算 REST 服务将使用的主机名。 | RestHostNameResolver | |
| camel.rest.json-data-format | 要使用的特定 json 数据格式的名称。默认情况下将使用 json-jackson。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.port | 用于公开 REST 服务的端口号。请注意,如果您使用 servlet 组件,则此处配置的端口号不适用,因为使用中的端口号是 servlet 组件使用的实际端口号。例如,使用 Apache Tomcat 将其 tomcat http 端口用于 tomcat http 端口(如果在 firewall 中默认使用端口 8181 )虽然在这些情况下,这里设置端口号,但允许工具和 JMX 知道端口号,因此建议将端口号设置为 servlet 引擎使用的数字。 | 字符串 | |
| camel.rest.producer-api-doc | 设置 REST 制作者将用来验证 REST uri 和查询参数的 api 文档(swagger api)的位置,对 api 文档相应地生效。这需要将 camel-swagger-java 添加到 classpath 中,任何未命中配置都让 Camel 在启动时失败并报告错误。默认情况下,api 文档的位置从类路径加载,但您可以使用 file: 或 http: 引用从文件或 http url 加载的资源。 | 字符串 | |
| camel.rest.producer-component | 设置要用作 REST producer 的 Camel 组件的名称。 | 字符串 | |
| camel.rest.scheme | 用于公开 REST 服务的方案。通常支持 http 或 https。默认值为 http。 | 字符串 | |
| camel.rest.skip-binding-on-error-code | 如果存在自定义 HTTP 错误代码标头,是否跳过输出绑定。这允许构建不绑定到 json / xml 等自定义错误消息,否则成功信息会这样做。 | false | 布尔值 |
| camel.rest.use-x-forward-headers | 是否将 X-Forward 标头用于主机和相关设置。默认值为 true。 | true | 布尔值 |
| camel.rest.xml-data-format | 要使用的特定 XML 数据格式的名称。默认情况下将使用 jaxb。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.api-context-id-pattern | 弃用了 CamelContext id 模式,以只允许 CamelContext 中名称与模式匹配的其他服务的 Rest API。模式 名称 指的是 CamelContext 名称,仅匹配当前的 CamelContext。对于任何其他值,模式使用 PatternHelper#matchPattern (String,String)中的规则。 | 字符串 | |
| camel.rest.api-context-listing | 弃用了 设置是否启用了 JVM 中带有 REST 服务的所有可用 CamelContext 的列表。如果启用它允许发现这些上下文,如果为 false,则只使用当前的 CamelContext。 | false | 布尔值 |
第 71 章 JSONPath
Camel 支持 JSONPath 以允许使用 Expression 或 Predicate on JSON 消息。
71.1. jsonPath 选项
JSONPath 语言支持 8 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| resultType |
| 设置结果类型的类名称(从输出中键入)。 | |
| suppressExceptions |
| 是否抑制异常,如 PathNotFoundException。 | |
| allowSimple |
| 是否在 JSONPath 表达式中允许内联简单异常。 | |
| allowEasyPredicate |
| 是否允许使用简单的 predicate 解析器来预解析 predicates。 | |
| writeAsString |
| 是否将每行/元素的输出写为 JSON String 值,而不是映射/POJO 值。 | |
| headerName |
| 用作输入的标头名称,而不是邮件正文。 | |
| 选项 |
| 要在 JSONPath 中配置附加选项。可以使用逗号分隔多个值。 Enum 值:
| |
| trim |
| 是否修剪值以移除前导和尾随空格和换行符。 |
71.2. 例子
例如,您可以使用 Predicate with the Content Based Router EIP 的 JSONPath。
from("queue:books.new")
.choice()
.when().jsonpath("$.store.book[?(@.price < 10)]")
.to("jms:queue:book.cheap")
.when().jsonpath("$.store.book[?(@.price < 30)]")
.to("jms:queue:book.average")
.otherwise()
.to("jms:queue:book.expensive");在 XML DSL 中:
<route>
<from uri="direct:start"/>
<choice>
<when>
<jsonpath>$.store.book[?(@.price < 10)]</jsonpath>
<to uri="mock:cheap"/>
</when>
<when>
<jsonpath>$.store.book[?(@.price < 30)]</jsonpath>
<to uri="mock:average"/>
</when>
<otherwise>
<to uri="mock:expensive"/>
</otherwise>
</choice>
</route>71.3. jsonPath 语法
使用 JSONPath 语法需要一些时间来学习,即使用于基本的 predicates。例如,要找到您必须执行的所有 cheap 图书:
$.store.book[?(@.price < 20)]
71.3.1. 简单的 JSONPath 语法
但是,如果您可以将其编写为:
store.book.price < 20
如果您只想查看具有价格键的节点,可以省略该路径:
price < 20
要支持此功能,如果您已使用基本样式定义了 predicate,则 EasyPredicateParser 是一个 kicks-in。这意味着 predicate 必须以 $ 符号开头,仅包含一个 operator。
简单的语法是:
left OP right
您可以在右 operator 中使用 Camel 简单语言,例如:
store.book.price < ${header.limit}有关更多语法示例,请参阅 JSONPath 项目页面。
71.4. 支持的消息正文类型
Camel JSonPath 支持使用以下类型的消息正文:
| 类型 | 注释 |
|---|---|
|
| 从文件中读取 |
|
| 普通字符串 |
|
|
消息正文为 |
|
|
消息正文为 |
|
|
可选,如果 Jackson 位于类路径上,则 camel-jsonpath 可以使用 Jackson 将消息正文读为 POJO,并转换为 JSonPath 支持的 |
|
|
如果上述类型都不匹配,则 Camel 将尝试将消息正文作为 |
如果邮件正文是不支持的类型,则默认抛出异常,但您可以配置 JSonPath 来抑制异常(请参阅以下)
71.5. 抑制异常
默认情况下,如果 json 有效负载没有与配置的 jsonpath 表达式对应的有效路径,jsonpath 会抛出异常。在某些情况下,当 json 有效负载包含可选数据时,您可能想要忽略它。因此,您可以将选项 suppressExceptions 设置为 true 以忽略它,如下所示:
from("direct:start")
.choice()
// use true to suppress exceptions
.when().jsonpath("person.middlename", true)
.to("mock:middle")
.otherwise()
.to("mock:other");在 XML DSL 中:
<route>
<from uri="direct:start"/>
<choice>
<when>
<jsonpath suppressExceptions="true">person.middlename</jsonpath>
<to uri="mock:middle"/>
</when>
<otherwise>
<to uri="mock:other"/>
</otherwise>
</choice>
</route>
此选项也可用于 @JsonPath 注释。
71.6. 内联简单表达式
可以使用 简单 语法 ${xxx} 在 JSONPath 表达式中内联简单语言。
例如:
from("direct:start")
.choice()
.when().jsonpath("$.store.book[?(@.price < ${header.cheap})]")
.to("mock:cheap")
.when().jsonpath("$.store.book[?(@.price < ${header.average})]")
.to("mock:average")
.otherwise()
.to("mock:expensive");在 XML DSL 中:
<route>
<from uri="direct:start"/>
<choice>
<when>
<jsonpath>$.store.book[?(@.price < ${header.cheap})]</jsonpath>
<to uri="mock:cheap"/>
</when>
<when>
<jsonpath>$.store.book[?(@.price < ${header.average})]</jsonpath>
<to uri="mock:average"/>
</when>
<otherwise>
<to uri="mock:expensive"/>
</otherwise>
</choice>
</route>
您可以通过将选项 allowSimple 设置为 false 来关闭对内联简单表达式的支持,如下所示:
.when().jsonpath("$.store.book[?(@.price < 10)]", false, false)在 XML DSL 中:
<jsonpath allowSimple="false">$.store.book[?(@.price < 10)]</jsonpath>
71.7. jsonPath 注入
您可以使用 Bean Integration 在 bean 上调用方法,并使用 JSONPath (通过 @JsonPath 注释)等各种语言从消息中提取值并将其绑定到方法参数,如下所示:
public class Foo {
@Consume("activemq:queue:books.new")
public void doSomething(@JsonPath("$.store.book[*].author") String author, @Body String json) {
// process the inbound message here
}
}71.8. 编码检测
JSON 文档的编码会自动检测到,如果以 unicode (UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE )编码,如 RFC-4627 中指定的。如果编码是非unicode 编码,您可以确保以 String 格式输入文档到 JSONPath,或者在标头 CamelJsonPathJsonEncoding 中指定编码,该编码在: JsonpathConstants.HEADER_JSON_ENCODING 中定义。
71.9. 将 JSON 数据分成子行作为 JSON
您可以使用 JSONPath 来分割 JSON 文档,例如:
from("direct:start")
.split().jsonpath("$.store.book[*]")
.to("log:book");
然后会记录每个图书,但邮件正文是一个 Map 实例。有时,您可能想要将其输出为普通字符串 JSON 值,可以使用 writeAsString 选项进行,如下所示:
from("direct:start")
.split().jsonpathWriteAsString("$.store.book[*]")
.to("log:book");然后,每个图书都以字符串 JSON 值的形式记录。
71.10. 使用标头作为输入
默认情况下,JSONPath 使用消息正文作为输入源。但是,您还可以通过指定 headerName 选项来使用标头作为输入。
例如,要计算存储在名为 books 的标头中的 JSON 文档中的 图书 数量,您可以执行以下操作:
from("direct:start")
.setHeader("numberOfBooks")
.jsonpath("$..store.book.length()", false, int.class, "books")
.to("mock:result");
在上面的 jsonpath 表达式中,我们以 图书 形式指定标头名称,并且我们还告知我们想要将结果转换为 int.class 的整数。
XML DSL 中的同一示例为:
<route>
<from uri="direct:start"/>
<setHeader name="numberOfBooks">
<jsonpath headerName="books" resultType="int">$..store.book.length()</jsonpath>
</setHeader>
<to uri="mock:result"/>
</route>71.11. Spring Boot Auto-Configuration
当将 jsonpath 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jsonpath-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 8 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.language.jsonpath.allow-easy-predicate | 是否允许使用简单的 predicate 解析器来预解析 predicates。 | true | 布尔值 |
| camel.language.jsonpath.allow-simple | 是否在 JSONPath 表达式中允许内联简单异常。 | true | 布尔值 |
| camel.language.jsonpath.enabled | 是否启用 jsonpath 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.jsonpath.header-name | 用作输入的标头名称,而不是邮件正文。 | 字符串 | |
| camel.language.jsonpath.option | 要在 JSONPath 中配置附加选项。可以使用逗号分隔多个值。 | 字符串 | |
| camel.language.jsonpath.suppress-exceptions | 是否抑制异常,如 PathNotFoundException。 | false | 布尔值 |
| camel.language.jsonpath.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.jsonpath.write-as-string | 是否将每行/元素的输出写为 JSON String 值,而不是映射/POJO 值。 | false | 布尔值 |
第 72 章 Ref
Ref 表达式语言实际上只是从注册表查找自定义表达式或 显示 的方式。
这在 XML DSL 中特定用途。
72.1. ref Language 选项
Ref 语言支持 1 选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| trim |
| 是否修剪值以移除前导和尾随空格和换行符。 |
72.2. 用法示例
XML DSL 中的 Splitter EIP 可以使用使用 < ref> 的自定义表达式,如下所示:
<bean id="myExpression" class="com.mycompany.MyCustomExpression"/>
<route>
<from uri="seda:a"/>
<split>
<ref>myExpression</ref>
<to uri="mock:b"/>
</split>
</route>
在这种情况下,来自 seda:a 端点的消息将使用在 Registry 中具有 id my 的自定义表达式分割。
Expression
使用 Java DSL 以及相同的示例:
from("seda:a").split().ref("myExpression").to("seda:b");72.3. 依赖项
Ref 语言是 camel-core 的一部分。
72.4. Spring Boot Auto-Configuration
当将 ref 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-core-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 147 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.cloud.consul.service-discovery.acl-token | 设置要与 Consul 一起使用的 ACL 令牌。 | 字符串 | |
| camel.cloud.consul.service-discovery.block-seconds | 等待监视事件的秒数,默认为 10 秒。 | 10 | 整数 |
| camel.cloud.consul.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.consul.service-discovery.connect-timeout-millis | OkHttpClient 的连接超时。 | Long | |
| camel.cloud.consul.service-discovery.datacenter | 数据中心。 | 字符串 | |
| camel.cloud.consul.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.consul.service-discovery.password | 设置用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.consul.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.consul.service-discovery.read-timeout-millis | OkHttpClient 的读取超时。 | Long | |
| camel.cloud.consul.service-discovery.url | Consul 代理 URL。 | 字符串 | |
| camel.cloud.consul.service-discovery.user-name | 设置用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.consul.service-discovery.write-timeout-millis | OkHttpClient 的写入超时。 | Long | |
| camel.cloud.dns.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.dns.service-discovery.domain | 域名; | 字符串 | |
| camel.cloud.dns.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.dns.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.dns.service-discovery.proto | 所需服务的传输协议。 | _tcp | 字符串 |
| camel.cloud.etcd.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.etcd.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.etcd.service-discovery.password | 用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.etcd.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.etcd.service-discovery.service-path | 用于查找服务发现的路径。 | /services/ | 字符串 |
| camel.cloud.etcd.service-discovery.timeout | 要设置操作完成的最长时间。 | Long | |
| camel.cloud.etcd.service-discovery.type | 要设置发现类型,有效的值为 on-demand 和 watch。 | 按需 | 字符串 |
| camel.cloud.etcd.service-discovery.uris | 客户端可以连接的 URI。 | 字符串 | |
| camel.cloud.etcd.service-discovery.user-name | 用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.api-version | 使用客户端查找时设置 API 版本。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-data | 使用客户端查找时设置证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-file | 设置在使用客户端查找时从文件加载的证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-data | 使用客户端查找时设置客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-file | 设置在使用客户端查找时从文件加载的客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-algo | 在使用客户端查找时设置客户端密钥存储算法,如 RSA。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-data | 在使用客户端查找时设置 Client Keystore 数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-file | 设置在使用客户端查找时从文件加载的客户端密钥存储数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-passphrase | 在使用客户端查找时设置客户端密钥存储密码短语。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.kubernetes.service-discovery.dns-domain | 设置用于 DNS 查找的 DNS 域。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.kubernetes.service-discovery.lookup | 如何执行服务查找。可能的值: client, dns, environment。在使用客户端时,客户端查询 kubernetes master 以获取提供服务的活动 pod 列表,然后随机(或循环)选择一个 pod。使用 dns 时,服务名称被解析为 name.namespace.svc.dnsDomain。当使用 dnssrv 时,服务名称通过 SRV 查询解析 .…svc… when 使用环境变量来查找该服务。默认情况下使用环境。 | 环境 | 字符串 |
| camel.cloud.kubernetes.service-discovery.master-url | 使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用 ENV 变量 KUBERNETES_MASTER 中的 namespace。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.oauth-token | 在使用客户端查找时,设置用于身份验证的 OAUTH 令牌(而不是用户名/密码)。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.password | 在使用客户端查找时,设置用于身份验证的密码。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-name | 设置 DNS/DNSSRV 查找时使用的端口名称。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-protocol | 设置用于 DNS/DNSSRV 查找的端口协议。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.kubernetes.service-discovery.trust-certs | 设置在使用客户端查找时是否打开信任证书检查。 | false | 布尔值 |
| camel.cloud.kubernetes.service-discovery.username | 在使用客户端查找时,设置用于身份验证的用户名。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.client-name | 设置 Ribbon 客户端名称。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.configurations | 定义其他配置定义。 | map | |
| camel.cloud.ribbon.load-balancer.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.ribbon.load-balancer.namespace | 命名空间。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.password | 密码。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.ribbon.load-balancer.username | 用户名。 | 字符串 | |
| camel.hystrix.allow-maximum-size-to-diverge-from-core-size | 允许配置 maximumSize 生效。然后该值可以等于或大于 coreSize。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-enabled | 是否使用 HystrixCircuitBreaker。如果为 false,则将使用 断路器 逻辑,并且允许的所有请求。这与 circuitBreakerForceClosed ()类似,除了继续跟踪指标并知道它是否应该处于打开/关闭状态外,此属性也不会实例化断路器。 | true | 布尔值 |
| camel.hystrix.circuit-breaker-error-threshold-percentage | 错误百分比阈值(如 50)指向断路器将开放和拒绝请求。它将保持在 circuitBreakerSleepWindowInMilliseconds 中定义的持续时间;与 HystrixCommandMetrics.getHealthCounts ()进行比较的错误百分比。 | 50 | 整数 |
| camel.hystrix.circuit-breaker-force-closed | 如果为 true,HystrixCircuitBreaker#allowRequest ()将始终返回 true 以允许请求,而不考虑 HystrixCommandMetrics.getHealthCounts ()中的错误百分比。circuitBreakerForceOpen ()属性具有优先权,因此如果设为 true,则此属性不会执行。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(条带)并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-request-volume-threshold | 指标RollingStatisticalWindowInMilliseconds ()中必须存在于 HystrixCircuitBreaker 的最小请求数。如果在这个数量下,无论错误百分比如何,电路不会条带化。 | 20 | 整数 |
| camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreakertrips 打开 HystrixCircuitBreaker 往返时间(以毫秒为单位),在尝试请求前应等待的时间(毫秒)。 | 5000 | 整数 |
| camel.hystrix.configurations | 定义其他配置定义。 | map | |
| camel.hystrix.core-pool-size | 传递给 java.util.concurrent.ThreadPoolExecutor#setCorePoolSize (int)的核心 thread-pool 大小。 | 10 | 整数 |
| camel.hystrix.enabled | 启用组件。 | true | 布尔值 |
| camel.hystrix.execution-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.run ()的并发请求数。超出并发限制的请求将被拒绝。Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | 整数 |
| camel.hystrix.execution-isolation-strategy | 将通过以下方式执行哪些隔离策略 HystrixCommand.run ():如果 THREAD,它将在单独的线程上执行,并且并发请求受 thread-pool 中的线程数量限制。如果 SEMAPHORE,它将在调用线程上执行,并且由 semaphore 数限制的并发请求。 | 线程 | 字符串 |
| camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 Future# canceled )。仅在 executionIsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
| camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
| camel.hystrix.execution-timeout-in-milliseconds | 命令超时并停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 并且命令是 thread-isolated,则执行线程将中断。如果命令是 semaphore-isolated 和 HystrixObservableCommand,则该命令将被取消订阅。 | 1000 | 整数 |
| camel.hystrix.fallback-enabled | 出现故障时是否应该尝试 HystrixCommand.getFallback ()。 | true | 布尔值 |
| camel.hystrix.fallback-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.getFallback ()的并发请求数。超出并发限制的请求将很快失败,且不会尝试检索回退。 | 10 | 整数 |
| camel.hystrix.group-key | 设置要使用的组密钥。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
| camel.hystrix.keep-alive-time | keep-alive 时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
| camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会意外地更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
| camel.hystrix.maximum-size | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) .这是在没有开始拒绝 HystrixCommands 的情况下支持的最大并发数。请注意,只有在您还设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
| camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 允许计算成功和错误百分比并影响 HystrixCircuitBreaker.isOpen ()状态的健康快照之间等待的时间(毫秒)。在高容量电路上,错误百分比的持续计算可能会成为 CPU 密集型,从而控制它计算的频率。 | 500 | 整数 |
| camel.hystrix.metrics-rolling-percentile-bucket-size | 存储在滚动百分比的每个存储桶中的最大值数。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 在 HystrixCommandMetrics 中捕获百分比的指标。 | true | 布尔值 |
| camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动百分比窗口的 bucket 数量已分为.这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 6 | 整数 |
| camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的百分比滚动窗口。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10000 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这传递到 HystrixCommandMetrics 中的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-in-milliseconds | 此属性设置统计滚动窗口的持续时间,以毫秒为单位。这是为线程池保留指标的时间。窗口被分成 bucket,按这些递增来滚动。 | 10000 | 整数 |
| camel.hystrix.queue-size-rejection-threshold | 队列大小拒绝阈值是一个人为最大大小,即使未达到 maxQueueSize,也会发生拒绝的大小。这是因为 BlockingQueue 的 maxQueueSize 无法动态更改,我们希望支持动态更改会影响拒绝的队列大小。在排队线程执行时,HystrixCommand 使用它。 | 5 | 整数 |
| camel.hystrix.request-log-enabled | HystrixCommand 执行和事件是否应记录到 HystrixRequestLog。 | true | 布尔值 |
| camel.hystrix.thread-pool-key | 设置要使用的线程池密钥。默认情况下,将使用与 groupKey 相同的值。 | CamelHystrix | 字符串 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-in-milliseconds | 统计滚动窗口的持续时间(以毫秒为单位)。这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10000 | 整数 |
| camel.language.constant.enabled | 是否启用恒定语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.constant.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.csimple.enabled | 是否启用 csimple 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.csimple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.exchangeproperty.enabled | 是否启用 ExchangeProperty 语言自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.exchangeproperty.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.file.enabled | 是否启用文件语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.file.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.header.enabled | 是否启用标头语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.header.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.ref.enabled | 是否启用 ref 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.ref.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.simple.enabled | 是否启用简单语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.simple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.tokenize.enabled | 是否启用令牌语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.tokenize.group-delimiter | 设置分组时要使用的分隔符。如果没有设置,则令牌将用作分隔符。 | 字符串 | |
| camel.language.tokenize.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.resilience4j.automatic-transition-from-open-to-half-open-enabled | 在 waitDurationInOpenState 通过后,启用从 OPEN 自动过渡到 HALF_OPEN 状态。 | false | 布尔值 |
| camel.resilience4j.circuit-breaker-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreaker 实例,以便从 registry 查找和使用。在使用它时,不使用任何其他断路器选项。 | 字符串 | |
| camel.resilience4j.config-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreakerConfig 实例,用于从 registry 查找和使用。 | 字符串 | |
| camel.resilience4j.configurations | 定义其他配置定义。 | map | |
| camel.resilience4j.enabled | 启用组件。 | true | 布尔值 |
| camel.resilience4j.failure-rate-threshold | 配置故障率阈值(以百分比表示)。如果失败率相等或大于 CircuitBreaker 转换的阈值,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 50 个百分比。 | 浮点值 | |
| camel.resilience4j.minimum-number-of-calls | 配置 CircuitBreaker 可以计算错误率前所需的最少调用数(每个滑动窗口期限)。例如,如果 minimumNumberOfCalls 为 10,则必须记录至少 10 个调用,然后才能计算失败率。如果只记录 9 个调用,则 CircuitBreaker 不会过渡到 open,即使所有 9 调用都失败。默认 minimumNumberOfCalls 为 100。 | 100 | 整数 |
| camel.resilience4j.permitted-number-of-calls-in-half-open-state | 当 CircuitBreaker 为一半打开时,配置允许的调用数量。大小必须大于 0。默认大小为 10。 | 10 | 整数 |
| camel.resilience4j.sliding-window-size | 配置 sliding 窗口的大小,用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置 sliding 窗口的大小。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。slidingWindowSize 必须大于 0。minimumNumberOfCalls 必须大于 0。如果 slidingWindowType 是 COUNT_BASED,则 minimumNumberOfCalls 无法大于 slidingWindowSize。如果 slidingWindowType 是 TIME_BASED,您可以选择任何您想要的。默认 slidingWindowSize 为 100。 | 100 | 整数 |
| camel.resilience4j.sliding-window-type | 配置 sliding 窗口的类型,用于在 CircuitBreaker 关闭时记录调用的结果。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。默认 slidingWindowType 为 COUNT_BASED。 | COUNT_BASED | 字符串 |
| camel.resilience4j.slow-call-duration-threshold | 配置上面的持续时间阈值(秒),其调用被视为较慢,并增加较慢的调用百分比。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.slow-call-rate-threshold | 配置一个阈值(以百分比表示)。当调用持续时间大于 slowCallDurationThreshold Duration 时,CircuitBreaker 会将一个调用视为 slowCallDurationThreshold Duration。当较慢的调用百分比相等或大于阈值时,CircuitBreaker 过渡到 open,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 100 百分比,这意味着所有记录的调用都必须比 slowCallDurationThreshold 慢。 | 浮点值 | |
| camel.resilience4j.wait-duration-in-open-state | 配置等待持续时间(以秒为单位),用于指定 CircuitBreaker 应该打开的时间,然后再切换到一半打开。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.writable-stack-trace-enabled | 启用可写堆栈跟踪。当设置为 false 时,Exception.getStackTrace 返回零长度数组。当断路器处于开路时,这可用于减少日志垃圾邮件,因为已经知道例外原因(断路器是短路调用)。 | true | 布尔值 |
| camel.rest.api-component | 用作 REST API (如 swagger)的 Camel 组件的名称(如 swagger)没有明确配置 API 组件,则 Camel 组件将查找,如果 registry 中注册了 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.api-context-path | 设置领先的 API 上下文路径,即 REST API 服务要使用的路径。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。 | 字符串 | |
| camel.rest.api-context-route-id | 设置路由 id,以用于服务 REST API 的路由。路由默认使用自动分配的路由 ID。 | 字符串 | |
| camel.rest.api-host | 要将特定主机名用于 API 文档(如 swagger),可以使用这个配置的主机名覆盖生成的主机。 | 字符串 | |
| camel.rest.api-property | 允许为 api 文档(swagger)配置任意数量的附加属性。例如,将属性 api.title 设置为我的冷却。 | map | |
| camel.rest.api-vendor-extension | 在 Rest API 中是否启用了供应商扩展。如果启用,Camel 将包括附加信息作为厂商扩展(如以 x- 开头的密钥),如路由 ID、类名称等。在导入 API 文档时,并非所有第三方 API 网关和工具都支持 vendor-extensions。 | false | 布尔值 |
| camel.rest.binding-mode | 设置要使用的绑定模式。默认值为 off。 | RestBindingMode | |
| camel.rest.client-request-validation | 是否启用客户端请求的验证,以检查客户端的 Content-Type 和 Accept 标头是否受其消耗/生成的设置的 Rest-DSL 配置支持。这可打开,以启用此检查。如果验证错误,则返回 HTTP Status Code 415 或 406。默认值为 false。 | false | 布尔值 |
| camel.rest.component | 用于 REST 传输(使用者)的 Camel Rest 组件,如 netty-http, jetty, servlet, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.component-property | 允许为正在使用的其余组件配置更多附加属性。 | map | |
| camel.rest.consumer-property | 允许为正在使用的其余使用者配置更多附加属性。 | map | |
| camel.rest.context-path | 设置 REST 服务将使用的前导 context-path。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。或用于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
| camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | map | |
| camel.rest.data-format-property | 允许为使用中的数据格式配置任意数量的附加属性。例如,将 property prettyPrint 设置为 true 以将 json 输出设置为 pretty 模式。属性可以加上前缀,表示选项仅适用于 JSON 或 XML,对于 IN 或 OUT。前缀为: json.in. json.out. xml.in. xml.out。例如,值为 xml.out.mustBeJAXBElement 的键仅适用于传出的 XML 数据格式。没有前缀的密钥是所有情况的通用键。 | map | |
| camel.rest.enable-cors | 是否在 HTTP 响应中启用 CORS 标头。默认值为 false。 | false | 布尔值 |
| camel.rest.endpoint-property | 允许为使用中的其他端点配置多个额外的属性。 | Map | |
| camel.rest.host | 用于公开 REST 服务的主机名。 | 字符串 | |
| camel.rest.host-name-resolver | 如果没有明确配置的主机名,这个 resolver 会用于计算 REST 服务将要使用的主机名。 | RestHostNameResolver | |
| camel.rest.json-data-format | 要使用的特定 json 数据格式的名称。默认将使用 json-jackson。重要:此选项仅用于设置数据格式的自定义名称,而不是引用现有数据格式实例。 | 字符串 | |
| camel.rest.port | 用于公开 REST 服务的主机名。请注意,如果您使用 servlet 组件,则此处配置的端口号不适用,因为使用中的端口号是 servlet 组件使用的实际端口号。例如,如果使用 Apache Tomcat,它的 tomcat http 端口,如果使用 Apache Karaf,它的在 Karaf 中的 HTTP 服务,它默认使用端口 8181。虽然在这些情况下,这里设置端口号,但允许工具和 JMX 知道端口号,因此建议将端口号设置为 servlet 引擎使用的数字。 | 字符串 | |
| camel.rest.producer-api-doc | 设置 api 文档的位置,REST 生成者将根据这个文档来验证 REST uri 和查询参数是否有效。这需要将 camel-swagger-java 添加到 classpath 中,任何缺失的配置都会导致 Camel 在启动时失败并报告错误。默认情况下从 classpath 加载的 api 文档的位置,但您可以使用 file: 或 http: 引用从文件或 http url 加载的资源。 | 字符串 | |
| camel.rest.producer-component | 设置要用作 REST 生成者的 Camel 组件的名称。 | 字符串 | |
| camel.rest.scheme | 用于公开 REST 服务的方案。通常支持 http 或 https。默认值为 http。 | 字符串 | |
| camel.rest.skip-binding-on-error-code | 如果存在自定义 HTTP 错误代码标头,是否跳过输出绑定。这允许构建没有绑定到 json / xml 等自定义错误消息,否则成功信息会这样做。 | false | 布尔值 |
| camel.rest.use-x-forward-headers | 是否将 X-Forward 标头用于主机和相关设置。默认值为 true。 | true | 布尔值 |
| camel.rest.xml-data-format | 要使用的特定 XML 数据格式的名称。默认情况下将使用 jaxb。重要:此选项仅用于设置数据格式的自定义名称,而不是引用现有数据格式实例。 | 字符串 | |
| camel.rest.api-context-id-pattern | 弃用 设置 CamelContext id 特征,以只允许 CamelContext 中名称与特征匹配的其他服务的 Rest API。特征 name 指的是 CamelContext 名称,仅匹配当前的 CamelContext。对于任何其他值,特征使用来自 PatternHelper#matchPattern (String,String)的规则。 | 字符串 | |
| camel.rest.api-context-listing | 弃用 设置是否启用了 JVM 中带有 REST 服务的所有可用 CamelContext 的列表。如果启用,它将允许发现这些上下文,如果为 false,则只使用当前的 CamelContext。 | false | 布尔值 |
第 73 章 XQuery
Camel 支持 XQuery 以允许一个 Expression或 Predicate 在 DSL 中使用。
例如,您可以使用 XQuery 在 Message Filter 中创建一个 predicate,或作为 Recipient List 的表达式。
73.1. XQuery 语言选项
XQuery 语言支持 4 个选项,在以下列出。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| type |
| 设置结果类型的类名称(输出中的类型)默认结果类型是 NodeSet。 | |
| headerName |
| 作为输入的标头名称,而不是消息的正文。 | |
| configurationRef |
| 到 registry 中的用于 xquery 的一个 saxon 配置实例的引用 (需要 camel-saxon)。这可能需要在 saxon 配置中添加自定义功能,因此这些自定义功能可以在 xquery 表达式中使用。 | |
| trim |
| 是否修剪值以移除前导和结尾的空格和换行符。 |
73.2. 变量
消息正文将设置为 contextItem。另外,以下变量也可用:
| 变量 | 类型 | 描述 |
|---|---|---|
| 交换 | Exchange | 当前的交换 |
| in.body | 对象 | 消息正文 |
| out.body | 对象 | 弃用 OUT 消息正文(如果有) |
| in.headers.* | 对象 | 您可以使用名称 in.headers.foo 的变量,使用键 foo 来访问 exchange.in.headers 的值 |
| out.headers.* | 对象 | 弃用,您可以使用名称为 out.headers.foo 变量,使用键 foo 来访问 exchange.out.headers 的值 |
| 键名称 | 对象 |
任何 exchange.properties 和 Exchange.in.headers,以及使用 |
73.3. 示例
from("queue:foo")
.filter().xquery("//foo")
.to("queue:bar")
您还可以使用查询中的功能,在这种情况下,您需要明确的类型转换,或者您将收到一个 org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR。您需要传递函数的预期输出类型。例如,concat 函数返回一个 String,它按如下方式完成:
from("direct:start")
.recipientList().xquery("concat('mock:foo.', /person/@city)", String.class);在 XML DSL 中:
<route>
<from uri="direct:start"/>
<recipientList>
<xquery type="java.lang.String">concat('mock:foo.', /person/@city</xquery>
</recipientList>
</route>73.3.1. 使用命名空间
如果您有一个标准的命名空间集,并且希望在多个 XQuery 表达式之间共享它们,您可以在使用 Java DSL 时使用 org.apache.camel.support.builder.Namespaces,如下所示:
Namespaces ns = new Namespaces("c", "http://acme.com/cheese");
from("direct:start")
.filter().xquery("/c:person[@name='James']", ns)
.to("mock:result");
注意如何将命名空间提供给 xquery 以及作为第二参数传递的 ns 变量。
每个命名空间都是 key=value 对,前缀是键。在 XQuery 表达式中,命名空间被前缀使用,例如:
/c:person[@name='James']
命名空间构建器支持添加多个命名空间,如下所示:
Namespaces ns = new Namespaces("c", "http://acme.com/cheese")
.add("w", "http://acme.com/wine")
.add("b", "http://acme.com/beer");
在 XML DSL 中使用命名空间时,如您在 XML root 标签中设置命名空间(或 camelContext, routes, route tag 之一)。
在下面的 XML 示例中,我们使用 Spring XML,其中在 root 标签 Bean 中声明命名空间,在 xmlns:foo="http://example.com/person" 一行中:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:foo="http://example.com/person"
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 id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="activemq:MyQueue"/>
<filter>
<xquery>/foo:person[@name='James']</xquery>
<to uri="mqseries:SomeOtherQueue"/>
</filter>
</route>
</camelContext>
</beans>
这个命名空间使用 foo 作为前缀,因此 <xquery> 表达式使用 /foo: 来使用这个命名空间。
73.4. 使用 XQuery 作为转换
我们可以在路由中使用 transform or setBody 来对消息进行转换,如下所示:
from("direct:start").
transform().xquery("/people/person");
请注意,xquery 将默认使用 DOMResult,因此如果我们希望获取 person 节点的值,则需要使用 text() 告知 XQuery 使用 String 作为结果类型,如下所示:
from("direct:start").
transform().xquery("/people/person/text()", String.class);如果要使用类似标头的 Camel 变量,则必须在 XQuery 表达式中显式声明它们。
<transform>
<xquery>
declare variable $in.headers.foo external;
element item {$in.headers.foo}
</xquery>
</transform>73.5. 从外部资源载入脚本
您可以对脚本进行外部化,并让 Camel 从资源(如 "classpath:"、"file:" 或 "http:" )加载它。这可以通过以下语法完成:"resource:scheme:location" 等引用您可以进行的类路径中的文件:
.setHeader("myHeader").xquery("resource:classpath:myxquery.txt", String.class)73.6. 学习 XQuery
XQuery 是一个非常强大的语言,用于查询、搜索、排序和返回 XML。如需学习 XQuery,可以使用这些教程
- Mike Kay 的 XQuery Primer
- W3Schools XQuery 教程
73.7. 依赖项
要在 camel 路由中使用 XQuery,您需要添加有关实现 XQuery 语言的 camel-saxon 的依赖关系。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-saxon</artifactId>
<version>{CamelSBVersion}</version>
</dependency>73.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 xquery 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-saxon-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 11 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.component.xquery.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
| camel.component.xquery.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
| camel.component.xquery.configuration | 使用自定义 Saxon 配置。选项是一个 net.sf.saxon.Configuration 类型。 | 配置 | |
| camel.component.xquery.configuration-properties | 设置自定义 Saxon 配置属性。 | Map | |
| camel.component.xquery.enabled | 是否启用 xquery 组件的自动配置。这默认是启用的。 | 布尔值 | |
| camel.component.xquery.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
| camel.component.xquery.module-u-r-i-resolver | 使用自定义 ModuleURIResolver。选项是一个 net.sf.saxon.lib.ModuleURIResolver 类型。 | ModuleURIResolver | |
| camel.language.xquery.configuration-ref | 到 registry 中的用于 xquery 的一个 saxon 配置实例的引用 (需要 camel-saxon)。这可能需要在 saxon 配置中添加自定义功能,因此这些自定义功能可以在 xquery 表达式中使用。 | 字符串 | |
| camel.language.xquery.enabled | 是否启用 xquery 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.xquery.trim | 是否修剪值以移除前导和结尾的空格和换行符。 | true | 布尔值 |
| camel.language.xquery.type | 设置结果类型的类名称(输出中的类型)默认结果类型是 NodeSet。 | 字符串 |
第 74 章 Simple(简单)
Simple Expression Language 是创建时非常简单的语言,但自此已发展为更加强大的语言。它主要的设计目的是,使用一个非常小且简单的语言,用于评估 Expression 或 Predicate,而无需了解任何对其他脚本语言(如 Groovy)。
这个简单的语言被设计为在 Camel 路由中无需大量开发脚本而满足所有常见的用例。
但是,对于更复杂的用例,建议使用更强大的语言,例如:
如果简单语言使用 OGNL 表达式,则简单语言需要 camel-bean JAR 作为类路径依赖项,例如在邮件正文上调用名为 myMethod 的方法 :${body.myMethod ()}。在运行时,简单语言将我们构建需要 camel-bean 组件的内置 OGNL 支持。
简单语言将 ${body} 占位符用于复杂的表达式或功能。
另请参阅编译的 CSimple 语言。
另外 的语法
您还可以使用替代语法,该语法使用 $simple{ } 作为占位符。这可用于避免在将 Spring 属性占位符与 Camel 一起使用时出现冲突。
74.1. 简单语言选项
Simple 语言支持 2 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| resultType |
| 设置结果类型的类名称(从输出中键入)。 | |
| trim |
| 是否修剪值以移除前导和结尾的空格和换行符。 |
74.2. 变量
| 变量 | 类型 | 描述 |
|---|---|---|
| camelId | 字符串 | CamelContext 名称 |
| camelContext.OGNL | 对象 | 使用 Camel OGNL 表达式调用的 CamelContext。 |
| 交换 | Exchange | Exchange |
| Exchange.OGNL | 对象 | 使用 Camel OGNL 表达式调用的 Exchange。 |
| exchangeId | 字符串 | Exchange id |
| id | 字符串 | 消息 ID |
| messageTimestamp | 字符串 | 此消息的来源消息时间戳(自 epoc 起)。JMS、Kafka、AWS 等一些系统在 event/message 上有一个时间戳,Camel 收到了。如果存在时间戳,则此方法会返回时间戳。创建的消息时间戳和交换不同。交换始终有一个创建的时间戳,这是 Camel 创建交换时的本地时间戳。只有消费者能够从源事件中提取时间戳时,某些 Camel 组件中才提供消息时间戳。如果消息没有时间戳,则返回 0。 |
| 正文(body) | 对象 | 正文(body) |
| 正文。OGNL | 对象 | 使用 Camel OGNL 表达式调用的正文。 |
| bodyAs(type) | 类型 | 将正文转换为由类名称决定的给定类型。转换的正文可以是 null。 |
| bodyAs(type).OGNL | 对象 | 将正文转换为由类名称决定的给定类型,然后使用 Camel OGNL 表达式调用方法。转换的正文可以是 null。 |
| bodyOneLine | 字符串 | 将正文转换为字符串,并删除所有行入侵,以便字符串位于一行中。 |
| mandatoryBodyAs(type) | 类型 | 将正文转换为由其 classname 确定的给定类型,并且希望正文不是 null。 |
| mandatoryBodyAs(type).OGNL | 对象 | 将正文转换为由类名称决定的给定类型,然后使用 Camel OGNL 表达式调用方法。 |
| header.foo | 对象 | 请参阅 foo 标头 |
| header[foo] | 对象 | 请参阅 foo 标头 |
| headers.foo | 对象 | 请参阅 foo 标头 |
| headers:foo | 对象 | 请参阅 foo 标头 |
| headers[foo] | 对象 | 请参阅 foo 标头 |
| header.foo[bar] | 对象 | 将 foo 标头视为映射,并在映射上执行查找,并将 bar 为 key |
| header.foo.OGNL | 对象 | 请参阅 foo 标头并使用 Camel OGNL 表达式来调用其值。 |
| headerAs (键,键入) | 类型 | 将标头转换为由类名称决定的给定类型 |
| 标头 | Map | 请参阅标头 |
| exchangeProperty.foo | 对象 | 请参阅交换中的 foo 属性 |
| exchangeProperty[foo] | 对象 | 请参阅交换中的 foo 属性 |
| exchangeProperty.foo.OGNL | 对象 | 请参阅交换上的 foo 属性,并使用 Camel OGNL 表达式来调用其值。 |
| sys.foo | 字符串 | 请参阅 JVM 系统属性 |
| sysenv.foo | 字符串 | 请参阅系统环境变量 |
| env.foo | 字符串 | 请参阅系统环境变量 |
| 例外 | 对象 |
如果没有在交换上设置异常,请参阅交换上的异常对象为 null。如果交换有任何情况,将回退和获取异常( |
| OGNL例外 | 对象 | 请参阅 使用 Camel OGNL 表达式对象调用的交换例外 |
| exception.message | 字符串 |
如果交换中未设定异常,请参阅 Exchange 上的 exception.message 为 null。如果交换有任何情况,将回退和获取异常( |
| exception.stacktrace | 字符串 |
请参阅交换上的 exception.stracktrace,如果没有设置交换异常,则为 null。如果交换有任何情况,将回退和获取异常( |
| date:_command_ | Date | 评估到 Date 对象。支持的命令有: 现在 用于当前时间戳,在创建当前交换时 Exchange Created 代表时间戳,header.xxx 使用 Long/Date 对象标头和键 xxx。ExchangeProperty.xxx 将 exchange 属性中的 Long/Date 对象与密钥 xxx 搭配使用。文件 最近修改的时间戳的文件(可通过文件使用者提供)。命令接受偏移量,如 now-24h 或 header.xxx+1h,甚至现在为 +1h30m-100。 |
| date:_command:pattern_ | 字符串 |
使用 |
| date-with-timezone:_command:timezone:pattern_ | 字符串 |
使用 |
| bean:_bean expression_ | 对象 |
使用语言调用 bean 表达式.指定方法名称,您必须使用点作为分隔符。我们还支持组件使用的 ?method=methodname 语法。Camel 默认将按给定名称查找 bean。但是,如果您需要引用 bean 类(如调用静态方法),您可以使用 type 作为前缀,如 |
|
| 字符串 | 使用给定密钥查找属性。如果键不存在或没有值,则可以指定可选的默认值。 |
| routeId | 字符串 | 返回 Exchange 正在路由的当前路由的 id。 |
| stepId | 字符串 | 返回 Exchange 正在路由的当前步骤的 id。 |
| threadName | 字符串 | 返回当前线程的名称。可用于记录目的。 |
| 主机名 | 字符串 | 返回本地主机名(如果无法解析,则为空)。 |
| ref:xxx | 对象 | 使用给定 id 从 Registry 查找 bean。 |
| type:name.field | 对象 |
使用 FQN 名称引用类型或字段。要引用字段,您可以附加 .FIELD_NAME。例如,您可以将 Exchange 中的常量字段指代为: |
| null | null | represents a null |
| random(value) | 整数 | 返回一个随机的、在 0 (包括) 和 value (不包括) 之间的值 |
| random(min,max) | 整数 | 在 min (包括)和 max (excluded)之间返回一个随机整数。 |
| collate(group) | list | collate 函数将消息正文和将数据分组到指定大小的子列表中。这可以与 Splitter EIP 一起使用,将消息正文和组/批量拆分为一组 N 子列表。此方法的工作方式与 Groovy 中的合作方法类似。 |
| skip(number) | 迭代器 | skip 函数迭代消息正文,并跳过第一个项目数量。这可以与 Splitter EIP 一起使用以分割消息正文并跳过前 N 个项目数。 |
| messageHistory | 字符串 | 当前交换的消息历史记录,即路由方式。这类似于路由 stack-trace 消息历史记录,当出现未处理的异常时错误处理程序日志。 |
| messageHistory(false) | 字符串 | 作为 messageHistory,但没有交换详细信息(仅包含路由 stack-trace)。如果您不想从消息本身记录敏感数据,可以使用此项。 |
74.3. OGNL 表达式支持
使用 OGNL 时,需要在 classpath 上具有 camel-bean JAR。
Camel 的 OGNL 支持仅用于调用方法。您无法访问字段。Camel 支持访问 Java 阵列的长度字段。
Simple 和 Bean 语言现在支持 Camel OGNL 表示法,用于以类似方式调用 Bean。假设 Message IN 正文包含 POJO,它具有一个 getAddress () 方法。
然后,您可以使用 Camel OGNL 表示法访问地址对象:
simple("${body.address}")
simple("${body.address.street}")
simple("${body.address.zip}")Camel 了解 getter 的简写名称,但您可以调用任何方法或使用真实名称,例如:
simple("${body.address}")
simple("${body.getAddress.getStreet}")
simple("${body.address.getZip}")
simple("${body.doSomething}")
如果正文没有地址,也可以使用 null 安全运算符(?.)以避免 NPE
simple("${body?.address?.street}")
也可以在 映射 或 列表 类型中索引,以便您可以执行以下操作:
simple("${body[foo].name}")
要假定正文基于 map,并使用 foo 作为键查找值,并且对该值调用 getName 方法。
如果键有空格,则必须 使用引号括起键,例如 'foo bar' :
simple("${body['foo bar'].name}")
您可以使用其密钥名称(带有或不带点)直接访问 映射 或 列出 对象:
simple("${body[foo]}")
simple("${body[this.is.foo]}")
假设密钥 foo 没有值,您可以使用 null secure operator 来避免 NPE,如下所示:
simple("${body[foo]?.name}")
您还可以访问 List 类型,例如从您可以执行的地址获取行:
simple("${body.address.lines[0]}")
simple("${body.address.lines[1]}")
simple("${body.address.lines[2]}")
有一个特殊的 最后一个 关键字,可用于从列表中获取最后一个值。
simple("${body.address.lines[last]}")
另外,要得到最后的 2 个可以减去一个数字,因此我们可以使用 last-1 表示:
simple("${body.address.lines[last-1]}")第三部分是课程:
simple("${body.address.lines[last-2]}")您可以在列表上调用 size 方法
simple("${body.address.lines.size}")Camel 也支持 Java 阵列的长度字段,例如:
String[] lines = new String[]{"foo", "bar", "cat"};
exchange.getIn().setBody(lines);
simple("There are ${body.length} lines")而且是,您可以将其与 Operator 支持相结合,如下所示:
simple("${body.address.zip} > 1000")74.4. Operator 支持
解析器仅限于支持单个 Operator。
要启用它的值,必须用 $\\{ } 括起来。语法为:
${leftValue} OP rightValue
其中 rightValue 可以是 '、null、一个常量值或以 $\{ } 括起的其他表达式的字面值。
Operator 之间必须 有空格。
Camel 将自动将 rightValue 类型转换为 leftValue 类型,例如它可以将一个字符串转换为一个数字,因此可以使用 > 来比较数字值。
支持以下 Operator:
| 操作符 | 描述 |
|---|---|
| == | equals |
| =~ | 等于忽略问题单(在比较字符串值时忽略大小写) |
| > | 大于 |
| >= | 大于或等于 |
| < | 小于 |
| ⇐ | 小于或等于 |
| != | 不等于 |
| !=~ | 不等于忽略大小写(在比较字符串值时忽略问题单) |
| contains | 测试是否包含在基于字符串的值中 |
| !contains | 测试是否没有包含在基于字符串的值中 |
| ~~ | 对于在基于字符串的值中忽略大小写敏感度,用于测试 |
| !~~ | 在基于字符串的值中忽略问题单敏感度来进行测试 |
| regex | 用于与定义为 String 值的给定正则表达式模式匹配 |
| !regex | 对于不匹配给定正则表达式模式,定义为 String 值 |
| in | 要在一组值中匹配,每个元素必须以逗号分隔。如果要包含空值,则必须使用双逗号(如 ',bronze,silver,gold')来定义它,这是一组带有空值的四个值,然后是三个组。 |
| !in | 若要匹配(如果没有在一组值中),每个元素必须以逗号分隔。如果要包含空值,则必须使用双逗号(如 ',bronze,silver,gold')来定义它,这是一组带有空值的四个值,然后是三个组。 |
| is | 如果左侧类型是值的实例,则匹配。 |
| !is | 如果左侧类型不是值的实例,则匹配。 |
| range |
若要匹配,如果左侧位于定义为数字的范围,即 |
| !range |
若要匹配,如果左侧左侧不在定义为数字的范围,即 |
| startsWith | 为了测试左侧字符串是否以右手字符串开头。 |
| 以 用户身份开始 | 与 startWith operator 相同。 |
| endwith | 进行测试,请测试左侧字符串以右手字符串结尾。 |
| 结束 | 与 endWith operator 相同。 |
可以使用以下元运算符:
| 操作符 | 描述 |
|---|---|
| ++ | 递增一个数字。左侧必须是函数,否则将解析为字面。 |
| — | 逐个减少一个数字。左侧必须是函数,否则将解析为字面。 |
| \n | 使用换行符。 |
| \t | 使用制表符。 |
| \r | 使用回车返回字符。 |
| \} | 将 } 字符用作文本。使用简单语言构建 JSon 结构时可能需要这样做。 |
以下逻辑运算符可用于对表达式进行分组:
| 操作符 | 描述 |
|---|---|
| && | 逻辑和运算符用于对两个表达式进行分组。 |
| 逻辑或运算符用于对两个表达式进行分组。 |
AND 的语法是:
${leftValue} OP rightValue && ${leftValue} OP rightValueOR 的语法是:
${leftValue} OP rightValue || ${leftValue} OP rightValue一些示例:
// exact equals match
simple("${header.foo} == 'foo'")
// ignore case when comparing, so if the header has value FOO this will match
simple("${header.foo} =~ 'foo'")
// here Camel will type convert '100' into the type of header.bar and if it is an Integer '100' will also be converter to an Integer
simple("${header.bar} == '100'")
simple("${header.bar} == 100")
// 100 will be converter to the type of header.bar so we can do > comparison
simple("${header.bar} > 100")74.4.1. 与不同类型的比较
当您与 String 和 int 等不同类型的类型进行比较时,您必须小心谨慎。Camel 将使用左侧的类型作为第一优先级。如果这两个值都无法根据这个类型进行比较,并回退到右手类型。
这意味着您可以省略要强制执行特定类型的值。假设上面的 bar 值是一个字符串。然后您可以省略 equation:
simple("100 < ${header.bar}")然后,这样可确保 int 类型被用作 1st 优先级。
如果 Camel 团队根据数字类型改进二进制比较操作,这将在以后有所变化。最常见的是字符串类型,其在与数字比较时会导致问题。
// testing for null
simple("${header.baz} == null")
// testing for not null
simple("${header.baz} != null")再一个更高级的示例,其中正确的值是另一个表达式
simple("${header.date} == ${date:now:yyyyMMdd}")
simple("${header.type} == ${bean:orderService?method=getOrderType}")例如,如果标题包含 Camel 一词,则测试其标题包含:
simple("${header.title} contains 'Camel'")使用 regex 的示例,测试数字标头是否为 4 位值:
simple("${header.number} regex '\\d{4}'")
最后是一个示例,如果标头等于列表中的任何值。每个元素必须以逗号分隔,并且不用空格分开。
这也适用于数字,因为 Camel 会将每个元素转换为左侧类型。
simple("${header.type} in 'gold,silver'")对于最后 3 个,我们不支持使用 no 的 negate 测试:
simple("${header.type} !in 'gold,silver'")您也可以测试类型是否为特定实例,例如,例如,字符串
simple("${header.type} is 'java.lang.String'")
我们为所有 java.lang 类型添加了简写,以便您可以将其编写为:
simple("${header.type} is 'String'")还支持范围。范围间隔需要数字,包括 from 和 end。例如,测试一个值是否介于 100 到 199 之间:
simple("${header.number} range 100..199")
请注意,我们在没有空格的情况下在 范围内使用 ..。它基于与 Groovy 相同的语法。
simple("${header.number} range '100..199'")由于 XML DSL 没有作为 Java DSL 及其所有各种构建器方法的所有能力,因此您必须利用一些其他语言来通过简单运算符进行测试。现在,您可以使用简单语言进行此操作。在以下示例中,我们要测试标头是否为小部件顺序:
<from uri="seda:orders">
<filter>
<simple>${header.type} == 'widget'</simple>
<to uri="bean:orderService?method=handleWidget"/>
</filter>
</from>74.4.2. 使用 和 / 或
如果您有两个表达式,您可以将它们与 & amp;& 或 || operator 组合。
例如:
simple("${header.title} contains 'Camel' && ${header.type'} == 'gold'")
另外,还支持 ||。这个示例是:
simple("${header.title} contains 'Camel' || ${header.type'} == 'gold'")74.5. 例子
在下面的 XML DSL 示例中,我们根据标头值进行过滤:
<from uri="seda:orders">
<filter>
<simple>${header.foo}</simple>
<to uri="mock:fooOrders"/>
</filter>
</from>
Simple 语言可用于在 Message Filter 模式中用于上述 predicate 测试,其中我们测试 in 消息是否具有 foo 标头(一个带有键 foo 的标头)。如果表达式评估为 true,则消息将路由到 mock:fooOrders 端点,否则消息将被丢弃。
Java DSL 中的同一示例:
from("seda:orders")
.filter().simple("${header.foo}")
.to("seda:fooOrders");您还可以将简单语言用于简单的文本串联,例如:
from("direct:hello")
.transform().simple("Hello ${header.user} how are you?")
.to("mock:reply");请注意,我们必须在表达式中使用 $\\{ } 占位符,以便 Camel 能够正确解析它。
这个示例使用 date 命令输出当前日期。
from("direct:hello")
.transform().simple("The today is ${date:now:yyyyMMdd} and it is a great day.")
.to("mock:reply");在以下示例中,我们调用 bean 语言来调用要包含在返回字符串中的 bean 的方法:
from("direct:order")
.transform().simple("OrderId: ${bean:orderIdGenerator}")
.to("mock:reply");
其中 orderIdGenerator 是 Registry 中注册的 bean 的 id。如果使用 Spring,则它是 Spring bean id。
如果要声明在 id 生成器 Bean 上调用哪种方法,我们必须加上 .method 名称,比如在我们调用 generateId 方法的下面。
from("direct:order")
.transform().simple("OrderId: ${bean:orderIdGenerator.generateId}")
.to("mock:reply");
我们可以使用对 Bean 组件本身熟悉的 ?method=methodname 选项:
from("direct:order")
.transform().simple("OrderId: ${bean:orderIdGenerator?method=generateId}")
.to("mock:reply");您还可以将正文转换为给定类型,例如确保它是一个字符串:
<transform>
<simple>Hello ${bodyAs(String)} how are you?</simple>
</transform>
有几个类型具有简写表示法,因此我们可以使用 String 而不是 java.lang.String。这些是: byte[]、String、Integer、Long。所有其他类型都必须使用其 FQN 名称,如 org.w3c.dom.Document。
也可以从标题 映射 中查找值:
<transform>
<simple>The gold value is ${header.type[gold]}</simple>
</transform>
在上面的代码中,我们使用名称 类型 查找标头,并将其视为 java.util.Map,然后使用键 gold 进行查找并返回该值。如果标头无法转换为 Map an exception。如果名称 类型 的标头不存在 null,则返回。
您可以嵌套功能,如下所示:
<setHeader name="myHeader">
<simple>${properties:${header.someKey}}</simple>
</setHeader>74.6. 设置结果类型
现在,您可以为 Simple 表达式提供结果类型,这意味着评估的结果将转换为所需的类型。这最常用于定义布尔值、整数等类型。
例如,要将标头设置为布尔值类型,您可以:
.setHeader("cool", simple("true", Boolean.class))在 XML DSL 中
<setHeader name="cool"> <!-- use resultType to indicate that the type should be a java.lang.Boolean --> <simple resultType="java.lang.Boolean">true</simple> </setHeader>
74.7. 在 XML DSL 中使用新行或标签页
更轻松地在 XML DSL 中指定新行或标签页,因为您可以立即转义值
<transform> <simple>The following text\nis on a new line</simple> </transform>
74.8. 领先的和尾随空格处理
表达式的 trim 属性可用于控制前导和尾随空格字符是否已删除或保留。默认值为 true,它会删除空格字符。
<setBody> <simple trim="false">You get some trailing whitespace characters. </simple> </setBody>
74.9. 从外部资源载入脚本
您可以对脚本进行外部化,并让 Camel 从资源(如 "classpath:"、"file:" 或 "http:" )加载它。这可以通过以下语法完成:" resource:scheme:location",例如引用您可以进行的类路径中的文件:
.setHeader("myHeader").simple("resource:classpath:mysimple.txt")74.10. Spring Boot Auto-Configuration
在与 Spring Boot 中使用 simple 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-core-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 147 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.cloud.consul.service-discovery.acl-token | 设置要与 Consul 一起使用的 ACL 令牌。 | 字符串 | |
| camel.cloud.consul.service-discovery.block-seconds | 等待监视事件的秒数,默认为 10 秒。 | 10 | 整数 |
| camel.cloud.consul.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.consul.service-discovery.connect-timeout-millis | OkHttpClient 的连接超时。 | Long | |
| camel.cloud.consul.service-discovery.datacenter | 数据中心。 | 字符串 | |
| camel.cloud.consul.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.consul.service-discovery.password | 设置用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.consul.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.consul.service-discovery.read-timeout-millis | OkHttpClient 的读取超时。 | Long | |
| camel.cloud.consul.service-discovery.url | Consul 代理 URL。 | 字符串 | |
| camel.cloud.consul.service-discovery.user-name | 设置用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.consul.service-discovery.write-timeout-millis | OkHttpClient 的写入超时。 | Long | |
| camel.cloud.dns.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.dns.service-discovery.domain | 域名; | 字符串 | |
| camel.cloud.dns.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.dns.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.dns.service-discovery.proto | 所需服务的传输协议。 | _tcp | 字符串 |
| camel.cloud.etcd.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.etcd.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.etcd.service-discovery.password | 用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.etcd.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.etcd.service-discovery.service-path | 用于查找服务发现的路径。 | /services/ | 字符串 |
| camel.cloud.etcd.service-discovery.timeout | 要设置操作完成的最长时间。 | Long | |
| camel.cloud.etcd.service-discovery.type | 要设置发现类型,有效的值为 on-demand 和 watch。 | 按需 | 字符串 |
| camel.cloud.etcd.service-discovery.uris | 客户端可以连接的 URI。 | 字符串 | |
| camel.cloud.etcd.service-discovery.user-name | 用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.api-version | 使用客户端查找时设置 API 版本。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-data | 使用客户端查找时设置证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-file | 设置在使用客户端查找时从文件加载的证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-data | 使用客户端查找时设置客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-file | 设置在使用客户端查找时从文件加载的客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-algo | 在使用客户端查找时设置客户端密钥存储算法,如 RSA。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-data | 在使用客户端查找时设置 Client Keystore 数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-file | 设置在使用客户端查找时从文件加载的客户端密钥存储数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-passphrase | 在使用客户端查找时设置客户端密钥存储密码短语。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.kubernetes.service-discovery.dns-domain | 设置用于 DNS 查找的 DNS 域。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.kubernetes.service-discovery.lookup | 如何执行服务查找。可能的值: client, dns, environment。在使用客户端时,客户端查询 kubernetes master 以获取提供服务的活动 pod 列表,然后随机(或循环)选择一个 pod。使用 dns 时,服务名称被解析为 name.namespace.svc.dnsDomain。当使用 dnssrv 时,服务名称通过 SRV 查询解析 .…svc… when 使用环境变量来查找该服务。默认情况下使用环境。 | 环境 | 字符串 |
| camel.cloud.kubernetes.service-discovery.master-url | 使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用 ENV 变量 KUBERNETES_MASTER 中的 namespace。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.oauth-token | 在使用客户端查找时,设置用于身份验证的 OAUTH 令牌(而不是用户名/密码)。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.password | 在使用客户端查找时,设置用于身份验证的密码。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-name | 设置 DNS/DNSSRV 查找时使用的端口名称。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-protocol | 设置用于 DNS/DNSSRV 查找的端口协议。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.kubernetes.service-discovery.trust-certs | 设置在使用客户端查找时是否打开信任证书检查。 | false | 布尔值 |
| camel.cloud.kubernetes.service-discovery.username | 在使用客户端查找时,设置用于身份验证的用户名。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.client-name | 设置 Ribbon 客户端名称。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.configurations | 定义其他配置定义。 | map | |
| camel.cloud.ribbon.load-balancer.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.ribbon.load-balancer.namespace | 命名空间。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.password | 密码。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.ribbon.load-balancer.username | 用户名。 | 字符串 | |
| camel.hystrix.allow-maximum-size-to-diverge-from-core-size | 允许配置 maximumSize 生效。然后该值可以等于或大于 coreSize。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-enabled | 是否使用 HystrixCircuitBreaker。如果为 false,则将使用 断路器 逻辑,并且允许的所有请求。这与 circuitBreakerForceClosed ()类似,除了继续跟踪指标并知道它是否应该处于打开/关闭状态外,此属性也不会实例化断路器。 | true | 布尔值 |
| camel.hystrix.circuit-breaker-error-threshold-percentage | 错误百分比阈值(如 50)指向断路器将开放和拒绝请求。它将保持在 circuitBreakerSleepWindowInMilliseconds 中定义的持续时间;与 HystrixCommandMetrics.getHealthCounts ()进行比较的错误百分比。 | 50 | 整数 |
| camel.hystrix.circuit-breaker-force-closed | 如果为 true,HystrixCircuitBreaker#allowRequest ()将始终返回 true 以允许请求,而不考虑 HystrixCommandMetrics.getHealthCounts ()中的错误百分比。circuitBreakerForceOpen ()属性具有优先权,因此如果设为 true,则此属性不会执行。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(条带)并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-request-volume-threshold | 指标RollingStatisticalWindowInMilliseconds ()中必须存在于 HystrixCircuitBreaker 的最小请求数。如果在这个数量下,无论错误百分比如何,电路不会条带化。 | 20 | 整数 |
| camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreakertrips 打开 HystrixCircuitBreaker 往返时间(以毫秒为单位),在尝试请求前应等待的时间(毫秒)。 | 5000 | 整数 |
| camel.hystrix.configurations | 定义其他配置定义。 | map | |
| camel.hystrix.core-pool-size | 传递给 java.util.concurrent.ThreadPoolExecutor#setCorePoolSize (int)的核心 thread-pool 大小。 | 10 | 整数 |
| camel.hystrix.enabled | 启用组件。 | true | 布尔值 |
| camel.hystrix.execution-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.run ()的并发请求数。超出并发限制的请求将被拒绝。Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | 整数 |
| camel.hystrix.execution-isolation-strategy | 将通过以下方式执行哪些隔离策略 HystrixCommand.run ():如果 THREAD,它将在单独的线程上执行,并且并发请求受 thread-pool 中的线程数量限制。如果 SEMAPHORE,它将在调用线程上执行,并且由 semaphore 数限制的并发请求。 | 线程 | 字符串 |
| camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 Future# canceled )。仅在 executionIsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
| camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
| camel.hystrix.execution-timeout-in-milliseconds | 命令超时并停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 并且命令是 thread-isolated,则执行线程将中断。如果命令是 semaphore-isolated 和 HystrixObservableCommand,则该命令将被取消订阅。 | 1000 | 整数 |
| camel.hystrix.fallback-enabled | 出现故障时是否应该尝试 HystrixCommand.getFallback ()。 | true | 布尔值 |
| camel.hystrix.fallback-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.getFallback ()的并发请求数。超出并发限制的请求将很快失败,且不会尝试检索回退。 | 10 | 整数 |
| camel.hystrix.group-key | 设置要使用的组密钥。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
| camel.hystrix.keep-alive-time | keep-alive 时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
| camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会意外地更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
| camel.hystrix.maximum-size | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) .这是在没有开始拒绝 HystrixCommands 的情况下支持的最大并发数。请注意,只有在您还设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
| camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 允许计算成功和错误百分比并影响 HystrixCircuitBreaker.isOpen ()状态的健康快照之间等待的时间(毫秒)。在高容量电路上,错误百分比的持续计算可能会成为 CPU 密集型,从而控制它计算的频率。 | 500 | 整数 |
| camel.hystrix.metrics-rolling-percentile-bucket-size | 存储在滚动百分比的每个存储桶中的最大值数。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 在 HystrixCommandMetrics 中捕获百分比的指标。 | true | 布尔值 |
| camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动百分比窗口的 bucket 数量已分为.这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 6 | 整数 |
| camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的百分比滚动窗口。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10000 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这传递到 HystrixCommandMetrics 中的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-in-milliseconds | 此属性设置统计滚动窗口的持续时间,以毫秒为单位。这是为线程池保留指标的时间。窗口被分成 bucket,按这些递增来滚动。 | 10000 | 整数 |
| camel.hystrix.queue-size-rejection-threshold | 队列大小拒绝阈值是一个人为最大大小,即使未达到 maxQueueSize,也会发生拒绝的大小。这是因为 BlockingQueue 的 maxQueueSize 无法动态更改,我们希望支持动态更改会影响拒绝的队列大小。在排队线程执行时,HystrixCommand 使用它。 | 5 | 整数 |
| camel.hystrix.request-log-enabled | HystrixCommand 执行和事件是否应记录到 HystrixRequestLog。 | true | 布尔值 |
| camel.hystrix.thread-pool-key | 设置要使用的线程池密钥。默认情况下,将使用与 groupKey 相同的值。 | CamelHystrix | 字符串 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-in-milliseconds | 统计滚动窗口的持续时间(以毫秒为单位)。这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10000 | 整数 |
| camel.language.constant.enabled | 是否启用恒定语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.constant.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.csimple.enabled | 是否启用 csimple 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.csimple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.exchangeproperty.enabled | 是否启用 ExchangeProperty 语言自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.exchangeproperty.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.file.enabled | 是否启用文件语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.file.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.header.enabled | 是否启用标头语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.header.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.ref.enabled | 是否启用 ref 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.ref.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.simple.enabled | 是否启用简单语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.simple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.tokenize.enabled | 是否启用令牌语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.tokenize.group-delimiter | 设置分组时要使用的分隔符。如果没有设置,则令牌将用作分隔符。 | 字符串 | |
| camel.language.tokenize.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.resilience4j.automatic-transition-from-open-to-half-open-enabled | 在 waitDurationInOpenState 通过后,启用从 OPEN 自动过渡到 HALF_OPEN 状态。 | false | 布尔值 |
| camel.resilience4j.circuit-breaker-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreaker 实例,以便从 registry 查找和使用。在使用它时,不使用任何其他断路器选项。 | 字符串 | |
| camel.resilience4j.config-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreakerConfig 实例,用于从 registry 查找和使用。 | 字符串 | |
| camel.resilience4j.configurations | 定义其他配置定义。 | map | |
| camel.resilience4j.enabled | 启用组件。 | true | 布尔值 |
| camel.resilience4j.failure-rate-threshold | 配置故障率阈值(以百分比表示)。如果失败率相等或大于 CircuitBreaker 转换的阈值,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 50 个百分比。 | 浮点值 | |
| camel.resilience4j.minimum-number-of-calls | 配置 CircuitBreaker 可以计算错误率前所需的最少调用数(每个滑动窗口期限)。例如,如果 minimumNumberOfCalls 为 10,则必须记录至少 10 个调用,然后才能计算失败率。如果只记录 9 个调用,则 CircuitBreaker 不会过渡到 open,即使所有 9 调用都失败。默认 minimumNumberOfCalls 为 100。 | 100 | 整数 |
| camel.resilience4j.permitted-number-of-calls-in-half-open-state | 当 CircuitBreaker 为一半打开时,配置允许的调用数量。大小必须大于 0。默认大小为 10。 | 10 | 整数 |
| camel.resilience4j.sliding-window-size | 配置 sliding 窗口的大小,用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置 sliding 窗口的大小。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。slidingWindowSize 必须大于 0。minimumNumberOfCalls 必须大于 0。如果 slidingWindowType 是 COUNT_BASED,则 minimumNumberOfCalls 无法大于 slidingWindowSize。如果 slidingWindowType 是 TIME_BASED,您可以选择任何您想要的。默认 slidingWindowSize 为 100。 | 100 | 整数 |
| camel.resilience4j.sliding-window-type | 配置 sliding 窗口的类型,用于在 CircuitBreaker 关闭时记录调用的结果。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。默认 slidingWindowType 为 COUNT_BASED。 | COUNT_BASED | 字符串 |
| camel.resilience4j.slow-call-duration-threshold | 配置上面的持续时间阈值(秒),其调用被视为较慢,并增加较慢的调用百分比。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.slow-call-rate-threshold | 配置一个阈值(以百分比表示)。当调用持续时间大于 slowCallDurationThreshold Duration 时,CircuitBreaker 会将一个调用视为 slowCallDurationThreshold Duration。当较慢的调用百分比相等或大于阈值时,CircuitBreaker 过渡到 open,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 100 百分比,这意味着所有记录的调用都必须比 slowCallDurationThreshold 慢。 | 浮点值 | |
| camel.resilience4j.wait-duration-in-open-state | 配置等待持续时间(以秒为单位),用于指定 CircuitBreaker 应该打开的时间,然后再切换到一半打开。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.writable-stack-trace-enabled | 启用可写堆栈跟踪。当设置为 false 时,Exception.getStackTrace 返回零长度数组。当断路器处于开路时,这可用于减少日志垃圾邮件,因为已经知道例外原因(断路器是短路调用)。 | true | 布尔值 |
| camel.rest.api-component | 用作 REST API (如 swagger)的 Camel 组件的名称(如 swagger)没有明确配置 API 组件,则 Camel 组件将查找,如果 registry 中注册了 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.api-context-path | 设置领先的 API 上下文路径,即 REST API 服务要使用的路径。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。 | 字符串 | |
| camel.rest.api-context-route-id | 设置路由 id,以用于服务 REST API 的路由。路由默认使用自动分配的路由 ID。 | 字符串 | |
| camel.rest.api-host | 要将特定主机名用于 API 文档(如 swagger),可以使用这个配置的主机名覆盖生成的主机。 | 字符串 | |
| camel.rest.api-property | 允许为 api 文档(swagger)配置任意数量的附加属性。例如,将属性 api.title 设置为我的冷却。 | map | |
| camel.rest.api-vendor-extension | 在 Rest API 中是否启用了供应商扩展。如果启用,Camel 将包括附加信息作为厂商扩展(如以 x- 开头的密钥),如路由 ID、类名称等。在导入 API 文档时,并非所有第三方 API 网关和工具都支持 vendor-extensions。 | false | 布尔值 |
| camel.rest.binding-mode | 设置要使用的绑定模式。默认值为 off。 | RestBindingMode | |
| camel.rest.client-request-validation | 是否启用客户端请求的验证,以检查客户端的 Content-Type 和 Accept 标头是否受其消耗/生成的设置的 Rest-DSL 配置支持。这可打开,以启用此检查。如果验证错误,则返回 HTTP Status Code 415 或 406。默认值为 false。 | false | 布尔值 |
| camel.rest.component | 用于 REST 传输(使用者)的 Camel Rest 组件,如 netty-http, jetty, servlet, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.component-property | 允许为正在使用的其余组件配置更多附加属性。 | map | |
| camel.rest.consumer-property | 允许为正在使用的其余使用者配置更多附加属性。 | map | |
| camel.rest.context-path | 设置 REST 服务将使用的前导 context-path。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。或用于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
| camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | map | |
| camel.rest.data-format-property | 允许为使用中的数据格式配置任意数量的附加属性。例如,将 property prettyPrint 设置为 true 以将 json 输出设置为 pretty 模式。属性可以加上前缀,表示选项仅适用于 JSON 或 XML,对于 IN 或 OUT。前缀为: json.in. json.out. xml.in. xml.out。例如,值为 xml.out.mustBeJAXBElement 的键仅适用于传出的 XML 数据格式。没有前缀的密钥是所有情况的通用键。 | map | |
| camel.rest.enable-cors | 是否在 HTTP 响应中启用 CORS 标头。默认值为 false。 | false | 布尔值 |
| camel.rest.endpoint-property | 允许为正在使用的其余端点配置更多附加属性。 | map | |
| camel.rest.host | 用于公开 REST 服务的主机名。 | 字符串 | |
| camel.rest.host-name-resolver | 如果没有配置主机名,则使用此解析器计算 REST 服务将使用的主机名。 | RestHostNameResolver | |
| camel.rest.json-data-format | 要使用的特定 json 数据格式的名称。默认情况下将使用 json-jackson。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.port | 用于公开 REST 服务的端口号。请注意,如果您使用 servlet 组件,则此处配置的端口号不适用,因为使用中的端口号是 servlet 组件使用的实际端口号。例如,使用 Apache Tomcat 将其 tomcat http 端口用于 tomcat http 端口(如果在 firewall 中默认使用端口 8181 )虽然在这些情况下,这里设置端口号,但允许工具和 JMX 知道端口号,因此建议将端口号设置为 servlet 引擎使用的数字。 | 字符串 | |
| camel.rest.producer-api-doc | 设置 REST 制作者将用来验证 REST uri 和查询参数的 api 文档(swagger api)的位置,对 api 文档相应地生效。这需要将 camel-swagger-java 添加到 classpath 中,任何未命中配置都让 Camel 在启动时失败并报告错误。默认情况下,api 文档的位置从类路径加载,但您可以使用 file: 或 http: 引用从文件或 http url 加载的资源。 | 字符串 | |
| camel.rest.producer-component | 设置要用作 REST producer 的 Camel 组件的名称。 | 字符串 | |
| camel.rest.scheme | 用于公开 REST 服务的方案。通常支持 http 或 https。默认值为 http。 | 字符串 | |
| camel.rest.skip-binding-on-error-code | 如果存在自定义 HTTP 错误代码标头,是否跳过输出绑定。这允许构建不绑定到 json / xml 等自定义错误消息,否则成功信息会这样做。 | false | 布尔值 |
| camel.rest.use-x-forward-headers | 是否将 X-Forward 标头用于主机和相关设置。默认值为 true。 | true | 布尔值 |
| camel.rest.xml-data-format | 要使用的特定 XML 数据格式的名称。默认情况下将使用 jaxb。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.api-context-id-pattern | 弃用了 CamelContext id 模式,以只允许 CamelContext 中名称与模式匹配的其他服务的 Rest API。模式 名称 指的是 CamelContext 名称,仅匹配当前的 CamelContext。对于任何其他值,模式使用 PatternHelper#matchPattern (String,String)中的规则。 | 字符串 | |
| camel.rest.api-context-listing | 弃用了 设置是否启用了 JVM 中带有 REST 服务的所有可用 CamelContext 的列表。如果启用它允许发现这些上下文,如果为 false,则只使用当前的 CamelContext。 | false | 布尔值 |
第 75 章 tokenize
令牌化语言是内置语言,其采用 camel-core,最常与 Split EIP 一起使用,使用基于令牌的策略来分割消息。
令牌编码语言旨在使用指定的分隔符模式对文本文档进行令牌化。它还可用于以一些有限功能对 XML 文档进行令牌化。对于真正 XML 感知型令牌,建议使用 XML 令牌化 语言,因为它为 XML 文档提供了更快、更有效的令牌化。
75.1. tokenize Options
Tokenize 语言支持 11 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| token |
| 需要 用作 tokenizer 的令牌,例如您可以使用新行令牌。您可以使用简单语言作为令牌来支持动态令牌。 | |
| endToken |
| 如果使用 start/end 令牌对,则用作 tokenizer 的最终用户。您可以使用简单语言作为令牌来支持动态令牌。 | |
| inheritNamespaceTagName |
| 要在使用 XML 时从 root/parent 标签名称继承命名空间,您可以使用简单语言作为标签名称来支持动态名称。 | |
| headerName |
| 要解码的标头名称,而不是使用邮件正文。 | |
| regex |
| 如果令牌是正则表达式模式。默认值为 false。 | |
| XML |
| 输入是否是 XML 消息。如果使用 XML 有效负载,则必须将这个选项设置为 true。 | |
| includeTokens |
| 在使用对对值时,是否将令牌包含在部分中,默认值为 false。 | |
| group |
| 将 N 部分分组在一起,例如将大型文件分成 1000 行的块。您可以使用简单语言作为组来支持动态组群大小。 | |
| groupDelimiter |
| 设置分组时要使用的分隔符。如果没有设置,则令牌将用作分隔符。 | |
| skipFirst |
| 用于跳过前一个元素。 | |
| trim |
| 是否修剪值以移除前导和尾随空格和换行符。 |
75.2. 示例
以下示例演示了如何从 direct:a 端点获取请求,然后使用 Expression 将其分成部分,然后将每个片段转发到 direct:b:
<route>
<from uri="direct:a"/>
<split>
<tokenize token="\n"/>
<to uri="direct:b"/>
</split>
</route>在 Java DSL 中:
from("direct:a")
.split(body().tokenize("\n"))
.to("direct:b");75.3. 另请参阅
有关更多示例,请参阅 Split EIP。
75.4. Spring Boot Auto-Configuration
当将令牌化用于 Spring Boot 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-core-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 147 选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.cloud.consul.service-discovery.acl-token | 设置要与 Consul 一起使用的 ACL 令牌。 | 字符串 | |
| camel.cloud.consul.service-discovery.block-seconds | 等待监视事件的秒数,默认为 10 秒。 | 10 | 整数 |
| camel.cloud.consul.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.consul.service-discovery.connect-timeout-millis | OkHttpClient 的连接超时。 | Long | |
| camel.cloud.consul.service-discovery.datacenter | 数据中心。 | 字符串 | |
| camel.cloud.consul.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.consul.service-discovery.password | 设置用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.consul.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.consul.service-discovery.read-timeout-millis | OkHttpClient 的读取超时。 | Long | |
| camel.cloud.consul.service-discovery.url | Consul 代理 URL。 | 字符串 | |
| camel.cloud.consul.service-discovery.user-name | 设置用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.consul.service-discovery.write-timeout-millis | OkHttpClient 的写入超时。 | Long | |
| camel.cloud.dns.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.dns.service-discovery.domain | 域名; | 字符串 | |
| camel.cloud.dns.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.dns.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.dns.service-discovery.proto | 所需服务的传输协议。 | _tcp | 字符串 |
| camel.cloud.etcd.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.etcd.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.etcd.service-discovery.password | 用于基本身份验证的密码。 | 字符串 | |
| camel.cloud.etcd.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.etcd.service-discovery.service-path | 用于查找服务发现的路径。 | /services/ | 字符串 |
| camel.cloud.etcd.service-discovery.timeout | 要设置操作完成的最长时间。 | Long | |
| camel.cloud.etcd.service-discovery.type | 要设置发现类型,有效的值为 on-demand 和 watch。 | 按需 | 字符串 |
| camel.cloud.etcd.service-discovery.uris | 客户端可以连接的 URI。 | 字符串 | |
| camel.cloud.etcd.service-discovery.user-name | 用于基本身份验证的用户名。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.api-version | 使用客户端查找时设置 API 版本。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-data | 使用客户端查找时设置证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.ca-cert-file | 设置在使用客户端查找时从文件加载的证书颁发机构数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-data | 使用客户端查找时设置客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-cert-file | 设置在使用客户端查找时从文件加载的客户端证书数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-algo | 在使用客户端查找时设置客户端密钥存储算法,如 RSA。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-data | 在使用客户端查找时设置 Client Keystore 数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-file | 设置在使用客户端查找时从文件加载的客户端密钥存储数据。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.client-key-passphrase | 在使用客户端查找时设置客户端密钥存储密码短语。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.configurations | 定义其他配置定义。 | map | |
| camel.cloud.kubernetes.service-discovery.dns-domain | 设置用于 DNS 查找的 DNS 域。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.kubernetes.service-discovery.lookup | 如何执行服务查找。可能的值: client, dns, environment。在使用客户端时,客户端查询 kubernetes master 以获取提供服务的活动 pod 列表,然后随机(或循环)选择一个 pod。使用 dns 时,服务名称被解析为 name.namespace.svc.dnsDomain。当使用 dnssrv 时,服务名称通过 SRV 查询解析 .…svc… when 使用环境变量来查找该服务。默认情况下使用环境。 | 环境 | 字符串 |
| camel.cloud.kubernetes.service-discovery.master-url | 使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用 ENV 变量 KUBERNETES_MASTER 中的 namespace。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.oauth-token | 在使用客户端查找时,设置用于身份验证的 OAUTH 令牌(而不是用户名/密码)。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.password | 在使用客户端查找时,设置用于身份验证的密码。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-name | 设置 DNS/DNSSRV 查找时使用的端口名称。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.port-protocol | 设置用于 DNS/DNSSRV 查找的端口协议。 | 字符串 | |
| camel.cloud.kubernetes.service-discovery.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.kubernetes.service-discovery.trust-certs | 设置在使用客户端查找时是否打开信任证书检查。 | false | 布尔值 |
| camel.cloud.kubernetes.service-discovery.username | 在使用客户端查找时,设置用于身份验证的用户名。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.client-name | 设置 Ribbon 客户端名称。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.configurations | 定义其他配置定义。 | map | |
| camel.cloud.ribbon.load-balancer.enabled | 启用组件。 | true | 布尔值 |
| camel.cloud.ribbon.load-balancer.namespace | 命名空间。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.password | 密码。 | 字符串 | |
| camel.cloud.ribbon.load-balancer.properties | 设置要使用的客户端属性。这些属性特定于正在使用的服务调用实现。例如,如果使用 ribbon,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。 | map | |
| camel.cloud.ribbon.load-balancer.username | 用户名。 | 字符串 | |
| camel.hystrix.allow-maximum-size-to-diverge-from-core-size | 允许配置 maximumSize 生效。然后该值可以等于或大于 coreSize。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-enabled | 是否使用 HystrixCircuitBreaker。如果为 false,则将使用 断路器 逻辑,并且允许的所有请求。这与 circuitBreakerForceClosed ()类似,除了继续跟踪指标并知道它是否应该处于打开/关闭状态外,此属性也不会实例化断路器。 | true | 布尔值 |
| camel.hystrix.circuit-breaker-error-threshold-percentage | 错误百分比阈值(如 50)指向断路器将开放和拒绝请求。它将保持在 circuitBreakerSleepWindowInMilliseconds 中定义的持续时间;与 HystrixCommandMetrics.getHealthCounts ()进行比较的错误百分比。 | 50 | 整数 |
| camel.hystrix.circuit-breaker-force-closed | 如果为 true,HystrixCircuitBreaker#allowRequest ()将始终返回 true 以允许请求,而不考虑 HystrixCommandMetrics.getHealthCounts ()中的错误百分比。circuitBreakerForceOpen ()属性具有优先权,因此如果设为 true,则此属性不会执行。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(条带)并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
| camel.hystrix.circuit-breaker-request-volume-threshold | 指标RollingStatisticalWindowInMilliseconds ()中必须存在于 HystrixCircuitBreaker 的最小请求数。如果在这个数量下,无论错误百分比如何,电路不会条带化。 | 20 | 整数 |
| camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreakertrips 打开 HystrixCircuitBreaker 往返时间(以毫秒为单位),在尝试请求前应等待的时间(毫秒)。 | 5000 | 整数 |
| camel.hystrix.configurations | 定义其他配置定义。 | map | |
| camel.hystrix.core-pool-size | 传递给 java.util.concurrent.ThreadPoolExecutor#setCorePoolSize (int)的核心 thread-pool 大小。 | 10 | 整数 |
| camel.hystrix.enabled | 启用组件。 | true | 布尔值 |
| camel.hystrix.execution-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.run ()的并发请求数。超出并发限制的请求将被拒绝。Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | 整数 |
| camel.hystrix.execution-isolation-strategy | 将通过以下方式执行哪些隔离策略 HystrixCommand.run ():如果 THREAD,它将在单独的线程上执行,并且并发请求受 thread-pool 中的线程数量限制。如果 SEMAPHORE,它将在调用线程上执行,并且由 semaphore 数限制的并发请求。 | 线程 | 字符串 |
| camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 Future# canceled )。仅在 executionIsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
| camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
| camel.hystrix.execution-timeout-in-milliseconds | 命令超时并停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 并且命令是 thread-isolated,则执行线程将中断。如果命令是 semaphore-isolated 和 HystrixObservableCommand,则该命令将被取消订阅。 | 1000 | 整数 |
| camel.hystrix.fallback-enabled | 出现故障时是否应该尝试 HystrixCommand.getFallback ()。 | true | 布尔值 |
| camel.hystrix.fallback-isolation-semaphore-max-concurrent-requests | 允许 HystrixCommand.getFallback ()的并发请求数。超出并发限制的请求将很快失败,且不会尝试检索回退。 | 10 | 整数 |
| camel.hystrix.group-key | 设置要使用的组密钥。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
| camel.hystrix.keep-alive-time | keep-alive 时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
| camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会意外地更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
| camel.hystrix.maximum-size | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) .这是在没有开始拒绝 HystrixCommands 的情况下支持的最大并发数。请注意,只有在您还设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
| camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 允许计算成功和错误百分比并影响 HystrixCircuitBreaker.isOpen ()状态的健康快照之间等待的时间(毫秒)。在高容量电路上,错误百分比的持续计算可能会成为 CPU 密集型,从而控制它计算的频率。 | 500 | 整数 |
| camel.hystrix.metrics-rolling-percentile-bucket-size | 存储在滚动百分比的每个存储桶中的最大值数。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 在 HystrixCommandMetrics 中捕获百分比的指标。 | true | 布尔值 |
| camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动百分比窗口的 bucket 数量已分为.这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 6 | 整数 |
| camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的百分比滚动窗口。这传递到 HystrixRollingPercentile in HystrixCommandMetrics。 | 10000 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这传递到 HystrixCommandMetrics 中的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.metrics-rolling-statistical-window-in-milliseconds | 此属性设置统计滚动窗口的持续时间,以毫秒为单位。这是为线程池保留指标的时间。窗口被分成 bucket,按这些递增来滚动。 | 10000 | 整数 |
| camel.hystrix.queue-size-rejection-threshold | 队列大小拒绝阈值是一个人为最大大小,即使未达到 maxQueueSize,也会发生拒绝的大小。这是因为 BlockingQueue 的 maxQueueSize 无法动态更改,我们希望支持动态更改会影响拒绝的队列大小。在排队线程执行时,HystrixCommand 使用它。 | 5 | 整数 |
| camel.hystrix.request-log-enabled | HystrixCommand 执行和事件是否应记录到 HystrixRequestLog。 | true | 布尔值 |
| camel.hystrix.thread-pool-key | 设置要使用的线程池密钥。默认情况下,将使用与 groupKey 相同的值。 | CamelHystrix | 字符串 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-buckets | 滚动统计窗口的 bucket 数量已分为.这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10 | 整数 |
| camel.hystrix.thread-pool-rolling-number-statistical-window-in-milliseconds | 统计滚动窗口的持续时间(以毫秒为单位)。这会传递给每个 HystrixThreadPoolMetrics 实例内的 HystrixRollingNumber。 | 10000 | 整数 |
| camel.language.constant.enabled | 是否启用恒定语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.constant.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.csimple.enabled | 是否启用 csimple 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.csimple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.exchangeproperty.enabled | 是否启用 ExchangeProperty 语言自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.exchangeproperty.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.file.enabled | 是否启用文件语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.file.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.header.enabled | 是否启用标头语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.header.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.ref.enabled | 是否启用 ref 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.ref.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.simple.enabled | 是否启用简单语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.simple.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.language.tokenize.enabled | 是否启用令牌语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.tokenize.group-delimiter | 设置分组时要使用的分隔符。如果没有设置,则令牌将用作分隔符。 | 字符串 | |
| camel.language.tokenize.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
| camel.resilience4j.automatic-transition-from-open-to-half-open-enabled | 在 waitDurationInOpenState 通过后,启用从 OPEN 自动过渡到 HALF_OPEN 状态。 | false | 布尔值 |
| camel.resilience4j.circuit-breaker-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreaker 实例,以便从 registry 查找和使用。在使用它时,不使用任何其他断路器选项。 | 字符串 | |
| camel.resilience4j.config-ref | 代表现有的 io.github.resilience4j.circuitbreaker.CircuitBreakerConfig 实例,用于从 registry 查找和使用。 | 字符串 | |
| camel.resilience4j.configurations | 定义其他配置定义。 | map | |
| camel.resilience4j.enabled | 启用组件。 | true | 布尔值 |
| camel.resilience4j.failure-rate-threshold | 配置故障率阈值(以百分比表示)。如果失败率相等或大于 CircuitBreaker 转换的阈值,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 50 个百分比。 | 浮点值 | |
| camel.resilience4j.minimum-number-of-calls | 配置 CircuitBreaker 可以计算错误率前所需的最少调用数(每个滑动窗口期限)。例如,如果 minimumNumberOfCalls 为 10,则必须记录至少 10 个调用,然后才能计算失败率。如果只记录 9 个调用,则 CircuitBreaker 不会过渡到 open,即使所有 9 调用都失败。默认 minimumNumberOfCalls 为 100。 | 100 | 整数 |
| camel.resilience4j.permitted-number-of-calls-in-half-open-state | 当 CircuitBreaker 为一半打开时,配置允许的调用数量。大小必须大于 0。默认大小为 10。 | 10 | 整数 |
| camel.resilience4j.sliding-window-size | 配置 sliding 窗口的大小,用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置 sliding 窗口的大小。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。slidingWindowSize 必须大于 0。minimumNumberOfCalls 必须大于 0。如果 slidingWindowType 是 COUNT_BASED,则 minimumNumberOfCalls 无法大于 slidingWindowSize。如果 slidingWindowType 是 TIME_BASED,您可以选择任何您想要的。默认 slidingWindowSize 为 100。 | 100 | 整数 |
| camel.resilience4j.sliding-window-type | 配置 sliding 窗口的类型,用于在 CircuitBreaker 关闭时记录调用的结果。滑动窗口可以基于计数或基于时间。如果 slidingWindowType 是 COUNT_BASED,则记录和聚合最后一个 slidingWindowSize 调用。如果 slidingWindowType 是 TIME_BASED,则记录和聚合最后一个 slidingWindowSize 秒的调用。默认 slidingWindowType 为 COUNT_BASED。 | COUNT_BASED | 字符串 |
| camel.resilience4j.slow-call-duration-threshold | 配置上面的持续时间阈值(秒),其调用被视为较慢,并增加较慢的调用百分比。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.slow-call-rate-threshold | 配置一个阈值(以百分比表示)。当调用持续时间大于 slowCallDurationThreshold Duration 时,CircuitBreaker 会将一个调用视为 slowCallDurationThreshold Duration。当较慢的调用百分比相等或大于阈值时,CircuitBreaker 过渡到 open,并启动短路调用。阈值必须大于 0,且不能超过 100。默认值为 100 百分比,这意味着所有记录的调用都必须比 slowCallDurationThreshold 慢。 | 浮点值 | |
| camel.resilience4j.wait-duration-in-open-state | 配置等待持续时间(以秒为单位),用于指定 CircuitBreaker 应该打开的时间,然后再切换到一半打开。默认值为 60 秒。 | 60 | 整数 |
| camel.resilience4j.writable-stack-trace-enabled | 启用可写堆栈跟踪。当设置为 false 时,Exception.getStackTrace 返回零长度数组。当断路器处于开路时,这可用于减少日志垃圾邮件,因为已经知道例外原因(断路器是短路调用)。 | true | 布尔值 |
| camel.rest.api-component | 用作 REST API (如 swagger)的 Camel 组件的名称(如 swagger)没有明确配置 API 组件,则 Camel 组件将查找,如果 registry 中注册了 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.api-context-path | 设置领先的 API 上下文路径,即 REST API 服务要使用的路径。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。 | 字符串 | |
| camel.rest.api-context-route-id | 设置路由 id,以用于服务 REST API 的路由。路由默认使用自动分配的路由 ID。 | 字符串 | |
| camel.rest.api-host | 要将特定主机名用于 API 文档(如 swagger),可以使用这个配置的主机名覆盖生成的主机。 | 字符串 | |
| camel.rest.api-property | 允许为 api 文档(swagger)配置任意数量的附加属性。例如,将属性 api.title 设置为我的冷却。 | map | |
| camel.rest.api-vendor-extension | 在 Rest API 中是否启用了供应商扩展。如果启用,Camel 将包括附加信息作为厂商扩展(如以 x- 开头的密钥),如路由 ID、类名称等。在导入 API 文档时,并非所有第三方 API 网关和工具都支持 vendor-extensions。 | false | 布尔值 |
| camel.rest.binding-mode | 设置要使用的绑定模式。默认值为 off。 | RestBindingMode | |
| camel.rest.client-request-validation | 是否启用客户端请求的验证,以检查客户端的 Content-Type 和 Accept 标头是否受其消耗/生成的设置的 Rest-DSL 配置支持。这可打开,以启用此检查。如果验证错误,则返回 HTTP Status Code 415 或 406。默认值为 false。 | false | 布尔值 |
| camel.rest.component | 用于 REST 传输(使用者)的 Camel Rest 组件,如 netty-http, jetty, servlet, undertow。如果没有明确配置组件,则 Camel 将查找与 Rest DSL 集成的 Camel 组件,或者 registry 中注册了 org.apache.camel.spi.RestConsumerFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
| camel.rest.component-property | 允许为正在使用的其余组件配置更多附加属性。 | map | |
| camel.rest.consumer-property | 允许为正在使用的其余使用者配置更多附加属性。 | map | |
| camel.rest.context-path | 设置 REST 服务将使用的前导 context-path。这在使用 camel-servlet 等组件使用,其中部署的 Web 应用程序使用 context-path 部署。或用于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
| camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | map | |
| camel.rest.data-format-property | 允许为使用中的数据格式配置任意数量的附加属性。例如,将 property prettyPrint 设置为 true 以将 json 输出设置为 pretty 模式。属性可以加上前缀,表示选项仅适用于 JSON 或 XML,对于 IN 或 OUT。前缀为: json.in. json.out. xml.in. xml.out。例如,值为 xml.out.mustBeJAXBElement 的键仅适用于传出的 XML 数据格式。没有前缀的密钥是所有情况的通用键。 | map | |
| camel.rest.enable-cors | 是否在 HTTP 响应中启用 CORS 标头。默认值为 false。 | false | 布尔值 |
| camel.rest.endpoint-property | 允许为正在使用的其余端点配置更多附加属性。 | map | |
| camel.rest.host | 用于公开 REST 服务的主机名。 | 字符串 | |
| camel.rest.host-name-resolver | 如果没有配置主机名,则使用此解析器计算 REST 服务将使用的主机名。 | RestHostNameResolver | |
| camel.rest.json-data-format | 要使用的特定 json 数据格式的名称。默认情况下将使用 json-jackson。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.port | 用于公开 REST 服务的端口号。请注意,如果您使用 servlet 组件,则此处配置的端口号不适用,因为使用中的端口号是 servlet 组件使用的实际端口号。例如,使用 Apache Tomcat 将其 tomcat http 端口用于 tomcat http 端口(如果在 firewall 中默认使用端口 8181 )虽然在这些情况下,这里设置端口号,但允许工具和 JMX 知道端口号,因此建议将端口号设置为 servlet 引擎使用的数字。 | 字符串 | |
| camel.rest.producer-api-doc | 设置 REST 制作者将用来验证 REST uri 和查询参数的 api 文档(swagger api)的位置,对 api 文档相应地生效。这需要将 camel-swagger-java 添加到 classpath 中,任何未命中配置都让 Camel 在启动时失败并报告错误。默认情况下,api 文档的位置从类路径加载,但您可以使用 file: 或 http: 引用从文件或 http url 加载的资源。 | 字符串 | |
| camel.rest.producer-component | 设置要用作 REST producer 的 Camel 组件的名称。 | 字符串 | |
| camel.rest.scheme | 用于公开 REST 服务的方案。通常支持 http 或 https。默认值为 http。 | 字符串 | |
| camel.rest.skip-binding-on-error-code | 如果存在自定义 HTTP 错误代码标头,是否跳过输出绑定。这允许构建不绑定到 json / xml 等自定义错误消息,否则成功信息会这样做。 | false | 布尔值 |
| camel.rest.use-x-forward-headers | 是否将 X-Forward 标头用于主机和相关设置。默认值为 true。 | true | 布尔值 |
| camel.rest.xml-data-format | 要使用的特定 XML 数据格式的名称。默认情况下将使用 jaxb。重要:此选项仅用于设置数据格式的自定义名称,而不要引用现有数据格式实例。 | 字符串 | |
| camel.rest.api-context-id-pattern | 弃用了 CamelContext id 模式,以只允许 CamelContext 中名称与模式匹配的其他服务的 Rest API。模式 名称 指的是 CamelContext 名称,仅匹配当前的 CamelContext。对于任何其他值,模式使用 PatternHelper#matchPattern (String,String)中的规则。 | 字符串 | |
| camel.rest.api-context-listing | 弃用了 设置是否启用了 JVM 中带有 REST 服务的所有可用 CamelContext 的列表。如果启用它允许发现这些上下文,如果为 false,则只使用当前的 CamelContext。 | false | 布尔值 |
第 76 章 XML Tokenize
XML Tokenize 语言是 camel-xml-jaxp 的内置语言,它是一个真正 XML 感知的令牌器,可与 Split EIP 一起使用,作为有效和有效地令牌 XML 文档。
XML Tokenize 不仅能够识别文档的 XML 命名空间和分层结构,而且比传统令牌语言更高效地令牌 XML 文档。
其他依赖项
要使用此组件,需要其他依赖项,如下所示:
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.1</version>
</dependency>或者
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-stax-starter</artifactId>
</dependency>76.1. XML Tokenizer 选项
XML 令牌语言支持 4 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| headerName |
| 要解码的标头名称,而不是使用邮件正文。 | |
| 模式 |
| 提取模式。可用的提取模式有:i - 将上下文命名空间绑定注入提取的令牌(默认)w - 将提取的令牌嵌套到其子内容 t 中。 Enum 值:
| |
| group |
| 将 N 部分分组在一起。 | |
| trim |
| 是否修剪值以移除前导和尾随空格和换行符。 |
76.2. 示例
请参阅 Split EIP,其中包含使用 XML 令牌语言的示例。
76.3. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 xtokenize 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-xml-jaxp-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 3 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.language.xtokenize.enabled | 是否启用 xtokenize 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.xtokenize.mode | 提取模式。可用的提取模式有:i - 将上下文命名空间绑定注入提取的令牌(默认)w - 将提取的令牌嵌套到其子内容 t 中。 | 字符串 | |
| camel.language.xtokenize.trim | 是否修剪值以移除前导和尾随空格和换行符。 | true | 布尔值 |
第 77 章 XPath
Camel 支持 XPath 以允许 Expression 或 Predicate 在 DSL 中使用。
例如,您可以使用 XPath 在 Message Filter 中创建一个 predicate,或作为 Recipient List 的表达式。
77.1. XPath Language 选项
XPath 语言支持 10 个选项,如下所列。
| 名称 | 默认 | Java 类型 | 描述 |
|---|---|---|---|
| documentType |
| 文档类型的类名称为 org.w3c.dom.Document. | |
| resultType |
| 设置结果类型的类名称(输出中的类型)默认结果类型是 NodeSet。 Enum 值:
| |
| saxon |
| 是否使用 Saxon。 | |
| factoryRef |
| 对要在 registry 中查找的自定义 XPathFactory 的引用。 | |
| objectModel |
| 要使用的 XPath 对象模型。 | |
| logNamespaces |
| 是否在故障排除过程中帮助记录命名空间。 | |
| headerName |
| 用作输入的标头名称,而不是邮件正文。 | |
| threadSafety |
| 是否为 xpath 表达式返回的结果启用 thread-safety。当使用 NODESET 作为结果类型时,这适用于,返回的集合会有多个元素。如果您同时处理 NODESET,比如并行处理 Camel Splitter EIP,则可能会出现线程安全的问题。这个选项通过对节点进行防御副本来防止并发问题。如果您在应用程序中使用 camel-saxon 或 Saxon,则建议您打开这个选项。Saxon 有 thread-safety 问题,可以通过打开这个选项来防止这些问题。 | |
| preCompile |
| 在初始化阶段是否启用预编译 xpath 表达式。默认启用预编译。这可用于关闭编译阶段,例如,在启动阶段需要编译阶段,例如,如果应用程序提前编译(例如使用 camel-quarkus),然后加载构建操作系统的 xpath 工厂,而不是 JVM 运行时。 | |
| trim |
| 是否修剪值以移除前导和结尾的空格和换行符。 |
77.2. 命名空间
您可以使用 Namespaces 帮助程序类轻松使用带有 XPath 表达式的命名空间。
77.3. 变量
XPath 中的变量在不同的命名空间中定义。默认命名空间是 http://camel.apache.org/schema/spring。
| 命名空间 URI | 本地部分 | 类型 | 描述 |
|---|---|---|---|
| in | 消息 | 消息 | |
| out | 消息 | 弃用 输出消息(不要使用) | |
| 函数 | 对象 | 其他函数 | |
| env | 对象 | OS 环境变量 | |
| system | 对象 | Java 系统属性 | |
| 对象 | 交换属性 |
Camel 将通过以下方式解析变量:
- 给定的命名空间
- 没有给定的命名空间
77.3.1. 给定的命名空间
如果给出了命名空间,则 Camel 会精确指示要返回的内容。但是,当解析 Camel 时,将尝试解析给定本地部分的标头,并首先返回它。如果本地部分具有值 body,则返回正文。
77.3.2. 没有给定的命名空间
如果没有给定命名空间,则 Camel 仅根据本地部分解析。Camel 将在以下步骤中尝试解析变量:
-
来自
variables,它使用variable(name, value)fluent 构建程序设置。 -
来自
message.in.header,如果有一个带有给定键的标头 -
来自
exchange.properties,如果有一个带有给定键的属性
77.4. Functions
Camel 添加以下 XPath 函数,可用于访问交换:
| 功能 | 参数 | 类型 | 描述 |
|---|---|---|---|
| in:body | none | 对象 | 仅返回消息正文。 |
| in:header | 标头名称 | 对象 | 将返回消息正文。 |
| out:body | none | 对象 | 弃用 将返回 OUT 消息正文。 |
| out:header | 标头名称 | 对象 | 弃用 将返回 OUT 消息标头。 |
| function:properties | 属性的键 | 字符串 | 使用 a . |
| function:simple | 简单表达式 | 对象 | 来评估一个语言。 |
当返回类型是 NodeSet 时,不支持 function:properties 和 function:simple,比如在与 Split EIP 搭配使用时。
下面是一个示例,其中显示了一些正在使用的功能。
77.4.1. 功能示例
如果要在 Spring XML 文件中配置路由,您可以使用 XPath 表达式,如下所示
<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 id="camel" xmlns="http://activemq.apache.org/camel/schema/spring"
xmlns:foo="http://example.com/person">
<route>
<from uri="activemq:MyQueue"/>
<filter>
<xpath>/foo:person[@name='James']</xpath>
<to uri="mqseries:SomeOtherQueue"/>
</filter>
</route>
</camelContext>
</beans>请注意,我们如何在 XPath 表达式中重复使用命名空间前缀 foo,以便更轻松地使用基于命名空间的 XPath 表达式。
77.5. 基于流的消息正文
如果消息正文基于流,这表示它收到的输入作为流提交给 Camel。这意味着您只能够读取一次流的内容。因此,当您使用 XPath 作为 Message Filter 或 Content Based Router 时,您需要多次访问数据,您应该使用流缓存,或使用流缓存,或者在前面将消息正文转换为字符串,以安全地重新读取多次。
from("queue:foo").
filter().xpath("//foo")).
to("queue:bar")from("queue:foo").
choice().xpath("//foo")).to("queue:bar").
otherwise().to("queue:others");77.6. 设置结果类型
XPath 表达式将使用原生 XML 对象(如 org.w3c.dom.NodeList )返回结果类型。但是,您可能希望结果类型成为 字符串。为此,您必须指示要使用的结果类型的 XPath。
Java DSL:
xpath("/foo:person/@id", String.class)在 XML DSL 中,您可以使用 resultType 属性提供完全限定的 classname。
<xpath resultType="java.lang.String">/foo:person/@id</xpath>
java.lang 中的类可以省略 FQN 名称,因此您可以使用 resultType="String"
使用 @XPath 注释:
@XPath(value = "concat('foo-',//order/name/)", resultType = String.class) String name)
我们使用 xpath 函数 concat 为顺序名称添加 foo- 前缀。在这种情况下,我们需要指定一个 String 作为结果类型,因此 concat 功能可以正常工作。
77.7. 在标头上使用 XPath
有些用户可能将 XML 存储在标头中。要将 XPath 应用到标头的值,您可以通过定义 'headerName' 属性来实现此目的。
<xpath headerName="invoiceDetails">/invoice/@orderType = 'premium'</xpath>
在 Java DSL 中,您可以将 headerName 指定为第 2 个参数,如下所示:
xpath("/invoice/@orderType = 'premium'", "invoiceDetails")77.8. 示例
以下是在 Message Filter 中使用 XPath 表达式作为 predicate 的简单示例:
from("direct:start")
.filter().xpath("/person[@name='James']")
.to("mock:result");在 XML 中
<route>
<from uri="direct:start"/>
<filter>
<xpath>/person[@name='James']</xpath>
<to uri="mock:result"/>
</filter>
</route>77.9. 使用命名空间
如果您有一个标准的命名空间集,并且希望在多个 XPath 表达式之间共享它们,您可以在使用 Java DSL 时使用 org.apache.camel.support.builder.Namespaces,如下所示:
Namespaces ns = new Namespaces("c", "http://acme.com/cheese");
from("direct:start")
.filter(xpath("/c:person[@name='James']", ns))
.to("mock:result");
注意如何将命名空间提供给 xquery 以及作为第二参数传递的 ns 变量。
每个命名空间都是 key=value 对,前缀是键。在 XPath 表达式中,命名空间被前缀使用,例如:
/c:person[@name='James']
命名空间构建器支持添加多个命名空间,如下所示:
Namespaces ns = new Namespaces("c", "http://acme.com/cheese")
.add("w", "http://acme.com/wine")
.add("b", "http://acme.com/beer");
在 XML DSL 中使用命名空间时,如您在 XML root 标签中设置命名空间(或 camelContext, routes, route tag 之一)。
在下面的 XML 示例中,我们使用 Spring XML,其中在 root 标签 Bean 中声明命名空间,在 xmlns:foo="http://example.com/person" 一行中:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:foo="http://example.com/person"
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">
<route>
<from uri="direct:start"/>
<filter>
<xpath logNamespaces="true">/foo:person[@name='James']</xpath>
<to uri="mock:result"/>
</filter>
</route>
</camelContext>
</beans>
这个命名空间使用 foo 作为前缀,因此 <xpath> 表达式使用 /foo: 来使用这个命名空间。
77.10. 使用 @XPath Annotation 用于 Bean 集成
您可以使用 Bean Integration 在 bean 上调用方法,并使用 @XPath 等各种语言从消息中提取值并将其绑定到方法参数。
默认 @XPath 注释具有 SOAP 和 XML 命名空间可用。
public class Foo {
@Consume(uri = "activemq:my.queue")
public void doSomething(@XPath("/person/@name") String name, String xml) {
// process the inbound message here
}
}77.11. 使用没有交换的 XPathBuilder
现在,您可以使用 org.apache.camel.language.xpath.XPathBuilder,而无需 Exchange。如果要使用它作为自定义 XPath 评估的帮助,则这非常方便。
它需要您传递 CamelContext,因为 XPathBuilder 内的许多部分需要访问 Camel Type Converter,因此为什么需要 CamelContext。
例如,您可以执行以下操作:
boolean matches = XPathBuilder.xpath("/foo/bar/@xyz").matches(context, "<foo><bar xyz='cheese'/></foo>"));这将与给定的 predicate 匹配。
您还可以按照以下三个示例所示进行评估:
String name = XPathBuilder.xpath("foo/bar").evaluate(context, "<foo><bar>cheese</bar></foo>", String.class);
Integer number = XPathBuilder.xpath("foo/bar").evaluate(context, "<foo><bar>123</bar></foo>", Integer.class);
Boolean bool = XPathBuilder.xpath("foo/bar").evaluate(context, "<foo><bar>true</bar></foo>", Boolean.class);
使用 字符串 结果评估是一项常见要求,并使这更为简单:
String name = XPathBuilder.xpath("foo/bar").evaluate(context, "<foo><bar>cheese</bar></foo>");77.12. 使用带有 XPathBuilder 的 Saxon
您需要将 camel-saxon 添加为项目的依赖。
现在,可以将 Saxon 与 XPathBuilder 搭配使用,它可以通过多种方式来完成,如下所示
- 使用自定义 XPathFactory
- 使用 ObjectModel
77.12.1. 使用系统属性设置自定义 XPathFactory
Camel 现在支持读取 JVM 系统属性 javax.xml.xpath.XPathFactory,可用于设置要使用的自定义 XPathFactory。
这个单元测试演示了如何使用 Saxon :
Camel 将 使用非默认 XPathFactory,例如:
XPathBuilder INFO Using system property javax.xml.xpath.XPathFactory:http://saxon.sf.net/jaxp/xpath/om with value:
net.sf.saxon.xpath.XPathFactoryImpl when creating XPathFactory要使用 Apache Xerces,您可以配置系统属性
-Djavax.xml.xpath.XPathFactory=org.apache.xpath.jaxp.XPathFactoryImpl
77.12.2. 从 XML DSL 启用 Saxon
与 Java DSL 类似,要从 XML DSL 启用 Saxon,您可以有三个选项:
引用自定义工厂:
<xpath factoryRef="saxonFactory" resultType="java.lang.String">current-dateTime()</xpath>
使用工厂声明 bean:
<bean id="saxonFactory" class="net.sf.saxon.xpath.XPathFactoryImpl"/>
指定对象模型:
<xpath objectModel="http://saxon.sf.net/jaxp/xpath/om" resultType="java.lang.String">current-dateTime()</xpath>
推荐方法是设置 saxon=true,如下所示:
<xpath saxon="true" resultType="java.lang.String">current-dateTime()</xpath>
77.13. 命名空间审核以帮助调试
用户经常面临的许多与 XPath 相关的问题都与命名空间的使用相关联。您的消息中的命名空间之间可能有一些拼写错误,而您的 XPath 表达式不知道或引用它们。由于命名空间问题而导致的 XML 元素和属性无法找到 XML 元素和属性的 XPath predicates 或表达式,如果实际都缺乏命名空间定义,它们可能看起来不工作。
XML 中的命名空间完全是必需的,但我们希望通过实现一些 magic 或 voodoo 来自动连接命名空间来简化其使用,但事实上,除此路径的任何操作都将与标准冲突,并大大阻碍了互操作性。
因此,我们目前可以通过向 XPath Expression 语言添加两个新功能来帮助您调试此类问题,因此可通过 predicates 和 表达式访问。
77.13.1. 日志记录 XPath 表达式/ predicates 的命名空间上下文
每次在内部池中创建新的 XPath 表达式时,Camel 将记录 org.apache.camel.language.xpath.XPathBuilder 日志记录器下的表达式的命名空间上下文。由于 Camel 以分级方式(父子关系)代表命名空间上下文,因此整个树以递归方式输出,其格式如下:
[me: {prefix -> namespace}, {prefix -> namespace}], [parent: [me: {prefix -> namespace}, {prefix -> namespace}], [parent: [me: {prefix -> namespace}]]]这些选项可用于激活此日志记录:
-
在
org.apache.camel.language.xpath.XPathBuilder日志记录器或某些父日志记录器(如org.apache.camel或根日志记录器)上启用 TRACE 日志记录 -
启用
logNamespaces选项,如以下部分所示,在这种情况下,日志记录将在 INFO 级别中进行
77.13.2. 审计命名空间
在评估 XPath 表达式前,Camel 可以发现并转储每个传入消息上存在的所有命名空间,提供帮助您分析和固定可能命名空间问题所需的信息。
要做到这一点,它会在内部使用另一个特殊定制的 XPath 表达式来提取消息中显示的所有命名空间映射,显示每个映射的前缀和完整命名空间 URI。
考虑以下几点:
-
隐式 XML 命名空间(
xmlns:xml="http://www.w3.org/XML/1998/namespace")被禁止在输出中,因为它没有添加值 -
默认命名空间列在输出中的
DEFAULT关键字下 - 请记住,可以在不同的范围下重新映射命名空间。认为顶级的"a"前缀,可以分配内部元素,或者内部范围中的默认命名空间更改。对于每个发现的前缀,会列出所有关联的 URI。
您可以在 Java DSL 和 XML DSL 中启用这个选项:
Java DSL :
XPathBuilder.xpath("/foo:person/@id", String.class).logNamespaces()XML DSL:
<xpath logNamespaces="true" resultType="String">/foo:person/@id</xpath>
审计的结果将显示在 org.apache.camel.language.xpath.XPathBuilder 日志记录器下的 INFO 级别,类似如下:
2012-01-16 13:23:45,878 [stSaxonWithFlag] INFO XPathBuilder - Namespaces discovered in message:
{xmlns:a=[http://apache.org/camel], DEFAULT=[http://apache.org/default],
xmlns:b=[http://apache.org/camelA, http://apache.org/camelB]}77.14. 从外部资源载入脚本
您可以对脚本进行外部化,并让 Camel 从资源(如 "classpath:"、"file:" 或 "http:" )加载它。这可以通过以下语法完成:" resource:scheme:location",例如引用您可以进行的类路径中的文件:
.setHeader("myHeader").xpath("resource:classpath:myxpath.txt", String.class)77.15. 依赖项
要在 camel 路由中使用 XPath,您需要添加有关实现 XPath 语言的 camel-xpath 的依赖关系。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-xpath</artifactId>
<version>{CamelSBProjectVersion}</version>
</dependency>77.16. Spring Boot Auto-Configuration
当将 xpath 与 Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-xpath-starter</artifactId>
<version>{CamelSBVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 9 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.language.xpath.document-type | 文档类型的类名称为 org.w3c.dom.Document. | 字符串 | |
| camel.language.xpath.enabled | 是否启用 xpath 语言的自动配置。这默认是启用的。 | 布尔值 | |
| camel.language.xpath.factory-ref | 对要在 registry 中查找的自定义 XPathFactory 的引用。 | 字符串 | |
| camel.language.xpath.log-namespaces | 是否在故障排除过程中帮助记录命名空间。 | false | 布尔值 |
| camel.language.xpath.object-model | 要使用的 XPath 对象模型。 | 字符串 | |
| camel.language.xpath.pre-compile | 在初始化阶段是否启用预编译 xpath 表达式。默认启用预编译。这可用于关闭编译阶段,例如,在启动阶段需要编译阶段,例如,如果应用程序提前编译(例如使用 camel-quarkus),然后加载构建操作系统的 xpath 工厂,而不是 JVM 运行时。 | true | 布尔值 |
| camel.language.xpath.saxon | 是否使用 Saxon。 | false | 布尔值 |
| camel.language.xpath.thread-safety | 是否为 xpath 表达式返回的结果启用 thread-safety。当使用 NODESET 作为结果类型时,这适用于,返回的集合会有多个元素。如果您同时处理 NODESET,比如并行处理 Camel Splitter EIP,则可能会出现线程安全的问题。这个选项通过对节点进行防御副本来防止并发问题。如果您在应用程序中使用 camel-saxon 或 Saxon,则建议您打开这个选项。Saxon 有 thread-safety 问题,可以通过打开这个选项来防止这些问题。 | false | 布尔值 |
| camel.language.xpath.trim | 是否修剪值以移除前导和结尾的空格和换行符。 | true | 布尔值 |
第 78 章 OpenAPI Java
Rest DSL 可以与 camel-openapi-java 模块集成,该模块用于使用 OpenApi 来公开 REST 服务及其 API。
Maven 用户需要将以下依赖项添加到此组件的 pom.xml 中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-openapi-java</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- use the same version as your Camel core version -->
</dependency>camel-openapi-java 模块可以从 REST 组件中使用(无需 servlet)
78.1. 在 rest-dsl 中使用 OpenApi
您可以通过配置 apiContextPath dsl 从 rest-dsl 启用 OpenApi api,如下所示:
public class UserRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
// configure we want to use servlet as the component for the rest DSL
// and we enable json binding mode
restConfiguration().component("netty-http").bindingMode(RestBindingMode.json)
// and output using pretty print
.dataFormatProperty("prettyPrint", "true")
// setup context path and port number that netty will use
.contextPath("/").port(8080)
// add OpenApi api-doc out of the box
.apiContextPath("/api-doc")
.apiProperty("api.title", "User API").apiProperty("api.version", "1.2.3")
// and enable CORS
.apiProperty("cors", "true");
// this user REST service is json only
rest("/user").description("User rest service")
.consumes("application/json").produces("application/json")
.get("/{id}").description("Find user by id").outType(User.class)
.param().name("id").type(path).description("The id of the user to get").dataType("int").endParam()
.to("bean:userService?method=getUser(${header.id})")
.put().description("Updates or create a user").type(User.class)
.param().name("body").type(body).description("The user to update or create").endParam()
.to("bean:userService?method=updateUser")
.get("/findAll").description("Find all users").outType(User[].class)
.to("bean:userService?method=listUsers");
}
}78.2. 选项
OpenApi 模块可使用以下选项进行配置。要使用 servlet 配置,您可以使用 init-param,如上所示。直接在 rest-dsl 中配置时,您可以使用适当的方法,如 enableCORS,host,contextPath, dsl。api.xxx 的选项使用 apiProperty dsl 进行配置。
| 选项 | 类型 | 描述 |
|---|---|---|
| CORS | 布尔值 | 是否启用 CORS。请注意,这只为 api 浏览器启用 CORS,而不是对 REST 服务的实际访问。默认为 false。 |
| openapi.version | 字符串 | OpenAPI spec 版本。是默认的 3.0。 |
| 主机 | 字符串 | 设置主机名。如果没有配置 camel-openapi-java,则将基于 localhost 来计算名称。 |
| schemes | 字符串 | 要使用的协议方案。可以使用逗号分隔多个值,如 "http,https"。默认值为 "http"。 |
| base.path | 字符串 |
必需 :设置可用 REST 服务的基本路径。该路径是相对的(如不使用 http/https)和 camel-openapi-java 将在运行时计算绝对基本路径,这将是 |
| api.path | 字符串 |
设置 API 可用的路径(如 /api-docs)。该路径是相对的(如不使用 http/https)和 camel-openapi-java 将在运行时计算绝对基础路径,这将是 |
| api.version | 字符串 | api 的版本。默认为 0.0.0。 |
| api.title | 字符串 | 应用程序的标题。 |
| api.description | 字符串 | 应用程序的简短描述。 |
| api.termsOfService | 字符串 | API 服务条款的 URL。 |
| api.contact.name | 字符串 | 要联系的人员或机构的名称 |
| api.contact.email | 字符串 | 用于 API 相关对应的电子邮件。 |
| api.contact.url | 字符串 | 网站 URL 以获取更多信息。 |
| api.license.name | 字符串 | 用于 API 的许可证名称。 |
| api.license.url | 字符串 | 用于 API 的许可证的 URL。 |
78.3. 在 API doc 中添加安全定义
Rest DSL 现在支持在生成的 API 文档中声明 OpenApi securityDefinitions。例如:
rest("/user").tag("dude").description("User rest service")
// setup security definitions
.securityDefinitions()
.oauth2("petstore_auth").authorizationUrl("http://petstore.swagger.io/oauth/dialog").end()
.apiKey("api_key").withHeader("myHeader").end()
.end()
.consumes("application/json").produces("application/json")在这里,我们设置了两个安全定义
- OAuth2 - 带有提供的 url 的隐式授权
- API Key - 使用来自名为 myHeader的 HTTP 标头的 api 密钥
然后,您需要通过引用其键(petstore_auth 或 api_key)来指定安全使用的其他操作。
.get("/{id}/{date}").description("Find user by id and date").outType(User.class)
.security("api_key")
...
.put().description("Updates or create a user").type(User.class)
.security("petstore_auth", "write:pets,read:pets")此处的 get 操作使用 Api Key 安全,而 put 操作则使用带有允许的读写片断范围的 OAuth 安全性。
78.4. json 或 Yaml
camel-openapi-java 模块支持 JSon 和 Yaml 开箱即用。您可以在请求 url 中指定,使用 /openapi.json 或 /openapi.yaml 返回的内容。如果未指定,则使用 HTTP Accept 标头来检测是否可以接受 json 或 yaml。如果两者都被接受或未设置 none,则 json 将返回为默认格式。
78.5. useXForwardHeaders 和 API URL 解析
OpenApi 规格允许您指定提供 API 的主机、端口和路径。在 OpenApi V2 中,这通过 host 字段和 OpenAPI V3 中完成,它是 servers 字段的一部分。
默认情况下,这些字段的值由 X-Forwarded 标头 X-Forwarded-Host 和 X-Forwarded-Proto 决定。
这可以通过禁用 X-Forwarded 标头的查找,并在 REST 配置中指定自己的主机端口和方案来覆盖。
restConfiguration().component("netty-http")
.useXForwardHeaders(false)
.apiProperty("schemes", "https");
.host("localhost")
.port(8080);78.6. 例子
在 Apache Camel 分发中,我们提供了 camel-example-openapi-cdi 和 camel-example-spring-boot-rest-openapi-simple,它演示了使用这个 OpenApi 组件。
78.7. Spring Boot Auto-Configuration
在 Spring Boot 中使用 openapi-java 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-openapi-java-starter</artifactId>
<version>{CamelSBProjectVersion}</version>
<!-- Use your Camel Spring Boot version -->
</dependency>组件支持 1 个选项,如下所列。
| 名称 | 描述 | 默认 | 类型 |
|---|---|---|---|
| camel.openapi.enabled | 启用 Camel Rest DSL 在 Spring Boot 中自动注册其 OpenAPI (如 swagger doc),它允许 SpringDoc 等工具与 Camel 集成。 | true | 布尔值 |