Red Hat build of Apache Camel for Spring Boot 参考
Red Hat build of Apache Camel for Spring Boot 参考
摘要
前言
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
第 1 章 组件启动者
Camel Spring Boot 支持以下 Camel 工件作为 Spring Boot Starters:
用于红帽构建的 Apache Camel for Camel Spring Boot 的 BOM 列出支持的组件和不受支持的组件。有关支持 组件的最新列表,请参阅 组件启动器。
组件 | 工件 | 描述 | 支持 IBM Power 和 IBM Z |
---|---|---|---|
camel-amqp-starter | 使用 Apache QPid 客户端与 AMQP 协议进行消息传递. | 是 | |
camel-aws2-cw-starter | 使用 AWS SDK 版本 2.x 将指标发送到 AWS CloudWatch。 | 是 | |
camel-aws2-ddb-starter | 使用 AWS SDK 版本 2.x 从 AWS DynamoDB 服务存储和检索数据。 | 是 | |
camel-aws2-kinesis-starter | 使用 AWS SDK 版本 2.x 使用 AWS SDK 版本 2.x 使用和生成 AWS Kinesis Streams 的记录。 | 是 | |
camel-aws2-lambda-starter | 使用 AWS SDK 版本 2.x 管理并调用 AWS Lambda 功能。 | 是 | |
camel-aws2-s3-starter | 使用 AWS SDK 版本 2.x 从 AWS S3 Storage Service 存储和检索对象。 | 是 | |
camel-aws2-sns-starter | 使用 AWS SDK 版本 2.x 将信息发送到 AWS Simple Notification Topic。 | 是 | |
camel-aws2-sqs-starter | 使用 AWS SDK 版本 2.x 向 AWS SQS 服务发送和接收信息。 | 是 | |
camel-azure-servicebus-starter | 向 Azure 事件总线发送和接收信息。 | 是 | |
camel-azure-storage-blob-starter | 使用 SDK v12 从 Azure Storage Blob Service 存储和检索 Blob。 | 是 | |
camel-azure-storage-queue-starter | azure-storage-queue 组件用于使用 Azure SDK v12 存储和检索信息到 Azure Storage Queue。 | 是 | |
camel-bean-starter | 调用存储在 Camel registry 中的 Java Bean 的方法。 | 是 | |
camel-bean-validator-starter | 使用 Java Bean Validation API 验证消息正文。 | 是 | |
camel-browse-starter | 检查在支持 BrowsableEndpoint 的端点上收到的消息。 | 是 | |
camel-cassandraql-starter | 使用 CQL3 API (而不是 Thrift API)与 Cassandra 2.0 集成。基于 DataStax 提供的 Cassandra Java 驱动程序。 | 是 | |
camel-cics-starter | 与 CICS® 通用事务处理子系统交互。 | 否 | |
camel-controlbus-starter | 管理和监控 Camel 路由。 | 是 | |
camel-cron-starter | 通过 Unix cron 语法指定的时间触发事件的通用接口。 | 是 | |
camel-crypto-starter | 使用 Java Cryptographic 扩展(JCE)的签名服务签名并验证交换。 | 是 | |
camel-cxf-soap-starter | 使用 Apache CXF 公开 SOAP WebServices 或使用 CXF WS 客户端连接到外部 WebServices。 | 是 | |
camel-cxf-rest-starter | 使用 Apache CXF 公开 JAX-RS REST 服务,或使用 CXF REST 客户端连接到外部 REST 服务。 | 是 | |
camel-dataformat-starter | 使用 Camel 数据格式作为常规 Camel 组件。 | 是 | |
camel-dataset-starter | 提供用于 Camel 应用程序的负载和 soak 测试的数据。 | 是 | |
camel-direct-starter | 同步调用来自同一 Camel 上下文的另一个端点。 | 是 | |
camel-elasticsearch-starter | 通过 Java 客户端 API 将请求发送到 ElasticSearch。 | 否 | |
camel-fhir-starter | 使用 FHIR (Fast Healthcare Interoperability Resources)标准交换医疗域中的信息。 | 否 | |
camel-file-starter | 读写文件。 | 是 | |
camel-flink-starter | 将 DataSet 作业发送到 Apache Flink 集群。 | 是 | |
camel-ftp-starter | 上传文件并将其下载到 FTP 服务器/从 FTP 服务器下载. | 是 | |
camel-google-bigquery-starter | 用于分析的 Google BigQuery 数据仓库。 | 是 | |
camel-google-pubsub-starter | 向 Google Cloud Platform PubSub Service 发送和接收信息。 | 是 | |
camel-grpc-starter | 公开 gRPC 端点并访问外部 gRPC 端点。 | 是 | |
camel-http-starter | 使用 Apache HTTP 客户端 4.x 将请求发送到外部 HTTP 服务器。 | 是 | |
camel-infinispan-starter | 从/到 Infinispan 分布式键/值存储和数据网格进行读写。 | 否 | |
camel-infinispan-embedded-starter | 从/到 Infinispan 分布式键/值存储和数据网格进行读写。 | 是 | |
camel-jdbc-starter | 通过 SQL 和 JDBC 访问数据库. | 是 | |
camel-jira-starter | 与 JIRA 问题跟踪器交互。 | 是 | |
camel-jms-starter | 从 JMS Queue 或 Topic 中发送和接收消息。 | 是 | |
camel-jpa-starter | 使用 Java Persistence API (zFCP)从数据库存储和检索 Java 对象。 | 是 | |
camel-jslt-starter | 使用 JSLT 查询或转换 JSON 有效负载。 | 是 | |
camel-kafka-starter | 向 Apache Kafka 代理发送和接收信息。 | 是 | |
camel-kamelet-starter | 调用 Kamelets | 是 | |
camel-kubernetes-starter | 对 Kubernetes ConfigMap 执行操作,并获取有关 ConfigMap 更改的通知。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes 自定义资源执行操作,并获取有关部署更改的通知。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes Deployments 执行操作,并获取有关部署更改的通知。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes 事件执行操作,并获取有关事件更改的通知。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes Horizontal Pod Autoscaler (HPA)执行操作,并获取有关 HPA 更改的通知。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes 作业执行操作。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes 命名空间执行操作,并获得对命名空间更改的通知。 | 是 | |
camel-kubernetes-starter | 在 Kubernetes 节点上执行操作,并获得有关节点更改的通知。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes 持久性卷执行操作,并获得有关持久性卷更改的通知。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes 持久性卷声明执行操作,并获得有关持久性卷声明更改的通知。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes Pod 执行操作并获取有关 Pod 更改的通知。 | 是 | |
camel-kubernetes-starter | 是对 Kubernetes Replication Controller 的执行操作,并获得关于复制控制器更改的通知。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes 资源配额执行操作。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes Secret 执行操作。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes 服务帐户执行操作。 | 是 | |
camel-kubernetes-starter | 对 Kubernetes 服务执行操作并获取有关服务更改的通知。 | 是 | |
camel-kudu-starter | 与 Apache Kudu 互动,Apache Hadoop 生态系统的免费、开源列导向型数据存储。 | 否 | |
camel-language-starter | 使用 Camel 支持的任何语言执行脚本。 | 是 | |
camel-ldap-starter | 在 LDAP 服务器上执行搜索。 | 是 | |
camel-log-starter | 日志消息到底层日志记录机制。 | 是 | |
camel-lra-starter | Camel saga 绑定 for Long-Running-Action 框架。 | 是 | |
camel-mail-starter | 使用 imap、pop3 和 smtp 协议发送和接收电子邮件。 | 是 | |
camel-mail-microsoft-oauth-starter | Camel Mail OAuth2 Authenticator for Microsoft Exchange Online. | 是 | |
camel-mapstruct-starter | 使用 Mapstruct 键入 Conversion。 | 是 | |
camel-master-starter | 集群中仅消耗来自给定端点的单一使用者;如果 JVM 中断,则进行自动故障转移。 | 是 | |
camel-micrometer-starter | 使用 Micrometer 库直接从 Camel 路由收集各种指标。 | 是 | |
camel-minio-starter | 使用 Minio SDK 从 Minio Storage Service 存储和检索对象。 | 是 | |
camel-mllp-starter | 使用 MLLP 协议与外部系统通信。 | 是 | |
camel-mock-starter | 使用模拟测试路由和调解规则。 | 是 | |
camel-mongodb-starter | 对 MongoDB 文档和集合执行操作。 | 是 | |
camel-mybatis-starter | 使用 MyBatis 在相关数据库中执行查询、轮询、插入、更新或删除。 | 是 | |
camel-netty-starter | 使用带有 Netty 4.x 的 TCP 或 UDP 的套接字级别网络。 | 是 | |
camel-olingo4-starter | 使用 Apache Olingo OData API 与 OData 4.0 服务通信。 | 是 | |
camel-kubernetes-starter | 对 OpenShift 构建配置执行操作。 | 是 | |
camel-kubernetes-starter | 对 OpenShift 构建执行操作。 | 是 | |
camel-kubernetes-starter | 对 Openshift Deployment Configs 执行操作,并获得关于部署配置更改的通知。 | 是 | |
camel-netty-http-starter | 使用 Netty 4.x 的 Netty HTTP 服务器和客户端。 | 是 | |
camel-paho-starter | 使用 Eclipse Paho MQTT 客户端与 MQTT 消息代理进行通信。 | 是 | |
camel-paho-mqtt5-starter | 使用 Eclipse Paho MQTT v5 客户端与 MQTT 消息代理进行通信。 | 是 | |
camel-platform-http-starter | 使用当前平台中的 HTTP 服务器公开 HTTP 端点。 | 是 | |
camel-quartz-starter | 调度使用 Quartz 2.x 调度程序发送消息。 | 是 | |
camel-ref-starter | 将消息路由到端点会根据 Camel Registry 中的名称动态查找。 | 是 | |
camel-rest-starter | 公开 REST 服务或调用外部 REST 服务。 | 是 | |
camel-saga-starter | 使用 Saga EIP 在路由中执行自定义操作。 | 是 | |
camel-salesforce-starter | 使用 Java DTO 与 Salesforce. | 是 | |
camel-sap-starter | 使用 SAP Java Connector (SAP JCo)库来促进与 SAP 和 SAP IDoc 库的双向通信,以促进 Intermediate Document (IDoc)格式的文档传输。 | 是 | |
camel-scheduler-starter | 使用 java.util.concurrent.ScheduledExecutorService 以指定间隔生成消息。 | 是 | |
camel-seda-starter | 异步调用同一 JVM 中任何 Camel 上下文的另一个端点。 | 是 | |
camel-servlet-starter | 由 Servlet 提供 HTTP 请求。 | 是 | |
camel-slack-starter | 向 Slack 发送和接收信息。 | 是 | |
camel-smb-starter | 从 SMB (服务器消息块)共享接收文件。 | 是 | |
camel-snmp-starter | 接收陷阱和轮询 SNMP (简单网络管理协议)功能的设备。 | 是 | |
camel-splunk-starter | 在 Splunk 中发布或搜索事件。 | 否 | |
camel-spring-batch-starter | 将消息发送到 Spring Batch 以进一步处理。 | 是 | |
camel-spring-jdbc-starter | 使用 Spring Transaction 支持通过 SQL 和 JDBC 访问数据库。 | 是 | |
camel-spring-ldap-starter | 将过滤器用作消息有效负载,在 LDAP 服务器中执行搜索。 | 是 | |
camel-spring-rabbitmq-starter | 使用 Spring RabbitMQ 客户端从 RabbitMQ 发送和接收消息。 | 是 | |
camel-spring-redis-starter | 从 Redis 发送和接收信息。 | 是 | |
camel-spring-ws-starter | 您可以使用此组件与 Spring Web Services 集成。它提供访问 Web 服务和服务器端支持,以便创建您的合同优先 Web 服务。 | 是 | |
camel-sql-starter | 使用 Spring JDBC 执行 SQL 查询。 | 是 | |
camel-sql-starter | 使用 Spring JDBC 执行 SQL 查询作为 JDBC 存储的流程。 | 是 | |
camel-ssh-starter | 使用 SSH 在远程主机上执行命令。 | 是 | |
camel-stub-starter | 在开发或测试过程中处理任何物理端点。 | 是 | |
camel-telegram-starter | 发送和接收充当 Telegram Botram Bot API 的消息。 | 是 | |
camel-timer-starter | 使用 java.util.Timer 以指定间隔生成消息。 | 是 | |
camel-validator-starter | 使用 XML 架构和 JAXP 验证验证载荷。 | 是 | |
camel-velocity-starter | 使用 Velocity 模板转换消息。 | 是 | |
camel-vertx-http-starter | 使用 Vert.x 将请求发送到外部 HTTP 服务器。 | 是 | |
camel-vertx-websocket-starter | 公开 WebSocket 端点,并使用 Vert.x 连接到远程 WebSocket 服务器。 | 是 | |
camel-webhook-starter | 公开 Webhook 端点以接收其他 Camel 组件的推送通知。 | 是 | |
camel-xj-starter | 使用 XSLT 转换 JSON 和 XML 消息。 | 是 | |
camel-xslt-starter | 使用 XSLT 模板转换 XML 有效负载。 | 是 | |
camel-xslt-saxon-starter | 使用 Saxon 的 XSLT 模板转换 XML 有效负载。 | 是 |
组件 | 工件 | 描述 | 支持 IBM Power 和 IBM Z |
---|---|---|---|
camel-avro-starter | 使用 Apache Avro 二进制数据格式序列化和反序列化消息。 | 是 | |
camel-jackson-avro-starter | marshal POJO 到 Avro,并使用 Jackson 返回。 | 是 | |
camel-bindy-starter | 使用 Camel Bindy 的 POJO 和键值对(KVP)格式之间的 marshal 和 unmarshal。 | 是 | |
camel-hl7-starter | 使用 HL7 MLLP codec 的 marshal 和 unmarshal HL7 (Health care)模型对象。 | 是 | |
camel-jacksonxml-starter | unmarshal 是一个 XML 有效负载到 POJO,并使用 Jackson 的 XMLMapper 扩展来回放。 | 是 | |
camel-jaxb-starter | unmarshal XML 有效负载到 POJO,使用 JAXB2 XML marshalling 标准。 | 是 | |
camel-gson-starter | 使用 Gson marshal POJO 到 JSON 并返回 | 是 | |
camel-jackson-starter | marshal POJO 到 JSON 并使用 Jackson 返回 | 是 | |
camel-jackson-protobuf-starter | 使用 Jackson 对 Protobuf 和 back 进行 marshal POJO。 | 是 | |
camel-soap-starter | marshal Java 对象到 SOAP 消息和回放。 | 是 | |
camel-zipfile-starter | 使用 java.util.zip.ZipStream 压缩和解压缩流。 | 是 |
语言 | 工件 | 描述 | 支持 IBM Power 和 IBM Z |
---|---|---|---|
camel-core-starter | 固定值只在路由启动期间设置一次。 | 是 | |
camel-core-starter | 评估编译的简单表达式。 | 是 | |
camel-core-starter | 从 Exchange 获取属性。 | 是 | |
camel-core-starter | 简单语言的文件相关功能。 | 是 | |
camel-groovy-starter | 评估 Groovy 脚本。 | 是 | |
camel-core-starter | 从 Exchange 获取标头。 | 是 | |
camel-jq-starter | 针对 JSON 消息正文评估 JQ 表达式。 | 是 | |
camel-jsonpath-starter | 针对 JSON 消息正文评估 JSONPath 表达式。 | 是 | |
camel-core-starter | 使用 registry 中的现有表达式。 | 是 | |
camel-core-starter | 评估 Camel 简单表达式。 | 是 | |
camel-core-starter | 使用分隔符模式对文本有效负载进行令牌化。 | 是 | |
camel-xml-jaxp-starter | 对 XML 有效负载进行令牌化。 | 是 | |
camel-xpath-starter | 针对 XML 有效负载评估 XPath 表达式。 | 是 | |
camel-saxon-starter | 使用 XQuery 和 Saxon 查询和/或转换 XML 有效负载。 | 是 |
扩展 | 工件 | 描述 | 支持 IBM Power 和 IBM Z |
---|---|---|---|
camel-jasypt-starter | 使用 Jasypt 的安全性 | 是 | |
camel-kamelet-main-starter | 运行 Kamelet standalone | 是 | |
camel-openapi-java-starter | 使用 openapi doc 的 rest-dsl 支持 | 是 | |
camel-opentelemetry-starter | 使用 OpenTelemetry 的分布式追踪 | 是 | |
camel-spring-security-starter | 使用 Spring Security 的安全性 | 是 | |
camel-yaml-dsl-starter | 使用 YAML 的 Camel DSL | 是 |
第 2 章 AMQP
自 Camel 1.2 开始
支持生成者和消费者
AMQP 组件使用 Qpid 项目的 JMS 客户端 API 支持 AMQP 1.0 协议。
2.1. 依赖项
当在 Camel Spring Boot 中使用 camel-amqp
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-amqp-starter</artifactId> </dependency>
2.2. URI 格式
amqp:[queue:|topic:]destinationName[?options]
2.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
2.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
2.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
2.4. 组件选项
AMQP 组件支持 100 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clientId (common) |
设置要使用的 JMS 客户端 ID。请注意,如果指定,这个值必须是唯一的,且只能被单个 JMS 连接实例使用。 | 字符串 | |
ConnectionFactory (common) | 要使用的连接工厂。连接工厂必须在组件或端点上配置。 | ConnectionFactory | |
disableReplyTo (common) | 指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目的地发送回复。如果您希望 Camel 消耗路由,且您不想 Camel 自动发送回复消息,您可以使用这个选项,因为代码中的另一个组件处理回复消息。如果要使用 Camel 作为不同消息代理之间的代理,而您想要将消息从一个系统路由到另一个系统,也可以使用此选项。 | false | 布尔值 |
durableSubscriptionName (common) |
用于指定持久主题订阅的持久订阅者名称。必须为 JMS 1.1 持久订阅配置 | 字符串 | |
includeAmqpAnnotations (common) | 在从 AMQP 到 Camel 消息映射时是否包含 AMQP 注解。把它设置为 true 将包含 JMS_AMQP_MA_ 前缀的 AMQP 消息注解映射到消息标头。由于 Apache Qpid JMS API 的限制,当前交付注释将被忽略。 | false | 布尔值 |
jmsMessageType (common) | 允许您强制使用特定的 javax.jms.Message 实现来发送 JMS 消息。可能的值有:Bytes, Map, Object, Stream, Text。默认情况下,Camel 将决定要从 In body 类型中使用的 JMS 消息类型。这个选项允许您指定它。 Enum 值:
| JmsMessageType | |
replyTo (common) | 提供显式 ReplyTo 目的地(会覆盖消费者中的 Message.getJMSReplyTo ()的任何传入值)。 | 字符串 | |
testConnectionOnStartup (common) | 指定是否在启动时测试连接。这样可确保 Camel 启动所有 JMS 用户具有与 JMS 代理的有效连接时。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS 制作者也经过测试。 | false | 布尔值 |
confirmmentModeName (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 队列获取下一个消息前完全处理 Exchange。请注意,如果启用了 transacted,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。 | false | 布尔值 |
autoStartup (consumer) | 指定消费者容器是否应该自动启动。 | true | 布尔值 |
cacheLevel (consumer) | 根据 ID 为底层 JMS 资源设置缓存级别。如需了解更多详细信息,请参阅 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 | 布尔值 |
selector (consumer) | 设置要使用的 JMS 选择器。 | 字符串 | |
subscriptionDurable (consumer) | 设置是否使订阅持久化。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
subscriptionName (consumer) | 设置要创建的订阅的名称。在带有共享或持久订阅的主题(pub-sub domain)时应用。如果配置了客户端 ID,订阅名称需要在此客户端的 JMS 客户端 id 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发消费者(这是此消息监听程序容器的默认值),除了一个共享订阅(需要 JMS 2.0)。 | 字符串 | |
subscriptionShared (consumer) | 设置是否共享订阅。要使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 来注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以作为订阅名称使用)。请注意,共享订阅也可能是持久的,因此此标志也可以与 subscriptionDurable 结合使用。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,您可以考虑启用此选项,同时仍然在队列上排队消息。如果此选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,而 JMS 代理必须尝试重新设计,这一次可能被拒绝,最终该消息可能会在 JMS 代理上的死信队列中移动。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
allowReplyManagerQuickStop (consumer (advanced)) | 是否在回复管理器中使用 DefaultMessageListenerContainer 用于 request-reply 消息,都允许 DefaultMessageListenerContainer.runningAllowed 标志在启用了 JmsConfiguration#isAcceptMessagesWhileStopping 时快速停止,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 消费者中默认启用这种快速停止功能,但为了启用此标志,您必须启用此标志。 | false | 布尔值 |
consumerType (consumer (advanced)) | 要使用的消费者类型,可以是: Simple、Default 或 Custom 之一。consumer 类型决定要使用的 Spring JMS 侦听器。default 将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,Simple 将使用 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 带有最佳值 - 缓存的 threadpool-like)。如果没有设置,则默认为前面的行为,它对消费者使用缓存的线程池,并将 SimpleAsync 用于回复消费者。建议使用 ThreadPool 来减少弹性配置中的线程垃圾箱,并动态增加和减少并发消费者。 Enum 值:
| DefaultTaskExecutorType | |
eagerLoadingOfProperties (consumer (advanced)) | 加载消息后马上启用对 JMS 属性和有效负载的 eager 加载,这通常效率低下,因为 JMS 属性可能不需要,但有时可以尽早地捕获与底层 JMS 提供程序和使用 JMS 属性相关的问题。另请参阅 eagerPoisonBody 选项。 | false | 布尔值 |
eagerPoisonBody (consumer (advanced)) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)为 poison (不能读取/映射),则将此文本设置为消息正文,以便处理消息正文(导致 poison 的原因在 Exchange 上已存储为例外)。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅选项 eagerLoadingOfProperties。 | 因 $\{exception.message} 导致的 Poison JMS 消息 | 字符串 |
exposeListenerSession (consumer (advanced)) | 指定在消耗消息时是否应公开侦听器会话。 | false | 布尔值 |
replyToConsumerType (consumer (advanced)) | 回复消费者的消费者类型(在执行请求/回复时),可以是:Simple、Default 或 Custom 之一。consumer 类型决定要使用的 Spring JMS 侦听器。default 将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,Simple 将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 选项将决定要使用的 org.springframework.jms.listener.AbstractMessageListenerContainer。 Enum 值:
| 默认值 | ConsumerType |
replyToSameDestinationAllowed (consumer (advanced)) | 是否允许 JMS 使用者向消费者使用的同一目的地发送回复消息。这可防止通过消耗并发送相同消息到其自身的无端循环。 | false | 布尔值 |
taskExecutor (consumer (advanced)) | 允许您指定自定义任务 executor 以供使用消息。 | 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 或 timeToLiveity 的服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用于当前端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,读取仅来自 Camel In 消息标头的 QoS 属性。 | false | 布尔值 |
formatDateHeadersToIso8601 (producer) | 设置 JMS 日期属性是否应根据 ISO 8601 标准进行格式化。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
preserveMessageQos (producer) | 如果设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供 all 或 only some them。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖来自端点的值。相反,explicitQosEnabled 选项将使用端点上设置的选项,而不是来自消息标头的值。 | false | 布尔值 |
priority (producer) | 大于 1 的值在发送时指定消息优先级(其中 1 是最低优先级,9 为最高)。还必须启用 explicitQosEnabled 选项,以便此选项有任何效果。 Enum 值:
| 4 | int |
replyToConcurrentConsumers (producer) | 指定在对 JMS 进行请求/回复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | 1 | int |
replyToMaxConcurrentConsumers (producer) | 指定在 JMS 上使用请求/回复时的最大并发用户数。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | int | |
replyToOnTimeoutMaxcurrentConsumers (producer) | 指定在通过 JMS 使用请求/回复时,进行超时时继续路由的并发消费者的最大数量。 | 1 | int |
replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo 目的地,它会覆盖 replyTo 的设置。如果您要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这很有用。 | 字符串 | |
replyToType (producer) | 在通过 JMS 进行 request/reply 时,允许显式指定用于 replyTo 队列的策略类型。可能的值有: Temporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果配置了 replyTo,则默认使用 Shared。这个选项允许您使用专用队列而不是共享队列。如需了解更多详细信息,请参阅 Camel JMS 文档,特别是有关在集群环境中运行时的影响的信息,以及共享回复队列的性能比其 alternatives 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 交换模式时,请使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置消息将只与此属性的 JMSCorrelationID 属性的值关联,则忽略且不由 Camel 设置。 | 字符串 | |
disableTimeToLive (producer (advanced)) | 使用这个选项强制禁用生存时间。例如,当您通过 JMS 进行请求/回复时,Camel 默认将使用 requestTimeout 值作为发送消息的时间。问题是发送方和接收器系统必须同步其时钟,因此它们同步。这并非始终容易存档。因此,您可以使用 disableTimeToLive=true 来在发送的消息上将时间设置为 live 值。然后,该消息不会在接收器系统上过期。如需了解更多详细信息,请参见以下小节中关于 live 的时间。 | false | 布尔值 |
forceSendOriginalMessage (producer (advanced)) | 使用 mapJmsMessage=false Camel 时,如果您在路由过程中涉及标头(get 或 set),则创建新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly 发送到 JMS 目的地时(例如触发和忘记)。启用此选项将增强 Camel Exchange 与实际的 JMSMessageID,在消息发送到 JMS 目的地时供 JMS 客户端使用。 | false | 布尔值 |
replyToCacheLevelName (producer (advanced)) | 在通过 JMS 进行请求/回复时,根据回复消费者设置缓存级别。这个选项只适用于使用固定回复队列(而非临时)。默认情况下,Camel 将使用:CACHE_CONSUMER 用于 exclusive 或 shared w/ replyToSelectorName。用于没有 replyToSelectorName 的共享的 CACHE_SESSION。IBM WebSphere 等一些 JMS 代理可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注意:如果使用临时队列,则不允许 CACHE_NONE,您必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
replyToDestinationSelectorName (producer (advanced)) | 使用要使用的固定名称设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(即,如果您不使用临时回复队列)。 | 字符串 | |
streamMessageTypeEnabled (producer (advanced)) | 设置 StreamMessage 类型是否已启用。通过以 BytesMessage 或 StreamMessage 发送的消息有效负载,如 files、InputStream 等。这个选项控制将使用的 kind。默认情况下,使用 BytesMessage 来强制将整个消息有效负载读取到内存中。通过启用这个选项,消息有效负载以块的形式读取到内存中,每个块都会被写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
allowAutoWiredConnectionFactory (advanced) | 如果没有配置连接工厂,是否从 registry 中自动发现 ConnectionFactory。如果只找到了一个 ConnectionFactory 实例,则会使用它。这默认是启用的。 | true | 布尔值 |
allowAutoWiredDestinationResolver (advanced) | 如果没有配置目标解析器,是否从 registry 中自动发现 DestinationResolver。如果只找到一个 DestinationResolver 实例,则会使用它。这默认是启用的。 | true | 布尔值 |
allowSerializedHeaders (advanced) | 控制是否包含序列化标头。仅在 transferExchange 为 true 时应用。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。 | false | 布尔值 |
artemisStreamingEnabled (advanced) | 是否针对 Apache Artemis 流模式进行优化。当将 Artemis 与 JMS StreamMessage 类型一起使用时,这可以减少内存开销。只有在使用 Apache Artemis 时,才必须启用此选项。 | false | 布尔值 |
asyncStartListener (advanced) | 在启动路由时,是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法获得与远程 JMS 代理的连接,那么在重试和/或故障转移时可能会阻止它。这会导致 Camel 在启动路由时阻止。通过将这个选项设置为 true,您可以让路由启动,而 JmsConsumer 使用异步模式的专用线程连接到 JMS 代理。如果使用此选项,请注意,如果无法建立连接,则会在 WARN 级别记录异常,消费者将无法接收消息;然后,您可以重启要重试的路由。 | false | 布尔值 |
asyncStopListener (advanced) | 在停止路由时,是否异步停止 JmsConsumer 消息监听程序。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
configuration (advanced) | 使用共享的 JMS 配置。 | JmsConfiguration | |
destinationResolver (advanced) | 可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找实际目的地)。 | DestinationResolver | |
errorHandler (advanced) | 指定在处理消息时抛出异常时调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置 errorHandler,则会在 WARN 级别中记录这些例外。您可以配置日志记录级别,以及堆栈跟踪是否应该使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录。这样可以更容易配置,而不必对自定义 errorHandler 进行编码。 | ErrorHandler | |
exceptionListener (advanced) | 指定要收到任何底层 JMS 异常的 JMS Exception Listener。 | ExceptionListener | |
idleConsumerLimit (advanced) | 指定允许在任何给定时间闲置的用户数量的限制。 | 1 | int |
idleTaskExecutionLimit (advanced) | 指定接收任务的闲置执行的限制,而不是在其执行中收到任何消息。如果达到这个限制,则任务将关闭并离开接收其他执行任务(在动态调度的情况下;请参阅 maxConcurrentConsumers 设置)。Spring 中还有额外的文档。 | 1 | int |
includeAllJMSXProperties (advanced) | 在从 JMS 到 Camel 消息映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注: 如果您使用自定义 headerFilterStrategy,则这个选项不适用。 | false | 布尔值 |
jmsKeyFormatStrategy (advanced) | 用于编码和解码 JMS 密钥的可插拔策略,以便它们能够与 JMS 规范兼容。Camel 提供了两个开箱即用的实现:default 和 passthrough。默认策略将安全地 marshal 句点和连字符(. 和 -)。passthrough 策略将密钥保留为原样。可用于 JMS 代理,这些代理不关心 JMS 标头键是否包含非法字符。您可以提供自己的 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 # 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
mapJmsMessage (advanced) | 指定 Camel 是否将收到的 JMS 消息自动映射到适合的有效负载类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
maxMessagesPerTask (advanced) | 每个任务的消息数量。-1 代表没有限制。如果您将范围用于并发消费者(例如 min max),则此选项可用于设置 eg 100 来控制在需要较少工作时消费者缩小的速度。 | -1 | int |
messageConverter (advanced) | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
messageCreatedStrategy (advanced) | 使用在 Camel 发送 JMS 消息时调用的 given MessageCreatedStrategy,在 Camel 创建 javax.jms.Message 对象的新实例时调用。 | MessageCreatedStrategy | |
messageIdEnabled (advanced) | 发送时,指定是否应添加消息 ID。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将消息 ID 设置为 null;如果供应商忽略 hint,则消息 ID 必须设置为其正常唯一值。 | true | 布尔值 |
messageListenerContainerFactory (advanced) | 用于决定使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 MessageListenerContainerFactory 的 registry ID。设置此选项会自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
messageTimestampEnabled (advanced) | 指定默认情况下,是否应在发送消息时启用时间戳。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将时间戳设置为零;如果供应商忽略 hint,则必须将时间戳设置为其正常值。 | true | 布尔值 |
pubSubNoLocal (advanced) | 指定是否禁止发送其自身连接发布的消息。 | false | 布尔值 |
queueBrowseStrategy (advanced) | 在浏览队列时使用自定义 QueueBrowseStrategy。 | QueueBrowseStrategy | |
receiveTimeout (advanced) | 接收消息的超时时间(以毫秒为单位)。 | 1000 | long |
recoveryInterval (advanced) | 指定恢复尝试之间的间隔,即刷新连接时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。 | 5000 | long |
requestTimeoutCheckerInterval (advanced) | 配置 Camel 在通过 JMS 进行请求/回复时应检查超时交换的频率。默认情况下,Camel 会每秒检查一次。但是,如果您在超时时必须更快地响应,您可以降低这个间隔,以便更频繁地检查。超时由选项 requestTimeout 决定。 | 1000 | long |
同步 (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
transferException (advanced) | 如果启用了,并且您在使用 Request Reply messaging (InOut),且 Exchange 在消费者端失败,则原因例外将作为 javax.jms.ObjectMessage 发回。如果客户端是 Camel,则返回的例外将被重新箭头。这样,您可以在路由中使用 Camel JMS 作为网桥 - 例如,使用持久性队列启用可靠的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。需要 Caught 异常才能按顺序排序。消费者端的原始 Exception 可以嵌套在外部异常中,如返回到制作者时 org.apache.camel.RuntimeCamelException。请小心谨慎,因为数据使用 Java 对象序列化,并且要求收到的能够在类级别上反序列化数据,这会强行生产者和消费者之间的强耦合。 | false | 布尔值 |
transferExchange (advanced) | 您可以通过线路传输交换,而不只是正文和标头。以下字段会被传输:在 body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。您必须在生成者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换而不是常规有效负载。请小心谨慎,因为数据使用 Java 对象序列化,并且要求接收器能够在类级别上反序列化数据,这会强制生产者与需要使用兼容 Camel 版本的消费者之间强耦耦合! | false | 布尔值 |
useMessageIDAsCorrelationID (advanced) | 指定 JMSMessageID 是否始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在通过 JMS 进行请求/回复时,等待 provisional correlation id 更新为实际关联 ID 的次数,以及启用选项 useMessageIDAsCorrelationID 的时间。 | 50 | int |
waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 等待更新调配关联 id 期间每次处于睡眠状态的间隔。 | 100 | long |
headerFilterStrategy (filter) | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息。 | HeaderFilterStrategy | |
errorHandlerLoggingLevel (logging) | 允许为日志记录无法捕获的异常配置默认 errorHandler 日志记录级别。 Enum 值:
| WARN | LoggingLevel |
errorHandlerLogStackTrace (logging) | 允许默认 errorHandler 控制是否应记录 stacktrace。 | true | 布尔值 |
password (security) | 用于 ConnectionFactory 的密码。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
用户名 (安全性) | 用于 ConnectionFactory 的用户名。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
转换 (事务) | 指定是否使用 transacted 模式。 | false | 布尔值 |
transactedInOut (transaction) | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式(如果此标志设为 true),则 Spring JmsTemplate 会将 sessionTransacted 设置为 true,以及 acknowledgeMode 作为 InOut 操作的 JmsTemplate 的 transacted。注意从 Spring JMS:在 JTA 事务中,传递给 createQueue 的参数,不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值自行做出决定。类似地,这些参数不会被在本地管理的事务中考虑,因为本例中的 Spring JMS 在现有的 JMS Session 上运行。在受管事务之外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(并非 XA 事务)的情况下同步的本地 JMS 事务。这将与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务),而 JMS 事务会在主事务后提交右边。 | false | 布尔值 |
lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,则 Camel 将创建一个 JmsTransactionManager,如果没有在选项 transacted=true 时注入任何 transactionManager。 | true | 布尔值 |
transactionManager (transaction (advanced)) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
transactionTimeout (transaction (advanced)) | 使用 transacted 模式,事务的超时值(以秒为单位)。 | -1 | int |
2.5. 端点选项
AMQP 端点使用 URI 语法进行配置:
amqp:destinationType:destinationName
使用以下路径和查询参数:
2.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
destinationType (common) | 要使用的目标类型。 Enum 值:
| queue | 字符串 |
destinationName (common) | 用作目标的队列或主题 必需 名称。 | 字符串 |
2.5.2. 查询参数(96 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clientId (common) |
设置要使用的 JMS 客户端 ID。请注意,如果指定,这个值必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只需要使用 JMS 1.1 的持久主题订阅。 | 字符串 | |
ConnectionFactory (common) | 要使用的连接工厂。连接工厂必须在组件或端点上配置。 | ConnectionFactory | |
disableReplyTo (common) | 指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目的地发送回复。如果您希望 Camel 消耗路由,且您不想 Camel 自动发送回复消息,您可以使用这个选项,因为代码中的另一个组件处理回复消息。如果要使用 Camel 作为不同消息代理之间的代理,而您想要将消息从一个系统路由到另一个系统,也可以使用此选项。 | false | 布尔值 |
durableSubscriptionName (common) | 用于指定持久主题订阅的持久订阅者名称。必须为 JMS 1.1 持久订阅配置 clientId 选项,并且可以针对 JMS 2.0 配置,以创建私有持久订阅。 | 字符串 | |
jmsMessageType (common) | 允许您强制使用特定的 javax.jms.Message 实现来发送 JMS 消息。可能的值有:Bytes, Map, Object, Stream, Text。默认情况下,Camel 将决定要从 In body 类型中使用的 JMS 消息类型。这个选项允许您指定它。 Enum 值:
| JmsMessageType | |
replyTo (common) | 提供显式 ReplyTo 目的地(会覆盖消费者中的 Message.getJMSReplyTo ()的任何传入值)。 | 字符串 | |
testConnectionOnStartup (common) | 指定是否在启动时测试连接。这样可确保 Camel 启动所有 JMS 用户具有与 JMS 代理的有效连接时。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS 制作者也经过测试。 | false | 布尔值 |
confirmmentModeName (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 队列获取下一个消息前完全处理 Exchange。请注意,如果启用了 transacted,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。 | false | 布尔值 |
autoStartup (consumer) | 指定消费者容器是否应该自动启动。 | true | 布尔值 |
cacheLevel (consumer) | 根据 ID 为底层 JMS 资源设置缓存级别。如需了解更多详细信息,请参阅 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 | 布尔值 |
selector (consumer) | 设置要使用的 JMS 选择器。 | 字符串 | |
subscriptionDurable (consumer) | 设置是否使订阅持久化。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
subscriptionName (consumer) | 设置要创建的订阅的名称。在带有共享或持久订阅的主题(pub-sub domain)时应用。如果配置了客户端 ID,订阅名称需要在此客户端的 JMS 客户端 id 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发消费者(这是此消息监听程序容器的默认值),除了一个共享订阅(需要 JMS 2.0)。 | 字符串 | |
subscriptionShared (consumer) | 设置是否共享订阅。要使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 来注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以作为订阅名称使用)。请注意,共享订阅也可能是持久的,因此此标志也可以与 subscriptionDurable 结合使用。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,您可以考虑启用此选项,同时仍然在队列上排队消息。如果此选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,而 JMS 代理必须尝试重新设计,这一次可能被拒绝,最终该消息可能会在 JMS 代理上的死信队列中移动。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
allowReplyManagerQuickStop (consumer (advanced)) | 是否在回复管理器中使用 DefaultMessageListenerContainer 用于 request-reply 消息,都允许 DefaultMessageListenerContainer.runningAllowed 标志在启用了 JmsConfiguration#isAcceptMessagesWhileStopping 时快速停止,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 消费者中默认启用这种快速停止功能,但为了启用此标志,您必须启用此标志。 | false | 布尔值 |
consumerType (consumer (advanced)) | 要使用的消费者类型,可以是: Simple、Default 或 Custom 之一。consumer 类型决定要使用的 Spring JMS 侦听器。default 将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,Simple 将使用 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 带有最佳值 - 缓存的 threadpool-like)。如果没有设置,则默认为前面的行为,它对消费者使用缓存的线程池,并将 SimpleAsync 用于回复消费者。建议使用 ThreadPool 来减少弹性配置中的线程垃圾箱,并动态增加和减少并发消费者。 Enum 值:
| DefaultTaskExecutorType | |
eagerLoadingOfProperties (consumer (advanced)) | 加载消息后马上启用对 JMS 属性和有效负载的 eager 加载,这通常效率低下,因为 JMS 属性可能不需要,但有时可以尽早地捕获与底层 JMS 提供程序和使用 JMS 属性相关的问题。另请参阅 eagerPoisonBody 选项。 | false | 布尔值 |
eagerPoisonBody (consumer (advanced)) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)为 poison (不能读取/映射),则将此文本设置为消息正文,以便处理消息正文(导致 poison 的原因在 Exchange 上已存储为例外)。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅选项 eagerLoadingOfProperties。 | 因 $\{exception.message} 导致的 Poison JMS 消息 | 字符串 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
exposeListenerSession (consumer (advanced)) | 指定在消耗消息时是否应公开侦听器会话。 | false | 布尔值 |
replyToConsumerType (consumer (advanced)) | 回复消费者的消费者类型(在执行请求/回复时),可以是:Simple、Default 或 Custom 之一。consumer 类型决定要使用的 Spring JMS 侦听器。default 将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,Simple 将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 选项将决定要使用的 org.springframework.jms.listener.AbstractMessageListenerContainer。 Enum 值:
| 默认值 | ConsumerType |
replyToSameDestinationAllowed (consumer (advanced)) | 是否允许 JMS 使用者向消费者使用的同一目的地发送回复消息。这可防止通过消耗并发送相同消息到其自身的无端循环。 | false | 布尔值 |
taskExecutor (consumer (advanced)) | 允许您指定自定义任务 executor 以供使用消息。 | 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 或 timeToLiveity 的服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用于当前端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,读取仅来自 Camel In 消息标头的 QoS 属性。 | false | 布尔值 |
formatDateHeadersToIso8601 (producer) | 设置 JMS 日期属性是否应根据 ISO 8601 标准进行格式化。 | false | 布尔值 |
preserveMessageQos (producer) | 如果设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供 all 或 only some them。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖来自端点的值。相反,explicitQosEnabled 选项将使用端点上设置的选项,而不是来自消息标头的值。 | false | 布尔值 |
priority (producer) | 大于 1 的值在发送时指定消息优先级(其中 1 是最低优先级,9 为最高)。还必须启用 explicitQosEnabled 选项,以便此选项有任何效果。 Enum 值:
| 4 | int |
replyToConcurrentConsumers (producer) | 指定在对 JMS 进行请求/回复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | 1 | int |
replyToMaxConcurrentConsumers (producer) | 指定在 JMS 上使用请求/回复时的最大并发用户数。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | int | |
replyToOnTimeoutMaxcurrentConsumers (producer) | 指定在通过 JMS 使用请求/回复时,进行超时时继续路由的并发消费者的最大数量。 | 1 | int |
replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo 目的地,它会覆盖 replyTo 的设置。如果您要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这很有用。 | 字符串 | |
replyToType (producer) | 在通过 JMS 进行 request/reply 时,允许显式指定用于 replyTo 队列的策略类型。可能的值有: Temporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果配置了 replyTo,则默认使用 Shared。这个选项允许您使用专用队列而不是共享队列。如需了解更多详细信息,请参阅 Camel JMS 文档,特别是有关在集群环境中运行时的影响的信息,以及共享回复队列的性能比其 alternatives 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 交换模式时,请使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置消息将只与此属性的 JMSCorrelationID 属性的值关联,则忽略且不由 Camel 设置。 | 字符串 | |
disableTimeToLive (producer (advanced)) | 使用这个选项强制禁用生存时间。例如,当您通过 JMS 进行请求/回复时,Camel 默认将使用 requestTimeout 值作为发送消息的时间。问题是发送方和接收器系统必须同步其时钟,因此它们同步。这并非始终容易存档。因此,您可以使用 disableTimeToLive=true 来在发送的消息上将时间设置为 live 值。然后,该消息不会在接收器系统上过期。如需了解更多详细信息,请参见以下小节中关于 live 的时间。 | false | 布尔值 |
forceSendOriginalMessage (producer (advanced)) | 使用 mapJmsMessage=false Camel 时,如果您在路由过程中涉及标头(get 或 set),则创建新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly 发送到 JMS 目的地时(例如触发和忘记)。启用此选项将增强 Camel Exchange 与实际的 JMSMessageID,在消息发送到 JMS 目的地时供 JMS 客户端使用。 | false | 布尔值 |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
replyToCacheLevelName (producer (advanced)) | 在通过 JMS 进行请求/回复时,根据回复消费者设置缓存级别。这个选项只适用于使用固定回复队列(而非临时)。默认情况下,Camel 将使用:CACHE_CONSUMER 用于 exclusive 或 shared w/ replyToSelectorName。用于没有 replyToSelectorName 的共享的 CACHE_SESSION。IBM WebSphere 等一些 JMS 代理可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注意:如果使用临时队列,则不允许 CACHE_NONE,您必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
replyToDestinationSelectorName (producer (advanced)) | 使用要使用的固定名称设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(即,如果您不使用临时回复队列)。 | 字符串 | |
streamMessageTypeEnabled (producer (advanced)) | 设置 StreamMessage 类型是否已启用。通过以 BytesMessage 或 StreamMessage 发送的消息有效负载,如 files、InputStream 等。这个选项控制将使用的 kind。默认情况下,使用 BytesMessage 来强制将整个消息有效负载读取到内存中。通过启用这个选项,消息有效负载以块的形式读取到内存中,每个块都会被写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
allowSerializedHeaders (advanced) | 控制是否包含序列化标头。仅在 transferExchange 为 true 时应用。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。 | false | 布尔值 |
artemisStreamingEnabled (advanced) | 是否针对 Apache Artemis 流模式进行优化。当将 Artemis 与 JMS StreamMessage 类型一起使用时,这可以减少内存开销。只有在使用 Apache Artemis 时,才必须启用此选项。 | false | 布尔值 |
asyncStartListener (advanced) | 在启动路由时,是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法获得与远程 JMS 代理的连接,那么在重试和/或故障转移时可能会阻止它。这会导致 Camel 在启动路由时阻止。通过将这个选项设置为 true,您可以让路由启动,而 JmsConsumer 使用异步模式的专用线程连接到 JMS 代理。如果使用此选项,请注意,如果无法建立连接,则会在 WARN 级别记录异常,消费者将无法接收消息;然后,您可以重启要重试的路由。 | false | 布尔值 |
asyncStopListener (advanced) | 在停止路由时,是否异步停止 JmsConsumer 消息监听程序。 | false | 布尔值 |
destinationResolver (advanced) | 可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找实际目的地)。 | DestinationResolver | |
errorHandler (advanced) | 指定在处理消息时抛出异常时调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置 errorHandler,则会在 WARN 级别中记录这些例外。您可以配置日志记录级别,以及堆栈跟踪是否应该使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录。这样可以更容易配置,而不必对自定义 errorHandler 进行编码。 | ErrorHandler | |
exceptionListener (advanced) | 指定要收到任何底层 JMS 异常的 JMS Exception Listener。 | ExceptionListener | |
headerFilterStrategy (advanced) | 使用自定义 HeaderFilterStrategy 过滤标头到 Camel 消息。 | HeaderFilterStrategy | |
idleConsumerLimit (advanced) | 指定允许在任何给定时间闲置的用户数量的限制。 | 1 | int |
idleTaskExecutionLimit (advanced) | 指定接收任务的闲置执行的限制,而不是在其执行中收到任何消息。如果达到这个限制,则任务将关闭并离开接收其他执行任务(在动态调度的情况下;请参阅 maxConcurrentConsumers 设置)。Spring 中还有额外的文档。 | 1 | int |
includeAllJMSXProperties (advanced) | 在从 JMS 到 Camel 消息映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注: 如果您使用自定义 headerFilterStrategy,则这个选项不适用。 | false | 布尔值 |
jmsKeyFormatStrategy (advanced) | 用于编码和解码 JMS 密钥的可插拔策略,以便它们能够与 JMS 规范兼容。Camel 提供了两个开箱即用的实现:default 和 passthrough。默认策略将安全地 marshal 句点和连字符(. 和 -)。passthrough 策略将密钥保留为原样。可用于 JMS 代理,这些代理不关心 JMS 标头键是否包含非法字符。您可以提供自己的 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 # 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
mapJmsMessage (advanced) | 指定 Camel 是否将收到的 JMS 消息自动映射到适合的有效负载类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
maxMessagesPerTask (advanced) | 每个任务的消息数量。-1 代表没有限制。如果您将范围用于并发消费者(例如 min max),则此选项可用于设置 eg 100 来控制在需要较少工作时消费者缩小的速度。 | -1 | int |
messageConverter (advanced) | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
messageCreatedStrategy (advanced) | 使用在 Camel 发送 JMS 消息时调用的 given MessageCreatedStrategy,在 Camel 创建 javax.jms.Message 对象的新实例时调用。 | MessageCreatedStrategy | |
messageIdEnabled (advanced) | 发送时,指定是否应添加消息 ID。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将消息 ID 设置为 null;如果供应商忽略 hint,则消息 ID 必须设置为其正常唯一值。 | true | 布尔值 |
messageListenerContainerFactory (advanced) | 用于决定使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 MessageListenerContainerFactory 的 registry ID。设置此选项会自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
messageTimestampEnabled (advanced) | 指定默认情况下,是否应在发送消息时启用时间戳。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将时间戳设置为零;如果供应商忽略 hint,则必须将时间戳设置为其正常值。 | true | 布尔值 |
pubSubNoLocal (advanced) | 指定是否禁止发送其自身连接发布的消息。 | false | 布尔值 |
receiveTimeout (advanced) | 接收消息的超时时间(以毫秒为单位)。 | 1000 | long |
recoveryInterval (advanced) | 指定恢复尝试之间的间隔,即刷新连接时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。 | 5000 | long |
requestTimeoutCheckerInterval (advanced) | 配置 Camel 在通过 JMS 进行请求/回复时应检查超时交换的频率。默认情况下,Camel 会每秒检查一次。但是,如果您在超时时必须更快地响应,您可以降低这个间隔,以便更频繁地检查。超时由选项 requestTimeout 决定。 | 1000 | long |
同步 (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
transferException (advanced) | 如果启用了,并且您在使用 Request Reply messaging (InOut),且 Exchange 在消费者端失败,则原因例外将作为 javax.jms.ObjectMessage 发回。如果客户端是 Camel,则返回的例外将被重新箭头。这样,您可以在路由中使用 Camel JMS 作为网桥 - 例如,使用持久性队列启用可靠的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。需要 Caught 异常才能按顺序排序。消费者端的原始 Exception 可以嵌套在外部异常中,如返回到制作者时 org.apache.camel.RuntimeCamelException。请小心谨慎,因为数据使用 Java 对象序列化,并且要求收到的能够在类级别上反序列化数据,这会强行生产者和消费者之间的强耦合。 | false | 布尔值 |
transferExchange (advanced) | 您可以通过线路传输交换,而不只是正文和标头。以下字段会被传输:在 body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。您必须在生成者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换而不是常规有效负载。请小心谨慎,因为数据使用 Java 对象序列化,并且要求接收器能够在类级别上反序列化数据,这会强制生产者与需要使用兼容 Camel 版本的消费者之间强耦耦合! | false | 布尔值 |
useMessageIDAsCorrelationID (advanced) | 指定 JMSMessageID 是否始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在通过 JMS 进行请求/回复时,等待 provisional correlation id 更新为实际关联 ID 的次数,以及启用选项 useMessageIDAsCorrelationID 的时间。 | 50 | int |
waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 等待更新调配关联 id 期间每次处于睡眠状态的间隔。 | 100 | long |
errorHandlerLoggingLevel (logging) | 允许为日志记录无法捕获的异常配置默认 errorHandler 日志记录级别。 Enum 值:
| WARN | LoggingLevel |
errorHandlerLogStackTrace (logging) | 允许默认 errorHandler 控制是否应记录 stacktrace。 | true | 布尔值 |
password (security) | 用于 ConnectionFactory 的密码。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
用户名 (安全性) | 用于 ConnectionFactory 的用户名。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
转换 (事务) | 指定是否使用 transacted 模式。 | false | 布尔值 |
transactedInOut (transaction) | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式(如果此标志设为 true),则 Spring JmsTemplate 会将 sessionTransacted 设置为 true,以及 acknowledgeMode 作为 InOut 操作的 JmsTemplate 的 transacted。注意从 Spring JMS:在 JTA 事务中,传递给 createQueue 的参数,不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值自行做出决定。类似地,这些参数不会被在本地管理的事务中考虑,因为本例中的 Spring JMS 在现有的 JMS Session 上运行。在受管事务之外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(并非 XA 事务)的情况下同步的本地 JMS 事务。这将与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务),而 JMS 事务会在主事务后提交右边。 | false | 布尔值 |
lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,则 Camel 将创建一个 JmsTransactionManager,如果没有在选项 transacted=true 时注入任何 transactionManager。 | true | 布尔值 |
transactionManager (transaction (advanced)) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
transactionTimeout (transaction (advanced)) | 使用 transacted 模式,事务的超时值(以秒为单位)。 | -1 | int |
2.6. 使用方法
由于 AMQP 组件继承自 JMS 组件,因此前者的使用与后者几乎相同:
使用 AMQP 组件
// Consuming from AMQP queue from("amqp:queue:incoming"). to(...); // Sending message to the AMQP topic from(...). to("amqp:topic:notify");
2.7. 配置 AMQP 组件
创建 AMQP 1.0 组件
AMQPComponent amqp = AMQPComponent.amqpComponent("amqp://localhost:5672"); AMQPComponent authorizedAmqp = AMQPComponent.amqpComponent("amqp://localhost:5672", "user", "password");
您还可以在 registry 中添加 org.apache.camel.component.amqp.amqpConnectionDetails
的实例,以自动配置 AMQP 组件。例如,对于 Spring Boot,您只需要定义 bean:
AMQP 连接详情自动配置
@Bean AMQPConnectionDetails amqpConnection() { return new AMQPConnectionDetails("amqp://localhost:5672"); } @Bean AMQPConnectionDetails securedAmqpConnection() { return new AMQPConnectionDetails("amqp://localhost:5672", "username", "password"); }
同样,在使用 Camel-CDI 时也可以使用 CDI producer 方法
AMQP 连接详情自动配置 CDI
@Produces AMQPConnectionDetails amqpConnection() { return new AMQPConnectionDetails("amqp://localhost:5672"); }
您还可以依赖 来读取 AMQP 连接详情。工厂方法 AMQPConnectionDetails.discoverAMQP ()
试图以类似于 Kubernetes 的惯例读取 Camel 属性,如以下代码片段所示:
AMQP 连接详情自动配置
export AMQP_SERVICE_HOST = "mybroker.com" export AMQP_SERVICE_PORT = "6666" export AMQP_SERVICE_USERNAME = "username" export AMQP_SERVICE_PASSWORD = "password" ... @Bean AMQPConnectionDetails amqpConnection() { return AMQPConnectionDetails.discoverAMQP(); }
启用 AMQP 具体选项
例如,如果您需要启用 amqp.traceFrames
,您可以通过将选项附加到 URI 来完成此操作,如下例所示:
AMQPComponent amqp = AMQPComponent.amqpComponent("amqp://localhost:5672?amqp.traceFrames=true");
请参考 QPID JMS 客户端配置。
2.8. 使用主题
要使用 camel-amqp
的主题,您需要将组件配置为使用 topic://
作为主题前缀,如下所示:
<bean id="amqp" class="org.apache.camel.component.amqp.AmqpComponent"> <property name="connectionFactory"> <bean class="org.apache.qpid.jms.JmsConnectionFactory" factory-method="createFromURL"> <property name="remoteURI" value="amqp://localhost:5672" /> <property name="topicPrefix" value="topic://" /> <!-- only necessary when connecting to ActiveMQ over AMQP 1.0 --> </bean> </property> </bean>
请记住,AMQPComponent#amqpComponent ()
方法和 AMQPConnectionDetails
预配置组件带有主题前缀,因此您不必明确配置它。
2.9. Spring Boot Auto-Configuration
组件支持 101 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.amqp.accept-messages-while-stopping | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,您可以考虑启用此选项,同时仍然在队列上排队消息。如果此选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,而 JMS 代理必须尝试重新设计,这一次可能被拒绝,最终该消息可能会在 JMS 代理上的死信队列中移动。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
camel.component.amqp.acknowledgement-mode-name | JMS 确认名称,即: SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE。 | AUTO_ACKNOWLEDGE | 字符串 |
camel.component.amqp.allow-additional-headers | 此选项用于允许其他标头,它们可能具有根据 JMS 规范无效的值。例如,一些消息系统(如 WMQ)使用前缀 JMS_IBM_MQMD_ 来执行此操作,其中包含带有字节数组或其他无效类型的值。您可以指定多个标头名称,用逗号分开,并使用 作为通配符匹配的后缀。 | 字符串 | |
camel.component.amqp.allow-auto-wired-connection-factory | 如果没有配置连接工厂,是否从 registry 中自动发现 ConnectionFactory。如果只找到了一个 ConnectionFactory 实例,则会使用它。这默认是启用的。 | true | 布尔值 |
camel.component.amqp.allow-auto-wired-destination-resolver | 如果没有配置目标解析器,是否从 registry 中自动发现 DestinationResolver。如果只找到一个 DestinationResolver 实例,则会使用它。这默认是启用的。 | true | 布尔值 |
camel.component.amqp.allow-null-body | 是否允许发送不包含正文的消息。如果此选项为 false,并且消息正文为 null,则会抛出一个 JMSException。 | true | 布尔值 |
camel.component.amqp.allow-reply-manager-quick-stop | 是否在回复管理器中使用 DefaultMessageListenerContainer 用于 request-reply 消息,都允许 DefaultMessageListenerContainer.runningAllowed 标志在启用了 JmsConfiguration#isAcceptMessagesWhileStopping 时快速停止,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 消费者中默认启用这种快速停止功能,但为了启用此标志,您必须启用此标志。 | false | 布尔值 |
camel.component.amqp.allow-serialized-headers | 控制是否包含序列化标头。仅在 transferExchange 为 true 时应用。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。 | false | 布尔值 |
camel.component.amqp.always-copy-message | 如果为 true,Camel 会在传递给生成者发送时始终生成邮件的 JMS 消息副本。在某些情况下需要复制消息,比如当设置了 replyToDestinationSelectorName 时(通常,如果设置了 replyToDestinationSelectorName),则 Camel 会将 alwaysCopyMessage 选项设置为 true。 | false | 布尔值 |
camel.component.amqp.artemis-consumer-priority | 通过消费者优先级,您可以确保高优先级消费者在激活时收到消息。通常,连接到队列的活动用户以轮循方式从它接收消息。使用消费者优先级时,如果有多个活跃的消费者具有相同的高优先级,则会发送循环消息。只有高优先级消费者没有使用消息的信用时,消息才会受到较低优先级的用户,或者那些高优先级消费者已拒绝接受该消息(例如,因为它不符合与消费者关联的任何选择器的条件)。 | 整数 | |
camel.component.amqp.artemis-streaming-enabled | 是否针对 Apache Artemis 流模式进行优化。当将 Artemis 与 JMS StreamMessage 类型一起使用时,这可以减少内存开销。只有在使用 Apache Artemis 时,才必须启用此选项。 | false | 布尔值 |
camel.component.amqp.async-consumer | JmsConsumer 是否异步处理 Exchange。如果启用,则 JmsConsumer 可能会从 JMS 队列中获取下一个消息,而前面的消息会被异步处理(通过异步路由引擎)。这意味着消息可能没有完全严格按照顺序进行处理。如果禁用(作为默认),则在 JmsConsumer 从 JMS 队列获取下一个消息前完全处理 Exchange。请注意,如果启用了 transacted,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。 | false | 布尔值 |
camel.component.amqp.async-start-listener | 在启动路由时,是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法获得与远程 JMS 代理的连接,那么在重试和/或故障转移时可能会阻止它。这会导致 Camel 在启动路由时阻止。通过将这个选项设置为 true,您可以让路由启动,而 JmsConsumer 使用异步模式的专用线程连接到 JMS 代理。如果使用此选项,请注意,如果无法建立连接,则会在 WARN 级别记录异常,消费者将无法接收消息;然后,您可以重启要重试的路由。 | false | 布尔值 |
camel.component.amqp.async-stop-listener | 在停止路由时,是否异步停止 JmsConsumer 消息监听程序。 | false | 布尔值 |
camel.component.amqp.auto-startup | 指定消费者容器是否应该自动启动。 | true | 布尔值 |
camel.component.amqp.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.amqp.cache-level | 根据 ID 为底层 JMS 资源设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。 | 整数 | |
camel.component.amqp.cache-level-name | 按名称为底层 JMS 资源设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。 | CACHE_AUTO | 字符串 |
camel.component.amqp.client-id | 设置要使用的 JMS 客户端 ID。请注意,如果指定,这个值必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只需要使用 JMS 1.1 的持久主题订阅。 | 字符串 | |
camel.component.amqp.concurrent-consumers | 指定从 JMS 消耗时的默认并发用户数(不适用于 JMS 上的请求/回复)。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。当对 JMS 进行请求/回复时,选项 replyToConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。 | 1 | 整数 |
camel.component.amqp.configuration | 使用共享的 JMS 配置。选项是 org.apache.camel.component.jms.JmsConfiguration 类型。 | JmsConfiguration | |
camel.component.amqp.connection-factory | 要使用的连接工厂。连接工厂必须在组件或端点上配置。选项是 javax.jms.ConnectionFactory 类型。 | ConnectionFactory | |
camel.component.amqp.consumer-type | 要使用的消费者类型,可以是: Simple、Default 或 Custom 之一。consumer 类型决定要使用的 Spring JMS 侦听器。default 将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,Simple 将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 选项将决定要使用的 org.springframework.jms.listener.AbstractMessageListenerContainer。 | ConsumerType | |
camel.component.amqp.correlation-property | 使用 InOut 交换模式时,请使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置消息将只与此属性的 JMSCorrelationID 属性的值关联,则忽略且不由 Camel 设置。 | 字符串 | |
camel.component.amqp.default-task-executor-type | 指定 DefaultMessageListenerContainer 中使用哪些默认 TaskExecutor 类型,用于消费者端点和生成者端点的 ReplyTo consumer。可能的值:simpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用 Spring 的 ThreadPoolTaskExecutor 带有最佳值 - 缓存的 threadpool-like)。如果没有设置,则默认为前面的行为,它对消费者使用缓存的线程池,并将 SimpleAsync 用于回复消费者。建议使用 ThreadPool 来减少弹性配置中的线程垃圾箱,并动态增加和减少并发消费者。 | DefaultTaskExecutorType | |
camel.component.amqp.delivery-delay | 设置用于为 JMS 发送调用的交付延迟。这个选项需要 JMS 2.0 兼容代理。 | -1 | Long |
camel.component.amqp.delivery-mode | 指定要使用的交付模式。可能的值有 javax.jms.DeliveryMode 定义的值。NON_PERSISTENT = 1 和 PERSISTENT = 2. | 整数 | |
camel.component.amqp.delivery-persistent | 指定是否默认使用持久性交付。 | true | 布尔值 |
camel.component.amqp.destination-resolver | 可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找实际目的地)。选项是一个 org.springframework.jms.support.destination.DestinationResolver 类型。 | DestinationResolver | |
camel.component.amqp.disable-reply-to | 指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目的地发送回复。如果您希望 Camel 消耗路由,且您不想 Camel 自动发送回复消息,您可以使用这个选项,因为代码中的另一个组件处理回复消息。如果要使用 Camel 作为不同消息代理之间的代理,而您想要将消息从一个系统路由到另一个系统,也可以使用此选项。 | false | 布尔值 |
camel.component.amqp.disable-time-to-live | 使用这个选项强制禁用生存时间。例如,当您通过 JMS 进行请求/回复时,Camel 默认将使用 requestTimeout 值作为发送消息的时间。问题是发送方和接收器系统必须同步其时钟,因此它们同步。这并非始终容易存档。因此,您可以使用 disableTimeToLive=true 来在发送的消息上将时间设置为 live 值。然后,该消息不会在接收器系统上过期。如需了解更多详细信息,请参见以下小节中关于 live 的时间。 | false | 布尔值 |
camel.component.amqp.durable-subscription-name | 用于指定持久主题订阅的持久订阅者名称。也必须配置 clientId 选项。 | 字符串 | |
camel.component.amqp.eager-loading-of-properties | 加载消息后马上启用对 JMS 属性和有效负载的 eager 加载,这通常效率低下,因为 JMS 属性可能不需要,但有时可以尽早地捕获与底层 JMS 提供程序和使用 JMS 属性相关的问题。另请参阅 eagerPoisonBody 选项。 | false | 布尔值 |
camel.component.amqp.eager-poison-body | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)为 poison (不能读取/映射),则将此文本设置为消息正文,以便处理消息正文(导致 poison 的原因在 Exchange 上已存储为例外)。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅选项 eagerLoadingOfProperties。 | 因 $\{exception.message} 导致的 Poison JMS 消息 | 字符串 |
camel.component.amqp.enabled | 是否启用 amqp 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.amqp.error-handler | 指定在处理消息时抛出异常时调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置 errorHandler,则会在 WARN 级别中记录这些例外。您可以配置日志记录级别,以及堆栈跟踪是否应该使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录。这样可以更容易配置,而不必对自定义 errorHandler 进行编码。选项是一个 org.springframework.util.ErrorHandler 类型。 | ErrorHandler | |
camel.component.amqp.error-handler-log-stack-trace | 允许默认 errorHandler 控制是否应记录 stacktrace。 | true | 布尔值 |
camel.component.amqp.error-handler-logging-level | 允许为日志记录无法捕获的异常配置默认 errorHandler 日志记录级别。 | LoggingLevel | |
camel.component.amqp.exception-listener | 指定要收到任何底层 JMS 异常的 JMS Exception Listener。选项是 javax.jms.ExceptionListener 类型。 | ExceptionListener | |
camel.component.amqp.explicit-qos-enabled | 设定在发送消息时应使用 deliveryMode、priority 或 timeToLiveity 的服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用于当前端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,读取仅来自 Camel In 消息标头的 QoS 属性。 | false | 布尔值 |
camel.component.amqp.expose-listener-session | 指定在消耗消息时是否应公开侦听器会话。 | false | 布尔值 |
camel.component.amqp.force-send-original-message | 使用 mapJmsMessage=false Camel 时,如果您在路由过程中涉及标头(get 或 set),则创建新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
camel.component.amqp.format-date-headers-to-iso8601 | 设置 JMS 日期属性是否应根据 ISO 8601 标准进行格式化。 | false | 布尔值 |
camel.component.amqp.header-filter-strategy | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
camel.component.amqp.idle-consumer-limit | 指定允许在任何给定时间闲置的用户数量的限制。 | 1 | 整数 |
camel.component.amqp.idle-task-execution-limit | 指定接收任务的闲置执行的限制,而不是在其执行中收到任何消息。如果达到这个限制,则任务将关闭并离开接收其他执行任务(在动态调度的情况下;请参阅 maxConcurrentConsumers 设置)。Spring 中还有额外的文档。 | 1 | 整数 |
camel.component.amqp.include-all-jmsx-properties | 在从 JMS 到 Camel 消息映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注: 如果您使用自定义 headerFilterStrategy,则这个选项不适用。 | false | 布尔值 |
camel.component.amqp.include-amqp-annotations | 在从 AMQP 到 Camel 消息映射时是否包含 AMQP 注解。把它设置为 true 将包含 JMS_AMQP_MA_ 前缀的 AMQP 消息注解映射到消息标头。由于 Apache Qpid JMS API 的限制,当前交付注释将被忽略。 | false | 布尔值 |
camel.component.amqp.include-sent-jms-message-id | 仅在使用 InOnly 发送到 JMS 目的地时(例如触发和忘记)。启用此选项将增强 Camel Exchange 与实际的 JMSMessageID,在消息发送到 JMS 目的地时供 JMS 客户端使用。 | false | 布尔值 |
camel.component.amqp.jms-key-format-strategy | 用于编码和解码 JMS 密钥的可插拔策略,以便它们能够与 JMS 规范兼容。Camel 提供了两个开箱即用的实现:default 和 passthrough。默认策略将安全地 marshal 句点和连字符(. 和 -)。passthrough 策略将密钥保留为原样。可用于 JMS 代理,这些代理不关心 JMS 标头键是否包含非法字符。您可以提供自己的 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 # 表示法引用它。 | JmsKeyFormatStrategy | |
camel.component.amqp.jms-message-type | 允许您强制使用特定的 javax.jms.Message 实现来发送 JMS 消息。可能的值有:Bytes, Map, Object, Stream, Text。默认情况下,Camel 将决定要从 In body 类型中使用的 JMS 消息类型。这个选项允许您指定它。 | JmsMessageType | |
camel.component.amqp.lazy-create-transaction-manager | 如果为 true,则 Camel 将创建一个 JmsTransactionManager,如果没有在选项 transacted=true 时注入任何 transactionManager。 | true | 布尔值 |
camel.component.amqp.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.amqp.map-jms-message | 指定 Camel 是否将收到的 JMS 消息自动映射到适合的有效负载类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
camel.component.amqp.max-concurrent-consumers | 指定从 JMS 消耗时的最大并发消费者数(不适用于 JMS 上的请求/回复)。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。当对 JMS 进行请求/回复时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | 整数 | |
camel.component.amqp.max-messages-per-task | 每个任务的消息数量。-1 代表没有限制。如果您将范围用于并发消费者(例如 min max),则此选项可用于设置 eg 100 来控制在需要较少工作时消费者缩小的速度。 | -1 | 整数 |
camel.component.amqp.message-converter | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。选项是 org.springframework.jms.support.converter.MessageConverter 类型。 | MessageConverter | |
camel.component.amqp.message-created-strategy | 使用在 Camel 发送 JMS 消息时调用的 given MessageCreatedStrategy,在 Camel 创建 javax.jms.Message 对象的新实例时调用。选项是一个 org.apache.camel.component.jms.MessageCreatedStrategy 类型。 | MessageCreatedStrategy | |
camel.component.amqp.message-id-enabled | 发送时,指定是否应添加消息 ID。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将消息 ID 设置为 null;如果供应商忽略 hint,则消息 ID 必须设置为其正常唯一值。 | true | 布尔值 |
camel.component.amqp.message-listener-container-factory | 用于决定使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 MessageListenerContainerFactory 的 registry ID。设置此选项会自动将 consumerType 设置为 Custom。选项是 org.apache.camel.component.jms.MessageListenerContainerFactory 类型。 | MessageListenerContainerFactory | |
camel.component.amqp.message-timestamp-enabled | 指定默认情况下,是否应在发送消息时启用时间戳。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将时间戳设置为零;如果供应商忽略 hint,则必须将时间戳设置为其正常值。 | true | 布尔值 |
camel.component.amqp.password | 用于 ConnectionFactory 的密码。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
camel.component.amqp.preserve-message-qos | 如果设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供 all 或 only some them。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖来自端点的值。相反,explicitQosEnabled 选项将使用端点上设置的选项,而不是来自消息标头的值。 | false | 布尔值 |
camel.component.amqp.priority | 大于 1 的值在发送时指定消息优先级(其中 1 是最低优先级,9 为最高)。还必须启用 explicitQosEnabled 选项,以便此选项有任何效果。 | 4 | 整数 |
camel.component.amqp.pub-sub-no-local | 指定是否禁止发送其自身连接发布的消息。 | false | 布尔值 |
camel.component.amqp.queue-browse-strategy | 在浏览队列时使用自定义 QueueBrowseStrategy。选项是 org.apache.camel.component.jms.QueueBrowseStrategy 类型。 | QueueBrowseStrategy | |
camel.component.amqp.receive-timeout | 接收消息的超时时间(以毫秒为单位)。选项是一个长类型。 | 1000 | Long |
camel.component.amqp.recovery-interval | 指定恢复尝试之间的间隔,即刷新连接时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。选项是一个长类型。 | 5000 | Long |
camel.component.amqp.reply-to | 提供显式 ReplyTo 目的地(会覆盖消费者中的 Message.getJMSReplyTo ()的任何传入值)。 | 字符串 | |
camel.component.amqp.reply-to-cache-level-name | 在通过 JMS 进行请求/回复时,根据回复消费者设置缓存级别。这个选项只适用于使用固定回复队列(而非临时)。默认情况下,Camel 将使用:CACHE_CONSUMER 用于 exclusive 或 shared w/ replyToSelectorName。用于没有 replyToSelectorName 的共享的 CACHE_SESSION。IBM WebSphere 等一些 JMS 代理可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注意:如果使用临时队列,则不允许 CACHE_NONE,您必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 | 字符串 | |
camel.component.amqp.reply-to-concurrent-consumers | 指定在对 JMS 进行请求/回复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | 1 | 整数 |
camel.component.amqp.reply-to-consumer-type | 回复消费者的消费者类型(在执行请求/回复时),可以是:Simple、Default 或 Custom 之一。consumer 类型决定要使用的 Spring JMS 侦听器。default 将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,Simple 将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 选项将决定要使用的 org.springframework.jms.listener.AbstractMessageListenerContainer。 | ConsumerType | |
camel.component.amqp.reply-to-delivery-persistent | 指定是否默认使用持久性发送进行回复。 | true | 布尔值 |
camel.component.amqp.reply-to-destination-selector-name | 使用要使用的固定名称设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(即,如果您不使用临时回复队列)。 | 字符串 | |
camel.component.amqp.reply-to-max-concurrent-consumers | 指定在 JMS 上使用请求/回复时的最大并发用户数。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | 整数 | |
camel.component.amqp.reply-to-on-timeout-max-concurrent-consumers | 指定在通过 JMS 使用请求/回复时,进行超时时继续路由的并发消费者的最大数量。 | 1 | 整数 |
camel.component.amqp.reply-to-override | 在 JMS 消息中提供显式 ReplyTo 目的地,它会覆盖 replyTo 的设置。如果您要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这很有用。 | 字符串 | |
camel.component.amqp.reply-to-same-destination-allowed | 是否允许 JMS 使用者向消费者使用的同一目的地发送回复消息。这可防止通过消耗并发送相同消息到其自身的无端循环。 | false | 布尔值 |
camel.component.amqp.reply-to-type | 在通过 JMS 进行 request/reply 时,允许显式指定用于 replyTo 队列的策略类型。可能的值有: Temporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果配置了 replyTo,则默认使用 Shared。这个选项允许您使用专用队列而不是共享队列。如需了解更多详细信息,请参阅 Camel JMS 文档,特别是有关在集群环境中运行时的影响的信息,以及共享回复队列的性能比其 alternatives Temporary 和 Exclusive 的性能较低。 | ReplyToType | |
camel.component.amqp.request-timeout | 使用 InOut Exchange Pattern (毫秒)时等待回复的超时时间。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖这个端点配置的超时值,因此每个消息单个超时值。另请参阅 requestTimeoutCheckerInterval 选项。选项是一个长类型。 | 20000 | Long |
camel.component.amqp.request-timeout-checker-interval | 配置 Camel 在通过 JMS 进行请求/回复时应检查超时交换的频率。默认情况下,Camel 会每秒检查一次。但是,如果您在超时时必须更快地响应,您可以降低这个间隔,以便更频繁地检查。超时由选项 requestTimeout 决定。选项是一个长类型。 | 1000 | Long |
camel.component.amqp.selector | 设置要使用的 JMS 选择器。 | 字符串 | |
camel.component.amqp.stream-message-type-enabled | 设置 StreamMessage 类型是否已启用。通过以 BytesMessage 或 StreamMessage 发送的消息有效负载,如 files、InputStream 等。这个选项控制将使用的 kind。默认情况下,使用 BytesMessage 来强制将整个消息有效负载读取到内存中。通过启用这个选项,消息有效负载以块的形式读取到内存中,每个块都会被写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
camel.component.amqp.subscription-durable | 设置是否使订阅持久化。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
camel.component.amqp.subscription-name | 设置要创建的订阅的名称。在带有共享或持久订阅的主题(pub-sub domain)时应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发消费者(这是此消息监听程序容器的默认值),除了一个共享订阅(需要 JMS 2.0)。 | 字符串 | |
camel.component.amqp.subscription-shared | 设置是否共享订阅。要使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 来注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以作为订阅名称使用)。请注意,共享订阅也可能是持久的,因此此标志也可以与 subscriptionDurable 结合使用。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
camel.component.amqp.synchronous | 设置是否应严格使用同步处理。 | false | 布尔值 |
camel.component.amqp.task-executor | 允许您指定自定义任务 executor 以供使用消息。选项是一个 org.springframework.core.task.TaskExecutor 类型。 | TaskExecutor | |
camel.component.amqp.test-connection-on-startup | 指定是否在启动时测试连接。这样可确保 Camel 启动所有 JMS 用户具有与 JMS 代理的有效连接时。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS 制作者也经过测试。 | false | 布尔值 |
camel.component.amqp.time-to-live | 在发送消息时,指定消息的生存时间(以毫秒为单位)。 | -1 | Long |
camel.component.amqp.transacted | 指定是否使用 transacted 模式。 | false | 布尔值 |
camel.component.amqp.transacted-in-out | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式(如果此标志设为 true),则 Spring JmsTemplate 会将 sessionTransacted 设置为 true,以及 acknowledgeMode 作为 InOut 操作的 JmsTemplate 的 transacted。注意从 Spring JMS:在 JTA 事务中,传递给 createQueue 的参数,不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值自行做出决定。类似地,这些参数不会被在本地管理的事务中考虑,因为本例中的 Spring JMS 在现有的 JMS Session 上运行。在受管事务之外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(并非 XA 事务)的情况下同步的本地 JMS 事务。这将与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务),而 JMS 事务会在主事务后提交右边。 | false | 布尔值 |
camel.component.amqp.transaction-manager | 要使用的 Spring 事务管理器。选项是一个 org.springframework.transaction.PlatformTransactionManager 类型。 | PlatformTransactionManager | |
camel.component.amqp.transaction-name | 要使用的事务的名称。 | 字符串 | |
camel.component.amqp.transaction-timeout | 使用 transacted 模式,事务的超时值(以秒为单位)。 | -1 | 整数 |
camel.component.amqp.transfer-exception | 如果启用了,并且您在使用 Request Reply messaging (InOut),且 Exchange 在消费者端失败,则原因例外将作为 javax.jms.ObjectMessage 发回。如果客户端是 Camel,则返回的例外将被重新箭头。这样,您可以在路由中使用 Camel JMS 作为网桥 - 例如,使用持久性队列启用可靠的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。需要 Caught 异常才能按顺序排序。消费者端的原始 Exception 可以嵌套在外部异常中,如返回到制作者时 org.apache.camel.RuntimeCamelException。请小心谨慎,因为数据使用 Java 对象序列化,并且要求收到的能够在类级别上反序列化数据,这会强行生产者和消费者之间的强耦合。 | false | 布尔值 |
camel.component.amqp.transfer-exchange | 您可以通过线路传输交换,而不只是正文和标头。以下字段会被传输:在 body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。您必须在生成者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换而不是常规有效负载。请小心谨慎,因为数据使用 Java 对象序列化,并且要求接收器能够在类级别上反序列化数据,这会强制生产者与需要使用兼容 Camel 版本的消费者之间强耦耦合! | false | 布尔值 |
camel.component.amqp.use-message-id-as-correlation-id | 指定 JMSMessageID 是否始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
camel.component.amqp.username | 用于 ConnectionFactory 的用户名。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
camel.component.amqp.wait-for-provision-correlation-to-be-updated-counter | 在通过 JMS 进行请求/回复时,等待 provisional correlation id 更新为实际关联 ID 的次数,以及启用选项 useMessageIDAsCorrelationID 的时间。 | 50 | 整数 |
camel.component.amqp.wait-for-provision-correlation-to-be-updated-thread-sleeping-time | 等待更新调配关联 id 期间每次处于睡眠状态的间隔。选项是一个长类型。 | 100 | Long |
第 3 章 Avro
此组件为 avro 提供 dataformat,允许使用 Apache Avro 的二进制 dataformat 来序列化和解序列化消息。由于 Camel 3.2 rpc 功能被移到单独的 camel-avro-rpc
组件中。
您可以使用 maven 和 ant 等模式轻松生成类。如需更多详细信息,请参阅 Apache Avro 文档。
3.1. 依赖项
当在 Camel Spring Boot 中使用 camel-avro
时,请添加以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-avro-starter</artifactId> </dependency>
3.2. avro Dataformat 选项
Avro dataformat 支持 1 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
instanceClassName |
| 用于 marshal 和 unmarshalling 的类名称。 |
3.3. 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。
3.4. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 avro 时,请确保添加 Maven 依赖项来支持自动配置。组件支持 2 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.dataformat.avro.enabled | 是否启用 avro 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
camel.dataformat.avro.instance-class-name | 用于 marshal 和 unmarshalling 的类名称。 | 字符串 |
第 4 章 avro Jackson
Jackson Avro 是一个数据格式,它使用带有 Avro 扩展的 Jackson 库,将 Avro 有效负载 unmarshalshalshalshal Java 对象到 Avro 有效负载。
如果您熟悉 Jackson,则此 Avro 数据格式的行为与其 JSON 对应部分相同,因此可用于为 JSON 序列化/序列化/序列化注解的类。
from("kafka:topic"). unmarshal().avro(AvroLibrary.Jackson, JsonNode.class). to("log:info");
4.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 avro-jackson
时,请确保添加 Maven 依赖项来支持自动配置。
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jackson-avro-starter</artifactId> </dependency>
4.2. 配置 SchemaResolver
由于 Avro serialization 基于模式,因此此数据格式需要您提供一个 SchemaResolver 对象,该对象能够为将要被处理/unmarshalled 的每个交换查找 schema。
您可以将单个 SchemaResolver 添加到 registry 中,它将被自动查找。或者,您可以明确指定对自定义 SchemaResolver 的引用。
4.3. avro Jackson 选项
Avro Jackson dataformat 支持 18 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
objectMapper |
| 使用 Jackson 时,查找并使用带有给定 id 的现有 ObjectMapper。 | |
useDefaultObjectMapper |
| 是否从 registry 中查找和使用默认 Jackson ObjectMapper。 | |
unmarshalType |
| 当 unmarshalling 时使用的 java 类型的类名称。 | |
jsonView |
| 当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来实现此目的。此选项是引用具有 JsonView 注释的类。 | |
Include |
| 如果您想 marshal a pojo to JSON,并且 pojo 具有一些带有 null 值的字段。如果您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | |
allowJmsType |
| 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定一个 FQN 类名称来用于 unmarshal。 | |
collectionType |
| 引用要使用的自定义集合类型,以便在 registry 中查找。这个选项应该很少被使用,但允许使用与基于 java.util.Collection 不同的集合类型。 | |
useList |
| To unmarshal 到 Map 列表或 Pojo 的列表。 | |
moduleClassNames |
| 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为 String with FQN 类名称。可以使用逗号分隔多个类。 | |
moduleRefs |
| 使用 Camel registry 中引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | |
enableFeatures |
| 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature multiple features 分开的名称。 | |
disableFeatures |
| 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature multiple features 分开的名称。 | |
allowUnmarshallType |
| 如果启用,则允许 Jackson 在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只有在需要使用时才启用。 | |
timezone |
| 如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。 | |
autoDiscoverObjectMapper |
| 如果设置为 true,则 Jackson 将把 objectMapper 来查找到 registry 中。 | |
contentTypeHeader |
| 数据格式是否应该使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式到 XML 的 application/xml 或用于数据格式的 application/json 发送到 JSON。 | |
schemaResolver |
| 可选的模式解析器用于查找传输中数据的模式。 | |
autoDiscoverSchemaResolver |
| 如果没有禁用,SchemaResolver 将查找到 registry 中。 |
4.4. 使用自定义 AvroMapper
如果需要更多地控制映射配置,您可以将 JacksonAvroDataFormat
配置为使用自定义 AvroMapper
。
如果您在 registry 中设置单个 AvroMapper
,则 Camel 将自动查找并使用此 AvroMapper
。
4.5. Spring Boot Auto-Configuration
组件支持 19 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.dataformat.avro-jackson.allow-jms-type | 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定一个 FQN 类名称来用于 unmarshal。 | false | 布尔值 |
camel.dataformat.avro-jackson.allow-unmarshall-type | 如果启用,则允许 Jackson 在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只有在需要使用时才启用。 | false | 布尔值 |
camel.dataformat.avro-jackson.auto-discover-object-mapper | 如果设置为 true,则 Jackson 将把 objectMapper 来查找到 registry 中。 | 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 标头。例如,用于数据格式到 XML 的 application/xml 或用于数据格式的 application/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 multiple features 分开的名称。 | 字符串 | |
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 multiple features 分开的名称。 | 字符串 | |
camel.dataformat.avro-jackson.enabled | 是否启用 avro-jackson 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
camel.dataformat.avro-jackson.include | 如果您想 marshal a pojo to JSON,并且 pojo 具有一些带有 null 值的字段。如果您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | 字符串 | |
camel.dataformat.avro-jackson.json-view | 当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来实现此目的。此选项是引用具有 JsonView 注释的类。 | 字符串 | |
camel.dataformat.avro-jackson.module-class-names | 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为 String with FQN 类名称。可以使用逗号分隔多个类。 | 字符串 | |
camel.dataformat.avro-jackson.module-refs | 使用 Camel registry 中引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | 字符串 | |
camel.dataformat.avro-jackson.object-mapper | 使用 Jackson 时,查找并使用带有给定 id 的现有 ObjectMapper。 | 字符串 | |
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 | 是否从 registry 中查找和使用默认 Jackson ObjectMapper。 | true | 布尔值 |
camel.dataformat.avro-jackson.use-list | To unmarshal 到 Map 列表或 Pojo 的列表。 | false | 布尔值 |
第 5 章 AWS CloudWatch
仅支持生成者
AWS2 Cloudwatch 组件允许消息发送到 Amazon CloudWatch 指标。Amazon API 的实现由 AWS SDK 提供。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并有权使用 Amazon CloudWatch。如需更多信息,请参阅 Amazon CloudWatch。
5.1. 依赖项
当在 Camel Spring Boot 中使用 aws2-cw
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-cw-starter</artifactId> </dependency>
5.2. URI 格式
aws2-cw://namespace[?options]
如果指标不存在,则会创建它们。您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
5.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
5.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
5.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
5.4. 组件选项
AWS CloudWatch 组件支持 18 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonCwClient (生成者) | Autowired 使用 AmazonCloudWatch 作为客户端。 | CloudWatchClient | |
配置 (生成者) | 组件配置。 | Cw2Configuration | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
name (producer) | 指标名称。 | 字符串 | |
overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
proxyHost (producer) | 在实例化 CW 客户端时定义代理主机。 | 字符串 | |
proxyPort (producer) | 在实例化 CW 客户端时定义代理端口。 | 整数 | |
proxyProtocol (producer) | 在实例化 CW 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
region (producer) | CW 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id()。 | 字符串 | |
timestamp (producer) | 指标时间戳。 | instant | |
trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
unit (producer) | 指标单元。 | 字符串 | |
uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (producer) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
value (producer) | 指标值。 | å�Œ | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
5.5. 端点选项
AWS CloudWatch 端点使用 URI 语法进行配置:
aws2-cw:namespace
使用以下路径和查询参数:
5.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
namespace (producer) | 必需的 指标命名空间。 | 字符串 |
5.5.2. 查询参数 (16 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonCwClient (生成者) | Autowired 使用 AmazonCloudWatch 作为客户端。 | CloudWatchClient | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
name (producer) | 指标名称。 | 字符串 | |
overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
proxyHost (producer) | 在实例化 CW 客户端时定义代理主机。 | 字符串 | |
proxyPort (producer) | 在实例化 CW 客户端时定义代理端口。 | 整数 | |
proxyProtocol (producer) | 在实例化 CW 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
region (producer) | CW 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id()。 | 字符串 | |
timestamp (producer) | 指标时间戳。 | instant | |
trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
unit (producer) | 指标单元。 | 字符串 | |
uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (producer) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
value (producer) | 指标值。 | å�Œ | |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
所需的 CW 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonCwClient,才能访问 Amazon 的 CloudWatch。
5.6. 使用方法
5.6.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java 系统属性 - aws.accessKeyId 和 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.2. 由 CW producer 评估的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| Amazon CW 指标名称。 |
|
| Amazon CW 指标值。 |
|
| Amazon CW 指标单元。 |
|
| Amazon CW 指标命名空间。 |
|
| Amazon CW 指标时间戳。 |
|
| Amazon CW 指标维度名称。 |
|
| Amazon CW 指标维度值。 |
|
| 维度名称和维度值的映射. |
5.6.3. 高级 CloudWatchClient 配置
如果您需要对 CloudWatchClient
实例配置进行更多控制,您可以创建自己的实例并从 URI 引用它:
from("direct:start") .to("aws2-cw://namespace?amazonCwClient=#client");
#client
指的是 Registry 中的一个 CloudWatchClient
。
5.7. 例子
5.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");
5.8. Spring Boot Auto-Configuration
组件支持 19 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 Secret 密钥。 | 字符串 | |
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 | 指标值。 | å�Œ |
第 6 章 AWS DynamoDB
仅支持生成者
AWS2 DynamoDB 组件支持从/向服务存储和检索数据。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并签名以使用 Amazon DynamoDB。如需更多信息,请参阅 Amazon DynamoDB。
6.1. 依赖项
当使用 aws2-ddb
红帽构建的 Camel Spring Boot 时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-ddb-starter</artifactId> </dependency>
6.2. URI 格式
aws2-ddb://domainName[?options]
您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
6.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
6.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
6.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
6.4. 组件选项
AWS DynamoDB 组件支持 22 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonDDBClient (producer) | Autowired 使用 AmazonDynamoDB 作为客户端。 | DynamoDbClient | |
配置 (生成者) | 组件配置。 | Ddb2Configuration | |
consistentRead (producer) | 决定在读取数据时是否应强制执行强一致性。 | false | 布尔值 |
enabledInitialDescribeTable (producer) | 设置 DDB 端点中是否必须完成的初始 Describe 表操作,还是不完成。 | true | 布尔值 |
keyAttributeName (producer) | 创建表时的属性名称。 | 字符串 | |
keyAttributeType (producer) | 创建表时的属性类型。 | 字符串 | |
keyScalarType (producer) | key scalar 类型,可以是 S (字符串)、N (数字) 和 B (字节)。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
operation (producer) | 要执行的操作。 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 | |
region (producer) | DDB 客户端需要工作的区域。 | 字符串 | |
trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (producer) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
writeCapacity (producer) | 为向表写入资源而保留置备的吞吐量。 | Long | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
6.5. 端点选项
AWS DynamoDB 端点使用 URI 语法进行配置:
aws2-ddb:tableName
使用以下路径和查询参数:
6.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
tableName (producer) | 需要 当前有效的表的名称。 | 字符串 |
6.5.2. 查询参数 (20 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonDDBClient (producer) | Autowired 使用 AmazonDynamoDB 作为客户端。 | DynamoDbClient | |
consistentRead (producer) | 决定在读取数据时是否应强制执行强一致性。 | false | 布尔值 |
enabledInitialDescribeTable (producer) | 设置 DDB 端点中是否必须完成的初始 Describe 表操作,还是不完成。 | true | 布尔值 |
keyAttributeName (producer) | 创建表时的属性名称。 | 字符串 | |
keyAttributeType (producer) | 创建表时的属性类型。 | 字符串 | |
keyScalarType (producer) | key scalar 类型,可以是 S (字符串)、N (数字) 和 B (字节)。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
operation (producer) | 要执行的操作。 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 | |
region (producer) | DDB 客户端需要工作的区域。 | 字符串 | |
trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (producer) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
writeCapacity (producer) | 为向表写入资源而保留置备的吞吐量。 | Long | |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
所需的 DDB 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonDDBClient,才能访问 Amazon 的 DynamoDB。
6.6. 使用方法
6.6.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java 系统属性 - aws.accessKeyId 和 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.6.2. 由 DDB producer 评估的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 表名称和对应项目的映射,由主密钥获取。 |
|
| 此操作的表名称。 |
|
| 唯一标识表中的每个项目的主要键。 |
|
| 如果您要在修改前或之后获取属性 name-value 对(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW),则使用此参数。 |
|
| 为条件修改指定属性。 |
|
| 如果没有指定属性名称,则返回所有属性。 |
|
| 如果设置为 true,则会发出一致的读取,否则最终会使用一致性。 |
|
| 如果设置将用作查询操作的 Secondary Index。 |
|
| 项目的属性映射,必须包含定义项目的主要键值。 |
|
| 如果设置为 true,Amazon DynamoDB 会返回与查询参数匹配的项目总数,而不是匹配的项目及其属性的列表。 |
|
| 此标头指定查询的选择条件,并合并两个旧的标头 CamelAwsDdbHashKeyValue 和 CamelAwsDdbScanRangeKeyCondition |
|
| 项目的主密钥,以便从中继续之前的查询。 |
|
| 复合主密钥的 hash 组件的值。 |
|
| 要返回的项目的最大数量。 |
|
| 用于查询的属性值和比较运算符的容器。 |
|
| 指定索引的正向和反向遍历。 |
|
| 评估扫描结果,仅返回所需的值。 |
|
| 将属性名称映射到更新的新值和操作。 |
6.6.3. 在 BatchGetItems 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 表名称以及对应的项目属性。 |
|
| 包含表映射及其对应的键,这些键没有使用当前响应进行处理。 |
6.6.4. 在 DeleteItem 操作过程中设置消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
6.6.5. 在 DeleteTable 操作过程中设置消息标头
标头 | 类型 | 描述 |
---|---|---|
| ||
| 此表的 ProvisionedThroughput 属性的值 | |
|
| 此表的创建 DateTime。 |
|
| 此表的项目数。 |
|
| 标识此表的主键的 KeySchema。在 Camel 2.16.0 中,此标头的类型是 List<KeySchemaElement> 而不是 KeySchema |
|
| 表名称。 |
|
| 表大小(以字节为单位)。 |
|
| 表的状态:CREATING, UPDATING, DELETING, ACTIVE |
6.6.6. 在 DescribeTable 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
| \{{ProvisionedThroughputDescription}} | 此表的 ProvisionedThroughput 属性的值 |
|
| 此表的创建 DateTime。 |
|
| 此表的项目数。 |
| \{{KeySchema}} | 标识此表的主键的 KeySchema。 |
|
| 表名称。 |
|
| 表大小(以字节为单位)。 |
|
| 表的状态:CREATING, UPDATING, DELETING, ACTIVE |
|
| 此表的 ReadCapacityUnits 属性。 |
|
| 此表的 WriteCapacityUnits 属性。 |
6.6.7. 在 GetItem 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
6.6.8. 在 PutItem 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
6.6.9. 在 Query 操作过程中设置消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
|
| 查询操作停止的项目的主要键,其中包含上一个结果集。 |
|
| 操作期间消耗的表的置备吞吐量数。 |
|
| 响应中的项目数。 |
6.6.10. 扫描操作期间设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
|
| 查询操作停止的项目的主要键,其中包含上一个结果集。 |
|
| 操作期间消耗的表的置备吞吐量数。 |
|
| 响应中的项目数。 |
|
| 应用任何过滤器前,完成扫描中的项目数。 |
6.6.11. 在 UpdateItem 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
6.6.12. 高级 AmazonDynamoDB 配置
如果您需要对 AmazonDynamoDB
实例配置进行更多控制,您可以创建自己的实例并从 URI 引用它:
from("direct:start") .to("aws2-ddb://domainName?amazonDDBClient=#client");
#client
指的是 Registry 中的 DynamoDbClient
。
6.7. 支持的制作者操作
- BatchGetItems
- DeleteItem
- DeleteTable
- DescribeTable
- GetItem
- PutItem
- 查询
- 扫描
- UpdateItem
- UpdateTable
6.8. 例子
6.8.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>
其中 {camel-version}
必须替换为 Camel 的实际版本。
6.9. Spring Boot Auto-Configuration
组件支持 40 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 (数字) 和 B (字节)。 | 字符串 | |
camel.component.aws2-ddb.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 Secret 密钥。 | 字符串 | |
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 Secret 密钥。 | 字符串 | |
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 | 布尔值 |
第 7 章 AWS Kinesis
支持生成者和消费者
AWS2 Kinesis 组件支持接收来自 Amazon Kinesis (不支持 Batch)服务的信息。
AWS2 Kinesis 组件还支持 Synchronous 和 Asynchronous Client。因此,如果您需要连接(客户端)要异步,请将 'asyncClient' 选项(也可以在 DSL 中找到)为 true
。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并使用 Amazon Kinesis 注册。如需更多信息,请参阅 AWS Kinesis。
7.1. 依赖项
当使用 aws2-kinesis
红帽构建的 Camel Spring Boot 时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-kinesis-starter</artifactId> </dependency>
7.2. URI 格式
aws2-kinesis://stream-name[?options]
需要在使用前创建流。您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
7.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
7.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
7.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
7.4. 组件选项
AWS Kinesis 组件支持 28 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonKinesisClient (common) | Autowired Amazon Kinesis 客户端用于此端点的所有请求。 | KinesisClient | |
cborEnabled (common) | 此选项将在执行期间设置 CBOR_ENABLED 属性。 | true | 布尔值 |
configuration (common) | 组件配置. | Kinesis2Configuration | |
overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
proxyHost (common) | 在实例化 Kinesis 客户端时定义代理主机。 | 字符串 | |
proxyPort (common) | 在实例化 Kinesis 客户端时定义代理端口。 | 整数 | |
proxyProtocol (common) | 在实例化 Kinesis 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
region (common) | 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 (consumer) | 定义在分片关闭时的行为是什么。可能的值有 ignore, silent 和 fail。如果忽略了消息,并且消费者将从开始重新启动,如果为 silent,则消费者将从开始记录。如果开始,消费者将引发故障关闭状态异常。 Enum 值:
| ignore | Kinesis2ShardClosedStrategyEnum |
shardId (consumer) | 定义 Kinesis 流中要从哪些分片 ID 获取记录。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
asyncClient (advanced) | 如果我们希望 KinesisAsyncClient 实例设为 true。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
healthCheckConsumerEnabled (health) | 用于从这个组件启用或禁用所有基于消费者的健康检查。 | true | 布尔值 |
healthCheckProducerEnabled (health) |
用于从此组件启用或禁用所有基于制作者的健康检查。注意: 默认情况下,Camel 已禁用所有基于制作者的健康检查。您可以通过设置 | true | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
profileCredentialsName (security) | 如果使用配置文件凭据提供程序,此参数将设置配置文件名称。 | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 | |
sessionToken (security) | 当用户需要假定 IAM 角色时使用的 Amazon AWS Session Token。 | 字符串 | |
trustAllCertificates (security) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
useDefaultCredentialsProvider (security) | 设置 Kinesis 客户端是否应该希望通过默认凭证提供程序加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
useProfileCredentialsProvider (security) | 设置 Kinesis 客户端是否应该预期通过配置集凭证供应商加载凭证。 | false | 布尔值 |
useSessionCredentials (security) | 设置 Kinesis 客户端是否应该预期使用 Session 凭证。这在用户需要假设 IAM 角色在 Kinesis 中执行操作时非常有用。 | false | 布尔值 |
7.5. 端点选项
AWS Kinesis 端点使用 URI 语法进行配置:
aws2-kinesis:streamName
使用以下路径和查询参数:
7.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
streamName (common) | 流必需的名称。 | 字符串 |
7.5.2. 查询参数(42 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 协议 |
region (common) | 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 (consumer) | 定义在分片关闭时的行为是什么。可能的值有 ignore, silent 和 fail。如果忽略了消息,并且消费者将从开始重新启动,如果为 silent,则消费者将从开始记录。如果开始,消费者将引发故障关闭状态异常。 Enum 值:
| ignore | Kinesis2ShardClosedStrategyEnum |
shardId (consumer) | 定义 Kinesis 流中要从哪些分片 ID 获取记录。 | 字符串 | |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
asyncClient (advanced) | 如果我们希望 KinesisAsyncClient 实例设为 true。 | 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 | |
scheduler (scheduler) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | Map | |
startScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
useFixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
profileCredentialsName (security) | 如果使用配置文件凭据提供程序,此参数将设置配置文件名称。 | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 | |
sessionToken (security) | 当用户需要假定 IAM 角色时使用的 Amazon AWS Session Token。 | 字符串 | |
trustAllCertificates (security) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
useDefaultCredentialsProvider (security) | 设置 Kinesis 客户端是否应该希望通过默认凭证提供程序加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
useProfileCredentialsProvider (security) | 设置 Kinesis 客户端是否应该预期通过配置集凭证供应商加载凭证。 | false | 布尔值 |
useSessionCredentials (security) | 设置 Kinesis 客户端是否应该预期使用 Session 凭证。这在用户需要假设 IAM 角色在 Kinesis 中执行操作时非常有用。 | false | 布尔值 |
所需的 Kinesis 组件选项
您必须在 Registry 中提供 KinesisClient
,并配置了代理和相关凭证。
7.6. Batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
使用者可以从单个特定分片或 Amazon Kinesis 的所有可用分片(多个分片消耗)中使用。因此,如果您在 DSL 配置中将 'shardId' 属性留空,那么它将消耗所有可用的分片,否则只会消耗与 shardId 对应的指定分片。
7.7. 使用方法
7.7.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
以下为 Default Credentials Provider 评估顺序如下:
-
Java system properties -
aws.accessKeyId
andaws.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 实例配置集凭据。
您还可以通过将 useProfileCredentialsProvider 选项指定 useProfileCredentialsProvider
选项到 配置集名称,使用 Profile Credentials
Provider。
可以同时使用静态、默认和配置集凭证之一。
如需更多信息,请参阅 AWS 凭证文档。
7.8. 消息标头
Name | 描述 |
---|---|
CamelAwsKinesisSequenceNumber (common) constant: SEQUENCE_NUMBER | PutRecord 语法 中定义的记录的序列号。 |
CamelAwsKinesisApproximateArrivalTimestamp (common) constant: APPROX_ARRIVAL_TIME | 为记录的 arrival 时间分配的时间 AWS。 |
CamelAwsKinesisPartitionKey (common) 恒定: PARTITION_KEY | 标识数据记录的流中分配给的分片。 |
CamelMessageTimestamp (common) | 消息的时间戳。 |
CamelAwsKinesisShardId (common) 常量: SHARD_ID | 数据记录的分片 ID |
7.8.1. AmazonKinesis 配置
然后,您必须在 amazon
URI 选项中引用 KinesisClientClient。
KinesisClient
from("aws2-kinesis://mykinesisstream?amazonKinesisClient=#kinesisClient") .to("log:out?showAll=true");
7.8.2. 提供 AWS 凭证
建议使用 DefaultAWSCredentialsProviderChain 获取凭证,这是创建新 ClientConfiguration 实例时的默认设置,但在调用 createClient (…)时可以指定不同的 AWSCredentialsProvider。
7.8.3. AWS Kinesis KCL Consumer
组件还支持 KCL (Kinesis Client Library),用于从 Kinesis Data Stream 中使用。要启用此功能,请在端点中设置两个不同的参数:
from("aws2-kinesis://mykinesisstream?asyncClient=true&useDefaultCredentialsProvider=true&useKclConsumers=true") .to("log:out?showAll=true");
此功能通过组合使用 KCL、DynamoDB Table 和 CloudWatch 警报来自动检查点 Shard Iterations。这可以通过使用 AWS 凭证来开箱即用。
带有 KCL 的 AWS Kinesis 使用者需要大约 60-70 秒才能启动。
7.9. Spring Boot Auto-Configuration
组件支持 50 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.aws2-kinesis-firehose.operation | 当用户不希望只发送记录时,要执行的操作。 | KinesisFirehose2Operations | |
camel.component.aws2-kinesis-firehose.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
camel.component.aws2-kinesis-firehose.profile-credentials-name | 如果使用配置文件凭据提供程序,此参数将设置配置文件名称。 | 字符串 | |
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 Secret 密钥。 | 字符串 | |
camel.component.aws2-kinesis-firehose.session-token | 当用户需要假定 IAM 角色时使用的 Amazon AWS Session Token。 | 字符串 | |
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-firehose.use-profile-credentials-provider | 设置 Kinesis Firehose 客户端是否应该预期通过配置集凭证提供程序加载凭据。 | false | 布尔值 |
camel.component.aws2-kinesis-firehose.use-session-credentials | 设置 Kinesis Firehose 客户端是否应该预期使用会话凭证。这在用户需要假设 IAM 角色在 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.async-client | 如果我们希望 KinesisAsyncClient 实例设为 true。 | false | 布尔值 |
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.health-check-consumer-enabled | 用于从这个组件启用或禁用所有基于消费者的健康检查。 | true | 布尔值 |
camel.component.aws2-kinesis.health-check-producer-enabled |
用于从此组件启用或禁用所有基于制作者的健康检查。注意:默认情况下,Camel 禁用了所有基于健康检查的制作者。您可以通过设置 | true | 布尔值 |
camel.component.aws2-kinesis.iterator-type | 定义在 Kinesis 流中开始获取记录的位置。 | ShardIteratorType | |
camel.component.aws2-kinesis.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.aws2-kinesis.max-results-per-request | 每次轮询中将获取的最大记录数。 | 1 | 整数 |
camel.component.aws2-kinesis.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
camel.component.aws2-kinesis.profile-credentials-name | 如果使用配置文件凭据提供程序,此参数将设置配置文件名称。 | 字符串 | |
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 Secret 密钥。 | 字符串 | |
camel.component.aws2-kinesis.sequence-number | 开始轮询的序列号。如果 iteratorType 设置为 AFTER_SEQUENCE_NUMBER 或 AT_SEQUENCE_NUMBER,则需要此项。 | 字符串 | |
camel.component.aws2-kinesis.session-token | 当用户需要假定 IAM 角色时使用的 Amazon AWS Session Token。 | 字符串 | |
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 | 布尔值 |
camel.component.aws2-kinesis.use-profile-credentials-provider | 设置 Kinesis 客户端是否应该预期通过配置集凭证供应商加载凭证。 | false | 布尔值 |
camel.component.aws2-kinesis.use-session-credentials | 设置 Kinesis 客户端是否应该预期使用 Session 凭证。这在用户需要假设 IAM 角色在 Kinesis 中执行操作时非常有用。 | false | 布尔值 |
第 8 章 AWS 2 Lambda
仅支持生成者
AWS2 Lambda 组件支持 create, get, list, delete 和 invoke AWS Lambda 函数。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并使用 Amazon Lambda 注册。如需更多信息,请参阅 AWS Lambda。
在创建 Lambda 功能时,您需要指定一个 IAM 角色,该角色至少附加了 AWSLambdaBasicExecuteRole 策略。
8.1. 依赖项
当在 Camel Spring Boot 中使用 aws2-lambda
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-lambda-starter</artifactId> </dependency>
8.2. URI 格式
aws2-lambda://functionName[?options]
您可以将查询选项附加到 URI 中,格式为 options=value&option2=value&…
8.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
8.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
8.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
8.4. 组件选项
AWS Lambda 组件支持 16 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
配置 (生成者) | 组件配置. | Lambda2Configuration | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
operation (producer) | 要执行的操作。它可以是 listFunctions、getFunction、createFunction、deleteFunction 或 invokeFunction。 Enum 值:
| invokeFunction | Lambda2Operations |
overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
pojoRequest (producer) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
region (producer) | Lambda 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id()。 | 字符串 | |
trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (producer) | 设置 Lambda 客户端是否应该预期通过默认凭据提供商加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
awsLambdaClient (advanced) | Autowired 使用现有配置的 AwsLambdaClient 作为客户端。 | LambdaClient | |
proxyHost (proxy) | 在实例化 Lambda 客户端时定义代理主机。 | 字符串 | |
proxyPort (proxy) | 在实例化 Lambda 客户端时定义代理端口。 | 整数 | |
proxyProtocol (proxy) | 在实例化 Lambda 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
8.5. 端点选项
AWS Lambda 端点使用 URI 语法进行配置:
aws2-lambda:function
使用以下路径和查询参数:
8.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
function (producer) | Lambda 函数必需的名称。 | 字符串 |
8.5.2. 查询参数 (14 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
operation (producer) | 要执行的操作。它可以是 listFunctions、getFunction、createFunction、deleteFunction 或 invokeFunction。 Enum 值:
| invokeFunction | Lambda2Operations |
overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
pojoRequest (producer) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
region (producer) | Lambda 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id()。 | 字符串 | |
trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (producer) | 设置 Lambda 客户端是否应该预期通过默认凭据提供商加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
awsLambdaClient (advanced) | Autowired 使用现有配置的 AwsLambdaClient 作为客户端。 | LambdaClient | |
proxyHost (proxy) | 在实例化 Lambda 客户端时定义代理主机。 | 字符串 | |
proxyPort (proxy) | 在实例化 Lambda 客户端时定义代理端口。 | 整数 | |
proxyProtocol (proxy) | 在实例化 Lambda 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
所需的 Lambda 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 awsLambdaClient,以访问 Amazon Lambda 服务。
8.6. 使用方法
8.6.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java 系统属性 - aws.accessKeyId 和 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 凭证文档
8.6.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 |
|
| 在别名中设置的功能版本 | 否 |
8.7. 可运行的操作列表
- listFunctions
- getFunction
- createFunction
- deleteFunction
- invokeFunction
- updateFunction
- createEventSourceMapping
- deleteEventSourceMapping
- listEventSourceMapping
- listTags
- tagResource
- untagResource
- publishVersion
- listVersions
- createAlias
- deleteAlias
- getAlias
- listAliases
8.8. 例子
8.8.1. 生成者示例
要完全了解组件的工作方式,您可以参阅这些 集成测试。
8.8.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); } });
8.9. 使用 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")
这样,您将直接传递请求,而无需专门传递与此操作相关的标头和选项。
8.10. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-lambda</artifactId> <version>${camel-version}</version> </dependency>
其中 {camel-version}
必须替换为 Camel 的实际版本。
8.11. Spring Boot Auto-Configuration
组件支持 17 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 Secret 密钥。 | 字符串 | |
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 | 布尔值 |
第 9 章 AWS S3 Storage Service
支持生成者和消费者
AWS2 S3 组件支持从/到 Amazon 的 S3 服务存储和检索对象。
先决条件
您必须拥有有效的 Amazon Web Services 开发人员帐户,并有权限使用 Amazon S3。如需更多信息,请访问 link:https://aws.amazon.com/s3 [Amazon S3]。
9.1. 依赖项
当在 Camel Spring Boot 中使用 aws2-s3
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-s3-starter</artifactId> </dependency>
9.2. URI 格式
aws2-s3://bucketNameOrArn[?options]
如果存储桶不存在,则会创建存储桶。您可以以以下格式将查询选项附加到 URI 中,
options=value&option2=value&…
9.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
9.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
9.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
9.4. 组件选项
AWS S3 Storage Service 组件支持 50 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonS3Client (common) | 对 registry 中的 com.amazonaws.services.s3.AmazonS3 的 Autowired Reference。 | S3Client | |
amazonS3Presigner (common) | Autowired 一个用于请求的 S3 Presigner,主要在 createDownloadLink 操作中使用。 | S3Presigner | |
autoCreateBucket (common) | 设置 S3 存储桶自动创建的 bucketName。如果启用了 moveAfterRead 选项,则也会应用它,如果尚未存在 moveAfterRead 选项,它将创建 destinationBucket。 | false | 布尔值 |
configuration (common) | 组件配置。 | AWS2S3Configuration | |
overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
pojoRequest (common) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
policy (common) | 此队列的策略在 com.amazonaws.services.s3.AmazonS3#setBucketPolicy() 方法中设置。 | 字符串 | |
proxyHost (common) | 在实例化 SQS 客户端时定义代理主机。 | 字符串 | |
proxyPort (common) | 指定要在客户端定义中使用的代理端口。 | 整数 | |
proxyProtocol (common) | 在实例化 S3 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
region (common) | S3 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id()。 | 字符串 | |
trustAllCertificates (common) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
uriEndpointOverride (common) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (common) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
customerAlgorithm (common (advanced)) | 定义在启用了 CustomerKey 时要使用的客户算法。 | 字符串 | |
customerKeyId (common (advanced)) | 定义在启用 CustomerKey 时要使用的 Customer key 的 id。 | 字符串 | |
customerKeyMD5 (common (advanced)) | 定义在启用 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 | 布尔值 |
delimiter (consumer) | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的分隔符仅消耗我们感兴趣的对象。 | 字符串 | |
destinationBucket (consumer) | 定义当 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 | 布尔值 |
includeFolders (consumer) | 如果为 true,将消费的文件夹/目录。如果是 false,则忽略它们,且不会为那些交换创建。 | true | 布尔值 |
moveAfterRead (consumer) | 在检索后,将对象从 S3 存储桶移到不同的存储桶。要完成操作,必须设置 destinationBucket 选项。仅当 Exchange 提交时,才会执行复制存储桶操作。如果进行回滚,则对象不会被移动。 | false | 布尔值 |
prefix (consumer) | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的前缀,仅用于消费我们感兴趣的对象。 | 字符串 | |
autocloseBody (consumer (advanced)) | 如果此选项为 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) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
multiPartUpload (producer) | 如果为 true,则 camel 将上传带有多部分格式的文件,由 partSize 选项决定部分大小。 | false | 布尔值 |
namingStrategy (producer) | 在流上传模式中使用的命名策略。 Enum 值:
| progressive | AWSS3NamingStrategyEnum |
operation (producer) | 当用户不希望只进行上传时,要执行的操作。 Enum 值:
| AWS2S3Operations | |
partSize (producer) | 设置多部分上传中使用的 partSize,默认大小为 25M。 | 26214400 | long |
restartingPolicy (producer) | 在流上传模式中使用的重启策略。 Enum 值:
| override | 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 (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
9.5. 端点选项
AWS S3 Storage Service 端点使用 URI 语法进行配置:
aws2-s3://bucketNameOrArn
使用以下路径和查询参数:
9.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bucketNameOrArn (common) | 所需的 Bucket 名称或 ARN。 | 字符串 |
9.5.2. 查询参数 (68 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonS3Client (common) | 对 registry 中的 com.amazonaws.services.s3.AmazonS3 的 Autowired Reference。 | S3Client | |
amazonS3Presigner (common) | Autowired 一个用于请求的 S3 Presigner,主要在 createDownloadLink 操作中使用。 | S3Presigner | |
autoCreateBucket (common) | 设置 S3 存储桶自动创建的 bucketName。如果启用了 moveAfterRead 选项,则也会应用它,如果尚未存在 moveAfterRead 选项,它将创建 destinationBucket。 | false | 布尔值 |
overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
pojoRequest (common) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
policy (common) | 此队列的策略在 com.amazonaws.services.s3.AmazonS3#setBucketPolicy() 方法中设置。 | 字符串 | |
proxyHost (common) | 在实例化 SQS 客户端时定义代理主机。 | 字符串 | |
proxyPort (common) | 指定要在客户端定义中使用的代理端口。 | 整数 | |
proxyProtocol (common) | 在实例化 S3 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
region (common) | S3 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id()。 | 字符串 | |
trustAllCertificates (common) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
uriEndpointOverride (common) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (common) | 设置 S3 客户端是否应该希望通过默认凭据提供程序加载凭据,或者希望传递静态凭据。 | false | 布尔值 |
customerAlgorithm (common (advanced)) | 定义在启用了 CustomerKey 时要使用的客户算法。 | 字符串 | |
customerKeyId (common (advanced)) | 定义在启用 CustomerKey 时要使用的 Customer key 的 id。 | 字符串 | |
customerKeyMD5 (common (advanced)) | 定义在启用 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 | 布尔值 |
delimiter (consumer) | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的分隔符仅消耗我们感兴趣的对象。 | 字符串 | |
destinationBucket (consumer) | 定义当 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 | 布尔值 |
includeFolders (consumer) | 如果为 true,将消费的文件夹/目录。如果是 false,则忽略它们,且不会为那些交换创建。 | true | 布尔值 |
maxConnections (consumer) | 在 S3 客户端配置中设置 maxConnections 参数。 | 60 | int |
maxMessagesPerPoll (consumer) | 获取最大消息数,作为每次轮询轮询的限制。获取最大消息数,作为每次轮询轮询的限制。默认值为 10。使用 0 或负数设置为无限。 | 10 | int |
moveAfterRead (consumer) | 在检索后,将对象从 S3 存储桶移到不同的存储桶。要完成操作,必须设置 destinationBucket 选项。仅当 Exchange 提交时,才会执行复制存储桶操作。如果进行回滚,则对象不会被移动。 | false | 布尔值 |
prefix (consumer) | com.amazonaws.services.s3.model.ListObjectsRequest 中使用的前缀,仅用于消费我们感兴趣的对象。 | 字符串 | |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
autocloseBody (consumer (advanced)) | 如果此选项为 true,且 includeBody 为 false,则在交换完成时调用 S3Object.close() 方法。此选项与 includeBody 选项密切相关。如果将 includeBody 设为 false,autocloseBody 设为 false,它将是关闭 S3Object 流的调用者。将 autocloseBody 设置为 true,将自动关闭 S3Object 流。 | true | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
batchMessageNumber (producer) | 在流传输上传模式中制作批处理的消息数量。 | 10 | int |
batchSize (producer) | 流上传模式的批处理大小(以字节为单位)。 | 1000000 | int |
deleteAfterWrite (producer) | 在 S3 文件上传后删除文件对象。 | false | 布尔值 |
KeyName (producer) | 通过端点参数在存储桶中设置元素的密钥名称。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
multiPartUpload (producer) | 如果为 true,则 camel 将上传带有多部分格式的文件,由 partSize 选项决定部分大小。 | false | 布尔值 |
namingStrategy (producer) | 在流上传模式中使用的命名策略。 Enum 值:
| progressive | AWSS3NamingStrategyEnum |
operation (producer) | 当用户不希望只进行上传时,要执行的操作。 Enum 值:
| AWS2S3Operations | |
partSize (producer) | 设置多部分上传中使用的 partSize,默认大小为 25M。 | 26214400 | long |
restartingPolicy (producer) | 在流上传模式中使用的重启策略。 Enum 值:
| override | 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 | |
scheduler (scheduler) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | Map | |
startScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
useFixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
所需的 S3 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonS3Client,才能访问 Amazon 的 S3。
9.6. Batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
9.7. 使用方法
例如,要从存储桶 helloBucket
读取文件 hello.txt
,请使用以下片断:
from("aws2-s3://helloBucket?accessKey=yourAccessKey&secretKey=yourSecretKey&prefix=hello.txt") .to("file:/var/downloaded");
9.7.1. S3 producer 评估的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 此对象的 bucket 名称将存储或用于当前操作 |
|
| 用于当前操作的存储桶目标名称 |
|
| 此对象的内容长度。 |
|
| 此对象的内容类型。 |
|
| 此对象的内容控制。 |
|
| 此对象的内容分布。 |
|
| 此对象的内容编码。 |
|
| 此对象的 md5 checksum。 |
|
| 用于当前操作的 Destination 键 |
|
| 此对象将存储或用于当前操作的密钥 |
|
| 此对象的最后修改的时间戳。 |
|
| 要执行的操作。允许的值有 copyObject, deleteObject, listBuckets, deleteBucket, listObjects |
|
| 此对象的存储类。 |
|
|
将应用于对象的 canned acl。请参阅 |
|
|
一个精心构建的 Amazon S3 Access Control List 对象。请参阅 |
| 字符串 | 在使用 AWS 管理的密钥加密对象时设置服务器端加密算法。例如,使用 AES256。 |
|
| 要存储或从当前操作返回的对象的版本 Id |
|
| 要与 S3 中对象存储的元数据映射。有关元数据的更多详细信息。 |
9.7.2. S3 producer 设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 新上传对象的 ETag 值。 |
|
| 新上传对象的可选版本 ID。 |
9.7.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 编码的 128 位 MD5 摘要。此数据用作消息完整性检查,以验证 Amazon S3 收到的数据是否与调用者发送的数据相同。 |
|
| Content-Length HTTP 标头表示关联对象的大小(以字节为单位)。 |
|
| 可选的 Content-Encoding HTTP 标头指定将什么内容编码应用到对象,必须应用哪些解码机制来获取 Content-Type 字段引用的 media-type。 |
|
| 可选的 Content-Disposition HTTP 标头,它指定要保存的对象的建议文件名等。 |
|
| 可选的 Cache-Control HTTP 标头,允许用户在 HTTP 请求/恢复链中指定缓存行为。 |
| 字符串 | 使用 AWS 管理的密钥加密对象时的服务器端加密算法。 |
|
| 与 S3 中对象存储的元数据映射。有关元数据的更多详细信息。 |
9.7.4. S3 Producer 操作
Camel-AWS2-S3 组件在生成者端提供以下操作:
- copyObject
- deleteObject
- listBuckets
- deleteBucket
- listObjects
- GetObject (这将返回 S3Object 实例)
- getObjectRange (这将返回 S3Object 实例)
- createDownloadLink
如果您没有显式指定生成者将执行的操作: - 单个文件上传 - 如果启用了 multiPartUpload 选项,则多部分上传。
9.7.5. 高级 AmazonS3 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 S3Client
实例配置拥有更多控制,您可以创建自己的实例,并在 Camel aws2-s3 组件配置中引用它:
from("aws2-s3://MyBucket?amazonS3Client=#client&delay=5000&maxMessagesPerPoll=5") .to("mock:result");
9.7.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。当您要求下载该文件时,将在下载前直接进行解密。
9.7.7. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java 系统属性 - aws.accessKeyId 和 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 凭证文档
9.7.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
9.8. 流上传模式
启用流模式后,用户可以通过多部分上传将数据上传到 S3,而无需提前了解数据维度的时间。上传将在完成后完成: batchSize 已完成,或者达到 batchMessageNumber。有两个可能的命名策略:
progressive
使用 progressive 策略,每个文件的名称都由 keyName 选项和一个 progressive 计数器组成,最终文件扩展名(若有)
random。
使用随机策略时,将在 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 秒后完成。
9.9. bucket 自动创建
使用选项 autoCreateBucket
用户可以在 S3 Bucket 不存在时避免自动创建。此选项的默认值是 true
。如果设置为 false 对 AWS 中不存在的存储桶的操作,则不会成功,并返回错误。
9.10. 在存储桶和其他存储桶间移动操作
有些用户(如从存储桶中消耗大量),并在不同的中移动内容,而无需使用这个组件的 copyObject 功能。如果是这样,请不要忘记从消费者的传入交换中删除 bucketName 标头,否则该文件将始终覆盖同一原始存储桶。
9.11. 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 的文件。
9.12. 使用客户密钥加密
我们还引入了客户密钥支持(使用 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);
9.13. 使用 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")
这样,您将直接传递请求,而无需专门传递与此操作相关的标头和选项。
9.14. 创建 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 路由中实施的所有操作。
9.15. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml
中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-s3</artifactId> <version>${camel-version}</version> </dependency>
其中 {camel-version}
必须替换为 Camel 的实际版本。
9.16. Spring Boot Auto-Configuration
组件支持 51 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 存储桶自动创建的 bucketName。如果启用了 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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 Secret 密钥。 | 字符串 | |
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 | 布尔值 |
第 10 章 AWS Simple Notification System (SNS)
仅支持生成者
AWS2 SNS 组件允许消息发送到 Amazon Simple Notification 主题。Amazon API 的实现由 AWS SDK 提供。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并签名以使用 Amazon SNS。如需更多信息,请参阅 Amazon SNS。
10.1. 依赖项
当在 Camel Spring Boot 中使用 aws2-sns
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-sns-starter</artifactId> </dependency>
10.2. URI 格式
aws2-sns://topicNameOrArn[?options]
如果主题不存在,则会创建它们。您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
10.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
10.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
10.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
10.4. 组件选项
AWS Simple Notification System (SNS) 组件支持 24 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonSNSClient (producer) | Autowired 使用 AmazonSNS 作为客户端。 | SnsClient | |
autoCreateTopic (producer) | 设置主题的自动创建。 | false | 布尔值 |
配置 (生成者) | 组件配置. | Sns2Configuration | |
kmsMasterKeyId (producer) | 用于 Amazon SNS 或自定义 CMK 的 AWS 管理的客户主密钥 (CMK) 的 ID。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
messageDeduplicationIdStrategy (producer) | 仅适用于 FIFO 主题。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:useExchangeId, useContentBasedDeduplication.对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 Enum 值:
| useExchangeId | 字符串 |
messageGroupIdStrategy (producer) | 仅适用于 FIFO 主题。在消息上设置 messageGroupId 的策略。可以是以下选项之一:useConstant, useExchangeId, usePropertyValue.对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 Enum 值:
| 字符串 | |
messageStructure (producer) | 使用 json 的消息结构。 | 字符串 | |
overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
policy (producer) | 本主题的策略。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
proxyHost (producer) | 在实例化 SNS 客户端时定义代理主机。 | 字符串 | |
proxyPort (producer) | 在实例化 SNS 客户端时定义代理端口。 | 整数 | |
proxyProtocol (producer) | 在实例化 SNS 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
queueUrl (producer) | 要订阅的 queueUrl。 | 字符串 | |
region (producer) | SNS 客户端需要在其中工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id()。 | 字符串 | |
serverSideEncryptionEnabled (producer) | 定义是否在主题中启用 Server Side Encryption。 | false | 布尔值 |
subject (producer) | 如果邮件标头 'CamelAwsSnsSubject' 不存在,则使用主题。 | 字符串 | |
subscribeSNStoSQS (producer) | 定义 SNS 主题和 SQS 之间的订阅是否必须完成。 | false | 布尔值 |
trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (producer) | 设置 SNS 客户端是否应该预期在 AWS infra 实例上加载凭证,或希望传递静态凭证。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
10.5. 端点选项
AWS Simple Notification System (SNS) 端点使用 URI 语法进行配置:
aws2-sns:topicNameOrArn
使用以下路径和查询参数:
10.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
topicNameOrArn (producer) | 所需的 主题名称或 ARN。 | 字符串 |
10.5.2. 查询参数(23 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonSNSClient (producer) | Autowired 使用 AmazonSNS 作为客户端。 | SnsClient | |
autoCreateTopic (producer) | 设置主题的自动创建。 | false | 布尔值 |
headerFilterStrategy (producer) | 使用自定义 HeaderFilterStrategy 将标头映射到/来自 Camel。 | HeaderFilterStrategy | |
kmsMasterKeyId (producer) | 用于 Amazon SNS 或自定义 CMK 的 AWS 管理的客户主密钥 (CMK) 的 ID。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
messageDeduplicationIdStrategy (producer) | 仅适用于 FIFO 主题。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:useExchangeId, useContentBasedDeduplication.对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 Enum 值:
| useExchangeId | 字符串 |
messageGroupIdStrategy (producer) | 仅适用于 FIFO 主题。在消息上设置 messageGroupId 的策略。可以是以下选项之一:useConstant, useExchangeId, usePropertyValue.对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 Enum 值:
| 字符串 | |
messageStructure (producer) | 使用 json 的消息结构。 | 字符串 | |
overrideEndpoint (producer) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
policy (producer) | 本主题的策略。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
proxyHost (producer) | 在实例化 SNS 客户端时定义代理主机。 | 字符串 | |
proxyPort (producer) | 在实例化 SNS 客户端时定义代理端口。 | 整数 | |
proxyProtocol (producer) | 在实例化 SNS 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
queueUrl (producer) | 要订阅的 queueUrl。 | 字符串 | |
region (producer) | SNS 客户端需要在其中工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id()。 | 字符串 | |
serverSideEncryptionEnabled (producer) | 定义是否在主题中启用 Server Side Encryption。 | false | 布尔值 |
subject (producer) | 如果邮件标头 'CamelAwsSnsSubject' 不存在,则使用主题。 | 字符串 | |
subscribeSNStoSQS (producer) | 定义 SNS 主题和 SQS 之间的订阅是否必须完成。 | false | 布尔值 |
trustAllCertificates (producer) | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
uriEndpointOverride (producer) | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
useDefaultCredentialsProvider (producer) | 设置 SNS 客户端是否应该预期在 AWS infra 实例上加载凭证,或希望传递静态凭证。 | false | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
所需的 SNS 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSNSClient,才能访问 Amazon 的 SNS。
10.6. 使用方法
10.6.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider 选项并将其设置为 true 来避免使用显式静态凭证。
- Java 系统属性 - aws.accessKeyId 和 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 凭证文档。
10.6.2. 由 SNS producer 评估的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
|
Amazon SNS 消息主题。如果没有设置,则使用 |
10.6.3. SNS producer 设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| Amazon SNS 消息 ID。 |
10.6.4. 高级 AmazonSNS 配置
如果需要对 SnsClient
实例配置进行更多控制,您可以创建自己的实例,并从 URI 引用它:
from("direct:start") .to("aws2-sns://MyTopic?amazonSNSClient=#client");
#client
指的是 Registry 中的 AmazonSNS
。
10.6.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(...);
10.7. Topic Autocreation
通过选项 autoCreateTopic
用户,如果 SNS Topic 不存在,可以避免自动创建它。此选项的默认值是 true
。如果设置为 false 任何对 AWS 中不存在的主题的操作,则不会成功,并返回错误。
10.8. 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" } } } ] }
这是使订阅正常工作的关键步骤。
10.8.1. SNS Fifo Topic 消息组 Id Strategy 和消息 Deduplication Id Strategy
向 FIFO 主题发送一些时,您需要始终设置消息组 Id 策略。
如果 SNS Fifo 主题上启用了基于内容的消息 deduplication,则不需要设置消息 deduplication id 策略,否则您必须对其进行设置。
10.9. 例子
10.9.1. 生成者示例
发送到主题
from("direct:start") .to("aws2-sns://camel-topic?subject=The+subject+message&autoCreateTopic=true");
10.10. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-sns</artifactId> <version>${camel-version}</version> </dependency>
其中 {camel-version}
必须替换为 Camel 的实际版本。
10.11. Spring Boot Auto-Configuration
组件支持 25 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.aws2-sns.message-deduplication-id-strategy | 仅适用于 FIFO 主题。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:useExchangeId, useContentBasedDeduplication.对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 | useExchangeId | 字符串 |
camel.component.aws2-sns.message-group-id-strategy | 仅适用于 FIFO 主题。在消息上设置 messageGroupId 的策略。可以是以下选项之一:useConstant, 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 Secret 密钥。 | 字符串 | |
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 | 布尔值 |
第 11 章 AWS Simple Queue Service (SQS)
支持生成者和消费者
AWS2 SQS 组件支持向 Amazon 的 SQS 服务发送和接收信息。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并签名以使用 Amazon SQS。如需更多信息,请参阅 Amazon SQS。
11.1. 依赖项
当在 Camel Spring Boot 中使用 aws2-sqs 时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-sqs-starter</artifactId> </dependency>
11.2. URI 格式
aws2-sqs://queueNameOrArn[?options]
如果队列不存在,将创建队列。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
11.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
11.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
11.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
11.4. 组件选项
AWS Simple Queue Service (SQS) 组件支持 43 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonAWSHost (common) | Amazon AWS 云的主机名。 | amazonaws.com | 字符串 |
amazonSQSClient (common) | Autowired 以将 AmazonSQS 用作客户端。 | SqsClient | |
autoCreateQueue (common) | 设置队列的自动创建. | false | 布尔值 |
configuration (common) | AWS SQS 默认配置。 | Sqs2Configuration | |
overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
protocol (common) | 用于与 SQS 通信的底层协议。 | https | 字符串 |
proxyProtocol (common) | 在实例化 SQS 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
queueOwnerAWSAccountId (common) | 当您需要将队列与不同的帐户所有者连接时,指定队列所有者 aws 帐户 ID。 | 字符串 | |
region (common) | 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 | 布尔值 |
extendMessageVisibility (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) | 定义是否在队列中启用服务器端加密。 | false | 布尔值 |
visibilityTimeout (consumer) | 在由 ReceiveMessage 请求检索后,收到的消息会被隐藏在 com.amazonaws.services.sqs.model.SetQueueAttributesRequest 中检索的持续时间(以秒为单位)。这只有在与 defaultVisibilityTimeout 不同时才有意义。它永久更改队列可见性超时属性。 | 整数 | |
waitTimeSeconds (consumer) | ReceiveMessage 操作调用的持续时间(0 到 20)将等待直到队列中消息包含在响应中。 | 整数 | |
batchSeparator (producer) | 在传递 String 以发送批处理消息操作时,设置分隔符。 | , | 字符串 |
delaySeconds (producer) | 延迟发送消息的秒数。 | 整数 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
messageDeduplicationIdStrategy (producer) | 仅适用于 FIFO 队列。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:useExchangeId, useContentBasedDeduplication.对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 Enum 值:
| useExchangeId | 字符串 |
messageGroupIdStrategy (producer) | 仅适用于 FIFO 队列。在消息上设置 messageGroupId 的策略。可以是以下选项之一:useConstant, useExchangeId, usePropertyValue.对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 Enum 值:
| 字符串 | |
operation (producer) | 当用户不想发送消息时,要执行的操作。 Enum 值:
| Sqs2Operations | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
delayQueue (advanced) | 定义您是否要将 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 (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
11.5. 端点选项
AWS Simple Queue Service (SQS)端点使用 URI 语法进行配置:
aws2-sqs:queueNameOrArn
使用以下路径和查询参数:
11.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
queueNameOrArn (common) | 所需的 队列名称或 ARN。 | 字符串 |
11.5.2. 查询参数(61 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amazonAWSHost (common) | Amazon AWS 云的主机名。 | amazonaws.com | 字符串 |
amazonSQSClient (common) | Autowired 以将 AmazonSQS 用作客户端。 | SqsClient | |
autoCreateQueue (common) | 设置队列的自动创建. | false | 布尔值 |
headerFilterStrategy (common) | 使用自定义 HeaderFilterStrategy 将标头映射到/来自 Camel。 | HeaderFilterStrategy | |
overrideEndpoint (common) | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
protocol (common) | 用于与 SQS 通信的底层协议。 | https | 字符串 |
proxyProtocol (common) | 在实例化 SQS 客户端时定义代理协议。 Enum 值:
| HTTPS | 协议 |
queueOwnerAWSAccountId (common) | 当您需要将队列与不同的帐户所有者连接时,指定队列所有者 aws 帐户 ID。 | 字符串 | |
region (common) | 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 | 布尔值 |
extendMessageVisibility (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 (consumer) | 获取最大消息数,作为每次轮询轮询的限制。默认为没有限制,但使用 0 或负数将其禁用为无限。 | int | |
messageAttributeNames (consumer) | 在消费时要接收的消息属性名称列表。可以使用逗号分隔多个名称。 | 字符串 | |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
serverSideEncryptionEnabled (consumer) | 定义是否在队列中启用服务器端加密。 | false | 布尔值 |
visibilityTimeout (consumer) | 在由 ReceiveMessage 请求检索后,收到的消息会被隐藏在 com.amazonaws.services.sqs.model.SetQueueAttributesRequest 中检索的持续时间(以秒为单位)。这只有在与 defaultVisibilityTimeout 不同时才有意义。它永久更改队列可见性超时属性。 | 整数 | |
waitTimeSeconds (consumer) | ReceiveMessage 操作调用的持续时间(0 到 20)将等待直到队列中消息包含在响应中。 | 整数 | |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
batchSeparator (producer) | 在传递 String 以发送批处理消息操作时,设置分隔符。 | , | 字符串 |
delaySeconds (producer) | 延迟发送消息的秒数。 | 整数 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
messageDeduplicationIdStrategy (producer) | 仅适用于 FIFO 队列。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一:useExchangeId, useContentBasedDeduplication.对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 Enum 值:
| useExchangeId | 字符串 |
messageGroupIdStrategy (producer) | 仅适用于 FIFO 队列。在消息上设置 messageGroupId 的策略。可以是以下选项之一:useConstant, useExchangeId, usePropertyValue.对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId 的值。 Enum 值:
| 字符串 | |
operation (producer) | 当用户不想发送消息时,要执行的操作。 Enum 值:
| Sqs2Operations | |
delayQueue (advanced) | 定义您是否要将 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 | |
scheduler (scheduler) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | Map | |
startScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
useFixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
所需的 SQS 组件选项
您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSQSClient,才能访问 Amazon 的 SQS。
11.6. Batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
11.7. 使用方法
11.7.1. 静态凭证和默认凭证提供程序
您可以通过指定 useDefaultCredentialsProvider
选项并将其设置为 true 来避免使用显式静态凭证。
-
Java system properties -
aws.accessKeyId
andaws.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 凭证文档
11.7.2. SQS producer 设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| Amazon SQS 消息的 MD5 校验和。 |
|
| Amazon SQS 消息 ID。 |
|
| Amazon SQS 消息可看到的延迟秒数。 |
11.7.3. SQS 使用者设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| Amazon SQS 消息的 MD5 校验和。 |
|
| Amazon SQS 消息 ID。 |
|
| Amazon SQS 消息接收处理。 |
|
| Amazon SQS 消息属性。 |
11.7.4. 高级 AmazonSQS 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 SqsClient
实例配置有更多控制,您可以创建自己的实例:
from("aws2-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5") .to("mock:result");
11.7.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 配置。
11.7.6. DelayQueue VS Delay 用于单一消息
当选项 delayQueue
设为 true 时,SQS Queue 将是一个 DelayQueue
,且 DelaySeconds
选项为 delay。有关 DelayQueue
的更多信息,您可以阅读 AWS SQS 文档。要考虑的一个重要信息是:
- 对于标准队列,每个队列延迟设置不会重新交换设置,不会影响队列中已存在的消息延迟。
- 对于 FIFO 队列,每个队列延迟设置重新交换设置会影响队列中已存在的消息的延迟。
如官方文档中所述。如果要在单个消息上指定延迟,您可以忽略 delayQueue
选项,而如果需要向所有消息添加固定延迟,则可以将此选项设置为 true。
11.7.7. 服务器端加密
队列有一组服务器端加密属性。相关选项包括 serverSideEncryptionEnabled
,keyMasterKeyId
和 kmsDataKeyReusePeriod
。SSE 默认被禁用。您需要明确将选项设置为 true,并将相关的参数设置为 queue 属性。
11.8. jms-style 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");
在上面的代码中,如果交换没有适当的标头,则不会通过过滤器 AND 将其从 SQS 队列中删除。在 5000 毫秒后,该消息对其他消费者可见。
请注意,我们必须将属性 Sqs2Constants.SQS_DELETE_FILTERED
设置为 true
,以指示 Camel 发送 DeleteMessage
(如果被过滤)。
11.9. 可用的 Producer 操作
- 单个消息(默认)
- sendBatchMessage
- deleteMessage
- listQueues
11.10. 发送消息
您可以设置 SendMessageBatchRequest
或可 Iterable
from("direct:start") .setBody(constant("Camel rocks!")) .to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");
11.11. 发送批处理消息
您可以设置 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。
11.12. 删除单个消息
使用 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
实例的交换,您可以使用它来检查消息是否被删除。
11.13. 列出队列
使用 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
实例的交换,您可以测试以检查实际队列。
11.14. 清除队列
使用 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
实例的交换。
11.15. 队列自动创建
使用选项 autoCreateQueue
用户可以在 SQS Queue 不存在时避免自动创建。此选项的默认值是 true
。如果设置为 false 任何对 AWS 中不存在的队列的操作,则不会成功,并返回错误。
11.16. 发送批处理消息和消息重复数据删除策略
如果您使用 SendBatchMessage
操作,您可以设置两种不同类型的消息重复数据删除策略: - useExchangeId - useContentBasedDeduplication
第一个将使用 ExchangeIdMessageDeduplicationIdStrategy
,它将使用 Exchange ID 作为参数。另一个使用 NullMessageDeduplicationIdStrategy
,它将使用正文作为 deduplication 元素。
如果发送批处理消息操作,您需要使用 useContentBasedDeduplication
和 Queue,在 Queue 中,您需要 启用基于内容的 deduplication
选项。
11.17. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-sqs</artifactId> <version>${camel-version}</version> </dependency>
其中 {camel-version}
必须替换为 Camel 的实际版本。
11.18. Spring Boot Auto-Configuration
组件支持 44 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 的策略。可以是以下选项之一:useExchangeId, useContentBasedDeduplication.对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。 | useExchangeId | 字符串 |
camel.component.aws2-sqs.message-group-id-strategy | 仅适用于 FIFO 队列。在消息上设置 messageGroupId 的策略。可以是以下选项之一:useConstant, 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 Secret 密钥。 | 字符串 | |
camel.component.aws2-sqs.server-side-encryption-enabled | 定义是否在队列中启用服务器端加密。 | 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)将等待直到队列中消息包含在响应中。 | 整数 |
第 12 章 Azure ServiceBus
自 Camel 3.12 起
支持生成者和消费者
集成 Azure ServiceBus 的 azure-servicebus 组件。Azure ServiceBus 是一个完全托管的企业集成消息代理。服务总线可以分离应用程序和服务。服务总线提供可靠、安全的平台,用于异步传输数据和状态。使用消息在不同的应用程序和服务间传输数据。
先决条件
您必须具有有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户。
12.1. 依赖项
当在 Camel Spring Boot 中使用 azure-servicebus
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-azure-servicebus-starter</artifactId> </dependency>
12.2. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
12.2.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
12.2.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
12.3. 组件选项
Azure ServiceBus 组件支持 25 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amqpRetryOptions (common) | 为服务总线客户端设置重试选项。如果没有指定,则使用默认重试选项。 | AmqpRetryOptions | |
amqpTransportType (common) | 设置与 Azure 服务总线发生的所有通信的传输类型。默认值为 AmqpTransportType#AMQP。 Enum 值:
| AMQP | AmqpTransportType |
clientOptions (common) | 将 ClientOptions 设置为从此构建器构建的客户端发送,启用自定义某些属性,并支持添加自定义标头信息。如需更多信息,请参阅 ClientOptions 文档。 | ClientOptions | |
configuration (common) | 组件配置。 | ServiceBusConfiguration | |
proxyOptions (common) | 设置用于 ServiceBusSenderAsyncClient 的代理配置。配置代理时,必须使用 AmqpTransportType#AMQP_WEB_SOCKETS 用于传输类型。 | ProxyOptions | |
serviceBusType (common) | 需要 要执行的服务总线类型。队列用于典型的队列选项,用于基于订阅的模型。 Enum 值:
| queue | ServiceBusType |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
consumerOperation (consumer) | 设置要在消费者中使用的所需操作。 Enum 值:
| receiveMessages | ServiceBusConsumerOperationDefinition |
disableAutoComplete (consumer) | 禁用接收消息的自动完成和自动取消。默认情况下,成功处理的消息为 \\{link ServiceBusReceiverAsyncClient#complete (ServiceBusReceivedMessage) completed}。如果在处理消息时出现错误,则为 \\{link ServiceBusReceiverAsyncClient#abandon (ServiceBusReceivedMessage) abandoned}。 | false | 布尔值 |
maxAutoLockRenewDuration (consumer) | 设置继续自动续订锁定的时间长度。设置 Duration#ZERO 或 null 会禁用自动续订。对于 \\{link ServiceBusReceiveMode#RECEIVE_AND_DELETE_DELETE_DELETE} 模式,禁用自动续订。 | 5m | Duration |
peekNumMaxMessages (consumer) | 在 peek 操作过程中,将消息的最大数量设置为 peeked。 | 整数 | |
prefetchCount (consumer) | 设置接收方的预抓取计数。对于 \\{link ServiceBusReceiveMode#PEEK_LOCK PEEK_LOCK} 和 \\{link ServiceBusReceiveMode#RECEIVE_AND_DELETE_RECEIVE_AND_DELETE} 模式,默认值为 1。在应用程序请求使用 ServiceBusReceiverAsyncClient#receiveMessages ()时和之前,预抓取消息流会加快消息流。设置非零值将预先抓取该消息数。将值设为 0 可关闭预先抓取。 | int | |
receiverAsyncClient (consumer) | Autowired 设置 receiverAsyncClient,以便供消费者使用消息。 | ServiceBusReceiverAsyncClient | |
serviceBusReceiveMode (consumer) | 设置接收方的接收模式。 Enum 值:
| PEEK_LOCK | ServiceBusReceiveMode |
subQueue (consumer) | 设置要连接的 SubQueue 的类型。 Enum 值:
| SubQueue | |
subscriptionName (consumer) | 设置主题中的订阅名称,以侦听至主题OrQueueName 和 serviceBusType=topic。如果 serviceBusType=topic 和消费者正在使用,则需要此属性。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
producerOperation (producer) | 设置要在制作者中使用的所需操作。 Enum 值:
| sendMessages | ServiceBusProducerOperationDefinition |
scheduledEnqueueTime (producer) | 设置 OffsetDateTime,其中消息应出现在服务总线队列或主题中。 | OffsetDateTime | |
senderAsyncClient (producer) | Autowired 设置要在制作者中使用的 SenderAsyncClient。 | ServiceBusSenderAsyncClient | |
serviceBusTransactionContext (producer) | 代表服务中的事务。此对象仅包含事务 ID。 | ServiceBusTransactionContext | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
connectionString (security) | 为服务总线命名空间或特定服务总线资源设置连接字符串。 | 字符串 | |
fullyQualifiedNamespace (security) | 服务总线的完全限定命名空间。 | 字符串 | |
tokenCredential (security) | Azure AD 身份验证的 TokenCredential,在 com.azure.identity 中实施。 | TokenCredential |
12.4. 端点选项
Azure ServiceBus 端点使用 URI 语法进行配置:
azure-servicebus:topicOrQueueName
使用以下路径和查询参数:
12.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
topicOrQueueName (common) | 根据 serviceBusType 配置,所选的主题名称或队列名称。例如,如果 serviceBusType=queue,则这将是队列名称,如果 serviceBusType=topic,则这将是主题名称。 | 字符串 |
12.4.2. 查询参数(25 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amqpRetryOptions (common) | 为服务总线客户端设置重试选项。如果没有指定,则使用默认重试选项。 | AmqpRetryOptions | |
amqpTransportType (common) | 设置与 Azure 服务总线发生的所有通信的传输类型。默认值为 AmqpTransportType#AMQP。 Enum 值:
| AMQP | AmqpTransportType |
clientOptions (common) | 将 ClientOptions 设置为从此构建器构建的客户端发送,启用自定义某些属性,并支持添加自定义标头信息。如需更多信息,请参阅 ClientOptions 文档。 | ClientOptions | |
proxyOptions (common) | 设置用于 ServiceBusSenderAsyncClient 的代理配置。配置代理时,必须使用 AmqpTransportType#AMQP_WEB_SOCKETS 用于传输类型。 | ProxyOptions | |
serviceBusType (common) | 需要 要执行的服务总线类型。队列用于典型的队列选项,用于基于订阅的模型。 Enum 值:
| queue | ServiceBusType |
consumerOperation (consumer) | 设置要在消费者中使用的所需操作。 Enum 值:
| receiveMessages | ServiceBusConsumerOperationDefinition |
disableAutoComplete (consumer) | 禁用接收消息的自动完成和自动取消。默认情况下,成功处理的消息为 \\{link ServiceBusReceiverAsyncClient#complete (ServiceBusReceivedMessage) completed}。如果在处理消息时出现错误,则为 \\{link ServiceBusReceiverAsyncClient#abandon (ServiceBusReceivedMessage) abandoned}。 | false | 布尔值 |
maxAutoLockRenewDuration (consumer) | 设置继续自动续订锁定的时间长度。设置 Duration#ZERO 或 null 会禁用自动续订。对于 \\{link ServiceBusReceiveMode#RECEIVE_AND_DELETE_DELETE_DELETE} 模式,禁用自动续订。 | 5m | Duration |
peekNumMaxMessages (consumer) | 在 peek 操作过程中,将消息的最大数量设置为 peeked。 | 整数 | |
prefetchCount (consumer) | 设置接收方的预抓取计数。对于 \\{link ServiceBusReceiveMode#PEEK_LOCK PEEK_LOCK} 和 \\{link ServiceBusReceiveMode#RECEIVE_AND_DELETE_RECEIVE_AND_DELETE} 模式,默认值为 1。在应用程序请求使用 ServiceBusReceiverAsyncClient#receiveMessages ()时和之前,预抓取消息流会加快消息流。设置非零值将预先抓取该消息数。将值设为 0 可关闭预先抓取。 | int | |
receiverAsyncClient (consumer) | Autowired 设置 receiverAsyncClient,以便供消费者使用消息。 | ServiceBusReceiverAsyncClient | |
serviceBusReceiveMode (consumer) | 设置接收方的接收模式。 Enum 值:
| PEEK_LOCK | ServiceBusReceiveMode |
subQueue (consumer) | 设置要连接的 SubQueue 的类型。 Enum 值:
| SubQueue | |
subscriptionName (consumer) | 设置主题中的订阅名称,以侦听至主题OrQueueName 和 serviceBusType=topic。如果 serviceBusType=topic 和消费者正在使用,则需要此属性。 | 字符串 | |
bridgeErrorHandler (consumer (advanced)) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
producerOperation (producer) | 设置要在制作者中使用的所需操作。 Enum 值:
| sendMessages | ServiceBusProducerOperationDefinition |
scheduledEnqueueTime (producer) | 设置 OffsetDateTime,其中消息应出现在服务总线队列或主题中。 | OffsetDateTime | |
senderAsyncClient (producer) | Autowired 设置要在制作者中使用的 SenderAsyncClient。 | ServiceBusSenderAsyncClient | |
serviceBusTransactionContext (producer) | 代表服务中的事务。此对象仅包含事务 ID。 | ServiceBusTransactionContext | |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
connectionString (security) | 为服务总线命名空间或特定服务总线资源设置连接字符串。 | 字符串 | |
fullyQualifiedNamespace (security) | 服务总线的完全限定命名空间。 | 字符串 | |
tokenCredential (security) | Azure AD 身份验证的 TokenCredential,在 com.azure.identity 中实施。 | TokenCredential |
12.5. async Consumer 和 Producer
这个组件实现了 async Consumer 和 producer。这允许 camel 路由在不阻塞任何线程的情况下异步使用和生成事件。
12.6. 消息标头
Azure ServiceBus 组件支持 25 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelAzureServiceBusApplicationProperties (common) | 应用属性(也称为自定义属性)分别由生产者和消费者发送和接收的消息。 | Map | |
CamelAzureServiceBusContentType (consumer) 常数: CONTENT_TYPE | 获取消息的内容类型。 | 字符串 | |
CamelAzureServiceBusCorrelationId (consumer) 常数: CORRELATION_ID | 获取关联标识符。 | 字符串 | |
CamelAzureServiceBusDeadLetterErrorDescription (consumer) | 获取已死信消息的描述。 | 字符串 | |
CamelAzureServiceBusDeadLetterReason (consumer) | 获取消息死信的原因。 | 字符串 | |
CamelAzureServiceBusDeadLetterSource (consumer) | 获取此消息在死信之前排队的队列或订阅的名称。 | 字符串 | |
CamelAzureServiceBusDeliveryCount (consumer) 常量 :DEL IVERY_COUNT | 获取此消息发送到客户端的次数。 | long | |
CamelAzureServiceBusEnqueuedSequenceNumber (consumer) constant: ENQUEUED_SEQUENCE_NUMBER | 通过服务总线获取分配给邮件的 enqueued 序列号。 | long | |
CamelAzureServiceBusEnqueuedTime (consumer) 恒定: ENQUEUED_TIME | 获取此消息在 Azure 服务总线中排队的时间。 | OffsetDateTime | |
CamelAzureServiceBusExpiresAt (consumer) 恒定: EXPIRES_AT | 获取此消息将过期的日期。 | OffsetDateTime | |
CamelAzureServiceBusLockToken (consumer) 常数: LOCK_TOKEN | 获取当前消息的锁定令牌。 | 字符串 | |
CamelAzureServiceBusLockedUntil (consumer) 常数 : LOCKED_UNTIL | 获取此消息锁定的日期时间。 | OffsetDateTime | |
CamelAzureServiceBusMessageId (consumer) 恒定: MESSAGE_ID | 获取消息的标识符。 | 字符串 | |
CamelAzureServiceBusPartitionKey (consumer) 常数: PARTITION_KEY | 获取将消息发送到分区实体的分区密钥。 | 字符串 | |
CamelAzureServiceBusRawAmqpMessage (consumer) 恒定: RAW_AMQP_MESSAGE | AMQP 协议定义的消息的表示。 | AmqpAnnotatedMessage | |
CamelAzureServiceBusReplyTo (consumer) 常数 : REPLY_TO | 获取要发送回复的实体的地址。 | 字符串 | |
CamelAzureServiceBusReplyToSessionId (consumer) 常量 : REPLY_TO_SESSION_ID | 获取或设置会话标识符,增加 ReplyTo 地址。 | 字符串 | |
CamelAzureServiceBusSequenceNumber (consumer) constant: SEQUENCE_NUMBER | 通过服务总线获取分配给消息的唯一编号。 | long | |
CamelAzureServiceBusSessionId (consumer) 常量 : SESSION_ID | 获取消息的会话 ID。 | 字符串 | |
CamelAzureServiceBusSubject (consumer) 常数 :SUBJ ECT | 获取消息的主题。 | 字符串 | |
CamelAzureServiceBusTimeToLive (consumer) 恒定: TIME_TO_LIVE | 在此消息过期前获得持续时间。 | Duration | |
CamelAzureServiceBusTo (consumer) 常数: TO | 获取地址。 | 字符串 | |
CamelAzureServiceBusScheduledEnqueueTime (common) | (producer)覆盖应出现在服务总线队列或主题中的 OffsetDateTime。(consumer)获取此消息调度的 enqueue 时间。 | OffsetDateTime | |
CamelAzureServiceBusServiceBusTransactionContext (producer) | 覆盖服务中的事务。此对象仅包含事务 ID。 | ServiceBusTransactionContext | |
CamelAzureServiceBusProducerOperation (producer) | 覆盖制作者中使用的所需操作。 Enum 值:
| ServiceBusProducerOperationDefinition |
12.6.1. 消息正文
在制作者中,此组件接受 String
类型的消息正文或 List<String>
来发送批处理消息。
在消费者中,返回的消息正文将类型为 'String。
12.6.2. Azure ServiceBus Producer 操作
操作 | 描述 |
---|---|
| 使用批处理的方法将一组消息发送到服务总线队列或主题。 |
| 将调度的消息发送到此发送者所连接的 Azure 服务总线实体。调度的消息会被排队,并仅在调度的 enqueue 时间上提供给接收器。 |
12.6.3. Azure ServiceBus Consumer 操作
操作 | 描述 |
---|---|
| 从服务总线实体接收 <b>infinite</b> 消息流。 |
| 在不更改接收方或消息源的状态的情况下读取下一个活跃消息的批处理。 |
12.6.3.1. 例子
-
sendMessages
from("direct:start") .process(exchange -> { final List<Object> inputBatch = new LinkedList<>(); inputBatch.add("test batch 1"); inputBatch.add("test batch 2"); inputBatch.add("test batch 3"); inputBatch.add(123456); exchange.getIn().setBody(inputBatch); }) .to("azure-servicebus:test//?connectionString=test") .to("mock:result");
-
scheduleMessages
from("direct:start") .process(exchange -> { final List<Object> inputBatch = new LinkedList<>(); inputBatch.add("test batch 1"); inputBatch.add("test batch 2"); inputBatch.add("test batch 3"); inputBatch.add(123456); exchange.getIn().setHeader(ServiceBusConstants.SCHEDULED_ENQUEUE_TIME, OffsetDateTime.now()); exchange.getIn().setBody(inputBatch); }) .to("azure-servicebus:test//?connectionString=test&producerOperation=scheduleMessages") .to("mock:result");
-
receiveMessages
from("azure-servicebus:test//?connectionString=test") .log("${body}") .to("mock:result");
-
peekMessages
from("azure-servicebus:test//?connectionString=test&consumerOperation=peekMessages&peekNumMaxMessages=3") .log("${body}") .to("mock:result");
12.7. Spring Boot Auto-Configuration
组件支持 26 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.azure-servicebus.amqp-retry-options | 为服务总线客户端设置重试选项。如果没有指定,则使用默认重试选项。选项是一个 com.azure.core.amqp.AmqpRetryOptions 类型。 | AmqpRetryOptions | |
camel.component.azure-servicebus.amqp-transport-type | 设置与 Azure 服务总线发生的所有通信的传输类型。默认值为 AmqpTransportType#AMQP。 | AmqpTransportType | |
camel.component.azure-servicebus.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.azure-servicebus.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.azure-servicebus.client-options | 将 ClientOptions 设置为从此构建器构建的客户端发送,启用自定义某些属性,并支持添加自定义标头信息。如需更多信息,请参阅 ClientOptions 文档。选项是一个 com.azure.core.util.ClientOptions 类型。 | ClientOptions | |
camel.component.azure-servicebus.configuration | 组件配置。选项是 org.apache.camel.component.azure.servicebus.ServiceBusConfiguration 类型。 | ServiceBusConfiguration | |
camel.component.azure-servicebus.connection-string | 为服务总线命名空间或特定服务总线资源设置连接字符串。 | 字符串 | |
camel.component.azure-servicebus.consumer-operation | 设置要在消费者中使用的所需操作。 | ServiceBusConsumerOperationDefinition | |
camel.component.azure-servicebus.disable-auto-complete | 禁用接收消息的自动完成和自动取消。默认情况下,成功处理的消息为 \\{link ServiceBusReceiverAsyncClient#complete (ServiceBusReceivedMessage) completed}。如果在处理消息时出现错误,则为 \\{link ServiceBusReceiverAsyncClient#abandon (ServiceBusReceivedMessage) abandoned}。 | false | 布尔值 |
camel.component.azure-servicebus.enabled | 是否启用 azure-servicebus 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.azure-servicebus.fully-qualified-namespace | 服务总线的完全限定命名空间。 | 字符串 | |
camel.component.azure-servicebus.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.azure-servicebus.max-auto-lock-renew-duration | 设置继续自动续订锁定的时间长度。设置 Duration#ZERO 或 null 会禁用自动续订。对于 \\{link ServiceBusReceiveMode#RECEIVE_AND_DELETE_DELETE_DELETE} 模式,禁用自动续订。选项是一个 java.time.Duration 类型。 | Duration | |
camel.component.azure-servicebus.peek-num-max-messages | 在 peek 操作过程中,将消息的最大数量设置为 peeked。 | 整数 | |
camel.component.azure-servicebus.prefetch-count | 设置接收方的预抓取计数。对于 \\{link ServiceBusReceiveMode#PEEK_LOCK PEEK_LOCK} 和 \\{link ServiceBusReceiveMode#RECEIVE_AND_DELETE_RECEIVE_AND_DELETE} 模式,默认值为 1。在应用程序请求使用 ServiceBusReceiverAsyncClient#receiveMessages ()时和之前,预抓取消息流会加快消息流。设置非零值将预先抓取该消息数。将值设为 0 可关闭预先抓取。 | 整数 | |
camel.component.azure-servicebus.producer-operation | 设置要在制作者中使用的所需操作。 | ServiceBusProducerOperationDefinition | |
camel.component.azure-servicebus.proxy-options | 设置用于 ServiceBusSenderAsyncClient 的代理配置。配置代理时,必须使用 AmqpTransportType#AMQP_WEB_SOCKETS 用于传输类型。选项是一个 com.azure.core.amqp.ProxyOptions 类型。 | ProxyOptions | |
camel.component.azure-servicebus.receiver-async-client | 设置 receiverAsyncClient,以便供消费者使用消息。选项是一个 com.azure.messaging.servicebus.ServiceBusReceiverAsyncClient 类型。 | ServiceBusReceiverAsyncClient | |
camel.component.azure-servicebus.scheduled-enqueue-time | 设置 OffsetDateTime,其中消息应出现在服务总线队列或主题中。选项是一个 java.time.OffsetDateTime 类型。 | OffsetDateTime | |
camel.component.azure-servicebus.sender-async-client | 设置 SenderAsyncClient,以便在制作者中使用。选项是一个 com.azure.messaging.servicebus.ServiceBusSenderAsyncClient 类型。 | ServiceBusSenderAsyncClient | |
camel.component.azure-servicebus.service-bus-receive-mode | 设置接收方的接收模式。 | ServiceBusReceiveMode | |
camel.component.azure-servicebus.service-bus-transaction-context | 代表服务中的事务。此对象仅包含事务 ID。选项是一个 com.azure.messaging.servicebus.ServiceBusTransactionContext 类型。 | ServiceBusTransactionContext | |
camel.component.azure-servicebus.service-bus-type | 要执行的连接的服务总线类型。队列用于典型的队列选项,用于基于订阅的模型。 | ServiceBusType | |
camel.component.azure-servicebus.sub-queue | 设置要连接的 SubQueue 的类型。 | SubQueue | |
camel.component.azure-servicebus.subscription-name | 设置主题中的订阅名称,以侦听至主题OrQueueName 和 serviceBusType=topic。如果 serviceBusType=topic 和消费者正在使用,则需要此属性。 | 字符串 | |
camel.component.azure-servicebus.token-credential | Azure AD 身份验证的 TokenCredential,在 com.azure.identity 中实施。选项是一个 com.azure.core.credential.TokenCredential 类型。 | TokenCredential |
第 13 章 Azure Storage Blob Service
支持生成者和消费者
Azure Storage Blob 组件用于使用 Azure API v12 从 Azure Storage Blob Service 存储和检索 Blob。但是,对于 v12 以上版本,我们将了解此组件是否可以采用这些更改,具体取决于造成破坏的变化量。
先决条件
您必须具有有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户。
13.1. 依赖项
当在 Camel Spring Boot 中使用 azure-storage-blob
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-azure-storage-blob-starter</artifactId> </dependency>
13.2. URI 格式
azure-storage-blob://accountName[/containerName][?options]
如果是消费者,则需要 accountName
,containerName
。对于生成者,它取决于请求的操作,例如,如果操作位于容器级别上,例如,只有 createContainer
、accountName
和 containerName
,则需要在 blob 级别中请求操作,如 getBlob
、accountName
、containerName
和 blobName
。
如果 blob 不存在,则会创建它。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
13.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
13.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
13.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
13.4. 组件选项
Azure Storage Blob Service 组件支持 35 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
blobName (common) | blob 名称,使用来自容器的特定 blob。但是,在生成者上,只有 blob 级别的操作才需要。 | 字符串 | |
blobOffset (common) | 为上传或下载操作设置 blob 偏移,默认为 0。 | 0 | long |
blobType (common) | blob 类型,为每个 blob 类型启动适当的设置。 Enum 值:
| blockblob | BlobType |
closeStreamAfterRead (common) | 在读取或保持打开后关闭流,默认为 true。 | true | 布尔值 |
configuration (common) | 组件配置。 | BlobConfiguration | |
credentials (common) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,其中包含重要的身份验证信息。 | StorageSharedKeyCredential | |
CredentialType (common) | 决定要采用的凭证策略。 Enum 值:
| AZURE_IDENTITY | CredentialType |
dataCount (common) | 范围中包含的字节数。如果指定,则必须大于或等于 0。 | Long | |
fileDir (common) | 下载的 Blob 将保存到的文件的目录,这可用于生成者和消费者。 | 字符串 | |
maxResultsPerPage (common) | 指定要返回的最大 Blob 数量,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 个值,则服务器将最多返回 5,000 个项目。 | 整数 | |
maxRetryRequests (common) | 指定在从响应正文读取数据时进行的最大额外 HTTP Get 请求数。 | 0 | int |
prefix (common) | 过滤结果,以仅返回名称以指定前缀开头的 Blob。可能为空,以返回所有 Blob。 | 字符串 | |
regex (common) | 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。如果同时设置了前缀和 regex,则可能为空返回,regex 采用优先级,并且忽略前缀。 | 字符串 | |
sasToken (common) | 使用共享访问签名时设置 SAS 令牌 | 字符串 | |
serviceClient (common) | Autowired 客户端到存储帐户。此客户端不保存特定存储帐户的任何状态,而是便捷地将适当的请求发送到服务上的资源。它还可用于构建 URL 到 blob 和容器。此客户端包含服务帐户的操作。BlobContainerClient 到 BlobServiceClient#getBlobContainerClient (String)上的操作在 BlobClient 上通过 BlobContainerClient=<getBlobClient (String)提供。 | BlobServiceClient | |
timeout (common) | 将引发 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) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
operation (producer) | 可与生成者上此组件的 Blob 操作。 Enum 值:
| listBlobContainers | BlobOperationsDefinition |
pageBlobSize (producer) | 指定页面 blob 的最大大小,最多 8 TB。页面 Blob 大小必须与 512 字节边界一致。 | 512 | Long |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
healthCheckConsumerEnabled (health) | 用于从这个组件启用或禁用所有基于消费者的健康检查。 | true | 布尔值 |
healthCheckProducerEnabled (health) | 用于从此组件启用或禁用所有基于制作者的健康检查。注意:默认情况下,Camel 禁用了所有基于健康检查的制作者。您可以通过设置 camel.health.producersEnabled=true 来全局打开制作者检查。 | true | 布尔值 |
accessKey (security) | 要使用 azure blob 服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
sourceBlobAccessKey (security) | Source Blob Access Key:对于 copyblob 操作,我们需要为源 blob 有一个 accessKey,我们需要复制 Passing an accessKey 作为标头,因此我们可以设置为 key。 | 字符串 |
13.5. 端点选项
Azure Storage Blob Service 端点使用 URI 语法进行配置:
azure-storage-blob:accountName/containerName
使用以下路径和查询参数:
13.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
accountName (common) | 用于通过 azure blob 服务进行身份验证的 Azure 帐户名称。 | 字符串 | |
containerName (common) | blob 容器名称。 | 字符串 |
13.5.2. 查询参数(50 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
blobName (common) | blob 名称,使用来自容器的特定 blob。但是,在生成者上,只有 blob 级别的操作才需要。 | 字符串 | |
blobOffset (common) | 为上传或下载操作设置 blob 偏移,默认为 0。 | 0 | long |
blobServiceClient (common) | 客户端到存储帐户。此客户端不保存特定存储帐户的任何状态,而是便捷地将适当的请求发送到服务上的资源。它还可用于构建 URL 到 blob 和容器。此客户端包含服务帐户的操作。容器上的操作通过 getBlobContainerClient (String)在 BlobContainerClient (String)上通过 getBlobContainerClient (String).getBlobClient (String)在 BlobClient 上提供操作。 | BlobServiceClient | |
blobType (common) | blob 类型,为每个 blob 类型启动适当的设置。 Enum 值:
| blockblob | BlobType |
closeStreamAfterRead (common) | 在读取或保持打开后关闭流,默认为 true。 | true | 布尔值 |
credentials (common) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,其中包含重要的身份验证信息。 | StorageSharedKeyCredential | |
CredentialType (common) | 决定要采用的凭证策略。 Enum 值:
| AZURE_IDENTITY | CredentialType |
dataCount (common) | 范围中包含的字节数。如果指定,则必须大于或等于 0。 | Long | |
fileDir (common) | 下载的 Blob 将保存到的文件的目录,这可用于生成者和消费者。 | 字符串 | |
maxResultsPerPage (common) | 指定要返回的最大 Blob 数量,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 个值,则服务器将最多返回 5,000 个项目。 | 整数 | |
maxRetryRequests (common) | 指定在从响应正文读取数据时进行的最大额外 HTTP Get 请求数。 | 0 | int |
prefix (common) | 过滤结果,以仅返回名称以指定前缀开头的 Blob。可能为空,以返回所有 Blob。 | 字符串 | |
regex (common) | 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。如果同时设置了前缀和 regex,则可能为空返回,regex 采用优先级,并且忽略前缀。 | 字符串 | |
sasToken (common) | 使用共享访问签名时设置 SAS 令牌。 | 字符串 | |
serviceClient (common) | Autowired 客户端到存储帐户。此客户端不保存特定存储帐户的任何状态,而是便捷地将适当的请求发送到服务上的资源。它还可用于构建 URL 到 blob 和容器。此客户端包含服务帐户的操作。BlobContainerClient 到 BlobServiceClient#getBlobContainerClient (String)上的操作在 BlobClient 上通过 BlobContainerClient=<getBlobClient (String)提供。 | BlobServiceClient | |
timeout (common) | 将引发 RuntimeException 之外的可选超时值。 | Duration | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
pollStrategy (consumer (advanced)) | 可插拔 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) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
operation (producer) | 可与生成者上此组件的 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 | |
scheduler (scheduler) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | Map | |
startScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
useFixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
accessKey (security) | 要使用 azure blob 服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
sourceBlobAccessKey (security) | Source Blob Access Key:对于 copyblob 操作,我们需要为源 blob 有一个 accessKey,我们需要复制 Passing an accessKey 作为标头,因此我们可以设置为 key。 | 字符串 |
所需信息选项
要使用此组件,您可以 3 个选项来提供所需的 Azure 身份验证信息:
-
提供一个链接: BlobServiceClient 实例,它可以注入到 blobServiceClient 中。注意:不需要创建特定的客户端,例如:
BlockBlobClient
,BlobServiceClient
代表可用于检索较低级别的客户端的上级。 -
在指定
credentialsType=AZURE_IDENTITY
并提供所需的环境变量 时,提供 Azure 身份。https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity#environment-variables这可启用带有 secret/certificate 的服务主体(如应用程序注册)身份验证,以及用户名密码。请注意,这是默认的验证策略。 -
当指定
credentialsType=SHARED_ACCOUNT_KEY
并为 Azure 帐户提供accountName
和accessKey
时,提供共享存储帐户密钥,这是启动的最简单方法。accessKey
可以通过您的 Azure 门户生成。 -
在指定
credentialType=SHARED_KEY_CREDENTIAL
时提供共享存储帐户密钥,并提供 StorageSharedKeyCredential 实例,它可以注入到凭证选项中。 -
通过 Azure SAS,当指定
credentialType=AZURE_SAS
时,并通过 sasToken 参数提供 SAS Token 参数。
13.6. 使用方法
例如,若要从 camelazure
存储帐户中的 container1
上 block blob hello.txt
下载 blob 内容,请使用以下片断:
from("azure-storage-blob://camelazure/container1?blobName=hello.txt&credentialType=SHARED_ACCOUNT_KEY&accessKey=RAW(yourAccessKey)").to("file://blobdirectory");
13.6.1. 消息标头
Azure Storage Blob Service 组件支持 63 个消息标头,如下所列:
标头 | 变量名称 | 类型 | 操作 | 描述 |
---|---|---|---|---|
|
|
| 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 字节边界一致,起始偏移必须是 512 的 modulus,并且最终偏移必须是 512 - 1 的 modulus。有效字节范围的示例为 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 | 指定要执行的制作者操作,请参阅此页面上的与制作者操作相关的文档。 |
|
|
|
| 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。可以为空返回所有.如果设置了前缀和正则表达式,则 regex 将采用优先级和前缀,并忽略前缀。 |
|
|
|
| 它过滤结果,以大约在开始时间后返回事件。注意:也可以返回属于上一小时的几个事件。可能会缺少几个属于此小时的事件;为了确保返回一小时的所有事件,请按小时舍入开始时间。 |
|
|
|
| 它过滤结果,以大约在结束时间前返回事件。注意:也可以返回属于下一个小时的几个事件。可能缺少几小时属于此小时的几个事件;为了确保返回一小时的所有事件,请按小时向上舍入结束时间。 |
|
|
|
| 这提供了在服务调用期间通过 Http 管道传递的额外上下文。 |
|
|
|
| 在复制 blob 操作中用作源帐户名称的源 blob 帐户名称 |
|
|
|
| 在复制 Blob 操作中用作源容器名称的源 blob 容器名称 |
13.6.2. 由组件制作者或消费者设置的消息标头
标头 | 变量名称 | 类型 | 描述 |
---|---|---|---|
|
|
| blob 的访问层。 |
|
|
| 当 blob 访问层最后一次更改时,日期时间。 |
|
|
| blob 的存档状态。 |
|
|
| blob 的创建时间。 |
|
|
| 页面 blob 的当前序列号。 |
|
|
| blob 的大小。 |
|
|
| blob 的类型。 |
|
|
| 为 blob 指定的缓存控制。 |
|
|
| 提交到 append 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。 |
13.6.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");
13.6.4. 在 registry 中自动检测 BlobServiceClient 客户端
组件可以检测在 registry 中存在 BlobServiceClient bean。如果这是该类型的唯一实例,它将用作客户端,您不必将其定义为 uri 参数,如上例所示。这对端点的智能配置非常有用。
13.6.5. Azure Storage Blob Producer 操作
Camel Azure Storage Blob 组件在生成者端提供广泛的操作:
服务级别的操作
对于这些操作,需要 accountName
。
操作 | 描述 |
---|---|
| 获取 blob 的内容。您可以将此操作的输出限制为 blob 范围。 |
| 返回发生到 blob 和存储帐户中的 blob 元数据的事务日志。更改源提供有排序、保证、持久、不可变、只读日志的这些更改。 |
容器级别的操作
对于这些操作,需要 accountName
和 containerName
。
操作 | 描述 |
---|---|
| 在存储帐户中创建新容器。如果容器已存在具有相同名称的容器,则生成者将忽略它。 |
| 删除存储帐户中的指定容器。如果容器不存在,则操作会失败。 |
| 返回此容器中的 blob 列表,并扁平化文件夹结构。 |
blob 级别的操作
对于这些操作,需要 accountName
、containerName
和 blobName
。
操作 | blob Type | 描述 |
---|---|---|
| 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。 |
|
|
将新数据块提交到现有附加 Blob 的末尾。如果标头 |
|
|
创建指定长度的页面 Blob。调用 |
|
|
将一个或多个页面写入页面 blob。写入大小必须是 512 的倍数。如果标头 |
|
| 将页面 blob 大小调整为指定的大小(必须是 512 的倍数)。 |
|
| 从页面 blob 中释放指定的页面。范围的大小必须是 512 的倍数。 |
|
| 返回页面 blob 或页面 blob 的有效页面范围列表。 |
|
| 将 blob 从一个容器复制到另一个容器,甚至从不同的帐户复制。 |
请参阅此页面中的示例部分,了解如何在 camel 应用程序中使用这些操作。
13.6.6. 消费者示例
要使用文件组件将 Blob 消耗到文件中,如下所示:
from("azure-storage-blob://camelazure/container1?blobName=hello.txt&accountName=yourAccountName&accessKey=yourAccessKey"). to("file://blobdirectory");
但是,您也可以使用 file 组件直接写入文件,您需要指定 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");
13.6.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 中。
13.6.8. SAS Token 生成示例
SAS Blob 容器令牌可以通过编程方式或通过 Azure UI 生成。要使用 java 代码生成令牌,可以执行以下操作:
BlobContainerClient blobClient = new BlobContainerClientBuilder() .endpoint(String.format("https://%s.blob.core.windows.net/%s", accountName, accessKey)) .containerName(containerName) .credential(new StorageSharedKeyCredential(accountName, accessKey)) .buildClient(); // Create a SAS token that's valid for 1 day, as an example OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1); // Assign permissions to the SAS token BlobContainerSasPermission blobContainerSasPermission = new BlobContainerSasPermission() .setWritePermission(true) .setListPermission(true) .setCreatePermission(true) .setDeletePermission(true) .setAddPermission(true) .setReadPermission(true); BlobServiceSasSignatureValues sasSignatureValues = new BlobServiceSasSignatureValues(expiryTime, blobContainerSasPermission); return blobClient.generateSas(sasSignatureValues);
然后,生成的 SAS 令牌可以存储在 application.properties
文件中,以便 camel 路由可以加载该文件,例如:
camel.component.azure-storage-blob.sas-token=MY_TOKEN_HERE from("direct:copyBlob") .to("azure-storage-blob://account/containerblob2?operation=uploadBlockBlob&credentialType=AZURE_SAS")
13.7. Spring Boot Auto-Configuration
组件支持 36 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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.credential-type | 决定要采用的凭证策略。 | CredentialType | |
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.health-check-consumer-enabled | 用于从这个组件启用或禁用所有基于消费者的健康检查。 | true | 布尔值 |
camel.component.azure-storage-blob.health-check-producer-enabled | 用于从此组件启用或禁用所有基于制作者的健康检查。注意:默认情况下,Camel 禁用了所有基于健康检查的制作者。您可以通过设置 camel.health.producersEnabled=true 来全局打开制作者检查。 | true | 布尔值 |
camel.component.azure-storage-blob.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 Get 请求数。 | 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。如果同时设置了前缀和 regex,则可能为空返回,regex 采用优先级,并且忽略前缀。 | 字符串 | |
camel.component.azure-storage-blob.sas-token | 使用共享访问签名时设置 SAS 令牌 | 字符串 | |
camel.component.azure-storage-blob.service-client | 客户端到存储帐户。此客户端不保存特定存储帐户的任何状态,而是便捷地将适当的请求发送到服务上的资源。它还可用于构建 URL 到 blob 和容器。此客户端包含服务帐户的操作。BlobContainerClient 到 BlobServiceClient#getBlobContainerClient (String)上的操作在 BlobClient 上通过 BlobContainerClient=<getBlobClient (String)提供。选项是一个 com.azure.storage.blob.BlobServiceClient 类型。 | BlobServiceClient | |
camel.component.azure-storage-blob.source-blob-access-key | Source Blob Access Key:对于 copyblob 操作,我们需要为源 blob 有一个 accessKey,我们需要复制 Passing an accessKey 作为标头,因此我们可以设置为 key。 | 字符串 | |
camel.component.azure-storage-blob.timeout | 将引发 RuntimeException 之外的可选超时值。选项是一个 java.time.Duration 类型。 | Duration |
第 14 章 Azure Storage Queue Service
支持生成者和消费者
Azure Storage Queue 组件支持使用 Azure APIs v12,将信息存储和检索到 Azure Storage Queue 服务。但是,对于 v12 以上版本,我们将了解此组件是否可以采用这些更改,具体取决于造成破坏的变化量。
先决条件
您必须具有有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户。
14.1. 依赖项
当在 Camel Spring Boot 中使用 azure-storage-queue
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-azure-storage-queue-starter</artifactId> </dependency>
14.2. URI 格式
azure-storage-queue://accountName[/queueName][?options]
如果是消费者,则需要 accountName 和 queueName。如果生成者不同,它取决于所请求的操作,例如,如果操作位于服务级别上,则仅需要 accountName,但在队列级别上请求操作时(如 createQueue、sendMessage.. 等),则需要 accountName 和 queueName。
如果队列尚不存在,则会创建队列。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
14.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
14.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
14.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
14.4. 组件选项
Azure Storage Queue Service 组件支持 15 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
configuration (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) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
operation (producer) | 队列服务操作提示到制作者。 Enum 值:
| QueueOperationDefinition | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
maxMessages (queue) | 如果要获取的最大消息数,如果队列中存在的消息数量少于请求的所有消息,则返回。如果仅检索 1 个消息,则允许的范围为 1 到 32 个消息。 | 1 | 整数 |
messageId (queue) | 要删除或更新的消息 ID。 | 字符串 | |
popReceipt (queue) | 必须匹配删除或更新消息的唯一标识符。 | 字符串 | |
Timeout (queue) | 应用到操作的可选超时。如果在超时结束前没有返回响应,则将抛出 RuntimeException。 | Duration | |
timeToLive (queue) | 消息在队列中保持活动状态的时长。如果未设置该值将默认为 7 天,如果传递 -1,则消息不会过期。生存时间必须是 -1 或任意正数。格式应采用以下形式:PnDTnHnMn.nS.,例如:PT20.345Scriu-osgiparses 为 20.345 秒,P2Dcategories- netobservparses 为 2 天,如果您使用的是 EndpointDsl/ComponentDsl,您可以执行类似于 Duration.ofSeconds ()的操作,因为这些 Java API typesafe。 | Duration | |
visibilityTimeout (queue) | 消息在队列中不可见的超时时间。超时必须在 1 秒和 7 天之间。格式应采用以下形式:PnDTnHnMn.nS.,例如:PT20.345Scriu-osgiparses 为 20.345 秒,P2Dcategories- netobservparses 为 2 天,如果您使用的是 EndpointDsl/ComponentDsl,您可以执行类似于 Duration.ofSeconds ()的操作,因为这些 Java API typesafe。 | Duration | |
accessKey (security) | 要使用 azure 队列服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
凭证 (安全) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,其中包含重要的身份验证信息。 | StorageSharedKeyCredential |
14.5. 端点选项
Azure Storage Queue Service 端点使用 URI 语法进行配置:
azure-storage-queue:accountName/queueName
使用以下路径和查询参数:
14.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
accountName (common) | 用于通过 azure 队列服务进行身份验证的 Azure 帐户名称。 | 字符串 | |
queueName (common) | 队列资源名称。 | 字符串 |
14.5.2. 查询参数(31 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
serviceClient (common) | Autowired Service 客户端到存储帐户,以便与队列服务交互。此客户端不保存特定存储帐户的任何状态,而是便捷地将适当的请求发送到服务上的资源。此客户端包含与 Azure Storage 中队列帐户交互的所有操作。客户端允许的操作是创建、列出和删除队列、检索和更新帐户属性,以及检索帐户统计信息。 | QueueServiceClient | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
createQueue (producer) | 当设置为 true 时,将在发送消息到队列时自动创建队列。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
operation (producer) | 队列服务操作提示到制作者。 Enum 值:
| QueueOperationDefinition | |
maxMessages (queue) | 如果要获取的最大消息数,如果队列中存在的消息数量少于请求的所有消息,则返回。如果仅检索 1 个消息,则允许的范围为 1 到 32 个消息。 | 1 | 整数 |
messageId (queue) | 要删除或更新的消息 ID。 | 字符串 | |
popReceipt (queue) | 必须匹配删除或更新消息的唯一标识符。 | 字符串 | |
Timeout (queue) | 应用到操作的可选超时。如果在超时结束前没有返回响应,则将抛出 RuntimeException。 | Duration | |
timeToLive (queue) | 消息在队列中保持活动状态的时长。如果未设置该值将默认为 7 天,如果传递 -1,则消息不会过期。生存时间必须是 -1 或任意正数。格式应采用以下形式:PnDTnHnMn.nS.,例如:PT20.345Scriu-osgiparses 为 20.345 秒,P2Dcategories- netobservparses 为 2 天,如果您使用的是 EndpointDsl/ComponentDsl,您可以执行类似于 Duration.ofSeconds ()的操作,因为这些 Java API typesafe。 | Duration | |
visibilityTimeout (queue) | 消息在队列中不可见的超时时间。超时必须在 1 秒和 7 天之间。格式应采用以下形式:PnDTnHnMn.nS.,例如:PT20.345Scriu-osgiparses 为 20.345 秒,P2Dcategories- netobservparses 为 2 天,如果您使用的是 EndpointDsl/ComponentDsl,您可以执行类似于 Duration.ofSeconds ()的操作,因为这些 Java API typesafe。 | 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 | |
scheduler (scheduler) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | Map | |
startScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
useFixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
accessKey (security) | 要使用 azure 队列服务进行身份验证的相关 azure 帐户名称的访问密钥。 | 字符串 | |
凭证 (安全) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,其中包含重要的身份验证信息。 | StorageSharedKeyCredential |
所需信息选项
要使用此组件,您可以 3 个选项来提供所需的 Azure 身份验证信息:
-
为您的 Azure 帐户提供
accountName
和accessKey
,这是开始的最简单方法。accessKey 可以通过您的 Azure 门户生成。 -
提供 StorageSharedKeyCredential 实例,它可以提供给
凭证
选项。 -
提供 QueueServiceClient 实例,它可以提供给
serviceClient
。注意:您不需要创建特定的客户端,如 QueueClient,QueueServiceClient 代表可用于检索较低级别的客户端。
14.6. 使用方法
例如,若要从 storageAccount
存储帐户中的队列 messageQueue
获取消息内容,请使用以下代码片段:
from("azure-storage-queue://storageAccount/messageQueue?accessKey=yourAccessKey"). to("file://queuedirectory");
14.6.1. 由组件制作者评估的消息标头
标头 | 变量名称 | 类型 | 操作 | 描述 |
---|---|---|---|---|
|
|
|
| 列出队列的选项 |
|
|
| All | 将引发 \{@link RuntimeException} 以外的可选超时值。 |
|
|
|
| 与队列关联的元数据 |
|
|
|
| 消息在队列中保持活动状态的时长。如果未设置该值将默认为 7 天,如果传递 -1,则消息不会过期。生存时间必须是 -1 或任意正数。 |
|
|
|
| 消息在队列中不可见的超时时间。如果未设置该值将默认为 0,且信息将立即可见。超时必须在 0 秒和 7 天之间。 |
|
|
|
|
当设置为 |
|
|
|
| 必须匹配删除或更新消息的唯一标识符。 |
|
|
|
| 要删除或更新的消息 ID。 |
|
|
|
| 如果要获取的最大消息数,如果队列中存在的消息数量少于请求的所有消息,则返回。如果仅检索 1 个消息,则允许的范围为 1 到 32 个消息。 |
|
|
| All | 指定要执行的制作者操作,请参阅此页面上的与制作者操作相关的文档。 |
|
|
| All | 覆盖队列名称。 |
14.6.2. 由组件制作者或消费者设置的消息标头
标头 | 变量名称 | 类型 | 描述 |
---|---|---|---|
|
|
| 发送到队列的消息 ID。 |
|
|
| Message 插入到队列中的时间。 |
|
|
| 消息将过期并自动删除的时间。 |
|
|
| 删除/更新消息需要这个值。如果删除失败,使用这个 popreceipt,则消息已被另一个客户端取消队列。 |
|
|
| 消息再次在 Queue 中可见的时间。 |
|
|
| 消息已排队的次数。 |
|
|
| 返回可供用户使用的非稀疏 httpHeaders。 |
14.6.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");
14.6.4. 在 registry 中自动检测 QueueServiceClient 客户端
组件能够检测在 registry 中存在 QueueServiceClient bean。如果这是该类型的唯一实例,它将用作客户端,您不必将其定义为 uri 参数,如上例所示。这对端点的智能配置非常有用。
14.6.5. Azure Storage Queue Producer 操作
Camel Azure Storage Queue 组件在生成者端提供广泛的操作:
服务级别的操作
对于这些操作,需要 accountName
。
操作 | 描述 |
---|---|
| 列出存储帐户中的队列,该帐户通过指定标记开始的过滤器。 |
队列级别的操作
对于这些操作,需要 accountName
和 queueName
。
操作 | 描述 |
---|---|
| 创建新队列。 |
| 永久删除队列。 |
| 删除队列中的所有消息。 |
|
默认 Producer Operation Sends a message with a given time-to-live and a timeout period,其中消息在队列中不可见。消息文本从交换消息正文评估。默认情况下,如果队列不存在,它将首先创建一个空队列。如果要禁用此功能,请将 config |
| 删除队列中的指定消息。 |
| 最多从队列中检索消息数量,并在超时时间内从其他操作中隐藏它们。但是,由于可靠性的原因,它不会从队列中分离消息。 |
| 从队列前到最大消息数的 peek 消息。 |
| 使用新消息更新队列中的特定消息,并重置可见性超时。消息文本从交换消息正文评估。 |
请参阅此页面中的示例部分,了解如何在 camel 应用程序中使用这些操作。
14.6.6. 消费者示例
要将队列消耗到一个批处理中最多 5 个消息的文件组件中,您可以执行以下操作:
from("azure-storage-queue://cameldev/queue1?serviceClient=#client&maxMessages=5") .to("file://outputFolder?fileName=output.txt&fileExist=Append");
14.6.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");
-
peekMessages
:
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");
14.6.8. 开发注意事项(Important)
当在这个组件上开发时,您需要获取您的 Azure accessKey 来运行集成测试。除了模拟的单元测试外,还需要在每次进行更改时运行集成测试,甚至进行客户端升级,因为 Azure 客户端也可以在次版本升级时中断操作。要运行集成测试,在此组件目录中运行以下 maven 命令:
mvn verify -PfullTests -DaccountName=myacc -DaccessKey=mykey
其中 accountName
是您的 Azure 帐户名称,accessKey 是从 Azure 门户生成的访问密钥。
14.7. Spring Boot Auto-Configuration
组件支持 16 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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.345Scriu-osgiparses 为 20.345 秒,P2Dcategories- netobservparses 为 2 天,如果您使用的是 EndpointDsl/ComponentDsl,您可以执行类似于 Duration.ofSeconds ()的操作,因为这些 Java API typesafe。选项是一个 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.345Scriu-osgiparses 为 20.345 秒,P2Dcategories- netobservparses 为 2 天,如果您使用的是 EndpointDsl/ComponentDsl,您可以执行类似于 Duration.ofSeconds ()的操作,因为这些 Java API typesafe。选项是一个 java.time.Duration 类型。 | Duration |
第 15 章 Bean
仅支持生成者
Bean 组件将 Bean 绑定到 Camel 消息交换。
15.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 bean
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-bean-starter</artifactId> </dependency>
15.2. URI 格式
bean:beanName[?options]
其中 beanID 可以是用于在 Registry 中查找 bean 的任何字符串
15.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
15.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
15.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
15.4. 组件选项
Bean 组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
cache (producer) | 弃用了 Use singleton 选项。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
scope (producer) | bean 范围。使用单例范围(默认)创建 Bean 时,或在端点生命周期中仅查找一次并重复使用。当并发线程同时调用 bean 时,bean 应该为 thread-safe。使用请求范围时,会创建 bean 或查找每个请求一次(交换)。如果要在处理请求时将状态存储在 bean 上,而您希望在处理请求时多次调用同一 bean 实例,则可以使用它。bean 不必是 thread-safe,因为实例只能从同一请求调用。使用委派范围时,每个调用将查找或创建 bean。但是,如果查找,这被委派给 bean registry,如 Spring 或 CDI (如果使用),这取决于其配置可以充当单例或原型范围。因此,这取决于委派的 registry。 Enum 值:
| 单例 | BeanScope |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
15.5. 端点选项
Bean 端点使用 URI 语法进行配置:
bean:beanName
使用以下路径和查询参数:
15.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
beanName (common) | 必需 设置要调用的 bean 的名称。 | 字符串 |
15.5.2. 查询参数(5 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
cache (common) | 弃用的 Use scope 选项替代。 | 布尔值 | |
method (common) | 设置要在 bean 上调用的方法名称。 | 字符串 | |
scope (common) | bean 范围。使用单例范围(默认)创建 Bean 时,或在端点生命周期中仅查找一次并重复使用。当并发线程同时调用 bean 时,bean 应该为 thread-safe。使用请求范围时,会创建 bean 或查找每个请求一次(交换)。如果要在处理请求时将状态存储在 bean 上,而您希望在处理请求时多次调用同一 bean 实例,则可以使用它。bean 不必是 thread-safe,因为实例只能从同一请求调用。使用原型范围时,每个调用将查找或创建 bean。但是,如果查找,这被委派给 bean registry,如 Spring 或 CDI (如果使用),这取决于其配置可以充当单例或原型范围。因此,这取决于委派的 registry。 Enum 值:
| 单例 | BeanScope |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
参数 (advanced) | 用于在 bean 上配置其他属性。 | Map |
15.6. 例子
用于消耗消息的对象实例必须明确注册到 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>
15.7. Bean 作为端点
Camel 还支持将 Bean 作为端点调用。当交换路由到 myBean
Camel 时,会出现什么情况,即 Camel 将使用 Bean Binding 调用 bean。bean 的源只是一个普通 POJO。
Camel 通过将 Exchange 的 In body 转换为 String
类型并在 Exchange Out 正文上存储方法的输出,来使用 Bean Binding 调用 sayHello
方法。
15.8. Java DSL Bean 语法
Java DSL 附带组件的语法化 sugar。您可以使用以下语法,而不是将 bean 明确指定为端点(例如: ("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 中查找它):
// 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);
15.9. Bean Binding
可以选择要调用的 bean 方法(如果未通过 method 参数明确指定),以及如何由 Message 构建参数值,它们都由 Camel 中所有不同 Bean 集成机制定义。
15.10. Spring Boot Auto-Configuration
组件支持 13 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.bean.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.bean.enabled | 是否启用 bean 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.bean.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.bean.scope | bean 范围。使用单例范围(默认)创建 Bean 时,或在端点生命周期中仅查找一次并重复使用。当并发线程同时调用 bean 时,bean 应该为 thread-safe。使用请求范围时,会创建 bean 或查找每个请求一次(交换)。如果要在处理请求时将状态存储在 bean 上,而您希望在处理请求时多次调用同一 bean 实例,则可以使用它。bean 不必是 thread-safe,因为实例只能从同一请求调用。使用委派范围时,每个调用将查找或创建 bean。但是,如果查找,这被委派给 bean registry,如 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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.class.scope | bean 范围。使用单例范围(默认)创建 Bean 时,或在端点生命周期中仅查找一次并重复使用。当并发线程同时调用 bean 时,bean 应该为 thread-safe。使用请求范围时,会创建 bean 或查找每个请求一次(交换)。如果要在处理请求时将状态存储在 bean 上,而您希望在处理请求时多次调用同一 bean 实例,则可以使用它。bean 不必是 thread-safe,因为实例只能从同一请求调用。使用委派范围时,每个调用将查找或创建 bean。但是,如果查找,这被委派给 bean registry,如 Spring 或 CDI (如果使用),这取决于其配置可以充当单例或原型范围。因此,这取决于委派的 registry。 | BeanScope | |
camel.language.bean.enabled | 是否启用 bean 语言的自动配置。这默认是启用的。 | 布尔值 | |
camel.language.bean.scope | bean 范围。使用单例范围(默认)创建 Bean 时,或在端点生命周期中仅查找一次并重复使用。当并发线程同时调用 bean 时,bean 应该为 thread-safe。使用请求范围时,会创建 bean 或查找每个请求一次(交换)。如果要在处理请求时将状态存储在 bean 上,而您希望在处理请求时多次调用同一 bean 实例,则可以使用它。bean 不必是 thread-safe,因为实例只能从同一请求调用。使用原型范围时,每个调用将查找或创建 bean。但是,如果查找,这被委派给 bean registry,如 Spring 或 CDI (如果使用),这取决于其配置可以充当单例或原型范围。因此,在使用表格范围时,这取决于 bean 注册表实施。 | 单例 | 字符串 |
camel.language.bean.trim | 是否修剪值以移除前导和结尾的空格和换行符。 | true | 布尔值 |
camel.component.bean.cache | 弃用了 Use singleton 选项。 | true | 布尔值 |
camel.component.class.cache | 弃用了 Use singleton 选项。 | true | 布尔值 |
第 16 章 Bean Validator
仅支持生成者
Validator 组件使用 Java Bean Validation API ()执行消息正文的 bean 验证。Camel 使用参考实现,即 Hibernate Validator。
16.1. 依赖项
当在 Camel Spring Boot 中使用 bean-validator
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-bean-validator-starter</artifactId> </dependency>
16.2. URI 格式
bean-validator:label[?options]
其中 label 是描述端点的任意文本值。您可以以以下格式将查询选项附加到 URI 中,
?option=value&option=value&…
16.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
16.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
16.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
16.4. 组件选项
Bean Validator 组件支持 8 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
ignoreXmlConfiguration (producer) | 是否忽略 META-INF/validation.xml 文件中的数据。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
constraintValidatorFactory (advanced) | 使用自定义 ConstraintValidatorFactory。 | ConstraintValidatorFactory | |
messageInterpolator (advanced) | 使用自定义 MessageInterpolator。 | MessageInterpolator | |
TraversableResolver (advanced) | 使用自定义的 TraversableResolver。 | TraversableResolver | |
validationProviderResolver (advanced) | 使用自定义 ValidationProviderResolver。 | ValidationProviderResolver | |
ValidatorFactory ( advanced) | Autowired 使用自定义 ValidatorFactory。 | ValidatorFactory |
16.5. 端点选项
Bean Validator 端点使用 URI 语法进行配置:
bean-validator:label
使用以下路径和查询参数:
16.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
label (producer) | 必需 where 标签是一个描述端点的任意文本值。 | 字符串 |
16.5.2. 查询参数(8 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
group (producer) | 使用自定义验证组。 | javax.validation.groups.Default | 字符串 |
ignoreXmlConfiguration (producer) | 是否忽略 META-INF/validation.xml 文件中的数据。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
constraintValidatorFactory (advanced) | 使用自定义 ConstraintValidatorFactory。 | ConstraintValidatorFactory | |
messageInterpolator (advanced) | 使用自定义 MessageInterpolator。 | MessageInterpolator | |
TraversableResolver (advanced) | 使用自定义的 TraversableResolver。 | TraversableResolver | |
validationProviderResolver (advanced) | 使用自定义 ValidationProviderResolver。 | ValidationProviderResolver | |
ValidatorFactory ( advanced) | 使用自定义 ValidatorFactory。 | ValidatorFactory |
16.6. OSGi 部署
要在 OSGi 环境中使用 Hibernate Validator,请使用专用的 ValidationProviderResolver
实现,就像 org.apache.camel.component.bean.validator.HibernateValidationProviderResolver
.以下代码片段演示了此方法。您还可以使用 HibernateValidationProviderResolver
。
使用 HibernateValidationProviderResolver
from("direct:test"). to("bean-validator://ValidationProviderResolverTest?validationProviderResolver=#myValidationProviderResolver");
<bean id="myValidationProviderResolver" class="org.apache.camel.component.bean.validator.HibernateValidationProviderResolver"/>
如果没有定义自定义 ValidationProviderResolver
,并且验证器组件已部署到 OSGi 环境中,则会自动使用 HibernateValidationProviderResolver
。
16.7. 示例
假设我们有一个带有以下注解的 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 路由时,将仅对制造商和 licensePlate 属性的 @NotNull 约束进行验证(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>
16.8. Spring Boot Auto-Configuration
组件支持 9 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 | 使用自定义 ValidatorFactory。选项是 javax.validation.ValidatorFactory 类型。 | ValidatorFactory |
第 17 章 bindy
此组件的目标是允许将非结构化数据(或更精确的非 XML 数据)解析到/从 Java Beans (带有注解定义的绑定映射)的解析/绑定。使用 Bindy,您可以从源(如 )绑定数据:
- CSV 记录,
- 固定长度记录,
- FIX 消息、
- 或者几乎是其他任何非结构化数据
到一个或多个旧 Java 对象(POJO)。bindy 根据 java 属性的类型转换数据。在某些情况下,POJO 可以与一对多关系连接。此外,对于诸如 Date、Double、Float、Integer、Short、Long 和 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 或 字段中。
多个模型
当您使用类名称而不是软件包名称配置 bindy 时,您可以将多个模型放在同一个软件包中。
17.1. 依赖项
当在 Camel Spring Boot 中使用 bindy-csv
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-bindy-starter</artifactId> </dependency>
17.2. 选项
Bindy dataformat 支持 5 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
type |
| 必需 是否使用 Csv、修复或 KeyValue。 Enum 值:
| |
classType |
| 要使用的模型类名称。 | |
locale |
| 配置要使用的默认区域设置,如我们获取单元状态。要使用 JVM 平台默认区域设置,请使用名称 default。 | |
unwrapSingleInstance |
| 当 unmarshalling 应该取消和返回的实例时,而不是嵌套在 java.util.List 中。 | |
allowEmptyStream |
| 是否在 unmarshal 进程中允许空流。如果为 true,如果没有提供记录的正文,则不会抛出异常。 |
17.3. 注解
创建的注解允许将您的模型的不同概念映射到 POJO,如下所示:
- 记录类型(CSV、键值对(如 FIX 消息)、固定长度 …)
- 链接(链接另一个对象中的对象)
- DataField 及其属性(int, type, …),
- KeyValuePairField (用于 key = FIX 财务消息一样的值格式),
- 部分(要识别标头、正文和页脚部分),
- OneToMany,
- BindyConverter,
- FormatFactories
本节将描述它们。
17.3.1. 1.CsvRecord
CsvRecord 注解用于识别模型的根类。它表示记录 = "CSV 文件的行",并可链接到多个子模型类。
注解名称 | 记录类型 | 级别 |
---|---|---|
CsvRecord | CSV | 类 |
参数名称 | 类型 | 必填 | 默认值 | info |
---|---|---|---|---|
分隔符 | 字符串 | ✓ | 用于在令牌中分割记录的分隔符(必需)- 可以是 ',' 或 ';' 或 'anything'。唯一支持的空格字符是 tab (\t)。不支持其他空格字符(空格)。这个值被解释为正则表达式。如果要使用在正则表达式中有一个特殊含义,例如 '|' 符号,则必须屏蔽它,如 '|'。 | |
allowEmptyStream | 布尔值 | false | allowEmptyStream 参数将允许 prcoess 的 CSV 文件不可避免的流。 | |
autospanLine | 布尔值 | false | 最后一条记录跨越其余行(可选)- 如果启用,则最后一列会自动跨越到行尾,例如,如果其注释,则允许行包含所有字符,也是分隔符 char。 | |
crlf | 字符串 | WINDOWS | 要在每个记录后添加回车符(可选)- 允许使用回车字符。如果您指定了之前列出的三个值,则您输入的值(自定义)将用作 CRLF 字符。可以使用三个值:WINDOWS、UNIX、MAC 或 custom。 | |
endWithLineBreak | 布尔值 | true | 如果 CSV 文件以换行符或未结束(可选) | |
generateHeaderColumns | 布尔值 | false | generateHeaderColumns 参数允许在 CSV 中添加生成的包含列名称的标头 | |
isOrdered | 布尔值 | false | 指明消息是否在输出中排序 | |
name | 字符串 | 描述记录的名称(可选) | ||
quote | 字符串 | " | 是否使用给定的引号字符(可选)- 在生成 CSV 时指定字段的引号字符。此注释与模型的根类关联,必须声明一次。 | |
引用 | 布尔值 | false | 指明在 marshaling (可选)时是否必须用引号括起值(和标头) | |
quotingEscaped | 布尔值 | false | 指明在引用时是否必须转义值(可选) | |
removeQuotes | 布尔值 | true | 如果 unmarshalling 应该尝试删除每个字段的引号,则 remove quotes 参数标志 | |
skipField | 布尔值 | false | skipField 参数将允许跳过 CSV 文件的字段。如果某些字段不需要,可以跳过它们。 | |
skipFirstLine | 布尔值 | false | skipFirstLine 参数将允许跳过或不是 CSV 文件的第一行。此行通常包含列定义 | |
trimLine | 布尔值 | true | 在将行解析为数据字段之前,是否修剪每行(stand 和 end)。 |
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 { }
请注意,如果要从 Object 放入 CSV 并使用引号,则需要使用 @CsvRecord
上的 quote
属性来指定要使用的引号,如下所示:
@CsvRecord( separator = ",", quote = "\"" ) public Class Order { }
case 5 : separator 和 skipFirstLine
当客户端想在文件的第一行(数据字段的名称)中时,该功能很有趣:
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 过程中 Bindy 将生成类似以下的 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
case 7 : carriage 返回
如果 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; }
pos
用于解析文件流,而 位置
则用于生成 CSV。
17.3.2. 2.Link
链接注解将允许将对象链接在一起。
注解名称 | 记录类型 | 级别 |
---|---|---|
Link | all | 类和属性 |
参数名称 | 类型 | 必填 | 默认值 | info |
---|---|---|---|---|
linkType | LinkType | OneToOne | 标识类之间关系的链接类型 |
从当前版本起,只允许一对一关系。
例如:如果模型类客户端链接到 Order 类,则使用 Order 类中的注解链接,如下所示:
属性链接
@CsvRecord(separator = ",") public class Order { @DataField(pos = 1) private int orderNr; @Link private Client client; }
对于类客户端:
类链接
@Link public class Client { }
17.3.3. 3.DataField
DataField 注解定义字段的属性。每个 datafield 都由记录中的位置、类型(字符串、int、日期、…)以及可选的模式来标识。
注解名称 | 记录类型 | 级别 |
---|---|---|
DataField | all | 属性 |
参数名称 | 类型 | 必填 | 默认值 | info |
---|---|---|---|---|
pos | int | ✓ | 数据在输入记录中的位置必须从 1 开始(必需)。请参阅 position 参数。 | |
align | 字符串 | R | 将文本与右侧或左对齐。使用值 <tt>R</tt> 或 <tt>L</tt>。 | |
Clip | 布尔值 | false | 如果在使用固定长度时超过允许的长度,则指示字段中冲突数据。 | |
columnName | 字符串 |
标头列的名称(可选)。使用属性的名称作为默认值。仅在 | ||
decimalSeparator | 字符串 | 与 BigDecimal 号码一起使用的十进制 9 月器 | ||
defaultValue | 字符串 | 如果没有设置值,则字段的默认值 | ||
delimiter | 字符串 | 如果字段有变量长度,要使用的可选分隔符 | ||
groupingSeparator | 字符串 | 当我们想通过组 e.g. 123,456.789 格式化/稀疏的数字时,分组了要与 BigDecimal 号码一起使用的 9 个分组。 | ||
impliedDecimalSeparator | 布尔值 | false | 指明是否存在代表在指定位置的十进制点 | |
length | int | 0 | 如果记录被设置为固定长度,则数据块的长度(字符数) | |
lengthPos | int | 0 | 识别记录中定义此字段预期的固定长度的数据字段 | |
方法 | 字符串 | 调用的方法名称,以在 DataField 上应用此类自定义。这必须是 datafield 本身上的方法,或者您必须提供类方法的静态完全限定名称,例如:请参阅单元测试 org.apache.camel.dataformat.bindy.csv.BindySimpleCsvFunctionWithExternalMethodTest.replaceToBar | ||
name | 字符串 | 字段的名称(可选) | ||
paddingChar | char | 如果记录被设置为固定长度,则为 char to pad | ||
pattern | 字符串 | Java formatter (示例为SimpleDateFormat)的模式将用于转换数据(可选)。如果使用模式,则建议在 bindy 数据格式上设置区域设置。设置为已知区域设置,如 "us",或使用 "default" 来使用平台默认区域设置。 | ||
position | int | 0 | 生成输出消息中的字段位置(从 1 开始)。当 CSV 生成的字段的位置(输出消息)中的字段位置与输入位置(pos)不同时,必须使用。请参阅 pos 参数。 | |
精度 | int | 0 | 要创建的 \{@link java.math.BigDecimal} 数字的精度 | |
required | 布尔值 | false | 指明字段是否强制 | |
Rounding | 字符串 | CEILING | Round mode to 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: 123.79. | |
timezone | 字符串 | 要使用的时区。 | ||
trim | 布尔值 | false | 指明值是否应修剪 |
case 1:pos
这个参数/属性代表 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; }
case 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; }
case 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 属性将通知 bindy 如何将字段放在生成的 CSV 记录中。默认情况下,使用的位置对应于通过属性 pos
定义的位置。如果位置不同(这意味着我们有一个 asymetric processus marshaling from 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
的属性 isOrdered = true
结合使用。
case 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 :
case 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; }
此属性仅适用于可选字段。
17.3.4. 4.FixedLengthRecord
FixedLengthRecord 注解用于识别模型的根类。它代表 record = "文件/message 的行包含数据固定长度(字符数)格式,并可链接到多个子模型类。这个格式是一个具体格式,因为字段的数据可以与右侧或左侧一致。
当数据的大小没有完全填写字段长度时,我们可以添加"本"字符。
注解名称 | 记录类型 | 级别 |
---|---|---|
FixedLengthRecord | 已修复 | 类 |
参数名称 | 类型 | 必填 | 默认值 | info |
---|---|---|---|---|
countGrapheme | 布尔值 | false | 指明如何计算收费 | |
crlf | 字符串 | WINDOWS | 要在每个记录后添加回车字符(可选)。可能的值有:WINDOWS、UNIX、MAC 或 custom。这个选项仅在 marshalling 期间使用,而 unmarshalling 使用系统默认 JDK 提供的行分隔符,除非自定义 eol。 | |
EOL | 字符串 | 字符用于在每个记录后考虑行尾(可选 - default: ""),它可以帮助默认 JDK 提供的行分隔符使用,除非提供了任何其他值。)此选项仅在 unmarshalling 期间使用,其中 marshall 使用系统默认提供的行分隔符作为 "WINDOWS"。 | ||
footer | 类 | void | 表示此类型的记录可以跟随文件末尾的单个页脚记录 | |
header | 类 | void | 表示此类型的记录前面可以加上文件开头的单个标头记录 | |
ignoreMissingChars | 布尔值 | false | 指明是否忽略太短行 | |
ignoreTrailingChars | 布尔值 | false | 表示在 unmarshalling / 解析时会忽略最后一个映射文件之外的字符。此注释与模型的根类关联,必须声明一次。 | |
length | int | 0 | 记录的固定长度(字符数)。这意味着,记录将始终是使用 \{#paddingChar ()}'s 持续添加的 | |
name | 字符串 | 描述记录的名称(可选) | ||
paddingChar | char | 使用 char to pad。 | ||
skipFooter | 布尔值 | false | 配置数据格式,以跳过页脚记录的 marshalling / unmarshalling。在主记录上配置此参数(例如,不是标头或页脚)。 | |
skipHeader | 布尔值 | false | 配置数据格式,以跳过标头记录的 marshalling / 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:使用 alignment 和 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; }
case 3:字段填充
有时,为记录定义的默认 padding 不能应用于字段,因为我们有一个数字格式,其中我们希望使用 '0' 而不是 ' ' pad。在这种情况下,您可以在模型中使用 @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
固定分隔
@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
值。
case 5 :带有记录定义字段长度的固定长度记录
有时,固定长度记录可能会包含一个字段,用于定义同一记录中另一个字段的预期长度。在以下示例中,instrumentNumber
字段值的长度由记录中的 instrumentNumberLen
字段的值定义。
10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009
固定分隔
@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; }
case 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 : 在解析固定长度记录时跳过内容
通常与提供固定长度记录的系统集成,其包含比目标用例所需信息更多的系统。在这种情况下,跳过我们不需要的字段的声明和解析。要接受这一点,Bindy 将跳过记录中的下一个映射字段,如果下一个声明字段的 pos
值不在最后一个解析字段的光标位置。对感兴趣的字段使用绝对 pos
位置(而不是 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 }
17.3.5. 5.消息
Message 注解用于识别包含键值对字段的模型类。此类格式主要在 financial Exchange Protocol Messages (FIX)中使用。但是,此注解可用于通过密钥标识数据的任何其他格式。密钥对值由分隔符相互分隔,可以是诸如 tab delimitor (unicode representation : \u0009
)或标题的开头(unicode representation : \u0001
)
要使用 FIX 消息,模型必须包含链接到根消息类的标头和 Trailer 类,可以是 Order 类。这不是强制要求,当您将 camel-bindy 与 camel-fix 结合使用时,这是基于 quickFix 项目的修复网关时,将非常有用。
注解名称 | 记录类型 | 级别 |
---|---|---|
消息 | 键值对 | 类 |
参数名称 | 类型 | 必填 | 默认值 | 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、…)(可选) |
case 1 : separator = '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
@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1") public class Order { }
查看测试问题单
ASCII 字符,如 tab,… 无法显示在 WIKI 页面中。因此,请看一个 camel-bindy 测试案例,来准确查看 FIX 消息是什么样子和 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)。
17.3.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 消息中的键/标签的位置必须不同时,必须使用 | |
精度 | 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; }
case 2:输出中的不同位置
如果我们将放入 FIX 消息中的标签/密钥按照预定义的顺序排序,则使用注释 @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; }
17.3.7. 7.部分
在固定长度记录的 FIX 消息中,通常以信息 : header, body 和 section 表示不同的部分。注释的 @Section
的目的是告知绑定模型中哪个类代表标头(= section 1)、body (= section 2)和页脚(= section 3)
此注释仅存在一个属性/参数。
注解名称 | 记录类型 | 级别 |
---|---|---|
部分 | 修复 | 类 |
参数名称 | 类型 | 必填 | 默认值 | info |
---|---|---|---|---|
number | int | ✓ | 部分数 |
问题单 1:部分
header 部分的定义:
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; }
17.3.8. 8.OneToMany
注释 @OneToMany
的目的是允许处理 List<?&
gt; 字段定义的 POJO 类或包含重复组的记录。
OneToMany
的限制要小心,很多绑定都不允许处理在多个层次上定义的重复。
在以下情况下,关系仅是 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; }
case 2 : Reading FIX message containing group of tags/keys
以下是我们希望在我们的模型中处理的消息:
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 重复。
和代码:
读取包含标签/密钥组的 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; }
17.3.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(); } }
17.3.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); } }; } }
17.4. 支持的数据类型
DefaultFormatFactory 通过根据提供的 FormattingOptions 返回接口 FormatFactoryInterface 实例,从而提供以下 datatype 的格式:
- BigDecimal
- BigInteger
- 布尔值
- byte
- 字符
- Date
- �
- Enums
- 浮点值
- 整数
- LocalDate
- LocalDateTime
- LocalTime
- Long
- short
- 字符串
可以通过提供 registry 中的 FactoryRegistry 实例(如 spring 或 JNDI)来覆盖 DefaultFormatFactory。
17.5. 使用 Java DSL
下一步会实例化与此记录类型关联的 DataFormat bindy 类,并提供一个类作为参数。
例如,以下命令使用类 BindyCsvDataFormat
(对应于与 CSV 记录类型关联的类),它使用 com.acme.model.MyModel.class 来初始化这个软件包中配置的模型对象。
DataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);
17.5.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");
17.5.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");
17.5.3. marshaling
要从模型对象集合生成 CSV 记录,请创建以下路由:
from("direct:handleOrders") .marshal(bindy) .to("file://outbox")
17.6. 使用 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>
请验证您的模型类是否实施了 serializable,否则队列管理器将引发错误。
17.7. 依赖项
要在 camel 路由中使用 Bindy,您需要添加对实现此数据格式的 camel-bindy 的依赖。
如果您使用 maven,您只需在 pom.xml 中添加以下内容,替换最新和最佳发行版本的版本号(请参阅最新版本的下载页面)。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-bindy</artifactId> <version>{CamelSBVersion}</version> </dependency>
17.8. Spring Boot Auto-Configuration
组件支持 18 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 配置要使用的默认区域设置,如我们获取单元状态。要使用 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 | 配置要使用的默认区域设置,如我们获取单元状态。要使用 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 | 配置要使用的默认区域设置,如我们获取单元状态。要使用 JVM 平台默认区域设置,请使用名称 default。 | 字符串 | |
camel.dataformat.bindy-kvp.type | 是否使用 Csv、修复或 KeyValue。 | 字符串 | |
camel.dataformat.bindy-kvp.unwrap-single-instance | 当 unmarshalling 应该取消和返回的实例时,而不是嵌套在 java.util.List 中。 | true | 布尔值 |
第 18 章 浏览
支持生成者和消费者
Browse 组件提供了一个简单的 BrowsableEndpoint,可用于测试、可视化工具或调试。发送到端点的交换都可以浏览。
18.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 浏览
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-browse-starter</artifactId> </dependency>
18.2. URI 格式
browse:someName[?options]
其中 someName 可以是唯一标识端点的任何字符串。
18.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
18.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
18.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
18.4. 组件选项
Browse 组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
18.5. 端点选项
Browse 端点使用 URI 语法进行配置:
browse:name
使用以下路径和查询参数:
18.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (common) | 必需 A 名称,可以是任意字符串来唯一标识端点。 | 字符串 |
18.5.2. 查询参数(4 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
18.6. 示例
在以下路由中,我们插入一个 浏览:
组件可以浏览要传递的交换:
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 } }
18.7. Spring Boot Auto-Configuration
组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 19 章 Cassandra CQL
支持生成者和消费者
Apache Cassandra 是一个开源 NoSQL 数据库,旨在处理商业硬件上的大量数据。与 Amazon 的 DynamoDB 一样,Cassandra 具有对等(peer)和无主架构,以避免单点故障和高可用性。与 Google 的 BigTable 一样,Cassandra 使用列系列进行结构化,这些系列可通过 Thrift RPC API 或称为 CQL 的 SQL API 访问。
此组件旨在使用 CQL3 API (而不是 Thrift API)集成 Cassandra 2.0+。它基于由 DataStax 提供的 Cassandra Java 驱动程序。
19.1. 依赖项
当在 Camel Spring Boot 中使用 cql
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-cassandraql-starter</artifactId> </dependency>
19.2. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
19.2.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
19.2.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
19.3. 组件选项
Cassandra CQL 组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
19.4. 端点选项
Cassandra CQL 端点使用 URI 语法进行配置:
cql:beanRef:hosts:port/keyspace
使用以下路径和查询参数:
19.4.1. 路径参数(4 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
beanRef (common) | beanRef 使用 bean:id 定义。 | 字符串 | |
hosts (common) | 主机名 Cassandra 服务器。可以使用逗号分隔多个主机。 | 字符串 | |
port (common) | Cassandra 服务器的端口号。 | 整数 | |
keyspace (common) | 要使用的键空间。 | 字符串 |
19.4.2. 查询参数(30 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clusterName (common) | 集群名称。 | 字符串 | |
consistencyLevel (common) | 要使用的一致性级别。 Enum 值:
| DefaultConsistencyLevel | |
cql (common) | 要执行的 CQL 查询。可使用键 CamelCqlQuery 的消息标头覆盖。 | 字符串 | |
datacenter (common) | 要使用的数据中心。 | datacenter1 | 字符串 |
loadBalancingPolicyClass (common) | 使用特定的 LoadBalancingPolicyClass。 | 字符串 | |
password (common) | 会话身份验证的密码。 | 字符串 | |
prepareStatements (common) | 是否使用 PreparedStatements 还是常规声明。 | true | 布尔值 |
resultSetConversionStrategy (common) | 要使用实现将 ResultSet 转换为消息正文 ALL、ONE、LIMIT_10, LIMIT_100… 的自定义类。 | ResultSetConversionStrategy | |
session (common) | 要使用 Session 实例(您通常不会使用这个选项)。 | CqlSession | |
用户名 (common) | 会话身份验证的用户名。 | 字符串 | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 | |
scheduler (scheduler) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | Map | |
startScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
useFixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
19.5. 端点连接语法
端点可以启动 Cassandra 连接,或使用现有的端点。
URI | 描述 |
---|---|
| 单主机、默认端口,通常用于测试 |
| 多主机,默认端口 |
| 多主机,自定义端口 |
| 默认端口和密钥空间 |
| 提供的会话参考 |
| 提供的集群参考 |
要微调 Cassandra 连接(SSL 选项、池选项、负载平衡策略、重试策略、重新连接策略…),请创建自己的 Cluster 实例并将其提供给 Camel 端点。
19.6. 消息
19.6.1. 传入的消息
Camel Cassandra 端点需要一个简单对象(Object
或 Object[]
或 Collection<Object
>),该对象将绑定到 CQL 语句作为查询参数。如果消息正文为空或为空,则将在不绑定参数的情况下执行 CQL 查询。
Headers
CamelCqlQuery
(可选,字符串
或常规状态
)CQL 查询可以是普通 String,也可以使用
QueryBuilder
构建。
19.6.2. 传出消息
Camel Cassandra 端点会根据 resultSetConversionStrategy
生成一个或多个 Cassandra Row 对象:
-
List<Row
> ifresultSetConversionStrategy
isALL
或LIMIT_[0-9]+
-
如果
resultSetConversionStrategy
为ONE
,则单一的 Row' -
否则,如果
resultSetConversionStrategy
是ResultSetConversionStrategy
的自定义实现
19.7. 软件仓库
Cassandra 可用于存储用于幂等和聚合 EIP 的消息。
Cassandra 可能不是排队用例的最佳工具,即读取 Cassandra 反模式队列和队列,如 datasets。建议对这些表使用 LeveledCompaction 和 small GC grace 设置,以允许快速删除 tombstoned 行。
19.8. idempotent 存储库
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
列,可以扩展以使用不同的数据模型。
选项 | 默认 | 描述 |
---|---|---|
|
| 表名称 |
|
| 主键列 |
|
仓库名称,用于 | |
| 生存密钥时间 | |
|
用于插入/删除密钥的一致性级别:NY、 | |
|
用于读取/检查密钥的一致性级别: |
19.9. 聚合存储库
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;
或者,Cas1AggregationRepository
没有 NAME
列,可以扩展为使用不同的数据模型。
选项 | 默认 | 描述 |
---|---|---|
|
| 表名称 |
|
| 主键列 |
|
| exchange Id 列 |
|
| Exchange content 列 |
|
仓库名称,用于 | |
| 交换生存时间 | |
|
用于插入/删除交换的一致性级别:NY、 | |
|
用于读取/检查交换的一致性级别: |
19.10. 例子
要在表上插入一些内容,您可以使用以下代码:
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")
相同的方法可用于更新或查询表。
19.11. Spring Boot Auto-Configuration
组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 20 章 CICS
从 Camel 4.4-redhat
仅支持生成者。
此组件允许您与 IBM CICS® 通用事务处理子系统交互。
仅支持同步模式调用。
20.1. 依赖项
在将 camel-cics
与 Camel Spring Boot 搭配使用时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-cics-starter</artifactId> </dependency>
在使用 camel-cics
starer 时,还必须声明 ctgclient.jar
依赖项。
<dependency> <artifactId>com.ibm</artifactId> <groupId>ctgclient</groupId> <scope>system</scope> <systemPath>${basedir}/lib/ctgclient.jar</systemPath> </dependency>
此 JAR 由 IBM 提供,包含在 cics
系统中。
20.2. URI 格式
cics://[interfaceType]/[dataExchangeType][?options]
其中 interfaceType
是 camel-cics
调用的外部 API 的 CICS 集。目前,只支持 ECI (外部调用接口)。此组件使用两种类型的 dataExchangeType
与 CICS 服务器通信。
-
commarea
是一个存储块,限制为由程序分配的 32763 字节。 -
channel
是交换数据的新机制,类似于参数列表。
默认情况下,如果没有指定 dataExchangeType
,这个组件会 使用逗号
:
cics://eci?host=xxx&port=xxx...
要使用 频道和
容器,您必须在 URI 中明确指定它
cics://eci/channel?host=xxx&port=xxx...
20.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
20.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
20.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
20.4. 组件选项
CICS 组件支持 17 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
ctgDebug | 在底层 IBM CGT 客户端上启用调试模式。 | false | java.lang.Boolean |
eciBinding | 将 Camel Exchange 转换为 EciRequest 的 Binding 实例,反之亦然 | com.redhat.camel.component.cics.CICSEciBinding | |
eciTimeout | 与此 ECIRequest 对象关联的 ECI 超时值。ECI 超时值为零表示此 ECIRequest 不会由 CICS 交易网关超时。大于零的 ECI 超时值表示 CICS 事务网关可能会超时 ECIRequest。在从 CICS 收到响应前,ECI 超时可能会过期。这意味着,客户端不会收到来自 CICS 的确认,因为已支持或提交工作单元。 | 0 | short |
编码 | 消息的传输编码。 | Cp1145 | java.lang.String |
gatewayFactory | 要使用的连接工厂 | com.redhat.camel.component.cics.pool.CICSGatewayFactory | |
主机 | 此实例连接的 CICS 事务网关的地址 | java.lang.String | |
lazyStartProducer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | 布尔值 | |
port | 此实例连接的 CICS 事务网关的端口。 | 2006 | int |
protocol | 此组件将用于连接到 CICS 事务网关的协议。 | tcp | java.lang.String |
server | 此实例连接的 CICS 服务器的地址。 | java.lang.String | |
sslKeyring | 用于客户端加密连接的 SSL 密钥环类或密钥存储文件的完整类名称。 | java.lang.String | |
sslPassword | 加密密钥环类或密钥存储的密码 | java.lang.String | |
配置 | 使用共享的 CICS 配置 | com.redhat.camel.component.cics.CICSConfiguration | |
socketConnectionTimeout | 套接字连接超时 | int | |
password | 用于身份验证的密码 | java.lang.String | |
userId | 用于身份验证的用户 ID | java.lang.String |
20.5. 端点选项
CICS 端点使用 URI 语法进行配置:
cics://[interfaceType]/[dataExchangeType][?options]
使用以下 路径和 查询参数 :
20.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
interfaceType | 接口类型可以是 eci、esi 或 epi。目前只支持 eci。 | eci | java.lang.String |
dataExchangeType | 使用 Enum 值的数据交换类型:
| commarea | com.redhat.camel.component.cics.support.CICSDataExchangeType |
20.5.2. 查询参数(15 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
ctgDebug | 在底层 IBM CGT 客户端上启用调试模式。 | false | java.lang.Boolean |
eciBinding | 将 Camel Exchange 转换为 EciRequest 的 Binding 实例,反之亦然 | com.redhat.camel.component.cics.CICSEciBinding | |
eciTimeout | 与此 ECIRequest 对象关联的 ECI 超时值。ECI 超时值为零表示此 ECIRequest 不会由 CICS 交易网关超时。大于零的 ECI 超时值表示 CICS 事务网关可能会超时 ECIRequest。在从 CICS 收到响应前,ECI 超时可能会过期。这意味着,客户端不会收到来自 CICS 的确认,因为已支持或提交工作单元。 | 0 | short |
编码 | 在发送前将 COMMAREA 数据转换为编码。 | Cp1145 | java.lang.String |
gatewayFactory | 要使用的连接工厂 | com.redhat.camel.component.cics.pool.CICSGatewayFactory | |
主机 | 此实例连接的 CICS 事务网关的地址 | localhost | java.lang.String |
port | 此实例连接的 CICS 事务网关的端口。 | 2006 | int |
protocol | 此组件将用于连接到 CICS 事务网关的协议。 | tcp | java.lang.String |
server | 此实例连接的 CICS 服务器的地址 | java.lang.String | |
lazyStartProducer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | 布尔值 | |
sslKeyring | 用于客户端加密连接的 SSL 密钥环类或密钥存储文件的完整类名称 | java.lang.String | |
sslPassword | 加密密钥环类或密钥存储的密码 | java.lang.String | |
socketConnectionTimeout | 套接字连接超时 | int | |
password | 用于身份验证的密码 | java.lang.String | |
userId | 用于身份验证的用户 ID | java.lang.String |
20.6. 消息标头
CICS 组件支持 15 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CICS_RETURN_CODE | 从此流操作返回代码。 | int | |
CICS_RETURN_CODE_STRING | CICS 将代码返回为 String。String 是适当的 Java 常数的名称,例如,如果此标头是 ECI_NO_ERROR,则返回的字符串将是 ECI_NO_ERROR。如果这个标头未知,则返回的字符串将是 ECI_UNKNOWN_CICS_RC。 注意 对于 CICS,返回的代码可能有多个意味着返回的字符串是返回代码的串联。唯一的串联字符串是:ECI_ERR_REQUEST_TIMEOUT_OR_ERR_NO_REPLY。 | java.ang.String | |
CICS_EXTEND_MODE | 扩展请求的模式。默认值为 ECI_NO_EXTEND。 | int | |
CICS_LUW_TOKEN | 扩展工作令牌的逻辑单元。默认值为 ECI_LUW_NEW。 | int | |
CICS_PROGRAM_NAME | 在 CICS 服务器上调用的程序。 | java.lang.String | |
CICS_TRANSACTION_ID | 在其下运行 CICS 程序的事务 ID。 | java.lang.String | |
CICS_COMM_AREA_SIZE | COMMAREA 的长度。默认值为 0。 | int | |
CICS_CHANNEL_NAME | 创建 com.redhat.camel.component.cics.CICSConstants#CICS_CHANNEL_NAME_HEADER 的频道名称 | java.lang.String | |
CICS_CONTAINER_NAME | 要创建的容器的名称。 | java.lang.String | |
CICS_CHANNEL_CCSID | 频道应设置为其默认值的 CCSID。 | int | |
CICS_SERVER | CICS 服务器将请求定向到.此标头覆盖端点中配置的值。 | java.lang.String | |
CICS_USER_ID | CICS 服务器的用户 ID。此标头覆盖端点中配置的值。 | java.lang.String | |
CICS_PASSWORD | CICS 服务器的密码或密码短语。此标头覆盖端点中配置的值。 | java.lang.String | |
CICS_ABEND_CODE | CICS 事务处理 abend 代码。 | java.lang.String | |
CICS_ECI_REQUEST_TIMEOUT | 当前 ECIRequest 的 ECI 超时的值(以秒为单位)。值为零表示 CICS 事务网关不会超时此 ECIRequest | 0 | short |
CICS_ENCODING | 在发送前将 COMMAREA 数据转换为编码。 | 字符串 |
20.7. Samples
20.7.1. 使用 Commarea
以下示例演示了如何配置使用 COMMAREA 在 CICS 服务器上运行程序的路由。COMMAREA 大小必须在 CICS_COMM_AREA_SIZE
标头中定义,而 COMMAREA 输入数据在 Camel Exchange 正文中定义。
您必须创建一个足够大的 COMMAREA,使其包含要发送到服务器的所有信息,并足够大,以包含可以从服务器返回的所有信息。
//..... import static com.redhat.camel.component.cics.CICSConstants.CICS_PROGRAM_NAME_HEADER; import static com.redhat.camel.component.cics.CICSConstants.CICS_COMM_AREA_SIZE_HEADER; //.... from("direct:run"). setHeader(CICS_PROGRAM_NAME_HEADER, "ECIREADY"). setHeader(CICS_COMM_AREA_SIZE_HEADER, 18). setBody(constant("My input data")). to("cics:eci/commarea?host=192.168.0.23&port=2006&protocol=tcp&userId=foo&password=bar");
CICS 程序调用的 Outcome 以这种方式映射到 Camel Exchange:
-
返回代码的数字值保存在
CICS_RETURN_CODE
标头中 - COMMAREA 输出数据存储在 Camel Exchange Body 中。
20.7.2. 使用带有单个输入容器的 Channel
以下示例演示了如何将频道与单个容器一起使用来运行 CICS 程序。频道名称和容器名称来自标头,容器值来自正文:
//..... import static com.redhat.camel.component.cics.CICSConstants.CICS_PROGRAM_NAME_HEADER; import static com.redhat.camel.component.cics.CICSConstants.CICS_CHANNEL_NAME_HEADER; import static com.redhat.camel.component.cics.CICSConstants.CICS_CONTAINER_NAME_HEADER; //... from("direct:run"). setHeader(CICS_PROGRAM_NAME_HEADER, "EC03"). setHeader(CICS_CHANNEL_NAME_HEADER, "SAMPLECHANNEL"). setHeader(CICS_CONTAINER_NAME_HEADER, "INPUTDATA"). setBody(constant("My input data")). to("cics:eci/channel?host=192.168.0.23&port=2006&protocol=tcp&userId=foo&password=bar");
返回的容器存储在 java.util.Map<String,Object
> 中,键是容器名称,值是容器的输出数据。
20.7.3. 使用带有多个输入容器的 Channel
如果您需要运行一个将多个容器的 CICS 程序作为输入,您可以创建一个 java.util.Map<String,Object&
gt;,其中键是容器名称,值是输入数据。在这种情况下,CICS_CONTAINER_NAME
标头将被忽略。
//..... import static com.redhat.camel.component.cics.CICSConstants.CICS_PROGRAM_NAME_HEADER; import static com.redhat.camel.component.cics.CICSConstants.CICS_CHANNEL_NAME_HEADER; //... from("direct:run"). setHeader(CICS_PROGRAM_NAME_HEADER, "EC03"). setHeader(CICS_CHANNEL_NAME_HEADER, "SAMPLECHANNEL"). process(exchange->{ byte[] thirdContainerData = HexFormat.of().parseHex("e04fd020ea3a6910a2d808002b30309d"); Map<String,Object> containers = Map.of( "firstContainerName", "firstContainerData", "secondContainerName", "secondContainerData", "thirdContainerName", thirdContainerData ); exchange.getMessage().setBody(containers); }). to("cics:eci/channel?host=192.168.0.23&port=2006&protocol=tcp&userId=foo&password=bar");
20.8. Spring Boot Auto-Configuration
组件支持 17 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.cics.binding | 将 Camel Exchange 转换为 EciRequest 的 Binding 实例,反之亦然。 | com.redhat.camel.component.cics.CICSEciBinding | |
camel.component.cics.configuration | 配置。 | com.redhat.camel.component.cics.CICSConfiguration | |
camel.component.cics.ctg-debug | 在底层 IBM CGT 客户端上启用调试模式。 | java.lang.Boolean | |
camel.component.cics.eci-timeout | 与此 ECIRequest 对象关联的 ECI 超时值。ECI 超时值为零表示此 ECIRequest 不会由 CICS 交易网关超时。大于零的 ECI 超时值表示 CICS 事务网关可能会超时 ECIRequest。在从 CICS 收到响应前,ECI 超时可能会过期。这意味着,客户端不会收到来自 CICS 的确认,因为已支持或提交工作单元。 | java.lang.Short | |
camel.component.cics.enabled | 是否启用 cics 组件的自动配置。这默认是启用的。 | java.lang.Boolean | |
camel.component.cics.encoding | 消息的传输编码。 | Cp1145 | java.lang.String |
camel.component.cics.gateway-factory | 要使用的连接工厂。选项是一个 com.redhat.camel.component.cics.pool.CICSGatewayFactory 类型。 | com.redhat.camel.component.cics.pool.CICSGatewayFactory | |
camel.component.cics.host | 此实例连接的 CICS 事务网关的地址 | java.lang.String | |
camel.component.cics.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | java.lang.Boolean | |
camel.component.cics.password | 用于身份验证的密码 | java.lang.String | |
camel.component.cics.port | 此实例连接的 CICS 事务网关的端口。 | 2006 | java.lang.Integer |
camel.component.cics.protocol | 此组件将用于连接到 CICS 事务网关的协议。 | tcp | java.lang.String |
camel.component.cics.server | 此实例连接的 CICS 服务器的地址 | java.lang.String | |
camel.component.cics.socket-connection-timeout | 套接字连接超时 | java.lang.Integer | |
camel.component.cics.ssl-keyring | 用于客户端加密连接的 SSL 密钥环类或密钥存储文件的完整类名称 | java.lang.String | |
camel.component.cics.ssl-password | 加密密钥环类或密钥存储的密码 | java.lang.String | |
camel.component.cics.user-id | 用于身份验证的用户 ID | java.lang.String |
第 21 章 常数
Constant Expression Language 只是使用恒定值或对象的方法。
这是一个固定的常量值(或对象),只在启动路由时设置一次,如果您希望在路由过程中需要动态值,则不要使用它。
21.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 常量
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-core-starter</artifactId> </dependency>
21.2. 常量选项
Constant 语言支持 2 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
resultType |
| 设置恒定类型的类名称。 | |
trim |
| 是否修剪值以移除前导和结尾的空格和换行符。 |
21.3. 示例
setHeader
EIP 可以使用一个常量表达式,如下所示:
<route> <from uri="seda:a"/> <setHeader name="theHeader"> <constant>the value</constant> </setHeader> <to uri="mock:b"/> </route>
在这种情况下,来自 seda:a 端点的消息将包含标头 ,并将标头
设为 value
(字符串 type)。
使用 Java DSL 的同一示例:
from("seda:a") .setHeader("theHeader", constant("the value")) .to("mock:b");
21.3.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>
21.4. 从外部资源加载常数
您可以对常量进行外部化,并让 Camel 从资源(如 "classpath:"
、"file:"
或 "http:"
)加载它。
这可以通过以下语法完成:" resource:scheme:location"
,例如引用您可以进行的类路径上的文件:
.setHeader("myHeader").constant("resource:classpath:constant.txt")
21.5. 依赖项
Constant 语言是 camel-core 的一部分。
21.6. Spring Boot Auto-Configuration
组件支持 147 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 使用客户端查找时设置客户端密钥存储数据。 | 字符串 | |
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 using environment,环境变量用于查找服务。默认情况下使用环境。 | 环境 | 字符串 |
camel.cloud.kubernetes.service-discovery.master-url | 在使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用来自 ENV 变量 KUBERNETES_MASTER 的命名空间。 | 字符串 | |
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 ()的影响类似,除非继续跟踪指标,知道它是否应该是 open/closed,此属性即使实例化一个断路器。 | 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 ()的错误百分比如何。如果设为 true,则 circuitBreakerForceOpen ()属性具有优先权。 | false | 布尔值 |
camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(接受),并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
camel.hystrix.circuit-breaker-request-volume-threshold | metricsRollingStatisticalWindowInMilliseconds ()中的最少请求数必须存在于 HystrixCircuitBreaker 之前。如果此数字低于这个数字,无论错误百分比如何,电路都不会被出差。 | 20 | 整数 |
camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreaker trips 之后的时间(以毫秒为单位),它应该在尝试请求前等待。 | 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 ()的并发请求数。超过并发限制的请求将被拒绝。仅在执行IsolationStrategy == SEMAPHORE 时使用。 | 20 | 整数 |
camel.hystrix.execution-isolation-strategy | 将通过什么隔离策略 HystrixCommand.run ()执行。如果 THREAD,它将在单独的线程上执行,并且受 thread-pool 中的线程数量限制的并发请求。如果 SEMAPHORE,它将在调用线程上执行,并且受 semaphore 数限制的并发请求。 | 线程 | 字符串 |
camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 future#cancel)。仅在执行IsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
camel.hystrix.execution-timeout-in-milliseconds | 以毫秒为单位,将命令超时和停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 且命令是线程隔离,则执行线程将中断。如果命令是 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 | 设置要使用的 group 键。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
camel.hystrix.keep-alive-time | 更长的时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会立即更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
camel.hystrix.maximum-size | 传递给 ThreadPoolExecutor#setMaximumPoolSize (int)的最大 thread-pool 大小。这是可在不开始拒绝 HystrixCommands 的情况下支持的最大并发数量。请注意,只有在您也设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 在允许计算成功和错误百分比时等待的时间(以毫秒为单位),并影响 HystrixCircuitBreaker.isOpen ()状态。在高容量电路上,错误百分比的连续计算可能会成为 CPU 密集型,从而控制其计算的频率。 | 500 | 整数 |
camel.hystrix.metrics-rolling-percentile-bucket-size | 滚动百分比的每个存储桶中存储的最大值数。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 10 | 整数 |
camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 内部 HystrixCommandMetrics 来捕获百分比的指标。 | true | 布尔值 |
camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动窗口的存储桶数量被分成。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 6 | 整数 |
camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的滚动窗口的持续时间。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 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 | 队列大小拒绝阈值是 artificial max size,即使尚未达到 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 过渡到 open,并启动短路调用。阈值必须大于 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 | 配置滑动窗口的大小,该窗口用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置滑动窗口的大小。滑动窗口可以是基于计数或基于时间的窗口。如果 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 | 配置滑动窗口的类型,用于记录 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 会将调用视为较慢。当较慢的调用百分比相等或大于阈值时,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 的 Camel 组件名称(如 swagger)如果没有明确配置 API 组件,则 Camel 会查找负责服务并生成 REST API 文档的 Camel 组件,或者如果 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
camel.rest.api-context-path | 设置领导的 API 上下文路径将使用的 REST API 服务。这在使用使用 context-path 部署 Web 应用程序的组件(如 camel-servlet )时使用它。 | 字符串 | |
camel.rest.api-context-route-id | 设置用于服务 REST API 的路由的路由 ID。默认情况下,路由将使用自动分配的路由 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 标头是否受到其 consume/produces 设置的 Rest-DSL 配置的支持。这可以打开,以启用此检查。如果验证错误,则返回 HTTP Status code 415 或 406。默认值为 false。 | false | 布尔值 |
camel.rest.component | 用于 REST 传输(consumer)的 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 部署 Web 应用程序的组件(如 camel-servlet )时使用它。或者对于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | Map | |
camel.rest.data-format-property | 允许为使用的数据格式配置多个额外属性。例如,将属性 prettyPrint 设置为 true,以便以用户友善模式输出 json。属性可以加上前缀来表示选项仅适用于 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 | 布尔值 |
第 22 章 控制总线
仅支持生成者
来自 EIP 模式的控制总线允许从框架内监控和管理集成系统。
使用控制总线管理企业集成系统。Control Bus 使用与应用程序数据相同的消息传递机制,但使用单独的频道传输与消息流中涉及的组件管理相关的数据。
在 Camel 中,您可以使用 JMX 来管理和监控,或者使用来自 CamelContext
的 Java API,或者从 org.apache.camel.api.management
软件包,或使用此处示例的事件通知程序。
ControlBus 组件根据控制总线 EIP 模式简化 Camel 应用程序管理。例如,通过向 Endpoint 发送消息,您可以控制路由的生命周期或收集性能统计信息。
controlbus:command[?options]
其中 command 可以是任意字符串来标识要使用的命令类型。
22.1. 命令
命令 | 描述 |
---|---|
|
使用 |
| 允许您指定 a 用于评估邮件正文。如果评估中有任何结果,则结果将置于邮件正文中。 |
22.2. 依赖项
当在 Camel Spring Boot 中使用 controlbus
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-controlbus-starter</artifactId> </dependency>
22.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
22.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
22.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
22.4. 组件选项
Control Bus 组件支持 2 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
22.5. 端点选项
Control Bus 端点使用 URI 语法进行配置:
controlbus:command:language
使用以下路径和查询参数:
22.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
command (producer) | 必需 的命令可以是 route 或 language。 Enum 值:
| 字符串 | |
language (producer) | 允许您指定用于评估邮件正文的语言名称。如果评估中有任何结果,则结果将置于邮件正文中。 Enum 值:
| 语言 |
22.5.1.1. 查询参数(6 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
action (producer) | 表示可以是:start、stop 或 status 的操作。要启动或停止路由,或者以消息正文中的输出形式获取路由的状态。您可以使用 suspend 并从 Camel 2.11.1 恢复,以挂起或恢复路由。从 Camel 2.11.1 开始,您可以使用 stats 获取以 XML 格式返回的性能静态;routeId 选项可用于定义哪个路由来获取性能统计数据,如果未定义 routeId,则获取整个 CamelContext 的统计信息。restart 操作将重启路由。 Enum 值:
| 字符串 | |
async (producer) | 是否异步执行控制总线任务。重要:如果启用了这个选项,则在 Exchange 上不会设置任务的任何结果。这只有在同步执行任务时才可能。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
loggingLevel (producer) | 任务完成后用于日志记录的日志记录级别,或者在处理任务过程中发生异常。 Enum 值:
| INFO | LoggingLevel |
restartDelay (producer) | 重启路由时要使用的延迟。 | 1000 | int |
routeId (producer) | 通过其 id 指定路由。special 关键字 current 表示当前路由。 | 字符串 |
22.6. 使用 route 命令
route 命令允许您在给定路由上非常轻松地执行常见任务,例如启动路由,您可以将空消息发送到此端点:
template.sendBody("controlbus:route?routeId=foo&action=start", null);
要获取路由的状态,您可以:
String status = template.requestBody("controlbus:route?routeId=foo&action=status", null, String.class);
22.7. 获取性能统计信息
这要求启用 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);
22.8. 使用简单语言
您可以将 Simple 语言与控制总线一起使用,例如停止特定路由,您可以向 "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 等。
22.9. Spring Boot Auto-Configuration
组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.controlbus.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.controlbus.enabled | 是否启用 controlbus 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.controlbus.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 23 章 cron
仅支持消费者
Cron 组件是一个通用接口组件,它允许以特定时间间隔触发事件,使用 Unix cron 语法(如 0/2 * ?
)来每两秒触发事件。
是一个接口组件,Cron 组件不包含默认的实现,而是要求用户插件自己选择的实现。
以下标准 Camel 组件支持 Cron 端点:
- camel-quartz
- camel-spring
Camel K 中也支持 Cron 组件,该组件可以使用 Kubernetes 调度程序在 cron 表达式需要时触发路由。当使用与 Kubernetes cron 语法兼容的 cron 表达式时,Camel K 不需要插入额外的库。
23.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 cron
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-cron-starter</artifactId> </dependency>
为了插入特定实施,可能需要其他库。
23.2. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
23.2.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
23.2.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
23.3. 组件选项
Cron 组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
cronService (advanced) | 提供多个实现时要使用的 CamelCronService 的 id。 | 字符串 |
23.4. 端点选项
Cron 端点使用 URI 语法进行配置:
cron:name
使用以下路径和查询参数:
23.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (consumer) | 必需 cron 触发器的名称。 | 字符串 |
23.4.2. 查询参数(4 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
schedule (consumer) | 必需 用于生成事件的 cron 表达式。 | 字符串 | |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern |
23.5. 使用方法
组件可用于在指定时间触发事件,如下例所示:
from("cron:tab?schedule=0/1+*+*+*+*+?") .setBody().constant("event") .log("${body}");
调度表达式 0/3+10+*+?
也可以写为 0/3 10 * * * ?
,并只会在每小时的十分钟内每三秒触发一次事件。
调度表达式中的部分表示(按顺序):
- 秒(可选)
- 分钟
- 小时
- 几天
- 月
- 星期几
- 年(可选)
调度表达式可由 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>
23.6. Spring Boot Auto-Configuration
组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 组件的自动配置。这默认是启用的。 | 布尔值 |
第 24 章 crypto (JCE)
Since Camel 2.3
仅支持生成者
使用 Camel 加密端点和 Java Cryptographic 扩展时,可轻松为交换创建数字签名。Camel 提供了一对灵活的端点,用于 concert 用于在交换工作流的一个部分中为交换创建签名,然后在工作流的后续部分中验证签名。
24.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 crypto
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-crypto-starter</artifactId> </dependency>
24.2. 简介
数字签名使用 Asymmetric Cryptographic 技术为消息签名。从高级别上,算法使用 complimentary 密钥对以及使用一个密钥加密的特殊属性的特殊属性,只能相互解密。私钥 紧密保护并用于"签署"消息,而其他公钥则共享给有兴趣验证签名邮件的任何人。消息使用私钥签名,以加密消息摘要。这个加密摘要会与消息一起传输。在其他一端,verifier 会重新计算消息摘要,并使用公钥解密签名中的摘要。如果两个摘要都匹配,verifier 知道私钥的拥有者只能创建签名。
Camel 使用 Java Cryptographic 扩展中的 Signature 服务来执行创建交换签名所需的所有重度加密机制。以下是解释 Cryptography、Message 摘要和数字签名的机制以及如何通过 JCE 使用它们的资源。
- Bruce Schneier 的 Applied Cryptography
- 开始使用 Java 被 David Hook 开始
- 过时的 Wikipedia Digital_signatures
24.3. URI 格式
Camel 提供一对加密端点来创建和验证签名
crypto:sign:name[?options] crypto:verify:name[?options]
-
crypto:sign
创建签名,并将其存储在由恒定的org.apache.camel.component.crypto.DigitalSignatureConstants.SIGNATURE
(即"CamelDigitalSignature")的标头中
。 -
crypto:verify
读取此标头的内容,并执行验证计算。
要正常工作,签名和验证过程需要共享一对密钥,签名需要 PrivateKey
并验证公共密钥(或包含 证书
)。使用 JCE 时,生成这些密钥对非常简单,但通常最好使用 KeyStore 来托管和共享您的密钥。DSL 对如何提供密钥并提供了多个机制非常灵活。
crypto:sign
端点通常在一个路由中定义,在另一个路由中包括 complimentary crypto:verify
,但对于简单,它们出现在另一个路由后显示的示例。签名和验证应相同配置。
24.4. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
24.4.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
24.4.2. 配置端点选项
端点有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点直接在端点 URI 中作为路径和查询参数完成。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式 的安全 方法。
使用 Property Placeholders 配置不允许硬编码 URL、端口号、敏感信息和其他设置的选项。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
24.5. 组件选项
Crypto (JCE)组件支持以下列出的 21 个选项。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
algorithm (producer) | 设置用于签名者的算法的 JCE 名称。 | SHA256withRSA | 字符串 |
alias (producer) | 设置用于查询键和 \\{link java.security.cert.Certificate Certificates} 的别名,以签名和验证交换。此值可以在运行时通过消息标头 org.apache.camel.component.crypto.DigitalSignatureConstants#KEYSTORE_ALIAS 提供。 | 字符串 | |
certificateName (producer) | 为 registry 中找到的 PrivateKey 设置引用名称。 | 字符串 | |
keystore (producer) | 设置可包含用于签名和验证交换的密钥和证书的 KeyStore。KeyStore 通常与别名一起使用,可以是在 Route 定义中提供的,或者通过消息标头 CamelSignatureKeyStoreAlias 进行动态使用。如果没有提供别名,且密钥存储中只有一个条目,则将使用此单个条目。 | KeyStore | |
keystoreName (producer) | 为 registry 中找到的密钥存储设置引用名称。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
privateKey* (producer) | 设置用于为交换签名的 PrivateKey。 | PrivateKey | |
privateKeyName (producer) | 为 registry 中找到的 PrivateKey 设置引用名称。 | 字符串 | |
provider (producer) | 设置提供配置的 Signature 算法的安全供应商的 id。 | 字符串 | |
publicKeyName (producer) | 在上下文更改时应解析的引用。 | 字符串 | |
secureRandomName (producer) | 为 registry 中找到的 SecureRandom 设置引用名称。 | 字符串 | |
signatureHeaderName (producer) | 设置应该用于存储 base64 编码签名的消息标头名称。默认值为 'CamelDigitalSignature'。 | 字符串 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
bufferSize (advanced) | 设置用于在 Exchange 有效负载数据中读取的缓冲区的大小。 | 2048 | 整数 |
证书 (advanced) | 设置应用来根据其有效负载验证交换中的签名的证书。 | 证书 | |
clearHeaders (advanced) | 确定签名和验证后是否清除了签名特定标头。默认为 true,且应只在每个情况下进行其他影响,因为如果未设置,密钥和密码等重要私有信息可能会转义。 | true | 布尔值 |
configuration (advanced) | 使用 shared DigitalSignatureConfiguration 作为配置。 | DigitalSignatureConfiguration | |
keyStoreParameters (advanced) | 根据给定的 KeyStoreParameters 设置可包含用于签名和验证交换的密钥和 Certficates 的 KeyStore。KeyStore 通常与别名一起使用,可以是在 Route 定义中提供的,或者通过消息标头 CamelSignatureKeyStoreAlias 进行动态使用。如果没有提供别名,且密钥存储中只有一个条目,则将使用此单个条目。 | KeyStoreParameters | |
Publickey (advanced) | 设置用于在交换中验证签名的 PublicKey。 | PublicKey | |
SecureRandom (advanced) | 设置用于初始化 Signature 服务的 SecureRandom。 | SecureRandom | |
password (security) | 设置用于访问 KeyStore 中别名的 PrivateKey 的密码。 | 字符串 |
24.6. 端点选项
Crypto (JCE)端点使用 URI 语法进行配置:
crypto:cryptoOperation:name
以下是 path 和 查询参数:
24.6.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
cryptoOperation (producer) | 必需 在 endpoint uri e.g. crypto:sign 设置签名为操作中的加密方案后提供的 Crypto 操作。 Enum 值: * 符号 * 验证 | CryptoOperation | |
name (producer) | 需要 此操作的逻辑名称。 | 字符串 |
24.6.2. 查询参数(19 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
algorithm (producer) | 设置用于签名者的算法的 JCE 名称。 | SHA256withRSA | 字符串 |
alias (producer) | 设置用于查询键和 \\{link java.security.cert.Certificate Certificates} 的别名,以签名和验证交换。此值可以在运行时通过消息标头 org.apache.camel.component.crypto.DigitalSignatureConstants#KEYSTORE_ALIAS 提供。 | 字符串 | |
certificateName (producer) | 为 registry 中找到的 PrivateKey 设置引用名称。 | 字符串 | |
keystore (producer) | 设置可包含用于签名和验证交换的密钥和 Certficates 的 KeyStore。KeyStore 通常与别名一起使用,可以是在 Route 定义中提供的,或者通过消息标头 CamelSignatureKeyStoreAlias 进行动态使用。如果没有提供别名,且密钥存储中只有一个条目,则将使用此单个条目。 | KeyStore | |
keystoreName (producer) | 为 registry 中找到的密钥存储设置引用名称。 | 字符串 | |
privatekey (producer) | 设置用于为交换签名的 PrivateKey。 | PrivateKey | |
privateKeyName (producer) | 为 registry 中找到的 PrivateKey 设置引用名称。 | 字符串 | |
provider (producer) | 设置提供配置的 Signature 算法的安全供应商的 id。 | 字符串 | |
publicKeyName (producer) | 在上下文更改时应解析的引用。 | 字符串 | |
secureRandomName (producer) | 为 registry 中找到的 SecureRandom 设置引用名称。 | 字符串 | |
signatureHeaderName (producer) | 设置应该用于存储 base64 编码签名的消息标头名称。默认值为 'CamelDigitalSignature'。 | 字符串 | |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过延迟启动,启动失败可以在路由消息时使用 Camel 路由错误处理程序进行处理。请注意,当处理第一个消息时,创建并启动制作者可能需要稍等片刻,并延长总处理时间。 | false | 布尔值 |
bufferSize (advanced) | 设置用于在 Exchange 有效负载数据中读取的缓冲区的大小。 | 2048 | 整数 |
证书 (advanced) | 设置应用来根据其有效负载验证交换中的签名的证书。 | 证书 | |
clearHeaders (advanced) | 确定签名和验证后是否清除了签名特定标头。默认为 true,且应只在每个情况下进行其他影响,因为如果未设置,密钥和密码等重要私有信息可能会转义。 | true | 布尔值 |
keyStoreParameters (advanced) | 根据给定的 KeyStoreParameters 设置可包含用于签名和验证交换的密钥和 Certficates 的 KeyStore。KeyStore 通常与别名一起使用,可以是在 Route 定义中提供的,或者通过消息标头 CamelSignatureKeyStoreAlias 进行动态使用。如果没有提供别名,且密钥存储中只有一个条目,则将使用此单个条目。 | KeyStoreParameters | |
Publickey (advanced) | 设置用于在交换中验证签名的 PublicKey。 | PublicKey | |
SecureRandom (advanced) | 设置用于初始化 Signature 服务的 SecureRandom。 | SecureRandom | |
password (security) | 设置用于访问 KeyStore 中别名的 PrivateKey 的密码。 | 字符串 |
24.7. 消息标头
Crypto (JCE)组件支持下面列出的 4 个消息标头。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
[CamelSignaturePrivateKey (producer) | 应该用来为消息签名的 PrivateKey。 | PrivateKey | |
[CamelSignaturePublicKeyOrCert (producer) | 应该用于验证签名的证书或公钥。 | certificate 或 PublicKey | |
CamelSignatureKeyStoreAlias (producer)
常量 : | 用于查询 KeyStore 的别名,用于签名和验证交换时使用的密钥和证书。 | 字符串 | |
CamelSignatureKeyStorePassword (producer)
常量 : | 用于访问 KeyStore 中别名 PrivateKey 的密码。 | char[] |
24.8. 使用
24.8.1. 原始密钥
签署和验证交换的最基本方法是使用 KeyPair,如下所示:
KeyPair keyPair = KeyGenerator.getInstance("RSA").generateKeyPair(); from("direct:sign") .setHeader(DigitalSignatureConstants.SIGNATURE_PRIVATE_KEY, constant(keys.getPrivate())) .to("crypto:sign:message") .to("direct:verify"); from("direct:verify") .setHeader(DigitalSignatureConstants.SIGNATURE_PUBLIC_KEY_OR_CERT, constant(keys.getPublic())) .to("crypto:verify:check");
可以通过 Spring XML 扩展 (使用对密钥的引用)来实现相同的操作。
24.8.2. keystores 和 Aliases。
JCE 提供了非常通用的密钥存储概念,用于对私钥和证书进行密钥对,使其加密且受密码保护。可以通过将别名应用到检索 API 来检索它们。可以通过多种方式将密钥和证书获取到密钥存储中,最常通过外部"keytool"应用程序完成。
以下命令将创建一个包含由 bob
别名的密钥和证书的密钥存储,如下例所示。密钥存储的密码和密钥是 letmein
。
keytool -genkey -keyalg RSA -keysize 2048 -keystore keystore.jks -storepass letmein -alias bob -dname "CN=Bob,OU=IT,O=Camel" -noprompt
以下路由首先使用与 Camel Registry 绑定的 KeyStore 中的 KeyStore 的别名为交换签名,然后使用同一别名进行验证。
from("direct:sign") .to("crypto:sign:keystoreSign?alias=bob&keystoreName=myKeystore&password=letmein") .log("Signature: ${header.CamelDigitalSignature}") .to("crypto:verify:keystoreVerify?alias=bob&keystoreName=myKeystore&password=letmein") .log("Verified: ${body}");
以下代码演示了如何加载使用上述 keytool
命令创建的密钥存储,并将它绑定到 registry 中用于上述路由中使用的名称 myKeystore
。该示例使用 Camel 3 中引入的 @Configuration
和 @BindToRegistry
注解来实例化 KeyStore,并将它注册到名称 myKeyStore
。
@Configuration public class KeystoreConfig { @BindToRegistry public KeyStore myKeystore() throws Exception { KeyStore store = KeyStore.getInstance("JKS"); try (FileInputStream fis = new FileInputStream("keystore.jks")) { store.load(fis, "letmein".toCharArray()); } return store; } }
在 Spring a ref 中再次用于查找实际的密钥存储实例。
24.8.3. 更改 JCE Provider 和 Algorithm
更改签名算法或安全供应商是指定名称的简单问题。您还需要使用与您选择的算法兼容的密钥。
24.8.4. 更改签名消息标头
可能需要更改用于存储签名的消息标头。路由定义中可以指定不同的标头名称,如下所示
from("direct:sign") .to("crypto:sign:keystoreSign?alias=bob&keystoreName=myKeystore&password=letmein&signatureHeaderName=mySignature") .log("Signature: ${header.mySignature}") .to("crypto:verify:keystoreVerify?alias=bob&keystoreName=myKeystore&password=letmein&signatureHeaderName=mySignature");
===changing the bufferSize
如果需要更新缓冲区的大小。
24.8.5. 动态提供密钥。
当使用 Recipient 列表或类似的 EIP 时,交换的接收者可能会动态变化。在所有接收者中使用相同的密钥可能并不可行。在每次交换时能够动态指定签名密钥会很有用。然后,在签名前,可以使用其目标接收者的密钥动态增强交换。为方便此目的,签名机制允许通过以下消息标头动态提供密钥。
-
DigitalSignatureConstants.SIGNATURE_PRIVATE_KEY
,"CamelSignaturePrivateKey"
-
DigitalSignatureConstants.SIGNATURE_PUBLIC_KEY_OR_CERT
,"CamelSignaturePublicKeyOrCert"
最好是动态提供密钥存储别名。再次在消息标头中提供别名
-
DigitalSignatureConstants.KEYSTORE_ALIAS
,"CamelSignatureKeyStoreAlias"
标头将设置为如下:
Exchange unsigned = getMandatoryEndpoint("direct:alias-sign").createExchange(); unsigned.getIn().setBody(payload); unsigned.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_ALIAS, "bob"); unsigned.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_PASSWORD, "letmein".toCharArray()); template.send("direct:alias-sign", unsigned); Exchange signed = getMandatoryEndpoint("direct:alias-sign").createExchange(); signed.getIn().copyFrom(unsigned.getMessage()); signed.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_ALIAS, "bob"); template.send("direct:alias-verify", signed);
24.9. Spring Boot Auto-Configuration
组件支持下面列出的 47 选项。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.crypto.algorithm | 设置用于签名者的算法的 JCE 名称。 | SHA256withRSA | 字符串 |
camel.component.crypto.alias | 设置用于查询 KeyStore 的别名和 {link java.security.cert.Certificate Certificates},用于签名和验证交换。此值可以在运行时通过消息标头 org.apache.camel.component.crypto.DigitalSignatureConstants#KEYSTORE_ALIAS 提供。 | 字符串 | |
camel.component.crypto.autowired-enabled | 是否启用自动关闭。这用于自动写入选项(选项必须标记为 auto-wired),方法是在 registry 中查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.crypto.buffer-size | 设置用于在 Exchange 有效负载数据中读取的缓冲区的大小。 | 2048 | 整数 |
camel.component.crypto.certificate | 设置应用来根据其有效负载验证交换中的签名的证书。选项是一个 java.security.cert.Certificate 类型。 | 证书 | |
camel.component.crypto.certificate-name | 为 registry 中找到的 PrivateKey 设置引用名称。 | 字符串 | |
camel.component.crypto.clear-headers | 确定签名和验证后是否清除了签名特定标头。默认为 true,且应只在每个情况下进行其他影响,因为如果未设置,密钥和密码等重要私有信息可能会转义。 | true | 布尔值 |
camel.component.crypto.configuration | 使用 shared DigitalSignatureConfiguration 作为配置。选项是 org.apache.camel.component.crypto.DigitalSignatureConfiguration 类型。 | DigitalSignatureConfiguration | |
camel.component.crypto.enabled | 是否启用加密组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.crypto.key-store-parameters | 根据给定的 KeyStoreParameters 设置可包含用于签名和验证交换的密钥和 Certficates 的 KeyStore。KeyStore 通常与别名一起使用,可以是在 Route 定义中提供的,或者通过消息标头 CamelSignatureKeyStoreAlias 进行动态使用。如果没有提供别名,且密钥存储中只有一个条目,则将使用此单个条目。选项是 org.apache.camel.support.jsse.KeyStoreParameters 类型。 | KeyStoreParameters | |
camel.component.crypto.keystore | 设置可包含用于签名和验证交换的密钥和 Certficates 的 KeyStore。KeyStore 通常与别名一起使用,可以是在 Route 定义中提供的,或者通过消息标头 CamelSignatureKeyStoreAlias 进行动态使用。如果没有提供别名,且密钥存储中只有一个条目,则将使用此单个条目。选项是一个 java.security.KeyStore 类型。 | KeyStore | |
camel.component.crypto.keystore-name | 为 registry 中找到的密钥存储设置引用名称。 | 字符串 | |
camel.component.crypto.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过延迟启动,启动失败可以在路由消息期间通过 Camel 路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.crypto.password | 设置用于访问 KeyStore 中别名的 PrivateKey 的密码。 | 字符串 | |
camel.component.crypto.private-key | 设置用于为交换签名的 PrivateKey。选项是一个 java.security.PrivateKey 类型。 | PrivateKey | |
camel.component.crypto.private-key-name | 为 registry 中找到的 PrivateKey 设置引用名称。 | 字符串 | |
camel.component.crypto.provider | 设置提供配置的 Signature 算法的安全供应商的 id。 | 字符串 | |
camel.component.crypto.public-key | 设置用于在交换中验证签名的 PublicKey。选项是一个 java.security.PublicKey 类型。 | PublicKey | |
camel.component.crypto.public-key-name | 在上下文更改时应解析的引用。 | 字符串 | |
camel.component.crypto.secure-random | 设置用于初始化 Signature 服务的 SecureRandom。选项是一个 java.security.SecureRandom 类型。 | SecureRandom | |
camel.component.crypto.secure-random-name | 为 registry 中找到的 SecureRandom 设置引用名称。 | 字符串 | |
camel.component.crypto.signature-header-name | 设置应该用于存储 base64 编码签名的消息标头名称。默认值为 'CamelDigitalSignature'。 | 字符串 | |
camel.dataformat.crypto.algorithm | JCE 算法名称表示要使用的加密算法。 | 字符串 | |
camel.dataformat.crypto.algorithm-parameter-ref | 用于初始化 Cipher 的 JCE AlgorithmParameterSpec。将使用指定名称作为 java.security.spec.AlgorithmParameterSpec 类型查找类型。 | 字符串 | |
camel.dataformat.crypto.buffer-size | 签名过程中使用的缓冲区的大小。 | 4096 | 整数 |
camel.dataformat.crypto.crypto-provider | 应使用的 JCE 安全提供程序的名称。 | 字符串 | |
camel.dataformat.crypto.enabled | 是否启用加密数据格式的自动配置。这默认是启用的。 | 布尔值 | |
camel.dataformat.crypto.init-vector-ref | 指的是包含初始化 Cipher 的初始化向量的字节阵列。 | 字符串 | |
camel.dataformat.crypto.inline | 表示配置的 IV 应该内联到加密的数据流中的标记。默认为 false。 | false | 布尔值 |
camel.dataformat.crypto.key-ref | 引用要从要使用的注册中查找的 secret 密钥。 | 字符串 | |
camel.dataformat.crypto.mac-algorithm | JCE 算法名称代表消息身份验证算法。 | HmacSHA1 | 字符串 |
camel.dataformat.crypto.should-append-h-m-a-c | 表示应计算消息身份验证代码并附加到加密数据的标记。 | true | 布尔值 |
camel.dataformat.pgp.algorithm | 对称密钥加密算法;可能的值在 org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags 中定义;例如 2 (= TRIPLE DES), 3 (= CAST5), 4 (= BLOWFISH), 6 (= DES), 7 (= AES_128)。仅与加密相关。 | 整数 | |
camel.dataformat.pgp.armored | 此选项将导致 PGP 对加密文本进行 base64 编码,使它可用于复制/粘贴等。 | false | 布尔值 |
camel.dataformat.pgp.compression-algorithm | 压缩算法; 可能的值在 org.bouncycastle.bcpg.CompressionAlgorithmTags 中定义;例如 0 (= UNCOMPRESSED), 1 (= ZIP), 2 (= ZLIB), 3 (= BZIP2)。仅与加密相关。 | 整数 | |
camel.dataformat.pgp.enabled | 是否启用 pgp 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
camel.dataformat.pgp.hash-algorithm | 签名哈希算法; 可能的值在 org.bouncycastle.bcpg.HashAlgorithmTags 中定义;例如 2 (= SHA1), 8 (= SHA256), 9 (= SHA384), 10 (= SHA512), 11 (=SHA224)。仅与签名相关。 | 整数 | |
camel.dataformat.pgp.integrity | 将完整性检查/签名添加到加密文件中。默认值为 true。 | true | 布尔值 |
camel.dataformat.pgp.key-file-name | keyring 的文件名; 必须作为类路径资源访问(但您可以使用 file: 前缀指定文件系统中的位置)。 | 字符串 | |
camel.dataformat.pgp.key-userid | 在加密过程中使用的 PGP 密钥环中的密钥用户 ID。也可以是用户 ID 的一部分。例如,如果用户 ID 是 Test User,您可以使用 part Test User 或处理用户 ID。 | 字符串 | |
camel.dataformat.pgp.password | 打开私钥时使用的密码(不用于加密)。 | 字符串 | |
camel.dataformat.pgp.provider | Java Cryptography 扩展(JCE)供应商,默认为 Bouncy Castle (BC)。或者,您可以使用 IAIK JCE 供应商;在这种情况下,必须先注册该提供程序,并且必须事先注册 Bouncy Castle 供应商。Sun JCE 供应商无法正常工作。 | 字符串 | |
camel.dataformat.pgp.signature-key-file-name | 用于签名(确保加密)或签名验证(确保解密)的密钥环的文件名;必须作为类路径资源访问(但您可以使用 file: 前缀指定文件系统中的位置)。 | 字符串 | |
camel.dataformat.pgp.signature-key-ring | 用于签名/验证作为字节数组的密钥环。您不能同时设置 signatureKeyFileName 和 signatureKeyRing。 | 字符串 | |
camel.dataformat.pgp.signature-key-userid | 用于签名(确保加密)或签名验证(确保解密)的 PGP 密钥环中的密钥的用户 ID。在签名验证过程中,指定用户 ID 会限制来自公共密钥环的公钥,该密钥环可用于验证。如果没有为签名验证指定用户 ID,则可以使用公钥进行验证。也可以是用户 ID 的一部分。例如,如果用户 ID 是 Test User,您可以使用 part Test User 或处理用户 ID。 | 字符串 | |
camel.dataformat.pgp.signature-password | 打开用于签名(确保加密)的私钥时使用的密码。 | 字符串 | |
camel.dataformat.pgp.signature-verification-option | 控制在未处理过程中验证签名的行为。有 4 个值:可选:PGP 消息可能或可能不包含签名;如果它包含签名,则执行签名验证。需要:PGP 消息必须至少包含一个签名;如果这不是抛出异常(PGPException)的情况。执行签名验证。忽略:在 PGP 消息中包含签名会被忽略;没有执行签名验证。no_signature_allowed: PGP 消息不得包含签名;否则会抛出异常(PGPException)。 | 字符串 |
第 25 章 CSimple
CSimple 语言 编译 了 Simple 语言。
25.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 Csimple 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-core-starter</artifactId> </dependency>
25.2. CSimple 和 Simple 之间的不同
简单语言是一种动态表达式语言,被运行时解析为一组 Camel Expressions 或 Predicates。
Csimple 语言被解析为常规 Java 源代码,并与所有其他源代码一起编译,或者在通过 camel-csimple-joor
模块 bootstrap 期间编译一次。
简单语言通常非常轻便且快,但对于一些通过 OGNL 路径进行动态方法调用的用例,则简单的语言执行运行时内省和反映调用。这对性能有开销,是创建简单原因的原因之一。
csimple 语言需要通过 OGNL 路径是 typesafe 和 method 调用,需要了解解析期间的类型。这意味着,对于 csimple 语言表达式,您需要在脚本中提供类类型,而简单的内省则在运行时是这个类。
换句话说,简单语言使用 duck typing (如果看起来像一个 duck )和 quacks (像 duck),那么它是一个 duck,而 csimple 则正在使用 Java 类型(类型安全)。如果有类型错误,则 simple 会在运行时报告此功能,而 csimple 会出现 Java 编译错误。
25.2.1. 额外的 CSimple 功能
csimple 语言包括一些额外的函数,它们支持使用 Collection
, Map
或数组类型的一般用例。以下函数 bodyAsIndex、headerAsIndex 和 exchangePropertyAsIndex 用于这些用例,因为它们被输入。
功能 | 类型 | 描述 |
---|---|---|
bodyAsIndex(type, index) | 类型 |
为了用于从现有的 |
mandatoryBodyAsIndex(type, index) | 类型 |
为了用于从现有的 |
headerAsIndex (键,type,index) | 类型 |
为了用于从现有的 |
mandatoryHeaderAsIndex (key,type,index) | 类型 |
为了用于从现有的 |
exchangePropertyAsIndex(key, type, index) | 类型 |
为了用于从现有的 |
mandatoryExchangePropertyAsIndex(key, type, index) | 类型 |
为了用于从现有的 |
例如,给出以下简单表达式:
Hello $\{body[0].name}
此脚本没有类型信息,简单语言将在运行时解决,方法是内省消息正文,如果基于集合,则查找第一个元素,然后通过反映调用名为 getName
的方法。
在 csimple (编译)中,我们希望预编译它,因此最终用户必须使用 bodyAsIndex 功能提供类型信息:
Hello $\{bodyAsIndex(com.foo.MyUser, 0).name}
25.3. 编译
Csimple 语言被解析为常规 Java 源代码,并与所有其他源代码一起编译,或者在通过 camel-csimple-joor
模块 bootstrap 期间编译一次。
编译简单的方法有两种
-
在构建时使用
camel-csimple-maven-plugin
生成源代码。 -
使用
camel-csimple-joor
,它在 Camel bootstrap 过程中执行运行时内存编译。
25.3.1. 使用 camel-csimple-maven-plugin
camel-csimple-maven-plugin
Maven 插件用于发现来自源代码的所有 csimple 脚本,然后在 src/generated/java
文件夹中自动生成源代码,然后编译到所有其他源。
maven 插件将对 .java
和 .xml
文件(Java 和 XML DSL)进行源代码扫描。扫描程序限制检测某些代码模式,如果它们以异常/方式使用,则可能会错过发现一些简单脚本。
使用 camel-csimple-joor
的运行时编译没有这个限制。
好处是所有 csimple 脚本都使用常规 Java 编译器编译,因此所有内容都作为应用程序 JAR 文件中的 .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 文件中。
25.3.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)的运行时编译,它可用于 exploded 类路径。
要使用 camel-simple-joor
,只需将其作为依赖项添加到 classpath 中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-csimple-joor</artifactId> <version>{CamelSBProjectVersion}</version> </dependency>
不需要将 Maven 插件添加到 pom.xml
文件中。
请参阅 camel-example-csimple-joor
示例(Camel Examples),它使用 jOOR 编译器。
25.4. Csimple Language 选项
CSimple 语言支持 2 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
resultType |
| 设置结果类型的类名称(输出中的类型)。 | |
trim |
| 是否修剪值以移除前导和结尾的空格和换行符。 |
25.5. 限制
目前,Csimple 语言 不支持 :
- 嵌套功能(函数中的函数)
-
null 安全运算符 (
?
)。
例如,以下脚本无法编译:
Hello ${bean:greeter(${body}, ${header.counter})}
${bodyAs(MyUser)?.address?.zip} > 10000
25.6. 自动导入
csimple 语言将自动导入:
import java.util.*; import java.util.concurrent.*; import java.util.stream.*; import org.apache.camel.*; import org.apache.camel.util.*;
25.7. 配置文件
您可以在 camel-csimple.properties
文件中配置 csimple 语言,该文件是从 root 类路径加载的。
例如,您可以通过添加以下内容在 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)}"))
25.8. 另请参阅
请参阅 简单 语言,因为 csimple
具有与简单语言相同的功能集合。
25.9. Spring Boot Auto-Configuration
组件支持 147 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 使用客户端查找时设置客户端密钥存储数据。 | 字符串 | |
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 using environment,环境变量用于查找服务。默认情况下使用环境。 | 环境 | 字符串 |
camel.cloud.kubernetes.service-discovery.master-url | 在使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用来自 ENV 变量 KUBERNETES_MASTER 的命名空间。 | 字符串 | |
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 ()的影响类似,除非继续跟踪指标,知道它是否应该是 open/closed,此属性即使实例化一个断路器。 | 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 ()的错误百分比如何。如果设为 true,则 circuitBreakerForceOpen ()属性具有优先权。 | false | 布尔值 |
camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(接受),并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
camel.hystrix.circuit-breaker-request-volume-threshold | metricsRollingStatisticalWindowInMilliseconds ()中的最少请求数必须存在于 HystrixCircuitBreaker 之前。如果此数字低于这个数字,无论错误百分比如何,电路都不会被出差。 | 20 | 整数 |
camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreaker trips 之后的时间(以毫秒为单位),它应该在尝试请求前等待。 | 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 ()的并发请求数。超过并发限制的请求将被拒绝。仅在执行IsolationStrategy == SEMAPHORE 时使用。 | 20 | 整数 |
camel.hystrix.execution-isolation-strategy | 将通过什么隔离策略 HystrixCommand.run ()执行。如果 THREAD,它将在单独的线程上执行,并且受 thread-pool 中的线程数量限制的并发请求。如果 SEMAPHORE,它将在调用线程上执行,并且受 semaphore 数限制的并发请求。 | 线程 | 字符串 |
camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 future#cancel)。仅在执行IsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
camel.hystrix.execution-timeout-in-milliseconds | 以毫秒为单位,将命令超时和停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 且命令是线程隔离,则执行线程将中断。如果命令是 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 | 设置要使用的 group 键。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
camel.hystrix.keep-alive-time | 更长的时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会立即更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
camel.hystrix.maximum-size | 传递给 ThreadPoolExecutor#setMaximumPoolSize (int)的最大 thread-pool 大小。这是可在不开始拒绝 HystrixCommands 的情况下支持的最大并发数量。请注意,只有在您也设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 在允许计算成功和错误百分比时等待的时间(以毫秒为单位),并影响 HystrixCircuitBreaker.isOpen ()状态。在高容量电路上,错误百分比的连续计算可能会成为 CPU 密集型,从而控制其计算的频率。 | 500 | 整数 |
camel.hystrix.metrics-rolling-percentile-bucket-size | 滚动百分比的每个存储桶中存储的最大值数。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 10 | 整数 |
camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 内部 HystrixCommandMetrics 来捕获百分比的指标。 | true | 布尔值 |
camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动窗口的存储桶数量被分成。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 6 | 整数 |
camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的滚动窗口的持续时间。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 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 | 队列大小拒绝阈值是 artificial max size,即使尚未达到 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 过渡到 open,并启动短路调用。阈值必须大于 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 | 配置滑动窗口的大小,该窗口用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置滑动窗口的大小。滑动窗口可以是基于计数或基于时间的窗口。如果 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 | 配置滑动窗口的类型,用于记录 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 会将调用视为较慢。当较慢的调用百分比相等或大于阈值时,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 的 Camel 组件名称(如 swagger)如果没有明确配置 API 组件,则 Camel 会查找负责服务并生成 REST API 文档的 Camel 组件,或者如果 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
camel.rest.api-context-path | 设置领导的 API 上下文路径将使用的 REST API 服务。这在使用使用 context-path 部署 Web 应用程序的组件(如 camel-servlet )时使用它。 | 字符串 | |
camel.rest.api-context-route-id | 设置用于服务 REST API 的路由的路由 ID。默认情况下,路由将使用自动分配的路由 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 标头是否受到其 consume/produces 设置的 Rest-DSL 配置的支持。这可以打开,以启用此检查。如果验证错误,则返回 HTTP Status code 415 或 406。默认值为 false。 | false | 布尔值 |
camel.rest.component | 用于 REST 传输(consumer)的 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 部署 Web 应用程序的组件(如 camel-servlet )时使用它。或者对于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | Map | |
camel.rest.data-format-property | 允许为使用的数据格式配置多个额外属性。例如,将属性 prettyPrint 设置为 true,以便以用户友善模式输出 json。属性可以加上前缀来表示选项仅适用于 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 | 布尔值 |
第 26 章 CXF
支持生成者和消费者
CXF 组件提供与 Apache CXF 集成,以连接到 CXF 中托管的 JAX-WS 服务。
当在流模式中使用 CXF 时(请参阅 DataFormat 选项),然后阅读有关流缓存的信息。
26.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 cxf
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-cxf-soap-starter</artifactId> </dependency>
26.2. 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
26.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
26.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
26.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
26.4. 组件选项
CXF 组件支持 6 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
allowStreaming (advanced) | 这个选项控制在 PAYLOAD 模式运行时 CXF 组件是否会将传入的消息解析为 DOM Elements,或将有效负载保留为 javax.xml.transform.Source 对象,在某些情况下允许流。 | 布尔值 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
headerFilterStrategy (filter) | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息。 | HeaderFilterStrategy | |
useGlobalSslContextParameters (security) | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
26.5. 端点选项
CXF 端点使用 URI 语法进行配置:
cxf:beanId:address
使用以下路径和查询参数:
26.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
beanId (common) | 查找现有的已配置的 CxfEndpoint。必须使用 bean: 作为前缀。 | 字符串 | |
地址 (service) | 服务发布地址。 | 字符串 |
26.5.2. 查询参数(35 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
cookieHandler (producer) | 配置 Cookie 处理程序来维护 HTTP 会话。 | CookieHandler | |
defaultOperationName (producer) | 这个选项将设置默认 operationName,供调用远程服务的 CxfProducer 使用。 | 字符串 | |
defaultOperationNamespace (producer) | 这个选项将设置默认 operationNamespace,供调用远程服务的 CxfProducer 使用。 | 字符串 | |
hostnameVerifier (producer) | 要使用的主机名验证器。使用 # 表示法引用 registry 中的 HostnameVerifier。 | HostnameVerifier | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
sslContextParameters (producer) | Camel SSL 设置参考。使用 # 表示法引用 SSL 上下文。 | SSLContextParameters | |
wrap (producer) | CXF 端点制作者将调用哪些操作。 | false | 布尔值 |
同步 (producer (advanced)) | 设置是否应严格使用同步处理。 | false | 布尔值 |
allowStreaming (advanced) | 这个选项控制在 PAYLOAD 模式运行时 CXF 组件是否会将传入的消息解析为 DOM Elements,或将有效负载保留为 javax.xml.transform.Source 对象,在某些情况下允许流。 | 布尔值 | |
Bus (advanced) | 使用自定义配置的 CXF 总线。 | bus | |
continuationTimeout (advanced) | 这个选项用于设置 CXF 持续超时,在 CXF 服务器使用 Jetty 或 Servlet 传输时,默认可在 CxfConsumer 中使用。 | 30000 | long |
cxfBinding (advanced) | 使用自定义 CxfBinding 控制 Camel 消息和 CXF 消息之间的绑定。 | CxfBinding | |
cxfConfigurer (advanced) | 这个选项可以应用 org.apache.camel.component.cxf.CxfEndpointConfigurer 的实现,它支持以编程方式配置 CXF 端点。用户可以通过实施 CxfEndpointConfigurer 的 configure{ServerClient} 方法来配置 CXF 服务器和客户端。 | CxfConfigurer | |
defaultBus (advanced) | 当 CXF 端点本身创建总线时,将设置默认总线。 | false | 布尔值 |
headerFilterStrategy (advanced) | 使用自定义 HeaderFilterStrategy 过滤标头到 Camel 消息。 | HeaderFilterStrategy | |
mergeProtocolHeaders (advanced) | 是否合并协议标头。如果启用,则在 Camel 和 CXF 之间传播标头变得更为一致且类似。如需了解更多详细信息,请参阅 CAMEL-6393。 | false | 布尔值 |
mtomEnabled (advanced) | 启用 MTOM (attachments)。这需要使用 POJO 或 PAYLOAD 数据格式模式。 | false | 布尔值 |
properties (advanced) | 使用 Map 中的键/值对设置额外的 CXF 选项。例如,若要在 SOAP 故障中打开 stacktrace,properties.faultStackTraceEnabled=true。 | Map | |
skipPayloadMessagePartCheck (advanced) | 设置是否应禁用 SOAP 消息验证。 | false | 布尔值 |
loggingFeatureEnabled (logging) | 这个选项启用 CXF Logging 功能,将入站和出站 SOAP 消息写入日志。 | false | 布尔值 |
loggingSizeLimit (logging) | 要限制在启用了日志记录功能时日志记录器将输出的字节数,并且 -1 代表没有限制。 | 49152 | int |
skipFaultLogging (logging) | 这个选项控制 PhaseInterceptorChain 是否跳过记录它捕获的 Fault。 | false | 布尔值 |
password (security) | 这个选项用于为 CXF 客户端设置密码的基本身份验证信息。 | 字符串 | |
用户名 (安全性) | 这个选项用于为 CXF 客户端设置 username 的基本身份验证信息。 | 字符串 | |
bindingId (service) | 要使用的服务模型的 bindingId。 | 字符串 | |
portName (service) | 此服务所实现的端点名称,它映射到 wsdl:portname。格式为 ns:PORT_NAME,其中 ns 是在这个范围内有效的命名空间前缀。 | 字符串 | |
publishedEndpointUrl (service) | 此选项可以覆盖从 WSDL 发布的 endpointUrl,该Url可以通过服务地址 url 和 wsd 进行访问。 | 字符串 | |
serviceClass (service) | SEI (Service Endpoint Interface)类的类名称,它们可能具有 JSR181 注释。 | 类 | |
serviceName (service) | 此服务正在实现的服务名称,它映射到 wsdl:servicename。 | 字符串 | |
wsdlURL (service) | WSDL 的位置。可以位于类路径、文件系统上,也可以远程托管。 | 字符串 |
serviceName
和 portName
是 QNames,因此如果您提供它们,请确保它们带有其 {namespace} 前缀,如上例中所示。
26.5.3. dataformats 的描述
在 Apache Camel 中,Camel CXF 组件是将路由与 Web 服务集成的关键。您可以使用 Camel CXF 组件创建 CXF 端点,该端点可通过以下方法之一使用:
- consumer - (路由开始时)代表 Web 服务实例,它与路由集成。注入路由的有效负载类型取决于端点的 dataFormat 选项的值。
- 制作者 - (路由中的其他点)代表 WS 客户端代理,它将当前交换对象转换为远程 Web 服务的操作调用。当前交换的格式必须与端点的 dataFormat 设置匹配。
DataFormat | 描述 |
---|---|
| POJO (老的 Java 对象)是目标服务器上调用的方法的 Java 参数。支持 Protocol 和 Logical JAX-WS 处理程序。 |
|
|
|
|
|
|
您可以通过检索交换属性 CamelCXFDataFormat
来确定交换的数据格式模式。Exchange key 常量在 org.apache.camel.component.cxf.common.message.CxfConstants.DATA_FORMAT_PROPERTY
中定义。
26.5.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; }
26.5.5. relayHeaders 选项的描述
有来自一个 JAXWS WSDL-first 开发者的 in-band 和 out-of-band on-the-wire 标头。
in-band 标头是标头,作为端点的 WSDL 绑定合同的一部分(如 SOAP 标头)明确定义。
带外 标头是通过线上序列化但不是 WSDL 绑定合同的一部分的标头。
标头转发/过滤是双向的。
当路由具有 CXF 端点且开发人员需要具有 on-the-wire 标头(如 SOAP 标头)时,将路由转发给另一个 JAXWS 端点,然后应将 relayHeaders
设置为 true
,这是默认值。
26.5.6. 仅适用于 POJO 模式
relayHeaders=true
表示转发标头的意图。关于给定标头是否被中继到实施 MessageHeadersRelay
接口的可插拔实例的实际决定。将参考 MessageHeadersRelay
的具体实施,以确定是否需要转发标头。已有 SoapMessageHeadersRelay
的实现,它将自身绑定到众所周知的 SOAP 命名空间。目前,仅过滤带外标头,当 relayHeaders=true
时,in-band 标头始终会被转发。如果线上有一个标头,其命名空间对运行时未知,则将使用 fall back DefaultMessageHeadersRelay
,这只是允许所有标头进行转发。
relayHeaders=false
设置指定所有标头 in-band 和 out-of-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
中删除带内标头。如果需要过滤带内标头,请使用PAYLOAD
模式或插入 CXF 端点中的 CXF 拦截器/JAXWS 处理程序。 -
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
中配置以下属性。
Name | 必填 | 描述 |
---|---|---|
| 否 |
所有消息标头都将由 Message Header Filters Type: |
| 否 |
所有消息标头都会被传播(不由消息标头过滤器处理) Type: |
| 否 |
如果激活命名空间中的两个过滤器重叠,则属性控制应如何处理它。如果值为 |
26.6. 使用 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/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/cxf/jaxws http://camel.apache.org/schema/cxf/jaxws/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
/> 标签末尾的命名空间声明。这些声明是必需的,因为此标签的属性值目前不支持组合的 {namespace}localName
语法。
cxf:cxfEndpoint
元素支持许多额外的属性:
Name | 值 |
---|---|
|
此服务实施的端点名称,它映射到 |
|
此服务正在实现的服务名称,它映射到 |
| WSDL 的位置。可以位于类路径、文件系统上,也可以远程托管。 |
|
要使用的服务模型的 |
| 服务发布地址。 |
| 在 JAX-WS 端点中使用的总线名称。 |
| SEI (Service Endpoint Interface)类的类名称,它们可能具有 JSR181 注释。 |
它还支持许多子元素:
Name | 值 |
---|---|
|
此端点的传入拦截器。< |
|
此端点的传入故障拦截器。< |
|
此端点的传出拦截器。< |
|
此端点的传出故障拦截器。< |
| 应提供给 JAX-WS 端点的属性映射。请参见以下内容。 |
| 个 JAX-WS 处理程序列表,应提供给 JAX-WS 端点。请参见以下内容。 |
|
您可以指定端点中使用的 |
|
您可以指定要使用的此端点的 |
| 包含此端点的拦截器的功能。Bean 或 refs 列表 |
| 要使用的端点的 schema 位置。schemaLocations 列表 |
|
要使用此端点的服务工厂。这可以通过 Spring < |
您可以找到更多高级示例,用于显示如何在 CXF JAX-WS Configuration 页面上 提供拦截器、属性和处理程序。
您可以使用 cxf:properties 从 spring 配置文件中设置 camel-cxf 端点的 dataFormat 和 setDefaultBus 属性。
<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" })
但是,在 SpringBoot 中使用配置了 Java 代码的 Bean (如其他示例中所示)。
26.7. 如何使 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
,没有注释。
26.8. 如何让 camel-cxf 响应以 xml 处理指令开头
如果您使用一些 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);
26.9. 如何覆盖来自消息标头的 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()));
26.10. 如何使用 POJO 数据格式的 camel-cxf 端点中的消息
camel-cxf
端点消费者 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 }); } }
26.11. 如何以 POJO 数据格式为 camel-cxf 端点准备消息
camel-cxf
端点制作者基于 CXF 客户端 API。首先,您需要在消息标头中指定操作名称,然后将 method 参数添加到列表中,并使用此参数列表初始化消息。响应消息的正文是一个 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");
26.12. 如何处理 PAYLOAD 数据格式的 camel-cxf 端点的消息
PAYLOAD
表示您将来自 SOAP 信封的载荷处理为原生 CxfPayload。message .getBody ()
将返回 org.apache.camel.component.cxf.CxfPayload
对象,带有 SOAP 消息标头和 SOAP 正文的 getters。
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); } }); } }; }
26.13. 如何在 POJO 模式中获取和设置 SOAP 标头
POJO
表示当 camel-cxf 端点生成或消耗 Camel 交换时,数据格式是 Java 对象的"列表"。虽然 Camel 在此模式下公开消息正文作为 POJO,但 camel-cxf 仍提供对读取和写入 SOAP 标头的访问。但是,由于 CXF 拦截器在处理后从标头列表中删除带中的 SOAP 标头,因此只有 POJO 模式中的 camel-cxf 使用带外 SOAP 标头。
以下示例演示了如何获取/设置 SOAP 标头。假设我们有一个路由,它从一个 Camel-cxf 端点转发到另一个 Camel-cxf 端点。也就是说,SOA Client → Camel → CXF 服务。在请求离开 CXF 服务之前,我们可以附加两个处理器在(1)处获取/插入 SOAP 标头,然后再将响应返回 SOAP 客户端。本例中的 processor (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 消息标头传播。Camel 消息标头名称为 "org.apache.cxf.headers.Header.list",它是 CXF (org.apache.cxf.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); } }
26.14. 如何在 PAYLOAD 模式中获取和设置 SOAP 标头
我们已显示了如何在 PAYLOAD 模式中以 CxfPayload 对象的形式访问 SOAP 消息,部分将如何处理 PAYLOAD 数据格式的 camel-cxf 端点 的消息。
获取 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());
您还可以使用与子章节相同的方法"如何在 POJO 模式中获取和设置 SOAP 标头,以设置或获取 SOAP 标头。因此,您可以使用标头 "org.apache.cxf.headers.Header.list" 获取和设置 SOAP 标头列表。这也意味着,如果您有一个路由,它从一个 Camel-cxf 端点转发到另一个(SOAP Client → Camel → CXF 服务),现在也转发到 SOAP 客户端发送的 SOAP 标头。如果您不想转发这些标头,则必须在 Camel 标头 "org.apache.cxf.headers.Header.list" 中删除。
26.15. SOAP 标头在 RAW 模式中不可用
SOAP 标头在 RAW 模式中不可用,因为跳过 SOAP 处理。
26.16. 如何从 Camel 丢弃 SOAP Fault
如果您使用 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 数据格式。您可以在 out 正文上设置 SOAPFault。
26.17. 如何传播 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());
26.18. 附加支持
POJO 模式: 支持带有 Attachment 和 MTOM 的 SOAP (请参阅 Payload Mode for enable MTOM)。但是,没有测试带有 Attachment 的 SOAP。由于附件被放入 POJO 中,因此用户通常不需要自行处理附件。如果没有启用 MTOM,则附件会被传播到 Camel 消息的附件。因此,可以通过 Camel Message API 检索附件
DataHandler Message.getAttachment(String id)
有效负载模式: 组件支持 MTOM。附件可以通过上述 Camel 消息 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"))); } }
原始模式: 不支持附件,因为它根本不处理消息。
CXF_RAW 模式 :支持 MTOM,可以通过上述 Camel 消息 API 检索附件。请注意,当收到多部分(即 MTOM)消息时,默认 SOAPMessage 到 String converter 将提供正文上的完整多部分有效负载。如果您只需要 SOAP XML 作为字符串,您可以使用 message.getSOAPPart ()设置消息正文,Camel convert 可以为您执行其余工作。
26.19. PAYLOAD 模式中的流支持
camel-cxf 组件现在支持在使用 PAYLOAD 模式时流传输传入的信息。在以前的版本中,传入的信息会完全解析 DOM。对于大型消息,这非常耗时,并且使用了大量内存。在路由时,传入的消息可以保留为 javax.xml.transform.Source,如果没有修改有效负载,则可以直接流传输到目标目的地。对于常见的"simple proxy"用例(例如: from ("cxf:…").to ("cxf:…"),这可能会造成非常显著的性能增加,并显著降低了内存要求。
然而,在有些情况下,流可能不合适或需要。由于流性质,在处理链中稍后之前,无效的传入 XML 可能无法被发现。此外,某些操作可能需要通过 DOM 解析消息,如 WS-Security 或消息追踪等,在这种情况下,流的优势有限。此时,可以通过两种方式控制流:
- endpoint 属性:您可以添加 "allowStreaming=false" 作为端点属性,以打开流 on/off。
- 组件属性:CxfComponent 对象也有一个 allowStreaming 属性,可以为从该组件创建的端点设置默认值。
全局系统属性:您可以将 "org.apache.camel.component.cxf.streaming" 的系统属性添加到 "false" 以将其关闭。这会设置全局默认值,但设置上面的 endpoint 属性将覆盖该端点的此值。
26.20. 使用通用 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 标头中提供。
26.21. Spring Boot Auto-Configuration
组件支持 13 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.cxf.allow-streaming | 这个选项控制在 PAYLOAD 模式运行时 CXF 组件是否会将传入的消息解析为 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 消息。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
camel.component.cxf.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 消息。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
camel.component.cxfrs.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.cxfrs.use-global-ssl-context-parameters | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
第 27 章 CXF-RS
支持生成者和消费者
CXFRS 组件提供与 Apache CXF 集成,以连接到 CXF 中托管的 JAX-RS 1.1 和 2.0 服务。
27.1. 依赖项
当在 Camel Spring Boot 中使用 camel-cxf-rest
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-cxf-rest-starter</artifactId> </dependency>
27.2. URI 格式
cxfrs://address?options
其中 地址 代表 CXF 端点的地址。
cxfrs:bean:rsEndpoint
其中 rsEndpoint 代表 spring bean 的名称,它会显示 CXFRS 客户端或服务器。
对于以上格式,您可以将选项附加到 URI 中,如下所示:
cxfrs:bean:cxfEndpoint?resourceClasses=org.apache.camel.rs.Example
27.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
27.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
27.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
27.4. 组件选项
CXF-RS 组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当 Camel 消费者试图获取传入的消息或类似信息时,会出现异常(如果可能),现在将被作为消息进行处理,并由路由 Error Handler 处理。重要:只有在第三方组件允许 Camel 抛出异常时,才能警报这一点。有些组件仅在内部处理,因此无法 bridgeErrorHandler。在其他情况下,我们可能会将 Camel 组件提高到第三方组件中的 hook,并使其可能用于将来的版本。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
headerFilterStrategy (filter) | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息。 | HeaderFilterStrategy | |
useGlobalSslContextParameters (security) | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
27.5. 端点选项
CXF-RS 端点使用 URI 语法进行配置:
cxfrs:beanId:address
使用以下 路径和 查询参数 :
27.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
beanId (common) |
查找现有的已配置的 CxfRsEndpoint。必须使用 | 字符串 | |
address (common) | 服务发布地址。 | 字符串 |
27.5.2. 查询参数(31 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
features (common) | 将功能列表设置为 CxfRs 端点。 | list | |
loggingFeatureEnabled (common) | 这个选项启用 CXF Logging 功能,将入站和出站 REST 消息写入日志。 | false | 布尔值 |
loggingSizeLimit (common) | 要限制启用日志记录功能时日志记录器将输出的字节数。 | int | |
modelRef (common) | 这个选项用于指定模型文件,该文件对于没有注解的资源类有用。使用此选项时,可以省略服务类,以模拟仅文档端点。 | 字符串 | |
providers (common) | 将自定义 JAX-RS 提供程序列表设置为 CxfRs 端点。您可以使用供应商列表指定字符串,以便在以逗号分开的 registy 中查找。 | 字符串 | |
resourceClasses (common) | 要导出为 REST 服务的资源类。可以使用逗号分隔多个类。 | list | |
schemaLocations (common) | 设置可用于验证传入 XML 或 JAXB 驱动的 JSON 的架构位置。 | list | |
skipFaultLogging (common) | 这个选项控制 PhaseInterceptorChain 是否跳过记录它捕获的 Fault。 | false | 布尔值 |
bindingStyle (consumer) | 设置请求和响应如何映射到/来自 Camel。可以有两个值:simpleConsumer :这种绑定风格进程请求参数、多部分等,并将它们映射到 IN 标头、IN attachments 和消息正文。它旨在消除 org.apache.cxf.message.MessageContentsList 的低级别处理。它还为响应映射增加了更大的灵活性和简单性。仅适用于消费者。默认:默认样式。对于消费者,这会将 MessageContentsList 传递给路由,这需要路由中的低级处理。这是传统的绑定风格,只是将来自 CXF 堆栈的 org.apache.cxf.message.MessageContentsList 转储到 IN 消息正文。然后,用户负责根据 JAX-RS 方法签名定义的合同进行处理。custom :允许您通过 binding 选项指定自定义绑定。 Enum 值:
| 默认值 | BindingStyle |
publishedEndpointUrl (consumer) | 这个选项可以覆盖从 WADL 发布的 endpointUrl,它可以通过资源地址 url 和 _wadl 访问。 | 字符串 | |
bridgeErrorHandler (consumer (advanced)) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当 Camel 消费者试图获取传入的消息或类似信息时,会出现异常(如果可能),现在将被作为消息进行处理,并由路由 Error Handler 处理。重要:只有在第三方组件允许 Camel 抛出异常时,才能警报这一点。有些组件仅在内部处理,因此无法 bridgeErrorHandler。在其他情况下,我们可能会将 Camel 组件提高到第三方组件中的 hook,并使其可能用于将来的版本。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
servicebeans (consumer (advanced)) | 要导出为 REST 服务的 registry 中的服务 Bean (用于查找的 bean id)。可以使用逗号分隔多个 Bean。 | 字符串 | |
cookieHandler (producer) | 配置 Cookie 处理程序来维护 HTTP 会话。 | CookieHandler | |
hostnameVerifier (producer) | 要使用的主机名验证器。使用 # 表示法引用 registry 中的 HostnameVerifier。 | HostnameVerifier | |
sslContextParameters (producer) | Camel SSL 设置参考。使用 # 表示法引用 SSL 上下文。 | SSLContextParameters | |
throwExceptionOnFailure (producer) | 此选项告知 CxfRsProducer 检查返回代码,如果返回代码大于 207,将生成一个例外。 | true | 布尔值 |
httpClientAPI (producer (advanced)) | 如果为 true,则 CxfRsProducer 将使用 HttpClientAPI 调用该服务。如果是 false,则 CxfRsProducer 将使用 ProxyClientAPI 调用该服务。 | true | 布尔值 |
ignoreDeleteMethodMessageBody (producer (advanced)) | 此选项用于告知 CxfRsProducer,在使用 HTTP API 时忽略 DELETE 方法的消息正文。 | false | 布尔值 |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
maxClientCacheSize (producer (advanced)) | 这个选项允许您配置缓存的最大大小。实施在 CxfProvider 和 CxfRsProvider 中缓存 CXF 客户端或 ClientFactoryBean。 | 10 | int |
同步 (producer (advanced)) | 设置是否应严格使用同步处理。 | false | 布尔值 |
绑定 (advanced) | 使用自定义 CxfBinding 控制 Camel 消息和 CXF 消息之间的绑定。 | CxfRsBinding | |
Bus (advanced) | 使用自定义配置的 CXF 总线。 | bus | |
continuationTimeout (advanced) | 这个选项用于设置 CXF 持续超时,在 CXF 服务器使用 Jetty 或 Servlet 传输时,默认可在 CxfConsumer 中使用。 | 30000 | long |
cxfRsConfigurer (advanced) | 这个选项可以应用 org.apache.camel.component.cxf.jaxrs.CxfRsEndpointConfigurer 的实现,它支持以编程方式配置 CXF 端点。用户可以通过实施 CxfEndpointConfigurer 的 configure\\{Server/Client} 方法来配置 CXF 服务器和客户端。 | CxfRsConfigurer | |
defaultBus (advanced) | 当 CXF 端点本身创建总线时,将设置默认总线。 | false | 布尔值 |
headerFilterStrategy (advanced) | 使用自定义 HeaderFilterStrategy 过滤标头到 Camel 消息。 | HeaderFilterStrategy | |
performInvocation (advanced) | 当选项为 true 时,Camel 将执行资源类实例的调用,并将响应对象放入交换中,以进行进一步处理。 | false | 布尔值 |
propagateContexts (advanced) | 当选项为 true 时,JAXRS UriInfo、HttpHeaders、Request 和 SecurityContext 上下文将作为类型 Camel Exchange 属性提供给自定义 CXFRS 处理器。这些上下文可用于使用 JAX-RS API 分析当前的请求。 | false | 布尔值 |
27.6. 消息标头
CXF-RS 组件支持 16 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
operationName (common) 恒定: OPERATION_NAME | 操作的名称。 | 字符串 | |
CamelAuthentication (common) 常数: AUTHENTICATION | 身份验证。 | 主题 | |
CamelHttpMethod (common) 常数 : HTTP_METHOD | 要使用的 http 方法。 | 字符串 | |
CamelHttpPath (common) 常数 : HTTP_PATH | http 路径。 | 字符串 | |
content-Type (common) 常数: CONTENT_TYPE | 内容类型。 | 字符串 | |
CamelHttpQuery (common) 常数 : HTTP_QUERY | http 查询。 | 字符串 | |
CamelHttpResponseCode (common) 常量 : HTTP_RESPONSE_CODE | http 响应代码。 | 整数 | |
content-Encoding (common) 常量 : CONTENT_ENCODING | 内容编码。 | 字符串 | |
org.apache.cxf.message.Message.PROTOCOL_HEADERS (common) 常量 : PROTOCOL_HEADERS | 协议标头。 | Map | |
CamelCxfMessage (common) 常量 : CAMEL_CXF_MESSAGE | CXF 消息。 | 消息 | |
CamelCxfRsUsingHttpAPI (common) | 如果为 true,则 CxfRsProducer 将使用 HttpClientAPI 调用该服务。如果是 false,则 CxfRsProducer 将使用 ProxyClientAPI 调用该服务。 | 布尔值 | |
CamelCxfRsVarValues (common) | 路径值。 | Object[] | |
CamelCxfRsResponseClass (common) | 响应类。 | 类 | |
CamelCxfRsResponseGenericType (common) | 响应通用类型。 | 类型 | |
CamelCxfRsQueryMap (common) | 查询映射。 | Map | |
CamelCxfRsOperationResourceInfoStack (common) | 当 JAX-RS 调用查找目标时代表资源路径的 MethodInvocationInfo 的堆栈。 | OperationResourceInfoStack |
您还可以通过 spring 配置配置 CXF REST 端点。
- 注意
由于 CXF REST 客户端和 CXF REST 服务器之间存在很多差异,我们为它们提供不同的配置。
请检查以下文件以了解更多详情:
27.7. 如何在 Camel 中配置 REST 端点
在 camel-cxf 模式文件 中,REST 端点定义有两个元素:
-
用于 REST 使用者的
cxf:rsServer
-
用于 REST 生成者的
cxf:rsClient
.
您可以在那里找到 Camel REST 服务路由配置示例。
27.8. 如何覆盖来自消息标头的 CXF 生成者地址
camel-cxfrs
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()));
27.9. 消耗 REST 请求 - Simple Binding Style
从 Camel 2.11 开始
默认
绑定风格是低级,要求用户手动处理进入路由的 MessageContentsList
对象。因此,它将路由逻辑与 JAX-RS 操作的方法签名和参数索引紧密耦合,这稍微困难且容易出错。
相反,simple Consumer
绑定风格会执行以下映射,以便在 Camel 消息中 更方便地访问请求数据 :
-
JAX-RS 参数(
@HeaderParam
、@QueryParam
等等)作为 IN 消息标头注入。标头名称与注解值匹配。 -
请求实体(POJO 或其他类型)成为 IN 消息正文。如果无法在 JAX-RS 方法签名中识别单个实体,它将回退到原始
MessageContentsList
。 -
二进制
@Multipart
body parts become IN message attachments, supportDataHandler
,InputStream
,DataSource
和 CXF 的Attachment
类。 -
非二进制
@Multipart
body 部分映射为 IN 消息标头。标头名称与 Body Part 名称匹配。
另外,以下规则适用于 Response 映射 :
-
如果消息正文类型与
javax.ws.rs.core.Response
(user-built 响应)不同,则会创建一个新的Response
,并且消息正文被设置为实体(因此不是 null)。响应状态代码从Exchange.HTTP_RESPONSE_CODE
标头中获取,如果不存在,则默认为 200 OK。 -
如果消息正文类型等于
javax.ws.rs.core.Response
,这表示用户已构建了一个自定义响应,因此被遵守,它将成为最终响应。 -
在所有情况下,自定义或默认
HeaderFilterStrategy
允许的 Camel 标头都添加到 HTTP 响应中。
27.9.1. 启用简单绑定样式
通过将消费者端点中的 bindingStyle
参数设置为 SimpleConsumer
,可以激活此绑定风格:
from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer") .to("log:TEST?showAll=true");
27.9.2. 使用不同方法签名的请求绑定示例
以下是方法签名列表以及简单绑定的预期结果:
-
公共响应 doAction (BusinessObject request);
:请求有效负载放置在 tbe IN 消息正文中,替换原始 MessageContentsList。 -
公共响应 doAction (BusinessObject request, @HeaderParam ("abcd") String abcd, @QueryParam ("defg") String defg);
: 请求有效负载放置在 IN 消息正文中,替换原始MessageContentsList
。这两个请求参数都映射为 IN 消息标头,其名称为 "abcd" 和 "defg "。 -
公共响应 doAction (@HeaderParam ("abcd") String abcd, @QueryParam ("defg") String defg);
: 这两个请求参数都映射为 IN message 标头,名称为 "abcd" 和 "defg "。原始MessageContentsList
被保留,即使它只包含两个参数。 -
公共响应 doAction (@Multipart (value="body1") BusinessObject request, @Multipart (value="body2") BusinessObject request2);
: first 参数作为名为 "body1" 的标头传输,第二个参数被映射为标题 "body2 "。原始MessageContentsList
保留为 IN 消息正文。 -
公共响应 doAction (InputStream abcd);
:InputStream
is unwrapped from theMessageContentsList
and reserved as the IN message body. -
公共响应 doAction (DataHandler abcd);
: DataHandler 从MessageContentsList
中分离,并保留为 IN 消息正文。
27.9.3. Simple Binding Style 的示例
使用此方法给定 JAX-RS 资源类:
@POST @Path("/customers/{type}") public Response newCustomer(Customer customer, @PathParam("type") String type, @QueryParam("active") @DefaultValue("true") boolean active) { return null; }
由以下路由提供服务:
from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer") .recipientList(simple("direct:${header.operationName}")); from("direct:newCustomer") .log("Request: type=${header.type}, active=${header.active}, customerData=${body}");
以下带有 XML 有效负载的 HTTP 请求(客户 DTO 为 JAXB-annotated):
POST /customers/gold?active=true Payload: <Customer> <fullName>Raul Kripalani</fullName> <country>Spain</country> <project>Apache Camel</project> </Customer>
将打印消息:
Request: type=gold, active=true, customerData=<Customer.toString() representation>
27.10. 消耗 REST 请求 - 默认绑定 Style
CXF JAXRS 前端 实施 JAX-RS (concurrency-311) API,因此我们可以将资源类导出为 REST 服务。我们利用 CXF Invoker API 将 REST 请求转换为普通的 Java 对象方法调用。不需要在端点中指定 URI 模板。CXF 根据 JSR-311 规范,负责 REST 请求 URI 到资源类方法映射。您需要在 Camel 中做的只是将此方法请求委派给正确的处理器或端点。
CXFRS 路由示例
private static final String CXF_RS_ENDPOINT_URI = "cxfrs://http://localhost:" + CXT + "/rest?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceResource"; private static final String CXF_RS_ENDPOINT_URI2 = "cxfrs://http://localhost:" + CXT + "/rest2?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerService"; private static final String CXF_RS_ENDPOINT_URI3 = "cxfrs://http://localhost:" + CXT + "/rest3?" + "resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceNoAnnotations&" + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceModel.xml"; private static final String CXF_RS_ENDPOINT_URI4 = "cxfrs://http://localhost:" + CXT + "/rest4?" + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceDefaultHandlerModel.xml"; private static final String CXF_RS_ENDPOINT_URI5 = "cxfrs://http://localhost:" + CXT + "/rest5?" + "propagateContexts=true&" + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceDefaultHandlerModel.xml"; protected RouteBuilder createRouteBuilder() throws Exception { final Processor testProcessor = new TestProcessor(); final Processor testProcessor2 = new TestProcessor2(); final Processor testProcessor3 = new TestProcessor3(); return new RouteBuilder() { public void configure() { errorHandler(new NoErrorHandlerBuilder()); from(CXF_RS_ENDPOINT_URI).process(testProcessor); from(CXF_RS_ENDPOINT_URI2).process(testProcessor); from(CXF_RS_ENDPOINT_URI3).process(testProcessor); from(CXF_RS_ENDPOINT_URI4).process(testProcessor2); from(CXF_RS_ENDPOINT_URI5).process(testProcessor3); } }; }
对应的资源类则用于配置端点。
- 注意
- 默认情况下,JAX-RS 资源类 仅用于 配置 JAX-RS 属性。在将消息路由到端点时不会执行方法。相反,负责执行所有处理。
对于默认模式,只提供一个接口,而不是 no-op 服务实现类。
如果启用了 performInvocation 选项,将首先调用服务实施,响应将在 Camel 交换上设置,并且路由执行将照常继续。这可用于将现有 JAX-RS 实施集成到 Camel 路由和自定义处理器中的后处理 JAX-RS 响应。
@Path("/customerservice/") public interface CustomerServiceResource { @GET @Path("/customers/{id}/") Customer getCustomer(@PathParam("id") String id); @PUT @Path("/customers/") Response updateCustomer(Customer customer); @Path("/{id}") @PUT() @Consumes({ "application/xml", "text/plain", "application/json" }) @Produces({ "application/xml", "text/plain", "application/json" }) Object invoke(@PathParam("id") String id, String payload); }
27.11. 如何通过 camel-cxfrs producer 调用 REST 服务
CXF JAXRS 前端 实施 基于代理的客户端 API。使用这个 API,您可以通过代理调用远程 REST 服务。camel-cxfrs
producer 基于这个代理 API。您可以在消息标头中指定操作名称,并在消息正文中准备参数,camel-cxfrs producer 将为您生成正确的 REST 请求。
示例
Exchange exchange = template.send("direct://proxy", new Processor() { public void process(Exchange exchange) throws Exception { exchange.setPattern(ExchangePattern.InOut); Message inMessage = exchange.getIn(); // set the operation name inMessage.setHeader(CxfConstants.OPERATION_NAME, "getCustomer"); // using the proxy client API inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.FALSE); // set a customer header inMessage.setHeader("key", "value"); // set up the accepted content type inMessage.setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json"); // set the parameters, if you just have one parameter, // camel will put this object into an Object[] itself inMessage.setBody("123"); } }); // get the response message Customer response = (Customer) exchange.getMessage().getBody(); assertNotNull(response, "The response should not be null"); assertEquals(123, response.getId(), "Get a wrong customer id"); assertEquals("John", response.getName(), "Get a wrong customer name"); assertEquals(200, exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE), "Get a wrong response code"); assertEquals("value", exchange.getMessage().getHeader("key"), "Get a wrong header value");
CXF JAXRS 前端 还提供以 HTTP 为中心的客户端 API。您也可以从 camel-cxfrs producer 调用此 API。您需要指定 HTTP_PATH 和 HTTP_METHOD,并使用 URI 选项 httpClientAPI 或设置消息标头 CxfConstants.CAMEL_CXF_RS_USING_HTTP_API。您可以将响应对象转换为使用消息标头 CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS 指定的类型类。
Exchange exchange = template.send("direct://http", new Processor() { public void process(Exchange exchange) throws Exception { exchange.setPattern(ExchangePattern.InOut) Message inMessage = exchange.getIn(); // using the http central client API inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.TRUE); // set the Http method inMessage.setHeader(Exchange.HTTP_METHOD, "GET"); // set the relative path inMessage.setHeader(Exchange.HTTP_PATH, "/customerservice/customers/123"); // Specify the response class, cxfrs will use InputStream as the response object type inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, Customer.class); // set a customer header inMessage.setHeader("key", "value"); // since we use the Get method, so we don't need to set the message body inMessage.setBody(null); } });
您还可以为 CXFRS http 以中心客户端指定 cxfrs URI 中的查询参数。
Exchange exchange = template.send("cxfrs://http://localhost:9003/testQuery?httpClientAPI=true&q1=12&q2=13"
要支持动态路由,您可以使用 CxfConstants.CAMEL_CXF_RS_QUERY_MAP 标头覆盖 URI 的查询参数,为其设置它的参数映射。
Map<String, String> queryMap = new LinkedHashMap<>(); queryMap.put("q1", "new"); queryMap.put("q2", "world"); inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_QUERY_MAP, queryMap);
27.12. Spring Boot Auto-Configuration
组件支持 6 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.cxfrs.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.cxfrs.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当 Camel 消费者试图获取传入的消息或类似信息时,会出现异常(如果可能),现在将被作为消息进行处理,并由路由 Error Handler 处理。重要:只有在第三方组件允许 Camel 抛出异常时,才能警报这一点。有些组件仅在内部处理,因此无法 bridgeErrorHandler。在其他情况下,我们可能会将 Camel 组件提高到第三方组件中的 hook,并使其可能用于将来的版本。默认情况下,使用者将使用 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 消息。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
camel.component.cxfrs.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.cxfrs.use-global-ssl-context-parameters | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
第 28 章 数据格式
仅支持生成者
Dataformat 组件允许使用数据格式 作为 Camel 组件。
28.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 dataformat
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-dataformat-starter</artifactId> </dependency>
28.2. URI 格式
dataformat:name:(marshal|unmarshal)[?options]
其中 name 是数据格式的名称。然后后根一个操作,需要是 marshal
或 unmarshal
。选项用于配置正在使用的 数据格式。有关支持哪些选项,请参阅数据格式文档。
28.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
28.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
28.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
28.4. 组件选项
Data Format 组件支持 2 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
28.5. 端点选项
Data Format 端点使用 URI 语法进行配置:
dataformat:name:operation
使用以下路径和查询参数:
28.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (producer) | 数据格式 的必要名称。 | 字符串 | |
operation (producer) | 需要的 Operation 来使用 marshal 或 unmarshal。 Enum 值:
| 字符串 |
28.5.2. 查询参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
28.6. 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>
28.7. Spring Boot Auto-Configuration
组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.dataformat.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.dataformat.enabled | 是否启用 dataformat 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.dataformat.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 29 章 dataset
支持生成者和消费者
测试分布式和异步处理并不困难。Mock、Test 和 DataSet 端点与 Camel 测试框架协同工作,从而通过使用 企业集成模式 和 Camel 的大量组件以及强大的 Bean 集成来简化您的单元和集成测试。
DataSet 组件提供了一种机制,可以轻松执行您系统的负载和 soak 测试。它的工作原理是,允许您将 DataSet 实例创建 为消息源,并作为接收数据集的方法。
Camel 在发送数据集 时将使用吞吐量日志记录器。
29.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 dataset
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-dataset-starter</artifactId> </dependency>
29.2. URI 格式
dataset:name[?options]
在 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
。
29.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
29.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
29.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
29.4. 组件选项
Dataset 组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
log (producer) | 在模拟收到传入消息时打开日志记录。这只会记录传入消息的 INFO 级别一次。如需更详细的日志记录,然后将 org.apache.camel.component.mock.MockEndpoint 类的 logger 设置为 DEBUG 级别。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
exchangeFormatter (advanced) | Autowired 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,我们默认为 DefaultExchangeFormatter。 | ExchangeFormatter |
29.5. 端点选项
Dataset 端点使用 URI 语法进行配置:
dataset:name
使用以下路径和查询参数:
29.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (common) | 在 registry 中查找的 DataSet 所需的 名称。 | DataSet |
29.5.2. 查询参数(21 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
dataSetIndex (common) | 控制 CamelDataSetIndex 标头的行为。对于 Consumers: - off = header is not be set - strict/lenient = the header will be set For Producers: - off = header value is not be enabled, will not present = strict = header value be present,并将被验证 = lenient = 标头值(如果不存在),则将设置该标头值。 Enum 值:
| lenient | 字符串 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
initialDelay (consumer) | 开始发送消息前等待的时间周期。 | 1000 | long |
minRate (consumer) | 等待 DataSet 包含至少此数量的信息。 | 0 | int |
preloadSize (consumer) | 设置在路由完成其初始化前应预加载(sent)的消息数量。 | 0 | long |
produceDelay (consumer) | 指定一个延迟,这会在消费者发送消息时造成延迟(模拟缓慢处理)。 | 3 | long |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
assertPeriod (producer) | 设置一个宽限期,在此期内,模拟端点将重新开始处理,以确保初始断言仍然有效。这用于 assert,用于准确有多个消息到达的信息。例如,如果 expectedMessageCount (int)被设置为 5,则在 5 或更多消息到达时满足断言。为确保正好 5 个消息到达,您需要稍等片刻,以确保没有进一步的消息到达。这是您可以使用此方法的方法。默认情况下禁用此周期。 | long | |
consumeDelay (producer) | 指定一个延迟,这会在生成者消耗消息时造成延迟(模拟较慢的处理)。 | 0 | long |
expectedCount (producer) | 指定此端点应接收的预期消息交换数量。注意:如果您希望 0 个信息,然后进行额外操作,如测试启动时为 0 匹配,因此您需要设置一个 assert 周期,以便让测试运行一段时间,以确保还没有到达消息;对于使用 setAssertPeriod (long)。另一种方法是使用 NotifyBuilder,并在对模拟调用 assertIsSatisfied ()方法前,使用 notifier 知道 Camel 何时完成一些消息。这可让您不要使用固定的 assert 周期来加快测试时间。如果您要断言正好 n 个消息到达这个 mock 端点,那么还会看到 setAssertPeriod (long)方法了解更多详情。 | -1 | int |
failfast (producer) | 设置 assertIsSatisfied ()应该在第一次检测到的失败预期失败时快速失败,否则可能会等待所有预期消息在执行预期验证前到达。默认为 true。设置为 false 以使用 Camel 2.x 中的行为。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
log (producer) | 在模拟收到传入消息时打开日志记录。这只会记录传入消息的 INFO 级别一次。如需更详细的日志记录,然后将 org.apache.camel.component.mock.MockEndpoint 类的 logger 设置为 DEBUG 级别。 | false | 布尔值 |
reportGroup (producer) | 用于根据大小组打开吞吐量日志的数字。 | int | |
resultMinimumWaitTime (producer) | 设置预期时间(在 millis 中),assertIsSatisfied ()将等待一个白板,直到其满足为止。 | long | |
resultWaitTime (producer) | 设置 assertIsSatisfied ()将等待的最长时间(在 millis 中),直到其满足为止。 | long | |
retainFirst (producer) | 指定只保留第 n 个接收的交换数。这在使用大数据测试时使用,通过不存储每个交换端点接收的副本来减少内存消耗。重要:使用这个限制时,getReceivedCounter ()仍会返回接收的交换的实际数量。例如,如果我们收到 5000 Exchange,并且已配置为只保留前 10 个交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()和 getReceivedExchanges ()方法中只有前 10 个交换。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到第一个数量的正文上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个接收的限制。 | -1 | int |
retainLast (producer) | 指定只保留最后 n 个接收的交换数。这在使用大数据测试时使用,通过不存储每个交换端点接收的副本来减少内存消耗。重要:使用这个限制时,getReceivedCounter ()仍会返回接收的交换的实际数量。例如,如果我们收到 5000 Exchange,并且已配置为只保留最后 20 个交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()和 getReceivedExchanges ()方法中只有最后 20 个交换。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到第一个数量的正文上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个接收的限制。 | -1 | int |
sleepForEmptyTest (producer) | 当 expectedMessageCount (int)被调用为零时,允许指定 sleep 来检查此端点是否确实为空。 | long | |
copyOnExchange (producer (advanced)) | 设置在这个模拟端点收到时是否制作传入 Exchange 的深度副本。默认为 true。 | true | 布尔值 |
29.6. 配置 DataSet
Camel 将在 Registry 中查找实现 DataSet 接口的 bean。因此,您可以将自己的 DataSet 注册为:
<bean id="myDataSet" class="com.mycompany.MyDataSet"> <property name="size" value="100"/> </bean>
29.7. 示例
例如,要测试一组信息是否发送到队列,然后从队列使用,而不会丢失任何信息:
// 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
,如配置诸如数据集大小以及消息类似于 etc 的情况等。
29.8. DataSetSupport (abstract 类)
DataSetSupport 抽象类是新 DataSets 的 nice 起点,它为派生类提供一些有用的功能。
29.8.1. DataSetSupport 的属性
属性 | 类型 | Default(默认) | 描述 |
---|---|---|---|
|
|
|
指定默认消息正文。对于 SimpleDataSet 是一个恒定的有效负载;但是,如果要为每个消息创建自定义有效负载,请创建自己的数据Set |
|
| null | |
|
|
| 指定要发送/消耗的消息数量。 |
|
|
|
指定在报告进度前要接收的消息数量。可用于显示大型负载测试的进度。如果 < 0,则 |
29.9. SimpleDataSet
SimpleDataSet
扩展 DataSetSupport
,并添加默认的正文。
29.9.1. SimpleDataSet 的额外属性
属性 | 类型 | Default(默认) | 描述 |
---|---|---|---|
|
|
|
指定默认消息正文。默认情况下, |
29.10. ListDataSet
List'DataSet' 扩展 DataSetSupport
,并添加默认正文列表。
29.10.1. ListDataSet 的额外属性
属性 | 类型 | Default(默认) | 描述 |
---|---|---|---|
|
|
|
指定默认消息正文。默认情况下, |
|
| defaultBodies 列表的大小 |
指定要发送/消耗的消息数量。这个值可以与 |
29.11. FileDataSet
FileDataSet
扩展 ListDataSet
,并添加了对从文件中加载正文的支持。
29.11.1. FileDataSet 的额外属性
属性 | 类型 | Default(默认) | 描述 |
---|---|---|---|
|
| null | 指定有效负载的源文件 |
|
| \z |
指定 |
29.12. Spring Boot Auto-Configuration
组件支持 11 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.dataset-test.log | 在模拟收到传入消息时打开日志记录。这只会记录传入消息的 INFO 级别一次。如需更详细的日志记录,然后将 org.apache.camel.component.mock.MockEndpoint 类的 logger 设置为 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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.dataset.log | 在模拟收到传入消息时打开日志记录。这只会记录传入消息的 INFO 级别一次。如需更详细的日志记录,然后将 org.apache.camel.component.mock.MockEndpoint 类的 logger 设置为 DEBUG 级别。 | false | 布尔值 |
第 30 章 直接
支持生成者和消费者
Direct 组件在生成者发送消息交换时提供任何消费者的直接同步调用。
此端点可用于连接 同一 camel 上下文中的现有路由。
异步
SEDA 组件在生成者发送消息交换时提供任何消费者的异步调用。
30.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 直接
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-direct-starter</artifactId> </dependency>
30.2. URI 格式
direct:someName[?options]
其中 someName 可以是唯一标识端点的任何字符串
30.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
30.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
30.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
30.4. 组件选项
Direct 组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
block (producer) | 如果向没有活跃消费者的直接端点发送消息,则我们可以告知生成者阻止,并等待消费者变为活动状态。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
timeout (producer) | 如果启用了块,要使用的超时值。 | 30000 | long |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
30.5. 端点选项
Direct 端点使用 URI 语法进行配置:
direct:name
使用以下路径和查询参数:
30.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (common) | 直接端点 必需 名称。 | 字符串 |
30.5.2. 查询参数(8 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
block (producer) | 如果向没有活跃消费者的直接端点发送消息,则我们可以告知生成者阻止,并等待消费者变为活动状态。 | true | 布尔值 |
failIfNoConsumers (producer) | 当发送到没有活跃用户的 DIRECT 端点时,生成者是否应该通过抛出异常失败。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
timeout (producer) | 如果启用了块,要使用的超时值。 | 30000 | long |
同步 (advanced) | 是否强制同步处理。如果启用,则生成者线程将会被强制等待消息完成,然后同一线程将继续处理。如果禁用(默认),则生成者线程可以被释放,并可以在消息继续由其他线程处理时执行其他工作(重新活跃)。 | false | 布尔值 |
30.6. 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 组件中的示例,以及如何一起使用它们。
30.7. Spring Boot Auto-Configuration
组件支持 6 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.direct.timeout | 如果启用了块,要使用的超时值。 | 30000 | Long |
第 31 章 Elasticsearch
Since Camel 3.18.3
仅支持生成者
ElasticSearch 组件允许您使用 Java API 客户端库与 ElasticSearch 8.x API 接口。
31.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 elasticsearch
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-elasticsearch-starter</artifactId> </dependency>
31.2. URI 格式
elasticsearch://clusterName[?options]
31.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
31.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
31.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
31.4. 组件选项
Elasticsearch 组件支持 14 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
connectionTimeout (producer) | 连接超时前等待的时间。 | 30000 | int |
hostAddresses (producer) | 使用 ip:port 格式的远程传输地址的逗号分隔列表。ip 和 port 选项必须留空,才能考虑 hostAddresses。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
maxRetryTimeout (producer) | 重试前的 ms 时间。 | 30000 | int |
socketTimeout (producer) | 套接字超时前等待的超时。 | 30000 | int |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
client (advanced) | Autowired 使用现有的配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。这允许使用特定设置自定义客户端。 | mingw | |
enableSniffer (advanced) | 启用从正在运行的 Elasticsearch 集群自动发现节点。如果将此选项与 Spring Boot 一起使用,则它由 Spring Boot 配置管理(请参阅:在 Spring Boot 中禁用 Sniffer)。 | false | 布尔值 |
sniffAfterFailureDelay (advanced) | 失败后调度的嗅探执行的延迟(以毫秒为单位)。 | 60000 | int |
snifferInterval (advanced) | 以毫秒为单位连续普通嗅探执行之间的间隔。当 sniffOnFailure 被禁用或者连续嗅探执行之间没有故障时,将可以发现。 | 300000 | int |
certificatePath (security) | 用于访问 Elasticsearch 的自签名证书的路径。 | 字符串 | |
enableSSL (security) | 启用 SSL。 | false | 布尔值 |
password (security) | 用于验证的密码。 | 字符串 | |
用户 (安全性) | 基本身份验证用户。 | 字符串 |
31.5. 端点选项
Elasticsearch 端点使用 URI 语法进行配置:
elasticsearch:clusterName
使用以下路径和查询参数:
31.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clusterName (producer) | 集群所需的 名称。 | 字符串 |
31.5.2. 查询参数(19 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
connectionTimeout (producer) | 连接超时前等待的时间。 | 30000 | int |
disconnect (producer) | 在它完成调用制作者后断开连接。 | false | 布尔值 |
from (producer) | 启动响应的索引。 | 整数 | |
hostAddresses (producer) | 使用 ip:port 格式的远程传输地址的逗号分隔列表。 | 字符串 | |
indexName (producer) | 要操作的索引的名称。 | 字符串 | |
maxRetryTimeout (producer) | 重试前的 ms 时间。 | 30000 | int |
operation (producer) | 要执行的操作。 Enum 值:
| ElasticsearchOperation | |
scrollKeepAliveMs (producer) | elasticsearch 将保持搜索上下文处于活动状态的时间(ms)。 | 60000 | int |
size (producer) | 响应的大小。 | 整数 | |
socketTimeout (producer) | 套接字超时前等待的超时。 | 30000 | int |
useScroll (producer) | 启用滚动用法。 | false | 布尔值 |
waitForActiveShards (producer) | 索引创建会等待分片的写入一致性数量。 | 1 | int |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
documentClass (advanced) | 取消处理文档时要使用的类。 | ObjectNode | 类 |
enableSniffer (advanced) | 启用从正在运行的 Elasticsearch 集群自动发现节点。如果将此选项与 Spring Boot 一起使用,则它由 Spring Boot 配置管理(请参阅:在 Spring Boot 中禁用 Sniffer)。 | false | 布尔值 |
sniffAfterFailureDelay (advanced) | 失败后调度的嗅探执行的延迟(以毫秒为单位)。 | 60000 | int |
snifferInterval (advanced) | 以毫秒为单位连续普通嗅探执行之间的间隔。当 sniffOnFailure 被禁用或者连续嗅探执行之间没有故障时,将可以发现。 | 300000 | int |
certificatePath (security) | 用于访问 Elasticsearch 的自签名证书的路径。 | 字符串 | |
enableSSL (security) | 启用 SSL。 | false | 布尔值 |
31.6. 消息标头
Elasticsearch 组件支持 9 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
operation (producer) 常数: PARAM_OPERATION | 要执行的操作。 Enum 值:
| ElasticsearchOperation | |
indexId (producer) 常数: PARAM_INDEX_ID | 索引文档的 id。 | 字符串 | |
indexName (producer) 常数: PARAM_INDEX_NAME | 要操作的索引的名称。 | 字符串 | |
documentClass (producer) | unmarshall 文档类的全限定名称。 | ObjectNode | 类 |
waitForActiveShards (producer) | 索引创建会等待分片的写入一致性数量。 | 整数 | |
scrollKeepAliveMs (producer) | 响应的起始索引。 | 整数 | |
useScroll (producer) 常量 : PARAM_SCROLL | 设置为 true 以启用滚动用法。 | 布尔值 | |
size (producer) 常数 : PARAM_SIZE | 响应的大小。 | 整数 | |
from (producer) 常量 : PARAM_FROM | 响应的起始索引。 | 整数 |
31.7. 消息操作
目前支持以下 ElasticSearch 操作。只需设置端点 URI 选项或交换标头,键为"operation",值设为以下之一:有些操作还需要设置其他参数或消息正文。
operation | 消息正文 | description |
---|---|---|
索引 | 将 ,String,byte[], Reader,InputStream 或 IndexRequest.Builder 内容 映射到 index | 将内容添加到索引中,并返回正文中内容的 indexId。您可以通过使用键 "indexName" 设置消息标头来设置目标索引的名称。您可以通过使用键 "indexId" 设置消息标头来设置 indexId。 |
GetById | 要检索的内容的字符串或 GetRequest.Builder 索引 id | 检索与给定索引 id 对应的文档,并在正文中返回 GetResponse 对象。您可以通过使用键 "indexName" 设置消息标头来设置目标索引的名称。您可以通过使用键 "documentClass" 设置消息标头来设置文档类型。 |
删除 | 要删除的内容的字符串或 DeleteRequest.Builder 索引 id | 删除指定的 indexName,并返回正文中的 Result 对象。您可以通过使用键 "indexName" 设置消息标头来设置目标索引的名称。 |
DeleteIndex | 要删除的索引的字符串或 DeleteIndexRequest.Builder 索引名称 | 删除指定的 indexName,并在正文中返回状态代码。您可以通过使用键 "indexName" 设置消息标头来设置目标索引的名称。 |
批量 | 已接受的任何类型的 可迭代 或 BulkRequest.Builder (用于删除操作的 UpdateOperation.Builder)、用于更新操作的 UpdateOperation.Builder、CreateOperation.Builder 用于创建操作、bytes[]、InputStream、String、Reader、Map 或任何用于索引操作的文档类型) | 添加/更新/删除内容从/到索引,并返回正文中的 List<BulkResponseItem> 对象,您可以通过使用键 "indexName" 设置消息标头来设置目标索引的名称。 |
搜索 | Map,String 或 SearchRequest.Builder | 使用查询字符串映射搜索内容。您可以通过使用键 "indexName" 设置消息标头来设置目标索引的名称。您可以通过使用键 "size" 设置消息标头来设置要返回的点击数。您可以通过使用键 "from" 设置消息标头来设置起始文档偏移。 |
MultiSearch | MsearchRequest.Builder | 在一个中有多个搜索 |
MultiGet | Iterable<String > 或 MgetRequest.Builder 用于检索的文档的 id | 在一个中有多个信息 您可以通过使用键 "indexName" 设置消息标头来设置目标索引的名称。 |
Exists | None | 检查索引是否存在,并在正文中返回一个布尔值标志。 您必须通过使用键 "indexName" 设置消息标头来设置目标索引的名称。 |
Update(更新) | byte[], InputStream,String,Reader,Map, Map 或任何要更新的文档类型内容 | 更新内容到索引,并在正文中返回内容的 indexId。您可以通过使用键 "indexName" 设置消息标头来设置目标索引的名称。您可以通过使用键 "indexId" 设置消息标头来设置 indexId。 |
ping | None | Ping Elasticsearch 集群,如果 ping 成功,则返回 true,否则为 false |
31.8. 配置组件并启用基本身份验证
要使用 Elasticsearch 组件,必须为它配置最小配置。
ElasticsearchComponent elasticsearchComponent = new ElasticsearchComponent(); elasticsearchComponent.setHostAddresses("myelkhost:9200"); camelContext.addComponent("elasticsearch", elasticsearchComponent);
对于使用 elasticsearch 的基本身份验证或使用 elasticsearch 集群前面的反向 http 代理,只需在组件上设置基本身份验证和 SSL,如下例所示
ElasticsearchComponent elasticsearchComponent = new ElasticsearchComponent(); elasticsearchComponent.setHostAddresses("myelkhost:9200"); elasticsearchComponent.setUser("elkuser"); elasticsearchComponent.setPassword("secure!!"); elasticsearchComponent.setEnableSSL(true); elasticsearchComponent.setCertificatePath(certPath); camelContext.addComponent("elasticsearch", elasticsearchComponent);
31.9. 索引示例
以下是一个简单的 INDEX 示例
from("direct:index") .to("elasticsearch://elasticsearch?operation=Index&indexName=twitter");
<route> <from uri="direct:index"/> <to uri="elasticsearch://elasticsearch?operation=Index&indexName=twitter"/> </route>
对于此操作,您需要指定 indexId 标头。
客户端只需要将包含 Map 的正文消息传递给路由。结果正文包含创建的 indexId。
Map<String, String> map = new HashMap<String, String>(); map.put("content", "test"); String indexId = template.requestBody("direct:index", map, String.class);
31.10. 搜索示例
在特定字段和值中搜索使用 Operation 'Search'。传递查询 JSON 字符串或映射
from("direct:search") .to("elasticsearch://elasticsearch?operation=Search&indexName=twitter");
<route> <from uri="direct:search"/> <to uri="elasticsearch://elasticsearch?operation=Search&indexName=twitter"/> </route>
String query = "{\"query\":{\"match\":{\"doc.content\":\"new release of ApacheCamel\"}}}"; HitsMetadata<?> response = template.requestBody("direct:search", query, HitsMetadata.class);
使用 Map 搜索特定字段。
Map<String, Object> actualQuery = new HashMap<>(); actualQuery.put("doc.content", "new release of ApacheCamel"); Map<String, Object> match = new HashMap<>(); match.put("match", actualQuery); Map<String, Object> query = new HashMap<>(); query.put("query", match); HitsMetadata<?> response = template.requestBody("direct:search", query, HitsMetadata.class);
使用 Elasticsearch 滚动 api 搜索以获取所有结果。
from("direct:search") .to("elasticsearch://elasticsearch?operation=Search&indexName=twitter&useScroll=true&scrollKeepAliveMs=30000");
<route> <from uri="direct:search"/> <to uri="elasticsearch://elasticsearch?operation=Search&indexName=twitter&useScroll=true&scrollKeepAliveMs=30000"/> </route>
String query = "{\"query\":{\"match\":{\"doc.content\":\"new release of ApacheCamel\"}}}"; try (ElasticsearchScrollRequestIterator response = template.requestBody("direct:search", query, ElasticsearchScrollRequestIterator.class)) { // do something smart with results }
也可以使用.
from("direct:search") .to("elasticsearch://elasticsearch?operation=Search&indexName=twitter&useScroll=true&scrollKeepAliveMs=30000") .split() .body() .streaming() .to("mock:output") .end();
31.11. MultiSearch 示例
多搜索特定字段和值使用 Operation 'MultiSearch'。传递 MultiSearchRequest 实例
from("direct:multiSearch") .to("elasticsearch://elasticsearch?operation=MultiSearch");
<route> <from uri="direct:multiSearch"/> <to uri="elasticsearch://elasticsearch?operation=MultiSearch"/> </route>
MultiSearch on specific fields)
MsearchRequest.Builder builder = new MsearchRequest.Builder().index("twitter").searches( new RequestItem.Builder().header(new MultisearchHeader.Builder().build()) .body(new MultisearchBody.Builder().query(b -> b.matchAll(x -> x)).build()).build(), new RequestItem.Builder().header(new MultisearchHeader.Builder().build()) .body(new MultisearchBody.Builder().query(b -> b.matchAll(x -> x)).build()).build()); List<MultiSearchResponseItem<?>> response = template.requestBody("direct:multiSearch", builder, List.class);
31.12. 文档类型
对于所有搜索操作,可以指示要检索的文档类型,以获得已与预期类型相关的结果。
可使用标头 "documentClass" 或同一名称的 uri 参数来设置文档类型。
31.13. 在 Spring Boot 中使用 Camel Elasticsearch
当您将 camel-elasticsearch-starter
与 Spring Boot v2 搭配使用时,您必须在您自己的 pom.xml
中声明以下依赖项:
<dependency> <groupId>jakarta.json</groupId> <artifactId>jakarta.json-api</artifactId> <version>2.0.2</version> </dependency>
这是必要的,因为 Spring Boot v2 提供 jakarta.json-api:1.1.6,Elasticsearch 需要使用 json-api v2。
31.13.1. 使用 Spring Boot 提供的 RestClient
默认情况下,Spring Boot 将自动配置一个由 camel 使用的 Elasticsearch RestClient,它可以使用以下基本属性自定义客户端:
spring.elasticsearch.uris=myelkhost:9200 spring.elasticsearch.username=elkuser spring.elasticsearch.password=secure!!
如需更多信息,请参阅 application-properties.data.spring.elasticsearch.connection-timeout。
31.13.2. 使用 Spring Boot 时禁用 Sniffer
当 Spring Boot 位于类路径上时,默认启用 Elasticsearch 的 Sniffer 客户端。在 Spring Boot 配置中可以禁用这个选项:
spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration
31.14. Spring Boot Auto-Configuration
组件支持 15 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.elasticsearch.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.elasticsearch.certificate-path | 用于访问 Elasticsearch 的自签名证书的路径。 | 字符串 | |
camel.component.elasticsearch.client | 使用现有的配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。这允许使用特定设置自定义客户端。选项是一个 org.elasticsearch.client.RestClient 类型。 | mingw | |
camel.component.elasticsearch.connection-timeout | 连接超时前等待的时间。 | 30000 | 整数 |
camel.component.elasticsearch.enable-s-s-l | 启用 SSL。 | false | 布尔值 |
camel.component.elasticsearch.enable-sniffer | 启用从正在运行的 Elasticsearch 集群自动发现节点。如果将此选项与 Spring Boot 一起使用,则它由 Spring Boot 配置管理(请参阅:在 Spring Boot 中禁用 Sniffer)。 | false | 布尔值 |
camel.component.elasticsearch.enabled | 是否启用 elasticsearch 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.elasticsearch.host-addresses | 使用 ip:port 格式的远程传输地址的逗号分隔列表。ip 和 port 选项必须留空,才能考虑 hostAddresses。 | 字符串 | |
camel.component.elasticsearch.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.elasticsearch.max-retry-timeout | 重试前的 ms 时间。 | 30000 | 整数 |
camel.component.elasticsearch.password | 用于验证的密码。 | 字符串 | |
camel.component.elasticsearch.sniff-after-failure-delay | 失败后调度的嗅探执行的延迟(以毫秒为单位)。 | 60000 | 整数 |
camel.component.elasticsearch.sniffer-interval | 以毫秒为单位连续普通嗅探执行之间的间隔。当 sniffOnFailure 被禁用或者连续嗅探执行之间没有故障时,将可以发现。 | 300000 | 整数 |
camel.component.elasticsearch.socket-timeout | 套接字超时前等待的超时。 | 30000 | 整数 |
camel.component.elasticsearch.user | 基本身份验证用户。 | 字符串 |
第 32 章 ExchangeProperty
ExchangeProperty 表达式语言允许您提取指定交换属性的值。
32.1. 依赖项
ExchangeProperty 语言是 camel-core 的一部分。
当在 Red Hat build of Camel Spring Boot 中使用 exchangeProperty
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-core-starter</artifactId> </dependency>
32.2. Exchange Property 选项
ExchangeProperty 语言支持 1 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
trim |
| 是否修剪值以移除前导和结尾的空格和换行符。 |
32.3. 示例
recipientList
EIP 可以使用类似以下的 ExchangeProperty:
<route> <from uri="direct:a" /> <recipientList> <exchangeProperty>myProperty</exchangeProperty> </recipientList> </route>
在这种情况下,接收者列表包含在属性 'myProperty' 中。
以及 Java DSL 中的相同示例:
from("direct:a").recipientList(exchangeProperty("myProperty"));
32.4. Spring Boot Auto-Configuration
组件支持 147 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 使用客户端查找时设置客户端密钥存储数据。 | 字符串 | |
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 using environment,环境变量用于查找服务。默认情况下使用环境。 | 环境 | 字符串 |
camel.cloud.kubernetes.service-discovery.master-url | 在使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用来自 ENV 变量 KUBERNETES_MASTER 的命名空间。 | 字符串 | |
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 ()的影响类似,除非继续跟踪指标,知道它是否应该是 open/closed,此属性即使实例化一个断路器。 | 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 ()的错误百分比如何。如果设为 true,则 circuitBreakerForceOpen ()属性具有优先权。 | false | 布尔值 |
camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(接受),并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
camel.hystrix.circuit-breaker-request-volume-threshold | metricsRollingStatisticalWindowInMilliseconds ()中的最少请求数必须存在于 HystrixCircuitBreaker 之前。如果此数字低于这个数字,无论错误百分比如何,电路都不会被出差。 | 20 | 整数 |
camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreaker trips 之后的时间(以毫秒为单位),它应该在尝试请求前等待。 | 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 ()的并发请求数。超过并发限制的请求将被拒绝。仅在执行IsolationStrategy == SEMAPHORE 时使用。 | 20 | 整数 |
camel.hystrix.execution-isolation-strategy | 将通过什么隔离策略 HystrixCommand.run ()执行。如果 THREAD,它将在单独的线程上执行,并且受 thread-pool 中的线程数量限制的并发请求。如果 SEMAPHORE,它将在调用线程上执行,并且受 semaphore 数限制的并发请求。 | 线程 | 字符串 |
camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 future#cancel)。仅在执行IsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
camel.hystrix.execution-timeout-in-milliseconds | 以毫秒为单位,将命令超时和停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 且命令是线程隔离,则执行线程将中断。如果命令是 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 | 设置要使用的 group 键。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
camel.hystrix.keep-alive-time | 更长的时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会立即更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
camel.hystrix.maximum-size | 传递给 ThreadPoolExecutor#setMaximumPoolSize (int)的最大 thread-pool 大小。这是可在不开始拒绝 HystrixCommands 的情况下支持的最大并发数量。请注意,只有在您也设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 在允许计算成功和错误百分比时等待的时间(以毫秒为单位),并影响 HystrixCircuitBreaker.isOpen ()状态。在高容量电路上,错误百分比的连续计算可能会成为 CPU 密集型,从而控制其计算的频率。 | 500 | 整数 |
camel.hystrix.metrics-rolling-percentile-bucket-size | 滚动百分比的每个存储桶中存储的最大值数。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 10 | 整数 |
camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 内部 HystrixCommandMetrics 来捕获百分比的指标。 | true | 布尔值 |
camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动窗口的存储桶数量被分成。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 6 | 整数 |
camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的滚动窗口的持续时间。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 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 | 队列大小拒绝阈值是 artificial max size,即使尚未达到 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 过渡到 open,并启动短路调用。阈值必须大于 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 | 配置滑动窗口的大小,该窗口用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置滑动窗口的大小。滑动窗口可以是基于计数或基于时间的窗口。如果 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 | 配置滑动窗口的类型,用于记录 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 会将调用视为较慢。当较慢的调用百分比相等或大于阈值时,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 的 Camel 组件名称(如 swagger)如果没有明确配置 API 组件,则 Camel 会查找负责服务并生成 REST API 文档的 Camel 组件,或者如果 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
camel.rest.api-context-path | 设置领导的 API 上下文路径将使用的 REST API 服务。这在使用使用 context-path 部署 Web 应用程序的组件(如 camel-servlet )时使用它。 | 字符串 | |
camel.rest.api-context-route-id | 设置用于服务 REST API 的路由的路由 ID。默认情况下,路由将使用自动分配的路由 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 标头是否受到其 consume/produces 设置的 Rest-DSL 配置的支持。这可以打开,以启用此检查。如果验证错误,则返回 HTTP Status code 415 或 406。默认值为 false。 | false | 布尔值 |
camel.rest.component | 用于 REST 传输(consumer)的 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 部署 Web 应用程序的组件(如 camel-servlet )时使用它。或者对于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | Map | |
camel.rest.data-format-property | 允许为使用的数据格式配置多个额外属性。例如,将属性 prettyPrint 设置为 true,以便以用户友善模式输出 json。属性可以加上前缀来表示选项仅适用于 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 | 布尔值 |
第 33 章 FHIR
支持生成者和消费者
FHIR 组件与 HAPI-FHIR 库集成,它是 Java 中 FHIR (Fast Healthcare Interoperability Resources)规范的开源实现。
33.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 fhir
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-fhir-starter</artifactId> </dependency>
33.2. URI 格式
FHIR 组件使用以下 URI 格式:
fhir://endpoint-prefix/endpoint?[options]
端点前缀可以是以下之一:
- 功能
- create
- delete
- history
- load-page
- meta
- operation
- patch
- 读取
- search
- Transactions
- update
- validate
33.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
33.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
33.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
33.4. 组件选项
FHIR 组件支持 27 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
编码 (common) | 用于所有请求的编码。 Enum 值:
| 字符串 | |
fhirVersion (common) | 要使用的 FHIR 版本。 Enum 值:
| R4 | 字符串 |
log (common) | 将记录每个请求和响应。 | false | 布尔值 |
prettyPrint (common) | 用户用户打印所有请求。 | false | 布尔值 |
serverUrl (common) | FHIR 服务器基本 URL。 | 字符串 | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
client (advanced) | 使用自定义客户端。 | IGenericClient | |
clientFactory (advanced) | 使用自定义客户端工厂。 | IRestfulClientFactory | |
compress (advanced) | 将传出(POST/PUT)内容压缩为 GZIP 格式。 | false | 布尔值 |
configuration (advanced) | 使用共享配置。 | FhirConfiguration | |
connectionTimeout (advanced) | 尝试和建立初始 TCP 连接(毫秒)。 | 10000 | 整数 |
deferModelScanning (advanced) | 当设定此选项时,不会为子对象扫描模型类,直到实际访问给定类型的子列表为止。 | false | 布尔值 |
fhirContext (advanced) | FhirContext 是要创建的昂贵的对象。为避免创建多个实例,可以直接设置它。 | FhirContext | |
forceConformanceCheck (advanced) | 强制检查。 | false | 布尔值 |
sessionCookie (advanced) | 要添加到每个请求的 HTTP 会话 Cookie。 | 字符串 | |
socketTimeout (advanced) | 阻止单个读/写操作的时长(单位为 ms)。 | 10000 | 整数 |
Summary (advanced) | 请求服务器使用 _summary 参数修改响应。 Enum 值:
| 字符串 | |
validationMode (advanced) | 当 Camel 验证 FHIR 服务器的合规声明时。 Enum 值:
| ONCE | 字符串 |
proxyHost (proxy) | 代理主机。 | 字符串 | |
proxyPassword (proxy) | 代理密码。 | 字符串 | |
proxyPort (proxy) | 代理端口。 | 整数 | |
proxyUser (proxy) | 代理用户名。 | 字符串 | |
accessToken (security) | OAuth 访问令牌。 | 字符串 | |
password (security) | 用于基本身份验证的用户名。 | 字符串 | |
用户名 (安全性) | 用于基本身份验证的用户名。 | 字符串 |
33.5. 端点选项
FHIR 端点使用 URI 语法进行配置:
fhir:apiName/methodName
使用以下路径和查询参数:
33.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
apiName (common) | 需要 执行什么操作。 Enum 值:
| FhirApiName | |
methodName (common) | 必需的所选操作需要哪些子操作。 | 字符串 |
33.5.2. 查询参数(44 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
编码 (common) | 用于所有请求的编码。 Enum 值:
| 字符串 | |
fhirVersion (common) | 要使用的 FHIR 版本。 Enum 值:
| R4 | 字符串 |
inBody (common) | 设置要在交换中传递的参数名称。 | 字符串 | |
log (common) | 将记录每个请求和响应。 | false | 布尔值 |
prettyPrint (common) | 用户用户打印所有请求。 | false | 布尔值 |
serverUrl (common) | FHIR 服务器基本 URL。 | 字符串 | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
client (advanced) | 使用自定义客户端。 | IGenericClient | |
clientFactory (advanced) | 使用自定义客户端工厂。 | IRestfulClientFactory | |
compress (advanced) | 将传出(POST/PUT)内容压缩为 GZIP 格式。 | false | 布尔值 |
connectionTimeout (advanced) | 尝试和建立初始 TCP 连接(毫秒)。 | 10000 | 整数 |
deferModelScanning (advanced) | 当设定此选项时,不会为子对象扫描模型类,直到实际访问给定类型的子列表为止。 | false | 布尔值 |
fhirContext (advanced) | FhirContext 是要创建的昂贵的对象。为避免创建多个实例,可以直接设置它。 | FhirContext | |
forceConformanceCheck (advanced) | 强制检查。 | false | 布尔值 |
sessionCookie (advanced) | 要添加到每个请求的 HTTP 会话 Cookie。 | 字符串 | |
socketTimeout (advanced) | 阻止单个读/写操作的时长(单位为 ms)。 | 10000 | 整数 |
Summary (advanced) | 请求服务器使用 _summary 参数修改响应。 Enum 值:
| 字符串 | |
validationMode (advanced) | 当 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 | |
scheduler (scheduler) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | Map | |
startScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
useFixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
accessToken (security) | OAuth 访问令牌。 | 字符串 | |
password (security) | 用于基本身份验证的用户名。 | 字符串 | |
用户名 (安全性) | 用于基本身份验证的用户名。 | 字符串 |
33.6. API 参数(13 API)
@FHIR 端点是基于 API 的组件,具有基于哪个 API 名称和 API 方法的额外参数。API 名称和 API 方法位于端点 URI 中,作为 apiName/methodName
路径参数:
fhir:apiName/methodName
下表列出 13 个 API 名称:
API 名称 | 类型 | 描述 |
---|---|---|
两者都 | API 用于 Fetch 服务器的能力语句 | |
两者都 | 创建操作的 API,用于在服务器上创建新资源实例 | |
两者都 | 删除操作的 API,它在服务器资源上执行逻辑删除 | |
两者都 | 历史记录方法的 API | |
两者都 | 使用 atom 捆绑包中的 link type=next 标签中指定的链接,从分页集中加载之前/下一步资源捆绑包的 API | |
两者都 | meta 操作的 API,可用于获取、添加和删除资源或跨服务器中的标签和其他 Meta 元素 | |
两者都 | 扩展 FHIR 操作的 API | |
两者都 | 补丁操作的 API,它在服务器资源上执行逻辑补丁 | |
两者都 | 用于读取操作的 API 方法 | |
两者都 | API 搜索与给定条件匹配的资源 | |
两者都 | 将事务(资源集合)发送到服务器以作为一个单元执行的 API | |
两者都 | 更新操作的 API,它在服务器资源上执行逻辑删除 | |
两者都 | 用于验证资源的 API |
每个 API 记录在以下部分中。
33.6.1. API: capabilities
支持生成者和消费者
capabilities API 在语法中定义,如下所示:
fhir:capabilities/methodName?[parameters]
此方法列在下表中,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
使用给定的模型类型检索合规语句 |
33.6.1.1. Type 方法
signatures:
- org.hl7.fhir.instance.model.api.IBaseConformance ofType (Class<org.hl7.fhir.instance.model.api.IBaseConformance> type, 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
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.2. API: create
支持生成者和消费者
create API 以语法定义,如下所示:
fhir:create/methodName?[parameters]
下表中列出了 1 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
在服务器上创建一个 IBaseResource |
33.6.2.1. 方法资源
signatures:
- ca.uhn.fhir.rest.api.MethodOutcome resource (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 resource (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, Object> extraParameters);
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,可以是 null | 字符串 |
除了上面的参数外,fhir API 也可以使用任何 Query 参数。
任何参数可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
的格式。inBody
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.3. API: delete
支持生成者和消费者
delete API 以语法定义,如下所示:
fhir:delete/methodName?[parameters]
下表中列出了 3 种方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
删除给定资源 | |
按资源类型 e 删除资源 | |
指定删除应作为一个条件删除对给定的搜索 URL 执行 |
33.6.3.1. 方法资源
signatures:
- org.hl7.fhir.instance.model.api.IBaseOperationOutcome resource (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 |
33.6.3.2. 方法 resourceById
signatures:
- 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 | 字符串 |
33.6.3.3. method resourceConditionalByUrl
signatures:
- 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
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.4. API: history
支持生成者和消费者
历史 API 以语法定义,如下所示:
fhir:history/methodName?[parameters]
下表中列出了 3 种方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
在服务器上对特定资源(按 ID 和类型)在所有版本间执行操作 | |
对服务器上所有类型的所有资源版本执行操作 | |
对服务器上给定类型的所有资源的所有版本执行操作 |
33.6.4.1. method onInstance
signatures:
- org.hl7.fhir.instance.model.api.IBaseBundle onInstance (org.hl7.fhir.instance.model.api.IIdType id, Class<org.hl7.fhir.instance.model.api.model.api.IBaseBundle> returnType, Integer count, java.util.Date cutoff, org.hl7.fhir.instance.model.api.IPrimitType<javac.Date cutoff, org.hl7.fhir 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 | 必须使用资源类型和资源 ID 填充的 IIdType | IIdType |
returnType | 请求该方法返回 Bundle 资源(如 ca.uhn.fhir.model.dstu2.resource.Bundle)。如果您要访问 DSTU2 服务器,请使用此方法。 | 类 |
33.6.4.2. Server 上的方法
signatures:
- 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, 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 服务器,请使用此方法。 | 类 |
33.6.4.3. 方法 onType
signatures:
- 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, 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
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.5. api: load-page
支持生成者和消费者
载入页面 API 以语法中定义,如下所示:
fhir:load-page/methodName?[parameters]
下表中列出了 3 种方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
使用给定 URL 和捆绑包类型加载结果页面,并返回 DSTU1 Atom 捆绑包 | |
使用捆绑包中下一个关系的链接来加载下一页的结果 | |
使用捆绑包中关系 prev 的链接加载前面的结果页面 |
33.6.5.1. method byUrl
signatures:
- 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 | 字符串 |
33.6.5.2. 下一步方法
signatures:
- 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 |
33.6.5.3. 之前的方法
signatures:
- 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
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.6. api: meta
支持生成者和消费者
meta API 以语法定义,如下所示:
fhir:meta/methodName?[parameters]
下表中列出了 5 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
将给定元数据中的元素添加到已存在的集合中(请勿删除任何) | |
从给定的 ID 中删除给定元数据中的元素 | |
从特定资源获取当前元数据 | |
从整个服务器获取当前元数据 | |
从特定类型的中获取当前元数据 |
33.6.6.1. 方法添加
signatures:
- 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 |
33.6.6.2. 方法删除
signatures:
- 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 |
33.6.6.3. 方法 getFromResource
signatures:
- 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, Object> extraParameters;
fhir/getFromResource API 方法在下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 有关可传递的参数的完整列表,请参阅 ExtraParameters,可以是 NULL | Map |
id | id | IIdType |
metaType | IBaseMetaType 类 | 类 |
33.6.6.4. 方法 getFromServer
signatures:
- 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) | 类 |
33.6.6.5. 方法 getFromType
signatures:
- org.hl7.fhir.instance.model.api.IBaseMetaType getFromType (Class<org.hl7.fhir.instance.model.api.IBaseMetaType> metaType, String resourceType, java.util.Map<org.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
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.7. API: 操作
支持生成者和消费者
操作 API 以语法定义,如下所示:
fhir:operation/methodName?[parameters]
下表中列出了 5 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
在服务器上对特定资源(按 ID 和类型)在所有版本间执行操作 | |
此操作在资源的特定版本上运行 | |
对服务器上所有类型的所有资源版本执行操作 | |
对服务器上给定类型的所有资源的所有版本执行操作 | |
此操作称为由 FHIR 规范定义的 $process-message |
33.6.7.1. method onInstance
signatures:
- org.hl7.fhir.instance.model.api.IBaseResource onInstance (org.hl7.fhir.instance.model.api.IIdType id, String name, org.hl7.fhir.instance.model.api.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputParameterType, 布尔值 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 | 用于输出参数的类型(这应设置为来自您使用的 FHIR 结构版本的 Parameters.class drawn),可以是 NULL。 | 类 |
parameters | 用作输入的参数。如果操作不需要任何输入参数,则也可能为 null。 | IBaseParameters |
returnType | 如果此操作返回单个资源正文作为其返回类型而不是 Parameters 资源,请使用此方法指定该资源类型。这对返回捆绑包而不是 Parameters 资源的某些操作(如 Patient/NN/$everything)非常有用。 | 类 |
useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
33.6.7.2. method onInstanceVersion
signatures:
- org.hl7.fhir.instance.model.api.IBaseResource onInstanceVersion (org.hl7.fhir.instance.model.api.IIdType id, String name, org.hl7.fhir.instance.model.api.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputParameterType, 布尔值 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 | 用于输出参数的类型(这应设置为来自您使用的 FHIR 结构版本的 Parameters.class drawn),可以是 NULL。 | 类 |
parameters | 用作输入的参数。如果操作不需要任何输入参数,则也可能为 null。 | IBaseParameters |
returnType | 如果此操作返回单个资源正文作为其返回类型而不是 Parameters 资源,请使用此方法指定该资源类型。这对返回捆绑包而不是 Parameters 资源的某些操作(如 Patient/NN/$everything)非常有用。 | 类 |
useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
33.6.7.3. Server 上的方法
signatures:
- org.hl7.fhir.instance.model.api.IBaseResource onServer (String name, org.hl7.fhir.instance.model.api.IBaseParameters 参数, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputParameterType, boolean useHttpGet, Class<org.hl7.fhir.instance.model.api.IBaseResource>, returnTypeType java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onServer API 方法在下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 有关可传递的参数的完整列表,请参阅 ExtraParameters,可以是 NULL | Map |
name | 操作名称 | 字符串 |
outputParameterType | 用于输出参数的类型(这应设置为来自您使用的 FHIR 结构版本的 Parameters.class drawn),可以是 NULL。 | 类 |
parameters | 用作输入的参数。如果操作不需要任何输入参数,则也可能为 null。 | IBaseParameters |
returnType | 如果此操作返回单个资源正文作为其返回类型而不是 Parameters 资源,请使用此方法指定该资源类型。这对返回捆绑包而不是 Parameters 资源的某些操作(如 Patient/NN/$everything)非常有用。 | 类 |
useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
33.6.7.4. 方法 onType
signatures:
- 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, 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 | 用于输出参数的类型(这应设置为来自您使用的 FHIR 结构版本的 Parameters.class drawn),可以是 NULL。 | 类 |
parameters | 用作输入的参数。如果操作不需要任何输入参数,则也可能为 null。 | IBaseParameters |
resourceType | 要操作的资源类型 | 类 |
returnType | 如果此操作返回单个资源正文作为其返回类型而不是 Parameters 资源,请使用此方法指定该资源类型。这对返回捆绑包而不是 Parameters 资源的某些操作(如 Patient/NN/$everything)非常有用。 | 类 |
useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
33.6.7.5. method processMessage
signatures:
- 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.component.fhir.api.ExtraParameters>, ObjectParameters; extraParameters; extraParameter
fhir/processMessage API 方法在下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
asynchronous | 是否异步处理消息,还是同步,默认为同步。 | 布尔值 |
extraParameters | 有关可传递的参数的完整列表,请参阅 ExtraParameters,可以是 NULL | Map |
msgBundle | 将 Message Bundle 设置为 POST 到消息传递服务器 | IBaseBundle |
respondToUri | 可选的查询参数(表示来自接收服务器的响应应发送到这个 URI)可以是 NULL | 字符串 |
responseClass | 响应类 | 类 |
除了上面的参数外,fhir API 也可以使用任何 Query 参数。
任何参数可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
的格式。inBody
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.8. API: patch
支持生成者和消费者
patch API 以语法定义,如下所示:
fhir:patch/methodName?[parameters]
下表列出 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
将补丁应用到给定的资源 ID | |
指定更新应作为针对给定搜索 URL 创建的条件执行 |
33.6.8.1. 方法 patchById
signatures:
- ca.uhn.fhir.rest.api.MethodOutcome patchById (String patchBody, String stringId, ca.uhn.fhir.rest.api.PreferReturnEnum 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, Object> extraParameters);
fhir/patchById API 方法在下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 有关可传递的参数的完整列表,请参阅 ExtraParameters,可以是 NULL | Map |
id | 要修补的资源 ID | IIdType |
patchBody | 补丁文档在 XML 或 JSON 中序列化的正文 | 字符串 |
preferReturn | 在请求中添加 Prefer 标头,该请求服务器包含或阻止资源正文作为结果的一部分。如果服务器返回资源,它将通过 MethodOutcome#getResource ()解析可由客户端访问的资源。 | PreferReturnEnum |
stringId | 要修补的资源 ID | 字符串 |
33.6.8.2. 方法 patchByUrl
signatures:
- 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
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.9. api: read
支持生成者和消费者
read API 以语法定义,如下所示:
fhir:read/methodName?[parameters]
下表列出 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
根据 id 读取服务器上的 IBaseResource | |
使用 url 读取服务器上的 IBaseResource |
33.6.9.1. 方法 resourceById
signatures:
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, Long longId, String ifVersionMatches, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, String ifVersionMatches, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource> 布尔值 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, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource, returnResource, 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 returnResource, boolean throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters;
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (String resourceClass, String stringId, String ifVersionMatches, String version, Boolean returnNull, org.hl7.fhir.instance.model.api.model.api.IBaseResource returnResource, boolean throwError, java.util.Map<org.apache.camel.component.fhir.api.Parameters, Object> 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, java.util.Map<org.apache.camel.component.fhir.api.Parameters>, ObjectParameters>
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 | 资源版本 | 字符串 |
33.6.9.2. method resourceByUrl
signatures:
- org.hl7.fhir.instance.model.api.IBaseResource resourceByUrl (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, String url, ifVersionMatches, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, String url, ifVersionMatches, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource> 布尔值 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, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource, returnResourceResource, string ifVersionMatches, organization.hl7.fhir 布尔值 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.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- 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.model.api.IBaseResource returnResource, 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/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
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.10. api: search
支持生成者和消费者
搜索 API 在语法中定义,如下所示:
fhir:search/methodName?[parameters]
下表中列出了 1 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
根据 URL 直接执行搜索 |
33.6.10.1. 方法 searchByUrl
signatures:
- 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
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.11. API: transaction
支持生成者和消费者
事务 API 以语法定义,如下所示:
fhir:transaction/methodName?[parameters]
下表列出 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
使用给定的原始文本(应是 Bundle 资源)作为事务输入 | |
使用资源列表作为事务输入 |
33.6.11.1. 使用Bundle 的方法
signatures:
- string withBundle (String stringBundle, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseBundle withBundle (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 | 在事务中使用的捆绑包 | 字符串 |
33.6.11.2. method withResources
signatures:
- 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 |
资源 | 在事务中使用的资源 | list |
除了上面的参数外,fhir API 也可以使用任何 Query 参数。
任何参数可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
的格式。inBody
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.12. API: update
支持生成者和消费者
更新 API 以语法定义,如下所示:
fhir:update/methodName?[parameters]
下表列出 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
按 id 更新服务器上的 IBaseResource | |
通过搜索 url 更新服务器上的 IBaseResource |
33.6.12.1. 方法资源
signatures:
- 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 resource (String resourceAsString, org.hl7.fhir.instance.model.api.IIdType id, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- ca.uhn.fhir.rest.api.MethodOutcome resource (org.hl7.fhir.instance.model.api.IBaseResource resource, String stringId, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- ca.uhn.fhir.rest.api.MethodOutcome resource (org.hl7.fhir.instance.model.api.IBaseResource resource, org.hl7.fhir.instance.model.api.IIdType id, ca.uhn.fhir.rest.api.PreferReturnnumE preferReturnnum, java.util.Map<org.apache.camel.component.fhir.api.Parameters>s; extraParameters; extraParameters;
fhir/resource API 方法在下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 有关可传递的参数的完整列表,请参阅 ExtraParameters,可以是 NULL | Map |
id | 引用资源的 IIdType | IIdType |
preferReturn | 服务器是否包含或阻止资源正文作为结果的一部分 | PreferReturnEnum |
resource | 要更新的资源(如 Patient) | IBaseResource |
resourceAsString | 要更新的资源正文 | 字符串 |
stringId | 引用资源的 ID | 字符串 |
33.6.12.2. method resourceBySearchUrl
signatures:
- ca.uhn.fhir.rest.api.MethodOutcome resourceBySearchUrl (String resourceAsString, String url, ca.uhn.fhir.rest.api.PreferReturnEnum 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 preferReturnEnum preferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resourceBySearchUrl API 方法在下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 有关可传递的参数的完整列表,请参阅 ExtraParameters,可以是 NULL | Map |
preferReturn | 服务器是否包含或阻止资源正文作为结果的一部分 | PreferReturnEnum |
resource | 要更新的资源(如 Patient) | IBaseResource |
resourceAsString | 要更新的资源正文 | 字符串 |
url | 指定更新应作为针对给定搜索 URL 创建的条件执行 | 字符串 |
除了上面的参数外,fhir API 也可以使用任何 Query 参数。
任何参数可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
的格式。inBody
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.6.13. api: validate
支持生成者和消费者
validate API 在语法中定义,如下所示:
fhir:validate/methodName?[parameters]
下表中列出了 1 方法,后跟每种方法的详细语法。(API 方法可以有一个简写别名名称,可用于语法而不是名称)
方法 | 描述 |
---|---|
验证资源 |
33.6.13.1. 方法资源
signatures:
- 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 resource (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
参数覆盖消息标头,即 endpoint 参数 inBody=myParameterNameHere
覆盖 CamelFhir.myParameterNameHere
标头。
33.7. Spring Boot Auto-Configuration
组件支持 56 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 连接(毫秒)。 | 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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.fhir.log | 将记录每个请求和响应。 | false | 布尔值 |
camel.component.fhir.password | 用于基本身份验证的用户名。 | 字符串 | |
camel.component.fhir.pretty-print | 用户用户打印所有请求。 | 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 标头。例如,用于数据格式到 XML 的 application/xml 或用于数据格式的 application/json 发送到 JSON。 | true | 布尔值 |
camel.dataformat.fhirjson.dont-encode-elements | 如果提供,则指定不应编码的元素。此字段的有效值包括: 病人 - Don't encode 病人及其所有子人的 Patient.name - Don 并不编码病人名 Patient.name.family - Don't encode of the patient's family name .text - Don't en the text element on any resource (只有第一个位置可能包含通配符) DSTU2 备注: 请注意,包括 meta 的值(如 Patient.meta )将可用于 DSTU2 解析器,但 meta (如 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.name - Encode 只包括病人的名称 Patient.name.family - Encode 只包括 .text - Encode - Encode the text element on any resource (只有第一个位置可能包含通配符) . (必需)- 这是一个特殊情况,这会导致任何必需的字段(min)为 0。 | Set | |
camel.dataformat.fhirjson.encode-elements-applies-to-child-resources-only | 如果设置为 true (默认为 false),提供给 setEncodeElements (Set)的值不会应用到根资源(通常是 Bundle),但会应用到该捆绑包中包含的任何子资源(例如,搜索结果资源)。 | 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 规格标记为 is summary 元素的元素。 | false | 布尔值 |
camel.dataformat.fhirjson.suppress-narratives | 如果设置为 true (默认为 false),则行为不会包含在编码的值中。 | false | 布尔值 |
camel.dataformat.fhirxml.content-type-header | 数据格式是否应该使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式到 XML 的 application/xml 或用于数据格式的 application/json 发送到 JSON。 | true | 布尔值 |
camel.dataformat.fhirxml.dont-encode-elements | 如果提供,则指定不应编码的元素。此字段的有效值包括: 病人 - Don't encode 病人及其所有子人的 Patient.name - Don 并不编码病人名 Patient.name.family - Don't encode of the patient's family name .text - Don't en the text element on any resource (只有第一个位置可能包含通配符) DSTU2 备注: 请注意,包括 meta 的值(如 Patient.meta )将可用于 DSTU2 解析器,但 meta (如 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.name - Encode 只包括病人的名称 Patient.name.family - Encode 只包括 .text - Encode - Encode the text element on any resource (只有第一个位置可能包含通配符) . (必需)- 这是一个特殊情况,这会导致任何必需的字段(min)为 0。 | Set | |
camel.dataformat.fhirxml.encode-elements-applies-to-child-resources-only | 如果设置为 true (默认为 false),提供给 setEncodeElements (Set)的值不会应用到根资源(通常是 Bundle),但会应用到该捆绑包中包含的任何子资源(例如,搜索结果资源)。 | 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 规格标记为 is summary 元素的元素。 | false | 布尔值 |
camel.dataformat.fhirxml.suppress-narratives | 如果设置为 true (默认为 false),则行为不会包含在编码的值中。 | false | 布尔值 |
第 34 章 File
支持生成者和消费者
File 组件提供对文件系统的访问,允许由任何其他 Camel 组件或来自其他组件的消息处理文件到磁盘。
34.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用文件时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-file-starter</artifactId> </dependency>
34.2. URI 格式
file:directoryName[?options]
其中 directoryName 代表底层文件目录。
仅目录
Camel 仅支持使用起始目录配置的端点。因此,catalogName 必须是目录。如果只想消耗单个文件,您可以使用 fileName 选项,例如通过设置 fileName=thefilename
。此外,起始目录不得包含带有 ${ }
占位符的动态表达式。再次使用 fileName
选项指定文件名的动态部分。
避免读取当前由另一个应用程序写入的文件
。注意 JDK File IO API 在检测另一个应用程序当前正在写入/复制文件时有点限制。根据操作系统平台,实施也可以不同。这可能会导致 Camel 认为文件不会被另一个进程锁定,并开始使用该文件。因此,您必须自己自行调查您的环境套件。为了帮助此 Camel,可以使用不同的 readLock
选项和 doneFileName
选项。另请参阅 使用来自其他直接丢弃文件的文件夹的文件 部分。
34.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
34.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
34.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
34.4. 组件选项
File 组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
34.5. 端点选项
File 端点使用 URI 语法进行配置:
file:directoryName
使用以下路径和查询参数:
34.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
directoryName (common) | 必需 起始目录。 | File |
34.5.2. 查询参数(94 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
charset (common) | 此选项用于指定文件的编码。您可以在消费者上使用此选项,指定文件的编码,允许 Camel 知道它应在访问文件内容时加载文件内容。在编写文件时,您也可以使用此选项来指定同时写入该文件的 charset。请记住,在编写文件 Camel 时,可能需要将消息内容读到内存中,才能将数据转换为配置的 charset,因此如果您有大量消息,则不要使用它。 | 字符串 | |
doneFileName (common) | 生产者:如果提供,则 Camel 将在写入原始文件时编写完第 2 个文件。完成的文件将为空。这个选项配置要使用的文件名。可以指定固定名称。或者您可以使用动态占位符。完成的文件将始终写在与原始文件相同的文件夹中。消费者:如果提供,Camel 仅在文件存在时使用文件。这个选项配置要使用的文件名。可以指定固定名称。或者,您可以使用动态占位符。done 文件始终位于与原始文件相同的文件夹中。仅支持 $\\{file.name} 和 $\\{file.name.next} 作为动态占位符。 | 字符串 | |
filename ( common) | 使用文件语言等表达式动态设置文件名。对于消费者,它用作文件名过滤器。对于生成者,它用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注:标题本身也可以是表达式)。表达式选项支持 String 和 Expression 类型。如果表达式是 String 类型,则始终使用 File Language 来评估它。如果表达式是 Expression 类型,则使用指定的 Expression 类型 - 这允许您,使用 OGNL 表达式。对于消费者,您可以使用它来过滤文件名,因此您可以使用 File Language 语法:mydata-$\\{date:now:yyyyMMdd}.txt,实例消耗了现在的文件。生产者支持 CamelOverruleFileName 标头,它优先于任何现有的 CamelFileName 标头;CamelOverruleFileName 是一个仅使用的标头,因此可以更轻松地避免临时存储 CamelFileName,之后必须恢复它。 | 字符串 | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
delete (consumer) | 如果为 true,则该文件会在成功处理后删除。 | false | 布尔值 |
moveFailed (consumer) | 根据简单语言设置移动失败表达式。例如,要将文件移动到 .error 子目录,请使用: .error。注意:当将文件移动到故障位置 Camel 将处理错误时,不会再次获取该文件。 | 字符串 | |
noop (consumer) | 如果为 true,则文件不会以任何方式移动或删除。这个选项适用于只读数据,或用于 ETL 类型要求。如果 noop=true,Camel 也会设置 idempotent=true,以避免通过和再次消耗同一文件。 | false | 布尔值 |
preMove (consumer) | 表达式(如文件语言)用于在处理前动态设置文件名。例如,要将 in-progress 文件移到订购目录中,将此值设置为 order。 | 字符串 | |
preSort (consumer) | 启用 pre-sort 后,消费者将在轮询期间对文件和目录名称进行排序,该名称从文件系统检索。如果您需要按排序的顺序对文件进行操作,您可能需要执行此操作。预排序在消费者开始过滤前执行,并接受 Camel 处理的文件。这个选项是 default=false 表示禁用。 | false | 布尔值 |
递归 (consumer) | 如果某个目录,也会在所有子目录中查找文件。 | false | 布尔值 |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
directoryMustExist (consumer (advanced)) | 与 startDirectoryMustExist 选项类似,但这会在轮询期间应用(在启动消费者后)。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
extendedAttributes (consumer (advanced)) | 定义感兴趣的文件属性。与 posix:permissions,posix:owner,basic:lastAccessTime 一样,它支持基本的通配符,如 posix:, basic:lastAccessTime。 | 字符串 | |
inProgressRepository (consumer (advanced)) | 可插拔式存储库 org.apache.camel.spi.IdempotentRepository.in-progress 存储库用于考虑被消耗的进度文件的当前。默认情况下,使用基于内存的存储库。 | IdempotentRepository | |
localWorkDirectory (consumer (advanced)) | 使用时,可以使用本地工作目录直接将远程文件内容存储在本地文件中,以避免将内容加载到内存中。这非常有用,如果您使用一个非常大的远程文件,从而可以节省内存。 | 字符串 | |
onCompletionExceptionHandler (consumer (advanced)) | 使用自定义 org.apache.camel.spi.ExceptionHandler 处理在完成过程中发生的任何抛出异常,供消费者执行提交或回滚。默认实现将在 WARN 级别记录任何异常并忽略。 | ExceptionHandler | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
probeContentType (consumer (advanced)) | 是否启用内容类型的探测。如果启用,则消费者使用 Files#probeContentType (java.nio.file.Path)来确定文件的内容类型,并将它存储为消息上带有键 Exchange#FILE_CONTENT_TYPE 的标头。 | false | 布尔值 |
processStrategy (consumer (advanced)) | 可插拔 org.apache.camel.component.file.GenericFileProcessStrategy 允许您实施自己的 readLock 选项或类似选项。也可以在使用文件之前满足特殊条件时使用,如存在特殊就绪的文件。如果设置了这个选项,则不会应用 readLock 选项。 | GenericFileProcessStrategy | |
resumeStrategy (consumer (advanced)) | 为文件设置恢复策略。这样,可以在停止应用程序前定义在最后一次点后恢复读取文件的策略。有关实现详情,请参阅 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) | 如果文件名称已存在,则该怎么办。override (默认文件)替换现有文件。- Append - 将内容添加到现有文件。- Fail - 抛出 GenericFileOperationException,表示已有现有文件。- Ignore - 静默忽略问题,且不会覆盖现有文件,但假设所有内容都正常。- Move - 选项需要使用 moveExisting 选项进行配置。选项 eagerDeleteTargetFile 可用于控制移动文件时要执行的操作,并且存在现有文件,否则会导致 move 操作失败。Move 选项将移动任何现有文件,然后再编写目标文件。- 只有使用 tempFileName 选项时才适用 TryRename。这允许尝试将该文件从临时名称重命名为实际名称,而无需进行任何存在的检查。对于某些文件系统,特别是 FTP 服务器上,这个检查可能会更快。 Enum 值:
| override | GenericFileExist |
flatten (producer) | flatten 用于扁平化文件名路径,以剥离任何前导路径,因此它只是文件名。这样,您便可以将递归地消耗到子目录中,但当您将文件写入另一个目录时,会将文件写入单个目录中。在生成者上将其设置为 true 强制执行 CamelFileName 标头中的任何文件名将被剥离任何前导路径。 | false | 布尔值 |
jailStartingDirectory (producer) | 用于仅向起始目录(和子)写入文件。这默认是启用的,不允许 Camel 将文件写入外部目录(在开箱即用的情况下更为安全)。您可以关闭此选项,以允许将文件写入起始目录之外的目录,如父目录或根文件夹。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
moveExisting (producer) | 表达式(如文件语言)用于在配置 fileExist=Move 时使用计算文件名。要将文件移动到备份子目录中,只需输入 backup。这个选项只支持以下文件语言令牌: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' 中的最终文件位置,而不是基础 uri 中的目标目录。例如,如果选项 fileName 包含目录前缀:dir/finalFilename,则 tempFileName 相对于该子目录 dir。 | 字符串 | |
tempPrefix (producer) | 此选项用于使用临时名称写入文件,然后在写入完成后将其重命名为实际名称。可用于识别正在写入的文件,也可避免消费者(不使用专用读取锁定)读取进度文件。在上传大型文件时,FTP 通常使用 FTP。 | 字符串 | |
allowNullBody (producer (advanced)) | 用于指定文件写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,如果设为 false,并尝试将 null 正文发送到文件组件,则将抛出 'Cannot write null body to file.' 的 GenericFileWriteException。如果 fileExist 选项被设置为 'Override',则该文件将被截断,如果设为 附加该文件,则该文件将保持不变。 | false | 布尔值 |
chmod (producer (advanced)) | 指定制作者发送的文件权限,chmod 值必须在 000 和 777 之间;如果有一个前导数字,如 0755,我们将忽略它。 | 字符串 | |
chmodDirectory (producer (advanced)) | 指定制作者创建缺失目录时使用的目录权限,chmod 值必须在 000 和 777 之间;如果 0755 中有一个前导数字,我们将忽略它。 | 字符串 | |
eagerDeleteTargetFile (producer (advanced)) | 是否强制删除任何现有目标文件。这个选项仅在使用 fileExists=Override 和 tempFileName 选项时才适用。您可以使用此选项禁用(将其设置为 false)在编写 temp 文件前删除目标文件。例如,您可以编写大文件,并且希望目标文件在 temp 文件被写入期间存在。这样可保证仅删除目标文件,直到最后一次时间之前,只需将 temp 文件重命名为目标文件名之前。这个选项还用于控制是否在启用 fileExist=Move 时删除任何现有的文件,并且存在现有文件。如果此选项 copyAndDeleteOnRenameFails false,则现有文件存在时会抛出异常(如果其为 true),则在移动操作前会删除现有文件。 | true | 布尔值 |
forceWrites (producer (advanced)) | 是否强制同步对文件系统的写操作。如果您不希望此级别保证,例如,如果写入日志/审计日志等,您可以关闭此项。这会产生更好的性能。 | true | 布尔值 |
keepLastModified (producer (advanced)) | 将保留来自源文件的最后修改的时间戳(如果有)。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或 long (时间戳)。如果时间戳存在,且启用了 选项,它将在写入的文件上设置这个时间戳。注意:此选项仅适用于文件制作者。您不能将此选项与任何 ftp producer 一起使用。 | false | 布尔值 |
moveExistingFileStrategy (producer (advanced)) | 策略(Custom Strategy)用于移动带有特殊命名令牌的文件,以便在配置了 fileExist=Move 时使用。默认情况下,如果没有提供自定义策略,则使用实现。 | FileMoveExistingStrategy | |
auto create (advanced) | 在文件的路径名称中自动创建缺少的目录。对于文件消费者,这意味着创建起始目录。对于文件制作者,这意味着应写入文件的目录。 | true | 布尔值 |
bufferSize (advanced) | 用于编写文件的缓冲区大小(如果是 FTP 用于下载和上传文件)。 | 131072 | int |
copyAndDeleteOnRenameFail (advanced) | 如果无法重命名该文件,是否回退到副本和删除文件。这个选项不适用于 FTP 组件。 | true | 布尔值 |
renameUsingCopy (advanced) | 使用 copy 和 delete 策略执行重命名操作。这主要用于常规重命名操作不可靠(例如在不同文件系统或网络之间)。这个选项优先于 copyAndDeleteOnRenameFail 参数,该参数会自动回退到复制和删除策略,但仅在额外的延迟后。 | false | 布尔值 |
同步 (advanced) | 设置是否应严格使用同步处理。 | 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) | 用于排除文件,如果文件名与正则表达式模式匹配(匹配区分大小写)。请注意,如果您使用符号(如加号),如果将其配置为 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:yyyMMdd}。 | 字符串 | |
filterFile (filter) | 根据简单语言过滤文件。例如,要过滤文件大小,您可以使用 $\\{file:size} 5000。 | 字符串 | |
idempotent (filter) | 使用 Idempotent Consumer EIP 模式的选项让 Camel 跳过已经处理的文件。默认情况下,将使用基于内存的 LRUCache 来保存 1000 条目。如果 noop=true,则同时启用幂等性,以避免再次消耗同一文件。 | false | 布尔值 |
idempotentKey (filter) | 使用自定义幂等密钥。默认情况下,使用文件的绝对路径。您可以使用文件语言,例如要使用文件名和文件大小,您可以执行: idempotentKey=$\\{file:name}-$\\{file:size}-$\\{file:size}。 | 字符串 | |
idempotentRepository (filter) | 可插拔存储库 org.apache.camel.spi.IdempotentRepository,如果未指定,并且 idempotent 为 true,则默认使用 MemoryIdempotentRepository。 | IdempotentRepository | |
Include (filter) | 用于包括文件,如果文件名与正则表达式模式匹配(匹配区分大小写)。请注意,如果您使用符号(如加号),如果将其配置为 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) | 定义每个轮询收集的最多消息。默认情况下,没有设置最大值。可用于设置限制,例如 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 (例如,该文件不是 in-progress 或被写入)时轮询文件。Camel 将等待文件锁定被赋予。此选项在策略中提供构建:- none - No read lock is in use - markerFile - Camel 创建一个标记文件(fileName.camelLock),然后在其上保存锁定。这个选项不适用于 FTP 组件 - 更改 - Changed 使用文件长度/修改时间戳来检测文件当前是否正在复制。至少将使用 1 sec 来确定这一点,因此此选项不能像其他人一样快消耗文件,但可以更可靠,因为 JDK IO API 无法始终确定文件当前是否被其他进程使用。选项 readLockCheckInterval 可用于设置检查频率。- fileLock - 用于使用 java.nio.channels.FileLock。这个选项不适用于 Windows OS 和 FTP 组件。当通过 mount/share 访问远程文件系统时,应避免使用这种方法,除非该文件系统支持分布式文件锁定。- rename 使用尝试将文件重命名为测试(如果我们可以获得独家的 read-lock. - 幂等 - (仅针对文件组件)是使用幂等Repository 作为 read-lock。这允许在幂等存储库实施支持集群时使用读取锁定。- idempotent-changed - (仅适用于文件组件) idempotent-changed 用于使用 idempotentRepository 并更改为组合的 read-lock。这允许在幂等存储库实施支持集群时使用读取锁定。- idempotent-rename - (仅适用于文件组件) idempotent-rename 用于使用 idempotentRepository,并作为组合的 read-lock 重命名。如果幂等存储库实现支持集群,这允许使用支持集群的读取锁定。不同的读取锁定并不适合以集群模式工作,其中不同节点上的并发消费者对共享文件系统上的相同文件竞争。flagsFile 使用接近 atomic 操作来创建空标记文件,但无法保证在集群中工作。fileLock 可以更好地工作,但文件系统需要支持分布式文件锁定,以此类推。如果幂等存储库支持集群(如 Hazelcast 组件或 Infinispan),则使用幂等的读取锁定可以支持集群。 Enum 值:
| none | 字符串 |
readLockCheckInterval (lock) | 如果读取锁定支持,则 read-lock 中的间隔为 millis。此间隔用于尝试获取读取锁之间的睡眠状态。例如,在使用更改的读取锁定时,您可以为文件设置更高的间隔周期,以便进行速度较慢的写入。默认值 1 sec。如果生成者的写入速度非常慢,则可能太快。注意:对于 FTP,默认的 readLockCheckInterval 是 5000。readLockTimeout 值必须大于 readLockCheckInterval,但 thumb 规则是有一个超时,它至少比 readLockCheckInterval 高 2 倍。这需要确保允许读取锁定进程在达到超时时间前尝试获取锁定。 | 1000 | long |
readLockDeleteOrphanLockFiles (lock) | 如果 Camel 没有正确关闭(如 JVM 崩溃),在启动后是否应该使用标记文件读取锁定删除任何孤立的读取锁定文件(如 JVM 崩溃)。如果将此选项转换为 false,则任何孤立的锁文件将导致 Camel 不尝试选择该文件,也可能是因为另一个节点同时从同一共享目录读取文件。 | true | 布尔值 |
readLockIdempotentReleaseAsync (lock) | 延迟发行任务是否应同步或异步。请参阅 readLockIdempotentReleaseDelay 选项的更多详情。 | false | 布尔值 |
readLockIdempotentReleaseAsyncPoolSize (lock) | 使用异步发行任务时调度的线程池中的线程数量。几乎所有用例中,使用默认的 1 个核心线程应该已经足够了,只有在更新幂等存储库时,或者有大量要处理的文件时,才会将其设置为更高的值。如果您通过配置 readLockIdempotentReleaseExecutorService 选项使用共享线程池,这个选项不会被使用。请参阅 readLockIdempotentReleaseDelay 选项的更多详情。 | int | |
readLockIdempotentReleaseDelay (lock) | 是否延迟 millis 期间内发行任务。这可用于在带有共享幂等存储库的主动/主动集群场景中,延迟发行任务以扩展窗口,因为存在竞争条件,因此无法扫描并获取相同的文件。通过扩展发行版本任务的 time-window 有助于防止这种情况。只有在将 readLockRemoveOnCommit 配置为 true 时才需要延迟。 | int | |
readLockIdempotentReleaseExecutorService (lock) | 使用自定义和共享线程池进行异步发行任务。请参阅 readLockIdempotentReleaseDelay 选项的更多详情。 | ScheduledExecutorService | |
readLockLoggingLevel (lock) | 无法获取读取锁定时使用的日志记录级别。默认情况下会记录 DEBUG。您可以更改此级别,例如,OFF 没有任何日志记录。这个选项只适用于 readLock 类型:change, 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。它允许您指定在处理文件成功时是否从幂等存储库中删除文件名条目,以及提交发生。默认情况下,文件不会被删除,这样可确保不会发生任何竞争条件,因此另一个活动节点可能会试图获取该文件。相反,idempotent 存储库可能支持驱除策略,这些策略可在 X 分钟后驱除文件名条目 - 这确保了竞争条件没有问题。请参阅 readLockIdempotentReleaseDelay 选项的更多详情。 | false | 布尔值 |
readLockRemoveOnRollback (lock) | 这个选项只适用于 readLock=idempotent。它指定在处理文件失败时是否从幂等存储库中删除文件名条目,以及进行回滚。如果此选项为 false,则确认文件名条目(就像文件执行提交一样)。 | true | 布尔值 |
readLockTimeout (lock) | 如果 read-lock 支持,则 read-lock 中的可选超时(如果支持)。如果无法授予 read-lock,并且触发超时,则 Camel 将跳过该文件。在下次轮询 Camel 时,将再次尝试 文件,这一次可能被赋予读锁。使用 0 或更低的值来指示永久。目前 fileLock,更改并重命名支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000,而不是 10000。readLockTimeout 值必须大于 readLockCheckInterval,但 thumb 规则是有一个超时,它至少比 readLockCheckInterval 高 2 倍。这需要确保允许读取锁定进程在达到超时时间前尝试获取锁定。 | 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 | |
scheduler (scheduler) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | Map | |
startScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
useFixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
shuffle (sort) | 要表示文件列表(按随机顺序排列)。 | false | 布尔值 |
sortby ( sort) | 使用文件语言进行内置排序。支持嵌套排序,因此您可以按文件名排序,并且按修改日期排序第二组。 | 字符串 | |
sorter (sort) | 可插拔排序器作为 java.util.Comparator 类。 | 比较器 |
文件生成者的默认行为
默认情况下,它会覆盖任何已存在的、带有相同名称的文件。
34.6. 移动和删除操作
在(post 命令)路由完成后执行任何移动或删除操作;因此,在处理 交换
时,该文件仍然位于 inbox 文件夹中。
我们通过一个示例来说明这一点:
from("file://inbox?move=.done").to("bean:handleOrder");
当在 inbox
文件夹中丢弃文件时,文件消费者会注意到它,并创建一个新的 FileExchange
,它路由到 handleOrder
bean。然后 bean 会处理 File
对象。此时,该文件仍然位于 inbox
文件夹中。在 bean 完成后,路由完成后,文件消费者将执行 move 操作,并将文件移到 .done
子文件夹。
move 和 preMove 选项被视为目录名称(尽管您使用 文件 语言等表达式),则表达式评估的结果是要使用的文件名。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_apache_camel/4.4/html-single/red_hat_build_of_apache_camel_for_spring_boot_reference/index#csb-camel-simple-language-starter例如,如果设置了:
move=../backup/copy-of-${file:name}
然后,使用我们使用的文件语言返回要使用的文件名,可以是相对或绝对的。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_apache_camel/4.4/html-single/red_hat_build_of_apache_camel_for_spring_boot_reference/index#csb-camel-file-language-starter如果相对,则该目录作为子文件夹创建自使用该文件的文件夹内。
默认情况下,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");
因此,在这种情况下,当处理和处理后,文件位于 progress 文件夹中
,它会移到 .done
文件夹。
34.7. 对 Move 和 PreMove 选项的精细控制
move 和 preMove 选项基于 Expression,因此我们拥有 文件 语言的完整电源,可以执行目录和名称模式的高级配置。
实际上,Camel 将内部将您输入的目录名称转换为 File Language 表达式。因此,当我们输入 move=.done
Camel 时,会将它转换为 :${file:parent}/.done/${file:onlyname}
。只有 Camel 检测到您在 option 值中未提供 $\{ } 时才完成此操作。因此,当您输入 $\{ } Camel 时,不会 转换它,因此您有完整的电源。
因此,如果我们希望将文件移到具有当天为模式的备份文件夹中,我们可以:
move=backup/${date:now:yyyyMMdd}/${file:name}
34.8. 关于 moveFailed
moveFailed
选项允许您将无法成功处理的文件移到其他位置,如您选择的错误文件夹。例如,要移动具有时间戳的错误文件夹中的文件,您可以使用 moveFailed=/error/${
}。
file:noext }-${date:
now:yyyyMMddHHmmssSSS}.${\'\'file:ext
34.9. 消息标头
此组件支持以下标头:
34.9.1. 仅文件制作者
标头 | 描述 |
---|---|
|
指定要写入的文件名(相对于端点目录)。此名称可以是 |
| 已写入的输出文件的实际绝对文件路径(路径 + 名称)。此标头由 Camel 设置,其目的是向最终用户提供写入的文件的名称。 |
|
用于覆盖 |
34.9.2. 仅文件消费者
标头 | 描述 |
---|---|
| 使用的文件的名称作为相对文件路径,其偏移来自端点上配置的起始目录。 |
| 仅文件名(没有前导路径的名称)。 |
|
|
| 文件的绝对路径。对于相对文件,此路径包含相对路径。 |
| 文件路径。对于相对文件,这是起始目录 + 相对文件名。对于绝对文件,这是绝对路径。 |
| 相对路径。 |
| 父路径。 |
|
包含文件大小 |
|
包含文件最后一次修改时间戳的 |
34.10. Batch Consumer
这个组件实现了 Batch Consumer。
34.11. 交换属性,仅限文件消费者
由于文件消费者实施 BatchConsumer
,它支持对它轮询的文件进行批处理。通过批处理,我们意味着 Camel 会将以下额外属性添加到交换中,因此您知道轮询的文件数量、当前索引以及批处理是否已完成。
属性 | 描述 |
---|---|
| 此批处理中轮询的文件总数。 |
| 批处理的当前索引。从 0 开始。 |
|
指示批处理中最后一个交换的 |
这样,您可以让实例知道此批处理中存在多少个文件,而实例则让 Aggregator2 聚合了这个文件数。
34.12. 使用 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 处理数据。在使用当前 charset 将内容写入 outbox 文件夹之前。
from("file:inbox?charset=utf-8") .convertBodyTo(byte[].class, "iso-8859-1") .to("bean:myBean") .to("file:outbox");
如果您在消费者端点上省略了 charset,则 Camel 不知道文件的 charset,默认情况下将使用 "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
属性。
如果您有一些问题,那么您可以在 org.apache.camel.component.file
上启用 DEBUG 日志记录,在使用特定 charset 读取/写入文件时 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
34.13. 常用带有文件夹和文件名的 getchas
当 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");
34.14. 文件名表达式
filename 可以使用 expression 选项或字符串在 CamelFileName
标头中的基于 File 语言表达式进行设置。如需语法和样本,请参阅 文件 语言。
34.15. 从其他人直接丢弃文件的文件夹中消耗文件
请注意,如果您消耗来自其他应用程序直接写入文件的文件夹。查看不同的 readLock 选项以查看适合您的用例。但是,最佳方法是写入另一个文件夹,并在 drop 文件夹中的文件移动之后。但是,如果您直接将文件写入 drop 文件夹,则选项更改可以更好地检测文件当前是否被写入/复制,因为它使用文件更改的算法来查看文件大小/修改在一段时间内的更改。其他 readLock 选项依赖于 Java File API,在检测这一点时并不总是非常好。您可能还想查看 doneFileName 选项,该选项使用标志文件(撤消文件)在文件完成时发出信号并准备好被使用。
34.16. 使用 done 文件
另请参阅在下面 写入 done 文件 的部分。
如果您只想在文件存在时消耗文件,则可以在端点上使用 doneFileName
选项。
from("file:bar?doneFileName=done");
如果在目标文件的同一个目录中存在一个 done 文件,将仅使用 bar 文件夹中的文件。在完成使用文件或,Camel 将自动删除 done 文件。如果配置了 noop=true
,则 Camel 不会删除 done 文件。
但是,每个目标文件都有一个 done 文件 更为常见。这意味着有一个 1:1 关联。为此,您必须在 doneFileName
选项中使用动态占位符。目前 Camel 支持以下两个动态令牌: file:name
和 file:name.noext
,它必须包括在 $\{ } 中。消费者只支持 done 文件名 的静态部分作为前缀或后缀(不能同时支持两者)。
from("file:bar?doneFileName=${file:name}.done");
如果存在名称文件名为 .done 的文件,则仅轮询 本例中的文件。例如:
-
hello.txt
- 是要消耗的文件 -
hello.txt.done
- 是关联的 done 文件
您还可以将前缀用于 done 文件,例如:
from("file:bar?doneFileName=ready-${file:name}");
-
hello.txt
- 是要消耗的文件 -
ready-hello.txt
- 是关联的 done 文件
34.17. 编写完成的文件
编写了一个文件后,您可能希望将其他 done文件 编写为标记类型,以指示其他文件已完成并已写入。为此,您可以在文件制作者端点上使用 doneFileName
选项。
.to("file:bar?doneFileName=done");
只需在与目标 文件相同的目录中
创建名为 的文件。
但是,每个目标文件都有一个 done 文件更为常见。这意味着有一个 1:1 关联。为此,您必须在 doneFileName
选项中使用动态占位符。目前 Camel 支持以下两个动态令牌: file:name
和 file:name.noext
,它必须包括在 $\{ } 中。
.to("file:bar?doneFileName=done-${file:name}");
如果目标文件是在与目标文件所在的相同目录中的 foo.txt
文件,则会创建一个名为 done-foo.txt
的文件。
.to("file:bar?doneFileName=${file:name}.done");
如果目标文件是在与目标文件所在的相同目录中的 foo.txt
文件,则会创建一个名为 foo.txt.done
的文件。
.to("file:bar?doneFileName=${file:name.noext}.done");
如果目标文件是在与目标文件所在的相同目录中的 foo.txt
文件,则会创建一个名为 foo.done
的文件。
34.18. Samples
34.18.1. 从目录读取并写入另一个目录
from("file://inputdir/?delete=true").to("file://outputdir")
34.18.2. 从目录读取并使用 overrule 动态名称写入另一个目录
from("file://inputdir/?delete=true").to("file://outputdir?overruleFile=copy-of-${file:name}")
侦听目录并为丢弃的每个文件创建一个消息。将内容复制到 outputdir
,并删除 inputdir
中的 文件。
34.18.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
34.19. 使用 flatten
如果要将文件存储在 outputdir 目录中,忽略源目录布局(例如,扁平化路径),请在生成者端添加 flatten=true
选项:
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir?flatten=true")
将导致以下输出布局:
outputdir/foo.txt outputdir/bar.txt
34.20. 从目录和默认移动操作中读取
默认情况下,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
34.21. 从目录读取,并在 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 } });
正文将是一个 File
对象,它指向刚刚放入到 inputdir
目录中的文件。
34.22. 写入文件
Camel 还能够写入文件,即生成文件。在以下示例中,我们收到在将 SEDA 队列写入目录之前所处理的 SEDA 队列的一些报告。
34.22.1. 使用 Exchange.FILE_NAME
写入子目录
使用单一路由时,可以将文件写入任意数量的子目录。如果您有路由设置,如下所示:
<route> <from uri="bean:myBean"/> <to uri="file:/rootDirectory"/> </route>
您可以将标头 Exchange.FILE_NAME
设置为值,例如:
Exchange.FILE_NAME = hello.txt => /rootDirectory/hello.txt Exchange.FILE_NAME = foo/bye.txt => /rootDirectory/foo/bye.txt
这可让您有一个路由将文件写入多个目的地。
34.22.2. 通过相对于最终目的地的临时目录写入文件
有时您需要临时将文件写入相对于目标目录的一些目录。当某些具有有限过滤功能的外部进程从您要写入的目录中读取时,通常会发生这种情况。在以下示例中,文件将写入 /var/myapp/filesInProgress
目录,在进行数据传输后,它们将会被原子移到 'var/myapp/finalDirectory 'directory 中。
from("direct:start"). to("file:///var/myapp/finalDirectory?tempPrefix=/../filesInProgress/");
34.23. 对文件名使用表达式
在这个示例中,我们想将消耗的文件移动到备份文件夹中,并将当前日期用作子文件夹名称:
from("file://inbox?move=backup/${date:now:yyyyMMdd}/${file:name}").to("...");
如需了解更多示例,请参阅 文件语言。
34.24. 避免多次读取同一文件(idempotent 消费者)
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 个条目。您可以使用值中的 # 符号指示 它引用
带有指定 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
34.25. 使用基于文件的幂等存储库
在本节中,我们将使用基于文件的幂等存储库 org.apache.camel.processor.idempotent.FileIdempotentRepository
,而不是基于默认值的内存。
此仓库使用第一级缓存以避免读取文件存储库。它将仅使用文件存储库来存储第一级别缓存的内容。因此,存储库可以在服务器重启后存活。它将在启动时将文件的内容加载到第一级缓存中。文件结构非常简单,因为它将密钥存储在文件的单独行中。默认情况下,文件存储的大小限制为 1mb。当文件增大较大的 Camel 将截断文件存储时,通过将第一级缓存刷新到新的空文件来重建内容。
我们使用 Spring XML 创建文件幂等存储库来配置我们的存储库,并使用 # 符号定义我们的具有 幂等存储库的存储库
来指示 Registry 查找:
34.26. 使用基于 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 idempotent 存储库:
<!-- 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>
然后,我们只需要使用 # syntax 选项使用 idempotentRepository
在文件消费者端点中引用 jpaStore bean:
<route> <from uri="file://inbox?idempotent=true&idempotentRepository=#jpaStore"/> <to uri="bean:processInbox"/> </route>
34.27. 使用 org.apache.camel.component.file.GenericFileFilter 过滤
Camel 支持可插拔过滤策略。然后,您可以使用此类过滤器配置端点,以跳过正在处理的某些文件。
在示例中,我们构建了自己的过滤器,它会跳过其文件名是以 skip
开始的文件:
然后,我们可以使用 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>
34.28. 使用 ANT 路径匹配程序进行过滤
ANT 路径匹配器基于 AntPathMatcher。
文件路径与以下规则匹配:
-
?
匹配一个字符 -
*
匹配零个或更多字符 -
|
匹配路径中的零个或更多目录
antInclude
和 antExclude
选项可以轻松地指定 ANT 风格 include/exclude,而无需定义过滤器。如需更多信息,请参阅上面的 URI 选项。以下示例演示了如何使用它。
当将 minDepth/maxDepth 与 recursive=true
组合结合使用时,tExclude=…
和 readLockDeleteOrphanLockFiles=true
会导致扫描所有文件/subfolders 深度,超过 maxDepth
中提到的值。解决办法是配置 readLockDeleteOrphanLockFiles=false
。
34.28.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 选项可以使用 # 语法来引用 bean
在 Spring DSL 路由中,可以通过在 id 前使用 # 前缀来引用 Registry 中的 beans。因此,编写排序器 =#mySorter
,将指示 Camel 来查找 ID 为 mySorter
的 bean 的 Registry。
34.28.2. 使用 sortBy 排序
Camel 支持可插拔排序策略。此策略使用 File 语言来配置排序。sortBy
选项配置如下:
sortBy=group 1;group 2;group 3;...
其中每个组都用分号隔开。在只使用一个组的简单情况下,一个简单的示例可以是:
sortBy=file:name
这将按文件名排序,您可以通过向组添加前缀 reverse:
来反向对顺序进行反转,因此排序现在是 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
Yeah 是非常强大的,通过您可以为每个组群使用反向的方式 oh,因此我们可以撤销文件名:
sortBy=date:file:yyyyMMdd;reverse:file:name
34.29. 使用 GenericFileProcessStrategy
选项 processStrategy
可用于使用自定义 GenericFileProcessStrategy
,它允许您实施您自己的 开始、提交 和回滚 逻辑。
例如,可以假定系统在文件夹中写入文件,您应该使用。但是,在另一个 就绪 文件被写入前,您不应该开始使用该文件。
通过实施自己的 GenericFileProcessStrategy
,我们可以将其实现:
-
在
begin ()
方法中,我们可以测试是否存在特殊的 就绪 文件。begin 方法返回一个布尔值
,以指示我们是否可以消耗该文件。 -
在
abort()
方法中,当begin
操作返回false
时,可以执行特殊的逻辑,例如清理资源等。 -
在
commit ()
方法中,我们可以移动实际文件,同时删除 就绪 的文件。
34.30. 使用过滤器
filter
选项允许您通过实施 org.apache.camel.component.file.GenericFileFilter
接口,在 Java 代码中实施自定义过滤器。这个接口有一个 accept
方法返回布尔值。返回 true
使其包含该文件,false
可跳过该文件。GenericFile
上有一个 Directory
方法,无论文件是否为目录。这可让您过滤不需要的目录,以避免中断不需要的目录。
例如,要跳过名称中以 "skip"
开头的任何目录,可按如下方式实施:
34.31. 使用 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 时,拦截器 不适用。Exchange 由 Camel Error Handler 直接处理,不允许之前操作,如拦截器、完成操作。
34.32. 调试日志记录
此组件具有日志级别 TRACE,在遇到问题时很有用。
34.33. Spring Boot Auto-Configuration
组件支持 11 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 35 章 文件语言
文件表达式语言是语言的扩展,可添加与文件相关的功能。这些功能与使用文件路径和名称的常见用例相关。目标是允许表达式用于
用于为消费者和制作者设置动态文件模式的组件。
文件语言与语言合并,这意味着您可以直接使用简单语言中的所有文件语法。
35.1. 依赖项
文件语言是 camel-core 的一部分。
当在 Red Hat build of Camel Spring Boot 中使用文件时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-core-starter</artifactId> </dependency>
35.2. 文件语言选项
文件语言支持 2 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
resultType |
| 设置结果类型的类名称(输出中的类型)。 | |
trim |
| 是否修剪值以移除前导和结尾的空格和换行符。 |
35.3. 语法
这个语言是对语言的扩展,因此也会应用语法。下表仅列出其他与文件相关的功能。
所有文件令牌都使用与 java.io.File
对象上方法相同的表达式名称,例如 :absolute
指的是 java.io.File.getAbsolute ()
方法。请注意,当前 Exchange 不支持所有表达式。例如,组件支持一些选项,而 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_ | 字符串 | 是 | 是 | 是 | 是 |
用于使用 |
35.4. 文件令牌示例
35.4.1. 相对路径
在以下 相对 目录中,我们有一个适用于 hello.txt
文件的 java.io.File
处理: .\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 |
35.4.2. 绝对路径
我们在以下 绝对 目录中有一个 java.io.File
处理文件 hello.txt
: \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 |
35.5. 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 类,该类生成要使用的字符串输出(或可转换为 String):
fileName="uniquefile-${bean:myguidgenerator.generateid}.txt"
当然,所有这些都可以在一个表达式中合并,您可以使用一个组合表达式中的 和 语言。这对常见的文件路径模式非常强大。
35.6. Spring Boot Auto-Configuration
组件支持 147 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 使用客户端查找时设置客户端密钥存储数据。 | 字符串 | |
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 using environment,环境变量用于查找服务。默认情况下使用环境。 | 环境 | 字符串 |
camel.cloud.kubernetes.service-discovery.master-url | 在使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用来自 ENV 变量 KUBERNETES_MASTER 的命名空间。 | 字符串 | |
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 ()的影响类似,除非继续跟踪指标,知道它是否应该是 open/closed,此属性即使实例化一个断路器。 | 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 ()的错误百分比如何。如果设为 true,则 circuitBreakerForceOpen ()属性具有优先权。 | false | 布尔值 |
camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(接受),并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
camel.hystrix.circuit-breaker-request-volume-threshold | metricsRollingStatisticalWindowInMilliseconds ()中的最少请求数必须存在于 HystrixCircuitBreaker 之前。如果此数字低于这个数字,无论错误百分比如何,电路都不会被出差。 | 20 | 整数 |
camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreaker trips 之后的时间(以毫秒为单位),它应该在尝试请求前等待。 | 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 ()的并发请求数。超过并发限制的请求将被拒绝。仅在执行IsolationStrategy == SEMAPHORE 时使用。 | 20 | 整数 |
camel.hystrix.execution-isolation-strategy | 将通过什么隔离策略 HystrixCommand.run ()执行。如果 THREAD,它将在单独的线程上执行,并且受 thread-pool 中的线程数量限制的并发请求。如果 SEMAPHORE,它将在调用线程上执行,并且受 semaphore 数限制的并发请求。 | 线程 | 字符串 |
camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 future#cancel)。仅在执行IsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
camel.hystrix.execution-timeout-in-milliseconds | 以毫秒为单位,将命令超时和停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 且命令是线程隔离,则执行线程将中断。如果命令是 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 | 设置要使用的 group 键。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
camel.hystrix.keep-alive-time | 更长的时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会立即更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
camel.hystrix.maximum-size | 传递给 ThreadPoolExecutor#setMaximumPoolSize (int)的最大 thread-pool 大小。这是可在不开始拒绝 HystrixCommands 的情况下支持的最大并发数量。请注意,只有在您也设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 在允许计算成功和错误百分比时等待的时间(以毫秒为单位),并影响 HystrixCircuitBreaker.isOpen ()状态。在高容量电路上,错误百分比的连续计算可能会成为 CPU 密集型,从而控制其计算的频率。 | 500 | 整数 |
camel.hystrix.metrics-rolling-percentile-bucket-size | 滚动百分比的每个存储桶中存储的最大值数。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 10 | 整数 |
camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 内部 HystrixCommandMetrics 来捕获百分比的指标。 | true | 布尔值 |
camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动窗口的存储桶数量被分成。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 6 | 整数 |
camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的滚动窗口的持续时间。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 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 | 队列大小拒绝阈值是 artificial max size,即使尚未达到 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 过渡到 open,并启动短路调用。阈值必须大于 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 | 配置滑动窗口的大小,该窗口用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置滑动窗口的大小。滑动窗口可以是基于计数或基于时间的窗口。如果 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 | 配置滑动窗口的类型,用于记录 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 会将调用视为较慢。当较慢的调用百分比相等或大于阈值时,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 的 Camel 组件名称(如 swagger)如果没有明确配置 API 组件,则 Camel 会查找负责服务并生成 REST API 文档的 Camel 组件,或者如果 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
camel.rest.api-context-path | 设置领导的 API 上下文路径将使用的 REST API 服务。这在使用使用 context-path 部署 Web 应用程序的组件(如 camel-servlet )时使用它。 | 字符串 | |
camel.rest.api-context-route-id | 设置用于服务 REST API 的路由的路由 ID。默认情况下,路由将使用自动分配的路由 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 标头是否受到其 consume/produces 设置的 Rest-DSL 配置的支持。这可以打开,以启用此检查。如果验证错误,则返回 HTTP Status code 415 或 406。默认值为 false。 | false | 布尔值 |
camel.rest.component | 用于 REST 传输(consumer)的 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 部署 Web 应用程序的组件(如 camel-servlet )时使用它。或者对于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | Map | |
camel.rest.data-format-property | 允许为使用的数据格式配置多个额外属性。例如,将属性 prettyPrint 设置为 true,以便以用户友善模式输出 json。属性可以加上前缀来表示选项仅适用于 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 | 布尔值 |
第 36 章 Flink
从 Camel 2.18 开始
仅支持生成者
本文档页面涵盖了 Apache Camel 的 Flink 组件。camel-flink 组件在 Camel 组件和 Flink 任务之间提供了一个桥接。此组件提供了一种从各种传输路由消息的方法,动态选择要执行的 flink 任务,使用传入消息作为任务的输入数据,最后将结果传送回 Camel 管道。
36.1. 依赖项
当在 Camel Spring Boot 中使用 camel-flink
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
Maven 用户需要将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-flink-starter</artifactId> </dependency>
36.2. URI 格式
目前,Flink 组件只支持 Producers。一个可以创建 DataSet、DataStream 作业。
flink:dataset?dataset=#myDataSet&dataSetCallback=#dataSetCallback flink:datastream?datastream=#myDataStream&dataStreamCallback=#dataStreamCallback
36.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
36.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
36.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
36.4. 组件选项
Flink 组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
dataSetCallback (producer) | 对 DataSet 执行操作的功能。 | DataSetCallback | |
datastream ( producer) | 要计算的数据流。 | DataStream | |
dataStreamCallback (producer) | 对 DataStream 执行操作的功能。 | DataStreamCallback | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
36.5. 端点选项
Flink 端点使用 URI 语法进行配置:
flink:endpointType
使用以下 路径和 查询参数 :
36.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
endpointType (producer) | 端点 所需的 类型(dataset、datastream)。 Enum 值:
| EndpointType |
36.5.2. 查询参数(6 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
collect (producer) | 指明是否应收集或计算结果。 | true | 布尔值 |
dataset ( producer) | 要计算的数据集。 | DataSet | |
dataSetCallback (producer) | 对 DataSet 执行操作的功能。 | DataSetCallback | |
datastream ( producer) | 要计算的数据流。 | DataStream | |
dataStreamCallback (producer) | 对 DataStream 执行操作的功能。 | DataStreamCallback | |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
36.6. 消息标头
Flink 组件支持 4 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelFlinkDataSet (producer) 常数 : FLINK_DATASET_HEADER | dataset。 | 对象 | |
CamelFlinkDataSetCallback (producer) | dataset 回调。 | DataSetCallback | |
CamelFlinkDataStream (producer) | 数据流。 | 对象 | |
CamelFlinkDataStreamCallback (producer) | 数据流回调。 | DataStreamCallback |
36.7. Flink DataSet 回调
@Bean public DataSetCallback<Long> dataSetCallback() { return new DataSetCallback<Long>() { public Long onDataSet(DataSet dataSet, Object... objects) { try { dataSet.print(); return new Long(0); } catch (Exception e) { return new Long(-1); } } }; }
36.8. Flink DataStream Callback
@Bean public VoidDataStreamCallback dataStreamCallback() { return new VoidDataStreamCallback() { @Override public void doOnDataStream(DataStream dataStream, Object... objects) throws Exception { dataStream.flatMap(new Splitter()).print(); environment.execute("data stream test"); } }; }
36.9. camel-Flink Producer 调用
CamelContext camelContext = new SpringCamelContext(context); String pattern = "foo"; try { ProducerTemplate template = camelContext.createProducerTemplate(); camelContext.start(); Long count = template.requestBody("flink:dataSet?dataSet=#myDataSet&dataSetCallback=#countLinesContaining", pattern, Long.class); } finally { camelContext.stop(); }
36.10. Spring Boot Auto-Configuration
组件支持 6 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.flink.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.flink.data-set-callback | 对 DataSet 执行操作的功能。选项是 org.apache.camel.component.flink.DataSetCallback 类型。 | DataSetCallback | |
camel.component.flink.data-stream | 要计算的数据流。选项是一个 org.apache.flink.streaming.api.datastream.DataStream 类型。 | DataStream | |
camel.component.flink.data-stream-callback | 对 DataStream 执行操作的功能。选项是 org.apache.camel.component.flink.DataStreamCallback 类型。 | DataStreamCallback | |
camel.component.flink.enabled | 是否启用 flink 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.flink.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 37 章 FTP
支持生成者和消费者
这个组件通过 FTP 和 SFTP 协议提供对远程文件系统的访问。
从远程 FTP 服务器消耗时,请确保在更 消耗文件时阅读标题为 Default 的部分,以了解与消耗文件相关的详细信息。
不支持 绝对路径。Camel 通过修剪 directoryname
中的所有前斜杠将绝对路径转换为 relative。日志中会显示 WARN 消息。
37.1. 依赖项
当使用带有红帽构建的 Camel Spring Boot 的 ftp
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-ftp-starter</artifactId> </dependency>
37.2. 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& amp;option=value&…
此组件为实际 FTP 工作使用两个不同的库。FTP 和 FTPS 使用 Apache Commons Net,而 SFTP 使用 JCraft JSCH。
FTPS (也称为 FTP Secure)是 FTP 的扩展,它增加了对传输层安全(TLS)和安全套接字层(SSL)加密协议的支持。
37.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
37.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
37.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
37.4. 组件选项
FTP 组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
37.5. 端点选项
FTP 端点使用 URI 语法进行配置:
ftp:host:port/directoryName
使用以下路径和查询参数:
37.5.1. 路径参数(3 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
host (common) | 必需 FTP 服务器的主机名。 | 字符串 | |
port (common) | FTP 服务器的端口。 | int | |
directoryName (common) | 起始目录。 | 字符串 |
37.5.2. 查询参数(111 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
binary (common) | 指定文件传输模式、BINARY 或 ASCII。默认为 ASCII (false)。 | false | 布尔值 |
charset (common) | 此选项用于指定文件的编码。您可以在消费者上使用此选项,指定文件的编码,允许 Camel 知道它应在访问文件内容时加载文件内容。在编写文件时,您也可以使用此选项来指定同时写入该文件的 charset。请记住,在编写文件 Camel 时,可能需要将消息内容读到内存中,才能将数据转换为配置的 charset,因此如果您有大量消息,则不要使用它。 | 字符串 | |
disconnect (common) | 使用后是否要与远程 FTP 服务器断开连接。断开连接将仅断开当前与 FTP 服务器的连接。如果您有一个要停止的消费者,则需要停止 consumer/route。 | false | 布尔值 |
doneFileName (common) | 生产者:如果提供,则 Camel 将在写入原始文件时编写完第 2 个文件。完成的文件将为空。这个选项配置要使用的文件名。可以指定固定名称。或者您可以使用动态占位符。完成的文件将始终写在与原始文件相同的文件夹中。消费者:如果提供,Camel 仅在文件存在时使用文件。这个选项配置要使用的文件名。可以指定固定名称。或者,您可以使用动态占位符。done 文件始终位于与原始文件相同的文件夹中。仅支持 $\\{file.name} 和 $\\{file.name.next} 作为动态占位符。 | 字符串 | |
filename ( common) | 使用文件语言等表达式动态设置文件名。对于消费者,它用作文件名过滤器。对于生成者,它用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注:标题本身也可以是表达式)。表达式选项支持 String 和 Expression 类型。如果表达式是 String 类型,则始终使用 File Language 来评估它。如果表达式是 Expression 类型,则使用指定的 Expression 类型 - 这允许您,使用 OGNL 表达式。对于消费者,您可以使用它来过滤文件名,因此您可以使用 File Language 语法:mydata-$\\{date:now:yyyyMMdd}.txt,实例消耗了现在的文件。生产者支持 CamelOverruleFileName 标头,它优先于任何现有的 CamelFileName 标头;CamelOverruleFileName 是一个仅使用的标头,因此可以更轻松地避免临时存储 CamelFileName,之后必须恢复它。 | 字符串 | |
passiveMode (common) | 设置被动模式连接。默认为 active 模式连接。 | false | 布尔值 |
分隔符 (common) | 设置要使用的路径分隔符。Unix = 使用 unix 样式路径分隔符 Windows = 使用 Windows 样式路径分隔符 Auto = (默认)在文件名中使用现有路径分隔符. Enum 值:
| UNIX | PathSeparator |
transferLoggingIntervalSeconds (common) | 配置日志记录 in-flight 的上传和下载操作时使用的间隔(以秒为单位)。当操作需要更长的时间时,这用于日志记录进度。 | 5 | int |
transferLoggingLevel (common) | 配置日志级别,以便在记录上传和下载操作的进度时使用。 Enum 值:
| DEBUG | LoggingLevel |
transferLoggingVerbose (common) | 配置上传和下载操作进度的执行详细(细粒度)日志记录。 | false | 布尔值 |
fastExistsCheck (common (advanced)) | 如果将此选项设置为 true,则 camel-ftp 将直接使用 list 文件来检查该文件是否存在。由于有些 FTP 服务器可能不支持直接列出文件,如果 选项为 false,则 camel-ftp 将使用旧方法来列出该目录,并检查该文件是否存在。这个选项还影响 readLock=changed 来控制它是否执行快速检查来更新文件信息。如果 FTP 服务器有大量文件,这可用于加快进程速度。 | false | 布尔值 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
delete (consumer) | 如果为 true,则该文件会在成功处理后删除。 | false | 布尔值 |
moveFailed (consumer) | 根据简单语言设置移动失败表达式。例如,要将文件移动到 .error 子目录,请使用: .error。注意:当将文件移动到故障位置 Camel 将处理错误时,不会再次获取该文件。 | 字符串 | |
noop (consumer) | 如果为 true,则文件不会以任何方式移动或删除。这个选项适用于只读数据,或用于 ETL 类型要求。如果 noop=true,Camel 也会设置 idempotent=true,以避免通过和再次消耗同一文件。 | false | 布尔值 |
preMove (consumer) | 表达式(如文件语言)用于在处理前动态设置文件名。例如,要将 in-progress 文件移到订购目录中,将此值设置为 order。 | 字符串 | |
preSort (consumer) | 启用 pre-sort 后,消费者将在轮询期间对文件和目录名称进行排序,该名称从文件系统检索。如果您需要按排序的顺序对文件进行操作,您可能需要执行此操作。预排序在消费者开始过滤前执行,并接受 Camel 处理的文件。这个选项是 default=false 表示禁用。 | false | 布尔值 |
递归 (consumer) | 如果某个目录,也会在所有子目录中查找文件。 | false | 布尔值 |
resumeDownload (consumer) | 配置是否启用了恢复下载。FTP 服务器必须支持此设置(几乎所有 FTP 服务器都支持它)。此外,必须配置 localWorkDirectory 选项,以便下载的文件存储在本地目录中,而且必须启用选项二进制文件,这是支持恢复下载所必需的。 | false | 布尔值 |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
streamDownload (consumer) | 设置在不使用本地工作目录时要使用的下载方法。如果设置为 true,则远程文件会在读取时流传输到路由。当设置为 false 时,远程文件会在发送到路由之前加载到内存中。如果启用这个选项,则必须将 stepwise=false 设置为不能同时启用。 | false | 布尔值 |
download (consumer (advanced)) | FTP 使用者是否应下载该文件。如果此选项设为 false,则消息正文将为空,但消费者仍会触发 Camel Exchange,其中包含文件名称、文件大小等详细信息。只是不会下载该文件。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
handleDirectoryParserAbsoluteResult (consumer (advanced)) | 如果目录解析程序产生了绝对路径,则允许使用者设置在路径中处理子文件夹和文件的方式。因此,一些 FTP 服务器可能会用绝对路径返回文件名,如果是,那么 FTP 组件需要通过将返回的路径转换为相对路径来处理此目的。 | false | 布尔值 |
ignoreFileNotFoundOrPermissionError (consumer (advanced)) | 是否忽略何时(在下载文件时列出目录中的文件)或下载文件,这些文件不存在或因为权限错误。默认情况下,当目录或文件不存在或权限不足时,会抛出异常。将这个选项设置为 true 可忽略它。 | false | 布尔值 |
inProgressRepository (consumer (advanced)) | 可插拔式存储库 org.apache.camel.spi.IdempotentRepository.in-progress 存储库用于考虑被消耗的进度文件的当前。默认情况下,使用基于内存的存储库。 | IdempotentRepository | |
localWorkDirectory (consumer (advanced)) | 使用时,可以使用本地工作目录直接将远程文件内容存储在本地文件中,以避免将内容加载到内存中。这非常有用,如果您使用一个非常大的远程文件,从而可以节省内存。 | 字符串 | |
onCompletionExceptionHandler (consumer (advanced)) | 使用自定义 org.apache.camel.spi.ExceptionHandler 处理在完成过程中发生的任何抛出异常,供消费者执行提交或回滚。默认实现将在 WARN 级别记录任何异常并忽略。 | ExceptionHandler | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
processStrategy (consumer (advanced)) | 可插拔 org.apache.camel.component.file.GenericFileProcessStrategy 允许您实施自己的 readLock 选项或类似选项。也可以在使用文件之前满足特殊条件时使用,如存在特殊就绪的文件。如果设置了这个选项,则不会应用 readLock 选项。 | GenericFileProcessStrategy | |
useList (consumer (advanced)) | 是否在下载文件时允许使用 LIST 命令。默认为 true。在某些情况下,您可能想要下载特定的文件,不允许使用 LIST 命令,因此您可以将这个选项设置为 false。请注意,在使用此选项时,要下载的特定文件不包括元数据信息,如文件大小、时间戳、权限等,因为这些信息只能在使用 LIST 命令时检索。 | true | 布尔值 |
fileExist (producer) | 如果文件名称已存在,则该怎么办。override (默认文件)替换现有文件。- Append - 将内容添加到现有文件。- Fail - 抛出 GenericFileOperationException,表示已有现有文件。- Ignore - 静默忽略问题,且不会覆盖现有文件,但假设所有内容都正常。- Move - 选项需要使用 moveExisting 选项进行配置。选项 eagerDeleteTargetFile 可用于控制移动文件时要执行的操作,并且存在现有文件,否则会导致 move 操作失败。Move 选项将移动任何现有文件,然后再编写目标文件。- 只有使用 tempFileName 选项时才适用 TryRename。这允许尝试将该文件从临时名称重命名为实际名称,而无需进行任何存在的检查。对于某些文件系统,特别是 FTP 服务器上,这个检查可能会更快。 Enum 值:
| override | GenericFileExist |
flatten (producer) | flatten 用于扁平化文件名路径,以剥离任何前导路径,因此它只是文件名。这样,您便可以将递归地消耗到子目录中,但当您将文件写入另一个目录时,会将文件写入单个目录中。在生成者上将其设置为 true 强制执行 CamelFileName 标头中的任何文件名将被剥离任何前导路径。 | false | 布尔值 |
jailStartingDirectory (producer) | 用于仅向起始目录(和子)写入文件。这默认是启用的,不允许 Camel 将文件写入外部目录(在开箱即用的情况下更为安全)。您可以关闭此选项,以允许将文件写入起始目录之外的目录,如父目录或根文件夹。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
moveExisting (producer) | 表达式(如文件语言)用于在配置 fileExist=Move 时使用计算文件名。要将文件移动到备份子目录中,只需输入 backup。这个选项只支持以下文件语言令牌: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' 中的最终文件位置,而不是基础 uri 中的目标目录。例如,如果选项 fileName 包含目录前缀:dir/finalFilename,则 tempFileName 相对于该子目录 dir。 | 字符串 | |
tempPrefix (producer) | 此选项用于使用临时名称写入文件,然后在写入完成后将其重命名为实际名称。可用于识别正在写入的文件,也可避免消费者(不使用专用读取锁定)读取进度文件。在上传大型文件时,FTP 通常使用 FTP。 | 字符串 | |
allowNullBody (producer (advanced)) | 用于指定文件写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,如果设为 false,并尝试将 null 正文发送到文件组件,则将抛出 'Cannot write null body to file.' 的 GenericFileWriteException。如果 fileExist 选项被设置为 'Override',则该文件将被截断,如果设为 附加该文件,则该文件将保持不变。 | false | 布尔值 |
chmod (producer (advanced)) | 允许您在存储的文件上设置 chmod。例如 chmod=640。 | 字符串 | |
disconnectOnBatchComplete (producer (advanced)) | 批处理上传完成后是否要断开与远程 FTP 服务器的连接。disconnectOnBatchComplete 将仅断开当前与 FTP 服务器的连接。 | false | 布尔值 |
eagerDeleteTargetFile (producer (advanced)) | 是否强制删除任何现有目标文件。这个选项仅在使用 fileExists=Override 和 tempFileName 选项时才适用。您可以使用此选项禁用(将其设置为 false)在编写 temp 文件前删除目标文件。例如,您可以编写大文件,并且希望目标文件在 temp 文件被写入期间存在。这样可保证仅删除目标文件,直到最后一次时间之前,只需将 temp 文件重命名为目标文件名之前。这个选项还用于控制是否在启用 fileExist=Move 时删除任何现有的文件,并且存在现有文件。如果此选项 copyAndDeleteOnRenameFails false,则现有文件存在时会抛出异常(如果其为 true),则在移动操作前会删除现有文件。 | true | 布尔值 |
keepLastModified (producer (advanced)) | 将保留来自源文件的最后修改的时间戳(如果有)。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或 long (时间戳)。如果时间戳存在,且启用了 选项,它将在写入的文件上设置这个时间戳。注意:此选项仅适用于文件制作者。您不能将此选项与任何 ftp producer 一起使用。 | false | 布尔值 |
moveExistingFileStrategy (producer (advanced)) | 策略(Custom Strategy)用于移动带有特殊命名令牌的文件,以便在配置了 fileExist=Move 时使用。默认情况下,如果没有提供自定义策略,则使用实现。 | FileMoveExistingStrategy | |
sendNoop (producer (advanced)) | 在上传文件到 FTP 服务器之前,是否将 noop 命令作为预写检查发送。这默认是启用的,因为连接的验证仍然有效,允许静默重新连接,以便能够上传该文件。但是,如果这会导致问题,您可以关闭这个选项。 | true | 布尔值 |
activePortRange (advanced) | 在 active 模式中设置客户端侧端口范围。语法为:minPort-maxPort Both 端口号包含,例如 10000-19999 以包含所有 1xxxx 端口。 | 字符串 | |
auto create (advanced) | 在文件的路径名称中自动创建缺少的目录。对于文件消费者,这意味着创建起始目录。对于文件制作者,这意味着应写入文件的目录。 | true | 布尔值 |
bufferSize (advanced) | 用于编写文件的缓冲区大小(如果是 FTP 用于下载和上传文件)。 | 131072 | int |
connectTimeout (advanced) | 设置等待由 FTPClient 和 JSCH 使用的连接建立的连接超时。 | 10000 | int |
ftpClient (advanced) | 要使用自定义 FTPClient 实例。 | FTPClient | |
ftpClientConfig (advanced) | 要使用 FTPClientConfig 的自定义实例来配置端点应使用的 FTP 客户端。 | FTPClientConfig | |
ftpClientConfigParameters (advanced) | FtpComponent 用来为 FTPClientConfig 提供其他参数。 | Map | |
ftpClientParameters (advanced) | 由 FtpComponent 用来为 FTPClient 提供其他参数。 | Map | |
maximumReconnectAttempts (advanced) | 指定在尝试连接到远程 FTP 服务器时 Camel 执行的最大重新连接尝试。使用 0 禁用此行为。 | int | |
reconnectDelay (advanced) | millis Camel 中的延迟会在执行重新连接尝试前等待。 | 1000 | long |
siteCommand (advanced) | 设置在成功登录后要执行的可选站点命令。可以使用新行字符分隔多个站点命令。 | 字符串 | |
soTimeout (advanced) | 设置 so timeout FTP 和 FTPS 是 millis 中的 SocketOptions.SO_TIMEOUT 值。推荐的选项是将其设置为 300000,因此没有挂起的连接。在 SFTP 上,此选项在 JSCH Session 实例中被设置为超时。 | 300000 | int |
stepwise (advanced) | 设置在下载文件时,还是在上传文件到目录时,我们是否应该对目录进行循环更改。例如,如果您因为安全原因无法更改 FTP 服务器上的目录,您可以禁用它。步骤步骤不能与 streamDownload 一起使用。 | true | 布尔值 |
同步 (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
throwExceptionOnConnectFailed (advanced) | 如果没有抛出连接失败(假设)By 默认异常,并且记录 WARN,则抛出异常。您可以使用它来启用抛出异常,并处理 org.apache.camel.spi.PollingConsumerPollStrategy 回滚方法中引发的异常。 | false | 布尔值 |
Timeout (advanced) | 设置用于仅等待 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) | 用于排除文件,如果文件名与正则表达式模式匹配(匹配区分大小写)。请注意,如果您使用符号(如加号),如果将其配置为 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:yyyMMdd}。 | 字符串 | |
filterFile (filter) | 根据简单语言过滤文件。例如,要过滤文件大小,您可以使用 $\\{file:size} 5000。 | 字符串 | |
idempotent (filter) | 使用 Idempotent Consumer EIP 模式的选项让 Camel 跳过已经处理的文件。默认情况下,将使用基于内存的 LRUCache 来保存 1000 条目。如果 noop=true,则同时启用幂等性,以避免再次消耗同一文件。 | false | 布尔值 |
idempotentKey (filter) | 使用自定义幂等密钥。默认情况下,使用文件的绝对路径。您可以使用文件语言,例如要使用文件名和文件大小,您可以执行: idempotentKey=$\\{file:name}-$\\{file:size}-$\\{file:size}。 | 字符串 | |
idempotentRepository (filter) | 可插拔存储库 org.apache.camel.spi.IdempotentRepository,如果未指定,并且 idempotent 为 true,则默认使用 MemoryIdempotentRepository。 | IdempotentRepository | |
Include (filter) | 用于包括文件,如果文件名与正则表达式模式匹配(匹配区分大小写)。请注意,如果您使用符号(如加号),如果将其配置为 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) | 定义每个轮询收集的最多消息。默认情况下,没有设置最大值。可用于设置限制,例如 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 (例如,该文件不是 in-progress 或被写入)时轮询文件。Camel 将等待文件锁定被赋予。此选项在策略中提供构建:- none - No read lock is in use - markerFile - Camel 创建一个标记文件(fileName.camelLock),然后在其上保存锁定。这个选项不适用于 FTP 组件 - 更改 - Changed 使用文件长度/修改时间戳来检测文件当前是否正在复制。至少将使用 1 sec 来确定这一点,因此此选项不能像其他人一样快消耗文件,但可以更可靠,因为 JDK IO API 无法始终确定文件当前是否被其他进程使用。选项 readLockCheckInterval 可用于设置检查频率。- fileLock - 用于使用 java.nio.channels.FileLock。这个选项不适用于 Windows OS 和 FTP 组件。当通过 mount/share 访问远程文件系统时,应避免使用这种方法,除非该文件系统支持分布式文件锁定。- rename 使用尝试将文件重命名为测试(如果我们可以获得独家的 read-lock. - 幂等 - (仅针对文件组件)是使用幂等Repository 作为 read-lock。这允许在幂等存储库实施支持集群时使用读取锁定。- idempotent-changed - (仅适用于文件组件) idempotent-changed 用于使用 idempotentRepository 并更改为组合的 read-lock。这允许在幂等存储库实施支持集群时使用读取锁定。- idempotent-rename - (仅适用于文件组件) idempotent-rename 用于使用 idempotentRepository,并作为组合的 read-lock 重命名。如果幂等存储库实现支持集群,这允许使用支持集群的读取锁定。不同的读取锁定并不适合以集群模式工作,其中不同节点上的并发消费者对共享文件系统上的相同文件竞争。flagsFile 使用接近 atomic 操作来创建空标记文件,但无法保证在集群中工作。fileLock 可以更好地工作,但文件系统需要支持分布式文件锁定,以此类推。如果幂等存储库支持集群(如 Hazelcast 组件或 Infinispan),则使用幂等的读取锁定可以支持集群。 Enum 值:
| none | 字符串 |
readLockCheckInterval (lock) | 如果读取锁定支持,则 read-lock 中的间隔为 millis。此间隔用于尝试获取读取锁之间的睡眠状态。例如,在使用更改的读取锁定时,您可以为文件设置更高的间隔周期,以便进行速度较慢的写入。默认值 1 sec。如果生成者的写入速度非常慢,则可能太快。注意:对于 FTP,默认的 readLockCheckInterval 是 5000。readLockTimeout 值必须大于 readLockCheckInterval,但 thumb 规则是有一个超时,它至少比 readLockCheckInterval 高 2 倍。这需要确保允许读取锁定进程在达到超时时间前尝试获取锁定。 | 1000 | long |
readLockDeleteOrphanLockFiles (lock) | 如果 Camel 没有正确关闭(如 JVM 崩溃),在启动后是否应该使用标记文件读取锁定删除任何孤立的读取锁定文件(如 JVM 崩溃)。如果将此选项转换为 false,则任何孤立的锁文件将导致 Camel 不尝试选择该文件,也可能是因为另一个节点同时从同一共享目录读取文件。 | true | 布尔值 |
readLockLoggingLevel (lock) | 无法获取读取锁定时使用的日志记录级别。默认情况下会记录 DEBUG。您可以更改此级别,例如,OFF 没有任何日志记录。这个选项只适用于 readLock 类型:change, 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。它允许您指定在处理文件成功时是否从幂等存储库中删除文件名条目,以及提交发生。默认情况下,文件不会被删除,这样可确保不会发生任何竞争条件,因此另一个活动节点可能会试图获取该文件。相反,idempotent 存储库可能支持驱除策略,这些策略可在 X 分钟后驱除文件名条目 - 这确保了竞争条件没有问题。请参阅 readLockIdempotentReleaseDelay 选项的更多详情。 | false | 布尔值 |
readLockRemoveOnRollback (lock) | 这个选项只适用于 readLock=idempotent。它指定在处理文件失败时是否从幂等存储库中删除文件名条目,以及进行回滚。如果此选项为 false,则确认文件名条目(就像文件执行提交一样)。 | true | 布尔值 |
readLockTimeout (lock) | 如果 read-lock 支持,则 read-lock 中的可选超时(如果支持)。如果无法授予 read-lock,并且触发超时,则 Camel 将跳过该文件。在下次轮询 Camel 时,将再次尝试 文件,这一次可能被赋予读锁。使用 0 或更低的值来指示永久。目前 fileLock,更改并重命名支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000,而不是 10000。readLockTimeout 值必须大于 readLockCheckInterval,但 thumb 规则是有一个超时,它至少比 readLockCheckInterval 高 2 倍。这需要确保允许读取锁定进程在达到超时时间前尝试获取锁定。 | 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 | |
scheduler (scheduler) | 要使用 camel-spring 或 camel-quartz 组件的 cron 调度程序。使用值 spring 或 quartz 用于内置在调度程序中。 | none | 对象 |
schedulerProperties (scheduler) | 在使用自定义调度程序或任何基于 Spring 的调度程序时配置附加属性。 | Map | |
startScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
timeUnit (scheduler) | initialDelay 和 delay 选项的时间单位。 Enum 值:
| MILLISECONDS | TimeUnit |
useFixedDelay (scheduler) | 控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。 | true | 布尔值 |
帐户 (安全性) | 用于登录的帐户。 | 字符串 | |
password (security) | 用于登录的密码。 | 字符串 | |
用户名 (安全性) | 用于登录的用户名。 | 字符串 | |
shuffle (sort) | 要表示文件列表(按随机顺序排列)。 | false | 布尔值 |
sortby ( sort) | 使用文件语言进行内置排序。支持嵌套排序,因此您可以按文件名排序,并且按修改日期排序第二组。 | 字符串 | |
sorter (sort) | 可插拔排序器作为 java.util.Comparator 类。 | 比较器 |
37.6. FTPS 组件默认信任存储
当使用与 FTPS 组件 SSL 相关的 ftpClient.
属性时,信任存储接受所有证书。如果您只想信任选择的证书,则必须使用 ftpClient.trustStore.xxx
选项或配置自定义 ftpClient
配置信任存储。
使用 sslContextParameters
时,信任存储由提供的 SSLContextParameters 实例的配置来管理。
您可以使用 ftpClient.
或 ftpClientConfig.
前缀直接在 URI 上配置 ftpClient
和 ftpClientConfig
上的附加选项。
例如,要将 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");
37.7. 例子
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
37.8. 并发
FTP Consumer 不支持并发
FTP 消费者(具有相同端点)不支持并发(支持的 FTP 客户端不是线程安全)。
您可以使用多个 FTP 用户从不同的端点轮询。它只是一个不支持并发用户的端点。
FTP 生成者 没有 这个问题,它支持并发。
37.9. 更多信息
此组件是 File 组件的扩展。因此,File 组件页面中还有更多示例和详情。
37.10. 默认消耗文件时
默认情况下,FTP 使用者将保留在远程 FTP 服务器上保持不变的文件。如果您希望删除文件或将其移动到另一个位置,则必须明确配置它。例如,您可以使用 delete=true
删除文件,或使用 move=.done
将文件移到隐藏的子目录中。
常规文件消费者不同,因为它默认将文件移动到 .camel
子目录中。对于 FTP 使用者,Camel 默认情况下 不这样做 的原因是,它默认可能会缺少权限,以便能够移动或删除文件。
37.10.1. 限制
选项 readLock 可用于强制 Camel 不 消耗当前写入过程中的文件。但是,此选项默认是关闭的,因为它要求用户具有写访问权限。有关读取锁定的详情,请查看 File2 中的选项表。
还有其他解决方案可以避免消耗当前通过 FTP 编写的文件;例如,您可以写入临时目标并在编写文件后移动该文件。
使用 move
或 preMove
选项移动文件时,文件将限制为 FTP_ROOT 文件夹。这可以防止您将文件移动到 FTP 区域外。如果要将文件移动到另一个区域,您可以使用软链接并将文件移动到软链接文件夹中。
37.11. 消息标头
以下消息标头可用于影响组件的行为
标头 | 描述 |
---|---|
| 指定在发送到端点时用于输出消息的输出文件名(相对于端点目录)。如果不存在任何表达式,则生成的消息 ID 将用作文件名。 |
| 已写入的输出文件的实际文件路径(路径 + 名称)。此标头由 Camel 设置,其目的是向最终用户提供写入的文件的名称。 |
| 所消耗的文件的文件名 |
| 远程主机名。 |
| 如果使用本地工作目录,到本地工作文件的路径。 |
此外,FTP/FTPS 使用者和生产者将使用以下标头增强 Camel 消息
标头 | 描述 |
---|---|
| FTP 客户端回复代码(类型是一个整数) |
| FTP 客户端回复字符串 |
37.11.1. Exchange Properties
Camel 设置以下交换属性
标头 | 描述 |
---|---|
| 当前索引掉此批处理中消耗的文件总数。 |
| 此批处理中消耗的文件总数。 |
| 如果此批处理中没有更多文件,则为 true。 |
37.12. 关于超时
两组库(请参见 top)具有不同的 API 来设置超时。您可以对这两者使用 connectTimeout
选项,在 millis 中设置超时来建立网络连接。也可以在 FTP/FTPS 上设置一个单独的 soTimeout
,对应于使用 ftpClient.soTimeout
。请注意,SFTP 将自动使用 connectTimeout
作为其 soTimeout
。timeout
选项仅适用于 FTP/FTPS,作为数据超时,对应于 ftpClient.dataTimeout
值。所有超时值都在 millis 中。
37.13. 使用本地工作目录
Camel 支持从远程 FTP 服务器使用,并将文件直接下载到本地工作目录中。这可避免将整个远程文件内容读入内存中,因为它使用 FileOutputStream
直接传输到本地文件。
Camel 将存储到名称与远程文件相同的本地文件,但在下载文件时,使用 .inprogress
作为扩展名。之后,该文件被重命名为删除 .inprogress
后缀。最后,当 Exchange 完成后,会删除本地文件。
因此,如果要从远程 FTP 服务器下载文件并将其存储为文件,则需要路由到文件端点,例如:
from("ftp://someone@someserver.com?password=secret&localWorkDirectory=/tmp").to("file://inbox");
以上路由非常高效,因为它避免将整个文件内容读到内存中。它将直接将远程文件下载到本地文件流。然后,java.io.File
句柄用作 Exchange 正文。文件生成者利用此事实,可以直接在工作文件 java.io.File
处理上工作,并对目标文件名执行 java.io.File.rename
。当 Camel 知道它是本地的工作文件时,它可以优化和使用重命名,而不是文件副本,因为工作文件将随时删除。
37.14. 更改目录的步骤
在消耗文件时(例如下载)或生成文件(例如上传)时,Camel FTP 可以在两种模式下操作。
- 步骤
- Not stepwise
根据您的情况和安全问题,您可能需要选择一个。有些 Camel 最终用户只能在使用步骤时下载文件,而其他 Camel 最终用户只能下载这些文件。
您可以使用 stepwise
选项控制行为。
请注意,在大多数情况下,对目录进行分步更改只有在用户仅限于其主目录以及主目录报告为 "/"
时才起作用。
其中一个两者之间的差别最好在示例中进行说明。假设我们在远程 FTP 服务器上有以下目录结构,我们需要遍历和下载文件:
/ /one /one/two /one/two/sub-a /one/two/sub-b
并且我们在每个子 A (a.txt)和 sub-b (b.txt)文件夹中都有一个文件。
37.15. 使用 stepwise=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 遍历目录结构。
37.16. 使用 stepwise=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 操作。
37.17. 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>
37.17.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");
37.17.2. 使用远程 FTPS 服务器(explicit 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");
37.18. 自定义过滤
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>
37.19. 使用 ANT 路径匹配程序进行过滤
ANT 路径匹配器是一个过滤器,它在 camel-spring jar 中提供。因此,如果您使用 Maven,则需要依赖于 camel-spring。
原因在于,我们利用 Spring 的 AntPathMatcher 进行实际匹配。
文件路径与以下规则匹配:
-
?
匹配一个字符 -
*
匹配零个或更多字符 -
|
匹配路径中的零个或更多目录
以下示例演示了如何使用它:
37.20. 使用带有 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
文档来发现所有选项。
37.21. 设置首选 SFTP 验证方法
如果要明确指定 sftp
组件应使用的身份验证方法列表,请使用 preferredAuthentications
选项。例如,如果没有公钥,您希望 Camel 尝试通过私有/公共 SSH 密钥进行身份验证,并回退到用户/密码身份验证,请使用以下路由配置:
from("sftp://localhost:9999/root?username=admin&password=admin&preferredAuthentications=publickey,password"). to("bean:processFile");
37.22. 使用固定名称消耗单个文件
当您要下载单个文件并知道文件名时,您可以使用 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);
37.23. 调试日志记录
此组件具有日志级别 TRACE,在遇到问题时很有用。
37.24. Spring Boot Auto-Configuration
组件支持 13 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 38 章 Google BigQuery
从 Camel 2.20 开始
仅支持生成者。
Google Bigquery 组件通过链接:https://developers.google.com/api-client-library/java/apis/bigquery/v2 [Google Client Services API] 提供对 Cloud BigQuery 基础架构 的访问。
当前实现不使用 gRPC。
当前实施不支持查询 BigQuery,它只是一个制作者。
38.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 google-bigquery
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-google-bigquery-starter</artifactId> </dependency>
38.2. 身份验证配置
Google BigQuery 组件身份验证用于 GCP 服务帐户。如需更多信息,请参阅 Google Cloud Platform 身份验证指南。
Google 安全凭证可以通过提供 GCP 凭证文件位置的路径来显式设置。
或者隐式设置,连接工厂会返回 应用程序默认凭证。
具有 服务帐户密钥 时,您可以为应用程序代码提供身份验证凭据。Google 安全凭证可以通过组件端点设置:
String endpoint = "google-bigquery://project-id:datasetId[:tableId]?serviceAccountKey=/home/user/Downloads/my-key.json";
如果您不想设置文件系统路径,您还可以使用身份验证凭证文件的 base64 编码内容。
String endpoint = "google-bigquery://project-id:datasetId[:tableId]?serviceAccountKey=base64:<base64 encoded>";
或者,通过设置环境变量 GOOGLE_APPLICATION_CREDENTIALS
:
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/my-key.json"
38.3. URI 格式
google-bigquery://project-id:datasetId[:tableId]?[options]
38.4. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
38.4.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
38.4.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
38.5. 组件选项
Google BigQuery 组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
ConnectionFactory (producer) | Autowired ConnectionFactory 获取与 Bigquery 服务的连接。如果没有提供默认值,则将使用。 | GoogleBigQueryConnectionFactory | |
datasetId (producer) | bigquery Dataset Id. | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
projectId (producer) | Google Cloud Project Id. | 字符串 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
38.6. 端点选项
Google BigQuery 端点使用 URI 语法进行配置:
google-bigquery:projectId:datasetId:tableId
使用以下路径和查询参数:
38.6.1. 路径参数(3 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
projectId (common) | 所需的 Google Cloud Project Id。 | 字符串 | |
datasetId (common) | 必需 BigQuery Dataset Id。 | 字符串 | |
tableid (common) | bigquery 表 ID。 | 字符串 |
38.6.2. 查询参数(4 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
ConnectionFactory (producer) | Autowired ConnectionFactory 获取与 Bigquery 服务的连接。如果没有提供默认值,则将使用。 | GoogleBigQueryConnectionFactory | |
useAsInsertId (producer) | 用作插入 ID 的字段名称。 | 字符串 | |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
serviceAccountKey (security) | json 格式的服务帐户密钥,将应用程序验证为 google 云平台的服务帐户。 | 字符串 |
38.7. 消息标头
Google BigQuery 组件支持 4 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelGoogleBigQueryTableSuffix (producer) 常数 : TABLE_SUFFIX | 插入数据时要使用的表后缀。 | 字符串 | |
CamelGoogleBigQueryTableId (producer) 常数 : TABLE_ID | 提交数据的表 ID。如果指定,将覆盖端点配置。 | 字符串 | |
CamelGoogleBigQueryInsertId (producer) 常数: INSERT_ID | InsertId 在插入数据时使用。 | 字符串 | |
CamelGoogleBigQueryPartitionDecorator (producer) | 分区 decorator 指定在插入数据时要使用的分区。 | 字符串 |
38.8. 生成者端点
生产者端点可以接受并传送到 BigQuery 个人和分组的交换。分组交换设置了 Exchange.GROUPED_EXCHANGE
属性。
Google BigQuery 生成者将在单个 api 调用中发送分组交换,除非指定了不同的表后缀或分区 decorator,否则它将中断它,以确保数据使用正确的后缀或分区解码器写入。
Google BigQuery 端点需要有效负载是映射或映射列表。包含映射的有效负载将插入一行和包含映射列表的有效负载,将为列表中的每个条目插入一行。
38.9. 模板表
可以使用 GoogleBigQueryConstants.TABLE_SUFFIX
标头来指定模板表。例如,以下路由将创建表,并每天插入分片记录:
from("direct:start") .header(GoogleBigQueryConstants.TABLE_SUFFIX, "_${date:now:yyyyMMdd}") .to("google-bigquery:sampleDataset:sampleTable")
建议您在此用例中使用分区。
有关 Template 表的更多信息,请参阅 模板表。
38.10. 分区
分区在创建表时指定,如果设置数据将自动分区到单独的表中。通过在交换中设置 GoogleBigQueryConstants.PARTITION_DECORATOR
标头来插入特定分区时,可以指定特定分区。
有关分区的更多信息,请参阅创建分区表。
38.11. 确保数据一致性
可以在带有标头 GoogleBigQueryConstants.INSERT_ID
或指定查询参数 useAsInsertId
的交换上设置插入 ID。由于插入 ID 需要为每个行指定,当有效负载是列表时,无法使用插入的交换标头。如果有效负载是一个列表,则忽略 GoogleBigQueryConstants.INSERT_ID
。在这种情况下,使用查询参数 useAsInsertId
。
如需更多信息,请参阅 数据一致性
38.12. Spring Boot Auto-Configuration
组件支持 11 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.google-bigquery-sql.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.google-bigquery-sql.connection-factory | ConnectionFactory 以获取与 Bigquery 服务的连接。如果没有提供默认值,则将使用。选项是 org.apache.camel.component.google.bigquery.GoogleBigQueryConnectionFactory 类型。 | GoogleBigQueryConnectionFactory | |
camel.component.google-bigquery-sql.enabled | 是否启用 google-bigquery-sql 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.google-bigquery-sql.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.google-bigquery-sql.project-id | Google Cloud Project Id. | 字符串 | |
camel.component.google-bigquery.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.google-bigquery.connection-factory | ConnectionFactory 以获取与 Bigquery 服务的连接。如果没有提供默认值,则将使用。选项是 org.apache.camel.component.google.bigquery.GoogleBigQueryConnectionFactory 类型。 | GoogleBigQueryConnectionFactory | |
camel.component.google-bigquery.dataset-id | bigquery Dataset Id. | 字符串 | |
camel.component.google-bigquery.enabled | 是否启用 google-bigquery 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.google-bigquery.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.google-bigquery.project-id | Google Cloud Project Id. | 字符串 |
第 39 章 Google Pubsub
从 Camel 2.19 开始
支持生成者和消费者。
Google Pubsub 组件通过 Google Cloud Java Client for Google Cloud Pub/Sub 提供对 Cloud Pub/Sub 基础架构 的访问。
39.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 google-pubsub
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-google-pubsub-starter</artifactId> </dependency>
39.2. URI 格式
Google Pubsub 组件使用以下 URI 格式:
google-pubsub://project-id:destinationName?[options]
目的地名称可以是主题或订阅名称。
39.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
39.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
39.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
39.4. 组件选项
Google Pubsub 组件支持 10 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
authentication (common) | 在与 PubSub 服务交互时使用凭证(在使用仿真程序时不需要身份验证)。 | true | 布尔值 |
endpoint (common) | 与本地 Pub/Sub 模拟器一起使用的端点。 | 字符串 | |
serviceAccountKey (common) | 用作 PubSub publisher/subscriber 的凭证的服务帐户密钥。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
synchronousPullRetryableCodes (consumer) | 用于同步拉取的额外可重试错误代码的逗号分隔列表。默认情况下,PubSub 客户端库重试 ABORTED, UNAVAILABLE, UNKNOWN。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
publisherCacheSize (producer) | 要缓存的最大生成者数。如果您有大量不同主题的制作者,可能会增加它。 | int | |
publisherCacheTimeout (producer) | 每个制作者在缓存中保留多少毫秒。 | int | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
publisherTerminationTimeout (advanced) | 应允许生成者终止多少毫秒。 | int |
39.5. 端点选项
Google Pubsub 端点使用 URI 语法进行配置:
google-pubsub:projectId:destinationName
使用以下路径和查询参数:
39.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
projectId (common) | 必需 Google Cloud PubSub Project Id。 | 字符串 | |
destinationName (common) | 必需 目标名称。对于消费者,这将是订阅名称,而对于制作者,这将是主题名称。 | 字符串 |
39.5.2. 查询参数(15 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
authentication (common) | 在与 PubSub 服务交互时使用凭证(在使用仿真程序时不需要身份验证)。 | true | 布尔值 |
loggerId (common) | 与所需的父路由匹配时要使用的日志记录器 ID。 | 字符串 | |
serviceAccountKey (common) | 用作 PubSub publisher/subscriber 的凭证的服务帐户密钥。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
ackMode (consumer) | AUTO = Exchange 在完成后得到 ack'ed/nack。NONE = 下游进程必须明确进行 ack/nack。 Enum 值:
| AUTO | AckMode |
concurrentConsumers (consumer) | 从订阅中使用的并行流数量。 | 1 | 整数 |
maxAckExtensionPeriod (consumer) | 设置消息 ack 截止时间将延长的最大周期。以秒为单位的值。 | 3600 | int |
maxMessagesPerPoll (consumer) | 在单个 API 调用中从服务器接收的最大消息数。 | 1 | 整数 |
synchronousPull (consumer) | 同步拉取消息的批处理。 | false | 布尔值 |
bridgeErrorHandler (consumer (advanced)) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
messageOrderingEnabled (producer (advanced)) | 应启用消息排序。 | false | 布尔值 |
pubsubEndpoint (producer (advanced)) | 要使用的 pub/Sub 端点。使用消息排序时需要,并确保即使使用多个发布者,也会按顺序接收消息。 | 字符串 | |
S erializer (producer (advanced)) | Autowired A custom GooglePubsubSerializer 用于在制作者中序列化消息有效负载。 | GooglePubsubSerializer |
39.6. 消息标头
Google Pubsub 组件支持 5 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelGooglePubsubMessageId (common) 恒定: MESSAGE_ID | 发布消息时由服务器分配的消息的 ID。 | 字符串 | |
CamelGooglePubsubMsgAckId (consumer) 常数: ACK_ID | 用于确认收到的消息的 ID。 | 字符串 | |
CamelGooglePubsubPublishTime (consumer) 恒定: PUBLISH_TIME | 发布消息的时间。 | Timestamp | |
CamelGooglePubsubAttributes (common) 常数 : ATTRIBUTES | 消息的属性。 | Map | |
CamelGooglePubsubOrderingKey (producer) 常数: ORDERING_KEY | 如果非空,请标识应遵守发布顺序的相关消息。 | 字符串 |
39.7. 生成者端点
生产者端点可以接受并交付给 PubSub 个人和分组的交换。分组交换设置了 Exchange.GROUPED_EXCHANGE
属性。
Google PubSub 预期有效负载是 byte[] 数组,Producer 端点将发送:
- 字符串正文为 byte[],编码为 UTF-8
- byte[] 正文,如下所示
- 其他所有内容都会序列化为 byte[] 数组
Map 设置为消息标头 GooglePubsubConstants.ATTRIBUTES
将作为 PubSub 属性发送。
Google PubSub 支持订购消息交付。
要启用此设置,将选项 messageOrderingEnabled 设置为 true,将 pubsubEndpoint 设置为 GCP 区域。
在生成消息时,设置消息标头 GooglePubsubConstants.ORDERING_KEY
。这将设置为消息的 PubSub orderingKey。
有关 订购消息 的更多信息。
交换发送至 PubSub 后,PubSub Message ID 将分配给标头 GooglePubsubConstants.MESSAGE_ID
。
39.8. 消费者端点
如果 Google PubSub 在周期内还没有被确认,则 Google PubSub 将重新设计为订阅上的配置选项。
在交换处理完成后,组件将确认消息。
如果路由抛出异常,则交换标记为失败,组件将立即删除消息 - 它将立即重新设计。
要对消息进行 ack/nack,组件使用 Acknowledgement ID 存储为标头 GooglePubsubConstants.ACK_ID
。如果删除或篡改了标头,则 ack 将失败,并在 ack 截止时间后再次更新消息。
39.9. 消息正文
消费者端点将消息的内容返回为 byte[] - 与底层系统发送的内容完全相同。它是对内容进行转换/unmarshall 的路由。
39.10. 身份验证配置
默认情况下,此组件使用 GoogleCredentials.getApplicationDefault ()
来查询凭证。可以通过将 authentication 选项设置为 false
来禁用此行为,在这种情况下,将对 Google API 的请求进行,而无需身份验证详情。这只在针对仿真程序进行开发时才需要。可以通过提供服务帐户密钥文件的路径来更改此行为。
39.11. 回滚和重新发送
Google PubSub 的回滚取决于 Acknowledgement Deadline (Google PubSub 期望接收确认的时间周期)。如果尚未收到确认,则消息为redelivered。
Google 提供了一个 API,用于扩展消息的截止时间。
Google PubSub 文档 的更多信息。
因此,回滚实际上是一个期限扩展 API 调用,其值为零 - 例如,现在已经达到截止时间,消息可以被重新分配给下一个消费者。
通过将消息标头 GooglePubsubConstants.ACK_DEADLINE
设置为以秒为单位,可以延迟消息重新发送,方法是为回滚明确设置确认期限。
39.12. Spring Boot Auto-Configuration
组件支持 11 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.google-pubsub.authenticate | 在与 PubSub 服务交互时使用凭证(在使用仿真程序时不需要身份验证)。 | true | 布尔值 |
camel.component.google-pubsub.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.google-pubsub.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.google-pubsub.enabled | 是否启用 google-pubsub 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.google-pubsub.endpoint | 与本地 Pub/Sub 模拟器一起使用的端点。 | 字符串 | |
camel.component.google-pubsub.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.google-pubsub.publisher-cache-size | 要缓存的最大生成者数。如果您有大量不同主题的制作者,可能会增加它。 | 整数 | |
camel.component.google-pubsub.publisher-cache-timeout | 每个制作者在缓存中保留多少毫秒。 | 整数 | |
camel.component.google-pubsub.publisher-termination-timeout | 应允许生成者终止多少毫秒。 | 整数 | |
camel.component.google-pubsub.service-account-key | 用作 PubSub publisher/subscriber 的凭证的服务帐户密钥。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
camel.component.google-pubsub.synchronous-pull-retryable-codes | 用于同步拉取的额外可重试错误代码的逗号分隔列表。默认情况下,PubSub 客户端库重试 ABORTED, UNAVAILABLE, UNKNOWN。 | 字符串 |
第 40 章 Groovy
Since Camel 1.3
Camel 支持使用 Groovy。例如,您可以在 Predicate 中使用 Groovy 和 Message Filter EIP。
40.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 camel-groovy
时,将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-groovy-starter</artifactId> </dependency>
40.2. URI 格式
camel-groovy
语言组件使用以下 URI 表示法:
groovy("someGroovyExpression")
40.3. Groovy 选项
Groovy 语言支持 2 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
resultType |
| 设置结果类型的类(输出中的类型)。 | |
trim |
|
| 是否修剪值以移除前导和结尾的空格和换行符。 |
40.4. 例子
以下示例使用消息过滤器中的 groovy 脚本作为 predicate,来确定是否有行项目是否超过 100:
- Java
from("queue:foo") .filter(groovy("request.lineItems.any { i -> i.value > 100 }")) .to("queue:bar")
- XML DSL
<route> <from uri="queue:foo"/> <filter> <groovy>request.lineItems.any { i -> i.value > 100 }</groovy> <to uri="queue:bar"/> </filter> </route>
40.5. Groovy 上下文
Camel 在 Groovy 上下文(just a Map
)中提供交换信息。Exchange
作为以下内容传输:
key | value |
---|---|
|
|
|
|
| 变量 |
| In 消息的标头。 |
| Camel 上下文. |
|
|
|
|
|
|
40.6. 如何从多个语句脚本获得结果
Groovy 脚本引擎评估方法如果运行了多个语句脚本,则返回 Null
。Camel 使用值集中 的结果
键查找脚本结果值。如果您有多个语句脚本,请确保将 result 变量的值设置为脚本返回值。
bar = "baz"; # some other statements ... # camel take the result value as the script evaluation result result = body * 2 + 1
40.7. 自定义 Groovy Shell
对于非常特殊的用例,您可能需要在 Groovy 表达式中使用自定义 GroovyShell
实例。要提供自定义的 GroovyShell
,请将 org.apache.camel.language.groovy.GroovyShellFactory
SPI 接口的实现添加到 Camel 注册表。
public class CustomGroovyShellFactory implements GroovyShellFactory { public GroovyShell createGroovyShell(Exchange exchange) { ImportCustomizer importCustomizer = new ImportCustomizer(); importCustomizer.addStaticStars("com.example.Utils"); CompilerConfiguration configuration = new CompilerConfiguration(); configuration.addCompilationCustomizers(importCustomizer); return new GroovyShell(configuration); } }
然后,Camel 将使用您的自定义 GroovyShell 实例(包含您的自定义静态导入),而不是默认导入。
40.8. 从外部资源载入脚本
您可以对脚本进行外部化,并让 Camel 从资源(如 "classpath:"
、"file:"
或 "http:"
)加载它。您可以使用以下语法来实现此目的:
`"resource:scheme:location"`,
例如,要引用 classpath 上的文件,您可以使用以下内容:
.setHeader("myHeader").groovy("resource:classpath:mygroovy.groovy")
40.9. Spring Boot Auto-Configuration
组件支持 2 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.language.groovy.enabled | 是否启用 groovy 语言的自动配置。这默认是启用的。 | 布尔值 | |
camel.language.groovy.trim | 是否修剪值以移除前导和结尾的空格和换行符。 | true | 布尔值 |
第 41 章 gRPC
从 Camel 2.19 开始
支持生成者和消费者
gRPC 组件允许您使用 协议缓冲(protobuf)交换格式通过 HTTP/2 传输调用或公开远程过程调用(RPC) 服务。
41.1. 依赖项
当在 Camel Spring Boot 中使用 grpc
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-grpc-starter</artifactId> </dependency>
41.2. URI 格式
grpc:host:port/service[?options]
41.3. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
41.3.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
41.3.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
41.4. 组件选项
gRPC 组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
41.5. 端点选项
gRPC 端点使用 URI 语法进行配置:
grpc:host:port/service
使用以下路径和查询参数:
41.5.1. 路径参数(3 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
host (common) | 必需 gRPC 服务器主机名。在使用生成者时作为消费者或远程服务器主机名,这是 localhost 或 0.0.0.0。 | 字符串 | |
port (common) | 需要 gRPC 本地或远程服务器端口。 | int | |
service (common) | 从协议缓冲区描述符文件(软件包点服务定义名称)中所需的完全限定服务名称。 | 字符串 |
41.5.2. 查询参数(29 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
flowControlWindow (common) | HTTP/2 流控制窗口大小(MiB)。 | 1048576 | int |
maxMessageSize (common) | 允许接收/sent (MiB)的最大消息大小。 | 4194304 | int |
autoDiscoverServerInterceptors (consumer) | 如果为 true 设置 autoDiscoverServerInterceptors 机制,则组件将自动在 registry 中查找 ServerInterceptor 实例,否则它将跳过该检查。 | true | 布尔值 |
consumerStrategy (consumer) | 这个选项指定在流传输模式下处理服务请求和响应的顶级策略。如果选择了聚合策略,则会在列表中累计所有请求,然后传送到流中,累积的响应将发送到发送者。如果选择了传播策略,则会将请求发送到流,响应将立即发送到发送者。 Enum 值:
| PROPAGATION | GrpcConsumerStrategy |
forwardOnCompleted (consumer) | 确定是否应将 onCompleted 事件推送到 Camel 路由。 | false | 布尔值 |
forwardOnError (consumer) | 确定是否应将 onError 事件推送到 Camel 路由。例外将设置为消息正文。 | false | 布尔值 |
maxConcurrentCallsPerConnection (consumer) | 每个传入服务器连接允许的最大并发调用数。 | 2147483647 | int |
routeControlledStreamObserver (consumer) | 使路由能够控制流观察器。如果将此值设置为 true,则 gRPC 调用的响应观察器将使用 Exchange 对象中的名称 GrpcConstants.GRPC_RESPONSE_OBSERVER 设置。请注意,路由中应调用流 observer's onNext (), onError (), onCompleted ()方法。 | false | 布尔值 |
bridgeErrorHandler (consumer (advanced)) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
autoDiscoverClientInterceptors (producer) | 如果为 true 设置 autoDiscoverClientInterceptors 机制,则组件将自动在 registry 中查找 ClientInterceptor 实例,否则它将跳过该检查。 | true | 布尔值 |
method (producer) | gRPC 方法名称。 | 字符串 | |
producerStrategy (producer) | 用于与远程 gRPC 服务器通信的模式。在 SIMPLE 模式中,单个交换被转换为远程过程调用。在 STREAMING 模式中,所有交换都将在同一请求中发送(接收者 gRPC 服务的输入和输出必须是 'stream' 类型)。 Enum 值:
| SIMPLE | GrpcProducerStrategy |
streamRepliesTo (producer) | 使用 STREAMING 客户端模式时,它指示应转发响应的端点。 | 字符串 | |
userAgent (producer) | 传递给服务器的用户代理标头。 | 字符串 | |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
同步 (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
authenticationType (security) | 身份验证方法类型提前到 SSL/TLS 协商。 Enum 值:
| NONE | GrpcAuthType |
jwtAlgorithm (security) | JSON Web 令牌签名算法。 Enum 值:
| HMAC256 | JwtAlgorithm |
JWTIssuer (security) | JSON Web 令牌签发者. | 字符串 | |
jwtSecret (security) | JSON Web 令牌 secret。 | 字符串 | |
JWTSubject (security) | JSON Web 令牌主题. | 字符串 | |
keyCertChainResource (security) | PEM 格式链接的 X.509 证书链文件资源。 | 字符串 | |
keyPassword (security) | PKCS#8 私钥文件密码。 | 字符串 | |
keyResource (security) | PKCS#8 私钥文件资源采用 PEM 格式链接。 | 字符串 | |
negotiationType (security) | 标识用于 HTTP/2 通信的安全协商类型。 Enum 值:
| PLAINTEXT | NegotiationType |
serviceAccountResource (security) | Google Cloud SDK 支持的 JSON 格式的服务帐户密钥文件。 | 字符串 | |
trustCertCollectionResource (security) | PEM 格式的可信证书集合文件资源,用于验证远程端点的证书。 | 字符串 |
41.6. 消息标头
gRPC 组件支持 3 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelGrpcMethodName (consumer) | 由消费者服务处理的方法名称。 | 字符串 | |
CamelGrpcUserAgent (consumer) | 如果提供,给定代理将预先填充 gRPC 库的用户代理信息。 | 字符串 | |
CamelGrpcEventType (consumer) | 从发送请求中接收的事件类型。可能的值:在Next onCompleted onError 上。 | 字符串 |
41.7. 传输安全性和身份验证支持
以下 身份验证机制 内置于 gRPC 并在此组件中可用:
- SSL/TLS: gRPC 具有 SSL/TLS 集成,并推广使用 SSL/TLS 验证服务器,并加密在客户端和服务器之间交换的所有数据。可选的机制可用于客户端为 mutual 身份验证提供证书。
- 使用 Google 来实现基于令牌的身份验证: gRPC 提供了将基于元数据的凭证附加到请求和响应的通用机制。提供了额外的支持,以便在通过 gRPC 访问 Google API 时获取访问令牌。通常,必须在频道中使用这种机制以及 SSL/TLS。
要启用这些功能,必须配置以下组件属性组合:
num. | 选项 | 参数 | 值 | 必填/选填 |
---|---|---|---|---|
1 | SSL/TLS | negotiationType | TLS | 必填 |
keyCertChainResource | 必填 | |||
keyResource | 必填 | |||
keyPassword | 选填 | |||
trustCertCollectionResource | 选填 | |||
2 | 使用 Google API 基于令牌的身份验证 | authenticationType | | 必填 |
negotiationType | TLS | 必填 | ||
serviceAccountResource | 必填 | |||
3 | 自定义 JSON Web 令牌实现身份验证 | authenticationType | JWT | 必填 |
negotiationType | NONE 或 TLS | 可选。TLS/SSL 不会检查此类型,但强烈建议使用。 | ||
jwtAlgorithm | HMAC256 (default)或(HMAC384,HMAC512) | 选填 | ||
jwtSecret | 必填 | |||
jwtIssuer | 选填 | |||
jwtSubject | 选填 |
41.8. gRPC producer 资源类型映射
下表显示了消息正文中的对象类型,具体取决于传入和传出参数的类型(简单或流),以及调用样式(同步或异步)。请注意,不允许以异步样式调用传入流参数的流程。
调用样式 | 请求类型 | 响应类型 | 请求正文类型 | 结果正文类型 |
---|---|---|---|---|
同步 | simple | simple | 对象 | 对象 |
同步 | simple | 流 | 对象 | List<Object> |
同步 | 流 | simple | 不允许 | 不允许 |
同步 | 流 | 流 | 不允许 | 不允许 |
asynchronous | simple | simple | 对象 | List<Object> |
asynchronous | simple | 流 | 对象 | List<Object> |
asynchronous | 流 | simple | 对象或 List<Object> | List<Object> |
asynchronous | 流 | 流 | 对象或 List<Object> | List<Object> |
41.9. 例子
以下是使用主机和端口参数调用的简单同步方法:
from("direct:grpc-sync") .to("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=sendPing&synchronous=true");
<route> <from uri="direct:grpc-sync" /> <to uri="grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=sendPing&synchronous=true"/> </route>
异步方法调用
from("direct:grpc-async") .to("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=pingAsyncResponse");
带有传播消费者策略的 gRPC 服务消费者:
from("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?consumerStrategy=PROPAGATION") .to("direct:grpc-service");
带有 streaming producer 策略的 gRPC 服务制作者(需要使用"stream"模式作为输入和输出的服务):
from("direct:grpc-request-stream") .to("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=PingAsyncAsync&producerStrategy=STREAMING&streamRepliesTo=direct:grpc-response-stream"); from("direct:grpc-response-stream") .log("Response received: ${body}");
启用 gRPC 服务消费者 TLS/SSL 安全协商:
from("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?consumerStrategy=PROPAGATION&negotiationType=TLS&keyCertChainResource=file:src/test/resources/certs/server.pem&keyResource=file:src/test/resources/certs/server.key&trustCertCollectionResource=file:src/test/resources/certs/ca.pem") .to("direct:tls-enable")
带有自定义 JSON Web Token (JWT)实现身份验证的 gRPC 服务制作者:
from("direct:grpc-jwt") .to("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?method=pingSyncSync&synchronous=true&authenticationType=JWT&jwtSecret=supersecuredsecret");
41.10. 配置
使用 protobuf-maven-plugin
,它调用 Protocol Buffer Compiler (protoc)从 .proto (协议缓冲区定义)文件生成 Java 源文件。此插件将生成程序请求和响应类,其构建器和 gRPC 流程 stubs 类。
以下步骤是必需的:
在项目 pom.xml 的 < build> 标签内插入操作系统和 CPU 架构检测扩展,或者手动设置 $\{os.detected.classifier} 参数
<extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.7.1</version> </extension> </extensions>
将 gRPC 和 protobuf Java 代码生成器插件插入到项目的 pom.xml
的 < plugins > 标签中。
<plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <protocArtifact>com.google.protobuf:protoc:${protobuf-version}:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc-version}:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> <goal>test-compile</goal> <goal>test-compile-custom</goal> </goals> </execution> </executions> </plugin>
41.11. 其他资源
请参阅这些资源:
41.12. Spring Boot Auto-Configuration
组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.grpc.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.grpc.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.grpc.enabled | 是否启用 grpc 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.grpc.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 42 章 标头
标头表达式语言允许您提取命名标头的值。
42.1. 依赖项
Header 语言是 camel-core 的一部分。
当在 Red Hat build of Camel Spring Boot 中使用 标头
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-core-starter</artifactId> </dependency>
42.2. 标头选项
标头语言支持 1 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
trim |
| 是否修剪值以移除前导和结尾的空格和换行符。 |
42.3. 用法示例
recipientList
EIP 可以使用标头:
<route> <from uri="direct:a" /> <recipientList> <header>myHeader</header> </recipientList> </route>
在这种情况下,接收者列表包含在标头 'myHeader' 中。
以及 Java DSL 中的相同示例:
from("direct:a").recipientList(header("myHeader"));
42.4. Spring Boot Auto-Configuration
组件支持 147 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 使用客户端查找时设置客户端密钥存储数据。 | 字符串 | |
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 using environment,环境变量用于查找服务。默认情况下使用环境。 | 环境 | 字符串 |
camel.cloud.kubernetes.service-discovery.master-url | 在使用客户端查找时,将 URL 设置为 master。 | 字符串 | |
camel.cloud.kubernetes.service-discovery.namespace | 设置要使用的命名空间。默认情况下,将使用来自 ENV 变量 KUBERNETES_MASTER 的命名空间。 | 字符串 | |
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 ()的影响类似,除非继续跟踪指标,知道它是否应该是 open/closed,此属性即使实例化一个断路器。 | 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 ()的错误百分比如何。如果设为 true,则 circuitBreakerForceOpen ()属性具有优先权。 | false | 布尔值 |
camel.hystrix.circuit-breaker-force-open | 如果为 true,HystrixCircuitBreaker.allowRequest ()将始终返回 false,从而导致电路变为开路(接受),并拒绝所有请求。此属性优先于 circuitBreakerForceClosed ();。 | false | 布尔值 |
camel.hystrix.circuit-breaker-request-volume-threshold | metricsRollingStatisticalWindowInMilliseconds ()中的最少请求数必须存在于 HystrixCircuitBreaker 之前。如果此数字低于这个数字,无论错误百分比如何,电路都不会被出差。 | 20 | 整数 |
camel.hystrix.circuit-breaker-sleep-window-in-milliseconds | HystrixCircuitBreaker trips 之后的时间(以毫秒为单位),它应该在尝试请求前等待。 | 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 ()的并发请求数。超过并发限制的请求将被拒绝。仅在执行IsolationStrategy == SEMAPHORE 时使用。 | 20 | 整数 |
camel.hystrix.execution-isolation-strategy | 将通过什么隔离策略 HystrixCommand.run ()执行。如果 THREAD,它将在单独的线程上执行,并且受 thread-pool 中的线程数量限制的并发请求。如果 SEMAPHORE,它将在调用线程上执行,并且受 semaphore 数限制的并发请求。 | 线程 | 字符串 |
camel.hystrix.execution-isolation-thread-interrupt-on-timeout | 当线程超时时,执行线程是否应该尝试中断(使用 future#cancel)。仅在执行IsolationStrategy ()== THREAD 时才适用。 | true | 布尔值 |
camel.hystrix.execution-timeout-enabled | 此命令是否启用了超时机制。 | true | 布尔值 |
camel.hystrix.execution-timeout-in-milliseconds | 以毫秒为单位,将命令超时和停止执行的时间(以毫秒为单位)。如果 executionIsolationThreadInterruptOnTimeout == true 且命令是线程隔离,则执行线程将中断。如果命令是 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 | 设置要使用的 group 键。默认值为 CamelHystrix。 | CamelHystrix | 字符串 |
camel.hystrix.keep-alive-time | 更长的时间(以分钟为单位)传递给 ThreadPoolExecutor#setKeepAliveTime (long,TimeUnit)。 | 1 | 整数 |
camel.hystrix.max-queue-size | 在 HystrixConcurrencyStrategy.getBlockingQueue (int)中传递给 BlockingQueue 的最大队列大小应该只影响 threadpool 的实例化 - 它不会立即更改队列大小。为此,请使用 queueSizeRejectionThreshold ()。 | -1 | 整数 |
camel.hystrix.maximum-size | 传递给 ThreadPoolExecutor#setMaximumPoolSize (int)的最大 thread-pool 大小。这是可在不开始拒绝 HystrixCommands 的情况下支持的最大并发数量。请注意,只有在您也设置了 allowMaximumSizeToDivergeFromCoreSize 时,此设置才会生效。 | 10 | 整数 |
camel.hystrix.metrics-health-snapshot-interval-in-milliseconds | 在允许计算成功和错误百分比时等待的时间(以毫秒为单位),并影响 HystrixCircuitBreaker.isOpen ()状态。在高容量电路上,错误百分比的连续计算可能会成为 CPU 密集型,从而控制其计算的频率。 | 500 | 整数 |
camel.hystrix.metrics-rolling-percentile-bucket-size | 滚动百分比的每个存储桶中存储的最大值数。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 10 | 整数 |
camel.hystrix.metrics-rolling-percentile-enabled | 是否应该使用 HystrixRollingPercentile 内部 HystrixCommandMetrics 来捕获百分比的指标。 | true | 布尔值 |
camel.hystrix.metrics-rolling-percentile-window-buckets | 滚动窗口的存储桶数量被分成。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 6 | 整数 |
camel.hystrix.metrics-rolling-percentile-window-in-milliseconds | 以毫秒为单位的滚动窗口的持续时间。这在 HystrixCommandMetrics 中被传递至 HystrixRollingPercentile。 | 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 | 队列大小拒绝阈值是 artificial max size,即使尚未达到 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 过渡到 open,并启动短路调用。阈值必须大于 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 | 配置滑动窗口的大小,该窗口用于在 CircuitBreaker 关闭时记录调用的结果。slidingWindowSize 配置滑动窗口的大小。滑动窗口可以是基于计数或基于时间的窗口。如果 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 | 配置滑动窗口的类型,用于记录 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 会将调用视为较慢。当较慢的调用百分比相等或大于阈值时,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 的 Camel 组件名称(如 swagger)如果没有明确配置 API 组件,则 Camel 会查找负责服务并生成 REST API 文档的 Camel 组件,或者如果 registry 中注册了 org.apache.camel.spi.RestApiProcessorFactory。如果找到其中任何一个,则使用它。 | 字符串 | |
camel.rest.api-context-path | 设置领导的 API 上下文路径将使用的 REST API 服务。这在使用使用 context-path 部署 Web 应用程序的组件(如 camel-servlet )时使用它。 | 字符串 | |
camel.rest.api-context-route-id | 设置用于服务 REST API 的路由的路由 ID。默认情况下,路由将使用自动分配的路由 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 标头是否受到其 consume/produces 设置的 Rest-DSL 配置的支持。这可以打开,以启用此检查。如果验证错误,则返回 HTTP Status code 415 或 406。默认值为 false。 | false | 布尔值 |
camel.rest.component | 用于 REST 传输(consumer)的 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 部署 Web 应用程序的组件(如 camel-servlet )时使用它。或者对于包含 HTTP 服务器的 camel-jetty 或 camel-netty-http 等组件。 | 字符串 | |
camel.rest.cors-headers | 允许配置自定义 CORS 标头。 | Map | |
camel.rest.data-format-property | 允许为使用的数据格式配置多个额外属性。例如,将属性 prettyPrint 设置为 true,以便以用户友善模式输出 json。属性可以加上前缀来表示选项仅适用于 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 | 布尔值 |
第 43 章 HL7
HL7 组件用于使用 HL7 MLLP 协议和 HL7 v2 消息,使用 HAPI 库。
这个组件支持以下组件:
43.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 hl7
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-hl7-starter</artifactId> </dependency>
43.2. HL7 MLLP 协议
HL7 通常与 HL7 MLLP 协议一起使用,它是基于文本的 TCP 套接字协议。此组件提供了 Mina 和 Netty Codec,它符合 MLLP 协议,以便您可以轻松地公开可以接受通过 TCP 传输层的 HL7 请求的 HL7 侦听器。要公开 HL7 侦听器服务,camel-mina 或 link:camel-netty 组件与 HL7MLLPCodec (mina)或 HL7MLLPNettyDecoder/HL7MLLPNettyEncoder (Netty)一起使用。
HL7 MLLP codec 可以配置如下:
Name | 默认值 | 描述 |
---|---|---|
|
| 跨越 HL7 有效负载的开始字节。 |
|
| 跨越 HL7 有效负载的第一个结束字节。 |
|
| 跨越 HL7 有效负载的第 2 个结束字节。 |
| JVM 默认值 | 用于 codec 的编码(费用名称)。如果没有提供,Camel 将使用 JVM 默认 Charset。 |
|
| 如果为 true,则 codec 使用定义的 charset 创建一个字符串。如果为 false,则 codec 会将普通字节数组发送到路由,以便 HL7 数据格式可以决定 HL7 消息内容中的实际 charset。 |
|
|
将 |
43.2.1. 使用 Mina 公开 HL7 侦听器
在 Spring XML 文件中,我们将 mina 端点配置为使用 TCP 在端口 8888
上侦听 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
或 any。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 bean ID,在 Spring XML 中配置,如下所示:
<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 }
43.2.2. 使用 Netty 公开 HL7 侦听器(从 Camel 2.15 开始可用)
在 Spring XML 文件中,我们将 netty 端点配置为使用 TCP 在端口 8888
上侦听 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
和 hl7decoder
只是 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");
43.3. 使用 java.lang.String 或 byte[] 的 HL7 Model
HL7 MLLP codec 使用普通 String 作为其数据格式。Camel 使用其 Type Converter 将字符串转换为 HAPI HL7 模型对象,但如果您想要自行解析数据,您可以使用 plain String 对象。
您还可以通过将 produceString
属性设置为 false,使 Mina 和 Netty codecs 使用 plain byte[]
作为其数据格式。Type Converter 也可以将 byte[]
转换为/来自 HAPI HL7 模型对象。
43.4. 使用 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();
43.5. HL7 DataFormat
camel-hl7
JAR 附带 HL7 数据格式,可用于 marshal 或 unmarshal HL7 模型对象。
HL7 dataformat 支持 1 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
validate |
| 默认情况下,是否验证 HL7 消息 Is true。 |
-
marshal
= 从消息到字节流(可以使用 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 消息对象,该对象传递到我们的病人查找服务。
43.5.1. 片段分隔符
unmarshalling 不再通过将 \n
转换为 \r
来自动修复网段分隔符。如果您
需要这个转换,org.apache.camel.component.hl7.HL7#convertLFToCR
为 这一目的
提供了方便的表达式。
43.5.2. charset
marshal 和 unmarshal
评估在字段 MSH-18
中提供的 charset。如果此字段为空,则默认假定对应的 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");
43.6. 消息标头
unmarshal 操作将 MSH 段中的这些字段添加为 Camel 消息上的标头:
键 | MSH 字段 | 示例 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| `` |
|
|
|
|
CamelHL7Context
以外的所有标头都是 String
类型。如果缺少标头值,则其值为 null
。
43.7. 依赖项
要在 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>
43.8. Spring Boot Auto-Configuration
组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.dataformat.hl7.enabled | 是否启用 hl7 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
camel.dataformat.hl7.validate | 默认情况下,是否验证 HL7 消息 Is true。 | true | 布尔值 |
camel.language.hl7terser.enabled | 是否启用 hl7terser 语言的自动配置。这默认是启用的。 | 布尔值 | |
camel.language.hl7terser.trim | 是否修剪值以移除前导和结尾的空格和换行符。 | true | 布尔值 |
第 44 章 HTTP
仅支持生成者
HTTP 组件提供基于 HTTP 的端点来调用外部 HTTP 资源(作为客户端使用 HTTP 调用外部服务器)。
44.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 http
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-http-starter</artifactId> </dependency>
44.2. URI 格式
http:hostname[:port][/resourceUri][?options]
默认情况下,将端口 80 用于 HTTP,对于 HTTPS 使用 443。
44.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
44.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
44.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
44.4. 组件选项
HTTP 组件支持 37 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 交换标头中。把它设置为 false,仅允许包含来自 HTTP 响应的标头(而不是传播 IN 标头)。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
responsePayloadStreamingThreshold (producer) | 此阈值(以字节为单位)控制响应有效负载应存储在内存中作为字节数阵列还是基于流传输。把它设置为 -1 以始终使用流模式。 | 8192 | int |
skipRequestHeaders (producer (advanced)) | 是否跳过将所有 Camel 标头映射为 HTTP 请求标头。如果 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 (advanced) | 禁用身份验证方案缓存。 | false | 布尔值 |
automaticRetriesDisabled (advanced) | 禁用自动请求恢复并重新执行。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
clientConnectionManager (advanced) | 使用自定义和共享 HttpClientConnectionManager 来管理连接。如果进行了配置,则始终将此端点用于此组件创建的所有端点。 | HttpClientConnectionManager | |
connectionsPerRoute (advanced) | 每个路由的最大连接数。 | 20 | int |
connectionStateDisabled (advanced) | 禁用连接状态跟踪。 | false | 布尔值 |
connectionTimeToLive (advanced) | 与实时连接的时间,时间单位为 millisecond,默认值为始终保持活动状态。 | long | |
ContentCompressionDisabled (advanced) | 禁用自动内容解压缩。 | false | 布尔值 |
cookieManagementDisabled (advanced) | 禁用状态(cookie)管理。 | false | 布尔值 |
defaultUserAgentDisabled (advanced) | 如果用户未提供任何用户代理,则禁用此构建器设置的默认用户代理。 | false | 布尔值 |
httpBinding (advanced) | 使用自定义 HttpBinding 来控制 Camel 消息和 HttpClient 之间的映射。 | HttpBinding | |
httpClientConfigurer (advanced) | 要使用自定义 HttpClientConfigurer 执行要使用的 HttpClientConfigurer 的配置。 | HttpClientConfigurer | |
httpConfiguration (advanced) | 将共享的 HttpConfiguration 用作基础配置。 | HttpConfiguration | |
httpContext (advanced) | 在执行请求时使用自定义 org.apache.http.protocol.HttpContext。 | HttpContext | |
maxTotalConnections (advanced) | 连接的最大数量。 | 200 | int |
redirectHandlingDisabled (advanced) | 禁用自动重定向处理。 | false | 布尔值 |
headerFilterStrategy (filter) | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 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 |
44.5. 端点选项
HTTP 端点使用 URI 语法进行配置:
http://httpUri
使用以下路径和查询参数:
44.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
httpUri (common) | 必需 要调用的 HTTP 端点的 url。 | URI |
44.5.2. 查询参数(51 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
chunked (producer) | 如果此选项为 false,则 Servlet 将禁用 HTTP 流,并在响应上设置 content-length 标头。 | true | 布尔值 |
disableStreamCache (common) | 确定来自 Servlet 的原始输入流是否被缓存(Camel 会将流读取到内存/流到文件、流缓存)缓存。默认情况下,Camel 将缓存 Servlet 输入流来支持多次读取它,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流时,您可以将这个选项设置为 true,比如将其直接流传输到文件或其他持久性存储。DefaultHttpBinding 会将请求输入流复制到流缓存中,如果此选项为 false,则将其放入消息正文,以支持多次读取流。如果您使用 Servlet 桥接/代理,则考虑启用这个选项以提高性能,以防您不需要多次读取消息有效负载。http producer 默认将缓存响应正文流。如果将此选项设置为 true,则制作者不会缓存响应正文流,而是使用响应流作为消息正文。 | false | 布尔值 |
headerFilterStrategy (common) | 使用自定义 HeaderFilterStrategy 过滤标头到 Camel 消息。 | HeaderFilterStrategy | |
httpBinding (common (advanced)) | 使用自定义 HttpBinding 来控制 Camel 消息和 HttpClient 之间的映射。 | HttpBinding | |
bridgeEndpoint (producer) | 如果选项为 true,HttpProducer 将忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 请求。您还可以将选项 throwExceptionOnFailure 设置为 false,以让 HttpProducer 发送所有故障响应。 | false | 布尔值 |
clearExpiredCookies (producer) | 在发送 HTTP 请求前,是否清除已过期的 Cookie。这样可确保 Cookie 存储不会通过添加新的 Cookie 来保持增长,这些 Cookie 在其过期时会被删除。如果组件禁用了 Cookie 管理,则此选项也会被禁用。 | true | 布尔值 |
connectionClose (producer) | 指定是否需要将 Connection Close 标头添加到 HTTP 请求。默认情况下,connectionClose 为 false。 | false | 布尔值 |
copyHeaders (producer) | 如果此选项为 true,则 IN Exchange 标头将根据复制策略复制到 OUT 交换标头中。把它设置为 false,仅允许包含来自 HTTP 响应的标头(而不是传播 IN 标头)。 | true | 布尔值 |
customHostHeader (producer) | 将自定义主机标头用于制作者。如果没有在查询中设置,则忽略。当设置时,将覆盖从 url 派生的主机标头。 | 字符串 | |
httpMethod (producer) | 配置要使用的 HTTP 方法。如果设置,HttpMethod 标头无法覆盖这个选项。 Enum 值:
| HttpMethods | |
ignoreResponseBody (producer) | 如果此选项为 true,http producer 不会读取响应正文并缓存输入流。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
preserveHostHeader (producer) | 如果选项为 true,HttpProducer 会将 Host 标头设置为当前交换主机标头中包含的值,用于您希望下游服务器接收的主机标头来反映上游客户端调用的 URL。 | false | 布尔值 |
throwExceptionOnFailure (producer) | 如果远程服务器失败响应,禁用禁用 HttpOperationFailedException 的选项。这样,无论 HTTP 状态代码是什么,您都可以获得所有响应。 | true | 布尔值 |
transferException (producer) | 如果在消费者端启用并且 Exchange 失败,如果导致的 Exception 被发送序列化为 application/x-java-serialized-object 内容类型。在生成者一侧,异常将被反序列化和抛出,而不是 HttpOperationFailedException。导致异常需要被序列化。默认情况下是关闭的。如果启用此选项,则 Java 会将传入数据从请求反序列化到 Java,这可能会成为潜在的安全风险。 | false | 布尔值 |
cookieHandler (producer (advanced)) | 配置 Cookie 处理程序来维护 HTTP 会话。 | CookieHandler | |
cookieStore (producer (advanced)) | 使用自定义 CookieStore。默认情况下,使用 BasicCookieStore,它是一个仅内存 Cookie 存储。请注意,如果 bridgeEndpoint=true,则 Cookie 存储被强制为 noop cookie 存储,因为 Cookie 不应存储,因为我们只是桥接(如代理)。如果设置了 CookieHandler,则 Cookie 存储也强制作为 Cookie 处理的 noop cookie 存储,然后由 CookieHandler 执行。 | CookieStore | |
deleteWithBody (producer (advanced)) | HTTP DELETE 是否应该包含消息正文。默认情况下,HTTP DELETE 不包含任何 HTTP 正文。但是,在一些罕见的情况下,用户可能需要包含消息正文。 | false | 布尔值 |
getWithBody (producer (advanced)) | HTTP GET 是否应包含消息正文。默认情况下,HTTP GET 不包含任何 HTTP 正文。但是,在一些罕见的情况下,用户可能需要包含消息正文。 | false | 布尔值 |
okStatusCodeRange (producer (advanced)) | 被视为成功响应的状态代码。这些值包含为。可以定义多个范围,用逗号分开,如 200-204,209,301-304。每个范围都必须是一个数字或 from-to,包括横线。 | 200-299 | 字符串 |
skipRequestHeaders (producer (advanced)) | 是否跳过将所有 Camel 标头映射为 HTTP 请求标头。如果 HTTP 请求中没有来自 Camel 标头的数据,可以避免解析 JVM 垃圾收集器有很多对象分配的开销。 | false | 布尔值 |
skipResponseHeaders (producer (advanced)) | 是否跳过将所有 HTTP 响应标头映射到 Camel 标头。如果 HTTP 标头不需要数据,这样可避免解析 JVM 垃圾收集器的多个对象分配的开销。 | false | 布尔值 |
userAgent (producer (advanced)) | 设置自定义 HTTP User-Agent 请求标头。 | 字符串 | |
ClientBuilder (advanced) | 提供对此端点的生产者或消费者使用的新 RequestConfig 实例中使用的 http 客户端请求参数的访问权限。 | HttpClientBuilder | |
clientConnectionManager (advanced) | 使用自定义 HttpClientConnectionManager 来管理连接。 | HttpClientConnectionManager | |
connectionsPerRoute (advanced) | 每个路由的最大连接数。 | 20 | int |
httpclient ( advanced) | 设置自定义 HttpClient,供制作者使用。 | HttpClient | |
httpClientConfigurer (advanced) | 为制作者或消费者创建的新 HttpClient 实例注册自定义配置策略,如配置身份验证机制等。 | HttpClientConfigurer | |
httpClientOptions (advanced) | 若要利用 map 中的键/值来配置 HttpClient。 | Map | |
httpContext (advanced) | 使用自定义 HttpContext 实例。 | HttpContext | |
maxTotalConnections (advanced) | 连接的最大数量。 | 200 | int |
useSystemProperties (advanced) | 使用系统属性作为配置的回退。 | 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 ( security) | 允许将身份验证方法用作以逗号分隔的值 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 |
44.6. 消息标头
Name | 类型 | 描述 |
---|---|---|
|
| 要调用的 URI。将覆盖直接在端点上设置的现有 URI。这个 uri 是要调用的 http 服务器的 uri。它和 Camel 端点 uri 不同,您可以在其中配置端点选项,如安全性等。此标头不支持它,它只是 http 服务器的 URI。 |
|
| 请求 URI 的路径,标头将使用 HTTP_URI 构建请求 URI。 |
|
| URI 参数。将覆盖直接在端点上设置的现有 URI 参数。 |
|
| 来自外部服务器的 HTTP 响应代码。200 代表 OK。 |
|
| 来自外部服务器的 HTTP 响应文本。 |
|
| 字符编码. |
|
|
HTTP 内容类型。设置 IN 和 OUT 消息上以提供内容类型,如 |
|
|
HTTP 内容编码。在 IN 和 OUT 消息上设置,以提供内容编码,如 |
44.7. 消息正文
Camel 会将来自外部服务器的 HTTP 响应存储在 OUT 正文上。来自 IN 消息的所有标头都将复制到 OUT 消息,因此在路由过程中会保留标头。此外,Camel 将添加 HTTP 响应标头以及 OUT 消息标头。
44.8. 使用系统属性
当将 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
44.9. 响应代码
Camel 将根据 HTTP 响应代码处理:
- 响应代码范围为 100..299,Camel 会将它视为成功响应。
-
响应代码在范围 300..399中,Camel 会将它视为重定向响应,并将引发带有信息的
HttpOperationFailedException
。 -
响应代码为 400+,Camel 会将它视为外部服务器失败,并将引发带有信息的
HttpOperationFailedException
。
throwExceptionOnFailure 选项 throwExceptionOnFailure
可以设置为 false
,以防止为失败的响应代码抛出 HttpOperationFailedException
。这样,您可以从远程服务器获得任何响应。
下面是一个演示示例。
44.10. 例外
HttpOperationFailedException
异常包含以下信息:
- HTTP 状态代码
- HTTP 状态行(状态代码的文本)
- 重定向位置,如果服务器返回重定向
-
如果服务器提供正文作为响应,则响应正文作为
java.lang.String
44.11. 将使用哪些 HTTP 方法
以下算法用于确定应使用的 HTTP 方法:
1。使用作为端点配置(httpMethod
)的方法。
2.使用在标头中提供的方法(Exchange.HTTP_METHOD
)。
3.如果标头中提供了查询字符串,GET
。
4.GET
如果端点配置了查询字符串。
5.POST
如果存在要发送的数据(用户不是 null
)。
6.否则 GET
。
44.12. 如何访问 HttpServletRequest 和 HttpServletResponse
您可以使用以下方法使用 Camel 类型转换器系统访问这两个
HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class); HttpServletResponse response = exchange.getIn().getBody(HttpServletResponse.class);
您只能在 camel-jetty 或 camel-cxf 端点后从处理器获取请求和响应。
44.13. 配置 URI 来调用
您可以直接设置 HTTP producer 的 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");
在上面的 Camel 示例中,尽管端点配置了 http://newhost/,但其端点 会调用 http://oldhost/。
如果 http 端点在网桥模式下工作,它将忽略 Exchange.HTTP_URI
的消息标头。
44.14. 配置 URI 参数
http producer 支持将 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");
44.15. 如何将 http 方法(GET/PATCH/POST/PUT/DELETE/HEAD/OPTIONS/TRACE)设置为 HTTP producer
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>
44.16. 使用客户端超时 - SO_TIMEOUT
请参阅 HttpSOTimeoutTest 单元测试。
44.17. 配置代理
HTTP 组件提供了一种配置代理的方法。
from("direct:start") .to("http://oldhost?proxyAuthHost=www.myproxy.com&proxyAuthPort=80");
还支持通过 proxyAuthUsername
和 proxyAuthPassword
选项进行代理身份验证。
44.17.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 System 或 CamelContext Properties 的设置,如果提供,则端点代理选项。
因此,您可以使用端点选项覆盖系统属性。
还有一个 http.proxyScheme
属性,您可以设置为显式配置要使用的方案。
44.18. 配置 charset
如果您使用 POST
发送数据,您可以使用 Exchange
属性配置 charset
:
exchange.setProperty(Exchange.CHARSET_NAME, "ISO-8859-1");
44.18.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");
44.18.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);
44.18.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 来分隔参数。
44.18.4. 获取响应代码
您可以通过使用 Exchange.HTTP_RESPONSE_CODE
从 Out message 标头获取 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);
44.19. 禁用 Cookie
要禁用 Cookie,您可以通过添加以下 URI 选项将 HTTP 客户端设置为忽略 Cookie:
httpClient.cookieSpec=ignore
44.20. 带有流消息正文的基本身份验证
为了避免 NonRepeatableRequestException
,您需要通过添加选项authenticationPreemptive=true
来进行 Preemptive Basic Authentication
44.21. 高级用法
如果您需要对 HTTP 生成者进行更多控制,您应该使用 HttpComponent
,您可以在其中设置各种类来为您提供自定义行为。
44.21.1. 为 HTTP 客户端设置 SSL
使用 JSSE 配置实用程序
HTTP 组件通过 Camel JSSE 配置实用程序 支持 SSL/TLS 配置实用程序。这个工具大大减少了您需要写入的组件特定代码数量,并在端点和组件级别进行配置。
以下示例演示了如何将 实用程序与 HTTP 组件一起使用。
组件的编程配置
KeyStoreParameters ksp = new KeyStoreParameters(); ksp.setResource("file:/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="file:/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 route builder 类中可以 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 验证 getchas
最终用户报告他在使用 HTTPS 进行身份验证时遇到了问题。这个问题最终通过提供自定义配置的 org.apache.http.protocol.HttpContext
来解决:
为 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 }
在 Spring 应用上下文文件中声明一个 HttpContext。
<bean id="myHttpContext" factory-bean="httpContextFactory" factory-method="getObject"/>
- 引用 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>
有关如何配置 SSL 的更多信息,请参阅 http-ssl 示例。
44.22. Spring Boot Auto-Configuration
组件支持 38 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 与实时连接的时间,时间单位为 millisecond,默认值为始终保持活动状态。 | 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 交换标头中。把它设置为 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 消息。选项是一个 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 执行要使用的 HttpClientConfigurer 的配置。选项是 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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 请求标头。如果 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 |
第 45 章 Infinispan
支持生成者和消费者
此组件允许您使用 Hot Rod procol 与 Infinispan 分布式数据网格/缓存交互。Infinispan 是一个非常可扩展、高度可用的键/值数据存储和 Java 编写的数据网格平台。
45.1. 依赖项
当在 Camel Spring Boot 中使用 infinispan
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-infinispan-starter</artifactId> </dependency>
45.2. URI 格式
infinispan://cacheName?[options]
生产者允许使用 HotRod 协议将消息发送到远程缓存。消费者允许使用 HotRod 协议从远程缓存侦听事件。
45.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
45.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
45.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
45.4. 组件选项
Infinispan 组件支持 26 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
configuration (common) | 组件配置. | InfinispanRemoteConfiguration | |
hosts (common) | 指定 Infinispan 实例上缓存的主机。 | 字符串 | |
queryBuilder (common) | 指定查询构建器。 | InfinispanQueryBuilder | |
secure (common) | 定义是否连接到安全 Infinispan 实例。 | false | 布尔值 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
customListener (consumer) | 如果提供,则返回正在使用的自定义监听程序。 | InfinispanRemoteCustomListener | |
eventTypes (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) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
oldValue (producer) | 为一些制作者操作设置特定的旧值。 | 对象 | |
operation (producer) | 要执行的操作。 Enum 值:
| PUT | InfinispanOperation |
value (producer) | 为制作者操作设置特定值。 | 对象 | |
密码 (安全) | 定义用于访问 infinispan 实例的密码。 | 字符串 | |
saslMechanism (security) | 定义用于访问 infinispan 实例的 SASL 机制。 | 字符串 | |
securityRealm ( security) | 定义用于访问 infinispan 实例的安全域。 | 字符串 | |
securityServerName ( security) | 定义用于访问 infinispan 实例的安全服务器名称。 | 字符串 | |
用户名 (安全) | 定义用于访问 infinispan 实例的用户名。 | 字符串 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
cacheContainer (advanced) | Autowired 指定要连接的缓存容器。 | RemoteCacheManager | |
cacheContainerConfiguration (advanced) | Autowired The CacheContainer 配置。如果没有定义 cacheContainer,则使用。 | 配置 | |
configurationProperties (advanced) | 为 CacheManager 实现特定属性。 | Map | |
configurationUri (advanced) | CacheManager 的实现特定 URI。 | 字符串 | |
标记 (advanced) | 在每个缓存调用中,默认应用以逗号分隔的 org.infinispan.client.hotrod.Flag 的列表。 | 字符串 | |
remappingFunction (advanced) | 设置要在计算操作中使用的特定 remappingFunction。 | BiFunction | |
resultHeader (advanced) | 将操作结果存储在标头中,而不是消息正文。默认情况下,resultHeader == null,查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值将用作标头的名称,以存储查询结果,并保留原始消息正文。这个值可以被名为:CamelInfinispanOperationResultHeader 的消息标头覆盖。 | 字符串 |
45.5. 端点选项
Infinispan 端点使用 URI 语法进行配置:
infinispan:cacheName
使用以下路径和查询参数:
45.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
cacheName (common) | 必需使用的缓存的名称。使用 current 使用当前配置的缓存管理器中的现有缓存名称。或者默认缓存管理器名称使用 default。 | 字符串 |
45.5.2. 查询参数(26 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
hosts (common) | 指定 Infinispan 实例上缓存的主机。 | 字符串 | |
queryBuilder (common) | 指定查询构建器。 | InfinispanQueryBuilder | |
secure (common) | 定义是否连接到安全 Infinispan 实例。 | false | 布尔值 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
customListener (consumer) | 如果提供,则返回正在使用的自定义监听程序。 | InfinispanRemoteCustomListener | |
eventTypes (consumer) | 指定要由消费者注册的事件类型集合。Multiple 事件可以用逗号分开。可能的事件类型是:CLIENT_CACHE_ENTRY_CREATED, CLIENT_CACHE_ENTRY_MODIFIED, CLIENT_CACHE_ENTRY_REMOVED, CLIENT_CACHE_ENTRY_EXPIRED, CLIENT_CACHE_FAILOVER。 | 字符串 | |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
DefaultValue (producer) | 为一些制作者操作设置特定的默认值。 | 对象 | |
key (producer) | 为制作者操作设置特定的密钥。 | 对象 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
oldValue (producer) | 为一些制作者操作设置特定的旧值。 | 对象 | |
operation (producer) | 要执行的操作。 Enum 值:
| PUT | InfinispanOperation |
value (producer) | 为制作者操作设置特定值。 | 对象 | |
密码 (安全) | 定义用于访问 infinispan 实例的密码。 | 字符串 | |
saslMechanism (security) | 定义用于访问 infinispan 实例的 SASL 机制。 | 字符串 | |
securityRealm ( security) | 定义用于访问 infinispan 实例的安全域。 | 字符串 | |
securityServerName ( security) | 定义用于访问 infinispan 实例的安全服务器名称。 | 字符串 | |
用户名 (安全) | 定义用于访问 infinispan 实例的用户名。 | 字符串 | |
cacheContainer (advanced) | Autowired 指定要连接的缓存容器。 | RemoteCacheManager | |
cacheContainerConfiguration (advanced) | Autowired The CacheContainer 配置。如果没有定义 cacheContainer,则使用。 | 配置 | |
configurationProperties (advanced) | 为 CacheManager 实现特定属性。 | Map | |
configurationUri (advanced) | CacheManager 的实现特定 URI。 | 字符串 | |
标记 (advanced) | 在每个缓存调用中,默认应用以逗号分隔的 org.infinispan.client.hotrod.Flag 的列表。 | 字符串 | |
remappingFunction (advanced) | 设置要在计算操作中使用的特定 remappingFunction。 | BiFunction | |
resultHeader (advanced) | 将操作结果存储在标头中,而不是消息正文。默认情况下,resultHeader == null,查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值将用作标头的名称,以存储查询结果,并保留原始消息正文。这个值可以被名为:CamelInfinispanOperationResultHeader 的消息标头覆盖。 | 字符串 |
45.6. Camel Operations
本节列出了所有可用的操作,及其标题信息。
操作名称 | 描述 |
---|---|
InfinispanOperation.PUT | 在缓存中放置键/值对,可以选择过期 |
InfinispanOperation.PUTASYNC | 异步将键/值对放在缓存中,可以选择过期 |
InfinispanOperation.PUTIFABSENT | 如果不存在,在缓存中放置键/值对(如果不存在),可以选择过期 |
InfinispanOperation.PUTIFABSENTASYNC | 如果不存在,异步将键/值对放在缓存中,可以选择过期 |
所需的标头 :
- CamelInfinispanKey
- CamelInfinispanValue
可选标头 :
- CamelInfinispanLifespanTime
- CamelInfinispanLifespanTimeUnit
- CamelInfinispanMaxIdleTime
- CamelInfinispanMaxIdleTimeUnit
结果标头 :
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.PUTALL | 在缓存中添加多个条目,可以选择过期 |
CamelInfinispanOperation.PUTALLASYNC | 异步向缓存添加多个条目,可以选择过期 |
所需的标头 :
- CamelInfinispanMap
可选标头 :
- CamelInfinispanLifespanTime
- CamelInfinispanLifespanTimeUnit
- CamelInfinispanMaxIdleTime
- CamelInfinispanMaxIdleTimeUnit
操作名称 | 描述 |
---|---|
InfinispanOperation.GET | 从缓存中检索与特定键关联的值 |
InfinispanOperation.GETORDEFAULT | 从缓存中检索与特定键关联的值或默认值 |
所需的标头 :
- CamelInfinispanKey
操作名称 | 描述 |
---|---|
InfinispanOperation.CONTAINSKEY | 决定缓存是否包含特定密钥 |
所需的标头
- CamelInfinispanKey
结果标头
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.CONTAINSVALUE | 决定缓存是否包含特定值 |
所需的标头 :
- CamelInfinispanKey
操作名称 | 描述 |
---|---|
InfinispanOperation.REMOVE | 从缓存中删除条目,只有在值与给定值匹配时才可以选择 |
InfinispanOperation.REMOVEASYNC | 异步从缓存中删除条目,可选择仅在值与给定值匹配时才从缓存中删除条目 |
所需的标头 :
- CamelInfinispanKey
可选标头 :
- CamelInfinispanValue
结果标头 :
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.REPLACE | 条件地替换缓存中的条目,可选使用过期 |
InfinispanOperation.REPLACEASYNC | 异步替换缓存中的条目,可选使用过期 |
所需的标头 :
- CamelInfinispanKey
- CamelInfinispanValue
- CamelInfinispanOldValue
可选标头 :
- CamelInfinispanLifespanTime
- CamelInfinispanLifespanTimeUnit
- CamelInfinispanMaxIdleTime
- CamelInfinispanMaxIdleTimeUnit
结果标头 :
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.CLEAR | 清除缓存 |
InfinispanOperation.CLEARASYNC | 异步清除缓存 |
操作名称 | 描述 |
---|---|
InfinispanOperation.SIZE | 返回缓存中的条目数 |
结果标头
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.STATS | 返回有关缓存的统计信息 |
结果标头 :
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.QUERY | 在缓存上执行查询 |
所需的标头 :
- CamelInfinispanQueryBuilder
结果标头 :
- CamelInfinispanOperationResult
默认情况下,放置(密钥、值)和 remove (key)等写方法不会返回前面的值。
45.7. 消息标头
Name | 默认值 | 类型 | Context | 描述 |
---|---|---|---|---|
CamelInfinispanCacheName |
| 字符串 | 共享 | 参与操作或事件的缓存。 |
CamelInfinispanOperation |
| InfinispanOperation | 制作者 | 要执行的操作。 |
CamelInfinispanMap |
| Map | 制作者 | CamelInfinispanOperationPutAll 操作时要使用的映射 |
CamelInfinispanKey |
| 对象 | 共享 | 对或生成事件的密钥执行操作的密钥。 |
CamelInfinispanValue |
| 对象 | 制作者 | 用于操作的值。 |
CamelInfinispanEventType |
| 字符串 | 消费者 | 接收的事件的类型。 |
CamelInfinispanLifespanTime |
| long | 制作者 | 缓存内值的 Lifespan 时间。负值解释为 infinity。 |
CamelInfinispanTimeUnit |
| 字符串 | 制作者 | 条目 Lifespan 时间的时间单位. |
CamelInfinispanMaxIdleTime |
| long | 制作者 | 在被视为过期前允许闲置条目的最大时间。 |
CamelInfinispanMaxIdleTimeUnit |
| 字符串 | 制作者 | 条目 Max Idle Time 的时间单位。 |
CamelInfinispanQueryBuilder | null | InfinispanQueryBuilder | 制作者 | 如果命令不存在为 InifinispanConfiguration,则 QueryBuilde 用于 QUERY 命令 |
CamelInfinispanOperationResultHeader | null | 字符串 | 制作者 | 将操作结果存储在标头中,而不是消息正文 |
45.8. 例子
将键/值放在命名缓存中:
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 - 设置生命周期的时间单位
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 描述符必须注册到远程数据网格服务器,请参阅官方 Infinispan 文档中的 Remote Query 示例。
自定义 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
中找到。
45.9. 使用基于 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 - 将存储库设置为路由
45.10. 使用基于 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 文档中的 数据编码和 MediaTypes。
45.11. Spring Boot Auto-Configuration
组件支持 23 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 | 指定要由消费者注册的事件类型集合。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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 | 设置要在计算操作中使用的特定 remappingFunction。选项是一个 java.util.function.BiFunction 类型。 | BiFunction | |
camel.component.infinispan.result-header | 将操作结果存储在标头中,而不是消息正文。默认情况下,resultHeader == null,查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值将用作标头的名称,以存储查询结果,并保留原始消息正文。这个值可以被名为:CamelInfinispanOperationResultHeader 的消息标头覆盖。 | 字符串 | |
camel.component.infinispan.sasl-mechanism | 定义用于访问 infinispan 实例的 SASL 机制。 | 字符串 | |
camel.component.infinispan.secure | 定义是否连接到安全 Infinispan 实例。 | false | 布尔值 |
camel.component.infinispan.security-realm | 定义用于访问 infinispan 实例的安全域。 | 字符串 | |
camel.component.infinispan.security-server-name | 定义用于访问 infinispan 实例的安全服务器名称。 | 字符串 | |
camel.component.infinispan.username | 定义用于访问 infinispan 实例的用户名。 | 字符串 |
第 46 章 Infinispan Embedded
从 Camel 2.13 开始
支持生成者和消费者
此组件允许您与 Infinispan 分布式数据网格/缓存交互。Infinispan 是一个非常可扩展、高度可用的键/值数据存储和 Java 编写的数据网格平台。
camel-infinispan-embedded
组件包括以下功能:
- 本地 Camel Consumer - Receives 缓存更改通知,并将其发送到处理。这可以同步或异步完成,并且也支持复制或分布式缓存。
-
本地 Camel Producer - 生成者创建消息并将其发送到端点。
camel-infinispan
producer 使用GET
、PUT
、REMOVE
和CLEAR
操作。本地制作者也支持复制或分布式缓存。
事件异步处理。
46.1. 依赖项
当在 Camel Spring Boot 中使用 infinispan-embedded
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-infinispan-embedded-starter</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
46.2. URI 格式
infinispan-embedded://cacheName?[options]
生产者允许发送消息到本地 infinispan 缓存。使用者允许从本地 infinispan 缓存侦听事件。
如果没有提供缓存配置,则直接在组件中创建嵌入的 cacheContainer。
46.3. 配置选项
Camel 组件在两个独立级别上配置。
- 组件级别
- 端点级别
46.3.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
46.3.2. 配置端点选项
端点有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点直接在端点 URI 中作为路径和查询参数完成。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式 的安全 方法。
使用 Property Placeholders 配置不允许硬编码 URL、端口号、敏感信息和其他设置的选项。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
46.4. 组件选项
Infinispan 嵌入式组件支持下面所列的 20 个选项。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
configuration (common) | 组件配置. | InfinispanEmbeddedConfiguration | |
queryBuilder (common) | 指定查询构建器。 | InfinispanQueryBuilder | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
clusteredListener (consumer) | 如果为 true,则会为整个集群安装监听程序。 | false | 布尔值 |
customListener (consumer) | 如果提供,则返回正在使用的自定义监听程序。 | InfinispanEmbeddedCustomListener | |
eventTypes (consumer) | 指定要由消费者注册的事件类型集合。Multiple 事件可以用逗号分开。可能的事件类型是:CACHE_ENTRY_ACTIVATED, CACHE_ENTRY_PASSIVATED, CACHE_ENTRY_VISITED, CACHE_ENTRY_LOADED, CACHE_ENTRY_EVICTED, CACHE_ENTRY_CREATED, cache_ENTRY_REMOVED, cache_ENTRY_MODIFIED, transACTION_COMPLETED, transACTION_REGISTERED, cache_ENTRY_INVALIDATED, cache_ENTRY_EXPIRED, data_REHASHED, topOLOGY_CHANGED, partition_STATUS_CHANGED, persistence_AVAILABILITY_CHANGED. | 字符串 | |
sync (consumer) | 如果为 true,消费者将同步接收通知。 | true | 布尔值 |
DefaultValue (producer) | 为一些制作者操作设置特定的默认值。 | 对象 | |
key (producer) | 为制作者操作设置特定的密钥。 | 对象 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过延迟启动,启动失败可以在路由消息期间通过 Camel 路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
oldValue (producer) | 为一些制作者操作设置特定的旧值。 | 对象 | |
operation (producer) | 要执行的操作。 Enum 值: * PUTASYNC * PUTALL * PUTALLASYNC * PUTIFABSENT * PUTIFABSENTASYNC * GET * GETORDEFAULT * CONTAINSKEY * REMOVE * REMOVEASYNC * REMOVE * REMOVEASYNC * REPLACE * REPLACEASYNC * SIZE * CLEAR * CLEARASYNC * QUERY * STATS * COMPUTE * COMPUTEASYNC | PUT | InfinispanOperation |
value*(producer) | 为制作者操作设置特定值。 | 对象 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动写入选项(选项必须标记为 auto-wired),方法是在 registry 中查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
cacheContainer (advanced) | Autowired 指定要连接的缓存容器。 | EmbeddedCacheManager | |
cacheContainerConfiguration (advanced) | Autowired The CacheContainer 配置。如果没有定义 cacheContainer,则使用。 | 配置 | |
configurationUri (advanced) | CacheManager 的实现特定 URI。 | 字符串 | |
标记 (advanced) | 以逗号分隔的 org.infinispan.context.Flag 列表,默认在每个缓存调用中应用。 | 字符串 | |
remappingFunction (advanced) | 设置要在计算操作中使用的特定 remappingFunction。 | BiFunction | |
resultHeader (advanced) | 将操作结果存储在标头中,而不是消息正文。默认情况下,resultHeader == null,查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值将用作标头的名称,以存储查询结果,并保留原始消息正文。这个值可以被名为:CamelInfinispanOperationResultHeader 的消息标头覆盖。 | 字符串 |
46.5. 端点选项
Infinispan Embedded 端点使用 URI 语法进行配置。
infinispan-embedded:cacheName
以下是 path 和 查询参数。
46.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
cacheName (common) | 必需使用的缓存的名称。使用 current 使用当前配置的缓存管理器中的现有缓存名称。或者默认缓存管理器名称使用 default。 | 字符串 |
46.5.2. 查询参数 (20 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
queryBuilder (common) | 指定查询构建器。 | InfinispanQueryBuilder | |
clusteredListener (consumer) | 如果为 true,则会为整个集群安装监听程序。 | false | 布尔值 |
customListener (consumer) | 如果提供,则返回正在使用的自定义监听程序。 | InfinispanEmbeddedCustomListener | |
eventTypes (consumer) | 指定要由消费者注册的事件类型集合。Multiple 事件可以用逗号分开。可能的事件类型是:CACHE_ENTRY_ACTIVATED, CACHE_ENTRY_PASSIVATED, CACHE_ENTRY_VISITED, CACHE_ENTRY_LOADED, CACHE_ENTRY_EVICTED, CACHE_ENTRY_CREATED, cache_ENTRY_REMOVED, cache_ENTRY_MODIFIED, transACTION_COMPLETED, transACTION_REGISTERED, cache_ENTRY_INVALIDATED, cache_ENTRY_EXPIRED, data_REHASHED, topOLOGY_CHANGED, partition_STATUS_CHANGED, persistence_AVAILABILITY_CHANGED. | 字符串 | |
sync (consumer) | 如果为 true,消费者将同步接收通知。 | true | 布尔值 |
bridgeErrorHandler (consumer (advanced)) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值: * InOnly * InOut * InOptionalOut | ExchangePattern | |
DefaultValue (producer) | 为一些制作者操作设置特定的默认值。 | 对象 | |
key (producer) | 为制作者操作设置特定的密钥。 | 对象 | |
oldValue (producer) | 为一些制作者操作设置特定的旧值。 | 对象 | |
operation (producer) | 要执行的操作。 Enum 值: * PUTASYNC * PUTALL * PUTALLASYNC * PUTIFABSENT * PUTIFABSENTASYNC * GET * GETORDEFAULT * CONTAINSKEY * REMOVE * REMOVEASYNC * REMOVE * REMOVEASYNC * REPLACE * REPLACEASYNC * SIZE * CLEAR * CLEARASYNC * QUERY * STATS * COMPUTE * COMPUTEASYNC | PUT | InfinispanOperation |
value (producer) | 为制作者操作设置特定值。 | 对象 | |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过延迟启动,启动失败可以在路由消息期间通过 Camel 路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
cacheContainer (advanced) | Autowired 指定要连接的缓存容器。 | EmbeddedCacheManager | |
cacheContainerConfiguration (advanced) | Autowired The CacheContainer 配置。如果没有定义 cacheContainer,则使用。 | 配置 | |
configurationUri (advanced) | CacheManager 的实现特定 URI。 | 字符串 | |
标记 (advanced) | 以逗号分隔的 org.infinispan.context.Flag 列表,默认在每个缓存调用中应用。 | 字符串 | |
remappingFunction (advanced) | 设置要在计算操作中使用的特定 remappingFunction。 | BiFunction | |
resultHeader (advanced) | 将操作结果存储在标头中,而不是消息正文。默认情况下,resultHeader == null,查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值将用作标头的名称,以存储查询结果,并保留原始消息正文。这个值可以被名为:CamelInfinispanOperationResultHeader 的消息标头覆盖。 | 字符串 |
46.6. 消息标头
Infinispan Embedded 组件支持下面列出的 22 个消息标头。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelInfinispanEventType (consumer)
常量 : | 接收的事件的类型。 | 字符串 | |
CamelInfinispanIsPre (consumer)
常数 : | 如果通知在事件发生之前,则为 true,如果事件发生后则为 false。 | 布尔值 | |
CamelInfinispanCacheName (common)
常量 : | 参与操作或事件的缓存。 | 字符串 | |
CamelInfinispanKey (common)
常数: | 对或生成事件的密钥执行操作的密钥。 | 对象 | |
CamelInfinispanValue (producer)
constant: | 用于操作的值。 | 对象 | |
CamelInfinispanDefaultValue (producer)
constant: | 用于 getOrDefault 的默认值。 | 对象 | |
CamelInfinispanOldValue (producer)
constant: | 用于替换的旧值。 | 对象 | |
CamelInfinispanMap (producer)
常量 : | CamelInfinispanOperationPutAll 操作时要使用的映射。 | Map | |
CamelInfinispanOperation (producer)
常数 : | 要执行的操作。 Enum 值: * PUTASYNC * PUTALL * PUTALLASYNC * PUTIFABSENT * PUTIFABSENTASYNC * GET * GETORDEFAULT * CONTAINSKEY * REMOVE * REMOVEASYNC * REMOVE * REMOVEASYNC * REPLACE * REPLACEASYNC * SIZE * CLEAR * CLEARASYNC * QUERY * STATS * COMPUTE * COMPUTEASYNC | InfinispanOperation | |
CamelInfinispanOperationResult (producer)
恒定: | 其值为结果的标头名称。 | 字符串 | |
CamelInfinispanOperationResultHeader (producer)
恒定: | 将操作结果存储在标头中,而不是消息正文。 | 字符串 | |
CamelInfinispanLifespanTime (producer)
常量 : | 缓存内值的 Lifespan 时间。负值解释为 infinity。 | long | |
CamelInfinispanTimeUnit (producer)
常量 : | 条目 Lifespan 时间的时间单位. Enum 值: * NANOSECONDS * MICROSECONDS * MILLISECONDS * SECONDS * SECONDS * MINUTES * HOURS * DAYS | TimeUnit | |
CamelInfinispanMaxIdleTime (producer)
常数 : | 在被视为过期前允许闲置条目的最大时间。 | long | |
CamelInfinispanMaxIdleTimeUnit (producer)
常数 : | 条目 Max Idle Time 的时间单位。 Enum 值: * NANOSECONDS * MICROSECONDS * MILLISECONDS * SECONDS * SECONDS * MINUTES * HOURS * DAYS | TimeUnit | |
CamelInfinispanIgnoreReturnValues (consumer) | 信号写入操作的返回值会被忽略,因此不需要从存储或远程节点读取现有值。 | false | 布尔值 |
CamelInfinispanEventData (consumer)
常量 : | 事件数据。 | 对象 | |
CamelInfinispanQueryBuilder (producer)
常数 : | 如果命令不存在为 InifinispanConfiguration,则 QueryBuilder 用于 QUERY 命令。 | InfinispanQueryBuilder | |
CamelInfinispanCommandRetried (consumer)
常数: | 如果因为拓扑更改,导致这个问题的 write 命令再次被重试,则会出现这种情况。 | 布尔值 | |
CamelInfinispanEntryCreated (consumer)
常数: | 指明缓存条目修改事件是否为正在创建缓存条目的结果。 | 布尔值 | |
CamelInfinispanOriginLocal (consumer)
常数: | 如果调用源自本地缓存实例,则为 true;如果源自于远程实例,则为 false。 | 布尔值 | |
CamelInfinispanCurrentState (consumer)
constant: | 如果此事件从现有条目生成为监听器具有 Listener,则为 true。 | 布尔值 |
46.7. Camel Operations
本节列出了所有可用的操作及其标题信息。
操作名称 | 描述 |
---|---|
InfinispanOperation.PUT | 在缓存中放置键/值对,可以选择过期 |
InfinispanOperation.PUTASYNC | 异步将键/值对放在缓存中,可以选择过期 |
InfinispanOperation.PUTIFABSENT | 如果不存在,在缓存中放置键/值对(如果不存在),可以选择过期 |
InfinispanOperation.PUTIFABSENTASYNC | 如果不存在,异步将键/值对放在缓存中,可以选择过期 |
所需的标头 :
- CamelInfinispanKey
- CamelInfinispanValue
可选标头 :
- CamelInfinispanLifespanTime
- CamelInfinispanLifespanTimeUnit
- CamelInfinispanMaxIdleTime
- CamelInfinispanMaxIdleTimeUnit
结果标头 :
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.PUTALL | 在缓存中添加多个条目,可以选择过期 |
CamelInfinispanOperation.PUTALLASYNC | 异步向缓存添加多个条目,可以选择过期 |
所需的标头 :
- CamelInfinispanMap
可选标头 :
- CamelInfinispanLifespanTime
- CamelInfinispanLifespanTimeUnit
- CamelInfinispanMaxIdleTime
- CamelInfinispanMaxIdleTimeUnit
操作名称 | 描述 |
---|---|
InfinispanOperation.GET | 从缓存中检索与特定键关联的值 |
InfinispanOperation.GETORDEFAULT | 从缓存中检索与特定键关联的值或默认值 |
所需的标头 :
- CamelInfinispanKey
操作名称 | 描述 |
---|---|
InfinispanOperation.CONTAINSKEY | 决定缓存是否包含特定密钥 |
所需的标头
- CamelInfinispanKey
结果标头
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.CONTAINSVALUE | 决定缓存是否包含特定值 |
所需的标头 :
- CamelInfinispanKey
操作名称 | 描述 |
---|---|
InfinispanOperation.REMOVE | 从缓存中删除条目,只有在值与给定值匹配时才可以选择 |
InfinispanOperation.REMOVEASYNC | 异步从缓存中删除条目,可选择仅在值与给定值匹配时才从缓存中删除条目 |
所需的标头 :
- CamelInfinispanKey
可选标头 :
- CamelInfinispanValue
结果标头 :
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.REPLACE | 条件地替换缓存中的条目,可选使用过期 |
InfinispanOperation.REPLACEASYNC | 异步替换缓存中的条目,可选使用过期 |
所需的标头 :
- CamelInfinispanKey
- CamelInfinispanValue
- CamelInfinispanOldValue
可选标头 :
- CamelInfinispanLifespanTime
- CamelInfinispanLifespanTimeUnit
- CamelInfinispanMaxIdleTime
- CamelInfinispanMaxIdleTimeUnit
结果标头 :
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.CLEAR | 清除缓存 |
InfinispanOperation.CLEARASYNC | 异步清除缓存 |
操作名称 | 描述 |
---|---|
InfinispanOperation.SIZE | 返回缓存中的条目数 |
结果标头
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.STATS | 返回有关缓存的统计信息 |
结果标头 :
- CamelInfinispanOperationResult
操作名称 | 描述 |
---|---|
InfinispanOperation.QUERY | 在缓存上执行查询 |
所需的标头 :
- CamelInfinispanQueryBuilder
结果标头 :
- CamelInfinispanOperationResult
默认情况下,放置(密钥、值)和 remove (key)等写方法不会返回前面的值。
46.8. 例子
将键/值放在命名缓存中:
from("direct:start") .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUT) (1) .setHeader(InfinispanConstants.KEY).constant("123") (2) .to("infinispan:myCacheName&cacheContainer=#cacheContainer"); (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");
- 设置条目的 Lifespan
- 设置 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") ;
自定义 Listeners
from("infinispan://?cacheContainer=#cacheManager&customListener=#myCustomListener") .to("mock:result");
-
myCustomListener
的实例必须存在,Camel 应能够从Registry
查找它。我们鼓励用户扩展org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedCustomListener
类,并给生成的类标上@Listener
,该类可在软件包org.infinispan.notifications
中找到。
-
46.9. 使用基于 Infinispan 的幂等存储库
Java 示例
InfinispanEmbeddedConfiguration conf = new InfinispanEmbeddedConfiguration(); (1) conf.setConfigurationUri("classpath:infinispan.xml") InfinispanEmbeddedIdempotentRepository repo = new InfinispanEmbeddedIdempotentRepository("idempotent"); (2) repo.setConfiguration(conf); context.addRoutes(new RouteBuilder() { @Override public void configure() { from("direct:start") .idempotentConsumer(header("MessageID"), repo) (3) .to("mock:result"); } });
- 配置缓存
- 配置存储库 bean
- 将存储库设置为路由
XML 示例
<bean id="infinispanRepo" class="org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository" destroy-method="stop"> <constructor-arg value="idempotent"/> (1) <property name="configuration"> (2) <bean class="org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedConfiguration"> <property name="configurationUrl" value="classpath:infinispan.xml"/> </bean> </property> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:start" /> <idempotentConsumer idempotentRepository="infinispanRepo"> (3) <header>MessageID</header> <to uri="mock:result" /> </idempotentConsumer> </route> </camelContext>
- 设置存储库将使用的缓存名称
- 配置存储库 bean
- 将存储库设置为路由
46.10. 使用基于 Infinispan 的聚合存储库
Java 示例
InfinispanEmbeddedConfiguration conf = new InfinispanEmbeddedConfiguration(); (1) conf.setConfigurationUri("classpath:infinispan.xml") InfinispanEmbeddedAggregationRepository repo = new InfinispanEmbeddedAggregationRepository("aggregation"); (2) repo.setConfiguration(conf); context.addRoutes(new RouteBuilder() { @Override public void configure() { from("direct:start") .aggregate(header("MessageID")) .completionSize(3) .aggregationRepository(repo) (3) .aggregationStrategy("myStrategy") .to("mock:result"); } });
- 配置缓存
- 创建存储库 bean
- 将存储库设置为路由
XML 示例
<bean id="infinispanRepo" class="org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository" destroy-method="stop"> <constructor-arg value="aggregation"/> (1) <property name="configuration"> (2) <bean class="org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedConfiguration"> <property name="configurationUrl" value="classpath:infinispan.xml"/> </bean> </property> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:start" /> <aggregate aggregationStrategy="myStrategy" completionSize="3" aggregationRepository="infinispanRepo"> (3) <correlationExpression> <header>MessageID</header> </correlationExpression> <to uri="mock:result"/> </aggregate> </route> </camelContext>
- 设置存储库将使用的缓存名称
- 配置存储库 bean
- 将存储库设置为路由
随着 Infinispan 11 的发布,需要在创建的任何缓存上设置编码配置。这对消耗的事件也至关重要。如需更多信息,请参阅官方 Infinispan 文档中的 数据编码和 MediaTypes。
46.11. Spring Boot Auto-Configuration
组件支持 17 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.infinispan-embedded.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.infinispan-embedded.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.infinispan-embedded.cache-container | 指定要连接的缓存容器。选项是 org.infinispan.manager.EmbeddedCacheManager 类型。 | EmbeddedCacheManager | |
camel.component.infinispan-embedded.cache-container-configuration | CacheContainer 配置。如果没有定义 cacheContainer,则使用。选项是一个 org.infinispan.configuration.cache.Configuration 类型。 | 配置 | |
camel.component.infinispan-embedded.clustered-listener | 如果为 true,则会为整个集群安装监听程序。 | false | 布尔值 |
camel.component.infinispan-embedded.configuration | 组件配置.选项是 org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedConfiguration 类型。 | InfinispanEmbeddedConfiguration | |
camel.component.infinispan-embedded.configuration-uri | CacheManager 的实现特定 URI。 | 字符串 | |
camel.component.infinispan-embedded.custom-listener | 如果提供,则返回正在使用的自定义监听程序。选项是 org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedCustomListener 类型。 | InfinispanEmbeddedCustomListener | |
camel.component.infinispan-embedded.enabled | 是否启用 infinispan-embedded 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.infinispan-embedded.event-types | 指定要由消费者注册的事件类型集合。Multiple 事件可以用逗号分开。可能的事件类型是:CACHE_ENTRY_ACTIVATED, CACHE_ENTRY_PASSIVATED, CACHE_ENTRY_VISITED, CACHE_ENTRY_LOADED, CACHE_ENTRY_EVICTED, CACHE_ENTRY_CREATED, cache_ENTRY_REMOVED, cache_ENTRY_MODIFIED, transACTION_COMPLETED, transACTION_REGISTERED, cache_ENTRY_INVALIDATED, cache_ENTRY_EXPIRED, data_REHASHED, topOLOGY_CHANGED, partition_STATUS_CHANGED, persistence_AVAILABILITY_CHANGED. | 字符串 | |
camel.component.infinispan-embedded.flags | 以逗号分隔的 org.infinispan.context.Flag 列表,默认在每个缓存调用中应用。 | 字符串 | |
camel.component.infinispan-embedded.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过延迟启动,启动失败可以在路由消息期间通过 Camel 路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.infinispan-embedded.operation | 要执行的操作。 | InfinispanOperation | |
camel.component.infinispan-embedded.query-builder | 指定查询构建器。选项是 org.apache.camel.component.infinispan.InfinispanQueryBuilder 类型。 | InfinispanQueryBuilder | |
camel.component.infinispan-embedded.remapping-function | 设置要在计算操作中使用的特定 remappingFunction。选项是一个 java.util.function.BiFunction 类型。 | BiFunction | |
camel.component.infinispan-embedded.result-header | 将操作结果存储在标头中,而不是消息正文。默认情况下,resultHeader == null,查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值将用作标头的名称,以存储查询结果,并保留原始消息正文。这个值可以被名为:CamelInfinispanOperationResultHeader 的消息标头覆盖。 | 字符串 | |
camel.component.infinispan-embedded.sync | 如果为 true,消费者将同步接收通知。 | true | 布尔值 |
第 47 章 JacksonXML
Jackson XML 是一个数据格式,它使用带有 XMLMapper 扩展的 Jackson 库,将一个 XML 有效负载 unmarshal 到一个 Java 对象,或将 Java 对象 marshal 到一个 XML 有效负载。注意:如果您熟悉 Jackson,此 XML 数据格式的行为与其 JSON 对应部分相同,因此可用于为 JSON 序列化/反序列化/序列化标注的类。
此扩展也模拟 JAXB 的"代码第一"方法。
此数据格式依赖于 Woodstox (特别是用于用户打印等功能),它是一个快速有效的 XML 处理器。
from("activemq:My.Queue"). unmarshal().jacksonxml(). to("mqseries:Another.Queue");
47.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 jacksonxml
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jacksonxml-starter</artifactId> </dependency>
47.2. Jacksonxml 选项
JacksonXML dataformat 支持 15 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
xmlMapper |
| 查找并使用给定 id 的现有 XmlMapper。 | |
prettyPrint | false |
| 要启用用户化的打印输出,请执行以下操作:默认为 false。 |
unmarshalType |
| 当 unmarshalling 时使用的 java 类型的类名称。 | |
jsonView |
| 当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来实现此目的。此选项是引用具有 JsonView 注释的类。 | |
Include |
| 如果您想 marshal a pojo to JSON,并且 pojo 具有一些带有 null 值的字段。如果您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | |
allowJmsType |
| 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定一个 FQN 类名称来用于 unmarshal。 | |
collectionType |
| 引用要使用的自定义集合类型,以便在 registry 中查找。这个选项应该很少被使用,但允许使用与基于 java.util.Collection 不同的集合类型。 | |
useList |
| To unmarshal 到 Map 列表或 Pojo 的列表。 | |
enableJaxbAnnotationModule |
| 在使用 jackson 时,是否启用 JAXB 注释模块。启用之后,Jackson 可以使用 JAXB 注释。 | |
moduleClassNames |
| 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为 String with FQN 类名称。可以使用逗号分隔多个类。 | |
moduleRefs |
| 使用 Camel registry 中引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | |
enableFeatures |
| 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature multiple features 分开的名称。 | |
disableFeatures |
| 在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用的功能集合。这个功能应该是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, 或 com.fasterxml.jackson.databind.MapperFeature multiple features 分开的名称。 | |
allowUnmarshallType |
| 如果启用,则允许 Jackson 在 unmarshalling 期间尝试使用 CamelJacksonUnmarshalType 标头。这只有在需要使用时才启用。 | |
contentTypeHeader |
| 数据格式是否应该使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式到 XML 的 application/xml 或用于数据格式的 application/json 发送到 JSON。 |
47.2.1. 在 Spring DSL 中使用 Jackson XML
在 Spring DSL 中使用 Data Format 时,您需要首先声明数据格式。这在 DataFormats XML 标签中完成。
<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>
47.2.2. 从 marshalling 中排除 POJO 字段
当 marshalling a POJO to XML 时,您可能想要从 XML 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图 来实现此目的。首先创建一个或多个标记类。
使用带 @JsonView
注释的标记类来包含/排除某些字段。该注释也适用于 getters。
最后,使用 Camel JacksonXMLDataFormat
将以上 POJO 放入 XML。
请注意,生成的 XML 中缺少 weight 字段:
<pojo age="30" weight="70"/>
47.3. 使用带有 '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>
47.4. 设置序列化包括选项
如果您想 marshal a pojo to XML,并且 pojo 具有一些带有 null 值的字段。您想要跳过这些 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>
47.5. 使用动态类名称从 XML 到 POJO 的 unmarshaling
如果您使用 jackson to unmarshal XML to POJO,那么您现在可以在消息中指定标头,以指示哪个类名称到 unmarshal。
如果消息中存在该标头,则标头的键为 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>
47.6. 从 XML 到 List<Map> 或 List<pojo>
如果您使用 Jackson unmarshal XML 到映射/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>
47.7. 使用自定义 Jackson 模块
您可以使用 moduleClassNames 选项指定类名称来使用自定义 Jackson 模块,如下所示。
<dataFormats> <jacksonxml id="jack" useList="true" unmarshalType="com.foo.MyPojo" moduleClassNames="com.foo.MyModule,com.foo.MyOtherModule"/> </dataFormats>
在使用 moduleClassNames 时,不会配置自定义 jackson 模块,由使用默认构造器创建并按原样使用。如果自定义模块需要任何自定义配置,则可以创建和配置模块实例,然后使用 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"
47.8. 使用 Jackson 启用或禁用功能
Jacks 具有多个功能,您可以启用或禁用其 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);
47.9. 使用 Jackson 将映射转换为 POJO
jackson ObjectMapper
可用于将映射转换为 POJO 对象。Jackson 组件附带数据转换器,可用于将 java.util.Map
实例转换为非字符串、非原语和非数字对象。
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
实例,它将供转换器用于执行转换。否则将使用默认映射程序。
47.10. 格式化的 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
等其他设置。
47.11. Spring Boot Auto-Configuration
组件支持 16 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.dataformat.jacksonxml.allow-jms-type | 用于 JMS 用户,以允许 JMS spec 中的 JMSType 标头指定一个 FQN 类名称来用于 unmarshal。 | 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 标头。例如,用于数据格式到 XML 的 application/xml 或用于数据格式的 application/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 multiple features 分开的名称。 | 字符串 | |
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 multiple features 分开的名称。 | 字符串 | |
camel.dataformat.jacksonxml.enable-jaxb-annotation-module | 在使用 jackson 时,是否启用 JAXB 注释模块。启用之后,Jackson 可以使用 JAXB 注释。 | false | 布尔值 |
camel.dataformat.jacksonxml.enabled | 是否启用 jacksonxml 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
camel.dataformat.jacksonxml.include | 如果您想 marshal a pojo to JSON,并且 pojo 具有一些带有 null 值的字段。如果您想要跳过这些 null 值,您可以将这个选项设置为 NON_NULL。 | 字符串 | |
camel.dataformat.jacksonxml.json-view | 当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来实现此目的。此选项是引用具有 JsonView 注释的类。 | 字符串 | |
camel.dataformat.jacksonxml.module-class-names | 使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为 String with FQN 类名称。可以使用逗号分隔多个类。 | 字符串 | |
camel.dataformat.jacksonxml.module-refs | 使用 Camel registry 中引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。 | 字符串 | |
camel.dataformat.jacksonxml.pretty-print | 要启用用户化的打印输出,请执行以下操作:默认为 false。 | false | 布尔值 |
camel.dataformat.jacksonxml.unmarshal-type | 当 unmarshalling 时使用的 java 类型的类名称。 | 字符串 | |
camel.dataformat.jacksonxml.use-list | To unmarshal 到 Map 列表或 Pojo 的列表。 | false | 布尔值 |
camel.dataformat.jacksonxml.xml-mapper | 查找并使用给定 id 的现有 XmlMapper。 | 字符串 |
第 48 章 JAXB
Since Camel 1.0
JAXB 是一个数据格式,它使用 JAXB XML marshalling 标准将 XML 有效负载合并到 Java 对象,或将 Java 对象放入 XML 有效负载中。
48.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 jaxb
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jaxb-starter</artifactId> </dependency>
48.2. 选项
JAXB dataformat 支持 20 个选项,如下所列。
Name | 默认值 | Java 类型 | 描述 |
---|---|---|---|
contextPath |
| JAXB 类所在的 必需 软件包名称。 | |
contextPathIsClassName |
|
| 这可设置为 true 来标记 contextPath 引用一个 classname 而不是软件包名称。 |
schema |
| 针对现有架构进行验证。您可以使用前缀 classpath:、file: 或 http: 指定应如何解析资源。您可以使用 ',' 字符分隔多个架构文件。 | |
schemaSeverityLevel |
|
| 设置在针对 schema 验证时要使用的模式严重性级别。此级别决定了触发 JAXB 停止继续解析的最低严重性错误。默认值 0 (警告)表示任何错误(警告、错误或严重错误)将触发 JAXB 来停止。有三个级别: 0=warning, 1=error, 2=fatal 错误。 Enum 值:
|
prettyPrint |
|
| 要启用用户化的打印输出,请执行以下操作:默认为 false。 |
objectFactory |
|
| 是否允许使用 ObjectFactory 类在 marshalling 期间创建 POJO 类。这只适用于没有通过 JAXB 注解的 POJO 类,并提供 jaxb.index 描述符文件。 |
ignoreJAXBElement |
|
| 是否忽略 JAXBElement 元素 - 只在非常特殊用例中,只需要设置为 false。 |
mustBeJAXBElement |
|
| marhsalling 必须是带有 JAXB 注释的 java 对象。如果不是,则失败。这个选项可以被设置为 false 来放宽,比如当数据已采用 XML 格式时。 |
filterNonXmlChars |
|
| 忽略非 xml characheters,并将其替换为空空间。 |
编码 |
| overrule 并使用特定的编码。 | |
片段 |
|
| 打开 marshalling XML 片段树。默认情况下,JAXB 在给定类上查找 XmlRootElement 注释,以便在整个 XML 树上运行。这很有用,但有时生成的代码没有 XmlRootElement 注解,有时您需要 unmarshall 只是树的一部分。在这种情况下,您可以使用 partial unmarshalling。要启用此功能,您需要设置属性 partClass。Camel 会将此类传递给 JAXB 的 unmarshaler。 |
partClass |
| 用于碎片解析的类名称。请参阅 fragment 选项的更多详情。 | |
partNamespace |
| 用于碎片解析的 XML 命名空间。请参阅 fragment 选项的更多详情。 | |
namespacePrefixRef |
| 使用 JAXB 或 SOAP 总结时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。要控制此映射,Camel 允许您引用包含所需映射的映射。 | |
xmlStreamWriterWrapper |
| 使用自定义 xml 流写器。 | |
schemaLocation |
| 定义架构的位置。 | |
noNamespaceSchemaLocation |
| 定义无命名空间模式的位置。 | |
jaxbProviderProperties |
| 指的是要在含有要与 JAXB marshaller 搭配使用的自定义 JAXB 提供程序属性的注册表中查找的自定义 java.util.Map。 | |
contentTypeHeader |
|
| 数据格式是否应该使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式到 XML 的 application/xml 或用于数据格式的 application/json 发送到 JSON。 |
accessExternalSchemaProtocols |
|
| 仅在启用了 schema 验证时使用。限制对由 schemaLocation 属性 Import 和 Include 元素设置的用于外部引用指定的协议的访问。协议的示例包括 file、http、jar:file. false 或 none 用于拒绝对外部引用的所有访问;特定的协议(如 file)来仅授予该协议的权限;关键字 all 为所有协议授予权限。 |
48.3. 使用 Java DSL
以下示例使用 jaxb
的命名 DataFormat,它配置有 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");
48.4. 使用 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>
48.5. 多上下文路径
将此数据格式与多个上下文路径一起使用。您可以使用 :
指定多个上下文路径,如 com.mycompany:com.mycompany2
。
48.6. 部分总结 / unmarshalling
JAXB 2 支持 marshalling 和 unmarshalling XML 树片段。默认情况下,JAXB 在给定类上查找 @XmlRootElement
注释,以在整个 XML 树上运行。有时生成的代码没有 @XmlRootElement
注释,有时您需要 unmarshall 只是树的一部分。
在这种情况下,您可以使用 partial unmarshalling。若要启用此功能,您需要在 JaxbDataFormat
上设置属性 partClass
。Camel 会将此类传递给 JAXB unmarshaller。如果将 JaxbConstants.JAXB_PART_CLASS
设置为交换标头之一,则其值用于覆盖 JaxbDataFormat
上的 partClass
属性。
对于 marshalling,您必须使用目标命名空间的 QName
添加 partNamespace
属性。
如果将 JaxbConstants.JAXB_PART_NAMESPACE
设置为一个交换标头,则其值用于覆盖 JaxbDataFormat
上的 partNamespace
属性。
在通过 JaxbConstants.JAXB_PART_NAMESPACE
设置 partNamespace
时,请注意您需要以 {namespaceUri}localPart
格式指定其值,如下例所示。
.setHeader(JaxbConstants.JAXB_PART_NAMESPACE, constant("{http://www.camel.apache.org/jaxb/example/address/1}address"));
48.7. 片段
JaxbDataFormat
具有名为 fragment
的属性,它可以设置 JAXB Marshaller 上的 Marshaller.JAXB_FRAGMENT
属性。如果您不希望 JAXB Marshaller 生成 XML 声明,您可以将此选项设置为 true
。此属性的默认值为 false
。
48.8. 忽略 Non-XML Characters
JaxbDataFormat
支持忽略 Non-XML Characters。将 filterNonXmlChars
属性设置为 true
。JaxbDataFormat
将把任何非 XML 字符替换为空格字符("
),在消息 marshalling 或 unmarshalling 期间使用空格字符替换。您还可以设置 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
现在允许您自定义用于 marshal 流到 XML 的 XMLStreamWriter
。使用这个配置,您可以添加自己的流写器来完全删除、转义或替换非 XML 字符。
JaxbDataFormat customWriterFormat = new JaxbDataFormat("org.apache.camel.foo.bar"); customWriterFormat.setXmlStreamWriterWrapper(new TestXmlStreamWriter());
以下示例显示了使用 Spring DSL,同时启用 Camel 的非 XML 过滤:
<bean id="testXmlStreamWriterWrapper" class="org.apache.camel.jaxb.TestXmlStreamWriter"/> <jaxb filterNonXmlChars="true" contextPath="org.apache.camel.foo.bar" xmlStreamWriterWrapper="#testXmlStreamWriterWrapper" />
48.9. 使用 ObjectFactory
如果您使用 XJC 从架构创建 java 类,您将收到 JAXB 上下文的 ObjectFactory
。由于 ObjectFactory
使用 JAXBElement 来保存 schema 和 element 实例值的引用,JaxbDataformat
将默认忽略 JAXBElement
,并且您将从 unmarshaled 消息正文获取 element 实例值,而不是 JAXBElement
对象。
如果要获取 JAXBElement
对象组成 unmarshaled 消息正文,您需要将 JaxbDataFormat
ignoreJAXBElement
属性设置为 false
。
48.10. 设置编码
您可以在 JaxbDataFormat
上设置 encoding
选项,以配置 JAXB Marshaller 上的 Marshaller.JAXB_ENCODING
编码属性。
您可以设置在声明 JaxbDataFormat
时要使用的编码。您还可以在 Exchange 属性 Exchange.CHARSET_NAME
中提供编码。此属性将覆盖 JaxbDataFormat
上设置的编码。
48.11. 控制命名空间前缀映射
使用 JAXB 或 SOAP 进行 marshalling 时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。要控制此映射,Camel 允许您引用包含所需映射的映射。
例如,在 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 don't want any prefix for our namespace --> <entry key="http://www.mycompany.com/foo/2" value=""/> </util:map>
要在 JAXB 或 SOAP 数据格式中使用它,您可以使用 namespacePrefixRef
属性引用此映射,如下所示。然后,Camel 将在 Registry 中查找 ID 为 my
.Map,这是我们所定义的内容。
Map
的 java.util
<marshal> <soap version="1.2" contextPath="com.mycompany.foo" namespacePrefixRef="myMap"/> </marshal>
48.12. 模式验证
JaxbDataFormat
支持通过 marshalling 和 unmarshalling 从 / 到 XML 进行验证。您可以使用前缀 classpath:
、file:
或 http:
指定应如何解析资源。您可以使用 、
字符分隔多个架构文件。
如果 XSD 模式文件导入/访问其他文件,则需要启用文件协议(或其他人允许访问)。
使用 Java DSL,您可以使用以下方法进行配置:
JaxbDataFormat jaxbDataFormat = new JaxbDataFormat(); jaxbDataFormat.setContextPath(Person.class.getPackage().getName()); jaxbDataFormat.setSchema("classpath:person.xsd,classpath:address.xsd"); jaxbDataFormat.setAccessExternalSchemaProtocols("file");
您可以使用 XML DSL 执行相同的操作:
<marshal> <jaxb id="jaxb" schema="classpath:person.xsd,classpath:address.xsd" accessExternalSchemaProtocols="file"/> </marshal>
48.13. 模式位置
JaxbDataFormat
支持在编译 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>
48.14. 已 XML 的 marshal 数据
JAXB marshaller 要求消息正文兼容 JAXB,例如它是 JAXBElement
,是具有 JAXB 注释的 java 实例,或者扩展 JAXBElement
。在某些情况下,消息正文已经在 XML 中,例如来自 String
类型。
JaxbDataFormat
具有一个名为 mustBeJAXBElement
的选项,您可以将其设置为 false
以放宽此检查,并且只有 JAXB marshaller 尝试在 JAXBElement
上尝试 marshalling (javax.xml.bind.JAX businessntrospector#isElement
返回 true
)。在这些情况下,marshaller 将回退到 marshal 消息正文(按原样)。
48.15. Spring Boot Auto-Configuration
组件支持 21 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.dataformat.jaxb.access-external-schema-protocols | 仅在启用了 schema 验证时使用。限制对由 schemaLocation 属性 Import 和 Include 元素设置的用于外部引用指定的协议的访问。协议的示例包括 file、http、jar:file. false 或 none 用于拒绝对外部引用的所有访问;特定的协议(如 file)来仅授予该协议的权限;关键字 all 为所有协议授予权限。 | false | 字符串 |
camel.dataformat.jaxb.content-type-header | 数据格式是否应该使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式到 XML 的 application/xml 或用于数据格式的 application/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 characheters,并将其替换为空空间。 | false | 布尔值 |
camel.dataformat.jaxb.fragment | 打开 marshalling XML 片段树。默认情况下,JAXB 在给定类上查找 XmlRootElement 注释,以便在整个 XML 树上运行。这很有用,但有时生成的代码没有 XmlRootElement 注解,有时您需要 unmarshall 只是树的一部分。在这种情况下,您可以使用 partial 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 marshaller 搭配使用的自定义 JAXB 提供程序属性的注册表中查找的自定义 java.util.Map。 | 字符串 | |
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 | 用于碎片解析的类名称。请参阅 fragment 选项的更多详情。 | 字符串 | |
camel.dataformat.jaxb.part-namespace | 用于碎片解析的 XML 命名空间。请参阅 fragment 选项的更多详情。 | 字符串 | |
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 (警告)表示任何错误(警告、错误或严重错误)将触发 JAXB 来停止。有三个级别: 0=warning, 1=error, 2=fatal 错误。 | 0 | 整数 |
camel.dataformat.jaxb.xml-stream-writer-wrapper | 使用自定义 xml 流写器。 | 字符串 |
第 49 章 Jasypt
从 Camel 2.5 开始
Jasypt 是一个简化的加密库,可以轻松地加密和解密。Camel 与 Jasypt 集成,以允许 加密 属性文件中的敏感信息。在类路径上丢弃 camel-jasypt
,这些加密值将自动被 Camel 解密。这样可确保人类眼于不容易发现敏感信息,如用户名和密码。
49.1. 依赖项
当在 Camel Spring Boot 中使用 camel-jasypt
时,请将以下 Maven 依赖项添加到 pom.xml
中,以支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jasypt-starter</artifactId> </dependency>
49.2. 工具
Jasypt 组件是一个可运行的 JAR,它提供了一个命令行工具来加密或解密值。使用文档可以输出到控制台,以描述它提供的语法和选项:
Apache Camel Jasypt takes the following options -h or -help = Displays the help screen -c or -command <command> = Command either encrypt or decrypt -p or -password <password> = Password to use -i or -input <input> = Text to encrypt or decrypt -a or -algorithm <algorithm> = Optional algorithm to use -rsga or -algorithm <algorithm> = Optional random salt generator algorithm to use -riga or -algorithm <algorithm> = Optional random iv generator algorithm to use
运行该工具的简单方法是使用 JBang。例如,要加密值 tiger
,您可以使用以下参数:确保指定要使用的 camel-jasypt
版本。
$ jbang org.apache.camel:camel-jasypt:<camel version here> -c encrypt -p secret -i tiger
哪些输出结果
Encrypted text: qaEEacuW7BUti8LcMgyjKw==
这意味着,如果您知道 secret
的 master 密码,加密表示 qaEEacuW7BU
可以被解密。
ti
8LcMgyjKw==
如果您再次运行该工具,则加密的值将返回不同的结果。但是,解密该值将始终返回正确的原始值。
您可以使用以下参数运行工具来测试解密值:
$ jbang org.apache.camel:camel-jasypt:<camel version here> -c decrypt -p secret -i qaEEacuW7BUti8LcMgyjKw==
哪些输出结果如下:
Decrypted text: tiger
然后,在 Properties 文件中使用这些加密值。例如,
# Encrypted value for 'tiger' my.secret = ENC(qaEEacuW7BUti8LcMgyjKw==)
49.3. 保护 master 密码
必须提供 Jasypt 使用的 master 密码,以便可以解密值。但是,在打开时使用此 master 密码可能不是理想的解决方案。因此,您可以将其作为 JVM 系统属性或 OS 环境设置提供。如果您决定这样做,则 password
选项支持指定此前缀的前缀。
-
sysenv:
使用给定密钥查找操作系统环境。 -
sys:
查找 JVM 系统属性。
例如,您可以在启动应用程序前提供密码
$ export CAMEL_ENCRYPTION_PASSWORD=secret
然后启动应用,如运行启动脚本。
当应用程序启动并运行时,您可以取消设置环境
$ unset CAMEL_ENCRYPTION_PASSWORD
在 Spring Boot 和 Quarkus 等运行时,您可以在 application.properties
文件中配置 password 属性,如下所示:
password=sysenv:CAMEL_ENCRYPTION_PASSWORD
或者,如果手动配置 JasyptPropertiesParser
,您可以设置如下密码。
jasyptPropertiesParser.setPassword("sysenv:CAMEL_ENCRYPTION_PASSWORD");
49.4. 使用 Java DSL 的示例
在 Spring Boot 和 Quarkus 运行时中,Camel Jasypt 可通过配置属性进行配置。如需更多信息,请参阅对应的文档页面。
在 Java DSL 中,您需要将 Jasyptpt 配置为 JasyptPropertiesParser
实例,并在 Properties 组件中设置属性,如下所示:
// create the jasypt properties parser JasyptPropertiesParser jasypt = new JasyptPropertiesParser(); // set the master password (see above for how to do this in a secure way) jasypt.setPassword("secret"); // create the properties' component PropertiesComponent pc = new PropertiesComponent(); pc.setLocation("classpath:org/apache/camel/component/jasypt/secret.properties"); // and use the jasypt properties parser, so we can decrypt values pc.setPropertiesParser(jasypt); // end enable nested placeholder support pc.setNestedPlaceholder(true); // add properties component to camel context context.setPropertiesComponent(pc);
可以在 JasyptPropertiesParser 上配置自定义算法,如下所示:
JasyptPropertiesParser jasyptPropertiesParser = new JasyptPropertiesParser(); jasyptPropertiesParser.setAlgorithm("PBEWithHmacSHA256AndAES_256"); jasyptPropertiesParser.setRandomSaltGeneratorAlgorithm("PKCS11"); jasyptPropertiesParser.setRandomIvGeneratorAlgorithm("PKCS11");
属性文件 secret.properties
将包含加密的配置值,如下所示。请注意密码值如何加密,并周围为 ENC (这里的值)。
my.secret.password=ENC(bsW9uV37gQ0QHFu7KO03Ww==)
49.5. Spring XML 示例
在 Spring XML 中,您需要配置 JasyptPropertiesParser
,它如下所示。然后,Camel Properties 组件被告知使用 jasypt
作为属性解析程序,这意味着 Jasypt 具有解密值的机会。
<!-- define the jasypt properties parser with the given password to be used --> <bean id="jasypt" class="org.apache.camel.component.jasypt.JasyptPropertiesParser"> <property name="password" value="secret"/> </bean> <!-- define the camel properties component --> <bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent"> <!-- the properties file is in the classpath --> <property name="location" value="classpath:org/apache/camel/component/jasypt/secret.properties"/> <!-- and let it leverage the jasypt parser --> <property name="propertiesParser" ref="jasypt"/> <!-- end enable nested placeholder --> <property name="nestedPlaceholder" value="true"/> </bean>
Properties 组件也可以内联在 < camelContext>
; 标签内,如下所示。请注意,我们如何使用 propertiesParserRef
属性来引用 Jasypt。
<!-- define the jasypt properties parser with the given password to be used --> <bean id="jasypt" class="org.apache.camel.component.jasypt.JasyptPropertiesParser"> <!-- password is mandatory, you can prefix it with sysenv: or sys: to indicate it should use an OS environment or JVM system property value, so you dont have the master password defined here --> <property name="password" value="secret"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <!-- define the camel properties placeholder, and let it leverage jasypt --> <propertyPlaceholder id="properties" location="classpath:org/apache/camel/component/jasypt/myproperties.properties" nestedPlaceholder="true" propertiesParserRef="jasypt"/> <route> <from uri="direct:start"/> <to uri="{{cool.result}}"/> </route> </camelContext>
49.6. Spring Boot Auto-Configuration
组件支持 8 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.jasypt.algorithm | 用于解密的算法。 | PBEWithMD5AndDES | 字符串 |
camel.component.jasypt.enabled | 启用组件。 | false | 布尔值 |
camel.component.jasypt.iv-generator-class-name | 在解密操作中应用的初始化向量(IV)生成器。默认: org.jasypt.iv。 | 字符串 | |
camel.component.jasypt.password | Jasypt 用于解密值的主密码。此选项支持影响 master 密码查找的前缀:sysenv: 是指使用给定键查找 OS 系统环境。sys: 表示查找 JVM 系统属性。 | 字符串 | |
camel.component.jasypt.provider-name | 用于获取加密算法的安全提供程序的类名称。 | 字符串 | |
camel.component.jasypt.random-iv-generator-algorithm | 随机 iv 生成器的算法。 | SHA1PRNG | 字符串 |
camel.component.jasypt.random-salt-generator-algorithm | salt 生成器的算法。 | SHA1PRNG | 字符串 |
camel.component.jasypt.salt-generator-class-name | 在解密操作中应用的 salt 生成器。默认: org.jasypt.salt.RandomSaltGenerator。 | org.jasypt.salt.RandomSaltGenerator | 字符串 |
4.0// ParentAssemblies: assemblies/
第 50 章 JDBC
自 Camel 1.2 开始
仅支持生成者
JDBC 组件允许您通过 JDBC 访问数据库,其中 SQL 查询(SELECT)和操作(INSERT、UPDATE 等)在消息正文中发送。此组件使用标准 JDBC API。
先决条件
这个组件不支持开箱即用的事务。对于事务,我们建议使用 Spring JDBC 组件。
50.1. 依赖项
当在 Camel Spring Boot 中使用 jdbc
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jdbc-starter</artifactId> </dependency>
50.2. URI 格式
jdbc:dataSourceName[?options]
50.3. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
50.3.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 URL。
组件具有常用的默认值。因此,您只需要在组件上配置几个选项或根本不配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
50.3.2. 配置端点选项
端点有许多选项,允许您配置您需要的端点。这些选项也被归类为:端点是否用作消费者(来自)还是作为生成者(to)用于两者。
配置端点直接在端点 URI 中作为路径和查询参数完成。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式 的安全 方法。
当配置选项使用 Property Placeholders 时,它允许硬编码 URL、端口号、敏感信息和其他设置。占位符允许从您的代码外部配置,并提供更大的灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
50.4. 组件选项
JDBC 组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
datasource (producer) | 使用 DataSource 实例,而不是根据 registry 中的名称查找数据源。 | DataSource | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (adcanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
connectionStrategy (advanced) | 使用自定义策略来使用连接。在使用 spring-jdbc 组件时不要使用自定义策略,因为默认使用特殊的 Spring ConnectionStrategy 支持 Spring Transactions。 | ConnectionStrategy |
50.5. 端点选项
JDBC 端点使用 URI 语法进行配置:
jdbc:dataSourceName
使用以下 path 和 查询参数:
50.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
dataSourceName (producer) | 在 Registry 中查找所需的数据源名称。如果名称是 dataSource 或 default,则 Camel 将尝试从 registry 中查找默认 DataSource,这意味着如果只有一个找到的 DataSource 实例,则会使用此 DataSource。 | 字符串 |
50.5.2. 查询参数 (14 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
allowNamedParameters (producer) | 是否在查询中使用命名参数。 | True | 布尔值 |
outputClass (producer) | 指定在 outputType=SelectOne 或 SelectList 时用作转换的完整软件包和类名称。 | 字符串 | |
outputType (producer) | 确定制作者应使用的输出。Enum 值:
| SelectList | JdbcOutputType |
parameters (producer) | java.sql.Statement 的可选参数。例如,要设置 maxRows、fetchSize 等。 | Map | |
readSize (producer) | 轮询查询可以读取的默认最大行数。默认值为 0。 | int | |
resetAutoCommit (producer) | Camel 将 JDBC 连接上的 autoCommit 设置为 false,在执行声明后提交更改,并在末尾重置连接的 autoCommit 标志(如果 resetAutoCommit 为 true)。如果 JDBC 连接不支持重置 autoCommit 标志,您可以将 resetAutoCommit 标志设置为 false,并且 Camel 不会尝试重置 autoCommit 标志。与 XA 事务一起使用时,您很可能需要将其设置为 false,以便事务管理器负责提交此 tx。 | True | 布尔值 |
transacted (producer) | 是否使用事务。 | False | 布尔值 |
useGetBytesForBlob (producer) | 以字节而不是字符串数据形式读取 BLOB 列。对于某些数据库(如 Oracle )可能需要这个数据库,其中必须以字节形式读取 BLOB 列。 | False | 布尔值 |
useHeadersAsParameters (producer) | 将这个选项设置为 true 来使用带有命名参数的 prepareStatementStrategy。这允许使用指定占位符定义查询,并将标头与查询占位符的动态值一起使用。 | False | 布尔值 |
useJDBC4ColumnNameAndLabelSemantics (producer) | 设置在检索列名称时是否使用 JDBC 4 或 JDBC 3.0 的旧语义。JDBC 4.0 使用 columnLabel 获取列名称,其中 JDBC 3.0 使用 columnName 或 columnLabel。不幸的是,JDBC 驱动程序的行为不同,如果您使用此组件解决了这个问题,则可以使用此选项来排除 JDBC 驱动程序的问题。 | True | 布尔值 |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | False | 布尔值 |
beanRowMapper (advanced) | 使用 outputClass 时使用自定义 org.apache.camel.component.jdbc.BeanRowMapper。默认实现会小写,行名称和跳过下划线和横线。例如 CUST_ID 被映射为 custId。 | BeanRowMapper | |
connectionStrategy (advanced) | 使用自定义策略来使用连接。在使用 spring-jdbc 组件时不要使用自定义策略,因为默认使用特殊的 Spring ConnectionStrategy 支持 Spring Transactions。 | ConnectionStrategy | |
prepareStatementStrategy (advanced) | 允许插件使用自定义 org.apache.camel.component.jdbc.JdbcPrepareStatementStrategy 来控制查询和准备语句的准备。 | JdbcPrepareStatementStrategy |
50.6. 消息标头
JBBC 组件支持 8 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelJdbcUpdateCount (producer) | 如果查询是 UPDATE,则查询此 OUT 标头中返回更新计数。 | int | |
CamelJdbcRowCount (producer) 常数: JDBC_ROW_COUNT | 如果查询是 SELECT,则查询此 OUT 标头中返回的行数。 | int | |
CamelJdbcColumnNames (producer) | ResultSet 中的列名称作为 java.util.Set 类型。 | Set | |
CamelJdbcParameters (producer) 常数: JDBC_PARAMETERS |
如果启用了 useHeadersAsParameters,具有要使用的标头的 | Map | |
CamelRetrieveGeneratedKeys (producer) | 将其值设为 true 以检索生成的密钥。 | False | 布尔值 |
CamelGeneratedColumns (producer) | 把它设置为指定预期的生成的列。 | string[] 或 int[] | |
CamelGeneratedKeysRowCount (producer) | 包含生成的键的标头中的行数。 | int | |
CamelGeneratedKeysRows (producer) | 包含生成的密钥的行。 | list |
50.7. 结果
默认情况下,OUT 正文中作为 ArrayList<HashMap<String, Object&
gt;> 返回的结果。List 对象包含行列表,而 Map
对象包含每行的 String
键作为列名称。您可以使用选项 outputType
来控制结果。
此组件获取 ResultSetMetaData
,以便能够将列名称返回为 Map
中的键。
50.8. 生成的密钥
如果您使用 SQL INSERT 插入数据,则 RDBMS 可能会支持自动生成的密钥。您可以指示 JDBC producer 在标头中返回生成的密钥。为此,可设置标头 CamelRetrieveGeneratedKeys=true
。然后,生成的密钥将以标头形式提供,其中包含上表中列出的键。
使用生成的密钥不能与命名参数一起使用。
50.9. 使用命名参数
在以下给定路由中,我们希望从 projects 表中获取所有项目。请注意,SQL 查询具有 2 个命名的参数 :?lic 和 :?min. Camel,然后从消息标头中查找这些参数。请注意,在上面的示例中,我们为命名参数设置两个带有恒定值的标头:
from("direct:projects") .setHeader(":?lic", constant("ASF")) .setHeader(":?min", constant(123)) .setBody(simple("select * from projects where license = :?lic and id > :?min order by id")) .to("jdbc:myDataSource?useHeadersAsParameters=true")
您也可以将标头值存储在 java.util.Map
中,并使用键 CamelJdbcParameters
在标头中存储映射。
50.10. Samples
在以下示例中,我们将设置 camel-jdbc
所需的 DataSource。首先,我们将 Camel 注册表中的数据源注册为 testdb
:
EmbeddedDatabase db = new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.DERBY).addScript("sql/init.sql").build(); CamelContext context = ... context.getRegistry().bind("testdb", db);
然后,我们将配置路由到 JDBC 组件的路由,以便执行 SQL。请注意,我们如何引用上一步中绑定的 testdb
数据源:
from("direct:hello") .to("jdbc:testdb");
我们创建一个端点,将 SQL 查询添加到 IN 消息的正文,然后发送交换。查询的结果会在 OUT 正文中返回:
Endpoint endpoint = context.getEndpoint("direct:hello"); Exchange exchange = endpoint.createExchange(); // then we set the SQL on the in body exchange.getMessage().setBody("select * from customer order by ID"); // now we send the exchange to the endpoint, and receives the response from Camel Exchange out = template.send(endpoint, exchange);
如果您想一次在一行中工作,而不是整个 ResultSet,您需要使用 Splitter EIP,例如:
from("direct:hello") // here we split the data from the testdb into new messages one by one // so the mock endpoint will receive a message per row in the table // the StreamList option allows to stream the result of the query without creating a List of rows // and notice we also enable streaming mode on the splitter .to("jdbc:testdb?outputType=StreamList") .split(body()).streaming() .to("mock:result");
50.11. 示例 - 每分钟轮询数据库
如果我们希望使用 JDBC 组件轮询数据库,我们需要将它与轮询调度程序(如 Timer 或 Quartz 等)合并。在以下示例中,我们每 60 秒从数据库检索数据:
from("timer://foo?period=60000") .setBody(constant("select * from customer")) .to("jdbc:testdb") .to("activemq:queue:customers");
50.12. 示例 - 在数据源之间移动数据
常见用例是查询数据,处理数据并将其移动到另一个数据源(ETL 操作)。在以下示例中,我们每小时从源表中检索新的客户记录,过滤/转换它们并将其移到目标表中:
from("timer://MoveNewCustomersEveryHour?period=3600000") .setBody(constant("select * from customer where create_time > (sysdate-1/24)")) .to("jdbc:testdb") .split(body()) .process(new MyCustomerProcessor()) //filter/transform results as needed .setBody(simple("insert into processed_customer values('${body[ID]}','${body[NAME]}')")) .to("jdbc:testdb");
50.13. Spring Boot Auto-Configuration
组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.jdbc.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | True | 布尔值 |
camel.component.jdbc.connection-strategy | 使用自定义策略来使用连接。在使用 spring-jdbc 组件时不要使用自定义策略,因为默认使用特殊的 Spring ConnectionStrategy 支持 Spring Transactions。选项是一个 org.apache.camel.component.jdbc.ConnectionStrategy 类型。 | ConnectionStrategy | |
camel.component.jdbc.enabled | 是否启用 jdbc 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.jdbc.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | False | 布尔值 |
第 51 章 jira
支持生成者和消费者
JIRA 组件通过封装 Atlassian 的 REST Java 客户端 JIRA 与 JIRA API 交互。它目前为新问题和新注释提供轮询。它还能够创建新问题、添加注释、更改问题、添加/删除监视器、添加附件并转换问题状态。
此端点依赖于简单的轮询,而不是 Webhook。原因包括:
- 对可靠性/可靠性的关注
- 我们轮询的有效负载类型通常不大(加分页可在 API 中提供)
- 在 Webhook 失败时,需要支持在某个地方无法公开访问的应用程序
请注意 JIRA API 的扩展比较合理。因此,这个组件可以被轻松扩展,以提供额外的交互。
51.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 jira
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jira-starter</artifactId> </dependency>
51.2. URI 格式
jira://type[?options]
JIRA 类型接受以下操作:
对于消费者:
- newIssues :在路由启动后只检索新问题
- 新注释:在路由启动后仅检索新的注释
- watchUpdates :只检索根据提供的 jql 更新的字段/问题
对于制作者:
- addIssue :添加一个问题
- 添加注释:对给定问题添加注释
- attach:在给定问题中添加附件
- deleteIssue :删除给定问题
- updateIssue :更新给定问题的字段
- transitionIssue :转换给定问题的状态
- watchers:添加/删除给定问题的监视者
当 JIRA 可以完全自定义时,您必须确保项目和工作流存在字段 ID,因为它们在不同的 JIRA 服务器之间可能会改变。
51.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
51.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
51.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
51.4. 组件选项
JIRA 组件支持 12 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
delay (common) | 下一次轮询经过的时间(毫秒)。 | 6000 | 整数 |
jiraUrl (common) | 必需 JIRA 服务器 url,例如: | 字符串 | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
configuration (advanced) | 使用共享基础 jira 配置。 | JiraConfiguration | |
accessToken (security) | (仅限OAuth) JIRA 服务器生成的访问令牌。 | 字符串 | |
consumerKey (security) | (OAuth only) JIRA 设置中的使用者密钥。 | 字符串 | |
password (security) | (仅限基本身份验证)用于向 JIRA 服务器进行身份验证的密码。仅在使用用户名基本身份验证时使用。 | 字符串 | |
PrivateKey ( security) | (仅限 OAuth)客户端生成的私钥,以加密与服务器的对话。 | 字符串 | |
用户名 (安全性) | (仅限基本身份验证)向 JIRA 服务器进行身份验证的用户名。仅在 JIRA 服务器上没有启用 OAuth 时才使用。如果同时设置了 username 和 OAuth 令牌参数,则不要设置它们,则用户名基本身份验证具有优先权。 | 字符串 | |
verifyCode (security) | (仅限OAuth)授权 proccess 的第一个步骤中生成的 JIRA 的验证代码。 | 字符串 |
51.5. 端点选项
Jira 端点使用 URI 语法进行配置:
jira:type
使用以下路径和查询参数:
51.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
type (common) | 执行 所需的操作。消费者:NewIssues,新评论.生产者:添加Isue、AttachFile、DeleteIsue、TransitionIssue、UpdateIssue、Watchers。如需更多信息,请参阅此类 javadoc 描述。 Enum 值:
| JiraType |
51.5.2. 查询参数 (16 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 中的 product 键。务必要使用 RAW ()并在其中设置 JQL 以防止 camel 解析它,例如: RAW (project in (MYP, COM) AND resolution = Unresolved。 | 字符串 | |
maxResults (consumer) | 要搜索的最大问题数。 | 50 | 整数 |
sendOnlyUpdatedField (consumer) | 仅发送交换正文或问题对象中已更改字段的指示器。默认情况下,消费者仅发送更改的字段。 | true | 布尔值 |
watchedFields (consumer) | 要监视更改的以逗号分隔的字段列表。status,Priority 是默认值。 | status,Priority | 字符串 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
accessToken (security) | (仅限OAuth) JIRA 服务器生成的访问令牌。 | 字符串 | |
consumerKey (security) | (OAuth only) JIRA 设置中的使用者密钥。 | 字符串 | |
password (security) | (仅限基本身份验证)用于向 JIRA 服务器进行身份验证的密码。仅在使用用户名基本身份验证时使用。 | 字符串 | |
PrivateKey ( security) | (仅限 OAuth)客户端生成的私钥,以加密与服务器的对话。 | 字符串 | |
用户名 (安全性) | (仅限基本身份验证)向 JIRA 服务器进行身份验证的用户名。仅在 JIRA 服务器上没有启用 OAuth 时才使用。如果同时设置了 username 和 OAuth 令牌参数,则不要设置它们,则用户名基本身份验证具有优先权。 | 字符串 | |
verifyCode (security) | (仅限OAuth)授权 proccess 的第一个步骤中生成的 JIRA 的验证代码。 | 字符串 |
51.6. client Factory
您可以将 JIRARestClientFactory
与 registry 中 名为 JIRARestClientFactory 的绑定,使其在 JIRA 端点中自动设置。
51.7. 身份验证
camel-jira 支持 基本身份验证 和 OAuth 3 委派的身份验证。
我们建议尽可能使用 OAuth,因为它为您的用户和系统提供最佳安全性。
51.7.1. 基本身份验证要求:
- 用户名和密码
51.7.2. OAuth 身份验证要求:
按照 JIRA OAuth 文档中的 教程生成客户端私钥、使用者密钥、验证代码和访问令牌。
- 在您的系统上本地生成的私钥。
- JIRA 服务器生成的验证代码。
- consumer 密钥,在 JIRA 服务器设置中设置。
- JIRA 服务器生成的访问令牌。
51.8. JQL
JQL URI 选项供两个消费者端点使用。在理论上,如 "project key" 等项目可以是 URI 选项本身。但是,通过需要使用 JQL,使用者变得更加灵活、强大。
至少,消费者需要以下内容:
jira://[type]?[required options]&jql=project=[project key]
需要注意的一件事是 newIssues 消费者将自动设置为 JQL:
-
将
ORDER BY key desc
附加到 JQL -
prepend
id > latestIssueId
,以检索在 camel 路由启动后添加的问题。
这是为了优化启动处理,而不必索引项目中每一个问题。
另一个注意的是,新注释使用者必须索引项目中每一个问题 和注释。因此,对于大型项目,尽可能优化 JQL 表达式非常重要。例如,JIRA Toolkit 插件在查询中包含 "Number of comments" custom field iwl-wagonuse '"Number of comments" > 0'。另外,尝试根据状态(status=Open)最小化,增加轮询延迟等。Example:
jira://[type]?[required options]&jql=RAW(project=[project key] AND status in (Open, \"Coding In Progress\") AND \"Number of comments\">0)"
51.9. 操作
在使用 JIRA 操作时,请参阅要设置的所需标头列表。producer 的 author 字段会在 JIRA 端自动设置为经过身份验证的用户。
如果没有设置任何必填字段,则抛出 IllegalArgumentException。
有一些操作需要 id
用于字段,如:问题类型、优先级、转换。检查 jira 项目的有效 id
,因为它们可能在 jira 安装和项目工作流上有所不同。
51.10. AddIssue
必需:
-
ProjectKey
:项目密钥,例如:CAMEL、HHH、MYP。 -
IssueTypeId
或IssueTypeName
: 问题类型的id
或问题类型的名称,您可以在http://jira_server/rest/api/2/issue/createmeta?projectKeys=SAMPLE_KEY
中看到有效列表。 -
IssueSummary
: 问题概述。
可选:
-
IssueAssignee
: assignee 用户 -
IssuePriorityId
或IssuePriorityName
:问题的优先级,您可以在http://jira_server/rest/api/2/priority
中看到有效列表。 -
IssueComponents
: 具有有效组件名称的字符串列表。 -
IssueWatchersAdd
:要添加到监视器列表中的用户名字符串列表。 -
IssueDescription
: 问题的描述。
51.11. AddComment
必需:
-
IssueKey
:问题键标识符。 - 交换的正文是描述。
51.12. attach
每个调用中只有一个文件。
必需:
-
IssueKey
:问题键标识符。 -
交换的正文应该是
文件类型文件
51.13. DeleteIssue
必需:
-
IssueKey
:问题键标识符。
51.14. TransitionIssue
必需:
-
IssueKey
:问题键标识符。 -
IssueTransitionId
:问题转换id
。 - 交换的正文是描述。
51.15. UpdateIssue
-
IssueKey
:问题键标识符。 -
IssueTypeId
或IssueTypeName
: 问题类型的id
或问题类型的名称,您可以在http://jira_server/rest/api/2/issue/createmeta?projectKeys=SAMPLE_KEY
中看到有效列表。 -
IssueSummary
: 问题概述。 -
IssueAssignee
: assignee 用户 -
IssuePriorityId
或IssuePriorityName
:问题的优先级,您可以在http://jira_server/rest/api/2/priority
中看到有效列表。 -
IssueComponents
: 具有有效组件名称的字符串列表。 -
IssueDescription
: 问题的描述。
51.16. watcher
-
IssueKey
:问题键标识符。 -
IssueWatchersAdd
:要添加到监视器列表中的用户名字符串列表。 -
IssueWatchersRemove
: 一个字符串列表,它带有要从 watcher 列表中删除的用户名。
51.17. WatchUpdates (consumer)
-
watchedFields
Comma separated list of fields 以监控更改,如Status,Priority,Assignee,Components
等。 -
sendOnlyUpdatedField
By 默认仅更改的字段作为正文发送。
所有消息也包含以下标头,它们添加了有关更改的额外信息:
-
issueKey
:更新的问题的密钥 -
changed
: 更新字段的名称(即 Status) -
watchedIssues
: 更新时监视的所有问题键的列表
51.18. Spring Boot Auto-Configuration
组件支持 13 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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 only) 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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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)授权 proccess 的第一个步骤中生成的 JIRA 的验证代码。 | 字符串 |
第 52 章 JMS
支持生成者和消费者
此组件允许将消息发送到(或从中消耗)一个 JMS Queue 或 Topic。它使用 Spring 的 JMS 支持来声明性事务,包括 Spring 的 JmsTemplate
发送和 MessageListenerContainer
以供使用。
52.1. 依赖项
在将 jms
与 Red Hat build of Camel Spring Boot 搭配使用时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jms-starter</artifactId> </dependency>
使用 ActiveMQ
时使用了 Apache ActiveMQ,则应优先选择 ActiveMQ 组件,因为它针对 ActiveMQ 进行了优化。此页面上的所有选项和示例也对 ActiveMQ 组件有效。
转换和缓存
请查看以下第 Transactions 和 Cache Levels 部分(如果使用带有 JMS 的事务,因为它可能会影响性能)。
Request/Reply over JMS
确保在 此页中 进一步阅读有关请求/回复的重要备注,因为 Camel 提供了多个性能和集群环境配置的选项。
52.2. URI 格式
jms:[queue:|topic:]destinationName[?options]
其中 destinationName
是 JMS 队列或主题名称。默认情况下,targetName
被解释为队列名称。例如,要连接到队列,FOO.BAR
使用:
jms:FOO.BAR
如果需要,您可以包含可选的 queue:
前缀:
jms:queue:FOO.BAR
要连接到一个主题,您必须 包含 topic:
前缀。例如,要连接到主题 Stocks.Prices
,请使用:
jms:topic:Stocks.Prices
您可以使用以下格式将查询选项附加到 URI 中,
?option=value&option=value&…
52.2.1. 使用 ActiveMQ
JMS 组件重复使用 Spring 2 的 JmsTemplate
发送消息。这不是在非J2EE 容器中使用的理想选择,在 JMS 提供程序中通常需要一些缓存来避免 性能不佳。
如果要将 Apache ActiveMQ 用作您的消息代理,则建议进行以下操作之一:
- 使用 ActiveMQ 组件,该组件已优化,以便有效地使用 ActiveMQ
-
使用 ActiveMQ 中的
PoolingConnectionFactory
。
52.2.2. 事务和缓存级别
如果您消耗消息并使用事务(transacted=true
),则缓存级别的默认设置可能会影响性能。
如果您使用 XA 事务,则无法缓存,因为它可能会导致 XA 事务无法正常工作。
如果没有使用 XA,您应该考虑缓存速度,因为它会加快性能,如设置 cacheLevelName=CACHE_CONSUMER
。
cacheLevelName
的默认设置是 CACHE_AUTO
。这个默认自动检测模式,并将缓存级别相应地设置为:
-
CACHE_CONSUMER
iftransacted=false
-
CACHE_NONE
iftransacted=true
因此,您可以说默认设置比较保守。如果您使用非 XA 事务,请考虑使用 cacheLevelName=CACHE_CONSUMER
。
52.2.3. 带有 JMS 1.1 的持久化订阅
如果要使用持久主题订阅,则需要同时指定 clientId
和 durableSubscriptionName
。clientId
的值必须是唯一的,且只能由整个网络中的单个 JMS 连接实例使用。
如果您使用 Apache ActiveMQ Classic,您可能更喜欢使用名为 Virtual Topic 的功能。这应该删除具有唯一 clientId
的要求。您可以查阅 Artemis 或 ActiveMQ Classic 的特定文档,以了解有关如何使用此功能的详细信息。您可以在此处找到有关 ActiveMQ 经典持久消息传递的更多详细信息。http://activemq.apache.org/how-do-durable-queues-and-topics-work.html
52.2.3.1. 带有 JMS 2.0 的持久化订阅
如果要使用持久主题订阅,则需要指定 durableSubscriptionName
。
52.2.4. 消息标头映射
在使用消息标头时,JMS 规格指出标头名称必须是有效的 Java 标识符。因此,尝试将您的标头命名为有效的 Java 标识符。这样做的一个好处是,您可以在 JMS Selector 中使用标头(其 SQL92 语法强制用于标头的 Java 标识符语法)。
默认使用用于映射标头名称的简单策略。该策略是替换标头名称中的任何句点和连字符,如下所示,并在标头名称从通过有线发送的 JMS 消息恢复时反转替换。这意味着什么?不再丢失在 bean 组件上调用的方法名称,不再增加文件组件的文件名标头,以此类推。
Camel 中接受标头名称的当前标头名称策略如下:
- 当 Camel 使用消息时,点被 'DOT' 替换,在 Camel 使用消息时替换替换
- hyphen 被 'HYPHEN' 替代,当 Camel 使用消息时替换替换。
您可以在 JMS 端点上配置许多不同的属性,它们映射到 JMSConfiguration
对象上的属性。
映射到 Spring JMS
很多属性映射到 Spring JMS 的属性,Camel 用来发送和接收信息。因此,您可以通过咨询相关的 Spring 文档来获取这些属性的更多信息。
52.3. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
52.3.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
52.3.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
52.4. 组件选项
JMS 组件支持 98 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clientId (common) |
设置要使用的 JMS 客户端 ID。请注意,如果指定,这个值必须是唯一的,且只能被单个 JMS 连接实例使用。 | 字符串 | |
ConnectionFactory (common) | 要使用的连接工厂。连接工厂必须在组件或端点上配置。 | ConnectionFactory | |
disableReplyTo (common) | 指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目的地发送回复。如果您希望 Camel 消耗路由,且您不想 Camel 自动发送回复消息,您可以使用这个选项,因为代码中的另一个组件处理回复消息。如果要使用 Camel 作为不同消息代理之间的代理,而您想要将消息从一个系统路由到另一个系统,也可以使用此选项。 | false | 布尔值 |
durableSubscriptionName (common) |
用于指定持久主题订阅的持久订阅者名称。必须为 JMS 1.1 持久订阅配置 | 字符串 | |
jmsMessageType (common) | 允许您强制使用特定的 javax.jms.Message 实现来发送 JMS 消息。可能的值有:Bytes, Map, Object, Stream, Text。默认情况下,Camel 将决定要从 In body 类型中使用的 JMS 消息类型。这个选项允许您指定它。 Enum 值:
| JmsMessageType | |
replyTo (common) | 提供显式 ReplyTo 目的地(会覆盖消费者中的 Message.getJMSReplyTo ()的任何传入值)。 | 字符串 | |
testConnectionOnStartup (common) | 指定是否在启动时测试连接。这样可确保 Camel 启动所有 JMS 用户具有与 JMS 代理的有效连接时。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS 制作者也经过测试。 | false | 布尔值 |
confirmmentModeName (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 队列获取下一个消息前完全处理 Exchange。请注意,如果启用了 transacted,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。 | false | 布尔值 |
autoStartup (consumer) | 指定消费者容器是否应该自动启动。 | true | 布尔值 |
cacheLevel (consumer) | 根据 ID 为底层 JMS 资源设置缓存级别。如需了解更多详细信息,请参阅 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 | 布尔值 |
selector (consumer) | 设置要使用的 JMS 选择器。 | 字符串 | |
subscriptionDurable (consumer) | 设置是否使订阅持久化。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
subscriptionName (consumer) | 设置要创建的订阅的名称。在带有共享或持久订阅的主题(pub-sub domain)时应用。如果配置了客户端 ID,订阅名称需要在此客户端的 JMS 客户端 id 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发消费者(这是此消息监听程序容器的默认值),除了一个共享订阅(需要 JMS 2.0)。 | 字符串 | |
subscriptionShared (consumer) | 设置是否共享订阅。要使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 来注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以作为订阅名称使用)。请注意,共享订阅也可能是持久的,因此此标志也可以与 subscriptionDurable 结合使用。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,您可以考虑启用此选项,同时仍然在队列上排队消息。如果此选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,而 JMS 代理必须尝试重新设计,这一次可能被拒绝,最终该消息可能会在 JMS 代理上的死信队列中移动。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
allowReplyManagerQuickStop (consumer (advanced)) | 在请求/回复消息传递的回复管理器中使用的 DefaultMessageListenerContainer.runningAllowed 标志是否允许 DefaultMessageListenerContainer.runningAllowed 标志快速停止,如果 JmsConfigurationBuildisAcceptMessagesWhileStopping 已启用,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 消费者中默认启用这种快速停止功能,但为了启用此标志,您必须启用此标志。 | false | 布尔值 |
consumerType (consumer (advanced)) | 要使用的消费者类型,可以是: Simple、Default 或 Custom 之一。consumer 类型决定要使用的 Spring JMS 侦听器。default 将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,Simple 将使用 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 带有最佳值 - 缓存的 threadpool-like)。如果没有设置,则默认为前面的行为,它对消费者使用缓存的线程池,并将 SimpleAsync 用于回复消费者。建议使用 ThreadPool 来减少弹性配置中的线程垃圾箱,并动态增加和减少并发消费者。 Enum 值:
| DefaultTaskExecutorType | |
eagerLoadingOfProperties (consumer (advanced)) | 加载消息后马上启用对 JMS 属性和有效负载的 eager 加载,这通常效率低下,因为 JMS 属性可能不需要,但有时可以尽早地捕获与底层 JMS 提供程序和使用 JMS 属性相关的问题。另请参阅 eagerPoisonBody 选项。 | false | 布尔值 |
eagerPoisonBody (consumer (advanced)) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)为 poison (不能读取/映射),则将此文本设置为消息正文,以便处理消息正文(导致 poison 的原因在 Exchange 上已存储为例外)。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅选项 eagerLoadingOfProperties。 | 因 $\{exception.message} 导致的 Poison JMS 消息 | 字符串 |
exposeListenerSession (consumer (advanced)) | 指定在消耗消息时是否应公开侦听器会话。 | false | 布尔值 |
replyToSameDestinationAllowed (consumer (advanced)) | 是否允许 JMS 使用者向消费者使用的同一目的地发送回复消息。这可防止通过消耗并发送相同消息到其自身的无端循环。 | false | 布尔值 |
taskExecutor (consumer (advanced)) | 允许您指定自定义任务 executor 以供使用消息。 | 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 或 timeToLiveity 的服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用于当前端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,读取仅来自 Camel In 消息标头的 QoS 属性。 | false | 布尔值 |
formatDateHeadersToIso8601 (producer) | 设置 JMS 日期属性是否应根据 ISO 8601 标准进行格式化。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
preserveMessageQos (producer) | 如果设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供 all 或 only some them。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖来自端点的值。相反,explicitQosEnabled 选项将使用端点上设置的选项,而不是来自消息标头的值。 | false | 布尔值 |
priority (producer) | 大于 1 的值在发送时指定消息优先级(其中 1 是最低优先级,9 为最高)。还必须启用 explicitQosEnabled 选项,以便此选项有任何效果。 Enum 值:
| 4 | int |
replyToConcurrentConsumers (producer) | 指定在对 JMS 进行请求/回复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | 1 | int |
replyToMaxConcurrentConsumers (producer) | 指定在 JMS 上使用请求/回复时的最大并发用户数。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | int | |
replyToOnTimeoutMaxcurrentConsumers (producer) | 指定在通过 JMS 使用请求/回复时,进行超时时继续路由的并发消费者的最大数量。 | 1 | int |
replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo 目的地,它会覆盖 replyTo 的设置。如果您要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这很有用。 | 字符串 | |
replyToType (producer) | 在通过 JMS 进行 request/reply 时,允许显式指定用于 replyTo 队列的策略类型。可能的值有: Temporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果配置了 replyTo,则默认使用 Shared。这个选项允许您使用专用队列而不是共享队列。如需了解更多详细信息,请参阅 Camel JMS 文档,特别是有关在集群环境中运行时的影响的信息,以及共享回复队列的性能比其 alternatives 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 交换模式时,请使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置消息将只与此属性的 JMSCorrelationID 属性的值关联,则忽略且不由 Camel 设置。 | 字符串 | |
disableTimeToLive (producer (advanced)) | 使用这个选项强制禁用生存时间。例如,当您通过 JMS 进行请求/回复时,Camel 默认将使用 requestTimeout 值作为发送消息的时间。问题是发送方和接收器系统必须同步其时钟,因此它们同步。这并非始终容易存档。因此,您可以使用 disableTimeToLive=true 来在发送的消息上将时间设置为 live 值。然后,该消息不会在接收器系统上过期。如需了解更多详细信息,请参见以下小节中关于 live 的时间。 | false | 布尔值 |
forceSendOriginalMessage (producer (advanced)) | 使用 mapJmsMessage=false Camel 时,如果您在路由过程中涉及标头(get 或 set),则创建新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly 发送到 JMS 目的地时(例如触发和忘记)。启用此选项将增强 Camel Exchange 与实际的 JMSMessageID,在消息发送到 JMS 目的地时供 JMS 客户端使用。 | false | 布尔值 |
replyToCacheLevelName (producer (advanced)) | 在通过 JMS 进行请求/回复时,根据回复消费者设置缓存级别。这个选项只适用于使用固定回复队列(而非临时)。默认情况下,Camel 将使用:CACHE_CONSUMER 用于 exclusive 或 shared w/ replyToSelectorName。用于没有 replyToSelectorName 的共享的 CACHE_SESSION。IBM WebSphere 等一些 JMS 代理可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注意:如果使用临时队列,则不允许 CACHE_NONE,您必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
replyToDestinationSelectorName (producer (advanced)) | 使用要使用的固定名称设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(即,如果您不使用临时回复队列)。 | 字符串 | |
streamMessageTypeEnabled (producer (advanced)) | 设置 StreamMessage 类型是否已启用。通过以 BytesMessage 或 StreamMessage 发送的消息有效负载,如 files、InputStream 等。这个选项控制将使用的 kind。默认情况下,使用 BytesMessage 来强制将整个消息有效负载读取到内存中。通过启用这个选项,消息有效负载以块的形式读取到内存中,每个块都会被写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
allowAutoWiredConnectionFactory (advanced) | 如果没有配置连接工厂,是否从 registry 中自动发现 ConnectionFactory。如果只找到了一个 ConnectionFactory 实例,则会使用它。这默认是启用的。 | true | 布尔值 |
allowAutoWiredDestinationResolver (advanced) | 如果没有配置目标解析器,是否从 registry 中自动发现 DestinationResolver。如果只找到一个 DestinationResolver 实例,则会使用它。这默认是启用的。 | true | 布尔值 |
allowSerializedHeaders (advanced) | 控制是否包含序列化标头。仅在 transferExchange 为 true 时应用。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。 | false | 布尔值 |
artemisStreamingEnabled (advanced) | 是否针对 Apache Artemis 流模式进行优化。当将 Artemis 与 JMS StreamMessage 类型一起使用时,这可以减少内存开销。只有在使用 Apache Artemis 时,才必须启用此选项。 | false | 布尔值 |
asyncStartListener (advanced) | 在启动路由时,是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法获得与远程 JMS 代理的连接,那么在重试和/或故障转移时可能会阻止它。这会导致 Camel 在启动路由时阻止。通过将这个选项设置为 true,您可以让路由启动,而 JmsConsumer 使用异步模式的专用线程连接到 JMS 代理。如果使用此选项,请注意,如果无法建立连接,则会在 WARN 级别记录异常,消费者将无法接收消息;然后,您可以重启要重试的路由。 | false | 布尔值 |
asyncStopListener (advanced) | 在停止路由时,是否异步停止 JmsConsumer 消息监听程序。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
configuration (advanced) | 使用共享的 JMS 配置。 | JmsConfiguration | |
destinationResolver (advanced) | 可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找实际目的地)。 | DestinationResolver | |
errorHandler (advanced) | 指定在处理消息时抛出异常时调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置 errorHandler,则会在 WARN 级别中记录这些例外。您可以配置日志记录级别,以及堆栈跟踪是否应该使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录。这样可以更容易配置,而不必对自定义 errorHandler 进行编码。 | ErrorHandler | |
exceptionListener (advanced) | 指定要收到任何底层 JMS 异常的 JMS Exception Listener。 | ExceptionListener | |
idleConsumerLimit (advanced) | 指定允许在任何给定时间闲置的用户数量的限制。 | 1 | int |
idleTaskExecutionLimit (advanced) | 指定接收任务的闲置执行的限制,而不是在其执行中收到任何消息。如果达到这个限制,则任务将关闭并离开接收其他执行任务(在动态调度的情况下;请参阅 maxConcurrentConsumers 设置)。Spring 中还有额外的文档。 | 1 | int |
includeAllJMSXProperties (advanced) | 在从 JMS 到 Camel 消息映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注: 如果您使用自定义 headerFilterStrategy,则这个选项不适用。 | false | 布尔值 |
jmsKeyFormatStrategy (advanced) | 用于编码和解码 JMS 密钥的可插拔策略,以便它们能够与 JMS 规范兼容。Camel 提供了两个开箱即用的实现:default 和 passthrough。默认策略将安全地 marshal 句点和连字符(. 和 -)。passthrough 策略将密钥保留为原样。可用于 JMS 代理,这些代理不关心 JMS 标头键是否包含非法字符。您可以提供自己的 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 # 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
mapJmsMessage (advanced) | 指定 Camel 是否将收到的 JMS 消息自动映射到适合的有效负载类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
maxMessagesPerTask (advanced) | 每个任务的消息数量。-1 代表没有限制。如果您将范围用于并发消费者(例如 min max),则此选项可用于设置 eg 100 来控制在需要较少工作时消费者缩小的速度。 | -1 | int |
messageConverter (advanced) | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
messageCreatedStrategy (advanced) | 使用在 Camel 发送 JMS 消息时调用的 given MessageCreatedStrategy,在 Camel 创建 javax.jms.Message 对象的新实例时调用。 | MessageCreatedStrategy | |
messageIdEnabled (advanced) | 发送时,指定是否应添加消息 ID。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将消息 ID 设置为 null;如果供应商忽略 hint,则消息 ID 必须设置为其正常唯一值。 | true | 布尔值 |
messageListenerContainerFactory (advanced) | 用于决定使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 MessageListenerContainerFactory 的 registry ID。设置此选项会自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
messageTimestampEnabled (advanced) | 指定默认情况下,是否应在发送消息时启用时间戳。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将时间戳设置为零;如果供应商忽略 hint,则必须将时间戳设置为其正常值。 | true | 布尔值 |
pubSubNoLocal (advanced) | 指定是否禁止发送其自身连接发布的消息。 | false | 布尔值 |
queueBrowseStrategy (advanced) | 在浏览队列时使用自定义 QueueBrowseStrategy。 | QueueBrowseStrategy | |
receiveTimeout (advanced) | 接收消息的超时时间(以毫秒为单位)。 | 1000 | long |
recoveryInterval (advanced) | 指定恢复尝试之间的间隔,即刷新连接时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。 | 5000 | long |
requestTimeoutCheckerInterval (advanced) | 配置 Camel 在通过 JMS 进行请求/回复时应检查超时交换的频率。默认情况下,Camel 会每秒检查一次。但是,如果您在超时时必须更快地响应,您可以降低这个间隔,以便更频繁地检查。超时由选项 requestTimeout 决定。 | 1000 | long |
同步 (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
transferException (advanced) | 如果启用了,并且您在使用 Request Reply messaging (InOut),且 Exchange 在消费者端失败,则原因例外将作为 javax.jms.ObjectMessage 发回。如果客户端是 Camel,则返回的例外将被重新箭头。这样,您可以在路由中使用 Camel JMS 作为网桥 - 例如,使用持久性队列启用可靠的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。需要 Caught 异常才能按顺序排序。消费者端的原始 Exception 可以嵌套在外部异常中,如返回到制作者时 org.apache.camel.RuntimeCamelException。请小心谨慎,因为数据使用 Java 对象序列化,并且要求收到的能够在类级别上反序列化数据,这会强行生产者和消费者之间的强耦合。 | false | 布尔值 |
transferExchange (advanced) | 您可以通过线路传输交换,而不只是正文和标头。以下字段会被传输:在 body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。您必须在生成者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换而不是常规有效负载。请小心谨慎,因为数据使用 Java 对象序列化,并且要求接收器能够在类级别上反序列化数据,这会强制生产者与需要使用兼容 Camel 版本的消费者之间强耦耦合! | false | 布尔值 |
useMessageIDAsCorrelationID (advanced) | 指定 JMSMessageID 是否始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在通过 JMS 进行请求/回复时,等待 provisional correlation id 更新为实际关联 ID 的次数,以及启用选项 useMessageIDAsCorrelationID 的时间。 | 50 | int |
waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 等待更新调配关联 id 期间每次处于睡眠状态的间隔。 | 100 | long |
headerFilterStrategy (filter) | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息。 | HeaderFilterStrategy | |
errorHandlerLoggingLevel (logging) | 允许为日志记录无法捕获的异常配置默认 errorHandler 日志记录级别。 Enum 值:
| WARN | LoggingLevel |
errorHandlerLogStackTrace (logging) | 允许默认 errorHandler 控制是否应记录 stacktrace。 | true | 布尔值 |
password (security) | 用于 ConnectionFactory 的密码。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
用户名 (安全性) | 用于 ConnectionFactory 的用户名。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
转换 (事务) | 指定是否使用 transacted 模式。 | false | 布尔值 |
transactedInOut (transaction) | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式(如果此标志设为 true),则 Spring JmsTemplate 会将 sessionTransacted 设置为 true,以及 acknowledgeMode 作为 InOut 操作的 JmsTemplate 的 transacted。注意从 Spring JMS:在 JTA 事务中,传递给 createQueue 的参数,不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值自行做出决定。类似地,这些参数不会被在本地管理的事务中考虑,因为本例中的 Spring JMS 在现有的 JMS Session 上运行。在受管事务之外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(并非 XA 事务)的情况下同步的本地 JMS 事务。这将与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务),而 JMS 事务会在主事务后提交右边。 | false | 布尔值 |
lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,则 Camel 将创建一个 JmsTransactionManager,如果没有在选项 transacted=true 时注入任何 transactionManager。 | true | 布尔值 |
transactionManager (transaction (advanced)) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
transactionTimeout (transaction (advanced)) | 使用 transacted 模式,事务的超时值(以秒为单位)。 | -1 | int |
52.5. 端点选项
JMS 端点使用 URI 语法进行配置:
jms:destinationType:destinationName
使用以下路径和查询参数:
52.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
destinationType (common) | 要使用的目标类型。 Enum 值:
| queue | 字符串 |
destinationName (common) | 用作目标的队列或主题 必需 名称。 | 字符串 |
52.5.2. 查询参数(95 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clientId (common) | 设置要使用的 JMS 客户端 ID。请注意,如果指定,这个值必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只需要使用 JMS 1.1 的持久主题订阅。如果使用 Apache ActiveMQ,您可能更喜欢使用 Virtual Topics。 | 字符串 | |
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 目的地(会覆盖消费者中的 Message.getJMSReplyTo ()的任何传入值)。 | 字符串 | |
testConnectionOnStartup (common) | 指定是否在启动时测试连接。这样可确保 Camel 启动所有 JMS 用户具有与 JMS 代理的有效连接时。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS 制作者也经过测试。 | false | 布尔值 |
confirmmentModeName (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 队列获取下一个消息前完全处理 Exchange。请注意,如果启用了 transacted,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。 | false | 布尔值 |
autoStartup (consumer) | 指定消费者容器是否应该自动启动。 | true | 布尔值 |
cacheLevel (consumer) | 根据 ID 为底层 JMS 资源设置缓存级别。如需了解更多详细信息,请参阅 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 | 布尔值 |
selector (consumer) | 设置要使用的 JMS 选择器。 | 字符串 | |
subscriptionDurable (consumer) | 设置是否使订阅持久化。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
subscriptionName (consumer) | 设置要创建的订阅的名称。在带有共享或持久订阅的主题(pub-sub domain)时应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发消费者(这是此消息监听程序容器的默认值),除了一个共享订阅(需要 JMS 2.0)。 | 字符串 | |
subscriptionShared (consumer) | 设置是否共享订阅。要使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 来注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以作为订阅名称使用)。请注意,共享订阅也可能是持久的,因此此标志也可以与 subscriptionDurable 结合使用。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,您可以考虑启用此选项,同时仍然在队列上排队消息。如果此选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,而 JMS 代理必须尝试重新设计,这一次可能被拒绝,最终该消息可能会在 JMS 代理上的死信队列中移动。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
allowReplyManagerQuickStop (consumer (advanced)) | 在请求/回复消息传递的回复管理器中使用的 DefaultMessageListenerContainer.runningAllowed 标志是否允许 DefaultMessageListenerContainer.runningAllowed 标志快速停止,如果 JmsConfigurationBuildisAcceptMessagesWhileStopping 已启用,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 消费者中默认启用这种快速停止功能,但为了启用此标志,您必须启用此标志。 | false | 布尔值 |
consumerType (consumer (advanced)) | 要使用的消费者类型,可以是: Simple、Default 或 Custom 之一。consumer 类型决定要使用的 Spring JMS 侦听器。default 将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,Simple 将使用 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 带有最佳值 - 缓存的 threadpool-like)。如果没有设置,则默认为前面的行为,它对消费者使用缓存的线程池,并将 SimpleAsync 用于回复消费者。建议使用 ThreadPool 来减少弹性配置中的线程垃圾箱,并动态增加和减少并发消费者。 Enum 值:
| DefaultTaskExecutorType | |
eagerLoadingOfProperties (consumer (advanced)) | 加载消息后马上启用对 JMS 属性和有效负载的 eager 加载,这通常效率低下,因为 JMS 属性可能不需要,但有时可以尽早地捕获与底层 JMS 提供程序和使用 JMS 属性相关的问题。另请参阅 eagerPoisonBody 选项。 | false | 布尔值 |
eagerPoisonBody (consumer (advanced)) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)为 poison (不能读取/映射),则将此文本设置为消息正文,以便处理消息正文(导致 poison 的原因在 Exchange 上已存储为例外)。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅选项 eagerLoadingOfProperties。 | 因 $\{exception.message} 导致的 Poison JMS 消息 | 字符串 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
exposeListenerSession (consumer (advanced)) | 指定在消耗消息时是否应公开侦听器会话。 | false | 布尔值 |
replyToSameDestinationAllowed (consumer (advanced)) | 是否允许 JMS 使用者向消费者使用的同一目的地发送回复消息。这可防止通过消耗并发送相同消息到其自身的无端循环。 | false | 布尔值 |
taskExecutor (consumer (advanced)) | 允许您指定自定义任务 executor 以供使用消息。 | 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 或 timeToLiveity 的服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用于当前端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,读取仅来自 Camel In 消息标头的 QoS 属性。 | false | 布尔值 |
formatDateHeadersToIso8601 (producer) | 设置 JMS 日期属性是否应根据 ISO 8601 标准进行格式化。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
preserveMessageQos (producer) | 如果设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供 all 或 only some them。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖来自端点的值。相反,explicitQosEnabled 选项将使用端点上设置的选项,而不是来自消息标头的值。 | false | 布尔值 |
priority (producer) | 大于 1 的值在发送时指定消息优先级(其中 1 是最低优先级,9 为最高)。还必须启用 explicitQosEnabled 选项,以便此选项有任何效果。 Enum 值:
| 4 | int |
replyToConcurrentConsumers (producer) | 指定在对 JMS 进行请求/回复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | 1 | int |
replyToMaxConcurrentConsumers (producer) | 指定在 JMS 上使用请求/回复时的最大并发用户数。另请参阅 maxMessagesPerTask 选项,以控制线程的动态扩展/关闭。 | int | |
replyToOnTimeoutMaxcurrentConsumers (producer) | 指定在通过 JMS 使用请求/回复时,进行超时时继续路由的并发消费者的最大数量。 | 1 | int |
replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo 目的地,它会覆盖 replyTo 的设置。如果您要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这很有用。 | 字符串 | |
replyToType (producer) | 在通过 JMS 进行 request/reply 时,允许显式指定用于 replyTo 队列的策略类型。可能的值有: Temporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果配置了 replyTo,则默认使用 Shared。这个选项允许您使用专用队列而不是共享队列。如需了解更多详细信息,请参阅 Camel JMS 文档,特别是有关在集群环境中运行时的影响的信息,以及共享回复队列的性能比其 alternatives 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 交换模式时,请使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置消息将只与此属性的 JMSCorrelationID 属性的值关联,则忽略且不由 Camel 设置。 | 字符串 | |
disableTimeToLive (producer (advanced)) | 使用这个选项强制禁用生存时间。例如,当您通过 JMS 进行请求/回复时,Camel 默认将使用 requestTimeout 值作为发送消息的时间。问题是发送方和接收器系统必须同步其时钟,因此它们同步。这并非始终容易存档。因此,您可以使用 disableTimeToLive=true 来在发送的消息上将时间设置为 live 值。然后,该消息不会在接收器系统上过期。如需了解更多详细信息,请参见以下小节中关于 live 的时间。 | false | 布尔值 |
forceSendOriginalMessage (producer (advanced)) | 使用 mapJmsMessage=false Camel 时,如果您在路由过程中涉及标头(get 或 set),则创建新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly 发送到 JMS 目的地时(例如触发和忘记)。启用此选项将增强 Camel Exchange 与实际的 JMSMessageID,在消息发送到 JMS 目的地时供 JMS 客户端使用。 | false | 布尔值 |
replyToCacheLevelName (producer (advanced)) | 在通过 JMS 进行请求/回复时,根据回复消费者设置缓存级别。这个选项只适用于使用固定回复队列(而非临时)。默认情况下,Camel 将使用:CACHE_CONSUMER 用于 exclusive 或 shared w/ replyToSelectorName。用于没有 replyToSelectorName 的共享的 CACHE_SESSION。IBM WebSphere 等一些 JMS 代理可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注意:如果使用临时队列,则不允许 CACHE_NONE,您必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
replyToDestinationSelectorName (producer (advanced)) | 使用要使用的固定名称设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(即,如果您不使用临时回复队列)。 | 字符串 | |
streamMessageTypeEnabled (producer (advanced)) | 设置 StreamMessage 类型是否已启用。通过以 BytesMessage 或 StreamMessage 发送的消息有效负载,如 files、InputStream 等。这个选项控制将使用的 kind。默认情况下,使用 BytesMessage 来强制将整个消息有效负载读取到内存中。通过启用这个选项,消息有效负载以块的形式读取到内存中,每个块都会被写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
allowSerializedHeaders (advanced) | 控制是否包含序列化标头。仅在 transferExchange 为 true 时应用。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。 | false | 布尔值 |
artemisStreamingEnabled (advanced) | 是否针对 Apache Artemis 流模式进行优化。当将 Artemis 与 JMS StreamMessage 类型一起使用时,这可以减少内存开销。只有在使用 Apache Artemis 时,才必须启用此选项。 | false | 布尔值 |
asyncStartListener (advanced) | 在启动路由时,是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法获得与远程 JMS 代理的连接,那么在重试和/或故障转移时可能会阻止它。这会导致 Camel 在启动路由时阻止。通过将这个选项设置为 true,您可以让路由启动,而 JmsConsumer 使用异步模式的专用线程连接到 JMS 代理。如果使用此选项,请注意,如果无法建立连接,则会在 WARN 级别记录异常,消费者将无法接收消息;然后,您可以重启要重试的路由。 | false | 布尔值 |
asyncStopListener (advanced) | 在停止路由时,是否异步停止 JmsConsumer 消息监听程序。 | false | 布尔值 |
destinationResolver (advanced) | 可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找实际目的地)。 | DestinationResolver | |
errorHandler (advanced) | 指定在处理消息时抛出异常时调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置 errorHandler,则会在 WARN 级别中记录这些例外。您可以配置日志记录级别,以及堆栈跟踪是否应该使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录。这样可以更容易配置,而不必对自定义 errorHandler 进行编码。 | ErrorHandler | |
exceptionListener (advanced) | 指定要收到任何底层 JMS 异常的 JMS Exception Listener。 | ExceptionListener | |
headerFilterStrategy (advanced) | 使用自定义 HeaderFilterStrategy 过滤标头到 Camel 消息。 | HeaderFilterStrategy | |
idleConsumerLimit (advanced) | 指定允许在任何给定时间闲置的用户数量的限制。 | 1 | int |
idleTaskExecutionLimit (advanced) | 指定接收任务的闲置执行的限制,而不是在其执行中收到任何消息。如果达到这个限制,则任务将关闭并离开接收其他执行任务(在动态调度的情况下;请参阅 maxConcurrentConsumers 设置)。Spring 中还有额外的文档。 | 1 | int |
includeAllJMSXProperties (advanced) | 在从 JMS 到 Camel 消息映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注: 如果您使用自定义 headerFilterStrategy,则这个选项不适用。 | false | 布尔值 |
jmsKeyFormatStrategy (advanced) | 用于编码和解码 JMS 密钥的可插拔策略,以便它们能够与 JMS 规范兼容。Camel 提供了两个开箱即用的实现:default 和 passthrough。默认策略将安全地 marshal 句点和连字符(. 和 -)。passthrough 策略将密钥保留为原样。可用于 JMS 代理,这些代理不关心 JMS 标头键是否包含非法字符。您可以提供自己的 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 # 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
mapJmsMessage (advanced) | 指定 Camel 是否将收到的 JMS 消息自动映射到适合的有效负载类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
maxMessagesPerTask (advanced) | 每个任务的消息数量。-1 代表没有限制。如果您将范围用于并发消费者(例如 min max),则此选项可用于设置 eg 100 来控制在需要较少工作时消费者缩小的速度。 | -1 | int |
messageConverter (advanced) | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
messageCreatedStrategy (advanced) | 使用在 Camel 发送 JMS 消息时调用的 given MessageCreatedStrategy,在 Camel 创建 javax.jms.Message 对象的新实例时调用。 | MessageCreatedStrategy | |
messageIdEnabled (advanced) | 发送时,指定是否应添加消息 ID。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将消息 ID 设置为 null;如果供应商忽略 hint,则消息 ID 必须设置为其正常唯一值。 | true | 布尔值 |
messageListenerContainerFactory (advanced) | 用于决定使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 MessageListenerContainerFactory 的 registry ID。设置此选项会自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
messageTimestampEnabled (advanced) | 指定默认情况下,是否应在发送消息时启用时间戳。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将时间戳设置为零;如果供应商忽略 hint,则必须将时间戳设置为其正常值。 | true | 布尔值 |
pubSubNoLocal (advanced) | 指定是否禁止发送其自身连接发布的消息。 | false | 布尔值 |
receiveTimeout (advanced) | 接收消息的超时时间(以毫秒为单位)。 | 1000 | long |
recoveryInterval (advanced) | 指定恢复尝试之间的间隔,即刷新连接时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。 | 5000 | long |
requestTimeoutCheckerInterval (advanced) | 配置 Camel 在通过 JMS 进行请求/回复时应检查超时交换的频率。默认情况下,Camel 会每秒检查一次。但是,如果您在超时时必须更快地响应,您可以降低这个间隔,以便更频繁地检查。超时由选项 requestTimeout 决定。 | 1000 | long |
同步 (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
transferException (advanced) | 如果启用了,并且您在使用 Request Reply messaging (InOut),且 Exchange 在消费者端失败,则原因例外将作为 javax.jms.ObjectMessage 发回。如果客户端是 Camel,则返回的例外将被重新箭头。这样,您可以在路由中使用 Camel JMS 作为网桥 - 例如,使用持久性队列启用可靠的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。需要 Caught 异常才能按顺序排序。消费者端的原始 Exception 可以嵌套在外部异常中,如返回到制作者时 org.apache.camel.RuntimeCamelException。请小心谨慎,因为数据使用 Java 对象序列化,并且要求收到的能够在类级别上反序列化数据,这会强行生产者和消费者之间的强耦合。 | false | 布尔值 |
transferExchange (advanced) | 您可以通过线路传输交换,而不只是正文和标头。以下字段会被传输:在 body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。您必须在生成者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换而不是常规有效负载。请小心谨慎,因为数据使用 Java 对象序列化,并且要求接收器能够在类级别上反序列化数据,这会强制生产者与需要使用兼容 Camel 版本的消费者之间强耦耦合! | false | 布尔值 |
useMessageIDAsCorrelationID (advanced) | 指定 JMSMessageID 是否始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在通过 JMS 进行请求/回复时,等待 provisional correlation id 更新为实际关联 ID 的次数,以及启用选项 useMessageIDAsCorrelationID 的时间。 | 50 | int |
waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 等待更新调配关联 id 期间每次处于睡眠状态的间隔。 | 100 | long |
errorHandlerLoggingLevel (logging) | 允许为日志记录无法捕获的异常配置默认 errorHandler 日志记录级别。 Enum 值:
| WARN | LoggingLevel |
errorHandlerLogStackTrace (logging) | 允许默认 errorHandler 控制是否应记录 stacktrace。 | true | 布尔值 |
password (security) | 用于 ConnectionFactory 的密码。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
用户名 (安全性) | 用于 ConnectionFactory 的用户名。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
转换 (事务) | 指定是否使用 transacted 模式。 | false | 布尔值 |
transactedInOut (transaction) | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式(如果此标志设为 true),则 Spring JmsTemplate 会将 sessionTransacted 设置为 true,以及 acknowledgeMode 作为 InOut 操作的 JmsTemplate 的 transacted。注意从 Spring JMS:在 JTA 事务中,传递给 createQueue 的参数,不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值自行做出决定。类似地,这些参数不会被在本地管理的事务中考虑,因为本例中的 Spring JMS 在现有的 JMS Session 上运行。在受管事务之外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(并非 XA 事务)的情况下同步的本地 JMS 事务。这将与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务),而 JMS 事务会在主事务后提交右边。 | false | 布尔值 |
lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,则 Camel 将创建一个 JmsTransactionManager,如果没有在选项 transacted=true 时注入任何 transactionManager。 | true | 布尔值 |
transactionManager (transaction (advanced)) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
transactionTimeout (transaction (advanced)) | 使用 transacted 模式,事务的超时值(以秒为单位)。 | -1 | int |
52.6. Samples
JMS 也用于其他组件的许多示例。但我们提供了几个示例以开始。
52.6.1. 从 JMS 接收
在以下示例中,我们配置一个路由,接收 JMS 消息并将消息路由到 POJO:
from("jms:queue:foo"). to("bean:myBusinessLogic");
您可以使用任何 EIP 模式,以便路由可以基于上下文。例如,如何为大型手过滤一个订购主题:
from("jms:topic:OrdersTopic"). filter().method("myBean", "isGoldCustomer"). to("jms:queue:BigSpendersQueue");
52.6.2. 发送到 JMS
在以下示例中,我们轮询一个文件文件夹,并将文件内容发送到 JMS 主题。当我们希望文件内容为 TextMessage
而不是 BytesMessage
时,我们需要将正文转换为 String
:
from("file://orders"). convertBodyTo(String.class). to("jms:topic:OrdersTopic");
52.6.3. 使用注解
Camel 还具有注解,因此您可以使用 POJO Consuming 和 POJO Producing。
52.6.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>
52.6.5. 其他示例
JMS 会出现在其他组件和 EIP 模式的许多示例中,以及此 Camel 文档。因此可以自由浏览文档。
52.6.6. 使用 JMS 作为死信队列存储交换
通常,当将 JMS 用作传输时,它只传输正文和标头作为载荷。如果要将 JMS 与死信 频道 搭配使用,请将 JMS 队列用作 Dead Letter Queue,通常原因的 Exception 不在 JMS 消息中。但是,您可以使用 JMS 死信队列上的 transferExchange
选项指示 Camel 将整个交换存储在队列中,以存放 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();
52.6.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 上调用方法或使用自定义处理器。
52.7. JMS 和 Camel 之间的消息映射
Camel 会在 javax.jms.Message
和 org.apache.camel.Message
之间自动映射消息。
在发送 JMS 消息时,Camel 会将消息正文转换为以下 JMS 消息类型:
正文类型 | JMS 消息 | 注释 |
---|---|---|
|
| |
|
|
DOM 将转换为 |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
在收到 JMS 消息时,Camel 会将 JMS 消息转换为以下正文类型:
JMS 消息 | 正文类型 |
---|---|
|
|
|
|
|
|
|
|
52.7.1. 禁用 JMS 消息的自动映射
您可以使用 mapJmsMessage
选项禁用上述自动映射。如果禁用,Camel 不会尝试映射收到的 JMS 消息,而是直接使用它作为有效负载。这可让您避免映射开销,并让 Camel 只需通过 JMS 消息。例如,它甚至允许您路由带有使用了没有包括在 classpath 中的类的 javax.jms.ObjectMessage
JMS 消息。
52.7.2. 使用自定义 MessageConverter
您可以使用 messageConverter
选项在 Spring org.springframework.jms.support.converter.MessageConverter
类中执行自己的映射。
例如,在下面的路由中,我们在发送消息到 JMS 顺序队列时使用自定义消息转换器:
from("file://inbox/order").to("jms:queue:order?messageConverter=#myMessageConverter");
从 JMS 目的地消耗时,也可以使用自定义消息转换器。
52.7.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
中定义。
52.8. 发送时的消息格式
通过 JMS 线发送的交换必须符合 JMS 消息规格。
对于 exchange.in.header
,以下规则适用于标头 键 :
-
以
JMS
或JMSX
开头的键被保留。 -
exchange.in.headers
键必须是 literals,且所有为有效的 Java 标识符(请勿在键名称中使用点)。 -
当使用 JMS 消息时,Camel 替换了点 &连字符和反向替换,当 Camel 使用消息时,Camel 会替换 'DOT' 和反向替换。
-
在 Camel 使用消息时替换为 'HYPHEN' 和反向替换。
-
另请参阅
jmsKeyFormatStrategy
选项,它允许使用您自己的自定义策略进行格式化密钥。
对于 exchange.in.header
,以下规则适用于 标头值 :
-
值必须是原语或其计数器对象(如
整数
、长
、Character
)。Type,String
,CharSequence
,Date
,BigDecimal
和BigInteger
都转换为其toString ()
表示。所有其他类型都会被丢弃。
如果 Camel 丢弃给定的标头值,Camel 将以类别 org.apache.camel.component.jms.JmsBinding
记录到 DEBUG 级别。例如:
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}
52.9. 接收时的消息格式
Camel 在 Exchange
收到消息时添加以下属性:
属性 | 类型 | 描述 |
---|---|---|
|
| 回复目的地。 |
Camel 在接收 JMS 消息时将以下 JMS 属性添加到 In 消息标头中:
标头 | 类型 | 描述 |
---|---|---|
|
| JMS 关联 ID。 |
|
| JMS 交付模式。 |
|
| JMS 目的地。 |
|
| JMS 过期。 |
|
| JMS 唯一消息 ID。 |
|
| JMS 优先级(具有 0 作为最低优先级,最高为 9)。 |
|
| 是 JMS 消息 redelivered。 |
|
| JMS 回复目的地。 |
|
| JMS 时间戳。 |
|
| JMS 类型。 |
|
| JMS 组 ID。 |
由于上述所有信息都是标准 JMS,您可以检查 JMS 文档以了解 更多详细信息。
52.10. 关于使用 Camel 来发送和接收消息和 JMSReplyTo
JMS 组件比较复杂,您必须密切注意它在某种情况下的工作方式。因此,这是要查找的一些区域/区域的简短摘要。
当 Camel 使用其 JMSProducer
发送消息时,它会检查以下条件:
- 消息交换模式,
-
是否在端点或消息标头中设置
JMSReplyTo
。 -
是否在 JMS 端点上设置了任何以下选项:
disableReplyTo
,preserveMessageQos
,explicitQosEnabled
。
所有这些都很复杂,需要理解并配置 以支持您的用例。
52.10.1. JmsProducer
根据配置,Jms Producer
的行为如下:
Exchange Pattern | 其他选项 | 描述 |
---|---|---|
InOut | - |
Camel 将期望一个回复,设置一个临时 |
InOut |
设置了 |
Camel 将预期回复,在发送消息后,它将开始侦听指定的 |
InOnly | - | Camel 将发送消息,而不是 预期回复。 |
InOnly |
设置了 |
默认情况下,Camel 会丢弃 |
52.10.2. JmsConsumer
JmsConsumer
的行为如下,具体取决于配置:
Exchange Pattern | 其他选项 | 描述 |
---|---|---|
InOut | - |
Camel 将回复发回到 |
InOnly | - | Camel 不会发送回复,因为模式是 InOnly。 |
- |
| 这个选项阻止回复。 |
请注意在交换上设置的消息交换模式。
如果您在路由中间向 JMS 目的地发送消息,您可以指定要使用的交换模式,请参阅 Request Reply。
如果您要向 JMS 主题发送 InOnly
消息,这非常有用:
from("activemq:queue:in") .to("bean:validateOrder") .to(ExchangePattern.InOnly, "activemq:topic:order") .to("bean:handleOrder");
52.11. 重复使用端点并发送到运行时计算的不同目的地
如果您需要发送消息到许多不同的 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 生成者会从交换中删除 CamelJmsDestination
and CamelJmsDestinationName
标头,且不会将它们传播到所创建的 JMS 消息,以避免路由中的意外循环(当消息将转发到另一个 JMS 端点时)。
52.12. 配置不同的 JMS 供应商
您可以在 Spring XML 中配置 JMS 供应商,如下所示:
基本上,您可以根据需要配置多个 JMS 组件实例,您需要使用 id
属性 为它们指定唯一的名称。前面的示例配置 activemq
组件。您可以执行相同的操作来配置 MQ 系列、TibCo、BEA、SEA 等等。
命名 JMS 组件后,您可以使用 URI 引用该组件内的端点。例如,对于组件名称 activemq
,您可以使用 URI 格式引用目的地,activemq:[queue:|topic:]destinationName
。您可以将相同的方法用于所有其他 JMS 提供程序。
这适用于 SpringCamelContext lazily 从用于 Endpoint URI 的方案名称的 spring 上下文获取组件,并且组件解析端点 URI。
52.12.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 模式。
52.13. 并发使用
JMS 的一个常见要求是同时使用多个线程中的消息,以便应用更迅速地响应。您可以设置 concurrentConsumers
选项来指定为 JMS 端点提供服务的线程数量,如下所示:
from("jms:SomeQueue?concurrentConsumers=20"). bean(MyClass.class);
您可以使用以下方法之一配置这个选项:
-
在
JmsComponent
, - 在端点 URI 或.
-
在
JmsEndpoint
上直接调用setConcurrentConsumers ()
。
52.13.1. 使用 async consumer 的并发使用
请注意,当当前消息被完全处理时,每个并发消费者只会从 JMS 代理获取下一个可用消息。您可以设置 asyncConsumer=true
选项,以便消费者从 JMS 队列中获取下一个消息,同时将前面的消息异步处理(通过异步路由引擎)。请参阅页顶部的有关 asyncConsumer
选项的详情。
from("jms:SomeQueue?concurrentConsumers=20&asyncConsumer=true"). bean(MyClass.class);
52.14. 通过 JMS 请求/回复
Camel 支持 JMS 上的请求/回复。本质上,当您向 JMS 队列发送消息时,Exchange 的 MEP 应该为 InOut
。
Camel 提供了很多选项,来通过 JMS 配置请求/回复,这会影响性能和集群环境。下表总结了选项。
选项 | 性能 | 集群 | 描述 |
---|---|---|---|
| 速度快 | 是 |
临时队列用作回复队列,由 Camel 自动创建。要使用此选项,请不要 指定 replyTo 队列名称。另外,您还可以配置 |
| 速度较慢 | 是 |
共享持久队列用作回复队列。必须先创建队列,但某些代理可以实时创建它们,如 Apache ActiveMQ。要使用此功能,您必须指定 replyTo 队列名称。另外,您还可以配置 |
| 速度快 | 否(*是) |
专用持久队列用作回复队列。必须先创建队列,但某些代理可以实时创建它们,如 Apache ActiveMQ。要使用此功能,您必须指定 replyTo 队列名称。此外,您必须配置 |
| 速度快 | 是 |
允许使用并发消息监听程序同时处理回复消息。您可以使用 |
| 速度快 | 是 |
允许使用并发消息监听程序同时处理回复消息。您可以使用 |
JmsProducer
检测到 InOut
,并提供 JMSReplyTo
标头,其中包含要使用的回复目的地。默认情况下,Camel 使用临时队列,但您可以使用端点上的 replyTo
选项指定固定回复队列(请参阅以下关于固定回复队列的信息)。
Camel 将自动设置侦听回复队列的消费者,因此 您不应该 执行任何操作。这个消费者是一个 Spring DefaultMessageListenerContainer
,它侦听回复。但是,它被固定到 1 个并发消费者。这意味着,回复将按顺序处理,因为只有 1 个线程来处理回复。您可以使用 replyToConcurrentConsumers
和 replyToMaxConcurrentConsumers
选项将监听程序配置为使用并发线程。这可让您在 Camel 中更轻松地进行配置,如下所示:
from(xxx) .inOut().to("activemq:queue:foo?replyToConcurrentConsumers=5") .to(yyy) .to(zzz);
在这个路由中,我们指示 Camel 使用有 5 个线程的线程池异步路由回复。
52.14.2. 通过 JMS 请求/回复并使用专用固定回复队列
在上例中,Camel 会预计名为"bar"的固定回复队列是共享的,因此它使用 JMSSelector
仅消耗它期望的回复消息。但是,由于 JMS 选择器会较慢,所以这样做有一个缺陷。此外,回复队列上的消费者使用新的 JMS 选择器 ID 进行更新较慢。实际上,它只在 receiveTimeout
选项超时时更新,默认为 1 秒。因此,在理论上,回复消息可能需要大约 1 秒才会被检测到。另一方面,如果固定的回复队列专用于 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)
如果您在集群环境中运行,则同样适用。然后,集群中的每个节点都必须使用唯一的回复队列名称。如其他情况下,集群中的每个节点可能会获取旨在作为另一节点上的回复的消息。对于集群环境,建议改为使用共享回复队列。
52.15. 在发送方和接收方之间同步时钟
在系统间执行消息传递时,需要系统已同步时钟。例如,在发送 JMS 消息时,您可以将一个生存时间设置为消息上的实时值。然后,接收器可以检查这个值,并确定消息是否已过期,从而丢弃消息而不是消耗并处理它。但是,这需要发送者和接收方都有同步时钟。如果使用 ActiveMQ,您可以使用 timestamp 插件 同步时钟。
52.16. 关于生存时间
阅读上面的有关时钟时钟的上方。
当您使用 Camel 通过 Camel 对 JMS 进行请求/回复(InOut)时,Camel 会使用发送端的超时,这是 requestTimeout
选项的默认 20 秒。您可以通过设置更高的/低值来控制这一点。但是,在要发送的消息上仍然设置了生存时间值。这需要在系统间同步时钟。如果没有,您可能需要禁用要设置的实时值的时间。现在,可以使用 Camel 2.8 中的 disableTimeToLive
选项。因此,如果您将此选项设置为 disableTimeToLive=true
,则 Camel 在发送 JMS 消息时 不会将 任何时间设置为 live 值。但是 请求超时仍处于活动状态。例如,如果您通过 JMS 进行请求/回复,并且禁用了生存时间,则 Camel 仍将使用 20 秒( requestTimeout
选项)的超时。也可以配置该选项。因此,这两个选项 requestTimeout
和 disableTimeToLive
可让您在进行 request/reply 时进行精细的控制。
您可以在消息中提供标头来覆盖,并用作请求超时值,而不是端点配置的值。例如:
from("direct:someWhere") .to("jms:queue:foo?replyTo=bar&requestTimeout=30s") .to("bean:processReply");
在上面的路由中,我们有一个 endpoint configured requestTimeout
为 30 秒。因此,Camel 将等待 30 秒,以便回复消息回到栏队列。如果没有收到回复消息,则在 Exchange 上设置了 org.apache.camel.ExchangeTimedOutException
,并且 Camel 继续路由消息,然后因为异常而失败,Camel 的错误处理器响应响应。
如果要使用每个消息超时值,您可以使用键 org.apache.camel.component.jms.JmsConstants#JMS_REQUEST_TIMEOUT
设置标头,其常量值为 "CamelJmsRequestTimeout"
,其超时值为长类型。
例如,我们可以使用 bean 计算每个独立消息的超时值,如调用服务 bean 上的 "whatIs TheTimeout"
方法,如下所示:
from("direct:someWhere") .setHeader("CamelJmsRequestTimeout", method(ServiceBean.class, "whatIsTheTimeout")) .to("jms:queue:foo?replyTo=bar&requestTimeout=30s") .to("bean:processReply");
当您使用 Camel 对 JMS 进行触发和忘记(InOut)时,默认情况下 Camel 不会 随时将消息的值设置为 live 值。您可以使用 timeToLive
选项配置值。例如,要指示 5 秒。设置 timeToLive=5000
。选项 disableTimeToLive
可用于强制禁用生存时间,也可以用于 InOnly messaging。requestTimeout
选项不用于 InOnly messaging。
52.17. 启用转换的消耗
常见要求是从事务中的队列使用,然后使用 Camel 路由处理消息。要做到这一点,请确定您在 component/endpoint 中设置以下属性:
-
transacted
= true -
transactionManager
= Transsaction Manager - 通常JmsTransactionManager
详情请查看 Transactional Client EIP 模式。
通过 JMS 进行事务处理和 [Request Reply]
当使用 Request Reply over JMS 时,您无法使用单个事务 ; JMS 不会在执行提交前发送任何消息,因此在事务提交前,服务器端不会收到任何内容。因此,要使用 Request Reply,您必须在发送请求后提交事务,然后使用单独的事务接收响应。
要解决这个问题,JMS 组件使用不同的属性来指定用于单向消息传递和请求回复消息传递的事务:
transacted
属性只适用于 InOnly message Exchange Pattern (MEP)。
您可以使用以下 component/endpoint 的属性利用 DMLC 转换会话 API :
-
transacted
= true -
lazyCreateTransactionManager
= false
这样做的好处是,在没有配置的 TransactionManager 的情况下使用本地事务时,将遵循 cacheLevel 设置。当配置了 TransactionManager 时,在 DMLC 级别不需要缓存,需要依赖池的连接工厂。有关这类设置的详情,请查看 这里 和 此处。
52.18. 使用 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 属性中提供 replyDestination
对象。然后 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."); } }
52.19. 使用请求超时
在以下示例中,我们将 Request Reply 风格的消息交换(我们使用 requestBody
方法 = InOut
)发送到 Camel 中进一步处理较慢的队列,并等待返回回复:
52.20. 发送 InOnly 消息并保留 JMSReplyTo 标头
使用 camel-jms 发送到 JMS 目的地时,生成者将使用 MEP 来检测其 InOnly 或 InOut 消息传递。但是,在某些情况下,您可能要发送 InOnly 消息,但保留 JMSReplyTo
标头。为此,您必须指示 Camel 保留它,否则将丢弃 JMSReplyTo
标头。
例如,要将 InOnly 消息发送到 foo 队列,但带有 bar 队列的 JMSReplyTo
,您可以执行以下操作:
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
标头。
52.21. 在目的地上设置 JMS 供应商选项
某些 JMS 提供程序(如 IBM 的 WebSphere MQ)需要在 JMS 目的地上设置选项。例如,您可能需要指定 targetClient
选项。由于 targetClient
是 WebSphere MQ 选项而不是 Camel URI 选项,您需要在 JMS 目的地名称上设置它,如下所示:
// ... .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"); } });
52.22. Spring Boot Auto-Configuration
组件支持 99 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
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。如果只找到一个 DestinationResolver 实例,则会使用它。这默认是启用的。 | true | 布尔值 |
camel.component.jms.allow-null-body | 是否允许发送不包含正文的消息。如果此选项为 false,并且消息正文为 null,则会抛出一个 JMSException。 | true | 布尔值 |
camel.component.jms.allow-reply-manager-quick-stop | 在请求/回复消息传递的回复管理器中使用的 DefaultMessageListenerContainer.runningAllowed 标志是否允许 DefaultMessageListenerContainer.runningAllowed 标志快速停止,如果 JmsConfigurationBuildisAcceptMessagesWhileStopping 已启用,并且 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 流模式进行优化。当将 Artemis 与 JMS StreamMessage 类型一起使用时,这可以减少内存开销。只有在使用 Apache Artemis 时,才必须启用此选项。 | false | 布尔值 |
camel.component.jms.async-consumer | JmsConsumer 是否异步处理 Exchange。如果启用,则 JmsConsumer 可能会从 JMS 队列中获取下一个消息,而前面的消息会被异步处理(通过异步路由引擎)。这意味着消息可能没有完全严格按照顺序进行处理。如果禁用(作为默认),则在 JmsConsumer 从 JMS 队列获取下一个消息前完全处理 Exchange。请注意,如果启用了 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 | 根据 ID 为底层 JMS 资源设置缓存级别。如需了解更多详细信息,请参阅 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 连接实例使用。它通常只需要使用 JMS 1.1 的持久主题订阅 | 字符串 | |
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 | 要使用的消费者类型,可以是: Simple、Default 或 Custom 之一。consumer 类型决定要使用的 Spring JMS 侦听器。default 将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,Simple 将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 选项将决定要使用的 org.springframework.jms.listener.AbstractMessageListenerContainer。 | ConsumerType | |
camel.component.jms.correlation-property | 使用 InOut 交换模式时,请使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置消息将只与此属性的 JMSCorrelationID 属性的值关联,则忽略且不由 Camel 设置。 | 字符串 | |
camel.component.jms.default-task-executor-type | 指定 DefaultMessageListenerContainer 中使用哪些默认 TaskExecutor 类型,用于消费者端点和生成者端点的 ReplyTo consumer。可能的值:simpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用 Spring 的 ThreadPoolTaskExecutor 带有最佳值 - 缓存的 threadpool-like)。如果没有设置,则默认为前面的行为,它对消费者使用缓存的线程池,并将 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 来在发送的消息上将时间设置为 live 值。然后,该消息不会在接收器系统上过期。如需了解更多详细信息,请参见以下小节中关于 live 的时间。 | false | 布尔值 |
camel.component.jms.durable-subscription-name | 用于指定持久主题订阅的持久订阅者名称。也必须配置 clientId 选项。 | 字符串 | |
camel.component.jms.eager-loading-of-properties | 加载消息后马上启用对 JMS 属性和有效负载的 eager 加载,这通常效率低下,因为 JMS 属性可能不需要,但有时可以尽早地捕获与底层 JMS 提供程序和使用 JMS 属性相关的问题。另请参阅 eagerPoisonBody 选项。 | false | 布尔值 |
camel.component.jms.eager-poison-body | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)为 poison (不能读取/映射),则将此文本设置为消息正文,以便处理消息正文(导致 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 选项记录。这样可以更容易配置,而不必对自定义 errorHandler 进行编码。选项是一个 org.springframework.util.ErrorHandler 类型。 | ErrorHandler | |
camel.component.jms.error-handler-log-stack-trace | 允许默认 errorHandler 控制是否应记录 stacktrace。 | true | 布尔值 |
camel.component.jms.error-handler-logging-level | 允许为日志记录无法捕获的异常配置默认 errorHandler 日志记录级别。 | LoggingLevel | |
camel.component.jms.exception-listener | 指定要收到任何底层 JMS 异常的 JMS Exception Listener。选项是 javax.jms.ExceptionListener 类型。 | ExceptionListener | |
camel.component.jms.explicit-qos-enabled | 设定在发送消息时应使用 deliveryMode、priority 或 timeToLiveity 的服务质量。这个选项基于 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 日期属性是否应根据 ISO 8601 标准进行格式化。 | false | 布尔值 |
camel.component.jms.header-filter-strategy | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头到 Camel 消息。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
camel.component.jms.idle-consumer-limit | 指定允许在任何给定时间闲置的用户数量的限制。 | 1 | 整数 |
camel.component.jms.idle-task-execution-limit | 指定接收任务的闲置执行的限制,而不是在其执行中收到任何消息。如果达到这个限制,则任务将关闭并离开接收其他执行任务(在动态调度的情况下;请参阅 maxConcurrentConsumers 设置)。Spring 中还有额外的文档。 | 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 与实际的 JMSMessageID,在消息发送到 JMS 目的地时供 JMS 客户端使用。 | false | 布尔值 |
camel.component.jms.jms-key-format-strategy | 用于编码和解码 JMS 密钥的可插拔策略,以便它们能够与 JMS 规范兼容。Camel 提供了两个开箱即用的实现:default 和 passthrough。默认策略将安全地 marshal 句点和连字符(. 和 -)。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 | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 | 使用在 Camel 发送 JMS 消息时调用的 given MessageCreatedStrategy,在 Camel 创建 javax.jms.Message 对象的新实例时调用。选项是一个 org.apache.camel.component.jms.MessageCreatedStrategy 类型。 | MessageCreatedStrategy | |
camel.component.jms.message-id-enabled | 发送时,指定是否应添加消息 ID。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将消息 ID 设置为 null;如果供应商忽略 hint,则消息 ID 必须设置为其正常唯一值。 | true | 布尔值 |
camel.component.jms.message-listener-container-factory | 用于决定使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 MessageListenerContainerFactory 的 registry ID。设置此选项会自动将 consumerType 设置为 Custom。选项是 org.apache.camel.component.jms.MessageListenerContainerFactory 类型。 | MessageListenerContainerFactory | |
camel.component.jms.message-timestamp-enabled | 指定默认情况下,是否应在发送消息时启用时间戳。这只是 JMS 代理的提示。如果 JMS 供应商接受这个 hint,则这些消息必须将时间戳设置为零;如果供应商忽略 hint,则必须将时间戳设置为其正常值。 | true | 布尔值 |
camel.component.jms.password | 用于 ConnectionFactory 的密码。您也可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
camel.component.jms.preserve-message-qos | 如果设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供 all 或 only some them。如果没有提供,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 目的地(会覆盖消费者中的 Message.getJMSReplyTo ()的任何传入值)。 | 字符串 | |
camel.component.jms.reply-to-cache-level-name | 在通过 JMS 进行请求/回复时,根据回复消费者设置缓存级别。这个选项只适用于使用固定回复队列(而非临时)。默认情况下,Camel 将使用:CACHE_CONSUMER 用于 exclusive 或 shared w/ replyToSelectorName。用于没有 replyToSelectorName 的共享的 CACHE_SESSION。IBM WebSphere 等一些 JMS 代理可能需要设置 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 | 指定在通过 JMS 使用请求/回复时,进行超时时继续路由的并发消费者的最大数量。 | 1 | 整数 |
camel.component.jms.reply-to-override | 在 JMS 消息中提供显式 ReplyTo 目的地,它会覆盖 replyTo 的设置。如果您要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这很有用。 | 字符串 | |
camel.component.jms.reply-to-same-destination-allowed | 是否允许 JMS 使用者向消费者使用的同一目的地发送回复消息。这可防止通过消耗并发送相同消息到其自身的无端循环。 | false | 布尔值 |
camel.component.jms.reply-to-type | 在通过 JMS 进行 request/reply 时,允许显式指定用于 replyTo 队列的策略类型。可能的值有: Temporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果配置了 replyTo,则默认使用 Shared。这个选项允许您使用专用队列而不是共享队列。如需了解更多详细信息,请参阅 Camel JMS 文档,特别是有关在集群环境中运行时的影响的信息,以及共享回复队列的性能比其 alternatives 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 类型是否已启用。通过以 BytesMessage 或 StreamMessage 发送的消息有效负载,如 files、InputStream 等。这个选项控制将使用的 kind。默认情况下,使用 BytesMessage 来强制将整个消息有效负载读取到内存中。通过启用这个选项,消息有效负载以块的形式读取到内存中,每个块都会被写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
camel.component.jms.subscription-durable | 设置是否使订阅持久化。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
camel.component.jms.subscription-name | 设置要创建的订阅的名称。在带有共享或持久订阅的主题(pub-sub domain)时应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发消费者(这是此消息监听程序容器的默认值),除了一个共享订阅(需要 JMS 2.0)。 | 字符串 | |
camel.component.jms.subscription-shared | 设置是否共享订阅。要使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 来注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以作为订阅名称使用)。请注意,共享订阅也可能是持久的,因此此标志也可以与 subscriptionDurable 结合使用。仅在侦听主题(pub-sub domain)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
camel.component.jms.synchronous | 设置是否应严格使用同步处理。 | false | 布尔值 |
camel.component.jms.task-executor | 允许您指定自定义任务 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 | 指定是否使用 transacted 模式。 | false | 布尔值 |
camel.component.jms.transacted-in-out | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式(如果此标志设为 true),则 Spring JmsTemplate 会将 sessionTransacted 设置为 true,以及 acknowledgeMode 作为 InOut 操作的 JmsTemplate 的 transacted。注意从 Spring JMS:在 JTA 事务中,传递给 createQueue 的参数,不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值自行做出决定。类似地,这些参数不会被在本地管理的事务中考虑,因为本例中的 Spring JMS 在现有的 JMS Session 上运行。在受管事务之外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(并非 XA 事务)的情况下同步的本地 JMS 事务。这将与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务),而 JMS 事务会在主事务后提交右边。 | false | 布尔值 |
camel.component.jms.transaction-manager | 要使用的 Spring 事务管理器。选项是一个 org.springframework.transaction.PlatformTransactionManager 类型。 | PlatformTransactionManager | |
camel.component.jms.transaction-name | 要使用的事务的名称。 | 字符串 | |
camel.component.jms.transaction-timeout | 使用 transacted 模式,事务的超时值(以秒为单位)。 | -1 | 整数 |
camel.component.jms.transfer-exception | 如果启用了,并且您在使用 Request Reply messaging (InOut),且 Exchange 在消费者端失败,则原因例外将作为 javax.jms.ObjectMessage 发回。如果客户端是 Camel,则返回的例外将被重新箭头。这样,您可以在路由中使用 Camel JMS 作为网桥 - 例如,使用持久性队列启用可靠的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。需要 Caught 异常才能按顺序排序。消费者端的原始 Exception 可以嵌套在外部异常中,如返回到制作者时 org.apache.camel.RuntimeCamelException。请小心谨慎,因为数据使用 Java 对象序列化,并且要求收到的能够在类级别上反序列化数据,这会强行生产者和消费者之间的强耦合。 | false | 布尔值 |
camel.component.jms.transfer-exchange | 您可以通过线路传输交换,而不只是正文和标头。以下字段会被传输:在 body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception。这要求对象是可序列化的。Camel 将排除任何非可序列化对象,并将其记录在 WARN 级别。您必须在生成者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换而不是常规有效负载。请小心谨慎,因为数据使用 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 | 在通过 JMS 进行请求/回复时,等待 provisional correlation id 更新为实际关联 ID 的次数,以及启用选项 useMessageIDAsCorrelationID 的时间。 | 50 | 整数 |
camel.component.jms.wait-for-provision-correlation-to-be-updated-thread-sleeping-time | 等待更新调配关联 id 期间每次处于睡眠状态的间隔。选项是一个长类型。 | 100 | Long |
第 53 章 JPA
Since Camel 1.0
支持生成者和消费者。
JPA 组件使您能够使用 EJB 3 的 Java 持久性架构(jpa)从持久性存储中存储和检索 Java 对象。Java Persistence 架构(JPA)是一个标准接口层,用于包装对象/关系映射(ORM)产品,如 OpenuildDefaults、Hibernate、SupLink。
53.1. 依赖项
当在 Red Hat build of Camel Spring Boot 中使用 jpa
时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jpa-starter</artifactId> </dependency>
53.2. 发送到端点
您可以通过将 Java 实体 Bean 发送到 JPA producer 端点来将其存储在数据库中。In
消息的正文被假定为实体 bean (即,其上带有 @Entity 注释的 POJO)或实体 Bean 的集合或数组。
如果正文是实体列表,请使用 entityType=java.util.List
作为传递给制作者端点的配置。
如果正文不包含之前列出的类型之一,请在端点前放置一个 Message Translator,请首先执行必要的转换。
您还可以将名为Query
或 nativeQuery
的查询用于制作者。对于
参数的值
,您可以使用 Simple 表达式,允许您从 Message body、标头等中检索参数值。这些查询可用于使用 SELECT
JPQL/SQL 语句检索一组数据,并使用 UPDATE
/DELETE
JPQL/SQL 语句执行批量更新/删除。请注意,如果使用 namedQuery
执行 UPDATE
/DELETE
,则需要指定 useExecuteUpdate
to true
,因为 camel 不会查找与查询和 nativeQuery
不同命名的查询。
53.3. 从端点消耗
从 JPA consumer 端点消耗消息会删除(或更新)数据库中实体 Bean。这样,您可以将数据库表用作逻辑队列:消费者从队列中获取消息,然后将其删除/更新来逻辑地从队列中删除它们。
如果您不想在处理时(以及路由完成后)删除实体 bean,您可以在 URI 中指定 consumeDelete=false
。这将导致处理每个轮询的实体。
如果您要对实体执行一些更新,将其标记为已处理(例如,将它从未来的查询中排除),那么您可以在处理实体 Bean 时给一个 @Consumed 标注方法,该方法将在实体 Bean 上调用(以及路由完成时)。
您可以使用 @PreConsumed,它会在处理之前在实体 bean 上调用(在路由之前)。
如果您消耗了大量行(100K+),并遇到 OutOfMemory 问题,您应该将 maximumResults 设置为 sensible 值。
53.4. URI 格式
jpa:entityClassName[?options]
要发送到端点,entityClassName
是可选的。如果指定,它可以帮助 Type Converter来确保正文是正确的类型。
为消耗,实体ClassName
是强制的。
53.5. 配置选项
Camel 组件在两个级别上配置:
- 组件级别
- 端点级别
53.5.1. 组件级别选项
组件级别是最高级别。您在此级别上定义的配置由所有端点继承。例如,一个组件可以具有安全设置、用于身份验证的凭证、用于网络连接的 url,等等。
因为组件通常会为最常见的情况预先配置了默认值,因此您可能需要配置几个组件选项,或者根本都不需要配置任何组件选项。
您可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,或使用 Java 代码直接配置组件。
53.5.2. 端点级别选项
在 Endpoint 级别,您可以使用多个选项来配置您希望端点执行的操作。这些选项根据端点是否用作消费者(来自)或作为生成者(to)用于两者的分类。
您可以直接在端点 URI 中配置端点作为 路径和
查询参数
。您还可以使用 Endpoint DSL 和 DataFormat DSL 作为在 Java 中配置端点和数据格式的安全 方法。
在配置选项时,对 urls、端口号、敏感信息和其他设置使用 Property Placeholders。
占位符允许您从代码外部化配置,为您提供更灵活且可重复使用的代码。
53.6. 组件选项
JPA 组件支持 9 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
别名 (common) | 将别名映射到 JPA 实体类。然后,别名可以在端点 URI (而不是完全限定类名称)中使用。 | Map | |
entityManagerFactory (common) | 使用 EntityManagerFactory。强烈建议您进行配置。 | EntityManagerFactory | |
joinTransaction (common) | camel-jpa 组件默认加入事务。您可以使用这个选项来关闭这个选项,例如,如果您使用 LOCAL_RESOURCE,并加入事务与 JPA 供应商无法工作。这个选项也可以在 JpaComponent 上全局设置,而不必在所有端点上设置它。 | true | 布尔值 |
sharedEntityManager (common) | 是否将 Spring 的 SharedEntityManager 用于 consumer/producer。在大多数情况下,joinTransaction 应设置为 false,因为这不是 EXTENDED EntityManager。 | false | 布尔值 |
transactionManager (common) | 使用 PlatformTransactionManager 管理事务。 | PlatformTransactionManager | |
transactionStrategy (common) | 使用 TransactionStrategy 在事务中运行操作。 | TransactionStrategy | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
53.6.1. 端点选项
JPA 端点使用 URI 语法进行配置:
jpa:entityType
使用以下路径和查询参数:
53.6.1.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
entityType (common) | 必需的 实体类名称。 | 类 |
53.6.1.2. 查询参数(44 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
joinTransaction (common) | camel-jpa 组件默认加入事务。您可以使用这个选项来关闭这个选项,例如,如果您使用 LOCAL_RESOURCE,并加入事务与 JPA 供应商无法工作。这个选项也可以在 JpaComponent 上全局设置,而不必在所有端点上设置它。 | true | 布尔值 |
maximumResults (common) | 设置在 Query 上检索的最大结果数。 | -1 | int |
namedQuery (common) | 使用命名查询。 | 字符串 | |
nativeQuery (common) | 使用自定义原生查询。在使用原生查询时,您可能还想使用选项 resultClass。 | 字符串 | |
PersistenceUnit ( common) | 需要 默认情况下使用的 JPA Persistence 单元。 | Camel | 字符串 |
query (common) | 使用自定义查询。 | 字符串 | |
resultClass (common) | 定义返回的有效负载的类型(我们将调用 entityManager.createNativeQuery (nativeQuery, resultClass)),而不是 entityManager.createNativeQuery (nativeQuery)。如果没有这个选项,我们将返回一个对象数组。仅在使用数据时与原生查询结合使用时具有影响。 | 类 | |
consumeDelete (consumer) | 如果为 true,则实体会在被使用后删除;如果为 false,则实体不会被删除。 | true | 布尔值 |
consumeLockEntity (consumer) | 指定是否在处理轮询结果时在每个实体 bean 上设置专用锁定。 | true | 布尔值 |
deleteHandler (consumer) | 使用自定义 DeleteHandler 在处理交换后删除行。 | DeleteHandler | |
lockModeType (consumer) | 在消费者上配置锁定模式。 Enum 值:
| PESSIMISTIC_WRITE | LockModeType |
maxMessagesPerPoll (consumer) | 整数值,用于定义每个轮询收集的最大消息数。默认情况下,不会设置最大值。可用于避免在启动服务器时轮询数千个消息。将值设为 0 或负数设置为 disable。 | int | |
preDeleteHandler (consumer) | 使用自定义 Pre-DeleteHandler 在消费者读取实体后删除行。 | DeleteHandler | |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
skipLockedEntity (consumer) | 配置是否在锁定时使用 NOWAIT,并静默跳过该实体。 | false | 布尔值 |
transacted (consumer) | 是否在处理整个批处理时以转换模式运行消费者,所有消息都将提交或回滚。默认行为(false)是提交所有之前成功处理的消息,仅回滚最后的失败消息。 | false | 布尔值 |
bridgeErrorHandler (consumer (advanced)) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
|