Camel Spring Boot 参考
前言
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 AMQP
从 Camel 1.2 开始
支持生成者和消费者
AMQP 组件支持使用 AMQP 项目的 JMS Client API 支持 AMQP 1.0 协议。http://qpid.apache.org/
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-amqp</artifactId> <version>${camel.version}</version> <!-- use the same version as your Camel core version --> </dependency>
1.1. URI 格式
amqp:[queue:|topic:]destinationName[?options]
1.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
1.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
1.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
1.3. 组件选项
AMQP 组件支持 100 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clientId (common) | 设置要使用的 JMS 客户端 ID。请注意,如果指定,这个值必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只适用于持久主题订阅。如果使用 Apache ActiveMQ,您可能更喜欢使用 Virtual Topics。 | 字符串 | |
ConnectionFactory (common) | 要使用的连接工厂。必须在组件或端点上配置连接工厂。 | ConnectionFactory | |
disableReplyTo (common) | 指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目的地发送回复。如果您希望 Camel 从路由中消耗,并且您不希望 Camel 自动发送回复消息,则可以使用此选项,因为代码中的另一个组件处理回复消息。如果要在不同的消息代理之间将 Camel 用作代理,并且希望将消息从一个系统路由到另一个系统,也可以使用此选项。 | false | 布尔值 |
durableSubscriptionName (common) | 用于指定持久主题订阅的可配置订阅者名称。还必须配置 clientId 选项。 | 字符串 | |
includeAmqpAnnotations (common) | 从 AMQP 到 Camel 消息映射时是否包含 AMQP 注解。把它设置为 true 会映射包含 JMS_AMQP_MA_ 前缀的 AMQP 消息注解到消息标头。由于 Apacheqpid 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 producer 也经过测试。 | false | 布尔值 |
acknowledgementModeName (consumer) | JMS 确认名称,其为: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE。 Enum 值:
| AUTO_ACKNOWLEDGE | 字符串 |
artemisConsumerPriority (consumer) | 通过消费者优先级,您可以确保高优先级消费者在消息处于活跃状态时收到消息。通常,连接到队列的活动消费者以轮循方式从它接收消息。当使用消费者优先级时,如果有多个具有相同高优先级的活跃用户,则消息将进行循环发送。只有高优先级消费者没有可用的信用消息或高优先级消费者接受消息时,消息才会降低优先级较低的消费者(例如,它不符合与消费者关联的任何选择器的条件)。 | int | |
asyncConsumer (consumer) | JmsConsumer 是否异步处理交换。如果启用,JmsConsumer 可以从 JMS 队列中提取下一个消息,而上一个消息则异步处理(通过 Asynchronous Routing Engine)。这意味着消息可能没有完全严格按照顺序进行处理。如果禁用(作为默认),则在 JmsConsumer 会从 JMS 队列中提取下一个消息前,会完全处理交换。请注意,如果启用了 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 执行 request/reply 时,选项 replyToConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | 1 | int |
maxConcurrentConsumers (consumer) | 指定从 JMS 消耗时的最大并发消费者数(而不是通过 JMS 请求/回复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当通过 JMS 执行请求/回复时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | int | |
replyToDeliveryPersistent (consumer) | 指定是否默认使用持久性交付进行回复。 | true | 布尔值 |
selector (consumer) | 设置要使用的 JMS 选择器。 | 字符串 | |
subscriptionDurable (consumer) | 设置是否使订阅持久化。可使用的 durable 订阅名称通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
subscriptionName (consumer) | 设置要创建的订阅名称。在带有共享或可升级订阅的主题(公共域)中应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注: 每个订阅都只允许 1 个并发消费者(这是此消息侦听器容器的默认值),但一个共享订阅(需要 JMS 2.0)除外。 | 字符串 | |
subscriptionShared (consumer) | 设置是否共享订阅。可以使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。请注意,共享的订阅也可能是危险的,因此此标志也可以与订阅相结合。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,则可能会考虑启用此选项,同时仍然在队列中排队消息。如果此选项为 false,并且您停止 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试 redeliveries (但可能会再次拒绝),最终消息可能会移到 JMS 代理上的死信队列中。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
allowReplyManagerQuickStop (consumer (advanced)) | 是否启用请求管理器中使用的 DefaultMessageListenerContainer,允许 DefaultMessageListenerContainer.runningAllowed 标志在 JmsConfigurationVirtualMachineisAcceptMessagesWhileStopping 时快速停止,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 用户中默认启用这种快速停止功能,但要为回复管理器启用这个标志。 | false | 布尔值 |
consumerType (consumer (advanced)) | 要使用的消费者类型,可以是 Simple、Default 或 Custom 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 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 带有最佳值 - 缓存线程池)。如果没有设置,则默认为之前的行为,它将缓存线程池用于消费者端点,而 SimpleAsync 用于回复用户。建议使用 ThreadPool 来减少弹性配置中线程垃圾箱,同时动态增加和减少并发用户。 Enum 值:
| DefaultTaskExecutorType | |
eagerLoadingOfProperties (consumer (advanced)) | 加载消息时立即启用 JMS 属性和有效负载的 eager 加载,因为 JMS 属性可能并不是必需的,但有时可能会捕获与底层 JMS 提供程序和使用 JMS 属性的早期问题。另请参阅选项 eagerPoisonBody。 | false | 布尔值 |
eagerPoisonBody (consumer (advanced)) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)是 poison (无法读取/映射),然后将这个文本设置为消息正文,因此可以处理消息( poison 的原因)已作为交换异常保存。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅 eagerLoadingOfProperties 选项。 | Poison JMS 消息,因为 $\{exception.message} | 字符串 |
exposeListenerSession (consumer (advanced)) | 指定在消耗消息时是否应公开监听程序会话。 | false | 布尔值 |
replyToConsumerType (consumer (advanced)) | 回复消费者的消费者类型(当执行请求/回复时),可以是 Simple、Default 或 Custom 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 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)) | 允许您指定自定义任务执行器以使用消息。 | TaskExecutor | |
deliveryDelay (producer) | 设置用于发送 JMS 发送调用的交付延迟。这个选项需要 JMS 2.0 兼容代理。 | -1 | long |
deliveryMode (producer) | 指定要使用的交付模式。可能的值是由 javax.jms.DeliveryMode 定义的值。NON_PERSISTENT = 1 和 PERSISTENT = 2。 Enum 值:
| 整数 | |
deliveryPersistent (producer) | 指定默认使用持久性交付。 | true | 布尔值 |
explicitQosEnabled (producer) | 设置在发送消息时使用 deliveryMode、priority 或 timeToLive 数量服务。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项(按消息粒度运行)相反,从 Camel In 消息标头中读取 QoS 属性。 | false | 布尔值 |
formatDateHeadersToIso8601 (producer) | 根据 ISO 8601 标准设置 JMS 日期属性是否应格式化。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
preserveMessageQos (producer) | 如果要使用消息中指定的 QoS 设置来发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中一些。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖端点中的值。与之相反,clearQosEnabled 选项将仅使用端点上设置的选项,而不使用来自消息标头中的值。 | false | 布尔值 |
priority (producer) | 大于 1 的值指定发送时的消息优先级(其中 1 是最低优先级,9 是最高)。必须启用 explicitQosEnabled 选项才能使此选项生效。 Enum 值:
| 4 | int |
replyToConcurrentConsumers (producer) | 指定执行请求/通过 JMS 回复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | 1 | int |
replyToMaxConcurrentConsumers (producer) | 指定在通过 JMS 使用请求/回复时的最大并发消费者数。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | int | |
replyToOnTimeoutMaxConcurrentConsumers (producer) | 指定使用请求/通过 JMS 时超时时继续路由的最大并发消费者数。 | 1 | int |
replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo 目的地,这将覆盖 replyTo 的设置。如果要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这非常有用。 | 字符串 | |
replyToType (producer) | 允许明确指定在执行 request/reply 时要用于 replyTo 队列的策略类型。可能的值有:Temporary、share 或 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 来不设置发送消息上的生存时间。然后,消息不会在接收器系统中过期。如需了解更多详细信息,请参见以下部分关于生存时间。 | false | 布尔值 |
forceSendOriginalMessage (producer (advanced)) | 当使用 mapJmsMessage=false Camel 时,如果在路由中涉及标头(get 或 set),则会创建一个新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true,以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly 发送到 JMS 目的地时适用(例如触发和忘记)。启用此选项将增强 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID。 | false | 布尔值 |
replyToCacheLevelName (producer (advanced)) | 在执行请求/通过 JMS 时,按名称为回复消费者设置缓存级别。这个选项仅在使用固定回复队列(而非临时)时才适用。Camel 默认将使用:CACHE_CONSUMER 用于专用或共享的 w/ replyToSelectorName。和 CACHE_SESSION 用于没有 replyToSelectorName 的共享。IBM WebSphere 等 JMS 代理可能需要设置 replyToCacheLevelName=CACHE_NONE 才能正常工作。注:如果使用临时队列,则不允许使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
replyToDestinationSelectorName (producer (advanced)) | 使用要使用的固定名称设置 JMS Selector,以便您可以在使用共享队列(也就是说,如果您不使用临时回复队列)时过滤来自其他回复的回复。 | 字符串 | |
streamMessageTypeEnabled (producer (advanced)) | 设置 StreamMessage 类型是否已启用。流类型的消息有效负载(如 files、InStream 等)将通过作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪种类型。默认情况下,使用 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 流模式进行优化。这可减少使用带有 JMS StreamMessage 类型的 Artemis 时的内存开销。只有在使用 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 | 布尔值 |
配置 (高级) | 使用共享的 JMS 配置。 | JmsConfiguration | |
destinationResolver (advanced) | 一个可插拔的 org.springframework.jms.support.destination.DestinationResolver,供您使用自己的解析器(例如,在 JNDI registry 中查找实际目的地)。 | DestinationResolver | |
errorHandler (advanced) | 指定在处理消息时引发任何未发现异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些例外将在 WARN 级别记录。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStack Trace 选项记录堆栈追踪。这样可以更容易配置,而不是需要对自定义错误处理程序进行代码。 | ErrorHandler | |
exceptionListener (advanced) | 指定针对任何底层 JMS 异常通知的 JMS Exception Listener。 | ExceptionListener | |
idleConsumerLimit (advanced) | 指定任何给定时间允许闲置的用户数量的限值。 | 1 | int |
idleTaskExecutionLimit (advanced) | 指定接收任务闲置执行的限制,不会在其执行中收到任何消息。如果达到这个限制,任务将关闭并将接收给其他执行任务(在动态调度时;请参阅 maxConcurrentConsumers 设置)。Spring 提供了额外的文档。 | 1 | int |
includeAllJMSXProperties (advanced) | 在从 JMS 到 Camel Message 映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则不会应用这个选项。 | false | 布尔值 |
jmsKeyFormatStrategy (advanced) | 编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供两个开箱即用的实现:default 和 passthrough。默认策略将安全地使用句点和连字符(. 和 -)。passthrough 策略将密钥保留原样。可用于不负责 JMS 标头密钥是否包含非法字符的 JMS 代理。您可以自行提供 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 sVirt 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
mapJmsMessage (advanced) | 指定 Camel 是否应该自动将收到的 JMS 消息映射到合适的有效负载类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
maxMessagesPerTask (advanced) | 每个任务的消息数量。-1 代表没有限制。如果您为并发消费者使用范围(例如 min max),则可以使用此选项将值设为 100,以控制消费者在需要较少的工作时可以缩小的速度。 | -1 | int |
messageConverter (advanced) | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
messageCreatedStrategy (advanced) | 使用给定的 MessageCreatedStrategy,当 Camel 发送 JMS 消息时,Camel 创建 javax.jms.Message 对象的新实例。 | MessageCreatedStrategy | |
messageIdEnabled (advanced) | 发送时,指定是否应添加消息 ID。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将消息 ID 设置为 null;如果提供程序忽略提示,则必须将消息 ID 设置为其普通唯一值。 | true | 布尔值 |
messageListenerContainerFactory (advanced) | MessageListenerContainerFactory 的 registry ID,用于决定要使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer。设置此项将自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
messageTimestampEnabled (advanced) | 指定在发送消息时是否默认启用时间戳。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将时间戳设置为零;如果提供程序忽略提示,则必须将时间戳设置为其正常值。 | 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 |
Sync (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
transferException (advanced) | 如果启用了且您使用 Request Reply messaging (InOut),并且 Exchange 失败在消费者端,则原因例外将作为 javax.jms.ObjectMessage 发回的响应。如果客户端是 Camel,则返回的例外将重新箭头。这样,您可以使用 Camel JMS 作为路由中的桥接 - 例如,使用持久性队列来启用强大的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。caught 异常需要可以被序列化。消费者端的原始例外可以嵌套在外部异常中,如 org.apache.camel.RuntimeCamelException。请谨慎使用它,因为数据正在使用 Java 对象序列化,要求接收者在类级别反序列化数据,这会强制在生产者和消费者之间进行强校准。 | false | 布尔值 |
transferExchange (advanced) | 您可以在有线线上传输交换,而不只是正文和标头。以下字段会被传输: 在 body, Out body, Fault body, In headers, Out headers, Fault header, Exchange properties, exchange exception.这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。您必须在制作者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换,而不是常规有效负载。请谨慎使用它,因为数据正在使用 Java 对象序列化,并且要求接收器能够在类级别上反序列化数据,这会强制在需要使用兼容 Camel 版本的生产者和消费者之间进行强大的协调。 | false | 布尔值 |
useMessageIDAsCorrelationID (advanced) | 指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在执行 request/reply over JMS 以及启用了 useMessageIDAsCorrelationID 时,等待 provisional correlation id 被更新到实际关联 ID 的次数。 | 50 | int |
waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 等待置备关联 ID 时每次休眠的时间间隔(以秒为单位)。 | 100 | long |
HeaderFilterStrategy (filter) | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 将标头过滤到或从 Camel 消息过滤。 | HeaderFilterStrategy | |
errorHandlerLoggingLevel (logging) | 允许为日志记录 uncaught 异常配置默认 errorHandler 日志记录级别。 Enum 值:
| WARN | LoggingLevel |
errorHandlerLogStackTrace (logging) | 允许通过默认错误处理程序来控制是否应记录 stacktraces。 | true | 布尔值 |
密码 (安全) | 与 ConnectionFactory 一起使用的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
用户名 (安全) | 与 ConnectionFactory 一起使用的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
Transacted (transaction) | 指定是否使用转换模式。 | false | 布尔值 |
TransactedInOut (transaction) | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式,如果此标志被设置为 true,则 Spring JmsTemplate 将把 sessionTransacted 设置为 true,而 confirmMode 作为转换用于 InOut 操作。请注意:在 JTA 事务中,传递给 createQueue 的参数不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值做出自己的决策。类似地,这些参数不会考虑本地管理的事务,因为 Spring JMS 在这种情况下在现有 JMS 会话上运行。在受管事务外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(除 XA 事务之外)时同步的本地 JMS 事务。这与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务)的影响,在主事务后 JMS 事务提交右侧的 JMS 事务。 | false | 布尔值 |
lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,Camel 将创建一个 JmsTransactionManager,如果没有在选项 transacted=true 时注入 transactionManager。 | true | 布尔值 |
transactionManager (transaction (advanced)) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
transactionTimeout (transaction (advanced)) | 如果使用转换模式,事务的超时值(以秒为单位)。 | -1 | int |
1.4. 端点选项
AMQP 端点使用 URI 语法进行配置:
amqp:destinationType:destinationName
使用以下路径和查询参数:
1.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
destinationType (common) | 要使用的目标种类。 Enum 值:
| queue | 字符串 |
destinationName (common) | 用作目的地的队列或主题 所需的 名称。 | 字符串 |
1.4.2. 查询参数(96 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clientId (common) | 设置要使用的 JMS 客户端 ID。请注意,如果指定,这个值必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只适用于持久主题订阅。如果使用 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 producer 也经过测试。 | false | 布尔值 |
acknowledgementModeName (consumer) | JMS 确认名称,其为: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE。 Enum 值:
| AUTO_ACKNOWLEDGE | 字符串 |
artemisConsumerPriority (consumer) | 通过消费者优先级,您可以确保高优先级消费者在消息处于活跃状态时收到消息。通常,连接到队列的活动消费者以轮循方式从它接收消息。当使用消费者优先级时,如果有多个具有相同高优先级的活跃用户,则消息将进行循环发送。只有高优先级消费者没有可用的信用消息或高优先级消费者接受消息时,消息才会降低优先级较低的消费者(例如,它不符合与消费者关联的任何选择器的条件)。 | int | |
asyncConsumer (consumer) | JmsConsumer 是否异步处理交换。如果启用,JmsConsumer 可以从 JMS 队列中提取下一个消息,而上一个消息则异步处理(通过 Asynchronous Routing Engine)。这意味着消息可能没有完全严格按照顺序进行处理。如果禁用(作为默认),则在 JmsConsumer 会从 JMS 队列中提取下一个消息前,会完全处理交换。请注意,如果启用了 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 执行 request/reply 时,选项 replyToConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | 1 | int |
maxConcurrentConsumers (consumer) | 指定从 JMS 消耗时的最大并发消费者数(而不是通过 JMS 请求/回复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当通过 JMS 执行请求/回复时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | int | |
replyToDeliveryPersistent (consumer) | 指定是否默认使用持久性交付进行回复。 | true | 布尔值 |
selector (consumer) | 设置要使用的 JMS 选择器。 | 字符串 | |
subscriptionDurable (consumer) | 设置是否使订阅持久化。可使用的 durable 订阅名称通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
subscriptionName (consumer) | 设置要创建的订阅名称。在带有共享或可升级订阅的主题(公共域)中应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注: 每个订阅都只允许 1 个并发消费者(这是此消息侦听器容器的默认值),但一个共享订阅(需要 JMS 2.0)除外。 | 字符串 | |
subscriptionShared (consumer) | 设置是否共享订阅。可以使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。请注意,共享的订阅也可能是危险的,因此此标志也可以与订阅相结合。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,则可能会考虑启用此选项,同时仍然在队列中排队消息。如果此选项为 false,并且您停止 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试 redeliveries (但可能会再次拒绝),最终消息可能会移到 JMS 代理上的死信队列中。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
allowReplyManagerQuickStop (consumer (advanced)) | 是否启用请求管理器中使用的 DefaultMessageListenerContainer,允许 DefaultMessageListenerContainer.runningAllowed 标志在 JmsConfigurationVirtualMachineisAcceptMessagesWhileStopping 时快速停止,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 用户中默认启用这种快速停止功能,但要为回复管理器启用这个标志。 | false | 布尔值 |
consumerType (consumer (advanced)) | 要使用的消费者类型,可以是 Simple、Default 或 Custom 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 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 带有最佳值 - 缓存线程池)。如果没有设置,则默认为之前的行为,它将缓存线程池用于消费者端点,而 SimpleAsync 用于回复用户。建议使用 ThreadPool 来减少弹性配置中线程垃圾箱,同时动态增加和减少并发用户。 Enum 值:
| DefaultTaskExecutorType | |
eagerLoadingOfProperties (consumer (advanced)) | 加载消息时立即启用 JMS 属性和有效负载的 eager 加载,因为 JMS 属性可能并不是必需的,但有时可能会捕获与底层 JMS 提供程序和使用 JMS 属性的早期问题。另请参阅选项 eagerPoisonBody。 | false | 布尔值 |
eagerPoisonBody (consumer (advanced)) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)是 poison (无法读取/映射),然后将这个文本设置为消息正文,因此可以处理消息( poison 的原因)已作为交换异常保存。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅 eagerLoadingOfProperties 选项。 | Poison JMS 消息,因为 $\{exception.message} | 字符串 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
exposeListenerSession (consumer (advanced)) | 指定在消耗消息时是否应公开监听程序会话。 | false | 布尔值 |
replyToConsumerType (consumer (advanced)) | 回复消费者的消费者类型(当执行请求/回复时),可以是 Simple、Default 或 Custom 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 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)) | 允许您指定自定义任务执行器以使用消息。 | TaskExecutor | |
deliveryDelay (producer) | 设置用于发送 JMS 发送调用的交付延迟。这个选项需要 JMS 2.0 兼容代理。 | -1 | long |
deliveryMode (producer) | 指定要使用的交付模式。可能的值是由 javax.jms.DeliveryMode 定义的值。NON_PERSISTENT = 1 和 PERSISTENT = 2。 Enum 值:
| 整数 | |
deliveryPersistent (producer) | 指定默认使用持久性交付。 | true | 布尔值 |
explicitQosEnabled (producer) | 设置在发送消息时使用 deliveryMode、priority 或 timeToLive 数量服务。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项(按消息粒度运行)相反,从 Camel In 消息标头中读取 QoS 属性。 | false | 布尔值 |
formatDateHeadersToIso8601 (producer) | 根据 ISO 8601 标准设置 JMS 日期属性是否应格式化。 | false | 布尔值 |
preserveMessageQos (producer) | 如果要使用消息中指定的 QoS 设置来发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中一些。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖端点中的值。与之相反,clearQosEnabled 选项将仅使用端点上设置的选项,而不使用来自消息标头中的值。 | false | 布尔值 |
priority (producer) | 大于 1 的值指定发送时的消息优先级(其中 1 是最低优先级,9 是最高)。必须启用 explicitQosEnabled 选项才能使此选项生效。 Enum 值:
| 4 | int |
replyToConcurrentConsumers (producer) | 指定执行请求/通过 JMS 回复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | 1 | int |
replyToMaxConcurrentConsumers (producer) | 指定在通过 JMS 使用请求/回复时的最大并发消费者数。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | int | |
replyToOnTimeoutMaxConcurrentConsumers (producer) | 指定使用请求/通过 JMS 时超时时继续路由的最大并发消费者数。 | 1 | int |
replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo 目的地,这将覆盖 replyTo 的设置。如果要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这非常有用。 | 字符串 | |
replyToType (producer) | 允许明确指定在执行 request/reply 时要用于 replyTo 队列的策略类型。可能的值有:Temporary、share 或 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 来不设置发送消息上的生存时间。然后,消息不会在接收器系统中过期。如需了解更多详细信息,请参见以下部分关于生存时间。 | false | 布尔值 |
forceSendOriginalMessage (producer (advanced)) | 当使用 mapJmsMessage=false Camel 时,如果在路由中涉及标头(get 或 set),则会创建一个新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true,以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly 发送到 JMS 目的地时适用(例如触发和忘记)。启用此选项将增强 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID。 | false | 布尔值 |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
replyToCacheLevelName (producer (advanced)) | 在执行请求/通过 JMS 时,按名称为回复消费者设置缓存级别。这个选项仅在使用固定回复队列(而非临时)时才适用。Camel 默认将使用:CACHE_CONSUMER 用于专用或共享的 w/ replyToSelectorName。和 CACHE_SESSION 用于没有 replyToSelectorName 的共享。IBM WebSphere 等 JMS 代理可能需要设置 replyToCacheLevelName=CACHE_NONE 才能正常工作。注:如果使用临时队列,则不允许使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
replyToDestinationSelectorName (producer (advanced)) | 使用要使用的固定名称设置 JMS Selector,以便您可以在使用共享队列(也就是说,如果您不使用临时回复队列)时过滤来自其他回复的回复。 | 字符串 | |
streamMessageTypeEnabled (producer (advanced)) | 设置 StreamMessage 类型是否已启用。流类型的消息有效负载(如 files、InStream 等)将通过作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪种类型。默认情况下,使用 BytesMessage 来强制整个消息有效负载读取到内存中。通过启用此选项,消息有效负载以块的形式读取到内存中,然后每个块都会写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
allowSerializedHeaders (advanced) | 控制是否包含序列化标头。仅在 transferExchange 为 true 时才适用。这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。 | false | 布尔值 |
artemisStreamingEnabled (advanced) | 是否针对 Apache Artemis 流模式进行优化。这可减少使用带有 JMS StreamMessage 类型的 Artemis 时的内存开销。只有在使用 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 registry 中查找实际目的地)。 | DestinationResolver | |
errorHandler (advanced) | 指定在处理消息时引发任何未发现异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些例外将在 WARN 级别记录。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStack Trace 选项记录堆栈追踪。这样可以更容易配置,而不是需要对自定义错误处理程序进行代码。 | 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 Message 映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则不会应用这个选项。 | false | 布尔值 |
jmsKeyFormatStrategy (advanced) | 编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供两个开箱即用的实现:default 和 passthrough。默认策略将安全地使用句点和连字符(. 和 -)。passthrough 策略将密钥保留原样。可用于不负责 JMS 标头密钥是否包含非法字符的 JMS 代理。您可以自行提供 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 sVirt 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
mapJmsMessage (advanced) | 指定 Camel 是否应该自动将收到的 JMS 消息映射到合适的有效负载类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
maxMessagesPerTask (advanced) | 每个任务的消息数量。-1 代表没有限制。如果您为并发消费者使用范围(例如 min max),则可以使用此选项将值设为 100,以控制消费者在需要较少的工作时可以缩小的速度。 | -1 | int |
messageConverter (advanced) | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
messageCreatedStrategy (advanced) | 使用给定的 MessageCreatedStrategy,当 Camel 发送 JMS 消息时,Camel 创建 javax.jms.Message 对象的新实例。 | MessageCreatedStrategy | |
messageIdEnabled (advanced) | 发送时,指定是否应添加消息 ID。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将消息 ID 设置为 null;如果提供程序忽略提示,则必须将消息 ID 设置为其普通唯一值。 | true | 布尔值 |
messageListenerContainerFactory (advanced) | MessageListenerContainerFactory 的 registry ID,用于决定要使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer。设置此项将自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
messageTimestampEnabled (advanced) | 指定在发送消息时是否默认启用时间戳。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将时间戳设置为零;如果提供程序忽略提示,则必须将时间戳设置为其正常值。 | true | 布尔值 |
pubSubNoLocal (advanced) | 指定是否禁止自己连接发布的消息的发送。 | false | 布尔值 |
receiveTimeout (advanced) | 接收消息的超时时间(以毫秒为单位)。 | 1000 | long |
recoveryInterval (advanced) | 指定恢复尝试之间的间隔,即当连接被刷新时,以毫秒为单位。默认值为 5000 ms,即 5 秒。 | 5000 | long |
requestTimeoutCheckerInterval (advanced) | 配置 Camel 在执行请求/通过 JMS 回复时应检查超时交换的频率。默认情况下,Camel 会每秒检查一次。但是,如果发生超时时,您必须更快地响应,那么您可以降低这个间隔,以便更频繁地检查。超时由选项 requestTimeout 决定。 | 1000 | long |
Sync (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
transferException (advanced) | 如果启用了且您使用 Request Reply messaging (InOut),并且 Exchange 失败在消费者端,则原因例外将作为 javax.jms.ObjectMessage 发回的响应。如果客户端是 Camel,则返回的例外将重新箭头。这样,您可以使用 Camel JMS 作为路由中的桥接 - 例如,使用持久性队列来启用强大的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。caught 异常需要可以被序列化。消费者端的原始例外可以嵌套在外部异常中,如 org.apache.camel.RuntimeCamelException。请谨慎使用它,因为数据正在使用 Java 对象序列化,要求接收者在类级别反序列化数据,这会强制在生产者和消费者之间进行强校准。 | false | 布尔值 |
transferExchange (advanced) | 您可以在有线线上传输交换,而不只是正文和标头。以下字段会被传输: 在 body, Out body, Fault body, In headers, Out headers, Fault header, Exchange properties, exchange exception.这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。您必须在制作者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换,而不是常规有效负载。请谨慎使用它,因为数据正在使用 Java 对象序列化,并且要求接收器能够在类级别上反序列化数据,这会强制在需要使用兼容 Camel 版本的生产者和消费者之间进行强大的协调。 | false | 布尔值 |
useMessageIDAsCorrelationID (advanced) | 指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在执行 request/reply over JMS 以及启用了 useMessageIDAsCorrelationID 时,等待 provisional correlation id 被更新到实际关联 ID 的次数。 | 50 | int |
waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 等待置备关联 ID 时每次休眠的时间间隔(以秒为单位)。 | 100 | long |
errorHandlerLoggingLevel (logging) | 允许为日志记录 uncaught 异常配置默认 errorHandler 日志记录级别。 Enum 值:
| WARN | LoggingLevel |
errorHandlerLogStackTrace (logging) | 允许通过默认错误处理程序来控制是否应记录 stacktraces。 | true | 布尔值 |
密码 (安全) | 与 ConnectionFactory 一起使用的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
用户名 (安全) | 与 ConnectionFactory 一起使用的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
Transacted (transaction) | 指定是否使用转换模式。 | false | 布尔值 |
TransactedInOut (transaction) | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式,如果此标志被设置为 true,则 Spring JmsTemplate 将把 sessionTransacted 设置为 true,而 confirmMode 作为转换用于 InOut 操作。请注意:在 JTA 事务中,传递给 createQueue 的参数不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值做出自己的决策。类似地,这些参数不会考虑本地管理的事务,因为 Spring JMS 在这种情况下在现有 JMS 会话上运行。在受管事务外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(除 XA 事务之外)时同步的本地 JMS 事务。这与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务)的影响,在主事务后 JMS 事务提交右侧的 JMS 事务。 | false | 布尔值 |
lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,Camel 将创建一个 JmsTransactionManager,如果没有在选项 transacted=true 时注入 transactionManager。 | true | 布尔值 |
transactionManager (transaction (advanced)) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
transactionTimeout (transaction (advanced)) | 如果使用转换模式,事务的超时值(以秒为单位)。 | -1 | int |
1.5. 使用方法
当 AMQP 组件继承自 JMS 组件时,前者的使用与后者几乎相同:
使用 AMQP 组件
// Consuming from AMQP queue from("amqp:queue:incoming"). to(...); // Sending message to the AMQP topic from(...). to("amqp:topic:notify");
1.6. 配置 AMQP 组件
创建 AMQP 1.0 组件
AMQPComponent amqp = AMQPComponent.amqpComponent("amqp://localhost:5672"); AMQPComponent authorizedAmqp = AMQPComponent.amqpComponent("amqp://localhost:5672", "user", "password");
您还可以将 org.apache.camel.component.amqp.amqpConnectionDetails 的实例
添加到 registry 中,以便自动配置 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 方法
CDI 的 AMQP 连接详情自动配置
@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 客户端配置。
1.7. 使用主题
要使用使用 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在ComponentamqpComponent ()
方法和 AMQPConnectionDetails
都预先配置带有主题前缀的组件,因此您不必显式配置它。
1.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 amqp 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-amqp-starter</artifactId> </dependency>
组件支持 101 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.amqp.accept-messages-while-stopping | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,则可能会考虑启用此选项,同时仍然在队列中排队消息。如果此选项为 false,并且您停止 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试 redeliveries (但可能会再次拒绝),最终消息可能会移到 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,允许 DefaultMessageListenerContainer.runningAllowed 标志在 JmsConfigurationVirtualMachineisAcceptMessagesWhileStopping 时快速停止,并且 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 流模式进行优化。这可减少使用带有 JMS StreamMessage 类型的 Artemis 时的内存开销。只有在使用 Apache Artemis 时,才必须启用这个选项。 | false | 布尔值 |
camel.component.amqp.async-consumer | JmsConsumer 是否异步处理交换。如果启用,JmsConsumer 可以从 JMS 队列中提取下一个消息,而上一个消息则异步处理(通过 Asynchronous Routing Engine)。这意味着消息可能没有完全严格按照顺序进行处理。如果禁用(作为默认),则在 JmsConsumer 会从 JMS 队列中提取下一个消息前,会完全处理交换。请注意,如果启用了 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 连接实例使用。它通常只适用于持久主题订阅。如果使用 Apache ActiveMQ,您可能更喜欢使用 Virtual Topics。 | 字符串 | |
camel.component.amqp.concurrent-consumers | 指定从 JMS 消耗时的默认并发消费者数量(而不是通过 JMS 请求/回复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当通过 JMS 执行 request/reply 时,选项 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 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 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 带有最佳值 - 缓存线程池)。如果没有设置,则默认为之前的行为,它将缓存线程池用于消费者端点,而 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 registry 中查找实际目的地)。选项是一个 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 来不设置发送消息上的生存时间。然后,消息不会在接收器系统中过期。如需了解更多详细信息,请参见以下部分关于生存时间。 | 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 的原因)已作为交换异常保存。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅 eagerLoadingOfProperties 选项。 | Poison JMS 消息,因为 $\{exception.message} | 字符串 |
camel.component.amqp.enabled | 是否启用 amqp 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.amqp.error-handler | 指定在处理消息时引发任何未发现异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些例外将在 WARN 级别记录。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStack Trace 选项记录堆栈追踪。这样可以更容易配置,而不是需要对自定义错误处理程序进行代码。选项是一个 org.springframework.util.ErrorHandler 类型。 | ErrorHandler | |
camel.component.amqp.error-handler-log-stack-trace | 允许通过默认错误处理程序来控制是否应记录 stacktraces。 | true | 布尔值 |
camel.component.amqp.error-handler-logging-level | 允许为日志记录 uncaught 异常配置默认 errorHandler 日志记录级别。 | LoggingLevel | |
camel.component.amqp.exception-listener | 指定针对任何底层 JMS 异常通知的 JMS Exception Listener。选项是 javax.jms.ExceptionListener 类型。 | ExceptionListener | |
camel.component.amqp.explicit-qos-enabled | 设置在发送消息时使用 deliveryMode、priority 或 timeToLive 数量服务。这个选项基于 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 | 根据 ISO 8601 标准设置 JMS 日期属性是否应格式化。 | 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 Message 映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则不会应用这个选项。 | false | 布尔值 |
camel.component.amqp.include-amqp-annotations | 从 AMQP 到 Camel 消息映射时是否包含 AMQP 注解。把它设置为 true 会映射包含 JMS_AMQP_MA_ 前缀的 AMQP 消息注解到消息标头。由于 Apacheqpid JMS API 中的限制,当前交付注解将被忽略。 | false | 布尔值 |
camel.component.amqp.include-sent-jms-message-id | 仅在使用 InOnly 发送到 JMS 目的地时适用(例如触发和忘记)。启用此选项将增强 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID。 | false | 布尔值 |
camel.component.amqp.jms-key-format-strategy | 编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供两个开箱即用的实现:default 和 passthrough。默认策略将安全地使用句点和连字符(. 和 -)。passthrough 策略将密钥保留原样。可用于不负责 JMS 标头密钥是否包含非法字符的 JMS 代理。您可以自行提供 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 sVirt 表示法引用它。 | 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),则可以使用此选项将值设为 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 | 使用给定的 MessageCreatedStrategy,当 Camel 发送 JMS 消息时,Camel 创建 javax.jms.Message 对象的新实例。选项是一个 org.apache.camel.component.jms.MessageCreatedStrategy 类型。 | MessageCreatedStrategy | |
camel.component.amqp.message-id-enabled | 发送时,指定是否应添加消息 ID。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将消息 ID 设置为 null;如果提供程序忽略提示,则必须将消息 ID 设置为其普通唯一值。 | true | 布尔值 |
camel.component.amqp.message-listener-container-factory | MessageListenerContainerFactory 的 registry ID,用于决定要使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer。设置此项将自动将 consumerType 设置为 Custom。选项是 org.apache.camel.component.jms.MessageListenerContainerFactory 类型。 | MessageListenerContainerFactory | |
camel.component.amqp.message-timestamp-enabled | 指定在发送消息时是否默认启用时间戳。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将时间戳设置为零;如果提供程序忽略提示,则必须将时间戳设置为其正常值。 | true | 布尔值 |
camel.component.amqp.password | 与 ConnectionFactory 一起使用的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
camel.component.amqp.preserve-message-qos | 如果要使用消息中指定的 QoS 设置来发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中一些。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖端点中的值。与之相反,clearQosEnabled 选项将仅使用端点上设置的选项,而不使用来自消息标头中的值。 | 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 用于专用或共享的 w/ replyToSelectorName。和 CACHE_SESSION 用于没有 replyToSelectorName 的共享。IBM WebSphere 等 JMS 代理可能需要设置 replyToCacheLevelName=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 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 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 | 允许明确指定在执行 request/reply 时要用于 replyTo 队列的策略类型。可能的值有:Temporary、share 或 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 类型是否已启用。流类型的消息有效负载(如 files、InStream 等)将通过作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪种类型。默认情况下,使用 BytesMessage 来强制整个消息有效负载读取到内存中。通过启用此选项,消息有效负载以块的形式读取到内存中,然后每个块都会写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
camel.component.amqp.subscription-durable | 设置是否使订阅持久化。可使用的 durable 订阅名称通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
camel.component.amqp.subscription-name | 设置要创建的订阅名称。在带有共享或可升级订阅的主题(公共域)中应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注: 每个订阅都只允许 1 个并发消费者(这是此消息侦听器容器的默认值),但一个共享订阅(需要 JMS 2.0)除外。 | 字符串 | |
camel.component.amqp.subscription-shared | 设置是否共享订阅。可以使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。请注意,共享的订阅也可能是危险的,因此此标志也可以与订阅相结合。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
camel.component.amqp.synchronous | 设置是否应严格使用同步处理。 | false | 布尔值 |
camel.component.amqp.task-executor | 允许您指定自定义任务执行器以使用消息。选项是一个 org.springframework.core.task.TaskExecutor 类型。 | TaskExecutor | |
camel.component.amqp.test-connection-on-startup | 指定是否在启动时测试连接。这样可确保 Camel 启动所有 JMS 用户与 JMS 代理的有效连接。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS producer 也经过测试。 | false | 布尔值 |
camel.component.amqp.time-to-live | 发送消息时,指定消息的时间到时间(以毫秒为单位)。 | -1 | Long |
camel.component.amqp.transacted | 指定是否使用转换模式。 | false | 布尔值 |
camel.component.amqp.transacted-in-out | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式,如果此标志被设置为 true,则 Spring JmsTemplate 将把 sessionTransacted 设置为 true,而 confirmMode 作为转换用于 InOut 操作。请注意:在 JTA 事务中,传递给 createQueue 的参数不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值做出自己的决策。类似地,这些参数不会考虑本地管理的事务,因为 Spring JMS 在这种情况下在现有 JMS 会话上运行。在受管事务外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(除 XA 事务之外)时同步的本地 JMS 事务。这与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务)的影响,在主事务后 JMS 事务提交右侧的 JMS 事务。 | false | 布尔值 |
camel.component.amqp.transaction-manager | 要使用的 Spring 事务管理器。选项是一个 org.springframework.transaction.platformTransactionManager 类型。 | PlatformTransactionManager | |
camel.component.amqp.transaction-name | 要使用的事务的名称。 | 字符串 | |
camel.component.amqp.transaction-timeout | 如果使用转换模式,事务的超时值(以秒为单位)。 | -1 | 整数 |
camel.component.amqp.transfer-exception | 如果启用了且您使用 Request Reply messaging (InOut),并且 Exchange 失败在消费者端,则原因例外将作为 javax.jms.ObjectMessage 发回的响应。如果客户端是 Camel,则返回的例外将重新箭头。这样,您可以使用 Camel JMS 作为路由中的桥接 - 例如,使用持久性队列来启用强大的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。caught 异常需要可以被序列化。消费者端的原始例外可以嵌套在外部异常中,如 org.apache.camel.RuntimeCamelException。请谨慎使用它,因为数据正在使用 Java 对象序列化,要求接收者在类级别反序列化数据,这会强制在生产者和消费者之间进行强校准。 | false | 布尔值 |
camel.component.amqp.transfer-exchange | 您可以在有线线上传输交换,而不只是正文和标头。以下字段会被传输: 在 body, Out body, Fault body, In headers, Out headers, Fault header, 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 | 在执行 request/reply over JMS 以及启用了 useMessageIDAsCorrelationID 时,等待 provisional correlation id 被更新到实际关联 ID 的次数。 | 50 | 整数 |
camel.component.amqp.wait-for-provision-correlation-to-be-updated-thread-sleeping-time | 等待置备关联 ID 时每次休眠的时间间隔(以秒为单位)。选项是一个长类型。 | 100 | Long |
第 2 章 AWS CloudWatch
仅支持生成者
AWS2 Cloudwatch 组件允许消息发送到 Amazon CloudWatch 指标。Amazon API 的实现由 AWS SDK 提供。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并有权使用 Amazon CloudWatch。如需更多信息,请参阅 Amazon CloudWatch。
2.1. URI 格式
aws2-cw://namespace[?options]
如果指标不存在,则会创建它们。您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
2.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
2.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
2.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
2.3. 组件选项
AWS 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 密钥。 | 字符串 |
2.4. 端点选项
AWS CloudWatch 端点使用 URI 语法进行配置:
aws2-cw:namespace
使用以下路径和查询参数:
2.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
namespace (producer) | 必需的 指标命名空间。 | 字符串 |
2.4.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。
2.5. 使用方法
2.5.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 凭证文档
2.5.2. 由 CW producer 评估的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| Amazon CW 指标名称。 |
|
| Amazon CW 指标值。 |
|
| Amazon CW 指标单元。 |
|
| Amazon CW 指标命名空间。 |
|
| Amazon CW 指标时间戳。 |
|
| Amazon CW 指标维度名称。 |
|
| Amazon CW 指标维度值。 |
|
| 维度名称和维度值的映射. |
2.5.3. 高级 CloudWatchClient 配置
如果您需要对 CloudWatchClient
实例配置进行更多控制,您可以创建自己的实例并从 URI 引用它:
from("direct:start") .to("aws2-cw://namespace?amazonCwClient=#client");
#client
指的是 Registry 中的一个 CloudWatchClient
。
2.6. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-cw</artifactId> <version>${camel-version}</version> </dependency>
其中 {camel-version
} 必须替换为 Camel 的实际版本。
2.7. 例子
2.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");
2.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-cw 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-cw-starter</artifactId> </dependency>
组件支持 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 | 指标值。 | å�Œ |
第 3 章 AWS DynamoDB
仅支持生成者
AWS2 DynamoDB 组件支持从/向服务存储和检索数据。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并签名以使用 Amazon DynamoDB。如需更多信息,请参阅 Amazon DynamoDB。
3.1. URI 格式
aws2-ddb://domainName[?options]
您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
3.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
3.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
3.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
3.3. 组件选项
AWS 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 密钥。 | 字符串 |
3.4. 端点选项
AWS DynamoDB 端点使用 URI 语法进行配置:
aws2-ddb:tableName
使用以下路径和查询参数:
3.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
tableName (producer) | 需要 当前有效的表的名称。 | 字符串 |
3.4.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。
3.5. 使用方法
3.5.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 凭证文档
3.5.2. 由 DDB producer 评估的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 表名称和对应项目的映射,由主密钥获取。 |
|
| 此操作的表名称。 |
|
| 唯一标识表中的每个项目的主要键。 |
|
| 如果您要在修改前或之后获取属性 name-value 对(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW),则使用此参数。 |
|
| 为条件修改指定属性。 |
|
| 如果没有指定属性名称,则返回所有属性。 |
|
| 如果设置为 true,则会发出一致的读取,否则最终会使用一致性。 |
|
| 如果设置将用作查询操作的 Secondary Index。 |
|
| 项目的属性映射,必须包含定义项目的主要键值。 |
|
| 如果设置为 true,Amazon DynamoDB 会返回与查询参数匹配的项目总数,而不是匹配的项目及其属性的列表。 |
|
| 此标头指定查询的选择条件,并合并两个旧的标头 CamelAwsDdbHashKeyValue 和 CamelAwsDdbScanRangeKeyCondition |
|
| 项目的主密钥,以便从中继续之前的查询。 |
|
| 复合主密钥的 hash 组件的值。 |
|
| 要返回的项目的最大数量。 |
|
| 用于查询的属性值和比较运算符的容器。 |
|
| 指定索引的正向和反向遍历。 |
|
| 评估扫描结果,仅返回所需的值。 |
|
| 将属性名称映射到更新的新值和操作。 |
3.5.3. 在 BatchGetItems 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 表名称以及对应的项目属性。 |
|
| 包含表映射及其对应的键,这些键没有使用当前响应进行处理。 |
3.5.4. 在 DeleteItem 操作过程中设置消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
3.5.5. 在 DeleteTable 操作过程中设置消息标头
标头 | 类型 | 描述 |
---|---|---|
| ||
| 此表的 ProvisionedThroughput 属性的值 | |
|
| 此表的创建 DateTime。 |
|
| 此表的项目数。 |
|
| 标识此表的主键的 KeySchema。在 Camel 2.16.0 中,此标头的类型是 List<KeySchemaElement> 而不是 KeySchema |
|
| 表名称。 |
|
| 表大小(以字节为单位)。 |
|
| 表的状态:CREATING, UPDATING, DELETING, ACTIVE |
3.5.6. 在 DescribeTable 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
| \{{ProvisionedThroughputDescription}} | 此表的 ProvisionedThroughput 属性的值 |
|
| 此表的创建 DateTime。 |
|
| 此表的项目数。 |
| \{{KeySchema}} | 标识此表的主键的 KeySchema。 |
|
| 表名称。 |
|
| 表大小(以字节为单位)。 |
|
| 表的状态:CREATING, UPDATING, DELETING, ACTIVE |
|
| 此表的 ReadCapacityUnits 属性。 |
|
| 此表的 WriteCapacityUnits 属性。 |
3.5.7. 在 GetItem 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
3.5.8. 在 PutItem 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
3.5.9. 在 Query 操作过程中设置消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
|
| 查询操作停止的项目的主要键,其中包含上一个结果集。 |
|
| 操作期间消耗的表的置备吞吐量数。 |
|
| 响应中的项目数。 |
3.5.10. 扫描操作期间设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
|
| 查询操作停止的项目的主要键,其中包含上一个结果集。 |
|
| 操作期间消耗的表的置备吞吐量数。 |
|
| 响应中的项目数。 |
|
| 应用任何过滤器前,完成扫描中的项目数。 |
3.5.11. 在 UpdateItem 操作过程中设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 操作返回的属性列表。 |
3.5.12. 高级 AmazonDynamoDB 配置
如果您需要对 AmazonDynamoDB
实例配置进行更多控制,您可以创建自己的实例并从 URI 引用它:
from("direct:start") .to("aws2-ddb://domainName?amazonDDBClient=#client");
#client
指的是 Registry 中的 DynamoDbClient
。
3.6. 支持的制作者操作
- BatchGetItems
- DeleteItem
- DeleteTable
- DescribeTable
- GetItem
- PutItem
- 查询
- 扫描
- UpdateItem
- UpdateTable
3.7. 例子
3.7.1. 生成者示例
- PutItem:此操作将在 DynamoDB 中创建一个条目
from("direct:start") .setHeader(Ddb2Constants.OPERATION, Ddb2Operations.PutItem) .setHeader(Ddb2Constants.CONSISTENT_READ, "true") .setHeader(Ddb2Constants.RETURN_VALUES, "ALL_OLD") .setHeader(Ddb2Constants.ITEM, attributeMap) .setHeader(Ddb2Constants.ATTRIBUTE_NAMES, attributeMap.keySet()); .to("aws2-ddb://" + tableName + "?keyAttributeName=" + attributeName + "&keyAttributeType=" + KeyType.HASH + "&keyScalarType=" + ScalarAttributeType.S + "&readCapacity=1&writeCapacity=1");
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-ddb</artifactId> <version>${camel-version}</version> </dependency>
其中 3.18.3
必须替换为 Camel 的实际版本。
3.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-ddb 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-ddb-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 4 章 AWS Kinesis
支持生成者和消费者
AWS2 Kinesis 组件支持接收来自 Amazon Kinesis (不支持 Batch)服务的信息。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并使用 Amazon Kinesis 注册。如需更多信息,请参阅 AWS Kinesis。
4.1. URI 格式
aws2-kinesis://stream-name[?options]
需要在使用前创建流。您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
4.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
4.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
4.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
4.3. 组件选项
AWS Kinesis 组件支持 22 个选项,如下所列。
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 | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
accessKey (security) | Amazon AWS 访问密钥. | 字符串 | |
secretKey (security) | Amazon AWS Secret 密钥。 | 字符串 |
4.4. 端点选项
AWS Kinesis 端点使用 URI 语法进行配置:
aws2-kinesis:streamName
使用以下路径和查询参数:
4.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
streamName (common) | 流必需的名称。 | 字符串 |
4.4.2. 查询参数 (38 参数)
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 | 布尔值 |
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 密钥。 | 字符串 |
所需的 Kinesis 组件选项
您必须在 Registry 中提供 KinesisClient,并配置了代理和相关凭证。
4.5. Batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
4.6. 使用方法
4.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 凭证文档
4.6.2. 由 Kinesis consumer 设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 记录的序列号。这表示为一个字符串,因为它的大小不是由 API 定义。如果要将它用作数字类型,则使用 |
|
| 为记录的 arrival 时间分配的时间 AWS。 |
|
| 标识数据记录的流中分配给的分片。 |
4.6.3. AmazonKinesis 配置
然后,您必须在 amazonKinesisClient
URI 选项中引用 KinesisClientClient。
from("aws2-kinesis://mykinesisstream?amazonKinesisClient=#kinesisClient") .to("log:out?showAll=true");
4.6.4. 提供 AWS 凭证
建议您使用 DefaultAWSCredentialsProviderChain 获取凭证,这是创建新 ClientConfiguration 实例时的默认设置,但在调用 createClient (…)时可以指定不同的 AWSCredentialsProvider。
4.6.5. Kinesis producer 用来写入 Kinesis 的消息标头。生产者希望消息正文是 byte[]
。
标头 | 类型 | 描述 |
---|---|---|
|
| 要传递给 Kinesis 来存储此记录的 PartitionKey。 |
|
| 可选参数以指示此记录的序列号。 |
4.6.6. 在记录成功存储时由 Kinesis producer 设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 记录的序列号,如 Response Syntax中定义的 |
|
| 存储记录的分片 ID |
4.7. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-kinesis</artifactId> <version>${camel-version}</version> </dependency>
其中 3.18.3
必须替换为 Camel 的实际版本。
4.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-kinesis 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-kinesis-starter</artifactId> </dependency>
组件支持 40 个选项,如下所列。
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.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.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
camel.component.aws2-kinesis-firehose.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
camel.component.aws2-kinesis-firehose.use-default-credentials-provider | 设置 Kinesis Firehose 客户端是否应该通过默认凭据提供商加载凭据,还是希望传递静态凭据。 | false | 布尔值 |
camel.component.aws2-kinesis.access-key | Amazon AWS 访问密钥. | 字符串 | |
camel.component.aws2-kinesis.amazon-kinesis-client | Amazon Kinesis 客户端用于此端点的所有请求。选项是一个 software.amazon.awssdk.services.kinesis.KinesisClient 类型。 | KinesisClient | |
camel.component.aws2-kinesis.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.aws2-kinesis.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.aws2-kinesis.cbor-enabled | 此选项将在执行期间设置 CBOR_ENABLED 属性。 | true | 布尔值 |
camel.component.aws2-kinesis.configuration | 组件配置.选项是 org.apache.camel.component.aws2.kinesis.Kinesis2Configuration 类型。 | Kinesis2Configuration | |
camel.component.aws2-kinesis.enabled | 是否启用 aws2-kinesis 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.aws2-kinesis.iterator-type | 定义在 Kinesis 流中开始获取记录的位置。 | ShardIteratorType | |
camel.component.aws2-kinesis.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.aws2-kinesis.max-results-per-request | 每次轮询中将获取的最大记录数。 | 1 | 整数 |
camel.component.aws2-kinesis.override-endpoint | 设置覆盖端点的需要。这个选项需要与 uriEndpointOverride 选项结合使用。 | false | 布尔值 |
camel.component.aws2-kinesis.proxy-host | 在实例化 Kinesis 客户端时定义代理主机。 | 字符串 | |
camel.component.aws2-kinesis.proxy-port | 在实例化 Kinesis 客户端时定义代理端口。 | 整数 | |
camel.component.aws2-kinesis.proxy-protocol | 在实例化 Kinesis 客户端时定义代理协议。 | 协议 | |
camel.component.aws2-kinesis.region | Kinesis Firehose 客户端需要工作的区域。使用此参数时,配置将预期区域(如 ap-east-1)的小写名称,您需要使用名称 Region.EU_WEST_1.id()。 | 字符串 | |
camel.component.aws2-kinesis.resume-strategy | 为 AWS Kinesis 定义恢复策略。如果提供,默认策略将读取 sequenceNumber。选项是一个 org.apache.camel.component.aws2.kinesis.consumer.KinesisResumeStrategy 类型。 | KinesisResumeStrategy | |
camel.component.aws2-kinesis.secret-key | Amazon AWS Secret 密钥。 | 字符串 | |
camel.component.aws2-kinesis.sequence-number | 开始轮询的序列号。如果 iteratorType 设置为 AFTER_SEQUENCE_NUMBER 或 AT_SEQUENCE_NUMBER,则需要此项。 | 字符串 | |
camel.component.aws2-kinesis.shard-closed | 定义在分片关闭时的行为是什么。可能的值有 ignore, silent 和 fail。如果忽略了消息,并且消费者将从开始重新启动,如果为 silent,则消费者将从开始记录。如果开始,消费者将引发故障关闭状态异常。 | Kinesis2ShardClosedStrategyEnum | |
camel.component.aws2-kinesis.shard-id | 定义 Kinesis 流中要从哪些分片 ID 获取记录。 | 字符串 | |
camel.component.aws2-kinesis.trust-all-certificates | 如果要在覆盖端点时信任所有证书。 | false | 布尔值 |
camel.component.aws2-kinesis.uri-endpoint-override | 设置覆盖 uri 端点。这个选项需要与 overrideEndpoint 选项结合使用。 | 字符串 | |
camel.component.aws2-kinesis.use-default-credentials-provider | 设置 Kinesis 客户端是否应该希望通过默认凭证提供程序加载凭证,或者希望传递静态凭证。 | false | 布尔值 |
第 5 章 AWS 2 Lambda
仅支持生成者
AWS2 Lambda 组件支持 create, get, list, delete 和 invoke AWS Lambda 函数。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并使用 Amazon Lambda 注册。如需更多信息,请参阅 AWS Lambda。
在创建 Lambda 功能时,您需要指定一个 IAM 角色,该角色至少附加了 AWSLambdaBasicExecuteRole 策略。
5.1. URI 格式
aws2-lambda://functionName[?options]
您可以将查询选项附加到 URI 中,格式为 options=value&option2=value&…
5.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
5.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
5.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
5.3. 组件选项
AWS 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 密钥。 | 字符串 |
5.4. 端点选项
AWS Lambda 端点使用 URI 语法进行配置:
aws2-lambda:function
使用以下路径和查询参数:
5.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
function (producer) | Lambda 函数必需的名称。 | 字符串 |
5.4.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 服务。
5.5. 使用方法
5.5.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.5.2. 由 Lambda producer 评估的消息标头
操作 | 标头 | 类型 | 描述 | 必填 |
---|---|---|---|---|
All |
|
| 我们要执行的操作。覆盖作为查询参数传递的操作 | 是 |
createFunction |
|
| 存储包含部署软件包的 .zip 文件的 Amazon S3 bucket 名称。此存储桶必须位于您要创建 Lambda 功能的同一 AWS 区域。 | 否 |
createFunction |
|
| 要上传的 Amazon S3 对象(部署软件包)密钥名称。 | 否 |
createFunction |
| 字符串 | 要上传的 Amazon S3 对象(部署软件包)版本。 | 否 |
createFunction |
|
| zip 文件的本地路径(部署软件包)。zip 文件的内容也可以放在消息正文中。 | 否 |
createFunction |
|
| 当执行您的功能来访问任何其他 Amazon Web Services (AWS)资源时,Larmbda 假定 IAM 角色的 Amazon Resource Name (ARN)。 | 是 |
createFunction |
| 字符串 | 您上传的 Lambda 功能的运行时环境。(nodejs, nodejs4.3, nodejs6.10, java8, python2.7, python3.6, dotnetcore1.0, odejs4.3-edge) | 是 |
createFunction |
|
| Lambda 调用的代码中的功能,开始执行。对于 Node.js,它是您的函数中的 module-name.export 值。对于 Java,它可以是 package.class-name::handler 或 package.class-name。 | 是 |
createFunction |
|
| 用户提供的描述。 | 否 |
createFunction |
|
| 包含 Amazon SQS 队列或 Amazon SNS 主题的目标 ARN (Amazon Resource Name) 的父对象。 | 否 |
createFunction |
|
| 为该功能配置的内存大小(以 MB 为单位)。必须是 64 MB 的倍数。 | 否 |
createFunction |
|
| 用于加密功能环境变量的 KMS 密钥的 Amazon 资源名称(ARN)。如果没有提供,AWS Lambda 将使用默认服务密钥。 | 否 |
createFunction |
|
| 此布尔值参数可用于请求 AWS Lambda 来创建 Lambda 功能,并将版本作为原子操作发布。 | 否 |
createFunction |
|
| Lambda 应该终止函数的功能执行时间。默认值为 3 秒。 | 否 |
createFunction |
|
| 您功能的追踪设置(活跃或传递)。 | 否 |
createFunction |
|
| 代表您的环境配置设置的键值对。 | 否 |
createFunction |
|
| 分配给新功能的标签(键值对)列表。 | 否 |
createFunction |
|
| 如果您的 Lambda 功能访问 VPC 中的资源,则 VPC 中的一个或多个安全组 ID 列表。 | 否 |
createFunction |
|
| 如果您的 Lambda 功能访问 VPC 中的资源,则 VPC 中的一个或多个子网 ID 列表。 | 否 |
createAlias |
|
| 在别名中设置的功能版本 | 是 |
createAlias |
|
| 在别名中设置的函数名称 | 是 |
createAlias |
|
| 在别名中设置的函数描述 | 否 |
deleteAlias |
|
| 别名的功能名称 | 是 |
getAlias |
|
| 别名的功能名称 | 是 |
listAliases |
|
| 在别名中设置的功能版本 | 否 |
5.6. 可运行的操作列表
- listFunctions
- getFunction
- createFunction
- deleteFunction
- invokeFunction
- updateFunction
- createEventSourceMapping
- deleteEventSourceMapping
- listEventSourceMapping
- listTags
- tagResource
- untagResource
- publishVersion
- listVersions
- createAlias
- deleteAlias
- getAlias
- listAliases
5.7. 例子
5.7.1. 生成者示例
要完全了解组件的工作方式,您可以参阅这些 集成测试。
5.7.2. 生成者示例
- CreateFunction:此操作将在 AWS Lambda 中为您创建一个功能
from("direct:createFunction").to("aws2-lambda://GetHelloWithName?operation=createFunction").to("mock:result");
并通过发送
template.send("direct:createFunction", ExchangePattern.InOut, new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(Lambda2Constants.RUNTIME, "nodejs6.10"); exchange.getIn().setHeader(Lambda2Constants.HANDLER, "GetHelloWithName.handler"); exchange.getIn().setHeader(Lambda2Constants.DESCRIPTION, "Hello with node.js on Lambda"); exchange.getIn().setHeader(Lambda2Constants.ROLE, "arn:aws:iam::643534317684:role/lambda-execution-role"); ClassLoader classLoader = getClass().getClassLoader(); File file = new File( classLoader .getResource("org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.zip") .getFile()); FileInputStream inputStream = new FileInputStream(file); exchange.getIn().setBody(inputStream); } });
5.8. 使用 POJO 作为正文
由于多个选项,有时构建 AWS Request 可能会很复杂。我们介绍可能将 POJO 用作正文。在 AWS Lambda 中,您可以提交多个操作,如 Get Function 请求,您可以执行以下操作:
from("direct:getFunction") .setBody(GetFunctionRequest.builder().functionName("test").build()) .to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=getFunction&pojoRequest=true")
这样,您将直接传递请求,而无需专门传递与此操作相关的标头和选项。
5.9. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-lambda</artifactId> <version>${camel-version}</version> </dependency>
其中 3.18.3
必须替换为 Camel 的实际版本。
5.10. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-lambda 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-lambda-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 6 章 AWS S3 Storage Service
支持生成者和消费者
AWS2 S3 组件支持从/到 Amazon 的 S3 服务存储和检索对象。
先决条件
您必须拥有有效的 Amazon Web Services 开发人员帐户,并有权限使用 Amazon S3。如需更多信息,请访问 link:https://aws.amazon.com/s3 [Amazon S3]。
6.1. URI 格式
aws2-s3://bucketNameOrArn[?options]
如果存储桶不存在,则会创建存储桶。您可以以以下格式将查询选项附加到 URI 中,
options=value&option2=value&…
6.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
6.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
6.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
6.3. 组件选项
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 密钥。 | 字符串 |
6.4. 端点选项
AWS S3 Storage Service 端点使用 URI 语法进行配置:
aws2-s3://bucketNameOrArn
使用以下路径和查询参数:
6.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bucketNameOrArn (common) | 所需的 Bucket 名称或 ARN。 | 字符串 |
6.4.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。
6.5. Batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
6.6. 使用方法
例如,要从存储桶 helloBucket
读取文件 hello.txt
,请使用以下片断:
from("aws2-s3://helloBucket?accessKey=yourAccessKey&secretKey=yourSecretKey&prefix=hello.txt") .to("file:/var/downloaded");
6.6.1. S3 producer 评估的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 此对象的 bucket 名称将存储或用于当前操作 |
|
| 用于当前操作的存储桶目标名称 |
|
| 此对象的内容长度。 |
|
| 此对象的内容类型。 |
|
| 此对象的内容控制。 |
|
| 此对象的内容分布。 |
|
| 此对象的内容编码。 |
|
| 此对象的 md5 checksum。 |
|
| 用于当前操作的 Destination 键 |
|
| 此对象将存储或用于当前操作的密钥 |
|
| 此对象的最后修改的时间戳。 |
|
| 要执行的操作。允许的值有 copyObject, deleteObject, listBuckets, deleteBucket, listObjects |
|
| 此对象的存储类。 |
|
|
将应用于对象的 canned acl。请参阅 |
|
|
一个精心构建的 Amazon S3 Access Control List 对象。请参阅 |
| 字符串 | 在使用 AWS 管理的密钥加密对象时设置服务器端加密算法。例如,使用 AES256。 |
|
| 要存储或从当前操作返回的对象的版本 Id |
|
| 要与 S3 中对象存储的元数据映射。有关元数据的更多详细信息。 |
6.6.2. S3 producer 设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 新上传对象的 ETag 值。 |
|
| 新上传对象的可选版本 ID。 |
6.6.3. S3 使用者设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| 存储此对象的密钥。 |
|
| 包含此对象的存储桶的名称。 |
|
| 根据 RFC 1864,对相关对象的十六进制编码的 128 位 MD5 摘要。此数据用作完整性检查,以验证调用者收到的数据是否与 Amazon S3 发送的数据相同。 |
|
| Last-Modified 标头的值,指示 Amazon S3 最后记录对关联对象的修改的日期和时间。 |
|
| 关联的 Amazon S3 对象的版本 ID (如果可用)。只有当对象上传到启用了对象版本控制的 Amazon S3 存储桶时,才会将版本 ID 分配给对象。 |
|
| Content-Type HTTP 标头,它表示存储在关联对象中的内容类型。此标头的值是标准 MIME 类型。 |
|
| 根据 RFC 1864,使用 base64 编码的相关对象(content - 不包括标头)的 base64 编码的 128 位 MD5 摘要。此数据用作消息完整性检查,以验证 Amazon S3 收到的数据是否与调用者发送的数据相同。 |
|
| Content-Length HTTP 标头表示关联对象的大小(以字节为单位)。 |
|
| 可选的 Content-Encoding HTTP 标头指定将什么内容编码应用到对象,必须应用哪些解码机制来获取 Content-Type 字段引用的 media-type。 |
|
| 可选的 Content-Disposition HTTP 标头,它指定要保存的对象的建议文件名等。 |
|
| 可选的 Cache-Control HTTP 标头,允许用户在 HTTP 请求/恢复链中指定缓存行为。 |
| 字符串 | 使用 AWS 管理的密钥加密对象时的服务器端加密算法。 |
|
| 与 S3 中对象存储的元数据映射。有关元数据的更多详细信息。 |
6.6.4. S3 Producer 操作
Camel-AWS2-S3 组件在生成者端提供以下操作:
- copyObject
- deleteObject
- listBuckets
- deleteBucket
- listObjects
- GetObject (这将返回 S3Object 实例)
- getObjectRange (这将返回 S3Object 实例)
- createDownloadLink
如果您没有显式指定生成者将执行的操作: - 单个文件上传 - 如果启用了 multiPartUpload 选项,则多部分上传。
6.6.5. 高级 AmazonS3 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 S3Client
实例配置拥有更多控制,您可以创建自己的实例,并在 Camel aws2-s3 组件配置中引用它:
from("aws2-s3://MyBucket?amazonS3Client=#client&delay=5000&maxMessagesPerPoll=5") .to("mock:result");
6.6.6. 将 KMS 与 S3 组件一起使用
要使用 AWS KMS 加密/解密数据,您可以使用 2.21.x 中引入的选项,如下例所示
from("file:tmp/test?fileName=test.txt") .setHeader(S3Constants.KEY, constant("testFile")) .to("aws2-s3://mybucket?amazonS3Client=#client&useAwsKMS=true&awsKMSKeyId=3f0637ad-296a-3dfe-a796-e60654fb128c");
这样,您将要求 S3 使用 KMS 密钥 3f0637ad-296a-3dfe-a796-e60654fb128c 来加密文件 test.txt。当您要求下载该文件时,将在下载前直接进行解密。
6.6.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 凭证文档
6.6.8. S3 Producer 操作示例
- 单上传:此操作将根据正文内容上传文件到 S3
from("direct:start").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(S3Constants.KEY, "camel.txt"); exchange.getIn().setBody("Camel rocks!"); } }) .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client") .to("mock:result");
此操作将上传文件 camel.txt,其内容为 mycamelbucket bucket 中的内容 "Camel rocks!"
- 多部分上传:此操作将根据正文内容执行文件的多部分上传到 S3
from("direct:start").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(AWS2S3Constants.KEY, "empty.txt"); exchange.getIn().setBody(new File("src/empty.txt")); } }) .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&multiPartUpload=true&autoCreateBucket=true&partSize=1048576") .to("mock:result");
此操作将执行文件 empty.txt 的多部分上传,它基于 mycamelbucket bucket 中文件 src/empty.txt 的内容
- CopyObject:此操作将对象从一个存储桶复制到不同的存储桶
from("direct:start").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(S3Constants.BUCKET_DESTINATION_NAME, "camelDestinationBucket"); exchange.getIn().setHeader(S3Constants.KEY, "camelKey"); exchange.getIn().setHeader(S3Constants.DESTINATION_KEY, "camelDestinationKey"); } }) .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=copyObject") .to("mock:result");
此操作会将带有标头 camelDestinationKey 中的名称的对象复制到 Bucket mycamelbucket 中的 camelDestinationBucket 存储桶。
- DeleteObject:此操作从存储桶中删除对象
from("direct:start").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(S3Constants.KEY, "camelKey"); } }) .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteObject") .to("mock:result");
此操作将从 bucket mycamelbucket 中删除对象 camelKey。
- ListBuckets:此操作列出了此区域中此帐户的存储桶
from("direct:start") .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=listBuckets") .to("mock:result");
此操作将列出此帐户的存储桶
- DeleteBucket:此操作删除指定为 URI 参数或标头的存储桶
from("direct:start") .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteBucket") .to("mock:result");
此操作将删除存储桶 mycamelbucket
- ListObjects :此操作列表在特定存储桶中的对象
from("direct:start") .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=listObjects") .to("mock:result");
此操作将列出 mycamelbucket bucket 中的对象
- GetObject:此操作获取特定存储桶中的单个对象
from("direct:start").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(S3Constants.KEY, "camelKey"); } }) .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObject") .to("mock:result");
此操作将返回与 mycamelbucket bucket 中 camelKey 对象相关的 S3Object 实例。
- GetObjectRange:此操作获得特定存储桶中的单个对象范围
from("direct:start").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(S3Constants.KEY, "camelKey"); exchange.getIn().setHeader(S3Constants.RANGE_START, "0"); exchange.getIn().setHeader(S3Constants.RANGE_END, "9"); } }) .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObjectRange") .to("mock:result");
此操作将返回与 mycamelbucket bucket 中 camelKey 对象相关的 S3Object 实例,其中包含从 0 到 9 的字节数。
- CreateDownloadLink:此操作将通过 S3 Presigner 返回下载链接
from("direct:start").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(S3Constants.KEY, "camelKey"); } }) .to("aws2-s3://mycamelbucket?accessKey=xxx&secretKey=yyy®ion=region&operation=createDownloadLink") .to("mock:result");
此操作将返回存储桶 mycamelbucket 和 region 区域中的 camel-key 文件的下载链接 url
6.7. 流上传模式
启用流模式后,用户可以通过多部分上传将数据上传到 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 秒后完成。
6.8. bucket 自动创建
使用选项 autoCreateBucket
用户可以在 S3 Bucket 不存在时避免自动创建。此选项的默认值是 true
。如果设置为 false 对 AWS 中不存在的存储桶的操作,则不会成功,并返回错误。
6.9. 在存储桶和其他存储桶间移动操作
有些用户(如从存储桶中消耗大量),并在不同的中移动内容,而无需使用这个组件的 copyObject 功能。如果是这样,请不要忘记从消费者的传入交换中删除 bucketName 标头,否则该文件将始终覆盖同一原始存储桶。
6.10. MoveAfterRead consumer 选项
除了 deleteAfterRead 外,还添加了另一个选项 moveAfterRead。启用此选项后,消耗的对象将移到目标 destinationBucket 中,而不是只被删除。这将需要指定 destinationBucket 选项。例如:
from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket") .to("mock:result");
在这种情况下,消耗的对象将移到 myothercamelbucket bucket,并从原始存储桶中删除(因为 deleteAfterRead 设置为 true )。
您还可以在将文件移动到其他存储桶时使用密钥前缀/suffix。这些选项是 destinationBucketPrefix 和 destinationBucketSuffix。
使用以上示例,您可以执行以下操作:
from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket&destinationBucketPrefix=RAW(pre-)&destinationBucketSuffix=RAW(-suff)") .to("mock:result");
在这种情况下,消耗的对象将移到 myothercamelbucket bucket,并从原始存储桶中删除(因为 deleteAfterRead 设置为 true )。
因此,如果文件名是 test,在 myothercamelbucket 中,您应该会看到一个名为 pre-test-suff 的文件。
6.11. 使用客户密钥加密
我们还引入了客户密钥支持(使用 KMS 的替代方案)。以下代码显示了一个示例。
String key = UUID.randomUUID().toString(); byte[] secretKey = generateSecretKey(); String b64Key = Base64.getEncoder().encodeToString(secretKey); String b64KeyMd5 = Md5Utils.md5AsBase64(secretKey); String awsEndpoint = "aws2-s3://mycamel?autoCreateBucket=false&useCustomerKey=true&customerKeyId=RAW(" + b64Key + ")&customerKeyMD5=RAW(" + b64KeyMd5 + ")&customerAlgorithm=" + AES256.name(); from("direct:putObject") .setHeader(AWS2S3Constants.KEY, constant("test.txt")) .setBody(constant("Test")) .to(awsEndpoint);
6.12. 使用 POJO 作为正文
由于多个选项,有时构建 AWS Request 可能会很复杂。我们介绍可能将 POJO 用作正文。在 AWS S3 中,您可以提交多个操作,作为 List 代理请求示例,您可以执行以下操作:
from("direct:aws2-s3") .setBody(ListObjectsRequest.builder().bucket(bucketName).build()) .to("aws2-s3://test?amazonS3Client=#amazonS3Client&operation=listObjects&pojoRequest=true")
这样,您将直接传递请求,而无需专门传递与此操作相关的标头和选项。
6.13. 创建 S3 客户端并在 registry 中添加组件
有时,您要使用 AWS2S3Configuration 执行一些高级配置,这还允许设置 S3 客户端。您可以在组件配置中创建和设置 S3 客户端,如下例所示
String awsBucketAccessKey = "your_access_key"; String awsBucketSecretKey = "your_secret_key"; S3Client s3Client = S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(awsBucketAccessKey, awsBucketSecretKey))) .region(Region.US_EAST_1).build(); AWS2S3Configuration configuration = new AWS2S3Configuration(); configuration.setAmazonS3Client(s3Client); configuration.setAutoDiscoverClient(true); configuration.setBucketName("s3bucket2020"); configuration.setRegion("us-east-1");
现在,您可以配置 S3 组件(使用上面创建的配置对象),并在路由初始化前将其添加到配置方法中的 registry 中。
AWS2S3Component s3Component = new AWS2S3Component(getContext()); s3Component.setConfiguration(configuration); s3Component.setLazyStartProducer(true); camelContext.addComponent("aws2-s3", s3Component);
现在,您的组件将用于在 camel 路由中实施的所有操作。
6.14. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml
中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-s3</artifactId> <version>${camel-version}</version> </dependency>
其中 3.18.3
必须替换为 Camel 的实际版本。
6.15. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-s3 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-s3-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 7 章 AWS Simple Notification System (SNS)
仅支持生成者
AWS2 SNS 组件允许消息发送到 Amazon Simple Notification 主题。Amazon API 的实现由 AWS SDK 提供。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并签名以使用 Amazon SNS。如需更多信息,请参阅 Amazon SNS。
7.1. URI 格式
aws2-sns://topicNameOrArn[?options]
如果主题不存在,则会创建它们。您可以将查询选项附加到 URI 中,格式为 ?options=value&option2=value&…
7.2. URI 选项
7.2.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
7.2.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
7.2.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
7.3. 组件选项
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 密钥。 | 字符串 |
7.4. 端点选项
AWS Simple Notification System (SNS) 端点使用 URI 语法进行配置:
aws2-sns:topicNameOrArn
使用以下路径和查询参数:
7.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
topicNameOrArn (producer) | 所需的 主题名称或 ARN。 | 字符串 |
7.4.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。
7.5. 使用方法
7.5.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 凭证文档。
7.5.2. 由 SNS producer 评估的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
|
Amazon SNS 消息主题。如果没有设置,则使用 |
7.5.3. SNS producer 设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| Amazon SNS 消息 ID。 |
7.5.4. 高级 AmazonSNS 配置
如果需要对 SnsClient
实例配置进行更多控制,您可以创建自己的实例,并从 URI 引用它:
from("direct:start") .to("aws2-sns://MyTopic?amazonSNSClient=#client");
#client
指的是 Registry 中的 AmazonSNS
。
7.5.5. 在 AWS SNS 主题和 AWS SQS Queue 之间创建订阅
您可以创建一个 SQS Queue 订阅到 SNS 主题:
from("direct:start") .to("aws2-sns://test-camel-sns1?amazonSNSClient=#amazonSNSClient&subscribeSNStoSQS=true&queueUrl=https://sqs.eu-central-1.amazonaws.com/780410022472/test-camel");
#amazonSNSClient
是指 Registry 中的 SnsClient
。通过将 subscribeSNStoSQS
指定为 true,并且指定现有 SQS 队列的 queueUrl
,您可以将 SQS Queue 订阅到您的 SNS 主题。
此时,您可以通过 SQS Queue 使用来自 SNS 主题的消息
from("aws2-sqs://test-camel?amazonSQSClient=#amazonSQSClient&delay=50&maxMessagesPerPoll=5") .to(...);
7.6. Topic Autocreation
通过选项 autoCreateTopic
用户,如果 SNS Topic 不存在,可以避免自动创建它。此选项的默认值是 true
。如果设置为 false 任何对 AWS 中不存在的主题的操作,则不会成功,并返回错误。
7.7. SNS FIFO
支持 SNS FIFO。在创建 SQS 队列时,您将订阅 SNS 主题,需要记住,您需要让 SNS Topic 发送消息到 SQS Queue。
示例
假设您创建一个名为 Order.fifo
的 SNS FIFO 主题,以及一个名为 QueueSub.fifo
的 SQS Queue。
在 QueueSub.fifo
的访问策略中,您应该提交如下内容:
{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__owner_statement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::780560123482:root" }, "Action": "SQS:*", "Resource": "arn:aws:sqs:eu-west-1:780560123482:QueueSub.fifo" }, { "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "SQS:SendMessage", "Resource": "arn:aws:sqs:eu-west-1:780560123482:QueueSub.fifo", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:sns:eu-west-1:780410022472:Order.fifo" } } } ] }
这是使订阅正常工作的关键步骤。
7.7.1. SNS Fifo Topic 消息组 Id Strategy 和消息 Deduplication Id Strategy
向 FIFO 主题发送一些时,您需要始终设置消息组 Id 策略。
如果 SNS Fifo 主题上启用了基于内容的消息 deduplication,则不需要设置消息 deduplication id 策略,否则您必须对其进行设置。
7.8. 例子
7.8.1. 生成者示例
发送到主题
from("direct:start") .to("aws2-sns://camel-topic?subject=The+subject+message&autoCreateTopic=true");
7.9. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-sns</artifactId> <version>${camel-version}</version> </dependency>
其中 3.18.3
必须替换为 Camel 的实际版本。
7.10. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-sns 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-sns-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 8 章 AWS Simple Queue Service (SQS)
支持生成者和消费者
AWS2 SQS 组件支持向 Amazon 的 SQS 服务发送和接收信息。
先决条件
您必须有一个有效的 Amazon Web Services 开发人员帐户,并签名以使用 Amazon SQS。如需更多信息,请参阅 Amazon SQS。
8.1. URI 格式
aws2-sqs://queueNameOrArn[?options]
如果队列不存在,将创建队列。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
8.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
8.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
8.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
8.3. 组件选项
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 密钥。 | 字符串 |
8.4. 端点选项
AWS Simple Queue Service (SQS)端点使用 URI 语法进行配置:
aws2-sqs:queueNameOrArn
使用以下路径和查询参数:
8.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
queueNameOrArn (common) | 所需的 Queue name 或 ARN。 | 字符串 |
8.4.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。
8.5. Batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
8.6. 使用方法
8.6.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 凭证文档
8.6.2. SQS producer 设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| Amazon SQS 消息的 MD5 checksum。 |
|
| Amazon SQS 消息 ID。 |
|
| Amazon SQS 消息可以被其他人查看的延迟秒数。 |
8.6.3. SQS 使用者设置的消息标头
标头 | 类型 | 描述 |
---|---|---|
|
| Amazon SQS 消息的 MD5 checksum。 |
|
| Amazon SQS 消息 ID。 |
|
| Amazon SQS 消息接收处理。 |
|
| Amazon SQS 消息属性。 |
8.6.4. 高级 AmazonSQS 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 SqsClient
实例配置拥有更多控制,您可以创建自己的实例:
from("aws2-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5") .to("mock:result");
8.6.5. 创建或更新 SQS 队列
在 SQS 组件中,当端点启动时,将执行检查以获取有关队列是否存在的信息。您可以使用 SQSConfiguration
选项通过 QueueAttributeName
映射自定义创建。
from("aws2-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5") .to("mock:result");
在本例中,如果 AWS 上尚未创建 MyQueue
队列(将 autoCreateQueue
选项设置为 true),它将使用 SQS 配置中的默认参数创建。如果它已在 AWS 上启动,则 SQS 配置选项将用于覆盖现有的 AWS 配置。
8.6.6. DelayQueue VS Delay 用于 Single 信息
当选项 delayQueue
设为 true 时,SQS Queue 将是一个 DelayQueue
,带有 DelaySeconds
选项作为延迟。有关 DelayQueue
的更多信息,请参阅 AWS SQS 文档。要考虑的重要信息如下:
- 对于标准队列,每个队列延迟设置不会重新更改设置不会影响队列中已经的信息的延迟。
- 对于 FIFO 队列,每个队列延迟设置是重新引入的,该设置会影响队列中已存在于的消息的延迟。
如官方文档中所述。如果要在单个消息上指定延迟,可以忽略 delayQueue
选项,同时如果您需要向所有消息添加固定延迟,则可以将这个选项设置为 true。
8.6.7. 服务器同级加密
为队列有一组 Server Side Encryption 属性。相关的选项包括 serverSideEncryptionEnabled
,keyMasterKeyId
和 kmsDataKeyReusePeriod
。SSE 默认禁用。您需要明确将选项设置为 true,并将相关参数设置为 queue 属性。
8.7. JMS 风格的 Selectors
SQS 不允许选择器,但您可以使用 Camel Filter EIP 并设置适当的 visibilityTimeout
。当 SQS 分配消息时,它将等待可见超时,然后尝试将消息发送到不同的消费者,除非收到 DeleteMessage
。默认情况下,Camel 始终会在路由末尾发送 DeleteMessage
,除非路由失败。要实现适当的过滤,在成功完成路由时也不会发送 DeleteMessage
,请使用 Filter:
from("aws2-sqs://MyQueue?amazonSQSClient=#client&defaultVisibilityTimeout=5000&deleteIfFiltered=false&deleteAfterRead=false") .filter("${header.login} == true") .setProperty(Sqs2Constants.SQS_DELETE_FILTERED, constant(true)) .to("mock:filter");
在上面的代码中,如果交换没有适当的标头,则不会通过过滤器 AND 进行它,也不会从 SQS 队列中删除。5000 毫秒后,消息对其他消费者可见。
请注意,必须将属性 Sqs2Constants.SQS_DELETE_FILTERED
设置为 true
,以指示 Camel 发送 DeleteMessage
(如果过滤)。
8.8. 可用的 Producer 操作
- 单条消息(默认)
- sendBatchMessage
- deleteMessage
- listQueues
8.9. 发送消息
您可以设置 SendMessageBatchRequest
或 Iterable
from("direct:start") .setBody(constant("Camel rocks!")) .to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");
8.10. 发送批处理消息
您可以设置 SendMessageBatchRequest
或 Iterable
from("direct:start") .setHeader(SqsConstants.SQS_OPERATION, constant("sendBatchMessage")) .process(new Processor() { @Override public void process(Exchange exchange) throws Exception { Collection c = new ArrayList(); c.add("team1"); c.add("team2"); c.add("team3"); c.add("team4"); exchange.getIn().setBody(c); } }) .to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");
因此,您将获得一个包含 SendMessageBatchResponse
实例的交换,您可以评估来检查哪些消息成功,以及什么信息不成功。批处理的每个消息上设置的 id 将是一个随机 UUID。
8.11. 删除单个消息
使用 deleteMessage
操作删除单个消息。您需要为您要删除的消息设置接收句柄标头。
from("direct:start") .setHeader(SqsConstants.SQS_OPERATION, constant("deleteMessage")) .setHeader(SqsConstants.RECEIPT_HANDLE, constant("123456")) .to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");
因此,您将获得一个包含 DeleteMessageResponse
实例的交换,您可以使用它来检查消息是否已被删除。
8.12. List Queues
使用 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
实例的交换,您可以检查实际队列。
8.13. 清除队列
使用 purgeQueue
操作清除队列。
from("direct:start") .setHeader(SqsConstants.SQS_OPERATION, constant("purgeQueue")) .to("aws2-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)®ion=eu-west-1");
因此,您将获得一个包含 PurgeQueueResponse
实例的交换。
8.14. 队列自动创建
使用选项 autoCreateQueue
用户可以在 SQS Queue 不存在时避免自动创建。此选项的默认值是 true
。如果设置为 false 对 AWS 中不存在队列的操作,则不会成功,并返回错误。
8.15. 发送批处理消息和消息重复数据删除策略
如果您使用 SendBatchMessage
Operation,您可以设置两种不同类型的消息重复数据删除策略: - useExchangeId - useContentBasedDeduplication
第一个将使用 ExchangeIdMessageDeduplicationIdStrategy
,它将使用 Exchange ID 作为参数,另一个将使用 NullMessageDeduplicationIdStrategy
,它将使用 body 作为 deduplication 元素。
如果是发送批处理消息操作,您需要使用 useContentBasedDeduplication
和 Queue,您需要 启用基于内容的 deduplication
选项。
8.16. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-aws2-sqs</artifactId> <version>${camel-version}</version> </dependency>
其中 3.18.3
必须替换为 Camel 的实际版本。
8.17. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 aws2-sqs 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-sqs-starter</artifactId> </dependency>
组件支持 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)将等待直到队列中消息包含在响应中。 | 整数 |
第 9 章 Azure ServiceBus
从 Camel 3.12 开始
支持生成者和消费者
集成 Azure ServiceBus 的 azure-servicebus 组件。Azure ServiceBus 是一个完全托管的企业集成消息代理。服务总线可以分离应用程序和服务。服务总线提供了一个可靠安全平台,用于异步传输数据和状态。使用消息在不同的应用程序和服务间传输数据。
先决条件
您必须有一个有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户。
将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-azure-servicebus</artifactId> <version>3.20.1.redhat-00031</version> <!-- use the same version as your Camel core version --> </dependency>
9.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
9.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
9.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
9.2. 组件选项
Azure ServiceBus 组件支持 25 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amqpRetryOptions (common) | 为服务总线客户端设置重试选项。如果没有指定,则使用默认的重试选项。 | AmqpRetryOptions | |
amqpTransportType (common) | 设置发生与 Azure Service Bus 的所有通信的传输类型。默认值为 AmqpTransportType114AMQP。 Enum 值:
| AMQP | AmqpTransportType |
clientOptions (common) | 设置要从这个构建器构建的客户端发送的 ClientOptions,启用自定义某些属性,并支持添加自定义标头信息。如需更多信息,请参阅 ClientOptions 文档。 | ClientOptions | |
configuration (common) | 组件配置。 | ServiceBusConfiguration | |
proxyOptions (common) | 设置用于 ServiceBusSenderAsyncClient 的代理配置。配置代理后,必须将 AmqpTransportTypetransAMQP_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) | 设置继续自动更新锁定的时间。设置 Duration114ZERO 或 null 可禁用自动续订。对于 \\{link ServiceBusReceiveModeCEIVE_AND_DELETE RECEIVE_AND_DELETE} 模式,禁用自动续订。 | 5m | Duration |
peekNumMaxMessages (consumer) | 设置在 peek 操作期间要显示的最大消息数。 | 整数 | |
prefetchCount (consumer) | 设置接收方的 prefetch 计数。对于 \\{link ServiceBusReceiveModeHQPEEK_LOCK PEEK_LOCK} 和 \\{link ServiceBusReceiveModeDSRECEIVE_AND_DELETE RECEIVE_AND_DELETE} 模式,默认值为 1。Prefetch 通过模拟在应用使用 ServiceBusReceiverAsyncClient receiveMessages ()请求一个消息之前,为本地检索提供消息流速度。设置非零值将预先获取该消息的数量。将值设为零关闭。 | int | |
receiverAsyncClient (consumer) | Autowired 设置 receiverAsyncClient,以便消耗消费者的消息。 | ServiceBusReceiverAsyncClient | |
serviceBusReceiveMode (consumer) | 为接收方设置接收模式。 Enum 值:
| PEEK_LOCK | ServiceBusReceiveMode |
subQueue (consumer) | 设置要连接的 SubQueue 的类型。 Enum 值:
| SubQueue | |
subscriptionName (consumer) | 设置主题中的订阅名称,以侦听。还必须设置 topicOrQueueName 和 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 |
9.3. 端点选项
Azure ServiceBus 端点使用 URI 语法进行配置:
azure-servicebus:topicOrQueueName
使用以下路径和查询参数:
9.3.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
topicOrQueueName (common) | 所选主题名称或队列名称,具体取决于 serviceBusType 配置。例如,如果 serviceBusType=queue,则这是队列名称,如果 serviceBusType=topic,则这是主题名称。 | 字符串 |
9.3.2. 查询参数(25 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
amqpRetryOptions (common) | 为服务总线客户端设置重试选项。如果没有指定,则使用默认的重试选项。 | AmqpRetryOptions | |
amqpTransportType (common) | 设置发生与 Azure Service Bus 的所有通信的传输类型。默认值为 AmqpTransportType114AMQP。 Enum 值:
| AMQP | AmqpTransportType |
clientOptions (common) | 设置要从这个构建器构建的客户端发送的 ClientOptions,启用自定义某些属性,并支持添加自定义标头信息。如需更多信息,请参阅 ClientOptions 文档。 | ClientOptions | |
proxyOptions (common) | 设置用于 ServiceBusSenderAsyncClient 的代理配置。配置代理后,必须将 AmqpTransportTypetransAMQP_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) | 设置继续自动更新锁定的时间。设置 Duration114ZERO 或 null 可禁用自动续订。对于 \\{link ServiceBusReceiveModeCEIVE_AND_DELETE RECEIVE_AND_DELETE} 模式,禁用自动续订。 | 5m | Duration |
peekNumMaxMessages (consumer) | 设置在 peek 操作期间要显示的最大消息数。 | 整数 | |
prefetchCount (consumer) | 设置接收方的 prefetch 计数。对于 \\{link ServiceBusReceiveModeHQPEEK_LOCK PEEK_LOCK} 和 \\{link ServiceBusReceiveModeDSRECEIVE_AND_DELETE RECEIVE_AND_DELETE} 模式,默认值为 1。Prefetch 通过模拟在应用使用 ServiceBusReceiverAsyncClient receiveMessages ()请求一个消息之前,为本地检索提供消息流速度。设置非零值将预先获取该消息的数量。将值设为零关闭。 | int | |
receiverAsyncClient (consumer) | Autowired 设置 receiverAsyncClient,以便消耗消费者的消息。 | ServiceBusReceiverAsyncClient | |
serviceBusReceiveMode (consumer) | 为接收方设置接收模式。 Enum 值:
| PEEK_LOCK | ServiceBusReceiveMode |
subQueue (consumer) | 设置要连接的 SubQueue 的类型。 Enum 值:
| SubQueue | |
subscriptionName (consumer) | 设置主题中的订阅名称,以侦听。还必须设置 topicOrQueueName 和 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 |
9.4. async Consumer 和 Producer
此组件实现了 async Consumer 和 producer。这允许 camel 路由异步使用和生成事件,而不阻断任何线程。
9.5. 消息标头
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) | 获取由服务总线分配给消息的排队序列号。 | long | |
CamelAzureServiceBusEnqueuedTime (consumer) 常数: ENQUEUED_TIME | 获取此消息在 Azure Service Bus 中排队的日期。 | 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) | 获取或设置增加 ReplyTo 地址的会话标识符。 | 字符串 | |
CamelAzureServiceBusSequenceNumber (consumer) 常数: SEQUENCE_NUMBER | 获取由服务总线分配给消息的唯一数字。 | long | |
CamelAzureServiceBusSessionId (consumer) 常数: SESSION_ID | 获取消息的会话 ID。 | 字符串 | |
CamelAzureServiceBusSubject (consumer) 常量:SUB JECT | 获取邮件的主题。 | 字符串 | |
CamelAzureServiceBusTimeToLive (consumer) 常数: TIME_TO_LIVE | 获得此消息过期前的持续时间。 | Duration | |
CamelAzureServiceBusTo (consumer) 常数: TO | 获取地址。 | 字符串 | |
CamelAzureServiceBusScheduledEnqueueTime (common) | (producer)覆盖 OffsetDateTime,其中消息应出现在服务总线队列或主题中。(consumer)获取此消息的调度队列时间。 | OffsetDateTime | |
CamelAzureServiceBusServiceBusTransactionContext (producer) | 覆盖服务中的事务。此对象仅包含事务 ID。 | ServiceBusTransactionContext | |
CamelAzureServiceBusProducerOperation (producer) | 覆盖要在制作者中使用的所需操作。 Enum 值:
| ServiceBusProducerOperationDefinition |
9.5.1. 消息正文
在制作者中,此组件接受 String
type 或 List<String>
的消息正文来发送批处理消息。
在消费者中,返回的消息正文将是 'String。
9.5.2. Azure ServiceBus Producer 操作
操作 | 描述 |
---|---|
| 使用批处理方法向服务总线队列或主题发送一组消息。 |
| 向此发送者连接的 Azure Service Bus 实体发送调度的消息。调度的消息已排队,且仅在调度的 enqueue 时间提供给接收器。 |
9.5.3. Azure ServiceBus Consumer 操作
操作 | 描述 |
---|---|
| 接收来自 Service Bus 实体的 <b>infinite</b> 流。 |
| 在不更改接收器或消息源的状态的情况下读取下一个活动消息批处理。 |
9.5.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");
9.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 azure-servicebus 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-azure-servicebus-starter</artifactId> </dependency>
组件支持 26 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.azure-servicebus.amqp-retry-options | 为服务总线客户端设置重试选项。如果没有指定,则使用默认的重试选项。选项是一个 com.azure.core.amqp.AmqpRetryOptions 类型。 | AmqpRetryOptions | |
camel.component.azure-servicebus.amqp-transport-type | 设置发生与 Azure Service Bus 的所有通信的传输类型。默认值为 AmqpTransportType114AMQP。 | 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 | 设置继续自动更新锁定的时间。设置 Duration114ZERO 或 null 可禁用自动续订。对于 \\{link ServiceBusReceiveModeCEIVE_AND_DELETE RECEIVE_AND_DELETE} 模式,禁用自动续订。选项是一个 java.time.Duration 类型。 | Duration | |
camel.component.azure-servicebus.peek-num-max-messages | 设置在 peek 操作期间要显示的最大消息数。 | 整数 | |
camel.component.azure-servicebus.prefetch-count | 设置接收方的 prefetch 计数。对于 \\{link ServiceBusReceiveModeHQPEEK_LOCK PEEK_LOCK} 和 \\{link ServiceBusReceiveModeDSRECEIVE_AND_DELETE RECEIVE_AND_DELETE} 模式,默认值为 1。Prefetch 通过模拟在应用使用 ServiceBusReceiverAsyncClient receiveMessages ()请求一个消息之前,为本地检索提供消息流速度。设置非零值将预先获取该消息的数量。将值设为零关闭。 | 整数 | |
camel.component.azure-servicebus.producer-operation | 设置要在制作者中使用的所需操作。 | ServiceBusProducerOperationDefinition | |
camel.component.azure-servicebus.proxy-options | 设置用于 ServiceBusSenderAsyncClient 的代理配置。配置代理后,必须将 AmqpTransportTypetransAMQP_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 | 设置主题中的订阅名称,以侦听。还必须设置 topicOrQueueName 和 serviceBusType=topic。如果 serviceBusType=topic 和使用使用者,则需要此属性。 | 字符串 | |
camel.component.azure-servicebus.token-credential | 用于 Azure AD 身份验证的 TokenCredential,在 com.azure.identity 中实现。选项是一个 com.azure.core.credential.TokenCredential 类型。 | TokenCredential |
第 10 章 Azure Storage Blob Service
支持生成者和消费者
Azure Storage Blob 组件用于使用 Azure API v12 从 Azure Storage Blob Service 存储和检索 Blob。但是,如果版本 v12,我们会看到此组件是否可以根据有问题的更改量而采用这些更改。
先决条件
您必须有一个有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-azure-storage-blob</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
10.1. URI 格式
azure-storage-blob://accountName[/containerName][?options]
如果是使用者,则需要 accountName
。如果是生成者,它取决于请求的操作,例如,如果操作位于容器级别上,例如:
createContainer
、accountName
和 containerName
只需要,但如果 blob 级别请求操作,例如 getBlob
、accountName
、containerName
和 blobName
。
如果 blob 尚不存在,则会创建它。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
10.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
10.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
10.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
10.3. 组件选项
Azure Storage Blob Service 组件支持 31 个选项,如下所列。
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 | |
dataCount (common) | 范围内的字节数。如果指定,则必须大于或等于 0。 | Long | |
fileDir (common) | 下载的 Blob 保存到的文件的目录,这可用于生成者和消费者。 | 字符串 | |
maxResultsPerPage (common) | 指定要返回的 Blob 数量上限,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 的值,服务器将返回最多 5,000 个项目。 | 整数 | |
maxRetryRequests (common) | 指定从响应正文读取数据时将要进行的额外 HTTP 获取请求的最大数量。 | 0 | int |
prefix (common) | 过滤结果,以仅返回名称以指定前缀开头的 Blob。可以是 null,以返回所有 Blob。 | 字符串 | |
regex (common) | 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。如果同时设置了 prefix 和 regex,则正则表达式 可能是 null,则忽略 priority 和 prefix。 | 字符串 | |
serviceClient (common) | Autowired Client 到存储帐户。此客户端不包含有关特定存储帐户的状态,而是便捷地将适当的请求发送到该服务上的资源。它还可用于将 URL 构造到 blob 和容器。此客户端包含服务帐户的操作。容器的操作可在 BlobContainerClient via BlobServiceClient114getBlobContainerClient (String)上提供,并且 blob 上的操作可以通过 BlobContainerClient114getBlobClient (String)在 BlobClient 上提供。 | 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 | 布尔值 |
accessKey (security) | 用于连接 azure 帐户名称的访问密钥,用于使用 azure blob 服务进行身份验证。 | 字符串 | |
sourceBlobAccessKey (security) | source Blob Access Key: 对于复制blob 操作,我们需要为源 Blob 有一个 accessKey,我们需要复制 accessKey 作为标头,因此我们可以设置为密钥。 | 字符串 |
10.4. 端点选项
Azure Storage Blob Service 端点使用 URI 语法进行配置:
azure-storage-blob:accountName/containerName
使用以下路径和查询参数:
10.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
accountName (common) | 用于使用 azure blob 服务进行身份验证的 Azure 帐户名称。 | 字符串 | |
containerName (common) | blob 容器名称。 | 字符串 |
10.4.2. 查询参数(48 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
blobName (common) | blob 名称,使用容器中的特定 blob。但是,在制作者上,只有 blob 级别上的操作才需要。 | 字符串 | |
blobOffset (common) | 为上传或下载操作设置 blob 偏移,默认为 0。 | 0 | long |
blobServiceClient (common) | 客户端到存储帐户。此客户端不包含有关特定存储帐户的状态,而是便捷地将适当的请求发送到该服务上的资源。它还可用于将 URL 构造到 blob 和容器。此客户端包含服务帐户的操作。容器的操作可以通过 getBlobContainerClient (String)在 BlobContainerClient (String)上提供,并且 BlobClient 上的操作可以通过 getBlobContainerClient (String).getBlobClient (String)获得。 | BlobServiceClient | |
blobType (common) | blob 类型,为每个 blob 类型启动适当的设置。 Enum 值:
| blockblob | BlobType |
closeStreamAfterRead (common) | 在读取或保持打开后关闭流,默认为 true。 | true | 布尔值 |
credentials (common) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,这包含重要的身份验证信息。 | StorageSharedKeyCredential | |
dataCount (common) | 范围内的字节数。如果指定,则必须大于或等于 0。 | Long | |
fileDir (common) | 下载的 Blob 保存到的文件的目录,这可用于生成者和消费者。 | 字符串 | |
maxResultsPerPage (common) | 指定要返回的 Blob 数量上限,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 的值,服务器将返回最多 5,000 个项目。 | 整数 | |
maxRetryRequests (common) | 指定从响应正文读取数据时将要进行的额外 HTTP 获取请求的最大数量。 | 0 | int |
prefix (common) | 过滤结果,以仅返回名称以指定前缀开头的 Blob。可以是 null,以返回所有 Blob。 | 字符串 | |
regex (common) | 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。如果同时设置了 prefix 和 regex,则正则表达式 可能是 null,则忽略 priority 和 prefix。 | 字符串 | |
serviceClient (common) | Autowired Client 到存储帐户。此客户端不包含有关特定存储帐户的状态,而是便捷地将适当的请求发送到该服务上的资源。它还可用于将 URL 构造到 blob 和容器。此客户端包含服务帐户的操作。容器的操作可在 BlobContainerClient via BlobServiceClient114getBlobContainerClient (String)上提供,并且 blob 上的操作可以通过 BlobContainerClient114getBlobClient (String)在 BlobClient 上提供。 | 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 帐户名称的访问密钥,用于使用 azure blob 服务进行身份验证。 | 字符串 | |
sourceBlobAccessKey (security) | source Blob Access Key: 对于复制blob 操作,我们需要为源 Blob 有一个 accessKey,我们需要复制 accessKey 作为标头,因此我们可以设置为密钥。 | 字符串 |
所需信息选项
要使用此组件,您需要 3 个选项来提供所需的 Azure 身份验证信息:
-
为您的 Azure 帐户提供
accountName
和accessKey
,这是开始的最简单方法。accessKey 可通过您的 Azure 门户生成。 -
提供 StorageSharedKeyCredential 实例,它可以提供给
凭证
选项。 -
提供 BlobServiceClient 实例,它可以提供给
blobServiceClient
。注: 您不需要创建特定的客户端,如 BlockBlobClient,BlobServiceClient 代表顶层,可用于检索较低级别的客户端。
10.5. 使用方法
例如,要从 camelazure
存储帐户中的 container1
上的块 blob hello.txt
下载 blob 内容,请使用以下代码片段:
from("azure-storage-blob://camelazure/container1?blobName=hello.txt&accessKey=yourAccessKey"). to("file://blobdirectory");
10.5.1. 组件制作者评估的消息标头
标头 | 变量名称 | 类型 | 操作 | 描述 |
---|---|---|---|---|
|
|
| All | 可选的超时值,超过 {@link RuntimeException} 将引发 {@link RuntimeException}。 |
|
|
| 与容器和 Blob 相关的操作 | 与容器或 blob 关联的元数据。 |
|
|
|
|
指定此容器中的数据对公共使用的方式。如果无公共访问,传递 |
|
|
| 与容器和 Blob 相关的操作 | 它包含值,将限制各种请求的成功操作到存在的条件。这些条件完全是可选的。 |
|
|
|
| 列出特定 Blob 的详细信息 |
|
|
|
| 过滤结果,以仅返回名称以指定前缀开头的 Blob。可以是 null,以返回所有 Blob。 |
|
|
|
| 指定要返回的 Blob 数量上限,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 的值,服务器将返回最多 5,000 个项目。 |
|
|
|
| 定义可用于配置 {@link BlobContainerClient} 对象上 listBlobsFlatSegment 的调用行为的选项。 |
|
|
|
| 一组操作的额外参数。 |
|
|
|
| 定义 AccessTier 的值。 |
|
|
| 与上传 Blob 相关的大多数操作 | 块内容的 MD5 哈希。此哈希用于在传输过程中验证块的完整性。当指定此标头时,存储服务会比较与此标头值到达的内容的哈希值。请注意,这个 MD5 哈希不使用 blob 存储。如果两个哈希不匹配,则操作将失败。 |
|
|
| 与页面 Blob 相关的操作 | {@link PageRange} 对象。假设页面必须与 512 字节界限一致,开始偏移必须是 512ulus 的 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 | 指定要执行的制作者操作,请参阅此页面上与制作者操作相关的 doc。 |
|
|
|
| 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。可以是 null 以返回所有。如果同时设置了 prefix 和 regex,则 regex 会忽略 priority 和 prefix。 |
|
|
|
| 它过滤结果以在开始时间后大约返回事件。注: 也可以返回属于上一个小时的一些事件。属于此小时的几个事件可能会缺失;为了确保返回来自小时的所有事件,按一小时循环开始时间。 |
|
|
|
| 它过滤结果以在结束时间之前返回事件。注: 也可以返回属于下一个小时的一些事件。属于此小时的几个事件可能会缺失;为了确保返回小时中的所有事件,以一小时结束时间。 |
|
|
|
| 这提供了在服务调用期间通过 Http 管道传递的额外上下文。 |
|
|
|
| 在复制 blob 操作中用作源帐户名称的源 Blob 帐户名称 |
|
|
|
| 在复制 blob 操作中用作源容器名称的源 Blob 容器名称 |
10.5.2. 由组件制作者或消费者设置的消息标头
标头 | 变量名称 | 类型 | 描述 |
---|---|---|---|
|
|
| 访问 blob 的层。 |
|
|
| 当 blob 的访问层最后一次更改时,日期时间。 |
|
|
| blob 的归档状态。 |
|
|
| blob 创建时间。 |
|
|
| 页面 blob 的当前序列号。 |
|
|
| blob 的大小。 |
|
|
| blob 的类型。 |
|
|
| 为 blob 指定的缓存控制。 |
|
|
| 提交到附加 Blob 的块数 |
|
|
| 为 blob 指定的内容分布。 |
|
|
| 为 blob 指定的内容编码。 |
|
|
| 为 blob 指定的内容语言。 |
|
|
| 为 blob 指定的内容 MD5。 |
|
|
| 为 blob 指定的内容类型。 |
|
|
| 当 blob 上的最后一次复制操作完成后,日期时间。 |
|
|
| blob 最后一次增量副本快照的快照标识符。 |
|
|
| blob 上执行的最后复制操作的标识符。 |
|
|
| 在 blob 上执行最后一次复制操作的进度。 |
|
|
| 在 blob 上执行最后一次复制操作的来源。 |
|
|
| blob 上执行的最后复制操作的状态。 |
|
|
| blob 上最后一个复制操作的描述。 |
|
|
| blob 的 E Tag |
|
|
| 表示 blob 的访问层是否从 blob 的属性中推断出来的标志。 |
|
|
| 表示 blob 是否已递增复制的标志。 |
|
|
| 表示 blob 的内容是否在服务器上加密的标志。 |
|
|
| 当 Blob 最后一次修改时,日期时间。 |
|
|
| blob 上的租期类型。 |
|
|
| blob 上的租期状态。 |
|
|
| blob 上租期的状态。 |
|
|
| 与 blob 关联的其他元数据。 |
|
|
| 块提交到块 Blob 的偏移。 |
|
|
|
从操作下载的文件名 |
|
|
|
由 |
|
|
| 返回用户可以使用的未解析 httpHeaders。 |
10.5.3. 高级 Azure Storage Blob 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 BlobServiceClient
实例配置拥有更多控制,您可以创建自己的实例:
StorageSharedKeyCredential credential = new StorageSharedKeyCredential("yourAccountName", "yourAccessKey"); String uri = String.format("https://%s.blob.core.windows.net", "yourAccountName"); BlobServiceClient client = new BlobServiceClientBuilder() .endpoint(uri) .credential(credential) .buildClient(); // This is camel context context.getRegistry().bind("client", client);
然后,在 Camel azure-storage-blob
组件配置中引用这个实例:
from("azure-storage-blob://cameldev/container1?blobName=myblob&serviceClient=#client") .to("mock:result");
10.5.4. 在 registry 中自动检测 BlobServiceClient 客户端
组件能够检测 registry 中的 BlobServiceClient bean 存在。如果这是该类型的唯一实例,它将用作客户端,并且您不必将其定义为 uri 参数,如上例所示。这对端点的智能配置可能非常有用。
10.5.5. Azure Storage Blob Producer 操作
Camel Azure Storage Blob 组件在制作者端提供广泛的操作:
对服务级别的操作
对于这些操作,需要 accountName
。
操作 | 描述 |
---|---|
| 获取 blob 的内容。您可以将此操作的输出限制为 blob 范围。 |
| 返回对存储帐户中的 blob 和 blob 元数据的所有更改的事务日志。更改源提供这些更改的排序、保证、持久性、不可变、只读日志。 |
容器级别的操作
对于这些操作,需要 accountName
和 containerName
。
操作 | 描述 |
---|---|
| 在存储帐户中创建新容器。如果存在具有相同名称的容器,则制作者将忽略它。 |
| 删除存储帐户中指定的容器。如果容器不存在,则操作会失败。 |
| 返回此容器中的 blob 列表,文件夹结构扁平化。 |
对 blob 级别的操作
对于这些操作,需要 accountName
、containerName
和 blobName
。
操作 | blob 类型 | 描述 |
---|---|---|
| Common | 获取 blob 的内容。您可以将此操作的输出限制为 blob 范围。 |
| Common | 删除 blob。 |
| Common | 将整个 blob 下载到路径指定的文件中。如果文件已存在 {@link FileAlreadyExistsException},则该文件必须不存在。 |
| Common | 使用共享访问令牌(SAS)为指定的 blob 生成下载链接。默认情况下,仅允许 1 小时访问。但是,您可以通过标头覆盖默认的过期持续时间。 |
| BlockBlob | 创建新的块 blob,或更新现有块 Blob 的内容。更新现有块 Blob 覆盖 blob 上的任何现有元数据。PutBlob 不支持部分更新,现有 Blob 的内容会被新内容覆盖。 |
|
|
将指定块上传到块 blob 的"staging 区域",以便稍后由对 commitBlobBlockList 的调用提交。但是,如果标头 |
|
|
通过指定要组成 blob 的块 ID 列表来写入 blob。为了作为 blob 的一部分编写,必须在之前的 |
|
| 使用指定的块列表过滤器返回作为块 blob 的一部分上传的块列表。 |
|
| 创建 0-length 附加 blob。调用 commitAppendBlo'b 操作,将数据附加到附加 Blob。 |
|
|
向现有附加 Blob 末尾提交一个新的数据块。如果标头 |
|
|
创建指定长度的页面 blob。调用 |
|
|
将一个或多个页面写入页面 blob。写入大小必须是 512 的倍数。如果标头 |
|
| 将页面 blob 调整为指定大小(必须是 512 的倍数)。 |
|
| 从页面 blob 中释放指定的页面。范围的大小必须是 512 的倍数。 |
|
| 返回页面 blob 或页面 blob 快照的有效页面范围列表。 |
|
| 将 blob 从一个容器复制到另一个容器,即使来自不同帐户。 |
请参阅此页面中的示例部分,了解如何在 camel 应用程序中使用这些操作。
10.5.6. 消费者示例
要使用文件组件将 blob 消耗到文件中,如下所示:
from("azure-storage-blob://camelazure/container1?blobName=hello.txt&accountName=yourAccountName&accessKey=yourAccessKey"). to("file://blobdirectory");
但是,您还可以直接在不使用文件组件的情况下写入文件,您需要指定 fileDir
文件夹路径,以便在您的机器中保存 blob。
from("azure-storage-blob://camelazure/container1?blobName=hello.txt&accountName=yourAccountName&accessKey=yourAccessKey&fileDir=/var/to/awesome/dir"). to("mock:results");
另外,组件支持批处理消费者,因此您可以消耗多个 Blob,它只指定容器名称,使用者将根据容器中的 Blob 数量返回多个交换。
示例
from("azure-storage-blob://camelazure/container1?accountName=yourAccountName&accessKey=yourAccessKey&fileDir=/var/to/awesome/dir"). to("mock:results");
10.5.7. 生成者操作示例
-
listBlobContainers
from("direct:start") .process(exchange -> { // set the header you want the producer to evaluate, refer to the previous // section to learn about the headers that can be set // e.g: exchange.getIn().setHeader(BlobConstants.LIST_BLOB_CONTAINERS_OPTIONS, new ListBlobContainersOptions().setMaxResultsPerPage(10)); }) .to("azure-storage-blob://camelazure?operation=listBlobContainers&client&serviceClient=#client") .to("mock:result");
-
createBlobContainer
from("direct:start") .process(exchange -> { // set the header you want the producer to evaluate, refer to the previous // section to learn about the headers that can be set // e.g: exchange.getIn().setHeader(BlobConstants.BLOB_CONTAINER_NAME, "newContainerName"); }) .to("azure-storage-blob://camelazure/container1?operation=createBlobContainer&serviceClient=#client") .to("mock:result");
-
deleteBlobContainer
:
from("direct:start") .process(exchange -> { // set the header you want the producer to evaluate, refer to the previous // section to learn about the headers that can be set // e.g: exchange.getIn().setHeader(BlobConstants.BLOB_CONTAINER_NAME, "overridenName"); }) .to("azure-storage-blob://camelazure/container1?operation=deleteBlobContainer&serviceClient=#client") .to("mock:result");
-
listBlobs
:
from("direct:start") .process(exchange -> { // set the header you want the producer to evaluate, refer to the previous // section to learn about the headers that can be set // e.g: exchange.getIn().setHeader(BlobConstants.BLOB_CONTAINER_NAME, "overridenName"); }) .to("azure-storage-blob://camelazure/container1?operation=listBlobs&serviceClient=#client") .to("mock:result");
-
getBlob
:
我们都可以在交换正文中设置 outputStream
,并将数据写入其中。例如:
from("direct:start") .process(exchange -> { // set the header you want the producer to evaluate, refer to the previous // section to learn about the headers that can be set // e.g: exchange.getIn().setHeader(BlobConstants.BLOB_CONTAINER_NAME, "overridenName"); // set our body exchange.getIn().setBody(outputStream); }) .to("azure-storage-blob://camelazure/container1?blobName=blob&operation=getBlob&serviceClient=#client") .to("mock:result");
如果没有设置正文,则此操作将为我们提供一个 InputStream
实例,以便进一步下游:
from("direct:start") .to("azure-storage-blob://camelazure/container1?blobName=blob&operation=getBlob&serviceClient=#client") .process(exchange -> { InputStream inputStream = exchange.getMessage().getBody(InputStream.class); // We use Apache common IO for simplicity, but you are free to do whatever dealing // with inputStream System.out.println(IOUtils.toString(inputStream, StandardCharsets.UTF_8.name())); }) .to("mock:result");
-
deleteBlob
:
from("direct:start") .process(exchange -> { // set the header you want the producer to evaluate, refer to the previous // section to learn about the headers that can be set // e.g: exchange.getIn().setHeader(BlobConstants.BLOB_NAME, "overridenName"); }) .to("azure-storage-blob://camelazure/container1?blobName=blob&operation=deleteBlob&serviceClient=#client") .to("mock:result");
-
下载BlobToFile
:
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' 的容器容器容器中的 file.txt 将被复制到同一帐户的容器容器blob2 中。
10.5.8. 开发备注(Important)
所有集成测试都使用 Testcontainers 并运行。需要获取 Azure accessKey 和 accountName 才能使用 Azure 服务运行所有集成测试。除了模拟单元测试外,还需要使用您进行的每个更改来运行集成测试,甚至客户端升级,因为 Azure 客户端可能会在次版本升级时破坏问题。要运行集成测试,在这个组件目录中运行以下 maven 命令:
mvn verify -PfullTests -DaccountName=myacc -DaccessKey=mykey
其中by accountName
是您的 Azure 帐户名称,accessKey
是从 Azure 门户生成的访问密钥。
10.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 azure-storage-blob 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-azure-storage-blob-starter</artifactId> </dependency>
组件支持 32 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.azure-storage-blob.access-key | 用于连接 azure 帐户名称的访问密钥,用于使用 azure blob 服务进行身份验证。 | 字符串 | |
camel.component.azure-storage-blob.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.azure-storage-blob.blob-name | blob 名称,使用容器中的特定 blob。但是,在制作者上,只有 blob 级别上的操作才需要。 | 字符串 | |
camel.component.azure-storage-blob.blob-offset | 为上传或下载操作设置 blob 偏移,默认为 0。 | 0 | Long |
camel.component.azure-storage-blob.blob-sequence-number | 用户控制的值,可用于跟踪请求。序列号的值必须在 0 到 263 到 1 之间。默认值为 0。 | 0 | Long |
camel.component.azure-storage-blob.blob-type | blob 类型,为每个 blob 类型启动适当的设置。 | BlobType | |
camel.component.azure-storage-blob.block-list-type | 指定要返回的块类型。 | BlockListType | |
camel.component.azure-storage-blob.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.azure-storage-blob.change-feed-context | 在使用 getChangeFeed producer 操作时,这提供了在服务调用期间通过 Http 管道传递的额外上下文。选项是一个 com.azure.core.util.Context 类型。 | Context | |
camel.component.azure-storage-blob.change-feed-end-time | 使用 getChangeFeed producer 操作时,这将过滤结果,以便在结束时间前返回事件。注: 也可以返回属于下一个小时的一些事件。属于此小时的几个事件可能会缺失;为了确保返回小时中的所有事件,以一小时结束时间。选项是一个 java.time.OffsetDateTime 类型。 | OffsetDateTime | |
camel.component.azure-storage-blob.change-feed-start-time | 使用 getChangeFeed producer 操作时,这将过滤结果,以便在开始时间后大约返回事件。注: 也可以返回属于上一个小时的一些事件。属于此小时的几个事件可能会缺失;为了确保返回来自小时的所有事件,按一小时循环开始时间。选项是一个 java.time.OffsetDateTime 类型。 | OffsetDateTime | |
camel.component.azure-storage-blob.close-stream-after-read | 在读取或保持打开后关闭流,默认为 true。 | true | 布尔值 |
camel.component.azure-storage-blob.close-stream-after-write | 在写或保持打开后关闭流,默认为 true。 | true | 布尔值 |
camel.component.azure-storage-blob.commit-block-list-later | 当设置为 true 时,暂存块不会直接提交。 | true | 布尔值 |
camel.component.azure-storage-blob.configuration | 组件配置。选项是一个 org.apache.camel.component.azure.storage.blob.BlobConfiguration 类型。 | BlobConfiguration | |
camel.component.azure-storage-blob.create-append-blob | 当设置为 true 时,在提交附加块时将创建附加块。 | true | 布尔值 |
camel.component.azure-storage-blob.create-page-blob | 当设置为 true 时,上传页面 Blob 时将创建页面 blob。 | true | 布尔值 |
camel.component.azure-storage-blob.credentials | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,这包含重要的身份验证信息。选项是一个 com.azure.storage.common.StorageSharedKeyCredential 类型。 | StorageSharedKeyCredential | |
camel.component.azure-storage-blob.data-count | 范围内的字节数。如果指定,则必须大于或等于 0。 | Long | |
camel.component.azure-storage-blob.download-link-expiration | 覆盖 URL 下载链接的默认过期时间(millis)。 | Long | |
camel.component.azure-storage-blob.enabled | 是否启用 azure-storage-blob 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.azure-storage-blob.file-dir | 下载的 Blob 保存到的文件的目录,这可用于生成者和消费者。 | 字符串 | |
camel.component.azure-storage-blob.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.azure-storage-blob.max-results-per-page | 指定要返回的 Blob 数量上限,包括所有 BlobPrefix 元素。如果请求没有指定 maxResultsPerPage 或指定大于 5,000 的值,服务器将返回最多 5,000 个项目。 | 整数 | |
camel.component.azure-storage-blob.max-retry-requests | 指定从响应正文读取数据时将要进行的额外 HTTP 获取请求的最大数量。 | 0 | 整数 |
camel.component.azure-storage-blob.operation | 可在制作者上与这个组件一起使用的 blob 操作。 | BlobOperationsDefinition | |
camel.component.azure-storage-blob.page-blob-size | 指定页面 blob 的最大大小,最多 8 TB。页面 blob 大小必须与 512 字节边界一致。 | 512 | Long |
camel.component.azure-storage-blob.prefix | 过滤结果,以仅返回名称以指定前缀开头的 Blob。可以是 null,以返回所有 Blob。 | 字符串 | |
camel.component.azure-storage-blob.regex | 过滤结果,以仅返回名称与指定正则表达式匹配的 Blob。如果同时设置了 prefix 和 regex,则正则表达式 可能是 null,则忽略 priority 和 prefix。 | 字符串 | |
camel.component.azure-storage-blob.service-client | 客户端到存储帐户。此客户端不包含有关特定存储帐户的状态,而是便捷地将适当的请求发送到该服务上的资源。它还可用于将 URL 构造到 blob 和容器。此客户端包含服务帐户的操作。容器的操作可在 BlobContainerClient via BlobServiceClient114getBlobContainerClient (String)上提供,并且 blob 上的操作可以通过 BlobContainerClient114getBlobClient (String)在 BlobClient 上提供。选项是一个 com.azure.storage.blob.BlobServiceClient 类型。 | BlobServiceClient | |
camel.component.azure-storage-blob.source-blob-access-key | source Blob Access Key: 对于复制blob 操作,我们需要为源 Blob 有一个 accessKey,我们需要复制 accessKey 作为标头,因此我们可以设置为密钥。 | 字符串 | |
camel.component.azure-storage-blob.timeout | 可选的超时值,超过 RuntimeException 会被引发。选项是一个 java.time.Duration 类型。 | Duration |
第 11 章 Azure Storage Queue Service
支持生成者和消费者
Azure Storage Queue 组件支持使用 Azure APIs v12,将信息存储和检索到 Azure Storage Queue 服务。但是,如果版本 v12,我们会看到此组件是否可以根据有问题的更改量而采用这些更改。
先决条件
您必须有一个有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-azure-storage-queue</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
11.1. URI 格式
azure-storage-queue://accountName[/queueName][?options]
如果是 consumer,则需要 accountName 和 queueName。如果是生成者,它取决于请求的操作,例如,如果操作位于服务级别上,例如:listQueues,仅需要 accountName,但在队列级别上请求 operationName,如 createQueue、sendMessage. 等,则需要 accountName 和 queueName。
如果队列尚不存在,则会创建队列。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
11.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
11.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
11.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
11.3. 组件选项
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 或任意正数。格式应为 20.345 秒:PnDTnHnMn.nS.,例如:PT20.345S 345- parses 为 20.345,因为这些 Java API 是类型safe。 | Duration | |
visibilityTimeout (queue) | 消息在队列中不可见的超时时间。超时时间必须在 1 秒和 7 天之间。格式应为 20.345 秒:PnDTnHnMn.nS.,例如:PT20.345S 345- parses 为 20.345,因为这些 Java API 是类型safe。 | Duration | |
accessKey (security) | 用于连接 azure 帐户名称的访问密钥,用于使用 azure 队列服务进行身份验证。 | 字符串 | |
凭证 (安全) | 可以注入 StorageSharedKeyCredential 来创建 azure 客户端,这包含重要的身份验证信息。 | StorageSharedKeyCredential |
11.4. 端点选项
Azure Storage Queue Service 端点使用 URI 语法进行配置:
azure-storage-queue:accountName/queueName
使用以下路径和查询参数:
11.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
accountName (common) | 用于使用 azure 队列服务进行身份验证的 Azure 帐户名称。 | 字符串 | |
queueName (common) | 队列资源名称。 | 字符串 |
11.4.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 或任意正数。格式应为 20.345 秒:PnDTnHnMn.nS.,例如:PT20.345S 345- parses 为 20.345,因为这些 Java API 是类型safe。 | Duration | |
visibilityTimeout (queue) | 消息在队列中不可见的超时时间。超时时间必须在 1 秒和 7 天之间。格式应为 20.345 秒:PnDTnHnMn.nS.,例如:PT20.345S 345- parses 为 20.345,因为这些 Java API 是类型safe。 | 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 代表可用于检索较低级别的客户端。
11.5. 使用方法
例如,若要从 storageAccount
存储帐户中的队列 消息Queue
获取消息内容,请使用以下代码片段:
from("azure-storage-queue://storageAccount/messageQueue?accessKey=yourAccessKey"). to("file://queuedirectory");
11.5.1. 组件制作者评估的消息标头
标头 | 变量名称 | 类型 | 操作 | 描述 |
---|---|---|---|---|
|
|
|
| 列出队列的选项 |
|
|
| All | 可选的超时值,超过 \{@link RuntimeException} 将引发。 |
|
|
|
| 与队列关联的元数据 |
|
|
|
| 消息将在队列中保持活跃的时长。如果未设置该值,则默认值为 7 天,如果 -1 传递,则消息不会过期。生存时间必须是 -1 或任意正数。 |
|
|
|
| 消息在队列中不可见的超时时间。如果未设置该值,则消息将立即可见。超时时间必须在 0 秒和 7 天之间。 |
|
|
|
|
当设置为 |
|
|
|
| 必须匹配的唯一标识符才能删除或更新消息。 |
|
|
|
| 要删除或更新的消息的 ID。 |
|
|
|
| 如果队列中存在比请求所有消息少的消息数量,则需要获取的最大消息数。如果只检索空 1 个消息,则允许的范围为 1 到 32 个消息。 |
|
|
| All | 指定要执行的制作者操作,请参阅此页面上与制作者操作相关的 doc。 |
|
|
| All | 覆盖队列名称。 |
11.5.2. 由组件制作者或消费者设置的消息标头
标头 | 变量名称 | 类型 | 描述 |
---|---|---|---|
|
|
| 发送到队列的消息 ID。 |
|
|
| 消息插入到 Queue 的时间。 |
|
|
| 消息将过期并自动删除的时间。 |
|
|
| 删除/更新消息需要这个值。如果删除失败,则此弹出信息已被另一个客户端取消队列。 |
|
|
| 消息再次在 Queue 中可见的时间。 |
|
|
| 消息被取消队列的次数。 |
|
|
| 返回用户可以使用的未解析 httpHeaders。 |
11.5.3. 高级 Azure Storage Queue 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 QueueServiceClient
实例配置拥有更多控制,您可以创建自己的实例:
StorageSharedKeyCredential credential = new StorageSharedKeyCredential("yourAccountName", "yourAccessKey"); String uri = String.format("https://%s.queue.core.windows.net", "yourAccountName"); QueueServiceClient client = new QueueServiceClientBuilder() .endpoint(uri) .credential(credential) .buildClient(); // This is camel context context.getRegistry().bind("client", client);
然后,在 Camel azure-storage-queue
组件配置中引用这个实例:
from("azure-storage-queue://cameldev/queue1?serviceClient=#client") .to("file://outputFolder?fileName=output.txt&fileExist=Append");
11.5.4. 在 registry 中自动检测 QueueServiceClient 客户端
组件能够检测将 QueueServiceClient bean 是否存在到 registry 中。如果这是该类型的唯一实例,它将用作客户端,并且您不必将其定义为 uri 参数,如上例所示。这对端点的智能配置可能非常有用。
11.5.5. Azure Storage Queue Producer 操作
Camel Azure Storage Queue 组件在制作者端提供广泛的操作:
对服务级别的操作
对于这些操作,需要 accountName
。
操作 | 描述 |
---|---|
| 列出存储帐户中从指定标记开始的过滤器的队列。 |
对队列级别的操作
对于这些操作,需要 accountName
和 queueName
。
操作 | 描述 |
---|---|
| 创建新队列。 |
| 永久删除队列。 |
| 删除队列中的所有消息。 |
|
默认 Producer 操作 会发送一个带有给定生存时间的消息,以及消息在队列中不可见的超时周期。消息文本从交换消息正文评估。默认情况下,如果队列不存在,它将首先创建一个空队列。如果要禁用此功能,请将 config |
| 删除队列中指定的消息。 |
| 最多从队列检索最大消息数,并从超时时间的其他操作中隐藏它们。但是,由于可靠性的原因,它不会将消息从队列中分离。 |
| 来自队列前面的消息,最高到消息的最大数量。 |
| 使用新消息更新队列中的特定消息,并重置可见性超时。消息文本从交换消息正文评估。 |
请参阅此页面中的示例部分,了解如何在 camel 应用程序中使用这些操作。
11.5.6. 消费者示例
要在一个批处理中最多 5 个消息的文件中消耗队列,如下所示:
from("azure-storage-queue://cameldev/queue1?serviceClient=#client&maxMessages=5") .to("file://outputFolder?fileName=output.txt&fileExist=Append");
11.5.7. 生成者操作示例
-
listQueues
:
from("direct:start") .process(exchange -> { // set the header you want the producer to evaluate, refer to the previous // section to learn about the headers that can be set // e.g, to only returns list of queues with 'awesome' prefix: exchange.getIn().setHeader(QueueConstants.QUEUES_SEGMENT_OPTIONS, new QueuesSegmentOptions().setPrefix("awesome")); }) .to("azure-storage-queue://cameldev?serviceClient=#client&operation=listQueues") .log("${body}") .to("mock:result");
-
createQueue
:
from("direct:start") .process(exchange -> { // set the header you want the producer to evaluate, refer to the previous // section to learn about the headers that can be set // e.g: exchange.getIn().setHeader(QueueConstants.QUEUE_NAME, "overrideName"); }) .to("azure-storage-queue://cameldev/test?serviceClient=#client&operation=createQueue");
-
deleteQueue
:
from("direct:start") .process(exchange -> { // set the header you want the producer to evaluate, refer to the previous // section to learn about the headers that can be set // e.g: exchange.getIn().setHeader(QueueConstants.QUEUE_NAME, "overrideName"); }) .to("azure-storage-queue://cameldev/test?serviceClient=#client&operation=deleteQueue");
-
清除Queue
:
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");
11.5.8. 开发备注(Important)
在此组件上开发时,您需要获取 Azure accessKey 才能运行集成测试。除了模拟单元测试外,还需要使用您进行的每个更改来运行集成测试,甚至客户端升级,因为 Azure 客户端可能会在次版本升级时破坏问题。要运行集成测试,在这个组件目录中运行以下 maven 命令:
mvn verify -PfullTests -DaccountName=myacc -DaccessKey=mykey
其中by accountName
是您的 Azure 帐户名称,accessKey
是从 Azure 门户生成的访问密钥。
11.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 azure-storage-queue 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-azure-storage-queue-starter</artifactId> </dependency>
组件支持 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 或任意正数。格式应为 20.345 秒:PnDTnHnMn.nS.,例如:PT20.345S 345- parses 为 20.345,因为这些 Java API 是类型safe。选项是一个 java.time.Duration 类型。 | Duration | |
camel.component.azure-storage-queue.timeout | 应用到操作的可选超时。如果在超时结束前未返回响应,则会抛出 RuntimeException。选项是一个 java.time.Duration 类型。 | Duration | |
camel.component.azure-storage-queue.visibility-timeout | 消息在队列中不可见的超时时间。超时时间必须在 1 秒和 7 天之间。格式应为 20.345 秒:PnDTnHnMn.nS.,例如:PT20.345S 345- parses 为 20.345,因为这些 Java API 是类型safe。选项是一个 java.time.Duration 类型。 | Duration |
第 12 章 bean
仅支持生成者
Bean 组件将 Bean 绑定到 Camel 消息交换。
12.1. URI 格式
bean:beanName[?options]
其中 beanID 可以是用于在 Registry 中查找 bean 的任何字符串
12.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
12.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
12.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
12.3. 组件选项
Bean 组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
cache (producer) | 弃用了 使用单例选项。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
scope (producer) | bean 范围。使用单例范围(默认) 时,仅创建或只查找一次,并在端点生命周期内重复使用一次。如果并发线程同时调用 bean,则 bean 应该是 thread-safe。在使用请求范围时,根据请求创建或查找一次(交换)。如果您要在处理请求时将状态存储在 bean 中,且您希望在处理请求时多次调用同一 bean 实例,则可以使用此项。bean 不必线程安全,因为实例仅从同一请求调用。在使用委派范围时,将根据调用查找或创建 bean。但是,如果查找,则这会被委派给 bean registry,如 Spring 或 CDI (如果使用),这依赖于它们的配置,也可以作为单例范围或与之分配的范围。因此,这取决于委派的 registry。 Enum 值:
| 单例 | BeanScope |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
12.4. 端点选项
Bean 端点使用 URI 语法进行配置:
bean:beanName
使用以下路径和查询参数:
12.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
beanName (common) | 必需 设置要调用的 bean 的名称。 | 字符串 |
12.4.2. 查询参数(5 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
cache (common) | 弃用的 Use scope 选项替代。 | 布尔值 | |
method (common) | 设置要在 bean 上调用的方法名称。 | 字符串 | |
scope (common) | bean 范围。使用单例范围(默认) 时,仅创建或只查找一次,并在端点生命周期内重复使用一次。如果并发线程同时调用 bean,则 bean 应该是 thread-safe。在使用请求范围时,根据请求创建或查找一次(交换)。如果您要在处理请求时将状态存储在 bean 中,且您希望在处理请求时多次调用同一 bean 实例,则可以使用此项。bean 不必线程安全,因为实例仅从同一请求调用。使用过期范围时,将根据调用查找或创建 bean。但是,如果查找,则这会被委派给 bean registry,如 Spring 或 CDI (如果使用),这依赖于它们的配置,也可以作为单例范围或与之分配的范围。因此,这取决于委派的 registry。 Enum 值:
| 单例 | BeanScope |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
参数 (advanced) | 用于在 bean 上配置附加属性。 | Map |
12.5. 使用
用于使用消息的对象实例必须使用 Registry 显式注册。例如,如果您使用 Spring,则必须在 Spring 配置 XML 文件中定义 bean。
您还可以使用 bind
方法通过 Camel 的 Registry
手动注册 Bean。
注册端点后,您可以构建用于处理交换的 Camel 路由。
bean: 端点不能定义为路由的输入;例如,您无法从其中使用,您只能从某些入站消息端点路由到 bean 端点。因此请考虑使用 direct: 或 queue: 端点作为输入。
您可以使用 ProxyHelper 上的 createProxy ()
方法创建一个代理,该代理将生成交换并将其发送到任何端点:
以及使用 XML DSL 的同一路由:
<route> <from uri="direct:hello"/> <to uri="bean:bye"/> </route>
12.6. Bean 作为端点
Camel 还支持将 Bean 作为端点调用。这是因为当交换路由到 myBean
Camel 时,使用 Bean Binding 来调用 bean。bean 的源仅是一个普通 POJO。
Camel 将使用 Bean Binding 调用声明 Hello
方法,方法是将 Exchange 的 In body 转换为 String
类型,并将方法的输出存储在 Exchange Out 正文上。
12.7. Java DSL bean 语法
Java DSL 附带组件的总语法。您可以使用以下语法,而不是将 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);
12.8. Bean 绑定
如何选择 bean 方法(如果通过 method 参数明确指定)以及如何从 Message 构建参数值由 Bean Binding 机制定义,这些机制在 Camel 中的所有 Bean 集成机制中使用。
12.9. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 bean 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-bean-starter</artifactId> </dependency>
组件支持 13 个选项,如下所列。
Name | 描述 | Default(默认) | 类型 |
---|---|---|---|
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 应该是 thread-safe。在使用请求范围时,根据请求创建或查找一次(交换)。如果您要在处理请求时将状态存储在 bean 中,且您希望在处理请求时多次调用同一 bean 实例,则可以使用此项。bean 不必线程安全,因为实例仅从同一请求调用。在使用委派范围时,将根据调用查找或创建 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 应该是 thread-safe。在使用请求范围时,根据请求创建或查找一次(交换)。如果您要在处理请求时将状态存储在 bean 中,且您希望在处理请求时多次调用同一 bean 实例,则可以使用此项。bean 不必线程安全,因为实例仅从同一请求调用。在使用委派范围时,将根据调用查找或创建 bean。但是,如果查找,则这会被委派给 bean registry,如 Spring 或 CDI (如果使用),这依赖于它们的配置,也可以作为单例范围或与之分配的范围。因此,这取决于委派的 registry。 | BeanScope | |
camel.language.bean.enabled | 是否启用 bean 语言的自动配置。这默认是启用的。 | 布尔值 | |
camel.language.bean.scope | bean 范围。使用单例范围(默认) 时,仅创建或只查找一次,并在端点生命周期内重复使用一次。如果并发线程同时调用 bean,则 bean 应该是 thread-safe。在使用请求范围时,根据请求创建或查找一次(交换)。如果您要在处理请求时将状态存储在 bean 中,且您希望在处理请求时多次调用同一 bean 实例,则可以使用此项。bean 不必线程安全,因为实例仅从同一请求调用。使用过期范围时,将根据调用查找或创建 bean。但是,如果查找,则这会被委派给 bean registry,如 Spring 或 CDI (如果使用),这取决于它们的配置可以充当单例范围,也可以充当其他范围。因此,在使用过期范围时,这取决于 bean registry 实现。 | 单例 | 字符串 |
camel.language.bean.trim | 是否修剪值以移除前导和结尾的空格和换行符。 | true | 布尔值 |
camel.component.bean.cache | 弃用了 使用单例选项。 | true | 布尔值 |
camel.component.class.cache | 弃用了 使用单例选项。 | true | 布尔值 |
第 13 章 Bean Validator
仅支持生成者
Validator 组件使用 Java Bean Validation API ()执行消息正文的 bean 验证。Camel 使用参考实施,即 Hibernate Validator。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-bean-validator</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
13.1. URI 格式
bean-validator:label[?options]
其中 label 是描述端点的任意文本值。您可以以以下格式将查询选项附加到 URI 中,
?option=value&option=value&…
13.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
13.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
13.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
13.3. 组件选项
Bean Validator 组件支持 8 个选项,如下所列。
Name | 描述 | Default(默认) | 类型 |
---|---|---|---|
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 |
13.4. 端点选项
Bean Validator 端点使用 URI 语法进行配置:
bean-validator:label
使用以下路径和查询参数:
13.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
label (producer) | 必需 的位置标签是描述端点的任意文本值。 | 字符串 |
13.4.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 |
13.5. 过程部署
要在 IaaS 环境中使用 Hibernate Validator,请使用专用的 ValidationProviderResolver
实现,就像 org.apache.camel.component.bean.validator.HibernateValidationProviderResolver
一样。以下片段演示了这种方法。您还可以使用 HibernateValidationProviderResolver
。
Using HibernateValidationProviderResolver
from("direct:test"). to("bean-validator://ValidationProviderResolverTest?validationProviderResolver=#myValidationProviderResolver");
<bean id="myValidationProviderResolver" class="org.apache.camel.component.bean.validator.HibernateValidationProviderResolver"/>
如果没有定义自定义 ValidationProviderResolver
,并且验证器组件已部署到 sVirt 环境中,则会自动使用 HibernateValidationProviderResolver
。
13.6. 示例
假设我们有一个带有以下注解的 java bean
Car.java
public class Car { @NotNull private String manufacturer; @NotNull @Size(min = 5, max = 14, groups = OptionalChecks.class) private String licensePlate; // getter and setter }
以及自定义验证组的接口定义
OptionalChecks.java
public interface OptionalChecks { }
使用以下 Camel 路由时,只有属性制造商和 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>
13.7. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 bean-validator 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-bean-validator-starter</artifactId> </dependency>
组件支持 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 |
第 14 章 浏览
支持生成者和消费者
Browse 组件提供了一个简单的 BrowsableEndpoint,可用于测试、可视化工具或调试。发送到端点的交换都可用于浏览。
14.1. URI 格式
browse:someName[?options]
其中 someName 可以是唯一标识端点的任意字符串。
14.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
14.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
14.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
14.3. 组件选项
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 | 布尔值 |
14.4. 端点选项
Browse 端点使用 URI 语法进行配置:
browse:name
使用以下路径和查询参数:
14.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (common) | 必需的 A 名称,可以是任意字符串来唯一标识端点。 | 字符串 |
14.4.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 | 布尔值 |
14.5. 示例
在以下路由中,我们插入一个 browse:
组件,以便浏览要传递的交换:
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 } }
14.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用浏览时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-browse-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 15 章 Cassandra CQL
支持生成者和消费者
Apache Cassandra 是一个开源 IaaS 数据库,旨在处理商业硬件上的大量数据。与 Amazon 的 DynamoDB 一样,Casasa 具有对等和 master-less 架构,以避免单一故障点和高可用性。与 Google 的 TriTable 一样,Casasra 数据是使用列系列的结构化,可通过 Thrift RPC API 或称为 CQL 的 SQL API 访问。
此组件旨在使用 CQL3 API (而不是 Thrift API)集成 Cassandra 2.0+。它基于 DataStax 提供的 Cassandra Java 驱动程序。
15.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
15.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
15.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
15.2. 组件选项
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 | 布尔值 |
15.3. 端点选项
Cassandra CQL 端点使用 URI 语法进行配置:
cql:beanRef:hosts:port/keyspace
使用以下路径和查询参数:
15.3.1. 路径参数(4 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
beanRef (common) | beanRef 使用 bean:id 来定义。 | 字符串 | |
hosts (common) | 主机名 Cassandra 服务器。可以使用逗号分隔多个主机。 | 字符串 | |
port (common) | Cassandra 服务器的端口号。 | 整数 | |
键空间 (common) | 要使用的键空间。 | 字符串 |
15.3.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 的逻辑将 ResultSet 转换为消息 body 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 | 布尔值 |
15.4. 端点连接语法
端点可以启动 Cassandra 连接或使用现有的连接。
URI | 描述 |
---|---|
| 单个主机、默认端口、测试通常 |
| 多主机,默认端口 |
| 多主机、自定义端口 |
| 默认端口和键空间 |
| 提供的会话参考 |
| 提供的集群参考 |
要微调 Cassandra 连接(SSL 选项、池选项、负载平衡策略、重试策略、重新连接策略…),请创建自己的 Cluster 实例,并将其提供给 Camel 端点。
15.5. messages
15.5.1. 传入消息
Camel Cassandra 端点需要一个简单的对象(Object
或 Object[]
或 Collection<Object
>),它将绑定到 CQL 语句作为查询参数。如果消息正文为空或为空,那么将在不绑定参数的情况下执行 CQL 查询。
Headers
CamelCqlQuery
(可选、字符串
或常规状态
)CQL 以普通字符串形式查询或使用
QueryBuilder
构建。
15.5.2. 传出消息
Camel Cassandra 端点根据 resultSetConversionStrategy
生成一个或多个 Cassandra Row 对象:
-
list<Row
> 如果resultSetConversionStrategy
为ALL
或LIMIT_[0-9]+
-
如果
resultSetConversionStrategy
是ONE
,则单数为 Row' -
否则,如果
resultSetConversionStrategy
是ResultSetConversionStrategy
的自定义实现
15.6. 软件仓库
Cassandra 可用于存储用于幂等和聚合 EIP 的消息。
Cassandra 可能尚未是排队用例的最佳工具,请阅读 Cassandra 反模式队列和队列,如数据集。建议使用这些表的 LeveledCompaction 和一个小的 GC grace 设置,以便快速删除 tombstoned 行。
15.7. 幂等软件仓库
NamedCassandraIdempotentRepository
将消息密钥存储在 Cassandra 表中,如下所示:
CAMEL_IDEMPOTENT.cql
CREATE TABLE CAMEL_IDEMPOTENT ( NAME varchar, -- Repository name KEY varchar, -- Message key PRIMARY KEY (NAME, KEY) ) WITH compaction = {'class':'LeveledCompactionStrategy'} AND gc_grace_seconds = 86400;
此存储库实施使用轻量级事务(也称为 Compare 和 Set),并且需要 Cassandra 2.0.7+。
或者,CassandraIdempotentRepository
没有 NAME
列,并可扩展来使用不同的数据模型。
选项 | Default(默认) | 描述 |
---|---|---|
|
| 表名称 |
|
| 主密钥列 |
|
软件仓库名称,用于 | |
| 生存时间 | |
|
用于插入/删除密钥的一致性级别: | |
|
用于读取/检查键的一致性级别: |
15.8. 聚合存储库
NamedCassandraAggregationRepository
将交换由关联密钥存储在 Cassandra 表中,如下所示:
CAMEL_AGGREGATION.cql
CREATE TABLE CAMEL_AGGREGATION ( NAME varchar, -- Repository name KEY varchar, -- Correlation id EXCHANGE_ID varchar, -- Exchange id EXCHANGE blob, -- Serialized exchange PRIMARY KEY (NAME, KEY) ) WITH compaction = {'class':'LeveledCompactionStrategy'} AND gc_grace_seconds = 86400;
或者,CassandraAggregationRepository
没有 NAME
列,并可扩展为使用不同的数据模型。
选项 | Default(默认) | 描述 |
---|---|---|
|
| 表名称 |
|
| 主密钥列 |
|
| Exchange Id 列 |
|
| 交换内容列 |
|
软件仓库名称,用于 | |
| 交换时间 | |
|
用于插入/删除交换的一致性级别: | |
|
用于读取/检查交换的一致性级别: |
15.9. 例子
要在表中插入一些内容,您可以使用以下代码:
String CQL = "insert into camel_user(login, first_name, last_name) values (?, ?, ?)"; from("direct:input") .to("cql://localhost/camel_ks?cql=" + CQL);
此时,您应该能够使用列表作为正文插入数据
Arrays.asList("davsclaus", "Claus", "Ibsen")
相同的方法可用于更新或查询表。
15.10. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 cql 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-cassandraql-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 16 章 控制总线
仅支持生成者
EIP 模式的控制 总线 允许从框架内监控和管理集成系统。
使用控制总线来管理企业集成系统。控制总线使用与应用程序数据使用的相同消息传递机制,但使用单独的频道来传输与消息流中涉及的组件管理相关的数据。
在 Camel 中,您可以使用 JMX 管理和监控,或使用 CamelContext
中的 Java API 或 org.apache.camel.api.management
软件包,或使用此处具有示例的事件通知程序。
ControlBus 组件可根据控制总线 EIP 模式轻松管理 Camel 应用程序。例如,通过向端点发送消息来控制路由的生命周期,或收集性能统计信息。
controlbus:command[?options]
其中 command 可以是任何字符串,用于识别要使用的命令类型。
16.1. 命令
命令 | 描述 |
---|---|
|
使用 |
| 允许您指定用于评估消息正文的。如果评估有任何结果,则结果将放入消息正文中。 |
16.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
16.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
16.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
16.3. 组件选项
Control Bus 组件支持 2 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
16.4. 端点选项
Control Bus 端点使用 URI 语法进行配置:
controlbus:command:language
使用以下路径和查询参数:
16.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
command (producer) | 所需的命令 可以是 route 或 language。 Enum 值:
| 字符串 | |
language (producer) | 允许您指定用于评估消息正文的语言名称。如果评估有任何结果,则结果将放入消息正文中。 Enum 值:
| 语言 |
16.4.1.1. 查询参数(6 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
action (producer) | 要表示可以是 start、stop 或 status 的操作。要启动或停止路由,或者作为消息正文中的输出获取路由的状态。您可以使用挂起并从 Camel 2.11.1 中恢复来挂起或恢复路由。从 Camel 2.11.1 开始,您可以使用 stats 获取以 XML 格式返回的性能静态;routeId 选项可用于定义哪个路由来获取整个 CamelContext 的性能统计。restart 操作将重启路由。 Enum 值:
| 字符串 | |
async (producer) | 是否异步执行控制总线任务。重要:如果启用了这个选项,则任务的任何结果都不会在 Exchange 上设置。这只有在同步执行任务时才可能。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
loggingLevel (producer) | 任务完成后用于日志记录的日志记录级别,或者在处理任务期间发生任何异常。 Enum 值:
| INFO | LoggingLevel |
restartDelay (producer) | 重启路由时要使用的 millis 中的延迟。 | 1000 | int |
routeId (producer) | 按其 id 指定路由:special 关键字 current 表示当前的路由。 | 字符串 |
16.5. 使用 route 命令
通过 route 命令,您可以在给定路由上执行常见的任务,例如启动路由,您可以向这个端点发送空消息:
template.sendBody("controlbus:route?routeId=foo&action=start", null);
要获取路由的状态,您可以执行以下操作:
String status = template.requestBody("controlbus:route?routeId=foo&action=status", null, String.class);
16.6. 获取性能统计信息
这要求启用 JMX (默认为 ),然后您可以获取每个路由的性能统计信息,或用于 CamelContext。例如,要获取名为 foo 的路由的统计信息,我们可以执行以下操作:
String xml = template.requestBody("controlbus:route?routeId=foo&action=stats", null, String.class);
返回的统计信息采用 XML 格式。您可以使用 ManagedRouteMBean
上的 dumpRouteStatsAsXml
操作从 JMX 获取的相同数据。
要获取整个 CamelContext 的统计信息,只需省略 routeId 参数,如下所示:
String xml = template.requestBody("controlbus:route?action=stats", null, String.class);
16.7. 使用简单语言
您可以将 简单 语言与控制总线搭配使用,例如停止特定路由,您可以将消息发送到包含以下信息的 "controlbus:language:simple"
端点:
template.sendBody("controlbus:language:simple", "${camelContext.getRouteController().stopRoute('myRoute')}");
因为这是一个 void 操作,因此不会返回任何结果。但是,如果要进行路由状态:
String status = template.requestBody("controlbus:language:simple", "${camelContext.getRouteStatus('myRoute')}", String.class);
使用 route
命令控制路由的生命周期更为容易。语言
命令允许您执行具有更强大的电源的语言脚本,如 Groovy 或某些扩展 简单 语言。
例如,要关闭 Camel 本身,您可以执行以下操作:
template.sendBody("controlbus:language:simple?async=true", "${camelContext.stop()}");
我们使用 async=true
异步停止 Camel,否则我们将尝试在被发送到控制总线组件时尝试停止 Camel。
您还可以使用其他语言,如 Groovy 等等。
16.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 controlbus 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-controlbus-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 17 章 Cron
仅支持消费者
Cron 组件是一个通用接口组件,允许在使用 Unix cron 语法指定的特定间隔触发事件(例如: 0/2945 DS ? ?
),每两秒钟触发事件。
作为接口组件,Cron 组件不包含默认的实现,而是要求用户插入其选择的实施。
以下标准 Camel 组件支持 Cron 端点:
- camel-quartz
- camel-spring
Camel K 中也支持 Cron 组件,它可在 cron 表达式需要时使用 Kubernetes 调度程序触发路由。当使用与 Kubernetes cron 语法兼容的 cron 表达式时,Camel K 不需要插入额外的库。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-cron</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
可能需要其他库来插入特定的实现。
17.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
17.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
17.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
17.2. 组件选项
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。 | 字符串 |
17.3. 端点选项
Cron 端点使用 URI 语法进行配置:
cron:name
使用以下路径和查询参数:
17.3.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (consumer) | 必需 cron 触发器的名称。 | 字符串 |
17.3.2. 查询参数(4 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
schedule (consumer) | 必需的 A cron 表达式,用于生成事件。 | 字符串 | |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern |
17.4. 使用方法
组件可用于在指定时间触发事件,如下例所示:
from("cron:tab?schedule=0/1+*+*+*+*+?") .setBody().constant("event") .log("${body}");
调度表达式 0/3+10+114 +? 也可以写为
十分钟内每三个秒触发一次事件。
0/3 10945
?,并在每小时的
调度表达式中的部分表示(按顺序排列):
- 秒(可选)
- minutes
- 几小时
- 月份的日期
- 月
- 周天
- 年(可选)
计划表达式可由 5 个到 7 个部分组成。当表达式由 6 个部分组成时,第一个项是"秒"部分(和年份)。
调度表达式的其他有效示例如下:
-
0/2 * * * ?
(5 部分,每两分钟事件一次) -
0 0/2 200200 MON-FRI 2030
(7 部分,每两分钟,每 2 月 2030 日)
路由也可以使用 XML DSL 编写。
<route> <from uri="cron:tab?schedule=0/1+*+*+*+*+?"/> <setBody> <constant>event</constant> </setBody> <to uri="log:info"/> </route>
17.5. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 cron 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-cron-starter</artifactId> </dependency>
组件支持 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 组件的自动配置。这默认是启用的。 | 布尔值 |
第 18 章 CXF
支持生成者和消费者
CXF 组件提供与 Apache CXF 集成,用于连接在 CXF 中托管的 JAX-WS 服务。
当在流模式中使用 CXF 时(请参阅 DataFormat 选项),然后读取流缓存。
Maven 用户必须在其 pom.xml
中为这个组件添加以下依赖项:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-cxf-soap</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
18.1. URI 格式
此端点有两种 URI 格式: cxfEndpoint 和 someAddress。
cxf:bean:cxfEndpoint[?options]
其中 cxfEndpoint 代表引用 Spring bean registry 中的 bean 的 bean ID。使用这个 URI 格式,大多数端点详情都在 bean 定义中指定。
cxf://someAddress[?options]
其中 someAddress 指定 CXF 端点的地址。使用这个 URI 格式,大多数端点详情都会使用选项来指定。
对于以上任一风格,您可以在 URI 中附加选项,如下所示:
cxf:bean:cxfEndpoint?wsdlURL=wsdl/hello_world.wsdl&dataFormat=PAYLOAD
18.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
18.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
18.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为 配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
18.3. 组件选项
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 | 布尔值 |
18.4. 端点选项
CXF 端点使用 URI 语法进行配置:
cxf:beanId:address
使用以下路径和查询参数:
18.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
beanId (common) | 查找现有配置的 CxfEndpoint。必须使用 bean: 作为前缀。 | 字符串 | |
地址 (服务) | 服务发布地址。 | 字符串 |
18.4.2. 查询参数(35 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
dataformat (common) | CXF 端点支持的数据类型消息。 Enum 值:
| POJO | dataformat |
wrappedStyle (common) | 描述 SOAP 正文中如何表示参数的 WSDL 风格。如果值为 false,则 CXF 将选择 Documentation-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) | 要使用的主机名验证器。使用 sVirt 表示法引用 registry 中的 HostnameVerifier。 | HostnameVerifier | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
sslContextParameters (producer) | Camel SSL 设置参考。使用 DNAT 表示法引用 SSL 上下文。 | SSLContextParameters | |
wrap (producer) | CXF 端点制作者将调用的操作类型。 | false | 布尔值 |
Sync (producer (advanced)) | 设置是否应严格使用同步处理。 | false | 布尔值 |
allowStreaming (advanced) | 这个选项控制在 PAYLOAD 模式下运行 CXF 组件是否会将传入的消息解析为 DOM Elements,或将有效负载保留为 javax.xml.transform.Source 对象,在某些情况下允许流。 | 布尔值 | |
总线 (advanced) | 使用自定义配置的 CXF 总线。 | 总线 | |
continuationTimeout (advanced) | 这个选项用于设置 CXF continuation 超时,当 CXF 服务器使用 Jetty 或 Servlet 传输时,默认可在 CxfConsumer 中使用。 | 30000 | long |
cxfBinding (advanced) | 使用自定义 CxfBinding 来控制 Camel Message 和 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 (attachment)。这需要使用 POJO 或 PAYLOAD 数据格式模式。 | false | 布尔值 |
properties (advanced) | 使用映射中的键/值对来设置额外的 CXF 选项。例如,要在 SOAP 错误中打开 stacktraces, properties.faultStack TraceEnabled=true。 | Map | |
skipPayloadMessagePartCheck (advanced) | 设置是否应禁用 SOAP 消息验证。 | false | 布尔值 |
loggingFeatureEnabled (logging) | 这个选项启用 CXF Logging 功能,将入站和出站 SOAP 消息写入日志。 | false | 布尔值 |
loggingSizeLimit (logging) | 要限制在启用日志记录功能时日志记录器输出的字节数,-1 代表没有限制。 | 49152 | int |
skipFaultLogging (logging) | 这个选项控制 PhaseInterceptorChain 是否跳过它捕获的 Fault。 | false | 布尔值 |
密码 (安全) | 此选项用于为 CXF 客户端设置密码的基本身份验证信息。 | 字符串 | |
用户名 (安全) | 此选项用于为 CXF 客户端设置用户名的基本身份验证信息。 | 字符串 | |
bindingId (service) | 要使用的服务模型的 bindingId。 | 字符串 | |
portName (service) | 此服务的端点名称,它映射到 wsdl:portname。以 ns:PORT_NAME 格式,其中 ns 是在这个范围内有效的命名空间前缀。 | 字符串 | |
publishedEndpointUrl (service) | 此选项可覆盖从 WSDL 发布的 endpointUrl,可通过服务地址 url 和 wsd 访问。 | 字符串 | |
serviceClass (service) | SEI (Service Endpoint Interface)类的类名称,该类可以具有 JSR181 注解或不。 | 类 | |
serviceName (service) | 此服务正在实现的服务名称,它映射到 wsdl:servicename。 | 字符串 | |
wsdlURL (service) | WSDL 的位置。可以位于 classpath、文件系统或远程托管。 | 字符串 |
serviceName
和 portName
是 QNames,因此如果您提供它们带有其 {namespace} 前缀,如上例所示。
18.4.3. 数据格式的描述
在 Apache Camel 中,Camel CXF 组件是将路由与 Web 服务集成的关键。您可以使用 Camel CXF 组件创建一个 CXF 端点,该端点可使用以下方法之一使用:
- consumer - (在路由开始时)代表 Web 服务实例,与路由集成。注入路由的有效负载类型取决于端点的 dataFormat 选项的值。
- producer - (路由中的其他点)代表 WS 客户端代理,它将当前的交换对象转换为远程 Web 服务上的操作调用。当前交换的格式必须与端点的 dataFormat 设置匹配。
dataformat | 描述 |
---|---|
| POJO (旧 Java 对象)是目标服务器上调用的方法的 Java 参数。支持协议和逻辑 JAX-WS 处理程序。 |
|
|
|
|
|
|
您可以通过检索交换属性 CamelCXFDataFormat
来确定交换的数据格式模式。Exchange key 常量在 org.apache.camel.component.cxf.common.message.CxfConstants.DATA_FORMAT_PROPERTY
中定义。
18.4.4. 如何在 RAW 模式中启用 CXF 的 LoggingOutInterceptor
CXF 的 LoggingOutInterceptor
输出在有线到日志记录系统(Java Util Logging)上的出站消息。由于 LoggingOutInterceptor
处于 PRE_STREAM
阶段(但 PRE_STREAM
阶段以 RAW
模式删除),所以您必须将 LoggingOutInterceptor
配置为在 WRITE
阶段运行。以下是以下示例。
@Bean public CxfEndpoint serviceEndpoint(LoggingOutInterceptor loggingOutInterceptor) { CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint(); cxfEndpoint.setAddress("http://localhost:" + port + "/services" + SERVICE_ADDRESS); cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class); Map<String, Object> properties = new HashMap<String, Object>(); properties.put("dataFormat", "RAW"); cxfEndpoint.setProperties(properties); cxfEndpoint.getOutInterceptors().add(loggingOutInterceptor); return cxfEndpoint; } @Bean public LoggingOutInterceptor loggingOutInterceptor() { LoggingOutInterceptor logger = new LoggingOutInterceptor("write"); return logger; }
18.4.5. relayHeaders 选项的描述
有来自一个 JAXWS WSDL-first 开发者的 in-band 和 out-of-band on-the-wire 标头。
in-band 标头是明确定义为端点的 WSDL 绑定合同(如 SOAP 标头)的标头。
带外 标头是通过线序列化的标头,但不明确是 WSDL 绑定合同的一部分。
标头中继/过滤是双向的。
当路由具有 CXF 端点并且开发人员需要具有在线标头(如 SOAP 标头)时,会在由另一个 JAXWS 端点使用的路由间进行转发,然后将 relayHeaders
设置为 true
,这是默认值。
18.4.6. 仅适用于 POJO 模式
relayHeaders=true
表示转发标头的意图。对给定标头是否转发的实际决定将委派给实施 MessageHeadersRelay
接口的可插拔实例。将参考 MessageHeadersRelay
的共识实施,以确定是否需要转发标头。已实施 SoapMessageHeadersRelay
,它将自身绑定到已知的 SOAP 名字空间。目前,只过滤带外标头,并在 relayHeaders=true
时始终转发带外标头。如果线上有一个标头,其名称空间对于运行时未知,则使用回退 DefaultMessageHeadersRelay
,它只允许转发所有标头。
relayHeaders=false
设置指定所有标头带外和带外设置都应丢弃。
您可以插入您自己的 MessageHeadersRelay
实现,或向中继列表添加额外的 MessageHeadersRelay。要覆盖预加载的中继实例,请确保您的 MessageHeadersRelay
实现服务与您希望覆盖的名称相同。另请注意,覆盖中继必须服务所有要覆盖的名称空间,否则路由启动时的运行时异常将被抛出,因为这会给转发实例映射引入名字空间中的不确定性。
<cxf:cxfEndpoint ...> <cxf:properties> <entry key="org.apache.camel.cxf.message.headers.relays"> <list> <ref bean="customHeadersRelay"/> </list> </entry> </cxf:properties> </cxf:cxfEndpoint> <bean id="customHeadersRelay" class="org.apache.camel.component.cxf.soap.headers.CustomHeadersRelay"/>
查看显示您可以在此处转发/排序标头的测试:
-
支持
POJO
和PAYLOAD
模式。在POJO
模式中,只有带外消息标头才可以进行过滤,因为 cxf 从标头列表中移除。in-band 标头合并到 POJO 模式的MessageContentList
中。camel-cxf
组件会使任何尝试从MessageContentList
中删除 in-band 标头。如果需要过滤带头标头,请在 CXF 端点中使用PAYLOAD
模式或插入(pretty 拦截器) CXF 拦截器/DemoWS Handler。 -
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: |
| 否 |
所有消息标头都将传播(不由 Message Header Filters 处理) 类型: |
| 否 |
如果激活命名空间中的两个过滤器重叠,则属性控制如何处理它。如果值为 |
18.5. 使用 Spring 配置 CXF 端点
您可以使用下面显示的 Spring 配置文件配置 CXF 端点,您还可以将端点嵌入到 camelContext
标签中。在调用服务端点时,您可以将 operationName
和 operationNamespace
标头设置为显式状态您要调用的操作。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://camel.apache.org/schema/cxf" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <cxf:cxfEndpoint id="routerEndpoint" address="http://localhost:9003/CamelContext/RouterPort" serviceClass="org.apache.hello_world_soap_http.GreeterImpl"/> <cxf:cxfEndpoint id="serviceEndpoint" address="http://localhost:9000/SoapContext/SoapPort" wsdlURL="testutils/hello_world.wsdl" serviceClass="org.apache.hello_world_soap_http.Greeter" endpointName="s:SoapPort" serviceName="s:SOAPService" xmlns:s="http://apache.org/hello_world_soap_http" /> <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="cxf:bean:routerEndpoint" /> <to uri="cxf:bean:serviceEndpoint" /> </route> </camelContext> </beans>
务必包含 root Bean 元素上指定的 JAX-WS 模式Location
属性。这允许 CXF 验证文件,且是必需的。另请注意 < cxf:cxfEndpoint/&
gt; 标签末尾的命名空间声明。这些声明是必需的,因为此标签的属性值当前不支持组合 {namespace}localName
语法。
cxf:cxfEndpoint
元素支持许多附加属性:
Name | 值 |
---|---|
|
此服务的端点名称,它映射到 |
|
此服务正在实现的服务名称,它映射到 |
| WSDL 的位置。可以位于 classpath、文件系统或远程托管。 |
|
要使用的服务模型的 |
| 服务发布地址。 |
| JAX-WS 端点中使用的总线名称。 |
| SEI (Service Endpoint Interface)类的类名称,该类可以具有 JSR181 注解或不。 |
它还支持多个子元素:
Name | 值 |
---|---|
|
此端点的传入拦截器。< |
|
此端点的传入错误拦截器。< |
|
此端点传出的拦截器。< |
|
此端点传出的故障拦截器。< |
| 应该向 JAX-WS 端点提供的属性映射。请参阅以下。 |
| 应该向 JAX-WS 端点提供 JAX-WS 处理程序列表。请参阅以下。 |
|
您可以指定在端点中使用的 |
|
您可以为这个端点指定 |
| 保存此端点拦截器的功能。Bean 或 refs 列表 |
| 要使用的端点的模式位置。schemaLocations 列表 |
|
此端点要使用的服务工厂。这可以通过 Spring < |
您可以找到更高级的示例,其中显示了如何在 CXF JAX-WS Configuration 页面上 提供拦截器、属性和处理程序。
您可以使用 cxf:properties 设置 camel-cxf 端点的 dataFormat,并从 spring 配置文件中设置DefaultBus 属性。
<cxf:cxfEndpoint id="testEndpoint" address="http://localhost:9000/router" serviceClass="org.apache.camel.component.cxf.HelloService" endpointName="s:PortName" serviceName="s:ServiceName" xmlns:s="http://www.example.com/test"> <cxf:properties> <entry key="dataFormat" value="RAW"/> <entry key="setDefaultBus" value="true"/> </cxf:properties> </cxf:cxfEndpoint>
在 SpringBoot 中,您可以使用 Spring XML 文件来配置 camel-cxf
,并使用类似以下示例的代码来创建 XML 配置的 Bean:
@ImportResource({ "classpath:spring-configuration.xml" })
但是,使用配置了 Bean 的 Java 代码(如其他示例所示)是在 SpringBoot 中最佳实践。
18.6. 如何使 camel-cxf 组件使用 log4j 而不是 java.util.logging
CXF 的默认日志记录器为 java.util.logging
。如果要将它更改为 log4j,请按如下所示操作:在 classpath 中创建一个名为 META-INF/cxf/org.apache.cxf.logger
的文件。此文件应包含类 org.apache.cxf.common.logging.Log4jLogger
的完全限定名称,且不含注释。
18.7. 如何让 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 启动文档,如下所示:
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);
18.8. 如何从消息标头中覆盖 CXF producer 地址
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()));
18.9. 如何以 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 }); } }
18.10. 如何以 POJO 数据格式为 camel-cxf 端点准备消息
camel-cxf
端点制作者基于 CXF 客户端 API。首先,您需要在消息标头中指定操作名称,然后将方法参数添加到列表中,并使用此参数列表初始化消息。响应消息的正文是一个 messageContentsList,您可以从该列表中获取结果。
如果您没有在消息标头中指定操作名称,CxfProducer
将尝试使用来自 CxfEndpoint
的 defaultOperationName
,如果在 CxfEndpoint
上没有设置defaultOperationName
,它将从 Operation 列表中选择第一个 operationName。
如果要从消息正文中获取对象数组,您可以使用 message.getBody (Object[].class)
获取正文,如 CxfProducerRouterTest.testInvokingSimpleServerWithParams 所示:
Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut); final List<String> params = new ArrayList<>(); // Prepare the request message for the camel-cxf procedure params.add(TEST_MESSAGE); senderExchange.getIn().setBody(params); senderExchange.getIn().setHeader(CxfConstants.OPERATION_NAME, ECHO_OPERATION); Exchange exchange = template.send("direct:EndpointA", senderExchange); org.apache.camel.Message out = exchange.getMessage(); // The response message's body is an MessageContentsList which first element is the return value of the operation, // If there are some holder parameters, the holder parameter will be filled in the reset of List. // The result will be extract from the MessageContentsList with the String class type MessageContentsList result = (MessageContentsList) out.getBody(); LOG.info("Received output text: " + result.get(0)); Map<String, Object> responseContext = CastUtils.cast((Map<?, ?>) out.getHeader(Client.RESPONSE_CONTEXT)); assertNotNull(responseContext); assertEquals("UTF-8", responseContext.get(org.apache.cxf.message.Message.ENCODING), "We should get the response context here"); assertEquals("echo " + TEST_MESSAGE, result.get(0), "Reply body on Camel is wrong");
18.11. 如何以 PAYLOAD 数据格式处理 camel-cxf 端点的消息
PAYLOAD
意味着您将 SOAP envelope 中的有效负载作为原生 CxfPayload 处理。message .getBody ()
将返回 org.apache.camel.component.cxf.CxfPayload
对象,其中包含 SOAP 消息标头和 SOAP 正文的 getters。
请参阅 CxfConsumerPayloadTest :
protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { public void configure() { from(simpleEndpointURI + "&dataFormat=PAYLOAD").to("log:info").process(new Processor() { @SuppressWarnings("unchecked") public void process(final Exchange exchange) throws Exception { CxfPayload<SoapHeader> requestPayload = exchange.getIn().getBody(CxfPayload.class); List<Source> inElements = requestPayload.getBodySources(); List<Source> outElements = new ArrayList<>(); // You can use a customer toStringConverter to turn a CxfPayLoad message into String as you want String request = exchange.getIn().getBody(String.class); XmlConverter converter = new XmlConverter(); String documentString = ECHO_RESPONSE; Element in = new XmlConverter().toDOMElement(inElements.get(0)); // Just check the element namespace if (!in.getNamespaceURI().equals(ELEMENT_NAMESPACE)) { throw new IllegalArgumentException("Wrong element namespace"); } if (in.getLocalName().equals("echoBoolean")) { documentString = ECHO_BOOLEAN_RESPONSE; checkRequest("ECHO_BOOLEAN_REQUEST", request); } else { documentString = ECHO_RESPONSE; checkRequest("ECHO_REQUEST", request); } Document outDocument = converter.toDOMDocument(documentString, exchange); outElements.add(new DOMSource(outDocument.getDocumentElement())); // set the payload header with null CxfPayload<SoapHeader> responsePayload = new CxfPayload<>(null, outElements, null); exchange.getMessage().setBody(responsePayload); } }); } }; }
18.12. 如何在 POJO 模式中获取和设置 SOAP 标头
POJO
表示,当 camel-cxf 端点生成或消耗 Camel 交换时,数据格式是一个"Java 对象列表"。虽然 Camel 在此模式中将消息正文公开为 POJO,但 camel-cxf 仍提供对读取和写入 SOAP 标头的访问。但是,由于 CXF 拦截器在处理后从标头列表中删除 in-band SOAP 标头,因此只有带外 SOAP 标头可用于 POJO 模式的 camel-cxf。
以下示例演示了如何 get/set SOAP 标头。假设我们有一个从 Camel-cxf 端点转发到另一个 Camel-cxf 端点的路由。也就是说,SOAP Client → Camel → CXF 服务。在响应回 SOAP 客户端之前,我们可以将两个处理器附加到(1)来获取/插入 SOAP 标头,然后再向 CXF 服务获取/插入 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 Message 标头。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); } }
18.13. 如何在 PAYLOAD 模式中获取和设置 SOAP 标头
我们已展示了如何在 PAYLOAD 模式中以 PAYLOAD 模式访问 SOAP 消息作为 CxfPayload 对象,该部分 是 How to handle the camel-cxf endpoint in PAYLOAD data format。
获取 CxfPayload 对象后,您可以调用 CxfPayload.getHeaders ()方法,该方法返回 DOM Elements (SOAP 标头)列表。
例如,请参阅 CxfPayLoadSoapHeaderTest :
from(getRouterEndpointURI()).process(new Processor() { @SuppressWarnings("unchecked") public void process(Exchange exchange) throws Exception { CxfPayload<SoapHeader> payload = exchange.getIn().getBody(CxfPayload.class); List<Source> elements = payload.getBodySources(); assertNotNull(elements, "We should get the elements here"); assertEquals(1, elements.size(), "Get the wrong elements size"); Element el = new XmlConverter().toDOMElement(elements.get(0)); elements.set(0, new DOMSource(el)); assertEquals("http://camel.apache.org/pizza/types", el.getNamespaceURI(), "Get the wrong namespace URI"); List<SoapHeader> headers = payload.getHeaders(); assertNotNull(headers, "We should get the headers here"); assertEquals(1, headers.size(), "Get the wrong headers size"); assertEquals("http://camel.apache.org/pizza/types", ((Element) (headers.get(0).getObject())).getNamespaceURI(), "Get the wrong namespace URI"); // alternatively you can also get the SOAP header via the camel header: headers = exchange.getIn().getHeader(Header.HEADER_LIST, List.class); assertNotNull(headers, "We should get the headers here"); assertEquals(1, headers.size(), "Get the wrong headers size"); assertEquals("http://camel.apache.org/pizza/types", ((Element) (headers.get(0).getObject())).getNamespaceURI(), "Get the wrong namespace URI"); } }) .to(getServiceEndpointURI());
您还可以使用与子选择 " How to get and set SOAP headers in POJO 模式"中所述的方法一样设置或获取 SOAP 标头。因此,您可以使用标头 "org.apache.cxf.headers.Header.list" 来获取和设置 SOAP 标头列表。这也意味着,如果您有一个从一个 Camel-cxf 端点转发到另一个 Camel-cxf 端点的路由(SOAP Client → Camel → CXF 服务),现在也会将 SOAP 客户端发送的 SOAP 标头转发到 CXF 服务。如果您不想转发这些标头,则必须在 Camel 标头 "org.apache.cxf.headers.Header.list" 中删除它们。
18.14. SOAP 标头在 RAW 模式中不可用
SOAP 标头在 RAW 模式中不可用,因为跳过 SOAP 处理。
18.15. 如何从 Camel 中抛出 SOAP Fault
如果您使用 camel-cxf
端点来消耗 SOAP 请求,您可能需要从 camel 上下文抛出 SOAP Fault。
基本上,您可以使用 throwFault
DSL 来执行此操作;它适用于 POJO
、PAYLOAD
和 MESSAGE
数据格式。
您可以定义 soap 错误,如 CxfCustomizedExceptionTest 所示:
SOAP_FAULT = new SoapFault(EXCEPTION_MESSAGE, SoapFault.FAULT_CODE_CLIENT); Element detail = SOAP_FAULT.getOrCreateDetail(); Document doc = detail.getOwnerDocument(); Text tn = doc.createTextNode(DETAIL_TEXT); detail.appendChild(tn);
然后,按照您需要抛出它
from(routerEndpointURI).setFaultBody(constant(SOAP_FAULT));
如果您的 CXF 端点以 MESSAGE
数据格式工作,您可以在消息正文中设置 SOAP Fault 消息,并在消息标头中设置响应代码,如 CxfMessageStreamExceptionTest所示
from(routerEndpointURI).process(new Processor() { public void process(Exchange exchange) throws Exception { Message out = exchange.getOut(); // Set the message body with the out.setBody(this.getClass().getResourceAsStream("SoapFaultMessage.xml")); // Set the response code here out.setHeader(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500)); } });
与使用 POJO 数据格式相同。您可以在外部正文上设置 SOAPFault。
18.16. 如何传播 camel-cxf 端点的请求和响应上下文
CXF 客户端 API 提供了一种通过请求和响应上下文调用操作的方法。如果您使用 camel-cxf
端点制作者来调用外部 Web 服务,您可以设置请求上下文并使用以下代码获取响应上下文:
CxfExchange exchange = (CxfExchange)template.send(getJaxwsEndpointUri(), new Processor() { public void process(final Exchange exchange) { final List<String> params = new ArrayList<String>(); params.add(TEST_MESSAGE); // Set the request context to the inMessage Map<String, Object> requestContext = new HashMap<String, Object>(); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, JAXWS_SERVER_ADDRESS); exchange.getIn().setBody(params); exchange.getIn().setHeader(Client.REQUEST_CONTEXT , requestContext); exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION); } }); org.apache.camel.Message out = exchange.getOut(); // The output is an object array, the first element of the array is the return value Object\[\] output = out.getBody(Object\[\].class); LOG.info("Received output text: " + output\[0\]); // Get the response context form outMessage Map<String, Object> responseContext = CastUtils.cast((Map)out.getHeader(Client.RESPONSE_CONTEXT)); assertNotNull(responseContext); assertEquals("Get the wrong wsdl operation name", "{http://apache.org/hello_world_soap_http}greetMe", responseContext.get("javax.xml.ws.wsdl.operation").toString());
18.17. 附加支持
POJO 模式: 支持带有 Attachment 和 MTOM 的 SOAP (请参阅启用 MTOM 的 Payload 模式)。但是,没有测试带有 Attachment 的 SOAP。由于附件被分为 marshalled 和 unmarshalled into POJO,因此用户通常不需要处理他们自己的附件。如果没有启用 MTOM,则会将附件传播到 Camel 消息的附加。因此,可以通过 Camel Message API 检索附件
DataHandler Message.getAttachment(String id)
有效负载模式: 组件支持 MTOM。附加可通过上述 Camel Message API 检索。支持具有附加(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; }
您可以生成带有 attachment 的 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 Mode :支持 MTOM,并且前面提到的 Camel Message API 可以检索过期。请注意,当收到多部分(即 MTOM)消息时,默认的 SOAPMessage 到 String converter 将提供正文的完整多部分有效负载。如果您只需要 SOAP XML 作为字符串,您可以使用 message.getSOAPPart ()设置消息正文,Camel convert 可以为您执行其余工作。
18.18. PAYLOAD 模式中的流支持
camel-cxf 组件现在在使用 PAYLOAD 模式时支持流传输传入的消息。在以前的版本中,传入的信息会被完全解析。对于大型消息,这会消耗时间,并使用大量内存。传入消息可以在路由时保留为 javax.xml.transform.Source,如果没有修改有效负载,则可以直接流传输到目标目的地。对于常见的"简单代理"用例(例如: from ("cxf:…").to ("cxf:…")),这可提供显著的性能增加,并显著降低的内存要求。
然而,在有些情况下,流可能不合适或需要。由于流性质,在处理链中稍后才会发现无效的传入的 XML。此外,某些操作可能需要消息成为 DOM 解析任何方法(如 WS-Security 或消息追踪等),在这种情况下,流的优点有限。此时,可以通过两种方式控制流:
- endpoint 属性:您可以添加 "allowStreaming=false" 作为端点属性,以打开 streaming on/off。
- 组件属性: CxfComponent 对象也有一个 allowStreaming 属性,可为从该组件创建的端点设置默认。
全局系统属性: 您可以将"org.apache.camel.component.cxf.streaming"的系统属性添加到 "false" 以将其关闭。这会设置全局默认值,但设置上述 endpoint 属性将覆盖该端点的值。
18.19. 使用通用 CXF Dispatch 模式
camel-cxf 组件支持通用 CXF 分配模式,该模式可以传输任意结构的消息(例如,不绑定到特定的 XML 模式)。要使用此模式,只需省略指定 CXF 端点的 wsdlURL 和 serviceClass 属性。
<cxf:cxfEndpoint id="testEndpoint" address="http://localhost:9000/SoapContext/SoapAnyPort"> <cxf:properties> <entry key="dataFormat" value="PAYLOAD"/> </cxf:properties> </cxf:cxfEndpoint>
请注意,默认的 CXF 分配客户端不会发送特定的 SOAPAction 标头。因此,当目标服务需要特定的 SOAPAction 值时,会使用 key SOAPAction 在 Camel 标头中提供它(不区分大小写)。
18.20. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 cxf 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-cxf-soap-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 19 章 数据格式
仅支持生成者
Dataformat 组件允许使用数据格式 作为 Camel 组件。
19.1. URI 格式
dataformat:name:(marshal|unmarshal)[?options]
其中 name 是数据格式的名称。然后后根一个操作,需要是 marshal
或 unmarshal
。这些选项用于配置正在使用的 数据格式。有关它支持哪些选项,请参阅数据格式文档。
19.2. 数据格式选项
19.2.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
19.2.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
19.2.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
19.3. 组件选项
数据格式组件支持 2 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
19.4. 端点选项
数据格式端点使用 URI 语法进行配置:
dataformat:name:operation
使用以下路径和查询参数:
19.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (producer) | 数据格式 必需 名称。 | 字符串 | |
operation (producer) | 需要使用 marshal 或 unmarshal 的操作。 Enum 值:
| 字符串 |
19.4.2. 查询参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
19.5. Samples
例如,要使用 JAXB 数据格式,我们可以执行以下操作:
from("activemq:My.Queue"). to("dataformat:jaxb:unmarshal?contextPath=com.acme.model"). to("mqseries:Another.Queue");
在 XML DSL 中,您要进行:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="activemq:My.Queue"/> <to uri="dataformat:jaxb:unmarshal?contextPath=com.acme.model"/> <to uri="mqseries:Another.Queue"/> </route> </camelContext>
19.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 dataformat 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-dataformat-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 20 章 dataset
支持生成者和消费者
对分布式和异步处理的测试非常困难。Mock、Test 和 DataSet 端点与 Camel 测试框架很好,通过使用 企业集成模式 和 Camel 的大型组件以及强大的 Bean 集成来简化单元和集成测试。
DataSet 组件提供了一种机制,可轻松对系统执行负载和 soak 测试。它的工作原理是允许您创建 DataSet 实例作为 消息源,并作为接收数据集的方法。
Camel 在发送数据集 时使用吞吐量日志记录器。
20.1. URI 格式
dataset:name[?options]
其中 name 用于在 Registry 中查找 DataSet 实例
Camel 附带 org.apache.camel.component.dataset.DataSet
的支持实施,org.apache.camel.component.dataset.DataSetSupport
类,可用作实施您自己的 DataSet 的基础。Camel 还附带一些实现,可用于测试: org.apache.camel.component.dataset.SimpleDataSet
、org.apache.camel.component.dataset.ListDataSet
和 org.apache.camel.component.dataset.FileDataSet
,它们扩展 DataSetSupport
。
20.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
20.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
20.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
20.3. 组件选项
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 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
exchangeFormatter (advanced) | Autowired 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认为 DefaultExchangeFormatter。 | ExchangeFormatter |
20.4. 端点选项
Dataset 端点使用 URI 语法进行配置:
dataset:name
使用以下路径和查询参数:
20.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (common) | 要在 registry 中查找 DataSet 所需的 名称。 | DataSet |
20.4.2. 查询参数(21 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
dataSetIndex (common) | 控制 CamelDataSetIndex 标头的行为。对于 Consumers: - off = 标头不会设置 - strict/lenient = 标头将被设置为 For Producers: - off = 标头值不会被验证,如果没有包括标头值,则不会设置它。如果标头值不存在,标头值必须存在,并将验证 = lenient = 标头值(如果不存在)。 Enum 值:
| lenient | 字符串 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
initialDelay (consumer) | 在开始发送消息前,millis 中的时间段。 | 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) | 设置一个宽限期,模拟端点将重新分配,以确保初始断言仍然有效。例如,这用于精确有多个消息到达的声明。例如,如果 expectedMessageCount (int)设为 5,则在 5 个或更多消息到达时满足断言。为确保完全 5 个消息到达,您需要等待少量周期以确保没有进一步的消息到达。这是您可以使用此方法。默认情况下禁用这个周期。 | long | |
consumeDelay (producer) | 可以指定延迟,在生成者消耗消息时(模拟速度较慢)时会导致延迟。 | 0 | long |
expectedCount (producer) | 指定此端点应接收的消息交换数量。beware:如果要期望 0 个消息,然后在测试启动时进行额外的操作,因为测试启动时需要设置一个断言周期,以便测试可以在一段时间内运行,以确保仍没有到达的消息;对于使用 setAssertPeriod (long),您需要设置一个指定时间。另一种方法是使用 NotifyBuilder,并使用 notifier 知道 Camel 在对模拟调用 assertIsSatisfied ()方法之前,在路由某些消息前知道何时进行路由。这可让您不使用固定的断言周期来加快测试时间。如果您想成为完全 n 个消息到达这个模拟端点,请参阅 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 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
reportGroup (producer) | 用于根据大小组打开吞吐量日志的数字。 | int | |
resultMinimumWaitTime (producer) | 设置 assertIsSatisfied ()的最短预期时间(以 millis 为单位)。 | long | |
resultWaitTime (producer) | 设置 assertIsSatisfied ()在达到前等待的最大时间(以 millis 为单位)。 | long | |
retainFirst (producer) | 指定只保留前 n 个接收的交换数。这在使用大量数据进行测试时,通过不存储每个交换端点接收的每个交换的副本来减少内存消耗。重要:在使用这个限制时,getReceivedCounter ()仍会返回实际收到的交换数量。例如,如果我们收到 5000 Exchanges,并且配置为只保留前 10 个交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()中只有前 10 个交换,并且 getReceivedExchanges ()方法。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到的第一个正文数量上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个接收的方法。 | -1 | int |
retainLast (producer) | 指定只保留最后 n 个接收的交换数。这在使用大量数据进行测试时,通过不存储每个交换端点接收的每个交换的副本来减少内存消耗。重要:在使用这个限制时,getReceivedCounter ()仍会返回实际收到的交换数量。例如,如果我们收到 5000 Exchanges,并且配置为只保留最后 20 个交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()中只有最后 20 个交换,并且 getReceivedExchanges ()方法。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到的第一个正文数量上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个接收的方法。 | -1 | int |
sleepForEmptyTest (producer) | 当 expectedMessageCount (int)调用零时,允许指定 sleep 来等待此端点确实为空。 | long | |
copyOnExchange (producer (advanced)) | 设置是否在这个模拟端点收到传入交换的深度副本。默认为 true。 | true | 布尔值 |
20.5. 配置 DataSet
Camel 将在 Registry 中查找用于实施 DataSet 接口的 bean。以便您可以将自己的 DataSet 注册为:
<bean id="myDataSet" class="com.mycompany.MyDataSet"> <property name="size" value="100"/> </bean>
20.6. 示例
例如,要测试将一组消息发送到队列,然后从队列中消耗,而不丢失任何消息:
// send the dataset to a queue from("dataset:foo").to("activemq:SomeQueue"); // now lets test that the messages are consumed correctly from("activemq:SomeQueue").to("dataset:foo");
以上会在 Registry 中查找用于创建消息的 foo DataSet 实例。
然后,您可以创建一个 DataSet 实现,例如使用 SimpleDataSet
,配置数据集的大事项,以及消息样子等。
20.7. DataSetSupport (abstract 类)
DataSetSupport 抽象类是新 DataSets 的过期起点,为派生类提供一些有用的功能。
20.7.1. DataSetSupport 的属性
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
|
|
指定默认消息正文。对于 SimpleDataSet,它是一个恒定的有效负载;但是,如果要为每个消息创建自定义有效负载,请创建自己的 |
|
| null | |
|
|
| 指定要发送/恢复的消息数量。 |
|
|
|
指定在报告进度前要接收的消息数量。可用于显示大型负载测试的进度。如果 < 0,则 |
20.8. SimpleDataSet
SimpleDataSet
扩展 DataSetSupport
,并添加默认正文。
20.8.1. SimpleDataSet 的额外属性
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
|
|
指定默认消息正文。默认情况下, |
20.9. ListDataSet
List'DataSet' 扩展 DataSetSupport
,并添加默认正文列表。
20.9.1. ListDataSet 的额外属性
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
|
|
指定默认消息正文。默认情况下, |
|
| defaultBodies 列表的大小 |
指定要发送/恢复的消息数量。这个值可以与 |
20.10. FileDataSet
FileDataSet
扩展 ListDataSet
,并添加从文件中加载正文的支持。
20.10.1. FileDataSet 中的其他属性
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| null | 指定有效负载的源文件 |
|
| \z |
指定 |
20.11. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 dataset 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-dataset-starter</artifactId> </dependency>
组件支持 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 类的日志记录器设置为 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 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
第 21 章 direct
支持生成者和消费者
当制作者发送消息交换时,Direct 组件提供任何消费者的直接同步调用。
此端点可用于连接 同一 camel 上下文中的现有路由。
异步
SEDA 组件在发送消息交换时提供任何消费者的异步调用。
21.1. URI 格式
direct:someName[?options]
其中 someName 可以是唯一标识端点的任意字符串
21.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
21.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
21.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
21.3. 组件选项
Direct 组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
block (producer) | 如果向没有活跃消费者的直接端点发送消息,则我们可以告知制作者阻止并等待消费者变为 active。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
timeout (producer) | 如果启用了块,要使用的超时值。 | 30000 | long |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
21.4. 端点选项
直接端点使用 URI 语法进行配置:
direct:name
使用以下路径和查询参数:
21.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (common) | 直接端点 必需 的名称。 | 字符串 |
21.4.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) | 如果向没有活跃消费者的直接端点发送消息,则我们可以告知制作者阻止并等待消费者变为 active。 | true | 布尔值 |
failIfNoConsumers (producer) | 当发送到没有活跃消费者的 DIRECT 端点时,生成者是否应该失败。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
timeout (producer) | 如果启用了块,要使用的超时值。 | 30000 | long |
Sync (advanced) | 是否强制进行同步处理。如果启用,则制作者线程将强制等待消息完成,直到同一线程继续处理。如果禁用(默认),则制作者线程可能会释放,并在消息继续由其他线程(活跃)处理时执行其他工作。 | false | 布尔值 |
21.5. Samples
在以下路由中,我们使用直接组件将两个路由连接在一起:
from("activemq:queue:order.in") .to("bean:orderServer?method=validate") .to("direct:processOrder"); from("direct:processOrder") .to("bean:orderService?method=process") .to("activemq:queue:order.out");
和使用 spring DSL 的示例:
<route> <from uri="activemq:queue:order.in"/> <to uri="bean:orderService?method=validate"/> <to uri="direct:processOrder"/> </route> <route> <from uri="direct:processOrder"/> <to uri="bean:orderService?method=process"/> <to uri="activemq:queue:order.out"/> </route>
另请参阅 SEDA 组件中的示例,它们如何一起使用。
21.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用直接时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-direct-starter</artifactId> </dependency>
组件支持 6 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.direct.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.direct.block | 如果向没有活跃消费者的直接端点发送消息,则我们可以告知制作者阻止并等待消费者变为 active。 | 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 |
第 22 章 Elasticsearch
从 Camel 3.18.3 开始
仅支持生成者
ElasticSearch 组件允许您使用 Java API 客户端库与 ElasticSearch 8.x API 进行接口。
将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-elasticsearch</artifactId> <version>3.20.1.redhat-00031</version> <!-- use the same version as your Camel core version --> </dependency>
22.1. URI 格式
elasticsearch://clusterName[?options]
22.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
22.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
22.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
22.3. 组件选项
Elasticsearch 组件支持 14 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
connectionTimeout (producer) | 连接超时前等待的时间(ms)。 | 30000 | int |
hostAddresses (producer) | 以逗号分隔的带有要使用的 ip:port 格式的远程传输地址的列表。ip 和 port 选项必须留空,才能考虑 hostAddresses。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
maxRetryTimeout (producer) | 重试前 ms 的时间。 | 30000 | int |
socketTimeout (producer) | 套接字超时前要等待的超时时间(ms)。 | 30000 | int |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
client (advanced) | Autowired 使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。这允许使用特定设置自定义客户端。 | RestClient | |
enableSniffer (advanced) | 启用从正在运行的 Elasticsearch 集群中自动发现节点。如果将这个选项与 Spring Boot 结合使用,则由 Spring Boot 配置管理(请参阅:Spring Boot 中禁用 Sniffer)。 | false | 布尔值 |
sniffAfterFailureDelay (advanced) | 失败后(以毫秒为单位)调度 sniff 执行的延迟。 | 60000 | int |
snifferInterval (advanced) | 以毫秒为单位连续执行间隔。当禁用 sniffOnFailure 时,或连续的 sniffOnFailure 之间没有故障时,将休眠。 | 300000 | int |
certificatePath (security) | 用于访问 Elasticsearch 的自签名证书的路径。 | 字符串 | |
启用SSL (安全) | 启用 SSL。 | false | 布尔值 |
密码 (安全) | 进行身份验证的密码。 | 字符串 | |
用户 (安全) | 基本身份验证用户。 | 字符串 |
22.4. 端点选项
Elasticsearch 端点使用 URI 语法进行配置:
elasticsearch:clusterName
使用以下路径和查询参数:
22.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clusterName (producer) | 集群所需的 名称。 | 字符串 |
22.4.2. 查询参数(19 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
connectionTimeout (producer) | 连接超时前等待的时间(ms)。 | 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) | 套接字超时前要等待的超时时间(ms)。 | 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) | 失败后(以毫秒为单位)调度 sniff 执行的延迟。 | 60000 | int |
snifferInterval (advanced) | 以毫秒为单位连续执行间隔。当禁用 sniffOnFailure 时,或连续的 sniffOnFailure 之间没有故障时,将休眠。 | 300000 | int |
certificatePath (security) | 用于访问 Elasticsearch 的自签名证书的路径。 | 字符串 | |
启用SSL (安全) | 启用 SSL。 | false | 布尔值 |
22.5. 消息标头
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 | 响应的起始索引。 | 整数 |
22.6. 消息操作
目前支持以下 ElasticSearch 操作。只需设置端点 URI 选项或交换标头,键为"operation",值设为以下之一:有些操作还需要设置其他参数或消息正文。
operation | 消息正文 | description |
---|---|---|
索引 | 将,String,byte[], Reader,InputStream or IndexRequest.Builder content to index | 将内容添加到索引中,并在正文中返回内容的 indexId。您可以使用键 "indexName" 设置消息标头来设置目标索引的名称。您可以使用 "indexId" 设置消息标头来设置 indexId。 |
GetById | 要检索的内容的字符串或 GetRequest.Builder 索引 ID | 检索与给定索引 ID 对应的文档,并在正文中返回一个 GetResponse 对象。您可以使用键 "indexName" 设置消息标头来设置目标索引的名称。您可以使用 "documentClass" 设置消息标头来设置文档类型。 |
删除 | 要删除的内容的字符串或 DeleteRequest.Builder 索引 ID | 删除指定的 indexName,并在正文中返回一个 Result 对象。您可以使用键 "indexName" 设置消息标头来设置目标索引的名称。 |
DeleteIndex | 要删除的索引的字符串或 DeleteIndexRequest.Builder 索引名称 | 删除指定的 indexName 并在正文中返回状态代码。您可以使用键 "indexName" 设置消息标头来设置目标索引的名称。 |
批量 | 已接受的任何类型的Ser able 或 BulkRequest.Builder (DeleteOperation.Builder 用于删除操作,UpdateOperation.Builder 用于 update 操作,CreateOperation.Builder 用于 create operation, byte[], InputStream, String, Reader, Map 或 index 操作的任何文档类型) | 将/更新/删除内容从/添加到索引中,并在正文中返回一个 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 或要更新的任何文档类型内容 | 将内容更新为索引,并在正文中返回内容的 indexId。您可以使用键 "indexName" 设置消息标头来设置目标索引的名称。您可以使用 "indexId" 设置消息标头来设置 indexId。 |
ping | None | 对 Elasticsearch 集群进行 ping 操作并返回 true (如果 ping 成功),否则返回 false |
22.7. 配置组件并启用基本身份验证
要使用 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);
22.8. 索引示例
以下是一个简单的 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 标头。
客户端只需要将包含映射的正文消息传递给路由。结果正文包含创建的 indexId。
Map<String, String> map = new HashMap<String, String>(); map.put("content", "test"); String indexId = template.requestBody("direct:index", map, String.class);
22.9. 搜索示例
搜索特定字段和值使用 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();
22.10. 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
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);
22.11. 文档类型
对于所有搜索操作,可以指定检索的文档类型,以便结果已经与预期类型一起取消合并。
可使用标头 "documentClass" 或相同名称的 uri 参数来设置文档类型。
22.12. 在 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。
22.12.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。
22.12.2. 在使用 Spring Boot 时禁用 Sniffer
当 Spring Boot 位于 classpath 时,Elasticsearch 的 Sniffer 客户端会被默认启用。这个选项可以在 Spring Boot Configuration 中禁用:
spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration
22.13. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 elasticsearch 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-elasticsearch-starter</artifactId> </dependency>
组件支持 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 类型。 | RestClient | |
camel.component.elasticsearch.connection-timeout | 连接超时前等待的时间(ms)。 | 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 | 失败后(以毫秒为单位)调度 sniff 执行的延迟。 | 60000 | 整数 |
camel.component.elasticsearch.sniffer-interval | 以毫秒为单位连续执行间隔。当禁用 sniffOnFailure 时,或连续的 sniffOnFailure 之间没有故障时,将休眠。 | 300000 | 整数 |
camel.component.elasticsearch.socket-timeout | 套接字超时前要等待的超时时间(ms)。 | 30000 | 整数 |
camel.component.elasticsearch.user | 基本身份验证用户。 | 字符串 |
第 23 章 FHIR
支持生成者和消费者
FHIR 组件与 HAPI-FHIR 库集成,这是 Java 中 FHIR (Fast Healthcare Interoperability Resources)规范的开源实现。
Maven 用户需要将以下依赖项添加到其 pom.xml 中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-fhir</artifactId> <version>${camel-version}</version> </dependency>
23.1. URI 格式
FHIR 组件使用以下 URI 格式:
fhir://endpoint-prefix/endpoint?[options]
端点前缀可以是以下之一:
- 功能
- create
- delete
- history
- load-page
- meta
- operation
- patch
- 读取
- search
- 事务
- update
- validate
23.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
23.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
23.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
23.3. 组件选项
FHIR 组件支持 27 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
encoding (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 | |
压缩 (高级) | 将传出(POST/PUT)内容压缩到 GZIP 格式。 | false | 布尔值 |
配置 (高级) | 使用共享配置。 | FhirConfiguration | |
connectionTimeout (advanced) | 尝试和建立初始 TCP 连接的时间(以 ms 为单位)。 | 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 访问令牌。 | 字符串 | |
密码 (安全) | 用于基本身份验证的用户名。 | 字符串 | |
用户名 (安全) | 用于基本身份验证的用户名。 | 字符串 |
23.4. 端点选项
FHIR 端点使用 URI 语法进行配置:
fhir:apiName/methodName
使用以下路径和查询参数:
23.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
apiName (common) | 需要 采取什么操作。 Enum 值:
| FhirApiName | |
methodName (common) | 必需的所选操作需要哪些子操作。 | 字符串 |
23.4.2. 查询参数(44 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
encoding (common) | 用于所有请求的编码。 Enum 值:
| 字符串 | |
fhirVersion (common) | 要使用的 FHIR 版本。 Enum 值:
| R4 | 字符串 |
inBody (common) | 设置要在交换 In Body 中传递的参数名称。 | 字符串 | |
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 | |
压缩 (高级) | 将传出(POST/PUT)内容压缩到 GZIP 格式。 | false | 布尔值 |
connectionTimeout (advanced) | 尝试和建立初始 TCP 连接的时间(以 ms 为单位)。 | 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 访问令牌。 | 字符串 | |
密码 (安全) | 用于基本身份验证的用户名。 | 字符串 | |
用户名 (安全) | 用于基本身份验证的用户名。 | 字符串 |
23.5. API 参数(13 API)
@FHIR 端点是基于 API 的组件,具有额外的参数,它基于使用的 API 名称和 API 方法。API 名称和 API 方法位于端点 URI 中,作为 apiName/methodName
路径参数:
fhir:apiName/methodName
下表中列出了 13 个 API 名称:
API 名称 | 类型 | 描述 |
---|---|---|
两者 | API 为 Fetch 服务器的 capabilities 语句 | |
两者 | 创建操作的 API,它会在服务器上创建新资源实例 | |
两者 | 删除操作的 API,它会在服务器资源上执行逻辑删除 | |
两者 | 历史记录方法的 API | |
两者 | 使用 atom 捆绑包中的链接 type=next 标签中指定的链接,从页面集中加载先前/下一步捆绑包的 API | |
两者 | meta 操作的 API,可用于从资源或服务器中获取、添加和删除标签和其他 Meta 元素 | |
两者 | 用于扩展 FHIR 操作的 API | |
两者 | 补丁操作的 API,它会在服务器资源上执行逻辑补丁 | |
两者 | 读取操作的 API 方法 | |
两者 | API 搜索与给定条件匹配的资源 | |
两者 | 用于将事务(资源集合)发送到要作为单个单元执行的服务器的 API | |
两者 | 更新操作的 API,它会在服务器资源上执行逻辑删除 | |
两者 | 用于验证资源的 API |
每个 API 都记录在以下部分中。
23.5.1. API: capabilities
支持生成者和消费者
capabilities API 采用语法定义,如下所示:
fhir:capabilities/methodName?[parameters]
该方法列在下表中,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
使用给定的模型类型检索 conformance 语句 |
23.5.1.1. Type 方法
签名:
- 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 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.2. API: create
支持生成者和消费者
create API 采用语法定义,如下所示:
fhir:create/methodName?[parameters]
下表中列出了 1 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
在服务器上创建一个 IBaseResource |
23.5.2.1. 方法资源
签名:
- ca.uhn.fhir.rest.api.MethodOutcome 资源(String resourceAsString, String url, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- CA.uhn.fhir.rest.api.MethodOutcome 资源(org.hl7.fhir.instance.model.api.IBaseResource 资源, 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 标头,其请求服务器包含或阻止资源正文作为结果的一部分。如果服务器返回资源,它将通过 MethodOutcome114getResource ()解析客户端可访问,则可能是 null | PreferReturnEnum |
resource | 要创建的资源 | IBaseResource |
resourceAsString | 要创建的资源 | 字符串 |
url | 要使用的搜索 URL。这个 URL 的格式应为 ResourceTypeParameters,例如: Patientname=Smith&identifier=13.2.4.11.4%7C847366,可能是 null | 字符串 |
除了以上参数外,fhir API 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.3. API: delete
支持生成者和消费者
删除 API 采用语法定义,如下所示:
fhir:delete/methodName?[parameters]
下表中列出了 3 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
删除给定资源 | |
根据资源类型删除资源,例如 | |
指定应作为条件删除对给定搜索 URL 执行删除 |
23.5.3.1. 方法资源
签名:
- org.hl7.fhir.instance.model.api.IBaseOperationOutcome resource (org.hl7.fhir.instance.model.api.IBaseResource 资源, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resource API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
resource | 要删除的 IBaseResource | IBaseResource |
23.5.3.2. method resourceById
签名:
- org.hl7.fhir.instance.model.api.IBaseOperationOutcome resourceById (String type, String stringId, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseOperationOutcome resourceById (org.hl7.fhir.instance.model.api.IIdType id, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resourceById API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
id | IIdType 引用资源 | IIdType |
stringId | 它 ID | 字符串 |
type | 资源类型,如 Patient | 字符串 |
23.5.3.3. method resourceConditionalByUrl
签名:
- org.hl7.fhir.instance.model.api.IBaseOperationOutcome resourceConditionalByUrl (String url, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resourceConditionalByUrl API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
url | 要使用的搜索 URL。这个 URL 的格式应为 ResourceTypeParameters,例如: Patientname=Smith&identifier=13.2.4.11.4%7C847366 | 字符串 |
除了以上参数外,fhir API 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.4. api: history
支持生成者和消费者
history API 采用语法定义,如下所示:
fhir:history/methodName?[parameters]
下表中列出了 3 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
在服务器中特定资源的所有版本(按 ID 和类型)执行操作 | |
在服务器上所有类型的所有版本中执行操作 | |
在服务器中给定类型的所有版本中执行操作 |
23.5.4.1. 对Instance 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle onInstance (org.hl7.fhir.instance.model.api.IIdType id, Class<org.hl7.fhir.instance.model.api.IBaseBundle> returnType, Integer count, java.util.Date cutoff, org.hl7.fhir.instance.model.api.IPrimitiveType<java.util.Date> iCutoff, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onInstance API 方法包含下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
æ•°é‡� | 请求服务器仅返回到Count 个资源数量,可以是 NULL | 整数 |
cutoff | 请求服务器只返回在给定时间(包括)时创建的资源版本,可能是 NULL | Date |
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
iCutoff | 请求服务器只返回在给定时间(包括)时创建的资源版本,可能是 NULL | IPrimitiveType |
id | IIdType,它必须同时填充资源类型和资源 ID | IIdType |
returnType | 请求该方法会返回 Bundle 资源(如 ca.uhn.fhir.model.dstu2.resource.Bundle)。如果您要访问 DSTU2 服务器,请使用此方法。 | 类 |
23.5.4.2. Server 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle onServer (Class<org.hl7.fhir.instance.model.api.IBaseBundle> returnType, Integer count, java.util.Date cutoff, org.hl7.fhir.instance.model.api.IPrimitiveType<java.util.Date> iCutoff, 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 服务器,请使用此方法。 | 类 |
23.5.4.3. Type 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle onType (Class<org.hl7.fhir.instance.model.api.IBaseResource> resourceType, Class<org.hl7.fhir.instance.model.api.IBaseBundle> returnType, Integer count, java.util.Date cutoff, org.hl7.fhir.instance.model.api.IPrimitiveType<java.util.Date> iCutoff, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/onType API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
æ•°é‡� | 请求服务器仅返回到Count 个资源数量,可以是 NULL | 整数 |
cutoff | 请求服务器只返回在给定时间(包括)时创建的资源版本,可能是 NULL | Date |
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
iCutoff | 请求服务器只返回在给定时间(包括)时创建的资源版本,可能是 NULL | IPrimitiveType |
resourceType | 要搜索的资源类型 | 类 |
returnType | 请求该方法会返回 Bundle 资源(如 ca.uhn.fhir.model.dstu2.resource.Bundle)。如果您要访问 DSTU2 服务器,请使用此方法。 | 类 |
除了以上参数外,fhir API 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.5. api: load-page
支持生成者和消费者
load-page API 在语法中定义,如下所示:
fhir:load-page/methodName?[parameters]
下表中列出了 3 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
使用给定的 URL 和捆绑包类型加载结果页面,并返回 DSTU1 Atom 捆绑包 | |
使用捆绑包中关系的链接加载下一个结果页面 | |
使用捆绑包中关系 prev 的链接加载前面的结果页面 |
23.5.5.1. 方法 byUrl
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle byUrl (String url, Class<org.hl7.fhir.instance.model.api.IBaseBundle> returnType, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/byUrl API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
returnType | 返回类型 | 类 |
url | 搜索 url | 字符串 |
23.5.5.2. Next 方法
签名:
- 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 |
23.5.5.3. 前一个方法
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle previous (org.hl7.fhir.instance.model.api.IBaseBundle bundle, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/previous API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
bundle | IBaseBundle | IBaseBundle |
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
除了以上参数外,fhir API 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.6. api: meta
支持生成者和消费者
meta API 在语法中定义,如下所示:
fhir:meta/methodName?[parameters]
下表中列出了 5 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
将给定元数据中的元素添加到现有集合(请勿删除任何) | |
从给定的 ID 中删除给定元数据中的元素 | |
从特定资源获取当前元数据 | |
从整个服务器获取当前元数据 | |
从特定类型的获取当前元数据 |
23.5.6.1. 方法添加
签名:
- org.hl7.fhir.instance.model.api.IBaseMetaType add (org.hl7.fhir.instance.model.api.IBaseMetaType meta, org.hl7.fhir.instance.model.api.IIdType id, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/add API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
id | id | IIdType |
meta | IBaseMetaType 类 | IBaseMetaType |
23.5.6.2. method delete
签名:
- 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 |
23.5.6.3. method getFromResource
签名:
- org.hl7.fhir.instance.model.api.IBaseMetaType getFromResource (Class<org.hl7.fhir.instance.model.api.IBaseMetaType> metaType, org.hl7.fhir.instance.model.api.IIdType id, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/getFromResource API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
id | id | IIdType |
metaType | IBaseMetaType 类 | 类 |
23.5.6.4. method getFromServer
签名:
- org.hl7.fhir.instance.model.api.IBaseMetaType getFromServer (Class<org.hl7.fhir.instance.model.api.IBaseMetaType> metaType, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/getFromServer API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
metaType | 给定 FHIR 模型版本的 meta 数据类型的类型(应该为 MetaDt.class 或 MetaType.class) | 类 |
23.5.6.5. method getFromType
签名:
- 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 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.7. api: operation
支持生成者和消费者
操作 API 采用语法定义,如下所示:
fhir:operation/methodName?[parameters]
下表中列出了 5 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
在服务器中特定资源的所有版本(按 ID 和类型)执行操作 | |
此操作在资源的特定版本上运行 | |
在服务器上所有类型的所有版本中执行操作 | |
在服务器中给定类型的所有版本中执行操作 | |
此操作称为 $process-message,如 FHIR 规格定义 |
23.5.7.1. 对Instance 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseResource onInstance (org.hl7.fhir.instance.model.api.IIdType id, String name, org.hl7.fhir.instance.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputParameterType, 布尔值使用HttpGet, 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/NNN/$everything)非常有用,可以是 NULL | 类 |
useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
23.5.7.2. 方法 onInstanceVersion
签名:
- org.hl7.fhir.instance.model.api.IBaseResource onInstanceVersion (org.hl7.fhir.instance.model.api.IIdType id, String name, org.hl7.fhir.instance.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputParameterType, 布尔值使用HttpGet, 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/NNN/$everything)非常有用,可以是 NULL | 类 |
useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
23.5.7.3. Server 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseResource onServer (String name, org.hl7.fhir.instance.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputParameterType, boolean useHttpGet, Class<org.hl7.fhir.instance.model.api.IBaseResource> returnType, 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/NNN/$everything)非常有用,可以是 NULL | 类 |
useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
23.5.7.4. Type 的方法
签名:
- org.hl7.fhir.instance.model.api.IBaseResource onType (Class<org.hl7.fhir.instance.model.api.IBaseResource> resourceType, String name, org.hl7.fhir.instance.model.api.IBaseParameters parameters, Class<org.hl7.fhir.instance.model.api.IBaseParameters> outputParameterType, 布尔值使用HttpGet, 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/NNN/$everything)非常有用,可以是 NULL | 类 |
useHttpGet | 使用 HTTP GET 动词 | 布尔值 |
23.5.7.5. method processMessage
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle processMessage (String respondToUri, org.hl7.fhir.instance.model.api.IBaseBundle msgBundle, boolean asynchronous, Class<org.hl7.fhir.instance.model.api.IBaseBundle> responseClass, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/processMessage API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
异步 | 是否异步处理消息还是同步,默认为 sync。 | 布尔值 |
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
msgBundle | 将 Message Bundle 设置为 POST 到消息传递服务器 | IBaseBundle |
respondToUri | 可选的查询参数表示来自接收服务器的响应应发送到此 URI,可能是 NULL | 字符串 |
responseClass | 响应类 | 类 |
除了以上参数外,fhir API 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.8. API: patch
支持生成者和消费者
patch API 采用语法定义,如下所示:
fhir:patch/methodName?[parameters]
下表中列出了 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
将补丁应用到给定资源 ID | |
指定应作为条件创建对给定搜索 URL 执行更新 |
23.5.8.1. method patchById
签名:
- ca.uhn.fhir.rest.api.MethodOutcome patchById (String patchBody, String stringId, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- CA.uhn.fhir.rest.api.MethodOutcome patchById (String patchBody, org.hl7.fhir.instance.model.api.IIdType id, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/patchById API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
id | 要修补的资源 ID | IIdType |
patchBody | 补丁文档的正文在 XML 或 JSON 中进行序列化,它们符合 | 字符串 |
preferReturn | 在请求中添加 Prefer 标头,其请求服务器包含或阻止资源正文作为结果的一部分。如果服务器返回资源,它将通过 MethodOutcome114getResource ()解析客户端可访问 | PreferReturnEnum |
stringId | 要修补的资源 ID | 字符串 |
23.5.8.2. method patchByUrl
签名:
- ca.uhn.fhir.rest.api.MethodOutcome patchByUrl (String patchBody, String url, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/patchByUrl API 方法包含下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
patchBody | 补丁文档的正文在 XML 或 JSON 中进行序列化,它们符合 | 字符串 |
preferReturn | 在请求中添加 Prefer 标头,其请求服务器包含或阻止资源正文作为结果的一部分。如果服务器返回资源,它将通过 MethodOutcome114getResource ()解析客户端可访问 | PreferReturnEnum |
url | 要使用的搜索 URL。这个 URL 的格式应为 ResourceTypeParameters,例如: Patientname=Smith&identifier=13.2.4.11.4%7C847366 | 字符串 |
除了以上参数外,fhir API 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.9. API: read
支持生成者和消费者
read API 采用语法定义,如下所示:
fhir:read/methodName?[parameters]
下表中列出了 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
通过 id 读取服务器上的 IBaseResource | |
通过 url 读取服务器上的 IBaseResource |
23.5.9.1. method resourceById
签名:
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, Long longId, String ifVersionMatches, 布尔值 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 (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, String stringId, String version, String ifVersionMatches, 布尔值 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 (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, org.hl7.fhir.instance.model.api.IIdType id, String ifVersionMatches, 布尔值 returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (String resourceClass, Long longId, String ifVersionMatches, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseResource resourceById (String resourceClass, String stringId, String ifVersionMatches, String version, 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 (String resourceClass, org.hl7.fhir.instance.model.api.IIdType id, String ifVersionMatches, 布尔值 returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, boolean throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resourceById API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
id | IIdType 引用资源 | IIdType |
ifVersionMatches | 与服务器中最新版本匹配的版本 | 字符串 |
longId | 资源 ID | Long |
resource | 要读取的资源(如 Patient) | 类 |
resourceClass | 要读取的资源(如 Patient) | 字符串 |
returnNull | 如果版本匹配,则返回 null | 布尔值 |
returnResource | 如果版本匹配,则返回资源 | IBaseResource |
stringId | 资源 ID | 字符串 |
throwError | 如果版本匹配,抛出错误 | 布尔值 |
version | 资源版本 | 字符串 |
23.5.9.2. method resourceByUrl
签名:
- org.hl7.fhir.instance.model.api.IBaseResource resourceByUrl (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, String url, String ifVersionMatches, 布尔值 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 (Class<org.hl7.fhir.instance.model.api.IBaseResource> resource, org.hl7.fhir.instance.model.api.IIdType iUrl, String ifVersionMatches, 布尔值 returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, 布尔值 throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.IBaseResource resourceByUrl (String resourceClass, String url, String ifVersionMatches, boolean returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, 布尔值 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, 布尔值 returnNull, org.hl7.fhir.instance.model.api.IBaseResource returnResource, boolean throwError, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resourceByUrl API 方法包含下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
iUrl | IIdType 通过绝对 url 引用资源 | IIdType |
ifVersionMatches | 与服务器中最新版本匹配的版本 | 字符串 |
resource | 要读取的资源(如 Patient) | 类 |
resourceClass | 要读取的资源(如 Patient.class) | 字符串 |
returnNull | 如果版本匹配,则返回 null | 布尔值 |
returnResource | 如果版本匹配,则返回资源 | IBaseResource |
throwError | 如果版本匹配,抛出错误 | 布尔值 |
url | 通过绝对 url 引用资源 | 字符串 |
除了以上参数外,fhir API 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.10. api: search
支持生成者和消费者
搜索 API 的语法定义,如下所示:
fhir:search/methodName?[parameters]
下表中列出了 1 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
通过 URL 直接执行搜索 |
23.5.10.1. method searchByUrl
签名:
- org.hl7.fhir.instance.model.api.IBaseBundle searchByUrl (String url, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/searchByUrl API 方法包含下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
url | 要搜索的 URL。请注意,此 URL 可以完成(例如,),在这种情况下,客户端的基本 URL 将被忽略。或者,它可以被相对(例如,Patientname=foo),在这种情况下,客户端的基本 URL 将会被使用。 | 字符串 |
除了以上参数外,fhir API 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.11. API: transaction
支持生成者和消费者
transaction API 的语法定义,如下所示:
fhir:transaction/methodName?[parameters]
下表中列出了 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
使用给定的原始文本(应该是 Bundle 资源)作为事务输入 | |
使用资源列表作为事务输入 |
23.5.11.1. 带有Bundle 的方法
签名:
- 带有Bundle (String stringBundle, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- org.hl7.fhir.instance.model.api.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 | 在事务中使用的捆绑包 | 字符串 |
23.5.11.2. 带有Resources 的方法
签名:
- 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 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.12. API: update
支持生成者和消费者
更新 API 的语法定义,如下所示:
fhir:update/methodName?[parameters]
下表中列出了 2 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
通过 id 更新服务器上的 IBaseResource | |
通过搜索 url 更新服务器上的 IBaseResource |
23.5.12.1. 方法资源
签名:
- ca.uhn.fhir.rest.api.MethodOutcome 资源(String resourceAsString, String stringId, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- CA.uhn.fhir.rest.api.MethodOutcome 资源(String resourceAsString, org.hl7.fhir.instance.model.api.IIdType id, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- CA.uhn.fhir.rest.api.MethodOutcome 资源(org.hl7.fhir.instance.model.api.IBaseResource 资源, 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 (org.hl7.fhir.instance.model.api.IBaseResource 资源, org.hl7.fhir.instance.model.api.IIdType id, ca.uhn.fhir.rest.api.PreferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
fhir/resource API 方法有下表中列出的参数:
参数 | 描述 | 类型 |
---|---|---|
extraParameters | 如需可传递的完整参数列表,请参阅 ExtraParameters,可以是 NULL | Map |
id | IIdType 引用资源 | IIdType |
preferReturn | 在结果中,服务器是否包含或阻止资源正文 | PreferReturnEnum |
resource | 要更新的资源(如 Patient) | IBaseResource |
resourceAsString | 要更新的资源正文 | 字符串 |
stringId | 引用资源的 ID | 字符串 |
23.5.12.2. method resourceBySearchUrl
签名:
- ca.uhn.fhir.rest.api.MethodOutcome resourceBySearchUrl (String resourceAsString, String url, ca.uhn.fhir.rest.api.PreferReturnEnum preferReturn, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- CA.uhn.fhir.rest.api.MethodOutcome resourceBySearchUrl (org.hl7.fhir.instance.model.api.IBaseResource 资源, String url, ca.uhn.fhir.rest.api.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 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.5.13. api: validate
支持生成者和消费者
validate API 采用语法定义,如下所示:
fhir:validate/methodName?[parameters]
下表中列出了 1 方法,后跟每种方法的详细语法。(API 方法可以有一个简短的别名名称,可在语法而不是名称中使用)
方法 | 描述 |
---|---|
验证资源 |
23.5.13.1. 方法资源
签名:
- ca.uhn.fhir.rest.api.MethodOutcome 资源(String resourceAsString, java.util.Map<org.apache.camel.component.fhir.api.ExtraParameters, Object> extraParameters);
- ca.uhn.fhir.rest.api.MethodOutcome 资源(org.hl7.fhir.instance.model.api.IBaseResource 资源, 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 也可以使用任何 查询参数。
任何参数都可以在端点 URI 中提供,也可以在消息标头中动态提供。消息标头名称必须是 CamelFhir.parameter
格式。inBody
参数覆盖消息标头,即 Body=myParameterNameHere
中的端点参数将覆盖 CamelFhir.myParameterNameHere
标头。
23.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 fhir 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-fhir-starter</artifactId> </dependency>
组件支持 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 连接的时间(以 ms 为单位)。 | 10000 | 整数 |
camel.component.fhir.defer-model-scanning | 当设置这个选项时,模型类不会扫描子类,直到实际访问给定类型的子列表。 | false | 布尔值 |
camel.component.fhir.enabled | 是否启用 fhir 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.fhir.encoding | 用于所有请求的编码。 | 字符串 | |
camel.component.fhir.fhir-context | FhirContext 是一个昂贵的对象,可以创建。为避免创建多个实例,可以直接设置它。选项是一个 ca.uhn.fhir.context.FhirContext 类型。 | FhirContext | |
camel.component.fhir.fhir-version | 要使用的 FHIR 版本。 | R4 | 字符串 |
camel.component.fhir.force-conformance-check | 强制一致性检查。 | false | 布尔值 |
camel.component.fhir.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 标头。例如,用于数据格式的 application/xml 例如,marshalling 到 XML,对于数据格式为 JSON,application/json 用于数据格式。 | true | 布尔值 |
camel.dataformat.fhirjson.dont-encode-elements | 如果提供,请指定不应编码的元素。此字段的有效值包括: 德语 - Don't encode the the all sub Patient.name - Don't encode the the Patient.name.family - Don't encode the the family's family name .text - Don't encode 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 the and all child Patient.name - Encode only the Patient.name.family - Encode only the good's 系列名称 .text - Encode - 对任何资源上的文本元素进行编码(仅限第一个位置可能包含通配符)-(必需)- 这个特殊情况,它导致任何资源的系列名称(最小 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 (默认值),如果定义了 fullUrl,Bundle.entry.fullUrl 将覆盖 Bundle.entry.resource 的资源 ID。在将源数据解析到 Bundle 对象时,会发生此行为。如果这不是所需行为,则将其设置为 false (例如,客户端代码希望在 fullUrl 和资源 ID 之间执行额外的验证检查)。 | false | 布尔值 |
camel.dataformat.fhirjson.pretty-print | 设置用户友善的 print 标志,这意味着解析器将使用人类可读和元素之间的新行编码资源,而不是尽可能高的输出。 | false | 布尔值 |
camel.dataformat.fhirjson.server-base-url | 设置此解析器使用的服务器基本 URL。如果设置了值,如果资源引用以绝对 URL 提供,但具有与给定基础匹配的基础,则资源引用将转换为相对引用。 | 字符串 | |
camel.dataformat.fhirjson.strip-versions-from-references | 如果设置为 true (默认值),则包含版本的资源引用将在编码资源时删除版本。这通常很好,因为在大多数情况下,从一个资源到另一个资源的引用应该是按 ID 到资源,而不是按 ID 和版本对资源。然而,在某些情况下可能需要在资源链接中保留版本。在这种情况下,这个值应设为 false。这个方法提供了全局禁用参考编码的功能。如果需要精细控制,请使用 setDontStripVersionsFromReferencesAtPaths (List)。 | false | 布尔值 |
camel.dataformat.fhirjson.summary-mode | 如果设置为 true (默认为 false),则仅包含 FHIR 规格标记为概述元素的元素。 | false | 布尔值 |
camel.dataformat.fhirjson.suppress-narratives | 如果设置为 true (默认为 false),则 narratives 不会包含在编码的值中。 | false | 布尔值 |
camel.dataformat.fhirxml.content-type-header | 数据格式是否应使用数据格式的类型设置 Content-Type 标头。例如,用于数据格式的 application/xml 例如,marshalling 到 XML,对于数据格式为 JSON,application/json 用于数据格式。 | true | 布尔值 |
camel.dataformat.fhirxml.dont-encode-elements | 如果提供,请指定不应编码的元素。此字段的有效值包括: 德语 - Don't encode the the all sub Patient.name - Don't encode the the Patient.name.family - Don't encode the the family's family name .text - Don't encode 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 the and all child Patient.name - Encode only the Patient.name.family - Encode only the good's 系列名称 .text - Encode - 对任何资源上的文本元素进行编码(仅限第一个位置可能包含通配符)-(必需)- 这个特殊情况,它导致任何资源的系列名称(最小 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 (默认值),如果定义了 fullUrl,Bundle.entry.fullUrl 将覆盖 Bundle.entry.resource 的资源 ID。在将源数据解析到 Bundle 对象时,会发生此行为。如果这不是所需行为,则将其设置为 false (例如,客户端代码希望在 fullUrl 和资源 ID 之间执行额外的验证检查)。 | false | 布尔值 |
camel.dataformat.fhirxml.pretty-print | 设置用户友善的 print 标志,这意味着解析器将使用人类可读和元素之间的新行编码资源,而不是尽可能高的输出。 | false | 布尔值 |
camel.dataformat.fhirxml.server-base-url | 设置此解析器使用的服务器基本 URL。如果设置了值,如果资源引用以绝对 URL 提供,但具有与给定基础匹配的基础,则资源引用将转换为相对引用。 | 字符串 | |
camel.dataformat.fhirxml.strip-versions-from-references | 如果设置为 true (默认值),则包含版本的资源引用将在编码资源时删除版本。这通常很好,因为在大多数情况下,从一个资源到另一个资源的引用应该是按 ID 到资源,而不是按 ID 和版本对资源。然而,在某些情况下可能需要在资源链接中保留版本。在这种情况下,这个值应设为 false。这个方法提供了全局禁用参考编码的功能。如果需要精细控制,请使用 setDontStripVersionsFromReferencesAtPaths (List)。 | false | 布尔值 |
camel.dataformat.fhirxml.summary-mode | 如果设置为 true (默认为 false),则仅包含 FHIR 规格标记为概述元素的元素。 | false | 布尔值 |
camel.dataformat.fhirxml.suppress-narratives | 如果设置为 true (默认为 false),则 narratives 不会包含在编码的值中。 | false | 布尔值 |
第 24 章 File
支持生成者和消费者
File 组件提供对文件系统的访问,允许由其他组件的任何其他 Camel 组件或来自其他组件的消息保存到磁盘中处理文件。
24.1. URI 格式
file:directoryName[?options]
其中 directoryName 代表底层文件目录。
只有目录
Camel 仅支持使用启动目录配置的端点。因此,directoryName 必须是目录。如果只使用单个文件,您可以使用 fileName 选项,例如通过设置 fileName=thefilename
。另外,启动目录不得包含带有 ${ }
占位符的动态表达式。使用 fileName
选项指定文件名的动态部分。
避免读取当前由另一个应用程序写入的文件
成为JDK File IO API 在检测另一个应用程序当前是否写入/复制文件时有一定限制。此外,实施也可以因操作系统平台而异。这可能会导致 Camel 认为该文件不会被其他进程锁定,并开始消耗它。因此,您必须自己调查您的环境套件。为了帮助获得此 Camel,可以使用不同的 readLock
选项和 doneFileName
选项。另请参阅 从其他文件直接丢弃文件的文件夹恢复文件 一节。
24.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
24.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
24.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
24.3. 组件选项
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 | 布尔值 |
24.4. 端点选项
File 端点使用 URI 语法进行配置:
file:directoryName
使用以下路径和查询参数:
24.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
directoryName (common) | 需要 启动目录。 | File |
24.4.2. 查询参数(94 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
charset (common) | 此选项用于指定文件编码。您可以在消费者上使用此功能,以指定文件的编码,它允许 Camel 在访问文件内容时加载文件内容。在编写文件时,您可以使用此选项指定写入该文件的 charset。请注意,当编写 Camel 文件时,可能需要将消息内容读取在内存中才能将数据转换为配置的 charset,因此如果您有大量消息,则不要使用它。 | 字符串 | |
doneFileName (common) | producer :如果提供,则 Camel 将在编写原始文件时写入第二次完成的文件。done 文件为空。这个选项配置要使用的文件名。您可以指定固定名称。或者,您可以使用动态占位符。done 文件将始终写在与原始文件相同的文件夹中。consumer :如果提供,Camel 仅在文件存在时使用文件。这个选项配置要使用的文件名。您可以指定固定名称。或者,您可以使用动态占位符。done 文件始终预期在与原始文件相同的文件夹中。仅支持 $\\{file.name} 和 $\\{file.name.next} 作为动态占位符。 | 字符串 | |
fileName (common) | 使用 Expression (如文件语言)来动态设置文件名。对于消费者,它用作文件名过滤器。对于生成者,它用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注意:标头本身也可以是 Expression)。表达式选项支持 String 和 Expression 类型。如果表达式是字符串类型,则始终使用 File Language 来评估。如果表达式是 Expression 类型,则会使用指定的 Expression 类型 - 例如,您可以使用 OGNL 表达式。对于消费者,您可以使用它来过滤文件名,因此您可以使用 File Language 语法:mydata-$\\{date:now:yyyyMMdd}.txt 来使用现在使用的文件。producers 支持 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 也设置幂等=true,以避免再次消耗相同的文件。 | false | 布尔值 |
preMove (consumer) | 在处理前移动文件名的表达式(如文件语言)。例如,要将 in-progress 文件移到 order 目录中,将此值设置为 order。 | 字符串 | |
preSort (consumer) | 启用预排序后,消费者将在轮询过程中对文件和目录名称进行排序,这从文件系统检索。如果您需要按照排序的顺序对文件进行操作,您可能需要执行此操作。预排序是在消费者开始过滤前执行的,并接受由 Camel 处理的文件。这个选项是 default=false 表示禁用。 | false | 布尔值 |
recursion (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)) | 可插拔 in-progress 存储库 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)) | 是否启用内容类型的探测。如果启用,则消费者使用 Files114probeContentType (java.nio.file.Path)来确定文件的 content-type,并将该类型存储为 Message 上带有密钥 ExchangeFILE_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) | 如果文件已存在具有相同名称的文件,则该怎么办。覆盖(这是默认设置)替换现有文件。- Append - 将内容添加到现有文件中。- Fail - 抛出一个 GenericFileOperationException,表示已有的文件。- Ignore - 静默忽略问题,且不会覆盖现有的文件,但假设所有内容正常。- Move - 选项需要使用 moveExisting 选项。选项 eagerDeleteTargetFile 可以用来控制移动文件时要执行的操作,并且已存在现有文件,否则会导致移动操作失败。Move 选项将在编写目标文件前移动任何现有文件。- 只有在使用 tempFileName 选项时才适用 TryRename。这允许尝试将文件从临时名称重命名为实际名称,而无需执行任何存在检查。对于某些文件系统,这个检查可能会更快,特别是 FTP 服务器。 Enum 值:
| 覆盖 | GenericFileExist |
flatten (producer) | 扁平化用于扁平化任何前导路径的文件名路径,因此它只是文件名。这样,您可以递归地将文件写入子目录中,但当您将文件写入另一个目录中时,它们将写入到单个目录中。在制作者上将其设置为 true 可强制在 CamelFileName 标头中为任何前导路径去除任何文件名。 | false | 布尔值 |
jailStartingDirectory (producer) | 仅用于 jailing (限制)将文件写入启动目录(和子)。默认情况下,这不允许 Camel 将文件写入外部目录(其开箱即用)。您可以将其关闭,以允许将文件写入启动目录之外的目录,如父目录或根文件夹。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
moveExisting (producer) | 配置 fileExist=Move 时使用的表达式(如文件语言)用于计算文件名。将文件移到备份子目录中,只需输入备份。这个选项只支持以下文件语言令牌: file:name、file:name.ext、file:name.noext、file:onlyname、file:onlyname.noext、file:ext 和 file:parent。请注意,FTP 组件不支持 file:parent,因为 FTP 组件只能将任何现有文件移至基于当前 dir 作为基础的相对目录中。 | 字符串 | |
tempFileName (producer) | 与 tempPrefix 选项相同,但提供对临时文件名命名更加精细的控制,因为它使用 File 语言。tempFilename 的位置相对于选项 'fileName' 中的最终文件位置,而不是基础 uri 中的目标目录。例如,如果选项 fileName 包含一个目录前缀:dir/finalFilename,则 tempFileName 相对于该子目录 dir。 | 字符串 | |
tempPrefix (producer) | 此选项用于使用临时名称写入文件,然后在写入完成后将其重命名为实际名称。可用于识别正在写入的文件,并避免消费者(不使用专用读锁定)读取进度文件中。FTP 通常在上传大型文件时使用。 | 字符串 | |
allowNullBody (producer (advanced)) | 用于指定在文件写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,设置为 false,并尝试向文件组件发送 null 正文,将抛出 'Cannot write null body 的 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)在写入临时文件前删除目标文件。例如,您可以编写大型文件,并希望在编写临时文件过程中存在目标文件。这样可确保目标文件仅在最后一次时间之前被删除,只需在临时文件重命名为目标文件名之前。此选项还用于控制在启用 fileExist=Move 时是否删除任何现有文件,并且存在现有的文件。如果此选项 copyAndDeleteOnRenameFails false,那么如果现有文件存在,则会抛出异常(如果为 true),则在移动操作前删除现有文件。 | true | 布尔值 |
forceWrites (producer (advanced)) | 是否强制同步到文件系统。如果您不希望此级别的保证,您可以关闭此级别,例如,如果写入日志 / 审计日志等;这会产生更好的性能。 | true | 布尔值 |
keepLastModified (producer (advanced)) | 将保留源文件的最后修改的时间戳(若有)。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或带有时间戳的长度。如果时间戳存在,并且启用了 选项,它将在写入的文件中设置此时间戳。注:此选项仅适用于文件制作者。您不能将此选项与任何 ftp producer 一起使用。 | false | 布尔值 |
moveExistingFileStrategy (producer (advanced)) | 用于在配置 fileExist=Move 时使用特殊命名令牌的策略(自定义策略)。默认情况下,如果没有提供自定义策略,则使用实施。 | FileMoveExistingStrategy | |
auto create (advanced) | 在文件的路径中自动创建缺少的目录。对于文件消费者,这意味着创建启动目录。对于文件制作者,这意味着应将文件写入的目录。 | true | 布尔值 |
BufferSize ( advanced) | 用于编写文件的缓冲区大小(或者 FTP 用于下载和上传文件)。 | 131072 | int |
copyAndDeleteOnRenameFail (advanced) | 是否在无法直接重命名文件时,回退以及执行复制和删除文件。FTP 组件无法使用这个选项。 | true | 布尔值 |
renameUsingCopy (advanced) | 使用复制和删除策略执行重命名操作。这主要用于常规重命名操作不可靠(例如在不同文件系统或网络中)。这个选项优先于 copyAndDeleteOnRenameFail 参数,该参数将自动回退到复制和删除策略,但只有在额外的延迟后。 | false | 布尔值 |
Sync (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
antExclude (filter) | ant 风格的过滤器排除。如果同时使用 antInclude 和 antExclude,则 antExclude 优先于 antInclude。可以使用以逗号分隔的格式指定多个排除项。 | 字符串 | |
antFilterCaseSensitive (filter) | 在 ant 过滤器上设置区分大小写标志。 | true | 布尔值 |
antInclude (filter) | ant 风格的过滤器包括。可使用以逗号分隔的格式指定多个 include。 | 字符串 | |
eagerMaxMessagesPerPoll (filter) | 允许控制 maxMessagesPerPoll 的限制是 eager。如果 eager,则在扫描文件的过程中会进行限制。其中为 false 将扫描所有文件,然后执行排序。将这个选项设置为 false 允许首先排序所有文件,然后限制轮询。请注意,这需要更高的内存用量,因为所有文件详情都在内存中执行排序。 | true | 布尔值 |
exclude (filter) | 用于排除文件(如果文件名与正则表达式模式匹配)(匹配不区分大小写)。请注意,如果您使用加号等符号,如果将其配置为端点 uri,则需要使用 RAW ()语法进行配置。有关配置端点 uri 的更多信息,请参阅。 | 字符串 | |
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 Consumer EIP 模式的选项,以便 Camel 跳过已经处理的文件。默认情况下,将使用基于内存的 LRUCache,其中包含 1000 个条目。如果 noop=true 也会启用,以避免再次消耗相同的文件。 | false | 布尔值 |
idempotentKey (filter) | 使用自定义幂等键,请执行以下操作:默认情况下,使用该文件的绝对路径。您可以使用 File Language,例如使用文件名和文件大小,您可以执行以下操作:OnlydKey=$\\{file:name}-$\\{file:size}。 | 字符串 | |
idempotentRepository (filter) | 可插拔存储库 org.apache.camel.spi.IdempotentRepository,它默认使用 MemoryIdempotentRepository (如果没有指定),且幂等性为 true。 | IdempotentRepository | |
include (filter) | 用于包含文件,如果文件名与正则表达式模式匹配(匹配不区分大小写)。请注意,如果您使用加号等符号,如果将其配置为端点 uri,则需要使用 RAW ()语法进行配置。有关配置端点 uri 的更多信息,请参阅。 | 字符串 | |
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) | 可插拔读锁定作为 org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy 实现。 | GenericFileExclusiveReadLockStrategy | |
readLock (lock) | 消费者使用,仅在文件有独占的 read-lock 时轮询文件(例如,该文件不是 in-progress 或 in-progress 或正在写入)。Camel 将等到赋予文件锁定。此选项在策略中提供构建: - none - No read lock is use - markFile - Camel 创建标记文件(fileName.camelLock),然后在其上保存锁定。FTP 组件无法使用这个选项 - Changed - Changed 使用文件长度/修改时间戳来检测文件当前是否复制。至少将使用 1 sec 来确定这一点,因此此选项无法像其他进程一样快速使用文件,但可能会更可靠,因为 JDK IO API 并不总是确定当前由其他进程使用的文件。选项 readLockCheckInterval 可用于设置检查频率。- fileLock - 使用 java.nio.channels.FileLock。这个选项不适用于 Windows OS 和 FTP 组件。在通过 mount/share 访问远程文件系统时,应该避免这种方法,除非该文件系统支持分布式文件锁定。- 重命名是使用尝试将文件重命名为测试(如果我们可以获得专用 read-lock. - 幂等的 - (仅用于文件组件)用于使用幂等结构作为读锁定。如果幂等存储库实现支持集群,这允许使用支持集群的读锁定。- idempotent-changed - (仅限文件组件)幂等性更改是使用幂等的Repository,并作为组合的 read-lock 进行更改。如果幂等存储库实现支持集群,这允许使用支持集群的读锁定。- idempotent-rename - (仅用于文件组件)幂等名称使用幂等权限,并重命名为组合的 read-lock。如果幂等存储库实现支持集群,这允许使用支持集群的读锁定:各种读锁定并不是在集群模式下工作的,其中不同节点上的并发消费者对共享文件系统中的同一文件都是竞争的。使用一个接近原子操作的 markFile 来创建空标记文件,但无法保证在集群中工作。fileLock 可能更好,但文件系统需要支持分布式文件锁定等。如果幂等存储库支持集群,如 Hazelcast 组件或 Infinispan,则使用幂等读锁定支持集群。 Enum 值:
| none | 字符串 |
readLockCheckInterval (lock) | read-lock 的 millis (如果读锁定支持)。这个间隔用于在尝试获取读锁定之间休眠。例如,在使用更改的读锁定时,您可以为较慢的写入设置更高的间隔周期。如果生成者非常慢,则默认值 1 sec. 可能太快。注意:对于 FTP,默认的 readLockCheckInterval 为 5000。readLockTimeout 值必须大于 readLockCheckInterval,但 thumb 的规则是具有至少 2 个或大于 readLockCheckInterval 的超时。这需要确保读锁定进程允许冻结时间,以便在超时命中前尝试获取锁定。 | 1000 | long |
readLockDeleteOrphanLockFiles (lock) | 如果 Camel 没有正确关闭,则是否应在启动时读取带有标记文件(比如 JVM 崩溃)删除任何孤立的读锁定文件(如果 Camel 没有被正确关闭)。如果将此选项设置为 false,则任何孤立的锁定文件将导致 Camel 不尝试获取该文件,这可能是因为另一个节点同时从同一共享目录读取文件。 | true | 布尔值 |
readLockIdempotentReleaseAsync (lock) | 延迟发行任务是否应同步还是异步。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | false | 布尔值 |
readLockIdempotentReleaseAsyncPoolSize (lock) | 使用异步发行任务时调度的线程池中的线程数量。在几乎所有用例中,使用默认的 1 个内核线程应该足够了,只有在更新幂等存储库缓慢或者有大量文件可以处理时,才会将其设置为更高的值。如果您通过配置 readLockIdempotentReleaseExecutorService 选项使用共享线程池,则此选项不会被使用。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | int | |
readLockIdempotentReleaseDelay (lock) | 是否在 millis 期间延迟发行任务。当文件被视为读锁定时,这可用于延迟发行任务来扩展窗口,在使用共享幂等存储库的主动/主动集群场景中,以确保其他节点无法扫描并获取同一文件,因为竞争条件。通过延长发行任务的时间时间有助于防止这些情况。请注意,只有在将 readLockRemoveOnCommit 配置为 true 时,才需要延迟。 | int | |
readLockIdempotentReleaseExecutorService (lock) | 使用自定义和共享线程池进行异步发行任务。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | ScheduledExecutorService | |
readLockLoggingLevel (lock) | 无法获取读取锁定时使用的日志记录级别。默认情况下,会记录 DEBUG。您可以更改此级别,例如 OFF 没有任何日志记录。这个选项仅适用于 readLock 类型: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename。 Enum 值:
| DEBUG | LoggingLevel |
readLockMarkerFile (lock) | 是否将标记文件与更改、重命名或专用读取锁定类型一起使用。默认情况下,使用标记文件来保护其他进程获取同一文件。通过将这个选项设置为 false,可以关闭此行为。例如,如果您不想由 Camel 应用程序将标记文件写入文件系统。 | true | 布尔值 |
readLockMinAge (lock) | 这个选项仅适用于 readLock=changed。它允许在尝试获取读取锁定前指定该文件的最短期限。例如,使用 readLockMinAge=300s 来要求文件持续 5 分钟。这可加快更改的读锁定速度,因为它将尝试获取至少给定时间的文件。 | 0 | long |
readLockMinLength (lock) | 这个选项仅适用于 readLock=changed。它允许您配置最小文件长度。默认情况下,Camel 期望文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度文件。 | 1 | long |
readLockRemoveOnCommit (lock) | 这个选项仅适用于 readLock=idempotent。它允许在处理文件成功并发生提交时指定是否从幂等存储库中删除文件名条目。默认情况下,该文件不会被删除,这样可确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可以支持驱除策略,您可以在 X 分钟后驱除文件名条目 - 这样可确保出现竞争条件的问题。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | false | 布尔值 |
readLockRemoveOnRollback (lock) | 这个选项仅适用于 readLock=idempotent。它允许在处理文件失败时指定是否从幂等存储库中删除文件名条目,并且进行回滚。如果此选项为 false,则确认文件名条目(就像文件进行了提交一样)。 | true | 布尔值 |
readLockTimeout (lock) | 可选的 timeout (如果 read-lock 支持)用于读锁定。如果无法授予 read-lock 并触发超时,则 Camel 将跳过该文件。下一次轮询 Camel 时,将再次尝试 文件,这一次可能会授予读锁定。使用 0 或较低值来指示永久值。当前 fileLock、change 和 rename 支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000,而不是 10000。readLockTimeout 值必须大于 readLockCheckInterval,但 thumb 的规则是具有至少 2 个或大于 readLockCheckInterval 的超时。这需要确保读锁定进程允许冻结时间,以便在超时命中前尝试获取锁定。 | 10000 | long |
backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
delay (scheduler) | 下一次轮询前的时间(毫秒)。 | 500 | long |
greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
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) | 使用文件语言内置排序。支持嵌套排序,以便您可以按文件名排序,并作为按修改日期排序的第二个组。 | 字符串 | |
排序 者(排序) | 可插拔排序器作为 java.util.Comparator 类。 | 比较器 |
文件生成者的默认行为
默认情况下,它会覆盖任何已存在的、带有相同名称的文件。
24.5. 移动和删除操作
任何移动或删除操作都会在(post 命令)完成后执行;因此在处理 交换
过程中,该文件仍然位于 inbox 文件夹中。
通过一个示例来演示这一点:
from("file://inbox?move=.done").to("bean:handleOrder");
当文件在 inbox
文件夹中丢弃时,文件消费者会注意到这一点,并创建一个新的 FileExchange
,它路由到 handleOrder
bean。然后 bean 处理 File
对象。此时,该文件仍然位于 inbox
文件夹中。在 bean 完成后,路由完成后,文件消费者将执行 move 操作,并将文件移到 .done
子文件夹。
move 和 preMove 选项被视为目录名称(但是,如果您使用一个表达式(如 文件 语言)或 Simple,则表达式评估的结果是要使用的文件名。例如,如果设置了:
move=../backup/copy-of-${file:name}
然后,使用的文件语言返回要使用的文件名,可以是相对或绝对的。https://access.redhat.com/documentation/zh-cn/red_hat_integration/2023.q2/html-single/camel_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");
因此,在这种情况下,文件在处理时位于 inprogress
文件夹中,并在处理后移至 .done
文件夹。
24.6. 对 Move 和 PreMove 选项进行精细控制
move 和 preMove 选项基于表达式,因此我们拥有 文件 语言的完整功能,以执行目录和名称模式的高级配置。
实际上,Camel 会在内部将您输入的目录名称转换为 文件 语言表达式。因此,当我们输入 move=.done
Camel 时,会将其转换为 :${file:parent}/.done/${file:onlyname}
。这只有在 Camel 检测到您没有自行在选项值中提供 $\{ } 时才完成。因此,当您输入 $\{ } Camel 时,不会 转换它,因此您有完整的电源。
因此,如果我们想将文件移到备份文件夹中,且现在作为模式,我们可以:
move=backup/${date:now:yyyyMMdd}/${file:name}
24.7. 关于 moveFailed
moveFailed
选项允许您将无法成功处理的文件移到其他位置,如您选择的错误文件夹。例如,要移动带有时间戳的错误文件夹中的文件,您可以使用 moveFailed=/error/${
}。
file:name.noext
}-${date:now:yyyyMMddHHmmssSSS}.${\'\'file:ext
请参阅更多示例
24.8. 消息标头
此组件支持以下标头:
24.8.1. 仅限文件制作者
标头 | 描述 |
---|---|
|
指定要写入的文件的名称(相对于端点目录)。此名称可以是 |
| 所写入的输出文件的实际绝对文件路径(路径 + 名称)。此标头由 Camel 设置,其用途是为最终用户提供所写入文件的名称。 |
|
用于过度检测 |
24.8.2. 仅限文件消费者
标头 | 描述 |
---|---|
| 使用的文件名称作为相对文件路径,从端点上配置的起始目录中偏移。 |
| 仅包括文件名(没有前导路径的名称)。 |
|
指定消耗的文件是否表示绝对路径 |
| 文件的绝对路径。对于相对文件,这个路径保存相对路径。 |
| 文件路径。对于相对文件,这是起始目录 + 相对文件名。对于绝对文件,这是绝对路径。 |
| 相对路径。 |
| 父路径。 |
|
包含文件大小 |
|
包含文件最后一次修改时间戳的 |
24.9. Batch Consumer
这个组件实现了 Batch Consumer。
24.10. 交换属性,仅限文件消费者
由于文件消费者实施 BatchConsumer
,它支持批处理它轮询的文件。通过批处理,我们意味着 Camel 将在交换中添加以下额外属性,因此您知道轮询的文件数量、当前索引以及批处理是否已完成。
属性 | 描述 |
---|---|
| 在此批处理中轮询的文件总数。 |
| 批处理的当前索引。从 0 开始。 |
|
指示批处理中最后一个交换的 |
这可让您让实例知道此批处理中存在多少个文件,例如,让聚合器2 聚合此数量的文件。
24.11. 使用 charset
charset 选项允许在消费者和制作者端点上配置文件编码。例如,如果您读取 utf-8 文件,并希望将文件转换为 iso-8859-1,您可以执行以下操作:
from("file:inbox?charset=utf-8") .to("file:outbox?charset=iso-8859-1")
您还可以在路由中使用 convertBodyTo
。在以下示例中,我们仍然以 utf-8 格式输入文件,但我们希望将文件内容转换为 iso-8859-1 格式的字节数组。然后,让 bean 处理数据。在使用当前 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
24.12. 常用带有文件夹和文件名的 getchas
当 Camel 生成文件时(写入文件)有一些影响如何设置您选择的文件名。默认情况下,Camel 将使用消息 ID 作为文件名,因为消息 ID 通常是唯一的 ID,因此您将以文件名结尾,例如: ID-MACHINENAME-2443-1211718892437-1-0
。如果不需要这样的文件名,则必须在 CamelFileName
消息标头中提供一个文件名。也可以使用 constant ( 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");
24.13. 文件名表达式
文件名可以使用 expression 选项或作为 Camel File Name
标头中的基于文件的文件语言表达式进行设置。有关语法和示例,请参阅 文件 语言。
24.14. 从其他文件直接丢弃的文件夹中消耗文件
如果您使用其他应用程序将文件直接写入的文件夹中的文件,则 beware。查看不同的 readLock 选项以查看您的用例。最好方法是写入另一个文件夹,并在写入移动 drop 文件夹中的文件后写入。但是,如果您直接将文件写入 drop 文件夹,则选项更改可能会更好地检测文件当前是否被写入/记录,因为它使用文件更改的算法来查看文件大小/修改更改。其他 readLock 选项依赖于 Java 文件 API,这些文件在检测时并不好。您可能还希望查看 doneFileName 选项,该选项在文件完成后使用标志文件(解压文件)来信号,并可供使用。
24.15. 使用 done 文件
另请参阅下面 编写 done 文件 的部分。
如果您只想在文件存在时消耗文件,您可以在端点上使用 doneFileName
选项。
from("file:bar?doneFileName=done");
如果在目标文件的同一个目录中存在一个 done 文件,将仅使用 bar 文件夹中的文件。在完成使用文件或,Camel 将自动删除 done 文件。如果配置了 noop=true
,Camel 不会删除 done 文件。
但是,每个目标文件有一个 完整的文件 更为常见。这意味着有一个 1:1 个关联。要做到这一点,您必须在 doneFileName
选项中使用动态占位符。目前,Camel 支持以下动态令牌: file:name
和 file:name.noext
,这些令牌必须用 $\{ } 括起来。消费者只支持以前缀或后缀(不支持两者) 完成的文件名 的静态部分。
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 文件
24.16. 编写完成的文件
编写一个文件后,您可能希望将额外的 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
的文件。
24.17. Samples
24.17.1. 从目录读取和写入到另一个目录
from("file://inputdir/?delete=true").to("file://outputdir")
24.17.2. 从目录读取并使用 overrule 动态名称写入另一个目录
from("file://inputdir/?delete=true").to("file://outputdir?overruleFile=copy-of-${file:name}")
侦听目录,并为在那里丢弃的每个文件创建一个消息。将内容复制到 outputdir
,并删除 inputdir
中的文件。
24.17.3. 从目录中递归读取并写入另一个目录
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir")
侦听目录,并为在那里丢弃的每个文件创建一个消息。将内容复制到 outputdir
,并删除 inputdir
中的文件。将递归扫描到子目录中。将把文件放在与 input
的目录结构中,包括任何子目录。
dir
相同
inputdir/foo.txt inputdir/sub/bar.txt
将导致以下输出布局:
outputdir/foo.txt outputdir/sub/bar.txt
24.18. 使用扁平化
如果要将文件存储在同一目录中的 outputdir 目录中,请忽略源目录布局(例如扁平化路径),只需在文件制作者侧添加 flatten=true
选项:
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir?flatten=true")
将导致以下输出布局:
outputdir/foo.txt outputdir/bar.txt
24.19. 从目录和默认移动操作读取
默认情况下,Camel 将任何处理的文件移到文件使用的目录中的 .camel
子目录中。
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir")
按如下所示影响布局:
前
inputdir/foo.txt inputdir/sub/bar.txt
after
inputdir/.camel/foo.txt inputdir/sub/.camel/bar.txt outputdir/foo.txt outputdir/sub/bar.txt
24.20. 从目录读取并处理 java 中的消息
from("file://inputdir/").process(new Processor() { public void process(Exchange exchange) throws Exception { Object body = exchange.getIn().getBody(); // do some business logic with the input body } });
正文将是一个 File
对象,它指向刚刚放入到 inputdir
目录中的文件。
24.21. 写入文件
Camel 也能够编写文件,即生成文件。在以下示例中,我们将在将进程写入目录前收到有关 SEDA 队列的一些报告。
24.21.1. 使用 Exchange.FILE_NAME
写入子目录
通过使用单个路由,可以将文件写入任意数量的子目录。如果您有路由设置,如下所示:
<route> <from uri="bean:myBean"/> <to uri="file:/rootDirectory"/> </route>
您可以将 header Exchange.FILE_NAME
设置为值,例如:
Exchange.FILE_NAME = hello.txt => /rootDirectory/hello.txt Exchange.FILE_NAME = foo/bye.txt => /rootDirectory/foo/bye.txt
这可让您有一个路由来将文件写入多个目的地。
24.21.2. 通过相对于最终目的地的临时目录写入文件
有时您需要临时将文件写入相对于目标目录的一些目录。当某些具有有限过滤功能的外部进程是从您要写入的目录中读取时,通常会发生这种情况。在以下示例中,文件将写入 /var/myapp/filesInProgress
目录,并在进行数据传输后,将以原子方式移到' /var/myapp/finalDirectory 'directory。
from("direct:start"). to("file:///var/myapp/finalDirectory?tempPrefix=/../filesInProgress/");
24.22. 将表达式用于文件名
在这个示例中,我们希望将消耗的文件移到备份文件夹中,使用当前的日期作为子文件夹名称:
from("file://inbox?move=backup/${date:now:yyyyMMdd}/${file:name}").to("...");
如需了解更多示例,请参阅 文件语言。
24.23. 避免多次读取同一文件(隐藏消费者)
Camel 直接在组件内支持 Idempotent Consumer,以便跳过已经处理的文件。可以通过设置 idempotent=true
选项来启用此功能。
from("file://inbox?idempotent=true").to("...");
Camel 使用绝对文件名作为幂等键,以检测重复的文件。您可以使用 idempotentKey 选项中的表达式来自定义此密钥。例如,将名称和文件大小用作键
<route> <from uri="file://inbox?idempotent=true&idempotentKey=${file:name}-${file:size}"/> <to uri="bean:processInbox"/> </route>
默认情况下,Camel 使用基于内存的存储来跟踪消耗的文件,它使用最近保留 1000 个条目的缓存。您可以使用值中的 explicit Repository
选项来插件您自己的存储实现,以指示它在 Registry 中引用具有指定 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
24.24. 使用基于文件的幂等存储库
在本节中,我们将使用基于文件的幂等存储库 org.apache.camel.processor.idempotent.FileIdempotentRepository
,而不是默认基于内存的内存中。
此仓库使用第一级缓存以避免读取文件存储库。它将仅使用文件存储库来存储第一级别缓存的内容。因此,存储库可以在服务器重启后保留。它将在启动时将文件的内容加载到第一级缓存中。文件结构非常简单,因为它将密钥存储在文件中的单独行中。默认情况下,文件存储的大小限制为 1mb。当文件增长较大的 Camel 会截断文件存储时,通过将 1st 级别缓存刷新到一个新的空文件来重建内容。
我们使用 Spring XML 创建我们的存储库来创建我们的文件幂等存储库,并定义我们的文件消费者使用我们的存储库与 幂等
权限一起使用,以表示 Registry 查找:
24.25. 使用基于 JPA 的幂等存储库
在本节中,我们将使用基于 JPA 的幂等存储库,而不是默认使用的内存中。
首先,我们需要在 META-INF/persistence.xml
中有一个 persistence-unit,其中需要使用类 org.apache.camel.processor.idempotent.jpa.MessageProcessed
作为模型。
<persistence-unit name="idempotentDb" transaction-type="RESOURCE_LOCAL"> <class>org.apache.camel.processor.idempotent.jpa.MessageProcessed</class> <properties> <property name="openjpa.ConnectionURL" value="jdbc:derby:target/idempotentTest;create=true"/> <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/> <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/> <property name="openjpa.Multithreaded" value="true"/> </properties> </persistence-unit>
接下来,也可以在 spring XML 文件中创建 JPA 幂等存储库:
<!-- we define our jpa based idempotent repository we want to use in the file consumer --> <bean id="jpaStore" class="org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository"> <!-- Here we refer to the entityManagerFactory --> <constructor-arg index="0" ref="entityManagerFactory"/> <!-- This 2nd parameter is the name (= a category name). You can have different repositories with different names --> <constructor-arg index="1" value="FileConsumer"/> </bean>
然后,这是的,只需要使用 sVirt 语法选项引用文件消费者端点中的 jpaStore bean:
<route> <from uri="file://inbox?idempotent=true&idempotentRepository=#jpaStore"/> <to uri="bean:processInbox"/> </route>
24.26. 使用 org.apache.camel.component.file.GenericFileFilter 进行过滤
Camel 支持可插拔过滤策略。然后,您可以使用此类过滤器配置端点,以跳过被处理的某些文件。
在示例中,我们构建了自己的过滤器,它会跳过其文件名是以 skip
开始的文件:
然后,我们可以使用 filter 属性配置路由,以引用我们在 spring XML 文件中定义的过滤器(使用 spring 表示法):
<!-- 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>
24.27. 使用 ANT 路径匹配程序进行过滤
ANT 路径匹配程序基于 AntPathMatcher。
文件路径与以下规则匹配:
-
?
匹配一个字符 -
DNAT
匹配零个或多个字符 -
Tailoring
匹配路径中的零个或多个目录
antInclude
和 antExclude
选项可以轻松地指定 ANT 风格的 include/exclude,而无需定义过滤器。如需更多信息,请参阅上面的 URI 选项。
以下示例演示了如何使用它:
24.27.1. 使用 Comparator 进行排序
Camel 支持可插拔排序策略。此策略在 Java 中的 java.util.Comparator
中使用构建。然后,您可以使用这样的比较器配置端点,并在处理前对文件进行排序。
在示例中,我们构建了自己的比较器,只需按照文件名排序:
然后,我们可以使用 sorter 选项配置路由,以引用我们在 spring XML 文件中定义的排序器(mySorter
):
<!-- 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。因此,编写 sorter=114mySorter
将指示 Camel 在 Registry 中查找 ID 为 mySorter
的 bean。
24.27.2. 使用 sortBy 排序
Camel 支持可插拔排序策略。此策略使用 文件 语言来配置排序。sortBy
选项配置如下:
sortBy=group 1;group 2;group 3;...
其中,每个组都用分号分开。在简单的情形中,您只使用一个组,因此一个简单的示例可以是:
sortBy=file:name
这将根据文件名排序,您可以通过前缀 reverseing reverse:
到组来撤销顺序,因此排序现在是 Z..A :
sortBy=reverse:file:name
因为我们拥有完整的 文件 语言功能,我们可以使用一些额外的参数,因此如果我们希望根据文件大小排序:
sortBy=file:length
您可以将配置为忽略问题单,使用 ignoreCase:
进行字符串比较,因此如果您想要使用文件排序但忽略这种情况,则我们这样做:
sortBy=ignoreCase:file:name
您可以组合忽略问题单和反向,但必须首先指定反向:
sortBy=reverse:ignoreCase:file:name
在以下示例中,我们希望按上次修改的文件排序,因此我们这样做:
sortBy=file:modified
然后,我们希望将名称作为 2 个选项进行分组,以便具有相同修改的文件按照名称排序:
sortBy=file:modified;file:name
现在,此处存在一个问题,您可以发现它吗?对文件的修改的时间戳太正常,但如果我们只想根据日期排序,那么根据名称对子组进行排序,那么什么?
另外,我们拥有 文件语言的真实 功能,我们还可以使用其支持模式的 date 命令。因此,您可以通过以下方法解决:
sortBy=date:file:yyyyMMdd;file:name
Yeah 是非常强大的,根据您还可为每个组使用反向方式,因此我们可以撤销文件名:
sortBy=date:file:yyyyMMdd;reverse:file:name
24.28. 使用 GenericFileProcessStrategy
选项 processStrategy
可用于使用自定义 GenericFileProcessStrategy
,允许您实现自己的 开始、提交 和回滚 逻辑。
例如,假设系统在应使用的文件夹中写入文件。但是,在写另一个 就绪 文件之前,您不应该开始使用文件。
因此,通过实施自己的 GenericFileProcessStrategy
,我们可以根据以下方法实现它:
-
在 start
()
方法中,我们可以测试是否存在特殊的 就绪 文件。start 方法返回一个布尔值
,以指示我们是否可以消耗该文件。 -
在
abort()
方法中,当begin
操作返回false
时,可以执行特殊的逻辑,例如清理资源等。 -
在
commit ()
方法中,我们可以移动实际的文件,同时删除 可用的 文件。
24.29. 使用过滤器
filter
选项允许您通过实施 org.apache.camel.component.file.GenericFileFilter
接口在 Java 代码中实施自定义过滤器。此接口具有返回布尔值的 accept
方法。返回 true
以包含该文件,使用 false
来跳过该文件。GenericFile
有 isDirectory
方法,无论是目录。这可让您过滤不需要的目录,以避免遍历不需要的目录。
例如,要跳过名称中以 "skip"
开头的任何目录,如下所示:
24.30. 使用 bridgeErrorHandler
如果要使用 Camel Error Handler 处理文件消费者中发生的任何异常,您可以启用 bridgeErrorHandler
选项,如下所示:
// to handle any IOException being thrown onException(IOException.class) .handled(true) .log("IOException occurred due: ${exception.message}") .transform().simple("Error ${exception.message}") .to("mock:error"); // this is the file route that pickup files, notice how we bridge the consumer to use the Camel routing error handler // the exclusiveReadLockStrategy is only configured because this is from an unit test, so we use that to simulate exceptions from("file:target/nospace?bridgeErrorHandler=true") .convertBodyTo(String.class) .to("mock:result");
因此,您要做的只是启用此选项,路由中的错误处理程序将从那里获取它。
当使用 bridgeErrorHandler
时,在使用 bridgeErrorHandler 时,OnCompletions 不会被应用。Exchange 由 Camel Error Handler 直接处理,不允许之前的操作(如拦截器)执行操作。
24.31. 调试日志记录
此组件具有日志级别 TRACE,如果您出现问题,这非常有用。
24.32. Spring Boot Auto-Configuration
当在 Spring Boot 中使用文件时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-file-starter</artifactId> </dependency>
组件支持 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 | 根路径。 | 字符串 | |
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 | 布尔值 |
第 25 章 FTP
支持生成者和消费者
这个组件通过 FTP 和 SFTP 协议提供对远程文件系统的访问。
当从远程 FTP 服务器消耗时,请确保在进一步 消耗文件时读取名为 Default 的部分,以了解与消耗文件相关的详细信息。
不支持 绝对路径。Camel 通过修剪 directoryname
的所有前导斜杠来将绝对路径转换为相对。日志中会打印 WARN 消息。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-ftp</artifactId> <version>{CamelSBVersion}</version>See the documentation of the Apache Commons <!-- use the same version as your Camel core version --> </dependency>
25.1. URI 格式
ftp://[username@]hostname[:port]/directoryname[?options] sftp://[username@]hostname[:port]/directoryname[?options] ftps://[username@]hostname[:port]/directoryname[?options]
其中 directoryname 代表底层目录。目录名称是相对路径。不支持 绝对路径。相对路径可以包含嵌套文件夹,如 /inbox/us。
支持 autoCreate
选项。当消费者启动时,在轮询前执行额外的 FTP 操作来创建端点配置的目录。autoCreate
的默认值为 true
。
如果没有提供 用户名,则尝试 使用任何密码的匿名
登录。
如果没有提供 端口号,Camel 将根据协议提供默认值(ftp = 21, sftp = 22, ftps = 2222)。
您可以将查询选项附加到 URI 中,格式为 ?option=value&option=value&…
这个组件使用两个不同的库进行实际 FTP 工作。FTP 和 FTPS 使用 Apache Commons Net,而 SFTP 使用 JCraft JSCH。
FTPS (也称为 FTP 安全)是 FTP 的扩展,它增加了对传输层安全(TLS)和安全套接字层(SSL)加密协议的支持。
25.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
25.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
25.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
25.3. 组件选项
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 | 布尔值 |
25.4. 端点选项
FTP 端点使用 URI 语法进行配置:
ftp:host:port/directoryName
使用以下路径和查询参数:
25.4.1. 路径参数(3 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
host (common) | 必需 FTP 服务器的主机名。 | 字符串 | |
port (common) | FTP 服务器的端口。 | int | |
directoryName (common) | 启动目录。 | 字符串 |
25.4.2. 查询参数(111 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
二进制 (common) | 指定文件传输模式、BINARY 或 ASCII。默认为 ASCII (false)。 | false | 布尔值 |
charset (common) | 此选项用于指定文件编码。您可以在消费者上使用此功能,以指定文件的编码,它允许 Camel 在访问文件内容时加载文件内容。在编写文件时,您可以使用此选项指定写入该文件的 charset。请注意,当编写 Camel 文件时,可能需要将消息内容读取在内存中才能将数据转换为配置的 charset,因此如果您有大量消息,则不要使用它。 | 字符串 | |
disconnect (common) | 使用后是否断开与远程 FTP 服务器的连接。断开连接将仅断开当前与 FTP 服务器的连接。如果您有要停止的消费者,则需要停止 consumer/route。 | false | 布尔值 |
doneFileName (common) | producer :如果提供,则 Camel 将在编写原始文件时写入第二次完成的文件。done 文件为空。这个选项配置要使用的文件名。您可以指定固定名称。或者,您可以使用动态占位符。done 文件将始终写在与原始文件相同的文件夹中。consumer :如果提供,Camel 仅在文件存在时使用文件。这个选项配置要使用的文件名。您可以指定固定名称。或者,您可以使用动态占位符。done 文件始终预期在与原始文件相同的文件夹中。仅支持 $\\{file.name} 和 $\\{file.name.next} 作为动态占位符。 | 字符串 | |
fileName (common) | 使用 Expression (如文件语言)来动态设置文件名。对于消费者,它用作文件名过滤器。对于生成者,它用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注意:标头本身也可以是 Expression)。表达式选项支持 String 和 Expression 类型。如果表达式是字符串类型,则始终使用 File Language 来评估。如果表达式是 Expression 类型,则会使用指定的 Expression 类型 - 例如,您可以使用 OGNL 表达式。对于消费者,您可以使用它来过滤文件名,因此您可以使用 File Language 语法:mydata-$\\{date:now:yyyyMMdd}.txt 来使用现在使用的文件。producers 支持 CamelOverruleFileName 标头,其优先于任何现有 CamelFileName 标头;CamelOverruleFileName 是一个仅一次的标头,并便于避免临时存储 CamelFileName 并在以后恢复它。 | 字符串 | |
passiveMode (common) | 设置被动模式连接。默认为活动模式连接。 | false | 布尔值 |
分隔符 (common) | 设置要使用的路径分隔符。unix = 使用 unix 风格的路径分隔符 Windows = 使用窗口风格路径分隔符 Auto = (默认)在文件名中使用现有路径分隔符。 Enum 值:
| UNIX | PathSeparator |
transferLoggingIntervalSeconds (common) | 在记录上传和下载操作的进度时,配置使用的时间间隔(以秒为单位)。这可用于在操作需要更长的时间时记录进度。 | 5 | int |
transferLoggingLevel (common) | 配置日志记录在记录上传和下载操作进度时要使用的日志级别。 Enum 值:
| DEBUG | LoggingLevel |
transferLoggingVerbose (common) | 配置上传和下载操作进度执行详细(粒度)日志记录。 | false | 布尔值 |
fastExistsCheck (common (advanced)) | 如果将此选项设为 true,则 camel-ftp 将直接使用列表文件来检查是否存在该文件。由于某些 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 也设置幂等=true,以避免再次消耗相同的文件。 | false | 布尔值 |
preMove (consumer) | 在处理前移动文件名的表达式(如文件语言)。例如,要将 in-progress 文件移到 order 目录中,将此值设置为 order。 | 字符串 | |
preSort (consumer) | 启用预排序后,消费者将在轮询过程中对文件和目录名称进行排序,这从文件系统检索。如果您需要按照排序的顺序对文件进行操作,您可能需要执行此操作。预排序是在消费者开始过滤前执行的,并接受由 Camel 处理的文件。这个选项是 default=false 表示禁用。 | false | 布尔值 |
recursion (consumer) | 如果某个目录,也会在所有子目录中查找文件。 | false | 布尔值 |
resumeDownload (consumer) | 配置是否启用了恢复下载。这必须被 FTP 服务器支持(大多数 FTP 服务器都支持它)。此外,还必须配置本地WorkDirectory 选项,以便下载的文件存储在本地目录中,且必须启用选项二进制文件,这是支持恢复下载所必需的。 | false | 布尔值 |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
streamDownload (consumer) | 设置不使用本地工作目录时要使用的下载方法。如果设置为 true,则在读取时将远程文件流传输到路由。当设置为 false 时,远程文件会在发送到路由前被加载到内存中。如果启用这个选项,则必须设置 stepwise=false,因为无法同时启用这两个步骤。 | false | 布尔值 |
下载 (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)) | 可插拔 in-progress 存储库 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。请注意,使用这个选项时,要下载的具体文件不包括 meta-data 信息,如文件大小、时间戳、权限等,因为这些信息只能在使用 LIST 命令时检索。 | true | 布尔值 |
fileExist (producer) | 如果文件已存在具有相同名称的文件,则该怎么办。覆盖(这是默认设置)替换现有文件。- Append - 将内容添加到现有文件中。- Fail - 抛出一个 GenericFileOperationException,表示已有的文件。- Ignore - 静默忽略问题,且不会覆盖现有的文件,但假设所有内容正常。- Move - 选项需要使用 moveExisting 选项。选项 eagerDeleteTargetFile 可以用来控制移动文件时要执行的操作,并且已存在现有文件,否则会导致移动操作失败。Move 选项将在编写目标文件前移动任何现有文件。- 只有在使用 tempFileName 选项时才适用 TryRename。这允许尝试将文件从临时名称重命名为实际名称,而无需执行任何存在检查。对于某些文件系统,这个检查可能会更快,特别是 FTP 服务器。 Enum 值:
| 覆盖 | GenericFileExist |
flatten (producer) | 扁平化用于扁平化任何前导路径的文件名路径,因此它只是文件名。这样,您可以递归地将文件写入子目录中,但当您将文件写入另一个目录中时,它们将写入到单个目录中。在制作者上将其设置为 true 可强制在 CamelFileName 标头中为任何前导路径去除任何文件名。 | false | 布尔值 |
jailStartingDirectory (producer) | 仅用于 jailing (限制)将文件写入启动目录(和子)。默认情况下,这不允许 Camel 将文件写入外部目录(其开箱即用)。您可以将其关闭,以允许将文件写入启动目录之外的目录,如父目录或根文件夹。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
moveExisting (producer) | 配置 fileExist=Move 时使用的表达式(如文件语言)用于计算文件名。将文件移到备份子目录中,只需输入备份。这个选项只支持以下文件语言令牌: file:name、file:name.ext、file:name.noext、file:onlyname、file:onlyname.noext、file:ext 和 file:parent。请注意,FTP 组件不支持 file:parent,因为 FTP 组件只能将任何现有文件移至基于当前 dir 作为基础的相对目录中。 | 字符串 | |
tempFileName (producer) | 与 tempPrefix 选项相同,但提供对临时文件名命名更加精细的控制,因为它使用 File 语言。tempFilename 的位置相对于选项 'fileName' 中的最终文件位置,而不是基础 uri 中的目标目录。例如,如果选项 fileName 包含一个目录前缀:dir/finalFilename,则 tempFileName 相对于该子目录 dir。 | 字符串 | |
tempPrefix (producer) | 此选项用于使用临时名称写入文件,然后在写入完成后将其重命名为实际名称。可用于识别正在写入的文件,并避免消费者(不使用专用读锁定)读取进度文件中。FTP 通常在上传大型文件时使用。 | 字符串 | |
allowNullBody (producer (advanced)) | 用于指定在文件写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,设置为 false,并尝试向文件组件发送 null 正文,将抛出 'Cannot write null body 的 GenericFileWriteException。'如果 fileExist 选项设为 'Override',则该文件将被截断,如果设为附加该文件,则该文件将保持不变。 | false | 布尔值 |
chmod (producer (advanced)) | 允许您在存储的文件上设置 chmod。例如 chmod=640。 | 字符串 | |
disconnectOnBatchComplete (producer (advanced)) | Batch 上传完成后是否与远程 FTP 服务器断开连接。disconnectOnBatchComplete 只会断开当前与 FTP 服务器的连接。 | false | 布尔值 |
eagerDeleteTargetFile (producer (advanced)) | 是否强制删除任何现有目标文件。这个选项仅在使用 fileExists=Override 和 tempFileName 选项时才适用。您可以使用它来禁用(将其设置为 false)在写入临时文件前删除目标文件。例如,您可以编写大型文件,并希望在编写临时文件过程中存在目标文件。这样可确保目标文件仅在最后一次时间之前被删除,只需在临时文件重命名为目标文件名之前。此选项还用于控制在启用 fileExist=Move 时是否删除任何现有文件,并且存在现有的文件。如果此选项 copyAndDeleteOnRenameFails false,那么如果现有文件存在,则会抛出异常(如果为 true),则在移动操作前删除现有文件。 | true | 布尔值 |
keepLastModified (producer (advanced)) | 将保留源文件的最后修改的时间戳(若有)。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或带有时间戳的长度。如果时间戳存在,并且启用了 选项,它将在写入的文件中设置此时间戳。注:此选项仅适用于文件制作者。您不能将此选项与任何 ftp producer 一起使用。 | false | 布尔值 |
moveExistingFileStrategy (producer (advanced)) | 用于在配置 fileExist=Move 时使用特殊命名令牌的策略(自定义策略)。默认情况下,如果没有提供自定义策略,则使用实施。 | FileMoveExistingStrategy | |
sendNoop (producer (advanced)) | 在将文件上传到 FTP 服务器前,是否将 noop 命令作为预写检查发送。这默认是启用的,因为连接的验证仍有效,这样可以静默地重新连接可以上传该文件。但是,如果这会导致问题,您可以关闭这个选项。 | true | 布尔值 |
activePortRange (advanced) | 在活跃模式下设置客户端端口范围。语法为: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) | 指定当 Camel 尝试连接到远程 FTP 服务器时的最大重新连接尝试。使用 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 |
步骤( 高级) | 设置在下载文件时,还是在将文件上传到目录时,是否应先更改目录结构。例如,当您因为安全原因而无法更改 FTP 服务器上的目录时,您可以禁用此设置。步骤不能与 streamDownload 一起使用。 | true | 布尔值 |
Sync (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
throwExceptionOnConnectFailed (advanced) | 如果连接失败(dhausted) 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 风格的过滤器包括。可使用以逗号分隔的格式指定多个 include。 | 字符串 | |
eagerMaxMessagesPerPoll (filter) | 允许控制 maxMessagesPerPoll 的限制是 eager。如果 eager,则在扫描文件的过程中会进行限制。其中为 false 将扫描所有文件,然后执行排序。将这个选项设置为 false 允许首先排序所有文件,然后限制轮询。请注意,这需要更高的内存用量,因为所有文件详情都在内存中执行排序。 | true | 布尔值 |
exclude (filter) | 用于排除文件(如果文件名与正则表达式模式匹配)(匹配不区分大小写)。请注意,如果您使用加号等符号,如果将其配置为端点 uri,则需要使用 RAW ()语法进行配置。有关配置端点 uri 的更多信息,请参阅。 | 字符串 | |
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 Consumer EIP 模式的选项,以便 Camel 跳过已经处理的文件。默认情况下,将使用基于内存的 LRUCache,其中包含 1000 个条目。如果 noop=true 也会启用,以避免再次消耗相同的文件。 | false | 布尔值 |
idempotentKey (filter) | 使用自定义幂等键,请执行以下操作:默认情况下,使用该文件的绝对路径。您可以使用 File Language,例如使用文件名和文件大小,您可以执行以下操作:OnlydKey=$\\{file:name}-$\\{file:size}。 | 字符串 | |
idempotentRepository (filter) | 可插拔存储库 org.apache.camel.spi.IdempotentRepository,它默认使用 MemoryIdempotentRepository (如果没有指定),且幂等性为 true。 | IdempotentRepository | |
include (filter) | 用于包含文件,如果文件名与正则表达式模式匹配(匹配不区分大小写)。请注意,如果您使用加号等符号,如果将其配置为端点 uri,则需要使用 RAW ()语法进行配置。有关配置端点 uri 的更多信息,请参阅。 | 字符串 | |
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) | 可插拔读锁定作为 org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy 实现。 | GenericFileExclusiveReadLockStrategy | |
readLock (lock) | 消费者使用,仅在文件有独占的 read-lock 时轮询文件(例如,该文件不是 in-progress 或 in-progress 或正在写入)。Camel 将等到赋予文件锁定。此选项在策略中提供构建: - none - No read lock is use - markFile - Camel 创建标记文件(fileName.camelLock),然后在其上保存锁定。FTP 组件无法使用这个选项 - Changed - Changed 使用文件长度/修改时间戳来检测文件当前是否复制。至少将使用 1 sec 来确定这一点,因此此选项无法像其他进程一样快速使用文件,但可能会更可靠,因为 JDK IO API 并不总是确定当前由其他进程使用的文件。选项 readLockCheckInterval 可用于设置检查频率。- fileLock - 使用 java.nio.channels.FileLock。这个选项不适用于 Windows OS 和 FTP 组件。在通过 mount/share 访问远程文件系统时,应该避免这种方法,除非该文件系统支持分布式文件锁定。- 重命名是使用尝试将文件重命名为测试(如果我们可以获得专用 read-lock. - 幂等的 - (仅用于文件组件)用于使用幂等结构作为读锁定。如果幂等存储库实现支持集群,这允许使用支持集群的读锁定。- idempotent-changed - (仅限文件组件)幂等性更改是使用幂等的Repository,并作为组合的 read-lock 进行更改。如果幂等存储库实现支持集群,这允许使用支持集群的读锁定。- idempotent-rename - (仅用于文件组件)幂等名称使用幂等权限,并重命名为组合的 read-lock。如果幂等存储库实现支持集群,这允许使用支持集群的读锁定:各种读锁定并不是在集群模式下工作的,其中不同节点上的并发消费者对共享文件系统中的同一文件都是竞争的。使用一个接近原子操作的 markFile 来创建空标记文件,但无法保证在集群中工作。fileLock 可能更好,但文件系统需要支持分布式文件锁定等。如果幂等存储库支持集群,如 Hazelcast 组件或 Infinispan,则使用幂等读锁定支持集群。 Enum 值:
| none | 字符串 |
readLockCheckInterval (lock) | read-lock 的 millis (如果读锁定支持)。这个间隔用于在尝试获取读锁定之间休眠。例如,在使用更改的读锁定时,您可以为较慢的写入设置更高的间隔周期。如果生成者非常慢,则默认值 1 sec. 可能太快。注意:对于 FTP,默认的 readLockCheckInterval 为 5000。readLockTimeout 值必须大于 readLockCheckInterval,但 thumb 的规则是具有至少 2 个或大于 readLockCheckInterval 的超时。这需要确保读锁定进程允许冻结时间,以便在超时命中前尝试获取锁定。 | 1000 | long |
readLockDeleteOrphanLockFiles (lock) | 如果 Camel 没有正确关闭,则是否应在启动时读取带有标记文件(比如 JVM 崩溃)删除任何孤立的读锁定文件(如果 Camel 没有被正确关闭)。如果将此选项设置为 false,则任何孤立的锁定文件将导致 Camel 不尝试获取该文件,这可能是因为另一个节点同时从同一共享目录读取文件。 | true | 布尔值 |
readLockLoggingLevel (lock) | 无法获取读取锁定时使用的日志记录级别。默认情况下,会记录 DEBUG。您可以更改此级别,例如 OFF 没有任何日志记录。这个选项仅适用于 readLock 类型: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename。 Enum 值:
| DEBUG | LoggingLevel |
readLockMarkerFile (lock) | 是否将标记文件与更改、重命名或专用读取锁定类型一起使用。默认情况下,使用标记文件来保护其他进程获取同一文件。通过将这个选项设置为 false,可以关闭此行为。例如,如果您不想由 Camel 应用程序将标记文件写入文件系统。 | true | 布尔值 |
readLockMinAge (lock) | 这个选项仅适用于 readLock=changed。它允许在尝试获取读取锁定前指定该文件的最短期限。例如,使用 readLockMinAge=300s 来要求文件持续 5 分钟。这可加快更改的读锁定速度,因为它将尝试获取至少给定时间的文件。 | 0 | long |
readLockMinLength (lock) | 这个选项仅适用于 readLock=changed。它允许您配置最小文件长度。默认情况下,Camel 期望文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度文件。 | 1 | long |
readLockRemoveOnCommit (lock) | 这个选项仅适用于 readLock=idempotent。它允许在处理文件成功并发生提交时指定是否从幂等存储库中删除文件名条目。默认情况下,该文件不会被删除,这样可确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可以支持驱除策略,您可以在 X 分钟后驱除文件名条目 - 这样可确保出现竞争条件的问题。请参阅 readLockIdempotentReleaseDelay 选项的详情。 | false | 布尔值 |
readLockRemoveOnRollback (lock) | 这个选项仅适用于 readLock=idempotent。它允许在处理文件失败时指定是否从幂等存储库中删除文件名条目,并且进行回滚。如果此选项为 false,则确认文件名条目(就像文件进行了提交一样)。 | true | 布尔值 |
readLockTimeout (lock) | 可选的 timeout (如果 read-lock 支持)用于读锁定。如果无法授予 read-lock 并触发超时,则 Camel 将跳过该文件。下一次轮询 Camel 时,将再次尝试 文件,这一次可能会授予读锁定。使用 0 或较低值来指示永久值。当前 fileLock、change 和 rename 支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000,而不是 10000。readLockTimeout 值必须大于 readLockCheckInterval,但 thumb 的规则是具有至少 2 个或大于 readLockCheckInterval 的超时。这需要确保读锁定进程允许冻结时间,以便在超时命中前尝试获取锁定。 | 10000 | long |
backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
delay (scheduler) | 下一次轮询前的时间(毫秒)。 | 500 | long |
greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
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) | 使用文件语言内置排序。支持嵌套排序,以便您可以按文件名排序,并作为按修改日期排序的第二个组。 | 字符串 | |
排序 者(排序) | 可插拔排序器作为 java.util.Comparator 类。 | 比较器 |
25.5. FTPS 组件默认信任存储
当将与 SSL 相关的 ftpClient.
属性与 FTPS 组件搭配使用时,信任存储会接受所有证书。如果您只想信任选择的证书,则必须使用 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 FTPClientConfig 文档。另外,对于 Apache Commons FTPClient。
如果您不想在 url 中有多个和较长的配置,您可以通过让 Registry 中的 Camel 查找供 registry 引用要使用的 ftpClient
或 ftpClientConfig
。
例如:
<bean id="myConfig" class="org.apache.commons.net.ftp.FTPClientConfig"> <property name="lenientFutureDates" value="true"/> <property name="serverLanguageCode" value="fr"/> </bean>
然后,当您在 url 中使用 sVirt 表示法时,请让 Camel 查找此 bean。
from("ftp://foo@myserver?password=secret&ftpClientConfig=#myConfig").to("bean:foo");
25.6. 例子
ftp://someone@someftpserver.com/public/upload/images/holiday2008?password=secret&binary=true ftp://someoneelse@someotherftpserver.co.uk:12049/reports/2008/password=secret&binary=false ftp://publicftpserver.com/download
25.7. 并发
FTP Consumer 不支持并发
FTP 使用者(具有相同端点)不支持并发(后备 FTP 客户端不安全)。
您可以使用多个 FTP 用户从不同的端点轮询。它只是不支持并发消费者的单一端点。
FTP 制作者 没有 这个问题,它支持并发。
25.8. 更多信息
这个组件是 File 组件的扩展。因此,File 组件页面中还有更多样本和详情。
25.9. 使用文件时的默认
FTP 使用者默认会将消耗的文件留在远程 FTP 服务器上。如果您希望删除文件或将它们移动到其他位置,则必须明确配置它。例如,您可以使用 delete=true
删除文件,或使用 move=.done
将文件移到隐藏的子目录中。
常规文件消费者与默认情况下,该文件将文件移到 .camel
子目录。对于 FTP 消费者,Camel 默认 不会 执行此操作的原因是,默认情况下可能会缺少权限来移动或删除文件。
25.9.1. 限制
选项 readLock 可用于强制 Camel 不 消耗当前正在写入中的文件。但是,此选项默认关闭,因为它要求用户具有写入访问权限。有关读取锁定的详情,请查看 File2 中的选项表。
其他解决方案可以避免当前通过 FTP 写入的文件;例如,您可以写入一个临时目的地并在文件被写入后移动该文件。
使用 move
或 preMove
选项移动文件时,文件仅限于 FTP_ROOT 文件夹。这可防止您在 FTP 区域外移动文件。如果要将文件移动到另一个区域,您可以使用软链接并将文件移到软链接文件夹中。
25.10. 消息标头
以下消息标头可用于影响组件的行为
标头 | 描述 |
---|---|
| 指定发送到端点时用于输出消息的输出文件名(相对于端点目录)。如果这不存在且没有表达式,则生成的消息 ID 将用作文件名。 |
| 所写入的输出文件的实际文件路径(路径 + 名称)。此标头由 Camel 设置,其用途是为最终用户提供所写入文件的名称。 |
| 消耗的文件的文件名 |
| 远程主机名。 |
| 使用本地工作目录的路径(如果使用本地工作目录)。 |
此外,FTP/FTPS 使用者和制作者还将增强带有以下标头的 Camel 消息
标头 | 描述 |
---|---|
| FTP 客户端回复代码(类型是一个整数) |
| FTP 客户端回复字符串 |
25.10.1. 交换属性
Camel 设置以下交换属性
标头 | 描述 |
---|---|
| 当前索引在这个批处理中消耗的文件总数中。 |
| 在这个批处理中消耗的文件总数。 |
| 如果此批处理中没有更多文件,则为 true。 |
25.11. 关于超时
两组库(请参阅 top)有不同的 API 来设置超时。您可以使用这两者的 connectTimeout
选项在 millis 中设置超时来建立网络连接。也可以在 FTP/FTPS 上设置单独的 soTimeout
,它与使用 ftpClient.soTimeout
对应。注意 SFTP 将自动使用 connectTimeout
作为其 soTimeout
。timeout
选项仅适用于 FTP/FTPS 作为数据超时,对应于 ftpClient.dataTimeout
值。所有超时值都为 millis。
25.12. 使用本地工作目录
Camel 支持从远程 FTP 服务器消耗,并将文件直接下载到本地工作目录中。这可避免将整个远程文件内容读取在内存中,因为它使用 FileOutputStream
直接流传输到本地文件。
Camel 将存储到名称与远程文件相同的本地文件,但在下载文件时使用 .inprogress
与扩展名。之后,文件被重命名为删除 .inprogress
后缀。最后,当 Exchange 完成后,将删除本地文件。
因此,如果要从远程 FTP 服务器下载文件并将其存储为文件,则需要路由到文件端点,例如:
from("ftp://someone@someserver.com?password=secret&localWorkDirectory=/tmp").to("file://inbox");
以上路由效率更高,因为它可避免将整个文件内容读取到内存中。它将直接将远程文件下载到本地文件流。java.io.File
处理随后用作交换正文。文件制作者利用此事实,可以直接用于工作文件 java.io.File
handle,并对目标文件名执行 java.io.File.rename
。由于 Camel 知道它是一个本地的工作文件,它可以优化并使用重命名而不是文件副本,因为工作文件旨在删除。
25.13. 步骤更改目录
在消耗文件(例如下载)或生成文件(例如上传)时,Camel FTP 可以在两个模式下运行。
- stepwise
- 没有步骤
您可能希望根据您的情况和安全问题选择一个。有些 Camel 最终用户只能在使用步骤时下载文件,而其他一些用户只能下载这些文件。
您可以使用 stepwise
选项来控制行为。
请注意,当大多数情况下,只有在用户仅限于主目录以及将主目录报告为 "/"
时,才会更改目录。
这两者之间的区别最好在示例中演示。假设我们需要在远程 FTP 服务器上有以下目录结构,我们需要遍历并下载文件:
/ /one /one/two /one/two/sub-a /one/two/sub-b
我们在每个子 A (a.txt)和 sub-b (b.txt)文件夹中都有一个文件。
25.14. 使用 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 的目录结构。
25.15. 使用 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 操作。
25.16. Samples
在以下示例中,我们设置 Camel 以每小时(60 分钟)从 FTP 服务器下载所有报告作为 BINARY 内容,并将它存储为本地文件系统中的文件。
和使用 XML DSL 的路由:
<route> <from uri="ftp://scott@localhost/public/reports?password=tiger&binary=true&delay=60000"/> <to uri="file://target/test-reports"/> </route>
25.16.1. 使用远程 FTPS 服务器(指示 SSL)和客户端身份验证
from("ftps://admin@localhost:2222/public/camel?password=admin&securityProtocol=SSL&implicit=true &ftpClient.keyStore.file=./src/test/resources/server.jks &ftpClient.keyStore.password=password&ftpClient.keyStore.keyPassword=password") .to("bean:foo");
25.16.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");
25.17. 自定义过滤
Camel 支持可插拔过滤策略。此策略使用 Java 中的 org.apache.camel.component.file.GenericFileFilter
中的构建。然后,您可以使用这样的过滤器配置端点,以在处理前跳过某些过滤器。
在示例中,我们构建了自己的过滤器,该过滤器仅接受文件名中以 report 开头的文件。
然后,我们可以使用 filter 属性配置路由,以引用我们在 spring XML 文件中定义的过滤器(使用 spring 表示法):
<!-- 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>
25.18. 使用 ANT 路径匹配程序进行过滤
ANT 路径匹配程序是在 camel-spring jar 中提供的开箱即用的过滤器。因此,如果您使用 Maven,则需要依赖于 camel-spring。
我们利用 Spring 的 AntPathMatcher 进行实际匹配的原因。
文件路径与以下规则匹配:
-
?
匹配一个字符 -
DNAT
匹配零个或多个字符 -
Tailoring
匹配路径中的零个或多个目录
以下示例演示了如何使用它:
25.19. 使用带有 SFTP 的代理
要使用 HTTP 代理连接到远程主机,您可以使用以下方法配置路由:
<!-- define our sorter as a plain spring bean --> <bean id="proxy" class="com.jcraft.jsch.ProxyHTTP"> <constructor-arg value="localhost"/> <constructor-arg value="7777"/> </bean> <route> <from uri="sftp://localhost:9999/root?username=admin&password=admin&proxy=#proxy"/> <to uri="bean:processFile"/> </route>
如果需要,您还可以为代理分配用户名和密码。请参考 com.jcraft.jsch.Proxy
文档来发现所有选项。
25.20. 设置首选 SFTP 验证方法
如果要明确指定 sftp
组件应使用的身份验证方法列表,请使用 preferredAuthentications
选项。例如,如果您希望 Camel 尝试使用私有/公共 SSH 密钥进行身份验证,并在没有公钥可用时回退到用户/密码身份验证,请使用以下路由配置:
from("sftp://localhost:9999/root?username=admin&password=admin&preferredAuthentications=publickey,password"). to("bean:processFile");
25.21. 使用固定名称消耗单个文件
当您想下载单个文件并知道文件名时,您可以使用 fileName=myFileName.txt
告知 Camel 要下载的文件的名称。默认情况下,消费者仍会执行 FTP LIST 命令来执行目录列表,然后根据 fileName
选项过滤这些文件。虽然在这种情况下,可能需要通过设置 useList=false
来关闭目录列表。例如,用于登录到 FTP 服务器的用户帐户可能没有执行 FTP LIST 命令的权限。因此,您可以使用 useList=false
将其关闭,然后提供要下载的文件的固定名称 fileName=myFileName.txt
,然后 FTP 使用者仍然可以下载该文件。如果由于某种原因的文件不存在,则 Camel 默认抛出异常,您可以关闭此异常,并通过设置 ignoreFileNotFoundOrPermissionError=true
来忽略此文件。
例如,要有一个 Camel 路由来提取单个文件,并在使用后将其删除
from("ftp://admin@localhost:21/nolist/?password=admin&stepwise=false&useList=false&ignoreFileNotFoundOrPermissionError=true&fileName=report.txt&delete=true") .to("activemq:queue:report");
请注意,我们使用了上面讨论的所有选项。
您还可以将其用于 ConsumerTemplate
。例如,要下载单个文件(如果存在),并将文件内容作为 String 类型获取:
String data = template.retrieveBodyNoWait("ftp://admin@localhost:21/nolist/?password=admin&stepwise=false&useList=false&ignoreFileNotFoundOrPermissionError=true&fileName=report.txt&delete=true", String.class);
25.22. 调试日志记录
此组件具有日志级别 TRACE,如果您出现问题,这非常有用。
25.23. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 ftp 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-ftp-starter</artifactId> </dependency>
组件支持 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 | 布尔值 |
第 26 章 Google BigQuery
从 Camel 2.20 开始
仅支持生成者。
Google Bigquery 组件通过 link:https://developers.google.com/api-client-library/java/apis/bigquery/v2 [Google Client Services API] 提供对 Cloud BigQuery Infrastructure 的访问。
当前实施不使用 gRPC。
当前实施不支持查询 BigQuery,它只是一个制作者。
将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-google-bigquery</artifactId> <version>3.20.1.redhat-00031</version> <!-- use the same version as your Camel core version --> </dependency>
26.1. 身份验证配置
Google BigQuery 组件身份验证主要用于 GCP 服务帐户。如需更多信息,请参阅 Google Cloud Platform Auth Guide。
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"
26.2. URI 格式
google-bigquery://project-id:datasetId[:tableId]?[options]
26.3. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
26.3.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
26.3.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
26.4. 组件选项
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 | 布尔值 |
26.5. 端点选项
Google BigQuery 端点使用 URI 语法进行配置:
google-bigquery:projectId:datasetId:tableId
使用以下路径和查询参数:
26.5.1. 路径参数(3 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
projectID ( common) | 所需的 Google Cloud Project Id。 | 字符串 | |
datasetId (common) | 所需的 BigQuery Dataset Id。 | 字符串 | |
tableid (common) | BigQuery 表 ID。 | 字符串 |
26.5.2. 查询参数(4 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
ConnectionFactory (producer) | Autowired ConnectionFactory 获取与 Bigquery 服务的连接。如果没有提供默认值,则使用默认值。 | GoogleBigQueryConnectionFactory | |
useAsInsertId (producer) | 用作插入 id 的字段名称。 | 字符串 | |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
serviceAccountKey (security) | 使用 json 格式的服务帐户密钥,将应用程序验证为 google 云平台的服务帐户。 | 字符串 |
26.6. 消息标头
Google BigQuery 组件支持 4 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelGoogleBigQueryTableSuffix (producer) 常数:T ABLE_SUFFIX | 插入数据时使用的表后缀。 | 字符串 | |
CamelGoogleBigQueryTableId (producer) 常数:T ABLE_ID | 表 ID,数据将被提交。如果指定将覆盖端点配置。 | 字符串 | |
CamelGoogleBigQueryInsertId (producer) 常量: INSERT_ID | 插入数据时要使用的 InsertId。 | 字符串 | |
CamelGoogleBigQueryPartitionDecorator (producer) | 分区 decorator 来指示插入数据时要使用的分区。 | 字符串 |
26.7. 制作者端点
生产者端点可以接受并交付对 个人,并分组交换。组交换设置了 Exchange.GROUPED_EXCHANGE
属性集。
Google BigQuery producer 将在单个 api 调用中发送一个分组交换,除非指定了不同的表后缀或分区修饰符,这样可将其中断,以确保数据使用正确的后缀或分区 decorator 编写。
Google BigQuery 端点预期有效负载是映射或映射列表。包含映射的有效负载将插入一行,包含映射列表的有效负载将在列表中为每个条目插入一行。
26.8. 模板表
模板表可以使用 GoogleBigQueryConstants.TABLE_SUFFIX
标头来指定。例如,以下路由将创建表并插入每天分片的记录:
from("direct:start") .header(GoogleBigQueryConstants.TABLE_SUFFIX, "_${date:now:yyyyMMdd}") .to("google-bigquery:sampleDataset:sampleTable")
建议您将此分区用于这个用例。
有关模板表的更多信息,请参阅 模板表。
26.9. 分区
在创建表时指定分区,如果设置的数据将自动分区到单独的表中。在插入数据时,可通过设置交换上的 GoogleBigQueryConstants.PARTITION_DECORATOR
标头来指定特定分区。
有关分区的更多信息,请参阅创建分区表。
26.10. 确保数据一致性
可以在带有标头 GoogleBigQueryConstants.INSERT_ID
的交换上设置插入 id,或者指定查询参数 useAsInsertId
。因为插入 id 需要每行指定,当有效负载是一个列表时,将不会使用插入的交换标头。如果有效负载是一个列表,则将忽略 GoogleBigQueryConstants.INSERT_ID
。在这种情况下,使用查询参数 useAsInsertId
。
如需更多信息,请参阅 数据一致性
26.11. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 google-bigquery 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-google-bigquery-starter</artifactId> </dependency>
组件支持 11 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.google-bigquery-sql.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.google-bigquery-sql.connection-factory | ConnectionFactory 获取与 Bladequery 服务的连接。如果没有提供默认值,则使用默认值。选项是一个 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 获取与 Bladequery 服务的连接。如果没有提供默认值,则使用默认值。选项是一个 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。 | 字符串 |
第 27 章 Google Pubsub
从 Camel 2.19 开始
支持生成者和消费者。
Google Pubsub 组件通过 Google Cloud Java Client for Google Cloud Pub/Sub 提供对 Cloud Pub/Sub Infrastructure 的访问。
将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-google-pubsub</artifactId> <version>3.20.1.redhat-00031</version> <!-- use the same version as your Camel core version --> </dependency>
27.1. URI 格式
Google Pubsub 组件使用以下 URI 格式:
google-pubsub://project-id:destinationName?[options]
目的地名称可以是主题或订阅名称。
27.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
27.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
27.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
27.3. 组件选项
Google Pubsub 组件支持 10 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
Authentication (common) | 与 PubSub 服务交互时使用凭证(在使用仿真器时不需要身份验证)。 | true | 布尔值 |
endpoint (common) | 用于本地 Pub/Sub 模拟器的端点。 | 字符串 | |
serviceAccountKey (common) | Service account key,可用作 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 |
27.4. 端点选项
Google Pubsub 端点使用 URI 语法进行配置:
google-pubsub:projectId:destinationName
使用以下路径和查询参数:
27.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
projectID ( common) | 需要 Google Cloud PubSub Project Id。 | 字符串 | |
destinationName (common) | 必需 目的地名称。对于消费者,这是订阅名称,而对于生成者而言,这是主题名称。 | 字符串 |
27.4.2. 查询参数(15 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
Authentication (common) | 与 PubSub 服务交互时使用凭证(在使用仿真器时不需要身份验证)。 | true | 布尔值 |
loggerId (common) | 与父路由匹配的日志记录器 ID。 | 字符串 | |
serviceAccountKey (common) | Service account key,可用作 PubSub publisher/subscriber 的凭证。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
ackMode (consumer) | AUTO = 交换在完成后被 ack'ed/nack'ed。NONE = 下游进程必须明确 ack/nack。 Enum 值:
| AUTO | AckMode |
concurrentConsumers (consumer) | 来自订阅的并行流数量。 | 1 | 整数 |
maxAckExtensionPeriod (consumer) | 设置消息 ack deadline 将扩展的最大周期。值(以秒为单位)。 | 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 端点。使用消息排序时需要,并确保即使使用多个发布者,也会按顺序接收消息。 | 字符串 | |
serializer (producer (advanced)) | Autowired A 自定义 GooglePubsubSerializer,用于在制作者中序列化消息有效负载。 | GooglePubsubSerializer |
27.5. 消息标头
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 | 如果非空,请识别应遵守发布订购的相关消息。 | 字符串 |
27.6. 制作者端点
制作者端点可以接受并传送到 PubSub 个人并分组交换。组交换设置了 Exchange.GROUPED_EXCHANGE
属性集。
Google PubSub 期望有效负载为 byte[] 数组,Producer 端点将发送:
- 字符串正文作为 byte[] 编码,格式为 UTF-8
- byte[] body,如下所示
- 其他所有内容将序列化为 byte[] 数组
将 Map 设置为消息标头 GooglePubsubConstants.ATTRIBUTES
将作为 PubSub 属性发送。
Google PubSub 支持排序消息发送。
要启用此设置,将选项 messageOrderingEnabled 设置为 true,并将 pubsubEndpoint 设置为 GCP 区域。
生成消息时,设置消息标头 GooglePubsubConstants.ORDERING_KEY
。这将设置为消息的 PubSub sortKey。
有关 订购消息 的更多信息。
交换传送到 PubSub 后,PubSub 消息 ID 将分配给标头 GooglePubsubConstants.MESSAGE_ID
。
27.7. 消费者端点
如果在订阅上的配置选项内未确认,Google PubSub 将重新发送消息。
在交换处理完成后,组件将确认消息。
如果路由抛出异常,则交换将标记为失败,组件将 NACK 消息 - 它将立即重新连接。
要对消息进行 ack/nack 操作,组件使用 Acknowledgement ID 作为标头 GooglePubsubConstants.ACK_ID
。如果删除了或篡改了标头,ack 将失败,并在 ack 截止时间后再次通知消息。
27.8. 消息正文
消费者端点将消息的内容返回为 byte[] - 与底层系统发送一样。它是转换/退出所有内容的路由。
27.9. 身份验证配置
默认情况下,此组件使用 GoogleCredentials.getApplicationDefault ()
获取凭证。通过将 authentication 选项设置为 false
来禁用此行为,在这种情况下,将在没有身份验证详情的情况下对 Google API 的请求进行。这只在针对模拟器开发时才需要。可以通过提供服务帐户密钥文件的路径来更改此行为。
27.10. 回滚和重新发送
Google PubSub 的回滚取决于 Acknowledgement Deadline 的概念 - Google PubSub 希望接收确认的时间周期。如果未收到确认,则会通知消息。
Google 提供了一个 API 来扩展消息的截止时间。
因此,回滚实际上是一个带有零值的截止扩展 API 调用 - i.e. 期限现在就达到,消息可以恢复到下一个消费者。
通过将消息标头 GooglePubsubConstants.ACK_DEADLINE 设置为值(以秒为单位),可以将消息标头 GooglePubsubConstants.ACK_DEADLINE
设置为值来延迟消息重新发送。
27.11. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 google-pubsub 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-google-pubsub-starter</artifactId> </dependency>
组件支持 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 | Service account key,可用作 PubSub publisher/subscriber 的凭证。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
camel.component.google-pubsub.synchronous-pull-retryable-codes | 用于同步拉取的额外可重试错误代码列表。默认情况下,PubSub 客户端库重试 ABORTED、UNAVAILABLE、UNKNOWN。 | 字符串 |
第 28 章 HTTP
仅支持生成者
HTTP 组件提供基于 HTTP 的端点,用于调用外部 HTTP 资源(作为客户端使用 HTTP 调用外部服务器)。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-http</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
28.1. URI 格式
http:hostname[:port][/resourceUri][?options]
将默认使用端口 80 作为 HTTP,443 用于 HTTPS。
28.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
28.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
28.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
28.3. 组件选项
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 交换标头将根据复制策略复制到 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) | 连接实时的时间(时间单位为毫秒),默认值始终保持处于活动状态。 | 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 的代理身份验证域(工作站名称)。 | 字符串 | |
proxyAuthPassword (proxy) | 代理身份验证密码。 | 字符串 | |
proxyAuthPort (proxy) | 代理身份验证端口。 | 整数 | |
proxyAuthUsername (proxy) | 代理身份验证用户名。 | 字符串 | |
sslContextParameters (security) | 使用 SSLContext 参数配置安全性:重要: 每个 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 |
28.4. 端点选项
HTTP 端点使用 URI 语法进行配置:
http://httpUri
使用以下路径和查询参数:
28.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
httpUri (common) | 需要 要调用的 HTTP 端点的 url。 | URI |
28.4.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 管理,这个选项也会禁用。 | true | 布尔值 |
connectionClose (producer) | 指定是否必须将 Connection Close 标头添加到 HTTP 请求中。默认情况下,connectionClose 为 false。 | false | 布尔值 |
copyHeaders (producer) | 如果此选项为 true,则 IN 交换标头将根据复制策略复制到 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 标头设置为当前交换主机标头中包含的值,在您希望下游服务器接收的 Host 标头来反映上游客户端调用的 URL,这将允许使用 Host 标头为代理服务生成准确的 URL。 | false | 布尔值 |
throwExceptionOnFailure (producer) | 在从远程服务器的响应失败时禁用抛出 HttpOperationFailedException 的选项。这样,无论 HTTP 状态代码是什么,您都可以获得所有响应。 | true | 布尔值 |
transferException (producer) | 如果在消费者端启用和交换失败的处理,如果原因的例外在响应中以 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 存储也会强制成为 noop cookie 存储,因为 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) | 使用映射中的键/值来配置 HttpClient: | Map | |
httpContext (advanced) | 使用自定义 HttpContext 实例。 | HttpContext | |
maxTotalConnections (advanced) | 连接的最大数量。 | 200 | int |
useSystemProperties (advanced) | 使用系统属性作为配置的回退。 | false | 布尔值 |
proxyAuthDomain (proxy) | 用于 NTML 的代理身份验证域。 | 字符串 | |
proxyAuthHost (proxy) | 代理身份验证主机。 | 字符串 | |
proxyAuthMethod (proxy) | 要使用的代理验证方法。 Enum 值:
| 字符串 | |
proxyAuthNtHost (proxy) | 用于 NTML 的代理身份验证域(工作站名称)。 | 字符串 | |
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) | 使用 SSLContext 参数配置安全性:重要: 每个 HttpComponent 仅支持一个 org.apache.camel.util.jsse.SSLContextParameters 的实例。如果您需要使用 2 个或更多不同的实例,则需要定义您需要的每个实例的新 HttpComponent。 | SSLContextParameters | |
x509HostnameVerifier (security) | 使用自定义 X509HostnameVerifier,如 DefaultHostnameVerifier 或 NoopHostnameVerifier。 | HostnameVerifier |
28.5. 消息标头
Name | 类型 | 描述 |
---|---|---|
|
| 要调用的 URI。将覆盖直接在端点上设置的现有 URI。此 uri 是要调用的 http 服务器的 uri。它与 Camel 端点 uri 不同,您可以在其中配置端点选项,如安全性等。此标头不支持,它只支持 http 服务器的 uri。 |
|
| 请求 URI 路径,标头将使用 HTTP_URI 构建请求 URI。 |
|
| URI 参数。将覆盖直接在端点上设置的现有 URI 参数。 |
|
| 来自外部服务器的 HTTP 响应代码。对于 OK,为 200。 |
|
| 来自外部服务器的 HTTP 响应文本。 |
|
| 字符编码。 |
|
|
HTTP 内容类型。在 IN 和 OUT 消息上设置,以提供内容类型,如 |
|
|
HTTP 内容编码。在 IN 和 OUT 消息上设置,以提供内容编码,如 |
28.6. 消息正文
Camel 将从外部服务器的 HTTP 响应存储在 OUT 正文上。IN 消息中的所有标头都会被复制到 OUT 消息,因此在路由过程中保留标头。此外,Camel 会将 HTTP 响应标头和 OUT 消息标头添加到 OUT 消息标头中。
28.7. 使用系统属性
当将 useSystemProperties 设置为 true 时,HTTP 客户端将查找以下系统属性,它将使用它:
- ssl.TrustManagerFactory.algorithm
- javax.net.ssl.trustStoreType
- javax.net.ssl.trustStore
- javax.net.ssl.trustStoreProvider
- javax.net.ssl.trustStorePassword
- java.home
- ssl.KeyManagerFactory.algorithm
- javax.net.ssl.keyStoreType
- javax.net.ssl.keyStore
- javax.net.ssl.keyStoreProvider
- javax.net.ssl.keyStorePassword
- http.proxyHost
- http.proxyPort
- http.nonProxyHosts
- http.keepAlive
- http.maxConnections
28.8. 响应代码
Camel 将根据 HTTP 响应代码进行处理:
- 响应代码位于 100..299 之间,Camel 会将它视为成功响应。
-
响应代码位于 300..399 之间,Camel 会将它视为重定向响应,并将抛出带有信息的
HttpOperationFailedException
。 -
响应代码为 400+,Camel 会将它视为外部服务器故障,并将抛出一个带有信息的
HttpOperationFailedException
。
throwExceptionOnFailure 选项 throwExceptionOnFailure
可以设置为 false
,以防止 HttpOperationFailedException
抛出失败响应代码。这可让您从远程服务器获取任何响应。
下面是一个示例。
28.9. 例外
HttpOperationFailedException
异常包含以下信息:
- HTTP 状态代码
- HTTP 状态行(状态代码的文本)
- 重定向位置,如果服务器返回重定向
-
如果服务器提供正文作为响应,则以
java.lang.String
形式响应正文
28.10. 使用哪个 HTTP 方法
以下算法用于决定应使用什么 HTTP 方法:
1。使用作为端点配置提供的方法(httpMethod
)。
2.使用标头中提供的方法(Exchange.HTTP_METHOD
)。
3.GET
如果标头中提供了查询字符串。
4.如果端点配置了查询字符串,则 GET
。
5.如果有
要发送的数据(任何人不是 null
)。
6.否则,GET
。
28.11. 如何访问 HttpServletRequest 和 HttpServletResponse
您可以使用 Camel 类型转换器系统访问这两个
HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class); HttpServletResponse response = exchange.getIn().getBody(HttpServletResponse.class);
您可以在 camel-jetty 或 camel-cxf 端点后从处理器获取请求和响应。
28.12. 配置 URI 来调用
您可以直接组成端点 URI 设置 HTTP producer 的 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
的消息标头。
28.13. 配置 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");
28.14. 如何将 http 方法(GET/PATCH/POST/PUT/DELETE/HEAD/OPTIONS/TRACE)设置为 HTTP 生成者
HTTP 组件提供了一种通过设置消息标头来设置 HTTP 请求方法的方法。下面是一个示例:
from("direct:start") .setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http.HttpMethods.POST)) .to("http://www.google.com") .to("mock:results");
使用字符串常量可以编写方法稍短:
.setHeader("CamelHttpMethod", constant("POST"))
以及等效的 Spring 示例:
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="direct:start"/> <setHeader name="CamelHttpMethod"> <constant>POST</constant> </setHeader> <to uri="http://www.google.com"/> <to uri="mock:results"/> </route> </camelContext>
28.15. 使用客户端超时 - SO_TIMEOUT
请参阅 HttpSOTimeoutTest 单元测试。
28.16. 配置代理
HTTP 组件提供了一种配置代理的方法。
from("direct:start") .to("http://oldhost?proxyAuthHost=www.myproxy.com&proxyAuthPort=80");
还支持通过 proxyAuthUsername
和 proxyAuthPassword
选项进行代理身份验证。
28.16.1. 使用 URI 之外的代理设置
为避免系统属性冲突,您只能从 CamelContext 或 URI 设置代理配置。
Java DSL :
context.getGlobalOptions().put("http.proxyHost", "172.168.18.9"); context.getGlobalOptions().put("http.proxyPort", "8080");
Spring XML
<camelContext> <properties> <property key="http.proxyHost" value="172.168.18.9"/> <property key="http.proxyPort" value="8080"/> </properties> </camelContext>
Camel 首先从 Java System 或 CamelContext 属性设置设置,然后设置端点代理选项(如果提供)。
因此,您可以使用端点选项覆盖系统属性。
另外,您还可以设置 http.proxyScheme
属性来明确配置要使用的方案。
28.17. 配置 charset
如果使用 POST
发送数据,您可以使用 Exchange
属性配置 charset
:
exchange.setProperty(Exchange.CHARSET_NAME, "ISO-8859-1");
28.17.1. 带有调度的轮询示例
这个示例每 10 秒轮询 Google 主页,并将页面写入文件 message.html
:
from("timer://foo?fixedRate=true&delay=0&period=10000") .to("http://www.google.com") .setHeader(FileComponent.HEADER_FILE_NAME, "message.html") .to("file:target/google");
28.17.2. 来自端点 URI 的 URI 参数
在本例中,我们有完整的 URI 端点,它只是您在 Web 浏览器中输入的内容。可以使用 &
作为分隔符设置多个 URI 参数,就像您在 Web 浏览器中一样。Camel 不会在此处造成混淆。
// we query for Camel at the Google page template.sendBody("http://www.google.com/search?q=Camel", null);
28.17.3. 来自消息的 URI 参数
Map headers = new HashMap(); headers.put(Exchange.HTTP_QUERY, "q=Camel&lr=lang_en"); // we query for Camel and English language at Google template.sendBody("http://www.google.com/search", null, headers);
在上面的标头值中,它不应 带有前缀 ?, 您可以像
&
amp; char 一样分隔参数。
28.17.4. 获取响应代码
您可以通过使用 Exchange.HTTP_RESPONSE_CODE
从 Out 消息标头中获取 HTTP 响应代码。
Exchange exchange = template.send("http://www.google.com/search", new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(Exchange.HTTP_QUERY, constant("hl=en&q=activemq")); } }); Message out = exchange.getOut(); int responseCode = out.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
28.18. 禁用 Cookie
要禁用 Cookie,您可以通过添加此 URI 选项:httpClient.cookieSpec=ignoreCookies
来设置 HTTP 客户端来忽略 Cookie
28.19. 带有流消息正文的基本身份验证
为了避免 NonRepeatableRequestException
,您需要通过添加选项:authenticationPreemptive=true
来进行 Preemptive Basic Authentication
28.20. 高级用法
如果您需要对 HTTP 生成者进行更多控制,您应该使用 HttpComponent
,您可以在其中设置各种类来为您提供自定义行为。
28.20.1. 为 HTTP 客户端设置 SSL
使用 JSSE 配置工具
HTTP 组件通过 Camel JSSE 配置实用程序支持 SSL/TLS 配置。这个工具可显著减少您需要编写的组件特定代码数量,并在端点和组件级别进行配置。以下示例演示了如何将实用程序与 HTTP 组件一起使用。
组件的编程配置
KeyStoreParameters ksp = new KeyStoreParameters(); ksp.setResource("/users/home/server/keystore.jks"); ksp.setPassword("keystorePassword"); KeyManagersParameters kmp = new KeyManagersParameters(); kmp.setKeyStore(ksp); kmp.setKeyPassword("keyPassword"); SSLContextParameters scp = new SSLContextParameters(); scp.setKeyManagers(kmp); HttpComponent httpComponent = getContext().getComponent("https", HttpComponent.class); httpComponent.setSslContextParameters(scp);
基于 Spring DSL 的端点配置
<camel:sslContextParameters id="sslContextParameters"> <camel:keyManagers keyPassword="keyPassword"> <camel:keyStore resource="/users/home/server/keystore.jks" password="keystorePassword"/> </camel:keyManagers> </camel:sslContextParameters> <to uri="https://127.0.0.1/mail/?sslContextParameters=#sslContextParameters"/>
直接配置 Apache HTTP 客户端
基本上 camel-http 组件基于 Apache HttpClient 构建。详情请参阅 SSL/TLS 自定义,或查看 org.apache.camel.component.http.HttpsServerTestSupport
单元测试基本类。
您还可以实施自定义 org.apache.camel.component.http.HttpClientConfigurer
,以便在需要完全控制 http 客户端上进行一些配置。
但是,如果您只想 指定密钥存储和信任存储,您可以使用 Apache HTTP HttpClientConfigurer
来执行此操作,例如:
KeyStore keystore = ...; KeyStore truststore = ...; SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("https", 443, new SSLSocketFactory(keystore, "mypassword", truststore)));
然后,您需要创建一个实施 HttpClientConfigurer
的类,并注册前一个密钥存储或信任存储的 https 协议。然后,从 camel 路由构建器类进行 hook:
HttpComponent httpComponent = getContext().getComponent("http", HttpComponent.class); httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());
如果使用 Spring DSL 进行此操作,您可以使用 URI 指定 HttpClientConfigurer
。例如:
<bean id="myHttpClientConfigurer" class="my.https.HttpClientConfigurer"> </bean> <to uri="https://myhostname.com:443/myURL?httpClientConfigurer=myHttpClientConfigurer"/>
只要您实施 HttpClientConfigurer,并配置密钥存储和信任存储,它将可以正常工作。
使用 HTTPS 验证 getchas
最终用户报告他在使用 HTTPS 进行身份验证时存在问题。最终,通过提供自定义配置的 org.apache.http.protocol.HttpContext
来解决这个问题:
- 1.为 HttpContexts 创建(Spring)工厂:
public class HttpContextFactory { private String httpHost = "localhost"; private String httpPort = 9001; private BasicHttpContext httpContext = new BasicHttpContext(); private BasicAuthCache authCache = new BasicAuthCache(); private BasicScheme basicAuth = new BasicScheme(); public HttpContext getObject() { authCache.put(new HttpHost(httpHost, httpPort), basicAuth); httpContext.setAttribute(ClientContext.AUTH_CACHE, authCache); return httpContext; } // getter and setter }
- 2.在 Spring 应用程序上下文文件中声明 HttpContext:
<bean id="myHttpContext" factory-bean="httpContextFactory" factory-method="getObject"/>
- 3.引用 http URL 中的上下文:
<to uri="https://myhostname.com:443/myURL?httpContext=myHttpContext"/>
使用不同的 SSLContext 参数
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>
28.21. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 http 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-http-starter</artifactId> </dependency>
组件支持 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 | 连接实时的时间(时间单位为毫秒),默认值始终保持处于活动状态。 | 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 交换标头将根据复制策略复制到 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 的代理身份验证域(工作站名称)。 | 字符串 | |
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 | 使用 SSLContext 参数配置安全性:重要: 每个 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 |
第 29 章 Infinispan
支持生成者和消费者
此组件允许您使用 Hot Rod procol 与 Infinispan 分布式数据平面/缓存交互。Infinispan 是一个高度可扩展的、高度可用的键/值数据存储和使用 Java 编写的数据网格平台。
如果使用 Maven,您必须在 pom.xml
中添加以下依赖项:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-infinispan</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
29.1. URI 格式
infinispan://cacheName?[options]
制作者允许使用 HotRod 协议向远程缓存发送消息。消费者允许使用 HotRod 协议从远程缓存中侦听事件。
29.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
29.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
29.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
29.3. 组件选项
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) | 指定要由 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) | 定义 SASL 机制来访问 infinispan 实例。 | 字符串 | |
SecurityRealm ( security) | 定义访问 infinispan 实例的安全域。 | 字符串 | |
securityServerName (security) | 定义用于访问 infinispan 实例的安全服务器名称。 | 字符串 | |
用户名 (安全) | 定义用于访问 infinispan 实例的用户名。 | 字符串 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
cacheContainer (advanced) | Autowired 指定要连接的缓存容器。 | RemoteCacheManager | |
cacheContainerConfiguration (advanced) | Autowired CacheContainer 配置。如果没有定义 cacheContainer,则使用。 | Configuration | |
configurationProperties (advanced) | 为 CacheManager 实施特定属性。 | Map | |
ConfigurationUri (advanced) | CacheManager 的实施特定 URI。 | 字符串 | |
标记 (advanced) | 默认情况下,在每个缓存调用时应用以逗号分隔的 org.infinispan.client.hotrod.Flag 列表。 | 字符串 | |
remappingFunction (advanced) | 设置要在计算操作中使用的特定 remappingFunction。 | BiFunction | |
resultHeader (advanced) | 将操作结果存储在标头而不是消息正文中。默认情况下,结果 == null,查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值将用作存储查询结果的标头名称,并保留原始消息正文。这个值可以被名为:CamelInfinispanOperationResultHeader 的消息标头覆盖。 | 字符串 |
29.4. 端点选项
Infinispan 端点使用 URI 语法进行配置:
infinispan:cacheName
使用以下路径和查询参数:
29.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
cacheName (common) | 必需使用的缓存的名称。使用 current 来使用当前配置的缓存管理器中的现有缓存名称。或者,将 default 用于默认缓存管理器名称。 | 字符串 |
29.4.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) | 指定要由 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) | 定义 SASL 机制来访问 infinispan 实例。 | 字符串 | |
SecurityRealm ( security) | 定义访问 infinispan 实例的安全域。 | 字符串 | |
securityServerName (security) | 定义用于访问 infinispan 实例的安全服务器名称。 | 字符串 | |
用户名 (安全) | 定义用于访问 infinispan 实例的用户名。 | 字符串 | |
cacheContainer (advanced) | Autowired 指定要连接的缓存容器。 | RemoteCacheManager | |
cacheContainerConfiguration (advanced) | Autowired CacheContainer 配置。如果没有定义 cacheContainer,则使用。 | Configuration | |
configurationProperties (advanced) | 为 CacheManager 实施特定属性。 | Map | |
ConfigurationUri (advanced) | CacheManager 的实施特定 URI。 | 字符串 | |
标记 (advanced) | 默认情况下,在每个缓存调用时应用以逗号分隔的 org.infinispan.client.hotrod.Flag 列表。 | 字符串 | |
remappingFunction (advanced) | 设置要在计算操作中使用的特定 remappingFunction。 | BiFunction | |
resultHeader (advanced) | 将操作结果存储在标头而不是消息正文中。默认情况下,结果 == null,查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值将用作存储查询结果的标头名称,并保留原始消息正文。这个值可以被名为:CamelInfinispanOperationResultHeader 的消息标头覆盖。 | 字符串 |
29.5. 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
写入方法,如 put (key, value)和 remove (key)默认不会返回之前的值。
29.6. 消息标头
Name | 默认值 | 类型 | Context | 描述 |
---|---|---|---|---|
CamelInfinispanCacheName |
| 字符串 | 共享 | 参与操作或事件的缓存。 |
CamelInfinispanOperation |
| InfinispanOperation | 制作者 | 要执行的操作。 |
CamelInfinispanMap |
| Map | 制作者 | CamelInfinispanOperationPutAll 操作时要使用的 Map |
CamelInfinispanKey |
| 对象 | 共享 | 执行操作的密钥或生成事件的密钥。 |
CamelInfinispanValue |
| 对象 | 制作者 | 用于操作的值。 |
CamelInfinispanEventType |
| 字符串 | 消费者 | 接收的事件的类型。 |
CamelInfinispanLifespanTime |
| long | 制作者 | 缓存内某个值的 Lifespan 时间。负值解释为 infinity。 |
CamelInfinispanTimeUnit |
| 字符串 | 制作者 | 条目生命周期的时间范围。 |
CamelInfinispanMaxIdleTime |
| long | 制作者 | 在将条目被视为过期前允许闲置的最长时间。 |
CamelInfinispanMaxIdleTimeUnit |
| 字符串 | 制作者 | 条目 Max Idle Time 的时间单位。 |
CamelInfinispanQueryBuilder | null | InfinispanQueryBuilder | 制作者 | 用于 QUERY 命令的 QueryBuilde,如果没有显示命令默认为 InifinispanConfiguration's。 |
CamelInfinispanOperationResultHeader | null | 字符串 | 制作者 | 将操作结果存储在标头而不是消息正文中 |
29.7. 例子
将键/值放入命名缓存中:
from("direct:start") .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUT) (1) .setHeader(InfinispanConstants.KEY).constant("123") (2) .to("infinispan:myCacheName&cacheContainer=#cacheContainer"); (3)
其中,
- 1 - 设置要执行的操作
- 2 - 设置用于识别缓存中元素的键
3 - 使用 registry 中配置的 cache manager
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 - 为生命周期设置时间单位
查询
from("direct:start") .setHeader(InfinispanConstants.OPERATION, InfinispanConstants.QUERY) .setHeader(InfinispanConstants.QUERY_BUILDER, new InfinispanQueryBuilder() { @Override public Query build(QueryFactory<Query> qf) { return qf.from(User.class).having("name").like("%abc%").build(); } }) .to("infinispan:myCacheName?cacheContainer=#cacheManager") ;
域对象的 .proto 描述符必须注册到远程 Data Grid 服务器,请参阅官方 Infinispan 文档中的 Remote Query 示例。
自定义 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
中找到。
29.8. 使用基于 Infinispan 的幂等存储库
在本小节中,我们将使用基于 Infinispan 的幂等存储库。
Java 示例
InfinispanRemoteConfiguration conf = new InfinispanRemoteConfiguration(); (1) conf.setHosts("localhost:1122") InfinispanRemoteIdempotentRepository repo = new InfinispanRemoteIdempotentRepository("idempotent"); (2) repo.setConfiguration(conf); context.addRoutes(new RouteBuilder() { @Override public void configure() { from("direct:start") .idempotentConsumer(header("MessageID"), repo) (3) .to("mock:result"); } });
其中,
- 1 - 配置缓存
- 2 - 配置存储库 Bean
- 3 - 将存储库设置为路由
XML 示例
<bean id="infinispanRepo" class="org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository" destroy-method="stop"> <constructor-arg value="idempotent"/> (1) <property name="configuration"> (2) <bean class="org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration"> <property name="hosts" value="localhost:11222"/> </bean> </property> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:start" /> <idempotentConsumer messageIdRepositoryRef="infinispanRepo"> (3) <header>MessageID</header> <to uri="mock:result" /> </idempotentConsumer> </route> </camelContext>
其中,
- 1 - 设置仓库要使用的缓存名称
- 2 - 配置存储库 Bean
- 3 - 将存储库设置为路由
29.9. 使用基于 Infinispan 的聚合存储库
在本小节中,我们将使用基于 Infinispan 的聚合存储库。
Java 示例
InfinispanRemoteConfiguration conf = new InfinispanRemoteConfiguration(); (1) conf.setHosts("localhost:1122") InfinispanRemoteAggregationRepository repo = new InfinispanRemoteAggregationRepository(); (2) repo.setCacheName("aggregation"); repo.setConfiguration(conf); context.addRoutes(new RouteBuilder() { @Override public void configure() { from("direct:start") .aggregate(header("MessageID")) .completionSize(3) .aggregationRepository(repo) (3) .aggregationStrategyRef("myStrategy") .to("mock:result"); } });
其中,
- 1 - 配置缓存
- 2 - 创建存储库 Bean
- 3 - 将存储库设置为路由
XML 示例
<bean id="infinispanRepo" class="org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository" destroy-method="stop"> <constructor-arg value="aggregation"/> (1) <property name="configuration"> (2) <bean class="org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration"> <property name="hosts" value="localhost:11222"/> </bean> </property> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:start" /> <aggregate strategyRef="myStrategy" completionSize="3" aggregationRepositoryRef="infinispanRepo"> (3) <correlationExpression> <header>MessageID</header> </correlationExpression> <to uri="mock:result"/> </aggregate> </route> </camelContext>
其中,
- 1 - 设置仓库要使用的缓存名称
- 2 - 配置存储库 Bean
- 3 - 将存储库设置为路由
随着 Infinispan 11 的发布,需要在创建的任何缓存上设置编码配置。这对于消耗事件也至关重要。如需更多信息,请参阅官方 Infinispan 文档中的 Data Encoding 和 MediaTypes。
29.10. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 infinispan 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-infinispan-starter</artifactId> </dependency>
组件支持 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 类型。 | Configuration | |
camel.component.infinispan.configuration | 组件配置.选项是 org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration 类型。 | InfinispanRemoteConfiguration | |
camel.component.infinispan.configuration-properties | 为 CacheManager 实施特定属性。 | Map | |
camel.component.infinispan.configuration-uri | CacheManager 的实施特定 URI。 | 字符串 | |
camel.component.infinispan.custom-listener | 如果提供,返回使用中的自定义监听程序。选项是 org.apache.camel.component.infinispan.remote.InfinispanRemoteCustomListener 类型。 | InfinispanRemoteCustomListener | |
camel.component.infinispan.enabled | 是否启用 infinispan 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.infinispan.event-types | 指定要由 consumer.Multiple 事件注册的事件类型集合,可以使用逗号分隔。可能的事件类型有:CLIENT_CACHE_ENTRY_CREATED, CLIENT_CACHE_ENTRY_MODIFIED, CLIENT_CACHE_ENTRY_REMOVED, CLIENT_CACHE_ENTRY_EXPIRED, CLIENT_CACHE_FAILOVER。 | 字符串 | |
camel.component.infinispan.flags | 默认情况下,在每个缓存调用时应用以逗号分隔的 org.infinispan.client.hotrod.Flag 列表。 | 字符串 | |
camel.component.infinispan.hosts | 指定 Infinispan 实例上缓存的主机。 | 字符串 | |
camel.component.infinispan.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 | 将操作结果存储在标头而不是消息正文中。默认情况下,结果 == null,查询结果存储在消息正文中,消息正文中的任何现有内容都会被丢弃。如果设置了 resultHeader,则该值将用作存储查询结果的标头名称,并保留原始消息正文。这个值可以被名为:CamelInfinispanOperationResultHeader 的消息标头覆盖。 | 字符串 | |
camel.component.infinispan.sasl-mechanism | 定义 SASL 机制来访问 infinispan 实例。 | 字符串 | |
camel.component.infinispan.secure | 定义我们是否连接到安全的 Infinispan 实例。 | false | 布尔值 |
camel.component.infinispan.security-realm | 定义访问 infinispan 实例的安全域。 | 字符串 | |
camel.component.infinispan.security-server-name | 定义用于访问 infinispan 实例的安全服务器名称。 | 字符串 | |
camel.component.infinispan.username | 定义用于访问 infinispan 实例的用户名。 | 字符串 |
第 30 章 Jira
支持生成者和消费者
JIRA 组件通过封装 Atlassian 的 REST Java Client for JIRA 来与 JIRA API 交互。它目前为新的问题和新评论提供轮询。它还能够创建新问题、添加评论、更改问题、添加/删除监视者、添加附加并转换问题的状态。
此端点依赖于简单的轮询,而不是 webhook。原因包括:
- 可靠性/稳定问题
- 我们轮询的有效负载类型通常并不大(另外,API 中提供了分页)
- 需要支持在 Webhook 失败时无法公开访问的应用程序
请注意,JIRA API 非常频繁地加快。因此,此组件可轻松扩展以提供额外的交互。
Maven 用户需要将以下依赖项添加到其 pom.xml 中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jira</artifactId> <version>${camel-version}</version> </dependency>
30.1. URI 格式
jira://type[?options]
JIRA 类型接受以下操作:
对于消费者:
- newIssues:仅检索路由启动后的新问题
- newComments:仅检索路由启动后的新注释
- watchUpdates :仅根据提供的 jql 检索更新的字段/发布
对于制作者:
- addIssue:添加一个问题
- addComment:在给定问题中添加注释
- attach :在给定问题中添加附加
- deleteIssue:删除给定的问题
- updateIssue: 更新给定问题的字段
- ConvertIssue:转换给定问题的状态
- watchers:给定问题的添加/删除监视者
因为 JIRA 完全自定义,您必须确保项目和工作流存在字段 ID,因为它们可以在不同的 JIRA 服务器之间有所变化。
30.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
30.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
30.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
30.3. 组件选项
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 | 布尔值 |
配置 (高级) | 使用共享基础 jira 配置。 | JiraConfiguration | |
accessToken (security) | (仅限OAuth)由 JIRA 服务器生成的访问令牌。 | 字符串 | |
consumerKey (security) | (仅限OAuth)来自 JIRA 设置的消费者密钥。 | 字符串 | |
密码 (安全) | (仅限基本身份验证)向 JIRA 服务器进行身份验证的密码。仅在使用用户名基本身份验证时使用。 | 字符串 | |
PrivateKey ( security) | (仅限OAuth)客户端生成的私钥,以加密与服务器的对话。 | 字符串 | |
用户名 (安全) | (仅限基本身份验证)向 JIRA 服务器进行身份验证的用户名。仅在 JIRA 服务器上没有启用 OAuth 时使用。如果同时设置了 username 和 OAuth 令牌参数,则不要设置用户名和 OAuth 令牌参数,则用户名基本身份验证将具有优先权。 | 字符串 | |
ValidationCode (security) | (仅限OAuth)从授权过程的第一个步骤中生成的 JIRA 验证代码。 | 字符串 |
30.4. 端点选项
JIRA 端点使用 URI 语法进行配置:
jira:type
使用以下路径和查询参数:
30.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
type (common) | 需要 执行的操作。消费者:newIssues、NewComments.producers: AddIssue, AttachFile, DeleteIssue, TransitionIssue, UpdateIssue, Watchers.如需更多信息,请参阅本类 javadoc 描述。 Enum 值:
| JiraType |
30.4.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 中的产品密钥。使用 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)来自 JIRA 设置的消费者密钥。 | 字符串 | |
密码 (安全) | (仅限基本身份验证)向 JIRA 服务器进行身份验证的密码。仅在使用用户名基本身份验证时使用。 | 字符串 | |
PrivateKey ( security) | (仅限OAuth)客户端生成的私钥,以加密与服务器的对话。 | 字符串 | |
用户名 (安全) | (仅限基本身份验证)向 JIRA 服务器进行身份验证的用户名。仅在 JIRA 服务器上没有启用 OAuth 时使用。如果同时设置了 username 和 OAuth 令牌参数,则不要设置用户名和 OAuth 令牌参数,则用户名基本身份验证将具有优先权。 | 字符串 | |
ValidationCode (security) | (仅限OAuth)从授权过程的第一个步骤中生成的 JIRA 验证代码。 | 字符串 |
30.5. 客户端工厂
您可以将 JIRARestClientFactory
与 registry 中名为 JIRARestClientFactory 的绑定,使其自动在 JIRA 端点中设置。
30.6. 身份验证
Camel-jira 支持 基本身份验证 和 OAuth 3 委托身份验证。
我们建议尽可能使用 OAuth,因为它为您的用户和系统提供最佳安全性。
30.6.1. 基本身份验证要求:
- 用户名和密码
30.6.2. OAuth 身份验证要求:
按照 JIRA OAuth 文档中的 教程生成客户端私钥、使用者密钥、验证代码和访问令牌。
- 在您的系统上本地生成的私钥。
- 一个验证代码,由 JIRA 服务器生成。
- consumer 键,在 JIRA 服务器设置中设置。
- 由 JIRA 服务器生成的访问令牌。
30.7. JQL
JQL URI 选项都由两个使用者端点使用。理论上,"project key"等项目可以是 URI 选项本身。但是,通过要求使用 JQL,消费者变得更灵活且强大。
至少,消费者需要以下内容:
jira://[type]?[required options]&jql=project=[project key]
需要注意的是 newIssues 消费者将自动将 JQL 设置为:
-
将
ORDER BY 键 desc
附加到 JQL -
prepend
id > latestIssueId
以检索在 camel 路由启动后添加的问题。
这是为了优化启动处理,而不必对项目中的每一 个问题进行索引。
另一个备注是,newComments 消费者也必须索引项目中每个单个问题 和注释。因此,对于大型项目,尽可能优化 JQL 表达式非常重要。例如,JIRA Toolkit 插件在查询中包含一个 "Number of comment" 自定义字段,用于您的查询中的 '"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)"
30.8. 操作
请参阅在使用 JIRA 操作时要设置的所需标头列表。producer 的 author 字段会在 JIRA 端自动设置为经过身份验证的用户。
如果没有设置任何必填字段,则会抛出 IllegalArgumentException。
对于字段需要 id
,如问题类型、优先级、转换。检查 jira 项目上的有效 id
,因为它们可能会在 jira 安装和项目工作流上有所不同。
30.9. AddIssue
必需:
-
ProjectKey
:项目键,例如:CAMEL、HHH、MYP。 -
IssueTypeId
或IssueTypeName
: 问题类型的id
或问题类型的名称,您可以在http://jira_server/rest/api/2/issue/createmeta?projectKeys=SAMPLE_KEY
中看到有效列表。 -
IssueSummary
:问题摘要。
可选:
-
IssueAssignee
:分配用户 -
IssuePriorityId
或IssuePriorityName
:问题的优先级,您可以在http://jira_server/rest/api/2/priority
中看到有效列表。 -
IssueComponents
:带有有效组件名称的字符串列表。 -
IssueWatchersAdd
:带有要添加到 watcher 列表中的用户名的字符串列表。 -
IssueDescription
:问题的描述。
30.10. AddComment
必需:
-
IssueKey
:问题密钥标识符。 - 交换的正文是描述。
30.11. attach
每个调用只能有一个文件。
必需:
-
IssueKey
:问题密钥标识符。 -
交换的正文应该是
文件类型
30.12. DeleteIssue
必需:
-
IssueKey
:问题密钥标识符。
30.13. TransitionIssue
必需:
-
IssueKey
:问题密钥标识符。 -
IssueTransitionId
:问题转换id
。 - 交换的正文是描述。
30.14. UpdateIssue
-
IssueKey
:问题密钥标识符。 -
IssueTypeId
或IssueTypeName
: 问题类型的id
或问题类型的名称,您可以在http://jira_server/rest/api/2/issue/createmeta?projectKeys=SAMPLE_KEY
中看到有效列表。 -
IssueSummary
:问题摘要。 -
IssueAssignee
:分配用户 -
IssuePriorityId
或IssuePriorityName
:问题的优先级,您可以在http://jira_server/rest/api/2/priority
中看到有效列表。 -
IssueComponents
:带有有效组件名称的字符串列表。 -
IssueDescription
:问题的描述。
30.15. watcher
-
IssueKey
:问题密钥标识符。 -
IssueWatchersAdd
:带有要添加到 watcher 列表中的用户名的字符串列表。 -
IssueWatchersRemove
:带有要从观察列表中删除的用户名的字符串列表。
30.16. WatchUpdates (consumer)
-
watchedFields
Comma 分隔的字段列表,以监视更改,如Status、Priority、Assignee、Components
等。 -
sendOnlyUpdatedField
By 默认仅发送更改的字段作为正文。
所有消息还包含以下标头,用于添加有关更改的额外信息:
-
issueKey
:更新的问题的密钥 -
已更改的
: 更新字段的名称(例如 Status) -
watchedIssues
: 列出更新时监视的所有问题密钥
30.17. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 jira 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jira-starter</artifactId> </dependency>
组件支持 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)来自 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 令牌参数,则不要设置用户名和 OAuth 令牌参数,则用户名基本身份验证将具有优先权。 | 字符串 | |
camel.component.jira.verification-code | (仅限OAuth)从授权过程的第一个步骤中生成的 JIRA 验证代码。 | 字符串 |
第 31 章 JMS
支持生成者和消费者
此组件允许消息发送到(或从中消耗) JMS Queue 或 Topic。它使用 Spring 的 JMS 支持声明事务,包括用于发送的 Spring 的 JmsTemplate
和 MessageListenerContainer
以供使用。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jms</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
使用 ActiveMQ
,如果您使用 Apache ActiveMQ,您应该首选使用 ActiveMQ 组件,因为它已针对 ActiveMQ 进行了优化。此页面上的所有选项和示例也适用于 ActiveMQ 组件。
如果您在使用 JMS 的事务时,请参阅以下的事务和缓存级别
,因为它可能会影响性能。
请求/通过 JMS
,确保阅读本页面上 Request-reply 一节,以了解有关请求/回复的重要备注,因为 Camel 提供了很多选项来配置性能,以及集群环境。
31.1. URI 格式
jms:[queue:|topic:]destinationName[?options]
其中 destinationName
是 JMS 队列或主题名称。默认情况下,destinationName
被解释为队列名称。例如,要连接到队列,FOO.BAR
使用:
jms:FOO.BAR
如果需要,您可以包含可选的 queue:
前缀:
jms:queue:FOO.BAR
要连接到某个主题,您必须 包含 topic:
前缀。例如,要连接到主题 Stocks.Prices
,请使用:
jms:topic:Stocks.Prices
您可以使用以下格式将查询选项附加到 URI 中,
?option=value&option=value&…
31.1.1. 使用 ActiveMQ
JMS 组件重复使用 Spring 2 的 JmsTemplate
来发送消息。这不是在非J2EE 容器中使用的理想的选择,通常需要 JMS 供应商中的一些缓存以避免 性能不佳。
如果要使用 Apache ActiveMQ 作为您的消息代理,建议您进行以下操作之一:
- 使用 ActiveMQ 组件,该组件已优化为高效地使用 ActiveMQ
-
在 ActiveMQ 中使用
PoolingConnectionFactory
。
31.1.2. 事务和缓存级别
如果您使用消息并使用事务(transacted=true
),缓存级别的默认设置可能会影响性能。
如果您使用 XA 事务,则无法缓存,因为它可能会导致 XA 事务无法正常工作。
如果您不使用 XA,那么您应该考虑缓存以加快性能,例如设置 cacheLevelName=CACHE_CONSUMER
。
cacheLevelName
的默认设置是 CACHE_AUTO
。这个默认自动检测模式,并相应地设置缓存级别:
-
CACHE_CONSUMER
iftransacted=false
-
CACHE_NONE
iftransacted=true
因此,您可以说默认设置比较保守。如果您使用非 XA 事务,请考虑使用 cacheLevelName=CACHE_CONSUMER
。
31.1.3. 可写订阅
如果要使用持久主题订阅,则需要同时指定 clientId
和 durableSubscriptionName
。clientId
的值必须是唯一的,且只能供整个网络中的单个 JMS 连接实例使用。您可能希望使用 Virtual Topics 来避免这个限制。此处 有关持久消息传递的更背景。
31.1.4. 消息标头映射
在使用消息标头时,JMS 规格指出标头名称必须是有效的 Java 标识符。因此,请尝试将您的标头命名为有效的 Java 标识符。执行此操作的一个优点是,您可以在 JMS Selector 中使用您的标头(其 SQL92 语法强制使用标头的 Java 标识符语法)。
默认使用映射标头名称的简单策略。策略是替换标头名称中的任何点和连字符,如下所示,并在标头名称从通过线发送的 JMS 消息中恢复时反向替换。这意味着什么?在 bean 组件上没有更多调用的方法名称,不再丢失 File 组件的文件名标头,以此类推。
接受 Camel 中的标头名称的当前标头名称策略如下:
- 点被 'DOT' 替换,当 Camel 使用消息时,替换将被撤销
- 连字符由 'HYPHEN' 替代,并在 Camel 使用消息时撤销替换
您可以在 JMS 端点上配置许多不同的属性,该端点映射到 JMSConfiguration
对象上的属性。
映射到 Spring JMS
的许多属性映射到 Spring JMS 的属性,Camel 用来发送和接收信息。因此,您可以通过咨询相关的 Spring 文档来获取有关这些属性的更多信息。
31.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
31.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
31.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
31.3. 组件选项
JMS 组件支持 98 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clientId (common) | 设置要使用的 JMS 客户端 ID。请注意,如果指定,这个值必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只适用于持久主题订阅。如果使用 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 producer 也经过测试。 | false | 布尔值 |
acknowledgementModeName (consumer) | JMS 确认名称,其为: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE。 Enum 值:
| AUTO_ACKNOWLEDGE | 字符串 |
artemisConsumerPriority (consumer) | 通过消费者优先级,您可以确保高优先级消费者在消息处于活跃状态时收到消息。通常,连接到队列的活动消费者以轮循方式从它接收消息。当使用消费者优先级时,如果有多个具有相同高优先级的活跃用户,则消息将进行循环发送。只有高优先级消费者没有可用的信用消息或高优先级消费者接受消息时,消息才会降低优先级较低的消费者(例如,它不符合与消费者关联的任何选择器的条件)。 | int | |
asyncConsumer (consumer) | JmsConsumer 是否异步处理交换。如果启用,JmsConsumer 可以从 JMS 队列中提取下一个消息,而上一个消息则异步处理(通过 Asynchronous Routing Engine)。这意味着消息可能没有完全严格按照顺序进行处理。如果禁用(作为默认),则在 JmsConsumer 会从 JMS 队列中提取下一个消息前,会完全处理交换。请注意,如果启用了 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 执行 request/reply 时,选项 replyToConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | 1 | int |
maxConcurrentConsumers (consumer) | 指定从 JMS 消耗时的最大并发消费者数(而不是通过 JMS 请求/回复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当通过 JMS 执行请求/回复时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | int | |
replyToDeliveryPersistent (consumer) | 指定是否默认使用持久性交付进行回复。 | true | 布尔值 |
selector (consumer) | 设置要使用的 JMS 选择器。 | 字符串 | |
subscriptionDurable (consumer) | 设置是否使订阅持久化。可使用的 durable 订阅名称通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
subscriptionName (consumer) | 设置要创建的订阅名称。在带有共享或可升级订阅的主题(公共域)中应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注: 每个订阅都只允许 1 个并发消费者(这是此消息侦听器容器的默认值),但一个共享订阅(需要 JMS 2.0)除外。 | 字符串 | |
subscriptionShared (consumer) | 设置是否共享订阅。可以使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。请注意,共享的订阅也可能是危险的,因此此标志也可以与订阅相结合。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,则可能会考虑启用此选项,同时仍然在队列中排队消息。如果此选项为 false,并且您停止 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试 redeliveries (但可能会再次拒绝),最终消息可能会移到 JMS 代理上的死信队列中。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
allowReplyManagerQuickStop (consumer (advanced)) | 是否启用请求管理器中使用的 DefaultMessageListenerContainer,允许 DefaultMessageListenerContainer.runningAllowed 标志在 JmsConfigurationVirtualMachineisAcceptMessagesWhileStopping 时快速停止,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 用户中默认启用这种快速停止功能,但要为回复管理器启用这个标志。 | false | 布尔值 |
consumerType (consumer (advanced)) | 要使用的消费者类型,可以是 Simple、Default 或 Custom 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 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 带有最佳值 - 缓存线程池)。如果没有设置,则默认为之前的行为,它将缓存线程池用于消费者端点,而 SimpleAsync 用于回复用户。建议使用 ThreadPool 来减少弹性配置中线程垃圾箱,同时动态增加和减少并发用户。 Enum 值:
| DefaultTaskExecutorType | |
eagerLoadingOfProperties (consumer (advanced)) | 加载消息时立即启用 JMS 属性和有效负载的 eager 加载,因为 JMS 属性可能并不是必需的,但有时可能会捕获与底层 JMS 提供程序和使用 JMS 属性的早期问题。另请参阅选项 eagerPoisonBody。 | false | 布尔值 |
eagerPoisonBody (consumer (advanced)) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)是 poison (无法读取/映射),然后将这个文本设置为消息正文,因此可以处理消息( poison 的原因)已作为交换异常保存。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅 eagerLoadingOfProperties 选项。 | Poison JMS 消息,因为 $\{exception.message} | 字符串 |
exposeListenerSession (consumer (advanced)) | 指定在消耗消息时是否应公开监听程序会话。 | false | 布尔值 |
replyToSameDestinationAllowed (consumer (advanced)) | JMS 使用者是否允许向消费者使用的同一目的地发送回复消息。这可防止出现无限循环,并通过消耗并向自己发送相同的消息。 | false | 布尔值 |
taskExecutor (consumer (advanced)) | 允许您指定自定义任务执行器以使用消息。 | TaskExecutor | |
deliveryDelay (producer) | 设置用于发送 JMS 发送调用的交付延迟。这个选项需要 JMS 2.0 兼容代理。 | -1 | long |
deliveryMode (producer) | 指定要使用的交付模式。可能的值是由 javax.jms.DeliveryMode 定义的值。NON_PERSISTENT = 1 和 PERSISTENT = 2。 Enum 值:
| 整数 | |
deliveryPersistent (producer) | 指定默认使用持久性交付。 | true | 布尔值 |
explicitQosEnabled (producer) | 设置在发送消息时使用 deliveryMode、priority 或 timeToLive 数量服务。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项(按消息粒度运行)相反,从 Camel In 消息标头中读取 QoS 属性。 | false | 布尔值 |
formatDateHeadersToIso8601 (producer) | 根据 ISO 8601 标准设置 JMS 日期属性是否应格式化。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
preserveMessageQos (producer) | 如果要使用消息中指定的 QoS 设置来发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中一些。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖端点中的值。与之相反,clearQosEnabled 选项将仅使用端点上设置的选项,而不使用来自消息标头中的值。 | false | 布尔值 |
priority (producer) | 大于 1 的值指定发送时的消息优先级(其中 1 是最低优先级,9 是最高)。必须启用 explicitQosEnabled 选项才能使此选项生效。 Enum 值:
| 4 | int |
replyToConcurrentConsumers (producer) | 指定执行请求/通过 JMS 回复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | 1 | int |
replyToMaxConcurrentConsumers (producer) | 指定在通过 JMS 使用请求/回复时的最大并发消费者数。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | int | |
replyToOnTimeoutMaxConcurrentConsumers (producer) | 指定使用请求/通过 JMS 时超时时继续路由的最大并发消费者数。 | 1 | int |
replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo 目的地,这将覆盖 replyTo 的设置。如果要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这非常有用。 | 字符串 | |
replyToType (producer) | 允许明确指定在执行 request/reply 时要用于 replyTo 队列的策略类型。可能的值有:Temporary、share 或 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 来不设置发送消息上的生存时间。然后,消息不会在接收器系统中过期。如需了解更多详细信息,请参见以下部分关于生存时间。 | false | 布尔值 |
forceSendOriginalMessage (producer (advanced)) | 当使用 mapJmsMessage=false Camel 时,如果在路由中涉及标头(get 或 set),则会创建一个新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true,以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly 发送到 JMS 目的地时适用(例如触发和忘记)。启用此选项将增强 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID。 | false | 布尔值 |
replyToCacheLevelName (producer (advanced)) | 在执行请求/通过 JMS 时,按名称为回复消费者设置缓存级别。这个选项仅在使用固定回复队列(而非临时)时才适用。Camel 默认将使用:CACHE_CONSUMER 用于专用或共享的 w/ replyToSelectorName。和 CACHE_SESSION 用于没有 replyToSelectorName 的共享。IBM WebSphere 等 JMS 代理可能需要设置 replyToCacheLevelName=CACHE_NONE 才能正常工作。注:如果使用临时队列,则不允许使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
replyToDestinationSelectorName (producer (advanced)) | 使用要使用的固定名称设置 JMS Selector,以便您可以在使用共享队列(也就是说,如果您不使用临时回复队列)时过滤来自其他回复的回复。 | 字符串 | |
streamMessageTypeEnabled (producer (advanced)) | 设置 StreamMessage 类型是否已启用。流类型的消息有效负载(如 files、InStream 等)将通过作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪种类型。默认情况下,使用 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 流模式进行优化。这可减少使用带有 JMS StreamMessage 类型的 Artemis 时的内存开销。只有在使用 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 | 布尔值 |
配置 (高级) | 使用共享的 JMS 配置。 | JmsConfiguration | |
destinationResolver (advanced) | 一个可插拔的 org.springframework.jms.support.destination.DestinationResolver,供您使用自己的解析器(例如,在 JNDI registry 中查找实际目的地)。 | DestinationResolver | |
errorHandler (advanced) | 指定在处理消息时引发任何未发现异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些例外将在 WARN 级别记录。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStack Trace 选项记录堆栈追踪。这样可以更容易配置,而不是需要对自定义错误处理程序进行代码。 | ErrorHandler | |
exceptionListener (advanced) | 指定针对任何底层 JMS 异常通知的 JMS Exception Listener。 | ExceptionListener | |
idleConsumerLimit (advanced) | 指定任何给定时间允许闲置的用户数量的限值。 | 1 | int |
idleTaskExecutionLimit (advanced) | 指定接收任务闲置执行的限制,不会在其执行中收到任何消息。如果达到这个限制,任务将关闭并将接收给其他执行任务(在动态调度时;请参阅 maxConcurrentConsumers 设置)。Spring 提供了额外的文档。 | 1 | int |
includeAllJMSXProperties (advanced) | 在从 JMS 到 Camel Message 映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则不会应用这个选项。 | false | 布尔值 |
jmsKeyFormatStrategy (advanced) | 编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供两个开箱即用的实现:default 和 passthrough。默认策略将安全地使用句点和连字符(. 和 -)。passthrough 策略将密钥保留原样。可用于不负责 JMS 标头密钥是否包含非法字符的 JMS 代理。您可以自行提供 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 sVirt 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
mapJmsMessage (advanced) | 指定 Camel 是否应该自动将收到的 JMS 消息映射到合适的有效负载类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
maxMessagesPerTask (advanced) | 每个任务的消息数量。-1 代表没有限制。如果您为并发消费者使用范围(例如 min max),则可以使用此选项将值设为 100,以控制消费者在需要较少的工作时可以缩小的速度。 | -1 | int |
messageConverter (advanced) | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
messageCreatedStrategy (advanced) | 使用给定的 MessageCreatedStrategy,当 Camel 发送 JMS 消息时,Camel 创建 javax.jms.Message 对象的新实例。 | MessageCreatedStrategy | |
messageIdEnabled (advanced) | 发送时,指定是否应添加消息 ID。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将消息 ID 设置为 null;如果提供程序忽略提示,则必须将消息 ID 设置为其普通唯一值。 | true | 布尔值 |
messageListenerContainerFactory (advanced) | MessageListenerContainerFactory 的 registry ID,用于决定要使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer。设置此项将自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
messageTimestampEnabled (advanced) | 指定在发送消息时是否默认启用时间戳。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将时间戳设置为零;如果提供程序忽略提示,则必须将时间戳设置为其正常值。 | 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 |
Sync (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
transferException (advanced) | 如果启用了且您使用 Request Reply messaging (InOut),并且 Exchange 失败在消费者端,则原因例外将作为 javax.jms.ObjectMessage 发回的响应。如果客户端是 Camel,则返回的例外将重新箭头。这样,您可以使用 Camel JMS 作为路由中的桥接 - 例如,使用持久性队列来启用强大的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。caught 异常需要可以被序列化。消费者端的原始例外可以嵌套在外部异常中,如 org.apache.camel.RuntimeCamelException。请谨慎使用它,因为数据正在使用 Java 对象序列化,要求接收者在类级别反序列化数据,这会强制在生产者和消费者之间进行强校准。 | false | 布尔值 |
transferExchange (advanced) | 您可以在有线线上传输交换,而不只是正文和标头。以下字段会被传输: 在 body, Out body, Fault body, In headers, Out headers, Fault header, Exchange properties, exchange exception.这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。您必须在制作者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换,而不是常规有效负载。请谨慎使用它,因为数据正在使用 Java 对象序列化,并且要求接收器能够在类级别上反序列化数据,这会强制在需要使用兼容 Camel 版本的生产者和消费者之间进行强大的协调。 | false | 布尔值 |
useMessageIDAsCorrelationID (advanced) | 指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在执行 request/reply over JMS 以及启用了 useMessageIDAsCorrelationID 时,等待 provisional correlation id 被更新到实际关联 ID 的次数。 | 50 | int |
waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 等待置备关联 ID 时每次休眠的时间间隔(以秒为单位)。 | 100 | long |
HeaderFilterStrategy (filter) | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 将标头过滤到或从 Camel 消息过滤。 | HeaderFilterStrategy | |
errorHandlerLoggingLevel (logging) | 允许为日志记录 uncaught 异常配置默认 errorHandler 日志记录级别。 Enum 值:
| WARN | LoggingLevel |
errorHandlerLogStackTrace (logging) | 允许通过默认错误处理程序来控制是否应记录 stacktraces。 | true | 布尔值 |
密码 (安全) | 与 ConnectionFactory 一起使用的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
用户名 (安全) | 与 ConnectionFactory 一起使用的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
Transacted (transaction) | 指定是否使用转换模式。 | false | 布尔值 |
TransactedInOut (transaction) | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式,如果此标志被设置为 true,则 Spring JmsTemplate 将把 sessionTransacted 设置为 true,而 confirmMode 作为转换用于 InOut 操作。请注意:在 JTA 事务中,传递给 createQueue 的参数不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值做出自己的决策。类似地,这些参数不会考虑本地管理的事务,因为 Spring JMS 在这种情况下在现有 JMS 会话上运行。在受管事务外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(除 XA 事务之外)时同步的本地 JMS 事务。这与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务)的影响,在主事务后 JMS 事务提交右侧的 JMS 事务。 | false | 布尔值 |
lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,Camel 将创建一个 JmsTransactionManager,如果没有在选项 transacted=true 时注入 transactionManager。 | true | 布尔值 |
transactionManager (transaction (advanced)) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
transactionTimeout (transaction (advanced)) | 如果使用转换模式,事务的超时值(以秒为单位)。 | -1 | int |
31.4. 端点选项
JMS 端点使用 URI 语法进行配置:
jms:destinationType:destinationName
使用以下路径和查询参数:
31.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
destinationType (common) | 要使用的目标种类。 Enum 值:
| queue | 字符串 |
destinationName (common) | 用作目的地的队列或主题 所需的 名称。 | 字符串 |
31.4.2. 查询参数(95 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
clientId (common) | 设置要使用的 JMS 客户端 ID。请注意,如果指定,这个值必须是唯一的,且只能被单个 JMS 连接实例使用。它通常只适用于持久主题订阅。如果使用 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 producer 也经过测试。 | false | 布尔值 |
acknowledgementModeName (consumer) | JMS 确认名称,其为: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE。 Enum 值:
| AUTO_ACKNOWLEDGE | 字符串 |
artemisConsumerPriority (consumer) | 通过消费者优先级,您可以确保高优先级消费者在消息处于活跃状态时收到消息。通常,连接到队列的活动消费者以轮循方式从它接收消息。当使用消费者优先级时,如果有多个具有相同高优先级的活跃用户,则消息将进行循环发送。只有高优先级消费者没有可用的信用消息或高优先级消费者接受消息时,消息才会降低优先级较低的消费者(例如,它不符合与消费者关联的任何选择器的条件)。 | int | |
asyncConsumer (consumer) | JmsConsumer 是否异步处理交换。如果启用,JmsConsumer 可以从 JMS 队列中提取下一个消息,而上一个消息则异步处理(通过 Asynchronous Routing Engine)。这意味着消息可能没有完全严格按照顺序进行处理。如果禁用(作为默认),则在 JmsConsumer 会从 JMS 队列中提取下一个消息前,会完全处理交换。请注意,如果启用了 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 执行 request/reply 时,选项 replyToConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | 1 | int |
maxConcurrentConsumers (consumer) | 指定从 JMS 消耗时的最大并发消费者数(而不是通过 JMS 请求/回复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当通过 JMS 执行请求/回复时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发消费者数量。 | int | |
replyToDeliveryPersistent (consumer) | 指定是否默认使用持久性交付进行回复。 | true | 布尔值 |
selector (consumer) | 设置要使用的 JMS 选择器。 | 字符串 | |
subscriptionDurable (consumer) | 设置是否使订阅持久化。可使用的 durable 订阅名称通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
subscriptionName (consumer) | 设置要创建的订阅名称。在带有共享或可升级订阅的主题(公共域)中应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注: 每个订阅都只允许 1 个并发消费者(这是此消息侦听器容器的默认值),但一个共享订阅(需要 JMS 2.0)除外。 | 字符串 | |
subscriptionShared (consumer) | 设置是否共享订阅。可以使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。请注意,共享的订阅也可能是危险的,因此此标志也可以与订阅相结合。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
acceptMessagesWhileStopping (consumer (advanced)) | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,则可能会考虑启用此选项,同时仍然在队列中排队消息。如果此选项为 false,并且您停止 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试 redeliveries (但可能会再次拒绝),最终消息可能会移到 JMS 代理上的死信队列中。要避免这种情况,建议启用这个选项。 | false | 布尔值 |
allowReplyManagerQuickStop (consumer (advanced)) | 是否启用请求管理器中使用的 DefaultMessageListenerContainer,允许 DefaultMessageListenerContainer.runningAllowed 标志在 JmsConfigurationVirtualMachineisAcceptMessagesWhileStopping 时快速停止,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 用户中默认启用这种快速停止功能,但要为回复管理器启用这个标志。 | false | 布尔值 |
consumerType (consumer (advanced)) | 要使用的消费者类型,可以是 Simple、Default 或 Custom 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 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 带有最佳值 - 缓存线程池)。如果没有设置,则默认为之前的行为,它将缓存线程池用于消费者端点,而 SimpleAsync 用于回复用户。建议使用 ThreadPool 来减少弹性配置中线程垃圾箱,同时动态增加和减少并发用户。 Enum 值:
| DefaultTaskExecutorType | |
eagerLoadingOfProperties (consumer (advanced)) | 加载消息时立即启用 JMS 属性和有效负载的 eager 加载,因为 JMS 属性可能并不是必需的,但有时可能会捕获与底层 JMS 提供程序和使用 JMS 属性的早期问题。另请参阅选项 eagerPoisonBody。 | false | 布尔值 |
eagerPoisonBody (consumer (advanced)) | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)是 poison (无法读取/映射),然后将这个文本设置为消息正文,因此可以处理消息( poison 的原因)已作为交换异常保存。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅 eagerLoadingOfProperties 选项。 | Poison JMS 消息,因为 $\{exception.message} | 字符串 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
exposeListenerSession (consumer (advanced)) | 指定在消耗消息时是否应公开监听程序会话。 | false | 布尔值 |
replyToSameDestinationAllowed (consumer (advanced)) | JMS 使用者是否允许向消费者使用的同一目的地发送回复消息。这可防止出现无限循环,并通过消耗并向自己发送相同的消息。 | false | 布尔值 |
taskExecutor (consumer (advanced)) | 允许您指定自定义任务执行器以使用消息。 | TaskExecutor | |
deliveryDelay (producer) | 设置用于发送 JMS 发送调用的交付延迟。这个选项需要 JMS 2.0 兼容代理。 | -1 | long |
deliveryMode (producer) | 指定要使用的交付模式。可能的值是由 javax.jms.DeliveryMode 定义的值。NON_PERSISTENT = 1 和 PERSISTENT = 2。 Enum 值:
| 整数 | |
deliveryPersistent (producer) | 指定默认使用持久性交付。 | true | 布尔值 |
explicitQosEnabled (producer) | 设置在发送消息时使用 deliveryMode、priority 或 timeToLive 数量服务。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项(按消息粒度运行)相反,从 Camel In 消息标头中读取 QoS 属性。 | false | 布尔值 |
formatDateHeadersToIso8601 (producer) | 根据 ISO 8601 标准设置 JMS 日期属性是否应格式化。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
preserveMessageQos (producer) | 如果要使用消息中指定的 QoS 设置来发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中一些。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖端点中的值。与之相反,clearQosEnabled 选项将仅使用端点上设置的选项,而不使用来自消息标头中的值。 | false | 布尔值 |
priority (producer) | 大于 1 的值指定发送时的消息优先级(其中 1 是最低优先级,9 是最高)。必须启用 explicitQosEnabled 选项才能使此选项生效。 Enum 值:
| 4 | int |
replyToConcurrentConsumers (producer) | 指定执行请求/通过 JMS 回复时的默认并发消费者数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | 1 | int |
replyToMaxConcurrentConsumers (producer) | 指定在通过 JMS 使用请求/回复时的最大并发消费者数。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。 | int | |
replyToOnTimeoutMaxConcurrentConsumers (producer) | 指定使用请求/通过 JMS 时超时时继续路由的最大并发消费者数。 | 1 | int |
replyToOverride (producer) | 在 JMS 消息中提供显式 ReplyTo 目的地,这将覆盖 replyTo 的设置。如果要将消息转发到远程队列,并从 ReplyTo 目的地接收回复消息,这非常有用。 | 字符串 | |
replyToType (producer) | 允许明确指定在执行 request/reply 时要用于 replyTo 队列的策略类型。可能的值有:Temporary、share 或 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 来不设置发送消息上的生存时间。然后,消息不会在接收器系统中过期。如需了解更多详细信息,请参见以下部分关于生存时间。 | false | 布尔值 |
forceSendOriginalMessage (producer (advanced)) | 当使用 mapJmsMessage=false Camel 时,如果在路由中涉及标头(get 或 set),则会创建一个新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true,以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
includeSentJMSMessageID (producer (advanced)) | 仅在使用 InOnly 发送到 JMS 目的地时适用(例如触发和忘记)。启用此选项将增强 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID。 | false | 布尔值 |
replyToCacheLevelName (producer (advanced)) | 在执行请求/通过 JMS 时,按名称为回复消费者设置缓存级别。这个选项仅在使用固定回复队列(而非临时)时才适用。Camel 默认将使用:CACHE_CONSUMER 用于专用或共享的 w/ replyToSelectorName。和 CACHE_SESSION 用于没有 replyToSelectorName 的共享。IBM WebSphere 等 JMS 代理可能需要设置 replyToCacheLevelName=CACHE_NONE 才能正常工作。注:如果使用临时队列,则不允许使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。 Enum 值:
| 字符串 | |
replyToDestinationSelectorName (producer (advanced)) | 使用要使用的固定名称设置 JMS Selector,以便您可以在使用共享队列(也就是说,如果您不使用临时回复队列)时过滤来自其他回复的回复。 | 字符串 | |
streamMessageTypeEnabled (producer (advanced)) | 设置 StreamMessage 类型是否已启用。流类型的消息有效负载(如 files、InStream 等)将通过作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪种类型。默认情况下,使用 BytesMessage 来强制整个消息有效负载读取到内存中。通过启用此选项,消息有效负载以块的形式读取到内存中,然后每个块都会写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
allowSerializedHeaders (advanced) | 控制是否包含序列化标头。仅在 transferExchange 为 true 时才适用。这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。 | false | 布尔值 |
artemisStreamingEnabled (advanced) | 是否针对 Apache Artemis 流模式进行优化。这可减少使用带有 JMS StreamMessage 类型的 Artemis 时的内存开销。只有在使用 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 registry 中查找实际目的地)。 | DestinationResolver | |
errorHandler (advanced) | 指定在处理消息时引发任何未发现异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些例外将在 WARN 级别记录。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStack Trace 选项记录堆栈追踪。这样可以更容易配置,而不是需要对自定义错误处理程序进行代码。 | 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 Message 映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则不会应用这个选项。 | false | 布尔值 |
jmsKeyFormatStrategy (advanced) | 编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供两个开箱即用的实现:default 和 passthrough。默认策略将安全地使用句点和连字符(. 和 -)。passthrough 策略将密钥保留原样。可用于不负责 JMS 标头密钥是否包含非法字符的 JMS 代理。您可以自行提供 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 sVirt 表示法引用它。 Enum 值:
| JmsKeyFormatStrategy | |
mapJmsMessage (advanced) | 指定 Camel 是否应该自动将收到的 JMS 消息映射到合适的有效负载类型,如 javax.jms.TextMessage 到 String 等。 | true | 布尔值 |
maxMessagesPerTask (advanced) | 每个任务的消息数量。-1 代表没有限制。如果您为并发消费者使用范围(例如 min max),则可以使用此选项将值设为 100,以控制消费者在需要较少的工作时可以缩小的速度。 | -1 | int |
messageConverter (advanced) | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。 | MessageConverter | |
messageCreatedStrategy (advanced) | 使用给定的 MessageCreatedStrategy,当 Camel 发送 JMS 消息时,Camel 创建 javax.jms.Message 对象的新实例。 | MessageCreatedStrategy | |
messageIdEnabled (advanced) | 发送时,指定是否应添加消息 ID。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将消息 ID 设置为 null;如果提供程序忽略提示,则必须将消息 ID 设置为其普通唯一值。 | true | 布尔值 |
messageListenerContainerFactory (advanced) | MessageListenerContainerFactory 的 registry ID,用于决定要使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer。设置此项将自动将 consumerType 设置为 Custom。 | MessageListenerContainerFactory | |
messageTimestampEnabled (advanced) | 指定在发送消息时是否默认启用时间戳。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将时间戳设置为零;如果提供程序忽略提示,则必须将时间戳设置为其正常值。 | true | 布尔值 |
pubSubNoLocal (advanced) | 指定是否禁止自己连接发布的消息的发送。 | false | 布尔值 |
receiveTimeout (advanced) | 接收消息的超时时间(以毫秒为单位)。 | 1000 | long |
recoveryInterval (advanced) | 指定恢复尝试之间的间隔,即当连接被刷新时,以毫秒为单位。默认值为 5000 ms,即 5 秒。 | 5000 | long |
requestTimeoutCheckerInterval (advanced) | 配置 Camel 在执行请求/通过 JMS 回复时应检查超时交换的频率。默认情况下,Camel 会每秒检查一次。但是,如果发生超时时,您必须更快地响应,那么您可以降低这个间隔,以便更频繁地检查。超时由选项 requestTimeout 决定。 | 1000 | long |
Sync (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
transferException (advanced) | 如果启用了且您使用 Request Reply messaging (InOut),并且 Exchange 失败在消费者端,则原因例外将作为 javax.jms.ObjectMessage 发回的响应。如果客户端是 Camel,则返回的例外将重新箭头。这样,您可以使用 Camel JMS 作为路由中的桥接 - 例如,使用持久性队列来启用强大的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。caught 异常需要可以被序列化。消费者端的原始例外可以嵌套在外部异常中,如 org.apache.camel.RuntimeCamelException。请谨慎使用它,因为数据正在使用 Java 对象序列化,要求接收者在类级别反序列化数据,这会强制在生产者和消费者之间进行强校准。 | false | 布尔值 |
transferExchange (advanced) | 您可以在有线线上传输交换,而不只是正文和标头。以下字段会被传输: 在 body, Out body, Fault body, In headers, Out headers, Fault header, Exchange properties, exchange exception.这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。您必须在制作者和消费者端启用这个选项,因此 Camel 知道有效负载是一个交换,而不是常规有效负载。请谨慎使用它,因为数据正在使用 Java 对象序列化,并且要求接收器能够在类级别上反序列化数据,这会强制在需要使用兼容 Camel 版本的生产者和消费者之间进行强大的协调。 | false | 布尔值 |
useMessageIDAsCorrelationID (advanced) | 指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。 | false | 布尔值 |
waitForProvisionCorrelationToBeUpdatedCounter (advanced) | 在执行 request/reply over JMS 以及启用了 useMessageIDAsCorrelationID 时,等待 provisional correlation id 被更新到实际关联 ID 的次数。 | 50 | int |
waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 等待置备关联 ID 时每次休眠的时间间隔(以秒为单位)。 | 100 | long |
errorHandlerLoggingLevel (logging) | 允许为日志记录 uncaught 异常配置默认 errorHandler 日志记录级别。 Enum 值:
| WARN | LoggingLevel |
errorHandlerLogStackTrace (logging) | 允许通过默认错误处理程序来控制是否应记录 stacktraces。 | true | 布尔值 |
密码 (安全) | 与 ConnectionFactory 一起使用的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
用户名 (安全) | 与 ConnectionFactory 一起使用的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
Transacted (transaction) | 指定是否使用转换模式。 | false | 布尔值 |
TransactedInOut (transaction) | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式,如果此标志被设置为 true,则 Spring JmsTemplate 将把 sessionTransacted 设置为 true,而 confirmMode 作为转换用于 InOut 操作。请注意:在 JTA 事务中,传递给 createQueue 的参数不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值做出自己的决策。类似地,这些参数不会考虑本地管理的事务,因为 Spring JMS 在这种情况下在现有 JMS 会话上运行。在受管事务外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(除 XA 事务之外)时同步的本地 JMS 事务。这与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务)的影响,在主事务后 JMS 事务提交右侧的 JMS 事务。 | false | 布尔值 |
lazyCreateTransactionManager (transaction (advanced)) | 如果为 true,Camel 将创建一个 JmsTransactionManager,如果没有在选项 transacted=true 时注入 transactionManager。 | true | 布尔值 |
transactionManager (transaction (advanced)) | 要使用的 Spring 事务管理器。 | PlatformTransactionManager | |
transactionName (transaction (advanced)) | 要使用的事务的名称。 | 字符串 | |
transactionTimeout (transaction (advanced)) | 如果使用转换模式,事务的超时值(以秒为单位)。 | -1 | int |
31.5. Samples
JMS 也在许多示例中用于其他组件。但是,我们提供了几个示例来开始。
31.5.1. 从 JMS 接收
在以下示例中,我们将配置一个路由,该路由接收 JMS 信息并将消息路由到 POJO:
from("jms:queue:foo"). to("bean:myBusinessLogic");
您可以使用任何 EIP 模式,以便路由基于上下文。例如,这里的如何为大消耗器过滤订购主题:
from("jms:topic:OrdersTopic"). filter().method("myBean", "isGoldCustomer"). to("jms:queue:BigSpendersQueue");
31.5.2. 发送到 JMS
在以下示例中,我们轮询文件文件夹,并将文件内容发送到 JMS 主题。当我们希望将文件的内容作为 TextMessage
而不是 BytesMessage
一样,我们需要将正文转换为 字符串
:
from("file://orders"). convertBodyTo(String.class). to("jms:topic:OrdersTopic");
31.5.3. 使用注解
Camel 还具有注释,因此您可以使用 POJO Consuming 和 POJO Producing。
31.5.4. Spring DSL 示例
前面的示例使用 Java DSL。Camel 还支持 Spring XML DSL。以下是使用 Spring DSL 的大消耗的示例:
<route> <from uri="jms:topic:OrdersTopic"/> <filter> <method ref="myBean" method="isGoldCustomer"/> <to uri="jms:queue:BigSpendersQueue"/> </filter> </route>
31.5.5. 其他示例
JMS 出现在其他组件和 EIP 模式的许多示例中,以及此 Camel 文档。因此,可以浏览文档。
31.5.6. 使用 JMS 作为 Dead Letter Queue Store Exchange
通常,当使用 JMS 作为传输时,它仅传输正文和标头作为有效负载。如果要将 JMS 与 Dead Letter Channel 搭配使用,使用 JMS 队列作为 Dead Letter Queue,则原因的例外通常不会存储在 JMS 消息中。但是,您可以在 JMS 死信队列中使用 transferExchange
选项来指示 Camel 将整个 Exchange 存储在队列中,作为包含 org.apache.camel.support.DefaultExchangeHolder
的 javax.jms.ObjectMessage
。这可让您从 Dead Letter Queue 中使用,并使用密钥 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();
31.5.7. 使用 JMS 作为只存储错误的 Dead Letter Channel
您可以使用 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 上调用方法或使用自定义处理器。
31.6. JMS 和 Camel 之间的消息映射
Camel 自动映射 javax.jms.Message
和 org.apache.camel.Message
之间的消息。
发送 JMS 消息时,Camel 会将消息正文转换为以下 JMS 消息类型:
正文类型 | JMS Message | 注释 |
---|---|---|
|
| |
|
|
DOM 将转换为 |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
在收到 JMS 消息时,Camel 会将 JMS 信息转换为以下正文类型:
JMS Message | 正文类型 |
---|---|
|
|
|
|
|
|
|
|
31.6.1. 禁用自动映射 JMS 消息
您可以使用 mapJmsMessage
选项禁用上述自动映射。如果禁用,Camel 不会尝试映射收到的 JMS 消息,而是直接将其用作有效负载。这可让您避免映射开销,并使 Camel 只是通过 JMS 消息传递。例如,它甚至允许您路由带有使用了没有包括在 classpath 中的类的 javax.jms.ObjectMessage
JMS 消息。
31.6.2. 使用自定义 MessageConverter
您可以使用 messageConverter
选项在 Spring org.springframework.jms.support.converter.MessageConverter
类中进行映射。
例如,在下面的路由中,在向 JMS order 队列发送消息时,使用自定义消息转换器:
from("file://inbox/order").to("jms:queue:order?messageConverter=#myMessageConverter");
在从 JMS 目的地消耗时,您还可以使用自定义消息转换器。
31.6.3. 控制所选的映射策略
您可以使用端点 URL 上的 jmsMessageType
选项为所有消息强制使用特定的消息类型。
在以下路由中,从文件夹中轮询文件,并将其作为 javax.jms.TextMessage
发送,因为我们已强制 JMS producer 端点使用文本消息:
from("file://inbox/order").to("jms:queue:order?jmsMessageType=Text");
您还可以通过使用键 CamelJmsMessageType
设置标头来指定要用于每个消息的消息类型。例如:
from("file://inbox/order").setHeader("CamelJmsMessageType", JmsMessageType.Text).to("jms:queue:order");
可能的值在 enum
类 org.apache.camel.jms.JmsMessageType
中定义。
31.7. 发送时的消息格式
通过 JMS 有线发送的交换必须符合 JMS 消息规格。
对于 exchange.in.header
,以下规则适用于标头 键 :
-
从
JMS
或JMSX
开头的密钥将被保留。 -
exchange.in.headers
键必须是字面数,并且全部都是有效的 Java 标识符(不要在密钥名称中使用点)。 -
Camel 在消耗 JMS 消息时替换句点和连字符,在 Camel 使用消息时被 'DOT' 替代,并在 Camel 使用消息时替换反向替换。
-
被 'HYPHEN' 替换,并在 Camel 消耗消息时替换反向替换。
-
另请参阅
jmsKeyFormatStrategy
选项,该选项允许使用您自己的自定义策略进行格式化密钥。
对于 exchange.in.header
,以下规则适用于 标头值 :
-
值必须是 primitives 或其计数器对象(如
Integer
、Long
、Character
)。类型、字符串
、CharSequence
、日期
、MuterDecimal
和BigInteger
都转换为其toString ()
表示。所有其他类型都会丢弃。
如果它丢弃给定标头值,Camel 会在 DEBUG 级别使用类别 org.apache.camel.component.jms.JmsBinding
记录。例如:
2008-07-09 06:43:04,046 [main ] DEBUG JmsBinding - Ignoring non primitive header: order of class: org.apache.camel.component.jms.issues.DummyOrder with value: DummyOrder{orderId=333, itemId=4444, quantity=2}
31.8. 接收时的消息格式
Camel 在收到消息时向 交换
添加以下属性:
属性 | 类型 | 描述 |
---|---|---|
|
| 回复目的地。 |
Camel 在收到 JMS 消息时,在 In 消息标头中添加以下 JMS 属性:
标头 | 类型 | 描述 |
---|---|---|
|
| JMS 关联 ID。 |
|
| JMS 交付模式。 |
|
| JMS 目的地。 |
|
| JMS 过期。 |
|
| JMS 唯一的消息 ID。 |
|
| JMS 优先级(0 作为最低优先级,9 为最高)。 |
|
| 是 JMS 消息,redelivered。 |
|
| JMS 回复到目的地。 |
|
| JMS 时间戳。 |
|
| JMS 类型。 |
|
| JMS 组 ID。 |
由于上述所有信息都是标准的 JMS,您可以检查 JMS 文档 以了解更多详情。
31.9. 关于使用 Camel 来发送和接收消息,以及 JMSReplyTo
JMS 组件比较复杂,您必须特别注意它在某些情况下如何工作。因此,这是要查找的一些 Region/pitfalls 的简短摘要。
当 Camel 使用其 JMSProducer
发送消息时,它会检查以下条件:
- 消息交换模式,
-
在端点或消息标头中设置了
JMSReplyTo
, -
是否在 JMS 端点上设置了以下选项:
disableReplyTo
、preserveMessageQos
,explicitQosEnabled
。
所有这些都很复杂,理解并配置来支持您的用例。
31.9.1. JmsProducer
JmsProducer
的行为如下,具体取决于配置:
交换模式 | 其他选项 | 描述 |
---|---|---|
InOut | - |
Camel 将期望回复,设置临时 |
InOut |
|
Camel 将期望回复,并在发送消息后,它将开始侦听指定的 |
InOnly | - | Camel 将发送邮件,而不是 预期回复。 |
InOnly |
|
默认情况下,Camel 会丢弃 |
31.9.2. JmsConsumer
JmsConsumer
的行为如下,具体取决于配置:
交换模式 | 其他选项 | 描述 |
---|---|---|
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");
31.10. 重复使用端点并发送到在运行时计算的不同目的地
如果您需要发送消息到许多不同的 JMS 目的地,可以重复利用 JMS 端点并在消息标头中指定实际目的地。这允许 Camel 重复使用同一端点,但发送到不同的目的地。这可显著减少内存和线程资源上创建的端点数量。
您可以在以下标头中指定目的地:
标头 | 类型 | 描述 |
---|---|---|
|
| 目标对象。 |
|
| 目标名称。 |
例如,以下路由演示了如何在运行时计算目的地,并使用它来覆盖 JMS URL 中显示的目的地:
from("file://inbox") .to("bean:computeDestination") .to("activemq:queue:dummy");
队列名称 dummy
只是一个占位符。它必须作为 JMS 端点 URL 的一部分提供,但本例中将被忽略。
在 computeDestination
bean 中,设置 CamelJmsDestinationName
标头来指定实际目的地,如下所示:
public void setJmsHeader(Exchange exchange) { String id = .... exchange.getIn().setHeader("CamelJmsDestinationName", "order:" + id"); }
然后 Camel 将读取此标头并将其用作目的地,而不是在端点上配置的标头。因此,在这个示例中,Camel 将消息发送到 activemq:queue:order:2
,假设 id
值为 2。
如果同时设置了 CamelJmsDestination
和 CamelJmsDestinationName
标头,则 CamelJmsDestination
具有优先权。请记住,JMS 生成者会从交换中删除 CamelJmsDestination
and CamelJmsDestinationName
标头,且不会将它们传播到所创建的 JMS 消息,以避免路由中的意外循环(当消息将转发到另一个 JMS 端点时)。
31.11. 配置不同的 JMS 供应商
您可以在 Spring XML 中配置 JMS 供应商,如下所示:
基本上,您可以根据需要配置多个 JMS 组件实例,您需要使用 id
属性 为它们指定唯一的名称。前面的示例配置了 activemq
组件。您可以执行同样的方法来配置 MQSeries、TibCo、TibCo、Sonic 等。
命名的 JMS 组件后,您可以使用 URI 引用该组件中的端点。例如,对于组件名称 activemq
,您可以使用 URI 格式引用目的地,activemq:[queue:|topic:]destinationName
。您可以将相同的方法用于所有其他 JMS 提供程序。
这可通过 Spring CamelContext 许可,从用于 Endpoint URI 的方案名称的 spring 上下文获取组件,并让组件解析端点 URI。
31.11.1. 使用 JNDI 查找 ConnectionFactory
如果您使用 J2EE 容器,您可能需要查找 JNDI 以查找 JMS ConnectionFactory
,而不是在 Spring 中使用常见的 < bean>
; 机制。您可以使用 Spring 的 factory bean 或新的 Spring XML 命名空间进行此操作。例如:
<bean id="weblogic" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory" ref="myConnectionFactory"/> </bean> <jee:jndi-lookup id="myConnectionFactory" jndi-name="jms/connectionFactory"/>
有关 JNDI 查找的详情,请参阅 Spring 参考文档中的 jee 模式。
31.12. 并发消耗
JMS 的常见要求是在多个线程中同时使用消息,以便应用程序更快响应。您可以设置 concurrentConsumers
选项,以指定为 JMS 端点提供服务的线程数量,如下所示:
from("jms:SomeQueue?concurrentConsumers=20"). bean(MyClass.class);
您可以使用以下方法之一配置这个选项:
-
在
JmsComponent
上, - 在端点 URI 或.
-
通过直接在
JmsEndpoint
上调用setConcurrentConsumers ()
。
31.12.1. 使用 async 使用者并发恢复
请注意,当当前消息被完全处理后,每个并发消费者将仅从 JMS 代理获取下一个可用消息。您可以设置 asyncConsumer=true
选项,以便消费者从 JMS 队列中提取下一个消息,而前面的消息则异步处理(通过 Asynchronous Routing Engine)。有关 asyncConsumer
选项的信息,请参阅页面顶部的更多详情。
from("jms:SomeQueue?concurrentConsumers=20&asyncConsumer=true"). bean(MyClass.class);
31.13. 通过 JMS 请求代表
Camel 支持通过 JMS 重新请求请求。在向 JMS 队列发送消息时,交换的 MEP 应该为 InOut
。
Camel 提供了多个选项来配置请求/对 JMS 的影响,它们会影响性能和集群环境。下表总结了选项。
选项 | 性能 | 集群 | 描述 |
---|---|---|---|
| 速度快 | 是 |
临时队列用作回复队列,并由 Camel 自动创建。要使用它,不要指定 replyTo 队列名称。另外,您还可以配置 |
| slow | 是 |
共享持久性队列用作回复队列。必须事先创建队列,但有些代理可以在实时(如 Apache ActiveMQ)上创建它们。要使用此功能,您必须指定 replyTo 队列名称。另外,您还可以配置 |
| 速度快 | 否(是) |
专用持久队列用作回复队列。必须事先创建队列,但有些代理可以在实时(如 Apache ActiveMQ)上创建它们。要使用此功能,您必须指定 replyTo 队列名称。必须配置 |
| 速度快 | 是 |
允许使用并发消息监听程序同时处理回复消息。您可以使用 |
| 速度快 | 是 |
允许使用并发消息监听程序同时处理回复消息。您可以使用 |
JmsProducer
检测到 InOut
,并提供带有要使用的回复目的地的 JMSReplyTo
标头。默认情况下,Camel 使用临时队列,但您可以使用端点上的 replyTo
选项指定固定的回复队列(请参阅以下有关固定回复队列的更多信息)。
Camel 将自动设置侦听回复队列的消费者,因此 您不应该 执行任何操作。
此消费者是一个 Spring DefaultMessageListenerContainer
,它侦听回复。但是,它被固定到 1 个并发消费者。
这意味着回复将按顺序处理,因为只有 1 个线程来处理回复。您可以使用 concurrentConsumers
和 maxConcurrentConsumers
选项将监听程序配置为使用并发线程。这可让您更轻松地在 Camel 中配置此功能,如下所示:
from(xxx) .inOut().to("activemq:queue:foo?concurrentConsumers=5") .to(yyy) .to(zzz);
在这个路由中,我们指示 Camel 使用具有 5 个线程的线程池异步路由回复。
31.13.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)
如果您在集群环境中运行,则适用相同。然后,集群中的每个节点都必须使用唯一的回复队列名称。否则,集群中的每个节点可能会获取旨在作为另一节点上的回复的信息。对于集群环境,建议您使用共享回复队列。
31.14. 在发送方和接收器之间同步时钟
在系统间进行消息传递时,最好系统具有同步时钟。例如,发送 JMS 消息时,您可以在消息上设置生存时间。然后接收器可以检查这个值,并确定消息是否已过期,从而丢弃消息而不是消耗和处理。但是,这需要发送方和接收器都同步时钟。如果使用 ActiveMQ,您可以使用 timestamp 插件来 同步时钟。
31.15. 关于生存时间
首先阅读有关同步时钟的上面。
当您使用 Camel 通过 JMS 进行请求/回复(InOut)时,Camel 会在发送方端使用超时,这是 requestTimeout
选项的默认 20 秒。您可以通过设置更高的/低值来控制这个值。但是,在正在发送的消息上仍然设置了实时值的时间。因此,这需要在系统之间同步时钟。如果没有,您可能需要禁用要设置的实时值的时间。现在,可以使用 Camel 2.8 中的 disableTimeToLive
选项。因此,如果您将此选项设置为 disableTimeToLive=true
,则 Camel 在发送 JMS 消息时 不会将 任何时间设置为 live 值。但是,请求超时仍处于活动状态。例如,如果您对 JMS 进行请求/回复,并且禁用了生存时间,则 Camel 仍然将使用 20 秒的超时( requestTimeout
选项)。也可以配置该选项。因此,两个选项 requestTimeout
和 disableTimeToLive
可让您在执行请求/回复时进行精细控制。
您可以在消息中提供标头来覆盖并用作请求超时值,而不是端点配置的值。例如:
from("direct:someWhere") .to("jms:queue:foo?replyTo=bar&requestTimeout=30s") .to("bean:processReply");
在上面的路由中,我们有一个端点配置的 requestTimeout
为 30 秒。因此,Camel 将等待 30 秒,以便该回复消息回到栏队列中。如果没有收到回复消息,则在 Exchange 上设置 org.apache.camel.ExchangeTimedOutException
,Camel 会继续路由消息,然后因为异常而失败,Camel 的错误处理程序响应。
如果要使用每个消息超时值,您可以使用键 org.apache.camel.component.jms.JmsConstants114JMS_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 不会将 任何时间设置为消息上的实时值。您可以使用 timeToLive
选项配置值。例如,要指定 5 秒,您可以设置 timeToLive=5000
。选项 disableTimeToLive
可用于强制禁用生存时间,也用于 InOnly messaging。requestTimeout
选项不用于 InOnly messaging。
31.16. 启用 Transacted Consumption
常见要求是从事务中的队列消耗,然后使用 Camel 路由处理消息。要做到这一点,只要确保在组件/端点上设置以下属性:
-
transacted
= true -
transactionManager
= Transsaction Manager - 通常是JmsTransactionManager
详情请查看 Transactional Client EIP 模式。
与 JMS 相比,事务和 [Request Reply]
当通过 JMS 使用 Request Reply 时,您不能使用单个事务;在执行提交前,JMS 不会发送任何消息,因此服务器端不会完全接收任何内容,直到事务提交为止。因此,要使用 Request Reply,您必须在发送请求后提交事务,然后使用单独的事务接收响应。
要解决这个问题,JMS 组件使用不同的属性来指定用于单向消息传递和请求回复消息传递的事务:
transacted
属性只适用于 InOnly message Exchange Pattern (MEP)。
您可以使用组件/端点中的以下属性利用 DMLC 转换的会话 API :
-
transacted
= true -
lazyCreateTransactionManager
= false
这样做的好处在于,在使用没有配置的 TransactionManager 的本地事务时,会遵循 cacheLevel 设置。配置 TransactionManager 时,在 DMLC 级别不需要缓存,需要依赖于池的连接工厂。有关此类设置的详情,请查看 此处 和 此处。
31.17. 使用 JMSReplyTo 进行 late 回复
当使用 Camel 作为 JMS 侦听器时,它会使用 ReplyTo javax.jms.Destination
对象的值设置 Exchange 属性,其键为 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."); } }
31.18. 使用请求超时
在以下示例中,我们发送了一个 Request Reply 风格的消息 Exchange (我们使用 requestBody
method = InOut
)到 slow 队列以便在 Camel 中进一步处理,然后等待返回回复:
31.19. 发送 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
标头。
31.20. 在目的地上设置 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"); } });
31.21. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 jms 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jms-starter</artifactId> </dependency>
组件支持 99 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.jms.accept-messages-while-stopping | 指定消费者在停止时是否接受消息。如果您在运行时启动和停止 JMS 路由,则可能会考虑启用此选项,同时仍然在队列中排队消息。如果此选项为 false,并且您停止 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试 redeliveries (但可能会再次拒绝),最终消息可能会移到 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,允许 DefaultMessageListenerContainer.runningAllowed 标志在 JmsConfigurationVirtualMachineisAcceptMessagesWhileStopping 时快速停止,并且 org.apache.camel.CamelContext 当前已停止。在常规 JMS 用户中默认启用这种快速停止功能,但要为回复管理器启用这个标志。 | false | 布尔值 |
camel.component.jms.allow-serialized-headers | 控制是否包含序列化标头。仅在 transferExchange 为 true 时才适用。这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。 | false | 布尔值 |
camel.component.jms.always-copy-message | 如果为 true,则 Camel 始终会在消息传递给发送的制作者时生成 JMS 消息副本。在某些情况下需要复制消息,如设置 replyToDestinationSelectorName 时(如果设置了 replyToDestinationSelectorName,则 Camel 会将 alwaysCopyMessage 选项设置为 true)。 | false | 布尔值 |
camel.component.jms.artemis-consumer-priority | 通过消费者优先级,您可以确保高优先级消费者在消息处于活跃状态时收到消息。通常,连接到队列的活动消费者以轮循方式从它接收消息。当使用消费者优先级时,如果有多个具有相同高优先级的活跃用户,则消息将进行循环发送。只有高优先级消费者没有可用的信用消息或高优先级消费者接受消息时,消息才会降低优先级较低的消费者(例如,它不符合与消费者关联的任何选择器的条件)。 | 整数 | |
camel.component.jms.artemis-streaming-enabled | 是否针对 Apache Artemis 流模式进行优化。这可减少使用带有 JMS StreamMessage 类型的 Artemis 时的内存开销。只有在使用 Apache Artemis 时,才必须启用这个选项。 | false | 布尔值 |
camel.component.jms.async-consumer | JmsConsumer 是否异步处理交换。如果启用,JmsConsumer 可以从 JMS 队列中提取下一个消息,而上一个消息则异步处理(通过 Asynchronous Routing Engine)。这意味着消息可能没有完全严格按照顺序进行处理。如果禁用(作为默认),则在 JmsConsumer 会从 JMS 队列中提取下一个消息前,会完全处理交换。请注意,如果启用了 transacted,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 必须支持 async 事务)。 | false | 布尔值 |
camel.component.jms.async-start-listener | 在启动路由时,是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法获得连接到远程 JMS 代理的连接,那么在重试和/或故障切换时可能会阻断它。这将使 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用异步模式的专用线程连接到 JMS 代理。如果使用这个选项,请注意,如果没有建立连接,则会在 WARN 级别记录异常,使用者将无法接收消息;然后,您可以重启路由来重试。 | false | 布尔值 |
camel.component.jms.async-stop-listener | 在停止路由时,是否异步停止 JmsConsumer 消息监听程序。 | false | 布尔值 |
camel.component.jms.auto-startup | 指定消费者容器是否应自动启动。 | true | 布尔值 |
camel.component.jms.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.jms.cache-level | 根据 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 连接实例使用。它通常只适用于持久主题订阅。如果使用 Apache ActiveMQ,您可能更喜欢使用 Virtual Topics。 | 字符串 | |
camel.component.jms.concurrent-consumers | 指定从 JMS 消耗时的默认并发消费者数量(而不是通过 JMS 请求/回复)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/缩减。当通过 JMS 执行 request/reply 时,选项 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 之一。消费者类型决定要使用的 Spring JMS 侦听器。默认将使用 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 带有最佳值 - 缓存线程池)。如果没有设置,则默认为之前的行为,它将缓存线程池用于消费者端点,而 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 registry 中查找实际目的地)。选项是一个 org.springframework.jms.support.destination.DestinationResolver 类型。 | DestinationResolver | |
camel.component.jms.disable-reply-to | 指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目的地发送回复。如果您希望 Camel 从路由中消耗,并且您不希望 Camel 自动发送回复消息,则可以使用此选项,因为代码中的另一个组件处理回复消息。如果要在不同的消息代理之间将 Camel 用作代理,并且希望将消息从一个系统路由到另一个系统,也可以使用此选项。 | false | 布尔值 |
camel.component.jms.disable-time-to-live | 使用这个选项强制禁用时间。例如,当您通过 JMS 进行请求/回复时,Camel 默认使用 requestTimeout 值作为发送的消息的时间。问题是,发送者和接收器系统必须同步其时钟,因此它们正在同步。这并非始终易于归档。因此,您可以使用 disableTimeToLive=true 来不设置发送消息上的生存时间。然后,消息不会在接收器系统中过期。如需了解更多详细信息,请参见以下部分关于生存时间。 | false | 布尔值 |
camel.component.jms.durable-subscription-name | 用于指定持久主题订阅的可配置订阅者名称。还必须配置 clientId 选项。 | 字符串 | |
camel.component.jms.eager-loading-of-properties | 加载消息时立即启用 JMS 属性和有效负载的 eager 加载,因为 JMS 属性可能并不是必需的,但有时可能会捕获与底层 JMS 提供程序和使用 JMS 属性的早期问题。另请参阅选项 eagerPoisonBody。 | false | 布尔值 |
camel.component.jms.eager-poison-body | 如果启用了 eagerLoadingOfProperties,并且 JMS 消息有效负载(JMS 正文或 JMS 属性)是 poison (无法读取/映射),然后将这个文本设置为消息正文,因此可以处理消息( poison 的原因)已作为交换异常保存。这可以通过设置 eagerPoisonBody=false 来关闭。另请参阅 eagerLoadingOfProperties 选项。 | Poison JMS 消息,因为 $\{exception.message} | 字符串 |
camel.component.jms.enabled | 是否启用 jms 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.jms.error-handler | 指定在处理消息时引发任何未发现异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些例外将在 WARN 级别记录。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStack Trace 选项记录堆栈追踪。这样可以更容易配置,而不是需要对自定义错误处理程序进行代码。选项是一个 org.springframework.util.ErrorHandler 类型。 | ErrorHandler | |
camel.component.jms.error-handler-log-stack-trace | 允许通过默认错误处理程序来控制是否应记录 stacktraces。 | true | 布尔值 |
camel.component.jms.error-handler-logging-level | 允许为日志记录 uncaught 异常配置默认 errorHandler 日志记录级别。 | LoggingLevel | |
camel.component.jms.exception-listener | 指定针对任何底层 JMS 异常通知的 JMS Exception Listener。选项是 javax.jms.ExceptionListener 类型。 | ExceptionListener | |
camel.component.jms.explicit-qos-enabled | 设置在发送消息时使用 deliveryMode、priority 或 timeToLive 数量服务。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项(按消息粒度运行)相反,从 Camel In 消息标头中读取 QoS 属性。 | false | 布尔值 |
camel.component.jms.expose-listener-session | 指定在消耗消息时是否应公开监听程序会话。 | false | 布尔值 |
camel.component.jms.force-send-original-message | 当使用 mapJmsMessage=false Camel 时,如果在路由中涉及标头(get 或 set),则会创建一个新的 JMS 消息来发送到新的 JMS 目的地。将此选项设置为 true,以强制 Camel 发送收到的原始 JMS 消息。 | false | 布尔值 |
camel.component.jms.format-date-headers-to-iso8601 | 根据 ISO 8601 标准设置 JMS 日期属性是否应格式化。 | 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 Message 映射时,是否包含所有 JMSXxxx 属性。把它设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则不会应用这个选项。 | false | 布尔值 |
camel.component.jms.include-sent-j-m-s-message-i-d | 仅在使用 InOnly 发送到 JMS 目的地时适用(例如触发和忘记)。启用此选项将增强 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID。 | false | 布尔值 |
camel.component.jms.jms-key-format-strategy | 编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供两个开箱即用的实现:default 和 passthrough。默认策略将安全地使用句点和连字符(. 和 -)。passthrough 策略将密钥保留原样。可用于不负责 JMS 标头密钥是否包含非法字符的 JMS 代理。您可以自行提供 org.apache.camel.component.jms.JmsKeyFormatStrategy 的实现,并使用 sVirt 表示法引用它。 | 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),则可以使用此选项将值设为 100,以控制消费者在需要较少的工作时可以缩小的速度。 | -1 | 整数 |
camel.component.jms.message-converter | 使用自定义 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。选项是一个 org.springframework.jms.support.converter.MessageConverter 类型。 | MessageConverter | |
camel.component.jms.message-created-strategy | 使用给定的 MessageCreatedStrategy,当 Camel 发送 JMS 消息时,Camel 创建 javax.jms.Message 对象的新实例。选项是一个 org.apache.camel.component.jms.MessageCreatedStrategy 类型。 | MessageCreatedStrategy | |
camel.component.jms.message-id-enabled | 发送时,指定是否应添加消息 ID。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将消息 ID 设置为 null;如果提供程序忽略提示,则必须将消息 ID 设置为其普通唯一值。 | true | 布尔值 |
camel.component.jms.message-listener-container-factory | MessageListenerContainerFactory 的 registry ID,用于决定要使用消息的 org.springframework.jms.listener.AbstractMessageListenerContainer。设置此项将自动将 consumerType 设置为 Custom。选项是 org.apache.camel.component.jms.MessageListenerContainerFactory 类型。 | MessageListenerContainerFactory | |
camel.component.jms.message-timestamp-enabled | 指定在发送消息时是否默认启用时间戳。这只是对 JMS 代理的提示。如果 JMS 提供程序接受此提示,则这些消息必须将时间戳设置为零;如果提供程序忽略提示,则必须将时间戳设置为其正常值。 | true | 布尔值 |
camel.component.jms.password | 与 ConnectionFactory 一起使用的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。 | 字符串 | |
camel.component.jms.preserve-message-qos | 如果要使用消息中指定的 QoS 设置来发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中一些。如果没有提供,Camel 将回退到使用端点中的值。因此,在使用此选项时,标头会覆盖端点中的值。与之相反,clearQosEnabled 选项将仅使用端点上设置的选项,而不使用来自消息标头中的值。 | 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 用于专用或共享的 w/ replyToSelectorName。和 CACHE_SESSION 用于没有 replyToSelectorName 的共享。IBM WebSphere 等 JMS 代理可能需要设置 replyToCacheLevelName=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 | 允许明确指定在执行 request/reply 时要用于 replyTo 队列的策略类型。可能的值有:Temporary、share 或 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 类型是否已启用。流类型的消息有效负载(如 files、InStream 等)将通过作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪种类型。默认情况下,使用 BytesMessage 来强制整个消息有效负载读取到内存中。通过启用此选项,消息有效负载以块的形式读取到内存中,然后每个块都会写入 StreamMessage,直到没有更多数据。 | false | 布尔值 |
camel.component.jms.subscription-durable | 设置是否使订阅持久化。可使用的 durable 订阅名称通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册持久订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。 | false | 布尔值 |
camel.component.jms.subscription-name | 设置要创建的订阅名称。在带有共享或可升级订阅的主题(公共域)中应用。订阅名称需要在此客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注: 每个订阅都只允许 1 个并发消费者(这是此消息侦听器容器的默认值),但一个共享订阅(需要 JMS 2.0)除外。 | 字符串 | |
camel.component.jms.subscription-shared | 设置是否共享订阅。可以使用的共享订阅名称可以通过 subscriptionName 属性指定。默认值为 false。把它设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称足以满足订阅名称)。请注意,共享的订阅也可能是危险的,因此此标志也可以与订阅相结合。仅在侦听主题(pub-sub 域)时有意义,因此此方法也会切换 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。 | false | 布尔值 |
camel.component.jms.synchronous | 设置是否应严格使用同步处理。 | false | 布尔值 |
camel.component.jms.task-executor | 允许您指定自定义任务执行器以使用消息。选项是一个 org.springframework.core.task.TaskExecutor 类型。 | TaskExecutor | |
camel.component.jms.test-connection-on-startup | 指定是否在启动时测试连接。这样可确保 Camel 启动所有 JMS 用户与 JMS 代理的有效连接。如果无法授予连接,则 Camel 会在启动时抛出异常。这样可确保 Camel 没有使用失败的连接启动。JMS producer 也经过测试。 | false | 布尔值 |
camel.component.jms.time-to-live | 发送消息时,指定消息的时间到时间(以毫秒为单位)。 | -1 | Long |
camel.component.jms.transacted | 指定是否使用转换模式。 | false | 布尔值 |
camel.component.jms.transacted-in-out | 指定 InOut 操作(请求回复)是否默认使用 transacted 模式,如果此标志被设置为 true,则 Spring JmsTemplate 将把 sessionTransacted 设置为 true,而 confirmMode 作为转换用于 InOut 操作。请注意:在 JTA 事务中,传递给 createQueue 的参数不会考虑 createTopic 方法。根据 Java EE 事务上下文,容器对这些值做出自己的决策。类似地,这些参数不会考虑本地管理的事务,因为 Spring JMS 在这种情况下在现有 JMS 会话上运行。在受管事务外运行时,将此标志设置为 true 将使用简短的本地 JMS 事务,并在存在受管事务(除 XA 事务之外)时同步的本地 JMS 事务。这与主事务一起管理本地 JMS 事务(可能是原生 JDBC 事务)的影响,在主事务后 JMS 事务提交右侧的 JMS 事务。 | false | 布尔值 |
camel.component.jms.transaction-manager | 要使用的 Spring 事务管理器。选项是一个 org.springframework.transaction.platformTransactionManager 类型。 | PlatformTransactionManager | |
camel.component.jms.transaction-name | 要使用的事务的名称。 | 字符串 | |
camel.component.jms.transaction-timeout | 如果使用转换模式,事务的超时值(以秒为单位)。 | -1 | 整数 |
camel.component.jms.transfer-exception | 如果启用了且您使用 Request Reply messaging (InOut),并且 Exchange 失败在消费者端,则原因例外将作为 javax.jms.ObjectMessage 发回的响应。如果客户端是 Camel,则返回的例外将重新箭头。这样,您可以使用 Camel JMS 作为路由中的桥接 - 例如,使用持久性队列来启用强大的路由。请注意,如果您也启用了 transferExchange,这个选项将具有优先权。caught 异常需要可以被序列化。消费者端的原始例外可以嵌套在外部异常中,如 org.apache.camel.RuntimeCamelException。请谨慎使用它,因为数据正在使用 Java 对象序列化,要求接收者在类级别反序列化数据,这会强制在生产者和消费者之间进行强校准。 | false | 布尔值 |
camel.component.jms.transfer-exchange | 您可以在有线线上传输交换,而不只是正文和标头。以下字段会被传输: 在 body, Out body, Fault body, In headers, Out headers, Fault header, 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 | 在执行 request/reply over JMS 以及启用了 useMessageIDAsCorrelationID 时,等待 provisional correlation id 被更新到实际关联 ID 的次数。 | 50 | 整数 |
camel.component.jms.wait-for-provision-correlation-to-be-updated-thread-sleeping-time | 等待置备关联 ID 时每次休眠的时间间隔(以秒为单位)。选项是一个长类型。 | 100 | Long |
第 32 章 JPA
从 Camel 1.0 开始
支持生成者和消费者。
JPA 组件可让您使用 EJB 3 的 Java Persistence 架构(DSL)从持久性存储存储和检索 Java 对象。Java Persistence 架构(DSL)是一种标准接口层,它打包 Object/Relational Mapping (ORM)产品,如 Open the Hibernate, Hibernate, TopLink。
将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jpa</artifactId> <version>3.20.1.redhat-00031</version> <!-- use the same version as your Camel core version --> </dependency>
32.1. 发送到端点
您可以通过将 Java 实体 Bean 发送到 JPA producer 端点,将其存储在数据库中。In
消息正文假定为实体 Bean (即,包含 @Entity 注解的 POJO)或实体 Bean 集合或数组。
如果正文是实体列表,请使用 entityType=java.util.List
作为传递给制作者端点的配置。
如果正文不包含以上列出的类型之一,请在端点首先执行必要的转换前放置 Message Translator。
您还可以将名为Query 的查询
、名为Query
或 nativeQuery
用于生成者。对于 参数的值
,您可以使用简单表达式从 Message body、标头等检索参数值。这些查询可用于通过 SELECT
JPQL/SQL 语句来检索一组数据,并使用 UPDATE
/DELETE
JPQL/SQL 语句执行批量更新/删除。请注意,如果您执行 名为Query
的 UPDATE
/DELETE
,则您需要将 useExecuteUpdate
指定为 true
,因为 camel 不会查看命名的 查询
与查询和 原生Query
不同。
32.2. 从端点消耗
从 JPA consumer 端点消耗消息会删除(或更新)数据库中的实体 Bean。这可让您将数据库表用作逻辑队列:消费者从队列中获取消息,然后删除/更新它们以逻辑地将其从队列中删除。
如果您不想在处理实体 Bean 时删除它(在路由完成后),您可以在 URI 中指定 consumeDelete=false
。这将导致实体处理每个轮询。
如果您想对实体执行一些更新,将其标记为已处理(例如,从将来的查询中排除它),您可以使用 @Consumed 注解方法,它会在实体 Bean 被处理时调用它。
您可以使用 @PreConsumed,它会在处理前在实体 bean 上调用(在路由之前)。
如果您消耗了大量行(100K+),且遇到 OutOfMemory 问题,您应该将 maxResults 设置为 sensable 值。
32.3. URI 格式
jpa:entityClassName[?options]
对于发送到端点,entityClassName
是可选的。如果指定,它可以帮助 Type Converter来确保正文是正确的类型。
为消耗,entityClassName
是必须的。
32.4. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
32.4.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
32.4.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
32.4.3. 组件选项
JPA 组件支持 9 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
alias (common) | 将别名映射到 JPA 实体类。然后可在端点 URI 中使用别名(而不是完全限定的类名称)。 | Map | |
entityManagerFactory (common) | 使用 EntityManagerFactory。强烈建议您进行配置。 | EntityManagerFactory | |
加入事务 (common) | camel-jpa 组件默认将加入事务。您可以使用此选项关闭此选项,例如,如果您使用 LOCAL_RESOURCE 并加入事务无法与您的 JPA 供应商一起使用。这个选项也可以在 JpaComponent 上全局设置,而不必在所有端点上设置它。 | true | 布尔值 |
sharedEntityManager (common) | 是否将 Spring 的 SharedEntityManager 用于 consumer/producer。请注意,在大多数情况下,加入事务应设为 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 | 布尔值 |
32.4.4. 端点选项
JPA 端点使用 URI 语法进行配置:
jpa:entityType
使用以下路径和查询参数:
32.4.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
entityType (common) | 所需的 实体类名称。 | 类 |
32.4.4.2. 查询参数(44 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
加入事务 (common) | camel-jpa 组件默认将加入事务。您可以使用此选项关闭此选项,例如,如果您使用 LOCAL_RESOURCE 并加入事务无法与您的 JPA 供应商一起使用。这个选项也可以在 JpaComponent 上全局设置,而不必在所有端点上设置它。 | true | 布尔值 |
maximumResults (common) | 设置在 Query 上检索的最大结果数。 | -1 | int |
namedQuery (common) | 使用命名的查询: | 字符串 | |
nativeQuery (common) | 使用自定义原生查询。在使用原生查询时,您可能还希望使用 resultClass 选项。 | 字符串 | |
persistenceUnit (common) | 必需 默认使用的 JPA 持久性单元。 | camel | 字符串 |
query (common) | 使用自定义查询,请执行以下操作: | 字符串 | |
resultClass (common) | 定义返回的有效负载的类型(we will call 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 值:
| ExchangePattern | |
参数 (consumer (advanced)) | 此键/值映射用于构建查询参数。它应该是通用类型 java.util.Map,其中键是给定 JPA 查询的命名参数,值是您要选择它们的对应有效值。当它用于制作者时,可将简单表达式用作参数值。它允许您从消息正文、标头等检索参数值。 | Map | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
findEntity (producer) | 如果启用,则制作者将使用消息正文作为 key 和 entityType 作为类类型来查找单个实体。这可用而不是查询来查找单个实体。 | false | 布尔值 |
flushOnSend (producer) | 在实体 Bean 保留后清除 EntityManager。 | true | 布尔值 |
remove (producer) | 表示使用 entityManager.remove (entity)。 | false | 布尔值 |
useExecuteUpdate (producer) | 配置在制作者执行查询时使用 executeUpdate ()。当使用 INSERT、UPDATE 或 DELETE 语句作为命名查询时,您需要将这个选项指定为 'true'。 | 布尔值 | |
usePersist (producer) | 表示使用 entityManager.persist (entity)而不是 entityManager.merge (entity)。注意: EntityManager.persist (entity)不适用于分离实体(其中 EntityManager 必须执行 UPDATE 而不是 INSERT 查询)!。 | false | 布尔值 |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
usePassedInEntityManager (producer (advanced)) | 如果设置为 true,则 Camel 将使用标头 JpaConstants.ENTITY_MANAGER 中的 EntityManager,而不是组件/端点上配置的实体管理器。这允许最终用户控制将使用哪些实体管理器。 | false | 布尔值 |
entityManagerProperties (advanced) | 要使用的实体管理器的其他属性。 | Map | |
sharedEntityManager (advanced) | 是否将 Spring 的 SharedEntityManager 用于 consumer/producer。请注意,在大多数情况下,加入事务应设为 false,因为这不是 EXTENDED EntityManager。 | 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 | 布尔值 |
32.5. 消息标头
JPA 组件支持 2 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelEntityManager (common) 常数: ENTITY_MANAGER | JPA EntityManager 对象。 | EntityManager | |
CamelJpaParameters (producer) 常量:link: JPA_PARAMETERS_HEADER | 将查询参数作为 Exchange 标头传递的替代方法。 | Map |
32.6. 配置 EntityManagerFactory
建议将 JPA 组件配置为使用特定的 EntityManagerFactory
实例。如果这样做失败,每个 JpaEndpoint
将自动创建自己的 EntityManagerFactory
实例,这通常是您想要的。
例如,您可以实例化一个 JPA 组件来引用 myEMFactory
实体管理器工厂,如下所示:
<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent"> <property name="entityManagerFactory" ref="myEMFactory"/> </bean>
JpaComponent
会自动从 Registry 中查找 EntityManagerFactory
,这意味着您不需要在 JpaComponent
上配置它,如上所示。只有在存在不确定的情况时,您只需要这样做,在这种情况下,Camel 将记录一个 WARN。
32.7. 配置 TransactionManager
JpaComponent
会自动从 Registry 中查找 TransactionManager
。如果 Camel 找不到注册的任何 TransactionManager
实例,它将查找 TransactionTemplate
,并尝试从中提取 TransactionManager
。
如果 registry 中没有 TransactionTemplate
,JpaEndpoint
将自动创建自己的 TransactionManager
实例,这通常是您想要的。
如果找到了超过 TransactionManager
的单个实例,Camel 将记录 WARN。在这种情况下,您可能想要实例化和明确配置引用 myTransactionManager
事务管理器的 JPA 组件,如下所示:
<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent"> <property name="entityManagerFactory" ref="myEMFactory"/> <property name="transactionManager" ref="myTransactionManager"/> </bean>
32.8. 使用带有命名查询的消费者
对于仅使用所选实体,您可以使用 namedQuery
URI 查询选项。首先,您必须在 JPA Entity 类中定义命名查询:
@Entity @NamedQuery(name = "step1", query = "select x from MultiSteps x where x.step = 1") public class MultiSteps { ... }
之后,您可以定义一个消费者 uri,如下所示:
from("jpa://org.apache.camel.examples.MultiSteps?namedQuery=step1") .to("bean:myBusinessLogic");
32.9. 使用带有查询的消费者
对于仅使用所选实体,您可以使用 查询
URI 查询选项。您只需要定义查询选项:
from("jpa://org.apache.camel.examples.MultiSteps?query=select o from org.apache.camel.examples.MultiSteps o where o.step = 1") .to("bean:myBusinessLogic");
32.10. 使用带有原生查询的消费者
对于仅使用所选实体,您可以使用 nativeQuery
URI 查询选项。您只需要定义原生查询选项:
from("jpa://org.apache.camel.examples.MultiSteps?nativeQuery=select * from MultiSteps where step = 1") .to("bean:myBusinessLogic");
如果使用 native 查询选项,您将收到消息正文中的对象数组。
32.11. 使用带有命名查询的制作者
要检索所选实体或执行批量更新/删除,您可以使用 namedQuery
URI 查询选项。首先,您必须在 JPA Entity 类中定义命名查询:
@Entity @NamedQuery(name = "step1", query = "select x from MultiSteps x where x.step = 1") public class MultiSteps { ... }
之后,您可以定义一个制作者 uri,如下所示:
from("direct:namedQuery") .to("jpa://org.apache.camel.examples.MultiSteps?namedQuery=step1");
请注意,您需要将 useExecuteUpdate
选项指定为 true
来执行 UPDATE
/DELETE
语句作为命名的查询。
32.12. 使用带有查询的制作者
要检索所选实体或执行批量更新/删除,您可以使用 查询
URI 查询选项。您只需要定义查询选项:
from("direct:query") .to("jpa://org.apache.camel.examples.MultiSteps?query=select o from org.apache.camel.examples.MultiSteps o where o.step = 1");
32.13. 使用带有原生查询的制作者
要检索所选实体或执行批量更新/删除,您可以使用 nativeQuery
URI 查询选项。您只需要定义原生查询选项:
from("direct:nativeQuery") .to("jpa://org.apache.camel.examples.MultiSteps?resultClass=org.apache.camel.examples.MultiSteps&nativeQuery=select * from MultiSteps where step = 1");
如果您使用原生查询选项而不指定 resultClass
,您将在消息正文中收到对象数组。
32.14. 使用 JPA-Based Idempotent 仓库
EIP 模式中的 Idempotent Consumer 用于过滤掉重复的消息。提供了基于 JPA 的幂等存储库。
使用基于 JPA 的幂等存储库。
流程
-
在 persistence.xml 文件中设置
persistence-unit
。 -
设置
org.springframework.orm.jpa.JpaTemplate
,供org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository
使用。 - 配置错误格式宏: snippet: java.lang.IndexOutOfBoundsException: Index: 20, Size: 20
-
将幂等存储库配置为
org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository
。 - 在 Spring XML 文件中创建 JPA 幂等存储库,如下所示:
<camelContext xmlns="http://camel.apache.org/schema/spring"> <route id="JpaMessageIdRepositoryTest"> <from uri="direct:start" /> <idempotentConsumer idempotentRepository="jpaStore"> <header>messageId</header> <to uri="mock:result" /> </idempotentConsumer> </route> </camelContext>
在 IDE 中运行此 Camel 组件测试时
如果您直接在 IDE 中运行 此组件 的测试,而不是通过 Maven,您可以看到如下例外:
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is <openjpa-2.2.1-r422266:1396819 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: "org.apache.camel.examples.SendEmail". at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:427) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:127) at org.apache.camel.processor.jpa.JpaRouteTest.cleanupRepository(JpaRouteTest.java:96) at org.apache.camel.processor.jpa.JpaRouteTest.createCamelContext(JpaRouteTest.java:67) at org.apache.camel.test.junit5.CamelTestSupport.doSetUp(CamelTestSupport.java:238) at org.apache.camel.test.junit5.CamelTestSupport.setUp(CamelTestSupport.java:208)
这里的问题是源已通过 IDE 编译或重新编译,而不是通过 Maven 进行编译 ,这会在构建时增强字节代码。要克服这一点,您需要启用 Open Liberty 的动态字节代码增强。例如,假设 Camel 中使用的当前 Open the 版本为 2.2.1,要在 IDE 中运行测试,您需要将以下参数传递给 JVM:
-javaagent:<path_to_your_local_m2_cache>/org/apache/openjpa/openjpa/2.2.1/openjpa-2.2.1.jar
32.15. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 jpa 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jpa-starter</artifactId> </dependency>
组件支持 10 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.jpa.aliases | 将别名映射到 JPA 实体类。然后可在端点 URI 中使用别名(而不是完全限定的类名称)。 | Map | |
camel.component.jpa.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.jpa.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.jpa.enabled | 是否启用 jpa 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.jpa.entity-manager-factory | 使用 EntityManagerFactory。强烈建议您进行配置。选项是 javax.persistence.EntityManagerFactory 类型。 | EntityManagerFactory | |
camel.component.jpa.join-transaction | camel-jpa 组件默认将加入事务。您可以使用此选项关闭此选项,例如,如果您使用 LOCAL_RESOURCE 并加入事务无法与您的 JPA 供应商一起使用。这个选项也可以在 JpaComponent 上全局设置,而不必在所有端点上设置它。 | true | 布尔值 |
camel.component.jpa.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.jpa.shared-entity-manager | 是否将 Spring 的 SharedEntityManager 用于 consumer/producer。请注意,在大多数情况下,加入事务应设为 false,因为这不是 EXTENDED EntityManager。 | false | 布尔值 |
camel.component.jpa.transaction-manager | 使用 PlatformTransactionManager 管理事务。选项是一个 org.springframework.transaction.platformTransactionManager 类型。 | PlatformTransactionManager | |
camel.component.jpa.transaction-strategy | 使用 TransactionStrategy 在事务中运行操作。选项是一个 org.apache.camel.component.jpa.TransactionStrategy 类型。 | TransactionStrategy |
第 33 章 JSLT
从 Camel 3.1 开始
仅支持生成者
JSLT 组件允许您使用 JSLT 表达式处理 JSON 消息。在对 JSON 进行 JSON 转换或查询数据时,这可能是理想的选择。
将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jslt</artifactId> <version>3.20.1.redhat-00031</version> <!-- use the same version as your Camel core version --> </dependency>
33.1. URI 格式
jslt:specName[?options]
其中 specName
是要调用的规格的 classpath-local URI,或者远程规格的完整 URL (例如 file://folder/myfile.vm)。
33.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
33.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
33.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
33.2.3. 组件选项
JSLT 组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
allowTemplateFromHeader (producer) | 是否允许从标头使用资源模板(默认为 false)。启用此功能允许通过消息标头指定动态模板。但是,如果标头来自恶意用户,则可能会被视为潜在的安全漏洞,因此请小心使用。 | false | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
功能 (高级) | JSLT 可以通过插入使用 Java 编写的功能来扩展。 | 集合 | |
objectFilter (advanced) | JSLT 可以通过插入自定义 jslt 对象过滤器来扩展。 | JsonFilter |
33.2.4. 端点选项
JSLT 端点使用 URI 语法进行配置:
jslt:resourceUri
使用以下路径和查询参数:
33.2.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
resourceUri (producer) | 资源 所需的 路径。您可以使用前缀:classpath, file, http, ref, 或 bean. classpath, 文件和 http 使用这些协议(classpath 为 default)。ref 将查找 registry 中的资源。Bean 将调用要用作资源的 bean 的方法。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。 | 字符串 |
33.2.4.2. 查询参数(7 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
allowContextMapAll (producer) | 设置上下文映射是否应允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用此选项以完全访问当前 Exchange 和 CamelContext。这样做会产生潜在的安全风险,因为这会打开对 CamelContext API 完整功能的访问。 | false | 布尔值 |
allowTemplateFromHeader (producer) | 是否允许从标头使用资源模板(默认为 false)。启用此功能允许通过消息标头指定动态模板。但是,如果标头来自恶意用户,则可能会被视为潜在的安全漏洞,因此请小心使用。 | false | 布尔值 |
contentCache (producer) | 设置是否使用资源内容缓存。 | false | 布尔值 |
mapBigDecimalAsFloats (producer) | 如果为 true,则映射程序将使用 USE_BIG_DECIMAL_FOR_FLOATS in serialization 功能。 | false | 布尔值 |
ObjectMapper (producer) | 设置要使用的自定义 JSON 对象映射程序。 | ObjectMapper | |
prettyPrint (common) | 如果为 true,则输出消息中的 JSON 是用户友善打印的。 | false | 布尔值 |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
33.3. 消息标头
JSLT 组件支持 2 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelJsltString (producer) | JSLT 模板作为字符串。 | 字符串 | |
CamelJsltResourceUri (producer) | 资源 URI。 | 字符串 |
33.4. 将值传递给 JSLT
在对正文应用 JSLT 表达式时,Camel 可以以变量形式提供交换信息。Exchange 中的可用变量有:
name | value |
---|---|
标头 |
|
exchange.properties |
Exchange 属性作为 json 对象。 |
所有不能使用 Jackson 转换为 json 的值都会被拒绝,且不会在 jslt 表达式中可用。
例如,名为"type"的标头和交换属性"instance"可以访问,如下所示
{ "type": $headers.type, "instance": $exchange.properties.instance }
33.5. Samples
示例如下所示。
from("activemq:My.Queue"). to("jslt:com/acme/MyResponse.json");
和基于文件的资源:
from("activemq:My.Queue"). to("jslt:file://myfolder/MyResponse.json?contentCache=true"). to("activemq:Another.Queue");
您还可以指定组件通过标头动态使用哪些 JSLT 表达式,例如:
from("direct:in"). setHeader("CamelJsltResourceUri").constant("path/to/my/spec.json"). to("jslt:dummy?allowTemplateFromHeader=true");
或者通过标头发送整个 jslt 表达式:(用于查询的理解)
from("direct:in"). setHeader("CamelJsltString").constant(".published"). to("jslt:dummy?allowTemplateFromHeader=true");
将交换属性传递给 jslt 表达式,如下所示
from("direct:in"). to("jslt:com/acme/MyResponse.json?allowContextMapAll=true");
33.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 jslt 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jslt-starter</artifactId> </dependency>
组件支持 6 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.jslt.allow-template-from-header | 是否允许从标头使用资源模板(默认为 false)。启用此功能允许通过消息标头指定动态模板。但是,如果标头来自恶意用户,则可能会被视为潜在的安全漏洞,因此请小心使用。 | false | 布尔值 |
camel.component.jslt.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.jslt.enabled | 是否启用 jslt 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.jslt.functions | JSLT 可以通过插入使用 Java 编写的功能来扩展。 | 集合 | |
camel.component.jslt.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.jslt.object-filter | JSLT 可以通过插入自定义 jslt 对象过滤器来扩展。选项是一个 com.schibsted.spt.data.jslt.filters.JsonFilter 类型。 | JsonFilter |
第 34 章 Kafka
支持生成者和消费者
Kafka 组件用于与 Apache Kafka 消息代理通信。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-kafka</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
34.1. URI 格式
kafka:topic[?options]
34.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
34.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
34.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
34.3. 组件选项
Kafka 组件支持 104 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
additionalProperties (common) | 如果无法直接在 camel 配置(例如:新的 Kafka 属性没有反映在 Camel 配置中),则必须为 kafka consumer 或 kafka producer 设置额外的属性,属性必须使用 additionalProperties 前缀。例如: additionalProperties.transactional.id=12345&additionalProperties.schema.registry.url=http://localhost:8811/avro。 | Map | |
brokers (common) | 要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理的子集,也可以是指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。 | 字符串 | |
clientId (common) | 客户端 ID 是每个请求中发送的用户指定的字符串,以帮助追踪调用。它应该以逻辑方式识别发出请求的应用程序。 | 字符串 | |
configuration (common) | 允许使用端点将重复使用的通用选项预配置 Kafka 组件。 | KafkaConfiguration | |
HeaderFilterStrategy (common) | 使用自定义 HeaderFilterStrategy 将标头过滤到或从 Camel 消息过滤。 | HeaderFilterStrategy | |
reconnectBackoffMaxMs (common) | 当重新连接到重复无法连接的代理时,等待的最大时间(毫秒)。如果提供,每个主机的 backoff 将为每个连续的连接失败指数增加,直到最高值。计算 backoff 后,会添加 20% 随机 jitter 以避免连接停滞。 | 1000 | 整数 |
shutdownTimeout (common) | 超时时间(毫秒)以毫秒为单位等待消费者或生成者关闭并终止其 worker 线程。 | 30000 | int |
allowManualCommit (consumer) | 是否允许通过 KafkaManualCommit 手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange 消息标头中,这将允许最终用户访问这个 API,并通过 Kafka 使用者执行手动偏移提交。 | false | 布尔值 |
autoCommitEnable (consumer) | 如果为 true,请定期提交到 ZooKeeper,以偏移已由消费者获取的信息。当进程失败时,将使用此提交偏移,作为新消费者开始的位置。 | true | 布尔值 |
autoCommitIntervalMs (consumer) | 消费者偏移提交到 zookeeper 的频率。 | 5000 | 整数 |
autoCommitOnStop (consumer) | 消费者停止时是否执行显式自动提交,以确保代理有来自最近使用的消息的提交。这需要打开选项 autoCommitEnable。可能的值有: sync、syncsync 或 none。sync 是默认值。 Enum 值:
| 同步 | 字符串 |
autoOffsetReset (consumer) | 当 ZooKeeper 中没有初始偏移量时,或者偏移没有范围: earliest : 自动将偏移重置为最早的偏移 latest:自动将偏移重置为最新的偏移失败:抛出异常。 Enum 值:
| 最新 | 字符串 |
breakOnFirstError (consumer) | 此选项控制消费者处理交换且失败时会发生什么。如果选项为 false,则消费者将继续到下一个消息并处理它。如果选项为 true,则消费者会发现出导致故障的消息的偏移,然后重新尝试处理此消息。但是,如果每次绑定都失败,这可能会导致意外处理同一消息,例如一个 poison 消息。因此,建议处理这一点,例如使用 Camel 的错误处理程序。 | false | 布尔值 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
checkCrcs (consumer) | 自动检查所消耗的记录的 CRC32。这样可确保不会发生在线或磁盘崩溃信息。此检查增加了一些开销,因此在出现极端性能的情况下可能会禁用它。 | true | 布尔值 |
commitTimeoutMs (consumer) | 代码将等待同步提交完成的最长时间(以毫秒为单位)。 | 5000 | Long |
consumerRequestTimeoutMs (consumer) | 配置控制客户端等待请求响应的最长时间。如果在超时超时前未收到响应,如果需要,或者如果重试耗尽,则请求将重新发送。 | 40000 | 整数 |
consumersCount (consumer) | 连接到 kafka 服务器的消费者数量。每个消费者都在一个单独的线程上运行,用于检索和处理传入的数据。 | 1 | int |
fetchMaxBytes (consumer) | 如果获取的第一个非空分区中的第一个消息大于这个值,则服务器为 fetch 请求返回的最大数据量并非绝对的最大值。代理接受的最大消息大小通过 message.max.bytes (broker config)或 max.message.bytes (topic config)定义。请注意,使用者并行执行多个获取。 | 52428800 | 整数 |
fetchMinBytes (consumer) | 服务器为获取请求返回的最小数据量。如果数据不足,请求将在回答请求前等待该数量的数据累积。 | 1 | 整数 |
fetchWaitMaxMs (consumer) | 如果没有足够的数据立即满足 fetch.min.bytes,服务器将在回答获取请求前阻止的最大时间。 | 500 | 整数 |
GroupId (consumer) | 标识此消费者所属的消费者进程组的字符串。通过设置相同的组 id 多个进程表示它们都是同一消费者组的一部分。消费者需要这个选项。 | 字符串 | |
groupInstanceId (consumer) | 最终用户提供的消费者实例的唯一标识符。只允许非空字符串。如果设置,则消费者被视为静态成员,这意味着在任何消费者组中都只允许具有此 ID 的实例。这可以与更大的会话超时结合使用,以避免因为临时不可用(如进程重启)导致组重新平衡。如果没有设置,则消费者将作为动态成员加入组,这是传统行为。 | 字符串 | |
headerDeserializer (consumer) | 使用自定义 KafkaHeaderDeserializer 来反序列化 kafka 标头值。 | KafkaHeaderDeserializer | |
heartbeatIntervalMs (consumer) | 在使用 Kafka 的组管理功能时,心跳到消费者协调器的预期时间。心跳用于确保消费者的会话保持活动状态,并在新消费者加入或离开组时促进重新平衡。该值必须小于 session.timeout.ms,但通常不应设置高于该值的 1/3。可以调整它,以控制正常重新平衡的预期时间。 | 3000 | 整数 |
keyDeserializer (consumer) | 实施 Deserializer 接口的密钥反序列化类。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
maxPartitionFetchBytes (consumer) | 服务器将返回的最大每个分区的数据量。用于请求的最大内存总量为 192.168.1.0/24partitions max.partition.fetch.bytes。这个大小必须至少与服务器允许的最大消息大小相同,否则生成者可以发送大于消费者的消息。如果发生这种情况,使用者可能会卡住尝试在某个分区中获取大量消息。 | 1048576 | 整数 |
maxPollIntervalMs (consumer) | 使用消费者组管理时调用 poll ()的最大延迟。这会在获取更多记录前,在消费者闲置的时间上放置上限。如果在超时过期前没有调用 poll (),则消费者被视为失败,组将重新平衡,以便将分区重新分配给另一个成员。 | Long | |
maxPollRecords (consumer) | 单个调用中返回到 poll ()中返回的最大记录数。 | 500 | 整数 |
offsetRepository (consumer) | 用于本地存储主题的每个分区的偏移程序库。定义一个将禁用自动提交。 | StateRepository | |
partitionAssignor (consumer) | 使用组管理时,客户端将使用分区分配策略的类名称,在消费者实例之间分发分区所有权。 | org.apache.kafka.clients.consumer.RangeAssignor | 字符串 |
pollOnError (consumer) | 如果 kafka 在轮询新消息时异常,则该怎么办。除非在端点级别上配置了显式值,否则默认使用组件配置中的值。DISCARD 将丢弃消息并继续轮询下一个消息。ERROR_HANDLER 将使用 Camel 的错误处理程序来处理异常,然后继续轮询下一个消息。RECONNECT 将重新连接消费者,并尝试再次轮询 RETRY,以便消费者再次重试同一消息,STOP 将停止消费者(如果消费者应该再次消耗消息,则应手动启动/重新启动)。 Enum 值:
| ERROR_HANDLER | PollOnError |
pollTimeoutMs (consumer) | 轮询 KafkaConsumer 时使用的超时。 | 5000 | Long |
resumeStrategy (consumer) | 这个选项允许用户设置自定义恢复策略。恢复策略会在分配分区时执行(例如:连接或重新连接)。它允许实现自定义如何恢复操作,并更灵活替代 seekTo 和 offsetRepository 机制。有关实现详情,请参阅 KafkaConsumerResumeStrategy。此选项不会影响自动提交设置。使用此设置的实现可能还希望使用手动提交选项进行评估。 | KafkaConsumerResumeStrategy | |
seekTo (consumer) | 设置 KafkaConsumer 将在启动时从开始或结束读取:start : read from end : read from end this is replace the previous attributes seekToBeginning。 Enum 值:
| 字符串 | |
sessionTimeoutMs (consumer) | 使用 Kafka 组管理功能时检测失败的超时。 | 10000 | 整数 |
specificAvroReader (consumer) | 这可让特定的 Avro reader 与 Confluent Platform schema registry 和 io.confluent.kafka.serializers.KafkaAvroDeserializer 搭配使用。这个选项仅适用于 Confluent Platform (不适用于标准 Apache Kafka)。 | false | 布尔值 |
topicIsPattern (consumer) | 主题是否为模式(正则表达式)。这可用于订阅与模式匹配的动态主题数量。 | false | 布尔值 |
valueDeserializer (consumer) | 用于实现 Deserializer 接口的值反序列化类。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
kafkaManualCommitFactory (consumer (advanced)) | 用于创建 KafkaManualCommit 实例的 Autowired Factory。当执行与开箱即用的默认实现中分离的手动提交时,如果需要插入自定义 KafkaManualCommit 实例。 | KafkaManualCommitFactory | |
pollExceptionStrategy (consumer (advanced)) | Autowired 使用带有消费者的自定义策略来控制如何在池消息时处理从 Kafka 代理抛出的异常。 | PollExceptionStrategy | |
bufferMemorySize (producer) | 生成者可用于缓冲区等待发送到服务器的内存总量字节。如果发送记录比服务器发送的速度快,则生成者会根据 block.on.buffer.full 指定的首选项阻止或抛出异常。此设置应该与制作者将使用的总内存对应,而不是硬绑定,因为不是生成者使用的所有内存进行缓冲。一些额外的内存将用于压缩(如果启用了压缩),以及维护动态请求。 | 33554432 | 整数 |
compressionCodec (producer) | 这个参数允许您为这个制作者生成的所有数据指定压缩 codec。有效值为 none、gzip 和 snappy。 Enum 值:
| none | 字符串 |
connectionMaxIdleMs (producer) | 在此配置指定的毫秒数后关闭闲置连接。 | 540000 | 整数 |
deliveryTimeoutMs (producer) | 在调用 send ()后报告成功或失败的时间上限。这限制了在发送前记录延迟、从代理等待确认的时间(如预期)以及可重新检索失败所需的时间。 | 120000 | 整数 |
enableIdempotence (producer) | 如果设置为 'true',则制作者将确保在流中写入每个消息的一个副本。如果 'false',则制作者重试可能会在流中写入重试的消息的副本。如果设置为 true,则此选项需要 max.in.flight.requests.per.connection 设置为 1,并且重试不能为零,且其他 acks 必须设为 'all'。 | false | 布尔值 |
headerSerializer (producer) | 使用自定义 KafkaHeaderSerializer 来序列化 kafka 标头值。 | KafkaHeaderSerializer | |
key (producer) | 记录键(如果没有指定密钥,则为 null)。如果配置了这个选项,它将优先于标头 KafkaConstants114KEY。 | 字符串 | |
keySerializer (producer) | 键的序列化类(如果没有给出任何信息,则默认为消息)。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
lingerMs (producer) | 生产者将请求传输之间到达的任何记录分组到单个批处理请求中。通常,只有在记录到达比发送的速度相比,才会在负载下发生。然而,在某些情况下,客户端可能希望减少请求数,即使在负载下也是如此。此设置通过添加少量人类延迟来实现这一目的,而不是立即发送记录,让生成者最多等待给定延迟,以允许将发送其他记录,以便将发送发送。这可以象 TCP 中的 Nagle 算法类似。此设置在批处理延迟上提供了上限:一旦为分区获取 batch.size,无论此设置如何,都会立即发送它。但是,如果我们对这个分区的总字节少于这个分区,我们将"闲置"等待更多记录显示。此设置默认为 0 (例如,无延迟)。例如,设置 linger.ms=5 可减少发送的请求数量,但对负载中发送的记录增加最多 5ms 的延迟数。 | 0 | 整数 |
maxBlockMs (producer) | 配置控制发送到 kafka 的时长将阻断。这些方法可能会因为多个原因而被阻止。例如:缓冲区已满,元数据不可用。此配置对获取元数据、键和值序列化、在执行 send ()时分区和分配缓冲区内存的总时间实施最大限制。如果是 partitionsFor (),此配置在等待元数据时强制实施最长时间阈值。 | 60000 | 整数 |
maxInFlightRequest (producer) | 客户端在阻止前在单个连接上发送的最大未确认请求数。请注意,如果此设置设定为大于 1,且有失败,则可能会因为重试重试而重新排序消息(例如,如果启用了重试)。 | 5 | 整数 |
maxRequestSize (producer) | 请求的最大大小。这也在最大记录大小上有效上限。请注意,服务器对记录大小有自己的上限,它们可能与这个值不同。此设置将限制生成者将在单个请求中发送的记录数量,以避免发送大量请求。 | 1048576 | 整数 |
metadataMaxAgeMs (producer) | 我们强制刷新元数据的时间(以毫秒为单位),即使我们没有看到任何分区领导更改来主动发现任何新的代理或分区。 | 300000 | 整数 |
metricReporters (producer) | 用作指标报告器的类列表。实施 MetricReporter 接口允许插入将创建新指标创建通知的类。JmxReporter 始终被包含以注册 JMX 统计信息。 | 字符串 | |
metricsSampleWindowMs (producer) | 为计算指标维护的示例数量。 | 30000 | 整数 |
noOfMetricsSample (producer) | 为计算指标维护的示例数量。 | 2 | 整数 |
Partitioner (producer) | 在子主题间分区消息的 partitioner 类。默认分区程序基于密钥的哈希。 | org.apache.kafka.clients.producer.internals.DefaultPartitioner | 字符串 |
partitionKey (producer) | 将记录发送到的分区(如果没有指定分区,则为 null)。如果配置了这个选项,它将优先于标头 KafkaConstants114PARTITION_KEY。 | 整数 | |
producerBatchSize (producer) | 每当将多个记录发送到同一分区时,生产者会尝试将记录批处理到较少的请求中。这有助于客户端和服务器的性能。此配置以字节为单位控制默认批处理大小。不尝试批处理大于这个大小的批处理记录。发送到代理的请求将包含多个批处理,每个带有可用数据的分区都会进行批处理。小批处理大小会减少吞吐量,并可能会降低吞吐量(零的批处理大小将完全禁用批处理)。非常大的批处理大小可能会更严重地使用内存,因为我们始终以额外的记录为指定批处理大小分配缓冲区。 | 16384 | 整数 |
queueBufferingMaxMessages (producer) | 在使用 async 模式时可以排队生成者的最大未消息数量,然后才能阻止生成者,或者必须丢弃数据。 | 10000 | 整数 |
receiveBufferBytes (producer) | 读取数据时使用的 TCP 接收缓冲区(SO_RCVBUF)的大小。 | 65536 | 整数 |
reconnectBackoffMs (producer) | 尝试重新连接到给定主机前等待的时间。这可避免在严格的循环中重复连接到主机。此 backoff 适用于消费者向代理发送的所有请求。 | 50 | 整数 |
recordMetadata (producer) | 生成者是否应该存储来自发送到 Kafka 的 RecordMetadata 结果。结果存储在包含 RecordMetadata 元数据的列表中。该列表存储在带有键 KafkaConstantsHQKAFKA_RECORDMETA 的标头中。 | true | 布尔值 |
requestRequiredAcks (producer) | 确认生成者要求接收领导数量,然后才能考虑请求完成。这控制发送的记录的持久性。以下设置比较常见:acks=0 如果设为零,则制作者将根本不等待服务器的任何确认。记录将立即添加到套接字缓冲区中并被视为发送。不保证服务器在这种情况下收到记录,重试的配置不会生效(因为客户端通常不知道任何故障)。为每个记录的偏移量始终设置为 -1。这意味着领导会将记录写入本地日志,但不会等待所有后续者的确认。在这种情况下,领导会在确认记录后立即失败,但在后续者复制前它会丢失。acks=all 表示领导将等待完整的 in-sync 副本集确认记录。这样可保证,只要至少有一个同步副本保持活跃状态,就不会丢失记录。这是最强的保证。 Enum 值:
| 1 | 字符串 |
requestTimeoutMs (producer) | 在将错误发送到客户端前,代理将等待尝试满足 request.required.acks 要求的时间。 | 30000 | 整数 |
retries (producer) | 设置大于零的值将导致客户端重新发送发送失败的任何记录,并显示潜在的临时错误。请注意,这个重试与客户端在收到错误时重新处理记录不同。允许重试可能会更改记录顺序,因为如果两个记录发送到单个分区,第一个失败且被重试,但第二个成功,则可能会首先出现第二个记录。 | 0 | 整数 |
retryBackoffMs (producer) | 每次重试前,制作者会刷新相关主题的元数据,以查看是否已选择新的领导。由于领导选举机制需要一些时间,此属性指定制作者在刷新元数据前等待的时间。 | 100 | 整数 |
sendBufferBytes (producer) | 套接字写入缓冲区大小。 | 131072 | 整数 |
valueSerializer (producer) | 消息的序列化类。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
workerpool (producer) | 要在 kafka 服务器确认使用异步非阻塞处理从 KafkaProducer 发送的消息后,使用自定义 worker 池继续路由交换。如果使用这个选项,则必须处理线程池的生命周期,以便在不再需要时关闭池。 | ExecutorService | |
workerPoolCoreSize (producer) | kafka 服务器后用于继续路由交换的 worker 池的核心线程数量确认使用异步非阻塞处理从 KafkaProducer 发送的消息。 | 10 | 整数 |
workerPoolMaxSize (producer) | kafka 服务器后,用于继续路由交换的 worker 池的最大线程数量确认使用异步非阻塞处理从 KafkaProducer 发送的消息。 | 20 | 整数 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
kafkaClientFactory (advanced) | Autowired Factory 用于创建 org.apache.kafka.clients.consumer.KafkaConsumer 和 org.apache.kafka.clients.producer.KafkaProducer 实例。这允许配置自定义工厂,以使用扩展 vanilla Kafka 客户端的逻辑创建实例。 | KafkaClientFactory | |
Sync (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
schemaRegistryURL (confluent) | 要使用的 Confluent Platform 模式 registry 服务器的 URL。格式为 host1:port1,host2:port2。这在 Confluent Platform 文档中称为 schema.registry.url。这个选项仅适用于 Confluent Platform (不适用于标准 Apache Kafka)。 | 字符串 | |
interceptorClasses (monitoring) | 为制作者或消费者设置拦截器。制作者拦截器必须是实施 org.apache.kafka.clients.producer.ProducerInterceptor Consumer interceptors 的类,则需要类实施 org.apache.kafka.clients.consumer.ConsumerInterceptor 请注意,如果您在消费者上使用 Producer 拦截器,它将在运行时抛出类多播异常。 | 字符串 | |
kerberosBeforeReloginMinTime (security) | 在刷新尝试之间登录线程睡眠时间。 | 60000 | 整数 |
kerberosInitCmd (security) | Kerberos kinit 命令路径。默认为 /usr/bin/kinit。 | /usr/bin/kinit | 字符串 |
kerberosPrincipalToLocalRules (security) | 从主体名称映射到短名称(通常是操作系统用户名)的规则列表。规则按顺序评估,第一个匹配主体名称的规则被用来将其映射到短名称。列表中的任何后续规则都会被忽略。默认情况下,形式为 {username}/{hostname}{REALM} 的主体名称映射到 {username}。有关格式的详情,请查看安全授权和 acls 文档。可以使用逗号分隔多个值。 | DEFAULT | 字符串 |
kerberosRenewJitter (security) | 添加到续订时间的随机 jitter 百分比。 | 0.05 | å�Œ |
kerberosRenewWindowFactor (security) | 登录线程将休眠,直到达到最后刷新到票据的过期时间的窗口因子,此时它将尝试续订票据。 | 0.8 | å�Œ |
saslJaasConfig (security) | 公开 kafka sasl.jaas.config 参数示例: org.apache.kafka.common.security.plain.PlainLoginModule required username=USERNAME password=PASSWORD;。 | 字符串 | |
saslKerberosServiceName (security) | Kafka 运行的 Kerberos 主体名称。这可以在 Kafka 的 JAAS 配置或 Kafka 配置中定义。 | 字符串 | |
saslMechanism (security) | 使用简单验证和安全层(SASL)机制。有关有效值,请参阅。 | GSSAPI | 字符串 |
securityProtocol (security) | 用于与代理通信的协议。支持 SASL_PLAINTEXT, PLAINTEXT 和 SSL。 | 明文 | 字符串 |
sslCipherSuites (security) | 密码套件列表。这是用于使用 TLS 或 SSL 网络协议协商网络连接的安全设置的身份验证、加密、MAC 和密钥交换算法的命名组合。支持所有可用的密码套件。 | 字符串 | |
sslContextParameters (security) | 使用 Camel SSLContextParameters 对象的 SSL 配置。如果配置了,则在其他 SSL 端点参数之前应用它。注意: Kafka 只支持从文件位置加载密钥存储,因此在 KeyStoreParameters.resource 选项中使用 file: 前缀。 | SSLContextParameters | |
sslEnabledProtocols (security) | 为 SSL 连接启用的协议列表。TLSv1.2、TLSv1.1 和 TLSv1 会被默认启用。 | 字符串 | |
sslEndpointAlgorithm (security) | 端点识别算法,使用服务器证书验证服务器主机名。 | https | 字符串 |
sslKeymanagerAlgorithm (security) | SSL 连接的密钥管理器工厂使用的算法。默认值为为 Java 虚拟机配置的密钥管理器工厂算法。 | SunX509 | 字符串 |
sslKeyPassword (security) | 密钥存储文件中私钥的密码。对于客户端,这是可选的。 | 字符串 | |
sslKeystoreLocation (security) | 密钥存储文件的位置。这对客户端是可选的,可用于客户端的双向身份验证。 | 字符串 | |
sslKeystorePassword (security) | 密钥存储文件的存储密码。这对客户端是可选的,且仅在配置了 ssl.keystore.location 时才需要。 | 字符串 | |
sslKeystoreType (security) | 密钥存储文件的文件格式。对于客户端,这是可选的。默认值为 JKS。 | JKS | 字符串 |
SSLProtocol ( security) | 用于生成 SSLContext 的 SSL 协议。默认设置为 TLS,对于大多数情况来说是理想的选择。最近的 JVM 中允许的值是 TLS、TLSv1.1 和 TLSv1.2。SSL、SSLv2 和 SSLv3 可能在较旧的 JVM 中被支持,但由于已知的安全漏洞,不建议使用它们的使用。 | 字符串 | |
sslProvider (security) | 用于 SSL 连接的安全提供程序的名称。默认值为 JVM 的默认安全提供程序。 | 字符串 | |
sslTrustmanagerAlgorithm (security) | 信任管理器工厂用于 SSL 连接的算法。默认值为为 Java 虚拟机配置的信任管理器工厂算法。 | PKIX | 字符串 |
sslTruststoreLocation (security) | 信任存储文件的位置。 | 字符串 | |
sslTruststorePassword (security) | 信任存储文件的密码。 | 字符串 | |
sslTruststoreType (security) | 信任存储文件的文件格式。默认值为 JKS。 | JKS | 字符串 |
useGlobalSslContextParameters (security) | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
34.4. 端点选项
Kafka 端点使用 URI 语法进行配置:
kafka:topic
使用以下路径和查询参数:
34.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
topic (common) | 要使用的主题 必需 名称。在消费者上,您可以使用逗号分隔多个主题。生产者只能向单个主题发送消息。 | 字符串 |
34.4.2. 查询参数(102 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
additionalProperties (common) | 如果无法直接在 camel 配置(例如:新的 Kafka 属性没有反映在 Camel 配置中),则必须为 kafka consumer 或 kafka producer 设置额外的属性,属性必须使用 additionalProperties 前缀。例如: additionalProperties.transactional.id=12345&additionalProperties.schema.registry.url=http://localhost:8811/avro。 | Map | |
brokers (common) | 要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理的子集,也可以是指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。 | 字符串 | |
clientId (common) | 客户端 ID 是每个请求中发送的用户指定的字符串,以帮助追踪调用。它应该以逻辑方式识别发出请求的应用程序。 | 字符串 | |
HeaderFilterStrategy (common) | 使用自定义 HeaderFilterStrategy 将标头过滤到或从 Camel 消息过滤。 | HeaderFilterStrategy | |
reconnectBackoffMaxMs (common) | 当重新连接到重复无法连接的代理时,等待的最大时间(毫秒)。如果提供,每个主机的 backoff 将为每个连续的连接失败指数增加,直到最高值。计算 backoff 后,会添加 20% 随机 jitter 以避免连接停滞。 | 1000 | 整数 |
shutdownTimeout (common) | 超时时间(毫秒)以毫秒为单位等待消费者或生成者关闭并终止其 worker 线程。 | 30000 | int |
allowManualCommit (consumer) | 是否允许通过 KafkaManualCommit 手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange 消息标头中,这将允许最终用户访问这个 API,并通过 Kafka 使用者执行手动偏移提交。 | false | 布尔值 |
autoCommitEnable (consumer) | 如果为 true,请定期提交到 ZooKeeper,以偏移已由消费者获取的信息。当进程失败时,将使用此提交偏移,作为新消费者开始的位置。 | true | 布尔值 |
autoCommitIntervalMs (consumer) | 消费者偏移提交到 zookeeper 的频率。 | 5000 | 整数 |
autoCommitOnStop (consumer) | 消费者停止时是否执行显式自动提交,以确保代理有来自最近使用的消息的提交。这需要打开选项 autoCommitEnable。可能的值有: sync、syncsync 或 none。sync 是默认值。 Enum 值:
| 同步 | 字符串 |
autoOffsetReset (consumer) | 当 ZooKeeper 中没有初始偏移量时,或者偏移没有范围: earliest : 自动将偏移重置为最早的偏移 latest:自动将偏移重置为最新的偏移失败:抛出异常。 Enum 值:
| 最新 | 字符串 |
breakOnFirstError (consumer) | 此选项控制消费者处理交换且失败时会发生什么。如果选项为 false,则消费者将继续到下一个消息并处理它。如果选项为 true,则消费者会发现出导致故障的消息的偏移,然后重新尝试处理此消息。但是,如果每次绑定都失败,这可能会导致意外处理同一消息,例如一个 poison 消息。因此,建议处理这一点,例如使用 Camel 的错误处理程序。 | false | 布尔值 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
checkCrcs (consumer) | 自动检查所消耗的记录的 CRC32。这样可确保不会发生在线或磁盘崩溃信息。此检查增加了一些开销,因此在出现极端性能的情况下可能会禁用它。 | true | 布尔值 |
commitTimeoutMs (consumer) | 代码将等待同步提交完成的最长时间(以毫秒为单位)。 | 5000 | Long |
consumerRequestTimeoutMs (consumer) | 配置控制客户端等待请求响应的最长时间。如果在超时超时前未收到响应,如果需要,或者如果重试耗尽,则请求将重新发送。 | 40000 | 整数 |
consumersCount (consumer) | 连接到 kafka 服务器的消费者数量。每个消费者都在一个单独的线程上运行,用于检索和处理传入的数据。 | 1 | int |
fetchMaxBytes (consumer) | 如果获取的第一个非空分区中的第一个消息大于这个值,则服务器为 fetch 请求返回的最大数据量并非绝对的最大值。代理接受的最大消息大小通过 message.max.bytes (broker config)或 max.message.bytes (topic config)定义。请注意,使用者并行执行多个获取。 | 52428800 | 整数 |
fetchMinBytes (consumer) | 服务器为获取请求返回的最小数据量。如果数据不足,请求将在回答请求前等待该数量的数据累积。 | 1 | 整数 |
fetchWaitMaxMs (consumer) | 如果没有足够的数据立即满足 fetch.min.bytes,服务器将在回答获取请求前阻止的最大时间。 | 500 | 整数 |
GroupId (consumer) | 标识此消费者所属的消费者进程组的字符串。通过设置相同的组 id 多个进程表示它们都是同一消费者组的一部分。消费者需要这个选项。 | 字符串 | |
groupInstanceId (consumer) | 最终用户提供的消费者实例的唯一标识符。只允许非空字符串。如果设置,则消费者被视为静态成员,这意味着在任何消费者组中都只允许具有此 ID 的实例。这可以与更大的会话超时结合使用,以避免因为临时不可用(如进程重启)导致组重新平衡。如果没有设置,则消费者将作为动态成员加入组,这是传统行为。 | 字符串 | |
headerDeserializer (consumer) | 使用自定义 KafkaHeaderDeserializer 来反序列化 kafka 标头值。 | KafkaHeaderDeserializer | |
heartbeatIntervalMs (consumer) | 在使用 Kafka 的组管理功能时,心跳到消费者协调器的预期时间。心跳用于确保消费者的会话保持活动状态,并在新消费者加入或离开组时促进重新平衡。该值必须小于 session.timeout.ms,但通常不应设置高于该值的 1/3。可以调整它,以控制正常重新平衡的预期时间。 | 3000 | 整数 |
keyDeserializer (consumer) | 实施 Deserializer 接口的密钥反序列化类。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
maxPartitionFetchBytes (consumer) | 服务器将返回的最大每个分区的数据量。用于请求的最大内存总量为 192.168.1.0/24partitions max.partition.fetch.bytes。这个大小必须至少与服务器允许的最大消息大小相同,否则生成者可以发送大于消费者的消息。如果发生这种情况,使用者可能会卡住尝试在某个分区中获取大量消息。 | 1048576 | 整数 |
maxPollIntervalMs (consumer) | 使用消费者组管理时调用 poll ()的最大延迟。这会在获取更多记录前,在消费者闲置的时间上放置上限。如果在超时过期前没有调用 poll (),则消费者被视为失败,组将重新平衡,以便将分区重新分配给另一个成员。 | Long | |
maxPollRecords (consumer) | 单个调用中返回到 poll ()中返回的最大记录数。 | 500 | 整数 |
offsetRepository (consumer) | 用于本地存储主题的每个分区的偏移程序库。定义一个将禁用自动提交。 | StateRepository | |
partitionAssignor (consumer) | 使用组管理时,客户端将使用分区分配策略的类名称,在消费者实例之间分发分区所有权。 | org.apache.kafka.clients.consumer.RangeAssignor | 字符串 |
pollOnError (consumer) | 如果 kafka 在轮询新消息时异常,则该怎么办。除非在端点级别上配置了显式值,否则默认使用组件配置中的值。DISCARD 将丢弃消息并继续轮询下一个消息。ERROR_HANDLER 将使用 Camel 的错误处理程序来处理异常,然后继续轮询下一个消息。RECONNECT 将重新连接消费者,并尝试再次轮询 RETRY,以便消费者再次重试同一消息,STOP 将停止消费者(如果消费者应该再次消耗消息,则应手动启动/重新启动)。 Enum 值:
| ERROR_HANDLER | PollOnError |
pollTimeoutMs (consumer) | 轮询 KafkaConsumer 时使用的超时。 | 5000 | Long |
resumeStrategy (consumer) | 这个选项允许用户设置自定义恢复策略。恢复策略会在分配分区时执行(例如:连接或重新连接)。它允许实现自定义如何恢复操作,并更灵活替代 seekTo 和 offsetRepository 机制。有关实现详情,请参阅 KafkaConsumerResumeStrategy。此选项不会影响自动提交设置。使用此设置的实现可能还希望使用手动提交选项进行评估。 | KafkaConsumerResumeStrategy | |
seekTo (consumer) | 设置 KafkaConsumer 将在启动时从开始或结束读取:start : read from end : read from end this is replace the previous attributes seekToBeginning。 Enum 值:
| 字符串 | |
sessionTimeoutMs (consumer) | 使用 Kafka 组管理功能时检测失败的超时。 | 10000 | 整数 |
specificAvroReader (consumer) | 这可让特定的 Avro reader 与 Confluent Platform schema registry 和 io.confluent.kafka.serializers.KafkaAvroDeserializer 搭配使用。这个选项仅适用于 Confluent Platform (不适用于标准 Apache Kafka)。 | false | 布尔值 |
topicIsPattern (consumer) | 主题是否为模式(正则表达式)。这可用于订阅与模式匹配的动态主题数量。 | false | 布尔值 |
valueDeserializer (consumer) | 用于实现 Deserializer 接口的值反序列化类。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
kafkaManualCommitFactory (consumer (advanced)) | 用于创建 KafkaManualCommit 实例的工厂。当执行与开箱即用的默认实现中分离的手动提交时,如果需要插入自定义 KafkaManualCommit 实例。 | KafkaManualCommitFactory | |
bufferMemorySize (producer) | 生成者可用于缓冲区等待发送到服务器的内存总量字节。如果发送记录比服务器发送的速度快,则生成者会根据 block.on.buffer.full 指定的首选项阻止或抛出异常。此设置应该与制作者将使用的总内存对应,而不是硬绑定,因为不是生成者使用的所有内存进行缓冲。一些额外的内存将用于压缩(如果启用了压缩),以及维护动态请求。 | 33554432 | 整数 |
compressionCodec (producer) | 这个参数允许您为这个制作者生成的所有数据指定压缩 codec。有效值为 none、gzip 和 snappy。 Enum 值:
| none | 字符串 |
connectionMaxIdleMs (producer) | 在此配置指定的毫秒数后关闭闲置连接。 | 540000 | 整数 |
deliveryTimeoutMs (producer) | 在调用 send ()后报告成功或失败的时间上限。这限制了在发送前记录延迟、从代理等待确认的时间(如预期)以及可重新检索失败所需的时间。 | 120000 | 整数 |
enableIdempotence (producer) | 如果设置为 'true',则制作者将确保在流中写入每个消息的一个副本。如果 'false',则制作者重试可能会在流中写入重试的消息的副本。如果设置为 true,则此选项需要 max.in.flight.requests.per.connection 设置为 1,并且重试不能为零,且其他 acks 必须设为 'all'。 | false | 布尔值 |
headerSerializer (producer) | 使用自定义 KafkaHeaderSerializer 来序列化 kafka 标头值。 | KafkaHeaderSerializer | |
key (producer) | 记录键(如果没有指定密钥,则为 null)。如果配置了这个选项,它将优先于标头 KafkaConstants114KEY。 | 字符串 | |
keySerializer (producer) | 键的序列化类(如果没有给出任何信息,则默认为消息)。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
lingerMs (producer) | 生产者将请求传输之间到达的任何记录分组到单个批处理请求中。通常,只有在记录到达比发送的速度相比,才会在负载下发生。然而,在某些情况下,客户端可能希望减少请求数,即使在负载下也是如此。此设置通过添加少量人类延迟来实现这一目的,而不是立即发送记录,让生成者最多等待给定延迟,以允许将发送其他记录,以便将发送发送。这可以象 TCP 中的 Nagle 算法类似。此设置在批处理延迟上提供了上限:一旦为分区获取 batch.size,无论此设置如何,都会立即发送它。但是,如果我们对这个分区的总字节少于这个分区,我们将"闲置"等待更多记录显示。此设置默认为 0 (例如,无延迟)。例如,设置 linger.ms=5 可减少发送的请求数量,但对负载中发送的记录增加最多 5ms 的延迟数。 | 0 | 整数 |
maxBlockMs (producer) | 配置控制发送到 kafka 的时长将阻断。这些方法可能会因为多个原因而被阻止。例如:缓冲区已满,元数据不可用。此配置对获取元数据、键和值序列化、在执行 send ()时分区和分配缓冲区内存的总时间实施最大限制。如果是 partitionsFor (),此配置在等待元数据时强制实施最长时间阈值。 | 60000 | 整数 |
maxInFlightRequest (producer) | 客户端在阻止前在单个连接上发送的最大未确认请求数。请注意,如果此设置设定为大于 1,且有失败,则可能会因为重试重试而重新排序消息(例如,如果启用了重试)。 | 5 | 整数 |
maxRequestSize (producer) | 请求的最大大小。这也在最大记录大小上有效上限。请注意,服务器对记录大小有自己的上限,它们可能与这个值不同。此设置将限制生成者将在单个请求中发送的记录数量,以避免发送大量请求。 | 1048576 | 整数 |
metadataMaxAgeMs (producer) | 我们强制刷新元数据的时间(以毫秒为单位),即使我们没有看到任何分区领导更改来主动发现任何新的代理或分区。 | 300000 | 整数 |
metricReporters (producer) | 用作指标报告器的类列表。实施 MetricReporter 接口允许插入将创建新指标创建通知的类。JmxReporter 始终被包含以注册 JMX 统计信息。 | 字符串 | |
metricsSampleWindowMs (producer) | 为计算指标维护的示例数量。 | 30000 | 整数 |
noOfMetricsSample (producer) | 为计算指标维护的示例数量。 | 2 | 整数 |
Partitioner (producer) | 在子主题间分区消息的 partitioner 类。默认分区程序基于密钥的哈希。 | org.apache.kafka.clients.producer.internals.DefaultPartitioner | 字符串 |
partitionKey (producer) | 将记录发送到的分区(如果没有指定分区,则为 null)。如果配置了这个选项,它将优先于标头 KafkaConstants114PARTITION_KEY。 | 整数 | |
producerBatchSize (producer) | 每当将多个记录发送到同一分区时,生产者会尝试将记录批处理到较少的请求中。这有助于客户端和服务器的性能。此配置以字节为单位控制默认批处理大小。不尝试批处理大于这个大小的批处理记录。发送到代理的请求将包含多个批处理,每个带有可用数据的分区都会进行批处理。小批处理大小会减少吞吐量,并可能会降低吞吐量(零的批处理大小将完全禁用批处理)。非常大的批处理大小可能会更严重地使用内存,因为我们始终以额外的记录为指定批处理大小分配缓冲区。 | 16384 | 整数 |
queueBufferingMaxMessages (producer) | 在使用 async 模式时可以排队生成者的最大未消息数量,然后才能阻止生成者,或者必须丢弃数据。 | 10000 | 整数 |
receiveBufferBytes (producer) | 读取数据时使用的 TCP 接收缓冲区(SO_RCVBUF)的大小。 | 65536 | 整数 |
reconnectBackoffMs (producer) | 尝试重新连接到给定主机前等待的时间。这可避免在严格的循环中重复连接到主机。此 backoff 适用于消费者向代理发送的所有请求。 | 50 | 整数 |
recordMetadata (producer) | 生成者是否应该存储来自发送到 Kafka 的 RecordMetadata 结果。结果存储在包含 RecordMetadata 元数据的列表中。该列表存储在带有键 KafkaConstantsHQKAFKA_RECORDMETA 的标头中。 | true | 布尔值 |
requestRequiredAcks (producer) | 确认生成者要求接收领导数量,然后才能考虑请求完成。这控制发送的记录的持久性。以下设置比较常见:acks=0 如果设为零,则制作者将根本不等待服务器的任何确认。记录将立即添加到套接字缓冲区中并被视为发送。不保证服务器在这种情况下收到记录,重试的配置不会生效(因为客户端通常不知道任何故障)。为每个记录的偏移量始终设置为 -1。这意味着领导会将记录写入本地日志,但不会等待所有后续者的确认。在这种情况下,领导会在确认记录后立即失败,但在后续者复制前它会丢失。acks=all 表示领导将等待完整的 in-sync 副本集确认记录。这样可保证,只要至少有一个同步副本保持活跃状态,就不会丢失记录。这是最强的保证。 Enum 值:
| 1 | 字符串 |
requestTimeoutMs (producer) | 在将错误发送到客户端前,代理将等待尝试满足 request.required.acks 要求的时间。 | 30000 | 整数 |
retries (producer) | 设置大于零的值将导致客户端重新发送发送失败的任何记录,并显示潜在的临时错误。请注意,这个重试与客户端在收到错误时重新处理记录不同。允许重试可能会更改记录顺序,因为如果两个记录发送到单个分区,第一个失败且被重试,但第二个成功,则可能会首先出现第二个记录。 | 0 | 整数 |
retryBackoffMs (producer) | 每次重试前,制作者会刷新相关主题的元数据,以查看是否已选择新的领导。由于领导选举机制需要一些时间,此属性指定制作者在刷新元数据前等待的时间。 | 100 | 整数 |
sendBufferBytes (producer) | 套接字写入缓冲区大小。 | 131072 | 整数 |
valueSerializer (producer) | 消息的序列化类。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
workerpool (producer) | 要在 kafka 服务器确认使用异步非阻塞处理从 KafkaProducer 发送的消息后,使用自定义 worker 池继续路由交换。如果使用这个选项,则必须处理线程池的生命周期,以便在不再需要时关闭池。 | ExecutorService | |
workerPoolCoreSize (producer) | kafka 服务器后用于继续路由交换的 worker 池的核心线程数量确认使用异步非阻塞处理从 KafkaProducer 发送的消息。 | 10 | 整数 |
workerPoolMaxSize (producer) | kafka 服务器后,用于继续路由交换的 worker 池的最大线程数量确认使用异步非阻塞处理从 KafkaProducer 发送的消息。 | 20 | 整数 |
kafkaClientFactory (advanced) | 用于创建 org.apache.kafka.clients.consumer.KafkaConsumer 和 org.apache.kafka.clients.producer.KafkaProducer 实例的工厂。这允许配置自定义工厂,以使用扩展 vanilla Kafka 客户端的逻辑创建实例。 | KafkaClientFactory | |
Sync (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
schemaRegistryURL (confluent) | 要使用的 Confluent Platform 模式 registry 服务器的 URL。格式为 host1:port1,host2:port2。这在 Confluent Platform 文档中称为 schema.registry.url。这个选项仅适用于 Confluent Platform (不适用于标准 Apache Kafka)。 | 字符串 | |
interceptorClasses (monitoring) | 为制作者或消费者设置拦截器。制作者拦截器必须是实施 org.apache.kafka.clients.producer.ProducerInterceptor Consumer interceptors 的类,则需要类实施 org.apache.kafka.clients.consumer.ConsumerInterceptor 请注意,如果您在消费者上使用 Producer 拦截器,它将在运行时抛出类多播异常。 | 字符串 | |
kerberosBeforeReloginMinTime (security) | 在刷新尝试之间登录线程睡眠时间。 | 60000 | 整数 |
kerberosInitCmd (security) | Kerberos kinit 命令路径。默认为 /usr/bin/kinit。 | /usr/bin/kinit | 字符串 |
kerberosPrincipalToLocalRules (security) | 从主体名称映射到短名称(通常是操作系统用户名)的规则列表。规则按顺序评估,第一个匹配主体名称的规则被用来将其映射到短名称。列表中的任何后续规则都会被忽略。默认情况下,形式为 {username}/{hostname}{REALM} 的主体名称映射到 {username}。有关格式的详情,请查看安全授权和 acls 文档。可以使用逗号分隔多个值。 | DEFAULT | 字符串 |
kerberosRenewJitter (security) | 添加到续订时间的随机 jitter 百分比。 | 0.05 | å�Œ |
kerberosRenewWindowFactor (security) | 登录线程将休眠,直到达到最后刷新到票据的过期时间的窗口因子,此时它将尝试续订票据。 | 0.8 | å�Œ |
saslJaasConfig (security) | 公开 kafka sasl.jaas.config 参数示例: org.apache.kafka.common.security.plain.PlainLoginModule required username=USERNAME password=PASSWORD;。 | 字符串 | |
saslKerberosServiceName (security) | Kafka 运行的 Kerberos 主体名称。这可以在 Kafka 的 JAAS 配置或 Kafka 配置中定义。 | 字符串 | |
saslMechanism (security) | 使用简单验证和安全层(SASL)机制。有关有效值,请参阅。 | GSSAPI | 字符串 |
securityProtocol (security) | 用于与代理通信的协议。支持 SASL_PLAINTEXT, PLAINTEXT 和 SSL。 | 明文 | 字符串 |
sslCipherSuites (security) | 密码套件列表。这是用于使用 TLS 或 SSL 网络协议协商网络连接的安全设置的身份验证、加密、MAC 和密钥交换算法的命名组合。支持所有可用的密码套件。 | 字符串 | |
sslContextParameters (security) | 使用 Camel SSLContextParameters 对象的 SSL 配置。如果配置了,则在其他 SSL 端点参数之前应用它。注意: Kafka 只支持从文件位置加载密钥存储,因此在 KeyStoreParameters.resource 选项中使用 file: 前缀。 | SSLContextParameters | |
sslEnabledProtocols (security) | 为 SSL 连接启用的协议列表。TLSv1.2、TLSv1.1 和 TLSv1 会被默认启用。 | 字符串 | |
sslEndpointAlgorithm (security) | 端点识别算法,使用服务器证书验证服务器主机名。 | https | 字符串 |
sslKeymanagerAlgorithm (security) | SSL 连接的密钥管理器工厂使用的算法。默认值为为 Java 虚拟机配置的密钥管理器工厂算法。 | SunX509 | 字符串 |
sslKeyPassword (security) | 密钥存储文件中私钥的密码。对于客户端,这是可选的。 | 字符串 | |
sslKeystoreLocation (security) | 密钥存储文件的位置。这对客户端是可选的,可用于客户端的双向身份验证。 | 字符串 | |
sslKeystorePassword (security) | 密钥存储文件的存储密码。这对客户端是可选的,且仅在配置了 ssl.keystore.location 时才需要。 | 字符串 | |
sslKeystoreType (security) | 密钥存储文件的文件格式。对于客户端,这是可选的。默认值为 JKS。 | JKS | 字符串 |
SSLProtocol ( security) | 用于生成 SSLContext 的 SSL 协议。默认设置为 TLS,对于大多数情况来说是理想的选择。最近的 JVM 中允许的值是 TLS、TLSv1.1 和 TLSv1.2。SSL、SSLv2 和 SSLv3 可能在较旧的 JVM 中被支持,但由于已知的安全漏洞,不建议使用它们的使用。 | 字符串 | |
sslProvider (security) | 用于 SSL 连接的安全提供程序的名称。默认值为 JVM 的默认安全提供程序。 | 字符串 | |
sslTrustmanagerAlgorithm (security) | 信任管理器工厂用于 SSL 连接的算法。默认值为为 Java 虚拟机配置的信任管理器工厂算法。 | PKIX | 字符串 |
sslTruststoreLocation (security) | 信任存储文件的位置。 | 字符串 | |
sslTruststorePassword (security) | 信任存储文件的密码。 | 字符串 | |
sslTruststoreType (security) | 信任存储文件的文件格式。默认值为 JKS。 | JKS | 字符串 |
有关 Producer/Consumer 配置的更多信息,请参阅:
34.5. 消息标头
34.5.1. 消费者标头
使用 Kafka 的信息时可使用以下标头。
标头常量 | 标头值 | 类型 | 描述 |
---|---|---|---|
|
|
| 消息源自的主题 |
|
|
| 存储消息的分区 |
|
|
| 消息的偏移 |
|
|
| 消息的密钥(如果已配置) |
|
|
| 记录标头 |
|
|
|
提交前的最后一条记录(仅在 |
|
|
|
表示当前轮询请求中的最后一条记录(仅在 |
|
|
| 在使用 Kafka 消费者时,可用于强制手动偏移提交。 |
34.5.2. 生成者标头
在向 Kafka 发送消息前,您可以配置以下标头。
标头常量 | 标头值 | 类型 | 描述 |
---|---|---|---|
|
|
| 必需 消息的密钥,以确保所有相关消息都位于同一分区中 |
|
|
| 发送消息的主题(override 和 take priority),标头不会被保留。 |
|
|
| ProducerRecord 也有一个关联的时间戳。如果用户提供时间戳,则制作者将调整与提供的时间戳的记录,并且不会保留标头。 |
|
|
| 明确指定分区 |
如果要向动态主题发送消息,则使用 KafkaConstants.OVERRIDE_TOPIC
用作未与消息一起发送的一次性标头,因为它在制作者中删除。
在消息发送到 Kafka 后,以下标头将可用
标头常量 | 标头值 | 类型 | 描述 |
---|---|---|---|
|
|
|
元数据(仅在 |
34.6. 消费者错误处理
虽然 kafka 使用者轮询来自 kafka 代理的消息,但可能会出现错误。本节描述了什么情况以及您可以配置的内容。
在调用 Kafka poll
API 时,消费者可能会抛出异常。例如,如果因为无效数据而无法反序列化消息,以及许多其他错误。这些错误采用 KafkaException
的形式,它们可以被重试 或不可 重试。可以重试的例外(RetriableException
)将再次重试(之间有一个轮询超时)。所有其他异常都根据 pollOnError 配置进行处理。此配置具有以下值:
- DISCARD 将丢弃消息并继续轮询下一个消息。
- ERROR_HANDLER 将使用 Camel 的错误处理程序来处理异常,然后继续轮询下一个消息。
- RECONNECT 将重新连接消费者,并尝试再次轮询消息。
- RETRY 将使消费者再次重试轮询相同的消息
- STOP 将停止消费者(如果消费者应该再次消耗消息,则需要手动启动/重新启动)。
默认为 ERROR_HANDLER,它将让 Camel 的错误处理程序(若有配置)处理导致异常。然后继续轮询下一个消息。这个行为与 Camel 组件具有的 bridgeErrorHandler 选项类似。
对于高级控制,可以在组件级别上配置 org.apache.camel.component.kafka.PollExceptionStrategy
的自定义实现,这允许控制上述策略的异常原因。
34.7. Samples
34.7.1. 使用 Kafka 的消息
以下是从 Kafka 读取信息所需的最小路由。
from("kafka:test?brokers=localhost:9092") .log("Message received from Kafka : ${body}") .log(" on the topic ${headers[kafka.TOPIC]}") .log(" on the partition ${headers[kafka.PARTITION]}") .log(" with the offset ${headers[kafka.OFFSET]}") .log(" with the key ${headers[kafka.KEY]}")
如果您需要使用来自多个主题的消息,您可以使用逗号分隔的主题名称列表。
from("kafka:test,test1,test2?brokers=localhost:9092") .log("Message received from Kafka : ${body}") .log(" on the topic ${headers[kafka.TOPIC]}") .log(" on the partition ${headers[kafka.PARTITION]}") .log(" with the offset ${headers[kafka.OFFSET]}") .log(" with the key ${headers[kafka.KEY]}")
也可以订阅多个主题,为主题名称提供模式,并使用 topicIsPattern
选项。
from("kafka:test*?brokers=localhost:9092&topicIsPattern=true") .log("Message received from Kafka : ${body}") .log(" on the topic ${headers[kafka.TOPIC]}") .log(" on the partition ${headers[kafka.PARTITION]}") .log(" with the offset ${headers[kafka.OFFSET]}") .log(" with the key ${headers[kafka.KEY]}")
使用 Kafka 中的消息时,您可以使用自己的偏移管理,且不会将这个管理委派给 Kafka。为了保持偏移,组件需要 StateRepository
实施,如 FileStateRepository
。此 bean 应该在 registry 中提供。在这里如何使用它:
// Create the repository in which the Kafka offsets will be persisted FileStateRepository repository = FileStateRepository.fileStateRepository(new File("/path/to/repo.dat")); // Bind this repository into the Camel registry Registry registry = createCamelRegistry(); registry.bind("offsetRepo", repository); // Configure the camel context DefaultCamelContext camelContext = new DefaultCamelContext(registry); camelContext.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("kafka:" + TOPIC + "?brokers=localhost:{{kafkaPort}}" + // Setup the topic and broker address "&groupId=A" + // The consumer processor group ID "&autoOffsetReset=earliest" + // Ask to start from the beginning if we have unknown offset "&offsetRepository=#offsetRepo") // Keep the offsets in the previously configured repository .to("mock:result"); } });
34.7.2. 生成信息到 Kafka
以下是向 Kafka 写入信息所需的最小路由。
from("direct:start") .setBody(constant("Message from Camel")) // Message to send .setHeader(KafkaConstants.KEY, constant("Camel")) // Key of the message .to("kafka:test?brokers=localhost:9092");
34.8. SSL 配置
您可以使用两种不同的方法在 Kafka 组件中配置 SSL 通信。
第一种方法是通过许多 SSL 端点参数
from("kafka:" + TOPIC + "?brokers=localhost:{{kafkaPort}}" + "&groupId=A" + "&sslKeystoreLocation=/path/to/keystore.jks" + "&sslKeystorePassword=changeit" + "&sslKeyPassword=changeit" + "&securityProtocol=SSL") .to("mock:result");
第二种方法是使用 sslContextParameters
端点参数。
// Configure the SSLContextParameters object KeyStoreParameters ksp = new KeyStoreParameters(); ksp.setResource("/path/to/keystore.jks"); ksp.setPassword("changeit"); KeyManagersParameters kmp = new KeyManagersParameters(); kmp.setKeyStore(ksp); kmp.setKeyPassword("changeit"); SSLContextParameters scp = new SSLContextParameters(); scp.setKeyManagers(kmp); // Bind this SSLContextParameters into the Camel registry Registry registry = createCamelRegistry(); registry.bind("ssl", scp); // Configure the camel context DefaultCamelContext camelContext = new DefaultCamelContext(registry); camelContext.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("kafka:" + TOPIC + "?brokers=localhost:{{kafkaPort}}" + // Setup the topic and broker address "&groupId=A" + // The consumer processor group ID "&sslContextParameters=#ssl" + // The security protocol "&securityProtocol=SSL) // Reference the SSL configuration .to("mock:result"); } });
34.9. 使用 Kafka 幂等存储库
camel-kafka
库提供了一个基于 Kafka 主题的幂等存储库。
此存储库在 Kafka 主题中将所有更改广播到幂等状态(add/remove),并通过事件源为每个存储库的进程实例填充本地内存缓存。使用的主题必须为每个幂等存储库实例是唯一的。
机制没有任何有关主题分区数量的要求;因为存储库同时从所有分区消耗。它还没有任何有关主题复制因素的要求。
使用主题(例如,并行运行的不同机器上)的每个存储库实例控制其自身的消费者组,因此在使用相同主题的 10 个 Camel 进程集群中,控制其自身偏移。
在启动时,实例订阅该主题,并将偏移回开始,将缓存重建为最新状态。在一次轮询 轮询持续时间M
前,缓存不会被认为是 0 个记录。在缓存热上或 30 秒发生之前,启动才会完成;如果后者发生幂等存储库可能处于不一致的状态,直到消费者捕获到主题的末尾为止。
请注意用于唯一检查的标头格式。默认情况下,它使用 Strings 作为数据类型。使用原语数字格式时,必须相应地对标头进行反序列化。例如,请检查以下示例。
KafkaIdempotentRepository
具有以下属性:
属性 | 描述 |
---|---|
| 用于广播更改的 Kafka 主题的名称。(必需) |
|
内部 Kafka 生成者和消费者上的 |
|
设置 Kafka producer 将用于广播更改的属性。覆盖 |
|
设置 Kafka 消费者将使用的属性,该消费者从主题填充缓存。覆盖 |
| 最近使用的密钥应存储在内存中(默认值 1000)。 |
|
Kafka 消费者的轮询持续时间。本地缓存会立即更新。这个值会影响从主题更新其缓存的其他对等点后如何相对于发送缓存操作消息的幂等消费者实例。默认值为 100 ms。 |
可以通过定义 主题和
bootstrapServers
来实例化存储库,或者明确定义 producerConfig
和 consumerConfig
属性集来启用 SSL/SASL 等功能。要使用,此存储库必须手动放置在 Camel 注册表中,也可以作为 bean 在 Spring/Blueprint 中进行注册,因为它为 CamelContext
感知。
用法示例如下:
KafkaIdempotentRepository kafkaIdempotentRepository = new KafkaIdempotentRepository("idempotent-db-inserts", "localhost:9091"); SimpleRegistry registry = new SimpleRegistry(); registry.put("insertDbIdemRepo", kafkaIdempotentRepository); // must be registered in the registry, to enable access to the CamelContext CamelContext context = new CamelContext(registry); // later in RouteBuilder... from("direct:performInsert") .idempotentConsumer(header("id")).messageIdRepositoryRef("insertDbIdemRepo") // once-only insert into database .end()
在 XML 中:
<!-- simple --> <bean id="insertDbIdemRepo" class="org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository"> <property name="topic" value="idempotent-db-inserts"/> <property name="bootstrapServers" value="localhost:9091"/> </bean> <!-- complex --> <bean id="insertDbIdemRepo" class="org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository"> <property name="topic" value="idempotent-db-inserts"/> <property name="maxCacheSize" value="10000"/> <property name="consumerConfig"> <props> <prop key="bootstrap.servers">localhost:9091</prop> </props> </property> <property name="producerConfig"> <props> <prop key="bootstrap.servers">localhost:9091</prop> </props> </property> </bean>
在使用带有数字标识符的 idempotency 时,可以选择 3 个替代方案。第一个是使用来自 org.apache.camel.component.kafka.serde.KafkaSerdeHelper
的静态方法 number Header
方法为您执行转换:
from("direct:performInsert") .idempotentConsumer(numericHeader("id")).messageIdRepositoryRef("insertDbIdemRepo") // once-only insert into database .end()
另外,也可以使用通过路由 URL 配置的自定义序列化程序来执行转换:
public class CustomHeaderDeserializer extends DefaultKafkaHeaderDeserializer { private static final Logger LOG = LoggerFactory.getLogger(CustomHeaderDeserializer.class); @Override public Object deserialize(String key, byte[] value) { if (key.equals("id")) { BigInteger bi = new BigInteger(value); return String.valueOf(bi.longValue()); } else { return super.deserialize(key, value); } } }
最后,也可以在处理器中执行此操作:
from(from).routeId("foo") .process(exchange -> { byte[] id = exchange.getIn().getHeader("id", byte[].class); BigInteger bi = new BigInteger(id); exchange.getIn().setHeader("id", String.valueOf(bi.longValue())); }) .idempotentConsumer(header("id")) .messageIdRepositoryRef("kafkaIdempotentRepository") .to(to);
34.10. 使用 Kafka 使用者手动提交
默认情况下,Kafka 使用者将使用自动提交,其中偏移将使用给定间隔自动提交。
如果要强制手动提交,您可以使用 Camel Exchange 中的 KafkaManualCommit
API,存储在消息标头中。这需要在 KafkaComponent
或端点上将 allowManualCommit
选项设置为 true
来打开手动提交,例如:
KafkaComponent kafka = new KafkaComponent(); kafka.setAllowManualCommit(true); ... camelContext.addComponent("kafka", kafka);
然后,您可以使用 Java 代码中的 KafkaManualCommit
,如 Camel Processor
:
public void process(Exchange exchange) { KafkaManualCommit manual = exchange.getIn().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class); manual.commit(); }
这将强制同步提交,该提交将在 Kafka 上确认提交,或者抛出异常失败。您可以通过配置带有 'DefaultKafkaManualAsyncCommitFactory' 实现的 KafkaManualCommitFactory
来使用异步提交。
然后,提交将使用 kafka 异步提交 api 在下一个消费者循环中进行。请注意,分区中的记录必须由唯一的线程处理并提交。如果没有,这会导致非一致的行为。这主要用于聚合的完成超时策略。
如果要使用 KafkaManualCommit
的自定义实现,您可以在 KafkaComponent
上配置自定义 KafkaManualCommitFactory
,以创建自定义实现的实例。
34.11. Kafka 标头传播
使用 Kafka 中的消息时,标头将自动传播到 camel 交换标头。生成由同一行为 - 特定交换的 camel 标头支持的流将被传播到 kafka 消息标头。
由于 kafka 标头只允许 byte[]
值,以便 camel Exchange 标头被序列化为 bytes[]
,否则将跳过标头。支持以下标头值类型:string ,Integer
,Long
, Double,
布尔值
,byte[]
. 注: 所有标头生成的 从 kafka 到 camel 的交换默认都会包括值
byte[]
。若要覆盖默认功能,uri 参数可以设置: headerDeserializer
用于 from
路由,headerSerializer
用于 to
路由。Example:
from("kafka:my_topic?headerDeserializer=#myDeserializer") ... .to("kafka:my_topic?headerSerializer=#mySerializer")
默认情况下,所有标头都由 KafkaHeaderFilterStrategy
进行过滤。策略过滤掉以 Camel
或 org.apache.camel
前缀开头的标头。默认的策略可以通过在 to
和 from
路由中使用 headerFilterStrategy
uri 参数进行覆盖:
from("kafka:my_topic?headerFilterStrategy=#myStrategy") ... .to("kafka:my_topic?headerFilterStrategy=#myStrategy")
myStrategy
对象应该是 HeaderFilterStrategy
的子类,必须手动放置在 Camel registry 中,也可以作为 bean 在 Spring/Blueprint 中进行注册,因为它为 CamelContext
感知。
34.12. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 kafka 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-kafka-starter</artifactId> </dependency>
组件支持 105 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.kafka.additional-properties | 如果无法直接在 camel 配置(例如:新的 Kafka 属性没有反映在 Camel 配置中),则必须为 kafka consumer 或 kafka producer 设置额外的属性,属性必须使用 additionalProperties 前缀。例如: additionalProperties.transactional.id=12345&additionalProperties.schema.registry.url=http://localhost:8811/avro。 | Map | |
camel.component.kafka.allow-manual-commit | 是否允许通过 KafkaManualCommit 手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange 消息标头中,这将允许最终用户访问这个 API,并通过 Kafka 使用者执行手动偏移提交。 | false | 布尔值 |
camel.component.kafka.auto-commit-enable | 如果为 true,请定期提交到 ZooKeeper,以偏移已由消费者获取的信息。当进程失败时,将使用此提交偏移,作为新消费者开始的位置。 | true | 布尔值 |
camel.component.kafka.auto-commit-interval-ms | 消费者偏移提交到 zookeeper 的频率。 | 5000 | 整数 |
camel.component.kafka.auto-commit-on-stop | 消费者停止时是否执行显式自动提交,以确保代理有来自最近使用的消息的提交。这需要打开选项 autoCommitEnable。可能的值有: sync、syncsync 或 none。sync 是默认值。 | 同步 | 字符串 |
camel.component.kafka.auto-offset-reset | 当 ZooKeeper 中没有初始偏移量时,或者偏移没有范围: earliest : 自动将偏移重置为最早的偏移 latest:自动将偏移重置为最新的偏移失败:抛出异常。 | 最新 | 字符串 |
camel.component.kafka.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.kafka.break-on-first-error | 此选项控制消费者处理交换且失败时会发生什么。如果选项为 false,则消费者将继续到下一个消息并处理它。如果选项为 true,则消费者会发现出导致故障的消息的偏移,然后重新尝试处理此消息。但是,如果每次绑定都失败,这可能会导致意外处理同一消息,例如一个 poison 消息。因此,建议处理这一点,例如使用 Camel 的错误处理程序。 | false | 布尔值 |
camel.component.kafka.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.kafka.brokers | 要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理的子集,也可以是指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。 | 字符串 | |
camel.component.kafka.buffer-memory-size | 生成者可用于缓冲区等待发送到服务器的内存总量字节。如果发送记录比服务器发送的速度快,则生成者会根据 block.on.buffer.full 指定的首选项阻止或抛出异常。此设置应该与制作者将使用的总内存对应,而不是硬绑定,因为不是生成者使用的所有内存进行缓冲。一些额外的内存将用于压缩(如果启用了压缩),以及维护动态请求。 | 33554432 | 整数 |
camel.component.kafka.check-crcs | 自动检查所消耗的记录的 CRC32。这样可确保不会发生在线或磁盘崩溃信息。此检查增加了一些开销,因此在出现极端性能的情况下可能会禁用它。 | true | 布尔值 |
camel.component.kafka.client-id | 客户端 ID 是每个请求中发送的用户指定的字符串,以帮助追踪调用。它应该以逻辑方式识别发出请求的应用程序。 | 字符串 | |
camel.component.kafka.commit-timeout-ms | 代码将等待同步提交完成的最长时间(以毫秒为单位)。选项是 java.lang.Long 类型。 | 5000 | Long |
camel.component.kafka.compression-codec | 这个参数允许您为这个制作者生成的所有数据指定压缩 codec。有效值为 none、gzip 和 snappy。 | none | 字符串 |
camel.component.kafka.configuration | 允许使用端点将重复使用的通用选项预配置 Kafka 组件。选项是一个 org.apache.camel.component.kafka.KafkaConfiguration 类型。 | KafkaConfiguration | |
camel.component.kafka.connection-max-idle-ms | 在此配置指定的毫秒数后关闭闲置连接。 | 540000 | 整数 |
camel.component.kafka.consumer-request-timeout-ms | 配置控制客户端等待请求响应的最长时间。如果在超时超时前未收到响应,如果需要,或者如果重试耗尽,则请求将重新发送。 | 40000 | 整数 |
camel.component.kafka.consumers-count | 连接到 kafka 服务器的消费者数量。每个消费者都在一个单独的线程上运行,用于检索和处理传入的数据。 | 1 | 整数 |
camel.component.kafka.delivery-timeout-ms | 在调用 send ()后报告成功或失败的时间上限。这限制了在发送前记录延迟、从代理等待确认的时间(如预期)以及可重新检索失败所需的时间。 | 120000 | 整数 |
camel.component.kafka.enable-idempotence | 如果设置为 'true',则制作者将确保在流中写入每个消息的一个副本。如果 'false',则制作者重试可能会在流中写入重试的消息的副本。如果设置为 true,则此选项需要 max.in.flight.requests.per.connection 设置为 1,并且重试不能为零,且其他 acks 必须设为 'all'。 | false | 布尔值 |
camel.component.kafka.enabled | 是否启用 kafka 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.kafka.fetch-max-bytes | 如果获取的第一个非空分区中的第一个消息大于这个值,则服务器为 fetch 请求返回的最大数据量并非绝对的最大值。代理接受的最大消息大小通过 message.max.bytes (broker config)或 max.message.bytes (topic config)定义。请注意,使用者并行执行多个获取。 | 52428800 | 整数 |
camel.component.kafka.fetch-min-bytes | 服务器为获取请求返回的最小数据量。如果数据不足,请求将在回答请求前等待该数量的数据累积。 | 1 | 整数 |
camel.component.kafka.fetch-wait-max-ms | 如果没有足够的数据立即满足 fetch.min.bytes,服务器将在回答获取请求前阻止的最大时间。 | 500 | 整数 |
camel.component.kafka.group-id | 标识此消费者所属的消费者进程组的字符串。通过设置相同的组 id 多个进程表示它们都是同一消费者组的一部分。消费者需要这个选项。 | 字符串 | |
camel.component.kafka.group-instance-id | 最终用户提供的消费者实例的唯一标识符。只允许非空字符串。如果设置,则消费者被视为静态成员,这意味着在任何消费者组中都只允许具有此 ID 的实例。这可以与更大的会话超时结合使用,以避免因为临时不可用(如进程重启)导致组重新平衡。如果没有设置,则消费者将作为动态成员加入组,这是传统行为。 | 字符串 | |
camel.component.kafka.header-deserializer | 使用自定义 KafkaHeaderDeserializer 来反序列化 kafka 标头值。选项是一个 org.apache.camel.component.kafka.serde.KafkaHeaderDeserializer 类型。 | KafkaHeaderDeserializer | |
camel.component.kafka.header-filter-strategy | 使用自定义 HeaderFilterStrategy 将标头过滤到或从 Camel 消息过滤。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
camel.component.kafka.header-serializer | 使用自定义 KafkaHeaderSerializer 来序列化 kafka 标头值。选项是一个 org.apache.camel.component.kafka.serde.KafkaHeaderSerializer 类型。 | KafkaHeaderSerializer | |
camel.component.kafka.heartbeat-interval-ms | 在使用 Kafka 的组管理功能时,心跳到消费者协调器的预期时间。心跳用于确保消费者的会话保持活动状态,并在新消费者加入或离开组时促进重新平衡。该值必须小于 session.timeout.ms,但通常不应设置高于该值的 1/3。可以调整它,以控制正常重新平衡的预期时间。 | 3000 | 整数 |
camel.component.kafka.interceptor-classes | 为制作者或消费者设置拦截器。制作者拦截器必须是实施 org.apache.kafka.clients.producer.ProducerInterceptor Consumer interceptors 的类,则需要类实施 org.apache.kafka.clients.consumer.ConsumerInterceptor 请注意,如果您在消费者上使用 Producer 拦截器,它将在运行时抛出类多播异常。 | 字符串 | |
camel.component.kafka.kafka-client-factory | 用于创建 org.apache.kafka.clients.consumer.KafkaConsumer 和 org.apache.kafka.clients.producer.KafkaProducer 实例的工厂。这允许配置自定义工厂,以使用扩展 vanilla Kafka 客户端的逻辑创建实例。选项是一个 org.apache.camel.component.kafka.KafkaClientFactory 类型。 | KafkaClientFactory | |
camel.component.kafka.kafka-manual-commit-factory | 用于创建 KafkaManualCommit 实例的工厂。当执行与开箱即用的默认实现中分离的手动提交时,如果需要插入自定义 KafkaManualCommit 实例。选项是一个 org.apache.camel.component.kafka.KafkaManualCommitFactory 类型。 | KafkaManualCommitFactory | |
camel.component.kafka.kerberos-before-relogin-min-time | 在刷新尝试之间登录线程睡眠时间。 | 60000 | 整数 |
camel.component.kafka.kerberos-init-cmd | Kerberos kinit 命令路径。默认为 /usr/bin/kinit。 | /usr/bin/kinit | 字符串 |
camel.component.kafka.kerberos-principal-to-local-rules | 从主体名称映射到短名称(通常是操作系统用户名)的规则列表。规则按顺序评估,第一个匹配主体名称的规则被用来将其映射到短名称。列表中的任何后续规则都会被忽略。默认情况下,形式为 {username}/{hostname}{REALM} 的主体名称映射到 {username}。有关格式的详情,请查看安全授权和 acls 文档。可以使用逗号分隔多个值。 | DEFAULT | 字符串 |
camel.component.kafka.kerberos-renew-jitter | 添加到续订时间的随机 jitter 百分比。 | å�Œ | |
camel.component.kafka.kerberos-renew-window-factor | 登录线程将休眠,直到达到最后刷新到票据的过期时间的窗口因子,此时它将尝试续订票据。 | å�Œ | |
camel.component.kafka.key | 记录键(如果没有指定密钥,则为 null)。如果配置了这个选项,它将优先于标头 KafkaConstants114KEY。 | 字符串 | |
camel.component.kafka.key-deserializer | 实施 Deserializer 接口的密钥反序列化类。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
camel.component.kafka.key-serializer | 键的序列化类(如果没有给出任何信息,则默认为消息)。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
camel.component.kafka.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.kafka.linger-ms | 生产者将请求传输之间到达的任何记录分组到单个批处理请求中。通常,只有在记录到达比发送的速度相比,才会在负载下发生。然而,在某些情况下,客户端可能希望减少请求数,即使在负载下也是如此。此设置通过添加少量人类延迟来实现这一目的,而不是立即发送记录,让生成者最多等待给定延迟,以允许将发送其他记录,以便将发送发送。这可以象 TCP 中的 Nagle 算法类似。此设置在批处理延迟上提供了上限:一旦为分区获取 batch.size,无论此设置如何,都会立即发送它。但是,如果我们对这个分区的总字节少于这个分区,我们将"闲置"等待更多记录显示。此设置默认为 0 (例如,无延迟)。例如,设置 linger.ms=5 可减少发送的请求数量,但对负载中发送的记录增加最多 5ms 的延迟数。 | 0 | 整数 |
camel.component.kafka.max-block-ms | 配置控制发送到 kafka 的时长将阻断。这些方法可能会因为多个原因而被阻止。例如:缓冲区已满,元数据不可用。此配置对获取元数据、键和值序列化、在执行 send ()时分区和分配缓冲区内存的总时间实施最大限制。如果是 partitionsFor (),此配置在等待元数据时强制实施最长时间阈值。 | 60000 | 整数 |
camel.component.kafka.max-in-flight-request | 客户端在阻止前在单个连接上发送的最大未确认请求数。请注意,如果此设置设定为大于 1,且有失败,则可能会因为重试重试而重新排序消息(例如,如果启用了重试)。 | 5 | 整数 |
camel.component.kafka.max-partition-fetch-bytes | 服务器将返回的最大每个分区的数据量。用于请求的最大内存总量为 192.168.1.0/24partitions max.partition.fetch.bytes。这个大小必须至少与服务器允许的最大消息大小相同,否则生成者可以发送大于消费者的消息。如果发生这种情况,使用者可能会卡住尝试在某个分区中获取大量消息。 | 1048576 | 整数 |
camel.component.kafka.max-poll-interval-ms | 使用消费者组管理时调用 poll ()的最大延迟。这会在获取更多记录前,在消费者闲置的时间上放置上限。如果在超时过期前没有调用 poll (),则消费者被视为失败,组将重新平衡,以便将分区重新分配给另一个成员。选项是 java.lang.Long 类型。 | Long | |
camel.component.kafka.max-poll-records | 单个调用中返回到 poll ()中返回的最大记录数。 | 500 | 整数 |
camel.component.kafka.max-request-size | 请求的最大大小。这也在最大记录大小上有效上限。请注意,服务器对记录大小有自己的上限,它们可能与这个值不同。此设置将限制生成者将在单个请求中发送的记录数量,以避免发送大量请求。 | 1048576 | 整数 |
camel.component.kafka.metadata-max-age-ms | 我们强制刷新元数据的时间(以毫秒为单位),即使我们没有看到任何分区领导更改来主动发现任何新的代理或分区。 | 300000 | 整数 |
camel.component.kafka.metric-reporters | 用作指标报告器的类列表。实施 MetricReporter 接口允许插入将创建新指标创建通知的类。JmxReporter 始终被包含以注册 JMX 统计信息。 | 字符串 | |
camel.component.kafka.metrics-sample-window-ms | 为计算指标维护的示例数量。 | 30000 | 整数 |
camel.component.kafka.no-of-metrics-sample | 为计算指标维护的示例数量。 | 2 | 整数 |
camel.component.kafka.offset-repository | 用于本地存储主题的每个分区的偏移程序库。定义一个将禁用自动提交。选项是一个 org.apache.camel.spi.StateRepository<java.lang.String, java.lang.String> 类型。 | StateRepository | |
camel.component.kafka.partition-assignor | 使用组管理时,客户端将使用分区分配策略的类名称,在消费者实例之间分发分区所有权。 | org.apache.kafka.clients.consumer.RangeAssignor | 字符串 |
camel.component.kafka.partition-key | 将记录发送到的分区(如果没有指定分区,则为 null)。如果配置了这个选项,它将优先于标头 KafkaConstants114PARTITION_KEY。 | 整数 | |
camel.component.kafka.partitioner | 在子主题间分区消息的 partitioner 类。默认分区程序基于密钥的哈希。 | org.apache.kafka.clients.producer.internals.DefaultPartitioner | 字符串 |
camel.component.kafka.poll-exception-strategy | 要将自定义策略与使用者一起使用,以控制如何在池信息时处理从 Kafka 代理抛出的异常。选项是一个 org.apache.camel.component.kafka.PollExceptionStrategy 类型。 | PollExceptionStrategy | |
camel.component.kafka.poll-on-error | 如果 kafka 在轮询新消息时异常,则该怎么办。除非在端点级别上配置了显式值,否则默认使用组件配置中的值。DISCARD 将丢弃消息并继续轮询下一个消息。ERROR_HANDLER 将使用 Camel 的错误处理程序来处理异常,然后继续轮询下一个消息。RECONNECT 将重新连接消费者,并尝试再次轮询 RETRY,以便消费者再次重试同一消息,STOP 将停止消费者(如果消费者应该再次消耗消息,则应手动启动/重新启动)。 | PollOnError | |
camel.component.kafka.poll-timeout-ms | 轮询 KafkaConsumer 时使用的超时。选项是 java.lang.Long 类型。 | 5000 | Long |
camel.component.kafka.producer-batch-size | 每当将多个记录发送到同一分区时,生产者会尝试将记录批处理到较少的请求中。这有助于客户端和服务器的性能。此配置以字节为单位控制默认批处理大小。不尝试批处理大于这个大小的批处理记录。发送到代理的请求将包含多个批处理,每个带有可用数据的分区都会进行批处理。小批处理大小会减少吞吐量,并可能会降低吞吐量(零的批处理大小将完全禁用批处理)。非常大的批处理大小可能会更严重地使用内存,因为我们始终以额外的记录为指定批处理大小分配缓冲区。 | 16384 | 整数 |
camel.component.kafka.queue-buffering-max-messages | 在使用 async 模式时可以排队生成者的最大未消息数量,然后才能阻止生成者,或者必须丢弃数据。 | 10000 | 整数 |
camel.component.kafka.receive-buffer-bytes | 读取数据时使用的 TCP 接收缓冲区(SO_RCVBUF)的大小。 | 65536 | 整数 |
camel.component.kafka.reconnect-backoff-max-ms | 当重新连接到重复无法连接的代理时,等待的最大时间(毫秒)。如果提供,每个主机的 backoff 将为每个连续的连接失败指数增加,直到最高值。计算 backoff 后,会添加 20% 随机 jitter 以避免连接停滞。 | 1000 | 整数 |
camel.component.kafka.reconnect-backoff-ms | 尝试重新连接到给定主机前等待的时间。这可避免在严格的循环中重复连接到主机。此 backoff 适用于消费者向代理发送的所有请求。 | 50 | 整数 |
camel.component.kafka.record-metadata | 生成者是否应该存储来自发送到 Kafka 的 RecordMetadata 结果。结果存储在包含 RecordMetadata 元数据的列表中。该列表存储在带有键 KafkaConstantsHQKAFKA_RECORDMETA 的标头中。 | true | 布尔值 |
camel.component.kafka.request-required-acks | 确认生成者要求接收领导数量,然后才能考虑请求完成。这控制发送的记录的持久性。以下设置比较常见:acks=0 如果设为零,则制作者将根本不等待服务器的任何确认。记录将立即添加到套接字缓冲区中并被视为发送。不保证服务器在这种情况下收到记录,重试的配置不会生效(因为客户端通常不知道任何故障)。为每个记录的偏移量始终设置为 -1。这意味着领导会将记录写入本地日志,但不会等待所有后续者的确认。在这种情况下,领导会在确认记录后立即失败,但在后续者复制前它会丢失。acks=all 表示领导将等待完整的 in-sync 副本集确认记录。这样可保证,只要至少有一个同步副本保持活跃状态,就不会丢失记录。这是最强的保证。 | 1 | 字符串 |
camel.component.kafka.request-timeout-ms | 在将错误发送到客户端前,代理将等待尝试满足 request.required.acks 要求的时间。 | 30000 | 整数 |
camel.component.kafka.resume-strategy | 这个选项允许用户设置自定义恢复策略。恢复策略会在分配分区时执行(例如:连接或重新连接)。它允许实现自定义如何恢复操作,并更灵活替代 seekTo 和 offsetRepository 机制。有关实现详情,请参阅 KafkaConsumerResumeStrategy。此选项不会影响自动提交设置。使用此设置的实现可能还希望使用手动提交选项进行评估。选项是一个 org.apache.camel.component.kafka.consumer.support.KafkaConsumerResumeStrategy 类型。 | KafkaConsumerResumeStrategy | |
camel.component.kafka.retries | 设置大于零的值将导致客户端重新发送发送失败的任何记录,并显示潜在的临时错误。请注意,这个重试与客户端在收到错误时重新处理记录不同。允许重试可能会更改记录顺序,因为如果两个记录发送到单个分区,第一个失败且被重试,但第二个成功,则可能会首先出现第二个记录。 | 0 | 整数 |
camel.component.kafka.retry-backoff-ms | 每次重试前,制作者会刷新相关主题的元数据,以查看是否已选择新的领导。由于领导选举机制需要一些时间,此属性指定制作者在刷新元数据前等待的时间。 | 100 | 整数 |
camel.component.kafka.sasl-jaas-config | 公开 kafka sasl.jaas.config 参数示例: org.apache.kafka.common.security.plain.PlainLoginModule required username=USERNAME password=PASSWORD;。 | 字符串 | |
camel.component.kafka.sasl-kerberos-service-name | Kafka 运行的 Kerberos 主体名称。这可以在 Kafka 的 JAAS 配置或 Kafka 配置中定义。 | 字符串 | |
camel.component.kafka.sasl-mechanism | 使用简单验证和安全层(SASL)机制。有关有效值,请参阅。 | GSSAPI | 字符串 |
camel.component.kafka.schema-registry-u-r-l | 要使用的 Confluent Platform 模式 registry 服务器的 URL。格式为 host1:port1,host2:port2。这在 Confluent Platform 文档中称为 schema.registry.url。这个选项仅适用于 Confluent Platform (不适用于标准 Apache Kafka)。 | 字符串 | |
camel.component.kafka.security-protocol | 用于与代理通信的协议。支持 SASL_PLAINTEXT, PLAINTEXT 和 SSL。 | 明文 | 字符串 |
camel.component.kafka.seek-to | 设置 KafkaConsumer 将在启动时从开始或结束读取:start : read from end : read from end this is replace the previous attributes seekToBeginning。 | 字符串 | |
camel.component.kafka.send-buffer-bytes | 套接字写入缓冲区大小。 | 131072 | 整数 |
camel.component.kafka.session-timeout-ms | 使用 Kafka 组管理功能时检测失败的超时。 | 10000 | 整数 |
camel.component.kafka.shutdown-timeout | 超时时间(毫秒)以毫秒为单位等待消费者或生成者关闭并终止其 worker 线程。 | 30000 | 整数 |
camel.component.kafka.specific-avro-reader | 这可让特定的 Avro reader 与 Confluent Platform schema registry 和 io.confluent.kafka.serializers.KafkaAvroDeserializer 搭配使用。这个选项仅适用于 Confluent Platform (不适用于标准 Apache Kafka)。 | false | 布尔值 |
camel.component.kafka.ssl-cipher-suites | 密码套件列表。这是用于使用 TLS 或 SSL 网络协议协商网络连接的安全设置的身份验证、加密、MAC 和密钥交换算法的命名组合。支持所有可用的密码套件。 | 字符串 | |
camel.component.kafka.ssl-context-parameters | 使用 Camel SSLContextParameters 对象的 SSL 配置。如果配置了,则在其他 SSL 端点参数之前应用它。注意: Kafka 只支持从文件位置加载密钥存储,因此在 KeyStoreParameters.resource 选项中使用 file: 前缀。选项是 org.apache.camel.support.jsse.SSLContextParameters 类型。 | SSLContextParameters | |
camel.component.kafka.ssl-enabled-protocols | 为 SSL 连接启用的协议列表。TLSv1.2、TLSv1.1 和 TLSv1 会被默认启用。 | 字符串 | |
camel.component.kafka.ssl-endpoint-algorithm | 端点识别算法,使用服务器证书验证服务器主机名。 | https | 字符串 |
camel.component.kafka.ssl-key-password | 密钥存储文件中私钥的密码。对于客户端,这是可选的。 | 字符串 | |
camel.component.kafka.ssl-keymanager-algorithm | SSL 连接的密钥管理器工厂使用的算法。默认值为为 Java 虚拟机配置的密钥管理器工厂算法。 | SunX509 | 字符串 |
camel.component.kafka.ssl-keystore-location | 密钥存储文件的位置。这对客户端是可选的,可用于客户端的双向身份验证。 | 字符串 | |
camel.component.kafka.ssl-keystore-password | 密钥存储文件的存储密码。这对客户端是可选的,且仅在配置了 ssl.keystore.location 时才需要。 | 字符串 | |
camel.component.kafka.ssl-keystore-type | 密钥存储文件的文件格式。对于客户端,这是可选的。默认值为 JKS。 | JKS | 字符串 |
camel.component.kafka.ssl-protocol | 用于生成 SSLContext 的 SSL 协议。默认设置为 TLS,对于大多数情况来说是理想的选择。最近的 JVM 中允许的值是 TLS、TLSv1.1 和 TLSv1.2。SSL、SSLv2 和 SSLv3 可能在较旧的 JVM 中被支持,但由于已知的安全漏洞,不建议使用它们的使用。 | 字符串 | |
camel.component.kafka.ssl-provider | 用于 SSL 连接的安全提供程序的名称。默认值为 JVM 的默认安全提供程序。 | 字符串 | |
camel.component.kafka.ssl-trustmanager-algorithm | 信任管理器工厂用于 SSL 连接的算法。默认值为为 Java 虚拟机配置的信任管理器工厂算法。 | PKIX | 字符串 |
camel.component.kafka.ssl-truststore-location | 信任存储文件的位置。 | 字符串 | |
camel.component.kafka.ssl-truststore-password | 信任存储文件的密码。 | 字符串 | |
camel.component.kafka.ssl-truststore-type | 信任存储文件的文件格式。默认值为 JKS。 | JKS | 字符串 |
camel.component.kafka.synchronous | 设置是否应严格使用同步处理。 | false | 布尔值 |
camel.component.kafka.topic-is-pattern | 主题是否为模式(正则表达式)。这可用于订阅与模式匹配的动态主题数量。 | false | 布尔值 |
camel.component.kafka.use-global-ssl-context-parameters | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
camel.component.kafka.value-deserializer | 用于实现 Deserializer 接口的值反序列化类。 | org.apache.kafka.common.serialization.StringDeserializer | 字符串 |
camel.component.kafka.value-serializer | 消息的序列化类。 | org.apache.kafka.common.serialization.StringSerializer | 字符串 |
camel.component.kafka.worker-pool | 要在 kafka 服务器确认使用异步非阻塞处理从 KafkaProducer 发送的消息后,使用自定义 worker 池继续路由交换。如果使用这个选项,则必须处理线程池的生命周期,以便在不再需要时关闭池。选项是一个 java.util.concurrent.ExecutorService 类型。 | ExecutorService | |
camel.component.kafka.worker-pool-core-size | kafka 服务器后用于继续路由交换的 worker 池的核心线程数量确认使用异步非阻塞处理从 KafkaProducer 发送的消息。 | 10 | 整数 |
camel.component.kafka.worker-pool-max-size | kafka 服务器后,用于继续路由交换的 worker 池的最大线程数量确认使用异步非阻塞处理从 KafkaProducer 发送的消息。 | 20 | 整数 |
第 35 章 kamelet
支持生成者和消费者
Kamelet 组件支持使用 Endpoint 语义与 Camel Route 模板 引擎交互。
35.1. URI 格式
kamelet:templateId/routeId[?options]
35.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
35.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
35.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
35.3. 组件选项
Kamelet 组件支持 9 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
位置 (common) | Kamelets 在文件系统中的位置。可以使用逗号分隔多个位置。 | classpath:/kamelets | 字符串 |
routeProperties (common) | 设置路由本地参数。 | Map | |
templateProperties (common) | 设置模板本地参数。 | Map | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
block (producer) | 如果向没有活跃消费者的 kamelet 端点发送消息,则我们可以告知制作者阻止并等待消费者变为 active。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
timeout (producer) | 如果启用了块,要使用的超时值。 | 30000 | long |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
routeTemplateLoaderListener (advanced) | Autowired To 插件当 Kamelet 组件从外部资源加载 Kamelets 时的自定义监听程序。 | RouteTemplateLoaderListener |
35.4. 端点选项
Kamelet 端点使用 URI 语法进行配置:
kamelet:templateId/routeId
使用以下路径和查询参数:
35.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
templateId (common) | 必需 Route Template ID。 | 字符串 | |
routeId (common) | 路由 ID。默认值通知 :如果没有提供,则 ID 将自动生成。 | 字符串 |
35.4.2. 查询参数(8 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
位置 (common) | Kamelet 的位置,可以从文件系统、classpath 等指定为资源。位置无法使用通配符,且必须引用包含扩展名的文件,例如 file:/etc/foo-kamelet.xml。 | 字符串 | |
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) | 如果向没有活跃消费者的直接端点发送消息,则我们可以告知制作者阻止并等待消费者变为 active。 | true | 布尔值 |
failIfNoConsumers (producer) | 当发送到没有活跃消费者的 kamelet 端点时,生成者是否应该失败。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
timeout (producer) | 如果启用了块,要使用的超时值。 | 30000 | long |
kamelet 端点是 lenient,这意味着端点接受传递给引擎的额外参数,并在路由材料时消耗。
35.5. Discovery(发现)
如果没有找到 Route 模板,kamelet 端点会尝试从文件系统加载相关的 kamelet 定义(默认为 classpath:/kamelets
)。默认解析机制预期 kamelet 文件具有扩展名 .kamelet.yaml
。
35.6. Samples
kamelets 可以像标准 Camel 组件一样使用。例如,假设我们已创建了路由模板,如下所示:
routeTemplate("setMyBody") .templateParameter("bodyValue") .from("kamelet:source") .setBody().constant("{{bodyValue}}");
要让 Kamelet 组件将材料化路由到调用者处理器,我们需要识别路由的输入和输出端点,这通过使用 kamele:source
为输出端点标记输入端点和 kamelet:sink
。
然后,可以实例化并调用模板,如下所示:
from("direct:setMyBody") .to("kamelet:setMyBody?bodyValue=myKamelet");
在 scenes 后,Kamelet Y 组件执行以下操作:
-
它实例化了由给定
templateId
路径参数标识的 Route 模板(本例中为setBody
) -
它将象
直接
组件一样,并将当前路由连接到材料化。
如果您需要以编程方式完成此操作,它类似于:
routeTemplate("setMyBody") .templateParameter("bodyValue") .from("direct:{{foo}}") .setBody().constant("{{bodyValue}}"); TemplatedRouteBuilder.builder(context, "setMyBody") .parameter("foo", "bar") .parameter("bodyValue", "myKamelet") .add(); from("direct:template") .to("direct:bar");
35.7. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 kamelet 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-kamelet-starter</artifactId> </dependency>
组件支持 10 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.kamelet.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.kamelet.block | 如果向没有活跃消费者的 kamelet 端点发送消息,则我们可以告知制作者阻止并等待消费者变为 active。 | true | 布尔值 |
camel.component.kamelet.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.kamelet.enabled | 是否启用 kamelet 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.kamelet.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.kamelet.location | Kamelets 在文件系统中的位置。可以使用逗号分隔多个位置。 | classpath:/kamelets | 字符串 |
camel.component.kamelet.route-properties | 设置路由本地参数。 | Map | |
camel.component.kamelet.route-template-loader-listener | 要插件自定义监听程序,以便在从外部资源加载 Kamelets 时提供自定义监听程序。选项是 org.apache.camel.spi.RouteTemplateLoaderListener 类型。 | RouteTemplateLoaderListener | |
camel.component.kamelet.template-properties | 设置模板本地参数。 | Map | |
camel.component.kamelet.timeout | 如果启用了块,要使用的超时值。 | 30000 | Long |
第 36 章 语言
仅支持生成者
Language 组件允许您将交换发送到端点,该端点由 Camel 中的任何支持的语言执行脚本。通过使用组件来执行语言脚本,它允许更动态的路由功能。例如,通过使用路由 Slip 或 Dynamic Router EIPs,您可以将消息发送到动态定义脚本的语言端点。
此组件开箱即用 camel-core 的方框,因此不需要额外的 JAR。如果选择使用 Groovy 或 JavaScript 语言的语言,您只需要包含其他 Camel 组件。
36.1. URI 格式
language://languageName[:script][?options]
您可以使用与 Camel 中 其他语言 支持的相同表示法为脚本引用外部资源。
language://languageName:resource:scheme:location][?options]
36.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
36.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
36.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
36.3. 组件选项
Language 组件支持 2 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
36.4. 端点选项
语言端点使用 URI 语法进行配置:
language:languageName:resourceUri
使用以下路径和查询参数:
36.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
languageName (producer) | 必需 设置要使用的语言名称。 Enum 值:
| 字符串 | |
resourceUri (producer) | 资源的路径,或在 Registry 中查找 bean 的引用,以用作资源。 | 字符串 |
36.4.2. 查询参数(7 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
allowContextMapAll (producer) | 设置上下文映射是否应允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用此选项以完全访问当前 Exchange 和 CamelContext。这样做会产生潜在的安全风险,因为这会打开对 CamelContext API 完整功能的访问。 | false | 布尔值 |
binary (producer) | 脚本是二进制内容还是文本内容。默认情况下,脚本读取为文本内容(如 java.lang.String)。 | false | 布尔值 |
cacheScript (producer) | 是否缓存编译的脚本以及重复使用 Notice 重新利用脚本可能会导致对一个 Camel org.apache.camel.Exchange 处理一个 Camel org.apache.camel.Exchange 的副作用。 | false | 布尔值 |
contentCache (producer) | 设置是否使用资源内容缓存。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
script (producer) | 设置要执行的脚本。 | 字符串 | |
convert (producer) | 脚本的结果是否应用作消息正文。这个选项是默认的 true。 | true | 布尔值 |
36.5. 消息标头
以下消息标头可用于影响组件的行为
标头 | 描述 |
---|---|
| 要在标头中提供的脚本。优先于在端点上配置的脚本。 |
36.6. 例子
例如,您可以使用 Simple 语言来消息转换消息。
您还可以将脚本作为标头提供,如下所示。在这里,我们使用 XPath 语言从 <foo> 标签中提取文本。
Object out = producer.requestBodyAndHeader("language:xpath", "<foo>Hello World</foo>", Exchange.LANGUAGE_SCRIPT, "/foo/text()"); assertEquals("Hello World", out);
36.7. 从资源载入脚本
您可以为在 endpoint uri 或 Exchange.LANGUAGE_SCRIPT
标头中加载的脚本指定资源 uri。uri 必须以以下方案之一开始:file:、classpath: 或 http :
默认情况下,脚本会加载一次并缓存。但是,您可以禁用 contentCache
选项,并在每次评估时载入脚本。例如,如果在磁盘上更改了文件 myscript.txt,则使用更新的脚本:
您可以使用 "resource:" 前缀来引用与 Camel 中 其他语言 类似的资源,如下所示。
36.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用语言时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-language-starter</artifactId> </dependency>
组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.language.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.language.enabled | 是否启用语言组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.language.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 37 章 Log
仅支持生成者
Log 组件日志记录消息会交换底层日志记录机制。
Camel 使用 SLF4J,允许您通过 SLF4J 配置日志:
- Log4j
- Logback
- Java Util Logging
37.1. URI 格式
log:loggingCategory[?options]
其中 loggingCategory 是要使用的日志记录类别的名称。您可以以以下格式将查询选项附加到 URI 中,
?option=value&option=value&…
使用来自 Registry 的 Logger 实例
如果在 Registry 中有单一的 org.slf4j.Logger
实例,则 loggingCategory 不再用于创建日志记录器实例。改为使用注册的实例。另外,也可以使用 ?logger=#myLogger
URI 参数来引用特定的 Logger
实例。最后,如果没有注册和 URI 日志记录器
参数,则使用 loggingCategory 创建日志记录器实例。
例如,日志端点通常使用 level 选项指定 日志级别
,如下所示:
log:org.apache.camel.example?level=DEBUG
默认日志记录器记录每个交换(常规日志记录)。但是,Camel 还附带了 吞吐量
日志记录器,它会在指定 groupSize
选项时使用。
另外在 DSL 中有一个日志
在 DSL 中也直接有一个 log
,但它具有不同的目的。它适用于轻量级和人为日志。请参阅 LogEIP 的详情。
37.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
37.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
37.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
37.3. 组件选项
日志组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
exchangeFormatter (advanced) | Autowired 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认为 DefaultExchangeFormatter。 | ExchangeFormatter |
37.4. 端点选项
日志端点使用 URI 语法进行配置:
log:loggerName
使用以下路径和查询参数:
37.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
loggerName (producer) | 要使用的日志类别 所需的 名称。 | 字符串 |
37.4.2. 查询参数(27 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
groupActiveOnly (producer) | 如果为 true,如果没有接收新消息的时间间隔(如果为 false),则无论消息流量是什么,都会隐藏统计数据。 | true | 布尔值 |
groupDelay (producer) | 设置统计数据的初始延迟(以 millis 为单位)。 | Long | |
groupInterval (producer) | 如果指定将按这个时间间隔对消息统计进行分组(以 millis 为单位)。 | Long | |
groupSize (producer) | 指定吞吐量日志记录的组大小的整数。 | 整数 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
level (producer) | 要使用的日志记录级别。默认值为 INFO。 Enum 值:
| INFO | 字符串 |
logMask (producer) | 如果为 true,在日志中屏蔽敏感信息,如密码或密码短语。 | 布尔值 | |
marker (producer) | 要使用的可选标记名称。 | 字符串 | |
exchangeFormatter (advanced) | 使用自定义交换格式: | ExchangeFormatter | |
maxChars (formatting) | 限制每行记录的字符数。 | 10000 | int |
多行 (格式) | 如果启用,则每个信息都会在新行中输出。 | false | 布尔值 |
showAll (formatting) | 打开所有选项的快速选项。(如果使用,则必须手动设置 maxChars)。 | false | 布尔值 |
showAllProperties (formatting) | 显示所有交换属性(内部和外部)。 | false | 布尔值 |
showBody (formatting) | 显示消息正文。 | true | 布尔值 |
showBodyType (formatting) | 显示正文 Java 类型。 | true | 布尔值 |
showCaughtException (formatting) | 如果交换具有 caught 异常,则会显示异常信息(无堆栈跟踪)。caught 异常作为属性存储在交换上(使用键 org.apache.camel.Exchange114EXCEPTION_CAUGHT),而一个 doCatch 可以捕获例外。 | false | 布尔值 |
showException (formatting) | 如果交换具有例外,则显示异常消息(无 stacktrace)。 | false | 布尔值 |
showExchangeId (formatting) | 显示唯一的交换 ID。 | false | 布尔值 |
showExchangePattern (formatting) | 显示消息交换模式(或 MEP 用于短)。 | true | 布尔值 |
showFiles (格式) | 如果已启用 Camel 将输出文件。 | false | 布尔值 |
showFuture (格式) | 如果已启用的 Camel 将在将来的对象上等待它完成,以获取要记录有效负载。 | false | 布尔值 |
showHeaders (formatting) | 显示消息标头。 | false | 布尔值 |
showProperties (formatting) | 显示交换属性(仅限自定义)。使用 showAllProperties 显示内部和外部属性。 | false | 布尔值 |
showStack Trace (formatting) | 如果交换具有例外,显示堆栈追踪。仅在启用 showAll、showException 或 showCaughtException 之一时才有效。 | false | 布尔值 |
showStreams (formatting) | Camel 是否应该显示流正文(如 java.io.InputStream)。如果您启用这个选项,那么您稍后可能无法访问消息正文,因为该日志记录器已读取该流。要修复这一点,您必须使用流缓存。 | false | 布尔值 |
skipBodyLineSeparator (formatting) | 在记录消息正文时是否跳过行分隔符。这允许在一行中记录消息正文,将此选项设置为 false 将保留来自正文的任何行分隔符,然后记录正文。 | true | 布尔值 |
风格 (格式) | 设置要使用的输出样式。 Enum 值:
| 默认值 | OutputStyle |
37.5. 常规日志记录器示例
在以下路由中,我们在处理顺序前在 DEBUG
级别记录传入的顺序:
from("activemq:orders").to("log:com.mycompany.order?level=DEBUG").to("bean:processOrder");
或使用 Spring XML 定义路由:
<route> <from uri="activemq:orders"/> <to uri="log:com.mycompany.order?level=DEBUG"/> <to uri="bean:processOrder"/> </route>
37.6. 带有格式示例的常规日志记录器
在以下路由中,我们将进入的顺序记录在 INFO
级别,然后再处理顺序。
from("activemq:orders"). to("log:com.mycompany.order?showAll=true&multiline=true").to("bean:processOrder");
37.7. 带有 groupSize 样本的 throughput logger
在以下路由中,我们记录在 DEBUG
级别按 10 个消息分组的传入顺序的吞吐量。
from("activemq:orders"). to("log:com.mycompany.order?level=DEBUG&groupSize=10").to("bean:processOrder");
37.8. 带有 groupInterval 样本的吞吐量日志记录器
此路由将导致每 10 个消息记录一次,即使没有消息流量,也会显示初始 60s 延迟和统计数据。
from("activemq:orders"). to("log:com.mycompany.order?level=DEBUG&groupInterval=10000&groupDelay=60000&groupActiveOnly=false").to("bean:processOrder");
以下内容会被记录:
"Received: 1000 new messages, with total 2000 so far. Last group took: 10000 millis which is: 100 messages per second. average: 100"
37.9. 屏蔽敏感信息,如密码
您可以通过将 logMask
标志设置为 true
来启用日志记录的安全掩码。请注意,这个选项也会影响日志 EIP。
在 CamelContext 级别的 Java DSL 中启用掩码:
camelContext.setLogMask(true);
在 XML 中:
<camelContext logMask="true">
您还可以在端点级别打开|关闭。要在端点级别的 Java DSL 中启用掩码,请在日志端点的 URI 中添加 logMask=true 选项:
from("direct:start").to("log:foo?logMask=true");
在 XML 中:
<route> <from uri="direct:foo"/> <to uri="log:foo?logMask=true"/> </route>
org.apache.camel.support.processor.DefaultMaskingFormatter
默认用于屏蔽。如果要使用自定义屏蔽格式器,请将其放在 registry 中,其名称为 CamelCustomLogMask
。请注意,掩码格式必须实施 org.apache.camel.spi.MaskingFormatter
。
37.10. 日志输出的完整自定义
通过这个部分中所述的选项,您可以控制日志记录器的许多输出。但是,日志行始终遵循以下结构:
Exchange[Id:ID-machine-local-50656-1234567901234-1-2, ExchangePattern:InOut, Properties:{CamelToEndpoint=log://org.apache.camel.component.log.TEST?showAll=true, CamelCreatedTimestamp=Thu Mar 28 00:00:00 WET 2013}, Headers:{breadcrumbId=ID-machine-local-50656-1234567901234-1-1}, BodyType:String, Body:Hello World, Out: null]
在某些情况下这种格式不可理解,这可能是因为您需要…
- 过滤打印的标头和属性,使其在 Insights 和详细程度之间平衡。
- 将日志消息调整为您认为最易读的任何内容。
- 通过日志减系统(如 Splunk)定制用于摘要的日志消息。
- 以不同的方式打印特定的正文类型。
每当需要绝对自定义时,您可以创建一个实施接口的类。在访问完整交换 的格式(Exchange)
方法中,以便您可以选择并提取所需的准确信息,以自定义方式对其进行格式化并返回它。返回值将成为最终日志消息。
您可以通过以下两种方式之一获取您的自定义 ExchangeFormatter
:
在 Registry 中显式实例化 LogComponent:
<bean name="log" class="org.apache.camel.component.log.LogComponent"> <property name="exchangeFormatter" ref="myCustomFormatter" /> </bean>
37.10.1. 与配置相关的惯例
只需将 bean 替换为名称 logFormatter
; 日志组件就足够智能,以便自动获取它。
<bean name="logFormatter" class="com.xyz.MyCustomExchangeFormatter" />
ExchangeFormatter
应用到该 Camel 上下文中的所有日志端点。如果您需要不同的端点使用不同的 ExchangeFormatter,请根据需要实例化 LogComponent,并使用相关的 bean 名称作为端点前缀。
使用自定义日志格式时,您可以在 log uri 中指定参数,该参数在自定义日志格式器上配置。虽然当您这样做时,您应该将"logFormatter"定义为,因此如果您具有不同的参数,则不会共享,例如:
<bean name="logFormatter" class="com.xyz.MyCustomExchangeFormatter" scope="prototype"/>
然后,我们可以使用带有不同选项的 log uri 的 Camel 路由:
<to uri="log:foo?param1=foo&param2=100"/> <to uri="log:bar?param1=bar&param2=200"/>
37.11. Spring Boot Auto-Configuration
当在 Spring Boot 中使用日志时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-log-starter</artifactId> </dependency>
组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.log.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.log.enabled | 是否启用日志组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.log.exchange-formatter | 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认为 DefaultExchangeFormatter。选项是 org.apache.camel.spi.ExchangeFormatter 类型。 | ExchangeFormatter | |
camel.component.log.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 38 章 Mail
支持生成者和消费者
邮件组件通过 Spring 邮件支持和底层 JavaMail 系统提供对电子邮件的访问。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-mail</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
POP3 或 IMAP
POP3 有一些限制,如果可能,则鼓励使用 IMAP。
使用模拟邮件来测试
,您可以使用模拟框架进行单元测试,这可让您在不需要真实邮件服务器的情况下进行测试。但是,当您进入生产环境或其他需要向真实邮件服务器发送邮件的环境时,您应该不要包含模拟电子邮件。只是 classpath 上的 模拟-javamail.jar 存在,这意味着它将启动并避免发送邮件。
38.1. URI 格式
邮件端点可以具有以下 URI 格式之一(分别用于协议、SMTP、POP3 或 IMAP):
smtp://[username@]host[:port][?options] pop3://[username@]host[:port][?options] imap://[username@]host[:port][?options]
邮件组件还支持这些协议的安全变体(通过 SSL 进行分层)。您可以通过在方案中添加 s
来启用安全协议:
smtps://[username@]host[:port][?options] pop3s://[username@]host[:port][?options] imaps://[username@]host[:port][?options]
38.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
38.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
38.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
38.3. 组件选项
邮件组件支持 43 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
closeFolder (consumer) | 消费者是否在轮询后关闭文件夹。将这个选项设置为 false,也具有 disconnect=false,然后消费者在轮询之间保持文件夹打开。 | true | 布尔值 |
CopyTo (consumer) | 处理邮件后,它可以复制到具有指定名称的邮件文件夹中。您可以使用键 copyTo 的标头覆盖此配置值,允许您将消息复制到运行时配置的文件夹名称。 | 字符串 | |
decodeFilename (consumer) | 如果设置为 true,则使用 MimeUtility.decodeText 方法来解码文件名。这与设置 JVM 系统属性 mail.mime.encodefilename 类似。 | false | 布尔值 |
delete (consumer) | 在消息被处理后删除消息。这可以通过在邮件中设置 DELETED 标志来完成。如果为 false,则设置 SEEN 标志。从 Camel 2.10 开始,您可以通过使用键 delete 设置标头来覆盖此配置选项,以确定是否应该删除邮件。 | false | 布尔值 |
disconnect (consumer) | 消费者在轮询后是否应断开。如果启用此选项,它会强制 Camel 在每个轮询连接。 | false | 布尔值 |
handleFailedMessage (consumer) | 如果邮件使用者无法检索给定的邮件消息,则此选项允许处理消费者的错误处理程序导致的异常。通过在消费者上启用网桥错误处理程序,然后 Camel 路由错误处理程序可以处理异常。默认行为是消费者抛出异常,并且批处理中的邮件无法由 Camel 路由。 | false | 布尔值 |
mimeDecodeHeaders (consumer) | 这个选项启用对邮件标头的透明 MIME 解码和取消处理。 | false | 布尔值 |
moveTo (consumer) | 处理邮件后,它可以移到具有指定名称的邮件文件夹中。您可以使用键 moveTo 的标头来覆盖此配置值,允许您将消息移到运行时配置的文件夹名称。 | 字符串 | |
peek (consumer) | 在处理邮件之前,会将 javax.mail.Message 标记为 peeked。这只适用于 IMAPMessage 消息类型。通过使用将邮件标记为 SEEN 的邮件,这允许我们在 Camel 中存在错误处理,请回滚邮件。 | true | 布尔值 |
skipFailedMessage (consumer) | 如果邮件使用者无法检索给定的邮件邮件,此选项允许跳过邮件并继续检索下一个邮件。默认行为是消费者抛出异常,并且批处理中的邮件无法由 Camel 路由。 | false | 布尔值 |
unseen (consumer) | 是否只通过不可预测的邮件限制。 | true | 布尔值 |
fetchSize (consumer (advanced)) | 设置轮询期间要消耗的最大消息数。如果载体文件夹包含很多消息,这可用于避免过载邮件服务器。默认值 -1 表示没有获取大小,所有信息都会被消耗。将值设为 0 是一个特殊的地方,Camel 根本不消耗任何消息。 | -1 | int |
folderName (consumer (advanced)) | 要轮询的文件夹。 | INBOX | 字符串 |
mapMailMessage (consumer (advanced)) | 指定 Camel 是否应该将收到的邮件映射到 Camel body/headers/attachments。如果设置为 true,邮件邮件的正文将映射到 Camel IN 消息的正文,邮件标头将映射到 IN 标头,并附加至 Camel IN attachment 消息。如果此选项设为 false,则 IN 消息包含原始 javax.mail.Message。您可以通过调用 exchange.getIn ().getBody (javax.mail.Message.class)来检索此原始消息。 | true | 布尔值 |
bcc (producer) | 设置 BCC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
CC (producer) | 设置 CC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
from (producer) | 来自电子邮件地址。 | camel@localhost | 字符串 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
replyTo (producer) | Reply-To receivers (响应邮件的接收器)。使用逗号分隔多个电子邮件地址。 | 字符串 | |
subject (producer) | 正在发送的消息的主题。注: 在标头中设置主题优先于这个选项。 | 字符串 | |
to (producer) | 设置 To email address。使用逗号分隔多个电子邮件地址。 | 字符串 | |
javaMailSender (producer (advanced)) | 使用自定义 org.apache.camel.component.mail.JavaMailSender 来发送电子邮件。 | JavaMailSender | |
additionalJavaMailProperties (advanced) | 设置额外的 java 邮件属性,这将附加/覆盖基于所有其他选项设置的任何默认属性。如果您需要添加一些特殊选项,但希望保留其他特殊选项,这非常有用。 | Properties | |
alternativeBodyHeader (advanced) | 指定包含替代电子邮件正文的 IN 消息标头的密钥。例如,如果您以文本/html 格式发送电子邮件,并希望为非 HTML 电子邮件客户端提供替代邮件正文,请将此密钥的替代邮件正文设置为标头。 | CamelMailAlternativeBody | 字符串 |
attachmentsContentTransferEncodingResolver (advanced) | 要使用自定义将ContentTransferEncodingResolver 解决用于附件的 content-type-encoding。 | AttachmentsContentTransferEncodingResolver | |
authenticator (advanced) | 用于登录的验证器。如果设置,则忽略密码和用户名。可用于可过期的令牌,因此必须动态读取。 | MailAuthenticator | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
配置 (高级) | 设置邮件配置。 | MailConfiguration | |
connectionTimeout (advanced) | 连接超时(毫秒)。 | 30000 | int |
contentType (advanced) | 邮件消息内容类型。将 text/html 用于 HTML 邮件。 | text/plain | 字符串 |
contentTypeResolver (advanced) | 用于确定文件附加的 Content-Type 的解析器。 | ContentTypeResolver | |
debugMode (advanced) | 在底层邮件框架中启用调试模式。SUN 邮件框架默认将调试信息记录到 System.out。 | false | 布尔值 |
ignoreUnsupportedCharset (advanced) | 选项使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果 charset 不支持,则 charset=XXX (其中 XXX 代表不受支持的 charset)已从 content-type 中删除,它依赖于平台默认。 | false | 布尔值 |
ignoreUriScheme (advanced) | 选项使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果 charset 不支持,则 charset=XXX (其中 XXX 代表不受支持的 charset)已从 content-type 中删除,它依赖于平台默认。 | false | 布尔值 |
javaMailProperties (advanced) | 设置 java 邮件选项。将清除任何默认属性,并且仅使用为此方法提供的属性。 | Properties | |
Session (advanced) | 指定 camel 应用于所有邮件交互的邮件会话。在由某些其他资源(如 IaaS 容器)创建和管理邮件会话的情况下很有用。使用自定义邮件会话时,将使用邮件会话中的主机名和端口(如果在会话中配置)。 | 会话 | |
useInlineAttachments (advanced) | 是否使用内联或附加。 | false | 布尔值 |
HeaderFilterStrategy (filter) | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 将标头过滤到或从 Camel 消息过滤。 | HeaderFilterStrategy | |
密码 (安全) | 登录的密码。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
sslContextParameters (security) | 使用 SSLContext 参数配置安全性: | SSLContextParameters | |
useGlobalSslContextParameters (security) | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
用户名 (安全) | 用于登录的用户名。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 |
38.4. 端点选项
邮件端点使用 URI 语法进行配置:
imap:host:port
使用以下路径和查询参数:
38.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
host (common) | 必需 邮件服务器主机名。 | 字符串 | |
port (common) | 邮件服务器的端口号。 | int |
38.4.2. 查询参数(66 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
closeFolder (consumer) | 消费者是否在轮询后关闭文件夹。将这个选项设置为 false,也具有 disconnect=false,然后消费者在轮询之间保持文件夹打开。 | true | 布尔值 |
CopyTo (consumer) | 处理邮件后,它可以复制到具有指定名称的邮件文件夹中。您可以使用键 copyTo 的标头覆盖此配置值,允许您将消息复制到运行时配置的文件夹名称。 | 字符串 | |
decodeFilename (consumer) | 如果设置为 true,则使用 MimeUtility.decodeText 方法来解码文件名。这与设置 JVM 系统属性 mail.mime.encodefilename 类似。 | false | 布尔值 |
delete (consumer) | 在消息被处理后删除消息。这可以通过在邮件中设置 DELETED 标志来完成。如果为 false,则设置 SEEN 标志。从 Camel 2.10 开始,您可以通过使用键 delete 设置标头来覆盖此配置选项,以确定是否应该删除邮件。 | false | 布尔值 |
disconnect (consumer) | 消费者在轮询后是否应断开。如果启用此选项,它会强制 Camel 在每个轮询连接。 | false | 布尔值 |
handleFailedMessage (consumer) | 如果邮件使用者无法检索给定的邮件消息,则此选项允许处理消费者的错误处理程序导致的异常。通过在消费者上启用网桥错误处理程序,然后 Camel 路由错误处理程序可以处理异常。默认行为是消费者抛出异常,并且批处理中的邮件无法由 Camel 路由。 | false | 布尔值 |
maxMessagesPerPoll (consumer) | 指定每个轮询要收集的最大消息数。默认情况下,不会设置最大值。可用于设置限制(例如 1000),以避免在服务器启动时下载数千个文件。将值设为 0 或负数以禁用这个选项。 | int | |
mimeDecodeHeaders (consumer) | 这个选项启用对邮件标头的透明 MIME 解码和取消处理。 | false | 布尔值 |
moveTo (consumer) | 处理邮件后,它可以移到具有指定名称的邮件文件夹中。您可以使用键 moveTo 的标头来覆盖此配置值,允许您将消息移到运行时配置的文件夹名称。 | 字符串 | |
peek (consumer) | 在处理邮件之前,会将 javax.mail.Message 标记为 peeked。这只适用于 IMAPMessage 消息类型。通过使用将邮件标记为 SEEN 的邮件,这允许我们在 Camel 中存在错误处理,请回滚邮件。 | true | 布尔值 |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
skipFailedMessage (consumer) | 如果邮件使用者无法检索给定的邮件邮件,此选项允许跳过邮件并继续检索下一个邮件。默认行为是消费者抛出异常,并且批处理中的邮件无法由 Camel 路由。 | false | 布尔值 |
unseen (consumer) | 是否只通过不可预测的邮件限制。 | true | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
fetchSize (consumer (advanced)) | 设置轮询期间要消耗的最大消息数。如果载体文件夹包含很多消息,这可用于避免过载邮件服务器。默认值 -1 表示没有获取大小,所有信息都会被消耗。将值设为 0 是一个特殊的地方,Camel 根本不消耗任何消息。 | -1 | int |
folderName (consumer (advanced)) | 要轮询的文件夹。 | INBOX | 字符串 |
mailUidGenerator (consumer (advanced)) | 可插拔邮件生成器,允许使用自定义逻辑生成邮件邮件的 UUID。 | MailUidGenerator | |
mapMailMessage (consumer (advanced)) | 指定 Camel 是否应该将收到的邮件映射到 Camel body/headers/attachments。如果设置为 true,邮件邮件的正文将映射到 Camel IN 消息的正文,邮件标头将映射到 IN 标头,并附加至 Camel IN attachment 消息。如果此选项设为 false,则 IN 消息包含原始 javax.mail.Message。您可以通过调用 exchange.getIn ().getBody (javax.mail.Message.class)来检索此原始消息。 | true | 布尔值 |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
postProcessAction (consumer (advanced)) | 指的是 mailBoxPostProcessAction,用于在正常处理结束时对交易执行后处理任务。 | MailBoxPostProcessAction | |
bcc (producer) | 设置 BCC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
CC (producer) | 设置 CC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
from (producer) | 来自电子邮件地址。 | camel@localhost | 字符串 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
replyTo (producer) | Reply-To receivers (响应邮件的接收器)。使用逗号分隔多个电子邮件地址。 | 字符串 | |
subject (producer) | 正在发送的消息的主题。注: 在标头中设置主题优先于这个选项。 | 字符串 | |
to (producer) | 设置 To email address。使用逗号分隔多个电子邮件地址。 | 字符串 | |
javaMailSender (producer (advanced)) | 使用自定义 org.apache.camel.component.mail.JavaMailSender 来发送电子邮件。 | JavaMailSender | |
additionalJavaMailProperties (advanced) | 设置额外的 java 邮件属性,这将附加/覆盖基于所有其他选项设置的任何默认属性。如果您需要添加一些特殊选项,但希望保留其他特殊选项,这非常有用。 | Properties | |
alternativeBodyHeader (advanced) | 指定包含替代电子邮件正文的 IN 消息标头的密钥。例如,如果您以文本/html 格式发送电子邮件,并希望为非 HTML 电子邮件客户端提供替代邮件正文,请将此密钥的替代邮件正文设置为标头。 | CamelMailAlternativeBody | 字符串 |
attachmentsContentTransferEncodingResolver (advanced) | 要使用自定义将ContentTransferEncodingResolver 解决用于附件的 content-type-encoding。 | AttachmentsContentTransferEncodingResolver | |
authenticator (advanced) | 用于登录的验证器。如果设置,则忽略密码和用户名。可用于可过期的令牌,因此必须动态读取。 | MailAuthenticator | |
绑定 (高级) | 设置用于从 Camel 消息转换到邮件邮件的绑定。 | MailBinding | |
connectionTimeout (advanced) | 连接超时(毫秒)。 | 30000 | int |
contentType (advanced) | 邮件消息内容类型。将 text/html 用于 HTML 邮件。 | text/plain | 字符串 |
contentTypeResolver (advanced) | 用于确定文件附加的 Content-Type 的解析器。 | ContentTypeResolver | |
debugMode (advanced) | 在底层邮件框架中启用调试模式。SUN 邮件框架默认将调试信息记录到 System.out。 | false | 布尔值 |
HeaderFilterStrategy (advanced) | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 来过滤标头。 | HeaderFilterStrategy | |
ignoreUnsupportedCharset (advanced) | 选项使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果 charset 不支持,则 charset=XXX (其中 XXX 代表不受支持的 charset)已从 content-type 中删除,它依赖于平台默认。 | false | 布尔值 |
ignoreUriScheme (advanced) | 选项使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果 charset 不支持,则 charset=XXX (其中 XXX 代表不受支持的 charset)已从 content-type 中删除,它依赖于平台默认。 | false | 布尔值 |
javaMailProperties (advanced) | 设置 java 邮件选项。将清除任何默认属性,并且仅使用为此方法提供的属性。 | Properties | |
Session (advanced) | 指定 camel 应用于所有邮件交互的邮件会话。在由某些其他资源(如 IaaS 容器)创建和管理邮件会话的情况下很有用。使用自定义邮件会话时,将使用邮件会话中的主机名和端口(如果在会话中配置)。 | 会话 | |
useInlineAttachments (advanced) | 是否使用内联或附加。 | false | 布尔值 |
idempotentRepository (filter) | 可插拔存储库 org.apache.camel.spi.IdempotentRepository,它允许集群从同一站使用,并使存储库协调邮件是否对消费者处理有效。默认情况下不使用存储库。 | IdempotentRepository | |
idempotentRepositoryRemoveOnCommit (filter) | 使用幂等存储库时,当成功处理邮件并提交后,消息 ID 会从幂等存储库(默认)或保留在存储库中。默认情况下,它假定消息 id 是唯一的,且没有保留在存储库中的值,因为邮件消息将标记为 see/moved 或 removed,以防止再次消耗它。因此,将消息 id 存储在幂等存储库中具有较少的值。但是,此选项允许存储消息 ID,因为您可能具有的任何原因。 | true | 布尔值 |
searchTerm (filter) | 引用 javax.mail.search.SearchTerm,它允许根据搜索标准(如主题、正文、来自等)过滤邮件。 | SearchTerm | |
backoffErrorThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前发生的后续错误轮询(因为某些错误)的数量。 | int | |
backoffIdleThreshold (scheduler) | 在 backoffMultipler 应该 kick-in 之前应该发生的后续空闲轮询数量。 | int | |
backoffMultiplier (scheduler) | 如果一行中有很多后续空闲/errors,则让调度的轮询消费者避退。然后,倍数是在下一次实际尝试再次发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/或 backoffErrorThreshold。 | int | |
delay (scheduler) | 下一次轮询前的时间(毫秒)。 | 60000 | long |
greedy (scheduler) | 如果启用了 greedy,如果上一个运行轮询 1 或更多消息,则 ScheduledPollConsumer 将立即运行。 | false | 布尔值 |
initialDelay (scheduler) | 第一次轮询开始前的毫秒。 | 1000 | long |
repeatCount (scheduler) | 指定触发的最大数量。因此,如果您将其设置为 1,调度程序将只触发一次。如果您将其设置为 5,它将只触发五次。值为零或负数表示会永久触发。 | 0 | long |
runLoggingLevel (scheduler) | 消费者在轮询时记录 start/complete log 行。这个选项允许您为其配置日志级别。 Enum 值:
| TRACE | LoggingLevel |
scheduledExecutorService (scheduler) | 允许配置用于消费者的自定义/共享线程池。默认情况下,每个使用者都有自己的单线程线程池。 | ScheduledExecutorService | |
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 | 布尔值 |
密码 (安全) | 登录的密码。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
sslContextParameters (security) | 使用 SSLContext 参数配置安全性: | SSLContextParameters | |
用户名 (安全) | 用于登录的用户名。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
sortTerm (sort) | 排序消息的顺序。只支持 IMAP。在使用 POP3 或 IMAP 服务器没有 SORT 功能时,模拟到某种程度。 | SortTerm[] |
38.4.3. 端点示例
通常,您可以使用登录凭证指定 URI,如下所示(示例为 SMTP):
smtp://[username@]host[:port][?password=somepwd]
另外,也可以将用户名和密码指定为查询选项:
smtp://host[:port]?password=somepwd&username=someuser
例如:
smtp://mycompany.mailserver:30?password=tiger&username=scott
38.4.4. 组件别名名称
- IMAP
- IMAPs
- POP3s
- SMTP
- SMTPs
38.4.5. 默认端口
支持默认端口号。如果省略端口号,Camel 会根据协议决定要使用的端口号。
协议 | 默认端口号 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
38.5. SSL 支持
底层邮件框架负责提供 SSL 支持。您可以通过完全指定必要的 Java 邮件 API 配置选项来配置 SSL/TLS 支持,或者通过组件或端点配置提供配置的 SSLContextParameters。
38.5.1. 使用 JSSE 配置工具
邮件组件通过 Camel JSSE 配置实用程序支持 SSL/TLS 配置。这个工具可显著减少您需要编写的组件特定代码数量,并在端点和组件级别进行配置。以下示例演示了如何将实用程序与邮件组件一起使用。
端点的编程配置
KeyStoreParameters ksp = new KeyStoreParameters(); ksp.setResource("/users/home/server/truststore.jks"); ksp.setPassword("keystorePassword"); TrustManagersParameters tmp = new TrustManagersParameters(); tmp.setKeyStore(ksp); SSLContextParameters scp = new SSLContextParameters(); scp.setTrustManagers(tmp); Registry registry = ... registry.bind("sslContextParameters", scp); ... from(...) .to("smtps://smtp.google.com?username=user@gmail.com&password=password&sslContextParameters=#sslContextParameters");
基于 Spring DSL 的端点配置
... <camel:sslContextParameters id="sslContextParameters"> <camel:trustManagers> <camel:keyStore resource="/users/home/server/truststore.jks" password="keystorePassword"/> </camel:trustManagers> </camel:sslContextParameters>... ... <to uri="smtps://smtp.google.com?username=user@gmail.com&password=password&sslContextParameters=#sslContextParameters"/>...
38.5.2. 直接配置 JavaMail
Camel 使用 Jakarta JavaMail,它只信任由已知的证书颁发机构(默认的 JVM 信任配置)发布的证书。如果您发布自己的证书,您必须将 CA 证书导入到 JVM 的 Java 信任存储文件中,请覆盖默认的 JVM 信任存储文件(请参阅 JavaMail 中的 SSLNOTES.txt
)。
38.6. 邮件内容
Camel 使用消息交换的 IN body 作为 MimeMessage 文本内容。正文转换为 String.class。
Camel 将所有交换的 IN 标头复制到 MimeMessage 标头。
MimeMessage 的主题可以使用 IN 消息的 header 属性进行配置。以下代码演示了这一点:
同样适用于其他 MimeMessage 标头,如接收者,因此您可以使用与 To 相同的标头属性:
使用 mailProducer 时,应可以从 Camel 消息标头中使用键 CamelMailMessageId 获取 MimeMessage 的消息 ID。
38.7. 标头优先于预先配置的接收者
在消息标头中指定的接收者总是优先于端点 URI 中预先配置的接收者。其重点在于,如果您在消息标头中提供任何接收者,这是您获取的。端点 URI 中预先配置的接收者被视为回退。
在以下示例中,电子邮件消息发送到 davsclaus@apache.org
,因为它优先于预先配置的接收者 info@mycompany.com。
端点 URI 中的任何 CC
和 BCC
设置都会被忽略,这些接收者将不会接收任何邮件。标头和预配置设置之间的选择是完全相互排除的:邮件组件需要完全从标头中接受发送者,或完全从预配置设置中接受发送者。无法混合和匹配标头和预配置设置。
Map<String, Object> headers = new HashMap<String, Object>(); headers.put("to", "davsclaus@apache.org"); template.sendBodyAndHeaders("smtp://admin@localhost?to=info@mycompany.com", "Hello World", headers);
38.8. 用于更轻松地配置的多个接收者
可以使用逗号分隔的或以分号分开的列表来设置多个接收者。这同时适用于标头设置,以及端点 URI 中的设置。例如:
Map<String, Object> headers = new HashMap<String, Object>(); headers.put("to", "davsclaus@apache.org ; jstrachan@apache.org ; ningjiang@apache.org");
前面的示例使用分号 ;
,作为分隔符字符。
38.9. 设置发送者名称和电子邮件
您可以使用格式(名为 < ;email&
gt; )指定接收者,使其包含接收者的名称和电子邮件地址。
例如,您可以在消息中定义以下标头:
Map headers = new HashMap(); map.put("To", "Claus Ibsen <davsclaus@apache.org>"); map.put("From", "James Strachan <jstrachan@apache.org>"); map.put("Subject", "Camel is cool");
38.10. javamail API (ex SUN JavaMail)
javamail API 在 hood 下用于消耗和生成邮件。我们鼓励最终用户在使用 POP3 或 IMAP 协议时参考这些参考。特别是 POP3 具有比 IMAP 更有限的功能。
38.11. Samples
我们从一个简单路由开始,该路由将从 JMS 队列接收的消息作为电子邮件发送。电子邮件帐户是 mymailserver.com
上的 admin
帐户。
from("jms://queue:subscription").to("smtp://admin@mymailserver.com?password=secret");
在下一个示例中,我们每分钟轮询一次新电子邮件。
from("imap://admin@mymailserver.com?password=secret&unseen=true&delay=60000") .to("seda://mails");
38.12. 使用附加示例发送邮件
所有 Camel 组件
不再支持 附件,它基于 Java 激活框架,通常仅由邮件 API 使用。由于许多其他 Camel 组件不支持附件,因此当附件通过路由传播时可能会丢失。因此,thumb 的规则是在向邮件端点发送消息前添加附件。
邮件组件支持附加。在以下示例中,我们发送一条邮件,其中包含带有徽标文件附件的纯文本消息。
38.13. SSL 示例
在本例中,我们希望轮询 Google 邮件中的邮件。要将邮件下载到本地邮件客户端,Google 邮件要求您启用和配置 SSL。这可以通过登录 Google 邮件帐户并更改您的设置以允许 IMAP 访问来实现。Google 对如何执行此操作有广泛的文档。
from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD" + "&delete=false&unseen=true&delay=60000").to("log:newmail");
前面的路由每分钟轮询 Google 邮件中的 Google 邮件,并将收到的消息记录到 新的mail
日志记录器类别。
运行启用 DEBUG
日志记录的示例,我们可以监控日志中的进度:
2008-05-08 06:32:09,640 DEBUG MailConsumer - Connecting to MailStore imaps//imap.gmail.com:993 (SSL enabled), folder=INBOX 2008-05-08 06:32:11,203 DEBUG MailConsumer - Polling mailfolder: imaps//imap.gmail.com:993 (SSL enabled), folder=INBOX 2008-05-08 06:32:11,640 DEBUG MailConsumer - Fetching 1 messages. Total 1 messages. 2008-05-08 06:32:12,171 DEBUG MailConsumer - Processing message: messageNumber=[332], from=[James Bond <007@mi5.co.uk>], to=YOUR_USERNAME@gmail.com], subject=[... 2008-05-08 06:32:12,187 INFO newmail - Exchange[MailMessage: messageNumber=[332], from=[James Bond <007@mi5.co.uk>], to=YOUR_USERNAME@gmail.com], subject=[...
38.14. 使用附加示例消耗邮件
在这个示例中,我们轮询一个载体,并将邮件中的所有附件存储为文件。首先,我们定义了一个路由来轮询语音。由于本示例基于 google 邮件,它使用与 SSL 示例中所示相同的路由:
from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD" + "&delete=false&unseen=true&delay=60000").process(new MyMailProcessor());
我们不使用一个处理器来记录邮件,以便我们可以处理来自 java 代码的邮件:
public void process(Exchange exchange) throws Exception { // the API is a bit clunky so we need to loop AttachmentMessage attachmentMessage = exchange.getMessage(AttachmentMessage.class); Map<String, DataHandler> attachments = attachmentMessage.getAttachments(); if (attachments.size() > 0) { for (String name : attachments.keySet()) { DataHandler dh = attachments.get(name); // get the file name String filename = dh.getName(); // get the content and convert it to byte[] byte[] data = exchange.getContext().getTypeConverter() .convertTo(byte[].class, dh.getInputStream()); // write the data to a file FileOutputStream out = new FileOutputStream(filename); out.write(data); out.flush(); out.close(); } } }
您可以看到处理附件的 API 是一个位冲突,但在有些情况下,您可以获取 javax.activation.DataHandler
,以便您可以使用标准 API 处理附件。
38.15. 如何使用附件分割邮件
在这个示例中,我们消耗可能有多个附件的邮件。我们希望在每个单独附件使用 Splitter EIP 来单独处理附件。例如,如果邮件消息有 5 个附件,我们希望 Splitter 处理五个消息,每个消息都只有一个附件。要做到这一点,我们需要向 Splitter 提供自定义表达式,其中我们提供了一个 List<Message>,其中包含带有单个附件的五个消息。
该代码开箱即用了 camel-mail
组件中的 Camel 2.10 中的框。代码位于类: org.apache.camel.component.mail.SplitAttachmentsExpression
,您可以在此处 的源代码中找到。
在 Camel 路由中,您需要在路由中使用此表达式,如下所示:
如果使用 XML DSL,则需要在 Splitter 中声明一个方法调用表达式,如下所示
<split> <method beanType="org.apache.camel.component.mail.SplitAttachmentsExpression"/> <to uri="mock:split"/> </split>
您还可以将附件分割为 byte[],以作为消息正文存储。这可以通过使用布尔值 true 创建表达式来实现
SplitAttachmentsExpression split = SplitAttachmentsExpression(true);
然后,将表达式与分割 EIP 搭配使用。
38.16. 使用自定义搜索Term
您可以在 mail Endpoint
上配置 searchTerm
,允许您过滤掉不需要的邮件。
例如,要将邮件过滤为在 Subject 或文本中包含 Camel,您可以执行以下操作:
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subjectOrBody=Camel"/> <to uri="bean:myBean"/> </route>
请注意,我们使用 "searchTerm.subjectOrBody"
作为参数键来指示我们要搜索邮件主题或正文,使其包含"Camel"。
类 org.apache.camel.component.mail.SimpleSearchTerm
有配置多个选项:
或者,为了让新的不可预测的电子邮件在 24 小时内返回。请注意"now-24h"语法。详情请查看下表。
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.fromSentDate=now-24h"/> <to uri="bean:myBean"/> </route>
您可以在端点 uri 配置中有多个 searchTerm。然后,它们将使用 AND 运算符组合在一起,因此这两个条件都必须匹配。例如,要获得最后的十倍电子邮件返回 24 小时,该电子邮件在邮件主题中有 Camel:
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subject=Camel&searchTerm.fromSentDate=now-24h"/> <to uri="bean:myBean"/> </route>
SimpleSearchTerm
旨在从 POJO 轻松配置,因此您也可以使用 XML 中的 <bean> 风格进行配置。
<bean id="mySearchTerm" class="org.apache.camel.component.mail.SimpleSearchTerm"> <property name="subject" value="Order"/> <property name="to" value="acme-order@acme.com"/> <property name="fromSentDate" value="now"/> </bean>
然后,您可以使用 Camel 路由中的 192.168.1.0/24beanId 引用此 bean,如下所示:
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm=#mySearchTerm"/> <to uri="bean:myBean"/> </route>
在 Java 中,有一个构建程序类,可使用 org.apache.camel.component.mail.SearchTermBuilder
类来构建复合搜索 Terms
。这可让您构建复杂的术语,例如:
// we just want the unseen mails which is not spam SearchTermBuilder builder = new SearchTermBuilder(); builder.unseen().body(Op.not, "Spam").subject(Op.not, "Spam") // which was sent from either foo or bar .from("foo@somewhere.com").from(Op.or, "bar@somewhere.com"); // .. and we could continue building the terms SearchTerm term = builder.build();
38.17. 轮询优化
参数 maxMessagePerPoll 和 fetchSize 允许您限制每个轮询应处理的数字消息。在处理包含大量消息的文件夹时,这些参数有助于防止性能不佳。在以前的版本中,这些参数已被评估得太晚,因此大型竞争可能仍然会导致性能问题。使用 Camel 3.1 这些参数会在轮询早期评估,以避免这些问题。
38.18. 使用带有额外 Java 邮件发送器属性的标头
发送邮件时,您可以使用以 java .smtp 开头的密钥为来自 Exchange 的
邮件属性。
JavaMailSender
提供动态 java
您可以设置任何可在 Java 邮件文档中找到的 java.smtp
属性。
例如,要在 java.smtp.from
(SMTP MAIL 命令)中提供动态 uuid:
.setHeader("from", constant("reply2me@foo.com")); .setHeader("java.smtp.from", method(UUID.class, "randomUUID")); .to("smtp://mymailserver:1234");
这只在 不使用 自定义 JavaMailSender
时被支持。
38.19. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 imap 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-mail-starter</artifactId> </dependency>
组件支持 50 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.mail.additional-java-mail-properties | 设置额外的 java 邮件属性,这将附加/覆盖基于所有其他选项设置的任何默认属性。如果您需要添加一些特殊选项,但希望保留其他特殊选项,这非常有用。选项是 java.util.Properties 类型。 | Properties | |
camel.component.mail.alternative-body-header | 指定包含替代电子邮件正文的 IN 消息标头的密钥。例如,如果您以文本/html 格式发送电子邮件,并希望为非 HTML 电子邮件客户端提供替代邮件正文,请将此密钥的替代邮件正文设置为标头。 | CamelMailAlternativeBody | 字符串 |
camel.component.mail.attachments-content-transfer-encoding-resolver | 要使用自定义将ContentTransferEncodingResolver 解决用于附件的 content-type-encoding。选项是一个 org.apache.camel.component.mail.AttachmentsContentTransferEncodingResolver 类型。 | AttachmentsContentTransferEncodingResolver | |
camel.component.mail.authenticator | 用于登录的验证器。如果设置,则忽略密码和用户名。可用于可过期的令牌,因此必须动态读取。选项是 org.apache.camel.component.mail.MailAuthenticator 类型。 | MailAuthenticator | |
camel.component.mail.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.mail.bcc | 设置 BCC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
camel.component.mail.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.mail.cc | 设置 CC 电子邮件地址。使用逗号分隔多个电子邮件地址。 | 字符串 | |
camel.component.mail.close-folder | 消费者是否在轮询后关闭文件夹。将这个选项设置为 false,也具有 disconnect=false,然后消费者在轮询之间保持文件夹打开。 | true | 布尔值 |
camel.component.mail.configuration | 设置邮件配置。选项是 org.apache.camel.component.mail.MailConfiguration 类型。 | MailConfiguration | |
camel.component.mail.connection-timeout | 连接超时(毫秒)。 | 30000 | 整数 |
camel.component.mail.content-type | 邮件消息内容类型。将 text/html 用于 HTML 邮件。 | text/plain | 字符串 |
camel.component.mail.content-type-resolver | 用于确定文件附加的 Content-Type 的解析器。选项是 org.apache.camel.component.mail.ContentTypeResolver 类型。 | ContentTypeResolver | |
camel.component.mail.copy-to | 处理邮件后,它可以复制到具有指定名称的邮件文件夹中。您可以使用键 copyTo 的标头覆盖此配置值,允许您将消息复制到运行时配置的文件夹名称。 | 字符串 | |
camel.component.mail.debug-mode | 在底层邮件框架中启用调试模式。SUN 邮件框架默认将调试信息记录到 System.out。 | false | 布尔值 |
camel.component.mail.decode-filename | 如果设置为 true,则使用 MimeUtility.decodeText 方法来解码文件名。这与设置 JVM 系统属性 mail.mime.encodefilename 类似。 | false | 布尔值 |
camel.component.mail.delete | 在消息被处理后删除消息。这可以通过在邮件中设置 DELETED 标志来完成。如果为 false,则设置 SEEN 标志。从 Camel 2.10 开始,您可以通过使用键 delete 设置标头来覆盖此配置选项,以确定是否应该删除邮件。 | false | 布尔值 |
camel.component.mail.disconnect | 消费者在轮询后是否应断开。如果启用此选项,它会强制 Camel 在每个轮询连接。 | false | 布尔值 |
camel.component.mail.enabled | 是否启用邮件组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.mail.fetch-size | 设置轮询期间要消耗的最大消息数。如果载体文件夹包含很多消息,这可用于避免过载邮件服务器。默认值 -1 表示没有获取大小,所有信息都会被消耗。将值设为 0 是一个特殊的地方,Camel 根本不消耗任何消息。 | -1 | 整数 |
camel.component.mail.folder-name | 要轮询的文件夹。 | INBOX | 字符串 |
camel.component.mail.from | 来自电子邮件地址。 | camel@localhost | 字符串 |
camel.component.mail.handle-failed-message | 如果邮件使用者无法检索给定的邮件消息,则此选项允许处理消费者的错误处理程序导致的异常。通过在消费者上启用网桥错误处理程序,然后 Camel 路由错误处理程序可以处理异常。默认行为是消费者抛出异常,并且批处理中的邮件无法由 Camel 路由。 | false | 布尔值 |
camel.component.mail.header-filter-strategy | 使用自定义 org.apache.camel.spi.HeaderFilterStrategy 将标头过滤到或从 Camel 消息过滤。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。 | HeaderFilterStrategy | |
camel.component.mail.ignore-unsupported-charset | 选项使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果 charset 不支持,则 charset=XXX (其中 XXX 代表不受支持的 charset)已从 content-type 中删除,它依赖于平台默认。 | false | 布尔值 |
camel.component.mail.ignore-uri-scheme | 选项使 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset。如果 charset 不支持,则 charset=XXX (其中 XXX 代表不受支持的 charset)已从 content-type 中删除,它依赖于平台默认。 | false | 布尔值 |
camel.component.mail.java-mail-properties | 设置 java 邮件选项。将清除任何默认属性,并且仅使用为此方法提供的属性。选项是 java.util.Properties 类型。 | Properties | |
camel.component.mail.java-mail-sender | 使用自定义 org.apache.camel.component.mail.JavaMailSender 来发送电子邮件。选项是 org.apache.camel.component.mail.JavaMailSender 类型。 | JavaMailSender | |
camel.component.mail.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.mail.map-mail-message | 指定 Camel 是否应该将收到的邮件映射到 Camel body/headers/attachments。如果设置为 true,邮件邮件的正文将映射到 Camel IN 消息的正文,邮件标头将映射到 IN 标头,并附加至 Camel IN attachment 消息。如果此选项设为 false,则 IN 消息包含原始 javax.mail.Message。您可以通过调用 exchange.getIn ().getBody (javax.mail.Message.class)来检索此原始消息。 | true | 布尔值 |
camel.component.mail.mime-decode-headers | 这个选项启用对邮件标头的透明 MIME 解码和取消处理。 | false | 布尔值 |
camel.component.mail.move-to | 处理邮件后,它可以移到具有指定名称的邮件文件夹中。您可以使用键 moveTo 的标头来覆盖此配置值,允许您将消息移到运行时配置的文件夹名称。 | 字符串 | |
camel.component.mail.password | 登录的密码。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
camel.component.mail.peek | 在处理邮件之前,会将 javax.mail.Message 标记为 peeked。这只适用于 IMAPMessage 消息类型。通过使用将邮件标记为 SEEN 的邮件,这允许我们在 Camel 中存在错误处理,请回滚邮件。 | true | 布尔值 |
camel.component.mail.reply-to | Reply-To receivers (响应邮件的接收器)。使用逗号分隔多个电子邮件地址。 | 字符串 | |
camel.component.mail.session | 指定 camel 应用于所有邮件交互的邮件会话。在由某些其他资源(如 IaaS 容器)创建和管理邮件会话的情况下很有用。使用自定义邮件会话时,将使用邮件会话中的主机名和端口(如果在会话中配置)。选项是 javax.mail.Session 类型。 | 会话 | |
camel.component.mail.skip-failed-message | 如果邮件使用者无法检索给定的邮件邮件,此选项允许跳过邮件并继续检索下一个邮件。默认行为是消费者抛出异常,并且批处理中的邮件无法由 Camel 路由。 | false | 布尔值 |
camel.component.mail.ssl-context-parameters | 使用 SSLContext 参数配置安全性:选项是 org.apache.camel.support.jsse.SSLContextParameters 类型。 | SSLContextParameters | |
camel.component.mail.subject | 正在发送的消息的主题。注: 在标头中设置主题优先于这个选项。 | 字符串 | |
camel.component.mail.to | 设置 To email address。使用逗号分隔多个电子邮件地址。 | 字符串 | |
camel.component.mail.unseen | 是否只通过不可预测的邮件限制。 | true | 布尔值 |
camel.component.mail.use-global-ssl-context-parameters | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
camel.component.mail.use-inline-attachments | 是否使用内联或附加。 | false | 布尔值 |
camel.component.mail.username | 用于登录的用户名。另请参阅 setAuthenticator (MailAuthenticator)。 | 字符串 | |
camel.dataformat.mime-multipart.binary-content | 定义 MIME 多部分的内容是否为二进制(true)或 Base-64 编码(false) Default 为 false。 | false | 布尔值 |
camel.dataformat.mime-multipart.enabled | 是否启用 mime-multipart 数据格式的自动配置。这默认是启用的。 | 布尔值 | |
camel.dataformat.mime-multipart.headers-inline | 定义 MIME-Multipart 标头是否为消息正文(true)的一部分,还是设置为 Camel 标头(false)。默认值为 false。 | false | 布尔值 |
camel.dataformat.mime-multipart.include-headers | 定义将哪些 Camel 标头作为 MIME 标头包含在 MIME 多部分的 regex。这只有在 headersInline 设为 true 时才起作用。默认为不包含标头。 | 字符串 | |
camel.dataformat.mime-multipart.multipart-sub-type | 指定 MIME 多部分的子类型。默认为 hybrid。 | mixed | 字符串 |
camel.dataformat.mime-multipart.multipart-without-attachment | 定义没有附件的消息是否也被放入 MIME 多部分(只有一个正文部分)。默认值为 false。 | false | 布尔值 |
第 39 章 Microsoft Oauth 的邮件
从 Camel 3.18.4 开始。
邮件 Microsoft OAuth2 提供了 org.apache.camel.component.mail.MailAuthenticator
的实现,以验证 IMAP/POP/SMTP 连接,并通过 Spring 邮件支持和底层 JavaMail 系统访问电子邮件。
将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-mail-microsoft-oauth</artifactId> <version>3.20.1.redhat-00031</version> <!-- use the same version as your Camel core version --> </dependency>
导入 camel-mail-microsoft-oauth
将自动导入 camel-mail 组件。
39.1. Microsoft Exchange Online OAuth2 邮件验证器 IMAP 示例
要使用 OAuth,必须在 Azure Active Directory 中注册一个应用程序。按照说明注册新应用程序。
流程
- 使应用程序能够通过客户端凭据流访问交换通信。如需更多信息,请参阅使用 OAuth 验证 IMAP、POP 或 SMTP 连接
-
设置所有内容后,在 registry 中声明并注册,一个
org.apache.camel.component.mail.MicrosoftExchangeOnlineOAuth2MailAuthenticator
的实例。 - 例如,在 Spring Boot 应用程序中:
@BindToRegistry("auth") public MicrosoftExchangeOnlineOAuth2MailAuthenticator exchangeAuthenticator(){ return new MicrosoftExchangeOnlineOAuth2MailAuthenticator(tenantId, clientId, clientSecret, "jon@doe.com"); }
- 然后,在 Camel URI 中引用它,如下所示:
from("imaps://outlook.office365.com:993" + "?authenticator=#auth" + "&mail.imaps.auth.mechanisms=XOAUTH2" + "&debugMode=true" + "&delete=false")
第 40 章 MapStruct
从 Camel 3.19 开始
仅支持生成者。
camel-mapstruct 组件用于使用 转换 POJO。
40.1. URI 格式
mapstruct:className[?options]
其中 className
是要转换为的 POJO 的完全限定类名称。
40.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
40.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
40.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
40.3. 组件选项
MapStruct 组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
mapperPackageName (producer) | 需要 的软件包名称,Camel 应该发现 Mapstruct 映射类。可以使用逗号分隔多个软件包名称。 | 字符串 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
mapStructConverter (advanced) | Autowired 使用自定义 MapStructConverter,如适应特殊运行时。 | MapStructMapperFinder |
40.4. 端点选项
MapStruct 端点使用 URI 语法进行配置:
mapstruct:className
使用以下路径和查询参数:
40.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
classname (producer) | 必需 映射结构应转换为(target)的 POJO 的完全限定类名称。 | 字符串 |
40.4.2. 查询参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
mandatory (producer) | 是否存在映射结构转换器才能转换为 POJO。 | true | 布尔值 |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
40.5. 设置 MapStruct
camel-mapstruct 组件必须使用一个或多个软件包名称进行配置,用于类路径扫描 MapStruct Mapper
类。这是必要的,因为 映射程序
类用于使用 MapStruct 转换 POJO。
例如,要设置两个软件包,您可以执行以下操作:
MapstructComponent mc = context.getComponent("mapstruct", MapstructComponent.class); mc.setMapperPackageName("com.foo.mapper,com.bar.mapper");
这也可以在 application.properties
中配置:
camel.component.mapstruct.mapper-package-name = com.foo.mapper,com.bar.mapper
Camel 将在启动时扫描这些软件包,以获取名称以 Mapper
结尾的类。然后会内省这些类来发现映射方法。这些映射方法随后会注册到 Camel registry 中。这意味着,您还可以使用类型转换器将 POJO 转换为 MapStruct,例如:
from("direct:foo") .convertBodyTo(MyFooDto.class);
其中 MyFooDto
是一个 POJO,其中 MapStruct 能够转换为/从中转换。
40.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用映射结构时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-mapstruct-starter</artifactId> </dependency>
组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.mapstruct.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.mapstruct.enabled | 是否启用 mapstruct 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.mapstruct.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.mapstruct.map-struct-converter | 使用自定义 MapStructConverter,如适应特殊运行时。选项是一个 org.apache.camel.component.mapstruct.MapStructMapperFinder 类型。 | MapStructMapperFinder | |
camel.component.mapstruct.mapper-package-name | Camel 应该发现映射映射类的软件包名称。可以使用逗号分隔多个软件包名称。 | 字符串 |
第 41 章 Master
仅支持消费者
Camel-Master 端点提供了一种方式来确保集群中只有一个消费者从给定端点消耗;如果 JVM 结束,则会自动故障转移。
如果您需要从一些传统后端使用,这些后端不支持并发消耗,或者由于商业或稳定性的原因,您可以随时有一个连接,则这非常有用。
41.1. 使用 master 端点
只需使用 master:someName: 前缀的任何 camel 端点,其中 someName 是逻辑名称,用于获取 master 锁定,例如:
from("master:cheese:jms:foo").to("activemq:wine");
在本例中,有 master 组件确保集群中任何给定时间只在一个节点中激活该路由。因此,如果集群中有 8 个节点,则 master 组件会将一个路由选为领导,且只有此路由处于活动状态,因此只有此路由将使用来自 jms:foo
的消息。如果此路由停止或意外终止,则 master 组件将检测到这一点,并重新激活另一个节点,然后变为 active,然后变为 active,并启动来自 jms:foo
的消息。
Apache ActiveMQ 5.x 的功能开箱即用,称为 Exclusive Consumers。
41.2. URI 格式
master:namespace:endpoint[?options]
其中 endpoint 是您希望在主/从模式下运行的任何 Camel 端点。
41.3. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
41.3.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
41.3.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
41.4. 组件选项
Master 组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
服务 (advanced) | 注入要使用的服务。 | CamelClusterService | |
serviceSelector (advanced) | 注入用于查找要使用的 CamelClusterService 的服务选择器。 | 选择器 |
41.5. 端点选项
Master 端点使用 URI 语法进行配置:
master:namespace:delegateUri
使用以下路径和查询参数:
41.5.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
namespace (consumer) | 必需 要使用的命名空间的名称。 | 字符串 | |
delegateUri (consumer) | 必需 在 master/slave 模式中使用的端点 uri。 | 字符串 |
41.5.2. 查询参数(3 参数)
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 |
41.6. 示例
您可以保护集群的 Camel 应用程序,使其仅消耗来自一个活跃节点的文件。
// the file endpoint we want to consume from String url = "file:target/inbox?delete=true"; // use the camel master component in the clustered group named myGroup // to run a master/slave mode in the following Camel url from("master:myGroup:" + url) .log(name + " - Received file: ${file:name}") .delay(delay) .log(name + " - Done file: ${file:name}") .to("file:target/outbox");
主(master)组件利用 CamelClusterService,您可以使用
Java
ZooKeeperClusterService service = new ZooKeeperClusterService(); service.setId("camel-node-1"); service.setNodes("myzk:2181"); service.setBasePath("/camel/cluster"); context.addService(service)
XML (Spring/Blueprint)
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <bean id="cluster" class="org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService"> <property name="id" value="camel-node-1"/> <property name="basePath" value="/camel/cluster"/> <property name="nodes" value="myzk:2181"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring" autoStartup="false"> ... </camelContext> </beans>
Spring boot
camel.component.zookeeper.cluster.service.enabled = true camel.component.zookeeper.cluster.service.id = camel-node-1 camel.component.zookeeper.cluster.service.base-path = /camel/cluster camel.component.zookeeper.cluster.service.nodes = myzk:2181
41.7. 实现
Camel 提供以下 ClusterService 实现:
- camel-consul
- camel-file
- camel-infinispan
- camel-jgroups-raft
- camel-jgroups
- camel-kubernetes
- camel-zookeeper
41.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 master 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-master-starter</artifactId> </dependency>
组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.master.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.master.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.master.enabled | 是否启用 master 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.master.service | 注入要使用的服务。选项是 org.apache.camel.cluster.CamelClusterService 类型。 | CamelClusterService | |
camel.component.master.service-selector | 注入用于查找要使用的 CamelClusterService 的服务选择器。选项是 org.apache.camel.cluster.CamelClusterService.Selector 类型。 | CamelClusterService$Selector |
第 42 章 Minio
从 Camel 3.5 开始
支持生成者和消费者
Minio 组件支持从/到 Minio 服务存储和检索对象。
42.1. 先决条件
您必须具有有效的凭证才能授权访问存储桶/文件夹。如需更多信息,请参阅 Minio。
42.2. URI 格式
minio://bucketName[?options]
如果存储桶不存在,则会创建存储桶。您可以以以下格式将查询选项附加到 URI 中,
?options=value&option2=value&…
例如,要从存储桶 helloBucket
读取文件 hello.txt
,请使用以下代码片段:
from("minio://helloBucket?accessKey=yourAccessKey&secretKey=yourSecretKey&prefix=hello.txt") .to("file:/var/downloaded");
42.3. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
42.3.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
42.3.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
42.4. 组件选项
Minio 组件支持 47 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
autoCreateBucket (common) | 如果存储桶名称不存在,则设置存储桶的自动创建。 | true | 布尔值 |
configuration (common) | 组件配置。 | MinioConfiguration | |
customHttpClient (common) | 设置自定义 HTTP 客户端以进行身份验证的访问。 | OkHttpClient | |
endpoint (common) | 端点可以是 URL、域名、IPv4 地址或 IPv6 地址。 | 字符串 | |
minioClient (common) | 对 registry 中的 Minio Client 对象的 Autowired 引用。 | MinioClient | |
objectLock (common) | 在新存储桶时设置。 | false | 布尔值 |
policy (common) | 在方法中设置的此队列的策略。 | 字符串 | |
proxyPort (common) | TCP/IP 端口号。80 和 443 用作 HTTP 和 HTTPS 的默认值。 | 整数 | |
region (common) | Minio 客户端需要工作的区域。使用此参数时,配置将预期区域的小写名称(如 ap-east-1)。您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
secure (common) | 用于指示使用安全连接的标记来 minio 服务。 | false | 布尔值 |
serverSideEncryption (common) | 服务器端加密。 | ServerSideEncryption | |
serverSideEncryptionCustomerKey (common) | 在复制/附加对象时源对象的服务器端加密。 | ServerSideEncryptionCustomerKey | |
autoCloseBody (consumer) | 如果此选项为 true 且 includeBody 为 true,则在交换完成时将调用 MinioObject.close ()方法。此选项与 includeBody 选项密切相关。如果将 includeBody 设为 true,autocloseBody 设为 false,它将是关闭 MinioObject 流的调用者。将 autocloseBody 设置为 true,将自动关闭 MinioObject 流。 | true | 布尔值 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
bypassGovernanceMode (consumer) | 如果您要在删除特定对象时绕过GovernanceMode,则设置此标志。 | false | 布尔值 |
deleteAfterRead (consumer) | 在检索后,从 Minio 中删除对象。只有在提交 Exchange 时,才会执行删除。如果进行回滚,则对象不会被删除。如果此选项为 false,则同一对象将被通过并再次在轮询上检索。因此,您需要使用路由中的 Idempotent Consumer EIP 来过滤重复项。您可以使用 MinioConstants114BUCKET_NAME 和 MinioConstantsöOBJECT_NAME 标头进行过滤,或者只有 MinioConstants114OBJECT_NAME 标头。 | true | 布尔值 |
delimiter (consumer) | ListObjectsRequest 中使用的分隔符仅用于消耗我们感兴趣的对象。 | 字符串 | |
destinationBucketName (consumer) | 源存储桶名称。 | 字符串 | |
destinationObjectName (consumer) | 源对象名称。 | 字符串 | |
includeBody (consumer) | 如果为 true,则交换正文将设置为文件的内容。如果为 false,则标头将使用 Minio 对象元数据设置,但正文将是 null。这个选项与 autocloseBody 选项密切相关。如果将 includeBody 设为 true,autocloseBody 设为 false,它将是关闭 MinioObject 流的调用者。将 autocloseBody 设置为 true,将自动关闭 MinioObject 流。 | true | 布尔值 |
includeFolders (consumer) | ListObjectsRequest 用来设置的标记包括文件夹。 | false | 布尔值 |
includeUserMetadata (consumer) | ListObjectsRequest 中使用的标志,用于获取具有用户元数据的对象。 | false | 布尔值 |
includeVersions (consumer) | ListObjectsRequest 中使用的标志,用于获取带有版本控制的对象。 | false | 布尔值 |
length (consumer) | 来自偏移的对象数据的字节数。 | long | |
matchETag (consumer) | 为 get 对象设置 match ETag 参数。 | 字符串 | |
maxConnections (consumer) | 在 minio 客户端配置中设置 maxConnections 参数。 | 60 | int |
maxMessagesPerPoll (consumer) | 获取最大消息数,作为每次轮询轮询的限制。获取最大消息数,作为每次轮询轮询的限制。默认值为 10。使用 0 或负数设置为无限。 | 10 | int |
modifiedSince (consumer) | 为 get 对象的参数设置修改,因为参数为 get 对象设置。 | ZonedDateTime | |
moveAfterRead (consumer) | 在检索后,将对象从存储桶移到不同的存储桶。要完成操作,必须设置 destinationBucket 选项。仅当 Exchange 提交时,才会执行复制存储桶操作。如果进行回滚,则对象不会被移动。 | false | 布尔值 |
notMatchETag (consumer) | 为 get 对象设置不匹配 ETag 参数。 | 字符串 | |
objectName (consumer) | 要从具有给定对象名称的存储桶获取对象。 | 字符串 | |
offset (consumer) | 对象数据的开始字节位置。 | long | |
prefix (consumer) | 对象名称以前缀开头。 | 字符串 | |
recursion (consumer) | 递归列出,而不是目录结构模拟。 | false | 布尔值 |
startAfter (consumer) | 在此对象名称后列出存储桶中的对象。 | 字符串 | |
unModifiedSince (consumer) | 为 get 对象的参数设置未修改。 | ZonedDateTime | |
useVersion1 (consumer) | 为 true 时,则使用 REST API 的版本 1。 | false | 布尔值 |
versionId (consumer) | 在删除对象时设置对象的特定版本_ID。 | 字符串 | |
deleteAfterWrite (producer) | 上传 Minio 文件后删除文件对象。 | false | 布尔值 |
KeyName (producer) | 通过端点参数在存储桶中设置元素的密钥名称。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
operation (producer) | 当用户不希望只进行上传时,要执行的操作。 Enum 值:
| MinioOperations | |
pojoRequest (producer) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
storageClass (producer) | 请求中设置的存储类。 | 字符串 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
accessKey (security) | Amazon AWS Secret 访问密钥或 Minio 访问密钥。如果没有设置 camel,则会连接到服务以进行匿名访问。 | 字符串 | |
secretKey (security) | Amazon AWS 访问密钥 Id 或 Minio Secret 密钥。如果没有设置 camel,则会连接到服务以进行匿名访问。 | 字符串 |
42.5. 端点选项
Minio 端点使用 URI 语法进行配置:
minio:bucketName
使用以下路径和查询参数:
42.5.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bucketName (common) | 所需的 Bucket 名称。 | 字符串 |
42.5.2. 查询参数(63 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
autoCreateBucket (common) | 如果存储桶名称不存在,则设置存储桶的自动创建。 | true | 布尔值 |
customHttpClient (common) | 设置自定义 HTTP 客户端以进行身份验证的访问。 | OkHttpClient | |
endpoint (common) | 端点可以是 URL、域名、IPv4 地址或 IPv6 地址。 | 字符串 | |
minioClient (common) | 对 registry 中的 Minio Client 对象的 Autowired 引用。 | MinioClient | |
objectLock (common) | 在新存储桶时设置。 | false | 布尔值 |
policy (common) | 在方法中设置的此队列的策略。 | 字符串 | |
proxyPort (common) | TCP/IP 端口号。80 和 443 用作 HTTP 和 HTTPS 的默认值。 | 整数 | |
region (common) | Minio 客户端需要工作的区域。使用此参数时,配置将预期区域的小写名称(如 ap-east-1)。您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
secure (common) | 用于指示使用安全连接的标记来 minio 服务。 | false | 布尔值 |
serverSideEncryption (common) | 服务器端加密。 | ServerSideEncryption | |
serverSideEncryptionCustomerKey (common) | 在复制/附加对象时源对象的服务器端加密。 | ServerSideEncryptionCustomerKey | |
autoCloseBody (consumer) | 如果此选项为 true 且 includeBody 为 true,则在交换完成时将调用 MinioObject.close ()方法。此选项与 includeBody 选项密切相关。如果将 includeBody 设为 true,autocloseBody 设为 false,它将是关闭 MinioObject 流的调用者。将 autocloseBody 设置为 true,将自动关闭 MinioObject 流。 | true | 布尔值 |
bypassGovernanceMode (consumer) | 如果您要在删除特定对象时绕过GovernanceMode,则设置此标志。 | false | 布尔值 |
deleteAfterRead (consumer) | 在检索后,从 Minio 中删除对象。只有在提交 Exchange 时,才会执行删除。如果进行回滚,则对象不会被删除。如果此选项为 false,则同一对象将被通过并再次在轮询上检索。因此,您需要使用路由中的 Idempotent Consumer EIP 来过滤重复项。您可以使用 MinioConstants114BUCKET_NAME 和 MinioConstantsöOBJECT_NAME 标头进行过滤,或者只有 MinioConstants114OBJECT_NAME 标头。 | true | 布尔值 |
delimiter (consumer) | ListObjectsRequest 中使用的分隔符仅用于消耗我们感兴趣的对象。 | 字符串 | |
destinationBucketName (consumer) | 源存储桶名称。 | 字符串 | |
destinationObjectName (consumer) | 源对象名称。 | 字符串 | |
includeBody (consumer) | 如果为 true,则交换正文将设置为文件的内容。如果为 false,则标头将使用 Minio 对象元数据设置,但正文将是 null。这个选项与 autocloseBody 选项密切相关。如果将 includeBody 设为 true,autocloseBody 设为 false,它将是关闭 MinioObject 流的调用者。将 autocloseBody 设置为 true,将自动关闭 MinioObject 流。 | true | 布尔值 |
includeFolders (consumer) | ListObjectsRequest 用来设置的标记包括文件夹。 | false | 布尔值 |
includeUserMetadata (consumer) | ListObjectsRequest 中使用的标志,用于获取具有用户元数据的对象。 | false | 布尔值 |
includeVersions (consumer) | ListObjectsRequest 中使用的标志,用于获取带有版本控制的对象。 | false | 布尔值 |
length (consumer) | 来自偏移的对象数据的字节数。 | long | |
matchETag (consumer) | 为 get 对象设置 match ETag 参数。 | 字符串 | |
maxConnections (consumer) | 在 minio 客户端配置中设置 maxConnections 参数。 | 60 | int |
maxMessagesPerPoll (consumer) | 获取最大消息数,作为每次轮询轮询的限制。获取最大消息数,作为每次轮询轮询的限制。默认值为 10。使用 0 或负数设置为无限。 | 10 | int |
modifiedSince (consumer) | 为 get 对象的参数设置修改,因为参数为 get 对象设置。 | ZonedDateTime | |
moveAfterRead (consumer) | 在检索后,将对象从存储桶移到不同的存储桶。要完成操作,必须设置 destinationBucket 选项。仅当 Exchange 提交时,才会执行复制存储桶操作。如果进行回滚,则对象不会被移动。 | false | 布尔值 |
notMatchETag (consumer) | 为 get 对象设置不匹配 ETag 参数。 | 字符串 | |
objectName (consumer) | 要从具有给定对象名称的存储桶获取对象。 | 字符串 | |
offset (consumer) | 对象数据的开始字节位置。 | long | |
prefix (consumer) | 对象名称以前缀开头。 | 字符串 | |
recursion (consumer) | 递归列出,而不是目录结构模拟。 | false | 布尔值 |
sendEmptyMessageWhenIdle (consumer) | 如果轮询使用者没有轮询任何文件,您可以启用此选项来发送空消息(无正文)。 | false | 布尔值 |
startAfter (consumer) | 在此对象名称后列出存储桶中的对象。 | 字符串 | |
unModifiedSince (consumer) | 为 get 对象的参数设置未修改。 | ZonedDateTime | |
useVersion1 (consumer) | 为 true 时,则使用 REST API 的版本 1。 | false | 布尔值 |
versionId (consumer) | 在删除对象时设置对象的特定版本_ID。 | 字符串 | |
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 | |
pollStrategy (consumer (advanced)) | 可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作期间通常会发生错误处理,然后再创建交换并在 Camel 中路由。 | PollingConsumerPollStrategy | |
deleteAfterWrite (producer) | 上传 Minio 文件后删除文件对象。 | false | 布尔值 |
KeyName (producer) | 通过端点参数在存储桶中设置元素的密钥名称。 | 字符串 | |
operation (producer) | 当用户不希望只进行上传时,要执行的操作。 Enum 值:
| MinioOperations | |
pojoRequest (producer) | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
storageClass (producer) | 请求中设置的存储类。 | 字符串 | |
lazyStartProducer (producer (advanced)) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 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 | 布尔值 |
accessKey (security) | Amazon AWS Secret 访问密钥或 Minio 访问密钥。如果没有设置 camel,则会连接到服务以进行匿名访问。 | 字符串 | |
secretKey (security) | Amazon AWS 访问密钥 Id 或 Minio Secret 密钥。如果没有设置 camel,则会连接到服务以进行匿名访问。 | 字符串 |
您必须在 Registry 或 accessKey 和 secretKey 中提供 minioClient,才能访问 Minio。
42.6. Batch Consumer
这个组件实现了 Batch Consumer。
这样,您可以让实例知道此批处理中存在多少个消息,而实例则让聚合器聚合此消息数量。
42.7. 消息标头
Minio 组件支持 21 个消息标头,如下所列:
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
CamelMinioBucketName (common) 常量: BUCKET_NAME | producer :此对象将存储或用于当前操作的存储桶名称。consumer :包含此对象的存储桶的名称。 | 字符串 | |
CamelMinioDestinationBucketName (producer) | 用于当前操作的存储桶目的地名称。 | 字符串 | |
CamelMinioContentControl (common) 常数: CACHE_CONTROL | producer :此对象的内容控制。consumer:可选的 Cache-Control HTTP 标头,允许用户在 HTTP 请求/恢复链中指定缓存行为。 | 字符串 | |
CamelMinioContentDisposition (common) | producer :此对象的内容分布。consumer:可选的 Content-Disposition HTTP 标头,它指定要保存的对象的建议文件名。 | 字符串 | |
CamelMinioContentEncoding (common) 常量: CONTENT_ENCODING | producer :此对象的内容编码。consumer:可选的 Content-Encoding HTTP 标头,指定将什么内容编码应用到对象,必须应用哪些解码机制来获取 Content-Type 字段引用的 media-type。 | 字符串 | |
CamelMinioContentLength (common) 常数: CONTENT_LENGTH | producer :此对象的内容长度。consumer :Content-Length HTTP 标头表示关联对象的大小(以字节为单位)。 | Long | |
CamelMinioContentMD5 (common) 常量: CONTENT_MD5 | producer :此对象的 md5 checksum。consumer :根据 RFC 1864,对相关对象(content - 不包括标头)的 base64 编码 128 位 MD5 摘要。此数据用作消息完整性检查,以验证 Minio 收到的数据是否与调用者发送的数据相同。 | 字符串 | |
CamelMinioContentType (common) 常量: CONTENT_TYPE | producer :此对象的内容类型。consumer :Content-Type HTTP 标头,它指示存储在关联对象中的内容类型。此标头的值是标准 MIME 类型。 | 字符串 | |
CamelMinioETag (common) 常数: E_TAG | producer :新上传对象的 ETag 值。consumer :根据 RFC 1864,对相关对象的十六进制编码 128 位 MD5 摘要。此数据用作完整性检查,以验证调用者收到的数据是否与 Minio 发送的数据相同。 | 字符串 | |
CamelMinioObjectName (common) 常数: OBJECT_NAME | producer :此对象将存储或用于当前操作的密钥。consumer :存储此对象的密钥。 | 字符串 | |
CamelMinioDestinationObjectName (producer) | 用于当前操作的 Destination 键。 | 字符串 | |
CamelMinioLastModified (common) 常数: LAST_MODIFIED | producer :此对象的最后修改的时间戳。consumer: Last-Modified 标头的值,指示 Minio 最后记录对关联对象的修改的日期和时间。 | Date | |
CamelMinioStorageClass (producer) 常数: STORAGE_CLASS | 此对象的存储类。 | 字符串 | |
CamelMinioVersionId (common) 常量: VERSION_ID | producer :要存储或从当前操作返回的对象的版本 Id。consumer :关联的 Minio 对象的版本 ID (如果可用)。只有当对象上传到启用了对象版本控制的 Minio 存储桶时,才会将版本 ID 分配给对象。 | 字符串 | |
CamelMinioCannedAcl (producer) 常数: CANNED_ACL | 将应用到对象的 canned acl。有关允许的值,请参阅 com.amazonaws.services.s3.model.CannedAccessControlList。 | 字符串 | |
CamelMinioOperation (producer) 常数: MINIO_OPERATION | 要执行的操作。 Enum 值:
| MinioOperations | |
CamelMinioServerSideEncryption (common) | producer :在使用 Minio 管理的密钥加密对象时设置服务器端加密算法。例如,使用 AES256。consumer :在使用 Minio 管理的密钥加密对象时的服务器端加密算法。 | 字符串 | |
CamelMinioExpirationTime (common) 常数: EXPIRATION_TIME | 过期时间。 | 字符串 | |
CamelMinioReplicationStatus (common) | 复制状态。 | 字符串 | |
CamelMinioOffset (producer) 常量: OFFSET | 偏移。 | 字符串 | |
CamelMinioLength (producer) 常数: LENGTH | 长度。 | 字符串 |
42.7.1. Minio Producer 操作
camel-Minio 组件在制作者端提供以下操作:
- copyObject
- deleteObject
- deleteObjects
- listBuckets
- deleteBucket
- listObjects
- GetObject (这将返回 MinioObject 实例)
- getObjectRange (这将返回 MinioObject 实例)
42.7.2. 高级 Minio 配置
如果您的 Camel 应用程序在防火墙后面运行,或者需要对 MinioClient
实例配置拥有更多控制,您可以创建自己的实例,并在 Camel minio 组件配置中引用它:
from("minio://MyBucket?minioClient=#client&delay=5000&maxMessagesPerPoll=5") .to("mock:result");
42.7.3. Minio Producer 操作示例
- CopyObject:此操作将对象从一个存储桶复制到不同的存储桶
from("direct:start").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(MinioConstants.DESTINATION_BUCKET_NAME, "camelDestinationBucket"); exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey"); exchange.getIn().setHeader(MinioConstants.DESTINATION_OBJECT_NAME, "camelDestinationKey"); } }) .to("minio://mycamelbucket?minioClient=#minioClient&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(MinioConstants.OBJECT_NAME, "camelKey"); } }) .to("minio://mycamelbucket?minioClient=#minioClient&operation=deleteObject") .to("mock:result");
此操作将从 bucket mycamelbucket 中删除对象 camelKey。
- ListBuckets:此操作列出了此区域中此帐户的存储桶
from("direct:start") .to("minio://mycamelbucket?minioClient=#minioClient&operation=listBuckets") .to("mock:result");
此操作将列出此帐户的存储桶
- DeleteBucket:此操作删除指定为 URI 参数或标头的存储桶
from("direct:start") .to("minio://mycamelbucket?minioClient=#minioClient&operation=deleteBucket") .to("mock:result");
此操作将删除存储桶 mycamelbucket
- ListObjects :此操作列表在特定存储桶中的对象
from("direct:start") .to("minio://mycamelbucket?minioClient=#minioClient&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(MinioConstants.OBJECT_NAME, "camelKey"); } }) .to("minio://mycamelbucket?minioClient=#minioClient&operation=getObject") .to("mock:result");
此操作将返回与 mycamelbucket bucket 中 camelKey 对象相关的 MinioObject 实例。
- GetObjectRange:此操作获得特定存储桶中的单个对象范围
from("direct:start").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey"); exchange.getIn().setHeader(MinioConstants.OFFSET, "0"); exchange.getIn().setHeader(MinioConstants.LENGTH, "9"); } }) .to("minio://mycamelbucket?minioClient=#minioClient&operation=getObjectRange") .to("mock:result");
此操作将返回与 mycamelbucket bucket 中 camelKey 对象相关的 MinioObject 实例,其中包含从 0 到 9 的字节数。
42.8. bucket 自动创建
使用选项 autoCreateBucket
用户可以在 Minio Bucket 不存在时避免自动创建。此选项的默认值是 true
。如果设置为 false 对 Minio 中不存在的存储桶的操作,则不会成功,并返回错误。
42.9. 在 registry 中自动检测 Minio 客户端
组件能够检测 registry 中存在 Minio bean。如果它是唯一将用作客户端的实例,并且您不必将其定义为 uri 参数,如上例所示。这对端点的智能配置可能非常有用。
42.10. 在存储桶和其他存储桶间移动操作
有些用户(如从存储桶中消耗大量),并在不同的中移动内容,而无需使用这个组件的 copyObject 功能。如果是这样,请不要忘记从消费者的传入交换中删除 bucketName 标头,否则该文件将始终覆盖在同一原始存储桶中。
42.11. MoveAfterRead consumer 选项
除了 deleteAfterRead 外,还添加了另一个选项 moveAfterRead。启用此选项后,消耗的对象将移到目标 destinationBucket 中,而不是只被删除。这将需要指定 destinationBucket 选项。例如:
from("minio://mycamelbucket?minioClient=#minioClient&moveAfterRead=true&destinationBucketName=myothercamelbucket") .to("mock:result");
在这种情况下,消耗的对象将移到 myothercamelbucket bucket,并从原始存储桶中删除(因为 deleteAfterRead 设置为 true )。
42.12. 使用 POJO 作为正文
由于多个选项,有时构建 Minio Request 可能会很复杂。我们介绍可能将 POJO 用作正文。在 Minio 中,您可以提交多个操作,作为 List 代理请求的示例,您可以执行以下操作:
from("direct:minio") .setBody(ListObjectsArgs.builder() .bucket(bucketName) .recursive(getConfiguration().isRecursive()))) .to("minio://test?minioClient=#minioClient&operation=listObjects&pojoRequest=true")
这样,您将直接传递请求,而无需专门传递与此操作相关的标头和选项。
42.13. 依赖项
Maven 用户需要将以下依赖项添加到其 pom.xml 中:
pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-minio</artifactId> <version>${camel-version}</version> </dependency>
其中 $3.18.3
必须替换为 Camel 的实际版本。
42.14. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 minio 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-minio-starter</artifactId> </dependency>
组件支持 48 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.minio.access-key | Amazon AWS Secret 访问密钥或 Minio 访问密钥。如果没有设置 camel,则会连接到服务以进行匿名访问。 | 字符串 | |
camel.component.minio.auto-close-body | 如果此选项为 true 且 includeBody 为 true,则在交换完成时将调用 MinioObject.close ()方法。此选项与 includeBody 选项密切相关。如果将 includeBody 设为 true,autocloseBody 设为 false,它将是关闭 MinioObject 流的调用者。将 autocloseBody 设置为 true,将自动关闭 MinioObject 流。 | true | 布尔值 |
camel.component.minio.auto-create-bucket | 如果存储桶名称不存在,则设置存储桶的自动创建。 | true | 布尔值 |
camel.component.minio.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.minio.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.minio.bypass-governance-mode | 如果您要在删除特定对象时绕过GovernanceMode,则设置此标志。 | false | 布尔值 |
camel.component.minio.configuration | 组件配置。选项是 org.apache.camel.component.minio.MinioConfiguration 类型。 | MinioConfiguration | |
camel.component.minio.custom-http-client | 设置自定义 HTTP 客户端以进行身份验证的访问。选项是一个 okhttp3.OkHttpClient 类型。 | OkHttpClient | |
camel.component.minio.delete-after-read | 在检索后,从 Minio 中删除对象。只有在提交 Exchange 时,才会执行删除。如果进行回滚,则对象不会被删除。如果此选项为 false,则同一对象将被通过并再次在轮询上检索。因此,您需要使用路由中的 Idempotent Consumer EIP 来过滤重复项。您可以使用 MinioConstants114BUCKET_NAME 和 MinioConstantsöOBJECT_NAME 标头进行过滤,或者只有 MinioConstants114OBJECT_NAME 标头。 | true | 布尔值 |
camel.component.minio.delete-after-write | 上传 Minio 文件后删除文件对象。 | false | 布尔值 |
camel.component.minio.delimiter | ListObjectsRequest 中使用的分隔符仅用于消耗我们感兴趣的对象。 | 字符串 | |
camel.component.minio.destination-bucket-name | 源存储桶名称。 | 字符串 | |
camel.component.minio.destination-object-name | 源对象名称。 | 字符串 | |
camel.component.minio.enabled | 是否启用 minio 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.minio.endpoint | 端点可以是 URL、域名、IPv4 地址或 IPv6 地址。 | 字符串 | |
camel.component.minio.include-body | 如果为 true,则交换正文将设置为文件的内容。如果为 false,则标头将使用 Minio 对象元数据设置,但正文将是 null。这个选项与 autocloseBody 选项密切相关。如果将 includeBody 设为 true,autocloseBody 设为 false,它将是关闭 MinioObject 流的调用者。将 autocloseBody 设置为 true,将自动关闭 MinioObject 流。 | true | 布尔值 |
camel.component.minio.include-folders | ListObjectsRequest 用来设置的标记包括文件夹。 | false | 布尔值 |
camel.component.minio.include-user-metadata | ListObjectsRequest 中使用的标志,用于获取具有用户元数据的对象。 | false | 布尔值 |
camel.component.minio.include-versions | ListObjectsRequest 中使用的标志,用于获取带有版本控制的对象。 | false | 布尔值 |
camel.component.minio.key-name | 通过端点参数在存储桶中设置元素的密钥名称。 | 字符串 | |
camel.component.minio.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.minio.length | 来自偏移的对象数据的字节数。 | Long | |
camel.component.minio.match-e-tag | 为 get 对象设置 match ETag 参数。 | 字符串 | |
camel.component.minio.max-connections | 在 minio 客户端配置中设置 maxConnections 参数。 | 60 | 整数 |
camel.component.minio.max-messages-per-poll | 获取最大消息数,作为每次轮询轮询的限制。获取最大消息数,作为每次轮询轮询的限制。默认值为 10。使用 0 或负数设置为无限。 | 10 | 整数 |
camel.component.minio.minio-client | 对 registry 中的 Minio Client 对象的引用。选项是一个 io.minio.MinioClient 类型。 | MinioClient | |
camel.component.minio.modified-since | 为 get 对象的参数设置修改,因为参数为 get 对象设置。选项是一个 java.time.ZonedDateTime 类型。 | ZonedDateTime | |
camel.component.minio.move-after-read | 在检索后,将对象从存储桶移到不同的存储桶。要完成操作,必须设置 destinationBucket 选项。仅当 Exchange 提交时,才会执行复制存储桶操作。如果进行回滚,则对象不会被移动。 | false | 布尔值 |
camel.component.minio.not-match-e-tag | 为 get 对象设置不匹配 ETag 参数。 | 字符串 | |
camel.component.minio.object-lock | 在新存储桶时设置。 | false | 布尔值 |
camel.component.minio.object-name | 要从具有给定对象名称的存储桶获取对象。 | 字符串 | |
camel.component.minio.offset | 对象数据的开始字节位置。 | Long | |
camel.component.minio.operation | 当用户不希望只进行上传时,要执行的操作。 | MinioOperations | |
camel.component.minio.pojo-request | 如果您想要将 POJO 请求用作正文。 | false | 布尔值 |
camel.component.minio.policy | 在方法中设置的此队列的策略。 | 字符串 | |
camel.component.minio.prefix | 对象名称以前缀开头。 | 字符串 | |
camel.component.minio.proxy-port | TCP/IP 端口号。80 和 443 用作 HTTP 和 HTTPS 的默认值。 | 整数 | |
camel.component.minio.recursive | 递归列出,而不是目录结构模拟。 | false | 布尔值 |
camel.component.minio.region | Minio 客户端需要工作的区域。使用此参数时,配置将预期区域的小写名称(如 ap-east-1)。您需要使用名称 Region.EU_WEST_1.id ()。 | 字符串 | |
camel.component.minio.secret-key | Amazon AWS 访问密钥 Id 或 Minio Secret 密钥。如果没有设置 camel,则会连接到服务以进行匿名访问。 | 字符串 | |
camel.component.minio.secure | 用于指示使用安全连接的标记来 minio 服务。 | false | 布尔值 |
camel.component.minio.server-side-encryption | 服务器端加密。选项是一个 io.minio.ServerSideEncryption 类型。 | ServerSideEncryption | |
camel.component.minio.server-side-encryption-customer-key | 在复制/附加对象时源对象的服务器端加密。选项是一个 io.minio.ServerSideEncryptionCustomerKey 类型。 | ServerSideEncryptionCustomerKey | |
camel.component.minio.start-after | 在此对象名称后列出存储桶中的对象。 | 字符串 | |
camel.component.minio.storage-class | 请求中设置的存储类。 | 字符串 | |
camel.component.minio.un-modified-since | 为 get 对象的参数设置未修改。选项是一个 java.time.ZonedDateTime 类型。 | ZonedDateTime | |
camel.component.minio.use-version1 | 为 true 时,则使用 REST API 的版本 1。 | false | 布尔值 |
camel.component.minio.version-id | 在删除对象时设置对象的特定版本_ID。 | 字符串 |
第 43 章 MLLP
支持生成者和消费者
MLLP 组件专门用于处理 MLLP 协议的负性,并提供 Healthcare 供应商使用 MLLP 协议与其他系统通信所需的功能。
MLLP 组件提供一个简单的配置 URI,自动 HL7 确认生成和自动确认干预。
MLLP 协议通常使用大量并发 TCP 连接 - 单个活跃的 TCP 连接是正常情况。因此,MLLP 组件使用基于标准 Java 套接字的简单线程连接模型。这会保持简单实施,并消除对 Camel 本身的依赖项。
组件支持以下内容:
- 使用 TCP 服务器的 Camel 使用者
- 使用 TCP 客户端的 Camel producer
MLLP 组件使用 byte[]
payloads,并依赖于 Camel 类型转换将 byte[]
转换为其他类型。
Maven 用户需要将以下依赖项添加到其 pom.xml 中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-mllp</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
43.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
43.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
43.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
43.2. 组件选项
MLLP 组件支持 30 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
autoAck (common) | 启用/禁用仅自动生成 MLLP Acknowledgement MLLP Consumers。 | true | 布尔值 |
charsetName (common) | 设置要使用的默认 charset。 | 字符串 | |
configuration (common) | 设置在创建 MLLP 端点时要使用的默认配置。 | MllpConfiguration | |
hl7Headers (common) | 启用/禁用从 HL7 Message MLLP Consumers 中自动生成消息标头。 | true | 布尔值 |
requireEndOfData (common) | 启用/禁用与 MLLP 标准的严格合规性。MLLP 标准指定 START_OF_BLOCKhl7 有效负载END_OF_BLOCKEND_OF_DATA,但有些系统不会发送最终的 END_OF_DATA 字节。此设置控制是否需要最终的 END_OF_DATA 字节或可选。 | true | 布尔值 |
stringPayload (common) | 启用/禁用将有效负载转换为字符串。如果启用,从外部系统接收的 HL7 Payloads 将验证转换为字符串。如果设置了 charsetName 属性,则该字符集将用于转换。如果没有设置 charsetName 属性,则 MSH-18 的值将用于确定 th 个适当的字符集。如果没有设置 MSH-18,则使用默认的 ISO-8859-1 字符集。 | true | 布尔值 |
validatePayload (common) | 启用/禁用 HL7 Payloads if enabled,从外部系统接收的 HL7 Payloads 将被验证(请参阅 Hl7Util.generateInvalidPayloadExceptionMessage 以了解验证的详情)。如果检测到无效的有效负载,则会抛出 MllpInvalidMessageException (消费者)或 MllpInvalidAcknowledgementException。 | false | 布尔值 |
acceptTimeout (consumer) | 仅等待 TCP 连接 TCP 服务器时的超时(以毫秒为单位)。 | 60000 | int |
Back log (consumer) | 传入连接的最大队列长度(要连接的请求)设置为 backlog 参数。如果当队列满时连接表示到达,则拒绝连接。 | 5 | 整数 |
bindRetryInterval (consumer) | 仅 TCP 服务器 - 绑定尝试之间等待的毫秒数。 | 5000 | int |
bindTimeout (consumer) | 仅 TCP 服务器 - 重试绑定到服务器端口的毫秒数。 | 30000 | int |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着消费者试图接收传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。如果禁用,使用者将使用 org.apache.camel.spi.ExceptionHandler 在 WARN 或 ERROR 级别记录它们并忽略来处理异常。 | true | 布尔值 |
lenientBind (consumer) | 仅 TCP 服务器 - 允许端点在 TCP ServerSocket 绑定前启动。在某些环境中,可能需要允许端点在 TCP ServerSocket 绑定前启动。 | false | 布尔值 |
maxConcurrentConsumers (consumer) | 允许的最大并发 MLLP Consumer 连接数。如果收到新连接,并且已经建立最大连接,则新连接将立即重置。 | 5 | int |
reuseAddress (consumer) | 启用/禁用 SO_REUSEADDR 套接字选项。 | false | 布尔值 |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| InOut | ExchangePattern |
connectTimeout (producer) | 仅建立 TCP 连接 TCP 客户端的超时(以毫秒为单位)。 | 30000 | int |
idleTimeoutStrategy (producer) | 决定在闲置超时发生时要执行的操作。可能的值有:RESET :将 SO_LINGER 设置为 0,并重置套接字 CLOSE :关闭套接字安全默认值为 RESET。 Enum 值:
| RESET | MllpIdleTimeoutStrategy |
keepAlive (producer) | 启用/禁用 SO_KEEPALIVE 套接字选项。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
tcpNoDelay (producer) | 启用/禁用 TCP_NODELAY 套接字选项。 | true | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
defaultCharset (advanced) | 设置用于字节的默认字符设置为/从字符串转换。 | ISO-8859-1 | 字符串 |
logPhi (advanced) | 是否记录 PHI。 | true | 布尔值 |
logPhiMaxBytes (advanced) | 设置将在日志条目中记录的最大字节数 PHI。 | 5120 | 整数 |
readTimeout (advanced) | 在收到 MLLP 帧的开头后,使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 5000 | int |
receiveBufferSize (advanced) | 将 SO_RCVBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
receiveTimeout (advanced) | 等待 MLLP 帧开始时使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 15000 | int |
sendBufferSize (advanced) | 将 SO_SNDBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
idleTimeout (tcp) | 重置客户端 TCP 连接前允许的大约空闲时间。null 值或值小于或等于零将禁用闲置超时。 | 整数 |
43.3. 端点选项
MLLP 端点使用 URI 语法进行配置:
mllp:hostname:port
使用以下路径和查询参数:
43.3.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
hostname (common) | 必需 TCP 连接的连接的主机名或 IP。默认值为 null,即任何本地 IP 地址。 | 字符串 | |
port (common) | TCP 连接所需的端口号。 | int |
43.3.2. 查询参数(26 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
autoAck (common) | 启用/禁用仅自动生成 MLLP Acknowledgement MLLP Consumers。 | true | 布尔值 |
charsetName (common) | 设置要使用的默认 charset。 | 字符串 | |
hl7Headers (common) | 启用/禁用从 HL7 Message MLLP Consumers 中自动生成消息标头。 | true | 布尔值 |
requireEndOfData (common) | 启用/禁用与 MLLP 标准的严格合规性。MLLP 标准指定 START_OF_BLOCKhl7 有效负载END_OF_BLOCKEND_OF_DATA,但有些系统不会发送最终的 END_OF_DATA 字节。此设置控制是否需要最终的 END_OF_DATA 字节或可选。 | true | 布尔值 |
stringPayload (common) | 启用/禁用将有效负载转换为字符串。如果启用,从外部系统接收的 HL7 Payloads 将验证转换为字符串。如果设置了 charsetName 属性,则该字符集将用于转换。如果没有设置 charsetName 属性,则 MSH-18 的值将用于确定 th 个适当的字符集。如果没有设置 MSH-18,则使用默认的 ISO-8859-1 字符集。 | true | 布尔值 |
validatePayload (common) | 启用/禁用 HL7 Payloads if enabled,从外部系统接收的 HL7 Payloads 将被验证(请参阅 Hl7Util.generateInvalidPayloadExceptionMessage 以了解验证的详情)。如果检测到无效的有效负载,则会抛出 MllpInvalidMessageException (消费者)或 MllpInvalidAcknowledgementException。 | false | 布尔值 |
acceptTimeout (consumer) | 仅等待 TCP 连接 TCP 服务器时的超时(以毫秒为单位)。 | 60000 | int |
Back log (consumer) | 传入连接的最大队列长度(要连接的请求)设置为 backlog 参数。如果当队列满时连接表示到达,则拒绝连接。 | 5 | 整数 |
bindRetryInterval (consumer) | 仅 TCP 服务器 - 绑定尝试之间等待的毫秒数。 | 5000 | int |
bindTimeout (consumer) | 仅 TCP 服务器 - 重试绑定到服务器端口的毫秒数。 | 30000 | int |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着消费者试图接收传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。如果禁用,使用者将使用 org.apache.camel.spi.ExceptionHandler 在 WARN 或 ERROR 级别记录它们并忽略来处理异常。 | true | 布尔值 |
lenientBind (consumer) | 仅 TCP 服务器 - 允许端点在 TCP ServerSocket 绑定前启动。在某些环境中,可能需要允许端点在 TCP ServerSocket 绑定前启动。 | false | 布尔值 |
maxConcurrentConsumers (consumer) | 允许的最大并发 MLLP Consumer 连接数。如果收到新连接,并且已经建立最大连接,则新连接将立即重置。 | 5 | int |
reuseAddress (consumer) | 启用/禁用 SO_REUSEADDR 套接字选项。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| InOut | ExchangePattern |
connectTimeout (producer) | 仅建立 TCP 连接 TCP 客户端的超时(以毫秒为单位)。 | 30000 | int |
idleTimeoutStrategy (producer) | 决定在闲置超时发生时要执行的操作。可能的值有:RESET :将 SO_LINGER 设置为 0,并重置套接字 CLOSE :关闭套接字安全默认值为 RESET。 Enum 值:
| RESET | MllpIdleTimeoutStrategy |
keepAlive (producer) | 启用/禁用 SO_KEEPALIVE 套接字选项。 | true | 布尔值 |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
tcpNoDelay (producer) | 启用/禁用 TCP_NODELAY 套接字选项。 | true | 布尔值 |
readTimeout (advanced) | 在收到 MLLP 帧的开头后,使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 5000 | int |
receiveBufferSize (advanced) | 将 SO_RCVBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
receiveTimeout (advanced) | 等待 MLLP 帧开始时使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 15000 | int |
sendBufferSize (advanced) | 将 SO_SNDBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
idleTimeout (tcp) | 重置客户端 TCP 连接前允许的大约空闲时间。null 值或值小于或等于零将禁用闲置超时。 | 整数 |
43.4. MLLP Consumer
MLLP Consumer 支持接收 MLLP-framed 消息并发送 HL7 Acknowledgements。MLLP Consumer 可以自动生成 HL7 Acknowledgement (HL7 Application Acknowledgements, AA, AE and AR),或使用 CamelMllpAcknowledgement Exchange 属性来指定确认。此外,通过设置 CamelMllpAcknowledgementType Exchange 属性来控制将生成的确认类型。如果禁用了自动确认且交换模式是 InOnly,则 MLLP Consumer 可以读取消息,而不发送任何 HL7 Acknowledgement。
43.4.1. 消息标头
MLLP Consumer 在 Camel 消息中添加这些标头:
键 | 描述 |
CamelMllpLocalAddress | 套接字的本地 TCP 地址 |
CamelMllpRemoteAddress | 套接字的本地 TCP 地址 |
CamelMllpSendingApplication | MSH-3 值 |
CamelMllpSendingFacility | MSH-4 值 |
CamelMllpReceivingApplication | MSH-5 值 |
CamelMllpReceivingFacility | MSH-6 值 |
CamelMllpTimestamp | MSH-7 值 |
CamelMllpSecurity | MSH-8 值 |
CamelMllpMessageType | MSH-9 值 |
CamelMllpEventType | MSH-9-1 值 |
CamelMllpTriggerEvent | MSH-9-2 值 |
CamelMllpMessageControlId | MSH-10 值 |
CamelMllpProcessingId | MSH-11 值 |
CamelMllpVersionId | MSH-12 值 |
CamelMllpCharset | MSH-18 值 |
所有标头都是 String 类型。如果缺少标头值,则其值为 null。
43.4.2. 交换属性
确认 MLLP Consumer 生成的类型和 TCP 套接字的状态可以由 Camel 交换上的这些属性控制:
键 | 类型 | 描述 |
---|---|---|
CamelMllpAcknowledgement | byte[] | 如果存在,此属性将作为 MLLP Acknowledgement 发送到客户端 |
CamelMllpAcknowledgementString | 字符串 | 如果没有存在并且 CamelMllpAcknowledgement 不存在,则此属性将作为 MLLP Acknowledgement 发送到客户端 |
CamelMllpAcknowledgementMsaText | 字符串 | 如果 CamelMllpAcknowledgement 或 CamelMllpAcknowledgementString 不存在,且 autoAck 为 true,则此属性可用于在生成的 HL7 确认中指定 MSA-3 的内容 |
CamelMllpAcknowledgementType | 字符串 | 如果 CamelMllpAcknowledgement 或 CamelMllpAcknowledgementString 不存在,且 autoAck 为 true,则此属性可以用来指定 HL7 确认类型(如 AA、AE、AR) |
CamelMllpAutoAcknowledge | 布尔值 | 覆盖 autoAck 查询参数 |
CamelMllpCloseConnectionBeforeSend | 布尔值 | 如果为 true,则在发送数据前将关闭套接字 |
CamelMllpResetConnectionBeforeSend | 布尔值 | 如果为 true,则在发送数据前重置套接字 |
CamelMllpCloseConnectionAfterSend | 布尔值 | 如果为 true,则在发送数据后立即关闭套接字 |
CamelMllpResetConnectionAfterSend | 布尔值 | 如果为 true,则在发送任何数据后立即重置套接字 |
43.5. MLLP Producer
MLLP Producer 支持发送 MLLP-framed 消息并接收 HL7 Acknowledgements。MLLP Producer 中断 HL7 Acknowgments,并在收到负确认时引发异常。收到的确认是临时的,在进行负确认时会引发异常。使用 InOnly Exchange 模式配置时,MLLP Producer 可以忽略确认。
43.5.1. 消息标头
MLLP Producer 在 Camel 消息中添加这些标头:
键 | 描述 |
---|---|
CamelMllpLocalAddress | 套接字的本地 TCP 地址 |
CamelMllpRemoteAddress | 套接字的远程 TCP 地址 |
CamelMllpAcknowledgement | HL7 Acknowledgment byte[] receive |
CamelMllpAcknowledgementString | HL7 Acknowgment 收到,转换为字符串 |
43.5.2. 交换属性
TCP 套接字的状态可以由 Camel 交换上的这些属性控制:
键 | 类型 | 描述 |
---|---|---|
CamelMllpCloseConnectionBeforeSend | 布尔值 | 如果为 true,则在发送数据前将关闭套接字 |
CamelMllpResetConnectionBeforeSend | 布尔值 | 如果为 true,则在发送数据前重置套接字 |
CamelMllpCloseConnectionAfterSend | 布尔值 | 如果为 true,则在发送数据后立即关闭套接字 |
CamelMllpResetConnectionAfterSend | 布尔值 | 如果为 true,则在发送任何数据后立即重置套接字 |
43.6. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 mllp 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-mllp-starter</artifactId> </dependency>
组件支持 31 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.mllp.accept-timeout | 仅等待 TCP 连接 TCP 服务器时的超时(以毫秒为单位)。 | 60000 | 整数 |
camel.component.mllp.auto-ack | 启用/禁用仅自动生成 MLLP Acknowledgement MLLP Consumers。 | true | 布尔值 |
camel.component.mllp.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.mllp.backlog | 传入连接的最大队列长度(要连接的请求)设置为 backlog 参数。如果当队列满时连接表示到达,则拒绝连接。 | 5 | 整数 |
camel.component.mllp.bind-retry-interval | 仅 TCP 服务器 - 绑定尝试之间等待的毫秒数。 | 5000 | 整数 |
camel.component.mllp.bind-timeout | 仅 TCP 服务器 - 重试绑定到服务器端口的毫秒数。 | 30000 | 整数 |
camel.component.mllp.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着消费者试图接收传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。如果禁用,使用者将使用 org.apache.camel.spi.ExceptionHandler 在 WARN 或 ERROR 级别记录它们并忽略来处理异常。 | true | 布尔值 |
camel.component.mllp.charset-name | 设置要使用的默认 charset。 | 字符串 | |
camel.component.mllp.configuration | 设置在创建 MLLP 端点时要使用的默认配置。选项是 org.apache.camel.component.mllp.MllpConfiguration 类型。 | MllpConfiguration | |
camel.component.mllp.connect-timeout | 仅建立 TCP 连接 TCP 客户端的超时(以毫秒为单位)。 | 30000 | 整数 |
camel.component.mllp.default-charset | 设置用于字节的默认字符设置为/从字符串转换。 | ISO-8859-1 | 字符串 |
camel.component.mllp.enabled | 是否启用 mllp 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.mllp.exchange-pattern | 在消费者创建交换时设置交换模式。 | ExchangePattern | |
camel.component.mllp.hl7-headers | 启用/禁用从 HL7 Message MLLP Consumers 中自动生成消息标头。 | true | 布尔值 |
camel.component.mllp.idle-timeout | 重置客户端 TCP 连接前允许的大约空闲时间。null 值或值小于或等于零将禁用闲置超时。 | 整数 | |
camel.component.mllp.idle-timeout-strategy | 决定在闲置超时发生时要执行的操作。可能的值有:RESET :将 SO_LINGER 设置为 0,并重置套接字 CLOSE :关闭套接字安全默认值为 RESET。 | MllpIdleTimeoutStrategy | |
camel.component.mllp.keep-alive | 启用/禁用 SO_KEEPALIVE 套接字选项。 | true | 布尔值 |
camel.component.mllp.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.mllp.lenient-bind | 仅 TCP 服务器 - 允许端点在 TCP ServerSocket 绑定前启动。在某些环境中,可能需要允许端点在 TCP ServerSocket 绑定前启动。 | false | 布尔值 |
camel.component.mllp.log-phi | 是否记录 PHI。 | true | 布尔值 |
camel.component.mllp.log-phi-max-bytes | 设置将在日志条目中记录的最大字节数 PHI。 | 5120 | 整数 |
camel.component.mllp.max-concurrent-consumers | 允许的最大并发 MLLP Consumer 连接数。如果收到新连接,并且已经建立最大连接,则新连接将立即重置。 | 5 | 整数 |
camel.component.mllp.read-timeout | 在收到 MLLP 帧的开头后,使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 5000 | 整数 |
camel.component.mllp.receive-buffer-size | 将 SO_RCVBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
camel.component.mllp.receive-timeout | 等待 MLLP 帧开始时使用的 SO_TIMEOUT 值(以毫秒为单位)。 | 15000 | 整数 |
camel.component.mllp.require-end-of-data | 启用/禁用与 MLLP 标准的严格合规性。MLLP 标准指定 START_OF_BLOCKhl7 有效负载END_OF_BLOCKEND_OF_DATA,但有些系统不会发送最终的 END_OF_DATA 字节。此设置控制是否需要最终的 END_OF_DATA 字节或可选。 | true | 布尔值 |
camel.component.mllp.reuse-address | 启用/禁用 SO_REUSEADDR 套接字选项。 | false | 布尔值 |
camel.component.mllp.send-buffer-size | 将 SO_SNDBUF 选项设置为指定的值(以字节为单位)。 | 8192 | 整数 |
camel.component.mllp.string-payload | 启用/禁用将有效负载转换为字符串。如果启用,从外部系统接收的 HL7 Payloads 将验证转换为字符串。如果设置了 charsetName 属性,则该字符集将用于转换。如果没有设置 charsetName 属性,则 MSH-18 的值将用于确定 th 个适当的字符集。如果没有设置 MSH-18,则使用默认的 ISO-8859-1 字符集。 | true | 布尔值 |
camel.component.mllp.tcp-no-delay | 启用/禁用 TCP_NODELAY 套接字选项。 | true | 布尔值 |
camel.component.mllp.validate-payload | 启用/禁用 HL7 Payloads if enabled,从外部系统接收的 HL7 Payloads 将被验证(请参阅 Hl7Util.generateInvalidPayloadExceptionMessage 以了解验证的详情)。如果检测到无效的有效负载,则会抛出 MllpInvalidMessageException (消费者)或 MllpInvalidAcknowledgementException。 | false | 布尔值 |
第 44 章 Mock
仅支持生成者
对分布式和异步处理的测试非常困难。Mock、Test 和 Dataset 端点与 Camel 测试框架合作,以使用 企业集成模式 和 Camel 的大型组件以及强大的 Bean 集成来简化单元和集成测试。
Mock 组件提供了一个强大的声明测试机制,类似于 jMock,它允许在测试开始前在任何 Mock 端点上创建声明性预期。然后,测试会运行,它通常会触发一个或多个端点的消息,最后会在测试案例中最终触发消息,以确保系统按预期工作。
这可让您测试各种问题,如下所示:
模拟端点无限期保留在内存中收到的交换。
请记住,Mock 旨在测试。当您向路由添加 Mock 端点时,发送到端点的每个交换都将在内存中存储(允许稍后验证),直到显式重置或 JVM 重新启动为止。如果您要发送高卷和/或大型信息,这可能会导致过量内存使用。如果您的目标是内联测试可部署的路由,请考虑在测试中使用 NotifyBuilder 或 AdviceWith,而不是直接添加 Mock 端点来路由。有两个新选项保留First,而 retainLast 可用于限制 Mock 端点保留在内存中的消息数量。
44.1. URI 格式
mock:someName[?options]
其中 someName
可以是唯一标识端点的任何字符串。
44.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
44.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
44.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
44.3. 组件选项
Mock 组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
log (producer) | 在模拟收到传入的消息时打开日志记录。这将仅记录传入消息的 INFO 级别一次。如需更详细的日志记录,请将 org.apache.camel.component.mock.MockEndpoint 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
exchangeFormatter (advanced) | Autowired 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认为 DefaultExchangeFormatter。 | ExchangeFormatter |
44.4. 端点选项
Mock 端点使用 URI 语法进行配置:
mock:name
使用以下路径和查询参数:
44.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (producer) | 模拟端点 所需的 名称。 | 字符串 |
44.4.2. 查询参数(12 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
assertPeriod (producer) | 设置一个宽限期,模拟端点将重新分配,以确保初始断言仍然有效。例如,这用于精确有多个消息到达的声明。例如,如果 expectedMessageCount (int)设为 5,则在 5 个或更多消息到达时满足断言。为确保完全 5 个消息到达,您需要等待少量周期以确保没有进一步的消息到达。这是您可以使用此方法。默认情况下禁用这个周期。 | long | |
expectedCount (producer) | 指定此端点应接收的消息交换数量。beware:如果要期望 0 个消息,然后在测试启动时进行额外的操作,因为测试启动时需要设置一个断言周期,以便测试可以在一段时间内运行,以确保仍没有到达的消息;对于使用 setAssertPeriod (long),您需要设置一个指定时间。另一种方法是使用 NotifyBuilder,并使用 notifier 知道 Camel 在对模拟调用 assertIsSatisfied ()方法之前,在路由某些消息前知道何时进行路由。这可让您不使用固定的断言周期来加快测试时间。如果您想成为完全 n 个消息到达这个模拟端点,请参阅 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 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
reportGroup (producer) | 用于根据大小组打开吞吐量日志的数字。 | int | |
resultMinimumWaitTime (producer) | 设置 assertIsSatisfied ()的最短预期时间(以 millis 为单位)。 | long | |
resultWaitTime (producer) | 设置 assertIsSatisfied ()在达到前等待的最大时间(以 millis 为单位)。 | long | |
retainFirst (producer) | 指定只保留前 n 个接收的交换数。这在使用大量数据进行测试时,通过不存储每个交换端点接收的每个交换的副本来减少内存消耗。重要:在使用这个限制时,getReceivedCounter ()仍会返回实际收到的交换数量。例如,如果我们收到 5000 Exchanges,并且配置为只保留前 10 个交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()中只有前 10 个交换,并且 getReceivedExchanges ()方法。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到的第一个正文数量上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个接收的方法。 | -1 | int |
retainLast (producer) | 指定只保留最后 n 个接收的交换数。这在使用大量数据进行测试时,通过不存储每个交换端点接收的每个交换的副本来减少内存消耗。重要:在使用这个限制时,getReceivedCounter ()仍会返回实际收到的交换数量。例如,如果我们收到 5000 Exchanges,并且配置为只保留最后 20 个交换,则 getReceivedCounter ()仍会返回 5000,但 getExchanges ()中只有最后 20 个交换,并且 getReceivedExchanges ()方法。使用此方法时,不支持一些其他预期方法,例如 expectedBodiesReceived (Object…)在收到的第一个正文数量上设置预期。您可以配置 setRetainFirst (int)和 setRetainLast (int)方法,以限制第一个和最后一个接收的方法。 | -1 | int |
sleepForEmptyTest (producer) | 当 expectedMessageCount (int)调用零时,允许指定 sleep 来等待此端点确实为空。 | long | |
copyOnExchange (producer (advanced)) | 设置是否在这个模拟端点收到传入交换的深度副本。默认为 true。 | true | 布尔值 |
44.5. 简单示例
以下是正在使用的 Mock 端点的简单示例:首先,端点在上下文中解析。然后,我们设置预期,然后在测试运行后设定了我们预期的要求:
MockEndpoint resultEndpoint = context.getEndpoint("mock:foo", MockEndpoint.class); // set expectations resultEndpoint.expectedMessageCount(2); // send some messages // now lets assert that the mock:foo endpoint received 2 messages resultEndpoint.assertIsSatisfied();
您通常始终调用方法来测试在运行测试后是否达到预期。
当调用 assertIsSatisfied ()
时,Camel 默认会等待 10 秒。这可以通过设置 setResultWaitTime (millis)
方法来配置。
44.6. 使用 assertPeriod
满足断言后,Camel 将停止等待并继续 assertIsSatisfied
方法。这意味着,如果新消息到达模拟端点,只需要有位位,则 arrival 不会影响断言的结果。假设您要测试之后没有新消息到达一段时间,您可以通过设置 setAssertPeriod
方法来实现这一点,例如:
MockEndpoint resultEndpoint = context.getEndpoint("mock:foo", MockEndpoint.class); resultEndpoint.setAssertPeriod(5000); resultEndpoint.expectedMessageCount(2); // send some messages // now lets assert that the mock:foo endpoint received 2 messages resultEndpoint.assertIsSatisfied();
44.7. 设置预期
您可以从 MockEndpoint 的 Javadoc 中看到,您可以使用不同的帮助程序方法来设置预期。主要方法如下:
方法 | 描述 |
---|---|
在端点上定义预期的消息数。 | |
定义端点上预期消息的最小数量。 | |
定义应接收的预期正文(按顺序)。 | |
定义应接收的预期标头 | |
要添加期望消息按顺序收到的,请使用给定的 Expression 来比较消息。 | |
要添加期望消息按顺序收到的,请使用给定的 Expression 来比较消息。 | |
要添加预期没有接收重复消息的预期;使用 Expression 计算每个消息的唯一标识符。如果使用 JMS,或者消息中的一些唯一引用号,这可能类似于 |
以下是另一个示例:
resultEndpoint.expectedBodiesReceived("firstMessageBody", "secondMessageBody", "thirdMessageBody");
44.8. 向特定消息添加预期
另外,您可以使用 message (int messageIndex)
方法添加接收的特定消息的断言。
例如,要添加第一个消息的标头或正文的预期(使用零的索引,如 java.util.List
),您可以使用以下代码:
resultEndpoint.message(0).header("foo").isEqualTo("bar");
camel-core
处理器测试 中使用的 Mock 端点有一些示例。
44.9. 模拟现有的端点
Camel 现在允许您在 Camel 路由中自动模拟现有端点。
它如何工作
端点仍在操作中。什么不同情况是,注入 Mock 端点并首先接收消息,然后将消息委派给目标端点。您可以将它视为拦截器和委托或端点监听程序。
假设您有以下给定路由:
Route
@Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").routeId("start") .to("direct:foo").to("log:foo").to("mock:result"); from("direct:foo").routeId("foo") .transform(constant("Bye World")); } }; }
然后,您可以使用 Camel 中的 recommendations With
功能模拟来自单元测试的给定路由中的所有端点,如下所示:
recommendationsWith
模拟所有端点
@Test public void testAdvisedMockEndpoints() throws Exception { // advice the start route using the inlined AdviceWith lambda style route builder // which has extended capabilities than the regular route builder AdviceWith.adviceWith(context, "start", a -> // mock all endpoints a.mockEndpoints()); getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:direct:foo").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World"); getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); // additional test to ensure correct endpoints in registry assertNotNull(context.hasEndpoint("direct:start")); assertNotNull(context.hasEndpoint("direct:foo")); assertNotNull(context.hasEndpoint("log:foo")); assertNotNull(context.hasEndpoint("mock:result")); // all the endpoints was mocked assertNotNull(context.hasEndpoint("mock:direct:start")); assertNotNull(context.hasEndpoint("mock:direct:foo")); assertNotNull(context.hasEndpoint("mock:log:foo")); }
请注意,模拟端点被授予 URI 模拟的 endpoint>
,如 mock:direct:foo
。Camel 日志在 INFO
级别,即被模拟的端点:
INFO Adviced endpoint [direct://foo] with mock endpoint [mock:direct:foo]
模拟的端点没有参数
端点,这些端点会模拟它们的参数关闭。例如,端点 log:foo?showAll=true
将模拟到以下端点 模拟:log:foo
。请注意,参数已被删除。
也可以仅使用模式模拟某些端点。例如,要模拟您执行 的所有日志
端点,如下所示:
recommendationsWith
仅使用模式模拟日志端点
@Test public void testAdvisedMockEndpointsWithPattern() throws Exception { // advice the start route using the inlined AdviceWith lambda style route builder // which has extended capabilities than the regular route builder AdviceWith.adviceWith(context, "start", a -> // mock only log endpoints a.mockEndpoints("log*")); // now we can refer to log:foo as a mock and set our expectations getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World"); getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); // additional test to ensure correct endpoints in registry assertNotNull(context.hasEndpoint("direct:start")); assertNotNull(context.hasEndpoint("direct:foo")); assertNotNull(context.hasEndpoint("log:foo")); assertNotNull(context.hasEndpoint("mock:result")); // only the log:foo endpoint was mocked assertNotNull(context.hasEndpoint("mock:log:foo")); assertNull(context.hasEndpoint("mock:direct:start")); assertNull(context.hasEndpoint("mock:direct:foo")); }
支持的模式可以是通配符或正则表达式。请参见与 Camel 使用的同一匹配函数交互的更多详情。
请记住,模拟端点会导致在消息到达模拟时复制消息。
这意味着 Camel 将使用更多内存。当您发送大量消息时,这可能不合适。
44.10. 使用 camel-test
组件模拟现有的端点
在使用 camel-test
Test Kit 时,您可以轻松启用此行为,而不必使用 recommendations With
来指示 Camel 模拟端点。
同一路由可以按如下方式测试。请注意,我们从 isMockEndpoints
方法返回"Demo",它会告知 Camel 模拟所有端点。
如果您只希望 mock 所有 log
端点,您可以返回 "log*"
。
isMockEndpoints
使用 camel-test kit
public class IsMockEndpointsJUnit4Test extends CamelTestSupport { @Override public String isMockEndpoints() { // override this method and return the pattern for which endpoints to mock. // use * to indicate all return "*"; } @Test public void testMockAllEndpoints() throws Exception { // notice we have automatic mocked all endpoints and the name of the endpoints is "mock:uri" getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:direct:foo").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World"); getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); // additional test to ensure correct endpoints in registry assertNotNull(context.hasEndpoint("direct:start")); assertNotNull(context.hasEndpoint("direct:foo")); assertNotNull(context.hasEndpoint("log:foo")); assertNotNull(context.hasEndpoint("mock:result")); // all the endpoints was mocked assertNotNull(context.hasEndpoint("mock:direct:start")); assertNotNull(context.hasEndpoint("mock:direct:foo")); assertNotNull(context.hasEndpoint("mock:log:foo")); } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("direct:foo").to("log:foo").to("mock:result"); from("direct:foo").transform(constant("Bye World")); } }; } }
44.11. 使用 XML DSL 模拟现有的端点
如果您不将 camel-test
组件用于单元测试(如上所示),您可以在使用 XML 文件进行路由时使用不同的方法。
解决方案是创建一个由单元测试使用的新 XML 文件,然后包含具有您要测试的路由的预期 XML 文件。
假设我们在 camel-route.xml
文件中有路由:
camel-route.xml
<!-- this camel route is in the camel-route.xml file --> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:start"/> <to uri="direct:foo"/> <to uri="log:foo"/> <to uri="mock:result"/> </route> <route> <from uri="direct:foo"/> <transform> <constant>Bye World</constant> </transform> </route> </camelContext>
然后,我们创建一个新的 XML 文件,该文件包括 camel-route.xml
文件,并使用类 org.apache.camel.impl.InterceptSendToMockEndpointStrategy
定义 spring bean,该文件告知 Camel 模拟所有端点:
test-camel-route.xml
<!-- the Camel route is defined in another XML file --> <import resource="camel-route.xml"/> <!-- bean which enables mocking all endpoints --> <bean id="mockAllEndpoints" class="org.apache.camel.component.mock.InterceptSendToMockEndpointStrategy"/>
然后,在单元测试中,您将加载新的 XML 文件(test-camel-route.xml
)而不是 camel-route.xml
。
要只模拟所有 Log 端点,您可以在 bean 的构造器中定义模式:
<bean id="mockAllEndpoints" class="org.apache.camel.impl.InterceptSendToMockEndpointStrategy"> <constructor-arg index="0" value="log*"/> </bean>
44.12. 模拟端点并跳过发送到原始端点
有时,您希望轻松模拟并跳过发送到特定端点。因此,消息会被处理并仅发送到模拟端点。现在,您可以使用 AdviceWith 使用 mockEndpointsAndSkip
方法。以下示例将跳过发送到两个端点 "direct:foo"
,以及 "direct:bar
"。
recommendationsWith 模拟并跳过发送到端点
@Test public void testAdvisedMockEndpointsWithSkip() throws Exception { // advice the first route using the inlined AdviceWith route builder // which has extended capabilities than the regular route builder AdviceWith.adviceWith(context.getRouteDefinitions().get(0), context, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { // mock sending to direct:foo and direct:bar and skip send to it mockEndpointsAndSkip("direct:foo", "direct:bar"); } }); getMockEndpoint("mock:result").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:direct:foo").expectedMessageCount(1); getMockEndpoint("mock:direct:bar").expectedMessageCount(1); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); // the message was not send to the direct:foo route and thus not sent to // the seda endpoint SedaEndpoint seda = context.getEndpoint("seda:foo", SedaEndpoint.class); assertEquals(0, seda.getCurrentQueueSize()); }
使用 Test Kit 的同一示例
isMockEndpointsAndSkip using camel-test kit
public class IsMockEndpointsAndSkipJUnit4Test extends CamelTestSupport { @Override public String isMockEndpointsAndSkip() { // override this method and return the pattern for which endpoints to mock, // and skip sending to the original endpoint. return "direct:foo"; } @Test public void testMockEndpointAndSkip() throws Exception { // notice we have automatic mocked the direct:foo endpoints and the name of the endpoints is "mock:uri" getMockEndpoint("mock:result").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:direct:foo").expectedMessageCount(1); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); // the message was not send to the direct:foo route and thus not sent to the seda endpoint SedaEndpoint seda = context.getEndpoint("seda:foo", SedaEndpoint.class); assertEquals(0, seda.getCurrentQueueSize()); } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("direct:foo").to("mock:result"); from("direct:foo").transform(constant("Bye World")).to("seda:foo"); } }; } }
44.13. 限制要保留的消息数量
Mock 端点默认会保留它收到的每个交换的副本。因此,如果您使用很多消息进行测试,那么它将消耗内存。
我们引入了两个选项 保留First
和 retainLast
,可用于仅保留 N of first 和/或最后一个交换。
例如,在下面的代码中,我们只想保留前 5 个副本,最后 5 个交换接收模拟。
MockEndpoint mock = getMockEndpoint("mock:data"); mock.setRetainFirst(5); mock.setRetainLast(5); mock.expectedMessageCount(2000); mock.assertIsSatisfied();
使用此功能有一些限制。MockEndpoint
上的 getExchanges ()
和 getReceivedExchanges ()
方法只返回 Exchanges 的保留副本。因此,在上面的示例中,列表将包含 10 个交换;前五个和最后五个。retainFirst
和 retainLast
选项还对您可以使用的预期方法有限制。例如,在消息正文、标头等上工作 的预期XXX
方法将仅对保留的消息进行操作。在上例中,它们只能测试保留 10 个消息的预期。
44.14. 使用 arrival 时间进行测试
Mock 端点将消息的 arrival 时间存储为交换上的属性
Date time = exchange.getProperty(Exchange.RECEIVED_TIMESTAMP, Date.class);
您可以使用这些信息知道消息何时到达模拟。但是,它还为了解之前和下一个消息之间的时间间隔提供基础。您可以使用此选项在 Mock 端点上设置使用 arrives
DSL 的预期。
例如,在下一个操作前,第一个消息应该在 0-2 秒之间到达:
mock.message(0).arrives().noLaterThan(2).seconds().beforeNext();
您还可以将其定义为第二条消息(基于 0 索引)在上一个消息后没有超过 0-2 秒:
mock.message(1).arrives().noLaterThan(2).seconds().afterPrevious();
您还可以使用在 之间设置较低绑定。例如,假设它应该在 1-4 秒之间:
mock.message(1).arrives().between(1, 4).seconds().afterPrevious();
您还可以对所有信息设置预期,例如,指出它们间的差距应该最多 1 秒:
mock.allMessages().arrives().noLaterThan(1).seconds().beforeNext();
上面的示例中,
使用 秒
作为时间单位,但 Camel 也提供 毫秒
和 分钟
。
44.15. Spring Boot Auto-Configuration
当在 Spring Boot 中使用模拟时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-mock-starter</artifactId> </dependency>
组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.mock.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.mock.enabled | 是否启用模拟组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.mock.exchange-formatter | 设置自定义 ExchangeFormatter,将 Exchange 转换为适合日志记录的字符串。如果没有指定,则默认为 DefaultExchangeFormatter。选项是 org.apache.camel.spi.ExchangeFormatter 类型。 | ExchangeFormatter | |
camel.component.mock.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.mock.log | 在模拟收到传入的消息时打开日志记录。这将仅记录传入消息的 INFO 级别一次。如需更详细的日志记录,请将 org.apache.camel.component.mock.MockEndpoint 类的日志记录器设置为 DEBUG 级别。 | false | 布尔值 |
第 45 章 MongoDB
支持生成者和消费者
根据 Wikipedia:"NoSQL 是一个移动提升了松散定义的非关系数据存储类,通过大量关系数据库和 ACID 保证进行破坏"。 近年来,Croio 解决方案已持续增长,并且主要使用极端的站点和服务(如 Ice、LinkedIn、Faceter 等)被广泛使用它们来实现可伸缩性和创新。
基本上,Troio 解决方案与传统的 RDBMS (相关数据库管理系统)不同,它们不使用 SQL 作为其查询语言,一般不提供类似 ACID 的事务行为或关系数据。相反,它们围绕灵活的数据结构和模式的概念(这意味着,具有固定模式的数据库表的传统概念被丢弃),在专有硬件和 blazing-fast 处理方面具有非常可扩展性。
MongoDB 是一个非常流行的,Camel-mongodb 组件将 Camel 与 MongoDB 集成,允许您将 MongoDB 集合作为制作者(集合上的操作)和消费者(来自 MongoDB 集合中的文档)交互。
MongoDB 围绕文档的概念(而非办公室文档),而是在 JSON/BSON 和集合中定义的分层数据。此组件页面将假设您熟悉它们。否则,请访问 http://www.mongodb.org/。
MongoDB Camel 组件使用 Mongo Java Driver 4.x。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-mongodb</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
45.1. URI 格式
mongodb:connectionBean?database=databaseName&collection=collectionName&operation=operationName[&moreOptions...]
45.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
45.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
45.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
45.3. 组件选项
MongoDB 组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
mongoConnection (common) | 用于连接的 Autowired 共享客户端。从组件生成的所有端点都将共享此连接客户端。 | MongoClient | |
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 | 布尔值 |
45.4. 端点选项
MongoDB 端点使用 URI 语法进行配置:
mongodb:connectionBean
使用以下路径和查询参数:
45.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
connectionBean (common) | 必需 设置 connection bean 引用,用于查找用于连接数据库的客户端。 | 字符串 |
45.4.2. 查询参数(27 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
collection (common) | 设置 MongoDB 集合的名称,以绑定到此端点。 | 字符串 | |
collectionIndex (common) | 设置集合索引(JSON FORMAT : \\{ field1 : order1, field2 : order2})。 | 字符串 | |
createCollection (common) | 如果集合不存在,在初始过程中创建集合。默认值为 true。 | true | 布尔值 |
数据库 (通用) | 将 MongoDB 数据库的名称设置为 target。 | 字符串 | |
hosts (common) | host:port 格式的 mongodb 服务器的主机地址。也可以使用多个地址,作为以逗号分隔的主机列表:host1:port1,host2:port2。如果指定了 hosts 参数,则忽略提供的 connectionBean。 | 字符串 | |
mongoConnection (common) | 设置用作连接到数据库的客户端的连接 bean。 | MongoClient | |
operation (common) | 设置此端点将根据 MongoDB 执行的操作。 Enum 值:
| MongoDbOperation | |
outputType (common) | 将制作者的输出转换为所选类型:DocumentList 文档或 MongoIterable。DocumentList 或 MongoIterable 适用于 findAll 和 aggregate。文档适用于所有操作。 Enum 值:
| MongoDbOutputType | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
consumerType (consumer) | 消费者类型。 | 字符串 | |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
cursorRegenerationDelay (advanced) | MongoDB 尾部光标将阻止,直到新数据到达为止。如果没有插入新数据,则光标将在一定时间后由 MongoDB 服务器自动释放和关闭。如果需要,客户端应该重新生成光标。这个值指定尝试获取新光标前等待的时间,如果尝试失败,在下一次尝试前尝试失败。默认值为 1000ms。 | 1000 | long |
动态性( advanced) | 设置此端点是否尝试从传入的 Exchange 属性中动态解析目标数据库和集合。可用于在运行时覆盖其他静态端点 URI 中指定的数据库和集合。默认情况下禁用它以提高性能。启用它将需要最少的性能命中。 | false | 布尔值 |
readPreference (advanced) | 配置 MongoDB 客户端如何将读取操作路由到副本集的成员。可能的值有 PRIMARY, PRIMARY_PREFERRED, SECONDARY, SECONDARY_PREFERRED 或 NEAREST。 Enum 值:
| PRIMARY | 字符串 |
writeConcern (advanced) | 使用从 MongoDB 请求的确认级别配置 connection bean,以便将操作写入独立 mongod、replicaset 或 cluster。可能的值有 ACKNOWLEDGED、W1、W2、W3、UNACKNOWLEDGED、JOURNALED 或 MAJORITY。 Enum 值:
| 已确认 | 字符串 |
writeResultAsHeader (advanced) | 在写入操作中,它会确定是否将 WriteResult 返回为 OUT 消息的正文,我们将 IN 消息传送到 OUT,并将 WriteResult 作为标头附加。 | false | 布尔值 |
streamFilter (changeStream) | 过滤更改流消费者的条件。 | 字符串 | |
密码 (安全) | mongodb 连接的用户密码。 | 字符串 | |
用户名 (安全) | mongodb 连接的用户名。 | 字符串 | |
persistentId (tail) | 一个尾部跟踪集合可以为多个可跟踪者托管多个跟踪程序。为了保持它们独立的,每个 tracker 应该都有自己的唯一的 persistentId。 | 字符串 | |
persistentTailTracking (tail) | 启用持久的尾部跟踪,这是在系统重启后跟踪最后一次消耗的消息的机制。下次系统启动时,端点将从最后停止记录的点恢复光标。 | false | 布尔值 |
tailTrackCollection (tail) | 将保留尾部跟踪信息的集合。如果没有指定,则默认使用 MongoDbTailTrackingConfig114DEFAULT_COLLECTION。 | 字符串 | |
tailTrackDb (tail) | 指明尾部跟踪机制将保留哪些数据库。如果没有指定,则默认获取当前数据库。即使启用,也不会考虑动态性,即尾部跟踪数据库不会因过去的端点初始而不同。 | 字符串 | |
tailTrackField (tail) | 将放置最后一个跟踪值的字段。如果没有指定,则默认使用 MongoDbTailTrackingConfig114DEFAULT_FIELD。 | 字符串 | |
tailTrackIncreasingField (tail) | 传入记录中的关联字段是增加的,将在每次生成时都用于定位尾部光标。光标将(重新)通过一个 type: tailTrackIncreasingField 大于 lastValue 的查询创建(可能从持久尾部跟踪中恢复)。可以是 Integer, Date, String 等类型。注意:当前不支持点表示法,因此字段应位于文档的最顶层。 | 字符串 |
45.5. 在 Spring XML 中配置数据库
以下 Spring XML 创建了定义与 MongoDB 实例连接的 bean。
从 mongo java 驱动程序 3 开始,WriteConcern 和 readPreference 选项不会被动态修改。它们在 mongoClient 对象中定义
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <mongo:mongo-client id="mongoBean" host="${mongo.url}" port="${mongo.port}" credentials="${mongo.user}:${mongo.pass}@${mongo.dbname}"> <mongo:client-options write-concern="NORMAL" /> </mongo:mongo-client> </beans>
45.6. 路由示例
Spring XML 中定义的以下路由在集合上执行操作 getDbStats
。
获取指定集合的 DB 统计
<route> <from uri="direct:start" /> <!-- using bean 'mongoBean' defined above --> <to uri="mongodb:mongoBean?database=${mongodb.database}&collection=${mongodb.collection}&operation=getDbStats" /> <to uri="direct:result" /> </route>
45.7. MongoDB 操作 - producer 端点
45.7.1. 查询操作
45.7.1.1. findById
此操作仅从集合中检索一个元素,其 _id 字段与 IN 消息正文的内容匹配。传入的对象可以是任何等同于 Bson
类型的对象。请参阅 http://bsonspec.org/spec.html 和 http://www.mongodb.org/display/DOCS/Java+Types。
from("direct:findById") .to("mongodb:myDb?database=flights&collection=tickets&operation=findById") .to("mock:resultFindById");
请注意,默认的 _id 被 Mongo 和 ObjectId
类型处理,因此您可能需要正确转换它。
from("direct:findById") .convertBodyTo(ObjectId.class) .to("mongodb:myDb?database=flights&collection=tickets&operation=findById") .to("mock:resultFindById");
支持可选参数
此操作支持投射运算符。请参阅 指定字段过滤器(项目)。
45.7.1.2. findOneByQuery
从与 MongoDB 查询选择器匹配的集合中检索第一个元素。如果设置了 CamelMongoDbCriteria
标头,则其值将用作查询选择器。如果 CamelMongoDbCriteria
标头为 null,则 IN 消息正文将用作查询选择器。在这两种情况下,查询选择器应当为 Bson
类型,或转换为 Bson
(例如,JSON 字符串或 HashMap
)。如需更多信息,请参阅类型转换。
使用 MongoDB 驱动程序提供的 过滤器
创建查询选择器。
45.7.1.3. 没有查询选择器的示例(在集合中显示第一个文档)
from("direct:findOneByQuery") .to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery") .to("mock:resultFindOneByQuery");
45.7.1.4. 带有查询选择器的示例(在集合中调整第一个匹配文档):
from("direct:findOneByQuery") .setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani"))) .to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery") .to("mock:resultFindOneByQuery");
支持可选参数
此操作支持投射运算符和排序条款。请参阅 指定字段过滤器(项目 ),指定 sort 子句。
45.7.1.5. findAll
findAll
操作返回与查询匹配的所有文档,或者根本不没有,在这种情况下,集合中包含的所有文档都会被返回。查询对象提取 CamelMongoDbCriteria
标头。如果 CamelMongoDbCriteria 标头是 null,查询对象将被提取消息正文,即它应该类型 Bson
或转换为 Bson
。它可以是 JSON 字符串或 Hashmap。如需更多信息,请参阅类型转换。
45.7.1.5.1. 没有查询选择器的示例(重复集合中的所有文档)
from("direct:findAll") .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll") .to("mock:resultFindAll");
45.7.1.5.2. 带有查询选择器的示例(重复集合中的所有匹配文档)
from("direct:findAll") .setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani")) .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll") .to("mock:resultFindAll");
通过以下标头支持分页和有效的检索:
标头键 | 快速常数 | 描述(从 MongoDB API 文档中提取) | 预期类型 |
---|---|---|---|
|
| 在光标开始时丢弃给定数量的元素。 | int/Integer |
|
| 限制返回的元素数量。 | int/Integer |
|
| 限制一个批处理中返回的元素数量。光标通常获取一系列结果对象,并将它们存储在本地。如果 batchSize 为正状态,它代表检索的每个对象批处理的大小。可以调整它以优化性能和限制数据传输。如果 batchSize 为负数,它将限制返回的数量对象,这适合最大批处理大小限制(通常为 4MB),而光标将被关闭。例如,如果 batchSize 是 -10,那么服务器将返回最多 10 个文档,并且尽可能在 4MB 中,然后关闭光标。请注意,这个功能与其中的 limit ()不同,该文档必须适合最大大小,而且无需发送请求来关闭光标服务器端。即使光标迭代后也可以更改批处理大小,在这种情况下,设置将在下一个批处理检索中应用。 | int/Integer |
|
| 设置 allowDiskUse MongoDB 标志。这是自 MongoDB Server 4.3.1 起的支持。将这个标头与旧的 MongoDB Server 版本搭配使用可能会导致查询失败。 | 布尔值/Boolean |
45.7.1.5.3. 带有选项 outputType=MongoIterable 和 batch 大小的示例
from("direct:findAll") .setHeader(MongoDbConstants.BATCH_SIZE).constant(10) .setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani"))) .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll&outputType=MongoIterable") .to("mock:resultFindAll");
findAll
操作也会返回以下 OUT 标头,以便在使用分页时迭代结果页面:
标头键 | 快速常数 | 描述(从 MongoDB API 文档中提取) | 数据类型 |
---|---|---|---|
|
| 与查询匹配的对象数量。这不会考虑限制/skip。 | int/Integer |
|
| 与查询匹配的对象数量。这不会考虑限制/skip。 | int/Integer |
支持可选参数
此操作支持投射运算符和排序条款。请参阅 指定字段过滤器(项目 ),指定 sort 子句。
45.7.1.6. 数�
返回集合中对象总数,返回 Long 作为 OUT 消息正文。
以下示例将计算"dynamicCollectionName"集合中记录的数量。请注意,如何启用动态性,因此操作不会针对"notableScientists"集合运行,而是针对"dynamicCollectionName"集合运行。
// from("direct:count").to("mongodb:myDb?database=tickets&collection=flights&operation=count&dynamicity=true"); Long result = template.requestBodyAndHeader("direct:count", "irrelevantBody", MongoDbConstants.COLLECTION, "dynamicCollectionName"); assertTrue("Result is not of type Long", result instanceof Long);
您可以提供一个查询 查询对象,它会被提取 CamelMongoDbCriteria
标头。如果 CamelMongoDbCriteria 标头为 null,查询对象将被提取消息正文,即它应该类型为 Bson
或转换为 Bson
.,操作将返回与此条件匹配的文档数量。
Document query = ... Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");
45.7.1.7. 指定字段过滤器(项目)
默认情况下,查询操作将返回整个匹配对象(及其所有字段)。如果您的文档较大,且您只需要检索其字段的子集,您可以在所有查询操作中指定字段过滤器,只需设置相关的
(或类型转换为 Bson,如 JSON 字符串、映射等)。Bson
以下是一个示例,它使用 MongoDB 的 Projections
来简化 Bson 的创建。它检索 _id
和 boringField
以外的所有字段:
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll") Bson fieldProjection = Projection.exclude("_id", "boringField"); Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.FIELDS_PROJECTION, fieldProjection);
以下是一个示例,它使用 MongoDB 的 Projections
来简化 Bson 的创建。它检索 _id
和 boringField
以外的所有字段:
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll") Bson fieldProjection = Projection.exclude("_id", "boringField"); Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.FIELDS_PROJECTION, fieldProjection);
45.7.1.8. 指定 sort 子句
根据特定字段排序,通常会要求从集合中获取 min/max 记录,它使用 MongoDB 的 Sorts
来简化 Bson 的创建。它检索 _id
和 boringField
以外的所有字段:
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll") Bson sorts = Sorts.descending("_id"); Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.SORT_BY, sorts);
在 Camel 路由中,SORT_BY 标头可与 findOneByQuery 操作一起使用,以实现相同的结果。如果还指定了 FIELDS_PROJECTION 标头,则操作将返回可直接传递给另一个组件(例如,参数化 MyBatis SELECT 查询)的单个字段/值对。本例演示了从集合中获取最新文档,并根据 documentTimestamp
字段将结果减少到单个字段:
.from("direct:someTriggeringEvent") .setHeader(MongoDbConstants.SORT_BY).constant(Sorts.descending("documentTimestamp")) .setHeader(MongoDbConstants.FIELDS_PROJECTION).constant(Projection.include("documentTimestamp")) .setBody().constant("{}") .to("mongodb:myDb?database=local&collection=myDemoCollection&operation=findOneByQuery") .to("direct:aMyBatisParameterizedSelect");
45.7.2. 创建/更新操作
45.7.2.1. insert
将新对象插入到 MongoDB 集合中,从 IN 消息正文获取。类型 conversion 试图将其转换为 文档或
列表
。
支持两种模式:单一插入和多个插入。对于多个插入,端点将期望任何类型的对象列表、阵列或集合,只要它们是 - 或可以转换为 - 文档
。Example:
from("direct:insert") .to("mongodb:myDb?database=flights&collection=tickets&operation=insert");
此操作将返回 WriteResult,具体取决于 WriteConcern
或 invokeGetLastError
选项的值,getLastError ()
将已被调用。如果您希望访问些操作的最终结果,可以通过在 WriteResult
上调用 getLastError()
或 getCachedLastError()
来获取 CommandResult
。然后,您可以通过调用 CommandResult.ok ()
、CommandResult.getErrorMessage ()
和/或 CommandResult.getException ()
来验证结果。
请注意,新对象的 _id
必须在集合中唯一。如果没有指定值,MongoDB 将为您自动生成值。但是,如果您确实指定它且不是唯一的,则插入操作将失败(对于 Camel 通知,则需要启用 invokeGetLastError 或设置等待写入结果的 WriteConcern。
这不是组件的一个限制,而是在 MongoDB 中用于更高的吞吐量。如果您使用自定义 _id
,则需要确保应用程序级别是唯一的(也是良好的做法)。
插入的记录的 OID 存储在 CamelMongoOid
键(MongoDbConstants.OID
constant)下的消息标头中。存储的值是 org.bson.types.ObjectId
,用于单个插入或 java.util.List<org.bson.types.ObjectId>
; (如果已插入了多个记录)。
在 MongoDB Java Driver 3.x 中,insertOne 并插入Many 操作会返回 void。Camel 插入操作返回 Document 或 插入的文档列表。请注意,如果需要,每个文档都会由新的 OID 更新。
45.7.2.2. save
save 操作等同于一个 upsert (UPdate, inSERT)操作,其中将更新记录,如果它不存在,则会将其插入到一个原子操作中。MongoDB 将根据 _id
字段执行匹配。
如果进行更新,则对象会被完全替换,不允许使用 MongoDB 的 $modifiers。因此,如果要操作对象(如果已存在),有两个选项:
- 执行查询以首先检索整个对象及其所有字段(不效率),在 Camel 中更改它,然后保存它。
- 使用带有 $modifiers 的 update 操作,该操作将在服务器端执行更新。您可以启用 upsert 标志,在这种情况下,如果需要插入,MongoDB 会将 $modifiers 应用到过滤器查询对象,并插入结果。
如果要保存的文档不包含 _id
属性,则操作将是一个插入,创建的新 _id
将放置在 CamelMongoOid
标头中。
例如:
from("direct:insert") .to("mongodb:myDb?database=flights&collection=tickets&operation=save");
// route: from("direct:insert").to("mongodb:myDb?database=flights&collection=tickets&operation=save"); org.bson.Document docForSave = new org.bson.Document(); docForSave.put("key", "value"); Object result = template.requestBody("direct:insert", docForSave);
45.7.2.3. update
更新集合上的一个或多个记录。需要过滤查询和更新规则。
您可以使用 MongoDBConstants.CRITERIA 标头作为 Bson
定义过滤器,并将更新规则定义为 Body 中的 Bson
。
在增强
While 定义过滤器 后,使用 MongoDBConstants.CRITERIA 标头作为 Bson
在进行更新前查询 mongodb,您应该注意到,如果您使用带有聚合策略的增强模式,则需要在聚合过程中将其从生成的 camel 交换中删除,然后应用 mongodb 更新。如果您在聚合和/或重新定义 MongoDBConstants.CRITERIA 标头期间没有删除此标头,则在将 camel 交换发送到 mongodb producer 端点前,可能会以无效的 camel 交换有效负载结束。
第二种需要 List<Bson> 作为 IN 消息正文,其中包含完全 2 个元素:
- 元素 1 (index 0) IANA 过滤器查询 IANA 决定了哪些对象将受到影响,与典型的查询对象相同
- 元素 2 (索引 1)Demo 更新规则如何更新匹配对象。支持 MongoDB 中的所有 修饰符操作。
多更新
默认情况下,MongoDB 只会更新 1 个对象,即使多个对象与过滤器查询匹配。要指示 MongoDB 更新所有 匹配的记录,请将 CamelMongoDbMultiUpdate
IN 消息标头设置为 true
。
将返回一个带有键 CamelMongoDbRecordsAffected
的标头(MongoDbConstants.RECORDS_AFFECTED
constant),带有更新的记录数量(从 WriteResult.getN ()
中获得)。
支持以下 IN 消息标头:
标头键 | 快速常数 | 描述(从 MongoDB API 文档中提取) | 预期类型 |
---|---|---|---|
|
| 如果更新应该应用到所有对象匹配。请参阅 http://www.mongodb.org/display/DOCS/Atomic+Operations | 布尔值/Boolean |
|
| 如果数据库应该创建元素(如果不存在) | 布尔值/Boolean |
例如,以下命令将通过将 " scientist " 字段的值设置为 "Darwin" 字段来更新其 filterField 字段等于 true 的所有记录:
// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update"); List<Bson> body = new ArrayList<>(); Bson filterField = Filters.eq("filterField", true); body.add(filterField); BsonDocument updateObj = new BsonDocument().append("$set", new BsonDocument("scientist", new BsonString("Darwin"))); body.add(updateObj); Object result = template.requestBodyAndHeader("direct:update", body, MongoDbConstants.MULTIUPDATE, true);
// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update"); Maps<String, Object> headers = new HashMap<>(2); headers.add(MongoDbConstants.MULTIUPDATE, true); headers.add(MongoDbConstants.FIELDS_FILTER, Filters.eq("filterField", true)); String updateObj = Updates.set("scientist", "Darwin");; Object result = template.requestBodyAndHeaders("direct:update", updateObj, headers);
// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update"); String updateObj = "[{\"filterField\": true}, {\"$set\", {\"scientist\", \"Darwin\"}}]"; Object result = template.requestBodyAndHeader("direct:update", updateObj, MongoDbConstants.MULTIUPDATE, true);
45.7.3. 删除操作
45.7.3.1. remove
从集合中删除匹配的记录。IN 消息正文将充当移除过滤器查询,预期为 DBObject
类型或可转换的类型。
以下示例将删除其字段 'conditionField' 等于 true 的所有对象,在科学数据库中,notableScientists 集合中:
// route: from("direct:remove").to("mongodb:myDb?database=science&collection=notableScientists&operation=remove"); Bson conditionField = Filters.eq("conditionField", true); Object result = template.requestBody("direct:remove", conditionField);
返回一个带有键 CamelMongoDbRecordsAffected
的标头 (MongoDbConstants.RECORDS_AFFECTED
constant) with type int
, 包括删除记录的数量 (从 WriteResult.getN()
复制)。
45.7.4. 批量写入操作
45.7.4.1. bulkWrite
批量执行写入操作,并控制执行顺序。需要一个 List<WriteModel<Document
>> 作为 IN 消息正文,其中包含用于插入、更新和删除操作的命令。
以下示例将插入一个新的科学家 "Pierre Curie",更新 id 为 "5" 的记录,将 "scientist" 项的值设置为 "Marie Curie" 并删除 id 为 "3" 的记录 :
// route: from("direct:bulkWrite").to("mongodb:myDb?database=science&collection=notableScientists&operation=bulkWrite"); List<WriteModel<Document>> bulkOperations = Arrays.asList( new InsertOneModel<>(new Document("scientist", "Pierre Curie")), new UpdateOneModel<>(new Document("_id", "5"), new Document("$set", new Document("scientist", "Marie Curie"))), new DeleteOneModel<>(new Document("_id", "3"))); BulkWriteResult result = template.requestBody("direct:bulkWrite", bulkOperations, BulkWriteResult.class);
默认情况下,操作按顺序执行,并在第一个写入错误上中断,而不处理列表中的任何剩余的写入操作。要指示 MongoDB 继续处理列表中的剩余的写入操作,请将 CamelMongoDbBulkOrdered
IN 消息标头设置为 false
。未排序的操作是并行执行的,无法保证此行为。
标头键 | 快速常数 | 描述(从 MongoDB API 文档中提取) | 预期类型 |
---|---|---|---|
|
| 执行排序或未排序的操作执行。默认值为 true。 | 布尔值/Boolean |
45.7.5. 其他操作
45.7.5.1. 聚合
使用正文中包含的给定管道执行聚合。聚合可能比较长且大量操作。请谨慎使用。
// route: from("direct:aggregate").to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate"); List<Bson> aggregate = Arrays.asList(match(or(eq("scientist", "Darwin"), eq("scientist", group("$scientist", sum("count", 1))); from("direct:aggregate") .setBody().constant(aggregate) .to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate") .to("mock:resultAggregate");
支持以下 IN 消息标头:
标头键 | 快速常数 | 描述(从 MongoDB API 文档中提取) | 预期类型 |
---|---|---|---|
|
| 设置每个批处理要返回的文档数。 | int/Integer |
|
| 启用聚合管道阶段将数据写入临时文件。 | 布尔值/Boolean |
默认情况下,返回所有结果的列表。根据结果的大小,这可能会大量内存。更安全的替代方案是设置 outputType=MongoIterable。接下来的处理器将在消息正文中看到一个 iterable,允许它逐一执行结果。因此,设置批处理大小并返回可迭代功能可以有效地检索和处理结果。
一个示例类似如下:
List<Bson> aggregate = Arrays.asList(match(or(eq("scientist", "Darwin"), eq("scientist", group("$scientist", sum("count", 1))); from("direct:aggregate") .setHeader(MongoDbConstants.BATCH_SIZE).constant(10) .setBody().constant(aggregate) .to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate&outputType=MongoIterable") .split(body()) .streaming() .to("mock:resultAggregate");
请注意,调用 .split (body ())
足以逐一发送路由条目,但它仍会首先将所有条目加载到内存中。因此,需要调用 .streaming ()
,以便批量将数据加载到内存中。
45.7.5.2. getDbStats
等同于在 MongoDB shell 中运行 db.stats ()
命令,该命令显示有关数据库的有用统计图。
例如:
> db.stats(); { "db" : "test", "collections" : 7, "objects" : 719, "avgObjSize" : 59.73296244784423, "dataSize" : 42948, "storageSize" : 1000058880, "numExtents" : 9, "indexes" : 4, "indexSize" : 32704, "fileSize" : 1275068416, "nsSizeMB" : 16, "ok" : 1 }
使用示例:
// from("direct:getDbStats").to("mongodb:myDb?database=flights&collection=tickets&operation=getDbStats"); Object result = template.requestBody("direct:getDbStats", "irrelevantBody"); assertTrue("Result is not of type Document", result instanceof Document);
操作将返回与 shell 中显示的数据结构类似,格式为 OUT 消息正文中的 文档
。
45.7.5.3. getColStats
等同于在 MongoDB shell 中运行 db.collection.stats ()
命令,该命令显示有关集合的有用统计图。
例如:
> db.camelTest.stats(); { "ns" : "test.camelTest", "count" : 100, "size" : 5792, "avgObjSize" : 57.92, "storageSize" : 20480, "numExtents" : 2, "nindexes" : 1, "lastExtentSize" : 16384, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 8176, "indexSizes" : { "_id_" : 8176 }, "ok" : 1 }
使用示例:
// from("direct:getColStats").to("mongodb:myDb?database=flights&collection=tickets&operation=getColStats"); Object result = template.requestBody("direct:getColStats", "irrelevantBody"); assertTrue("Result is not of type Document", result instanceof Document);
操作将返回与 shell 中显示的数据结构类似,格式为 OUT 消息正文中的 文档
。
45.7.5.4. 命令
作为命令在数据库上运行正文。对于获取主机信息、复制或分片状态时,管理员操作非常有用。
集合参数不适用于此操作。
// route: from("command").to("mongodb:myDb?database=science&operation=command"); DBObject commandBody = new BasicDBObject("hostInfo", "1"); Object result = template.requestBody("direct:command", commandBody);
45.7.6. 动态操作
Exchange 可以通过设置由 MongoDbConstants.OPERATION_HEADER
常量定义的 CamelMongoDbOperation
标头来覆盖端点的固定操作。
支持的值由 MongoDbOperation enumeration 决定,并与端点 URI 上 operation
参数的值匹配。
例如:
// from("direct:insert").to("mongodb:myDb?database=flights&collection=tickets&operation=insert"); Object result = template.requestBodyAndHeader("direct:insert", "irrelevantBody", MongoDbConstants.OPERATION_HEADER, "count"); assertTrue("Result is not of type Long", result instanceof Long);
45.8. 消费者
有几种类型的消费者:
- Tailable Cursor Consumer
- 更改流消费者
45.8.1. Tailable Cursor Consumer
MongoDB 提供了即时使用集合中持续数据的机制,具体方法是保持光标打开,就如同 slirpnix 系统的 tail -f
命令一样。由于服务器在客户端可用时将新数据推送到客户端,因此这种机制比调度的轮询效率要高得多,而不是让客户端以重新发出调度间隔来获取新数据。它还可减少其他冗余网络流量。
只有一个先决条件使用尾部光标:集合必须是"捕获集合",这意味着它只存放 N 个对象,当达到限制时,MongoDB 会按最初插入的顺序清除旧对象。如需更多信息,请参阅 http://www.mongodb.org/display/DOCS/Tailable+Cursors。
Camel MongoDB 组件实现了一个尾部的光标消费者,供您在 Camel 路由中使用此功能。插入新对象后,MongoDB 会按照自然顺序将其推送到您的尾部光标消费者,这些消费者将它们转换为交换并触发您的路由逻辑。
45.9. 尾部光标消费者如何工作
要将光标转换为可尾部光标的光标,在第一次生成光标时,会将几个特殊标志发送到 MongoDB。创建后,光标将保持打开状态,并在调用 MongoCursor.next ()
方法时阻止,直到新数据到达新数据。但是,如果在确定的句点后没有出现新数据,MongoDB 服务器保留自己终止您的光标的权利。如果您希望继续使用新数据,您必须重新生成光标。为此,您必须记住您离开的位置,否则您将重新从顶部开始消耗。
Camel MongoDB 尾部光标消费者为您负责所有这些任务。您只需要为您的数据中的某些字段提供密钥,它在每次重新生成时都会作为位置的位置,例如:时间戳、顺序 ID 等。它可以是 MongoDB 支持的任何数据类型。找到日期、字符串和整数才能正常工作。在此组件上下文中,我们调用这个机制"需要跟踪"。
消费者将记住此字段的最后值,每当重新生成光标时,它将使用类似过滤器的过滤器运行查询,如 increasingField > lastValue
,以便只消耗未读取的数据。
设置 increasing 字段: 在端点 URI tailTrackingIncreasingField
选项上设置 increasing 字段的密钥。在 Camel 2.10 中,它必须是数据的顶级字段,因为尚不支持此字段的嵌套导航。也就是说,"timestamp" 字段是 okay,但 "nested.timestamp" 无法正常工作。如果您需要支持嵌套增加字段,请在 Camel JIRA 中创建一个问题单。
光标重新生成延迟: 要注意的是,如果初始操作中没有新数据,MongoDB 将立即终止光标。由于我们不希望在这种情况下对服务器造成负担,因此引入了 cursorRegenerationDelay
选项(默认值为 1000ms),您可以对其进行修改以满足您的需要。
例如:
from("mongodb:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime") .id("tailableCursorConsumer1") .autoStartup(false) .to("mock:test");
以上路由将使用 "flights.cancellations" capped collection,使用 "departureTime" 作为增加字段,默认的重新生成光标延迟为 1000ms。
45.10. 持久性尾部跟踪
标准尾部跟踪是易失性的,最后一个值仅保存在内存中。但是,在实践中,您需要立即重启 Camel 容器,但您的最后一个值将会丢失,而您的尾部光标消费者将再次从顶部消耗,非常有可能将重复的记录发送到路由中。
要解决这种情况,您可以启用 持久的尾部跟踪 功能来跟踪 MongoDB 数据库中的特殊集合中消耗的值。当消费者再次进行初始化时,它将恢复最后的值,并在没有任何发生时继续。
最后读取值会保留在两个 occasions 上:每次重新生成光标和消费者关闭时,都会保留。我们以后可能会考虑定期保留(每 5 秒清空一次),以便在需要时添加持久性。要请求此功能,请在 Camel JIRA 中打开一个 ticket。
45.11. 启用持久的尾部跟踪
要启用此功能,请在端点 URI 中至少设置以下选项:
-
persistentTailTracking
选项为true
-
persistentId
选项指向这个消费者的唯一标识符,以便在许多消费者间重复使用相同的集合
另外,您可以将 tailTrackDb
,tailTrackCollection
和 tailTrackField
选项设置为自定义存储运行时信息的位置。有关每个选项的描述,请参阅此页面顶部的端点选项表。
例如,以下路由将使用"departureTime"作为增加字段的"flights.cancellations"大写集合,默认的重新生成光标延迟为 1000ms,持久性尾部跟踪打开,并在"flights.camelTracking" ID 下保留。 将最后处理的值存储在"lastTrackingValue"字段下(camelTailTracking
和 lastTrackingValue
是默认值)。
from("mongodb:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime&persistentTailTracking=true" + "&persistentId=cancellationsTracker") .id("tailableCursorConsumer2") .autoStartup(false) .to("mock:test");
以下是与上述示例相同,但持久性尾部跟踪运行时信息将存储在"trackers.camelTrackers"集合中,位于"lastProcessedDepartureTime"字段中:
from("mongodb:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime&persistentTailTracking=true" + "&persistentId=cancellationsTracker&tailTrackDb=trackers&tailTrackCollection=camelTrackers" + "&tailTrackField=lastProcessedDepartureTime") .id("tailableCursorConsumer3") .autoStartup(false) .to("mock:test");
45.11.1. 更改流消费者
通过更改流,应用程序可以访问实时数据更改,而不会降低 MongoDB oplog 的复杂性和风险。应用程序可以使用更改流来订阅集合上的所有数据更改,并立即响应它们。由于更改流使用聚合框架,应用程序也可以过滤特定更改或转换通知。交换正文将包含任何更改的完整文档。
要配置 Change Streams Consumer,您需要指定 consumerType
、database
、collection
和可选的 JSON 属性 streamFilter
来过滤事件。该 JSON 属性是标准的 MongoDB $match
聚合。可使用 XML DSL 配置轻松指定:
<route id="filterConsumer"> <from uri="mongodb:myDb?consumerType=changeStreams&database=flights&collection=tickets&streamFilter={ '$match':{'$or':[{'fullDocument.stringValue': 'specificValue'}]} }"/> <to uri="mock:test"/> </route>
Java 配置:
from("mongodb:myDb?consumerType=changeStreams&database=flights&collection=tickets&streamFilter={ '$match':{'$or':[{'fullDocument.stringValue': 'specificValue'}]} }") .to("mock:test");
您可以将 streamFilter 值外部化成属性占位符,允许清理端点 URI 参数并更轻松地读取。
changeStreams
消费者类型也会返回以下 OUT 标头:
标头键 | 快速常数 | 描述(从 MongoDB API 文档中提取) | 数据类型 |
---|---|---|---|
|
| 发生的操作类型。可以是以下值: insert, delete, replace, update, drop, dropDatabase, invalidate。 | 字符串 |
|
| 包含由插入、替换、删除、更新操作(如 CRUD 操作)创建或修改的文档。对于分片集合,还显示文档的完整分片键。如果 _id 字段已经是分片密钥的一部分,则不会重复它。 | ObjectId |
45.12. 类型转换
camel-mongodb 组件中包含的 MongoDbBasicConverters
类型转换器提供以下转换:
Name | from type | 要键入 | 如何? |
---|---|---|---|
fromMapToDocument |
|
|
创建一个新的 |
fromDocumentToMap |
|
|
|
fromStringToDocument |
|
|
使用 |
fromStringToObjectId |
|
|
通过新的 |
fromFileToDocument |
|
|
在 hood 下使用 |
fromInputStreamToDocument |
|
|
将 inputstream 字节转换为 |
fromStringToList |
|
|
使用 |
这个类型转换器是自动发现的,因此您不需要手动配置任何内容。
45.13. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 mongodb 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-mongodb-starter</artifactId> </dependency>
组件支持 5 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.mongodb.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.mongodb.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.mongodb.enabled | 是否启用 mongodb 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.mongodb.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.mongodb.mongo-connection | 用于连接的共享客户端。从组件生成的所有端点都将共享此连接客户端。选项是一个 com.mongodb.client.MongoClient 类型。 | MongoClient |
第 46 章 Netty
支持生成者和消费者
Camel 中的 Netty 组件是一个套接字通信组件,基于 Netty 项目版本 4。
Netty 是一个 NIO 客户端服务器框架,它允许快速轻松地开发 networkServerInitializerFactory 应用程序,如协议服务器和客户端。
Netty 大大简化和简化网络编程,如 TCP 和 UDP 套接字服务器。
此 camel 组件支持制作者和消费者端点。
Netty 组件有几个选项,允许对多个 TCP/UDP 通信参数(缓冲大小、inAlives、tcpNoDelay 等)进行精细控制,并促进 Camel 路由上的 In-Only 和 In-Out 通信。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-netty</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
46.1. URI 格式
netty 组件的 URI 方案如下
netty:tcp://0.0.0.0:99999[?options] netty:udp://remotehost:99999/[?options]
此组件支持 TCP 和 UDP 的制作者和消费者端点。
46.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
46.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,组件可能有安全设置、用于身份验证的凭证、用于网络连接的 url 等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml
)中使用 组件 DSL 配置组件,或者直接使用 Java 代码完成。
46.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为 配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 url、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
46.3. 组件选项
Netty 组件支持 73 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
configuration (common) | 在创建端点时,使用 NettyConfiguration 作为配置。 | NettyConfiguration | |
disconnect (common) | 是否在使用后是否断开(close)与 Netty Channel 的连接。可用于消费者和生产者。 | false | 布尔值 |
keepalive ( common) | 设置以确保不活动而关闭套接字。 | true | 布尔值 |
reuseAddress (common) | 设置以方便套接字多路。 | true | 布尔值 |
reuseChannel (common) | 此选项允许生产者和消费者(客户端模式)在处理交换的生命周期内重复使用相同的 Netty Channel。如果您需要在 Camel 路由中多次调用服务器并希望使用相同的网络连接,这非常有用。使用此选项时,频道不会返回到连接池,直到交换完成为止;如果 disconnect 选项设为 true,则不会断开连接。重复使用的频道作为交换属性存储在交换属性上,其键为 NettyConstants,Y_CHANNEL 允许您在路由期间获取频道并使用它。 | false | 布尔值 |
sync (common) | 设置为将端点设置为单向或请求响应。 | true | 布尔值 |
tcpNoDelay (common) | 设置以提高 TCP 协议性能。 | true | 布尔值 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
broadcast (consumer) | 设置以选择多播通过 UDP。 | false | 布尔值 |
clientMode (consumer) | 如果 clientMode 为 true,netty consumer 会将地址连接为 TCP 客户端。 | false | 布尔值 |
reconnect (consumer) | 只在消费者中的 clientMode 中使用,消费者将尝试断开连接时重新连接。 | true | 布尔值 |
reconnectInterval (consumer) | 如果启用了 reconnect 和 clientMode,则使用。尝试重新连接的时间间隔(以毫秒为单位)。 | 10000 | int |
Back log (consumer (advanced)) | 允许为 netty consumer (server)配置积压。请注意,回放是根据操作系统的最佳工作。将这个选项设置为 200、500 或 1000 等值,请告知 TCP 堆栈如果未配置此选项,则接受队列的时长,则 backlog 依赖于 OS 设置。 | int | |
bossCount (consumer (advanced)) | 当 netty 在 nio 模式上工作时,它会使用来自 Netty 的默认 bossCount 参数,即 1。用户可以使用这个选项覆盖 Netty 中的默认 bossCount。 | 1 | int |
bossGroup (consumer (advanced)) | 设置 BossGroup,可用于处理 NettyEndpoint 中服务器端的新连接。 | EventLoopGroup | |
disconnectOnNoReply (consumer (advanced)) | 如果启用了同步,则此选项指定 NettyConsumer (如果它应该断开任何回复的回复),则此选项指定 NettyConsumer。 | true | 布尔值 |
executorService (consumer (advanced)) | 使用给定的 EventExecutorGroup。 | EventExecutorGroup | |
maximumPoolSize (consumer (advanced)) | 为 netty consumer 排序的线程池设置最大线程池大小。默认大小为 2 x cpu_core 加上 1。将此值设置为 eg 10 将使用 10 个线程,除非 2 x cpu_core 加上 1 的值更高,然后会覆盖和使用它。例如,如果存在 8 个内核,则消费者线程池将为 17。此线程池用于路由 Camel 从 Netty 接收的消息。我们使用单独的线程池来确保对消息排序,并在某些消息被阻止时,则 nettys worker 线程(event loop)不受影响。 | int | |
nettyServerBootstrapFactory (consumer (advanced)) | 使用自定义 NettyServerBootstrapFactory。 | NettyServerBootstrapFactory | |
networkInterface (consumer (advanced)) | 使用 UDP 时,此选项可用于按名称指定网络接口,如 eth0 以加入多播组。 | 字符串 | |
noReplyLogLevel (consumer (advanced)) | 如果启用了同步,则指定 NettyConsumer 在日志记录没有回复时要使用的日志级别。 Enum 值:
| WARN | LoggingLevel |
serverClosedChannelExceptionCaughtLogLevel (consumer (advanced)) | 如果服务器(NettyConsumer)捕获了 java.nio.channels.ClosedChannelException,则它会使用此日志级别登录。这用于避免记录关闭的通道异常,因为客户端可能会立即断开连接,从而导致 Netty 服务器出现关闭异常。 Enum 值:
| DEBUG | LoggingLevel |
serverExceptionCaughtLogLevel (consumer (advanced)) | 如果服务器(NettyConsumer)捕获异常,则它会使用此日志级别记录其日志记录。 Enum 值:
| WARN | LoggingLevel |
serverInitializerFactory (consumer (advanced)) | 使用自定义 ServerInitializerFactory。 | ServerInitializerFactory | |
usingExecutorService (consumer (advanced)) | 是否使用排序的线程池,以确保在同一频道中按顺序处理事件。 | true | 布尔值 |
connectTimeout (producer) | 等待套接字连接可用时的时间。值以毫秒为单位。 | 10000 | int |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
requestTimeout (producer) | 在调用远程服务器时,允许将超时用于 Netty producer。默认情况下不使用超时。该值以秒为单位,因此 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 来触发超时。 | long | |
clientInitializerFactory (producer (advanced)) | 使用自定义 ClientInitializerFactory。 | ClientInitializerFactory | |
correlationManager (producer (advanced)) | 使用自定义关联管理器来管理在将 request/reply 与 netty producer 搭配使用时如何映射请求和回复消息。只有在您有一个将请求与回复一起映射(例如,请求和回复消息中存在关联 ID )时,才应使用此项。如果要在 netty 中在同一频道(连接连接)上多路复用。执行此操作时,您必须有一个方法来关联请求和回复消息,以便您可以在继续路由前将正确的回复存储在动态 Camel Exchange 中。在构建自定义关联经理时,我们建议扩展 TimeoutCorrelationManagerSupport。这提供了对其他需要实现的超时和其他复杂性的支持。如需了解更多详细信息,请参阅 producerPoolEnabled 选项。 | NettyCamelStateCorrelationManager | |
lazyChannelCreation (producer (advanced)) | 如果远程服务器在 Camel 生成者启动时没有启动并运行,则频道可能被创建以避免异常。 | true | 布尔值 |
producerPoolEnabled (producer (advanced)) | 生成者池是否已启用。重要:如果您关闭此,那么也会将单个共享连接用于生成者,即使您正在执行请求/回复。这意味着,如果回复未排序,则响应交集存在潜在的问题。因此,您需要在请求和回复消息中有一个关联 ID,以便您可以将回复正确与负责继续处理 Camel 中的消息的 Camel 回调关联。为此,您需要实施 NettyCamelStateCorrelationManager 作为关联管理器,并通过 correlationManager 选项进行配置。如需了解更多详细信息,请参阅 correlationManager 选项。 | true | 布尔值 |
producerPoolMaxIdle (producer (advanced)) | 设置池中闲置实例数量的上限。 | 100 | int |
producerPoolMaxTotal (producer (advanced)) | 设置池可分配的对象数量的上限(检查到客户端,或闲置等待签出)在给定时间闲置。对没有限制使用负值。 | -1 | int |
producerPoolMinEvictableIdle (producer (advanced)) | 在被闲置对象驱除前,设置对象可能闲置的最小时间(值为 millis)。 | 300000 | long |
producerPoolMinIdle (producer (advanced)) | 在驱除器线程(如果处于活动状态)前设置制作者池中允许的最小实例数量(如果处于活动状态)。 | int | |
udpConnectionlessSending (producer (advanced)) | 这个选项支持较少的 udp 发送的连接,这是实际触发和忘记。如果没有侦听接收端口,则连接的 udp 会接收 PortUnreachableException。 | false | 布尔值 |
useByteBuf (producer (advanced)) | 如果 useByteBuf 为 true,netty producer 会在发送前将消息正文转换为 ByteBuf。 | false | 布尔值 |
主机名验证( 安全) | 在 SSLEngine 上启用/禁用主机名验证。 | false | 布尔值 |
allowSerializedHeaders (advanced) | 仅在 transferExchange 为 true 时用于 TCP。当设置为 true 时,标头和属性中的可序列化对象将添加到交换中。否则,Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
channelGroup (advanced) | 使用显式 ChannelGroup。 | ChannelGroup | |
nativeTransport (advanced) | 是否使用原生传输而不是 NIO。原生传输利用主机操作系统,且仅在某些平台上被支持。您需要为您要使用的主机操作系统添加 netty JAR。详情请查看: | false | 布尔值 |
options (advanced) | 允许使用 option. 作为前缀来配置额外的 netty 选项。例如 option.child.keepAlive=false,来设置 netty 选项 child.keepAlive=false。有关可以使用的可能选项,请参阅 Netty 文档。 | Map | |
receiveBufferSize (advanced) | 在入站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | int |
receiveBufferSizePredictor (advanced) | 配置缓冲区大小预测器。详情请参阅 Jetty 文档和此邮件线程。 | int | |
sendBufferSize (advanced) | 在出站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | int |
transferExchange (advanced) | 仅用于 TCP。您可以在有线线上传输交换,而不只是正文。以下字段会被传输: 在 body, Out body, fault body, In headers, Out headers, fault headers, Exchange properties, exchange exception。这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。 | false | 布尔值 |
udpByteArrayCodec (advanced) | 仅限 UDP。如果启用了使用字节数组 codec 而不是 Java 序列化协议。 | false | 布尔值 |
workerCount (advanced) | 当 netty 在 nio 模式上工作时,它会使用来自 Netty 的默认 workerCount 参数(即 cpu_core_threads x 2)。用户可以使用这个选项覆盖 Netty 中的默认 workerCount。 | int | |
workerGroup (advanced) | 使用显式 EventLoopGroup 作为 boss 线程池。例如,与多个消费者或制作者共享线程池。默认情况下,每个消费者或生成者都有自己的 worker 池,具有 2 个 x cpu 计数内核线程。 | EventLoopGroup | |
allowDefaultCodec (codec) | 如果两者都默认 codec,netty 组件会安装一个默认的 codec,编码器/解码器为 null,文本行为 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件安装默认 codec 作为过滤器链中的第一个元素。 | true | 布尔值 |
autoAppendDelimiter (codec) | 在使用文本 codec 发送时,是否自动附加缺少的最终分隔符。 | true | 布尔值 |
decoderMaxLineLength (codec) | 文本代码的最大行长度。 | 1024 | int |
解码器 (codec) | 要使用的解码器列表。您可以使用用逗号分开的值的字符串,并在 Registry 中查找值。只需记住使用 192.168.1.0/24 为值添加前缀,因此 Camel 知道它应该查找。 | list | |
Delimiter (codec) | 用于文本代码的分隔符。可能的值有 LINE 和 NULL。 Enum 值:
| 行 | TextLineDelimiter |
encoders (codec) | 要使用的编码程序列表。您可以使用用逗号分开的值的字符串,并在 Registry 中查找值。只需记住使用 192.168.1.0/24 为值添加前缀,因此 Camel 知道它应该查找。 | list | |
编码 (codec) | 用于文本代码的编码(charset 名称)。如果没有提供,Camel 将使用 JVM 默认 Charset。 | 字符串 | |
文本行 (codec) | 仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的 codec;如果没有指定,则为 false,则通过 TCP 假设对象序列化,但默认只允许对字符串进行序列化。 | false | 布尔值 |
enabledProtocols (security) | 使用 SSL 时要启用哪个协议。 | TLSv1,TLSv1.1,TLSv1.2 | 字符串 |
keyStoreFile (security) | 用于加密的客户端证书密钥存储。 | File | |
keyStoreFormat (security) | 用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS。 | 字符串 | |
keyStoreResource (security) | 用于加密的客户端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
needClientAuth (security) | 配置服务器在使用 SSL 时是否需要客户端身份验证。 | false | 布尔值 |
密码短语 (安全) | 使用 SSH 加密/解密有效负载的密码设置。 | 字符串 | |
securityProvider (security) | 用于有效负载加密的安全提供程序。如果没有设置,则默认为 SunX509。 | 字符串 | |
SSL (安全) | 设置以指定 SSL 加密是否应用到此端点。 | false | 布尔值 |
sslClientCertHeaders (security) | 启用并在 SSL 模式中,Netty consumer 将增强 Camel Message,其标头包含有关客户端证书的信息,如主题名称、签发者名称、序列号和有效日期范围。 | false | 布尔值 |
sslContextParameters (security) | 使用 SSLContext 参数配置安全性: | SSLContextParameters | |
sslHandler (security) | 对可用于返回 SSL 处理程序的类的引用。 | SslHandler | |
trustStoreFile (security) | 用于加密的服务器端证书密钥存储。 | File | |
trustStoreResource (security) | 用于加密的服务器端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
useGlobalSslContextParameters (security) | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
46.4. 端点选项
Netty 端点使用 URI 语法进行配置:
netty:protocol://host:port
使用以下路径和查询参数:
46.4.1. 路径参数(3 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
protocol (common) | 必需 使用 tcp 或 udp 的协议。 Enum 值:
| 字符串 | |
host (common) | 必需 主机名。对于消费者,主机名为 localhost 或 0.0.0.0。对于制作者,主机名是要连接的远程主机。 | 字符串 | |
port (common) | 必需 主机端口号。 | int |
46.4.2. 查询参数(71 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
disconnect (common) | 是否在使用后是否断开(close)与 Netty Channel 的连接。可用于消费者和生产者。 | false | 布尔值 |
keepalive ( common) | 设置以确保不活动而关闭套接字。 | true | 布尔值 |
reuseAddress (common) | 设置以方便套接字多路。 | true | 布尔值 |
reuseChannel (common) | 此选项允许生产者和消费者(客户端模式)在处理交换的生命周期内重复使用相同的 Netty Channel。如果您需要在 Camel 路由中多次调用服务器并希望使用相同的网络连接,这非常有用。使用此选项时,频道不会返回到连接池,直到交换完成为止;如果 disconnect 选项设为 true,则不会断开连接。重复使用的频道作为交换属性存储在交换属性上,其键为 NettyConstants,Y_CHANNEL 允许您在路由期间获取频道并使用它。 | false | 布尔值 |
sync (common) | 设置为将端点设置为单向或请求响应。 | true | 布尔值 |
tcpNoDelay (common) | 设置以提高 TCP 协议性能。 | true | 布尔值 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
broadcast (consumer) | 设置以选择多播通过 UDP。 | false | 布尔值 |
clientMode (consumer) | 如果 clientMode 为 true,netty consumer 会将地址连接为 TCP 客户端。 | false | 布尔值 |
reconnect (consumer) | 只在消费者中的 clientMode 中使用,消费者将尝试断开连接时重新连接。 | true | 布尔值 |
reconnectInterval (consumer) | 如果启用了 reconnect 和 clientMode,则使用。尝试重新连接的时间间隔(以毫秒为单位)。 | 10000 | int |
Back log (consumer (advanced)) | 允许为 netty consumer (server)配置积压。请注意,回放是根据操作系统的最佳工作。将这个选项设置为 200、500 或 1000 等值,请告知 TCP 堆栈如果未配置此选项,则接受队列的时长,则 backlog 依赖于 OS 设置。 | int | |
bossCount (consumer (advanced)) | 当 netty 在 nio 模式上工作时,它会使用来自 Netty 的默认 bossCount 参数,即 1。用户可以使用这个选项覆盖 Netty 中的默认 bossCount。 | 1 | int |
bossGroup (consumer (advanced)) | 设置 BossGroup,可用于处理 NettyEndpoint 中服务器端的新连接。 | EventLoopGroup | |
disconnectOnNoReply (consumer (advanced)) | 如果启用了同步,则此选项指定 NettyConsumer (如果它应该断开任何回复的回复),则此选项指定 NettyConsumer。 | true | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
nettyServerBootstrapFactory (consumer (advanced)) | 使用自定义 NettyServerBootstrapFactory。 | NettyServerBootstrapFactory | |
networkInterface (consumer (advanced)) | 使用 UDP 时,此选项可用于按名称指定网络接口,如 eth0 以加入多播组。 | 字符串 | |
noReplyLogLevel (consumer (advanced)) | 如果启用了同步,则指定 NettyConsumer 在日志记录没有回复时要使用的日志级别。 Enum 值:
| WARN | LoggingLevel |
serverClosedChannelExceptionCaughtLogLevel (consumer (advanced)) | 如果服务器(NettyConsumer)捕获了 java.nio.channels.ClosedChannelException,则它会使用此日志级别登录。这用于避免记录关闭的通道异常,因为客户端可能会立即断开连接,从而导致 Netty 服务器出现关闭异常。 Enum 值:
| DEBUG | LoggingLevel |
serverExceptionCaughtLogLevel (consumer (advanced)) | 如果服务器(NettyConsumer)捕获异常,则它会使用此日志级别记录其日志记录。 Enum 值:
| WARN | LoggingLevel |
serverInitializerFactory (consumer (advanced)) | 使用自定义 ServerInitializerFactory。 | ServerInitializerFactory | |
usingExecutorService (consumer (advanced)) | 是否使用排序的线程池,以确保在同一频道中按顺序处理事件。 | true | 布尔值 |
connectTimeout (producer) | 等待套接字连接可用时的时间。值以毫秒为单位。 | 10000 | int |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
requestTimeout (producer) | 在调用远程服务器时,允许将超时用于 Netty producer。默认情况下不使用超时。该值以秒为单位,因此 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 来触发超时。 | long | |
clientInitializerFactory (producer (advanced)) | 使用自定义 ClientInitializerFactory。 | ClientInitializerFactory | |
correlationManager (producer (advanced)) | 使用自定义关联管理器来管理在将 request/reply 与 netty producer 搭配使用时如何映射请求和回复消息。只有在您有一个将请求与回复一起映射(例如,请求和回复消息中存在关联 ID )时,才应使用此项。如果要在 netty 中在同一频道(连接连接)上多路复用。执行此操作时,您必须有一个方法来关联请求和回复消息,以便您可以在继续路由前将正确的回复存储在动态 Camel Exchange 中。在构建自定义关联经理时,我们建议扩展 TimeoutCorrelationManagerSupport。这提供了对其他需要实现的超时和其他复杂性的支持。如需了解更多详细信息,请参阅 producerPoolEnabled 选项。 | NettyCamelStateCorrelationManager | |
lazyChannelCreation (producer (advanced)) | 如果远程服务器在 Camel 生成者启动时没有启动并运行,则频道可能被创建以避免异常。 | true | 布尔值 |
producerPoolEnabled (producer (advanced)) | 生成者池是否已启用。重要:如果您关闭此,那么也会将单个共享连接用于生成者,即使您正在执行请求/回复。这意味着,如果回复未排序,则响应交集存在潜在的问题。因此,您需要在请求和回复消息中有一个关联 ID,以便您可以将回复正确与负责继续处理 Camel 中的消息的 Camel 回调关联。为此,您需要实施 NettyCamelStateCorrelationManager 作为关联管理器,并通过 correlationManager 选项进行配置。如需了解更多详细信息,请参阅 correlationManager 选项。 | true | 布尔值 |
producerPoolMaxIdle (producer (advanced)) | 设置池中闲置实例数量的上限。 | 100 | int |
producerPoolMaxTotal (producer (advanced)) | 设置池可分配的对象数量的上限(检查到客户端,或闲置等待签出)在给定时间闲置。对没有限制使用负值。 | -1 | int |
producerPoolMinEvictableIdle (producer (advanced)) | 在被闲置对象驱除前,设置对象可能闲置的最小时间(值为 millis)。 | 300000 | long |
producerPoolMinIdle (producer (advanced)) | 在驱除器线程(如果处于活动状态)前设置制作者池中允许的最小实例数量(如果处于活动状态)。 | int | |
udpConnectionlessSending (producer (advanced)) | 这个选项支持较少的 udp 发送的连接,这是实际触发和忘记。如果没有侦听接收端口,则连接的 udp 会接收 PortUnreachableException。 | false | 布尔值 |
useByteBuf (producer (advanced)) | 如果 useByteBuf 为 true,netty producer 会在发送前将消息正文转换为 ByteBuf。 | false | 布尔值 |
主机名验证( 安全) | 在 SSLEngine 上启用/禁用主机名验证。 | false | 布尔值 |
allowSerializedHeaders (advanced) | 仅在 transferExchange 为 true 时用于 TCP。当设置为 true 时,标头和属性中的可序列化对象将添加到交换中。否则,Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。 | false | 布尔值 |
channelGroup (advanced) | 使用显式 ChannelGroup。 | ChannelGroup | |
nativeTransport (advanced) | 是否使用原生传输而不是 NIO。原生传输利用主机操作系统,且仅在某些平台上被支持。您需要为您要使用的主机操作系统添加 netty JAR。详情请查看: | false | 布尔值 |
options (advanced) | 允许使用 option. 作为前缀来配置额外的 netty 选项。例如 option.child.keepAlive=false,来设置 netty 选项 child.keepAlive=false。有关可以使用的可能选项,请参阅 Netty 文档。 | Map | |
receiveBufferSize (advanced) | 在入站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | int |
receiveBufferSizePredictor (advanced) | 配置缓冲区大小预测器。详情请参阅 Jetty 文档和此邮件线程。 | int | |
sendBufferSize (advanced) | 在出站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | int |
Sync (advanced) | 设置是否应严格使用同步处理。 | false | 布尔值 |
transferExchange (advanced) | 仅用于 TCP。您可以在有线线上传输交换,而不只是正文。以下字段会被传输: 在 body, Out body, fault body, In headers, Out headers, fault headers, Exchange properties, exchange exception。这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。 | false | 布尔值 |
udpByteArrayCodec (advanced) | 仅限 UDP。如果启用了使用字节数组 codec 而不是 Java 序列化协议。 | false | 布尔值 |
workerCount (advanced) | 当 netty 在 nio 模式上工作时,它会使用来自 Netty 的默认 workerCount 参数(即 cpu_core_threads x 2)。用户可以使用这个选项覆盖 Netty 中的默认 workerCount。 | int | |
workerGroup (advanced) | 使用显式 EventLoopGroup 作为 boss 线程池。例如,与多个消费者或制作者共享线程池。默认情况下,每个消费者或生成者都有自己的 worker 池,具有 2 个 x cpu 计数内核线程。 | EventLoopGroup | |
allowDefaultCodec (codec) | 如果两者都默认 codec,netty 组件会安装一个默认的 codec,编码器/解码器为 null,文本行为 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件安装默认 codec 作为过滤器链中的第一个元素。 | true | 布尔值 |
autoAppendDelimiter (codec) | 在使用文本 codec 发送时,是否自动附加缺少的最终分隔符。 | true | 布尔值 |
decoderMaxLineLength (codec) | 文本代码的最大行长度。 | 1024 | int |
解码器 (codec) | 要使用的解码器列表。您可以使用用逗号分开的值的字符串,并在 Registry 中查找值。只需记住使用 192.168.1.0/24 为值添加前缀,因此 Camel 知道它应该查找。 | list | |
Delimiter (codec) | 用于文本代码的分隔符。可能的值有 LINE 和 NULL。 Enum 值:
| 行 | TextLineDelimiter |
encoders (codec) | 要使用的编码程序列表。您可以使用用逗号分开的值的字符串,并在 Registry 中查找值。只需记住使用 192.168.1.0/24 为值添加前缀,因此 Camel 知道它应该查找。 | list | |
编码 (codec) | 用于文本代码的编码(charset 名称)。如果没有提供,Camel 将使用 JVM 默认 Charset。 | 字符串 | |
文本行 (codec) | 仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的 codec;如果没有指定,则为 false,则通过 TCP 假设对象序列化,但默认只允许对字符串进行序列化。 | false | 布尔值 |
enabledProtocols (security) | 使用 SSL 时要启用哪个协议。 | TLSv1,TLSv1.1,TLSv1.2 | 字符串 |
keyStoreFile (security) | 用于加密的客户端证书密钥存储。 | File | |
keyStoreFormat (security) | 用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS。 | 字符串 | |
keyStoreResource (security) | 用于加密的客户端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
needClientAuth (security) | 配置服务器在使用 SSL 时是否需要客户端身份验证。 | false | 布尔值 |
密码短语 (安全) | 使用 SSH 加密/解密有效负载的密码设置。 | 字符串 | |
securityProvider (security) | 用于有效负载加密的安全提供程序。如果没有设置,则默认为 SunX509。 | 字符串 | |
SSL (安全) | 设置以指定 SSL 加密是否应用到此端点。 | false | 布尔值 |
sslClientCertHeaders (security) | 启用并在 SSL 模式中,Netty consumer 将增强 Camel Message,其标头包含有关客户端证书的信息,如主题名称、签发者名称、序列号和有效日期范围。 | false | 布尔值 |
sslContextParameters (security) | 使用 SSLContext 参数配置安全性: | SSLContextParameters | |
sslHandler (security) | 对可用于返回 SSL 处理程序的类的引用。 | SslHandler | |
trustStoreFile (security) | 用于加密的服务器端证书密钥存储。 | File | |
trustStoreResource (security) | 用于加密的服务器端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 |
46.5. 基于 registry 的选项
codec Handlers 和 SSL Keystores 可以包含在 Registry 中,如 Spring XML 文件中。可以传递的值如下:
Name | 描述 |
---|---|
| 使用 SSH 加密/解密有效负载的密码设置 |
| 用于有效负载加密的密钥存储格式。如果没有设置,则默认为 "JKS" |
| 用于有效负载加密的安全提供程序。如果没有设置,则默认为 "SunX509"。 |
| 弃用: 用于加密的客户端证书密钥存储 |
| 弃用: 用于加密的服务器端证书密钥存储 |
|
用于加密的客户端证书密钥存储。默认从 classpath 加载,但您可以使用 |
|
用于加密的服务器端证书密钥存储。默认从 classpath 加载,但您可以使用 |
| 对可用于返回 SSL 处理程序的类的引用 |
|
自定义 |
| 要使用的编码程序列表。您可以使用用逗号分开的值的字符串,并在 Registry 中查找值。只需记住使用 192.168.1.0/24 为值添加前缀,因此 Camel 知道它应该查找。 |
|
一个自定义 |
| 要使用的解码器列表。您可以使用用逗号分开的值的字符串,并在 Registry 中查找值。只需记住使用 192.168.1.0/24 为值添加前缀,因此 Camel 知道它应该查找。 |
请阅读以下有关使用不可共享编码器/解码器的信息。
46.6. 从 Netty 端点向/发送消息
46.6.1. Netty Producer
在 Producer 模式中,组件提供使用 TCP 或 UDP 协议(具有可选 SSL 支持)将有效负载发送到套接字端点的功能。
producer 模式支持单向和基于请求的操作。
46.6.2. Netty Consumer
在 Consumer 模式中,组件提供以下功能:
- 使用 TCP 或 UDP 协议(可选 SSL 支持)侦听指定的套接字
- 使用文本/xml、二进制和基于序列化对象的有效负载接收套接字上的请求
- 在路由上作为消息交换发送它们。
消费者模式支持单向和基于请求的操作。
46.7. 例子
46.7.1. 使用 Request-Reply 和序列化对象有效负载的 UDP Netty 端点
请注意,默认不允许对象序列化,因此必须配置解码器。
@BindToRegistry("decoder") public ChannelHandler getDecoder() throws Exception { return new DefaultChannelHandlerFactory() { @Override public ChannelHandler newChannelHandler() { return new DatagramPacketObjectDecoder(ClassResolvers.weakCachingResolver(null)); } }; } RouteBuilder builder = new RouteBuilder() { public void configure() { from("netty:udp://0.0.0.0:5155?sync=true&decoders=#decoder") .process(new Processor() { public void process(Exchange exchange) throws Exception { Poetry poetry = (Poetry) exchange.getIn().getBody(); // Process poetry in some way exchange.getOut().setBody("Message received); } } } };
46.7.2. 使用单向通信基于 TCP 的 Netty 使用者端点
RouteBuilder builder = new RouteBuilder() { public void configure() { from("netty:tcp://0.0.0.0:5150") .to("mock:result"); } };
46.7.3. 使用 Request-Reply 通信的基于 SSL/TCP 的 Netty 使用者端点
使用 JSSE 配置工具
Netty 组件通过 Camel JSSE 配置实用程序支持 SSL/TLS 配置。这个工具可显著减少您需要编写的组件特定代码数量,并在端点和组件级别进行配置。以下示例演示了如何将 实用程序与 Netty 组件一起使用。
组件的编程配置
KeyStoreParameters ksp = new KeyStoreParameters(); ksp.setResource("/users/home/server/keystore.jks"); ksp.setPassword("keystorePassword"); KeyManagersParameters kmp = new KeyManagersParameters(); kmp.setKeyStore(ksp); kmp.setKeyPassword("keyPassword"); SSLContextParameters scp = new SSLContextParameters(); scp.setKeyManagers(kmp); NettyComponent nettyComponent = getContext().getComponent("netty", NettyComponent.class); nettyComponent.setSslContextParameters(scp);
基于 Spring DSL 的端点配置
... <camel:sslContextParameters id="sslContextParameters"> <camel:keyManagers keyPassword="keyPassword"> <camel:keyStore resource="/users/home/server/keystore.jks" password="keystorePassword"/> </camel:keyManagers> </camel:sslContextParameters>... ... <to uri="netty:tcp://0.0.0.0:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/> ...
在 Jetty 组件中使用基本 SSL/TLS 配置
Registry registry = context.getRegistry(); registry.bind("password", "changeit"); registry.bind("ksf", new File("src/test/resources/keystore.jks")); registry.bind("tsf", new File("src/test/resources/keystore.jks")); context.addRoutes(new RouteBuilder() { public void configure() { String netty_ssl_endpoint = "netty:tcp://0.0.0.0:5150?sync=true&ssl=true&passphrase=#password" + "&keyStoreFile=#ksf&trustStoreFile=#tsf"; String return_string = "When You Go Home, Tell Them Of Us And Say," + "For Your Tomorrow, We Gave Our Today."; from(netty_ssl_endpoint) .process(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getOut().setBody(return_string); } } } });
获取 SSLSession 和客户端证书的访问权限
如果您需要获取客户端证书的详细信息,您可以访问 javax.net.ssl.SSLSession
。当 ssl=true
时,Netty 组件会将 SSLSession
存储为 Camel Message 上的标头,如下所示:
SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class); // get the first certificate which is client certificate javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0]; Principal principal = cert.getSubjectDN();
请记住,设置 needClientAuth=true
以验证客户端,否则 SSLSession
无法访问客户端证书的信息,您可以得到 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
。如果客户端证书过期或无效等,您可能还会获得此异常。
选项 sslClientCertHeaders
可以设置为 true
,然后使用具有客户端证书详情的标头增强 Camel 消息。例如,主题名称在标头 CamelNettySSLClientCertSubjectName
中可用。
46.7.4. 使用多个代码
在某些情况下,可能需要将编码器和解码器链添加到 netty 管道。要将 multpile codecs 添加到 camel netty 端点中,应使用 'encoders' 和 'decoders' uri 参数。与 'encoder' 和 'decoder' 参数一样,它们用来提供应添加到管道中的 ChannelUpstreamHandlers 和 ChannelDownstreamHandlers 的引用(list)。请注意,如果指定了 encodingrs,则编码器参数将被忽略,类似于解码器和解码器参数。
更多有关使用不可共享编码器/解码器的信息。
codecs 列表需要添加到 Camel 的 registry 中,以便在创建端点时解析它们。
ChannelHandlerFactory lengthDecoder = ChannelHandlerFactories.newLengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4); StringDecoder stringDecoder = new StringDecoder(); registry.bind("length-decoder", lengthDecoder); registry.bind("string-decoder", stringDecoder); LengthFieldPrepender lengthEncoder = new LengthFieldPrepender(4); StringEncoder stringEncoder = new StringEncoder(); registry.bind("length-encoder", lengthEncoder); registry.bind("string-encoder", stringEncoder); List<ChannelHandler> decoders = new ArrayList<ChannelHandler>(); decoders.add(lengthDecoder); decoders.add(stringDecoder); List<ChannelHandler> encoders = new ArrayList<ChannelHandler>(); encoders.add(lengthEncoder); encoders.add(stringEncoder); registry.bind("encoders", encoders); registry.bind("decoders", decoders);
Spring 的原生集合支持可用于在应用程序上下文中指定 codec 列表
<util:list id="decoders" list-class="java.util.LinkedList"> <bean class="org.apache.camel.component.netty.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder"> <constructor-arg value="1048576"/> <constructor-arg value="0"/> <constructor-arg value="4"/> <constructor-arg value="0"/> <constructor-arg value="4"/> </bean> <bean class="io.netty.handler.codec.string.StringDecoder"/> </util:list> <util:list id="encoders" list-class="java.util.LinkedList"> <bean class="io.netty.handler.codec.LengthFieldPrepender"> <constructor-arg value="4"/> </bean> <bean class="io.netty.handler.codec.string.StringEncoder"/> </util:list> <bean id="length-encoder" class="io.netty.handler.codec.LengthFieldPrepender"> <constructor-arg value="4"/> </bean> <bean id="string-encoder" class="io.netty.handler.codec.string.StringEncoder"/> <bean id="length-decoder" class="org.apache.camel.component.netty.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder"> <constructor-arg value="1048576"/> <constructor-arg value="0"/> <constructor-arg value="4"/> <constructor-arg value="0"/> <constructor-arg value="4"/> </bean> <bean id="string-decoder" class="io.netty.handler.codec.string.StringDecoder"/>
然后,在 netty 端点定义中使用 bean 名称作为逗号分隔的列表,也可以包含在 List 等中。
from("direct:multiple-codec").to("netty:tcp://0.0.0.0:{{port}}?encoders=#encoders&sync=false"); from("netty:tcp://0.0.0.0:{{port}}?decoders=#length-decoder,#string-decoder&sync=false").to("mock:multiple-codec");
或者通过 XML。
<camelContext id="multiple-netty-codecs-context" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:multiple-codec"/> <to uri="netty:tcp://0.0.0.0:5150?encoders=#encoders&sync=false"/> </route> <route> <from uri="netty:tcp://0.0.0.0:5150?decoders=#length-decoder,#string-decoder&sync=false"/> <to uri="mock:multiple-codec"/> </route> </camelContext>
46.8. 完成后关闭频道
当作为服务器使用时,有时希望关闭频道,例如,客户端转换已完成。
您可以通过设置 endpoint 选项 disconnect=true
来完成此操作。
但是,您也可以按如下方式指示 Camel 按每个消息:
要指示 Camel 关闭频道,您应该添加一个带有键 CamelNettyCloseChannelWhenComplete
的标头,设置为布尔值。
例如,以下示例将在将信息写入客户端后关闭频道:
from("netty:tcp://0.0.0.0:8080").process(new Processor() { public void process(Exchange exchange) throws Exception { String body = exchange.getIn().getBody(String.class); exchange.getOut().setBody("Bye " + body); // some condition which determines if we should close if (close) { exchange.getOut().setHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, true); } } });
添加自定义频道管道工厂以完全控制创建的管道。
46.9. 自定义管道
自定义频道管道通过插入自定义处理程序、编码器和解码器,而无需以非常简单的方式在 Netty Endpoint URL 中为用户提供完全控制。
要添加自定义管道,必须通过上下文 registry (Registry 或 camel-spring ApplicationContextRegistry 等)创建自定义频道管道工厂。
自定义管道工厂必须构建如下
-
链接的频道管道工厂必须扩展抽象类
ClientPipelineFactory
。 -
Consumer linked 频道管道工厂必须扩展抽象类
ServerInitializerFactory
。 -
类应该覆盖 initChannel ()方法,以便插入自定义处理程序、编码器和解码器。不覆盖
initChannel ()
方法会创建一个没有处理程序、编码器或解码器到管道的管道。
以下示例演示了如何创建 ServerInitializerFactory 工厂
46.9.1. 使用自定义管道工厂
public class SampleServerInitializerFactory extends ServerInitializerFactory { private int maxLineSize = 1024; protected void initChannel(Channel ch) throws Exception { ChannelPipeline channelPipeline = ch.pipeline(); channelPipeline.addLast("encoder-SD", new StringEncoder(CharsetUtil.UTF_8)); channelPipeline.addLast("decoder-DELIM", new DelimiterBasedFrameDecoder(maxLineSize, true, Delimiters.lineDelimiter())); channelPipeline.addLast("decoder-SD", new StringDecoder(CharsetUtil.UTF_8)); // here we add the default Camel ServerChannelHandler for the consumer, to allow Camel to route the message etc. channelPipeline.addLast("handler", new ServerChannelHandler(consumer)); } }
然后可将自定义频道管道工厂添加到 registry 中,并以以下方式在 camel 路由上实例化/使用
Registry registry = camelContext.getRegistry(); ServerInitializerFactory factory = new TestServerInitializerFactory(); registry.bind("spf", factory); context.addRoutes(new RouteBuilder() { public void configure() { String netty_ssl_endpoint = "netty:tcp://0.0.0.0:5150?serverInitializerFactory=#spf" String return_string = "When You Go Home, Tell Them Of Us And Say," + "For Your Tomorrow, We Gave Our Today."; from(netty_ssl_endpoint) .process(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getOut().setBody(return_string); } } } });
46.10. 重新使用 Netty bos 和 worker 线程池
Netty 有两种类型的线程池:boss 和 worker。默认情况下,每个 Netty consumer 和 producer 具有其专用线程池。如果要在多个消费者或生成者间重复使用这些线程池,则必须在 Registry 中创建并加入线程池。
例如,使用 Spring XML,我们可使用带有 2 个 worker 线程的 NettyWorkerPoolBuilder
创建共享 worker 线程池,如下所示:
<!-- use the worker pool builder to help create the shared thread pool --> <bean id="poolBuilder" class="org.apache.camel.component.netty.NettyWorkerPoolBuilder"> <property name="workerCount" value="2"/> </bean> <!-- the shared worker thread pool --> <bean id="sharedPool" class="org.jboss.netty.channel.socket.nio.WorkerPool" factory-bean="poolBuilder" factory-method="build" destroy-method="shutdown"> </bean>
对于 boss 线程池,有一个 org.apache.camel.component.netty.NettyServerBossPoolBuilder
构建器,以及用于 Netty producer 的 org.apache.camel.component.netty.NettyClientBossPoolBuilder
。
然后,在 Camel 路由中,您可以通过在 URI 中配置 workerPool
选项来引用此 worker 池,如下所示:
<route> <from uri="netty:tcp://0.0.0.0:5021?textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/> <to uri="log:result"/> ... </route>
如果我们有另一个路由,我们可以引用共享 worker 池:
<route> <from uri="netty:tcp://0.0.0.0:5022?textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/> <to uri="log:result"/> ... </route>
因此,
46.11. 通过与请求/回复的单一连接进行多路的并发消息
当通过 netty producer 使用 Netty 进行请求/回复消息传递时,默认情况下,每个消息都通过非共享连接(池)发送。这样可确保回复自动映射到正确的请求线程,以便在 Camel 中进一步路由。在请求/回复消息之间的其他方面相关发生开箱即用,因为回复会回到发送请求的相同连接,并且此连接不会与其他连接共享。当响应返回时,连接会返回连接池,其中可以被其他人重复使用。
但是,如果您想要在单个共享连接上多路并发请求/响应,则需要通过设置 producerPoolEnabled=false
来关闭连接池。现在,如果回复未排序,这意味着有交集响应的潜在问题。因此,您需要在请求和回复消息中有一个关联 ID,以便您可以将回复正确与负责继续处理 Camel 中的消息的 Camel 回调关联。为此,您需要将 NettyCamelStateCorrelationManager
作为关联管理器实施,并通过 correlationManager=114myManager
选项进行配置。
在构建自定义关联经理时,我们建议扩展 TimeoutCorrelationManagerSupport
。这提供了对其他需要实现的超时和其他复杂性的支持。
您可以在 camel-example-netty-custom-correlation
目录下的 examples 目录中找到 Apache Camel 源代码的示例。
46.12. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 netty 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-netty-starter</artifactId> </dependency>
组件支持 74 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.netty.allow-default-codec | 如果两者都默认 codec,netty 组件会安装一个默认的 codec,编码器/解码器为 null,文本行为 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件安装默认 codec 作为过滤器链中的第一个元素。 | true | 布尔值 |
camel.component.netty.allow-serialized-headers | 仅在 transferExchange 为 true 时用于 TCP。当设置为 true 时,标头和属性中的可序列化对象将添加到交换中。否则,Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。 | false | 布尔值 |
camel.component.netty.auto-append-delimiter | 在使用文本 codec 发送时,是否自动附加缺少的最终分隔符。 | true | 布尔值 |
camel.component.netty.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.netty.backlog | 允许为 netty consumer (server)配置积压。请注意,回放是根据操作系统的最佳工作。将这个选项设置为 200、500 或 1000 等值,请告知 TCP 堆栈如果未配置此选项,则接受队列的时长,则 backlog 依赖于 OS 设置。 | 整数 | |
camel.component.netty.boss-count | 当 netty 在 nio 模式上工作时,它会使用来自 Netty 的默认 bossCount 参数,即 1。用户可以使用这个选项覆盖 Netty 中的默认 bossCount。 | 1 | 整数 |
camel.component.netty.boss-group | 设置 BossGroup,可用于处理 NettyEndpoint 中服务器端的新连接。选项是一个 io.netty.channel.EventLoopGroup 类型。 | EventLoopGroup | |
camel.component.netty.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.netty.broadcast | 设置以选择多播通过 UDP。 | false | 布尔值 |
camel.component.netty.channel-group | 使用显式 ChannelGroup。选项是一个 io.netty.channel.group.ChannelGroup 类型。 | ChannelGroup | |
camel.component.netty.client-initializer-factory | 使用自定义 ClientInitializerFactory。选项是 org.apache.camel.component.netty.ClientInitializerFactory 类型。 | ClientInitializerFactory | |
camel.component.netty.client-mode | 如果 clientMode 为 true,netty consumer 会将地址连接为 TCP 客户端。 | false | 布尔值 |
camel.component.netty.configuration | 在创建端点时,使用 NettyConfiguration 作为配置。选项是 org.apache.camel.component.netty.NettyConfiguration 类型。 | NettyConfiguration | |
camel.component.netty.connect-timeout | 等待套接字连接可用时的时间。值以毫秒为单位。 | 10000 | 整数 |
camel.component.netty.correlation-manager | 使用自定义关联管理器来管理在将 request/reply 与 netty producer 搭配使用时如何映射请求和回复消息。只有在您有一个将请求与回复一起映射(例如,请求和回复消息中存在关联 ID )时,才应使用此项。如果要在 netty 中在同一频道(连接连接)上多路复用。执行此操作时,您必须有一个方法来关联请求和回复消息,以便您可以在继续路由前将正确的回复存储在动态 Camel Exchange 中。在构建自定义关联经理时,我们建议扩展 TimeoutCorrelationManagerSupport。这提供了对其他需要实现的超时和其他复杂性的支持。如需了解更多详细信息,请参阅 producerPoolEnabled 选项。选项是 org.apache.camel.component.netty.NettyCamelStateCorrelationManager 类型。 | NettyCamelStateCorrelationManager | |
camel.component.netty.decoder-max-line-length | 文本代码的最大行长度。 | 1024 | 整数 |
camel.component.netty.decoders | 要使用的解码器列表。您可以使用用逗号分开的值的字符串,并在 Registry 中查找值。只需记住使用 192.168.1.0/24 为值添加前缀,因此 Camel 知道它应该查找。 | 字符串 | |
camel.component.netty.delimiter | 用于文本代码的分隔符。可能的值有 LINE 和 NULL。 | TextLineDelimiter | |
camel.component.netty.disconnect | 是否在使用后是否断开(close)与 Netty Channel 的连接。可用于消费者和生产者。 | false | 布尔值 |
camel.component.netty.disconnect-on-no-reply | 如果启用了同步,则此选项指定 NettyConsumer (如果它应该断开任何回复的回复),则此选项指定 NettyConsumer。 | true | 布尔值 |
camel.component.netty.enabled | 是否启用 netty 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.netty.enabled-protocols | 使用 SSL 时要启用哪个协议。 | TLSv1,TLSv1.1,TLSv1.2 | 字符串 |
camel.component.netty.encoders | 要使用的编码程序列表。您可以使用用逗号分开的值的字符串,并在 Registry 中查找值。只需记住使用 192.168.1.0/24 为值添加前缀,因此 Camel 知道它应该查找。 | 字符串 | |
camel.component.netty.encoding | 用于文本代码的编码(charset 名称)。如果没有提供,Camel 将使用 JVM 默认 Charset。 | 字符串 | |
camel.component.netty.executor-service | 使用给定的 EventExecutorGroup。选项是一个 io.netty.util.concurrent.EventExecutorGroup 类型。 | EventExecutorGroup | |
camel.component.netty.hostname-verification | 在 SSLEngine 上启用/禁用主机名验证。 | false | 布尔值 |
camel.component.netty.keep-alive | 设置以确保不活动而关闭套接字。 | true | 布尔值 |
camel.component.netty.key-store-file | 用于加密的客户端证书密钥存储。 | File | |
camel.component.netty.key-store-format | 用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS。 | 字符串 | |
camel.component.netty.key-store-resource | 用于加密的客户端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
camel.component.netty.lazy-channel-creation | 如果远程服务器在 Camel 生成者启动时没有启动并运行,则频道可能被创建以避免异常。 | true | 布尔值 |
camel.component.netty.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.netty.maximum-pool-size | 为 netty consumer 排序的线程池设置最大线程池大小。默认大小为 2 x cpu_core 加上 1。将此值设置为 eg 10 将使用 10 个线程,除非 2 x cpu_core 加上 1 的值更高,然后会覆盖和使用它。例如,如果存在 8 个内核,则消费者线程池将为 17。此线程池用于路由 Camel 从 Netty 接收的消息。我们使用单独的线程池来确保对消息排序,并在某些消息被阻止时,则 nettys worker 线程(event loop)不受影响。 | 整数 | |
camel.component.netty.native-transport | 是否使用原生传输而不是 NIO。原生传输利用主机操作系统,且仅在某些平台上被支持。您需要为您要使用的主机操作系统添加 netty JAR。详情请查看: | false | 布尔值 |
camel.component.netty.need-client-auth | 配置服务器在使用 SSL 时是否需要客户端身份验证。 | false | 布尔值 |
camel.component.netty.netty-server-bootstrap-factory | 使用自定义 NettyServerBootstrapFactory。选项是 org.apache.camel.component.netty.NettyServerBootstrapFactory 类型。 | NettyServerBootstrapFactory | |
camel.component.netty.network-interface | 使用 UDP 时,此选项可用于按名称指定网络接口,如 eth0 以加入多播组。 | 字符串 | |
camel.component.netty.no-reply-log-level | 如果启用了同步,则指定 NettyConsumer 在日志记录没有回复时要使用的日志级别。 | LoggingLevel | |
camel.component.netty.options | 允许使用 option. 作为前缀来配置额外的 netty 选项。例如 option.child.keepAlive=false,来设置 netty 选项 child.keepAlive=false。有关可以使用的可能选项,请参阅 Netty 文档。 | Map | |
camel.component.netty.passphrase | 使用 SSH 加密/解密有效负载的密码设置。 | 字符串 | |
camel.component.netty.producer-pool-enabled | 生成者池是否已启用。重要:如果您关闭此,那么也会将单个共享连接用于生成者,即使您正在执行请求/回复。这意味着,如果回复未排序,则响应交集存在潜在的问题。因此,您需要在请求和回复消息中有一个关联 ID,以便您可以将回复正确与负责继续处理 Camel 中的消息的 Camel 回调关联。为此,您需要实施 NettyCamelStateCorrelationManager 作为关联管理器,并通过 correlationManager 选项进行配置。如需了解更多详细信息,请参阅 correlationManager 选项。 | true | 布尔值 |
camel.component.netty.producer-pool-max-idle | 设置池中闲置实例数量的上限。 | 100 | 整数 |
camel.component.netty.producer-pool-max-total | 设置池可分配的对象数量的上限(检查到客户端,或闲置等待签出)在给定时间闲置。对没有限制使用负值。 | -1 | 整数 |
camel.component.netty.producer-pool-min-evictable-idle | 在被闲置对象驱除前,设置对象可能闲置的最小时间(值为 millis)。 | 300000 | Long |
camel.component.netty.producer-pool-min-idle | 在驱除器线程(如果处于活动状态)前设置制作者池中允许的最小实例数量(如果处于活动状态)。 | 整数 | |
camel.component.netty.receive-buffer-size | 在入站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | 整数 |
camel.component.netty.receive-buffer-size-predictor | 配置缓冲区大小预测器。详情请参阅 Jetty 文档和此邮件线程。 | 整数 | |
camel.component.netty.reconnect | 只在消费者中的 clientMode 中使用,消费者将尝试断开连接时重新连接。 | true | 布尔值 |
camel.component.netty.reconnect-interval | 如果启用了 reconnect 和 clientMode,则使用。尝试重新连接的时间间隔(以毫秒为单位)。 | 10000 | 整数 |
camel.component.netty.request-timeout | 在调用远程服务器时,允许将超时用于 Netty producer。默认情况下不使用超时。该值以秒为单位,因此 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 来触发超时。 | Long | |
camel.component.netty.reuse-address | 设置以方便套接字多路。 | true | 布尔值 |
camel.component.netty.reuse-channel | 此选项允许生产者和消费者(客户端模式)在处理交换的生命周期内重复使用相同的 Netty Channel。如果您需要在 Camel 路由中多次调用服务器并希望使用相同的网络连接,这非常有用。使用此选项时,频道不会返回到连接池,直到交换完成为止;如果 disconnect 选项设为 true,则不会断开连接。重复使用的频道作为交换属性存储在交换属性上,其键为 NettyConstants,Y_CHANNEL 允许您在路由期间获取频道并使用它。 | false | 布尔值 |
camel.component.netty.security-provider | 用于有效负载加密的安全提供程序。如果没有设置,则默认为 SunX509。 | 字符串 | |
camel.component.netty.send-buffer-size | 在出站通信期间使用的 TCP/UDP 缓冲区大小。大小为字节。 | 65536 | 整数 |
camel.component.netty.server-closed-channel-exception-caught-log-level | 如果服务器(NettyConsumer)捕获了 java.nio.channels.ClosedChannelException,则它会使用此日志级别登录。这用于避免记录关闭的通道异常,因为客户端可能会立即断开连接,从而导致 Netty 服务器出现关闭异常。 | LoggingLevel | |
camel.component.netty.server-exception-caught-log-level | 如果服务器(NettyConsumer)捕获异常,则它会使用此日志级别记录其日志记录。 | LoggingLevel | |
camel.component.netty.server-initializer-factory | 使用自定义 ServerInitializerFactory。选项是 org.apache.camel.component.netty.ServerInitializerFactory 类型。 | ServerInitializerFactory | |
camel.component.netty.ssl | 设置以指定 SSL 加密是否应用到此端点。 | false | 布尔值 |
camel.component.netty.ssl-client-cert-headers | 启用并在 SSL 模式中,Netty consumer 将增强 Camel Message,其标头包含有关客户端证书的信息,如主题名称、签发者名称、序列号和有效日期范围。 | false | 布尔值 |
camel.component.netty.ssl-context-parameters | 使用 SSLContext 参数配置安全性:选项是 org.apache.camel.support.jsse.SSLContextParameters 类型。 | SSLContextParameters | |
camel.component.netty.ssl-handler | 对可用于返回 SSL 处理程序的类的引用。选项是 io.netty.handler.ssl.SslHandler 类型。 | SslHandler | |
camel.component.netty.sync | 设置为将端点设置为单向或请求响应。 | true | 布尔值 |
camel.component.netty.tcp-no-delay | 设置以提高 TCP 协议性能。 | true | 布尔值 |
camel.component.netty.textline | 仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的 codec;如果没有指定,则为 false,则通过 TCP 假设对象序列化,但默认只允许对字符串进行序列化。 | false | 布尔值 |
camel.component.netty.transfer-exchange | 仅用于 TCP。您可以在有线线上传输交换,而不只是正文。以下字段会被传输: 在 body, Out body, fault body, In headers, Out headers, fault headers, Exchange properties, exchange exception。这要求对象可以序列化。Camel 将排除任何不可序列化的对象,并将它记录在 WARN 级别。 | false | 布尔值 |
camel.component.netty.trust-store-file | 用于加密的服务器端证书密钥存储。 | File | |
camel.component.netty.trust-store-resource | 用于加密的服务器端证书密钥存储。默认情况下从 classpath 加载,但您可以使用 classpath:、file: 或 http: 前缀来加载来自不同系统的资源。 | 字符串 | |
camel.component.netty.udp-byte-array-codec | 仅限 UDP。如果启用了使用字节数组 codec 而不是 Java 序列化协议。 | false | 布尔值 |
camel.component.netty.udp-connectionless-sending | 这个选项支持较少的 udp 发送的连接,这是实际触发和忘记。如果没有侦听接收端口,则连接的 udp 会接收 PortUnreachableException。 | false | 布尔值 |
camel.component.netty.use-byte-buf | 如果 useByteBuf 为 true,netty producer 会在发送前将消息正文转换为 ByteBuf。 | false | 布尔值 |
camel.component.netty.use-global-ssl-context-parameters | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
camel.component.netty.using-executor-service | 是否使用排序的线程池,以确保在同一频道中按顺序处理事件。 | true | 布尔值 |
camel.component.netty.worker-count | 当 netty 在 nio 模式上工作时,它会使用来自 Netty 的默认 workerCount 参数(即 cpu_core_threads x 2)。用户可以使用这个选项覆盖 Netty 中的默认 workerCount。 | 整数 | |
camel.component.netty.worker-group | 使用显式 EventLoopGroup 作为 boss 线程池。例如,与多个消费者或制作者共享线程池。默认情况下,每个消费者或生成者都有自己的 worker 池,具有 2 个 x cpu 计数内核线程。选项是一个 io.netty.channel.EventLoopGroup 类型。 | EventLoopGroup |
第 47 章 paho
支持生成者和消费者
paho 组件使用 Eclipse Paho 库 为 MQTT 消息传递协议提供连接器。paho 是最流行的 mq 库之一,因此,如果您想要将其与 Java 项目集成 - Camel Paho connector 是一种好方法。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-paho</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
47.1. URI 格式
paho:topic[?options]
其中 topic 是主题的名称。
47.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
47.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
47.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。
换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
47.3. 组件选项
Paho 组件支持 31 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
automaticReconnect (common) | 如果连接丢失,设置客户端是否自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动连接到服务器。如果设置为 true,如果连接丢失,客户端会尝试重新连接服务器。它初始会在尝试重新连接前等待 1 秒,对于每个失败的尝试,其延长会加倍,指定 2 分钟为止,此时,延迟会一直为 2 分钟。 | true | 布尔值 |
brokerUrl (common) | mq 代理的 URL。 | tcp://localhost:1883 | 字符串 |
cleanSession (common) | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,客户端和服务器在重启客户端后维护状态,则服务器和客户端的连接。维护状态 :消息交付将可靠满足指定的 QOS,即使客户端、服务器或连接重启也是如此。服务器会将订阅视为 durable。如果设置为 true,则客户端和服务器在重启客户端后不维护状态,服务器或连接将不会被维护。这意味着,如果客户端、服务器或连接重启,则无法维护发送到指定的 QOS 的消息。服务器会将订阅视为不可durable。 | true | 布尔值 |
clientId (common) | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
configuration (common) | 使用共享 Paho 配置。 | PahoConfiguration | |
connectionTimeout (common) | 设置连接超时值。这个值以秒为单位定义客户端要等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。0 代表禁用超时处理意味着客户端将等待网络连接成功或失败。 | 30 | int |
filePersistenceDirectory (common) | 文件持久性使用的基本目录。默认将使用 user 目录。 | 字符串 | |
keepAliveInterval (common) | 设置保留间隔。这个值(以秒为单位)定义发送或接收消息之间的最大时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保每个情况下至少有一个消息在网络间传输。如果在时间段内没有与数据相关的消息,客户端会发送一个非常小的 ping 消息,服务器将确认。0 代表禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | int |
maxInflight (common) | 设置最大 inflight。请在高流量环境中增加这个值。默认值为 10。 | 10 | int |
maxReconnectDelay (common) | 获取在重新连接之间等待的最大时间(以 millis 为单位)。 | 128000 | int |
mqttVersion (common) | 设置 mq 版本。默认操作是与 3.1.1 版本连接,如果失败,则回退到 3.1。可以分别使用 mq_VERSION_3_1_1 或 MQTT_VERSION_3_1 选项,具体选择 3.1.1 或 3.1 版本。 | int | |
Persistence (common) | 要使用的客户端持久性 - 内存或文件。 Enum 值:
| MEMORY | Paho\":\" |
QoS (common) | 客户端服务质量(0-2)。 | 2 | int |
reserved (common) | retain 选项。 | false | 布尔值 |
serverURIs (common) | 设置客户端可以连接到的一个或多个 serverURI 的列表。多个服务器可以用逗号分开。每个 serverURI 指定客户端可以连接的服务器的地址。两种类型的连接是 TCP 连接的 tcp://,对于 SSL/TLS 保护的 TCP 连接支持 ssl://。例如: tcp://localhost:1883 ssl://localhost:8883 如果未指定端口,对于 tcp:// URI,它将默认为 1883,对于 ssl:// URI,将默认为 1883。如果设置了 serverURIs,它会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接启动时,客户端将从列表中的第一个 serverURI 开始,并通过列表进行工作,直到与服务器建立连接。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接到的服务器列表具有多个用途:高可用性和可靠的消息交付一些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,并保证无论客户端连接到哪个服务器,消息都可以可靠交付且可暂停订阅。如果需要具有危险的订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可能需要指定一组不相等的服务器(如在高可用性选项中)。因为在服务器间没有状态共享可靠的消息交付,因此没有可用的订阅无效。如果使用 hunt 列表模式,必须将 cleansession 标志设置为 true。 | 字符串 | |
willPayload (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | 字符串 | |
willQos (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | int | |
willRetained (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | false | 布尔值 |
willTopic (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | 字符串 | |
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) | 使用共享的 Paho 客户端。 | MqttClient | |
customWebSocketHeaders (advanced) | 为 WebSocket 连接设置自定义 WebSocket 标头。 | Properties | |
executorServiceTimeout (advanced) | 在强制终止前,设置 executor 服务在终止时应等待的时间(以秒为单位)。除非需要修改这个值,否则不建议更改这个值。 | 1 | int |
httpsHostnameVerificationEnabled (security) | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
密码 (安全) | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
socketFactory (security) | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 提供特定于应用程序的安全设置。 | SocketFactory | |
sslClientProps (security) | 设置连接的 SSL 属性。请注意,只有在有 Java 安全套接字扩展(JSSE)的实现时才有效这些属性。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性: com.ibm.ssl.protocol one of of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的名称。例如 /mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 您希望 KeyManager 使用的 KeyStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key 存储,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider 存储提供程序,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.trustStore 包含您希望 TrustManager 使用的 KeyStore 对象的名称。com.ibm.ssl.trustStorePassword 要使用的 TrustStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 是您希望默认 TrustManager 使用的 KeyStore 对象的类型。值与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置算法,该算法将用于实例化平台中提供的 KeyManagerFactory 对象,而不使用平台中提供的默认算法。示例值: IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:PKIX 或 IBMJ9X509。 | Properties | |
sslHostnameVerifier (security) | 为 SSL 连接设置 HostnameVerifier。请注意,它会在连接的握手后使用,您应该在验证主机名错误时自己执行操作。没有默认的 HostnameVerifier。 | HostnameVerifier | |
userName (security) | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 |
47.4. 端点选项
Paho 端点使用 URI 语法进行配置:
paho:topic
使用以下路径和查询参数:
47.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
topic (common) | 主题 所需的 名称。 | 字符串 |
47.4.2. 查询参数(31 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
automaticReconnect (common) | 如果连接丢失,设置客户端是否自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动连接到服务器。如果设置为 true,如果连接丢失,客户端会尝试重新连接服务器。它初始会在尝试重新连接前等待 1 秒,对于每个失败的尝试,其延长会加倍,指定 2 分钟为止,此时,延迟会一直为 2 分钟。 | true | 布尔值 |
brokerUrl (common) | mq 代理的 URL。 | tcp://localhost:1883 | 字符串 |
cleanSession (common) | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,客户端和服务器在重启客户端后维护状态,则服务器和客户端的连接。维护状态 :消息交付将可靠满足指定的 QOS,即使客户端、服务器或连接重启也是如此。服务器会将订阅视为 durable。如果设置为 true,则客户端和服务器在重启客户端后不维护状态,服务器或连接将不会被维护。这意味着,如果客户端、服务器或连接重启,则无法维护发送到指定的 QOS 的消息。服务器会将订阅视为不可durable。 | true | 布尔值 |
clientId (common) | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
connectionTimeout (common) | 设置连接超时值。这个值以秒为单位定义客户端要等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。0 代表禁用超时处理意味着客户端将等待网络连接成功或失败。 | 30 | int |
filePersistenceDirectory (common) | 文件持久性使用的基本目录。默认将使用 user 目录。 | 字符串 | |
keepAliveInterval (common) | 设置保留间隔。这个值(以秒为单位)定义发送或接收消息之间的最大时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保每个情况下至少有一个消息在网络间传输。如果在时间段内没有与数据相关的消息,客户端会发送一个非常小的 ping 消息,服务器将确认。0 代表禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | int |
maxInflight (common) | 设置最大 inflight。请在高流量环境中增加这个值。默认值为 10。 | 10 | int |
maxReconnectDelay (common) | 获取在重新连接之间等待的最大时间(以 millis 为单位)。 | 128000 | int |
mqttVersion (common) | 设置 mq 版本。默认操作是与 3.1.1 版本连接,如果失败,则回退到 3.1。可以分别使用 mq_VERSION_3_1_1 或 MQTT_VERSION_3_1 选项,具体选择 3.1.1 或 3.1 版本。 | int | |
Persistence (common) | 要使用的客户端持久性 - 内存或文件。 Enum 值:
| MEMORY | Paho\":\" |
QoS (common) | 客户端服务质量(0-2)。 | 2 | int |
reserved (common) | retain 选项。 | false | 布尔值 |
serverURIs (common) | 设置客户端可以连接到的一个或多个 serverURI 的列表。多个服务器可以用逗号分开。每个 serverURI 指定客户端可以连接的服务器的地址。两种类型的连接是 TCP 连接的 tcp://,对于 SSL/TLS 保护的 TCP 连接支持 ssl://。例如: tcp://localhost:1883 ssl://localhost:8883 如果未指定端口,对于 tcp:// URI,它将默认为 1883,对于 ssl:// URI,将默认为 1883。如果设置了 serverURIs,它会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接启动时,客户端将从列表中的第一个 serverURI 开始,并通过列表进行工作,直到与服务器建立连接。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接到的服务器列表具有多个用途:高可用性和可靠的消息交付一些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,并保证无论客户端连接到哪个服务器,消息都可以可靠交付且可暂停订阅。如果需要具有危险的订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可能需要指定一组不相等的服务器(如在高可用性选项中)。因为在服务器间没有状态共享可靠的消息交付,因此没有可用的订阅无效。如果使用 hunt 列表模式,必须将 cleansession 标志设置为 true。 | 字符串 | |
willPayload (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | 字符串 | |
willQos (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | int | |
willRetained (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | false | 布尔值 |
willTopic (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | 字符串 | |
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 | 布尔值 |
client (advanced) | 使用现有的 mqtt 客户端。 | MqttClient | |
customWebSocketHeaders (advanced) | 为 WebSocket 连接设置自定义 WebSocket 标头。 | Properties | |
executorServiceTimeout (advanced) | 在强制终止前,设置 executor 服务在终止时应等待的时间(以秒为单位)。除非需要修改这个值,否则不建议更改这个值。 | 1 | int |
httpsHostnameVerificationEnabled (security) | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
密码 (安全) | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
socketFactory (security) | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 提供特定于应用程序的安全设置。 | SocketFactory | |
sslClientProps (security) | 设置连接的 SSL 属性。请注意,只有在有 Java 安全套接字扩展(JSSE)的实现时才有效这些属性。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性: com.ibm.ssl.protocol one of of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的名称。例如 /mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 您希望 KeyManager 使用的 KeyStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key 存储,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider 存储提供程序,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.trustStore 包含您希望 TrustManager 使用的 KeyStore 对象的名称。com.ibm.ssl.trustStorePassword 要使用的 TrustStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 是您希望默认 TrustManager 使用的 KeyStore 对象的类型。值与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置算法,该算法将用于实例化平台中提供的 KeyManagerFactory 对象,而不使用平台中提供的默认算法。示例值: IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:PKIX 或 IBMJ9X509。 | Properties | |
sslHostnameVerifier (security) | 为 SSL 连接设置 HostnameVerifier。请注意,它会在连接的握手后使用,您应该在验证主机名错误时自己执行操作。没有默认的 HostnameVerifier。 | HostnameVerifier | |
userName (security) | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 |
47.5. Headers
以下标头可以被 Paho 组件识别:
标头 | Java 常数 | 端点类型 | 值类型 | 描述 |
---|---|---|---|---|
CamelMqttTopic | PahoConstants.MQTT_TOPIC | 消费者 | 字符串 | 主题的名称 |
CamelMqttQoS | PahoConstants.MQTT_QOS | 消费者 | 整数 | 传入消息的 QualityOfService |
CamelPahoOverrideTopic | PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC | 制作者 | 字符串 | 要覆盖并发送到的主题名称,而不是在端点上指定的主题 |
47.6. 默认有效负载类型
默认情况下,Camel Paho 组件在从(或放入)中提取的二进制有效负载上运行:
// Receive payload byte[] payload = (byte[]) consumerTemplate.receiveBody("paho:topic"); // Send payload byte[] payload = "message".getBytes(); producerTemplate.sendBody("paho:topic", payload);
但是,Camel 构建 类型转换 API 可以为您执行自动数据类型转换。在以下示例中,Camel 会自动将二进制有效负载 转换为字符串
(相反):
// Receive payload String payload = consumerTemplate.receiveBody("paho:topic", String.class); // Send payload String payload = "message"; producerTemplate.sendBody("paho:topic", payload);
47.7. Samples
例如,以下片段从与 Camel 路由器相同的主机上安装的 mq 代理读取信息:
from("paho:some/queue") .to("mock:test");
虽然以下片段会向 MQTT 代理发送信息:
from("direct:test") .to("paho:some/target/queue");
例如,这是如何从远程 mq 代理读取信息:
from("paho:some/queue?brokerUrl=tcp://iot.eclipse.org:1883") .to("mock:test");
在这里,我们将覆盖默认主题,并设置为动态主题
from("direct:test") .setHeader(PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC, simple("${header.customerId}")) .to("paho:some/target/queue");
47.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 paho 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-paho-starter</artifactId> </dependency>
组件支持 32 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.paho.automatic-reconnect | 如果连接丢失,设置客户端是否自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动连接到服务器。如果设置为 true,如果连接丢失,客户端会尝试重新连接服务器。它初始会在尝试重新连接前等待 1 秒,对于每个失败的尝试,其延长会加倍,指定 2 分钟为止,此时,延迟会一直为 2 分钟。 | true | 布尔值 |
camel.component.paho.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.paho.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.paho.broker-url | mq 代理的 URL。 | tcp://localhost:1883 | 字符串 |
camel.component.paho.clean-session | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,客户端和服务器在重启客户端后维护状态,则服务器和客户端的连接。维护状态 :消息交付将可靠满足指定的 QOS,即使客户端、服务器或连接重启也是如此。服务器会将订阅视为 durable。如果设置为 true,则客户端和服务器在重启客户端后不维护状态,服务器或连接将不会被维护。这意味着,如果客户端、服务器或连接重启,则无法维护发送到指定的 QOS 的消息。服务器会将订阅视为不可durable。 | true | 布尔值 |
camel.component.paho.client | 使用共享的 Paho 客户端。选项是 org.eclipse.paho.client.mqttv3.MqttClient 类型。 | MqttClient | |
camel.component.paho.client-id | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
camel.component.paho.configuration | 使用共享 Paho 配置。选项是 org.apache.camel.component.paho.PahoConfiguration 类型。 | PahoConfiguration | |
camel.component.paho.connection-timeout | 设置连接超时值。这个值以秒为单位定义客户端要等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。0 代表禁用超时处理意味着客户端将等待网络连接成功或失败。 | 30 | 整数 |
camel.component.paho.custom-web-socket-headers | 为 WebSocket 连接设置自定义 WebSocket 标头。选项是 java.util.Properties 类型。 | Properties | |
camel.component.paho.enabled | 是否启用 paho 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.paho.executor-service-timeout | 在强制终止前,设置 executor 服务在终止时应等待的时间(以秒为单位)。除非需要修改这个值,否则不建议更改这个值。 | 1 | 整数 |
camel.component.paho.file-persistence-directory | 文件持久性使用的基本目录。默认将使用 user 目录。 | 字符串 | |
camel.component.paho.https-hostname-verification-enabled | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
camel.component.paho.keep-alive-interval | 设置保留间隔。这个值(以秒为单位)定义发送或接收消息之间的最大时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保每个情况下至少有一个消息在网络间传输。如果在时间段内没有与数据相关的消息,客户端会发送一个非常小的 ping 消息,服务器将确认。0 代表禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | 整数 |
camel.component.paho.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.paho.max-inflight | 设置最大 inflight。请在高流量环境中增加这个值。默认值为 10。 | 10 | 整数 |
camel.component.paho.max-reconnect-delay | 获取在重新连接之间等待的最大时间(以 millis 为单位)。 | 128000 | 整数 |
camel.component.paho.mqtt-version | 设置 mq 版本。默认操作是与 3.1.1 版本连接,如果失败,则回退到 3.1。可以分别使用 mq_VERSION_3_1_1 或 MQTT_VERSION_3_1 选项,具体选择 3.1.1 或 3.1 版本。 | 整数 | |
camel.component.paho.password | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
camel.component.paho.persistence | 要使用的客户端持久性 - 内存或文件。 | Paho\":\" | |
camel.component.paho.qos | 客户端服务质量(0-2)。 | 2 | 整数 |
camel.component.paho.retained | retain 选项。 | false | 布尔值 |
camel.component.paho.server-u-r-is | 设置客户端可以连接到的一个或多个 serverURI 的列表。多个服务器可以用逗号分开。每个 serverURI 指定客户端可以连接的服务器的地址。两种类型的连接是 TCP 连接的 tcp://,对于 SSL/TLS 保护的 TCP 连接支持 ssl://。例如: tcp://localhost:1883 ssl://localhost:8883 如果未指定端口,对于 tcp:// URI,它将默认为 1883,对于 ssl:// URI,将默认为 1883。如果设置了 serverURIs,它会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接启动时,客户端将从列表中的第一个 serverURI 开始,并通过列表进行工作,直到与服务器建立连接。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接到的服务器列表具有多个用途:高可用性和可靠的消息交付一些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,并保证无论客户端连接到哪个服务器,消息都可以可靠交付且可暂停订阅。如果需要具有危险的订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可能需要指定一组不相等的服务器(如在高可用性选项中)。因为在服务器间没有状态共享可靠的消息交付,因此没有可用的订阅无效。如果使用 hunt 列表模式,必须将 cleansession 标志设置为 true。 | 字符串 | |
camel.component.paho.socket-factory | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 提供特定于应用程序的安全设置。选项是 javax.net.SocketFactory 类型。 | SocketFactory | |
camel.component.paho.ssl-client-props | 设置连接的 SSL 属性。请注意,只有在有 Java 安全套接字扩展(JSSE)的实现时才有效这些属性。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性: com.ibm.ssl.protocol one of of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的名称。例如 /mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 您希望 KeyManager 使用的 KeyStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key 存储,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider 存储提供程序,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.trustStore 包含您希望 TrustManager 使用的 KeyStore 对象的名称。com.ibm.ssl.trustStorePassword 要使用的 TrustStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 是您希望默认 TrustManager 使用的 KeyStore 对象的类型。值与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置算法,该算法将用于实例化平台中提供的 KeyManagerFactory 对象,而不使用平台中提供的默认算法。示例值: IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:PKIX 或 IBMJ9X509。选项是 java.util.Properties 类型。 | Properties | |
camel.component.paho.ssl-hostname-verifier | 为 SSL 连接设置 HostnameVerifier。请注意,它会在连接的握手后使用,您应该在验证主机名错误时自己执行操作。没有默认的 HostnameVerifier。选项是 javax.net.ssl.HostnameVerifier 类型。 | HostnameVerifier | |
camel.component.paho.user-name | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 | |
camel.component.paho.will-payload | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | 字符串 | |
camel.component.paho.will-qos | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | 整数 | |
camel.component.paho.will-retained | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | false | 布尔值 |
camel.component.paho.will-topic | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到消息的字节有效负载的主题。发布消息的服务质量(0、1 或 2)。是否应保留消息。 | 字符串 |
第 48 章 Paho MQTT 5
支持生成者和消费者
paho mq5 组件使用带有 MQTT v5 的 Eclipse Paho 库为 mq 消息传递协议提供连接器。paho 是最流行的 mq 库之一,因此,如果您想要将其与 Java 项目集成 - Camel Paho connector 是一种好方法。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-paho-mqtt5</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
48.1. URI 格式
paho-mqtt5:topic[?options]
其中 topic 是主题的名称。
48.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
48.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
48.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
48.3. 组件选项
Paho mq 5 组件支持 32 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
automaticReconnect (common) | 如果连接丢失,设置客户端是否自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动连接到服务器。如果设置为 true,如果连接丢失,客户端会尝试重新连接服务器。它初始会在尝试重新连接前等待 1 秒,对于每个失败的尝试,其延长会加倍,指定 2 分钟为止,此时,延迟会一直为 2 分钟。 | true | 布尔值 |
brokerUrl (common) | mq 代理的 URL。 | tcp://localhost:1883 | 字符串 |
cleanStart (common) | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,客户端和服务器在重启客户端后维护状态,则服务器和客户端的连接。维护状态 :消息交付将可靠满足指定的 QOS,即使客户端、服务器或连接重启也是如此。服务器会将订阅视为 durable。如果设置为 true,则客户端和服务器在重启客户端后不维护状态,服务器或连接将不会被维护。这意味着,如果客户端、服务器或连接重启,则无法维护发送到指定的 QOS 的消息。服务器会将订阅视为不可durable。 | true | 布尔值 |
clientId (common) | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
configuration (common) | 使用共享 Paho 配置。 | PahoMqtt5Configuration | |
connectionTimeout (common) | 设置连接超时值。这个值以秒为单位定义客户端要等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。0 代表禁用超时处理意味着客户端将等待网络连接成功或失败。 | 30 | int |
filePersistenceDirectory (common) | 文件持久性使用的基本目录。默认将使用 user 目录。 | 字符串 | |
keepAliveInterval (common) | 设置保留间隔。这个值(以秒为单位)定义发送或接收消息之间的最大时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保每个情况下至少有一个消息在网络间传输。如果在时间段内没有与数据相关的消息,客户端会发送一个非常小的 ping 消息,服务器将确认。0 代表禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | int |
maxReconnectDelay (common) | 获取在重新连接之间等待的最大时间(以 millis 为单位)。 | 128000 | int |
Persistence (common) | 要使用的客户端持久性 - 内存或文件。 Enum 值:
| MEMORY | PahoMqtt5Persistence |
QoS (common) | 客户端服务质量(0-2)。 | 2 | int |
receiveMaximum (common) | 设置接收的最大值。这个值代表了客户端同时处理的 QoS 1 和 QoS 2 出版物的限制。没有机制来限制服务器可能会尝试发送的 QoS 0 出版物数量。默认值为 65535。 | 65535 | int |
reserved (common) | retain 选项。 | false | 布尔值 |
serverURIs (common) | 设置客户端可以连接到的一个或多个 serverURI 的列表。多个服务器可以用逗号分开。每个 serverURI 指定客户端可以连接的服务器的地址。两种类型的连接是 TCP 连接的 tcp://,对于 SSL/TLS 保护的 TCP 连接支持 ssl://。例如: tcp://localhost:1883 ssl://localhost:8883 如果未指定端口,对于 tcp:// URI,它将默认为 1883,对于 ssl:// URI,将默认为 1883。如果设置了 serverURIs,它会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接启动时,客户端将从列表中的第一个 serverURI 开始,并通过列表进行工作,直到与服务器建立连接。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接到的服务器列表具有多个用途:高可用性和可靠的消息交付一些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,并保证无论客户端连接到哪个服务器,消息都可以可靠交付且可暂停订阅。如果需要具有危险的订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可能需要指定一组不相等的服务器(如在高可用性选项中)。因为在服务器间没有状态共享可靠的消息交付,因此没有可用的订阅无效。如果使用 hunt 列表模式,必须将 cleansession 标志设置为 true。 | 字符串 | |
sessionExpiryInterval (common) | 设置 Session Expiry Interval。这个值(以秒为单位)定义代理在客户端断开连接后将保持会话的最长时间。如果客户端打算稍后连接到服务器,则客户端应仅与较长的会话过期间隔连接。默认情况下,这个值为 -1,因此不会发送,在这种情况下,会话不会过期。如果发送 0,则会话将在网络连接关闭后立即结束。当客户端确定它不再可用于会话时,它应该断开 Session Expiry Interval 设置为 0。 | -1 | long |
willMqttProperties (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。为消息设置的 mq 属性。 | MqttProperties | |
willPayload (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。消息的字节有效负载。 | 字符串 | |
willQos (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。发布消息的服务质量(0、1 或 2)。 | 1 | int |
willRetained (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。是否应保留消息。 | false | 布尔值 |
willTopic (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到的主题。 | 字符串 | |
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) | 使用共享的 Paho 客户端。 | MqttClient | |
customWebSocketHeaders (advanced) | 为 WebSocket 连接设置自定义 WebSocket 标头。 | Map | |
executorServiceTimeout (advanced) | 在强制终止前,设置 executor 服务在终止时应等待的时间(以秒为单位)。除非需要修改这个值,否则不建议更改这个值。 | 1 | int |
httpsHostnameVerificationEnabled (security) | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
密码 (安全) | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
socketFactory (security) | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 提供特定于应用程序的安全设置。 | SocketFactory | |
sslClientProps (security) | 设置连接的 SSL 属性。请注意,只有在有 Java 安全套接字扩展(JSSE)的实现时才有效这些属性。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性: com.ibm.ssl.protocol one of of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的名称。例如 /mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 您希望 KeyManager 使用的 KeyStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key 存储,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider 存储提供程序,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.trustStore 包含您希望 TrustManager 使用的 KeyStore 对象的名称。com.ibm.ssl.trustStorePassword 要使用的 TrustStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 是您希望默认 TrustManager 使用的 KeyStore 对象的类型。值与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置算法,该算法将用于实例化平台中提供的 KeyManagerFactory 对象,而不使用平台中提供的默认算法。示例值: IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:PKIX 或 IBMJ9X509。 | Properties | |
sslHostnameVerifier (security) | 为 SSL 连接设置 HostnameVerifier。请注意,它会在连接的握手后使用,您应该在验证主机名错误时自己执行操作。没有默认的 HostnameVerifier。 | HostnameVerifier | |
userName (security) | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 |
48.4. 端点选项
Paho mq 5 端点使用 URI 语法进行配置:
paho-mqtt5:topic
使用以下路径和查询参数:
48.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
topic (common) | 主题 所需的 名称。 | 字符串 |
48.4.2. 查询参数(32 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
automaticReconnect (common) | 如果连接丢失,设置客户端是否自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动连接到服务器。如果设置为 true,如果连接丢失,客户端会尝试重新连接服务器。它初始会在尝试重新连接前等待 1 秒,对于每个失败的尝试,其延长会加倍,指定 2 分钟为止,此时,延迟会一直为 2 分钟。 | true | 布尔值 |
brokerUrl (common) | mq 代理的 URL。 | tcp://localhost:1883 | 字符串 |
cleanStart (common) | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,客户端和服务器在重启客户端后维护状态,则服务器和客户端的连接。维护状态 :消息交付将可靠满足指定的 QOS,即使客户端、服务器或连接重启也是如此。服务器会将订阅视为 durable。如果设置为 true,则客户端和服务器在重启客户端后不维护状态,服务器或连接将不会被维护。这意味着,如果客户端、服务器或连接重启,则无法维护发送到指定的 QOS 的消息。服务器会将订阅视为不可durable。 | true | 布尔值 |
clientId (common) | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
connectionTimeout (common) | 设置连接超时值。这个值以秒为单位定义客户端要等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。0 代表禁用超时处理意味着客户端将等待网络连接成功或失败。 | 30 | int |
filePersistenceDirectory (common) | 文件持久性使用的基本目录。默认将使用 user 目录。 | 字符串 | |
keepAliveInterval (common) | 设置保留间隔。这个值(以秒为单位)定义发送或接收消息之间的最大时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保每个情况下至少有一个消息在网络间传输。如果在时间段内没有与数据相关的消息,客户端会发送一个非常小的 ping 消息,服务器将确认。0 代表禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | int |
maxReconnectDelay (common) | 获取在重新连接之间等待的最大时间(以 millis 为单位)。 | 128000 | int |
Persistence (common) | 要使用的客户端持久性 - 内存或文件。 Enum 值:
| MEMORY | PahoMqtt5Persistence |
QoS (common) | 客户端服务质量(0-2)。 | 2 | int |
receiveMaximum (common) | 设置接收的最大值。这个值代表了客户端同时处理的 QoS 1 和 QoS 2 出版物的限制。没有机制来限制服务器可能会尝试发送的 QoS 0 出版物数量。默认值为 65535。 | 65535 | int |
reserved (common) | retain 选项。 | false | 布尔值 |
serverURIs (common) | 设置客户端可以连接到的一个或多个 serverURI 的列表。多个服务器可以用逗号分开。每个 serverURI 指定客户端可以连接的服务器的地址。两种类型的连接是 TCP 连接的 tcp://,对于 SSL/TLS 保护的 TCP 连接支持 ssl://。例如: tcp://localhost:1883 ssl://localhost:8883 如果未指定端口,对于 tcp:// URI,它将默认为 1883,对于 ssl:// URI,将默认为 1883。如果设置了 serverURIs,它会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接启动时,客户端将从列表中的第一个 serverURI 开始,并通过列表进行工作,直到与服务器建立连接。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接到的服务器列表具有多个用途:高可用性和可靠的消息交付一些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,并保证无论客户端连接到哪个服务器,消息都可以可靠交付且可暂停订阅。如果需要具有危险的订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可能需要指定一组不相等的服务器(如在高可用性选项中)。因为在服务器间没有状态共享可靠的消息交付,因此没有可用的订阅无效。如果使用 hunt 列表模式,必须将 cleansession 标志设置为 true。 | 字符串 | |
sessionExpiryInterval (common) | 设置 Session Expiry Interval。这个值(以秒为单位)定义代理在客户端断开连接后将保持会话的最长时间。如果客户端打算稍后连接到服务器,则客户端应仅与较长的会话过期间隔连接。默认情况下,这个值为 -1,因此不会发送,在这种情况下,会话不会过期。如果发送 0,则会话将在网络连接关闭后立即结束。当客户端确定它不再可用于会话时,它应该断开 Session Expiry Interval 设置为 0。 | -1 | long |
willMqttProperties (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。为消息设置的 mq 属性。 | MqttProperties | |
willPayload (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。消息的字节有效负载。 | 字符串 | |
willQos (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。发布消息的服务质量(0、1 或 2)。 | 1 | int |
willRetained (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。是否应保留消息。 | false | 布尔值 |
willTopic (common) | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到的主题。 | 字符串 | |
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 | 布尔值 |
client (advanced) | 使用现有的 mqtt 客户端。 | MqttClient | |
customWebSocketHeaders (advanced) | 为 WebSocket 连接设置自定义 WebSocket 标头。 | Map | |
executorServiceTimeout (advanced) | 在强制终止前,设置 executor 服务在终止时应等待的时间(以秒为单位)。除非需要修改这个值,否则不建议更改这个值。 | 1 | int |
httpsHostnameVerificationEnabled (security) | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
密码 (安全) | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
socketFactory (security) | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 提供特定于应用程序的安全设置。 | SocketFactory | |
sslClientProps (security) | 设置连接的 SSL 属性。请注意,只有在有 Java 安全套接字扩展(JSSE)的实现时才有效这些属性。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性: com.ibm.ssl.protocol one of of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的名称。例如 /mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 您希望 KeyManager 使用的 KeyStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key 存储,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider 存储提供程序,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.trustStore 包含您希望 TrustManager 使用的 KeyStore 对象的名称。com.ibm.ssl.trustStorePassword 要使用的 TrustStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 是您希望默认 TrustManager 使用的 KeyStore 对象的类型。值与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置算法,该算法将用于实例化平台中提供的 KeyManagerFactory 对象,而不使用平台中提供的默认算法。示例值: IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:PKIX 或 IBMJ9X509。 | Properties | |
sslHostnameVerifier (security) | 为 SSL 连接设置 HostnameVerifier。请注意,它会在连接的握手后使用,您应该在验证主机名错误时自己执行操作。没有默认的 HostnameVerifier。 | HostnameVerifier | |
userName (security) | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 |
48.5. Headers
以下标头可以被 Paho 组件识别:
标头 | Java 常数 | 端点类型 | 值类型 | 描述 |
---|---|---|---|---|
CamelMqttTopic | PahoConstants.MQTT_TOPIC | 消费者 | 字符串 | 主题的名称 |
CamelMqttQoS | PahoConstants.MQTT_QOS | 消费者 | 整数 | 传入消息的 QualityOfService |
CamelPahoOverrideTopic | PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC | 制作者 | 字符串 | 要覆盖并发送到的主题名称,而不是在端点上指定的主题 |
48.6. 默认有效负载类型
默认情况下,Camel Paho 组件在从(或放入)中提取的二进制有效负载上运行:
// Receive payload byte[] payload = (byte[]) consumerTemplate.receiveBody("paho:topic"); // Send payload byte[] payload = "message".getBytes(); producerTemplate.sendBody("paho:topic", payload);
但是,Camel 构建 类型转换 API 可以为您执行自动数据类型转换。在以下示例中,Camel 会自动将二进制有效负载 转换为字符串
(相反):
// Receive payload String payload = consumerTemplate.receiveBody("paho:topic", String.class); // Send payload String payload = "message"; producerTemplate.sendBody("paho:topic", payload);
48.7. Samples
例如,以下片段从与 Camel 路由器相同的主机上安装的 mq 代理读取信息:
from("paho:some/queue") .to("mock:test");
虽然以下片段会向 MQTT 代理发送信息:
from("direct:test") .to("paho:some/target/queue");
例如,这是如何从远程 mq 代理读取信息:
from("paho:some/queue?brokerUrl=tcp://iot.eclipse.org:1883") .to("mock:test");
在这里,我们将覆盖默认主题,并设置为动态主题
from("direct:test") .setHeader(PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC, simple("${header.customerId}")) .to("paho:some/target/queue");
48.8. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 paho-mqtt5 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-paho-mqtt5-starter</artifactId> </dependency>
组件支持 33 选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.paho-mqtt5.automatic-reconnect | 如果连接丢失,设置客户端是否自动尝试重新连接到服务器。如果设置为 false,客户端不会在连接丢失时尝试自动连接到服务器。如果设置为 true,如果连接丢失,客户端会尝试重新连接服务器。它初始会在尝试重新连接前等待 1 秒,对于每个失败的尝试,其延长会加倍,指定 2 分钟为止,此时,延迟会一直为 2 分钟。 | true | 布尔值 |
camel.component.paho-mqtt5.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.paho-mqtt5.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.paho-mqtt5.broker-url | mq 代理的 URL。 | tcp://localhost:1883 | 字符串 |
camel.component.paho-mqtt5.clean-start | 设置客户端和服务器是否应该在重启和重新连接后记住状态。如果设置为 false,客户端和服务器在重启客户端后维护状态,则服务器和客户端的连接。维护状态 :消息交付将可靠满足指定的 QOS,即使客户端、服务器或连接重启也是如此。服务器会将订阅视为 durable。如果设置为 true,则客户端和服务器在重启客户端后不维护状态,服务器或连接将不会被维护。这意味着,如果客户端、服务器或连接重启,则无法维护发送到指定的 QOS 的消息。服务器会将订阅视为不可durable。 | true | 布尔值 |
camel.component.paho-mqtt5.client | 使用共享的 Paho 客户端。选项是 org.eclipse.paho.mqttv5.client.MqttClient 类型。 | MqttClient | |
camel.component.paho-mqtt5.client-id | MQTT 客户端标识符。标识符必须是唯一的。 | 字符串 | |
camel.component.paho-mqtt5.configuration | 使用共享 Paho 配置。选项是 org.apache.camel.component.paho.mqtt5.PahoMqtt5Configuration 类型。 | PahoMqtt5Configuration | |
camel.component.paho-mqtt5.connection-timeout | 设置连接超时值。这个值以秒为单位定义客户端要等待与 MQTT 服务器的网络连接的最大时间间隔。默认超时为 30 秒。0 代表禁用超时处理意味着客户端将等待网络连接成功或失败。 | 30 | 整数 |
camel.component.paho-mqtt5.custom-web-socket-headers | 为 WebSocket 连接设置自定义 WebSocket 标头。 | Map | |
camel.component.paho-mqtt5.enabled | 是否启用 paho-mqtt5 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.paho-mqtt5.executor-service-timeout | 在强制终止前,设置 executor 服务在终止时应等待的时间(以秒为单位)。除非需要修改这个值,否则不建议更改这个值。 | 1 | 整数 |
camel.component.paho-mqtt5.file-persistence-directory | 文件持久性使用的基本目录。默认将使用 user 目录。 | 字符串 | |
camel.component.paho-mqtt5.https-hostname-verification-enabled | 是否启用 SSL HostnameVerifier。默认值为 true。 | true | 布尔值 |
camel.component.paho-mqtt5.keep-alive-interval | 设置保留间隔。这个值(以秒为单位)定义发送或接收消息之间的最大时间间隔。它可让客户端检测服务器是否不再可用,而无需等待 TCP/IP 超时。客户端将确保每个情况下至少有一个消息在网络间传输。如果在时间段内没有与数据相关的消息,客户端会发送一个非常小的 ping 消息,服务器将确认。0 代表禁用客户端中的 keepalive 处理。默认值为 60 秒。 | 60 | 整数 |
camel.component.paho-mqtt5.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.paho-mqtt5.max-reconnect-delay | 获取在重新连接之间等待的最大时间(以 millis 为单位)。 | 128000 | 整数 |
camel.component.paho-mqtt5.password | 用于针对 MQTT 代理进行身份验证的密码。 | 字符串 | |
camel.component.paho-mqtt5.persistence | 要使用的客户端持久性 - 内存或文件。 | PahoMqtt5Persistence | |
camel.component.paho-mqtt5.qos | 客户端服务质量(0-2)。 | 2 | 整数 |
camel.component.paho-mqtt5.receive-maximum | 设置接收的最大值。这个值代表了客户端同时处理的 QoS 1 和 QoS 2 出版物的限制。没有机制来限制服务器可能会尝试发送的 QoS 0 出版物数量。默认值为 65535。 | 65535 | 整数 |
camel.component.paho-mqtt5.retained | retain 选项。 | false | 布尔值 |
camel.component.paho-mqtt5.server-u-r-is | 设置客户端可以连接到的一个或多个 serverURI 的列表。多个服务器可以用逗号分开。每个 serverURI 指定客户端可以连接的服务器的地址。两种类型的连接是 TCP 连接的 tcp://,对于 SSL/TLS 保护的 TCP 连接支持 ssl://。例如: tcp://localhost:1883 ssl://localhost:8883 如果未指定端口,对于 tcp:// URI,它将默认为 1883,对于 ssl:// URI,将默认为 1883。如果设置了 serverURIs,它会覆盖在 MQTT 客户端构造器上传递的 serverURI 参数。当尝试连接启动时,客户端将从列表中的第一个 serverURI 开始,并通过列表进行工作,直到与服务器建立连接。如果无法向任何服务器进行连接,则连接尝试会失败。指定客户端可以连接到的服务器列表具有多个用途:高可用性和可靠的消息交付一些 MQTT 服务器支持高可用性功能,其中两个或多个 MQTT 服务器共享状态。MQTT 客户端可以连接到任何相等的服务器,并保证无论客户端连接到哪个服务器,消息都可以可靠交付且可暂停订阅。如果需要具有危险的订阅和/或可靠的消息发送,则 cleansession 标志必须设置为 false。可能需要指定一组不相等的服务器(如在高可用性选项中)。因为在服务器间没有状态共享可靠的消息交付,因此没有可用的订阅无效。如果使用 hunt 列表模式,必须将 cleansession 标志设置为 true。 | 字符串 | |
camel.component.paho-mqtt5.session-expiry-interval | 设置 Session Expiry Interval。这个值(以秒为单位)定义代理在客户端断开连接后将保持会话的最长时间。如果客户端打算稍后连接到服务器,则客户端应仅与较长的会话过期间隔连接。默认情况下,这个值为 -1,因此不会发送,在这种情况下,会话不会过期。如果发送 0,则会话将在网络连接关闭后立即结束。当客户端确定它不再可用于会话时,它应该断开 Session Expiry Interval 设置为 0。 | -1 | Long |
camel.component.paho-mqtt5.socket-factory | 设置要使用的 SocketFactory。这允许应用程序在创建网络套接字时应用自己的策略。如果使用 SSL 连接,可以使用 SSLSocketFactory 提供特定于应用程序的安全设置。选项是 javax.net.SocketFactory 类型。 | SocketFactory | |
camel.component.paho-mqtt5.ssl-client-props | 设置连接的 SSL 属性。请注意,只有在有 Java 安全套接字扩展(JSSE)的实现时才有效这些属性。如果设置了自定义 SocketFactory,则不会使用这些属性。可以使用以下属性: com.ibm.ssl.protocol one of of: SSL, SSLv3, TLS, TLSv1, SSL_TLS. com.ibm.ssl.contextProvider Underlying JSSE 供应商。例如,IBMJSSE2 或 SunJSSE com.ibm.ssl.keyStore 包含您希望 KeyManager 使用的 KeyStore 对象的名称。例如 /mydir/etc/key.p12 com.ibm.ssl.keyStorePassword 您希望 KeyManager 使用的 KeyStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.keyStoreType Type of key 存储,如 PKCS12、JKS 或 JCEKS. com.ibm.ssl.keyStoreProvider 存储提供程序,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.trustStore 包含您希望 TrustManager 使用的 KeyStore 对象的名称。com.ibm.ssl.trustStorePassword 要使用的 TrustStore 对象的名称。密码可以采用纯文本,也可以使用静态方法模糊处理: com.ibm.micro.security.Password.obfuscate (char password)。这使用简单和不安全的 XOR 和 Base64 编码机制混淆密码。请注意,这只是一个简单的 scrambler 来混淆明文密码。com.ibm.ssl.trustStoreType 是您希望默认 TrustManager 使用的 KeyStore 对象的类型。值与 keyStoreType. com.ibm.ssl.trustStoreProvider Trust 存储供应商相同,如 IBMJCE 或 IBMJCEFIPS. com.ibm.ssl.enabledCipherSuites A 列表。值依赖于提供程序,例如:SSL_RSA_WITH_AES_128_CBC_SHA;SSL_RSA_WITH_3DES_EDE_CBC_SHA. com.ibm.ssl.keyManager 设置算法,该算法将用于实例化平台中提供的 KeyManagerFactory 对象,而不使用平台中提供的默认算法。示例值: IbmX509 或 IBMJ9X509. com.ibm.ssl.trustManager 设置用于实例化 TrustManagerFactory 对象的算法,而不使用平台中提供的默认算法。示例值:PKIX 或 IBMJ9X509。选项是 java.util.Properties 类型。 | Properties | |
camel.component.paho-mqtt5.ssl-hostname-verifier | 为 SSL 连接设置 HostnameVerifier。请注意,它会在连接的握手后使用,您应该在验证主机名错误时自己执行操作。没有默认的 HostnameVerifier。选项是 javax.net.ssl.HostnameVerifier 类型。 | HostnameVerifier | |
camel.component.paho-mqtt5.user-name | 用于针对 MQTT 代理进行身份验证的用户名。 | 字符串 | |
camel.component.paho-mqtt5.will-mqtt-properties | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。为消息设置的 mq 属性。选项是 org.eclipse.paho.mqttv5.common.packet.MqttProperties 类型。 | MqttProperties | |
camel.component.paho-mqtt5.will-payload | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。消息的字节有效负载。 | 字符串 | |
camel.component.paho-mqtt5.will-qos | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。发布消息的服务质量(0、1 或 2)。 | 1 | 整数 |
camel.component.paho-mqtt5.will-retained | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。是否应保留消息。 | false | 布尔值 |
camel.component.paho-mqtt5.will-topic | 为连接设置 Last Will and Testament (LWT)。如果此客户端意外丢失了与服务器的连接,服务器将使用提供的详细信息向自己发布一条消息。要发布到的主题。 | 字符串 |
第 49 章 平台 HTTP
从 Camel 3.0 开始
仅支持消费者
平台 HTTP 用于允许 Camel 使用运行时中的现有 HTTP 服务器。例如,在 Spring Boot、Quarkus 或者其他运行时上运行 Camel 时。
将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-platform-http</artifactId> <version>3.20.1.redhat-00031</version> <!-- use the same version as your Camel core version --> </dependency>
49.1. 平台 HTTP 供应商
要使用平台 HTTP,需要在 classpath 上提供供应商(引擎)。这样做的目的是为不同运行时(如 Quarkus、PolernetX 或 Spring Boot)具有驱动程序。
目前,camel-platform-http-vertx
仅支持 Quarkus 和 VertX。此 JAR 必须在 classpath 上,否则无法使用平台 HTTP 组件,并且在启动时会抛出异常。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-platform-http-vertx</artifactId> <version>3.20.1.redhat-00031</version> <!-- use the same version as your Camel core version --> </dependency>
49.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
49.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
49.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
49.2.3. 组件选项
平台 HTTP 组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
引擎 (advanced) | 为服务请求的 HTTP 服务器引擎实施。 | PlatformHttpEngine |
49.2.4. 端点选项
平台 HTTP 端点使用 URI 语法进行配置:
platform-http:path
使用以下路径和查询参数:
49.2.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
path (consumer) | 需要此 端点提供 HTTP 请求的路径,用于代理使用 'proxy'。 | 字符串 |
49.2.4.2. 查询参数(11 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
consumed (consumer) |
此端点接受的内容类型作为输入,如 application/xml 或 application/json. null 或 | 字符串 | |
httpMethodRestrict (consumer) | 以逗号分隔的 HTTP 方法列表,如 GET、POST。如果没有指定方法,则会提供所有方法。 | 字符串 | |
matchOnUriPrefix (consumer) | 如果没有找到完全匹配,消费者是否应该尝试通过匹配 URI 前缀来查找目标消费者。 | false | 布尔值 |
muteException (consumer) | 如果启用并在响应正文的消费者端处理者失败的处理,则响应的堆栈跟踪不会包含异常的堆栈跟踪。 | true | 布尔值 |
generate (consumer) | 此端点生成的内容类型,如 application/xml 或 application/json。 | 字符串 | |
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 | |
fileNameExtWhitelist (consumer (advanced)) | 以逗号分隔的文件扩展列表。具有这些扩展的上传将存储在本地。null 值或星号()将允许所有文件。 | 字符串 | |
HeaderFilterStrategy (advanced) | 使用自定义 HeaderFilterStrategy 将标头过滤到或从 Camel 消息过滤。 | HeaderFilterStrategy | |
platformHttpEngine (advanced) | 用于提供此端点请求的 HTTP 服务器引擎实施。 | PlatformHttpEngine |
49.3. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 platform-http 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-platform-http-starter</artifactId> </dependency>
组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.platform-http.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.platform-http.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.platform-http.enabled | 是否启用 platform-http 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.platform-http.engine | 为服务请求的 HTTP 服务器引擎实施。选项是 org.apache.camel.component.platform.http.spi.platformHttpEngine 类型。 | PlatformHttpEngine |
49.3.1. 实现反向代理
平台 HTTP 组件可以充当反向代理,在这种情况下,有些标头填充了 HTTP 请求请求行中收到的绝对 URL。这些标头特定于更精简的平台。
目前,这个功能只支持 camel-platform-http-vertx
组件中的 Vert.x。
第 50 章 quartz
仅支持消费者
Quartz 组件使用 Quartz Scheduler 2.x 提供已调度消息交付。每个端点代表不同的计时器(在 Quartz 术语中,一个 Trigger 和 JobDetail)。
Maven 用户需要将以下依赖项添加到其 pom.xml
中。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-quartz</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
50.1. URI 格式
quartz://timerName?options quartz://groupName/timerName?options quartz://groupName/timerName?cron=expression quartz://timerName?cron=expression
组件使用 CronTrigger
或 SimpleTrigger
。如果没有提供 cron 表达式,则组件将使用一个简单的触发器。如果没有提供 groupName
,则 quartz 组件将使用 Camel
组名称。
50.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
50.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
50.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
50.3. 组件选项
Quartz 组件支持 13 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
enableJmx (consumer) | 是否启用 Quartz JMX,它允许从 JMX 管理 Quartz 调度程序。这个选项是默认的 true。 | true | 布尔值 |
prefixInstanceName (consumer) | 是否使用 CamelContext 名称添加 Quartz Scheduler 实例名称。这默认是启用的,以便每个 CamelContext 默认使用自己的 Quartz 调度程序实例。您可以将这个选项设置为 false,以在多个 CamelContext 之间重复使用 Quartz 调度程序实例。 | true | 布尔值 |
prefixJobNameWithEndpointId (consumer) | 是否使用端点 ID 为 quartz 任务添加前缀。这个选项是默认的 false。 | false | 布尔值 |
properties (consumer) | 配置 Quartz 调度程序的属性。 | Map | |
propertiesFile (consumer) | 要从 classpath 加载的属性的文件名。 | 字符串 | |
propertiesRef (consumer) | 对现有属性或 map 的引用,用于在 registry 中查找,用于配置 quartz。 | 字符串 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
scheduler (advanced) | 要使用自定义配置的 Quartz 调度程序,而不是创建新的调度程序。 | scheduler | |
schedulerFactory (advanced) | 使用用于创建调度程序的自定义调度程序Factory。 | SchedulerFactory | |
autoStartScheduler (scheduler) | 调度程序是否应自动启动。这个选项是默认的 true。 | true | 布尔值 |
interruptJobsOnShutdown (scheduler) | 是否在关闭时中断作业,以强制调度程序更快地关闭并尝试中断任何正在运行的作业。如果启用此功能,则任何正在运行的作业都可能会因为中断而失败。当某个作业中断时,Camel 将标记交换以停止继续路由,并设置 java.util.concurrent.RejectedExecutionException,从而导致异常。因此请小心地使用它,因为它通常最好允许 Camel 作业安全完成和关闭。 | false | 布尔值 |
startDelayedSeconds (scheduler) | 启动 quartz 调度程序前等待的秒数。 | int |
50.4. 端点选项
Quartz 端点使用 URI 语法进行配置:
quartz:groupName/triggerName
使用以下路径和查询参数:
50.4.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
groupName (consumer) | 要使用的 quartz 组名称。组名称和触发器名称的组合应该是唯一的。 | Camel | 字符串 |
triggerName (consumer) | 必需 要使用的 quartz 触发器名称。组名称和触发器名称的组合应该是唯一的。 | 字符串 |
50.4.2. 查询参数(17 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
cron (consumer) | 指定定义何时触发的 cron 表达式。 | 字符串 | |
deleteJob (consumer) | 如果设置为 true,则在路由停止时触发器自动删除。否则,如果设为 false,它将保留在调度程序中。当设置为 false 时,它还意味着用户可以在 camel Uri 中重复使用预配置的触发器。只需确保名称匹配。请注意,您无法将 deleteJob 和 pauseJob 设置为 true。 | true | 布尔值 |
durableJob (consumer) | 作业是否在孤立后保留(没有触发器指向它)。 | false | 布尔值 |
pauseJob (consumer) | 如果设置为 true,则在路由停止时自动暂停触发器。否则,如果设为 false,它将保留在调度程序中。当设置为 false 时,它还意味着用户可以在 camel Uri 中重复使用预配置的触发器。只需确保名称匹配。请注意,您无法将 deleteJob 和 pauseJob 设置为 true。 | false | 布尔值 |
recoverableJob (consumer) | 如果遇到 'recovery' 或 'fail-over',则指示调度程序是否应该重新执行作业。 | false | 布尔值 |
stateful (consumer) | 使用 Quartz PersistJobDataAfterExecution 和 DisallowConcurrentExecution 而不是默认作业。 | false | 布尔值 |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
customCalendar (advanced) | 指定自定义日历以避免特定日期范围。 | 日历 | |
jobParameters (advanced) | 要在作业上配置附加选项。 | Map | |
prefixJobNameWithEndpointId (advanced) | 作业名称是否应该使用端点 ID 前缀。 | false | 布尔值 |
triggerParameters (advanced) | 在触发器上配置附加选项: | Map | |
usingFixedCamelContextName (advanced) | 如果为 true,JobDataMap 直接使用 CamelContext 名称来引用 CamelContext (如果为 false),JobDataMap 使用 CamelContext 管理名称,该名称可以在部署期间更改。 | false | 布尔值 |
autoStartScheduler (scheduler) | 调度程序是否应自动启动。 | true | 布尔值 |
startDelayedSeconds (scheduler) | 启动 quartz 调度程序前等待的秒数。 | int | |
triggerStartDelay (scheduler) | 如果调度程序已启动,我们希望触发器在当前时间后稍早启动,以确保在作业启动前完全启动端点。负值转换了过去的触发开始时间。 | 500 | long |
50.4.3. 配置 quartz.properties 文件
默认情况下,Qrtz 将在 classpath 的 org/quartz
目录中查找 quartz.properties
文件。如果您使用 WAR 部署,这意味着将 quartz.properties 放到 WEB-INF/classes/org/quartz
中。
但是,Camel Quartz 组件还允许您配置属性:
参数 | 默认值 | 类型 | 描述 |
---|---|---|---|
|
|
|
您可以配置 |
|
|
| 从 classpath 加载的属性的文件名 |
要做到这一点,您可以在 Spring XML 中配置它,如下所示
<bean id="quartz" class="org.apache.camel.component.quartz.QuartzComponent"> <property name="propertiesFile" value="com/mycompany/myquartz.properties"/> </bean>
50.5. 在 JMX 中启用 Quartz 调度程序
您需要配置 quartz 调度程序属性来启用 JMX。
这通常将选项 "org.quartz.scheduler.jmx.export"
设置为配置文件中的 真正
值。
这个选项默认为 true,除非明确禁用。
50.6. 启动 Quartz 调度程序
Quartz 组件提供了一个选项,使 Quartz 调度程序启动延迟,或者根本不自动启动。
这是一个示例:
<bean id="quartz" class="org.apache.camel.component.quartz.QuartzComponent"> <property name="startDelayedSeconds" value="5"/> </bean>
50.7. 集群
如果您在集群模式中使用 Quartz,如 JobStore
集群。然后,当节点停止/关闭时,Qrtz 组件不会暂停/删除触发器。https://access.redhat.com/documentation/zh-cn/red_hat_integration/2023.q2/html-single/camel_spring_boot_reference/index#csb-camel-quartz-component-starter这允许触发器在集群中的其他节点上运行。
在集群节点中运行时,不会进行检查来确保用于端点的唯一作业名称/组。
50.8. 消息标头
Camel 将 Quartz Execution Context 中的 getters 添加为标头值。以下标头会被添加:calendar
,fireTime
,jobDetail
,jobInstance
,jobRuntTime
,mergedJobDataMap
,nextFireTime
,previousFireTime
,refireCount
, result,
scheduledFireTime
,scheduler
,trigger
,triggerName
,triggerGroup
.
fireTime
标头包含触发交换时的 java.util.Date
。
50.9. 使用 Cron Triggers
quartz 支持 类似 Cron 的表达式,用于以方便格式指定计时器。您可以在 cron
URI 参数中使用这些表达式,但为了保留有效的 URI 编码,我们允许使用 +
而不是空格。
例如,以下命令会在 weekdays 上每五分钟从 12pm (noon)到 6pm 一次触发一条消息:
from("quartz://myGroup/myTimerName?cron=0+0/5+12-18+?+*+MON-FRI") .to("activemq:Totally.Rocks");
等同于使用 cron 表达式
0 0/5 12-18 ? * MON-FRI
下表显示了我们用来保留有效的 URI 语法的 URI 字符编码:
URI Character | Cron 字符 |
---|---|
| space |
50.10. 指定时区
Quartz 调度程序允许您为每个触发器配置时区。例如,要使用国家/地区时区,您可以执行以下操作:
quartz://groupName/timerName?cron=0+0/5+12-18+?+*+MON-FRI&trigger.timeZone=Europe/Stockholm
timeZone 值是 java.util.TimeZone
接受的值。
50.11. 配置不正确的说明
quartz 调度程序可以使用错误指令配置,以处理触发器的错误情况。您正在使用的 concrete 触发器类型将定义了一组额外的 MISFIRE_INSTRUCTION_XXX
常量,可以设置为此属性的值。
例如,将 simple 触发器配置为使用错误指令 4:
quartz://myGroup/myTimerName?trigger.repeatInterval=2000&trigger.misfireInstruction=4
同样,您可以使用其错误指令之一配置 cron 触发器:
quartz://myGroup/myTimerName?cron=0/2+*+*+*+*+?&trigger.misfireInstruction=2
simple 和 cron 触发器有以下不正确的指令代表:
50.11.1. SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW = 1 (default)
指示调度程序在出错的情况下,MutyTrigger 希望由调度程序触发。
这个指令通常只用于 'one-shot'(非重复)触发器。如果在带有重复计数 > 0 的触发器中使用,则相当于指令 MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT。
50.11.2. SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT = 2
指示调度程序在错误的情况下,SimpleTrigger 希望重新调度为"现在" (即使关联的 Calendar excludes 'now')。这会产生 Trigger 终止时间,因此如果 'now' 在 Trigger 结束时不会再次触发。
使用这个指令可让触发器"forget",启动时间并重复了它最初设置的重复计数(如果您因为一些原因希望告知原始值在一些时候存在)时才有问题。
50.11.3. SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT = 3
指示调度程序在错误的情况下,MutyTrigger 希望被重新调度为 'now'(即使关联的 Calendar excludes 'now'),如果还没有丢失任何触发,则它也会被重新调度。这会产生 Trigger 终止时间,因此如果 'now' 在 Trigger 结束时不会再次触发。
使用这个指令可让触发器"forget",并重复它最初被设置。相反,触发器的重复计数将更改为剩余的重复计数。这只是只有在出于某种原因想告知原始值在以后存在哪些原始值时才有问题。
如果所有未命中的重复时间,这个指令可能会导致 Trigger 在触发 'now' 后进入 'COMPLETE' 状态。
50.11.4. SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT = 4
指示调度程序在错误的情况下,MutyTrigger 希望在 'now' 后重新调度到下一个调度时间 - 如果还没有丢失任何关联的 Calendar,并将重复计数设置为它。
如果所有触发时间都丢失,则此指令可能会导致 Trigger 直接进入 'COMPLETE' 状态。
50.11.5. SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT = 5
指示调度程序在错误的情况下,SimpleTrigger 希望在 'now' 后重新调度到下一个调度时间 - 考虑任何关联的 Calendar,重复计数保持不变。
如果触发器的结束时间到达,这个指令可能会导致 Trigger 直接进入 'COMPLETE' 状态。
50.11.6. CronTrigger.MISFIRE_INSTRUCTION_FIRE_ONCE_NOW = 1 (default)
指示调度程序在异常情况时,C CronTrigger 现在希望由调度程序触发。
50.11.7. CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING = 2
指示调度程序在出错的情况下,CronTrigger 希望在当前时间后将其下次更新到调度中的下一次时间(不考虑任何关联的 Calendar,但现在不想触发它。
50.12. 使用 QuartzScheduledPollConsumerScheduler
Quartz 组件提供了一个轮询 Consumer 调度程序,它允许使用基于 cron 的调度来轮询消费者,如 File 和 FTP 用户。
例如,要使用基于 cron 的表达式每第 2 秒轮询一次文件,可将 Camel 路由定义为:
from("file:inbox?scheduler=quartz&scheduler.cron=0/2+*+*+*+*+?") .to("bean:process");
请注意,我们定义了 scheduler=quartz
,以指示 Camel 使用基于 Quartz 的调度程序。然后,我们使用 scheduler.xxx
选项来配置调度程序。Quartz 调度程序需要设置 cron 选项。
支持以下选项:
参数 | 默认值 | 类型 | 描述 |
---|---|---|---|
|
|
| 使用自定义 Quartz 调度程序。如果没有配置,则使用组件的共享调度程序。 |
|
|
| 必需 :定义用于触发轮询的 cron 表达式。 |
|
|
| 指定触发器 ID。如果没有提供,则生成并使用 UUID。 |
|
|
| 指定触发器组。 |
|
|
| 用于 CRON 触发器的时区。 |
请记住,从端点 URI 配置这些选项必须以 调度程序
作为前缀。
例如,配置触发器 id 和组:
from("file:inbox?scheduler=quartz&scheduler.cron=0/2+*+*+*+*+?&scheduler.triggerId=myId&scheduler.triggerGroup=myGroup") .to("bean:process");
Spring 中还有一个 CRON 调度程序,因此您也可以使用以下内容:
from("file:inbox?scheduler=spring&scheduler.cron=0/2+*+*+*+*+?") .to("bean:process");
50.13. Cron 组件支持
Quartz 组件可用作 Camel Cron 组件的实现。
Maven 用户需要将以下额外依赖项添加到其 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-cron</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
然后,用户可以使用 cron 组件而不是 quartz 组件,如以下路由中所示:
from("cron://name?schedule=0+0/5+12-18+?+*+MON-FRI") .to("activemq:Totally.Rocks");
50.14. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 quartz 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-quartz-starter</artifactId> </dependency>
组件支持 14 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.quartz.auto-start-scheduler | 调度程序是否应自动启动。这个选项是默认的 true。 | true | 布尔值 |
camel.component.quartz.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.quartz.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.quartz.enable-jmx | 是否启用 Quartz JMX,它允许从 JMX 管理 Quartz 调度程序。这个选项是默认的 true。 | true | 布尔值 |
camel.component.quartz.enabled | 是否启用 quartz 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.quartz.interrupt-jobs-on-shutdown | 是否在关闭时中断作业,以强制调度程序更快地关闭并尝试中断任何正在运行的作业。如果启用此功能,则任何正在运行的作业都可能会因为中断而失败。当某个作业中断时,Camel 将标记交换以停止继续路由,并设置 java.util.concurrent.RejectedExecutionException,从而导致异常。因此请小心地使用它,因为它通常最好允许 Camel 作业安全完成和关闭。 | false | 布尔值 |
camel.component.quartz.prefix-instance-name | 是否使用 CamelContext 名称添加 Quartz Scheduler 实例名称。这默认是启用的,以便每个 CamelContext 默认使用自己的 Quartz 调度程序实例。您可以将这个选项设置为 false,以在多个 CamelContext 之间重复使用 Quartz 调度程序实例。 | true | 布尔值 |
camel.component.quartz.prefix-job-name-with-endpoint-id | 是否使用端点 ID 为 quartz 任务添加前缀。这个选项是默认的 false。 | false | 布尔值 |
camel.component.quartz.properties | 配置 Quartz 调度程序的属性。 | Map | |
camel.component.quartz.properties-file | 要从 classpath 加载的属性的文件名。 | 字符串 | |
camel.component.quartz.properties-ref | 对现有属性或 map 的引用,用于在 registry 中查找,用于配置 quartz。 | 字符串 | |
camel.component.quartz.scheduler | 要使用自定义配置的 Quartz 调度程序,而不是创建新的调度程序。选项是 org.quartz.Scheduler 类型。 | scheduler | |
camel.component.quartz.scheduler-factory | 使用用于创建调度程序的自定义调度程序Factory。选项是 org.quartz.SchedulerFactory 类型。 | SchedulerFactory | |
camel.component.quartz.start-delayed-seconds | 启动 quartz 调度程序前等待的秒数。 | 整数 |
第 51 章 Ref
支持生成者和消费者
Ref 组件用于查找 Registry 中绑定的现有端点。
51.1. URI 格式
ref:someName[?options]
其中 someName 是 Registry 中的端点名称(通常是 Spring registry)。如果您使用 Spring registry,someName
是 Spring registry 中的端点的 bean ID。
51.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
51.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
51.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
51.3. 组件选项
Ref 组件支持 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 | 布尔值 |
51.4. 端点选项
Ref 端点使用 URI 语法进行配置:
ref:name
使用以下路径和查询参数:
51.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
name (common) | 要在 registry 中查找的端点名称。 | 字符串 |
51.4.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 | 布尔值 |
51.5. 运行时查找
当您需要动态发现 Registry 中的端点时,可以使用此组件,您可以在其中在运行时计算 URI。然后您可以使用以下代码查找端点:
// lookup the endpoint String myEndpointRef = "bigspenderOrder"; Endpoint endpoint = context.getEndpoint("ref:" + myEndpointRef); Producer producer = endpoint.createProducer(); Exchange exchange = producer.createExchange(); exchange.getIn().setBody(payloadToSend); // send the exchange producer.process(exchange);
并且您可以在 Registry 中定义端点列表,例如:
<camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring"> <endpoint id="normalOrder" uri="activemq:order.slow"/> <endpoint id="bigspenderOrder" uri="activemq:order.high"/> </camelContext>
51.6. 示例
在以下示例中,我们在 URI 中使用 ref:
来引用带有 spring ID ( endpoint2)的端点
:
当然,您可以使用 ref
属性:
<to uri="ref:endpoint2"/>
这是编写它的更多常用方法。
51.7. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 ref 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-ref-starter</artifactId> </dependency>
组件支持 4 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.ref.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.ref.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.ref.enabled | 是否启用 ref 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.ref.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 52 章 REST
支持生成者和消费者
REST 组件允许使用 Rest DSL 和插件到其他 Camel 组件作为 REST 传输来定义 REST 端点(consumer)。
其余组件也可以用作客户端(producer)来调用 REST 服务。
52.1. URI 格式
rest://method:path[:uriTemplate]?[options]
52.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
52.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
52.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
52.3. 组件选项
REST 组件支持 8 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
consumerComponentName (consumer) | 用于(consumer) REST 传输的 Camel Rest 组件,如 jetty、servlet、undertow。如果没有明确配置组件,则 Camel 将查找,如果有一个与 Rest DSL 集成的 Camel 组件,或者 org.apache.camel.spi.RestConsumerFactory 在 registry 中注册。如果找到其中任一个,则会使用它。 | 字符串 | |
apiDoc (producer) | 要使用的 swagger api doc 资源。默认情况下,资源从 classpath 加载,且必须采用 JSON 格式。 | 字符串 | |
componentName (producer) | 弃用了 用于(producer) REST 传输的 Camel Rest 组件,如 http, undertow。如果没有明确配置组件,则 Camel 将查找,如果有一个与 Rest DSL 集成的 Camel 组件,或者 org.apache.camel.spi.RestProducerFactory 在 registry 中注册。如果找到其中任一个,则会使用它。 | 字符串 | |
host (producer) | 要使用的 HTTP 服务的主机和端口(在 swagger 模式中覆盖主机)。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
producerComponentName (producer) | 用于(producer) REST 传输的 Camel Rest 组件,如 http, undertow。如果没有明确配置组件,则 Camel 将查找,如果有一个与 Rest DSL 集成的 Camel 组件,或者 org.apache.camel.spi.RestProducerFactory 在 registry 中注册。如果找到其中任一个,则会使用它。 | 字符串 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
52.4. 端点选项
REST 端点使用 URI 语法进行配置:
rest:method:path:uriTemplate
使用以下路径和查询参数:
52.4.1. 路径参数(3 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
method (common) | 要使用 的必要 HTTP 方法。 Enum 值:
| 字符串 | |
path (common) | 必需 基本路径。 | 字符串 | |
uritemplate (common) | uri 模板。 | 字符串 |
52.4.2. 查询参数 (16 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
consumed (common) | 介质类型,例如: 'text/xml' 或 'application/json' this REST 服务接受。默认情况下,我们接受所有类型。 | 字符串 | |
inType (common) | 将传入的 POJO 绑定类型声明为 FQN 类名称。 | 字符串 | |
outType (common) | 将传出的 POJO 绑定类型声明为 FQN 类名称。 | 字符串 | |
generate (common) | 介质类型,如: 'text/xml' 或 'application/json' this REST 服务返回。 | 字符串 | |
routeId (common) | 此 REST 服务创建的路由名称。 | 字符串 | |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
consumerComponentName (consumer) | 用于(consumer) REST 传输的 Camel Rest 组件,如 jetty、servlet、undertow。如果没有明确配置组件,则 Camel 将查找,如果有一个与 Rest DSL 集成的 Camel 组件,或者 org.apache.camel.spi.RestConsumerFactory 在 registry 中注册。如果找到其中任一个,则会使用它。 | 字符串 | |
description (consumer) | 记录此 REST 服务的人工描述。 | 字符串 | |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
apiDoc (producer) | 要使用的 openapi api doc 资源。默认情况下,资源从 classpath 加载,且必须采用 JSON 格式。 | 字符串 | |
bindingMode (producer) | 为制作者配置绑定模式。如果设置为 'off' 以外的任何内容,则制作者会尝试将传入消息的正文从 inType 转换为 json 或 xml,并将响应从 json 或 xml 转换为 outType。 Enum 值:
| RestBindingMode | |
host (producer) | 要使用的 HTTP 服务的主机和端口(在 openapi 模式中覆盖主机)。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
producerComponentName (producer) | 用于(producer) REST 传输的 Camel Rest 组件,如 http, undertow。如果没有明确配置组件,则 Camel 将查找,如果有一个与 Rest DSL 集成的 Camel 组件,或者 org.apache.camel.spi.RestProducerFactory 在 registry 中注册。如果找到其中任一个,则会使用它。 | 字符串 | |
queryParameters (producer) | 要调用的 HTTP 服务的查询参数。查询参数可以包含多个由 ampersand 分开的参数,如 foo=123&bar=456。 | 字符串 |
52.5. 支持的其余组件
以下组件支持其余消费者(Rest DSL):
- camel-servlet
以下组件支持剩余的制作者:
- camel-http
52.6. 路径和 uriTemplate 语法
path 和 uriTemplate 选项使用 REST 语法来定义,您可以使用参数定义 REST 上下文路径。
如果没有配置 uriTemplate,则 path 选项的工作方式相同。如果您只配置路径或配置这两个选项,这无关紧要。虽然同时配置路径和 uriTemplate 是 REST 的更常见做法。
以下是只使用路径的 Camel 路由
from("rest:get:hello") .transform().constant("Bye World");
以下路由使用参数,该参数映射到带有键"主题"的 Camel 标头。
from("rest:get:hello/{me}") .transform().simple("Bye ${header.me}");
以下示例将基本路径配置为"hello",然后使用 uriTemplates 配置两个 REST 服务。
from("rest:get:hello:/{me}") .transform().simple("Hi ${header.me}"); from("rest:get:hello:/french/{me}") .transform().simple("Bonjour ${header.me}");
52.7. REST 生成者示例
您可以使用其余组件调用 REST 服务,与其他 Camel 组件一样。
例如,要使用 hello/{me}
调用 REST 服务,您可以这样做
from("direct:start") .to("rest:get:hello/{me}");
然后,动态值 {me}
会映射到具有相同名称的 Camel 消息。要调用此 REST 服务,您可以发送空消息正文和一个标头,如下所示:
template.sendBodyAndHeader("direct:start", null, "me", "Donald Duck");
Rest producer 需要知道 REST 服务的主机名和端口,您可以使用 host 选项进行配置,如下所示:
from("direct:start") .to("rest:get:hello/{me}?host=myserver:8080/foo");
您可以在 restConfiguration
上配置主机,而不是使用 host 选项,如下所示:
restConfiguration().host("myserver:8080/foo"); from("direct:start") .to("rest:get:hello/{me}");
您可以使用 producerComponent
来选择将哪些 Camel 组件用作 HTTP 客户端,例如使用 http :
restConfiguration().host("myserver:8080/foo").producerComponent("http"); from("direct:start") .to("rest:get:hello/{me}");
52.8. REST 生成者绑定
REST 生成者支持使用 JSon 或 XML (如 rest-dsl )进行绑定。
例如,要将 jetty 与 json 绑定模式一起使用,您可以在其余配置中配置它:
restConfiguration().component("jetty").host("localhost").port(8080).bindingMode(RestBindingMode.json); from("direct:start") .to("rest:post:user");
然后,当使用 rest producer 调用 REST 服务时,它将在调用 REST 服务前自动将任何 POJO 绑定到 json:
UserPojo user = new UserPojo(); user.setId(123); user.setName("Donald Duck"); template.sendBody("direct:start", user);
在上例中,我们发送 POJO 实例 UserPojo
作为消息正文。由于我们在其余配置中打开了 JSon 绑定,因此在调用 REST 服务前,POJO 将从 POJO 变为 JSon。
但是,如果您还要为响应消息执行绑定(例如 REST 服务作为响应发送),则需要配置 outType
选项,以指定 POJO 的类名称,以便从 JSon 到 JSon 到 POJO。
例如,如果 REST 服务返回一个 JSon 有效负载,它绑定到 com.foo.MyResponsePojo
,您可以配置它,如下所示:
restConfiguration().component("jetty").host("localhost").port(8080).bindingMode(RestBindingMode.json); from("direct:start") .to("rest:post:user?outType=com.foo.MyResponsePojo");
如果您希望 POJO 绑定对于调用 REST 服务的响应消息,您必须配置 outType
选项。
52.9. 更多示例
请参阅 Rest DSL,其提供了更多示例,以及如何使用 Rest DSL 以互动方式定义它们。
Apache Camel 发行版中有一个 camel-example-servlet-rest-tomcat 示例,它演示了如何使用带有 SERVLET 的 Rest DSL 作为可在 Apache Tomcat 上部署或类似的 Web 容器的传输。
52.10. Spring Boot Auto-Configuration
当在 Spring Boot 中使用其余时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-rest-starter</artifactId> </dependency>
组件支持 12 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.rest-api.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.rest-api.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.rest-api.enabled | 是否启用 rest-api 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.rest.api-doc | 要使用的 swagger api doc 资源。默认情况下,资源从 classpath 加载,且必须采用 JSON 格式。 | 字符串 | |
camel.component.rest.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.rest.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.rest.consumer-component-name | 用于(consumer) REST 传输的 Camel Rest 组件,如 jetty、servlet、undertow。如果没有明确配置组件,则 Camel 将查找,如果有一个与 Rest DSL 集成的 Camel 组件,或者 org.apache.camel.spi.RestConsumerFactory 在 registry 中注册。如果找到其中任一个,则会使用它。 | 字符串 | |
camel.component.rest.enabled | 是否启用其余组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.rest.host | 要使用的 HTTP 服务的主机和端口(在 swagger 模式中覆盖主机)。 | 字符串 | |
camel.component.rest.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.rest.producer-component-name | 用于(producer) REST 传输的 Camel Rest 组件,如 http, undertow。如果没有明确配置组件,则 Camel 将查找,如果有一个与 Rest DSL 集成的 Camel 组件,或者 org.apache.camel.spi.RestProducerFactory 在 registry 中注册。如果找到其中任一个,则会使用它。 | 字符串 | |
camel.component.rest.component-name | 弃用了 用于(producer) REST 传输的 Camel Rest 组件,如 http, undertow。如果没有明确配置组件,则 Camel 将查找,如果有一个与 Rest DSL 集成的 Camel 组件,或者 org.apache.camel.spi.RestProducerFactory 在 registry 中注册。如果找到其中任一个,则会使用它。 | 字符串 |
第 53 章 Saga
仅支持生成者
Saga 组件提供了一个网桥,用于使用 Saga EIP 在路由中执行自定义操作。
组件应该用于高级任务,如确定完成或组合了 Saga,并将 completionMode 设置为 MANUAL。
有关常见情况下使用 sagas 的帮助信息,请参阅 Saga EIP 文档。
53.1. URI 格式
saga:action
53.2. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
53.2.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
53.2.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
53.3. 组件选项
Saga 组件支持 2 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
53.4. 端点选项
Saga 端点使用 URI 语法进行配置:
saga:action
使用以下路径和查询参数:
53.4.1. 路径参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
action (producer) | 要执行 的必要 操作(完成或编译)。 Enum 值:
| SagaEndpointAction |
53.4.2. 查询参数(1 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
53.5. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 saga 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-saga-starter</artifactId> </dependency>
组件支持 3 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.saga.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.saga.enabled | 是否启用 saga 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.saga.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
第 54 章 Salesforce
支持生成者和消费者
此组件支持生成者和消费者端点,以便使用 Java DTOs 与 Salesforce 进行通信。
存在一个生成这些 DTO 的companion maven 插件 Camel Salesforce 插件(请参阅以下内容)。
Maven 用户必须在其 pom.xml
中为这个组件添加以下依赖项:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-salesforce</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
默认情况下,camel-salesforce-maven-plugin
使用 TLSv1.3 与 salesforce 交互。TLS 版本可在插件上配置。FIPS 用户可以配置属性 sslContextParameters.secureSocketProtocol。
要使用 maven-plugin
,您必须将以下依赖项添加到 pom.xml
文件中。
<plugin> <groupId>org.apache.camel.maven</groupId> <artifactId>camel-salesforce-maven-plugin</artifactId> <version>${camel-community.version}</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <clientId>${camelSalesforce.clientId}</clientId> <clientSecret>${camelSalesforce.clientSecret}</clientSecret> <userName>${camelSalesforce.userName}</userName> <password>${camelSalesforce.password}</password> <sslContextParameters> <secureSocketProtocol>TLSv1.2</secureSocketProtocol> </sslContextParameters> <includes> <include>Contact</include> </includes> </configuration> </execution> </executions> </plugin>
Developers wishing to contribute to the component are instructed to look at the link:https://github.com/apache/camel/tree/main/components/camel-salesforce/camel-salesforce-component/README.md[README.md] file on instructions on how to get started and setup your environment for running integration tests.
54.1. 配置选项
Camel 组件在两个独立级别上配置:
- 组件级别
- 端点级别
54.1.1. 配置组件选项
组件级别是最高级别,它包含端点继承的常规配置。例如,一个组件可能具有安全设置、用于身份验证的凭证、用于网络连接的 url 等等。
某些组件只有几个选项,其他组件可能会有许多选项。由于组件通常已配置了常用的默认值,因此通常只需要在组件上配置几个选项,或者根本不需要配置任何选项。
可以在配置文件(application.properties|yaml)中使用 组件 DSL 配置组件,也可直接使用 Java 代码完成。
54.1.2. 配置端点选项
您发现自己在端点上配置了一个,因为端点通常有许多选项,允许您配置您需要的端点。这些选项被分别分类为:端点作为消费者(来自)被使用,和作为生成者(到)使用,或被两者使用。
配置端点通常在端点 URI 中作为路径和查询参数直接进行。您还可以使用 Endpoint DSL 作为配置端点的安全方法。
在配置选项时,最好使用 Property Placeholders,它不允许硬编码 URL、端口号、敏感信息和其他设置。换句话说,占位符允许从您的代码外部配置,并提供更多灵活性和重复使用。
以下两节列出了所有选项,首为于组件,后跟端点。
54.2. 组件选项
Salesforce 组件支持 90 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
apexMethod (common) | APEX 方法名称。 | 字符串 | |
apexQueryParams (common) | 查询 APEX 方法的参数。 | Map | |
apiVersion (common) | Salesforce API 版本。 | 53.0 | 字符串 |
backoffIncrement (common) | backoff 间隔递增流连接重启尝试尝试超过 CometD 自动连接。 | 1000 | long |
batchId (common) | 批量 API 批处理 ID。 | 字符串 | |
contentType (common) | 批量 API 内容类型,一个 XML, CSV, ZIP_XML, ZIP_CSV。 Enum 值:
| ContentType | |
defaultReplayId (common) | 如果在 initialReplayIdMap 中没有找到任何值,则默认 replayId 设置。 | -1 | Long |
fallBackReplayId (common) | ReplayId 在 Invalid Replay Id 响应后回退到。 | -1 | Long |
格式 (common) | 用于 Salesforce API 调用的有效负载格式(JSON 或 XML)默认为 JSON。自 Camel 3.12 起,此选项仅适用于 Raw 操作。 Enum 值:
| PayloadFormat | |
httpClient (common) | 用于连接到 Salesforce 的自定义 Jetty Http 客户端。 | SalesforceHttpClient | |
httpClientConnectionTimeout (common) | 连接到 Salesforce 服务器时 HttpClient 使用的连接超时。 | 60000 | long |
httpClientIdleTimeout (common) | 在等待 Salesforce 服务器响应时,HttpClient 使用的超时。 | 10000 | long |
httpMaxContentLength (common) | HTTP 响应的最大内容长度。 | 整数 | |
httpRequestBufferSize (common) | HTTP 请求缓冲区大小。对于大型 SOQL 查询,可能需要增加。 | 8192 | 整数 |
includeDetails (common) | 在 Salesforce1 Analytics 报告中包含详细信息,默认为 false。 | 布尔值 | |
initialReplayIdMap (common) | 重播 ID 以从每个频道名称开始。 | Map | |
InstanceID (common) | Salesforce1 分析报告执行实例 ID。 | 字符串 | |
jobId (common) | 批量 API 作业 ID。 | 字符串 | |
limit (common) | 对返回的记录数量的限制。适用于某些 API,请参阅 Salesforce 文档。 | 整数 | |
Locator (common) | Salesforce Bulk 2.0 API 提供的检测程序,用于获取查询任务的结果。 | 字符串 | |
maxBackoff (common) | 流连接重启尝试超过 CometD 自动连接的最大 backoff 间隔。 | 30000 | long |
maxRecords (common) | 为 Bulk 2.0 Query 检索每个结果集合的最大记录数。请求仍受到大小限制的影响。如果您正在使用大量查询结果,您可能会在收到来自 Salesforce 的所有数据前遇到超时。要防止超时,请在 maxRecords 参数中指定客户端希望接收的最大记录数。这会将结果分成较小的集合,使用这个值作为最大大小。 | 整数 | |
notFoundBehaviour (common) | 设置从 Salesforce API 接收的 404 not found 状态的行为。应将正文设置为 NULL NotFoundBehaviourHQNULL,或在交换 NotFoundBehaviour EXCEPTION 上发出一个异常信号 - 默认。 Enum 值:
| 例外 | NotFoundBehaviour |
notifyForFields (common) | 通知字段,选项为 ALL, REFERENCED, SELECT, WHERE。 Enum 值:
| NotifyForFieldsEnum | |
notifyForOperationCreate (common) | 通知创建操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
notifyForOperationDelete (common) | 通知删除操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
notifyForOperations (common) | 通知操作,选项为 ALL, CREATE, EXTENDED, UPDATE (API 版本 29.0)。 Enum 值:
| NotifyForOperationsEnum | |
notifyForOperationUndelete (common) | 通知未删除操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
notifyForOperationUpdate (common) | 通知更新操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
ObjectMapper (common) | 自定义 Jackson ObjectMapper,以便在序列化/解码 Salesforce 对象时使用。 | ObjectMapper | |
软件包 (通用) | 在什么软件包中,生成的 DTO 类。通常,类将使用 camel-salesforce-maven-plugin 生成。如果使用生成的 DTOs,在 parameters/header 值中使用短 SObject 名称的好处,则设置它。可以使用逗号分隔多个软件包。 | 字符串 | |
pkChunking (common) | 使用 PK Chunking。仅用于原始 Bulk API。如果需要,批量 2.0 API 自动执行 PK 块。 | 布尔值 | |
pkChunkingChunkSize (common) | 用于 PK Chunking 的块大小。如果未指定,则 Salesforce 默认为 100,000。最大大小为 250,000。 | 整数 | |
pkChunkingParent (common) | 当您为共享对象上的查询启用 PK 块时,请指定父对象。块基于父对象的记录,而不是共享的对象的记录。例如,在查询 AccountShare 时,将 Account 指定为父对象。只要支持父对象,支持 PK 块来共享对象。 | 字符串 | |
pkChunkingStartRow (common) | 指定用作第一个块的下限 15 个字符或 18 个字符记录 ID。在重启批处理之间失败的作业时,请使用此参数指定起始 ID。 | 字符串 | |
queryLocator (common) | 当查询结果超过单个调用中检索的记录时,查询 Locator 以供使用。在后续调用中使用这个值来检索其他记录。 | 字符串 | |
rawPayload (common) | 在请求和响应中使用原始有效负载字符串(根据格式 JSON 或 XML),而不是 DTOs,默认为 false。 | false | 布尔值 |
reportId (common) | Salesforce1 分析报告 Id. | 字符串 | |
reportMetadata (common) | Salesforce1 分析报告元数据进行过滤。 | ReportMetadata | |
resultId (common) | 批量 API 结果 ID。 | 字符串 | |
sObjectBlobFieldName (common) | SObject blob 字段名称。 | 字符串 | |
sObjectClass (common) | 完全限定的 SObject 类名称,通常使用 camel-salesforce-maven-plugin 生成。 | 字符串 | |
sObjectFields (common) | 要检索的 SObject 字段。 | 字符串 | |
sObjectId (common) | API 需要 SObject ID。 | 字符串 | |
sObjectIdName (common) | SObject 外部 ID 字段名称。 | 字符串 | |
sObjectIdValue (common) | SObject 外部 ID 字段值。 | 字符串 | |
sObjectName (common) | API 需要或支持 SObject 名称。 | 字符串 | |
sObjectQuery (common) | Salesforce SOQL 查询字符串。 | 字符串 | |
sObjectSearch (common) | Salesforce SOSL 搜索字符串。 | 字符串 | |
updateTopic (common) | 在使用流 API 时是否更新现有的 Push 主题,默认为 false。 | false | 布尔值 |
config (common (advanced)) | 全局端点配置 - 用于设置所有端点通用的值。 | SalesforceEndpointConfig | |
httpClientProperties (common (advanced)) | 用于设置可以在底层 HTTP 客户端上配置的任何属性。查看 SalesforceHttpClient 和 Jetty HttpClient 的属性,适用于所有可用选项。 | Map | |
longPollingTransportProperties (common (advanced)) | 用于设置流 api 使用的 BayeuxClient (CometD)使用的 LongPollingTransport 上配置的任何属性。 | Map | |
workerPoolMaxSize (common (advanced)) | 用于处理 HTTP 响应的线程池的最大大小。 | 20 | int |
workerPoolSize (common (advanced)) | 用于处理 HTTP 响应的线程池大小。 | 10 | int |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
allOrNone (producer) | 复合 API 选项,以指示在是否有成功时回滚所有记录。 | false | 布尔值 |
apexUrl (producer) | APEX 方法 URL。 | 字符串 | |
compositeMethod (producer) | 复合(原始)方法。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
rawHttpHeaders (producer) | 以逗号分隔的消息标头列表,以作为 Raw 操作的 HTTP 参数。 | 字符串 | |
rawMethod (producer) | 用于 Raw 操作的 HTTP 方法。 | 字符串 | |
rawPath (producer) | 域名后面的端点 URL 部分。例如,'/services/data/v52.0/sobjects/Account/'。 | 字符串 | |
rawQueryParameters (producer) | 以逗号分隔的消息标头列表,以作为 Raw 操作的查询参数。不要 URL-encode 值,因为会自动完成此操作。 | 字符串 | |
autowiredEnabled (advanced) | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
httpProxyExcludedAddresses (proxy) | 不应该使用 HTTP 代理服务器的地址列表。 | Set | |
httpProxyHost (proxy) | 要使用的 HTTP 代理服务器的主机名。 | 字符串 | |
httpProxyIncludedAddresses (proxy) | 应使用 HTTP 代理服务器的地址列表。 | Set | |
httpProxyPort (proxy) | 要使用的 HTTP 代理服务器的端口号。 | 整数 | |
httpProxySocks4 (proxy) | 如果设置为 true,请将 HTTP 代理配置为用作 SOCKS4 代理。 | false | 布尔值 |
authenticationType (security) | 要使用显式验证方法,USERNAME_PASSWORD、REFRESH_TOKEN 或 JWT 之一。Salesforce 组件可以自动确定要从属性集中使用的身份验证方法,设置此属性以消除任何不确定性。 Enum 值:
| AuthenticationType | |
clientId (security) | 必需 在 Salesforce 实例设置中配置的连接应用程序的 OAuth 消费者密钥。通常,需要配置一个连接的应用程序,但可以通过安装软件包来提供。 | 字符串 | |
clientSecret (security) | Salesforce 实例设置中配置的连接应用程序的 OAuth Consumer Secret。 | 字符串 | |
httpProxyAuthUri (security) | 对于 HTTP 代理服务器的身份验证,需要匹配代理服务器的 URI,以便 httpProxyUsername 和 httpProxyPassword 用于身份验证。 | 字符串 | |
httpProxyPassword (security) | 用于向 HTTP 代理服务器进行身份验证的密码。 | 字符串 | |
httpProxyRealm (security) | 代理服务器的域,用于针对 HTTP 代理服务器的抢占基本/目标身份验证方法。 | 字符串 | |
httpProxySecure (security) | 如果设置为 false,在访问 HTTP 代理时禁用使用 TLS。 | true | 布尔值 |
httpProxyUseDigestAuth (security) | 如果在对 HTTP 代理进行身份验证时使用 true Digest 身份验证,否则将使用基本授权方法。 | false | 布尔值 |
httpProxyUsername (security) | 用于向 HTTP 代理服务器进行身份验证的用户名。 | 字符串 | |
instanceUrl (security) | 身份验证后使用的 Salesforce 实例的 URL,默认情况下从 Salesforce 身份验证成功接收到。 | 字符串 | |
JWTAudience (security) | 使用 OAuth JWT 流时用于 Audience 声明(aud)的值。如果没有设置,则使用登录 URL,在大多数情况下都适合。 | 字符串 | |
keystore (security) | 在 OAuth JWT 流中使用的密钥存储参数。KeyStore 应该仅包含一个带有私钥和证书的条目。Salesforce 不会验证证书链,因此这容易是自签名证书。确保将证书上传到对应的连接的应用程序。 | KeyStoreParameters | |
lazyLogin (security) | 如果设置为 true 可防止组件在组件开始时向 Salesforce 进行身份验证。您通常会将其设置为 (默认)false 并早期进行身份验证,并立即了解任何身份验证问题。 | false | 布尔值 |
loginConfig (security) | 所有嵌套 Bean 中的身份验证配置,所有的属性也可以直接在组件上设置。 | SalesforceLoginConfig | |
loginUrl (security) | 用于身份验证的 Salesforce 实例的 所需 URL,默认为 https://login.salesforce.com。 | 字符串 | |
密码 (安全) | OAuth 流中使用的密码,以获取访问令牌的访问权限。使用密码 OAuth 流很容易入门,但通常要避免它的安全性,这比其它流安全。如果使用,请确保将安全令牌附加到密码的末尾。 | 字符串 | |
refreshToken (security) | 刷新令牌已在刷新令牌 OAuth 流中获取。一个需要设置 Web 应用并配置回调 URL 来接收刷新令牌,或使用 https://login.salesforce.com/services/oauth2/success 或 https://test.salesforce.com/services/oauth2/success 中的内置回调进行配置,然后在流末尾从 URL 撤销 refresh_token。请注意,在开发机构 Salesforce 中,允许在 localhost 上托管回调 Web 应用程序。 | 字符串 | |
sslContextParameters (security) | 要使用的 SSL 参数,请参阅 SSLContextParameters 类以了解所有可用选项。 | SSLContextParameters | |
useGlobalSslContextParameters (security) | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
userName (security) | OAuth 流中使用的用户名,以获取访问令牌的访问权限。使用密码 OAuth 流很容易入门,但通常要避免它的安全性,这比其它流安全。 | 字符串 |
54.3. 端点选项
Salesforce 端点使用 URI 语法进行配置:
salesforce:operationName:topicName
使用以下路径和查询参数:
54.3.1. 路径参数(2 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
operationName (producer) | 要使用的操作。 Enum 值:
| OperationName | |
topicName (consumer) | 要使用的主题/频道的名称。 | 字符串 |
54.3.2. 查询参数(57 参数)
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
apexMethod (common) | APEX 方法名称。 | 字符串 | |
apexQueryParams (common) | 查询 APEX 方法的参数。 | Map | |
apiVersion (common) | Salesforce API 版本。 | 53.0 | 字符串 |
backoffIncrement (common) | backoff 间隔递增流连接重启尝试尝试超过 CometD 自动连接。 | 1000 | long |
batchId (common) | 批量 API 批处理 ID。 | 字符串 | |
contentType (common) | 批量 API 内容类型,一个 XML, CSV, ZIP_XML, ZIP_CSV。 Enum 值:
| ContentType | |
defaultReplayId (common) | 如果在 initialReplayIdMap 中没有找到任何值,则默认 replayId 设置。 | -1 | Long |
fallBackReplayId (common) | ReplayId 在 Invalid Replay Id 响应后回退到。 | -1 | Long |
格式 (common) | 用于 Salesforce API 调用的有效负载格式(JSON 或 XML)默认为 JSON。自 Camel 3.12 起,此选项仅适用于 Raw 操作。 Enum 值:
| PayloadFormat | |
httpClient (common) | 用于连接到 Salesforce 的自定义 Jetty Http 客户端。 | SalesforceHttpClient | |
includeDetails (common) | 在 Salesforce1 Analytics 报告中包含详细信息,默认为 false。 | 布尔值 | |
initialReplayIdMap (common) | 重播 ID 以从每个频道名称开始。 | Map | |
InstanceID (common) | Salesforce1 分析报告执行实例 ID。 | 字符串 | |
jobId (common) | 批量 API 作业 ID。 | 字符串 | |
limit (common) | 对返回的记录数量的限制。适用于某些 API,请参阅 Salesforce 文档。 | 整数 | |
Locator (common) | Salesforce Bulk 2.0 API 提供的检测程序,用于获取查询任务的结果。 | 字符串 | |
maxBackoff (common) | 流连接重启尝试超过 CometD 自动连接的最大 backoff 间隔。 | 30000 | long |
maxRecords (common) | 为 Bulk 2.0 Query 检索每个结果集合的最大记录数。请求仍受到大小限制的影响。如果您正在使用大量查询结果,您可能会在收到来自 Salesforce 的所有数据前遇到超时。要防止超时,请在 maxRecords 参数中指定客户端希望接收的最大记录数。这会将结果分成较小的集合,使用这个值作为最大大小。 | 整数 | |
notFoundBehaviour (common) | 设置从 Salesforce API 接收的 404 not found 状态的行为。应将正文设置为 NULL NotFoundBehaviourHQNULL,或在交换 NotFoundBehaviour EXCEPTION 上发出一个异常信号 - 默认。 Enum 值:
| 例外 | NotFoundBehaviour |
notifyForFields (common) | 通知字段,选项为 ALL, REFERENCED, SELECT, WHERE。 Enum 值:
| NotifyForFieldsEnum | |
notifyForOperationCreate (common) | 通知创建操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
notifyForOperationDelete (common) | 通知删除操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
notifyForOperations (common) | 通知操作,选项为 ALL, CREATE, EXTENDED, UPDATE (API 版本 29.0)。 Enum 值:
| NotifyForOperationsEnum | |
notifyForOperationUndelete (common) | 通知未删除操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
notifyForOperationUpdate (common) | 通知更新操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
ObjectMapper (common) | 自定义 Jackson ObjectMapper,以便在序列化/解码 Salesforce 对象时使用。 | ObjectMapper | |
pkChunking (common) | 使用 PK Chunking。仅用于原始 Bulk API。如果需要,批量 2.0 API 自动执行 PK 块。 | 布尔值 | |
pkChunkingChunkSize (common) | 用于 PK Chunking 的块大小。如果未指定,则 Salesforce 默认为 100,000。最大大小为 250,000。 | 整数 | |
pkChunkingParent (common) | 当您为共享对象上的查询启用 PK 块时,请指定父对象。块基于父对象的记录,而不是共享的对象的记录。例如,在查询 AccountShare 时,将 Account 指定为父对象。只要支持父对象,支持 PK 块来共享对象。 | 字符串 | |
pkChunkingStartRow (common) | 指定用作第一个块的下限 15 个字符或 18 个字符记录 ID。在重启批处理之间失败的作业时,请使用此参数指定起始 ID。 | 字符串 | |
queryLocator (common) | 当查询结果超过单个调用中检索的记录时,查询 Locator 以供使用。在后续调用中使用这个值来检索其他记录。 | 字符串 | |
rawPayload (common) | 在请求和响应中使用原始有效负载字符串(根据格式 JSON 或 XML),而不是 DTOs,默认为 false。 | false | 布尔值 |
reportId (common) | Salesforce1 分析报告 Id. | 字符串 | |
reportMetadata (common) | Salesforce1 分析报告元数据进行过滤。 | ReportMetadata | |
resultId (common) | 批量 API 结果 ID。 | 字符串 | |
sObjectBlobFieldName (common) | SObject blob 字段名称。 | 字符串 | |
sObjectClass (common) | 完全限定的 SObject 类名称,通常使用 camel-salesforce-maven-plugin 生成。 | 字符串 | |
sObjectFields (common) | 要检索的 SObject 字段。 | 字符串 | |
sObjectId (common) | API 需要 SObject ID。 | 字符串 | |
sObjectIdName (common) | SObject 外部 ID 字段名称。 | 字符串 | |
sObjectIdValue (common) | SObject 外部 ID 字段值。 | 字符串 | |
sObjectName (common) | API 需要或支持 SObject 名称。 | 字符串 | |
sObjectQuery (common) | Salesforce SOQL 查询字符串。 | 字符串 | |
sObjectSearch (common) | Salesforce SOSL 搜索字符串。 | 字符串 | |
updateTopic (common) | 在使用流 API 时是否更新现有的 Push 主题,默认为 false。 | false | 布尔值 |
bridgeErrorHandler (consumer) | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
replayId (consumer) | 订阅时要使用的 replayId 值。 | Long | |
exceptionHandler (consumer (advanced)) | 要让使用者使用自定义例外处理程序:请注意,如果启用了 bridgeErrorHandler 选项,则此选项不使用。默认情况下,消费者将处理异常,其记录在 WARN 或 ERROR 级别中,并忽略。 | ExceptionHandler | |
exchangePattern (consumer (advanced)) | 在消费者创建交换时设置交换模式。 Enum 值:
| ExchangePattern | |
allOrNone (producer) | 复合 API 选项,以指示在是否有成功时回滚所有记录。 | false | 布尔值 |
apexUrl (producer) | APEX 方法 URL。 | 字符串 | |
compositeMethod (producer) | 复合(原始)方法。 | 字符串 | |
lazyStartProducer (producer) | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
rawHttpHeaders (producer) | 以逗号分隔的消息标头列表,以作为 Raw 操作的 HTTP 参数。 | 字符串 | |
rawMethod (producer) | 用于 Raw 操作的 HTTP 方法。 | 字符串 | |
rawPath (producer) | 域名后面的端点 URL 部分。例如,'/services/data/v52.0/sobjects/Account/'。 | 字符串 | |
rawQueryParameters (producer) | 以逗号分隔的消息标头列表,以作为 Raw 操作的查询参数。不要 URL-encode 值,因为会自动完成此操作。 | 字符串 |
54.4. 向 Salesforce 进行身份验证
组件支持三个 OAuth 身份验证流程:
对于每个流不同的属性集合,需要设置:
属性 | 在 Salesforce 上找到它 | 流 |
---|---|---|
clientId | 连接的 App, Consumer Key | 所有流 |
clientSecret | connected App, Consumer Secret | username-Password, Refresh Token |
userName | Salesforce 用户名 | 用户名密码、JWT Bearer 令牌 |
password | Salesforce 用户密码 | username-Password |
refreshToken | 来自 OAuth 流回调 | 刷新令牌 |
keystore | 连接的应用程序,过期证书 | JWT Bearer 令牌 |
组件自动决定您要配置的流,以删除模糊设置 authenticationType
属性。
不建议在生产环境中使用 Username-Password Flow。
JWT Bearer Token Flow 中使用的证书可以是自签名证书。保存证书和私钥的 KeyStore 必须仅包含单个证书私钥条目。
54.5. URI 格式
当用作消费者时,接收流事件时,URI 方案为:
salesforce:topic?options
当用作生成者时,调用 Salesforce REST API,URI 方案为:
salesforce:operationName?options
54.6. 传递 Salesforce 标头并获取 Salesforce 响应标头
支持通过入站消息标头传递 Salesforce 标头,在请求中以 Sforce
或 x-sfdc
开头的标头名称将出现在请求中,以 Sforce
开头的响应标头将出现在出站消息标头中。
例如,要获取 API 限制:
// in your Camel route set the header before Salesforce endpoint //... .setHeader("Sforce-Limit-Info", constant("api-usage")) .to("salesforce:getGlobalObjects") .to(myProcessor); // myProcessor will receive `Sforce-Limit-Info` header on the outbound // message class MyProcessor implements Processor { public void process(Exchange exchange) throws Exception { Message in = exchange.getIn(); String apiLimits = in.getHeader("Sforce-Limit-Info", String.class); } }
此外,HTTP 响应状态代码和文本可作为标头 Exchange.HTTP_RESPONSE_CODE
和 Exchange.HTTP_RESPONSE_TEXT
提供。
54.7. 支持的 Salesforce API
组件支持以下 Salesforce API
制作者端点可以使用以下 API:大多数 API 每次处理一个记录,Query API 可以检索多个记录。
54.7.1. REST API
您可以将以下内容用于 operationName
:
- getVersions - 获取支持的 Salesforce REST API 版本
- GetResources - 获取可用的 Salesforce REST 资源端点
- getGlobalObjects - 获取所有可用 SObject 类型的元数据
- getBasicInfo - 获取特定 SObject 类型的基本元数据
- GetDescription - 获取特定 SObject 类型的综合元数据
- getSObject - 使用其 Salesforce Id 获取 SObject
- createSObject - 创建 SObject
- updateSObject - 使用 Id 更新 SObject
- deleteSObject - 使用 Id 删除 SObject
- getSObjectWithId - 使用外部(用户定义的)id 字段获取 SObject
- upsertSObject - 使用外部 ID 更新或插入 SObject
- deleteSObjectWithId - 使用外部 ID 删除 SObject
- Query - 运行 Salesforce SOQL 查询
- queryMore - 使用从 'query' API 返回的结果链接检索更多结果(如果有大量结果)
- Search - 运行 Salesforce SOSL 查询
- 限制 - 获取机构 API 用量限制
- recent - 获取最新的项目
- Approval - 提交记录或记录(批量)以进行批准过程
- Approvals - 获取所有批准过程的列表
- 复合 - 提交最多 25 个可能相关的 REST 请求并接收单个响应。也可以在不限制的情况下使用"原始"复合。
- comp-tree - 一次性创建最多 200 个带有父子关系(最多 5 级)的记录
- comp-batch - 提交批处理中请求组成
- CompRetrieveSObjectCollections - 获取同一对象类型的一个或多个记录。
- CompCreateSObjectCollections - 添加最多 200 个记录,返回 SaveSObjectResult 对象的列表。
- compUpdateSObjectCollections - 更新最多 200 个记录,返回 SaveSObjectResult 对象的列表。
- CompUpsertSObjectCollections - 根据外部 ID 字段创建或更新最多 200 个记录。返回 UpsertSObjectResult 对象列表。
- CompDeleteSObjectCollections - 删除最多 200 个记录,返回 SaveSObjectResult 对象的列表。
- queryAll - 运行 SOQL 查询。它返回因为合并而删除的结果(将三个记录合并到其中一个记录中,删除其他记录,以及重新清除任何相关的记录)或删除。另外,返回有关归档任务和事件记录的信息。
- getBlobField - 从单个记录中检索指定的 blob 字段。
- apexCall - 执行用户定义的 APEX REST API 调用。
- raw - 向 Salesforce 发送请求,并对端点、参数、正文等完全控制。
例如,以下制作者端点使用 upsertSObject API,sObjectIdName 参数指定 'Name' 作为 external id 字段。请求消息正文应该是使用 maven 插件生成的 SObject DTO。如果现有记录被更新,或者具有新记录的 id 的 CreateSObjectResult
或创建新对象时的错误列表,响应消息将为空。
...to("salesforce:upsertSObject?sObjectIdName=Name")...
54.7.2. 批量 2.0 API
Bulk 2.0 API 与原始 Bulk API 相比具有简化的模型。使用它快速将大量数据加载到 Salesforce 中,或者从 Salesforce 中查询大量数据。数据必须以 CSV 格式提供。Bulk 2.0 的最低 API 版本是 v41.0。Bulk Queries 的最低 API 版本是 v47.0。下面提到的 DTO 类来自 org.apache.camel.component.salesforce.api.dto.bulkv2
软件包。支持以下操作:
-
bulk2CreateJob - 创建一个批量作业。在消息正文
中提供
一个作业实例。 -
bulk2GetJob - 获取现有的作业。
jobId
参数是必需的。 -
bulk2CreateBatch - 向作业中添加 CSV 记录批处理。在消息正文中提供 CSV 数据。第一行必须包含标头。
jobId
参数是必需的。 -
bulk2CloseJob - 关闭一个作业。您必须关闭作业才能进行处理或中止/删除。
jobId
参数是必需的。 -
bulk2AbortJob - Abort 一个作业。
jobId
参数是必需的。 -
bulk2DeleteJob - 删除作业。
jobId
参数是必需的。 -
bulk2GetSuccessfulResults - 获取作业的成功结果。返回的消息正文将包含 CSV 数据的 InputStream。
jobId
参数是必需的。 -
bulk2GetFailedResults - 获取失败的作业结果。返回的消息正文将包含 CSV 数据的 InputStream。
jobId
参数是必需的。 -
bulk2GetUnprocessedRecords - 为作业获取未处理的记录。返回的消息正文将包含 CSV 数据的 InputStream。
jobId
参数是必需的。 -
bulk2GetAllJobs - 获取所有作业。响应正文是
作业
的实例。如果done
属性为 false,则还有额外的页面来获取页面,下一个RecordsUrl
属性包含要在后续调用上的queryLocator
参数中设置的值。 -
bulk2CreateQueryJob - 创建批量查询作业。在消息正文中提供
QueryJob
实例。 -
bulk2GetQueryJob - 获取批量查询作业。
jobId
参数是必需的。 -
bulk2GetQueryJobResults - 获取批量查询作业结果。
jobId
参数是必需的。接受maxRecords
和locator
参数。响应消息标头包括Sforce-NumberOfRecords
和Sforce-Locator
标头。Sforce-Locator
的值可以通过locator
参数传递给后续调用。 -
bulk2AbortQueryJob - Abort 是一个批量查询作业。
jobId
参数是必需的。 -
bulk2DeleteQueryJob - 删除批量查询作业。
jobId
参数是必需的。 -
bulk2GetAllQueryJobs - 获取所有作业。响应正文是
QueryJobs
的实例。如果done
属性为 false,则还有额外的页面来获取页面,下一个RecordsUrl
属性包含要在后续调用上的queryLocator
参数中设置的值。
54.7.3. REST Bulk (original) API
制作者端点可以使用以下 API:支持所有作业数据格式、i.e. xml、csv、zip/xml 和 zip/csv。
路由必须对请求和响应进行 marshalled/unmarshalled。通常,请求是一些流源,如 CSV 文件,
,响应也可以保存到要与请求关联的文件中。
您可以将以下内容用于 operationName
:
-
CreateJob - 创建 Salesforce Bulk 作业。必须在正文中提供
JobInfo
实例。pkChunking 选项支持 PK Chunking。详情请参阅 这里 的说明。 - getJob - 使用其 Salesforce Id 获取作业
- closeJob - 关闭一个作业
- abortJob - Aborts a Job
- createBatch - 提交 Bulk 作业中的批处理
- getBatch - 使用 Id 获取批处理
- getAllBatches - 获取 Bulk Job Id 的所有批处理
- getRequest - 获取 Batch 的请求数据(XML/CSV)
- getResults - 完成后获取 Batch 的结果
- createBatchQuery - 从 SOQL 查询创建批处理
- getQueryResultIds - 获取 Batch Query 的 Result Ids 列表
- getQueryResult - 获取 Result Id 的结果
- get recentlyReports - 通过向 Report List 资源发送 GET 请求,最多获取您最近查看的报告 200。
- getReportDescription - 获取报告的报告、报告类型和相关元数据,可以是 tabular 或 summary 或 matrix 格式。
- executeSyncReport - 与不更改过滤器同步运行报告并返回最新的概述数据。
- executeAsyncReport - 异步运行报告实例,并带有或没有过滤器并返回摘要数据。
- getReportInstances - 返回您请求异步运行的报告的实例列表。列表中的每个项目被视为单独的报告实例。
- getReportResults :包含运行报告的结果。
例如,以下制作者端点使用 createBatch API 创建作业批处理。消息中必须包含可转换为 InputStream
(通常为 UTF-8 CSV 或 XML 内容)的正文,以及作业内容类型的标头字段 'jobId' 和 'contentType',可以是 XML、CSV、ZIP_XML 或 ZIP_CSV。放置消息正文将在成功上包含 BatchInfo
,或者在错误上抛出 SalesforceException
。
...to("salesforce:createBatch")..
54.7.4. REST Streaming API
消费者端点可以使用以下语法流端点,以在创建/更新时接收 Salesforce 通知。
创建并订阅主题
from("salesforce:CamelTestTopic?notifyForFields=ALL¬ifyForOperations=ALL&sObjectName=Merchandise__c&updateTopic=true&sObjectQuery=SELECT Id, Name FROM Merchandise__c")...
订阅现有主题
from("salesforce:CamelTestTopic&sObjectName=Merchandise__c")...
54.7.5. 平台事件
要发出平台事件,请使用 createSObject
操作。并且设置消息正文可以是 JSON 字符串,也可以是带有键-值数据的 InputStream,该键是 sObjectName
,需要设置为事件 API 名称,或者从 AbstractDTOBase 扩展的类以及事件的适当类名称。
例如,使用 DTO:
class Order_Event__e extends AbstractDTOBase { @JsonProperty("OrderNumber") private String orderNumber; // ... other properties and getters/setters } from("timer:tick") .process(exchange -> { final Message in = exchange.getIn(); String orderNumber = "ORD" + exchange.getProperty(Exchange.TIMER_COUNTER); Order_Event__e event = new Order_Event__e(); event.setOrderNumber(orderNumber); in.setBody(event); }) .to("salesforce:createSObject");
或使用 JSON 事件数据:
from("timer:tick") .process(exchange -> { final Message in = exchange.getIn(); String orderNumber = "ORD" + exchange.getProperty(Exchange.TIMER_COUNTER); in.setBody("{\"OrderNumber\":\"" + orderNumber + "\"}"); }) .to("salesforce:createSObject?sObjectName=Order_Event__e");
要接收平台事件,使用带有前缀为 event/ (或 / event/
)的平台事件的 API 名称的使用者端点,例如: Salesforce :events/Order_Event__e
。从该端点消耗的处理器将分别接收
org.apache.camel.component.salesforce.api.dto.PlatformEvent
对象或 org.cometd.bayeux.Message
,具体取决于 rawPayload
为 false
或 true
。
例如,使用最简单的形式来消耗一个事件:
PlatformEvent event = consumer.receiveBody("salesforce:event/Order_Event__e", PlatformEvent.class);
54.7.6. 更改数据捕获事件
另一方面,可将 Salesforce 配置为发出通知以记录选择对象的更改。另一方面,Camel Salesforce 组件可能会响应此类通知,允许实例将 这些更改同步到外部系统。
通过订阅频道,可以在 Camel 路由的 from ("salesforce:XXX")
子句中指定感兴趣的通知,例如:
from("salesforce:data/ChangeEvents?replayId=-1").log("being notified of all change events") from("salesforce:data/AccountChangeEvent?replayId=-1").log("being notified of change events for Account records") from("salesforce:data/Employee__ChangeEvent?replayId=-1").log("being notified of change events for Employee__c custom object")
收到的消息分别包含 body 中的 java.util.Map<String,Object
> 或 org.cometd.bayeux.Message
,具体取决于 rawPayload
为 false
或 true
。CamelSalesforceChangeType
标头可值为 CREATE
、UPDATE
、DELETE
或 UNDELETE
之一。
有关如何使用 Camel Salesforce 组件更改数据捕获功能的更多详细信息,请参阅 ChangeEventsConsumerIntegrationTest。
Salesforce 开发人员指南 很适合更好地了解实施更改数据捕获集成的应用程序的子点。更改事件正文字段的动态性质、高级别复制步骤以及安全考虑可能值得关注。
54.8. 例子
54.8.1. 将文档上传到内容工作空间
使用 Processor 实例在 Java 中创建 ContentVersion :
public class ContentProcessor implements Processor { public void process(Exchange exchange) throws Exception { Message message = exchange.getIn(); ContentVersion cv = new ContentVersion(); ContentWorkspace cw = getWorkspace(exchange); cv.setFirstPublishLocationId(cw.getId()); cv.setTitle("test document"); cv.setPathOnClient("test_doc.html"); byte[] document = message.getBody(byte[].class); ObjectMapper mapper = new ObjectMapper(); String enc = mapper.convertValue(document, String.class); cv.setVersionDataUrl(enc); message.setBody(cv); } protected ContentWorkspace getWorkSpace(Exchange exchange) { // Look up the content workspace somehow, maybe use enrich() to add it to a // header that can be extracted here ---- } }
将处理器的输出提供给 Salesforce 组件:
from("file:///home/camel/library") .to(new ContentProcessor()) // convert bytes from the file into a ContentVersion SObject // for the salesforce component .to("salesforce:createSObject");
54.9. 使用 Salesforce Limits API
使用 Salesforce :限制
操作,您可以从 Salesforce 获取 API 限制,然后对收到的数据进行操作。salesforce:limits
操作的结果映射到 org.apache.camel.component.salesforce.api.dto.Limits
类,并可用于自定义处理器或表达式。
例如,请考虑您需要限制 Salesforce 的 API 使用量,以便为其他路由保留 10% 每日 API 请求。输出消息的正文包含一个 org.apache.camel.component.salesforce.api.dto.Limits
对象的实例,它们可与基于内容的路由和基于内容的路由器和 Spring Expression Language (SpEL) 结合使用,用于何时执行查询。
请注意,在 body.dailyApiRequests.remaining
中保存的整数值乘以 1.0
如何使表达式评估为与浮点算一样的表达式评估,而不包括浮动点,则最终最终产生集成块,从而导致有 0
(消耗一些 API 限制)或 1
(没有 API 限制)。
from("direct:querySalesforce") .to("salesforce:limits") .choice() .when(spel("#{1.0 * body.dailyApiRequests.remaining / body.dailyApiRequests.max < 0.1}")) .to("salesforce:query?...") .otherwise() .setBody(constant("Used up Salesforce API limits, leaving 10% for critical routes")) .endChoice()
54.10. 使用批准
所有属性都与带有 批准前缀的 Salesforce REST API 中完全相同。
您可以通过设置 Endpoint 的 approval.PropertyName
来设置批准属性,这些属性将用作 template,即 body 或 header 中没有的任何属性都将从 Endpoint 配置中获取。或者,您可以通过将批准属性分配给 Registry 中的 bean 的引用来设置端点上 的批准
模板。
您还可以使用传入消息标头中使用相同的 approval.PropertyName
提供标头值。
最后,正文可以包含一个 AprovalRequest
或 ApprovalRequest
对象的 Iterable
,以作为批处理处理。
要记住的重要事项是这三个机制中指定的值的优先级:
- 正文中的值在任何其他前具有优先级
- 消息标头中的值在模板值前具有优先权
- 如果未指定标头或正文中的其他值,则会设置模板中的值
例如,要使用标头中的值为批准发送一个记录:
给定路由:
from("direct:example1")// .setHeader("approval.ContextId", simple("${body['contextId']}")) .setHeader("approval.NextApproverIds", simple("${body['nextApproverIds']}")) .to("salesforce:approval?"// + "approval.actionType=Submit"// + "&approval.comments=this is a test"// + "&approval.processDefinitionNameOrId=Test_Account_Process"// + "&approval.skipEntryCriteria=true");
您可以使用以下方法发送记录以进行批准:
final Map<String, String> body = new HashMap<>(); body.put("contextId", accountIds.iterator().next()); body.put("nextApproverIds", userId); final ApprovalResult result = template.requestBody("direct:example1", body, ApprovalResult.class);
54.11. 使用 Salesforce 最新的项目 API
要获取最新的项目,请使用 Salesforce:recent
操作。此操作返回一个 org.apache.camel.component.salesforce.api.dto.RecentItem
对象的 java.util.List
(List<RecentItem>
),它包括 Id
、Name
和 Attributes
(带有 type
和 url
属性)。您可以通过将 limit
参数设置为要返回的最大记录数来限制返回的项目数量。例如:
from("direct:fetchRecentItems") to("salesforce:recent") .split().body() .log("${body.name} at ${body.attributes.url}");
54.12. 使用 Salesforce Composite API 提交 SObject 树
要创建最多 200 个记录,包括父子关系,请使用 Salesforce:composite-tree
操作。这需要一个 org.apache.camel.component.salesforce.api.dto.composite.SObjectTree
实例,并在输入消息中返回相同的对象树。树中的 org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase
实例会使用标识符值 (Id
属性) 或对应的 org.apache.camel.component.salesforce.api.dto.composite.SObjectNode
实例进行更新,并在失败时生成 errors
。
请注意,对于某些记录操作,对于某些记录操作,您可能需要手动检查错误。
使用此功能的最简单方法是使用 camel-salesforce-maven-plugin
生成的 DTO,但您也可以选择自定义在树中标识各个对象的引用,用于数据库中的实例主密钥。
我们来看一个示例:
Account account = ... Contact president = ... Contact marketing = ... Account anotherAccount = ... Contact sales = ... Asset someAsset = ... // build the tree SObjectTree request = new SObjectTree(); request.addObject(account).addChildren(president, marketing); request.addObject(anotherAccount).addChild(sales).addChild(someAsset); final SObjectTree response = template.requestBody("salesforce:composite-tree", tree, SObjectTree.class); final Map<Boolean, List<SObjectNode>> result = response.allNodes() .collect(Collectors.groupingBy(SObjectNode::hasErrors)); final List<SObjectNode> withErrors = result.get(true); final List<SObjectNode> succeeded = result.get(false); final String firstId = succeeded.get(0).getId();
54.13. 使用 Salesforce Composite API 提交批处理中的多个请求
Composite API batch 操作(comp-batch
)允许您汇总批处理中的多个请求,然后从一个容器中提交它们,从而节省多个单独的请求的往返成本。然后,每个响应都会在保留顺序的响应列表中收到,因此第 N 条请求响应位于响应的 n 位置。
结果可能与 API 到 API 的不同,因此请求的结果被指定为 java.lang.Object
。在大多数情况下,结果将是 java.util.Map
,字符串键和值或其他 java.util.Map
作为值。请求以 JSON 格式发出,并保存某些类型信息(例如,已知值是字符串的值以及数字的数值)。
我们来看一个示例:
final String acountId = ... final SObjectBatch batch = new SObjectBatch("38.0"); final Account updates = new Account(); updates.setName("NewName"); batch.addUpdate("Account", accountId, updates); final Account newAccount = new Account(); newAccount.setName("Account created from Composite batch API"); batch.addCreate(newAccount); batch.addGet("Account", accountId, "Name", "BillingPostalCode"); batch.addDelete("Account", accountId); final SObjectBatchResponse response = template.requestBody("salesforce:composite-batch", batch, SObjectBatchResponse.class); boolean hasErrors = response.hasErrors(); // if any of the requests has resulted in either 4xx or 5xx HTTP status final List<SObjectBatchResult> results = response.getResults(); // results of three operations sent in batch final SObjectBatchResult updateResult = results.get(0); // update result final int updateStatus = updateResult.getStatusCode(); // probably 204 final Object updateResultData = updateResult.getResult(); // probably null final SObjectBatchResult createResult = results.get(1); // create result @SuppressWarnings("unchecked") final Map<String, Object> createData = (Map<String, Object>) createResult.getResult(); final String newAccountId = createData.get("id"); // id of the new account, this is for JSON, for XML it would be createData.get("Result").get("id") final SObjectBatchResult retrieveResult = results.get(2); // retrieve result @SuppressWarnings("unchecked") final Map<String, Object> retrieveData = (Map<String, Object>) retrieveResult.getResult(); final String accountName = retrieveData.get("Name"); // Name of the retrieved account, this is for JSON, for XML it would be createData.get("Account").get("Name") final String accountBillingPostalCode = retrieveData.get("BillingPostalCode"); // Name of the retrieved account, this is for JSON, for XML it would be createData.get("Account").get("BillingPostalCode") final SObjectBatchResult deleteResult = results.get(3); // delete result final int updateStatus = deleteResult.getStatusCode(); // probably 204 final Object updateResultData = deleteResult.getResult(); // probably null
54.14. 使用 Salesforce Composite API 提交多个链请求
复合
操作允许最多提交 25 个请求,这些请求可以组合在一起,用于后续请求中生成的实例标识符。单个请求和响应与提供的 参考 相关联。
复合 API 仅支持 JSON 有效负载。
与批处理 API 一样,结果可能会与 API 而异,因此请求的结果被指定为 java.lang.Object
。在大多数情况下,结果将是 java.util.Map
,字符串键和值或其他 java.util.Map
作为值。以 JSON 格式发出请求包含某些类型信息(例如,知道哪个值是字符串的值以及数字的数值)。
我们来看一个示例:
SObjectComposite composite = new SObjectComposite("38.0", true); // first insert operation via an external id final Account updateAccount = new TestAccount(); updateAccount.setName("Salesforce"); updateAccount.setBillingStreet("Landmark @ 1 Market Street"); updateAccount.setBillingCity("San Francisco"); updateAccount.setBillingState("California"); updateAccount.setIndustry(Account_IndustryEnum.TECHNOLOGY); composite.addUpdate("Account", "001xx000003DIpcAAG", updateAccount, "UpdatedAccount"); final Contact newContact = new TestContact(); newContact.setLastName("John Doe"); newContact.setPhone("1234567890"); composite.addCreate(newContact, "NewContact"); final AccountContactJunction__c junction = new AccountContactJunction__c(); junction.setAccount__c("001xx000003DIpcAAG"); junction.setContactId__c("@{NewContact.id}"); composite.addCreate(junction, "JunctionRecord"); final SObjectCompositeResponse response = template.requestBody("salesforce:composite", composite, SObjectCompositeResponse.class); final List<SObjectCompositeResult> results = response.getCompositeResponse(); final SObjectCompositeResult accountUpdateResult = results.stream().filter(r -> "UpdatedAccount".equals(r.getReferenceId())).findFirst().get() final int statusCode = accountUpdateResult.getHttpStatusCode(); // should be 200 final Map<String, ?> accountUpdateBody = accountUpdateResult.getBody(); final SObjectCompositeResult contactCreationResult = results.stream().filter(r -> "JunctionRecord".equals(r.getReferenceId())).findFirst().get()
54.15. 使用 "raw" Salesforce 复合
由于 rawPayload
选项,可以在路由中准备 Salesforce JSON 请求直接调用 Salesforce 复合。
例如,您可以有以下路由:
from("timer:fire?period=2000").setBody(constant("{\n" + " \"allOrNone\" : true,\n" + " \"records\" : [ { \n" + " \"attributes\" : {\"type\" : \"FOO\"},\n" + " \"Name\" : \"123456789\",\n" + " \"FOO\" : \"XXXX\",\n" + " \"ACCOUNT\" : 2100.0\n" + " \"ExternalID\" : \"EXTERNAL\"\n" " }]\n" + "}") .to("salesforce:composite?rawPayload=true") .log("${body}");
路由直接以 JSON 的形式创建正文,并使用 rawPayload=true
选项直接提交到 Salesforce 端点。
使用这个方法,您可以对 Salesforce 请求有完全的控制权。
POST
是向 Salesforce 发送原始复合请求的默认 HTTP 方法。使用 CompMethod
选项覆盖到其他支持的值 GET
,这将返回其他可用复合资源的列表。
54.16. 使用 Raw 操作
将 HTTP 请求发送到 Salesforce,并完全控制调用的所有方面。必须在路由中执行任何请求和响应正文的序列化或反序列化。Content-Type
HTTP 标头将根据 format
选项自动设置,但可以使用 rawHttpHeaders
选项覆盖。
参数 | 类型 | 描述 | 默认值 | 必填 |
---|---|---|---|---|
请求正文 |
| HTTP 请求的正文 | ||
rawPath |
| 域名后面的端点 URL 部分,如 '/services/data/v51.0/sobjects/Account/' | x | |
rawMethod |
| HTTP 方法 | x | |
rawQueryParameters |
| 以逗号分隔的消息标头列表,以作为查询参数包含。不要 URL-encode 值,因为会自动完成此操作。 | ||
rawHttpHeaders |
| 以逗号分隔的消息标头列表,以作为 HTTP 标头包括 |
54.16.1. 查询示例
在本例中,我们将向 REST API 发送查询。查询必须在名为 "q" 的 URL 参数中传递,因此我们将创建一个名为 q 的消息标头,并告知原始操作将该消息标头作为 URL 参数包括:
from("direct:queryExample") .setHeader("q", "SELECT Id, LastName FROM Contact") .to("salesforce:raw?format=JSON&rawMethod=GET&rawQueryParameters=q&rawPath=/services/data/v51.0/query") // deserialize JSON results or handle in some other way
54.16.2. SObject 示例
在本例中,我们将在 create
操作中传递 REST API。由于 原始
操作不执行任何序列化,因此我们确保在消息正文中传递 XML
from("direct:createAContact") .setBody(constant("<Contact><LastName>TestLast</LastName></Contact>")) .to("salesforce:raw?format=XML&rawMethod=POST&rawPath=/services/data/v51.0/sobjects/Contact")
响应为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Result> <id>0034x00000RnV6zAAF</id> <success>true</success> </Result>
54.17. 使用 Composite SObject Collections
SObject Collections API 对一个请求中的多个记录执行操作。使用 sObject Collections 减少客户端和服务器之间的往返数。整个请求计数为单一调用,成为您的 API 限制。此资源在 API 版本 42.0 及更高版本中提供。提供给这些操作的 SObject
记录(aka DTO)必须是 AbstractDescribedSObjectBase
的子类的实例。有关生成这些 DTO 类的信息,请参阅 Maven 插件部分。这些操作序列化为 JSON 提供 DTO。
54.17.1. compositeRetrieveSObjectCollections
检索同一对象类型的一个或多个记录。
参数 | 类型 | 描述 | 默认值 | 必填 |
---|---|---|---|---|
id | 字符串或以逗号分隔的字符串列表 | 要返回的对象的一个或多个 ID 列表。所有 ID 必须属于相同的对象类型。 | x | |
fields | 字符串或以逗号分隔的字符串列表 | 响应中包含的字段列表。您指定的字段名称必须有效,并且每个字段必须具有 read-level 权限。 | x | |
sObjectName | 字符串 |
SObject 类型,如 | x | |
sObjectClass | 字符串 | 用于反序列化响应的 DTO 类的完全限定类名称。 |
如果 |
54.17.2. compositeCreateSObjectCollections
最多添加 200 个记录,返回 SaveSObjectResult 对象列表。支持混合 SObject 类型。
参数 | 类型 | 描述 | 默认值 | 必填 |
---|---|---|---|---|
请求正文 |
| 要创建的 SObjects 列表 | x | |
allOrNone | 布尔值 | 指定在创建任何对象失败时是否回滚整个请求(true)还是继续创建请求中的其他对象。 | false |
54.17.3. compositeUpdateSObjectCollections
最多更新 200 个记录,返回 SaveSObjectResult 对象列表。支持混合 SObject 类型。
参数 | 类型 | 描述 | 默认值 | 必填 |
---|---|---|---|---|
请求正文 |
| 要更新的 SObjects 列表 | x | |
allOrNone | 布尔值 | 指明是否在更新任何对象失败时回滚整个请求(true),或者继续更新请求中其他对象的单独更新。 | false |
54.17.4. compositeUpsertSObjectCollections
根据外部 ID 字段创建或更新(upsert)最多 200 记录,返回 UpsertSObjectResult 对象列表。不支持混合 SObject 类型。
参数 | 类型 | 描述 | 默认值 | 必填 |
---|---|---|---|---|
请求正文 |
| 到 upsert 的 SObjects 列表 | x | |
allOrNone | 布尔值 | 指明是否在任何对象的 upsert (true)或继续处理请求中其他对象的单独时回滚整个请求。 | false | |
sObjectName | 字符串 |
SObject 类型,如 | x | |
sObjectIdName | 字符串 | 外部 ID 字段的名称 | x |
54.17.5. compositeDeleteSObjectCollections
删除最多 200 个记录,返回 DeleteSObjectResult 对象列表。支持混合 SObject 类型。
参数 | 类型 | 描述 | 默认值 | 必填 |
---|---|---|---|---|
| 字符串或以逗号分隔的字符串列表 | 要删除对象的最多 200 个 ID 列表。 | x | |
| 布尔值 | 指定在删除任何对象失败时是否回滚整个请求(true)或继续删除请求中的其他对象。 | false |
54.18. 向 Salesforce 发送 null 值
默认情况下,带有 null 值的 SObject 字段不会发送到 Salesforce。要将 null 值发送到 Salesforce,请使用 fieldsToNull
属性,如下所示:
accountSObject.getFieldsToNull().add("Site");
54.19. 生成 SOQL 查询字符串
org.apache.camel.component.salesforce.api.utils.QueryHelper
包含生成 SOQL 查询的帮助方法。例如,要从 帐户 SObject 获取所有自定义字段,只需通过调用生成 SOQL SELECT:
String allCustomFieldsQuery = QueryHelper.queryToFetchFilteredFieldsOf(new Account(), SObjectField::isCustom);
54.20. Camel Salesforce Maven 插件
此 Maven 插件为 Camel 生成 DTO。
出于安全考虑,建议不会在 pom.xml 中设置 clientId、clientSecret、userName 和 password 字段。该插件应该为其它属性配置,并可使用以下命令执行:
mvn camel-salesforce:generate -DcamelSalesforce.clientId=<clientid> -DcamelSalesforce.clientSecret=<clientsecret> \ -DcamelSalesforce.userName=<username> -DcamelSalesforce.password=<password>
生成的 DTO 使用 Jackson 注解。所有 Salesforce 字段类型都支持。日期和时间字段默认映射到 java.time.ZonedDateTime
,而 picklist 字段则映射到生成的 Java Enumerations。
有关如何生成 DTO 的详细信息,请参阅 README.md。
54.21. Spring Boot Auto-Configuration
当在 Spring Boot 中使用 Salesforce 时,请确保使用以下 Maven 依赖项来支持自动配置:
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-salesforce-starter</artifactId> </dependency>
组件支持 91 个选项,如下所列。
Name | 描述 | 默认值 | 类型 |
---|---|---|---|
camel.component.salesforce.all-or-none | 复合 API 选项,以指示在是否有成功时回滚所有记录。 | false | 布尔值 |
camel.component.salesforce.apex-method | APEX 方法名称。 | 字符串 | |
camel.component.salesforce.apex-query-params | 查询 APEX 方法的参数。 | Map | |
camel.component.salesforce.apex-url | APEX 方法 URL。 | 字符串 | |
camel.component.salesforce.api-version | Salesforce API 版本。 | 53.0 | 字符串 |
camel.component.salesforce.authentication-type | 要使用显式验证方法,USERNAME_PASSWORD、REFRESH_TOKEN 或 JWT 之一。Salesforce 组件可以自动确定要从属性集中使用的身份验证方法,设置此属性以消除任何不确定性。 | AuthenticationType | |
camel.component.salesforce.autowired-enabled | 是否启用自动关闭。这用于自动关闭选项(选项必须标记为 autowired),方法是在 registry 中查找查找是否有单个匹配类型实例,然后在组件上配置。这可以用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。 | true | 布尔值 |
camel.component.salesforce.backoff-increment | backoff 间隔递增流连接重启尝试尝试超过 CometD 自动连接。选项是一个长类型。 | 1000 | Long |
camel.component.salesforce.batch-id | 批量 API 批处理 ID。 | 字符串 | |
camel.component.salesforce.bridge-error-handler | 允许将消费者桥接到 Camel 路由错误处理程序,这意味着当消费者试图选择传入消息或类似信息时发生异常,现在将作为消息处理并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.ExceptionHandler 来处理例外情况,该处理程序将被记录在 WARN 或 ERROR 级别,并忽略。 | false | 布尔值 |
camel.component.salesforce.client-id | Salesforce 实例设置中配置的连接的应用程序的 OAuth Consumer Key。通常,需要配置一个连接的应用程序,但可以通过安装软件包来提供。 | 字符串 | |
camel.component.salesforce.client-secret | Salesforce 实例设置中配置的连接应用程序的 OAuth Consumer Secret。 | 字符串 | |
camel.component.salesforce.composite-method | 复合(原始)方法。 | 字符串 | |
camel.component.salesforce.config | 全局端点配置 - 用于设置所有端点通用的值。选项是一个 org.apache.camel.component.salesforce.salesforceEndpointConfig 类型。 | SalesforceEndpointConfig | |
camel.component.salesforce.content-type | 批量 API 内容类型,一个 XML, CSV, ZIP_XML, ZIP_CSV。 | ContentType | |
camel.component.salesforce.default-replay-id | 如果在 initialReplayIdMap 中没有找到任何值,则默认 replayId 设置。 | -1 | Long |
camel.component.salesforce.enabled | 是否启用 Salesforce 组件的自动配置。这默认是启用的。 | 布尔值 | |
camel.component.salesforce.fall-back-replay-id | ReplayId 在 Invalid Replay Id 响应后回退到。 | -1 | Long |
camel.component.salesforce.format | 用于 Salesforce API 调用的有效负载格式(JSON 或 XML)默认为 JSON。自 Camel 3.12 起,此选项仅适用于 Raw 操作。 | PayloadFormat | |
camel.component.salesforce.http-client | 用于连接到 Salesforce 的自定义 Jetty Http 客户端。选项是一个 org.apache.camel.component.salesforce.salesforceHttpClient 类型。 | SalesforceHttpClient | |
camel.component.salesforce.http-client-connection-timeout | 连接到 Salesforce 服务器时 HttpClient 使用的连接超时。 | 60000 | Long |
camel.component.salesforce.http-client-idle-timeout | 在等待 Salesforce 服务器响应时,HttpClient 使用的超时。 | 10000 | Long |
camel.component.salesforce.http-client-properties | 用于设置可以在底层 HTTP 客户端上配置的任何属性。查看 SalesforceHttpClient 和 Jetty HttpClient 的属性,适用于所有可用选项。 | Map | |
camel.component.salesforce.http-max-content-length | HTTP 响应的最大内容长度。 | 整数 | |
camel.component.salesforce.http-proxy-auth-uri | 对于 HTTP 代理服务器的身份验证,需要匹配代理服务器的 URI,以便 httpProxyUsername 和 httpProxyPassword 用于身份验证。 | 字符串 | |
camel.component.salesforce.http-proxy-excluded-addresses | 不应该使用 HTTP 代理服务器的地址列表。 | Set | |
camel.component.salesforce.http-proxy-host | 要使用的 HTTP 代理服务器的主机名。 | 字符串 | |
camel.component.salesforce.http-proxy-included-addresses | 应使用 HTTP 代理服务器的地址列表。 | Set | |
camel.component.salesforce.http-proxy-password | 用于向 HTTP 代理服务器进行身份验证的密码。 | 字符串 | |
camel.component.salesforce.http-proxy-port | 要使用的 HTTP 代理服务器的端口号。 | 整数 | |
camel.component.salesforce.http-proxy-realm | 代理服务器的域,用于针对 HTTP 代理服务器的抢占基本/目标身份验证方法。 | 字符串 | |
camel.component.salesforce.http-proxy-secure | 如果设置为 false,在访问 HTTP 代理时禁用使用 TLS。 | true | 布尔值 |
camel.component.salesforce.http-proxy-socks4 | 如果设置为 true,请将 HTTP 代理配置为用作 SOCKS4 代理。 | false | 布尔值 |
camel.component.salesforce.http-proxy-use-digest-auth | 如果在对 HTTP 代理进行身份验证时使用 true Digest 身份验证,否则将使用基本授权方法。 | false | 布尔值 |
camel.component.salesforce.http-proxy-username | 用于向 HTTP 代理服务器进行身份验证的用户名。 | 字符串 | |
camel.component.salesforce.http-request-buffer-size | HTTP 请求缓冲区大小。对于大型 SOQL 查询,可能需要增加。 | 8192 | 整数 |
camel.component.salesforce.include-details | 在 Salesforce1 Analytics 报告中包含详细信息,默认为 false。 | 布尔值 | |
camel.component.salesforce.initial-replay-id-map | 重播 ID 以从每个频道名称开始。 | Map | |
camel.component.salesforce.instance-id | Salesforce1 分析报告执行实例 ID。 | 字符串 | |
camel.component.salesforce.instance-url | 身份验证后使用的 Salesforce 实例的 URL,默认情况下从 Salesforce 身份验证成功接收到。 | 字符串 | |
camel.component.salesforce.job-id | 批量 API 作业 ID。 | 字符串 | |
camel.component.salesforce.jwt-audience | 使用 OAuth JWT 流时用于 Audience 声明(aud)的值。如果没有设置,则使用登录 URL,在大多数情况下都适合。 | 字符串 | |
camel.component.salesforce.keystore | 在 OAuth JWT 流中使用的密钥存储参数。KeyStore 应该仅包含一个带有私钥和证书的条目。Salesforce 不会验证证书链,因此这容易是自签名证书。确保将证书上传到对应的连接的应用程序。选项是 org.apache.camel.support.jsse.KeyStoreParameters 类型。 | KeyStoreParameters | |
camel.component.salesforce.lazy-login | 如果设置为 true 可防止组件在组件开始时向 Salesforce 进行身份验证。您通常会将其设置为 (默认)false 并早期进行身份验证,并立即了解任何身份验证问题。 | false | 布尔值 |
camel.component.salesforce.lazy-start-producer | 生成者是否应懒惰启动 (在第一个消息中)。通过懒惰启动,您可以使用此选项来允许 CamelContext 和路由在生成者启动期间启动,并导致路由启动失败。通过懒惰启动,启动失败可以在路由信息时通过 Camel 的路由错误处理程序进行处理。请注意,在处理第一个消息时,创建并启动生成者可能需要稍等时间,并延长处理的总处理时间。 | false | 布尔值 |
camel.component.salesforce.limit | 对返回的记录数量的限制。适用于某些 API,请参阅 Salesforce 文档。 | 整数 | |
camel.component.salesforce.locator | Salesforce Bulk 2.0 API 提供的检测程序,用于获取查询任务的结果。 | 字符串 | |
camel.component.salesforce.login-config | 所有嵌套 Bean 中的身份验证配置,所有的属性也可以直接在组件上设置。选项是一个 org.apache.camel.component.salesforce.salesforceLoginConfig 类型。 | SalesforceLoginConfig | |
camel.component.salesforce.login-url | 用于身份验证的 Salesforce 实例的 URL,默认为。 | 字符串 | |
camel.component.salesforce.long-polling-transport-properties | 用于设置流 api 使用的 BayeuxClient (CometD)使用的 LongPollingTransport 上配置的任何属性。 | Map | |
camel.component.salesforce.max-backoff | 流连接重启尝试超过 CometD 自动连接的最大 backoff 间隔。选项是一个长类型。 | 30000 | Long |
camel.component.salesforce.max-records | 为 Bulk 2.0 Query 检索每个结果集合的最大记录数。请求仍受到大小限制的影响。如果您正在使用大量查询结果,您可能会在收到来自 Salesforce 的所有数据前遇到超时。要防止超时,请在 maxRecords 参数中指定客户端希望接收的最大记录数。这会将结果分成较小的集合,使用这个值作为最大大小。 | 整数 | |
camel.component.salesforce.not-found-behaviour | 设置从 Salesforce API 接收的 404 not found 状态的行为。应将正文设置为 NULL NotFoundBehaviourHQNULL,或在交换 NotFoundBehaviour EXCEPTION 上发出一个异常信号 - 默认。 | NotFoundBehaviour | |
camel.component.salesforce.notify-for-fields | 通知字段,选项为 ALL, REFERENCED, SELECT, WHERE。 | NotifyForFieldsEnum | |
camel.component.salesforce.notify-for-operation-create | 通知创建操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
camel.component.salesforce.notify-for-operation-delete | 通知删除操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
camel.component.salesforce.notify-for-operation-undelete | 通知未删除操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
camel.component.salesforce.notify-for-operation-update | 通知更新操作,默认为 false (API 版本 = 29.0)。 | 布尔值 | |
camel.component.salesforce.notify-for-operations | 通知操作,选项为 ALL, CREATE, EXTENDED, UPDATE (API 版本 29.0)。 | NotifyForOperationsEnum | |
camel.component.salesforce.object-mapper | 自定义 Jackson ObjectMapper,以便在序列化/解码 Salesforce 对象时使用。选项是一个 com.fasterxml.jackson.databind.ObjectMapper 类型。 | ObjectMapper | |
camel.component.salesforce.packages | 在什么软件包中,生成的 DTO 类。通常,类将使用 camel-salesforce-maven-plugin 生成。如果使用生成的 DTOs,在 parameters/header 值中使用短 SObject 名称的好处,则设置它。可以使用逗号分隔多个软件包。 | 字符串 | |
camel.component.salesforce.password | OAuth 流中使用的密码,以获取访问令牌的访问权限。使用密码 OAuth 流很容易入门,但通常要避免它的安全性,这比其它流安全。如果使用,请确保将安全令牌附加到密码的末尾。 | 字符串 | |
camel.component.salesforce.pk-chunking | 使用 PK Chunking。仅用于原始 Bulk API。如果需要,批量 2.0 API 自动执行 PK 块。 | 布尔值 | |
camel.component.salesforce.pk-chunking-chunk-size | 用于 PK Chunking 的块大小。如果未指定,则 Salesforce 默认为 100,000。最大大小为 250,000。 | 整数 | |
camel.component.salesforce.pk-chunking-parent | 当您为共享对象上的查询启用 PK 块时,请指定父对象。块基于父对象的记录,而不是共享的对象的记录。例如,在查询 AccountShare 时,将 Account 指定为父对象。只要支持父对象,支持 PK 块来共享对象。 | 字符串 | |
camel.component.salesforce.pk-chunking-start-row | 指定用作第一个块的下限 15 个字符或 18 个字符记录 ID。在重启批处理之间失败的作业时,请使用此参数指定起始 ID。 | 字符串 | |
camel.component.salesforce.query-locator | 当查询结果超过单个调用中检索的记录时,查询 Locator 以供使用。在后续调用中使用这个值来检索其他记录。 | 字符串 | |
camel.component.salesforce.raw-http-headers | 以逗号分隔的消息标头列表,以作为 Raw 操作的 HTTP 参数。 | 字符串 | |
camel.component.salesforce.raw-method | 用于 Raw 操作的 HTTP 方法。 | 字符串 | |
camel.component.salesforce.raw-path | 域名后面的端点 URL 部分。例如,'/services/data/v52.0/sobjects/Account/'。 | 字符串 | |
camel.component.salesforce.raw-payload | 在请求和响应中使用原始有效负载字符串(根据格式 JSON 或 XML),而不是 DTOs,默认为 false。 | false | 布尔值 |
camel.component.salesforce.raw-query-parameters | 以逗号分隔的消息标头列表,以作为 Raw 操作的查询参数。不要 URL-encode 值,因为会自动完成此操作。 | 字符串 | |
camel.component.salesforce.refresh-token | 刷新令牌已在刷新令牌 OAuth 流中获取。一个需要设置 Web 应用并配置回调 URL 来接收刷新令牌,或使用内置回调进行配置,然后在流末尾从 URL 撤销 refresh_token。请注意,在开发机构 Salesforce 中,允许在 localhost 上托管回调 Web 应用程序。 | 字符串 | |
camel.component.salesforce.report-id | Salesforce1 分析报告 Id. | 字符串 | |
camel.component.salesforce.report-metadata | Salesforce1 分析报告元数据进行过滤。选项是一个 org.apache.camel.component.salesforce.api.dto.analytics.reports.ReportMetadata 类型。 | ReportMetadata | |
camel.component.salesforce.result-id | 批量 API 结果 ID。 | 字符串 | |
camel.component.salesforce.s-object-blob-field-name | SObject blob 字段名称。 | 字符串 | |
camel.component.salesforce.s-object-class | 完全限定的 SObject 类名称,通常使用 camel-salesforce-maven-plugin 生成。 | 字符串 | |
camel.component.salesforce.s-object-fields | 要检索的 SObject 字段。 | 字符串 | |
camel.component.salesforce.s-object-id | API 需要 SObject ID。 | 字符串 | |
camel.component.salesforce.s-object-id-name | SObject 外部 ID 字段名称。 | 字符串 | |
camel.component.salesforce.s-object-id-value | SObject 外部 ID 字段值。 | 字符串 | |
camel.component.salesforce.s-object-name | API 需要或支持 SObject 名称。 | 字符串 | |
camel.component.salesforce.s-object-query | Salesforce SOQL 查询字符串。 | 字符串 | |
camel.component.salesforce.s-object-search | Salesforce SOSL 搜索字符串。 | 字符串 | |
camel.component.salesforce.ssl-context-parameters | 要使用的 SSL 参数,请参阅 SSLContextParameters 类以了解所有可用选项。选项是 org.apache.camel.support.jsse.SSLContextParameters 类型。 | SSLContextParameters | |
camel.component.salesforce.update-topic | 在使用流 API 时是否更新现有的 Push 主题,默认为 false。 | false | 布尔值 |
camel.component.salesforce.use-global-ssl-context-parameters | 启用使用全局 SSL 上下文参数。 | false | 布尔值 |
camel.component.salesforce.user-name | OAuth 流中使用的用户名,以获取访问令牌的访问权限。使用密码 OAuth 流很容易入门,但通常要避免它的安全性,这比其它流安全。 | 字符串 | |
camel.component.salesforce.worker-pool-max-size | 用于处理 HTTP 响应的线程池的最大大小。 | 20 | 整数 |
camel.component.salesforce.worker-pool-size | 用于处理 HTTP 响应的线程池大小。 | 10 | 整数 |
第 55 章 SAP 组件
SAP 组件是由十个不同 SAP 组件组成的软件包。有远程功能调用(RFC)组件支持 sRFC、tRFC 和 qRFC 协议,并且有 IDoc 组件可使用 IDoc 格式的消息进行通信。组件使用 SAP Java Connector (SAP JCo)库来实现与 SAP 和 SAP IDoc 库双向通信,以中间文档(IDoc)格式传输文档。
55.1. 依赖项
将以下依赖项添加到此组件的 pom.xml
中:
<dependency> <groupId>org.fusesource</groupId> <artifactId>camel-sap-starter</artifactId> <version>3.20.1.redhat-00031</version> </dependency>
55.1.1. SAP 组件的额外平台限制
由于 SAP 组件依赖于第三方 JCo 3 和 IDoc 3 库,所以只能在这些库支持的平台上安装它。
55.1.2. SAP JCo 和 SAP IDoc 库
使用 SAP 组件的先决条件是 SAP Java Connector (SAP JCo)库和 SAP IDoc 库被安装到 Java 运行时的 lib/
目录中。您必须确保从 SAP Service Marketplace 为目标操作系统下载一组适当的 SAP 库。
库文件的名称因目标操作系统而异,如下所示。
SAP 组件 | Linux 和 UNIX | Windows |
---|---|---|
SAP JCo 3 |
|
|
SAP IDoc |
|
|
55.2. URI 格式
SAP 组件提供了两种不同类型的端点:远程功能调用(RFC)端点和中间文档(IDoc)端点。
RFC 端点的 URI 格式如下:
sap-srfc-destination:destinationName:rfcName sap-trfc-destination:destinationName:rfcName sap-qrfc-destination:destinationName:queueName:rfcName sap-srfc-server:serverName:rfcName[?options] sap-trfc-server:serverName:rfcName[?options]
IDoc 端点的 URI 格式如下:
sap-idoc-destination:destinationName:idocType[:idocTypeExtension[:systemRelease[:applicationRelease]]] sap-idoclist-destination:destinationName:idocType[:idocTypeExtension[:systemRelease[:applicationRelease]]] sap-qidoc-destination:destinationName:queueName:idocType[:idocTypeExtension[:systemRelease[:applicationRelease]]] sap-qidoclist-destination:destinationName:queueName:idocType[:idocTypeExtension[:systemRelease[:applicationRelease]]] sap-idoclist-server:serverName:idocType[:idocTypeExtension[:systemRelease[:applicationRelease]]][?options]
由 sap-endpointKind-destination 前缀的 URI 格式用于定义目标端点(换句话说,Camel producer 端点)和 destinationName 是到 SAP 实例的特定出站连接的名称。出站连接在组件级别命名和配置。
以 sap-endpointKind-server 前缀的 URI 格式用于定义服务器端点(换句话说,Camel 使用者端点)和 serverName 是来自 SAP 实例的特定入站连接的名称。入站连接在组件级别命名和配置。
RFC 端点 URI 的其他组件如下:
- rfcName
- (必需) 在目的地端点 URI 中,是由连接的 SAP 实例中端点调用的 RFC 名称。在服务器端点 URI 中,是从连接的 SAP 实例调用时端点处理的 RFC 名称。
- queueName
- 指定此端点向发送 SAP 请求的队列。
IDoc 端点 URI 的其他组件如下:
- idocType
- (必需) 指定此端点生成的 IDoc 类型的基本 IDoc 类型。
- idocTypeExtension
- 指定此端点生成的 IDoc Type 扩展(若有)。
- systemRelease
- 指定这个端点生成的 IDoc 的相关 SAP Basis 发行版本(若有)。
- applicationRelease
- 指定此端点生成的 IDoc 的关联应用程序发行版本(若有)。
- queueName
- 指定此端点向发送 SAP 请求的队列。
55.2.1. RFC 目标端点的选项
RFC 目标端点(sap-srfc-destination
,sap-trfc-destination
, 和 sap-qrfc-destination
)支持以下 URI 选项:
Name | 默认值 | 描述 |
---|---|---|
|
|
如果为 |
|
|
如果为 |
55.2.2. RFC 服务器端点的选项
SAP RFC 服务器端点(sap-srfc-server
和 sap-trfc-server
)支持以下 URI 选项:
Name | 默认值 | 描述 |
---|---|---|
|
|
如果为 |
|
|
(仅限 SAP-trfc-server 端点) 如果为 |
55.2.3. IDoc List Server 端点的选项
SAP IDoc List Server 端点(sap-idoclist-server
)支持以下 URI 选项:
Name | 默认值 | 描述 |
---|---|---|
|
|
如果为 |
|
|
如果为 |
55.2.4. RFC 和 IDoc 端点摘要
SAP 组件软件包提供以下 RFC 和 IDoc 端点:
sap-srfc-destination
Camel SAP Synchronous Remote Function Call Destination Camel 组件.当 Camel 路由需要同步向 SAP 系统发出请求和响应时,应使用此端点。
注意此组件使用的 sRFC 协议向 SAP 系统提供请求和响应,并 具有最佳工作量。如果在发送请求时出现通信错误,接收 SAP 系统中的远程功能调用的完成状态将保持不变。
sap-trfc-destination
Camel SAP Transactional Remote Function Call Destination Camel 组件.在大多数情况下,当请求必须发送到接收 SAP 系统时,应使用此端点。为达到此目的,组件会生成一个事务 ID,它包括了通过路由交换中组件发送的每个请求。
接收 SAP 系统在
发送请求
前记录附带的请求;如果 SAP 系统再次收到请求,则其tid
不会提供请求。因此,如果路由在通过此组件的端点发送请求时遇到通信错误,它可以重试在同一交换内发送请求,了解它将只会被发送并执行一次。注意此组件使用的 tRFC 协议是异步的,不会返回响应。因此,此组件的端点不会返回响应消息。
注意此组件不能保证通过端点对一系列请求的顺序,并且这些请求的交付和执行顺序因通信错误和重新发送请求而不同。有关保证交付顺序,请参阅 Camel SAP Queued Remote Function Call Destination Camel 组件。
sap-qrfc-destination
Camel SAP Queued Remote Function Call Destination Camel 组件。此组件通过添加保证通过端点发送请求来扩展事务远程功能调用目的地 camel 组件的功能。如果一系列请求相互依赖,并且 最多必须一次性 传送到接收 SAP 系统时,应使用此端点。组件使用与 Camel SAP Transactional Remote Function Call Destination Camel 组件相同的机制完成 一次 交付保证。排序保证是通过按 SAP 系统收到的顺序对 入站队列 进行序列化来实现的。入站队列由 SAP 中的 QIN 调度程序 处理。激活 入站队列时,QIN 调度程序将按顺序执行队列请求。
注意此组件使用的 qRFC 协议是异步的,不会返回响应。因此,此组件的端点不会返回响应消息。
sap-srfc-server
- Camel SAP Synchronous Remote Function Call Server Camel 组件.当需要 Camel 路由同步处理来自 SAP 系统的请求和响应时,应使用此组件及其端点。
sap-trfc-server
-
Camel SAP Transactional Remote Function Call Server Camel 组件.当发送 SAP 系统 最多 将其请求发送到 Camel 路由时,应使用此端点。为达到此目的,发送 SAP 系统会生成一个事务 ID
tid
,它为每个请求发送给组件的端点。发送 SAP 系统首先会检查组件是否收到给定的tid
,然后再发送与tid
关联的一系列请求。组件将检查它维护的tid
的列表,如果发送的tid
不在该列表中,则记录发送的 tid,然后响应发送的 SAP 系统,指示tid
是否已被记录。如果之前未记录tid
,发送 SAP 系统才会发送一系列请求。这可让发送 SAP 系统可靠地向 camel 路由发送一系列请求。 sap-idoc-destination
- Camel SAP IDoc Destination Camel 组件.当 Camel 路由向 SAP 系统发送中间文档(IDocs)列表时,应使用此端点。
sap-idoclist-destination
- Camel SAP IDoc List Destination Camel 组件.当 Camel 路由向 SAP 系统发送中间文档(IDocs)列表列表时,应使用此端点。
sap-qidoc-destination
- Camel SAP Queued IDoc Destination Camel 组件.当需要 Camel 路由按顺序向 SAP 系统发送中间文档(IDocs)列表时,应使用此组件及其端点。
sap-qidoclist-destination
- Camel SAP Queued IDoc List Destination Camel 组件。当 camel 路由将 Intermediate 文档(IDocs)列表按顺序发送到 SAP 系统时,会使用这个组件及其端点。
sap-idoclist-server
-
Camel SAP IDoc List Server Camel 组件.当发送 SAP 系统需要向 Camel 路由发送中间文档列表时,应使用此端点。这个组件使用 tRFC 协议与 SAP 通信,如
sap-trfc-server-standalone
快速启动中所述。
55.2.5. SAP RFC 目标端点
RFC 目标端点支持到 SAP 的出站通信,使这些端点能够向 SAP 中的 ABAP 功能模块发出 RFC 调用。RFC 目标端点被配置为通过到 SAP 实例的特定连接对特定的 ABAP 函数发出 RFC 调用。RFC 目的地是用于出站连接的逻辑设计,具有唯一的名称。RFC 目的地由一组称为 目标数据