Apache Camel 组件参考

Red Hat Fuse 7.10

配置 Camel 组件参考

摘要

Apache Camel 具有 100 多个组件,每个组件都高度可配置。本指南描述了每个组件的设置。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看我们的 CTO Chris Wright 信息

第 1 章 组件概述

本章介绍可用于 Apache Camel 的所有组件。

1.1. 容器类型

Red Hat Fuse 提供各种容器类型,您可以在其中部署 Camel 应用程序:

  • Spring Boot
  • Apache Karaf
  • JBoss Enterprise Application Platform (JBoss EAP)

此外,Camel 应用可以作为 无容器运行 :即,Camel 应用直接在 JVM 中运行,无需任何特殊容器。

在某些情况下,Fuse 可能会支持一个容器中的 Camel 组件,但不支持其他组件。这样做有多种原因,但在某些情况下,某个组件不适合所有容器类型。例如,camel-ejb 组件专为 Java EE (即 JBoss EAP)而设计的,它无法在其他容器类型中受支持。

1.2. 支持的组件

请注意以下密钥:

符号描述

支持

不支持或者还没有支持

已弃用

以后的发行版本中可能会删除

表 1.1 “Apache Camel 组件支持列表” 提供有关在哪些容器中支持哪些 Camel 组件的综合详情。

表 1.1. Apache Camel 组件支持列表

组件容器无容器Spring Boot 2.xKarafJBoss EAPIBM Power/ Spring Boot 2IBM Z/ Spring Boot 2

activemq-camel

activemq-http

camel-ahc

camel-ahc-ws

camel-ahc-wss

camel-amqp

camel-apns

camel-as2

camel-asterisk

camel-atlasmap

camel-atmos

camel-atmosphere-websocket

camel-atom

camel-atomix

camel-avro

camel-aws

camel-azure

camel-bam

已弃用

已弃用

已弃用

camel-bean

camel-bean-validator

camel-beanstalk

camel-binding

已弃用

已弃用

已弃用

camel-blueprint

camel-bonita

camel-box

camel-braintree

camel-browse

camel-cache

已弃用

已弃用

已弃用

camel-caffeine

camel-cdi

已弃用

camel-chronicle-engine

camel-chunk

camel-class

camel-cm-sms

camel-cmis

camel-coap

camel-cometd

camel-context

已弃用

camel-consul

camel-controlbus

camel-couchbase

camel-couchdb

camel-cql

camel-crypto

camel-crypto-cms

camel-cxf

camel-cxf-transport

camel-dataformat

camel-dataset

camel-digitalocean

camel-direct

camel-direct-vm

camel-disruptor

camel-dns

camel-docker

camel-dozer

camel-drill

camel-dropbox

camel-eclipse

已弃用

camel-ehcache

camel-ejb

camel-elasticsearch

camel-elasticsearch5

camel-elasticsearch-rest

camel-elsql

camel-etcd

camel-eventadmin

camel-exec

camel-facebook

camel-fhir

已弃用

已弃用

camel-file

camel-flatpack

camel-flink

camel-fop

camel-freemarker

camel-ftp

camel-gae

已弃用

camel-ganglia

camel-geocoder

camel-git

camel-github

camel-google-bigquery

camel-google-calendar

camel-google-drive

camel-google-mail

camel-google-pubsub

camel-google-sheets

camel-grape

camel-groovy-dsl

已弃用

camel-grpc

camel-guava-eventbus

camel-guice

已弃用

已弃用

camel-hawtdb

已弃用

已弃用

已弃用

camel-hazelcast

camel-hbase

camel-hdfs

已弃用

camel-hdfs2

camel-headersmap

camel-hipchat

camel-http

已弃用

已弃用

camel-http4

camel-hystrix

camel-ibatis

已弃用

camel-iec60870

camel-ignite

camel-imap

camel-infinispan

camel-influxdb

camel-ipfs

camel-irc

camel-ironmq

camel-jasypt

camel-javaspace

已弃用

camel-jbpm

camel-jcache

camel-jcifs

camel-jclouds

camel-jcr

camel-jdbc

camel-jetty

已弃用

已弃用

已弃用

camel-jetty8

camel-jetty9

camel-jgroups

camel-jing

camel-jira

camel-jms

camel-jmx

camel-jolt

camel-josql

已弃用

已弃用

已弃用

camel-jpa

camel-jsch

camel-json-validator

camel-jt400

camel-juel

已弃用

已弃用

已弃用

camel-kafka

camel-kestrel

已弃用

已弃用

已弃用

camel-krati

已弃用

已弃用

已弃用

camel-kubernetes

camel-kura

camel-ldap

camel-ldif

camel-leveldb

camel-linkedin

camel-log

camel-lpr

camel-lra

camel-lucene

camel-lumberjack

camel-master

camel-mail

camel-metrics

camel-micrometer

camel-milo

camel-mina

已弃用

camel-mina2

camel-mllp

camel-mock

camel-mongodb

camel-mongodb-gridfs

camel-mongodb3

camel-mqtt

已弃用

已弃用

已弃用

已弃用

camel-msv

camel-mustache

camel-mvel

camel-mybatis

camel-nagios

camel-nats

camel-netty

已弃用

已弃用

camel-netty-http

已弃用

已弃用

camel-netty4

camel-netty4-http

camel-nsq

camel-olingo2

camel-olingo4

camel-openapi-java

camel-openshift

已弃用

camel-openstack

camel-opentracing

camel-optaplanner

camel-paho

camel-paxlogging

camel-pdf

camel-pgevent

camel-pop3

camel-printer

camel-properties

camel-pubnub

camel-pulsar

camel-quartz

已弃用

camel-quartz2

camel-quickfix

camel-rabbitmq

camel-reactive-streams

camel-reactor

camel-ref

camel-rest

camel-rest-api

camel-rest-openapi

camel-rest-swagger

camel-restlet

camel-ribbon

camel-rmi

camel-routebox

已弃用

camel-rss

camel-rx

已弃用

已弃用

已弃用

camel-rxjava2

camel-saga

camel-salesforce

camel-sap

camel-sap-netweaver

camel-saxon

camel-scala

已弃用

已弃用

已弃用

camel-scheduler

camel-schematron

camel-scp

camel-scr

已弃用

已弃用

camel-script

已弃用

已弃用

已弃用

已弃用

camel-seda

camel-service

camel-servicenow

camel-servlet

camel-servletlistener

已弃用

已弃用

已弃用

camel-sftp

camel-shiro

camel-sip

camel-sjms

camel-sjms2

camel-slack

camel-smpp

camel-snakeyaml

camel-snmp

camel-solr

camel-spark

camel-spark-rest

camel-splunk

camel-spring

camel-spring-batch

camel-spring-boot

camel-spring-cloud

camel-spring-cloud-consul

camel-spring-cloud-netflix

camel-spring-cloud-zookeeper

camel-spring-event

camel-spring-integration

camel-spring-javaconfig

camel-spring-ldap

camel-spring-redis

camel-spring-security

camel-spring-ws

camel-sql

camel-sql-stored

camel-ssh

camel-stax

camel-stomp

camel-stream

camel-string-template

camel-stub

camel-swagger

已弃用

已弃用

camel-swagger-java

camel-tagsoup

camel-telegram

camel-thrift

camel-tika

camel-timer

camel-twilio

camel-twitter

camel-undertow

camel-urlrewrite

已弃用

已弃用

已弃用

camel-validator

camel-velocity

camel-vertx

camel-vm

camel-weather

camel-web3j

camel-websocket

camel-weka

camel-wordpress

camel-xchange

camel-xmlrpc

camel-xmlsecurity

camel-xmpp

camel-xquery

camel-xslt

camel-yammer

camel-yql

camel-zendesk

camel-zipkin

camel-zookeeper

camel-zookeeper-master

表 1.2. Apache Camel 数据格式支持列表

组件容器无容器Spring Boot 2.xKarafJBoss EAP

camel-asn1

camel-avro

camel-barcode

camel-base64

camel-beanio

camel-bindy

camel-boon

camel-castor

已弃用

已弃用

已弃用

camel-crypto

camel-csv

camel-fhir

camel-flatpack

camel-gzip

camel-hessian

已弃用

已弃用

已弃用

已弃用

camel-hl7

camel-ical

camel-jacksonxml

camel-jaxb

camel-jibx

camel-json-fastjson

camel-json-gson

camel-json-jackson

camel-json-johnzon

camel-json-xstream

camel-lzf

camel-mime-multipart

camel-pgp

camel-protobuf

camel-rss

camel-serialization

camel-soapjaxb

camel-string

camel-syslog

camel-tarfile

camel-thrift

camel-univocity-csv

camel-univocity-fixed

camel-univocity-tsv

camel-xmlbeans

已弃用

已弃用

已弃用

camel-xmljson

已弃用

已弃用

已弃用

已弃用

camel-xmlrpc

camel-xstream

camel-yaml-snakeyaml

camel-zip

camel-zipfile

表 1.3. Apache Camel 语言支持列表

语言容器无容器Spring Boot 2.xKarafJBoss EAP

bean 方法

常数

EL

已弃用

ExchangeProperty

File

groovy

标头

JsonPath

JXPath

已弃用

MVEL

OGNL

PHP

已弃用

已弃用

已弃用

Python

已弃用

已弃用

已弃用

Ref

Ruby

已弃用

已弃用

已弃用

Simple(简单)

SpEL

令牌化

XML 令牌化

XPath

XQuery

第 2 章 ActiveMQ

ActiveMQ 组件

ActiveMQ 组件允许消息发送到 JMS Queue 或 Topic;或使用 Apache ActiveMQ 从 JMS Queue 或 Topic 使用消息。

此组件基于 第 179 章 JMS 组件,并使用 Spring 的 JMS 支持声明事务,使用 Spring 的 JmsTemplate 来发送和接收 MessageListenerContainer 进行消耗。第 179 章 JMS 组件 组件中的所有选项也适用于此组件。

要使用此组件,请确保您的 classpath 上的 activemq.jaractivemq-core.jar 与 Camel 依赖关系(如 camel-core.jarcamel-spring.jarcamel-jms.jar.

转换和缓存

如果您在使用 JMS 的事务时,请参阅 JMS 页面中的事务和缓存级别 部分,因为它可能会影响性能。

URI 格式

activemq:[queue:|topic:]destinationName

其中 destinationName 是 ActiveMQ 队列或主题名称。默认情况下,targetName 解释为队列名称。例如,要连接到队列 FOO.BAR,请使用:

activemq:FOO.BAR

如果需要,可以包括可选 queue: 前缀:

activemq:queue:FOO.BAR

要连接到一个主题,您必须包括 主题: 前缀。例如,要连接到该主题的 Stocks.Prices,请使用:

activemq:topic:Stocks.Prices

选项

请参阅 第 179 章 JMS 组件 组件中的 Options,因为所有这些选项也适用于这个组件。

Camel on EAP 部署

该组件受到 EAP (Wildfly Camel)框架的 Camel 支持,该框架在红帽 JBoss 企业应用平台(JBoss EAP)容器上提供简化的部署模型。

您可以配置 ActiveMQ Camel 组件,以便使用嵌入式代理或外部代理。要在 JBoss EAP 容器中嵌入代理,请在 EAP 容器配置文件 进行 ActiveMQ 资源适配器中配置 ActiveMQ 资源适配器来详情,请参阅 ActiveMQ 资源适配器配置

配置连接工厂

以下 测试案例 说明了如何在使用 activeMQComponent () 方法 添加到 CamelContext 中,同时指定用于连接 ActiveMQ 的 brokerURL

camelContext.addComponent("activemq", activeMQComponent("vm://localhost?broker.persistent=false"));

使用 Spring XML 配置 ConnectionFactory

您可以在 ActiveMQComponent 上配置 ActiveMQ 代理 URL,如下所示

<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-2.0.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <camelContext xmlns="http://camel.apache.org/schema/spring">
  </camelContext>

  <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://somehost:61616"/>
  </bean>

</beans>

使用连接池

使用 Camel 发送到 ActiveMQ 代理时,建议使用池连接工厂来处理 JMS 连接、会话和制作者的有效池。这记录在 ActiveMQ Spring Support 的页面。

您可以使用 Maven 获取 Jencks AMQ 池:

    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-pool</artifactId>
      <version>5.3.2</version>
    </dependency>

然后,按照如下所示设置 activemq 组件:

    <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616" />
    </bean>

    <bean id="pooledConnectionFactory"    class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
        <property name="maxConnections" value="8" />
        <property name="connectionFactory" ref="jmsConnectionFactory" />
    </bean>

    <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="pooledConnectionFactory"/>
        <property name="concurrentConsumers" value="10"/>
    </bean>

    <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="configuration" ref="jmsConfig"/>
    </bean>
注意

请注意池连接工厂上的 initdestroy 方法。务必要确保连接池已正确启动和关闭。

然后,PooledConnectionFactory 将创建一个同时使用最多 8 个连接的连接池。每个连接可由许多会话共享。有一个名为 maxActive 的选项,可用于配置每个连接的最大会话数;默认值为 500。在 ActiveMQ 5.7 上,选项已被重命名为,以更好地反映其用途,被命名为 maxActiveSessionPerConnection。注意 并发Consumers 设置为高于 maxConnections 的值。这为好,因为每个消费者都使用会话,而作为会话可以共享同一连接,我们就安全。在这个示例中,我们可以同时有 8 * * 500 = 4000 个活跃会话。

在路由中调用 MessageListener POJO

ActiveMQ 组件还向 Processor 提供帮助 Type Converter from a JMS MessageListener。这意味着,第 44 章 Bean 组件 组件能够直接调用任何 JMS MessageListener bean。

例如,您可以在 JMS 中创建 MessageListener,如下所示:

public class MyListener implements MessageListener {
   public void onMessage(Message jmsMessage) {
       // ...
   }
}

然后,在您的路由中使用它,如下所示

from("file://foo/bar").
  bean(MyListener.class);

也就是说,您可以重复使用任何 Apache Camel 组件并将其集成到您的 JMS MessageListener POJO\!

使用 ActiveMQ 目的地选项

ActiveMQ 5.6 提供

您可以使用 "destination." 前缀在 endpoint uri 中配置 Destination Options。例如,要将消费者标记为独占,并将其预先大小设定为 50,您可以执行以下操作:

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="file://src/test/data?noop=true"/>
    <to uri="activemq:queue:foo"/>
  </route>
  <route>
    <!-- use consumer.exclusive ActiveMQ destination option, notice we have to prefix with destination. -->
    <from uri="activemq:foo?destination.consumer.exclusive=true&amp;destination.consumer.prefetchSize=50"/>
    <to uri="mock:results"/>
  </route>
</camelContext>

使用公告消息

ActiveMQ 可以生成公告消息,它们放入您可以使用的主题。这些消息可以帮助您发送警报,以检测缓慢的消费者或者构建统计信息(每天的信息/生成的数量等) 以下 Spring DSL 示例显示如何从主题读取消息。

<route>
	<from uri="activemq:topic:ActiveMQ.Advisory.Connection?mapJmsMessage=false" />
	<convertBodyTo type="java.lang.String"/>
	<transform>
	     <simple>${in.body}&#13;</simple>
	</transform>
	<to uri="file://data/activemq/?fileExist=Append&ileName=advisoryConnection-${date:now:yyyyMMdd}.txt" />
</route>

如果您在队列上使用消息,您应该会看到 data/activemq 文件夹下的以下文件:

advisoryConnection-20100312.txt advisoryProducer-20100312.txt

并包含字符串:

      ActiveMQMessage {commandId = 0, responseRequired = false, messageId = ID:dell-charles-3258-1268399815140
      -1:0:0:0:221, originalDestination = null, originalTransactionId = null, producerId = ID:dell-charles-
      3258-1268399815140-1:0:0:0, destination = topic://ActiveMQ.Advisory.Connection, transactionId = null,
      expiration = 0, timestamp = 0, arrival = 0, brokerInTime = 1268403383468, brokerOutTime = 1268403383468,
      correlationId = null, replyTo = null, persistent = false, type = Advisory, priority = 0, groupID = null,
      groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null,
      marshalledProperties = org.apache.activemq.util.ByteSequence@17e2705, dataStructure = ConnectionInfo
      {commandId = 1, responseRequired = true, connectionId = ID:dell-charles-3258-1268399815140-2:50,
      clientId = ID:dell-charles-3258-1268399815140-14:0, userName = , password = *****,
      brokerPath = null, brokerMasterConnector = false, manageable = true, clientMaster = true},
      redeliveryCounter = 0, size = 0, properties = {originBrokerName=master, originBrokerId=ID:dell-charles-
      3258-1268399815140-0:0, originBrokerURL=vm://master}, readOnlyProperties = true, readOnlyBody = true,
      droppable = false}

获取组件 JAR

您需要此依赖项:

  • activemq-camel

ActiveMQ 是与 ActiveMQ 项目 发布的 第 179 章 JMS 组件 组件的扩展。

<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-camel</artifactId>
  <version>5.6.0</version>
</dependency>

第 3 章 AHC 组件

可作为 Camel 版本 2.8 使用

ahc: 组件为消耗外部 HTTP 资源(作为使用 HTTP 调用外部服务器的客户端)提供基于 HTTP 的端点。
组件使用 Async Http Client 库。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ahc</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

3.1. URI 格式

ahc:http://hostname[:port][/resourceUri][?options]
ahc:https://hostname[:port][/resourceUri][?options]

默认情况下,将端口 80 用于 HTTP,443 用于 HTTPS。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

3.2. AhcEndpoint 选项

AHC 端点使用 URI 语法进行配置:

ahc:httpUri

使用以下路径和查询参数:

3.2.1. 路径名(1 参数):

名称描述默认类型

httpUri

要使用的 URI,如 http://hostname:port/path

 

URI

3.2.2. 查询参数(13 参数):

名称描述默认类型

bridgeEndpoint (producer)

如果 选项为 true,则忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 请求。您也可以将 throwExceptionOnFailure 设为 false,以便 AhcProducer 发送所有故障响应。

false

布尔值

bufferSize (producer)

在 Camel 和 AHC 客户端之间传输数据时使用的初始内存缓冲大小。

4096

int

connectionClose (producer)

定义是否需要将 Connection Close 标头添加到 HTTP Request 中。此参数默认为 false

false

布尔值

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

headerFilterStrategy (producer)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

throwExceptionOnFailure (producer)

如果来自远程服务器的失败响应,禁用引发 AhcOperationFailedException 的选项。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

transferException (producer)

如果启用并交换在消费者端的处理失败,如果导致的 Exception 在响应中作为 application/x-java-serialized-object 内容类型(例如,使用 Jetty 或 Servlet Camel 组件)发送了序列化处理。在制作者端,异常会按原样进行反序列化和引发,而不是 AhcOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

binding (advanced)

使用自定义 AhcBinding,它可以控制如何在 AHC 和 Camel 之间绑定。

 

AhcBinding

clientConfig (advanced)

将 AsyncHttpClient 配置为使用自定义 com.ning.http.client.AsyncHttpClientConfig 实例。

 

AsyncHttpClientConfig

clientConfigOptions (advanced)

使用 map 中的键/值配置 AsyncHttpClientConfig。

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

clientConfigRealmOptions (security)

使用 map 中的 key/value 配置 AsyncHttpClientConfig Realm。

 

map

sslContextParameters (security)

引用 registry 中的 org.apache.camel.util.jsse.SSLContextParameters。这个引用会覆盖组件级别的任何配置的 SSLContextParameters。请参阅使用 JSSE 配置实用程序。请注意,配置这个选项将覆盖通过端点或组件级别的 clientConfig 选项提供的任何 SSL/TLS 配置选项。

 

SSLContextParameters

3.3. Spring Boot Auto-Configuration

组件支持 9 个选项,如下所示。

名称描述默认类型

camel.component.ahc.allow-java-serialized-object

当请求使用 context-type=application/x-java-serialized-object (默认为 off)时,是否允许 java serialization。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

camel.component.ahc.binding

使用自定义 AhcBinding,它可以控制如何在 AHC 和 Camel 之间绑定。选项是一个 org.apache.camel.component.ahc.AhcBinding 类型。

 

字符串

camel.component.ahc.client

使用自定义 AsyncHttpClient。选项是 org.asynchttpclient.AsyncHttpClient 类型。

 

字符串

camel.component.ahc.client-config

将 AsyncHttpClient 配置为使用自定义 com.ning.http.client.AsyncHttpClientConfig 实例。选项是 org.asynchttpclient.AsyncHttpClientConfig 类型。

 

字符串

camel.component.ahc.enabled

启用 ahc 组件

true

布尔值

camel.component.ahc.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.ahc.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.ahc.ssl-context-parameters

引用 registry 中的 org.apache.camel.util.jsse.SSLContextParameters。请注意,配置这个选项将覆盖通过端点或组件级别的 clientConfig 选项提供的任何 SSL/TLS 配置选项。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.ahc.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

3.4. AhcComponent Options

AHC 组件支持 8 个选项,它们如下所列。

名称描述默认类型

client (advanced)

使用自定义 AsyncHttpClient

 

AsyncHttpClient

binding (advanced)

使用自定义 AhcBinding,它可以控制如何在 AHC 和 Camel 之间绑定。

 

AhcBinding

clientConfig (advanced)

将 AsyncHttpClient 配置为使用自定义 com.ning.http.client.AsyncHttpClientConfig 实例。

 

AsyncHttpClientConfig

sslContextParameters (security)

引用 registry 中的 org.apache.camel.util.jsse.SSLContextParameters。请注意,配置这个选项将覆盖通过端点或组件级别的 clientConfig 选项提供的任何 SSL/TLS 配置选项。

 

SSLContextParameters

allowJavaSerialized Object (advanced)

当请求使用 context-type=application/x-java-serialized-object (默认为 off)时,是否允许 java serialization。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

请注意,在 AhcComponent 上设置任何选项会将这些选项传播到正在创建的 AhcEndpoints 中。但是 AhcEndpoint 还可以配置/覆盖自定义选项。在端点上设置的选项将始终优先于 AhcComponent 中的选项。

3.5. 消息标头

名称类型描述

Exchange.HTTP_URI

字符串

要调用的 URI。将覆盖端点上直接设置的现有 URI。

Exchange.HTTP_PATH

字符串

请求 URI 的路径,标头将使用 HTTP_URI 构建请求 URI。如果路径以 "/" 开始,http producer 将尝试根据 Exchange.HTTP_BASE_URI 标头或 exchange.getFromEndpoint ().getEndpointUri ()找到相对路径;

Exchange.HTTP_QUERY

字符串

下一个 Camel 2.11: URI 参数.将覆盖端点上直接设置的现有 URI 参数。

Exchange.HTTP_RESPONSE_CODE

int

外部服务器的 HTTP 响应代码。为 200,表示确定。

Exchange.HTTP_CHARACTER_ENCODING

字符串

字符编码.

Exchange.CONTENT_TYPE

字符串

HTTP 内容类型。在 IN 和 OUT 消息上设置,以提供内容类型,如 text/html

Exchange.CONTENT_ENCODING

字符串

HTTP 内容编码。在 IN 和 OUT 消息上设置,以提供内容编码,如 gzip

3.6. Message Body

Camel 会将来自外部服务器的 HTTP 响应存储在 OUT 正文中。来自 IN 消息的所有标头都将复制到 OUT 消息,因此在路由过程中保留标头。另外,Camel 还会将 HTTP 响应标头添加到 OUT 消息标头中。

3.7. 响应代码

Camel 将根据 HTTP 响应代码处理:

  • 响应代码位于 100.299 范围中,Camel 被视为成功的响应。
  • 响应代码位于 300..399 范围中,Camel 被视为重定向响应,并将使用信息抛出 AhcOperationFailedException
  • 响应代码为 400+,Camel 将它作为外部服务器故障相关,并将引发 AhcOperationFailedException 及信息。

    throwExceptionOnFailure

    选项 throwExceptionOnFailure 可以设为 false,以防止 AhcOperationFailedException 引发失败的响应代码。这可让您从远程服务器获得任何响应。

3.8. AhcOperationFailedException

这个例外包含以下信息:

  • HTTP 状态代码
  • HTTP 状态行(状态代码的文本)
  • 重定向位置,如果服务器返回重定向
  • 如果服务器提供了正文作为响应,响应正文作为 java.lang.String

3.9. 使用 GET 或 POST 调用

以下算法用于确定是否应该使用 GETPOST HTTP 方法:
.使用标头中提供的方法。
2.如果标头中提供了查询字符串,则 GET
3.如果端点配置了查询字符串,则 GET
4.POST 如果存在要发送的数据(其他人不是 null)。
5.否则 GET

3.10. 配置要调用的 URI

您可以直接设置 HTTP producer 的 URI 来直接组成端点 URI。在以下路由中,Camel 使用 HTTP 调用外部服务器 oldhost

from("direct:start")
        .to("ahc:http://oldhost");

以及对等的 Spring 示例:

<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:start"/>
    <to uri="ahc:http://oldhost"/>
  </route>
</camelContext>

您可以通过在消息中添加使用密钥 Exchange.HTTP_URI 的标头来覆盖 HTTP 端点 URI。

from("direct:start")
    .setHeader(Exchange.HTTP_URI, constant("http://newhost"))
    .to("ahc:http://oldhost");

3.11. 配置 URI 参数

ahc producer 支持将 URI 参数发送到 HTTP 服务器。URI 参数可以直接在端点 URI 上设置,或者作为在消息中带有密钥 Exchange.HTTP_QUERY 的标头设置。

from("direct:start")
        .to("ahc:http://oldhost?order=123&detail=short");

标头中提供的 或 选项:

from("direct:start")
            .setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
        .to("ahc:http://oldhost");

3.12. 如何将 http 方法设置为 HTTP producer

HTTP 组件通过设置 message 标头来提供设置 HTTP 请求方法的方法。以下是一个示例:

from("direct:start")
            .setHeader(Exchange.HTTP_METHOD, constant("POST"))
        .to("ahc:http://www.google.com")
            .to("mock:results");

以及对等的 Spring 示例:

<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:start"/>
    <setHeader headerName="CamelHttpMethod">
        <constant>POST</constant>
    </setHeader>
    <to uri="ahc:http://www.google.com"/>
    <to uri="mock:results"/>
  </route>
</camelContext>

3.13. 配置 charset

如果使用 POST 来发送数据,您可以使用 Exchange 属性配置 charset

exchange.setProperty(Exchange.CHARSET_NAME, "iso-8859-1");

3.13.1. 端点 URI 的 URI 参数

在本例中,我们拥有完整的 URI 端点,该端点只是您在 Web 浏览器中键入的内容。可以使用 和 字符作为分隔符来设置多个 URI 参数,就像在 Web 浏览器中一样。此处 Camel 没有技巧。

// we query for Camel at the Google page
template.sendBody("ahc:http://www.google.com/search?q=Camel", null);

3.13.2. 消息中的 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("ahc:http://www.google.com/search", null, headers);

在上面的标头值中,它不应 以 前缀为 ?,您可以像 & amp; char 一样分隔参数。

3.13.3. 获取响应代码

您可以通过使用 Exchange.HTTP_RESPONSE_CODE 的 Out message 标头获取来自 AHC 组件的 HTTP 响应代码。

Exchange exchange = template.send("ahc: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);

3.14. Configuring AsyncHttpClient

AsyncHttpClient 客户端使用 AsyncHttpClientConfig 来配置客户端。如需了解更多详细信息,请参阅
Async Http Client 文档。

在 Camel 2.8 中,配置仅限于使用 AsyncHttpClientConfig.Builder 提供的构建器模式。在 Camel 2.8 中,AsyncHttpClientConfig 不支持 getters/setter,因此无法使用 Spring bean 风格(如 XML 文件中的 <bean> 标签)轻松创建/配置。

以下示例演示了如何使用构建程序来创建我们在 AhcComponent 上配置的 AsyncHttpClientConfig

在 Camel 2.9 中,AHC 组件使用 Async HTTP 库 1.6.4。这个更新的版本添加了对普通 bean 风格的配置的支持。AsyncHttpClientConfigBean 类为 AsyncHttpClientConfig 中的配置选项提供 getters 和 setters。AsyncHttpClientConfigBean 实例可以直接传递到 AHC 组件,或使用 clientConfig URI 参数在端点 URI 中引用。

Camel 2.9 中还提供直接在 URI 中设置配置选项的功能。以 "clientConfig." 开头的 URI 参数可用于设置 AsyncHttpClientConfig 的各种可配置属性。端点 URI 中指定的属性与 "clientConfig" URI 参数引用的配置中指定的属性合并,使用 "clientConfig." 参数进行设置。引用的 AsyncHttpClientConfig 实例始终为每个端点复制,使得任何之前创建的端点上的设置将保持独立于任何之前创建的端点。以下示例演示了如何使用 "clientConfig." 类型 URI 参数来配置 AHC 组件。

from("direct:start")
    .to("ahc:http://localhost:8080/foo?clientConfig.maxRequestRetry=3&clientConfig.followRedirects=true")

3.15. SSL 支持(HTTPS)

使用 JSSE 配置实用程序

从 Camel 2.9 开始,AHC 组件通过 Camel JSSE 配置实用程序 支持 SSL/TLS 配置。  这个实用程序可大大减少您需要编写的组件特定代码的数量,并在端点和组件级别进行配置。  以下示例演示了如何将 实用程序与 AHC 组件搭配使用。

组件的程序配置

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);

AhcComponent component = context.getComponent("ahc", AhcComponent.class);
component.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="ahc:https://localhost/foo?sslContextParameters=#sslContextParameters"/>
...

3.16. 另请参阅

第 4 章 AHC Websocket 组件

作为 Camel 版本 2.14 可用

ahc-ws 组件为通过 Websocket 与外部服务器通信的客户端提供基于 Websocket 的端点(作为打开与外部服务器的 websocket 连接的客户端)。
组件使用 AHC 组件,它使用了 Async Http Client 库。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ahc-ws</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

4.1. URI 格式

ahc-ws://hostname[:port][/resourceUri][?options]
ahc-wss://hostname[:port][/resourceUri][?options]

默认情况下,将端口 80 用于 ahc-wss,使用 443 作为 ahc-wss。

4.2. AHC-WS 选项

由于 AHC-WS 组件基于 AHC 组件,您可以使用 AHC 组件的不同配置选项。

AHC Websocket 组件支持 8 个选项,它们如下所列。

名称描述默认类型

client (advanced)

使用自定义 AsyncHttpClient

 

AsyncHttpClient

binding (advanced)

使用自定义 AhcBinding,它可以控制如何在 AHC 和 Camel 之间绑定。

 

AhcBinding

clientConfig (advanced)

将 AsyncHttpClient 配置为使用自定义 com.ning.http.client.AsyncHttpClientConfig 实例。

 

AsyncHttpClientConfig

sslContextParameters (security)

引用 registry 中的 org.apache.camel.util.jsse.SSLContextParameters。请注意,配置这个选项将覆盖通过端点或组件级别的 clientConfig 选项提供的任何 SSL/TLS 配置选项。

 

SSLContextParameters

allowJavaSerialized Object (advanced)

当请求使用 context-type=application/x-java-serialized-object (默认为 off)时,是否允许 java serialization。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AHC Websocket 端点使用 URI 语法配置:

ahc-ws:httpUri

使用以下路径和查询参数:

4.2.1. 路径名(1 参数):

名称描述默认类型

httpUri

要使用的 URI,如 http://hostname:port/path

 

URI

4.2.2. 查询参数(18 参数):

名称描述默认类型

bridgeEndpoint (common)

如果 选项为 true,则忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 请求。您也可以将 throwExceptionOnFailure 设为 false,以便 AhcProducer 发送所有故障响应。

false

布尔值

bufferSize (common)

在 Camel 和 AHC 客户端之间传输数据时使用的初始内存缓冲大小。

4096

int

headerFilterStrategy (common)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

throwExceptionOnFailure (common)

如果来自远程服务器的失败响应,禁用引发 AhcOperationFailedException 的选项。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

transferException (common)

如果启用并交换在消费者端的处理失败,如果导致的 Exception 在响应中作为 application/x-java-serialized-object 内容类型(例如,使用 Jetty 或 Servlet Camel 组件)发送了序列化处理。在制作者端,异常会按原样进行反序列化和引发,而不是 AhcOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendMessageOnError (consumer)

如果 web-socket 侦听器收到错误,是否发送一条消息。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

connectionClose (producer)

定义是否需要将 Connection Close 标头添加到 HTTP Request 中。此参数默认为 false

false

布尔值

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

useStreaming (producer)

要启用流将数据作为多个文本片段发送。

false

布尔值

binding (advanced)

使用自定义 AhcBinding,它可以控制如何在 AHC 和 Camel 之间绑定。

 

AhcBinding

clientConfig (advanced)

将 AsyncHttpClient 配置为使用自定义 com.ning.http.client.AsyncHttpClientConfig 实例。

 

AsyncHttpClientConfig

clientConfigOptions (advanced)

使用 map 中的键/值配置 AsyncHttpClientConfig。

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

clientConfigRealmOptions (security)

使用 map 中的 key/value 配置 AsyncHttpClientConfig Realm。

 

map

sslContextParameters (security)

引用 registry 中的 org.apache.camel.util.jsse.SSLContextParameters。这个引用会覆盖组件级别的任何配置的 SSLContextParameters。请参阅使用 JSSE 配置实用程序。请注意,配置这个选项将覆盖通过端点或组件级别的 clientConfig 选项提供的任何 SSL/TLS 配置选项。

 

SSLContextParameters

4.3. Spring Boot Auto-Configuration

组件支持 9 个选项,如下所示。

名称描述默认类型

camel.component.ahc-ws.allow-java-serialized-object

当请求使用 context-type=application/x-java-serialized-object (默认为 off)时,是否允许 java serialization。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

camel.component.ahc-ws.binding

使用自定义 AhcBinding,它可以控制如何在 AHC 和 Camel 之间绑定。选项是一个 org.apache.camel.component.ahc.AhcBinding 类型。

 

字符串

camel.component.ahc-ws.client

使用自定义 AsyncHttpClient。选项是 org.asynchttpclient.AsyncHttpClient 类型。

 

字符串

camel.component.ahc-ws.client-config

将 AsyncHttpClient 配置为使用自定义 com.ning.http.client.AsyncHttpClientConfig 实例。选项是 org.asynchttpclient.AsyncHttpClientConfig 类型。

 

字符串

camel.component.ahc-ws.enabled

启用 ahc-ws 组件

true

布尔值

camel.component.ahc-ws.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.ahc-ws.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.ahc-ws.ssl-context-parameters

引用 registry 中的 org.apache.camel.util.jsse.SSLContextParameters。请注意,配置这个选项将覆盖通过端点或组件级别的 clientConfig 选项提供的任何 SSL/TLS 配置选项。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.ahc-ws.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

4.4. 通过 Websocket 编写和阅读数据

ahc-ws 端点可以根据端点分别配置为制作者或消费者,将数据写入套接字或从套接字读取。

4.5. 配置 URI 以写入或读取数据

在以下路由中,Camel 将写入指定的 websocket 连接。

from("direct:start")
        .to("ahc-ws://targethost");

以及对等的 Spring 示例:

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <to uri="ahc-ws://targethost"/>
  </route>
</camelContext>

在以下路由中,Camel 会从指定的 websocket 连接中读取。

from("ahc-ws://targethost")
        .to("direct:next");

以及对等的 Spring 示例:

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="ahc-ws://targethost"/>
    <to uri="direct:next"/>
  </route>
</camelContext>

 

4.6. 另请参阅

第 5 章 AMQP 组件

可作为 Camel 版本 1.2 提供

amqp: 组件支持使用 Qpid 项目的 JMS 客户端 API 的 AMQP 1.0 协议。如果要使用 AMQP 0.9 (特别是 RabbitMQ 中),您可能还对 Camel RabbitMQ 组件感兴趣。请注意,在 Camel 2.17.0 AMQP 组件之前支持 AMQP 0.9 及更高版本,但从 Camel 2.17.0 开始,它只支持 AMQP 1.0。

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>

5.1. URI 格式

amqp:[queue:|topic:]destinationName[?options]

5.2. AMQP 选项

您可以在目的地名称后指定 JMS 组件的所有配置选项。

AMQP 组件支持下面列出的 81 选项。

名称描述默认类型

配置 (高级)

使用共享的 JMS 配置

 

JmsConfiguration

acceptMessagesWhile Stopping (consumer)

指定使用者接受消息在停止时是否指定。如果您在运行时启动和停止 JMS 路由,则请考虑启用这个选项,同时队列上仍有消息 enqueued。如果这个选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试重定位,但再次再次可能被拒绝,最后消息可能会在 JMS 代理上的死信队列移动。为了避免这一建议启用这个选项。

false

布尔值

allowReplyManagerQuick Stop (consumer)

如果 JmsConfiguration#isAcceptMessagesWhileStopping 在启用 JmsConfiguration#isAcceptMessagesWhileStopping 时,并且 org.apache.camel.Camel.CamelContext 当前已经停止。常规 JMS 用户默认启用这一快速停止功能,但为了回复经理,您必须启用此标志。

false

布尔值

acknowledgementMode (consumer)

JMS 确认模式定义为 Integer。允许您将特定于供应商的扩展设置为 acknowledgment 模式。对于常规模式,最好使用 acknowledgementModeName。

 

int

eagerLoadingOf Properties (消费者)

在加载消息时立即加载 JMS 属性,因为可能不需要 JMS 属性,但有时可能会遇到底层 JMS 提供程序及使用 JMS 属性的早期问题。

false

布尔值

acknowledgementModeName (consumer)

JMS 确认名称之一: SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE

AUTO_ ACKNOWLEDGE

字符串

autoStartup (consumer)

指定使用者容器是否应该自动启动。

true

布尔值

cacheLevel (consumer)

根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。

 

int

cacheLevelName (consumer)

按照底层 JMS 资源的名称设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。

CACHE_AUTO

字符串

replyToCacheLevelName (producer)

在通过 JMS 进行请求/回复消费者时,按照名称设置缓存级别。这个选项只适用于使用固定的回复队列(而不是临时)。Camel 默认使用:CACHE_CONSUMER 用于独占或共享 w/ replyToSelectorName。以及在没有 replyToSelectorName 的情况下共享的 CACHE_SESSION。有些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注:如果使用临时队列,则不允许使用 CACHE_NONE,且必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。

 

字符串

clientId (common)

设置要使用的 JMS 客户端 ID。请注意,这个值必须是唯一的,且只能供单个 JMS 连接实例使用。通常只有持久主题订阅才是必需的。如果使用 Apache ActiveMQ,您可以改为使用虚拟主题。

 

字符串

concurrentConsumers (consumer)

指定使用 JMS 时的默认并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项回复ToConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

1

int

replyToConcurrent Consumers (producer)

指定在进行请求/相对于 JMS 时的默认并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

1

int

connectionFactory (common)

要使用的连接工厂。必须在组件或端点上配置连接工厂。

 

ConnectionFactory

username (security)

用于 ConnectionFactory 的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

密码 (安全)

要用于 ConnectionFactory 的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

deliveryPersistent (producer)

指定是否默认使用持久交付。

true

布尔值

deliveryMode (producer)

指定要使用的交付模式。Possibles 值由 javax.jms.DeliveryMode 定义。NON_PERSISTENT = 1 和 PERSISTENT = 2.

 

整数

durableSubscriptionName (common)

指定持久主题订阅的持久订阅者名称。还必须配置 clientId 选项。

 

字符串

exceptionListener (advanced)

指定任何底层 JMS 异常通知的 JMS Exception Listener。

 

ExceptionListener

errorHandler (advanced)

指定在处理消息时出现任何意外异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些异常会记录在 WARN 级别。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录堆栈追踪。这样可以更容易配置,而不是对自定义错误处理程序进行编码。

 

ErrorHandler

errorHandlerLogging Level (logging)

允许配置默认错误处理程序日志记录级别,以记录异常。

WARN

LoggingLevel

errorHandlerLogStack Trace (logging)

允许控制是否应该记录堆栈追踪,默认错误处理程序。

true

布尔值

explicitQosEnabled (producer)

设定在发送消息时应使用 deliveryMode、priority 或 timeToLive 服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,从 Camel In message 标头专门读取 QoS 属性。

false

布尔值

exposeListenerSession (consumer)

指定在消耗消息时是否应公开监听程序会话。

false

布尔值

idleTaskExecutionLimit (advanced)

指定接收任务的空闲执行的限制,没有在其执行过程中收到任何信息。如果达到这个限制,任务将关闭并离开其他执行任务(在出现动态调度的情况下),请参阅 maxConcurrentConsumers 设置。Spring 还有额外的文档。

1

int

idleConsumerLimit (advanced)

指定允许在任何给定时间闲置的用户数量的限制。

1

int

maxConcurrentConsumers (consumer)

指定来自 JMS 时的最大并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

 

int

replyToMaxConcurrent Consumers (producer)

指定在 JMS 中使用请求/回复时的最大并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

 

int

replyOnTimeoutToMax ConcurrentConsumers (producer)

指定在使用 request/reply over JMS 时超时发生时持续路由的并发使用者的最大数量。

1

int

maxMessagesPerTask (advanced)

每个任务的消息数量。-1 代表无限。如果您为并发使用者使用范围(如 min max),则此选项可用于将值设置为 eg 100 来控制在不需要较少工作时消费者的快速程度。

-1

int

messageConverter (advanced)

要使用自定义的 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。

 

MessageConverter

mapJmsMessage (advanced)

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。

true

布尔值

messageIdEnabled (advanced)

发送时,指定是否应添加消息 ID。这只是 JMS 代理的提示。如果 JMS 提供程序接受此提示,这些消息必须将消息 ID 设置为 null;如果提供商忽略 hint,消息 ID 必须设置为其正常的唯一值

true

布尔值

messageTimestampEnabled (advanced)

指定在发送消息时是否应默认启用时间戳。这只是一个到 JMS 代理的提示。如果 JMS 供应商接受这个 hint,这些消息必须将时间戳设置为零。如果供应商忽略了提示,时间戳必须设置为其正常值

true

布尔值

alwaysCopyMessage (producer)

如果为 true,则 Camel 将始终将消息的 JMS 消息副本传递给发送的制作者。在某些情况下,需要复制消息,例如当设置了 replyToDestinationSelectorName 时(通常,Camel 会将 alwaysCopyMessage 选项设置为 true,如设置了 replyToDestinationSelectorName)

false

布尔值

使用MessageIDAs CorrelationID (advanced)

指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。

false

布尔值

priority (producer)

高于 1 的值在发送时指定消息优先级(其中 0 是最低优先级),以及 9 是最高优先级。还必须启用显式QosEnabled 选项,才能使此选项生效。

4

int

pubSubNoLocal (advanced)

指定是否禁止交付其自身连接发布的消息。

false

布尔值

receiveTimeout (advanced)

接收消息的超时时间(以毫秒为单位)。

1000

long

recoveryInterval (advanced)

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

long

taskExecutor (consumer)

允许您指定自定义任务 executor 来使用消息。

 

TaskExecutor

deliveryDelay (producer)

设置用于 JMS 的发送调用的交付延迟。这个选项需要 JMS 2.0 兼容代理。

-1

long

timeToLive (producer)

发送消息时,指定消息的时间(以毫秒为单位)。

-1

long

transacted (transaction)

指定是否使用翻译模式

false

布尔值

lazyCreateTransaction Manager (transaction)

如果为 true,如果选项 transacted=true 中没有注入事务管理器,Camel 会创建一个 JmsTransactionManager。

true

布尔值

transactionManager (transaction)

要使用的 Spring 事务管理器。

 

platformTransaction Manager

transactionName (transaction)

要使用的事务的名称。

 

字符串

transactionTimeout (transaction)

事务的超时值(以秒为单位)。

-1

int

testConnectionOn Startup (common)

指定是否在启动时测试连接。这可确保当 Camel 启动时,所有 JMS 用户都具有与 JMS 代理的有效连接。如果无法授予连接,Camel 会在启动时抛出异常。这样可确保 Camel 没有启动失败的连接。JMS 生产商也进行了测试。

false

布尔值

asyncStartListener (advanced)

启动路由时是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

asyncStopListener (advanced)

在停止路由时,是否异步停止 JmsConsumer 消息监听程序。

false

布尔值

forceSendOriginal Message (producer)

在使用 mapJmsMessage=false Camel 时,如果您在路由期间接触标头(get 或 set)时,将创建一个新的 JMS 消息来发送到新的 JMS 目标。将这个选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。

false

布尔值

requestTimeout (producer)

在使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此每个消息单独的超时值。另请参阅 requestTimeoutCheckerInterval 选项。

20000

long

requestTimeoutChecker Interval (advanced)

配置在通过 JMS 进行请求时,Camel 应该检查超时交换的频率。默认情况下,Camel 会检查每秒一次。但是,如果发生超时时您必须更快地做出反应,那么您可以降低这个间隔,以更频繁地检查。超时由选项 requestTimeout 决定。

1000

long

transferExchange (advanced)

您可以通过线路传输交换,而不只是正文和标头。传输以下字段如下:正文、出站正文、容错正文、入口、出口标头、容错标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用此选项,因此 Camel 知道有效负载是 Exchange,而非常规有效负载。

false

布尔值

transferException (高级)

如果启用并且您正在使用 Request Reply messaging (InOut),并且一个 Exchange 在使用者端失败,则会导致 Exception 发回为 javax.jms.ObjectMessage。如果客户端是 Camel,则返回的 Exception 会被重新箭头。这样,您可以使用 Camel JMS 作为路由中的网桥 - 例如,使用持久性队列来启用可靠的路由。请注意,如果您也启用了 transferExchange,则此选项将具有优先权。请注意的异常需要是序列化的。使用者端的原始例外可以包装在外部异常中,如 org.apache.camel.RuntimeCamelException (返回到制作者)。

false

布尔值

transferFault (advanced)

如果启用且您使用 Request Reply messaging (InOut)和 Exchange failed,在消费者端使用 SOAP 故障(而非例外),则 Message#isFault ()上的故障标记将重新发送作为带有键 org.apache.camelcomponent.jms.JmsConstants#JMS_TRATRATRATRATER_JMS_TRATER_JMS 头条的 JMS 标头。如果客户端是 Camel,则返回的 fault 标志将在 org.apache.camel.Message#setFault (布尔值)上设置。在使用支持故障的 Camel 组件(如 cxf 或 spring-ws)时,您可能需要启用此功能。

false

布尔值

jmsOperations (advanced)

允许您使用自己实施 org.springframework.jms.core.JmsOperations 接口。Camel 使用 JmsTemplate 作为默认值。可用于测试目的,但不如 spring API 文档中所述。

 

JmsOperations

destinationResolver (advanced)

可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找真实目的地)。

 

DestinationResolver

replyToType (producer)

允许显式指定在进行请求/恢复 JMS 时用于回复队列的策略。可能的值有:Trimporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。此选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档了解更多详情,特别是有关在集群环境中运行时所造成影响的备注,以及共享回复队列的性能比其 alternatives Temporary 和 Exclusive 的性能有不同。

 

ReplyToType

preserveMessageQos (producer)

设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或部分功能。如果没有提供,Camel 将回退为使用来自端点的值。因此,在使用这个选项时,标头会覆盖端点中的值。相反,显式QosEnabled 选项只会使用在端点上设置的选项,而不是消息标头中的值。

false

布尔值

asyncConsumer (consumer)

JmsConsumer 是否异步处理 Exchange。如果启用,则 JmsConsumer 可能会从 JMS 队列获取下一个消息,而上一消息正在异步处理(通过异步路由引擎)。这意味着,消息可以被严格处理,按顺序处理。如果禁用(默认),则在 JmsConsumer 将从 JMS 队列中获取下一个消息之前,将完全处理 Exchange。请注意,如果已启用翻译,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。

false

布尔值

allowNullBody (producer)

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

includeSentJMS MessageID (producer)

仅适用于使用 InOnly 发送到 JMS 目的地(请触发和忘记)。启用此选项将丰富的 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID 一起丰富。

false

布尔值

includeAllJMSX Properties (advanced)

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

默认TaskExecutor Type (使用者)

指定在 DefaultMessageListenerContainer 中使用哪些默认 TaskExecutor 类型,用于使用者端点和制作者端点的 ReplyTo consumer。可能的值有: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用具有最优值的 Spring 的 ThreadPoolTaskExecutor)。如果没有设置,则默认为之前的行为,它将缓存的线程池用于消费者端点和 SimpleAsync 回复消费者消费者。建议使用 ThreadPool 以减少弹性配置中的线程回收,并动态增加和减少并发用户。

 

DefaultTaskExecutor Type

jmsKeyFormatStrategy (advanced)

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了两个开箱即用的实现:默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

JmsKeyFormatStrategy

allowAdditionalHeaders (producer)

此选项用于允许可能具有根据 JMS 规格无效的值的额外标头。例如,一些消息系统(如 WMQ)使用前缀 JMS_IBM_MQMD_(包含字节阵列或其他无效类型的值)使用标头名称来执行此操作。您可以用逗号分隔的多个标头名称,并用作通配符匹配后缀。

 

字符串

queueBrowseStrategy (advanced)

在浏览队列时使用自定义 QueueBrowseStrategy

 

QueueBrowseStrategy

messageCreatedStrategy (advanced)

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

waitForProvision CorrelationToBeUpdated Counter (advanced)

在对 JMS 进行请求/恢复请求时,等待 provisional 关联 id 会被更新为实际关联 id 的次数,以及选项 useMessageIDAsCorrelationID。

50

int

waitForProvision CorrelationToBeUpdated ThreadSleepingTime (advanced)

millis 在等待 provisional correlation id 被更新期间,每次处于睡眠状态的时间间隔。

100

long

correlationProperty (producer)

使用此 JMS 属性将消息与 InOut Exchange 模式(request-reply)而不是 JMSCorrelationID 属性关联。这样,您可以使用 JMSCorrelationID JMS 属性将消息与不关联消息的系统交换。如果未使用 JMSCorrelationID,则 Camel 将不会被使用或设置。如果未在同一名称下的消息标题中提供,则生成此指定属性的值。

 

字符串

subscriptionDurable (consumer)

设置是否使订阅持久。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认为 false。将其设置为 true 以注册持久的订阅,通常与 subscriptionName 值结合使用(除非您的消息监听器类名称足够好作为订阅名称)。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。

false

布尔值

subscriptionShared (consumer)

设置是否使订阅共享。可以通过 subscriptionName 属性指定要使用的共享订阅名称。默认为 false。将其设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称已足够符合订阅名称)。请注意,共享订阅也可能是持久的,因此此标志也可以(并经常将)与订阅相整合。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。

false

布尔值

subscriptionName (consumer)

设置要创建的订阅的名称。要应用一个带有共享或 durable 订阅的主题(pub-sub 域)。订阅名称需要在这个客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发使用者(默认是此消息监听器容器),但共享订阅除外(需要 JMS 2.0)。

 

字符串

streamMessageType Enabled (producer)

设定是否启用 StreamMessage 类型。消息有效负载的流传输类型(如文件、InputStream 等)将作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪一种类型。默认情况下使用 BytesMessage,它强制读取到内存中的完整消息有效负载。通过启用此选项,消息有效负载在块中读取到内存中,每个块都会写入 StreamMessage,直到没有更多数据。

false

布尔值

formatDateHeadersTo Iso8601 (producer)

设置日期标头是否应该根据 ISO 8601 标准进行格式化。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AMQP 端点使用 URI 语法配置:

amqp:destinationType:destinationName

使用以下路径和查询参数:

5.2.1. 路径名(2 参数):

名称描述默认类型

destinationType

要使用的目的地种类

队列

字符串

destinationName

用作目的地的队列或主题 所需的 名称

 

字符串

5.2.2. 查询参数(92 参数):

名称描述默认类型

clientId (common)

设置要使用的 JMS 客户端 ID。请注意,这个值必须是唯一的,且只能供单个 JMS 连接实例使用。通常只有持久主题订阅才是必需的。如果使用 Apache ActiveMQ,您可以改为使用虚拟主题。

 

字符串

connectionFactory (common)

要使用的连接工厂。必须在组件或端点上配置连接工厂。

 

ConnectionFactory

disableReplyTo (common)

指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目标发送回复。如果您希望 Camel 从路由消耗,且您不希望 Camel 自动发送回复消息,因为代码中的其他组件会处理回复消息。如果要使用 Camel 作为不同消息代理间的代理,并希望从一个系统路由到另一个系统,也可以使用这个选项。

false

布尔值

durableSubscriptionName (common)

指定持久主题订阅的持久订阅者名称。还必须配置 clientId 选项。

 

字符串

jmsMessageType (common)

允许您强制使用特定的 javax.jms.Message 实施来发送 JMS 消息。可能的值有:Bytes, Map, Object, Stream, Text。默认情况下,Camel 将决定要从 In body 类型中使用的 JMS 消息类型。此选项允许您指定它。

 

JmsMessageType

testConnectionOnStartup (common)

指定是否在启动时测试连接。这可确保当 Camel 启动时,所有 JMS 用户都具有与 JMS 代理的有效连接。如果无法授予连接,Camel 会在启动时抛出异常。这样可确保 Camel 没有启动失败的连接。JMS 生产商也进行了测试。

false

布尔值

acknowledgementModeName (consumer)

JMS 确认名称之一: SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE

AUTO_ ACKNOWLEDGE

字符串

asyncConsumer (consumer)

JmsConsumer 是否异步处理 Exchange。如果启用,则 JmsConsumer 可能会从 JMS 队列获取下一个消息,而上一消息正在异步处理(通过异步路由引擎)。这意味着,消息可以被严格处理,按顺序处理。如果禁用(默认),则在 JmsConsumer 将从 JMS 队列中获取下一个消息之前,将完全处理 Exchange。请注意,如果已启用翻译,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。

false

布尔值

autoStartup (consumer)

指定使用者容器是否应该自动启动。

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

cacheLevel (consumer)

根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。

 

int

cacheLevelName (consumer)

按照底层 JMS 资源的名称设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。

CACHE_AUTO

字符串

concurrentConsumers (consumer)

指定使用 JMS 时的默认并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项回复ToConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

1

int

maxConcurrentConsumers (consumer)

指定来自 JMS 时的最大并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

 

int

replyTo (consumer)

提供显式 ReplyTo 目标,可覆盖 Message.getJMSReplyTo ()的任何传入值。

 

字符串

replyToDeliveryPersistent (consumer)

指定是否默认将持久发送用于回复。

true

布尔值

selector (consumer)

设置要使用的 JMS 选择器

 

字符串

subscriptionDurable (consumer)

设置是否使订阅持久。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认为 false。将其设置为 true 以注册持久的订阅,通常与 subscriptionName 值结合使用(除非您的消息监听器类名称足够好作为订阅名称)。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。

false

布尔值

subscriptionName (consumer)

设置要创建的订阅的名称。要应用一个带有共享或 durable 订阅的主题(pub-sub 域)。订阅名称需要在这个客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发使用者(默认是此消息监听器容器),但共享订阅除外(需要 JMS 2.0)。

 

字符串

subscriptionShared (consumer)

设置是否使订阅共享。可以通过 subscriptionName 属性指定要使用的共享订阅名称。默认为 false。将其设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称已足够符合订阅名称)。请注意,共享订阅也可能是持久的,因此此标志也可以(并经常将)与订阅相整合。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。

false

布尔值

acceptMessagesWhileStopping (consumer)

指定使用者接受消息在停止时是否指定。如果您在运行时启动和停止 JMS 路由,则请考虑启用这个选项,同时队列上仍有消息 enqueued。如果这个选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试重定位,但再次再次可能被拒绝,最后消息可能会在 JMS 代理上的死信队列移动。为了避免这一建议启用这个选项。

false

布尔值

allowReplyManagerQuickStop (consumer)

如果 JmsConfiguration#isAcceptMessagesWhileStopping 在启用 JmsConfiguration#isAcceptMessagesWhileStopping 时,并且 org.apache.camel.Camel.CamelContext 当前已经停止。常规 JMS 用户默认启用这一快速停止功能,但为了回复经理,您必须启用此标志。

false

布尔值

consumerType (consumer)

要使用的使用者类型,可以是:简单、默认或 Custom。使用者类型决定要使用的 Spring JMS 侦听器。默认情况下,将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,SimpleMessageListenerContainer 将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,由 messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 将决定要使用的 org.springframework.jms.listener.AbstractMessageListenerContainer。

默认

ConsumerType

defaultTaskExecutorType (consumer)

指定在 DefaultMessageListenerContainer 中使用哪些默认 TaskExecutor 类型,用于使用者端点和制作者端点的 ReplyTo consumer。可能的值有: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用具有最优值的 Spring 的 ThreadPoolTaskExecutor)。如果没有设置,则默认为之前的行为,它将缓存的线程池用于消费者端点和 SimpleAsync 回复消费者消费者。建议使用 ThreadPool 以减少弹性配置中的线程回收,并动态增加和减少并发用户。

 

DefaultTaskExecutor Type

eagerLoadingOfProperties (consumer)

在加载消息时立即加载 JMS 属性和有效负载,这通常不需要 JMS 属性,但有时可能会遇到底层 JMS 提供程序的问题以及 JMS 属性的使用。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

exposeListenerSession (consumer)

指定在消耗消息时是否应公开监听程序会话。

false

布尔值

replyToSameDestination Allowed (consumer)

JMS 使用者是否允许回复消息到消费者用于使用的同一目的地。这可防止消耗和将相同的消息发回到自身来防止死循环。

false

布尔值

taskExecutor (consumer)

允许您指定自定义任务 executor 来使用消息。

 

TaskExecutor

deliveryDelay (producer)

设置用于 JMS 的发送调用的交付延迟。这个选项需要 JMS 2.0 兼容代理。

-1

long

deliveryMode (producer)

指定要使用的交付模式。Possibles 值由 javax.jms.DeliveryMode 定义。NON_PERSISTENT = 1 和 PERSISTENT = 2.

 

整数

deliveryPersistent (producer)

指定是否默认使用持久交付。

true

布尔值

explicitQosEnabled (producer)

设定在发送消息时应使用 deliveryMode、priority 或 timeToLive 服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,从 Camel In message 标头专门读取 QoS 属性。

false

布尔值

formatDateHeadersToIso8601 (producer)

设置 JMS date 属性是否应该根据 ISO 8601 标准进行格式化。

false

布尔值

preserveMessageQos (producer)

设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或部分功能。如果没有提供,Camel 将回退为使用来自端点的值。因此,在使用这个选项时,标头会覆盖端点中的值。相反,显式QosEnabled 选项只会使用在端点上设置的选项,而不是消息标头中的值。

false

布尔值

priority (producer)

高于 1 的值在发送时指定消息优先级(其中 0 是最低优先级),以及 9 是最高优先级。还必须启用显式QosEnabled 选项,才能使此选项生效。

4

int

replyToConcurrentConsumers (producer)

指定在进行请求/相对于 JMS 时的默认并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

1

int

replyToMaxConcurrent Consumers (producer)

指定在 JMS 中使用请求/回复时的最大并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

 

int

replyToOnTimeoutMax ConcurrentConsumers (producer)

指定在使用 request/reply over JMS 时超时发生时持续路由的并发使用者的最大数量。

1

int

replyToOverride (producer)

在 JMS 消息中提供显式 ReplyTo 目标,可覆盖回复商的设置。如果要将消息转发到远程队列并接收来自 ReplyTo 目的地的回复消息,这很有用。

 

字符串

replyToType (producer)

允许显式指定在进行请求/恢复 JMS 时用于回复队列的策略。可能的值有:Trimporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。此选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档了解更多详情,特别是有关在集群环境中运行时所造成影响的备注,以及共享回复队列的性能比其 alternatives Temporary 和 Exclusive 的性能有不同。

 

ReplyToType

requestTimeout (producer)

在使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此每个消息单独的超时值。另请参阅 requestTimeoutCheckerInterval 选项。

20000

long

timeToLive (producer)

发送消息时,指定消息的时间(以毫秒为单位)。

-1

long

allowAdditionalHeaders (producer)

此选项用于允许可能具有根据 JMS 规格无效的值的额外标头。例如,一些消息系统(如 WMQ)使用前缀 JMS_IBM_MQMD_(包含字节阵列或其他无效类型的值)使用标头名称来执行此操作。您可以用逗号分隔的多个标头名称,并用作通配符匹配后缀。

 

字符串

allowNullBody (producer)

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

alwaysCopyMessage (producer)

如果为 true,则 Camel 将始终将消息的 JMS 消息副本传递给发送的制作者。在某些情况下,需要复制消息,例如当设置了 replyToDestinationSelectorName 时(通常,Camel 会将 alwaysCopyMessage 选项设置为 true,如设置了 replyToDestinationSelectorName)

false

布尔值

correlationProperty (producer)

使用 InOut Exchange 模式使用此 JMS 属性而不是 JMSCorrelationID JMS 属性来关联消息。如果设置消息将被仅与此属性 JMSCorrelationID 属性的值关联,则 Camel 不会设置。

 

字符串

disableTimeToLive (producer)

使用这个选项强制禁用时间实时。例如,当您通过 JMS 进行请求/推荐时,Camel 默认将使用 requestTimeout 值作为正在发送的消息上的实时。问题是发送者和接收器系统必须同步其时钟,因此它们正在同步。这不是始终如此容易的归档。因此,您可以使用 disableTimeToLive=true 将发送消息中的时间设置为 live 值。然后,信息不会在接收方系统中过期。如需了解更多详细信息,请参阅关于时间至 live 的部分。

false

布尔值

forceSendOriginalMessage (producer)

在使用 mapJmsMessage=false Camel 时,如果您在路由期间接触标头(get 或 set)时,将创建一个新的 JMS 消息来发送到新的 JMS 目标。将这个选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。

false

布尔值

includeSentJMSMessageID (producer)

仅适用于使用 InOnly 发送到 JMS 目的地(请触发和忘记)。启用此选项将丰富的 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID 一起丰富。

false

布尔值

replyToCacheLevelName (producer)

在通过 JMS 进行请求/回复消费者时,按照名称设置缓存级别。这个选项只适用于使用固定的回复队列(而不是临时)。Camel 默认使用:CACHE_CONSUMER 用于独占或共享 w/ replyToSelectorName。以及在没有 replyToSelectorName 的情况下共享的 CACHE_SESSION。有些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注:如果使用临时队列,则不允许使用 CACHE_NONE,且必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。

 

字符串

replyToDestinationSelector Name (producer)

使用固定名称来设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(也就是说,如果您不使用临时回复队列)。

 

字符串

streamMessageTypeEnabled (producer)

设定是否启用 StreamMessage 类型。消息有效负载的流传输类型(如文件、InputStream 等)将作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪一种类型。默认情况下使用 BytesMessage,它强制读取到内存中的完整消息有效负载。通过启用此选项,消息有效负载在块中读取到内存中,每个块都会写入 StreamMessage,直到没有更多数据。

false

布尔值

allowSerializedHeaders (advanced)

控制是否包含序列化标头。仅在 transferExchange 为 true 时才适用。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

asyncStartListener (advanced)

启动路由时是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

asyncStopListener (advanced)

在停止路由时,是否异步停止 JmsConsumer 消息监听程序。

false

布尔值

destinationResolver (advanced)

可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找真实目的地)。

 

DestinationResolver

errorHandler (advanced)

指定在处理消息时出现任何意外异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些异常会记录在 WARN 级别。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录堆栈追踪。这样可以更容易配置,而不是对自定义错误处理程序进行编码。

 

ErrorHandler

exceptionListener (advanced)

指定任何底层 JMS 异常通知的 JMS Exception Listener。

 

ExceptionListener

headerFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

idleConsumerLimit (advanced)

指定允许在任何给定时间闲置的用户数量的限制。

1

int

idleTaskExecutionLimit (advanced)

指定接收任务的空闲执行的限制,没有在其执行过程中收到任何信息。如果达到这个限制,任务将关闭并离开其他执行任务(在出现动态调度的情况下),请参阅 maxConcurrentConsumers 设置。Spring 还有额外的文档。

1

int

includeAllJMSXProperties (advanced)

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

jmsKeyFormatStrategy (advanced)

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了两个开箱即用的实现:默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

字符串

mapJmsMessage (advanced)

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。

true

布尔值

maxMessagesPerTask (advanced)

每个任务的消息数量。-1 代表无限。如果您为并发使用者使用范围(如 min max),则此选项可用于将值设置为 eg 100 来控制在不需要较少工作时消费者的快速程度。

-1

int

messageConverter (advanced)

要使用自定义的 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。

 

MessageConverter

messageCreatedStrategy (advanced)

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

messageIdEnabled (advanced)

发送时,指定是否应添加消息 ID。这只是 JMS 代理的提示。如果 JMS 提供程序接受此提示,这些消息必须将消息 ID 设置为 null;如果提供商忽略 hint,消息 ID 必须设置为其正常的唯一值

true

布尔值

messageListenerContainer Factory (advanced)

用于决定要消耗消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 registry ID。设置此设置将自动将 consumerType 设置为 Custom。

 

MessageListener ContainerFactory

messageTimestampEnabled (advanced)

指定在发送消息时是否应默认启用时间戳。这只是一个到 JMS 代理的提示。如果 JMS 供应商接受这个 hint,这些消息必须将时间戳设置为零。如果供应商忽略了提示,时间戳必须设置为其正常值

true

布尔值

pubSubNoLocal (advanced)

指定是否禁止交付其自身连接发布的消息。

false

布尔值

receiveTimeout (advanced)

接收消息的超时时间(以毫秒为单位)。

1000

long

recoveryInterval (advanced)

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

long

requestTimeoutChecker Interval (advanced)

配置在通过 JMS 进行请求时,Camel 应该检查超时交换的频率。默认情况下,Camel 会检查每秒一次。但是,如果发生超时时您必须更快地做出反应,那么您可以降低这个间隔,以更频繁地检查。超时由选项 requestTimeout 决定。

1000

long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

transferException (高级)

如果启用并且您正在使用 Request Reply messaging (InOut),并且一个 Exchange 在使用者端失败,则会导致 Exception 发回为 javax.jms.ObjectMessage。如果客户端是 Camel,则返回的 Exception 会被重新箭头。这样,您可以使用 Camel JMS 作为路由中的网桥 - 例如,使用持久性队列来启用可靠的路由。请注意,如果您也启用了 transferExchange,则此选项将具有优先权。请注意的异常需要是序列化的。使用者端的原始例外可以包装在外部异常中,如 org.apache.camel.RuntimeCamelException (返回到制作者)。

false

布尔值

transferExchange (advanced)

您可以通过线路传输交换,而不只是正文和标头。传输以下字段如下:正文、出站正文、容错正文、入口、出口标头、容错标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用此选项,因此 Camel 知道有效负载是 Exchange,而非常规有效负载。

false

布尔值

transferFault (advanced)

如果启用且您使用 Request Reply messaging (InOut)和 Exchange failed,在消费者端使用 SOAP 故障(而非例外),则 Message#isFault ()上的故障标记将重新发送作为带有键 org.apache.camelcomponent.jms.JmsConstants#JMS_TRATRATRATRATER_JMS_TRATER_JMS 头条的 JMS 标头。如果客户端是 Camel,则返回的 fault 标志将在 org.apache.camel.Message#setFault (布尔值)上设置。在使用支持故障的 Camel 组件(如 cxf 或 spring-ws)时,您可能需要启用此功能。

false

布尔值

useMessageIDAsCorrelation ID (advanced)

指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。

false

布尔值

waitForProvisionCorrelation ToBeUpdatedCounter (advanced)

在对 JMS 进行请求/恢复请求时,等待 provisional 关联 id 会被更新为实际关联 id 的次数,以及选项 useMessageIDAsCorrelationID。

50

int

waitForProvisionCorrelation ToBeUpdatedThreadSleeping Time (advanced)

millis 在等待 provisional correlation id 被更新期间,每次处于睡眠状态的时间间隔。

100

long

errorHandlerLoggingLevel (logging)

允许配置默认错误处理程序日志记录级别,以记录异常。

WARN

LoggingLevel

errorHandlerLogStackTrace (logging)

允许控制是否应该记录堆栈追踪,默认错误处理程序。

true

布尔值

密码 (安全)

要用于 ConnectionFactory 的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

username (security)

用于 ConnectionFactory 的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

transacted (transaction)

指定是否使用翻译模式

false

布尔值

lazyCreateTransaction Manager (transaction)

如果为 true,如果选项 transacted=true 中没有注入事务管理器,Camel 会创建一个 JmsTransactionManager。

true

布尔值

transactionManager (transaction)

要使用的 Spring 事务管理器。

 

platformTransaction Manager

transactionName (transaction)

要使用的事务的名称。

 

字符串

transactionTimeout (transaction)

事务的超时值(以秒为单位)。

-1

int

5.3. Spring Boot Auto-Configuration

组件支持 81 选项,它们如下所列。

名称描述默认类型

camel.component.amqp.accept-messages-while-stopping

指定使用者接受消息在停止时是否指定。如果您在运行时启动和停止 JMS 路由,则请考虑启用这个选项,同时队列上仍有消息 enqueued。如果这个选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试重定位,但再次再次可能被拒绝,最后消息可能会在 JMS 代理上的死信队列移动。为了避免这一建议启用这个选项。

false

布尔值

camel.component.amqp.acknowledgement-mode

JMS 确认模式定义为 Integer。允许您将特定于供应商的扩展设置为 acknowledgment 模式。对于常规模式,最好使用 acknowledgementModeName。

 

整数

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-null-body

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

camel.component.amqp.allow-reply-manager-quick-stop

如果 JmsConfiguration#isAcceptMessagesWhileStopping 在启用 JmsConfiguration#isAcceptMessagesWhileStopping 时,并且 org.apache.camel.Camel.CamelContext 当前已经停止。常规 JMS 用户默认启用这一快速停止功能,但为了回复经理,您必须启用此标志。

false

布尔值

camel.component.amqp.always-copy-message

如果为 true,则 Camel 将始终将消息的 JMS 消息副本传递给发送的制作者。在某些情况下,需要复制消息,例如当设置了 replyToDestinationSelectorName 时(通常,Camel 会将 alwaysCopyMessage 选项设置为 true,如设置了 replyToDestinationSelectorName)

false

布尔值

camel.component.amqp.async-consumer

JmsConsumer 是否异步处理 Exchange。如果启用,则 JmsConsumer 可能会从 JMS 队列获取下一个消息,而上一消息正在异步处理(通过异步路由引擎)。这意味着,消息可以被严格处理,按顺序处理。如果禁用(默认),则在 JmsConsumer 将从 JMS 队列中获取下一个消息之前,将完全处理 Exchange。请注意,如果已启用翻译,则 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.cache-level

根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 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,您可以改为使用虚拟主题。

 

字符串

camel.component.amqp.concurrent-consumers

指定使用 JMS 时的默认并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项回复ToConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

1

整数

camel.component.amqp.configuration

使用共享的 JMS 配置:选项是一个 org.apache.camel.component.jms.JmsConfiguration 类型。

 

字符串

camel.component.amqp.connection-factory

要使用的连接工厂。必须在组件或端点上配置连接工厂。选项是一个 javax.jms.ConnectionFactory 类型。

 

字符串

camel.component.amqp.correlation-property

使用此 JMS 属性将消息与 InOut Exchange 模式(request-reply)而不是 JMSCorrelationID 属性关联。这样,您可以使用 JMSCorrelationID JMS 属性将消息与不关联消息的系统交换。如果未使用 JMSCorrelationID,则 Camel 将不会被使用或设置。如果未在同一名称下的消息标题中提供,则生成此指定属性的值。

 

字符串

camel.component.amqp.default-task-executor-type

指定在 DefaultMessageListenerContainer 中使用哪些默认 TaskExecutor 类型,用于使用者端点和制作者端点的 ReplyTo consumer。可能的值有: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用具有最优值的 Spring 的 ThreadPoolTaskExecutor)。如果没有设置,则默认为之前的行为,它将缓存的线程池用于消费者端点和 SimpleAsync 回复消费者消费者。建议使用 ThreadPool 以减少弹性配置中的线程回收,并动态增加和减少并发用户。

 

DefaultTaskExecutor Type

camel.component.amqp.delivery-mode

指定要使用的交付模式。Possibles 值由 javax.jms.DeliveryMode 定义。NON_PERSISTENT = 1 和 PERSISTENT = 2.

 

整数

camel.component.amqp.delivery-persistent

指定是否默认使用持久交付。

true

布尔值

camel.component.amqp.destination-resolver

可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找真实目的地)。选项是一个 org.springframework.jms.support.destination.DestinationResolver 类型。

 

字符串

camel.component.amqp.durable-subscription-name

指定持久主题订阅的持久订阅者名称。还必须配置 clientId 选项。

 

字符串

camel.component.amqp.eager-loading-of-properties

在加载消息时立即加载 JMS 属性,因为可能不需要 JMS 属性,但有时可能会遇到底层 JMS 提供程序及使用 JMS 属性的早期问题。

false

布尔值

camel.component.amqp.enabled

启用 amqp 组件

true

布尔值

camel.component.amqp.error-handler

指定在处理消息时出现任何意外异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些异常会记录在 WARN 级别。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录堆栈追踪。这样可以更容易配置,而不是对自定义错误处理程序进行编码。选项是一个 org.springframework.util.ErrorHandler 类型。

 

字符串

camel.component.amqp.error-handler-log-stack-trace

允许控制是否应该记录堆栈追踪,默认错误处理程序。

true

布尔值

camel.component.amqp.error-handler-logging-level

允许配置默认错误处理程序日志记录级别,以记录异常。

 

LoggingLevel

camel.component.amqp.exception-listener

指定任何底层 JMS 异常通知的 JMS Exception Listener。选项是 javax.jms.ExceptionListener 类型。

 

字符串

camel.component.amqp.explicit-qos-enabled

设定在发送消息时应使用 deliveryMode、priority 或 timeToLive 服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,从 Camel In message 标头专门读取 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 标准进行格式化。

false

布尔值

camel.component.amqp.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.amqp.idle-consumer-limit

指定允许在任何给定时间闲置的用户数量的限制。

1

整数

camel.component.amqp.idle-task-execution-limit

指定接收任务的空闲执行的限制,没有在其执行过程中收到任何信息。如果达到这个限制,任务将关闭并离开其他执行任务(在出现动态调度的情况下),请参阅 maxConcurrentConsumers 设置。Spring 还有额外的文档。

1

整数

camel.component.amqp.include-all-j-m-s-x-properties

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

camel.component.amqp.include-sent-j-m-s-message-i-d

仅适用于使用 InOnly 发送到 JMS 目的地(请触发和忘记)。启用此选项将丰富的 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID 一起丰富。

false

布尔值

camel.component.amqp.jms-key-format-strategy

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了两个开箱即用的实现:默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。选项是一个 org.apache.camel.component.jms.JmsKeyFormatStrategy 类型。

 

字符串

camel.component.amqp.jms-operations

允许您使用自己实施 org.springframework.jms.core.JmsOperations 接口。Camel 使用 JmsTemplate 作为默认值。可用于测试目的,但不如 spring API 文档中所述。选项是一个 org.springframework.jms.core.JmsOperations 类型。

 

字符串

camel.component.amqp.lazy-create-transaction-manager

如果为 true,如果选项 transacted=true 中没有注入事务管理器,Camel 会创建一个 JmsTransactionManager。

true

布尔值

camel.component.amqp.map-jms-message

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。

true

布尔值

camel.component.amqp.max-concurrent-consumers

指定来自 JMS 时的最大并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

 

整数

camel.component.amqp.max-messages-per-task

每个任务的消息数量。-1 代表无限。如果您为并发使用者使用范围(如 min max),则此选项可用于将值设置为 eg 100 来控制在不需要较少工作时消费者的快速程度。

-1

整数

camel.component.amqp.message-converter

要使用自定义的 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。选项是一个 org.springframework.jms.support.converter.MessageConverter 类型。

 

字符串

camel.component.amqp.message-created-strategy

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。选项是一个 org.apache.camel.component.jms.MessageCreatedStrategy 类型。

 

字符串

camel.component.amqp.message-id-enabled

发送时,指定是否应添加消息 ID。这只是 JMS 代理的提示。如果 JMS 提供程序接受此提示,这些消息必须将消息 ID 设置为 null;如果提供商忽略 hint,消息 ID 必须设置为其正常的唯一值

true

布尔值

camel.component.amqp.message-timestamp-enabled

指定在发送消息时是否应默认启用时间戳。这只是一个到 JMS 代理的提示。如果 JMS 供应商接受这个 hint,这些消息必须将时间戳设置为零。如果供应商忽略了提示,时间戳必须设置为其正常值

true

布尔值

camel.component.amqp.password

要用于 ConnectionFactory 的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

camel.component.amqp.preserve-message-qos

设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或部分功能。如果没有提供,Camel 将回退为使用来自端点的值。因此,在使用这个选项时,标头会覆盖端点中的值。相反,显式QosEnabled 选项只会使用在端点上设置的选项,而不是消息标头中的值。

false

布尔值

camel.component.amqp.priority

高于 1 的值在发送时指定消息优先级(其中 0 是最低优先级),以及 9 是最高优先级。还必须启用显式QosEnabled 选项,才能使此选项生效。

4

整数

camel.component.amqp.pub-sub-no-local

指定是否禁止交付其自身连接发布的消息。

false

布尔值

camel.component.amqp.queue-browse-strategy

在浏览队列时使用自定义 QueueBrowseStrategy。选项是一个 org.apache.camel.component.jms.QueueBrowseStrategy 类型。

 

字符串

camel.component.amqp.receive-timeout

接收消息的超时时间(以毫秒为单位)。

1000

Long

camel.component.amqp.recovery-interval

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

Long

camel.component.amqp.reply-on-timeout-to-max-concurrent-consumers

指定在使用 request/reply over JMS 时超时发生时持续路由的并发使用者的最大数量。

1

整数

camel.component.amqp.reply-to-cache-level-name

在通过 JMS 进行请求/回复消费者时,按照名称设置缓存级别。这个选项只适用于使用固定的回复队列(而不是临时)。Camel 默认使用:CACHE_CONSUMER 用于独占或共享 w/ replyToSelectorName。以及在没有 replyToSelectorName 的情况下共享的 CACHE_SESSION。有些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注:如果使用临时队列,则不允许使用 CACHE_NONE,且必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。

 

字符串

camel.component.amqp.reply-to-concurrent-consumers

指定在进行请求/相对于 JMS 时的默认并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

1

整数

camel.component.amqp.reply-to-max-concurrent-consumers

指定在 JMS 中使用请求/回复时的最大并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

 

整数

camel.component.amqp.reply-to-type

允许显式指定在进行请求/恢复 JMS 时用于回复队列的策略。可能的值有:Trimporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。此选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档了解更多详情,特别是有关在集群环境中运行时所造成影响的备注,以及共享回复队列的性能比其 alternatives Temporary 和 Exclusive 的性能有不同。

 

ReplyToType

camel.component.amqp.request-timeout

在使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此每个消息单独的超时值。另请参阅 requestTimeoutCheckerInterval 选项。

20000

Long

camel.component.amqp.request-timeout-checker-interval

配置在通过 JMS 进行请求时,Camel 应该检查超时交换的频率。默认情况下,Camel 会检查每秒一次。但是,如果发生超时时您必须更快地做出反应,那么您可以降低这个间隔,以更频繁地检查。超时由选项 requestTimeout 决定。

1000

Long

camel.component.amqp.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.amqp.stream-message-type-enabled

设定是否启用 StreamMessage 类型。消息有效负载的流传输类型(如文件、InputStream 等)将作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪一种类型。默认情况下使用 BytesMessage,它强制读取到内存中的完整消息有效负载。通过启用此选项,消息有效负载在块中读取到内存中,每个块都会写入 StreamMessage,直到没有更多数据。

false

布尔值

camel.component.amqp.subscription-durable

设置是否使订阅持久。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认为 false。将其设置为 true 以注册持久的订阅,通常与 subscriptionName 值结合使用(除非您的消息监听器类名称足够好作为订阅名称)。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。

false

布尔值

camel.component.amqp.subscription-name

设置要创建的订阅的名称。要应用一个带有共享或 durable 订阅的主题(pub-sub 域)。订阅名称需要在这个客户端的 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.task-executor

允许您指定自定义任务 executor 来使用消息。选项是一个 org.springframework.core.task.TaskExecutor 类型。

 

字符串

camel.component.amqp.test-connection-on-startup

指定是否在启动时测试连接。这可确保当 Camel 启动时,所有 JMS 用户都具有与 JMS 代理的有效连接。如果无法授予连接,Camel 会在启动时抛出异常。这样可确保 Camel 没有启动失败的连接。JMS 生产商也进行了测试。

false

布尔值

camel.component.amqp.time-to-live

发送消息时,指定消息的时间(以毫秒为单位)。

-1

Long

camel.component.amqp.transacted

指定是否使用翻译模式

false

布尔值

camel.component.amqp.transaction-manager

要使用的 Spring 事务管理器。选项是一个 org.springframework.transaction.PlatformTransactionManager 类型。

 

字符串

camel.component.amqp.transaction-name

要使用的事务的名称。

 

字符串

camel.component.amqp.transaction-timeout

事务的超时值(以秒为单位)。

-1

整数

camel.component.amqp.transfer-exception

如果启用并且您正在使用 Request Reply messaging (InOut),并且一个 Exchange 在使用者端失败,则会导致 Exception 发回为 javax.jms.ObjectMessage。如果客户端是 Camel,则返回的 Exception 会被重新箭头。这样,您可以使用 Camel JMS 作为路由中的网桥 - 例如,使用持久性队列来启用可靠的路由。请注意,如果您也启用了 transferExchange,则此选项将具有优先权。请注意的异常需要是序列化的。使用者端的原始例外可以包装在外部异常中,如 org.apache.camel.RuntimeCamelException (返回到制作者)。

false

布尔值

camel.component.amqp.transfer-exchange

您可以通过线路传输交换,而不只是正文和标头。传输以下字段如下:正文、出站正文、容错正文、入口、出口标头、容错标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用此选项,因此 Camel 知道有效负载是 Exchange,而非常规有效负载。

false

布尔值

camel.component.amqp.transfer-fault

如果启用且您使用 Request Reply messaging (InOut)和 Exchange failed,在消费者端使用 SOAP 故障(而非例外),则 Message#isFault ()上的 fault 标志将重新作为带有键 org.apache.camelcomponent.jms.JmsConstants #JMS_TRANSFOTER_JMS 标头的 JMS 标头来回发送。如果客户端是 Camel,则返回的 fault 标志将在 org.apache.camel.Message#setFault (布尔值)上设置。在使用支持故障的 Camel 组件(如 cxf 或 spring-ws)时,您可能需要启用此功能。

false

布尔值

camel.component.amqp.use-message-i-d-as-correlation-i-d

指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。

false

布尔值

camel.component.amqp.username

用于 ConnectionFactory 的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

camel.component.amqp.wait-for-provision-correlation-to-be-updated-counter

在对 JMS 进行请求/恢复请求时,等待 provisional 关联 id 会被更新为实际关联 id 的次数,以及选项 useMessageIDAsCorrelationID。

50

整数

camel.component.amqp.wait-for-provision-correlation-to-be-updated-thread-sleeping-time

millis 在等待 provisional correlation id 被更新期间,每次处于睡眠状态的时间间隔。

100

Long

5.4. 使用

由于 AMQP 组件从 JMS 组件继承,以前的用法与后者几乎相同:

使用 AMQP 组件

// Consuming from AMQP queue
from("amqp:queue:incoming").
  to(...);
 
// Sending message to the AMQP topic
from(...).
  to("amqp:topic:notify");

5.5. 配置 AMQP 组件

从 Camel 2.16.1 开始,您还可以使用 AMQPComponent#amqp10Component (String connectionURI) factory 方法返回 AMQP 1.0 组件,使用预先配置的主题前缀: 

创建 AMQP 1.0 组件

 AMQPComponent amqp = AMQPComponent.amqp10Component("amqp://guest:guest@localhost:5672");

请记住,从 Camel 2.17 开始, AMQPComponent#amqp10Component (String connectionURI) 工厂方法的代表 AMQPComponent#amqpComponent (String connectionURI) 已被弃用: 

创建 AMQP 1.0 组件

AMQPComponent amqp = AMQPComponent.amqpComponent("amqp://localhost:5672");
 
AMQPComponent authorizedAmqp = AMQPComponent.amqpComponent("amqp://localhost:5672", "user", "password");

从 Camel 2.17 开始,若要自动配置 AMQP 组件,您还可以向注册表添加 org.apache.camel.component.amqp.AMQPConnectionDetails 实例。例如,对于 Spring Boot,您必须定义 bean:

AMQP 连接详情自动配置

@Bean
AMQPConnectionDetails amqpConnection() {
  return new AMQPConnectionDetails("amqp://localhost:5672");
}
 
@Bean
AMQPConnectionDetails securedAmqpConnection() {
  return new AMQPConnectionDetails("amqp://localhost:5672", "username", "password");
}

同样,在使用 Camel-CDI 时也可以使用 CDI producer 方法

AMQP 连接详情用于 CDI 的自动配置

@Produces
AMQPConnectionDetails amqpConnection() {
  return new AMQPConnectionDetails("amqp://localhost:5672");
}

您还可以依赖 Camel 属性来读取 AMQP 连接详情。factory 方法 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 客户端配置

5.6. 使用主题

要使用与 camel-amqp 相关的主题,您需要配置组件以使用 topic:// 作为主题前缀,如下所示:

 <bean id="amqp" class="org.apache.camel.component.amqp.AmqpComponent">
   <property name="connectionFactory">
     <bean class="org.apache.qpid.jms.JmsConnectionFactory" factory-method="createFromURL">
       <property name="remoteURI" value="amqp://localhost:5672" />
       <property name="topicPrefix" value="topic://" />  <!-- only necessary when connecting to ActiveMQ over AMQP 1.0 -->
     </bean>
   </property>
 </bean>

请记住,AMQPComponent#amqpComponent () 方法和 AMQPConnectionDetails 都会预先配置该组件,因此您不必显式配置它。

5.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 6 章 APNS 组件

可作为 Camel 版本 2.8 使用

apns 组件用于将通知发送到 iOS 设备。apns 组件使用 javapns 库。
组件支持向 Apple Push Notification Servers (APNS)发送通知并消耗来自服务器的反馈。

默认情况下,消费者配置了 3600 秒以进行轮询,因为最佳实践是仅使用 Apple Push Notification Servers 中的内容流仅从时间到时间。例如: 每小时每小时避免损坏服务器。

反馈流提供有关不活跃设备的信息。如果您的移动应用程序没有大量使用时,您只需要在数小时获取此信息。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-apns</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

6.1. URI 格式

发送通知:

apns:notify[?options]

使用反馈:

apns:consumer[?options]

6.2. 选项

APNS 组件支持 2 个选项,它们如下所列。

名称描述默认类型

apnsService (common)

需要使用 ApnsService。org.apache.camel.component.apns.factory.ApnsServiceFactory 可用于构建 ApnsService

 

ApnsService

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

APNS 端点使用 URI 语法配置:

apns:name

使用以下路径和查询参数:

6.2.1. 路径名(1 参数):

名称描述默认类型

name

端点的名称

 

字符串

6.2.2. 查询参数(20 参数):

名称描述默认类型

tokens (common)

如果要静态声明与您要通知的设备相关的令牌,请配置此属性。令牌用逗号分开。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

6.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.apns.apns-service

要使用的 ApnsService。org.apache.camel.component.apns.factory.ApnsServiceFactory 可用于构建 ApnsService。选项为 com.notnoop.apns.ApnsService 类型。

 

字符串

camel.component.apns.enabled

启用 apns 组件

true

布尔值

camel.component.apns.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

6.3.1. 组件

ApnsComponent 必须使用 com.notnoop.apns.ApnsService 进行配置。可以使用 org.apache.camel.component.apns.factory.ApnsServiceFactory 创建和配置该服务。请参阅以下示例。以及测试 源代码

6.3.1.1. SSL 设置

要使用安全连接,org.apache.camel.jsse.jsse.SSLContextParameters 实例应当注入到 org.apache.camel.component.apns.factory.ApnsServiceFactory,用于配置该组件。如需示例,请参阅 test 资源。SSL 示例

6.4. 交换数据格式

当 Camel 获取与不活跃设备对应的反馈数据时,它将检索 InactiveDevice 对象列表。检索列表的每个 InactiveDevice 对象将设置为 In body,然后由消费者端点处理。

6.5. 消息标头

Camel Apns 使用这些标头。

属性默认描述

CamelApnsTokens

 

默认为空。

CamelApnsMessageType

字符串、载荷、PNS_NOTIFICATION 

如果您选择 PAYLOAD 作为消息类型,则消息将被视为 APNS 有效负载,并以 身份发送。如果选择 STRING,则会将消息转换为 APNS 有效负载。从采用 APNS_NOTIFICATION 的 Camel 2.16,用于将邮件正文作为 com.notnoop.apns.ApnsNotification 类型发送。

6.6. ApnsServiceFactory builder callback

ApnsServiceFactory 附带了一个空的回调方法,可用于配置(甚至替换)默认的 ApnsServiceBuilder 实例。方法的签名如下:

protected ApnsServiceBuilder configureServiceBuilder(ApnsServiceBuilder serviceBuilder);

可使用如下方式:

ApnsServiceFactory proxiedApnsServiceFactory = new ApnsServiceFactory(){
  
  @Override
  protected ApnsServiceBuilder configureServiceBuilder(ApnsServiceBuilder serviceBuilder) {
    return serviceBuilder.withSocksProxy("my.proxy.com", 6666);
  }

};

6.7. Samples

6.7.1. Camel Xml 路由

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

    <!-- Replace by desired values -->
    <bean id="apnsServiceFactory" class="org.apache.camel.component.apns.factory.ApnsServiceFactory">

        <!-- Optional configuration of feedback host and port -->
        <!-- <property name="feedbackHost" value="localhost" /> -->
        <!-- <property name="feedbackPort" value="7843" /> -->

        <!-- Optional configuration of gateway host and port -->
        <!-- <property name="gatewayHost" value="localhost" /> -->
        <!-- <property name="gatewayPort" value="7654" /> -->

        <!-- Declaration of certificate used -->
                <!-- from Camel 2.11 onwards you can use prefix: classpath:, file: to refer to load the certificate from classpath or file. Default it classpath -->
        <property name="certificatePath" value="certificate.p12" />
        <property name="certificatePassword" value="MyCertPassword" />

        <!-- Optional connection strategy - By Default: No need to configure -->
        <!-- Possible options: NON_BLOCKING, QUEUE, POOL or Nothing -->
        <!-- <property name="connectionStrategy" value="POOL" /> -->
        <!-- Optional pool size -->
        <!-- <property name="poolSize" value="15" /> -->

        <!-- Optional connection strategy - By Default: No need to configure -->
        <!-- Possible options: EVERY_HALF_HOUR, EVERY_NOTIFICATION or Nothing (Corresponds to NEVER javapns option) -->
        <!-- <property name="reconnectionPolicy" value="EVERY_HALF_HOUR" /> -->
    </bean>

    <bean id="apnsService" factory-bean="apnsServiceFactory" factory-method="getApnsService" />

    <!-- Replace this declaration by wanted configuration -->
    <bean id="apns" class="org.apache.camel.component.apns.ApnsComponent">
        <property name="apnsService" ref="apnsService" />
    </bean>

    <camelContext id="camel-apns-test" xmlns="http://camel.apache.org/schema/spring">
            <route id="apns-test">
                    <from uri="apns:consumer?initialDelay=10&amp;delay=3600&amp;timeUnit=SECONDS" />
                    <to uri="log:org.apache.camel.component.apns?showAll=true&amp;multiline=true" />
                    <to uri="mock:result" />
            </route>
    </camelContext>

</beans>

6.7.2. Camel Java 路由

创建 camel 上下文并以编程方式声明 apns 组件

    protected CamelContext createCamelContext() throws Exception {
        CamelContext camelContext = super.createCamelContext();

        ApnsServiceFactory apnsServiceFactory = new ApnsServiceFactory();
        apnsServiceFactory.setCertificatePath("classpath:/certificate.p12");
        apnsServiceFactory.setCertificatePassword("MyCertPassword");

        ApnsService apnsService = apnsServiceFactory.getApnsService(camelContext);

        ApnsComponent apnsComponent = new ApnsComponent(apnsService);
        camelContext.addComponent("apns", apnsComponent);

        return camelContext;
    }

[[APNS-ApnsProducer-iOStargetdevicedynamicallyconfiguredviaheader:"CamelApnsTokens"]] ApnsProducer - iOS 目标设备通过标头 "CamelApnsTokens"

    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() throws Exception {
                from("direct:test")
                    .setHeader(ApnsConstants.HEADER_TOKENS, constant(IOS_DEVICE_TOKEN))
                    .to("apns:notify");
                }
        }
    }

ApnsProducer - iOS 目标设备通过 uri 静态配置

    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() throws Exception {
                from("direct:test").
                to("apns:notify?tokens=" + IOS_DEVICE_TOKEN);
            }
        };
    }

ApnsConsumer

from("apns:consumer?initialDelay=10&delay=3600&timeUnit=SECONDS")
    .to("log:com.apache.camel.component.apns?showAll=true&multiline=true")
    .to("mock:result");

6.8. 另请参阅

第 7 章 ASN.1 File DataFormat

可作为 Camel 版本 2.20 可用

ASN.1 数据格式数据格式 [Intoduction to ASN.1](https://www.itu.int/en/ITU-T/asn1/Pages/introduction.aspx)是一个 Camel Framework 的数据格式实现,它基于 Bouncy Castle 的 bcprov-jdk15on 库和 jASN.1 的 Java 编译器,用于描述通过电信协议传输的数据格式的实施,无论这些数据在语言的实施和物理表示,均很复杂。消息可以解封(版本至简单的 Java POJO)到普通 Java 对象。通过帮助 Camel 路由引擎和数据转换,您可以使用 POJO (POJO)进行工作,并应用定制格式并应用定制格式,并调用其他 Camel 组件将消息转换为上游系统。

7.1. ASN.1 数据格式选项

ASN.1 文件数据格式支持 3 个选项,它们如下所列。

名称默认Java 类型描述

usingIterator

false

布尔值

如果 asn1 文件含有多个条目,那么将此选项设置为 true,允许使用 splitter EIP,以流模式使用它分割数据。

clazzName

 

字符串

取消编出时使用的类名称

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

7.2. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.dataformat.asn1.clazz-name

取消编出时使用的类名称

 

字符串

camel.dataformat.asn1.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.asn1.enabled

是否启用自动配置 asn1 数据格式。默认启用。

 

布尔值

camel.dataformat.asn1.using-iterator

如果 asn1 文件含有多个条目,那么将此选项设置为 true,允许使用 splitter EIP,以流模式使用它分割数据。

false

布尔值

ND

7.3. unmarshal

有 3 种不同的方法可以集出 ASN.1 结构化消息。(通常是二进制文件)

在第一个示例中,我们向 OutputStream 传播的文件有效负载,并将其发送到模拟端点。

from("direct:unmarshal").unmarshal(asn1).to("mock:unmarshal");

在第二个示例中,我们使用 Split EIP 将文件有效负载分到字节阵列。应用 Split EIP 的原因通常是每个 BER 文件或(ASN.1 结构化文件)包含多个记录来处理;Split EIP 有助于我们将文件中的每条记录作为字节阵列(实际上是 ASN1Primitive's ASN)的实例(利用 Bouncy Castle 的 ASN bcprov-jdk15on 库中的 .1 支持者数组,可能会被转换为 ASN1Primitive (ASN1Primitive.fromByteArray)的帮助,例如: 请注意,您需要使用 Iterator=true进行设置

from("direct:unmarshal").unmarshal(asn1).split(body(Iterator.class)).streaming().to("mock:unmarshal");

在最后一个示例中,我们使用 Split EIP 将文件有效负载分到普通 Java 对象。上例中已提到应用 Split EIP 的原因。请注意,请记住,原因。在本例中,我们还需要通过数据格式设置类或 <YourObject>.class 引用的完全限定名称。这里要注意的一点是,Jasn1 编译器应该已经生成您的对象,它是一个 nice 工具来生成您的 ASN.1 结构的 java 对象表示。有关 jasn1 编译器的参考信息,请参阅 [JASN.1 项目页面](https://www.openmuc.org/asn1/)。另外,还了解如何使用 maven 的 exec 插件调用编译器。例如,在这种数据格式的单元测试中,在 src/test/resources/asn/asn1 中添加了一个示例 ASN.1 结构 (TestSMSBerCdr.asn/java/asn1 编译器。jasn1 编译器会在 ${basedir}/target/generated/src/test/java 中生成。

from("direct:unmarshaldsl")
         .unmarshal()
         .asn1("org.apache.camel.dataformat.asn1.model.testsmscbercdr.SmsCdr")
         .split(body(Iterator.class)).streaming()
.to("mock:unmarshaldsl");

7.4. 依赖项

要在 camel 路由中使用 ASN.1 数据格式,您需要添加对 camel-asn1 的依赖关系,该格式实施此数据格式。

如果使用 Maven,您只需在 pom.xml 中添加以下内容,替换最新和最长版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-asn1</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

第 8 章 AS2 组件

重要

Karaf 的 camel-as2 组件只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。

这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的更多信息,请参阅 https://access.redhat.com/support/offerings/techpreview

可作为 Camel 版本 2.22 可用

AS2 组件使用 RFC4130 中指定的 HTTP 传输协议提供 EDI 消息传输。

注意

这个组件目前正在进行中。预计这个组件的未来版本中要更改 URI 选项和路径和查询参数。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-as2</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

8.1. URI 格式

as2://apiName/methodName

apiName 可以是以下之一:

  • client
  • server

8.2. AS2 选项

AS2 组件支持 2 个选项,它们如下所列。

名称描述默认类型

configuration (common)

使用共享配置

 

AS2Configuration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AS2 端点使用 URI 语法配置:

as2:apiName

使用以下路径和查询参数:

8.2.1. 路径名(1 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

AS2ApiName

8.2.2. 查询参数(30 参数):

名称描述默认类型

as2From (common)

AS2From 标头的 AS2From 标头的值。

 

字符串

as2MessageStructure (common)

AS2 消息的结构.其中之一:PLAIN - No encryption, no signature, SIGNED - No encryption, signature, ENCRYPTED - Encryption, no signature, ENCRYPTED_SIGNED - Encryption, 签名

 

AS2MessageStructure

as2To (common)

AS2To 标头的 AS2To 标头的值。

 

字符串

as2Version (common)

AS2 协议的版本。

1.1

字符串

clientFqdn (common)

Client Fully Qualified Domain Name (FQDN)。用于端点发送的消息 ID 中。

camel.apache.org

字符串

dispositionNotificationTo (common)

Disposition-Notification-To 标头的值。为此参数分配一个值,为 AS2 消息请求消息分散通知(MDN)。

 

字符串

ediMessageTransferEncoding (common)

EDI 消息的传输编码。

 

字符串

ediMessageType (common)

EDI 消息的内容类型。应用程序/制造商之一、应用程序/或x12、应用程序/委员会

 

ContentType

encryptingAlgorithm (common)

用于加密 EDI 消息的算法。

 

AS2EncryptionAlgorithm

encryptingCertificateChain (common)

用于加密 EDI 消息的证书链。

 

Certificate[]

encryptingPrivateKey (common)

用于加密 EDI 消息的密钥。

 

PrivateKey

from (common)

AS2 消息的 From 标头的值。

 

字符串

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

methodName (common)

所选操作需要什么子操作

 

字符串

requestUri (common)

EDI 消息的请求 URI。

/

字符串

server (common)

包括在服务器消息标题中标识 AS2 服务器的值。

Camel AS2 服务器端点

字符串

serverFqdn (common)

Server Fully Qualified Domain Name (FQDN)。用于端点发送的消息 ID 中。

camel.apache.org

字符串

serverPortNumber (common)

服务器的端口号。

 

整数

signedReceiptMicAlgorithms (common)

算法列表,按首选项顺序排列,在消息处理通知(MDN)中生成消息完整性检查(MIC)将返回的消息完整性检查(MIC)

 

String[]

signingAlgorithm (common)

用于签署 EDI 消息的算法。

 

AS2SignatureAlgorithm

signingCertificateChain (common)

用于签署 EDI 消息的证书链。

 

Certificate[]

signingPrivateKey (common)

用于为 EDI 消息签名的密钥。

 

PrivateKey

subject (common)

AS2 消息的 Subject 标头的值。

 

字符串

targetHostname (common)

目标主机的主机名(IP 或 DNS 名称)。

 

字符串

targetPortNumber (common)

目标主机的端口号。-1 表示方案默认端口。

 

整数

userAgent (common)

包括在 User-Agent 消息标头中的值来标识 AS2 用户代理。

Camel AS2 客户端端点

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

8.3. Spring Boot Auto-Configuration

组件支持 28 个选项,它们如下所列。

名称描述默认类型

camel.component.as2.configuration.api-name

要执行的操作种类

 

AS2ApiName

camel.component.as2.configuration.as2-from

AS2From 标头的 AS2From 标头的值。

 

字符串

camel.component.as2.configuration.as2-message-structure

AS2 消息的结构.其中之一:PLAIN - No encryption, no signature, SIGNED - No encryption, signature, ENCRYPTED - Encryption, no signature, ENCRYPTED_SIGNED - Encryption, 签名

 

AS2MessageStructure

camel.component.as2.configuration.as2-to

AS2To 标头的 AS2To 标头的值。

 

字符串

camel.component.as2.configuration.as2-version

AS2 协议的版本。

1.1

字符串

camel.component.as2.configuration.client-fqdn

Client Fully Qualified Domain Name (FQDN)。用于端点发送的消息 ID 中。

camel.apache.org

字符串

camel.component.as2.configuration.disposition-notification-to

Disposition-Notification-To 标头的值。为此参数分配一个值,为 AS2 消息请求消息分散通知(MDN)。

 

字符串

camel.component.as2.configuration.edi-message-transfer-encoding

EDI 消息的传输编码。

 

字符串

camel.component.as2.configuration.edi-message-type

EDI 消息的内容类型。应用程序/制造商之一、应用程序/或x12、应用程序/委员会

 

ContentType

camel.component.as2.configuration.encrypting-algorithm

用于加密 EDI 消息的算法。

 

AS2EncryptionAlgorithm

camel.component.as2.configuration.encrypting-certificate-chain

用于加密 EDI 消息的证书链。

 

Certificate[]

camel.component.as2.configuration.encrypting-private-key

用于加密 EDI 消息的密钥。

 

PrivateKey

camel.component.as2.configuration.from

AS2 消息的 From 标头的值。

 

字符串

camel.component.as2.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.as2.configuration.request-uri

EDI 消息的请求 URI。

/

字符串

camel.component.as2.configuration.server

包括在服务器消息标题中标识 AS2 服务器的值。

Camel AS2 服务器端点

字符串

camel.component.as2.configuration.server-fqdn

Server Fully Qualified Domain Name (FQDN)。用于端点发送的消息 ID 中。

camel.apache.org

字符串

camel.component.as2.configuration.server-port-number

服务器的端口号。

 

整数

camel.component.as2.configuration.signed-receipt-mic-algorithms

算法列表,按首选项顺序排列,在消息处理通知(MDN)中生成消息完整性检查(MIC)将返回的消息完整性检查(MIC)

 

String[]

camel.component.as2.configuration.signing-algorithm

用于签署 EDI 消息的算法。

 

AS2SignatureAlgorithm

camel.component.as2.configuration.signing-certificate-chain

用于签署 EDI 消息的证书链。

 

Certificate[]

camel.component.as2.configuration.signing-private-key

用于为 EDI 消息签名的密钥。

 

PrivateKey

camel.component.as2.configuration.subject

AS2 消息的 Subject 标头的值。

 

字符串

camel.component.as2.configuration.target-hostname

目标主机的主机名(IP 或 DNS 名称)。

 

字符串

camel.component.as2.configuration.target-port-number

目标主机的端口号。-1 表示方案默认端口。

 

整数

camel.component.as2.configuration.user-agent

包括在 User-Agent 消息标头中的值来标识 AS2 用户代理。

Camel AS2 客户端端点

字符串

camel.component.as2.enabled

是否启用 as2 组件的自动配置。默认启用。

 

布尔值

camel.component.as2.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

8.4. 客户端端点:

客户端端点使用端点前缀 客户端,后接方法的名称及下一个描述的关联选项。端点 URI MUST 包含前缀 客户端

as2://client/method?[options]

不是必需的端点选项由 [] 表示。如果端点没有强制选项,则会提供一组 [] 选项 MUST。制作者端点也可以使用特殊选项 inBody ,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelAS2.<option> 的格式。请注意, inBody 选项会覆盖消息标头,例如, Body=option 中的 endpoint 选项会覆盖 CamelAS2.option 标头。

如果没有为端点 URI 中的选项 defaultRequest 提供值,则它将假定为 null。请注意,只有其它选项不满足匹配的端点时,才会使用 null 值。

如果是 AS2 API 错误,端点将抛出 RuntimeCamelException 和 org.apache.http.HttpException 派生异常原因。

方法选项结果 Body 类型

send

ediMessage, requestUri, subject, from, as2From, as2To, as2MessageStructure, ediMessageContentType, ediMessageTransferEncoding, dispositionNotificationTo, signedReceiptMicAlgorithms

org.apache.http.protocol.HttpCoreContext

客户端的URI 选项

名称类型

ediMessage

字符串

requestUri

字符串

subject

字符串

from

字符串

as2From

字符串

as2To

字符串

as2MessageStructure

org.apache.camel.component.as2.api.AS2MessageStructure

ediMessageContentType

字符串

ediMessageTransferEncoding

字符串

dispositionNotificationTo

字符串

signedReceiptMicAlgorithms

String[]

8.5. 服务器端点:

服务器端点使用端点前缀 server,后跟一个方法的名称以及接下来描述的关联选项。端点 URI MUST 包含前缀 服务器

as2://server/method?[options]

不是必需的端点选项由 [] 表示。如果端点没有强制选项,则会提供一组 [] 选项 MUST。制作者端点也可以使用特殊选项 inBody ,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelAS2.<option> 的格式。请注意, inBody 选项会覆盖消息标头,例如, Body=option 中的 endpoint 选项会覆盖 CamelAS2.option 标头。

如果没有为端点 URI 中的选项 defaultRequest 提供值,则它将假定为 null。请注意,只有其它选项不满足匹配的端点时,才会使用 null 值。

如果是 AS2 API 错误,端点将抛出 RuntimeCamelException 和 org.apache.http.HttpException 派生异常原因。

方法选项结果 Body 类型

listen

requestUriPattern

org.apache.http.protocol.HttpCoreContext

服务器的URI 选项

名称类型

requestUriPattern

字符串

第 9 章 星号组件

作为 Camel 2.18 版提供

星号: 组件允许您使用星号对 PBX 服务器 http://www.asterisk.org/ 轻松工作 https://asterisk-java.org/

此组件有助于与 Asterisk Manager 接口进行接口

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-asterisk</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

9.1. URI 格式

asterisk:name[?options]

9.2. 选项

Asterisk 组件没有选项。

Asterisk 端点使用 URI 语法配置:

asterisk:name

使用以下路径和查询参数:

9.2.1. 路径名(1 参数):

名称描述默认类型

name

所需 的逻辑名称

 

字符串

9.2.2. 查询参数(8 参数):

名称描述默认类型

hostname (common)

所需的 星号服务器的主机名

 

字符串

password (common)

所需的 登录密码

 

字符串

username (common)

所需的 登录用户名

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

action (producer)

要执行的操作,如获取队列状态、sip 对等点或扩展状态。

 

AsteriskAction

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

9.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.asterisk.enabled

启用星号组件

true

布尔值

camel.component.asterisk.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

9.4. 操作

支持的操作包括:

  • QUEUE_STATUS, 队列状态
  • SIP_PEERS, List SIP Peers
  • EXTENSION_STATE, Check Extension 状态

第 10 章 Atmos 组件

作为 Camel 版本 2.15 可用

Camel-Atmos 是一个 Apache Camel 组件,允许您使用 Atmos 客户端 来处理 ViPR 对象数据服务。

from("atmos:foo/get?remotePath=/path").to("mock:test");

10.1. 选项

Atmos 组件支持 5 个选项,它们如下所列。

名称描述默认类型

fullTokenId (security)

传递给 Atmos 客户端的令牌 ID

 

字符串

secretKey (security)

传递给 Atmos 客户端的 secret 密钥

 

字符串

uri (advanced)

Atmos 客户端连接的服务器的 URI

 

字符串

sslValidation (security)

Atmos 客户端是否应该执行 SSL 验证

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Atmos 端点使用 URI 语法进行配置:

atmos:name/operation

使用以下路径和查询参数:

10.1.1. 路径名(2 参数):

名称描述默认类型

name

Atmos 名称

 

字符串

operation

执行 所需的操作

 

AtmosOperation

10.1.2. 查询参数(12 参数):

名称描述默认类型

enableSslValidation (common)

Atmos SSL 验证

false

布尔值

fullTokenId (common)

Atmos 客户端 fullTokenId

 

字符串

localPath (common)

放置文件的本地路径

 

字符串

newRemotePath (common)

移动文件时在 Atmos 上的新路径

 

字符串

query (common)

在 Atmos 上搜索查询

 

字符串

remotePath (common)

在 Atmos 上放置文件的位置

 

字符串

secretKey (common)

Atmos 共享 secret

 

字符串

uri (common)

Atomos server uri

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

10.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.atmos.enabled

启用 atmos 组件

true

布尔值

camel.component.atmos.full-token-id

传递给 Atmos 客户端的令牌 ID

 

字符串

camel.component.atmos.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.atmos.secret-key

传递给 Atmos 客户端的 secret 密钥

 

字符串

camel.component.atmos.ssl-validation

Atmos 客户端是否应该执行 SSL 验证

false

布尔值

camel.component.atmos.uri

Atmos 客户端连接的服务器的 URI

 

字符串

10.3. 依赖项

要在 camel 路由中使用 Atmos,您需要添加实现此数据格式的 camel-atmos 依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-atmos</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

10.4. 集成

当您查看mos 集成时,有一种类型的消费者 GetConsumer,它是 ScheduledPollConsumer 类型。

  • Get

其中有 4 种类型的制作者

  • Get
  • Del
  • Move
  • put

10.5. 例子

这些示例是从测试中获取的:

from("atmos:foo/get?remotePath=/path").to("mock:test");

下面是一个消费者的示例。remotePath 代表数据要读取的路径,并将 camel Exchange 传递给制作者 Underneath,此组件将mos 客户端 API 用于此和其他操作。

from("direct:start")
.to("atmos://get?remotePath=/dummy/dummy.txt")
.to("mock:result");

在这里,这是一个制作者示例。remotePath 表示操作在 ViPR 对象数据服务上发生的路径。在制作者中,操作(GetDelMovePut)在 ViPR 对象数据服务上运行,结果由 camel Exchange 的标头设置。

关于操作,会在 camel exhange 中设置以下标头

DOWNLOADED_FILE, DOWNLOADED_FILES, UPLOADED_FILE, UPLOADED_FILES, FOUND_FILES, DELETED_PATH, MOVED_PATH;

10.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 11 章 Atlasmap 组件

仅支持制作者

AtlasMap 组件允许您使用 AtlasMap 数据映射定义来处理数据映射。在从 AtlasMap Data Mapper UI 导出时,AtlasMap 映射定义被打包为 ADM 存档文件。

注意: 虽然可以在不打包到 ADM 归档文件的情况下加载映射 JSON 文件,但某些功能将无法使用。建议始终将 ADM 归档文件用于开发人员测试目的以外的其他文件。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-atlasmap</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

另外,您还可以包含 DFDL 模块,这是 Apache Daffodil 的 POC:

<dependency>
    <groupId>io.atlasmap</groupId>
    <artifactId>atlas-dfdl-module</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as atlasmap-core in camel-atlasmap -->
</dependency>

11.1. URI 格式

atlas:mappingName[?options]

其中 mappingName 是 AtlasMap 映射定义的类path-local URI,ADM 存档文件或映射到要处理的定义 JSON 文件。

11.2. 配置选项

Camel 组件在两个独立级别配置:

  • component level
  • 端点级别

11.2.1. 配置组件选项

组件级别是包含端点继承的一般和常见配置的最高级别。例如,一个组件可能具有安全设置、用于身份验证的凭证、网络连接 url,等等。

有些组件只有几个选项,另一些则可能有多个。因为组件通常预先配置了使用的默认值,因此您通常只需要在组件上配置几个选项,或根本不需要配置一些选项。

可以使用组件 DSL 配置,在配置文件(application.properties|yaml)中,或使用 Java 代码直接进行。

11.2.2. 配置端点选项

在您发现自己配置在端点上,因为端点通常有很多选项,供您配置端点需要执行的操作。这些选项也归类为端点,是否用作使用者(来自)还是用作生产者(对)或两者使用。

配置端点最常作为路径和查询参数在端点 URI 中完成。您还可以使用 Endpoint DSL 作为配置 端点的一种安全 方式。

在配置选项时,最好使用 Property Placeholders,它允许硬编码 URL、端口号、敏感信息和其他设置。词语占位符允许从您的代码外部化配置,并提供更多灵活性和重复使用。

以下两个部分列出了所有选项,首先列出组件以及端点。

11.3. 组件选项

AtlasMap 组件支持 4 个选项,它们如下所列。

名称

描述

默认

类型

lazyStartProducer (producer)

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

atlasContextFactory (advanced)

要使用 AtlasContextFactory,否则会创建一个新的引擎。

 

AtlasContextFactory

autowiredEnabled (advanced)

是否启用自动。这用于自动自动自动选项(选项必须标记为 autowired),方法是在 registry 中查找是否有匹配的类型实例,然后在组件上进行配置。这可用于自动配置 JDBC 数据源、JMS 连接工厂、AWS 客户端等。

true

布尔值

propertiesFile (advanced)

用于 AtlasContextFactory 初始化的属性文件的 URI。

 

字符串

11.4. 端点选项

Apache Camel 组件引用端点使用 URI 语法进行配置:

atlas:resourceUri

使用以下路径和查询参数:

11.4.1. 路径名参数(1 参数)

名称

描述

默认

类型

resourceUri (producer)

资源 所需的 路径。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。

 

字符串

11.4.2. 查询参数(7 参数)

名称

描述

默认

类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样做会产生潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问权限。

false

布尔值

contentCache (producer)

设定是否使用资源内容缓存。

false

布尔值

forceReload (producer)

是否启用或禁用强制重新加载模式。默认情况下,这被设置为 false,只有第一个交换的文件载入 ADM 文件,在重新创建端点后将重复使用 AtlasContext。如果它被设置为 true,则将从每个 Exchange 上的一个文件加载 ADM 文件。

false

布尔值

lazyStartProducer (producer)

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

sourceMapName (producer)

存放 java.util.Map<String, Message> 的源消息映射的 Exchange 属性名称,其中键是 AtlasMap Document ID。AtlasMap 使用消息正文作为源文档,以及消息标题作为源属性,范围等于文档 ID。

 

字符串

targetMapMode (producer)

TargetMapMode enum 值,用于指定在存在时如何发送多个目标文档。'MAP':将它们存储到 java.util.Map 中,如果指定了 'targetMapName',则 java.util.Map 被设置为 Exchange 属性,否则消息正文。'MESSAGE_HEADER':将它们存储到消息标头中。'EXCHANGE_PROPERTY':将其存储为交换属性。

枚举值:

* MAP * MESSAGE_HEADER * EXCHANGE_PROPERTY

MAP

TargetMapMode

targetMapName (producer)

存放 java.util.Map<String、Object>,其中键为 AtlasMap Document ID 的目标文档映射的 Exchange 属性名称。AtlasMap 将多个目标文档填充到此映射中。

 

字符串

11.5. 例子

11.5.1. producer 示例

您可以使用如下内容:

from("activemq:My.Queue").
  to("atlas:atlasmap-mapping.adm");

您可以从 AtlasMap Data Mapper UI 导出 ADM 归档文件。

Apache Camel 组件参考端点没有路径参数。

第 12 章 Atmosphere Websocket 组件

作为 Camel 版本 2.14 可用

atmosphere-websocket: 组件为通过 Websocket 与外部客户端通信的 servlet 提供基于 Websocket 的端点(作为 servlet 接受来自外部客户端的 websocket 连接)。
组件使用 SERVLET 组件,并使用 Atmosphere 库来支持各种 Servlet 容器中的 Websocket 传输(如 Jetty、Tomcat、…​)。

与启动嵌入式 Jetty 服务器的 Websocket 组件不同,该组件使用容器的 servlet 供应商。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-atmosphere-websocket</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

12.1. Atmosphere-Websocket 选项

Atmosphere Websocket 组件支持 9 个选项,它们如下所列。

名称描述默认类型

servletName (consumer)

要使用的默认 servlet 名称。默认名称为 CamelServlet。

CamelServlet

字符串

httpRegistry (consumer)

使用自定义 org.apache.camel.component.servlet.HttpRegistry。

 

HttpRegistry

附加多部分绑定 (使用者)

是否会在 Camel Exchange 上自动绑定多部分/信息数据作为附件。选项附加MultipartBinding=true 和 disableStreamCache=false 无法一起工作。删除 disableStreamCache 以使用 AttachmentMultipartBinding。这将默认关闭,因为这可能需要 servlet 特定配置在使用 Servlet 时启用此功能。

false

布尔值

fileNameExtWhitelist (consumer)

接受上传的文件的接受文件名扩展白名单。多个扩展可以通过逗号分隔,如 txt,xml。

 

字符串

httpBinding (advanced)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

HttpBinding

httpConfiguration (advanced)

使用共享 HttpConfiguration 作为基本配置。

 

HttpConfiguration

allowJavaSerialized Object (advanced)

请求使用 context-type=application/x-java-serialized-object 时,是否允许 java serialization。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Atmosphere Websocket 端点使用 URI 语法配置:

atmosphere-websocket:servicePath

使用以下路径和查询参数:

12.1.1. 路径名(1 参数):

名称描述默认类型

servicePath

websocket 端点 所需的 名称

 

字符串

12.1.2. 查询参数(38 参数):

名称描述默认类型

chunked (common)

如果这个选项为 false,则 Servlet 将禁用 HTTP 流并在响应上设置内容长度的标头

true

布尔值

disableStreamCache (common)

确定 Servlet 的原始输入流是否已缓存(Camel 将读取流到文件,流缓存)缓存。默认情况下,Camel 会缓存 Servlet 输入流,以支持多次读取它,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。DefaultHttpBinding 会将请求输入流复制到流缓存中,如果这个选项为 false,则会将其放入消息正文,以便支持多次读取流。如果使用 Servlet 桥接/代理端点,请考虑启用这个选项来提高性能,如果不需要多次读取消息有效负载。http/http4 producer 默认将缓存响应正文流。如果将此选项设置为 true,则生产者不会缓存响应正文流,而是使用响应流,作为消息正文。

false

布尔值

headerFilterStrategy (common)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

sendToAll (common)

是否发送到所有(广播)还是发送到单个接收器。

false

布尔值

transferException (common)

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。在制作者端,异常会按原样进行反序列化和丢弃,而不是 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

useStreaming (common)

要启用流将数据作为多个文本片段发送。

false

布尔值

httpBinding (common)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

HttpBinding

async (consumer)

将消费者配置为以同步模式工作

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

httpMethodRestrict (consumer)

仅用于允许消耗 HttpMethod 匹配,如 GET/POST/PUT 等。可以使用逗号分隔多个方法。

 

字符串

matchOnUriPrefix (consumer)

如果找不到完全匹配,则使用者是否应该尝试通过匹配 URI 前缀来查找目标使用者。

false

布尔值

responseBufferSize (consumer)

使用 javax.servlet.ServletResponse 的自定义缓冲区大小。

 

整数

servletName (consumer)

要使用的 servlet 的名称

CamelServlet

字符串

attachmentMultipartBinding (consumer)

是否会在 Camel Exchange 上自动绑定多部分/信息数据作为附件。选项附加MultipartBinding=true 和 disableStreamCache=false 无法一起工作。删除 disableStreamCache 以使用 AttachmentMultipartBinding。这将默认关闭,因为这可能需要 servlet 特定配置在使用 Servlet 时启用此功能。

false

布尔值

eagerCheckContentAvailable (consumer)

是否预先检查 HTTP 请求是否有内容(如果 content-length 标头为 0 )是否有内容。这可在问题单中打开 HTTP 客户端不会发送流化数据。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

fileNameExtWhitelist (consumer)

接受上传的文件的接受文件名扩展白名单。多个扩展可以通过逗号分隔,如 txt,xml。

 

字符串

optionsEnabled (consumer)

指定是否为这个 Servlet consumer 启用 HTTP OPTIONS。默认情况下,OPTIONS 会被关闭。

false

布尔值

traceEnabled (consumer)

指定是否为这个 Servlet consumer 启用 HTTP TRACE。默认关闭 TRACE。

false

布尔值

bridgeEndpoint (producer)

如果 选项为 true,HttpProducer 将忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 请求。您也可以将选项 throwExceptionOnFailure 设为 false,使 HttpProducer 发送所有故障响应。

false

布尔值

connectionClose (producer)

指定是否需要将 Connection Close 标头添加到 HTTP Request 中。默认情况下 connectionClose 为 false。

false

布尔值

copyHeaders (producer)

如果这个选项为 true,则根据复制策略将 IN Exchange 标头复制到 OUT Exchange 标头。将其设置为 false,仅允许包括 HTTP 响应中的标头(不会传播 IN 标头)。

true

布尔值

httpMethod (producer)

配置要使用的 HTTP 方法。如果设置,HttpMethod 标头无法覆盖这个选项。

 

HttpMethods

ignoreResponseBody (producer)

如果这个选项为 true,则 http producer 不会读取响应正文并缓存输入流

false

布尔值

preserveHostHeader (producer)

如果选项为 true,HttpProducer 会将 Host 标头设置为当前交换主机标头中包含的值,对于您希望下游服务器收到的主机标头,可以使用 Host 标头为代理应用程序生成准确的 URL。

false

布尔值

throwExceptionOnFailure (producer)

禁用丢弃 HttpOperationFailedException 的选项(如果来自远程服务器的响应失败)。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

okStatusCodeRange (producer)

被视为成功响应的状态代码。值包括:可以定义多个范围,以逗号分隔,例如 200-204,209,301-304。每个范围必须是单个数字,或使用包括横线的短划线。

200-299

字符串

urlRewrite (producer)

弃用了 自定义的 org.apache.camel.component.http.UrlRewrite,它允许您在网桥/proxy 端点时重写 url。更多信息请参阅 http://camel.apache.org/urlrewrite.html

 

UrlRewrite

mapHttpMessageBody (advanced)

如果此选项正确,则交换正文将映射到 HTTP 正文。将其设置为 false 将避免 HTTP 映射。

true

布尔值

mapHttpMessageFormUrl EncodedBody (advanced)

如果这个选项为 true,则交换的 IN Exchange Form Encode 正文将映射到 HTTP。将其设置为 false 可以避免 HTTP Form Encoded body 映射。

true

布尔值

mapHttpMessageHeaders (advanced)

如果此选项为 true,则交换的 IN Exchange Headers 将映射到 HTTP 标头。将其设置为 false 将避免 HTTP 标头映射。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

proxyAuthScheme (proxy)

要使用的代理身份验证方案

 

字符串

proxyHost (proxy)

要使用的代理主机名

 

字符串

proxyPort (proxy)

要使用的代理端口

 

int

authHost (security)

要用于 NTML 的身份验证主机

 

字符串

12.2. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.atmosphere-websocket.allow-java-serialized-object

请求使用 context-type=application/x-java-serialized-object 时,是否允许 java serialization。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

camel.component.atmosphere-websocket.attachment-multipart-binding

是否会在 Camel Exchange 上自动绑定多部分/信息数据作为附件。选项附加MultipartBinding=true 和 disableStreamCache=false 无法一起工作。删除 disableStreamCache 以使用 AttachmentMultipartBinding。这将默认关闭,因为这可能需要 servlet 特定配置在使用 Servlet 时启用此功能。

false

布尔值

camel.component.atmosphere-websocket.enabled

启用 atmosphere-websocket 组件

true

布尔值

camel.component.atmosphere-websocket.file-name-ext-whitelist

接受上传的文件的接受文件名扩展白名单。多个扩展可以通过逗号分隔,如 txt,xml。

 

字符串

camel.component.atmosphere-websocket.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.atmosphere-websocket.http-binding

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。选项是一个 org.apache.camel.http.common.HttpBinding 类型。

 

字符串

camel.component.atmosphere-websocket.http-configuration

使用共享 HttpConfiguration 作为基本配置。选项是一个 org.apache.camel.http.common.HttpConfiguration 类型。

 

字符串

camel.component.atmosphere-websocket.http-registry

使用自定义 org.apache.camel.component.servlet.HttpRegistry。选项是一个 org.apache.camel.component.servlet.HttpRegistry 类型。

 

字符串

camel.component.atmosphere-websocket.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.atmosphere-websocket.servlet-name

要使用的默认 servlet 名称。默认名称为 CamelServlet。

CamelServlet

字符串

12.3. URI 格式

atmosphere-websocket:///relative path[?options]

12.4. 通过 Websocket 读取和编写数据

atmopshere-websocket 端点可以分别将数据写入套接字或从套接字读取数据,具体取决于端点是否配置为制作者还是消费者。

12.5. 将 URI 配置为读或写数据

在以下路由中,Camel 会从指定的 websocket 连接中读取。

from("atmosphere-websocket:///servicepath")
        .to("direct:next");

以及对等的 Spring 示例:

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="atmosphere-websocket:///servicepath"/>
    <to uri="direct:next"/>
  </route>
</camelContext>

在以下路由中,Camel 会从指定的 websocket 连接中读取。

from("direct:next")
        .to("atmosphere-websocket:///servicepath");

以及对等的 Spring 示例:

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:next"/>
    <to uri="atmosphere-websocket:///servicepath"/>
  </route>
</camelContext>

 

12.6. 另请参阅

第 13 章 Atom 组件

可作为 Camel 版本 1.2 提供

atom: component 用于轮询 Atom 源。

默认情况下,Camel 将每 60 秒轮询一次源。
注: 这些组件目前仅支持轮询(耗时)源。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-atom</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

13.1. URI 格式

atom://atomUri[?options]

其中,atomUri 是要轮询的 Atom 源的 URI。

13.2. 选项

Atom 组件没有选项。

Atom 端点使用 URI 语法配置:

atom:feedUri

使用以下路径和查询参数:

13.2.1. 路径名(1 参数):

名称描述默认类型

feedUri

需要 要轮询的源 URI。

 

字符串

13.2.2. 查询参数(27 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

feedHeader (consumer)

设置是否将 feed 对象添加为标头

true

布尔值

filter (consumer)

设定是否使用过滤,还是不是条目。

true

布尔值

lastUpdate (consumer)

设置用于从 atom feeds 过滤条目的时间戳。这个选项只与 splitEntries 结合使用。

 

Date

password (consumer)

设置 HTTP 源轮询时用于基本身份验证的密码

 

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

sortEntries (consumer)

设定是否按公布的日期对条目进行排序。仅在 splitEntries = true 时才起作用。

false

布尔值

splitEntries (consumer)

设置是否应单独发送条目,还是应将整个源作为单个消息发送

true

布尔值

throttleEntries (consumer)

设定是否应立即发送单一源轮询中的所有条目。如果为 true,则每个 consumer.delay 只处理一个条目。仅在 splitEntries = true 时才适用。

true

布尔值

username (consumer)

设置 HTTP 源轮询时用于基本身份验证的用户名

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

13.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.atom.enabled

启用 atom 组件

true

布尔值

camel.component.atom.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

13.4. 交换数据格式

Camel 将在返回的 Exchange 上通过条目设置 In 正文。根据 splitEntries 标记 Camel 将返回一个 EntryList<Entry>

选项行为

splitEntries

true

只设置来自当前处理源的一个条目: Exchange. in.body (Entry)

splitEntries

false

源中的整个条目列表被设置: exchange.in.body (List<Entry>)

Camel 可以在 In 标头上设置 Feed 对象(请参阅 feedHeader 选项来禁用此选项):

13.5. 消息标头

Camel atom 使用这些标头。

标头描述

CamelAtomFeed

当使用 org.apache.abdera.model.Feed 对象时,将设置为此标头。

13.6. Samples

在本例中,我们轮询 James Strachan 的博客。

from("atom://http://macstrac.blogspot.com/feeds/posts/default").to("seda:feeds");

在此例中,我们希望仅过滤我们想到 SEDA 队列的良好博客。这个示例还演示了如何设置 Camel 独立,而不在任何容器或 Spring 中运行。

13.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • RSS

第 14 章 Atomix Map 组件

可作为 Camel 版本 2.20 可用

camel atomix-map 组件允许您使用 Atomix 的 分布式 map 集合。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-atomix</artifactId>
        <version>${camel-version}</version>
    </dependency>

14.1. URI 格式

    atomix-map:mapName

14.2. 选项

Atomix Map 组件支持 5 个选项,它们如下所列。

名称描述默认类型

configuration (common)

共享组件配置

 

AtomixMapConfiguration

atomix (common)

共享 AtomixClient 实例

 

AtomixClient

nodes (common)

AtomixClient 的节点应连接到

 

list

configurationUri (common)

AtomixClient 配置的路径

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Atomix Map 端点使用 URI 语法进行配置:

atomix-map:resourceName

使用以下路径和查询参数:

14.2.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

14.2.2. 查询参数(18 参数):

名称描述默认类型

atomix (common)

要使用的 Atomix 实例

 

Atomix

configurationUri (common)

Atomix 配置 uri.

 

字符串

defaultAction (common)

默认操作。

PUT

操作

key (common)

如果标头中没有设置任何设置或者监听特定密钥的事件,要使用的密钥。

 

对象

nodes (common)

组成集群的节点地址。

 

字符串

resultHeader (common)

wil 执行结果的标头。

 

字符串

transport (common)

设置 Atomix 传输。

io.atomix.catalyst.transport.netty.NettyTransport

传输

ttl (common)

资源 ttl。

 

long

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

defaultResourceConfig (advanced)

集群范围内的默认资源配置。

 

Properties

defaultResourceOptions (advanced)

本地默认资源选项。

 

Properties

ephemeral (advanced)

如果本地成员应该将组作为 PersistentMember 加入到组中,则设置。如果设置为临时,本地成员将接收自动生成的 ID,则忽略本地 ID。

false

布尔值

readConsistency (advanced)

读取一致性级别。

 

ReadConsistency

resourceConfigs (advanced)

集群范围内的资源配置。

 

map

resourceOptions (advanced)

本地资源配置

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

14.3. Spring Boot Auto-Configuration

组件支持 9 个选项,如下所示。

名称描述默认类型

camel.component.atomix-map.atomix

共享 AtomixClient 实例。选项是一个 io.atomix.AtomixClient 类型。

 

字符串

camel.component.atomix-map.configuration-uri

AtomixClient 配置的路径

 

字符串

camel.component.atomix-map.configuration.default-action

默认操作。

 

AtomixMap$Action

camel.component.atomix-map.configuration.key

如果标头中没有设置任何设置或者监听特定密钥的事件,要使用的密钥。

 

对象

camel.component.atomix-map.configuration.result-header

wil 执行结果的标头。

 

字符串

camel.component.atomix-map.configuration.ttl

资源 ttl。

 

Long

camel.component.atomix-map.enabled

是否启用 atomix-map 组件的自动配置。默认启用。

 

布尔值

camel.component.atomix-map.nodes

AtomixClient 的节点应连接到

 

list

camel.component.atomix-map.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

14.4. Headers

名称类型描述

CamelAtomixResourceAction

AtomixMap.Action

  • PUT
  • PUT_IF_ABSENT
  • GET
  • 清除
  • SIZE
  • CONTAINS_KEY
  • CONTAINS_VALUE
  • IS_EMPTY
  • ENTRY_SET
  • 删除
  • 替换

要执行的操作

CamelAtomixResourceKey

对象

-

要操作的密钥

CamelAtomixResourceValue

对象

-

如果使用了 In Body,则该值

CamelAtomixResourceOldValue

对象

-

旧值

CamelAtomixResourceTTL

字符串/长

-

条目 TTL

CamelAtomixResourceReadConsistency

ReadConsistency

  • ATOMIC
  • ATOMIC_LEASE
  • 顺序
  • LOCAL

读取一致性级别

14.5. 配置组件以连接到 Atomix 集群

要加入的 Atomix 集群的节点可以是 Endpoint 或组件级别(推荐),如下一些示例:

  • endpoint:

    <beans xmlns="...">
        <camelContext xmlns="http://camel.apache.org/schema/spring">
            <from uri="direct:start"/>
                <to uri="atomix-map:myMap?nodes=node-1.atomix.cluster:8700,node-2.atomix.cluster:8700"/>
            </route>
        </camelContext>
    </beans>
  • 组件:

    <beans xmlns="...">
        <bean id="atomix-map" class="org.apache.camel.component.atomix.client.map.AtomixMapComponent">
            <property name="nodes" value="nodes=node-1.atomix.cluster:8700,node-2.atomix.cluster:8700"/>
        </bean>
    
        <camelContext xmlns="http://camel.apache.org/schema/spring">
            <from uri="direct:start"/>
                <to uri="atomix-map:myMap"/>
            </route>
        </camelContext>
    </beans>

14.6. 使用示例:

  • PUT 是一个带有 1 秒的 TTL 的元素:

    FluentProducerTemplate.on(context)
        .withHeader(AtomixClientConstants.RESOURCE_ACTION, AtomixMap.Action.PUT)
        .withHeader(AtomixClientConstants.RESOURCE_KEY, key)
        .withHeader(AtomixClientConstants.RESOURCE_TTL, "1s")
        .withBody(val)
        .to("direct:start")
        .send();

第 15 章 Atomix Messaging 组件

可作为 Camel 版本 2.20 可用

通过 camel atomix-messaging 组件,您可以使用 Atomix 的组 消息传递

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-atomix</artifactId>
        <version>${camel-version}</version>
    </dependency>

15.1. URI 格式

    atomix-messaging:group

Atomix Messaging 组件支持 5 个选项,它们如下所列。

名称描述默认类型

configuration (common)

共享组件配置

 

AtomixMessaging 配置

atomix (common)

共享 AtomixClient 实例

 

AtomixClient

nodes (common)

AtomixClient 的节点应连接到

 

list

configurationUri (common)

AtomixClient 配置的路径

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Atomix Messaging 端点使用 URI 语法进行配置:

atomix-messaging:resourceName

使用以下路径和查询参数:

15.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

15.1.2. 查询参数(19 参数):

名称描述默认类型

atomix (common)

要使用的 Atomix 实例

 

Atomix

broadcastType (common)

广播类型。

ALL

BroadcastType

channelName (common)

消息传递频道名称

 

字符串

configurationUri (common)

Atomix 配置 uri.

 

字符串

defaultAction (common)

默认操作。

直接

操作

memberName (common)

Atomix 组成员名称

 

字符串

nodes (common)

组成集群的节点地址。

 

字符串

resultHeader (common)

wil 执行结果的标头。

 

字符串

transport (common)

设置 Atomix 传输。

io.atomix.catalyst.transport.netty.NettyTransport

传输

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

defaultResourceConfig (advanced)

集群范围内的默认资源配置。

 

Properties

defaultResourceOptions (advanced)

本地默认资源选项。

 

Properties

ephemeral (advanced)

如果本地成员应该将组作为 PersistentMember 加入到组中,则设置。如果设置为临时,本地成员将接收自动生成的 ID,则忽略本地 ID。

false

布尔值

readConsistency (advanced)

读取一致性级别。

 

ReadConsistency

resourceConfigs (advanced)

集群范围内的资源配置。

 

map

resourceOptions (advanced)

本地资源配置

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

15.2. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.atomix-messaging.atomix

共享 AtomixClient 实例。选项是一个 io.atomix.AtomixClient 类型。

 

字符串

camel.component.atomix-messaging.configuration-uri

AtomixClient 配置的路径

 

字符串

camel.component.atomix-messaging.configuration.broadcast-type

广播类型。

 

AtomixMessaging$ BroadcastType

camel.component.atomix-messaging.configuration.channel-name

消息传递频道名称

 

字符串

camel.component.atomix-messaging.configuration.default-action

默认操作。

 

AtomixMessaging$Action

camel.component.atomix-messaging.configuration.member-name

Atomix 组成员名称

 

字符串

camel.component.atomix-messaging.configuration.result-header

wil 执行结果的标头。

 

字符串

camel.component.atomix-messaging.enabled

是否启用 atomix-messaging 组件的自动配置。默认启用。

 

布尔值

camel.component.atomix-messaging.nodes

AtomixClient 的节点应连接到

 

list

camel.component.atomix-messaging.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 16 章 Atomix MultiMap 组件

可作为 Camel 版本 2.20 可用

camel atomix-multimap 组件允许您使用 Atomix 的 分布式 MultiMap 集合。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-atomix</artifactId>
        <version>${camel-version}</version>
    </dependency>

16.1. URI 格式

    atomix-multimap:multiMapName

Atomix MultiMap 组件支持 5 选项,它们如下。

名称描述默认类型

配置 (消费者)

共享组件配置

 

AtomixMultiMap 配置

atomix (consumer)

共享 AtomixClient 实例

 

AtomixClient

nodes (consumer)

AtomixClient 的节点应连接到

 

list

configurationUri (consumer)

AtomixClient 配置的路径

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Atomix MultiMap 端点使用 URI 语法配置:

atomix-multimap:resourceName

使用以下路径和查询参数:

16.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

16.1.2. 查询参数(18 参数):

名称描述默认类型

atomix (consumer)

要使用的 Atomix 实例

 

Atomix

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

configurationUri (consumer)

Atomix 配置 uri.

 

字符串

defaultAction (consumer)

默认操作。

PUT

操作

密钥 (消费者)

如果标头中没有设置任何设置或者监听特定密钥的事件,要使用的密钥。

 

对象

nodes (consumer)

组成集群的节点地址。

 

字符串

resultHeader (consumer)

wil 执行结果的标头。

 

字符串

transport (consumer)

设置 Atomix 传输。

io.atomix.catalyst.transport.netty.NettyTransport

传输

ttl (consumer)

资源 ttl。

 

long

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

defaultResourceConfig (advanced)

集群范围内的默认资源配置。

 

Properties

defaultResourceOptions (advanced)

本地默认资源选项。

 

Properties

ephemeral (advanced)

如果本地成员应该将组作为 PersistentMember 加入到组中,则设置。如果设置为临时,本地成员将接收自动生成的 ID,则忽略本地 ID。

false

布尔值

readConsistency (advanced)

读取一致性级别。

 

ReadConsistency

resourceConfigs (advanced)

集群范围内的资源配置。

 

map

resourceOptions (advanced)

本地资源配置

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

16.2. Spring Boot Auto-Configuration

组件支持 9 个选项,如下所示。

名称描述默认类型

camel.component.atomix-multimap.atomix

共享 AtomixClient 实例。选项是一个 io.atomix.AtomixClient 类型。

 

字符串

camel.component.atomix-multimap.configuration-uri

AtomixClient 配置的路径

 

字符串

camel.component.atomix-multimap.configuration.default-action

默认操作。

 

AtomixMultiMap$Action

camel.component.atomix-multimap.configuration.key

如果标头中没有设置任何设置或者监听特定密钥的事件,要使用的密钥。

 

对象

camel.component.atomix-multimap.configuration.result-header

wil 执行结果的标头。

 

字符串

camel.component.atomix-multimap.configuration.ttl

资源 ttl。

 

Long

camel.component.atomix-multimap.enabled

是否启用 atomix-multimap 组件的自动配置。默认启用。

 

布尔值

camel.component.atomix-multimap.nodes

AtomixClient 的节点应连接到

 

list

camel.component.atomix-multimap.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 17 章 Atomix 队列组件

可作为 Camel 版本 2.20 可用

camel atomix-queue 组件允许您使用 Atomix 的 分布式队列 集合。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-atomix</artifactId>
        <version>${camel-version}</version>
    </dependency>

17.1. URI 格式

    atomix-queue:queueName

Atomix Queue 组件支持 5 个选项,它们列在下方。

名称描述默认类型

configuration (common)

共享组件配置

 

AtomixQueue Configuration

atomix (common)

共享 AtomixClient 实例

 

AtomixClient

nodes (common)

AtomixClient 的节点应连接到

 

list

configurationUri (common)

AtomixClient 配置的路径

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Atomix Queue 端点使用 URI 语法进行配置:

atomix-queue:resourceName

使用以下路径和查询参数:

17.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

17.1.2. 查询参数(16 参数):

名称描述默认类型

atomix (common)

要使用的 Atomix 实例

 

Atomix

configurationUri (common)

Atomix 配置 uri.

 

字符串

defaultAction (common)

默认操作。

添加

操作

nodes (common)

组成集群的节点地址。

 

字符串

resultHeader (common)

wil 执行结果的标头。

 

字符串

transport (common)

设置 Atomix 传输。

io.atomix.catalyst.transport.netty.NettyTransport

传输

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

defaultResourceConfig (advanced)

集群范围内的默认资源配置。

 

Properties

defaultResourceOptions (advanced)

本地默认资源选项。

 

Properties

ephemeral (advanced)

如果本地成员应该将组作为 PersistentMember 加入到组中,则设置。如果设置为临时,本地成员将接收自动生成的 ID,则忽略本地 ID。

false

布尔值

readConsistency (advanced)

读取一致性级别。

 

ReadConsistency

resourceConfigs (advanced)

集群范围内的资源配置。

 

map

resourceOptions (advanced)

本地资源配置

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

17.2. Spring Boot Auto-Configuration

组件支持 7 个选项,如下所示。

名称描述默认类型

camel.component.atomix-queue.atomix

共享 AtomixClient 实例。选项是一个 io.atomix.AtomixClient 类型。

 

字符串

camel.component.atomix-queue.configuration-uri

AtomixClient 配置的路径

 

字符串

camel.component.atomix-queue.configuration.default-action

默认操作。

 

AtomixQueue$Action

camel.component.atomix-queue.configuration.result-header

wil 执行结果的标头。

 

字符串

camel.component.atomix-queue.enabled

是否启用 atomix-queue 组件的自动配置。默认启用。

 

布尔值

camel.component.atomix-queue.nodes

AtomixClient 的节点应连接到

 

list

camel.component.atomix-queue.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 18 章 Atomix Set Component

可作为 Camel 版本 2.20 可用

camel atomix-set 组件允许您使用 Atomix 的 分布式集合

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-atomix</artifactId>
        <version>${camel-version}</version>
    </dependency>

18.1. URI 格式

    atomix-set:setName

Atomix Set 组件支持 5 个选项,它们如下。

名称描述默认类型

configuration (common)

共享组件配置

 

AtomixSetConfiguration

atomix (common)

共享 AtomixClient 实例

 

AtomixClient

nodes (common)

AtomixClient 的节点应连接到

 

list

configurationUri (common)

AtomixClient 配置的路径

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Atomix Set 端点使用 URI 语法进行配置:

atomix-set:resourceName

使用以下路径和查询参数:

18.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

18.1.2. 查询参数(17 参数):

名称描述默认类型

atomix (common)

要使用的 Atomix 实例

 

Atomix

configurationUri (common)

Atomix 配置 uri.

 

字符串

defaultAction (common)

默认操作。

添加

操作

nodes (common)

组成集群的节点地址。

 

字符串

resultHeader (common)

wil 执行结果的标头。

 

字符串

transport (common)

设置 Atomix 传输。

io.atomix.catalyst.transport.netty.NettyTransport

传输

ttl (common)

资源 ttl。

 

long

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

defaultResourceConfig (advanced)

集群范围内的默认资源配置。

 

Properties

defaultResourceOptions (advanced)

本地默认资源选项。

 

Properties

ephemeral (advanced)

如果本地成员应该将组作为 PersistentMember 加入到组中,则设置。如果设置为临时,本地成员将接收自动生成的 ID,则忽略本地 ID。

false

布尔值

readConsistency (advanced)

读取一致性级别。

 

ReadConsistency

resourceConfigs (advanced)

集群范围内的资源配置。

 

map

resourceOptions (advanced)

本地资源配置

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

18.2. Spring Boot Auto-Configuration

组件支持 8 个选项,如下所示。

名称描述默认类型

camel.component.atomix-set.atomix

共享 AtomixClient 实例。选项是一个 io.atomix.AtomixClient 类型。

 

字符串

camel.component.atomix-set.configuration-uri

AtomixClient 配置的路径

 

字符串

camel.component.atomix-set.configuration.default-action

默认操作。

 

AtomixSet$Action

camel.component.atomix-set.configuration.result-header

wil 执行结果的标头。

 

字符串

camel.component.atomix-set.configuration.ttl

资源 ttl。

 

Long

camel.component.atomix-set.enabled

是否启用 atomix-set 组件的自动配置。默认启用。

 

布尔值

camel.component.atomix-set.nodes

AtomixClient 的节点应连接到

 

list

camel.component.atomix-set.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 19 章 Atomix Value 组件

可作为 Camel 版本 2.20 可用

camel atomix-value 组件允许您使用 Atomix 的 分布式值

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-atomix</artifactId>
        <version>${camel-version}</version>
    </dependency>

19.1. URI 格式

    atomix-value:valueName

Atomix Value 组件支持 5 个选项,它们如下所列。

名称描述默认类型

configuration (common)

共享组件配置

 

AtomixValue Configuration

atomix (common)

共享 AtomixClient 实例

 

AtomixClient

nodes (common)

AtomixClient 的节点应连接到

 

list

configurationUri (common)

AtomixClient 配置的路径

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Atomix Value 端点使用 URI 语法进行配置:

atomix-value:resourceName

使用以下路径和查询参数:

19.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

19.1.2. 查询参数(17 参数):

名称描述默认类型

atomix (common)

要使用的 Atomix 实例

 

Atomix

configurationUri (common)

Atomix 配置 uri.

 

字符串

defaultAction (common)

默认操作。

SET

操作

nodes (common)

组成集群的节点地址。

 

字符串

resultHeader (common)

wil 执行结果的标头。

 

字符串

transport (common)

设置 Atomix 传输。

io.atomix.catalyst.transport.netty.NettyTransport

传输

ttl (common)

资源 ttl。

 

long

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

defaultResourceConfig (advanced)

集群范围内的默认资源配置。

 

Properties

defaultResourceOptions (advanced)

本地默认资源选项。

 

Properties

ephemeral (advanced)

如果本地成员应该将组作为 PersistentMember 加入到组中,则设置。如果设置为临时,本地成员将接收自动生成的 ID,则忽略本地 ID。

false

布尔值

readConsistency (advanced)

读取一致性级别。

 

ReadConsistency

resourceConfigs (advanced)

集群范围内的资源配置。

 

map

resourceOptions (advanced)

本地资源配置

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

19.2. Spring Boot Auto-Configuration

组件支持 8 个选项,如下所示。

名称描述默认类型

camel.component.atomix-value.atomix

共享 AtomixClient 实例。选项是一个 io.atomix.AtomixClient 类型。

 

字符串

camel.component.atomix-value.configuration-uri

AtomixClient 配置的路径

 

字符串

camel.component.atomix-value.configuration.default-action

默认操作。

 

AtomixValue$Action

camel.component.atomix-value.configuration.result-header

wil 执行结果的标头。

 

字符串

camel.component.atomix-value.configuration.ttl

资源 ttl。

 

Long

camel.component.atomix-value.enabled

是否启用 atomix-value 组件的自动配置。默认启用。

 

布尔值

camel.component.atomix-value.nodes

AtomixClient 的节点应连接到

 

list

camel.component.atomix-value.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 20 章 Avro Component

作为 Camel 2.10 版本提供

此组件为 avro 提供数据格式,允许使用 Apache Avro 的二进制数据格式对消息的序列化和反序列化化。此外,它还通过提供生产者和消费者端点(通过 netty 或 http),为 Apache Avro 的 rpc 提供支持。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-avro</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

20.1. Apache Avro 概述

Avro 允许您使用 json 等格式定义消息类型和协议,然后为指定类型和消息生成 java 代码。下面是一个 schema 的示例。

{"namespace": "org.apache.camel.avro.generated",
 "protocol": "KeyValueProtocol",

 "types": [
     {"name": "Key", "type": "record",
      "fields": [
          {"name": "key",   "type": "string"}
      ]
     },
     {"name": "Value", "type": "record",
      "fields": [
          {"name": "value",   "type": "string"}
      ]
     }
 ],

 "messages": {
     "put": {
         "request": [{"name": "key", "type": "Key"}, {"name": "value", "type": "Value"} ],
         "response": "null"
     },
     "get": {
         "request": [{"name": "key", "type": "Key"}],
         "response": "Value"
     }
 }
}

您可以使用 maven 和 ant 等模式轻松生成类。如需更多详细信息,请参阅 Apache Avro 文档

但是,它不强制采用一种模式,而且您可以为现有类创建 schema。自 2.12 开始,您可以使用现有协议接口发出 RCP 调用。您应该为协议本身使用接口,POJO Bean 或原语/字符串类用于参数和结果类型。下面是与上述 schema 对应的类示例:

package org.apache.camel.avro.reflection;

public interface KeyValueProtocol {
    void put(String key, Value value);
    Value get(String key);
}

class Value {
    private String value;
    public String getValue() { return value; }
    public void setValue(String value) { this.value = value; }
}

注:现有类只能用于 RPC (请参阅以下),而不是数据格式。

20.2. 使用 Avro 数据格式

使用 avro 数据格式非常简单,就像指定您希望在路由中总结或 unmarshal 的类一样容易。

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="direct:in"/>
            <marshal>
                <avro instanceClass="org.apache.camel.dataformat.avro.Message"/>
            </marshal>
            <to uri="log:out"/>
        </route>
    </camelContext>

另一种方法是指定上下文内的数据格式,并从您的路由引用它。

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
         <dataFormats>
            <avro id="avro" instanceClass="org.apache.camel.dataformat.avro.Message"/>
        </dataFormats>
        <route>
            <from uri="direct:in"/>
            <marshal ref="avro"/>
            <to uri="log:out"/>
        </route>
    </camelContext>

同样,您可以使用 avro 数据格式进行 umarshal。

20.3. 在 Camel 中使用 Avro RPC

如 Avro 上方所述,它还通过多种传输提供 RPC 支持,如 http 和 netty。Camel 为这两种传输提供使用者和制作者。

avro:[transport]:[host]:[port][?options]

支持的传输值当前为 http 或 netty。

由于 2.12,您可以在 URI 右侧指定消息名称:

avro:[transport]:[host]:[port][/messageName][?options]

对于消费者,您可以有多个连接到同一套接字的路由。给正确的路由分配由 avro 组件自动进行。未指定 messageName 的路由(若有)将用作默认值。

当为 avro ipc 使用 camel producers 时,"in"消息正文需要包含 avro 协议中指定的操作参数。该响应将在"out"消息的正文中添加。

在为 avro ipc 使用 camel avro 消费者时,请求参数将放置在所创建交换的"内"消息正文并且处理"out"消息的正文后,将作为响应发送。

注: 默认情况下,使用者参数被嵌套到阵列中。如果您只有一个参数,因为 2.12 您可以使用 singleParameter URI 选项在 "in" 消息正文中接收它,而无需数组嵌套。

20.4. Avro RPC URI 选项

Avro 组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享的 AvroConfiguration 一次配置选项

 

AvroConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Avro 端点使用 URI 语法进行配置:

avro:transport:host:port/messageName

使用以下路径和查询参数:

20.4.1. 路径名(4 参数):

名称描述默认类型

传输

要使用 所需的 传输,可以是 http 或 netty

 

AvroTransport

port

要使用 所需的 端口号

 

int

主机

要使用 所需的 主机名

 

字符串

messageName

要发送的消息的名称。

 

字符串

20.4.2. 查询参数(10 参数):

名称描述默认类型

protocol (common)

要使用的 Avro 协议

 

协议

protocolClassName (common)

Avro 协议使用 FQN 类名称定义

 

字符串

protocolLocation (common)

Avro 协议位置

 

字符串

reflectionProtocol (common)

如果提供的协议对象被反映为协议。应该只与 protocol 参数一起使用,因为用于 protocolClassName 协议类型将被自动检测

false

布尔值

singleParameter (common)

如果为 true,则消费者参数将不会嵌套到阵列中。如果协议为消息指定了更多,则 1 参数将失败

false

布尔值

uriAuthority (common)

使用授权(用户名和密码)

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

20.5. Spring Boot Auto-Configuration

组件支持 15 个选项,它们如下所列。

名称描述默认类型

camel.component.avro.configuration.host

要使用的主机名

 

字符串

camel.component.avro.configuration.message-name

要发送的消息的名称。

 

字符串

camel.component.avro.configuration.port

要使用的端口号

 

整数

camel.component.avro.configuration.protocol

要使用的 Avro 协议

 

协议

camel.component.avro.configuration.protocol-class-name

Avro 协议使用 FQN 类名称定义

 

字符串

camel.component.avro.configuration.protocol-location

Avro 协议位置

 

字符串

camel.component.avro.configuration.reflection-protocol

如果提供的协议对象被反映为协议。应该只与 protocol 参数一起使用,因为用于 protocolClassName 协议类型将被自动检测

false

布尔值

camel.component.avro.configuration.single-parameter

如果为 true,则消费者参数将不会嵌套到阵列中。如果协议为消息指定了更多,则 1 参数将失败

false

布尔值

camel.component.avro.configuration.transport

要使用的传输,可以是 http 或 netty

 

AvroTransport

camel.component.avro.configuration.uri-authority

使用授权(用户名和密码)

 

字符串

camel.component.avro.enabled

启用 avro 组件

true

布尔值

camel.component.avro.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.dataformat.avro.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.avro.enabled

启用 avro dataformat

true

布尔值

camel.dataformat.avro.instance-class-name

用于 marshal 和 unmarshalling 的类名称

 

字符串

20.6. Avro RPC 标头

名称描述

CamelAvroMessageName

要发送的消息的名称。在消费者中,从 URI 覆盖消息名称(若有)

20.7. 例子

通过 http 的 camel avro producer 示例:

        <route>
            <from uri="direct:start"/>
            <to uri="avro:http:localhost:{{avroport}}?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol"/>
            <to uri="log:avro"/>
        </route>

在上面的示例中,您需要填写 CamelAvroMessageName 标头。从 2.12 开始,您可以使用以下语法来调用恒定信息:

        <route>
            <from uri="direct:start"/>
            <to uri="avro:http:localhost:{{avroport}}/put?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol"/>
            <to uri="log:avro"/>
        </route>

使用 camel avro 用户通过 netty 消耗消息的示例:

        <route>
            <from uri="avro:netty:localhost:{{avroport}}?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol"/>
            <choice>
                <when>
                    <el>${in.headers.CamelAvroMessageName == 'put'}</el>
                    <process ref="putProcessor"/>
                </when>
                <when>
                    <el>${in.headers.CamelAvroMessageName == 'get'}</el>
                    <process ref="getProcessor"/>
                </when>
            </choice>
        </route>

由于 2.12,您可以设置两个不同的路由来执行相同的任务:

        <route>
            <from uri="avro:netty:localhost:{{avroport}}/put?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol">
            <process ref="putProcessor"/>
        </route>
        <route>
            <from uri="avro:netty:localhost:{{avroport}}/get?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol&singleParameter=true"/>
            <process ref="getProcessor"/>
        </route>

在上面的例子中,get 只使用一个参数,因此使用 singleParameter,而 getProcessor 将直接接收正文中的 Value 类,而 putProcessor 将收到大小 2,其值为 String key 和 value 值,并以数组内容填充。

第 21 章 Avro DataFormat

作为 Camel 版本 2.14 可用

此组件为 avro 提供数据格式,允许使用 Apache Avro 的二进制数据格式对消息的序列化和反序列化化。此外,它还通过提供生产者和消费者端点(通过 netty 或 http),为 Apache Avro 的 rpc 提供支持。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-avro</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

21.1. Apache Avro 概述

Avro 允许您使用 json 等格式定义消息类型和协议,然后为指定类型和消息生成 java 代码。下面是一个 schema 的示例。

{"namespace": "org.apache.camel.avro.generated",
 "protocol": "KeyValueProtocol",

 "types": [
     {"name": "Key", "type": "record",
      "fields": [
          {"name": "key",   "type": "string"}
      ]
     },
     {"name": "Value", "type": "record",
      "fields": [
          {"name": "value",   "type": "string"}
      ]
     }
 ],

 "messages": {
     "put": {
         "request": [{"name": "key", "type": "Key"}, {"name": "value", "type": "Value"} ],
         "response": "null"
     },
     "get": {
         "request": [{"name": "key", "type": "Key"}],
         "response": "Value"
     }
 }
}

您可以使用 maven 和 ant 等模式轻松生成类。如需更多详细信息,请参阅 Apache Avro 文档

但是,它不强制采用一种模式,而且您可以为现有类创建 schema。自 2.12 开始,您可以使用现有协议接口发出 RCP 调用。您应该为协议本身使用接口,POJO Bean 或原语/字符串类用于参数和结果类型。下面是与上述 schema 对应的类示例:

package org.apache.camel.avro.reflection;

public interface KeyValueProtocol {
    void put(String key, Value value);
    Value get(String key);
}

class Value {
    private String value;
    public String getValue() { return value; }
    public void setValue(String value) { this.value = value; }
}

注:现有类只能用于 RPC (请参阅以下),而不是数据格式。

21.2. 使用 Avro 数据格式

使用 avro 数据格式非常简单,就像指定您希望在路由中总结或 unmarshal 的类一样容易。

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="direct:in"/>
            <marshal>
                <avro instanceClass="org.apache.camel.dataformat.avro.Message"/>
            </marshal>
            <to uri="log:out"/>
        </route>
    </camelContext>

另一种方法是指定上下文内的数据格式,并从您的路由引用它。

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
         <dataFormats>
            <avro id="avro" instanceClass="org.apache.camel.dataformat.avro.Message"/>
        </dataFormats>
        <route>
            <from uri="direct:in"/>
            <marshal ref="avro"/>
            <to uri="log:out"/>
        </route>
    </camelContext>

同样,您可以使用 avro 数据格式进行 umarshal。

21.3. Avro Dataformat 选项

Avro 数据格式支持 2 个选项,它们如下。

名称默认Java 类型描述

instanceClassName

 

字符串

用于 marshal 和 unmarshalling 的类名称

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

21.4. Spring Boot Auto-Configuration

组件支持 15 个选项,它们如下所列。

名称描述默认类型

camel.component.avro.configuration.host

要使用的主机名

 

字符串

camel.component.avro.configuration.message-name

要发送的消息的名称。

 

字符串

camel.component.avro.configuration.port

要使用的端口号

 

整数

camel.component.avro.configuration.protocol

要使用的 Avro 协议

 

协议

camel.component.avro.configuration.protocol-class-name

Avro 协议使用 FQN 类名称定义

 

字符串

camel.component.avro.configuration.protocol-location

Avro 协议位置

 

字符串

camel.component.avro.configuration.reflection-protocol

如果提供的协议对象被反映为协议。应该只与 protocol 参数一起使用,因为用于 protocolClassName 协议类型将被自动检测

false

布尔值

camel.component.avro.configuration.single-parameter

如果为 true,则消费者参数将不会嵌套到阵列中。如果协议为消息指定了更多,则 1 参数将失败

false

布尔值

camel.component.avro.configuration.transport

要使用的传输,可以是 http 或 netty

 

AvroTransport

camel.component.avro.configuration.uri-authority

使用授权(用户名和密码)

 

字符串

camel.component.avro.enabled

启用 avro 组件

true

布尔值

camel.component.avro.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.dataformat.avro.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.avro.enabled

启用 avro dataformat

true

布尔值

camel.dataformat.avro.instance-class-name

用于 marshal 和 unmarshalling 的类名称

 

字符串

ND

第 22 章 AWS CloudWatch 组件

作为 Camel 2.11 版本提供

CW 组件允许将消息发送到 Amazon CloudWatch 指标。Amazon API 的实现由 AWS SDK 提供。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并被签名才能使用 Amazon CloudWatch。如需更多信息,请参阅 Amazon CloudWatch

22.1. URI 格式

aws-cw://namespace[?options]

如果指标不存在,则会创建指标。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

22.2. URI 选项

AWS CloudWatch 组件支持 5 个选项,它们如下。

名称描述默认类型

配置 (高级)

AWS CW 默认配置

 

CwConfiguration

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

CW 客户端需要工作的区域

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS CloudWatch 端点使用 URI 语法进行配置:

aws-cw:namespace

使用以下路径和查询参数:

22.2.1. 路径名(1 参数):

名称描述默认类型

namespace

所需的 指标命名空间

 

字符串

22.2.2. 查询参数(11 参数):

名称描述默认类型

amazonCwClient (producer)

使用 AmazonCloudWatch 作为客户端

 

AmazonCloudWatch

name (producer)

指标名称

 

字符串

proxyHost (producer)

在实例化 CW 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 CW 客户端时定义代理端口

 

整数

region (producer)

CW 客户端需要工作的区域

 

字符串

timestamp (producer)

指标时间戳

 

Date

unit (producer)

指标单元

 

字符串

value (producer)

指标值

 

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

22.3. Spring Boot Auto-Configuration

组件支持 16 个选项,如下所示。

名称描述默认类型

camel.component.aws-cw.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-cw.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-cw.configuration.amazon-cw-client

使用 AmazonCloudWatch 作为客户端

 

AmazonCloudWatch

camel.component.aws-cw.configuration.name

指标名称

 

字符串

camel.component.aws-cw.configuration.namespace

指标命名空间

 

字符串

camel.component.aws-cw.configuration.proxy-host

在实例化 CW 客户端时定义代理主机

 

字符串

camel.component.aws-cw.configuration.proxy-port

在实例化 CW 客户端时定义代理端口

 

整数

camel.component.aws-cw.configuration.region

CW 客户端需要工作的区域

 

字符串

camel.component.aws-cw.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-cw.configuration.timestamp

指标时间戳

 

Date

camel.component.aws-cw.configuration.unit

指标单元

 

字符串

camel.component.aws-cw.configuration.value

指标值

 

camel.component.aws-cw.enabled

启用 aws-cw 组件

true

布尔值

camel.component.aws-cw.region

CW 客户端需要工作的区域

 

字符串

camel.component.aws-cw.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-cw.secret-key

Amazon AWS Secret Key

 

字符串

所需的 CW 组件选项

您必须提供 Registry 中的 amazonCwClient 或您的 accessKey 和 secretKey 以访问 Amazon 的 CloudWatch

22.4. 使用

22.4.1. CW producer 评估的消息标头

标头类型描述

CamelAwsCwMetricName

字符串

Amazon CW 指标名称。

CamelAwsCwMetricValue

Amazon CW 指标值。

CamelAwsCwMetricUnit

字符串

Amazon CW 指标单元。

CamelAwsCwMetricNamespace

字符串

Amazon CW 指标命名空间。

CamelAwsCwMetricTimestamp

Date

Amazon CW 指标时间戳。

CamelAwsCwMetricDimensionName

字符串

Camel 2.12: Amazon CW 指标度名称。

CamelAwsCwMetricDimensionValue

字符串

Camel 2.12: Amazon CW 指标度值.

CamelAwsCwMetricDimensions

Map<String, String>

Camel 2.12: 维度名称和度量值的映射。

22.4.2. 高级 AmazonCloudWatch 配置

如果需要更多对 AmazonCloudWatch 实例配置进行控制,您可以创建自己的实例,并从 URI 引用它:

from("direct:start")
.to("aws-cw://namepsace?amazonCwClient=#client");

#client 指的是 registry 中的 AmazonCloudWatch

例如,如果您的 Camel 应用程序是在防火墙后面运行:

AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);

AmazonCloudWatch client = new AmazonCloudWatchClient(awsCredentials, clientConfiguration);

registry.bind("client", client);

22.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.10 或更高版本)。

22.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 23 章 AWS DynamoDB Component

作为 Camel 2.10 版本提供

DynamoDB 组件支持存储和检索来自 Amazon 的 DynamoDB 服务的数据。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并被签名才能使用 Amazon DynamoDB。有关更多信息,请参见 Amazon DynamoDB

23.1. URI 格式

aws-ddb://domainName[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

23.2. URI 选项

AWS DynamoDB 组件支持 5 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

AWS DDB 默认配置

 

DdbConfiguration

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

DDB 客户端需要工作的区域

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS DynamoDB 端点使用 URI 语法进行配置:

aws-ddb:tableName

使用以下路径和查询参数:

23.2.1. 路径名(1 参数):

名称描述默认类型

tableName

当前用于的表的名称。

 

字符串

23.2.2. 查询参数(13 参数):

名称描述默认类型

amazonDDBClient (producer)

使用 AmazonDynamoDB 作为客户端

 

AmazonDynamoDB

consistentRead (producer)

决定在读取数据时是否应强制执行强一致性。

false

布尔值

keyAttributeName (producer)

创建表时的属性名称

 

字符串

keyAttributeType (producer)

创建表时的属性类型

 

字符串

operation (producer)

要执行的操作

PutItem

DdbOperations

proxyHost (producer)

在实例化 DDB 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 DDB 客户端时定义代理端口

 

整数

readCapacity (producer)

从表中读取资源所需的置备吞吐量

 

Long

region (producer)

DDB 客户端需要工作的区域

 

字符串

writeCapacity (producer)

为将资源写入您的表的置备吞吐量

 

Long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

23.3. Spring Boot Auto-Configuration

组件支持 18 个选项,如下所示。

名称描述默认类型

camel.component.aws-ddb.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-ddb.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-ddb.configuration.amazon-d-d-b-client

使用 AmazonDynamoDB 作为客户端

 

AmazonDynamoDB

camel.component.aws-ddb.configuration.consistent-read

决定在读取数据时是否应强制执行强一致性。

false

布尔值

camel.component.aws-ddb.configuration.key-attribute-name

创建表时的属性名称

 

字符串

camel.component.aws-ddb.configuration.key-attribute-type

创建表时的属性类型

 

字符串

camel.component.aws-ddb.configuration.operation

要执行的操作

 

DdbOperations

camel.component.aws-ddb.configuration.proxy-host

在实例化 DDB 客户端时定义代理主机

 

字符串

camel.component.aws-ddb.configuration.proxy-port

在实例化 DDB 客户端时定义代理端口

 

整数

camel.component.aws-ddb.configuration.read-capacity

从表中读取资源所需的置备吞吐量

 

Long

camel.component.aws-ddb.configuration.region

DDB 客户端需要工作的区域

 

字符串

camel.component.aws-ddb.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-ddb.configuration.table-name

当前使用的表的名称。

 

字符串

camel.component.aws-ddb.configuration.write-capacity

为将资源写入您的表的置备吞吐量

 

Long

camel.component.aws-ddb.enabled

启用 aws-ddb 组件

true

布尔值

camel.component.aws-ddb.region

DDB 客户端需要工作的区域

 

字符串

camel.component.aws-ddb.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-ddb.secret-key

Amazon AWS Secret Key

 

字符串

所需的 DDB 组件选项

您必须提供 Registry 中的 amazonDDBClient 或您的 accessKey 和 secretKey 以访问 Amazon 的 DynamoDB

23.4. 使用

23.4.1. DDB producer 评估的邮件标头

标头类型描述

CamelAwsDdbBatchItems

Map<String, KeysAndAttributes>

由主键获取的表格名称和对应项的映射。

CamelAwsDdbTableName

字符串

此操作的表名称。

CamelAwsDdbKey

唯一标识表中的每个项目的主键。从 Camel 2.16.0 中,此标头的类型为 Map<String, AttributeValue>,而不是 Key

CamelAwsDdbReturnValues

字符串

如果要在修改前或修改(NONE、ALL_OLD、UPDATED_OLD、ALL_NEW、UPD_NEW)前或之后获取属性名称-值对。

CamelAwsDdbUpdateCondition

Map<String, ExpectedAttributeValue>

为条件修改指定属性。

CamelAwsDdbAttributeNames

collection<String>

如果未指定属性名称,则返回所有属性。

CamelAwsDdbConsistentRead

布尔值

如果设置为 true,则发出一致的读取,否则最终使用一致性。

CamelAwsDdbIndexName

字符串

如果设置将用作 Secondary Index for Query 操作。

CamelAwsDdbItem

Map<String, AttributeValue>

项属性的映射,必须包含定义项目的主键值。

CamelAwsDdbExactCount

布尔值

如果设置为 true,Amazon DynamoDB 会返回与查询参数匹配的总项目数,而不是匹配项目及其属性的列表。从 Camel 2.16.0 中,此标题已不存在。

CamelAwsDdbKeyConditions

map<String, Condition>

从 Camel 2.16.0.此标头指定查询的选择条件,并将两个旧的标头 CamelAwsDdbHashKeyValueCamelAwsDdbScanRangeKeyCondition合并

CamelAwsDdbStartKey

要从中继续之前的查询的项目的主键。

CamelAwsDdbHashKeyValue

AttributeValue

复合主键的散列组件的值。从 Camel 2.16.0 中,此标题已不存在。

CamelAwsDdbLimit

整数

要返回的最大项目数。

CamelAwsDdbScanRangeKeyCondition

状况

用于属性值和用于查询的运算符的容器。从 Camel 2.16.0 这个标头不再存在。

CamelAwsDdbScanIndexForward

布尔值

指定索引的正向或后向遍历。

CamelAwsDdbScanFilter

map<String, Condition>

评估扫描结果,仅返回所需的值。

CamelAwsDdbUpdateValues

Map<String, AttributeValueUpdate>

将属性名称映射到更新的新值和操作。

23.4.2. 在 BatchGetItems 操作过程中设置的消息标头

标头类型描述

CamelAwsDdbBatchResponse

Map<String,BatchResponse>

表名称和表中的对应项目属性。

CamelAwsDdbUnprocessedKeys

Map<String,KeysAndAttributes>

包含与当前响应没有处理的表格及其对应键的映射。

23.4.3. DeleteItem 操作期间设置的消息标头

标头类型描述

CamelAwsDdbAttributes

Map<String, AttributeValue>

操作返回的属性列表。

23.4.4. DeleteTable 操作期间设置的消息标头

标头类型描述

CamelAwsDdbProvisionedThroughput

  

ProvisionedThroughputDescription

 

这个表的 Provisioned throughput 属性的值

CamelAwsDdbCreationDate

Date

这个表的创建日期。

CamelAwsDdbTableItemCount

Long

此表的项目列表。

CamelAwsDdbKeySchema

KeySchema

标识此表的主键的 KeySchema。从 Camel 2.16.0,这个标头的类型是 List<KeySchemaElement> 而不是 KeySchema

CamelAwsDdbTableName

字符串

表名称。

CamelAwsDdbTableSize

Long

表大小(以字节为单位)。

CamelAwsDdbTableStatus

字符串

表的状态:CREATING、UPDATING、DELETING, ACTIVE

23.4.5. 在 DescribeTable 操作期间设置消息标头

标头类型描述

CamelAwsDdbProvisionedThroughput

{{ProvisionedThroughputDescription}}

这个表的 Provisioned throughput 属性的值

CamelAwsDdbCreationDate

Date

这个表的创建日期。

CamelAwsDdbTableItemCount

Long

此表的项目列表。

CamelAwsDdbKeySchema

{{KeySchema}}

标识此表的主键的 KeySchema。从 Camel 2.16.0,这个标头的类型是 List<KeySchemaElement> 而不是 KeySchema

CamelAwsDdbTableName

字符串

表名称。

CamelAwsDdbTableSize

Long

表大小(以字节为单位)。

CamelAwsDdbTableStatus

字符串

表的状态:CREATING、UPDATING、DELETING, ACTIVE

CamelAwsDdbReadCapacity

Long

此表的 ReadCapacityUnits 属性。

CamelAwsDdbWriteCapacity

Long

这个表格的 WriteCapacityUnits 属性。

23.4.6. GetItem 操作期间设置消息标头

标头类型描述

CamelAwsDdbAttributes

Map<String, AttributeValue>

操作返回的属性列表。

23.4.7. PutItem 操作期间设置的消息标头

标头类型描述

CamelAwsDdbAttributes

Map<String, AttributeValue>

操作返回的属性列表。

23.4.8. Query 操作期间设置的消息标头

标头类型描述

CamelAwsDdbItems

List<java.util.Map<String,AttributeValue>>

操作返回的属性列表。

CamelAwsDdbLastEvaluatedKey

查询操作停止的项目的主键,包括上一个结果集。

CamelAwsDdbConsumedCapacity

操作期间所消耗的表调配吞吐量的容量单位数。

CamelAwsDdbCount

整数

响应中的项目数。

23.4.9. 在 Scan 操作期间设置消息标头

标头类型描述

CamelAwsDdbItems

List<java.util.Map<String,AttributeValue>>

操作返回的属性列表。

CamelAwsDdbLastEvaluatedKey

查询操作停止的项目的主键,包括上一个结果集。

CamelAwsDdbConsumedCapacity

操作期间所消耗的表调配吞吐量的容量单位数。

CamelAwsDdbCount

整数

响应中的项目数。

CamelAwsDdbScannedCount

整数

应用任何过滤器前的完整扫描中的项目数。

23.4.10. UpdateItem 操作期间设置的消息标头

标头类型描述

CamelAwsDdbAttributes

Map<String, AttributeValue>

操作返回的属性列表。

23.4.11. 高级 AmazonDynamoDB 配置

如果您需要对 AmazonDynamoDB 实例配置进行更多控制,您可以创建自己的实例,并从 URI 中引用它:

from("direct:start")
.to("aws-ddb://domainName?amazonDDBClient=#client");

#client 指的是 registry 中的 AmazonDynamoDB

例如,如果您的 Camel 应用程序是在防火墙后面运行:

AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);

AmazonDynamoDB client = new AmazonDynamoDBClient(awsCredentials, clientConfiguration);

registry.bind("client", client);

23.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.10 或更高版本)。

23.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 24 章 AWS DynamoDB Streams Component

作为 Camel 2.17 版提供

DynamoDB Stream 组件支持接收来自 Amazon DynamoDB Stream 服务的消息。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon DynamoDB Streams。如需更多信息,请参阅 AWS DynamoDB

24.1. URI 格式

aws-ddbstream://table-name[?options]

需要在使用流前创建流。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

24.2. URI 选项

AWS DynamoDB Streams 组件支持 5 选项,它们如下所列。

名称描述默认类型

配置 (高级)

AWS DDB 流默认配置

 

DdbStreamConfiguration

accessKey (consumer)

Amazon AWS 访问密钥

 

字符串

secretKey (consumer)

Amazon AWS Secret Key

 

字符串

区域 (使用者)

Amazon AWS Region

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS DynamoDB Streams 端点使用 URI 语法配置:

aws-ddbstream:tableName

使用以下路径和查询参数:

24.2.1. 路径名(1 参数):

名称描述默认类型

tableName

dynamodb 表的 必填 名称

 

字符串

24.2.2. 查询参数(28 参数):

名称描述默认类型

amazonDynamoDbStreams Client (consumer)

Amazon DynamoDB 客户端用于此端点的所有请求

 

AmazonDynamoDBStreams

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

iteratorType (consumer)

定义 DynaboDB 流中的什么位置以开始获取记录。请注意,在流发现到实时前,使用 TRIM_HORIZON 可能会导致大量延迟。如果 AT,AFTER_SEQUENCE_NUENCE_NUMBER,则使用 sequenceNumberProvider MUST。

LATEST

ShardIteratorType

maxResultsPerRequest (consumer)

在每个轮询中获取的最大记录数

 

int

proxyHost (consumer)

在实例化 DDBStreams 客户端时定义代理主机

 

字符串

proxyPort (consumer)

在实例化 DDBStreams 客户端时定义代理端口

 

整数

区域 (使用者)

DDBStreams 客户端需要正常工作的区域

 

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

sequenceNumberProvider (consumer)

当使用两个 ShardIteratorType.AT、AFTER_SEQUENCE_NUMBER iterator 类型时的序列号的供应商。可以是 registry 引用,也可以是字面的序列号。

 

SequenceNumberProvider

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

24.3. Spring Boot Auto-Configuration

组件支持 15 个选项,它们如下所列。

名称描述默认类型

camel.component.aws-ddbstream.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-ddbstream.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-ddbstream.configuration.amazon-dynamo-db-streams-client

Amazon DynamoDB 客户端用于此端点的所有请求

 

AmazonDynamoDBStreams

camel.component.aws-ddbstream.configuration.iterator-type

定义 DynaboDB 流中的什么位置以开始获取记录。请注意,在流发现到实时前,使用 TRIM_HORIZON 可能会导致大量延迟。如果 AT,AFTER_SEQUENCE_NUENCE_NUMBER,则使用 sequenceNumberProvider MUST。

 

ShardIteratorType

camel.component.aws-ddbstream.configuration.max-results-per-request

在每个轮询中获取的最大记录数

 

整数

camel.component.aws-ddbstream.configuration.proxy-host

在实例化 DDBStreams 客户端时定义代理主机

 

字符串

camel.component.aws-ddbstream.configuration.proxy-port

在实例化 DDBStreams 客户端时定义代理端口

 

整数

camel.component.aws-ddbstream.configuration.region

DDBStreams 客户端需要正常工作的区域

 

字符串

camel.component.aws-ddbstream.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-ddbstream.configuration.sequence-number-provider

当使用两个 ShardIteratorType.AT、AFTER_SEQUENCE_NUMBER iterator 类型时的序列号的供应商。可以是 registry 引用,也可以是字面的序列号。

 

SequenceNumberProvider

camel.component.aws-ddbstream.configuration.table-name

dynamodb 表的名称

 

字符串

camel.component.aws-ddbstream.enabled

启用 aws-ddbstream 组件

true

布尔值

camel.component.aws-ddbstream.region

Amazon AWS Region

 

字符串

camel.component.aws-ddbstream.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-ddbstream.secret-key

Amazon AWS Secret Key

 

字符串

所需的 DynampDBStream 组件选项

您必须在 registry 中提供 amazonDynamoDbStreamsClient,并配置了代理和相关凭证。

24.4. 序列号

您可以提供一个字面字符串作为序列号,或者在 registry 中提供 bean。使用 bean 的示例将您当前的位置保存在更改源中,并在 Camel 启动中恢复它。

提供大于 describe-streams 结果中最大序列号的错误,因为它将导致 AWS 调用返回 HTTP 400。

24.5. 批处理消费者

此组件实施 Batch Consumer。

这样,您可以让实例知道此批处理中有多少消息,而实例可让聚合器聚合这个数量的消息。

24.6. 使用

24.6.1. AmazonDynamoDBStreamsClient configuration

您需要创建一个 AmazonDynamoDBStreamsClient 实例并将其绑定到 registry

ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);

Region region = Region.getRegion(Regions.fromName(region));
region.createClient(AmazonDynamoDBStreamsClient.class, null, clientConfiguration);
// the 'null' here is the AWSCredentialsProvider which defaults to an instance of DefaultAWSCredentialsProviderChain

registry.bind("kinesisClient", client);

24.6.2. 提供 AWS 凭证

建议利用 DefaultAWSCredentialsProviderChain 获取凭证,这是创建新 ClientConfiguration 实例时的默认设置,但可以在调用 createClient (…​)时指定不同的 AWSCredentialsProvider

24.7. 与 Downtime 冲突

24.7.1. AWS DynamoDB Streams 中断时间少于 24 小时

消费者将从上一次看到的序列号(针对 CAMEL-9515进行了实施)进行恢复,因此,只要停机没有包括 DynamoDB 本身,因此您应该收到大量事件。

24.7.2. AWS DynamoDB Streams 中断 24 小时

假定 AWS 只保留 24 小时更改,因此无论有哪些缓解措施如何,您都会错过更改事件。

24.8. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.7 或更高版本)。

24.9. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件
    +

第 25 章 AWS EC2 组件

作为 Camel 版本 2.16 可用

EC2 组件支持创建、运行、启动、停止和终止 AWS EC2 实例。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon EC2。如需更多信息,请参阅 Amazon EC2

25.1. URI 格式

aws-ec2://label[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

25.2. URI 选项

AWS EC2 组件支持 5 选项,它们如下。

名称描述默认类型

配置 (高级)

AWS EC2 默认配置

 

EC2Configuration

region (producer)

EC2 客户端要正常工作的区域

 

字符串

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS EC2 端点使用 URI 语法配置:

aws-ec2:label

使用以下路径和查询参数:

25.2.1. 路径名(1 参数):

名称描述默认类型

label

所需 的逻辑名称

 

字符串

25.2.2. 查询参数(8 参数):

名称描述默认类型

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

amazonEc2Client (producer)

使用现有配置的 AmazonEC2Client 作为客户端

 

AmazonEC2Client

operation (producer)

执行 所需的操作。它可以是 createAndRunInstances, startInstances, stopInstances, describeInstances, describeInstances, describeInstances, rebootInstances, monitorInstances, unmonitorInstances, createTags 或 deleteTags

 

EC2Operations

proxyHost (producer)

在实例化 EC2 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 EC2 客户端时定义代理端口

 

整数

region (producer)

EC2 客户端要正常工作的区域

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

25.3. Spring Boot Auto-Configuration

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.component.aws-ec2.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-ec2.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-ec2.configuration.amazon-ec2-client

使用现有配置的 AmazonEC2Client 作为客户端

 

AmazonEC2Client

camel.component.aws-ec2.configuration.operation

要执行的操作。它可以是 createAndRunInstances, startInstances, stopInstances, describeInstances, describeInstances, describeInstances, rebootInstances, monitorInstances, unmonitorInstances, createTags 或 deleteTags

 

EC2Operations

camel.component.aws-ec2.configuration.proxy-host

在实例化 EC2 客户端时定义代理主机

 

字符串

camel.component.aws-ec2.configuration.proxy-port

在实例化 EC2 客户端时定义代理端口

 

整数

camel.component.aws-ec2.configuration.region

EC2 客户端要正常工作的区域

 

字符串

camel.component.aws-ec2.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-ec2.enabled

启用 aws-ec2 组件

true

布尔值

camel.component.aws-ec2.region

EC2 客户端要正常工作的区域

 

字符串

camel.component.aws-ec2.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-ec2.secret-key

Amazon AWS Secret Key

 

字符串

所需的 EC2 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonEc2Client,才能访问 Amazon EC2 服务。

25.4. 使用

25.4.1. EC2 producer 评估的消息标头

标头类型描述

CamelAwsEC2ImageId

字符串

AWS 市场的镜像 ID

CamelAwsEC2InstanceType

com.amazonaws.services.ec2.model.InstanceType

要创建并运行的实例类型

CamelAwsEC2Operation

字符串

我们要执行的操作

CamelAwsEC2InstanceMinCount

Int

您要运行的实例的 mininum 数量。

CamelAwsEC2InstanceMaxCount

Int

要运行的最大实例数。

CamelAwsEC2InstanceMonitoring

布尔值

定义是否希望监控正在运行的实例

CamelAwsEC2InstanceEbsOptimized

布尔值

定义创建实例是否针对 EBS I/O 进行优化。

CamelAwsEC2InstanceSecurityGroups

集合

与实例关联的安全组

CamelAwsEC2InstancesIds

集合

用于执行启动、停止、描述和终止操作的实例 IDS 集合。

CamelAwsEC2InstancesTags

集合

从 EC2 资源添加或删除的标签集合

依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.16 或更高版本)。

25.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 26 章 AWS IAM 组件

作为 Camel 版本 2.23 可用

KMS 组件支持创建、运行、启动、停止和终止 AWS IAM 实例。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon IAM。如需更多信息,请参阅 Amazon IAM

26.1. URI 格式

aws-kms://label[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

26.2. URI 选项

AWS IAM 组件支持 5 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

AWS IAM 默认配置

 

IAMConfiguration

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

IAM 客户端需要正常工作的区域

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS IAM 端点使用 URI 语法配置:

aws-iam:label

使用以下路径和查询参数:

26.2.1. 路径名(1 参数):

名称描述默认类型

label

所需 的逻辑名称

 

字符串

26.2.2. 查询参数(8 参数):

名称描述默认类型

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

iamClient (producer)

使用现有配置的 AWS IAM 作为客户端

 

AmazonIdentity ManagementClient

operation (producer)

所需的操作

 

IAMOperations

proxyHost (producer)

在实例化 KMS 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 KMS 客户端时定义代理端口

 

整数

region (producer)

KMS 客户端需要正常工作的区域

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

26.3. Spring Boot Auto-Configuration

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.component.aws-iam.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-iam.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-iam.configuration.iam-client

使用现有配置的 AWS IAM 作为客户端

 

AmazonIdentity ManagementClient

camel.component.aws-iam.configuration.operation

要执行的操作

 

IAMOperations

camel.component.aws-iam.configuration.proxy-host

在实例化 KMS 客户端时定义代理主机

 

字符串

camel.component.aws-iam.configuration.proxy-port

在实例化 KMS 客户端时定义代理端口

 

整数

camel.component.aws-iam.configuration.region

KMS 客户端需要正常工作的区域

 

字符串

camel.component.aws-iam.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-iam.enabled

是否启用 aws-iam 组件的自动配置。默认启用。

 

布尔值

camel.component.aws-iam.region

IAM 客户端需要正常工作的区域

 

字符串

camel.component.aws-iam.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-iam.secret-key

Amazon AWS Secret Key

 

字符串

所需的 IAM 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonKmsClient,才能访问 Amazon IAM 服务。

26.4. 使用

26.4.1. IAM producer 评估的消息标头

标头类型描述

CamelAwsIAMOperation

字符串

我们要执行的操作

CamelAwsIAMUsername

字符串

要管理的用户的用户名

CamelAwsIAMAccessKeyID

字符串

要管理的 accessKey

CamelAwsIAMAccessKeyStatus

字符串

您要设置的 AccessKey 的 Status 是 active 和 inactive

26.4.2. IAM Producer 操作

Camel-AWS IAM 组件在制作者端提供以下操作:

  • listAccessKeys
  • createUser
  • deleteUser
  • listUsers
  • getUser
  • createAccessKey
  • deleteAccessKey
  • updateAccessKey

依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.16 或更高版本)。

26.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 27 章 AWS Kinesis 组件

作为 Camel 2.17 版提供

Kinesis 组件支持接收来自消息并将消息发送到 Amazon Kinesis 服务。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并被签名才能使用 Amazon Kinesis。如需更多信息,请访问 AWS Kinesis

27.1. URI 格式

aws-kinesis://stream-name[?options]

需要在使用流前创建流。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

27.2. URI 选项

AWS Kinesis 组件支持 5 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

AWS S3 默认配置

 

KinesisConfiguration

accessKey (common)

Amazon AWS 访问密钥

 

字符串

secretKey (common)

Amazon AWS Secret Key

 

字符串

region (common)

Amazon AWS Region

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS Kinesis 端点使用 URI 语法进行配置:

aws-kinesis:streamName

使用以下路径和查询参数:

27.2.1. 路径名(1 参数):

名称描述默认类型

streamName

所需的 名称

 

字符串

27.2.2. 查询参数(30 参数):

名称描述默认类型

amazonKinesisClient (common)

Amazon Kinesis 客户端用于此端点的所有请求

 

AmazonKinesis

proxyHost (common)

在实例化 DDBStreams 客户端时定义代理主机

 

字符串

proxyPort (common)

在实例化 DDBStreams 客户端时定义代理端口

 

整数

region (common)

Kinesis 客户端需要工作的区域

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

iteratorType (consumer)

定义 Kinesis 流中的什么位置以开始获取记录

TRIM_HORIZON

ShardIteratorType

maxResultsPerRequest (consumer)

在每个轮询中获取的最大记录数

1

int

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

sequenceNumber (consumer)

从开始轮询的序列号。如果iteratorType 设置为 AFTER_SEQUENCE_NUMBER 或 AT_SEQUENCE_NUMBER

 

字符串

shardClosed (consumer)

定义在分片关闭时的行为。可能的值有 ignore、silent 和 fail。如果忽略了消息,并且消费者将从一开始重新启动,不会记录下来,并且消费者从一开始就开始记录,而消费者将从开始失败,则会引发 ReachedClosedStateException。

Ignore

KinesisShardClosed StrategyEnum

shardId (consumer)

定义 Kinesis 流中要获取记录的 shardId

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

27.3. Spring Boot Auto-Configuration

组件支持 17 个选项,如下所示。

名称描述默认类型

camel.component.aws-kinesis.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-kinesis.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-kinesis.configuration.amazon-kinesis-client

Amazon Kinesis 客户端用于此端点的所有请求

 

AmazonKinesis

camel.component.aws-kinesis.configuration.iterator-type

定义 Kinesis 流中的什么位置以开始获取记录

 

ShardIteratorType

camel.component.aws-kinesis.configuration.max-results-per-request

在每个轮询中获取的最大记录数

1

整数

camel.component.aws-kinesis.configuration.proxy-host

在实例化 DDBStreams 客户端时定义代理主机

 

字符串

camel.component.aws-kinesis.configuration.proxy-port

在实例化 DDBStreams 客户端时定义代理端口

 

整数

camel.component.aws-kinesis.configuration.region

Kinesis 客户端需要工作的区域

 

字符串

camel.component.aws-kinesis.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-kinesis.configuration.sequence-number

从开始轮询的序列号。如果iteratorType 设置为 AFTER_SEQUENCE_NUMBER 或 AT_SEQUENCE_NUMBER

 

字符串

camel.component.aws-kinesis.configuration.shard-closed

定义在分片关闭时的行为。可能的值有 ignore、silent 和 fail。如果忽略了消息,并且消费者将从一开始重新启动,不会记录下来,并且消费者从一开始就开始记录,而消费者将从开始失败,则会引发 ReachedClosedStateException。

 

KinesisShardClosed StrategyEnum

camel.component.aws-kinesis.configuration.shard-id

定义 Kinesis 流中要获取记录的 shardId

 

字符串

camel.component.aws-kinesis.configuration.stream-name

流的名称

 

字符串

camel.component.aws-kinesis.enabled

启用 aws-kinesis 组件

true

布尔值

camel.component.aws-kinesis.region

Amazon AWS Region

 

字符串

camel.component.aws-kinesis.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-kinesis.secret-key

Amazon AWS Secret Key

 

字符串

所需的 Kinesis 组件选项

您必须在 registry 中提供 amazonKinesisClient,并配置了代理和相关凭证。

27.4. 批处理消费者

此组件实施 Batch Consumer。

这样,您可以让实例知道此批处理中有多少消息,而实例可让聚合器聚合这个数量的消息。

27.5. 使用

27.5.1. Kinesis 使用者设置的消息标头

标头类型描述

CamelAwsKinesisSequenceNumber

字符串

记录的序列号。这代表为一个 String,因为它大小不是由 API 定义。如果将其用作数字类型,则请使用

CamelAwsKinesisApproximateArrivalTimestamp

字符串

AWS 分配为记录的 arrival 时间。

CamelAwsKinesisPartitionKey

字符串

标识流中分配给数据记录的分片。

27.5.2. AmazonKinesis 配置

您需要创建一个 AmazonKinesisClient 实例并将其绑定到 registry

ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);

Region region = Region.getRegion(Regions.fromName(region));
region.createClient(AmazonKinesisClient.class, null, clientConfiguration);
// the 'null' here is the AWSCredentialsProvider which defaults to an instance of DefaultAWSCredentialsProviderChain

registry.bind("kinesisClient", client);

然后,您必须在 amazonKinesisClient 选项中引用 AmazonKinesisClient。

from("aws-kinesis://mykinesisstream?amazonKinesisClient=#kinesisClient")
  .to("log:out?showAll=true");

27.5.3. 提供 AWS 凭证

建议利用 DefaultAWSCredentialsProviderChain 获取凭证,这是创建新 ClientConfiguration 实例时的默认设置,但可以在调用 createClient (…​)时指定不同的 AWSCredentialsProvider

27.5.4. Kinesis producer 用来写入 Kinesis 的消息标头。制作者预期消息正文为 字节[]

标头类型描述

CamelAwsKinesisPartitionKey

字符串

要传递给 Kinesis 的 PartitionKey 来存储此记录。

CamelAwsKinesisSequenceNumber

字符串

可选参数来指示此记录的序列号。

27.5.5. 在成功存储记录时 Kinesis producer 设置的消息标头

标头类型描述

CamelAwsKinesisSequenceNumber

字符串

记录的顺序号,如 Response 语法中所定义

CamelAwsKinesisShardId

字符串

存储记录的分片 ID

27.6. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.17 或更高版本)。

27.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 28 章 AWS Kinesis Firehose 组件

作为 Camel 版本 2.19 可用

Kinesis Firehose 组件支持向 Amazon Kinesis Firehose 服务发送消息。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon Kinesis Firehose。如需更多信息,请参阅 AWS Kinesis Firehose

28.1. URI 格式

aws-kinesis-firehose://delivery-stream-name[?options]

需要在使用流前创建流。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

28.2. URI 选项

AWS Kinesis Firehose 组件支持 5 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

AWS Kinesis Firehose 默认配置

 

KinesisFirehose 配置

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

Amazon AWS Region

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS Kinesis Firehose 端点使用 URI 语法进行配置:

aws-kinesis-firehose:streamName

使用以下路径和查询参数:

28.2.1. 路径名(1 参数):

名称描述默认类型

streamName

所需的 名称

 

字符串

28.2.2. 查询参数(7 参数):

名称描述默认类型

amazonKinesisFirehoseClient (producer)

Amazon Kinesis Firehose 客户端用于此端点的所有请求

 

AmazonKinesisFirehose

proxyHost (producer)

在实例化 DDBStreams 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 DDBStreams 客户端时定义代理端口

 

整数

region (producer)

Kinesis 客户端需要工作的区域

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

28.3. Spring Boot Auto-Configuration

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.component.aws-kinesis-firehose.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-kinesis-firehose.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-kinesis-firehose.configuration.amazon-kinesis-firehose-client

Amazon Kinesis Firehose 客户端用于此端点的所有请求

 

AmazonKinesisFirehose

camel.component.aws-kinesis-firehose.configuration.proxy-host

在实例化 DDBStreams 客户端时定义代理主机

 

字符串

camel.component.aws-kinesis-firehose.configuration.proxy-port

在实例化 DDBStreams 客户端时定义代理端口

 

整数

camel.component.aws-kinesis-firehose.configuration.region

Kinesis 客户端需要工作的区域

 

字符串

camel.component.aws-kinesis-firehose.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-kinesis-firehose.configuration.stream-name

流的名称

 

字符串

camel.component.aws-kinesis-firehose.enabled

启用 aws-kinesis-firehose 组件

true

布尔值

camel.component.aws-kinesis-firehose.region

Amazon AWS Region

 

字符串

camel.component.aws-kinesis-firehose.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-kinesis-firehose.secret-key

Amazon AWS Secret Key

 

字符串

所需的 Kinesis Firehose 组件选项

您必须在 registry 中提供 amazonKinesisClient,并配置了代理和相关凭证。

28.4. 使用

28.4.1. Amazon Kinesis Firehose 配置

您需要创建一个 AmazonKinesisClient 实例并将其绑定到 registry

ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);

Region region = Region.getRegion(Regions.fromName(region));
region.createClient(AmazonKinesisClient.class, null, clientConfiguration);
// the 'null' here is the AWSCredentialsProvider which defaults to an instance of DefaultAWSCredentialsProviderChain

registry.bind("kinesisFirehoseClient", client);

然后,您必须在 amazonKinesisFirehoseClient 选项中引用 AmazonKinesisFirehoseClient URI。

from("aws-kinesis-firehose://mykinesisdeliverystream?amazonKinesisFirehoseClient=#kinesisClient")
  .to("log:out?showAll=true");

28.4.2. 提供 AWS 凭证

建议利用 DefaultAWSCredentialsProviderChain 获取凭证,这是创建新 ClientConfiguration 实例时的默认设置,但可以在调用 createClient (…​)时指定不同的 AWSCredentialsProvider

28.4.3. 在成功存储记录时 Kinesis producer 设置的消息标头

标头类型描述

CamelAwsKinesisFirehoseRecordId

字符串

记录 ID,如 响应语法中定义的

28.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.19 或更高版本)。

28.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 29 章 AWS KMS 组件

可作为 Camel 版本 2.21 可用

KMS 组件支持创建、运行、启动、停止和终止 AWS KMS 实例。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon KMS。如需更多信息,请参阅 Amazon KMS

29.1. URI 格式

aws-kms://label[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

29.2. URI 选项

AWS KMS 组件支持 5 个选项,它们如下。

名称描述默认类型

配置 (高级)

AWS KMS 默认配置

 

KMSConfiguration

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

KMS 客户端需要正常工作的区域

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS KMS 端点使用 URI 语法配置:

aws-kms:label

使用以下路径和查询参数:

29.2.1. 路径名(1 参数):

名称描述默认类型

label

所需 的逻辑名称

 

字符串

29.2.2. 查询参数(8 参数):

名称描述默认类型

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

kmsClient (producer)

使用现有配置的 AWS KMS 作为客户端

 

AWSKMS

operation (producer)

所需的操作

 

KMSOperations

proxyHost (producer)

在实例化 KMS 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 KMS 客户端时定义代理端口

 

整数

region (producer)

KMS 客户端需要正常工作的区域

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

29.3. Spring Boot Auto-Configuration

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.component.aws-kms.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-kms.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-kms.configuration.kms-client

使用现有配置的 AWS KMS 作为客户端

 

AWSKMS

camel.component.aws-kms.configuration.operation

要执行的操作

 

KMSOperations

camel.component.aws-kms.configuration.proxy-host

在实例化 KMS 客户端时定义代理主机

 

字符串

camel.component.aws-kms.configuration.proxy-port

在实例化 KMS 客户端时定义代理端口

 

整数

camel.component.aws-kms.configuration.region

KMS 客户端需要正常工作的区域

 

字符串

camel.component.aws-kms.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-kms.enabled

是否启用 aws-kms 组件自动配置。默认启用。

 

布尔值

camel.component.aws-kms.region

KMS 客户端需要正常工作的区域

 

字符串

camel.component.aws-kms.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-kms.secret-key

Amazon AWS Secret Key

 

字符串

所需的 KMS 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonKmsClient 访问 Amazon KMS 服务。

29.4. 使用

29.4.1. MQ producer 评估的消息标头

标头类型描述

CamelAwsKMSLimit

整数

执行 listKeys 操作时要返回的键数

CamelAwsKMSOperation

字符串

我们要执行的操作

CamelAwsKMSDescription

字符串

执行 createKey 操作时要使用的密钥描述

CamelAwsKMSKeyId

字符串

密钥 Id

29.4.2. KMS Producer 操作

Camel-AWS KMS 组件在制作者端提供以下操作:

  • listKeys
  • createKey
  • disableKey
  • scheduleKeyDeletion
  • describeKey
  • enableKey

依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.16 或更高版本)。

29.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 30 章 AWS Lambda Component

可作为 Camel 版本 2.20 可用

Lambda 组件支持 create、get、list、delete 和 调用 AWS Lambda 功能。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并经过注册才能使用 Amazon Lambda。如需更多信息,请参阅 Amazon Lambda

在创建 Lambda 功能时,您需要指定一个 IAM 角色,该角色至少连接了 AWSLambdaBasicExecuteRole 策略。

警告

lambda 是地区服务。与 S3 存储桶不同,在给定区域中创建的 Lambda 功能在其他区域不可用。

30.1. URI 格式

aws-lambda://functionName[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

30.2. URI 选项

AWS Lambda 组件支持 5 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

AWS Lambda 默认配置

 

LambdaConfiguration

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

Amazon AWS Region

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS Lambda 端点使用 URI 语法进行配置:

aws-lambda:function

使用以下路径和查询参数:

30.2.1. 路径名(1 参数):

名称描述默认类型

function

Lambda 功能 所需的 Name。

 

字符串

30.2.2. 查询参数(8 参数):

名称描述默认类型

operation (producer)

执行 所需的操作。它可以是 listFunctions、getFunction、createFunction、deleteFunction 或 callsFunction

 

LambdaOperations

region (producer)

Amazon AWS Region

 

字符串

awsLambdaClient (advanced)

使用现有配置的 AwsLambdaClient 作为客户端

 

AWSLambda

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

proxyHost (proxy)

在实例化 Lambda 客户端时定义代理主机

 

字符串

proxyPort (proxy)

在实例化 Lambda 客户端时定义代理端口

 

整数

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

30.3. Spring Boot Auto-Configuration

组件支持 13 个选项,它们如下所列。

名称描述默认类型

camel.component.aws-lambda.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-lambda.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-lambda.configuration.aws-lambda-client

使用现有配置的 AwsLambdaClient 作为客户端

 

AWSLambda

camel.component.aws-lambda.configuration.function

Lambda 函数的名称。

 

字符串

camel.component.aws-lambda.configuration.operation

要执行的操作。它可以是 listFunctions、getFunction、createFunction、deleteFunction 或 callsFunction

 

LambdaOperations

camel.component.aws-lambda.configuration.proxy-host

在实例化 Lambda 客户端时定义代理主机

 

字符串

camel.component.aws-lambda.configuration.proxy-port

在实例化 Lambda 客户端时定义代理端口

 

整数

camel.component.aws-lambda.configuration.region

Amazon AWS Region

 

字符串

camel.component.aws-lambda.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-lambda.enabled

是否启用 aws-lambda 组件的自动配置。默认启用。

 

布尔值

camel.component.aws-lambda.region

Amazon AWS Region

 

字符串

camel.component.aws-lambda.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-lambda.secret-key

Amazon AWS Secret Key

 

字符串

所需的 Lambda 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 awsLambdaClient,才能访问 Amazon Lambda 服务。

30.4. 使用

30.4.1. Lambda producer 评估的消息标头

操作标头类型描述必需

All

CamelAwsLambdaOperation

字符串

想要执行的操作。覆盖作为查询参数传递的操作

createFunction

CamelAwsLambdaS3Bucket

字符串

包含部署软件包的 .zip 文件的 Amazon S3 存储桶名称。此存储桶必须位于您创建 Lambda 功能的同一 AWS 区域。

createFunction

CamelAwsLambdaS3Key

字符串

要上传的 Amazon S3 对象(部署软件包)密钥名称。

createFunction

CamelAwsLambdaS3ObjectVersion

字符串

要上传的 Amazon S3 对象(部署软件包)版本。

createFunction

CamelAwsLambdaZipFile

字符串

zip 文件的本地路径(部署软件包)。zip 文件的内容也可以放在消息正文中。

createFunction

CamelAwsLambdaRole

字符串

IAM 角色的 Amazon 资源名称(ARN),Lambda 在执行功能时假设它访问任何其他 Amazon Web Services(AWS)资源。

createFunction

CamelAwsLambdaRuntime

字符串

正在上传的 Lambda 函数的运行时环境(nodejs、nodejs4.3、nodejs6.10、java8、python2.7、python3.6、dotnetcore1.0、odejs4.3-edge)

createFunction

CamelAwsLambdaHandler

字符串

Lambda 调用的代码中的功能开始执行。对于 Node.js,它是您的功能中的 module-name.export 值。对于 Java,它可以是 package.class-name::handler 或 package.class-name。

createFunction

CamelAwsLambdaDescription

字符串

用户提供的描述。

createFunction

CamelAwsLambdaTargetArn

字符串

包含 Amazon SQS 队列或 Amazon SNS 主题的目标 ARN(Amazon Resource Name)的父对象。

createFunction

CamelAwsLambdaMemorySize

整数

为函数配置的内存大小(以 MB 为单位)。必须是 64 MB 的倍数。

createFunction

CamelAwsLambdaKMSKeyArn

字符串

用于加密您的功能环境变量 KMS 密钥的 Amazon 资源名称(ARN)。如果没有提供,AWS Lambda 将使用默认的服务密钥。

createFunction

CamelAwsLambdaPublish

布尔值

此布尔值参数可用于请求 AWS Lambda 来创建 Lambda 函数,并将版本发布为 atomic 操作。

createFunction

CamelAwsLambdaTimeout

整数

Lambda 应该终止功能的功能执行时间。默认值为 3 秒。

createFunction

CamelAwsLambdaTracingConfig

字符串

您的模块的跟踪设置(活动或通过)。

createFunction

CamelAwsLambdaEnvironmentVariables

Map<String, String>

代表环境的配置设置的键值对。

createFunction

CamelAwsLambdaEnvironmentTags

Map<String, String>

分配给新功能的标签(键值对)。

createFunction

CamelAwsLambdaSecurityGroupIds

列出<字符串>

如果您的 Lambda 功能访问 VPC 中的资源,则 VPC 中的一个或者多个安全组 ID 的列表。

createFunction

CamelAwsLambdaSubnetIds

列出<字符串>

如果您的 Lambda 功能访问 VPC 中的资源,则 VPC 中的一个或者多个子网 ID 的列表。

30.5. Avalaible Operations 列表

  • listFunctions
  • 得到Function,
  • createFunction
  • deleteFunction
  • invokeFunction
  • updateFunction
  • createEventSourceMapping
  • deleteEventSourceMapping
  • listEventSourceMapping

30.6. 示例

要了解组件如何工作,您可能会了解这个 集成测试

30.7. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.16 或更高版本)。

30.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 31 章 AWS MQ 组件

可作为 Camel 版本 2.21 可用

EC2 组件支持创建、运行、启动、停止和终止 AWS MQ 实例。

前提条件

您必须拥有有效的 Amazon Web Services 开发人员帐户,并且必须注册才能使用 Amazon MQ。如需更多信息,请参阅 Amazon MQ

31.1. URI 格式

aws-mq://label[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

31.2. URI 选项

AWS MQ 组件支持 5 个选项,它们如下。

名称描述默认类型

配置 (高级)

AWS MQ 默认配置

 

MQConfiguration

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

MQ 客户端需要正常工作的区域

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS MQ 端点使用 URI 语法配置:

aws-mq:label

使用以下路径和查询参数:

31.2.1. 路径名(1 参数):

名称描述默认类型

label

所需 的逻辑名称

 

字符串

31.2.2. 查询参数(8 参数):

名称描述默认类型

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

amazonMqClient (producer)

使用现有配置的 AmazonMQClient 作为客户端

 

AmazonMQ

operation (producer)

执行 所需的操作。它可以是 listBrokers,createBroker,deleteBroker

 

MQOperations

proxyHost (producer)

在实例化 MQ 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 MQ 客户端时定义代理端口

 

整数

region (producer)

MQ 客户端需要正常工作的区域

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

31.3. Spring Boot Auto-Configuration

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.component.aws-mq.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-mq.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-mq.configuration.amazon-mq-client

使用现有配置的 AmazonMQClient 作为客户端

 

AmazonMQ

camel.component.aws-mq.configuration.operation

要执行的操作。它可以是 listBrokers,createBroker,deleteBroker

 

MQOperations

camel.component.aws-mq.configuration.proxy-host

在实例化 MQ 客户端时定义代理主机

 

字符串

camel.component.aws-mq.configuration.proxy-port

在实例化 MQ 客户端时定义代理端口

 

整数

camel.component.aws-mq.configuration.region

MQ 客户端需要正常工作的区域

 

字符串

camel.component.aws-mq.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-mq.enabled

是否启用 aws-mq 组件的自动配置。默认启用。

 

布尔值

camel.component.aws-mq.region

MQ 客户端需要正常工作的区域

 

字符串

camel.component.aws-mq.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-mq.secret-key

Amazon AWS Secret Key

 

字符串

所需的 EC2 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonEc2Client,才能访问 Amazon EC2 服务。

31.4. 使用

31.4.1. MQ producer 评估的消息标头

标头类型描述

CamelAwsMQMaxResults

字符串

从 listBrokers 操作中检索的结果数量

CamelAwsMQBrokerName

字符串

代理名称

CamelAwsMQOperation

字符串

我们要执行的操作

CamelAwsMQBrokerId

字符串

代理 ID

CamelAwsMQBrokerDeploymentMode

字符串

在 createBroker 操作中的代理部署模式

CamelAwsMQBrokerInstanceType

字符串

createBroker 操作中的 EC2 机器的实例类型

CamelAwsMQBrokerEngine

字符串

MQ 的 Broker 引擎。默认为 ACTIVEMQ

CamelAwsMQBrokerEngineVersion

字符串

MQ 的 Broker Engine 版本。目前,您可以在 ACTIVEMQ 5.15.6 和 5.15.0 之间选择

CamelAwsMQBrokerUsers

list<User>

MQ 的用户列表

CamelAwsMQBrokerPubliclyAccessible

布尔值

如果 MQ 实例必须公开可用,或不能公开。默认为 false。

依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.16 或更高版本)。

31.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 32 章 AWS S3 Storage Service Component

可作为 Camel 版本 2.8 使用

S3 组件支持从/到 Amazon 的 S3 服务存储和检索 objetc。

前提条件

您必须具有有效的 Amazon Web Services 开发人员帐户,并经过签名才能使用 Amazon S3。如需更多信息,请参阅 Amazon S3

32.1. URI 格式

aws-s3://bucketNameOrArn[?options]

如果存储桶不存在,则会创建它。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

例如,若要从存储桶 helloBucket 读取文件 hello.txt,请使用以下代码片段:

from("aws-s3:helloBucket?accessKey=yourAccessKey&secretKey=yourSecretKey&prefix=hello.txt")
  .to("file:/var/downloaded");

32.2. URI 选项

AWS S3 Storage Service 组件支持 5 个选项,它们如下。

名称描述默认类型

配置 (高级)

AWS S3 默认配置

 

S3Configuration

accessKey (common)

Amazon AWS 访问密钥

 

字符串

secretKey (common)

Amazon AWS Secret Key

 

字符串

region (common)

bucket 所在的区域。这个选项在 com.amazonaws.services.s3.model.CreateBucketRequest 中使用。

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS S3 Storage Service 端点使用 URI 语法进行配置:

aws-s3:bucketNameOrArn

使用以下路径和查询参数:

32.2.1. 路径名(1 参数):

名称描述默认类型

bucketNameOrArn

所需的 Bucket name 或 ARN

 

字符串

32.2.2. 查询参数(50 参数):

名称描述默认类型

amazonS3Client (common)

引用链接:https://camel.apache.org/registry.htmlRegistry.amazonaws.services.sqs.AmazonS3。

 

AmazonS3

pathStyleAccess (common)

S3 客户端是否应使用路径风格的访问

false

布尔值

policy (common)

此队列的策略在 com.amazonaws.services.s3.AmazonS3#setBucketPolicy()方法中设置。

 

字符串

proxyHost (common)

在实例化 SQS 客户端时定义代理主机

 

字符串

proxyPort (common)

指定要在客户端定义中使用的代理端口。

 

整数

region (common)

S3 客户端需要工作的区域

 

字符串

useIAMCredentials (common)

设置 S3 客户端是否应该在 EC2 实例上加载凭证,或者预期传递静态凭证。

false

布尔值

encryptionMaterials (common)

Symmetric/Asymmetric 客户端使用量中使用的加密材料

 

EncryptionMaterials

useEncryption (common)

定义是否必须使用加密

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

deleteAfterRead (consumer)

在检索了对象后,从 S3 中删除对象。只有提交 Exchange 时才会执行删除。如果进行回滚,则对象不会被删除。如果此选项为 false,则同一对象将会反复检索,并再次在轮询上再次进行。因此,您需要在路由中使用 Idempotent Consumer EIP 来过滤重复的。您可以使用 S3Constants#BUCKET_NAME 和 S3Constants#KEY 标头进行过滤,或者只有 S3Constants#KEY 标头。

true

布尔值

fileName (consumer)

使用给定文件名从存储桶获取对象

 

字符串

includeBody (consumer)

如果为 true,则交换正文将设置为文件内容的流。如果为 false,则标头将使用 S3 对象元数据设置,但正文会为空。这个选项与 autocloseBody 选项相关。如果将 includeBody 设置为 true,并将 autocloseBody 设为 false,则最多调用者关闭 S3Object 流。将 autocloseBody 设置为 true,将自动关闭 S3Object 流。

true

布尔值

maxConnections (consumer)

在 S3 客户端配置中设置 maxConnections 参数

60

int

maxMessagesPerPoll (consumer)

获取在每次轮询时轮询的最大消息数量。默认为没有限制,但使用 0 或负数数字将其禁用。

10

int

前缀 (使用者)

com.amazonaws.services.s3.model.ListObjectsRequest 中使用的前缀,仅用于消耗我们感兴趣的对象。

 

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

autocloseBody (consumer)

如果这个选项为 true,并且 includeBody 为 true,则在交换完成时将调用 S3Object.close ()方法。这个选项与 includeBody 选项相关。如果将 includeBody 设置为 true,并将 autocloseBody 设为 false,则最多调用者关闭 S3Object 流。将 autocloseBody 设置为 true,将自动关闭 S3Object 流。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

deleteAfterWrite (producer)

上传 S3 文件后删除文件对象

false

布尔值

multiPartUpload (producer)

如果是 true,则 camel 将以多部分格式上传文件,其部分大小决定由 partSize 的 选项决定

false

布尔值

operation (producer)

如果用户不想上传,则操作是要执行的操作

 

S3Operations

partSize (producer)

设置在多部分上传中使用的 partSize,默认大小为 25M。

26214400

long

serverSideEncryption (producer)

在使用 AWS 管理的密钥加密对象时,设置服务器端加密算法。例如,使用 AES256。

 

字符串

storageClass (producer)

要在 com.amazonaws.services.s3.model.PutObjectRequest 请求中设置的存储类。

 

字符串

awsKMSKeyId (producer)

在启用 KMS 时定义要使用的 KMS 密钥 ID

 

字符串

useAwsKMS (producer)

定义是否必须使用 KMS

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

accelerateModeEnabled ( advanced)

定义是否启用 accelerate Mode 为 true 或 false

false

布尔值

chunkedEncodingDisabled ( advanced)

定义 disabled Chunked Encoding 为 true 或 false

false

布尔值

dualstackEnabled ( advanced)

定义 Dualstack enabled 为 true 或 false

false

布尔值

forceGlobalBucketAccess Enabled (高级)

定义是否启用 Force Global Bucket Access 为 true 或 false

false

布尔值

payloadSigningEnabled ( advanced)

定义 Payload Signing 已启用为 true 或 false

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

32.3. Spring Boot Auto-Configuration

组件支持 34 个选项,它们如下所列。

名称描述默认类型

camel.component.aws-s3.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-s3.configuration.accelerate-mode-enabled

定义是否启用 accelerate Mode 为 true 或 false

false

布尔值

camel.component.aws-s3.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-s3.configuration.amazon-s3-client

引用链接:https://camel.apache.org/registry.htmlRegistry.amazonaws.services.sqs.AmazonS3。

 

AmazonS3

camel.component.aws-s3.configuration.autoclose-body

如果这个选项为 true,并且 includeBody 为 true,则在交换完成时将调用 S3Object.close ()方法。这个选项与 includeBody 选项相关。如果将 includeBody 设置为 true,并将 autocloseBody 设为 false,则最多调用者关闭 S3Object 流。将 autocloseBody 设置为 true,将自动关闭 S3Object 流。

true

布尔值

camel.component.aws-s3.configuration.aws-k-m-s-key-id

在启用 KMS 时定义要使用的 KMS 密钥 ID

 

字符串

camel.component.aws-s3.configuration.bucket-name

bucket 的名称。如果存储桶尚未存在,则会创建存储桶。

 

字符串

camel.component.aws-s3.configuration.chunked-encoding-disabled

定义 disabled Chunked Encoding 为 true 或 false

false

布尔值

camel.component.aws-s3.configuration.delete-after-read

在检索了对象后,从 S3 中删除对象。只有提交 Exchange 时才会执行删除。如果进行回滚,则对象不会被删除。如果此选项为 false,则同一对象将会反复检索,并再次在轮询上再次进行。因此,您需要在路由中使用 Idempotent Consumer EIP 来过滤重复的。您可以使用 S3Constants#BUCKET_NAME 和 S3Constants#KEY 标头进行过滤,或者只有 S3Constants#KEY 标头。

true

布尔值

camel.component.aws-s3.configuration.delete-after-write

上传 S3 文件后删除文件对象

false

布尔值

camel.component.aws-s3.configuration.dualstack-enabled

定义 Dualstack enabled 为 true 或 false

false

布尔值

camel.component.aws-s3.configuration.encryption-materials

Symmetric/Asymmetric 客户端使用量中使用的加密材料

 

EncryptionMaterials

camel.component.aws-s3.configuration.file-name

使用给定文件名从存储桶获取对象

 

字符串

camel.component.aws-s3.configuration.force-global-bucket-access-enabled

定义是否启用 Force Global Bucket Access 为 true 或 false

false

布尔值

camel.component.aws-s3.configuration.include-body

如果为 true,则交换正文将设置为文件内容的流。如果为 false,则标头将使用 S3 对象元数据设置,但正文会为空。这个选项与 autocloseBody 选项相关。如果将 includeBody 设置为 true,并将 autocloseBody 设为 false,则最多调用者关闭 S3Object 流。将 autocloseBody 设置为 true,将自动关闭 S3Object 流。

true

布尔值

camel.component.aws-s3.configuration.multi-part-upload

如果是 true,则 camel 将以多部分格式上传文件,其部分大小决定由 partSize 的 选项决定

false

布尔值

camel.component.aws-s3.configuration.operation

如果用户不想上传,则操作是要执行的操作

 

S3Operations

camel.component.aws-s3.configuration.part-size

设置在多部分上传中使用的 partSize,默认大小为 25M。

26214400

Long

camel.component.aws-s3.configuration.path-style-access

S3 客户端是否应使用路径风格的访问

false

布尔值

camel.component.aws-s3.configuration.payload-signing-enabled

定义 Payload Signing 已启用为 true 或 false

false

布尔值

camel.component.aws-s3.configuration.policy

此队列的策略在 com.amazonaws.services.s3.AmazonS3#setBucketPolicy()方法中设置。

 

字符串

camel.component.aws-s3.configuration.prefix

com.amazonaws.services.s3.model.ListObjectsRequest 中使用的前缀,仅用于消耗我们感兴趣的对象。

 

字符串

camel.component.aws-s3.configuration.proxy-host

在实例化 SQS 客户端时定义代理主机

 

字符串

camel.component.aws-s3.configuration.proxy-port

指定要在客户端定义中使用的代理端口。

 

整数

camel.component.aws-s3.configuration.region

S3 客户端需要工作的区域

 

字符串

camel.component.aws-s3.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-s3.configuration.server-side-encryption

在使用 AWS 管理的密钥加密对象时,设置服务器端加密算法。例如,使用 AES256。

 

字符串

camel.component.aws-s3.configuration.storage-class

要在 com.amazonaws.services.s3.model.PutObjectRequest 请求中设置的存储类。

 

字符串

camel.component.aws-s3.configuration.use-aws-k-m-s

定义是否必须使用 KMS

false

布尔值

camel.component.aws-s3.configuration.use-encryption

定义是否必须使用加密

false

布尔值

camel.component.aws-s3.enabled

启用 aws-s3 组件

true

布尔值

camel.component.aws-s3.region

bucket 所在的区域。这个选项在 com.amazonaws.services.s3.model.CreateBucketRequest 中使用。

 

字符串

camel.component.aws-s3.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-s3.secret-key

Amazon AWS Secret Key

 

字符串

所需的 S3 组件选项

您必须提供 registry 中的 amazonS3Client 或您的 accessKey 和 secretKey 以访问 Amazon 的 S3

32.4. 批处理消费者

此组件实施 Batch Consumer。

这样,您可以让实例知道此批处理中有多少消息,而实例可让聚合器聚合这个数量的消息。

32.5. 使用

32.5.1. S3 producer 评估的消息标头

标头类型描述

CamelAwsS3BucketName

字符串

此对象的存储桶名称将存储或用于当前操作

CamelAwsS3BucketDestinationName

字符串

Camel 2.18 :将用于当前操作的 bucket Destination Name

CamelAwsS3ContentLength

Long

此对象的内容长度。

CamelAwsS3ContentType

字符串

此对象的内容类型。

CamelAwsS3ContentControl

字符串

Camel 2.8.2: 此对象的内容控制。

CamelAwsS3ContentDisposition

字符串

Camel 2.8.2: 此对象的内容划分。

CamelAwsS3ContentEncoding

字符串

Camel 2.8.2: 此对象的内容编码。

CamelAwsS3ContentMD5

字符串

Camel 2.8.2: 此对象的 md5 checksum。

CamelAwsS3DestinationKey

字符串

Camel 2.18 :目标密钥将用于当前操作

CamelAwsS3Key

字符串

此对象将存储下或将用于当前操作的密钥

CamelAwsS3LastModified

java.util.Date

Camel 2.8.2: 此对象的最后一个修改的时间戳。

CamelAwsS3Operation

字符串

Camel 2.18 :要执行的操作。允许的值有 copyObject, deleteObject, listBuckets, deleteBucket, downloadLink, listObjects

CamelAwsS3StorageClass

字符串

Camel 2.8.4: 此对象的存储类。

CamelAwsS3CannedAcl

字符串

Camel 2.11.0: 将应用到对象的 canned acl。有关允许的值,请参阅 com.amazonaws.services.s3.model.CannedAccessControlList

CamelAwsS3Acl

com.amazonaws.services.s3.model.AccessControlList

Camel 2.11.0: 一个良好构造的 Amazon S3 访问控制列表对象。如需更多详情,请参阅 com.amazonaws.services.s3.model.AccessControlList

CamelAwsS3Headers

Map<String,String>

Camel 2.15.0 :支持获取或设置自定义对象Metadata 标头。

CamelAwsS3ServerSideEncryption

字符串

Camel 2.16: 设置使用 AWS 管理的密钥加密对象时的服务器端加密算法。例如,使用 AES256。

CamelAwsS3VersionId

字符串

要从当前操作存储或返回的对象版本

32.5.2. S3 producer 设置的消息标头

标头类型描述

CamelAwsS3ETag

字符串

新上传对象的 ETag 值。

CamelAwsS3VersionId

字符串

新上传对象 的可选 版本 ID。

CamelAwsS3DownloadLinkExpiration

字符串

URL 下载链接的过期(millis)该链接将存储在 CamelAwsS3DownloadLink 响应标头中。

32.5.3. S3 消费者设置的消息标头

标头类型描述

CamelAwsS3Key

字符串

此对象的存储位置。

CamelAwsS3BucketName

字符串

包含此对象的存储桶的名称。

CamelAwsS3ETag

字符串

根据 RFC 1864,十六进制编码了关联的对象 128 位 MD5 摘要。此数据用作完整性检查,以验证调用者收到的数据是否为 Amazon S3 发送的数据。

CamelAwsS3LastModified

Date

Last-Modified 标头的值,指明 Amazon S3 最后记录了对关联对象的修改日期和时间。

CamelAwsS3VersionId

字符串

关联的 Amazon S3 对象的版本 ID(如果可用)。版本 ID 仅在对象上传到启用了对象版本的 Amazon S3 存储桶时分配给对象。

CamelAwsS3ContentType

字符串

Content-Type HTTP 标头,指明存储在关联对象中的内容类型。此标头的值是标准 MIME 类型。

CamelAwsS3ContentMD5

字符串

根据 RFC 1864,相关对象(内容 - 不包括标头)的 base64 编码 128 位 MD5 摘要。此数据用作消息完整性检查,以验证 Amazon S3 收到的数据是否与调用者发送的数据相同。

CamelAwsS3ContentLength

Long

Content-Length HTTP 标头表示关联对象的大小(以字节为单位)。

CamelAwsS3ContentEncoding

字符串

可选的 Content-Encoding HTTP 标头指定哪些内容编码已应用到对象,而且必须应用哪些解码机制才能获取 Content-Type 字段引用的介质类型。

CamelAwsS3ContentDisposition

字符串

可选的 Content-Disposition HTTP 标头指定 presentational 信息,如要保存对象的推荐文件名。

CamelAwsS3ContentControl

字符串

可选的 Cache-Control HTTP 标头,允许用户指定 HTTP 请求/reply 链的缓存行为。

CamelAwsS3ServerSideEncryption

字符串

Camel 2.16: 使用 AWS 管理的密钥加密对象时的服务器端加密算法。

32.5.4. S3 Producer 操作

Camel-AWS s3 组件在制作者端提供以下操作:

  • copyObject
  • deleteObject
  • listBuckets
  • deleteBucket
  • downloadLink
  • listObjects

32.5.5. 高级 AmazonS3 配置

如果您的 Camel 应用程序正在防火墙后面运行,或者您需要对 AmazonS3 实例配置进行更多控制,您可以创建自己的实例:

AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");

ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);

AmazonS3 client = new AmazonS3Client(awsCredentials, clientConfiguration);

registry.bind("client", client);

并在您的 Camel aws-s3 组件配置中引用它:

from("aws-s3://MyBucket?amazonS3Client=#client&delay=5000&maxMessagesPerPoll=5")
.to("mock:result");

32.5.6. 使用带有 S3 组件的 KMS

要使用 AWS KMS 对/解密数据进行加密/解密数据,您可以使用以下示例 2.21.x 中引入的选项来加密数据。

from("file:tmp/test?fileName=test.txt")
     .setHeader(S3Constants.KEY, constant("testFile"))
     .to("aws-s3://mybucket?amazonS3Client=#client&useAwsKMS=true&awsKMSKeyId=3f0637ad-296a-3dfe-a796-e60654fb128c");

这样,您将询问 S3,以使用 KMS 密钥 3f0637ad-296a-3dfe-a796-e60654fb128c 加密文件 test.txt。当您需要下载此文件时,解密将在下载前直接进行。

32.5.7. 将"useIAMCredentials"用于 s3 组件

要使用 AWS IAM 凭证,您必须首先验证您在 上启动 Camel 应用程序的 EC2 是否具有一个 IAM 角色,其中包含附加的适当策略以便有效地运行。请记住,这个功能应该只在远程实例上设置为"true"。要进一步说明,由于 IAM 是 AWS 特定组件,所以您仍然需要在本地使用静态凭证,但 AWS 环境现在应该更易于管理。在实现并理解后,您可以将 AWS 环境的查询参数 "useIAMCredentials" 设置为 "true"!要根据本地和远程环境有效地打开和关闭此项,您可以考虑使用系统环境变量启用这个查询参数。例如,您的代码可将"useIAMCredentials"查询参数设置为 "true",当系统名为 "isRemote" 的环境变量被设置为 true 时(有很多其他方法可以这样做,这应该是一个简单示例)。虽然它并不完全取消对静态凭证的要求,但在 AWS 环境中使用 IAM 凭证无需在远程环境中刷新,并添加主要的安全增强(IAM 凭证会在策略被更新时自动刷新一次)。这是管理凭证的 AWS 建议的方法,因此应该尽可能使用。

32.6. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.8 或更高版本)。

32.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 33 章 AWS SimpleDB Component

作为 Camel 版本 2.9 提供。

sdb 组件支持从/检索到 Amazon 的 SDB 服务中的数据。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并且必须注册才能使用 Amazon SDB。如需更多信息,请参阅 Amazon SDB

33.1. URI 格式

aws-sdb://domainName[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

33.2. URI 选项

AWS SimpleDB 组件没有选项。

AWS SimpleDB 端点使用 URI 语法配置:

aws-sdb:domainName

使用以下路径和查询参数:

33.2.1. 路径名(1 参数):

名称描述默认类型

domainName

必需,当前使用的域的名称。

 

字符串

33.2.2. 查询参数(10 参数):

名称描述默认类型

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

amazonSDBClient (producer)

将 AmazonSimpleDB 用作客户端

 

AmazonSimpleDB

consistentRead (producer)

决定在读取数据时是否应强制执行强一致性。

false

布尔值

maxNumberOfDomains (producer)

您要返回的域名的最大数量。范围为 1 到 100。

 

整数

operation (producer)

要执行的操作

PutAttributes

SdbOperations

proxyHost (producer)

在实例化 SDB 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 SDB 客户端时定义代理端口

 

整数

region (producer)

SDB 客户端需要工作的区域

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

33.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.aws-sdb.enabled

启用 aws-sdb 组件

true

布尔值

camel.component.aws-sdb.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

所需的 SDB 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSDBClient,才能访问 Amazon 的 SDB

33.4. 使用

33.4.1. 由 SDB producer 评估的消息标头

标头类型描述

CamelAwsSdbAttributes

collection<Attribute>

要执行操作的属性列表。

CamelAwsSdbAttributeNames

collection<String>

要检索的属性的名称。

CamelAwsSdbConsistentRead

布尔值

决定在读取数据时是否应强制执行强一致性。

CamelAwsSdbDeletableItems

Collection<DeletableItem>

要在批处理中执行删除操作的项目列表。

CamelAwsSdbDomainName

字符串

当前使用的域的名称。

CamelAwsSdbItemName

字符串

此项目的唯一密钥

CamelAwsSdbMaxNumberOfDomains

整数

您要返回的域名的最大数量。范围为 1 * 到 100。

CamelAwsSdbNextToken

字符串

指定在什么位置启动域/item 名称列表的字符串。

CamelAwsSdbOperation

字符串

从 URI 选项覆盖操作。

CamelAwsSdbReplaceableAttributes

collection<ReplaceableAttribute>

要放入某个项的属性列表。

CamelAwsSdbReplaceableItems

Collection<ReplaceableItem>

要放入域的项目列表。

CamelAwsSdbSelectExpression

字符串

用于查询域的表达式。

CamelAwsSdbUpdateCondition

UpdateCondition

更新条件(如果指定)决定指定属性是否被更新/删除。

33.4.2. DomainMetadata 操作过程中设置的消息标头

标头类型描述

CamelAwsSdbTimestamp

整数

计算元数据的数据和时间(UNIX)秒。

CamelAwsSdbItemCount

整数

域中所有项目的数量。

CamelAwsSdbAttributeNameCount

整数

域中唯一属性名称的数量。

CamelAwsSdbAttributeValueCount

整数

域中所有属性名称/值对的数量。

CamelAwsSdbAttributeNameSize

Long

域中所有唯一属性名称的总大小(以字节为单位)。

CamelAwsSdbAttributeValueSize

Long

域中所有属性值的总大小(以字节为单位)。

CamelAwsSdbItemNameSize

Long

域中所有项名称的总大小(以字节为单位)。

33.4.3. 在 GetAttributes 操作过程中设置消息标头

标头类型描述

CamelAwsSdbAttributes

list<Attribute>

操作返回的属性列表。

33.4.4. ListDomains 操作过程中设置的消息标头

标头类型描述

CamelAwsSdbDomainNames

列出<字符串>

与表达式匹配的域名列表。

CamelAwsSdbNextToken

字符串

opaque 令牌表示超过指定的 MaxNumberOfDomains 所在域更多。

33.4.5. 在选择操作过程中设置消息标头

标头类型描述

CamelAwsSdbItems

list<Item>

与所选表达式匹配的项目列表。

CamelAwsSdbNextToken

字符串

opaque 令牌表示匹配了 MaxNumberOfItems 的项目数量、响应大小超过 1MB 字节,或者执行时间超过 5 秒。

33.4.6. 高级 AmazonSimpleDB 配置

如果您需要对 AmazonSimpleDB 实例配置进行更多的控制,您可以创建自己的实例并从 URI 引用它:

from("direct:start")
.to("aws-sdb://domainName?amazonSDBClient=#client");

#client 指的是 registry 中的 AmazonSimpleDB

例如,如果您的 Camel 应用程序是在防火墙后面运行:

AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);

AmazonSimpleDB client = new AmazonSimpleDBClient(awsCredentials, clientConfiguration);

registry.bind("client", client);

33.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.8.4 或更高版本)。

33.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 34 章 AWS Simple Email Service 组件

作为 Camel 版本 2.9 提供。

ses 组件支持向 Amazon 的 SES 服务发送电子邮件。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon SES。如需更多信息,请参阅 Amazon SES

34.1. URI 格式

aws-ses://from[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

34.2. URI 选项

AWS Simple Email Service 组件支持 5 选项,它们如下。

名称描述默认类型

配置 (高级)

AWS SES 默认配置

 

SesConfiguration

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

SES 客户端需要工作的区域

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS Simple Email Service 端点使用 URI 语法配置:

aws-ses:from

使用以下路径和查询参数:

34.2.1. 路径名(1 参数):

名称描述默认类型

from

需要 发送者的电子邮件地址。

 

字符串

34.2.2. 查询参数(11 参数):

名称描述默认类型

amazonSESClient (producer)

使用 AmazonSimpleEmailService 作为客户端

 

AmazonSimpleEmail Service

proxyHost (producer)

在实例化 SES 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 SES 客户端时定义代理端口

 

整数

region (producer)

SES 客户端需要工作的区域

 

字符串

replyToAddresses (producer)

对该信息的回复地址列表(es),使用 'CamelAwsSesReplyToAddresses' 标头覆盖它。

 

list

returnPath (producer)

退回通知要转发的电子邮件地址,使用 'CamelAwsSesReturnPath' 标头覆盖它。

 

字符串

subject (producer)

如果消息标题为 'CamelAwsSesSubject',则使用该主题。

 

字符串

to (producer)

目标电子邮件地址列表。可以使用 'CamelAwsSesTo' 标头覆盖n。

 

list

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

34.3. Spring Boot Auto-Configuration

组件支持 16 个选项,如下所示。

名称描述默认类型

camel.component.aws-ses.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-ses.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-ses.configuration.amazon-s-e-s-client

使用 AmazonSimpleEmailService 作为客户端

 

AmazonSimpleEmail Service

camel.component.aws-ses.configuration.from

发件人的电子邮件地址。

 

字符串

camel.component.aws-ses.configuration.proxy-host

在实例化 SES 客户端时定义代理主机

 

字符串

camel.component.aws-ses.configuration.proxy-port

在实例化 SES 客户端时定义代理端口

 

整数

camel.component.aws-ses.configuration.region

SES 客户端需要工作的区域

 

字符串

camel.component.aws-ses.configuration.reply-to-addresses

对该信息的回复地址列表(es),使用 'CamelAwsSesReplyToAddresses' 标头覆盖它。

 

list

camel.component.aws-ses.configuration.return-path

退回通知要转发的电子邮件地址,使用 'CamelAwsSesReturnPath' 标头覆盖它。

 

字符串

camel.component.aws-ses.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-ses.configuration.subject

如果消息标题为 'CamelAwsSesSubject',则使用该主题。

 

字符串

camel.component.aws-ses.configuration.to

目标电子邮件地址列表。可以使用 'CamelAwsSesTo' 标头覆盖n。

 

list

camel.component.aws-ses.enabled

启用 aws-ses 组件

true

布尔值

camel.component.aws-ses.region

SES 客户端需要工作的区域

 

字符串

camel.component.aws-ses.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-ses.secret-key

Amazon AWS Secret Key

 

字符串

所需的 SES 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSESClient,才能访问 Amazon 的 SES

34.4. 使用

34.4.1. 由 SES producer 评估的消息标头

标头类型描述

CamelAwsSesFrom

字符串

发件人的电子邮件地址。

CamelAwsSesTo

列出<字符串>

此电子邮件的目的地。

CamelAwsSesSubject

字符串

消息的主题。

CamelAwsSesReplyToAddresses

列出<字符串>

邮件的答复电子邮件地址。

CamelAwsSesReturnPath

字符串

要转发退回通知的电子邮件地址。

CamelAwsSesHtmlEmail

布尔值

自 Camel 2.12.3 起,显示电子邮件内容是否为 HTML 的标记。

34.4.2. 由 SES producer 设置的消息标头

标头类型描述

CamelAwsSesMessageId

字符串

Amazon SES 消息 ID。

34.4.3. 高级 AmazonSimpleEmailService 配置

如果您需要更多对 AmazonSimpleEmailService 实例配置进行更多的控制,您可以创建自己的实例并从 URI 引用它:

from("direct:start")
.to("aws-ses://example@example.com?amazonSESClient=#client");

#client 指的是 registry 中的 AmazonSimpleEmailService

例如,如果您的 Camel 应用程序是在防火墙后面运行:

AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);
AmazonSimpleEmailService client = new AmazonSimpleEmailServiceClient(awsCredentials, clientConfiguration);

registry.bind("client", client);

34.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.8.4 或更高版本)。

34.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 35 章 AWS Simple notification System 组件

可作为 Camel 版本 2.8 使用

SNS 组件允许将消息发送到 Amazon Simple Notification Topic。Amazon API 的实现由 AWS SDK 提供。

前提条件

您必须具有有效的 Amazon Web Services 开发人员帐户,并经过签名才能使用 Amazon SNS。如需更多信息,请参阅 Amazon SNS

35.1. URI 格式

aws-sns://topicNameOrArn[?options]

如果主题不存在,则会创建这些主题。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

35.2. URI 选项

AWS Simple Notification System 组件支持 5 选项,它们如下。

名称描述默认类型

配置 (高级)

AWS SNS 默认配置

 

SnsConfiguration

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

SNS 客户端需要工作的区域

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS Simple Notification System 端点使用 URI 语法配置:

aws-sns:topicNameOrArn

使用以下路径和查询参数:

35.2.1. 路径名(1 参数):

名称描述默认类型

topicNameOrArn

所需的 主题名称或 ARN

 

字符串

35.2.2. 查询参数(11 参数):

名称描述默认类型

amazonSNSClient (producer)

使用 AmazonSNS 作为客户端

 

AmazonSNS

headerFilterStrategy (producer)

使用自定义 HeaderFilterStrategy 将标头映射到/来自 Camel。

 

HeaderFilterStrategy

messageStructure (producer)

要使用的消息结构,如 json

 

字符串

policy (producer)

此队列的策略

 

字符串

proxyHost (producer)

在实例化 SNS 客户端时定义代理主机

 

字符串

proxyPort (producer)

在实例化 SNS 客户端时定义代理端口

 

整数

region (producer)

SNS 客户端需要工作的区域

 

字符串

subject (producer)

如果邮件标题为"CamelAwsSubject"不存在,将使用的主题。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

35.3. Spring Boot Auto-Configuration

组件支持 16 个选项,如下所示。

名称描述默认类型

camel.component.aws-sns.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-sns.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-sns.configuration.amazon-s-n-s-client

使用 AmazonSNS 作为客户端

 

AmazonSNS

camel.component.aws-sns.configuration.message-structure

要使用的消息结构,如 json

 

字符串

camel.component.aws-sns.configuration.policy

此队列的策略

 

字符串

camel.component.aws-sns.configuration.proxy-host

在实例化 SNS 客户端时定义代理主机

 

字符串

camel.component.aws-sns.configuration.proxy-port

在实例化 SNS 客户端时定义代理端口

 

整数

camel.component.aws-sns.configuration.region

SNS 客户端需要工作的区域

 

字符串

camel.component.aws-sns.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-sns.configuration.subject

如果邮件标题为"CamelAwsSubject"不存在,将使用的主题。

 

字符串

camel.component.aws-sns.configuration.topic-arn

分配给创建的主题的 Amazon 资源名称(ARN)。

 

字符串

camel.component.aws-sns.configuration.topic-name

主题的名称

 

字符串

camel.component.aws-sns.enabled

启用 aws-sns 组件

true

布尔值

camel.component.aws-sns.region

SNS 客户端需要工作的区域

 

字符串

camel.component.aws-sns.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-sns.secret-key

Amazon AWS Secret Key

 

字符串

所需的 SNS 组件选项

您必须提供 registry 中的 amazonSNSClient 或您的 accessKey 和 secretKey 以访问 Amazon 的 SNS

35.4. 使用

35.4.1. SNS producer 评估的消息标头

标头类型描述

CamelAwsSnsSubject

字符串

Amazon SNS 消息主题。如果没有设置,则使用 SnsConfiguration 中的主题。

35.4.2. SNS producer 设置的消息标头

标头类型描述

CamelAwsSnsMessageId

字符串

Amazon SNS 消息 ID。

35.4.3. 高级 AmazonSNS 配置

如果需要更多对 AmazonSNS 实例配置进行控制,您可以创建自己的实例,并从 URI 引用它:

from("direct:start")
.to("aws-sns://MyTopic?amazonSNSClient=#client");

#client 指的是 Registry 中的 AmazonSNS

例如,如果您的 Camel 应用程序是在防火墙后面运行:

AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);
AmazonSNS client = new AmazonSNSClient(awsCredentials, clientConfiguration);

registry.bind("client", client);

35.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.8 或更高版本)。

35.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 36 章 AWS Simple Queue Service 组件

可作为 Camel 版本 2.6 提供。

sqs 组件支持向 Amazon 的 SQS 服务发送和接收信息。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并被签名才能使用 Amazon SQS。如需更多信息,请参阅 Amazon SQS

36.1. URI 格式

aws-sqs://queueNameOrArn[?options]

如果队列不存在,则会创建队列。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

36.2. URI 选项

AWS Simple Queue Service 组件支持 5 选项,它们如下。

名称描述默认类型

配置 (高级)

AWS SQS 默认配置

 

SqsConfiguration

accessKey (common)

Amazon AWS 访问密钥

 

字符串

secretKey (common)

Amazon AWS Secret Key

 

字符串

region (common)

指定可与 queueOwnerAWSAccountId 一起使用的队列区域,以构建服务 URL。

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS Simple Queue Service 端点使用 URI 语法配置:

aws-sqs:queueNameOrArn

使用以下路径和查询参数:

36.2.1. 路径名(1 参数):

名称描述默认类型

queueNameOrArn

所需的 队列名称或 ARN

 

字符串

36.2.2. 查询参数(49 参数):

名称描述默认类型

amazonAWSHost (common)

Amazon AWS 云的主机名。

amazonaws.com

字符串

amazonSQSClient (common)

使用 AmazonSQS 作为客户端

 

AmazonSQS

headerFilterStrategy (common)

使用自定义 HeaderFilterStrategy 将标头映射到/来自 Camel。

 

HeaderFilterStrategy

queueOwnerAWSAccountId (common)

当您需要使用不同的帐户拥有者时,请指定队列拥有者 aws 帐户 id。

 

字符串

region (common)

指定可与 queueOwnerAWSAccountId 一起使用的队列区域,以构建服务 URL。

 

字符串

useIAMCredentials (common)

设置 SQS 客户端是否应该能够在 EC2 实例上加载凭证,或者预期传递静态凭证。

false

布尔值

attributeNames (consumer)

要在消耗时接收的属性名称列表。可以使用逗号分隔多个名称。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

concurrentConsumers (consumer)

允许您使用多个线程轮询 sqs 队列来增加吞吐量

1

int

defaultVisibilityTimeout (consumer)

默认可见性超时(以秒为单位)

 

整数

deleteAfterRead (consumer)

读取后,从 SQS 删除消息

true

布尔值

deleteIfFiltered (consumer)

如果交换无法通过过滤器,则是否将 DeleteMessage 发送到 SQS 队列。如果 'false' 和 Exchange 没有通过路由上游的 Camel 过滤器进行,则不会发送 DeleteMessage。

true

布尔值

extendMessageVisibility (consumer)

如果启用,则调度的后台任务将保留扩展 SQS 上消息可见性。如果处理消息需要很长时间,则需要这个操作。如果设为 true defaultVisibilityTimeout,则必须设置。请参阅 Amazon 文档的详细信息。

false

布尔值

maxMessagesPerPoll (consumer)

获取在每次轮询时轮询的最大消息数量。默认为没有限制,但使用 0 或负数数字将其禁用。

 

int

messageAttributeNames (consumer)

要在消耗时接收的消息属性名称列表。可以使用逗号分隔多个名称。

 

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

visibilityTimeout (consumer)

在由 ReceiveMessage 请求在 com.amazonaws.services.sqs.model.SetQueueAttributesRequest 中检索后,接收的消息从后续检索请求中隐藏的时间(以秒为单位)。这只在它与 defaultVisibilityTimeout 不同时才有意义。它永久更改队列可见性超时属性。

 

整数

waitTimeSeconds (consumer)

ReceiveMessage action 调用将等待持续持续一个消息以包含在响应中的持续时间(以秒为单位)(0 到 20)。

 

整数

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

delaySeconds (producer)

延迟发送消息的秒数。

 

整数

messageDeduplicationId Strategy (producer)

仅限 FIFO 队列。在消息上设置 messageDeduplicationId 的策略。可以是以下选项之一: useExchangeId,使用ContentBasedDeduplication。对于 useContentBasedDeduplication 选项,消息中不会设置 messageDeduplicationId。

useExchangeId

MessageDeduplicationId Strategy

messageGroupIdStrategy (producer)

仅限 FIFO 队列。在消息上设置 messageGroupId 的策略。可以是以下选项之一: useConstant、useExchangeId、使用PropertyValue。对于 usePropertyValue 选项,将使用属性 CamelAwsMessageGroupId。

 

MessageGroupIdStrategy

delayQueue (advanced)

定义是否要将 delaySeconds 选项应用到队列或单个消息

false

布尔值

queueUrl (advanced)

明确定义 queueUrl。所有其他参数(将影响 queueUrl)将被忽略。为了测试目的,可使用此参数连接到 SQS 的模拟实施。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

proxyHost (proxy)

在实例化 SQS 客户端时定义代理主机

 

字符串

proxyPort (proxy)

在实例化 SQS 客户端时定义代理端口

 

整数

maximumMessageSize (queue)

SQS 消息可包含此队列的 maximumMessageSize(以字节为单位)。

 

整数

messageRetentionPeriod (queue)

messageRetentionPeriod(以秒为单位)由 SQS 保留此队列的消息。

 

整数

policy (queue)

此队列的策略

 

字符串

receiveMessageWaitTime Seconds (queue)

如果您没有在请求中指定 WaitTimeSeconds,则队列属性 ReceiveMessageWaitTimeSeconds 用于确定要等待的时长。

 

整数

redrivePolicy (queue)

指定向 DeadLetter 队列发送消息的策略。请参阅 Amazon 文档。

 

字符串

accesskey (安全性)

Amazon AWS 访问密钥

 

字符串

secretKey (security)

Amazon AWS Secret Key

 

字符串

36.3. Spring Boot Auto-Configuration

组件支持 31 选项,如下所示。

名称描述默认类型

camel.component.aws-sqs.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-sqs.configuration.access-key

Amazon AWS 访问密钥

 

字符串

camel.component.aws-sqs.configuration.amazon-a-w-s-host

Amazon AWS 云的主机名。

amazonaws.com

字符串

camel.component.aws-sqs.configuration.amazon-s-q-s-client

使用 AmazonSQS 作为客户端

 

AmazonSQS

camel.component.aws-sqs.configuration.attribute-names

要在消耗时接收的属性名称列表。可以使用逗号分隔多个名称。

 

字符串

camel.component.aws-sqs.configuration.concurrent-consumers

允许您使用多个线程轮询 sqs 队列来增加吞吐量

1

整数

camel.component.aws-sqs.configuration.default-visibility-timeout

默认可见性超时(以秒为单位)

 

整数

camel.component.aws-sqs.configuration.delay-queue

定义是否要将 delaySeconds 选项应用到队列或单个消息

false

布尔值

camel.component.aws-sqs.configuration.delay-seconds

延迟发送消息的秒数。

 

整数

camel.component.aws-sqs.configuration.delete-after-read

读取后,从 SQS 删除消息

true

布尔值

camel.component.aws-sqs.configuration.delete-if-filtered

如果交换无法通过过滤器,则是否将 DeleteMessage 发送到 SQS 队列。如果 'false' 和 Exchange 没有通过路由上游的 Camel 过滤器进行,则不会发送 DeleteMessage。

true

布尔值

camel.component.aws-sqs.configuration.extend-message-visibility

如果启用,则调度的后台任务将保留扩展 SQS 上消息可见性。如果处理消息需要很长时间,则需要这个操作。如果设为 true defaultVisibilityTimeout,则必须设置。请参阅 Amazon 文档的详细信息。

false

布尔值

camel.component.aws-sqs.configuration.maximum-message-size

SQS 消息可包含此队列的 maximumMessageSize(以字节为单位)。

 

整数

camel.component.aws-sqs.configuration.message-attribute-names

要在消耗时接收的消息属性名称列表。可以使用逗号分隔多个名称。

 

字符串

camel.component.aws-sqs.configuration.message-retention-period

messageRetentionPeriod(以秒为单位)由 SQS 保留此队列的消息。

 

整数

camel.component.aws-sqs.configuration.policy

此队列的策略

 

字符串

camel.component.aws-sqs.configuration.proxy-host

在实例化 SQS 客户端时定义代理主机

 

字符串

camel.component.aws-sqs.configuration.proxy-port

在实例化 SQS 客户端时定义代理端口

 

整数

camel.component.aws-sqs.configuration.queue-name

队列的名称。如果队列不存在,则会创建队列。

 

字符串

camel.component.aws-sqs.configuration.queue-owner-a-w-s-account-id

当您需要使用不同的帐户拥有者时,请指定队列拥有者 aws 帐户 id。

 

字符串

camel.component.aws-sqs.configuration.queue-url

明确定义 queueUrl。所有其他参数(将影响 queueUrl)将被忽略。为了测试目的,可使用此参数连接到 SQS 的模拟实施。

 

字符串

camel.component.aws-sqs.configuration.receive-message-wait-time-seconds

如果您没有在请求中指定 WaitTimeSeconds,则队列属性 ReceiveMessageWaitTimeSeconds 用于确定要等待的时长。

 

整数

camel.component.aws-sqs.configuration.redrive-policy

指定向 DeadLetter 队列发送消息的策略。请参阅 Amazon 文档。

 

字符串

camel.component.aws-sqs.configuration.region

指定可与 queueOwnerAWSAccountId 一起使用的队列区域,以构建服务 URL。

 

字符串

camel.component.aws-sqs.configuration.secret-key

Amazon AWS Secret Key

 

字符串

camel.component.aws-sqs.configuration.visibility-timeout

在由 ReceiveMessage 请求在 com.amazonaws.services.sqs.model.SetQueueAttributesRequest 中检索后,接收的消息从后续检索请求中隐藏的时间(以秒为单位)。这只在它与 defaultVisibilityTimeout 不同时才有意义。它永久更改队列可见性超时属性。

 

整数

camel.component.aws-sqs.configuration.wait-time-seconds

ReceiveMessage action 调用将等待持续持续一个消息以包含在响应中的持续时间(以秒为单位)(0 到 20)。

 

整数

camel.component.aws-sqs.enabled

启用 aws-sqs 组件

true

布尔值

camel.component.aws-sqs.region

指定可与 queueOwnerAWSAccountId 一起使用的队列区域,以构建服务 URL。

 

字符串

camel.component.aws-sqs.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-sqs.secret-key

Amazon AWS Secret Key

 

字符串

所需的 SQS 组件选项

您必须提供 Registry 中的 amazonSQSClient 或您的 accessKey 和 secretKey 以访问 Amazon 的 SQS

36.4. 批处理消费者

此组件实施 Batch Consumer。

这样,您可以让实例知道此批处理中有多少消息,而实例可让聚合器聚合这个数量的消息。

36.5. 使用

36.5.1. SQS producer 设置的消息标头

标头类型描述

CamelAwsSqsMD5OfBody

字符串

Amazon SQS 消息的 MD5 校验和。

CamelAwsSqsMessageId

字符串

Amazon SQS 消息 ID。

CamelAwsSqsDelaySeconds

整数

Camel 2.11 起,Amazon SQS 消息可以被其他人看到的延迟秒数。

36.5.2. SQS 消费者设置的消息标头

标头类型描述

CamelAwsSqsMD5OfBody

字符串

Amazon SQS 消息的 MD5 校验和。

CamelAwsSqsMessageId

字符串

Amazon SQS 消息 ID。

CamelAwsSqsReceiptHandle

字符串

Amazon SQS 消息接收处理。

CamelAwsSqsMessageAttributes

Map<String, String>

Amazon SQS 消息属性。

36.5.3. 高级 AmazonSQS 配置

如果您的 Camel 应用程序正在防火墙后面运行,或者您需要对 AmazonSQS 实例配置进行更多控制,您可以创建自己的实例:

AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");

ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);

AmazonSQS client = new AmazonSQSClient(awsCredentials, clientConfiguration);

registry.bind("client", client);

并在您的 Camel aws-sqs 组件配置中引用它:

from("aws-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5")
.to("mock:result");

36.5.4. 创建或更新 SQS Queue

在 SQS 组件中,当端点启动时,会执行检查来获取队列存在性的信息。您可以使用 SQSConfiguration 选项通过 QueueAttributeName 映射自定义创建。

from("aws-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5")
.to("mock:result");

在本例中,如果 AWS 上尚未创建 MyQueue 队列,它将使用 SQS 配置中的默认参数创建。如果已在 AWS 上,将使用 SQS 配置选项来覆盖现有的 AWS 配置。

36.5.5. DelayQueue VS Delay 用于单一消息

从 2.23.0,组件具有一个新的选项: delayQueue。当 选项设为 true 时,SQS Queue 将是一个 DelayQueue,其值为 DelaySeconds 选项,作为延迟。如需有关 DelayQueue 的更多信息,您可以阅读 AWS SQS 文档。要考虑的一个重要信息,如下所示:

  • 对于标准队列,按队列延迟设置不会恢复设置,不会影响队列中已存在消息的延迟。
  • 对于 FIFO 队列,每个队列延迟设置都会改变设置,影响队列中已有的消息的延迟。

如官方文档中所述。如果要指定单个消息上的延迟,可以忽略 delayQueue 选项,而您可以将这个选项设置为 true,如果您需要在所有消息 enqueued 中添加一个固定延迟。

36.5.6. 在 SQS 组件中使用 AWS IAM 凭证

要使用 AWS IAM 凭证,您必须首先确认您要在其上启动 Camel 应用程序的 EC2 实例具有与之关联的 IAM 角色,并附加适当的策略。

这个功能只在远程实例上被设置为 true。另外,您还必须在本地使用静态凭证作为 IAM 是一个 AWS 特定组件。

要实现此功能集,请使用IAMCredentials to true

注意

要根据本地和远程环境切换此功能,您可以考虑使用系统环境变量启用这个查询参数。例如,如果名为 isRemote 的系统环境变量设为 true,则您的代码可将 useIAMCredentials query 参数设置为 true

虽然这个功能不需要完全实现静态凭证,但使用 AWS 环境中的 IAM 凭证无需在远程环境中刷新,且在更新 EC2 安全策略时,凭证会自动刷新,并在更新 EC2 安全策略时也会更新。

这是管理凭证的 AWS 建议的方法,因此应该尽可能使用。

36.6. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.6 或更高版本)。

36.7. JMS-style Selector

SQS 不允许选择器,但您可以使用 Camel Filter EIP 和设置适当的 可见Timeout 来有效地达到此目的。当 SQS 分配消息时,它将等待到可见性超时,然后尝试将消息发送到不同的消费者,除非收到 DeleteMessage。默认情况下,Camel 总是在路由末尾发送 DeleteMessage,除非路由以失败告终。要实现适当的过滤,而不在成功完成路由时发送 DeleteMessage,请使用 Filter:

from("aws-sqs://MyQueue?amazonSQSClient=#client&defaultVisibilityTimeout=5000&deleteIfFiltered=false")
.filter("${header.login} == true")
.to("mock:result");

在上面的代码中,如果交换没有适当的标头,它不会通过过滤器使其不会从 SQS 队列中删除。在 5000 miliseconds 后,信息将对其他消费者可见。

36.8. 删除单信息

使用 deleteMessage 操作删除单个消息。您需要为您要删除的消息设置接收句柄标头。

from("direct:start")
  .setHeader(SqsConstants.SQS_OPERATION, constant("deleteMessage"))
  .setHeader(SqsConstants.RECEIPT_HANDLE, constant("123456"))
  .to("aws-sqs://camel-1?accessKey=RAW(xxx)&secretKey=RAW(xxx)&region=EU_WEST_1");

因此,您会收到一个包含 DeleteMessageResult 实例的交换,您可以使用它来检查消息是否已被删除。

36.9. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AWS 组件

第 37 章 AWS Simple Workflow 组件

作为 Camel 版本 2.13 可用

简单工作流组件支持从 Amazon 简单工作流服务 管理工作流。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并且必须注册以使用 Amazon Simple Workflow。如需更多信息,请参阅 Amazon Simple Workflow

37.1. URI 格式

aws-swf://<workflow|activity>[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

37.2. URI 选项

AWS Simple Workflow 组件支持 5 选项,这些选项如下。

名称描述默认类型

配置 (高级)

AWS SWF 默认配置

 

SWFConfiguration

accessKey (common)

Amazon AWS 访问密钥.

 

字符串

secretKey (common)

Amazon AWS Secret 密钥。

 

字符串

region (common)

Amazon AWS 区域。

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

AWS Simple Workflow 端点使用 URI 语法配置:

aws-swf:type

使用以下路径和查询参数:

37.2.1. 路径名(1 参数):

名称描述默认类型

type

所需的 活动或工作流

 

字符串

37.2.2. 查询参数(30 参数):

名称描述默认类型

amazonSWClient (common)

使用给定的 AmazonSimpleWorkflowClient 作为客户端

 

AmazonSimpleWorkflow Client

dataConverter (common)

一个 com.amazonaws.services.simpleworkflow.flow.DataConverter 实例,以用于对数据进行序列化/反序列化。

 

DataConverter

domainName (common)

要使用的工作流域。

 

字符串

eventName (common)

要使用的工作流或活动事件名称。

 

字符串

region (common)

Amazon AWS 区域。

 

字符串

版本 (通用)

要使用的工作流或活动事件版本。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

ClientConfiguration 参数 (advanced)

使用 map 中的键/值配置 ClientConfiguration。

 

map

startWorkflowOptions Parameters (advanced)

使用 Map 中的键/值配置 StartWorkflowOptions。

 

map

sWClientParameters (advanced)

使用 map 中的键/值配置 AmazonSimpleWorkflowClient。

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

activityList (activity)

用于消耗活动的列表名称。

 

字符串

activitySchedulingOptions (activity)

活动调度选项

 

ActivityScheduling 选项

activityThreadPoolSize (activity)

工作池中用于活动的最大线程数。

100

int

activityTypeExecution Options (activity)

活动执行选项

 

ActivityTypeExecution Options

activityTypeRegistration Options (activity)

活动注册选项

 

ActivityType RegistrationOptions

childPolicy (workflow)

终止工作流时要用于子工作流的策略。

 

字符串

executionStartToClose Timeout (workflow)

将执行开始设置为关闭超时。

3600

字符串

操作 (工作流)

工作流操作

开始

字符串

signalName (workflow)

要发送到工作流的信号名称。

 

字符串

stateResultType (workflow)

查询工作流状态时的结果类型。

 

字符串

taskStartToCloseTimeout (workflow)

将任务 start 设置为关闭超时。

600

字符串

terminationDetails (workflow)

终止工作流的详情。

 

字符串

terminationReason (workflow)

终止工作流的原因。

 

字符串

workflowList (workflow)

用于消耗工作流的列表名称。

 

字符串

workflowTypeRegistration Options (workflow)

工作流注册选项

 

WorkflowType RegistrationOptions

accesskey (安全性)

Amazon AWS 访问密钥.

 

字符串

secretKey (security)

Amazon AWS Secret 密钥。

 

字符串

37.3. Spring Boot Auto-Configuration

组件支持 32 个选项,如下所示。

名称描述默认类型

camel.component.aws-swf.access-key

Amazon AWS 访问密钥.

 

字符串

camel.component.aws-swf.configuration.access-key

Amazon AWS 访问密钥.

 

字符串

camel.component.aws-swf.configuration.activity-list

用于消耗活动的列表名称。

 

字符串

camel.component.aws-swf.configuration.activity-scheduling-options

活动调度选项

 

ActivityScheduling 选项

camel.component.aws-swf.configuration.activity-thread-pool-size

工作池中用于活动的最大线程数。

100

整数

camel.component.aws-swf.configuration.activity-type-execution-options

活动执行选项

 

ActivityTypeExecution Options

camel.component.aws-swf.configuration.activity-type-registration-options

活动注册选项

 

ActivityType RegistrationOptions

camel.component.aws-swf.configuration.amazon-s-w-client

使用给定的 AmazonSimpleWorkflowClient 作为客户端

 

AmazonSimpleWorkflow Client

camel.component.aws-swf.configuration.child-policy

终止工作流时要用于子工作流的策略。

 

字符串

camel.component.aws-swf.configuration.client-configuration-parameters

使用 map 中的键/值配置 ClientConfiguration。

 

map

camel.component.aws-swf.configuration.data-converter

一个 com.amazonaws.services.simpleworkflow.flow.DataConverter 实例,以用于对数据进行序列化/反序列化。

 

DataConverter

camel.component.aws-swf.configuration.domain-name

要使用的工作流域。

 

字符串

camel.component.aws-swf.configuration.event-name

要使用的工作流或活动事件名称。

 

字符串

camel.component.aws-swf.configuration.execution-start-to-close-timeout

将执行开始设置为关闭超时。

3600

字符串

camel.component.aws-swf.configuration.operation

工作流操作

开始

字符串

camel.component.aws-swf.configuration.region

Amazon AWS 区域。

 

字符串

camel.component.aws-swf.configuration.s-w-client-parameters

使用 map 中的键/值配置 AmazonSimpleWorkflowClient。

 

map

camel.component.aws-swf.configuration.secret-key

Amazon AWS Secret 密钥。

 

字符串

camel.component.aws-swf.configuration.signal-name

要发送到工作流的信号名称。

 

字符串

camel.component.aws-swf.configuration.start-workflow-options-parameters

使用 Map 中的键/值配置 StartWorkflowOptions。

 

map

camel.component.aws-swf.configuration.state-result-type

查询工作流状态时的结果类型。

 

字符串

camel.component.aws-swf.configuration.task-start-to-close-timeout

将任务 start 设置为关闭超时。

600

字符串

camel.component.aws-swf.configuration.termination-details

终止工作流的详情。

 

字符串

camel.component.aws-swf.configuration.termination-reason

终止工作流的原因。

 

字符串

camel.component.aws-swf.configuration.type

活动或工作流

 

字符串

camel.component.aws-swf.configuration.version

要使用的工作流或活动事件版本。

 

字符串

camel.component.aws-swf.configuration.workflow-list

用于消耗工作流的列表名称。

 

字符串

camel.component.aws-swf.configuration.workflow-type-registration-options

工作流注册选项

 

WorkflowType RegistrationOptions

camel.component.aws-swf.enabled

启用 aws-swf 组件

true

布尔值

camel.component.aws-swf.region

Amazon AWS 区域。

 

字符串

camel.component.aws-swf.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.aws-swf.secret-key

Amazon AWS Secret 密钥。

 

字符串

所需的 SWF 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSWClient,才能访问 Amazon 的 Simple Workflow Service

37.4. 使用

37.4.1. SWF Workflow Producer 评估的消息标头

工作流程制作者允许与工作流交互。它可以启动新的工作流执行,查询其状态,向正在运行的工作流发送信号,或者终止和取消它。

标头类型描述

CamelSWFOperation

字符串

对工作流执行的操作。支持的操作有:
SIGNAL, CANCEL, TERMINATE, GET_STATE, START, DESCRIBE, GET_HISTORY。

CamelSWFWorkflowId

字符串

要使用的工作流 ID。

CamelAwsDdbKeyCamelSWFRunId

字符串

要使用的 worfklow 运行 ID。

CamelSWFStateResultType

字符串

查询工作流状态时的结果类型。

CamelSWFEventName

字符串

要使用的工作流或活动事件名称。

CamelSWFVersion

字符串

要使用的工作流或活动事件版本。

CamelSWFReason

字符串

终止工作流的原因。

CamelSWFDetails

字符串

终止工作流的详情。

CamelSWFChildPolicy

字符串

终止工作流时要用于子工作流的策略。

37.4.2. SWF Workflow Producer 设置的消息标头

标头类型描述

CamelSWFWorkflowId

字符串

使用的 worfklow 或新生成的 ID。

CamelAwsDdbKeyCamelSWFRunId

字符串

worfklow 运行 ID 已使用或生成。

37.4.3. 由 SWF Workflow Consumer 设置的消息标头

工作流使用者表示工作流逻辑。启动之后,它将开始轮询工作流决策任务并进行处理。除了处理决策任务外,工作流使用者路由还会接收信号(从工作流制作者结束)或状态查询。工作流消费者的主要目的是使用活动制作者安排活动任务以进行执行。实际活动任务只能从工作流消费者启动的线程调度。

标头类型描述

CamelSWFAction

字符串

指明什么是当前事件:CamelSWFActionExecute、CamelSWFSignalReceivedAction 或 CamelSWFGetStateAction。

CamelSWFWorkflowReplaying

布尔值

指明当前的决策任务是重播的。

CamelSWFWorkflowStartTime

long

此决策任务的开始事件的时间。

37.4.4. SWF Activity Producer 设置的消息标头

活动制作者允许调度活动任务。活动制作者只能从工作流消费者开启的线程使用,它可以处理由工作流使用者启动的同步交换。

标头类型描述

CamelSWFEventName

字符串

要调度的活动名称。

CamelSWFVersion

字符串

要调度的活动版本。

37.4.5. SWF Activity Consumer 设置的消息标头

标头类型描述

CamelSWFTaskToken

字符串

报告手动完成任务完成的任务令牌。

37.4.6. 高级 amazonSWClient 配置

如果您需要更多对 AmazonSimpleWorkflowClient 实例配置进行更多的控制,您可以创建自己的实例并从 URI 引用它:

#client 指的是 registry 中的 AmazonSimpleWorkflowClient。

例如,如果您的 Camel 应用程序是在防火墙后面运行:

AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);

AmazonSimpleWorkflowClient client = new AmazonSimpleWorkflowClient(awsCredentials, clientConfiguration);

registry.bind("client", client);

37.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.13 或更高版本)。

37.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

AWS 组件

第 38 章 AWS XRay Component

可作为 Camel 2.21 可用

camel-aws-xray 组件用于使用 AWS XRay 跟踪和计时传入的 Camel 消息。

事件(subsegments)会捕获用于传入和传出消息。

38.1. 依赖项

要将 AWS XRay 支持纳入 Camel 中,需要向项目添加包含 Camel 相关的 AWS XRay 相关类的存档。另外,还需要提供 AWS XRay 库。

要包括 AWS XRay 和 Camel,依赖项使用以下 Maven 导入:

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-xray-recorder-sdk-bom</artifactId>
        <version>1.3.1</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
      <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-aws-xray</artifactId>
      </dependency>

      <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-xray-recorder-sdk-core</artifactId>
      </dependency>
      <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-xray-recorder-sdk-aws-sdk</artifactId>
      </dependency>
  <dependencies>

38.2. 配置

AWS XRay tracer 的配置属性是:

选项默认值描述

addExcludePatterns

 

设置 exclude 模式,它将为与 模式匹配的 Camel 消息禁用追踪。内容是一个 Set<String>,其中密钥是匹配的 routeId。该模式使用来自 Intercept 的规则。

setTracingStrategy

NoopTracingStrategy

可以提供自定义 Camel InterceptStrategy 来跟踪 BeanDefinitionProcessDefinition 等调用的处理器定义。TraceAnnotatedTracingStrategy 将跟踪通过 .bean (…​).process (…​) 调用的所有类,并在类级别包含 @XRayTrace 注解。

目前,只有 AWS XRay tracer 可以配置为为 Camel 应用程序提供分布式追踪:

38.2.1. explicit

在您的 POM 中包含 camel-aws-xray 组件,以及与 AWS XRay Tracer 相关的任何特定依赖项。

要明确配置 AWS XRay 支持,实例化 XRayTracer 并初始化 camel 上下文。您可以选择指定一个 Tracer,或使用 RegistryServiceLoader 隐式发现它。

XRayTracer xrayTracer = new XRayTracer();
// By default it uses a NoopTracingStrategy, but you can override it with a specific InterceptStrategy implementation.
xrayTracer.setTracingStrategy(...);
// And then initialize the context
xrayTracer.init(camelContext);

要在 XML 中使用 XRayTracer,所有您需要做的就是定义 AWS XRay tracer bean。Camel 将自动发现并使用它。

  <bean id="tracingStrategy" class="..."/>
  <bean id="aws-xray-tracer" class="org.apache.camel.component.aws.xray.XRayTracer" />
    <property name="tracer" ref="tracingStrategy"/>
  </bean>

如果默认 NoopTracingStrategy 只跟踪并删除交换,则不会调用某些 Bean 或 EIP 模式。

38.2.2. 跟踪综合路由执行

为了跟踪多个路由间交换的执行,当创建唯一追踪 ID 时,则会在标头中生成并存储在标头中(如果还没有对应的值可用)。此 trace ID 被复制到新的交换,以保持已处理交换的一致性视图。

因为 AWS XRay trace 可以在本地工作,当前子/segment 应该复制到新线程,并在 AWS XRay 文档中 设置。因此,Camel AWS XRay 组件提供了一个额外的标头字段,组件将使用该字段将传递的 AWS XRay Entity 设置为新线程,从而使跟踪的数据保持在路由中,而不是公开与任何执行路由无关的新片段。

组件将使用在交换标题中找到的以下常量:

标头描述

Camel-AWS-XRay-Trace-ID

包含对 AWS XRay TraceID 对象的引用,以提供调用路由的综合视图

Camel-AWS-XRay-Trace-Entity

包含到复制到新线程的实际 AWS XRay SegmentSubsegment 的引用。如果生成新线程,且执行的任务应作为执行路由的一部分公开,则应该设置此标头,而不是创建一个新的不相关的片段。

请注意,AWS XRay Entity (即 SegmentSubsegment)不序列化,因此不应传递给其他 JVM 进程。

38.3. 示例

您可以找到一个演示在此项目附带的测试中配置 AWS XRay 追踪方法示例。

第 39 章 Windows Azure 服务的 Camel 组件

Windows Azure 服务的 Camel 组件提供来自 Camel 的 Azure 服务的连接。

 

Azure ServiceCamel 组件Camel 版本组件描述

Storage Blob Service

Azure-Blob

2.9.0

支持存储和检索 Blob

存储队列服务

Azure-Queue

2.9.0

支持在队列中存储和检索消息

第 40 章 Azure Storage Blob Service Component

作为 Camel 版本 2.19 可用

Azure Blob 组件支持从 Azure Storage Blob 服务存储和检索 Blob。

前提条件

您必须具有有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户

40.1. URI 格式

azure-blob://accountName/containerName[/blobName][?options]

在大多数情况下,需要 blobName,如果不存在,则会创建 blob。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

例如,要从位于 camelazure 存储帐户上的 container1 中的公共块 blob blockBlob 下载 blob 内容,请使用以下代码片段:

from("azure-blob:/camelazure/container1/blockBlob").
to("file://blobdirectory");

40.2. URI 选项

Azure Storage Blob Service 组件没有选项。

Azure Storage Blob Service 端点使用 URI 语法进行配置:

azure-blob:containerOrBlobUri

使用以下路径和查询参数:

40.2.1. 路径名(1 参数):

名称描述默认类型

containerOrBlobUri

所需的 Container 或 Blob compact Uri

 

字符串

40.2.2. 查询参数(19 参数):

名称描述默认类型

azureBlobClient (common)

blob 服务客户端

 

CloudBlob

blobOffset (common)

为上传或下载操作设置 blob 偏移,默认为 0

0

Long

blobType (common)

设置 blob 类型,'blockblob' 是 default

blockblob

BlobType

closeStreamAfterRead (common)

读取或保持打开后流关闭,默认为 true

true

布尔值

credentials (common)

设置存储凭证,在大多数情况下需要

 

StorageCredentials

dataLength (common)

为下载或页面 blob 上传操作设置数据长度

 

Long

fileDir (common)

将下载的 Blob 保存到的文件和目录

 

字符串

publicForRead (common)

如果启用此属性,则存储资源可以公开读取其内容,那么不必设置凭证

false

布尔值

streamReadSize (common)

读取 blob 内容时,设置最小读取大小(以字节为单位)

 

int

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

blobMetadata (producer)

设置 blob meta-data

 

map

blobPrefix (producer)

设置可用于列出 Blob 的前缀

 

字符串

closeStreamAfterWrite (producer)

在写入或保留流后关闭流,默认为 true

true

布尔值

operation (producer)

blob 服务操作提示到制作者

listBlobs

BlobServiceOperations

streamWriteSize (producer)

设置写入块和页面块的缓冲大小

 

int

useFlatListing (producer)

指定是否应使用扁平或分级 blob 列表

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

40.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.azure-blob.enabled

启用 azure-blob 组件

true

布尔值

camel.component.azure-blob.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

所需的 Azure Storage Blob Service 组件选项

如果需要访问私有 Blob,则必须提供 containerOrBlob 名称和凭证。

40.4. 使用

40.4.1. 由 Azure Storage Blob Service producer 评估的消息标头

标头类型描述
   

40.4.2. Azure Storage Blob Service producer 设置的消息标头

标头类型描述

CamelFileName

字符串

下载的 blob 内容的文件名。

40.4.3. Azure Storage Blob Service producer consumer 设置的消息标头

标头类型描述

CamelFileName

字符串

下载的 blob 内容的文件名。

40.4.4. Azure Blob Service 操作

适用于所有块类型的操作

操作描述

getBlob

获取 blob 的内容。您可以将此操作的输出限制为 blob 范围。

deleteBlob

删除 blob。

listBlobs

列出 blob。

Block blob 操作

操作描述

updateBlockBlob

放置块 blob 内容,以创建新块 blob 或覆盖现有的块 blob 内容。

uploadBlobBlocks

上传块 blob 内容,首先生成 blob 块序列,然后将其提交到 blob。如果启用消息 CommitBlockListLater 属性,您可以稍后使用 commitBlobBlockList 操作来执行提交。之后,您可以更新单独的块 blob。

commitBlobBlockList

将一系列 blob 块提交到您之前上传到 blob 服务的块列表(使用启用了消息 CommitBlockBlob 的 updateBlock Blob 操作)。

getBlobBlockList

获取块 blob 列表。

附加 blob 操作

操作描述

createAppendBlob

创建 append 块。默认情况下,如果块已存在,则不会重置。请注意,您还可以通过启用消息 AppendBlobCreated 属性并使用 updateAppendBlob 操作来创建 append blob。

updateAppendBlob

将新内容附加到 blob。如果不存在,且您启用了 AppendBlobCreated 属性,则此操作也会创建 blob。

页面块操作

操作描述

createPageBlob

创建页面块。默认情况下,如果块已存在,则不会重置。请注意,也可以通过启用消息 PageBlobCreated 属性并使用 updatePageBlob 操作来创建页面 blob (及其内容)。

updatePageBlob

创建一个页面块(除非您启用了消息 PageBlobCreated 属性和相同名称块)并设置这个 blob 的内容。

resizePageBlob

调整 page blob 的大小。

clearPageBlob

清除 page blob。

getPageBlobRanges

获取 page blob 页面范围。

40.4.5. Azure Blob 客户端配置

如果您的 Camel 应用程序是在防火墙后面运行,或者您需要对 Azure Blob 客户端配置有更多的控制,您可以创建您自己的实例:

StorageCredentials credentials = new StorageCredentialsAccountAndKey("camelazure", "thekey");

CloudBlob client = new CloudBlob("camelazure", credentials);

registry.bind("azureBlobClient", client);

并在 Camel azure-blob 组件配置中引用它:

from("azure-blob:/camelazure/container1/blockBlob?azureBlobClient=#client")
.to("mock:result");

40.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-azure</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.19.0 或更高版本)。

40.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • Azure Component

第 41 章 Azure Storage Queue Service 组件

作为 Camel 版本 2.19 可用

Azure Queue 组件支持存储和检索消息到 Azure Storage Queue 服务。

前提条件

您必须具有有效的 Microsoft Azure 帐户。如需更多信息,请访问 Azure Portal

41.1. URI 格式

azure-queue://accountName/queueName[?options]

如果队列尚不存在,则会创建队列。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

例如,若要从 camelazure 存储帐户中的队列 messageQueue 获取消息内容,并使用以下代码片段:

from("azure-queue:/camelazure/messageQueue").
to("file://queuedirectory");

41.2. URI 选项

Azure Storage Queue Service 组件没有选项。

Azure Storage Queue Service 端点使用 URI 语法进行配置:

azure-queue:containerAndQueueUri

使用以下路径和查询参数:

41.2.1. 路径名(1 参数):

名称描述默认类型

containerAndQueueUri

所需的 容器队列紧凑 Uri

 

字符串

41.2.2. 查询参数(10 参数):

名称描述默认类型

azureQueueClient (common)

队列服务客户端

 

CloudQueue

credentials (common)

设置存储凭证,在大多数情况下需要

 

StorageCredentials

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

messageTimeToLive (producer)

消息时间(以秒为单位)

 

int

messageVisibilityDelay (producer)

Message Visibility Delay (以秒为单位)

 

int

operation (producer)

当用户只想发送消息时要执行的操作。有三个 enums 选项,值可以是以下之一: sendBatchMessage, deleteMessage, listQueues

listQueues

QueueServiceOperations

queuePrefix (producer)

设置可用于列出队列的前缀

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

41.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.azure-queue.enabled

启用 azure-queue 组件

true

布尔值

camel.component.azure-queue.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

所需的 Azure Storage Queue Service 组件选项

您必须提供 containerAndQueue URI 和凭证。

41.4. 使用

41.4.1. 由 Azure Storage Queue Service producer 评估的消息标头

标头类型描述
   

41.4.2. Azure Storage Queue Service producer 设置的消息标头

标头类型描述
   

41.4.3. Azure Storage Queue Service producer consumer 设置的消息标头

标头类型描述
   

41.4.4. Azure Queue Service 操作

操作描述

listQueues

列出队列。

createQueue

创建队列。

deleteQueue

删除队列。

addMessage

向队列添加消息。

retrieveMessage

从队列检索消息。

peekMessage

查看队列中的消息,例如,确定消息是否到达正确的队列。

updateMessage

更新队列中的消息。

deleteMessage

删除队列中的消息。

41.4.5. Azure Queue Client 配置

如果您的 Camel 应用程序是在防火墙后面运行,或者您需要对 Azure Queue Client 配置有更多的控制,您可以创建您自己的实例:

StorageCredentials credentials = new StorageCredentialsAccountAndKey("camelazure", "thekey");

CloudQueue client = new CloudQueue("camelazure", credentials);

registry.bind("azureQueueClient", client);

并在 Camel azure-queue 组件配置中引用它:

from("azure-queue:/camelazure/messageQueue?azureQueueClient=#client")
.to("mock:result");

41.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-azure</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.19.0 或更高版本)。

41.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • Azure Component

第 42 章 Barcode DataFormat

作为 Camel 版本 2.14 可用

条形数据格式基于 zxing 库。此组件的目标是从字符串(marshal)和 barcode 镜像(unmarshal)创建 barcode 镜像。您可以自由选择使用 zxing 提供的所有功能。

42.1. 依赖项

要使用 camel 路由的 barcode 数据格式,您需要添加实现此数据格式的 camel-barcode 依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-barcode</artifactId>
  <version>x.x.x</version>
</dependency>

42.2. Barcode 选项

Barcode 数据格式支持 5 个选项,它们如下。

名称默认Java 类型描述

width

 

整数

barcode 的宽度

height

 

整数

barcode 高度

imageType

 

字符串

barcode 的镜像类型,如 png

barcodeFormat

 

字符串

Barcode 格式,如 QR-Code

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

42.3. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.barcode.barcode-format

Barcode 格式,如 QR-Code

 

字符串

camel.dataformat.barcode.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.barcode.enabled

启用 barcode 数据格式

true

布尔值

camel.dataformat.barcode.height

barcode 高度

 

整数

camel.dataformat.barcode.image-type

barcode 的镜像类型,如 png

 

字符串

camel.dataformat.barcode.width

barcode 的宽度

 

整数

ND

42.4. 使用 Java DSL

首先,您必须初始化 barcode 数据 fomat 类。您可以使用默认构造器或参数化之一(请参阅 JavaDoc)。默认值为:

参数默认值

image type (BarcodeImageType)

PNG

width

100 px

height

100 px

encoding

UTF-8

Barcode 格式(BarcodeFormat)

QR-Code

// QR-Code default
DataFormat code = new BarcodeDataFormat();

如果要使用 zxing hints,您可以使用 BarcodeDataFormat 实例的 'addToHintMap' 方法:

code.addToHintMap(DecodeHintType.TRY_HARDER, Boolean.true);

有关可能的提示信息,请参阅 xzing 文档。

42.4.1. marshalling

from("direct://code")
  .marshal(code)
  .to("file://barcode_out");

您可以使用以下测试类调用路由:

template.sendBody("direct://code", "This is a testmessage!");

您应该在该镜像的 'barcode_out' 文件夹中找到:

image

42.4.2. unmarshalling

unmarshaller 是通用的。要取消总结,您可以使用任何 BarcodeDataFormat 实例。如果您有两个实例,一个用于(重新生成)QR-Code,另一个用于 PDF417,这无关紧要。

from("file://barcode_in?noop=true")
  .unmarshal(code) // for unmarshalling, the instance doesn't matter
  .to("mock:out");

如果将上述 QR-Code 镜像粘贴到"barcode_in"文件夹中,您应该找到此 为测试消息!您可以作为标头变量查找 barcode 数据格式:

名称类型描述

BarcodeFormat

字符串

com.google.zxing.BarcodeFormat 的值。

 

 

第 43 章 Base64 DataFormat

作为 Camel 2.11 版本提供

Base64 数据格式用于 base64 编码和解码。

43.1. 选项

Base64 数据格式支持 4 个选项,它们如下。

名称默认Java 类型描述

lineLength

76

整数

对编码数据的具体最大行长度。默认情况下使用 76。

lineSeparator

 

字符串

要使用的行分隔符。默认使用新行字符(CRLF)。

urlSafe

false

布尔值

不必将 '' 和 '/' 分别发出 '-' 和 '_'。urlSafe 只应用于编码操作。解码同时处理这两种模式。默认为 false。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

43.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.base64.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.base64.enabled

启用 base64 数据格式

true

布尔值

camel.dataformat.base64.line-length

对编码数据的具体最大行长度。默认情况下使用 76。

76

整数

camel.dataformat.base64.line-separator

要使用的行分隔符。默认使用新行字符(CRLF)。

 

字符串

camel.dataformat.base64.url-safe

不必将 '' 和 '/' 分别发出 '-' 和 '_'。urlSafe 只应用于编码操作。解码同时处理这两种模式。默认为 false。

false

布尔值

ND

在 Spring DSL 中,您可以使用该标签配置数据格式:

<camelContext>
    <dataFormats>
        <!-- for a newline character (\n), use the HTML entity notation coupled with the ASCII code. -->
        <base64 lineSeparator="&#10;" id="base64withNewLine" />
        <base64 lineLength="64" id="base64withLineLength64" />
    </dataFormats>
    ...
</camelContext>

之后,您可以参考它:

<route>
     <from uri="direct:startEncode" />
     <marshal ref="base64withLineLength64" />
     <to uri="mock:result" />
</route>

大多数时候,如果您使用默认选项,则不需要声明数据格式。在这种情况下,您可以声明内联数据格式,如下所示。

43.3. marshal

在本例中,我们将文件内容分到 base64 对象。

from("file://data.bin")
    .marshal().base64()
    .to("jms://myqueue");

在 Spring DSL 中:

 <from uri="file://data.bin">
 <marshal>
     <base64/>
 </marshal>
 <to uri="jms://myqueue"/>

43.4. unmarshal

在本例中,我们在由 newOrder 处理器处理前,将来自 JMS 队列的有效负载分到字节[] 对象。

from("jms://queue/order")
    .unmarshal().base64()
    .process("newOrder");

在 Spring DSL 中:

 <from uri="jms://queue/order">
 <unmarshal>
     <base64/>
 </unmarshal>
 <to uri="bean:newOrder"/>

43.5. 依赖项

要在 Camel 路由中使用 Base64,您需要添加实现此数据格式的 camel-base64 的依赖项。

如果使用 Maven,则只需在 pom.xml 中添加以下内容:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-base64</artifactId>
  <version>x.x.x</version>  <!-- use the same version as your Camel core version -->
</dependency>

第 44 章 Bean 组件

作为 Camel 版本 1.0 可用

bean: 组件将 Bean 绑定到 Camel 消息交换。

44.1. URI 格式

bean:beanName[?options]

其中 beanID 可以是用于在 Registry 中查找 bean 的任何字符串

44.2. 选项

Bean 组件支持 2 个选项,它们如下所列。

名称描述默认类型

cache (advanced)

如果启用,Camel 将缓存第一个 Registry 查找的结果。如果 registry 中的 bean 定义为单例范围,则可以启用缓存。

 

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Bean 端点使用 URI 语法配置:

bean:beanName

使用以下路径和查询参数:

44.2.1. 路径名(1 参数):

名称描述默认类型

beanName

必需 设置要调用的 bean 的名称

 

字符串

44.2.2. 查询参数(5 参数):

名称描述默认类型

方法 (生成器)

设置在 bean 上调用的方法的名称

 

字符串

cache (advanced)

如果启用,Camel 将缓存第一个 Registry 查找的结果。如果 registry 中的 bean 定义为单例范围,则可以启用缓存。

 

布尔值

multiParameterArray (advanced)

弃用了 如何处理从消息正文传递的参数;如果为 true,则消息正文应该是参数的数组。注:此选项由 Camel 内部使用,它不适用于最终用户。弃用备注:此选项由 Camel 内部使用,且不适用于最终用户。

false

布尔值

参数 (高级)

用于配置 bean 中的其他属性

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

44.3. 使用

用于消耗消息的对象实例必须使用 Registry 明确注册。例如,如果您使用 Spring,则必须在 Spring 配置 spring.xml 中定义 bean;或者,如果您不使用 Spring,请通过在 JNDI 中注册 bean 来定义 bean。

格式化宏错误: snippet: java.lang.IndexOutOfBoundsException: Index: 20, Size: 20

注册端点后,您可以构建 Camel 路由来处理交换。

bean: 端点不能定义为对路由的输入;即,您无法从某些入站消息端点路由到 bean 端点,作为输出。因此,请考虑使用 直接:队列: 端点作为输入。

您可以使用 ProxyHelper 上的 createProxy () 方法创建一个代理,该代理将生成 BeanExchanges 并将其发送到任何端点:

以及使用 Spring DSL 相同的路由:

<route>
   <from uri="direct:hello">
   <to uri="bean:bye"/>
</route>

44.4. Bean 作为端点

Camel 还支持调用 Bean 作为端点。在以下路由中:

情况是,当交换路由到 myBean Camel 时,将使用 Bean Binding 调用 bean。
bean 的源只是普通 POJO:

Camel 将使用 Bean Binding 来调用 sayHello 方法,通过将 Exchange 的 In body 转换为 String 类型,并将方法的输出存储在 Exchange Out 正文中。

44.5. Java DSL Bean 语法

Java DSL 为 Bean 组件提供 syntactic sugar。您可以使用下列语法,而不明确指定 bean 作为端点(例如 to ("bean:beanName")

// Send message to the bean endpoint
// and invoke method resolved using Bean Binding.
from("direct:start").beanRef("beanName");

// Send message to the bean endpoint
// and invoke given method.
from("direct:start").beanRef("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);

44.6. bean Binding

如何选择需要调用的方法(如果没有通过 方法 参数明确指定),并从消息构建参数值如何由 Bean Binding 机制定义,该机制在整个 Camel 中各种 Bean 集成机制都使用它。

44.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • 组件
  • bean Binding
  • Bean 集成

第 45 章 BeanIO DataFormat

作为 Camel 2.10 版本提供

BeanIO 数据格式使用 BeanIO 处理扁平载荷(如 XML、CSV、分隔或固定长度格式)。

BeanIO 使用一个 映射 XML 文件进行配置,在其中定义从扁平格式到对象(POJO)的映射。使用这个映射文件是必须的。

45.1. 选项

BeanIO 数据格式支持 9 个选项,它们如下。

名称默认Java 类型描述

mapping

 

字符串

BeanIO 映射文件.默认从 classpath 加载。您可以使用 file:、http: 或 classpath: 前缀,以注明用于加载映射文件的位置。

streamName

 

字符串

要使用的流的名称。

ignoreUnidentifiedRecords

false

布尔值

是否忽略未识别的记录.

ignoreUnexpectedRecords

false

布尔值

是否忽略意外记录。

ignoreInvalidRecords

false

布尔值

是否忽略无效记录。

encoding

 

字符串

要使用的 charset。默认情况下,JVM 平台的默认 charset。

beanReaderErrorHandlerType

 

字符串

在解析时,使用自定义 org.apache.camel.dataformat.beanio.BeanIOErrorHandler 作为错误处理程序。配置错误处理程序的完全限定类名称。请注意,选项 ignoreUnidentifiedRecords、ignoreUnexpectedRecords 和 ignoreInvalidRecords 在使用自定义错误处理程序时可能无法使用。

unmarshalSingleObject

false

布尔值

该选项可控制是否作为对象列表还是仅作为单个对象进行分类。前者是默认模式,后者仅用于特殊用例,其中 beanio 将 Camel 消息映射到单个 POJO bean。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

45.2. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.dataformat.beanio.bean-reader-error-handler-type

在解析时,使用自定义 org.apache.camel.dataformat.beanio.BeanIOErrorHandler 作为错误处理程序。配置错误处理程序的完全限定类名称。请注意,选项 ignoreUnidentifiedRecords、ignoreUnexpectedRecords 和 ignoreInvalidRecords 在使用自定义错误处理程序时可能无法使用。

 

字符串

camel.dataformat.beanio.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.beanio.enabled

启用 beanio 数据格式

true

布尔值

camel.dataformat.beanio.encoding

要使用的 charset。默认情况下,JVM 平台的默认 charset。

 

字符串

camel.dataformat.beanio.ignore-invalid-records

是否忽略无效记录。

false

布尔值

camel.dataformat.beanio.ignore-unexpected-records

是否忽略意外记录。

false

布尔值

camel.dataformat.beanio.ignore-unidentified-records

是否忽略未识别的记录.

false

布尔值

camel.dataformat.beanio.mapping

BeanIO 映射文件.默认从 classpath 加载。您可以使用 file:、http: 或 classpath: 前缀,以注明用于加载映射文件的位置。

 

字符串

camel.dataformat.beanio.stream-name

要使用的流的名称。

 

字符串

camel.dataformat.beanio.unmarshal-single-object

该选项可控制是否作为对象列表还是仅作为单个对象进行分类。前者是默认模式,后者仅用于特殊用例,其中 beanio 将 Camel 消息映射到单个 POJO bean。

false

布尔值

ND

45.3. 使用

映射文件的示例如下:

45.3.1. 使用 Java DSL

要使用 BeanIODataFormat,您需要使用映射文件以及流的名称配置数据格式。
在 Java DSL 中,这可如下所示。streamName 是 "employeeFile"。

然后,我们有两个路由。第一个路由用于将 CSV 数据转换为 List<Employee> Java 对象。然后,我们被分割,因此模拟端点
会接收每行的消息。

第二代路由用于反向操作,以将 List<Employee> 转换为 CSV 数据流。

例如,CSV 数据可如下所示:

45.3.2. 使用 XML DSL

要在 XML 中使用 BeanIO 数据格式,您需要使用 <beanio> XML 标签进行配置,如下所示。路由与上例类似。

45.4. 依赖项

要在 Camel 路由中使用 BeanIO,您需要添加实现此数据格式的 camel-beanio 依赖关系。

如果您使用 Maven,您可以只在 pom.xml 中添加以下内容,将最新的和最大发行版本的版本号替换(请参阅最新版本下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-beanio</artifactId>
  <version>2.10.0</version>
</dependency>

第 46 章 Beanstalk 组件

作为 Camel 版本 2.15 可用

Camel-beanstalk 项目为 Beanstalk 作业检索和后处理作业提供了 Camel 组件。

您可以在 Beanstalk 协议 中找到 Beanstalk 作业生命周期的详细说明。

46.1. 依赖项

Maven 用户需要在其 pom.xml中添加以下依赖项

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-beanstalk</artifactId>
  <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.15.0 或更高版本)。

46.2. URI 格式

beanstalk://[host[:port]][/tube][?options]

您可以省略 端口 或两个 主机和端口 :对于 Beanstalk,默认使用("localhost"和 11300)。 如果省略 tube,则 Beanstalk 组件将使用名为"default"的 tube。

收听时,您可能想查看多个问题中的作业。只需用加号符号分隔它们,例如:

beanstalk://localhost:11300/tube1+tube2

Tube 名称将被解码为 URL,因此,如果您的 tube 名称包含诸如 + 或 )的特殊字符,则需要对它们进行 URL 编码,或者使用 RAW 语法,请查看以下详情

通过这种方式,当您将作业写入 Beanstalk 时,您无法指定多个 tubes。

46.3. Beanstalk 选项

Beanstalk 组件支持 2 个选项,它们如下所列。

名称描述默认类型

connectionSettings Factory (common)

自定义 ConnectionSettingsFactory.指定使用哪个 ConnectionSettingsFactory 连接到 Beanstalkd。在没有 Beantalkd 守护进程的情况下进行单元测试(您可以模拟 ConnectionSettings)

 

ConnectionSettings Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Beanstalk 端点使用 URI 语法进行配置:

beanstalk:connectionSettings

使用以下路径和查询参数:

46.3.1. 路径名(1 参数):

名称描述默认类型

connectionSettings

连接设置主机:port/tube

 

字符串

46.3.2. 查询参数(26 参数):

名称描述默认类型

command (common)

放置意味着将作业放入 Beanstalk 中。作业正文在 Camel 消息正文中指定。作业 ID 将返回在 Beantalk.jobId 中。删除、发布、touch 或 bury expect 作业 ID 在消息头 Beantalk.jobId 中返回。操作的结果在 Beantalk.result 消息标题开始预期在消息正文中启动的作业数量,并返回在消息标题 Beantalk.result 中实际启动的作业数量。

 

BeanstalkCommand

jobDelay (common)

作业延迟(以秒为单位)。

0

int

jobPriority (common)

作业优先级.(0 是最高,请参阅 Beanstalk 协议)

1000

long

jobTimeToRun (common)

以秒为单位运行的作业时间。(当 0 时,anantalkd 守护进程会自动将其增加到 1,请参阅 Beanstalk 协议。)

60

int

awaitJob (consumer)

是否在将作业从 Beantalk 之前等待作业完成

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

onFailure (consumer)

在处理失败时使用的命令。

 

BeanstalkCommand

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

useBlockIO (consumer)

是否使用 blockIO。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

46.4. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.beanstalk.connection-settings-factory

自定义 ConnectionSettingsFactory.指定使用哪个 ConnectionSettingsFactory 连接到 Beanstalkd。在没有 Beantalkd 守护进程的情况下进行单元测试(您可以模拟 ConnectionSettings)。选项是一个 org.apache.camel.component.beanstalk.ConnectionSettingsFactory 类型。

 

字符串

camel.component.beanstalk.enabled

启用 Beantalk 组件

true

布尔值

camel.component.beanstalk.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

producer 行为受 command 参数影响,后者告知执行该作业的操作,可以是

用户在保留或等待 Camel 路由处理它后马上删除作业。虽然第一种方案更像是"消息队列",但第二个情况与"作业队列"类似。这个行为由 consumer.awaitJob 参数控制,它等于 true (后续 Beanstalkd 性质)。

同步时,消费者在成功完成时调用 delete ,并在失败时调用 bury 。您可以通过在 URI 中指定 consumer.onFailure 参数,在失败时执行哪一个命令。它可以取 bur y 的值, 删除或 释放

有一个布尔值参数 consumer.useBlockIO ,它对应于 JavaBeanstalkClient 库中的相同参数。默认情况下,它是 true

在指定版本 时要小心,因为失败的作业将立即出现在同一 tube 中,并且您的消费者将尝试再次获取它。 您可以 在此期间发布 并指定 jobDelay 。

Beantalk使用者是一个 Scheduled Polling Consumer,这意味着您可以配置更多选项,如消费者轮询的频率。如需了解更多详细信息,请参阅轮询消费者。

46.5. 使用者标头

使用者在 Exchange 消息中存储多个作业标头:

属性类型描述

beanstalk.jobId

long

任务 ID

beanstalk.tube

字符串

包含此作业的 tube 的名称

beanstalk.state

字符串

"ready" 或 "delayed" 或 "reserveded" 或 "buried" (必须是 "reserved")

beanstalk.priority

long

设置优先级值

beanstalk.age

int

创建此作业后的时间(以秒为单位)

beanstalk.time-left

int

在服务器将该作业放入就绪队列中前的秒数

beanstalk.timeouts

int

此作业在保留过程中超时的次数

beanstalk.releases

int

客户端从保留中释放这个作业的次数

beanstalk.buries

int

该作业被管辖的次数

beanstalk.kicks

int

该作业启动的次数

46.6. 例子

此 Camel 组件可让您请求作业进行处理,并将其提供给 Beanstalkd 守护进程。我们简单的演示路由可能类似如下

from("beanstalk:testTube").
   log("Processing job #${property.beanstalk.jobId} with body ${in.body}").
   process(new Processor() {
     @Override
     public void process(Exchange exchange) {
       // try to make integer value out of body
       exchange.getIn().setBody( Integer.valueOf(exchange.getIn().getBody(classOf[String])) );
     }
   }).
   log("Parsed job #${property.beanstalk.jobId} to body ${in.body}");
from("timer:dig?period=30seconds").
   setBody(constant(10)).log("Kick ${in.body} buried/delayed tasks").
   to("beanstalk:testTube?command=kick");

在第一个路由中,我们正在监听新的作业。当它们到达时,我们将尝试从消息正文解析整数值。如果成功,请记录它,并成功交换完成,使 Camel 组件能够自动从 Beanstalk 中删除 此任务。简而言,当我们无法解析作业数据时,交换失败,Camel 组件会默认将其捆绑,以便稍后进行处理或可能继续手动检查失败的作业。 

因此,第二个路由定期请求 Beanstalk 从周围和/或延迟状态启动 10 个作业到正常队列。 

 

46.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 47 章 bean Validator 组件

作为 Camel 版本 2.3 可用

Validator 组件使用 Java Bean Validation API (JSR 303)执行消息正文验证。Camel 使用参考实施,即 Hibernate Validator

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-bean-validator</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>

47.1. URI 格式

bean-validator:label[?options]

或者

bean-validator://label[?options]

其中 label 是描述端点的任意文本值。
您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

47.2. URI 选项

Bean Validator 组件没有选项。

Bean Validator 端点使用 URI 语法进行配置:

bean-validator:label

使用以下路径和查询参数:

47.2.1. 路径名(1 参数):

名称描述默认类型

label

需要 标签是描述端点的任意文本值

 

字符串

47.2.2. 查询参数(6 参数):

名称描述默认类型

constraintValidatorFactory (producer)

使用自定义 ConstraintValidatorFactory

 

ConstraintValidator Factory

group (producer)

使用自定义验证组

javax.validation.groups.Default

字符串

messageInterpolator (producer)

使用自定义 MessageInterpolator

 

MessageInterpolator

traversableResolver (producer)

使用自定义 TraversableResolver

 

TraversableResolver

validationProviderResolver (producer)

使用自定义 ValidationProviderResolver

 

ValidationProvider Resolver

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

47.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.bean-validator.enabled

启用 bean-validator 组件

true

布尔值

camel.component.bean-validator.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

47.4. OSGi 部署

要在 OSGi 环境中使用 Hibernate 验证器,请使用专用 ValidationProviderResolver 实施,就像 org.apache.camel.component.bean.validator.HibernateValidationProviderResolver 一样。以下代码片段演示了此方法。请记住,您可以使用从 Camel 2.13.0 开始的 HibernateValidationProviderResolver

Using HibernateValidationProviderResolver

from("direct:test").
  to("bean-validator://ValidationProviderResolverTest?validationProviderResolver=#myValidationProviderResolver");

...

<bean id="myValidationProviderResolver" class="org.apache.camel.component.bean.validator.HibernateValidationProviderResolver"/>

如果没有定义自定义 ValidationProviderResolver,并且验证器组件已部署到 OSGi 环境中,则将自动使用 HibernateValidationProviderResolver

47.5. 示例

假设我们带有以下注解的 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.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

<?xml version="1.0" encoding="UTF-8"?>
<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

<?xml version="1.0" encoding="UTF-8"?>
<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>

下面是一个示例路由定义的 XML 语法,其中 OrderedChecks 可以是 https://github.com/apache/camel/blob/master/components/camel-bean-validator/src/test/java/org/apache/camel/component/bean/validator/OrderedChecks.java

请注意,正文应包含要验证的类实例。

<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>

47.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 48 章 绑定组件(已弃用)

作为 Camel 2.11 版本提供

在 Camel 术语中,绑定 是一种在合同中嵌套端点的方法;如数据格式、内容增强器 或验证步骤。绑定是可选的,您可以选择在任何 camel 端点上使用它们。

SwitchYard 项目 将服务合同添加到各种技术(如 Camel 和许多其他技术)来激发绑定。但是,Camel Bindings 并未将 Camel 嵌套在 SCA 中,而是提供将 Camel 端点嵌套在 Camel 框架本身中的合同;因此,您可以在任何 Camel 路由中使用它们。

48.1. 选项

Binding 组件没有选项。

Binding 端点使用 URI 语法配置:

binding:bindingName:delegateUri

使用以下路径和查询参数:

48.1.1. 路径名(2 参数):

名称描述默认类型

bindingName

Camel 注册表中查询 所需的 绑定名称。

 

字符串

delegateUri

需要 委派端点的 Uri。

 

字符串

48.1.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

48.2. 使用绑定

绑定目前是一个定义合同的 bean (尽管我们希望向 Camel DSL 添加绑定)。

定义绑定端点的方法有几种(即具有绑定绑定的端点)。

48.3. 使用绑定 URI

您可以使用 binding:nameOfBinding: 前缀为任何端点 URI,其中 nameOfBinding 是 registry 中的 Binding bean 的名称。

from("binding:jaxb:activemq:myQueue").to("binding:jaxb:activemq:anotherQueue")

此处我们使用了"jaxb"绑定,例如,可以使用 JAXB 数据格式进行汇总和未汇总的消息。

48.4. 使用 BindingComponent

存在一个称为 BindingComponent 的组件,可以在 registry 中通过依赖项注入配置,允许创建已经绑定到某些绑定的端点。

例如,如果您使用代码在 registry 中注册一个名为 "jsonmq" 的新组件,如下所示

JacksonDataFormat format = new JacksonDataFormat(MyBean.class);
context.bind("jsonmq", new BindingComponent(new DataFormatBinding(format), "activemq:foo."));

然后,您可以使用端点,就像它是任何其他端点一样。

from("jsonmq:myQueue").to("jsonmq:anotherQueue")

它使用 queueus "foo.myQueue" 和 "foo.anotherQueue",并使用给定的 Jackson Data Format 来回放和关闭队列。

48.5. 何时使用绑定

如果您在一个路由中仅使用端点一次,则绑定实际上可能比直接使用 'raw' 端点并照正常使用显式 marshalling 和 验证更为复杂和工作。

但是,当您将多个路由组成在一起时,绑定可以有所帮助;或使用一个路由作为"模板",用于配置输入和输出端点;绑定提供了将合同和端点嵌套在一起的不错方法。

绑定的另一个优点是,当您使用多个使用相同绑定的端点时,而不必提到特定的数据格式或验证规则,您只能使用 BindingComponent 将端点嵌套在您选择的绑定中。

因此绑定是构成工具的真正位置;只有当情况至关重要时,使用它们才会有额外的复杂性,除非您有大量路由或端点。

第 49 章 Bindy DataFormat

可作为 Camel 版本 2.0 提供

此组件的目标是允许解析/绑定非结构化数据(或更精确的非 XML 数据)
到使用注解定义的映射的 Java Bean 中。使用 Bindy,您可以从源(如 )绑定数据:

  • CSV 记录,
  • 固定长度记录,
  • FIX 消息,
  • 或者几乎任何其他非结构化数据

到一个或多个 Plain Old Java 对象(POJO)。Bindy 根据 java 属性的类型转换数据。OVAS 可以和在某些情况下提供的一对多关系链接。此外,对于如 Date、Duble、Float、Integer、Short、Long 和 BigDecal 等数据类型,您可以提供在属性格式应用的模式。

对于 BigDecimal number,您还可以定义精确数以及十进制和分组分隔符。

类型格式类型模式示例Link

Date

DateFormat

dd-MM-yyyy

http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html

十进制*

Decimalformat

..##

http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html

十进制* = Double, Integer, Float, Short, Long

*Format supported*

第一个发行版本只支持用逗号分开的值字段和键值对字段(例如:FIX 消息)。

要使用 camel-bindy,您必须首先在软件包中定义模型(例如 com.acme.model)和每个模型类(如 Order、client、Instrument、…​)将所需的注解(此处所示)添加到 Class 或 字段中。

*Multiple models*

如果您使用多个模型,则必须将每个模型放在它自己的软件包中,以防止无法预计的结果。

Camel 2.16 开始,不再如此,因为您可以在同一软件包中安全地有多个模型,因为现在您可以使用类名称而不是软件包名称来配置绑定。

49.1. 选项

Bindy dataformat 支持 5 选项,如下所示。

名称默认Java 类型描述

type

 

BindyType

是否使用 csv、fixd 或 key value 对模式。根据所选的数据格式,默认值为 Csv 或 KeyValue。

classType

 

字符串

要使用的模型类的名称。

locale

 

字符串

要配置默认的区域设置,如 us 代表单元状态。要使用 JVM 平台默认区域设置,请使用默认名称

unwrapSingleInstance

true

布尔值

当 unmarshalling 应该未换行并返回单个实例时,而不是在 java.util.List 中嵌套。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

49.2. Spring Boot Auto-Configuration

组件支持 18 个选项,如下所示。

名称描述默认类型

camel.dataformat.bindy-csv.class-type

要使用的模型类的名称。

 

字符串

camel.dataformat.bindy-csv.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.bindy-csv.enabled

启用 bindy-csv dataformat

true

布尔值

camel.dataformat.bindy-csv.locale

要配置默认的区域设置,如 us 代表单元状态。要使用 JVM 平台默认区域设置,请使用默认名称

 

字符串

camel.dataformat.bindy-csv.type

是否使用 csv、fixd 或 key value 对模式。

 

BindyType

camel.dataformat.bindy-csv.unwrap-single-instance

当 unmarshalling 应该未换行并返回单个实例时,而不是在 java.util.List 中嵌套。

true

布尔值

camel.dataformat.bindy-fixed.class-type

要使用的模型类的名称。

 

字符串

camel.dataformat.bindy-fixed.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.bindy-fixed.enabled

启用 bindy-fixed dataformat

true

布尔值

camel.dataformat.bindy-fixed.locale

要配置默认的区域设置,如 us 代表单元状态。要使用 JVM 平台默认区域设置,请使用默认名称

 

字符串

camel.dataformat.bindy-fixed.type

是否使用 csv、fixd 或 key value 对模式。

 

BindyType

camel.dataformat.bindy-fixed.unwrap-single-instance

当 unmarshalling 应该未换行并返回单个实例时,而不是在 java.util.List 中嵌套。

true

布尔值

camel.dataformat.bindy-kvp.class-type

要使用的模型类的名称。

 

字符串

camel.dataformat.bindy-kvp.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.bindy-kvp.enabled

启用 bindy-kvp 数据格式

true

布尔值

camel.dataformat.bindy-kvp.locale

要配置默认的区域设置,如 us 代表单元状态。要使用 JVM 平台默认区域设置,请使用默认名称

 

字符串

camel.dataformat.bindy-kvp.type

是否使用 csv、fixd 或 key value 对模式。

 

BindyType

camel.dataformat.bindy-kvp.unwrap-single-instance

当 unmarshalling 应该未换行并返回单个实例时,而不是在 java.util.List 中嵌套。

true

布尔值

ND

49.3. 注解

创建的注解可将您的模型的不同概念映射到 POJO,如 :

  • 记录类型(csv、键值对(例如 FIX 消息)、固定长度 …​)、
  • 链接(用于链接对象),
  • DataField 及其属性(int、type、…​))
  • KeyValuePairField(对于在修复财务消息中具有的 key = 价值格式)
  • 部分(用于识别标题、正文和页脚部分)
  • OneToMany,
  • BindyConverter (since 2.18.0),
  • 格式因素(自 2.18.0 开始)

本节将描述它们:

49.4. 1. CsvRecord

CsvRecord 注解用于标识模型的根类。它代表记录 = CSV 文件的一行,并可链接到多个子模型类。

注解名称记录类型级别

CsvRecord

csv

参数名称typeinfo

分隔符

字符串

必需 - 可以是 '、' 或 ';' 或 'anything"。支持的唯一空白字符是标签(\t)。不支持其它空格(空格)。这个值被解释为正则表达式。如果要使用正则表达式中具有特殊含义的符号,例如 '|' 符号,而不是您必须屏蔽它,如 '|'

skipFirstLine

布尔值

可选 - 默认值 = false - 允许跳过 CSV 文件的第一行

crlf

字符串

可选 - 可能的值 = WINDOWS、UNIX、MAC 或 custom; 默认值。WINDOWS - 允许定义要使用的回车字符。如果您指定之前列出的三个值,则输入(custom)的值将用作 CRLF 字符。

generateHeaderColumns

布尔值

可选 - 默认值 = false - 用来生成 CSV 的标头列

autospanLine

布尔值

Camel 2.13/2.12.2: 可选 - 默认值为 value = false - 如果启用最后一个列,则最后一个列将自动生成到行尾,例如,如果其注释,则此行可以包含所有字符,以及分隔符 char。

isOrdered

布尔值

可选 - 默认值 = false - 允许在生成 CSV 时更改字段的顺序

quote

字符串

Camel 2.8.3/2.9: 选项 - 允许指定生成 CSV 时字段的引号字符。此注解与模型的 root 类关联,必须声明一个时间。

引用

布尔值

*Camel 2.11:*optional - 默认值 = false - 在生成 CSV 时必须用引号(和标头)来加引号。

endWithLineBreak

布尔值

Camel 2.21: 可选 - 默认值 = true - 如果 CSV 生成的文件是否应该以换行符结尾。

case 1 : separator = ','

用于分隔 CSV 记录中字段的分隔符为",即:

10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500,
USD,08-01-2009
@CsvRecord( separator = "," )
public Class Order {

}

case 2 : separator = ';'

与前面的情况进行比较,此处的分隔符为 ';' 而不是 ',':

10; jine; M; XD12345678; Fortis Dynamic 15/15; 2500; USD; 08-01-2009

@CsvRecord( separator = ";" )
public Class Order {

}

case 3 : separator = '|'

与前面的情况进行比较,这里的分隔符为 '|' 而不是 ';':

10| J| Pauline| M| XD12345678| Fortis Dynamic 15/15| 2500| USD|
08-01-2009
@CsvRecord( separator = "\\|" )
public Class Order {

}

case 4 : separator = '\",\"'

适用于 Camel 2.8.2 或更早版本

当解析 CSV 记录的字段包含 '、' 或 ';',它也用作分隔符,我们需要找到另一个策略
告知 camel bindy 如何处理此问题单。要使用逗号定义包含数据的字段,您可以使用 simple 或双引号
作为分隔符(例如:'10'、'Street 10、NY'、'USA' 或 "10", "Street 10, NY", "USA")。
Remark :在这种情况下,该行的第一个和最后一个字符(即简单或双引号)将通过 bindy 删除

"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15"
2500","USD","08-01-2009"
@CsvRecord( separator = "\",\"" )
public Class Order {

}

Camel 2.8.3/2.9 或 never bindy 将自动检测记录是否用单引号或双引号括起来,并在从 CSV 变为对象时自动删除这些引号。因此 ,不要在 分隔符中包含引号,但简单操作如下:

"10","J","Pauline"," M","XD12345678","Fortis Dynamic 15,15"
2500","USD","08-01-2009"
@CsvRecord( separator = "," )
public Class Order {

}

请注意,如果要将对象与 CSV 总结和使用引号,则需要使用 @CsvRecord 上的 quote 属性来指定要使用的引号字符:

@CsvRecord( separator = ",", quote = "\"" )
public Class Order {

}

问题单 5: : 分隔符和跳过优先行

当客户端希望在文件的第一行中时,特性很有趣,数据字段的名称是:

订单 ID、客户端 ID、名字、姓氏、是代码、工具名称、数量、货币、日期

要告知 bindy,在解析过程中必须跳过此第一行,然后我们使用属性 :

@CsvRecord(separator = ",", skipFirstLine = true)
public Class Order {

}

case 6 : generateHeaderColumns

要在生成 CSV 的第一行中添加,属性 generateHeaderColumns 必须设为 true,如此注解所示:

@CsvRecord( generateHeaderColumns = true )
public Class Order {

}

因此,在 unmarshaing 过程中,Bindy 将生成 CSV,如 :

订单 ID、客户端 ID、名字、姓氏、是代码、工具名称、数量、货币、日期

10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500, USD,08-01-2009

案例 7:回车时返回

如果 camel-bindy 的平台将不会运行 Windows,但 Macintosh 或 Unix 将不会更改 crlf 属性,如下所示。提供三个值:WINDOWS、UNIX 或 MAC

@CsvRecord(separator = ",", crlf="MAC")
public Class Order {

}

另外,如果由于某种原因需要添加不同的行结尾字符,您可以选择使用 crlf 参数指定它。在以下示例中,我们可以使行以逗号加换行符结尾:

@CsvRecord(separator = ",", crlf=",\n")
public Class Order {

}

case 8 : isOrdered

有时,从模型创建 CSV 记录时要遵循的顺序与解析过程中使用的顺序不同。然后,在这种情况下,我们可以使用 isOrdered = true 来指明此属性与 DataField 注解的属性 'position' 结合使用。

@CsvRecord(isOrdered = true)
public Class Order {

   @DataField(pos = 1, position = 11)
   private int orderNr;

   @DataField(pos = 2, position = 10)
   private String clientNr;

}

Remark:pos 用于解析文件,流,而位置用于生成 CSV

49.6. 3.DataField

DataField 注释定义字段的属性。每个数据字段都由其在记录中的位置、类型(字符串、int、date、…​)以及可选的模式识别

注解名称记录类型级别

DataField

all

属性

参数名称typeinfo

pos

int

mandatory - 字段的输入 位置。从 1 到 …​ - 的数字号 - 查看位置参数。

pattern

字符串

可选 - 默认值 = "" - 将用于格式化 Decimal、Date、

length

int

可选 - 代表固定长度格式的字段长度

精度

int

可选 - 代表在完成 12 月号将被格式化/解析时的精度

pattern

字符串

可选 - 默认值 = "" - 供 Java 格式程序使用(例如:SimpleDateFormat)格式/无效数据。如果使用模式,则建议在 bindy 数据格式中设置 locale。设置为已知区域设置,如 "us",或使用 "default" 来使用平台默认区域设置。请注意,"default"需要 Camel 2.14/2.13.3/2.12.5。

position

int

可选 - 当 CSV 生成的 CSV 中字段的位置(输出消息)的位置必须与输入位置不同(pos)时,必须使用。请参阅 pos 参数。

required

布尔值

optional - default value = "false"

trim

布尔值

optional - default value = "false"

defaultValue

字符串

Camel 2.10: 可选 - 默认值 = "" - 定义对应 CSV 字段为空/不可用时字段的默认值

impliedDecimalSeparator

布尔值

Camel 2.11: 可选 - 默认值 = "false" - 如果指定位置有小点表示

lengthPos

int

Camel 2.11 :可选 - 可用于识别固定长度为固定长度的固定记录中的数据字段

对齐

字符串

可选 - 默认值 = "R" - 将文本附加到右或保留在固定长度字段中。使用 'R' 或 'L' 的值。

delimiter

字符串

Camel 2.11: 可选 - 可用于在固定长度记录中分离可变长度字段的末尾

case 1 : pos

此参数/attribute 代表 csv 记录中字段的位置

位置

@CsvRecord(separator = ",")
public class Order {

    @DataField(pos = 1)
    private int orderNr;

    @DataField(pos = 5)
    private String isinCode;

}

如您在本例中看到的那样,位置从 '1' 开始,但在类 Order 中继续为 '5'。从 '2' 到 '4' 的数字在类客户端中定义(请参见下文之后)。

在另一个模型类中继续位置

public class Client {

    @DataField(pos = 2)
    private String clientNr;

    @DataField(pos = 3)
    private String firstName;

    @DataField(pos = 4)
    private String lastName;
}

case 2 : pattern

模式允许增强或验证数据格式

pattern

@CsvRecord(separator = ",")
public class Order {

    @DataField(pos = 1)
    private int orderNr;

    @DataField(pos = 5)
    private String isinCode;

    @DataField(name = "Name", pos = 6)
    private String instrumentName;

    @DataField(pos = 7, precision = 2)
    private BigDecimal amount;

    @DataField(pos = 8)
    private String currency;

    // pattern used during parsing or when the date is created
    @DataField(pos = 9, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

案例 3:精准

当您想定义数字的十进制部分时,精度非常有用

精度

@CsvRecord(separator = ",")
public class Order {

    @DataField(pos = 1)
    private int orderNr;

    @Link
    private Client client;

    @DataField(pos = 5)
    private String isinCode;

    @DataField(name = "Name", pos = 6)
    private String instrumentName;

    @DataField(pos = 7, precision = 2)
    private BigDecimal amount;

    @DataField(pos = 8)
    private String currency;

    @DataField(pos = 9, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

问题单 4:输出中的 Position 不同

position 属性将告知绑定如何在生成的 CSV 记录中放置字段。默认情况下,使用的位置与通过属性 'pos' 定义的位置对应。如果位置不同(即,我们有一种可以比可以使用"组成"比较出的统计处理过程对比)来说明这一点。

下面是一个示例

输出中位置不同

@CsvRecord(separator = ",", isOrdered = true)
public class Order {

    // Positions of the fields start from 1 and not from 0

    @DataField(pos = 1, position = 11)
    private int orderNr;

    @DataField(pos = 2, position = 10)
    private String clientNr;

    @DataField(pos = 3, position = 9)
    private String firstName;

    @DataField(pos = 4, position = 8)
    private String lastName;

    @DataField(pos = 5, position = 7)
    private String instrumentCode;

    @DataField(pos = 6, position = 6)
    private String instrumentNumber;
}

注释 @DataField 的此属性必须与属性 isOrdered = true 结合使用。

问题单 5:必需

如果字段是必须的,只需使用将属性 'required' 设为 true

必需

@CsvRecord(separator = ",")
public class Order {

    @DataField(pos = 1)
    private int orderNr;

    @DataField(pos = 2, required = true)
    private String clientNr;

    @DataField(pos = 3, required = true)
    private String firstName;

    @DataField(pos = 4, required = true)
    private String lastName;
}

如果记录中没有此字段,解析器会使用以下信息来引发错误:

有些字段缺失(可选或强制),行:

case 6 : trim

如果字段具有前应该删除的前导和/或尾随空格,只需将属性 'trim' 设置为 true

Trim

@CsvRecord(separator = ",")
public class Order {

    @DataField(pos = 1, trim = true)
    private int orderNr;

    @DataField(pos = 2, trim = true)
    private Integer clientNr;

    @DataField(pos = 3, required = true)
    private String firstName;

    @DataField(pos = 4)
    private String lastName;
}

case 7 : defaultValue

如果未定义字段,则使用 defaultValue 属性指示的值

默认值

@CsvRecord(separator = ",")
public class Order {

    @DataField(pos = 1)
    private int orderNr;

    @DataField(pos = 2)
    private Integer clientNr;

    @DataField(pos = 3, required = true)
    private String firstName;

    @DataField(pos = 4, defaultValue = "Barin")
    private String lastName;
}

此属性仅适用于可选字段。

49.7. 4.FixedLengthRecord

FixedLengthRecord 注解用于标识模型的根类。它代表记录 = 包含已固定长度的文件/消息的行,并可链接到多个子类。这个格式是字段中的一个特定用法数据,可以与右或左键一致。
当数据的大小不会完全填写字段的长度时,我们可以添加"padd"字符。

注解名称记录类型级别

FixedLengthRecord

FIXED

参数名称typeinfo

crlf

字符串

可选 - 可能的值 = WINDOWS、UNIX、MAC 或 custom; 默认值。WINDOWS - 允许定义要使用的回车字符。如果您指定之前列出的三个值以外的值,则输入(custom)的值将用作 CRLF 字符。这个选项只在 marshalling 期间使用,而 unmarshalling 使用系统默认 JDK 提供行分隔符,除非 eol 已自定义

EOL

字符串

可选 - default="",它是一个空字符串。字符用于在未编出时(可选 - default = "" )在每条记录后结束行结束,这将帮助 JDK 提供默认的 JDK 提供行分隔符,除非提供任何其他行分隔符)。这个选项只适用于 unmarshalling,其中 marshalling 使用系统默认的分隔符作为"WINDOWS",除非提供任何其他值

paddingChar

char

mandatory - 默认值 = ' '

length

int

mandatory = 固定长度记录的大小

hasHeader

布尔值

Camel 2.11 - 可选 - 表明此类型的记录前面是文件 / 流开头的单个标头记录

hasFooter

布尔值

Camel 2.11 - 可选 - 表明此类型的记录可能后跟文件 / stream 末尾的单个 footer 记录

skipHeader

布尔值

Camel 2.11 - 可选 - 配置数据格式,以跳过标题记录的 marshalling / unmarshalling。在主记录(例如,而不是标题或页脚)上配置此参数。

skipFooter

布尔值

Camel 2.11 - 可选 - 配置数据格式,以跳过页脚记录的总结/未总结,在主记录(例如,而不是标头或 footer)上配置此参数。

isHeader

布尔值

Camel 2.11 - 可选 - 识别这个 FixedLengthRecord 作为标头记录

isFooter

布尔值

Camel 2.11 - 可选 - 识别这个 FixedLengthRecords 作为页脚记录

ignoreTrailingChars

布尔值

Camel 2.11.1 - 可选 - 在卸载 / 解析时,可以忽略最后一个映射文件以外的字符。 此注解与模型的 root 类关联,必须声明一个时间。

hasHeader/hasFooter 参数与Header/isFooter 相互排斥。记录不可是标题/页脚和主固定长度记录。

问题单 1:简单固定长度记录

这个简单示例演示了如何设计模型来解析/格式固定的信息

10A9PaulineMISINXD12345678BUYShare2500.45USD01-08-2009

fixed-simple

@FixedLengthRecord(length=54, paddingChar=' ')
public static class Order {

    @DataField(pos = 1, length=2)
    private int orderNr;

    @DataField(pos = 3, length=2)
    private String clientNr;

    @DataField(pos = 5, length=7)
    private String firstName;

    @DataField(pos = 12, length=1, align="L")
    private String lastName;

    @DataField(pos = 13, length=4)
    private String instrumentCode;

    @DataField(pos = 17, length=10)
    private String instrumentNumber;

    @DataField(pos = 27, length=3)
    private String orderType;

    @DataField(pos = 30, length=5)
    private String instrumentType;

    @DataField(pos = 35, precision = 2, length=7)
    private BigDecimal amount;

    @DataField(pos = 42, length=3)
    private String currency;

    @DataField(pos = 45, length=10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

问题单 2:修复长度记录,并提供对齐和 padding

这更详细地阐述了如何定义字段的对齐以及如何分配 padding 字符,该字符是"这里"

10A9 PaulineM ISINXD12345678BUYShare2500.45USD01-08-2009

fixed-padding-align

@FixedLengthRecord(length=60, paddingChar=' ')
public static class Order {

    @DataField(pos = 1, length=2)
    private int orderNr;

    @DataField(pos = 3, length=2)
    private String clientNr;

    @DataField(pos = 5, length=9)
    private String firstName;

    @DataField(pos = 14, length=5, align="L")   // align text to the LEFT zone of the block
    private String lastName;

    @DataField(pos = 19, length=4)
    private String instrumentCode;

    @DataField(pos = 23, length=10)
    private String instrumentNumber;

    @DataField(pos = 33, length=3)
    private String orderType;

    @DataField(pos = 36, length=5)
    private String instrumentType;

    @DataField(pos = 41, precision = 2, length=7)
    private BigDecimal amount;

    @DataField(pos = 48, length=3)
    private String currency;

    @DataField(pos = 51, length=10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

案例 3:字段 padding

有时,为记录定义的 default padding 不能应用于字段,因为我们想使用 '0' 而非 '' 添加内容格式。在这种情况下,您可以在模型中使用属性 paddingField 来设置这个值。

10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009

fixed-padding-field

@FixedLengthRecord(length = 65, paddingChar = ' ')
public static class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 3, length = 2)
    private String clientNr;

    @DataField(pos = 5, length = 9)
    private String firstName;

    @DataField(pos = 14, length = 5, align = "L")
    private String lastName;

    @DataField(pos = 19, length = 4)
    private String instrumentCode;

    @DataField(pos = 23, length = 10)
    private String instrumentNumber;

    @DataField(pos = 33, length = 3)
    private String orderType;

    @DataField(pos = 36, length = 5)
    private String instrumentType;

    @DataField(pos = 41, precision = 2, length = 12, paddingChar = '0')
    private BigDecimal amount;

    @DataField(pos = 53, length = 3)
    private String currency;

    @DataField(pos = 56, length = 10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

案例 4:使用分隔符修复长度

修复了长度记录,有时在记录中包含分隔的内容。firstName 和 lastName 字段使用以下示例中的 '^' 字符分隔:

10A9Pauline^M^ISINXD12345678BUYShare000002500.45USD01-08-2009

固定分隔

@FixedLengthRecord()
public static class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 2, length = 2)
    private String clientNr;

    @DataField(pos = 3, delimiter = "^")
    private String firstName;

    @DataField(pos = 4, delimiter = "^")
    private String lastName;

    @DataField(pos = 5, length = 4)
    private String instrumentCode;

    @DataField(pos = 6, length = 10)
    private String instrumentNumber;

    @DataField(pos = 7, length = 3)
    private String orderType;

    @DataField(pos = 8, length = 5)
    private String instrumentType;

    @DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
    private BigDecimal amount;

    @DataField(pos = 10, length = 3)
    private String currency;

    @DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

Camel 2.11 开始,固定长度记录中的 'pos' 值可以选择使用 或dinal 定义,顺序值而不是精确列号。

问题单 5:使用记录定义字段长度的修复长度

有时,固定长度记录可能包含用于定义相同记录中另一个字段的预期长度的字段。在以下示例中,instrumentNumber 字段值的长度由记录中的 instrumentNumberLen 字段的值定义。

10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009

固定分隔

@FixedLengthRecord()
public static class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 2, length = 2)
    private String clientNr;

    @DataField(pos = 3, delimiter = "^")
    private String firstName;

    @DataField(pos = 4, delimiter = "^")
    private String lastName;

    @DataField(pos = 5, length = 4)
    private String instrumentCode;

    @DataField(pos = 6, length = 2, align = "R", paddingChar = '0')
    private int instrumentNumberLen;

    @DataField(pos = 7, lengthPos=6)
    private String instrumentNumber;

    @DataField(pos = 8, length = 3)
    private String orderType;

    @DataField(pos = 9, length = 5)
    private String instrumentType;

    @DataField(pos = 10, precision = 2, length = 12, paddingChar = '0')
    private BigDecimal amount;

    @DataField(pos = 11, length = 3)
    private String currency;

    @DataField(pos = 12, length = 10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

问题单 6:带有标题和页脚修复长度记录

Bindy 将发现配置为模型的一部分配置的固定长度标题和 footer 记录 - 提供注解类存在于与主 @FixedLengthRecord 类或其中一个配置的扫描软件包中。以下文本演示了两个固定长度记录,这些记录由标题记录和页脚记录进行编码。

101-08-2009
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
10A9 RichN ISINXD12345678BUYShare000002700.45USD01-08-2009
9000000002

fixed-header-and-footer-main-class

@FixedLengthRecord(hasHeader = true, hasFooter = true)
public class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 2, length = 2)
    private String clientNr;

    @DataField(pos = 3, length = 9)
    private String firstName;

    @DataField(pos = 4, length = 5, align = "L")
    private String lastName;

    @DataField(pos = 5, length = 4)
    private String instrumentCode;

    @DataField(pos = 6, length = 10)
    private String instrumentNumber;

    @DataField(pos = 7, length = 3)
    private String orderType;

    @DataField(pos = 8, length = 5)
    private String instrumentType;

    @DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
    private BigDecimal amount;

    @DataField(pos = 10, length = 3)
    private String currency;

    @DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

@FixedLengthRecord(isHeader = true)
public  class OrderHeader {
    @DataField(pos = 1, length = 1)
    private int recordType = 1;

    @DataField(pos = 2, length = 10, pattern = "dd-MM-yyyy")
    private Date recordDate;
}

@FixedLengthRecord(isFooter = true)
public class OrderFooter {

    @DataField(pos = 1, length = 1)
    private int recordType = 9;

    @DataField(pos = 2, length = 9, align = "R", paddingChar = '0')
    private int numberOfRecordsInTheFile;
}

case 7 :解析固定长度记录时跳过内容。(Camel 2.11.1)

通常与提供固定长度记录(包含目标用例所需信息)的系统集成很常见。在这种情况下,跳过声明并解析我们不需要的这些字段。为 accomodate,如果下一个声明字段的 'pos' 值超出最后一个解析字段的光标位置,则 Bindy 将跳过至记录中的下一个映射字段。将绝对的 'pos' 位置用于感兴趣的字段(而不是 或dinal 值)会导致 Bindy 跳过两个字段之间的内容。

同样,除某些字段之外的内容都可能值得关注。在这种情况下,您可以通过在 @FixedLengthRecord 声明上设置 ignoreTrailingChars 属性来跳过除最后映射字段以外的任何内容的解析。

@FixedLengthRecord(ignoreTrailingChars = true)
public static class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 3, length = 2)
    private String clientNr;

    // any characters that appear beyond the last mapped field will be ignored

}

49.8. 5.消息

Message 注解用于标识您的模型的类,它们将包含键值对字段。这种格式主要用于财务交换协议信息(修复)。不过,此注解可用于通过密钥识别数据的任何其他格式。密钥对值互相分隔,可以是一个特殊字符(如 tab delimitor (unicode 表示 : \u0009))或开始标题(unicode representation : \u0001)

*"FIX information"*

有关修复的更多信息可在此网站上找到:http://www.fixprotocol.org/ http://www.fixprotocol.org/要使用 FIX 消息,模型必须包含与根消息类关联的标头和 Trailer 类,这些类可以是 Order 类。这不是强制性,但当您使用 camel-bindy 和 camel-fix (基于快速Fix 项目 http://www.quickfixj.org/ )的修复网关时,将非常有用。

注解名称记录类型级别

消息

键值对

参数名称typeinfo

pairSeparator

字符串

mandatory - 可以是 '=' 或 ';' 或 'anything'

keyValuePairSeparair

字符串

mandatory - 可以是 '\u0001'、'\u0009'、'#' 或 'anything'

crlf

字符串

可选 - 可能的值 = WINDOWS、UNIX、MAC 或 custom;默认值 = WINDOWS - 允许定义要使用的回车字符。如果您指定之前列出的三个值,则输入(custom)的值将用作 CRLF 字符。

type

字符串

可选 - 定义消息类型(例如 FIX、EMX、…​)

version

字符串

可选 - 消息的版本(如 4.1)

isOrdered

布尔值

可选 - 默认值 = false - 允许在生成 FIX 消息时更改字段的顺序。此注解与模型的 message 类关联,必须声明一个时间。

case 1 : separator = 'u0001'

用于隔离 FIX 消息中的键值对字段的分隔符为 ASCII '01' 字符或 unicode 格式 '\u0001'。此字符必须再次转义,以避免 java 运行时错误。下面是一个示例:

8=FIX.4.1 9=20 34=1 35=0 49=INVMGR 56=BRKR 1=BE.CHM.001 11=CHM0001-01
22=4 ...

以及如何使用注解

FIX - 消息

@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {

}
*Look at test cases*

Tab、…​ 等 ASCII 字符无法在 WIKI 页面中显示。因此,请仔细查看 camel-bindy 的测试案例,以准确了解 FIX 消息的显示方式(src\test\data\fix\fix.txt)和 Order, Trailer, Header 类(src\test\java\org\apache\camel\dataformat\bindy\model\fix\fix.java)

49.9. 6.KeyValuePairField

KeyValuePairField 注释定义键值对字段的 属性。每个 KeyValuePairField 由一个标签(= key)及其关联的值(字符串、int、date、…​)标识,可选模式,以及字段(如果需要)

注解名称记录类型级别

KeyValuePairField

Key Value Pair - FIX

属性

参数名称typeinfo

tag

int

mandatory - 标识消息中字段的数字号 - 必须是唯一的

pattern

字符串

可选 - 默认值 = "" - 将用于格式化 Decimal、Date、…​

精度

int

可选 - 数字号 - 代表当拒绝号被格式化/parsed 时使用的精度

position

int

可选 - 当 FIX 消息中的键/标签的位置必须不同时,必须使用

required

布尔值

optional - default value = "false"

impliedDecimalSeparator

布尔值

Camel 2.11: 可选 - 默认值 = "false" - 如果指定位置有小点表示

case 1 : tag

此参数表示消息中字段的键

FIX 消息 - Tag

@Message(keyValuePairSeparator = "=", pairSeparator = "\u0001", type="FIX", version="4.1")
public class Order {

    @Link Header header;

    @Link Trailer trailer;

    @KeyValuePairField(tag = 1) // Client reference
    private String Account;

    @KeyValuePairField(tag = 11) // Order reference
    private String ClOrdId;

    @KeyValuePairField(tag = 22) // Fund ID type (Sedol, ISIN, ...)
    private String IDSource;

    @KeyValuePairField(tag = 48) // Fund code
    private String SecurityId;

    @KeyValuePairField(tag = 54) // Movement type ( 1 = Buy, 2 = sell)
    private String Side;

    @KeyValuePairField(tag = 58) // Free text
    private String Text;
}

案例 2:输出中的不同位置

如果我们将放置在 FIX 消息的标签/键必须按照预定义的顺序排序,则使用注释 @KeyValuePairField 的属性 'position'

FIX 消息 - Tag - sort

@Message(keyValuePairSeparator = "=", pairSeparator = "\\u0001", type = "FIX", version = "4.1", isOrdered = true)
public class Order {

    @Link Header header;

    @Link Trailer trailer;

    @KeyValuePairField(tag = 1, position = 1) // Client reference
    private String account;

    @KeyValuePairField(tag = 11, position = 3) // Order reference
    private String clOrdId;
}

49.10. 7.节

在修复固定长度记录消息中,通常会在信息 : 标头、正文和部分表示有不同的部分。注释 @Section 的目的是告知绑定模型的哪个类代表标题(= 第 1 部分)、正文(= 部分 2 节)和 footer (= 第 3 节)

此注解仅存在一个属性/参数。

注解名称记录类型级别

修复

参数名称typeinfo

number

int

标识部分位置的数字

案例 1:部分

标头部分的定义

FIX 消息 - 第 - Header

@Section(number = 1)
public class Header {

    @KeyValuePairField(tag = 8, position = 1) // Message Header
    private String beginString;

    @KeyValuePairField(tag = 9, position = 2) // Checksum
    private int bodyLength;
}

body 部分的定义

FIX 消息 - 第 - Body

@Section(number = 2)
@Message(keyValuePairSeparator = "=", pairSeparator = "\\u0001", type = "FIX", version = "4.1", isOrdered = true)
public class Order {

    @Link Header header;

    @Link Trailer trailer;

    @KeyValuePairField(tag = 1, position = 1) // Client reference
    private String account;

    @KeyValuePairField(tag = 11, position = 3) // Order reference
    private String clOrdId;

footer 部分的定义

FIX 消息 - 第 - Footer

@Section(number = 3)
public class Trailer {

    @KeyValuePairField(tag = 10, position = 1)
    // CheckSum
    private int checkSum;

    public int getCheckSum() {
        return checkSum;
    }

49.11. 8.OneToMany

注释 @OneToMany 的目的是允许使用 List<?& gt; 字段定义 POJO 类或包含重复组的记录。

*Restrictions OneToMany*

请注意,一个到许多绑定的绑定都不允许处理在层次结构的多个级别上定义的重复数据

在以下情况下,根据以下情况的关系:

  • 阅读包含重复组(=组 tags/keys)的修复消息
  • 使用重复数据生成 CSV
注解名称记录类型级别

OneToMany

all

属性

参数名称typeinfo

mappedTo

字符串

可选 - string - 与 Class> 的 List<Type 关联的类名称

问题单 1:生成带有重复数据的 CSV

以下是我们想要的 CSV 输出:

Claus,Ibsen,Camel in Action 1,2010,35
Claus,Ibsen,Camel in Action 2,2012,35
Claus,Ibsen,Camel in Action 3,2013,35
Claus,Ibsen,Camel in Action 4,2014,35

Remark:与本书的标题及其发布日期有关的重复数据,而姓氏、姓氏和年龄是通用的

和用于建模的类。Author 类包含 Book 的列表。

使用重复数据生成 CSV

@CsvRecord(separator=",")
public class Author {

    @DataField(pos = 1)
    private String firstName;

    @DataField(pos = 2)
    private String lastName;

    @OneToMany
    private List<Book> books;

    @DataField(pos = 5)
    private String Age;
}

public class Book {

    @DataField(pos = 3)
    private String title;

    @DataField(pos = 4)
    private String year;
}

非常简单!!

案例 2:读取修复消息,包含标签/密钥组

以下是希望在我们的模型中处理的消息:

8=FIX 4.19=2034=135=049=INVMGR56=BRKR
1=BE.CHM.00111=CHM0001-0158=this is a camel - bindy test
22=448=BE000124567854=1
22=548=BE000987654354=2
22=648=BE000999999954=3
10=220

标签 22、48 和 54 正在重复

和代码

阅读包含一组 tags/keys 组的 FIX 消息

public class Order {

    @Link Header header;

    @Link Trailer trailer;

    @KeyValuePairField(tag = 1) // Client reference
    private String account;

    @KeyValuePairField(tag = 11) // Order reference
    private String clOrdId;

    @KeyValuePairField(tag = 58) // Free text
    private String text;

    @OneToMany(mappedTo = "org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Security")
    List<Security> securities;
}

public class Security {

    @KeyValuePairField(tag = 22) // Fund ID type (Sedol, ISIN, ...)
    private String idSource;

    @KeyValuePairField(tag = 48) // Fund code
    private String securityCode;

    @KeyValuePairField(tag = 54) // Movement type ( 1 = Buy, 2 = sell)
    private String side;
}

49.12. 9.BindyConverter

注释 @BindyConverter 定义了要在字段级别使用转换器。提供的类必须实施 Format 接口。

@FixedLengthRecord(length = 10, paddingChar = ' ')
public static class DataModel {
    @DataField(pos =  1, length = 10, trim = true)
    @BindyConverter(CustomConverter.class)
    public String field1;
}

public static class CustomConverter implements Format<String> {
    @Override
    public String format(String object) throws Exception {
        return (new StringBuilder(object)).reverse().toString();
    }

    @Override
    public String parse(String string) throws Exception {
        return (new StringBuilder(string)).reverse().toString();
    }
}

49.13. 10.FormatFactories

注释 @FormatFactories 的目的是在记录级别定义一组转换器。提供的类必须实施 FormatFactoryInterface 接口。

@CsvRecord(separator = ",")
@FormatFactories({OrderNumberFormatFactory.class})
public static class Order {

    @DataField(pos = 1)
    private OrderNumber orderNr;

    @DataField(pos = 2)
    private String firstName;
}

public static class OrderNumber {
    private int orderNr;

    public static OrderNumber ofString(String orderNumber) {
        OrderNumber result = new OrderNumber();
        result.orderNr = Integer.valueOf(orderNumber);
        return result;
    }
}

public static class OrderNumberFormatFactory extends AbstractFormatFactory {

    {
        supportedClasses.add(OrderNumber.class);
    }

    @Override
    public Format<?> build(FormattingOptions formattingOptions) {
        return new Format<OrderNumber>() {
            @Override
            public String format(OrderNumber object) throws Exception {
                return String.valueOf(object.orderNr);
            }

            @Override
            public OrderNumber parse(String string) throws Exception {
                return OrderNumber.ofString(string);
            }
        };
    }
}

49.14. 支持的 Datatypes

DefaultFormatFactory 通过基于提供的 FormattingOptions 返回接口 FormatFactoryInterface 实例来格式化以下数据类型:

  • BigDecimal
  • BigInteger
  • 布尔值
  • Byte
  • 字符
  • Date
  • 枚举
  • 浮点值
  • 整数
  • LocalDate (自 2.18.0 起运行 8)
  • LocalDateTime (java 8, since 2.18.0)
  • localtime (java 8 since 2.18.0)
  • Long
  • 字符串

可以通过在使用的 registry 中提供 FactoryRegistry 实例(如 spring 或 JNDI)来覆盖 DefaultFormatFactory。

49.15. 使用 Java DSL

下一步包含与这个记录类型关联的 DataFormat bindy 类,并提供 Java 软件包名称作为参数。

例如,以下使用类 BindyCsvDataFormat (与 CSV 记录类型关联的类对应),该类使用 com.acme.model 软件包名称来初始化在这个软件包中配置的模型对象。

// Camel 2.15 or older (configure by package name)
DataFormat bindy = new BindyCsvDataFormat("com.acme.model");

 
// Camel 2.16 onwards (configure by class name)
DataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);

49.15.1. 设置区域设置

Bindy 支持在 dataformat 上配置区域设置,例如 

// Camel 2.15 or older (configure by package name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model");
// Camel 2.16 onwards (configure by class name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);

bindy.setLocale("us");

或者使用平台默认区域设置,然后使用 "default" 作为区域设置。请注意,这需要 Camel 2.14/2.13.3/2.12.5。

// Camel 2.15 or older (configure by package name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model");
// Camel 2.16 onwards (configure by class name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);

bindy.setLocale("default");

对于旧版本的版本,您可以按照如下所示使用 Java 代码来设置它

// Camel 2.15 or older (configure by package name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model");
// Camel 2.16 onwards (configure by class name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);

bindy.setLocale(Locale.getDefault().getISO3Country());

49.15.2. unmarshaling

from("file://inbox")
  .unmarshal(bindy)
  .to("direct:handleOrders");

另外,您可以使用命名的引用来指代数据格式,然后可以在 Registry 中定义,如 Spring XML 文件:

from("file://inbox")
  .unmarshal("myBindyDataFormat")
  .to("direct:handleOrders");

Camel 路由将提取 inbox 目录中的文件,将未编出 CSV 记录到模型对象集合中,并将集合
发送到由"handleOrders"引用的路由。

返回的集合是一个 Map 对象列表。列表中的每个映射都包含在 CSV 每行中汇总的模型对象。其背后的原因是 每行可以对应于多个对象。当您只期望一行返回一个对象时,这可能会造成混淆。

每个对象都可以使用其类名称来检索。

List<Map<String, Object>> unmarshaledModels = (List<Map<String, Object>>) exchange.getIn().getBody();

int modelCount = 0;
for (Map<String, Object> model : unmarshaledModels) {
  for (String className : model.keySet()) {
     Object obj = model.get(className);
     LOG.info("Count : " + modelCount + ", " + obj.toString());
  }
 modelCount++;
}

LOG.info("Total CSV records received by the csv bean : " + modelCount);

假设您要从此映射中提取单个 Order 对象以便在路由中处理,您可以使用 Splitter 和 Processor 的组合,如下所示:

from("file://inbox")
    .unmarshal(bindy)
    .split(body())
        .process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                Message in = exchange.getIn();
                Map<String, Object> modelMap = (Map<String, Object>) in.getBody();
                in.setBody(modelMap.get(Order.class.getCanonicalName()));
            }
        })
        .to("direct:handleSingleOrder")
    .end();

请注意,Bindy 使用 CHARSET_NAME 属性或 CHARSET_NAME 标头(在 Exchange 界面中定义)来进行为 unmarshalling 收到的输入流的字符转换。在某些制作者(如 file-endpoint)中,您可以定义字符集。此制作者已经实现的字符集转换。有时,您需要在交换中删除此属性或标头,然后将其发送到 unmarshal。如果您没有删除转换,则可能需要两次执行转换可能会导致不必要的结果。

from("file://inbox?charset=Cp922")
  .removeProperty(Exchange.CHARSET_NAME)
  .unmarshal("myBindyDataFormat")
  .to("direct:handleOrders");

49.15.3. marshaling

要从模型对象集合生成 CSV 记录,请创建以下路由:

from("direct:handleOrders")
   .marshal(bindy)
   .to("file://outbox")

49.16. 使用 Spring XML

这非常容易使用 Spring 作为您首选的 DSL 语言,以声明要用于 camel-bindy 的路由。以下示例显示两个路由,第一条将从文件中选取记录,取消汇总内容并将其绑定到其模型。然后,结果会发送到 pojo(没有任何特殊情况),并将它们放入队列。

第二个路由将从队列中提取 pojos,并汇总内容,以生成包含 csv 记录的文件。上面的例子是使用 Camel 2.16 开始的。

Spring dsl

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring
       http://camel.apache.org/schema/spring/camel-spring.xsd">

    <!-- Queuing engine - ActiveMq - work locally in mode virtual memory -->
    <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="brokerURL" value="vm://localhost:61616"/>
    </bean>

    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <dataFormats>
          <bindy id="bindyDataformat" type="Csv" classType="org.apache.camel.bindy.model.Order"/>
        </dataFormats>

        <route>
            <from uri="file://src/data/csv/?noop=true" />
            <unmarshal ref="bindyDataformat" />
            <to uri="bean:csv" />
            <to uri="activemq:queue:in" />
        </route>

        <route>
            <from uri="activemq:queue:in" />
            <marshal ref="bindyDataformat" />
            <to uri="file://src/data/csv/out/" />
        </route>
    </camelContext>
</beans>
注意

请验证您的模型类是否实现序列化,否则队列管理器将引发错误

49.17. 依赖项

要在 camel 路由中使用 Bindy,需要添加对 camel-bindy 的依赖来实施此数据格式。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-bindy</artifactId>
  <version>x.x.x</version>
</dependency>

第 50 章 将 OSGi 蓝图与 Camel 搭配使用

已创建一个用于 Blueprint 的自定义 XML 命名空间,以便让您充分利用 nice XML 死机。由于 Blueprint 自定义命名空间尚未标准化,但这个命名空间只能用于 Apache Aries Blueprint 实施,后者是 Apache Karaf 所用命名空间。

50.1. 概述

XML 模式大体与 Spring 的选项基本相同,因此所有引用 Spring XML 的文档中的 xml 代码段也适用于 Blueprint 路由。

以下是使用蓝图的简单路由定义:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <from uri="timer:test" />
            <to uri="log:test" />
        </route>
    </camelContext>

</blueprint>

此时,支持的 xml 元素(专用于 Spring xml 语法)有一些限制:

  • beanPostProcessor 特定于 Spring,不允许

但是,当您在 OSGi 环境中部署应用程序时,使用蓝图有几个优点:

  • 当升级到新的 camel 版本时,您不必更改命名空间,因为正确的版本将根据捆绑包导入的 camel 软件包来选择。
  • 对自定义命名空间和捆绑包没有启动排序问题
  • 您可以使用 Blueprint 属性占位符

50.2. 使用 camel-blueprint

要在 OSGi 中利用 camel-blueprint,除了 camel-core 及其依赖软件包外,您还需要 Aries Blueprint 捆绑包和 camel-blueprint 捆绑包。

如果使用 Karaf,您可以使用名为 camel-blueprint 的功能,它将安装所有所需的捆绑包。

第 51 章 Bonita Component

作为 Camel 版本 2.19 可用

用于与远程 Bonita BPM 流程引擎通信。

51.1. URI 格式

bonita://[operation]?[options]

其中 operation 是要在 Bonita 上执行的特定操作。

51.2. 常规选项

Bonita 组件没有选项。

Bonita 端点使用 URI 语法进行配置:

bonita:operation

使用以下路径和查询参数:

51.2.1. 路径名(1 参数):

名称描述默认类型

operation

要使用 所需的操作

 

BonitaOperation

51.2.2. 查询参数(9 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

hostname (consumer)

运行 Bonita 引擎的主机名

localhost

字符串

port (consumer)

服务器托管 Bonita 引擎的端口

8080

字符串

processName (consumer)

操作中涉及的进程的名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

密码 (安全)

用于向 Bonita 引擎进行身份验证的密码。

 

字符串

username (security)

向 Bonita 引擎进行身份验证的用户名。

 

字符串

51.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.bonita.enabled

启用 bonita 组件

true

布尔值

camel.component.bonita.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

51.4. 正文内容

对于 startCase 操作,输入变量是从正文消息中检索。这个方法必须包含一个 Map<String,Serializable>。

51.5. 例子

以下示例在 Bonita 中启动新的问题单:

from("direct:start").to("bonita:startCase?hostname=localhost&amp;port=8080&amp;processName=TestProcess&amp;username=install&amp;password=install")

51.6. 依赖项

要在 Camel 路由中使用 Bonita,您需要添加实施该组件的 camel-bonita 的依赖项。

如果您使用 Maven,您只需在 pom.xml 中添加以下内容,将最新和最大版本的版本号替换(请参阅最新版本下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-bonita</artifactId>
  <version>x.x.x</version>
</dependency>

第 52 章 Boon DataFormat

作为 Camel 版本 2.16 可用

boon 是一个数据格式,它使用 Boon JSON marshalling 库将 JSON 有效负载分到 Java 对象,或将 JSON 对象聚合到 JSON 有效负载中。boon 旨在比当前使用的其他常见 解析器是一个简单而快速的 解析器。

52.1. 选项

Boon dataformat 支持 3 个选项,它们如下。

名称默认Java 类型描述

unmarshalTypeName

 

字符串

取消armshalling 时要使用的 java 类型的类名称

useList

false

布尔值

要取消与映射列表或 Pojo 列表相关的内容。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

52.2. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.dataformat.boon.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.boon.enabled

启用 boon 数据格式

true

布尔值

camel.dataformat.boon.unmarshal-type-name

取消armshalling 时要使用的 java 类型的类名称

 

字符串

camel.dataformat.boon.use-list

要取消与映射列表或 Pojo 列表相关的内容。

false

布尔值

ND

52.3. 使用 Java DSL

DataFormat boonDataFormat = new BoonDataFormat("com.acme.model.Person");

from("activemq:My.Queue")
  .unmarshal(boonDataFormat)
  .to("mqseries:Another.Queue");

52.4. 使用 Blueprint XML

<bean id="boonDataFormat" class="org.apache.camel.component.boon.BoonDataFormat">
  <argument value="com.acme.model.Person"/>
</bean>

<camelContext id="camel" xmlns="http://camel.apache.org/schema/blueprint">
  <route>
    <from uri="activemq:My.Queue"/>
    <unmarshal ref="boonDataFormat"/>
    <to uri="mqseries:Another.Queue"/>
  </route>
</camelContext>

52.5. 依赖项

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-boon</artifactId>
  <version>x.x.x</version>
</dependency>

第 53 章 box 组件

作为 Camel 版本 2.14 可用

Box 组件提供对可通过 https://github.com/box/box-java-sdk 访问的所有 Box.com API 的访问。它允许生成消息来上传和下载文件,创建、编辑和管理文件夹等。它还支持 API,允许轮询用户帐户以及企业帐户更改等。

box.com 要求使用 OAuth2.0 进行所有客户端应用程序身份验证。要使用您帐户的 camel-box,您需要在 Box.com 中创建一个新应用程序,地址为 https://developer.box.com。Box 应用的客户端 ID 和机密将允许访问需要当前用户的 Box API。用户访问令牌由最终用户的 API 生成和管理。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-box</artifactId>
    <version>${camel-version}</version>
</dependency>

53.1. 连接身份验证类型

Box 组件支持三种不同类型的身份验证的连接。

53.1.1. 标准身份验证

标准身份验证 使用 OAuth 2.0 三组身份验证过程 通过 Box.com 验证其连接。这种类型的身份验证可让 Box 受管用户和 外部用户 通过 Box 组件访问、编辑并保存其 Box 内容。

53.1.2. 应用程序企业身份验证

应用 企业身份验证 使用 OAuth 2.0 和 JSON Web 令牌(JWT),将其连接验证为 Box 应用的 服务帐户。这种类型的身份验证可让服务帐户访问、编辑并保存其 Box 应用的 Box 内容(通过 Box 组件)。

53.1.3. 应用程序用户身份验证

应用程序 用户身份验证 使用带有 JSON Web 令牌(JWT)的 OAuth 2.0,将其连接验证为 Box 应用的 App User。这种类型的身份验证可让 应用程序 用户访问、编辑并保存其 Box 内容(通过 Box 组件)。

53.2. 选框选项

Box 组件支持 2 个选项,它们如下所列。

名称描述默认类型

configuration (common)

使用共享配置

 

BoxConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Box 端点使用 URI 语法进行配置:

box:apiName/methodName

使用以下路径和查询参数:

53.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

BoxApiName

methodName

所选操作需要什么子操作

 

字符串

53.2.2. 查询参数(20 参数):

名称描述默认类型

clientId (common)

box 应用程序客户端 ID

 

字符串

enterpriseId (common)

用于 App Enterprise 的企业 ID。

 

字符串

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

userId (common)

用于应用程序用户的用户 ID。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

httpParams (advanced)

自定义 HTTP 参数用于代理主机等设置

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

accessTokenCache (security)

用于存储和检索访问令牌的自定义访问令牌。

 

IAccessTokenCache

clientSecret (security)

box 应用程序客户端 secret

 

字符串

encryptionAlgorithm (security)

JWT 加密算法的类型。支持 Algorithms: RSA_SHA_256 RSA_SHA_384 RSA_SHA_512

RSA_SHA_256

EncryptionAlgorithm

maxCacheEntries (security)

缓存中访问令牌的最大数量。

100

int

authenticationType (authentication)

用于连接的验证类型。身份验证类型:STANDARD_AUTHENTICATION - OAuth 2.0 (3-legged) SERVER_AUTHENTICATION - 带有 JSON Web 令牌的 OAuth 2.0

APP_USER_AUTHENTICATION

字符串

privateKeyFile (security)

生成 JWT 签名的私钥。

 

字符串

privateKeyPassword (security)

私钥的密码。

 

字符串

publicKeyId (security)

验证 JWT 签名的公钥 ID。

 

字符串

sslContextParameters (security)

使用 SSLContextParameters 配置安全性。

 

SSLContextParameters

userName (security)

box 用户名,提供 MUST

 

字符串

userPassword (security)

box 用户密码,如果未设置 authSecureStorage,或者在第一次调用时返回 null,则需要提供 MUST

 

字符串

53.3. Spring Boot Auto-Configuration

组件支持 17 个选项,如下所示。

名称描述默认类型

camel.component.box.configuration.access-token-cache

用于存储和检索访问令牌的自定义访问令牌。

 

IAccessTokenCache

camel.component.box.configuration.api-name

要执行的操作种类

 

BoxApiName

camel.component.box.configuration.authentication-type

用于连接的验证类型。身份验证类型:STANDARD_AUTHENTICATION - OAuth 2.0 (3-legged) SERVER_AUTHENTICATION - 带有 JSON Web 令牌的 OAuth 2.0

APP_USER_AUTHENTICATION

字符串

camel.component.box.configuration.client-id

box 应用程序客户端 ID

 

字符串

camel.component.box.configuration.client-secret

box 应用程序客户端 secret

 

字符串

camel.component.box.configuration.enterprise-id

用于 App Enterprise 的企业 ID。

 

字符串

camel.component.box.configuration.http-params

自定义 HTTP 参数用于代理主机等设置

 

map

camel.component.box.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.box.configuration.private-key-file

生成 JWT 签名的私钥。

 

字符串

camel.component.box.configuration.private-key-password

私钥的密码。

 

字符串

camel.component.box.configuration.public-key-id

验证 JWT 签名的公钥 ID。

 

字符串

camel.component.box.configuration.ssl-context-parameters

使用 SSLContextParameters 配置安全性。

 

SSLContextParameters

camel.component.box.configuration.user-id

用于应用程序用户的用户 ID。

 

字符串

camel.component.box.configuration.user-name

box 用户名,提供 MUST

 

字符串

camel.component.box.configuration.user-password

box 用户密码,如果未设置 authSecureStorage,或者在第一次调用时返回 null,则需要提供 MUST

 

字符串

camel.component.box.enabled

启用 box 组件

true

布尔值

camel.component.box.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

53.4. URI 格式

box:apiName/methodName

apiName 可以是以下之一:

  • 协作
  • 注释
  • event-logs
  • files
  • 文件夹
  • groups
  • 事件
  • search
  • tasks
  • users

53.5. 制作者端点:

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 URI MUST 包含一个前缀。

不是必需的端点选项由 [] 表示。如果端点没有强制选项,则会提供一组 [] 选项 MUST。制作者端点也可以使用特殊选项 inBody ,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelBox.<option> 的格式。请注意, inBody 选项会覆盖消息标头,例如, Body=option 中的 endpoint 选项会覆盖 CamelBox.option 标头。

如果没有为端点 URI 中的选项 defaultRequest 提供值,则它将假定为 null。请注意,只有其它选项不满足匹配的端点时,才会使用 null 值。

如果是 Box API 错误,端点将使用 com.box.sdk.BoxAPIException 派生异常原因抛出 RuntimeCamelException。

53.5.1. 端点前缀 协作

有关 Box 协作的更多信息,请参阅 https://developer.box.com/reference#collaboration-object。 以下端点可以通过前缀 协作来调用, 如下所示:

box:collaborations/endpoint?[options]
端点简写别名选项结果 Body 类型

addFolderCollaboration

add

folderId、collaborator、role

com.box.sdk.BoxCollaboration

addFolderCollaborationByEmail

addByEmail

folderId, email, role

com.box.sdk.BoxCollaboration

deleteCollaboration

delete

collaborationId

 

getFolderCollaborations

协作

folderId

java.util.Collection

getPendingCollaborations

pendingCollaborations

 

java.util.Collection

getCollaborationInfo

info

collaborationId

com.box.sdk.BoxCollaboration.Info

updateCollaborationInfo

updateInfo

collaborationId, info

com.box.sdk.BoxCollaboration

用于 协作的URI 选项

名称类型

collaborationId

字符串

collaborator

com.box.sdk.BoxCollaborator

role

com.box.sdk.BoxCollaboration.Role

folderId

字符串

email

字符串

info

com.box.sdk.BoxCollaboration.Info

53.5.2. 端点前缀 注释

有关 Box 注释的更多信息,请参阅 https://developer.box.com/reference#comment-object。 以下端点可以通过前缀 注释 调用,如下所示:

box:comments/endpoint?[options]
端点简写别名选项结果 Body 类型

addFileComment

add

fileId, message

com.box.sdk.BoxFile

changeCommentMessage

updateMessage

commentId, message

com.box.sdk.BoxComment

deleteComment

delete

commentId

 

getCommentInfo

info

commentId

com.box.sdk.BoxComment.Info

getFileComments

注释

fileId

java.util.List

replyToComment

答复

commentId, message

com.box.sdk.BoxComment

用于 协作的URI 选项

名称类型

commentId

字符串

fileId

字符串

message

字符串

53.5.3. endpoint Prefix events-logs

有关 Box 事件日志的更多信息,请参阅 https://developer.box.com/reference#events。以下端点可以通过前缀 event-logs 调用,如下所示:

box:event-logs/endpoint?[options]
端点简写别名选项结果 Body 类型

getEnterpriseEvents

事件

位置, after, before, [types]

java.util.List

event-logs的 URI 选项

名称类型

position

字符串

结束后

Date

之前

Date

类型

com.box.sdk.BoxEvent.Types[]

53.5.4. 端点前缀 文件

有关 Box 文件的更多信息,请参阅 https://developer.box.com/reference#file-object。以下端点可以通过前缀 文件 调用,如下所示:

box:files/endpoint?[options]
端点简写别名选项结果 Body 类型

uploadFile

上传

parentFolderId, 内容, fileName, [created], [modified], [size], [listener]

com.box.sdk.BoxFile

downloadFile

下载

fileId, output, [rangeStart], [rangeEnd], [listener]

java.io.OutputStream

copyFile

复制

fileId, destinationFolderId, [newName]

com.box.sdk.BoxFile

moveFile

Move

fileId, destinationFolderId, [newName]

com.box.sdk.BoxFile

renameFile

重命名

fileId, newFileName

com.box.sdk.BoxFile

createFileSharedLink

link

fileId, access, [unshareDate], [permissions]

com.box.sdk.BoxSharedLink

deleteFile

delete

fileId

 

uploadNewFileVersion

uploadVersion

fileId, fileContent, [modified], [fileSize], [listener]

com.box.boxsdk.BoxFile

promoteFileVersion

promoteVersion

fileId, version

com.box.sdk.BoxFileVersion

getFileVersions

版本

fileId

java.util.Collection

downloadPreviousFileVersions

downloadVersion

fileId、version、output、[listener]

java.io.OutputStream

deleteFileVersion

deleteVersion

fileId, version

 

getFileInfo

info

fileId, 字段

com.box.sdk.BoxFile.Info

updateFileInfo

updateInfo

fileId, info

com.box.sdk.BoxFile

createFileMetadata

createMetadata

fileId, metadata, [typeName]

com.box.sdk.Metadata

getFileMetadata

metadata

fileId, [typeName]

com.box.sdk.Metadata

updateFileMetadata

updateMetadata

fileId, metadata

com.box.sdk.Metadata

deleteFileMetadata

deleteMetadata

fileId

 

getDownloadUrl

url

fileId

java.net.URL

getPreviewLink

预览

fileId

java.net.URL

getFileThumbnail

缩略图

fileId, fileType, minWidth, minHeight, maxWidth, maxHeight

byte[]

文件的URI 选项

名称类型

parentFolderId

字符串

content

java.io.InputStream

fileName

字符串

created

Date

modified

Date

size

Long

listener

com.box.sdk.ProgressListener

output

java.io.OutputStream

rangeStart

Long

rangeEnd

Long

outputStreams

java.io.OutputStream[]

destinationFolderId

字符串

newName

字符串

fields

String[]

info

com.box.sdk.BoxFile.Info

fileSize

Long

version

整数

access

com.box.sdk.BoxSharedLink.Access

unshareDate

Date

权限

com.box.sdk.BoxSharedLink.Permissions

fileType

com.box.sdk.BoxFile.ThumbnailFileType

minWidth

整数

minHeight

整数

maxWidth

整数

maxHeight

整数

metadata

com.box.sdk.Metadata

typeName

字符串

53.5.5. 端点前缀 文件夹

有关 Box 文件夹的更多信息,请参阅 https://developer.box.com/reference#folder-object。可以通过前缀 文件夹 调用以下端点,如下所示:

box:folders/endpoint?[options]
端点简写别名选项结果 Body 类型

getRootFolder

root

 

com.box.sdk.BoxFolder

createFolder

create

parentFolderId, folderName

com.box.sdk.BoxFolder

createFolder

create

parentFolderId, path

com.box.sdk.BoxFolder

copyFolder

复制

folderId, destinationfolderId, [newName]

com.box.sdk.BoxFolder

moveFolder

Move

folderId, destinationFolderId, newName

com.box.sdk.BoxFolder

renameFolder

重命名

folderId、newFolderName

com.box.sdk.BoxFolder

createFolderSharedLink

link

folderId、access、[unsharedDate], [permissions]

java.util.List

deleteFolder

delete

folderId

 

getFolder

folder

path

com.box.sdk.BoxFolder

getFolderInfo

info

folderId, 字段

com.box.sdk.BoxFolder.Info

getFolderItems

items

folderId, offset, limit, 字段

java.util.List

updateFolderInfo

updateInfo

folderId, info

com.box.sdk.BoxFolder

文件夹的 URI Options

名称类型

path

String[]

folderId

字符串

offset

Long

limit

Long

fields

String[]

parentFolderId

字符串

folderName

字符串

destinationFolderId

字符串

newName

字符串

newFolderName

字符串

info

字符串

access

com.box.sdk.BoxSharedLink.Access

unshareDate

Date

权限

com.box.sdk.BoxSharedLink.Permissions

53.5.6. 端点前缀 

有关 Box 组的更多信息,请参阅 https://developer.box.com/reference#group-object。以下端点可以通过前缀  调用,如下所示:

box:groups/endpoint?[options]
端点简写别名选项结果 Body 类型

createGroup

create

名称, [provenance, externalSyncIdentifier, description, invitabilityLevel, memberViewabilityLevel]

com.box.sdk.BoxGroup

addGroupMembership

createMembership

GroupId, userId, role

com.box.sdk.BoxGroupMembership

deleteGroup

delete

groupId

 

getAllGroups

groups

 

java.util.Collection

getGroupInfo

info

groupId

com.box.sdk.BoxGroup.Info

updateGroupInfo

updateInfo

groupId, groupInfo

com.box.sdk.BoxGroup

addGroupMembership

addMembership

GroupId, userId, role

com.box.sdk.BoxGroupMembership

deleteGroupMembership

deleteMembership

groupMembershipId

 

getGroupMemberships

成员资格

groupId

java.uti.Collection

getGroupMembershipInfo

membershipInfo

groupMemebershipId

com.box.sdk.BoxGroup.Info

updateGroupMembershipInfo

updateMembershipInfo

groupMemebershipId, info

com.box.sdk.BoxGroupMembership

组的 URI 选项 

名称类型

name

字符串

groupId

字符串

userId

字符串

role

com.box.sdk.BoxGroupMembership.Role

groupMembershipId

字符串

info

com.box.sdk.BoxGroupMembership.Info

53.5.7. endpoint Prefix search

有关 Box 搜索 API 的更多信息,请参阅 https://developer.box.com/reference#searching-for-content。 可以通过前缀 搜索 调用以下端点,如下所示:

box:search/endpoint?[options]
端点简写别名选项结果 Body 类型

searchFolder

search

folderId, query

java.util.Collection

用于 搜索的URI 选项

名称类型

folderId

字符串

query

字符串

53.5.8. 端点前缀 任务

有关 Box 任务的详情,请参考 https://developer.box.com/reference#task-object-1。以下端点可以通过前缀 任务 调用,如下所示:

box:tasks/endpoint?[options]
端点简写别名选项结果 Body 类型

addFileTask

add

fileId, action, dueAt, [message]

com.box.sdk.BoxUser

deleteTask

delete

taskId

 

getFileTasks

tasks

fileId

java.util.List

getTaskInfo

info

taskId

com.box.sdk.BoxTask.Info

updateTaskInfo

updateInfo

TaskID, info

com.box.sdk.BoxTask

addAssignmentToTask

addAssignment

TaskID, assignTo

com.box.sdk.BoxTask

deleteTaskAssignment

deleteAssignment

taskAssignmentId

 

getTaskAssignments

分配

taskId

java.util.List

getTaskAssignmentInfo

assignmentInfo

taskAssignmentId

com.box.sdk.BoxTaskAssignment.Info

任务的URI 选项

名称类型

fileId

字符串

action

com.box.sdk.BoxTask.Action

dueAt

Date

message

字符串

taskId

字符串

info

com.box.sdk.BoxTask.Info

assignTo

com.box.sdk.BoxUser

taskAssignmentId

字符串

53.5.9. 端点前缀 用户

有关 Box 用户的详情请参考 https://developer.box.com/reference#user-object。以下端点可使用前缀 用户 调用,如下所示:

box:users/endpoint?[options]
端点简写别名选项结果 Body 类型

getCurrentUser

currentUser

 

com.box.sdk.BoxUser

getAllEnterpriseOrExternalUsers

users

filterTerm, [fields]

com.box.sdk.BoxUser

createAppUser

create

name, [params]

com.box.sdk.BoxUser

createEnterpriseUser

create

login, name, [params]

com.box.sdk.BoxUser

deleteUser

delete

userid, notifyUser, force

 

getUserEmailAlias

emailAlias

userId

com.box.sdk.BoxUser

deleteUserEmailAlias

deleteEmailAlias

userId, emailAliasId

java.util.List

getUserInfo

info

userId

com.box.sdk.BoxUser.Info

updateUserInfo

updateInfo

userid, info

com.box.sdk.BoxUser

moveFolderToUser

-

userId, sourceUserId

com.box.sdk.BoxFolder.Info

用户的URI 选项

名称类型

defaultRequest

com.box.restclientv2.requestsbase.BoxDefaultRequestObject

emailAliasRequest

com.box.boxjavalibv2.requests.requestobjects.BoxEmailAliasRequestObject

emailId

字符串

filterTerm

字符串

folderId

字符串

simpleUserRequest

com.box.boxjavalibv2.requests.requestobjects.BoxSimpleUserRequestObject

userDeleteRequest

com.box.boxjavalibv2.requests.requestobjects.BoxUserDeleteRequestObject

userId

字符串

userRequest

com.box.boxjavalibv2.requests.requestobjects.BoxUserRequestObject

userUpdateLoginRequest

com.box.boxjavalibv2.requests.requestobjects.BoxUserUpdateLoginRequestObject

53.6. 消费者端点:

有关 Box 事件的更多信息,请参阅 https://developer.box.com/reference#events。消费者端点只能使用端点前缀 事件,如下一示例所示。

box:events/endpoint?[options]
端点简写别名选项结果 Body 类型

事件

 

[startingPosition]

com.box.sdk.BoxEvent

事件的 URI 选项 

名称类型

startingPosition

Long

53.7. 邮件标题

任何选项都可以在带有 CamelBox. 前缀的制作者端点的消息标头中提供。

53.8. 邮件正文

所有结果消息正文都使用 Box Java SDK 提供的对象。producer 端点可以在 inBody endpoint 参数中为传入消息正文指定选项名称。

53.9. 配置组件并启用身份验证

要使用 Box 进行身份验证,如下例所示在组件上设置身份验证属性:

BoxConfiguration configuration = new BoxConfiguration();
configuration.setClientId("clientId");
configuration.setClientSecret("clientSecret");
configuration.setUserName("userName");
configuration.setUserPassword("userPassword");

// add BoxComponent to Camel context
BoxComponent component = new BoxComponent(context);
component.setConfiguration(configuration);
context.addComponent("box", component);

53.10. Samples

以下路由将新文件上传到用户的根目录:

from("file:...")
    .to("box://files/upload/inBody=fileUploadRequest");

以下路由轮询用户的帐户以进行更新:

from("box://events/listen?startingPosition=-1")
    .to("bean:blah");

以下路由使用带有动态标头选项的制作者。 fileId 属性具有 Box 文件 id,output 属性具有文件内容的输出流,因此它们被分配到 CamelBox.fileId 标头和 CamelBox.output 标头,如下所示:

from("direct:foo")
    .setHeader("CamelBox.fileId", header("fileId"))
    .setHeader("CamelBox.output", header("output"))
    .to("box://files/download")
    .to("file://...");

第 54 章 Braintree 组件

作为 Camel 2.17 版提供

Braintree 组件提供对通过 Java SDK 引进 Braintree 支付 的访问。

所有客户端应用程序都需要 API 凭证来处理付款。要在您的帐户中使用 camel-braintree,您需要创建新的 Sandbox 或 Production 帐户。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-braintree</artifactId>
    <version>${camel-version}</version>
</dependency>

 

54.1. Braintree 选项

Braintree 组件支持 2 个选项,它们如下所列。

名称描述默认类型

configuration (common)

使用共享配置

 

BraintreeConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Braintree 端点使用 URI 语法配置:

braintree:apiName/methodName

使用以下路径和查询参数:

54.1.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

BraintreeApiName

methodName

用于所选操作的子操作

 

字符串

54.1.2. 查询参数(14 参数):

名称描述默认类型

environment (common)

环境 Either SANDBOX 或 PRODUCTION

 

字符串

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

merchantId (common)

Braintree 提供的 merchant id。

 

字符串

privateKey (common)

Braintree 提供的私钥。

 

字符串

publicKey (common)

Braintree 提供的公钥。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

accessToken (高级)

争取另一人授予的访问令牌,以代表其处理事务。用于替代环境、merchant id、公钥和私钥字段。

 

字符串

httpReadTimeout (advanced)

为 http 调用设置读取超时。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

httpLogLevel (logging)

为 http 调用设置日志记录级别,请参阅 java.util.logging.Level

 

字符串

proxyHost (proxy)

代理主机

 

字符串

proxyPort (proxy)

代理端口

 

整数

54.2. Spring Boot Auto-Configuration

组件支持 14 个选项,它们如下所列。

名称描述默认类型

camel.component.braintree.configuration.access-token

争取另一人授予的访问令牌,以代表其处理事务。用于替代环境、merchant id、公钥和私钥字段。

 

字符串

camel.component.braintree.configuration.api-name

要执行的操作种类

 

BraintreeApiName

camel.component.braintree.configuration.environment

环境 Either SANDBOX 或 PRODUCTION

 

字符串

camel.component.braintree.configuration.http-log-level

为 http 调用设置日志记录级别,请参阅 java.util.logging.Level

 

级别

camel.component.braintree.configuration.http-log-name

设置日志类别,以记录 http 调用,默认为 "Braintree"

 

字符串

camel.component.braintree.configuration.http-read-timeout

为 http 调用设置读取超时。

 

整数

camel.component.braintree.configuration.merchant-id

Braintree 提供的 merchant id。

 

字符串

camel.component.braintree.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.braintree.configuration.private-key

Braintree 提供的私钥。

 

字符串

camel.component.braintree.configuration.proxy-host

代理主机

 

字符串

camel.component.braintree.configuration.proxy-port

代理端口

 

整数

camel.component.braintree.configuration.public-key

Braintree 提供的公钥。

 

字符串

camel.component.braintree.enabled

启用 braintree 组件

true

布尔值

camel.component.braintree.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

54.3. URI 格式

 

braintree://endpoint-prefix/endpoint?[options]

 

端点前缀可以是以下之一:

  • addOn
  • address
  • clientToken
  • creditCardverification
  • customer
  • 折扣
  • dispute
  • documentUpload
  • merchantAccount
  • paymentmethod
  • paymentmethodNonce
  • plan
  • 报告
  • settlementBatchSummary
  • subscription
  • transaction
  • webhookNotification

 

54.4. BraintreeComponent

Braintree 组件可使用以下选项进行配置。可以使用组件的 bean 属性 配置 org.apache.camel.component.braintree.BraintreeConfiguration 来提供这些选项。

选项类型描述

环境

字符串

指定请求应定向到 - sandbox 或 production 的位置

merchantId

字符串

网关帐户的唯一标识符,与merchant 帐户 ID 不同

publicKey

字符串

用户特定的公共标识符

privateKey

字符串

用户特定的安全标识符不应共享 - 即使与我们共享!

accessToken

字符串

使用 Braintree Auth 授予令牌,以便它们能够代表处理事务。用于代替环境、merchantId、publicKey 和 privateKey 选项。

以上所有选项都由 Braintree 支付提供

54.5. 制作者端点:

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 URI MUST 包含一个前缀。

不是必需的端点选项由 [] 表示。如果端点没有强制选项,则会提供一组 [] 选项 MUST。制作者端点也可以使用特殊选项 inBody ,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelBraintree.<option> 的格式。请注意, inBody 选项会覆盖消息标头,例如, Body=option 中的 endpoint 选项会覆盖 CamelBraintree.option 标头。

有关端点和选项的更多信息,请参阅 https://developers.braintreepayments.com/reference/overview的 Braintree 参考。

 

54.5.1. 端点前缀 addOn

以下端点可以通过前缀 addOn 来调用,如下所示:

 

braintree://addOn/endpoint
端点简写别名选项结果 Body 类型

all

 

 

List<com.braintreegateway.Addon>

54.5.2. 端点前缀 地址

可以通过前缀 地址 调用以下端点,如下所示:

 

braintree://address/endpoint?[options]
端点简写别名选项结果 Body 类型

create

 

customerId, request

com.braintreegateway.Result<com.braintreegateway.Address>

delete

 

customerId, id

com.braintreegateway.Result<com.braintreegateway.Address> 

find

 

customerId, id

com.braintreegateway.Address

update

 

customerId, id, request

com.braintreegateway.Result<com.braintreegateway.Address> 

地址的 URI 选项 

名称类型

customerId

字符串

Request (请求)

com.braintreegateway.AddressRequest

id

字符串

54.5.3. 端点前缀 clientToken

以下端点可以通过前缀 clientToken 调用,如下所示:

 

braintree://clientToken/endpoint?[options]
端点简写别名选项结果 Body 类型

generate

 

 Request (请求)

字符串

clientToken的 URI 选项

名称类型

Request (请求)

com.braintreegateway.ClientTokenrequest

54.5.4. 端点前缀 creditCardVerification

以下端点可以通过前缀 creditCardverification 调用,如下所示:

 

braintree://creditCardVerification/endpoint?[options]
端点简写别名选项结果 Body 类型

find

 

 id

com.braintreegateway.CreditCardVerification

search

 

query

com.braintreegateway.ResourceCollection<com.braintreegateway.CreditCardVerification>

贡献度的 URI 选项

名称类型

id

字符串

query

com.braintreegateway.CreditCardVerificationSearchRequest

54.5.5. 端点前缀 客户

以下端点可以通过前缀 客户 调用,如下所示:

 

braintree://customer/endpoint?[options]
端点简写别名选项结果 Body 类型

all

 

 

 

create

 

Request (请求)

com.braintreegateway.Result<com.braintreegateway.Customer>

delete

 

id

com.braintreegateway.Result<com.braintreegateway.Customer>

find

 

id

com.braintreegateway.Customer

search

 

query

com.braintreegateway.ResourceCollection<com.braintreegateway.Customer>

update

 

id, request

com.braintreegateway.Result<com.braintreegateway.Customer>

客户的URI 选项

名称类型

id

字符串

Request (请求)

com.braintreegateway.CustomerRequest

query

com.braintreegateway.CustomerSearchRequest

54.5.6. 端点前缀 折扣

以下端点可以通过前缀 折扣 调用,如下所示:

 

braintree://discount/endpoint
端点简写别名选项结果 Body 类型

all

 

 

List<com.braintreegateway.Discount>

+
+

54.5.7. 端点前缀 dispute

以下端点可以通过前缀 dispute 调用  如下所示:

braintree://dispute/endpoint?[options]
端点简写别名选项结果 Body 类型

accept

 

id

com.braintreegateway.Result

addFileEvidence

 

disputeId, documentId

com.braintreegateway.Result<DisputeEvidence>

addFileEvidence

 

disputeId, fileEvidenceRequest

com.braintreegateway.Result<DisputeEvidence>

addTextEvidence

 

disputeId, content

com.braintreegateway.Result<DisputeEvidence>

addTextEvidence

 

disputeId, textEvidenceRequest

com.braintreegateway.Result<DisputeEvidence>

完成

 

id

com.braintreegateway.Result

find

 

id

com.braintreegateway.Dispute

removeEvidence

 

id

com.braintreegateway.Result

search

 

disputeSearchRequest

com.braintreegateway.PaginatedCollection<com.braintreegateway.Dispute>

用于 争议的 URI 选项

名称类型

id

字符串

disputeId

字符串

documentId

字符串

fileEvidenceRequest

com.braintreegateway.FileEvidenceRequest

content

字符串

 

textEvidenceRequest

com.braintreegateway.TextEvidenceRequest

disputeSearchRequest

54.5.8. 端点前缀 documentUpload

以下端点可使用前缀 documentUpload 调用,如下所示:

braintree://documentUpload/endpoint?[options]
端点简写别名选项结果 Body 类型

create

 

Request (请求)

com.braintreegateway.Result<com.braintreegateway.DocumentUpload>

documentUpload的 URI Options

名称类型

Request (请求)

com.braintreegateway.DocumentUploadRequest

54.5.9. 端点前缀 merchantAccount

以下端点可以通过前缀 merchantAccount 调用,如下所示:

 

braintree://merchantAccount/endpoint?[options]
端点简写别名选项结果 Body 类型

create

 

Request (请求)

com.braintreegateway.Result<com.braintreegateway.MerchantAccount>

createForCurrency

 

currencyRequest

com.braintreegateway.Result<com.braintreegateway.MerchantAccount>

find

 

id

com.braintreegateway.MerchantAccount

update

 

id, request

com.braintreegateway.Result<com.braintreegateway.MerchantAccount>

merchantAccount的 URI 选项

名称类型

id

字符串

Request (请求)

com.braintreegateway.MerchantAccountRequest

currencyRequest

com.braintreegateway.MerchantAccountCreateForCurrencyRequest

54.5.10. 端点前缀 paymentMethod

以下端点可以使用前缀 payment Method 调用 ,如下所示:

 

braintree://paymentMethod/endpoint?[options]
端点简写别名选项结果 Body 类型

create

 

Request (请求)

com.braintreegateway.Result<com.braintreegateway.PaymentMethod>

delete

 

令牌, deleteRequest

com.braintreegateway.Result<com.braintreegateway.PaymentMethod>

find

 

token

com.braintreegateway.PaymentMethod

update

 

令牌, 请求

com.braintreegateway.Result<com.braintreegateway.PaymentMethod>

支付Method的 URI 选项

名称类型

token

字符串

Request (请求)

com.braintreegateway.PaymentMethodRequest

deleteRequest

com.braintreegateway.PaymentMethodDeleteRequest

54.5.11. 端点前缀 paymentMethodNonce

以下端点可以使用前缀 paymentMethodNonce 调用,如下所示:

 

braintree://paymentMethodNonce/endpoint?[options]
端点简写别名选项结果 Body 类型

create

 

paymentMethodToken

com.braintreegateway.Result<com.braintreegateway.PaymentMethodNonce>

find

 

paymentMethodNonce

com.braintreegateway.PaymentMethodNonce

支付MethodNonce的 URI 选项

名称类型

paymentMethodToken

字符串

paymentMethodNonce

字符串

54.5.12. 端点前缀 计划

以下端点可以通过前缀 计划 调用,如下所示:

 

braintree://plan/endpoint
端点简写别名选项结果 Body 类型

all

 

 

List<com.braintreegateway.Plan>

54.5.13. 端点前缀 报告

以下端点可使用前缀 报告 调用,如下所示:

braintree://plan/report?[options]
端点简写别名选项结果 Body 类型

transactionLevelFees

 

 Request (请求)

com.braintreegateway.Result<com.braintreegateway.TransactionLevelFeeReport>

报告的 URI Options 

名称类型

Request (请求)

com.braintreegateway.TransactionLevelFeeReportRequest

54.5.14. 端点前缀 settlementBatchSummary

以下端点可以通过前缀 settlement BatchBatchBatchmary 调用,如下所示:

 

braintree://settlementBatchSummary/endpoint?[options]
端点简写别名选项结果 Body 类型

generate

 

 Request (请求)

com.braintreegateway.Result<com.braintreegateway.SettlementBatchSummary>

settlement BatchSummary 的URI 选项

名称类型

settlementDate

日历

groupByCustomField

字符串

54.5.15. 端点前缀 订阅

以下端点可以通过前缀 订阅 调用,如下所示:

 

braintree://subscription/endpoint?[options]
端点简写别名选项结果 Body 类型

取消

 

 id

 com.braintreegateway.Result<com.braintreegateway.Subscription>

create

 

Request (请求)

com.braintreegateway.Result<com.braintreegateway.Subscription>

delete

 

customerId, id

com.braintreegateway.Result<com.braintreegateway.Subscription>

find

 

id

com.braintreegateway.Subscription

retryCharge

 

subscriptionId, number

com.braintreegateway.Result<com.braintreegateway.Transaction>

search

 

searchRequest

com.braintreegateway.ResourceCollection<com.braintreegateway.Subscription>

update

 

id, request

com.braintreegateway.Result<com.braintreegateway.Subscription>

订阅的URI 选项

名称类型

id

字符串

Request (请求)

com.braintreegateway.SubscriptionRequest

customerId

字符串

subscriptionId

字符串

amount

BigDecimal

searchRequest

com.braintreegateway.SubscriptionSearchRequest.

 

54.5.16. 端点前缀 事务

以下端点可以通过前缀 事务 调用,如下所示:

 

braintree://transaction/endpoint?[options]
端点简写别名选项结果 Body 类型

cancelRelease

 

id

com.braintreegateway.Result<com.braintreegateway.Transaction>

cloneTransaction

 

id, cloneRequest

com.braintreegateway.Result<com.braintreegateway.Transaction>

贡献度

 

Request (请求)

com.braintreegateway.Result<com.braintreegateway.Transaction>

find

 

id

com.braintreegateway.Transaction

holdInEscrow

 

id

com.braintreegateway.Result<com.braintreegateway.Transaction>

releaseFromEscrow

 

id

com.braintreegateway.Result<com.braintreegateway.Transaction>

退款(ref)

 

id、amount、refRequest

com.braintreegateway.Result<com.braintreegateway.Transaction>

sale

 

Request (请求)

com.braintreegateway.Result<com.braintreegateway.Transaction>

search

 

query

com.braintreegateway.ResourceCollection<com.braintreegateway.Transaction>

submitForPartialSettlement

 

ID、数量

com.braintreegateway.Result<com.braintreegateway.Transaction>

submitForSettlement

 

ID、数量、请求

com.braintreegateway.Result<com.braintreegateway.Transaction>

voidTransaction

 

id

com.braintreegateway.Result<com.braintreegateway.Transaction>

事务的 URI 选项 

名称类型

id

字符串

Request (请求)

com.braintreegateway.TransactionCloneRequest

cloneRequest

com.braintreegateway.TransactionCloneRequest

refundRequest

com.braintreegateway.TransactionRefundRequest

amount

BigDecimal

query

com.braintreegateway.TransactionSearchRequest

54.5.17. 端点前缀 WebhookNotification

以下端点可以通过前缀 webhookNotification 来调用,如下所示:

 

braintree://webhookNotification/endpoint?[options]
端点简写别名选项结果 Body 类型

parse

 

 签名, 有效负载

com.braintreegateway.WebhookNotification

验证

 

挑战

字符串

WebhookNotification的 URI 选项

名称类型

签名

字符串

有效负载

字符串

挑战

字符串

 

54.6. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Options 和 consumer. 前缀来调度端点调用。默认情况下,返回数组或集合的 Consumer 端点将为每个元素生成一个交换,并且每个交换将执行一次其路由。要更改此行为,请使用属性 consumer.splitResults=true 为整个列表或数组返回单个交换。 

54.7. 消息标头

任何 URI 选项都可以在具有 CamelBraintree. 前缀的生产端点的消息标头中提供。

54.8. 邮件正文

所有结果消息正文都使用 Braintree Java SDK 提供的对象。producer 端点可以在 inBody endpoint 参数中为传入消息正文指定选项名称。

 

 

54.9. 例子

蓝图(Blueprint)

<?xml version="1.0"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xsi:schemaLocation="
             http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.0.0.xsd
             http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
             http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">


    <cm:property-placeholder id="placeholder" persistent-id="camel.braintree">
    </cm:property-placeholder>

    <bean id="braintree" class="org.apache.camel.component.braintree.BraintreeComponent">
        <property name="configuration">
            <bean class="org.apache.camel.component.braintree.BraintreeConfiguration">
                <property name="environment" value="${environment}"/>
                <property name="merchantId" value="${merchantId}"/>
                <property name="publicKey" value="${publicKey}"/>
                <property name="privateKey" value="${privateKey}"/>
            </bean>
        </property>
    </bean>

    <camelContext trace="true" xmlns="http://camel.apache.org/schema/blueprint" id="braintree-example-context">
        <route id="braintree-example-route">
            <from uri="direct:generateClientToken"/>
            <to uri="braintree://clientToken/generate"/>
            <to uri="stream:out"/>
        </route>
    </camelContext>

</blueprint>

54.10. 另请参阅

* 配置 Camel * 组件 * Endpoint * Getting Started

 

 

第 55 章 浏览组件

作为 Camel 版本 1.3 提供

Browse 组件提供了一个简单的 BrowsableEndpoint,可用于测试、可视化工具或调试。发送到端点的交换都可用于浏览。

55.1. URI 格式

browse:someName[?options]

其中 someName 可以是唯一标识端点的任意字符串。

55.2. 选项

Browse 组件没有选项。

Browse 端点使用 URI 语法进行配置:

browse:name

使用以下路径和查询参数:

55.2.1. 路径名(1 参数):

名称描述默认类型

name

必需 A 名称,可以是任何可唯一标识端点的字符串

 

字符串

55.2.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

55.3. 示例

在下面的路由中,我们插入一个 浏览: 组件可以浏览要通过的交换:

from("activemq:order.in").to("browse:orderReceived").to("bean:processOrder");

现在,我们可以检查 Java 代码内接收的交换:

private CamelContext context;

public void inspectRecievedOrders() {
    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
    }
}

55.4. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 56 章 EHCache 组件(已弃用)

作为 Camel 版本 2.1 提供

缓存 组件允许您将 EHCache 用作缓存实施来执行缓存操作。缓存本身是按需创建的,或者该名称的缓存已经存在,那么只需使用其原始设置即可使用它。

此组件支持基于制作者和事件的消费者端点。

缓存使用者是基于事件的消费者,可用于侦听和响应特定的缓存活动。如果您需要从预先存在的缓存执行选择,请使用为缓存组件定义的处理器。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cache</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

56.1. URI 格式

cache://cacheName[?options]

您可以以以下格式在 URI 中附加查询选项 ?option =value&option=#beanRef&…​

56.2. 选项

EHCache 组件支持 4 个选项,它们如下所列。

名称描述默认类型

cacheManagerFactory (advanced)

使用给定的 CacheManagerFactory 创建 CacheManager。默认情况下,使用 DefaultCacheManagerFactory。

 

CacheManagerFactory

configuration (common)

设置缓存配置

 

CacheConfiguration

configurationFile (common)

设置 ehcache.xml 文件的位置,以便从 classpath 或文件系统加载。默认情况下,该文件从 classpath:ehcache.xml 加载

classpath:ehcache.xml

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

EHCache 端点使用 URI 语法进行配置:

cache:cacheName

使用以下路径和查询参数:

56.2.1. 路径名(1 参数):

名称描述默认类型

cacheName

缓存 所需的 名称

 

字符串

56.2.2. 查询参数(19 参数):

名称描述默认类型

diskExpiryThreadInterval Seconds (common)

运行磁盘到期线程之间的秒数。

 

long

diskPersistent (common)

磁盘存储是否会在应用程序重启之间保留。

false

布尔值

diskStorePath (common)

弃用的 此参数将被忽略。CacheManager 使用 setter 注入来设置它。

 

字符串

eternal (common)

设定元素是否声音。如果发往,则忽略超时,且元素永远不会过期。

false

布尔值

key (common)

要使用的默认密钥。如果在消息标头中提供了密钥,则标头中的密钥优先使用。

 

字符串

maxElementsInMemory (common)

在内存中保存的元素数量。

1000

int

memoryStoreEvictionPolicy (common)

达到内存中最多元素数时要使用的驱除策略。策略会定义要删除的元素。LRU - Lest Recently Used LFU - Lest Frently Used FIFO - First In First Out

LFU

MemoryStoreEviction Policy

objectCache (common)

是否打开允许将非序列化对象存储在缓存中。如果这个选项被启用,则无法对磁盘启用溢出。

false

布尔值

operation (common)

要使用的默认缓存操作。如果消息标头中的操作,则来自标头的操作将优先使用。

 

字符串

overflowToDisk (common)

指定缓存是否为磁盘溢出

true

布尔值

timeToIdleSeconds (common)

元素到期前访问之间的最大时间

300

long

timeToLiveSeconds (common)

创建时间和何时元素之间的最长时间。仅当元素不是框架时,才会使用

300

long

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

cacheLoaderRegistry (advanced)

使用 CacheLoaderRegistry 配置缓存加载程序

 

CacheLoaderRegistry

cacheManagerFactory (advanced)

要使用自定义 CacheManagerFactory 来创建该端点要使用的 CacheManager。默认情况下,会使用组件上配置的 CacheManagerFactory。

 

CacheManagerFactory

eventListenerRegistry (advanced)

使用 CacheEventListenerRegistry 配置事件监听程序

 

CacheEventListener Registry

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

56.3. Spring Boot Auto-Configuration

组件支持 17 个选项,如下所示。

名称描述默认类型

camel.component.cache.cache-manager-factory

使用给定的 CacheManagerFactory 创建 CacheManager。默认情况下,使用 DefaultCacheManagerFactory。选项是一个 org.apache.camel.component.cache.CacheManagerFactory 类型。

 

字符串

camel.component.cache.configuration-file

设置 ehcache.xml 文件的位置,以便从 classpath 或文件系统加载。默认情况下,该文件从 classpath:ehcache.xml 加载

classpath:ehcache.xml

字符串

camel.component.cache.configuration.cache-loader-registry

使用 CacheLoaderRegistry 配置缓存加载程序

 

CacheLoaderRegistry

camel.component.cache.configuration.cache-name

缓存的名称

 

字符串

camel.component.cache.configuration.disk-expiry-thread-interval-seconds

运行磁盘到期线程之间的秒数。

 

Long

camel.component.cache.configuration.disk-persistent

磁盘存储是否会在应用程序重启之间保留。

false

布尔值

camel.component.cache.configuration.eternal

设定元素是否声音。如果发往,则忽略超时,且元素永远不会过期。

false

布尔值

camel.component.cache.configuration.event-listener-registry

使用 CacheEventListenerRegistry 配置事件监听程序

 

CacheEventListener Registry

camel.component.cache.configuration.max-elements-in-memory

在内存中保存的元素数量。

1000

整数

camel.component.cache.configuration.memory-store-eviction-policy

达到内存中最多元素数时要使用的驱除策略。策略会定义要删除的元素。LRU - Lest Recently Used LFU - Lest Frently Used FIFO - First In First Out

 

MemoryStoreEviction Policy

camel.component.cache.configuration.object-cache

是否打开允许将非序列化对象存储在缓存中。如果这个选项被启用,则无法对磁盘启用溢出。

false

布尔值

camel.component.cache.configuration.overflow-to-disk

指定缓存是否为磁盘溢出

true

布尔值

camel.component.cache.configuration.time-to-idle-seconds

元素到期前访问之间的最大时间

300

Long

camel.component.cache.configuration.time-to-live-seconds

创建时间和何时元素之间的最长时间。仅当元素不是框架时,才会使用

300

Long

camel.component.cache.enabled

启用缓存组件

true

布尔值

camel.component.cache.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.cache.configuration.disk-store-path

此参数将被忽略。CacheManager 使用 setter 注入来设置它。

 

字符串

56.4. 从缓存发送/查看消息

56.4.1. Message Headers 最多为 Camel 2.7

标头描述

CACHE_OPERATION

要在缓存上执行的操作。有效选项包括

* GET * CHECK * ADD * UPDATE * DELETE * DELETEALL
GETCHECK 需要 Camel 2.3 开始。

CACHE_KEY

用于将消息存储在缓存中的缓存密钥。如果 CACHE_OPERATION 是 DELETEALL,则缓存键是可选的

56.4.2. 消息标头 Camel 2.8+

Camel 2.8 中的标头更改

标头名称和支持的值已更改为带有 'CamelCache' 的前缀,并使用混合的大小写。这样可以更轻松地识别和保持与其他标头分开。CacheConstants 变量名称保持不变,只有它们的值已更改。另外,这些标头现在在执行缓存操作后从交换中删除。

标头描述

CamelCacheOperation

要在缓存上执行的操作。有效选项有

* CamelCacheGet * CamelCacheCheck * CamelCacheAdd * CamelCacheUpdate * CamelCacheDelete * CamelCacheDeleteAll

CamelCacheKey

用于将消息存储在缓存中的缓存密钥。如果 CamelCacheOperation 为 CamelCacheDeleteAll,则缓存键是可选的

CamelCacheAddCamelCacheUpdate 操作支持额外的标头:

标头类型描述

CamelCacheTimeToLive

整数

Camel 2.11: 生存时间(以秒为单位)。

CamelCacheTimeToIdle

整数

Camel 2.11: 空闲时间(以秒为单位)。

CamelCacheEternal

布尔值

Camel 2.11: 内容是否合理。

56.4.3. cache Producer

将数据发送到缓存时,需要能够直接将交换的有效负载存储在预先存在的或创建on-按需缓存中。这样做的好处包括

  • 设置上述显示的消息交换标头。
  • 确保 Message Exchange Body 包含定向到缓存的消息

56.4.4. 缓存消费者

从缓存接收数据涉及使用事件 Listener 侦听预先存在的或创建按需缓存的功能,并在任何缓存活动发生时接收自动通知(例如 CamelCacheGet/CamelCacheUpdate/CamelCacheDelete/CamelCacheDelete/CamelCacheDelete/CamelCacheDelete/CamelCacheDeleteAll)。在这样的活动中

  • 包含消息交换标头和消息交换正文(包含刚刚添加/更新有效负载)的交换会被放入并发送。
  • 如果是 CamelCacheDeleteAll 操作,则不会填充消息交换标头 CamelCacheKey 和 Message Exchange Body。

56.4.5. 缓存处理器

有一组 nice 处理器,能够执行缓存查找并有选择地替换有效负载内容。

  • 正文(body)
  • token
  • XPath 级别

56.5. 缓存使用示例

56.5.1. 示例 1:配置缓存

from("cache://MyApplicationCache" +
          "?maxElementsInMemory=1000" +
          "&memoryStoreEvictionPolicy=" +
              "MemoryStoreEvictionPolicy.LFU" +
          "&overflowToDisk=true" +
          "&eternal=true" +
          "&timeToLiveSeconds=300" +
          "&timeToIdleSeconds=true" +
          "&diskPersistent=true" +
          "&diskExpiryThreadIntervalSeconds=300")

56.5.2. 示例 2:向缓存添加密钥

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("direct:start")
     .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD))
     .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
     .to("cache://TestCache1")
   }
};

56.5.3. 示例 2:更新缓存中的现有密钥

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("direct:start")
     .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_UPDATE))
     .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
     .to("cache://TestCache1")
   }
};

56.5.4. 示例 3:删除缓存中的现有密钥

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("direct:start")
     .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_DELETE))
     .setHeader(CacheConstants.CACHE_KEY", constant("Ralph_Waldo_Emerson"))
     .to("cache://TestCache1")
   }
};

56.5.5. 示例 4:删除缓存中的所有现有密钥

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("direct:start")
     .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_DELETEALL))
     .to("cache://TestCache1");
    }
};

56.5.6. 示例 5:请注意在缓存中注册了处理器和其他 Producers 的任何更改

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("cache://TestCache1")
     .process(new Processor() {
        public void process(Exchange exchange)
               throws Exception {
           String operation = (String) exchange.getIn().getHeader(CacheConstants.CACHE_OPERATION);
           String key = (String) exchange.getIn().getHeader(CacheConstants.CACHE_KEY);
           Object body = exchange.getIn().getBody();
           // Do something
        }
     })
   }
};

56.5.7. 示例 6:使用 Processors 有选择地将有效负载替换为缓存值

RouteBuilder builder = new RouteBuilder() {
   public void configure() {
     //Message Body Replacer
     from("cache://TestCache1")
     .filter(header(CacheConstants.CACHE_KEY).isEqualTo("greeting"))
     .process(new CacheBasedMessageBodyReplacer("cache://TestCache1","farewell"))
     .to("direct:next");

    //Message Token replacer
    from("cache://TestCache1")
    .filter(header(CacheConstants.CACHE_KEY).isEqualTo("quote"))
    .process(new CacheBasedTokenReplacer("cache://TestCache1","novel","#novel#"))
    .process(new CacheBasedTokenReplacer("cache://TestCache1","author","#author#"))
    .process(new CacheBasedTokenReplacer("cache://TestCache1","number","#number#"))
    .to("direct:next");

    //Message XPath replacer
    from("cache://TestCache1").
    .filter(header(CacheConstants.CACHE_KEY).isEqualTo("XML_FRAGMENT"))
    .process(new CacheBasedXPathReplacer("cache://TestCache1","book1","/books/book1"))
    .process (new CacheBasedXPathReplacer("cache://TestCache1","book2","/books/book2"))
    .to("direct:next");
   }
};

56.5.8. 示例 7:从缓存中获取条目

from("direct:start")
    // Prepare headers
    .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_GET))
    .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")).
    .to("cache://TestCache1").
    // Check if entry was not found
    .choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNull()).
        // If not found, get the payload and put it to cache
        .to("cxf:bean:someHeavyweightOperation").
        .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD))
        .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
        .to("cache://TestCache1")
    .end()
    .to("direct:nextPhase");

56.5.9. 示例 8:检查缓存中的条目

注意:CHECK 命令会测试缓存中存在条目,但不会在正文中放置消息。

from("direct:start")
    // Prepare headers
    .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_CHECK))
    .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")).
    .to("cache://TestCache1").
    // Check if entry was not found
    .choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNull()).
        // If not found, get the payload and put it to cache
        .to("cxf:bean:someHeavyweightOperation").
        .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD))
        .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
        .to("cache://TestCache1")
    .end();

56.6. 管理 EHCache

EHCache 拥有自己的来自 JMX 的统计数据和管理。

以下是如何在 Spring 应用程序上下文中通过 JMX 来公开它们的片段:

<bean id="ehCacheManagementService" class="net.sf.ehcache.management.ManagementService" init-method="init" lazy-init="false">
  <constructor-arg>
    <bean class="net.sf.ehcache.CacheManager" factory-method="getInstance"/>
  </constructor-arg>
  <constructor-arg>
    <bean class="org.springframework.jmx.support.JmxUtils" factory-method="locateMBeanServer"/>
  </constructor-arg>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
</bean>

当然,您可以在直接 Java 中进行相同的操作:

ManagementService.registerMBeans(CacheManager.getInstance(), mbeanServer, true, true, true, true);

您可以通过这种方式获得缓存命中、未命中的缓存命中率、磁盘点击、磁盘点数、大小统计。您还可以实时更改 CacheConfiguration 参数。

56.7. 缓存复制 Camel 2.8

Camel 缓存组件可以使用多种不同的复制机制在服务器节点之间分发缓存,包括:RMI、JGroups、JMS 和缓存服务器。

使其工作有两种不同的方法:

1.您可以手动配置 ehcache.xml

或者

2.您可以配置以下三个选项:

  • cacheManagerFactory
  • eventListenerRegistry
  • cacheLoaderRegistry

使用第一个选项配置 Camel 缓存复制是一些硬工作,因为您必须单独配置所有缓存。因此,当所有缓存名称未知时,使用 ehcache.xml 不是一个好主意。

当希望使用多个不同的缓存时,第二个选项会更好,因为您不需要为每个缓存定义选项。这是因为,每个 CacheManager 和每个 CacheEndpoint 设置复制选项。另外,这也是在开发阶段不能知道缓存名称的唯一方法。

注意 :阅读 EHCache 手动 以更好地了解 Camel 缓存复制机制可能会很有用。

56.7.1. 示例: JMS 缓存复制

JMS 复制是最强大且安全的复制方法。与 Camel 缓存复制一同使用使得它变得更加简单。一个示例 位于单独的页面 中。

第 57 章 Caffeine Cache 组件

可作为 Camel 版本 2.20 可用

caffeine-cache 组件可让您使用 Caffeine 的简单缓存来执行缓存操作。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-caffeine</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

57.1. URI 格式

caffeine-cache://cacheName[?options]

您可以以以下格式在 URI 中附加查询选项 ?option  =value&option=#beanRef&…​

57.2. 选项

Caffeine Cache 组件支持 2 选项,它们如下所列。

名称描述默认类型

配置 (高级)

设置全局组件配置

 

CaffeineConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Caffeine Cache 端点使用 URI 语法配置:

caffeine-cache:cacheName

使用以下路径和查询参数:

57.2.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

57.2.2. 查询参数(19 参数):

名称描述默认类型

createCacheIfNotExist (common)

配置如果缓存存在或者未预先配置,则需要创建缓存。

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

action (producer)

配置默认缓存操作。如果在消息标头中设置了操作,则来自标头的操作将优先使用。

 

字符串

cache (producer)

配置一个已经使用实例化的缓存

 

Cache

cacheLoader (producer)

在 LoadCache 使用时配置 CacheLoader

 

CacheLoader

evictionType (producer)

为此缓存设置驱除类型

SIZE_BASED

EvictionType

expireAfterAccessTime (producer)

在基于时间的驱除(以秒为单位)时,设置访问时间过期(以秒为单位)

300

int

expireAfterWriteTime (producer)

在基于时间的驱除(以秒为单位)设置访问后写入过期(以秒为单位)

300

int

initialCapacity (producer)

为缓存设置初始容量

10000

int

key (producer)

配置默认操作密钥。如果在消息标头中设置了密钥,则标头中的密钥优先使用。

 

对象

maximumSize (producer)

为缓存设置最大大小

10000

int

removalListener (producer)

为缓存设置特定的删除 Listener

 

RemovalListener

statsCounter (producer)

为缓存统计设置特定的 Stats Counter

 

StatsCounter

statsEnabled (producer)

在缓存中启用 stats

false

布尔值

keyType (advanced)

缓存密钥类型,默认为 java.lang.Object

java.lang.Object

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

valueType (advanced)

缓存值类型,默认为 java.lang.Object

java.lang.Object

字符串

57.3. Spring Boot Auto-Configuration

组件支持 17 个选项,如下所示。

名称描述默认类型

camel.component.caffeine-cache.configuration.action

配置默认缓存操作。如果在消息标头中设置了操作,则来自标头的操作将优先使用。

 

字符串

camel.component.caffeine-cache.configuration.cache

配置一个已经使用实例化的缓存

 

Cache

camel.component.caffeine-cache.configuration.cache-loader

在 LoadCache 使用时配置 CacheLoader

 

CacheLoader

camel.component.caffeine-cache.configuration.create-cache-if-not-exist

配置如果缓存存在或者未预先配置,则需要创建缓存。

true

布尔值

camel.component.caffeine-cache.configuration.eviction-type

为此缓存设置驱除类型

 

EvictionType

camel.component.caffeine-cache.configuration.expire-after-access-time

在基于时间的驱除(以秒为单位)时,设置访问时间过期(以秒为单位)

300

整数

camel.component.caffeine-cache.configuration.expire-after-write-time

在基于时间的驱除(以秒为单位)设置访问后写入过期(以秒为单位)

300

整数

camel.component.caffeine-cache.configuration.initial-capacity

为缓存设置初始容量

10000

整数

camel.component.caffeine-cache.configuration.key

配置默认操作密钥。如果在消息标头中设置了密钥,则标头中的密钥优先使用。

 

对象

camel.component.caffeine-cache.configuration.key-type

缓存密钥类型,默认为 java.lang.Object

java.lang.Object

字符串

camel.component.caffeine-cache.configuration.maximum-size

为缓存设置最大大小

10000

整数

camel.component.caffeine-cache.configuration.removal-listener

为缓存设置特定的删除 Listener

 

RemovalListener

camel.component.caffeine-cache.configuration.stats-counter

为缓存统计设置特定的 Stats Counter

 

StatsCounter

camel.component.caffeine-cache.configuration.stats-enabled

在缓存中启用 stats

false

布尔值

camel.component.caffeine-cache.configuration.value-type

缓存值类型,默认为 java.lang.Object

java.lang.Object

字符串

camel.component.caffeine-cache.enabled

是否启用 caffeine-cache 组件的自动配置。默认启用。

 

布尔值

camel.component.caffeine-cache.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

57.4. 例子

您可以在以下代码中使用缓存:

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() {
                from("direct://start")
                    .toF("caffeine-cache://%s?cache=#cache&action=PUT&key=1", "test")
                    .toF("caffeine-cache://%s?cache=#cache&key=1&action=GET", "test")
                    .log("Test! ${body}")
                    .to("mock:result");
            }
        };
    }

这样,您将始终在 registry 中的同一缓存中工作。

57.5. 检查操作结果

每次您在缓存中使用操作时,您将有两个不同的标头检查状态:

CaffeineConstants.ACTION_HAS_RESULT
CaffeineConstants.ACTION_SUCCEEDED

第 58 章 Caffeine LoadCache Component

可作为 Camel 版本 2.20 可用

caffeine-loadcache 组件允许您使用 Caffeine 中的 Load cache 执行缓存操作。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-caffeine</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

58.1. URI 格式

caffeine-loadcache://cacheName[?options]

您可以以以下格式在 URI 中附加查询选项 ?option  =value&option=#beanRef&…​

58.2. 选项

Caffeine LoadCache 组件支持 2 选项,它们如下所列。

名称描述默认类型

配置 (高级)

设置全局组件配置

 

CaffeineConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Caffeine LoadCache 端点使用 URI 语法配置:

caffeine-loadcache:cacheName

使用以下路径和查询参数:

58.2.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

58.2.2. 查询参数(19 参数):

名称描述默认类型

createCacheIfNotExist (common)

配置如果缓存存在或者未预先配置,则需要创建缓存。

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

action (producer)

配置默认缓存操作。如果在消息标头中设置了操作,则来自标头的操作将优先使用。

 

字符串

cache (producer)

配置一个已经使用实例化的缓存

 

Cache

cacheLoader (producer)

在 LoadCache 使用时配置 CacheLoader

 

CacheLoader

evictionType (producer)

为此缓存设置驱除类型

SIZE_BASED

EvictionType

expireAfterAccessTime (producer)

在基于时间的驱除(以秒为单位)时,设置访问时间过期(以秒为单位)

300

int

expireAfterWriteTime (producer)

在基于时间的驱除(以秒为单位)设置访问后写入过期(以秒为单位)

300

int

initialCapacity (producer)

为缓存设置初始容量

10000

int

key (producer)

配置默认操作密钥。如果在消息标头中设置了密钥,则标头中的密钥优先使用。

 

对象

maximumSize (producer)

为缓存设置最大大小

10000

int

removalListener (producer)

为缓存设置特定的删除 Listener

 

RemovalListener

statsCounter (producer)

为缓存统计设置特定的 Stats Counter

 

StatsCounter

statsEnabled (producer)

在缓存中启用 stats

false

布尔值

keyType (advanced)

缓存密钥类型,默认为 java.lang.Object

java.lang.Object

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

valueType (advanced)

缓存值类型,默认为 java.lang.Object

java.lang.Object

字符串

58.3. Spring Boot Auto-Configuration

组件支持 17 个选项,如下所示。

名称描述默认类型

camel.component.caffeine-loadcache.configuration.action

配置默认缓存操作。如果在消息标头中设置了操作,则来自标头的操作将优先使用。

 

字符串

camel.component.caffeine-loadcache.configuration.cache

配置一个已经使用实例化的缓存

 

Cache

camel.component.caffeine-loadcache.configuration.cache-loader

在 LoadCache 使用时配置 CacheLoader

 

CacheLoader

camel.component.caffeine-loadcache.configuration.create-cache-if-not-exist

配置如果缓存存在或者未预先配置,则需要创建缓存。

true

布尔值

camel.component.caffeine-loadcache.configuration.eviction-type

为此缓存设置驱除类型

 

EvictionType

camel.component.caffeine-loadcache.configuration.expire-after-access-time

在基于时间的驱除(以秒为单位)时,设置访问时间过期(以秒为单位)

300

整数

camel.component.caffeine-loadcache.configuration.expire-after-write-time

在基于时间的驱除(以秒为单位)设置访问后写入过期(以秒为单位)

300

整数

camel.component.caffeine-loadcache.configuration.initial-capacity

为缓存设置初始容量

10000

整数

camel.component.caffeine-loadcache.configuration.key

配置默认操作密钥。如果在消息标头中设置了密钥,则标头中的密钥优先使用。

 

对象

camel.component.caffeine-loadcache.configuration.key-type

缓存密钥类型,默认为 java.lang.Object

java.lang.Object

字符串

camel.component.caffeine-loadcache.configuration.maximum-size

为缓存设置最大大小

10000

整数

camel.component.caffeine-loadcache.configuration.removal-listener

为缓存设置特定的删除 Listener

 

RemovalListener

camel.component.caffeine-loadcache.configuration.stats-counter

为缓存统计设置特定的 Stats Counter

 

StatsCounter

camel.component.caffeine-loadcache.configuration.stats-enabled

在缓存中启用 stats

false

布尔值

camel.component.caffeine-loadcache.configuration.value-type

缓存值类型,默认为 java.lang.Object

java.lang.Object

字符串

camel.component.caffeine-loadcache.enabled

是否启用 caffeine-loadcache 组件自动配置。默认启用。

 

布尔值

camel.component.caffeine-loadcache.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 59 章 Castor DataFormat (已弃用)

作为 Camel 版本 2.1 提供

Castor 是一个数据格式,它使用 Cast or XML 库 将 XML 有效负载分到 Java 对象或将 Java 对象编入 XML 有效负载中。

通常使用 Java DSL 或 Spring XML 来操作 Castor 数据格式。

59.1. 使用 Java DSL

from("direct:order").
  marshal().castor().
  to("activemq:queue:order");

例如,以下的命名 DataFormat of Castor 使用默认的 Castor 数据绑定功能。

CastorDataFormat castor = new CastorDataFormat ();

from("activemq:My.Queue").
  unmarshal(castor).
  to("mqseries:Another.Queue");

如果要使用指定引用数据格式,该格式可以在 registry 中定义,比如通过 Spring XML 文件。例如:

from("activemq:My.Queue").
  unmarshal("mycastorType").
  to("mqseries:Another.Queue");

如果要覆盖默认映射模式,可以按照如下所示设置它:

CastorDataFormat castor = new CastorDataFormat ();
castor.setMappingFile("mapping.xml");

另外,如果您要对 Castor Marshaller 和 Unmarshaller 进行更多控制,您可以如下所示访问它们。

castor.getMarshaller();
castor.getUnmarshaller();

59.2. 使用 Spring XML

以下示例演示了如何使用 Castor 使用 Spring 配置 castor 数据类型

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <unmarshal>
      <castor validation="true" />
    </unmarshal>
    <to uri="mock:result"/>
  </route>
</camelContext>

本例演示了如何只配置数据类型一次,并在多个路由中重复使用它。您必须直接在 <camelContext> 中设置 <castor> 元素。

<camelContext>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <dataFormats>
    <castor id="myCastor"/>
  </dataFormats>

  <route>
    <from uri="direct:start"/>
    <marshal ref="myCastor"/>
    <to uri="direct:marshalled"/>
  </route>
  <route>
    <from uri="direct:marshalled"/>
    <unmarshal ref="myCastor"/>
    <to uri="mock:result"/>
  </route>

</camelContext>

59.3. 选项

Castor 数据格式支持 9 个选项,它们如下。

名称默认Java 类型描述

mappingFile

 

字符串

从 classpath 中加载的 Castor 映射文件的路径。

whitelistEnabled

true

布尔值

定义是否启用 Whitelist 功能

allowedUnmarshallObjects

 

字符串

定义允许的对象进行取消marshalled。您可以指定允许对象的 FQN 类名称,您可以使用逗号分隔多个条目。也可以使用通配符和正则表达式,该表达式基于链接 org.apache.camel.util.EndpointHelper#matchPattern (String, String)定义的模式。拒绝的对象优先于允许的对象。

deniedUnmarshallObjects

 

字符串

定义要取消摘要的拒绝对象。您可以指定取消对象的 FQN 类名称,您可以使用逗号来分隔多个条目。也可以使用通配符和正则表达式,该表达式基于链接 org.apache.camel.util.EndpointHelper#matchPattern (String, String)定义的模式。拒绝的对象优先于允许的对象。

验证

true

布尔值

是否打开或关闭验证。默认为 true。

encoding

UTF-8

字符串

在将对象聚合到 XML 时使用的编码。默认为 UTF-8

软件包

 

string[]

在 Castor XmlContext 中添加额外的软件包

 

string[]

在 Castor XmlContext 中添加额外的类名称

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

59.4. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.dataformat.castor.allowed-unmarshall-objects

定义允许的对象进行取消marshalled。您可以指定允许对象的 FQN 类名称,您可以使用逗号分隔多个条目。也可以使用通配符和正则表达式,该表达式基于链接 org.apache.camel.util.EndpointHelper#matchPattern (String, String)定义的模式。拒绝的对象优先于允许的对象。

 

字符串

camel.dataformat.castor.classes

在 Castor XmlContext 中添加额外的类名称

 

String[]

camel.dataformat.castor.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.castor.denied-unmarshall-objects

定义要取消摘要的拒绝对象。您可以指定取消对象的 FQN 类名称,您可以使用逗号来分隔多个条目。也可以使用通配符和正则表达式,该表达式基于链接 org.apache.camel.util.EndpointHelper#matchPattern (String, String)定义的模式。拒绝的对象优先于允许的对象。

 

字符串

camel.dataformat.castor.enabled

启用 castor 数据格式

true

布尔值

camel.dataformat.castor.encoding

在将对象聚合到 XML 时使用的编码。默认为 UTF-8

UTF-8

字符串

camel.dataformat.castor.mapping-file

从 classpath 中加载的 Castor 映射文件的路径。

 

字符串

camel.dataformat.castor.packages

在 Castor XmlContext 中添加额外的软件包

 

String[]

camel.dataformat.castor.validation

是否打开或关闭验证。默认为 true。

true

布尔值

camel.dataformat.castor.whitelist-enabled

定义是否启用 Whitelist 功能

true

布尔值

ND

59.5. 依赖项

要在 camel 路由中使用 Castor,您需要添加实现此数据格式的依赖 camel-castor

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-castor</artifactId>
  <version>x.x.x</version>
</dependency>

第 60 章 Camel CDI

Camel CDI 组件使用 CDI 作为根据 约定配置进行依赖项注入框架,为 Apache Camel 提供自动配置。它自动检测应用程序中可用的 Camel 路由,并为通用 Camel 原语(如 Endpoint、 FluentProducerTemplateProducerTemplate 或 TypeConverter )提供 Bean。它实施标准 Camel Bean 集成,以便 Camel 注释(如 @Consume、 @Produce 和 @PropertyInject )可以在 CDI Bean 中无缝使用。此外,它还将 Camel 事件桥接(如 RouteAddedEventCamelContextStartedEventExchangeCompletedEvent, …​)作为 CDI 事件,并提供一个 CDI 事件端点,可用于消耗 / 到 Camel 路由的 / 生成 CDI 事件。

尽管 Camel CDI 组件作为 Camel 2.10 提供,但在 Camel 2.17 中被重写,以更好地适应 CDI 编程模型。因此,有些功能(如 Camel 事件)到 CDI 事件网桥,并且 CDI 事件端点仅应用启动 Camel 2.17。

Camel CDI 测试中提供了有关如何测试 Camel CDI 应用程序的更多详细信息。

小心

Camel-cdi 在 OSGi 中已弃用,不受支持。如果使用 Camel 与 OSGi,请使用 OSGi 蓝图。

60.1. 自动配置的 Camel 上下文

Camel CDI 自动部署和配置 CamelContext bean。当 CDI 容器初始化(关机)时,CamelContext bean 会自动实例化、配置和启动(重新创建)。它可在应用程序中注入,例如:

@Inject
CamelContext context;

默认的 CamelContext bean 通过内置的 @Default qualifier 进行授权,范围为 @ApplicationScoped,是 DefaultCamelContext 类型。

请注意,这个 bean 也可以以编程方式自定义,其他 Camel 上下文 Bean 也可以部署到应用程序中。

60.2. 自动探测 Camel 路由

Camel CDI 会自动收集应用程序中的所有 RoutesBuilder Bean,实例化并在 CDI 容器初始化时将它们添加到 CamelContext bean 实例中。例如,添加 Camel 路由就像声明类一样简单,例如:

class MyRouteBean extends RouteBuilder {
 
    @Override
    public void configure() {
        from("jms:invoices").to("file:/invoices");
    }
}

请注意,您可以声明尽可能多的 RoutesBuilder Bean。另外,当容器初始化时,还会自动收集 RouteContainer beans、实例化并添加到 CamelContext bean 实例。

可作为 Camel 2.19 提供

在某些情况下,可能需要禁用 RouteBuilderRouteContainer Bean 的自动配置。这可以通过观察 CdiCamelConfiguration 事件来实现,例如:

static void configuration(@Observes CdiCamelConfiguration configuration) {
    configuration.autoConfigureRoutes(false);
}

同样,可以取消激活配置的 CamelContext Bean 自动开始,例如:

static void configuration(@Observes CdiCamelConfiguration configuration) {
    configuration.autoStartContexts(false);
}

60.3. 自动配置的 Camel 原语

Camel CDI 为常见 Camel 原语提供 Bean,可在任何 CDI Bean 中注入,例如:

@Inject
@Uri("direct:inbound")
ProducerTemplate producerTemplate;

@Inject
@Uri("direct:inbound")
FluentProducerTemplate fluentProducerTemplate;

@Inject
MockEndpoint outbound; // URI defaults to the member name, i.e. mock:outbound

@Inject
@Uri("direct:inbound")
Endpoint endpoint;

@Inject
TypeConverter converter;

60.4. Camel 上下文配置

如果您只想更改默认 CamelContext bean 的名称,您可以使用 Camel CDI 提供的 @ContextName 限定符,例如:

@ContextName("camel-context")
class MyRouteBean extends RouteBuilder {
 
    @Override
    public void configure() {
        from("jms:invoices").to("file:/invoices");
    }
}

如果需要更多自定义,可以使用任何 CamelContext 类声明自定义 Camel 上下文 bean。然后,可以使用 @PostConstruct 和 @PreDestroy 生命周期回调来进行自定义,例如:

@ApplicationScoped
class CustomCamelContext extends DefaultCamelContext {

    @PostConstruct
    void customize() {
        // Set the Camel context name
        setName("custom");
        // Disable JMX
        disableJMX();
    }

    @PreDestroy
    void cleanUp() {
        // ...
    }
}

生产者 和配方方法还可用来自定义 Camel 上下文 bean,例如: http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#disposer_method

class CamelContextFactory {

    @Produces
    @ApplicationScoped
    CamelContext customize() {
        DefaultCamelContext context = new DefaultCamelContext();
        context.setName("custom");
        return context;
    }

    void cleanUp(@Disposes CamelContext context) {
        // ...
    }
}

同样,可使用 制作者字段 ,例如:

@Produces
@ApplicationScoped
CamelContext context = new CustomCamelContext();

class CustomCamelContext extends DefaultCamelContext {

    CustomCamelContext() {
        setName("custom");
    }
}

这个模式可用于避免在容器初始化时自动启动 Camel 上下文路由,方法是调用 setAutoStartup 方法,例如:

@ApplicationScoped
class ManualStartupCamelContext extends DefaultCamelContext {

    @PostConstruct
    void manual() {
        setAutoStartup(false);
    }
}

60.5. 多个 Camel 上下文

如上所述,可以在应用程序中声明任意数量的 CamelContext Bean。在这种情况下,CDI 限定符在 CamelContext beans上声明,用于将 Camel 路由和其他 Camel 原语绑定到对应的 Camel 上下文。从示例中,如果声明了以下 Bean:

@ApplicationScoped
@ContextName("foo")
class FooCamelContext extends DefaultCamelContext {
}

@ApplicationScoped
@BarContextQualifier
class BarCamelContext extends DefaultCamelContext {
}
 
@ContextName("foo")
class RouteAddedToFooCamelContext extends RouteBuilder {

    @Override
    public void configure() {
        // ...
    }
}
 
@BarContextQualifier
class RouteAddedToBarCamelContext extends RouteBuilder {

    @Override
    public void configure() {
        // ...
    }
}
 
@ContextName("baz")
class RouteAddedToBazCamelContext extends RouteBuilder {

    @Override
    public void configure() {
        // ...
    }
}
 
@MyOtherQualifier
class RouteNotAddedToAnyCamelContext extends RouteBuilder {

    @Override
    public void configure() {
        // ...
    }
}

通过 @ContextName 限定的 RoutesBuilder Bean 会自动添加到 CamelContext beans (Camel CDI)中。如果没有这样的 CamelContext bean,它会被自动创建,如 RouteAddedToBazCamelContext bean。请注意,这仅适用于 Camel CDI 提供的 @ContextName 限定符。因此, RouteNotAddedToAnyCamelContext 与用户定义的 @MyOtherQualifier 限定符不会添加到任何 Camel 上下文。这可能会很有用,例如,对于稍后在应用程序执行期间可能需要添加的 Camel 路由。

注意

自 Camel 版本 2.17.0 起,Camel CDI 能够管理任何类型的 CamelContext Bean (例如 DefaultCamelContext)。在以前的版本中,它只能够管理类型为 CdiCamelContext 的 Bean,因此需要扩展它。

CamelContext Bean 上声明的 CDI 限定符也用于绑定相应的 Camel 原语,例如:

@Inject
@ContextName("foo")
@Uri("direct:inbound")
ProducerTemplate producerTemplate;

@Inject
@ContextName("foo")
@Uri("direct:inbound")
FluentProducerTemplate fluentProducerTemplate;

@Inject
@BarContextQualifier
MockEndpoint outbound; // URI defaults to the member name, i.e. mock:outbound

@Inject
@ContextName("baz")
@Uri("direct:inbound")
Endpoint endpoint;

60.6. 配置属性

要配置 Camel 用来解析属性占位符的配置属性,您可以声明一个 PropertiesComponent bean qualified with @Named ("prties"),例如:

@Produces
@ApplicationScoped
@Named("properties")
PropertiesComponent propertiesComponent() {
    Properties properties = new Properties();
    properties.put("property", "value");
    PropertiesComponent component = new PropertiesComponent();
    component.setInitialProperties(properties);
    component.setLocation("classpath:placeholder.properties");
    return component;
}

如果要使用 DeltaSpike 配置机制 ,您可以声明以下 PropertiesComponent bean:

@Produces
@ApplicationScoped
@Named("properties")
PropertiesComponent properties(PropertiesParser parser) {
    PropertiesComponent component = new PropertiesComponent();
    component.setPropertiesParser(parser);
    return component;
}

// PropertiesParser bean that uses DeltaSpike to resolve properties
static class DeltaSpikeParser extends DefaultPropertiesParser {
    @Override
    public String parseProperty(String key, String value, Properties properties) {
        return ConfigResolver.getPropertyValue(key);
    }
}

有关使用 DeltaSpike 配置机制,您可以看到 camel-example-cdi-properties 示例。

60.7. 自动配置的类型转换器

使用 @Converter 注释标注的 CDI Bean 会自动注册到部署的 Camel 上下文中,例如:

@Converter
public class MyTypeConverter {

    @Converter
    public Output convert(Input input) {
        //...
    }
}

请注意,CDI 注入在类型转换器中被支持。

60.8. Camel Bean 集成

60.8.1. Camel 注解

作为 Camel Bean 集成 的一部分,Camel 附带了一组可无缝支持 的注解 。因此,您可以在 CDI Bean 中使用其中任意注解,例如:

 Camel 注解CDI 等效功能

配置属性

@PropertyInject("key")
String value;

如果使用 DeltaSpike 配置机制

@Inject
@ConfigProperty(name = "key")
String value;

如需了解更多详细信息,请参阅 配置属性。

制作者模板注入(默认 Camel 上下文)

@Produce(uri = "mock:outbound")
ProducerTemplate producer;

@Produce(uri = "mock:outbound")
FluentProducerTemplate producer;
@Inject
@Uri("direct:outbound")
ProducerTemplate producer;

@Produce(uri = "direct:outbound")
FluentProducerTemplate producer;

端点注入(默认 Camel 上下文)

@EndpointInject(uri = "direct:inbound")
Endpoint endpoint;
@Inject
@Uri("direct:inbound")
Endpoint endpoint;

端点注入(按名称的Camel 上下文)

@EndpointInject(uri = "direct:inbound",
                context = "foo")
Endpoint contextEndpoint;
@Inject
@ContextName("foo")
@Uri("direct:inbound")
Endpoint contextEndpoint;

Bean 注入(按类型)

@BeanInject
MyBean bean;
@Inject
MyBean bean;

Bean (按名称)

@BeanInject("foo")
MyBean bean;
@Inject
@Named("foo")
MyBean bean;

使用 POJO

@Consume(uri = "seda:inbound")
void consume(@Body String body) {
    //...
}

 

60.8.2. bean 组件

您可以使用 Java Camel DSL 来指代 CDI Bean (根据类型或名称),例如:

class MyBean {
    //...
}

from("direct:inbound").bean(MyBean.class);

或者根据 Java DSL 名称查找 CDI Bean:

@Named("foo")
class MyNamedBean {
    //...
}

from("direct:inbound").bean("foo");

60.8.3. 从端点 URI 引用 Bean

使用 URI 语法配置端点时,您可以使用 # 表示法引用 registry 中的 Bean。 如果 URI 参数值以 # 符号开头,则 Camel CDI 将按名称查找给定类型的 bean,例如:

from("jms:queue:{{destination}}?transacted=true&transactionManager=#jtaTransactionManager").to("...");

使用以下 CDI 符合 @Named ("jtaTransactionManager"):

@Produces
@Named("jtaTransactionManager")
PlatformTransactionManager createTransactionManager(TransactionManager transactionManager, UserTransaction userTransaction) {
    JtaTransactionManager jtaTransactionManager = new JtaTransactionManager();
    jtaTransactionManager.setUserTransaction(userTransaction);
    jtaTransactionManager.setTransactionManager(transactionManager);
    jtaTransactionManager.afterPropertiesSet();
    return jtaTransactionManager;
}

60.9. Camel 事件到 CDI 事件

可从 Camel 2.17 开始

Camel 提供一组 管理事件 ,可订阅侦听 Camel 上下文、服务、路由和交换事件。Camel CDI 将这些 Camel 事件无缝转换为 CDI 事件,这些事件可以通过 CDI 监控器方法,例如:

void onContextStarting(@Observes CamelContextStartingEvent event) {
    // Called before the default Camel context is about to start
}

从 Camel 2.18 开始,可以观察特定路由的事件(RouteAddedEventRouteStartedEventRouteStoppedEventRouteRemovedEvent)应该有一个显式定义,例如:

from("...").routeId("foo").to("...");

void onRouteStarted(@Observes @Named("foo") RouteStartedEvent event) {
    // Called after the route "foo" has started
}

当 CDI 容器中存在多个 Camel 上下文时,Camel 上下文 belifiers (如 @ContextName )可用于优化观察器方法解析到特定 Camel 上下文,例如: http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#observer_resolution

void onRouteStarted(@Observes @ContextName("foo") RouteStartedEvent event) {
    // Called after the route 'event.getRoute()' for the Camel context 'foo' has started
}
 
void onContextStarted(@Observes @Manual CamelContextStartedEvent event) {
    // Called after the Camel context qualified with '@Manual' has started
}

同样,如果存在多个上下文,可以使用 @Default qualifier 观察 Camel 上下文的 Camel 事件,例如: 

void onExchangeCompleted(@Observes @Default ExchangeCompletedEvent event) {
    // Called after the exchange 'event.getExchange()' processing has completed
}

在该示例中,如果没有指定限定符,则会隐式假设 @Any qualifier,以便接收所有 Camel 上下文的对应事件。

请注意,仅在部署中检测到监听 Camel 事件的观察方法,并且每个 Camel 上下文中检测到对 Camel 事件的支持才会激活。

60.10. CDI 事件端点

可从 Camel 2.17 开始

CDI 事件端点使用 Camel 路由桥接 CDI 事件 ,以便 CDI 事件可以从 Camel 消费者(由 Camel 生产者负责)无缝观察/消耗(重新启动/触发)。

Camel CDI 提供的 CdiEventEndpoint<T > bean 用于观察/消耗 事件类型 为 T 的 CDI 事件,例如:

@Inject
CdiEventEndpoint<String> cdiEventEndpoint;

from(cdiEventEndpoint).log("CDI event received: ${body}");

这等同于编写:

@Inject
@Uri("direct:event")
ProducerTemplate producer;

void observeCdiEvents(@Observes String event) {
    producer.sendBody(event);
}

from("direct:event").log("CDI event received: ${body}");

相反, CdiEventEndpoint<T > bean 可以用来生成 / fire CDI 事件,其 事件类型 为 T,例如:

@Inject
CdiEventEndpoint<String> cdiEventEndpoint;

from("direct:event").to(cdiEventEndpoint).log("CDI event sent: ${body}");

这等同于编写:

@Inject
Event<String> event;

from("direct:event").process(new Processor() {
    @Override
    public void process(Exchange exchange) {
        event.fire(exchange.getBody(String.class));
    }
}).log("CDI event sent: ${body}");

或者使用 Java 8 lambda 表达式:

@Inject
Event<String> event;

from("direct:event")
    .process(exchange -> event.fire(exchange.getIn().getBody(String.class)))
    .log("CDI event sent: ${body}");

特定 CdiEventEndpoint< T  > 注入点 的类型 变量 T (resp)。 

@Inject
@FooQualifier
CdiEventEndpoint<List<String>> cdiEventEndpoint;

from("direct:event").to(cdiEventEndpoint);

void observeCdiEvents(@Observes @FooQualifier List<String> event) {
    logger.info("CDI event: {}", event);
}

当 CDI 容器中有多个 Camel 上下文时,Camel 上下文 bean qualifiers (如 @ContextName )可用于确定 CdiEventEndpoint<T& gt; 注入点,例如:

@Inject
@ContextName("foo")
CdiEventEndpoint<List<String>> cdiEventEndpoint;
// Only observes / consumes events having the @ContextName("foo") qualifier
from(cdiEventEndpoint).log("Camel context (foo) > CDI event received: ${body}");
// Produces / fires events with the @ContextName("foo") qualifier
from("...").to(cdiEventEndpoint);

void observeCdiEvents(@Observes @ContextName("foo") List<String> event) {
    logger.info("Camel context (foo) > CDI event: {}", event);
}

请注意,CDI 事件 Camel 端点动态地为 事件类型 和事件 限定组合添加 观察器 方法 ,并且完全依赖于容器类型safe observer 解析,从而尽可能有效地实施。

另外,作为 CDI 类型安全特性 和 Camel 组件模型 的动态 性质之间的争议会非常高,因此无法通过 URI 创建 CDI 事件 Camel 端点的实例。实际上,CDI 事件组件的 URI 格式是:

cdi-event://PayloadType<T1,...,Tn>[?qualifiers=QualifierType1[,...[,QualifierTypeN]...]]

使用 authority PayloadType (resp.. QualifierType)是有效负载的 URI 转义的完全限定名称(resp. qua. qualifier)原始类型,后跟类型参数参数参数部分。这会导致 不友好的 URI,例如:

cdi-event://org.apache.camel.cdi.example.EventPayload%3Cjava.lang.Integer%3E?qualifiers=org.apache.camel.cdi.example.FooQualifier%2Corg.apache.camel.cdi.example.BarQualifier

但更根本上来说,随着 CDI 容器没有发现 Camel 上下文模型,在端点实例和观察程序方法之间可以有效绑定。

60.11. Camel XML 配置导入

可从 Camel 2.18 开始

虽然 CDI 优先选择类型为safe 依赖项注入机制,但将现有 Camel XML 配置文件重新调度到 Camel CDI 应用程序中可能会很有用。 在其他用例中,可能需要依赖 Camel XML DSL 来配置其 Camel 上下文。

您可以使用 Camel CDI 在任何 CDI Bean 和 Camel CDI 上提供的 @ImportResource 注释,可以在指定位置自动载入 Camel XML 配置,例如:

@ImportResource("camel-context.xml")
class MyBean {
}

Camel CDI 将在类路径的指定位置加载资源(将来可能会添加其他协议)。

从导入的资源的每个 CamelContext 元素和其他 Camel 原语 都会在容器 bootstrap 期间自动部署为 CDI Bean,以便它们从 Camel CDI 提供的自动配置中受益,并在运行时进行注入。如果这样的元素设置了显式 id 属性,则对应的 CDI isan 在 @Named qualifier 中被授权,例如,给定以下 Camel XML 配置:

<camelContext id="foo">
    <endpoint id="bar" uri="seda:inbound">
        <property key="queue" value="#queue"/>
        <property key="concurrentConsumers" value="10"/>
    </endpoint>
<camelContext/>

对应的 CDI Bean 会自动部署,并可注入,例如:

@Inject
@ContextName("foo")
CamelContext context;

@Inject
@Named("bar")
Endpoint endpoint;

请注意, CamelContext Bean 自动使用 @Named 和 @ContextName 限定符。如果导入的 CamelContext 元素没有 id 属性,则使用内置的 @Default qualifier 部署对应的 bean。

相反,在应用程序中部署的 CDI Bean 可以从 Camel XML 配置中引用(通常使用 ref 属性,如声明以下 Bean):

@Produces
@Named("baz")
Processor processor = exchange -> exchange.getIn().setHeader("qux", "quux");

可以在导入的 Camel XML 配置中声明该 bean 的引用,例如:

<camelContext id="foo">
    <route>
        <from uri="..."/>
        <process ref="baz"/>
    </route>
<camelContext/>

60.12. 事务支持

可作为 Camel 2.19 提供

Camel CDI 使用 JTA 支持 Camel 事务客户端。

该支持是可选的,因此在使用 Maven 时通过显式添加 JTA 作为依赖项,在应用程序类路径中具有 JTA,例如:

<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <scope>runtime</scope>
</dependency>

您必须把应用程序部署到 JTA 兼容容器中,或提供独立 JTA 实施。

小心

请注意,事务管理器使用 java:/TransactionManager 键查找为 JNDI 资源。

以后将添加更多灵活的策略来支持更广泛的部署场景。

60.12.1. 事务策略

Camel CDI 为通常受支持的 Camel TransactedPolicy 作为 CDI Bean 提供实施。可使用转换的 EIP (例如,通过转换的 EIP)按名称查找这些策略:

class MyRouteBean extends RouteBuilder {

    @Override
    public void configure() {
        from("activemq:queue:foo")
            .transacted("PROPAGATION_REQUIRED")
            .bean("transformer")
            .to("jpa:my.application.entity.Bar")
            .log("${body.id} inserted");
    }
}

这等同于:

class MyRouteBean extends RouteBuilder {

    @Inject
    @Named("PROPAGATION_REQUIRED")
    Policy required;

    @Override
    public void configure() {
        from("activemq:queue:foo")
            .policy(required)
            .bean("transformer")
            .to("jpa:my.application.entity.Bar")
            .log("${body.id} inserted");
    }
}

支持的事务策略名称是:

  • 澳大利亚_NEVER
  • PROPAGATION_NOT_SUPPORTED,
  • PROPAGATION_SUPPORTS,
  • PROPAGATION_REQUIRED,
  • PROPAGATION_REQUIRES_NEW,
  • PROPAGATION_NESTED,
  • PROPAGATION_MANDATORY.

60.12.2. 事务性错误处理程序

Camel CDI 提供了一个事务性错误处理程序,可扩展重新传送错误处理程序,在每次重新传送异常时强制回滚,并为每个重新发送创建新事务。

Camel CDI 提供 CdiRouteBuilder 类,用于公开事务ErrorHandler 帮助程序方法,以启用快速访问配置,例如:

class MyRouteBean extends CdiRouteBuilder {

    @Override
    public void configure() {
        errorHandler(transactionErrorHandler()
            .setTransactionPolicy("PROPAGATION_SUPPORTS")
            .maximumRedeliveries(5)
            .maximumRedeliveryDelay(5000)
            .collisionAvoidancePercent(10)
            .backOffMultiplier(1.5));
    }
}

60.13. 自动配置的 OSGi 集成

可从 Camel 2.17 开始

Camel 上下文 Bean 由 Camel CDI 自动适应,以便它们注册为 OSGi 服务,以及各种解析器(如 ComponentResolver 和 DataFormatResolver)与 OSGi 注册表集成。这意味着 Karaf Camel 命令可用于运行由 Camel CDI 自动配置的 Camel 上下文,例如:

karaf@root()> camel:context-list
 Context        Status              Total #       Failed #     Inflight #   Uptime
 -------        ------              -------       --------     ----------   ------
 camel-cdi      Started                   1              0              0   1 minute

如需 Camel CDI OSGi 集成的示例,请参见 camel-example-osgi 示例。

60.14. lazy Injection / Programmatic Lookup

虽然 CDI 程序化模型使用一种在应用程序初始化时发生 的类型安全解析 机制,但稍后可以使用程序化 查找 机制在应用程序执行期间执行动态 / lazy 注入。

Camel CDI 为方便使用 CDI 限定语对应的注解提供方便,供您用于标准注入 Camel 原语。这些注解文字可与 javax.enterprise.inject.Instance 接口结合使用,后者是执行 lazy 注入 / programmatic lookup 的 CDI 入口点。

例如,您可以使用 @Uri qualifier 提供的注解文字来对 Camel 原语(如 ProducerTemplate beans)进行 lazily 查询:

@Any
@Inject
Instance<ProducerTemplate> producers;

ProducerTemplate inbound = producers
    .select(Uri.Literal.of("direct:inbound"))
    .get();

或者对于 Endpoint Bean,例如:

@Any
@Inject
Instance<Endpoint> endpoints;

MockEndpoint outbound = endpoints
    .select(MockEndpoint.class, Uri.Literal.of("mock:outbound"))
    .get();

同样,您可以使用 @ContextName 限定符提供的注解文字来 lazily lookup for CamelContext beans,例如:

@Any
@Inject
Instance<CamelContext> contexts;

CamelContext context = contexts
    .select(ContextName.Literal.of("foo"))
    .get();

您还可以根据 Camel 上下文类型优化选择,例如:

@Any
@Inject
Instance<CamelContext> contexts;

// Refine the selection by type
Instance<DefaultCamelContext> context = contexts.select(DefaultCamelContext.class);

// Check if such a bean exists then retrieve a reference
if (!context.isUnsatisfied())
    context.get();

或者迭代 Camel 上下文的选择,例如:

@Any
@Inject
Instance<CamelContext> contexts;

for (CamelContext context : contexts)
    context.setUseBreadcrumb(true);

60.15. Maven Archetype

在可用的 Camel Maven 原型 中,您可以使用提供的 camel-archetype-cdi 生成 Camel CDI Maven 项目,例如:

mvn archetype:generate -DarchetypeGroupId=org.apache.camel.archetypes -DarchetypeArtifactId=camel-archetype-cdi

60.16. 支持的容器

Camel CDI 组件与任何 CDI 1.0、CDI 1.1 和 CDI 1.2 兼容运行时兼容。它根据以下运行时进行了成功测试:

Container版本Runtime

Weld SE

1.1.28.Final

CDI 1.0 / Java SE 7

OpenWebBeans

1.2.7

CDI 1.0 / Java SE 7

Weld SE

2.4.2.Final

CDI 1.2 / Java SE 7

OpenWebBeans

1.7.2

CDI 1.2 / Java SE 7

WildFly

8.2.1.Final

CDI 1.2 / Java EE 7

WildFly

9.0.1.Final

CDI 1.2 / Java EE 7

WildFly

10.1.0.Final

CDI 1.2 / Java EE 7

60.17. 例子

以下示例包括在 Camel 项目 的示例 目录中:

示例描述

camel-example-cdi

演示如何使用 CDI 使用 CDI 使用 Camel 配置组件、端点和 Bean

camel-example-cdi-kubernetes

演示了 Camel、CDI 和 Kubernetes 之间的集成

camel-example-cdi-metrics

演示了 Camel、Dropwizard Metrics 和 CDI 之间的集成

camel-example-cdi-properties

演示 Camel、DeltaSpike 和 CDI 配置属性之间的集成

camel-example-cdi-osgi

使用 SJMS 组件的 CDI 应用程序,可在使用 PAX CDI 的 OSGi 容器内执行

camel-example-cdi-rest-servlet

演示了在 Web 应用程序中使用的 Camel REST DSL,它使用 CDI 作为依赖项注入框架

camel-example-cdi-test

演示了作为 Camel 和 CDI 集成的一部分提供的测试功能

camel-example-cdi-xml

演示了将 Camel XML 配置文件用于 Camel CDI 应用程序

camel-example-openapi-cdi

使用带有 CDI 的 REST DSL 和 OpenAPI Java 的示例

camel-example-swagger-cdi

使用带有 CDI 的 REST DSL 和 Swagger Java 的示例

camel-example-widget-gadget-cdi

使用 CDI 依赖项注入的 Java 中实施的 EIP 书和 Gadget 用例

60.18. 另请参阅

60.19. 在 WildFly-Camel 上进行 EAR 部署的 Camel CDI

与标准 WAR 或 JAR 部署相比,Camel 上的 Camel CDI EAR 部署在类和资源加载方面有一些区别。

WildFly 引导我们使用 EAR 部署类Loader。WildFly 也要求所有 EAR 子部署只创建和共享一个 CDI 扩展。

这将通过使用 EAR 部署类Loader 来动态加载类和资源,生成 'Auto-configured' CDI Camel 上下文。默认情况下,这个类Loader 无法访问 EAR 子部署中的资源。

对于 EAR 部署,建议避免使用 'Auto-configured' CDI Camel 上下文,并避免了 RouteBuilder 类,或使用 @ContextName 注释或 CamelContext 通过 @ImportResource 注释和字段创建。这有助于 WildFly-Camel 确定用于 Camel 的正确类Loader。

第 61 章 Chronicle Engine 组件

作为 Camel 2.18 版提供

camel chronicle-engine 组件可让您利用 OpenHFT 的 Chronicle-Engine 的力量

61.1. URI 格式

chronicle-engine:addresses/path[?options]

61.2. URI 选项

Chronicle Engine 组件没有选项。

Chronicle Engine 端点使用 URI 语法进行配置:

chronicle-engine:addresses/path

使用以下路径和查询参数:

61.2.1. 路径名(2 参数):

名称描述默认类型

addresses

所需的 引擎地址。可以使用逗号分隔多个地址。

 

字符串

path

所需的 引擎路径

 

字符串

61.2.2. 查询参数(12 参数):

名称描述默认类型

action (common)

执行有效值的默认操作有: - PUBLISH - PPUBLISH_AND_INDEX - PPUT - PGET_AND_PUT - PPUT_ALL - PPUT_IF_ABSENT - PGET - PGET_AND_REMOVE - PREMOVE - PIS_EMLE - PIS_EML - PPUT_IF_ABSENT - PGET_AND_REMOVE - PEMOVE - PIS_EML

 

字符串

clusterName (common)

队列的集群名称

 

字符串

filteredMapEvents (common)

以逗号分隔的 Map event type 列表到 filer,有效的值为 INSERT、UPDATE、REMOVE。

 

字符串

persistent (common)

启用/禁用数据持久性

true

布尔值

subscribeMapEvents (common)

如果消费者应订阅 Map events,则设置默认值。

true

布尔值

subscribeTopicEvents (common)

如果消费者应订阅 TopicEvents,则设置 efault false。

false

布尔值

subscribeTopologicalEvents (common)

如果消费者应订阅 TopologicalEvents,d efault false,设置。

false

布尔值

wireType (common)

要使用的 Wire 类型,默认为二进制线路。

二进制

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

61.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.chronicle-engine.enabled

启用 chronicle-engine 组件

true

布尔值

camel.component.chronicle-engine.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 62 章 块组件

作为 Camel 版本 2.15 可用

chunk: 组件允许使用 Chunk 模板处理消息。这在使用 Templating 生成请求的响应时是理想的选择。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-chunk</artifactId>
<version>x.x.x</version> <!-- use the same version as your Camel core version -->
</dependency>

62.1. URI 格式

chunk:templateName[?options]

其中 templateName 是要调用的模板的 classpath-local URI。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

62.2. 选项

Chunk 组件支持 2 个选项,它们如下所列。

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

Chunk 端点使用 URI 语法进行配置:

chunk:resourceUri

使用以下路径和查询参数:

62.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

资源 所需的 路径。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。

 

字符串

62.2.2. 查询参数(9 参数):

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

encoding (producer)

定义正文编码

 

字符串

extension (producer)

定义模板的文件扩展

 

字符串

themeFolder (producer)

定义要扫描的 themes 文件夹

 

字符串

themeLayer (producer)

将主题层定义为 elaborate

 

字符串

themeSubfolder (producer)

定义要扫描的辅助子文件夹

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

62.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.chunk.enabled

启用块组件

true

布尔值

camel.component.chunk.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

chunk 组件将在其文件夹中查找带有 extensions .chtml 或 _.cxml. _If 的特定模板,您需要指定不同的文件夹或扩展,您需要使用上面列出的特定选项。

62.4. 块上下文

Camel 将在 Chunk 上下文中提供交换信息(调整 map)。交换 的传输如下:

 

keyvalue

exchange

Exchange 本身。

exchange.properties

Exchange 属性。

标头

In 消息的标头。

camelContext

Camel 上下文.

request

In 消息。

正文(body)

In message body。

response

Out 消息(仅适用于 InOut 消息交换模式)。

62.5. 动态模板

Camel 提供了两个标头,您可以为模板或模板内容本身定义不同的资源位置。如果设置了其中任何标头,Camel 会将其用于端点配置的资源。这可让您在运行时提供动态模板。

标头类型描述支持版本

ChunkConstants.CHUNK_RESOURCE_URI

字符串

要使用的模板资源的 URI,而不是配置的端点。

 

ChunkConstants.CHUNK_TEMPLATE

字符串

要使用的模板,而不使用配置的端点。

 

62.6. Samples

例如,您可以使用如下内容:

from("activemq:My.Queue").
to("chunk:template");

使用 Chunk 模板来制定对 InOut 消息交换的消息做出响应(其中有一个 JMSReplyTo 标头)。

如果要使用 InOnly 并消耗信息并将其发送到您可以使用的其他目的地:

from("activemq:My.Queue").
to("chunk:template").
to("activemq:Another.Queue");

可以指定组件应该通过标头动态使用的模板,例如:

from("direct:in").
setHeader(ChunkConstants.CHUNK_RESOURCE_URI).constant("template").
to("chunk:dummy?allowTemplateFromHeader=true");
警告

启用 allowTemplateFromHeader 选项具有安全 RAMification。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

使用 Chunk 组件选项的示例:

from("direct:in").
to("chunk:file_example?themeFolder=template&themeSubfolder=subfolder&extension=chunk");

在这个示例中,Chunk 组件会在文件夹 template/subfolder 中查找 file_example.chunk 文件。

62.7. 电子邮件示例

在本例中,我们想使用 Chunk 模板进行单次确认电子邮件。电子邮件模板在 Chunk 中称为:

 
Dear {$headers.lastName}, {$headers.firstName}

Thanks for the order of {$headers.item}.

Regards Camel Riders Bookstore
{$body}

62.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 63 章 类组件

Camel 版本 2.4 中可用

类: 组件将 Bean 绑定到 Camel 消息交换。它的工作方式与 Bean 组件相同,但并不是从 Registry 中查找 Bean,而是根据类名称创建 bean。

63.1. URI 格式

class:className[?options]

其中 className 是要创建和使用为 bean 的完全限定类名称。

63.2. 选项

Class 组件支持 2 个选项,它们如下所列。

名称描述默认类型

cache (advanced)

如果启用,Camel 将缓存第一个 Registry 查找的结果。如果 registry 中的 bean 定义为单例范围,则可以启用缓存。

 

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Class 端点使用 URI 语法进行配置:

class:beanName

使用以下路径和查询参数:

63.2.1. 路径名(1 参数):

名称描述默认类型

beanName

必需 设置要调用的 bean 的名称

 

字符串

63.2.2. 查询参数(5 参数):

名称描述默认类型

方法 (生成器)

设置在 bean 上调用的方法的名称

 

字符串

cache (advanced)

如果启用,Camel 将缓存第一个 Registry 查找的结果。如果 registry 中的 bean 定义为单例范围,则可以启用缓存。

 

布尔值

multiParameterArray (advanced)

弃用了 如何处理从消息正文传递的参数;如果为 true,则消息正文应该是参数的数组。注:此选项由 Camel 内部使用,它不适用于最终用户。弃用备注:此选项由 Camel 内部使用,且不适用于最终用户。

false

布尔值

参数 (高级)

用于配置 bean 中的其他属性

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

63.3. 使用

您只需将 组件用作 Bean 组件,但通过改为指定完全限定的类名称。
例如,您需要使用 MyFooBean,如下所示:

    from("direct:start").to("class:org.apache.camel.component.bean.MyFooBean").to("mock:result");

您还可以指定在 MyFooBean 上调用的方法,例如 hello

    from("direct:start").to("class:org.apache.camel.component.bean.MyFooBean?method=hello").to("mock:result");

63.4. 设置创建的实例的属性

在 endpoint uri 中,您可以指定在创建的实例上设置的属性,例如,如果它有 setPrefix 方法:

   // Camel 2.17 onwards
   from("direct:start")
        .to("class:org.apache.camel.component.bean.MyPrefixBean?bean.prefix=Bye")
        .to("mock:result");
 
   // Camel 2.16 and older 
   from("direct:start")
        .to("class:org.apache.camel.component.bean.MyPrefixBean?prefix=Bye")
        .to("mock:result");

此外,您还可以使用 # 语法来指代在 Registry 中查找属性。

    // Camel 2.17 onwards
    from("direct:start")
        .to("class:org.apache.camel.component.bean.MyPrefixBean?bean.cool=#foo")
        .to("mock:result");

    // Camel 2.16 and older
    from("direct:start")
        .to("class:org.apache.camel.component.bean.MyPrefixBean?cool=#foo")
        .to("mock:result");

该操作将使用 id foo 从注册表查找 Bean,并在 MyPrefixBean 类的创建实例上调用 setCool 方法。

TIP:在 Bean 组件中更详细,因为 该类组件的工作方式与这个类 组件相同。

63.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • bean
  • bean Binding
  • Bean 集成

第 64 章 CMIS 组件

作为 Camel 2.11 版本提供

cmis 组件使用 Apache Chemistry 客户端 API,并允许您从 CMIS 兼容内容存储库中添加/读取节点。

64.1. URI 格式

cmis://cmisServerUrl[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

64.2. CMIS 选项

CMIS 组件支持 2 个选项,它们如下所列。

名称描述默认类型

sessionFacadeFactory (common)

使用自定义 CMISSessionFacadeFactory 来创建 CMISSessionFacade 实例

 

CMISSessionFacade Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

CMIS 端点使用 URI 语法进行配置:

cmis:cmsUrl

使用以下路径和查询参数:

64.2.1. 路径名(1 参数):

名称描述默认类型

cmsUrl

cmis 仓库 所需的 URL

 

字符串

64.2.2. 查询参数(13 参数):

名称描述默认类型

pageSize (common)

每个页面要检索的节点数量

100

int

readContent (common)

如果设置为 true,则除了属性外,还会检索文档节点的内容

false

布尔值

readCount (common)

要读取的节点的最大数量

 

int

repositoryId (common)

要使用的存储库的 Id。如果没有指定第一个可用的存储库

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

query (consumer)

要对存储库执行的 cmis 查询。如果未指定,使用者将通过递归迭代内容树从内容存储库检索每个节点

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

queryMode (producer)

如果为 true,将从消息正文执行 cmis 查询并返回结果,否则将在 cmis 仓库中创建节点

false

布尔值

sessionFacadeFactory (advanced)

使用自定义 CMISSessionFacadeFactory 来创建 CMISSessionFacade 实例

 

CMISSessionFacade Factory

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

密码 (安全)

cmis 仓库的密码

 

字符串

username (security)

cmis 仓库的用户名

 

字符串

64.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.cmis.enabled

启用 cmis 组件

true

布尔值

camel.component.cmis.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.cmis.session-facade-factory

使用自定义 CMISSessionFacadeFactory 来创建 CMISSessionFacade 实例。选项是一个 org.apache.camel.component.cmis.CMISSessionFacadeFactory 类型。

 

字符串

64.4. 使用

64.4.1. 由制作者评估的消息标头

标头默认值描述

CamelCMISFolderPath

/

执行期间要使用的当前文件夹。如果未指定,则使用根文件夹

CamelCMISRetrieveContent

false

queryMode 中,此标头将强制制作者检索文档节点的内容。

CamelCMISReadSize

0

要读取的节点数量上限。

cmis:path

null

如果没有设置 CamelCMISFolderPath,将尝试从此 cmis 属性中找到节点的路径,并将其命名为

cmis:name

null

如果没有设置 CamelCMISFolderPath,将尝试从此 cmis 属性查找节点的路径,且路径

cmis:objectTypeId

null

节点的类型

cmis:contentStreamMimeType

null

为文档设置的 mimetype

64.4.2. 查询 Producer 操作过程中设置的消息标头

标头类型描述

CamelCMISResultCount

整数

从查询返回的节点数。

消息正文将包含映射列表,映射中的每个条目都是 cmis 属性及其值。如果将 CamelCMISRetrieveContent 标头设置为 true,则映射中带有键 CamelCMISContent 的另一个条目将包含节点类型的 输入Stream

64.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cmis</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.11 或更高版本)。

64.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 65 章 CM SMS 网关组件

作为 Camel 2.18 版提供

Camel-Cm-Sms 是 [CM SMS 网关](https://www.cmtelecom.com)的 Apache Camel 组件。

它允许在应用程序中将 CM SMS API集成为 camel 组件。

您必须具有有效的帐户。有关更多信息,请参阅 CM Telecom

cm-sms://sgw01.cm.nl/gateway.ashx?defaultFrom=DefaultSender&defaultMaxNumberOfParts=8&productToken=xxxxx

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

---
<dependency>
 <groupId>org.apache.camel</groupId>
 <artifactId>camel-cm-sms</artifactId>
 <version>x.x.x</version>
 <!-- use the same version as your Camel core version -->
</dependency>
---

65.1. 选项

CM SMS 网关组件没有选项。

CM SMS 网关端点使用 URI 语法配置:

cm-sms:host

使用以下路径和查询参数:

65.1.1. 路径名(1 参数):

名称描述默认类型

主机

使用方案 所需的 SMS Provider HOST

 

字符串

65.1.2. 查询参数(5 参数):

名称描述默认类型

defaultFrom (producer)

这是发件人名称。最大长度为 11 个字符。

 

字符串)

defaultMaxNumberOfParts (producer)

如果它是多部分消息,则强制使用 max 号。消息可以被截断。从技术上讲,网关将首先检查消息是否大于 160 个字符,消息将被剪切至由这些参数限制的多个 153 字符部分。

8

Max(8L)::Int)

productToken (producer)

要使用 的唯一令牌

 

字符串)

testConnectionOnStartup (producer)

是否在启动时测试与 SMS 网关的连接

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

65.2. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.cm-sms.enabled

启用 cm-sms 组件

true

布尔值

camel.component.cm-sms.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

65.3. 示例

您可以尝试 此项目, 了解 camel-cm-sms 如何集成到 camel-cm-sms 中。

第 66 章 CoAP 组件

作为 Camel 版本 2.16 可用

Camel-CoAP 是一个 Apache Camel 组件,可让您使用 CoAP (机器到机器操作的轻量级 REST 类型协议)。CoAP,有限制的应用程序协议是一个专用的 Web 传输协议,用于受限制的节点和受限网络,它基于 RFC 7252。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
 <groupId>org.apache.camel</groupId>
 <artifactId>camel-coap</artifactId>
 <version>x.x.x</version>
 <!-- use the same version as your Camel core version -->
</dependency>

66.1. 选项

CoAP 组件没有选项。

CoAP 端点使用 URI 语法配置:

coap:uri

使用以下路径和查询参数:

66.1.1. 路径名(1 参数):

名称描述默认类型

uri

CoAP 端点的 URI

 

URI

66.1.2. 查询参数(5 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

coapMethodRestrict (consumer)

CoAP 使用者将绑定到的方法的逗号分隔列表。默认为绑定到所有方法(DELETE、GET、POST、PUT)。

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

66.2. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.coap.enabled

启用 coap 组件

true

布尔值

camel.component.coap.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

66.3. 消息标头

名称类型描述

CamelCoapMethod

字符串

CoAP producer 在调用目标 CoAP 服务器 URI 时应使用的请求方法。有效选项包括 DELETE、GET、PING、POST 和 PUT。

CamelCoapResponseCode

字符串

外部服务器发送的 CoAP 响应代码。如需了解每个代码的含义的详细信息,请参阅 RFC 7252。

CamelCoapUri

字符串

要调用的 CoAP 服务器的 URI。将覆盖端点上直接配置的任何现有 URI。

66.3.1. 配置 CoAP producer 请求方法

以下规则决定了 CoAP producer 将用来调用目标 URI 的请求方法:

  1. CamelCoapMethod 标头的值
  2. 如果目标 CoAP 服务器 URI 上提供了查询字符串,GET
  3. POST 如果消息交换正文不为空。
  4. 否则 GET

第 67 章 恒定语言

可作为 Camel 版本 1.5 提供

Constant Expression Language 实际上是将恒定字符串指定为表达式类型的方法。

注意

这是一个固定常量值,仅在启动路由期间仅设置一次,在路由期间需要动态值,请不要使用这个选项。

67.1. 常量选项

Constant 语言支持 1 选项,这些选项如下。

名称默认Java 类型描述

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

67.2. 用法示例

Spring DSL 的 setHeader 元素可以使用类似如下的常量表达式:

<route>
  <from uri="seda:a"/>
  <setHeader headerName="theHeader">
    <constant>the value</constant>
  </setHeader>
  <to uri="mock:b"/>
</route>

在本例中,来自 seda:a Endpoint 的消息会将 'theHeader' 标头设置为恒定值 'the value'。

以及相同的使用 Java DSL 示例:

from("seda:a")
  .setHeader("theHeader", constant("the value"))
  .to("mock:b");

67.3. 依赖项

Constant 语言是 camel-core 的一部分。

第 68 章 CometD Component

可作为 Camel 版本 2.0 提供

come td: 组件是处理 come td/bayeux 协议的 jetty 实现的传输。
使用此组件结合 dojo 工具包库,可以使用 AJAX 的机制将 Camel 消息直接推送到浏览器中。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cometd</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

68.1. URI 格式

cometd://host:port/channelName[?options]

channelName 表示可由 Camel 端点订阅的主题。

68.2. 例子

cometd://localhost:8080/service/mychannel
cometds://localhost:8443/service/mychannel

where cometds: 表示 SSL 配置端点。

68.3. 选项

CometD 组件支持 8 个选项,它们如下。

名称描述默认类型

sslKeyPassword (security)

使用 SSL 时密钥存储的密码。

 

字符串

sslPassword (security)

使用 SSL 时的密码。

 

字符串

sslKeystore (security)

密钥存储的路径。

 

字符串

securityPolicy (security)

使用自定义配置的 SecurityPolicy 来控制授权

 

SecurityPolicy

extensions (common)

要使用允许修改进入和传出请求的自定义 BayeuxServer.Extension 列表。

 

list

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

CometD 端点使用 URI 语法配置:

cometd:host:port/channelName

使用以下路径和查询参数:

68.3.1. 路径名(3 参数):

名称描述默认类型

主机

所需的 主机名

 

字符串

port

所需的 主机端口号

 

int

channelName

必需的 channelName 代表 Camel 端点可订阅的主题。

 

字符串

68.3.2. 查询参数(16 参数):

名称描述默认类型

allowedOrigins (common)

如果 crosssOriginFilterOn 为 true,则支持跨跨域的域

*

字符串

baseResource (common)

Web 资源或类路径的根目录。使用协议文件:或类路径:具体取决于组件是否从文件系统或类路径加载资源。OSGI 部署需要 classpath,其中资源打包在 jar 中

 

字符串

crossOriginFilterOn (common)

如果为 true,则服务器将支持跨域过滤

false

布尔值

filterPath (common)

如果跨sOriginFilterOn 为 true,则 CrossOriginFilter 将供 CrossOriginFilterOn 使用。

 

字符串

interval (common)

客户端以毫秒为单位轮询超时。客户端在重新连接之间等待的时间

 

int

jsonCommented (common)

如果为 true,则服务器将接受 JSON 嵌套在注释中,并将生成 JSON 嵌套在注释中。这是针对 Ajax Hijacking 的保护措施。

true

布尔值

logLevel (common)

日志级别.0=none, 1=info, 2=debug.

1

int

maxInterval (common)

最大客户端侧轮询超时(以毫秒为单位)。如果此时没有收到连接,则会删除客户端。

30000

int

multiFrameInterval (common)

如果从同一浏览器检测到多个连接,则客户端侧轮询超时。

1500

int

timeout (common)

服务器侧轮询超时(以毫秒为单位)。这是服务器在响应前保存重新连接请求的时长。

240000

int

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sessionHeadersEnabled (consumer)

在为传入请求创建 Camel 消息时,是否在 Camel 消息中包含服务器会话标头。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

disconnectLocalSession (producer)

在向频道发布消息后,是否断开本地会话。需要断开本地会话,因为它们默认不是 swept,因此您可以耗尽内存。

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

68.4. Spring Boot Auto-Configuration

组件支持 9 个选项,如下所示。

名称描述默认类型

camel.component.cometd.enabled

enable cometd 组件

true

布尔值

camel.component.cometd.extensions

要使用允许修改进入和传出请求的自定义 BayeuxServer.Extension 列表。

 

list

camel.component.cometd.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.cometd.security-policy

使用自定义配置的 SecurityPolicy 来控制授权。选项是一个 org.cometd.bayeux.server.SecurityPolicy 类型。

 

字符串

camel.component.cometd.ssl-context-parameters

使用 SSLContextParameters 配置安全性。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.cometd.ssl-key-password

使用 SSL 时密钥存储的密码。

 

字符串

camel.component.cometd.ssl-keystore

密钥存储的路径。

 

字符串

camel.component.cometd.ssl-password

使用 SSL 时的密码。

 

字符串

camel.component.cometd.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

以下是如何传递参数的一些示例

对于 file (用于 Web 应用程序目录中的 webapp 资源 -→ cometd://localhost:8080?resourceBase=file./webapp
For classpath)(例如,web 资源被打包在 webapp 文件夹中 -→ istd://localhost:8080?resourceBase=classpath:webapp)

68.5. 身份验证

可从 Camel 2.8 开始

您可以将自定义 SecurityPolicyExtension's 配置为 'CometdComponent,它允许您使用 这里所述的身份验证

68.6. 为 Cometd 组件设置 SSL

68.6.1. 使用 JSSE 配置实用程序

从 Camel 2.9 开始,Cometd 组件支持通过 Camel JSSE 配置实用程序 的 SSL/TLS 配置。  这个实用程序可大大减少您需要编写的组件特定代码的数量,并在端点和组件级别进行配置。  以下示例演示了如何将 实用程序与 Cometd 组件搭配使用。您需要在 CometdComponent 上配置 SSL。

组件的程序配置

KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");

KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");

TrustManagersParameters tmp = new TrustManagersParameters();
tmp.setKeyStore(ksp);

SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
scp.setTrustManagers(tmp);

CometdComponent commetdComponent = getContext().getComponent("cometds", CometdComponent.class);
commetdComponent.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:trustManagers>
      <camel:keyStore
          resource="/users/home/server/keystore.jks"
          password="keystorePassword"/>
    </camel:keyManagers>
  </camel:sslContextParameters>...
 
  <bean id="cometd" class="org.apache.camel.component.cometd.CometdComponent">
    <property name="sslContextParameters" ref="sslContextParameters"/>
  </bean>
...
  <to uri="cometds://127.0.0.1:443/service/test?baseResource=file:./target/test-classes/webapp&timeout=240000&interval=0&maxInterval=30000&multiFrameInterval=1500&jsonCommented=true&logLevel=2"/>...

68.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 69 章 Consul 组件

作为 Camel 2.18 版提供

Consul 组件是一个将您的应用程序与 Consul 集成的组件。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-consul</artifactId>
        <version>${camel-version}</version>
    </dependency>

69.1. URI 格式

    consul://domain?[options]

您可以按照以下格式将查询选项附加到 URI:

    ?option=value&option=value&...

69.2. 选项

Consul 组件支持 9 个选项,它们如下所列。

名称描述默认类型

url (common)

Consul 代理 URL

 

字符串

datacenter (common)

数据中心

 

字符串

sslContextParameters (common)

使用 org.apache.camel.util.jsse.SSLContextParameters 实例的 SSL 配置。

 

SSLContextParameters

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

aclToken (common)

设置与 Consul 搭配使用的 ACL 令牌

 

字符串

userName (common)

设置用于基本身份验证的用户名

 

字符串

password (common)

设置用于基本身份验证的密码

 

字符串

配置 (高级)

设置端点之间共享的通用配置

 

ConsulConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Consul 端点使用 URI 语法配置:

consul:apiEndpoint

使用以下路径和查询参数:

69.2.1. 路径名(1 参数):

名称描述默认类型

apiEndpoint

所需的 API 端点

 

字符串

69.2.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

69.3. Spring Boot Auto-Configuration

组件支持 90 选项,它们如下所列。

名称描述默认类型

camel.component.consul.acl-token

设置与 Consul 搭配使用的 ACL 令牌

 

字符串

camel.component.consul.cluster.service.acl-token

  

字符串

camel.component.consul.cluster.service.attributes

自定义服务属性。

 

map

camel.component.consul.cluster.service.block-seconds

  

整数

camel.component.consul.cluster.service.connect-timeout-millis

  

Long

camel.component.consul.cluster.service.consistency-mode

  

ConsistencyMode

camel.component.consul.cluster.service.datacenter

  

字符串

camel.component.consul.cluster.service.enabled

如果应启用或不启用 consul 集群服务,则设置默认值为 false。

false

布尔值

camel.component.consul.cluster.service.first-index

  

BigInteger

camel.component.consul.cluster.service.id

Cluster Service ID

 

字符串

camel.component.consul.cluster.service.near-node

  

字符串

camel.component.consul.cluster.service.node-meta

  

list

camel.component.consul.cluster.service.order

服务查找顺序/优先级.

 

整数

camel.component.consul.cluster.service.password

  

字符串

camel.component.consul.cluster.service.ping-instance

  

布尔值

camel.component.consul.cluster.service.read-timeout-millis

  

Long

camel.component.consul.cluster.service.recursive

  

布尔值

camel.component.consul.cluster.service.root-path

  

字符串

camel.component.consul.cluster.service.session-lock-delay

  

整数

camel.component.consul.cluster.service.session-refresh-interval

  

整数

camel.component.consul.cluster.service.session-ttl

  

整数

camel.component.consul.cluster.service.ssl-context-parameters

  

SSLContextParameters

camel.component.consul.cluster.service.tags

  

Set

camel.component.consul.cluster.service.url

  

字符串

camel.component.consul.cluster.service.user-name

  

字符串

camel.component.consul.cluster.service.write-timeout-millis

  

Long

camel.component.consul.configuration.acl-token

设置与 Consul 搭配使用的 ACL 令牌

 

字符串

camel.component.consul.configuration.action

默认操作。CamelConsulAction 可覆盖

 

字符串

camel.component.consul.configuration.block-seconds

秒等待监视事件,默认为 10 秒

 

整数

camel.component.consul.configuration.connect-timeout-millis

Connect timeout for OkHttpClient

 

Long

camel.component.consul.configuration.consistency-mode

用于查询的 consistencyMode,默认的 ConsistencyMode.DEFAULT

 

ConsistencyMode

camel.component.consul.configuration.consul-client

引用 registry 中的 com.orbitz.consul

 

Consul

camel.component.consul.configuration.datacenter

数据中心

 

字符串

camel.component.consul.configuration.first-index

第一个用于监视的索引,默认为 0

 

BigInteger

camel.component.consul.configuration.key

默认密钥。CamelConsulKey 可覆盖

 

字符串

camel.component.consul.configuration.near-node

用于查询的附近节点。

 

字符串

camel.component.consul.configuration.node-meta

用于查询的 note meta-data。

 

list

camel.component.consul.configuration.password

设置用于基本身份验证的密码

 

字符串

camel.component.consul.configuration.ping-instance

在返回 Consul 实例前,配置 AgentClient 应该尝试 ping

 

布尔值

camel.component.consul.configuration.read-timeout-millis

OkHttpClient 的读取超时

 

Long

camel.component.consul.configuration.recursive

递归监视,默认 false

 

布尔值

camel.component.consul.configuration.ssl-context-parameters

使用 org.apache.camel.util.jsse.SSLContextParameters 实例的 SSL 配置。

 

SSLContextParameters

camel.component.consul.configuration.tags

设置标签。您可以用逗号分隔多个标签。

 

Set

camel.component.consul.configuration.url

Consul 代理 URL

 

字符串

camel.component.consul.configuration.user-name

设置用于基本身份验证的用户名

 

字符串

camel.component.consul.configuration.value-as-string

默认为将从 Consul i.e 检索的值转换为字符串。

 

布尔值

camel.component.consul.configuration.write-timeout-millis

OkHttpClient 写入超时

 

Long

camel.component.consul.datacenter

数据中心

 

字符串

camel.component.consul.enabled

启用 consul 组件

true

布尔值

camel.component.consul.health.check.repository.checks

定义要包含的检查。

 

list

camel.component.consul.health.check.repository.configurations

健康检查配置。

 

map

camel.component.consul.health.check.repository.enabled

  

布尔值

camel.component.consul.health.check.repository.failure-threshold

  

整数

camel.component.consul.health.check.repository.interval

  

字符串

camel.component.consul.password

设置用于基本身份验证的密码

 

字符串

camel.component.consul.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.consul.service-registry.acl-token

  

字符串

camel.component.consul.service-registry.attributes

自定义服务属性。

 

map

camel.component.consul.service-registry.block-seconds

  

整数

camel.component.consul.service-registry.check-interval

  

整数

camel.component.consul.service-registry.check-ttl

  

整数

camel.component.consul.service-registry.connect-timeout-millis

  

Long

camel.component.consul.service-registry.consistency-mode

  

ConsistencyMode

camel.component.consul.service-registry.datacenter

  

字符串

camel.component.consul.service-registry.deregister-after

  

整数

camel.component.consul.service-registry.deregister-services-on-stop

  

布尔值

camel.component.consul.service-registry.enabled

如果应启用或不启用 consul 服务 registry,则设置默认值为 false。

false

布尔值

camel.component.consul.service-registry.first-index

  

BigInteger

camel.component.consul.service-registry.id

服务 Registry ID

 

字符串

camel.component.consul.service-registry.near-node

  

字符串

camel.component.consul.service-registry.node-meta

  

list

camel.component.consul.service-registry.order

服务查找顺序/优先级.

 

整数

camel.component.consul.service-registry.override-service-host

  

布尔值

camel.component.consul.service-registry.password

  

字符串

camel.component.consul.service-registry.ping-instance

  

布尔值

camel.component.consul.service-registry.read-timeout-millis

  

Long

camel.component.consul.service-registry.recursive

  

布尔值

camel.component.consul.service-registry.service-host

  

字符串

camel.component.consul.service-registry.ssl-context-parameters

  

SSLContextParameters

camel.component.consul.service-registry.tags

  

Set

camel.component.consul.service-registry.url

  

字符串

camel.component.consul.service-registry.user-name

  

字符串

camel.component.consul.service-registry.write-timeout-millis

  

Long

camel.component.consul.ssl-context-parameters

使用 org.apache.camel.util.jsse.SSLContextParameters 实例的 SSL 配置。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.consul.url

Consul 代理 URL

 

字符串

camel.component.consul.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

camel.component.consul.user-name

设置用于基本身份验证的用户名

 

字符串

camel.component.consul.cluster.service.dc

  

字符串

camel.component.consul.configuration.dc

数据中心 @ deprecated 替换为 {@link #setDatacenter (String)}}

 

字符串

camel.component.consul.service-registry.dc

  

字符串

69.4. Headers

名称类型描述

CamelConsulAction

字符串

Producer 操作

CamelConsulKey

字符串

操作要对其应用的密钥

CamelConsulEventId

字符串

事件 ID (仅限使用者)

CamelConsulEventName

字符串

事件名称(仅限使用者)

CamelConsulEventLTime

Long

事件 LTime

CamelConsulNodeFilter

字符串

节点过滤器

CamelConsulTagFilter

字符串

标签过滤器

CamelConsulSessionFilter

字符串

会话过滤器

CamelConsulVersion

int

数据版本

CamelConsulFlags

Long

与值关联的标记

CamelConsulCreateIndex

Long

代表创建条目时的内部索引值

CamelConsulLockIndex

Long

这个密钥成功被锁定的次数

CamelConsulModifyIndex

Long

修改此密钥的最后一个索引

CamelConsulOptions

对象

与请求关联的选项

CamelConsulResult

布尔值

真(如果响应具有结果)

CamelConsulSession

字符串

会话 ID

CamelConsulValueAsString

布尔值

将从 Consul i.e 检索的值转换为字符串:

第 70 章 控制总线组件

作为 Camel 2.11 版本提供

通过 EIP 模式的 控制总线,可以在框架中监控和管理集成系统。

image

使用控制总线来管理企业集成系统。Control Bus 使用与应用程序数据相同的消息机制,但使用单独的通道来传输与消息流中涉及的组件管理相关的数据。

在 Camel 中,您可以使用 JMX 管理和监控,或者使用 CamelContext 中的 Java API,或者从 org.apache.camel.api.management 软件包
或者使用具有示例的事件通知程序。

从 Camel 2.11 开始,我们引入了一个新的 ControlBus 组件,可让您将消息发送到相应地响应的控制总线端点。

70.1. ControlBus Component

可从 Camel 2.11 开始

控制总线: 组件提供对基于 控制 总线 EIP 模式的 Camel 应用程序的简单管理。例如,通过向端点发送消息来控制路由的生命周期,或者收集性能统计。

controlbus:command[?options]

其中 命令 可以是任意字符串,以标识要使用的命令类型。

70.2. 命令

命令描述

route

使用 routeIdaction 参数控制路由。

language

允许您指定用于评估邮件正文的语言。???如果评估有任何结果,则结果将放入消息正文。

70.3. 选项

Control Bus 组件没有选项。

Control Bus 端点使用 URI 语法进行配置:

controlbus:command:language

使用以下路径和查询参数:

70.3.1. 路径名(2 参数):

名称描述默认类型

命令

必需 命令可以是路由或语言

 

字符串

language

允许您指定用于评估消息正文的语言名称。如果评估有任何结果,则结果将放入消息正文。

 

语言

70.3.2. 查询参数(6 参数):

名称描述默认类型

action (producer)

要表示可以执行的操作:start、stop 或 status。要启动或停止路由,或在邮件正文中以输出形式获取路由的状态。您可以使用挂起并从 Camel 2.11.1 中恢复,以暂停或恢复路由。从 Camel 2.11.1 开始,您可以使用统计数据以 XML 格式返回性能静态; routeId 选项可用于定义哪个路由来获取性能统计(如果未定义 routeId),那么您获取整个 CamelContext 的统计信息。restart 操作将重启路由。

 

字符串

async (producer)

是否异步执行控制总线任务。重要: 如果启用这个选项,则不会在 Exchange 上设置任务的任何结果。只有在同步执行任务时才能实现。

false

布尔值

loggingLevel (producer)

用于在任务完成时的日志记录级别,或者在处理任务期间发生任何异常。

INFO

LoggingLevel

restartDelay (producer)

重启路由时使用的延迟。

1000

int

routeId (producer)

要根据其 id 指定路由。special 关键字 current 表示当前的路由。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

70.4. 使用路由命令

通过路由命令,您可以非常轻松地在给定路由上执行常见任务,例如启动路由,您可以将空消息发送到此端点:

template.sendBody("controlbus:route?routeId=foo&action=start", null);

要获取路由的状态,您可以执行以下操作:

String status = template.requestBody("controlbus:route?routeId=foo&action=status", null, String.class);

70.5. 获取性能统计

可从 Camel 2.11.1 开始

这要求启用 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);

70.6. 使用简单语言

您可以将 简单 语言与控制总线一起使用,例如停止特定路由,您可以向 "controlbus:language:simple" 端点发送消息,其中包含以下信息:

template.sendBody("controlbus:language:simple", "${camelContext.stopRoute('myRoute')}");

因为这是一个 void 操作,因此不会返回任何结果。但是,如果您想要路由状态,可以执行以下操作:

String status = template.requestBody("controlbus:language:simple", "${camelContext.getRouteStatus('myRoute')}", String.class);

使用路由命令来控制 路由 的生命周期更容易。语言 命令允许您执行具有更强大的电源的语言脚本,如 Groovy 或一些扩展 简单 语言。

例如,关闭 Camel 本身可以:

template.sendBody("controlbus:language:simple?async=true", "${camelContext.stop()}");

我们使用 async=true 来异步停止 Camel,否则我们将在流中处理发送到控制总线组件的消息时停止 Camel。

提示

您还可以使用其他语言,如 Groovy 等。

第 71 章 Couchbase 组件

作为 Camel 版本 2.19 可用

couchbase: 组件允许您将 CouchBase 实例视为生成者或消息使用者。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-couchbase</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

71.1. URI 格式

couchbase:url

71.2. 选项

Couchbase 组件没有选项。

Couchbase 端点使用 URI 语法配置:

couchbase:protocol:hostname:port

使用以下路径和查询参数:

71.2.1. 路径名(3 参数):

名称描述默认类型

protocol

要使用的协议

 

字符串

hostname

需要 要使用的主机名

 

字符串

port

要使用的端口号

8091

int

71.2.2. 查询参数(47 参数):

名称描述默认类型

bucket (common)

要使用的存储桶

 

字符串

key (common)

要使用的密钥

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

consumerProcessedStrategy (consumer)

定义要使用的使用者流程策略

none

字符串

descending (consumer)

定义此操作是否降序或未超过

false

布尔值

designDocumentName (consumer)

要使用的设计文档名称

beer

字符串

limit (consumer)

要使用的输出限制

-1

int

rangeEndKey (consumer)

为结尾键定义一个范围

 

字符串

rangeStartKey (consumer)

为 start 键定义一个范围

 

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

skip (consumer)

定义要使用的跳过

-1

int

viewName (consumer)

要使用的视图名称

brewery_beers

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

autoStartIdForInserts (producer)

定义在我们执行插入操作时是否想要自动启动

false

布尔值

operation (producer)

要执行的操作

CCB_PUT

字符串

persistTo (producer)

数据保存的位置

0

int

producerRetryAttempts (producer)

定义重试尝试的数量

2

int

producerRetryPause (producer)

定义不同尝试之间的重试暂停

5000

int

replicateTo (producer)

复制数据的位置

0

int

startingIdForInsertsFrom (producer)

定义我们执行插入操作的开始 Id

 

long

additionalHosts (advanced)

其他主机

 

字符串

maxReconnectDelay (advanced)

在 reconnection 期间定义最大延迟

30000

long

obsPollInterval (advanced)

定义观察轮询间隔

400

long

obsTimeout (advanced)

定义观察超时

-1

long

opQueueMaxBlockTime (advanced)

定义操作可在队列块中的最大时间

10000

long

opTimeOut (advanced)

定义操作超时

2500

long

readBufferSize (advanced)

定义缓冲区大小

16384

int

shouldOptimize (advanced)

定义我们是否想要尽可能使用优化

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

timeoutExceptionThreshold (advanced)

定义引发超时 Exception 的阈值

998

int

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

密码 (安全)

要使用的密码

 

字符串

username (security)

要使用的用户名

 

字符串

71.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.couchbase.enabled

启用 couchbase 组件

true

布尔值

camel.component.couchbase.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 72 章 CouchDB Component

作为 Camel 2.11 版本提供

通过 couchdb: 组件,您可以将 CouchDB 实例视为生成者或消息使用者。使用轻量级 LightCouch API,这个 camel 组件具有以下特性:

  • 作为使用者,monitor couch changesets 用于插入、更新和删除和删除这些消息并将其作为消息发布到 camel 路由。
  • 作为制作者,可以保存,从 Camel 2.18 删除(通过使用带有 DELETE 值的 CouchDbMethod)文档,从 Camel 2.22 获取文档(通过使用带有 GET 值的 CouchDbMethod)获取文档。
  • 可以根据需要支持多个端点,例如在多个实例之间进行多个数据库。
  • 能够仅删除事件触发器,仅插入/更新或全部(默认)。
  • 为 sequenceId、文档修订、文档 ID 和 HTTP 方法类型设置的标头。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-couchdb</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

72.1. URI 格式

couchdb:http://hostname[:port]/database?[options]

其中 hostname 是正在运行的 couchdb 实例的主机名。端口是可选的,如果没有指定,则默认为 5984。

72.2. 选项

CouchDB 组件没有选项。

CouchDB 端点使用 URI 语法配置:

couchdb:protocol:hostname:port/database

使用以下路径和查询参数:

72.2.1. 路径名(4 参数):

名称描述默认类型

protocol

需要 用于与数据库通信的协议。

 

字符串

hostname

运行 couchdb 实例的 所需 主机名

 

字符串

port

运行 couchdb 实例的端口号

5984

int

database

要使用的数据库 所需的 名称

 

字符串

72.2.2. 查询参数(12 参数):

名称描述默认类型

createDatabase (common)

如果数据库尚不存在,则创建数据库

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

deletes (consumer)

文档删除作为事件发布

true

布尔值

heartbeat (consumer)

发送空消息以保持套接字在 millis 中处于活动状态的频率

30000

long

since (consumer)

在指定更新序列后立即开始跟踪更改。默认 null 将从最新的序列开始监控。

 

字符串

style (consumer)

指定更改阵列中返回多少个修订版本。默认 main_only 将只返回当前的 winning 修订版本;all_docs 将返回所有 leaf revisions (包括冲突和删除的前几个冲突)。

main_only

字符串

updates (consumer)

文档插入/更新作为事件发布

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

密码 (安全)

经过身份验证的数据库的密码

 

字符串

username (security)

身份验证数据库时的用户名

 

字符串

72.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.couchdb.enabled

启用 couchdb 组件

true

布尔值

camel.component.couchdb.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

72.4. Headers

在消息传输过程中,会对交换设置以下标头。

属性

CouchDbDatabase

消息来自的数据库

CouchDbSeq

couchdb 更改更新/删除消息的序列号

CouchDbId

couchdb 文档 id

CouchDbRev

couchdb 文档修订

CouchDbMethod

方法(删除 / update)

在收到消息后,消费者设置标头。在进行插入/更新之后,生产者还将为下游处理器设置标头。在制作者之前设置的任何标头都将被忽略。例如,如果您将 CouchDbId 设为标头,则不会将其用作插入的 id,则仍会使用文档的 id。

72.5. Message Body

组件将使用消息正文作为要插入的文档。如果正文是一个 String 实例,则会在插入前将其整合到 GSON 对象中。这意味着字符串必须是有效的 JSON,否则插入 / 更新将失败。如果正文是 com.google.gson.JsonElement 的实例,它将按原样进行插入。否则,生产者将抛出一个不支持的正文类型例外。

72.6. Samples

例如,如果要使用所有插入、更新和删除本地运行的 CouchDB 实例(端口 9999),则可以使用以下命令:

from("couchdb:http://localhost:9999").process(someProcessor);

如果您只想删除,您可以使用以下内容

from("couchdb:http://localhost:9999?updates=false").process(someProcessor);

如果您想将消息作为文档插入,则使用交换的正文

from("someProducingEndpoint").process(someProcessor).to("couchdb:http://localhost:9999")

第 73 章 Cassandra CQL 组件

作为 Camel 版本 2.15 可用

Apache Cassandra 是一个开源 NoSQL 数据库,旨在处理商用硬件上的大量内容。与 Amazon 的 DynamoDB 一样,Cassandra 具有对等的、无 master 的架构,以避免出现单一故障点和 garanty 高可用性。与 Google 的 BigTable 一样,Cassandra 数据采用列系列的结构,这些数据可通过 Thrift RPC API 或称为 CQL 的 SQL 类似的 API 进行访问。

此组件旨在使用 CQL3 API(而不是 Thrift API)集成 Cassandra 2.0+。它基于 DataStax 提供的 Cassandra Java Driver

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cassandraql</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>

73.1. URI 格式

端点可以启动 Cassandra 连接,或者使用现有的连接。

URI描述

cql:localhost/keyspace

单个主机默认端口,通常要测试

cql:host1,host2/keyspace

多主机,默认端口

cql:host1,host2:9042/keyspace

多主机自定义端口

cql:host1,host2

默认端口和密钥空间

cql:bean:sessionRef

提供的会话参考

cql:bean:clusterRef/keyspace

提供的集群参考

要微调 Cassandra 连接(SSL 选项、池选项、负载均衡策略、重试策略、reconnection policy…​),请创建自己的 Cluster 实例并将其提供给 Camel 端点。

73.2. Cassandra 选项

Cassandra CQL 组件没有选项。

Cassandra CQL 端点使用 URI 语法进行配置:

cql:beanRef:hosts:port/keyspace

使用以下路径和查询参数:

73.2.1. 路径名(4 参数):

名称描述默认类型

beanRef

beanRef 使用 bean:id 定义

 

字符串

主机

hostname (s) cassansdra server (s)。可以使用逗号分隔多个主机。

 

字符串

port

cassansdra server (s)的端口号

 

整数

keyspace

要使用的密钥空间

 

字符串

73.2.2. 查询参数(29 参数):

名称描述默认类型

cluster (common)

使用 Cluster 实例(您通常不使用这个选项)

 

集群

clusterName (common)

集群名称

 

字符串

consistencyLevel (common)

使用一致性级别

 

ConsistencyLevel

cql (common)

要执行的 CQL 查询。可使用密钥 CamelCqlQuery 的消息标头覆盖。

 

字符串

loadBalancingPolicy (common)

使用特定的 LoadBalancingPolicy

 

字符串

password (common)

会话身份验证的密码

 

字符串

prepareStatements (common)

是否使用 PreparedStatements 还是常规声明

true

布尔值

resultSetConversionStrategy (common)

使用实现 ResultSet 转换为消息正文(ONE, LIMIT_10, LIMIT_100…​

 

字符串

会话 (通用)

使用 Session 实例(您通常不使用这个选项)

 

session

username (common)

会话身份验证的用户名

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

73.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.cql.enabled

启用 cql 组件

true

布尔值

camel.component.cql.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

73.4. 消息

73.4.1. 传入信息

Camel Cassandra 端点预计将作为查询参数绑定到 CQL 语句的简单对象(对象或 Object [] 或 Collection<Object>)。如果消息正文为空或为空,则执行 CQL 查询而无需绑定参数。

标头:

  • CamelCqlQuery (可选、StringRegularStatement):CQL 查询可以是纯文本字符串,也可以使用 QueryBuilder 构建的。

73.4.2. 传出消息

Camel Cassandra 端点根据 结果SetConversionStrategy 生成一个或多个 Cassandra Row 对象:

 

  • 如果 resultSetConversionStrategyALLLIMIT_[0-9]+,则 列出<Row >
  • single'ow' if resultSetConversionStrategy is ONE
  • 否则,如果 resultSetConversionStrategyResultSetConversionStrategy的自定义实现

73.5. 软件仓库

Cassandra 可用于存储幂等和聚合 EIP 的消息密钥或消息。

Cassandra 可能不是排队用例的最佳工具,读取 Cassandra 反关联性队列和队列,如 datasets。建议使用这些表的 LeveledCompaction 和一个小的 GC 宽限期设置,以便快速删除多组行。

73.6. 幂等仓库

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 列,并可扩展为使用其他数据模型。

选项默认值描述

table

CAMEL_IDEMPOTENT

表名称

pkColumns

名称,密钥'

主键列

name

 

存储库名称,值用于 NAME

ttl

 

生存时间

writeConsistencyLevel

 

用于插入/删除密钥的一致性级别: ANYONETWOQUORUMLOCAL_QUORUM

readConsistencyLevel

 

用于读取/检查密钥的一致性级别: ONETWOQUORUMLOCAL_QUORUM

73.7. 聚合仓库

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 列,并可扩展为使用其他数据模型。

选项默认值描述

table

CAMEL_AGGREGATION

表名称

pkColumns

名称,密钥

主键列

exchangeIdColumn

EXCHANGE_ID

Exchange Id 列

exchangeColumn

EXCHANGE

Exchange content 列

name

 

存储库名称,值用于 NAME

ttl

 

交换时间到实时

writeConsistencyLevel

 

用于插入/删除交换的一致性级别: ANYONETWOQUORUMLOCAL_QUORUM

readConsistencyLevel

 

用于读取/检查交换的一致性级别: ONETWOQUORUMLOCAL_QUORUM

73.8. 例子

要在表上插入内容,您可以使用以下代码:

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")

相同的方法可用于更新或查询表。

第 74 章 crypto (JCE)组件

作为 Camel 版本 2.3 可用

使用 Camel 加密端点和 Java 的 Cryptographic 扩展可轻松为 Exchange 创建数字签名。Camel 提供了一组灵活的端点,它们可用于在交换工作流的一个部分中为交换创建签名,然后在工作流的后续部分中验证签名。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-crypto</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

74.1. 简介

数字签名利用了 Asymmetric Cryptographic 技术为消息签名。从(very)高级别,算法使用带有特殊属性的免费键对,该属性与一个密钥加密的特殊属性只能被另一个密钥解密。个私钥是安全的保护,用于"签署"消息,而另一公钥则与有兴趣验证已签名消息的任何人共享。消息通过使用私钥加密邮件摘要来签名。这个加密摘要与消息一起传输。另一方面,verifier 重新计算消息摘要,并使用公钥解密签名中的摘要。如果两个摘要都与验证器都匹配,则仅知道私钥的持有者才能创建签名。

Camel 使用 Java Cryptographic Extension 的 Signature 服务,执行创建交换签名的大量加密。以下是一些用于解释 Cryptography、Message 摘要和数字签名的机械资源,以及如何通过 JCE 来使用它们。

  • Bruce Schneier's Applied Cryptography
  • Cryptography with Java by David Hook
  • 以往的维基百科 Digital_signatures

74.2. URI 格式

如前所述,Camel 提供了一组加密端点来创建和验证签名

crypto:sign:name[?options]
crypto:verify:name[?options]
  • crypto:签名,创建签名并将其存储在恒定的 org.apache.camel.component.crypto.DigitalSignatureConstants.SIGNATURE 中的标头中。"CamelDigitalSignature".
  • crypto:验证 将在此标头的内容中读取并进行验证计算。

为了能正常工作,签名和验证进程需要共享的密钥对,签名需要 私钥 并验证 公钥 (或包含 证书 )。使用 JCE 生成这些密钥对非常简单,但通常最好使用 KeyStore 来安置和共享您的密钥。DSL 非常灵活,关于如何提供密钥并提供多个机制。

注意 加密:签名 端点通常在一个路由中定义,而免费 加密:在另一个路由中进行验证,尽管在它们后出现的一个示例中简单性。它不表示签名和验证应当相同。

74.3. 选项

Crypto (JCE)组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享的 DigitalSignatureConfiguration 作为配置

 

DigitalSignature Configuration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Crypto (JCE)端点使用 URI 语法配置:

crypto:cryptoOperation:name

使用以下路径和查询参数:

74.3.1. 路径名(2 参数):

名称描述默认类型

cryptoOperation

必需,从端点 uri 的加密方案后提供的 Crypto 操作设置为 Crypto 操作,即 crypto:sign 设置为操作。

 

CryptoOperation

name

必需 此操作的逻辑名称。

 

字符串

74.3.2. 查询参数(19 参数):

名称描述默认类型

algorithm (producer)

设置用于 signer 的 Algorithm 的 JCE 名称。

SHA1WithDSA

字符串

alias (producer)

设置用于查询 KeyStore 的密钥和链接 java.security.cert.Certificate Certificates 的别名,以用于签名和验证交换。这个值可以在运行时通过消息标题 org.apache.camel.component.crypto.DigitalSignatureConstants#KEYSTORE_ALIAS 在运行时提供。

 

字符串

certificateName (producer)

为 registry 中的 PrivateKey 设置引用名称。

 

字符串

keystore (producer)

设置可包含密钥的 KeyStore 和 Certficates,以用于签名和验证交换。KeyStore 通常与别名一起使用,即 Route 定义中提供的一个,或者通过消息标头 CamelSignatureKeyStoreAlias 动态地使用。如果没有提供别名,并且密钥存储中只有一个条目,则会使用这个单一条目。

 

KeyStore

keystoreName (producer)

为 registry 中的密钥存储设置引用名称。

 

字符串

privateKey (producer)

设置用于签署交换的 PrivateKey

 

PrivateKey

privateKeyName (producer)

为 registry 中的 PrivateKey 设置引用名称。

 

字符串

provider (producer)

设置提供配置的签名算法的安全供应商的 id。

 

字符串

publicKeyName (producer)

上下文更改时应解析的引用

 

字符串

secureRandomName (producer)

为 registry 中的安全Random 设置引用名称。

 

字符串

signatureHeaderName (producer)

设置用于存储 base64 编码签名的消息标头的名称。默认为 'CamelDigitalSignature'

 

字符串

bufferSize (advanced)

设置在 Exchange 有效负载数据中读取的缓冲大小。

2048

整数

证书 (高级)

设置用于根据交换中的签名根据其有效负载验证签名的证书。

 

证书

clearHeaders (advanced)

确定签名和验证后是否清除 Signature 特定标头。默认为 true,且仅应以其他方式作为重要的私有信息进行,如果未设置,则密钥和密码可能会退出。

true

布尔值

keyStoreParameters (advanced)

设置可包含密钥的 KeyStore 和 Certficates,以用于签名和验证基于给定 KeyStoreParameters 的交换。KeyStore 通常与别名一起使用,即 Route 定义中提供的一个,或者通过消息标头 CamelSignatureKeyStoreAlias 动态地使用。如果没有提供别名,并且密钥存储中只有一个条目,则会使用这个单一条目。

 

KeyStoreParameters

publicKey (advanced)

设置用于验证交换中的签名的 PublicKey。

 

PublicKey

secureRandom (advanced)

设置用于初始化签名服务的 SecureRandom

 

SecureRandom

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

密码 (安全)

设置用于访问 KeyStore 中的别名 PrivateKey 的密码。

 

字符串

74.4. Spring Boot Auto-Configuration

组件支持 33 选项,如下所示。

名称描述默认类型

camel.component.crypto.configuration.algorithm

设置用于 signer 的 Algorithm 的 JCE 名称。

SHA1WithDSA

字符串

camel.component.crypto.configuration.alias

设置用于查询 KeyStore 的密钥和链接 java.security.cert.Certificate Certificates 的别名,以用于签名和验证交换。这个值可以在运行时通过消息标题 org.apache.camel.component.crypto.DigitalSignatureConstants #KEYSTORE_ALIAS

 

字符串

camel.component.crypto.configuration.buffer-size

设置在 Exchange 有效负载数据中读取的缓冲大小。

2048

整数

camel.component.crypto.configuration.certificate

设置用于根据交换中的签名根据其有效负载验证签名的证书。

 

证书

camel.component.crypto.configuration.certificate-name

为 registry 中的 PrivateKey 设置引用名称。

 

字符串

camel.component.crypto.configuration.clear-headers

确定签名和验证后是否清除 Signature 特定标头。默认为 true,且仅应以其他方式作为重要的私有信息进行,如果未设置,则密钥和密码可能会退出。

true

布尔值

camel.component.crypto.configuration.crypto-operation

在 endpoint uri 的 crypto scheme 后设置 Crypto 操作,即 crypto scheme e.g. crypto:sign sets sign as the operation.

 

CryptoOperation

camel.component.crypto.configuration.key-store-parameters

设置可包含密钥的 KeyStore 和 Certficates,以用于签名和验证基于给定 KeyStoreParameters 的交换。KeyStore 通常与别名一起使用,即 Route 定义中提供的一个,或者通过消息标头 CamelSignatureKeyStoreAlias 动态地使用。如果没有提供别名,并且密钥存储中只有一个条目,则会使用这个单一条目。

 

KeyStoreParameters

camel.component.crypto.configuration.keystore

设置可包含密钥的 KeyStore 和 Certficates,以用于签名和验证交换。KeyStore 通常与别名一起使用,即 Route 定义中提供的一个,或者通过消息标头 CamelSignatureKeyStoreAlias 动态地使用。如果没有提供别名,并且密钥存储中只有一个条目,则会使用这个单一条目。

 

KeyStore

camel.component.crypto.configuration.keystore-name

为 registry 中的密钥存储设置引用名称。

 

字符串

camel.component.crypto.configuration.name

此操作的逻辑名称。

 

字符串

camel.component.crypto.configuration.password

设置用于访问 KeyStore 中的别名 PrivateKey 的密码。

 

Character[]

camel.component.crypto.configuration.private-key

设置用于签署交换的 PrivateKey

 

PrivateKey

camel.component.crypto.configuration.private-key-name

为 registry 中的 PrivateKey 设置引用名称。

 

字符串

camel.component.crypto.configuration.provider

设置提供配置的签名算法的安全供应商的 id。

 

字符串

camel.component.crypto.configuration.public-key

设置用于验证交换中的签名的 PublicKey。

 

PublicKey

camel.component.crypto.configuration.public-key-name

上下文更改时应解析的引用

 

字符串

camel.component.crypto.configuration.secure-random

设置用于初始化签名服务的 SecureRandom

 

SecureRandom

camel.component.crypto.configuration.secure-random-name

为 registry 中的安全Random 设置引用名称。

 

字符串

camel.component.crypto.configuration.signature-header-name

设置用于存储 base64 编码签名的消息标头的名称。默认为 'CamelDigitalSignature'

 

字符串

camel.component.crypto.enabled

启用加密组件

true

布尔值

camel.component.crypto.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.dataformat.crypto.algorithm

JCE 算法名称表示将使用的加密算法。默认为 DES/CBC/PKCS5Padding。

DES/CBC/PKCS5Padding

字符串

camel.dataformat.crypto.algorithm-parameter-ref

用于初始化 Cipher 的 JCE AlgorithmParameterSpec。将使用指定名称作为 java.security.spec.AlgorithmParameterSpec 类型查找类型。

 

字符串

camel.dataformat.crypto.buffersize

签名过程中使用的缓冲区的大小。

 

整数

camel.dataformat.crypto.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.crypto.crypto-provider

应使用的 JCE 安全提供程序的名称。

 

字符串

camel.dataformat.crypto.enabled

启用加密数据格式

true

布尔值

camel.dataformat.crypto.init-vector-ref

指的是包含初始化向量的字节阵列,用于初始化 Cipher。

 

字符串

camel.dataformat.crypto.inline

表示配置的 IV 应该内联到加密的数据流中的标志。默认为 false。

false

布尔值

camel.dataformat.crypto.key-ref

是指使用寄存器中查找的 secret 密钥。

 

字符串

camel.dataformat.crypto.mac-algorithm

JCE 算法名称表示消息身份验证算法。

HmacSHA1

字符串

camel.dataformat.crypto.should-append-h-m-a-c

表示消息身份验证代码应计算并附加到加密数据的标志。

false

布尔值

74.5. 使用

74.5.1. 原始密钥

签名和验证交换的最基本的方式是使用 KeyPair,如下所示:

可使用对键的 Spring XML 扩展 实现相同的操作

74.5.2. 密钥存储和别名.

JCE 为对私钥和证书进行非常通用的密钥存储概念,保持了加密和密码保护。可以通过在检索 API 中应用别名来检索它们。可以通过多种方式将密钥和证书放入密钥存储中,最常见的方法是通过外部"keytool"应用完成。这是 使用 keytool 使用自签名 Cert 和 Private key 创建 KeyStore 的好示例。

示例使用带有"bob"别名的密钥和证书的密钥存储。密钥存储的密码,键是"letmein"

下面介绍如何通过 Fluent builders 使用 Keystore,它还演示了如何加载和初始化密钥存储。

在 Spring 中,使用 ref 来查找实际的密钥存储实例。

74.5.3. 更改 JCE Provider 和 Algorithm

更改签名算法或安全提供程序是指定其名称的简单方法。您还需要使用与您选择的算法兼容的密钥。

或者

74.5.4. 更改签名消息头

可能需要更改用于存储签名的消息标头。可以在路由定义中指定不同的标头名称,如下所示

或者

74.5.5. 更改 buffersize

如果需要更新 buffer…​ 的大小

或者

74.5.6. 动态提供密钥。

当使用 Recipient 列表或类似的 EIP 时,交换的收件人可能会动态变化。在所有收件人中使用相同密钥可能并不可行。能够逐个交换动态指定签名密钥会很有用。然后,在签名前,可以使用其目标收件人的密钥动态增强交换。为便于这种签名机制,可以通过下面的消息标题动态提供密钥

  • Exchange.SIGNATURE_PRIVATE_KEY, "CamelSignaturePrivateKey"
  • Exchange.SIGNATURE_PUBLIC_KEY_OR_CERT, "CamelSignaturePublicKeyOrCert"

或者

更最好是动态提供密钥存储别名。再次在消息标头中提供别名

  • exchange.KEYSTORE_ALIAS,"CamelSignatureKeyStoreAlias"

或者

标头设置如下

Exchange unsigned = getMandatoryEndpoint("direct:alias-sign").createExchange();
unsigned.getIn().setBody(payload);
unsigned.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_ALIAS, "bob");
unsigned.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_PASSWORD, "letmein".toCharArray());
template.send("direct:alias-sign", unsigned);
Exchange signed = getMandatoryEndpoint("direct:alias-sign").createExchange();
signed.getIn().copyFrom(unsigned.getOut());
signed.getIn().setHeader(KEYSTORE_ALIAS, "bob");
template.send("direct:alias-verify", signed);

74.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 75 章 crypto CMS 组件

可作为 Camel 版本 2.20 可用

加密消息语法(CMS) 是为签名和加密消息建立了良好标准。Apache Crypto CMS 组件支持以下部分:* Content Type "Enveloped Data" with Key Transport (asymmetric key)、* Content Type "Signed Data"。您可以创建 CMS Enveloped Data 实例,解密 CMS Enveloped Data 实例,创建 CMS Signed Data 实例,并验证 CMS Signed Data 实例。

组件使用 Bouncy Castle 库 bcprov-jdk15on 和 bcpkix-jdk15on。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-crypto-cms</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

在调用此组件的端点前,我们建议您在应用程序中注册 Bouncy Castle 安全供应商:

Security.addProvider(new BouncyCastleProvider());

如果没有注册 Bouncy Castle 安全供应商,则 Crypto CMS 组件将注册该提供程序。

75.1. 选项

Crypto CMS 组件支持 3 个选项,它们如下所列。

名称描述默认类型

signedDataVerifier Configuration (advanced)

要配置共享的 SignedDataVerifierConfiguration,它会决定验证操作的 uri 参数。

 

SignedDataVerifier 配置

envelopedDataDecryptor Configuration (advanced)

要配置共享的 EnvelopedDataDecryptorConfiguration,这决定了解密操作的 uri 参数。

 

EnvelopedDataDecryptor 配置

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Crypto CMS 端点使用 URI 语法配置:

crypto-cms:cryptoOperation:name

使用以下路径和查询参数:

75.1.1. 路径名(2 参数):

名称描述默认类型

cryptoOperation

在 endpoint uri 的 crypto scheme e.g. crypto-cms:sign set sign as the operation. 可能的值有:签名、验证、加密或解密。

 

CryptoOperation

name

需要该 URI 中的 name 部分可以由用户选择,以便区分 camel 上下文中的不同 signer/verifier/encryptor/decryptor 端点。

 

字符串

75.1.2. 查询参数(15 参数):

名称描述默认类型

keyStore (common)

包含签名私钥的密钥存储,验证公钥、加密或公钥,以及根据操作解密或私钥。使用此参数或参数 'keyStoreParameters'。

 

KeyStore

keyStoreParameters (common)

包含签名密钥的密钥存储、验证公钥、加密或公钥、根据操作解密或私钥。使用此参数或参数 'keystore'。

 

KeyStoreParameters

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

密码 (解密)

设置私钥的密码。假设密钥存储中的所有私钥都具有相同的密码。如果没有设置,则假定私钥的密码由 KeyStoreParameters 中提供的密钥存储密码提供。

 

Char[]

fromBase64 (decrypt_verify)

如果为 true,则 CMS 信息是 base 64 编码,则必须在处理过程中进行解码。默认值为 false。

false

布尔值

contentEncryptionAlgorithm (encrypt)

加密算法,如 DESed/CBC/PKCS5Padding。进一步可能的值: DESed/CBC/PKCS5Padding, AES/CBC/PKCS5Padding, Camellia/CBC/PKCS5Padding, CAST5/CBC/PKCS5Padding.

 

字符串

originatorInformation Provider (encrypt)

原始器信息的供应商。请参阅 https://tools.ietf.org/html/rfc5652#section-6.1。默认值为 null。

 

OriginatorInformation Provider

recipient (encrypt)

接收者信息:引用实现接口 org.apache.camel.component.crypto.cms.api.TransRecipientInfo 的 bean

 

list

secretKeyLength (encrypt)

用于内容加密的 secret 对称密钥的密钥长度。只有指定的内容加密算法允许不同大小的密钥时才使用。如果 contentEncryptionAlgorithm=AES/CBC/PKCS5Padding 或 Camellia/CBC/PKCS5Padding then 128; if contentEncryptionAlgorithm=DESede/CBC/PKCS5Padding, then 192, 128; if strong encryption 然后,为 AES/CBC/PKCS5Padding 和 Camellia/PKCS5Padding 启用了 192/PKCS5Padding,密钥长度为 192 和 256。

 

int

unprotectedAttributes GeneratorProvider (encrypt)

不受保护的属性的生成器供应商。默认值为 null,这表示没有受保护的属性添加到 Enveloped Data 对象中。请参阅 https://tools.ietf.org/html/rfc5652#section-6.1

 

AttributesGenerator Provider

toBase64 (encrypt_sign)

指明已签署的数据还是 Enveloped Data 实例是否应采用 base64 编码。默认值为 false。

false

布尔值

includeContent (sign)

指明已签名的内容是否应当包含在 Signed Data 实例中。如果为 false,则在标头 CamelCryptoCmsSignedData 中创建一个分离的签名数据实例。

true

布尔值

signer (sign)

signer 信息:引用实现 org.apache.camel.component.crypto.cms.api.SignerInfo 的 bean

 

list

signedDataHeaderBase64 (verify)

指明标头 CamelCryptoCmsSignedData 中的值为 base64 编码。默认值为 false。仅与分离签名相关。在分离的签名案例中,标头包含 Signed Data 对象。

false

布尔值

verifySignaturesOfAll Signers (verify)

如果为 true,则验证 Signed Data 对象中包含的所有签名人的签名。如果为 false,则只验证签名信息是否与其中一个指定证书匹配。默认值为 true。

true

布尔值

75.2. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.crypto-cms.enabled

是否启用 crypto-cms 组件自动配置。默认启用。

 

布尔值

camel.component.crypto-cms.enveloped-data-decryptor-configuration

要配置共享的 EnvelopedDataDecryptorConfiguration,这决定了解密操作的 uri 参数。选项是一个 org.apache.camel.component.crypto.cms.crypt。EnvelopedDataDecryptorConfiguration 类型。

 

字符串

camel.component.crypto-cms.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.crypto-cms.signed-data-verifier-configuration

要配置共享的 SignedDataVerifierConfiguration,它会决定验证操作的 uri 参数。选项是一个 org.apache.camel.component.crypto.cms.sig.SignedDataVerifierConfiguration 类型。

 

字符串

75.3. Enveloped Data

请注意,crypto-cms:encypt 端点通常在一个路由中定义,而自由的 crypto-cms:decrypt 在另一个路由中被定义,尽管在它们后出现的一个示例中简单性。

以下示例演示了如何创建 Enveloped Data 消息,以及如何解密 Enveloped Data 消息。

Java DSL 中的基本示例

import org.apache.camel.util.jsse.KeyStoreParameters;
import org.apache.camel.component.crypto.cms.crypt.DefaultKeyTransRecipientInfo;
...
KeyStoreParameters keystore  = new KeyStoreParameters();
keystore.setType("JCEKS");
keystore.setResource("keystore/keystore.jceks);
keystore.setPassword("some_password"); // this password will also be used for accessing the private key if not specified in the crypto-cms:decrypt endpoint

DefaultKeyTransRecipientInfo recipient1 = new DefaultKeyTransRecipientInfo();
recipient1.setCertificateAlias("rsa"); // alias of the public key used for the encryption
recipient1.setKeyStoreParameters(keystore);

simpleReg.put("keyStoreParameters", keystore); // register keystore in the registry
simpleReg.put("recipient1", recipient1); // register recipient info in the registry

from("direct:start")
    .to("crypto-cms:encrypt://testencrpyt?toBase64=true&recipient=#recipient1&contentEncryptionAlgorithm=DESede/CBC/PKCS5Padding&secretKeyLength=128")
    .to("crypto-cms:decrypt://testdecrypt?fromBase64=true&keyStoreParameters=#keyStoreParameters")
    .to("mock:result");

Spring XML 中的基本示例

   <keyStoreParameters xmlns="http://camel.apache.org/schema/spring"
        id="keyStoreParameters1" resource="./keystore/keystore.jceks"
        password="some_password" type="JCEKS" />
    <bean id="recipient1"
        class="org.apache.camel.component.crypto.cms.crypt.DefaultKeyTransRecipientInfo">
        <property name="keyStoreParameters" ref="keyStoreParameters1" />
        <property name="certificateAlias" value="rsa" />
    </bean>
...
    <route>
        <from uri="direct:start" />
        <to uri="crypto-cms:encrypt://testencrpyt?toBase64=true&amp;recipient=#recipient1&amp;contentEncryptionAlgorithm=DESede/CBC/PKCS5Padding&amp;secretKeyLength=128" />
        <to uri="crypto-cms:decrypt://testdecrypt?fromBase64=true&amp;keyStoreParameters=#keyStoreParameters1" />
         <to uri="mock:result" />
    </route>

Java DSL 中的两个 Recipients

import org.apache.camel.util.jsse.KeyStoreParameters;
import org.apache.camel.component.crypto.cms.crypt.DefaultKeyTransRecipientInfo;
...
KeyStoreParameters keystore  = new KeyStoreParameters();
keystore.setType("JCEKS");
keystore.setResource("keystore/keystore.jceks);
keystore.setPassword("some_password"); // this password will also be used for accessing the private key if not specified in the crypto-cms:decrypt endpoint

DefaultKeyTransRecipientInfo recipient1 = new DefaultKeyTransRecipientInfo();
recipient1.setCertificateAlias("rsa"); // alias of the public key used for the encryption
recipient1.setKeyStoreParameters(keystore);

DefaultKeyTransRecipientInfo recipient2 = new DefaultKeyTransRecipientInfo();
recipient2.setCertificateAlias("dsa");
recipient2.setKeyStoreParameters(keystore);

simpleReg.put("keyStoreParameters", keystore); // register keystore in the registry
simpleReg.put("recipient1", recipient1); // register recipient info in the registry

from("direct:start")
    .to("crypto-cms:encrypt://testencrpyt?toBase64=true&recipient=#recipient1&recipient=#recipient2&contentEncryptionAlgorithm=DESede/CBC/PKCS5Padding&secretKeyLength=128")
    //the decryptor will automatically choose one of the two private keys depending which one is in the decryptor keystore
    .to("crypto-cms:decrypt://testdecrypt?fromBase64=true&keyStoreParameters=#keyStoreParameters")
    .to("mock:result");

Spring XML 中的两个 Recipients

   <keyStoreParameters xmlns="http://camel.apache.org/schema/spring"
        id="keyStoreParameters1" resource="./keystore/keystore.jceks"
        password="some_password" type="JCEKS" />
    <bean id="recipient1"
        class="org.apache.camel.component.crypto.cms.crypt.DefaultKeyTransRecipientInfo">
        <property name="keyStoreParameters" ref="keyStoreParameters1" />
        <property name="certificateAlias" value="rsa" />
    </bean>
    <bean id="recipient2"
        class="org.apache.camel.component.crypto.cms.crypt.DefaultKeyTransRecipientInfo">
        <property name="keyStoreParameters" ref="keyStoreParameters1" />
        <property name="certificateAlias" value="dsa" />
    </bean>
...
    <route>
        <from uri="direct:start" />
        <to uri="crypto-cms:encrypt://testencrpyt?toBase64=true&amp;recipient=#recipient1&amp;recipient=#recipient2&amp;contentEncryptionAlgorithm=DESede/CBC/PKCS5Padding&amp;secretKeyLength=128" />
        <!-- the decryptor will automatically choose one of the two private keys depending which one is in the decryptor keystore -->
        <to uri="crypto-cms:decrypt://testdecrypt?fromBase64=true&amp;keyStoreParameters=#keyStoreParameters1" />
         <to uri="mock:result" />
    </route>

75.4. 签名的数据

请注意,一个 crypto-cms:sign 端点通常在一个路由中定义,而在另一个路由中进行免费 crypto-cms:verify,尽管在它们后出现的一个示例中简单明了。

以下示例演示了如何创建 Signed Data 消息,以及如何验证已签名的数据消息。

Java DSL 中的基本示例

import org.apache.camel.util.jsse.KeyStoreParameters;
import org.apache.camel.component.crypto.cms.sig.DefaultSignerInfo;
...
KeyStoreParameters keystore  = new KeyStoreParameters();
keystore.setType("JCEKS");
keystore.setResource("keystore/keystore.jceks);
keystore.setPassword("some_password"); // this password will also be used for accessing the private key if not specified in the signerInfo1 bean

//Signer Information, by default the following signed attributes are included: contentType, signingTime, messageDigest, and cmsAlgorithmProtect; by default no unsigned attribute is included.
// If you want to add your own signed attributes or unsigned attributes, see methods DefaultSignerInfo.setSignedAttributeGenerator and DefaultSignerInfo.setUnsignedAttributeGenerator.
DefaultSignerInfo signerInfo1 = new DefaultSignerInfo();
signerInfo1.setIncludeCertificates(true); // if set to true then the certificate chain of the private key will be added to the Signed Data object
signerInfo1.setSignatureAlgorithm("SHA256withRSA"); // signature algorithm; attention, the signature algorithm must fit to the signer private key.
signerInfo1.setPrivateKeyAlias("rsa"); // alias of the private key used for the signing
signerInfo1.setPassword("private_key_pw".toCharArray()); // optional parameter, if not set then the password of the KeyStoreParameters will be used for accessing the private key
signerInfo1.setKeyStoreParameters(keystore);

simpleReg.put("keyStoreParameters", keystore); //register keystore in the registry
simpleReg.put("signer1", signerInfo1); //register signer info in the registry

from("direct:start")
    .to("crypto-cms:sign://testsign?signer=#signer1&includeContent=true&toBase64=true")
    .to("crypto-cms:verify://testverify?keyStoreParameters=#keyStoreParameters&fromBase64=true"")
    .to("mock:result");

Spring XML 中的基本示例

   <keyStoreParameters xmlns="http://camel.apache.org/schema/spring"
        id="keyStoreParameters1" resource="./keystore/keystore.jceks"
        password="some_password" type="JCEKS" />
    <bean id="signer1"
        class="org.apache.camel.component.crypto.cms.sig.DefaultSignerInfo">
        <property name="keyStoreParameters" ref="keyStoreParameters1" />
        <property name="privateKeyAlias" value="rsa" />
        <property name="signatureAlgorithm" value="SHA256withRSA" />
        <property name="includeCertificates" value="true" />
        <!-- optional parameter 'password', if not set then the password of the KeyStoreParameters will be used for accessing the private key -->
        <property name="password" value="private_key_pw" />
    </bean>
...
    <route>
        <from uri="direct:start" />
        <to uri="crypto-cms:sign://testsign?signer=#signer1&amp;includeContent=true&amp;toBase64=true" />
        <to uri="crypto-cms:verify://testverify?keyStoreParameters=#keyStoreParameters1&amp;fromBase64=true" />
        <to uri="mock:result" />
    </route>

Java DSL 中有两个 Signers 的示例

import org.apache.camel.util.jsse.KeyStoreParameters;
import org.apache.camel.component.crypto.cms.sig.DefaultSignerInfo;
...
KeyStoreParameters keystore  = new KeyStoreParameters();
keystore.setType("JCEKS");
keystore.setResource("keystore/keystore.jceks);
keystore.setPassword("some_password"); // this password will also be used for accessing the private key if not specified in the signerInfo1 bean

//Signer Information, by default the following signed attributes are included: contentType, signingTime, messageDigest, and cmsAlgorithmProtect; by default no unsigned attribute is included.
// If you want to add your own signed attributes or unsigned attributes, see methods DefaultSignerInfo.setSignedAttributeGenerator and DefaultSignerInfo.setUnsignedAttributeGenerator.
DefaultSignerInfo signerInfo1 = new DefaultSignerInfo();
signerInfo1.setIncludeCertificates(true); // if set to true then the certificate chain of the private key will be added to the Signed Data object
signerInfo1.setSignatureAlgorithm("SHA256withRSA"); // signature algorithm; attention, the signature algorithm must fit to the signer private key.
signerInfo1.setPrivateKeyAlias("rsa"); // alias of the private key used for the signing
signerInfo1.setPassword("private_key_pw".toCharArray()); // optional parameter, if not set then the password of the KeyStoreParameters will be used for accessing the private key
signerInfo1.setKeyStoreParameters(keystore);

DefaultSignerInfo signerInfo2 = new DefaultSignerInfo();
signerInfo2.setIncludeCertificates(true);
signerInfo2.setSignatureAlgorithm("SHA256withDSA");
signerInfo2.setPrivateKeyAlias("dsa");
signerInfo2.setKeyStoreParameters(keystore);


simpleReg.put("keyStoreParameters", keystore); //register keystore in the registry
simpleReg.put("signer1", signerInfo1); //register signer info in the registry
simpleReg.put("signer2", signerInfo2); //register signer info in the registry

from("direct:start")
    .to("crypto-cms:sign://testsign?signer=#signer1&signer=#signer2&includeContent=true")
    .to("crypto-cms:verify://testverify?keyStoreParameters=#keyStoreParameters")
    .to("mock:result");

Spring XML 中有两个 Signers 的示例

   <keyStoreParameters xmlns="http://camel.apache.org/schema/spring"
        id="keyStoreParameters1" resource="./keystore/keystore.jceks"
        password="some_password" type="JCEKS" />
    <bean id="signer1"
        class="org.apache.camel.component.crypto.cms.sig.DefaultSignerInfo">
        <property name="keyStoreParameters" ref="keyStoreParameters1" />
        <property name="privateKeyAlias" value="rsa" />
        <property name="signatureAlgorithm" value="SHA256withRSA" />
        <property name="includeCertificates" value="true" />
        <!-- optional parameter 'password', if not set then the password of the KeyStoreParameters will be used for accessing the private key -->
        <property name="password" value="private_key_pw" />
    </bean>
    <bean id="signer2"
        class="org.apache.camel.component.crypto.cms.sig.DefaultSignerInfo">
        <property name="keyStoreParameters" ref="keyStoreParameters1" />
        <property name="privateKeyAlias" value="dsa" />
        <property name="signatureAlgorithm" value="SHA256withDSA" />
        <!-- optional parameter 'password', if not set then the password of the KeyStoreParameters will be used for accessing the private key -->
        <property name="password" value="private_key_pw2" />
    </bean>
...
    <route>
        <from uri="direct:start" />
        <to uri="crypto-cms:sign://testsign?signer=#signer1&amp;signer=#signer2&amp;includeContent=true" />
        <to uri="crypto-cms:verify://testverify?keyStoreParameters=#keyStoreParameters1" />
        <to uri="mock:result" />
    </route>

Java DSL 中的分离签名示例

import org.apache.camel.util.jsse.KeyStoreParameters;
import org.apache.camel.component.crypto.cms.sig.DefaultSignerInfo;
...
KeyStoreParameters keystore  = new KeyStoreParameters();
keystore.setType("JCEKS");
keystore.setResource("keystore/keystore.jceks);
keystore.setPassword("some_password"); // this password will also be used for accessing the private key if not specified in the signerInfo1 bean

//Signer Information, by default the following signed attributes are included: contentType, signingTime, messageDigest, and cmsAlgorithmProtect; by default no unsigned attribute is included.
// If you want to add your own signed attributes or unsigned attributes, see methods DefaultSignerInfo.setSignedAttributeGenerator and DefaultSignerInfo.setUnsignedAttributeGenerator.
DefaultSignerInfo signerInfo1 = new DefaultSignerInfo();
signerInfo1.setIncludeCertificates(true); // if set to true then the certificate chain of the private key will be added to the Signed Data object
signerInfo1.setSignatureAlgorithm("SHA256withRSA"); // signature algorithm; attention, the signature algorithm must fit to the signer private key.
signerInfo1.setPrivateKeyAlias("rsa"); // alias of the private key used for the signing
signerInfo1.setPassword("private_key_pw".toCharArray()); // optional parameter, if not set then the password of the KeyStoreParameters will be used for accessing the private key
signerInfo1.setKeyStoreParameters(keystore);

simpleReg.put("keyStoreParameters", keystore); //register keystore in the registry
simpleReg.put("signer1", signerInfo1); //register signer info in the registry

from("direct:start")
     //with the option includeContent=false the SignedData object without the signed text will be written into the header "CamelCryptoCmsSignedData"
    .to("crypto-cms:sign://testsign?signer=#signer1&includeContent=false&toBase64=true")
    //the verifier reads the Signed Data object form the header CamelCryptoCmsSignedData and assumes that the signed content is in the message body
    .to("crypto-cms:verify://testverify?keyStoreParameters=#keyStoreParameters&signedDataHeaderBase64=true")
    .to("mock:result");

Spring XML 中的分离签名示例

   <keyStoreParameters xmlns="http://camel.apache.org/schema/spring"
        id="keyStoreParameters1" resource="./keystore/keystore.jceks"
        password="some_password" type="JCEKS" />
    <bean id="signer1"
        class="org.apache.camel.component.crypto.cms.sig.DefaultSignerInfo">
        <property name="keyStoreParameters" ref="keyStoreParameters1" />
        <property name="privateKeyAlias" value="rsa" />
        <property name="signatureAlgorithm" value="SHA256withRSA" />
        <property name="includeCertificates" value="true" />
        <!-- optional parameter 'password', if not set then the password of the KeyStoreParameters will be used for accessing the private key -->
        <property name="password" value="private_key_pw" />
    </bean>
...
    <route>
        <from uri="direct:start" />
        <!-- with the option includeContent=false the SignedData object without the signed text will be written into the header "CamelCryptoCmsSignedData" -->
        <to uri="crypto-cms:sign://testsign?signer=#signer1&amp;includeContent=false&amp;toBase64=true" />
        <!-- the verifier reads the Signed Data object form the header CamelCryptoCmsSignedData and assumes that the signed content is in the message body -->
        <to uri="crypto-cms:verify://testverify?keyStoreParameters=#keyStoreParameters1&amp;signedDataHeaderBase64=true" />
        <to uri="mock:result" />
    </route>

第 76 章 crypto (Java Cryptographic Extension) DataFormat

作为 Camel 版本 2.3 可用

Crypto Data Format 将 Java Cryptographic Extension 集成到 Camel 中,允许使用 Camel 熟悉的 marshall 和 unmarshal 格式机制进行简单、灵活的加密和解密消息。它假定 marshalling 为意味着对cyphertext 和 unmarshalling 的加密功能,意味着解密回原始明文。此数据格式仅实施对称(共享密钥)加密和取消处理。

76.1. CryptoDataFormat Options

Crypto (Java Cryptoic Extension)数据格式支持 10 个选项,它们列如下。

名称默认Java 类型描述

algorithm

DES/CBC/PKCS5Padding

字符串

JCE 算法名称表示将使用的加密算法。默认为 DES/CBC/PKCS5Padding。

cryptoProvider

 

字符串

应使用的 JCE 安全提供程序的名称。

keyRef

 

字符串

是指使用寄存器中查找的 secret 密钥。

initVectorRef

 

字符串

指的是包含初始化向量的字节阵列,用于初始化 Cipher。

algorithmParameterRef

 

字符串

用于初始化 Cipher 的 JCE AlgorithmParameterSpec。将使用指定名称作为 java.security.spec.AlgorithmParameterSpec 类型查找类型。

buffersize

 

整数

签名过程中使用的缓冲区的大小。

macAlgorithm

HmacSHA1

字符串

JCE 算法名称表示消息身份验证算法。

shouldAppendHMAC

false

布尔值

表示消息身份验证代码应计算并附加到加密数据的标志。

inline

false

布尔值

表示配置的 IV 应该内联到加密的数据流中的标志。默认为 false。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

76.2. Spring Boot Auto-Configuration

组件支持 33 选项,如下所示。

名称描述默认类型

camel.component.crypto.configuration.algorithm

设置用于 signer 的 Algorithm 的 JCE 名称。

SHA1WithDSA

字符串

camel.component.crypto.configuration.alias

设置用于查询 KeyStore 的密钥和链接 java.security.cert.Certificate Certificates 的别名,以用于签名和验证交换。这个值可以在运行时通过消息标题 org.apache.camel.component.crypto.DigitalSignatureConstants #KEYSTORE_ALIAS

 

字符串

camel.component.crypto.configuration.buffer-size

设置在 Exchange 有效负载数据中读取的缓冲大小。

2048

整数

camel.component.crypto.configuration.certificate

设置用于根据交换中的签名根据其有效负载验证签名的证书。

 

证书

camel.component.crypto.configuration.certificate-name

为 registry 中的 PrivateKey 设置引用名称。

 

字符串

camel.component.crypto.configuration.clear-headers

确定签名和验证后是否清除 Signature 特定标头。默认为 true,且仅应以其他方式作为重要的私有信息进行,如果未设置,则密钥和密码可能会退出。

true

布尔值

camel.component.crypto.configuration.crypto-operation

在 endpoint uri 的 crypto scheme 后设置 Crypto 操作,即 crypto scheme e.g. crypto:sign sets sign as the operation.

 

CryptoOperation

camel.component.crypto.configuration.key-store-parameters

设置可包含密钥的 KeyStore 和 Certficates,以用于签名和验证基于给定 KeyStoreParameters 的交换。KeyStore 通常与别名一起使用,即 Route 定义中提供的一个,或者通过消息标头 CamelSignatureKeyStoreAlias 动态地使用。如果没有提供别名,并且密钥存储中只有一个条目,则会使用这个单一条目。

 

KeyStoreParameters

camel.component.crypto.configuration.keystore

设置可包含密钥的 KeyStore 和 Certficates,以用于签名和验证交换。KeyStore 通常与别名一起使用,即 Route 定义中提供的一个,或者通过消息标头 CamelSignatureKeyStoreAlias 动态地使用。如果没有提供别名,并且密钥存储中只有一个条目,则会使用这个单一条目。

 

KeyStore

camel.component.crypto.configuration.keystore-name

为 registry 中的密钥存储设置引用名称。

 

字符串

camel.component.crypto.configuration.name

此操作的逻辑名称。

 

字符串

camel.component.crypto.configuration.password

设置用于访问 KeyStore 中的别名 PrivateKey 的密码。

 

Character[]

camel.component.crypto.configuration.private-key

设置用于签署交换的 PrivateKey

 

PrivateKey

camel.component.crypto.configuration.private-key-name

为 registry 中的 PrivateKey 设置引用名称。

 

字符串

camel.component.crypto.configuration.provider

设置提供配置的签名算法的安全供应商的 id。

 

字符串

camel.component.crypto.configuration.public-key

设置用于验证交换中的签名的 PublicKey。

 

PublicKey

camel.component.crypto.configuration.public-key-name

上下文更改时应解析的引用

 

字符串

camel.component.crypto.configuration.secure-random

设置用于初始化签名服务的 SecureRandom

 

SecureRandom

camel.component.crypto.configuration.secure-random-name

为 registry 中的安全Random 设置引用名称。

 

字符串

camel.component.crypto.configuration.signature-header-name

设置用于存储 base64 编码签名的消息标头的名称。默认为 'CamelDigitalSignature'

 

字符串

camel.component.crypto.enabled

启用加密组件

true

布尔值

camel.component.crypto.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.dataformat.crypto.algorithm

JCE 算法名称表示将使用的加密算法。默认为 DES/CBC/PKCS5Padding。

DES/CBC/PKCS5Padding

字符串

camel.dataformat.crypto.algorithm-parameter-ref

用于初始化 Cipher 的 JCE AlgorithmParameterSpec。将使用指定名称作为 java.security.spec.AlgorithmParameterSpec 类型查找类型。

 

字符串

camel.dataformat.crypto.buffersize

签名过程中使用的缓冲区的大小。

 

整数

camel.dataformat.crypto.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.crypto.crypto-provider

应使用的 JCE 安全提供程序的名称。

 

字符串

camel.dataformat.crypto.enabled

启用加密数据格式

true

布尔值

camel.dataformat.crypto.init-vector-ref

指的是包含初始化向量的字节阵列,用于初始化 Cipher。

 

字符串

camel.dataformat.crypto.inline

表示配置的 IV 应该内联到加密的数据流中的标志。默认为 false。

false

布尔值

camel.dataformat.crypto.key-ref

是指使用寄存器中查找的 secret 密钥。

 

字符串

camel.dataformat.crypto.mac-algorithm

JCE 算法名称表示消息身份验证算法。

HmacSHA1

字符串

camel.dataformat.crypto.should-append-h-m-a-c

表示消息身份验证代码应计算并附加到加密数据的标志。

false

布尔值

ND

76.3. 基本用法

在其最基本的中,需要加密/解密交换是共享密钥。如果 Crypto 数据格式的一个或多个实例配置了该密钥,则可以使用格式加密一个路由(或一部分)的有效负载,另一部分解密。例如,使用 Java DSL,如下所示:

KeyGenerator generator = KeyGenerator.getInstance("DES");

CryptoDataFormat cryptoFormat = new CryptoDataFormat("DES", generator.generateKey());

from("direct:basic-encryption")
    .marshal(cryptoFormat)
    .to("mock:encrypted")
    .unmarshal(cryptoFormat)
    .to("mock:unencrypted");

在 Spring 中,数据格式首先配置,然后在路由中使用

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <dataFormats>
    <crypto id="basic" algorithm="DES" keyRef="desKey" />
  </dataFormats>
    ...
  <route>
    <from uri="direct:basic-encryption" />
    <marshal ref="basic" />
    <to uri="mock:encrypted" />
    <unmarshal ref="basic" />
    <to uri="mock:unencrypted" />
  </route>
</camelContext>

76.4. 指定加密算法

更改算法是提供 JCE 算法名称的关键。如果您更改了使用兼容密钥的算法。

KeyGenerator generator = KeyGenerator.getInstance("DES");

CryptoDataFormat cryptoFormat = new CryptoDataFormat("DES", generator.generateKey());
cryptoFormat.setShouldAppendHMAC(true);
cryptoFormat.setMacAlgorithm("HmacMD5");

from("direct:hmac-algorithm")
    .marshal(cryptoFormat)
    .to("mock:encrypted")
    .unmarshal(cryptoFormat)
    .to("mock:unencrypted");

Java 7 中可用算法列表可以通过 Java Cryptography Architecture Standard Algorithm Name 文档获得。

76.5. 指定初始化向量

某些加密算法(特别是块算法)需要配置一个初始数据块,称为初始化向量。在 JCE 中,当 Cipher 被初始化时,这被作为 AlgorithmParameterSpec 传递。要将此类向量用于 CryptoDataFormat,您可以使用包含所需数据的字节[] 进行配置,例如:

KeyGenerator generator = KeyGenerator.getInstance("DES");
byte[] initializationVector = new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

CryptoDataFormat cryptoFormat = new CryptoDataFormat("DES/CBC/PKCS5Padding", generator.generateKey());
cryptoFormat.setInitializationVector(initializationVector);

from("direct:init-vector")
    .marshal(cryptoFormat)
    .to("mock:encrypted")
    .unmarshal(cryptoFormat)
    .to("mock:unencrypted");

使用 spring,复制对字节[] 的引用。

<crypto id="initvector" algorithm="DES/CBC/PKCS5Padding" keyRef="desKey" initVectorRef="initializationVector" />

在加密和解密阶段都需要相同的向量。由于不需要将 IV 保持一个 secret,DataFormat 允许将其内联到加密数据中,然后读取在解密阶段以初始化 Cipher。要内联 IV 设置 /oinline 标志。

KeyGenerator generator = KeyGenerator.getInstance("DES");
byte[] initializationVector = new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
SecretKey key = generator.generateKey();

CryptoDataFormat cryptoFormat = new CryptoDataFormat("DES/CBC/PKCS5Padding", key);
cryptoFormat.setInitializationVector(initializationVector);
cryptoFormat.setShouldInlineInitializationVector(true);
CryptoDataFormat decryptFormat = new CryptoDataFormat("DES/CBC/PKCS5Padding", key);
decryptFormat.setShouldInlineInitializationVector(true);

from("direct:inline")
    .marshal(cryptoFormat)
    .to("mock:encrypted")
    .unmarshal(decryptFormat)
    .to("mock:unencrypted");

也可借助 spring。

<crypto id="inline" algorithm="DES/CBC/PKCS5Padding" keyRef="desKey" initVectorRef="initializationVector"
  inline="true" />
<crypto id="inline-decrypt" algorithm="DES/CBC/PKCS5Padding" keyRef="desKey" inline="true" />

有关使用 Initialization Vectors 的更多信息,请参考

76.6. 散列消息身份验证代码(HMAC)

为了避免对加密数据进行攻击,同时在传输 CryptoDataFormat 时也可以根据可配置的 MAC 算法为加密交换内容计算消息身份验证代码。在加密后,计算的 HMAC 会附加到流中。它与解密阶段的流分离。对该 MAC 进行重新计算并验证,并根据传输中的传输中没有修改的问题。有关 Message Authentication Codes 的更多信息,请参阅 http://en.wikipedia.org/wiki/HMAC

KeyGenerator generator = KeyGenerator.getInstance("DES");

CryptoDataFormat cryptoFormat = new CryptoDataFormat("DES", generator.generateKey());
cryptoFormat.setShouldAppendHMAC(true);

from("direct:hmac")
    .marshal(cryptoFormat)
    .to("mock:encrypted")
    .unmarshal(cryptoFormat)
    .to("mock:unencrypted");

也可借助 spring。

<crypto id="hmac" algorithm="DES" keyRef="desKey" shouldAppendHMAC="true" />

默认情况下,HMAC 使用 HmacSHA1 mac 算法计算,虽然可以通过提供不同的算法名称来轻松更改。请查看这里了解如何通过配置的安全供应商提供哪些算法

KeyGenerator generator = KeyGenerator.getInstance("DES");

CryptoDataFormat cryptoFormat = new CryptoDataFormat("DES", generator.generateKey());
cryptoFormat.setShouldAppendHMAC(true);
cryptoFormat.setMacAlgorithm("HmacMD5");

from("direct:hmac-algorithm")
    .marshal(cryptoFormat)
    .to("mock:encrypted")
    .unmarshal(cryptoFormat)
    .to("mock:unencrypted");

也可借助 spring。

<crypto id="hmac-algorithm" algorithm="DES" keyRef="desKey" macAlgorithm="HmacMD5" shouldAppendHMAC="true" />

76.7. 动态提供密钥

当使用 Recipient 列表或类似的 EIP 时,交换的收件人可能会动态变化。在所有收件人中使用相同密钥可能并不可行。能够在每次交换时动态指定密钥会很有用。然后,在由数据格式处理前,交换可以被动态地利用其目标接收者的密钥进行动态增强。为便于此数据,DataFormat 允许通过下面的消息标题动态提供密钥

  • CryptoDataFormat.KEY "CamelCryptoKey"
CryptoDataFormat cryptoFormat = new CryptoDataFormat("DES", null);
/**
 * Note: the header containing the key should be cleared after
 * marshalling to stop it from leaking by accident and
 * potentially being compromised. The processor version below is
 * arguably better as the key is left in the header when you use
 * the DSL leaks the fact that camel encryption was used.
 */
from("direct:key-in-header-encrypt")
    .marshal(cryptoFormat)
    .removeHeader(CryptoDataFormat.KEY)
    .to("mock:encrypted");

from("direct:key-in-header-decrypt").unmarshal(cryptoFormat).process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        exchange.getIn().getHeaders().remove(CryptoDataFormat.KEY);
        exchange.getOut().copyFrom(exchange.getIn());
    }
}).to("mock:unencrypted");

也可借助 spring。

<crypto id="nokey" algorithm="DES" />

76.8. 依赖项

要使用 camel 路由的 Crypto dataformat,您需要向您的 pom 添加以下依赖项:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-crypto</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

76.9. 另请参阅

第 77 章 CSV DataFormat

作为 Camel 版本 1.3 提供

CSV 数据格式使用 Apache Commons CSV 处理 CSV 有效负载(Comma09arated Values),比如由 Excel 导出/导入的值。

77.1. 选项

CSV 数据格式支持 28 选项,它们列如下。

名称默认Java 类型描述

formatRef

 

字符串

要使用的引用格式,则会使用其他格式选项进行更新,默认值为 CSVFormat.DEFAULT

formatName

 

字符串

要使用的格式的名称,默认值为 CSVFormat.DEFAULT

commentMarkerDisabled

false

布尔值

禁用参考格式的注释标记。

commentMarker

 

字符串

设置参考格式的注释标记。

delimiter

 

字符串

设置要使用的分隔符。默认值为 ,(comma)

escapeDisabled

false

布尔值

使用 来使用转义字符禁用

escape

 

字符串

设置要使用的转义字符

headerDisabled

false

布尔值

使用 禁用标头

header

 

list

配置 CSV 标头

allowMissingColumnNames

false

布尔值

是否允许缺少列名称。

ignoreEmptyLines

false

布尔值

是否忽略空行。

ignoreSurroundingSpaces

false

布尔值

是否要忽略周围的空格

nullStringDisabled

false

布尔值

用于禁用 null 字符串

nullString

 

字符串

设置 null 字符串

quoteDisabled

false

布尔值

用于禁用引号

quote

 

字符串

设置默认为引号

recordSeparatorDisabled

 

字符串

用于禁用记录分隔符

recordSeparator

 

字符串

设置记录分隔符(也称为新行),默认为换行字符(CRLF)

skipHeaderRecord

false

布尔值

是否跳过输出中的标头记录

quoteMode

 

字符串

设置 quote 模式

ignoreHeaderCase

false

布尔值

设置在访问标头名称时是否忽略大小写。

trim

false

布尔值

设定是否修剪前导和尾随空白。

trailingDelimiter

false

布尔值

设置是否添加尾随分隔符。

lazyLoad

false

布尔值

只要所有行都必须被读取,则未编出出行是否应该生成迭代器器。

useMaps

false

布尔值

unmarshalling 是否应该为行值而不是列表生成映射(HashMap)。它需要有标头(已定义或收集)。

useOrderedMaps

false

布尔值

unmarshalling 是否应该为行值而不是列表生成排序映射(LinkedHashMap)。它需要有标头(已定义或收集)。

recordConverterRef

 

字符串

是指要使用 registry 的自定义 CsvRecordConverter。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

77.2. Spring Boot Auto-Configuration

组件支持 29 选项,它们如下所列。

名称描述默认类型

camel.dataformat.csv.allow-missing-column-names

是否允许缺少列名称。

false

布尔值

camel.dataformat.csv.comment-marker

设置参考格式的注释标记。

 

字符串

camel.dataformat.csv.comment-marker-disabled

禁用参考格式的注释标记。

false

布尔值

camel.dataformat.csv.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.csv.delimiter

设置要使用的分隔符。默认值为 ,(comma)

 

字符串

camel.dataformat.csv.enabled

启用 csv dataformat

true

布尔值

camel.dataformat.csv.escape

设置要使用的转义字符

 

字符串

camel.dataformat.csv.escape-disabled

使用 来使用转义字符禁用

false

布尔值

camel.dataformat.csv.format-name

要使用的格式的名称,默认值为 CSVFormat.DEFAULT

 

字符串

camel.dataformat.csv.format-ref

要使用的引用格式,则会使用其他格式选项进行更新,默认值为 CSVFormat.DEFAULT

 

字符串

camel.dataformat.csv.header

配置 CSV 标头

 

list

camel.dataformat.csv.header-disabled

使用 禁用标头

false

布尔值

camel.dataformat.csv.ignore-empty-lines

是否忽略空行。

false

布尔值

camel.dataformat.csv.ignore-header-case

设置在访问标头名称时是否忽略大小写。

false

布尔值

camel.dataformat.csv.ignore-surrounding-spaces

是否要忽略周围的空格

false

布尔值

camel.dataformat.csv.lazy-load

只要所有行都必须被读取,则未编出出行是否应该生成迭代器器。

false

布尔值

camel.dataformat.csv.null-string

设置 null 字符串

 

字符串

camel.dataformat.csv.null-string-disabled

用于禁用 null 字符串

false

布尔值

camel.dataformat.csv.quote

设置默认为引号

 

字符串

camel.dataformat.csv.quote-disabled

用于禁用引号

false

布尔值

camel.dataformat.csv.quote-mode

设置 quote 模式

 

字符串

camel.dataformat.csv.record-converter-ref

是指要使用 registry 的自定义 CsvRecordConverter。

 

字符串

camel.dataformat.csv.record-separator

设置记录分隔符(也称为新行),默认为换行字符(CRLF)

 

字符串

camel.dataformat.csv.record-separator-disabled

用于禁用记录分隔符

 

字符串

camel.dataformat.csv.skip-header-record

是否跳过输出中的标头记录

false

布尔值

camel.dataformat.csv.trailing-delimiter

设置是否添加尾随分隔符。

false

布尔值

camel.dataformat.csv.trim

设定是否修剪前导和尾随空白。

false

布尔值

camel.dataformat.csv.use-maps

unmarshalling 是否应该为行值而不是列表生成映射(HashMap)。它需要有标头(已定义或收集)。

false

布尔值

camel.dataformat.csv.use-ordered-maps

unmarshalling 是否应该为行值而不是列表生成排序映射(LinkedHashMap)。它需要有标头(已定义或收集)。

false

布尔值

ND

77.3. 将 map 整合到 CSV

通过该组件,您可以将 Java map (或任何可在映射中转换的消息类型)进行汇总为 CSV 有效负载。

考虑以下正文

Map<String, Object> body = new LinkedHashMap<>();
body.put("foo", "abc");
body.put("bar", 123);

这个 Java 路由定义

from("direct:start")
    .marshal().csv()
    .to("mock:result");

或者此 XML 路由定义

<route>
    <from uri="direct:start" />
    <marshal>
        <csv />
    </marshal>
    <to uri="mock:result" />
</route>

然后它将生成

abc,123

77.4. 将 CSV 消息解压缩到一个 Java 列表中

取消汇总会将 CSV 机码转换为带有 CSV 文件行的 Java 列表(包含所有字段值包含另一个列表)。

示例:我们有一个 CSV 文件,其名称为用户角色、IQ 及其当前活动。

Jack Dalton, 115, mad at Averell
Joe Dalton, 105, calming Joe
William Dalton, 105, keeping Joe from killing Averell
Averell Dalton, 80, playing with Rantanplan
Lucky Luke, 120, capturing the Daltons

现在,我们可以使用 CSV 组件来总结此文件:

from("file:src/test/resources/?fileName=daltons.csv&noop=true")
    .unmarshal().csv()
    .to("mock:daltons");

生成的消息将包含 List< List<String>>,如…​

List<List<String>> data = (List<List<String>>) exchange.getIn().getBody();
for (List<String> line : data) {
    LOG.debug(String.format("%s has an IQ of %s and is currently %s", line.get(0), line.get(1), line.get(2)));
}

77.5. marshalling a List<Map> 到 CSV

可从 Camel 2.1 开始

如果您有多个要提取的数据的行以 CSV 格式,则您可以将消息有效负载存储为 List<Map<String, Object>> 对象,其中列表包含每行的一个映射。

77.6. CSV 文件轮询器,然后解压缩

给出可处理传入的 data…​

MyCsvHandler.java

// Some comments here
public void doHandleCsvData(List<List<String>> csvData)
{
    // do magic here
}
  1. 然后,您的路由如下所示
<route>
        <!-- poll every 10 seconds -->
        <from uri="file:///some/path/to/pickup/csvfiles?delete=true&amp;consumer.delay=10000" />
        <unmarshal><csv /></unmarshal>
        <to uri="bean:myCsvHandler?method=doHandleCsvData" />
</route>

77.7. 将管道聚合为分隔符

考虑以下正文

Map<String, Object> body = new LinkedHashMap<>();
body.put("foo", "abc");
body.put("bar", 123);

这个 Java 路由定义

// Camel version < 2.15
CsvDataFormat oldCSV = new CsvDataFormat();
oldCSV.setDelimiter("|");
from("direct:start")
    .marshal(oldCSV)
    .to("mock:result")

// Camel version >= 2.15
from("direct:start")
    .marshal(new CsvDataFormat().setDelimiter(&#39;|&#39;))
    .to("mock:result")

或者此 XML 路由定义

<route>
  <from uri="direct:start" />
  <marshal>
    <csv delimiter="|" />
  </marshal>
  <to uri="mock:result" />
</route>

然后它将生成

abc|123

在 XML 中使用 autogenColumns, configRef 和 strategyRef 属性

可从 Camel 2.9.2 / 2.10 开始,为 Camel 2.15 删除

您可以自定义 CSV 数据格式,以使用您自己的 CSVConfig 和/或 CSVStrategy。另请注意,autogenColumns 选项的默认值为 true。以下示例应演示此自定义。

<route>
  <from uri="direct:start" />
  <marshal>
    <!-- make use of a strategy other than the default one which is 'org.apache.commons.csv.CSVStrategy.DEFAULT_STRATEGY' -->
    <csv autogenColumns="false" delimiter="|" configRef="csvConfig" strategyRef="excelStrategy" />
  </marshal>
  <convertBodyTo type="java.lang.String" />
  <to uri="mock:result" />
</route>

<bean id="csvConfig" class="org.apache.commons.csv.writer.CSVConfig">
  <property name="fields">
    <list>
      <bean class="org.apache.commons.csv.writer.CSVField">
        <property name="name" value="orderId" />
      </bean>
      <bean class="org.apache.commons.csv.writer.CSVField">
        <property name="name" value="amount" />
      </bean>
    </list>
  </property>
</bean>

<bean id="excelStrategy" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
  <property name="staticField" value="org.apache.commons.csv.CSVStrategy.EXCEL_STRATEGY" />
</bean>

77.8. 在解压缩时,使用 skipFirstLine 选项

可从 Camel 2.10 开始,为 Camel 2.15 删除

您可以指示 CSV 数据格式跳过包含 CSV 标头的第一行。使用 Spring/XML DSL:

<route>
  <from uri="direct:start" />
  <unmarshal>
    <csv skipFirstLine="true" />
  </unmarshal>
  <to uri="bean:myCsvHandler?method=doHandleCsv" />
</route>

或者 Java DSL:

CsvDataFormat csv = new CsvDataFormat();
csv.setSkipFirstLine(true);

from("direct:start")
  .unmarshal(csv)
.to("bean:myCsvHandler?method=doHandleCsv");

77.9. 将管道作为分隔符解封

使用 Spring/XML DSL:

<route>
  <from uri="direct:start" />
  <unmarshal>
    <csv delimiter="|" />
  </unmarshal>
  <to uri="bean:myCsvHandler?method=doHandleCsv" />
</route>

或者 Java DSL:

CsvDataFormat csv = new CsvDataFormat();
CSVStrategy strategy = CSVStrategy.DEFAULT_STRATEGY;
strategy.setDelimiter('|');
csv.setStrategy(strategy);

from("direct:start")
  .unmarshal(csv)
  .to("bean:myCsvHandler?method=doHandleCsv");
CsvDataFormat csv = new CsvDataFormat();
csv.setDelimiter("|");

from("direct:start")
  .unmarshal(csv)
  .to("bean:myCsvHandler?method=doHandleCsv");
CsvDataFormat csv = new CsvDataFormat();
CSVConfig csvConfig = new CSVConfig();
csvConfig.setDelimiter(";");
csv.setConfig(csvConfig);

from("direct:start")
  .unmarshal(csv)
  .to("bean:myCsvHandler?method=doHandleCsv");

CSVConfig 中的问题

看起来像是这样

CSVConfig csvConfig = new CSVConfig();
csvConfig.setDelimiter(';');

无法工作。您必须将分隔符设置为字符串!

77.10. 依赖项

要在 Camel 路由中使用 CSV,您需要添加对 camel-csv 的依赖项,该依赖项实施此数据格式。

如果您使用 Maven,您只需在 pom.xml 中添加以下内容,将最新和最大版本的版本号替换(请参阅最新版本下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-csv</artifactId>
  <version>x.x.x</version>
</dependency>

第 78 章 CXF

CXF 组件

cxf: 组件提供与 Apache CXF 的集成,用于连接到 CXF 上托管的 JAX-WS 服务。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cxf</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
注意

如果要了解 CXF 依赖项,请参阅 WHICH-JARS 文本文件。

注意

在流处理模式中使用 CXF 时(请参阅 DataFormat 选项),然后读取 流缓存

Camel on EAP 部署

该组件受到 EAP (Wildfly Camel)框架的 Camel 支持,该框架在红帽 JBoss 企业应用平台(JBoss EAP)容器上提供简化的部署模型。

CXF 组件与使用 Apache CXF 的 JBoss EAP Webservices susbsystem 集成。如需更多信息,请参阅 JAX-WS

注意

目前,EAP 子系统上的 Camel 不支持 CXF 或 Restlet 用户。但是,使用 CamelProxy 可以模拟 CXF 消费者的行为。

URI 格式

cxf:bean:cxfEndpoint[?options]

其中 cxfEndpoint 代表一个 bean ID,它引用 Spring bean registry 中的 bean。使用这个 URI 格式,大多数端点详情都在 bean 定义中指定。

cxf://someAddress[?options]

其中 someAddress 指定 CXF 端点的地址。使用这个 URI 格式,大多数端点详情都使用选项来指定。

对于以上任意样式,您可以在 URI 中附加选项,如下所示:

cxf:bean:cxfEndpoint?wsdlURL=wsdl/hello_world.wsdl&dataFormat=PAYLOAD

选项

名称

必需

描述

wsdlURL

WSDL 的位置。WSDL 默认从端点地址获取。例如:

file://local/wsdl/hello.wsdlwsdl/hello.wsdl

serviceClass

SEI (服务端点接口)类的名称。此类可以具有,但不需要 JSR181 注解。  自 2.0 起, 只有 POJO 模式需要这个选项。如果提供了 wsdlURL 选项,则 PAYLOAD 和 MESSAGE 模式不需要 serviceClass。当在没有 serviceClass 的情况下使用 wsdlURL 选项时,会提供 serviceName 和 portName (Spring configuration 的endpointName)选项 MUST

由于 2.0,可以使用 \# 表示法来引用 registry 中的 serviceClass 对象实例。

请注意,引用的对象不能是 Proxy (Spring AOP Proxy 为 OK), 因为它依赖于非 Spring AOP Proxy 的 Object.getClass ().getName () 方法。

由于 2.8, 可以省略 PAYLOAD 和 MESSAGE 模式的 wsdlURL 和 serviceClass 选项。省略它们时,可以在 PAYLOAD 模式中将任意 XML 元素放在 CxfPayload 的正文中,以促进 CXF Dispatch 模式。

例如: org.apache.camel.Hello

serviceName

只有在 WSDL 中存在多个 serviceName

此服务名称实施,它将映射到 wsdl:service@name。例如:

{http://org.apache.camel}ServiceName

endpointName

只有在 serviceName 下存在多个 portName 时,且从 camel 2.2 开始需要 camel-cxf consumer。

此服务实施的端口名称,它映射到 wsdl:port@name。例如:

{http://org.apache.camel}PortName

dataFormat

消息数据格式支持 CXF 端点。可能的值有: POJO (默认), PAYLOAD,MESSAGE.

relayHeaders

请参见此选项 的"转发标题 "选项部分。应该将 CXF 端点转发标头与路由一起。目前,只有 dataFormat=POJO默认:true示例true,false时才可用

wrapped

CXF 端点制作者将调用什么操作。可能的值有: true,false (默认)

wrappedStyle

2.5.0 开始,WSDL 风格描述 SOAP 正文中的参数如何表示。如果值为 false,CXF 将选择文档号未换行样式,如果值为 true,则 CXF 将选择 document-literal wrapped 样式

setDefaultBus

deprecated: 指定是否为此端点使用默认的 CXF 总线。可能的值有: true,false (默认)这个选项已弃用,您应该从 Camel 2.16 开始 使用默认的Bus

defaultBus

deprecated: 指定是否为此端点使用默认的 CXF 总线。可能的值有: true,false (默认)这个选项已弃用,您应该从 Camel 2.16 开始 使用默认的Bus

bus

使用 \# 表示法从 registry 99--将 bus 对象引用(如 bus=\#busName )。引用的对象必须是 org.apache.cxf.Bus 的实例。

默认情况下,使用 CXF Bus Factory 创建的默认总线。

cxfBinding

使用 \# 表示法引用 registry 的 CXF 绑定对象,如 cxfBinding=\#bindingName。引用的对象必须是 org.apache.camel.component.cxf.CxfBinding 的实例。

headerFilterStrategy

使用 \# 表示法引用 registry 的 filter 策略对象,如 headerFilterStrategy=\#strategyName。引用的对象必须是 org.apache.camel.spi.HeaderFilterStrategy 的实例。

loggingFeatureEnabled

在 2.3 中新功能,这个选项启用 CXF Logging 功能来写入入站和出站 SOAP 信息日志。可能的值有: true,false (默认)

defaultOperationName

在 2.4 中新增,此选项将设置默认的 operationName,它将由调用远程服务的 CxfProducer 使用。例如:

defaultOperationName=greetMe

defaultOperationNamespace

在 2.4 中新增,此选项将设置默认的 operationNamespace,它将由调用远程服务的 CxfProducer 使用。例如:

defaultOperationNamespace=http://apache.org/hello_world_soap_http

synchronous

2.5 中的新功能,此选项将使 CXF 端点决定使用同步或 async API 进行底层工作。默认值为 false,这意味着 camel-cxf 端点将默认尝试使用 async API。

publishedEndpointUrl

2.5 中的新功能,此选项将覆盖已发布的 WSDL 中出现的端点 URL,该 URL 使用服务地址 URL 和 ?wsdl 进行访问。例如:

publshedEndpointUrl=http://example.com/service

properties.propName

Camel 2.8: 允许您在端点 URI 中设置自定义 CXF 属性。例如,设置 properties.mtom-enabled=true 来启用 MTOM。为确保 CXF 在开始调用时没有切换线程,您可以设置 properties.org.apache.cxf.interceptor.OneWayProcessorInterceptor.USE_ORIGINAL_THREAD=true

allowStreaming

2.8.2 中的新功能.此选项控制 CXF 组件在 PAYLOAD 模式下运行时(参见下面的),DOM 会将传入的消息解析为 DOM Elements 中,或者将有效负载保留为允许在某些情况下允许流传输的 javax.xml.transform.Source 对象。

skipFaultLogging

2.11 中的新功能.这个选项控制阶段拦截器链是否跳过记录它所捕获的故障。

cxfEndpointConfigurer

Camel 2.11 中的新功能.这个选项可以应用 org.apache.camel.component.cxfEndpointConfigurer 的实现, 它支持以编程方式配置 CXF 端点。自 Camel 2.15.0 起, 用户可以通过实施 CxfEndpointConfigurer 的配置{Server/Client} 方法来配置 CXF 服务器和客户端。

username

Camel 2.12.3 的新选项用于为 CXF 客户端设置用户名的基本身份验证信息。

password

Camel 2.12.3 的新选项用于设置 CXF 客户端的密码基本身份验证信息。

continuationTimeout

Camel 2.14.0 中的新功能用于设置 CXF continuation 超时,在 CXF 服务器使用 Jetty 或 Servlet 传输时默认在 CxfConsumer 中使用。(在 Camel 2.14.0 之前,CxfConsumer 仅将 continuation timeout 设置为 0,这表示连续暂停操作超时。)

默认 : 30000 示例 : continuation=80000

serviceNameportName s 为 QNames,因此如果您提供它们,请务必将它们前缀为 {namespace},如上例所示。

数据格式的描述

DataFormat

描述

POJO

POJO (说明旧 Java 对象)是目标服务器上被调用的方法的 Java 参数。支持协议和逻辑 JAX-WS 处理程序。

有效负载

应用 CXF 端点中消息配置后 PAYLOAD 是消息有效负载( soap:body)。仅支持协议 JAX-WS 处理程序。不支持逻辑 JAX-WS 处理程序。

MESSAGE

MESSAGE 是从传输层接收的原始消息。如果您不假定要 touch 或 change Stream,如果您使用这类 DataFormat 时,将删除某些 CXF 拦截器,以便在 camel-cxf consumer 和 JAX-WS 处理程序后不会显示任何 soap 标头。

CXF_MESSAGE

CXF_MESSAGECamel 2.8.2 中新增,通过将消息从传输层转换为原始 SOAP 消息来调用 CXF 拦截器的完整功能

您可以通过检索交换属性 CamelCXFDataFormat 来确定交换的数据模型。Exchange key constant 在 org.apache.camel.component.cxfConstants.DATA_FORMAT_PROPERTY 中定义。

使用 Apache Aries Blueprint 配置 CXF 端点.

从 Camel 2.8 开始,支持为您的 CXF 端点使用 Aries 蓝图依赖项注入。这个架构与 Spring 模式类似,因此转换非常透明。

例如:

 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
            xmlns:camel-cxf="http://camel.apache.org/schema/blueprint/cxf"
 	   xmlns:cxfcore="http://cxf.apache.org/blueprint/core"
            xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

       <camel-cxf:cxfEndpoint id="routerEndpoint"
                      address="http://localhost:9001/router"
                      serviceClass="org.apache.servicemix.examples.cxf.HelloWorld">
         <camel-cxf:properties>
             <entry key="dataFormat" value="MESSAGE"/>
         </camel-cxf:properties>
      </camel-cxf:cxfEndpoint>

      <camel-cxf:cxfEndpoint id="serviceEndpoint"
			address="http://localhost:9000/SoapContext/SoapPort"
                     serviceClass="org.apache.servicemix.examples.cxf.HelloWorld">
    </camel-cxf:cxfEndpoint>

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <from uri="routerEndpoint"/>
            <to uri="log:request"/>
        </route>
    </camelContext>

</blueprint>

目前,endpoint 元素是第一个支持的 CXF 命名空间handler。

您还可以使用 bean 参考,就像在 spring 中一样

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xmlns:jaxws="http://cxf.apache.org/blueprint/jaxws"
           xmlns:cxf="http://cxf.apache.org/blueprint/core"
           xmlns:camel="http://camel.apache.org/schema/blueprint"
           xmlns:camelcxf="http://camel.apache.org/schema/blueprint/cxf"
           xsi:schemaLocation="
             http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
             http://cxf.apache.org/blueprint/jaxws http://cxf.apache.org/schemas/blueprint/jaxws.xsd
             http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
             ">

    <camelcxf:cxfEndpoint id="reportIncident"
                     address="/camel-example-cxf-blueprint/webservices/incident"
                     wsdlURL="META-INF/wsdl/report_incident.wsdl"
                     serviceClass="org.apache.camel.example.reportincident.ReportIncidentEndpoint">
    </camelcxf:cxfEndpoint>

    <bean id="reportIncidentRoutes" class="org.apache.camel.example.reportincident.ReportIncidentRoutes" />

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <routeBuilder ref="reportIncidentRoutes"/>
    </camelContext>

</blueprint>

如何在 MESSAGE 模式中启用 CXF 的 LoggingOutInterceptor

CXF 的 LoggingOutInterceptor 输出出站消息,该消息位于线上可记录系统(java.util.logging)。由于 LoggingOutInterceptor 处于 PRE_STREAM 阶段(但 PRE_STREAM 阶段在 MESSAGE 模式下),因此您必须在 WRITE 阶段配置 LoggingOutInterceptor 来运行。以下是一个示例。

   <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor">
        <!--  it really should have been user-prestream but CXF does have such phase! -->
        <constructor-arg value="target/write"/>
   </bean>

<cxf:cxfEndpoint id="serviceEndpoint" address="http://localhost:9002/helloworld"
	serviceClass="org.apache.camel.component.cxf.HelloService">
	<cxf:outInterceptors>
	    <ref bean="loggingOutInterceptor"/>
	</cxf:outInterceptors>
	<cxf:properties>
		<entry key="dataFormat" value="MESSAGE"/>
	</cxf:properties>
</cxf:cxfEndpoint>

转发标头选项描述

从 JAXWS WSDL 优先开发人员的角度,存在带外 和带线标头。

in-band 标头是标头,被明确定义为 SOAP 标头等端点的 WSDL 绑定合同的一部分。

带外标头是通过 线序列化的标头,但没有明确属于 WSDL 绑定合同的一部分。

标头转发/过滤是双向的。

当路由具有 CXF 端点且开发人员需要有线头头(如 SOAP 标头)时,该路由会与另一个 JAXWS 端点所消耗的路由一起 转发,然后转发标头 应设置为 true (这是默认值)。

仅在 POJO 模式中可用

转发Headers=true 设置代表转发标头的意向。对给定标头进行转发的实际决定是否被委派给了实施 MessageHeadersRelay 接口的可插拔实例。将咨询一个对 MessageHeadersRelay 的整合实施,以确定是否需要转发标题。已有一个 SoapMessageHeadersRelay 的实现,它将自身绑定到知名的 SOAP 命名空间。目前,只过滤掉带外的标头,且在转发 Headers=true 时,始终会转发 带外的标头。如果线上有一个标头,则该命名空间对于运行时未知,则会使用一个回退 DefaultMessageHeadersRelay,只允许所有标头被转发。

转发Headers=false 设置表示将丢弃所有标题 in-band 和 out-of-band。

您可以插入您自己的 MessageHeadersRelay 实现覆盖,或向中继列表中添加额外的设置。要覆盖预加载的中继实例,只需确保您的 MessageHeadersRelay 实施服务与您要覆盖的命名空间相同。另请注意,覆盖中继必须与您要覆盖的所有命名空间作为您要覆盖的命名空间提供服务,否则,在路由启动时出现运行时异常会抛出,因为这会在命名空间引入了一个模糊性来转发实例映射。

<cxf:cxfEndpoint ...>
   <cxf:properties>
     <entry key="org.apache.camel.cxf.message.headers.relays">
       <list>
         <ref bean="customHeadersRelay"/>
       </list>
     </entry>
   </cxf:properties>
 </cxf:cxfEndpoint>
 <bean id="customHeadersRelay" class="org.apache.camel.component.cxf.soap.headers.CustomHeadersRelay"/>

查看演示如何在这里转发/drop 标头的测试:

link:https://svn.apache.org/repos/asf/camel/branches/camel-1.x/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/soap/headers/CxfMessageHeadersRelayTest.java[https://svn.apache.org/repos/asf/camel/branches/camel-1.x/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/soap/headers/CxfMessageHeadersRelayTest.java ]

版本 2.0 起的更改

  • 支持 POJOPAYLOAD 模式。在 POJO 模式中,只有带外消息标头才可以过滤,因为 CXF 的标头被处理并从标头列表中删除。in-band 标头被合并到 POJO 模式的 MessageContentList 中。camel-cxf 组件使得任何试图从 MessageContentList 中删除带头的标头(如果需要过滤 in-band 标头,请使用 PAYLOAD 模式或插入)CXF 拦截器/JAXWS Handler 到 CXF 端点。
  • Message Header Relay 机制已合并到 CxfHeaderFilterStrategy 中。转发Headers 选项、其语义和默认值保持不变,但它是 CxfHeaderFilterStrategy 属性。以下是配置它的示例:

    <bean id="dropAllMessageHeadersStrategy" class="org.apache.camel.component.cxf.common.header.CxfHeaderFilterStrategy">
    
        <!--  Set relayHeaders to false to drop all SOAP headers -->
        <property name="relayHeaders" value="false"/>
    
    </bean>

    然后,您的端点可以引用 CxfHeaderFilterStrategy

    <route>
        <from uri="cxf:bean:routerNoRelayEndpoint?headerFilterStrategy=#dropAllMessageHeadersStrategy"/>
        <to uri="cxf:bean:serviceNoRelayEndpoint?headerFilterStrategy=#dropAllMessageHeadersStrategy"/>
    </route>
  • MessageHeadersRelay 接口已经稍有变化,并且已重命名为 MessageHeaderFilter。它是 CxfHeaderFilterStrategy 的一个属性。以下是配置用户定义的消息标头过滤器的示例:

    <bean id="customMessageFilterStrategy" class="org.apache.camel.component.cxf.common.header.CxfHeaderFilterStrategy">
        <property name="messageHeaderFilters">
            <list>
                <!--  SoapMessageHeaderFilter is the built in filter.  It can be removed by omitting it. -->
                <bean class="org.apache.camel.component.cxf.common.header.SoapMessageHeaderFilter"/>
    
                <!--  Add custom filter here -->
                <bean class="org.apache.camel.component.cxf.soap.headers.CustomHeaderFilter"/>
            </list>
        </property>
    </bean>
  • 除了 转发标头 外,在 CxfHeaderFilterStrategy 中可以配置新的属性。

名称

描述

type

必需?

默认值

relayHeaders

所有邮件标题将由 Message Header Filters 处理

布尔值

true (1.6.1 behavior)

relayAllMessageHeaders

将传播所有邮件标题(不需要由消息标头过滤器处理)

布尔值

false (1.6.1 behavior)

allowFilterNamespaceClash

如果两个过滤器在激活命名空间中重叠,则属性控制应如何处理它。如果值为 true,则最后一个胜过。如果值为 false,它将抛出异常

布尔值

false (1.6.1 behavior)

使用 Spring 配置 CXF 端点

您可以使用下方所示的 Spring 配置文件配置 CXF 端点,您还可以将端点嵌入到 camelContext 标签中。当您调用服务端点时,您可以将 operationNameoperationNamespace 标头设置为显式调用的操作。

注意在 Camel 2.x 中,我们更改为使用 http://camel.apache.org/schema/cxf 作为 CXF 端点的目标命名空间。

<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-2.0.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     ">
 ...
注意

务必包含 root beans 元素中指定的 JAX-WS 模式Location 属性。这允许 CXF 验证文件并是必需的。另请注意,< cxf:cxfEndpoint/&gt; tag-​these 末尾的命名空间声明是必需的,因为此标签的属性值中不支持 {namespace}localName 语法。

cxf:cxfEndpoint 元素支持很多附加属性:

名称

PortName

此服务的实现端点名称,它将映射到 wsdl:port@name。格式为 ns:PORT_NAME,其中 ns 是在这个范围内有效的命名空间前缀。

serviceName

此服务名称实施,它将映射到 wsdl:service@name。格式为 ns:SERVICE_NAME,其中 ns 是在这个范围内有效的命名空间前缀。

wsdlURL

WSDL 的位置。可以位于类路径、文件系统或远程托管。

bindingId

要使用的服务模型的 bindingId

address

服务发布地址。

bus

JAX-WS 端点中使用的总线名称。

serviceClass

SEI (Service Endpoint Interface)类的类名称,这些类名称可能具有 JSR181 注解。

它还支持许多子元素:

名称

cxf:inInterceptors

此端点的传入拦截器。< bean> 或 &lt; ref> 列表。

cxf:inFaultInterceptors

此端点的传入故障拦截器。< bean> 或 &lt; ref> 列表。

cxf:outInterceptors

此端点的传出拦截器。< bean> 或 &lt; ref> 列表。

cxf:outFaultInterceptors

此端点的传出故障拦截器。< bean> 或 &lt; ref> 列表。

cxf:properties

应提供给 JAX-WS 端点的属性映射。请参见下文。

cxf:handlers

个 JAX-WS 处理程序列表,应提供给 JAX-WS 端点。请参见下文。

cxf:dataBinding

您可以指定端点中使用的 DataBinding。这可以通过 Spring < bean class="MyDataBinding"/> 语法提供。

cxf:binding

您可以指定要使用的 BindingFactory。这可以通过 Spring < bean class="MyBindingFactory"/> 语法提供。

cxf:features

保留此端点拦截器的功能。< bean&gt; s 或 < ref>s 列表

cxf:schemaLocations

要使用的端点的 schema 位置。< schemaLocation>列表

cxf:serviceFactory

要使用此端点的服务工厂。这可以通过 Spring < bean class="MyServiceFactory"/> 语法提供

您可以找到更多高级示例,其中显示了如何在此处提供拦截器、属性和处理程序 :http://cwiki.apache.org/CXF20DOC/jax-ws-configuration.html

注意

您可以使用 CXF:properties 设置来自 Spring 配置文件的 CXF 端点的 dataFormatsetDefaultBus 属性,如下所示:

<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="MESSAGE"/>
       <entry key="setDefaultBus" value="true"/>
     </cxf:properties>
   </cxf:cxfEndpoint>

如何使 camel-cxf 组件使用 log4j 而不是 java.util.logging

CXF 的默认日志记录器是 java.util.logging。如果要将其更改为 log4j,请按如下操作:在 classpath 中创建一个文件,取名为 META-INF/cxf/org.apache.cxf.logger。此文件应当包含类的完全限定域名 org.apache.cxf.common.Log4jLogger 在单个行中。

如何使用 xml start document 让 camel-cxf 响应消息

如果您使用一些 SOAP 客户端,如 PHP,则会收到此类错误,因为 CXF 中没有添加 XML start 文档 < ?xml version="1.0" 编码="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);
    }

}

您可以添加一个客户拦截器,将其配置为 camel-cxf endpont

<cxf:cxfEndpoint id="routerEndpoint" address="http://localhost:${CXFTestSupport.port2}/CXFGreeterRouterTest/CamelContext/RouterPort"
 		serviceClass="org.apache.hello_world_soap_http.GreeterImpl"
 		skipFaultLogging="true">
     <cxf:outInterceptors>
         <!-- This interceptor will force the CXF server send the XML start document to client -->
         <bean class="org.apache.camel.component.cxf.WriteXmlDeclarationInterceptor"/>
     </cxf:outInterceptors>
     <cxf:properties>
         <!-- Set the publishedEndpointUrl which could override the service address from generated WSDL as you want -->
         <entry key="publishedEndpointUrl" value="http://www.simple.com/services/test" />
     </cxf:properties>
 </cxf:cxfEndpoint>

如果您使用的是 Camel 2.4,或者为它添加消息标头,如下所示。

 // 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);

如何使用 POJO 数据格式来自 camel-cxf 端点的消息

camel-cxf 端点使用者 POJO 数据格式基于 cxf 调用器,因此消息标题具有名称 CxfConstants.OPERATION_NAME,消息正文是 SEI 方法参数的列表。

public class PersonProcessor implements Processor {

    private static final transient Logger LOG = LoggerFactory.getLogger(PersonProcessor.class);

    @SuppressWarnings("unchecked")
    public void process(Exchange exchange) throws Exception {
        LOG.info("processing exchange in camel");

        BindingOperationInfo boi = (BindingOperationInfo)exchange.getProperty(BindingOperationInfo.class.toString());
        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);
            // Since camel has its own exception handler framework, we can't throw the exception to trigger it
            // We just set the fault message in the exchange for camel-cxf component handling and return
            exchange.getOut().setFault(true);
            exchange.getOut().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.getOut().setBody(new Object[] {null, personId, ssn, name});
    }

}

如何以 POJO 数据格式为 camel-cxf 端点准备消息

camel-cxf 端点制作者基于 cxf 客户端 API。首先,您需要在消息标头中指定操作名称,然后将方法参数添加到列表中,并使用此参数列表初始化消息。响应消息的正文是 消息ContentsList,您可以从该列表中获取结果。

如果您没有在消息标头中指定操作名称,则 CxfProducer 将尝试使用 CxfEndpoint 中的 defaultOperationName。如果 CxfEndpoint 上没有设置 defaultOperationName,它将从操作列表获取第一个操作名称。

如果要从消息正文获取对象数组,您可以使用 message.getbody (Object[].class) 来获取正文,如下所示:

Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut);
final List<String> params = new ArrayList<String>();
// 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.getOut();
// 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("We should get the response context here", "UTF-8", responseContext.get(org.apache.cxf.message.Message.ENCODING));
assertEquals("Reply body on Camel is wrong", "echo " + TEST_MESSAGE, result.get(0));

如何在 PAYLOAD 数据格式处理 camel-cxf 端点的信息

在 Apache Camel 2.0: CxfMessage.getBody () 中,将返回 org.apache.camel.component.cxfPayload 对象,它具有 SOAP 消息标头和 Body 元素的 getters。这个更改启用了从 Apache Camel 消息分离原生 CXF 消息。

protected RouteBuilder createRouteBuilder() {
    return new RouteBuilder() {
        public void configure() {
            from(SIMPLE_ENDPOINT_URI + "&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<Source>();
                    // 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);
                    outElements.add(new DOMSource(outDocument.getDocumentElement()));
                    // set the payload header with null
                    CxfPayload<SoapHeader> responsePayload = new CxfPayload<SoapHeader>(null, outElements, null);
                    exchange.getOut().setBody(responsePayload);
                }
            });
        }
    };
}

如何在 POJO 模式中获取和设置 SOAP 标头

POJO 表示,当 CXF 端点生成或消耗 Camel 交换时,数据格式是 Java 对象的列表。尽管 Apache Camel 在此模式下以 POJO 形式公开消息正文,但 CXF 组件仍然提供对读取和写入 SOAP 标头的访问。但是,由于拦截器在处理完成后从标头列表中删除带外 SOAP 标头,所以只有带外 SOAP 标头才可以在 POJO 模式中可用。

以下示例演示了如何获取/设置 SOAP 标头。假设我们有一个路由,它从一个 CXF 端点转发到另一个。也就是说,SOAP Client → Apache Camel → CXF 服务。在向 CXF 服务请求进入 CXF 服务前,我们可以附加两个处理器以获取/插入 SOAP 标头,然后响应回 SOAP 客户端。本例中的处理器(1)和(2)是 InsertRequestOutHeaderProcessor 和 InsertResponseOutHeaderProcessor。我们的路由如下:

<route>
    <from uri="cxf:bean:routerRelayEndpointWithInsertion"/>
    <process ref="InsertRequestOutHeaderProcessor" />
    <to uri="cxf:bean:serviceRelayEndpointWithInsertion"/>
    <process ref="InsertResponseOutHeaderProcessor" />
</route>

在 2.x SOAP 标头中,将传播到 并从 Apache Camel 消息标头传播。Apache Camel 消息标头名称为 org.apache.cxf.headers.Header.list,它是 CXF (org.apache.cxf.headers.Header.HEADER_LIST)中定义的常量。标头值为 CXF SoapHeader 对象的 List <> (org.apache.cxf.binding.soap.SoapHeader)。以下片段是 InsertResponseOutHeaderProcessor (在响应消息中插入一个新的 SOAP 标头)。在 InsertResponseOutHeaderProcessorInsertRequestOutHeaderProcessor 中访问 SOAP 标头的方法实际上都相同。两个处理器之间的唯一区别是设置插入的 SOAP 标头的方向。

public static class InsertResponseOutHeaderProcessor implements Processor {

    @SuppressWarnings("unchecked")
    public void process(Exchange exchange) throws Exception {
        // You should be able to get the header if exchange is routed from camel-cxf endpoint
        List<SoapHeader> soapHeaders = CastUtils.cast((List<?>)exchange.getIn().getHeader(Header.HEADER_LIST));
        if (soapHeaders == null) {
            // we just create a new soap headers in case the header is null
            soapHeaders = new ArrayList<SoapHeader>();
        }

        // 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);

    }

}

如何在 PAYLOAD 模式中获取和设置 SOAP 标头

我们已介绍如何在 PAYLOAD 模式中访问 SOAP 消息(CxfPayload 对象) (请参阅 “如何在 PAYLOAD 数据格式处理 camel-cxf 端点的信息”一节)。

获取 CxfPayload 对象后,您可以调用返回 DOM Elements (SOAP headers)的 CxfPayload.getHeaders () 方法。

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("We should get the elements here", elements);
        assertEquals("Get the wrong elements size", 1, elements.size());

        Element el = new XmlConverter().toDOMElement(elements.get(0));
        elements.set(0, new DOMSource(el));
        assertEquals("Get the wrong namespace URI", "http://camel.apache.org/pizza/types",
                el.getNamespaceURI());

        List<SoapHeader> headers = payload.getHeaders();
        assertNotNull("We should get the headers here", headers);
        assertEquals("Get the wrong headers size", headers.size(), 1);
        assertEquals("Get the wrong namespace URI",
                ((Element)(headers.get(0).getObject())).getNamespaceURI(),
                "http://camel.apache.org/pizza/types");
    }

})
.to(getServiceEndpointURI());

自 Camel 2.16.0 起,您可以使用与 “如何在 POJO 模式中获取和设置 SOAP 标头”一节 中描述的相同方法来设置或获取 SOAP 标头。现在,您可以使用 org.apache.cxf.headers.Header.list 标头获取和设置 SOAP 标头列表。这意味着,如果您有一个从一个 Camel CXF 端点转发到另一个 Camel CXF 端点的路由(SOAP Client → Camel → CXF 服务),SOAP 客户端现在也会转发到 CXF 服务。如果您不希望标头转发,请将它们从 org.apache.cxf.headers.Header.list Camel 标头中删除。

SOAP 标头在 MESSAGE 模式中不可用

当 SOAP 处理被跳过时,SOAP 标头在 MESSAGE 模式中不可用。

如何从 Apache Camel 抛出 SOAP 错误

如果您使用 CXF 端点来消耗 SOAP 请求,您可能需要丢弃来自 camel 上下文的 SOAP 错误。基本上,您可以使用 throwFault DSL 来执行此操作;它适用于 POJOPAYLOADMESSAGE 数据格式。您可以定义 soap 错误,如下所示:

SOAP_FAULT = new SoapFault(EXCEPTION_MESSAGE, SoapFault.FAULT_CODE_CLIENT);
Element detail = SOAP_FAULT.getOrCreateDetail();
Document doc = detail.getOwnerDocument();
Text tn = doc.createTextNode(DETAIL_TEXT);
detail.appendChild(tn);

然后像您一样进行丢弃:

from(routerEndpointURI).setFaultBody(constant(SOAP_FAULT));

如果您的 CXF 端点以 MESSAGE 数据格式工作,您可以在消息正文中设置 SOAP 失败消息,并在消息标头中设置响应代码。

from(routerEndpointURI).process(new Processor() {

    public void process(Exchange exchange) throws Exception {
        Message out = exchange.getOut();
        // Set the message body with the
        out.setBody(this.getClass().getResourceAsStream("SoapFaultMessage.xml"));
        // Set the response code here
        out.setHeader(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500));
    }

});

POJO 数据格式也是如此。您可以在 Out body 上设置 SOAP 失败,并通过调用 Message.setFault (true) 来指出其出现了故障,如下所示:

from("direct:start").onException(SoapFault.class).maximumRedeliveries(0).handled(true)
    .process(new Processor() {
        public void process(Exchange exchange) throws Exception {
            SoapFault fault = exchange
                .getProperty(Exchange.EXCEPTION_CAUGHT, SoapFault.class);
            exchange.getOut().setFault(true);
            exchange.getOut().setBody(fault);
        }

    }).end().to(serviceURI);

如何传播 CXF 端点的请求和响应上下文

CXF 客户端 API 提供了一种方法来调用带有请求和响应上下文的操作。如果您使用 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 opertion name", "{http://apache.org/hello_world_soap_http}greetMe",
                      responseContext.get("javax.xml.ws.wsdl.operation").toString());

附加支持

POJO 模式: 支持带 Attachment 和 MTOM 的双 SOAP (请参阅启用 MTOM 的 Payload Mode)。 但是,带有 Attachment 的 SOAP 没有被测试。 由于附件进行了汇总,并且未编入 POJO,因此用户通常无需处理他们自己附加的附件。 Attachments 被传播到从 2.1 开始的 Camel 消息的附件。 因此,可以通过 Camel 消息 API 重新发送附件

DataHandler Message.getAttachment(String id)

.

有效负载模式: 自 2.1 起支持 MTOM。上面提到的 Camel 消息 API 可以检索附件。不支持具有 Attachment 的 SOAP,因为此模式下没有 SOAP 处理。

要启用 MTOM,请将 CXF 端点属性 "mtom_enabled" 设置为 true。(我相信您只能在 Spring 中执行此操作。)

<cxf:cxfEndpoint id="routerEndpoint" address="http://localhost:${CXFTestSupport.port1}/CxfMtomRouterPayloadModeTest/jaxws-mtom/hello"
         wsdlURL="mtom.wsdl"
         serviceName="ns:HelloService"
         endpointName="ns:HelloPort"
         xmlns:ns="http://apache.org/camel/cxf/mtom_feature">

     <cxf:properties>
         <!--  enable mtom by setting this property to true -->
         <entry key="mtom-enabled" value="true"/>

         <!--  set the camel-cxf endpoint data fromat to PAYLOAD mode -->
         <entry key="dataFormat" value="PAYLOAD"/>
     </cxf:properties>

您可以使用附加生成 Camel 消息,以发送到 Payload 模式的 CXF 端点。

Exchange exchange = context.createProducerTemplate().send("direct:testEndpoint", new Processor() {

    public void process(Exchange exchange) throws Exception {
        exchange.setPattern(ExchangePattern.InOut);
        List&lt;Source> elements = new ArrayList&lt;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 消息。

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
        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:"
        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:"
        assertEquals(MtomTestHelper.REQ_IMAGE_CID, imageId);

        DataHandler dr = exchange.getIn().getAttachment(photoId);
        assertEquals("application/octet-stream", dr.getContentType());
        MtomTestHelper.assertEquals(MtomTestHelper.REQ_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));

        dr = exchange.getIn().getAttachment(imageId);
        assertEquals("image/jpeg", dr.getContentType());
        MtomTestHelper.assertEquals(MtomTestHelper.requestJpeg, IOUtils.readBytesFromStream(dr.getInputStream()));

        // create response
        List&lt;Source> elements = new ArrayList&lt;Source>();
        elements.add(new DOMSource(DOMUtils.readXml(new StringReader(MtomTestHelper.RESP_MESSAGE)).getDocumentElement()));
        CxfPayload&lt;SoapHeader> sbody = new CxfPayload&lt;SoapHeader>(new ArrayList&lt;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")));

    }
}

Message Mode: 不支持连接,因为它并不处理消息。

CXF_MESSAGE 模式: 支持 MTOM,并且可按照上述 Camel 消息 API 检索附件。请注意,当收到多部分(即 MTOM)消息时,默认的 SOAPMessage to String converter 将在正文中提供完整的多部分有效负载。如果您只要求 SOAP XML 作为字符串,您可以使用 message.getSOAPPart () 设置消息正文,Camel 转换可以为您进行其余工作。

如何传播堆栈追踪信息

可以配置 CXF 端点,以便在服务器端引发 Java 异常时,异常堆栈的追踪会被整合到容错消息中,并返回给客户端。要启用此功能,请将 dataFormat 设置为 PAYLOAD,并在 cxfEndpoint 元素中将 faultStackTraceEnabled 属性设置为 true,如下所示:

<cxf:cxfEndpoint id="router" address="http://localhost:9002/TestMessage"
    wsdlURL="ship.wsdl"
    endpointName="s:TestSoapEndpoint"
    serviceName="s:TestService"
    xmlns:s="http://test">
  <cxf:properties>
    <!-- enable sending the stack trace back to client; the default value is false-->
    <entry key="faultStackTraceEnabled" value="true" /> <entry key="dataFormat" value="PAYLOAD" />
  </cxf:properties>
</cxf:cxfEndpoint>

出于安全考虑,堆栈跟踪不包括导致的异常(也就是说,堆栈跟踪的一部分 如果要在堆栈追踪中包含导致异常,请在 cxfEndpoint 元素中将 exceptionMessageCauseEnabled 属性设为 true,如下所示:

<cxf:cxfEndpoint id="router" address="http://localhost:9002/TestMessage"
    wsdlURL="ship.wsdl"
    endpointName="s:TestSoapEndpoint"
    serviceName="s:TestService"
    xmlns:s="http://test">
  <cxf:properties>
    <!-- enable to show the cause exception message and the default value is false -->
    <entry key="exceptionMessageCauseEnabled" value="true" />
    <!-- enable to send the stack trace back to client,  the default value is false-->
    <entry key="faultStackTraceEnabled" value="true" />
    <entry key="dataFormat" value="PAYLOAD" />
  </cxf:properties>
</cxf:cxfEndpoint>
警告

对于测试和诊断目的,您应该只启用 exceptionMessageCauseEnabled 标志。服务器通常的做法是原始原因(例外),使恶意用户更难以探测服务器。

PAYLOAD 模式流支持

在 2.8.2 中,Carl-cxf 组件现在支持在使用 PAYLOAD 模式时,支持在传入消息流处理。在以前的版本中,传入的信息已被完全解析。对于大型消息,这需要消耗大量内存。从 2.8.2 开始,传入消息可在路由期间保持为 javax.xml.transform.Source,如果不修改有效负载,则可以直接流传输到目标目的地。对于常见的"简单代理"用例(例如: from ("cxf:…​").to ("cxf:…​")),这可以提供非常显著的性能增加,以及显著降低的内存要求。

然而,在有些情况下,流性可能不适合或需要。由于流性,在稍后处理链中不会发现无效的传入 XML。另外,某些操作可能需要下载消息,如 WS-Security 或消息追踪(例如,流处理的优点)。此时,可以通过两种方式控制流:

  • endpoint 属性:您可以添加 "allowStreaming=false" 作为端点属性,以打开/关闭流。
  • component 属性:CxfComponent 对象也有一个 allowStreaming 属性,可为从该组件创建的端点设置默认值。
  • 全局系统属性:您可以将 "org.apache.camel.component.cxf.streaming" 的系统属性添加到 "false",以关闭 if。这将设置全局默认值,但上方设置 endpoint 属性将覆盖该端点的此值。

使用通用 CXF Dispatch 模式

从 2.8.0,camel-cxf 组件支持通用 CXF 分配模式,它可以传输任意结构的消息(例如,不绑定到特定 XML 模式)。要使用此模式,您只需省略 CXF 端点的 wsdlURL 和 serviceClass 属性。

<cxf:cxfEndpoint id="testEndpoint" address="http://localhost:9000/SoapContext/SoapAnyPort">
  <cxf:properties>
    <entry key="dataFormat" value="PAYLOAD"/>
  </cxf:properties>
</cxf:cxfEndpoint>

请注意,默认的 CXF 分配客户端不会发送特定的 SOAPAction 标头。因此,当目标服务需要特定的 SOAPAction 值时,会使用键 SOAPAction (不区分大小写)在 Camel 标头中提供。

78.1. WildFly 上的 CXF 消费者

WildFly 上的 camel-cxf 用户的配置与独立 Camel 的不同。制作者端点可以正常工作。

在 WildFly 上,camel-cxf 使用者利用容器提供的默认 Undertow HTTP 服务器。服务器在 undertow 子系统配置中定义。以下是 standalone.xml 中默认配置的摘录:

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
    <buffer-cache name="default" />
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" />
        <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true" />
        <host name="default-host" alias="localhost">
            <location name="/" handler="welcome-content" />
            <filter-ref name="server-header" />
            <filter-ref name="x-powered-by-header" />
            <http-invoker security-realm="ApplicationRealm" />
        </host>
    </server>
</subsystem>

在本例中,Undertow 配置为侦听由 http 和 https socket-binding 指定的接口/端口。默认情况下,这是 https 和 8443 的端口 8080。

例如,如果您使用不同的主机或端口组合配置端点使用者,服务器日志文件中将显示一个警告。例如,会忽略以下主机和端口配置:

<cxf:rsServer id="cxfRsConsumer"
              address="http://somehost:1234/path/to/resource"
              serviceClass="org.example.ServiceClass" />
<cxf:cxfEndpoint id="cxfWsConsumer"
                 address="http://somehost:1234/path/to/resource"
                 serviceClass="org.example.ServiceClass" />
[org.wildfly.extension.camel] (pool-2-thread-1) Ignoring configured host: http://somehost:1234/path/to/resource

但是,使用者仍可在默认主机和端口 localhost:8080 或 localhost:8443 上可用。

注意

使用 camel-cxf 消费者的应用程序 必须 打包为 WAR。在之前的 WildFly-Camel 版本中,允许其他类型存档,如 JAR,但这不再受支持。

78.1.1. 配置备用端口

如果需要接受其他端口,则必须通过 WildFly 子系统配置来配置这些端口。这在服务器文档中阐述:

https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html/configuration_guide/configuring_the_web_server_undertow

78.1.2. 配置 SSL

要配置 SSL,请参考 WildFly SSL 配置指南:

https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html-single/how_to_configure_server_security/#configure_one_way_and_two_way_ssl_tls_for_application

78.1.3. 使用 Elytron 配置安全性

WildFly-Camel 支持使用 Elytron 安全框架保护 camel-cxf consumer 端点。

78.1.3.1. 配置安全域

要使用 Elytron 保护 WildFly-Camel 应用程序,需要在您的 WAR 部署的 WEB-INF/jboss-web.xml 中引用应用程序安全域:

<jboss-web>
  <security-domain>my-application-security-domain</security-domain>
</jboss-web>

& lt;security-domain& gt; 配置引用 Undertow 子系统定义的 < application-security-domain > 的名称。例如,Undertow 子系统 &lt ;application-security-domain > 在 WildFly 服务器 standalone.xml 配置文件中配置,如下所示:

<subsystem xmlns="urn:jboss:domain:undertow:6.0">
    ...
    <application-security-domains>
        <application-security-domain name="my-application-security-domain" http-authentication-factory="application-http-authentication"/>
    </application-security-domains>
</subsystem>

& lt;http-authentication-factory > application-http-authentication 在 Elytron 子系统中定义。application-http-authenticationstandalone.xmlstandalone-full.xml 服务器配置文件中都默认可用。例如:

<subsystem xmlns="urn:wildfly:elytron:1.2">
    ...
    <http>
        ...
        <http-authentication-factory name="application-http-authentication" http-server-mechanism-factory="global" security-domain="ApplicationDomain">
            <mechanism-configuration>
                <mechanism mechanism-name="BASIC">
                    <mechanism-realm realm-name="Application Realm" />
                </mechanism>
                <mechanism mechanism-name="FORM" />
            </mechanism-configuration>
        </http-authentication-factory>
        <provider-http-server-mechanism-factory name="global" />
    </http>
    ...
</subsystem>

名为 application -http-authentication -authentication 的 <http-authentication-factory > 包括了对名为 ApplicationDomain 的 Elytron 安全域的引用。

有关如何配置 Elytron 子系统的更多信息,请参阅 Elytron 文档

78.1.3.2. 配置安全约束、验证方法和安全角色

camel-cxf consumer 端点的安全约束、身份验证方法和安全角色可以在您的 WAR 部署 WEB-INF/web.xml 中配置。例如,配置 BASIC 身份验证:

<web-app>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>secure</web-resource-name>
      <url-pattern>/webservices/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>my-role</role-name>
    </auth-constraint>
  </security-constraint>
  <security-role>
    <description>The role that is required to log in to /webservices/*</description>
    <role-name>my-role</role-name>
  </security-role>
  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>my-realm</realm-name>
  </login-config>
</web-app>

请注意,Servlet 规范定义的 <url-pattern > 相对于 web 应用程序的上下文路径。如果您的应用程序被打包为 my-app.war,Wild 会在上下文路径 /my-app 下访问,< url-patternpattern& gt; /webservices/* 将应用于相对于 /my-app 的路径。

例如,针对 http://my-server/my-app/webservices/my-endpoint 的请求将匹配 /webservices/* 模式,而 http://my-server/webservices/my-endpoint 不会匹配。

这很重要,因为 WildFly-Camel 允许创建 camel-cxf 端点消费者,其基本路径在主机 Web 应用上下文路径之外。例如,可以为 my-app.war 中的 http://my-server/webservices/my-endpoint 创建 camel-cxf consumer。

为了为此类 非上下文端点定义安全约束,Wild-Camel 支持自定义非标准 < url- pattern&gt; 惯例,其中以三个正斜杠为 /// / 的模式作为绝对解析到服务器主机名。例如,要在 my-app.war 中保护 http://my-server/webservices/my-endpoint,您可以在 web.xml 中添加以下配置:

<web-app>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>secure</web-resource-name>
      <url-pattern>///webservices/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>my-role</role-name>
    </auth-constraint>
  </security-constraint>
  <security-role>
    <description>The role that is required to log in to /webservices/*</description>
    <role-name>my-role</role-name>
  </security-role>
  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>my-realm</realm-name>
  </login-config>
</web-app>

第 79 章 CXF-RS 组件

可作为 Camel 版本 2.0 提供

cxfrs: 组件提供与 Apache CXF 集成,以连接到 CXF 上托管的 JAX-RS 1.1 和 2.0 服务。

在将 CXF 用作消费者时,CXF Bean 组件 允许您确定如何将消息有效负载从其处理中接收为 RESTful 或 SOAP Web 服务。这很可能是因为使用多种传输方式使用 Web 服务。bean 组件的配置也更加简单,并提供使用 Camel 和 CXF 实施 Web 服务的最快方法。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
   <groupId>org.apache.camel</groupId>
   <artifactId>camel-cxf</artifactId>
   <version>x.x.x</version>  <!-- use the same version as your Camel core version -->
</dependency>

79.1. URI 格式

cxfrs://address?options

其中 address 代表 CXF 端点的地址

cxfrs:bean:rsEndpoint

其中 rsEndpoint 代表 spring bean 的名称,它呈现 CXFRS 客户端或服务器

对于以上任意样式,您可以在 URI 中附加选项,如下所示:

cxfrs:bean:cxfEndpoint?resourceClasses=org.apache.camel.rs.Example

79.2. 选项

CXF-RS 组件支持 3 个选项,它们如下所列。

名称描述默认类型

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

CXF-RS 端点使用 URI 语法进行配置:

cxfrs:beanId:address

使用以下路径和查询参数:

79.2.1. 路径名(2 参数):

名称描述默认类型

beanId

查找现有配置的 CxfRsEndpoint。必须使用 bean: 作为前缀。

 

字符串

address

服务发布地址。

 

字符串

79.2.2. 查询参数(30 参数):

名称描述默认类型

features (common)

将功能列表设置为 CxfRs 端点。

 

list

loggingFeatureEnabled (common)

这个选项启用 CXF Logging 功能,它将入站和出站 REST 消息写入日志。

false

布尔值

loggingSizeLimit (common)

为限制启用日志记录功能时日志记录器输出的字节数。

 

int

modelRef (common)

此选项用于指定对没有注解的资源定义有用的模型文件。使用此选项时,可以省略服务类,以模拟只读端点

 

字符串

providers (common)

将自定义 JAX-RS 供应商列表设置为 CxfRs 端点。您可以指定一个字符串,其中包含用逗号分开的注册商列表。

 

字符串

resourceClasses (common)

要导出为 REST 服务的资源类。可以使用逗号分隔多个类。

 

list

schemaLocations (common)

设置可用于验证传入 XML 或 JAXB 驱动的 JSON 的 schema 位置。

 

list

skipFaultLogging (common)

这个选项控制阶段拦截器链是否跳过记录它所捕获的故障。

false

布尔值

bindingStyle (consumer)

设置请求和响应如何从 Camel 映射到/有两个值可以:简单配置:此绑定风格处理请求参数、多部分等,并将它们映射到 IN headers、IN attachments 和 message body。它旨在消除 org.apache.cxf.message.MessageContentsList 的低级别处理。它还在响应映射中增加了更大的灵活性和简单性。仅适用于消费者。默认:默认风格。对于将 MessageContentsList 传递给路由的用户,需要在路由中处理低级处理。这是传统绑定风格,只需将来自 CXF 堆栈中的 org.apache.cxf.message.MessageContentsList 转储到 IN 消息正文。然后,用户负责根据 JAX-RS 方法签名定义的合同来处理。custom:允许您通过绑定选项指定自定义绑定。

默认

BindingStyle

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

publishedEndpointUrl (consumer)

这个选项可覆盖从 WADL 发布的 endpointUrl,它可以通过资源地址 url 和 _wadl 访问

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

serviceBeans (consumer)

要导出为 REST 服务的 service Bean。可以用逗号分隔多个 Bean。

 

list

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

hostnameVerifier (producer)

要使用的主机名验证器。使用 # 表示法引用 registry 中的 HostnameVerifier。

 

HostnameVerifier

sslContextParameters (producer)

Camel SSL 设置参考.使用 # 表示法来引用 SSL 上下文。

 

SSLContextParameters

throwExceptionOnFailure (producer)

这个选项告诉 CxfRsProducer 检查返回代码,如果返回代码大于 207,将生成例外情况。

true

布尔值

httpClientAPI (producer)

如果是 true,CxfRsProducer 将使用 HttpClientAPI 调用该服务。如果是 false,CxfRsProducer 将使用 ProxyClientAPI 调用该服务

true

布尔值

ignoreDeleteMethodMessage Body (producer)

这个选项用于告知 CxfRsProducer 在使用 HTTP API 时忽略 DELETE 方法的消息正文。

false

布尔值

maxClientCacheSize (producer)

此选项允许您配置缓存的最大大小。实施在 CxfProvider 和 CxfRsProvider 中缓存 CXF 客户端或 ClientFactoryBean。

10

int

binding (advanced)

使用自定义 CxfBinding 控制 Camel 消息和 CXF 消息之间的绑定。

 

CxfRsBinding

总线 (高级)

使用自定义配置的 CXF 总线。

 

总线

continuationTimeout (advanced)

这个选项用于设置 CXF continuation 超时,在 CXF 服务器使用 Jetty 或 Servlet 传输时,默认可用于 CxfConsumer。

30000

long

cxfRsEndpointConfigurer (advanced)

这个选项可以应用 org.apache.camel.component.cxf.jaxrs.CxfRsEndpointConfigurer 的实现,它支持以编程方式配置 CXF 端点。用户可以通过实施 CxfEndpointConfigurer 的 configureServer/Client 方法来配置 CXF 服务器和客户端。

 

CxfRsEndpoint Configurer

defaultBus (advanced)

当 CXF 端点自行创建总线时,将设置默认总线

false

布尔值

headerFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

performInvocation (advanced)

当 选项为 true 时,Camel 将执行资源类实例的调用,并将响应对象放入交换中,以进行进一步处理。

false

布尔值

propagateContexts (advanced)

当 选项为 true 时,使用 JAXRS UriInfo、HttpHeaders、Request 和 SecurityContext 上下文可用于自定义 CXFRS 处理器(键入 Camel 交换属性)。这些上下文可用于使用 JAX-RS API 分析当前请求。

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

79.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.cxfrs.enabled

启用 cxfrs 组件

true

布尔值

camel.component.cxfrs.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.cxfrs.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.cxfrs.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

您还可以通过 spring 配置配置 CXF REST 端点。由于 CXF REST 客户端和 CXF REST 服务器之间存在许多差异,因此我们为其提供了不同的配置。如需更多信息,请查看架构文件和 CXF JAX-RS 文档

79.4. 如何在 Camel 中配置 REST 端点

camel-cxf 架构文件 中,REST 端点定义有两个元素。cxf:rsServer for REST consumer, cxf:rsClient for REST producer.
您可以在此处找到 Camel REST 服务路由配置示例。

79.5. 如何覆盖邮件标头中的 CXF producer 地址

camel-cxfrs producer 支持通过使用 "CamelDestinationOverrideUrl 键设置消息来覆盖服务地址。

 // set up the service address from the message header to override the setting of CXF endpoint
 exchange.getIn().setHeader(Exchange.DESTINATION_OVERRIDE_URL, constant(getServiceAddress()));

79.6. 消耗 REST 请求 - Simple Binding Style

可从 Camel 2.11 开始

默认 绑定样式不是低级,需要用户手动处理进入该路由的 MessageContentsList 对象。因此,它将路由逻辑与 JAX-RS 操作的方法签名和参数索引紧密耦合。某种程度上,很困难且容易出错。

相反,SimpleConsumer 绑定方式执行以下映射,以便可以在 Camel 消息内 使请求数据更易于访问

  • JAX-RS 参数(@HeaderParam、@QueryParam 等)作为环境变量注入。标头名称与注解的值匹配。
  • 请求实体(POJO 或其他类型)成为 IN 消息正文。如果无法在 JAX-RS 方法签名中识别单个实体,它将回退到原始消息 ContentsList
  • 二进制 @Multipart body 部分成为 IN 消息附加,支持 DataHandlerInputStreamDataSource 和 CXF 的 Attachment 类。
  • 非二进制 @Multipart 正文部分被映射为 IN 消息标头。标头名称与 Body Part name 匹配。

另外,以下规则适用于 Response 映射

  • 如果消息正文类型与 javax.ws.rs.core. Response (用户构建的响应)不同,则创建一个新响应,并且消息正文设置为实体(因此,这是不为空)。响应状态代码从 Exchange.HTTP_RESPONSE_CODE 标头中获取,如果不存在,则默认为 200 OK。
  • 如果消息正文类型等于 javax.ws.rs.core.Response,这表示用户已构建了一个自定义响应,因此会遵守最后的响应。
  • 在所有情况下,自定义或默认 HeaderFilterStrategy 允许的 Camel 标头都添加到 HTTP 响应中。

79.6.1. 启用 Simple Binding Style

通过将消费者端点中的 bindingStyle 参数设置为 SimpleConsumer 来激活此绑定风格:

  from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
    .to("log:TEST?showAll=true");

79.6.2. 使用不同方法签名的请求绑定示例

以下是简单绑定的方法签名列表以及预期的结果。

公共响应 doAction (BusinessObject request);
Request payload is placed in IN message body, 替换原始 MessageContentsList。

公共响应 doAction (BusinessObject request, @HeaderParam ("abcd") String abcd, @QueryParam ("defg") String defg) String defg); Request payload put in IN message body, 替换原始 MessageContentsList。两个请求参数都映射为 IN 消息标头,名称为 abcd 和 defg。

公共响应 doAction (@HeaderParam ("abcd") String abcd, @QueryParam ("defg") String defg) String defg; Both request params by name abcd and defg.原始的 MessageContentsList 被保留,即使它只包含 2 参数。

公共响应 doAction (@Multipart (value="body1") BusinessObject 请求, @Multipart (value="body2") BusinessObject request2); 第一个参数以名为 body1 的标头传输,第二个参数被映射为标题正文2。原始消息内容列表作为 IN 消息正文保留。

公共响应 doAction (InputStream abcd); InputStream is unwrapped from the MessageContentsList and preserved as the IN message body.

公共响应 doAction (DataHandler abcd); DataHandler is unwrapped from the MessageContentsList 并保留为 IN message body。

79.6.3. 简单绑定 Style 的更多示例

使用此方法获得 JAX-RS 资源类:

@POST @Path("/customers/{type}")
public Response newCustomer(Customer customer, @PathParam("type") String type, @QueryParam("active") @DefaultValue("true") boolean active) {
    return null;
}

由以下路由提供服务:

from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
    .recipientList(simple("direct:${header.operationName}"));

from("direct:newCustomer")
    .log("Request: type=${header.type}, active=${header.active}, customerData=${body}");

以下带有 XML 有效负载的 HTTP 请求(假设客户 DTO 为 JAXB-annotated):

POST /customers/gold?active=true

Payload:
<Customer>
  <fullName>Raul Kripalani</fullName>
  <country>Spain</country>
  <project>Apache Camel</project>
</Customer>

将打印信息:

Request: type=gold, active=true, customerData=<Customer.toString() representation>

有关如何处理请求和写入响应的更多示例,可在此处找到

79.7. 消耗 REST Request - Default Binding Style

CXF JAXRS 前端 实施 JAX-RS (JSR-311) API,以便我们可以将资源类导出为 REST 服务。我们利用 CXF Invoker API 将 REST 请求转变为普通的 Java 对象方法调用。与 Camel Restlet 组件不同,您不需要在端点中指定 URI 模板,CXF 会根据 JSR-311 规格将 REST 请求 URI 来处理资源类方法映射。在 Camel 中完成的所有操作都将这个方法请求委派给正确的处理器或端点。

以下是 CXFRS route…​ 示例

private static final String CXF_RS_ENDPOINT_URI =
        "cxfrs://http://localhost:" + CXT + "/rest?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceResource";
private static final String CXF_RS_ENDPOINT_URI2 =
        "cxfrs://http://localhost:" + CXT + "/rest2?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerService";
private static final String CXF_RS_ENDPOINT_URI3 =
        "cxfrs://http://localhost:" + CXT + "/rest3?"
        + "resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceNoAnnotations&"
        + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceModel.xml";
private static final String CXF_RS_ENDPOINT_URI4 =
        "cxfrs://http://localhost:" + CXT + "/rest4?"
        + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceDefaultHandlerModel.xml";
private static final String CXF_RS_ENDPOINT_URI5 =
        "cxfrs://http://localhost:" + CXT + "/rest5?"
        + "propagateContexts=true&"
        + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceDefaultHandlerModel.xml";
protected RouteBuilder createRouteBuilder() throws Exception {
    final Processor testProcessor = new TestProcessor();
    final Processor testProcessor2 = new TestProcessor2();
    final Processor testProcessor3 = new TestProcessor3();
    return new RouteBuilder() {
        public void configure() {
            errorHandler(new NoErrorHandlerBuilder());
            from(CXF_RS_ENDPOINT_URI).process(testProcessor);
            from(CXF_RS_ENDPOINT_URI2).process(testProcessor);
            from(CXF_RS_ENDPOINT_URI3).process(testProcessor);
            from(CXF_RS_ENDPOINT_URI4).process(testProcessor2);
            from(CXF_RS_ENDPOINT_URI5).process(testProcessor3);
        }
    };
}

以及用来配置 endpoint…​

INFO:*注意资源类*

默认情况下,JAX-RS 资源类是 only* 用于配置 JAX-RS 属性。方法将 *not 在将消息路由到端点时执行。相反,路由负责执行所有处理。

请注意,从 Camel 2.15 开始,它还足以提供一个接口,而不能为默认模式实施类。

从 Camel 2.15 开始,如果启用了 performInvocation 选项,则首先将调用服务实施,该响应将设置在 Camel 交换上,并且路由执行将继续正常。这可用于将现有的 JAX-RS 实施集成到 Camel 路由中,并在自定义处理器中进行后处理 JAX-RS 响应。

@Path("/customerservice/")
public interface CustomerServiceResource {

    @GET
    @Path("/customers/{id}/")
    Customer getCustomer(@PathParam("id") String id);

    @PUT
    @Path("/customers/")
    Response updateCustomer(Customer customer);

    @Path("/{id}")
    @PUT()
    @Consumes({ "application/xml", "text/plain",
                    "application/json" })
    @Produces({ "application/xml", "text/plain",
                    "application/json" })
    Object invoke(@PathParam("id") String id,
                    String payload);
}

79.8. 如何通过 camel-cxfrs producer 调用 REST 服务

CXF JAXRS 前端 实施基于代理的客户端 API,通过此 API,您可以通过代理调用远程 REST 服务。camel-cxfrs producer 基于此 代理 API。您只需在消息标头中指定操作名称,并在消息正文中准备 参数,C camel-cxfrs producer 将为您生成正确的 REST 请求。

下面是一个示例:

Exchange exchange = template.send("direct://proxy", new Processor() {
    public void process(Exchange exchange) throws Exception {
        exchange.setPattern(ExchangePattern.InOut);
        Message inMessage = exchange.getIn();
        // set the operation name
        inMessage.setHeader(CxfConstants.OPERATION_NAME, "getCustomer");
        // using the proxy client API
        inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.FALSE);
        // set a customer header
        inMessage.setHeader("key", "value");
        // setup the accept content type
        inMessage.setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json");
        // set the parameters , if you just have one parameter
        // camel will put this object into an Object[] itself
        inMessage.setBody("123");
    }
});

// get the response message
Customer response = (Customer) exchange.getOut().getBody();

assertNotNull("The response should not be null ", response);
assertEquals("Get a wrong customer id ", 123, response.getId());
assertEquals("Get a wrong customer name", "John", response.getName());
assertEquals("Get a wrong response code", 200, exchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE));
assertEquals("Get a wrong header value", "value", exchange.getOut().getHeader("key"));

CXF JAXRS 前端还提供以 http 为中心的客户端 API。 您也可以从 camel-cxfrs producer 调用此 API。您需要指定 HTTP_PATH 和 HTTP_METHOD ,并让制作者利用 URI 选项 httpClientAPI 或设置消息标题 CxfConstants.CAMEL_CXF_RS_USING_HTTP_API。您可以将响应对象转换为通过消息标头 CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS 指定的类型类。

Exchange exchange = template.send("direct://http", new Processor() {
    public void process(Exchange exchange) throws Exception {
        exchange.setPattern(ExchangePattern.InOut)
        Message inMessage = exchange.getIn();
        // using the http central client API
        inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.TRUE);
        // set the Http method
        inMessage.setHeader(Exchange.HTTP_METHOD, "GET");
        // set the relative path
        inMessage.setHeader(Exchange.HTTP_PATH, "/customerservice/customers/123");
        // Specify the response class , cxfrs will use InputStream as the response object type
        inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, Customer.class);
        // set a customer header
        inMessage.setHeader("key", "value");
        // since we use the Get method, so we don't need to set the message body
        inMessage.setBody(null);
    }
});

从 Camel 2.1 开始,我们还支持指定 CXFRS http 以客户端为 cxfrs URI 的查询参数。

Exchange exchange = template.send("cxfrs://http://localhost:9003/testQuery?httpClientAPI=true&q1=12&q2=13"

要支持动态路由,您可以使用 CxfConstants.CAMEL_CXF_RS_QUERY_MAP 标头覆盖 URI 的查询参数。

Map<String, String> queryMap = new LinkedHashMap<>();
queryMap.put("q1", "new");
queryMap.put("q2", "world");
inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_QUERY_MAP, queryMap);

79.9. 什么是 CXF 的 Camel 传输

在 CXF 中,您可以通过定义其地址来提供或消耗 Web 服务。地址的第一个部分指定要使用的协议。例如,端点配置中的 address="http://localhost:9000" 意味着您的服务将使用 localhost 的端口 9000 协议来提供您的服务。当您将 Camel Tranport 集成到 CXF 时,您可以获得新的传输"camel"。您可以指定地址="camel://direct:MyEndpointName" 将 CXF 服务地址绑定到 camel direct 端点。

从技术角度讲,CXF 的 Camel 传输是使用 Camel 核心库实施 CXF 传输 API 的组件。这可让您轻松地将 Camel 的路由引擎和集成模式与 CXF 服务一同支持。

79.10. 将 Camel 集成到 CXF 传输层

将 Camel 场合成您的 CXF 总线,您需要使用 CamelTransportFactory。您可以在 Java 中和 Spring 中执行此操作。

79.10.1. 在 Spring 中设置 Camel 传输

如果要配置任何特殊内容,您可以使用应用程序上下文中的以下代码片段:如果您只想激活 camel 传输,则不必在应用程序上下文中做任何操作。旦在您的应用程序中包含 camel-cxf-transport jar (or camel-cxf.jar),如果您的 camel 版本小于 2.7.x,则 cxf 将扫描 jar 并加载 CamelTransportFactory。

<!-- you don't need to specify the CamelTransportFactory configuration as it is auto load by CXF bus -->
<bean class="org.apache.camel.component.cxf.transport.CamelTransportFactory">
  <property name="bus" ref="cxf" />
  <property name="camelContext" ref="camelContext" />
  <!-- checkException new added in Camel 2.1 and Camel 1.6.2 -->
  <!-- If checkException is true , CamelDestination will check the outMessage's
     exception and set it into camel exchange. You can also override this value
     in CamelDestination's configuration. The default value is false.
     This option should be set true when you want to leverage the camel's error
     handler to deal with fault message -->
  <property name="checkException" value="true" />
  <property name="transportIds">
    <list>
      <value>http://cxf.apache.org/transports/camel</value>
    </list>
  </property>
</bean>

79.10.2. 以编程方式集成 Camel 传输

Camel 传输提供了一组Context 方法,可用于将 Camel 上下文设置为传输工厂。如果您希望此工厂生效,则需要将工厂注册到 CXF 总线中。以下是您的完整示例:

import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.transport.ConduitInitiatorManager;
import org.apache.cxf.transport.DestinationFactoryManager;
...

BusFactory bf = BusFactory.newInstance();
Bus bus = bf.createBus();
CamelTransportFactory camelTransportFactory = new CamelTransportFactory();
// set up the CamelContext which will be use by the CamelTransportFactory
camelTransportFactory.setCamelContext(context)
// if you are using CXF higher then 2.4.x the
camelTransportFactory.setBus(bus);

// if you are lower CXF, you need to register the ConduitInitiatorManager and DestinationFactoryManager like below
// register the conduit initiator
ConduitInitiatorManager cim = bus.getExtension(ConduitInitiatorManager.class);
cim.registerConduitInitiator(CamelTransportFactory.TRANSPORT_ID, camelTransportFactory);
// register the destination factory
DestinationFactoryManager dfm = bus.getExtension(DestinationFactoryManager.class);
dfm.registerDestinationFactory(CamelTransportFactory.TRANSPORT_ID, camelTransportFactory);
// set or bus as the default bus for cxf
BusFactory.setDefaultBus(bus);

79.11. 使用 Spring 配置目的地和 conduit

79.11.1. 命名空间

用于配置 Camel 传输端点的元素在命名空间 http://cxf.apache.org/transports/camel 中定义。通常会使用前缀 camel 来引用。要使用 Camel 传输配置元素,您需要将下面显示的行添加到端点配置文件的 beans元素中。另外,您需要将配置元素的命名空间添加到 xsi:schemaLocation 属性。

添加配置命名空间

<beans ...
       xmlns:camel="http://cxf.apache.org/transports/camel
       ...
       xsi:schemaLocation="...
                           http://cxf.apache.org/transports/camel
                           http://cxf.apache.org/transports/camel.xsd
                          ...>

79.11.2. destination 元素

您可以使用 camel:destination 元素及其子项来配置 Camel 传输服务器端点。camel:destination 元素取单个属性 name,用于指定与端点对应的 WSDL 端口元素。name 属性的值格式为 portQName'.camel-destination'。以下示例显示了使用 camel:destination 元素,用来为 WSDL 片段 < port binding="widgetSOAPPort" name="widgetSOAPPort"&gt; 指定的端点添加配置(如果端点的目标命名空间为 http://widgets.widgetvendor.net)。

camel:destination Element

...
  <camel:destination name="{http://widgets/widgetvendor.net}widgetSOAPPort.http-destination>
    <camelContext id="context" xmlns="http://activemq.apache.org/camel/schema/spring">
         <route>
           <from uri="direct:EndpointC" />
           <to uri="direct:EndpointD" />
         </route>
     </camelContext>
  </camel:destination>

  <!-- new added feature since Camel 2.11.x
  <camel:destination name="{http://widgets/widgetvendor.net}widgetSOAPPort.camel-destination" camelContextId="context" />

...

Spring 的 camel:destination 元素有许多子元素,用于指定配置信息。它们如下所述。

element

描述

camel-spring:camelContext

您可以在 camel 目的地中指定 camel 上下文

camel:camelContextRef

您要注入 camel 目的地的 camel 上下文 id

79.11.3. conduit 元素

您可以使用 camel:conduit 元素及其子项来配置 Camel 传输客户端。camel:conduit 元素取单个属性 name,用于指定与端点对应的 WSDL 端口元素。name 属性的值采用 portQName'.camel-conduit' 的形式。例如,下面的代码显示 camel:conduit 元素,用于为 WSDL 片段 < port binding="widgetSOAPBinding" name="widgetSOAPPort" name="widgetSOAPPort" > 添加配置。http://widgets.widgetvendor.net

http-conf:conduit Element

...
  <camelContext id="conduit_context" xmlns="http://activemq.apache.org/camel/schema/spring">
       <route>
           <from uri="direct:EndpointA" />
           <to uri="direct:EndpointB" />
       </route>
   </camelContext>

  <camel:conduit name="{http://widgets/widgetvendor.net}widgetSOAPPort.camel-conduit">
     <camel:camelContextRef>conduit_context</camel:camelContextRef>
  </camel:conduit>

  <!-- new added feature since Camel 2.11.x
  <camel:conduit name="{http://widgets/widgetvendor.net}widgetSOAPPort.camel-conduit" camelContextId="conduit_context" />


  <camel:conduit name="*.camel-conduit">
  <!-- you can also using the wild card to specify the camel-conduit that you want to configure -->
    ...
  </camel:conduit>
...

camel:conduit 元素含有多个子元素,用于指定配置信息。它们如下所述。

element

描述

camel-spring:camelContext

您可以在 camel conduit 中指定 camel 上下文

camel:camelContextRef

您要注入 camel 上下文 id

79.12. 使用 Blueprint 配置目的地及过期

Camel 2.11.x 中,Camel 传输支持使用 Blueprint 配置。

如果使用蓝图,您应该使用命名空间 http://cxf.apache.org/transports/camel/blueprint 并导入 schema,如 blow。

为蓝图添加配置命名空间

<beans ...
       xmlns:camel="http://cxf.apache.org/transports/camel/blueprint"
       ...
       xsi:schemaLocation="...
                           http://cxf.apache.org/transports/camel/blueprint
                           http://cxf.apache.org/schmemas/blueprint/camel.xsd
                          ...>

在蓝图 camel:conduit camel:destination 只有一个 camelContextId 属性,它们不支持在 camel 目的地中指定 camel 上下文。

  <camel:conduit id="*.camel-conduit" camelContextId="camel1" />
  <camel:destination id="*.camel-destination" camelContextId="camel1" />

79.13. 使用 Camel 作为 CXF 的负载均衡器示例

本例演示了如何在 CXF 中使用 camel 负载均衡功能。您需要在 CXF 中载入配置文件,并在地址 "camel://direct:EndpointA" 和 "camel://direct:EndpointB" 上发布端点。

79.14. 将 Camel 附加到 CXF 的完整方法和示例

使用 Apache Camel 更好的 JMS Transport for CXF Webservice 

第 80 章 Data Format 组件

作为 Camel 2.12 版本提供

dataformat: 组件允许使用 Data Format 作为 Camel 组件。

80.1. URI 格式

dataformat:name:(marshal|unmarshal)[?options]

其中 name 是 Data Format 的名称。然后遵循这个操作必须是 marshal 或 unmarshal 。这些选项用于配置 使用中的数据格式。有关它支持的选项,请参阅数据格式文档。

80.2. DataFormat Options

Data Format 组件没有选项。

Data Format 端点使用 URI 语法进行配置:

dataformat:name:operation

使用以下路径和查询参数:

80.2.1. 路径名(2 参数):

名称描述默认类型

name

数据格式 所需的 名称

 

字符串

operation

所需的 Operation 使用 marshal 或 unmarshal

 

字符串

80.2.2. 查询参数(1 参数):

名称描述默认类型

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

80.3. 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>

第 81 章 dataset 组件

作为 Camel 版本 1.3 提供

测试分布式和异步处理非常困难。MockTestingDataSet 端点与 Camel 测试框架配合良好,使用 企业集成模式 和 Camel 的大型组件与强大的 Bean 集成来简化您的单元和集成测试。

DataSet 组件提供了一种机制来轻松执行系统负载和进行测试。它通过允许您创建 DataSet 实例 作为消息来源,并以此作为断言收到数据集的方法。

在发送 dataset 时,Camel 将使用 吞吐量日志记录器

81.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.SimpleDataSetorg.apache.camel.component.dataset.ListDataSet 和 org.apache.camel.component.dataset.FileDataSet,所有这些扩展 DataSetSupport

81.2. 选项

Dataset 组件没有选项。

Dataset 端点使用 URI 语法进行配置:

dataset:name

使用以下路径和查询参数:

81.2.1. 路径名(1 参数):

名称描述默认类型

name

在 registry 中查询 所需的 DataSet Name

 

DataSet

81.2.2. 查询参数(19 参数):

名称描述默认类型

dataSetIndex (common)

控制 CamelDataSetIndex 标头的行为。对于 Consumers: - off = 标头将不会设置 - strict/lenient = 标头将针对 Producers: - off = off = 不会被验证,如果没有设置标头值,则不会设置它。如果不存在,标头值必须存在,并将验证 = lenient = 标头值(如果不存在)验证。

lenient

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

initialDelay (consumer)

开始发送消息前等待的时间段(forllis)。

1000

long

minRate (consumer)

等待 DataSet 至少包含这个消息数

0

int

preloadSize (consumer)

设置路由完成初始化前应该先加载多少消息(打开)

0

long

produceDelay (consumer)

可以指定延迟,这会导致在消费者发送消息时出现延迟(模拟缓慢处理)

3

long

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

assertPeriod (producer)

设置一个宽限期,在模拟端点将重新排序后,以确保预消除断言仍然有效。例如,这使用 断言完全到达多个消息。例如,如果 expectedMessageCount(int)被设置为 5,则当 5 个或更多消息到达时满足断言。要确保正好 5 个消息到达,您需要等待一些期限以确保没有进一步的消息到达。这是您可以使用此 setAssertPeriod (长)方法。默认情况下禁用这个周期。

0

long

consumeDelay (producer)

可以指定延迟,这会导致当消息被生产者消耗(模拟缓慢处理)时造成延迟。

0

long

expectedCount (producer)

指定此端点应收到的预期消息交换数量。注意:如果您想要预期是 0 信息,那么在测试开始时,需要设置 0 匹配,以便让测试在一定时间运行期间,以确保没有消息被到达;对于使用 setAssertPeriod(long)。另一种方法是使用 NotifyBuilder,并在在模拟器上调用 assertIsSatisfied()方法前,使用通知程序来知道 Camel 需要路由某些信息。这可让您使用固定的断言周期来加快测试时间。如果您想要断言有 n 条消息到达这个模拟端点,则还需要看到 setAssertPeriod(long)方法了解更多详情。

-1

int

reportGroup (producer)

用于根据大小组打开吞吐量日志的数字。

 

int

resultMinimumWaitTime (producer)

设置 assertIsSatised ()将在 latch 上等待的时间最少的时间(以 millisisis)等待。

0

long

resultWaitTime (producer)

设置 assertIsSatised ()将在 latch 上等待的最大时间(以 millisisis)等待的时间,直到它满足为止

0

long

retainFirst (producer)

指定仅保留第 n 个接收交换的数量。这在测试大数据时,通过不存储每个 Exchange this模拟端点的副本来减少内存消耗。重要信息:使用这个限制时,getReceivedCounter()仍会返回接收的 Exchange 的实际数量。例如,如果我们收到 5000 Exchanges,并且已配置为仅保留第 10 个 Exchanges,则 getReceivedCounter()将仍然返回 5000,但 getExchanges()中只有前 10 Exchanges()和 getReceivedExchanges()方法。使用此方法时,某些其它预期方法不被支持,例如 expectedBodiesReceived (Object…​)会设置收到的第一个数量的正文。您可以配置 setRetainFirst(int)和 setRetainLast(int)方法来限制第一个和最后一个接收的方法。

-1

int

retainLast (producer)

指定仅保留最近 n 个接收的 Exchange 数。这在测试大数据时,通过不存储每个 Exchange this模拟端点的副本来减少内存消耗。重要信息:使用这个限制时,getReceivedCounter()仍会返回接收的 Exchange 的实际数量。例如,如果我们收到 5000 Exchanges,并且已配置为仅保留最后 20 个 Exchanges,则 getReceivedCounter()将仍然返回 5000,但 getExchanges()中只有最后 20 Exchanges()和 getReceivedExchanges()方法。使用此方法时,某些其它预期方法不被支持,例如 expectedBodiesReceived (Object…​)会设置收到的第一个数量的正文。您可以配置 setRetainFirst(int)和 setRetainLast(int)方法来限制第一个和最后一个接收的方法。

-1

int

sleepForEmptyTest (producer)

允许指定睡眠,在 expectedMessageCount (int)被调用时,等待此端点是否确实为空。

0

long

copyOnExchange (producer)

设定在这种模拟端点接收时是否对传入 Exchange 进行深度副本。默认为 true。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

81.3. Configuring DataSet

Camel 将在实施 DataSet 接口 bean 的 Registry 中查找。因此,您可以将自己的 DataSet 注册为:

<bean id="myDataSet" class="com.mycompany.MyDataSet">
  <property name="size" value="100"/>
</bean>

81.4. 示例

例如,要测试是否将一组消息发送到队列,然后从队列使用,而不丢失任何消息:

// 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,如配置数据集合方式以及消息等。   

81.5. DataSetSupport (abstract 类)

DataSetSupport 抽象类是新 DataSets 的 nice 起点,它为派生类提供一些有用的功能。

81.5.1. DataSetSupport 的属性

属性类型默认值描述

defaultHeaders

map<String,Object>

null

指定默认的消息正文。对于 SimpleDataSet,它是一个恒定有效负载;虽然您希望为每个消息创建自定义有效负载,但请自行创建 DataSetSupport 的 derivation。

outputTransformer

org.apache.camel.Processor

null

 

size

long

10

指定要发送/消耗的消息数量。

reportCount

long

-1

指定报告进度前要接收的消息数量。有助于显示大型负载测试的进度。如果 < 0,则 大小为 / 5,如果是 0,则其他 大小设置为 reportCount 值。

81.6. SimpleDataSet

SimpleDataSet 扩展 DataSetSupport,并添加默认的正文。

81.6.1. SimpleDataSet 中的其他属性

属性类型默认值描述

defaultBody

对象

<hello>world!</hello>

指定默认的消息正文。默认情况下,SimpleDataSet 会为每个交换生成相同的恒定有效负载。如果要自定义每个交换的有效负载,请创建一个 Camel 处理器并通过设置 outputTransformer 属性来配置 SimpleDataSet 来使用它。

81.7. ListDataSet

自 Camel 2.17 开始可用

List'DataSet' 扩展 DataSetSupport 并添加默认正文列表。

81.7.1. ListDataSet 上的额外属性

属性类型默认值描述

defaultBodies

列出<Object>

empty LinkedList<Object>

指定默认的消息正文。默认情况下,ListDataSet 使用 CamelDataSetIndexdefaultBodies 列表选择一个恒定有效负载。如果要自定义有效负载,请创建一个 Camel 处理器,并通过设置 outputTransformer 属性来配置 ListDataSet 来使用它。

size

long

defaultBodies 列表的大小

指定要发送/消耗的消息数量。这个值可以与 defaultBodies 列表的大小不同。如果该值小于 defaultBodies 列表的大小,则不会使用一些列表元素。如果该值大于 defaultBodies 列表的大小,则将使用 CamelDataSetIndies.size()的 modulus 来选择交换的载荷,以及 defaultBodies 列表(例如 CamelDataSetIndex % defaultBodies.size()

81.8. FileDataSet

自 Camel 2.17 开始可用

FileDataSet 扩展 ListDataSet,并添加从文件中加载正文的支持。

81.8.1. FileDataSet 上的其他属性

属性类型默认值描述

sourceFile

File

null

指定有效负载的源文件

delimiter

字符串

\z

指定 java.util.Scanner 用来将文件拆分为多个有效负载的分隔符模式。

第 82 章 DigitalOcean Component

作为 Camel 版本 2.19 可用

借助 DigitalOcean 组件,您可以通过封装 [digitalocean-java](https://www.digitalocean.com/community/projects/api-client-in-java)来管理 DigitalOcean 云中 Droplet 和资源。通过此 Camel 组件也提供您在 DigitalOcean 控制面板中熟悉的所有功能。

82.1. 前提条件

您必须具有有效的 DigitalOcean 帐户和有效的 OAuth 令牌。您可以通过访问您帐户的 DigitalOcean 控制面板的 [Apps & API (https://cloud.digitalocean.com/settings/applications)部分来生成 OAuth 令牌。

82.2. URI 格式

DigitalOcean 组件 使用以下 URI 格式:

digitalocean://endpoint?[options]

其中 端点 是 DigitalOcean 资源类型。

示例:列出您的 droplets:

digitalocean://droplets?operation=list&oAuthToken=XXXXXX&page=1&perPage=10

DigitalOcean 组件仅支持制作者端点,因此您无法在路由开始时使用此组件来侦听频道中的消息。

82.3. 选项

DigitalOcean 组件没有选项。

DigitalOcean 端点使用 URI 语法进行配置:

digitalocean:operation

使用以下路径和查询参数:

82.3.1. 路径名(1 参数):

名称描述默认类型

operation

执行的操作。

 

DigitalOceanOperations

82.3.2. 查询参数(10 参数):

名称描述默认类型

page (producer)

使用 进行分页.强制页面编号。

1

整数

perPage (producer)

使用 进行分页.设置每个请求的项目数。每个页面的最大结果数为 200。

25

整数

resource (producer)

需要 执行该操作的 DigitalOcean 资源类型。

 

DigitalOceanResources

digitalOceanClient (advanced)

使用现有配置的 DigitalOceanClient 作为客户端

 

DigitalOceanClient

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

httpProxyHost (proxy)

根据需要设置代理主机

 

字符串

httpProxyPassword (proxy)

如果需要,设置代理密码

 

字符串

httpProxyPort (proxy)

如果需要,设置代理端口

 

整数

httpProxyUser (proxy)

根据需要设置代理主机

 

字符串

oAuthToken (security)

DigitalOcean OAuth 令牌

 

字符串

82.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.digitalocean.enabled

启用 digitalocean 组件

true

布尔值

camel.component.digitalocean.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

您必须为每个端点提供 操作值,使用 操作 URI 选项或 CamelDigitalOceanOperation 消息标头。

所有 操作值 都在 DigitalOceanOperations enumeration 中定义。

组件使用的所有 标头 名称在 DigitalOceanHeaders enumeration 中定义。

82.5. 消息正文结果

所有返回的消息正文都使用 数字ocean-api-java 库提供的对象。

82.6. API 速率限制

通过 camel-digitalocean 组件封装的 DigitalOcean REST API 被限制为 API Rate Limiting。您可以在 [API Rate Limits 文档](https://developers.digitalocean.com/documentation/v2/#rate-limit)中找到每种方法限值。

82.7. 帐户端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | get | get account info | | com.myjeeva.digitalocean.pojo.Account |

82.8. BlockStorages endpoint

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list | list all Block Storage volumes | | List<com.myjeeva.digitalocean.pojo.Volume > | | get | get | 显示有关块存储卷的信息 | CamelDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Volume | get | get | 显示为 Block Storage 卷的信息| CamelDigitalOceanName String <br>'Cam elDigitalOceanRegion' String| com.myjeeva.digitalocean.pojo.Volume | | listSnapshots | 检索从卷创建的快照 | CamelDigitalOceanId Integer| List <com.myjeeva.digitalocean.pojo.Snapshot> | | create | 创建新卷 | CamelDigitalOceanVolumeSizeGigabytes Integer<br>'CamelDigitalOceanName' String<br> 'CamelDigitalOceanDescription'* String<br>'CamelDigitalOceanRegion'* String| com.myjeeva.digitalocean.pojo.Volume | | delete | 删除块存储卷, 销毁所有数据并将其从帐户| CamelDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Delete| | 删除 块存储卷| CamelDigitalOcean name String<br>'CamelDigitalOceanRegion' String| com.myjeeva.digitalocean.Delete | attach | attach | attach a Block Storage volume to a Droplet| CamelDigitalOceanId integer <br>'CamelDigitalOceanDropletId' Integer<br>'CamelDigitalOceanDropletRegion' String| com.myjeeva.digitalocean.pojo.Action | attach |通过名称将块存储卷附加到 Droplet| CamelDigitalOceanName String<br>'CamelDigitalOceanDropletId' Integer<br>'CamelDigitalOceanDrop' String| com.myjeeva.digitalocean.pojo.Action | 分离 | 将块存储卷从 Droplet| CamelDigitalOceanId Integer <br>'CamelDigitalOceanDropletId' 整数<br>'CamelDigitalOceanDropletRegion' String| com.myjeeva.digitalocean.pojo.Action | name | 从 aDroplet 中分离块存储卷 ceanName String<br>'CamelDigitalOceanDropletId' Integer<br>'CamelDigitalOceanDropletRegion' String| com.myjeeva.digitalocean.pojo.Action | resize | 重新定义块存储卷的大小 | CamelDigitalOceanVolumeSizeGigabytes Integer<br>'CamelDigitalOceanRegion' String| com.myjeeva.digitalocean.pojo.Action | | listActions | 检索卷上执行的所有操作 | CamelDigitalOceanId Integer| List<com.myjeeva.digitalocean.pojo.Action> |

82.9. Droplets 端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list all Droplets | | List<com.myjeeva.digitalocean.pojo.pojo.Droplet > | | get | show a individual droplet | Cam elDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Droplet | | create | Create a new Droplet | CamelDigitalOceanName String <br>'CamelDigitOalce aDropletImage' String <br>'CamelDigitalOceanRegion' String <br>'CamelDigitalOceanDropletSize' String <br>'CamelDigitalOceanDropletSSHKeys' String\& lt;String\> <br>'CamelDigitalOceanDropletEnableBackups'* Boolean <br>'CamelDigitalOceanDropletEnableIpv6'* Boolean & lt;br>'CamelDigitalOceanDropletEnablePrivateNetwork ING'* Boolean <br>'CamelDigitalOceanDropletUserData'* String <br>'CamelDigitalOceanDropletVolumes'* List\<String\> <br>'CamelDigitalOceanDropletTag S' List\<String\&gt; | com.myjeeva.digitalocean.pojo.Droplet | | create | create multiple Droplets | CamelDigitalOceanNames List\<String\> &lt;br>'CamelDi gitalOceanDropletImage' String <br>'CamelDigitalOceanRegion' String <br>'CamelDigitalOceanDropletSize' String <br>'CamelDigitalOceanDropletSSHKeys'* List\ <string\ > <br>'CamelDigitalOceanDropletEnableBackups'* Boolean <br>'CamelDigitalOceanDropletEnableIpv6'* Boolean <br>'CamelDigitalOceanDropletEnableP rivateNetworking'* Boolean <br>'CamelDigitalOceanDropletUserData'* String <br>'CamelDigitalOceanDropletVolumes'* List\<String\> < br>'CamelDigitOalce aDropletTags 的 List\<String\&gt; | com.myjeeva.digitalocean.pojo.Droplet | | delete | 删除 aDroplet, | CamelDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Delete | | enableBackups | enableBackups | CamelDigitalOceanId Integer | com.myjeeva.digitalocean.pojo.Action | | disableBackups | 禁用现有 Droplet | CamelDigitalOceanId Integer| com.myjeeva.digitalocean. POJO.Action | | enableIpv6 | 在现有的 Droplet | CamelDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Action | | enablePri vateNetworking | 在现有 Droplet 上启用私有网络 | CamelDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Action | | reboot | reboot aDroplet | CamelDi gitalOceanId Integer| com.myjeeva.digitalocean.pojo.Action | | powerCycle | Droplet | CamelDigitalOceanId Integer| com.myjj eeva.digitalocean.pojo.Action | | shutdown | 关闭 Droplet | CamelDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Action | | | poweroff | 关闭电源 | CamelDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Action | | powerOn | CamelDigitalO ceanId Integer| com.myjeeva.digitalocean.pojo.Action | | restore | shutdown a Droplet | CamelDigitalOceanId Integer <br>'CamelDigitalOce anImageId' Integer| com.myjeeva.digitalocean.pojo.Action | | passwordReset | 重置 Droplet | CamelDigitalOceanId Integer| com.myj eeva.digitalocean.pojo.Action | | resize | resize a Droplet | CamelDigitalOceanId Integer <br>'CamelDigitalOceanDropletSize' String| com.myj eeva.digitalocean.pojo.Action | | rebuild | Droplet | CamelDigitalOceanId Integer <br>'CamelDigitalOceanImageId' Integer| com.my jeeva.digitalocean.pojo.Action | | rename | rename a Droplet | CamelDigitalOceanId Integer <br>'CamelDigitalOceanName' String| com.myjee VA.digitalocean.pojo.Action | | changeKernel | 更改 Droplet 的内核 | CamelDigitalOceanId Integer <br>'CamelDigitalOceanKernelId' Integer| com .myjeeva.digitalocean.pojo.Action | | takeSnapshot | 快照 aDroplet | CamelDigitalOceanId Integer <br>'CamelDigitalOceanName'* String| com. myjeeva.digitalocean.pojo.Action | | tag | tag a Droplet | CamelDigitalOceanId Integer <br>'CamelDigitalOceanName' String| com.myjee VA.digitalocean.pojo.Response | | untag | untag a Droplet | CamelDigitalOceanId Integer <br>'CamelDigitalOceanName' String| com.myjee VA.digitalocean.pojo.Response | | listKernels | 检索供 a Droplet 的所有内核的列表 | CamelDigitalOceanId Integer | List<com.myjeeva.digitalocean.po jo.Kernel& gt; | | listSnapshots | 检索从 Droplet 中创建的快照 | CamelDigitalOceanId Integer | List<com.myjeeva.digitalocean.pojo.Snapshot&gt; | listBackups |检索与 Droplet 关联的任何备份 | CamelDigitalOceanId Integer | List<com.myjeeva.digitalocean.pojo.Backup > | listActions | 检索 Droplet 上执行的所有操作 | CamelDigitalOceanId Integer | List<com.myjeeva.digitalocean.pojo.Action > | | listNeighbors | 获取在同一物理服务器上运行的丢弃列表 | Camel DigitalOceanId Integer | List<com.myjeeva.digitalocean.pojo.Droplet > | | listAllNeighbors | 检索在同一物理硬件上运行的任何 droplets 列表 | | List& lt;com.myjee VA.digitalocean.pojo.Droplet> |

82.10. 镜像端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list | list images | CamelDigitalOceanType| DigitalOceanImageTypes | List<com.myjeeva.digitalocean. POJO.Image&gt; | | ownList | 仅检索用户的私有镜像 | | List<com.myjeeva.digitalocean.pojo.Image > | | listActions | 检索已在镜像 | CamelDigitalOceanId 上执行的所有操作。 整数 | List<com.myjeeva.digitalocean.pojo.Action > | | get | 获取镜像(公共或私有)的信息| CamelDigitalOceanId Integer| com. myjeeva.digitalocean.pojo.Image | get | get | 通过 slug| CamelDigitalOceanDropletImage String| com.myjeeva.digitalocean.pojo.Image | | | 更新 | 更新镜像| CamelDigitalOceanId Integer <br>'CamelDigitalOceanName' String| com.myjeeva.digitalocean.pojo.Image | 删除 | 删除镜像 | CamelDigitalOceanId Integer | com.myjeeva.digitalocean.pojo.Delete | 传输 | 转让一个镜像| CamelDigitalOceanId Integer <br>' CamelDigitalOceanRegion' String| com.myjeeva.digitalocean.pojo.Action | | convert | 转换一个镜像, 例如,对快照的备份| CamelDigitalOceanId Integer | com.myjeeva.digitalocean.pojo.Action |

82.11. 快照端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list | list your account 上所有可用的快照 | CamelDigitalOceanType* DigitalOceanSnapshotTypes | List<com.myjeeva.digitaloc ean.pojo.Snapshot& gt; | get | 获取快照信息| CamelDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Snapshot | | 删除 | 删除快照 | CamelDigit alOceanId Integer | com.myjeeva.digitalocean.pojo.Delete |

82.12. 密钥端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list | list all keys | | List<com.myjeeva.digitalocean.pojo.Key > | | get | get | amelDigitalOceanId Integer| com.myjeeva.digitalocean.pojo.Key | get | get | 通过指纹| CamelDigitalOceanKeyFingerprint String| com .myjeeva.digitalocean.pojo.Key | | update | 更新密钥|C DigitalOceanId Integer <br>'CamelDigitalOceanName' String| com.myjeeva .digitalocean.pojo.Key | 更新 | 通过指纹更新密钥| CamelDigitalOceanKeyFingerprint String <br>'CamelDigitalOceanName' String| com.myjeeva .digitalocean.pojo.Key | | delete | delete a key by id| CamelDigitalOceanId Integer | com.myjeeva.digitalocean.pojo.Delete | | delete | delete a key by f ingerprint| CamelDigitalOceanKeyFingerprint String | com.myjeeva.digitalocean.pojo.Delete |

82.13. 区域端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list all areas | | List<com.myjeeva.digitalocean.pojo.Region > |

82.14. 大小端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list all size | | List<com.myjeeva.digitalocean.pojo.Size > |

82.15. 浮动 IP 端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list | list all Floating IPs on your account | | List<com.myjeeva.digitalocean.pojo.FloatingIP > | | create | create a new Floating IP 分配给一个Droplet | CamelDigitalOceanId Integer | List<com.myjeeva.digitalocean.pojo.FloatingIP &gt ; | | create | 创建分配给 Region | CamelDigitalOceanRegion 的新浮动 IP 字符串 | List<com.myjeeva.digitalocean.pojo.FloatingIP > | | get | 检索有关浮动 IP 的信息| CamelDigitalOceanFloatingIPAddress String| com.myjeeva.digitaloc ean.pojo.Key | | delete | 删除浮动 IP 并从您的帐户中删除它| CamelDigitalOceanFloatingIPAddress String| com.myjeeva.digitalocean.pojo.Delete | | 分配 | 分配 Droplet 的浮动 IP| CamelDigitalOceanFloatingIPAddress String <br>'CamelDigitalOceanDropletId' Integer| com.myjeeva.digitalocean.pojo.Action | | | unassign | unassign a Floating IP | CamelDigitalOceanFloatingIPAddress String | com.myjeeva.digitalocean.pojo.Action | | listActions | 检索已在浮动上执行的所有操作 IP | CamelDigitalOceanFloatingIPAddress String | List<com.myjeeva.digitalocean.pojo.Action> |

82.16. 标签端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list all tags | | List<com.myjeeva.digitalocean.pojo.Tag > | | create | create a Tag | CamelDigitalOce aName String | com.myjeeva.digitalocean.pojo.Tag | | get | 检索单个标签 | CamelDigitalOceanName String | com.myjeeva.digitalocean.pojo | | | 删除 | 删除标签 | CamelDigitalOceanName String | com.myjeeva.digitalocean.pojo.Delete | | 更新 | 更新标签 | CamelDigitalOceanName String <br >'CamelDigitalOceanNewName' String| com.myjeeva.digitalocean.pojo.Tag |

82.17. 例子

获取您的帐户信息

from("direct:getAccountInfo")
    .setHeader(DigitalOceanConstants.OPERATION, constant(DigitalOceanOperations.get))
    .to("digitalocean:account?oAuthToken=XXXXXX")

创建一个 droplet

from("direct:createDroplet")
    .setHeader(DigitalOceanConstants.OPERATION, constant("create"))
    .setHeader(DigitalOceanHeaders.NAME, constant("myDroplet"))
    .setHeader(DigitalOceanHeaders.REGION, constant("fra1"))
    .setHeader(DigitalOceanHeaders.DROPLET_IMAGE, constant("ubuntu-14-04-x64"))
    .setHeader(DigitalOceanHeaders.DROPLET_SIZE, constant("512mb"))
    .to("digitalocean:droplet?oAuthToken=XXXXXX")

列出所有 droplets

from("direct:getDroplets")
    .setHeader(DigitalOceanConstants.OPERATION, constant("list"))
    .to("digitalocean:droplets?oAuthToken=XXXXXX")

检索 Droplet 的信息(dropletId = 34772987)

from("direct:getDroplet")
    .setHeader(DigitalOceanConstants.OPERATION, constant("get"))
    .setHeader(DigitalOceanConstants.ID, 34772987)
    .to("digitalocean:droplet?oAuthToken=XXXXXX")

Droplet 的关闭信息(dropletId = 34772987)

from("direct:shutdown")
    .setHeader(DigitalOceanConstants.ID, 34772987)
    .to("digitalocean:droplet?operation=shutdown&oAuthToken=XXXXXX")

第 83 章 Direct Component

作为 Camel 版本 1.0 可用

直接: 组件在制作者发送消息交换时,为任何消费者提供直接同步调用。
此端点可用于连接 同一 camel 上下文中的现有路由。

提示

异步的 SEDA 组件可在生产者发送消息交换时提供异步调用任何消费者。

提示

连接到其他 camel 上下文虚拟机 组件提供 Camel 上下文之间的连接,只要它们在同一个 JVM 中运行。

83.1. URI 格式

direct:someName[?options]

其中 someName 可以是任何可唯一标识端点的字符串

83.2. 选项

Direct 组件支持 3 个选项,它们如下所列。

名称描述默认类型

block (producer)

如果向没有活动使用者的直接端点发送消息,则制作者可以告知制作者块并等待使用者处于活动状态。

true

布尔值

timeout (producer)

如果启用了块,要使用的超时值。

30000

long

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Direct 端点使用 URI 语法配置:

direct:name

使用以下路径和查询参数:

83.2.1. 路径名(1 参数):

名称描述默认类型

name

直接端点 所需的 名称

 

字符串

83.2.2. 查询参数(7 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

block (producer)

如果向没有活动使用者的直接端点发送消息,则制作者可以告知制作者块并等待使用者处于活动状态。

true

布尔值

failIfNoConsumers (producer)

当发送到没有活动用户的 DIRECT 端点时,生产程序是否应引发异常。

false

布尔值

timeout (producer)

如果启用了块,要使用的超时值。

30000

long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

83.3. 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 组件中的样本,它们如何一起使用。

83.4. 另请参阅

第 84 章 Direct VM Component

作为 Camel 2.10 版本提供

direct-vm: 组件在制作者发送消息交换时,为 JVM 中的任何消费者提供直接同步调用。
此端点可用于连接同一 camel 上下文中的现有路由,以及 同一 JVM 中的其他 camel 上下文。

此组件与 Direct 组件不同,直接-VM 支持 CamelContext 实例间的通信 - 因此,您可以使用此机制在 web 应用程序间通信(提供 camel-core.jar 是在系统/boot 类路径上)。

在运行时,您可以停止现有消费者并启动新消费者。
但在任何给定时间,给定端点最多只能有一个活跃的使用者。

此组件也可以连接部署在不同 OSGI Bundles 中的路由,因为您可以在此后看到。即使它们在不同的捆绑包中运行,camel 路由也会使用相同的线程。
使用事务(Tx)来自动开发应用程序。

image

84.1. URI 格式

direct-vm:someName

其中 someName 可以是任何可唯一标识端点的字符串

84.2. 选项

Direct VM 组件支持 5 个选项,它们如下所列。

名称描述默认类型

block (producer)

如果向没有活动使用者的直接端点发送消息,则制作者可以告知制作者块并等待使用者处于活动状态。

true

布尔值

timeout (producer)

如果启用了块,要使用的超时值。

30000

long

headerFilterStrategy (advanced)

设置一个 HeaderFilterStrategy,它将只应用于制作者端点(在声明和响应中)。默认值:none。

 

HeaderFilterStrategy

propagateProperties (advanced)

是否将属性从生产方传播到消费者端,反之亦然。默认值:true。

true

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Direct VM 端点使用 URI 语法配置:

direct-vm:name

使用以下路径和查询参数:

84.2.1. 路径名(1 参数):

名称描述默认类型

name

direct-vm 端点 所需的 名称

 

字符串

84.2.2. 查询参数(9 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

block (producer)

如果向没有活动使用者的直接端点发送消息,则制作者可以告知制作者块并等待使用者处于活动状态。

true

布尔值

failIfNoConsumers (producer)

当发送到没有活跃消费者的 Direct-VM 端点时,生产程序是否应引发异常。

false

布尔值

timeout (producer)

如果启用了块,要使用的超时值。

30000

long

headerFilterStrategy (producer)

设置一个 HeaderFilterStrategy,它将只应用于制作者端点(在声明和响应中)。默认值:none。

 

HeaderFilterStrategy

propagateProperties (advanced)

是否将属性从生产方传播到消费者端,反之亦然。默认值:true。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

84.3. Samples

在以下路由中,我们使用直接组件将这两个路由链接在一起:

from("activemq:queue:order.in")
    .to("bean:orderServer?method=validate")
    .to("direct-vm:processOrder");

现在在另一个 CamelContext 中,比如另一个 OSGi 捆绑包

from("direct-vm: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-vm:processOrder"/>
</route>

<route>
 <from uri="direct-vm:processOrder"/>
 <to uri="bean:orderService?method=process"/>
 <to uri="activemq:queue:order.out"/>
</route>

84.4. 另请参阅

第 85 章 Disruptor 组件

作为 Camel 2.12 版本提供

中断者: 组件提供异步 SEDA 行为和标准 SEDA 组件,但利用一个 Disruptor 而不是由标准 SEDA 使用的 BlockingQueue。或者,

breakor-vm: 此组件支持端点,为标准 虚拟机 提供替代功能。与 SEDA 组件一样,破坏者的缓冲: 端点仅在 单个 CamelContext 中可见,不提供支持持久性或恢复。disruption or-vm: 端点的 缓冲区还支持 CamelContexts 实例间的通信,因此您可以使用此机制在 web 应用程序间通信(提供 camel-disruptor.jar 是在 系统/引导 类路径上)。

选择在 SEDA 或 VM 组件上使用 Disruptor 组件的主要优点在发生在生产者和/或多播化或并发消费者之间具有高竞争的情况。在这样的情形中,观察到了延迟的显著增加和缩短时间。在没有争用情形的情况下性能与 SEDA 和 VM 组件相当。

Disruptor 通过尽可能多地对 SEDA 和虚拟机组件的行为和选项实施。它们的主要区别如下:

  • 使用的缓冲区总是以大小(默认 1024 交换)绑定。
  • 由于缓冲区始终被取整,所以 Disruptor 的默认行为是阻止,而缓冲区已满,而不是抛出异常。此默认行为可以在组件上配置(请参阅选项)。
  • Disruptor enpoints 没有实施 BrowsableEndpoint 接口。因此,目前在 Disruptor 中的交换无法被检索,只有交换量才会被检索。
  • 分销商要求以静态方式配置其消费者(多播或其他)。即时添加或删除消费者需要完全清空 Disruptor 中所有待处理的交换。
  • 因此,重新配置:通过经销商发送的数据将直接处理,如果至少有一个消费者是消费者,则相关加入者只能在其加入后获得新交换。
  • Disruptor 组件不支持 pollTimeout 选项。
  • 当制作者在全 Disruptor 上阻止时,它不会响应线程中断。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-disruptor</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

85.1. URI 格式

 disruptor:someName[?options]

或者

 disruptor-vm:someName[?options]

其中 someName 可以是当前 CamelContext 中唯一标识端点的任何字符串(如果是
中断或-vm:),则可在上下文中标识。
您可以按照以下格式将查询选项附加到 URI:

  ?option=value&option=value&…

85.2. 选项

所有这些选项对 breakor 和 disruption or -vm: 组件都有效

Disruptor 组件支持 8 个选项,它们如下。

名称描述默认类型

defaultConcurrent Consumers (consumer)

配置默认并发用户数

1

int

默认多使用者(消费者

为多个消费者配置默认值

false

布尔值

defaultProducerType (producer)

要为 DisruptorProducerType 配置默认值,默认值为 Multi。

multi

DisruptorProducerType

defaultWaitStrategy (consumer)

要为 DisruptorWaitStrategy 配置默认值,默认值为 Blocking。

Blocking

DisruptorWaitStrategy

defaultBlockWhenFull (producer)

当 full The 默认值为 true 时为 block 配置默认值。

true

布尔值

queueSize (common)

弃用了 配置环缓冲大小

 

int

bufferSize (common)

配置环缓冲大小

1024

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Disruptor 端点使用 URI 语法进行配置:

disruptor:name

使用以下路径和查询参数:

85.2.1. 路径名(1 参数):

名称描述默认类型

name

队列 所需的 名称

 

字符串

85.2.2. 查询参数(12 参数):

名称描述默认类型

size (common)

Disruptors ringbuffer 的最大容量将有效增加到两个最接近的功率。注意:如果您使用此选项,则使用队列名称创建的第一个端点来确定大小。为确保所有端点的大小都相同的大小,然后在所有这些端点上配置 size 选项,或者配置所创建的第一个端点。

1024

int

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

concurrentConsumers (consumer)

并发线程处理次数。

1

int

multipleConsumers (consumer)

指定是否允许多个消费者。如果启用,您可以使用 Disruptor 进行 Publish-Subscbe 消息传递。也就是说,您可以将消息发送到队列,并让每个消费者收到消息的副本。启用后,应在每个消费者端点上指定这个选项。

false

布尔值

waitStrategy (consumer)

定义消费者线程在发布新交换上等待的策略。允许的选项有:Blocking、Sleeping、BusySpin 和 Yielding。

Blocking

DisruptorWaitStrategy

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

blockWhenFull (producer)

将消息发送到完全 Disruptor 的线程将阻止,直到 ringbuffer 的容量不再用尽。默认情况下,调用线程将阻止并等待消息被接受。通过禁用这个选项,将抛出异常表示队列已满。

false

布尔值

producerType (producer)

定义 Disruptor 上允许的制作者。允许的选项有:多以便允许多个制作者,并且 Single 才能启用特定的优化,仅当一个并发制作者(在一个线程或其他同步)处于活动状态时(一个线程或同步)。

multi

DisruptorProducerType

timeout (producer)

生产者将在等待异步任务完成前超时(以毫秒为单位)。您可以使用 0 或一个负值禁用超时。

30000

long

waitForTaskToComplete (producer)

指定 caller 是否应该等待 async 任务完成的选项,然后再继续。支持以下三个选项: Always、Never 或 IfReplyExpected。前两个值有自我说明。最后一个值 ifReplyExpected 只有在消息是 Request Reply based.

IfReplyExpected

WaitForTaskToComplete

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

85.3. Spring Boot Auto-Configuration

组件支持 18 个选项,如下所示。

名称描述默认类型

camel.component.disruptor-vm.buffer-size

配置环缓冲大小

1024

整数

camel.component.disruptor-vm.default-block-when-full

当 full The 默认值为 true 时为 block 配置默认值。

true

布尔值

camel.component.disruptor-vm.default-concurrent-consumers

配置默认并发用户数

1

整数

camel.component.disruptor-vm.default-multiple-consumers

为多个消费者配置默认值

false

布尔值

camel.component.disruptor-vm.default-producer-type

要为 DisruptorProducerType 配置默认值,默认值为 Multi。

 

DisruptorProducerType

camel.component.disruptor-vm.default-wait-strategy

要为 DisruptorWaitStrategy 配置默认值,默认值为 Blocking。

 

DisruptorWaitStrategy

camel.component.disruptor-vm.enabled

启用 breakor-vm 组件

true

布尔值

camel.component.disruptor-vm.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.disruptor.buffer-size

配置环缓冲大小

1024

整数

camel.component.disruptor.default-block-when-full

当 full The 默认值为 true 时为 block 配置默认值。

true

布尔值

camel.component.disruptor.default-concurrent-consumers

配置默认并发用户数

1

整数

camel.component.disruptor.default-multiple-consumers

为多个消费者配置默认值

false

布尔值

camel.component.disruptor.default-producer-type

要为 DisruptorProducerType 配置默认值,默认值为 Multi。

 

DisruptorProducerType

camel.component.disruptor.default-wait-strategy

要为 DisruptorWaitStrategy 配置默认值,默认值为 Blocking。

 

DisruptorWaitStrategy

camel.component.disruptor.enabled

启用 breakor 组件

true

布尔值

camel.component.disruptor.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.disruptor-vm.queue-size

配置环缓冲大小

 

整数

camel.component.disruptor.queue-size

配置环缓冲大小

 

整数

85.4. 等待策略

等待被等待下一个交换的消费者线程执行的等待类型生效。可以选择以下策略:

名称描述建议

Blocking

阻塞策略使用锁定和状况变量等待在 barrier 上等待的消费者。

当吞吐量和低延迟不与 CPU 资源一样重要时,可以使用此策略。

sleeping

最初旋转的策略,然后使用 Thread.yield (),最终 OS 和 JVM 将允许最少的 nanos,而消费者正在等待 barrier。

此策略在性能和 CPU 资源之间是一个很好的折衷。延迟激增可能会在静默期后发生。

BusySpin

忙碌 Spin 策略使用忙碌的旋转循环来等待一个 barrier 的消费者。

此策略将使用 CPU 资源来避免出现延迟危机的 syscalls。当线程可以绑定到特定 CPU 内核时,最好使用它。

产生

生成使用 Thread.yield ()在初始启动后等待 barrier 消费的策略。

此策略在性能和 CPU 资源之间是一个很好的折衷,而不会产生大量延迟高峰。

85.5. Reply 使用请求

Disruptor 组件支持使用 Request Reply,其中调用者会等待 Async 路由完成。例如:

from("mina:tcp://0.0.0.0:9876?textline=true&sync=true").to("disruptor:input");
from("disruptor:input").to("bean:processInput").to("bean:createResponse");

在上面的路由中,我们在端口 9876 上有一个 TCP 侦听器接受传入请求。请求被路由到 break or:input 缓冲。由于它是 Request Reply 消息,我们会等待响应。当 challenge or:input 缓冲区上的使用者完成时,它会将响应复制到原始消息响应。

85.6. 并发消费者

默认情况下,Disruptor 端点使用单个使用者线程,但您可以将其配置为使用并发使用者线程。因此,您可以使用的线程池而不是线程池:

from("disruptor:stageName?concurrentConsumers=5").process(...)

至于两者之间的差别,请注意,线程池可以在运行时动态增加/缩小,而并发使用者的数量始终被内部修复和支持,因此性能会更高。

85.7. 线程池

请注意,通过类似以下内容将线程池添加到 Disruptor 端点:

from("disruptor:stageName").thread(5).process(...)

可以通过添加要与 Disruptor 结合使用的普通块 Queue,以有效地利用 Disruptor 来取代性能提升的一部分。相反,建议您使用并发Consumers 选项直接配置 Disruptor 端点上处理消息的线程数。

85.8. 示例

在下面的路径中,我们使用 Disruptor 将请求发送到这个 async 队列,以便能够向另一个线程发送 fire-and-forget 消息,并将此线程中的恒定回复返回至原始调用者。

public void configure() throws Exception {
    from("direct:start")
        // send it to the disruptor that is async
        .to("disruptor:next")
        // return a constant response
        .transform(constant("OK"));

    from("disruptor:next").to("mock:result");
}

此处我们发送 Hello World 消息,并预期回复是 OK。

Object out = template.requestBody("direct:start", "Hello World");
assertEquals("OK", out);

"Hello World"消息将从另一个线程的 Disruptor 中消耗来进一步处理。由于这是一个单元测试,因此它将发送到模拟端点,在单元测试中我们可以进行断言。

85.9. 使用多个Consumers

在这个示例中,我们定义了两个消费者,并将它们注册为 spring beans。

<!-- define the consumers as spring beans -->
<bean id="consumer1" class="org.apache.camel.spring.example.FooEventConsumer"/>

<bean id="consumer2" class="org.apache.camel.spring.example.AnotherFooEventConsumer"/>

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <!-- define a shared endpoint which the consumers can refer to instead of using url -->
    <endpoint id="foo" uri="disruptor:foo?multipleConsumers=true"/>
</camelContext>

由于在 Disruptor foo 端点上指定了多个Consumers=true,所以我们可以有两人或更多用户收到他们自己的消息副本作为 pub-sub 风格的消息传递。作为 Beans 是单元测试的一部分,只需向模拟端点发送消息,但请注意,我们可以如何使用 @Consume 从 Disruptor 使用。

public class FooEventConsumer {

    @EndpointInject(uri = "mock:result")
    private ProducerTemplate destination;

    @Consume(ref = "foo")
    public void doSomething(String body) {
        destination.sendBody("foo" + body);
    }

}

85.10. 提取中断或信息

如果需要,可以在不使用 JMX 的情况下获取缓冲区大小等信息:

DisruptorEndpoint disruptor = context.getEndpoint("disruptor:xxxx");
int size = disruptor.getBufferSize();

第 86 章 DNS 组件

可作为 Camel 版本 2.7 提供

这是 Camel 用来使用 DNSJava 运行 DNS 查询的附加组件。组件是 DNSJava 顶部的精简层。
组件提供以下操作:

  • IP,通过其 ip 解析域。
  • 查找有关域的信息
  • dig,运行 DNS 查询

INFO:*Requires SUN JVM* DNSJava 库需要在 SUN JVM 上运行。
如果您使用 Apache ServiceMix 或 Apache Karaf,您需要调整 etc/jre.properties 文件,以将 sun.net.spi.nameservice 添加到导出的 Java 平台软件包列表中。此更改生效之前,服务器需要重新启动。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-dns</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

86.1. URI 格式

DNS 组件的 URI 方案如下

dns://operation[?options]

此组件仅支持制作者。

86.2. 选项

DNS 组件没有选项。

DNS 端点使用 URI 语法配置:

dns:dnsType

使用以下路径和查询参数:

86.2.1. 路径名(1 参数):

名称描述默认类型

dnsType

所需的 查找类型。

 

DnsType

86.2.2. 查询参数(1 参数):

名称描述默认类型

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

86.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.dns.enabled

启用 dns 组件

true

布尔值

camel.component.dns.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

86.4. Headers

标头类型操作描述

dns.domain

字符串

ip

域名。必需。

dns.name

字符串

lookup

要查找的名称。必需。

dns.type

 

lookup, dig

查找的类型。应该与 org.xbill.dns.Type 的值匹配。可选。

dns.class

 

lookup, dig

查询的 DNS 类。应该与 org.xbill.dns.DClass 的值匹配。可选。

dns.query

字符串

dig

查询本身。必需。

dns.server

字符串

dig

特别用于查询的服务器。如果未指定,则使用操作系统指定的默认值。可选。

86.5. 例子

86.5.1. IP 查找

        <route id="IPCheck">
            <from uri="direct:start"/>
            <to uri="dns:ip"/>
        </route>

这会查找域的 IP。例如,www.example.com 解析为 192.0.32.10。
要查找的 IP 地址必须在标头中提供,其键为 "dns.domain "。

86.5.2. DNS 查找

        <route id="IPCheck">
            <from uri="direct:start"/>
            <to uri="dns:lookup"/>
        </route>

这会返回与某个域关联的一组 DNS 记录。
要查找的名称必须在标头中通过键 "dns.name" 提供。

86.5.3. DNS Dig

dig 是用于运行 DNS 查询的 Unix 命令行工具。

        <route id="IPCheck">
            <from uri="direct:start"/>
            <to uri="dns:dig"/>
        </route>

该查询必须在标头中通过键 "dns.query" 提供。

86.6. DNS 激活策略

DnsActivationPolicy 可用于根据 dns 状态动态启动和停止路由。

如果您的同一组件实例在不同的地区中运行,您可以在各个地区配置路由,使其仅在 dns 指向其区域时才会激活。

例如,您可以在 NYC 和 SFO 中的实例中有一个实例。您可以将服务 CNAME service.example.com 配置为指向 nyc-service.example.com,使 NYC 实例启动和 SFO 实例。当您将 CNAME service.example.com 更改为指向 sfo-service.example.com的 sfo 实例时,sfnyc 实例将停止其路由,sfo 将启动其路由。这可让您在不重启实际组件的情况下切换区域。

	<bean id="dnsActivationPolicy" class="org.apache.camel.component.dns.policy.DnsActivationPolicy">
		<property name="hostname" value="service.example.com" />
		<property name="resolvesTo" value="nyc-service.example.com" />
		<property name="ttl" value="60000" />
		<property name="stopRoutesOnException" value="false" />
	</bean>

	<route id="routeId" autoStartup="false" routePolicyRef="dnsActivationPolicy">
	</route>

第 87 章 Docker 组件

作为 Camel 版本 2.15 可用

与 Docker 通信的 Camel 组件。

Docker Camel 组件通过 Docker 远程 API 利用 docker-java 。

87.1. URI 格式

docker://[operation]?[options]

其中 操作 是要在 Docker 上执行的特定操作。

87.2. 常规选项

Docker 组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享的 docker 配置

 

DockerConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Docker 端点使用 URI 语法配置:

docker:operation

使用以下路径和查询参数:

87.2.1. 路径名(1 参数):

名称描述默认类型

operation

使用所需的 Which 操作

 

DockerOperation

87.2.2. 查询参数(20 参数):

名称描述默认类型

email (common)

与用户关联的电子邮件地址

 

字符串

host (common)

所需的 Docker 主机

localhost

字符串

port (common)

所需的 Docker 端口

2375

整数

requestTimeout (common)

请求响应超时(以秒为单位)

 

整数

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

cmdExecFactory (advanced)

要使用的 DockerCmdExecFactory 实现的完全限定类名称

com.github.dockerjava.netty.NettyDockerCmdExecFactory

字符串

followRedirectFilter (advanced)

是否遵循重定向过滤器

false

布尔值

loggingFilter (advanced)

是否使用日志记录过滤器

false

布尔值

maxPerRouteConnections (advanced)

最大路由连接数

100

整数

maxTotalConnections (advanced)

最大连接总数

100

整数

serverAddress (advanced)

Docker 注册表的服务器地址.

https://index.docker.io/v1/

字符串

socket (advanced)

套接字连接模式

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

certPath (security)

包含 SSL 证书链的位置

 

字符串

密码 (安全)

要进行身份验证的密码

 

字符串

安全 (安全)

使用 HTTPS 通信

false

布尔值

tlsVerify (security)

检查 TLS

false

布尔值

username (security)

要进行身份验证的用户名

 

字符串

87.3. Spring Boot Auto-Configuration

组件支持 20 个选项,如下所示。

名称描述默认类型

camel.component.docker.configuration.cert-path

包含 SSL 证书链的位置

 

字符串

camel.component.docker.configuration.cmd-exec-factory

要使用的 DockerCmdExecFactory 实现的完全限定类名称

com.github.dockerjava.netty.NettyDockerCmdExecFactory

字符串

camel.component.docker.configuration.email

与用户关联的电子邮件地址

 

字符串

camel.component.docker.configuration.follow-redirect-filter

是否遵循重定向过滤器

false

布尔值

camel.component.docker.configuration.host

Docker 主机

localhost

字符串

camel.component.docker.configuration.logging-filter

是否使用日志记录过滤器

false

布尔值

camel.component.docker.configuration.max-per-route-connections

最大路由连接数

100

整数

camel.component.docker.configuration.max-total-connections

最大连接总数

100

整数

camel.component.docker.configuration.operation

要使用哪些操作

 

DockerOperation

camel.component.docker.configuration.parameters

其他配置参数作为键/值对

 

map

camel.component.docker.configuration.password

要进行身份验证的密码

 

字符串

camel.component.docker.configuration.port

Docker 端口

2375

整数

camel.component.docker.configuration.request-timeout

请求响应超时(以秒为单位)

 

整数

camel.component.docker.configuration.secure

使用 HTTPS 通信

false

布尔值

camel.component.docker.configuration.server-address

Docker 注册表的服务器地址.

https://index.docker.io/v1/

字符串

camel.component.docker.configuration.socket

套接字连接模式

true

布尔值

camel.component.docker.configuration.tls-verify

检查 TLS

false

布尔值

camel.component.docker.configuration.username

要进行身份验证的用户名

 

字符串

camel.component.docker.enabled

启用 docker 组件

true

布尔值

camel.component.docker.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

87.4. 标头策略

所有 URI 选项都可以作为标头属性传递。邮件标题中找到的值优先于 URI 参数。标头属性采用带有 CamelDocker 前缀的 URI 选项形式,如下所示

URI 选项标头属性

containerId

CamelDockerContainerId

87.5. 例子

以下示例使用来自 Docker 的事件:

from("docker://events?host=192.168.59.103&port=2375").to("log:event");

以下示例查询 Docker 获取系统范围信息

from("docker://info?host=192.168.59.103&port=2375").to("log:info");

87.6. 依赖项

要在 Camel 路由中使用 Docker,您需要添加对 camel-docker 的依赖项,该依赖项实施该组件。

如果您使用 Maven,您只需在 pom.xml 中添加以下内容,将最新和最大版本的版本号替换(请参阅最新版本下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-docker</artifactId>
  <version>x.x.x</version>
</dependency>

第 88 章 Dozer 组件

作为 Camel 版本 2.15 可用

dozer: 组件提供从 Camel 2.15.0 开始的 Dozer 映射框架来映射 Java Bean 的功能。 Camel 还支持将 Dozer 映射触发 为类型转换器。 使用 Dozer 端点和 Dozer 转换器之间的主要区别如下:

  • 以每个端点为基础管理 Dozer 映射配置的功能与通过转换器 registry 进行全局配置。
  • 可以使用 Camel 数据格式将 Dozer 端点配置为 marshal/unmarshal 输入和输出数据,以支持单个、任何对许多转换端点
  • Dozer 组件允许对 Dozer 的精细集成和扩展来支持附加功能(例如映射字面值,使用表达式进行映射等)。

要使用 Dozer 组件,Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-dozer</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

88.1. URI 格式

Dozer 组件仅支持制作者端点。

dozer:endpointId[?options]

其中 endpointId 是一个用来唯一标识 Dozer 端点配置的名称。 

Dozer 端点 URI 示例:

from("direct:orderInput").
  to("dozer:transformOrder?mappingFile=orderMapping.xml&targetModel=example.XYZOrder").
  to("direct:orderOutput");

88.2. 选项

Dozer 组件没有选项。

Dozer 端点使用 URI 语法进行配置:

dozer:name

使用以下路径和查询参数:

88.2.1. 路径名(1 参数):

名称描述默认类型

name

映射 的人类可读名称。

 

字符串

88.2.2. 查询参数(7 参数):

名称描述默认类型

mappingConfiguration (producer)

用于在 Camel 注册表中的 DozerBeanMapperConfiguration bean 的名称,用于配置 Dozer 映射。这是 mappingFile 选项的替代选择,可用于对配置 Dozer 如何进行精细的控制。记住在值中使用 # 前缀来指示 bean 位于 Camel registry 中(例如 #myDozerConfig)。

 

DozerBeanMapper 配置

mappingFile (producer)

Dozer 配置文件的位置。该文件默认从 classpath 加载,但您可以使用 file:、classpath: 或 http: 从特定位置加载配置。

dozerBeanMapping.xml

字符串

marshalId (producer)

Camel 上下文中定义的 dataFormat id,用于汇总映射输出到非 Java 类型。

 

字符串

sourceModel (producer)

映射中使用的源类型的完全限定域名。如果指定,到映射的输入将转换为指定类型,然后再使用 Dozer 映射。

 

字符串

targetModel (producer)

映射中使用的目标类型所需的完全限定类名称。

 

字符串

unmarshalId (producer)

Camel 上下文中定义的 dataFormat id,用于从非 Java 类型中取消汇总映射输入。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

88.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.dozer.enabled

启用 dozer 组件

true

布尔值

camel.component.dozer.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

88.4. 使用带有 Dozer 的数据格式

Dozer 不支持用于映射的非 Java 源和目标,因此,它不能将 XML 文档映射到其自己的 Java 对象。 幸运的是,Camel 使用 数据格式对 Java 和各种格式之间的汇总有了广泛的支持。 Dozer 组件允许您指定通过 Dozer 处理数据格式的数据格式来指定输入和输出数据,从而充分利用这一支持。 您始终可以在调用 Dozer 之外自行执行此操作,但在 Dozer 组件中直接支持它,您可以使用单个端点来配置 Camel 中的任何对许多转换。

例如,假设您在使用 Dozer 组件在 XML 数据结构和 JSON 数据结构间进行映射。 如果您在 Camel 上下文中定义了以下数据格式:

<dataFormats>
  <json library="Jackson" id="myjson"/>
  <jaxb contextPath="org.example" id="myjaxb"/>
</dataFormats>

然后,您可以使用 JAXB 数据格式将 Dozer 端点配置为传播输入 XML,并使用 Jackson 总结映射输出。

<endpoint uri="dozer:xml2json?marshalId=myjson&amp;unmarshalId=myjaxb&amp;targetModel=org.example.Order"/>

88.5. 配置 Dozer

所有 Dozer 端点都需要一个 Dozer 映射配置文件,该文件用于定义源和目标对象之间的映射。 如果端点上未指定 mappingFile 或 mappingConfiguration 选项,则组件将默认为 META-INF/dozerBeanMapping.xml。 如果您需要为单个端点提供多个映射配置文件,或指定额外的配置选项(如事件监听程序、自定义转换器等),那么您可以使用 org.apache.camel.converter.dozer.DozerBeanMapperConfiguration 的实例。

<bean id="mapper" class="org.apache.camel.converter.dozer.DozerBeanMapperConfiguration">  
  <property name="mappingFiles">
    <list>
      <value>mapping1.xml</value>
      <value>mapping2.xml</value>
    </list>
  </property>
</bean>

88.6. 映射扩展

Dozer 组件将大量扩展实施到 Dozer 映射框架,作为自定义转换器。 这些转换器实现 Dozer 本身不支持的映射功能。

88.6.1. 变量映射

通过变量映射,您可以将 Dozer 配置中的变量定义值映射到 target 字段,而不使用 source 字段的值。 这等同于其他映射框架中的恒定映射,您可以在其中分配字面值到 target 字段。 要使用变量映射,只需在映射配置中定义变量,然后从 VariableMapper 类映射到您选择的目标字段:

<mappings xmlns="http://dozermapper.github.io/schema/bean-mapping"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping http://dozermapper.github.io/schema/bean-mapping.xsd">
  <configuration>
    <variables>
      <variable name="CUST_ID">ACME-SALES</variable>
    </variables>
  </configuration>
  <mapping>
    <class-a>org.apache.camel.component.dozer.VariableMapper</class-a>
    <class-b>org.example.Order</class-b>
    <field custom-converter-id="_variableMapping" custom-converter-param="${CUST_ID}">
      <a>literal</a>
      <b>custId</b>
    </field>
  </mapping>
</mappings>

88.6.2. 自定义映射

通过自定义映射,您可以定义自己的逻辑,以便源字段映射到 target 字段。 它们的功能类似于 Dozer 客户转换器,有两个显著的区别:

  • 您可以在一个类中有多个转换器方法,使用自定义映射。
  • 不需要使用自定义映射实施特定于 Dozer 的界面。

通过使用映射配置中的内置 '_customMapping' 转换程序来声明自定义映射。 这个转换器的参数具有以下语法:

[class-name][,method-name]

方法名称是可选的 - Dozer 组件将搜索与映射所需的输入和输出类型匹配的方法。 下面提供了自定义映射和配置示例。

public class CustomMapper {
    // All customer ids must be wrapped in "[ ]"
    public Object mapCustomer(String customerId) {
        return "[" + customerId + "]";
    }
} 
<mappings xmlns="http://dozermapper.github.io/schema/bean-mapping"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping http://dozermapper.github.io/schema/bean-mapping.xsd">
  <mapping>
    <class-a>org.example.A</class-a>
    <class-b>org.example.B</class-b>
    <field custom-converter-id="_customMapping"
        custom-converter-param="org.example.CustomMapper,mapCustomer">
      <a>header.customerNum</a>
      <b>custId</b>
    </field>
  </mapping>
</mappings>

88.6.3. 表达式映射

表达式映射允许您使用 Camel 的强大 语言 功能来评估表达式,并将结果分配到映射中的 target 字段。 Camel 支持的任何语言都可以在表达式映射中使用。 表达式的基本示例包括将 Camel 消息标头或交换属性映射到 target 字段,或者将多个源字段串联为 target 字段。 映射表达式的语法是:

[language]:[expression]

将消息标头映射到目标字段的示例:

<mappings xmlns="http://dozermapper.github.io/schema/bean-mapping"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping http://dozermapper.github.io/schema/bean-mapping.xsd">
  <mapping>
    <class-a>org.apache.camel.component.dozer.ExpressionMapper</class-a>
    <class-b>org.example.B</class-b>
    <field custom-converter-id="_expressionMapping" custom-converter-param="simple:\${header.customerNumber}">
      <a>expression</a>
      <b>custId</b>
    </field>
  </mapping>
</mappings>

请注意,您的表达式中的任何属性都必须使用 "\" 转义,以防止 Dozer 尝试解析使用 EL 定义的变量值时出现错误。

第 89 章 drill 组件

作为 Camel 版本 2.19 可用

drill: component 为您提供了查询 Apache Drill 集群的功能

drill 是一个用于大数据探索的 Apache 开源 SQL 查询引擎。深入设计的目的是为了支持半结构化和快速演进来自现代大数据应用程序的数据,同时仍然提供 ANSI SQL (行业标准查询语言)的熟悉和生态系统。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-drill</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

89.1. URI 格式

drill://host[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

89.2. drill Producer

制作者使用 CamelDrillQuery 标头执行查询,并将结果放入正文。

89.3. 选项

Drill 组件没有选项。

Drill 端点使用 URI 语法进行配置:

drill:host

使用以下路径和查询参数:

89.3.1. 路径名(1 参数):

名称描述默认类型

主机

所需的 ZooKeeper 主机名或 IP 地址。使用 local 而不是主机名或 IP 地址连接到本地 Drillbit

 

字符串

89.3.2. 查询参数(5 参数):

名称描述默认类型

clusterId (producer)

Cluster ID https://drill.apache.org/docs/using-the-jdbc-driver/#determining-the-cluster-id

 

字符串

directory (producer)

ZooKeeper 中的 drill 目录

 

字符串

mode (producer)

连接模式:zk: Zookeeper drillbit: Drillbit direct connection https://drill.apache.org/docs/using-the-jdbc-driver/

ZK

DrillConnectionMode

port (producer)

zookeeper 端口号

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

89.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.drill.enabled

enable drill 组件

true

布尔值

camel.component.drill.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

89.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 90 章 dropbox 组件

作为 Camel 版本 2.14 可用

dropbox: 组件允许您将 Dropbox 远程文件夹视为生产者或消息使用者。使用 Dropbox Java Core API (这个组件的引用版本为 1.7.x),这个 camel 组件具有以下特点:

  • 作为使用者,按查询下载文件和搜索文件
  • 作为制作者,下载文件,在远程目录之间移动文件、删除 files/dir、通过查询上传文件和搜索文件

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-dropbox</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

90.1. URI 格式

dropbox://[operation]?[options]

其中,操作 是要对 Dropbox 远程文件夹执行的特定操作(通常是 CRUD 操作)。

90.2. 操作

操作描述

del

删除 Dropbox 上的文件或目录

get

从 Dropbox 下载文件

Move

从 Dropbox 上的文件夹移动文件

put

在 Dropbox 上上传文件

search

根据字符串查询在 Dropbox 上搜索文件

操作 需要额外的选项才能工作,特别是操作需要满足一些。

90.3. 选项

要使用 Dropbox API,您需要获取 accessTokenclientIdentifier。
您可以参考 Dropbox 文档来说明如何获取它们。  

Dropbox 组件没有选项。

Dropbox 端点使用 URI 语法进行配置:

dropbox:operation

使用以下路径和查询参数:

90.3.1. 路径名(1 参数):

名称描述默认类型

operation

必需的 特定操作(通常是 CRUD 操作)用于在 Dropbox 远程文件夹上执行。

 

DropboxOperation

90.3.2. 查询参数(12 参数):

名称描述默认类型

accessToken (common)

需要访问令牌来为特定 Dropbox 用户发出 API 请求

 

字符串

client (common)

使用现有的 DbxClient 实例作为 DropBox 客户端。

 

DbxClientV2

clientIdentifier (common)

为发出 API 请求注册的应用程序的名称

 

字符串

localPath (common)

在 Dropbox 上上传来自本地文件系统的可选文件夹或文件。如果还没有配置这个选项,则消息正文将用作要上传的内容。

 

字符串

newRemotePath (common)

目标文件或文件夹

 

字符串

query (common)

用于搜索的空格分隔的子字符串列表。仅当文件包含所有子字符串时,文件才匹配。如果没有设置这个选项,则会匹配所有文件。

 

字符串

remotePath (common)

要移动的原始文件或文件夹

 

字符串

uploadMode (common)

如果 dropbox 上已存在具有相同名称的文件,则会重命名哪个模式。如果 dropbox 上已存在具有相同名称的文件,则会重命名该文件。如果 dropbox 上已存在具有相同名称的文件,则这将会被覆盖。

 

DropboxUploadMode

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

90.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.dropbox.enabled

启用 dropbox 组件

true

布尔值

camel.component.dropbox.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

90.5. Del 操作

删除 Dropbox 上的文件。

只适用于 Camel 制作者。

下面列出了这个操作的选项:

属性Mandatory(必需)描述

remotePath

true

Dropbox 要删除的文件夹或文件

90.5.1. Samples

from("direct:start")
  .to("dropbox://del?accessToken=XXX&clientIdentifier=XXX&remotePath=/root/folder1")
  .to("mock:result");

from("direct:start")
  .to("dropbox://del?accessToken=XXX&clientIdentifier=XXX&remotePath=/root/folder1/file1.tar.gz")
  .to("mock:result");

90.5.2. 结果消息标头

在消息结果中设置了以下标头:

属性

DELETED_PATH

dropbox 上删除的路径名称

90.5.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

字符串

dropbox 上删除的路径名称

90.6. 获取(下载)操作

从 Dropbox 下载文件。

充当 Camel 制作者或 Camel 使用者。

下面列出了这个操作的选项:

属性Mandatory(必需)描述

remotePath

true

从 Dropbox 下载的文件夹或文件

90.6.1. Samples

from("direct:start")
  .to("dropbox://get?accessToken=XXX&clientIdentifier=XXX&remotePath=/root/folder1/file1.tar.gz")
  .to("file:///home/kermit/?fileName=file1.tar.gz");

from("direct:start")
  .to("dropbox://get?accessToken=XXX&clientIdentifier=XXX&remotePath=/root/folder1")
  .to("mock:result");

from("dropbox://get?accessToken=XXX&clientIdentifier=XXX&remotePath=/root/folder1")
  .to("file:///home/kermit/");

90.6.2. 结果消息标头

在消息结果中设置了以下标头:

属性

DOWNLOADED_FILE

如果单个文件下载,则下载的远程文件的路径

DOWNLOADED_FILES

如果下载多个文件,则下载的远程文件的路径

90.6.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

ByteArrayOutputStream

如果单个文件下载,请代表下载的文件的流

Map<String, ByteArrayOutputStream>

如果多个文件下载,使用 作为下载远程文件路径的密钥映射,作为代表下载文件的流值

90.7. 移动操作

将 Dropbox 上的文件移动到另一个文件夹。

只适用于 Camel 制作者。

下面列出了这个操作的选项:

属性Mandatory(必需)描述

remotePath

true

要移动的原始文件或文件夹

newRemotePath

true

目标文件或文件夹

90.7.1. Samples

from("direct:start")
  .to("dropbox://move?accessToken=XXX&clientIdentifier=XXX&remotePath=/root/folder1&newRemotePath=/root/folder2")
  .to("mock:result");

90.7.2. 结果消息标头

在消息结果中设置了以下标头:

属性

MOVED_PATH

dropbox 上移动的路径名称

90.7.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

字符串

dropbox 上移动的路径名称

90.8. 放置(上传)操作

在 Dropbox 上上传文件。

作为 Camel 制作者工作。

下面列出了这个操作的选项:

属性Mandatory(必需)描述

uploadMode

true

添加或强制此选项指定在 dropbox 上应如何保存文件:如果"添加"新文件将会重命名为 (如果 dropbox 上已存在相同名称的文件)。如果 dropbox 上已存在具有相同名称的文件的"强制",这将会被覆盖。

localPath

false

要从本地文件系统上传的文件夹或文件。如果配置了这个选项,则优先于将含有 Camel 消息正文内容的单个文件上传(消息正文转换为字节阵列)。

remotePath

false

Dropbox 上的文件夹目标.如果没有设置属性,则组件会将该文件上传到远程路径上,该路径等于本地路径。对于 Windows 或没有绝对 localPath,您可以运行类似如下的异常:

原因原因:java.lang.IllegalArgumentException: 'path': bad path: must start with "/": "C:/My/File"
or
Caused by: java.lang.IllegalArgumentException: 'path': bad path: must start with "/": "MyFile"

90.8.1. Samples

from("direct:start").to("dropbox://put?accessToken=XXX&clientIdentifier=XXX&uploadMode=add&localPath=/root/folder1")
  .to("mock:result");

from("direct:start").to("dropbox://put?accessToken=XXX&clientIdentifier=XXX&uploadMode=add&localPath=/root/folder1&remotePath=/root/folder2")
  .to("mock:result");

和 上传一个文件,其中包含来自消息正文的内容

from("direct:start")
   .setHeader(DropboxConstants.HEADER_PUT_FILE_NAME, constant("myfile.txt"))
   .to("dropbox://put?accessToken=XXX&clientIdentifier=XXX&uploadMode=add&remotePath=/root/folder2")
   .to("mock:result");

文件的名称可以在标头 DropboxConstants.HEADER_PUT_FILE_NAMEExchange.FILE_NAME 中按照优先顺序的顺序提供。如果没有提供标头,则会将消息 id (uuid)用作文件名。

90.8.2. 结果消息标头

在消息结果中设置了以下标头:

属性

UPLOADED_FILE

如果是单一文件上传,则上传的远程路径的路径

UPLOADED_FILES

对于多个文件上传,使用上传的远程路径的字符串

90.8.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

字符串

如果是单一文件上传,则会导致上传操作、OK 或 KO

map<String, DropboxResultCode>

对于多个文件上传,使用 作为上传的远程文件路径的密钥,以及值上传操作、确定或 KO 的结果。

90.9. 搜索操作

在远程 Dropbox 文件夹中搜索,包括其子目录。

作为 Camel 制作者和 Camel 消费者工作。

下面列出了这个操作的选项:

属性Mandatory(必需)描述

remotePath

true

Dropbox 上的 文件夹,在其中搜索。

query

true

用于搜索的空格分隔的子字符串列表。仅当文件包含所有子字符串时,文件才匹配。如果没有设置这个选项,则会匹配所有文件。该查询需要在端点配置中提供,或者作为 Camel 消息上的标头 CamelDropboxQuery 提供。

90.9.1. Samples

from("dropbox://search?accessToken=XXX&clientIdentifier=XXX&remotePath=/XXX&query=XXX")
  .to("mock:result");

from("direct:start")
  .setHeader("CamelDropboxQuery", constant("XXX"))
  .to("dropbox://search?accessToken=XXX&clientIdentifier=XXX&remotePath=/XXX")
  .to("mock:result");

90.9.2. 结果消息标头

在消息结果中设置了以下标头:

属性

FOUNDED_FILES

构建的文件路径列表

90.9.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

List<DbxEntry>

成立文件路径列表。有关此对象的更多信息,请参阅 Dropbox 文档,

 

第 91 章 Ehcache 组件

作为 Camel 2.18 版提供

ehcache 组件允许您使用 Ehcache 3 作为缓存实施来执行缓存操作。

此组件支持基于制作者和事件的消费者端点。

缓存使用者是基于事件的消费者,可用于侦听和响应特定的缓存活动。 

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ehcache</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

91.1. URI 格式

ehcache://cacheName[?options]

您可以以以下格式在 URI 中附加查询选项 ?option  =value&option=#beanRef&…​

91.2. 选项

Ehcache 组件支持 7 选项,这些选项如下。

名称描述默认类型

配置 (高级)

设置全局组件配置

 

EhcacheConfiguration

cacheManager (common)

缓存管理器

 

CacheManager

cacheManager Configuration (common)

缓存管理器配置

 

配置

cacheConfiguration (common)

用于创建缓存的默认缓存配置。

 

CacheConfiguration

cachesConfigurations (common)

用于创建缓存的缓存配置映射。

 

map

cacheConfigurationUri (common)

指向 Ehcache XML 配置文件位置的 URI

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Ehcache 端点使用 URI 语法进行配置:

ehcache:cacheName

使用以下路径和查询参数:

91.2.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

91.2.2. 查询参数(17 参数):

名称描述默认类型

cacheManager (common)

缓存管理器

 

CacheManager

cacheManagerConfiguration (common)

缓存管理器配置

 

配置

configurationUri (common)

指向 Ehcache XML 配置文件位置的 URI

 

字符串

createCacheIfNotExist (common)

配置如果缓存存在或者未预先配置,则需要创建缓存。

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

eventFiring (consumer)

设置交付模式(同步、异步)

异步

EventFiring

eventOrdering (consumer)

设置交付模式(排序、未排序)

排序

EventOrdering

eventTypes (consumer)

设置要侦听的事件类型

被驱除、EXPIRED、REMOVED、CREATE、UPDATED

Set

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

action (producer)

配置默认缓存操作。如果在消息标头中设置了操作,则来自标头的操作将优先使用。

 

字符串

key (producer)

配置默认操作密钥。如果在消息标头中设置了密钥,则标头中的密钥优先使用。

 

对象

配置 (高级)

用于创建缓存的默认缓存配置。

 

CacheConfiguration

配置 (高级)

用于创建缓存的缓存配置映射。

 

map

keyType (advanced)

缓存密钥类型,默认为 java.lang.Object

java.lang.Object

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

valueType (advanced)

缓存值类型,默认为 java.lang.Object

java.lang.Object

字符串

91.3. Spring Boot Auto-Configuration

组件支持 25 个选项,如下所示。

名称描述默认类型

camel.component.ehcache.cache-configuration

用于创建缓存的默认缓存配置。选项为 org.ehcache.config.CacheConfiguration<,?> 类型。

 

字符串

camel.component.ehcache.cache-configuration-uri

指向 Ehcache XML 配置文件位置的 URI

 

字符串

camel.component.ehcache.cache-manager

缓存管理器。选项是一个 org.ehcache.CacheManager 类型。

 

字符串

camel.component.ehcache.cache-manager-configuration

缓存管理器配置。选项是一个 org.ehcache.config.Configuration 类型。

 

字符串

camel.component.ehcache.caches-configurations

用于创建缓存的缓存配置映射。

 

map

camel.component.ehcache.configuration.action

配置默认缓存操作。如果在消息标头中设置了操作,则来自标头的操作将优先使用。

 

字符串

camel.component.ehcache.configuration.cache-manager

缓存管理器

 

CacheManager

camel.component.ehcache.configuration.cache-manager-configuration

缓存管理器配置

 

配置

camel.component.ehcache.configuration.configuration

用于创建缓存的默认缓存配置。

 

CacheConfiguration

camel.component.ehcache.configuration.configuration-uri

指向 Ehcache XML 配置文件位置的 URI

 

字符串

camel.component.ehcache.configuration.configurations

用于创建缓存的缓存配置映射。

 

map

camel.component.ehcache.configuration.create-cache-if-not-exist

配置如果缓存存在或者未预先配置,则需要创建缓存。

true

布尔值

camel.component.ehcache.configuration.event-firing

设置交付模式(同步、异步)

 

EventFiring

camel.component.ehcache.configuration.event-ordering

设置交付模式(排序、未排序)

 

EventOrdering

camel.component.ehcache.configuration.event-types

设置要侦听的事件类型

 

Set

camel.component.ehcache.configuration.key

配置默认操作密钥。如果在消息标头中设置了密钥,则标头中的密钥优先使用。

 

对象

camel.component.ehcache.configuration.key-type

缓存密钥类型,默认为 java.lang.Object

java.lang.Object

字符串

camel.component.ehcache.configuration.value-type

缓存值类型,默认为 java.lang.Object

java.lang.Object

字符串

camel.component.ehcache.customizer.cache-configuration.enabled

启用或禁用 cache-configuration 自定义器。

true

布尔值

camel.component.ehcache.customizer.cache-configuration.mode

配置是否已添加缓存配置,或者它们必须替换已经在组件上配置的那些配置。

 

CacheConfiguration CustomizerConfiguration$ Mode

camel.component.ehcache.customizer.cache-manager.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.ehcache.customizer.cache-manager.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.ehcache.enabled

启用 ehcache 组件

true

布尔值

camel.component.ehcache.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.ehcache.configuration.config-uri

指向 Ehcache XML 配置文件的位置 @deprecated 的 URI 使用 {@link #setConfigurationUri (String)} 替代

 

字符串

91.3.1. 消息标头 Camel 

 

标头类型描述

CamelEhcacheAction

字符串

要在缓存中处理的操作,有效的选项有:

* CLEAR * PUT * PUT_ALL * PUT_IF_ABSENT * GET * GET_ALL * REMOVE * REMOVE_ALL * REPLACE

CamelEhcacheActionHasResult

布尔值

如果操作结果为 true,则设置为 true

CamelEhcacheActionSucceeded

布尔值

如果操作被设置,则设置为 true

CamelEhcacheKey

对象

用于操作的缓存密钥

CamelEhcacheKeys

Set<Object>

中使用的键列表

* PUT_ALL * GET_ALL * REMOVE_ALL

CamelEhcacheValue

对象

放入缓存或操作结果的值

CamelEhcacheOldValue

对象

与 PUT_IF_ABSENT 等操作相关的旧值,或用于比较操作的对象(如 REPLACE)

CamelEhcacheEventType

EventType

接收的事件类型

91.4. 基于 Ehcache 的幂等存储库示例:

CacheManager manager = CacheManagerBuilder.newCacheManager(new XmlConfiguration("ehcache.xml"));
EhcacheIdempotentRepository repo = new EhcacheIdempotentRepository(manager, "idempotent-cache");

from("direct:in")
    .idempotentConsumer(header("messageId"), idempotentRepo)
    .to("mock:out");

 

91.5. 基于 Ehcache 的聚合存储库示例:

public class EhcacheAggregationRepositoryRoutesTest extends CamelTestSupport {
    private static final String ENDPOINT_MOCK = "mock:result";
    private static final String ENDPOINT_DIRECT = "direct:one";
    private static final int[] VALUES = generateRandomArrayOfInt(10, 0, 30);
    private static final int SUM = IntStream.of(VALUES).reduce(0, (a, b) -> a + b);
    private static final String CORRELATOR = "CORRELATOR";

    @EndpointInject(uri = ENDPOINT_MOCK)
    private MockEndpoint mock;

    @Produce(uri = ENDPOINT_DIRECT)
    private ProducerTemplate producer;

    @Test
    public void checkAggregationFromOneRoute() throws Exception {
        mock.expectedMessageCount(VALUES.length);
        mock.expectedBodiesReceived(SUM);

        IntStream.of(VALUES).forEach(
            i -> producer.sendBodyAndHeader(i, CORRELATOR, CORRELATOR)
        );

        mock.assertIsSatisfied();
    }

    private Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        if (oldExchange == null) {
            return newExchange;
        } else {
            Integer n = newExchange.getIn().getBody(Integer.class);
            Integer o = oldExchange.getIn().getBody(Integer.class);
            Integer v = (o == null ? 0 : o) + (n == null ? 0 : n);

            oldExchange.getIn().setBody(v, Integer.class);

            return oldExchange;
        }
    }

    @Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from(ENDPOINT_DIRECT)
                    .routeId("AggregatingRouteOne")
                    .aggregate(header(CORRELATOR))
                    .aggregationRepository(createAggregateRepository())
                    .aggregationStrategy(EhcacheAggregationRepositoryRoutesTest.this::aggregate)
                    .completionSize(VALUES.length)
                        .to("log:org.apache.camel.component.ehcache.processor.aggregate.level=INFO&showAll=true&mulltiline=true")
                        .to(ENDPOINT_MOCK);
            }
        };
    }

    protected EhcacheAggregationRepository createAggregateRepository() throws Exception {
        CacheManager cacheManager = CacheManagerBuilder.newCacheManager(new XmlConfiguration("ehcache.xml"));
        cacheManager.init();

        EhcacheAggregationRepository repository = new EhcacheAggregationRepository();
        repository.setCacheManager(cacheManager);
        repository.setCacheName("aggregate");

        return repository;
    }
}

第 92 章 EJB Component

Camel 版本 2.4 中可用

ejb: 组件将 EJB 绑定到 Camel 消息交换。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ejb</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

92.1. URI 格式

ejb:ejbName[?options]

其中 ejbName 可以是用于在 Application Server JNDI Registry 中查找 EJB 的任何字符串

92.2. 选项

EJB 组件支持 4 个选项,它们如下所列。

名称描述默认类型

context (producer)

用于查找 EJB 的上下文

 

Context

properties (producer)

如果尚未配置上下文,用于创建 javax.naming.Context 的属性。

 

Properties

cache (advanced)

如果启用,Camel 将缓存第一个 Registry 查找的结果。如果 registry 中的 bean 定义为单例范围,则可以启用缓存。

 

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

EJB 端点使用 URI 语法配置:

ejb:beanName

使用以下路径和查询参数:

92.2.1. 路径名(1 参数):

名称描述默认类型

beanName

必需 设置要调用的 bean 的名称

 

字符串

92.2.2. 查询参数(5 参数):

名称描述默认类型

方法 (生成器)

设置在 bean 上调用的方法的名称

 

字符串

cache (advanced)

如果启用,Camel 将缓存第一个 Registry 查找的结果。如果 registry 中的 bean 定义为单例范围,则可以启用缓存。

 

布尔值

multiParameterArray (advanced)

弃用了 如何处理从消息正文传递的参数。true 表示消息正文应该是参数的数组。弃用备注:此选项由 Camel 内部使用,且不适用于最终用户。弃用备注:此选项由 Camel 内部使用,且不适用于最终用户。

false

布尔值

参数 (高级)

用于配置 bean 中的其他属性

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

92.3. bean Binding

如何选择需要调用的方法(如果没有通过 方法 参数明确指定),并从消息构建参数值如何由 Bean Binding 机制定义,该机制在整个 Camel 中各种 Bean 集成机制都使用它。

92.4. 例子

在以下示例中,我们使用 Greater EJB,其定义如下:

GreaterLocal.java

public interface GreaterLocal {

    String hello(String name);

    String bye(String name);

}

以及实施

GreaterImpl.java

@Stateless
public class GreaterImpl implements GreaterLocal {

    public String hello(String name) {
        return "Hello " + name;
    }

    public String bye(String name) {
        return "Bye " + name;
    }

}

92.4.1. 使用 Java DSL

在本例中,我们希望在 EJB 上调用 hello 方法。由于本示例基于使用 Apache OpenEJB 的单元测试,因此我们必须使用 OpenEJB 设置在 EJB 组件上设置 JndiContext

@Override
protected CamelContext createCamelContext() throws Exception {
    CamelContext answer = new DefaultCamelContext();

    // enlist EJB component using the JndiContext
    EjbComponent ejb = answer.getComponent("ejb", EjbComponent.class);
    ejb.setContext(createEjbContext());

    return answer;
}

private static Context createEjbContext() throws NamingException {
    // here we need to define our context factory to use OpenEJB for our testing
    Properties properties = new Properties();
    properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");

    return new InitialContext(properties);
}

然后,我们已准备好在 Camel 路由中使用 EJB:

from("direct:start")
    // invoke the greeter EJB using the local interface and invoke the hello method
    .to("ejb:GreaterImplLocal?method=hello")
    .to("mock:result");

在实际的应用程序服务器中

在实际的应用程序服务器中,您可能不必在 EJB 组件上设置 JndiContext,因为它将在与应用服务器相同的 JVM 上创建默认的 JndiContext,这通常允许其访问 JNDI 注册表并查找 EJBs。但是,如果您需要在远程 JVM 或类似方式访问应用服务器,则必须事先准备这些属性。

92.4.2. 使用 Spring XML

这是使用 Spring XML 的相同示例:

由于这基于单元测试,因此我们需要设置 EJB 组件:

<!-- setup Camel EJB component -->
<bean id="ejb" class="org.apache.camel.component.ejb.EjbComponent">
    <property name="properties" ref="jndiProperties"/>
</bean>

<!-- use OpenEJB context factory -->
<p:properties id="jndiProperties">
    <prop key="java.naming.factory.initial">org.apache.openejb.client.LocalInitialContextFactory</prop>
</p:properties>

在我们准备好在 Camel 路由中使用 EJB 前:

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:start"/>
        <to uri="ejb:GreaterImplLocal?method=hello"/>
        <to uri="mock:result"/>
    </route>
</camelContext>

92.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • bean
  • bean Binding
  • Bean 集成

第 93 章 Elasticsearch 组件(已弃用)

作为 Camel 2.11 版本提供

ElasticSearch 组件允许您与 ElasticSearch 服务器进行接口。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-elasticsearch</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

93.1. URI 格式

elasticsearch://clusterName[?options]

93.2. 端点选项

Elasticsearch 组件支持 2 个选项,它们如下所列。

名称描述默认类型

client (advanced)

要使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。

 

客户端

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Elasticsearch 端点使用 URI 语法配置:

elasticsearch:clusterName

使用以下路径和查询参数:

93.2.1. 路径名(1 参数):

名称描述默认类型

clusterName

集群所需的 名称,或使用 local 作为本地模式

 

字符串

93.2.2. 查询参数(11 参数):

名称描述默认类型

clientTransportSniff (producer)

是允许监控集群的其余部分或非(默认为 true)的客户端。此设置映射到 client.transport.sniff 设置。

true

布尔值

consistencyLevel (producer)

与 INDEX 和 BULK 操作一起使用的写入一致性级别(可以是任何 ONE、QUORUM、ALL 或 DEFAULT)

DEFAULT

WriteConsistencyLevel

data (producer)

是允许节点分配数据(硬)的节点。此设置映射到 node.data 设置。

 

布尔值

indexName (producer)

要针对的索引名称

 

字符串

indexType (producer)

要针对的索引类型

 

字符串

ip (producer)

TransportClient 远程主机 ip to use

 

字符串

operation (producer)

要执行的操作

 

字符串

pathHome (producer)

ElasticSearch 配置的 path.home 属性。您需要提供一个有效路径,否则将使用默认值 $user.home/.elasticsearch。

${user.home}/.elasticsearch

字符串

port (producer)

要使用的 TransportClient 远程端口(默认为 9300)

9300

int

transportAddresses (producer)

使用 ip:port 格式的远程传输地址的逗号分隔列表。ip 和 port 选项必须留空来考虑传输地址。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

93.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.elasticsearch.client

要使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。选项是一个 org.elasticsearch.client.Client 类型。

 

字符串

camel.component.elasticsearch.enabled

启用 elasticsearch 组件

true

布尔值

camel.component.elasticsearch.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

93.4. 本地测试

如果要针对本地( JVM/classloader) ElasticSearch 服务器运行,只需要将 URI 中的 clusterName 值设置为"local"。详情请查看 客户端指南

93.5. Message Operations

目前支持以下 ElasticSearch 操作。只需设置端点 URI 选项或交换标头,使用 "operation" 的键,以及一个值设置为以下之一:有些操作还需要设置其他参数或消息正文。

operation邮件正文description

索引

将 String、byte[] 或 XContentBuilder 内容映射到索引

将内容添加到索引中,并返回正文中的 indexId。Camel 2.15,您可以通过使用键 "indexId" 设置消息标头来设置 indexId。

GET_BY_ID

要检索的内容索引 ID

检索指定的索引,并在正文中返回 GetResult 对象

DELETE

要删除的内容的索引 ID

删除指定的 indexId,并在正文中返回 DeleteResult 对象

BULK_INDEX

已接受的任何类型的列表(XContentBuilder、Map、byte[]、String) 

*Camel 2.14,*将内容添加到索引并返回到正文中成功索引文档的 ID 列表

批量

已接受的任何类型的列表(XContentBuilder、Map、byte[]、String) 

Camel 2.15: 将内容添加到索引中,并返回正文中的 BulkResponse 对象

搜索

映射或搜索Request 对象

Camel 2.15: 使用查询字符串映射搜索内容

MULTIGET

MultigetRequest.Item 对象列表

Camel 2.17: 检索在 MultigetRequest 中指定的索引类型等,并在正文中返回 MultigetResponse 对象

MULTISEARCH

SearchRequest 对象列表

Camel 2.17: 搜索 MultiSearchRequest 中指定的参数,并在正文中返回 MultiSearchResponse 对象

存在

索引名称作为标头

Camel 2.17: 返回正文中的布尔值对象

更新

map、String、byte[] 或 XContentBuilder 内容以更新

Camel 2.17: 将内容更新到索引并返回正文中的 indexId。

93.6. 索引示例

以下是一个简单的 INDEX 示例

from("direct:index")
.to("elasticsearch://local?operation=INDEX&indexName=twitter&indexType=tweet");
<route>
    <from uri="direct:index" />
    <to uri="elasticsearch://local?operation=INDEX&indexName=twitter&indexType=tweet"/>
</route>

客户端只需要将含有 map 的正文消息传递给路由。结果正文包含创建的 indexId。

Map<String, String> map = new HashMap<String, String>();
map.put("content", "test");
String indexId = template.requestBody("direct:index", map, String.class);

93.7. 如需更多信息,请参阅这些资源

ElasticSearch Main Site

ElasticSearch Java API

93.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 94 章 Elasticsearch5 组件(已弃用)

作为 Camel 版本 2.19 可用

ElasticSearch 组件允许您与 ElasticSearch 5.x API 一起接口。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-elasticsearch5</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

94.1. URI 格式

elasticsearch5://clusterName[?options]

94.2. 端点选项

Elasticsearch5 组件支持 2 个选项,它们如下所列。

名称描述默认类型

client (advanced)

要使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。这允许使用特定设置自定义客户端。

 

TransportClient

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Elasticsearch5 端点使用 URI 语法配置:

elasticsearch5:clusterName

使用以下路径和查询参数:

94.2.1. 路径名(1 参数):

名称描述默认类型

clusterName

集群的 必填 名称

 

字符串

94.2.2. 查询参数(16 参数):

名称描述默认类型

clientTransportSniff (producer)

是允许监控集群的其他部分的客户端。此设置映射到 client.transport.sniff 设置。

false

布尔值

indexName (producer)

要针对的索引名称

 

字符串

indexType (producer)

要针对的索引类型

 

字符串

ip (producer)

TransportClient 远程主机 ip to use

 

字符串

operation (producer)

要执行的操作

 

ElasticsearchOperation

pingSchedule (producer)

客户端 ping 集群的时间(单位)。

5s

字符串

pingTimeout (producer)

从节点等待 ping 响应的时间(单位)无法返回。

5s

字符串

port (producer)

要使用的 TransportClient 远程端口(默认为 9300)

9300

int

tcpCompress (producer)

如果所有节点之间都启用了压缩(LZF),则为 True。

false

布尔值

tcpConnectTimeout (producer)

等待连接超时的时间(单位)

30s

字符串

transportAddresses (producer)

使用 ip:port 格式的远程传输地址的逗号分隔列表。ip 和 port 选项必须留空来考虑传输地址。

 

字符串

waitForActiveShards (producer)

索引创建会等待对分片的写入一致性数量可用

1

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

enableSSL (security)

启用 SSL。在 classpath 上需要 XPack 客户端 jar

false

布尔值

密码 (身份验证)

用于对集群进行身份验证的密码。在 classpath 上需要 XPack 客户端 jar

 

字符串

user (authentication)

用于对集群进行身份验证的用户。需要 transport_client 角色来访问集群。在 classpath 上需要 XPack 客户端 jar

 

字符串

94.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.elasticsearch5.client

要使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。这允许使用特定设置自定义客户端。选项是一个 org.elasticsearch.client.transport.TransportClient 类型。

 

字符串

camel.component.elasticsearch5.enabled

启用 elasticsearch5 组件

true

布尔值

camel.component.elasticsearch5.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

94.4. Message Operations

目前支持以下 ElasticSearch 操作。只需设置端点 URI 选项或交换标头,使用 "operation" 的键,以及一个值设置为以下之一:有些操作还需要设置其他参数或消息正文。

operation邮件正文description

索引

将 String、byte[] 或 XContentBuilder 内容映射到索引

将内容添加到索引中,并返回正文中的 indexId。您可以通过使用键 "indexId" 设置消息标头来设置 indexId。

GET_BY_ID

要检索的内容索引 ID

检索指定的索引,并在正文中返回 GetResult 对象

DELETE

要删除的内容的索引名称和类型

删除指定的 indexName 和 indexType,并在正文中返回一个 DeleteResponse 对象

DELETE_INDEX

要删除的内容的索引名称

删除指定的 indexName 并在正文中返回 DeleteIndexResponse 对象

BULK_INDEX

已接受的任何类型的列表(XContentBuilder、Map、byte[]、String) 

向索引中添加内容并返回正文中成功索引文档的 ID 列表

批量

已接受的任何类型的列表(XContentBuilder、Map、byte[]、String) 

在索引中添加内容并返回正文中的 BulkResponse 对象

搜索

map、String 或 SearchRequest 对象

使用查询字符串映射搜索内容

MULTIGET

MultigetRequest.Item 对象列表

检索在 MultigetRequest 中指定的索引、类型等,并在正文中返回 MultigetResponse 对象

MULTISEARCH

SearchRequest 对象列表

搜索在 MultiSearchRequest 中指定的参数,并在正文中返回一个 MultiSearchResponse 对象

存在

索引名称作为标头

检查索引是否存在或者不存在正文中的布尔值标志

更新

map、String、byte[] 或 XContentBuilder 内容以更新

将内容更新至索引,并返回正文中的 indexId。

94.5. 索引示例

以下是一个简单的 INDEX 示例

from("direct:index")
.to("elasticsearch5://elasticsearch?operation=INDEX&indexName=twitter&indexType=tweet");
<route>
    <from uri="direct:index" />
    <to uri="elasticsearch5://elasticsearch?operation=INDEX&indexName=twitter&indexType=tweet"/>
</route>

客户端只需要将含有 map 的正文消息传递给路由。结果正文包含创建的 indexId。

Map<String, String> map = new HashMap<String, String>();
map.put("content", "test");
String indexId = template.requestBody("direct:index", map, String.class);

94.6. 如需更多信息,请参阅这些资源

Elastic Main Site

ElasticSearch Java API

94.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 95 章 Elastichsearch Rest 组件

可作为 Camel 版本 2.21 可用

ElasticSearch 组件允许您使用 REST Client 库与 ElasticSearch 6.x API 的接口。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-elasticsearch-rest</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

95.1. URI 格式

elasticsearch-rest://clusterName[?options]

95.2. 端点选项

Elastichsearch Rest 组件支持 12 个选项,它们如下。

名称描述默认类型

client (advanced)

要使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。这允许使用特定设置自定义客户端。

 

RestClient

主机地址( 高级)

使用 ip:port 格式的远程传输地址的逗号分隔列表。对于要考虑的主机地址,IP 和端口选项必须留空。

 

字符串

socketTimeout (advanced)

在套接字超时前等待的 ms 中的超时时间。

30000

int

connectionTimeout (advanced)

连接超时前要等待的 ms 的时间。

30000

int

user (security)

基本验证用户

 

字符串

密码 (安全)

进行身份验证的密码

 

字符串

enableSSL (security)

启用 SSL

false

布尔值

maxRetryTimeout (advanced)

重试前 ms 的时间

30000

int

enableSniffer (advanced)

启用自动从正在运行的 Elasticsearch 集群中发现节点

false

布尔值

snifferInterval (advanced)

以毫秒为单位连续执行间隔。当禁用 sniffOnFailure 时,或者当连续的执行间没有故障时,会hour。

300000

int

sniffAfterFailureDelay (advanced)

出现故障后调度的 sniff 执行的延迟(以毫秒为单位)

60000

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Elastichsearch Rest 端点使用 URI 语法配置:

elasticsearch-rest:clusterName

使用以下路径和查询参数:

95.2.1. 路径名(1 参数):

名称描述默认类型

clusterName

集群的 必填 名称

 

字符串

95.2.2. 查询参数(11 参数):

名称描述默认类型

connectionTimeout (producer)

连接超时前要等待的 ms 的时间。

30000

int

disconnect (producer)

在完成调用制作者后断开连接

false

布尔值

enableSSL (producer)

启用 SSL

false

布尔值

hostAddresses (producer)

必需的 Comma 分离列表,使用 ip:port 格式的远程传输地址。

 

字符串

indexName (producer)

要针对的索引名称

 

字符串

indexType (producer)

要针对的索引类型

 

字符串

maxRetryTimeout (producer)

重试前 ms 的时间

30000

int

operation (producer)

要执行的操作

 

ElasticsearchOperation

socketTimeout (producer)

在套接字超时前等待的 ms 中的超时时间。

30000

int

waitForActiveShards (producer)

索引创建会等待对分片的写入一致性数量可用

1

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

95.3. Spring Boot Auto-Configuration

组件支持 13 个选项,它们如下所列。

名称描述默认类型

camel.component.elasticsearch-rest.client

要使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。这允许使用特定设置自定义客户端。选项是一个 org.elasticsearch.client.RestClient 类型。

 

字符串

camel.component.elasticsearch-rest.connection-timeout

连接超时前要等待的 ms 的时间。

30000

整数

camel.component.elasticsearch-rest.enable-s-s-l

启用 SSL

false

布尔值

camel.component.elasticsearch-rest.enable-sniffer

启用自动从正在运行的 Elasticsearch 集群中发现节点

false

布尔值

camel.component.elasticsearch-rest.enabled

是否启用 elasticsearch-rest 组件的自动配置。默认启用。

 

布尔值

camel.component.elasticsearch-rest.host-addresses

使用 ip:port 格式的远程传输地址的逗号分隔列表。对于要考虑的主机地址,IP 和端口选项必须留空。

 

字符串

camel.component.elasticsearch-rest.max-retry-timeout

重试前 ms 的时间

30000

整数

camel.component.elasticsearch-rest.password

进行身份验证的密码

 

字符串

camel.component.elasticsearch-rest.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.elasticsearch-rest.sniff-after-failure-delay

出现故障后调度的 sniff 执行的延迟(以毫秒为单位)

60000

整数

camel.component.elasticsearch-rest.sniffer-interval

以毫秒为单位连续执行间隔。当禁用 sniffOnFailure 时,或者当连续的执行间没有故障时,会hour。

300000

整数

camel.component.elasticsearch-rest.socket-timeout

在套接字超时前等待的 ms 中的超时时间。

30000

整数

camel.component.elasticsearch-rest.user

基本验证用户

 

字符串

95.4. Message Operations

目前支持以下 ElasticSearch 操作。只需设置端点 URI 选项或交换标头,使用 "operation" 的键,以及一个值设置为以下之一:有些操作还需要设置其他参数或消息正文。

operation邮件正文description

索引

将、Stringbyte[]XContentBuilderIndexRequest 内容 映射到 索引

将内容添加到索引中,并返回正文中的 indexId。您可以通过使用键 "indexId" 设置消息标头来设置 indexId。

GetById

要检索的内容的字符串或 GetRequest 索引 id

检索指定的索引,并在正文中返回 GetResult 对象

删除

字符串DeleteRequest 索引名称以及要删除的内容类型

删除指定的 indexName 和 indexType,并在正文中返回一个 DeleteResponse 对象

DeleteIndex

要删除的索引的字符串或 DeleteRequest 索引名称

删除指定的 indexName 并返回正文的状态代码

BulkIndex

一个列表、BulkRequestCollection (XContentBuilder, Map, byte[], String) 

向索引中添加内容并返回正文中成功索引文档的 ID 列表

批量

一个列表、BulkRequestCollection (XContentBuilder, Map, byte[], String) 

在索引中添加内容并返回正文中的 BulkItemResponse[] 对象

搜索

mapStringSearchRequest

使用查询字符串映射搜索内容

MultiSearch

MultiSearchRequest

在一个搜索中有多个搜索

Exists

索引名称(indexName)作为标头

检查索引是否存在或者不存在正文中的布尔值标志

Update(更新)

映射UpdateRequestStringbyte[]XContentBuilder 内容以更新

将内容更新至索引,并返回正文中的 indexId。

ping

对远程 Elasticsearch 集群进行 Ping 操作,如果 ping 成功,则为 false,则返回 true。

info

获取 Elasticsearch 集群的信息,并将其返回为 MainResponse 类实例

95.5. 配置组件并启用基本身份验证

要使用 Elasticsearch 组件,必须配置有最小配置。

ElasticsearchComponent elasticsearchComponent = new ElasticsearchComponent();
elasticsearchComponent.setHostAddresses("myelkhost:9200");
camelContext.addComponent("elasticsearch-rest", elasticsearchComponent);

对于使用 elasticsearch 的基本身份验证,或使用 elasticsearch 集群前面的反向 http 代理,只需在组件上设置基本身份验证和 SSL,如下例所示

ElasticsearchComponent elasticsearchComponent = new ElasticsearchComponent();
elasticsearchComponent.setHostAddresses("myelkhost:9200");
elasticsearchComponent.setUser("elkuser");
elasticsearchComponent.setPassword("secure!!");
elasticsearchComponent.setEnableSSL(true);

camelContext.addComponent("elasticsearch-rest", elasticsearchComponent);

95.6. 索引示例

以下是一个简单的 INDEX 示例

from("direct:index")
  .to("elasticsearch-rest://elasticsearch?operation=Index&indexName=twitter&indexType=tweet");
<route>
    <from uri="direct:index" />
    <to uri="elasticsearch-rest://elasticsearch?operation=Index&indexName=twitter&indexType=tweet"/>
</route>

对于此操作,您需要指定 indexId 标头。

客户端只需要将含有 map 的正文消息传递给路由。结果正文包含创建的 indexId。

Map<String, String> map = new HashMap<String, String>();
map.put("content", "test");
String indexId = template.requestBody("direct:index", map, String.class);

95.7. 搜索示例

根据特定字段和值搜索,使用 Operation 'Search'。传递查询 JSON String 或 Map

from("direct:search")
  .to("elasticsearch-rest://elasticsearch?operation=Search&indexName=twitter&indexType=tweet");
<route>
    <from uri="direct:search" />
    <to uri="elasticsearch-rest://elasticsearch?operation=Search&indexName=twitter&indexType=tweet"/>
</route>
String query = "{\"query\":{\"match\":{\"content\":\"new release of ApacheCamel\"}}}";
SearchHits response = template.requestBody("direct:search", query, SearchHits.class);

使用 Map 搜索特定字段。

Map<String, Object> actualQuery = new HashMap<>();
actualQuery.put("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);
SearchHits response = template.requestBody("direct:search", query, SearchHits.class);

95.8. MultiSearch 示例

多搜索特定字段和值使用 Operation 'MultiSearch'。传递 MultiSearchRequest 实例

from("direct:multiSearch")
  .to("elasticsearch-rest://elasticsearch?operation=MultiSearch");
<route>
    <from uri="direct:multiSearch" />
    <to uri="elasticsearch-rest://elasticsearch?operation=MultiSearch"/>
</route>

MultiSearch on specific field (s)

SearchRequest req = new SearchRequest();
req.indices("twitter");
req.types("tweet");
SearchRequest req1 = new SearchRequest();
req.indices("twitter");
req.types("tweets");
MultiSearchRequest request = new MultiSearchRequest().add(req1).add(req);
Item[] response = template.requestBody("direct:search", request, Item[].class);

第 96 章 ElSQL Component

作为 Camel 版本 2.16 可用

elsql: 组件是对使用 ElSql 定义 SQL 查询的现有 SQL 组件的扩展。 

此组件使用 spring-jdbc 在 scenes 后面进行实际处理。

此组件可用作 交易客户端

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-elsql</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

SQL 组件使用以下端点 URI 表示法:

sql:elSqlName:resourceUri[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

SQL 查询的参数在 elsql 映射文件中的命名参数,并在给定的优先级中映射到 Camel 消息中的对应密钥:

  1. 如果 简单 表达式 ,则来自消息正文的 Camel 2.16.1 。
  2. 如果消息正文从消息标题为 'java.util.Map'3,则来自消息正文。

如果无法解析命名参数,则会抛出异常。

96.1. 选项

ElSQL 组件支持 5 选项,它们如下所列。

名称描述默认类型

databaseVendor (common)

使用特定于供应商的 com.opengamma.elsql.ElSqlConfig

 

ElSqlDatabaseVendor

dataSource (common)

设置用于与数据库通信的 DataSource。

 

DataSource

elSqlConfig (advanced)

使用特定配置的 ElSqlConfig。相反,最好使用 databaseVendor 选项。

 

ElSqlConfig

resourceUri (common)

包含要使用的 elsql SQL 语句的资源文件。您可以用逗号分隔多个资源。默认情况下,这些资源会在类路径上加载,前缀为 file: 从文件系统加载。请注意,您可以在组件上设置这个选项,因此您不必在端点上配置此选项。

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

ElSQL 端点使用 URI 语法配置:

elsql:elsqlName:resourceUri

使用以下路径和查询参数:

96.1.1. 路径名(2 参数):

名称描述默认类型

elsqlName

要使用的 elsql 名称( elsql 文件中是 NAMED)

 

字符串

resourceUri

包含要使用的 elsql SQL 语句的资源文件。您可以用逗号分隔多个资源。默认情况下,这些资源会在类路径上加载,前缀为 file: 从文件系统加载。请注意,您可以在组件上设置这个选项,因此您不必在端点上配置此选项。

 

字符串

96.1.2. 查询参数(47 参数):

名称描述默认类型

allowNamedParameters (common)

是否允许使用查询中的指定参数。

true

布尔值

databaseVendor (common)

使用特定于供应商的 com.opengamma.elsql.ElSqlConfig

 

ElSqlDatabaseVendor

dataSource (common)

设置用于与数据库通信的 DataSource。

 

DataSource

dataSourceRef (common)

弃用了 设置对 DataSource 的引用以从 registry 中查询,以用于与数据库通信。

 

字符串

outputClass (common)

指定在 outputType=SelectOne 时用作转换的完整软件包和类名称。

 

字符串

outputHeader (common)

将查询结果存储在标题中,而不是消息正文。默认情况下,输出Header == null,并且查询结果存储在消息正文中,消息正文中的所有现有内容将被丢弃。如果设置了输出Header,则值用作存储查询结果的标头名称,并保留原始消息正文。

 

字符串

outputType (common)

使消费者或制作者的输出选择列表为 Map,或者以以下方式选择为单个 Java 对象:a)如果查询仅含有单一列,则返回 JDBC Column 对象。(如 SELECT COUNT ()FROM PROJECT)将返回 Long 对象.b)如果查询有多个列,则返回 JDBC Column 对象。(如 SELECT COUNT ()FROM PROJECT)将返回 Long 对象。 然后,它会返回该 result.c 的映射。如果设置了 outputClass,它将通过将查询结果转换为 Java bean 对象,方法是调用与列名称匹配的所有 setter。It 将假定您的类具有默认构造器来创建具有默认构造器的实例。如果查询会产生多个一行,它将引发一个非唯一结果结果。It 将假定您的类具有默认构造器来创建实例。这可以与 Splitter EIP 在流化模式中一起使用,以流处理 ResultSet。

SelectList

SqlOutputType

separator (common)

从消息正文中提取参数值时使用的分隔符(如果正文为 String 类型),将插入 # placeholders.Notice (如果使用命名参数),则会使用 Map 类型。默认值为 comma

,

char

breakBatchOnConsumeFail (consumer)

如果Consume 失败,则设置是否中断批处理。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

expectedUpdateCount (consumer)

设置预期的更新数,以便在使用 onConsume 时进行验证。

-1

int

maxMessagesPerPoll (consumer)

设置要轮询的最大消息数

 

int

onConsume (consumer)

在处理每一行后,可以执行此查询,如果交换被成功处理,例如,将行标记为已处理。查询可以具有 参数。

 

字符串

onConsumeBatchComplete (consumer)

在处理整个批处理后,可以执行此查询以批量更新行等。查询不能有参数。

 

字符串

onConsumeFailed (consumer)

处理每行后,可以执行此查询,如果 Exchange 失败,例如要将行标记为失败。查询可以具有 参数。

 

字符串

routeEmptyResultSet (consumer)

设置是否应该允许将空 resultset 发送到下一个跃点。默认为false。因此,空 resultset 将会被过滤掉。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

翻译( 消费者)

启用或禁用事务。如果启用,如果处理交换失败,则消费者破坏处理任何进一步的交换会导致回滚。

false

布尔值

useIterator (consumer)

设置应该如何传送给路由。表示作为列表或单个对象进行交付。默认为 true。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

processingStrategy (consumer)

允许插件使用自定义 org.apache.camel.component.sql.SqlProcessingStrategy 在使用者处理行/batch 时执行查询。

 

SqlProcessingStrategy

batch (producer)

启用或禁用批处理模式

false

布尔值

noop (producer)

如果设置,将忽略 SQL 查询的结果,并使用现有的 IN 消息作为处理的 OUT 消息

false

布尔值

useMessageBodyForSql (producer)

是否使用消息正文作为 SQL,然后是参数的标头。如果启用了这个选项,则不会使用 uri 中的 SQL。

false

布尔值

alwaysPopulateStatement (advanced)

如果启用,则来自 org.apache.camel.component.sql.SqlPrepareStatementStrategy 的 populateStatement 方法始终被调用,如果没有预期的参数,则也会调用。当为 false 时,只有在设置了 1 个或更多预期参数时,才会调用 populateStatement;例如,为了避免读取没有参数的 SQL 查询的消息正文/headers。

false

布尔值

elSqlConfig (advanced)

使用特定配置的 ElSqlConfig。相反,最好使用 databaseVendor 选项。

 

ElSqlConfig

parametersCount (advanced)

如果设置大于零,则 Camel 将使用此计数值参数来替换,而不是通过 JDBC 元数据 API 进行查询。这在 JDBC 供应商无法返回正确的参数计数时很有用,然后用户可能会覆盖。

 

int

placeholder (advanced)

指定在 SQL 查询中将替换为 的字符。请注意,它是 simple String.replaceAll ()操作,不涉及 SQL 解析(引号的字符串也会更改)。

#

字符串

prepareStatementStrategy (advanced)

允许插件使用自定义 org.apache.camel.component.sql.SqlPrepareStatementStrategy 来控制对查询准备和准备的语句。

 

SqlPrepareStatement Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

templateOptions (advanced)

使用 Map 中的键/值配置 Spring JdbcTemplate

 

map

usePlaceholder (advanced)

设置是否在 SQL 查询中使用占位符和替换所有占位符字符。

true

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

96.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.elsql.data-source

设置用于与数据库通信的 DataSource。选项是一个 javax.sql.DataSource 类型。

 

字符串

camel.component.elsql.database-vendor

使用特定于供应商的 com.opengamma.elsql.ElSqlConfig

 

ElSqlDatabaseVendor

camel.component.elsql.el-sql-config

使用特定配置的 ElSqlConfig。相反,最好使用 databaseVendor 选项。选项是一个 com.opengamma.elsql.ElSqlConfig 类型。

 

字符串

camel.component.elsql.enabled

启用 elsql 组件

true

布尔值

camel.component.elsql.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.elsql.resource-uri

包含要使用的 elsql SQL 语句的资源文件。您可以用逗号分隔多个资源。默认情况下,这些资源会在类路径上加载,前缀为 file: 从文件系统加载。请注意,您可以在组件上设置这个选项,因此您不必在端点上配置此选项。

 

字符串

96.3. 查询结果

对于 选择 操作,结果是 List<Map<String、Object>& gt; 类型,如 JdbcTemplate.queryForList ()方法返回。对于 更新 操作,结果是更新的行数,返回的是 Integer 返回的。

默认情况下,结果放置在消息正文中。  如果设置了 outputHeader 参数,则结果将放在标头中。  这是一种使用完整消息丰富的模式来添加标头,它提供了一种简洁的语法,用于将序列或某些其他小值查询到标头中。  最好将 outputHeader 和 outputType 一起一起使用:

96.4. 标头值

执行更新 操作时,SQL 组件会在以下消息标头中存储更新计数:

标头描述

CamelSqlUpdateCount

更新操作的行数量,返回为 Integer 对象。

CamelSqlRowCount

选择 操作返回的行数,返回为 Integer 对象。

96.4.1. 示例

在给定路由中,我们希望从 projects 表中获取所有项目。请注意,SQL 查询具有 2 个命名参数 :#lic 和 :#min。

然后,Camel 将从消息正文或邮件标头中查找这些参数。请注意,在上面的示例中,我们为命名参数设置了带有恒定值
的两个标头:

   from("direct:projects")
     .setHeader("lic", constant("ASF"))
     .setHeader("min", constant(123))
     .to("elsql:projects:com/foo/orders.elsql")

elsql 映射文件

@NAME(projects)
  SELECT *
  FROM projects
  WHERE license = :lic AND id > :min
  ORDER BY id

虽然消息正文为 java.util.Map,则将从正文中获取命名参数。

   from("direct:projects")
     .to("elsql:projects:com/foo/orders.elsql")

96.5. 在制作者中使用表达式参数

在 Camel 2.16.1 起,您也可使用简单表达式,这允许在消息正文中使用类似符号的 OGNL,其中假定 获得License 和 getMinimum 方法:

@NAME(projects)
  SELECT *
  FROM projects
  WHERE license = :${body.license} AND id > :${body.minimum}
  ORDER BY id

96.5.1. 在消费者中使用表达式参数

可作为 Camel 2.23 使用

当将 ElSql 组件用作消费者时,您现在还可以使用表达式参数(简单语言)构建动态查询参数,如在 bean 上调用一个方法以检索 id、date 或 something。

例如,以下示例中调用 bean myIdGenerator 上的 nextId 方法:

@NAME(projectsByIdBean)
  SELECT *
  FROM projects
  WHERE id = :${bean#myIdGenerator.nextId}
重要

请注意,在上面的 bean 语法中,我们必须在简单表达式中使用 # 而不是 :。这是因为 Spring query 参数 parser 用来分隔冒号中的参数。另请注意,Spring 查询解析器将为每个查询调用 bean 两次。

和 bean 有以下方法:

public static class MyIdGenerator {

    private int id = 1;

    public int nextId() {
        // spring will call this twice, one for initializing query and 2nd for actual value
        id++;
        return id / 2;
    }

请注意,没有消息正文和标头的现有 Exchange,因此消费者中使用的简单表达式最可用于调用 bean 方法,如本例中所示。

第 97 章 etcd 组件

作为 Camel 2.18 版提供

camel etcd 组件允许您使用 Etcd (一个分布式可靠的键值存储)。

97.1. URI 格式

etcd:namespace/path[?options]

97.2. URI 选项

etcd 组件支持 7 个选项,它们如下所列。

名称描述默认类型

uris (common)

要设置客户端连接的 URI。

 

字符串

sslContextParameters (common)

使用 SSLContextParameters 配置安全性。

 

SSLContextParameters

userName (common)

用于基本身份验证的用户名。

 

字符串

password (common)

用于基本身份验证的密码。

 

字符串

配置 (高级)

设置端点之间共享的通用配置

 

EtcdConfiguration

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

etcd 端点使用 URI 语法配置:

etcd:namespace/path

使用以下路径和查询参数:

97.2.1. 路径名(2 参数):

名称描述默认类型

namespace

要使用的 API 命名空间

 

EtcdNamespace

path

端点指向的路径

 

字符串

97.2.2. 查询参数(29 参数):

名称描述默认类型

recursive (common)

以递归方式应用操作。

false

布尔值

servicePath (common)

查找服务发现的路径

/services/

字符串

timeout (common)

要设置操作可完成的最大时间。

 

Long

uris (common)

要设置客户端连接的 URI。

http://localhost:2379,http://localhost:4001

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyExchangeOnTimeout (consumer)

在出现超时监视密钥时发送空消息。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

fromIndex (consumer)

要监视的索引

0

Long

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

timeToLive (producer)

以毫秒为单位设置密钥的寿命。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

密码 (安全)

用于基本身份验证的密码。

 

字符串

sslContextParameters (security)

使用 SSLContextParameters 配置安全性。

 

SSLContextParameters

userName (security)

用于基本身份验证的用户名。

 

字符串

97.3. Spring Boot Auto-Configuration

组件支持 17 个选项,如下所示。

名称描述默认类型

camel.component.etcd.configuration.from-index

要监视的索引

0

Long

camel.component.etcd.configuration.password

用于基本身份验证的密码。

 

字符串

camel.component.etcd.configuration.recursive

以递归方式应用操作。

false

布尔值

camel.component.etcd.configuration.send-empty-exchange-on-timeout

在出现超时监视密钥时发送空消息。

false

布尔值

camel.component.etcd.configuration.service-path

查找服务发现的路径

/services/

字符串

camel.component.etcd.configuration.ssl-context-parameters

使用 SSLContextParameters 配置安全性。

 

SSLContextParameters

camel.component.etcd.configuration.time-to-live

以毫秒为单位设置密钥的寿命。

 

整数

camel.component.etcd.configuration.timeout

要设置操作可完成的最大时间。

 

Long

camel.component.etcd.configuration.uris

要设置客户端连接的 URI。

http://localhost:2379,http://localhost:4001

字符串

camel.component.etcd.configuration.user-name

用于基本身份验证的用户名。

 

字符串

camel.component.etcd.enabled

启用 etcd 组件

true

布尔值

camel.component.etcd.password

用于基本身份验证的密码。

 

字符串

camel.component.etcd.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.etcd.ssl-context-parameters

使用 SSLContextParameters 配置安全性。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.etcd.uris

要设置客户端连接的 URI。

 

字符串

camel.component.etcd.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

camel.component.etcd.user-name

用于基本身份验证的用户名。

 

字符串

第 98 章 OSGi EventAdmin Component

可作为 Camel 版本 2.6 提供。

eventadmin 组件可用于 OSGi 环境,以接收 OSGi EventAdmin 事件并进行处理。

98.1. 依赖项

Maven 用户需要在其 pom.xml中添加以下依赖项

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-eventadmin</artifactId>
  <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.6.0 或更高版本)。

98.2. URI 格式

eventadmin:topic[?options]

其中 topic 是要监听的主题的名称。

98.3. URI 选项

OSGi EventAdmin 组件支持 2 个选项,它们列如下。

名称描述默认类型

bundleContext (common)

Camel 自动注入 OSGi BundleContext

 

BundleContext

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

OSGi EventAdmin 端点使用 URI 语法进行配置:

eventadmin:topic

使用以下路径和查询参数:

98.3.1. 路径名(1 参数):

名称描述默认类型

topic

要侦听或发送到的主题名称

 

字符串

98.3.2. 查询参数(5 参数):

名称描述默认类型

send (common)

是否要使用'send' 或 'synchronous' deliver。默认 false (异步发送)

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

98.4. 邮件标题

名称类型消息

描述

  

98.5. 邮件正文

邮件正文 中的 设置为接收的事件。

98.6. 用法示例

<route>
    <from uri="eventadmin:*"/>
    <to uri="stream:out"/>
</route>

第 99 章 exec 组件

作为 Camel 版本 2.3 可用

exec 组件可用于执行系统命令。

99.1. 依赖项

Maven 用户需要在其 pom.xml中添加以下依赖项

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-exec</artifactId>
  <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.3.0 或更高版本)。

99.2. URI 格式

exec://executable[?options]

其中 executable 是要执行的系统命令的名称或文件路径。如果使用可执行名称(例如 exec:java),则可执行文件必须在系统路径中。

99.3. URI 选项

Exec 组件没有选项。

Exec 端点使用 URI 语法配置:

exec:executable

使用以下路径和查询参数:

99.3.1. 路径名(1 参数):

名称描述默认类型

executable

必需 设置要执行的可执行文件。可执行文件不能为空或 null。

 

字符串

99.3.2. 查询参数(8 参数):

名称描述默认类型

args (producer)

参数可以是一个或多个以空格分隔的令牌。

 

字符串

binding (producer)

对 registry 中的 org.apache.commons.exec.ExecBinding 的引用。

 

ExecBinding

commandExecutor (producer)

对自定义命令执行的 registry 中的 org.apache.commons.exec.ExecCommandExecutor 的引用。默认命令 executor 使用 commons-exec 库,它为每个执行命令添加一个关闭 hook。

 

ExecCommandExecutor

outFile (producer)

由可执行文件创建的文件名,它应被视为其输出。如果没有设置 outFile,则会改为使用可执行文件的标准输出(stdout)。

 

字符串

timeout (producer)

应终止的超时时间(以毫秒为单位)。如果在超时时间内没有完成执行,则组件将发送终止请求。

 

long

useStderrOnEmptyStdout (producer)

布尔值表示 stdout 为空,该组件将使用 stderr 填充 Camel Message Body。默认禁用此行为(false)。

false

布尔值

workingDir (producer)

应在其中执行 命令的目录。如果 null,将使用当前进程的工作目录。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

99.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.exec.enabled

启用 exec 组件

true

布尔值

camel.component.exec.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

99.5. 邮件标题

支持的标头在 org.apache.camel.component.exec.ExecBinding 中定义。

名称类型消息描述

ExecBinding.EXEC_COMMAND_EXECUTABLE

字符串

in

将要执行的系统命令的名称。覆盖 URI 中的 可执行文件

ExecBinding.EXEC_COMMAND_ARGS

java.util.List<String>

in

传递给已执行的进程的命令行参数。参数以字面意义使用 - 不应用引用。覆盖 URI 中的任何现有参数。

ExecBinding.EXEC_COMMAND_ARGS

字符串

in

Camel 2.5: 可执行文件的参数作为单个字符串,其中每个参数都用空格分开(请参阅 URI 选项中的 args )。参数以字面意义使用,不会应用引用。覆盖 URI 中的任何现有参数。

ExecBinding.EXEC_COMMAND_OUT_FILE

字符串

in

由可执行文件创建的文件名,它应被视为其输出。覆盖 URI 中的任何现有 outFile

ExecBinding.EXEC_COMMAND_TIMEOUT

long

in

应终止的超时时间(以毫秒为单位)。覆盖 URI 中的任何现有 超时

ExecBinding.EXEC_COMMAND_WORKING_DIR

字符串

in

应在其中执行 命令的目录。覆盖 URI 中的任何现有 workingDir

ExecBinding.EXEC_EXIT_VALUE

int

out

此标头的值是可执行文件的 退出值。非零退出值通常表示异常终止。请注意,退出值是独立于操作系统。

ExecBinding.EXEC_STDERR

java.io.InputStream

out

此标头的值指向可执行文件的标准错误流(stderr)。如果没有写入 stderr,则该值 为空

ExecBinding.EXEC_USE_STDERR_ON_EMPTY_STDOUT

布尔值

in

表示 stdout 为空时,该组件将使用 stderr 填充 Camel Message Body。默认禁用此行为(false)。

99.6. 邮件正文

如果 Exec 组件收到一个 可转换为 java.io.InputStream 的消息正文中的,则会使用其 stdin 将输入输入到可执行文件。执行后,消息正文 是执行的结果,即 org.apache.camel.components.exec.ExecResult 实例,其中包含 stdout、stderr、exit 值和 out 文件。为方便起见,这个组件支持以下 ExecResult 类型转换器

from

ExecResult

java.io.InputStream

ExecResult

字符串

ExecResult

byte []

ExecResult

org.w3c.dom.Document

如果指定了 out file (通过 outFile 或通过 ExecBinding.EXEC_COMMAND_OUT_FILE的消息标题),转换器会返回 out 文件的内容。如果没有使用文件,则此组件会将进程的 stdout 转换为目标类型。详情请参考 以下示例

99.7. 用法示例

99.7.1. 执行字数(Linux)

以下示例执行 wc (字数,Linux)来计算文件 /usr/share/dict/words 中的词语。字数(输出)被写入 wc 的标准输出流。

from("direct:exec")
.to("exec:wc?args=--words /usr/share/dict/words")
.process(new Processor() {
     public void process(Exchange exchange) throws Exception {
       // By default, the body is ExecResult instance
       assertIsInstanceOf(ExecResult.class, exchange.getIn().getBody());
       // Use the Camel Exec String type converter to convert the ExecResult to String
       // In this case, the stdout is considered as output
       String wordCountOutput = exchange.getIn().getBody(String.class);
       // do something with the word count
     }
});

99.7.2. 执行 java

以下示例执行 java with 2 参数: -server-version,为 java 存在于系统路径中。

from("direct:exec")
.to("exec:java?args=-server -version")

以下示例执行 java in c:\temp with 3 参数: -server,-version 和 sytem 属性 user.name

from("direct:exec")
.to("exec:c:/program files/jdk/bin/java?args=-server -version -Duser.name=Camel&workingDir=c:/temp")

99.7.3. 执行 Ant 脚本

以下示例通过构建文件 CamelExecBuildFile.xml 执行 Apache Ant (Windows),提供 ant.bat 在系统路径中,并且 CamelExecBuildFile.xml 位于当前目录中。

from("direct:exec")
.to("exec:ant.bat?args=-f CamelExecBuildFile.xml")

在下一个示例中,at .bat 命令通过 -l 将输出重定向到 CamelExecOutFile.txt。文件 CamelExecOutFile.txt 用作带 outFile=CamelExecOutFile.txt 的文件。该示例假定 ant.bat 位于系统路径中,并且 CamelExecBuildFile.xml 位于当前目录中。

from("direct:exec")
.to("exec:ant.bat?args=-f CamelExecBuildFile.xml -l CamelExecOutFile.txt&outFile=CamelExecOutFile.txt")
.process(new Processor() {
     public void process(Exchange exchange) throws Exception {
        InputStream outFile = exchange.getIn().getBody(InputStream.class);
        assertIsInstanceOf(InputStream.class, outFile);
        // do something with the out file here
     }
  });

99.7.4. 执行 echo (Windows)

echodir 等命令只能使用操作系统的命令解释器执行。本例演示了如何在 Windows 中执行此类命令 - echo -。

from("direct:exec").to("exec:cmd?args=/C echo echoString")

99.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 100 章 Facebook 组件

作为 Camel 版本 2.14 可用

Facebook 组件提供对使用 Facebook4J 访问的所有 Facebook API 的访问。它允许生成消息来检索、添加和删除文章,如注释、评论、照片、视频、图片、照片、检查、位置、链接等。它还支持 API,允许轮询后期、用户、检查、组、位置等。

Facebook 需要使用 OAuth 进行所有客户端应用程序身份验证。为了将 camel-facebook 与您的帐户搭配使用,您需要在 Facebook 中创建一个新应用程序 https://developers.facebook.com/apps,并授权应用程序对您的帐户的访问权限。Facebook 应用的 id 和 secret 将允许访问不需要当前用户的 Facebook API。需要登录用户的 API 需要用户访问令牌。有关获取用户访问令牌的更多信息,请参阅 https://developers.facebook.com/docs/facebook-login/access-tokens/

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-facebook</artifactId>
        <version>${camel-version}</version>
    </dependency>

100.1. URI 格式

  facebook://[endpoint]?[options]

100.2. FacebookComponent

facebook 组件可使用下面的 Facebook 帐户设置进行配置,这是必须的。可以使用类型为 org.apache.camel.component.facebook.config.Facebook.config.Facebook.config.FacebookConfiguration 的 bean 属性 配置 向组件提供这些值。oAuthAccessToken 选项可能被忽略,但仅允许访问应用 API。

Facebook 组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享配置

 

FacebookConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Facebook 端点使用 URI 语法配置:

facebook:methodName

使用以下路径和查询参数:

100.2.1. 路径名(1 参数):

名称描述默认类型

methodName

执行 所需的操作

 

字符串

100.2.2. 查询参数(102 参数):

名称描述默认类型

achievementURL (common)

实现的唯一 URL

 

URL

albumId (common)

album ID

 

字符串

albumUpdate (common)

facebook Album 要被创建或更新

 

AlbumUpdate

appId (common)

Facebook 应用程序的 ID

 

字符串

center (common)

地点范围和长度

 

GeoLocation

checkinId (common)

检查 ID

 

字符串

checkinUpdate (common)

弃用了 要创建的检查。弃用,而是使用附加位置创建 Post

 

CheckinUpdate

clientURL (common)

Facebook4J API 客户端 URL

 

字符串

clientVersion (common)

Facebook4J 客户端 API 版本

 

字符串

commentId (common)

注释 ID

 

字符串

commentUpdate (common)

创建或更新的 facebook Comment

 

CommentUpdate

debugEnabled (common)

启用 deubg 输出。仅在嵌入的日志记录器有效

false

布尔值

description (common)

description 文本

 

字符串

distance (common)

计量中的距离

 

整数

domainId (common)

域 ID

 

字符串

domainName (common)

域名

 

字符串

domainNames (common)

域名

 

list

eventId (common)

事件 ID

 

字符串

eventUpdate (common)

创建或更新的事件

 

EventUpdate

friendId (common)

friend ID

 

字符串

friendlistId (common)

friend 列表 ID

 

字符串

friendlistName (common)

friend list Name

 

字符串

friendUserId (common)

friend 用户 ID

 

字符串

groupId (common)

组 ID

 

字符串

gzipEnabled (common)

使用 Facebook GZIP 编码

true

布尔值

httpConnectionTimeout (common)

HTTP 连接超时(以毫秒为单位)

20000

整数

httpDefaultMaxPerRoute (common)

每个路由的 HTTP 最大连接数

2

整数

httpMaxTotalConnections (common)

HTTP 最大连接总数

20

整数

httpReadTimeout (common)

HTTP 读取超时(以毫秒为单位)

120000

整数

httpRetryCount (common)

HTTP 重试次数

0

整数

httpRetryIntervalSeconds (common)

HTTP 重试间隔(以秒为单位)

5

整数

httpStreamingReadTimeout (common)

HTTP 流读取超时(以毫秒为单位)

40000

整数

ids (common)

用户的 ID

 

list

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

includeRead (common)

启用用户已经读取的通知

 

布尔值

isHidden (common)

是否隐藏

 

布尔值

jsonStoreEnabled (common)

如果设置为 true,则原始 JSON 表单将存储在 DataObjectFactory 中

false

布尔值

link (common)

链接 URL

 

URL

linkId (common)

链接 ID

 

字符串

locale (common)

所需 FQL 区域设置

 

Locale

mbeanEnabled (common)

如果设置为 true,那么将注册 Facebook4J mbean

false

布尔值

message (common)

消息文本

 

字符串

messageId (common)

消息 ID

 

字符串

metric (common)

指标名称

 

字符串

milestoneId (common)

里程碑的 ID

 

字符串

name (common)

测试用户名,必须是 'first last' 的形式。

 

字符串

noteId (common)

备注 ID

 

字符串

notificationId (common)

通知 ID

 

字符串

objectId (common)

Insights 对象 ID

 

字符串

offerId (common)

优惠 ID

 

字符串

optionDescription (common)

问题回答选项描述

 

字符串

pageId (common)

页面 ID

 

字符串

permissionName (common)

权限名称

 

字符串

permissions (common)

以 perm1,perm2,…​ 格式测试用户权限

 

字符串

photoId (common)

照片 ID

 

字符串

pictureId (common)

图片 ID

 

整数

pictureId2 (common)

picture2 id

 

整数

pictureSize (common)

图片大小

 

PictureSize

placeId (common)

原位 ID

 

字符串

postId (common)

后面的 ID

 

字符串

postUpdate (common)

创建或更新后

 

PostUpdate

prettyDebugEnabled (common)

如果设为 true,则 Prettify JSON 调试输出

false

布尔值

queries (common)

FQL 查询

 

map

query (common)

FQL 查询或搜索搜索端点的术语

 

字符串

questionId (common)

问题 ID

 

字符串

reading (common)

可选的读取参数。请参阅 Reading Options (#reading)

 

读取

readingOptions (common)

使用 map 中的键/值对配置读取。

 

map

restBaseURL (common)

API 基础 URL

https://graph.facebook.com/

字符串

scoreValue (common)

数值分数(值为值)

 

整数

size (common)

图片大小、一个大型、普通、小或平方

 

PictureSize

source (common)

java.io.File 或 java.io.Inputstream 中的介质内容

 

介质

subject (common)

主题的备注

 

字符串

tabId (common)

标签 id

 

字符串

tagUpdate (common)

照片标签信息

 

TagUpdate

testUser1 (common)

测试用户 1

 

TestUser

testUser2 (common)

测试用户 2

 

TestUser

testUserId (common)

测试用户的 ID

 

字符串

title (common)

标题文本

 

字符串

toUserId (common)

要标记的用户 ID

 

字符串

toUserIds (common)

要标记的用户 ID

 

list

userId (common)

Facebook 用户 ID

 

字符串

userId1 (common)

用户的 ID 1

 

字符串

userId2 (common)

用户 2 的 ID

 

字符串

userIds (common)

邀请到事件的用户 ID

 

list

userLocale (common)

测试用户区域设置

 

字符串

useSSL (common)

使用 SSL

true

布尔值

videoBaseURL (common)

视频 API 基础 URL

https://graph-video.facebook.com/

字符串

videoId (common)

视频 ID

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

httpProxyHost (proxy)

HTTP 代理服务器主机名

 

字符串

httpProxyPassword (proxy)

HTTP 代理服务器密码

 

字符串

httpProxyPort (proxy)

HTTP 代理服务器端口

 

整数

httpProxyUser (proxy)

HTTP 代理服务器用户名

 

字符串

oAuthAccessToken (security)

用户访问令牌

 

字符串

oAuthAccessTokenURL (security)

OAuth 访问令牌 URL

https://graph.facebook.com/oauth/access_token

字符串

oAuthAppId (security)

应用程序 Id

 

字符串

oAuthAppSecret (security)

应用程序 Secret

 

字符串

oAuthAuthorizationURL (security)

OAuth 授权 URL

https://www.facebook.com/dialog/oauth

字符串

oAuthPermissions (security)

默认 OAuth 权限。以逗号分隔的权限名称。详情请查看 https://developers.facebook.com/docs/reference/login/#permissions

 

字符串

100.3. Spring Boot Auto-Configuration

组件支持 29 选项,它们如下所列。

名称描述默认类型

camel.component.facebook.configuration.client-u-r-l

Facebook4J API 客户端 URL

 

字符串

camel.component.facebook.configuration.client-version

Facebook4J 客户端 API 版本

 

字符串

camel.component.facebook.configuration.debug-enabled

启用 deubg 输出。仅在嵌入的日志记录器有效

false

布尔值

camel.component.facebook.configuration.gzip-enabled

使用 Facebook GZIP 编码

true

布尔值

camel.component.facebook.configuration.http-connection-timeout

HTTP 连接超时(以毫秒为单位)

20000

整数

camel.component.facebook.configuration.http-default-max-per-route

每个路由的 HTTP 最大连接数

2

整数

camel.component.facebook.configuration.http-max-total-connections

HTTP 最大连接总数

20

整数

camel.component.facebook.configuration.http-proxy-host

HTTP 代理服务器主机名

 

字符串

camel.component.facebook.configuration.http-proxy-password

HTTP 代理服务器密码

 

字符串

camel.component.facebook.configuration.http-proxy-port

HTTP 代理服务器端口

 

整数

camel.component.facebook.configuration.http-proxy-user

HTTP 代理服务器用户名

 

字符串

camel.component.facebook.configuration.http-read-timeout

HTTP 读取超时(以毫秒为单位)

120000

整数

camel.component.facebook.configuration.http-retry-count

HTTP 重试次数

0

整数

camel.component.facebook.configuration.http-retry-interval-seconds

HTTP 重试间隔(以秒为单位)

5

整数

camel.component.facebook.configuration.http-streaming-read-timeout

HTTP 流读取超时(以毫秒为单位)

40000

整数

camel.component.facebook.configuration.json-store-enabled

如果设置为 true,则原始 JSON 表单将存储在 DataObjectFactory 中

false

布尔值

camel.component.facebook.configuration.mbean-enabled

如果设置为 true,那么将注册 Facebook4J mbean

false

布尔值

camel.component.facebook.configuration.o-auth-access-token

用户访问令牌

 

字符串

camel.component.facebook.configuration.o-auth-access-token-u-r-l

OAuth 访问令牌 URL

https://graph.facebook.com/oauth/access_token

字符串

camel.component.facebook.configuration.o-auth-app-id

应用程序 Id

 

字符串

camel.component.facebook.configuration.o-auth-app-secret

应用程序 Secret

 

字符串

camel.component.facebook.configuration.o-auth-authorization-u-r-l

OAuth 授权 URL

https://www.facebook.com/dialog/oauth

字符串

camel.component.facebook.configuration.o-auth-permissions

默认 OAuth 权限。以逗号分隔的权限名称。详情请查看 https://developers.facebook.com/docs/reference/login/#permissions

 

字符串

camel.component.facebook.configuration.pretty-debug-enabled

如果设为 true,则 Prettify JSON 调试输出

false

布尔值

camel.component.facebook.configuration.rest-base-u-r-l

API 基础 URL

https://graph.facebook.com/

字符串

camel.component.facebook.configuration.use-s-s-l

使用 SSL

true

布尔值

camel.component.facebook.configuration.video-base-u-r-l

视频 API 基础 URL

https://graph-video.facebook.com/

字符串

camel.component.facebook.enabled

启用 facebook 组件

true

布尔值

camel.component.facebook.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

100.4. 制作者端点:

制作者端点可以使用下表中的端点名称和选项。端点也可以使用没有 getsearch 前缀的短名称,但 检查因为 getCheckin searchCheckin 之间不确定的问题。不是必需的端点选项由 [] 表示。

制作者端点也可以使用特殊选项 inBody,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。例如,以下路由中的 facebook 端点检索传入消息正文中用户 id 值的活动。

    from("direct:test").to("facebook://activities?inBody=userId")...

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelFacebook.https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=CAMEL&title=option&linkCreation=true&fromPageId=34020899[option] 的格式。例如,上一路由中的 userId 选项值还可在消息标题 CamelFacebook.userId 中提供。请注意,inBody 选项会覆盖消息标头,例如,Body=user 中的 endpoint 选项会覆盖 CamelFacebook.userId 标头。

返回 String 的端点会为已创建或修改的实体返回 Id,例如 addAlbumPhoto 返回新的 album Id。返回布尔值的端点,返回 true,否则返回 true。如果 Facebook API 错误,端点将针对 facebook4j.FacebookException 引发 RuntimeCamelException 导致。

100.5. 消费者端点:

使用 read#reading 参数的任何制作者端点都可用作消费者端点。轮询使用者使用 sinceuntil 字段在轮询间隔内获取响应。除了其他阅读字段外,可以在端点中提供初始( 因为 值)用于第一个轮询。

camel-facebook 并非通过单一路由交换返回 List (或 facebook4j.ResponseList)的端点,而是每个返回的对象创建一个路由交换。例如,如果 "facebook://home" 结果为五个后,该路由将执行五次(每个 Post )。

100.6. 读取选项

类型为 facebook4j.Reading 的 read 选项添加了对读取参数的支持,这允许选择特定字段,限制结果数量等。如需更多信息,请参阅 Graph API#reading - Facebook Developers

使用者端点也用于轮询 Facebook 数据,以避免在轮询之间发送重复消息。

read 选项可以是 facebook4j.Reading 的参考或值,也可以使用端点 URI 或与 CamelFacebook. 前缀交换标头来指定的以下读取选项。

100.7. 邮件标题

任何 URI 选项#urioptions 可以在带有 CamelFacebook. 前缀的 producer 端点的消息标头中提供。

100.8. 邮件正文

所有结果消息正文都使用 Facebook4J API 提供的对象。producer 端点可以在 inBody endpoint 参数中为传入消息正文指定选项名称。

对于返回数组或 facebook4j.ResponseListjava.util.List 的端点,消费者端点会将列表中的每个元素映射到不同的消息。

100.9. 使用案例

要在 Facebook 配置集中创建后期,请将这个制作者发送到 facebook4j.PostUpdate body。

    from("direct:foo")
        .to("facebook://postFeed/inBody=postUpdate);

要轮询,每个 5 个 sec (您可以通过添加前缀 " consumer" 来设置轮询 消费者选项),您的主页上的所有状态都:

    from("facebook://home?consumer.delay=5000")
        .to("bean:blah");

使用带有标头的动态选项的制作者搜索。

在栏标题中,我们使用 Facebook 搜索字符串在公共发行后执行,因此我们需要将这个值分配给 CamelFacebook.query 标头。

    from("direct:foo")
        .setHeader("CamelFacebook.query", header("bar"))
        .to("facebook://posts");

第 101 章 FHIR 组件

作为 Camel 版本 2.23 可用

FHIR 组件与 HAPI-FHIR 库集成,它是 Java 中 FHIR 互操作性资源(Fast healthcare Interoperability 资源)规范的开源实现。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-fhir</artifactId>
    <version>${camel-version}</version>
</dependency>

101.1. URI 格式

FHIR 组件使用以下 URI 格式:

fhir://endpoint-prefix/endpoint?[options]

端点前缀可以是以下之一:

  • 功能
  • create
  • delete
  • history
  • load-page
  • meta
  • operation
  • patch
  • 读取
  • search
  • transaction
  • update
  • validate

FHIR 组件支持 2 个选项,它们如下所列。

名称描述默认类型

configuration (common)

使用共享配置

 

FhirConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

FHIR 端点使用 URI 语法进行配置:

fhir:apiName/methodName

使用以下路径和查询参数:

101.1.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

FhirApiName

methodName

所选操作需要什么子操作

 

字符串

101.1.2. 查询参数(26 参数):

名称描述默认类型

encoding (common)

用于所有请求的编码

 

字符串

fhirVersion (common)

要使用的 FHIR 版本

DSTU3

字符串

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

log (common)

将记录每个请求和响应

false

布尔值

prettyPrint (common)

以用户的形式打印所有请求

false

布尔值

serverUrl (common)

FHIR 服务器基本 URL

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

压缩 (高级)

将传出(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)

单个读/写操作(以毫秒为单位)

10000

整数

Summary (advanced)

请求服务器使用 _summary param 修改响应

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

validationMode (advanced)

当 Camel 验证 FHIR 服务器规范时

ONCE

字符串

proxyHost (proxy)

代理主机

 

字符串

proxyPassword (proxy)

代理密码

 

字符串

proxyPort (proxy)

代理端口

 

整数

proxyUser (proxy)

代理用户名

 

字符串

accessToken (安全性)

OAuth 访问令牌

 

字符串

密码 (安全)

用于基本身份验证的用户名

 

字符串

username (security)

用于基本身份验证的用户名

 

字符串

101.2. Spring Boot Auto-Configuration

组件支持 23 个选项,如下所示。

名称描述默认类型

camel.component.fhir.configuration.access-token

OAuth 访问令牌

 

字符串

camel.component.fhir.configuration.api-name

要执行的操作种类

 

FhirApiName

camel.component.fhir.configuration.client

使用自定义客户端

 

IGenericClient

camel.component.fhir.configuration.client-factory

使用自定义客户端工厂

 

IRestfulClientFactory

camel.component.fhir.configuration.compress

将传出(POST/PUT)内容压缩为 GZIP 格式

false

布尔值

camel.component.fhir.configuration.connection-timeout

试用和建立初始 TCP 连接所需的时间(以 ms 为单位)

10000

整数

camel.component.fhir.configuration.defer-model-scanning

设定此选项时,在实际访问给定类型的子列表之前,对子类不会扫描模型类。

false

布尔值

camel.component.fhir.configuration.fhir-context

FhirContext 是创建的一个昂贵对象。要避免创建多个实例,可以直接设置。

 

FhirContext

camel.component.fhir.configuration.force-conformance-check

强制一致性检查

false

布尔值

camel.component.fhir.configuration.log

将记录每个请求和响应

false

布尔值

camel.component.fhir.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.fhir.configuration.password

用于基本身份验证的用户名

 

字符串

camel.component.fhir.configuration.pretty-print

以用户的形式打印所有请求

false

布尔值

camel.component.fhir.configuration.proxy-host

代理主机

 

字符串

camel.component.fhir.configuration.proxy-password

代理密码

 

字符串

camel.component.fhir.configuration.proxy-port

代理端口

 

整数

camel.component.fhir.configuration.proxy-user

代理用户名

 

字符串

camel.component.fhir.configuration.server-url

FHIR 服务器基本 URL

 

字符串

camel.component.fhir.configuration.session-cookie

要添加到每个请求的 HTTP 会话 Cookie

 

字符串

camel.component.fhir.configuration.socket-timeout

单个读/写操作(以毫秒为单位)

10000

整数

camel.component.fhir.configuration.username

用于基本身份验证的用户名

 

字符串

camel.component.fhir.enabled

是否启用 fhir 组件的自动配置。默认启用。

 

布尔值

camel.component.fhir.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 102 章 FHIR JSon DataFormat

从 Camel 版本 2.21 开始,可用为 Camel 版本 2.21

FHIR-JSON 数据格式利用 HAPI-FHIR 的 JSON 解析器解析到/从 JSON 格式解析到/来自 HAPI-FHIR 的 IBaseResource

102.1. FHIR JSON 格式选项

FHIR JSon 数据格式支持 14 个选项,它们如下所列。

名称默认Java 类型描述

fhirVersion

DSTU3

字符串

要使用的 FHIR 版本。可能的值有:DSTU2,DSTU2_HL7ORG,DSTU2_1,DSTU3,R4

prettyPrint

false

布尔值

设置 pretty print 标志,即解析器将使用元素之间的人类可读和新行来编码资源,而不是尽可能提高的输出。

serverBaseUrl

 

字符串

设置此解析器使用的服务器基本 URL。如果设置了值,如果资源引用作为绝对 URL 提供,则会将其转换为相对引用,但具有与给定基本基本匹配的基础。

omitResourceId

false

布尔值

如果设置为 true(默认为 false),则输出中不包含任何被编码的资源的 ID。请注意,这不适用于包含资源,仅适用于 root 资源。换句话说,如果将其设置为 true,其中包含的资源仍会有本地 ID,但 outer/包含 ID 将不会有 ID。

encodeElementsAppliesToResourceTypes

 

Set

如果提供,告知解析哪些资源类型应用链接 #setEncodeElements (Set)编码元素。这里未指定的资源类型都会完全编码,且没有排除元素。

encodeElementsAppliesToChildResourcesOnly

false

布尔值

如果设置为 true (默认为 false),则提供给 setEncodeElements (Set)的值不会应用到根资源(通常是捆绑包),而是应用于其中包含的任何子资源(例如,搜索结果资源)

encodeElements

 

Set

如果提供,指定应编码的元素,到所有其他的排除项。此字段的有效值包括: Patient - Encode 患者及其所有子子 Patient.name - Encode 只包括患者名称 Patient.name.family - 对任何资源(只有第一个位置可能包含通配符)添加文本元素(仅包括通配符)的编码。

dontEncodeElements

 

Set

如果提供,指定不应编码的元素。此字段的有效值包括: 耐心 - Don't en patient 以及其所有子人的 Patient.name - Don 对病人的名称 Patient.name.family - Don' encode the patient 的家族名称 .text - Don't 对任何资源上的文本元素进行编码(只有第一个位置可以包括通配符)DS2 备注: 请注意,包括 Patient.meta 的值(如 Patient.meta)可用于 DSTU2 解析器,但 meta 上带有子元素的值(如 Patient.meta.lastUpdated 只在 DSTU3 模式中可以正常工作。

stripVersionsFromReferences

false

布尔值

如果设置为 true(默认值),则包含版本的资源引用将在资源编码时删除版本。这通常是很好的,因为在多数情况下,从一个资源到另一个资源的引用应该由 ID(而不是 ID 和版本)指向资源。在某些情况下,最好在资源链接中保留版本。在这种情况下,这个值应该设置为 false。这个方法提供了全局禁用引用编码的功能。如果需要精细控制,请使用 setDontStripVersionsFromReferencesAtPaths (List)

overrideResourceIdWithBundleEntryFullUrl

false

布尔值

如果设置为 true(默认值),则 Bundle.entry.fullUrl 会在定义了 fullUrl 时覆盖 Bundle.entry.resource 的 resource id。将源数据解析为 Bundle 对象时会发生此行为。如果这不是所需行为,则将其设置为 false(例如,客户端代码需要在 fullUrl 和资源 id 间执行额外的验证检查)。

summaryMode

false

布尔值

如果设置为 true(默认为 false),则只包括 FHIR 规格所标记的元素,如概述元素。

suppressNarratives

false

布尔值

如果设置为 true(默认为 false),则编码的值不会包含 narratives。

dontStripVersionsFromReferencesAtPaths

 

list

如果提供的值,指定路径中的任何资源引用都将对其资源版本编码,而不是在编码过程中自动剥离。此设置对解析过程没有影响。这个方法提供了比 setStripVersionsFromReferences (Boolean)指定的任何路径的更精细的控制级别,即使 setStripVersionsFromReferences (Boolean)被设为 true (默认)

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

102.2. Spring Boot Auto-Configuration

组件支持 15 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.fhirjson.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.fhirjson.dont-encode-elements

如果提供,指定不应编码的元素。此字段的有效值包括: 耐心 - Don't en patient 以及其所有子人的 Patient.name - Don 对病人的名称 Patient.name.family - Don' encode the patient 的家族名称 .text - Don't 对任何资源上的文本元素进行编码(只有第一个位置可以包括通配符)DS2 备注: 请注意,包括 Patient.meta 的值(如 Patient.meta)可用于 DSTU2 解析器,但 meta 上带有子元素的值(如 Patient.meta.lastUpdated 只在 DSTU3 模式中可以正常工作。

 

Set

camel.dataformat.fhirjson.dont-strip-versions-from-references-at-paths

如果提供的值,指定路径中的任何资源引用都将对其资源版本编码,而不是在编码过程中自动剥离。此设置对解析过程没有影响。这个方法提供了比 setStripVersionsFromReferences (Boolean)指定的任何路径的更精细的控制级别,即使 setStripVersionsFromReferences (Boolean)被设为 true (默认)

 

list

camel.dataformat.fhirjson.enabled

是否启用 fhirJson 数据格式的自动配置。默认启用。

 

布尔值

camel.dataformat.fhirjson.encode-elements

如果提供,指定应编码的元素,到所有其他的排除项。此字段的有效值包括: Patient - Encode 患者及其所有子子 Patient.name - Encode 只包括患者名称 Patient.name.family - 对任何资源(只有第一个位置可能包含通配符)添加文本元素(仅包括通配符)的编码。

 

Set

camel.dataformat.fhirjson.encode-elements-applies-to-child-resources-only

如果设置为 true (默认为 false),则提供给 setEncodeElements (Set)的值不会应用到根资源(通常是捆绑包),而是应用于其中包含的任何子资源(例如,搜索结果资源)

false

布尔值

camel.dataformat.fhirjson.encode-elements-applies-to-resource-types

如果提供,告知解析哪些资源类型应用链接 #setEncodeElements (Set)编码元素。这里未指定的资源类型都会完全编码,且没有排除元素。

 

Set

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,但 outer/包含 ID 将不会有 ID。

false

布尔值

camel.dataformat.fhirjson.override-resource-id-with-bundle-entry-full-url

如果设置为 true(默认值),则 Bundle.entry.fullUrl 会在定义了 fullUrl 时覆盖 Bundle.entry.resource 的 resource id。将源数据解析为 Bundle 对象时会发生此行为。如果这不是所需行为,则将其设置为 false(例如,客户端代码需要在 fullUrl 和资源 id 间执行额外的验证检查)。

false

布尔值

camel.dataformat.fhirjson.pretty-print

设置 pretty print 标志,即解析器将使用元素之间的人类可读和新行来编码资源,而不是尽可能提高的输出。

false

布尔值

camel.dataformat.fhirjson.server-base-url

设置此解析器使用的服务器基本 URL。如果设置了值,如果资源引用作为绝对 URL 提供,则会将其转换为相对引用,但具有与给定基本基本匹配的基础。

 

字符串

camel.dataformat.fhirjson.strip-versions-from-references

如果设置为 true(默认值),则包含版本的资源引用将在资源编码时删除版本。这通常是很好的,因为在多数情况下,从一个资源到另一个资源的引用应该由 ID(而不是 ID 和版本)指向资源。在某些情况下,最好在资源链接中保留版本。在这种情况下,这个值应该设置为 false。这个方法提供了全局禁用引用编码的功能。如果需要精细控制,请使用 setDontStripVersionsFromReferencesAtPaths (List)

false

布尔值

camel.dataformat.fhirjson.summary-mode

如果设置为 true(默认为 false),则只包括 FHIR 规格所标记的元素,如概述元素。

false

布尔值

camel.dataformat.fhirjson.suppress-narratives

如果设置为 true(默认为 false),则编码的值不会包含 narratives。

false

布尔值

第 103 章 FHIR XML DataFormat

从 Camel 版本 2.21 开始,可用为 Camel 版本 2.21

FHIR-XML 数据格式利用 HAPI-FHIR 的 XML 解析器解析到/从 XML 格式解析到/从 HAPI-FHIR 的 IBaseResource

103.1. FHIR XML 格式选项

FHIR XML 数据格式支持 14 个选项,它们如下所列。

名称默认Java 类型描述

fhirVersion

DSTU3

字符串

要使用的 FHIR 版本。可能的值有:DSTU2,DSTU2_HL7ORG,DSTU2_1,DSTU3,R4

prettyPrint

false

布尔值

设置 pretty print 标志,即解析器将使用元素之间的人类可读和新行来编码资源,而不是尽可能提高的输出。

serverBaseUrl

 

字符串

设置此解析器使用的服务器基本 URL。如果设置了值,如果资源引用作为绝对 URL 提供,则会将其转换为相对引用,但具有与给定基本基本匹配的基础。

omitResourceId

false

布尔值

如果设置为 true(默认为 false),则输出中不包含任何被编码的资源的 ID。请注意,这不适用于包含资源,仅适用于 root 资源。换句话说,如果将其设置为 true,其中包含的资源仍会有本地 ID,但 outer/包含 ID 将不会有 ID。

encodeElementsAppliesToResourceTypes

 

Set

如果提供,告知解析哪些资源类型应用链接 #setEncodeElements (Set)编码元素。这里未指定的资源类型都会完全编码,且没有排除元素。

encodeElementsAppliesToChildResourcesOnly

false

布尔值

如果设置为 true (默认为 false),则提供给 setEncodeElements (Set)的值不会应用到根资源(通常是捆绑包),而是应用于其中包含的任何子资源(例如,搜索结果资源)

encodeElements

 

Set

如果提供,指定应编码的元素,到所有其他的排除项。此字段的有效值包括: Patient - Encode 患者及其所有子子 Patient.name - Encode 只包括患者名称 Patient.name.family - 对任何资源(只有第一个位置可能包含通配符)添加文本元素(仅包括通配符)的编码。

dontEncodeElements

 

Set

如果提供,指定不应编码的元素。此字段的有效值包括: 耐心 - Don't en patient 以及其所有子人的 Patient.name - Don 对病人的名称 Patient.name.family - Don' encode the patient 的家族名称 .text - Don't 对任何资源上的文本元素进行编码(只有第一个位置可以包括通配符)DS2 备注: 请注意,包括 Patient.meta 的值(如 Patient.meta)可用于 DSTU2 解析器,但 meta 上带有子元素的值(如 Patient.meta.lastUpdated 只在 DSTU3 模式中可以正常工作。

stripVersionsFromReferences

false

布尔值

如果设置为 true(默认值),则包含版本的资源引用将在资源编码时删除版本。这通常是很好的,因为在多数情况下,从一个资源到另一个资源的引用应该由 ID(而不是 ID 和版本)指向资源。在某些情况下,最好在资源链接中保留版本。在这种情况下,这个值应该设置为 false。这个方法提供了全局禁用引用编码的功能。如果需要精细控制,请使用 setDontStripVersionsFromReferencesAtPaths (List)

overrideResourceIdWithBundleEntryFullUrl

false

布尔值

如果设置为 true(默认值),则 Bundle.entry.fullUrl 会在定义了 fullUrl 时覆盖 Bundle.entry.resource 的 resource id。将源数据解析为 Bundle 对象时会发生此行为。如果这不是所需行为,则将其设置为 false(例如,客户端代码需要在 fullUrl 和资源 id 间执行额外的验证检查)。

summaryMode

false

布尔值

如果设置为 true(默认为 false),则只包括 FHIR 规格所标记的元素,如概述元素。

suppressNarratives

false

布尔值

如果设置为 true(默认为 false),则编码的值不会包含 narratives。

dontStripVersionsFromReferencesAtPaths

 

list

如果提供的值,指定路径中的任何资源引用都将对其资源版本编码,而不是在编码过程中自动剥离。此设置对解析过程没有影响。这个方法提供了比 setStripVersionsFromReferences (Boolean)指定的任何路径的更精细的控制级别,即使 setStripVersionsFromReferences (Boolean)被设为 true (默认)

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

103.2. Spring Boot Auto-Configuration

组件支持 15 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.fhirxml.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.fhirxml.dont-encode-elements

如果提供,指定不应编码的元素。此字段的有效值包括: 耐心 - Don't en patient 以及其所有子人的 Patient.name - Don 对病人的名称 Patient.name.family - Don' encode the patient 的家族名称 .text - Don't 对任何资源上的文本元素进行编码(只有第一个位置可以包括通配符)DS2 备注: 请注意,包括 Patient.meta 的值(如 Patient.meta)可用于 DSTU2 解析器,但 meta 上带有子元素的值(如 Patient.meta.lastUpdated 只在 DSTU3 模式中可以正常工作。

 

Set

camel.dataformat.fhirxml.dont-strip-versions-from-references-at-paths

如果提供的值,指定路径中的任何资源引用都将对其资源版本编码,而不是在编码过程中自动剥离。此设置对解析过程没有影响。这个方法提供了比 setStripVersionsFromReferences (Boolean)指定的任何路径的更精细的控制级别,即使 setStripVersionsFromReferences (Boolean)被设为 true (默认)

 

list

camel.dataformat.fhirxml.enabled

是否启用 fhirXml 数据格式的自动配置。默认启用。

 

布尔值

camel.dataformat.fhirxml.encode-elements

如果提供,指定应编码的元素,到所有其他的排除项。此字段的有效值包括: Patient - Encode 患者及其所有子子 Patient.name - Encode 只包括患者名称 Patient.name.family - 对任何资源(只有第一个位置可能包含通配符)添加文本元素(仅包括通配符)的编码。

 

Set

camel.dataformat.fhirxml.encode-elements-applies-to-child-resources-only

如果设置为 true (默认为 false),则提供给 setEncodeElements (Set)的值不会应用到根资源(通常是捆绑包),而是应用于其中包含的任何子资源(例如,搜索结果资源)

false

布尔值

camel.dataformat.fhirxml.encode-elements-applies-to-resource-types

如果提供,告知解析哪些资源类型应用链接 #setEncodeElements (Set)编码元素。这里未指定的资源类型都会完全编码,且没有排除元素。

 

Set

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,但 outer/包含 ID 将不会有 ID。

false

布尔值

camel.dataformat.fhirxml.override-resource-id-with-bundle-entry-full-url

如果设置为 true(默认值),则 Bundle.entry.fullUrl 会在定义了 fullUrl 时覆盖 Bundle.entry.resource 的 resource id。将源数据解析为 Bundle 对象时会发生此行为。如果这不是所需行为,则将其设置为 false(例如,客户端代码需要在 fullUrl 和资源 id 间执行额外的验证检查)。

false

布尔值

camel.dataformat.fhirxml.pretty-print

设置 pretty print 标志,即解析器将使用元素之间的人类可读和新行来编码资源,而不是尽可能提高的输出。

false

布尔值

camel.dataformat.fhirxml.server-base-url

设置此解析器使用的服务器基本 URL。如果设置了值,如果资源引用作为绝对 URL 提供,则会将其转换为相对引用,但具有与给定基本基本匹配的基础。

 

字符串

camel.dataformat.fhirxml.strip-versions-from-references

如果设置为 true(默认值),则包含版本的资源引用将在资源编码时删除版本。这通常是很好的,因为在多数情况下,从一个资源到另一个资源的引用应该由 ID(而不是 ID 和版本)指向资源。在某些情况下,最好在资源链接中保留版本。在这种情况下,这个值应该设置为 false。这个方法提供了全局禁用引用编码的功能。如果需要精细控制,请使用 setDontStripVersionsFromReferencesAtPaths (List)

false

布尔值

camel.dataformat.fhirxml.summary-mode

如果设置为 true(默认为 false),则只包括 FHIR 规格所标记的元素,如概述元素。

false

布尔值

camel.dataformat.fhirxml.suppress-narratives

如果设置为 true(默认为 false),则编码的值不会包含 narratives。

false

布尔值

第 104 章 文件组件

作为 Camel 版本 1.0 可用

File 组件提供对文件系统的访问,允许由任何其他 Camel 组件或其他组件的消息处理,以保存到磁盘。

104.1. URI 格式

file:directoryName[?options]

或者

file://directoryName[?options]

其中 directoryName 代表底层文件目录。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

仅目录

Camel 只支持通过起始目录配置的端点。因此,directoryName 必须是目录。
如果只想消耗单个文件,您可以使用 fileName 选项,例如,通过设置 fileName=thefilename
另外,起始目录不能包含带有 $\{ } 占位符的动态表达式。再次使用 fileName 选项指定文件名的动态部分。

警告

避免读取当前由另一个应用程序写入的文件,注意 JDK File IO API 检测到另一个应用程序当前是否正在写入/复制文件。这种实施也可以根据操作系统平台的不同而有所不同。这可能会导致 Camel 认为文件不会被另一个进程锁定,并开始使用该文件。因此,您必须自行调查哪些套件。为了帮助此 Camel 提供不同的 readLock 选项和 doneFileName 选项,您可以使用它们。另请参阅有关从 其他人直接丢弃文件的文件夹中 使用文件的部分。

104.2. URI 选项

File 组件没有选项。

File 端点使用 URI 语法配置:

file:directoryName

使用以下路径和查询参数:

104.2.1. 路径名(1 参数):

名称描述默认类型

directoryName

所需的 起始目录

 

File

104.2.2. 查询参数(87 参数):

名称描述默认类型

charset (common)

此选项用于指定文件的编码。您可以在使用者上使用此来指定文件的编码,允许 Camel 知道 charset,以便在访问文件内容时加载文件内容。同样在编写文件时,也可以使用这个选项来指定 charset 以写入该文件。请记住,在编写文件 Camel 时,可能需要读取消息内容到内存中,以便能够将数据转换为配置的 charset,因此如果您有较大消息,则不会使用此消息。

 

字符串

doneFileName (common)

制作者:如果提供,Camel 将在写入原始文件时写入 2 个操作文件。完成的文件将为空。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。生成的文件将始终写在与原始文件相同的文件夹中。消费者:如果提供,Camel 才会消耗文件(如果存在)文件。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。完成的文件始终与原始文件在同一文件夹中。只支持 $file.name 和 $file.name.noext 作为动态占位符。

 

字符串

fileName (common)

使用文件语言等表达式动态设置文件名。对于消费者,它被用作文件名过滤器。对于制作者而言,用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注:标题本身也可以是 Expression)。表达式选项支持 String 和 Expression 类型。如果表达式是 String 类型,则始终会使用文件语言来评估。如果表达式是 Expression 类型,则使用指定的 Expression 类型 - 这允许您使用 OGNL 表达式。对于消费者,您可以使用文件名来过滤文件名,因此您可以使用文件语言语法:mydata-$date:now:yyyyMMdd.txt。生产者支持 CamelOverruleFileName 标头,其优先级高于任何现有的 CamelFileName 标头;CamelOverruleFileName 只是一个标头,而且可以更轻松地进行临时存储 CamelFileName,且必须稍后恢复。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

delete (consumer)

如果为 true,则在成功处理该文件后会删除该文件。

false

布尔值

moveFailed (consumer)

根据简单语言设置移动失败表达式。例如,将文件移动到 .error 子目录,请使用: .error。注意:将文件移动到故障位置 Camel 将处理错误,且不会再次选择该文件。

 

字符串

noop (consumer)

如果为 true,则该文件不会以任何方式移动或删除。此选项对于只读数据或者 ETL 类型要求是很好的选择。如果 noop=true,Camel 也将设置 idempotent=true,以避免再次消耗相同的文件。

false

布尔值

preMove (consumer)

用于在处理前动态设置文件名的表达式(如文件语言)。例如,要将 in-progres 文件移动到 order 目录中,把这个值设置为 order。

 

字符串

preSort (consumer)

启用预先排序后,消费者将在轮询过程中对文件和目录名称进行排序,该名称是从文件系统检索的。如果需要以有序的顺序处理文件,您可能希望执行此操作。预先排序是在消费者开始过滤之前执行,并接受 Camel 进行处理的文件。这个选项为 default=false 表示禁用。

false

布尔值

recursive (consumer)

如果某个目录也会在所有子目录中查找文件。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

directoryMustExist (consumer)

与 startDirectoryMustExist 类似,但这在轮询递归子目录期间应用。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

extendedAttributes (consumer)

定义感兴趣的文件属性。例如 posix:permissions,posix:owner,basic:lastAccessTime,它支持基本的通配符,如 posix:, basic:lastAccessTime

 

字符串

inProgressRepository (consumer)

可插拔插入存储库 org.apache.camel.spi.IdempotentRepository。in-progress 存储库用于考虑当前正在使用的进程文件中。默认情况下会使用基于内存的存储库。

 

IdempotentRepository

localWorkDirectory (consumer)

消耗时,可以使用本地工作目录直接将远程文件内容存储在本地文件中,以避免将内容加载到内存中。这在您消耗非常大的远程文件时很有用,因此可以节省内存。

 

字符串

onCompletionException Handler (consumer)

使用自定义 org.apache.camel.spi.ExceptionHandler 处理在完成过程中文件的异常,以处理使用者在完成过程中进行的提交或回滚。默认实现会将任何异常记录在 WARN 级别,并忽略。

 

ExceptionHandler

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。换句话说,在轮询信息时发生错误,对文件网络的实例访问失败,因此 Camel 无法访问该文件扫描文件。默认实现会将导致的异常记录在 WARN 级别,并忽略它。

 

PollingConsumerPoll Strategy

probeContentType (consumer)

是否启用内容类型的探测。如果启用,则使用者使用 Files#probeContentType (java.nio.file.Path)来确定该文件的内容类型,并将它存储为在 Message 上带有键 Exchange#FILE_CONTENT_TYPE 的标头。

false

布尔值

processStrategy (consumer)

可插拔 org.apache.camel.component.file.GenericFileProcessStrategy 允许您实施自己的 readLock 选项或类似内容。在文件被消耗(如有特殊就绪文件)之前,还可使用特殊条件。如果设置了这个选项,则不会应用 readLock 选项。

 

GenericFileProcess Strategy

startingDirectoryMustExist (consumer)

启动目录是否必须存在。请注意,autoCreate 选项是默认的启用状态,这意味着如果起始目录不存在,通常会自动创建起始目录。您可以禁用 autoCreate 并启用它,以确保起始目录必须存在。如果目录不存在,将抛出异常。

false

布尔值

fileExist (producer)

如果文件已存在相同名称的文件,应该怎么办?覆盖(默认)替换现有文件。append - 将内容添加到现有文件中。fail - 引发 GenericFileOperationException,这表示已有的文件。ignore - 静默忽略问题且不覆盖现有文件,但假设一切正常。move - 选项需要使用同时配置 moveExisting 选项。选项 eagerDeleteTargetFile 可用于控制移动文件要做什么,并且已存在一个现有文件,否则会导致移动操作失败。Move 选项将在编写目标文件之前移动任何现有文件。TryRename 仅在使用 tempFileName 选项时才适用。这样,可以在不做任何检查的情况下,尝试将文件从临时名称重命名为实际名称。在某些文件系统中,这个检查可能会更快,特别是 FTP 服务器。

覆盖

GenericFileExist

flatten (producer)

flatten 用于扁平化文件名路径,以剥离任何前导路径,因此这仅仅是文件名。这样,您可以以递归方式使用子目录,但当您将这些文件写入单个目录中时。在制作者上,在制作者上将强制将设置 CamelFileName 标头中的任何文件名用于任何领先的路径。

false

布尔值

jailStartingDirectory (producer)

用于判断(限制)将文件写入起始目录(和子目录)。默认情况下,启用此项以允许 Camel 将文件写入外部目录(从该框更受保护)。您可以关闭此目的,允许将文件写入起始目录之外的目录,如父级或根文件夹。

true

布尔值

moveExisting (producer)

配置 fileExist=Move 时要使用的表达式(如文件语言)。要将文件移动到备份子目录中,只需输入备份。这个选项只支持以下文件语言令牌:file:name、file:name.ext、file:name.noext、file:onlyname、file:onlyname.noext、file:ext 和 file:parent。注意 file:parent 不受 FTP 组件支持,因为 FTP 组件只能将任何现有文件移到基于当前 dir 的相对目录中。

 

字符串

tempFileName (producer)

与 tempPrefix 选项相同,但可以为临时文件名命名提供更精细的控制,因为它使用文件语言。

 

字符串

tempPrefix (producer)

这个选项用于使用临时名称写入文件,然后在写入完成后将其重命名为真实名称。可用于识别正在写入的文件,并避免消费者(不使用专用读取锁定)读取进度文件。上传较大的文件时通常由 FTP 使用。

 

字符串

allowNullBody (producer)

用于指定在写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,如果设为 false,并且试图向文件组件发送 null 正文,则使用"Cannot将 null body 写入空正文到 file.' 的 GenericFileWriteException 的 GenericFileWriteException 来抛出。'如果将 fileExist 选项设置为 'Override',则文件将被截断,如果设置为 append,则文件将保持不变。

false

布尔值

chmod (producer)

指定由制作者发送的文件权限,chmod 值必须在 000 到 777 之间;如果是前导数字,我们将忽略它。

 

字符串

chmodDirectory (producer)

指定制作者创建缺少目录时使用的目录权限,chmod 值必须在 000 到 777 之间;如果是前导数字(如 0755),我们会忽略该目录。

 

字符串

eagerDeleteTargetFile (producer)

是否完全删除任何现有的目标文件。这个选项只适用于使用 fileExists=Override 和 tempFileName 选项。您可以使用它来禁用(将其设置为 false)在写入 temp 文件前删除目标文件。例如,您可以写入大文件,并且希望目标文件在正在写入时存在。这样可保证目标文件仅在最后一开始删除,而在 temp 文件被重命名为目标文件名之前。这个选项还用来控制是否在启用 fileExist=Move 时删除任何现有文件,并且存在现有文件。如果此选项 copyAndDeleteOnRenameFails false,则在存在现有文件(如果其 true)存在时,则会抛出异常(如果存在),那么在移动操作前会删除现有文件。

true

布尔值

forceWrites (producer)

是否强制对文件系统的同步写入。如果您不希望此等级保证,例如写入日志/审计日志等,您可以关闭此级别;这将会获得更好的性能。

true

布尔值

keepLastModified (producer)

将保留来自源文件(若有)的最后修改的时间戳。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或 long with timestamp。如果存在时间戳,并且启用 选项,它将对写入的文件设置此时间戳。注:此选项仅适用于文件制作者。您不能对任何 ftp 制作者使用这个选项。

false

布尔值

moveExistingFileStrategy (producer)

用于在配置 fileExist=Move 时移动带有特殊命名令牌的文件的策略(Custom 策略)。默认情况下,如果没有提供自定义策略,则使用实施

 

FileMoveExisting 策略

autoCreate (advanced)

在文件路径名称中自动创建缺失的目录。对于文件使用者,这意味着创建起始目录。对于文件制作者,这意味着文件应写入到其中的目录。

true

布尔值

bufferSize (advanced)

以字节为单位写入缓冲区大小。

131072

int

copyAndDeleteOnRenameFail (advanced)

如果文件无法直接重命名,则是否要回退和删除文件。这个选项不适用于 FTP 组件。

true

布尔值

renameUsingCopy (advanced)

使用 copy 和 delete 策略执行重命名操作。这主要用于常规重命名操作不可靠(例如跨不同文件系统或网络)的环境。这个选项优先于 copyAndDeleteOnRenameFail 参数,该参数将自动回退到 copy 和 delete 策略,但仅在延迟后才会回退。

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

antExclude (filter)

Ant 样式过滤器排除.如果使用 antInclude 和 antExclude,则 antExclude 优先于 antInclude。可以用逗号分隔的格式指定多个排除项。

 

字符串

antFilterCaseSensitive (filter)

在 at 过滤器中设置区分大小写的标记

true

布尔值

antInclude (filter)

Ant 风格过滤器包含.可以用逗号分隔的格式指定多个包含。

 

字符串

eagerMaxMessagesPerPoll (filter)

允许控制 maxMessagesPerPoll 的限制是预先控制。如果预先考虑,则限制会在扫描文件期间进行。如果为 false,则扫描所有文件,然后执行排序。将此选项设置为 false 可首先对所有文件进行排序,然后限制轮询。请注意,这需要较高的内存用量,因为所有文件详细信息都位于内存中来执行排序。

true

布尔值

exclude (filter)

如果文件名与 regex 模式匹配,则使用 排除文件(匹配是 in-senstive)。请注意,如果将这个符号配置为端点 uri,则需要使用 RAW ()语法等符号(如加号)进行配置。有关配置端点 uris 时的详情,请参阅

 

字符串

filter (filter)

可插入的过滤器作为 org.apache.camel.component.file.GenericFileFilter 类。如果过滤器在其 accept ()方法中返回 false,则将跳过文件。

 

GenericFileFilter

filterDirectory (filter)

根据简单语言过滤目录。例如,要过滤当前日期,您可以使用一个简单的日期模式,如 $date:now:yyyMMdd

 

字符串

filterFile (filter)

根据简单语言过滤文件。例如,要根据文件大小进行过滤,可以使用 $file:size 5000

 

字符串

idempotent (filter)

使用 Idempotent Consumer EIP 模式的选项允许 Camel 跳过已处理的文件。默认情况下,将使用包含 1000 条目的基于内存的 LRUCache。如果 noop=true 之后,将启用幂等性,以避免再次消耗相同的文件。

false

布尔值

idempotentKey (filter)

使用自定义幂等密钥。默认情况下,使用文件的绝对路径。您可以使用文件语言(例如,使用文件名和文件大小),您可以完成: idempotentKey=$file:name-$file:size

 

字符串

idempotentRepository (filter)

可插拔存储库 org.apache.camel.spi.IdempotentRepository,如果未指定,则默认使用 MemoryMessageIdRepository,并且幂等为 true。

 

IdempotentRepository

include (filter)

如果文件名与 regex 模式匹配,则用于包含文件(匹配区分大小写)。请注意,如果将这个符号配置为端点 uri,则需要使用 RAW ()语法等符号(如加号)进行配置。有关配置端点 uris 时的详情,请参阅

 

字符串

maxDepth (filter)

递归处理目录时要遍历的最大深度。

2147483647

int

maxMessagesPerPoll (filter)

定义要为每个轮询收集的最大消息。默认情况下没有设置最大值。可用于设置 e.g. 1000 的限制,以避免在启动存在数千台服务器时。将值设为 0 或负数设为 disabled。注意:如果使用这个选项正在使用,则文件和 FTP 组件将在任何排序前限制。例如,如果您有 100000 文件并使用 maxMessagesPerPoll=500,则只会提取前 500 个文件,然后排序。您可以使用 eagerMaxMessagesPerPoll 选项,将其设置为 false,以允许首先扫描所有文件,然后再排序。

 

int

minDepth (filter)

递归处理目录时开始处理的最小深度信息。使用 minDepth=1 意味着基础目录。使用 minDepth=2 表示第一个子目录。

 

int

Move (filter)

表达式(如简单语言),用于在处理后动态设置文件名。要将文件移动到 .done 子目录中,只需输入 .done。

 

字符串

exclusiveReadLockStrategy (lock)

可插拔 read-lock 作为 org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy 实施。

 

GenericFileExclusive ReadLockStrategy

readLock (lock)

供使用者使用,仅当文件具有独占的 read-lock 时(例如,该文件没有处于-progres 或被写入时)轮询文件。Camel 将等待文件锁定。此选项以策略形式提供构建:无 - 无读取锁定在使用 markerFile - Camel 创建一个标志文件(fileName.camelLock),然后保存锁定。FTP 组件更改的这个选项 - 更改使用文件长度/修改时间戳来检测当前正在复制的文件。将至少使用 1 sec 来确定这一点,因此此选项无法像其他形式使用文件一样迅速使用,但由于 JDK IO API 无法始终确定文件当前是否正在被另一个进程使用。选项 readLockCheckInterval 可用于设置检查频率。fileLock - 用于使用 java.nio.channels.FileLock。这个选项不适用于 FTP 组件。在通过 mount/share 访问远程文件系统时,应该避免这种方法,除非文件系统支持分布式文件锁定。重命名 - 使用重命名文件作为测试,如果我们可以获得独占的 read-lock。幂等 - (对于文件组件)幂等的幂等性是使用 idempotentRepository 作为 read-lock 的 read-lock。这允许在幂等存储库实现支持集群时使用读取锁定,该锁定支持集群。幂等更改 - (对于文件组件)使用 idempotentRepository,并随着合并的 read-lock 改变。这允许使用支持集群的读取锁定,如果幂等存储库实施支持集群。幂等-rename - ( file 组件)幂等-rename 使用 idempotentRepository 并将 重命名为 combined read-lock。这允许在幂等存储库实现支持的情况下使用支持集群的读取锁定。注意:各种读取锁定不适用于在集群模式下工作,不同节点上的并发用户对共享文件系统上的相同文件都竞争。使用接近 atomic 操作来创建空的标志文件,但它无法保证在集群中工作。fileLock 可以更好地工作,但文件系统需要支持分布式文件锁定,以此类推。如果幂等存储库支持集群(如 Hazelcast 组件或 Infinispan),则使用幂等的读取锁定可以支持集群。

none

字符串

readLockCheckInterval (lock)

read-lock 的间隔(如果被读取锁定支持)。这个间隔用于在尝试获取读取锁定间进行睡眠状态。例如,在使用 changed 的 read lock 时,您可以将更高的间隔周期设置为 cater 以慢速写入。如果制作者非常慢,写入文件,则默认为 1 sec.。注意:对于 FTP 默认 readLockCheckInterval 为 5000。readLockTimeout 值必须大于 readLockCheckInterval,但经验规则至少为 2 个或更多或更多为 readLockCheckInterval。这需要确保读取锁定进程允许修改时间尝试在超时达到前获取锁。

1000

long

readLockDeleteOrphanLock Files (lock)

如果 Camel 未正确关闭,则启动时是否应该在启动时使用标志文件读取锁定文件来读取锁定文件(如 JVM 崩溃)。如果将此选项转换为 false,则任何孤立的锁定文件将导致 Camel 无法启动该文件,这可能是因为另一个节点同时从同一共享目录中读取文件。

true

布尔值

readLockIdempotentRelease Async (lock)

延迟发行版本任务应该是同步还是异步。请参阅 readLockIdempotentReleaseDelay 选项的详情。

false

布尔值

readLockIdempotentRelease AsyncPoolSize (lock)

使用异步发行任务时调度线程池中的线程数量。使用默认 1 个核心线程几乎应该已经足够了,只有更新幂等存储库或需要处理大量文件时,它才会将其设置为更高的值。如果您通过配置 readLockIdempotentReleaseExecutorService 选项,则使用这个选项。请参阅 readLockIdempotentReleaseDelay 选项的详情。

 

int

readLockIdempotentRelease Delay (lock)

是否延迟发布任务在millis 的期间。在带有共享幂等库的主动/主动集群场景中使用共享幂等存储库来确保其他节点无法扫描和获取同一文件,这可用于延迟发行任务以扩展窗口。通过扩展发行任务的 time-window 有助于防止这些情况。只有在将 readLockRemoveOnCommit 配置为 true 时,才需要注意延迟。

 

int

readLockIdempotentRelease ExecutorService (lock)

要将自定义和共享线程池用于异步发行任务。请参阅 readLockIdempotentReleaseDelay 选项的详情。

 

ScheduledExecutor 服务

readLockLoggingLevel (lock)

无法获取读取锁定时使用的日志记录级别。默认情况下记录 WARN。您可以更改此级别,例如,变为 OFF 以没有任何日志。这个选项仅适用于 readLock 类型的 readLock: changed、fileLock、幂等、幂等更改、幂等名称、重命名。

DEBUG

LoggingLevel

readLockMarkerFile (lock)

是否使用带 changed、重命名或专用读锁定类型的标记文件。默认情况下,也可使用标志文件来保护其他进程的获取相同的文件。可以通过将此选项设置为 false 来关闭此行为。例如,如果您不想将标记文件写入 Camel 应用程序的文件系统。

true

布尔值

readLockMinAge (lock)

此选项仅适用于 readLock=changed。它允许在尝试获取读取锁定前指定文件的最短期限。例如,使用 readLockMinAge=300s 来要求文件最多 5 分钟。这可能会加快更改的读取锁定,因为它只会试图获取至少是给定期限的文件。

0

long

readLockMinLength (lock)

此选项仅适用于 readLock=changed。它允许您配置最小长度。默认情况下,Camel 预期文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度的文件。

1

long

readLockRemoveOnCommit (lock)

此选项仅适用于 readLock=idempotent。它允许您指定在处理文件成功并且提交发生时是否从幂等存储库中删除文件名条目。默认情况下,该文件不会被删除,以确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可能会支持驱除策略,您可以配置在 X 分钟后驱除文件名条目 - 这可确保出现竞争条件的问题。请参阅 readLockIdempotentReleaseDelay 选项的详情。

false

布尔值

readLockRemoveOnRollback (lock)

此选项仅适用于 readLock=idempotent。它允许您指定在处理文件失败时是否从幂等存储库中删除文件名条目,并进行回滚。如果此选项为 false,则文件名条目已确认(如同文件提交一样)。

true

布尔值

readLockTimeout (lock)

如果 read-lock 支持,则 millis 中的可选超时。如果无法授予 read-lock 且触发超时,则 Camel 将跳过该文件。下次轮询 Camel 时,将重试文件,此时可能会授予 read-lock。使用 0 或 lower 值来永久指示。目前,fileLock,更改并重命名支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000,而不是 10000。readLockTimeout 值必须大于 readLockCheckInterval,但经验规则至少为 2 个或更多或更多为 readLockCheckInterval。这需要确保读取锁定进程允许修改时间尝试在超时达到前获取锁。

10000

long

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。默认值为 500。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。默认值为 1000。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。此选项允许您在多个消费者之间共享线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

允许插入自定义 org.apache.camel.spi.ScheduledPollConsumerScheduler,以在轮询消费者运行时用作触发的调度程序。默认实施使用 ScheduledExecutorService,它有一个 Quartz2 和 Spring,它支持 CRON 表达式。注意:如果使用自定义调度程序,那么 initialDelay 的选项可以使用FixedDelay、timeUnit 和 scheduledExecutorService。使用文本 quartz2 引用使用 Quartz2 调度程序;并使用文本 spring 基于 Spring;并使用文本 #myScheduler 来指代 registry 中的自定义调度程序。如需示例,请参阅 Quartz2 页面。

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

shuffle (sort)

要取消文件列表(以随机顺序排序)

false

布尔值

sortBy (sort)

内置使用文件语言排序.支持嵌套的排序,因此您可以按文件名排序,并根据修改日期进行排序。

 

字符串

排序 器(排序)

可插拔排序器作为 java.util.Comparator 类。

 

比较器

提示

文件制作者的默认行为 默认将覆盖任何现有文件(如果名称相同)。

104.3. 移动和删除操作

所有移动或删除操作都会在(post 命令)完成后执行;因此在处理 Exchange 时,该文件仍然位于 inbox 文件夹中。

我们通过示例进行演示:

from("file://inbox?move=.done").to("bean:handleOrder");

当在 inbox 文件夹中丢弃文件时,文件使用者会注意到这个文件并创建一个新的 FileExchange,它被路由到 handleOrder bean。然后,an 会处理 File 对象。此时,该文件仍位于 inbox 文件夹中。当 bean 完成后,因此路由已完成,文件使用者将执行移动操作并将文件移动到 .done 子文件夹。

移动和 preMove 选项被视为目录名称(尽管如果您使用了一个表达式,如文件 语言,或 简单 ),则表达式评估的结果是要使用的文件名 - 如您设置时

move=../backup/copy-of-${file:name}

然后,使用使用的文件 语言 返回要使用的文件名,可以是相对或绝对的。如果相对,目录会在使用该文件的文件夹内作为子文件夹创建。

默认情况下,Camel 将消耗的文件移动到相对于使用该文件的目录的 .camel 子文件夹。

如果要在处理后删除文件,则路由应该是:

from("file://inobox?delete=true").to("bean:handleOrder");

我们介绍了 处理文件 移动操作。这可让您在处理前标记哪些文件已经扫描到这个子文件夹。

from("file://inbox?preMove=inprogress").to("bean:handleOrder");

您可以组合 移动和常规移动:

from("file://inbox?preMove=inprogress&move=.done").to("bean:handleOrder");

因此,在处理后文件位于 in progres 文件夹中,它被移到 .done 文件夹。

104.4. 对移动和 PreMove 选项进行精细控制

移动和 preMove 选项是基于 Expression,因此,我们有 文件语言 的完整功能,可用于执行目录和名称模式的高级配置。
实际上,Camel 将会内部将您输入的目录名称转换为 文件语言 表达式。因此,当进入 move=.done Camel 时,它会将它转换为 :${file:parent}/.done/${'file:onlyname}。只有在 Camel 检测到您没有提供选项值的 $\{ } 时,才能执行此操作。因此,当您输入 $\{ } Camel 时,将不会 转换它,因此您有完整的电源。

因此,如果我们希望将文件移至备份文件夹中,现在日期为模式,我们可以实现:

move=backup/${date:now:yyyyMMdd}/${file:name}

104.5. 关于 moveFailed

moveFailed 选项允许您 将无法处理的文件 移动到另一个位置,例如您选择的错误文件夹。例如,要将错误文件夹中的文件移至时间戳,您可以使用 moveFailed=/error/${file:name.noext}-${date:now:yyyyddHHmmssSSS}.${'file:ext}.

在文件 语言查看更多示例

104.6. 消息标头

此组件支持以下标头:

104.6.1. 仅文件制作者

标头描述

CamelFileName

指定要写入的文件的名称(相对于端点目录)。这个名称可以是 String ; 一个带有 文件语言简单 表达式的字符串;或 Expression 对象。如果它是空的,则 Camel 将根据消息唯一 ID 自动生成文件名。

CamelFileNameProduced

写入的输出文件的实际绝对文件路径(路径 + 名称)。Camel 设定此标头,其用途是为最终用户提供所写入的文件的名称。

CamelOverruleFileName

Camel 2.11: 用于过量使用 CamelFileName 标头并使用值(但仅一次,因为生产者在写入文件后将删除此标头)。该值只能是一个字符串。请注意,如果已配置了选项 fileName,那么这仍在评估。

104.6.2. 仅文件消费者

标头描述

CamelFileName

将所消耗的文件的名称为相对文件路径,其偏移来自端点上配置的起始目录。

CamelFileNameOnly

仅文件名(没有前导路径的名称)。

CamelFileAbsolute

布尔值 选项指定消耗的文件是否表示绝对路径。通常,对于相对路径,通常应为 false。通常不应该使用绝对路径,但添加到 move 选项中,以允许将文件移动到绝对路径。但也可在其他位置使用。

CamelFileAbsolutePath

文件的绝对路径。对于此路径覆盖的相对文件,而是保存相对路径。

CamelFilePath

文件路径。对于相对文件,这是起始目录 + 相对文件名。对于绝对文件,这是绝对路径。

CamelFileRelativePath

相对路径.

CamelFileParent

父路径。

CamelFileLength

包含文件大小 的长 值。

CamelFileLastModified

包含最近修改文件时间戳的 值。在 Camel 2.10.3 中,旧的 类型为 日期

104.7. 批处理消费者

此组件实施 Batch Consumer。

104.8. Exchange Properties,仅文件使用者

由于文件使用者实施 BatchConsumer,它支持对其轮询的文件进行批处理。通过批量,我们意味着 Camel 向 Exchange 添加以下额外属性,因此您知道轮询的文件数量、当前索引以及批处理是否已完成。

属性描述

CamelBatchSize

在此批处理中轮询文件总数。

CamelBatchIndex

批处理的当前索引。从 0 开始。

CamelBatchComplete

代表批处理中最后一个 Exchange 的布尔值。最后一个条目仅适用于 true

这样,您可以让实例知道此批处理中有多少文件,而实例则让 Aggregator2 聚合了这一数量的文件。

104.9. 使用 charset

根据 Camel 2.9.3
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 格式的字节数组。然后,让我们处理数据。使用当前的 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 进行文件。
例如,以下路由将记录以下内容:

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

104.10. 文件夹和文件名的通用查找

当 Camel 生成文件时(写入文件)会产生几个影响如何设置您选择的文件名。默认情况下,Camel 将使用消息 ID 作为文件名,因为消息 ID 通常是唯一生成的 ID,因此您将以文件名结尾,例如: ID-MACHINENAME-2443-1211718892437-1-0。如果不需要此类文件名,则必须在 CamelFileName 邮件标头中提供文件名。也可以使用恒定的 Exchange.FILE_NAME

以下示例代码使用消息 ID 作为文件名生成文件:

from("direct:report").to("file:target/reports");

使用 report.txt 作为您必须进行的文件名:

from("direct:report").setHeader(Exchange.FILE_NAME, constant("report.txt")).to( "file:target/reports");
  1. 与以上名称相同,但使用 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");

104.11. 文件名表达式

可以使用 expression 选项或 Camel FileName 标头中的基于字符串的文件语言 表达式来设置文件名。有关语法和示例,请查看 文件语言

104.12. 从其他直接丢弃文件的文件夹消耗文件

如果您消耗其他应用程序将文件直接写入文件的文件夹,请留意。查看不同的 readLock 选项,以了解您的用例适合哪些内容。最好的方法是写入另一个文件夹,在写入移动 drop 文件夹中的文件后进行写入。但是,如果您直接向 drop 文件夹写入文件,则更改选项可能会更好地检测文件当前正在写入/复制的文件,因为它使用更改的算法来查看文件大小/修改在一段时间内是否更改。其他 readLock 选项依赖于 Java 文件 API,这些 API 在检测到此问题时并不总是更好。您可能还想查看 doneFileName 选项,该选项在文件完成并准备好被消耗时,使用标志文件(done 文件)来信号。

104.13. 使用完成文件

可作为 Camel 2.6 使用。

另请参阅以下 编写完成文件 的章节。

如果您只想在文件存在时消耗文件,那么您可以在端点上使用 doneFileName 选项。

from("file:bar?doneFileName=done");

如果与目标文件位于同一目录中,则将仅消耗来自 bar 文件夹中的文件。消耗文件后,Camel 将自动删除已完成的文件。从 Camel 2.9.3 开始,如果配置了 noop=true,则 Camel 不会自动删除 已完成的文件

但是,每个目标文件有一个 已完成的文件 更为常见。这意味着有 1:1 相关性。要做到这一点,您必须在 doneFileName 选项中使用动态占位符。目前,Camel 支持以下两个动态令牌: file:namefile:name.noext,它必须用 $\{ } 括起。使用者仅支持 实现 的文件名的静态部分作为前缀或后缀(不是两者)。

from("file:bar?doneFileName=${file:name}.done");

在本示例中,只有 名称文件名为.done 时,才会对文件进行轮询。例如:

  • hello.txt - 是要消耗的文件
  • hello.txt.done - 是关联的完成文件

您还可以为已完成的文件使用前缀,例如:

from("file:bar?doneFileName=ready-${file:name}");
  • hello.txt - 是要消耗的文件
  • ready-hello.txt - 是关联的完成文件

104.14. 编写完成的文件

可作为 Camel 2.6 使用。

编写了某个文件后,您可能想以一种标志形式编写额外的 文件,以指明文件已完成并已写入的其他人。为此,您可以使用文件制作者端点上的 doneFileName 选项。

.to("file:bar?doneFileName=done");

简单地在与目标 文件相同的 目录中创建名为 的文件。

但是,每个目标文件有一个已完成的文件更为常见。这意味着有 1:1 相关性。要做到这一点,您必须在 doneFileName 选项中使用动态占位符。目前,Camel 支持以下两个动态令牌: file:namefile:name.noext,它必须用 $\{ } 括起。

.to("file:bar?doneFileName=done-${file:name}");

如果目标文件与目标文件位于同一目录中,将创建一个名为 done- foo.txt 的文件。

.to("file:bar?doneFileName=${file:name}.done");

如果目标文件与目标文件位于同一目录中,将创建一个名为 foo.txt.done 的文件。

.to("file:bar?doneFileName=${file:name.noext}.done");

如果目标文件与目标文件在同一目录中,将创建一个名为 foo. done 的文件。

104.15. Samples

#=== 从目录中读取并写入另一个目录

from("file://inputdir/?delete=true").to("file://outputdir")

104.15.1. 从目录读取并使用规则动态名称写入另一个目录

from("file://inputdir/?delete=true").to("file://outputdir?overruleFile=copy-of-${file:name}")

侦听目录,并为每个文件创建一个消息。将内容复制到 outputdir,再删除 输入dir 中的 文件。

104.15.2. 以递归方式从目录读取并写入另一个

from("file://inputdir/?recursive=true&delete=true").to("file://outputdir")

侦听目录,并为每个文件创建一个消息。将内容复制到 outputdir,再删除 输入dir 中的 文件。将递归地扫描到子目录。将把文件放置在与 输入 dir 相同的目录结构中,包括任何子目录。

inputdir/foo.txt
inputdir/sub/bar.txt

将生成以下输出布局:

outputdir/foo.txt
outputdir/sub/bar.txt

104.16. 使用 flatten

如果要将文件存储在同一目录中的 outputdir 目录中,忽略源目录布局(例如,要扁平化路径),只需在制作者端添加 flatten=true 选项:

from("file://inputdir/?recursive=true&delete=true").to("file://outputdir?flatten=true")

将生成以下输出布局:

outputdir/foo.txt
outputdir/bar.txt

104.17. 从目录和默认移动操作读取

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

104.18. 从目录读取并处理 java 中的消息

from("file://inputdir/").process(new Processor() {
  public void process(Exchange exchange) throws Exception {
    Object body = exchange.getIn().getBody();
    // do some business logic with the input body
  }
});

正文将是一个 文件对象,指向刚进入 inputdir 目录的文件。

104.19. 写入文件

Camel 还可以编写文件,例如生成文件。在下面的示例中,我们收到一些有关在将进程写入目录之前处理的 SEDA 队列的报告。

104.19.1. 使用 Exchange.FILE_NAME写入子目录

使用单一路由时,可以将文件写入任意数量的子目录。如果您有路由设置,例如:

<route>
  <from uri="bean:myBean"/>
  <to uri="file:/rootDirectory"/>
</route>

您可以将标头 Exchange.FILE_NAME 设置为值,例如:

Exchange.FILE_NAME = hello.txt => /rootDirectory/hello.txt
Exchange.FILE_NAME = foo/bye.txt => /rootDirectory/foo/bye.txt

这样,您可以有一个路由来将文件写入多个目的地。

104.19.2. 通过相对于最终目的地的临时目录写入文件

有些时候,您需要将文件临时写入相对于目标目录的某些目录。当从您写入的目录中读取具有有限过滤功能的一些外部进程时,通常会发生这种情况。在以下示例中,文件将写入 /var/myapp/filesInProgress 目录,在数据传输完成后,它们将以原子方式移至' /var/myapp/finalDirectory 'directory。

from("direct:start").
  to("file:///var/myapp/finalDirectory?tempPrefix=/../filesInProgress/");

104.20. 将表达式用于文件名

在本例中,我们想将消耗的文件移至备份文件夹作为子文件夹名称:

from("file://inbox?move=backup/${date:now:yyyyMMdd}/${file:name}").to("...");

有关更多示例,请参阅 文件语言

104.21. 避免多次读取同一文件(幂等使用者)

Camel 直接在组件内支持 Idempotent Consumer,以便它跳过已处理的文件。这个功能可以通过设置 idempotent=true 选项来启用。

from("file://inbox?idempotent=true").to("...");

Camel 使用绝对文件名作为幂等密钥来检测重复的文件。从 Camel 2.11 开始,您可以使用 idempotentKey 选项中的表达式自定义此密钥。例如,使用名称和文件大小作为密钥

<route>
  <from uri="file://inbox?idempotent=true&amp;idempotentKey=${file:name}-${file:size}"/>
  <to uri="bean:processInbox"/>
</route>

默认情况下,Camel 使用基于内存的存储来跟踪消耗的文件,它使用了最接近 1000 条目的最近使用缓存。您可以使用值中的 # 符号来 插入 这个存储您自己的实现,以指示它在 registry 中使用指定的 id 引用 Bean。

 <!-- define our store as a plain spring bean -->
 <bean id="myStore" class="com.mycompany.MyIdempotentStore"/>

<route>
  <from uri="file://inbox?idempotent=true&amp;idempotentRepository=#myStore"/>
  <to uri="bean:processInbox"/>
</route>

如果因为之前已消耗了文件,Camel 会记录 DEBUG 级别的日志:

DEBUG FileConsumer is idempotent and the file has been consumed before. Will skip this file: target\idempotent\report.txt

104.22. 使用基于文件的幂等存储库

在本节中,我们将使用基于文件的幂等存储库 org.apache.camel.processor.idempotent.FileIdempotentRepository 而不是使用用作 default 的内存中。
此仓库使用 1 级别的缓存以避免读取文件存储库。它只使用文件存储库来存储 1 级别的缓存的内容。因此,存储库可以在服务器重启后保留。它将在启动时将文件的内容加载到 1st 级别缓存中。文件结构非常简单,因为它将密钥存储在文件中的独立行中。默认情况下,文件存储的大小限制为 1mb。当文件增长较大的 Camel 将截断文件存储时,通过将 1st 级别缓存清空到新的空文件来重建内容。

我们使用 Spring XML 配置我们的存储库,创建文件幂等存储库,并使用 # 符号将我们的存储库与 idempotentRepository 搭配使用,以表示 Registry 查找:

104.23. 使用基于 JPA 的幂等存储库

在本节中,我们将使用基于 JPA 的幂等存储库,而不使用默认使用的内存中。

首先,我们需要将 META-INF/persistence.xml 中的 persistence-unit 使用类 org.apache.camel.processor.idempotent.jpa.MessageProcessed 作为模型。

<persistence-unit name="idempotentDb" transaction-type="RESOURCE_LOCAL">
  <class>org.apache.camel.processor.idempotent.jpa.MessageProcessed</class>

  <properties>
    <property name="openjpa.ConnectionURL" value="jdbc:derby:target/idempotentTest;create=true"/>
    <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
    <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
    <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
    <property name="openjpa.Multithreaded" value="true"/>
  </properties>
</persistence-unit>

接下来,我们也可以在 spring XML 文件中创建 JPA 幂等存储库:

<!-- we define our jpa based idempotent repository we want to use in the file consumer -->
<bean id="jpaStore" class="org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository">
    <!-- Here we refer to the entityManagerFactory -->
    <constructor-arg index="0" ref="entityManagerFactory"/>
    <!-- This 2nd parameter is the name  (= a category name).
         You can have different repositories with different names -->
    <constructor-arg index="1" value="FileConsumer"/>
</bean>

然后,我们只需使用 # 语法选项使用 idempotentRepository 来引用文件消费者端点中的 jpaStore bean:

<route>
  <from uri="file://inbox?idempotent=true&amp;idempotentRepository=#jpaStore"/>
  <to uri="bean:processInbox"/>
</route>

104.24. Filter using org.apache.camel.component.file.GenericFileFilter

Camel 支持可插拔过滤策略。然后,您可以使用这样的过滤器配置端点,以跳过正在处理的特定文件。

在示例中,我们构建了自己的过滤器,用于在文件名中跳过以 skip 开头的文件:

然后,我们可以使用 filter 属性配置我们的路由,以引用我们在 spring XML 文件中定义的过滤器(使用 # 表示法):

<!-- define our filter as a plain spring bean -->
<bean id="myFilter" class="com.mycompany.MyFileFilter"/>

<route>
  <from uri="file://inbox?filter=#myFilter"/>
  <to uri="bean:processInbox"/>
</route>

104.25. 使用 ANT 路径匹配器过滤

ANT 路径匹配器在 camel-spring jar 中提供。因此,如果您使用 Maven,您需要依赖于 camel-spring
其原因在于,我们利用 Spring 的 AntPathMatcher 进行实际匹配。

文件路径与以下规则匹配:

  • ? 匹配一个字符
  • * 匹配零或更多字符
  • ** 匹配路径中的零或更多目录
提示

现在,Camel 2.10 的新选项为 atInclude ,AtExclude 选项方便指定 ANT 风格 include/exclude,而无需定义过滤器。如需更多信息,请参阅上面的 URI 选项。

以下示例演示了如何使用它:

104.25.1. 使用 Comparator 的排序

Camel 支持可插拔排序策略。此策略使用 Java 中的 java.util.Comparator 中的构建。然后,您可以使用此类比较器配置端点,并让 Camel 在处理前对文件进行排序。

在示例中,我们构建了我们自己的比较器,它根据文件名排序:

然后,我们可以使用 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 选项可以使用上述 Spring DSL 路由中的 # 语法 引用 Bean,通过加上 # 来指代注册表中的 Bean。因此,写 sorter=#mySorter 将指示 Camel 在 Registry 中查找 ID 为 mySorter 的 Bean。

104.25.2. 使用 sortBy 的排序

Camel 支持可插拔排序策略。此策略使用文件 语言 配置排序。sortBy 选项配置如下:

sortBy=group 1;group 2;group 3;...

其中,每个组使用半冒号隔开。在只使用一个组的简单情况下,一个简单的示例可以是:

sortBy=file:name

这将按文件名排序,按前缀反向来 反转顺序: 到组,因此排序现在为 Z.A:

sortBy=reverse:file:name

正如我们有完整的 文件语言,我们可以使用某些其他参数,因此,如果我们需要按我们所做的文件大小排序:

sortBy=file:length

您可以将 配置为在字符串比较中使用 ignoreCase: 来忽略大小写,因此,如果要使用文件名排序,但要忽略这种情况,那么我们将:

sortBy=ignoreCase:file:name

您可以组合忽略的大小写和反向,但必须首先指定反向:

sortBy=reverse:ignoreCase:file:name

在以下示例中,我们要按最后修改的文件排序,因此我们:

sortBy=file:modified

然后,我们希望按名称作为第 2 个选项分组,这样,具有相同 modifcation 的文件按名称排序:

sortBy=file:modified;file:name

在这里,您能否发现问题?修改后的文件时间戳太大,不像毫秒一样,如果我们只想按日期排序,则按名称排序,那么将怎么办?
此外,我们拥有强大的 文件语言 功能,我们可以使用支持模式的日期命令。这样可以通过以下方式解决:

sortBy=date:file:yyyyMMdd;file:name

是的,这很强大,oh 是由每个组也可以使用反转的方式强大,因此我们可以撤销文件名:

sortBy=date:file:yyyyMMdd;reverse:file:name

104.26. Using GenericFileProcessStrategy

选项 processStrategy 可用于使用自定义 GenericFileProcessStrategy,它允许您实施自己的 开始提交和 回滚 逻辑。
例如,可假定系统在应消耗的文件夹中写入一个文件。但是,您不应该在写入另一个 就绪 文件之前,也不应开始消耗该文件。

因此,通过实施我们自己的 GenericFileProcessStrategy,可通过以下方式实现:

  • begin () 方法中,我们可以测试是否存在特殊 就绪 文件。begin 方法返回一个 布尔值,以指示我们可以使用该文件。
  • abort () 方法(Camel 2.10)中,可在开始操作返回 false 时执行特殊逻辑,例如用于清理资源等。
  • commit () 方法中,我们可以移动实际文件并同时删除 可用的 文件。

104.27. 使用过滤器

您可以通过实施 org.apache.camel.component.file.GenericFileFilter 接口,在 Java 代码中实施自定义 过滤器。此接口具有可返回布尔值的 accept 方法。返回到 true,使其包含文件,false 跳过该文件。从 Camel 2.10 开始,存在 GenericFile 中的 GenericFile 方法,该文件是目录。这可让您过滤不需要的目录,以避免出现不需要的目录。

例如,要跳过名称中以 "skip" 开头的目录,可按照如下所示实施:

104.28. 使用 consumer.bridgeErrorHandler

可从 Camel 2.10 开始

如果要使用 Camel Error Handler 处理文件使用者中出现的任何异常,您可以启用 consumer.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?consumer.bridgeErrorHandler=true")
    .convertBodyTo(String.class)
    .to("mock:result");

因此,您必须启用此选项,路由中的错误处理程序都将从那里获取。

重要

使用 consumer.bridgeErrorHandler 时很重要,在使用 consumer.bridgeErrorHandler 时,拦截器不会应用。Exchange 直接由 Camel Error Handler 处理,不允许在Completion 处理之前的操作,如拦截器。

104.29. 调试日志记录

此组件具有日志级别 TRACE,如果您遇到问题,会很有帮助。

104.30. 另请参阅

第 105 章 文件语言

可作为 Camel 版本 1.1 提供

INFO:*File 语言现在与简单语言*从 Camel 2.2 合并,该文件语言现在使用 简单 语言进行合并,这意味着您可以在简单语言中直接使用所有文件语法。

文件表达式语言是对 简单 语言的扩展,添加与文件相关的功能。这些功能与使用文件路径和名称的常见用例相关。目标是允许表达式与文件和 FTP 组件一起使用,以便为使用者和制作者设置动态文件模式。

105.1. 文件语言选项

文件语言支持 2 选项,如下所示。

名称默认Java 类型描述

resultType

 

字符串

设置结果类型的类名称(从输出中输入)

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

105.2. 语法

这个语言是对 简单 语言 的扩展,因此也应用 简单 语法。因此,下表仅列出了附加值。
简单 语言 文件语言 还支持 Constant 表达式,因此您可以输入固定的文件名。

所有文件令牌都使用与 java.io.File 对象上方法相同的表达式名称,如 instance file:absolute 代表 java.io.File.getAbsolute() 方法。请注意,当前 Exchange 支持不是所有表达式。例如,FTP 组件支持某些选项,因为文件组件支持它们。

表达式类型file Consumerfile ProducerFTP ConsumerFTP Producer描述

file:name

字符串

代表文件名(相对于起始目录,请参阅下面的备注)

file:name.ext

字符串

Camel 2.3: 仅指文件扩展

file:name.ext.single

字符串

Camel 2.14.4/2.15.3: 是指文件扩展名。如果文件扩展名有 mutiple dots,则此表达式会剥离,并且仅返回最后一个部分。

file:name.noext

字符串

代表文件名没有扩展名(相对于起始目录,请参考下面的注释)

file:name.noext.single

字符串

Camel 2.14.4/2.15.3: 代表文件名没有扩展名(相对于起始目录,请参阅以下注释)。如果文件扩展具有多个点,则此表达式仅剥离最后一个部分,并保留其他内容。

file:onlyname

字符串

仅引用文件名,且无前导路径。

file:onlyname.noext

字符串

指唯一没有扩展名的文件名,且无前导路径。

file:onlyname.noext.single

字符串

*Camel 2.14.4/2.15.3:* 引用仅包括扩展且无前导路径的文件名。如果文件扩展具有多个点,则此表达式仅剥离最后一个部分,并保留其他内容。

file:ext

字符串

仅引用文件扩展

file:parent

字符串

代表文件父项

file:path

字符串

代表文件路径

file:absolute

布尔值

表示该文件是否被视为绝对还是相对

file:absolute.path

字符串

代表绝对文件路径

file:length

Long

将文件长度指定为长类型

file:size

Long

Camel 2.5: 引用以长类型返回的文件长度

file:modified

Date

代表上次修改为日期类型的文件

date:_command:pattern_

字符串

用于使用 java.text.SimpleDateFormat 模式的日期格式。是 简单 语言 的扩展。额外命令为: 文件 (仅消费者)用于文件最近修改的时间戳。注意:也可以使用 简单 语言中的所有命令。

105.3. 文件令牌示例

105.3.1. 相对路径

在以下 相对 目录中,我们有一个 java.io.File 处理 hello.txt 文件: .\filelanguage\test。我们会将端点配置为使用此起始目录 .\filelanguage。文件令牌将返回:

表达式返回

file:name

test\hello.txt

file:name.ext

txt

file:name.noext

test\hello

file:onlyname

hello.txt

file:onlyname.noext

您好

file:ext

txt

file:parent

filelanguage\test

file:path

filelanguage\test\hello.txt

file:absolute

false

file:absolute.path

\workspace\camel\camel-core\target\filelanguage\test\hello.txt

105.3.2. 绝对路径

在以下 绝对 目录中,我们有一个 java.io.File 处理 hello.txt 文件: \workspace\camel\camel-core\target\filelanguage\test。我们会将出端点配置为使用绝对起始目录 \workspace\camel\camel-core\target\filelanguage。文件令牌将返回:

表达式返回

file:name

test\hello.txt

file:name.ext

txt

file:name.noext

test\hello

file:onlyname

hello.txt

file:onlyname.noext

您好

file:ext

txt

file:parent

\workspace\camel\camel-core\target\filelanguage\test

file:path

\workspace\camel\camel-core\target\filelanguage\test\hello.txt

file:absolute

true

file:absolute.path

\workspace\camel\camel-core\target\filelanguage\test\hello.txt

105.4. Samples

您可以输入固定的 Constant 表达式,如 myfile.txt

fileName="myfile.txt"

我们假定我们使用文件使用者来读取文件,并希望将读取文件移至当前日期作为子文件夹的备份文件夹。这可以使用类似如下的表达式来建立:

fileName="backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"

相对文件夹名称也受支持,假设备份文件夹应当是同级文件夹,您可以附加 ...,如下所示:

fileName="../backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"

因为这是到 简单 语言的扩展,我们可以从这个语言访问所有好者,因此在这种情况下,我们希望将 in.header.type 用作动态表达式中的参数:

fileName="../backup/${date:now:yyyyMMdd}/type-${in.header.type}/backup-of-${file:name.noext}.bak"

如果您有要在表达式中使用的自定义日期,则 Camel 支持从邮件标头中检索日期。

fileName="orders/order-${in.header.customerId}-${date:in.header.orderDate:yyyyMMdd}.xml"

最后,我们还可以使用 bean 表达式调用 POJO 类,该类生成要使用的一些字符串输出(或转换为 String):

fileName="uniquefile-${bean:myguidgenerator.generateid}.txt"

所有课程都可以组合使用一种表达式,您可以在一个组合表达式中使用文件 语言简单Bean 语言。这对那些常见的文件路径模式来说非常强大。

105.5. 将 Spring PropertyPlaceholderConfigurer 与 File 组件一起使用

在 Camel 中,您可以直接从 简单 语言中使用文件语言,这样一来,在 Spring XML 中可以更轻松地使用基于文件扩展的操作,我们可以根据文件扩展进行路由,如下所示: ???

<from uri="file://input/orders"/>
   <choice>
     <when>
         <simple>${file:ext} == 'txt'</simple>
         <to uri="bean:orderService?method=handleTextFiles"/>
     </when>
     <when>
         <simple>${file:ext} == 'xml'</simple>
         <to uri="bean:orderService?method=handleXmlFiles"/>
     </when>
     <otherwise>
         <to uri="bean:orderService?method=handleOtherFiles"/>
     </otherwise>
  </choice>

如果您使用 File 端点上的 fileName 选项使用文件语言设置动态文件名,那么请确定您
使用其他语法(从 Camel 2.5 开始提供),以避免使用 Springs PropertyPlaceholderConfigurer 进行冲突。???

bundle-context.xml

<bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:bundle-context.cfg" />
</bean>

<bean id="sampleRoute" class="SampleRoute">
    <property name="fromEndpoint" value="${fromEndpoint}" />
    <property name="toEndpoint" value="${toEndpoint}" />
</bean>

bundle-context.cfg

fromEndpoint=activemq:queue:test
toEndpoint=file://fileRoute/out?fileName=test-$simple{date:now:yyyyMMdd}.txt

请注意,我们在上面的 toEndpoint 中使用 $simple\{ } 语法。
如果您没有这样做,则存在一个冲突,Spring 会抛出异常,如下所示

org.springframework.beans.factory.BeanDefinitionStoreException:
Invalid bean definition with name 'sampleRoute' defined in class path resource [bundle-context.xml]:
Could not resolve placeholder 'date:now:yyyyMMdd'

105.6. 依赖项

文件语言是 camel-core 的一部分。

第 106 章 Flatpack 组件

作为 Camel 版本 1.4 可用

Flatpack 组件支持固定宽度,并通过 FlatPack 库 来分隔文件解析。
注: 此组件只支持从扁平包文件到对象模型使用。您不能(yet)从对象模型写入扁平化格式。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-flatpack</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

106.1. URI 格式

flatpack:[delim|fixed]:flatPackConfig.pzmap.xml[?options]

或对于不含配置文件的分隔文件处理程序

flatpack:someName[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

106.2. URI 选项

Flatpack 组件没有选项。

Flatpack 端点使用 URI 语法配置:

flatpack:type:resourceUri

使用以下路径和查询参数:

106.2.1. 路径名(2 参数):

名称描述默认类型

type

是否使用固定还是分隔符

delim

FlatpackType

resourceUri

从 classpath 或文件系统载入 flatpack 映射文件 所需的 URL

 

字符串

106.2.2. 查询参数(25 参数):

名称描述默认类型

allowShortLines (common)

允许行比预期的要短,并忽略额外的字符

false

布尔值

delimiter (common)

分隔文件的默认字符分隔符。

,

char

ignoreExtraColumns (common)

允许行长于预期长,并忽略额外的字符

false

布尔值

ignoreFirstRecord (common)

对于分隔的文件(用于列标题)是否忽略第一行。

true

布尔值

splitRows (common)

设置组件以在解析后将每一行作为单独的交换发送

true

布尔值

textQualifier (common)

分隔的文件的文本限定符。

 

char

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

106.3. Spring Boot Auto-Configuration

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.component.flatpack.enabled

启用 flatpack 组件

true

布尔值

camel.component.flatpack.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.dataformat.flatpack.allow-short-lines

允许行比预期的要短,并忽略额外的字符

false

布尔值

camel.dataformat.flatpack.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.flatpack.definition

flatpack pzmap 配置文件。可在更简单的情况下省略,但最好使用 pzmap。

 

字符串

camel.dataformat.flatpack.delimiter

分隔符 char (身份为 ;或类似)

,

字符串

camel.dataformat.flatpack.enabled

启用 flatpack 数据格式

true

布尔值

camel.dataformat.flatpack.fixed

分隔或固定.默认为 false = 分隔

false

布尔值

camel.dataformat.flatpack.ignore-extra-columns

允许行长于预期长,并忽略额外的字符。

false

布尔值

camel.dataformat.flatpack.ignore-first-record

对于分隔的文件(用于列标题)是否忽略第一行。默认为 true。

true

布尔值

camel.dataformat.flatpack.parser-factory-ref

对要在 registry 中查询的自定义解析器引用

 

字符串

camel.dataformat.flatpack.text-qualifier

如果文本通过 字符进行限定。默认使用引号字符。

 

字符串

106.4. 例子

  • flatpack:fixed:foo.pzmap.xml 使用 foo.pzmap.xml 文件配置创建一个固定宽度端点。
  • flatpack:delim:bar.pzmap.xml 使用 bar.pzmap.xml 文件配置创建一个分隔端点。
  • flatpack:foo 会创建一个以 foo 分隔的端点,其中没有配置文件配置。

106.5. 消息标头

Camel 会将以下标头存储在 IN 消息中:

标头描述

camelFlatpackCounter

当前行索引。对于 splitRows=false,计数器是行总数。

106.6. Message Body

组件以 org.apache.camel.component.flatpack.DataSetList 对象(对 java.util. Map 或 java.util.List )提供数据。
通常,如果 映射 一次处理一行(splitRows=true)。使用 List 作为整个内容(splitRows=false),其中列表中的每个元素都是 映射
每个 map 包含列名称及其对应值的密钥。

例如,要从以下示例中获取 firstname:

  Map row = exchange.getIn().getBody(Map.class);
  String firstName = row.get("FIRSTNAME");

但是,您也可以始终将其视为列表(即使是 splitRows=true)。同一示例:

  List data = exchange.getIn().getBody(List.class);
  Map row = (Map)data.get(0);
  String firstName = row.get("FIRSTNAME");

106.7. 标头和 Trailer 记录

支持 Flatpack 中的标题和尾随器。但是,您必须使用 固定记录 ID:

  • 标头 记录的标头(必须为小写)
  • trailer 记录的尾随器(必须为小写)

以下示例说明了我们有一个标题和尾随器。如果需要,您可以省略其中一项或两者。

    <RECORD id="header" startPosition="1" endPosition="3" indicator="HBT">
        <COLUMN name="INDICATOR" length="3"/>
        <COLUMN name="DATE" length="8"/>
    </RECORD>

    <COLUMN name="FIRSTNAME" length="35" />
    <COLUMN name="LASTNAME" length="35" />
    <COLUMN name="ADDRESS" length="100" />
    <COLUMN name="CITY" length="100" />
    <COLUMN name="STATE" length="2" />
    <COLUMN name="ZIP" length="5" />

    <RECORD id="trailer" startPosition="1" endPosition="3" indicator="FBT">
        <COLUMN name="INDICATOR" length="3"/>
        <COLUMN name="STATUS" length="7"/>
    </RECORD>

106.8. 使用端点

常见用例是将文件发送到此端点,以便在单独的路由中进一步处理。例如:

  <camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
    <route>
      <from uri="file://someDirectory"/>
      <to uri="flatpack:foo"/>
    </route>

    <route>
      <from uri="flatpack:foo"/>
      ...
    </route>
  </camelContext>

您还可以将创建的每个消息的有效负载转换为 Map,以方便 Bean 集成

106.9. Flatpack DataFormat

Flatpack 组件附带 Flatpack 数据格式,可用于格式化固定宽度或将文本消息分隔为 映射 的行列表。

  • marshal = from List<Map<String, Object >> to OutputStream (可转换为 String
  • unmarshal = from java.io.InputStream (如文件或 字符串)到 java.util.List 作为 org.apache.camel.component.flatpack.DataSetList 实例。
    操作的结果将包含所有数据。如果您需要逐一处理每行,可以使用 Splitter 来分割交换。

注意: Flatpack 库目前不支持 marshal 操作的标头和尾随器。

106.10. 选项

数据格式有以下选项:

选项默认值描述

定义

null

flatpack pzmap 配置文件。可在更简单的情况下省略,但最好使用 pzmap。

FIXED

false

分隔或固定.

ignoreFirstRecord

true

对于分隔的文件(用于列标题)是否忽略第一行。

textQualifier

"

如果文本被授权为 char,如 "

delimiter

,

分隔符 char (身份为 或类似)

parserFactory

null

使用默认的 Flatpack parser 工厂。

allowShortLines

false

Camel 2.9.7 和 2.10.5 于wards:行要短于预期,并忽略额外的字符。

ignoreExtraColumns

false

Camel 2.9.7 和 2.10.5 于wards:允许行更长的时间,并忽略额外的字符。

106.11. 使用

要使用数据格式,只需实例化实例,并在路由构建器中调用 marshal 或 unmarshal 操作:

  FlatpackDataFormat fp = new FlatpackDataFormat();
  fp.setDefinition(new ClassPathResource("INVENTORY-Delimited.pzmap.xml"));
  ...
  from("file:order/in").unmarshal(df).to("seda:queue:neworder");

上面的示例将使用 Flatpack 配置文件 INVENTORY-Delimited.pzmap.xmlorder/in 文件夹中读取文件,并解压缩输入。其结果是一个 DataSetList 对象,它存储在 SEDA 队列中。

FlatpackDataFormat df = new FlatpackDataFormat();
df.setDefinition(new ClassPathResource("PEOPLE-FixedLength.pzmap.xml"));
df.setFixed(true);
df.setIgnoreFirstRecord(false);

from("seda:people").marshal(df).convertBodyTo(String.class).to("jms:queue:people");

在上面的代码中,我们将对象表示的数据汇总为 映射 的行列表。Map 包含键和对应值的列名称的行。这个结构可以在 Java 代码中创建,例如处理器。我们根据 Flatpack 格式对数据进行汇总,并将结果转换为 String 对象,并将它存储在 JMS 队列中。

106.12. 依赖项

要在 camel 路由中使用 Flatpack,您需要添加实现此数据格式的 camel-flatpack 的依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-flatpack</artifactId>
  <version>x.x.x</version>
</dependency>

106.13. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 107 章 Flatpack DataFormat

作为 Camel 版本 2.1 提供

Flatpack 组件附带 Flatpack 数据格式,可用于格式化固定宽度或将文本消息分隔为 映射 的行列表。

  • marshal = from List<Map<String, Object >> to OutputStream (可转换为 String
  • unmarshal = from java.io.InputStream (如文件或 字符串)到 java.util.List 作为 org.apache.camel.component.flatpack.DataSetList 实例。
    操作的结果将包含所有数据。如果您需要逐一处理每行,可以使用 Splitter 来分割交换。

注意: Flatpack 库目前不支持 marshal 操作的标头和尾随器。

107.1. 选项

Flatpack 数据格式支持 9 个选项,它们如下所列。

名称默认Java 类型描述

定义

 

字符串

flatpack pzmap 配置文件。可在更简单的情况下省略,但最好使用 pzmap。

FIXED

false

布尔值

分隔或固定.默认为 false = 分隔

ignoreFirstRecord

true

布尔值

对于分隔的文件(用于列标题)是否忽略第一行。默认为 true。

textQualifier

 

字符串

如果文本通过 字符进行限定。默认使用引号字符。

delimiter

,

字符串

分隔符 char (身份为 ;或类似)

allowShortLines

false

布尔值

允许行比预期的要短,并忽略额外的字符

ignoreExtraColumns

false

布尔值

允许行长于预期长,并忽略额外的字符。

parserFactoryRef

 

字符串

对要在 registry 中查询的自定义解析器引用

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

107.2. Spring Boot Auto-Configuration

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.component.flatpack.enabled

启用 flatpack 组件

true

布尔值

camel.component.flatpack.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.dataformat.flatpack.allow-short-lines

允许行比预期的要短,并忽略额外的字符

false

布尔值

camel.dataformat.flatpack.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.flatpack.definition

flatpack pzmap 配置文件。可在更简单的情况下省略,但最好使用 pzmap。

 

字符串

camel.dataformat.flatpack.delimiter

分隔符 char (身份为 ;或类似)

,

字符串

camel.dataformat.flatpack.enabled

启用 flatpack 数据格式

true

布尔值

camel.dataformat.flatpack.fixed

分隔或固定.默认为 false = 分隔

false

布尔值

camel.dataformat.flatpack.ignore-extra-columns

允许行长于预期长,并忽略额外的字符。

false

布尔值

camel.dataformat.flatpack.ignore-first-record

对于分隔的文件(用于列标题)是否忽略第一行。默认为 true。

true

布尔值

camel.dataformat.flatpack.parser-factory-ref

对要在 registry 中查询的自定义解析器引用

 

字符串

camel.dataformat.flatpack.text-qualifier

如果文本通过 字符进行限定。默认使用引号字符。

 

字符串

ND

107.3. 使用

要使用数据格式,只需实例化实例,并在路由构建器中调用 marshal 或 unmarshal 操作:

  FlatpackDataFormat fp = new FlatpackDataFormat();
  fp.setDefinition(new ClassPathResource("INVENTORY-Delimited.pzmap.xml"));
  ...
  from("file:order/in").unmarshal(df).to("seda:queue:neworder");

上面的示例将使用 Flatpack 配置文件 INVENTORY-Delimited.pzmap.xmlorder/in 文件夹中读取文件,并解压缩输入。其结果是一个 DataSetList 对象,它存储在 SEDA 队列中。

FlatpackDataFormat df = new FlatpackDataFormat();
df.setDefinition(new ClassPathResource("PEOPLE-FixedLength.pzmap.xml"));
df.setFixed(true);
df.setIgnoreFirstRecord(false);

from("seda:people").marshal(df).convertBodyTo(String.class).to("jms:queue:people");

在上面的代码中,我们将对象表示的数据汇总为 映射 的行列表。Map 包含键和对应值的列名称的行。这个结构可以在 Java 代码中创建,例如处理器。我们根据 Flatpack 格式对数据进行汇总,并将结果转换为 String 对象,并将它存储在 JMS 队列中。

107.4. 依赖项

要在 camel 路由中使用 Flatpack,您需要添加实现此数据格式的 camel-flatpack 的依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-flatpack</artifactId>
  <version>x.x.x</version>
</dependency>

第 109 章 fop 组件

作为 Camel 2.10 版本提供

FOP 组件允许您使用 Apache FOP 将消息呈现为不同的输出格式。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-fop</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

109.1. URI 格式

fop://outputFormat?[options]

109.2. 输出格式

主要输出格式为 PDF,但也有其他 输出格式

nameoutputFormatdescription

PDF

application/pdf

便携式文档格式

PS

application/postscript

Adobe Postscript

PCL

application/x-pcl

打印机控制语言

PNG

image/png

PNG 镜像

JPEG

image/jpeg

JPEG 镜像

SVG

image/svg+xml

可扩展向量图形

XML

application/X-fop-areatree

区域树表示

MIF

application/mif

FrameMaker’s MIF

RTF

application/rtf

富文本格式

TXT

text/plain

文本

有效输出格式的完整列表 可在此处找到

109.3. 端点选项

FOP 组件没有选项。

FOP 端点使用 URI 语法配置:

fop:outputType

使用以下路径和查询参数:

109.3.1. 路径名(1 参数):

名称描述默认类型

outputType

必需 的主要输出格式为 PDF,但也有其他输出格式。

 

FopOutputType

109.3.2. 查询参数(3 参数):

名称描述默认类型

fopFactory (producer)

允许使用自定义配置或实施 org.apache.fop.apps.FopFactory。

 

FopFactory

userConfigURL (producer)

可以从 classpath 或文件系统加载的配置文件的位置。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

109.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.fop.enabled

启用 fop 组件

true

布尔值

camel.component.fop.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

带有 以下结构 的配置文件的位置:从从 Camel 2.12 开始,文件默认情况下从 classpath 中加载。您可以使用 file:classpath: 作为前缀,从 file 或 classpath 中加载资源。在以前的版本中,该文件始终从文件系统载入。

fopFactory

 

允许使用自定义配置或实施 org.apache.fop.apps.FopFactory

109.5. Message Operations

name默认值description

CamelFop.Output.Format

 

覆盖该消息的输出格式

CamelFop.Encrypt.userPassword

 

PDF 用户密码

CamelFop.Encrypt.ownerPassword

 

PDF 所有者 passoword

CamelFop.Encrypt.allowPrint

true

允许打印 PDF

CamelFop.Encrypt.allowCopyContent

true

允许复制 PDF 的内容

CamelFop.Encrypt.allowEditContent

true

允许编辑 PDF 的内容

CamelFop.Encrypt.allowEditAnnotations

true

允许编辑 PDF 注解

CamelFop.Render.producer

Apache FOP

生成文档的系统/软件的元数据元素

CamelFop.Render.creator

 

创建文档的用户的元数据元素

CamelFop.Render.creationDate

 

创建日期

CamelFop.Render.author

 

文档内容的作者

CamelFop.Render.title

 

文档的标题

CamelFop.Render.subject

 

文档主题

CamelFop.Render.keywords

 

适用于本文档的关键字集

109.6. 示例

以下是从 xml 数据和 xslt 模板呈现 PDF 的路由,并将 PDF 文件保存在目标文件夹中:

from("file:source/data/xml")
    .to("xslt:xslt/template.xsl")
    .to("fop:application/pdf")
    .to("file:target/data");

如需更多信息,请参阅这些资源…​

109.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 110 章 Freemarker 组件

作为 Camel 2.10 版本提供

freemarker: 组件允许使用 FreeMarker 模板处理消息。这在使用 Templating 生成请求的响应时是理想的选择。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-freemarker</artifactId>
    <version>x.x.x</version> <!-- use the same version as your Camel core version -->
</dependency>

110.1. URI 格式

freemarker:templateName[?options]

其中 templateName 是要调用的模板的类路径路径 URI;或者,也可以是远程模板的完整 URL (如 file://folder/myfile.ftl)。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

110.2. 选项

Freemarker 组件支持 4 个选项,它们如下所列。

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

配置 (高级)

使用现有的 freemarker.template.Configuration 实例作为配置。

 

配置

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Freemarker 端点使用 URI 语法进行配置:

freemarker:resourceUri

使用以下路径和查询参数:

110.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

资源 所需的 路径。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。

 

字符串

110.2.2. 查询参数(7 参数):

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

configuration (producer)

设置要使用的自由标记器配置

 

配置

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

encoding (producer)

设置用于加载模板文件的编码。

 

字符串

templateUpdateDelay (producer)

加载的模板资源将保留在缓存中的秒数。

 

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

110.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.freemarker.configuration

使用现有的 freemarker.template.Configuration 实例作为配置。选项是一个 freemarker.template.Configuration 类型。

 

字符串

camel.component.freemarker.enabled

启用空闲标记组件

true

布尔值

camel.component.freemarker.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

110.4. Headers

在 FreeMarker 评估过程中设置的标题将返回到邮件并添加为标头。这为 FreeMarker 组件提供了向消息返回值的机制。

示例:在 FreeMarker 模板中设置 fruit 的标头值:

${request.setHeader('fruit', 'Apple')}

标头 fruit 现在可以从 message.out.headers 访问。

110.5. FreeMarker Context

Camel 将在 FreeMarker 上下文中提供交换信息(调整 map)。交换 的传输如下:

keyvalue

exchange

Exchange 本身。

exchange.properties

Exchange 属性。

标头

In 消息的标头。

camelContext

Camel 上下文.

request

In 消息。

正文(body)

In message body。

response

Out 消息(仅适用于 InOut 消息交换模式)。

在 Camel 2.14 中,您可以使用键 "CamelFreemarkerDataModel" 在消息标头中设置自定义 FreeMarker 上下文。

Map<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put("headers", headersMap);
variableMap.put("body", "Monday");
variableMap.put("exchange", exchange);
exchange.getIn().setHeader("CamelFreemarkerDataModel", variableMap);

110.6. 热重新加载

FreeMarker 模板资源默认为文件和类路径资源(expanded jar)都 无法进行 热重新加载。如果设置了 contentCache=false,则 Camel 不会缓存资源并热重新加载,从而启用。这种情境可用于开发。

110.7. 动态模板

Camel 提供了两个标头,您可以为模板或模板内容本身定义不同的资源位置。如果设置了其中任何标头,Camel 会将其用于端点配置的资源。这可让您在运行时提供动态模板。

标头类型描述支持版本

FreemarkerConstants.FREEMARKER_RESOURCE

org.springframework.core.io.Resource

模板资源

⇐ 2.1

FreemarkerConstants.FREEMARKER_RESOURCE_URI

字符串

要使用的模板资源的 URI,而不是配置的端点。

>= 2.1

FreemarkerConstants.FREEMARKER_TEMPLATE

字符串

要使用的模板,而不使用配置的端点。

>= 2.1

110.8. Samples

例如,您可以使用如下内容:

from("activemq:My.Queue").
  to("freemarker:com/acme/MyResponse.ftl");

使用 FreeMarker 模板来制定对 InOut 消息交换的消息的响应(其中有一个 JMSReplyTo 标头)。

如果要使用 InOnly 并消耗信息并将其发送到您可以使用的其他目的地:

from("activemq:My.Queue").
  to("freemarker:com/acme/MyResponse.ftl").
  to("activemq:Another.Queue");

和 禁用内容缓存,例如,开发使用 .ftl 模板应被热重新加载:

from("activemq:My.Queue").
  to("freemarker:com/acme/MyResponse.ftl?contentCache=false").
  to("activemq:Another.Queue");

以及基于文件的资源:

from("activemq:My.Queue").
  to("freemarker:file://myfolder/MyResponse.ftl?contentCache=false").
  to("activemq:Another.Queue");

Camel 2.1 中,可以指定组件应该通过标头动态使用的模板,例如:

from("direct:in").
  setHeader(FreemarkerConstants.FREEMARKER_RESOURCE_URI).constant("path/to/my/template.ftl").
  to("freemarker:dummy?allowTemplateFromHeader=true");
警告

启用 allowTemplateFromHeader 选项具有安全 RAMification。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

110.9. 电子邮件示例

在本例中,我们想要使用 FreeMarker 模板来进行确认电子邮件。电子邮件模板在自由Marker 中称为:

Dear ${headers.lastName}, ${headers.firstName}

Thanks for the order of ${headers.item}.

Regards Camel Riders Bookstore
${body}

和 java 代码:

110.10. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 111 章 FTP 组件

可作为 Camel 版本 1.1 提供

此组件通过 FTP 和 SFTP 协议提供对远程文件系统的访问。

当使用来自远程 FTP 服务器消耗时,请确保在进一步 消耗文件时,请阅读标题为 Default 的部分,以了解与消耗文件相关的详细信息。

不支持 绝对路径。Camel 2.16 将通过从目录名修剪所有前导斜杠来转换到相对的绝对路径。日志中会显示 WARN 消息。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ftp</artifactId>
    <version>x.x.x</version>See the documentation of the Apache Commons
    <!-- use the same version as your Camel core version -->
</dependency>

111.1. URI 格式

ftp://[username@]hostname[:port]/directoryname[?options]
sftp://[username@]hostname[:port]/directoryname[?options]
ftps://[username@]hostname[:port]/directoryname[?options]

其中 directoryname 代表底层目录。目录名称是相对路径。不支持 绝对路径。相对路径可以包含嵌套文件夹,如 /inbox/us。

对于 Camel 2.16 之前的 Camel 版本, catalog Name 必须已存在,因为此组件不支持 autoCreate 选项(该文件组件除外)。其原因在于,其 FTP 管理员(FTP 服务器)任务能够正确地设置用户帐户,以及具有适当文件权限的主目录等。

对于 Camel 2.16,支持 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 组件只在 Camel 2.2 或更新版本中可用。
FTPS (也称为 FTP Secure)是对 FTP 的扩展,增加了对传输层安全(TLS)和安全套接字层(SSL)加密协议的支持。

111.2. URI 选项

以下选项适用于 FTP 组件。

FTP 组件没有选项。

FTP 端点使用 URI 语法配置:

ftp:host:port/directoryName

使用以下路径和查询参数:

111.2.1. 路径名(3 参数):

名称描述默认类型

主机

FTP 服务器 所需的 主机名

 

字符串

port

FTP 服务器的端口

 

int

directoryName

启动目录

 

字符串

111.2.2. 查询参数(110 参数):

名称描述默认类型

binary (common)

指定文件传输模式 BINARY 或 ASCII。默认为 ASCII (false)。

false

布尔值

charset (common)

此选项用于指定文件的编码。您可以在使用者上使用此来指定文件的编码,允许 Camel 知道 charset,以便在访问文件内容时加载文件内容。同样在编写文件时,也可以使用这个选项来指定 charset 以写入该文件。请记住,在编写文件 Camel 时,可能需要读取消息内容到内存中,以便能够将数据转换为配置的 charset,因此如果您有较大消息,则不会使用此消息。

 

字符串

disconnect (common)

使用后是否与远程 FTP 服务器断开连接。断开连接只会断开当前与 FTP 服务器的连接。如果您有一个要停止的消费者,则需要停止消费者/路由。

false

布尔值

doneFileName (common)

制作者:如果提供,Camel 将在写入原始文件时写入 2 个操作文件。完成的文件将为空。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。生成的文件将始终写在与原始文件相同的文件夹中。消费者:如果提供,Camel 才会消耗文件(如果存在)文件。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。完成的文件始终与原始文件在同一文件夹中。只支持 $file.name 和 $file.name.noext 作为动态占位符。

 

字符串

fileName (common)

使用文件语言等表达式动态设置文件名。对于消费者,它被用作文件名过滤器。对于制作者而言,用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注:标题本身也可以是 Expression)。表达式选项支持 String 和 Expression 类型。如果表达式是 String 类型,则始终会使用文件语言来评估。如果表达式是 Expression 类型,则使用指定的 Expression 类型 - 这允许您使用 OGNL 表达式。对于消费者,您可以使用文件名来过滤文件名,因此您可以使用文件语言语法:mydata-$date:now:yyyyMMdd.txt。生产者支持 CamelOverruleFileName 标头,其优先级高于任何现有的 CamelFileName 标头;CamelOverruleFileName 只是一个标头,而且可以更轻松地进行临时存储 CamelFileName,且必须稍后恢复。

 

字符串

passiveMode (common)

设置被动模式连接。默认为 active 模式连接。

false

布尔值

separator (common)

设置要使用的路径分隔符。Unix = 使用 unix 风格路径分隔符 Windows = 使用 Windows 风格的路径分隔符 = Auto = (默认)在文件名称中使用现有路径分隔符

UNIX

PathSeparator

transferLoggingInterval Seconds (common)

配置记录上传和下载操作进程时的间隔(以秒为单位)。当操作需要较长时,这用于日志记录进度。

5

int

transferLoggingLevel (common)

配置日志级别,以便在记录上传和下载操作的进度时使用。

DEBUG

LoggingLevel

transferLoggingVerbose (common)

配置上传和下载操作进度的详细(细粒度)日志记录。

false

布尔值

fastExistsCheck (common)

如果将这个选项设置为 true,则 camel-ftp 将使用列表文件直接检查文件是否存在。由于某些 FTP 服务器可能不支持直接列出文件,如果 选项为 false,则 camel-ftp 将使用旧方法列出该目录并检查文件是否存在。这个选项还会影响 readLock=changed,以控制它执行快速检查来更新文件信息。如果 FTP 服务器具有很多文件,则这可用于加快进程速度。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

delete (consumer)

如果为 true,则在成功处理该文件后会删除该文件。

false

布尔值

moveFailed (consumer)

根据简单语言设置移动失败表达式。例如,将文件移动到 .error 子目录,请使用: .error。注意:将文件移动到故障位置 Camel 将处理错误,且不会再次选择该文件。

 

字符串

noop (consumer)

如果为 true,则该文件不会以任何方式移动或删除。此选项对于只读数据或者 ETL 类型要求是很好的选择。如果 noop=true,Camel 也将设置 idempotent=true,以避免再次消耗相同的文件。

false

布尔值

preMove (consumer)

用于在处理前动态设置文件名的表达式(如文件语言)。例如,要将 in-progres 文件移动到 order 目录中,把这个值设置为 order。

 

字符串

preSort (consumer)

启用预先排序后,消费者将在轮询过程中对文件和目录名称进行排序,该名称是从文件系统检索的。如果需要以有序的顺序处理文件,您可能希望执行此操作。预先排序是在消费者开始过滤之前执行,并接受 Camel 进行处理的文件。这个选项为 default=false 表示禁用。

false

布尔值

recursive (consumer)

如果某个目录也会在所有子目录中查找文件。

false

布尔值

resumeDownload (consumer)

配置是否启用恢复下载。FTP 服务器必须支持它(几乎所有 FTP 服务器都支持它)。另外,还必须配置 localWorkDirectory 选项,这样下载的文件会存储在本地目录中,必须启用 选项二进制文件,以支持下载恢复。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

streamDownload (consumer)

设置不使用本地工作目录时要使用的下载方法。如果设置为 true,则远程文件会在读取时流传输至路由。当设置为 false 时,在将远程文件发送到路由之前将远程文件加载到内存。

false

布尔值

directoryMustExist (consumer)

与 startDirectoryMustExist 类似,但这在轮询递归子目录期间应用。

false

布尔值

download (consumer)

FTP 用户是否应下载 文件。如果此选项设置为 false,则消息正文将为空,但使用者仍将触发 Camel Exchange,其具有文件名、文件大小等文件的详细信息。这只是文件不会下载。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

handleDirectoryParser AbsoluteResult (consumer)

如果目录解析器结果为绝对路径,则设置消费者如何处理子文件夹和文件。原因在于,一些 FTP 服务器可能会使用绝对路径返回文件名,如果是 FTP 组件需要处理这个路径,那么 FTP 组件需要通过将返回的路径转换为相对路径来进行处理。

false

布尔值

ignoreFileNotFoundOr PermissionError (consumer)

是否要忽略(尝试列出目录中的文件或在下载文件时),它们不存在或因为权限错误而存在。默认情况下,当目录或文件不存在或权限不足时,会抛出异常。将这个选项设置为 true 可强制忽略它。

false

布尔值

inProgressRepository (consumer)

可插拔插入存储库 org.apache.camel.spi.IdempotentRepository。in-progress 存储库用于考虑当前正在使用的进程文件中。默认情况下会使用基于内存的存储库。

 

IdempotentRepository

localWorkDirectory (consumer)

消耗时,可以使用本地工作目录直接将远程文件内容存储在本地文件中,以避免将内容加载到内存中。这在您消耗非常大的远程文件时很有用,因此可以节省内存。

 

字符串

onCompletionException Handler (consumer)

使用自定义 org.apache.camel.spi.ExceptionHandler 处理在完成过程中文件的异常,以处理使用者在完成过程中进行的提交或回滚。默认实现会将任何异常记录在 WARN 级别,并忽略。

 

ExceptionHandler

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

processStrategy (consumer)

可插拔 org.apache.camel.component.file.GenericFileProcessStrategy 允许您实施自己的 readLock 选项或类似内容。在文件被消耗(如有特殊就绪文件)之前,还可使用特殊条件。如果设置了这个选项,则不会应用 readLock 选项。

 

GenericFileProcess Strategy

receiveBufferSize (consumer)

仅由 FTPClient 使用的接收(download)缓冲区大小

32768

int

startingDirectoryMustExist (consumer)

启动目录是否必须存在。请注意,autoCreate 选项是默认的启用状态,这意味着如果起始目录不存在,通常会自动创建起始目录。您可以禁用 autoCreate 并启用它,以确保起始目录必须存在。如果目录不存在,将抛出异常。

false

布尔值

useList (consumer)

下载文件时是否允许使用 LIST 命令.默认为 true。在某些情况下,您可能需要下载特定文件,且不允许使用 LIST 命令,因此您可以将这个选项设置为 false。请注意,使用这个选项时,要下载的特定文件不包含 meta-data 信息,如文件大小、时间戳、权限等,因为这些信息仅在使用 LIST 命令时检索。

true

布尔值

fileExist (producer)

如果文件已存在相同名称的文件,应该怎么办?覆盖(默认)替换现有文件。append - 将内容添加到现有文件中。fail - 引发 GenericFileOperationException,这表示已有的文件。ignore - 静默忽略问题且不覆盖现有文件,但假设一切正常。move - 选项需要使用同时配置 moveExisting 选项。选项 eagerDeleteTargetFile 可用于控制移动文件要做什么,并且已存在一个现有文件,否则会导致移动操作失败。Move 选项将在编写目标文件之前移动任何现有文件。TryRename 仅在使用 tempFileName 选项时才适用。这样,可以在不做任何检查的情况下,尝试将文件从临时名称重命名为实际名称。在某些文件系统中,这个检查可能会更快,特别是 FTP 服务器。

覆盖

GenericFileExist

flatten (producer)

flatten 用于扁平化文件名路径,以剥离任何前导路径,因此这仅仅是文件名。这样,您可以以递归方式使用子目录,但当您将这些文件写入单个目录中时。在制作者上,在制作者上将强制将设置 CamelFileName 标头中的任何文件名用于任何领先的路径。

false

布尔值

jailStartingDirectory (producer)

用于判断(限制)将文件写入起始目录(和子目录)。默认情况下,启用此项以允许 Camel 将文件写入外部目录(从该框更受保护)。您可以关闭此目的,允许将文件写入起始目录之外的目录,如父级或根文件夹。

true

布尔值

moveExisting (producer)

配置 fileExist=Move 时要使用的表达式(如文件语言)。要将文件移动到备份子目录中,只需输入备份。这个选项只支持以下文件语言令牌:file:name、file:name.ext、file:name.noext、file:onlyname、file:onlyname.noext、file:ext 和 file:parent。注意 file:parent 不受 FTP 组件支持,因为 FTP 组件只能将任何现有文件移到基于当前 dir 的相对目录中。

 

字符串

tempFileName (producer)

与 tempPrefix 选项相同,但可以为临时文件名命名提供更精细的控制,因为它使用文件语言。

 

字符串

tempPrefix (producer)

这个选项用于使用临时名称写入文件,然后在写入完成后将其重命名为真实名称。可用于识别正在写入的文件,并避免消费者(不使用专用读取锁定)读取进度文件。上传较大的文件时通常由 FTP 使用。

 

字符串

allowNullBody (producer)

用于指定在写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,如果设为 false,并且试图向文件组件发送 null 正文,则使用"Cannot将 null body 写入空正文到 file.' 的 GenericFileWriteException 的 GenericFileWriteException 来抛出。'如果将 fileExist 选项设置为 'Override',则文件将被截断,如果设置为 append,则文件将保持不变。

false

布尔值

chmod (producer)

允许您在存储的文件上设置 chmod。例如 chmod=640。

 

字符串

disconnectOnBatchComplete (producer)

批处理上传完成后是否与远程 FTP 服务器断开连接。disconnectedOnBatchComplete 将仅断开当前与 FTP 服务器的连接。

false

布尔值

eagerDeleteTargetFile (producer)

是否完全删除任何现有的目标文件。这个选项只适用于使用 fileExists=Override 和 tempFileName 选项。您可以使用它来禁用(将其设置为 false)在写入 temp 文件前删除目标文件。例如,您可以写入大文件,并且希望目标文件在正在写入时存在。这样可保证目标文件仅在最后一开始删除,而在 temp 文件被重命名为目标文件名之前。这个选项还用来控制是否在启用 fileExist=Move 时删除任何现有文件,并且存在现有文件。如果此选项 copyAndDeleteOnRenameFails false,则在存在现有文件(如果其 true)存在时,则会抛出异常(如果存在),那么在移动操作前会删除现有文件。

true

布尔值

keepLastModified (producer)

将保留来自源文件(若有)的最后修改的时间戳。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或 long with timestamp。如果存在时间戳,并且启用 选项,它将对写入的文件设置此时间戳。注:此选项仅适用于文件制作者。您不能对任何 ftp 制作者使用这个选项。

false

布尔值

moveExistingFileStrategy (producer)

用于在配置 fileExist=Move 时移动带有特殊命名令牌的文件的策略(Custom 策略)。默认情况下,如果没有提供自定义策略,则使用实施

 

FileMoveExisting 策略

sendNoop (producer)

在上传文件到 FTP 服务器之前,是否以预先写入的方式发送 noop 命令。这默认是启用的,因为连接的验证仍然有效,这样可以静默地重新连接来上传文件。但是,如果这会导致问题,您可以关闭这个选项。

true

布尔值

activePortRange (advanced)

以活动模式设置客户端侧端口范围。其语法为: minPort-maxPort Both 端口号为,如 10000-19999,以包括所有 1xxxx 端口。

 

字符串

autoCreate (advanced)

在文件路径名称中自动创建缺失的目录。对于文件使用者,这意味着创建起始目录。对于文件制作者,这意味着文件应写入到其中的目录。

true

布尔值

bufferSize (advanced)

以字节为单位写入缓冲区大小。

131072

int

connectTimeout (advanced)

设置等待由 FTPClient 和 JSCH 使用的连接的连接超时

10000

int

ftpClient (advanced)

使用 FTPClient 的自定义实例

 

FTPClient

ftpClientConfig (advanced)

要使用自定义 FTPClientConfig 实例来配置端点应使用的 FTP 客户端。

 

FTPClientConfig

ftpClientConfigParameters (advanced)

FtpComponent 用于为 FTPClientConfig 提供额外的参数

 

map

ftpClientParameters (advanced)

FtpComponent 用于为 FTPClient 提供额外的参数

 

map

maximumReconnectAttempts (advanced)

指定在尝试连接到远程 FTP 服务器时,Camel 会执行的最大重新连接尝试。使用 0 禁用此行为。

 

int

reconnectDelay (advanced)

在执行重新连接尝试前,millis Camel 会等待延迟。

 

long

siteCommand (advanced)

设置在成功登录后要执行的可选的 site 命令。可以使用新行字符分隔多个站点命令。

 

字符串

soTimeout (advanced)

设置仅由 FTPClient 使用的 so 超时

300000

int

stepwise (advanced)

设置在下载文件时是否应采取措施更改目录,或在上传文件到目录时。例如,如果因为安全原因而无法更改 FTP 服务器上的目录,您可以禁用此设置。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

throwExceptionOnConnect Failed (advanced)

如果连接失败(费用)默认情况下不会抛出异常,则应该抛出异常,日志为 WARN。您可以使用此功能启用异常,并处理来自 org.apache.camel.spi.PollingConsumerPollStrategy rollback 方法的抛出异常。

false

布尔值

timeout (advanced)

设置数据超时,以等待仅由 FTPClient 使用回复

30000

int

antExclude (filter)

Ant 样式过滤器排除.如果使用 antInclude 和 antExclude,则 antExclude 优先于 antInclude。可以用逗号分隔的格式指定多个排除项。

 

字符串

antFilterCaseSensitive (filter)

在 at 过滤器中设置区分大小写的标记

true

布尔值

antInclude (filter)

Ant 风格过滤器包含.可以用逗号分隔的格式指定多个包含。

 

字符串

eagerMaxMessagesPerPoll (filter)

允许控制 maxMessagesPerPoll 的限制是预先控制。如果预先考虑,则限制会在扫描文件期间进行。如果为 false,则扫描所有文件,然后执行排序。将此选项设置为 false 可首先对所有文件进行排序,然后限制轮询。请注意,这需要较高的内存用量,因为所有文件详细信息都位于内存中来执行排序。

true

布尔值

exclude (filter)

如果文件名与 regex 模式匹配,则使用 排除文件(匹配是 in-senstive)。请注意,如果将这个符号配置为端点 uri,则需要使用 RAW ()语法等符号(如加号)进行配置。有关配置端点 uris 时的详情,请参阅

 

字符串

filter (filter)

可插入的过滤器作为 org.apache.camel.component.file.GenericFileFilter 类。如果过滤器在其 accept ()方法中返回 false,则将跳过文件。

 

GenericFileFilter

filterDirectory (filter)

根据简单语言过滤目录。例如,要过滤当前日期,您可以使用一个简单的日期模式,如 $date:now:yyyMMdd

 

字符串

filterFile (filter)

根据简单语言过滤文件。例如,要根据文件大小进行过滤,可以使用 $file:size 5000

 

字符串

idempotent (filter)

使用 Idempotent Consumer EIP 模式的选项允许 Camel 跳过已处理的文件。默认情况下,将使用包含 1000 条目的基于内存的 LRUCache。如果 noop=true 之后,将启用幂等性,以避免再次消耗相同的文件。

false

布尔值

idempotentKey (filter)

使用自定义幂等密钥。默认情况下,使用文件的绝对路径。您可以使用文件语言(例如,使用文件名和文件大小),您可以完成: idempotentKey=$file:name-$file:size

 

字符串

idempotentRepository (filter)

可插拔存储库 org.apache.camel.spi.IdempotentRepository,如果未指定,则默认使用 MemoryMessageIdRepository,并且幂等为 true。

 

IdempotentRepository

include (filter)

如果文件名与 regex 模式匹配,则用于包含文件(匹配区分大小写)。请注意,如果将这个符号配置为端点 uri,则需要使用 RAW ()语法等符号(如加号)进行配置。有关配置端点 uris 时的详情,请参阅

 

字符串

maxDepth (filter)

递归处理目录时要遍历的最大深度。

2147483647

int

maxMessagesPerPoll (filter)

定义要为每个轮询收集的最大消息。默认情况下没有设置最大值。可用于设置 e.g. 1000 的限制,以避免在启动存在数千台服务器时。将值设为 0 或负数设为 disabled。注意:如果使用这个选项正在使用,则文件和 FTP 组件将在任何排序前限制。例如,如果您有 100000 文件并使用 maxMessagesPerPoll=500,则只会提取前 500 个文件,然后排序。您可以使用 eagerMaxMessagesPerPoll 选项,将其设置为 false,以允许首先扫描所有文件,然后再排序。

 

int

minDepth (filter)

递归处理目录时开始处理的最小深度信息。使用 minDepth=1 意味着基础目录。使用 minDepth=2 表示第一个子目录。

 

int

Move (filter)

表达式(如简单语言),用于在处理后动态设置文件名。要将文件移动到 .done 子目录中,只需输入 .done。

 

字符串

exclusiveReadLockStrategy (lock)

可插拔 read-lock 作为 org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy 实施。

 

GenericFileExclusive ReadLockStrategy

readLock (lock)

供使用者使用,仅当文件具有独占的 read-lock 时(例如,该文件没有处于-progres 或被写入时)轮询文件。Camel 将等待文件锁定。此选项以策略形式提供构建:无 - 无读取锁定在使用 markerFile - Camel 创建一个标志文件(fileName.camelLock),然后保存锁定。FTP 组件更改的这个选项 - 更改使用文件长度/修改时间戳来检测当前正在复制的文件。将至少使用 1 sec 来确定这一点,因此此选项无法像其他形式使用文件一样迅速使用,但由于 JDK IO API 无法始终确定文件当前是否正在被另一个进程使用。选项 readLockCheckInterval 可用于设置检查频率。fileLock - 用于使用 java.nio.channels.FileLock。这个选项不适用于 Windows 或 FTP 组件。在通过 mount/share 访问远程文件系统时,应该避免这种方法,除非文件系统支持分布式文件锁定。重命名 - 使用重命名文件作为测试,如果我们可以获得独占的 read-lock。幂等 - (对于文件组件)幂等的幂等性是使用 idempotentRepository 作为 read-lock 的 read-lock。这允许在幂等存储库实现支持集群时使用读取锁定,该锁定支持集群。幂等更改 - (对于文件组件)使用 idempotentRepository,并随着合并的 read-lock 改变。这允许使用支持集群的读取锁定,如果幂等存储库实施支持集群。幂等-rename - ( file 组件)幂等-rename 使用 idempotentRepository 并将 重命名为 combined read-lock。这允许在幂等存储库实现支持的情况下使用支持集群的读取锁定。注意:各种读取锁定不适用于在集群模式下工作,不同节点上的并发用户对共享文件系统上的相同文件都竞争。使用接近 atomic 操作来创建空的标志文件,但它无法保证在集群中工作。fileLock 可以更好地工作,但文件系统需要支持分布式文件锁定,以此类推。如果幂等存储库支持集群(如 Hazelcast 组件或 Infinispan),则使用幂等的读取锁定可以支持集群。

none

字符串

readLockCheckInterval (lock)

read-lock 的间隔(如果被读取锁定支持)。这个间隔用于在尝试获取读取锁定间进行睡眠状态。例如,在使用 changed 的 read lock 时,您可以将更高的间隔周期设置为 cater 以慢速写入。如果制作者非常慢,写入文件,则默认为 1 sec.。注意:对于 FTP 默认 readLockCheckInterval 为 5000。readLockTimeout 值必须大于 readLockCheckInterval,但经验规则至少为 2 个或更多或更多为 readLockCheckInterval。这需要确保读取锁定进程允许修改时间尝试在超时达到前获取锁。

1000

long

readLockDeleteOrphanLock Files (lock)

如果 Camel 未正确关闭,则启动时是否应该在启动时使用标志文件读取锁定文件来读取锁定文件(如 JVM 崩溃)。如果将此选项转换为 false,则任何孤立的锁定文件将导致 Camel 无法启动该文件,这可能是因为另一个节点同时从同一共享目录中读取文件。

true

布尔值

readLockLoggingLevel (lock)

无法获取读取锁定时使用的日志记录级别。默认情况下记录 WARN。您可以更改此级别,例如,变为 OFF 以没有任何日志。这个选项仅适用于 readLock 类型的 readLock: changed、fileLock、幂等、幂等更改、幂等名称、重命名。

DEBUG

LoggingLevel

readLockMarkerFile (lock)

是否使用带 changed、重命名或专用读锁定类型的标记文件。默认情况下,也可使用标志文件来保护其他进程的获取相同的文件。可以通过将此选项设置为 false 来关闭此行为。例如,如果您不想将标记文件写入 Camel 应用程序的文件系统。

true

布尔值

readLockMinAge (lock)

此选项仅适用于 readLock=changed。它允许在尝试获取读取锁定前指定文件的最短期限。例如,使用 readLockMinAge=300s 来要求文件最多 5 分钟。这可能会加快更改的读取锁定,因为它只会试图获取至少是给定期限的文件。

0

long

readLockMinLength (lock)

此选项仅适用于 readLock=changed。它允许您配置最小长度。默认情况下,Camel 预期文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度的文件。

1

long

readLockRemoveOnCommit (lock)

此选项仅适用于 readLock=idempotent。它允许您指定在处理文件成功并且提交发生时是否从幂等存储库中删除文件名条目。默认情况下,该文件不会被删除,以确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可能会支持驱除策略,您可以配置在 X 分钟后驱除文件名条目 - 这可确保出现竞争条件的问题。请参阅 readLockIdempotentReleaseDelay 选项的详情。

false

布尔值

readLockRemoveOnRollback (lock)

此选项仅适用于 readLock=idempotent。它允许您指定在处理文件失败时是否从幂等存储库中删除文件名条目,并进行回滚。如果此选项为 false,则文件名条目已确认(如同文件提交一样)。

true

布尔值

readLockTimeout (lock)

如果 read-lock 支持,则 millis 中的可选超时。如果无法授予 read-lock 且触发超时,则 Camel 将跳过该文件。下次轮询 Camel 时,将重试文件,此时可能会授予 read-lock。使用 0 或 lower 值来永久指示。目前,fileLock,更改并重命名支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000,而不是 10000。readLockTimeout 值必须大于 readLockCheckInterval,但经验规则至少为 2 个或更多或更多为 readLockCheckInterval。这需要确保读取锁定进程允许修改时间尝试在超时达到前获取锁。

10000

long

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

shuffle (sort)

要取消文件列表(以随机顺序排序)

false

布尔值

sortBy (sort)

内置使用文件语言排序.支持嵌套的排序,因此您可以按文件名排序,并根据修改日期进行排序。

 

字符串

排序 器(排序)

可插拔排序器作为 java.util.Comparator 类。

 

比较器

帐户 (安全)

用于登录的帐户

 

字符串

密码 (安全)

用于登录的密码

 

字符串

username (security)

用于登录的用户名

 

字符串

111.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.ftp.enabled

启用 ftp 组件

true

布尔值

camel.component.ftp.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

111.4. FTPS 组件默认信任存储

在使用与 FTPS 组件相关的 SSL 相关的 ftpClient. 属性时,信任存储接受所有证书。如果您只需要信任选择的证书,则必须使用 ftpClient.trustStore.xxx 选项或配置自定义 ftpClient 配置信任存储。

使用 sslContextParameters 时,信任存储由提供的 SSLContextParameters 实例的配置进行管理。

您可以使用 ftpClient 或 ftpClient Config. 前缀,从 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 查找来指代要使用的 ftpClientftpClientConfig

例如:

   <bean id="myConfig" class="org.apache.commons.net.ftp.FTPClientConfig">
       <property name="lenientFutureDates" value="true"/>
       <property name="serverLanguageCode" value="fr"/>
   </bean>

然后,当您在 url 中使用 # 表示法时,允许 Camel 查找这个 bean。

from("ftp://foo@myserver?password=secret&ftpClientConfig=#myConfig").to("bean:foo");

111.5. 例子

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

111.6. 并发

FTP Consumer 不支持并发

FTP 用户(具有相同的端点)不支持并发(后备 FTP 客户端无法安全线程)。
您可以使用多个 FTP 用户来轮询不同端点。它只是一个不支持并发用户的端点。

FTP 生产者 没有 此问题,它支持并发。

111.7. 更多信息

这个组件是 File 组件的扩展。因此,File 组件页面中还有更多示例和详情。

111.8. 消耗文件时默认

默认情况下,FTP 用户将保留不动在远程 FTP 服务器中的消耗文件。如果您想要删除文件或者将其移动到其他位置,则必须明确配置它。例如,您可以使用 delete=true 删除文件,或使用 move=.done 将文件移动到隐藏的完成子目录中。

常规文件使用者不同,因为它默认将文件移动到 .camel 子目录中。默认情况下,Camel 不适用于 FTP 用户,也就是说,默认可能缺少权限才能移动或删除文件。

111.8.1. 限制

选项 readLock 可用于强制 Camel 不使用 当前正在写入的文件。但是,这个选项会被默认关闭,因为它要求用户具有写入权限。有关读取锁定的详情,请查看 File2 中的选项表。
还有其他解决方案可避免消耗目前通过 FTP 写入的文件;例如,您可以写入临时目标并在写入后移动文件。

使用 movepreMove 选项移动文件时,文件仅限于 FTP_ROOT 文件夹。这可防止您将文件移至 FTP 区域之外。如果要将文件移动到另一个区域,您可以使用软链接并将文件移动到软链接文件夹中。

111.9. 消息标头

以下消息标头可用于影响组件的行为

标头描述

CamelFileName

指定发送到端点时要用于输出消息的输出文件名(与端点目录相对)。如果不存在且没有表达式,则会将生成的消息 ID 用作文件名。

CamelFileNameProduced

写入的输出文件的实际文件路径(路径 + 名称)。此标头由 Camel 设置,其用途是为最终用户提供写入的文件的名称。

CamelFileIndex

当前索引除在此批处理中消耗的文件总数。

CamelFileSize

此批处理中消耗的文件总数。

CamelFileHost

远程主机名。

CamelFileLocalWorkPath

如果使用了本地工作目录,则本地工作文件的路径。

此外,FTP/FTPS 使用者和制作者还会使用以下标头增强 Camel 消息

标头描述

CamelFtpReplyCode

Camel 2.11.1: FTP 客户端回复代码(类型是一个整数)

CamelFtpReplyString

Camel 2.11.1: FTP 客户端回复字符串

111.10. 关于超时

这两组库(请参阅 top)有不同的 API 来设置超时。您可以使用两者的 connectTimeout 选项在 millis 中设置超时来建立网络连接。也可以使用 ftpClient. soTimeout 在 FTP/FTPS 上设置单个 soTimeout。注意 SFTP 将自动使用 connectTimeout 作为其 soTimeouttimeout 选项仅适用于 FTP/FTSP 作为数据超时,它对应于 ftpClient.dataTimeout 值。所有超时值都为 millis。

111.11. 使用本地工作目录

Camel 支持使用来自远程 FTP 服务器消耗并将文件直接下载到本地工作目录中。这可避免将整个远程文件内容读取到内存中,因为它使用 FileOutputStream 直接流传输到本地文件。

Camel 将存储到与远程文件同名的本地文件,尽管在下载文件的同时,使用 .in progres 扩展名。之后,该文件被重命名为 .inprogress 后缀。最后,当交换完成时,将删除本地文件。

因此,如果要从远程 FTP 服务器下载文件并将其存储为文件,则需要路由到文件端点,例如:

from("ftp://someone@someserver.com?password=secret&localWorkDirectory=/tmp").to("file://inbox");
提示

上述路由效率更高,因为它可避免将整个文件内容读取到内存中。它将直接将远程文件下载到本地文件流。然后,java.io.File 句柄被用作 Exchange body。文件制作者利用这一事实,可以直接处理 java.io.File 句柄,并为目标文件名执行 java.io.File.rename。因为 Camel 知道它是本地的工作文件,它可以优化并使用重命名而不是文件副本,因为该文件旨在完全删除。

111.12. 步骤更改目录

在消耗文件(例如下载)或生成文件(如上传)时,Camel FTP 可以在两种模式下操作。

  • 步骤范围
  • 没有分步

您可以根据您的情况和安全问题来选择其中之一。某些 Camel 最终用户仅在使用步骤范围时下载文件,而其他用户只能下载文件(如果未通过)。您至少可选择(从 Camel 2.6 开始)。

在 Camel 2.0 - 2.5 中,只有一个模式,即:

  • 在 2.5 之前
  • 2.5 步骤范围

现在,您可以用来控制行为的 选择步骤 是 Camel 2.6。

请注意,在大多数情况下,目录的分步更改将只在用户限制于其主目录以及主目录被报告为 "/" 时起作用。

两者之间的差别最好通过示例进行说明。假设我们在远程 FTP 服务器中有以下目录结构,我们需要遍历和下载文件:

/
/one
/one/two
/one/two/sub-a
/one/two/sub-b

并且每个子(a.txt)和子(b.txt)文件夹中都有一个文件。

111.12.1. 使用 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 遍历目录结构。

111.12.2. 使用 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 操作。

111.13. Samples

在以下示例中,我们设置 Camel 每小时从 FTP 服务器下载所有报告(60 分钟)作为 BINARY 内容并将其存储为本地文件系统中的文件。

以及使用 Spring DSL 的路由:

  <route>
     <from uri="ftp://scott@localhost/public/reports?password=tiger&amp;binary=true&amp;delay=60000"/>
     <to uri="file://target/test-reports"/>
  </route>

111.13.1. 消耗远程 FTPS 服务器(简单 SSL)和客户端身份验证

from("ftps://admin@localhost:2222/public/camel?password=admin&securityProtocol=SSL&isImplicit=true
      &ftpClient.keyStore.file=./src/test/resources/server.jks
      &ftpClient.keyStore.password=password&ftpClient.keyStore.keyPassword=password")
  .to("bean:foo");

111.13.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");

111.14. Filter using org.apache.camel.component.file.GenericFileFilter

Camel 支持可插拔过滤策略。此策略可用于 Java 中的 org.apache.camel.component.file.GenericFileFilter 中的构建。然后,您可以使用这样的过滤器配置端点,以在处理前跳过特定的过滤器。

在示例中,我们构建了自己的过滤器,只接受以文件名开头的报告的文件。

然后,我们可以使用 filter 属性配置我们的路由,以引用我们在 spring XML 文件中定义的过滤器(使用 # 表示法):

   <!-- define our sorter as a plain spring bean -->
   <bean id="myFilter" class="com.mycompany.MyFileFilter"/>

  <route>
    <from uri="ftp://someuser@someftpserver.com?password=secret&amp;filter=#myFilter"/>
    <to uri="bean:processInbox"/>
  </route>

111.15. 使用 ANT 路径匹配器过滤

ANT 路径匹配器是 camel-spring jar 中附带的过滤器。因此,如果您使用 Maven,您需要依赖于 camel-spring
这就是我们利用 Spring 的 AntPathMatcher 进行实际匹配的原因。

文件路径与以下规则匹配:

  • ? 匹配一个字符
  • * 匹配零或更多字符
  • ** 匹配路径中的零或更多目录

以下示例演示了如何使用它:

111.16. 使用 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 文档来发现所有选项。

111.17. 设置首选 SFTP 验证方法

如果要显式指定由 sftp 组件使用的身份验证方法列表,请使用 preferredAuthentications 选项。例如,如果您想将 Camel 试图通过私有/公共 SSH 密钥进行身份验证,并在没有公钥时回退到用户/密码身份验证,则使用以下路由配置:

from("sftp://localhost:9999/root?username=admin&password=admin&preferredAuthentications=publickey,password").
  to("bean:processFile");

111.18. 使用固定名称消耗单个文件

如果要下载单个文件并知道文件名,您可以使用 fileName=myFileName.txt 告知 Camel 要下载的文件名。默认情况下,使用者仍将执行 FTP LIST 命令来执行目录列表,然后根据 fileName 选项过滤这些文件。尽管在这个用例中,最好通过设置 List=false 来关闭目录列表。例如,用于登录 FTP 服务器的用户帐户可能不具有 FTP LIST 命令的权限。因此,您可以使用List=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);

111.19. 调试日志记录

此组件具有日志级别 TRACE,如果您遇到问题,会很有帮助。

111.20. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • File2

第 112 章 FTPS 组件

可作为 Camel 版本 2.2 提供

此组件通过 FTP 和 SFTP 协议提供对远程文件系统的访问。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ftp</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

如需更多信息,您可以查看 FTP 组件

112.1. URI 选项

以下选项适用于 FTPS 组件。

FTPS 组件支持 2 个选项,它们如下所列。

名称描述默认类型

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

FTPS 端点使用 URI 语法配置:

ftps:host:port/directoryName

使用以下路径和查询参数:

112.1.1. 路径名(3 参数):

名称描述默认类型

主机

FTP 服务器 所需的 主机名

 

字符串

port

FTP 服务器的端口

 

int

directoryName

启动目录

 

字符串

112.1.2. 查询参数(122 参数):

名称描述默认类型

binary (common)

指定文件传输模式 BINARY 或 ASCII。默认为 ASCII (false)。

false

布尔值

charset (common)

此选项用于指定文件的编码。您可以在使用者上使用此来指定文件的编码,允许 Camel 知道 charset,以便在访问文件内容时加载文件内容。同样在编写文件时,也可以使用这个选项来指定 charset 以写入该文件。请记住,在编写文件 Camel 时,可能需要读取消息内容到内存中,以便能够将数据转换为配置的 charset,因此如果您有较大消息,则不会使用此消息。

 

字符串

disconnect (common)

使用后是否与远程 FTP 服务器断开连接。断开连接只会断开当前与 FTP 服务器的连接。如果您有一个要停止的消费者,则需要停止消费者/路由。

false

布尔值

doneFileName (common)

制作者:如果提供,Camel 将在写入原始文件时写入 2 个操作文件。完成的文件将为空。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。生成的文件将始终写在与原始文件相同的文件夹中。消费者:如果提供,Camel 才会消耗文件(如果存在)文件。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。完成的文件始终与原始文件在同一文件夹中。只支持 $file.name 和 $file.name.noext 作为动态占位符。

 

字符串

fileName (common)

使用文件语言等表达式动态设置文件名。对于消费者,它被用作文件名过滤器。对于制作者而言,用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注:标题本身也可以是 Expression)。表达式选项支持 String 和 Expression 类型。如果表达式是 String 类型,则始终会使用文件语言来评估。如果表达式是 Expression 类型,则使用指定的 Expression 类型 - 这允许您使用 OGNL 表达式。对于消费者,您可以使用文件名来过滤文件名,因此您可以使用文件语言语法:mydata-$date:now:yyyyMMdd.txt。生产者支持 CamelOverruleFileName 标头,其优先级高于任何现有的 CamelFileName 标头;CamelOverruleFileName 只是一个标头,而且可以更轻松地进行临时存储 CamelFileName,且必须稍后恢复。

 

字符串

passiveMode (common)

设置被动模式连接。默认为 active 模式连接。

false

布尔值

separator (common)

设置要使用的路径分隔符。Unix = 使用 unix 风格路径分隔符 Windows = 使用 Windows 风格的路径分隔符 = Auto = (默认)在文件名称中使用现有路径分隔符

UNIX

PathSeparator

transferLoggingInterval Seconds (common)

配置记录上传和下载操作进程时的间隔(以秒为单位)。当操作需要较长时,这用于日志记录进度。

5

int

transferLoggingLevel (common)

配置日志级别,以便在记录上传和下载操作的进度时使用。

DEBUG

LoggingLevel

transferLoggingVerbose (common)

配置上传和下载操作进度的详细(细粒度)日志记录。

false

布尔值

fastExistsCheck (common)

如果将这个选项设置为 true,则 camel-ftp 将使用列表文件直接检查文件是否存在。由于某些 FTP 服务器可能不支持直接列出文件,如果 选项为 false,则 camel-ftp 将使用旧方法列出该目录并检查文件是否存在。这个选项还会影响 readLock=changed,以控制它执行快速检查来更新文件信息。如果 FTP 服务器具有很多文件,则这可用于加快进程速度。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

delete (consumer)

如果为 true,则在成功处理该文件后会删除该文件。

false

布尔值

moveFailed (consumer)

根据简单语言设置移动失败表达式。例如,将文件移动到 .error 子目录,请使用: .error。注意:将文件移动到故障位置 Camel 将处理错误,且不会再次选择该文件。

 

字符串

noop (consumer)

如果为 true,则该文件不会以任何方式移动或删除。此选项对于只读数据或者 ETL 类型要求是很好的选择。如果 noop=true,Camel 也将设置 idempotent=true,以避免再次消耗相同的文件。

false

布尔值

preMove (consumer)

用于在处理前动态设置文件名的表达式(如文件语言)。例如,要将 in-progres 文件移动到 order 目录中,把这个值设置为 order。

 

字符串

preSort (consumer)

启用预先排序后,消费者将在轮询过程中对文件和目录名称进行排序,该名称是从文件系统检索的。如果需要以有序的顺序处理文件,您可能希望执行此操作。预先排序是在消费者开始过滤之前执行,并接受 Camel 进行处理的文件。这个选项为 default=false 表示禁用。

false

布尔值

recursive (consumer)

如果某个目录也会在所有子目录中查找文件。

false

布尔值

resumeDownload (consumer)

配置是否启用恢复下载。FTP 服务器必须支持它(几乎所有 FTP 服务器都支持它)。另外,还必须配置 localWorkDirectory 选项,这样下载的文件会存储在本地目录中,必须启用 选项二进制文件,以支持下载恢复。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

streamDownload (consumer)

设置不使用本地工作目录时要使用的下载方法。如果设置为 true,则远程文件会在读取时流传输至路由。当设置为 false 时,在将远程文件发送到路由之前将远程文件加载到内存。

false

布尔值

directoryMustExist (consumer)

与 startDirectoryMustExist 类似,但这在轮询递归子目录期间应用。

false

布尔值

download (consumer)

FTP 用户是否应下载 文件。如果此选项设置为 false,则消息正文将为空,但使用者仍将触发 Camel Exchange,其具有文件名、文件大小等文件的详细信息。这只是文件不会下载。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

handleDirectoryParser AbsoluteResult (consumer)

如果目录解析器结果为绝对路径,则设置消费者如何处理子文件夹和文件。原因在于,一些 FTP 服务器可能会使用绝对路径返回文件名,如果是 FTP 组件需要处理这个路径,那么 FTP 组件需要通过将返回的路径转换为相对路径来进行处理。

false

布尔值

ignoreFileNotFoundOr PermissionError (consumer)

是否要忽略(尝试列出目录中的文件或在下载文件时),它们不存在或因为权限错误而存在。默认情况下,当目录或文件不存在或权限不足时,会抛出异常。将这个选项设置为 true 可强制忽略它。

false

布尔值

inProgressRepository (consumer)

可插拔插入存储库 org.apache.camel.spi.IdempotentRepository。in-progress 存储库用于考虑当前正在使用的进程文件中。默认情况下会使用基于内存的存储库。

 

IdempotentRepository

localWorkDirectory (consumer)

消耗时,可以使用本地工作目录直接将远程文件内容存储在本地文件中,以避免将内容加载到内存中。这在您消耗非常大的远程文件时很有用,因此可以节省内存。

 

字符串

onCompletionException Handler (consumer)

使用自定义 org.apache.camel.spi.ExceptionHandler 处理在完成过程中文件的异常,以处理使用者在完成过程中进行的提交或回滚。默认实现会将任何异常记录在 WARN 级别,并忽略。

 

ExceptionHandler

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

processStrategy (consumer)

可插拔 org.apache.camel.component.file.GenericFileProcessStrategy 允许您实施自己的 readLock 选项或类似内容。在文件被消耗(如有特殊就绪文件)之前,还可使用特殊条件。如果设置了这个选项,则不会应用 readLock 选项。

 

GenericFileProcess Strategy

receiveBufferSize (consumer)

仅由 FTPClient 使用的接收(download)缓冲区大小

32768

int

startingDirectoryMustExist (consumer)

启动目录是否必须存在。请注意,autoCreate 选项是默认的启用状态,这意味着如果起始目录不存在,通常会自动创建起始目录。您可以禁用 autoCreate 并启用它,以确保起始目录必须存在。如果目录不存在,将抛出异常。

false

布尔值

useList (consumer)

下载文件时是否允许使用 LIST 命令.默认为 true。在某些情况下,您可能需要下载特定文件,且不允许使用 LIST 命令,因此您可以将这个选项设置为 false。请注意,使用这个选项时,要下载的特定文件不包含 meta-data 信息,如文件大小、时间戳、权限等,因为这些信息仅在使用 LIST 命令时检索。

true

布尔值

fileExist (producer)

如果文件已存在相同名称的文件,应该怎么办?覆盖(默认)替换现有文件。append - 将内容添加到现有文件中。fail - 引发 GenericFileOperationException,这表示已有的文件。ignore - 静默忽略问题且不覆盖现有文件,但假设一切正常。move - 选项需要使用同时配置 moveExisting 选项。选项 eagerDeleteTargetFile 可用于控制移动文件要做什么,并且已存在一个现有文件,否则会导致移动操作失败。Move 选项将在编写目标文件之前移动任何现有文件。TryRename 仅在使用 tempFileName 选项时才适用。这样,可以在不做任何检查的情况下,尝试将文件从临时名称重命名为实际名称。在某些文件系统中,这个检查可能会更快,特别是 FTP 服务器。

覆盖

GenericFileExist

flatten (producer)

flatten 用于扁平化文件名路径,以剥离任何前导路径,因此这仅仅是文件名。这样,您可以以递归方式使用子目录,但当您将这些文件写入单个目录中时。在制作者上,在制作者上将强制将设置 CamelFileName 标头中的任何文件名用于任何领先的路径。

false

布尔值

jailStartingDirectory (producer)

用于判断(限制)将文件写入起始目录(和子目录)。默认情况下,启用此项以允许 Camel 将文件写入外部目录(从该框更受保护)。您可以关闭此目的,允许将文件写入起始目录之外的目录,如父级或根文件夹。

true

布尔值

moveExisting (producer)

配置 fileExist=Move 时要使用的表达式(如文件语言)。要将文件移动到备份子目录中,只需输入备份。这个选项只支持以下文件语言令牌:file:name、file:name.ext、file:name.noext、file:onlyname、file:onlyname.noext、file:ext 和 file:parent。注意 file:parent 不受 FTP 组件支持,因为 FTP 组件只能将任何现有文件移到基于当前 dir 的相对目录中。

 

字符串

tempFileName (producer)

与 tempPrefix 选项相同,但可以为临时文件名命名提供更精细的控制,因为它使用文件语言。

 

字符串

tempPrefix (producer)

这个选项用于使用临时名称写入文件,然后在写入完成后将其重命名为真实名称。可用于识别正在写入的文件,并避免消费者(不使用专用读取锁定)读取进度文件。上传较大的文件时通常由 FTP 使用。

 

字符串

allowNullBody (producer)

用于指定在写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,如果设为 false,并且试图向文件组件发送 null 正文,则使用"Cannot将 null body 写入空正文到 file.' 的 GenericFileWriteException 的 GenericFileWriteException 来抛出。'如果将 fileExist 选项设置为 'Override',则文件将被截断,如果设置为 append,则文件将保持不变。

false

布尔值

chmod (producer)

允许您在存储的文件上设置 chmod。例如 chmod=640。

 

字符串

disconnectOnBatchComplete (producer)

批处理上传完成后是否与远程 FTP 服务器断开连接。disconnectedOnBatchComplete 将仅断开当前与 FTP 服务器的连接。

false

布尔值

eagerDeleteTargetFile (producer)

是否完全删除任何现有的目标文件。这个选项只适用于使用 fileExists=Override 和 tempFileName 选项。您可以使用它来禁用(将其设置为 false)在写入 temp 文件前删除目标文件。例如,您可以写入大文件,并且希望目标文件在正在写入时存在。这样可保证目标文件仅在最后一开始删除,而在 temp 文件被重命名为目标文件名之前。这个选项还用来控制是否在启用 fileExist=Move 时删除任何现有文件,并且存在现有文件。如果此选项 copyAndDeleteOnRenameFails false,则在存在现有文件(如果其 true)存在时,则会抛出异常(如果存在),那么在移动操作前会删除现有文件。

true

布尔值

keepLastModified (producer)

将保留来自源文件(若有)的最后修改的时间戳。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或 long with timestamp。如果存在时间戳,并且启用 选项,它将对写入的文件设置此时间戳。注:此选项仅适用于文件制作者。您不能对任何 ftp 制作者使用这个选项。

false

布尔值

moveExistingFileStrategy (producer)

用于在配置 fileExist=Move 时移动带有特殊命名令牌的文件的策略(Custom 策略)。默认情况下,如果没有提供自定义策略,则使用实施

 

FileMoveExisting 策略

sendNoop (producer)

在上传文件到 FTP 服务器之前,是否以预先写入的方式发送 noop 命令。这默认是启用的,因为连接的验证仍然有效,这样可以静默地重新连接来上传文件。但是,如果这会导致问题,您可以关闭这个选项。

true

布尔值

activePortRange (advanced)

以活动模式设置客户端侧端口范围。其语法为: minPort-maxPort Both 端口号为,如 10000-19999,以包括所有 1xxxx 端口。

 

字符串

autoCreate (advanced)

在文件路径名称中自动创建缺失的目录。对于文件使用者,这意味着创建起始目录。对于文件制作者,这意味着文件应写入到其中的目录。

true

布尔值

bufferSize (advanced)

以字节为单位写入缓冲区大小。

131072

int

connectTimeout (advanced)

设置等待由 FTPClient 和 JSCH 使用的连接的连接超时

10000

int

ftpClient (advanced)

使用 FTPClient 的自定义实例

 

FTPClient

ftpClientConfig (advanced)

要使用自定义 FTPClientConfig 实例来配置端点应使用的 FTP 客户端。

 

FTPClientConfig

ftpClientConfigParameters (advanced)

FtpComponent 用于为 FTPClientConfig 提供额外的参数

 

map

ftpClientParameters (advanced)

FtpComponent 用于为 FTPClient 提供额外的参数

 

map

maximumReconnectAttempts (advanced)

指定在尝试连接到远程 FTP 服务器时,Camel 会执行的最大重新连接尝试。使用 0 禁用此行为。

 

int

reconnectDelay (advanced)

在执行重新连接尝试前,millis Camel 会等待延迟。

 

long

siteCommand (advanced)

设置在成功登录后要执行的可选的 site 命令。可以使用新行字符分隔多个站点命令。

 

字符串

soTimeout (advanced)

设置仅由 FTPClient 使用的 so 超时

300000

int

stepwise (advanced)

设置在下载文件时是否应采取措施更改目录,或在上传文件到目录时。例如,如果因为安全原因而无法更改 FTP 服务器上的目录,您可以禁用此设置。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

throwExceptionOnConnect Failed (advanced)

如果连接失败(费用)默认情况下不会抛出异常,则应该抛出异常,日志为 WARN。您可以使用此功能启用异常,并处理来自 org.apache.camel.spi.PollingConsumerPollStrategy rollback 方法的抛出异常。

false

布尔值

timeout (advanced)

设置数据超时,以等待仅由 FTPClient 使用回复

30000

int

antExclude (filter)

Ant 样式过滤器排除.如果使用 antInclude 和 antExclude,则 antExclude 优先于 antInclude。可以用逗号分隔的格式指定多个排除项。

 

字符串

antFilterCaseSensitive (filter)

在 at 过滤器中设置区分大小写的标记

true

布尔值

antInclude (filter)

Ant 风格过滤器包含.可以用逗号分隔的格式指定多个包含。

 

字符串

eagerMaxMessagesPerPoll (filter)

允许控制 maxMessagesPerPoll 的限制是预先控制。如果预先考虑,则限制会在扫描文件期间进行。如果为 false,则扫描所有文件,然后执行排序。将此选项设置为 false 可首先对所有文件进行排序,然后限制轮询。请注意,这需要较高的内存用量,因为所有文件详细信息都位于内存中来执行排序。

true

布尔值

exclude (filter)

如果文件名与 regex 模式匹配,则使用 排除文件(匹配是 in-senstive)。请注意,如果将这个符号配置为端点 uri,则需要使用 RAW ()语法等符号(如加号)进行配置。有关配置端点 uris 时的详情,请参阅

 

字符串

filter (filter)

可插入的过滤器作为 org.apache.camel.component.file.GenericFileFilter 类。如果过滤器在其 accept ()方法中返回 false,则将跳过文件。

 

GenericFileFilter

filterDirectory (filter)

根据简单语言过滤目录。例如,要过滤当前日期,您可以使用一个简单的日期模式,如 $date:now:yyyMMdd

 

字符串

filterFile (filter)

根据简单语言过滤文件。例如,要根据文件大小进行过滤,可以使用 $file:size 5000

 

字符串

idempotent (filter)

使用 Idempotent Consumer EIP 模式的选项允许 Camel 跳过已处理的文件。默认情况下,将使用包含 1000 条目的基于内存的 LRUCache。如果 noop=true 之后,将启用幂等性,以避免再次消耗相同的文件。

false

布尔值

idempotentKey (filter)

使用自定义幂等密钥。默认情况下,使用文件的绝对路径。您可以使用文件语言(例如,使用文件名和文件大小),您可以完成: idempotentKey=$file:name-$file:size

 

字符串

idempotentRepository (filter)

可插拔存储库 org.apache.camel.spi.IdempotentRepository,如果未指定,则默认使用 MemoryMessageIdRepository,并且幂等为 true。

 

IdempotentRepository

include (filter)

如果文件名与 regex 模式匹配,则用于包含文件(匹配区分大小写)。请注意,如果将这个符号配置为端点 uri,则需要使用 RAW ()语法等符号(如加号)进行配置。有关配置端点 uris 时的详情,请参阅

 

字符串

maxDepth (filter)

递归处理目录时要遍历的最大深度。

2147483647

int

maxMessagesPerPoll (filter)

定义要为每个轮询收集的最大消息。默认情况下没有设置最大值。可用于设置 e.g. 1000 的限制,以避免在启动存在数千台服务器时。将值设为 0 或负数设为 disabled。注意:如果使用这个选项正在使用,则文件和 FTP 组件将在任何排序前限制。例如,如果您有 100000 文件并使用 maxMessagesPerPoll=500,则只会提取前 500 个文件,然后排序。您可以使用 eagerMaxMessagesPerPoll 选项,将其设置为 false,以允许首先扫描所有文件,然后再排序。

 

int

minDepth (filter)

递归处理目录时开始处理的最小深度信息。使用 minDepth=1 意味着基础目录。使用 minDepth=2 表示第一个子目录。

 

int

Move (filter)

表达式(如简单语言),用于在处理后动态设置文件名。要将文件移动到 .done 子目录中,只需输入 .done。

 

字符串

exclusiveReadLockStrategy (lock)

可插拔 read-lock 作为 org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy 实施。

 

GenericFileExclusive ReadLockStrategy

readLock (lock)

供使用者使用,仅当文件具有独占的 read-lock 时(例如,该文件没有处于-progres 或被写入时)轮询文件。Camel 将等待文件锁定。此选项以策略形式提供构建:无 - 无读取锁定在使用 markerFile - Camel 创建一个标志文件(fileName.camelLock),然后保存锁定。FTP 组件更改的这个选项 - 更改使用文件长度/修改时间戳来检测当前正在复制的文件。将至少使用 1 sec 来确定这一点,因此此选项无法像其他形式使用文件一样迅速使用,但由于 JDK IO API 无法始终确定文件当前是否正在被另一个进程使用。选项 readLockCheckInterval 可用于设置检查频率。fileLock - 用于使用 java.nio.channels.FileLock。这个选项不适用于 Windows 或 FTP 组件。在通过 mount/share 访问远程文件系统时,应该避免这种方法,除非文件系统支持分布式文件锁定。重命名 - 使用重命名文件作为测试,如果我们可以获得独占的 read-lock。幂等 - (对于文件组件)幂等的幂等性是使用 idempotentRepository 作为 read-lock 的 read-lock。这允许在幂等存储库实现支持集群时使用读取锁定,该锁定支持集群。幂等更改 - (对于文件组件)使用 idempotentRepository,并随着合并的 read-lock 改变。这允许使用支持集群的读取锁定,如果幂等存储库实施支持集群。幂等-rename - ( file 组件)幂等-rename 使用 idempotentRepository 并将 重命名为 combined read-lock。这允许在幂等存储库实现支持的情况下使用支持集群的读取锁定。注意:各种读取锁定不适用于在集群模式下工作,不同节点上的并发用户对共享文件系统上的相同文件都竞争。使用接近 atomic 操作来创建空的标志文件,但它无法保证在集群中工作。fileLock 可以更好地工作,但文件系统需要支持分布式文件锁定,以此类推。如果幂等存储库支持集群(如 Hazelcast 组件或 Infinispan),则使用幂等的读取锁定可以支持集群。

none

字符串

readLockCheckInterval (lock)

read-lock 的间隔(如果被读取锁定支持)。这个间隔用于在尝试获取读取锁定间进行睡眠状态。例如,在使用 changed 的 read lock 时,您可以将更高的间隔周期设置为 cater 以慢速写入。如果制作者非常慢,写入文件,则默认为 1 sec.。注意:对于 FTP 默认 readLockCheckInterval 为 5000。readLockTimeout 值必须大于 readLockCheckInterval,但经验规则至少为 2 个或更多或更多为 readLockCheckInterval。这需要确保读取锁定进程允许修改时间尝试在超时达到前获取锁。

1000

long

readLockDeleteOrphanLock Files (lock)

如果 Camel 未正确关闭,则启动时是否应该在启动时使用标志文件读取锁定文件来读取锁定文件(如 JVM 崩溃)。如果将此选项转换为 false,则任何孤立的锁定文件将导致 Camel 无法启动该文件,这可能是因为另一个节点同时从同一共享目录中读取文件。

true

布尔值

readLockIdempotentRelease Async (lock)

延迟发行版本任务应该是同步还是异步。请参阅 readLockIdempotentReleaseDelay 选项的详情。

false

布尔值

readLockIdempotentRelease AsyncPoolSize (lock)

使用异步发行任务时调度线程池中的线程数量。使用默认 1 个核心线程几乎应该已经足够了,只有更新幂等存储库或需要处理大量文件时,它才会将其设置为更高的值。如果您通过配置 readLockIdempotentReleaseExecutorService 选项,则使用这个选项。请参阅 readLockIdempotentReleaseDelay 选项的详情。

 

int

readLockIdempotentRelease Delay (lock)

是否延迟发布任务在millis 的期间。在带有共享幂等库的主动/主动集群场景中使用共享幂等存储库来确保其他节点无法扫描和获取同一文件,这可用于延迟发行任务以扩展窗口。通过扩展发行任务的 time-window 有助于防止这些情况。只有在将 readLockRemoveOnCommit 配置为 true 时,才需要注意延迟。

 

int

readLockIdempotentRelease ExecutorService (lock)

要将自定义和共享线程池用于异步发行任务。请参阅 readLockIdempotentReleaseDelay 选项的详情。

 

ScheduledExecutor 服务

readLockLoggingLevel (lock)

无法获取读取锁定时使用的日志记录级别。默认情况下记录 WARN。您可以更改此级别,例如,变为 OFF 以没有任何日志。这个选项仅适用于 readLock 类型的 readLock: changed、fileLock、幂等、幂等更改、幂等名称、重命名。

DEBUG

LoggingLevel

readLockMarkerFile (lock)

是否使用带 changed、重命名或专用读锁定类型的标记文件。默认情况下,也可使用标志文件来保护其他进程的获取相同的文件。可以通过将此选项设置为 false 来关闭此行为。例如,如果您不想将标记文件写入 Camel 应用程序的文件系统。

true

布尔值

readLockMinAge (lock)

此选项仅适用于 readLock=changed。它允许在尝试获取读取锁定前指定文件的最短期限。例如,使用 readLockMinAge=300s 来要求文件最多 5 分钟。这可能会加快更改的读取锁定,因为它只会试图获取至少是给定期限的文件。

0

long

readLockMinLength (lock)

此选项仅适用于 readLock=changed。它允许您配置最小长度。默认情况下,Camel 预期文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度的文件。

1

long

readLockRemoveOnCommit (lock)

此选项仅适用于 readLock=idempotent。它允许您指定在处理文件成功并且提交发生时是否从幂等存储库中删除文件名条目。默认情况下,该文件不会被删除,以确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可能会支持驱除策略,您可以配置在 X 分钟后驱除文件名条目 - 这可确保出现竞争条件的问题。请参阅 readLockIdempotentReleaseDelay 选项的详情。

false

布尔值

readLockRemoveOnRollback (lock)

此选项仅适用于 readLock=idempotent。它允许您指定在处理文件失败时是否从幂等存储库中删除文件名条目,并进行回滚。如果此选项为 false,则文件名条目已确认(如同文件提交一样)。

true

布尔值

readLockTimeout (lock)

如果 read-lock 支持,则 millis 中的可选超时。如果无法授予 read-lock 且触发超时,则 Camel 将跳过该文件。下次轮询 Camel 时,将重试文件,此时可能会授予 read-lock。使用 0 或 lower 值来永久指示。目前,fileLock,更改并重命名支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000,而不是 10000。readLockTimeout 值必须大于 readLockCheckInterval,但经验规则至少为 2 个或更多或更多为 readLockCheckInterval。这需要确保读取锁定进程允许修改时间尝试在超时达到前获取锁。

10000

long

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

shuffle (sort)

要取消文件列表(以随机顺序排序)

false

布尔值

sortBy (sort)

内置使用文件语言排序.支持嵌套的排序,因此您可以按文件名排序,并根据修改日期进行排序。

 

字符串

排序 器(排序)

可插拔排序器作为 java.util.Comparator 类。

 

比较器

帐户 (安全)

用于登录的帐户

 

字符串

disableSecureDataChannel Defaults (security)

使用这个选项禁用使用安全数据频道时的默认选项。这可让您完全控制应使用 execPbsz 和 execProt 设置的内容。默认为 false

false

布尔值

execPbsz (security)

使用安全数据频道时,您可以设置 exec 保护缓冲区大小

 

Long

execProt (security)

exec 保护级别 PROT 命令。c - 清除 S - Safe (仅限 SSL 协议)E- Confidential (SSL 协议) P - 私有

 

字符串

ftpClientKeyStore Parameters (security)

设置密钥存储参数

 

map

ftpClientTrustStore Parameters (security)

设置信任存储参数

 

map

isImplicit (security)

设置安全模式(Implicit/Explicit). true - Implicit Mode / False - Explicit Mode

false

布尔值

密码 (安全)

用于登录的密码

 

字符串

securityProtocol (security)

设置底层安全协议。

TLS

字符串

sslContextParameters (security)

获取 JSSE 配置,可覆盖 FtpsEndpoint#ftpClientKeyStoreParameters、ftpClientTrustStoreParameters 和 FtpsConfiguration#getSecurityProtocol ()中的任何设置。

 

SSLContextParameters

username (security)

用于登录的用户名

 

字符串

112.2. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.ftps.enabled

启用 ftps 组件

true

布尔值

camel.component.ftps.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.ftps.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

第 113 章 Ganglia Component

作为 Camel 版本 2.15 可用

提供将值(消息正文)作为指标发送到 Ganglia 监控系统的机制。  使用 gmetric4j 库。  可与标准 GangliaJMXetric 一起使用,以通过单一平台监控操作系统、JVM 和业务流程的指标。

运行 JVM 的机器上应该有一个 Ganglia gmond 代理。  gmond 向 Ganglia 基础架构发送心跳,Chel-ganglia 无法当前发送 heartbeat 本身。

在大多数 Linux 系统上(Debian、Ubuntu、Fedora 和 RHEL/CentOS)您只能安装 Ganglia 代理软件包,并使用多播配置自动运行。  如果您愿意,您可以将它配置为使用常规 UDP 单播。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

 

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ganglia</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

113.1. URI 格式

ganglia:address:port[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

113.2. Ganglia 组件和端点 URI 选项

Ganglia 组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享配置

 

GangliaConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Ganglia 端点使用 URI 语法进行配置:

ganglia:host:port

使用以下路径和查询参数:

113.2.1. 路径名(2 参数):

名称描述默认类型

主机

Ganglia 服务器的主机名

239.2.11.71

字符串

port

Ganglia 服务器的端口

8649

int

113.2.2. 查询参数(13 参数):

名称描述默认类型

dmax (producer)

Ganglia 之前的 minumum 时间(以秒为单位)会在指标值过期时清除指标值。设置为 0,值将无限期地保留在 Ganglia,直到 gmond 代理重启为止。

0

int

groupName (producer)

指标所属的组。

java

字符串

metricName (producer)

用于指标的名称。

metric

字符串

mode (producer)

使用 MULTICAST 或 UNICAST 发送 UDP 指标数据包

多播

UDPAddressingMode

prefix (producer)

为指标名称加上下划线。

 

字符串

slope (producer)

slope

两者

GMetricSlope

spoofHostname (producer)

欺骗信息 IP:hostname

 

字符串

tmax (producer)

值可被视为当前时间(以秒为单位)。之后,Ganglia 认为值已过期。

60

int

ttl (producer)

如果使用多播,请设置数据包的 TTL

5

int

type (producer)

值的类型

字符串

GMetricType

units (producer)

量化指标(如小部件、litres 和 bytes)的任何测量单位。不要包括 k (kilo)或 m (milli)等前缀,其他工具可能会在以后扩展这个单元。该值应该被取消缩放。

 

字符串

wireFormat31x (producer)

使用 Ganglia 3.1.0 及更高版本的线格式。将其设置为 false 来使用 Ganglia 3.0.x 或更早版本。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

113.3. Spring Boot Auto-Configuration

组件支持 16 个选项,如下所示。

名称描述默认类型

camel.component.ganglia.configuration.dmax

Ganglia 之前的 minumum 时间(以秒为单位)会在指标值过期时清除指标值。设置为 0,值将无限期地保留在 Ganglia,直到 gmond 代理重启为止。

0

整数

camel.component.ganglia.configuration.group-name

指标所属的组。

java

字符串

camel.component.ganglia.configuration.host

Ganglia 服务器的主机名

239.2.11.71

字符串

camel.component.ganglia.configuration.metric-name

用于指标的名称。

metric

字符串

camel.component.ganglia.configuration.mode

使用 MULTICAST 或 UNICAST 发送 UDP 指标数据包

 

GMetric$UDP AddressingMode

camel.component.ganglia.configuration.port

Ganglia 服务器的端口

8649

整数

camel.component.ganglia.configuration.prefix

为指标名称加上下划线。

 

字符串

camel.component.ganglia.configuration.slope

slope

 

GMetricSlope

camel.component.ganglia.configuration.spoof-hostname

欺骗信息 IP:hostname

 

字符串

camel.component.ganglia.configuration.tmax

值可被视为当前时间(以秒为单位)。之后,Ganglia 认为值已过期。

60

整数

camel.component.ganglia.configuration.ttl

如果使用多播,请设置数据包的 TTL

5

整数

camel.component.ganglia.configuration.type

值的类型

 

GMetricType

camel.component.ganglia.configuration.units

量化指标(如小部件、litres 和 bytes)的任何测量单位。不要包括 k (kilo)或 m (milli)等前缀,其他工具可能会在以后扩展这个单元。该值应该被取消缩放。

 

字符串

camel.component.ganglia.configuration.wire-format31x

使用 Ganglia 3.1.0 及更高版本的线格式。将其设置为 false 来使用 Ganglia 3.0.x 或更早版本。

true

布尔值

camel.component.ganglia.enabled

启用 ganglia 组件

true

布尔值

camel.component.ganglia.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

113.4. 邮件正文

正文中的任何值(如字符串或数字类型)都将发送到 Ganglia 系统。

113.5. 返回值/响应

Ganglia 使用单向 UDP 或多播发送指标。  邮件正文没有响应或更改。

113.6. 例子

113.6.1. 发送字符串指标

消息正文将转换为 String,并作为指标值发送。  与数字指标不同,String 值不能显示,但 Ganglia 使其可用于报告。  每个 Ganglia 主机页面顶部的 os_version 字符串是一个 String 指标示例。

from("direct:string.for.ganglia")
    .setHeader(GangliaConstants.METRIC_NAME, simple("my_string_metric"))
    .setHeader(GangliaConstants.METRIC_TYPE, GMetricType.STRING)
    .to("direct:ganglia.tx");

from("direct:ganglia.tx")
    .to("ganglia:239.2.11.71:8649?mode=MULTICAST&prefix=test");

113.6.2. 发送数字指标

from("direct:value.for.ganglia")
    .setHeader(GangliaConstants.METRIC_NAME, simple("widgets_in_stock"))
    .setHeader(GangliaConstants.METRIC_TYPE, GMetricType.UINT32)
    .setHeader(GangliaConstants.METRIC_UNITS, simple("widgets"))
    .to("direct:ganglia.tx");

from("direct:ganglia.tx")
    .to("ganglia:239.2.11.71:8649?mode=MULTICAST&prefix=test");

第 114 章 Geocoder 组件

作为 Camel 2.12 版本提供

geocoder: 组件用于查找给定地址的 geocode (字符和度)或反向查找。组件 对 Google Geocoder 库使用 Java API

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-geocoder</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

114.1. URI 格式

geocoder:address:name[?options]
geocoder:latlng:latitude,longitude[?options]

114.2. 选项

Geocoder 组件没有选项。

Geocoder 端点使用 URI 语法进行配置:

geocoder:address:latlng

使用以下路径和查询参数:

114.2.1. 路径名(2 参数):

名称描述默认类型

address

应该带有地址前缀的 geo 地址:

 

字符串

latlng

应该以 latlng 前缀的地球关系和长度:

 

字符串

114.2.2. 查询参数(13 参数):

名称描述默认类型

headersOnly (producer)

不论是否仅丰富带标头的 Exchange,还是使正文保持原样。

false

布尔值

language (producer)

要使用的语言。

en

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

proxyAuthDomain (proxy)

代理 NTML 验证的域

 

字符串

proxyAuthHost (proxy)

用于代理 NTML 身份验证的可选主机

 

字符串

proxyAuthMethod (proxy)

代理的身份验证方法,可以是 Basic、Digest 或 NTLM。

 

字符串

proxyAuthPassword (proxy)

用于代理验证的密码

 

字符串

proxyAuthUsername (proxy)

用于代理身份验证的用户名

 

字符串

proxyHost (proxy)

代理主机名

 

字符串

proxyPort (proxy)

代理端口号

 

整数

apiKey (security)

使用 google apiKey

 

字符串

clientId (security)

使用带有这个客户端 ID 的 google 高级

 

字符串

clientKey (security)

使用 google premium 带有这个客户端密钥

 

字符串

114.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.geocoder.enabled

启用 geocoder 组件

true

布尔值

camel.component.geocoder.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

114.4. 交换数据格式

Camel 将以 com.google.code.geocoder.model.GeocodeResponse 类型形式提供正文。
如果地址为 "current",则响应为 String 类型,其 JSON 表示当前位置。

如果选项 headersOnly 设为 true,则邮件正文将保留原样,并且只有标头才会添加到 Exchange 中。

114.5. 消息标头

标头描述

CamelGeoCoderStatus

必需。geocoder 库中的状态代码。如果状态为 GeocoderStatus.OK,则需要额外的标头

CamelGeoCoderAddress

格式化的地址

CamelGeoCoderLat

位置的感度。

CamelGeoCoderLng

地点范围。

CamelGeoCoderLatlng

各个位置的感度和长度。用逗号分开。

CamelGeoCoderCity

城市长名称。

CamelGeoCoderRegionCode

区域代码。

CamelGeoCoderRegionName

区域名称。

CamelGeoCoderCountryLong

国家/地区长名称。

CamelGeoCoderCountryShort

国家/地区短名称。

CamelGeoCoderPostalCode

邮政编码。

请注意,根据所使用的数据和模式,可能无法提供所有标头(地址与 latlng)。

114.6. Samples

在下面的示例中,我们获得法国和法国的态度

  from("direct:start")
    .to("geocoder:address:Paris, France")

如果您向 CamelGeoCoderAddress 提供标头,则会覆盖端点配置,因此要获取 Copenhagen 的位置,Denmark 我们可以使用所示的标头发送消息:

template.sendBodyAndHeader("direct:start", "Hello", GeoCoderConstants.ADDRESS, "Copenhagen, Denmark");

要获得我们可以做到的一度和长度的地址:

  from("direct:start")
    .to("geocoder:latlng:40.714224,-73.961452")
    .log("Location ${header.CamelGeocoderAddress} is at lat/lng: ${header.CamelGeocoderLatlng} and in country ${header.CamelGeoCoderCountryShort}")

哪个日志

Location 285 Bedford Avenue, Brooklyn, NY 11211, USA is at lat/lng: 40.71412890,-73.96140740 and in country US

要获得当前位置,您可以使用"current"作为地址,如下所示:

  from("direct:start")
    .to("geocoder:address:current")

第 115 章 Git 组件

作为 Camel 版本 2.16 可用

git: 组件允许您使用通用 Git 存储库。 

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-git</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

URI 格式

git://localRepositoryPath[?options]

115.1. URI 选项

制作者允许在特定存储库上执行操作。
使用者允许在特定存储库上消耗提交、标签和分支。

Git 组件没有选项。

Git 端点使用 URI 语法配置:

git:localPath

使用以下路径和查询参数:

115.1.1. 路径名(1 参数):

名称描述默认类型

localPath

所需的 Local 仓库路径

 

字符串

115.1.2. 查询参数(13 参数):

名称描述默认类型

branchName (common)

工作所在分支名称

 

字符串

password (common)

远程存储库密码

 

字符串

remoteName (common)

在特定操作中使用的远程存储库名称,如 pull

 

字符串

remotePath (common)

远程仓库路径

 

字符串

tagName (common)

工作的标签名称

 

字符串

username (common)

远程存储库用户名

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

type (consumer)

使用者类型

 

GitType

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

allowEmpty (producer)

管理空 git 提交的标志

true

布尔值

operation (producer)

在仓库中执行的操作

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

115.2. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.git.enabled

启用 git 组件

true

布尔值

camel.component.git.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

115.3. 消息标头

名称默认值类型Context描述

CamelGitOperation

null

字符串

制作者

如果不将作为端点选项指定在存储库上执行的操作

CamelGitFilename

null

字符串

制作者

添加操作中的文件名

CamelGitCommitMessage

null

字符串

制作者

与提交操作相关的提交消息

CamelGitCommitUsername

null

字符串

制作者

提交操作中的提交用户名

CamelGitCommitEmail

null

字符串

制作者

提交操作中的提交电子邮件

CamelGitCommitId

null

字符串

制作者

提交 ID

CamelGitAllowEmpty

null

布尔值

制作者

管理空 git 提交的标志

115.4. producer 示例

以下是一个制作者的路由,它添加文件 test.java 到本地存储库,使用 master 分支上的特定消息提交它,然后将其推送到远程存储库。

from("direct:start")
        .setHeader(GitConstants.GIT_FILE_NAME, constant("test.java"))
        .to("git:///tmp/testRepo?operation=add")
        .setHeader(GitConstants.GIT_COMMIT_MESSAGE, constant("first commit"))
        .to("git:///tmp/testRepo?operation=commit")
        .to("git:///tmp/testRepo?operation=push&remotePath=https://foo.com/test/test.git&username=xxx&password=xxx")
        .to("git:///tmp/testRepo?operation=createTag&tagName=myTag")
        .to("git:///tmp/testRepo?operation=pushTag&tagName=myTag&remoteName=origin")

115.5. 消费者示例

以下是消耗提交的使用者路由示例:

from("git:///tmp/testRepo?type=commit")
                        .to(....)

第 116 章 GitHub Component

作为 Camel 版本 2.15 可用

GitHub 组件通过封装 egit-github 与 GitHub API 交互。它目前为新的拉取请求、拉取请求注释、标签和提交提供轮询。 它还能够在拉取请求上生成注释,并彻底关闭拉取请求。

此端点不通过 Webhook 依赖于简单的轮询功能。原因包括:

  • 可靠性/可靠性的关注
  • 我们轮询的有效负载类型通常不大(另外,API 中提供了分页)
  • 需要支持在某个地方无法公开运行的应用程序,如果 Webhook 发生故障

请注意,GitHub API 非常到期。 因此,此组件可轻松扩展以提供额外的交互。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-github</artifactId>
    <version>${camel-version}</version>
</dependency>

116.1. URI 格式

github://endpoint[?options]

116.2. 必填选项:

请注意,这些可以通过端点直接配置。

GitHub 组件没有选项。

GitHub 端点使用 URI 语法配置:

github:type/branchName

使用以下路径和查询参数:

116.2.1. 路径名(2 参数):

名称描述默认类型

type

执行所需的 git 操作

 

GitHubType

branchName

分支名称

 

字符串

116.2.2. 查询参数(12 参数):

名称描述默认类型

oauthToken (common)

GitHub OAuth 令牌,除非提供用户名和密码

 

字符串

password (common)

GitHub 密码,除非提供了 oauthToken

 

字符串

repoName (common)

所需的 GitHub 存储库名称

 

字符串

repoOwner (common)

所需的 GitHub 存储库所有者(organization)

 

字符串

username (common)

GitHub 用户名,除非提供了 oauthToken

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

encoding (producer)

在获取 git 提交文件时使用给定编码

 

字符串

state (producer)

设置 git commit status 状态

 

字符串

targetUrl (producer)

设置 git commit status 目标 url

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

116.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.github.enabled

启用 github 组件

true

布尔值

camel.component.github.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

116.4. 消费者端点:

端点Context正文类型

pullRequest

轮询

org.eclipse.egit.github.core.PullRequest

pullRequestComment

轮询

org.eclipse.egit.github.core.Comment (针对一般的拉取请求讨论)或 org.eclipse.egit.github.core.CommitComment (拉取请求 diff 的评论)

tag

轮询

org.eclipse.egit.github.core.RepositoryTag

commit

轮询

org.eclipse.egit.github.core.RepositoryCommit

116.5. 制作者端点:

端点Body消息标头

pullRequestComment

字符串(注释文本)

- GitHubPullRequest (整数)(REQUIRED): Pull request number。

- GitHubInResponseTo (整数):如果响应拉取请求 diff 上的另一个内联注释,则需要。如果省略,则假定为拉取请求讨论的一般注释。

closePullRequest

none

- GitHubPullRequest (整数)(REQUIRED): Pull request number。

createIssue (From Camel 2.18)

字符串(签发的正文文本)

- GitHubIssueTitle (字符串)(REQUIRED):问题标题。

第 117 章 GZip DataFormat

可作为 Camel 版本 2.0 提供

GZip 数据格式是消息压缩和解压缩格式。它使用与 Zip DataFormat 中使用的相同防御算法,但提供了一些额外的标头。这个格式由常用的 gzip/gunzip 工具生成。在端点使用 GZip 解压缩消息之前,可以使用 GZip 解压缩消息来取消总结使用 GZip 压缩。当您处理大量 XML 和基于文本的有效负载时,或者当您使用 gzip 工具读取消息时,压缩功能非常有用。

117.1. 选项

GZip 数据格式支持 1 选项,它们如下所列。

名称默认Java 类型描述

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

117.2. marshal

在本例中,我们将一个常规文本/XML 有效负载传输到压缩的有效负载中,使用 gzip 压缩格式并将其发送名为 MY_QUEUE 的 ActiveMQ 队列。

from("direct:start").marshal().gzip().to("activemq:queue:MY_QUEUE");

117.3. unmarshal

在本例中,我们从名为 MY_QUEUE 的 ActiveMQ 队列传播出 gzip 的有效负载,并将其转发到 UnGZippedMessageProcessor

from("activemq:queue:MY_QUEUE").unmarshal().gzip().process(new UnGZippedMessageProcessor());

117.4. 依赖项

此数据格式以 camel-core 提供,因此不需要额外的依赖项。

第 118 章 Google BigQuery Component

可作为 Camel 版本 2.20 可用

118.1. 组件描述

Google Bigquery 组件通过 Google Client Services API 提供对 Cloud BigQuery 基础架构 的访问。

当前实现不使用 gRPC。

当前实施不支持查询 BigQuery i.e。这是仅制作者。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-google-bigquery</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

118.2. 身份验证配置

Google BigQuery 组件身份验证用于 GCP 服务帐户。如需更多信息,请参阅 Google Cloud Platform Auth 指南

Google 安全凭证可以通过以下两个选项之一明确设置:

  • 服务帐户电子邮件和服务帐户密钥(PEM 格式)
  • GCP 凭证文件位置

如果同时设置了两者,则服务帐户电子邮件/密钥将优先使用。

或者隐式,连接工厂返回到 Application Default Credentials

模糊!默认凭据文件的位置可以配置 - 通过 GOOGLE_APPLICATION_CREDENTIALS 环境变量。

Service Account Email 和 Service Account Key 可以在 GCP JSON 凭证文件中分别作为 client_email 和 private_key 中找到。

118.3. URI 格式

        google-bigquery://project-id:datasetId[:tableId]?[options]

118.4. 选项

Google BigQuery 组件支持 4 个选项,它们如下所列。

名称描述默认类型

projectId (producer)

Google Cloud Project Id

 

字符串

datasetId (producer)

BigQuery Dataset Id

 

字符串

connectionFactory (producer)

ConnectionFactory 以获取与 Bigquery 服务的连接。如果未使用默认选项

 

GoogleBigQuery ConnectionFactory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Google BigQuery 端点使用 URI 语法进行配置:

google-bigquery:projectId:datasetId:tableName

使用以下路径和查询参数:

118.4.1. 路径名(3 参数):

名称描述默认类型

projectId

所需的 Google Cloud Project Id

 

字符串

datasetId

所需的 BigQuery 数据集 Id

 

字符串

tableId

BigQuery 表 ID

 

字符串

118.4.2. 查询参数(3 参数):

名称描述默认类型

connectionFactory (producer)

ConnectionFactory 以获取与 Bigquery 服务的连接。如果未提供默认值,则将使用。

 

GoogleBigQuery ConnectionFactory

useAsInsertId (producer)

用作插入 ID 的字段名称

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

118.5. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.google-bigquery.dataset-id

BigQuery Dataset Id

 

字符串

camel.component.google-bigquery.enabled

是否启用 google-bigquery 组件自动配置。默认启用。

 

布尔值

camel.component.google-bigquery.project-id

Google Cloud Project Id

 

字符串

camel.component.google-bigquery.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

118.6. 消息标头

名称类型描述

CamelGoogleBigQuery.TableSuffix

字符串

插入数据时要使用的表后缀

CamelGoogleBigQuery.InsertId

字符串

插入数据时要使用的 InsertId

CamelGoogleBigQuery.PartitionDecorator

字符串

分区 decorator 来指示在插入数据时要使用的分区

CamelGoogleBigQuery.TableId

字符串

提交数据的表 ID。如果指定,则将覆盖端点配置

118.7. 生产端点

制作者端点可以接受并传送到 BigQuery 个人,并分组的交换。分组的交换设置有 Exchange.GROUPED_EXCHANGE 属性。

Goole BigQuery producer 将在单个 api 调用中发送一组交换,除非指定了不同的表后缀或分区 decorators,在这种情况下,它会破坏它以确保数据以正确的后缀或分区 decorator 编写。

Google BigQuery 端点需要有效负载可以是映射或映射列表。包含映射的有效负载将插入一行,并且包含一个含有映射列表列表的有效负载,将对列表中的每个条目插入一行。

118.8. 模板表

参考资料 :https://cloud.google.com/bigquery/streaming-data-into-bigquery#template-tables

templated 表可以使用 GoogleBigQueryConstants.TABLE_SUFFIX 标头来指定。

i.e。以下路由将每天创建表并插入记录分片:

from("direct:start")
.header(GoogleBigQueryConstants.TABLE_SUFFIX, "_${date:now:yyyyMMdd}")
.to("google-bigquery:sampleDataset:sampleTable")

请注意,建议将分区用于此用例。

118.9. 分区

参考资料 :https://cloud.google.com/bigquery/docs/creating-partitioned-tables

在创建表时指定分区,如果设置数据将自动分区到单独的表中。通过在交换上设置 GoogleBigQueryConstants.PARTITION_DECORATOR 标头来指定特定分区时。

118.10. 确保数据一致性

参考资料 :https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency

可以通过标头 GoogleBigQueryConstants.INSERT_ID 或指定查询参数 useAsInsertId 来设置插入 ID。当有效负载是列表时,就需要指定插入交换标头的行时插入的插入 id - 如果有效负载列表是 GoogleBigQueryConstants.INSERT_ID 将被忽略。在这种情况下,请使用查询参数 useAsInsertId

第 119 章 Google Calendar 组件

作为 Camel 版本 2.15 可用

Google Calendar 组件通过 Google Calendar Web API 提供对 Google Calendar 的访问。

Google Calendar 使用 OAuth 2.0 协议 对 Google 帐户进行身份验证并授权访问用户数据。在使用此组件前,您需要 创建帐户并生成 OAuth 凭证。凭证包括 clientId、clientSecret 和 refreshToken。生成长期刷新Token 的方便资源是 OAuth playground

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-google-calendar</artifactId>
            <version>2.15.0</version>
    </dependency>

119.1. 1. Google Calendar 选项

Google Calendar 组件支持 3 个选项,它们如下所列。

名称描述默认类型

configuration (common)

使用共享配置

 

GoogleCalendar Configuration

clientFactory (advanced)

使用 GoogleCalendarClientFactory 作为创建客户端的工厂。默认使用 BatchGoogleCalendarClientFactory

 

GoogleCalendarClient Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Google Calendar 端点使用 URI 语法进行配置:

google-calendar:apiName/methodName

使用以下路径和查询参数:

119.1.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

GoogleCalendarApiName

methodName

所选操作需要什么子操作

 

字符串

119.1.2. 查询参数(14 参数):

名称描述默认类型

accessToken (common)

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

applicationName (common)

Google calendar 应用名称。示例应为 camel-google-calendar/1.0

 

字符串

clientId (common)

日历应用程序的客户端 ID

 

字符串

clientSecret (common)

日历应用程序的客户端机密

 

字符串

emailAddress (common)

Google 服务帐户的电子邮件地址。

 

字符串

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

p12FileName (common)

带有用于 Google Service Account 的私钥的 p12 文件的名称。

 

字符串

refreshToken (common)

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

scopes (common)

指定您希望日历应用程序对用户帐户的权限级别。您可以用逗号分隔多个范围。如需更多信息,请参阅 https://developers.google.com/google-apps/calendar/auth

https://www.googleapis.com/auth/calendar

字符串

user (common)

应用程序试图在服务帐户流中模拟用户的电子邮件地址

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

119.2. Spring Boot Auto-Configuration

组件支持 14 个选项,它们如下所列。

名称描述默认类型

camel.component.google-calendar.client-factory

使用 GoogleCalendarClientFactory 作为创建客户端的工厂。默认情况下,将使用批处理GoogleCalendarClientFactory。选项是一个 org.apache.camel.component.google.calendar.GoogleCalendarClientFactory 类型。

 

字符串

camel.component.google-calendar.configuration.access-token

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

camel.component.google-calendar.configuration.api-name

要执行的操作种类

 

GoogleCalendarApiName

camel.component.google-calendar.configuration.application-name

Google calendar 应用名称。示例应为 camel-google-calendar/1.0

 

字符串

camel.component.google-calendar.configuration.client-id

日历应用程序的客户端 ID

 

字符串

camel.component.google-calendar.configuration.client-secret

日历应用程序的客户端机密

 

字符串

camel.component.google-calendar.configuration.email-address

Google 服务帐户的电子邮件地址。

 

字符串

camel.component.google-calendar.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.google-calendar.configuration.p12-file-name

带有用于 Google Service Account 的私钥的 p12 文件的名称。

 

字符串

camel.component.google-calendar.configuration.refresh-token

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

camel.component.google-calendar.configuration.scopes

指定您希望日历应用程序对用户帐户的权限级别。您可以用逗号分隔多个范围。如需更多信息,请参阅 https://developers.google.com/google-apps/calendar/auth

https://www.googleapis.com/auth/calendar

字符串

camel.component.google-calendar.configuration.user

应用程序试图在服务帐户流中模拟用户的电子邮件地址

 

字符串

camel.component.google-calendar.enabled

启用 google-calendar 组件

true

布尔值

camel.component.google-calendar.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

119.3. URI 格式

GoogleCalendar 组件使用以下 URI 格式:

        google-calendar://endpoint-prefix/endpoint?[options]

端点前缀可以是以下之一:

  • acl
  • calendars
  • Channels
  • colors
  • 事件
  • freebusy
  • list
  • 设置

119.4. 生产端点

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 URI MUST 包含一个前缀。

不是必需的端点选项由 [] 表示。如果端点没有强制选项,则会提供一组 [] 选项 MUST。制作者端点也可以使用特殊选项 inBody,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelGoogleCalendar.<option> 的格式。请注意,inBody 选项会覆盖消息标头,例如,Body=option 中的 endpoint 选项会覆盖 CamelGoogleCalendar.option 标头。

119.5. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

119.6. 消息标头

任何 URI 选项都可以在具有 CamelGoogleCalendar. 前缀的生产端点的消息标头中提供。

119.7. Message Body

所有结果消息正文都使用由 GoogleCalendarComponent 使用的底层 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息。    

第 120 章 Google Calendar Stream Component

作为 Camel 版本 2.23 可用

Google Calendar 组件通过 Google Calendar Web API 提供对 Calendar 的访问。

Google Calendar 使用 OAuth 2.0 协议 对 Google 帐户进行身份验证并授权访问用户数据。在使用此组件前,您需要 创建帐户并生成 OAuth 凭证。凭证包括 clientId、clientSecret 和 refreshToken。生成长期刷新Token 的方便资源是 OAuth playground

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-google-calendar</artifactId>
            <version>2.23.0</version>
    </dependency>

120.1. URI 格式

Google Calendar 组件使用以下 URI 格式:

        google-calendar-stream://index?[options]

120.2. GoogleCalendarStreamComponent

Google Calendar Stream 组件支持 3 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

配置

 

GoogleCalendarStream Configuration

clientFactory (advanced)

客户端因素

 

GoogleCalendarClient Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Google Calendar Stream 端点使用 URI 语法配置:

google-calendar-stream:index

使用以下路径和查询参数:

120.2.1. 路径名(1 参数):

名称描述默认类型

index

为端点指定索引

 

字符串

120.2.2. 查询参数(30 参数):

名称描述默认类型

accessToken (使用者)

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

applicationName (consumer)

Google Calendar 应用程序名称。示例应为 camel-google-calendar/1.0

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

calendarId (consumer)

要使用的 calendarId

主要

字符串

clientId (consumer)

日历应用程序的客户端 ID

 

字符串

clientSecret (consumer)

日历应用程序的客户端机密

 

字符串

considerLastUpdate (consumer)

考虑到最后一次轮询事件的最后一个更新,作为下一次轮询的开始日期

false

布尔值

consumeFromNow (consumer)

现在就消耗所选日历中的事件

true

布尔值

maxResults (consumer)

要返回的最大结果

10

int

query (consumer)

对日历执行的查询

 

字符串

refreshToken (consumer)

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

范围 (消费者)

指定您希望日历应用程序对用户帐户的权限级别。如需更多信息,请参阅 https://developers.google.com/calendar/auth

 

list

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

120.3. Spring Boot Auto-Configuration

组件支持 15 个选项,它们如下所列。

名称描述默认类型

camel.component.google-calendar-stream.client-factory

客户端工厂.选项是一个 org.apache.camel.component.google.calendar.GoogleCalendarClientFactory 类型。

 

字符串

camel.component.google-calendar-stream.configuration.access-token

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

camel.component.google-calendar-stream.configuration.application-name

Google Calendar 应用程序名称。示例应为 camel-google-calendar/1.0

 

字符串

camel.component.google-calendar-stream.configuration.calendar-id

要使用的 calendarId

主要

字符串

camel.component.google-calendar-stream.configuration.client-id

日历应用程序的客户端 ID

 

字符串

camel.component.google-calendar-stream.configuration.client-secret

日历应用程序的客户端机密

 

字符串

camel.component.google-calendar-stream.configuration.consider-last-update

考虑到最后一次轮询事件的最后一个更新,作为下一次轮询的开始日期

false

布尔值

camel.component.google-calendar-stream.configuration.consume-from-now

现在就消耗所选日历中的事件

true

布尔值

camel.component.google-calendar-stream.configuration.index

为端点指定索引

 

字符串

camel.component.google-calendar-stream.configuration.max-results

要返回的最大结果

10

整数

camel.component.google-calendar-stream.configuration.query

对日历执行的查询

 

字符串

camel.component.google-calendar-stream.configuration.refresh-token

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

camel.component.google-calendar-stream.configuration.scopes

指定您希望日历应用程序对用户帐户的权限级别。如需更多信息,请参阅 https://developers.google.com/calendar/auth

 

list

camel.component.google-calendar-stream.enabled

是否启用 google-calendar-stream 组件自动配置。默认启用。

 

布尔值

camel.component.google-calendar-stream.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

120.4. 消费者

默认情况下,消费者的 maxResults 等于 5。

例如:

from("google-calendar-stream://test?markAsRead=true&delay=5000&maxResults=5").to("mock:result");

此路由将消耗从轮询日期开始的下一个五个事件。

  

第 121 章 Google Drive Component

作为 Camel 版本 2.14 可用

Google Drive 组件通过 Google Drive Web API 提供对 Google Drive 文件存储服务的访问

Google Drive 使用 OAuth 2.0 协议 对 Google 帐户进行身份验证,并授权访问用户数据。在使用此组件前,您需要 创建帐户并生成 OAuth 凭证。凭证包括 clientId、clientSecret 和 refreshToken。生成长期刷新Token 的方便资源是 OAuth playground

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-google-drive</artifactId>
            <version>2.14-SNAPSHOT</version>
    </dependency>

121.1. URI 格式

GoogleDrive 组件使用以下 URI 格式:

        google-drive://endpoint-prefix/endpoint?[options]

端点前缀可以是以下之一:

  • drive-about
  • drive-apps
  • drive-changes
  • drive-channels
  • drive-children
  • drive-comments
  • drive-files
  • drive-parents
  • drive-permissions
  • drive-properties
  • drive-realtime
  • drive-replies
  • 驱动修订

121.2. GoogleDriveComponent

Google Drive 组件支持 3 个选项,它们如下所列。

名称描述默认类型

configuration (common)

使用共享配置

 

GoogleDrive Configuration

clientFactory (advanced)

使用 GoogleCalendarClientFactory 作为创建客户端的工厂。默认使用 BatchGoogleDriveClientFactory

 

GoogleDriveClient Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Google Drive 端点使用 URI 语法配置:

google-drive:apiName/methodName

使用以下路径和查询参数:

121.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

GoogleDriveApiName

methodName

所选操作需要什么子操作

 

字符串

121.2.2. 查询参数(12 参数):

名称描述默认类型

accessToken (common)

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

applicationName (common)

Google 驱动器应用程序名称。示例应为 camel-google-drive/1.0

 

字符串

clientFactory (common)

使用 GoogleCalendarClientFactory 作为创建客户端的工厂。默认使用 BatchGoogleDriveClientFactory

 

GoogleDriveClient Factory

clientId (common)

驱动器应用程序的客户端 ID

 

字符串

clientSecret (common)

驱动器应用程序的客户端 secret

 

字符串

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

refreshToken (common)

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

scopes (common)

指定您要驱动器应用程序对用户帐户的权限级别。如需更多信息,请参阅 https://developers.google.com/drive/web/scopes

 

list

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

121.3. Spring Boot Auto-Configuration

组件支持 11 个选项,它们如下所列。

名称描述默认类型

camel.component.google-drive.client-factory

使用 GoogleCalendarClientFactory 作为创建客户端的工厂。默认情况下,将使用批处理GoogleDriveClientFactory。选项是一个 org.apache.camel.component.google.drive.GoogleDriveClientFactory 类型。

 

字符串

camel.component.google-drive.configuration.access-token

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

camel.component.google-drive.configuration.api-name

要执行的操作种类

 

GoogleDriveApiName

camel.component.google-drive.configuration.application-name

Google 驱动器应用程序名称。示例应为 camel-google-drive/1.0

 

字符串

camel.component.google-drive.configuration.client-id

驱动器应用程序的客户端 ID

 

字符串

camel.component.google-drive.configuration.client-secret

驱动器应用程序的客户端 secret

 

字符串

camel.component.google-drive.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.google-drive.configuration.refresh-token

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

camel.component.google-drive.configuration.scopes

指定您要驱动器应用程序对用户帐户的权限级别。如需更多信息,请参阅 https://developers.google.com/drive/web/scopes

 

list

camel.component.google-drive.enabled

启用 google-drive 组件

true

布尔值

camel.component.google-drive.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

121.4. 生产端点

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 URI MUST 包含一个前缀。

不是必需的端点选项由 [] 表示。如果端点没有强制选项,则会提供一组 [] 选项 MUST。制作者端点也可以使用特殊选项 inBody,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelGoogleDrive.<option> 的格式。请注意,inBody 选项会覆盖消息标头,例如,Body=option 中的 endpoint 选项会覆盖 CamelGoogleDrive.option 标头。

有关端点和选项的更多信息,请参阅 API 文档 https://developers.google.com/drive/v2/reference/

121.5. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

121.6. 消息标头

任何 URI 选项都可以在具有 CamelGoogleDrive. 前缀的生产端点的消息标头中提供。

121.7. Message Body

所有结果消息正文都使用由 GoogleDriveComponent 使用的底层 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息。    

第 122 章 Google 邮件组件

作为 Camel 版本 2.15 可用

Google 邮件组件通过 Google 邮件 Web API 提供对 Gmail 的访问。

Google 邮件使用 OAuth 2.0 协议 对 Google 帐户进行身份验证,并授权访问用户数据。在使用此组件前,您需要 创建帐户并生成 OAuth 凭证。凭证包括 clientId、clientSecret 和 refreshToken。生成长期刷新Token 的方便资源是 OAuth playground

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-google-mail</artifactId>
            <version>2.15-SNAPSHOT</version>
    </dependency>

122.1. URI 格式

GoogleMail 组件使用以下 URI 格式:

        google-mail://endpoint-prefix/endpoint?[options]

端点前缀可以是以下之一:

  • attachments
  • 草案
  • history
  • labels
  • messages
  • threads
  • users

122.2. GoogleMailComponent

Google 邮件组件支持 3 个选项,它们如下所列。

名称描述默认类型

configuration (common)

使用共享配置

 

GoogleMailConfiguration

clientFactory (advanced)

使用 GoogleCalendarClientFactory 作为创建客户端的工厂。默认会使用 BatchGoogleMailClientFactory

 

GoogleMailClient Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Google 邮件端点使用 URI 语法配置:

google-mail:apiName/methodName

使用以下路径和查询参数:

122.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

GoogleMailApiName

methodName

所选操作需要什么子操作

 

字符串

122.2.2. 查询参数(10 参数):

名称描述默认类型

accessToken (common)

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

applicationName (common)

Google 邮件应用程序名称。示例应为 camel-google-mail/1.0

 

字符串

clientId (common)

邮件应用程序的客户端 ID

 

字符串

clientSecret (common)

邮件应用程序的客户端机密

 

字符串

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

refreshToken (common)

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

122.3. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.google-mail.client-factory

使用 GoogleCalendarClientFactory 作为创建客户端的工厂。默认情况下,将使用 BatchGoogleMailClientFactory。选项是一个 org.apache.camel.component.google.mail.GoogleMailClientFactory 类型。

 

字符串

camel.component.google-mail.configuration.access-token

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

camel.component.google-mail.configuration.api-name

要执行的操作种类

 

GoogleMailApiName

camel.component.google-mail.configuration.application-name

Google 邮件应用程序名称。示例应为 camel-google-mail/1.0

 

字符串

camel.component.google-mail.configuration.client-id

邮件应用程序的客户端 ID

 

字符串

camel.component.google-mail.configuration.client-secret

邮件应用程序的客户端机密

 

字符串

camel.component.google-mail.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.google-mail.configuration.refresh-token

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

camel.component.google-mail.enabled

启用 google-mail 组件

true

布尔值

camel.component.google-mail.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

122.4. 生产端点

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 URI MUST 包含一个前缀。

不是必需的端点选项由 [] 表示。如果端点没有强制选项,则会提供一组 [] 选项 MUST。制作者端点也可以使用特殊选项 inBody,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelGoogleMail.<option> 的格式。请注意,inBody 选项会覆盖消息标头,例如,Body=option 中的 endpoint 选项会覆盖 CamelGoogleMail.option 标头。

有关端点和选项的更多信息,请参阅 API 文档 https://developers.google.com/gmail/api/v1/reference/

122.5. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

122.6. 消息标头

任何 URI 选项都可以在具有 CamelGoogleMail. 前缀的生产端点的消息标头中提供。

122.7. Message Body

所有结果消息正文都使用由 GoogleMailComponent 使用的底层 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息。    

第 123 章 Google Mail Stream Component

可作为 Camel 版本 2.22 可用

Google 邮件组件通过 Google 邮件 Web API 提供对 Gmail 的访问。

Google 邮件使用 OAuth 2.0 协议 对 Google 帐户进行身份验证,并授权访问用户数据。在使用此组件前,您需要 创建帐户并生成 OAuth 凭证。凭证包括 clientId、clientSecret 和 refreshToken。生成长期刷新Token 的方便资源是 OAuth playground

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-google-mail</artifactId>
            <version>2.22-SNAPSHOT</version>
    </dependency>

123.1. URI 格式

GoogleMail 组件使用以下 URI 格式:

        google-mail-stream://index?[options]

123.2. GoogleMailStreamComponent

Google Mail Stream 组件支持 3 个选项,它们如下。

名称描述默认类型

配置 (高级)

配置

 

GoogleMailStream Configuration

clientFactory (advanced)

客户端因素

 

GoogleMailClient Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Google 邮件流端点使用 URI 语法配置:

google-mail-stream:index

使用以下路径和查询参数:

123.2.1. 路径名(1 参数):

名称描述默认类型

index

为端点指定索引

 

字符串

123.2.2. 查询参数(28 参数):

名称描述默认类型

accessToken (使用者)

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

applicationName (consumer)

Google 邮件应用程序名称。示例应为 camel-google-mail/1.0

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

clientId (consumer)

邮件应用程序的客户端 ID

 

字符串

clientSecret (consumer)

邮件应用程序的客户端机密

 

字符串

labels (consumer)

要考虑的以逗号分隔的标签列表

 

字符串

markAsRead (consumer)

在消耗消息后,将消息标记为 read

false

布尔值

maxResults (consumer)

要返回的最大结果

10

long

query (consumer)

要对 gmail 框执行的查询

is:unread

字符串

refreshToken (consumer)

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

123.3. Spring Boot Auto-Configuration

组件支持 13 个选项,它们如下所列。

名称描述默认类型

camel.component.google-mail-stream.client-factory

客户端工厂.选项是一个 org.apache.camel.component.google.mail.GoogleMailClientFactory 类型。

 

字符串

camel.component.google-mail-stream.configuration.access-token

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

camel.component.google-mail-stream.configuration.application-name

Google 邮件应用程序名称。示例应为 camel-google-mail/1.0

 

字符串

camel.component.google-mail-stream.configuration.client-id

邮件应用程序的客户端 ID

 

字符串

camel.component.google-mail-stream.configuration.client-secret

邮件应用程序的客户端机密

 

字符串

camel.component.google-mail-stream.configuration.index

为端点指定索引

 

字符串

camel.component.google-mail-stream.configuration.labels

要考虑的以逗号分隔的标签列表

 

字符串

camel.component.google-mail-stream.configuration.mark-as-read

在消耗消息后,将消息标记为 read

false

布尔值

camel.component.google-mail-stream.configuration.max-results

要返回的最大结果

10

Long

camel.component.google-mail-stream.configuration.query

要对 gmail 框执行的查询

is:unread

字符串

camel.component.google-mail-stream.configuration.refresh-token

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

camel.component.google-mail-stream.enabled

是否启用 google-mail-stream 组件自动配置。默认启用。

 

布尔值

camel.component.google-mail-stream.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

123.4. 消费者

默认情况下,消费者使用查询"is:unread"和 maxResults 等于 10。

例如:

from("google-mail-stream://test?markAsRead=true&delay=5000&maxResults=5&labels=GitHub,Apache").to("mock:result");

此路由将使用带有 Github 和 Apache 标签的未读取消息,它会将消息标记为读取。

  

第 124 章 Google Pubsub 组件

作为 Camel 版本 2.19 可用

Google Pubsub 组件通过 Google Client Services API 提供对 Cloud Pub/Sub 基础架构 的访问权限。

当前实现不使用 gRPC。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-google-pubsub</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

124.1. URI 格式

Google Pubsub 组件使用以下 URI 格式:

google-pubsub://project-id:destinationName?[options]

目的地名称可以是主题或订阅名称。

124.2. 选项

Google Pubsub 组件支持 2 个选项,它们如下所列。

名称描述默认类型

connectionFactory (common)

设置要使用的连接工厂: 提供显式管理连接凭证的能力: - 到密钥文件的路径 - Service Account Key / Email pair

 

GooglePubsubConnection Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Google Pubsub 端点使用 URI 语法配置:

google-pubsub:projectId:destinationName

使用以下路径和查询参数:

124.2.1. 路径名(2 参数):

名称描述默认类型

projectId

所需的项目 Id

 

字符串

destinationName

所需的 目标名称

 

字符串

124.2.2. 查询参数(9 参数):

名称描述默认类型

ackMode (common)

AUTO = 交换在完成时被确认。NONE = downstream 进程必须明确使用 ack/nack

AUTO

AckMode

concurrentConsumers (common)

订阅消耗的并行流数量

1

整数

connectionFactory (common)

ConnectionFactory 以获取与 PubSub 服务的连接。如果未提供默认值,则将使用。

 

GooglePubsubConnection Factory

loggerId (common)

需要与父路由匹配时使用的日志记录器 ID

 

字符串

maxMessagesPerPoll (common)

在单个 API 调用中从服务器接收的最大消息数

1

整数

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

124.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.google-pubsub.enabled

启用 google-pubsub 组件

true

布尔值

camel.component.google-pubsub.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

124.4. 生产端点

生产者端点可以接受并交付给 PubSub 个人并分组的交换。分组的交换设置有 Exchange.GROUPED_EXCHANGE 属性。

Google PubSub 要求有效负载可以是 byte[] 数组,Producer 端点将发送:

  • String body as byte[] encoded as UTF-8
  • byte[] body as is
  • 所有其他内容都被序列化为 byte[] 数组

a Map 设置为消息标题 GooglePubsubConstants.ATTRIBUTES 将以 PubSub 属性的形式发送。旦交换给 PubSub,PubSub Message ID 将分配给标头 GooglePubsubConstants.MESSAGE_ID

124.5. 消费者端点

如果尚未被确认为订阅中的配置选项,Google PubSub 将恢复消息。

一旦交换处理完成后,该组件将确认消息。

如果路由抛出异常,则交换被标记为失败,组件会将 NACK 消息立即进行。

为黑色,该组件使用 Acknowledgement ID 存储为标头 GooglePubsubConstants.ACK_ID。如果删除或篡改了标头,则 ack 将失败,并且消息将在自动截止时间后再次进行恢复。

124.6. 消息标头

由消费者端点设置的标头:

  • GooglePubsubConstants.MESSAGE_ID
  • GooglePubsubConstants.ATTRIBUTES
  • GooglePubsubConstants.PUBLISH_TIME
  • GooglePubsubConstants.ACK_ID

124.7. Message Body

消费者端点将消息的内容返回为 byte[] - 正好与基础系统发送一样。它是转换/复制内容的路由。

124.8. 身份验证配置

Google Pubsub 组件身份验证用于 GCP 服务帐户。如需更多信息,请参阅 Google Cloud Platform Auth 指南

Google 安全凭证可以通过以下两个选项之一明确设置:

  • 服务帐户电子邮件和服务帐户密钥(PEM 格式)
  • GCP 凭证文件位置

如果同时设置了两者,则服务帐户电子邮件/密钥将优先使用。

或者隐式,连接工厂返回到 Application Default Credentials

模糊!默认凭据文件的位置可以配置 - 通过 GOOGLE_APPLICATION_CREDENTIALS 环境变量。

Service Account Email 和 Service Account Key 可以在 GCP JSON 凭证文件中分别作为 client_email 和 private_key 中找到。

124.9. 回滚和重新传送

Google PubSub 的回滚依赖于 Acknowledgement Deadline (Google PubSub 期望收到确认的时间期限)。如果尚未收到确认信息,信息将会被红色。

Google 提供了一个 API,用于扩展消息的截止时间。

Google PubSub文档中的更多信息

因此,回滚实际上是一个带有零值的截止时间扩展 API 调用 - 现在到达截止时间,消息可以被重新提供给下一个消费者。

通过将消息标题 GooglePubsubConstants.ACK_DEADLINE 设置为以秒为单位的值,可以延迟消息重新传送。

第 125 章 Google Sheets 组件

作为 Camel 版本 2.23 可用

Google Sheets 组件通过 Google Sheets Web API 提供对 Google Sheets 的访问。

Google Sheets 使用 OAuth 2.0 协议 对 Google 帐户进行身份验证,并授权访问用户数据。在使用此组件前,您需要 创建帐户并生成 OAuth 凭证。凭证包括 clientId、clientSecret 和 refreshToken。生成长期刷新Token 的方便资源是 OAuth playground

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-google-sheets</artifactId>
            <version>2.23.0</version>
    </dependency>

125.1. URI 格式

GoogleSheets 组件使用以下 URI 格式:

        google-sheets://endpoint-prefix/endpoint?[options]

端点前缀可以是以下之一:

  • spreadsheets
  • data

125.2. GoogleSheetsComponent

Google Sheets 组件支持 3 个选项,它们如下。

名称描述默认类型

configuration (common)

使用共享配置

 

GoogleSheets Configuration

clientFactory (advanced)

将 GoogleSheetsClientFactory 用作创建客户端的工厂。默认会使用 BatchGoogleSheetsClientFactory

 

GoogleSheetsClient Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Google Sheets 端点使用 URI 语法进行配置:

google-sheets:apiName/methodName

使用以下路径和查询参数:

125.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

GoogleSheetsApiName

methodName

所选操作需要什么子操作

 

字符串

125.2.2. 查询参数(10 参数):

名称描述默认类型

accessToken (common)

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

applicationName (common)

Google Sheets 应用程序名称.示例内容为 camel-google-sheets/1.0

 

字符串

clientId (common)

sheets 应用程序的客户端 ID

 

字符串

clientSecret (common)

sheets 应用程序的客户端 secret

 

字符串

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

refreshToken (common)

OAuth 2 刷新令牌。使用这个方法,Google Sheets 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

125.3. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.google-sheets.client-factory

将 GoogleSheetsClientFactory 用作创建客户端的工厂。将默认使用 BatchGoogleSheetsClientFactory。选项是一个 org.apache.camel.component.google.sheets.GoogleSheetsClientFactory 类型。

 

字符串

camel.component.google-sheets.configuration.access-token

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

camel.component.google-sheets.configuration.api-name

要执行的操作种类

 

GoogleSheetsApiName

camel.component.google-sheets.configuration.application-name

Google Sheets 应用程序名称.示例内容为 camel-google-sheets/1.0

 

字符串

camel.component.google-sheets.configuration.client-id

sheets 应用程序的客户端 ID

 

字符串

camel.component.google-sheets.configuration.client-secret

sheets 应用程序的客户端 secret

 

字符串

camel.component.google-sheets.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.google-sheets.configuration.refresh-token

OAuth 2 刷新令牌。使用这个方法,Google Sheets 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

camel.component.google-sheets.enabled

是否启用 google-sheets 组件的自动配置。默认启用。

 

布尔值

camel.component.google-sheets.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

125.4. 生产端点

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 URI MUST 包含一个前缀。

不是必需的端点选项由 [] 表示。如果端点没有强制选项,则会提供一组 [] 选项 MUST。制作者端点也可以使用特殊选项 inBody,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelGoogleSheets.<option> 的格式。请注意,inBody 选项会覆盖消息标头,例如,Body=option 中的 endpoint 选项会覆盖 CamelGoogleSheets.option 标头。

有关端点和选项的更多信息,请参阅 API 文档 https://developers.google.com/sheets/api/reference/rest/

125.5. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

125.6. 消息标头

任何 URI 选项都可以在具有 CamelGoogleSheets. 前缀的生产端点的消息标头中提供。

125.7. Message Body

所有结果消息正文都使用由 GoogleSheetsComponent 使用的底层 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息。    

第 126 章 Google Sheets Stream 组件

作为 Camel 版本 2.23 可用

Google Sheets 组件可以通过 Google Sheets Web API 访问表

Google Sheets 使用 OAuth 2.0 协议 对 Google 帐户进行身份验证,并授权访问用户数据。在使用此组件前,您需要 创建帐户并生成 OAuth 凭证。凭证包括 clientId、clientSecret 和 refreshToken。生成长期刷新Token 的方便资源是 OAuth playground

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-google-sheets</artifactId>
            <version>2.23.0</version>
    </dependency>

126.1. URI 格式

Google Sheets 组件使用以下 URI 格式:

        google-sheets-stream://apiName?[options]

126.2. GoogleSheetsStreamComponent

Google Sheets Stream 组件支持 3 个选项,它们如下所列。

名称描述默认类型

配置 (消费者)

使用共享配置

 

GoogleSheetsStream Configuration

clientFactory (advanced)

将 GoogleSheetsClientFactory 用作创建客户端的工厂。默认会使用 BatchGoogleSheetsClientFactory

 

GoogleSheetsClient Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Google Sheets Stream 端点使用 URI 语法配置:

google-sheets-stream:apiName

使用以下路径和查询参数:

126.2.1. 路径名(1 参数):

名称描述默认类型

apiName

设置 apiName。

 

字符串

126.2.2. 查询参数(31 参数):

名称描述默认类型

accessToken (使用者)

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

applicationName (consumer)

Google sheets 应用程序名称.示例内容为 camel-google-sheets/1.0

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

clientId (consumer)

sheets 应用程序的客户端 ID

 

字符串

clientSecret (consumer)

sheets 应用程序的客户端 secret

 

字符串

includeGridData (consumer)

如果应该返回网格数据,则为 True。

false

布尔值

majorDimension (consumer)

指定结果应使用的主要维度。

字符串

maxResults (consumer)

指定返回的结果的最大数量。这将限制返回的值范围数据集中的行数或批处理请求中返回的值范围的数量。

10

int

range (consumer)

指定从表中获取数据的行和列的范围。

 

字符串

refreshToken (consumer)

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

范围 (消费者)

指定您需要 sheets 应用程序与用户帐户所需的权限级别。如需更多信息,请参阅 https://developers.google.com/identity/protocols/googlescopes

 

list

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

spreadsheetId (consumer)

指定用于标识要获取的目标的电子表格标识符。

 

字符串

valueRenderOption (consumer)

决定输出中应该如何渲染值。

FORMATTED_VALUE

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

126.3. Spring Boot Auto-Configuration

组件支持 16 个选项,如下所示。

名称描述默认类型

camel.component.google-sheets-stream.client-factory

将 GoogleSheetsClientFactory 用作创建客户端的工厂。将默认使用 BatchGoogleSheetsClientFactory。选项是一个 org.apache.camel.component.google.sheets.GoogleSheetsClientFactory 类型。

 

字符串

camel.component.google-sheets-stream.configuration.access-token

OAuth 2 访问令牌。这通常在一小时后过期,因此建议长期使用 refreshToken。

 

字符串

camel.component.google-sheets-stream.configuration.api-name

设置 apiName。

 

字符串

camel.component.google-sheets-stream.configuration.application-name

Google sheets 应用程序名称.示例内容为 camel-google-sheets/1.0

 

字符串

camel.component.google-sheets-stream.configuration.client-id

sheets 应用程序的客户端 ID

 

字符串

camel.component.google-sheets-stream.configuration.client-secret

sheets 应用程序的客户端 secret

 

字符串

camel.component.google-sheets-stream.configuration.include-grid-data

如果应该返回网格数据,则为 True。

false

布尔值

camel.component.google-sheets-stream.configuration.major-dimension

指定结果应使用的主要维度。

字符串

camel.component.google-sheets-stream.configuration.max-results

指定返回的结果的最大数量。这将限制返回的值范围数据集中的行数或批处理请求中返回的值范围的数量。

0

整数

camel.component.google-sheets-stream.configuration.range

指定从表中获取数据的行和列的范围。

 

字符串

camel.component.google-sheets-stream.configuration.refresh-token

OAuth 2 刷新令牌。使用这个方法,Google Calendar 组件可在当前过期时获得新的 accessToken - 应用程序长期需要。

 

字符串

camel.component.google-sheets-stream.configuration.scopes

指定您需要 sheets 应用程序与用户帐户所需的权限级别。如需更多信息,请参阅 https://developers.google.com/identity/protocols/googlescopes

 

list

camel.component.google-sheets-stream.configuration.spreadsheet-id

指定用于标识要获取的目标的电子表格标识符。

 

字符串

camel.component.google-sheets-stream.configuration.value-render-option

决定输出中应该如何渲染值。

FORMATTED_VALUE

字符串

camel.component.google-sheets-stream.enabled

是否启用 google-sheets-stream 组件的自动配置。默认启用。

 

布尔值

camel.component.google-sheets-stream.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

126.4. 消费者

默认情况下,消费者的 maxResults 等于 5。

例如:

from("google-sheets-stream://data?range=A:B&delay=5000&maxResults=5").to("mock:result");

此路由将消耗从轮询日期开始的下一个十个事件。

  

第 127 章 Groovy Language

作为 Camel 版本 1.3 提供

Camel 支持其它脚本语言中的 Groovy,允许在 DSL 或 Xml 配置中使用表达式或重复数据。

要使用 Groovy 表达式,请使用以下 Java 代码

... groovy("someGroovyExpression") ...

例如,您可以使用 groovy 功能在 Message Filter 中创建 Predicate,或作为 Recipient List 的表达式

127.1. Groovy 选项

Groovy 语言支持 1 选项,它们如下所列。

名称默认Java 类型描述

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

127.2. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.language.groovy.enabled

启用 groovy 语言

true

布尔值

camel.language.groovy.trim

是否修剪值是否删除前导(尾随空格和换行符)

true

布尔值

127.3. 自定义 Groovy Shell

有时,您可能需要在 Groovy 表达式中使用自定义 GroovyShell 实例。为了提供自定义 GroovyShell,可为您的 Camel 注册表添加 org.apache.camel.language.groovy.GroovyShellFactory SPI 接口的实施。例如,在 Spring context…​ 中添加以下内容后

public class CustomGroovyShellFactory implements GroovyShellFactory {
 
  public GroovyShell createGroovyShell(Exchange exchange) {
    ImportCustomizer importCustomizer = new ImportCustomizer();
    importCustomizer.addStaticStars("com.example.Utils");
    CompilerConfiguration configuration = new CompilerConfiguration();
    configuration.addCompilationCustomizers(importCustomizer);
    return new GroovyShell(configuration);
  }

}

…​Camel 将使用您的自定义 GroovyShell 实例(包含您的自定义静态导入),而不是默认导入。

127.4. 示例

// lets route if a line item is over $100
from("queue:foo").filter(groovy("request.lineItems.any { i -> i.value > 100 }")).to("queue:bar")

和 Spring DSL:

        <route>
            <from uri="queue:foo"/>
            <filter>
                <groovy>request.lineItems.any { i -> i.value > 100 }</groovy>
                <to uri="queue:bar"/>
            </filter>
        </route>

127.5. ScriptContext

JSR-223 脚本编写语言Context 预配置了 ENGINE_SCOPE 中设定的以下属性:

属性类型

context

org.apache.camel.CamelContext

Camel 上下文(不能在 groovy 中使用)

camelContext

org.apache.camel.CamelContext

Camel 上下文

exchange

org.apache.camel.Exchange

当前交换

Request (请求)

org.apache.camel.Message

消息(消息)

响应

org.apache.camel.Message

弃用 :OUT 消息。默认为空,OUT 消息。改为使用 IN 消息。

属性

org.apache.camel.builder.script.PropertiesFunction

Camel 2.9: 通过一种 解析 方法的功能,可以更轻松地从脚本使用 Camels Properties 组件。请参阅以下示例。

如需支持显式 DSL 的语言列表,请参阅脚本语言。

127.6. ScriptingEngine 的其他参数

可从 Camel 2.8 开始

您可以使用 Camel 消息上的标头和密钥 CamelScript 参数 向脚本提供附加参数。
请参见以下示例:

127.7. 使用属性功能

作为 Camel 2.9 提供。

如果您需要使用脚本中的 Properties 组件来查找属性占位符,那么它有点的繁琐操作。例如,若要使用属性占位符值设置标头 myHeader,在名为 "foo" 的标头中提供该密钥。

.setHeader("myHeader").groovy(""context.resolvePropertyPlaceholders( + '{{' + request.headers.get(&#39;foo&#39;) + '}}' + ")")

从 Camel 2.9 开始,您可以使用属性功能,且相同的示例是更加简单的:

.setHeader("myHeader").groovy("properties.resolve(request.headers.get(&#39;foo&#39;))")

127.8. 从外部资源载入脚本

可从 Camel 2.11 开始

您可以对脚本进行外部化,并使 Camel 从资源(如 "classpath:""file:""http:" )加载。
这可通过以下语法完成: "resource:scheme:location",例如参考类路径上的文件,您可以执行以下操作:

.setHeader("myHeader").groovy("resource:classpath:mygroovy.groovy")

127.9. 如何从多个语句脚本获取结果

可从 Camel 2.14 开始

作为 scripteengine evale 方法,如果它运行多个 statments 脚本,则返回 Null。Camel 现在使用来自所设置值的 "result" 键来查找脚本结果的值。如果您有多个语句脚本,您需要确保将 result 变量的值设置为脚本返回值。

bar = "baz";
# some other statements ...
# camel take the result value as the script evaluation result
result = body * 2 + 1

127.10. 依赖项

要在 camel 路由中使用脚本语言,您需要添加对 camel-groovy 的依赖。

如果您使用 Maven,您可以只向 pom.xml 添加以下内容,将最新和最大版本的版本号替换(请参阅最新版本下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-groovy</artifactId>
  <version>x.x.x</version>
</dependency>

第 128 章 gRPC Component

作为 Camel 版本 2.19 可用

gRPC 组件允许您使用 协议缓冲器(protobuf)通过 HTTP/2 传输格式来调用或公开远程过程调用(RPC) 服务。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-grpc</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

从 Camel 2.22 gRCP 开始,需要强大的 Google Guava 版本。在 maven 文件中添加以下配置属性

<properties>
    <google-guava-version>${grpc-guava-version}</google-guava-version>
<properties>

128.1. URI 格式

grpc://service[?options]

128.2. 端点选项

gRPC 组件没有选项。

gRPC 端点使用 URI 语法配置:

grpc:host:port/service

使用以下路径和查询参数:

128.2.1. 路径名(3 参数):

名称描述默认类型

主机

需要 gRPC 服务器主机名。在使用制作者时,这是 localhost 或 0.0.0.0 作为使用者或远程服务器主机名。

 

字符串

port

所需的 gRPC 本地或远程服务器端口

 

int

service

协议缓冲区描述符文件 所需的 全限定服务名称(软件包点服务定义名称)

 

字符串

128.2.2. 查询参数(25 参数):

名称描述默认类型

flowControlWindow (common)

HTTP/2 流控制窗口大小(MiB)

1048576

int

maxMessageSize (common)

允许接收/关闭的最大消息大小(MiB)

4194304

int

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

consumerStrategy (consumer)

此选项指定流模式中处理服务请求和响应的顶级策略。如果选择了聚合策略,则所有请求都将在列表中累积,然后传输到流,并累积的响应将发送到发送者。如果选择了传播策略,则会将请求发送到流,并且响应将立即发送到发件人。

传播

GrpcConsumerStrategy

forwardOnCompleted (consumer)

确定Completed 事件是否应推送到 Camel 路由。

false

布尔值

forwardOnError (consumer)

确定是否应该将 onError 事件推送到 Camel 路由。例外情况将被设置为消息正文。

false

布尔值

maxConcurrentCallsPer Connection (consumer)

每个传入服务器连接允许的最大并发调用数

2147483647

int

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

方法 (生成器)

gRPC 方法名称

 

字符串

producerStrategy (producer)

用于与远程 gRPC 服务器通信的模式。在 SIMPLE 模式中,单一交换被转换为远程过程调用。在 STREAMING 模式中,所有交换都应在同一请求中发送(收件人 gRPC 服务的输入和输出必须是"流"类型)。

简单

GrpcProducerStrategy

streamRepliesTo (producer)

使用 STREAMING 客户端模式时,它指示应转发响应的端点。

 

字符串

userAgent (producer)

传递给服务器的用户代理标头

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

authenticationType (security)

预先到 SSL/TLS 协商的身份验证方法类型

NONE

GrpcAuthType

jwtAlgorithm (security)

JSON Web 令牌签名算法

HMAC256

JwtAlgorithm

jwtIssuer (security)

JSON Web 令牌签发者

 

字符串

jwtSecret (security)

JSON Web 令牌 secret

 

字符串

jwtSubject (security)

JSON Web 令牌主题

 

字符串

keyCertChainResource (security)

PEM 格式链接的 X.509 证书链文件资源

 

字符串

keyPassword (security)

PKCS#8 私钥文件密码

 

字符串

keyResource (security)

PEM 格式链接中的 PKCS#8 私钥文件资源

 

字符串

negotiationType (security)

标识用于 HTTP/2 通信的安全协商类型

PLAINTEXT

NegotiationType

serviceAccountResource (security)

Google Cloud SDK 支持的 JSON 格式的资源链接中的服务帐户密钥文件

 

字符串

trustCertCollectionResource (security)

使用 PEM 格式验证远程端点的证书收集文件资源

 

字符串

128.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.grpc.enabled

启用 grpc 组件

true

布尔值

camel.component.grpc.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

128.4. 传输安全性和身份验证支持(可从 Camel 2.20获得)

以下 验证机制 内置于 gRPC 中,在此组件中可用:

  • SSL/TLS: gRPC 具有 SSL/TLS 集成,并推广使用 SSL/TLS 验证服务器,以及加密客户端和服务器之间交换的所有数据。客户端可以为客户端提供相互验证证书的可选机制。
  • 通过 Google 进行基于令牌的身份验证: gRPC 提供通用机制来将基于元数据的凭据附加到请求和响应。提供通过 gRPC 访问 Google API 时获取访问令牌的其他支持。通常,必须使用此机制以及频道上的 SSL/TLS。

要启用这些功能,必须配置以下组件属性组合:

num.选项参数必填/选填

1

SSL/TLS

negotiationType

TLS

必需

  

keyCertChainResource

 

必需

  

keyResource

 

必需

  

keyPassword

 

选填

  

trustCertCollectionResource

 

选填

2

使用 Google API 基于令牌的身份验证

authenticationType

GOOGLE

必需

  

negotiationType

TLS

必需

  

serviceAccountResource

 

必需

3

自定义 JSON Web 令牌实施身份验证

authenticationType

JWT

必需

  

negotiationType

NONE 或 TLS

可选。TLS/SSL 不会检查此类型,但强烈建议您。

  

jwtAlgorithm

HMAC256 (默认)或(HMAC384,HMAC512)

选填

  

jwtSecret

 

必需

  

jwtIssuer

 

选填

  

jwtSubject

 

选填

目前,使用 OpenSSL 的 TLS 是使用 gRPC over TLS 组件的方法。在 ALPN 中使用 JDK 通常较慢,且可能不支持 HTTP2 的必要密码。这个功能在组件中不实施。

128.5. gRPC producer 资源类型映射

下表显示了消息正文中对象的类型,具体取决于传入和传出参数的类型(简单或流),以及调用方式(同步或异步)。请注意,不允许以异步方式使用传入流参数调用程序。

调用风格请求类型响应类型请求正文类型结果 Body 类型

synchronous

simple

simple

对象

对象

synchronous

simple

stream

对象

List<Object>

同步

stream

simple

不允许

不允许

同步

stream

stream

不允许

不允许

asynchronous

simple

simple

对象

List<Object>

asynchronous

simple

stream

对象

List<Object>

asynchronous

stream

simple

对象或 List<Object>

List<Object>

asynchronous

stream

stream

对象或 List<Object>

List<Object>

128.6. gRPC 消费者标头(在消费者调用后安装)

标头名称描述可能的值

CamelGrpcMethodName

使用者服务处理的方法名称

 

CamelGrpcEventType

从发送的请求接收的事件类型

onNext,onCompleted 或 onError

CamelGrpcUserAgent

如果提供,指定代理会先添加 gRPC 库的用户代理信息

 

128.7. 例子

以下是通过主机和端口参数调用的简单同步方法

from("direct:grpc-sync")
.to("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=sendPing&synchronous=true");
<route>
    <from uri="direct:grpc-sync" />
    <to uri="grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=sendPing&synchronous=true"/>
</route>

异步方法调用

from("direct:grpc-async")
.to("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=pingAsyncResponse");

带有传播消费者策略的 gRPC 服务消费者

from("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?consumerStrategy=PROPAGATION")
.to("direct:grpc-service");

带有流制作者策略的 gRPC 服务制作者(需要采用 "stream" 模式作为输入和输出的服务)

from("direct:grpc-request-stream")
.to("grpc://remotehost:1101/org.apache.camel.component.grpc.PingPong?method=PingAsyncAsync&producerStrategy=STREAMING&streamRepliesTo=direct:grpc-response-stream");

from("direct:grpc-response-stream")
.log("Response received: ${body}");

gRPC 服务消费者 TLS/SLL 安全协商启用

from("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?consumerStrategy=PROPAGATION&negotiationType=TLS&keyCertChainResource=file:src/test/resources/certs/server.pem&keyResource=file:src/test/resources/certs/server.key&trustCertCollectionResource=file:src/test/resources/certs/ca.pem")
.to("direct:tls-enable")

带有自定义 JSON Web 令牌实施身份验证的 gRPC 服务制作者

from("direct:grpc-jwt")
.to("grpc://localhost:1101/org.apache.camel.component.grpc.PingPong?method=pingSyncSync&synchronous=true&authenticationType=JWT&jwtSecret=supersecuredsecret");

128.8. 配置

建议您使用 Maven 协议缓冲器插件调用协议缓冲器(protoc)工具为自定义项目生成 Java 源文件。此插件将生成流程请求和响应类、它们的构建器和 gRPC 流程 stubs 类。

需要以下步骤:

在项目 pom.xml 或设置 ${os.detected.classifier} 参数的 < build > 标签内插入操作系统和 CPU 架构检测扩展

<extensions>
  <extension>
    <groupId>kr.motd.maven</groupId>
    <artifactId>os-maven-plugin</artifactId>
    <version>1.4.1.Final</version>
  </extension>
</extensions>

插入 gRPC 和 protobuf Java code generator 插件 &lt ;plugins&gt; tag of the project pom.xml

<plugin>
  <groupId>org.xolstice.maven.plugins</groupId>
  <artifactId>protobuf-maven-plugin</artifactId>
  <version>0.5.0</version>
  <configuration>
    <protocArtifact>com.google.protobuf:protoc:${protobuf-version}:exe:${os.detected.classifier}</protocArtifact>
    <pluginId>grpc-java</pluginId>
    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc-version}:exe:${os.detected.classifier}</pluginArtifact>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>compile</goal>
        <goal>compile-custom</goal>
        <goal>test-compile</goal>
        <goal>test-compile-custom</goal>
      </goals>
    </execution>
  </executions>
</plugin>

128.9. 如需更多信息,请参阅这些资源

gRPC 项目网站

Maven 协议缓冲插件

128.10. 另请参阅

第 129 章 Guava EventBus Component

作为 Camel 2.10 版本提供

Google Guava EventBus 允许在组件之间发布订阅式通信,而无需组件显式注册到另一个组件(因此可以相互发现)。guava-eventbus: 组件提供 Camel 和 Google Guava EventBus 基础架构之间的集成网桥。通过后面的组件,与 Guava EventBus 交换的消息可以透明地转发到 Camel 路由。EventBus 组件还允许将 Camel 交换的正文路由到 Guava EventBus

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-guava-eventbus</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

129.1. URI 格式

guava-eventbus:busName[?options]

其中 busName 代表 Camel registry 中的 com.google.common.eventbus.EventBus 实例的名称。

129.2. 选项

Guava EventBus 组件支持 3 个选项,它们如下所列。

名称描述默认类型

eventBus (common)

使用给定的 Guava EventBus 实例

 

EventBus

listenerInterface (common)

带有带有 Subscribe 注解的方法的接口。动态代理将通过接口创建,以便其注册为 EventBus 侦听器。在创建多事件监听器并正确处理 DeadEvent 时特别有用。这个选项不能与 eventClass 选项一同使用。

 

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Guava EventBus 端点使用 URI 语法配置:

guava-eventbus:eventBusRef

使用以下路径和查询参数:

129.2.1. 路径名(1 参数):

名称描述默认类型

eventBusRef

使用给定名称从 registry 中查找 Guava EventBus

 

字符串

129.2.2. 查询参数(6 参数):

名称描述默认类型

eventClass (common)

如果在路由使用者端使用,会将从 EventBus 接收的事件过滤到 eventClass 实例以及 eventClass 的超类。这个选项的 null 值等于将其设置为 java.lang.Object i.e。消费者将捕获传入事件总线的所有消息。这个选项不能与监听程序Interface 选项一起使用。

 

listenerInterface (common)

带有带有 Subscribe 注解的方法的接口。动态代理将通过接口创建,以便其注册为 EventBus 侦听器。在创建多事件监听器并正确处理 DeadEvent 时特别有用。这个选项不能与 eventClass 选项一同使用。

 

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

129.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.guava-eventbus.enabled

启用 guava-eventbus 组件

true

布尔值

camel.component.guava-eventbus.event-bus

使用给定的 Guava EventBus 实例。选项是一个 com.google.common.eventbus.EventBus 类型。

 

字符串

camel.component.guava-eventbus.listener-interface

带有带有 Subscribe 注解的方法的接口。动态代理将通过接口创建,以便其注册为 EventBus 侦听器。在创建多事件监听器并正确处理 DeadEvent 时特别有用。这个选项不能与 eventClass 选项一同使用。

 

camel.component.guava-eventbus.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

129.4. 使用

路由消费者端使用 guava-eventbus 组件将捕获发送到 Guava EventBus 的消息并将其转发到 Camel 路由。Guava EventBus 消费者 异步 处理传入的消息。

SimpleRegistry registry = new SimpleRegistry();
EventBus eventBus = new EventBus();
registry.put("busName", eventBus);
CamelContext camel = new DefaultCamelContext(registry);

from("guava-eventbus:busName").to("seda:queue");

eventBus.post("Send me to the SEDA queue.");

在路由生产端使用 guava-eventbus 组件会将 Camel 交换的正文转发到 Guava EventBus 实例。

SimpleRegistry registry = new SimpleRegistry();
EventBus eventBus = new EventBus();
registry.put("busName", eventBus);
CamelContext camel = new DefaultCamelContext(registry);

from("direct:start").to("guava-eventbus:busName");

ProducerTemplate producerTemplate = camel.createProducerTemplate();
producer.sendBody("direct:start", "Send me to the Guava EventBus.");

eventBus.register(new Object(){
  @Subscribe
  public void messageHander(String message) {
    System.out.println("Message received from the Camel: " + message);
  }
});

129.5. DeadEvent 注意事项

请记住,由于 Guava EventBus 设计的限制,您无法指定监听器接收的事件类,而无需创建 @Subscribe 方法标注的类。这个限制意味着,带有 eventClass 选项的端点实际侦听所有可能的事件(java.lang.Object),并在运行时过滤相应的消息。以下 snipped 演示了 Camel 代码库中的相应摘录。

@Subscribe
public void eventReceived(Object event) {
  if (eventClass == null || eventClass.isAssignableFrom(event.getClass())) {
    doEventReceived(event);
...

这个方法的缺点是 Camel 使用的 EventBus 实例永远不会生成 com.google.common.eventbus.DeadEvent 通知。如果您希望 Camel 仅侦听精确指定的事件(因此启用 DeadEvent 支持),请使用 listenerInterface 端点选项。Camel 将通过您在通过后一选项指定的接口创建动态代理,仅侦听由接口处理程序方法指定的消息。以下演示了带有单一方法处理仅 SpecificEvent 实例的监听程序接口示例。

package com.example;

public interface CustomListener {

  @Subscribe
  void eventReceived(SpecificEvent event);

}

上方出现的监听程序可以在端点定义中使用,如下所示:

from("guava-eventbus:busName?listenerInterface=com.example.CustomListener").to("seda:queue");

129.6. 消耗多种事件

为了定义由 Guava EventBus consumer 使用 监听器 端点选项消耗的多种事件类型,因为监听程序接口可能会提供标有 @Subscribe 注释的多种方法。

package com.example;

public interface MultipleEventsListener {

  @Subscribe
  void someEventReceived(SomeEvent event);

  @Subscribe
  void anotherEventReceived(AnotherEvent event);

}

上方出现的监听程序可以在端点定义中使用,如下所示:

from("guava-eventbus:busName?listenerInterface=com.example.MultipleEventsListener").to("seda:queue");

第 130 章 HawtDB (已弃用)

可作为 Camel 2.3 提供

HawtDB 是一个轻量级、可嵌入的键值数据库。它允许与 Camel 一起为各种 Camel 功能(如聚合器)提供持久性支持。

它提供的当前功能:

  • HawtDBAggregationRepository

已弃用

HawtDB 项目已弃用,由 leveldb 替代,作为轻量级、可嵌入的键值数据库。要使用 leveldb 可轻松使用该 leveldbjni 项目。Apache ActiveMQ 项目正在计划将 leveldb 用作未来基于的主要消息存储位置,以取代 kahadb。

我们建议使用 camel-leveldb 组件替代它。

HawtDB 1.4 或更早版本的问题

HawtDB 1.4 或更早版本中存在一个错误,这意味着文件存储不会释放未使用的空间。这意味着文件在不断增长。这个问题已在带有 Camel 2.5 开始的 HawtDB 1.5 中解决。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-hawtdb</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

它提供的当前功能:

  • HawtDBAggregationRepository

130.1. Using HawtDBAggregationRepository

HawtDBAggregationRepository 是一个 AggregationRepository,它可即时保留聚合的消息。这可确保您不会松散的消息,因为默认聚合器将仅使用内存 AggregationRepository

它有以下选项:

选项类型描述

repositoryName

字符串

必需的存储库名称。允许您将共享的 HawtDBFile 用于多个存储库。

persistentFileName

字符串

持久性存储的文件名。如果启动新文件时不存在 文件。

bufferSize

int

映射到文件存储的内存片段缓冲区的大小。默认其 8mb。该值以字节为单位。

sync

布尔值

HawtDBFile 是否应该同步写操作。默认为 true。通过同步写操作,确保其始终等待所有写入操作到磁盘,因此不会松散更新。如果您禁用这个选项,则 HawtDB 会在有多个写入时自动同步。

pageSize

内存页的大小。默认情况下,它的 512 字节。该值以字节为单位。

hawtDBFile

HawtDBFile

使用现有配置的 org.apache.camel.component.hawtdb.HawtDBFile 实例。

returnOldExchange

布尔值

如果存在,get 操作是否应该返回旧的现有 Exchange。默认情况下,这个选项为 false 以优化,因为我们在聚合时不需要旧的交换。

useRecovery

布尔值

是否启用恢复。此选项默认为 true。启用 Camel 聚合器自动恢复失败的聚合交换时,它们被重新提交。

recoveryInterval

long

如果启用了恢复,则会每 x 一次运行后台任务来扫描失败的交换以进行恢复并重新提交。默认情况下,这个间隔为 5000 millis。

maximumRedeliveries

int

允许您限制恢复的交换尝试的最大重新传送尝试数。如果启用,如果所有重新传送尝试都失败,则 Exchange 将移到 dead letter 频道。默认情况下禁用这个选项。如果使用这个选项,则必须提供 deadLetterUri 选项。

deadLetterUri

字符串

一个 Dead Letter Channel 的端点 uri,其中会移动已耗尽恢复的 Exchange。如果使用这个选项,则必须提供 最大值的Redeliveries 选项。

optimisticLocking

false

Camel 2.12: 打开选择性锁定,在集群环境中通常需要多个 Camel 应用程序共享基于 HawtDB 的聚合存储库。

必须提供 repositoryName 选项。然后,必须提供 persistentFileNamehawtDBFile

130.1.1. 永久保留什么

HawtDBAggregationRepository 只保留任何 Serializable 兼容数据类型。如果数据类型不是这样丢弃的类型,并记录 WARN。它只会保留 消息正文 和消息标题。Exchange 属性 不具有持久性

130.1.2. 恢复

HawtDBAggregationRepository 默认会恢复任何失败的交换。它通过执行在持久性存储中扫描故障 Exchange 的后台任务来实现此目的。您可以使用 checkInterval 选项设置此任务运行的频率。恢复工作是确保 Camel 尝试恢复和重做失败的交换的事务。任何发现的交换将从持久性存储中恢复,并再次重新提交。

当 Exchange 被恢复/redelivered时,会设置以下标头:

标头类型描述

Exchange.REDELIVERED

布尔值

设置为 true 以指示 Exchange 处于红色状态。

Exchange.REDELIVERY_COUNTER

整数

从 1 开始重新发送尝试。

只有当成功处理 Exchange 时,它才会标记为完成,当 确认 方法在 AggregationRepository 上调用时,才会将其标记为完成。这意味着,如果同一交换再次失败,它将被重试,直到成功为止。

您可以使用选项 maximumRedeliveries 来限制给定恢复的 Exchange 的最大重新传送尝试次数。您还必须设置 deadLetterUri 选项,因此 Camel 知道在点击 的最大值时要发送交换 的位置。

您可以在 camel-hawtdb 的单元测试中看到一些示例,例如: https://svn.apache.org/repos/asf/camel/trunk/components/camel-hawtdb/src/test/java/org/apache/camel/component/hawtdb/HawtDBAggregateRecoverTest.java

130.1.2.1. 在 Java DSL 中使用 HawtDBAggregationRepository

在这个示例中,我们希望在 target/data/hawtdb.dat 文件中持续聚合的信息。

130.1.2.2. 在 Spring XML 中使用 HawtDBAggregationRepository

同一个示例,但使用 Spring XML :

130.1.3. 依赖项

要在 camel 路由中使用 HawtDB,您需要添加对 camel-hawtdb 的依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-hawtdb</artifactId>
  <version>2.3.0</version>
</dependency>

130.1.4. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • 聚合器
  • 组件

第 131 章 Hazelcast 组件

可作为 Camel 版本 2.7 提供

hazelcast- 组件允许您使用 Hazelcast 分布式数据网格 / 缓存。Hazelcast 是内存数据网格中,完全用 Java 编写(single jar)。它为不同的数据存储提供了很好的分页,如映射、多映射(相同键、n 值)、队列、列表和原子数。使用 Hazelcast 的主要原因是其简单集群支持。如果您在网络中启用了多播,则可运行有百个节点没有额外配置的集群。Hazelcast 只能配置为在节点之间添加 n 个副本等额外功能(默认为 1)、缓存持久性、网络配置(如果需要),接近缓存、信法等等。如需更多信息,请参阅 中的 Hazelcast 文档。http://www.hazelcast.com/docs.jsp

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hazelcast</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

131.1. Hazelcast 组件

请参阅以下组件用法:* map * multi map * queue * topic * list * seda * set * atomic number * cluster support (instance) * replicatedmap * ringbuffer 

131.2. 使用 hazelcast 参考

131.2.1. 按名称

<bean id="hazelcastLifecycle" class="com.hazelcast.core.LifecycleService"
      factory-bean="hazelcastInstance" factory-method="getLifecycleService"
      destroy-method="shutdown" />

<bean id="config" class="com.hazelcast.config.Config">
    <constructor-arg type="java.lang.String" value="HZ.INSTANCE" />
</bean>

<bean id="hazelcastInstance" class="com.hazelcast.core.Hazelcast" factory-method="newHazelcastInstance">
    <constructor-arg type="com.hazelcast.config.Config" ref="config"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route id="testHazelcastInstanceBeanRefPut">
        <from uri="direct:testHazelcastInstanceBeanRefPut"/>
        <setHeader headerName="CamelHazelcastOperationType">
            <constant>put</constant>
        </setHeader>
        <to uri="hazelcast-map:testmap?hazelcastInstanceName=HZ.INSTANCE"/>
    </route>

    <route id="testHazelcastInstanceBeanRefGet">
        <from uri="direct:testHazelcastInstanceBeanRefGet" />
        <setHeader headerName="CamelHazelcastOperationType">
            <constant>get</constant>
        </setHeader>
        <to uri="hazelcast-map:testmap?hazelcastInstanceName=HZ.INSTANCE"/>
        <to uri="seda:out" />
    </route>
</camelContext>

131.2.2. 按实例

<bean id="hazelcastInstance" class="com.hazelcast.core.Hazelcast"
      factory-method="newHazelcastInstance" />
<bean id="hazelcastLifecycle" class="com.hazelcast.core.LifecycleService"
      factory-bean="hazelcastInstance" factory-method="getLifecycleService"
      destroy-method="shutdown" />

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route id="testHazelcastInstanceBeanRefPut">
        <from uri="direct:testHazelcastInstanceBeanRefPut"/>
        <setHeader headerName="CamelHazelcastOperationType">
            <constant>put</constant>
        </setHeader>
        <to uri="hazelcast-map:testmap?hazelcastInstance=#hazelcastInstance"/>
    </route>

    <route id="testHazelcastInstanceBeanRefGet">
        <from uri="direct:testHazelcastInstanceBeanRefGet" />
        <setHeader headerName="CamelHazelcastOperationType">
            <constant>get</constant>
        </setHeader>
        <to uri="hazelcast-map:testmap?hazelcastInstance=#hazelcastInstance"/>
        <to uri="seda:out" />
    </route>
</camelContext>

131.3. 发布 hazelcast 实例作为 OSGI 服务

如果在 OSGI 容器中操作,并且您希望在同一容器中使用 hazelcast 实例。您可以使用缓存来将实例发布为 OSGI 服务以及捆绑包,用于引用 hazelcast 端点中的服务。

131.3.1. 捆绑包 A 创建实例,并将其发布为 OSGI 服务

 

<bean id="config" class="com.hazelcast.config.FileSystemXmlConfig">
    <argument type="java.lang.String" value="${hazelcast.config}"/>
</bean>

<bean id="hazelcastInstance" class="com.hazelcast.core.Hazelcast" factory-method="newHazelcastInstance">
    <argument type="com.hazelcast.config.Config" ref="config"/>
</bean>

<!-- publishing the hazelcastInstance as a service -->
<service ref="hazelcastInstance" interface="com.hazelcast.core.HazelcastInstance" />

131.3.2. bundle B 使用实例

<!-- referencing the hazelcastInstance as a service -->
<reference ref="hazelcastInstance" interface="com.hazelcast.core.HazelcastInstance" />

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route id="testHazelcastInstanceBeanRefPut">
        <from uri="direct:testHazelcastInstanceBeanRefPut"/>
        <setHeader headerName="CamelHazelcastOperationType">
            <constant>put</constant>
        </setHeader>
        <to uri="hazelcast-map:testmap?hazelcastInstance=#hazelcastInstance"/>
    </route>

    <route id="testHazelcastInstanceBeanRefGet">
        <from uri="direct:testHazelcastInstanceBeanRefGet" />
        <setHeader headerName="CamelHazelcastOperationType">
            <constant>get</constant>
        </setHeader>
        <to uri="hazelcast-map:testmap?hazelcastInstance=#hazelcastInstance"/>
        <to uri="seda:out" />
    </route>
</camelContext>

第 132 章 Hazelcast Atomic Number 组件

可作为 Camel 版本 2.7 提供

Hazelcast atomic 数量是 Camel Hazelcast 组件之一,它允许您访问 Hazelcast 原子数。原子数是一种对象,只是提供网格广泛的数量(长)。

此端点没有使用者!

132.1. 选项

Hazelcast Atomic Number 组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast Atomic Number 端点使用 URI 语法配置:

hazelcast-atomicvalue:cacheName

使用以下路径和查询参数:

132.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

132.1.2. 查询参数(10 参数):

名称描述默认类型

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

defaultOperation (producer)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (producer)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (producer)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

132.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-atomicvalue.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-atomicvalue.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-atomicvalue.enabled

启用 hazelcast-atomicvalue 组件

true

布尔值

camel.component.hazelcast-atomicvalue.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-atomicvalue.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-atomicvalue.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

132.3. atomic number producer - to("hazelcast-atomicvalue:foo")

此制作者的操作为:* setvalue (使用给定值设置数字)* get * increase (+1)* reduce (-1)* destroy

请求消息的标头变量:

名称类型描述

CamelHazelcastOperationType

字符串

有效值为: setvalue、get、increased、decrease、destroy

132.3.1. 设置 示例:

Java DSL:

from("direct:set")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.SET_VALUE))
.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX);

Spring DSL:

<route>
    <from uri="direct:set" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>setvalue</constant>
    </setHeader>
    <to uri="hazelcast-atomicvalue:foo" />
</route>

提供在消息正文中设置的值(其中值为 10): template.sendBody ("direct:set", 10);

132.3.2. 获取的示例

Java DSL:

from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET))
.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX);

Spring DSL:

<route>
    <from uri="direct:get" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>get</constant>
    </setHeader>
    <to uri="hazelcast-atomicvalue:foo" />
</route>

您可以使用 长正文 = template.requestBody ("direct:get", null, Long.class);.

132.3.3. 递增 示例:

Java DSL:

from("direct:increment")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.INCREMENT))
.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX);

Spring DSL:

<route>
    <from uri="direct:increment" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>increment</constant>
    </setHeader>
    <to uri="hazelcast-atomicvalue:foo" />
</route>

实际值(递增后)将在消息正文中提供。

132.3.4. 解除 的示例

Java DSL:

from("direct:decrement")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DECREMENT))
.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX);

Spring DSL:

<route>
    <from uri="direct:decrement" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>decrement</constant>
    </setHeader>
    <to uri="hazelcast-atomicvalue:foo" />
</route>

实际值(之后)将在消息正文中提供。

132.3.5. 销毁示例

Java DSL:

from("direct:destroy")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DESTROY))
.toF("hazelcast-%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX);

Spring DSL:

<route>
    <from uri="direct:destroy" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>destroy</constant>
    </setHeader>
    <to uri="hazelcast-atomicvalue:foo" />
</route>

第 133 章 Hazelcast 实例组件

可作为 Camel 版本 2.7 提供

Hazelcast 实例组件是 Camel Hazelcast 组件之一,它可让您在集群中使用缓存实例的加入/保留事件。Hazelcast 在一个"服务器节点"中有意义,但 extremly 在集群环境中强大。

此端点不提供制作者!

133.1. 选项

Hazelcast 实例组件支持 3 个选项,它们如下。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast Instance 端点使用 URI 语法配置:

hazelcast-instance:cacheName

使用以下路径和查询参数:

133.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

133.1.2. 查询参数(16 参数):

名称描述默认类型

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

defaultOperation (consumer)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (consumer)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (consumer)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

pollingTimeout (consumer)

在 Poll 模式中定义 Queue consumer 的轮询超时

10000

long

poolSize (consumer)

定义 Queue Consumer Executor 的池大小

1

int

queueConsumerMode (consumer)

定义 Queue Consumer mode: Listen 或 Poll

listen

HazelcastQueueConsumer Mode

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

133.2. Spring Boot Auto-Configuration

组件支持 26 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-atomicvalue.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-atomicvalue.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-instance.enabled

启用 hazelcast-instance 组件

true

布尔值

camel.component.hazelcast-instance.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-instance.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-instance.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.hazelcast-list.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-list.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-map.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-map.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-multimap.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-multimap.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-queue.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-queue.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-replicatedmap.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-replicatedmap.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-ringbuffer.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-ringbuffer.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-seda.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-seda.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-set.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-set.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-topic.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-topic.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-topic.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-topic.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

133.3. instance consumer - from("hazelcast-instance:foo")

The instance consumer fires if a new cache instance will join or leave the cluster.

例如:

fromF("hazelcast-%sfoo", HazelcastConstants.INSTANCE_PREFIX)
.log("instance...")
.choice()
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
        .log("...added")
        .to("mock:added")
    .otherwise()
        .log("...removed")
        .to("mock:removed");

每个事件都提供消息标题中的以下信息:

响应消息中的标头变量:

名称类型描述

CamelHazelcastListenerTime

Long

millis 事件的时间

CamelHazelcastListenerType

字符串

映射消费者设置这里"instancelistener"

CamelHazelcastListenerAction

字符串

事件类型 - 此处 添加或删除

CamelHazelcastInstanceHost

字符串

实例的主机名

CamelHazelcastInstancePort

整数

实例的端口号

第 134 章 Hazelcast List 组件

可作为 Camel 版本 2.7 提供

Hazelcast List 组件是 Camel Hazelcast 组件之一,它允许您访问 Hazelcast 分布式列表。

134.1. 选项

Hazelcast List 组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast List 端点使用 URI 语法配置:

hazelcast-list:cacheName

使用以下路径和查询参数:

134.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

134.1.2. 查询参数(16 参数):

名称描述默认类型

defaultOperation (common)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (common)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (common)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollingTimeout (consumer)

在 Poll 模式中定义 Queue consumer 的轮询超时

10000

long

poolSize (consumer)

定义 Queue Consumer Executor 的池大小

1

int

queueConsumerMode (consumer)

定义 Queue Consumer mode: Listen 或 Poll

listen

HazelcastQueueConsumer Mode

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

134.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-list.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-list.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-list.enabled

启用 hazelcast-list 组件

true

布尔值

camel.component.hazelcast-list.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-list.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-list.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

134.3. 列出制作者 - 至("hazelcast-list:foo"

list producer 提供 7 个操作:* addAll * set * get * removevalue * removeAll * clear

134.3.1. 添加 的示例:

from("direct:add")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.ADD))
.toF("hazelcast-%sbar", HazelcastConstants.LIST_PREFIX);

134.3.2. 获取的示例

from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET))
.toF("hazelcast-%sbar", HazelcastConstants.LIST_PREFIX)
.to("seda:out");

134.3.3. setvalue 的示例:

from("direct:set")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.SET_VALUE))
.toF("hazelcast-%sbar", HazelcastConstants.LIST_PREFIX);

134.3.4. removevalue 的示例:

from("direct:removevalue")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.REMOVE_VALUE))
.toF("hazelcast-%sbar", HazelcastConstants.LIST_PREFIX);

请注意, CamelcastObjectIndex 标头用于索引目的。

134.4. 列出消费者 - from ("hazelcast-list:foo"

列表使用者提供 2 个操作:* 添加 * 删除

fromF("hazelcast-%smm", HazelcastConstants.LIST_PREFIX)
    .log("object...")
    .choice()
        .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
            .log("...added")
                        .to("mock:added")
        .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
            .log("...removed")
                        .to("mock:removed")
                .otherwise()
                        .log("fail!");

第 135 章 Hazelcast Map 组件

可作为 Camel 版本 2.7 提供

Hazelcast Map 组件是 Camel Hazelcast 组件之一,它允许您访问 Hazelcast 分布式地图。

135.1. 选项

Hazelcast Map 组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast Map 端点使用 URI 语法配置:

hazelcast-map:cacheName

使用以下路径和查询参数:

135.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

135.1.2. 查询参数(16 参数):

名称描述默认类型

defaultOperation (common)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (common)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (common)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollingTimeout (consumer)

在 Poll 模式中定义 Queue consumer 的轮询超时

10000

long

poolSize (consumer)

定义 Queue Consumer Executor 的池大小

1

int

queueConsumerMode (consumer)

定义 Queue Consumer mode: Listen 或 Poll

listen

HazelcastQueueConsumer Mode

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

135.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-map.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-map.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-map.enabled

启用 hazelcast-map 组件

true

布尔值

camel.component.hazelcast-map.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-map.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-map.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

135.3. Map cache producer - to("hazelcast-map:foo")

如果要在映射中存储值,可以使用映射缓存制作者。

映射缓存制作器提供 CamelHazelcastOperationType 标头指定的操作:

  • put
  • putIfAbsent
  • get
  • getAll
  • keySet
  • containsKey
  • containsValue
  • delete
  • update
  • query
  • clear
  • evict
  • evictAll

所有操作都位于 "hazelcast.operation.type" 标头变量中。在 Java DSL 中,您可以使用 org.apache.camel.component.hazelcast.Hazelcast.HazelcastOperation 中的恒定性。

请求消息的标头变量:

名称类型描述

CamelHazelcastOperationType

字符串

如上所述。

CamelHazelcastObjectId

字符串

存储 / 的对象 ID,在缓存中找到您的对象(查询操作不需要)

putputIfAbsent 操作提供驱除机制:

名称类型描述

CamelHazelcastObjectTtlValue

整数

TTL 的值。

CamelHazelcastObjectTtlUnit

java.util.concurrent.TimeUnit

单位值(DAYS / HOURS / MINUTES / …​.

您可以使用以下方法调用示例:

template.sendBodyAndHeader("direct:[put|get|update|delete|query|evict]", "my-foo", HazelcastConstants.OBJECT_ID, "4711");

135.3.1. 放置 的示例:

Java DSL:

from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUT))
.toF("hazelcast-%sfoo", HazelcastConstants.MAP_PREFIX);

Spring DSL:

<route>
    <from uri="direct:put" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>put</constant>
    </setHeader>
    <to uri="hazelcast-map:foo" />
</route>

使用驱除 放置 示例:

Java DSL:

from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUT))
.setHeader(HazelcastConstants.TTL_VALUE, constant(Long.valueOf(1)))
.setHeader(HazelcastConstants.TTL_UNIT, constant(TimeUnit.MINUTES))
.toF("hazelcast-%sfoo", HazelcastConstants.MAP_PREFIX);

Spring DSL:

<route>
    <from uri="direct:put" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>put</constant>
    </setHeader>
    <setHeader headerName="HazelcastConstants.TTL_VALUE">
        <simple resultType="java.lang.Long">1</simple>
    </setHeader>
    <setHeader headerName="HazelcastConstants.TTL_UNIT">
        <simple resultType="java.util.concurrent.TimeUnit">TimeUnit.MINUTES</simple>
    </setHeader>
    <to uri="hazelcast-map:foo" />
</route>

135.3.2. 获取的示例

Java DSL:

from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET))
.toF("hazelcast-%sfoo", HazelcastConstants.MAP_PREFIX)
.to("seda:out");

Spring DSL:

<route>
    <from uri="direct:get" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>get</constant>
    </setHeader>
    <to uri="hazelcast-map:foo" />
    <to uri="seda:out" />
</route>

135.3.3. 更新 示例:

Java DSL:

from("direct:update")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.UPDATE))
.toF("hazelcast-%sfoo", HazelcastConstants.MAP_PREFIX);

Spring DSL:

<route>
    <from uri="direct:update" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>update</constant>
    </setHeader>
    <to uri="hazelcast-map:foo" />
</route>

135.3.4. 删除 示例:

Java DSL:

from("direct:delete")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DELETE))
.toF("hazelcast-%sfoo", HazelcastConstants.MAP_PREFIX);

Spring DSL:

<route>
    <from uri="direct:delete" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>delete</constant>
    </setHeader>
    <to uri="hazelcast-map:foo" />
</route>

135.3.5. 查询示例

Java DSL:

from("direct:query")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.QUERY))
.toF("hazelcast-%sfoo", HazelcastConstants.MAP_PREFIX)
.to("seda:out");

Spring DSL:

<route>
    <from uri="direct:query" />
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>query</constant>
    </setHeader>
    <to uri="hazelcast-map:foo" />
    <to uri="seda:out" />
</route>

对于查询操作 Hazelcast 提供了 SQL (如语法)以查询您的分布式映射。

String q1 = "bar > 1000";
template.sendBodyAndHeader("direct:query", null, HazelcastConstants.QUERY, q1);

135.4. Map cache consumer - from("hazelcast-map:foo")

Hazelcast 在其数据网格上提供事件监听程序。如果要操作缓存,如果要通知缓存,您可以使用映射使用者。共有 4 个事件: 放置更新删除envict。事件类型将存储在"hazelcast.listener.action" header 变量中。映射使用者在这些变量中提供一些额外信息:

响应消息中的标头变量:

名称类型描述

CamelHazelcastListenerTime

Long

millis 事件的时间

CamelHazelcastListenerType

字符串

映射消费者设置这里"cachelistener"

CamelHazelcastListenerAction

字符串

事件类型 - 此处 添加了updateenvicted 并删除。

CamelHazelcastObjectId

字符串

对象的 oid

CamelHazelcastCacheName

字符串

缓存的名称 - 例如 "foo"

CamelHazelcastCacheType

字符串

缓存的类型 - 此处映射

对象值将存储在 消息正文 中的放置和更新 操作中。

例如:

fromF("hazelcast-%sfoo", HazelcastConstants.MAP_PREFIX)
.log("object...")
.choice()
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
         .log("...added")
         .to("mock:added")
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ENVICTED))
         .log("...envicted")
         .to("mock:envicted")
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.UPDATED))
         .log("...updated")
         .to("mock:updated")
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
         .log("...removed")
         .to("mock:removed")
    .otherwise()
         .log("fail!");

第 136 章 Hazelcast Multimap 组件

可作为 Camel 版本 2.7 提供

Hazelcast Multimap component 是 Camel Hazelcast 组件之一,它可让您访问分布式多映射的 Hazelcast。

136.1. 选项

Hazelcast Multimap 组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast Multimap 端点使用 URI 语法配置:

hazelcast-multimap:cacheName

使用以下路径和查询参数:

136.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

136.1.2. 查询参数(16 参数):

名称描述默认类型

defaultOperation (common)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (common)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (common)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollingTimeout (consumer)

在 Poll 模式中定义 Queue consumer 的轮询超时

10000

long

poolSize (consumer)

定义 Queue Consumer Executor 的池大小

1

int

queueConsumerMode (consumer)

定义 Queue Consumer mode: Listen 或 Poll

listen

HazelcastQueueConsumer Mode

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

136.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-multimap.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-multimap.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-multimap.enabled

启用 hazelcast-multimap 组件

true

布尔值

camel.component.hazelcast-multimap.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-multimap.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-multimap.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

136.3. multimap cache producer - to("hazelcast-multimap:foo")

multimap 是一个缓存,您可以将 n 值存储到一个键。多图制作者提供 4 个操作(put、get、removevalue、deletevalue 和 delete)。

请求消息的标头变量:

名称类型描述

CamelHazelcastOperationType

字符串

有效值为: put、get、deletevalue、delete Camel 2.16: clear.

CamelHazelcastObjectId

字符串

用于存储 / 的对象 ID,在缓存中找到您的对象

136.3.1. 放置 的示例:

Java DSL:

from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUT))
.to(String.format("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX));

Spring DSL:

<route>
    <from uri="direct:put" />
    <log message="put.."/>
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>put</constant>
    </setHeader>
    <to uri="hazelcast-multimap:foo" />
</route>

136.3.2. removevalue 的示例:

Java DSL:

from("direct:removevalue")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.REMOVE_VALUE))
.toF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX);

Spring DSL:

<route>
    <from uri="direct:removevalue" />
    <log message="removevalue..."/>
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>removevalue</constant>
    </setHeader>
    <to uri="hazelcast-multimap:foo" />
</route>

要删除一个值,您必须提供要在消息正文中删除的值。如果您的多映射对象 \{key: "4711" 值:{ "my-foo", "my-bar"}} 您需要在消息正文中放入 "my-foo" 值,以删除 "my-foo" 值。

136.3.3. 获取的示例

Java DSL:

from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET))
.toF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX)
.to("seda:out");

Spring DSL:

<route>
    <from uri="direct:get" />
    <log message="get.."/>
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>get</constant>
    </setHeader>
    <to uri="hazelcast-multimap:foo" />
    <to uri="seda:out" />
</route>

136.3.4. 删除 示例:

Java DSL:

from("direct:delete")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DELETE))
.toF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX);

Spring DSL:

<route>
    <from uri="direct:delete" />
    <log message="delete.."/>
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>delete</constant>
    </setHeader>
    <to uri="hazelcast-multimap:foo" />
</route>

您可以通过以下方法在测试类中调用它们:

template.sendBodyAndHeader("direct:[put|get|removevalue|delete]", "my-foo", HazelcastConstants.OBJECT_ID, "4711");

136.4. multimap cache consumer - from("hazelcast-multimap:foo")

对于多映射缓存,该组件提供与映射缓存消费者相同的监听器/变量(更新和信项监听程序除外)。唯一的区别是 URI 中的 多映射 前缀。下面是一个示例:

fromF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX)
.log("object...")
.choice()
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
        .log("...added")
                .to("mock:added")
        //.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ENVICTED))
        //        .log("...envicted")
        //        .to("mock:envicted")
        .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
                .log("...removed")
                .to("mock:removed")
        .otherwise()
                .log("fail!");

响应消息中的标头变量:

名称类型描述

CamelHazelcastListenerTime

Long

millis 事件的时间

CamelHazelcastListenerType

字符串

映射消费者设置这里"cachelistener"

CamelHazelcastListenerAction

字符串

事件类型 - 这里 添加或删除 (并很快 被确认

CamelHazelcastObjectId

字符串

对象的 oid

CamelHazelcastCacheName

字符串

缓存的名称 - 例如 "foo"

CamelHazelcastCacheType

字符串

缓存的类型 - 这里的 multimap

第 137 章 Hazelcast Queue 组件

可作为 Camel 版本 2.7 提供

Hazelcast Queue 组件是 Camel Hazelcast 组件之一,它允许您访问 Hazelcast 分布式队列。

137.1. 选项

Hazelcast Queue 组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast Queue 端点使用 URI 语法配置:

hazelcast-queue:cacheName

使用以下路径和查询参数:

137.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

137.1.2. 查询参数(16 参数):

名称描述默认类型

defaultOperation (common)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (common)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (common)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollingTimeout (consumer)

在 Poll 模式中定义 Queue consumer 的轮询超时

10000

long

poolSize (consumer)

定义 Queue Consumer Executor 的池大小

1

int

queueConsumerMode (consumer)

定义 Queue Consumer mode: Listen 或 Poll

listen

HazelcastQueueConsumer Mode

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

137.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-queue.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-queue.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-queue.enabled

启用 hazelcast-queue 组件

true

布尔值

camel.component.hazelcast-queue.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-queue.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-queue.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

137.3. queue producer - to ("hazelcast-queue:foo")

队列制作者提供 10 个操作:* add * poll * peek * offer * remove value * remaining capacity * remaining * remove all * remove all * take * take * retain all

137.3.1. 添加 的示例:

from("direct:add")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.ADD))
.toF("hazelcast-%sbar", HazelcastConstants.QUEUE_PREFIX);

137.3.2. 放置 的示例:

from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUT))
.toF("hazelcast-%sbar", HazelcastConstants.QUEUE_PREFIX);

137.3.3. 轮询 示例:

from("direct:poll")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.POLL))
.toF("hazelcast:%sbar", HazelcastConstants.QUEUE_PREFIX);

137.3.4. peek 示例:

from("direct:peek")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PEEK))
.toF("hazelcast:%sbar", HazelcastConstants.QUEUE_PREFIX);

137.3.5. 提供的示例

from("direct:offer")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.OFFER))
.toF("hazelcast:%sbar", HazelcastConstants.QUEUE_PREFIX);

137.3.6. removevalue 的示例:

from("direct:removevalue")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.REMOVE_VALUE))
.toF("hazelcast-%sbar", HazelcastConstants.QUEUE_PREFIX);

137.3.7. 剩余容量 示例:

from("direct:remaining-capacity").setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.REMAINING_CAPACITY)).to(
String.format("hazelcast-%sbar", HazelcastConstants.QUEUE_PREFIX));

137.3.8. 删除所有 示例:

from("direct:removeAll").setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.REMOVE_ALL)).to(
String.format("hazelcast-%sbar", HazelcastConstants.QUEUE_PREFIX));

137.3.9. 如果删除 示例

from("direct:removeIf").setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.REMOVE_IF)).to(
String.format("hazelcast-%sbar", HazelcastConstants.QUEUE_PREFIX));

137.3.10. 对 进行 drain 的示例

from("direct:drainTo").setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DRAIN_TO)).to(
String.format("hazelcast-%sbar", HazelcastConstants.QUEUE_PREFIX));

137.3.11. 获取示例

from("direct:take").setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.TAKE)).to(
String.format("hazelcast-%sbar", HazelcastConstants.QUEUE_PREFIX));

137.3.12. 保留所有 的示例:

from("direct:retainAll").setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.RETAIN_ALL)).to(
String.format("hazelcast-%sbar", HazelcastConstants.QUEUE_PREFIX));

137.4. 队列使用者 - from ("hazelcast-queue:foo")

队列使用者提供两种不同的模式:

  • Poll
  • listen

Poll 模式示例

fromF("hazelcast-%sfoo?queueConsumerMode=Poll", HazelcastConstants.QUEUE_PREFIX)).to("mock:result");

这样,消费者将轮询队列并在超时后返回队列或 null 的头头。

在 Listen 模式中,消费者将侦听队列上的事件。

Listen 模式中的队列使用者提供 2 个操作:* 添加 * 删除

Listen 模式示例

fromF("hazelcast-%smm", HazelcastConstants.QUEUE_PREFIX)
   .log("object...")
   .choice()
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
            .log("...added")
        .to("mock:added")
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
        .log("...removed")
        .to("mock:removed")
    .otherwise()
        .log("fail!");

第 138 章 Hazelcast Replicated Map 组件

作为 Camel 版本 2.16 可用

Hazelcast 实例组件是 Camel Hazelcast 组件之一,它可让您在集群中使用缓存实例的加入/保留事件。复制的映射是一种较弱的分布式键值数据结构,没有数据分区。

138.1. 选项

Hazelcast Replicated Map 组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast Replicated Map 端点使用 URI 语法配置:

hazelcast-replicatedmap:cacheName

使用以下路径和查询参数:

138.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

138.1.2. 查询参数(16 参数):

名称描述默认类型

defaultOperation (common)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (common)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (common)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollingTimeout (consumer)

在 Poll 模式中定义 Queue consumer 的轮询超时

10000

long

poolSize (consumer)

定义 Queue Consumer Executor 的池大小

1

int

queueConsumerMode (consumer)

定义 Queue Consumer mode: Listen 或 Poll

listen

HazelcastQueueConsumer Mode

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

138.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-replicatedmap.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-replicatedmap.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-replicatedmap.enabled

启用 hazelcast-replicatedmap 组件

true

布尔值

camel.component.hazelcast-replicatedmap.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-replicatedmap.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-replicatedmap.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

138.3. 复制映射缓存制作器

复制图制作者提供 4 个操作:* put * get * delete * clear

请求消息的标头变量:

名称类型描述

CamelHazelcastOperationType

字符串

有效值为: put、get、deletevalue、delete

CamelHazelcastObjectId

字符串

用于存储 / 的对象 ID,在缓存中找到您的对象

138.3.1. 放置 的示例:

Java DSL:

from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUT))
.to(String.format("hazelcast-%sbar", HazelcastConstants.REPLICATEDMAP_PREFIX));

Spring DSL:

<route>
    <from uri="direct:put" />
    <log message="put.."/>
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>put</constant>
    </setHeader>
    <to uri="hazelcast-replicatedmap:foo" />
</route>

138.3.2. 获取的示例

Java DSL:

from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET))
.toF("hazelcast-%sbar", HazelcastConstants.REPLICATEDMAP_PREFIX)
.to("seda:out");

Spring DSL:

<route>
    <from uri="direct:get" />
    <log message="get.."/>
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>get</constant>
    </setHeader>
    <to uri="hazelcast-replicatedmap:foo" />
    <to uri="seda:out" />
</route>

138.3.3. 删除 示例:

Java DSL:

from("direct:delete")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.DELETE))
.toF("hazelcast-%sbar", HazelcastConstants.REPLICATEDMAP_PREFIX);

Spring DSL:

<route>
    <from uri="direct:delete" />
    <log message="delete.."/>
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>delete</constant>
    </setHeader>
    <to uri="hazelcast-replicatedmap:foo" />
</route>

您可以通过以下方法在测试类中调用它们:

template.sendBodyAndHeader("direct:[put|get|delete|clear]", "my-foo", HazelcastConstants.OBJECT_ID, "4711");

138.4. 复制映射缓存使用者

对于多映射缓存,该组件提供与映射缓存消费者相同的监听器/变量(更新和信项监听程序除外)。唯一的区别是 URI 中的 多映射 前缀。下面是一个示例:

fromF("hazelcast-%sbar", HazelcastConstants.MULTIMAP_PREFIX)
.log("object...")
.choice()
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
        .log("...added")
                .to("mock:added")
        //.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ENVICTED))
        //        .log("...envicted")
        //        .to("mock:envicted")
        .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
                .log("...removed")
                .to("mock:removed")
        .otherwise()
                .log("fail!");

响应消息中的标头变量:

名称类型描述

CamelHazelcastListenerTime

Long

millis 事件的时间

CamelHazelcastListenerType

字符串

映射消费者设置这里"cachelistener"

CamelHazelcastListenerAction

字符串

事件类型 - 这里 添加或删除 (并很快 被确认

CamelHazelcastObjectId

字符串

对象的 oid

CamelHazelcastCacheName

字符串

缓存的名称 - 例如 "foo"

CamelHazelcastCacheType

字符串

缓存的类型 - here 复制映射

第 139 章 Hazelcast Ringbuffer 组件

作为 Camel 版本 2.16 可用

Avalaible from Camel 2.16

Hazelcast ringbuffer 组件是 Camel Hazelcast 组件之一,它可让您访问 Hazelcast ringbuffer。Ringbuffer 是一个分布式数据结构,其数据存储在类环形结构中。您可以将其视为具有特定容量的循环数组。 

139.1. 选项

Hazelcast Ringbuffer 组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast Ringbuffer 端点使用 URI 语法进行配置:

hazelcast-ringbuffer:cacheName

使用以下路径和查询参数:

139.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

139.1.2. 查询参数(10 参数):

名称描述默认类型

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

defaultOperation (producer)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (producer)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (producer)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

139.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-ringbuffer.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-ringbuffer.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-ringbuffer.enabled

启用 hazelcast-ringbuffer 组件

true

布尔值

camel.component.hazelcast-ringbuffer.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-ringbuffer.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-ringbuffer.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

139.3. ringbuffer 缓存制作者

ringbuffer producer 提供 5 个操作:* add * readonceHead * readonceTail * remainingCapacity * capacity

请求消息的标头变量:

名称类型描述

CamelHazelcastOperationType

字符串

有效值为: put、get、deletevalue、delete

CamelHazelcastObjectId

字符串

用于存储 / 的对象 ID,在缓存中找到您的对象

139.3.1. 放置 的示例:

Java DSL:

from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.ADD))
.to(String.format("hazelcast-%sbar", HazelcastConstants.RINGBUFFER_PREFIX));

Spring DSL:

<route>
    <from uri="direct:put" />
    <log message="put.."/>
        <!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
    <setHeader headerName="hazelcast.operation.type">
        <constant>add</constant>
    </setHeader>
    <to uri="hazelcast-ringbuffer:foo" />
</route>

139.3.2. 来自 head 的 readonce 示例:

Java DSL:

from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.READ_ONCE_HEAD))
.toF("hazelcast-%sbar", HazelcastConstants.RINGBUFFER_PREFIX)
.to("seda:out");

第 140 章 Hazelcast SEDA 组件

可作为 Camel 版本 2.7 提供

Hazelcast SEDA 组件是 Camel Hazelcast 组件之一,它允许您访问 Hazelcast BlockingQueue。SEDA 组件与提供的其余组件不同。它实施工作队列以支持异步 SEDA 架构,类似于核心"SEDA"组件。

140.1. 选项

Hazelcast SEDA 组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast SEDA 端点使用 URI 语法进行配置:

hazelcast-seda:cacheName

使用以下路径和查询参数:

140.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

140.1.2. 查询参数(16 参数):

名称描述默认类型

defaultOperation (common)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (common)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (common)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollingTimeout (consumer)

在 Poll 模式中定义 Queue consumer 的轮询超时

10000

long

poolSize (consumer)

定义 Queue Consumer Executor 的池大小

1

int

queueConsumerMode (consumer)

定义 Queue Consumer mode: Listen 或 Poll

listen

HazelcastQueueConsumer Mode

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

140.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-seda.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-seda.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-seda.enabled

启用 hazelcast-seda 组件

true

布尔值

camel.component.hazelcast-seda.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-seda.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-seda.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

140.3. SEDA producer - to ("hazelcast-seda:foo"

SEDA 生产者不提供任何操作。您只能将数据发送到指定的队列。

Java DSL :

from("direct:foo")
.to("hazelcast-seda:foo");

Spring DSL:

<route>
   <from uri="direct:start" />
   <to uri="hazelcast-seda:foo" />
</route>

140.4. SEDA 消费者 - from ("hazelcast-seda:foo")

SEDA 使用者不提供任何操作。您只能从指定队列检索数据。

Java DSL :

from("hazelcast-seda:foo")
.to("mock:result");

Spring DSL:

<route>
  <from uri="hazelcast-seda:foo" />
  <to uri="mock:result" />
</route>

第 141 章 Hazelcast Set Component

可作为 Camel 版本 2.7 提供

Hazelcast Set 组件是 Camel Hazelcast 组件之一,它允许您访问 Hazelcast 分布式集。

141.1. 选项

Hazelcast Set 组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast Set 端点使用 URI 语法进行配置:

hazelcast-set:cacheName

使用以下路径和查询参数:

141.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

141.1.2. 查询参数(16 参数):

名称描述默认类型

defaultOperation (common)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (common)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (common)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollingTimeout (consumer)

在 Poll 模式中定义 Queue consumer 的轮询超时

10000

long

poolSize (consumer)

定义 Queue Consumer Executor 的池大小

1

int

queueConsumerMode (consumer)

定义 Queue Consumer mode: Listen 或 Poll

listen

HazelcastQueueConsumer Mode

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

141.2. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.hazelcast-set.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-set.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-set.enabled

启用 hazelcast-set 组件

true

布尔值

camel.component.hazelcast-set.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-set.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-set.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 142 章 Hazelcast 主题组件

作为 Camel 版本 2.15 可用

Hazelcast 主题是 Camel Hazelcast 组件之一,它允许您访问分布式主题。

142.1. 选项

Hazelcast 主题组件支持 3 个选项,它们如下所列。

名称描述默认类型

hazelcastInstance (advanced)

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

HazelcastInstance

hazelcastMode (advanced)

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Hazelcast Topic 端点使用 URI 语法配置:

hazelcast-topic:cacheName

使用以下路径和查询参数:

142.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

142.1.2. 查询参数(16 参数):

名称描述默认类型

defaultOperation (common)

要指定要使用的默认操作,如果没有提供操作标头。

 

HazelcastOperation

hazelcastInstance (common)

hazelcast 实例参考,可用于 hazelcast 端点。

 

HazelcastInstance

hazelcastInstanceName (common)

hazelcast 实例参考名称,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。

 

字符串

reliable (common)

定义端点是否使用可靠的主题结构。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollingTimeout (consumer)

在 Poll 模式中定义 Queue consumer 的轮询超时

10000

long

poolSize (consumer)

定义 Queue Consumer Executor 的池大小

1

int

queueConsumerMode (consumer)

定义 Queue Consumer mode: Listen 或 Poll

listen

HazelcastQueueConsumer Mode

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

concurrentConsumers (seda)

使用并发消费者从 SEDA 队列进行轮询。

1

int

onErrorDelay (seda)

发生错误后使用者继续轮询前的毫秒。

1000

int

pollTimeout (seda)

从 SEDA 队列消耗的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

已翻译 (seda)

如果设置为 true,则消费者以事务模式运行,只有在事务提交完成时,seda 队列中的消息才会被删除。

false

布尔值

transferExchange (seda)

如果设置为 true,则将传输整个交换。如果标头或正文不包含序列化对象,则会跳过它们。

false

布尔值

142.2. Spring Boot Auto-Configuration

组件支持 8 个选项,如下所示。

名称描述默认类型

camel.component.hazelcast-topic.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-topic.customizer.hazelcast-instance.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.hazelcast-topic.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-topic.customizer.hazelcast-instance.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.hazelcast-topic.enabled

启用 hazelcast-topic 组件

true

布尔值

camel.component.hazelcast-topic.hazelcast-instance

hazelcast 实例参考,可用于 hazelcast 端点。如果没有指定实例引用,则 camel 使用 camel-hazelcast 实例中的默认 hazelcast 实例。选项为 com.hazelcast.core.HazelcastInstance 类型。

 

字符串

camel.component.hazelcast-topic.hazelcast-mode

应使用哪种实例的 hazelcast 模式。如果没有指定模式,则节点模式将是默认设置。

node

字符串

camel.component.hazelcast-topic.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

142.3. topic producer - to ("hazelcast-topic:foo"

主题制作者仅提供一个操作(发布)。

142.3.1. 发布 示例:

from("direct:add")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.PUBLISH))
.toF("hazelcast-%sbar", HazelcastConstants.PUBLISH_OPERATION);

142.4. 主题使用者 -("hazelcast-topic:foo"

主题使用者仅提供一个操作(接收方)。此组件应该支持多个消耗,因为涉及主题时,您可以自由地拥有与同一 hazelcast 主题相关的客户。

fromF("hazelcast-%sfoo", HazelcastConstants.TOPIC_PREFIX)
  .choice()
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.RECEIVED))
      .log("...message received")
    .otherwise()
      .log("...this should never have happened")

第 143 章 HBase 组件

作为 Camel 2.10 版本提供

此组件为 Apache HBase 提供 idotent 存储库、生产者和使用者。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hbase</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

143.1. Apache HBase 概述

HBase 是一个开源、分布式、版本化且面向列型存储模型,在 Google 的 Bigtable: Structured Data 的分布式存储系统后建模。当您需要随机的、实时读写访问大数据时,您可以使用 HBase。有关更多信息,请访问 Apache HBase

143.2. Camel 和 HBase

当在 camel 路由中使用数据时,始终会指定 camel 消息如何存储到数据存储中。在文档型存储方面,因为消息正文可以直接映射到文档,因此更加容易。在关系数据库中,ORM 解决方案可用于将属性映射到列等。在列中的存储方面,因为没有执行这种映射类型的标准方法就更具挑战性。

HBase 增加了两个额外的挑战:

  • HBase groups 列到家庭,因此只需使用名称惯例将属性映射到列不足够。
  • HBase 没有类型类型,这意味着它将所有内容存储为字节[],并且不知道字节[] 是否为 String (数字、序列化 Java 对象或只是二进制数据)。

为克服这些挑战,camel-hbase 利用消息标题来指定消息到 HBase 列的映射。它还能够使用一些 camel-hbase 提供的类来建模 HBase 数据,并可轻松转换为 xml/json 等。
最后,它为用户提供了实施和使用自己的映射策略的功能。

无论映射策略 camel-hbase 将把消息转换为 org.apache.camel.component.hbase.model.HBaseData 对象,并将该对象用于其内部操作。

143.3. 配置组件

HBase 组件可以提供一个自定义 HBaseConfiguration 对象作为属性,或者可以根据 classpath 上找到的 HBase 相关资源自行创建 HBase 配置对象。

    <bean id="hbase" class="org.apache.camel.component.hbase.HBaseComponent">
        <property name="configuration" ref="config"/>
    </bean>

如果没有向组件提供配置对象,则组件将创建一个。创建的配置将搜索 hbase-site.xml 文件的类路径,该文件从中提取配置。您可以在以下位置找到有关如何配置 HBase 客户端的更多信息: HBase 客户端配置和依赖项

143.4. HBase Producer

如上方所述,Clal 为 HBase 提供 produers 端点。这可让您使用您的 camel 路由存储、删除、检索或查询数据。

hbase://table[?options]

其中 table 是表名称。

支持的操作有:

  • put
  • Get
  • 删除
  • 扫描

143.4.1. 支持的 URI 选项

HBase 组件支持 3 个选项,它们如下。

名称描述默认类型

配置 (高级)

使用共享配置

 

配置

poolMaxSize (common)

HTable 池中每个表保留的最大引用数。默认值为 10。

10

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

HBase 端点使用 URI 语法配置:

hbase:tableName

使用以下路径和查询参数:

143.4.2. 路径名(1 参数):

名称描述默认类型

tableName

所需的 表的名称

 

字符串

143.4.3. 查询参数(16 参数):

名称描述默认类型

cellMappingStrategyFactory (common)

使用负责映射单元的自定义 CellMappingStrategyFactory。

 

CellMappingStrategy Factory

filters (common)

要使用的过滤器列表。

 

list

mappingStrategyClassName (common)

自定义映射策略实施的类名称。

 

字符串

mappingStrategyName (common)

用于将 Camel 消息映射到 HBase 列的策略。支持的值: header 或 body。

 

字符串

rowMapping (common)

将 map 中的键/值映射到 HBaseRow。支持以下键: rowId - 行的 id。其使用有限,因为行通常会更改每个 Exchange. rowType - 类型 to covert row id to。支持的操作:CamelHBaseScan. family. - 列系列.支持一个数字后缀来指代多个列。jitlifier - 列限定符。支持一个数字后缀来指代多个列。值 - 值。支持一个数字后缀来指代多个列 valueType - 值类型。支持一个数字后缀来指代多个列。支持的操作:CamelHBaseGet 和 CamelHBaseScan.

 

map

rowModel (common)

org.apache.camel.component.hbase.model.HBaseRow 实例,描述应如何建模每行

 

HBaseRow

userGroupInformation (common)

定义与 HBase 通信的特权,比如使用 kerberos。

 

UserGroupInformation

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

maxMessagesPerPoll (consumer)

获取在每次轮询时轮询的最大消息数量。默认为没有限制,但使用 0 或负数数字将其禁用。

 

int

操作 (消费者)

要执行的 HBase 操作

 

字符串

remove (consumer)

如果 选项为 true,Camel HBase Consumer 将删除它处理的行。

true

布尔值

removeHandler (consumer)

要使用要删除行时执行的自定义 HBaseRemoveHandler。

 

HBaseRemoveHandler

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

maxResults (producer)

扫描的最大行数。

100

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

143.5. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.hbase.configuration

使用共享配置。选项为 org.apache.hadoop.conf.Configuration 类型。

 

字符串

camel.component.hbase.enabled

启用 hbase 组件

true

布尔值

camel.component.hbase.pool-max-size

HTable 池中每个表保留的最大引用数。默认值为 10。

10

整数

camel.component.hbase.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

143.5.1. 放置操作.

HBase 是一个基于列的存储,允许您将数据存储到特定行的特定列中。列分组为家庭,因此为了指定列,您需要指定该列系列和该列的限定符。要将数据存储至特定列中,您需要同时指定列和行。

将数据存储为来自 camel 路由的 HBase 最简单的方案是存储消息正文的一部分到指定的 HBase 列。

        <route>
            <from uri="direct:in"/>
            <!-- Set the HBase Row -->
            <setHeader headerName="CamelHBaseRowId">
                <el>${in.body.id}</el>
            </setHeader>
            <!-- Set the HBase Value -->
            <setHeader headerName="CamelHBaseValue">
                <el>${in.body.value}</el>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBasePut&amp;family=myfamily&amp;qualifier=myqualifier"/>
        </route>

上面的路由假定消息正文包含一个对象,它有一个 id 和 value 属性,并将值内容存储在 id 指定的行中的 HBase 列中 myfamily:myqualifier 中。如果需要指定多个列/值对,只需指定额外的列映射。请注意,您必须使用第二条标题、eg RowId2、RowId3、RowId4 等数字。只有 1st 标头没有数字 1。

        <route>
            <from uri="direct:in"/>
            <!-- Set the HBase Row 1st column -->
            <setHeader headerName="CamelHBaseRowId">
                <el>${in.body.id}</el>
            </setHeader>
            <!-- Set the HBase Row 2nd column -->
            <setHeader headerName="CamelHBaseRowId2">
                <el>${in.body.id}</el>
            </setHeader>
            <!-- Set the HBase Value for 1st column -->
            <setHeader headerName="CamelHBaseValue">
                <el>${in.body.value}</el>
            </setHeader>
            <!-- Set the HBase Value for 2nd column -->
            <setHeader headerName="CamelHBaseValue2">
                <el>${in.body.othervalue}</el>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBasePut&amp;family=myfamily&amp;qualifier=myqualifier&amp;family2=myfamily&amp;qualifier2=myqualifier2"/>
        </route>

务必记住,您可以使用 uri 选项、邮件标题或两者的组合。建议将恒定值指定为 uri 和动态值作为标头。如果某些内容都定义为标题和 uri 的一部分,则将使用标题。

143.5.2. 获取运营.

Get Operation 是一个用于从指定的 HBase 行检索一个或多个值的操作。要指定您要检索的值,只需将它们指定为 uri 的一部分,或作为邮件标题。

        <route>
            <from uri="direct:in"/>
            <!-- Set the HBase Row of the Get -->
            <setHeader headerName="CamelHBaseRowId">
                <el>${in.body.id}</el>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBaseGet&amp;family=myfamily&amp;qualifier=myqualifier&amp;valueType=java.lang.Long"/>
            <to uri="log:out"/>
        </route>

在上面的示例中,get 操作的结果将存储为名为 CamelHBaseValue 的标头。

143.5.3. 删除操作.

您还可以 camel-hbase 来执行 HBase delete 操作。删除操作将删除整个行。所有这些需要指定为一个或多个行,作为邮件标题的一部分。

        <route>
            <from uri="direct:in"/>
            <!-- Set the HBase Row of the Get -->
            <setHeader headerName="CamelHBaseRowId">
                <el>${in.body.id}</el>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBaseDelete"/>
        </route>

143.5.4. 扫描操作.

扫描操作等同于 HBase 中的查询。您可以使用扫描操作来检索多行。指定结果中的列应当是什么列,同时指定如何使用 uri 选项或标头将值转换为对象。

        <route>
            <from uri="direct:in"/>
            <to uri="hbase:mytable?operation=CamelHBaseScan&amp;family=myfamily&amp;qualifier=myqualifier&amp;valueType=java.lang.Long&amp;rowType=java.lang.String"/>
            <to uri="log:out"/>
        </route>

在这种情况下,您还需要指定过滤器列表来限制结果。您可以将过滤器列表指定为 uri,并且 camel 只返回满足所有过滤器的行。
要有一个可以了解作为消息一部分的信息的过滤器,camel 定义 ModelAwareFilter。这将允许您的过滤器考虑消息和映射策略定义的模型。
当使用 ModelAwareFilter camel-hbase 时,将所选映射策略应用到消息中,这将创建一个对象来建模映射,并将该对象传递到 Filter。

例如,要使用 作为消息标头执行扫描,您可以使用 ModelAwareColumnMatchFilter,如下所示。

        <route>
            <from uri="direct:scan"/>
            <!-- Set the Criteria -->
            <setHeader headerName="CamelHBaseFamily">
                <constant>name</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseQualifier">
                <constant>first</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseValue">
                <el>in.body.firstName</el>
            </setHeader>
            <setHeader headerName="CamelHBaseFamily2">
                <constant>name</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseQualifier2">
                <constant>last</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseValue2">
                <el>in.body.lastName</el>
            </setHeader>
            <!-- Set additional fields that you want to be return by skipping value -->
            <setHeader headerName="CamelHBaseFamily3">
                <constant>address</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseQualifier3">
                <constant>country</constant>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBaseScan&amp;filters=#myFilterList"/>
        </route>

        <bean id="myFilters" class="java.util.ArrayList">
            <constructor-arg>
                <list>
                    <bean class="org.apache.camel.component.hbase.filters.ModelAwareColumnMatchingFilter"/>
                </list>
            </constructor-arg>
        </bean>

上面的路由假定 pojo 具有属性 firstName,而 lastName 则作为消息正文传递,它会采用这些属性并将它们作为消息标头的一部分来添加。默认映射策略会创建一个模型对象,它将标头映射到 HBase 列,并将模型用于 ModelAwareColumnMatchingFilter。过滤器将过滤出任何行,它们不包含与模型匹配的列。它类似于以下示例查询。

143.6. HBase Consumer

Camel HBase Consumer 将对指定的 HBase 表执行重复扫描,并将返回扫描结果作为消息的一部分。您可以指定标题映射(默认)或正文映射。稍后,将添加 org.apache.camel.component.hbase.model.HBaseData 作为消息正文的一部分。

hbase://table[?options]

您可以指定您要返回的列,并将其类型作为 uri 选项的一部分:

hbase:mutable?family=name&qualifer=first&valueType=java.lang.String&family=address&qualifer=number&valueType2=java.lang.Integer&rowType=java.lang.Long

上面的示例将创建一个由指定字段组成的模型对象,扫描结果将使用值填充模型对象。最后,将使用映射策略将此模型映射到 camel 消息。

143.7. HBase Idempotent 软件仓库

camel-hbase 组件还提供幂等存储库,当您想要确保仅处理每条消息时,可以使用它。HBase idempotent 存储库配置了表格、列系列和列限定符,并将创建到每个消息的行。

HBaseConfiguration configuration = HBaseConfiguration.create();
HBaseIdempotentRepository repository = new HBaseIdempotentRepository(configuration, tableName, family, qualifier);

from("direct:in")
  .idempotentConsumer(header("messageId"), repository)
  .to("log:out);

143.8. HBase 映射

上面提到了,默认的映射策略是 标题和正文 映射。
您可以在下面找到一些有关每个映射策略如何工作的详细示例。

143.8.1. HBase 标头映射示例

标头映射是默认映射。将值 "myvalue" 放入 HBase row "myrow" and column "myfamily:mycolum" 中,消息应包含以下标头:

标头

CamelHBaseRowId

myrow

CamelHBaseFamily

myfamily

CamelHBaseQualifier

myqualifier

CamelHBaseValue

myvalue

要为不同的列和/或不同的行放置更多值,您可以使用标头的索引指定附加标头后缀,例如:

标头

CamelHBaseRowId

myrow

CamelHBaseFamily

myfamily

CamelHBaseQualifier

myqualifier

CamelHBaseValue

myvalue

CamelHBaseRowId2

myrow2

CamelHBaseFamily2

myfamily

CamelHBaseQualifier2

myqualifier

CamelHBaseValue2

myvalue2

对于检索操作,如 get 或 scan,您还可以为希望数据转换为的类型的每个列指定。对于考试速度:

标头

CamelHBaseFamily

myfamily

CamelHBaseQualifier

myqualifier

CamelHBaseValueType

Long

请注意,为了避免对所有消息常见的样板标头,您也可以将它们指定为端点 uri 的一部分,如下所示。

143.8.2. 正文映射示例

要使用正文映射策略,您必须将选项 mappingStrategy 指定为 uri 的一部分,例如:

hbase:mytable?mappingStrategyName=body

要使用正文映射策略,正文需要包含 org.apache.camel.component.hbase.model.HBaseData 的实例。您可以构建 t

HBaseData data = new HBaseData();
HBaseRow row = new HBaseRow();
row.setId("myRowId");
HBaseCell cell = new HBaseCell();
cell.setFamily("myfamily");
cell.setQualifier("myqualifier");
cell.setValue("myValue");
row.getCells().add(cell);
data.addRows().add(row);

以上对象可用于放置操作,并将导致创建或更新带有 id myRowId 的行,并将值 myvalue 添加到列 myfamily:myqualifier。
正文映射策略可能首先没有吸引人。它与标头映射策略相比的优点在于,HBaseData 对象可轻松转换为 xml/json。

143.9. 另请参阅

第 144 章 HDFS 组件(已弃用)

可作为 Camel 版本 2.8 使用

hdfs 组件允许您读取和写入来自 HDFS 文件系统的消息。HDFS 是 Hadoop 的核心分布式文件系统。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hdfs</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

144.1. URI 格式

hdfs://hostname[:port][/path][?options]

您可以以以下格式将查询选项附加到 URI 中,?option=value&option=value&amp;…​
。路径会按照以下方式处理:

  1. 作为使用者,如果文件是文件,它将只读取文件,否则如果它代表一个目录,它会扫描路径下的所有文件满足配置模式。该目录下的所有文件都必须是同一类型。
  2. 作为制作者,如果定义至少一个拆分策略,则路径被视为目录,并且制作者会在这个目录下使用配置的 UuidGenerator 创建不同的文件。

备注

当从 hdfs 消耗时,在正常模式中,文件被分成块,每个块生成一个信息。您可以使用 chunkSize 选项配置块的大小。如果要从 hdfs 读取并使用文件组件写入常规文件,您可以使用 fileMode=Append 将每个块附加在一起。

 

144.2. 选项

HDFS 组件支持 2 个选项,它们如下所列。

名称描述默认类型

jAASConfiguration (common)

要将给定配置用于 JAAS 的安全性。

 

配置

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

HDFS 端点使用 URI 语法进行配置:

hdfs:hostName:port/path

使用以下路径和查询参数:

144.2.1. 路径名(3 参数):

名称描述默认类型

hostName

要使用 所需的 HDFS 主机

 

字符串

port

要使用的 HDFS 端口

8020

int

path

需要 要使用的目录路径

 

字符串

144.2.2. 查询参数(38 参数):

名称描述默认类型

connectOnStartup (common)

在启动制作者/消费者时是否连接到 HDFS 文件系统。如果为 false,则会按需创建连接。请注意,HDFS 可能需要 till 15 分钟才能建立连接,因为它已硬编码 45 x 20 sec 重新传送。通过将此选项设置为 false 可让应用程序启动,而不阻止 till 15 分钟。

true

布尔值

fileSystemType (common)

设置为 LOCAL,以使用 HDFS,而是本地 java.io.File。

HDFS

HdfsFileSystemType

fileType (common)

要使用的文件类型。如需了解更多详细信息,请参阅 Hadoop HDFS 文档,了解各种文件类型。

NORMAL_FILE

HdfsFileType

keyType (common)

键的类型(以序列或映射文件为准)。

NULL

WritableType

owner (common)

文件所有者必须与此所有者匹配,以供消费者选择该文件。否则会跳过该文件。

 

字符串

valueType (common)

键的类型(以序列或映射文件为准)

BYTES

WritableType

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

delay (consumer)

目录扫描之间的时间间隔(毫秒)。

1000

long

initialDelay (consumer)

对于使用者,在开始扫描目录前要等待(毫秒)数。

 

long

pattern (consumer)

用于扫描目录的模式

*

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

append (producer)

将 附加到现有文件。请注意,并非所有 HDFS 文件系统都支持 append 选项。

false

布尔值

overwrite (producer)

是否用相同名称覆盖现有文件

true

布尔值

blockSize (advanced)

HDFS 块的大小

67108864

long

bufferSize (advanced)

HDFS 使用的缓冲区大小

4096

int

checkIdleInterval (advanced)

运行闲置检查程序后台任务的频率(中间时间)。只有在分割策略为 IDLE 时才使用这个选项。

500

int

chunkSize (advanced)

当读取常规文件时,这被分成块中每个块的消息。

4096

int

compressionCodec (advanced)

要使用的压缩代码

DEFAULT

HdfsCompressionCodec

compressionType (advanced)

要使用的压缩类型(默认情况下不使用)

NONE

CompressionType

openedSuffix (advanced)

打开文件以读取/写入该文件时,使用这个后缀重命名该文件,以避免在写入阶段读取该文件。

已打开

字符串

readSuffix (advanced)

文件读取后,使用这个后缀重命名该文件,以避免再次读取。

读取

字符串

复制 (高级)

HDFS 复制因素

3

splitStrategy (advanced)

在当前版本的 Hadoop 中,在附加模式中打开一个文件被禁用,因为它并不可靠。因此,目前只能创建新文件。Camel HDFS 端点试图通过这种方式解决这个问题:如果定义了 split 策略选项,则 hdfs 路径将用作目录和文件,将使用配置的 UuidGenerator 创建。每次满足分割条件时,都会创建一个新文件。splitStrategy 选项定义为带有以下语法的字符串: splitStrategy=ST:value,ST:value,…​ where ST can be: BYTES a new file is created,当写入的字节数超过这个值超过 MESSAGES 时,旧值就会关闭,在写入消息的数量超过这个值时,旧会被关闭。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

144.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.hdfs.enabled

启用 hdfs 组件

true

布尔值

camel.component.hdfs.j-a-a-s-configuration

要将给定配置用于 JAAS 的安全性。选项是一个 javax.security.auth.login.Configuration 类型。

 

字符串

camel.component.hdfs.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

144.3.1. KeyType 和 ValueType

  • NULL it 表示键或值不存在
  • BYTE 用于编写字节,java Byte 类映射到 BYTE
  • 用于编写一系列字节的 BYTES。它映射 java ByteBuffer 类
  • INT 用于编写 java 整数
  • FLOAT 用于编写 java float
  • 用于编写 java long 的 LONG
  • DOUBLE for writing java double
  • TEXT 用于编写 java 字符串

BYTES 还与其它内容一起使用,例如,在 Camel 中,文件作为 InputStream 发送,但 int本例以一系列字节顺序编写。

144.4. 拆分策略

在当前版本的 Hadoop 中,在附加模式中打开一个文件被禁用,因为它并不可靠。因此,目前只能创建新文件。Camel HDFS 端点尝试以这种方式解决此问题:

  • 如果定义了 split 策略选项,则 hdfs 路径将用作目录和文件,将使用配置的 UuidGenerator 创建。
  • 每次满足分割条件时,都会创建一个新文件。
    splitStrategy 选项定义为一个字符串,语法如下:
    splitStrategy=<ST>:<value>,<ST>:<value>,*

其中 <ST> 可以是:

  • BYTES 创建了一个新文件,当写入字节数超过 <value> 时,旧会关闭
  • MESSAGES 创建了一个新文件,当写入的消息数超过 <value> 时,旧的就会关闭。
  • IDLE 会创建一个新文件,当最后 <value> 毫秒时没有写入时,旧会被关闭。

备注

请注意,这个策略目前需要设置 IDLE 值,或将 HdfsConstants.HDFS_CLOSE 标头设置为 false 来使用 BYTES/MESSAGES configuration…​otherwise,该文件会在每条消息中关闭

例如:

hdfs://localhost/tmp/simple-file?splitStrategy=IDLE:1000,BYTES:5

它表示:当新文件闲置超过 1 秒时,或写入超过 5 字节时就会创建新的文件。因此,运行 hadoop fs -ls /tmp/simple-file 您将看到已创建多个文件。

144.5. 消息标头

此组件支持以下标头:

144.5.1. 仅限制作者

标头描述

CamelFileName

Camel 2.13: 指定要写入的文件的名称(相对于端点路径)。name 可以是 String 或一个 Expression 对象。仅在不使用 split 策略时相关。

144.6. 控制 以关闭文件流

可从 Camel 2.10.4 开始

当在没有分割策略 的情况下使用 HDFS producer 时,文件输出流在写入后默认关闭。但是,您可能想让流保持打开,以后仅显式关闭该流。为此,您可以使用标头 HdfsConstants.HDFS_CLOSE (值 = "CamelHdfsClose")来控制这一点。将此值设置为布尔值,您可以显式控制是否应关闭流。

请注意,如果您使用分割策略,因为有各种策略可以在流关闭时控制。

144.7. 在 OSGi 中使用该组件

但是,这个组件在 OSGi 环境中完全正常工作,但需要用户进行一些操作。Hadoop 使用线程上下文类加载加载器来加载资源。通常,线程上下文类loader将是包含路由的捆绑包的捆绑包类加载程序。因此,默认的配置文件需要从捆绑包类加载程序查看。处理它的典型方法是在捆绑包根目录中保留 core-default.xml 副本。该文件可以在 hadoop-common.jar 中找到。

第 145 章 HDFS2 组件

作为 Camel 版本 2.14 可用

hdfs2 组件可让您使用 Hadoop 2.x 将消息从/写入 HDFS 文件系统。HDFS 是 Hadoop 的核心分布式文件系统。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hdfs2</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

145.1. URI 格式

hdfs2://hostname[:port][/path][?options]

您可以以以下格式将查询选项附加到 URI 中,?option=value&option=value&amp;…​
。路径会按照以下方式处理:

  1. 作为使用者,如果文件是文件,它将只读取文件,否则如果它代表一个目录,它会扫描路径下的所有文件满足配置模式。该目录下的所有文件都必须是同一类型。
  2. 作为制作者,如果定义至少一个拆分策略,则路径被视为目录,并且制作者会在这个目录下使用配置的 UuidGenerator 创建不同的文件。

当从 hdfs2 消耗时,在正常模式中,文件被分成块,每个块生成一条消息。您可以使用 chunkSize 选项配置块的大小。如果要从 hdfs 读取并使用文件组件写入常规文件,您可以使用 fileMode=Append 将每个块附加在一起。

145.2. 选项

HDFS2 组件支持 2 个选项,它们如下所列。

名称描述默认类型

jAASConfiguration (common)

要将给定配置用于 JAAS 的安全性。

 

配置

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

HDFS2 端点使用 URI 语法进行配置:

hdfs2:hostName:port/path

使用以下路径和查询参数:

145.2.1. 路径名(3 参数):

名称描述默认类型

hostName

要使用 所需的 HDFS 主机

 

字符串

port

要使用的 HDFS 端口

8020

int

path

需要 要使用的目录路径

 

字符串

145.2.2. 查询参数(38 参数):

名称描述默认类型

connectOnStartup (common)

在启动制作者/消费者时是否连接到 HDFS 文件系统。如果为 false,则会按需创建连接。请注意,HDFS 可能需要 till 15 分钟才能建立连接,因为它已硬编码 45 x 20 sec 重新传送。通过将此选项设置为 false 可让应用程序启动,而不阻止 till 15 分钟。

true

布尔值

fileSystemType (common)

设置为 LOCAL,以使用 HDFS,而是本地 java.io.File。

HDFS

HdfsFileSystemType

fileType (common)

要使用的文件类型。如需了解更多详细信息,请参阅 Hadoop HDFS 文档,了解各种文件类型。

NORMAL_FILE

HdfsFileType

keyType (common)

键的类型(以序列或映射文件为准)。

NULL

WritableType

owner (common)

文件所有者必须与此所有者匹配,以供消费者选择该文件。否则会跳过该文件。

 

字符串

valueType (common)

键的类型(以序列或映射文件为准)

BYTES

WritableType

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pattern (consumer)

用于扫描目录的模式

*

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

append (producer)

将 附加到现有文件。请注意,并非所有 HDFS 文件系统都支持 append 选项。

false

布尔值

overwrite (producer)

是否用相同名称覆盖现有文件

true

布尔值

blockSize (advanced)

HDFS 块的大小

67108864

long

bufferSize (advanced)

HDFS 使用的缓冲区大小

4096

int

checkIdleInterval (advanced)

运行闲置检查程序后台任务的频率(中间时间)。只有在分割策略为 IDLE 时才使用这个选项。

500

int

chunkSize (advanced)

当读取常规文件时,这被分成块中每个块的消息。

4096

int

compressionCodec (advanced)

要使用的压缩代码

DEFAULT

HdfsCompressionCodec

compressionType (advanced)

要使用的压缩类型(默认情况下不使用)

NONE

CompressionType

openedSuffix (advanced)

打开文件以读取/写入该文件时,使用这个后缀重命名该文件,以避免在写入阶段读取该文件。

已打开

字符串

readSuffix (advanced)

文件读取后,使用这个后缀重命名该文件,以避免再次读取。

读取

字符串

复制 (高级)

HDFS 复制因素

3

splitStrategy (advanced)

在当前版本的 Hadoop 中,在附加模式中打开一个文件被禁用,因为它并不可靠。因此,目前只能创建新文件。Camel HDFS 端点试图通过这种方式解决这个问题:如果定义了 split 策略选项,则 hdfs 路径将用作目录和文件,将使用配置的 UuidGenerator 创建。每次满足分割条件时,都会创建一个新文件。splitStrategy 选项定义为带有以下语法的字符串: splitStrategy=ST:value,ST:value,…​ where ST can be: BYTES a new file is created,当写入的字节数超过这个值超过 MESSAGES 时,旧值就会关闭,在写入消息的数量超过这个值时,旧会被关闭。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

145.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.hdfs2.enabled

启用 hdfs2 组件

true

布尔值

camel.component.hdfs2.j-a-a-s-configuration

要将给定配置用于 JAAS 的安全性。选项是一个 javax.security.auth.login.Configuration 类型。

 

字符串

camel.component.hdfs2.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

145.3.1. KeyType 和 ValueType

  • NULL it 表示键或值不存在
  • BYTE 用于编写字节,java Byte 类映射到 BYTE
  • 用于编写一系列字节的 BYTES。它映射 java ByteBuffer 类
  • INT 用于编写 java 整数
  • FLOAT 用于编写 java float
  • 用于编写 java long 的 LONG
  • DOUBLE for writing java double
  • TEXT 用于编写 java 字符串

BYTES 还与其它内容一起使用,例如,在 Camel 中,文件作为 InputStream 发送,但 int本例以一系列字节顺序编写。

145.4. 拆分策略

在当前版本的 Hadoop 中,在附加模式中打开一个文件被禁用,因为它并不可靠。因此,目前只能创建新文件。Camel HDFS 端点尝试以这种方式解决此问题:

  • 如果定义了 split 策略选项,则 hdfs 路径将用作目录和文件,将使用配置的 UuidGenerator 创建。
  • 每次满足分割条件时,都会创建一个新文件。
    splitStrategy 选项定义为带有以下语法的字符串: splitStrategy=<ST>:<value>,<ST>:<value>,*

其中 <ST> 可以是:

  • BYTES 创建了一个新文件,当写入字节数超过 <value> 时,旧会关闭
  • MESSAGES 创建了一个新文件,当写入的消息数超过 <value> 时,旧的就会关闭。
  • IDLE 会创建一个新文件,当最后 <value> 毫秒时没有写入时,旧会被关闭。

请注意,这个策略目前需要设置 IDLE 值,或将 HdfsConstants.HDFS_CLOSE 标头设置为 false 来使用 BYTES/MESSAGES configuration…​otherwise,该文件会在每条消息中关闭

例如:

hdfs2://localhost/tmp/simple-file?splitStrategy=IDLE:1000,BYTES:5

它表示:当新文件闲置超过 1 秒时,或写入超过 5 字节时就会创建新的文件。因此,运行 hadoop fs -ls /tmp/simple-file 您将看到已创建多个文件。

145.5. 消息标头

此组件支持以下标头:

145.5.1. 仅限制作者

标头描述

CamelFileName

Camel 2.13: 指定要写入的文件的名称(相对于端点路径)。name 可以是 String 或一个 Expression 对象。仅在不使用 split 策略时相关。

145.6. 控制 以关闭文件流

当在没有分割策略 的情况下使用 HDFS2 producer 时,文件输出流在写入后默认关闭。但是,您可能想让流保持打开,以后仅显式关闭该流。为此,您可以使用标头 HdfsConstants.HDFS_CLOSE (值 = "CamelHdfsClose")来控制这一点。将此值设置为布尔值,您可以显式控制是否应关闭流。

请注意,如果您使用分割策略,因为有各种策略可以在流关闭时控制。

145.7. 在 OSGi 中使用该组件

在与 Hadoop 2.x 用于发现不同的 org.apache.hadoop.fs.FileSystem 实施机制相关的 OSGi 环境中运行该组件时,有一些要求。Hadoop 2.x 使用 java.util.ServiceLoader,查找 /META-INF/services/org.apache.hadoop.fs.FileSystem 文件定义可用文件系统类型和实施。这些资源在 OSGi 中运行时不可用。

与 camel-hdfs 组件一样,默认的配置文件需要从捆绑包类加载程序中看到。处理它的典型方法是在捆绑包 root 中保留 core-default.xml 副本(如 hdfs-default.xml)。

145.7.1. 使用这个组件与手动定义的路由一起使用

有两个选项:

  1. 软件包 /META-INF/services/org.apache.hadoop.fs.FileSystem 资源,其中包含定义路由的捆绑包。此资源应列出所有必需的 Hadoop 2.x 文件系统实施。
  2. 提供样板初始化代码,在 org.apache.hadoop.fs.FileSystem 类中填充内部静态缓存:
org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
conf.setClass("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class, FileSystem.class);
conf.setClass("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class, FileSystem.class);
...
FileSystem.get("file:///", conf);
FileSystem.get("hdfs://localhost:9000/", conf);
...

145.7.2. 将此组件与 Blueprint 容器一起使用

两个选项:

  1. 软件包 /META-INF/services/org.apache.hadoop.fs.FileSystem 资源,其中包含蓝图定义。
  2. 在蓝图定义文件中添加以下内容:
<bean id="hdfsOsgiHelper" class="org.apache.camel.component.hdfs2.HdfsOsgiHelper">
   <argument>
      <map>
         <entry key="file:///" value="org.apache.hadoop.fs.LocalFileSystem"  />
         <entry key="hdfs://localhost:9000/" value="org.apache.hadoop.hdfs.DistributedFileSystem" />
         ...
      </map>
   </argument>
</bean>

<bean id="hdfs2" class="org.apache.camel.component.hdfs2.HdfsComponent" depends-on="hdfsOsgiHelper" />

这样,Hadoop 2.x 将具有正确映射 URI 方案到文件系统实施。

第 146 章 HeadersMap

可从 Camel 2.20 开始

camel-headersmap 是快速实施案例密集型映射,可以在运行时插入和使用的 Camel 以便使 Camel 消息标头中的性能更快速。

146.1. classpath 中的自动检测

要使用此实现,您需要做的就是将 camel-headersmap 依赖项添加到类路径,Camel 应该在启动时自动探测到这个项并记录如下:

Detected and using custom HeadersMapFactory: org.apache.camel.component.headersmap.FastHeadersMapFactory@71e9ebae

对于 spring-boot,您应该使用 camel-headersmap-starter 依赖项。

146.2. 手动启用

如果您使用 OSGi 或实现没有添加到类路径中,您需要启用这个到期情况:

CamelContext camel = ...

camel.setHeadersMapFactory(new FastHeadersMapFactory());

或者在 XML DSL (spring 或 blueprint XML 文件)中,您可以将工厂声明为 < bean>

<bean id="fastMapFactory" class="org.apache.camel.component.headersmap.FastHeadersMapFactory"/>

然后,Camel 应该检测 bean 并使用工厂。

第 147 章 Hessian DataFormat (已弃用)

作为 Camel 2.17 版提供

Hessian 是使用 Caucho's Hessian 格式进行 marshalling 和 unmarshalling 消息的数据格式。

如果要使用 Maven 中的 Hessian 数据格式,请在 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hessian</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

147.1. 选项

Hessian dataformat 支持 4 个选项,它们如下。

名称默认Java 类型描述

whitelistEnabled

true

布尔值

定义是否启用 Whitelist 功能

allowedUnmarshallObjects

 

字符串

定义允许对象被取消marshalled

deniedUnmarshallObjects

 

字符串

定义要取消编出的拒绝对象

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

147.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.hessian.allowed-unmarshall-objects

定义允许对象被取消marshalled

 

字符串

camel.dataformat.hessian.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.hessian.denied-unmarshall-objects

定义要取消编出的拒绝对象

 

字符串

camel.dataformat.hessian.enabled

启用 hessian 数据格式

true

布尔值

camel.dataformat.hessian.whitelist-enabled

定义是否启用 Whitelist 功能

true

布尔值

ND

147.3. 在 Java DSL 中使用 Hessian 数据格式

    from("direct:in")
        .marshal().hessian();

147.4. 在 Spring DSL 中使用 Hessian 数据格式

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="direct:in"/>
            <marshal ref="hessian"/>
        </route>
    </camelContext>

第 148 章 HipChat 组件

作为 Camel 版本 2.15 可用

Hipchat 组件支持生成和使用来自/到 Hipchat 服务的消息。

前提条件

您必须具有有效的 Hipchat 用户帐户,并获得可用于生成/提交消息的个人访问令牌。https://www.hipchat.com/account/api

148.1. URI 格式

hipchat://[host][:port]?options

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

148.2. URI 选项

Hipchat 组件没有选项。

Hipchat 端点使用 URI 语法进行配置:

hipchat:protocol:host:port

使用以下路径和查询参数:

148.2.1. 路径名(3 参数):

名称描述默认类型

protocol

必需的 hipchat 服务器协议,如 http。

 

字符串

主机

需要 hipchat 服务器的主机,如 api.hipchat.com

 

字符串

port

hipchat 服务器的端口。默认为 80。

80

整数

148.2.2. 查询参数(22 参数):

名称描述默认类型

authToken (common)

OAuth 2 身份验证令牌

 

字符串

consumeUsers (common)

使用 hiptchat 服务器的消息时的用户名.可以使用逗号分隔多个用户名。

 

字符串

httpClient (common)

在 API HTTP 请求过程中使用的 registry 中的 CloseableHttpClient 参考。

HttpClient 库中的 CloseableHttpClient 默认

CloseableHttpClient

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

148.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.hipchat.enabled

启用 hipchat 组件

true

布尔值

camel.component.hipchat.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

148.4. 调度的轮询消费者

此组件实施 ScheduledPollConsumer。只有来自提供的 'consumeUsers' 的最后一条消息才会检索并作为 Exchange body 发送。如果您不希望在下一个轮询上没有新消息来检索相同的消息,则您可以按照下方所示添加幂等使用者。ScheduledPollConsumer 中的所有选项也可以用于更多对使用者的控制。

@Override
public void configure() throws Exception {
 String hipchatEndpointUri = "hipchat://?authToken=XXXX&consumeUsers=@Joe,@John";
 from(hipchatEndpointUri)
  .idempotentConsumer(
    simple("${in.header.HipchatMessageDate} ${in.header.HipchatFromUser}"),
    MemoryIdempotentRepository.memoryIdempotentRepository(200)
  )
  .to("mock:result");
}

148.4.1. Hipchat consumer 设置的消息标头

标头常数类型描述

HipchatFromUser

HipchatConstants.FROM_USER

字符串

body 具有从此用户发送到 authToken 所有者的消息。

HipchatMessageDate

HipchatConstants.MESSAGE_DATE

字符串

发送日期消息。格式为 ISO-8601,位于 Hipchat 响应中

148.5. HipChat Producer

制作者可同时发送消息到 Room's 和 User。交换的正文作为消息发送。示例用法如下所示:需要设置适当的标头。

@Override
 public void configure() throws Exception {
  String hipchatEndpointUri = "hipchat://?authToken=XXXX";
  from("direct:start")
   .to(hipchatEndpointUri)
   .to("mock:result");
 }

148.5.1. Hipchat producer 评估的消息标头

标头常数类型描述

HipchatToUser

HipchatConstants.TO_USER

字符串

需要发送消息的 Hipchat 用户。

HipchatToRoom

HipchatConstants.TO_ROOM

字符串

需要向其发送消息的 Hipchat 空间。

HipchatMessageFormat

HipchatConstants.MESSAGE_FORMAT

字符串

有效格式为 'text' 或 'html'。默认:'text'

HipchatMessageBackgroundColor

HipchatConstants.MESSAGE_BACKGROUND_COLOR

字符串

有效颜色值为 'yellow', 'green', 'red', 'purple', 'gray', 'random'。默认:'yellow'(仅限使用) 

HipchatTriggerNotification

HipchatConstants.TRIGGER_NOTIFY

字符串

有效值为 'true' 或 'false'。此消息是否应触发用户通知(更改 tab 颜色,播放声音、通知手机等等)。默认:'false'(仅限为 )

148.5.2. Hipchat producer 设置的消息标头

标头常数类型描述

HipchatToUserResponseStatus

HipchatConstants.TO_USER_RESPONSE_STATUS

StatusLine the API 响应的状态,在发送给用户的消息时接收。

HipchatFromUserResponseStatus

148.5.3. 配置 Http 客户端

HipChat 组件允许您自己的 HttpClient 配置。这可以通过在 registry 中定义 CloseableHttpClient 引用(例如 Spring Context),然后在 Endpoint 定义中设置 参数,例如: hipchat:http://api.hipchat.com?httpClient=#myHttpClient

CloseableHttpClient httpclient = HttpClients.custom()
    .setConnectionManager(connManager)
    .setDefaultCookieStore(cookieStore)
    .setDefaultCredentialsProvider(credentialsProvider)
    .setProxy(new HttpHost("myproxy", 8080))
    .setDefaultRequestConfig(defaultRequestConfig)
    .build();

要查看有关 Http 客户端配置的更多信息,请查看 官方文档

148.5.4. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hipchat</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.15.0 或更高版本)

第 149 章 HL7 DataFormat

可作为 Camel 版本 2.0 提供

HL7 组件用于使用 HL7 MLLP 协议和 HL7 v2 消息,使用 HAPI 库

这个组件支持以下内容:

  • HL7 MLLP codec,Mina
  • HL7 MLLP codec for Netty4 from Camel 2.15 开始
  • 从/到 HAPI 和字符串的转换器
  • 使用 HAPI 库的 HL7 DataFormat
  • 更加便于使用,因为它与 camel-mina2 组件集成。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hl7</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

149.1. HL7 MLLP 协议

HL7 通常用于 HL7 MLLP 协议,它是一个基于文本的 TCP 套接字协议。此组件附带 Mina 和 Netty4 Codec,它符合 MLLP 协议,因此您可以轻松地公开 HL7 侦听器通过 TCP 传输层接受 HL7 请求。要公开 HL7 侦听器服务,camel-mina2 或 camel-netty4 组件用于 HL7MLLPCodec (mina2)或 HL7MLLPNettyDecoder/HL7MLLPNettyEncoder (Netty4)。

HL7 MLLP codec 可以配置为:

名称默认值描述

startByte

0x0b

跨越 HL7 有效负载的开始字节。

endByte1

0x1c

跨 HL7 有效负载的第一个结束字节。

endByte2

0x0d

整个 HL7 有效负载之间的第二代字节。

charset

JVM 默认

用于 codec 的编码(一个 charset 名称)。如果没有提供,Camel 将使用 JVM 默认 Charset

produceString

true

(从 Camel 2.14.1 起), 则 codec 使用定义的 charset 创建一个字符串。如果为 false,则 codec 会向路由发送一个纯字节阵列,以便 HL7 数据格式可以确定 HL7 消息内容的实际 charset。

convertLFtoCR

false

\n 转换为 \r0x0d, 13 十进制),并将 HL7 取胜 \r 作为网段术语符。HAPI 库需要使用 \r

149.1.1. 使用 Mina 公开 HL7 侦听器

在 Spring XML 文件中,我们将一个 mina2 端点配置为在端口 8888 上使用 TCP 侦听 HL7 请求:

<endpoint id="hl7MinaListener" uri="mina2:tcp://localhost:8888?sync=true&amp;codec=#hl7codec"/>

sync=true 表示此侦听器是同步的,因此会返回 HL7 响应到调用者。HL7 codec 使用 codec=#hl7codec 设置。请注意,hl7codec 只是一个 Spring bean ID,因此它可以命名为 mygreatcodecforhl7 或 any。在 Spring XML 文件中也设置了 codec:

<bean id="hl7codec" class="org.apache.camel.component.hl7.HL7MLLPCodec">
    <property name="charset" value="iso-8859-1"/>
</bean>

然后,可以在路由中使用 endpoint hl7MinaLlistener 作为消费者,因为这个 Java DSL 示例演示了:

from("hl7MinaListener")
  .bean("patientLookupService");

这是一个非常简单的路由,它将侦听 HL7,并将其路由到名为 patient LookupService 的服务。这也是 Spring Bean ID,在 Spring XML 中配置,如下所示:

<bean id="patientLookupService" class="com.mycompany.healthcare.service.PatientLookupService"/>

业务逻辑可以在 POJO 类中实施,而这些类不依赖于 Camel,如下所示:

import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.model.v24.segment.QRD;

public class PatientLookupService {
    public Message lookupPatient(Message input) throws HL7Exception {
        QRD qrd = (QRD)input.get("QRD");
        String patientId = qrd.getWhoSubjectFilter(0).getIDNumber().getValue();

        // find patient data based on the patient id and create a HL7 model object with the response
        Message response = ... create and set response data
        return response
    }

149.1.2. 使用 Netty 公开 HL7 侦听器(从 Camel 2.15 开始获得)

在 Spring XML 文件中,我们将一个 netty4 端点配置为在端口 8888 上使用 TCP 侦听 HL7 请求:

<endpoint id="hl7NettyListener" uri="netty4:tcp://localhost:8888?sync=true&amp;encoder=#hl7encoder&amp;decoder=#hl7decoder"/>

sync=true 表示此侦听器是同步的,因此会返回 HL7 响应到调用者。HL7 codec 使用 encoder=#hl7encoder*and*decoder=#hl7decoder 设置。请注意,hl7encoderhl7decoder 只是 bean ID,因此可以不同的命名。Bean 可以在 Spring XML 文件中设置:

<bean id="hl7decoder" class="org.apache.camel.component.hl7.HL7MLLPNettyDecoderFactory"/>
<bean id="hl7encoder" class="org.apache.camel.component.hl7.HL7MLLPNettyEncoderFactory"/>

然后,可以在路由中使用 endpoint hl7NettyListener 作为消费者,因为此 Java DSL 示例演示了:

from("hl7NettyListener")
  .bean("patientLookupService");

149.2. 使用 java.lang.String 或 byte[] 的 HL7 Model

HL7 MLLP codec 使用普通字符串作为其数据格式。Camel 使用其 Type Converter 转换为 HAPI HL7 模型对象,但如果您希望自己解析数据,您可以使用 plain String 对象。

从 Camel 2.14.1 开始,您可以通过将 generate String 属性设置为 false,让 Mina 和 Netty codecs 使用 plain byte[] 作为数据格式。Type Converter 还能够将 byte[] 转换为/从 HAPI HL7 模型对象。

149.3. 使用 HAPI 的 HL7v2 Model

HL7v2 模型使用 HAPI 库中的 Java 对象。使用这个库,您可以从大多用于 HL7v2 的 EDI 格式(ER7)进行编码和解码。

以下示例是查找使用查询 ID 为 0101701234 的请求。

MSH|^~\\&|MYSENDER|MYRECEIVER|MYAPPLICATION||200612211200||QRY^A19|1234|P|2.4
QRD|200612211200|R|I|GetPatient|||1^RD|0101701234|DEM||

使用 HL7 模型,您可以处理 ca.uhn.hl7v2.model.Message 对象,如检索一个患者 ID:

Message msg = exchange.getIn().getBody(Message.class);
QRD qrd = (QRD)msg.get("QRD");
String patientId = qrd.getWhoSubjectFilter(0).getIDNumber().getValue();  // 0101701234

当与 HL7 侦听器结合使用时,这很强大,因为您不必使用 字节[]String 或任何其他简单对象格式。您只需使用 HAPI HL7v2 模型对象。如果您知道消息类型,您可以更 type-safe:

QRY_A19 msg = exchange.getIn().getBody(QRY_A19.class);
String patientId = msg.getQRD().getWhoSubjectFilter(0).getIDNumber().getValue();

149.4. HL7 DataFormat

HL7 组件附带 HL7 数据格式,可用于对对象进行分类或未编化的 HL7。

HL7 数据格式支持 2 选项,它们如下。

名称默认Java 类型描述

validate

true

布尔值

是否默认验证 HL7 消息 Is。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

149.5. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.hl7.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.hl7.enabled

启用 hl7 数据格式

true

布尔值

camel.dataformat.hl7.validate

是否默认验证 HL7 消息 Is。

true

布尔值

camel.language.terser.enabled

启用 terser 语言

true

布尔值

camel.language.terser.trim

是否修剪值是否删除前导(尾随空格和换行符)

true

布尔值

ND

  • marshal = 从 Message 到字节流(在使用 HL7 MLLP codec 响应时可以使用)
  • unmarshal = 从字节流到消息(在从 HL7 MLLP 接收流数据时可以使用

要使用数据格式,只需实例化实例,并在路由构建器中调用 marshal 或 unmarshal 操作:

  DataFormat hl7 = new HL7DataFormat();

  from("direct:hl7in")
    .marshal(hl7)
    .to("jms:queue:hl7out");

在上面的示例中,HL7 是从 HAPI Message 对象到字节流并放在 JMS 队列上。
下一个示例相反:

  DataFormat hl7 = new HL7DataFormat();

  from("jms:queue:hl7out")
    .unmarshal(hl7)
    .to("patientLookupService");

在这里,我们将字节流解放成一个 HAPI Message 对象,后者被传递给我们的病人查找服务。

149.5.1. Serializable 信息

自 HAPI 2.0 (由 Camel 2.11使用)开始,HL7v2 模型类是完全序列化的。因此,您可以将 HL7v2 消息直接放入 JMS 队列中(例如,无需调用 marshal () ),并从队列中重新读取它们(例如,不调用 unmarshal () )。

149.5.2. 片段分隔符

Camel 2.11 开始,通过将 \n 转换为 \r 来自动修复片段分隔符。如果
需要这个转换,org.apache.camel.component.hl7.HL7#convertLFToCR 为这个目的提供了一个手 表达式

149.5.3. charset

Camel 2.14.1 开始,marshal 和 unmarshal 评估了在 MSH-18 字段中提供的 charset。如果此字段为空,则默认使用相应 Camel charset 中所含的 charset。从 HL7DataFormat 类继承时,您甚至可以通过覆盖 guessCharsetName 方法来更改此默认行为。

 

Camel 中的简写语法适用于众所周知的数据格式,常使用。然后,您不需要创建 HL7DataFormat 对象的实例:

  from("direct:hl7in")
    .marshal().hl7()
    .to("jms:queue:hl7out");

  from("jms:queue:hl7out")
    .unmarshal().hl7()
    .to("patientLookupService");

149.6. 消息标头

unmarshal 操作会将来自 MSH 片段中的字段作为 Camel 消息上的标头添加:

MSH 字段示例

CamelHL7SendingApplication

MSH-3

MYSERVER

CamelHL7SendingFacility

MSH-4

MYSERVERAPP

CamelHL7ReceivingApplication

MSH-5

MYCLIENT

CamelHL7ReceivingFacility

MSH-6

MYCLIENTAPP

CamelHL7Timestamp

MSH-7

20071231235900

CamelHL7Security

MSH-8

null

CamelHL7MessageType

MSH-9-1

ADT

CamelHL7TriggerEvent

MSH-9-2

A01

CamelHL7MessageControl

MSH-10

1234

CamelHL7ProcessingId

MSH-11

P

CamelHL7VersionId

MSH-12

2.4

`CamelHL7Context

``

' (Camel 2.14) 包含用于解析消息的 HapiContext

CamelHL7Charset

MSH-18

(Camel 2.14.1) UNICODE UTF-8

CamelHL7Context 'are 'String type 以外的所有标头。如果缺少标头值,则其 值为空

149.7. 选项

HL7 数据格式支持以下选项:

选项默认值描述

validate

true

HAPI Parser 是否应使用默认验证规则验证消息。建议使用 parserhapiContext 选项,并使用所需的 HAPI ValidationContext进行初始化。

parser

ca.uhn.hl7v2.parser.GenericParser

要使用的自定义解析程序。必须是 ca.uhn.hl7v2.parser.Parser 类型。请注意,GenericParser 还允许解析 XML 编码的 HL7v2 信息

hapiContext

ca.uhn.hl7v2.DefaultHapiContext

Camel 2.14: 自定义 HAPI 上下文,可以定义自定义解析器,自定义 ValidationContext 等。这可让您完全控制 HL7 解析和渲染过程。

149.8. 依赖项

要在 Camel 路由中使用 HL7,您需要添加上面列出的有关 camel-hl7 的依赖项,该依赖关系实施此数据格式。

HAPI 库被分成一个基础库和几个结构 ,每个 HL7v2 消息版本对应:

默认情况下,l -hl7 只引用 HAPI 基本库。应用程序负责包含结构库本身。例如,如果应用程序与 HL7v2 消息版本 2.4 和 2.5 一起工作,则必须添加以下依赖项:

<dependency>
    <groupId>ca.uhn.hapi</groupId>
    <artifactId>hapi-structures-v24</artifactId>
    <version>2.2</version>
    <!-- use the same version as your hapi-base version -->
</dependency>
<dependency>
    <groupId>ca.uhn.hapi</groupId>
    <artifactId>hapi-structures-v25</artifactId>
    <version>2.2</version>
    <!-- use the same version as your hapi-base version -->
</dependency>

或者,包含基本库的 OSGi 捆绑包可以从 中央 Maven 存储库 下载所有结构库和所需的依赖项(在捆绑包类路径中)。

<dependency>
    <groupId>ca.uhn.hapi</groupId>
    <artifactId>hapi-osgi-base</artifactId>
    <version>2.2</version>
</dependency>

149.9. terser 语言

HAPI 提供了一个 Terser 类,它利用常用位置规范语法提供对字段的访问。Terser 语言允许使用此语法从消息中提取值,并将它们用作表达式和谓词来过滤、基于内容的路由等。

示例:

import static org.apache.camel.component.hl7.HL7.terser;

   // extract patient ID from field QRD-8 in the QRY_A19 message above and put into message header
   from("direct:test1")
      .setHeader("PATIENT_ID",terser("QRD-8(0)-1"))
      .to("mock:test1");

   // continue processing if extracted field equals a message header
   from("direct:test2")
      .filter(terser("QRD-8(0)-1").isEqualTo(header("PATIENT_ID"))
      .to("mock:test2");

149.10. HL7 Validation predicate

通常最好首先解析 HL7v2 消息,并在单独的步骤中针对 HAPI ValidationContext 验证它。

示例:

import static org.apache.camel.component.hl7.HL7.messageConformsTo;
import ca.uhn.hl7v2.validation.impl.DefaultValidation;

   // Use standard or define your own validation rules
   ValidationContext defaultContext = new DefaultValidation();

   // Throws PredicateValidationException if message does not validate
   from("direct:test1")
      .validate(messageConformsTo(defaultContext))
      .to("mock:test1");

149.11. HL7 Validation predicate 使用 HapiContext (Camel 2.14)

HAPI 上下文始终使用 ValidationContext (或 ValidationRuleBuilder)进行配置,以便您可以间接地访问验证规则。另外,当取消绑定 HL7DataFormat 时,在 CamelHL7Context 标头中转发配置的 HAPI 上下文,并可轻松地重复使用此上下文的验证规则:

import static org.apache.camel.component.hl7.HL7.messageConformsTo;
import static org.apache.camel.component.hl7.HL7.messageConforms

  HapiContext hapiContext = new DefaultHapiContext();
  hapiContext.getParserConfiguration().setValidating(false); // don't validate during parsing

  // customize HapiContext some more ... e.g. enforce that PID-8 in ADT_A01 messages of version 2.4 is not empty
  ValidationRuleBuilder builder = new ValidationRuleBuilder() {
      @Override
      protected void configure() {
         forVersion(Version.V24)
              .message("ADT", "A01")
              .terser("PID-8", not(empty()));
         }
      };
  hapiContext.setValidationRuleBuilder(builder);

  HL7DataFormat hl7 = new HL7DataFormat();
  hl7.setHapiContext(hapiContext);

  from("direct:test1")
     .unmarshal(hl7)                // uses the GenericParser returned from the HapiContext
     .validate(messageConforms())   // uses the validation rules returned from the HapiContext
                                    // equivalent with .validate(messageConformsTo(hapiContext))
     // route continues from here

149.12. HL7 Acknowledgement 表达式

HL7v2 处理中的一个常见任务是生成确认消息,作为对传入的 HL7v2 消息的响应,例如,基于验证结果。通过 ack 表达式,我们可以完全完成这方面:

import static org.apache.camel.component.hl7.HL7.messageConformsTo;
import static org.apache.camel.component.hl7.HL7.ack;
import ca.uhn.hl7v2.validation.impl.DefaultValidation;

  // Use standard or define your own validation rules
   ValidationContext defaultContext = new DefaultValidation();

   from("direct:test1")
      .onException(Exception.class)
         .handled(true)
         .transform(ack()) // auto-generates negative ack because of exception in Exchange
         .end()
      .validate(messageConformsTo(defaultContext))
      // do something meaningful here

      // acknowledgement
      .transform(ack())

第 150 章 HTTP 组件(已弃用)

作为 Camel 版本 1.0 可用

http: 组件为消耗外部 HTTP 资源(作为使用 HTTP 调用外部服务器的客户端)提供基于 HTTP 的端点。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-http</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

150.1. URI 格式

http:hostname[:port][/resourceUri][?param1=value1][&param2=value2]

默认情况下,将端口 80 用于 HTTP,443 用于 HTTPS。

camel-http vs camel-jetty

您只能生成 HTTP 组件生成的端点。因此,它绝不应用作您的 camel 路由的输入。要通过 HTTP 服务器作为 camel 路由的输入来绑定/expose a HTTP 端点,您可以使用 Jetty 组件Servlet 组件

150.2. 例子

使用 POST 向正文调用 url 并将响应返回为 out 消息。如果正文是 null 调用 URL,则使用 GET 并将响应返回为 out 消息

Java DSL

Spring DSL

from("direct:start")
  .to("http://myhost/mypath");
<from uri="direct:start"/>
<to uri="http://oldhost"/>

您可以通过添加标头来覆盖 HTTP 端点 URI。Camel 将调用 http://newhost。这非常方便,例如 REST URL。

Java DSL

from("direct:start")
  .setHeader(Exchange.HTTP_URI, simple("http://myserver/orders/${header.orderId}"))
  .to("http://dummyhost");

URI 参数可以直接在端点 URI 或一个标头上设置

Java DSL

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");

将 HTTP 请求方法设置为 POST

Java DSL

Spring DSL

from("direct:start")
  .setHeader(Exchange.HTTP_METHOD, constant("POST"))
  .to("http://www.google.com");
<from uri="direct:start"/>
<setHeader headerName="CamelHttpMethod">
  <constant>POST</constant>
</setHeader>
<to uri="http://www.google.com"/>
<to uri="mock:results"/>

150.3. HTTP 选项

HTTP 组件支持 8 个选项,它们如下所列。

名称描述默认类型

httpClientConfigurer (advanced)

使用自定义 HttpClientConfigurer 执行将使用的 HttpClient 的配置。

 

HttpClientConfigurer

httpConnectionManager (advanced)

使用自定义 HttpConnectionManager 管理连接

 

HttpConnectionManager

httpBinding (producer)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

HttpBinding

httpConfiguration (producer)

使用共享 HttpConfiguration 作为基本配置。

 

HttpConfiguration

allowJavaSerialized Object (producer)

当请求使用 context-type=application/x-java-serialized-object (默认为 off)时,是否允许 java serialization。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

HTTP 端点使用 URI 语法配置:

http:httpUri

使用以下路径和查询参数:

150.3.1. 路径名(1 参数):

名称描述默认类型

httpUri

需要 要调用的 HTTP 端点的 url。

 

URI

150.3.2. 查询参数(38 参数):

名称描述默认类型

disableStreamCache (common)

确定 Servlet 的原始输入流是否已缓存(Camel 将读取流到文件,流缓存)缓存。默认情况下,Camel 会缓存 Servlet 输入流,以支持多次读取它,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。DefaultHttpBinding 会将请求输入流复制到流缓存中,如果这个选项为 false,则会将其放入消息正文,以便支持多次读取流。如果使用 Servlet 桥接/代理端点,请考虑启用这个选项来提高性能,如果不需要多次读取消息有效负载。http/http4 producer 默认将缓存响应正文流。如果将此选项设置为 true,则生产者不会缓存响应正文流,而是使用响应流,作为消息正文。

false

布尔值

headerFilterStrategy (common)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

httpBinding (common)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

HttpBinding

bridgeEndpoint (producer)

如果 选项为 true,HttpProducer 将忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 请求。您也可以将选项 throwExceptionOnFailure 设为 false,使 HttpProducer 发送所有故障响应。

false

布尔值

chunked (producer)

如果这个选项为 false,则 Servlet 将禁用 HTTP 流并在响应上设置内容长度的标头

true

布尔值

connectionClose (producer)

指定是否需要将 Connection Close 标头添加到 HTTP Request 中。默认情况下 connectionClose 为 false。

false

布尔值

copyHeaders (producer)

如果这个选项为 true,则根据复制策略将 IN Exchange 标头复制到 OUT Exchange 标头。将其设置为 false,仅允许包括 HTTP 响应中的标头(不会传播 IN 标头)。

true

布尔值

httpMethod (producer)

配置要使用的 HTTP 方法。如果设置,HttpMethod 标头无法覆盖这个选项。

 

HttpMethods

ignoreResponseBody (producer)

如果这个选项为 true,则 http producer 不会读取响应正文并缓存输入流

false

布尔值

preserveHostHeader (producer)

如果选项为 true,HttpProducer 会将 Host 标头设置为当前交换主机标头中包含的值,对于您希望下游服务器收到的主机标头,可以使用 Host 标头为代理应用程序生成准确的 URL。

false

布尔值

throwExceptionOnFailure (producer)

禁用丢弃 HttpOperationFailedException 的选项(如果来自远程服务器的响应失败)。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

transferException (producer)

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。在制作者端,异常会按原样进行反序列化和丢弃,而不是 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

okStatusCodeRange (producer)

被视为成功响应的状态代码。值包括:可以定义多个范围,以逗号分隔,例如 200-204,209,301-304。每个范围必须是单个数字,或使用包括横线的短划线。

200-299

字符串

urlRewrite (producer)

弃用了 自定义的 org.apache.camel.component.http.UrlRewrite,它允许您在网桥/proxy 端点时重写 url。更多信息请参阅 http://camel.apache.org/urlrewrite.html

 

UrlRewrite

httpClientConfigurer (advanced)

为生产者或消费者创建的新 HttpClient 实例注册自定义配置策略,如 配置身份验证机制等

 

HttpClientConfigurer

httpClientOptions (advanced)

使用 map 中的键/值配置 HttpClient。

 

map

httpConnectionManager (advanced)

使用自定义 HttpConnectionManager 管理连接

 

HttpConnectionManager

httpConnectionManager Options (advanced)

使用 Map 中的键/值配置 HttpConnectionManager。

 

map

mapHttpMessageBody (advanced)

如果此选项正确,则交换正文将映射到 HTTP 正文。将其设置为 false 将避免 HTTP 映射。

true

布尔值

mapHttpMessageFormUrl EncodedBody (advanced)

如果这个选项为 true,则交换的 IN Exchange Form Encode 正文将映射到 HTTP。将其设置为 false 可以避免 HTTP Form Encoded body 映射。

true

布尔值

mapHttpMessageHeaders (advanced)

如果此选项为 true,则交换的 IN Exchange Headers 将映射到 HTTP 标头。将其设置为 false 将避免 HTTP 标头映射。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

proxyAuthDomain (proxy)

用于 NTML 的代理身份验证域

 

字符串

proxyAuthHost (proxy)

代理身份验证主机

 

字符串

proxyAuthMethod (proxy)

要使用的代理验证方法

 

字符串

proxyAuthPassword (proxy)

代理验证密码

 

字符串

proxyAuthPort (proxy)

代理身份验证端口

 

int

proxyAuthScheme (proxy)

要使用的代理身份验证方案

 

字符串

proxyAuthUsername (proxy)

代理验证用户名

 

字符串

proxyHost (proxy)

要使用的代理主机名

 

字符串

proxyPort (proxy)

要使用的代理端口

 

int

authDomain (security)

与 NTML 搭配使用的身份验证域

 

字符串

authHost (security)

要用于 NTML 的身份验证主机

 

字符串

authMethod (security)

允许将 用作以逗号分隔的值 Basic、Digest 或 NTLM 的验证方法。

 

字符串

authMethodPriority (security)

使用的基本验证方法(可以是 Basic、Digest 或 NTLM)的验证方法。

 

字符串

authPassword (security)

身份验证密码

 

字符串

authUsername (security)

身份验证用户名

 

字符串

150.4. Spring Boot Auto-Configuration

组件支持 9 个选项,如下所示。

名称描述默认类型

camel.component.http.allow-java-serialized-object

当请求使用 context-type=application/x-java-serialized-object (默认为 off)时,是否允许 java serialization。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

camel.component.http.enabled

启用 http 组件

true

布尔值

camel.component.http.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.http.http-binding

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。选项是一个 org.apache.camel.http.common.HttpBinding 类型。

 

字符串

camel.component.http.http-client-configurer

使用自定义 HttpClientConfigurer 执行将使用的 HttpClient 的配置。选项是一个 org.apache.camel.component.http.HttpClientConfigurer 类型。

 

字符串

camel.component.http.http-configuration

使用共享 HttpConfiguration 作为基本配置。选项是一个 org.apache.camel.http.common.HttpConfiguration 类型。

 

字符串

camel.component.http.http-connection-manager

使用自定义 HttpConnectionManager 管理连接。选项是一个 org.apache.commons.httpclient.HttpConnectionManager 类型。

 

字符串

camel.component.http.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.http.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

150.5. 消息标头

名称类型描述

Exchange.HTTP_URI

字符串

要调用的 URI。将覆盖端点上直接设置的现有 URI。这个 uri 是 http 服务器要调用的 uri。它与 Camel 端点 uri 不同,您可以在其中配置端点选项,如安全性等。这个标头不支持它,它只支持 http 服务器的 uri。

Exchange.HTTP_METHOD

字符串

HTTP 方法/要使用的 HTTP 方法(Verb)

Exchange.HTTP_PATH

字符串

请求 URI 的路径,标头将使用 HTTP_URI 构建请求 URI。Camel 2.3.0: 如果路径以 "/" 开始,http 生产者将尝试根据 Exchange.HTTP_BASE_URI 标头或 exchange.getFromEndpoint ().getEndpoint ()找到相对路径;

Exchange.HTTP_QUERY

字符串

URI 参数.将覆盖端点上直接设置的现有 URI 参数。

Exchange.HTTP_RESPONSE_CODE

int

外部服务器的 HTTP 响应代码。为 200,表示确定。

Exchange.HTTP_CHARACTER_ENCODING

字符串

字符编码.

Exchange.CONTENT_TYPE

字符串

HTTP 内容类型。在 IN 和 OUT 消息上设置,以提供内容类型,如 text/html

Exchange.CONTENT_ENCODING

字符串

HTTP 内容编码。在 IN 和 OUT 消息上设置,以提供内容编码,如 gzip

Exchange.HTTP_SERVLET_REQUEST

HttpServletRequest

HttpServletRequest 对象。

Exchange.HTTP_SERVLET_RESPONSE

HttpServletResponse

HttpServletResponse 对象。

Exchange.HTTP_PROTOCOL_VERSION

字符串

Camel 2.5: 您可以使用此标头设置 http 协议版本,例如:"HTTP/1.0".如果您没有指定标头,HttpProducer 将使用默认值"HTTP/1.1"

上面的标头名称是常态。对于 spring DSL,您必须使用常值而不是名称。

150.6. Message Body

Camel 会将来自外部服务器的 HTTP 响应存储在 OUT 正文中。来自 IN 消息的所有标头都将复制到 OUT 消息,因此在路由过程中保留标头。另外,Camel 还会将 HTTP 响应标头添加到 OUT 消息标头中。

150.7. 响应代码

Camel 将根据 HTTP 响应代码处理:

  • 响应代码位于 100.299 范围中,Camel 被视为成功的响应。
  • 响应代码位于 300..399 范围中,Camel 被视为重定向响应,并将使用信息抛出 HttpOperationFailedException
  • 响应代码为 400+,Camel 将它作为外部服务器故障相关,并将引发 HttpOperationFailedException 及信息。

throwExceptionOnFailure

选项 throwExceptionOnFailure 可以设为 false,以防止 HttpOperationFailedException 引发失败的响应代码。这可让您从远程服务器获得任何响应。
下面有一个示例演示此问题。

150.8. HttpOperationFailedException

这个例外包含以下信息:

  • HTTP 状态代码
  • HTTP 状态行(状态代码的文本)
  • 重定向位置,如果服务器返回重定向
  • 如果服务器提供了正文作为响应,响应正文作为 java.lang.String

150.9. 将使用哪个 HTTP 方法

以下算法用于确定应使用什么 HTTP 方法:
1。使用作为端点配置(httpMethod)的方法。
2.使用标头中提供的方法(Exchange.HTTP_METHOD)。
3.如果标头中提供了查询字符串,则 GET
4.如果端点配置了查询字符串,则 GET
5.POST 如果存在要发送的数据(其他人不是 null)。
6.否则 GET

150.10. 如何访问 HttpServletRequest 和 HttpServletResponse

您可以使用 Camel 类型转换器系统获得这两个系统的访问权限

HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class);
HttpServletRequest response = exchange.getIn().getBody(HttpServletResponse.class);

150.11. 使用客户端超时 - SO_TIMEOUT

请参考 此链接中的单元测试

150.12. 更多示例

150.12.1. 配置代理

Java DSL

from("direct:start")
  .to("http://oldhost?proxyHost=www.myproxy.com&proxyPort=80");

还支持通过 proxyUsernameproxyPassword 选项进行代理身份验证。

150.12.2. 使用 URI 之外的代理设置

Java DSL

Spring DSL

 context.getProperties().put("http.proxyHost", "172.168.18.9");
 context.getProperties().put("http.proxyPort" "8080");
   <camelContext>
       <properties>
           <property key="http.proxyHost" value="172.168.18.9"/>
           <property key="http.proxyPort" value="8080"/>
      </properties>
   </camelContext>

端点上的选项将覆盖上下文上的选项。

150.13. 配置 charset

如果使用 POST 发送数据,您可以配置 charset

setProperty(Exchange.CHARSET_NAME, "iso-8859-1");

150.14. 带有调度轮询示例

示例每 10 秒轮询 Google 主页,并将页面写入文件 消息.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");

150.15. 获取响应代码

您可以通过使用 Exchange.HTTP_RESPONSE_CODE 的 Out message 标头获取 HTTP 响应代码。

   Exchange exchange = template.send("http://www.google.com/search", new Processor() {
            public void process(Exchange exchange) throws Exception {
                exchange.getIn().setHeader(Exchange.HTTP_QUERY, constant("hl=en&q=activemq"));
            }
   });
   Message out = exchange.getOut();
   int responseCode = out.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);

150.16. 使用 throwExceptionOnFailure=false 以获得任何响应

在下面的路由中,我们想路由一个我们丰富的消息,其中包含从远程 HTTP 调用返回的数据。当我们需要来自远程服务器的任何响应时,我们将 throwExceptionOnFailure 选项设置为 false,以便我们可以在 AggregationStrategy 中获得任何响应。由于代码基于模拟 HTTP 状态代码 404 的单元测试,因此有一些断言代码等。

150.17. 禁用 Cookies

要禁用 Cookie,您可以通过添加此 URI 选项:
httpClient.cookiePolicy=ignoreCookies来设置 HTTP Client 以忽略 cookies

150.18. 高级使用

如果您需要更多对 HTTP 生产者的控制,您应该在什么位置使用 HttpComponent 来提供自定义行为。

150.18.1. Setting MaxConnectionsPerHost

HTTP 组件有一个 org.apache.commons.httpclient.HttpConnectionManager,您可以在其中为给定组件配置各种全局配置。
通过全局,我们意味着该组件创建的端点都具有相同的共享 HttpConnectionManager。因此,如果我们希望为每个主机的最大连接设置不同的值,我们需要在 HTTP 组件上定义它,而不在我们通常使用的端点 URI 中定义。这里包括:

首先,我们在 Spring XML 中定义 http 组件。是的,我们使用相同的方案名称 http,因为 Camel 将自动发现并使用默认设置创建组件。我们需要多加规则,以便我们可以设置自己的选项。在以下示例中,我们将 max 连接设置为 5,而不是默认值 2。

然后,我们就可以将其用作我们路由中的工作:

150.18.2. 使用抢占验证

最终用户报告,他使用 HTTPS 进行身份验证时出现问题。当他发现 HTTPS 服务器没有返回 HTTP 代码 401 身份验证时,这个问题最终被解决。该解决方案设置以下 URI 选项: httpClient.authenticationPreemptive=true

150.18.3. 接受远程服务器的自签名证书

请参阅与部分代码讨论的邮寄列表,以概述了如何使用 Apache Commons HTTP API 进行此操作。http://www.nabble.com/Using-HTTPS-in-camel-http-when-remote-side-has-self-signed-cert-td25916878.html

150.18.4. 为 HTTP 客户端设置 SSL

使用 JSSE 配置实用程序

从 Camel 2.8 开始,HTTP4 组件支持通过 Camel JSSE 配置实用程序 的 SSL/TLS 配置。  这个实用程序可大大减少您需要编写的组件特定代码的数量,并在端点和组件级别进行配置。  以下示例演示了如何将 实用程序与 HTTP4 组件搭配使用。

此组件中使用的 Apache HTTP 客户端的版本从全局"protocol" registry 中解析 SSL/TLS 信息。  此组件提供了一个实施, org.apache.camel.component.http.SSLContextParametersSecureProtocolSocketFactory (HTTP 客户端协议套接字工厂 )来支持使用 Camel JSSE 配置实用程序。  以下示例演示了如何配置协议 registry,并使用路由中的注册协议信息。

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);

ProtocolSocketFactory factory =
    new SSLContextParametersSecureProtocolSocketFactory(scp);

Protocol.registerProtocol("https",
        new Protocol(
        "https",
        factory,
        443));

from("direct:start")
        .to("https://mail.google.com/mail/").to("mock:results");

直接配置 Apache HTTP 客户端

在 Apache HTTP 客户端之上构建了 camel-http 组件,您可以实施自定义 org.apache.camel.component.http.HttpClientConfigurer,以便在 http 客户端上执行一些配置。

但是,如果您只想 指定密钥存储和信任存储,您可以使用 Apache HTTP HttpClientConfigurer 进行此操作,例如:

Protocol authhttps = new Protocol("https", new AuthSSLProtocolSocketFactory(
  new URL("file:my.keystore"), "mypassword",
  new URL("file:my.truststore"), "mypassword"), 443);

Protocol.registerProtocol("https", authhttps);

然后,您需要创建一个实现 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?httpClientConfigurerRef=myHttpClientConfigurer"/>

只要您实施 HttpClientConfigurer,并且按照上述步骤配置密钥存储和信任存储,它将正常工作。

150.19. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • Jetty

第 151 章 HTTP4 组件

作为 Camel 版本 2.3 可用

http4: 组件提供基于 HTTP 的端点来调用外部 HTTP 资源(作为使用 HTTP 调用外部服务器的客户端)。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-http4</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

camel-http4 vs camel-http

Camel-http4 使用 Apache HttpClient 4.x,而 camel-http 使用 Apache HttpClient 3.x

151.1. URI 格式

对于 HTTP

http4:hostname[:port][/resourceUri][?options]

对于 HTTPS

https4:hostname[:port][/resourceUri][?options]

默认情况下,将端口 80 用于 HTTP,443 用于 HTTPS。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

camel-http4 vs camel-jetty

您只能生成 HTTP4 组件生成的端点。因此,它绝不应用作 Camel 路由的输入。要通过 HTTP 服务器作为 Camel 路由的输入来绑定/公开 HTTP 端点,请使用 Jetty 组件

151.2. Http4 组件选项

HTTP4 组件支持 18 个选项,它们如下。

名称描述默认类型

httpClientConfigurer (advanced)

使用自定义 HttpClientConfigurer 执行将使用的 HttpClient 的配置。

 

HttpClientConfigurer

clientConnectionManager (advanced)

使用自定义和共享 HttpClientConnectionManager 管理连接。如果已经进行了此配置,它将始终用于此组件创建的所有端点。

 

HttpClientConnection Manager

httpContext (advanced)

在执行请求时,使用自定义 org.apache.http.protocol.HttpContext。

 

HttpContext

sslContextParameters (security)

使用 SSLContextParameters 配置安全性。重要信息:每个 HttpComponent 支持一个 org.apache.camel.util.jsse.SSLContextParameters 实例。如果您需要使用 2 个或更多不同的实例,则需要为每个实例定义一个新的 HttpComponent。

 

SSLContextParameters

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

x509HostnameVerifier (security)

使用自定义 X509HostnameVerifier,如 DefaultHostnameVerifier 或 org.apache.http.conn.ssl.NoopHostnameVerifier。

 

HostnameVerifier

maxTotalConnections (advanced)

连接的最大数量。

200

int

connectionsPerRoute (advanced)

每个路由的最大连接数。

20

int

connectionTimeToLive (advanced)

连接到 live 的时间,单位为 millisecond,默认值始终为live。

 

long

cookieStore (producer)

使用自定义 org.apache.http.client.CookieStore。默认情况下,使用 org.apache.http.impl.client.BasicCookieStore,它是仅 Cookie 存储的内存。请注意,如果 bridgeEndpoint=true,则 Cookie 存储被强制用作 noop cookie 存储,因为我们只作为代理存储。

 

CookieStore

connectionRequest Timeout (timeout)

从连接管理器请求连接时使用的超时(毫秒)。超时值为零被解释为无限超时。超时值为零被解释为无限超时。负值解析为未定义(系统默认值)。默认: code -1

-1

int

connectTimeout (timeout)

决定在建立连接前的超时(毫秒)。超时值为零被解释为无限超时。超时值为零被解释为无限超时。负值解析为未定义(系统默认值)。默认: code -1

-1

int

socketTimeout (timeout)

以毫秒为单位定义套接字超时(SO_TIMEOUT),这是等待数据超时,或者有不同,在两个连续的数据数据包之间有不活动。超时值为零被解释为无限超时。负值解析为未定义(系统默认值)。默认: code -1

-1

int

httpBinding (advanced)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

HttpBinding

httpConfiguration (advanced)

使用共享 HttpConfiguration 作为基本配置。

 

HttpConfiguration

allowJavaSerialized Object (advanced)

请求使用 context-type=application/x-java-serialized-object 时,是否允许 java serialization。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

HTTP4 端点使用 URI 语法配置:

http4:httpUri

使用以下路径和查询参数:

151.2.1. 路径名(1 参数):

名称描述默认类型

httpUri

需要 要调用的 HTTP 端点的 url。

 

URI

151.2.2. 查询参数(49 参数):

名称描述默认类型

disableStreamCache (common)

确定 Servlet 的原始输入流是否已缓存(Camel 将读取流到文件,流缓存)缓存。默认情况下,Camel 会缓存 Servlet 输入流,以支持多次读取它,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。DefaultHttpBinding 会将请求输入流复制到流缓存中,如果这个选项为 false,则会将其放入消息正文,以便支持多次读取流。如果使用 Servlet 桥接/代理端点,请考虑启用这个选项来提高性能,如果不需要多次读取消息有效负载。http/http4 producer 默认将缓存响应正文流。如果将此选项设置为 true,则生产者不会缓存响应正文流,而是使用响应流,作为消息正文。

false

布尔值

headerFilterStrategy (common)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

httpBinding (common)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

HttpBinding

authenticationPreemptive (producer)

如果这个选项为 true,则 camel-http4 会将抢占的基本身份验证发送到服务器。

false

布尔值

bridgeEndpoint (producer)

如果 选项为 true,HttpProducer 将忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 请求。您也可以将选项 throwExceptionOnFailure 设为 false,使 HttpProducer 发送所有故障响应。

false

布尔值

chunked (producer)

如果这个选项为 false,则 Servlet 将禁用 HTTP 流并在响应上设置内容长度的标头

true

布尔值

clearExpiredCookies (producer)

在发送 HTTP 请求前,是否清除已过期的 Cookie。这样可确保 Cookie 存储不会通过添加新 Cookie (在过期时被新删除)来增加。

true

布尔值

connectionClose (producer)

指定是否需要将 Connection Close 标头添加到 HTTP Request 中。默认情况下 connectionClose 为 false。

false

布尔值

cookieStore (producer)

使用自定义 CookieStore。默认情况下,使用 BasicCookieStore,它只是一个内存 Cookie 存储。请注意,如果 bridgeEndpoint=true,则 Cookie 存储被强制用作 noop cookie 存储,因为我们只作为代理存储。如果设置了 cookie 处理程序,则 Cookie 存储也强制作为 noop cookie 存储作为 Cookie 处理,然后由 Cookie 处理程序执行。

 

CookieStore

copyHeaders (producer)

如果这个选项为 true,则根据复制策略将 IN Exchange 标头复制到 OUT Exchange 标头。将其设置为 false,仅允许包括 HTTP 响应中的标头(不会传播 IN 标头)。

true

布尔值

deleteWithBody (producer)

HTTP DELETE 是否应包含消息正文。默认情况下 HTTP DELETE 不包含任何 HTTP 消息。然而,在一些罕见的情况下,用户可能需要包含邮件正文。

false

布尔值

httpMethod (producer)

配置要使用的 HTTP 方法。如果设置,HttpMethod 标头无法覆盖这个选项。

 

HttpMethods

ignoreResponseBody (producer)

如果这个选项为 true,则 http producer 不会读取响应正文并缓存输入流

false

布尔值

preserveHostHeader (producer)

如果选项为 true,HttpProducer 会将 Host 标头设置为当前交换主机标头中包含的值,对于您希望下游服务器收到的主机标头,可以使用 Host 标头为代理应用程序生成准确的 URL。

false

布尔值

throwExceptionOnFailure (producer)

禁用丢弃 HttpOperationFailedException 的选项(如果来自远程服务器的响应失败)。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

transferException (producer)

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。在制作者端,异常会按原样进行反序列化和丢弃,而不是 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

okStatusCodeRange (producer)

被视为成功响应的状态代码。值包括:可以定义多个范围,以逗号分隔,例如 200-204,209,301-304。每个范围必须是单个数字,或使用包括横线的短划线。

200-299

字符串

urlRewrite (producer)

弃用了 自定义的 org.apache.camel.component.http.UrlRewrite,它允许您在网桥/proxy 端点时重写 url。更多信息请参阅 http://camel.apache.org/urlrewrite.html

 

UrlRewrite

clientBuilder (advanced)

提供对此端点制作者或消费者使用的新 RequestConfig 实例上使用的 http 客户端请求参数的访问权限。

 

HttpClientBuilder

clientConnectionManager (advanced)

使用自定义 HttpClientConnectionManager 管理连接

 

HttpClientConnection Manager

connectionsPerRoute (advanced)

每个路由的最大连接数。

20

int

httpClient (advanced)

设置制作者要使用的自定义 HttpClient

 

HttpClient

httpClientConfigurer (advanced)

为生产者或消费者创建的新 HttpClient 实例注册自定义配置策略,如 配置身份验证机制等

 

HttpClientConfigurer

httpClientOptions (advanced)

使用 map 中的键/值配置 HttpClient。

 

map

httpContext (advanced)

使用自定义 HttpContext 实例

 

HttpContext

mapHttpMessageBody (advanced)

如果此选项正确,则交换正文将映射到 HTTP 正文。将其设置为 false 将避免 HTTP 映射。

true

布尔值

mapHttpMessageFormUrl EncodedBody (advanced)

如果这个选项为 true,则交换的 IN Exchange Form Encode 正文将映射到 HTTP。将其设置为 false 可以避免 HTTP Form Encoded body 映射。

true

布尔值

mapHttpMessageHeaders (advanced)

如果此选项为 true,则交换的 IN Exchange Headers 将映射到 HTTP 标头。将其设置为 false 将避免 HTTP 标头映射。

true

布尔值

maxTotalConnections (advanced)

连接的最大数量。

200

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

useSystemProperties (advanced)

将系统属性用作配置的回退

false

布尔值

proxyAuthDomain (proxy)

用于 NTML 的代理身份验证域

 

字符串

proxyAuthHost (proxy)

代理身份验证主机

 

字符串

proxyAuthMethod (proxy)

要使用的代理验证方法

 

字符串

proxyAuthPassword (proxy)

代理验证密码

 

字符串

proxyAuthPort (proxy)

代理身份验证端口

 

int

proxyAuthScheme (proxy)

要使用的代理身份验证方案

 

字符串

proxyAuthUsername (proxy)

代理验证用户名

 

字符串

proxyHost (proxy)

要使用的代理主机名

 

字符串

proxyPort (proxy)

要使用的代理端口

 

int

authDomain (security)

与 NTML 搭配使用的身份验证域

 

字符串

authHost (security)

要用于 NTML 的身份验证主机

 

字符串

authMethod (security)

允许将 用作以逗号分隔的值 Basic、Digest 或 NTLM 的验证方法。

 

字符串

authMethodPriority (security)

使用的基本验证方法(可以是 Basic、Digest 或 NTLM)的验证方法。

 

字符串

authPassword (security)

身份验证密码

 

字符串

authUsername (security)

身份验证用户名

 

字符串

sslContextParameters (security)

使用 SSLContextParameters 配置安全性。重要信息:每个 HttpComponent 支持一个 org.apache.camel.util.jsse.SSLContextParameters 实例。如果您需要使用 2 个或更多不同的实例,则需要为每个实例定义一个新的 HttpComponent。

 

SSLContextParameters

x509HostnameVerifier (security)

使用自定义 X509HostnameVerifier,如 DefaultHostnameVerifier 或 org.apache.http.conn.ssl.NoopHostnameVerifier。

 

HostnameVerifier

151.3. Spring Boot Auto-Configuration

组件支持 19 选项,如下所示。

名称描述默认类型

camel.component.http4.allow-java-serialized-object

请求使用 context-type=application/x-java-serialized-object 时,是否允许 java serialization。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

camel.component.http4.client-connection-manager

使用自定义和共享 HttpClientConnectionManager 管理连接。如果已经进行了此配置,它将始终用于此组件创建的所有端点。选项为 org.apache.http.conn.HttpClientConnectionManager 类型。

 

字符串

camel.component.http4.connect-timeout

决定在建立连接前的超时(毫秒)。超时值为零被解释为无限超时。超时值为零被解释为无限超时。负值解析为未定义(系统默认值)。默认: code -1

-1

整数

camel.component.http4.connection-request-timeout

从连接管理器请求连接时使用的超时(毫秒)。超时值为零被解释为无限超时。超时值为零被解释为无限超时。负值解析为未定义(系统默认值)。默认: code -1

-1

整数

camel.component.http4.connection-time-to-live

连接到 live 的时间,单位为 millisecond,默认值始终为live。

 

Long

camel.component.http4.connections-per-route

每个路由的最大连接数。

20

整数

camel.component.http4.cookie-store

使用自定义 org.apache.http.client.CookieStore。默认情况下,使用 org.apache.http.impl.client.BasicCookieStore,它是仅 Cookie 存储的内存。请注意,如果 bridgeEndpoint=true,则 Cookie 存储被强制用作 noop cookie 存储,因为我们只作为代理存储。选项是一个 org.apache.http.client.CookieStore 类型。

 

字符串

camel.component.http4.enabled

启用 http4 组件

true

布尔值

camel.component.http4.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.http4.http-binding

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。选项是一个 org.apache.camel.http.common.HttpBinding 类型。

 

字符串

camel.component.http4.http-client-configurer

使用自定义 HttpClientConfigurer 执行将使用的 HttpClient 的配置。选项是一个 org.apache.camel.component.http4.HttpClientConfigurer 类型。

 

字符串

camel.component.http4.http-configuration

使用共享 HttpConfiguration 作为基本配置。选项是一个 org.apache.camel.http.common.HttpConfiguration 类型。

 

字符串

camel.component.http4.http-context

在执行请求时,使用自定义 org.apache.http.protocol.HttpContext。选项是一个 org.apache.http.protocol.HttpContext 类型。

 

字符串

camel.component.http4.max-total-connections

连接的最大数量。

200

整数

camel.component.http4.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.http4.socket-timeout

以毫秒为单位定义套接字超时(SO_TIMEOUT),这是等待数据超时,或者有不同,在两个连续的数据数据包之间有不活动。超时值为零被解释为无限超时。负值解析为未定义(系统默认值)。默认: code -1

-1

整数

camel.component.http4.ssl-context-parameters

使用 SSLContextParameters 配置安全性。重要信息:每个 HttpComponent 支持一个 org.apache.camel.util.jsse.SSLContextParameters 实例。如果您需要使用 2 个或更多不同的实例,则需要为每个实例定义一个新的 HttpComponent。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.http4.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

camel.component.http4.x509-hostname-verifier

使用自定义 X509HostnameVerifier,如 DefaultHostnameVerifier 或 org.apache.http.conn.ssl.NoopHostnameVerifier。选项是一个 javax.net.ssl.HostnameVerifier 类型。

 

字符串

151.4. 消息标头

名称类型描述

Exchange.HTTP_URI

字符串

要调用的 URI。将覆盖端点上直接设置的现有 URI。这个 uri 是 http 服务器要调用的 uri。它与 Camel 端点 uri 不同,您可以在其中配置端点选项,如安全性等。这个标头不支持它,它只支持 http 服务器的 uri。

Exchange.HTTP_PATH

字符串

请求 URI 的路径,标头将使用 HTTP_URI 构建请求 URI。

Exchange.HTTP_QUERY

字符串

URI 参数.将覆盖端点上直接设置的现有 URI 参数。

Exchange.HTTP_RESPONSE_CODE

int

外部服务器的 HTTP 响应代码。为 200,表示确定。

Exchange.HTTP_RESPONSE_TEXT

字符串

外部服务器的 HTTP 响应文本。

Exchange.HTTP_CHARACTER_ENCODING

字符串

字符编码.

Exchange.CONTENT_TYPE

字符串

HTTP 内容类型。在 IN 和 OUT 消息上设置,以提供内容类型,如 text/html

Exchange.CONTENT_ENCODING

字符串

HTTP 内容编码。在 IN 和 OUT 消息上设置,以提供内容编码,如 gzip

151.5. Message Body

Camel 会将来自外部服务器的 HTTP 响应存储在 OUT 正文中。来自 IN 消息的所有标头都将复制到 OUT 消息,因此在路由过程中保留标头。另外,Camel 还会将 HTTP 响应标头添加到 OUT 消息标头中。

 

151.6. 使用系统属性

当将 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

151.7. 响应代码

Camel 将根据 HTTP 响应代码处理:

  • 响应代码位于 100.299 范围中,Camel 被视为成功的响应。
  • 响应代码位于 300..399 范围中,Camel 被视为重定向响应,并将使用信息抛出 HttpOperationFailedException
  • 响应代码为 400+,Camel 将它作为外部服务器故障相关,并将引发 HttpOperationFailedException 及信息。

引发ExceptionOnFailure The option, throwExceptionOnFailure,它可以设置为 false,以防止为失败的响应代码抛出 HttpOperationFailedException。这可让您从远程服务器获得任何响应。
下面有一个示例演示此问题。

151.8. HttpOperationFailedException

这个例外包含以下信息:

  • HTTP 状态代码
  • HTTP 状态行(状态代码的文本)
  • 重定向位置,如果服务器返回重定向
  • 如果服务器提供了正文作为响应,响应正文作为 java.lang.String

151.9. 将使用哪个 HTTP 方法

以下算法用于确定应使用什么 HTTP 方法:
1。使用作为端点配置(httpMethod)的方法。
2.使用标头中提供的方法(Exchange.HTTP_METHOD)。
3.如果标头中提供了查询字符串,则 GET
4.如果端点配置了查询字符串,则 GET
5.POST 如果存在要发送的数据(其他人不是 null)。
6.否则 GET

151.10. 如何访问 HttpServletRequest 和 HttpServletResponse

您可以使用 Camel 类型转换程序系统访问这两个系统。
注意,您不仅可以从 camel-jetty 或 camel-cxf 端点后获得的处理器获得请求和响应。

HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class);
HttpServletRequest response = exchange.getIn().getBody(HttpServletResponse.class);

151.11. 配置要调用的 URI

您可以直接设置 HTTP producer 的 URI 来直接组成端点 URI。在以下路由中,Camel 使用 HTTP 调用外部服务器 oldhost

from("direct:start")
        .to("http4://oldhost");

以及对等的 Spring 示例:

<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:start"/>
    <to uri="http4://oldhost"/>
  </route>
</camelContext>

您可以通过在消息中添加使用密钥 Exchange.HTTP_URI 的标头来覆盖 HTTP 端点 URI。

from("direct:start")
  .setHeader(Exchange.HTTP_URI, constant("http://newhost"))
  .to("http4://oldhost");

在上面的示例中,尽管端点配置了 http4://oldhost,但 Camel 将调用 http://newhost
如果 http4 端点在网桥模式下工作,它将忽略 Exchange.HTTP_URI 的消息标题。

151.12. 配置 URI 参数

http producer 支持将 URI 参数发送到 HTTP 服务器。URI 参数可以直接在端点 URI 上设置,或者作为在消息中带有密钥 Exchange.HTTP_QUERY 的标头设置。

from("direct:start")
  .to("http4://oldhost?order=123&detail=short");

标头中提供的 或 选项:

from("direct:start")
  .setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
  .to("http4://oldhost");

151.13. 如何将 http 方法(GET/PATCH/POST/PUT/DELETE/HEAD/OPTIONS/TRACE)设置为 HTTP producer

使用 http PATCH 方法

从 Camel 2.11.3 / 2.12.1 开始,支持 http PATCH 方法。

HTTP4 组件通过设置消息标头来提供设置 HTTP 请求方法的方法。下面是一个示例:

from("direct:start")
  .setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http4.HttpMethods.POST))
  .to("http4://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 headerName="CamelHttpMethod">
        <constant>POST</constant>
    </setHeader>
    <to uri="http4://www.google.com"/>
    <to uri="mock:results"/>
  </route>
</camelContext>

151.14. 使用客户端超时 - SO_TIMEOUT

请参阅 HttpSOTimeoutTest 单元测试。

从 Camel 2.13.0 开始:查看更新的 HttpSOTimeoutTest 单元测试。

151.15. 配置代理

HTTP4 组件提供配置代理的方法。

from("direct:start")
  .to("http4://oldhost?proxyAuthHost=www.myproxy.com&proxyAuthPort=80");

还支持通过 proxyAuthUsernameproxyAuthPassword 选项进行代理身份验证。

151.15.1. 使用 URI 之外的代理设置

为了避免系统属性冲突,您只能从 CamelContext 或 URI 设置代理配置。
Java DSL :

 context.getProperties().put("http.proxyHost", "172.168.18.9");
 context.getProperties().put("http.proxyPort" "8080");

Spring XML

   <camelContext>
       <properties>
           <property key="http.proxyHost" value="172.168.18.9"/>
           <property key="http.proxyPort" value="8080"/>
      </properties>
   </camelContext>

Camel 将首先从 Java 系统或 CamelContext Properties 设置设置,然后提供端点代理选项。
因此,您可以使用端点选项覆盖系统属性。

注意 Camel 2.8 中还有一个 http.proxyScheme 属性,您可以将其设置为显式配置要使用的方案。

151.16. 配置 charset

如果使用 POST 来发送数据,您可以使用 Exchange 属性配置 charset

exchange.setProperty(Exchange.CHARSET_NAME, "ISO-8859-1");

151.16.1. 带有调度轮询示例

这个示例每 10 秒轮询 Google 主页,并将页面写入文件 message.html

from("timer://foo?fixedRate=true&delay=0&period=10000")
  .to("http4://www.google.com")
  .setHeader(FileComponent.HEADER_FILE_NAME, "message.html")
  .to("file:target/google");

151.16.2. 端点 URI 的 URI 参数

在本例中,我们拥有完整的 URI 端点,该端点只是您在 Web 浏览器中键入的内容。可以使用 和 字符作为分隔符来设置多个 URI 参数,就像在 Web 浏览器中一样。此处 Camel 没有技巧。

// we query for Camel at the Google page
template.sendBody("http4://www.google.com/search?q=Camel", null);

151.16.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("http4://www.google.com/search", null, headers);

在上面的标头值中,它不应 以 前缀为 ?,您可以像 & amp; char 一样分隔参数。

151.16.4. 获取响应代码

您可以通过使用 Exchange.HTTP_RESPONSE_CODE 的 Out message 标头获取 HTTP 响应代码。

Exchange exchange = template.send("http4://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);

151.17. 禁用 Cookies

要禁用 Cookie,您可以通过添加此 URI 选项:
httpClient.cookiePolicy=ignoreCookies来设置 HTTP Client 以忽略 cookies

151.18. 高级使用

如果您需要更多对 HTTP 生产者的控制,您应该在什么位置使用 HttpComponent 来提供自定义行为。

151.18.1. 为 HTTP 客户端设置 SSL

使用 JSSE 配置实用程序

从 Camel 2.8 开始,HTTP4 组件支持通过 Camel JSSE 配置实用程序 的 SSL/TLS 配置。  这个实用程序可大大减少您需要编写的组件特定代码的数量,并在端点和组件级别进行配置。  以下示例演示了如何将 实用程序与 HTTP4 组件搭配使用。

组件的程序配置

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("https4", 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="https4://127.0.0.1/mail/?sslContextParameters=#sslContextParameters"/>...

直接配置 Apache HTTP 客户端

基本上是 camel-http4 组件基于 Apache HttpClient 构建的。请参考 SSL/TLS 自定义 以获取详细信息,或查看 org.apache.camel.component.http4.HttpsServerTestSupport 单元测试基础类。
您还可以实施自定义的 org.apache.camel.component.http4.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("http4", HttpComponent.class);
httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());

如果使用 Spring DSL 执行此操作,您可以使用 URI 指定 HttpClientConfigurer。例如:

<bean id="myHttpClientConfigurer"
 class="my.https.HttpClientConfigurer">
</bean>

<to uri="https4://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.引用 http4 URL 中的上下文:
<to uri="https4://myhostname.com:443/myURL?httpContext=myHttpContext"/>

使用不同的 SSLContextParameters

HTTP4 组件只支持每个组件一个 org.apache.camel.util.jsse.SSLContextParameters 实例。如果您需要使用 2 个或更多不同的实例,则需要设置多个 HTTP4 组件,如下所示。如果我们有 2 个组件,每个组件都使用自己的 sslContextParameters 属性实例。

<bean id="http4-foo" class="org.apache.camel.component.http4.HttpComponent">
   <property name="sslContextParameters" ref="sslContextParams1"/>
   <property name="x509HostnameVerifier" ref="hostnameVerifier"/>
</bean>

<bean id="http4-bar" class="org.apache.camel.component.http4.HttpComponent">
   <property name="sslContextParameters" ref="sslContextParams2"/>
   <property name="x509HostnameVerifier" ref="hostnameVerifier"/>
</bean>

第 152 章 Hystrix 组件

作为 Camel 2.18 版提供

hystrix 组件集成 Camel 路由中的 Netflix Hystrix 断路器。

详情请查看 Hystrix EIP 文档。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hystrix</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

152.1. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.hystrix.mapping.enabled

启用 Hystrics 指标 servlet 到 Spring web 上下文的自动映射。

true

布尔值

camel.component.hystrix.mapping.path

hystrix 指标 servlet 的端点。

/hystrix.stream

字符串

camel.component.hystrix.mapping.servlet-name

Hystrix 指标 servlet 的名称。

HystrixEventStreamServlet

字符串

第 153 章 iCal DataFormat

作为 Camel 2.12 版本提供

ICal dataformat 用于处理 iCalendar 消息。

一个典型的 iCalendar 消息类似如下:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Events Calendar//iCal4j 1.0//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTAMP:20130324T180000Z
DTSTART:20130401T170000
DTEND:20130401T210000
SUMMARY:Progress Meeting
TZID:America/New_York
UID:00000000
ATTENDEE;ROLE=REQ-PARTICIPANT;CN=Developer 1:mailto:dev1@mycompany.com
ATTENDEE;ROLE=OPT-PARTICIPANT;CN=Developer 2:mailto:dev2@mycompany.com
END:VEVENT
END:VCALENDAR

153.1. 选项

iCal dataformat 支持 2 选项,这些选项如下。

名称默认Java 类型描述

validating

false

布尔值

是否进行验证。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

153.2. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.ical.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.ical.enabled

启用数据格式

true

布尔值

camel.dataformat.ical.validating

是否进行验证。

false

布尔值

ND

153.3. 基本用法

要取消marshal 和 marshal,您的路由将类似如下:

from("direct:ical-unmarshal")
  .unmarshal("ical")
  .to("mock:unmarshaled")
  .marshal("ical")
  .to("mock:marshaled");

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ical</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

153.4. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 154 章 IEC 60870 Client Component

可作为 Camel 版本 2.20 可用

IEC 60870-5-104 客户端 组件可使用 Eclipse NeoSCADA™ 实施访问 IEC 60870 服务器。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-iec60870</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

IEC 60870 客户端组件支持 2 选项,它们如下所列。

名称描述默认类型

默认连接选项 (通用)

默认连接选项

 

ClientOptions

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

154.1. URI 格式

端点的 URI 语法是:

iec60870-client:host:port/00-01-02-03-04

信息对象地址在语法中的路径中编码,显示上面的内容。请注意,始终使用完整、5 个八位字节地址格式。必须使用零填充未使用的八位字节。

154.2. URI 选项

IEC 60870 客户端端点使用 URI 语法配置:

iec60870-client:uriPath

使用以下路径和查询参数:

154.2.1. 路径名(1 参数):

名称描述默认类型

uriPath

所需的 对象信息地址

 

ObjectAddress

154.2.2. 查询参数(19 参数):

名称描述默认类型

dataModuleOptions (common)

数据模块选项

 

DataModuleOptions

protocolOptions (common)

协议选项

 

ProtocolOptions

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

acknowledgeWindow (connection)

参数 W - Acknowledgment 窗口.

10

adsuAddressType (connection)

常见的 ASDU 地址大小。可能是 SIZE_1 或 SIZE_2。

 

ASDUAddressType

causeOfTransmissionType (connection)

传输类型的原因。可能是 SIZE_1 或 SIZE_2。

 

CauseOfTransmission Type

InformationObjectAddress Type (connection)

信息地址大小。可能是 SIZE_1、SIZE_2 或 SIZE_3。

 

InformationObject AddressType

maxUnacknowledged (connection)

参数 K - 最大未确认的信息数。

15

timeout1 (connection)

超时 T1,以毫秒为单位。

15000

int

timeout2 (connection)

以毫秒为单位超时 T2。

10000

int

timeout3 (connection)

以毫秒为单位超时 T3。

20000

int

causeSourceAddress (data)

是否包含源地址

true

布尔值

ignoreBackgroundScan (data)

是否应该忽略背景扫描传输。

true

布尔值

ignoreDaylightSavingTime (data)

是否忽略或遵守 DST

false

布尔值

timeZone (data)

要使用的时区。可以是任何 Java 时区字符串

UTC

TimeZone

connectionId (id)

标识符分组连接实例

 

字符串

154.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.iec60870-client.default-connection-options.ignore-background-scan

是否应该忽略背景扫描传输。

true

布尔值

camel.component.iec60870-client.enabled

是否启用 iec60870-client 组件自动配置。默认启用。

 

布尔值

camel.component.iec60870-client.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

如果连接实例在 URI 的主机和端口部分标识,以及 "id" 组中的所有参数。如果遇到新的连接 id,则将评估连接选项,并使用这些选项创建连接实例。

注意

如果两个 URI 指定同一连接(主机,端口 …)但不同的连接选项,则会使用这些连接选项的未定义。

最终的连接选项将按以下顺序评估:

  • 如果存在,则使用 connectionOptions 参数
  • 否则,在下列步骤中复制并自定义默认的ConnectionOptions 实例
  • 如果存在,则应用协议Options
  • 如果存在,应用 dataModuleOptions
  • 应用所有显式连接参数(如 timeZone)

第 155 章 IEC 60870 Server Component

可作为 Camel 版本 2.20 可用

IEC 60870-5-104 服务器组件可使用 Eclipse NeoSCADA™ 实施访问 IEC 60870 服务器。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-iec60870</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

IEC 60870 服务器组件支持 2 选项,它们如下所列。

名称描述默认类型

默认连接选项 (通用)

默认连接选项

 

ServerOptions

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

155.1. URI 格式

端点的 URI 语法是:

iec60870-server:host:port/00-01-02-03-04

信息对象地址在语法中的路径中编码,显示上面的内容。请注意,始终使用完整、5 个八位字节地址格式。必须使用零填充未使用的八位字节。

155.2. URI 选项

IEC 60870 服务器端点使用 URI 语法配置:

iec60870-server:uriPath

使用以下路径和查询参数:

155.2.1. 路径名(1 参数):

名称描述默认类型

uriPath

所需的 对象信息地址

 

ObjectAddress

155.2.2. 查询参数(20 参数):

名称描述默认类型

dataModuleOptions (common)

数据模块选项

 

DataModuleOptions

filterNonExecute (common)

过滤掉未设置执行位的所有请求

true

布尔值

protocolOptions (common)

协议选项

 

ProtocolOptions

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

acknowledgeWindow (connection)

参数 W - Acknowledgment 窗口.

10

adsuAddressType (connection)

常见的 ASDU 地址大小。可能是 SIZE_1 或 SIZE_2。

 

ASDUAddressType

causeOfTransmissionType (connection)

传输类型的原因。可能是 SIZE_1 或 SIZE_2。

 

CauseOfTransmission Type

InformationObjectAddress Type (connection)

信息地址大小。可能是 SIZE_1、SIZE_2 或 SIZE_3。

 

InformationObject AddressType

maxUnacknowledged (connection)

参数 K - 最大未确认的信息数。

15

timeout1 (connection)

超时 T1,以毫秒为单位。

15000

int

timeout2 (connection)

以毫秒为单位超时 T2。

10000

int

timeout3 (connection)

以毫秒为单位超时 T3。

20000

int

causeSourceAddress (data)

是否包含源地址

true

布尔值

ignoreBackgroundScan (data)

是否应该忽略背景扫描传输。

true

布尔值

ignoreDaylightSavingTime (data)

是否忽略或遵守 DST

false

布尔值

timeZone (data)

要使用的时区。可以是任何 Java 时区字符串

UTC

TimeZone

connectionId (id)

标识符分组连接实例

 

字符串

155.3. Spring Boot Auto-Configuration

组件支持 7 个选项,如下所示。

名称描述默认类型

camel.component.iec60870-server.default-connection-options.background-scan-period

后台传输周期间的 "ms"。<p> 如果将其设置为零或更少,后台传输将被禁用。</p>

 

整数

camel.component.iec60870-server.default-connection-options.booleans-with-timestamp

使用时间戳发送布尔值

 

布尔值

camel.component.iec60870-server.default-connection-options.buffering-period

在"ms"层中,协议层中的时间周期将缓冲更改事件,以便发送聚合的更改消息

 

整数

camel.component.iec60870-server.default-connection-options.floats-with-timestamp

使用时间戳发送浮点值

 

布尔值

camel.component.iec60870-server.default-connection-options.spontaneous-duplicates

在缓冲区中保留的spontaneous 事件数量。<p> 当缓冲区中的事件数量超过这个数量时,事件会被丢弃,以便保持缓冲区大小。</p>

 

整数

camel.component.iec60870-server.enabled

是否启用 iec60870-server 组件的自动配置。默认启用。

 

布尔值

camel.component.iec60870-server.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 156 章 Ignite Cache 组件

作为 Camel 2.17 版提供

Ignite Cache 端点是 camel-ignite 端点之一,可让您与 Ignite 缓存 交互。这既提供了 Producer (用于在 Ignite 缓存上调用缓存操作)和消费者(消耗来自持续查询的更改)。

缓存值始终是消息的正文,而 cache 键总是存储在 IgniteConstants.IGNITE_CACHE_KEY 消息标头中。

即使在端点 URI 中配置固定操作,您可以通过设置 IgniteConstants.IGNITE_CACHE_OPERATION 消息标头来为每个交换不同。

156.1. 选项

Ignite Cache 组件支持 4 个选项,它们如下所列。

名称描述默认类型

ignite (common)

设置 Ignite 实例。

 

Ignite

configurationResource (common)

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。

 

对象

igniteConfiguration (common)

允许用户设置程序化 IgniteConfiguration。

 

IgniteConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Ignite Cache 端点使用 URI 语法配置:

ignite-cache:cacheName

使用以下路径和查询参数:

156.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称。

 

字符串

156.1.2. 查询参数(16 参数):

名称描述默认类型

propagateIncomingBodyIfNo ReturnValue (common)

如果底层 Ignite 操作的返回类型为 void,则设置是否传播传入的正文。

true

布尔值

treatCollectionsAsCache Objects (common)

设置是否将集合视为缓存对象,还是作为项目集合来插入/更新/计算等。

false

布尔值

autoUnsubscribe (consumer)

是否在持续查询消费者中启用自动取消订阅。

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

fireExistingQueryResults (consumer)

是否处理与查询匹配的现有结果。用于初始化持续查询使用者。

false

布尔值

oneExchangePerUpdate (consumer)

是否要在单独交换中打包每个更新,即使在一个批内收到多个更新。仅限持续查询使用者使用。

true

布尔值

pageSize (consumer)

页面大小。仅限持续查询使用者使用。

1

int

query (consumer)

要执行的查询,仅需要它的操作,以及持续查询消费者的操作。

 

查询

remoteFilter (consumer)

远程过滤器,仅由 Continuous Query Consumer 使用。

 

CacheEntryEvent SerializableFilter

timeInterval (consumer)

持续查询使用者的时间间隔。

0

long

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

cachePeekMode (producer)

CachePeekMode,只适用于需要它的操作(IgniteCacheOperation#SIZE)。

ALL

CachePeekMode

failIfInexistentCache (producer)

如果缓存不存在,是否会导致初始化失败。

false

布尔值

operation (producer)

要调用的缓存操作。可能的值有:GET、PUT、REMOVE、SIZE、REBALANCE、QUERY、CLEAR.

 

IgniteCacheOperation

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

156.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.ignite-cache.configuration-resource

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。选项是一个 java.lang.Object 类型。

 

字符串

camel.component.ignite-cache.enabled

启用 ignite-cache 组件

true

布尔值

camel.component.ignite-cache.ignite

设置 Ignite 实例。选项是一个 org.apache.ignite.Ignite 类型。

 

字符串

camel.component.ignite-cache.ignite-configuration

允许用户设置程序化 IgniteConfiguration。选项是一个 org.apache.ignite.configuration.IgniteConfiguration 类型。

 

字符串

camel.component.ignite-cache.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

156.2.1. 使用的标头

此端点使用以下标头:

标头名称常数预期类型描述

CamelIgniteCacheKey

IgniteConstants.IGNITE_CACHE_KEY

字符串

消息正文中条目值的 cache 键。

CamelIgniteCacheQuery

IgniteConstants.IGNITE_CACHE_QUERY

查询

调用 QUERY 操作时要运行的查询(生成器)。

CamelIgniteCacheOperation

IgniteConstants.IGNITE_CACHE_OPERATION

IgniteCacheOperation enum

允许您将缓存操作动态更改为执行(生成程序)。

CamelIgniteCachePeekMode

IgniteConstants.IGNITE_CACHE_PEEK_MODE

CachePeekMode enum

允许您在运行 SIZE 操作时动态更改 cache peek 模式。

CamelIgniteCacheEventType

IgniteConstants.IGNITE_CACHE_EVENT_TYPE

int (EventType constants)

当使用持续查询消费者时,此标头会传输接收的事件类型。

CamelIgniteCacheName

IgniteConstants.IGNITE_CACHE_NAME

字符串

此标头传输接收持续查询事件(消费者)的缓存名称。它不允许您动态更改执行制作者操作的缓存。将 EIP 用于该 (如接收者列表、动态路由器)。

CamelIgniteCacheOldValue

IgniteConstants.IGNITE_CACHE_OLD_VALUE

对象

当传递传入缓存事件(consumer)时,此标头会传输旧的缓存值。

第 157 章 Ignite Compute 组件

作为 Camel 2.17 版提供

Ignite Compute 端点是一个 camel-ignite 端点,它允许您传递一个 IgniteCallable、IgniteCallable、IgniteRunnable、IgniteClosure 或它们的集合来在集群中运行 计算操作

此端点仅支持制作者。

端点 URI 的主机部分是符号链接端点 ID,它不用于任何目的。

端点试图运行作为计算作业在 IN 消息正文中传递的对象。根据执行类型,它需要不同的有效负载类型。

157.1. 选项

Ignite Compute 组件支持 4 个选项,它们如下所列。

名称描述默认类型

ignite (producer)

设置 Ignite 实例。

 

Ignite

configurationResource (producer)

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。

 

对象

igniteConfiguration (producer)

允许用户设置程序化 IgniteConfiguration。

 

IgniteConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Ignite Compute 端点使用 URI 语法配置:

ignite-compute:endpointId

使用以下路径和查询参数:

157.1.1. 路径名(1 参数):

名称描述默认类型

endpointId

必需 端点 ID (不使用)。

 

字符串

157.1.2. 查询参数(8 参数):

名称描述默认类型

clusterGroupExpression (producer)

一个表达式,用于返回 IgniteCompute 实例的 Cluster Group。

 

ClusterGroupExpression

computeName (producer)

计算作业的名称,将通过 IgniteCompute#withName (String)进行设置。

 

字符串

executionType (producer)

执行所需的 计算操作。可能的值有:CALL, BROADCAST, APPLY, EXECUTE, RUN, AFFINITY_CALL, AFFINITY_RUN.组件需要不同的有效负载类型,具体取决于操作。

 

IgniteComputeExecution Type

propagateIncomingBodyIfNo ReturnValue (producer)

如果底层 Ignite 操作的返回类型为 void,则设置是否传播传入的正文。

true

布尔值

taskName (producer)

任务名称仅适用于使用 IgniteComputeExecutionType#EXECUTE 执行类型。

 

字符串

timeoutMillis (producer)

触发的作业的超时间隔(以毫秒为单位),将通过 IgniteCompute#withTimeout (long)设置。

 

Long

treatCollectionsAsCache Objects (producer)

设置是否将集合视为缓存对象,还是作为项目集合来插入/更新/计算等。

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

157.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.ignite-compute.configuration-resource

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。选项是一个 java.lang.Object 类型。

 

字符串

camel.component.ignite-compute.enabled

启用 ignite-compute 组件

true

布尔值

camel.component.ignite-compute.ignite

设置 Ignite 实例。选项是一个 org.apache.ignite.Ignite 类型。

 

字符串

camel.component.ignite-compute.ignite-configuration

允许用户设置程序化 IgniteConfiguration。选项是一个 org.apache.ignite.configuration.IgniteConfiguration 类型。

 

字符串

camel.component.ignite-compute.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

157.2.1. 预期的有效负载类型

每个操作都需要指定类型:

操作预期有效负载

CALL

可识别或一个可识别的 IgniteCallable 集合。

BROADCAST

IgniteCallable, IgniteRunnable, IgniteClosure。

APPLY

IgniteClosure.

执行

ComputeTask, Class<? 扩展 ComputeTask> 或代表参数的对象(如果 taskName 选项不为空)。

运行

系列 IgniteRunnables 或单个 IgniteRunnable。

AFFINITY_CALL

IgniteCallable.

AFFINITY_RUN

IgniteRunnable.

157.2.2. 使用的标头

此端点使用以下标头:

标头名称常数预期类型描述

CamelIgniteComputeExecutionType

IgniteConstants.IGNITE_COMPUTE_EXECUTION_TYPE

IgniteComputeExecutionType enum

允许您动态更改计算操作以进行执行。

CamelIgniteComputeParameters

IgniteConstants.IGNITE_COMPUTE_PARAMS

任何对象或集合对象。

适用于 APPLY 的参数、BROADCAST 和 EXECUTE 操作。

CamelIgniteComputeReducer

IgniteConstants.IGNITE_COMPUTE_REDUCER

IgniteReducer

为 APPLY 和 CALL 操作减少。

CamelIgniteComputeAffinityCacheName

IgniteConstants.IGNITE_COMPUTE_AFFINITY_CACHE_NAME

字符串

AFFINITY_CALL 和 AFFINITY_RUN 操作的关联性缓存名称。

CamelIgniteComputeAffinityKey

IgniteConstants.IGNITE_COMPUTE_AFFINITY_KEY

对象

AFFINITY_CALL 和 AFFINITY_RUN 操作的关联性密钥。

第 158 章 Ignite 事件组件

作为 Camel 2.17 版提供

Ignite Events 端点是一个 camel-ignite 端点,它允许您通过创建本地事件监听程序来从 Ignite 集群 接收事件

此端点仅支持使用者。此使用者创建的 Exchange 将接收的事件对象放入 IN 消息的正文。

158.1. 选项

Ignite Events 组件支持 4 个选项,它们如下所列。

名称描述默认类型

ignite (consumer)

设置 Ignite 实例。

 

Ignite

configurationResource (consumer)

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。

 

对象

igniteConfiguration (consumer)

允许用户设置程序化 IgniteConfiguration。

 

IgniteConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Ignite Events 端点使用 URI 语法配置:

ignite-events:endpointId

使用以下路径和查询参数:

158.1.1. 路径名(1 参数):

名称描述默认类型

endpointId

端点 ID (不使用)。

 

字符串

158.1.2. 查询参数(8 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

clusterGroupExpression (consumer)

集群组表达式。

 

ClusterGroupExpression

events (consumer)

作为集合直接订阅的事件 ID,其中 ID 是 org.apache.ignite.events.EventType 中不同的常量。

EventType.EVTS_ALL

SetOrString

propagateIncomingBodyIfNo ReturnValue (consumer)

如果底层 Ignite 操作的返回类型为 void,则设置是否传播传入的正文。

true

布尔值

treatCollectionsAsCache Objects (consumer)

设置是否将集合视为缓存对象,还是作为项目集合来插入/更新/计算等。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

158.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.ignite-events.configuration-resource

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。选项是一个 java.lang.Object 类型。

 

字符串

camel.component.ignite-events.enabled

启用 ignite-events 组件

true

布尔值

camel.component.ignite-events.ignite

设置 Ignite 实例。选项是一个 org.apache.ignite.Ignite 类型。

 

字符串

camel.component.ignite-events.ignite-configuration

允许用户设置程序化 IgniteConfiguration。选项是一个 org.apache.ignite.configuration.IgniteConfiguration 类型。

 

字符串

camel.component.ignite-events.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 159 章 Ignite ID Generator 组件

作为 Camel 2.17 版提供

Ignite ID Generator 端点是一个 camel-ignite 端点,可让您与 Ignite Atomic 序列和 ID Generators 交互。

此端点仅支持制作者。

159.1. 选项

Ignite ID Generator 组件支持 4 个选项,它们如下所列。

名称描述默认类型

ignite (producer)

设置 Ignite 实例。

 

Ignite

configurationResource (producer)

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。

 

对象

igniteConfiguration (producer)

允许用户设置程序化 IgniteConfiguration。

 

IgniteConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Ignite ID Generator 端点使用 URI 语法配置:

ignite-idgen:name

使用以下路径和查询参数:

159.1.1. 路径名(1 参数):

名称描述默认类型

name

所需的 序名称。

 

字符串

159.1.2. 查询参数(6 参数):

名称描述默认类型

batchSize (producer)

批处理大小。

 

整数

initialValue (producer)

初始值。

0

Long

operation (producer)

在 Ignite ID Generator 上调用的操作。被 IN 消息中的 IgniteConstants.IGNITE_IDGEN_OPERATION 标头取代。可能的值有: ADD_AND_GET、GET、GET_AND_ADD、GET_AND_INCREMENT, INCREMENT_AND_GET.

 

IgniteIdGenOperation

propagateIncomingBodyIfNo ReturnValue (producer)

如果底层 Ignite 操作的返回类型为 void,则设置是否传播传入的正文。

true

布尔值

treatCollectionsAsCache Objects (producer)

设置是否将集合视为缓存对象,还是作为项目集合来插入/更新/计算等。

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

159.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.ignite-idgen.configuration-resource

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。选项是一个 java.lang.Object 类型。

 

字符串

camel.component.ignite-idgen.enabled

启用 ignite-idgen 组件

true

布尔值

camel.component.ignite-idgen.ignite

设置 Ignite 实例。选项是一个 org.apache.ignite.Ignite 类型。

 

字符串

camel.component.ignite-idgen.ignite-configuration

允许用户设置程序化 IgniteConfiguration。选项是一个 org.apache.ignite.configuration.IgniteConfiguration 类型。

 

字符串

camel.component.ignite-idgen.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 160 章 Ignite Messaging 组件

作为 Camel 2.17 版提供

Ignite Messaging 端点是一个 camel-ignite 端点,可让您从 Ignite 主题 发送和使用消息。

此端点支持制作者(发送消息)和使用者(用于接收消息)。

160.1. 选项

Ignite Messaging 组件支持 4 个选项,它们如下所列。

名称描述默认类型

ignite (common)

设置 Ignite 实例。

 

Ignite

configurationResource (common)

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。

 

对象

igniteConfiguration (common)

允许用户设置程序化 IgniteConfiguration。

 

IgniteConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Ignite Messaging 端点使用 URI 语法配置:

ignite-messaging:topic

使用以下路径和查询参数:

160.1.1. 路径名(1 参数):

名称描述默认类型

topic

必需的 主题名称。

 

字符串

160.1.2. 查询参数(9 参数):

名称描述默认类型

propagateIncomingBodyIfNo ReturnValue (common)

如果底层 Ignite 操作的返回类型为 void,则设置是否传播传入的正文。

true

布尔值

treatCollectionsAsCache Objects (common)

设置是否将集合视为缓存对象,还是作为项目集合来插入/更新/计算等。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

clusterGroupExpression (producer)

集群组表达式。

 

ClusterGroupExpression

sendMode (producer)

要使用的发送模式。可能的值有:UNORDERED,或DERED。

未排序

IgniteMessagingSend Mode

timeout (producer)

使用排序信息时发送操作的超时时间。

 

Long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

160.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.ignite-messaging.configuration-resource

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。选项是一个 java.lang.Object 类型。

 

字符串

camel.component.ignite-messaging.enabled

启用 ignite-messaging 组件

true

布尔值

camel.component.ignite-messaging.ignite

设置 Ignite 实例。选项是一个 org.apache.ignite.Ignite 类型。

 

字符串

camel.component.ignite-messaging.ignite-configuration

允许用户设置程序化 IgniteConfiguration。选项是一个 org.apache.ignite.configuration.IgniteConfiguration 类型。

 

字符串

camel.component.ignite-messaging.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

160.2.1. 使用的标头

此端点使用以下标头:

标头名称常数预期类型描述

CamelIgniteMessagingTopic

IgniteConstants.IGNITE_MESSAGING_TOPIC

字符串

允许您将主题动态更改为发送消息(生成程序)。它还会处理收到消息(使用者)的主题。

CamelIgniteMessagingUUID

IgniteConstants.IGNITE_MESSAGING_UUID

UUID

当消息到达(消费者)时,此标头会填充订阅 UUID。

第 161 章 Ignite Queues 组件

作为 Camel 2.17 版提供

Ignite Queue 端点是一个 camel-ignite 端点,可让您与 Ignite Queue 数据结构 交互。

此端点仅支持制作者。

161.1. 选项

Ignite Queues 组件支持 4 个选项,它们如下所列。

名称描述默认类型

ignite (producer)

设置 Ignite 实例。

 

Ignite

configurationResource (producer)

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。

 

对象

igniteConfiguration (producer)

允许用户设置程序化 IgniteConfiguration。

 

IgniteConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Ignite Queues 端点使用 URI 语法进行配置:

ignite-queue:name

使用以下路径和查询参数:

161.1.1. 路径名(1 参数):

名称描述默认类型

name

所需的 队列名称。

 

字符串

161.1.2. 查询参数(7 参数):

名称描述默认类型

capacity (producer)

队列容量。默认:非绑定。

 

int

configuration (producer)

集合配置。默认:空配置。您还可以使用 configuration.xyz=123 选项方便地设置内部属性。

 

CollectionConfiguration

operation (producer)

在 Ignite Queue 上调用的操作。被 IN 消息中的 IgniteConstants.IGNITE_QUEUE_OPERATION 标头取代。可能的值有: CONTAINS, ADD, SIZE, REMOVE, ITERATOR, CLEAR, RETAIN_ALL, ARRAY, DRAIN, ELEMENT, PEEK, OFFER, POLL, TAKE, PUT.

 

IgniteQueueOperation

propagateIncomingBodyIfNo ReturnValue (producer)

如果底层 Ignite 操作的返回类型为 void,则设置是否传播传入的正文。

true

布尔值

timeoutMillis (producer)

队列超时(毫秒)。默认:无超时。

 

Long

treatCollectionsAsCache Objects (producer)

设置是否将集合视为缓存对象,还是作为项目集合来插入/更新/计算等。

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

161.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.ignite-queue.configuration-resource

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。选项是一个 java.lang.Object 类型。

 

字符串

camel.component.ignite-queue.enabled

启用 ignite-queue 组件

true

布尔值

camel.component.ignite-queue.ignite

设置 Ignite 实例。选项是一个 org.apache.ignite.Ignite 类型。

 

字符串

camel.component.ignite-queue.ignite-configuration

允许用户设置程序化 IgniteConfiguration。选项是一个 org.apache.ignite.configuration.IgniteConfiguration 类型。

 

字符串

camel.component.ignite-queue.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

161.2.1. 使用的标头

此端点使用以下标头:

标头名称常数预期类型描述

CamelIgniteQueueOperation

IgniteConstants.IGNITE_QUEUE_OPERATION

IgniteQueueOperation enum

允许您动态更改队列操作。

CamelIgniteQueueMaxElements

IgniteConstants.IGNITE_QUEUE_MAX_ELEMENTS

整数或 int

调用 DRAIN 操作时,要排空的项目数量。

CamelIgniteQueueTransferredCount

IgniteConstants.IGNITE_QUEUE_TRANSFERRED_COUNT

整数或 int

在 DRAIN 操作后传输的项目数量。

CamelIgniteQueueTimeoutMillis

IgniteConstants.IGNITE_QUEUE_TIMEOUT_MILLIS

long 或 long

在调用 OFFER 或 POLL 操作时动态设置使用超时(毫秒)。

第 162 章 Ignite Sets 组件

作为 Camel 2.17 版提供

Ignite Sets 端点是一个 camel-ignite 端点,可让您与 Ignite Set 数据结构 进行交互。

此端点仅支持制作者。

162.1. 选项

Ignite Sets 组件支持 4 个选项,它们如下所列。

名称描述默认类型

ignite (producer)

设置 Ignite 实例。

 

Ignite

configurationResource (producer)

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。

 

对象

igniteConfiguration (producer)

允许用户设置程序化 IgniteConfiguration。

 

IgniteConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Ignite Sets 端点使用 URI 语法配置:

ignite-set:name

使用以下路径和查询参数:

162.1.1. 路径名(1 参数):

名称描述默认类型

name

所需的设置 名称。

 

字符串

162.1.2. 查询参数(5 参数):

名称描述默认类型

configuration (producer)

集合配置。默认:空配置。您还可以使用 configuration.xyz=123 选项方便地设置内部属性。

 

CollectionConfiguration

operation (producer)

在 Ignite Set 上调用的操作。被 IN 消息中的 IgniteConstants.IGNITE_SETS_OPERATION 标头取代。可能的值有: CONTAINS、ADD、SIZE、REMOVE、ITERATOR、CLEAR、RETAIN_ALL、ARRAY.

 

IgniteSetOperation

propagateIncomingBodyIfNo ReturnValue (producer)

如果底层 Ignite 操作的返回类型为 void,则设置是否传播传入的正文。

true

布尔值

treatCollectionsAsCache Objects (producer)

设置是否将集合视为缓存对象,还是作为项目集合来插入/更新/计算等。

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

162.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.ignite-set.configuration-resource

设置从中加载配置的资源。它可以是: URI、String (URI)或 InputStream。选项是一个 java.lang.Object 类型。

 

字符串

camel.component.ignite-set.enabled

启用 ignite-set 组件

true

布尔值

camel.component.ignite-set.ignite

设置 Ignite 实例。选项是一个 org.apache.ignite.Ignite 类型。

 

字符串

camel.component.ignite-set.ignite-configuration

允许用户设置程序化 IgniteConfiguration。选项是一个 org.apache.ignite.configuration.IgniteConfiguration 类型。

 

字符串

camel.component.ignite-set.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

162.2.1. 使用的标头

此端点使用以下标头:

标头名称常数预期类型描述

CamelIgniteSetsOperation

IgniteConstants.IGNITE_SETS_OPERATION

IgniteSetOperation enum

允许您动态更改设置操作。

第 163 章 Infinispan 组件

作为 Camel 版本 2.13 可用

此组件允许您与 Infinispan 分布式数据网格/缓存进行交互。Infinispan 是具有高扩展性、高度可用的键/值数据存储和采用 Java 编写的数据网格平台。

从 Infinispan 上的 Camel 2.17 需要 Java 8。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-infinispan</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

163.1. URI 格式

infinispan://cacheName?[options]

163.2. URI 选项

制作者允许使用 HotRod 协议将消息发送到注册表中配置的本地 infinispan 缓存,或者发送到远程缓存。使用者允许侦听可从注册表访问的本地 infinispan 缓存的事件。

Infinispan 组件支持 3 个选项,它们如下所列。

名称描述默认类型

configuration (common)

端点之间共享的默认配置。

 

InfinispanConfiguration

cacheContainer (common)

默认缓存容器。

 

BasicCacheContainer

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Infinispan 端点使用 URI 语法进行配置:

infinispan:cacheName

使用以下路径和查询参数:

163.2.1. 路径名(1 参数):

名称描述默认类型

cacheName

要使用的缓存

 

字符串

163.2.2. 查询参数(18 参数):

名称描述默认类型

hosts (common)

指定 Infinispan 实例上的缓存主机

 

字符串

queryBuilder (common)

指定查询构建器。

 

InfinispanQueryBuilder

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

clusteredListener (consumer)

如果为 true,则会为整个集群安装监听程序

false

布尔值

命令 (消费者)

弃用了 要执行的操作。

PUT

字符串

customListener (consumer)

如果提供,则返回使用中的自定义监听程序

 

InfinispanCustom Listener

eventTypes (consumer)

指定要由消费者注册的事件类型集合。可以使用逗号分隔多个事件。可能的事件类型有:CACHE_ENTRY_ACTIVATED, CACHE_ENTRY_PASSIVATED, CACHE_ENTRY_VISITED, CACHE_ENTRY_LOADED, CACHE_ENTRY_EVICTED, CACHE_ENTRY_CREATED, cache_ENTRY_REMOVED, cache_ENTRY_MODIFIED,transACTION_COMPLETED, transACTION_REGISTERED, cache_ENTRY_INVALIDATED, data_REHASHED, topOLOGY_CHANGED, partITION_STATUS_CHANGED

 

字符串

sync (consumer)

如果为 true,用户会异步接收通知

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

要执行的操作。

PUT

InfinispanOperation

cacheContainer (advanced)

指定要连接的缓存容器

 

BasicCacheContainer

cacheContainerConfiguration (advanced)

CacheContainer 配置。如果未定义 cacheContainer,则使用。必须是以下类型: org.infinispan.client.hotrod.configuration.Configuration - 用于远程缓存交互配置;用于内嵌缓存交互配置的 org.infinispan.configuration.cache.Configuration;

 

对象

configurationProperties (advanced)

为 CacheManager 实现特定属性

 

map

configurationUri (advanced)

CacheManager 的实现特定 URI

 

字符串

flags (advanced)

在每个缓存调用中默认应用以逗号分隔的标记列表,不适用于远程缓存。

 

字符串

resultHeader (advanced)

将操作存储在标头而不是消息正文中。默认情况下,resultHeader == null,查询结果存储在消息正文中,消息正文中的所有现有内容都会被丢弃。如果设置了 resultHeader,则该值用作存储查询结果的标头的名称,并保留原始消息正文。这个值可以被名为 CamelInfinispanOperationResultHeader 的消息标头中覆盖。

 

对象

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

163.3. Spring Boot Auto-Configuration

组件支持 21 个选项,它们如下所列。

名称描述默认类型

camel.component.infinispan.cache-container

默认缓存容器。选项是一个 org.infinispan.commons.api.BasicCacheContainer 类型。

 

字符串

camel.component.infinispan.configuration.cache-container

指定要连接的缓存容器

 

BasicCacheContainer

camel.component.infinispan.configuration.cache-container-configuration

CacheContainer 配置。如果未定义 cacheContainer,则使用。必须是以下类型: org.infinispan.client.hotrod.configuration.Configuration - 用于远程缓存交互配置;用于内嵌缓存交互配置的 org.infinispan.configuration.cache.Configuration;

 

对象

camel.component.infinispan.configuration.clustered-listener

如果为 true,则会为整个集群安装监听程序

false

布尔值

camel.component.infinispan.configuration.configuration-properties

为 CacheManager 实现特定属性

 

map

camel.component.infinispan.configuration.configuration-uri

CacheManager 的实现特定 URI

 

字符串

camel.component.infinispan.configuration.custom-listener

如果提供,则返回使用中的自定义监听程序

 

InfinispanCustom Listener

camel.component.infinispan.configuration.event-types

指定要由消费者注册的事件类型集合。可以使用逗号分隔多个事件。可能的事件类型有:CACHE_ENTRY_ACTIVATED, CACHE_ENTRY_PASSIVATED, CACHE_ENTRY_VISITED, CACHE_ENTRY_LOADED, CACHE_ENTRY_EVICTED, CACHE_ENTRY_CREATED, cache_ENTRY_REMOVED, cache_ENTRY_MODIFIED,transACTION_COMPLETED, transACTION_REGISTERED, cache_ENTRY_INVALIDATED, data_REHASHED, topOLOGY_CHANGED, partITION_STATUS_CHANGED

 

Set

camel.component.infinispan.configuration.flags

在每个缓存调用中默认应用以逗号分隔的标记列表,不适用于远程缓存。

 

Flag[]

camel.component.infinispan.configuration.hosts

指定 Infinispan 实例上的缓存主机

 

字符串

camel.component.infinispan.configuration.operation

要执行的操作。

 

InfinispanOperation

camel.component.infinispan.configuration.query-builder

指定查询构建器。

 

InfinispanQueryBuilder

camel.component.infinispan.configuration.result-header

将操作存储在标头而不是消息正文中。默认情况下,resultHeader == null,查询结果存储在消息正文中,消息正文中的所有现有内容都会被丢弃。如果设置了 resultHeader,则该值用作存储查询结果的标头的名称,并保留原始消息正文。这个值可以被名为 CamelInfinispanOperationResultHeader 的消息标头中覆盖。

 

对象

camel.component.infinispan.configuration.sync

如果为 true,用户会异步接收通知

true

布尔值

camel.component.infinispan.customizer.embedded-cache-manager.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.infinispan.customizer.embedded-cache-manager.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.infinispan.customizer.remote-cache-manager.enabled

启用或禁用 cache-manager 自定义器。

true

布尔值

camel.component.infinispan.customizer.remote-cache-manager.override

如果组件上最终设置缓存管理器,配置 则由自定义器覆盖。

false

布尔值

camel.component.infinispan.enabled

启用 infinispan 组件

true

布尔值

camel.component.infinispan.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.infinispan.configuration.command

要执行的操作。

PUT

字符串

163.4. 消息标头

名称默认值类型Context描述

CamelInfinispanCacheName

null

字符串

共享

参与操作或事件的缓存。

CamelInfinispanOperation

PUT

InfinispanOperation

制作者

要执行的操作。

CamelInfinispanMap

null

map

制作者

CamelInfinispanOperationPutAll 操作时要使用的 map

CamelInfinispanKey

null

对象

共享

向 或 生成事件的密钥。

CamelInfinispanValue

null

对象

制作者

用于操作的值。

CamelInfinispanEventType

null

字符串

消费者

接收的事件的类型。这里定义了 org.infinispan.notifications.cachelistener.event.Event.Type

CamelInfinispanIsPre

null

布尔值

消费者

Infinispan 会为每个操作触发两个事件:一个事件在操作前和之后。

CamelInfinispanLifespanTime

null

long

制作者

缓存内值的 Lifespan 时间。负值解释为 infinity。

CamelInfinispanTimeUnit

null

字符串

制作者

条目 Lifespan Time 的时间范围。

CamelInfinispanMaxIdleTime

null

long

制作者

在条目被视为过期前允许闲置的最大时间。

CamelInfinispanMaxIdleTimeUnit

null

字符串

制作者

条目 Max Idle Time 的服务单元。

CamelInfinispanQueryBuilder

null

InfinispanQueryBuilder

制作者

从 Camel 2.17: 为 QUERY 命令使用的 QueryBuilde (如果不存在),则命令默认为 InifinispanConfiguration's

CamelInfinispanIgnoreReturnValues

null

布尔值

制作者

从 Camel 2.17: 如果设置了此标头,客户端应用程序会忽略缓存操作返回内容的返回值

CamelInfinispanOperationResultHeader

null

字符串

制作者

从 Camel 2.20: 将操作保存在标题中,而不是消息正文

163.5. 例子

  • 使用自定义缓存容器从默认缓存中检索特定密钥:

    from("direct:start")
        .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GET)
        .setHeader(InfinispanConstants.KEY).constant("123")
        .to("infinispan?cacheContainer=#cacheContainer");
  • 从命名缓存检索特定的密钥:

    from("direct:start")
        .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUT)
        .setHeader(InfinispanConstants.KEY).constant("123")
        .to("infinispan:myCacheName");
  • 使用 lifespan 取值

    from("direct:start")
        .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GET)
        .setHeader(InfinispanConstants.KEY).constant("123")
        .setHeader(InfinispanConstants.LIFESPAN_TIME).constant(100L)
        .setHeader(InfinispanConstants.LIFESPAN_TIME_UNIT.constant(TimeUnit.MILLISECONDS.toString())
        .to("infinispan:myCacheName");
  • 使用带有额外参数的缓存容器配置(主机、端口和协议版本)从远程缓存检索特定密钥:

    org.infinispan.client.hotrod.configuration.Configuration cacheContainerConfiguration = new org.infinispan.client.hotrod.configuration.ConfigurationBuilder()
        .addServer()
            .host("localhost")
            .port(9999)
            .version(org.infinispan.client.hotrod.ProtocolVersion.PROTOCOL_VERSION_25)
        .build();
    ...
    
    from("direct:start")
        .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GET)
        .setHeader(InfinispanConstants.KEY).constant("123")
        .to("infinispan?cacheContainerConfiguration=#cacheContainerConfiguration");

163.6. 使用基于 Infinispan 的幂等存储库

在本节中,我们将使用基于 Infinispan 的幂等存储库。

首先,我们需要创建一个 cacheManager,然后配置我们的

org.apache.camel.component.infinispan.processor.idempotent.InfinispanIdempotentRepository:
<!-- set up the cache manager -->
<bean id="cacheManager"
      class="org.infinispan.manager.DefaultCacheManager"
      init-method="start"
      destroy-method="stop"/>

<!-- set up the repository -->
<bean id="infinispanRepo"
      class="org.apache.camel.component.infinispan.processor.idempotent.InfinispanIdempotentRepository"
      factory-method="infinispanIdempotentRepository">
    <argument ref="cacheManager"/>
    <argument value="idempotent"/>
</bean>

然后,我们也可以在 spring XML 文件中创建 Infinispan 幂等存储库:

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route id="JpaMessageIdRepositoryTest">
        <from uri="direct:start" />
        <idempotentConsumer messageIdRepositoryRef="infinispanStore">
            <header>messageId</header>
            <to uri="mock:result" />
        </idempotentConsumer>
    </route>
</camelContext>

163.7. 使用基于 Infinispan 的路由策略

163.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 164 章 InfluxDB 组件

作为 Camel 2.18 版提供

这个组件允许您与 InfluxDB https://influxdata.com/time-series-platform/influxdb/ 一个时间序列数据库进行交互。此组件的原生正文类型是 Point (原生的 inuxdb 类),但它还可接受 Map<String, Object> 作为消息正文,它将被转换为 Point.class,请注意映射必须包含 InfluxDbConstants.MEASUREMENT_NAME 作为键。

您可能会在您的数据类型中注册自己的转换器,或使用 camel 提供的(un) marshall 工具。

从 Influxdb 上的 Camel 2.18 需要 Java 8。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-influxdb</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

164.1. URI 格式

influxdb://beanName?[options]

164.2. URI 选项

该制作者允许使用原生 java 驱动程序将消息发送到注册表中配置的 influxdb。

InfluxDB 组件没有选项。

InfluxDB 端点使用 URI 语法进行配置:

influxdb:connectionBean

使用以下路径和查询参数:

164.2.1. 路径名(1 参数):

名称描述默认类型

connectionBean

需要与 influx 数据库的连接,类 InfluxDB.class

 

字符串

164.2.2. 查询参数(6 参数):

名称描述默认类型

batch (producer)

定义此操作是否为批处理操作

false

布尔值

databaseName (producer)

存储时间序列的数据库名称

 

字符串

operation (producer)

定义此操作是插入还是查询

insert

字符串

query (producer)

在操作查询的情况下定义查询

 

字符串

retentionPolicy (producer)

为端点创建的数据定义保留策略的字符串

default

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

164.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.influxdb.enabled

启用 influxdb 组件

true

布尔值

camel.component.influxdb.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

164.4. 消息标头

名称默认值类型Context描述
     

164.5. 示例

以下是一个示例路由,用于将点存储到 db (从 URI 填充 db 名称)特定键:

from("direct:start")
        .setHeader(InfluxDbConstants.DBNAME_HEADER, constant("myTimeSeriesDB"))
        .to("influxdb://connectionBean);
from("direct:start")
        .to("influxdb://connectionBean?databaseName=myTimeSeriesDB");

如需更多信息,请参阅这些资源…​

164.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 165 章 IPFS 组件

作为 Camel 版本 2.23 可用

ipfs: 组件提供对 Interplanetary 文件系统 (IPFS) 的访问。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ipfs</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

165.1. URI 格式

ipfs://cmd?options

165.2. 选项

IPFS 组件没有选项。

IPFS 端点使用 URI 语法进行配置:

ipfs:host:port/cmd

使用以下路径和查询参数:

165.2.1. 路径名(1 参数):

名称描述默认类型

ipfsCmd

ipfs 命令

 

字符串

165.2.2. 查询参数(2 参数):

名称描述默认类型

outdir (producer)

ipfs 输出目录

 

路径

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

165.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.ipfs.enabled

是否启用 ipfs 组件的自动配置。默认启用。

 

布尔值

camel.component.ipfs.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

165.4. Karaf 支持

在 Karaf 中不支持这个组件

165.5. 消息标头

<TODO><title>Samples</title>

在本例中,我们将一个文件添加到 IPFS,从 IPFS 获取文件,最后访问 IPFS 文件的内容。

from("direct:start").to("ipfs:add")
from("direct:start").to("ipfs:get?outdir=target")
from("direct:start").to("ipfs:cat");
</TODO>

第 166 章 IRC 组件

可作为 Camel 版本 1.1 提供

irc 组件实现 IRC (Internet Relay Chat)传输。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-irc</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

166.1. URI 格式

irc:nick@host[:port]/#room[?options]
irc:nick@host[:port]?channels=#channel1,#channel2,#channel3[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

166.2. 选项

IRC 组件支持 2 个选项,它们如下所列。

名称描述默认类型

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

IRC 端点使用 URI 语法配置:

irc:hostname:port

使用以下路径和查询参数:

166.2.1. 路径名(2 参数):

名称描述默认类型

hostname

IRC 聊天服务器 所需的 主机名

 

字符串

port

IRC 聊天服务器的端口号。如果没有配置端口,则使用 6667、6668 或 6669 的默认端口。

 

int

166.2.2. 查询参数(25 参数):

名称描述默认类型

autoRejoin (common)

是否在启动时自动重新加入

true

布尔值

commandTimeout (common)

在建立连接后发送命令前的延迟(毫秒)。

5000

long

namesOnJoin (common)

在加入集群后将 NAMES 命令发送到频道。必须保持为 true 才能处理具有标头值 irc.num = '353' 的结果。

false

布尔值

nickname (common)

聊天中使用的 nickname。

 

字符串

persistent (common)

弃用的 使用持久消息。

true

布尔值

realname (common)

IRC 用户的实际名称。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

颜色 (高级)

服务器是否支持颜色代码。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

onJoin (filter)

处理用户加入事件.

true

布尔值

onKick (filter)

处理启动事件。

true

布尔值

onMode (filter)

处理模式更改事件。

true

布尔值

onNick (filter)

处理 nickname 更改事件。

true

布尔值

onPart (filter)

处理用户部分事件.

true

布尔值

onPrivmsg (filter)

处理私有消息事件。

true

布尔值

onQuit (filter)

处理用户退出事件。

true

布尔值

onReply (filter)

是否处理对命令或信息消息的一般响应。

false

布尔值

onTopic (filter)

处理主题更改事件。

true

布尔值

nickPassword (security)

您的 IRC 服务器别名密码。

 

字符串

密码 (安全)

IRC 服务器密码。

 

字符串

sslContextParameters (security)

用于配置使用 SSL 的安全性。引用 registry 中的 org.apache.camel.util.jsse.SSLContextParameters。这个引用会覆盖组件级别的任何配置的 SSLContextParameters。请注意,此设置会覆盖 trustManager 选项。

 

SSLContextParameters

trustManager (security)

用于验证 SSL 服务器证书的信任管理器。

 

SSLTrustManager

username (security)

IRC 服务器用户名。

 

字符串

166.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.irc.enabled

启用 irc 组件

true

布尔值

camel.component.irc.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.irc.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

166.4. SSL 支持

166.4.1. 使用 JSSE 配置实用程序

从 Camel 2.9 开始,IRC 组件通过 Camel JSSE 配置实用程序 支持 SSL/TLS 配置。  这个实用程序可大大减少您需要编写的组件特定代码的数量,并在端点和组件级别进行配置。  以下示例演示了如何在 IRC 组件中使用 实用程序。

端点的程序配置

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("ircs://camel-prd-user@server:6669/#camel-test?nickname=camel-prd&password=password&sslContextParameters=#sslContextParameters");

基于 Spring DSL 端点配置

...
  <camel:sslContextParameters
      id="sslContextParameters">
    <camel:trustManagers>
      <camel:keyStore
          resource="/users/home/server/truststore.jks"
          password="keystorePassword"/>
    </camel:keyManagers>
  </camel:sslContextParameters>...
...
  <to uri="ircs://camel-prd-user@server:6669/#camel-test?nickname=camel-prd&password=password&sslContextParameters=#sslContextParameters"/>...

166.4.2. 使用旧的基本配置选项

您还可以连接到启用了 SSL 的 IRC 服务器,如下所示:

ircs:host[:port]/#room?username=user&password=pass

默认情况下,IRC 传输使用 SSLDefaultTrustManager。如果您需要提供自己的自定义信任管理器,请按如下所示使用 trustManager 参数:

ircs:host[:port]/#room?username=user&password=pass&trustManager=#referenceToMyTrustManagerBean

166.5. 使用密钥

可作为 Camel 2.2 提供

有些 irc 空间要求您提供能够加入该频道的密钥。键只是一个 secret 字词。

例如,我们加入 3 个频道,其中只有频道 1 和 3 使用密钥。

irc:nick@irc.server.org?channels=#chan1,#chan2,#chan3&keys=chan1Key,,chan3key

166.6. 获取频道用户列表

使用 nameOnJoin 选项,您可以在组件加入频道后调用 IRC-NAMES 命令。服务器将使用 irc.num = 353 进行回复。因此,为了处理结果,有关属性 必须 正确。另外,必须过滤 onReply Exchanges 才能获取名称。

例如,我们希望获得包含频道用户名的所有交换:

from("ircs:nick@myserver:1234/#mychannelname?namesOnJoin=true&onReply=true")
	.choice()
		.when(header("irc.messageType").isEqualToIgnoreCase("REPLY"))
			.filter(header("irc.num").isEqualTo("353"))
			.to("mock:result").stop();

166.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 167 章 JacksonXML DataFormat

作为 Camel 版本 2.16 可用

jackson XML 是一个数据格式,它使用带有 XMLMapper 扩展的 Jackson  ,将 XML 有效负载分到 Java 对象或将 marshal Java 对象编入 XML 有效负载中。

INFO:如果您熟悉 Jackson,此 XML 数据格式的行为与其 JSON 计数器部分相同,因此可用于 JSON 序列化/反序列化的类。

此扩展也模拟 JAXB 的"代码先"方法

这个数据格式依赖于 Woodstox (特别是印刷等功能),这是一个快速、高效的 XML 处理器。

from("activemq:My.Queue").
  unmarshal().jacksonxml().
  to("mqseries:Another.Queue");

167.1. JacksonXML 选项

JacksonXML 数据格式支持 15 个选项,如下所示。

名称默认Java 类型描述

xmlMapper

 

字符串

查找并使用给定 ID 的现有 XmlMapper。

prettyPrint

false

布尔值

启用大量打印输出。默认为 false。

unmarshalTypeName

 

字符串

取消armshalling 时要使用的 java 类型的类名称

jsonView

 

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

Include

 

字符串

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

allowJmsType

false

布尔值

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

collectionTypeName

 

字符串

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

useList

false

布尔值

要取消与映射列表或 Pojo 列表相关的内容。

enableJaxbAnnotationModule

false

布尔值

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

moduleClassNames

 

字符串

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

moduleRefs

 

字符串

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

enableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

disableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

allowUnmarshallType

false

布尔值

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

167.2. Spring Boot Auto-Configuration

组件支持 16 个选项,如下所示。

名称描述默认类型

camel.dataformat.jacksonxml.allow-jms-type

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

false

布尔值

camel.dataformat.jacksonxml.allow-unmarshall-type

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

false

布尔值

camel.dataformat.jacksonxml.collection-type-name

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

 

字符串

camel.dataformat.jacksonxml.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.jacksonxml.disable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.jacksonxml.enable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.jacksonxml.enable-jaxb-annotation-module

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

false

布尔值

camel.dataformat.jacksonxml.enabled

启用 jacksonxml 数据格式

true

布尔值

camel.dataformat.jacksonxml.include

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

 

字符串

camel.dataformat.jacksonxml.json-view

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

 

camel.dataformat.jacksonxml.module-class-names

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

 

字符串

camel.dataformat.jacksonxml.module-refs

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

 

字符串

camel.dataformat.jacksonxml.pretty-print

启用大量打印输出。默认为 false。

false

布尔值

camel.dataformat.jacksonxml.unmarshal-type-name

取消armshalling 时要使用的 java 类型的类名称

 

字符串

camel.dataformat.jacksonxml.use-list

要取消与映射列表或 Pojo 列表相关的内容。

false

布尔值

camel.dataformat.jacksonxml.xml-mapper

查找并使用给定 ID 的现有 XmlMapper。

 

字符串

ND

167.2.1. 在 Spring DSL 中使用 Jackson XML

在 Spring DSL 中使用数据格式时,您需要首先声明数据格式。这是在 DataFormats XML 标签中进行的。

        <dataFormats>
            <!-- here we define a Xml data format with the id jack and that it should use the TestPojo as the class type when
                 doing unmarshal. The unmarshalTypeName is optional, if not provided Camel will use a Map as the type -->
            <jacksonxml id="jack" unmarshalTypeName="org.apache.camel.component.jacksonxml.TestPojo"/>
        </dataFormats>

然后您可以在路由中引用这个 id:

       <route>
            <from uri="direct:back"/>
            <unmarshal ref="jack"/>
            <to uri="mock:reverse"/>
        </route>

167.3. 从marshalling marshalling cluding cluding

当 marshalling a POJO to XML 时,您可能想要从 XML 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图 来实现此目的。首先创建一个或多个标记类。

使用带有 @JsonView 注释的标记类,以包含/排除某些字段。该注释也可以用于 getter。

最后,使用 Camel JacksonXMLDataFormat 来汇总上述 POJO 到 XML。

请注意,生成的 XML 中缺少 weight 字段:

<pojo age="30" weight="70"/>

167.4. 使用 jsonView 属性和 'JacksonXML'DataFormat 的 include/Exclude 字段

作为使用此属性的示例,您可以改为:

JacksonXMLDataFormat ageViewFormat = new JacksonXMLDataFormat(TestPojoView.class, Views.Age.class);
from("direct:inPojoAgeView").
  marshal(ageViewFormat);

在 Java DSL 中直接指定您的 JSON 视图 ,如下所示:

from("direct:inPojoAgeView").
  marshal().jacksonxml(TestPojoView.class, Views.Age.class);

XML DSL 中的相同:

<from uri="direct:inPojoAgeView"/>
  <marshal>
    <jacksonxml unmarshalTypeName="org.apache.camel.component.jacksonxml.TestPojoView" jsonView="org.apache.camel.component.jacksonxml.Views$Age"/>
  </marshal>

167.5. 设置序列化包括选项

如果您想将 pojo 到 XML,则 pojo 含有一些带有 null 值的字段。您想跳过这些空值,那么您需要在 pojo 上设置注解。 

@JsonInclude(Include.NON_NULL)
public class MyPojo {
   ...
}

但这需要您在 pojo 源代码中包含该注解。您还可以将 Camel JacksonXMLDataFormat 配置为设置 include 选项,如下所示:

JacksonXMLDataFormat format = new JacksonXMLDataFormat();
format.setInclude("NON_NULL");

或者从 XML DSL 配置为

    <dataFormats>
      <jacksonxml id="jacksonxml" include="NON_NULL"/>
    </dataFormats>

167.6. 使用动态类名称从 XML 解压缩到 POJO

如果您使用 jackson 来取消对 XML unmarshal XML,那么您现在可以在消息中指定指出哪个类名称 unmarshal to to unmarshal 的消息中的标头。
如果消息中存在该标头,则标头带有键 CamelJacksonUnmarshalType ,那么 Jackson 会将该标头用作 POJO 类的 FQN 来取消封锁 XML 有效负载。

 对于 JMS 最终用户,来自 JMS spec 的 JMSType 标头指出也指出:要启用对 JMSType 的支持,您需要打开它,如 jackson 数据格式:

JacksonDataFormat format = new JacksonDataFormat();
format.setAllowJmsType(true);

或者从 XML DSL 配置为

    <dataFormats>
      <jacksonxml id="jacksonxml" allowJmsType="true"/>
    </dataFormats>

167.7. 从 XML 解封到 List<Map> 或 List<pojo>

如果您使用 Jackson 将 Jackson 解封到 map/pojo 列表中,您可以通过设置 List="true" 来指定这一点,或使用 org.apache.camel.component.jacksonxml.ListJacksonsonDataFormat。例如,通过 Java,您可以执行以下操作:

JacksonXMLDataFormat format = new ListJacksonXMLDataFormat();
// or
JacksonXMLDataFormat format = new JacksonXMLDataFormat();
format.useList();
// and you can specify the pojo class type also
format.setUnmarshalType(MyPojo.class);

如果使用 XML DSL,则您可以使用 useList 属性使用列表,如下所示:

    <dataFormats>
      <jacksonxml id="jack" useList="true"/>
    </dataFormats>

您还可以指定 pojo 类型

    <dataFormats>
      <jacksonxml id="jack" useList="true" unmarshalTypeName="com.foo.MyPojo"/>
    </dataFormats>

167.8. 使用自定义 Jackson 模块

您可以使用 moduleClassNames 选项指定这些类名称来使用自定义 Jackson 模块,如下所示。

    <dataFormats>
      <jacksonxml id="jack" useList="true" unmarshalTypeName="com.foo.MyPojo" moduleClassNames="com.foo.MyModule,com.foo.MyOtherModule"/>
    </dataFormats>

在使用 moduleClassNames 时,不会配置自定义 jackson 模块,使用默认构造器和使用 as-is 创建。如果自定义模块需要任何自定义配置,那么可以创建和配置模块实例,然后使用 moduleRefs 来指代该模块,如下所示:

    <bean id="myJacksonModule" class="com.foo.MyModule">
      ... // configure the module as you want
    </bean>
 
    <dataFormats>
      <jacksonxml id="jacksonxml" useList="true" unmarshalTypeName="com.foo.MyPojo" moduleRefs="myJacksonModule"/>
    </dataFormats>

 可以使用逗号分隔多个模块,如 moduleRefs="myJacksonModule,myOtherModule"

167.9. 使用 Jackson 启用或禁用功能

Jackson 有多个可以启用或禁用的功能,其 ObjectMapper 使用这些功能。例如,要在 marshalling 时禁用未知属性失败,您可以使用 disableFeatures 配置它:

 <dataFormats>
      <jacksonxml id="jacksonxml" unmarshalTypeName="com.foo.MyPojo" disableFeatures="FAIL_ON_UNKNOWN_PROPERTIES"/>
 </dataFormats>

您可以使用逗号分隔值来禁用多个功能。功能的值必须是来自以下枚举类的 Jackson 的枚举的名称

  • com.fasterxml.jackson.databind.SerializationFeature
  • com.fasterxml.jackson.databind.DeserializationFeature
  • com.fasterxml.jackson.databind.MapperFeature

要启用功能使用 enableFeatures 选项。

从 Java 代码,您可以使用来自 camel-jackson 模块的类型安全方法:

JacksonDataFormat df = new JacksonDataFormat(MyPojo.class);
df.disableFeature(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
df.disableFeature(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES);

167.10. 使用 Jackson 将 Map 转换为 POJO

jackson ObjectMapper 可用于将 map 转换为 POJO 对象。jackson 组件附带数据转换器,可用于将 java.util.Map 实例转换为非字符串、非固定和非Number 对象。

Map<String, Object> invoiceData = new HashMap<String, Object>();
invoiceData.put("netValue", 500);
producerTemplate.sendBody("direct:mapToInvoice", invoiceData);
...
// Later in the processor
Invoice invoice = exchange.getIn().getBody(Invoice.class);

如果 Camel 注册表中有一个 ObjectMapper 实例,它将供转换程序用于执行转换。否则将使用默认映射程序。 

167.11. 格式的 XMLmarshalling(pretty-printing)

使用 prettyPrint 选项时,可以输出一个格式良好的 XML:

 <dataFormats>
      <jacksonxml id="jack" prettyPrint="true"/>
 </dataFormats>

在 Java DSL 中:

from("direct:inPretty").marshal().jacksonxml(true);

请注意,有 5 种不同的 overloaded jacksonxml () DSL 方法,它支持 pretty打印 选项,与 unmarshalType、 jsonView 等的其他设置相结合。 

167.12. 依赖项

要在 camel 路由中使用 Jackson XML,您需要添加对 camel-jacksonxml 的依赖,实施此数据格式。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-jacksonxml</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

第 168 章 Jasypt 组件

可作为 Camel 2.5 提供

Jasypt 是一个简化的加密库,使加密和解密变得更加简单。Camel 与 Jasypt 集成,以允许在 Properties 文件中加密敏感信息。通过丢弃这些加密值的类路径 camel-jasypt 通过 Camel 自动解密。这可确保人关注不能轻易发现敏感信息,如用户名和密码。

如果使用 Maven,则需要为这个组件添加以下依赖项到 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jasypt</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

如果您使用 Apache Karaf 容器,则需要为这个组件添加以下依赖项到 pom.xml 中:

<dependency>
  <groupId>org.apache.karaf.jaas</groupId>
  <artifactId>org.apache.karaf.jaas.jasypt</artifactId>
  <version>x.x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

168.1. 工具

Jasypt 组件提供了一些命令行工具来加密或解密值。

控制台会输出语法及其提供的选项:

Apache Camel Jasypt takes the following options

  -h or -help = Displays the help screen
  -c or -command <command> = Command either encrypt or decrypt
  -p or -password <password> = Password to use
  -i or -input <input> = Text to encrypt or decrypt
  -a or -algorithm <algorithm> = Optional algorithm to use

例如,若要 使用下列参数 加密运行的值:在 apache camel kit 中,cd 到 lib 文件夹并运行以下 java cmd,其中 & lt;CAMEL_HOME > 是您下载并提取 Camel 发行版。

$ cd <CAMEL_HOME>/lib
$ java -jar camel-jasypt-2.5.0.jar -c encrypt -p secret -i tiger

输出以下结果

Encrypted text: qaEEacuW7BUti8LcMgyjKw==

这意味着,如果您知道 secret 的 master 密码,则 qaEEacuW7BUti8LcMgyjKw== 的加密表示可以重新解密为 tiger
如果您再次运行该工具,加密值将返回不同的结果。但解密值将始终返回正确的原始值。

因此,您可以使用以下参数运行该工具来测试它:

$ cd <CAMEL_HOME>/lib
$ java -jar camel-jasypt-2.5.0.jar -c decrypt -p secret -i qaEEacuW7BUti8LcMgyjKw==

输出以下结果:

Decrypted text: tiger

然后,在 Properties 文件中使用这些加密值。注意密码值如何加密,并且值具有周围了 ENC (此处的值)的令牌。

提示

在运行 jasypt 工具时,如果您遇到 java.lang.NoClassDefFoundError: org/jasypt/encryption/pbe/StandardPBEStringEncryptor 意味着您必须在 classpath 中包含 jasypt7.10.jar。将 jar 添加到 classpath 的示例可以作为 jasypt7.10.jar 复制到 $JAVA_HOME\jre\lib\ext (如果您打算以 java -jar …​.后者可能使用 -cp 将 jasypt7.10.jar 添加到 classpath 中,在该情形中,您应提供主要类,以 eg: java -cp jasypt-1.9.2.jar:camel-jasypt-2.18.2.jar org.apache.camel.component.jasypt.Main -c encrypt -p secret -iger-p

168.2. URI 选项

以下选项适用于 Jasypt 组件。

名称默认值类型描述

password

null

字符串

指定用于解密的 master 密码。这个选项是必须的。详情请查看以下信息。

algorithm

null

字符串

要使用的可选算法的名称。

168.3. 保护 master 密码

必须提供 Jasypt 使用的 master 密码,以便它能够解密值。但是,在打开中使用此主密码可能不是理想的解决方案。因此,您可以将它作为 JVM 系统属性或 OS 环境设置提供。如果您决定这样做,则 密码 选项支持指定的前缀。sysenv: 使用给定密钥查找操作系统环境。sys: 用于查找 JVM 系统属性。

例如,您可以在启动应用程序前提供密码

$ export CAMEL_ENCRYPTION_PASSWORD=secret

然后启动应用,如运行启动脚本。

当应用程序启动并运行时,您可以取消设置环境

$ unset CAMEL_ENCRYPTION_PASSWORD

然后,密码 选项将按照如下方式定义: password=sysenv:CAMEL_ENCRYPTION_PASSWORD

168.4. Java DSL 示例

在 Java DSL 中,您需要将 Jasypt 配置为 JasyptPropertiesParser 实例,并在 Properties 组件上设置它,如下所示:

属性文件 myproperties.properties 然后包含加密值,如下所示。注意密码值如何加密,并且值具有周围了 ENC (此处的值)的令牌。

168.5. Spring XML 示例

在 Spring XML 中,您需要配置 JasyptPropertiesParser,如下所示。然后,Camel Properties 组件被告知将 jasypt 用作属性解析程序,这意味着 Jasypt 有机会解密属性中的值。

<!-- define the jasypt properties parser with the given password to be used -->
<bean id="jasypt" class="org.apache.camel.component.jasypt.JasyptPropertiesParser">
    <property name="password" value="secret"/>
</bean>

<!-- define the camel properties component -->
<bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
    <!-- the properties file is in the classpath -->
    <property name="location" value="classpath:org/apache/camel/component/jasypt/myproperties.properties"/>
    <!-- and let it leverage the jasypt parser -->
    <property name="propertiesParser" ref="jasypt"/>
</bean>

Properties 组件也可以在 < camelContext& gt; 标签内内联,如下所示。请注意,我们如何使用 propertiesParserRef 属性引用 Jasypt。

<!-- define the jasypt properties parser with the given password to be used -->
<bean id="jasypt" class="org.apache.camel.component.jasypt.JasyptPropertiesParser">
    <!-- password is mandatory, you can prefix it with sysenv: or sys: to indicate it should use
         an OS environment or JVM system property value, so you dont have the master password defined here -->
    <property name="password" value="secret"/>
</bean>

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <!-- define the camel properties placeholder, and let it leverage jasypt -->
    <propertyPlaceholder id="properties"
                         location="classpath:org/apache/camel/component/jasypt/myproperties.properties"
                         propertiesParserRef="jasypt"/>
    <route>
        <from uri="direct:start"/>
        <to uri="{{cool.result}}"/>
    </route>
</camelContext>

168.6. 使用 Blueprint XML 的示例

在蓝图 XML 中,您需要配置 jsyptPropertiesParser ,如下所示。然后,Camel Properties 组件被告知将 jasypt 用作属性解析程序,这意味着 Jasypt 有机会解密属性中的值。

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

  <cm:property-placeholder id="myblue" persistent-id="mypersistent">
      <!-- list some properties for this test -->
      <cm:default-properties>
          <cm:property name="cool.result" value="mock:{{cool.password}}"/>
          <cm:property name="cool.password" value="ENC(bsW9uV37gQ0QHFu7KO03Ww==)"/>
      </cm:default-properties>
  </cm:property-placeholder>

    <!-- define the jasypt properties parser with the given password to be used -->
    <bean id="jasypt" class="org.apache.camel.component.jasypt.JasyptPropertiesParser">
        <property name="password" value="secret"/>
    </bean>

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
      <!-- define the camel properties placeholder, and let it leverage jasypt -->
      <propertyPlaceholder id="properties"
                           location="blueprint:myblue"
                           propertiesParserRef="jasypt"/>
        <route>
            <from uri="direct:start"/>
            <to uri="{{cool.result}}"/>
        </route>
    </camelContext>

</blueprint>

Properties 组件也可以在 < camelContext& gt; 标签内内联,如下所示。请注意,我们如何使用 propertiesParserRef 属性引用 Jasypt。

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

    <!-- define the jasypt properties parser with the given password to be used -->
    <bean id="jasypt" class="org.apache.camel.component.jasypt.JasyptPropertiesParser">
        <property name="password" value="secret"/>
    </bean>

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
      <!-- define the camel properties placeholder, and let it leverage jasypt -->
      <propertyPlaceholder id="properties"
                           location="classpath:org/apache/camel/component/jasypt/myproperties.properties"
                           propertiesParserRef="jasypt"/>
        <route>
            <from uri="direct:start"/>
            <to uri="{{cool.result}}"/>
        </route>
    </camelContext>

</blueprint>

168.7. 另请参阅

第 169 章 JAXB DataFormat

作为 Camel 版本 1.0 可用

JAXB 是一个数据格式,它使用 JAXB2 XML marshalling 标准,它包含在 Java 6 中,将 XML 有效负载解包到 Java 对象,或封装 Java 对象到 XML 有效负载中。

169.1. 选项

JAXB 数据格式支持 18 个选项,它们列如下。

名称默认Java 类型描述

contextPath

 

字符串

您的 JAXB 类所在的软件包名称。

schema

 

字符串

对现有架构进行验证。您可以使用前缀 classpath:、file: 或 http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个 schema 文件。

schemaSeverityLevel

0

整数

设置在对 schema 验证时使用的 schema 严重性级别。此级别决定了触发 JAXB 以继续解析的最低严重性错误。默认值为 0(warning)意味着任何错误(warning、error 或 fatal 错误)将触发 JAXB 来停止。有三个级别: 0=warning, 1=error, 2=fatal 错误。

prettyPrint

false

布尔值

启用大量打印输出。默认为 false。

objectFactory

false

布尔值

是否允许使用对象要素类在汇总过程中创建 POJO 类。这只适用于没有通过 JAXB 标注并提供 jaxb.index 描述符文件的 POJO 类。

ignoreJAXBElement

false

布尔值

是否忽略 JAXBElement 元素 - 在非常特殊用例中只需要设置为 false。

mustBeJAXBElement

false

布尔值

marhsalling 是否需要使用 JAXB 注释的 java 对象。如果不是,则失败。这个选项可以设置为 false 来放lax,例如当数据已采用 XML 格式时。

filterNonXmlChars

false

布尔值

忽略非 xml characheters,并将其替换为空空间。

encoding

 

字符串

使用规则规则并使用特定的编码

fragment

false

布尔值

开启 XML 片段树。默认情况下,JAXB 在给定类上查找 XmlRootElement 注解,以操作整个 XML 树。这很有用,但有时生成的代码没有 XmlRootElement 注解,有时您只需要树的一部分。在这种情况下,您可以使用部分卸载。要启用此行为,您需要设置属性 partClass。Camel 将把类传递给 JAXB 的 unmarshaler。

partClass

 

字符串

用于片段解析的类名称。查看 片段选项的更多详情。

partNamespace

 

字符串

用于碎片解析的 XML 命名空间。查看 片段选项的更多详情。

namespacePrefixRef

 

字符串

使用 JAXB 或 SOAP 总结时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。要控制此映射,Camel 允许您引用包含所需映射的映射。

xmlStreamWriterWrapper

 

字符串

使用自定义 xml 流写入器。

schemaLocation

 

字符串

定义架构的位置

noNamespaceSchemaLocation

 

字符串

定义无命名空间模式的位置

jaxbProviderProperties

 

字符串

在含有自定义 JAXB 提供者属性的注册表中查找自定义 java.util.Map 来引用要与 JAXB marshaller 搭配使用的自定义 java.util.Map。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

169.2. Spring Boot Auto-Configuration

组件支持 19 选项,如下所示。

名称描述默认类型

camel.dataformat.jaxb.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.jaxb.context-path

您的 JAXB 类所在的软件包名称。

 

字符串

camel.dataformat.jaxb.enabled

启用 jaxb 数据格式

true

布尔值

camel.dataformat.jaxb.encoding

使用规则规则并使用特定的编码

 

字符串

camel.dataformat.jaxb.filter-non-xml-chars

忽略非 xml characheters,并将其替换为空空间。

false

布尔值

camel.dataformat.jaxb.fragment

开启 XML 片段树。默认情况下,JAXB 在给定类上查找 XmlRootElement 注解,以操作整个 XML 树。这很有用,但有时生成的代码没有 XmlRootElement 注解,有时您只需要树的一部分。在这种情况下,您可以使用部分卸载。要启用此行为,您需要设置属性 partClass。Camel 将把类传递给 JAXB 的 unmarshaler。

false

布尔值

camel.dataformat.jaxb.ignore-j-a-x-b-element

是否忽略 JAXBElement 元素 - 在非常特殊用例中只需要设置为 false。

false

布尔值

camel.dataformat.jaxb.jaxb-provider-properties

在含有自定义 JAXB 提供者属性的注册表中查找自定义 java.util.Map 来引用要与 JAXB marshaller 搭配使用的自定义 java.util.Map。

 

字符串

camel.dataformat.jaxb.must-be-j-a-x-b-element

marhsalling 是否需要使用 JAXB 注释的 java 对象。如果不是,则失败。这个选项可以设置为 false 来放lax,例如当数据已采用 XML 格式时。

false

布尔值

camel.dataformat.jaxb.namespace-prefix-ref

使用 JAXB 或 SOAP 总结时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。要控制此映射,Camel 允许您引用包含所需映射的映射。

 

字符串

camel.dataformat.jaxb.no-namespace-schema-location

定义无命名空间模式的位置

 

字符串

camel.dataformat.jaxb.object-factory

是否允许使用对象要素类在汇总过程中创建 POJO 类。这只适用于没有通过 JAXB 标注并提供 jaxb.index 描述符文件的 POJO 类。

false

布尔值

camel.dataformat.jaxb.part-class

用于片段解析的类名称。查看 片段选项的更多详情。

 

字符串

camel.dataformat.jaxb.part-namespace

用于碎片解析的 XML 命名空间。查看 片段选项的更多详情。

 

字符串

camel.dataformat.jaxb.pretty-print

启用大量打印输出。默认为 false。

false

布尔值

camel.dataformat.jaxb.schema

对现有架构进行验证。您可以使用前缀 classpath:、file: 或 http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个 schema 文件。

 

字符串

camel.dataformat.jaxb.schema-location

定义架构的位置

 

字符串

camel.dataformat.jaxb.schema-severity-level

设置在对 schema 验证时使用的 schema 严重性级别。此级别决定了触发 JAXB 以继续解析的最低严重性错误。默认值为 0(warning)意味着任何错误(warning、error 或 fatal 错误)将触发 JAXB 来停止。有三个级别: 0=warning, 1=error, 2=fatal 错误。

0

整数

camel.dataformat.jaxb.xml-stream-writer-wrapper

使用自定义 xml 流写入器。

 

字符串

ND

169.3. 使用 Java DSL

例如,以下命令使用 jaxb 的命名 DataFormat,它配置了多个 Java 软件包名称来初始化 JAXBContext

DataFormat jaxb = new JaxbDataFormat("com.acme.model");

from("activemq:My.Queue").
  unmarshal(jaxb).
  to("mqseries:Another.Queue");

如果您更喜欢使用命名对数据格式的命名引用,那么可以在 registry 中通过 Spring XML 文件(如 )定义。

from("activemq:My.Queue").
  unmarshal("myJaxbDataType").
  to("mqseries:Another.Queue");

169.4. 使用 Spring XML

以下示例演示了如何使用 JAXB 使用 Spring 配置 jaxb 数据类型

本例演示了如何只配置数据类型一次,并在多个路由中重复使用它。

多个上下文路径

可以通过多个上下文路径来使用此数据格式。您可以使用 指定上下文路径 作为分隔符,如 com.mycompany:com.mycompany2。请注意,这由 JAXB 实施处理,如果您使用不同于 RI 的不同供应商,可能会改变。

169.5. 部分摘要/发布

这个功能是 Camel 2.2.0 的新功能。
JAXB 2 支持 marshalling 和 unmarshalling XML 树片段。默认情况下,JAXB 在给定类上查找 @XmlRootElement 注释,以便在整个 XML 树中操作。这很有用,但有时生成的代码没有 @XmlRootElement 注释,有时您只需要不总结树的一部分。
在这种情况下,您可以使用部分卸载。要启用此功能,您需要设置 property partClass。Camel 将把类传递给 JAXB 的 unmarshaler。如果 JaxbConstants.JAXB_PART_CLASS 设置为标题之一,(即使在 DataFormat 上设置了 partClass 属性),DataFormat 上的属性超过了标头中设置的属性。

对于 marshalling,您必须使用目标命名空间的 QName 添加 partNamespace 属性。您可以找到上述 Spring DSL 示例。如果 JaxbConstants.JAXB_PART_NAMESPACE 设置为标题之一,(即使在 DataFormat 上设置了 partNamespace 属性),DataFormat 的属性将被超过,并且报头中设置的值。通过 JaxbConstants.JAXB_PART_NAMESPACE 设置 partNamespace 时,您需要指定其值 {[namespaceUri]}[localPart]

   ...
   .setHeader(JaxbConstants.JAXB_PART_NAMESPACE, simple("{http://www.camel.apache.org/jaxb/example/address/1}address"));
   ...

169.6. 片段

这个功能是 Camel 2.8.0 的新功能。
JaxbDataFormat 有新的属性片段,可以在 JAXB Marshaller 中设置 Marshaller.JAXB_FRAGMENT 编码属性。如果您不希望 JAXB Marshaller 生成 XML 声明,您可以将这个选项设置为 true。此属性的默认值为 false。

169.7. 忽略 NonXML Character

这个功能是 Camel 2.2.0 的新功能。
JaxbDataFromat 支持忽略 NonXML Character,您只需要将 filterNonXmlChars 属性设为 true,JaxbDataFormat 将 NonXML 字符替换为 "。您还可以通过设置 Exchange 属性 Exchange.FILTER_NON_XML_CHARS 来完成此操作。

 

 JDK 1.5JDK 1.6+

使用过滤

stax API 和实施

不使用过滤

stax API 只

此功能已使用 Woodstox 3.2.9 和 Sun JDK 1.6 StAX 实现进行测试。

现在 ,为 Camel 2.12.1
JaxbDataFormat 提供了新的,您可以自定义用于汇总 XML 的 XMLStreamWriter。使用这个配置,您可以添加自己的流写器来完全删除、转义或者替换非xml 字符。

   JaxbDataFormat customWriterFormat = new JaxbDataFormat("org.apache.camel.foo.bar");
  customWriterFormat.setXmlStreamWriterWrapper(new TestXmlStreamWriter());

以下示例演示了使用 Spring DSL 以及启用 Camel 的 NonXML 过滤:

<bean id="testXmlStreamWriterWrapper" class="org.apache.camel.jaxb.TestXmlStreamWriter"/>
<jaxb filterNonXmlChars="true"  contextPath="org.apache.camel.foo.bar" xmlStreamWriterWrapper="#testXmlStreamWriterWrapper" />

169.8. 使用对象 factory

如果您使用 XJC 从 schema 创建 java 类,您将得到一个 objectFactory,供您 JAXB 上下文。由于 ObjectFactory 使用 JAXBElement 来保存 schema 和元素实例值的引用,所以 jaxbDataformat 将忽略 JAXBElement,并且您将获取元素实例值,而非 JAXBElement 对象形成未编设的消息正文。
如果您想要获取 JAXBElement 对象组成了 unmarshaled 邮件正文,则需要将 JaxbDataFormat 对象的 ignoreBElement 属性设置为 false。

169.9. 设置编码

您可以将 编码选项设置为 在总结时使用。其 Marshaller.JAXB_ENCODING 编码属性在 JAXB Marshaller 上。
您可以设置在声明 JAXB 数据格式时要使用的编码。您还可以在 Exchange 属性 Exchange.CHARSET_NAME 中提供编码。此属性将过度规则在 JAXB 数据格式上设置的编码。

在此 Spring DSL 中,我们定义了使用 iso-8859-1 作为编码:

169.10. 控制命名空间前缀映射

可从 Camel 2.11 开始

使用 JAXBSOAP 总结时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。要控制此映射,Camel 允许您引用包含所需映射的映射。

请注意,这需要在 classpath 上具有 JAXB-RI 2.1 或更高(来自 SUN),因为映射功能取决于 JAXB 的实施,无论其是否受支持。

例如,在 Spring XML 中,可以使用 映射定义映射。在下面的映射文件中,我们映射了 SOAP 使其使用 soap 作为前缀。虽然我们的自定义命名空间 "http://www.mycompany.com/foo/2" 不使用任何前缀。

  <util:map id="myMap">
    <entry key="http://www.w3.org/2003/05/soap-envelope" value="soap"/>
    <!-- we dont want any prefix for our namespace -->
    <entry key="http://www.mycompany.com/foo/2" value=""/>
  </util:map>

要在 JAXBSOAP 中使用它,请参考这个映射,使用 namespacePrefixRef 属性,如下所示。然后,Camel 会在 Registry 中查找 java.util.Map,其 ID 为 "myMap",这是我们上方定义的。

  <marshal>
    <soapjaxb version="1.2" contextPath="com.mycompany.foo" namespacePrefixRef="myMap"/>
  </marshal>

169.11. 模式验证

可从 Camel 2.11 开始

JAXB 数据格式支持通过汇总和从/到 XML 中提取和解包验证。您可以使用前缀 classpath:file:http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个 schema 文件。

已知问题

Camel 2.11.0 和 2.11.1 通过验证并行多个 'Exchange's 来存在一个已知问题。请参阅 CAMEL-6630。这个问题已解决为 Camel 2.11.2/2.12.0。

使用 Java DSL,您可以使用以下方法进行配置:

JaxbDataFormat jaxbDataFormat = new JaxbDataFormat();
jaxbDataFormat.setContextPath(Person.class.getPackage().getName());
jaxbDataFormat.setSchema("classpath:person.xsd,classpath:address.xsd");

您可以使用 XML DSL 执行相同的操作:

<marshal>
    <jaxb id="jaxb" schema="classpath:person.xsd,classpath:address.xsd"/>
</marshal>

由于 JDK 附带的 Schema onnectionFactoryy 实例并非线程安全,Camel 将永久创建并组成了底层实例。
但是,如果您有一个 SchemaonnectionFactory y 实现线程安全,则可以配置 JAXB 数据格式来使用此数据:

JaxbDataFormat jaxbDataFormat = new JaxbDataFormat();
jaxbDataFormat.setSchemaFactory(thradSafeSchemaFactory);

169.12. 模式位置

可从 Camel 2.14 开始

JAXB 数据格式支持在对 XML 进行汇总时指定 SchemaLocation。 

使用 Java DSL,您可以使用以下方法进行配置:

JaxbDataFormat jaxbDataFormat = new JaxbDataFormat();
jaxbDataFormat.setContextPath(Person.class.getPackage().getName());
jaxbDataFormat.setSchemaLocation("schema/person.xsd");

您可以使用 XML DSL 执行相同的操作:

<marshal>
    <jaxb id="jaxb" schemaLocation="schema/person.xsd"/>
</marshal>

169.13. 已放入 XML 的数据

可从 Camel 2.14.1 开始

JAXB marshaller 要求消息正文与 JAXB 兼容,如具有 JAXB 注释的 java 实例或扩展 JAXBElement。在有些情况下,消息正文已在 XML 中,例如来自 String 类型。有一个新的选项 mustBeJAXBElement,您可以设置为 false,设置为 relax this check,因此 JAXB marshaller 仅尝试 marshal JAXBElements (javax.xml.bind.JAXBIntrospector#isElement returns true)。在这些情况下,marshaller 回退到总结消息正文。

169.14. 依赖项

要在 camel 路由中使用 JAXB,需要添加对 camel-jaxb 的依赖来实施此数据格式。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-jaxb</artifactId>
  <version>x.x.x</version>
</dependency>

第 170 章 JCache Component

作为 Camel 2.17 版提供

jcache 组件可让您使用 JSR107/JCache 作为缓存实施来执行缓存操作。

170.1. URI 格式

jcache:cacheName[?options]

170.2. URI 选项

JCache 端点使用 URI 语法配置:

jcache:cacheName

使用以下路径和查询参数:

170.2.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

170.2.2. 查询参数(22 参数):

名称描述默认类型

cacheConfiguration (common)

缓存的配置

 

配置

cacheConfigurationProperties (common)

javax.cache.spi.CachingProvider 的属性,以创建 CacheManager

 

Properties

cachingProvider (common)

javax.cache.spi.CachingProvider 的完全限定类名称

 

字符串

configurationUri (common)

CacheManager 的实现特定 URI

 

字符串

managementEnabled (common)

是否启用管理收集

false

布尔值

readThrough (common)

如果使用 read-through 缓存

false

布尔值

statisticsEnabled (common)

是否启用统计收集

false

布尔值

storeByValue (common)

如果缓存应使用 store-by-value 或 store-by-reference语义

true

布尔值

writeThrough (common)

如果使用直写缓存

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

filteredEvents (consumer)

消费者应过滤的事件。如果使用 filteredEvents 选项,则 eventFilters 将被忽略

 

list

oldValueRequired (consumer)

如果事件需要旧值

false

布尔值

同步 (消费者)

如果事件监听程序应该阻止线程导致事件

false

布尔值

eventFilters (consumer)

CacheEntryEventFilter。如果使用 eventFilters 选项,则忽略 filteredEvents

 

list

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

action (producer)

默认情况下,使用缓存操作配置。如果消息标头中的操作,则来自标头的操作将优先使用。

 

字符串

cacheLoaderFactory (advanced)

CacheLoader factory

 

factory

cacheWriterFactory (advanced)

CacheWriter factory

 

factory

createCacheIfNotExists (advanced)

配置如果缓存存在或者未预先配置,则需要创建缓存。

true

布尔值

expiryPolicyFactory (advanced)

ExpiryPolicy factory

 

factory

lookupProviders (advanced)

配置 camel-cache 是否应该尝试在 OSGi 等运行时查找 jcache api 的实现。

false

布尔值

170.3. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.jcache.cache-configuration

缓存的配置。选项是 javax.cache.configuration.Configuration 类型。

 

字符串

camel.component.jcache.cache-configuration-properties

javax.cache.spi.CachingProvider 的属性,以创建 CacheManager。选项是 java.util.Properties 类型。

 

字符串

camel.component.jcache.caching-provider

javax.cache.spi.CachingProvider 的完全限定类名称

 

字符串

camel.component.jcache.configuration-uri

CacheManager 的实现特定 URI

 

字符串

camel.component.jcache.enabled

启用 jcache 组件

true

布尔值

camel.component.jcache.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

JCache 组件支持 5 个选项,它们如下所列。

名称描述默认类型

cachingProvider (common)

javax.cache.spi.CachingProvider 的完全限定类名称

 

字符串

cacheConfiguration (common)

缓存的配置

 

配置

缓存配置属性 (通用)

javax.cache.spi.CachingProvider 的属性,以创建 CacheManager

 

Properties

configurationUri (common)

CacheManager 的实现特定 URI

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 171 章 JClouds Component

作为 Camel 版本 2.9 提供。

此组件允许与云供应商键-值引擎(blobstore)和计算服务交互。组件使用 jclouds,即
一个为 blob 存储和计算服务提供抽象的库。

ComputeService 简化了在云中管理机器的任务。例如,您可以使用 ComputeService 启动 5 机器并在其中安装软件。
BlobStore 简化了处理键值提供程序(如 Amazon S3)的过程。例如,BlobStore 可以提供容器的简单 map 视图。

camel jclouds 组件允许您同时使用抽象,因为它将 JcloudsBlobStoreEndpoint 和 JcloudsComputeEndpoint 指定了两种类型的端点。您可以在 blobstore 端点上拥有制作者和使用者,但您只能在计算端点上具有制作者。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jclouds</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

171.1. 配置组件

camel jclouds 组件将使用多个 jclouds blob 存储和计算服务,只要它们在初始化期间传递给组件。组件接受一个 list blobstores 和 compute 服务。以下是如何配置它的:

    <bean id="jclouds" class="org.apache.camel.component.jclouds.JcloudsComponent">
        <property name="computeServices">
            <list>
                <ref bean="computeService"/>
            </list>
        </property>
        <property name="blobStores">
            <list>
                <ref bean="blobStore"/>
            </list>
        </property>
    </bean>

    <!-- Creating a blobstore from spring / blueprint xml -->
    <bean id="blobStoreContextFactory" class="org.jclouds.blobstore.BlobStoreContextFactory"/>

    <bean id="blobStoreContext" factory-bean="blobStoreContextFactory" factory-method="createContext">
        <constructor-arg name="provider" value="PROVIDER_NAME"/>
        <constructor-arg name="identity"  value="IDENTITY"/>
        <constructor-arg name="credential" value="CREDENTIAL"/>
    </bean>

    <bean id="blobStore" factory-bean="blobStoreContext" factory-method="getBlobStore"/>

    <!-- Creating a compute service from spring / blueprint xml -->
    <bean id="computeServiceContextFactory" class="org.jclouds.compute.ComputeServiceContextFactory"/>

    <bean id="computeServiceContext" factory-bean="computeServiceContextFactory" factory-method="createContext">
        <constructor-arg name="provider" value="PROVIDER_NAME"/>
        <constructor-arg name="identity"  value="IDENTITY"/>
        <constructor-arg name="credential" value="CREDENTIAL"/>
    </bean>

    <bean id="computeService" factory-bean="computeServiceContext" factory-method="getComputeService"/>

如您所见,该组件能够处理多个 blob 存储和计算服务。每个端点将使用的实际实现是通过在 URI 中传递提供程序来指定的。

171.2. Jclouds 选项

jclouds:blobstore:[provider id][?options]
jclouds:compute:[provider id][?options]

provider id 是提供目标服务的云供应商的名称(如 aws-s3 或 aws_ec2)。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

171.3. Blobstore URI Options

JClouds 组件支持 3 个选项,它们如下所列。

名称描述默认类型

blobStores (common)

要使用给定的 BlobStore,在使用 blobstore 时必须进行配置。

 

list

computeServices (common)

要使用给定的 ComputeService,在使用计算时必须进行配置。

 

list

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

JClouds 端点使用 URI 语法进行配置:

jclouds:command:providerId

使用以下路径和查询参数:

171.3.1. 路径名(2 参数):

名称描述默认类型

命令

执行 什么命令,如 blobstore 或 compute。

 

JcloudsCommand

providerId

必需 提供目标服务的云供应商名称(如 aws-s3 或 aws_ec2)。

 

字符串

171.3.2. 查询参数(15 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

blobName (blobstore)

blob 的名称。

 

字符串

container (blobstore)

blob 容器的名称。

 

字符串

directory (blobstore)

要使用的可选目录名称

 

字符串

group (compute)

分配给新创建的节点的组。价值取决于实际的云供应商。

 

字符串

hardwareId (compute)

用于创建节点的硬件。价值取决于实际的云供应商。

 

字符串

imageId (compute)

用于创建节点的 imageId。价值取决于实际的云供应商。

 

字符串

locationId (compute)

用于创建节点的位置。价值取决于实际的云供应商。

 

字符串

nodeId (compute)

将运行脚本或销毁的节点的 ID。

 

字符串

nodeState (compute)

按节点状态过滤为仅选择正在运行的节点等。

 

字符串

operation (compute)

指定要在 blobstore 上执行的操作类型。

 

字符串

user (compute)

将运行 脚本的目标节点上的用户。

 

字符串

您可以像这样一样多地使用这些选项。

jclouds:blobstore:aws-s3?operation=CamelJcloudsGet&container=mycontainer&blobName=someblob

对于制作者端点,您可以通过将相应的标头传递给消息来覆盖上述 URI 选项。

171.3.3. blobstore 的消息 Headers

标头描述

CamelJcloudsOperation

对 blob 执行的操作。有效选项为 * PUT * GET

CamelJcloudsContainer

blob 容器的名称。

CamelJcloudsBlobName

blob 的名称。

171.4. Blobstore Usage Samples

171.4.1. 示例 1:处理 blob

本例将向您展示如何使用 jclouds 组件在 blob 中存储任何消息。

from("direct:start")
    .to("jclouds:blobstore:aws-s3" +
        "?operation=PUT" +
        "&container=mycontainer" +
        "&blobName=myblob");

在上例中,您可以使用消息中的标头覆盖任何 URI 参数。以下是使用 xml 定义路由的方式。

<route>
    <from uri="direct:start"/>
    <to uri="jclouds:blobstore:aws-s3?operation=PUT&container=mycontainer&blobName=myblob"/>
</route>

171.4.2. 示例 2:从 blob 中获取/恢复

本例将向您展示如何使用 jclouds 组件读取 blob 的 contnet。

from("direct:start")
    .to("jclouds:blobstore:aws-s3" +
        "?operation=GET" +
        "&container=mycontainer" +
        "&blobName=myblob");

在上例中,您可以使用消息中的标头覆盖任何 URI 参数。以下是使用 xml 定义路由的方式。

<route>
    <from uri="direct:start"/>
    <to uri="jclouds:blobstore:aws-s3?operation=PUT&container=mycontainer&blobName=myblob"/>
</route>

171.4.3. 示例 3:使用 blob

本例将使用指定容器下的所有 blob。生成的交换将包含 blob 的有效负载,作为正文。

    from("jclouds:blobstore:aws-s3" +
        "?container=mycontainer")
        .to("direct:next");

您可以使用 xml 实现相同的目标,如下所示。

<route>
    <from uri="jclouds:blobstore:aws-s3?operation=GET&container=mycontainer&blobName=myblob"/>
    <to uri="direct:next"/>
</route>
jclouds:compute:aws-ec2?operation=CamelJcloudsCreateNode&imageId=AMI_XXXXX&locationId=eu-west-1&group=mygroup

171.5. 计算使用示例

以下是一些示例演示了在 java dsl 和 spring/blueprint xml 中使用 jclouds 计算制作者的示例。

171.5.1. 示例 1:列出可用镜像.

    from("jclouds:compute:aws-ec2" +
        "&operation=CamelJCloudsListImages")
        .to("direct:next");

这将创建一个消息,其中包含其正文中的镜像列表。您还可以使用 xml 执行相同的操作。

<route>
    <from uri="jclouds:compute:aws-ec2?operation=CamelJCloudsListImages"/>
    <to uri="direct:next"/>
</route>

171.5.2. 示例 2:创建新节点。

    from("direct:start").
    to("jclouds:compute:aws-ec2" +
        "?operation=CamelJcloudsCreateNode" +
        "&imageId=AMI_XXXXX" +
        "&locationId=XXXXX" +
        "&group=myGroup");

这将在云提供商上创建一个新节点。此例中的 out 消息将是一组元数据,其中包含关于新创建的节点的信息(例如 ip、hostname 等)。以下是使用 spring xml 相同的操作。

<route>
    <from uri="direct:start"/>
    <to uri="jclouds:compute:aws-ec2?operation=CamelJcloudsCreateNode&imageId=AMI_XXXXX&locationId=XXXXX&group=myGroup"/>
</route>

171.5.3. 示例 3:在运行中的节点上运行 shell 脚本。

    from("direct:start").
    to("jclouds:compute:aws-ec2" +
        "?operation=CamelJcloudsRunScript" +
        "?nodeId=10" +
        "&user=ubuntu");

上面的示例将检索消息的正文,这应该包含要执行的 shell 脚本。检索脚本后,该脚本将发送到节点,以便在指定用户(如ubuntu )下执行。目标节点使用 nodeId 指定。nodeId 可在创建节点时检索,它将是生成的元数据的一部分,或者执行 LIST_NODES 操作。

请注意,这将要求将传递到组件的计算服务,以使用适当的 jclouds ssh 功能模块(例如 jsch 或 sshj)进行初始化。

以下是使用 spring xml 相同的操作。

<route>
    <from uri="direct:start"/>
    <to uri="jclouds:compute:aws-ec2?operation=CamelJcloudsListNodes&?nodeId=10&user=ubuntu"/>
</route>

171.5.4. 另请参阅

如果您想在此处找到更多关于 jclouds 的信息,就是有趣的资源

Jclouds Blobstore wiki

Jclouds Compute wiki

第 172 章 JCR 组件

作为 Camel 版本 1.3 提供

jcr 组件允许您在其制作者中使用 JCR 兼容内容存储库(例如,Apache Jackrabbit)添加/读取节点,或将 EventListener 注册给消费者。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jcr</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

172.1. URI 格式

jcr://user:password@repository/path/to/node

增加了使用者

Camel 2.10 开始,您可以使用使用者作为 JCR 中的 EventListener,或制作者根据标识符读取节点。

172.2. 使用

URI 的存储库 元素用于查找 Camel 上下文 registry 中的 JCR Repository 对象。

172.2.1. JCR 选项

JCR 组件没有选项。

JCR 端点使用 URI 语法进行配置:

jcr:host/base

使用以下路径和查询参数:

172.2.2. 路径名(2 参数):

名称描述默认类型

主机

需要 Name of the javax.jcr.Repository 以从 Camel 注册表中查找。

 

字符串

base

访问存储库时获取基本节点

 

字符串

172.2.3. 查询参数(14 参数):

名称描述默认类型

deep (common)

当 isDeep 为 true 时,接收相关的父节点位于 absPath 或其子图形中的事件。

false

布尔值

eventTypes (common)

eventTypes (一个或多个事件类型的组合以位掩码值(如 javax.jcr.observation.Event.NODE_ADDED、javax.jcr.observation.Event.NODE_REMOVED 等)编码。

 

int

nodeTypeNames (common)

当设置了以逗号分隔的 nodeTypeName 列表字符串时,将只获得相关父节点之一节点类型(或其中一个节点类型的子类型)的事件。

 

字符串

noLocal (common)

如果没有Local 为 true,则忽略通过该会话生成的事件。否则,不会忽略它们。

false

布尔值

password (common)

用于登录的密码

 

字符串

sessionLiveCheckInterval (common)

在每次会话实时检查前等待的间隔时间为 60000 ms。

60000

long

sessionLiveCheckIntervalOn Start (common)

在第一个会话实时检查前等待的间隔(毫秒)。默认值为 3000 ms。

3000

long

username (common)

用于登录的用户名

 

字符串

uuids (common)

当设置了以逗号分隔的 uuid 列表字符串时,将只接收其关联的父节点有一个标识符(以逗号分开的 uuid 列表中)。

 

字符串

workspaceName (common)

访问的工作区。如果未指定,则使用默认选项

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

172.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.jcr.enabled

启用 jcr 组件

true

布尔值

camel.component.jcr.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

请注意,JCR Producer 使用了消息属性,而不是在 2.123 之前的 Camel 版本中的消息标头。详情请查看 https://issues.apache.org/jira/browse/CAMEL-7067

172.4. 示例

以下片段在内容存储库中的 /home/test 节点下创建名为 node 的节点。另外,还会向节点添加一个额外的属性: my.contents.property,其中包含正在发送的消息的正文。

from("direct:a").setHeader(JcrConstants.JCR_NODE_NAME, constant("node"))
    .setHeader("my.contents.property", body())
    .to("jcr://user:pass@repository/home/test");

 

以下代码将在事件的路径 import-application/inbox 下注册 EventListener。NODE_ADDED 和 Event.NODE_REMOVED 事件(事件类型 1 和 2)都屏蔽为 3,并侦听所有子对象。

<route>
    <from uri="jcr://user:pass@repository/import-application/inbox?eventTypes=3&deep=true" />
    <to uri="direct:execute-import-application" />
</route>

172.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 173 章 JDBC 组件

可作为 Camel 版本 1.2 提供

jdbc 组件允许您通过 JDBC 访问数据库,其中 SQL 查询(SELECT)和操作(INSERT、UPDATE 等)会在消息正文中发送。此组件使用标准的 JDBC API,不同于使用 spring-jdbc 的 SQL 组件组件。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jdbc</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

此组件只能用于定义制作者端点,这意味着您无法在 from () 语句中使用 JDBC 组件。

Transactions

在使用 camel-jdbc 选项时,您必须实施并配置事务管理器,并将 Camel 路由定义中的 resetAutoCommit 属性设置为 false

带有 camel-jdbc 的事务路由定义

from("direct:tx")
    .transacted()
    .to("jdbc:test_db?resetAutoCommit=false")
注意

camel-jdbc 组件一起使用时,不需要 transacted=true 属性。如果您需要额外功能,请考虑使用 camel-sql 组件。

173.1. URI 格式

jdbc:dataSourceName[?options]

此组件仅支持制作者端点。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

173.2. 选项

JDBC 组件支持 2 个选项,它们如下所列。

名称描述默认类型

dataSource (producer)

使用 DataSource 实例,而不根据 registry 中名称查找数据源。

 

DataSource

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

JDBC 端点使用 URI 语法配置:

jdbc:dataSourceName

使用以下路径和查询参数:

173.2.1. 路径名(1 参数):

名称描述默认类型

dataSourceName

在 Registry 中查找 所需的 DataSource Name。如果名称是 dataSource 或 default,则 Camel 将尝试从 registry 中查找默认的 DataSource,这意味着是否只找到 DataSource 实例,则会使用这个 DataSource。

 

字符串

173.2.2. 查询参数(13 参数):

名称描述默认类型

allowNamedParameters (producer)

是否允许使用查询中的指定参数。

true

布尔值

outputClass (producer)

指定在 outputType=SelectOne 或 SelectList 时用作转换的完整软件包和类名称。

 

字符串

outputType (producer)

确定制作者应使用的输出。

SelectList

JdbcOutputType

parameters (producer)

java.sql.Statement 的可选参数。例如,若要设置 maxRows, fetchSize etc。

 

map

readSize (producer)

默认由轮询查询读取的行数上限。默认值为 0。

 

int

resetAutoCommit (producer)

Camel 将 JDBC 连接上的 autoCommit 设置为 false,在执行 语句后提交更改,并在结尾重置连接的 autoCommit 标志(如果 resetAutoCommit 为 true)。如果 JDBC 连接不支持重置 autoCommit 标志,您可以将 resetAutoCommit 标志设置为 false,Commit 标志也不会尝试重置 autoCommit 标志。与 XA 事务一起使用时,很可能需要将其设置为 false,以便交易管理器负责提交此 tx。

true

布尔值

transacted (producer)

是否使用事务。

false

布尔值

useGetBytesForBlob (producer)

以字节而不是字符串数据形式读取 BLOB 列。对于某些数据库(如 Oracle)需要这样做,如 Oracle,您必须读取 BLOB 列作为字节数。

false

布尔值

useHeadersAsParameters (producer)

将这个选项设置为 true 以使用带有命名参数的 prepareStatementStrategy。这允许使用命名占位符定义查询,并使用带有查询占位符的动态值的标头。

false

布尔值

useJDBC4ColumnNameAnd LabelSemantics (producer)

设置在检索列名称时是否使用 JDBC 4 还是 JDBC 3.0 还是旧的语义。JDBC 4.0 使用 columnLabel 获取作为 JDBC 3.0 使用 columnName 或 columnLabel 的列名称。不幸的是 JDBC 驱动程序的行为不同,如果您使用这个组件,则此选项将使用这个选项解决 JDBC 驱动程序的问题。

true

布尔值

beanRowMapper (advanced)

使用 outputClass 时,使用自定义 org.apache.camel.component.jdbc.BeanRowMapper。默认实现将降低行名称并跳过下划线和短划线。例如,CUST_ID 映射为 custId。

 

BeanRowMapper

prepareStatementStrategy (advanced)

允许插件使用自定义 org.apache.camel.component.jdbc.JdbcPrepareStatementStrategy 来控制对查询准备和准备的语句。

 

JdbcPrepareStatement Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

173.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.jdbc.data-source

使用 DataSource 实例,而不根据 registry 中名称查找数据源。选项是一个 javax.sql.DataSource 类型。

 

字符串

camel.component.jdbc.enabled

启用 jdbc 组件

true

布尔值

camel.component.jdbc.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

173.4. 结果

默认情况下,OUT 正文返回为 ArrayList<HashMap<String,object>>List 对象包含行列表,Map 对象包含每个行,String 键作为列名称。您可以使用 选项 outputType 来控制结果。

注: 此组件获取 ResultSetMetaData,以便能够将列名称返回为 Map 中的键。

173.4.1. 消息标头

标头描述

CamelJdbcRowCount

如果查询是 SELECT,则在此 OUT 标头中返回行数。

CamelJdbcUpdateCount

如果查询是 UPDATE,则在此 OUT 标头中返回更新数。

CamelGeneratedKeysRows

Camel 2.10: 包含生成的 kets 的 Rows。

CamelGeneratedKeysRowCount

Camel 2.10: 标头中包含生成的密钥的行数。

CamelJdbcColumnNames

Camel 2.11.1: 来自 ResultSet 的列名称作为 java.util.Set 类型。

CamelJdbcParametes

Camel 2.12: A java.util.Map,在启用了 HeadersAsParameters 时具有要使用的标头。

173.5. 生成的密钥

可从 Camel 2.10 开始

如果使用 SQL INSERT 插入数据,RDBMS 可能支持自动生成的密钥。您可以指示 JDBC producer 在标头中返回生成的密钥。
为此,请设置标头 CamelRetrieve generatedKeys=true。然后,生成的密钥将作为标头提供,并带有上表中列出的键。

您可以在这个 单元测试 中看到更多详细信息。

使用生成的键不能与命名参数一起使用。

173.6. 使用命名参数

可作为 Camel 2.12 提供

在给定路由中,我们希望从 projects 表中获取所有项目。注意 SQL 查询具有 2 个命名参数,即 :?lic 和 :?min。
Camel 随后将从邮件标题查找这些参数。请注意,在上面的示例中,我们为命名参数设置了带有恒定值
的两个标头:

  from("direct:projects")
     .setHeader("lic", constant("ASF"))
     .setHeader("min", constant(123))
     .setBody("select * from projects where license = :?lic and id > :?min order by id")
     .to("jdbc:myDataSource?useHeadersAsParameters=true")

您也可以将标头值存储在 java.util.Map 中,并使用键 CamelJdbcParameters 存储在标题上。

173.7. Samples

在以下示例中,我们从客户表中获取相应的行。

首先,在 Camel 注册表中将数据源注册为 testdb

然后,我们将配置路由到 JDBC 组件的路由,因此将执行 SQL。请注意,我们如何引用上一步中绑定的 testdb 数据源:

或者您可以在 Spring 中创建 DataSource,如下所示:

我们创建一个端点,将 SQL 查询添加到 IN 消息的正文中,然后发送交换。查询的结果在 OUT 正文中返回:

如果您需要一次使用 Splitter EIP,例如:

from("direct:hello")
// here we split the data from the testdb into new messages one by one
// so the mock endpoint will receive a message per row in the table
// the StreamList option allows to stream the result of the query without creating a List of rows
// and notice we also enable streaming mode on the splitter
.to("jdbc:testdb?outputType=StreamList")
  .split(body()).streaming()
  .to("mock:result");

173.8. 示例 - 每分钟轮询数据库

如果要使用 JDBC 组件轮询数据库,我们需要将其与轮询调度程序(如 TimerQuartz 等)相结合。在以下示例中,我们每 60 秒从数据库检索数据:

from("timer://foo?period=60000")
  .setBody(constant("select * from customer"))
  .to("jdbc:testdb")
  .to("activemq:queue:customers");

173.9. 示例 - 在数据源之间移动数据

常见的用例是查询数据,处理数据并将其移动到另一个数据源(ETL 操作)。在以下示例中,我们每小时从源表中检索新的客户记录,过滤/传输它们并将其移动到目标表:

from("timer://MoveNewCustomersEveryHour?period=3600000")
    .setBody(constant("select * from customer where create_time > (sysdate-1/24)"))
    .to("jdbc:testdb")
    .split(body())
        .process(new MyCustomerProcessor()) //filter/transform results as needed
        .setBody(simple("insert into processed_customer values('${body[ID]}','${body[NAME]}')"))
        .to("jdbc:testdb");

第 174 章 Jetty 9 组件

可作为 Camel 版本 1.2 提供

警告

制作者已弃用 - 不使用。我们建议使用 jetty 作为使用者(如来自 jetty)

jetty 组件提供基于 HTTP 的端点,以用于消耗和生成 HTTP 请求。也就是说,Jetty 组件的行为是简单的 Web 服务器。
Jetty 也可以用作 http 客户端,这意味着您还可将其用于 Camel 作为制作者。

Stream

本例中为 assert 调用,因为代码是单元测试的一部分。Jetty 是基于流的,这意味着它接收的输入作为流提交到 Camel。这意味着,一次只能读取流的内容
如果发现消息正文显示为空或者您需要多次访问 Exchange.HTTP_RESPONSE_CODE 数据(例如:执行多播或重新传送错误处理),您应该使用流缓存或将消息正文转换为 String 以便多次重新读取。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jetty</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

174.1. URI 格式

jetty:http://hostname[:port][/resourceUri][?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

174.2. 选项

Jetty 9 组件支持 33 个选项,它们如下所列。

名称描述默认类型

sslKeyPassword (security)

密钥密码,用于访问密钥存储中的密钥条目(这是提供给密钥存储命令的 -keypass 选项)的密码。

 

字符串

sslPassword (security)

ssl 密码,需要访问密钥存储文件(这是提供给密钥存储命令的 -storepass 选项)的密码。

 

字符串

keystore (security)

指定 Java 密钥存储文件的位置,在 key 条目中包含 Jetty 服务器自己的 X.509 证书。

 

字符串

errorHandler (advanced)

这个选项用于设置 Jetty 服务器使用的 ErrorHandler。

 

ErrorHandler

sslSocketConnectors (security)

包含每个端口号特定 SSL 连接器的映射。

 

map

socketConnectors (security)

包含每个端口号特定 HTTP 连接器的映射。使用与 sslSocketConnectors 相同的原则。

 

map

httpClientMinThreads (producer)

设置 HttpClient 线程池中最少的线程数量的值。请注意,必须同时配置最小和最大大小。

 

整数

httpClientMaxThreads (producer)

设置 HttpClient 线程池中最大线程数的值。请注意,必须同时配置最小和最大大小。

 

整数

minThreads (consumer)

设置服务器线程池中最少的线程数量的值。请注意,必须同时配置最小和最大大小。

 

整数

maxThreads (consumer)

设置服务器线程池中最大线程数的值。请注意,必须同时配置最小和最大大小。

 

整数

threadPool (consumer)

为服务器使用自定义线程池。这个选项只应在特殊情况下使用。

 

ThreadPool

enableJmx (common)

如果这个选项为 true,将为此端点启用 Jetty JMX 支持。

false

布尔值

jettyHttpBinding (advanced)

要使用自定义 org.apache.camel.component.jettyHttpBinding,用于自定义应该为制作者编写响应的方式。

 

JettyHttpBinding

httpBinding (advanced)

不要使用 JettyHttpBinding。

 

HttpBinding

httpConfiguration (advanced)

Jetty 组件不使用 HttpConfiguration。

 

HttpConfiguration

mbContainer (advanced)

如果使用现有配置的 org.eclipse.jetty.jmx.MBeanContainer (如果为 Jetty 用来注册 mbeans)的 JMX,则使用现有的 org.eclipse.jetty.jmx.MBeanContainer。

 

MBeanContainer

sslSocketConnector Properties (安全)

包含常规 SSL 连接器属性的映射。

 

map

套接字连接属性( 安全性)

包含常规 HTTP 连接器属性的映射。使用与 sslSocketConnectorProperties 相同的原则。

 

map

continuationTimeout (consumer)

在使用 Jetty 作为使用者(server)时,允许在 millis 中设置超时。默认情况下,Jetty 使用 30000。您可以使用 = 0 来永不过期。如果发生超时,则请求将过期,并且 Jetty 将返回 http 错误 503 到客户端。只有在将 Jetty 与 Asynchronous Routing Engine 搭配使用时,才使用这个选项。

30000

Long

useContinuation (consumer)

是否将 Jetty continuations 用于 Jetty 服务器。

true

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数

false

布尔值

responseBufferSize (common)

允许在 Jetty 连接器上配置响应缓冲区大小的自定义值。

 

整数

requestBufferSize (common)

允许在 Jetty 连接器上配置请求缓冲区大小的自定义值。

 

整数

requestHeaderSize (common)

允许在 Jetty 连接器上配置请求标头大小的自定义值。

 

整数

responseHeaderSize (common)

允许在 Jetty 连接器上配置响应标头大小的自定义值。

 

整数

proxyHost (proxy)

使用 http 代理配置主机名。

 

字符串

proxyPort (proxy)

使用 http 代理配置端口号。

 

整数

useXForwardedFor Header (common)

使用 HttpServletRequest.getRemoteAddr 中的 X-Forwarded-For 标头。

false

布尔值

sendServerVersion (consumer)

如果 选项为 true,则 jetty 服务器会将日期标头发送到发送请求的客户端。请注意,请确保没有其他任何 camel-jetty 端点共享相同的端口,否则这个选项可能无法正常工作。

true

布尔值

allowJavaSerialized Object (advanced)

请求使用 context-type=application/x-java-serialized-object 时,是否允许 java serialization。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Jetty 9 端点使用 URI 语法配置:

jetty:httpUri

使用以下路径和查询参数:

174.2.1. 路径名(1 参数):

名称描述默认类型

httpUri

需要 要调用的 HTTP 端点的 url。

 

URI

174.2.2. 查询参数(54 参数):

名称描述默认类型

chunked (common)

如果这个选项为 false,则 Servlet 将禁用 HTTP 流并在响应上设置内容长度的标头

true

布尔值

disableStreamCache (common)

确定 Servlet 的原始输入流是否已缓存(Camel 将读取流到文件,流缓存)缓存。默认情况下,Camel 会缓存 Servlet 输入流,以支持多次读取它,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。DefaultHttpBinding 会将请求输入流复制到流缓存中,如果这个选项为 false,则会将其放入消息正文,以便支持多次读取流。如果使用 Servlet 桥接/代理端点,请考虑启用这个选项来提高性能,如果不需要多次读取消息有效负载。http/http4 producer 默认将缓存响应正文流。如果将此选项设置为 true,则生产者不会缓存响应正文流,而是使用响应流,作为消息正文。

false

布尔值

enableMultipartFilter (common)

是否启用 Jetty org.eclipse.jetty.servlets.MultiPartFilter。在桥接端点时,您应该将此值设置为 false,以确保多部分请求代理/桥接。

false

布尔值

headerFilterStrategy (common)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

transferException (common)

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。在制作者端,异常会按原样进行反序列化和丢弃,而不是 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

httpBinding (common)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

HttpBinding

async (consumer)

将消费者配置为以同步模式工作

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

continuationTimeout (consumer)

在使用 Jetty 作为使用者(server)时,允许在 millis 中设置超时。默认情况下,Jetty 使用 30000。您可以使用 = 0 来永不过期。如果发生超时,则请求将过期,并且 Jetty 将返回 http 错误 503 到客户端。只有在将 Jetty 与 Asynchronous Routing Engine 搭配使用时,才使用这个选项。

30000

Long

enableCORS (consumer)

如果 选项为 true,则 Jetty 服务器将设置 CrossOriginFilter,它支持 CORS out 状态。

false

布尔值

enableJmx (consumer)

如果这个选项为 true,将为此端点启用 Jetty JMX 支持。详情请查看 Jetty JMX 支持。

false

布尔值

httpMethodRestrict (consumer)

仅用于允许消耗 HttpMethod 匹配,如 GET/POST/PUT 等。可以使用逗号分隔多个方法。

 

字符串

matchOnUriPrefix (consumer)

如果找不到完全匹配,则使用者是否应该尝试通过匹配 URI 前缀来查找目标使用者。

false

布尔值

responseBufferSize (consumer)

使用 javax.servlet.ServletResponse 的自定义缓冲区大小。

 

整数

sendDateHeader (consumer)

如果 选项为 true,则 jetty 服务器会将日期标头发送到发送请求的客户端。请注意,请确保没有其他任何 camel-jetty 端点共享相同的端口,否则这个选项可能无法正常工作。

false

布尔值

sendServerVersion (consumer)

如果 选项为 true,那么 jetty 会将带有 jetty 版本信息的服务器标头发送到发送该请求的客户端。请注意,请确保没有其他任何 camel-jetty 端点共享相同的端口,否则这个选项可能无法正常工作。

true

布尔值

sessionSupport (consumer)

指定是否在 Jetty 的服务器端启用会话管理器。

false

布尔值

useContinuation (consumer)

是否将 Jetty continuations 用于 Jetty 服务器。

 

布尔值

eagerCheckContentAvailable (consumer)

是否预先检查 HTTP 请求是否有内容(如果 content-length 标头为 0 )是否有内容。这可在问题单中打开 HTTP 客户端不会发送流化数据。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

filterInitParameters (consumer)

配置过滤器 init 参数。在启动 jetty 服务器前,这些参数将应用到过滤器列表。

 

map

filtersRef (consumer)

允许使用放入列表的自定义过滤器,并可在 registry 中找到。可以使用逗号分隔多个值。

 

字符串

处理程序 (使用者)

指定在 registry 中查询的以逗号分隔的 Handler 实例集合。这些处理程序添加到 Jetty servlet 上下文(例如,为了提高安全性)。重要: 您不能使用相同的端口号将不同的处理程序用于不同的 Jetty 端点。处理程序与端口号关联。如果您需要不同的处理程序,则使用不同的端口号。

 

字符串

httpBindingRef (consumer)

弃用了 选项,在远程服务器中的失败响应时禁用引发 HttpOperationFailedException。这可让您获得所有响应,无论 HTTP 状态代码如何。

 

字符串

multipartFilter (consumer)

允许使用自定义多部分过滤器。注:设置 multipartFilterRef 会强制将 enableMultipartFilter 的值改为 true。

 

Filter

multipartFilterRef (consumer)

弃用了 Allows 使用自定义 multipart 过滤器。注:设置 multipartFilterRef 会强制将 enableMultipartFilter 的值改为 true。

 

字符串

optionsEnabled (consumer)

指定是否为这个 Servlet consumer 启用 HTTP OPTIONS。默认情况下,OPTIONS 会被关闭。

false

布尔值

traceEnabled (consumer)

指定是否为这个 Servlet consumer 启用 HTTP TRACE。默认关闭 TRACE。

false

布尔值

bridgeEndpoint (producer)

如果 选项为 true,HttpProducer 将忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 请求。您也可以将选项 throwExceptionOnFailure 设为 false,使 HttpProducer 发送所有故障响应。

false

布尔值

connectionClose (producer)

指定是否需要将 Connection Close 标头添加到 HTTP Request 中。默认情况下 connectionClose 为 false。

false

布尔值

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

copyHeaders (producer)

如果这个选项为 true,则根据复制策略将 IN Exchange 标头复制到 OUT Exchange 标头。将其设置为 false,仅允许包括 HTTP 响应中的标头(不会传播 IN 标头)。

true

布尔值

httpClientMaxThreads (producer)

设置 HttpClient 线程池中最大线程数的值。此设置覆盖组件级别上配置的任何设置。请注意,必须同时配置最小和最大大小。如果没有将其设置为 Jettys 线程池中使用的最大 254 个线程。

254

整数

httpClientMinThreads (producer)

设置 HttpClient 线程池中最少的线程数量的值。此设置覆盖组件级别上配置的任何设置。请注意,必须同时配置最小和最大大小。如果没有将其设置为 Jettys 线程池中使用的最小 8 个线程。

8

整数

httpMethod (producer)

配置要使用的 HTTP 方法。如果设置,HttpMethod 标头无法覆盖这个选项。

 

HttpMethods

ignoreResponseBody (producer)

如果这个选项为 true,则 http producer 不会读取响应正文并缓存输入流

false

布尔值

preserveHostHeader (producer)

如果选项为 true,HttpProducer 会将 Host 标头设置为当前交换主机标头中包含的值,对于您希望下游服务器收到的主机标头,可以使用 Host 标头为代理应用程序生成准确的 URL。

false

布尔值

throwExceptionOnFailure (producer)

禁用丢弃 HttpOperationFailedException 的选项(如果来自远程服务器的响应失败)。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

httpClient (producer)

设置共享 HttpClient,以用于此端点创建的所有生产者。默认情况下,每一制作者将使用新的 http 客户端,而不共享。重要信息:确保处理共享客户端的生命周期,如停止客户端(如果不再使用客户端)。Camel 将在客户端上调用 start 方法,以确保此端点创建制作者时启动它。这个选项只应在特殊情况下使用。

 

HttpClient

httpClientParameters (producer)

配置 Jetty 的 HttpClient.例如,设置 httpClient.idleTimeout=30000 会将闲置超时设置为 30 秒。如果长时间运行请求/响应调用,httpClient.timeout=30000 会将请求超时设置为 30 秒。

 

map

jettyBinding (producer)

使用自定义 JettyHttpBinding,用于自定义如何为制作者编写响应。

 

JettyHttpBinding

jettyBindingRef (producer)

弃用了 To using custom JettyHttpBinding,用于自定义如何为制作者编写响应的方式。

 

字符串

okStatusCodeRange (producer)

被视为成功响应的状态代码。值包括:可以定义多个范围,以逗号分隔,例如 200-204,209,301-304。每个范围必须是单个数字,或使用包括横线的短划线。

200-299

字符串

urlRewrite (producer)

弃用了 自定义的 org.apache.camel.component.http.UrlRewrite,它允许您在网桥/proxy 端点时重写 url。更多信息请参阅 http://camel.apache.org/urlrewrite.html

 

UrlRewrite

mapHttpMessageBody (advanced)

如果此选项正确,则交换正文将映射到 HTTP 正文。将其设置为 false 将避免 HTTP 映射。

true

布尔值

mapHttpMessageFormUrl EncodedBody (advanced)

如果这个选项为 true,则交换的 IN Exchange Form Encode 正文将映射到 HTTP。将其设置为 false 可以避免 HTTP Form Encoded body 映射。

true

布尔值

mapHttpMessageHeaders (advanced)

如果此选项为 true,则交换的 IN Exchange Headers 将映射到 HTTP 标头。将其设置为 false 将避免 HTTP 标头映射。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

proxyAuthScheme (proxy)

要使用的代理身份验证方案

 

字符串

proxyHost (proxy)

要使用的代理主机名

 

字符串

proxyPort (proxy)

要使用的代理端口

 

int

authHost (security)

要用于 NTML 的身份验证主机

 

字符串

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

174.3. Spring Boot Auto-Configuration

组件支持 34 个选项,它们如下所列。

名称描述默认类型

camel.component.jetty.allow-java-serialized-object

请求使用 context-type=application/x-java-serialized-object 时,是否允许 java serialization。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

camel.component.jetty.continuation-timeout

在使用 Jetty 作为使用者(server)时,允许在 millis 中设置超时。默认情况下,Jetty 使用 30000。您可以使用 = 0 来永不过期。如果发生超时,则请求将过期,并且 Jetty 将返回 http 错误 503 到客户端。只有在将 Jetty 与 Asynchronous Routing Engine 搭配使用时,才使用这个选项。

30000

Long

camel.component.jetty.enable-jmx

如果这个选项为 true,将为此端点启用 Jetty JMX 支持。

false

布尔值

camel.component.jetty.enabled

启用 jetty 组件

true

布尔值

camel.component.jetty.error-handler

这个选项用于设置 Jetty 服务器使用的 ErrorHandler。选项是一个 org.eclipse.jetty.server.handler.ErrorHandler 类型。

 

字符串

camel.component.jetty.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.jetty.http-binding

不要使用 JettyHttpBinding。选项是一个 org.apache.camel.http.common.HttpBinding 类型。

 

字符串

camel.component.jetty.http-client-max-threads

设置 HttpClient 线程池中最大线程数的值。请注意,必须同时配置最小和最大大小。

 

整数

camel.component.jetty.http-client-min-threads

设置 HttpClient 线程池中最少的线程数量的值。请注意,必须同时配置最小和最大大小。

 

整数

camel.component.jetty.http-configuration

Jetty 组件不使用 HttpConfiguration。选项是一个 org.apache.camel.http.common.HttpConfiguration 类型。

 

字符串

camel.component.jetty.jetty-http-binding

要使用自定义 org.apache.camel.component.jettyHttpBinding,用于自定义应该为制作者编写响应的方式。选项是一个 org.apache.camel.component.jetty.JettyHttpBinding 类型。

 

字符串

camel.component.jetty.keystore

指定 Java 密钥存储文件的位置,在 key 条目中包含 Jetty 服务器自己的 X.509 证书。

 

字符串

camel.component.jetty.max-threads

设置服务器线程池中最大线程数的值。请注意,必须同时配置最小和最大大小。

 

整数

camel.component.jetty.mb-container

如果使用现有配置的 org.eclipse.jetty.jmx.MBeanContainer (如果为 Jetty 用来注册 mbeans)的 JMX,则使用现有的 org.eclipse.jetty.jmx.MBeanContainer。选项是一个 org.eclipse.jetty.jmx.MBeanContainer 类型。

 

字符串

camel.component.jetty.min-threads

设置服务器线程池中最少的线程数量的值。请注意,必须同时配置最小和最大大小。

 

整数

camel.component.jetty.proxy-host

使用 http 代理配置主机名。

 

字符串

camel.component.jetty.proxy-port

使用 http 代理配置端口号。

 

整数

camel.component.jetty.request-buffer-size

允许在 Jetty 连接器上配置请求缓冲区大小的自定义值。

 

整数

camel.component.jetty.request-header-size

允许在 Jetty 连接器上配置请求标头大小的自定义值。

 

整数

camel.component.jetty.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.jetty.response-buffer-size

允许在 Jetty 连接器上配置响应缓冲区大小的自定义值。

 

整数

camel.component.jetty.response-header-size

允许在 Jetty 连接器上配置响应标头大小的自定义值。

 

整数

camel.component.jetty.send-server-version

如果 选项为 true,则 jetty 服务器会将日期标头发送到发送请求的客户端。请注意,请确保没有其他任何 camel-jetty 端点共享相同的端口,否则这个选项可能无法正常工作。

true

布尔值

camel.component.jetty.socket-connector-properties

包含常规 HTTP 连接器属性的映射。使用与 sslSocketConnectorProperties 相同的原则。选项是一个 java.util.Map<java.lang.String,java.lang.Object> type。

 

字符串

camel.component.jetty.socket-connectors

包含每个端口号特定 HTTP 连接器的映射。使用与 sslSocketConnectors 相同的原则。选项是一个 java.util.Map<java.lang.Integer,org.eclipse.jetty.server.Connector> 类型。

 

字符串

camel.component.jetty.ssl-context-parameters

使用 SSLContextParameters 配置安全性。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.jetty.ssl-key-password

密钥密码,用于访问密钥存储中的密钥条目(这是提供给密钥存储命令的 -keypass 选项)的密码。

 

字符串

camel.component.jetty.ssl-password

ssl 密码,需要访问密钥存储文件(这是提供给密钥存储命令的 -storepass 选项)的密码。

 

字符串

camel.component.jetty.ssl-socket-connector-properties

包含常规 SSL 连接器属性的映射。选项是一个 java.util.Map<java.lang.String,java.lang.Object> type。

 

字符串

camel.component.jetty.ssl-socket-connectors

包含每个端口号特定 SSL 连接器的映射。选项是一个 java.util.Map<java.lang.Integer,org.eclipse.jetty.server.Connector> 类型。

 

字符串

camel.component.jetty.thread-pool

为服务器使用自定义线程池。这个选项只应在特殊情况下使用。选项是一个 org.eclipse.jetty.util.thread.ThreadPool 类型。

 

字符串

camel.component.jetty.use-continuation

是否将 Jetty continuations 用于 Jetty 服务器。

true

布尔值

camel.component.jetty.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数

false

布尔值

camel.component.jetty.use-x-forwarded-for-header

使用 HttpServletRequest.getRemoteAddr 中的 X-Forwarded-For 标头。

false

布尔值

174.4. 消息标头

Camel 使用与 HTTP 组件相同的消息标头。在 Camel 2.2 中,它还使用(Exchange.HTTP_CHUNKED,CamelHttpChunked)标头打开或关闭 camel-jetty consumer 上的 chuched 编码。

Camel 还填充 所有 request.parameter 和 request.headers。例如,如果客户端请求带有 URL http://myserver/myserver?orderid=123,交换将包含名为 orderid 的标头,其值为 123。

从 Camel 2.2.0 开始,您可以从消息标头中获得 request.parameter,不仅可从 Get Method 获取,还可以获取其他 HTTP 方法。

174.5. 使用

Jetty 组件支持使用者和制作者端点。生成其他 HTTP 端点的另一个选项是使用 HTTP 组件

174.6. producer 示例

警告

制作者已弃用 - 不使用。我们建议使用 jetty 作为使用者(如来自 jetty)

以下是如何将 HTTP 请求发送到现有 HTTP 端点的基本示例。

在 Java DSL 中

from("direct:start")
  .to("jetty://http://www.google.com");

或在 Spring XML 中

<route>
    <from uri="direct:start"/>
    <to uri="jetty://http://www.google.com"/>
<route>

174.7. 消费者示例

在本例中,我们定义了一个在 http://localhost:8080/myapp/myservice 中公开 HTTP 服务的路由:

localhost 的使用情况

当您在 URL 中指定 localhost 时,Camel 只在本地 TCP/IP 网络接口上公开端点,因此无法从其操作的机器外部访问该端点。

如果您需要在特定网络接口上公开 Jetty 端点,则该接口的数字 IP 地址应用作主机。如果您需要在所有网络接口上公开 Jetty 端点,则应使用 0.0.0.0 地址。

要侦听整个 URI 前缀,请参阅 如何让 Jetty 匹配通配符

如果您实际上想要通过 HTTP 公开路由,并且已经具有 Servlet,则应引用 Servlet 传输

我们的业务逻辑在 MyBookService 类中实施,后者访问 HTTP 请求内容,然后返回响应。
注意: assert 调用会出现在此例中,因为代码是单元测试的一部分。

以下示例显示了一个基于内容的路由,该路由将含有 URI 参数的所有请求路由到端点、mock: one 及其他所有请求以模拟 :other

因此,如果客户端发送 HTTP 请求 http://serverUri?one=hello,Jetty 组件将复制 HTTP 请求参数,一个用于 交换的 in.header。然后,我们可以使用 简单 语言将包含此标头的交换路由到特定的端点,并将所有其他内容路由到另一个端点。如果我们使用了比 简单 (如 OGNL)更强大的语言,我们也可以对参数值进行测试,并根据标头值进行路由。

174.8. 会话支持

会话支持选项 sessionSupport 可以用来启用 HttpSession 对象并在处理交换时访问会话对象。例如,以下路由启用会话:

<route>
    <from uri="jetty:http://0.0.0.0/myapp/myservice/?sessionSupport=true"/>
    <processRef ref="myCode"/>
<route>

myCode 处理器可以通过 Spring bean 元素实例化:

<bean id="myCode"class="com.mycompany.MyCodeProcessor"/>

处理器实施可以通过以下方式访问 HttpSession

public void process(Exchange exchange) throws Exception {
    HttpSession session = exchange.getIn(HttpMessage.class).getRequest().getSession();
    ...
}

174.9. SSL 支持(HTTPS)

使用 JSSE 配置实用程序

从 Camel 2.8 开始,Jetty 组件通过 Camel JSSE 配置实用程序 支持 SSL/TLS 配置。  这个实用程序可大大减少您需要编写的组件特定代码的数量,并在端点和组件级别进行配置。  以下示例演示了如何将 实用程序与 Jetty 组件搭配使用。

组件的程序配置

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);

JettyComponent jettyComponent = getContext().getComponent("jetty", JettyComponent.class);
jettyComponent.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="jetty:https://127.0.0.1/mail/?sslContextParameters=#sslContextParameters"/>
...

配置 Jetty Directly

Jetty 提供 SSL 支持开箱即用。要启用 Jetty 以 SSL 模式运行,只需将 URI 格式化为 https:// 前缀--例如:

<from uri="jetty:https://0.0.0.0/myapp/myservice/"/>

Jetty 还需要了解从何处加载您的密钥存储以及要使用哪些密码才能加载正确的 SSL 证书。设置以下 JVM 系统属性:

直至 Camel 2.2

  • jetty.ssl.keystore 指定 Java 密钥存储文件的位置,该文件在 键条目 中包含 Jetty 服务器自己的 X.509 证书。密钥条目存储 X.509 证书(有效地、公钥)及其关联的私钥。
  • jetty.ssl.password,存储密码才能访问密钥存储文件(这是提供给 密钥存储 命令的 -storepass 选项的密码)。
  • jetty.ssl.keypassword,密钥密码用于访问密钥存储中的证书密钥条目(这是提供给 密钥存储 命令的 -keypass 选项时所用的密码)。

从 Camel 2.3 开始

  • org.eclipse.jetty.ssl.keystore 指定 Java 密钥存储文件的位置,该文件在 密钥条目 中包含 Jetty 服务器自己的 X.509 证书。密钥条目存储 X.509 证书(有效地、公钥)及其关联的私钥。
  • org.eclipse.jetty.ssl.password,该存储密码需要访问密钥存储文件(这是提供给 密钥存储 命令的 -storepass 选项时所用的密码)。
  • org.eclipse.jetty.ssl.keypassword,密钥密码用于访问密钥存储中的证书密钥条目(这是提供给 密钥存储 命令的 -keypass 选项)的密码。

有关如何在 Jetty 端点上配置 SSL 的详情,请阅读 Jetty Site 的以下文档 :http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

Camel 不直接公开某些 SSL 属性,但 Camel 确实公开底层 SslSocketConnector,这将允许您设置属性,例如:需要客户端证书或想要ClientAuth 进行相互验证,而客户端不需要证书但可以有证书。各种 Camel 版本之间存在一些差异:

最多 Camel 2.2

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectors">
        <map>
            <entry key="8043">
                <bean class="org.mortbay.jetty.security.SslSocketConnector">
                    <property name="password"value="..."/>
                    <property name="keyPassword"value="..."/>
                    <property name="keystore"value="..."/>
                    <property name="needClientAuth"value="..."/>
                    <property name="truststore"value="..."/>
                </bean>
            </entry>
        </map>
    </property>
</bean>

Camel 2.3, 2.4

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectors">
        <map>
            <entry key="8043">
                <bean class="org.eclipse.jetty.server.ssl.SslSocketConnector">
                    <property name="password"value="..."/>
                    <property name="keyPassword"value="..."/>
                    <property name="keystore"value="..."/>
                    <property name="needClientAuth"value="..."/>
                    <property name="truststore"value="..."/>
                </bean>
            </entry>
        </map>
    </property>
</bean>

*来自 Camel 2.5,我们切换为使用 SslSelectChannelConnector *

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectors">
        <map>
            <entry key="8043">
                <bean class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
                    <property name="password"value="..."/>
                    <property name="keyPassword"value="..."/>
                    <property name="keystore"value="..."/>
                    <property name="needClientAuth"value="..."/>
                    <property name="truststore"value="..."/>
                </bean>
            </entry>
        </map>
    </property>
</bean>

作为上述映射中的键使用的值是您配置 Jetty 要侦听的端口。

174.9.1. 在 IBM Java 中使用 TLS 安全性配置 camel-jetty9

camel-jetty9 组件中的默认 TLS 安全设置与 IBM Java 虚拟机不兼容。IBM Java 中的所有密码都以 前缀 SSL_* 开头,甚至是 TLS 协议从 SSL_* 开始的密码。Camel-jetty9 仅支持 RFC Cipher Suite 名称,且所有 SSL_* 密码 都不受保护,且将被排除。Jetty 排除所有 SSL_* 密码,因此没有可用于 TLS 1.2 和连接失败的密码。因为无法更改 Jetty 的 ssl 上下文的行为,只有临时解决方案是覆盖 Jetty9 组件上的默认 TLS 安全配置。为达成此目标,请在 Application.java 文件中的"sslContextParameters ()"末尾添加以下代码。

FilterParameters fp = new FilterParameters();
    fp.getInclude().add(".*");

    // Exclude weak / insecure ciphers
    fp.getExclude().add("^.*_(MD5|SHA|SHA1)$");
    // Exclude ciphers that don't support forward secrecy
    fp.getExclude().add("^TLS_RSA_.*$");
    // The following exclusions are present to cleanup known bad cipher
    // suites that may be accidentally included via include patterns.
    // The default enabled cipher list in Java will not include these
    // (but they are available in the supported list).
    /* SSL_ ciphers are not excluded
    fp.getExclude().add("^SSL_.*$"); */
    fp.getExclude().add("^.NULL.$");
    fp.getExclude().add("^.anon.$");

    p.setCipherSuitesFilter(fp);

此代码覆盖 Jetty 中定义的排除密码,方法是移除所有 SSL_* 密码的排除。

174.9.2. 配置常规 SSL 属性

可作为 Camel 2.5 提供

现在,您可以为所有 SSL 套接字连接器配置常规属性,而不是按端口号特定 SSL 套接字连接器(不明确配置端口号为条目)。

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectorProperties">
        <map>
            <entry key="password"value="..."/>
            <entry key="keyPassword"value="..."/>
            <entry key="keystore"value="..."/>
            <entry key="needClientAuth"value="..."/>
            <entry key="truststore"value="..."/>
        </map>
    </property>
</bean>

174.9.3. 如何获取对 X509Certificate 的参考

Jetty 在 HttpServletRequest 中存储对证书的引用,您可以按照以下方法从代码访问:

HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
X509Certificate cert = (X509Certificate) req.getAttribute("javax.servlet.request.X509Certificate")

174.9.4. 配置常规 HTTP 属性

可作为 Camel 2.5 提供

现在,您可以为所有 HTTP 套接字连接器配置常规属性,而不是按端口号特定 HTTP 套接字连接器(不明确配置端口号为条目)。

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="socketConnectorProperties">
        <map>
            <entry key="acceptors" value="4"/>
            <entry key="maxIdleTime" value="300000"/>
        </map>
    </property>
</bean>

174.9.5. Obtaining X-Forwarded-For header with HttpServletRequest.getRemoteAddr()

如果 HTTP 请求由 Apache 服务器处理,并转发到带有 mod_proxy 的 jetty,则原始客户端 IP 地址位于 X-Forwarded-For 标头中,HttpServletRequest.getRemoteAddr ()将返回 Apache 代理的地址。

Jetty 具有 forward 属性,它取来自 X-Forwarded-For 的值,并将其放置在 HttpServletRequest remoteAddr 属性中。  此属性不能通过端点配置直接可用,但可以使用 socketConnectors 属性轻松添加:

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="socketConnectors">
        <map>
            <entry key="8080">
                <bean class="org.eclipse.jetty.server.nio.SelectChannelConnector">
                    <property name="forwarded" value="true"/>
                </bean>
            </entry>
        </map>
    </property>
</bean>

这在现有 Apache 服务器处理域的 TLS 连接并将其在内部代理到应用程序服务器时特别有用。

174.10. 返回 HTTP 状态代码的默认行为

HTTP 状态代码的默认行为由 org.apache.camel.component.http.DefaultHttpBinding 类定义,该类处理如何编写响应以及设置 HTTP 状态代码。

如果交换被成功处理,则返回 200 HTTP 状态代码。
如果交换失败,则会返回 500 HTTP 状态代码,并且堆栈trace 在正文中返回。如果要指定要返回哪个 HTTP 状态代码,请在 OUT 消息的 Exchange.HTTP_RESPONSE_CODE 标头中设置代码。

174.11. Customizing HttpBinding

默认情况下,Camel 使用 org.apache.camel.component.http.DefaultHttpBinding 处理编写响应的方式。如果您愿意,您可以通过实现自己的 HttpBinding 类或扩展 DefaultHttpBinding 并覆盖适当的方法来自定义此行为。

以下示例演示了如何自定义 DefaultHttpBinding,以更改返回异常的方式:

然后,我们可以创建一个绑定实例,并将其注册到 Spring registry 中,如下所示:

<bean id="mybinding"class="com.mycompany.MyHttpBinding"/>

然后,在定义路由时可以引用此绑定:

<route>
  <from uri="jetty:http://0.0.0.0:8080/myapp/myservice?httpBindingRef=mybinding"/>
  <to uri="bean:doSomething"/>
</route>

174.12. Jetty 处理程序和安全配置

您可以在端点上配置 Jetty 处理程序列表,这对于启用高级 Jetty 安全功能非常有用。这些处理程序在 Spring XML 中配置,如下所示:

<-- Jetty Security handling -->
<bean id="userRealm" class="org.mortbay.jetty.plus.jaas.JAASUserRealm">
    <property name="name" value="tracker-users"/>
    <property name="loginModuleName" value="ldaploginmodule"/>
</bean>

<bean id="constraint" class="org.mortbay.jetty.security.Constraint">
    <property name="name" value="BASIC"/>
    <property name="roles" value="tracker-users"/>
    <property name="authenticate" value="true"/>
</bean>

<bean id="constraintMapping" class="org.mortbay.jetty.security.ConstraintMapping">
    <property name="constraint" ref="constraint"/>
    <property name="pathSpec" value="/*"/>
</bean>

<bean id="securityHandler" class="org.mortbay.jetty.security.SecurityHandler">
    <property name="userRealm" ref="userRealm"/>
    <property name="constraintMappings" ref="constraintMapping"/>
</bean>

通过从 Camel 2.3 开始,您可以配置 Jetty 处理程序列表,如下所示:

<-- Jetty Security handling -->
<bean id="constraint" class="org.eclipse.jetty.http.security.Constraint">
    <property name="name" value="BASIC"/>
    <property name="roles" value="tracker-users"/>
    <property name="authenticate" value="true"/>
</bean>

<bean id="constraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
    <property name="constraint" ref="constraint"/>
    <property name="pathSpec" value="/*"/>
</bean>

<bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
    <property name="authenticator">
        <bean class="org.eclipse.jetty.security.authentication.BasicAuthenticator"/>
    </property>
    <property name="constraintMappings">
        <list>
            <ref bean="constraintMapping"/>
        </list>
    </property>
</bean>

然后,您可以将端点定义为:

from("jetty:http://0.0.0.0:9080/myservice?handlers=securityHandler")

如果需要更多处理程序,请设置与以逗号分隔的 bean ID 列表相等的 handlers 选项。

174.13. 如何返回自定义 HTTP 500 回复消息

您可能需要在出现问题时返回自定义回复消息,而不是默认回复消息 Camel Jetty 回复:
您可以使用自定义 HttpBinding 来控制消息映射,但通常使用 Camel 的 Exception Clause 来构造自定义回复消息。例如,如此处所示,我们 返回了 HTTP 错误代码 500 错误代码 500 时出错:

174.14. 多部分表单支持

从 Camel 2.3.0, camel-jetty 支持到多部分形式发布箱。提交的 form-data 映射到邮件标头中。Camel-jetty 为每个上传的文件创建一个附件。文件名映射到附加的名称。内容类型设置为附加文件名的内容类型。您可以在此处找到示例。

注: getName ()函数,如版本 2.5 及更高版本中所示。在早期版本中,您接收连接的临时文件名称

174.15. Jetty JMX 支持

从 Camel 2.3.0,Clal-jetty 支持在组件和端点级别启用 Jetty 的 JMX 功能,并带有优先级端点配置。请注意,在 Camel 上下文内必须启用 JMX,以便在这个组件提供 Jetty 支持时,该组件提供对使用 Camel 上下文注册的 MBeanServer 的引用。因为 camel-jetty 组件缓存并重复使用给定协议/主机/端口对的 Jetty 资源,因此仅在创建第一个端点时评估该配置选项以使用协议/主机/端口对。例如,给定从以下 XML 片段创建的两个路由,JMX 支持将保持为侦听 "https://0.0.0.0" 的所有端点启用的。

<from uri="jetty:https://0.0.0.0/myapp/myservice1/?enableJmx=true"/>
<from uri="jetty:https://0.0.0.0/myapp/myservice2/?enableJmx=false"/>

camel-jetty 组件还提供 Jetty MBeanContainer 直接配置。Jetty 动态创建 MBean 名称。如果您在 Camel 上下文之外运行另一个 Jetty 实例,并在实例间共享相同的 MBeanServer,则可以为两个实例提供同一 MBeanContainer 的引用,以避免注册 Jetty MBeans 时的名称冲突。

第 175 章 JGroups Component

作为 Camel 版本 2.13 可用

JGroups 是用于可靠多播通信的工具包。jgroups: 组件提供 Camel 基础架构和 JGroups 集群之间的消息交换。

Maven 用户需要将以下依赖项添加到其 pom.xml 中,以便该组件:

<dependency>
    <groupId>org.apache-extras.camel-extra</groupId>
    <artifactId>camel-jgroups</artifactId>
    <!-- use the same version as your Camel core version -->
    <version>x.y.z</version>
</dependency>

从 Camel 2.13.0 开始,JGroups 组件已从 Apache Camel umbrella 下的 Camel Extra 迁移。如果您使用的是 Camel 2.13.0 或更高版本,请改为使用以下 POM 条目。

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jgroups</artifactId>
    <!-- use the same version as your Camel core version -->
    <version>x.y.z</version>
</dependency>

175.1. URI 格式

jgroups:clusterName[?options]

其中 clusterName 代表组件应连接到的 JGroups 集群的名称。

175.2. 选项

JGroups 组件支持 4 个选项,它们如下所列。

名称描述默认类型

channel (common)

要使用的频道

 

JChannel

channelProperties (common)

指定端点使用的 JChannel 的配置属性。

 

字符串

enableViewMessages (consumer)

如果设为 true,使用者端点还会接收 org.jgroups.View 消息(不仅仅是 org.jgroups.Message 实例)。默认情况下,端点只消耗常规消息。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

JGroups 端点使用 URI 语法进行配置:

jgroups:clusterName

使用以下路径和查询参数:

175.2.1. 路径名(1 参数):

名称描述默认类型

clusterName

必需是组件应连接到的 JGroups 集群的名称。

 

字符串

175.2.2. 查询参数(6 参数):

名称描述默认类型

channelProperties (common)

指定端点使用的 JChannel 的配置属性。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

enableViewMessages (consumer)

如果设为 true,使用者端点还会接收 org.jgroups.View 消息(不仅仅是 org.jgroups.Message 实例)。默认情况下,端点只消耗常规消息。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

175.3. Spring Boot Auto-Configuration

组件支持 9 个选项,如下所示。

名称描述默认类型

camel.component.jgroups.channel

要使用的频道。选项是一个 org.jgroups.JChannel 类型。

 

字符串

camel.component.jgroups.channel-properties

指定端点使用的 JChannel 的配置属性。

 

字符串

camel.component.jgroups.enable-view-messages

如果设为 true,使用者端点还会接收 org.jgroups.View 消息(不仅仅是 org.jgroups.Message 实例)。默认情况下,端点只消耗常规消息。

false

布尔值

camel.component.jgroups.enabled

启用 jgroups 组件

true

布尔值

camel.component.jgroups.lock.cluster.service.enabled

如果 jgroups 锁定群集服务应启用或不应当启用,则设置默认值为 false。

false

布尔值

camel.component.jgroups.lock.cluster.service.id

Cluster Service ID

 

字符串

camel.component.jgroups.lock.cluster.service.jgroups-cluster-name

JGroups 集群名称

 

字符串

camel.component.jgroups.lock.cluster.service.jgroups-config

JGrups 配置文件名称

 

字符串

camel.component.jgroups.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

175.4. Headers

标头常数自版本开始描述

JGROUPS_ORIGINAL_MESSAGE

JGroupsEndpoint.HEADER_JGROUPS_ORIGINAL_MESSAGE

2.13.0

原始 org.jgroups.Message 实例,从中提取了已消耗的消息正文。

JGROUPS_SRC

`JGroupsEndpoint.`HEADER_JGROUPS_SRC

2.10.0

consumerorg.jgroups.Address 实例提取于被使用的消息的 org.jgroups.Message.getSrc ()方法。producer :自定义源 org.jgroups.Address 要发送的消息。

JGROUPS_DEST

`JGroupsEndpoint.`HEADER_JGROUPS_DEST

2.10.0

consumerorg.jgroups.Address 实例提取于被使用的消息的 org.jgroups.Message.getDest ()方法。producer :自定义目标 org.jgroups.Address 要发送的消息。

JGROUPS_CHANNEL_ADDRESS

`JGroupsEndpoint.`HEADER_JGROUPS_CHANNEL_ADDRESS

2.13.0

与端点关联的频道的地址(org.jgroups.Address)。

  # usage

路由使用者端使用 jgroups 组件将捕获与端点关联的 JChannel 接收的消息,并将其转发到 Camel 路由。JGroups 消费者 异步 处理传入的消息。

// Capture messages from cluster named
// 'clusterName' and send them to Camel route.
from("jgroups:clusterName").to("seda:queue");

在路由的制作者端使用 jgroups 组件将 Camel 交换的正文转发到端点管理的 JChannel 实例。

// Send message to the cluster named 'clusterName'
from("direct:start").to("jgroups:clusterName");

175.5. 预定义的过滤器

从 Camel 版本 2.13.0 开始,JGroups 组件附带预定义过滤器工厂类,名为 JGroupsFilters。

如果您希望仅使用发送到集群的通知更改通知(并忽略这些发送到"从"节点),请使用 JGroupsFilters.dropNonCoordinatorViews () 过滤器。当您希望单个 Camel 节点成为集群中的 master 时,此过滤器特别有用,因为传递此过滤器的消息会在指定节点成为协调集群时通知您。以下代码片段演示了如何仅收集 master 节点接收的消息。

import static org.apache.camel.component.jgroups.JGroupsFilters.dropNonCoordinatorViews;
...
from("jgroups:clusterName?enableViewMessages=true").
  filter(dropNonCoordinatorViews()).
  to("seda:masterNodeEventsQueue");

175.6. 预定义的表达式

从 Camel 版本 2.13.0 开始,JGroups 组件附带名为 JGroupsExpressions 的预定义表达式工厂。

如果您要创建仅在 Camel 上下文尚未启动时影响路由的延迟程序,请使用 JGroupsExpressions.delayIfContextNotStarted (长延迟) 工厂方法。只有 Camel 上下文处于不同于 启动 的状态时,此工厂方法创建的表达式才会返回给定延迟值。如果您希望使用 JGroups 组件在集群中保持单例(master)路由,则此表达式特别有用。如果 Camel 上下文尚未启动,则 控制总线 启动命令不会初始化单例路由。因此,您需要延迟 master 路由的启动,以确保在 Camel 上下文启动后已初始化它。由于这种情况只在初始化集群期间发生,所以我们不希望延迟从节点的启动成为新主设备 - 为什么我们需要一个条件延迟表达式。

以下代码片段演示了如何将条件延迟与 JGroups 组件一起使用,以延迟集群中 master 节点的初始启动。

import static java.util.concurrent.TimeUnit.SECONDS;
import static org.apache.camel.component.jgroups.JGroupsExpressions.delayIfContextNotStarted;
import static org.apache.camel.component.jgroups.JGroupsFilters.dropNonCoordinatorViews;
...
from("jgroups:clusterName?enableViewMessages=true").
  filter(dropNonCoordinatorViews()).
  threads().delay(delayIfContextNotStarted(SECONDS.toMillis(5))). // run in separated and delayed thread. Delay only if the context hasn't been started already.
  to("controlbus:route?routeId=masterRoute&action=start&async=true");

from("timer://master?repeatCount=1").routeId("masterRoute").autoStartup(false).to(masterMockUri); 

175.7. 例子

175.7.1. 将(收发)消息发送到 (来自)JGroups 集群

为了发送消息到 JGroups 集群使用制作者端点,就如下方代码片段中所示:

from("direct:start").to("jgroups:myCluster");
...
producerTemplate.sendBody("direct:start", "msg")

要接收来自上述代码片段的消息(在相同或其他物理机器上)侦听来自给定集群的消息,如下代码片段所示。

mockEndpoint.setExpectedMessageCount(1);
mockEndpoint.message(0).body().isEqualTo("msg");
...
from("jgroups:myCluster").to("mock:messagesFromTheCluster");
...
mockEndpoint.assertIsSatisfied();

175.7.2. 接收集群视图更改通知

以下片段演示了如何创建侦听集群成员资格更改的通知的使用者端点。默认情况下,端点只消耗常规消息。

mockEndpoint.setExpectedMessageCount(1);
mockEndpoint.message(0).body().isInstanceOf(org.jgroups.View.class);
...
from("jgroups:clusterName?enableViewMessages=true").to(mockEndpoint);
...
mockEndpoint.assertIsSatisfied();

175.7.3. 在集群内保留单例路由

以下代码片段演示了如何将单例使用者路由保留在 Camel 上下文的群集中。一旦 master 节点出现问题,其中一个从节点就被选为新的 master 并已启动。在这个特定示例中,我们希望使 singleton jetty 实例侦听地址的 http://localhost:8080/orders` 上的请求。

JGroupsLockClusterService service = new JGroupsLockClusterService();
service.setId("uniqueNodeId");
...
context.addService(service);

from("master:mycluster:jetty:http://localhost:8080/orders").to("jms:orders"); 

第 176 章 JiBX DataFormat

可作为 Camel 版本 2.6 提供。

JiBX 是一个数据格式,它使用 JiBX 库来回 对 XML 对象进行 marshal 和 unmarshal Java 对象。

// lets turn Object messages into XML then send to MQSeries
from("activemq:My.Queue").
  marshal().jibx().
  to("mqseries:Another.Queue");

请注意,marshaling 进程可以在运行时识别消息类型。但是,从 XML 中解封消息时,我们需要明确指定目标类。

// lets turn XML into PurchaseOrder message
from("mqseries:Another.Queue").
  unmarshal().jibx(PurchaseOrder.class).
  to("activemq:My.Queue");

176.1. 选项

JiBX 数据格式支持 3 个选项,它们如下所列。

名称默认Java 类型描述

unmarshallClass

 

字符串

从 XML 拉取到 Java 时使用的类名称。

bindingName

 

字符串

使用自定义绑定工厂

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

176.2. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.dataformat.jibx.binding-name

使用自定义绑定工厂

 

字符串

camel.dataformat.jibx.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.jibx.enabled

启用 jibx 数据格式

true

布尔值

camel.dataformat.jibx.unmarshall-class

从 XML 拉取到 Java 时使用的类名称。

 

字符串

ND

176.3. JiBX Spring DSL

Camel Spring DSL 也支持 JiBX 数据格式。

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">

  <!-- Define data formats -->
  <dataFormats>
    <jibx id="jibx" unmarshallClass="org.apache.camel.dataformat.jibx.PurchaseOrder"/>
  </dataFormats>

  <!-- Marshal message to XML -->
  <route>
    <from uri="direct:marshal"/>
    <marshal ref="jibx"/>
    <to uri="mock:result"/>
  </route>

  <!-- Unmarshal message from XML -->
  <route>
    <from uri="direct:unmarshal"/>
    <unmarshal ref="jibx"/>
    <to uri="mock:result"/>
  </route>

</camelContext>

176.4. 依赖项

要在 camel 路由中使用 JiBX,您需要添加实现此数据格式的 camel-jibx 依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-jibx</artifactId>
  <version>2.6.0</version>
</dependency>

第 177 章 Jing 组件

可作为 Camel 版本 1.1 提供

Jing 组件使用 Jing Library 对消息正文执行 XML 验证。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jing</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

请注意,MSV 组件还支持 RelaxNG XML 语法。

177.1. URI 格式 Camel 2.16

jing:someLocalOrRemoteResource

从 Camel 2.16 中,组件使用 jing 作为名称,您可以使用选项 compactSyntax 选项打开 RNG 或 RNC 模式。

177.2. 选项

Jing 组件没有选项。

Jing 端点使用 URI 语法配置:

jing:resourceUri

使用以下路径和查询参数:

177.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

对类路径上的本地资源或完整 URL (包含要进行验证的 schema)上的远程资源或完整 URL 所需的 URL。

 

字符串

177.2.2. 查询参数(2 参数):

名称描述默认类型

compactSyntax (producer)

是否使用 RelaxNG 紧凑语法进行验证。默认情况下,使用 RelaxNG XML 语法(rng) 和 true 使用 RelaxNG Compact 语法(rnc)是 false。

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

177.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.jing.enabled

启用 jing 组件

true

布尔值

camel.component.jing.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

177.4. 示例

以下示例演示了如何 配置来自端点 direct:start 的路由,然后进入两个端点之一,可基于 是否对 XML 匹配给定的 RelaxNG Compact 语法 模式(在类路径上提供)。

177.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 178 章 JIRA 组件(已弃用)

作为 Camel 版本 2.15 可用

JIRA 组件通过封装 Atlassian 的 REST Java 客户端与 JIRA 的 REST API 交互。它目前为新的问题和新注释提供轮询。 它还能够创建新问题。

此端点不通过 Webhook 依赖于简单的轮询功能。原因包括:

  • 可靠性/可靠性的关注
  • 我们轮询的有效负载类型通常不大(另外,API 中提供了分页)
  • 需要支持在某个地方无法公开运行的应用程序,如果 Webhook 发生故障

请注意, JIRA API 非常令人满意。 因此,此组件可轻松扩展以提供额外的交互。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jira</artifactId>
    <version>${camel-version}</version>
</dependency>

178.1. URI 格式

jira://endpoint[?options]

178.2. JIRA 选项

JIRA 组件没有选项。

JIRA 端点使用 URI 语法配置:

jira:type

使用以下路径和查询参数:

178.2.1. 路径名(1 参数):

名称描述默认类型

type

执行所需的操作,如创建新问题或新注释

 

JIRAType

178.2.2. 查询参数(9 参数):

名称描述默认类型

password (common)

用于登录的密码

 

字符串

serverUrl (common)

JIRA 服务器 所需的 URL

 

字符串

username (common)

用于登录的用户名

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

delay (consumer)

使用使用者查询 JIRA 时的延迟(以秒为单位)。

6000

int

jql (consumer)

JQL 是 JIRA 中的查询语言,允许您检索您想要的数据。例如,jql=project=MyProject where MyProject 是 JIRA 中的产品键。

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

178.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.jira.enabled

启用 jira 组件

true

布尔值

camel.component.jira.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

178.4. JQL:

JQL URI 选项供两个使用者端点使用。 理论上,如"项目键"等项目可以是 URI 选项本身。 但是,由于需要使用 JQL,消费者变得更灵活、功能更强。

至少,消费者需要以下内容:

jira://[endpoint]?[required options]&jql=project=[project key]

要注意的一点是,newIsue使用者会自动将"ORDER BY key desc"附加到您的 JQL。 为了优化启动处理,而不是对项目中的每一个问题进行索引。

另一个值得注意的是,新的Comment 消费者必须对项目中的每一个 问题和 注释进行索引。 因此, 对于 大型项目而言,尽可能优化 JQL 表达式非常重要。 例如,JIRA 工具包插件包括 "Number of comments" custom Field-youngeruse '"Number of comments" > 0'。另外,尝试根据状态最小化(status=Open),增加轮询延迟等。 例如:

jira://[endpoint]?[required options]&jql=RAW(project=[project key] AND status in (Open, \"Coding In Progress\") AND \"Number of comments\">0)"

第 179 章 JMS 组件

179.1. JMS 组件

提示

使用 ActiveMQ

如果您使用的是 Apache ActiveMQ,您应选择 ActiveMQ 组件,因为它针对 ActiveMQ 进行了优化。此页面上的所有选项和示例均对 ActiveMQ 组件也有效。

注意

转换和缓存

如果您在使用 JMS 事务时,请参见下面的事务和缓存级别,因为它可能会影响性能。

注意

对 JMS 的请求/续订

务必要阅读本节 Request-reply over JMS,以获得关于请求/回复的重要备注,因为 Camel 提供了多个选项,以便提高性能和集群环境。

此组件允许向(或从) JMS Queue 或 Topic 发送的消息。它使用 Spring 的 JMS 支持来声明性事务,包括 Spring 的 JmsTemplate 以用于发送和 MessageListenerContainer 进行消耗。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jms</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

179.2. URI 格式

jms:[queue:|topic:]destinationName[?options]

其中 destinationName 是 JMS 队列或主题名称。默认情况下,targetName 解释为队列名称。例如,要连接到队列,FOO.BAR 使用:

jms:FOO.BAR

如果需要,可以包括可选 queue: 前缀:

jms:queue:FOO.BAR

要连接到一个主题,您必须 包括 主题: 前缀。例如,要
连接到该主题的 Stocks.Prices,请使用:

jms:topic:Stocks.Prices

您可以使用以下格式 ?option=value& option=value&…​

179.3. 备注

179.3.1. 使用 ActiveMQ

JMS 组件重复使用 Spring 2 的 JmsTemplate 来发送消息。在非 J2EE 容器中,这不是理想的选择,通常需要 JMS 提供程序中的一些缓存来避免 性能不佳

如果要将 Apache ActiveMQ 用作您的消息代理,则建议您进行以下操作之一:

  • 使用 ActiveMQ 组件,该组件经过优化来高效地使用 ActiveMQ
  • 在 ActiveMQ 中使用 PoolingConnectionFactory

179.3.2. 事务和缓存级别

如果您使用消息并使用事务(transacted=true),缓存级别的默认设置可能会影响性能。

如果您使用 XA 事务,则无法缓存,因为它可能会导致 XA 事务无法正常工作。

如果您不使用 XA,您应该考虑缓存,因为它会提高性能,如设置 cacheLevelName=CACHE_CONSUMER

通过 Camel 2.7.x,cacheLevelName 的默认设置是 CACHE_CONSUMER。您需要明确设置 cacheLevelName=CACHE_NONE

在 Camel 2.8 上,cacheLevelName 的默认设置是 CACHE_AUTO。这个默认自动检测模式,并相应地设置缓存级别:

  • CACHE_CONSUMER if transacted=false
  • CACHE_NONE if transacted=true

因此,您可以说默认设置是保守。如果您正在使用非XA 事务,请考虑使用 cacheLevelName=CACHE_CONSUMER

179.3.3. durable 订阅

如果要使用 durable 主题订阅,则需要同时指定 clientIddurableSubscriptionNameclientId 的值必须是唯一的,且只能供整个网络中的单个 JMS 连接实例使用。您可能更愿意 使用虚拟主题 来避免此限制。此处为 持久消息传递的更多背景信息。

179.3.4. Message Header Mapping

在使用消息标头时,JMS 规范声明标头名称必须是有效的 Java 标识符。因此,尝试将您的标头命名为有效的 Java 标识符。这样做的一个优点是,您可以在 JMS Selector (其 SQL92 语法要求标头的 Java 标识符语法)中使用您的标头。

默认使用映射标头名称的简单策略。该策略是替换下方所示的标题名称中的任何点和连字符,并在标题名称恢复通过线路发送的 JMS 消息时进行反转。这意味着什么?不再丢失了在 bean 组件上调用的方法名称,不再会丢失文件组件的文件名标头,以此类推。

在 Camel 中接受标头名称的当前标头名称策略如下:

  • dots 被 DOT 替代,当 Camel 使用消息时会反向替换。
  • 连字符替换为 HYPHEN,当 Camel 使用消息时会反向替换

179.4. 选项

您可以配置 JMS 端点上的许多不同属性,它映射到 JMSConfiguration POJO 上的属性。

警告

映射到 Spring JMS

许多这些属性都映射到 Spring JMS 上的属性,Camel 用来发送和接收消息。因此,您可以通过咨询相关的 Spring 文档来获取有关这些属性的更多信息。

179.4.1. 组件选项

JMS 组件支持下面列出的 81 选项。

名称描述默认类型

配置 (高级)

使用共享的 JMS 配置

 

JmsConfiguration

acceptMessagesWhile Stopping (consumer)

指定使用者接受消息在停止时是否指定。如果您在运行时启动和停止 JMS 路由,则请考虑启用这个选项,同时队列上仍有消息 enqueued。如果这个选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试重定位,但再次再次可能被拒绝,最后消息可能会在 JMS 代理上的死信队列移动。为了避免这一建议启用这个选项。

false

布尔值

allowReplyManagerQuick Stop (consumer)

如果 JmsConfiguration#isAcceptMessagesWhileStopping 在启用 JmsConfiguration#isAcceptMessagesWhileStopping 时,并且 org.apache.camel.Camel.CamelContext 当前已经停止。常规 JMS 用户默认启用这一快速停止功能,但为了回复经理,您必须启用此标志。

false

布尔值

acknowledgementMode (consumer)

JMS 确认模式定义为 Integer。允许您将特定于供应商的扩展设置为确认模式。对于常规模式,最好使用 acknowledgementModeName。

 

int

eagerLoadingOf Properties (消费者)

在加载消息时立即加载 JMS 属性,因为可能不需要 JMS 属性,但有时可能会遇到底层 JMS 提供程序及使用 JMS 属性的早期问题。

false

布尔值

acknowledgementModeName (consumer)

JMS 确认名称之一: SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE

AUTO_ ACKNOWLEDGE

字符串

autoStartup (consumer)

指定使用者容器是否应该自动启动。

true

布尔值

cacheLevel (consumer)

根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。

 

int

cacheLevelName (consumer)

按照底层 JMS 资源的名称设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。

CACHE_AUTO

字符串

replyToCacheLevelName (producer)

在通过 JMS 进行请求/回复消费者时,按照名称设置缓存级别。这个选项只适用于使用固定的回复队列(而不是临时)。Camel 默认使用:CACHE_CONSUMER 用于独占或共享 w/ replyToSelectorName。以及在没有 replyToSelectorName 的情况下共享的 CACHE_SESSION。有些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注:如果使用临时队列,则不允许使用 CACHE_NONE,且必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。

 

字符串

clientId (common)

设置要使用的 JMS 客户端 ID。请注意,这个值必须是唯一的,且只能供单个 JMS 连接实例使用。通常只有持久主题订阅才是必需的。如果使用 Apache ActiveMQ,您可以改为使用虚拟主题。

 

字符串

concurrentConsumers (consumer)

指定使用 JMS 时的默认并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项回复ToConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

1

int

replyToConcurrent Consumers (producer)

指定在进行请求/相对于 JMS 时的默认并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

1

int

connectionFactory (common)

要使用的连接工厂。必须在组件或端点上配置连接工厂。

 

ConnectionFactory

username (security)

用于 ConnectionFactory 的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

密码 (安全)

要用于 ConnectionFactory 的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

deliveryPersistent (producer)

指定是否默认使用持久交付。

true

布尔值

deliveryMode (producer)

指定要使用的交付模式。可能的值可能是 javax.jms.DeliveryMode 定义的值。NON_PERSISTENT = 1 和 PERSISTENT = 2.

 

整数

durableSubscriptionName (common)

指定持久主题订阅的持久订阅者名称。还必须配置 clientId 选项。

 

字符串

exceptionListener (advanced)

指定任何底层 JMS 异常通知的 JMS Exception Listener。

 

ExceptionListener

errorHandler (advanced)

指定在处理消息时出现任何意外异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些异常会记录在 WARN 级别。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录堆栈追踪。这样可以更容易配置,而不是对自定义错误处理程序进行编码。

 

ErrorHandler

errorHandlerLogging Level (logging)

允许配置默认错误处理程序日志记录级别,以记录异常。

WARN

LoggingLevel

errorHandlerLogStack Trace (logging)

允许控制是否应该记录堆栈追踪,默认错误处理程序。

true

布尔值

explicitQosEnabled (producer)

设定在发送消息时应使用 deliveryMode、priority 或 timeToLive 服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,从 Camel In message 标头专门读取 QoS 属性。

false

布尔值

exposeListenerSession (consumer)

指定在消耗消息时是否应公开监听程序会话。

false

布尔值

idleTaskExecutionLimit (advanced)

指定接收任务的空闲执行的限制,没有在其执行过程中收到任何信息。如果达到这个限制,任务将关闭并离开其他执行任务(在出现动态调度的情况下),请参阅 maxConcurrentConsumers 设置。Spring 还有额外的文档。

1

int

idleConsumerLimit (advanced)

指定允许在任何给定时间闲置的用户数量的限制。

1

int

maxConcurrentConsumers (consumer)

指定来自 JMS 时的最大并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

 

int

replyToMaxConcurrent Consumers (producer)

指定在 JMS 中使用请求/回复时的最大并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

 

int

replyOnTimeoutToMax ConcurrentConsumers (producer)

指定在使用 request/reply over JMS 时超时发生时持续路由的并发使用者的最大数量。

1

int

maxMessagesPerTask (advanced)

每个任务的消息数量。-1 代表无限。如果您为并发使用者使用范围(如 min max),则此选项可用于将值设置为 eg 100 来控制在不需要较少工作时消费者的快速程度。

-1

int

messageConverter (advanced)

要使用自定义的 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。

 

MessageConverter

mapJmsMessage (advanced)

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。如需了解更多详细信息,请参阅下面映射如何工作的部分。

true

布尔值

messageIdEnabled (advanced)

发送时,指定是否应添加消息 ID。这只是 JMS Broker 的提示。如果 JMS 提供程序接受此提示,这些消息必须将消息 ID 设置为 null;如果提供程序忽略 hint,则消息 ID 必须设置为其正常的唯一值

true

布尔值

messageTimestampEnabled (advanced)

指定在发送消息时是否应默认启用时间戳。

true

布尔值

alwaysCopyMessage (producer)

如果为 true,则 Camel 将始终将消息的 JMS 消息副本传递给发送的制作者。在某些情况下,需要复制消息,例如当设置了 replyToDestinationSelectorName 时(通常,Camel 会将 alwaysCopyMessage 选项设置为 true,如设置了 replyToDestinationSelectorName)

false

布尔值

使用MessageIDAs CorrelationID (advanced)

指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。

false

布尔值

priority (producer)

高于 1 的值在发送时指定消息优先级(其中 0 是最低优先级),以及 9 是最高优先级。还必须启用显式QosEnabled 选项,才能使此选项生效。

4

int

pubSubNoLocal (advanced)

指定是否禁止交付其自身连接发布的消息。

false

布尔值

receiveTimeout (advanced)

接收消息的超时时间(以毫秒为单位)。

1000

long

recoveryInterval (advanced)

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

long

taskExecutor (consumer)

允许您指定自定义任务 executor 来使用消息。

 

TaskExecutor

deliveryDelay (producer)

设置用于 JMS 的发送调用的交付延迟。这个选项需要 JMS 2.0 兼容代理。

-1

long

timeToLive (producer)

发送消息时,指定消息的时间(以毫秒为单位)。

-1

long

transacted (transaction)

指定是否使用翻译模式

false

布尔值

lazyCreateTransaction Manager (transaction)

如果为 true,如果选项 transacted=true 中没有注入事务管理器,Camel 会创建一个 JmsTransactionManager。

true

布尔值

transactionManager (transaction)

要使用的 Spring 事务管理器。

 

platformTransaction Manager

transactionName (transaction)

要使用的事务的名称。

 

字符串

transactionTimeout (transaction)

事务的超时值(以秒为单位)。

-1

int

testConnectionOn Startup (common)

指定是否在启动时测试连接。这可确保当 Camel 启动时,所有 JMS 用户都具有与 JMS 代理的有效连接。如果无法授予连接,Camel 会在启动时抛出异常。这样可确保 Camel 没有启动失败的连接。JMS 生产商也进行了测试。

false

布尔值

asyncStartListener (advanced)

启动路由时是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

asyncStopListener (advanced)

在停止路由时,是否异步停止 JmsConsumer 消息监听程序。

false

布尔值

forceSendOriginal Message (producer)

在使用 mapJmsMessage=false Camel 时,如果您在路由期间接触标头(get 或 set)时,将创建一个新的 JMS 消息来发送到新的 JMS 目标。将这个选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。

false

布尔值

requestTimeout (producer)

在使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此每个消息单独的超时值。另请参阅 requestTimeoutCheckerInterval 选项。

20000

long

requestTimeoutChecker Interval (advanced)

配置在通过 JMS 进行请求时,Camel 应该检查超时交换的频率。默认情况下,Camel 会检查每秒一次。但是,如果发生超时时您必须更快地做出反应,那么您可以降低这个间隔,以更频繁地检查。超时由选项 requestTimeout 决定。

1000

long

transferExchange (advanced)

您可以通过线路传输交换,而不只是正文和标头。传输以下字段如下:正文、出站正文、容错正文、入口、出口标头、容错标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用此选项,因此 Camel 知道有效负载是 Exchange,而非常规有效负载。

false

布尔值

transferException (高级)

如果启用并且您正在使用 Request Reply messaging (InOut),并且一个 Exchange 在使用者端失败,则会导致 Exception 发回为 javax.jms.ObjectMessage。如果客户端是 Camel,则返回的 Exception 会被重新箭头。这样,您可以使用 Camel JMS 作为路由中的网桥 - 例如,使用持久性队列来启用可靠的路由。请注意,如果您也启用了 transferExchange,则此选项将具有优先权。请注意的异常需要是序列化的。使用者端的原始例外可以包装在外部异常中,如 org.apache.camel.RuntimeCamelException (返回到制作者)。

false

布尔值

transferFault (advanced)

如果启用且您使用 Request Reply messaging (InOut)和 Exchange failed,在消费者端使用 SOAP 错误(而非例外),则 org.apache.camel.Message#isFault ()上的 fault 标志将作为带有键 JmsConstants#JMSTRANSFER_ULT 的 JMS 标头发回。如果客户端是 Camel,则返回的 fault 标志将在 org.apache.camel.Message#setFault (布尔值)上设置。在使用支持故障的 Camel 组件(如 cxf 或 spring-ws)时,您可能需要启用此功能。

false

布尔值

jmsOperations (advanced)

允许您使用自己实施 org.springframework.jms.core.JmsOperations 接口。Camel 使用 JmsTemplate 作为默认值。可用于测试目的,但不如 spring API 文档中所述。

 

JmsOperations

destinationResolver (advanced)

可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找真实目的地)。

 

DestinationResolver

replyToType (producer)

允许显式指定在进行请求/恢复 JMS 时用于回复队列的策略。可能的值有:Trimporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。此选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档了解更多详情,特别是有关在集群环境中运行时所造成影响的备注,以及共享回复队列的性能比其 alternatives Temporary 和 Exclusive 的性能有不同。

 

ReplyToType

preserveMessageQos (producer)

设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或部分功能。如果没有提供,Camel 将回退为使用来自端点的值。因此,在使用这个选项时,标头会覆盖端点中的值。相反,显式QosEnabled 选项只会使用在端点上设置的选项,而不是消息标头中的值。

false

布尔值

asyncConsumer (consumer)

JmsConsumer 是否异步处理 Exchange。如果启用,则 JmsConsumer 可能会从 JMS 队列获取下一个消息,而上一消息正在异步处理(通过异步路由引擎)。这意味着,消息可以被严格处理,按顺序处理。如果禁用(默认),则在 JmsConsumer 将从 JMS 队列中获取下一个消息之前,将完全处理 Exchange。请注意,如果已启用翻译,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。

false

布尔值

allowNullBody (producer)

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

includeSentJMS MessageID (producer)

仅适用于使用 InOnly 发送到 JMS 目的地(请触发和忘记)。启用此选项将丰富的 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID 一起丰富。

false

布尔值

includeAllJMSX Properties (advanced)

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

默认TaskExecutor Type (使用者)

指定在 DefaultMessageListenerContainer 中使用哪些默认 TaskExecutor 类型,用于使用者端点和制作者端点的 ReplyTo consumer。可能的值有: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用具有最优值的 Spring 的 ThreadPoolTaskExecutor)。如果没有设置,则默认为之前的行为,它将缓存的线程池用于消费者端点和 SimpleAsync 回复消费者消费者。建议使用 ThreadPool 以减少弹性配置中的线程回收,并动态增加和减少并发用户。

 

DefaultTaskExecutor Type

jmsKeyFormatStrategy (advanced)

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了两个开箱即用的实现:默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

JmsKeyFormatStrategy

allowAdditionalHeaders (producer)

此选项用于允许可能具有根据 JMS 规格无效的值的额外标头。例如,一些消息系统(如 WMQ)使用前缀 JMS_IBM_MQMD_(包含字节阵列或其他无效类型的值)使用标头名称来执行此操作。您可以用逗号分隔的多个标头名称,并用作通配符匹配后缀。

 

字符串

queueBrowseStrategy (advanced)

在浏览队列时使用自定义 QueueBrowseStrategy

 

QueueBrowseStrategy

messageCreatedStrategy (advanced)

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

waitForProvision CorrelationToBeUpdated Counter (advanced)

在对 JMS 进行请求/恢复请求时,等待 provisional 关联 id 会被更新为实际关联 id 的次数,以及选项 useMessageIDAsCorrelationID。

50

int

waitForProvision CorrelationToBeUpdated ThreadSleepingTime (advanced)

millis 在等待 provisional correlation id 被更新期间,每次处于睡眠状态的时间间隔。

100

long

correlationProperty (producer)

使用此 JMS 属性将消息与 InOut Exchange 模式(request-reply)而不是 JMSCorrelationID 属性关联。这样,您可以使用 JMSCorrelationID JMS 属性将消息与不关联消息的系统交换。如果未使用 JMSCorrelationID,则 Camel 将不会被使用或设置。如果未在同一名称下的消息标题中提供,则生成此指定属性的值。

 

字符串

subscriptionDurable (consumer)

设置是否使订阅持久。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认为 false。将其设置为 true 以注册持久的订阅,通常与 subscriptionName 值结合使用(除非您的消息监听器类名称足够好作为订阅名称)。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。

false

布尔值

subscriptionShared (consumer)

设置是否使订阅共享。可以通过 subscriptionName 属性指定要使用的共享订阅名称。默认为 false。将其设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称已足够符合订阅名称)。请注意,共享订阅也可能是持久的,因此此标志也可以(并经常将)与订阅相整合。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。

false

布尔值

subscriptionName (consumer)

设置要创建的订阅的名称。要应用一个带有共享或 durable 订阅的主题(pub-sub 域)。订阅名称需要在这个客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发使用者(默认是此消息监听器容器),但共享订阅除外(需要 JMS 2.0)。

 

字符串

streamMessageType Enabled (producer)

设定是否启用 StreamMessage 类型。消息有效负载的流传输类型(如文件、InputStream 等)将作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪一种类型。默认情况下使用 BytesMessage,它强制读取到内存中的完整消息有效负载。通过启用此选项,消息有效负载在块中读取到内存中,每个块都会写入 StreamMessage,直到没有更多数据。

false

布尔值

formatDateHeadersTo Iso8601 (producer)

设置日期标头是否应该根据 ISO 8601 标准进行格式化。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

179.4.2. 端点选项

JMS 端点使用 URI 语法配置:

jms:destinationType:destinationName

使用以下路径和查询参数:

179.4.3. 路径名(2 参数):

名称描述默认类型

destinationType

要使用的目的地种类

队列

字符串

destinationName

用作目的地的队列或主题 所需的 名称

 

字符串

179.4.4. 查询参数(93 参数):

名称描述默认类型

clientId (common)

设置要使用的 JMS 客户端 ID。请注意,这个值必须是唯一的,且只能供单个 JMS 连接实例使用。通常只有持久主题订阅才是必需的。如果使用 Apache ActiveMQ,您可以改为使用虚拟主题。

 

字符串

connectionFactory (common)

如果没有为 setTemplateConnectionFactory (ConnectionFactory)或 setListenerConnectionFactory (ConnectionFactory)指定连接工厂,设置要使用的默认连接工厂。

 

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 消息类型。此选项允许您指定它。

 

JmsMessageType

testConnectionOnStartup (common)

指定是否在启动时测试连接。这可确保当 Camel 启动时,所有 JMS 用户都具有与 JMS 代理的有效连接。如果无法授予连接,Camel 会在启动时抛出异常。这样可确保 Camel 没有启动失败的连接。JMS 生产商也进行了测试。

false

布尔值

acknowledgementModeName (consumer)

JMS 确认名称之一: SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE

AUTO_ ACKNOWLEDGE

字符串

asyncConsumer (consumer)

JmsConsumer 是否异步处理 Exchange。如果启用,则 JmsConsumer 可能会从 JMS 队列获取下一个消息,而上一消息正在异步处理(通过异步路由引擎)。这意味着,消息可以被严格处理,按顺序处理。如果禁用(默认),则在 JmsConsumer 将从 JMS 队列中获取下一个消息之前,将完全处理 Exchange。请注意,如果已启用翻译,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。

false

布尔值

autoStartup (consumer)

指定使用者容器是否应该自动启动。

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

cacheLevel (consumer)

根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。

 

int

cacheLevelName (consumer)

按照底层 JMS 资源的名称设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。

CACHE_AUTO

字符串

concurrentConsumers (consumer)

指定使用 JMS 时的默认并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项回复ToConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

1

int

artemisConsumerPriority (consumer)

通过消费者优先级,您可以确保高优先级消费者在处于活动状态时接收消息。通常,与队列连接的活跃使用者会以轮循方式从该队列接收消息。当消费者优先级正在使用时,如果多个活跃消费者具有相同高优先级,则传递消息。只有高优先级消费者无法使用该消息时,消息才会进入较低优先级使用者,或者具有高优先级使用者已拒绝接受消息(例如,因为它不满足与使用者关联的任何选择器的条件)。

 

int

maxConcurrentConsumers (consumer)

指定来自 JMS 时的最大并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

 

int

replyTo (consumer)

提供显式 ReplyTo 目标,可覆盖 Message.getJMSReplyTo ()的任何传入值。

 

字符串

replyToDeliveryPersistent (consumer)

指定是否默认将持久发送用于回复。

true

布尔值

selector (consumer)

设置要使用的 JMS 选择器

 

字符串

subscriptionDurable (consumer)

设置是否使订阅持久。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认为 false。将其设置为 true 以注册持久的订阅,通常与 subscriptionName 值结合使用(除非您的消息监听器类名称足够好作为订阅名称)。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。

false

布尔值

subscriptionName (consumer)

设置要创建的订阅的名称。要应用一个带有共享或 durable 订阅的主题(pub-sub 域)。订阅名称需要在这个客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发使用者(默认是此消息监听器容器),但共享订阅除外(需要 JMS 2.0)。

 

字符串

subscriptionShared (consumer)

设置是否使订阅共享。可以通过 subscriptionName 属性指定要使用的共享订阅名称。默认为 false。将其设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称已足够符合订阅名称)。请注意,共享订阅也可能是持久的,因此此标志也可以(并经常将)与订阅相整合。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。

false

布尔值

acceptMessagesWhileStopping (consumer)

指定使用者接受消息在停止时是否指定。如果您在运行时启动和停止 JMS 路由,则请考虑启用这个选项,同时队列上仍有消息 enqueued。如果这个选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试重定位,但再次再次可能被拒绝,最后消息可能会在 JMS 代理上的死信队列移动。为了避免这一建议启用这个选项。

false

布尔值

allowReplyManagerQuickStop (consumer)

如果 JmsConfiguration#isAcceptMessagesWhileStopping ()被启用,并且 org.apache.camel.CamelContext 为当前正在停止的,并且 org.apache.camel.CamelContext 是当前正在停止的,则 DefaultMessageListenerContainer.repleStopping ()和 org.apache.camel.CamelContext 为当前已停止的。常规 JMS 用户默认启用这一快速停止功能,但为了回复经理,您必须启用此标志。

false

布尔值

consumerType (consumer)

要使用的使用者类型,可以是:简单、默认或 Custom。使用者类型决定要使用的 Spring JMS 侦听器。默认情况下,将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,SimpleMessageListenerContainer 将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,由 messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 将决定要使用的 org.springframework.jms.listener.AbstractMessageListenerContainer。

默认

ConsumerType

defaultTaskExecutorType (consumer)

指定在 DefaultMessageListenerContainer 中使用哪些默认 TaskExecutor 类型,用于使用者端点和制作者端点的 ReplyTo consumer。可能的值有: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用具有最优值的 Spring 的 ThreadPoolTaskExecutor)。如果没有设置,则默认为之前的行为,它将缓存的线程池用于消费者端点和 SimpleAsync 回复消费者消费者。建议使用 ThreadPool 以减少弹性配置中的线程回收,并动态增加和减少并发用户。

 

DefaultTaskExecutor Type

eagerLoadingOfProperties (consumer)

在加载消息时立即加载 JMS 属性和有效负载,这通常不需要 JMS 属性,但有时可能会遇到底层 JMS 提供程序的问题以及 JMS 属性的使用。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

exposeListenerSession (consumer)

指定在消耗消息时是否应公开监听程序会话。

false

布尔值

replyToSameDestination Allowed (consumer)

JMS 使用者是否允许回复消息到消费者用于使用的同一目的地。这可防止消耗和将相同的消息发回到自身来防止死循环。

false

布尔值

taskExecutor (consumer)

允许您指定自定义任务 executor 来使用消息。

 

TaskExecutor

deliveryDelay (producer)

设置用于 JMS 的发送调用的交付延迟。这个选项需要 JMS 2.0 兼容代理。

-1

long

deliveryMode (producer)

指定要使用的交付模式。Possibles 值由 javax.jms.DeliveryMode 定义。NON_PERSISTENT = 1 和 PERSISTENT = 2.

 

整数

deliveryPersistent (producer)

指定是否默认使用持久交付。

true

布尔值

explicitQosEnabled (producer)

设定在发送消息时应使用 deliveryMode、priority 或 timeToLive 服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,从 Camel In message 标头专门读取 QoS 属性。

false

布尔值

formatDateHeadersToIso8601 (producer)

设置日期标头是否应该根据 ISO 8601 标准进行格式化。

false

布尔值

preserveMessageQos (producer)

设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或部分功能。如果没有提供,Camel 将回退为使用来自端点的值。因此,在使用这个选项时,标头会覆盖端点中的值。相反,显式QosEnabled 选项只会使用在端点上设置的选项,而不是消息标头中的值。

false

布尔值

priority (producer)

高于 1 的值在发送时指定消息优先级(其中 0 是最低优先级),以及 9 是最高优先级。还必须启用显式QosEnabled 选项,才能使此选项生效。

4

int

replyToConcurrentConsumers (producer)

指定在进行请求/相对于 JMS 时的默认并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

1

int

replyToMaxConcurrent Consumers (producer)

指定在 JMS 中使用请求/回复时的最大并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

 

int

replyToOnTimeoutMax ConcurrentConsumers (producer)

指定在使用 request/reply over JMS 时超时发生时持续路由的并发使用者的最大数量。

1

int

replyToOverride (producer)

在 JMS 消息中提供显式 ReplyTo 目标,可覆盖回复商的设置。如果要将消息转发到远程队列并接收来自 ReplyTo 目的地的回复消息,这很有用。

 

字符串

replyToType (producer)

允许显式指定在进行请求/恢复 JMS 时用于回复队列的策略。可能的值有:Trimporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。此选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档了解更多详情,特别是有关在集群环境中运行时所造成影响的备注,以及共享回复队列的性能比其 alternatives Temporary 和 Exclusive 的性能有不同。

 

ReplyToType

requestTimeout (producer)

在使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此每个消息单独的超时值。另请参阅 requestTimeoutCheckerInterval 选项。

20000

long

timeToLive (producer)

发送消息时,指定消息的时间(以毫秒为单位)。

-1

long

allowAdditionalHeaders (producer)

此选项用于允许可能具有根据 JMS 规格无效的值的额外标头。例如,一些消息系统(如 WMQ)使用前缀 JMS_IBM_MQMD_(包含字节阵列或其他无效类型的值)使用标头名称来执行此操作。您可以用逗号分隔的多个标头名称,并用作通配符匹配后缀。

 

字符串

allowNullBody (producer)

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

alwaysCopyMessage (producer)

如果为 true,则 Camel 将始终将消息的 JMS 消息副本传递给发送的制作者。在某些情况下,需要复制消息,例如当设置了 replyToDestinationSelectorName 时(通常,Camel 会将 alwaysCopyMessage 选项设置为 true,如设置了 replyToDestinationSelectorName)

false

布尔值

correlationProperty (producer)

使用此 JMS 属性将消息与 InOut Exchange 模式(request-reply)而不是 JMSCorrelationID 属性关联。这样,您可以使用 JMSCorrelationID JMS 属性将消息与不关联消息的系统交换。如果未使用 JMSCorrelationID,则 Camel 将不会被使用或设置。如果未在同一名称下的消息标题中提供,则生成此指定属性的值。

 

字符串

disableTimeToLive (producer)

使用这个选项强制禁用时间实时。例如,当您通过 JMS 进行请求/推荐时,Camel 默认将使用 requestTimeout 值作为正在发送的消息上的实时。问题是发送者和接收器系统必须同步其时钟,因此它们正在同步。这不是始终如此容易的归档。因此,您可以使用 disableTimeToLive=true 将发送消息中的时间设置为 live 值。然后,信息不会在接收方系统中过期。如需了解更多详细信息,请参阅关于时间至 live 的部分。

false

布尔值

forceSendOriginalMessage (producer)

在使用 mapJmsMessage=false Camel 时,如果您在路由期间接触标头(get 或 set)时,将创建一个新的 JMS 消息来发送到新的 JMS 目标。将这个选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。

false

布尔值

includeSentJMSMessageID (producer)

仅适用于使用 InOnly 发送到 JMS 目的地(请触发和忘记)。启用此选项将丰富的 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID 一起丰富。

false

布尔值

replyToCacheLevelName (producer)

在通过 JMS 进行请求/回复消费者时,按照名称设置缓存级别。这个选项只适用于使用固定的回复队列(而不是临时)。Camel 默认使用:CACHE_CONSUMER 用于独占或共享 w/ replyToSelectorName。以及在没有 replyToSelectorName 的情况下共享的 CACHE_SESSION。有些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注:如果使用临时队列,则不允许使用 CACHE_NONE,且必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。

 

字符串

replyToDestinationSelector Name (producer)

使用固定名称来设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(也就是说,如果您不使用临时回复队列)。

 

字符串

streamMessageTypeEnabled (producer)

设定是否启用 StreamMessage 类型。消息有效负载的流传输类型(如文件、InputStream 等)将作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪一种类型。默认情况下使用 BytesMessage,它强制读取到内存中的完整消息有效负载。通过启用此选项,消息有效负载在块中读取到内存中,每个块都会写入 StreamMessage,直到没有更多数据。

false

布尔值

allowSerializedHeaders (advanced)

控制是否包含序列化标头。仅在 isTransferExchange ()为 true 时才适用。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

asyncStartListener (advanced)

启动路由时是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

asyncStopListener (advanced)

在停止路由时,是否异步停止 JmsConsumer 消息监听程序。

false

布尔值

destinationResolver (advanced)

可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找真实目的地)。

 

DestinationResolver

errorHandler (advanced)

指定在处理消息时出现任何意外异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些异常会记录在 WARN 级别。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录堆栈追踪。这样可以更容易配置,而不是对自定义错误处理程序进行编码。

 

ErrorHandler

exceptionListener (advanced)

指定任何底层 JMS 异常通知的 JMS Exception Listener。

 

ExceptionListener

headerFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

idleConsumerLimit (advanced)

指定允许在任何给定时间闲置的用户数量的限制。

1

int

idleTaskExecutionLimit (advanced)

指定接收任务的空闲执行的限制,没有在其执行过程中收到任何信息。如果达到这个限制,任务将关闭并离开其他执行任务(在出现动态调度的情况下),请参阅 maxConcurrentConsumers 设置。Spring 还有额外的文档。

1

int

includeAllJMSXProperties (advanced)

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

jmsKeyFormatStrategy (advanced)

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了两个开箱即用的实现:默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

字符串

mapJmsMessage (advanced)

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。

true

布尔值

maxMessagesPerTask (advanced)

每个任务的消息数量。-1 代表无限。如果您为并发使用者使用范围(如 min max),则此选项可用于将值设置为 eg 100 来控制在不需要较少工作时消费者的快速程度。

-1

int

messageConverter (advanced)

要使用自定义的 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。

 

MessageConverter

messageCreatedStrategy (advanced)

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

messageIdEnabled (advanced)

发送时,指定是否应添加消息 ID。这只是 JMS Broker 的提示。如果 JMS 提供程序接受此提示,这些消息必须将消息 ID 设置为 null;如果提供程序忽略 hint,则消息 ID 必须设置为其正常的唯一值

true

布尔值

messageListenerContainer Factory (advanced)

用于决定要消耗消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 registry ID。设置此设置将自动将 consumerType 设置为 Custom。

 

MessageListener ContainerFactory

messageTimestampEnabled (advanced)

指定在发送消息时是否应默认启用时间戳。这只是 JMS Broker 的提示。如果 JMS 提供程序接受此提示,这些消息必须将时间戳设置为零;如果供应商忽略 hint,则时间戳必须设置为其正常值

true

布尔值

pubSubNoLocal (advanced)

指定是否禁止交付其自身连接发布的消息。

false

布尔值

receiveTimeout (advanced)

接收消息的超时时间(以毫秒为单位)。

1000

long

recoveryInterval (advanced)

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

long

requestTimeoutChecker Interval (advanced)

配置在通过 JMS 进行请求时,Camel 应该检查超时交换的频率。默认情况下,Camel 会检查每秒一次。但是,如果发生超时时您必须更快地做出反应,那么您可以降低这个间隔,以更频繁地检查。超时由选项 requestTimeout 决定。

1000

long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

transferException (高级)

如果启用并且您正在使用 Request Reply messaging (InOut),并且一个 Exchange 在使用者端失败,则会导致 Exception 发回为 javax.jms.ObjectMessage。如果客户端是 Camel,则返回的 Exception 会被重新箭头。这样,您可以使用 Camel JMS 作为路由中的网桥 - 例如,使用持久性队列来启用可靠的路由。请注意,如果您也启用了 transferExchange,则此选项将具有优先权。请注意的异常需要是序列化的。使用者端的原始例外可以包装在外部异常中,如 org.apache.camel.RuntimeCamelException (返回到制作者)。

false

布尔值

transferExchange (advanced)

您可以通过线路传输交换,而不只是正文和标头。传输以下字段如下:正文、出站正文、容错正文、入口、出口标头、容错标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用此选项,因此 Camel 知道有效负载是 Exchange,而非常规有效负载。

false

布尔值

transferFault (advanced)

如果启用且您使用 Request Reply messaging (InOut)和 Exchange failed,在消费者端使用 SOAP 错误(而非例外),则 org.apache.camel.Message#isFault ()上的 fault 标志将作为带有键 JmsConstants#JMSTRANSFER_ULT 的 JMS 标头发回。如果客户端是 Camel,则返回的 fault 标志将在 org.apache.camel.Message#setFault (布尔值)上设置。在使用支持故障的 Camel 组件(如 cxf 或 spring-ws)时,您可能需要启用此功能。

false

布尔值

useMessageIDAsCorrelation ID (advanced)

指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。

false

布尔值

waitForProvisionCorrelation ToBeUpdatedCounter (advanced)

在对 JMS 进行请求/恢复请求时,等待 provisional 关联 id 会被更新为实际关联 id 的次数,以及选项 useMessageIDAsCorrelationID。

50

int

waitForProvisionCorrelation ToBeUpdatedThreadSleeping Time (advanced)

millis 在等待 provisional correlation id 被更新期间,每次处于睡眠状态的时间间隔。

100

long

errorHandlerLoggingLevel (logging)

允许配置默认错误处理程序日志记录级别,以记录异常。

WARN

LoggingLevel

errorHandlerLogStackTrace (logging)

允许控制是否应该记录堆栈追踪,默认错误处理程序。

true

布尔值

密码 (安全)

要用于 ConnectionFactory 的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

username (security)

用于 ConnectionFactory 的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

transacted (transaction)

指定是否使用翻译模式

false

布尔值

lazyCreateTransaction Manager (transaction)

如果为 true,如果选项 transacted=true 中没有注入事务管理器,Camel 会创建一个 JmsTransactionManager。

true

布尔值

transactionManager (transaction)

要使用的 Spring 事务管理器。

 

platformTransaction Manager

transactionName (transaction)

要使用的事务的名称。

 

字符串

transactionTimeout (transaction)

事务的超时值(以秒为单位)。

-1

int

179.5. Spring Boot Auto-Configuration

组件支持 172 选项,它们如下所列。

名称描述默认类型

camel.component.jms.accept-messages-while-stopping

指定使用者接受消息在停止时是否指定。如果您在运行时启动和停止 JMS 路由,则请考虑启用这个选项,同时队列上仍有消息 enqueued。如果这个选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试重定位,但再次再次可能被拒绝,最后消息可能会在 JMS 代理上的死信队列移动。为了避免这一建议启用这个选项。

false

布尔值

camel.component.jms.acknowledgement-mode

JMS 确认模式定义为 Integer。允许您将特定于供应商的扩展设置为确认模式。对于常规模式,最好使用 acknowledgementModeName。

 

整数

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-null-body

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

camel.component.jms.allow-reply-manager-quick-stop

如果 JmsConfiguration#isAcceptMessagesWhileStopping 在启用 JmsConfiguration#isAcceptMessagesWhileStopping 时,并且 org.apache.camel.Camel.CamelContext 当前已经停止。常规 JMS 用户默认启用这一快速停止功能,但为了回复经理,您必须启用此标志。

false

布尔值

camel.component.jms.always-copy-message

如果为 true,则 Camel 将始终将消息的 JMS 消息副本传递给发送的制作者。在某些情况下,需要复制消息,例如当设置了 replyToDestinationSelectorName 时(通常,Camel 会将 alwaysCopyMessage 选项设置为 true,如设置了 replyToDestinationSelectorName)

false

布尔值

camel.component.jms.async-consumer

JmsConsumer 是否异步处理 Exchange。如果启用,则 JmsConsumer 可能会从 JMS 队列获取下一个消息,而上一消息正在异步处理(通过异步路由引擎)。这意味着,消息可以被严格处理,按顺序处理。如果禁用(默认),则在 JmsConsumer 将从 JMS 队列中获取下一个消息之前,将完全处理 Exchange。请注意,如果已启用翻译,则 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.cache-level

根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。

 

整数

camel.component.jms.cache-level-name

按照底层 JMS 资源的名称设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。

CACHE_AUTO

字符串

camel.component.jms.client-id

设置要使用的 JMS 客户端 ID。请注意,这个值必须是唯一的,且只能供单个 JMS 连接实例使用。通常只有持久主题订阅才是必需的。如果使用 Apache ActiveMQ,您可以改为使用虚拟主题。

 

字符串

camel.component.jms.concurrent-consumers

指定使用 JMS 时的默认并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项回复ToConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

1

整数

camel.component.jms.configuration.accept-messages-while-stopping

指定使用者接受消息在停止时是否指定。如果您在运行时启动和停止 JMS 路由,则请考虑启用这个选项,同时队列上仍有消息 enqueued。如果这个选项为 false,并且您停止了 JMS 路由,则消息可能会被拒绝,并且 JMS 代理必须尝试重定位,但再次再次可能被拒绝,最后消息可能会在 JMS 代理上的死信队列移动。为了避免这一建议启用这个选项。

false

布尔值

camel.component.jms.configuration.acknowledgement-mode

JMS 确认模式定义为 Integer。允许您将特定于供应商的扩展设置为确认模式。对于常规模式,最好使用 acknowledgementModeName。

 

整数

camel.component.jms.configuration.acknowledgement-mode-name

JMS 确认名称之一: SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE

AUTO_ ACKNOWLEDGE

字符串

camel.component.jms.configuration.allow-additional-headers

此选项用于允许可能具有根据 JMS 规格无效的值的额外标头。例如,一些消息系统(如 WMQ)使用前缀 JMS_IBM_MQMD_(包含字节阵列或其他无效类型的值)使用标头名称来执行此操作。您可以用逗号分隔的多个标头名称,并用作通配符匹配后缀。

 

字符串

camel.component.jms.configuration.allow-null-body

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

camel.component.jms.configuration.allow-reply-manager-quick-stop

如果 JmsConfiguration#isAcceptMessagesWhileStopping ()被启用,并且 org.apache.camel.CamelContext 为当前正在停止的,并且 org.apache.camel.CamelContext 是当前正在停止的,则 DefaultMessageListenerContainer.repleStopping ()和 org.apache.camel.CamelContext 为当前已停止的。常规 JMS 用户默认启用这一快速停止功能,但为了回复经理,您必须启用此标志。

false

布尔值

camel.component.jms.configuration.allow-serialized-headers

控制是否包含序列化标头。仅在 isTransferExchange ()为 true 时才适用。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

camel.component.jms.configuration.always-copy-message

如果为 true,则 Camel 将始终将消息的 JMS 消息副本传递给发送的制作者。在某些情况下,需要复制消息,例如当设置了 replyToDestinationSelectorName 时(通常,Camel 会将 alwaysCopyMessage 选项设置为 true,如设置了 replyToDestinationSelectorName)

false

布尔值

camel.component.jms.configuration.async-consumer

JmsConsumer 是否异步处理 Exchange。如果启用,则 JmsConsumer 可能会从 JMS 队列获取下一个消息,而上一消息正在异步处理(通过异步路由引擎)。这意味着,消息可以被严格处理,按顺序处理。如果禁用(默认),则在 JmsConsumer 将从 JMS 队列中获取下一个消息之前,将完全处理 Exchange。请注意,如果已启用翻译,则 asyncConsumer=true 不会异步运行,因为事务必须同步执行(Camel 3.0 可能支持 async 事务)。

false

布尔值

camel.component.jms.configuration.async-start-listener

启动路由时是否异步启动 JmsConsumer 消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

camel.component.jms.configuration.async-stop-listener

在停止路由时,是否异步停止 JmsConsumer 消息监听程序。

false

布尔值

camel.component.jms.configuration.auto-startup

指定使用者容器是否应该自动启动。

true

布尔值

camel.component.jms.configuration.cache-level

根据底层 JMS 资源的 ID 设置缓存级别。如需了解更多详细信息,请参阅 cacheLevelName 选项。

 

整数

camel.component.jms.configuration.cache-level-name

按照底层 JMS 资源的名称设置缓存级别。可能的值有:CACHE_AUTO、CACHE_CONNECTION、CACHE_CONSUMER、CACHE_NONE 和 CACHE_SESSION。默认设置为 CACHE_AUTO。如需更多信息,请参阅 Spring 文档和事务缓存级别。

CACHE_AUTO

字符串

camel.component.jms.configuration.client-id

设置要使用的 JMS 客户端 ID。请注意,这个值必须是唯一的,且只能供单个 JMS 连接实例使用。通常只有持久主题订阅才是必需的。如果使用 Apache ActiveMQ,您可以改为使用虚拟主题。

 

字符串

camel.component.jms.configuration.concurrent-consumers

指定使用 JMS 时的默认并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项回复ToConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

1

整数

camel.component.jms.configuration.connection-factory

如果没有为 setTemplateConnectionFactory (ConnectionFactory)或 setListenerConnectionFactory (ConnectionFactory)指定连接工厂,设置要使用的默认连接工厂。

 

ConnectionFactory

camel.component.jms.configuration.consumer-type

要使用的使用者类型,可以是:简单、默认或 Custom。使用者类型决定要使用的 Spring JMS 侦听器。默认情况下,将使用 org.springframework.jms.listener.DefaultMessageListenerContainer,SimpleMessageListenerContainer 将使用 org.springframework.jms.listener.SimpleMessageListenerContainer。指定 Custom 时,由 messageListenerContainerFactory 选项定义的 MessageListenerContainerFactory 将决定要使用的 org.springframework.jms.listener.AbstractMessageListenerContainer。

 

ConsumerType

camel.component.jms.configuration.correlation-property

使用此 JMS 属性将消息与 InOut Exchange 模式(request-reply)而不是 JMSCorrelationID 属性关联。这样,您可以使用 JMSCorrelationID JMS 属性将消息与不关联消息的系统交换。如果未使用 JMSCorrelationID,则 Camel 将不会被使用或设置。如果未在同一名称下的消息标题中提供,则生成此指定属性的值。

 

字符串

camel.component.jms.configuration.default-task-executor-type

指定在 DefaultMessageListenerContainer 中使用哪些默认 TaskExecutor 类型,用于使用者端点和制作者端点的 ReplyTo consumer。可能的值有: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用具有最优值的 Spring 的 ThreadPoolTaskExecutor)。如果没有设置,则默认为之前的行为,它将缓存的线程池用于消费者端点和 SimpleAsync 回复消费者消费者。建议使用 ThreadPool 以减少弹性配置中的线程回收,并动态增加和减少并发用户。

 

DefaultTaskExecutor Type

camel.component.jms.configuration.delivery-mode

指定要使用的交付模式。Possibles 值由 javax.jms.DeliveryMode 定义。NON_PERSISTENT = 1 和 PERSISTENT = 2.

 

整数

camel.component.jms.configuration.delivery-persistent

指定是否默认使用持久交付。

true

布尔值

camel.component.jms.configuration.destination-resolver

可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找真实目的地)。

 

DestinationResolver

camel.component.jms.configuration.disable-reply-to

指定 Camel 是否忽略消息中的 JMSReplyTo 标头。如果为 true,Camel 不会向 JMSReplyTo 标头中指定的目标发送回复。如果您希望 Camel 从路由消耗,且您不希望 Camel 自动发送回复消息,因为代码中的其他组件会处理回复消息。如果要使用 Camel 作为不同消息代理间的代理,并希望从一个系统路由到另一个系统,也可以使用这个选项。

false

布尔值

camel.component.jms.configuration.disable-time-to-live

使用这个选项强制禁用时间实时。例如,当您通过 JMS 进行请求/推荐时,Camel 默认将使用 requestTimeout 值作为正在发送的消息上的实时。问题是发送者和接收器系统必须同步其时钟,因此它们正在同步。这不是始终如此容易的归档。因此,您可以使用 disableTimeToLive=true 将发送消息中的时间设置为 live 值。然后,信息不会在接收方系统中过期。如需了解更多详细信息,请参阅关于时间至 live 的部分。

false

布尔值

camel.component.jms.configuration.durable-subscription-name

指定持久主题订阅的持久订阅者名称。还必须配置 clientId 选项。

 

字符串

camel.component.jms.configuration.eager-loading-of-properties

在加载消息时立即加载 JMS 属性和有效负载,这通常不需要 JMS 属性,但有时可能会遇到底层 JMS 提供程序的问题以及 JMS 属性的使用。

false

布尔值

camel.component.jms.configuration.error-handler

指定在处理消息时出现任何意外异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些异常会记录在 WARN 级别。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录堆栈追踪。这样可以更容易配置,而不是对自定义错误处理程序进行编码。

 

ErrorHandler

camel.component.jms.configuration.error-handler-log-stack-trace

允许控制是否应该记录堆栈追踪,默认错误处理程序。

true

布尔值

camel.component.jms.configuration.error-handler-logging-level

允许配置默认错误处理程序日志记录级别,以记录异常。

 

LoggingLevel

camel.component.jms.configuration.exception-listener

指定任何底层 JMS 异常通知的 JMS Exception Listener。

 

ExceptionListener

camel.component.jms.configuration.expose-listener-session

指定在消耗消息时是否应公开监听程序会话。

false

布尔值

camel.component.jms.configuration.force-send-original-message

在使用 mapJmsMessage=false Camel 时,如果您在路由期间接触标头(get 或 set)时,将创建一个新的 JMS 消息来发送到新的 JMS 目标。将这个选项设置为 true 以强制 Camel 发送收到的原始 JMS 消息。

false

布尔值

camel.component.jms.configuration.format-date-headers-to-iso8601

设置日期标头是否应该根据 ISO 8601 标准进行格式化。

false

布尔值

camel.component.jms.configuration.idle-consumer-limit

指定允许在任何给定时间闲置的用户数量的限制。

1

整数

camel.component.jms.configuration.idle-task-execution-limit

指定接收任务的空闲执行的限制,没有在其执行过程中收到任何信息。如果达到这个限制,任务将关闭并离开其他执行任务(在出现动态调度的情况下),请参阅 maxConcurrentConsumers 设置。Spring 还有额外的文档。

1

整数

camel.component.jms.configuration.include-all-j-m-s-x-properties

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

camel.component.jms.configuration.include-sent-j-m-s-message-i-d

仅适用于使用 InOnly 发送到 JMS 目的地(请触发和忘记)。启用此选项将丰富的 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID 一起丰富。

false

布尔值

camel.component.jms.configuration.jms-key-format-strategy

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了两个开箱即用的实现:默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

JmsKeyFormatStrategy

camel.component.jms.configuration.jms-message-type

允许您强制使用特定的 javax.jms.Message 实施来发送 JMS 消息。可能的值有:Bytes, Map, Object, Stream, Text。默认情况下,Camel 将决定要从 In body 类型中使用的 JMS 消息类型。此选项允许您指定它。

 

JmsMessageType

camel.component.jms.configuration.jms-operations

允许您使用自己实施 org.springframework.jms.core.JmsOperations 接口。Camel 使用 JmsTemplate 作为默认值。可用于测试目的,但不如 spring API 文档中所述。

 

JmsOperations

camel.component.jms.configuration.lazy-create-transaction-manager

如果为 true,如果选项 transacted=true 中没有注入事务管理器,Camel 会创建一个 JmsTransactionManager。

true

布尔值

camel.component.jms.configuration.listener-connection-factory

设置用于消耗消息的连接工厂

 

ConnectionFactory

camel.component.jms.configuration.map-jms-message

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。

true

布尔值

camel.component.jms.configuration.max-concurrent-consumers

指定来自 JMS 时的最大并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

 

整数

camel.component.jms.configuration.max-messages-per-task

每个任务的消息数量。-1 代表无限。如果您为并发使用者使用范围(如 min max),则此选项可用于将值设置为 eg 100 来控制在不需要较少工作时消费者的快速程度。

-1

整数

camel.component.jms.configuration.message-converter

要使用自定义的 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。

 

MessageConverter

camel.component.jms.configuration.message-created-strategy

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

camel.component.jms.configuration.message-id-enabled

发送时,指定是否应添加消息 ID。这只是 JMS Broker 的提示。如果 JMS 提供程序接受此提示,这些消息必须将消息 ID 设置为 null;如果提供程序忽略 hint,则消息 ID 必须设置为其正常的唯一值

true

布尔值

camel.component.jms.configuration.message-listener-container-factory

用于决定要消耗消息的 org.springframework.jms.listener.AbstractMessageListenerContainer 的 registry ID。设置此设置将自动将 consumerType 设置为 Custom。

 

MessageListener ContainerFactory

camel.component.jms.configuration.message-timestamp-enabled

指定在发送消息时是否应默认启用时间戳。这只是 JMS Broker 的提示。如果 JMS 提供程序接受此提示,这些消息必须将时间戳设置为零;如果供应商忽略 hint,则时间戳必须设置为其正常值

true

布尔值

camel.component.jms.configuration.metadata-jms-operations

设置用于取消 {@link JmsProviderMetadata} 详情的 {@link JmsOperations} 详情。如果没有自定义的是 lazily created,请根据需要设置

 

JmsOperations

camel.component.jms.configuration.password

要用于 ConnectionFactory 的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

camel.component.jms.configuration.preserve-message-qos

设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或部分功能。如果没有提供,Camel 将回退为使用来自端点的值。因此,在使用这个选项时,标头会覆盖端点中的值。相反,显式QosEnabled 选项只会使用在端点上设置的选项,而不是消息标头中的值。

false

布尔值

camel.component.jms.configuration.priority

高于 1 的值在发送时指定消息优先级(其中 0 是最低优先级),以及 9 是最高优先级。还必须启用显式QosEnabled 选项,才能使此选项生效。

4

整数

camel.component.jms.configuration.provider-metadata

允许显式配置供应商元数据。通常不需要,Camel 将自动探测底层供应商的供应商元数据。

 

JmsProviderMetadata

camel.component.jms.configuration.pub-sub-no-local

指定是否禁止交付其自身连接发布的消息。

false

布尔值

camel.component.jms.configuration.receive-timeout

接收消息的超时时间(以毫秒为单位)。

1000

Long

camel.component.jms.configuration.recovery-interval

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

Long

camel.component.jms.configuration.reply-to

提供显式 ReplyTo 目标,可覆盖 Message.getJMSReplyTo ()的任何传入值。

 

字符串

camel.component.jms.configuration.reply-to-cache-level-name

在通过 JMS 进行请求/回复消费者时,按照名称设置缓存级别。这个选项只适用于使用固定的回复队列(而不是临时)。Camel 默认使用:CACHE_CONSUMER 用于独占或共享 w/ replyToSelectorName。以及在没有 replyToSelectorName 的情况下共享的 CACHE_SESSION。有些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注:如果使用临时队列,则不允许使用 CACHE_NONE,且必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。

 

字符串

camel.component.jms.configuration.reply-to-concurrent-consumers

指定在进行请求/相对于 JMS 时的默认并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

1

整数

camel.component.jms.configuration.reply-to-delivery-persistent

指定是否默认将持久发送用于回复。

true

布尔值

camel.component.jms.configuration.reply-to-destination-selector-name

使用固定名称来设置 JMS Selector,以便在使用共享队列时过滤您自己的回复(也就是说,如果您不使用临时回复队列)。

 

字符串

camel.component.jms.configuration.reply-to-max-concurrent-consumers

指定在 JMS 中使用请求/回复时的最大并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

 

整数

camel.component.jms.configuration.reply-to-on-timeout-max-concurrent-consumers

指定在使用 request/reply over JMS 时超时发生时持续路由的并发使用者的最大数量。

1

整数

camel.component.jms.configuration.reply-to-override

在 JMS 消息中提供显式 ReplyTo 目标,可覆盖回复商的设置。如果要将消息转发到远程队列并接收来自 ReplyTo 目的地的回复消息,这很有用。

 

字符串

camel.component.jms.configuration.reply-to-same-destination-allowed

JMS 使用者是否允许回复消息到消费者用于使用的同一目的地。这可防止消耗和将相同的消息发回到自身来防止死循环。

false

布尔值

camel.component.jms.configuration.reply-to-type

允许显式指定在进行请求/恢复 JMS 时用于回复队列的策略。可能的值有:Trimporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。此选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档了解更多详情,特别是有关在集群环境中运行时所造成影响的备注,以及共享回复队列的性能比其 alternatives Temporary 和 Exclusive 的性能有不同。

 

ReplyToType

camel.component.jms.configuration.request-timeout

在使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此每个消息单独的超时值。另请参阅 requestTimeoutCheckerInterval 选项。

20000

Long

camel.component.jms.configuration.request-timeout-checker-interval

配置在通过 JMS 进行请求时,Camel 应该检查超时交换的频率。默认情况下,Camel 会检查每秒一次。但是,如果发生超时时您必须更快地做出反应,那么您可以降低这个间隔,以更频繁地检查。超时由选项 requestTimeout 决定。

1000

Long

camel.component.jms.configuration.selector

设置要使用的 JMS 选择器

 

字符串

camel.component.jms.configuration.stream-message-type-enabled

设定是否启用 StreamMessage 类型。消息有效负载的流传输类型(如文件、InputStream 等)将作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪一种类型。默认情况下使用 BytesMessage,它强制读取到内存中的完整消息有效负载。通过启用此选项,消息有效负载在块中读取到内存中,每个块都会写入 StreamMessage,直到没有更多数据。

false

布尔值

camel.component.jms.configuration.subscription-durable

设置是否使订阅持久。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认为 false。将其设置为 true 以注册持久的订阅,通常与 subscriptionName 值结合使用(除非您的消息监听器类名称足够好作为订阅名称)。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。

false

布尔值

camel.component.jms.configuration.subscription-name

设置要创建的订阅的名称。要应用一个带有共享或 durable 订阅的主题(pub-sub 域)。订阅名称需要在这个客户端的 JMS 客户端 ID 中唯一。default 是指定消息监听程序的类名称。注:每个订阅只允许 1 个并发使用者(默认是此消息监听器容器),但共享订阅除外(需要 JMS 2.0)。

 

字符串

camel.component.jms.configuration.subscription-shared

设置是否使订阅共享。可以通过 subscriptionName 属性指定要使用的共享订阅名称。默认为 false。将其设置为 true 以注册共享订阅,通常与 subscriptionName 值结合使用(除非您的消息监听程序类名称已足够符合订阅名称)。请注意,共享订阅也可能是持久的,因此此标志也可以(并经常将)与订阅相整合。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。需要 JMS 2.0 兼容消息代理。

false

布尔值

camel.component.jms.configuration.task-executor

允许您指定自定义任务 executor 来使用消息。

 

TaskExecutor

camel.component.jms.configuration.template-connection-factory

通过 {@link #createInOnlyTemplate (JmsEndpoint,boolean,String)} 用于通过 {@link JmsTemplate} 发送信息。

 

ConnectionFactory

camel.component.jms.configuration.test-connection-on-startup

指定是否在启动时测试连接。这可确保当 Camel 启动时,所有 JMS 用户都具有与 JMS 代理的有效连接。如果无法授予连接,Camel 会在启动时抛出异常。这样可确保 Camel 没有启动失败的连接。JMS 生产商也进行了测试。

false

布尔值

camel.component.jms.configuration.time-to-live

发送消息时,指定消息的时间(以毫秒为单位)。

-1

Long

camel.component.jms.configuration.transacted

指定是否使用翻译模式

false

布尔值

camel.component.jms.configuration.transaction-manager

要使用的 Spring 事务管理器。

 

platformTransaction Manager

camel.component.jms.configuration.transaction-name

要使用的事务的名称。

 

字符串

camel.component.jms.configuration.transaction-timeout

事务的超时值(以秒为单位)。

-1

整数

camel.component.jms.configuration.transfer-exception

如果启用并且您正在使用 Request Reply messaging (InOut),并且一个 Exchange 在使用者端失败,则会导致 Exception 发回为 javax.jms.ObjectMessage。如果客户端是 Camel,则返回的 Exception 会被重新箭头。这样,您可以使用 Camel JMS 作为路由中的网桥 - 例如,使用持久性队列来启用可靠的路由。请注意,如果您也启用了 transferExchange,则此选项将具有优先权。请注意的异常需要是序列化的。使用者端的原始例外可以包装在外部异常中,如 org.apache.camel.RuntimeCamelException (返回到制作者)。

false

布尔值

camel.component.jms.configuration.transfer-exchange

您可以通过线路传输交换,而不只是正文和标头。传输以下字段如下:正文、出站正文、容错正文、入口、出口标头、容错标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用此选项,因此 Camel 知道有效负载是 Exchange,而非常规有效负载。

false

布尔值

camel.component.jms.configuration.transfer-fault

如果启用且您使用 Request Reply messaging (InOut)和 Exchange failed,在消费者端使用 SOAP 错误(而非例外),则 org.apache.camel.Message#isFault ()上的 fault 标志将作为带有键 JmsConstants#JMSTRANSFER_ULT 的 JMS 标头发回。如果客户端是 Camel,则返回的 fault 标志将在 org.apache.camel.Message#setFault (布尔值)上设置。在使用支持故障的 Camel 组件(如 cxf 或 spring-ws)时,您可能需要启用此功能。

false

布尔值

camel.component.jms.configuration.use-message-i-d-as-correlation-i-d

指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。

false

布尔值

camel.component.jms.configuration.username

用于 ConnectionFactory 的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

camel.component.jms.configuration.wait-for-provision-correlation-to-be-updated-counter

在对 JMS 进行请求/恢复请求时,等待 provisional 关联 id 会被更新为实际关联 id 的次数,以及选项 useMessageIDAsCorrelationID。

50

整数

Camel.component.jms.configuration.wait-for-provision-correlation-to-be-updated-thread-sleeping-time

millis 在等待 provisional correlation id 被更新期间,每次处于睡眠状态的时间间隔。

100

Long

camel.component.jms.connection-factory

要使用的连接工厂。必须在组件或端点上配置连接工厂。选项是一个 javax.jms.ConnectionFactory 类型。

 

字符串

camel.component.jms.correlation-property

使用此 JMS 属性将消息与 InOut Exchange 模式(request-reply)而不是 JMSCorrelationID 属性关联。这样,您可以使用 JMSCorrelationID JMS 属性将消息与不关联消息的系统交换。如果未使用 JMSCorrelationID,则 Camel 将不会被使用或设置。如果未在同一名称下的消息标题中提供,则生成此指定属性的值。

 

字符串

camel.component.jms.default-task-executor-type

指定在 DefaultMessageListenerContainer 中使用哪些默认 TaskExecutor 类型,用于使用者端点和制作者端点的 ReplyTo consumer。可能的值有: SimpleAsync (使用 Spring 的 SimpleAsyncTaskExecutor)或 ThreadPool (使用具有最优值的 Spring 的 ThreadPoolTaskExecutor)。如果没有设置,则默认为之前的行为,它将缓存的线程池用于消费者端点和 SimpleAsync 回复消费者消费者。建议使用 ThreadPool 以减少弹性配置中的线程回收,并动态增加和减少并发用户。

 

DefaultTaskExecutor Type

camel.component.jms.delivery-mode

指定要使用的交付模式。可能的值可能是 javax.jms.DeliveryMode 定义的值。NON_PERSISTENT = 1 和 PERSISTENT = 2.

 

整数

camel.component.jms.delivery-persistent

指定是否默认使用持久交付。

true

布尔值

camel.component.jms.destination-resolver

可插拔 org.springframework.jms.support.destination.DestinationResolver,允许您使用自己的解析器(例如,在 JNDI 注册表中查找真实目的地)。选项是一个 org.springframework.jms.support.destination.DestinationResolver 类型。

 

字符串

camel.component.jms.durable-subscription-name

指定持久主题订阅的持久订阅者名称。还必须配置 clientId 选项。

 

字符串

camel.component.jms.eager-loading-of-properties

在加载消息时立即加载 JMS 属性,因为可能不需要 JMS 属性,但有时可能会遇到底层 JMS 提供程序及使用 JMS 属性的早期问题。

false

布尔值

camel.component.jms.enabled

启用 jms 组件

true

布尔值

camel.component.jms.error-handler

指定在处理消息时出现任何意外异常时要调用的 org.springframework.util.ErrorHandler。默认情况下,如果没有配置错误处理程序,则这些异常会记录在 WARN 级别。您可以配置日志记录级别,以及是否应使用 errorHandlerLoggingLevel 和 errorHandlerLogStackTrace 选项记录堆栈追踪。这样可以更容易配置,而不是对自定义错误处理程序进行编码。选项是一个 org.springframework.util.ErrorHandler 类型。

 

字符串

camel.component.jms.error-handler-log-stack-trace

允许控制是否应该记录堆栈追踪,默认错误处理程序。

true

布尔值

camel.component.jms.error-handler-logging-level

允许配置默认错误处理程序日志记录级别,以记录异常。

 

LoggingLevel

camel.component.jms.exception-listener

指定任何底层 JMS 异常通知的 JMS Exception Listener。选项是 javax.jms.ExceptionListener 类型。

 

字符串

camel.component.jms.explicit-qos-enabled

设定在发送消息时应使用 deliveryMode、priority 或 timeToLive 服务质量。这个选项基于 Spring 的 JmsTemplate。deliveryMode、priority 和 timeToLive 选项应用到当前的端点。这与 preserveMessageQos 选项不同,该选项以消息粒度运行,从 Camel In message 标头专门读取 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 标准进行格式化。

false

布尔值

camel.component.jms.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.jms.idle-consumer-limit

指定允许在任何给定时间闲置的用户数量的限制。

1

整数

camel.component.jms.idle-task-execution-limit

指定接收任务的空闲执行的限制,没有在其执行过程中收到任何信息。如果达到这个限制,任务将关闭并离开其他执行任务(在出现动态调度的情况下),请参阅 maxConcurrentConsumers 设置。Spring 还有额外的文档。

1

整数

camel.component.jms.include-all-j-m-s-x-properties

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

camel.component.jms.include-sent-j-m-s-message-i-d

仅适用于使用 InOnly 发送到 JMS 目的地(请触发和忘记)。启用此选项将丰富的 Camel Exchange 与 JMS 客户端在消息发送到 JMS 目的地时使用的实际 JMSMessageID 一起丰富。

false

布尔值

camel.component.jms.jms-key-format-strategy

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了两个开箱即用的实现:默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。选项是一个 org.apache.camel.component.jms.JmsKeyFormatStrategy 类型。

 

字符串

camel.component.jms.jms-operations

允许您使用自己实施 org.springframework.jms.core.JmsOperations 接口。Camel 使用 JmsTemplate 作为默认值。可用于测试目的,但不如 spring API 文档中所述。选项是一个 org.springframework.jms.core.JmsOperations 类型。

 

字符串

camel.component.jms.lazy-create-transaction-manager

如果为 true,如果选项 transacted=true 中没有注入事务管理器,Camel 会创建一个 JmsTransactionManager。

true

布尔值

camel.component.jms.map-jms-message

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。如需了解更多详细信息,请参阅下面映射如何工作的部分。

true

布尔值

camel.component.jms.max-concurrent-consumers

指定来自 JMS 时的最大并发用户数(不用于请求/相对 JMS)。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。当执行请求/相对于 JMS 时,选项 replyToMaxConcurrentConsumers 用于控制回复消息监听器上的并发用户数量。

 

整数

camel.component.jms.max-messages-per-task

每个任务的消息数量。-1 代表无限。如果您为并发使用者使用范围(如 min max),则此选项可用于将值设置为 eg 100 来控制在不需要较少工作时消费者的快速程度。

-1

整数

camel.component.jms.message-converter

要使用自定义的 Spring org.springframework.jms.support.converter.MessageConverter,以便您可以控制如何映射到 javax.jms.Message。选项是一个 org.springframework.jms.support.converter.MessageConverter 类型。

 

字符串

camel.component.jms.message-created-strategy

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。选项是一个 org.apache.camel.component.jms.MessageCreatedStrategy 类型。

 

字符串

camel.component.jms.message-id-enabled

发送时,指定是否应添加消息 ID。这只是 JMS Broker 的提示。如果 JMS 提供程序接受此提示,这些消息必须将消息 ID 设置为 null;如果提供程序忽略 hint,则消息 ID 必须设置为其正常的唯一值

true

布尔值

camel.component.jms.message-timestamp-enabled

指定在发送消息时是否应默认启用时间戳。

true

布尔值

camel.component.jms.password

要用于 ConnectionFactory 的密码。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

camel.component.jms.preserve-message-qos

设置为 true,如果要使用消息中指定的 QoS 设置发送消息,而不是 JMS 端点上的 QoS 设置。以下三个标头被视为 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或部分功能。如果没有提供,Camel 将回退为使用来自端点的值。因此,在使用这个选项时,标头会覆盖端点中的值。相反,显式QosEnabled 选项只会使用在端点上设置的选项,而不是消息标头中的值。

false

布尔值

camel.component.jms.priority

高于 1 的值在发送时指定消息优先级(其中 0 是最低优先级),以及 9 是最高优先级。还必须启用显式QosEnabled 选项,才能使此选项生效。

4

整数

camel.component.jms.pub-sub-no-local

指定是否禁止交付其自身连接发布的消息。

false

布尔值

camel.component.jms.queue-browse-strategy

在浏览队列时使用自定义 QueueBrowseStrategy。选项是一个 org.apache.camel.component.jms.QueueBrowseStrategy 类型。

 

字符串

camel.component.jms.receive-timeout

接收消息的超时时间(以毫秒为单位)。

1000

Long

camel.component.jms.recovery-interval

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

Long

camel.component.jms.reply-on-timeout-to-max-concurrent-consumers

指定在使用 request/reply over JMS 时超时发生时持续路由的并发使用者的最大数量。

1

整数

camel.component.jms.reply-to-cache-level-name

在通过 JMS 进行请求/回复消费者时,按照名称设置缓存级别。这个选项只适用于使用固定的回复队列(而不是临时)。Camel 默认使用:CACHE_CONSUMER 用于独占或共享 w/ replyToSelectorName。以及在没有 replyToSelectorName 的情况下共享的 CACHE_SESSION。有些 JMS 代理(如 IBM WebSphere)可能需要设置 replyToCacheLevelName=CACHE_NONE 才能工作。注:如果使用临时队列,则不允许使用 CACHE_NONE,且必须使用更高的值,如 CACHE_CONSUMER 或 CACHE_SESSION。

 

字符串

camel.component.jms.reply-to-concurrent-consumers

指定在进行请求/相对于 JMS 时的默认并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

1

整数

camel.component.jms.reply-to-max-concurrent-consumers

指定在 JMS 中使用请求/回复时的最大并发用户数量。另请参阅 maxMessagesPerTask 选项来控制线程的动态扩展/关闭。

 

整数

camel.component.jms.reply-to-type

允许显式指定在进行请求/恢复 JMS 时用于回复队列的策略。可能的值有:Trimporary、Shared 或 Exclusive。默认情况下,Camel 将使用临时队列。但是,如果已经配置了 replyTo,则默认使用 Shared。此选项允许您使用专用队列而不是共享队列。请参阅 Camel JMS 文档了解更多详情,特别是有关在集群环境中运行时所造成影响的备注,以及共享回复队列的性能比其 alternatives Temporary 和 Exclusive 的性能有不同。

 

ReplyToType

camel.component.jms.request-timeout

在使用 InOut Exchange Pattern (以毫秒为单位)时等待回复的超时。默认值为 20 秒。您可以包含标头 CamelJmsRequestTimeout 来覆盖此端点配置的超时值,因此每个消息单独的超时值。另请参阅 requestTimeoutCheckerInterval 选项。

20000

Long

camel.component.jms.request-timeout-checker-interval

配置在通过 JMS 进行请求时,Camel 应该检查超时交换的频率。默认情况下,Camel 会检查每秒一次。但是,如果发生超时时您必须更快地做出反应,那么您可以降低这个间隔,以更频繁地检查。超时由选项 requestTimeout 决定。

1000

Long

camel.component.jms.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.jms.stream-message-type-enabled

设定是否启用 StreamMessage 类型。消息有效负载的流传输类型(如文件、InputStream 等)将作为 BytesMessage 或 StreamMessage 发送。此选项控制将使用哪一种类型。默认情况下使用 BytesMessage,它强制读取到内存中的完整消息有效负载。通过启用此选项,消息有效负载在块中读取到内存中,每个块都会写入 StreamMessage,直到没有更多数据。

false

布尔值

camel.component.jms.subscription-durable

设置是否使订阅持久。要使用的持久订阅名称可以通过 subscriptionName 属性指定。默认为 false。将其设置为 true 以注册持久的订阅,通常与 subscriptionName 值结合使用(除非您的消息监听器类名称足够好作为订阅名称)。只有侦听主题(pub-sub 域)时,这种方法才会切换到 pubSubDomain 标志。

false

布尔值

camel.component.jms.subscription-name

设置要创建的订阅的名称。要应用一个带有共享或 durable 订阅的主题(pub-sub 域)。订阅名称需要在这个客户端的 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.task-executor

允许您指定自定义任务 executor 来使用消息。选项是一个 org.springframework.core.task.TaskExecutor 类型。

 

字符串

camel.component.jms.test-connection-on-startup

指定是否在启动时测试连接。这可确保当 Camel 启动时,所有 JMS 用户都具有与 JMS 代理的有效连接。如果无法授予连接,Camel 会在启动时抛出异常。这样可确保 Camel 没有启动失败的连接。JMS 生产商也进行了测试。

false

布尔值

camel.component.jms.time-to-live

发送消息时,指定消息的时间(以毫秒为单位)。

-1

Long

camel.component.jms.transacted

指定是否使用翻译模式

false

布尔值

camel.component.jms.transaction-manager

要使用的 Spring 事务管理器。选项是一个 org.springframework.transaction.PlatformTransactionManager 类型。

 

字符串

camel.component.jms.transaction-name

要使用的事务的名称。

 

字符串

camel.component.jms.transaction-timeout

事务的超时值(以秒为单位)。

-1

整数

camel.component.jms.transfer-exception

如果启用并且您正在使用 Request Reply messaging (InOut),并且一个 Exchange 在使用者端失败,则会导致 Exception 发回为 javax.jms.ObjectMessage。如果客户端是 Camel,则返回的 Exception 会被重新箭头。这样,您可以使用 Camel JMS 作为路由中的网桥 - 例如,使用持久性队列来启用可靠的路由。请注意,如果您也启用了 transferExchange,则此选项将具有优先权。请注意的异常需要是序列化的。使用者端的原始例外可以包装在外部异常中,如 org.apache.camel.RuntimeCamelException (返回到制作者)。

false

布尔值

camel.component.jms.transfer-exchange

您可以通过线路传输交换,而不只是正文和标头。传输以下字段如下:正文、出站正文、容错正文、入口、出口标头、容错标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。您必须在制作者和消费者端启用此选项,因此 Camel 知道有效负载是 Exchange,而非常规有效负载。

false

布尔值

camel.component.jms.transfer-fault

如果启用且您使用 Request Reply messaging (InOut)和 Exchange failed,在消费者端使用 SOAP 错误(而非例外),则 org.apache.camel.Message#isFault ()上的 fault 标志将作为带有键 JmsConstants#JMSTRANSFER_ULT 的 JMS 标头发回。如果客户端是 Camel,则返回的 fault 标志将在 org.apache.camel.Message#setFault (布尔值)上设置。在使用支持故障的 Camel 组件(如 cxf 或 spring-ws)时,您可能需要启用此功能。

false

布尔值

camel.component.jms.use-message-i-d-as-correlation-i-d

指定 JMSMessageID 是否应该始终用作 InOut 消息的 JMSCorrelationID。

false

布尔值

camel.component.jms.username

用于 ConnectionFactory 的用户名。您还可以直接在 ConnectionFactory 上配置用户名/密码。

 

字符串

camel.component.jms.wait-for-provision-correlation-to-be-updated-counter

在对 JMS 进行请求/恢复请求时,等待 provisional 关联 id 会被更新为实际关联 id 的次数,以及选项 useMessageIDAsCorrelationID。

50

整数

camel.component.jms.wait-for-provision-correlation-to-be-updated-thread-sleeping-time

millis 在等待 provisional correlation id 被更新期间,每次处于睡眠状态的时间间隔。

100

Long

camel.component.jms.configuration.transacted-in-out

  

布尔值

179.6. Samples

JMS 也用于其他组件的多个示例。但我们提供下面几个示例以便开始。

179.6.1. 从 JMS 接收

在以下示例中,我们配置了一个接收 JMS 消息的路由,并将消息路由到 POJO:

from("jms:queue:foo").
   to("bean:myBusinessLogic");

您可以使用任何 EIP 模式,以便路由可以基于上下文。例如,以下示例可以针对大东器过滤一个订单主题:

from("jms:topic:OrdersTopic").
  filter().method("myBean", "isGoldCustomer").
  to("jms:queue:BigSpendersQueue");

179.6.2. 发送到 JMS

在以下示例中,我们轮询一个文件文件夹,并将文件内容发送到 JMS 主题。我们希望文件内容作为 TextMessage 而不是一个 BytesMessage,我们需要将正文转换为 String

from("file://orders").
  convertBodyTo(String.class).
  to("jms:topic:OrdersTopic");

179.6.3. 使用注解

Camel 还带有注解,因此您可以使用 POJO Consuming 和 POJO Prod 生成。

179.6.4. Spring DSL 示例

前面的示例使用 Java DSL。Camel 还支持 Spring XML DSL。以下是使用 Spring DSL 的大开支示例:

<route>
  <from uri="jms:topic:OrdersTopic"/>
  <filter>
    <method bean="myBean" method="isGoldCustomer"/>
    <to uri="jms:queue:BigSpendersQueue"/>
  </filter>
</route>

179.6.5. 其他示例

JMS 会出现在其他组件和 EIP 模式的多个示例中,以及 Camel 文档。因此,您可以浏览文档。

179.6.6. 使用 JMS 作为 Dead Letter Queue store Exchange

通常,当使用 JMS 作为传输时,它只会传输正文和标头作为有效负载。如果您想将 JMSDead Letter Channel 搭配使用,请将 JMS 队列用作 Dead Letter Queue,则通常会将原因 Exception 存储在 JMS 消息中。但是,您可以使用 JMS 死信队列上的 transferExchange 选项指示 Camel 将整个 Exchange 存储在队列中,作为包含所有 org.apache.camel.impl . DefaultExchangeHolder 的 org.apache.camel.impl.DefaultExchangeHolder。这样,您可以从 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();

179.6.7. 使用 JMS 作为 Dead Letter Channel 只存储错误

您可以使用 JMS 存储导致的错误消息或存储自定义正文,您可以自行初始化。以下示例使用 Message Translator EIP 在移到 JMS dead letter 队列前对失败的交换进行转换:

// 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 上调用方法或使用自定义处理器。

179.6.8. 使用 JMS 指定消费者优先级

某些代理(特别是 Artemis)允许您为您要发送的消息指定使用者优先级。在以下示例中,我们使用 artemisConsumerPriority 属性根据优先级转换消息。

<camelContext id="jms-basic-consumer-priority" xmlns="http://camel.apache.org/schema/spring" autoStartup="true">
		<endpoint id="highPriorityQueue" uri="jms:queue:inputQueue?artemisConsumerPriority=1000"/>
		<endpoint id="mediumPriorityQueue" uri="jms:queue:inputQueue?artemisConsumerPriority=500"/>
		<endpoint id="lowPriorityQueue" uri="jms:queue:inputQueue?artemisConsumerPriority=1"/>

		<endpoint id="resultQueue" uri="jms:queue:outputQueue"/>

		<route>
			<from uri="ref:highPriorityQueue"/>
			<transform>
				<simple>High</simple>
			</transform>
			<to uri="ref:resultQueue"/>
		</route>
		<route>
			<from uri="ref:mediumPriorityQueue"/>
			<transform>
				<simple>Medium</simple>
			</transform>
			<to uri="ref:resultQueue"/>
		</route>
		<route>
			<from uri="ref:lowPriorityQueue"/>
			<transform>
				<simple>Low</simple>
			</transform>
			<to uri="ref:resultQueue"/>
		</route>
	</camelContext>

179.7. JMS 和 Camel 之间的消息映射

Camel 自动映射 javax.jms.Messageorg.apache.camel.Message 的消息。

发送 JMS 消息时,Camel 会将消息正文转换为以下 JMS 消息类型:

正文类型JMS 消息注释

字符串

javax.jms.TextMessage

 

org.w3c.dom.Node

javax.jms.TextMessage

DOM 将转换为 字符串

Map

javax.jms.MapMessage

 

java.io.Serializable

javax.jms.ObjectMessage

 

byte[]

javax.jms.BytesMessage

 

java.io.File

javax.jms.BytesMessage

 

java.io.Reader

javax.jms.BytesMessage

 

java.io.InputStream

javax.jms.BytesMessage

 

java.nio.ByteBuffer

javax.jms.BytesMessage

 

在收到 JMS 消息时,Camel 会将 JMS 消息转换为以下正文类型:

JMS 消息正文类型

javax.jms.TextMessage

字符串

javax.jms.BytesMessage

byte[]

javax.jms.MapMessage

map<String, Object>

javax.jms.ObjectMessage

对象

179.7.1. 禁用 JMS 消息的自动映射

您可以使用 mapJmsMessage 选项禁用上面的自动映射。如果禁用,Camel 不会尝试映射收到的 JMS 消息,而是直接将其用作载荷。这样,您可以避免映射开销,并让 Camel 仅通过 JMS 消息。例如,它甚至允许您通过 classpath 上的类路由 javax.jms.ObjectMessage JMS 消息。

179.7.2. 使用自定义消息Converter

您可以使用 messageConverter 选项在 Spring org.springframework.jms.support.converter 类中自行执行映射。

例如,在下面的路由中,在发送消息到 JMS 顺序队列时,我们使用自定义消息转换器:

from("file://inbox/order").to("jms:queue:order?messageConverter=#myMessageConverter");

在使用来自 JMS 目的地时,也可以使用自定义消息转换器。

179.7.3. 控制所选的映射策略

您可以使用端点 URL 上的 jmsMessageType 选项,以强制所有消息的具体消息类型。

在以下路由中,我们轮询一个文件夹中的文件,并将它们作为 javax.jms.TextMessage 发送到 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 中定义。

179.8. 发送时的消息格式

通过 JMS 线路发送的交换必须符合 JMS Message spec

对于 exchange.in.header,以下规则适用于标头

  • JMSJMSX 开头的密钥被保留。
  • Exchange.in.headers 键必须是文字,且所有有效的 Java 标识符(不要在键名称中使用点)。
  • 当使用 JMS 消息:
    时,Camel 替换了点和连字符以及反向替换 当 Camel 消耗消息时,Camel 会被 HYPHEN 替换。
    -HYPHEN 替换,并在 Camel 使用消息时反向替换。
  • 另请参阅 jmsKeyFormatStrategy 选项,它允许使用您自己的自定义策略格式化密钥。

对于 exchange.in.header,以下规则适用于 标头值

  • 该值必须是原语或其计数器对象(如 IntegerLongCharacter)。类型、StringCharSequenceDate、bigD ecimal 和 BigInteger 都被转换为 String () 表示。所有其他类型被丢弃。

如果 Camel 丢弃了给定标头值,则 Camel 会记录类别 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}

179.9. 获得时的消息格式

Camel 在收到消息时为 Exchange 添加以下属性:

属性类型描述

org.apache.camel.jms.replyDestination

javax.jms.Destination

答复目的地。

Camel 在收到 JMS 消息时,向 In 消息标头添加以下 JMS 属性:

标头类型描述

JMSCorrelationID

字符串

JMS 关联 ID。

JMSDeliveryMode

int

JMS 交付模式。

JMSDestination

javax.jms.Destination

JMS 目的地。

JMSExpiration

long

JMS 过期。

JMSMessageID

字符串

JMS 唯一消息 ID。

JMSPriority

int

JMS 优先级(具有 0 作为最低优先级)和 9 作为最高优先级。

JMSRedelivered

布尔值

是 JMS 消息红色。

JMSReplyTo

javax.jms.Destination

JMS 回复到目的地。

JMSTimestamp

long

JMS 时间戳。

JMSType

字符串

JMS 类型。

JMSXGroupID

字符串

JMS 组 ID。

由于以上所有信息都是标准的 JMS,您可以检查 JMS 文档 了解更多详情。

179.10. 关于使用 Camel 发送和接收消息和 JMSReplyTo

JMS 组件很复杂,您必须关注它在一些情况下的运作方式。这是查找的部分区域/位置的简短概述。

当 Camel 使用其 JMSProducer 发送消息时,它会检查以下条件:

  • 消息交换模式,
  • JMSReplyTo 在端点或消息标头中设置,
  • 是否在 JMS 端点上设置了以下选项: disableReplyTo保留MessageQos , explicitQo sEnabled

所有这些都可能比较复杂,可以理解和配置以支持您的用例。

179.10.1. JmsProducer

JmsProducer 的行为如下,具体取决于配置:

Exchange Pattern其他选项描述

InOut

-

Camel 将期望一个回复,设置一个临时的 JMSReplyTo,并在发送消息后,它将开始侦听临时队列上的回复消息。

InOut

JMSReplyTo 设置

Camel 将期望一个回复,在发送消息后,它将开始侦听指定的 JMSReplyTo 队列上的回复消息。

InOnly

-

Camel 将发送消息,但并不能 预期回复。

InOnly

JMSReplyTo 设置

默认情况下,Camel 会丢弃 JMSReplyTo 目标,并在发送消息前清除 JMSReplyTo 标头。然后,Camel 会发送消息,并不会 预期回复。Camel 在 WARN 级别的日志中记录(Dchanged to DEBUG 级别,从 Camel 2.6 开始)。您可以使用 keep MessageQuo=true 来指示 Camel 保持 JMSReplyTo。在所有情况下,JmsProducer 并不 预期任何回复,因此在发送消息后继续继续。

179.10.2. JmsConsumer

JmsConsumer 的行为如下,具体取决于配置:

Exchange Pattern其他选项描述

InOut

-

Camel 将向 JMSReplyTo 队列发送回复。

InOnly

-

Camel 不会发回回复,因为模式仅是 InOnly

-

disableReplyTo=true

此选项可阻止回复。

请注意交换上设置的消息交换模式。

如果您在路由中间向 JMS 目标发送一条消息,您可以指定要使用的交换模式,请参阅 Request Reply。
如果您要向 JMS 主题发送 InOnly 信息,这很有用:

from("activemq:queue:in")
   .to("bean:validateOrder")
   .to(ExchangePattern.InOnly, "activemq:topic:order")
   .to("bean:handleOrder");

179.11. 重复使用端点,并在运行时发送到不同目的地

如果您需要发送消息到许多不同的 JMS 目的地,最好重复使用 JMS 端点并在消息标头中指定真实目的地。这允许 Camel 重复相同的端点,但发送到不同的目的地。这可大大减少在内存和线程资源上创建端点的数量并经济。

您可以在以下标头中指定目的地:

标头类型描述

CamelJmsDestination

javax.jms.Destination

目标对象。

CamelJmsDestinationName

字符串

目的地名称。

例如,以下路由显示您可以如何在运行时计算目的地,并使用它覆盖 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。

如果设置了 CamelJmsDestinationCamelJmsDestinationName 标头,CamelJmsDestination 将具有优先权。请记住,JMS 制作者会从交换中删除 CamelJmsDestinationCamelJmsDestinationName 标头,并且不将它们传播到创建的 JMS 消息,以避免在路由中出现意外循环(在消息将转发到另一个 JMS 端点时的情况)。

179.12. 配置不同的 JMS 供应商

您可以在 Spring XML 中配置 JMS 供应商,如下所示:

基本上,您可以根据需要配置任意数量的 JMS 组件实例,并使用 id 属性 为它们指定唯一名称。前面的示例配置了 activemq 组件。您可以执行同样的配置 MQSeries、TibCo、BEA、Sonic 等等。

有了命名的 JMS 组件后,就可以使用 URI 引用该组件的端点。例如,对于组件名称 activemq,您可以使用 URI 格式引用目的地,activemq:[queue:|topic:]destinationName。您可以对所有其他 JMS 供应商使用相同的方法。

这由 SpringCamelContext lazily 从 spring 上下文获取您用于 Endpoint URI 的方案名称,并让组件解析端点 URI。

179.12.1. 使用 JNDI 来查找 ConnectionFactory

如果您使用 J2EE 容器,您可能需要查找 JNDI 来查找 JMS ConnectionFactory,而不是在 Spring 中使用常见的 < bean&gt; 机制。您可以使用 Spring 的工厂 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 schema

179.13. 并发假设

JMS 的常见要求是在多个线程中并发使用消息,以便应用更加响应。您可以设置 并发Consumers 选项来指定为 JMS 端点提供服务的线程数量,如下所示:

from("jms:SomeQueue?concurrentConsumers=20").
  bean(MyClass.class);

您可以使用以下方法之一配置这个选项:

  • JmsComponent 处,
  • 在端点 URI 或.
  • 通过在 JmsEndpoint 上直接调用 setConcurrentConsumers ()

179.13.1. 使用 async 消费者的并发假设

请注意,当当前消息被完全处理后,每个并发使用者只会从 JMS 代理获取下一个可用消息。您可以将选项 asyncConsumer=true 设置为让使用者从 JMS 队列中获取下一消息,而前面的消息则会被异步处理(通过异步路由引擎)。有关 asyncConsumer 选项,请参阅页面顶部的更详细的信息。

from("jms:SomeQueue?concurrentConsumers=20&asyncConsumer=true").
  bean(MyClass.class);

179.14. 对 JMS 的请求

Camel 支持通过 JMS 重新请求。在向 JMS 队列发送消息时,交换的 MEP 应处于 out Out 状态。

Camel 提供多种选项来配置请求/相对于 JMS,这会影响性能和集群环境。下表总结了 选项。

选项性能集群描述

临时

速度快

临时队列用作回复队列,并由 Camel 自动创建。要使用此目的,不要指定 一个 replyTo 队列名称。您可以选择性地配置 replyToType=Temporary,使其使用默认的临时队列。

共享

速度较慢

共享持久队列用作回复队列。队列必须预先创建,虽然有些代理可以在 Apache ActiveMQ 等时创建它们。要使用此目的,您必须指定 replyTo 队列名称。您可以选择配置 replyToType=Shared,使其代表使用共享队列。在具有多个同时运行此 Camel 应用程序的节点的集群环境中,可以使用共享队列。所有都使用相同的共享回复队列。这是因为 JMS 消息选择器用于关联预期的回复消息;这会影响性能。JMS 消息选择器的速度较慢,因此随着 TemporaryExclusive 队列而快速。查看如何调整它以提高性能。

独占

速度快

否(*是)

独占持久队列被用作回复队列。队列必须预先创建,虽然有些代理可以在 Apache ActiveMQ 等时创建它们。要使用此目的,您必须指定 replyTo 队列名称。您还必须配置 replyTo Type=Exclusive,以指示 Camel 使用独占队列,因为如果配置了回复队列名称,则默认使用 Shared。使用专用回复队列时,JMS 消息选择器不使用,因此其他应用不得使用该队列。在同时运行此 Camel 应用程序的多个节点的集群环境中 无法使用 独占队列;因为我们没有控制该回复队列回发送请求消息的同一节点;这就是为什么共享队列使用 JMS 消息选择器来确保这一点。虽然 如果您配置了每个节点的唯一名称,但您可以在集群环境中运行这个队列。然后,回复消息将发回给定节点的该队列,该队列等待回复消息。

concurrentConsumers

速度快

Camel 2.10.3: 允许使用并发消息监听程序来同时处理消息。您可以使用 并发Consumers 和 maxConcurrentConsumer s 选项指定一个范围。注意: 使用共享 回复队列可能不适用于并发监听器,因此请小心使用这个选项。

maxConcurrentConsumers

速度快

Camel 2.10.3: 允许使用并发消息监听程序来同时处理消息。您可以使用 并发Consumers 和 maxConcurrentConsumer s 选项指定一个范围。注意: 使用共享 回复队列可能不适用于并发监听器,因此请小心使用这个选项。

JmsProducer 检测了 InOut,并提供要使用的回复目的地的 JMSReplyTo 标头。默认情况下,Camel 使用临时队列,但您可以使用端点上的 replyTo 选项指定固定的回复队列(请参阅以下关于固定回复队列的更多信息)。

Camel 将自动设置侦听回复队列的使用者,因此 您不应 进行任何操作。
此使用者是一个 Spring DefaultMessageListenerContainer,用于侦听回复。但是,它被修复为 1 个并发使用者。
这意味着回复将按顺序处理,因为只有 1 个线程处理回复。如果您想要更快地处理回复,那么我们需要使用并发。但不使用 并发Consumer 选项。我们应该使用 Camel DSL 中的 线程,如以下路由所示:

如果使用 Camel 2.10.3 或者更好的,而不是使用线程,然后使用并发Consumers 选项。请参见下文。

from(xxx)
.inOut().to("activemq:queue:foo")
.threads(5)
.to(yyy)
.to(zzz);

在该路由中,我们指示 Camel 使用具有 5 个线程的线程池异步路由回复。

Camel 2.10.3 开始,您可以使用并发 Consumers 和 maxConcurrentConsumers 选项将侦听器配置为使用并发 线程。这可让您在 Camel 中更轻松地配置它,如下所示:

from(xxx)
.inOut().to("activemq:queue:foo?concurrentConsumers=5")
.to(yyy)
.to(zzz);

179.14.1. 请求 - 在 JMS 上,使用共享的固定回复队列

如果您在执行 Request Reply over JMS 时使用固定回复队列,如以下示例所示,请留意。

from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar")
.to(yyy)

在这个示例中,使用名为 "bar" 的固定回复队列。默认情况下,Camel 假定在使用固定回复队列时共享队列,因此它使用 JMSSelector 来仅提取预期的回复消息(例如,基于 JMSCorrelationID)。请参见下一节,了解独占固定的回复队列。这意味着它不像临时队列一样快。您可以使用 receiveTimeout 选项加快 Camel 将拉取的回复消息的频率。默认情况下,其 1000 millis。因此,更快地将其设置为 250 次,以每秒拉取 4 次,如下所示:

from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&receiveTimeout=250")
.to(yyy)

请注意,这将导致 Camel 将拉取请求更频繁地发送到消息代理,因此需要更多的网络流量。
通常建议尽可能使用临时队列。

179.14.2. 请求 - 在 JMS 上,使用专用的固定回复队列

作为 Camel 2.9 提供。

在上例中,Camel 会预测名为"bar"的固定回复队列是共享的,因此它使用 JMSSelector 来仅使用它预期的回复消息。但是,因为 JMS selectos 速度较慢,所以这样做的缺点。另外,回复队列中的消费者在使用新的 JMS 选择器 ID 进行更新时会慢。实际上,它只有在 receiveTimeout 选项超时时才会更新,默认为 1 秒。因此,在理论上,可以发现回复信息,大约需要检测到 1 sec。如果固定的回复队列专用于 Camel 回复消费者,我们可以避免使用 JMS 选择器,从而更高性能。事实上,就像使用临时队列一样快。在 Camel 2.9 开始,我们引入了 ReplyToType 选项,您可以将其配置为 排除
,以告知 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)

如果在集群环境中运行,同样适用。然后,集群中的每个节点都必须使用唯一的回复队列名称。否则,集群中的每个节点都可以选择预期在另一个节点上回复的信息。对于集群环境,建议您使用共享回复队列。

179.15. 在发件人和接收器之间同步时钟

在系统间进行消息传递时,需要系统同步时钟。例如,在发送 JMS 消息时,您可以将消息上的时间设置为 live 值。然后,接收器可以检查这个值,并确定信息是否已过期,因此丢弃消息而不是消耗和处理它。但是,这需要 sender 和 receiver 都有同步时钟。如果使用 ActiveMQ,则可使用 timestamp 插件 同步时钟。

179.16. 关于生存时间

先阅读以上有关同步时钟的上方。

当您通过 Camel 与 JMS 进行请求/恢复(InOut)时,Camel 在发送方一侧使用超时,这是来自 requestTimeout 选项中的 20 秒。您可以通过设置 higher/lower 值来控制这一点。但是,在 JMS 消息上仍设置时间为 live 值。要求在系统间同步时钟。如果没有,您可能要禁用要设置的实时值。现在,可以使用 Camel 2.8disableTimeToLive 选项。因此,如果您将此选项设置为 disableTimeToLive=true Camel 在发送 JMS 消息时不会将任何时间设置为 live 值。但是,请求超时仍然活跃。因此,如果您对 JMS 进行请求/恢复并禁用了生存时间,则 Camel 仍将使用 20 秒超时( requestTimeout 选项)。该选项也可以配置。因此,两个选项 requestTimeoutdisableTimeToLive 为您提供对请求/给予给予的细粒度控制。

Camel 2.13/2.12.3 开始,您可以在消息中提供标头来覆盖并使用 作为请求超时值,而不是端点配置的值。例如:

   from("direct:someWhere")
     .to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
     .to("bean:processReply");

在上面的路由中,我们有一个端点配置的 requestTimeout 为 30 秒。因此,Camel 将等待 30 秒,以便该回复消息回到 bar 队列上。如果未收到回复消息,则 Exchange 和 Camel 设置了 org.apache.camel.ExchangeTimedOutException,然后因为例外情况而失败,Camel 错误处理程序才会响应。

如果要使用每条消息超时值,则可以使用键 org.apache.camel.component.jms.JmsConstants#JMS_REQUEST_TIMEOUT s#JMS_REQUEST_TIMEOUT 设置标头,其值为 "CamelJmsRequestTimeout",其超时值为长类型。

例如,我们可以使用 bean 计算每个单个消息的超时值,例如在 service 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 sec。设置 timeToLive=5000。可以使用 option disableTimeToLive 选项,强制禁用时间为 live,也用于 InOnly messaging。requestTimeout 选项不用于 InOnly 消息传递。

179.17. 启用 Transacted Consumption

常见的要求是使用事务中的队列,然后使用 Camel 路由处理消息。要做到这一点,请确定在 component/endpoint 上设置以下属性:

  • transacted = true
  • transactionManager = Transsaction Manager - 通常 JmsTransactionManager

详情请查看 Transactional Client EIP 模式。

JMS 的事务和 [Request Reply]

当对 JMS 使用 Request Reply over JMS 时,您不能使用一个事务;JMS 不会在执行提交前发送任何消息,因此服务器侧不会在所有事务提交之前接收任何内容。因此,若要使用 Request Reply,您必须在发送请求后提交事务,然后使用单独的事务来接收响应。

要解决这个问题,JMS 组件使用不同的属性来指定事务用于单向消息传递和请求回复消息传递:

transacted 属性 仅适用于 In Only message Exchange Pattern (MEP)。

transactedInOut 属性应用到 InOut (Request Reply)消息交换模式(MEP)。

如果您想将事务用于 请求(InOut MEP),您必须设置 transactedInOut=true

可从 Camel 2.10 开始

您可以使用 component/endpoint 上的以下属性利用 DMLC transact 的会话 API

  • transacted = true
  • lazyCreateTransactionManager = false

这样做的好处是,在使用本地事务时,将遵循 cacheLevel 设置,而无需配置事务管理器。当配置了 TransactionManager 时,在 DMLC 级别不会发生缓存,因此需要依赖于池的连接工厂。有关此类型设置的详情,请查看 此处此处

179.18. 使用 JMSReplyTo 进行延迟的回复

当将 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 属性中提供 回复 对象。然后 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.");
    }
}

179.19. 使用请求超时

在以下示例中,我们发送 Request Reply 风格的消息 Exchange (我们使用 requestBody 方法 = InOut)到 Camel 中进一步处理的队列,并等待返回回复:

179.20. Samples

JMS 也用于其他组件的多个示例。但我们提供下面几个示例以便开始。

179.20.1. 从 JMS 接收

在以下示例中,我们配置了一个接收 JMS 消息的路由,并将消息路由到 POJO:

   from("jms:queue:foo").
     to("bean:myBusinessLogic");

您可以使用任何 EIP 模式,以便路由可以基于上下文。例如,以下示例可以针对大东器过滤一个订单主题:

from("jms:topic:OrdersTopic").
  filter().method("myBean", "isGoldCustomer").
    to("jms:queue:BigSpendersQueue");

179.20.2. 发送到 JMS

在以下示例中,我们轮询一个文件文件夹,并将文件内容发送到 JMS 主题。我们希望文件内容作为 TextMessage 而不是一个 BytesMessage,我们需要将正文转换为 String

from("file://orders").
  convertBodyTo(String.class).
  to("jms:topic:OrdersTopic");

179.20.3. 使用注解

Camel 还带有注解,因此您可以使用 POJO Consuming 和 POJO Prod 生成。

179.20.4. Spring DSL 示例

前面的示例使用 Java DSL。Camel 还支持 Spring XML DSL。以下是使用 Spring DSL 的大开支示例:

<route>
  <from uri="jms:topic:OrdersTopic"/>
  <filter>
    <method bean="myBean" method="isGoldCustomer"/>
    <to uri="jms:queue:BigSpendersQueue"/>
  </filter>
</route>

179.20.5. 其他示例

JMS 会出现在其他组件和 EIP 模式的多个示例中,以及 Camel 文档。因此,您可以浏览文档。如果您有时间,请查看使用 JMS 的教程,但重点讲授良好的 Springmoting 和 Camel 协同工作,规范 Jutorial-JmsRemoting。

179.20.6. 使用 JMS 作为 Dead Letter Queue store Exchange

通常,当使用 JMS 作为传输时,它只会传输正文和标头作为有效负载。如果您想将 JMSDead Letter Channel 搭配使用,请将 JMS 队列用作 Dead Letter Queue,则通常会将原因 Exception 存储在 JMS 消息中。但是,您可以使用 JMS 死信队列上的 transferExchange 选项指示 Camel 将整个 Exchange 存储在队列中,作为包含所有 org.apache.camel.impl . DefaultExchangeHolder 的 org.apache.camel.impl.DefaultExchangeHolder。这样,您可以从 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();

179.20.7. 使用 JMS 作为 Dead Letter Channel 只存储错误

您可以使用 JMS 存储导致的错误消息或存储自定义正文,您可以自行初始化。以下示例使用 Message Translator EIP 在移到 JMS dead letter 队列前对失败的交换进行转换:

// 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 上调用方法或使用自定义处理器。

179.21. 发送仅限消息并保留 JMSReplyTo 标头

使用 camel-jms 发送到 JMS 目的地时,制作者将使用 MEP 来检测其 InOnlyInOut 消息传递。但是,在有些情况下您需要发送 InOnly 信息,但保留 JMSReplyTo 标头。为此,您必须指示 Camel 将其保留,否则将丢弃 JMSReplyTo 标头。

例如,要将一个 InOnly 消息发送到 foo 队列,但使用 JMSReplyTo,其中有一个带有栏队列的 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 标头。

179.22. 在目的地上设置 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");
    }
});

179.23. 另请参阅

第 180 章 JMX 组件

180.1. Camel JMX

Apache Camel 对 JMX 具有广泛的支持,允许您使用 JMX 客户端监视和控制 Camel 管理的对象。

Camel 还提供了 JMX 组件,允许您订阅 MBean 通知。本页说明了如何使用 JMX 管理和监控 Camel。

180.2. 选项

JMX 组件没有选项。

JMX 端点使用 URI 语法配置:

jmx:serverURL

使用以下路径和查询参数:

180.2.1. 路径名(1 参数):

名称描述默认类型

serverURL

服务器 url 来自剩余的端点。使用平台连接到本地 JVM。

 

字符串

180.2.2. 查询参数(30 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

format (consumer)

消息正文的格式。xml 或 raw。如果 xml,则通知被序列化为 xml。如果原始,则原始 java 对象被设置为正文。

xml

字符串

granularityPeriod (consumer)

轮询 bean 的频率以检查 monitor (仅监控类型)。

10000

long

monitorType (consumer)

要创建的 monitor 类型。字符串、量表、计数器之一(仅限监视器类型)。

 

字符串

objectDomain (consumer)

您要连接的 mbean 的域

 

字符串

objectName (consumer)

您要连接的 mbean 名称密钥。这个值与获取所传递的对象属性相互排斥。

 

字符串

observedAttribute (consumer)

要观察 monitor bean 或 consumer 的属性。

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

executorService (advanced)

将自定义共享线程池用于消费者。默认情况下,每个消耗都有自己的 thread-pool 来处理和路由通知。

 

ExecutorService

handback (advanced)

收到通知时要返回监听程序的值。这个值将放在带有键 jmx.handback 的消息标头中

 

对象

notificationFilter (advanced)

对实现 NotificationFilter 的 Bean 的引用。

 

NotificationFilter

objectProperties (advanced)

对象名称的属性。如果没有设置 objectName param,则将使用这些值

 

map

reconnectDelay (advanced)

尝试重试初始连接建立前等待的秒数,或尝试重新连接丢失的连接

10

int

reconnectOnConnection Failure (advanced)

如果为 true,则使用者将在出现任何连接失败时尝试重新连接到 JMX 服务器。消费者将尝试每 'x' 秒重新建立 JMX 连接,直到连接进行为止 - 其中 'x' 是配置的 reconnectionDelay

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

testConnectionOnStartup (advanced)

如果为 true,如果消费者在启动时无法建立 JMX 连接,将抛出异常。如果为 false,则使用者将每 'x' 秒尝试建立 JMX 连接,直到连接进行 dockerStrategy-where 'x' 是配置的 reconnectionDelay

true

布尔值

notifyDiffer (string)

如果为 true,则当 string 属性与字符串不同的时(字符串监视器或使用者)不同时,将触发通知。在默认情况下,如果已经配置 observed 属性和要比较的字符串,消费者将会通知匹配。

false

布尔值

notifyMatch (string)

如果为 true,则当 string 属性与要比较的字符串匹配时(字符串监视器或使用者)将触发通知。在默认情况下,如果已经配置 observed 属性和要比较的字符串,消费者将会通知匹配。

false

布尔值

stringToCompare (string)

要比较的属性的值(字符串监控器或使用者)。在默认情况下,如果已经配置 observed 属性和要比较的字符串,消费者将会通知匹配。

 

字符串

initThreshold (counter)

monitor 的初始阈值。在通知触发前,值必须超过这个值(仅限计数器监控器)。

 

int

modulus (counter)

计数器重置为零(仅限计数者监视器)的值。

 

int

offset (counter)

超过阈值后(仅限计数器监控器)。

 

int

differenceMode (gauge)

如果为 true,则通知中报告的值与阈值不同,而不是其值本身(仅计数和量表)。

false

布尔值

notifyHigh (gauge)

如果为 true,则量表将在超过高阈值时触发通知(仅gauge monitor)。

false

布尔值

notifyLow (gauge)

如果为 true,则量表将在超过低阈值时触发通知(仅gauge monitor)。

false

布尔值

thresholdHigh (gauge)

量表高阈值(仅gauge monitor)的值。

 

thresholdLow (gauge)

量表低阈值的值(仅类似于 monitor)。

 

密码 (安全)

用于进行远程连接的凭证

 

字符串

user (security)

用于进行远程连接的凭证

 

字符串

180.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.jmx.enabled

启用 jmx 组件

true

布尔值

camel.component.jmx.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

180.4. 在 Camel 中激活 JMX

注意

Camel 2.8 或更早版本需要 Spring JAR 依赖项

spring-context.jarspring-aop.jarspring-beans.jarspring-core.jar 的类路径是 Camel 能够使用 JMX 工具的类路径。如果这些 .jars 不在 classpath 上,Camel 回退到非 JMX 模式。这种情况使用日志记录器名称 org.apache.camel.impl.DefaultCamelContext 记录在 WARN 级别。

Camel 2.9 开始,不再支持 Spring JARs 以 JMX 模式运行 Camel。

180.4.1. 使用 JMX 管理 Apache Camel

默认情况下,Camel 中启用了 JMX 工具代理,这意味着 Camel 运行时会创建并注册 MBean 管理对象及虚拟机中的 MBeanServer 实例。这样,Camel 用户可以立即深入了解 Camel 路由如何执行到单独的处理器级别。

支持的管理对象类型有 端点路由服务和 处理器。其中一些管理对象还会在性能计数器属性外公开生命周期操作。

DefaultManagementNamingStrategy 是默认的命名策略,它构建用于 MBean 注册的对象名称。默认情况下,org.apache.camelCamelNamingStrategy 创建的所有对象名称的域名。MBean 对象的域名可以由 Java VM 系统属性配置:

-Dorg.apache.camel.jmx.mbeanObjectDomainName=your.domain.name

或者,通过在 Spring 配置中添加 camelContext 元素中的 jmxAgent 元素:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <jmxAgent id="agent" mbeanObjectDomainName="your.domain.name"/>
    ...
</camelContext>

Spring 配置始终都优先于系统属性。所有与 JMX 相关的配置都正确。

180.4.2. 在 Camel 中禁用 JMX 工具代理

您可以通过设置 Java 虚拟机系统属性来禁用 JMX 工具代理,如下所示:

-Dorg.apache.camel.jmx.disabled=true

属性值被视为 布尔值

或者,通过在 Spring 配置中添加 camelContext 元素中的 jmxAgent 元素:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <jmxAgent id="agent" disabled="true"/>
    ...
</camelContext>

或者在 Camel 2.1 中,如果使用纯 Java,则它更容易(不必使用 JVM 系统属性),如下所示:

CamelContext camel = new DefaultCamelContext();
camel.disableJMX();

180.4.3. 在 Java 虚拟机中查找 MBeanServer

每个 CamelContext 都可以在 InstrumentationLifecycleStrategy 中嵌套有 InstrumentationAgent 实例。InstrumentationAgent 是接口带有 MBeanServer 来注册 / unregister Camel MBeans 的对象。多个 CamelContexts/InstrumentationAgents 可以 / 应该共享 MBeanServer。默认情况下,Camel 运行时选择 MBeanServer Factory.findMBeanServer 方法(与 org.apache.camel 的默认域名匹配)返回的第一个 MBean Server。

您可能需要更改默认域名,使其与已在应用程序中使用的 MBeanServer 实例匹配。特别是,如果您的 MBeanServer 连接到 JMX 连接器服务器,则不需要在 Camel 中创建连接器服务器。

您可以通过系统属性配置匹配的默认域名。

-Dorg.apache.camel.jmx.mbeanServerDefaultDomain=<your.domain.name>

或者,通过在 Spring 配置中添加 camelContext 元素中的 jmxAgent 元素:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <jmxAgent id="agent" mbeanServerDefaultDomain="your.domain.name"/>
    ...
</camelContext>

如果没有找到匹配的 MBeanServer,则会创建一个新 MBeanServer,并根据上面提到的默认配置设置了新的 'MBeanServer's 默认域名。

当需要设置系统属性来管理 JVM MBeans 时,也可以使用 PlatformMBeanServerMBeanServer 默认域名配置会被忽略,因为它不适用。

小心

从下一个版本(1.5)开始,使用PlatformMBeanServer 的默认值将变为 true。您可以使用 platform MBeanServer 将 属性设置为 false 以禁用。

-Dorg.apache.camel.jmx.usePlatformMBeanServer=True

或者,通过在 Spring 配置中添加 camelContext 元素中的 jmxAgent 元素:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <jmxAgent id="agent" usePlatformMBeanServer="true"/>
    ...
</camelContext>

180.4.4. Camel JMX 支持的系统属性

属性名称value描述

org.apache.camel.jmx

truefalse

如果 为 true,它将在 Camel 中启用 jmx 功能

请参见本节中的更多系统属性: jmxAgent Properties Reference

180.4.5. 如何使用 JMX 验证

JDK 中的 JMX 具有用于身份验证的功能,也用于通过 SSL 使用安全连接。您必须参考 SUN 文档如何使用它:

180.4.6. 应用程序服务器中 JMX

180.4.6.1. Tomcat 6

有关在 Tomcat 中启用 JMX 的详情,请查看 此页面

简而言之,修改您的 catalina.sh (或在 Windows 中 catalina.bat),以设置以下选项…​

 set CATALINA_OPTS=-Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=1099 \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false

180.4.6.2. JBoss AS 4

默认情况下,JBoss 创建了自己的 MBeanServer。要允许 Camel 向同一服务器公开,请按照以下步骤操作:

  1. 告诉 Camel 使用 Platform MBeanServer (在 Camel 1.5 中默认为 true)
<camel:camelContext id="camelContext">
  <camel:jmxAgent id="jmxAgent" mbeanObjectDomainName="org.yourname" usePlatformMBeanServer="true"  />
</camel:camelContext>
  1. 更改您的 JBoss 实例以使用平台 MBeanServer
    通过编辑 run.shrun.conf -Djboss.platform.mbeanserver,将以下属性添加到您的 JAVA_OPTS 中。See http://wiki.jboss.org/wiki/JBossMBeansInJConsole

180.4.6.3. WebSphere

mbeanServerDefaultDomain 更改为 WebSphere

<camel:jmxAgent id="agent" createConnector="true" mbeanObjectDomainName="org.yourname" usePlatformMBeanServer="false" mbeanServerDefaultDomain="WebSphere"/>

180.4.6.4. Oracle OC4j

Oracle OC4J J2EE 应用服务器不允许 Camel 访问平台 MBeanServer。您可以以 Camel 用户身份登录的方式将记录 WARNING

xxx xx, xxxx xx:xx:xx xx org.apache.camel.management.InstrumentationLifecycleStrategy onContextStart
WARNING: Could not register CamelContext MBean
java.lang.SecurityException: Unauthorized access from application: xx to MBean: java.lang:type=ClassLoading
        at oracle.oc4j.admin.jmx.shared.UserMBeanServer.checkRegisterAccess(UserMBeanServer.java:873)

要解决此问题,您应该禁用 Camel 中的 JMX 代理,请参阅 Camel 中禁用 JMX 工具代理的部分

180.4.7. 高级 JMX 配置

Spring 配置文件允许您配置 Camel 如何公开 JMX 以进行管理。在某些情况下,您可以指定更多信息,如连接器的端口或路径名称。

180.4.8. 例如:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <jmxAgent id="agent" createConnector="true" registryPort="2000" mbeanServerDefaultDomain="org.apache.camel.test"/>
    <route>
      <from uri="seda:start"/>
      <to uri="mock:result"/>
    </route>
</camelContext>

如果要更改 Java 5 JMX 设置,您可以使用各种 JMX 系统属性

例如,您可以通过设置以下环境变量(根据平台设置或导出)来启用到 Sun JMX 连接器的远程 JMX 连接。 这些设置仅配置 Java 1.5+ 中的 Sun JMX 连接器,而不配置 Camel 默认创建的 JMX 连接器。

SUNJMX=-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=1616 \
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

(SUNJMX 环境变量由 Camel 的启动脚本简单,作为 JVM 的额外启动参数。如果您直接启动 Camel,则必须自己传递这些参数。

180.4.9. jmxAgent Properties Reference

Spring 属性系统属性默认值描述

id

 

 

JMX 代理名称,它不是可选的

usePlatformMBeanServer

org.apache.camel.jmx.usePlatformMBeanServer

false,true - 版本 1.5 或更高版本

如果为 true,它将使用 JVM 中的 MBeanServer

mbeanServerDefaultDomain

org.apache.camel.jmx.mbeanServerDefaultDomain

org.apache.camel

MBeanServer的默认 JMX 域

mbeanObjectDomainName

org.apache.camel.jmx.mbeanObjectDomainName

org.apache.camel

所有对象名称的 JMX 域

createConnector

org.apache.camel.jmx.createRmiConnect

false

如果我们应该为 MBeanServer创建 JMX 连接器(以允许远程管理)

registryPort

org.apache.camel.jmx.rmiConnector.registryPort

1099

使用 JMX RMI 注册表的端口

connectorPort

org.apache.camel.jmx.rmiConnector.connectorPort

-1 (dynamic)

JMX RMI 服务器使用的端口

serviceUrlPath

org.apache.camel.jmx.serviceUrlPath

/jmxrmi/camel

JMX 连接器的路径将在下面注册

onlyRegisterProcessorWithCustomId

org.apache.camel.jmx.onlyRegisterProcessorWithCustomId

false

Camel 2.0: 如果启用了这个选项,则只会注册具有自定义 id 的处理器。这可让您在 JMX 控制台中文件不需要的处理器。

statisticsLevel

 

All / Default

Camel 2.1: 配置是否为 MBean 启用了性能统计数据的级别。如需了解更多详细信息,请参阅 为性能统计配置粒度级别部分。从 All 选项的 Camel 2.16 被重命名为 Default,并引入了一个新的扩展选项,允许收集额外的运行时 JMX 指标。

includeHostName

org.apache.camel.jmx.includeHostName

 

Camel 2.13: 在 MBean 命名中包含主机名吗。从 Camel 2.13 开始,默认为 false,因为在旧版本为 true 时。如果真正需要,您可以使用这个选项恢复旧行为。

useHostIPAddress

org.apache.camel.jmx.useHostIPAddress

false

Camel 2.16: 创建远程连接器时,在服务 URL 中使用主机名或 IP 地址。默认情况下将使用主机名。

loadStatisticsEnabled

org.apache.camel.jmx.loadStatisticsEnabled

false

Camel 2.16:启用 Whether 负载统计(使用每个 CamelContext 后台线程使用后台线程的负载统计)。

endpointRuntimeStatisticsEnabled

org.apache.camel.jmx.endpointRuntimeStatisticsEnabled

true

Camel 2.16: 启用 Whether 端点运行时统计(每个传入和传出端点的运行时使用)。

180.4.10. 配置是否注册 MBeans,用于新路由还是默认路由

可作为 Camel 2.7 提供

Camel 现在提供 2 个设置来控制是否注册 mbeans

选项默认值描述

registerAlways

false

如果启用,则始终注册 MBeans。

registerNewRoutes

true

如果启用,在 CamelContext 启动后添加新路由也会从该给定路由注册 MBeans。

默认情况下,Camel 会注册 MBeans,用于其启动时配置的所有路由。如果您随后添加新路由,则 registerNewRoutes 选项控制是否还应注册 MBeans。您可以禁用它,例如,在不需要管理的情况下添加和删除临时路由。

使用动态 EIP 模式时,最好使用 registerAlways 选项,如 Recipient List 有唯一的端点。如果这样,每个唯一端点及其关联的服务/生产器也会被注册。这可能会导致系统崩溃,因为 registry 中的 mbeans 数不断增加。MBean 不是一个轻量级对象,因此消耗内存。

180.5. 使用 JMX 监控 Camel

180.5.1. 使用 JConsole 来监控 Camel

如果您正在与 Camel 相同的主机上运行 JConsole,则 CamelContext 应显示在本地连接列表中。

要连接到远程 Camel 实例,或者本地进程不显示,请使用 Remote Process 选项,并输入 URL。以下是 localhost URL:service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi/camel 的示例。

使用带 JConsole 的 Apache Camel:

image

180.5.2. 注册端点

在涉及数千个端点的情况下, 注册 单例 端点的 Camel 2.1,因为使用成千上万个端点时,非单例的开销将非常大。当使用 Recipient List EIP 或者来自发送大量消息的 ProducerTemplate 时会出现这种情况。

180.5.3. 注册的处理器

请查看此常见问题。

180.5.4. 如何使用 JMX NotificationListener 侦听 camel 事件?

Camel 通知事件提供指导性概述情况。您可以查看上下文和端点的生命周期事件,您可以看到被接收并发送到端点的交换。

Camel 2.4 中,您可以使用自定义 JMX NotificationListener 来侦听 camel 事件。

首先,您需要在启动 CamelContext 前设置 JmxNotificationEventNotifier

// Set up the JmxNotificationEventNotifier
notifier = new JmxNotificationEventNotifier();
notifier.setSource("MyCamel");
notifier.setIgnoreCamelContextEvents(true);
notifier.setIgnoreRouteEvents(true);
notifier.setIgnoreServiceEvents(true);

CamelContext context = new DefaultCamelContext(createRegistry());
context.getManagementStrategy().addEventNotifier(notifier);

其次,您可以注册您的监听程序以侦听事件:

// register the NotificationListener
ObjectName on = ObjectName.getInstance("org.apache.camel:context=camel-1,type=eventnotifiers,name=JmxEventNotifier");
MyNotificationListener listener = new MyNotificationListener();
context.getManagementStrategy().getManagementAgent().getMBeanServer().addNotificationListener(on,
    listener,
    new NotificationFilter() {
        private static final long serialVersionUID = 1L;

        public boolean isNotificationEnabled(Notification notification) {
            return notification.getSource().equals("MyCamel");
        }
    }, null);

180.5.5. 使用 Tracer MBean 获得精细的追踪

另外,Camel 2.9.0 上面的 coarse grained 通知还支持 JMX 通知进行精细的追踪事件。

这些可以在 Tracer MBean 中找到。要激活精细的追踪,首先需要在上下文或路由上激活追踪。

在配置上下文或上下文 / route MBeans 时,可以执行此操作。

作为第二个步骤,您必须在 tracer 上将 jmxTraceNotifications 属性设置为 true。在配置上下文或在 tracer MBean 上运行时可以再次执行此操作。

现在,您可以使用 JConsole 在 Tracer MBean 上注册 TraceEvent Notifications。路由中的每个步骤都会有一个通知,并附带所有交换和消息详情:

image

180.6. 将 JMX 用于您自己的 Camel 代码

180.6.1. 注册您自己的受管端点

作为 Camel 2.0
,您可以使用 Spring managed annotations @ManagedResource 分离您自己的端点,以便在 Camel MBeanServer 中注册它们,从而使用 JMX 访问您的自定义 MBean。

注意

Camel 2.1 中,我们进行更改以应用其他端点,但随后您需要实施接口 org.apache.camel.spi.ManagementAware。稍后将对此进行更多。

例如,我们有以下自定义端点,其中定义了要管理的一些选项:

@ManagedResource(description = "Our custom managed endpoint")
public class CustomEndpoint extends MockEndpoint implements ManagementAware<CustomEndpoint> {

    public CustomEndpoint(final String endpointUri, final Component component) {
        super(endpointUri, component);
    }

    public Object getManagedObject(CustomEndpoint object) {
        return this;
    }

    public boolean isSingleton() {
        return true;
    }

    protected String createEndpointUri() {
        return "custom";
    }

    @ManagedAttribute
    public String getFoo() {
        return "bar";
    }

    @ManagedAttribute
    public String getEndpointUri() {
        return super.getEndpointUri();
    }
}

Camel 2.9 开始,建议使用 org.apache.camel.api.management 软件包中的 @ManagedResource@ManagedAttribute@ManagedOperation。这允许您的自定义代码不依赖于 Spring JAR。

180.6.2. 编程您自己的托管服务

可从 Camel 2.1 开始

Camel 现在提供了在注册服务进行管理时使用您自己的 MBeans。例如,您可以开发自定义 Camel 组件,并让其为端点、消费者和生产者公开 MBeans。您要做的只是实施接口 org.apache.camel.spi.ManagementAware,并返回受管对象 Camel 应使用。

既然您认为 oh boys 之前,JMX API 真的很麻烦且很麻烦,然后是 yeah。没问题,但我们 Spring 也创建了一系列注解,供您用于在现有 Bean 上导出管理。这意味着,您通常会使用来自 ManagementAware 接口的 getManagedObject 并在 getManagedObject 中返回它。例如,请参阅 CustomEndpoint 上面的代码示例。

现在,在 Camel 2.1 中,您可以对 Camel 注册进行管理的所有对象执行此操作,这些对象非常广泛,但并非所有对象。

对于不实施此 ManagementAware 接口的服务,Camel 将回退到使用下表中定义的默认打包程序:

类型MBean 打包程序

CamelContext

ManagedCamelContext

组件

ManagedComponent

端点

ManagedEndpoint

消费者

ManagedConsumer

Producer

ManagedProducer

Route(路由)

ManagedRoute

处理器

ManagedProcessor

tracer

ManagedTracer

Service

ManagedService

除了用于特殊类型的扩展程序外,还有一些扩展器,例如:

类型MBean 打包程序

ScheduledPollConsumer

ManagedScheduledPollConsumer

BrowsableEndpoint

ManagedBrowseableEndpoint

Throttler

ManagedThrottler

Delayer

ManagedDelayer

SendProcessor

ManagedSendProcessor

未来,我们将为更多 EIP 模式添加额外的打包程序。

180.6.3. ManagementNamingStrategy

可从 Camel 2.1 开始

Camel 提供了一个可插拔的 API,供 org.apache.camel.spi.ManagementNamingStrategy 命名策略。默认实施用于计算所有 MBeans 已注册的 MBean 名称。

180.6.4. 管理命名模式

可从 Camel 2.10 开始

Camel 2.10 开始,我们更加容易地为 MBeans 配置命名模式。该模式作为 ObjectName 的一部分被用作域名后的键。

默认情况下,CamelContextMBean 将 MBean 名称用于 ManagedCamelContextMBean,如下所示:

org.apache.camel:context=localhost/camel-1,type=context,name=camel-1

Camel 2.13 开始主机名不包括在 MBean 名称中,因此上述示例如下:

org.apache.camel:context=camel-1,type=context,name=camel-1

如果您在 CamelContext 上配置名称,则该名称也是 ObjectName 的一部分。例如,如果我们有

<camelContext id="myCamel" ...>

然后 MBean 名称将如下:

org.apache.camel:context=localhost/myCamel,type=context,name=myCamel

现在,如果 JVM 中有一个命名 clash (例如,已存在上述给定名称的 MBean),那么 Camel 默认会尝试通过使用计数器在 JMXMBeanServer 中查找新的可用名称来自动纠正此操作。如上所示,现在附加计数器,因此我们将 myCamel-1 作为 ObjectName 的一部分:

org.apache.camel:context=localhost/myCamel-1,type=context,name=myCamel

这是因为 Camel 默认使用命名模式来支持以下令牌:

  • camelId = CamelContext id (如名称)
  • name - 与 camelId相同
  • counter - 递增计数器 * bundleId - OSGi 捆绑包 ID (仅适用于 OSGi 环境)
  • 符号名称 - OSGi 符号链接名称(仅适用于 OSGi 环境)
  • 版本 - OSGi 捆绑版本(仅适用于 OSGi 环境)

默认命名模式在 OSGi 和非OSGi 不同,如下所示:

  • non OSGI: name
  • OSGi: bundleId-name
  • OSGi Camel 2.13: 符号名称

但是,如果在 JMXMBeanServer 中有一个命名 clash,Camel 将自动回退,并在 模式中使用计数器 来补救此问题。因此将使用以下模式:

  • non OSGI: name-counter
  • OSGi: bundleId-name-counter
  • OSGi Camel 2.13: 符号名称-计数器

如果您设置了显式命名模式,那么始终使用该模式,并且不 使用上述默认模式。

这样,我们可以在 JMXMBeanRegistry 中对 CamelContext id 命名以及 JMXMBeans 的命名变得非常容易。

从 Camel 2.15 开始,您可以使用 JVM 系统属性配置默认管理名称模式,为 JVM 配置这一全局配置。请注意,您可以通过显式配置此模式来覆盖它,如下例所示。

设置 JVM 系统属性,以使用 cool 为名称加上前缀的默认管理名称模式。

System.setProperty(JmxSystemPropertyKeys.MANAGEMENT_NAME_PATTERN, "cool-#name#");

因此,如果我们希望明确命名 CamelContext 并使用固定的 MBean 名称,该名称不会更改(例如,没有计数器),那么我们可以使用新的 managementNamePattern 属性:

<camelContext id="myCamel" managementNamePattern="#name#">

然后 MBean 名称始终如下所示:

org.apache.camel:context=localhost/myCamel,type=context,name=myCamel

在 Java 中,您可以配置 managementNamePattern,如下所示:

context.getManagementNameStrategy().setNamePattern("#name#");

您还可以使用与 id 的 managementNamePattern 中的不同名称,例如我们可以:

<camelContext id="myCamel" managementNamePattern="coolCamel">

如果您不希望 OSGi 捆绑包 ID 作为 MBean 名称的一部分,您可能希望在 OSGi 环境中执行此操作。由于 OSGi 捆绑包 id 可更改服务器,或者卸载并安装相同的应用程序。然后您可以按如下所示不要使用 OSGi 捆绑包 ID 作为名称的一部分:

<camelContext id="myCamel" managementNamePattern="#name#">

请注意,这需要 myCamel 在整个 JVM 中是唯一的。如果安装了具有相同 CamelContext id 和 managementNamePattern 的 2nd Camel 应用程序,那么 Camel 将在启动时失败,并报告 MBean 已存在的异常。

180.6.5. ManagementStrategy

可从 Camel 2.1 开始

Camel 现在提供了一个完全可插拔化的管理策略,可让您 100% 来控制管理。它是一个丰富的界面,可以管理许多方法。不仅通过 MBeanServer 添加或删除受管对象,也提供了事件通知,也可使用 org.apache.camel.spi.EventNotifier API 提供。例如,它会更轻松地为其他管理产品提供适配器。另外,它还可让您提供 Apache 出厂提供的更多详情和功能。

180.6.6. 为性能统计配置粒度级别

可从 Camel 2.1 开始

现在,您可以设置一个预设置级别,无论在 Camel 启动时是否启用了性能统计。级别是

  • Extended - 作为默认值,但随着运行时收集的其他统计信息,如端点的精细使用级别等。这个选项需要 Camel 2.16
  • 所有 / Default - Camel 将同时启用路由和处理器(fine grained)的统计信息。从 Camel 2.16 开始,所有选项被重命名为 Default。
  • RoutesOnly - Camel 仅为路由启用统计信息(粒度)
  • off - Camel 不会启用任何.

根据性能统计数据,Camel 2.9 包括了每个 CamelContext 和 Route MBeans 的平均负载统计。该统计数据根据飞机交换的数量平均负载,每 1、5 和 15 分钟速率。这与 Unix 系统上的负载统计信息类似。Camel 2.11 onwards 允许您通过设置 < jmxAgent > 上的 loadStatisticsEnabled=false 来显式禁用负载性能统计。请注意,如果静态级别也配置为 off,它将关闭。默认情况下,从 Camel 2.13 获得负载性能统计。您可以通过在 < jmxAgent> 中设置 loadStatisticsEnabled=true 来启用此功能

在运行时,您总是可以使用管理控制台(如 JConsole)来更改给定路由或处理器,无论其统计信息是启用的。

注意

启用统计的含义是什么?

启用统计意味着 Camel 将为该特定 MBean 执行精细的性能统计信息。您可以看到的统计信息有很多,例如:交换数 completed/failed、最后/total/mina/max/mean 处理时间、首次/最后失败的时间等。

通过使用 Java DSL,您可以通过以下方式设置此级别:

// only enable routes when Camel starts
context.getManagementStrategy().setStatisticsLevel(ManagementStatisticsLevel.RoutesOnly);

在 Spring DSL 中,您可以:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <jmxAgent id="agent" statisticsLevel="RoutesOnly"/>
 ...
</camelContext>

180.7. 隐藏敏感信息

可作为 Camel 2.12 提供

默认情况下,Camel enlists MBeans in JMX (如使用 URI 配置的端点)在此配置中,可能会存在密码等敏感信息。

可通过启用 mask 选项隐藏这些信息,如下所示:

使用 Java DSL,您可以通过以下方式实现:

  // only enable routes when Camel starts
  context.getManagementStrategy().getManagementAgent().setMask(true);

在 Spring DSL 中,您可以:

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <jmxAgent id="agent" mask="true"/>
     ...
    </camelContext>

这将屏蔽具有密码和密码短语等选项的 URI,并使用 xxxxxx 作为替换值。

180.7.1. 声明要屏蔽的 JMX 属性和操作

org.apache.camel.api.management.ManagedAttributeorg.apache.camel.api.management.ManagedOperation 中,属性 掩码 可以设为 true,以指示应屏蔽 JMX 属性/operation 结果(如果在 JMX 代理上启用)。

例如,在来自 camel-core org.apache.camel.api.mbean.ManagedEndpointMBean 的默认受管端点上,我们宣布 EndpointUri JMX 属性被屏蔽:

@ManagedAttribute(description = "Endpoint URI", mask = true)
String getEndpointUri();

180.8. 另请参阅

第 181 章 JOLT Component

作为 Camel 版本 2.16 可用

jolt: 组件允许您使用 JOLT 规格来处理 JSON 消息。在对 JSON 进行 JSON 转换时,这可以是理想的选择。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jolt</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

 

181.1. URI 格式

jolt:specName[?options]

其中 specName 是要调用的规范的类路径路径 URI;或者远程规格的完整 URL (例如: file://folder/myfile.json)。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

181.2. 选项

JOLT 组件支持 4 个选项,它们如下所列。

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

transform (advanced)

明确设置要使用的转换。如果没有设置由 transformDsl 指定的转换信息

 

翻译

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

JOLT 端点使用 URI 语法进行配置:

jolt:resourceUri

使用以下路径和查询参数:

181.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

资源 所需的 路径。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。

 

字符串

181.2.2. 查询参数(7 参数):

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

inputType (producer)

指定输入是 hydrated JSON 或 JSON String。

Hydrated

JoltInputOutputType

outputType (producer)

指定输出是否应该隐藏的 JSON 或 JSON String。

Hydrated

JoltInputOutputType

transformDsl (producer)

指定端点资源的 Transform DSL。如果没有指定链(Chainr)。

Chainr

JoltTransformType

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

181.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.jolt.enabled

启用 jolt 组件

true

布尔值

camel.component.jolt.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.jolt.transform

明确设置要使用的转换。如果没有设置由 transformDsl 指定的转换,则将创建。选项为 com.bazaarvoice.jolt.Transform 类型。

 

字符串

181.4. Samples

例如,您可以使用如下内容:

from("activemq:My.Queue").
  to("jolt:com/acme/MyResponse.json");

以及基于文件的资源:

from("activemq:My.Queue").
  to("jolt:file://myfolder/MyResponse.json?contentCache=true").
  to("activemq:Another.Queue");

您还可以指定组件应该通过标头动态使用的规格,例如:

from("direct:in").
  setHeader("CamelJoltResourceUri").constant("path/to/my/spec.json").
  to("jolt:dummy?allowTemplateFromHeader=true");
警告

启用 allowTemplateFromHeader 选项具有安全 RAMification。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。  

181.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 182 章 JPA Component

作为 Camel 版本 1.0 可用

jpa 组件允许您使用 EJB 3 的 Java Persistence 架构(JPA)来存储和检索 Java 对象,它打包了对象/Relational Mapping (ORM)产品,如 OpenJPA、Hibernate、LeLink 等。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jpa</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

182.1. 发送到端点

您可以将 Java 实体 bean 存储在数据库中,方法是将它发送到 JPA producer 端点。In 消息的正文被假定为实体 bean (即 POJO,其上带有 @Entity 注释)或实体 Bean 的集合或数组。

如果正文是实体列表,请确保使用 entityType=java.util.ArrayList 作为传递给制作者端点的配置。

如果正文不包含以上列出的类型之一,请在端点的前面放置一个消息转换器,首先执行必要的转换。

Camel 2.19 开始,您还可以对制作者使用 查询namedQuerynativeQuery。另外,在 参数的值中,您可以使用 Simple 表达式,您可以从 Message body、标头等中检索参数值。这些查询可用于检索一组使用 SELECT JPQL/SQL 语句的数据,以及使用 UPDATE/DELETE JPQL/SQL 语句执行批量更新/删除。请注意,如果您执行带有 namedQueryUPDATE/DELETE,则需要指定 useExecuteUpdate to true,因为 camel 不会查看与 查询和 原生Query 不同的名称查询

182.2. 从端点消耗

使用 JPA 消费者端点的消息将删除(或更新)数据库中实体 Bean。这样,您可以将数据库表用作逻辑队列:使用者从队列中获取消息,然后删除/更新它们从队列中以逻辑方式删除它们。

如果您不想在处理后删除实体 bean (在完成路由时),您可以在 URI 上指定 consumeDelete=false。这将使实体被处理每个轮询。

如果想要对实体执行一些更新以将其标记为已处理(例如,从未来查询中排除),那么您可以使用 @Consumed 为实体添加添加方法,它会在实体处理后(以及完成路由)上调用它。

Camel 2.13 开始,您可以使用 @PreConsumed,您的实体在实体被处理前(在路由之前)被调用。

如果您要消耗大量行(100K+),且遇到 OutOfMemory 问题,您应该将最大结果设置为明智的值。

182.3. URI 格式

jpa:entityClassName[?options]

要发送到端点,entityClassName 是可选的。如果指定,它会帮助 Type Converter 来确保正文正确类型。

对于消耗,实体ClassName 是强制的。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

182.4. 选项

JPA 组件支持 5 个选项,它们如下所列。

名称描述默认类型

entityManagerFactory (common)

使用 EntityManagerFactory。强烈建议您进行配置。

 

EntityManagerFactory

transactionManager (common)

使用 PlatformTransactionManager 管理事务。

 

platformTransaction Manager

joinTransaction (common)

camel-jpa 组件默认加入事务。您可以使用这个选项关闭此选项,例如,如果您使用 LOCAL_RESOURCE 并加入事务无法与您的 JPA 供应商一起工作。也可以在 JpaComponent 上全局设置此选项,而不必在所有端点上设置它。

true

布尔值

sharedEntityManager (common)

是否将 Spring 的 SharedEntityManager 用于消费者/生产器。在大多数情况下,joinTransaction 应该设置为 false,因为这不是 EXTENDED EntityManager。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

JPA 端点使用 URI 语法配置:

jpa:entityType

使用以下路径和查询参数:

182.4.1. 路径名(1 参数):

名称描述默认类型

entityType

需要 JPA 注释类以用作实体。

 

182.4.2. 查询参数(42 参数):

名称描述默认类型

joinTransaction (common)

camel-jpa 组件默认加入事务。您可以使用这个选项关闭此选项,例如,如果您使用 LOCAL_RESOURCE 并加入事务无法与您的 JPA 供应商一起工作。也可以在 JpaComponent 上全局设置此选项,而不必在所有端点上设置它。

true

布尔值

maximumResults (common)

设置查询上要检索的最大结果数。

-1

int

namedQuery (common)

使用命名查询:

 

字符串

nativeQuery (common)

使用自定义本地查询。在使用本地查询时,您可能需要使用 option resultClass。

 

字符串

parameters (common)

这个键/值映射用于构建查询参数。预期为通用类型 java.util.Map,其中键是给定 JPA 查询的命名参数,值是它们要选择的对应有效值。当它用于制作者时,简单表达式可以用作参数值。它允许您从消息正文、标头等中检索参数值。

 

map

persistenceUnit (common)

需要 默认使用 JPA 持久性单元。

camel

字符串

query (common)

使用自定义查询。

 

字符串

resultClass (common)

定义返回的有效负载类型(我们将调用 entityManager.createNativeQuery (nativeQuery, resultClass)),而不是 entityManager.createNativeQuery (nativeQuery)。如果没有这个选项,我们会返回一个对象数组。仅在与本地查询结合使用时受到影响。

 

sharedEntityManager (common)

是否将 Spring 的 SharedEntityManager 用于消费者/生产器。在大多数情况下,joinTransaction 应该设置为 false,因为这不是 EXTENDED EntityManager。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

consumeDelete (consumer)

如果为 true,则在消耗完实体后会被删除;如果为 false,则实体不会被删除。

true

布尔值

consumeLockEntity (consumer)

指定在处理轮询结果时是否设置每个实体 bean 的独占锁定。

true

布尔值

deleteHandler (consumer)

要使用自定义 DeleteHandler,在消费者处理交换后删除行

 

DeleteHandler

lockModeType (consumer)

要在使用者上配置锁定模式。

PESSIMISTIC_WRITE

LockModeType

maxMessagesPerPoll (consumer)

一个整数值,用于定义每个轮询收集的最大消息数。默认情况下不设置最大值。可用于避免在启动服务器时轮询数以千计的消息。将值设为 0 或负数设为 disable。

 

int

preDeleteHandler (consumer)

要使用自定义 Pre-DeleteHandler,在使用者读取实体后删除行。

 

DeleteHandler

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

skipLockedEntity (consumer)

配置是否要在锁定中使用 NOWAIT,并静默跳过该实体。

false

布尔值

翻译( 消费者)

在处理整个批处理时,是否会以转换模式运行使用者(通过它,所有消息都可以提交或回滚)。默认行为(false)是提交之前成功处理的消息,仅回滚最后的失败消息。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

flushOnSend (producer)

在实体 bean 持久化后清除实体管理器。

true

布尔值

remove (producer)

表示使用实体管理器.删除(实体)。

false

布尔值

useExecuteUpdate (producer)

配置在制作者执行查询时是否使用 executeUpdate ()。当您使用 INSERT、UPDATE 或 DELETE 语句作为命名查询时,您需要将这个选项指定为 'true'。

 

布尔值

usePassedInEntityManager (producer)

如果设置为 true,则 Camel 将使用标头 JpaConstants.ENTITY_MANAGER 而不是组件/endpoint 上的已配置实体管理器。这使得最终用户能够控制要使用哪些实体管理器。

false

布尔值

usePersist (producer)

表示使用实体Manager.persist (entity)而不是 entityManager.merge (entity)。注意:实体Manager.persist (entity)不适用于分离实体(实体管理器必须执行 UPDATE 而非 INSERT 查询)!

false

布尔值

entityManagerProperties (advanced)

要使用的实体管理器的其他属性。

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

182.5. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.jpa.enabled

启用 jpa 组件

true

布尔值

camel.component.jpa.entity-manager-factory

使用 EntityManagerFactory。强烈建议您进行配置。选项是一个 javax.persistence.EntityManagerFactory 类型。

 

字符串

camel.component.jpa.join-transaction

camel-jpa 组件默认加入事务。您可以使用这个选项关闭此选项,例如,如果您使用 LOCAL_RESOURCE 并加入事务无法与您的 JPA 供应商一起工作。也可以在 JpaComponent 上全局设置此选项,而不必在所有端点上设置它。

true

布尔值

camel.component.jpa.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.jpa.shared-entity-manager

是否将 Spring 的 SharedEntityManager 用于消费者/生产器。在大多数情况下,joinTransaction 应该设置为 false,因为这不是 EXTENDED EntityManager。

false

布尔值

camel.component.jpa.transaction-manager

使用 PlatformTransactionManager 管理事务。选项是一个 org.springframework.transaction.PlatformTransactionManager 类型。

 

字符串

182.6. 消息标头

Camel 向交换中添加以下消息标头:

标头类型描述

CamelJpaTemplate

JpaTemplate

不再支持 Camel 2.12: 用于访问实体 bean 的 JpaTemplate 对象。在某些情况下,您需要这个对象,例如在类型转换器或执行某些自定义处理时的实例。有关此标头的支持的原因,请参阅 CAMEL-5932

CamelEntityManager

EntityManager

Camel 2.12: JPA consumer / Camel 2.12.2: JPA producer: JPA EntityManager 对象由 JpaConsumerJpaProducer 使用。

CamelJpaParameters

map<String, Object>

Camel 2.23:JPA 制作者: 将查询参数作为交换标头的另一种方式。

182.7. 配置实体管理器工厂

它强烈建议将 JPA 组件配置为使用特定的 EntityManagerFactory 实例。如果未能这样做,则每个 JpaEndpoint 都会自动创建他们自己的 实体管理器工厂 实例,这些实例往往不是您想要的。

例如,您可以实例化一个 JPA 组件来引用 myEMFactory 实体管理器工厂,如下所示:

<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent">
   <property name="entityManagerFactory" ref="myEMFactory"/>
</bean>

Camel 2.3 中,JpaComponent 将从 Registry 中自动查找 EntityManagerFactory,这意味着您无需按照上述 JpaComponent 配置它。只有存在不确定性时,才需要记录 WARN。

182.8. 配置 TransactionManager

Camel 2.3 开始,JpaComponent 将从 Registry 自动查询 事务管理器。如果 Camel 找不到已注册的任何 事务管理器 实例,它将查找 TransactionTemplate 并尝试从中提取 事务管理器

如果 registry 中没有可用的 事务Template,则 JpaEndpoint 将自动创建自己的 TransactionManager 实例,而这通常不是您想要的。

如果找到了以上的 交易管理器 实例,Camel 将记录 WARN。在这种情况下,您可能想要实例化并明确配置一个 JPA 组件来引用 myTransactionManager 事务管理器,如下所示:

<bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent">
   <property name="entityManagerFactory" ref="myEMFactory"/>
   <property name="transactionManager" ref="myTransactionManager"/>
</bean>

182.9. 使用具有指定查询的消费者

对于只消耗所选实体,您可以使用 consumer.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?consumer.namedQuery=step1")
.to("bean:myBusinessLogic");

182.10. 使用带有查询的消费者

对于只消耗所选实体,您可以使用 consumer.query URI 查询选项。您只需要定义查询选项:

from("jpa://org.apache.camel.examples.MultiSteps?consumer.query=select o from org.apache.camel.examples.MultiSteps o where o.step = 1")
.to("bean:myBusinessLogic");

182.11. 使用具有原生查询的消费者

对于只消耗所选实体,您可以使用 consumer.nativeQuery URI 查询选项。您只需要定义原生查询选项:

from("jpa://org.apache.camel.examples.MultiSteps?consumer.nativeQuery=select * from MultiSteps where step = 1")
.to("bean:myBusinessLogic");

如果使用原生查询选项,您将收到消息正文中的对象数组。

182.12. 将制作者用于命名查询

要检索所选实体或执行批量更新/删除,您可以使用 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 语句作为命名查询。

182.13. 使用带有查询的制作者

要检索所选实体或执行批量更新/删除,您可以使用 查询 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");

182.14. 使用带有原生查询的制作者

要检索所选实体或执行批量更新/删除,您可以使用 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 的情况下使用原生查询选项,您将收到消息正文中的对象数组。

182.15. 示例

如需使用 JPA 将 traced 消息存储到数据库中的示例,请参阅 Tracer 示例

182.16. 使用基于 JPA 的 Idempotent 仓库

来自 EIP 模式的 Idempotent Consumer 用于过滤掉重复的消息。提供了基于 JPA 的幂等存储库。

使用基于 JPA 的幂等存储库:

流程

  1. 在 persistence.xml 文件中设置 persistence-unit:
  2. 设置 org.springframework.orm.jpaTemplate,由 org.apache.camel.processor.idempotent.jpaMessageIdRepository:
  3. 配置错误格式化宏: snippet: java.lang.IndexOutOfBoundsException: Index: 20, Size: 20
  4. 配置幂等存储库: org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository:
  5. 在 Spring XML 文件创建 JPA 幂等存储库:
<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route id="JpaMessageIdRepositoryTest">
        <from uri="direct:start" />
        <idempotentConsumer messageIdRepositoryRef="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.junit4.CamelTestSupport.doSetUp(CamelTestSupport.java:238)
    at org.apache.camel.test.junit4.CamelTestSupport.setUp(CamelTestSupport.java:208)

这里的问题在于,源已通过 IDE 编译或重新编译,而不是通过 Maven 编译,这将 在构建时增强字节代码。为了克服这一问题,您需要启用 OpenJPA 的动态字节代码增强。例如,假设 Camel 中使用的当前 OpenJPA 版本为 2.2.1,若要在 IDE 中运行测试,您需要将以下参数传递给 JVM:

-javaagent:<path_to_your_local_m2_cache>/org/apache/openjpa/openjpa/2.2.1/openjpa-2.2.1.jar

182.17. 另请参阅

第 183 章 JSon Fastjson DataFormat

可作为 Camel 版本 2.20 可用

Fastjson 是一个数据格式,它使用 Fastjson 库

from("activemq:My.Queue").
  marshal().json(JsonLibrary.Fastjson).
  to("mqseries:Another.Queue");

183.1. Fastjson 选项

JSon Fastjson 数据格式支持 19 选项,它们如下所列。

名称默认Java 类型描述

objectMapper

 

字符串

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

useDefaultObjectMapper

true

布尔值

是否从注册表中查找和使用默认 Jackson ObjectMapper。

prettyPrint

false

布尔值

启用大量打印输出。默认为 false。

library

XStream

JsonLibrary

要使用的 json 库。

unmarshalTypeName

 

字符串

取消armshalling 时要使用的 java 类型的类名称

jsonView

 

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

Include

 

字符串

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

allowJmsType

false

布尔值

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

collectionTypeName

 

字符串

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

useList

false

布尔值

要取消与映射列表或 Pojo 列表相关的内容。

enableJaxbAnnotationModule

false

布尔值

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

moduleClassNames

 

字符串

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

moduleRefs

 

字符串

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

enableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

disableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

权限

 

字符串

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

allowUnmarshallType

false

布尔值

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

timezone

 

字符串

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

183.2. Spring Boot Auto-Configuration

组件支持 20 个选项,如下所示。

名称描述默认类型

camel.dataformat.json-fastjson.allow-jms-type

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

false

布尔值

camel.dataformat.json-fastjson.allow-unmarshall-type

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

false

布尔值

camel.dataformat.json-fastjson.collection-type-name

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

 

字符串

camel.dataformat.json-fastjson.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.json-fastjson.disable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-fastjson.enable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-fastjson.enable-jaxb-annotation-module

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

false

布尔值

camel.dataformat.json-fastjson.enabled

是否启用 json-fastjson 数据格式的自动配置。默认启用。

 

布尔值

camel.dataformat.json-fastjson.include

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

 

字符串

camel.dataformat.json-fastjson.json-view

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

 

camel.dataformat.json-fastjson.library

要使用的 json 库。

 

JsonLibrary

camel.dataformat.json-fastjson.module-class-names

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

 

字符串

camel.dataformat.json-fastjson.module-refs

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

 

字符串

camel.dataformat.json-fastjson.object-mapper

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

 

字符串

camel.dataformat.json-fastjson.permissions

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

 

字符串

camel.dataformat.json-fastjson.pretty-print

启用大量打印输出。默认为 false。

false

布尔值

camel.dataformat.json-fastjson.timezone

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

 

字符串

camel.dataformat.json-fastjson.unmarshal-type-name

取消armshalling 时要使用的 java 类型的类名称

 

字符串

camel.dataformat.json-fastjson.use-default-object-mapper

是否从注册表中查找和使用默认 Jackson ObjectMapper。

true

布尔值

camel.dataformat.json-fastjson.use-list

要取消与映射列表或 Pojo 列表相关的内容。

false

布尔值

183.3. 依赖项

要在 camel 路由中使用 Fastjson,您需要添加实现此数据格式的 camel-fastjson 的依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-fastjson</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

第 184 章 JSon GSon DataFormat

作为 Camel 2.10 版本提供

Gson 是一个使用 Gson 库的数据格式

from("activemq:My.Queue").
  marshal().json(JsonLibrary.Gson).
  to("mqseries:Another.Queue");

184.1. Gson 选项

JSon GSon 数据格式支持 19 选项,它们如下所列。

名称默认Java 类型描述

objectMapper

 

字符串

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

useDefaultObjectMapper

true

布尔值

是否从注册表中查找和使用默认 Jackson ObjectMapper。

prettyPrint

false

布尔值

启用大量打印输出。默认为 false。

library

XStream

JsonLibrary

要使用的 json 库。

unmarshalTypeName

 

字符串

取消armshalling 时要使用的 java 类型的类名称

jsonView

 

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

Include

 

字符串

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

allowJmsType

false

布尔值

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

collectionTypeName

 

字符串

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

useList

false

布尔值

要取消与映射列表或 Pojo 列表相关的内容。

enableJaxbAnnotationModule

false

布尔值

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

moduleClassNames

 

字符串

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

moduleRefs

 

字符串

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

enableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

disableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

权限

 

字符串

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

allowUnmarshallType

false

布尔值

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

timezone

 

字符串

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

184.2. Spring Boot Auto-Configuration

组件支持 20 个选项,如下所示。

名称描述默认类型

camel.dataformat.json-gson.allow-jms-type

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

false

布尔值

camel.dataformat.json-gson.allow-unmarshall-type

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

false

布尔值

camel.dataformat.json-gson.collection-type-name

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

 

字符串

camel.dataformat.json-gson.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.json-gson.disable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-gson.enable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-gson.enable-jaxb-annotation-module

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

false

布尔值

camel.dataformat.json-gson.enabled

启用 json-gson 数据格式

true

布尔值

camel.dataformat.json-gson.include

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

 

字符串

camel.dataformat.json-gson.json-view

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

 

camel.dataformat.json-gson.library

要使用的 json 库。

 

JsonLibrary

camel.dataformat.json-gson.module-class-names

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

 

字符串

camel.dataformat.json-gson.module-refs

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

 

字符串

camel.dataformat.json-gson.object-mapper

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

 

字符串

camel.dataformat.json-gson.permissions

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

 

字符串

camel.dataformat.json-gson.pretty-print

启用大量打印输出。默认为 false。

false

布尔值

camel.dataformat.json-gson.timezone

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

 

字符串

camel.dataformat.json-gson.unmarshal-type-name

取消armshalling 时要使用的 java 类型的类名称

 

字符串

camel.dataformat.json-gson.use-default-object-mapper

是否从注册表中查找和使用默认 Jackson ObjectMapper。

true

布尔值

camel.dataformat.json-gson.use-list

要取消与映射列表或 Pojo 列表相关的内容。

false

布尔值

184.3. 依赖项

要在 camel 路由中使用 Gson,需要添加对 camel-gson 的依赖来实施此数据格式。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-gson</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

第 185 章 JSON Jackson DataFormat

可作为 Camel 版本 2.0 提供

jackson 是一个数据格式,它使用 Jackson Library

from("activemq:My.Queue").
  marshal().json(JsonLibrary.Jackson).
  to("mqseries:Another.Queue");

185.1. jackson 选项

JSon Jackson 数据格式支持 19 选项,它们如下所列。

名称默认Java 类型描述

objectMapper

 

字符串

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

useDefaultObjectMapper

true

布尔值

是否从注册表中查找和使用默认 Jackson ObjectMapper。

prettyPrint

false

布尔值

启用大量打印输出。默认为 false。

library

XStream

JsonLibrary

要使用的 json 库。

unmarshalTypeName

 

字符串

取消armshalling 时要使用的 java 类型的类名称

jsonView

 

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

Include

 

字符串

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

allowJmsType

false

布尔值

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

collectionTypeName

 

字符串

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

useList

false

布尔值

要取消与映射列表或 Pojo 列表相关的内容。

enableJaxbAnnotationModule

false

布尔值

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

moduleClassNames

 

字符串

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

moduleRefs

 

字符串

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

enableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

disableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

权限

 

字符串

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

allowUnmarshallType

false

布尔值

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

timezone

 

字符串

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

contentTypeHeader

true

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

185.2. Spring Boot Auto-Configuration

组件支持 20 个选项,如下所示。

名称描述默认类型

camel.dataformat.json-jackson.allow-jms-type

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

false

布尔值

camel.dataformat.json-jackson.allow-unmarshall-type

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

false

布尔值

camel.dataformat.json-jackson.collection-type-name

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

 

字符串

camel.dataformat.json-jackson.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.json-jackson.disable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-jackson.enable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-jackson.enable-jaxb-annotation-module

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

false

布尔值

camel.dataformat.json-jackson.enabled

启用 json-jackson dataformat

true

布尔值

camel.dataformat.json-jackson.include

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

 

字符串

camel.dataformat.json-jackson.json-view

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

 

camel.dataformat.json-jackson.library

要使用的 json 库。

 

JsonLibrary

camel.dataformat.json-jackson.module-class-names

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

 

字符串

camel.dataformat.json-jackson.module-refs

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

 

字符串

camel.dataformat.json-jackson.object-mapper

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

 

字符串

camel.dataformat.json-jackson.permissions

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

 

字符串

camel.dataformat.json-jackson.pretty-print

启用大量打印输出。默认为 false。

false

布尔值

camel.dataformat.json-jackson.timezone

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

 

字符串

camel.dataformat.json-jackson.unmarshal-type-name

取消armshalling 时要使用的 java 类型的类名称

 

字符串

camel.dataformat.json-jackson.use-default-object-mapper

是否从注册表中查找和使用默认 Jackson ObjectMapper。

true

布尔值

camel.dataformat.json-jackson.use-list

要取消与映射列表或 Pojo 列表相关的内容。

false

布尔值

185.3. 使用自定义 ObjectMapper

您可以配置 JacksonDataFormat,以便在需要更多对映射配置进行控制的情况下使用自定义 ObjectMapper

如果您在注册表中设置单个 ObjectMapper,则 Camel 将自动查找并使用此 ObjectMapper。例如,如果您使用 Spring Boot,如果启用了 Spring MVC,则 Spring Boot 可以提供默认的 ObjectMapper。这将允许 Camel 检测 Spring Boot bean registry 中的 ObjectMapper 类类型之一,然后使用它。当发生这种情况时,您应该从 Camel 设置 INFO 日志记录。

185.4. 依赖项

要在 camel 路由中使用 Jackson,您需要添加实现此数据格式的 camel-jackson 依赖关系。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-jackson</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

185.5. jackson ObjectMapper

185.5.1. 什么是对象映射?

jackson 使用 com.fasterxml.jackson.databind.ObjectMapper 类来序列化 Java 对象的机制。例如,您可以使用 ObjectMapper 序列化 MyClass java 对象,如下所示:

ObjectMapper objectMapper = new ObjectMapper();
MyClass myobject = new MyClass("foo", "bar");
objectMapper.writeValue(new File("myobject.json"), myobject);

对象 myobject 会被序列化为 JSON 格式并写入文件 myobject.json (Jackson 也支持转换为 XML 和 YAML 格式)。

要反序列化文件的 JSON 内容 myobject.json,您可以按照如下所示调用 ObjectMapper

ObjectMapper objectMapper = new ObjectMapper();
MyClass myobject = objectMapper.readValue(new File("myobject.json"), MyClass.class);

请注意,接收器需要预先知道类的类型,且必须指定 MyClass.class 类型,作为 readValue () 的第二个参数。

185.5.2. 什么是多态对象映射?

在某些情况下,序列化对象的接收器无法预先知道对象类型。例如,这适用于一个多形对象数组。考虑抽象类型、Shape 及其子类型、三角Square (等等):

package com.example;
...
public abstract class Shape {
}

public class Triangle extends Shape {
  ...
}

public class Square extends Shape {
  ...
}

public class ListOfShape {
  public List<Shape> shapes;
  ...
}

您可以实例化并序列化一个格式数组列表(ListOfShape),如下所示:

ObjectMapper objectMapper = new ObjectMapper();

ListOfShape shapeList = new ListOfShape();
shapeList.shapes = new ArrayList<Shape>();
shapeList.shapes.add(new Triangle());
shapeList.shapes.add(new Square());

String serialized = objectMapper.writeValueAsString(shapeList);

但是,接收器中现在存在一个问题。您可以通过将 type 指定为 readValue () 的第二个参数来告知接收器预期 ListOfShape 对象:

MyClass myobject = objectMapper.readValue(serialized, ListOfShape.class);
ObjectMapper objectMapper = new ObjectMapper();

但是,没有接收器可以知道列表的第一个元素是 三角,第二个元素是 Square。要解决此问题,您需要启用多 形对象映射,如下一节中所述。

185.5.3. 如何启用 polymorphic 对象映射

polymorphic 对象映射是通过在 serialized 阵列中提供额外的元数据来序列化和反序列化数组的机制,它标识阵列中的对象类型。

重要

polymorphic 对象映射会带来一个固有安全风险,因为该机制允许 发件人 选择哪个类实例化,从而由发送者形成攻击基础。红帽的 FasterXML Jackson 库的发布是一个白名单机制,它提供了针对这个威胁的额外级别保护。您必须确保您使用红帽的 jackson-databind 库的发布(由 Fuse 版本 7.7 及更新版本提供),以获得这个额外的保护层。如需了解更多详细信息,请参阅 第 185.5.5 节 “来自多形反序列化的安全风险”

要使接收器可以在阵列中对对象进行反序列化处理,需要在序列化数据中提供类型元数据。默认情况下,Jackson 不会对序列化对象的任何类型元数据进行编码,因此您需要编写一些附加代码才能启用此功能。

要启用多形对象映射,请执行以下步骤(使用 ListOfShape 作为示例):

  1. 对于可以作为列表元素的每一个类( Shape的子类),使用 @JsonTypeInfo 注解类,如下所示:

    @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY)
    public class Triangle extends Shape {
      ...
    }
  2. Triangle 类被序列化为 JSON 格式时,它的格式如下:

    {"@class":"com.example.Triangle", "property1":"value1", "property2":"value2", ...}
  3. 必须通过将这些类添加到反序列化白名单中,将接收器配置为允许反序列化、Square 及其他形式类。要配置白名单,将 jackson.deserialization.whitelist.packages system 属性设置为用逗号分开的类和软件包列表。例如,要允许反序列化 TriangleSquare 类,将系统属性设置为如下:

    -Djackson.deserialization.whitelist.packages=com.example.Triangle,com.example.Square

    或者,您可以设置系统属性以允许整个 com.example 软件包:

    -Djackson.deserialization.whitelist.packages=com.example
    注意

    这个白名单机制只可用于 Red Hat 的 jackson-databind 库的发布。标准 jackson-databind 库使用黑名单机制,当发现潜在的危险新 gadget 类时,都需要更新它。

185.5.4. polymorphic deserialization 的默认映射

如果一个给定的 Java 类 com.example.MyClass 没有被列入白名单,则仍可对类的实例进行序列化,但在接收过程中,实例将使用通用的默认映射进行反序列化。

当 Jackson 中启用了 polymorphic 对象映射时,对对象的编码有几种替代方法:

  • With @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY):

    {"@class":"com.example.MyClass", "property1":"value1", "property2":"value2", ...}

    在本例中,实例将反序列化为具有 属性的对象

  • With @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY):

    ["com.example.MyClass", {"property1":"value1", "property2":"value2", ...}]

    在本例中,实例将反序列化为含有两个字段的 JSON 数组:

    • 带有com.example.MyClass的字符串
    • 具有 两个属性(或更多)属性的对象
  • 使用 @JsonTypeInfo (use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_OBJECT):

    {"com.example.MyClass":{"property1":"value1", "property2":"value2", ...}}

    在本例中,实例将按单个字段 com.example.MyClass 序列化为 JSON 映射,其值为具有两个(或更多)属性的对象。

185.5.5. 来自多形反序列化的安全风险

使用 FasterXML jackson-databind 库的应用程序通过对 JSON 内容进行反序列化处理 Java 对象可能会受到 远程代码执行 攻击的影响。但这不是自动的,如果您采取适当的缓解方案步骤,可以避免这个漏洞。

至少,在攻击成为可能前必须满足以下先决条件:

  1. 您已在 jackson-databind 中启用了 polymorphic 处理来反序列化 JSON 内容。在 Jackson JSON 中启用多形类型处理有两种替代方法:

    1. 使用 @JsonTypeInfo@JsonSubTypes 注释的组合。
    2. 通过调用 ObjectMapper.enableDefaultTyping () 方法。这个选项特别危险,因为它可全局启用多形键入。
  2. 您的 Java 类路径中 有一个或多个 gadget 类。小工具类定义为执行敏感(有漏洞利用)操作的任何类,作为执行构造或集合方法(这是在反序列化过程中调用的方法)。
  3. 您的 Java 类路径中的一个或多个 gadget 类还没有被当前版本的 jackson-databind 列入黑名单。如果您使用 jackson-databind 库的标准发行版本,则 Jackson JSON 库维护的 gadget blacklist 是针对远程代码执行漏洞的最后一行。
  4. (仅限红帽发布 jackson-databind 库) 您明确将 gadget 类之一添加到接收器上的反序列化白名单(通过设置 jackson.deserialization.whitelist.packages 系统属性)。因为这种情况不太可能这样做,白名单机制默认提供对所有 gadget 类的有效保护。

第 186 章 JSon Johnzon DataFormat

作为 Camel 2.18 版提供

Johnzon 是一个数据格式,它使用 Johnzon Library

from("activemq:My.Queue").
  marshal().json(JsonLibrary.Johnzon).
  to("mqseries:Another.Queue");

186.1. Johnzon 选项

JSon Johnzon 数据格式支持 19 选项,它们如下所列。

名称默认Java 类型描述

objectMapper

 

字符串

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

useDefaultObjectMapper

true

布尔值

是否从注册表中查找和使用默认 Jackson ObjectMapper。

prettyPrint

false

布尔值

启用大量打印输出。默认为 false。

library

XStream

JsonLibrary

要使用的 json 库。

unmarshalTypeName

 

字符串

取消armshalling 时要使用的 java 类型的类名称

jsonView

 

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

Include

 

字符串

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

allowJmsType

false

布尔值

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

collectionTypeName

 

字符串

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

useList

false

布尔值

要取消与映射列表或 Pojo 列表相关的内容。

enableJaxbAnnotationModule

false

布尔值

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

moduleClassNames

 

字符串

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

moduleRefs

 

字符串

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

enableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

disableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

权限

 

字符串

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

allowUnmarshallType

false

布尔值

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

timezone

 

字符串

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

186.2. Spring Boot Auto-Configuration

组件支持 20 个选项,如下所示。

名称描述默认类型

camel.dataformat.json-johnzon.allow-jms-type

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

false

布尔值

camel.dataformat.json-johnzon.allow-unmarshall-type

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

false

布尔值

camel.dataformat.json-johnzon.collection-type-name

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

 

字符串

camel.dataformat.json-johnzon.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.json-johnzon.disable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-johnzon.enable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-johnzon.enable-jaxb-annotation-module

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

false

布尔值

camel.dataformat.json-johnzon.enabled

启用 json-johnzon dataformat

true

布尔值

camel.dataformat.json-johnzon.include

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

 

字符串

camel.dataformat.json-johnzon.json-view

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

 

camel.dataformat.json-johnzon.library

要使用的 json 库。

 

JsonLibrary

camel.dataformat.json-johnzon.module-class-names

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

 

字符串

camel.dataformat.json-johnzon.module-refs

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

 

字符串

camel.dataformat.json-johnzon.object-mapper

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

 

字符串

camel.dataformat.json-johnzon.permissions

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

 

字符串

camel.dataformat.json-johnzon.pretty-print

启用大量打印输出。默认为 false。

false

布尔值

camel.dataformat.json-johnzon.timezone

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

 

字符串

camel.dataformat.json-johnzon.unmarshal-type-name

取消armshalling 时要使用的 java 类型的类名称

 

字符串

camel.dataformat.json-johnzon.use-default-object-mapper

是否从注册表中查找和使用默认 Jackson ObjectMapper。

true

布尔值

camel.dataformat.json-johnzon.use-list

要取消与映射列表或 Pojo 列表相关的内容。

false

布尔值

186.3. 依赖项

要在 camel 路由中使用 Johnzon,您需要添加实现此数据格式的 camel-johnzon

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-johnzon</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

第 187 章 JSON Schema Validator 组件

可作为 Camel 版本 2.20 可用

JSON Schema Validator 组件使用 NetworkNT JSON Schema 库(https://github.com/networknt/json-schema-validator)对 JSON Schemas v4 草稿执行消息正文验证。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-json-validator</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>

187.1. URI 格式

json-validator:resourceUri[?options]

其中 resourceUri 是类路径上本地资源的 URL,或者是文件系统中远程资源或资源的完整 URL,其中包含要验证的 JSON Schema。

187.2. URI 选项

JSON Schema Validator 组件没有选项。

JSON Schema Validator 端点使用 URI 语法进行配置:

json-validator:resourceUri

使用以下路径和查询参数:

187.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

资源 所需的 路径。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。

 

字符串

187.2.2. 查询参数(7 参数):

名称描述默认类型

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

failOnNullBody (producer)

如果不存在正文,是否失败。

true

布尔值

failOnNullHeader (producer)

在对标头验证时是否不存在任何标头,是否失败。

true

布尔值

headerName (producer)

要针对标头而不是邮件正文进行验证。

 

字符串

errorHandler (advanced)

使用自定义 ValidatorErrorHandler。默认错误处理程序捕获错误并抛出异常。

 

JsonValidatorError Handler

schemaLoader (advanced)

要使用自定义架构加载程序,可以添加自定义格式验证。默认实施将创建一个 schema loader,它包括了 v4 支持。

 

JsonSchemaLoader

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

187.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.json-validator.enabled

是否启用 json-validator 组件自动配置。默认启用。

 

布尔值

camel.component.json-validator.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

187.4. 示例

假设我们有以下 JSON Schema

myschema.json

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "definitions": {},
  "id": "my-schema",
  "properties": {
    "id": {
      "default": 1,
      "description": "An explanation about the purpose of this instance.",
      "id": "/properties/id",
      "title": "The id schema",
      "type": "integer"
    },
    "name": {
      "default": "A green door",
      "description": "An explanation about the purpose of this instance.",
      "id": "/properties/name",
      "title": "The name schema",
      "type": "string"
    },
    "price": {
      "default": 12.5,
      "description": "An explanation about the purpose of this instance.",
      "id": "/properties/price",
      "title": "The price schema",
      "type": "number"
    }
  },
  "required": [
    "name",
    "id",
    "price"
  ],
  "type": "object"
}

我们可以通过以下 Camel 路由验证传入的 JSON,其中 myschema.json 是从 classpath 加载的。

from("direct:start")
  .to("json-validator:myschema.json")
  .to("mock:end")

第 188 章 JSon XStream DataFormat

可作为 Camel 版本 2.0 提供

XStream 是一个数据格式,它使用 XStream 库 到 marshal 和 unmarshal Java 对象,从 XML 使用。

要在 camel 路由中使用 XStream,您需要添加实现此数据格式的 camel-xstream 依赖项。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-xstream</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

188.1. 选项

JSon XStream 数据格式支持 19 选项,它们如下所列。

名称默认Java 类型描述

objectMapper

 

字符串

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

useDefaultObjectMapper

true

布尔值

是否从注册表中查找和使用默认 Jackson ObjectMapper。

prettyPrint

false

布尔值

启用大量打印输出。默认为 false。

library

XStream

JsonLibrary

要使用的 json 库。

unmarshalTypeName

 

字符串

取消armshalling 时要使用的 java 类型的类名称

jsonView

 

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

Include

 

字符串

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

allowJmsType

false

布尔值

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

collectionTypeName

 

字符串

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

useList

false

布尔值

要取消与映射列表或 Pojo 列表相关的内容。

enableJaxbAnnotationModule

false

布尔值

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

moduleClassNames

 

字符串

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

moduleRefs

 

字符串

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

enableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

disableFeatures

 

字符串

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

权限

 

字符串

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

allowUnmarshallType

false

布尔值

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

timezone

 

字符串

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

188.2. 使用 Java DSL

// lets turn Object messages into XML then send to MQSeries
from("activemq:My.Queue").
  marshal().xstream().
  to("mqseries:Another.Queue");

如果要配置 Camel 用于消息转换的 XStream 实例,只需传递对 DSL 级别的实例的引用。

XStream xStream = new XStream();
xStream.aliasField("money", PurchaseOrder.class, "cash");
// new Added setModel option since Camel 2.14
xStream.setModel("NO_REFERENCES");
...

from("direct:marshal").
  marshal(new XStreamDataFormat(xStream)).
  to("mock:marshaled");

188.3. XMLInputFactory and XMLOutputFactory

XStream 库使用 javax.xml.stream.XMLInputFactoryjavax.xml.stream.XMLOutputFactory,您可以控制应使用该工厂的哪个实施。

使用这种算法发现 Factory:1。使用 javax.xml.stream.XMLInputFactory , javax.xml.stream.XMLOutputFactory 系统属性。2.使用 JRE_HOME 目录中的 lib/xml.stream.properties 文件。3.使用 Services API (如果可用),通过查找 META-INF/services/javax.xml.stream.XMLInputFactory,META-INF/services/javax.xml.stream.XMLOutput factory 文件提供给 JRE。4.使用平台默认的 XMLInputFactory、XMLOutputFactory 实例。

188.4. 如何在 Xstream DataFormat 中设置 XML 编码?

在 Camel 2.2.0 中,您可以通过密钥 Exchange.CHARSET_NAME 设置 Xstream DataFormat 中的 XML 编码,或者从 DSL 或 Spring 配置设置 Xstream 上的编码属性。

from("activemq:My.Queue").
  marshal().xstream("UTF-8").
  to("mqseries:Another.Queue");

188.5. 设置 Xstream DataFormat 的类型权限

在 Camel 中,路由中始终可以使用自己的处理步骤,并阻止要路由到 XStream 的 unmarhall 步骤的特定 XML 文档。从 Camel 2.16.1, 2.15.5,您可以设置 XStream 的类型权限 ,以自动允许或拒绝某些类型的实例化。

Camel 使用的默认类型权限设置拒绝除 java.lang 和 java.util 包之外的所有类型。可以通过设置系统属性 org.apache.camel.xstream.permissions 来更改此设置。其值是一个以逗号分隔的权限术语的字符串,它们分别代表要允许或拒绝的类型,具体取决于术语是前缀的 ''(注 '' 可能被省略)或使用 '-'。

每个术语都可以包含一个通配符字符 ''。例如,值 "-,java.lang.,java.util." 表示拒绝除 java.lang.* 和 java.util.* 类以外的所有类型。将这个值设置为空字符串""恢复到默认的 XStream 的类型权限处理,该处理拒绝某些列入黑名单的类并允许其他人。

type permissions 设置可以通过设置其 type permissions 属性的独立 XStream DataFormat 实例进行扩展。

    <dataFormats>
        <xstream id="xstream-default"
                 permissions="org.apache.camel.samples.xstream.*"/>
        ...

第 189 章 JsonPath Language

作为 Camel 版本 2.13 可用

Camel 支持 JSonPath 以允许使用 Expression 或 Predicate on json 消息。

from("queue:books.new")
  .choice()
    .when().jsonpath("$.store.book[?(@.price < 10)]")
      .to("jms:queue:book.cheap")
    .when().jsonpath("$.store.book[?(@.price < 30)]")
      .to("jms:queue:book.average")
    .otherwise()
      .to("jms:queue:book.expensive")

189.1. JSonPath Options

JsonPath 语言支持 7 选项,它们列在下方。

名称默认Java 类型描述

resultType

 

字符串

设置结果类型的类名称(从输出中输入)

suppressExceptions

false

布尔值

是否抑制异常,如 PathNotFoundException。

allowSimple

true

布尔值

是否在 JsonPath 表达式中允许内联简单例外

allowEasyPredicate

true

布尔值

是否允许使用容易谓词解析程序来预解析 predicates。

writeAsString

false

布尔值

是否将每行/元素的输出写为 JSON String 值,而不是 Map/POJO 值。

headerName

 

字符串

用作输入的标头名称,而不是消息正文

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

189.2. Spring Boot Auto-Configuration

组件支持 7 个选项,如下所示。

名称描述默认类型

camel.language.jsonpath.allow-easy-predicate

是否允许使用容易谓词解析程序来预解析 predicates。

true

布尔值

camel.language.jsonpath.allow-simple

是否在 JsonPath 表达式中允许内联简单例外

true

布尔值

camel.language.jsonpath.enabled

启用 jsonpath 语言

true

布尔值

camel.language.jsonpath.header-name

用作输入的标头名称,而不是消息正文

 

字符串

camel.language.jsonpath.suppress-exceptions

是否抑制异常,如 PathNotFoundException。

false

布尔值

camel.language.jsonpath.trim

是否修剪值是否删除前导(尾随空格和换行符)

true

布尔值

camel.language.jsonpath.write-as-string

是否将每行/元素的输出写为 JSON String 值,而不是 Map/POJO 值。

false

布尔值

189.3. 使用 XML 配置

如果要在 Spring XML 文件中配置路由,您可以使用 JSonPath 表达式,如下所示

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <choice>
      <when>
        <jsonpath>$.store.book[?(@.price &lt; 10)]</jsonpath>
        <to uri="mock:cheap"/>
      </when>
      <when>
        <jsonpath>$.store.book[?(@.price &lt; 30)]</jsonpath>
        <to uri="mock:average"/>
      </when>
      <otherwise>
        <to uri="mock:expensive"/>
      </otherwise>
    </choice>
  </route>
</camelContext>

189.4. 语法

更多示例请查看 JSonPath 项目页面。

189.5. 简单的语法

可作为 Camel 2.19 提供

当您想使用 jsonpath 语法定义基本谓词时,很难记住语法。例如,要找出您必须做的便宜的图书

$.store.book[?(@.price < 20)]

但是,如果您只将其写成

store.book.price < 20

如果只想查看使用价格键的节点,则可以省略该路径

price < 20

为了支持这种支持,如果您已使用基本风格定义了 predicate,有一个 EasyPredicateParser 启动它。这意味着 predicate 不能使用 $ 符号启动,且仅包含一个 operator。

一个简单的语法是:

left OP right

您可以在正确的操作员中使用 Camel 简单语言,例如

store.book.price < ${header.limit}

189.6. 支持的消息正文类型

Camel JSonPath 支持使用以下类型的消息正文:

类型注释

File

从文件读取

字符串

普通字符串

Map

Message bodies as java.util.Map 类型

list

Message bodies as java.util.List type

POJO

可选的 Jackson 位于类路径上,那么 camel-jsonpath 可以使用 Jackson 将消息正文读为 POJO,并转换为 java.util.Map,它由 JSonPath 支持。例如,您可以添加 camel-jackson 作为依赖项,以包含 Jackson。

InputStream

如果以上类型都不匹配,则 Camel 将试图将消息正文读取为 java.io.InputStream

如果消息正文不受支持,则默认抛出异常,但您可以将 JSonPath 配置为禁止异常(请参阅以下)

189.7. 抑制例外

可从 Camel 2.16 开始

默认情况下,如果 json 有效负载没有相应配置 jsonpath 表达式的有效路径,则 jsonpath 将抛出异常。在一些用例中,如果 json 有效负载包含可选数据,您可能希望忽略它。因此,您可以将选项设置为 true 以忽略这种情况,如下所示:

from("direct:start")
    .choice()
        // use true to suppress exceptions
        .when().jsonpath("person.middlename", true)
            .to("mock:middle")
        .otherwise()
            .to("mock:other");

在 XML DSL 中:

<route>
  <from uri="direct:start"/>
  <choice>
    <when>
      <jsonpath suppressExceptions="true">person.middlename</jsonpath>
      <to uri="mock:middle"/>
    </when>
    <otherwise>
      <to uri="mock:other"/>
    </otherwise>
  </choice>
</route>

此选项也位于 @JsonPath 注释。

189.8. 内联简单例外

可从 Camel 2.18 开始

现在,使用简单语法 ${xxx},它可以在 JSonPath 表达式中内联简单语言表达式。下面是一个示例:

from("direct:start")
  .choice()
    .when().jsonpath("$.store.book[?(@.price < ${header.cheap})]")
      .to("mock:cheap")
    .when().jsonpath("$.store.book[?(@.price < ${header.average})]")
      .to("mock:average")
    .otherwise()
      .to("mock:expensive");

在 XML DSL 中:

<route>
  <from uri="direct:start"/>
  <choice>
    <when>
      <jsonpath>$.store.book[?(@.price < ${header.cheap})]</jsonpath>
      <to uri="mock:cheap"/>
    </when>
    <when>
      <jsonpath>$.store.book[?(@.price < ${header.average})]</jsonpath>
      <to uri="mock:average"/>
    </when>
    <otherwise>
      <to uri="mock:expensive"/>
    </otherwise>
  </choice>
</route>

您可以通过将选项 allowSimple 设置为 false 来关闭对内联简单表达式的支持,如下所示:

.when().jsonpath("$.store.book[?(@.price < 10)]", false, false)

在 XML DSL 中:

<jsonpath allowSimple="false">$.store.book[?(@.price < 10)]</jsonpath>

189.9. JSonPath injection

您可以使用 Bean 集成在 bean 上调用方法,并使用 JSonPath 等各种语言从消息中提取值并将其绑定到方法参数。

例如:

public class Foo {

    @Consume(uri = "activemq:queue:books.new")
    public void doSomething(@JsonPath("$.store.book[*].author") String author, @Body String json) {
      // process the inbound message here
    }
}

189.10. 编码检测

Camel 版本 2.16 开始,会自动检测 JSON 文档的编码,如果文档在 unicode (UTF-8, UTF-16LE, UTF-16BE, UTF-16BE, UTF-32BE)中被编码,如 RFC-4627 中指定的。如果编码为非unicode 编码,您可以确保以 String 格式输入文档到 JSONPath 组件,或者您可以指定标题"CamelJsonPathJsonEncoding" (JsonpathConstants.HEADER_JSON_ENCODING)中的编码。

189.11. 将 JSon 数据分割为 JSon 的子行

您可以使用 jsonpath 来分割 JSon 文档,例如:

from("direct:start")
    .split().jsonpath("$.store.book[*]")
    .to("log:book");

然后会记录每个图书,但消息正文是一个 映射 实例。有时您可能需要以纯文本 JSon 值的形式输出输出,这可以通过 writeAsString 选项从 Camel 2.20 开始,如下所示:

from("direct:start")
    .split().jsonpathWriteAsString("$.store.book[*]")
    .to("log:book");

然后,每个图书都会以 String JSon 值的形式记录。对于早期版本的 Camel,您需要使用 camel-jackson 数据格式和消息正文,从而使邮件正文从 map 转换为 String 类型。

189.12. 使用标头作为输入

可从 Camel 2.20 开始

默认情况下 jsonpath 使用消息正文作为输入源。但是,您还可以通过指定 headerName 选项来使用标头作为输入。

例如,若要从 json 文档中计算图书的数量,该文件位于名为 books 的标头中:

from("direct:start")
    .setHeader("numberOfBooks")
        .jsonpath("$..store.book.length()", false, int.class, "books")
    .to("mock:result");

在上面的 jsonpath 表达式中,我们将标头名称指定为 books,我们也希望将结果转换为 int.class 的整数。

XML DSL 中的相同示例是:

<route>
  <from uri="direct:start"/>
  <setHeader headerName="numberOfBooks">
    <jsonpath headerName="books" resultType="int">$..store.book.length()</jsonpath>
  </transform>
  <to uri="mock:result"/>
</route>

189.13. 依赖项

要在 camel 路由中使用 JSonPath,您需要添加实现 JSonPath 语言的 camel-jsonpath 依赖关系。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-jsonpath</artifactId>
  <version>x.x.x</version>
</dependency>

第 190 章 JT400 组件

可作为 Camel 版本 1.5 提供

jt400 组件允许您使用数据队列将消息与 AS/400 系统交换。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jt400</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

190.1. URI 格式

jt400://user:password@system/QSYS.LIB/LIBRARY.LIB/QUEUE.DTAQ[?options]

要调用远程程序(Camel 2.7)

jt400://user:password@system/QSYS.LIB/LIBRARY.LIB/program.PGM[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

190.2. JT400 选项

JT400 组件支持 2 个选项,它们如下所列。

名称描述默认类型

connectionPool (advanced)

返回此组件使用的默认连接池。

 

AS400ConnectionPool

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

JT400 端点使用 URI 语法进行配置:

jt400:userID:password/systemName/objectPath.type

使用以下路径和查询参数:

190.2.1. 路径名(5 参数):

名称描述默认类型

userID

必需 返回 AS/400 用户的 ID。

 

字符串

password

必需 返回 AS/400 用户的密码。

 

字符串

systemName

必需 返回 AS/400 系统的名称。

 

字符串

objectPath

必需 返回此端点的目标对象的完全限定域名。

 

字符串

type

需要 Whether 来处理数据队列或远程程序调用

 

Jt400Type

190.2.2. 查询参数(30 参数):

名称描述默认类型

ccsid (common)

设置用于与 AS/400 系统连接的 CCSID。

 

int

format (common)

设置用于发送消息的数据格式。

text

格式

guiAvailable (common)

设置运行 Camel 的环境中是否启用了 AS/400 提示。

false

布尔值

keyed (common)

是否使用密钥或非密钥的数据队列。

false

布尔值

outputFieldsIdxArray (common)

指定输出参数(编程参数)是输出参数。

 

Integer[]

outputFieldsLengthArray (common)

在 AS/400 程序定义中,指定字段(编程参数)长度。

 

Integer[]

searchKey (common)

搜索密钥数据队列的密钥。

 

字符串

searchType (common)

搜索类型,如 EQ 表示等等。

EQ

SearchType

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

readTimeout (consumer)

在尝试读取数据队列的新消息时,消费者将等待超时。

30000

int

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

procedureName (procedureName)

从服务程序到调用的步骤名称

 

字符串

安全 (安全)

是否通过 SSL 对 AS/400 的连接进行保护。

false

布尔值

190.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.jt400.connection-pool

返回此组件使用的默认连接池。选项为 com.ibm.as400.access.AS400ConnectionPool 类型。

 

字符串

camel.component.jt400.enabled

启用 jt400 组件

true

布尔值

camel.component.jt400.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

190.4. 使用

当配置为消费者端点时,端点将在远程系统上轮询数据队列。对于数据队列中的每个条目,会根据格式,在 In message 的正文中发送一个新的 Exchange,以 Stringbyte[] 格式。对于提供程序端点,In message body 内容将以 raw 字节或文本的形式放入数据队列中。

190.5. 连接池

可从 Camel 2.10 开始

连接池正在从 Camel 2.10 开始被使用。您可以在 Jt400Component 上配置连接池,或者作为端点上的 uri 选项配置连接池。

190.5.1. 远程程序调用(Camel 2.7)

此端点要求输入是 String 数组或字节[] 阵列(取决于格式),并通过原生 jt400 库机制处理所有 CCSID 处理。通过将 null 传递给位置的值(远程程序必须支持它),可忽略参数。在程序执行后,端点会返回一个 String 数组或 byte[] 数组,其值由程序返回(仅输入的参数会包含与调用开头的数据相同的数据)。此端点不实施提供程序端点!

190.6. 示例

在下面的代码片段中,发送到 direct:george 端点的交换的数据将放置在名为 LIVERPOOL 的系统中的 data 队列 PENNYLANE 中。
另一个用户连接到同一数据队列,以接收来自数据队列中的信息,并将其转发到 mock:ringo 端点。

public class Jt400RouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
       from("direct:george").to("jt400://GEORGE:EGROEG@LIVERPOOL/QSYS.LIB/BEATLES.LIB/PENNYLANE.DTAQ");
       from("jt400://RINGO:OGNIR@LIVERPOOL/QSYS.LIB/BEATLES.LIB/PENNYLANE.DTAQ").to("mock:ringo");
    }
}

190.6.1. 远程程序调用示例(Camel 2.7)

在下面的代码片段中,发送到 direct:work 端点的数据 Exchange 将包含三个字符串,这些字符串将用作库"assets"中的程序"compute"的参数。该程序将在第二代 和 3rd 参数中编写输出值。所有参数都将发送到 direct:play 端点。

public class Jt400RouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
       from("direct:work").to("jt400://GRUPO:ATWORK@server/QSYS.LIB/assets.LIB/compute.PGM?fieldsLength=10,10,512&ouputFieldsIdx=2,3").to(“direct:play”);
    }
}

190.6.2. 写入密钥数据队列

from("jms:queue:input")
.to("jt400://username:password@system/lib.lib/MSGINDQ.DTAQ?keyed=true");

190.6.3. 从密钥的数据队列读取

from("jt400://username:password@system/lib.lib/MSGOUTDQ.DTAQ?keyed=true&searchKey=MYKEY&searchType=GE")
.to("jms:queue:output");

190.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 191 章 Kafka Component

作为 Camel 版本 2.13 可用

kafka: 组件用于与 Apache Kafka 消息代理通信。

Maven 用户需要将以下依赖项添加到其 pom.xml 中,以便该组件:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-kafka</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

191.1. URI 格式

kafka:topic[?options]

191.2. 选项

Kafka 组件支持 9 个选项,它们如下所列。

名称描述默认类型

configuration (common)

允许预先配置带有端点可重用的常用选项的 Kafka 组件。

 

KafkaConfiguration

brokers (common)

要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理子集或指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。

 

字符串

workerPool (advanced)

要使用共享自定义 worker 池在 kafka 服务器后继续路由 Exchange,请确认使用异步非阻塞处理从 KafkaProducer 发送到它的消息。如果使用这个选项,则必须处理线程池的生命周期,以便在需要时关闭池。

 

ExecutorService

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

breakOnFirstError (consumer)

该选项控制在消费者处理交换时所发生的情况,它会失败。如果 选项为 false,则使用者将继续进行下一个消息并进行处理。如果 选项为 true,则使用者将中断,并且会重新查找导致失败的消息偏移,然后重新尝试处理此消息。但是,如果其绑定每次都失败,则可能导致完全无法处理同一消息,例如投毒消息。因此,建议通过使用 Camel 的错误处理程序来处理该示例。

false

布尔值

allowManualCommit (consumer)

是否允许通过 KafkaManualCommit 进行手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange message 标头上,这允许最终用户访问这个 API,并通过 Kafka consumer 执行手动偏移提交。

false

布尔值

kafkaManualCommit Factory (consumer)

创建 KafkaManualCommit 实例使用的工厂。这样,在进行手动提交时,可以插入一个自定义 KafkaManualCommit 实例来创建自定义 KafkaManualCommit 实例。

 

KafkaManualCommit Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

shutdownTimeout (common)

以毫秒为单位的超时,以正常等待使用者或制作者关闭和终止其 worker 线程。

30000

int

Kafka 端点使用 URI 语法配置:

kafka:topic

使用以下路径和查询参数:

191.2.1. 路径名(1 参数):

名称描述默认类型

topic

要使用的主题的 必需 名称。在使用者上,您可以使用逗号分隔多个主题。制作者只能发送消息到单个主题。

 

字符串

191.2.2. 查询参数(94 参数):

名称描述默认类型

brokers (common)

要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理子集或指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。

 

字符串

clientId (common)

客户端 ID 是在每次请求中发送的用户指定的字符串,以帮助跟踪调用。它应该以逻辑方式识别发出请求的应用程序。

 

字符串

headerFilterStrategy (common)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

reconnectBackoffMaxMs (common)

重新连接到重复连接失败的代理时要等待的最大时间,以毫秒为单位。如果提供,每个主机的 backoff 将根据连续连接失败增加每个连续连接失败,最多增加这个最大值。在计算后,添加 20% 的随机 jitter 以避免连接停滞。

1000

整数

allowManualCommit (consumer)

是否允许通过 KafkaManualCommit 进行手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange message 标头上,这允许最终用户访问这个 API,并通过 Kafka consumer 执行手动偏移提交。

false

布尔值

autoCommitEnable (consumer)

如果为 true,请定期提交 ZooKeeper 被消费者获取的消息偏移。当进程失败时,将使用提交的偏移量,作为新消费者开始的位置。

true

布尔值

autoCommitIntervalMs (consumer)

消费者偏移量的频率被提交到 zookeeper。

5000

整数

autoCommitOnStop (consumer)

当消费者停止时,是否执行显式自动提交,以确保代理有来自上一次消耗的消息的提交。这需要打开 autoCommitEnable 选项。可能的值有:sync、sync 或 none。sync 是默认值。

sync

字符串

autoOffsetReset (consumer)

ZooKeeper 中没有初始偏移时做什么:如果偏移偏移范围不足: 最早的 : 自动将偏移重置为最新的偏移:自动将偏移重置为最新偏移失败:将异常设置为使用者

latest

字符串

breakOnFirstError (consumer)

该选项控制在消费者处理交换时所发生的情况,它会失败。如果 选项为 false,则使用者将继续进行下一个消息并进行处理。如果 选项为 true,则使用者将中断,并且会重新查找导致失败的消息偏移,然后重新尝试处理此消息。但是,如果其绑定每次都失败,则可能导致完全无法处理同一消息,例如投毒消息。因此,建议通过使用 Camel 的错误处理程序来处理该示例。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

checkCrcs (consumer)

自动检查消耗的记录的 CRC32。这可确保没有发生消息的在线或磁盘损坏。这个检查会增加一些开销,因此在寻求极端性能的情况下可能会禁用它。

true

布尔值

consumerRequestTimeoutMs (consumer)

配置控制客户端等待请求响应的最长时间。如果在超时前未收到响应,如果请求用尽,则客户端将重新发送请求,或者请求失败。

40000

整数

consumersCount (consumer)

连接到 kafka 服务器的消费者数量

1

int

consumerStreams (consumer)

消费者上的并发用户数量

10

int

fetchMaxBytes (consumer)

如果 get 的第一个非空分区中的第一条大于这个值大于这个值,则服务器应返回最多的数据量应返回这个值,以确保使用者可以进行进展。代理接受的最大消息大小通过 message.max.bytes (broker config)或 max.message.bytes (主题配置)来定义。请注意,使用者执行多个并行获取。

52428800

整数

fetchMinBytes (consumer)

服务器应返回获取请求的最小数据量。如果没有足够的数据可用,请求会等待该数据在回答请求前累积累积。

1

整数

fetchWaitMaxMs (consumer)

如果没有足够的数据立即满足 fetch.min.bytes,则服务器将在应答获取请求前阻止的最大时间。

500

整数

groupId (consumer)

唯一标识此消费者所属消费者的消费者进程组的字符串。通过设置同一个组 id 多个进程,表示它们都是同一消费者组的所有部分。消费者需要此选项。

 

字符串

heartbeatIntervalMs (consumer)

在使用 Kafka 的组管理设施时,心跳到消费者协调器之间预期的时间。心跳用于确保消费者的会话保持活跃,并在新消费者加入或离开组时促进重新平衡。该值必须设置小于 session.timeout.ms,但通常不应设置超过该值的 1/3。甚至可以调整它,以控制正常重新平衡的预期时间。

3000

整数

kafkaHeaderDeserializer (consumer)

为 deserialization kafka 标头值设置自定义 KafkaHeaderDeserializer 以 camel headers 值。

 

KafkaHeaderDeserializer

keyDeserializer (consumer)

用于实现 Deserializer 接口的密钥的 Deserializer 类。

org.apache.kafka.common.serialization.StringDeserializer

字符串

maxPartitionFetchBytes (consumer)

服务器将返回每个分区的最大数据量。用于请求的最大内存总量为 #partitions max.partition.fetch.bytes。这种大小必须至少与服务器允许的最大消息大小相同,或者生产者能够发送大于消费者可获取的消息。如果出现这种情况,消费者会卡住在特定分区上获取大量信息。

1048576

整数

maxPollIntervalMs (consumer)

在使用消费者组管理时,poll ()的调用之间的最大延迟。这会在获取更多记录前处于闲置时间的上限。如果在这个超时过期前不调用 poll (),则消费者被视为失败,并且组将重新平衡,从而将分区重新分配给其他成员。

 

Long

maxPollRecords (consumer)

单个调用中返回的最大记录数,用于 poll ()

500

整数

offsetRepository (consumer)

要使用的偏移存储库,在本地存储每个主题分区的误差。定义一个将禁用 autocommit。

 

StateRepository

partitionAssignor (consumer)

使用组管理时,客户端将使用的分区分配策略在原始消费者实例之间分发分区所有权

org.apache.kafka.clients.consumer.RangeAssignor

字符串

pollTimeoutMs (consumer)

轮询 KafkaConsumer 时使用的超时。

5000

Long

seekTo (consumer)

设定如果 KafkaConsumer 将在启动时读取或结束:从开头读取:从结尾读取,这将替换掉前面的属性 seekToBeginning

 

字符串

sessionTimeoutMs (consumer)

使用 Kafka 的组管理功能时检测故障的超时时间。

10000

整数

shutdownTimeout (common)

以毫秒为单位的超时,以正常等待使用者或制作者关闭和终止其 worker 线程。

30000

int

topicIsPattern (consumer)

主题是模式(正则表达式)。这可用于订阅与模式匹配的动态主题。

false

布尔值

valueDeserializer (consumer)

对实现 Deserializer 接口的值进行反序列化器类。

org.apache.kafka.common.serialization.StringDeserializer

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

bridgeEndpoint (producer)

如果选项为 true,则 KafkaProducer 将忽略入站消息的 KafkaConstants.TOPIC 标头设置。

false

布尔值

bufferMemorySize (producer)

制作者可用于缓冲记录的内存总量,等待发送到服务器。如果记录的发送速度快于服务器,则生产者不会根据 block.on.buffer.full 指定的首选项进行阻止或抛出异常。此设置应该大致对应于制作者将使用的总内存,而不是硬绑定,因为生产者不使用所有内存。一些额外的内存用于压缩(如果启用了压缩)以及维护航班请求。

33554432

整数

circularTopicDetection (producer)

如果 选项为 true,则 KafkaProducer 将检测到消息是否试图将消息发送到它所来自的同一主题(如果从 kafka consumer 原始)。如果 KafkaConstants.TOPIC 标头与原始 kafka consumer 主题相同,则忽略标头设置,并使用制作者端点的主题。换句话说,这可避免将相同的消息发送回来自哪里。如果选项 bridgeEndpoint 设为 true,则使用这个选项。

true

布尔值

compressionCodec (producer)

此参数允许您指定此制作者生成的所有数据的压缩代码。有效值为 none、gzip 和 snappy。

none

字符串

connectionMaxIdleMs (producer)

在此配置指定的毫秒数后关闭闲置连接。

540000

整数

enableIdempotence (producer)

如果设置为 'true',则制作者将确保流中写入每条消息的一个副本。如果 'false',则生产者重试可能会在流中写入重试消息的副本。如果设置为 true,这个选项需要 max.in.flight.requests.per.connection 设置为 1,且重试无法为零,另外的攻击必须设置为 'all'。

false

布尔值

kafkaHeaderSerializer (producer)

为序列化 camel 标头值设置自定义 KafkaHeaderDeserializer 到 kafka 标头值。

 

KafkaHeaderSerializer

key (producer)

记录密钥(如果没有指定密钥,则为 null)。如果配置了这个选项,则优先于标头 KafkaConstants#KEY

 

字符串

keySerializerClass (producer)

密钥的 serializer 类(如果未指定任何信息,默认为与消息相同)。

org.apache.kafka.common.serialization.StringSerializer

字符串

lingerMs (producer)

制作者将请求传输到单一批处理请求之间的任何记录分组在一起。通常,仅当记录到达的速度比发送的速度快时,这才会发生。但是在某些情形中,客户端可能也会减少请求的数量,即使在中等负载下也是如此。此设置通过添加少量延迟来达到此目的,而不是立即发送记录,以便生产者最多等待给定延迟发送其他记录,从而使发送其他记录可以合并在一起。这可能被视为与在 TCP 中 Nagle 的算法类似。此设置提供批量延迟的上限:一旦我们获得批次,每个分区的相应记录会立即发送,而无论此设置如何,我们将立即发送超过此分区的字节数,那么我们将会"linger' 以便等待更多记录显示。此设置默认为 0 (即没有延迟)。例如,设置 linger.ms=5 将对发送的请求数量产生影响,但会最多为加载加载时发送的记录添加 5ms 的延迟。

0

整数

maxBlockMs (producer)

配置控制 kafka 发送到 kafka 的时长。由于多个原因,这些方法可以被阻断。例如: buffer full,metadata 不可用。这种配置会对获取元数据的总时间、键和值序列化、在执行 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 类,用于对st 子主题之间的消息进行分区。默认分区器基于密钥的哈希。

org.apache.kafka.clients.producer.internals.DefaultPartitioner

字符串

partitionKey (producer)

记录将被发送的分区(如果没有指定分区,则为 null)。如果配置了这个选项,则优先于标头 KafkaConstants#PARTITION_KEY

 

整数

producerBatchSize (producer)

每当多个记录被发送到同一分区时,生产者将尝试将记录集中到更少的请求。这有助于在客户端和服务器中性能。此配置以字节为单位控制默认批处理大小。将不尝试批量记录,而不是发送到代理的批处理。请求将包含多个批处理,每个分区都有多个批处理,每个分区都可用于发送数据。一个小批处理大小将降低批处理,并可以降低吞吐量(零批处理大小完全将完全禁用批处理)。非常大的批量大小可能会更加严重地使用内存,因为我们将始终在指定批处理大小中分配指定批处理大小的缓冲区。

16384

整数

queueBufferingMaxMessages (producer)

在使用 async 模式时可排队制作者的最大未处理消息数量,然后才能阻止制作者或必须丢弃数据。

10000

整数

receiveBufferBytes (producer)

TCP 接收缓冲区的大小(SO_RCVBUF),用于读取数据。

65536

整数

reconnectBackoffMs (producer)

尝试重新连接给定主机前等待的时间。这可避免在紧张循环中重复连接到主机。这个 backoff 适用于由消费者发送到代理的所有请求。

50

整数

recordMetadata (producer)

制作者应该存储 RecordMetadata 结果是否应该发送到 Kafka。结果存储在包含 RecordMetadata 元数据的列表中。列表存储在带有键 KafkaConstants#KAFKA_RECORDMETA 的标头中

true

布尔值

requestRequiredAcks (producer)

生产者数量要求领导人在考虑请求完成前收到。这会控制发送的记录的持久性。以下设置是 common: acks=0 如果设为零,则制作者不会等待全部来自服务器的任何致谢。记录将立即添加到套接字缓冲区并被视为发送。在这种情况下,无法保证服务器收到记录,并且重试配置不会生效(因为客户端通常不会知道任何故障)。每个记录给出的误差将始终设置为 -1. acks=1 意味着领导机会将记录写入其本地日志,但是不会对所有后续者等待完全确认。在这种情况下,领导机应该立即在记录后立即失败,但后续人已复制记录将会丢失。acks=all 意味着领导机将等待完全同步副本组确认记录。这样可保证,只要至少有一个 in-sync 副本仍保持上线,则记录将不会丢失。这是可用最强的保证。

1

字符串

requestTimeoutMs (producer)

在向客户端发送错误前,代理会等待满足 request.required.acks 要求的时间。

305000

整数

retries (producer)

设置大于零的值将导致客户端重新发送发送失败并显示可能瞬态错误的任何记录。请注意,这个重试与客户端在收到错误时重新输入记录不同。允许重试可能会更改记录顺序,因为如果将两个记录发送到单个分区,则第一个记录失败并重试,但第二个记录可能会首先出现。

0

整数

retryBackoffMs (producer)

在重试前,生产者都会刷新相关主题的元数据,以查看是否已选定新的领导人。由于领导选举需要一定的时间,因此此属性指定制作者在刷新元数据前等待的时间。

100

整数

sendBufferBytes (producer)

套接字写入缓冲区大小

131072

整数

serializerClass (producer)

消息的 serializer 类。

org.apache.kafka.common.serialization.StringSerializer

字符串

workerPool (producer)

使用自定义 worker 池在 kafka 服务器后继续路由 Exchange,已确认通过异步非阻塞处理从 KafkaProducer 发送到它的消息。

 

ExecutorService

workerPoolCoreSize (producer)

kafka 服务器后用于继续路由 Exchange 的 worker 池的核心线程数量,确认已使用异步非阻塞处理从 KafkaProducer 发送到它的消息。

10

整数

workerPoolMaxSize (producer)

kafka 服务器后用于继续路由 Exchange 的 worker 池的最大线程数量已被确认使用异步非阻塞处理从 KafkaProducer 发送到它的消息。

20

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

interceptorClasses (monitoring)

为制作者或消费者设置拦截器。制作者拦截器必须是实施 org.apache.kafka.clients.producer.ProducerInterceptor 拦截器的类,必须实施 org.apache.kafka.clients.consumer.ConsumerInterceptors.consumer.ConsumerInterceptoror,它将在运行时引发一个类广播异常。

 

字符串

kerberosBeforeReloginMin Time (security)

刷新尝试之间的登录线程睡眠时间。

60000

整数

kerberosInitCmd (security)

Kerberos kinit 命令路径.默认为 /usr/bin/kinit

/usr/bin/kinit

字符串

kerberosPrincipalToLocal 规则 (安全性)

用于从主体名称映射到短名称的规则列表(通常是操作系统用户名)。规则按顺序进行评估,第一个与主体名称匹配的规则用于将它映射到短名称。之后的任何规则都将被忽略。默认情况下,格式为 username/hostnameREALM 的主体名称映射到 username。有关格式的详情,请查看安全授权和 acl。可以使用逗号分隔多个值

DEFAULT

字符串

kerberosRenewJitter (security)

添加至续订时间的随机危害百分比。

0.05

kerberosRenewWindowFactor (security)

登录线程会休眠,直到指定的窗口因时间从上一次刷新到 ticket 的到期时间才会处于睡眠状态,此时它将尝试更新票据。

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)机制。如需有效值,请参阅 http://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.xhtml

GSSAPI

字符串

securityProtocol (security)

用于与代理通信的协议。目前只支持 PLAINTEXT 和 SSL。

PLAINTEXT

字符串

sslCipherSuites (security)

密码套件列表。这是身份验证、加密、MAC 和密钥交换算法的命名组合,用于使用 TLS 或 SSL 网络协议来协商网络连接的安全设置。By 默认为所有可用的加密套件。

 

字符串

sslContextParameters (security)

使用 Camel SSLContextParameters 对象的 SSL 配置。如果在其他 SSL 端点参数之前应用了它。

 

SSLContextParameters

sslEnabledProtocols (security)

为 SSL 连接启用的协议列表。TLSv1.2、TLSv1.1 和 TLSv1 默认启用。

TLSv1.2,TLSv1.1,TLSv1

字符串

sslEndpointAlgorithm (security)

使用服务器证书验证服务器主机名的端点标识算法。

 

字符串

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。较旧 JVM 中可能会支持 SSLv2 和 SSLv3,但由于已知安全漏洞,不建议使用它们。

TLS

字符串

sslProvider (security)

用于 SSL 连接的安全提供商的名称。默认值是 JVM 的默认安全提供程序。

 

字符串

sslTrustmanagerAlgorithm (security)

信任管理器工厂用于 SSL 连接的算法。默认值是 Java 虚拟机配置的信任管理器工厂算法。

PKIX

字符串

sslTruststoreLocation (security)

信任存储文件的位置。

 

字符串

sslTruststorePassword (security)

信任存储文件的密码。

 

字符串

sslTruststoreType (security)

信任存储文件的文件格式。默认值为 JKS。

JKS

字符串

191.3. Spring Boot Auto-Configuration

组件支持 99 个选项,它们如下所列。

名称描述默认类型

camel.component.kafka.allow-manual-commit

是否允许通过 KafkaManualCommit 进行手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange message 标头上,这允许最终用户访问这个 API,并通过 Kafka consumer 执行手动偏移提交。

false

布尔值

camel.component.kafka.break-on-first-error

该选项控制在消费者处理交换时所发生的情况,它会失败。如果 选项为 false,则使用者将继续进行下一个消息并进行处理。如果 选项为 true,则使用者将中断,并且会重新查找导致失败的消息偏移,然后重新尝试处理此消息。但是,如果其绑定每次都失败,则可能导致完全无法处理同一消息,例如投毒消息。因此,建议通过使用 Camel 的错误处理程序来处理该示例。

false

布尔值

camel.component.kafka.brokers

要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理子集或指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。

 

字符串

camel.component.kafka.configuration.allow-manual-commit

是否允许通过 KafkaManualCommit 进行手动提交。如果启用了这个选项,则 KafkaManualCommit 实例存储在 Exchange message 标头上,这允许最终用户访问这个 API,并通过 Kafka consumer 执行手动偏移提交。

false

布尔值

camel.component.kafka.configuration.auto-commit-enable

如果为 true,请定期提交 ZooKeeper 被消费者获取的消息偏移。当进程失败时,将使用提交的偏移量,作为新消费者开始的位置。

true

布尔值

camel.component.kafka.configuration.auto-commit-interval-ms

消费者偏移量的频率被提交到 zookeeper。

5000

整数

camel.component.kafka.configuration.auto-commit-on-stop

当消费者停止时,是否执行显式自动提交,以确保代理有来自上一次消耗的消息的提交。这需要打开 autoCommitEnable 选项。可能的值有:sync、sync 或 none。sync 是默认值。

sync

字符串

camel.component.kafka.configuration.auto-offset-reset

ZooKeeper 中没有初始偏移时做什么:如果偏移偏移范围不足: 最早的 : 自动将偏移重置为最新的偏移:自动将偏移重置为最新偏移失败:将异常设置为使用者

latest

字符串

camel.component.kafka.configuration.break-on-first-error

该选项控制在消费者处理交换时所发生的情况,它会失败。如果 选项为 false,则使用者将继续进行下一个消息并进行处理。如果 选项为 true,则使用者将中断,并且会重新查找导致失败的消息偏移,然后重新尝试处理此消息。但是,如果其绑定每次都失败,则可能导致完全无法处理同一消息,例如投毒消息。因此,建议通过使用 Camel 的错误处理程序来处理该示例。

false

布尔值

camel.component.kafka.configuration.bridge-endpoint

如果选项为 true,则 KafkaProducer 将忽略入站消息的 KafkaConstants.TOPIC 标头设置。

false

布尔值

camel.component.kafka.configuration.brokers

要使用的 Kafka 代理的 URL。格式为 host1:port1,host2:port2,列表可以是代理子集或指向代理子集的 VIP。这个选项在 Kafka 文档中称为 bootstrap.servers。

 

字符串

camel.component.kafka.configuration.buffer-memory-size

制作者可用于缓冲记录的内存总量,等待发送到服务器。如果记录的发送速度快于服务器,则生产者不会根据 block.on.buffer.full 指定的首选项进行阻止或抛出异常。此设置应该大致对应于制作者将使用的总内存,而不是硬绑定,因为生产者不使用所有内存。一些额外的内存用于压缩(如果启用了压缩)以及维护航班请求。

33554432

整数

camel.component.kafka.configuration.check-crcs

自动检查消耗的记录的 CRC32。这可确保没有发生消息的在线或磁盘损坏。这个检查会增加一些开销,因此在寻求极端性能的情况下可能会禁用它。

true

布尔值

camel.component.kafka.configuration.circular-topic-detection

如果 选项为 true,则 KafkaProducer 将检测到消息是否试图将消息发送到它所来自的同一主题(如果从 kafka consumer 原始)。如果 KafkaConstants.TOPIC 标头与原始 kafka consumer 主题相同,则忽略标头设置,并使用制作者端点的主题。换句话说,这可避免将相同的消息发送回来自哪里。如果选项 bridgeEndpoint 设为 true,则使用这个选项。

true

布尔值

camel.component.kafka.configuration.client-id

客户端 ID 是在每次请求中发送的用户指定的字符串,以帮助跟踪调用。它应该以逻辑方式识别发出请求的应用程序。

 

字符串

camel.component.kafka.configuration.compression-codec

此参数允许您指定此制作者生成的所有数据的压缩代码。有效值为 none、gzip 和 snappy。

none

字符串

camel.component.kafka.configuration.connection-max-idle-ms

在此配置指定的毫秒数后关闭闲置连接。

540000

整数

camel.component.kafka.configuration.consumer-request-timeout-ms

配置控制客户端等待请求响应的最长时间。如果在超时前未收到响应,如果请求用尽,则客户端将重新发送请求,或者请求失败。

40000

整数

camel.component.kafka.configuration.consumer-streams

消费者上的并发用户数量

10

整数

camel.component.kafka.configuration.consumers-count

连接到 kafka 服务器的消费者数量

1

整数

camel.component.kafka.configuration.enable-idempotence

如果设置为 'true',则制作者将确保流中写入每条消息的一个副本。如果 'false',则生产者重试可能会在流中写入重试消息的副本。如果设置为 true,这个选项需要 max.in.flight.requests.per.connection 设置为 1,且重试无法为零,另外的攻击必须设置为 'all'。

false

布尔值

camel.component.kafka.configuration.fetch-max-bytes

如果 get 的第一个非空分区中的第一条大于这个值大于这个值,则服务器应返回最多的数据量应返回这个值,以确保使用者可以进行进展。代理接受的最大消息大小通过 message.max.bytes (broker config)或 max.message.bytes (主题配置)来定义。请注意,使用者执行多个并行获取。

52428800

整数

camel.component.kafka.configuration.fetch-min-bytes

服务器应返回获取请求的最小数据量。如果没有足够的数据可用,请求会等待该数据在回答请求前累积累积。

1

整数

camel.component.kafka.configuration.fetch-wait-max-ms

如果没有足够的数据立即满足 fetch.min.bytes,则服务器将在应答获取请求前阻止的最大时间。

500

整数

camel.component.kafka.configuration.group-id

唯一标识此消费者所属消费者的消费者进程组的字符串。通过设置同一个组 id 多个进程,表示它们都是同一消费者组的所有部分。消费者需要此选项。

 

字符串

camel.component.kafka.configuration.header-filter-strategy

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

camel.component.kafka.configuration.heartbeat-interval-ms

在使用 Kafka 的组管理设施时,心跳到消费者协调器之间预期的时间。心跳用于确保消费者的会话保持活跃,并在新消费者加入或离开组时促进重新平衡。该值必须设置小于 session.timeout.ms,但通常不应设置超过该值的 1/3。甚至可以调整它,以控制正常重新平衡的预期时间。

3000

整数

camel.component.kafka.configuration.interceptor-classes

为制作者或消费者设置拦截器。制作者拦截器必须是实施 org.apache.kafka.clients.producer.ProducerInterceptor 拦截器的类,必须实施 org.apache.kafka.clients.consumer.ConsumerInterceptors.consumer.ConsumerInterceptoror,它将在运行时引发一个类广播异常。

 

字符串

camel.component.kafka.configuration.kafka-header-deserializer

为 deserialization kafka 标头值设置自定义 KafkaHeaderDeserializer 以 camel headers 值。

 

KafkaHeaderDeserializer

camel.component.kafka.configuration.kafka-header-serializer

为序列化 camel 标头值设置自定义 KafkaHeaderDeserializer 到 kafka 标头值。

 

KafkaHeaderSerializer

camel.component.kafka.configuration.kerberos-before-relogin-min-time

刷新尝试之间的登录线程睡眠时间。

60000

整数

camel.component.kafka.configuration.kerberos-init-cmd

Kerberos kinit 命令路径.默认为 /usr/bin/kinit

/usr/bin/kinit

字符串

camel.component.kafka.configuration.kerberos-principal-to-local-rules

用于从主体名称映射到短名称的规则列表(通常是操作系统用户名)。规则按顺序进行评估,第一个与主体名称匹配的规则用于将它映射到短名称。之后的任何规则都将被忽略。默认情况下,格式为 username/hostnameREALM 的主体名称映射到 username。有关格式的详情,请查看安全授权和 acl。可以使用逗号分隔多个值

DEFAULT

字符串

camel.component.kafka.configuration.kerberos-renew-jitter

添加至续订时间的随机危害百分比。

 

camel.component.kafka.configuration.kerberos-renew-window-factor

登录线程会休眠,直到指定的窗口因时间从上一次刷新到 ticket 的到期时间才会处于睡眠状态,此时它将尝试更新票据。

 

camel.component.kafka.configuration.key

记录密钥(如果没有指定密钥,则为 null)。如果配置了这个选项,则优先于标头 KafkaConstants#KEY

 

字符串

camel.component.kafka.configuration.key-deserializer

用于实现 Deserializer 接口的密钥的 Deserializer 类。

org.apache.kafka.common.serialization.StringDeserializer

字符串

camel.component.kafka.configuration.key-serializer-class

密钥的 serializer 类(如果未指定任何信息,默认为与消息相同)。

org.apache.kafka.common.serialization.StringSerializer

字符串

camel.component.kafka.configuration.linger-ms

制作者将请求传输到单一批处理请求之间的任何记录分组在一起。通常,仅当记录到达的速度比发送的速度快时,这才会发生。但是在某些情形中,客户端可能也会减少请求的数量,即使在中等负载下也是如此。此设置通过添加少量延迟来达到此目的,而不是立即发送记录,以便生产者最多等待给定延迟发送其他记录,从而使发送其他记录可以合并在一起。这可能被视为与在 TCP 中 Nagle 的算法类似。此设置提供批量延迟的上限:一旦我们获得批次,每个分区的相应记录会立即发送,而无论此设置如何,我们将立即发送超过此分区的字节数,那么我们将会"linger' 以便等待更多记录显示。此设置默认为 0 (即没有延迟)。例如,设置 linger.ms=5 将对发送的请求数量产生影响,但会最多为加载加载时发送的记录添加 5ms 的延迟。

0

整数

camel.component.kafka.configuration.max-block-ms

配置控制 kafka 发送到 kafka 的时长。由于多个原因,这些方法可以被阻断。例如: buffer full,metadata 不可用。这种配置会对获取元数据的总时间、键和值序列化、在执行 send ()时对缓冲区内存进行分区和分配进行最大的限制。对于 partitionsFor (),此配置会在等待元数据时实施最长时间阈值

60000

整数

camel.component.kafka.configuration.max-in-flight-request

在阻断前,客户端将在单一连接上发送的最大未确认请求数。请注意,如果此设置设定为大于 1 且存在失败发送,则因为重试导致消息重新排序的风险(例如,如果启用了重试)。

5

整数

camel.component.kafka.configuration.max-partition-fetch-bytes

服务器将返回每个分区的最大数据量。用于请求的最大内存总量为 #partitions max.partition.fetch.bytes。这种大小必须至少与服务器允许的最大消息大小相同,或者生产者能够发送大于消费者可获取的消息。如果出现这种情况,消费者会卡住在特定分区上获取大量信息。

1048576

整数

camel.component.kafka.configuration.max-poll-interval-ms

在使用消费者组管理时,poll ()的调用之间的最大延迟。这会在获取更多记录前处于闲置时间的上限。如果在这个超时过期前不调用 poll (),则消费者被视为失败,并且组将重新平衡,从而将分区重新分配给其他成员。

 

Long

camel.component.kafka.configuration.max-poll-records

单个调用中返回的最大记录数,用于 poll ()

500

整数

camel.component.kafka.configuration.max-request-size

请求的最大大小。这也是最高记录大小的上限。请注意,该服务器具有自己的记录大小,这可能与此大小不同。此设置将限制制作者将在单一请求中发送的记录数量,以避免发送大量请求。

1048576

整数

camel.component.kafka.configuration.metadata-max-age-ms

在毫秒内,我们强制刷新元数据,即使我们没有看到任何分区领导更改来主动发现任何新的代理或分区。

300000

整数

camel.component.kafka.configuration.metric-reporters

用作指标报告者的类列表。实施MetricReporter 接口允许在创建新指标的类中插入内容。JmxReporter 始终包含在内来注册 JMX 统计数据。

 

字符串

camel.component.kafka.configuration.metrics-sample-window-ms

为计算指标保留的样本数量。

30000

整数

camel.component.kafka.configuration.no-of-metrics-sample

为计算指标保留的样本数量。

2

整数

camel.component.kafka.configuration.offset-repository

要使用的偏移存储库,在本地存储每个主题分区的误差。定义一个将禁用 autocommit。

 

StateRepository

camel.component.kafka.configuration.partition-assignor

使用组管理时,客户端将使用的分区分配策略在原始消费者实例之间分发分区所有权

org.apache.kafka.clients.consumer.RangeAssignor

字符串

camel.component.kafka.configuration.partition-key

记录将被发送的分区(如果没有指定分区,则为 null)。如果配置了这个选项,则优先于标头 KafkaConstants#PARTITION_KEY

 

整数

camel.component.kafka.configuration.partitioner

partitioner 类,用于对st 子主题之间的消息进行分区。默认分区器基于密钥的哈希。

org.apache.kafka.clients.producer.internals.DefaultPartitioner

字符串

camel.component.kafka.configuration.poll-timeout-ms

轮询 KafkaConsumer 时使用的超时。

5000

Long

camel.component.kafka.configuration.producer-batch-size

每当多个记录被发送到同一分区时,生产者将尝试将记录集中到更少的请求。这有助于在客户端和服务器中性能。此配置以字节为单位控制默认批处理大小。将不尝试批量记录,而不是发送到代理的批处理。请求将包含多个批处理,每个分区都有多个批处理,每个分区都可用于发送数据。一个小批处理大小将降低批处理,并可以降低吞吐量(零批处理大小完全将完全禁用批处理)。非常大的批量大小可能会更加严重地使用内存,因为我们将始终在指定批处理大小中分配指定批处理大小的缓冲区。

16384

整数

camel.component.kafka.configuration.queue-buffering-max-messages

在使用 async 模式时可排队制作者的最大未处理消息数量,然后才能阻止制作者或必须丢弃数据。

10000

整数

camel.component.kafka.configuration.receive-buffer-bytes

TCP 接收缓冲区的大小(SO_RCVBUF),用于读取数据。

65536

整数

camel.component.kafka.configuration.reconnect-backoff-max-ms

重新连接到重复连接失败的代理时要等待的最大时间,以毫秒为单位。如果提供,每个主机的 backoff 将根据连续连接失败增加每个连续连接失败,最多增加这个最大值。在计算后,添加 20% 的随机 jitter 以避免连接停滞。

1000

整数

camel.component.kafka.configuration.reconnect-backoff-ms

尝试重新连接给定主机前等待的时间。这可避免在紧张循环中重复连接到主机。这个 backoff 适用于由消费者发送到代理的所有请求。

50

整数

camel.component.kafka.configuration.record-metadata

制作者应该存储 RecordMetadata 结果是否应该发送到 Kafka。结果存储在包含 RecordMetadata 元数据的列表中。列表存储在带有键 KafkaConstants#KAFKA_RECORDMETA 的标头中

true

布尔值

camel.component.kafka.configuration.request-required-acks

生产者数量要求领导人在考虑请求完成前收到。这会控制发送的记录的持久性。以下设置是 common: acks=0 如果设为零,则制作者不会等待全部来自服务器的任何致谢。记录将立即添加到套接字缓冲区并被视为发送。在这种情况下,无法保证服务器收到记录,并且重试配置不会生效(因为客户端通常不会知道任何故障)。每个记录给出的误差将始终设置为 -1. acks=1 意味着领导机会将记录写入其本地日志,但是不会对所有后续者等待完全确认。在这种情况下,领导机应该立即在记录后立即失败,但后续人已复制记录将会丢失。acks=all 意味着领导机将等待完全同步副本组确认记录。这样可保证,只要至少有一个 in-sync 副本仍保持上线,则记录将不会丢失。这是可用最强的保证。

1

字符串

camel.component.kafka.configuration.request-timeout-ms

在向客户端发送错误前,代理会等待满足 request.required.acks 要求的时间。

305000

整数

camel.component.kafka.configuration.retries

设置大于零的值将导致客户端重新发送发送失败并显示可能瞬态错误的任何记录。请注意,这个重试与客户端在收到错误时重新输入记录不同。允许重试可能会更改记录顺序,因为如果将两个记录发送到单个分区,则第一个记录失败并重试,但第二个记录可能会首先出现。

0

整数

camel.component.kafka.configuration.retry-backoff-ms

在重试前,生产者都会刷新相关主题的元数据,以查看是否已选定新的领导人。由于领导选举需要一定的时间,因此此属性指定制作者在刷新元数据前等待的时间。

100

整数

camel.component.kafka.configuration.sasl-jaas-config

公开 kafka sasl.jaas.config 参数示例: org.apache.kafka.common.security.plain.PlainLoginModule required username=USERNAME password=PASSWORD;

 

字符串

camel.component.kafka.configuration.sasl-kerberos-service-name

Kafka 运行的 Kerberos 主体名称。这可以在 Kafka 的 JAAS 配置或 Kafka 的配置中定义。

 

字符串

camel.component.kafka.configuration.sasl-mechanism

使用简单验证和安全层(SASL)机制。如需有效值,请参阅 http://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.xhtml

GSSAPI

字符串

camel.component.kafka.configuration.security-protocol

用于与代理通信的协议。目前只支持 PLAINTEXT 和 SSL。

PLAINTEXT

字符串

camel.component.kafka.configuration.seek-to

设定如果 KafkaConsumer 将在启动时读取或结束:从开头读取:从结尾读取,这将替换掉前面的属性 seekToBeginning

 

字符串

camel.component.kafka.configuration.send-buffer-bytes

套接字写入缓冲区大小

131072

整数

camel.component.kafka.configuration.serializer-class

消息的 serializer 类。

org.apache.kafka.common.serialization.StringSerializer

字符串

camel.component.kafka.configuration.session-timeout-ms

使用 Kafka 的组管理功能时检测故障的超时时间。

10000

整数

camel.component.kafka.configuration.ssl-cipher-suites

密码套件列表。这是身份验证、加密、MAC 和密钥交换算法的命名组合,用于使用 TLS 或 SSL 网络协议来协商网络连接的安全设置。By 默认为所有可用的加密套件。

 

字符串

camel.component.kafka.configuration.ssl-context-parameters

使用 Camel SSLContextParameters 对象的 SSL 配置。如果在其他 SSL 端点参数之前应用了它。

 

SSLContextParameters

camel.component.kafka.configuration.ssl-enabled-protocols

为 SSL 连接启用的协议列表。TLSv1.2、TLSv1.1 和 TLSv1 默认启用。

TLSv1.2,TLSv1.1,TLSv1

字符串

camel.component.kafka.configuration.ssl-endpoint-algorithm

使用服务器证书验证服务器主机名的端点标识算法。

 

字符串

camel.component.kafka.configuration.ssl-key-password

密钥存储文件中私钥的密码。对于客户端,这是可选的。

 

字符串

camel.component.kafka.configuration.ssl-keymanager-algorithm

密钥管理器工厂用于 SSL 连接的算法。默认值是 Java 虚拟机配置的主要管理器工厂算法。

SunX509

字符串

camel.component.kafka.configuration.ssl-keystore-location

密钥存储文件的位置。这对于客户端来说是可选的,可用于客户端的双向身份验证。

 

字符串

camel.component.kafka.configuration.ssl-keystore-password

密钥存储文件的存储密码。对于客户端是可选的,只有配置了 ssl.keystore.location 时才需要。

 

字符串

camel.component.kafka.configuration.ssl-keystore-type

密钥存储文件的文件格式。对于客户端,这是可选的。默认值为 JKS

JKS

字符串

camel.component.kafka.configuration.ssl-protocol

用于生成 SSLContext 的 SSL 协议。默认设置为 TLS,这适用于大多数情况。最近的 JVM 中允许的值是 TLS、TLSv1.1 和 TLSv1.2。较旧 JVM 中可能会支持 SSLv2 和 SSLv3,但由于已知安全漏洞,不建议使用它们。

TLS

字符串

camel.component.kafka.configuration.ssl-provider

用于 SSL 连接的安全提供商的名称。默认值是 JVM 的默认安全提供程序。

 

字符串

camel.component.kafka.configuration.ssl-trustmanager-algorithm

信任管理器工厂用于 SSL 连接的算法。默认值是 Java 虚拟机配置的信任管理器工厂算法。

PKIX

字符串

camel.component.kafka.configuration.ssl-truststore-location

信任存储文件的位置。

 

字符串

camel.component.kafka.configuration.ssl-truststore-password

信任存储文件的密码。

 

字符串

camel.component.kafka.configuration.ssl-truststore-type

信任存储文件的文件格式。默认值为 JKS。

JKS

字符串

camel.component.kafka.configuration.topic

要使用的主题名称。在使用者上,您可以使用逗号分隔多个主题。制作者只能发送消息到单个主题。

 

字符串

camel.component.kafka.configuration.topic-is-pattern

主题是模式(正则表达式)。这可用于订阅与模式匹配的动态主题。

false

布尔值

camel.component.kafka.configuration.value-deserializer

对实现 Deserializer 接口的值进行反序列化器类。

org.apache.kafka.common.serialization.StringDeserializer

字符串

camel.component.kafka.configuration.worker-pool

使用自定义 worker 池在 kafka 服务器后继续路由 Exchange,已确认通过异步非阻塞处理从 KafkaProducer 发送到它的消息。

 

ExecutorService

camel.component.kafka.configuration.worker-pool-core-size

kafka 服务器后用于继续路由 Exchange 的 worker 池的核心线程数量,确认已使用异步非阻塞处理从 KafkaProducer 发送到它的消息。

10

整数

camel.component.kafka.configuration.worker-pool-max-size

kafka 服务器后用于继续路由 Exchange 的 worker 池的最大线程数量已被确认使用异步非阻塞处理从 KafkaProducer 发送到它的消息。

20

整数

camel.component.kafka.enabled

启用 kafka 组件

true

布尔值

camel.component.kafka.kafka-manual-commit-factory

创建 KafkaManualCommit 实例使用的工厂。这样,在进行手动提交时,可以插入一个自定义 KafkaManualCommit 实例来创建自定义 KafkaManualCommit 实例。选项是一个 org.apache.camel.component.kafka.KafkaManualCommitFactory 类型。

 

字符串

camel.component.kafka.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.kafka.shutdown-timeout

以毫秒为单位的超时,以正常等待使用者或制作者关闭和终止其 worker 线程。

30000

整数

camel.component.kafka.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

camel.component.kafka.worker-pool

要使用共享自定义 worker 池在 kafka 服务器后继续路由 Exchange,请确认使用异步非阻塞处理从 KafkaProducer 发送到它的消息。如果使用这个选项,则必须处理线程池的生命周期,以便在需要时关闭池。选项为 java.util.concurrent.ExecutorService 类型。

 

字符串

有关 Producer/Consumer 配置的更多信息:

http://kafka.apache.org/documentation.html#newconsumerconfigs http://kafka.apache.org/documentation.html#producerconfigs

191.4. 邮件标题

191.4.1. 使用者标头

当使用来自 Kafka 的消息时,可以使用以下标头。

标头常量标头值类型描述

KafkaConstants.TOPIC

"kafka.TOPIC"

字符串

消息来自的主题

KafkaConstants.PARTITION

"kafka.PARTITION"

整数

存储消息的分区

KafkaConstants.OFFSET

"kafka.OFFSET"

Long

消息的偏移

KafkaConstants.KEY

"kafka.KEY"

对象

消息的密钥(如果已配置)

KafkaConstants.HEADERS

"kafka.HEADERS"

org.apache.kafka.common.header.Headers

记录标头

KafkaConstants.LAST_RECORD_BEFORE_COMMIT

"kafka.LAST_RECORD_BEFORE_COMMIT"

布尔值

提交前是否是最后的记录(仅在 autoCommitEnable endpoint 参数为 false时才可用)

KafkaConstants.MANUAL_COMMIT

"CamelKafkaManualCommit"

KafkaManualCommit

可用于在使用 Kafka 使用者时强制手动偏移提交。

191.4.2. producer 标头

在向 Kafka 发送消息前,您可以配置以下标头。

标头常量标头值类型描述

KafkaConstants.KEY

"kafka.KEY"

对象

所需的 消息键,以确保所有相关消息都在同一个分区中

KafkaConstants.TOPIC

"kafka.TOPIC"

字符串

发送消息的主题(如果 bridgeEndpoint 端点参数为 true,则只读)

KafkaConstants.PARTITION_KEY

"kafka.PARTITION_KEY"

整数

明确指定分区(仅在定义了 KafkaConstants.KEY 标头时才使用)

在将消息发送到 Kafka 后,可以使用以下标头

标头常量标头值类型描述

KafkaConstants.KAFKA_RECORDMETA

"org.apache.kafka.clients.producer.RecordMetadata"

List<RecordMetadata>

元数据(仅在 recordMetadata endpoint 参数为 true时才配置

191.5. Samples

191.5.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]}")

当消耗 Kafka 的消息时,您可以使用自己的偏移管理,而不将此管理委派给 Kafka。为了保持偏移组件的偏移,组件需要 StateRepository 实现,如 FileStateRepository。此 bean 应该在注册表中提供。如何使用它:

// Create the repository in which the Kafka offsets will be persisted
FileStateRepository repository = FileStateRepository.fileStateRepository(new File("/path/to/repo.dat"));

// Bind this repository into the Camel registry
JndiRegistry registry = new JndiRegistry();
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");
    }
});

 

191.5.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");

191.6. 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
JndiRegistry registry = new JndiRegistry();
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");
    }
});

191.7. 使用 Kafka 幂等存储库

从 Camel 2.19 可用

camel-kafka 库提供了一个基于 Kafka 的幂等存储库。此存储库将广播在 Kafka 主题中存储对幂等状态(add/remove)的所有更改,并通过事件采购填充每个存储库的进程实例的本地内存缓存。

所使用的主题必须为每个幂等存储库实例唯一。机制对主题分区数量没有任何要求;因为仓库同时消耗所有分区。它还对主题复制因素没有任何要求。

每个使用主题的仓库实例(例如,通常在并行运行的不同机器上)控制自己的消费者组,因此在使用相同主题的 10 个 Camel 进程集群中,每个标题都会控制自己的偏移。

在启动时,实例会订阅该主题,并向开始便重新显示偏移量,将缓存重新重建到最新状态。在较长的 pollDurationM 后,缓存不会被视为温量,它会返回 0 记录。在缓存启动前,启动才会完成,或由 30 秒启动或 30 秒;如果后者在使用者到达主题结束之前,幂等存储库可能会处于不一致的状态。

KafkaIdempotentRepository 具有以下属性:

属性描述

topic

用于广播更改的 Kafka 主题名称(必需)

bootstrapServers

内部 Kafka producer 和使用者上的 bootstrap.servers 属性。如果没有设置 consumerConfigproducerConfig,则使用它作为简写。如果使用,此组件将为制作者和消费者应用可靠的默认配置。

producerConfig

设置用于广播更改的 Kafka 制作者使用的属性。覆盖 bootstrapServers,因此必须定义 Kafka bootstrap.servers 属性本身

consumerConfig

设置 Kafka consumer 使用的属性,该属性从主题填充缓存。覆盖 bootstrapServers,因此必须定义 Kafka bootstrap.servers 属性本身

maxCacheSize

最近使用的密钥应存储在内存中(默认值 1000)。

pollDurationMs

Kafka consumer 的 poll 持续时间。本地缓存会立即更新。这个值将影响到其他同伴的后面,它们从主题更新其缓存的缓存与发送缓存操作消息的幂等使用者实例相对应。默认值为 100 ms。
如果明确设置这个值,请注意远程缓存存活度和此存储库使用者和 Kafka 代理之间网络流量的卷之间存在利弊。Cache warmup 进程还取决于获取任何内容的一个轮询 - 这表明流已被消耗到当前点上。如果轮询持续时间过长,在主题上发送消息的速率过长,则可能存在缓存无法破解,并且其同级同级状态会处于不一致的状态,直到它捕获为止。

可以通过定义 主题bootstrapServersproducer Config 属性集来实例化存储库,以显式定义启用 SSL/SASL 等功能。

要使用,此仓库必须放在 Camel 注册表中,也可以手动注册为 Spring/Blueprint 中的 bean,因为它是 CamelContext aware。

示例用法如下:

KafkaIdempotentRepository kafkaIdempotentRepository = new KafkaIdempotentRepository("idempotent-db-inserts", "localhost:9091");

SimpleRegistry registry = new SimpleRegistry();
registry.put("insertDbIdemRepo", kafkaIdempotentRepository); // must be registered in the registry, to enable access to the CamelContext
CamelContext context = new CamelContext(registry);

// later in RouteBuilder...
from("direct:performInsert")
    .idempotentConsumer(header("id")).messageIdRepositoryRef("insertDbIdemRepo")
        // once-only insert into database
    .end()

在 XML 中:

<!-- simple -->
<bean id="insertDbIdemRepo"
  class="org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository">
  <property name="topic" value="idempotent-db-inserts"/>
  <property name="bootstrapServers" value="localhost:9091"/>
</bean>

<!-- complex -->
<bean id="insertDbIdemRepo"
  class="org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository">
  <property name="topic" value="idempotent-db-inserts"/>
  <property name="maxCacheSize" value="10000"/>
  <property name="consumerConfig">
    <props>
      <prop key="bootstrap.servers">localhost:9091</prop>
    </props>
  </property>
  <property name="producerConfig">
    <props>
      <prop key="bootstrap.servers">localhost:9091</prop>
    </props>
  </property>
</bean>

191.8. 使用 Kafka consumer 的手动提交

可作为 Camel 2.21 可用

默认情况下,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.commitSync();
}

这将强制一个同步提交,该提交将阻止,直到在 Kafka 上确认提交被确认,或者是否引发异常。

如果要使用 KafkaManualCommit 的自定义实现,那么您可以在创建自定义实施的 KafkaComponent 上配置自定义 KafkaManualCommitFactory

191.9. Kafka Headers propagation

可作为 Camel 2.22 提供

当消耗 Kafka 的消息时,标头会自动传播到 camel Exchange 标头。生成由同一行为支持的流 - 特定交换的 camel 标头将传播到 kafka 消息标头。

由于 kafka 标头仅允许 byte[] 值,因此要传播的 camel exchnage 标头应被序列化为 bytes[],否则将跳过标头。支持以下标头值类型: String,Integer,Long, Double, 布尔值,byte[]。注: 从 kafka 传播到 camel Exchange 的所有标头都会默认包含 byte[] 值。为了覆盖默认的功能 uri 参数,可以为 kafkaHeaderDeserializer 设置为 来自 route 和 kafkaHeaderSerializer 的 kafkaHeaderSerializer。例如:

from("kafka:my_topic?kafkaHeaderDeserializer=#myDeserializer")
...
.to("kafka:my_topic?kafkaHeaderSerializer=#mySerializer")

默认情况下,所有标头都由 KafkaHeaderFilterStrategy 过滤。策略过滤掉以 Camelorg.apache.camel 前缀开头的标头。可使用到路由中的 headerFilterStrategy uri 参数来覆盖默认策略:

from("kafka:my_topic?headerFilterStrategy=#myStrategy")
...
.to("kafka:my_topic?headerFilterStrategy=#myStrategy")

myStrategy 对象应该是 HeaderFilterStrategy 的子类,且必须手动放置在 Camel registry 中,或者将其注册为 Spring/Blueprint 中的 bean,因为它是 CamelContext aware。

第 192 章 Kestrel 组件(已弃用)

可作为 Camel 版本 2.6 提供。

Kestrel 组件允许将消息发送到 Kestrel 队列,或者从 Kestrel 队列使用消息。此组件使用 spymemcached 客户端与 Kestrel 服务器进行 memcached 协议通信。

警告

kestrel 项目为不活跃的,Camel 团队与这个组件相关。

192.1. URI 格式

kestrel://[addresslist/]queuename[?options]

其中 queuename 是 Kestrel 上队列的名称。URI 的 addresslist 部分可能包括一个或多个主机 :端口 对。例如,要连接到 kserver01:22133 上的队列 foo,请使用:

kestrel://kserver01:22133/foo

如果省略 addresslist,则假定为 localhost:22133,即:

kestrel://foo

同样,如果 addresslist 中的 host:port 对省略了端口,则假定为默认端口 22133,即:

kestrel://kserver01/foo

以下是用于生成集群队列的 Kestrel 端点 URI 示例:

kestrel://kserver01:22133,kserver02:22133,kserver03:22133/massive

以下是用于从队列中同时消耗 Kestrel 端点 URI 的示例:

kestrel://kserver03:22133/massive?concurrentConsumers=25&waitTimeMs=500

192.2. 选项

Kestrel 组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享配置作为创建新端点的基础。

 

KestrelConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Kestrel 端点使用 URI 语法进行配置:

kestrel:addresses/queue

使用以下路径和查询参数:

192.2.1. 路径名(2 参数):

名称描述默认类型

addresses

运行 kestrel 的地址

localhost:22133

String[]

queue

所需的 队列是轮询

 

字符串

192.2.2. 查询参数(6 参数):

名称描述默认类型

concurrentConsumers (common)

为线程池调度多少个并发监听程序

1

int

waitTimeMs (common)

给定等待多久(服务器侧)以毫秒为单位

100

int

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

192.3. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.kestrel.configuration.addresses

运行 kestrel 的地址

 

String[]

camel.component.kestrel.configuration.concurrent-consumers

为线程池调度多少个并发监听程序

1

整数

camel.component.kestrel.configuration.wait-time-ms

给定等待多久(服务器侧)以毫秒为单位

100

整数

camel.component.kestrel.enabled

启用 kestrel 组件

true

布尔值

camel.component.kestrel.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

192.4. 使用 Spring XML 配置 Kestrel 组件

最简单的显式配置形式如下:

<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="kestrel" class="org.apache.camel.component.kestrel.KestrelComponent"/>

  <camelContext xmlns="http://camel.apache.org/schema/spring">
  </camelContext>

</beans>

这将启用具有所有默认设置的 Kestrel 组件,即,它将使用 localhost:22133、100ms 等待时间以及单个非同步使用者。

要在基本配置中使用特定选项(这会向未指定的 ?properties 的端点提供配置),您可以设置 KestrelConfiguration POJO:

<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="kestrelConfiguration" class="org.apache.camel.component.kestrel.KestrelConfiguration">
    <property name="addresses" value="kestrel01:22133"/>
    <property name="waitTimeMs" value="100"/>
    <property name="concurrentConsumers" value="1"/>
  </bean>

  <bean id="kestrel" class="org.apache.camel.component.kestrel.KestrelComponent">
    <property name="configuration" ref="kestrelConfiguration"/>
  </bean>

  <camelContext xmlns="http://camel.apache.org/schema/spring">
  </camelContext>

</beans>

192.5. 用法示例

192.5.1. 示例 1:假设

from("kestrel://kserver02:22133/massive?concurrentConsumers=10&waitTimeMs=500")
  .bean("myConsumer", "onMessage");
public class MyConsumer {
    public void onMessage(String message) {
        ...
    }
}

192.5.2. 示例 2:生产

public class MyProducer {
    @EndpointInject(uri = "kestrel://kserver01:22133,kserver02:22133/myqueue")
    ProducerTemplate producerTemplate;

    public void produceSomething() {
        producerTemplate.sendBody("Hello, world.");
    }
}

192.5.3. 示例 3:Spring XML 配置

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="kestrel://ks01:22133/sequential?concurrentConsumers=1&waitTimeMs=500"/>
      <bean ref="myBean" method="onMessage"/>
    </route>
    <route>
      <from uri="direct:start"/>
      <to uri="kestrel://ks02:22133/stuff"/>
    </route>
  </camelContext>
public class MyBean {
    public void onMessage(String message) {
        ...
    }
}

192.6. 依赖项

Kestrel 组件有以下依赖项:

  • spymemcached 2.5 (或更高)

192.6.1. spymemcached

在您的类路径上 必须具有 spymemcached jar。以下是您可以在 pom.xml 中使用的片段:

<dependency>
  <groupId>spy</groupId>
  <artifactId>memcached</artifactId>
  <version>2.5</version>
</dependency>

或者,您可以直接 下载 jar

警告:限制

注意

当启用 JVM 断言时,spymemcached 客户端库无法与 kestrel 正常工作。当启用断言时 spymemcached 存在一个已知问题,并且请求的密钥包含 /t=…​ 扩展(例如,如果您在端点 URI 上使用 waitTimeMs 选项),这是高鼓励的。幸运的是,默认情况下会禁用 JVM 断言,除非您 明确启用了它们,因此在正常情况下,这不应存在问题。需要注意的是,Maven 的 Surefire test 插件 可启用 断言。如果您在 Maven 测试环境中使用这个组件,可能需要将 enableAssertions 设置为 false。有关详细信息,请参阅 surefire:test 参考

192.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 193 章 kie-Camel

193.1. 概述

kie-camel 组件是红帽 Fuse 提供的 Apache Camel 端点,可将 Fuse 与 Red Hat Process Automation Manager 集成。它可让您使用可拉取到路由并执行的 Maven 组 ID、工件 ID 和版本(GAV)标识符来指定 Red Hat Process Automation Manager 模块。它还允许您将消息正文的部分指定为事实。您可以将 kie-camel 组件与嵌入式引擎或使用进程服务器一起使用。

有关 kie-camel 组件的更多详情,请参阅将 Red Hat Fuse 与 Red Hat Process Automation Manager 集成。

第 194 章 Krati 组件(已弃用)

作为 Camel 版本 2.9 提供。

此组件允许在 Camel 中使用 krati 数据存储和数据集。Krati 是一个简单的持久数据存储,具有非常低的延迟和高吞吐量。它旨在与读写密集型应用程序轻松集成,在调优配置、性能和 JVM 垃圾回收方面很少努力。

Camel 为 krati datastore_(key/value engine)_ 提供制作者和使用者。它还提供了用于过滤重复消息的幂等存储库。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-krati</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

194.1. URI 格式

krati:[the path of the datastore][?options]

数据存储路径是 krati 将用于数据存储的文件夹相对路径。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

194.2. Krati 选项

Krati 组件没有选项。

Krati 端点使用 URI 语法进行配置:

krati:path

使用以下路径和查询参数:

194.2.1. 路径名(1 参数):

名称描述默认类型

path

数据存储 所需的 相对路径是 krati 将用于数据存储的文件夹相对路径。

 

字符串

194.2.2. 查询参数(29 参数):

名称描述默认类型

hashFunction (common)

要使用的哈希功能。

 

HashFunction

initialCapacity (common)

存储的 inital capcity。

100

int

keySerializer (common)

将用于对密钥进行序列化的序列化。

 

serializer

segmentFactory (common)

设置目标存储的网段工厂。

 

SegmentFactory

segmentFileSize (common)

数据存储片段大小(以 MB 为单位)。

64

int

valueSerializer (common)

将用于对值进行序列化的序列化。

 

serializer

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

maxMessagesPerPoll (consumer)

在一个轮询中可接收的最大消息数。这可用于避免读取太多数据并占用太多内存。

 

int

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

key (producer)

密钥。

 

字符串

operation (producer)

指定要在数据存储中执行的操作类型。

 

字符串

value (producer)

价值.

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

194.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.krati.enabled

启用 krati 组件

true

布尔值

camel.component.krati.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

krati:/tmp/krati?operation=CamelKratiGet&initialCapacity=10000&keySerializer=#myCustomSerializer

对于制作者端点,您可以通过将相应的标头传递给消息来覆盖上述 URI 选项。

194.3.1. 数据存储的消息标头

标头描述

CamelKratiOperation

要对数据存储执行的操作。有效选项为 CamelKratiAdd、CamelKratiGet、CamelKratiDelete、CamelKratiDeleteAll

CamelKratiKey

密钥。

CamelKratiValue

价值。

194.4. 使用示例

194.4.1. 示例 1:处理数据存储.

本例将向您展示如何在数据存储中存储任何消息。

from("direct:put").to("krati:target/test/producertest");

在上例中,您可以使用消息中的标头覆盖任何 URI 参数。
以下是使用 xml 定义路由的方式。

        <route>
            <from uri="direct:put"/>
            <to uri="krati:target/test/producerspringtest"/>
        </route>

194.4.2. 示例 2:从数据存储获取/恢复

本例将向您展示如何读取数据存储的 contnet。

from("direct:get")
    .setHeader(KratiConstants.KRATI_OPERATION, constant(KratiConstants.KRATI_OPERATION_GET))
    .to("krati:target/test/producertest");

在上例中,您可以使用消息中的标头覆盖任何 URI 参数。
以下是使用 xml 定义路由的方式。

<route>
     <from uri="direct:get"/>
     <to uri="krati:target/test/producerspringtest?operation=CamelKratiGet"/>
</route>

194.4.3. 示例 3:从数据存储中恢复

本例将使用指定数据存储下的所有项目。

    from("krati:target/test/consumertest")
        .to("direct:next");

您可以使用 xml 实现相同的目标,如下所示。

<route>
    <from uri="krati:target/test/consumerspringtest"/>
    <to uri="mock:results"/>
</route>

194.5. 幂等库

如之前提到的,此组件还提供了 和 idemptonet 存储库,可用于过滤重复的信息。

from("direct://in").idempotentConsumer(header("messageId"), new KratiIdempotentRepositroy("/tmp/idempotent").to("log://out");

194.5.1. 另请参阅

Krati 网站

第 195 章 Kubernetes Components

作为 Camel 2.17 版提供

Kubernetes 组件将您的应用程序与 Kubernetes 独立或 Openshift 相整合。 

camel-kubernetes 由 13 个组件组成:

在 OpenShift 中,还:

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-kubernetes</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

195.1. Headers

名称类型描述

CamelKubernetesOperation

字符串

Producer 操作

CamelKubernetesNamespaceName

字符串

命名空间名称

CamelKubernetesNamespaceLabels

map

命名空间标签

CamelKubernetesServiceLabels

map

Service 标签

CamelKubernetesServiceName

字符串

Service 名称

CamelKubernetesServiceSpec

io.fabric8.kubernetes.api.model.ServiceSpec

一个服务的 Spec

CamelKubernetesReplicationControllersLabels

map

复制控制器标签

CamelKubernetesReplicationControllerName

字符串

复制控制器名称

CamelKubernetesReplicationControllerSpec

io.fabric8.kubernetes.api.model.ReplicationControllerSpec

Replication Controller 的 Spec

CamelKubernetesReplicationControllerReplicas

整数

在 Scale 操作过程中复制控制器的副本数

CamelKubernetesPodsLabels

map

Pod 标签

CamelKubernetesPodName

字符串

Pod 名称

CamelKubernetesPodSpec

io.fabric8.kubernetes.api.model.PodSpec

Pod 的 Spec

CamelKubernetesPersistentVolumesLabels

map

持久性卷标签

CamelKubernetesPersistentVolumesName

字符串

持久性卷名称

CamelKubernetesPersistentVolumesClaimsLabels

map

持久性卷声明标签

CamelKubernetesPersistentVolumesClaimsName

字符串

持久性卷声明名称

CamelKubernetesPersistentVolumesClaimsSpec

io.fabric8.kubernetes.api.model.PersistentVolumeClaimSpec

持久性卷声明的 Spec

CamelKubernetesSecretsLabels

map

Secret 标签

CamelKubernetesSecretsName

字符串

Secret 名称

CamelKubernetesSecret

io.fabric8.kubernetes.api.model.Secret

Secret 对象

CamelKubernetesResourcesQuotaLabels

map

资源配额标签

CamelKubernetesResourcesQuotaName

字符串

资源配额名称

CamelKubernetesResourceQuotaSpec

io.fabric8.kubernetes.api.model.ResourceQuotaSpec

资源配额的 Spec

CamelKubernetesServiceAccountsLabels

map

Service Account 标签

CamelKubernetesServiceAccountName

字符串

服务帐户名称

CamelKubernetesServiceAccount

io.fabric8.kubernetes.api.model.ServiceAccount

服务帐户对象

CamelKubernetesNodesLabels

map

节点标签

CamelKubernetesNodeName

字符串

节点名

CamelKubernetesBuildsLabels

map

OpenShift 构建标签

CamelKubernetesBuildName

字符串

OpenShift 构建名称

CamelKubernetesBuildConfigsLabels

map

OpenShift Build Config 标签

CamelKubernetesBuildConfigName

字符串

OpenShift Build Config name

CamelKubernetesEventAction

io.fabric8.kubernetes.client.Watcher.Action

用户监视的操作

CamelKubernetesEventTimestamp

字符串

consumer 监视的操作时间戳

CamelKubernetesConfigMapName

字符串

ConfigMap 名称

CamelKubernetesConfigMapsLabels

map

ConfigMap 标签

CamelKubernetesConfigData

map

ConfigMap Data

195.2. 使用

195.2.1. 制作者示例

这里我们显示了使用 camel-kubernetes 的一些制作者示例。

195.2.2. 创建 pod

from("direct:createPod")
    .toF("kubernetes-pods://%s?oauthToken=%s&operation=createPod", host, authToken);

通过使用 KubernetesConstants.KUBERNETES_POD_SPEC 标头,您可以指定您的 PodSpec 并将其传递给此操作。

195.2.3. 删除 pod

from("direct:createPod")
    .toF("kubernetes-pods://%s?oauthToken=%s&operation=deletePod", host, authToken);

通过使用 KubernetesConstants.KUBERNETES_POD_NAME 标头,您可以指定 Pod 名称并将其传递给此操作。

第 196 章 Kubernetes 组件(已弃用)

作为 Camel 2.17 版提供

Kubernetes 组件是集成应用程序与 Kubernetes 独立或 Openshift 顶部的组件。 

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-kubernetes</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

196.1. URI 格式

kubernetes:masterUrl[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

196.2. 选项

Kubernetes 组件没有选项。

Kubernetes 端点使用 URI 语法配置:

kubernetes:masterUrl

使用以下路径和查询参数:

196.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

196.2.2. 查询参数(29 参数):

名称描述默认类型

apiVersion (common)

要使用的 Kubernetes API 版本

 

字符串

category (common)

所需的 Kubernetes Producer 和 Consumer 类别

 

字符串

dnsDomain (common)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (common)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

portName (common)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (common)

用于 ServiceCall EIP 的端口协议

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

labelKey (consumer)

监控某些资源时的 Consumer Label 键

 

字符串

labelValue (consumer)

监控某些资源时的 Consumer Label 值

 

字符串

namespace (consumer)

命名空间

 

字符串

poolSize (consumer)

Consumer 池大小

1

int

resourceName (consumer)

您要监视的消费者资源名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

196.3. Spring Boot Auto-Configuration

组件支持 16 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes.cluster.service.attributes

自定义服务属性。

 

map

camel.component.kubernetes.cluster.service.cluster-labels

设置用于标识集群的 pod 的标签。

 

map

camel.component.kubernetes.cluster.service.config-map-name

设置用于进行优化锁定的 ConfigMap 名称(默认为 'leaders')。

 

字符串

camel.component.kubernetes.cluster.service.connection-timeout-millis

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

camel.component.kubernetes.cluster.service.enabled

如果应启用或不启用 Kubernetes 集群服务,则设置默认值为 false。

false

布尔值

camel.component.kubernetes.cluster.service.id

Cluster Service ID

 

字符串

camel.component.kubernetes.cluster.service.jitter-factor

要应用的 jitter 因素,以防止所有 pod 在同一个即时调用 Kubernetes API。

 

camel.component.kubernetes.cluster.service.kubernetes-namespace

设置包含 pod 和 configmap 的 Kubernetes 命名空间的名称(默认探测到)

 

字符串

camel.component.kubernetes.cluster.service.lease-duration-millis

当前领导租期的默认持续时间。

 

Long

camel.component.kubernetes.cluster.service.master-url

设置 Kubernetes 主机的 URL (默认为从 Kubernetes 客户端属性读取)。

 

字符串

camel.component.kubernetes.cluster.service.order

服务查找顺序/优先级.

 

整数

camel.component.kubernetes.cluster.service.pod-name

设置当前 pod 的名称(默认从容器主机名中探测到)。

 

字符串

camel.component.kubernetes.cluster.service.renew-deadline-millis

领导人必须停止其服务的截止时间,因为它可能会丢失了领导机。

 

Long

camel.component.kubernetes.cluster.service.retry-period-millis

后续尝试检查和获取领导时间之间的时间。使用 jitter 因素随机化。

 

Long

camel.component.kubernetes.enabled

是否启用 kubernetes 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

196.4. Headers

名称类型描述

CamelKubernetesOperation

字符串

Producer 操作

CamelKubernetesNamespaceName

字符串

命名空间名称

CamelKubernetesNamespaceLabels

map

命名空间标签

CamelKubernetesServiceLabels

map

Service 标签

CamelKubernetesServiceName

字符串

Service 名称

CamelKubernetesServiceSpec

io.fabric8.kubernetes.api.model.ServiceSpec

一个服务的 Spec

CamelKubernetesReplicationControllersLabels

map

复制控制器标签

CamelKubernetesReplicationControllerName

字符串

复制控制器名称

CamelKubernetesReplicationControllerSpec

io.fabric8.kubernetes.api.model.ReplicationControllerSpec

Replication Controller 的 Spec

CamelKubernetesReplicationControllerReplicas

整数

在 Scale 操作过程中复制控制器的副本数

CamelKubernetesPodsLabels

map

Pod 标签

CamelKubernetesPodName

字符串

Pod 名称

CamelKubernetesPodSpec

io.fabric8.kubernetes.api.model.PodSpec

Pod 的 Spec

CamelKubernetesPersistentVolumesLabels

map

持久性卷标签

CamelKubernetesPersistentVolumesName

字符串

持久性卷名称

CamelKubernetesPersistentVolumesClaimsLabels

map

持久性卷声明标签

CamelKubernetesPersistentVolumesClaimsName

字符串

持久性卷声明名称

CamelKubernetesPersistentVolumesClaimsSpec

io.fabric8.kubernetes.api.model.PersistentVolumeClaimSpec

持久性卷声明的 Spec

CamelKubernetesSecretsLabels

map

Secret 标签

CamelKubernetesSecretsName

字符串

Secret 名称

CamelKubernetesSecret

io.fabric8.kubernetes.api.model.Secret

Secret 对象

CamelKubernetesResourcesQuotaLabels

map

资源配额标签

CamelKubernetesResourcesQuotaName

字符串

资源配额名称

CamelKubernetesResourceQuotaSpec

io.fabric8.kubernetes.api.model.ResourceQuotaSpec

资源配额的 Spec

CamelKubernetesServiceAccountsLabels

map

Service Account 标签

CamelKubernetesServiceAccountName

字符串

服务帐户名称

CamelKubernetesServiceAccount

io.fabric8.kubernetes.api.model.ServiceAccount

服务帐户对象

CamelKubernetesNodesLabels

map

节点标签

CamelKubernetesNodeName

字符串

节点名

CamelKubernetesBuildsLabels

map

OpenShift 构建标签

CamelKubernetesBuildName

字符串

OpenShift 构建名称

CamelKubernetesBuildConfigsLabels

map

OpenShift Build Config 标签

CamelKubernetesBuildConfigName

字符串

OpenShift Build Config name

CamelKubernetesEventAction

io.fabric8.kubernetes.client.Watcher.Action

用户监视的操作

CamelKubernetesEventTimestamp

字符串

consumer 监视的操作时间戳

CamelKubernetesConfigMapName

字符串

ConfigMap 名称

CamelKubernetesConfigMapsLabels

map

ConfigMap 标签

CamelKubernetesConfigData

map

ConfigMap Data

196.5. 类别

camel-kubernetes 组件支持以下 Kubernetes 资源

  • 命名空间
  • Pods
  • 复制控制器
  • 服务
  • 持久性卷
  • 持久性卷声明
  • Secrets
  • 资源配额
  • 服务帐户
  • 节点
  • ConfigMaps

在 Openshift 中,还在 Openshift 中

  • Builds
  • BuildConfig

196.6. 使用

196.6.1. 制作者示例

这里我们显示了使用 camel-kubernetes 的一些制作者示例。

196.6.2. 创建 pod

from("direct:createPod")
    .toF("kubernetes://%s?oauthToken=%s&category=pods&operation=createPod", host, authToken);

通过使用 KubernetesConstants.KUBERNETES_POD_SPEC 标头,您可以指定您的 PodSpec 并将其传递给此操作。

196.6.3. 删除 pod

from("direct:createPod")
    .toF("kubernetes://%s?oauthToken=%s&category=pods&operation=deletePod", host, authToken);

通过使用 KubernetesConstants.KUBERNETES_POD_NAME 标头,您可以指定 Pod 名称并将其传递给此操作。

第 197 章 Kubernetes ConfigMap Component

作为 Camel 2.17 版提供

Kubernetes ConfigMap 组件是 Kubernetes 组件 中的一个,它提供了一个制作者来执行 kubernetes ConfigMap 操作。

197.1. 组件选项

Kubernetes ConfigMap 组件没有选项。

197.2. 端点选项

Kubernetes ConfigMap 端点使用 URI 语法配置:

kubernetes-config-maps:masterUrl

使用以下路径和查询参数:

197.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

197.2.2. 查询参数(20 参数):

名称描述默认类型

apiVersion (producer)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (producer)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (producer)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

portName (producer)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (producer)

用于 ServiceCall EIP 的端口协议

tcp

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

197.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-config-maps.enabled

是否启用 kubernetes-config-maps 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-config-maps.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 198 章 Kubernetes Deployments 组件

可作为 Camel 版本 2.20 可用

Kubernetes Deployments 组件是 Kubernetes 组件 中的一个,提供执行 kubernetes secret 操作的制作者。

198.1. 组件选项

Kubernetes Deployments 组件没有选项。

198.2. 端点选项

Kubernetes Deployments 端点使用 URI 语法配置:

kubernetes-deployments:masterUrl

使用以下路径和查询参数:

198.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

198.2.2. 查询参数(28 参数):

名称描述默认类型

apiVersion (common)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (common)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (common)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

portName (common)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (common)

用于 ServiceCall EIP 的端口协议

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

labelKey (consumer)

监控某些资源时的 Consumer Label 键

 

字符串

labelValue (consumer)

监控某些资源时的 Consumer Label 值

 

字符串

namespace (consumer)

命名空间

 

字符串

poolSize (consumer)

Consumer 池大小

1

int

resourceName (consumer)

您要监视的消费者资源名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

198.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-deployments.enabled

是否启用 kubernetes-deployments 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-deployments.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 199 章 Kubernetes HPA Component

作为 Camel 版本 2.23 可用

Kubernetes HPA 组件是一个 Kubernetes 组件,它提供执行 kubernetes hpa 操作和消费者使用 kubernetes hpa 事件的制作者。

199.1. 组件选项

Kubernetes HPA 组件没有选项。

199.2. 端点选项

Kubernetes HPA 端点使用 URI 语法配置:

kubernetes-hpa:masterUrl

使用以下路径和查询参数:

199.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

199.2.2. 查询参数(28 参数):

名称描述默认类型

apiVersion (common)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (common)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (common)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

portName (common)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (common)

用于 ServiceCall EIP 的端口协议

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

labelKey (consumer)

监控某些资源时的 Consumer Label 键

 

字符串

labelValue (consumer)

监控某些资源时的 Consumer Label 值

 

字符串

namespace (consumer)

命名空间

 

字符串

poolSize (consumer)

Consumer 池大小

1

int

resourceName (consumer)

您要监视的消费者资源名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

199.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-hpa.enabled

是否启用 kubernetes-hpa 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-hpa.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 200 章 Kubernetes Job Component

作为 Camel 版本 2.23 可用

Kubernetes 作业 组件是 Kubernetes 组件 中的一个,提供执行 kubernetes 作业操作的制作者。

200.1. 组件选项

Kubernetes 作业组件没有选项。

200.2. 端点选项

Kubernetes 作业端点使用 URI 语法配置:

kubernetes-job:masterUrl

使用以下路径和查询参数:

200.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

200.2.2. 查询参数(28 参数):

名称描述默认类型

apiVersion (common)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (common)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (common)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

portName (common)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (common)

用于 ServiceCall EIP 的端口协议

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

labelKey (consumer)

监控某些资源时的 Consumer Label 键

 

字符串

labelValue (consumer)

监控某些资源时的 Consumer Label 值

 

字符串

namespace (consumer)

命名空间

 

字符串

poolSize (consumer)

Consumer 池大小

1

int

resourceName (consumer)

您要监视的消费者资源名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

200.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-job.enabled

是否启用 kubernetes-job 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-job.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 201 章 Kubernetes Namespaces Component

作为 Camel 2.17 版提供

Kubernetes 命名空间 组件是一个 Kubernetes 组件,它提供了一个制作者来执行 kubernetes 命名空间操作,以及消耗 kubernetes 命名空间事件的用户。

201.1. 组件选项

Kubernetes 命名空间组件没有选项。

201.2. 端点选项

Kubernetes 命名空间端点使用 URI 语法配置:

kubernetes-namespaces:masterUrl

使用以下路径和查询参数:

201.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

201.2.2. 查询参数(28 参数):

名称描述默认类型

apiVersion (common)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (common)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (common)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

portName (common)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (common)

用于 ServiceCall EIP 的端口协议

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

labelKey (consumer)

监控某些资源时的 Consumer Label 键

 

字符串

labelValue (consumer)

监控某些资源时的 Consumer Label 值

 

字符串

namespace (consumer)

命名空间

 

字符串

poolSize (consumer)

Consumer 池大小

1

int

resourceName (consumer)

您要监视的消费者资源名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

201.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-namespaces.enabled

是否启用 kubernetes-namespaces 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-namespaces.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 202 章 Kubernetes Nodes Component

作为 Camel 2.17 版提供

Kubernetes 节点 组件是一个 Kubernetes 组件,它提供了一个制作者来执行 kubernetes 节点操作,以及消费 kubernetes 节点事件的用户。

202.1. 组件选项

Kubernetes 节点组件没有选项。

202.2. 端点选项

Kubernetes 节点端点使用 URI 语法配置:

kubernetes-nodes:masterUrl

使用以下路径和查询参数:

202.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

202.2.2. 查询参数(28 参数):

名称描述默认类型

apiVersion (common)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (common)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (common)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

portName (common)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (common)

用于 ServiceCall EIP 的端口协议

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

labelKey (consumer)

监控某些资源时的 Consumer Label 键

 

字符串

labelValue (consumer)

监控某些资源时的 Consumer Label 值

 

字符串

namespace (consumer)

命名空间

 

字符串

poolSize (consumer)

Consumer 池大小

1

int

resourceName (consumer)

您要监视的消费者资源名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

202.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-nodes.enabled

是否启用 kubernetes-nodes 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-nodes.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 203 章 Kubernetes Persistent Volume Claim 组件

作为 Camel 2.17 版提供

Kubernetes 持久性卷声明组件是 Kubernetes 组件中的一个,它提供了一个执行 kubernetes 持久性卷声明操作的制作程序。

203.1. 组件选项

Kubernetes Persistent Volume Claim 组件没有选项。

203.2. 端点选项

Kubernetes 持久性卷声明端点使用 URI 语法进行配置:

kubernetes-persistent-volumes-claims:masterUrl

使用以下路径和查询参数:

203.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

203.2.2. 查询参数(20 参数):

名称描述默认类型

apiVersion (producer)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (producer)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (producer)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

portName (producer)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (producer)

用于 ServiceCall EIP 的端口协议

tcp

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

203.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-persistent-volumes-claims.enabled

是否启用 kubernetes-persistent-volumes-claims 组件自动配置。默认启用。

 

布尔值

camel.component.kubernetes-persistent-volumes-claims.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 204 章 Kubernetes 持久性卷组件

作为 Camel 2.17 版提供

Kubernetes 持久卷组件是 Kubernetes 组件 中的一个,提供执行 kubernetes 持久性卷操作的制作者。

204.1. 组件选项

Kubernetes 持久性卷组件没有选项。

204.2. 端点选项

Kubernetes 持久性卷端点使用 URI 语法进行配置:

kubernetes-persistent-volumes:masterUrl

使用以下路径和查询参数:

204.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

204.2.2. 查询参数(20 参数):

名称描述默认类型

apiVersion (producer)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (producer)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (producer)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

portName (producer)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (producer)

用于 ServiceCall EIP 的端口协议

tcp

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

204.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-persistent-volumes.enabled

是否启用 kubernetes-persistent-volumes 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-persistent-volumes.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 205 章 Kubernetes Pods Component

作为 Camel 2.17 版提供

Kubernetes Pod 组件是 Kubernetes 组件 中的一个,提供执行 kubernetes pod 操作的制作者。

205.1. 组件选项

Kubernetes Pod 组件没有选项。

205.2. 端点选项

Kubernetes Pod 端点使用 URI 语法配置:

kubernetes-pods:masterUrl

使用以下路径和查询参数:

205.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

205.2.2. 查询参数(28 参数):

名称描述默认类型

apiVersion (common)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (common)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (common)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

portName (common)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (common)

用于 ServiceCall EIP 的端口协议

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

labelKey (consumer)

监控某些资源时的 Consumer Label 键

 

字符串

labelValue (consumer)

监控某些资源时的 Consumer Label 值

 

字符串

namespace (consumer)

命名空间

 

字符串

poolSize (consumer)

Consumer 池大小

1

int

resourceName (consumer)

您要监视的消费者资源名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

205.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-pods.enabled

是否启用 kubernetes-pods 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-pods.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 206 章 Kubernetes Replication Controller 组件

作为 Camel 2.17 版提供

Kubernetes Replication Controller 组件中有一个 Kubernetes 组件,它提供了一个制作者来执行 kubernetes 复制控制器操作,以及一个使用者来消耗 kubernetes 复制控制器事件。

206.1. 组件选项

Kubernetes Replication Controller 组件没有选项。

206.2. 端点选项

Kubernetes Replication Controller 端点使用 URI 语法配置:

kubernetes-replication-controllers:masterUrl

使用以下路径和查询参数:

206.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

206.2.2. 查询参数(28 参数):

名称描述默认类型

apiVersion (common)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (common)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (common)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

portName (common)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (common)

用于 ServiceCall EIP 的端口协议

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

labelKey (consumer)

监控某些资源时的 Consumer Label 键

 

字符串

labelValue (consumer)

监控某些资源时的 Consumer Label 值

 

字符串

namespace (consumer)

命名空间

 

字符串

poolSize (consumer)

Consumer 池大小

1

int

resourceName (consumer)

您要监视的消费者资源名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

206.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-replication-controllers.enabled

是否启用 kubernetes-replication-controllers 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-replication-controllers.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 207 章 Kubernetes 资源配额组件

作为 Camel 2.17 版提供

Kubernetes 资源配额组件是 Kubernetes 组件 中的一个,它提供执行 kubernetes 资源配额操作的制作者。

207.1. 组件选项

Kubernetes 资源配额组件没有选项。

207.2. 端点选项

Kubernetes 资源配额端点使用 URI 语法进行配置:

kubernetes-resources-quota:masterUrl

使用以下路径和查询参数:

207.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

207.2.2. 查询参数(20 参数):

名称描述默认类型

apiVersion (producer)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (producer)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (producer)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

portName (producer)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (producer)

用于 ServiceCall EIP 的端口协议

tcp

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

207.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-resources-quota.enabled

是否启用 kubernetes-resources-quota 组件自动配置。默认启用。

 

布尔值

camel.component.kubernetes-resources-quota.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 208 章 Kubernetes Secrets Component

作为 Camel 2.17 版提供

Kubernetes Secrets 组件是 Kubernetes 组件 中的一个,提供执行 kubernetes secret 操作的制作者。

208.1. 组件选项

Kubernetes Secrets 组件没有选项。

208.2. 端点选项

Kubernetes Secrets 端点使用 URI 语法配置:

kubernetes-secrets:masterUrl

使用以下路径和查询参数:

208.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

208.2.2. 查询参数(20 参数):

名称描述默认类型

apiVersion (producer)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (producer)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (producer)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

portName (producer)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (producer)

用于 ServiceCall EIP 的端口协议

tcp

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

208.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-secrets.enabled

是否启用 kubernetes-secrets 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-secrets.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 209 章 Kubernetes Service Account Component

作为 Camel 2.17 版提供

Kubernetes Service Account 组件是一个 Kubernetes 组件,它提供了一个制作者来执行 kubernetes Service Account 操作。

209.1. 组件选项

Kubernetes 服务帐户组件没有选项。

209.2. 端点选项

Kubernetes 服务帐户端点使用 URI 语法进行配置:

kubernetes-service-accounts:masterUrl

使用以下路径和查询参数:

209.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

209.2.2. 查询参数(20 参数):

名称描述默认类型

apiVersion (producer)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (producer)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (producer)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

portName (producer)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (producer)

用于 ServiceCall EIP 的端口协议

tcp

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

209.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-service-accounts.enabled

是否启用 kubernetes-service-accounts 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-service-accounts.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 210 章 Kubernetes Services Component

作为 Camel 2.17 版提供

Kubernetes Services 组件是一个 Kubernetes 组件,它提供了一个制作者来执行 kubernetes 服务操作,以及消费 kubernetes 服务事件的用户。

210.1. 组件选项

Kubernetes Services 组件没有选项。

210.2. 端点选项

Kubernetes Services 端点使用 URI 语法配置:

kubernetes-services:masterUrl

使用以下路径和查询参数:

210.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

210.2.2. 查询参数(28 参数):

名称描述默认类型

apiVersion (common)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (common)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (common)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

portName (common)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (common)

用于 ServiceCall EIP 的端口协议

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

labelKey (consumer)

监控某些资源时的 Consumer Label 键

 

字符串

labelValue (consumer)

监控某些资源时的 Consumer Label 值

 

字符串

namespace (consumer)

命名空间

 

字符串

poolSize (consumer)

Consumer 池大小

1

int

resourceName (consumer)

您要监视的消费者资源名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

210.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.kubernetes-services.enabled

是否启用 kubernetes-services 组件的自动配置。默认启用。

 

布尔值

camel.component.kubernetes-services.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

210.4. Eclipse Kura 组件

可作为 Camel 2.15 可用

本文档页面涵盖了 Camel 与 Eclipse Kura M2M 网关的集成选项。将 Camel 路由部署到 Eclipse Kura 的常见原因是,为消息传递 M2M 网关提供企业集成模式和 Camel 组件。例如,您可能希望在 Raspberry PI 上安装 Kura,然后从附加到该 Raspberry PI 的传感器读取温度值,最后使用 Kura 服务将当前的温度值转发到您的数据中心服务。

210.4.1. KuraRouter activator

部署到 Eclipse Kura 的捆绑包通常会作为捆绑激活器开发。因此,将 Apache Camel 路由部署到 Kura 的最简单方法是创建 OSGi 捆绑包,其中包含扩展 org.apache.camel.kura.KuraRouter 类的 OSGi 捆绑包:

public class MyKuraRouter extends KuraRouter {

  @Override
  public void configure() throws Exception {
    from("timer:trigger").
      to("netty-http:http://app.mydatacenter.com/api");
  }

}

请记住,KuraRouter 实施 org.osgi.framework.BundleActivator 接口,因此您需要 在创建 Kura bundle 组件类 时注册其  启动和停止  生命周期方法。

Kura router 来启动自己的 OSGi 感知型 CamelContext。这意味着,对于扩展 KuraRouter 的每个类,将有一个专用的 CamelContext 实例。理想情况下,我们建议每个 OSGi 捆绑包部署一个 KuraRouter

210.4.2. 部署 KuraRouter

包含 Kura router 类的捆绑包应该在 OSGi 清单中导入以下软件包:

Import-Package: org.osgi.framework;version="1.3.0",
  org.slf4j;version="1.6.4",
  org.apache.camel,org.apache.camel.impl,org.apache.camel.core.osgi,org.apache.camel.builder,org.apache.camel.model,
  org.apache.camel.component.kura

请记住,您不必导入每个计划在路由中使用的 Camel 组件捆绑包,因为 Camel 组件作为运行时级别的服务来解决。

在部署路由器捆绑包前,请确定您已部署(并启动)以下 Camel 核心捆绑包(使用 Kura GoGo shell)…​

install file:///home/user/.m2/repository/org/apache/camel/camel-core/2.15.0/camel-core-2.15.0.jar
start <camel-core-bundle-id>
install file:///home/user/.m2/repository/org/apache/camel/camel-core-osgi/2.15.0/camel-core-osgi-2.15.0.jar
start <camel-core-osgi-bundle-id>
install file:///home/user/.m2/repository/org/apache/camel/camel-kura/2.15.0/camel-kura-2.15.0.jar
start <camel-kura-bundle-id>

…​and 所有计划在路由中使用的组件:

install file:///home/user/.m2/repository/org/apache/camel/camel-stream/2.15.0/camel-stream-2.15.0.jar
start <camel-stream-bundle-id>

然后最终部署您的路由器捆绑包:

install file:///home/user/.m2/repository/com/example/myrouter/1.0/myrouter-1.0.jar
start <your-bundle-id>

210.4.3. KuraRouter 工具 

 Kura router 基础类提供许多有用的工具。本节逐一探讨它们。

210.4.3.1. SLF4J 日志记录器

Kura 使用 SLF4J facade 进行日志记录。受保护的成员 日志 会返回与给定 Kura 路由器关联的 SLF4J 日志记录器实例。

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        log.info("Configuring Camel routes!");
        ...
    }

}

210.4.3.2. BundleContext

受保护的成员 捆绑包Context 返回与给定 Kura 路由器关联的捆绑包上下文。

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        ServiceReference<MyService> serviceRef = bundleContext.getServiceReference(LogService.class.getName());
        MyService myService = bundleContext.getService(serviceRef);
        ...
    }

}

210.4.3.3. CamelContext

受保护的成员 camelContext 是与给定 Kura 路由器关联的 CamelContext

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        camelContext.getStatus();
        ...
    }

}

210.4.3.4. ProducerTemplate

protected member producerTemplate 是与给定 Camel 上下文关联的 ProducerTemplate 实例。

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        producerTemplate.sendBody("jms:temperature", 22.0);
        ...
    }

}

210.4.3.5. ConsumerTemplate

受保护的成员 使用者Template 是与给定 Camel 上下文关联的 ConsumerTemplate 实例。

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        double currentTemperature = producerTemplate.receiveBody("jms:temperature", Double.class);
        ...
    }

}

210.4.3.6. OSGi 服务解析器

OSGi 服务解析器(服务(Class<T> serviceType))可用于根据 OSGi 捆绑包上下文中的类型轻松检索服务。

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        MyService myService = service(MyService.class);
        ...
    }

}

如果找不到 service,则返回 null 值。如果服务不可用,则需要应用程序失败,使用 requiredService (Class) 方法。如果找不到服务,则 requiredService 会引发 IllegalStateException

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        MyService myService = requiredService(MyService.class);
        ...
    }

}

210.4.4. KuraRouter activator 回调

Kura 路由器附带生命周期回调,可用于自定义 Camel 路由器的工作方式。例如,要配置与路由器关联的 CamelContext 实例,请在前者启动前覆盖 KuraRouter 类的 beforeStart 方法:

public class MyKuraRouter extends KuraRouter {
 
  ...

  protected void beforeStart(CamelContext camelContext) {
    OsgiDefaultCamelContext osgiContext = (OsgiCamelContext) camelContext;
    osgiContext.setName("NameOfTheRouter");
  }

}

210.4.5. 从 ConfigurationAdmin 加载 XML 路由

有时,需要从服务器配置读取路由的 XML 定义。这是 IoT 网关的一个常见情境,无线无线重新部署成本可能非常显著。为满足这一要求,每个 KuraRouter 会查找使用 OSGi ConfigurationAdmin 的 kura.camel.BUNDLE-SYMBOLIC-NAME.route 属性。这种方法允许您为每个部署的 KuraRouter 定义 Camel XML 路由文件。要更新路由,只需编辑适当的配置属性并重启与其关联的捆绑包。kura.camel.BUNDLE-SYMBOLIC-NAME.route 属性的内容应该是 Camel XML 路由文件,例如:

<routes xmlns="http://camel.apache.org/schema/spring">
    <route id="loaded">
        <from uri="direct:bar"/>
        <to uri="mock:bar"/>
    </route>
</routes>

 

210.4.6. 将 Kura 路由器部署为声明性 OSGi 服务

如果要将 Kura 路由器部署为声明性 OSGi 服务,您可以使用 KuraRouter 提供的 激活和停用 方法。

<scr:component name="org.eclipse.kura.example.camel.MyKuraRouter" activate="activate" deactivate="deactivate" enabled="true" immediate="true">
  <implementation class="org.eclipse.kura.example.camel.MyKuraRouter"/>
</scr:component>

210.4.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 211 章 语言组件

可作为 Camel 版本 2.5 提供

语言组件允许您将 Exchange 发送到端点,该端点由 Camel 中任何受支持的语言执行脚本。
通过让组件执行语言脚本,它允许更多动态路由功能。例如,使用 Routing Slip 或 Dynamic Router EIPs,您可以将消息发送到脚本动态定义 的语言 端点。

此组件在 camel-core 中提供,因此不需要额外的 JAR。如果选择的语言要求(如使用 GroovyJavaScript 语言)需要包括其他 Camel 组件。

211.1. URI 格式

language://languageName[:script][?options]

从 Camel 2.11 开始,您可以使用与 Camel 中的其它语言支持相同的表示法引用脚本的外部资源。???

language://languageName:resource:scheme:location][?options]

211.2. URI 选项

Language 组件没有选项。

语言端点使用 URI 语法进行配置:

language:languageName:resourceUri

使用以下路径和查询参数:

211.2.1. 路径名(2 参数):

名称描述默认类型

languageName

必需 设置要使用的语言名称

 

字符串

resourceUri

资源的路径,或用于在 registry 中查找 Bean 的引用,用作资源

 

字符串

211.2.2. 查询参数(6 参数):

名称描述默认类型

binary (producer)

脚本是二进制内容还是文本内容。默认情况下,该脚本可以读取为文本内容(如 java.lang.String)

false

布尔值

cacheScript (producer)

无论是缓存编译的脚本和重复使用脚本,都会导致处理一个 Camel org.apache.camel.Exchange 到下一个 org.apache.camel.Exchange 的副作用。

false

布尔值

contentCache (producer)

设定是否使用资源内容缓存。

false

布尔值

script (producer)

设置要执行的脚本

 

字符串

transform (producer)

脚本的结果是否应该用作消息正文。这个选项默认为 true。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

211.3. 消息标头

以下消息标头可用于影响组件的行为

标头描述

CamelLanguageScript

要执行的标头中的脚本。优先于端点中配置的脚本。

211.4. 例子

例如,您可以使用 Simple 语言向 Message Translator 的消息:

如果要转换消息正文类型,您也可以转换此目的:

您还可以使用 Groovy 语言,例如,输入信息将乘以 2:

您还可以提供脚本作为标题,如下所示。此处我们使用 XPath 语言从 < foo> 标签中提取文本。

Object out = producer.requestBodyAndHeader("language:xpath", "<foo>Hello World</foo>", Exchange.LANGUAGE_SCRIPT, "/foo/text()");
assertEquals("Hello World", out);

211.5. 从资源载入脚本

作为 Camel 2.9 提供。

您可以为在端点 uri 或 Exchange.LANGUAGE_SCRIPT 标头中的脚本指定资源 uri。
uri 必须以以下方案之一开头:file、classpath: 或 http:

例如,从 classpath 中载入脚本:

默认情况下,该脚本会加载一次并缓存。但是,您可以禁用 contentCache 选项,并在每个评估时载入脚本。
例如,如果磁盘上更改了 myscript.txt 文件,则使用更新的脚本:

Camel 2.11 开始,您可以通过前缀为 "resource:" 来指代与 Camel 中的其它语言类似的资源,如下所示: ???

第 212 章 LDAP 组件

可作为 Camel 版本 1.5 提供

ldap 组件允许您使用过滤器作为消息有效负载在 LDAP 服务器中执行搜索。
此组件使用标准 JNDI (javax.naming package)来访问服务器。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ldap</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

212.1. URI 格式

ldap:ldapServerBean[?options]

URI 的 ldapServerBean 部分引用 registry 中的 DirContext bean。LDAP 组件仅支持制作者端点,这意味着 ldap URI 在路由开始时无法出现在 中。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

212.2. 选项

LDAP 组件没有选项。

LDAP 端点使用 URI 语法配置:

ldap:dirContextName

使用以下路径和查询参数:

212.2.1. 路径名(1 参数):

名称描述默认类型

dirContextName

需要 的名称包括 javax.naming.directory.DirContext 或 java.util.Hashtable,或 Map bean 在注册表中查找。如果 bean 是 Hashtable 或 Map,则为每个用途创建一个新的 javax.naming.directory.DirContext 实例。如果 bean 是 javax.naming.directory.DirContext,则 bean 将原样使用。在不能共享 javax.naming.directory.DirContext 的所有情况下,后者可能无法共享,在这种情况下,最好使用 java.util.Hashtable 或 Map。

 

字符串

212.2.2. 查询参数(5 参数):

名称描述默认类型

base (producer)

用于搜索的基本 DN。

ou=system

字符串

pageSize (producer)

当指定 ldap 模块时,使用分页来检索所有结果(大多数 LDAP 服务器在尝试检索多个查询时超过 1000 个条目时抛出异常)。要能够使用此 LdapContext (DirContext 的子类)作为 ldapServerBean (否则会抛出异常)

 

整数

returnedAttributes (producer)

在结果的每个条目中以逗号分隔的属性列表

 

字符串

scope (producer)

指定如何从基本 DN 开始,深度搜索条目树。

subtree

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

212.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.ldap.enabled

启用 ldap 组件

true

布尔值

camel.component.ldap.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

212.4. 结果

其结果在 Out body 中作为 ArrayList<javax.naming.directory.SearchResult > 对象返回。

212.5. DirContext

URI ldap:ldapserver 引用带有 ID ldapserver 的 Spring bean。ldapserver bean 可以定义如下:

<bean id="ldapserver" class="javax.naming.directory.InitialDirContext" scope="prototype">
  <constructor-arg>
    <props>
      <prop key="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</prop>
      <prop key="java.naming.provider.url">ldap://localhost:10389</prop>
      <prop key="java.naming.security.authentication">none</prop>
    </props>
  </constructor-arg>
</bean>

前面的示例声明了一个基于 Sun 的 LDAP DirContext,它将匿名连接到本地托管的 LDAP 服务器。

注意

不需要 DirContext 对象来支持按合同的并发。因此,在 bean 定义中,目录上下文声明了设置 范围="prototype",或者上下文支持并发。在 Spring 框架中,整套对象在每次查找时都会实例化它们。

212.6. Samples

根据上面的 Spring 配置,以下示例中的代码示例发送 LDAP 请求来过滤组以获取成员。然后,从响应中提取通用名称。

ProducerTemplate<Exchange> template = exchange
  .getContext().createProducerTemplate();

Collection<?> results = (Collection<?>) (template
  .sendBody(
    "ldap:ldapserver?base=ou=mygroup,ou=groups,ou=system",
    "(member=uid=huntc,ou=users,ou=system)"));

if (results.size() > 0) {
  // Extract what we need from the device's profile

  Iterator<?> resultIter = results.iterator();
  SearchResult searchResult = (SearchResult) resultIter
      .next();
  Attributes attributes = searchResult
      .getAttributes();
  Attribute deviceCNAttr = attributes.get("cn");
  String deviceCN = (String) deviceCNAttr.get();

  ...

如果不需要特定的过滤器 - 例如,您只需查找单个条目 - 指定一个通配符过滤器表达式。例如,如果 LDAP 条目有一个通用名称,请使用类似如下的过滤器表达式:

(cn=*)

212.6.1. 使用凭证绑定

Camel 最终用户发出此示例代码,他用于使用凭证绑定到 ldap 服务器。

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
props.setProperty(Context.PROVIDER_URL, "ldap://localhost:389");
props.setProperty(Context.URL_PKG_PREFIXES, "com.sun.jndi.url");
props.setProperty(Context.REFERRAL, "ignore");
props.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
props.setProperty(Context.SECURITY_PRINCIPAL, "cn=Manager");
props.setProperty(Context.SECURITY_CREDENTIALS, "secret");

SimpleRegistry reg = new SimpleRegistry();
reg.put("myldap", new InitialLdapContext(props, null));

CamelContext context = new DefaultCamelContext(reg);
context.addRoutes(
    new RouteBuilder() {
        public void configure() throws Exception {
            from("direct:start").to("ldap:myldap?base=ou=test");
        }
    }
);
context.start();

ProducerTemplate template = context.createProducerTemplate();

Endpoint endpoint = context.getEndpoint("direct:start");
Exchange exchange = endpoint.createExchange();
exchange.getIn().setBody("(uid=test)");
Exchange out = template.send(endpoint, exchange);

Collection<SearchResult> data = out.getOut().getBody(Collection.class);
assert data != null;
assert !data.isEmpty();

System.out.println(out.getOut().getBody());

context.stop();

212.7. 配置 SSL

所有必需是创建自定义套接字工厂并在 InitialDirContext bean 中引用它 - 请参阅以下示例。

SSL 配置

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
                 http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">


    <sslContextParameters xmlns="http://camel.apache.org/schema/blueprint"
                          id="sslContextParameters">
        <keyManagers
                keyPassword="{{keystore.pwd}}">
            <keyStore
                    resource="{{keystore.url}}"
                    password="{{keystore.pwd}}"/>
        </keyManagers>
    </sslContextParameters>

    <bean id="customSocketFactory" class="zotix.co.util.CustomSocketFactory">
        <argument ref="sslContextParameters" />
    </bean>
    <bean id="ldapserver" class="javax.naming.directory.InitialDirContext" scope="prototype">
        <argument>
            <props>
                <prop key="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
                <prop key="java.naming.provider.url" value="ldaps://lab.zotix.co:636"/>
                <prop key="java.naming.security.protocol" value="ssl"/>
                <prop key="java.naming.security.authentication" value="simple" />
                <prop key="java.naming.security.principal" value="cn=Manager,dc=example,dc=com"/>
                <prop key="java.naming.security.credentials" value="passw0rd"/>
                <prop key="java.naming.ldap.factory.socket"
                      value="zotix.co.util.CustomSocketFactory"/>
            </props>
        </argument>
    </bean>
</blueprint>

自定义套接字系数

import org.apache.camel.util.jsse.SSLContextParameters;

import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyStore;

/**
 * The CustomSocketFactory. Loads the KeyStore and creates an instance of SSLSocketFactory
 */
public class CustomSocketFactory extends SSLSocketFactory {

    private static SSLSocketFactory socketFactory;

    /**
     * Called by the getDefault() method.
     */
    public CustomSocketFactory() {

    }

    /**
     * Called by Blueprint DI to initialise an instance of SocketFactory
     *
     * @param sslContextParameters
     */
    public CustomSocketFactory(SSLContextParameters sslContextParameters) {
        try {
            KeyStore keyStore = sslContextParameters.getKeyManagers().getKeyStore().createKeyStore();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
            tmf.init(keyStore);
            SSLContext ctx = SSLContext.getInstance("TLS");
            ctx.init(null, tmf.getTrustManagers(), null);
            socketFactory = ctx.getSocketFactory();
        } catch (Exception ex) {
            ex.printStackTrace(System.err);  /* handle exception */
        }
    }

    /**
     * Getter for the SocketFactory
     *
     * @return
     */
    public static SocketFactory getDefault() {
        return new CustomSocketFactory();
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return socketFactory.getDefaultCipherSuites();
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return socketFactory.getSupportedCipherSuites();
    }

    @Override
    public Socket createSocket(Socket socket, String string, int i, boolean bln) throws IOException {
        return socketFactory.createSocket(socket, string, i, bln);
    }

    @Override
    public Socket createSocket(String string, int i) throws IOException {
        return socketFactory.createSocket(string, i);
    }

    @Override
    public Socket createSocket(String string, int i, InetAddress ia, int i1) throws IOException {
        return socketFactory.createSocket(string, i, ia, i1);
    }

    @Override
    public Socket createSocket(InetAddress ia, int i) throws IOException {
        return socketFactory.createSocket(ia, i);
    }

    @Override
    public Socket createSocket(InetAddress ia, int i, InetAddress ia1, int i1) throws IOException {
        return socketFactory.createSocket(ia, i, ia1, i1);
    }
}

 

212.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 213 章 LDIF 组件

可作为 Camel 版本 2.20 可用

ldif 组件允许您从 LDIF 正文内容对 LDAP 服务器上的更新进行更新。

此组件使用基本的 URL 语法来访问服务器。它使用 Apache DS LDAP 库来处理 LDIF。在处理 LDIF 后,响应正文将是每个条目的成功/失败状态列表。

注意

Apache LDAP API 对 LDIF 语法错误非常敏感。如果有疑问,请参考单元测试来查看每个更改类型的示例。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ldif</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

213.1. URI 格式

ldap:ldapServerBean[?options]

URI 的 ldapServerBean 部分引用 LdapConnection。这应该从使用点中的工厂组成,以避免连接超时。LDIF 组件仅支持制作者端点,这意味着在路由开始时无法从 中出现 ldif URI。

对于 SSL 配置,请参考 camel-ldap 组件,其中有一个示例设置自定义 SocketFactory 实例。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

213.2. 选项

LDIF 组件没有选项。

LDIF 端点使用 URI 语法配置:

ldif:ldapConnectionName

使用以下路径和查询参数:

213.2.1. 路径名(1 参数):

名称描述默认类型

ldapConnectionName

需要 要从 registry 中拉取的 LdapConnection bean 的名称。请注意,这必须是范围原型,以避免在线程之间共享或使用已超时的连接。

 

字符串

213.2.2. 查询参数(1 参数):

名称描述默认类型

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

213.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.ldif.enabled

是否启用 ldif 组件的自动配置。默认启用。

 

布尔值

camel.component.ldif.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

213.4. 正文类型:

正文可以是 LDIF 文件或内联 LDIF 文件的 URL。为表示正文类型之间的区别,必须开始一个内联 LDIF:

version: 1

如果没有,则组件将尝试将正文解析为 URL。

213.5. 结果

其结果在 Out body 中以 ArrayList<java.lang.String > 对象形式返回。这包括每个 LDIF 条目的"成功"或异常消息。

213.6. LdapConnection

URI ldif:ldapConnectionName,引用 ID 为 ldapConnectionName 的 bean。ldapConnection 可以使用 LdapConnectionConfig bean 来配置。请注意,该范围必须拥有一系列 原型,以避免共享或获取陈旧连接。

LdapConnection bean 可在 Spring XML 中定义如下:

<bean id="ldapConnectionOptions" class="org.apache.directory.ldap.client.api.LdapConnectionConfig">
  <property name="ldapHost" value="${ldap.host}"/>
  <property name="ldapPort" value="${ldap.port}"/>
  <property name="name" value="${ldap.username}"/>
  <property name="credentials" value="${ldap.password}"/>
  <property name="useSsl" value="false"/>
  <property name="useTls" value="false"/>
</bean>

<bean id="ldapConnectionFactory" class="org.apache.directory.ldap.client.api.DefaultLdapConnectionFactory">
  <constructor-arg index="0" ref="ldapConnectionOptions"/>
</bean>

<bean id="ldapConnection" factory-bean="ldapConnectionFactory" factory-method="newLdapConnection" scope="prototype"/>

或者在 OSGi 蓝图.xml 中:

<bean id="ldapConnectionOptions" class="org.apache.directory.ldap.client.api.LdapConnectionConfig">
  <property name="ldapHost" value="${ldap.host}"/>
  <property name="ldapPort" value="${ldap.port}"/>
  <property name="name" value="${ldap.username}"/>
  <property name="credentials" value="${ldap.password}"/>
  <property name="useSsl" value="false"/>
  <property name="useTls" value="false"/>
</bean>

<bean id="ldapConnectionFactory" class="org.apache.directory.ldap.client.api.DefaultLdapConnectionFactory">
  <argument ref="ldapConnectionOptions"/>
</bean>

<bean id="ldapConnection" factory-ref="ldapConnectionFactory" factory-method="newLdapConnection" scope="prototype"/>

213.7. Samples

根据上面的 Spring 配置,以下示例中的代码示例发送 LDAP 请求来过滤组以获取成员。然后,从响应中提取通用名称。

ProducerTemplate<Exchange> template = exchange.getContext().createProducerTemplate();

List<?> results = (Collection<?>) template.sendBody("ldap:ldapConnection, "LDiff goes here");

if (results.size() > 0) {
  // Check for no errors

  for (String result : results) {
    if ("success".equalTo(result)) {
      // LDIF entry success
    } else {
      // LDIF entry failure
    }
  }
}

213.8. LevelDB

可从 Camel 2.10 开始

leveldb 是一个轻量级、可嵌入的键值数据库。它允许与 Camel 一起为各种 Camel 功能(如聚合器)提供持久性支持。

它提供的当前功能:

  • LevelDBAggregationRepository

213.8.1. Using LevelDBAggregationRepository

LevelDBAggregationRepository 是一个 AggregationRepository,可在 fly persist 中保留聚合的消息。这可确保您不会松散的消息,因为默认聚合器将仅使用内存 AggregationRepository

它有以下选项:

选项类型描述

repositoryName

字符串

必需的存储库名称。允许您将共享 LevelDBFile 用于多个存储库。

persistentFileName

字符串

持久性存储的文件名。如果启动新文件时不存在 文件。

levelDBFile

LevelDBFile

使用现有配置的 org.apache.camel.component.leveldb.LevelDBFile 实例。

sync

布尔值

Camel 2.12: LevelDBFile 应在写入或不同步。默认为 false。通过同步写操作,确保其始终等待所有写入操作到磁盘,因此不会松散更新。有关同步与同步写入的详情,请参阅 LevelDB 文档。

returnOldExchange

布尔值

如果存在,get 操作是否应该返回旧的现有 Exchange。默认情况下,这个选项为 false 以优化,因为我们在聚合时不需要旧的交换。

useRecovery

布尔值

是否启用恢复。此选项默认为 true。启用 Camel 聚合器自动恢复失败的聚合交换时,它们被重新提交。

recoveryInterval

long

如果启用了恢复,则会每 x 一次运行后台任务来扫描失败的交换以进行恢复并重新提交。默认情况下,这个间隔为 5000 millis。

maximumRedeliveries

int

允许您限制恢复的交换尝试的最大重新传送尝试数。如果启用,如果所有重新传送尝试都失败,则 Exchange 将移到 dead letter 频道。默认情况下禁用这个选项。如果使用这个选项,则必须提供 deadLetterUri 选项。

deadLetterUri

字符串

一个 Dead Letter Channel 的端点 uri,其中会移动已耗尽恢复的 Exchange。如果使用这个选项,则必须提供 最大值的Redeliveries 选项。

必须提供 repositoryName 选项。然后,必须提供 persistentFileNamelevelDBFile

213.8.2. 永久保留什么

LevelDBAggregationRepository 只会保留任何 Serializable 兼容消息正文数据类型。邮件标题必须是原语/字符串/数字/等。如果数据类型不是这样丢弃的类型,并记录 WARN。它只会保留 消息正文 和消息标题。Exchange 属性 不具有持久性

213.8.3. 恢复

LevelDBAggregationRepository 默认恢复任何失败的交换。它通过执行在持久性存储中扫描故障 Exchange 的后台任务来实现此目的。您可以使用 checkInterval 选项设置此任务运行的频率。恢复工作是确保 Camel 尝试恢复和重做失败的交换的事务。任何发现的交换将从持久性存储中恢复,并再次重新提交。

当 Exchange 被恢复/redelivered时,会设置以下标头:

标头类型描述

Exchange.REDELIVERED

布尔值

设置为 true 以指示 Exchange 处于红色状态。

Exchange.REDELIVERY_COUNTER

整数

从 1 开始重新发送尝试。

只有当成功处理 Exchange 时,它才会标记为完成,当 确认 方法在 AggregationRepository 上调用时,才会将其标记为完成。这意味着,如果同一交换再次失败,它将被重试,直到成功为止。

您可以使用选项 maximumRedeliveries 来限制给定恢复的 Exchange 的最大重新传送尝试次数。您还必须设置 deadLetterUri 选项,因此 Camel 知道在点击 的最大值时要发送交换 的位置。

您可以在 camel-leveldb 的单元测试中看到一些示例,例如: https://svn.apache.org/repos/asf/camel/trunk/components/camel-leveldb/src/test/java/org/apache/camel/component/leveldb/LevelDBAggregateRecoverTest.java

213.8.3.1. 在 Java DSL 中使用 LevelDBAggregationRepository

在这个示例中,我们希望在 target/data/leveldb.dat 文件中持续聚合的信息。

213.8.3.2. 在 Spring XML 中使用 LevelDBAggregationRepository

同一个示例,但使用 Spring XML :

213.8.4. 依赖项

要在 camel 路由中使用 LevelDB,您需要添加依赖 camel-leveldb

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-leveldb</artifactId>
  <version>2.10.0</version>
</dependency>

213.8.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • 聚合器
  • HawtDB
  • 组件

第 214 章 日志组件

可作为 Camel 版本 1.1 提供

log: component 将消息交换记录到底层日志机制。

Camel 使用 sfl4j,它允许您通过其他方式配置日志记录:

  • Log4j
  • logback
  • Java Util Logging

214.1. URI 格式

log:loggingCategory[?options]

其中 ,日志记录类别 是要使用的日志记录类别的名称。您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

INFO:*Using Logger 实例从 Camel 2.12.4/2.13.1 开始,如果 Registry 中存在 org.slf4j.Logger 实例,则日志类别不再用于创建日志记录器实例。改为使用注册的实例。另外,还可以使用 ?logger=#myLogger URI 参数来引用特定的 Logger 实例。最后,如果没有注册 URI 日志记录器 参数,则日志记录器实例使用日志记录 类别 创建。

例如,日志端点通常使用 level 选项指定 日志级别,如下所示:

log:org.apache.camel.example?level=DEBUG

默认日志记录器记录每个交换(常规日志记录)。但是,Camel 还附带 Throughput 日志记录器,每当指定 groupSize 选项时都会使用。

TIP:*Also a log in the DSL* also a directly in the DSL,但它有不同的用途。它适用于轻量级和人为日志。参阅 LogEIP 的更多详细信息。

214.2. 选项

日志组件支持 2 个选项,它们如下所列。

名称描述默认类型

exchangeFormatter (advanced)

设置自定义 ExchangeFormatter,以将 Exchange 转换为适合日志记录的字符串。如果未指定,则默认为 DefaultExchangeFormatter。

 

ExchangeFormatter

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

日志端点使用 URI 语法配置:

log:loggerName

使用以下路径和查询参数:

214.2.1. 路径名(1 参数):

名称描述默认类型

loggerName

要使用的日志记录器名称

 

字符串

214.2.2. 查询参数(26 参数):

名称描述默认类型

groupActiveOnly (producer)

如果为 true,如果没有在时间间隔内收到新消息(如果为 false),则会显示 stats,无论消息流量是什么。

true

布尔值

groupDelay (producer)

为 stats 设置初始延迟(在 millis 中)

 

Long

groupInterval (producer)

如果指定时间将按照这个时间间隔(中间)对消息 stats 进行分组。

 

Long

groupSize (producer)

为吞吐量日志记录指定组大小的整数。

 

整数

level (producer)

要使用的日志记录级别。默认值为 INFO。

INFO

字符串

logMask (producer)

如果为 true,在日志中屏蔽密码或密码短语等敏感信息。

 

布尔值

marker (producer)

要使用的可选 Marker 名称。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

maxChars (formatting)

限制每行记录的字符数。

10000

int

多行 (格式)

如果启用,则每个信息都会在换行符中输出。

false

布尔值

showAll (formatting)

为开启所有选项(多行,在使用时必须手动设置 maxChars)的快速选项。)

false

布尔值

showBody (formatting)

显示邮件正文。

true

布尔值

showBodyType (formatting)

显示正文 Java 类型。

true

布尔值

showCaughtException (formatting)

F 交换有一个捕获异常,显示异常消息(无堆栈跟踪)。捕获异常作为交换上的属性存储(使用密钥 org.apache.camel.Exchange#EXCEPTION_CAUGHT),而 doCatch 可能会捕获异常。

false

布尔值

showException (格式)

如果交换有一个例外,则显示异常消息(no stacktrace)

false

布尔值

showExchangeId (formatting)

显示唯一的交换 ID。

false

布尔值

showExchangePattern (formatting)

显示消息交换模式(或简称 MEP)。

true

布尔值

showFiles (formatting)

如果已启用的 Camel 将输出文件

false

布尔值

showFuture (formatting)

如果已启用的 Camel 将在 Future 对象上等待它完成以获取记录有效负载。

false

布尔值

showHeaders (formatting)

显示邮件标题。

false

布尔值

showOut (formatting)

如果交换有 out 消息,则显示 out 消息。

false

布尔值

showProperties (formatting)

显示交换属性。

false

布尔值

showStackTrace (formatting)

显示堆栈跟踪(如果交换是否有异常)。仅在启用 showAll, showException 或 showCaughtException 时才有效。

false

布尔值

showStreams (formatting)

Camel 是否应该显示流正文(如 java.io.InputStream)。如果您启用了这个选项,那么您将无法稍后访问消息正文,因为此日志记录器已经读取消息正文。若要更正此问题,您必须使用流缓存。

false

布尔值

skipBodyLineSeparator (formatting)

记录消息正文时是否跳过行分隔符。这允许在一行中记录消息正文,将此选项设置为 false 将保留来自正文的任意行分隔符,然后记录正文(如下所示)。

true

布尔值

style (formatting)

设置要使用的输出样式。

默认

OutputStyle

214.3. 常规日志记录器示例

在以下路由中,我们在处理顺序前在 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>

214.4. 带有格式脚示例的常规日志记录器

在下面的路由中,我们将在 INFO 级别记录传入订单,然后再处理完订购。

from("activemq:orders").
    to("log:com.mycompany.order?showAll=true&multiline=true").to("bean:processOrder");

214.5. 带有 groupSize 示例的吞吐量日志记录器

在以下路由中,我们将在 DEBUG 级别记录传入订单的吞吐量,按 10 个信息分组。

from("activemq:orders").
    to("log:com.mycompany.order?level=DEBUG&groupSize=10").to("bean:processOrder");

214.6. 带有 groupInterval 示例的吞吐量日志记录器

此路由将导致每 10 个信息记录统计记录,如果不存在任何消息流量,仍会显示初始 60s 延迟和 stats。

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"

214.7. 屏蔽敏感信息,如密码

可作为 Camel 2.19 提供

您可以通过将 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.processor.DefaultMaskingFormatter 默认用于掩码。如果要使用自定义屏蔽格式,请将其放在名为 CamelCustomLogMask 的 registry 中。请注意,掩码格式器必须实施 org.apache.camel.spi.MaskingFormatter

214.8. 完整自定义日志输出

可从 Camel 2.11 开始

使用 #Formatting 部分概述的选项,您可以控制日志记录器的大部分输出。但是,日志行始终遵循这个结构:

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]

这个格式在某些情况下不知道,您可能需要…​

  • …​ 将输出的标头和属性过滤为在 insight 和详细程度间的平衡。
  • …​ 将日志消息调整为您认为最可读的任何内容。
  • …​ 通过日志 mining 系统(如 Splunk)为摘要定制日志消息。
  • …​ 打印特定的正文类型不同。
  • …​ etc.

每次需要绝对自定义时,您可以创建一个实施 ExchangeFormatter 接口的类。在 格式为(Exchange) 方法中,您可以选择并提取您需要的精确信息,以自定义方式对其进行格式化并返回。返回值将成为最终日志消息。

您可以通过以下两种方式之一获取您的自定义 ExchangeFormatter

在 registry 中明确实例化 LogComponent:

<bean name="log" class="org.apache.camel.component.log.LogComponent">
   <property name="exchangeFormatter" ref="myCustomFormatter" />
</bean>

214.8.1. 配置间的约定:*

简单地使用名称 logFormatter 注册 Bean;Log 组件足以自动获取它。

<bean name="logFormatter" class="com.xyz.MyCustomExchangeFormatter" />
注意

ExchangeFormatter 应用到 该 Camel 上下文 内的所有日志端点。如果您需要不同端点的不同 ExchangeFormatter,请根据需要多次实例化 LogComponent,并使用相关的 bean 名称作为端点前缀。

在使用自定义日志格式器时,从 Camel 2.11.2/2.12 开始,您可以在 log uri 中指定参数,该参数在自定义日志格式器上配置。虽然当您这样做时,您应将"logFormatter"定义为具有不同参数(例如:

<bean name="logFormatter" class="com.xyz.MyCustomExchangeFormatter" scope="prototype"/>

然后,我们可以使用带有不同选项的日志 uri 来使用 Camel 路由:

<to uri="log:foo?param1=foo&amp;param2=100"/>

<to uri="log:bar?param1=bar&amp;param2=200"/>

214.9. 在 OSGi 中使用日志组件

从 Camel 2.12.4/2.13.1 的改进

当在 OSGi 中使用日志组件(例如,在 Karaf 中),由 PAX 日志记录提供底层日志机制。它搜索调用 org.slf4j.LoggerFactory.getLogger () 方法的捆绑包,并将捆绑包与日志记录器实例相关联。如果不指定自定义 org.sfl4j.Logger 实例,由 Log 组件创建的日志记录器与 camel-core 捆绑包相关联。

在某些情况下,需要与日志记录器关联的捆绑包应该是包含路由定义的捆绑包。为此,可在 Registry 中注册单个 org.slf4j.Logger 实例或使用 logger URI 参数引用它。

214.10. 另请参阅

  • 用于直接在 DSL 中用于人为日志的 LogEIP。

第 215 章 Lucene 组件

可作为 Camel 版本 2.2 提供

lucene 组件基于 Apache Lucene 项目。Apache Lucene 是一个功能强大的高性能、功能全面的文本搜索库,完全以 Java 编写。有关 Lucene 的详情,请参阅以下链接

camel 中的 lucene 组件促进了企业集成模式和情景中 Lucene 端点的集成和利用。lucene 组件执行以下操作

  • 当有效负载发送到 Lucene 端点时,构建可搜索的文档
  • 促进在 Camel 中执行索引搜索

此组件仅支持制作者端点。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-lucene</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

215.1. URI 格式

lucene:searcherName:insert[?options]
lucene:searcherName:query[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

215.2. 插入选项

Lucene 组件支持 2 选项,这些选项如下。

名称描述默认类型

config (advanced)

使用共享的 lucene 配置

 

LuceneConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Lucene 端点使用 URI 语法配置:

lucene:host:operation

使用以下路径和查询参数:

215.2.1. 路径名(2 参数):

名称描述默认类型

主机

所需的 lucene 服务器的 URL

 

字符串

operation

需要 Operation 来执行此操作,如插入或查询。

 

LuceneOperation

215.2.2. 查询参数(5 参数):

名称描述默认类型

analyzer (producer)

Analyzer 构建 TokenStreams,用于分析文本。因此,它代表了从文本中提取索引术语的策略。分析器的值可以是扩展抽象类 org.apache.lucene.analysis.Analyzer 的任何类。Lucene 还提供一系列丰富的分析程序

 

Analyzer

indexDir (producer)

在分析指定分析文档时创建索引文件的文件系统目录

 

File

maxHits (producer)

限制搜索操作结果集的整数值

 

int

srcDir (producer)

包含要在生产者启动时用于分析和添加到索引中的可选目录。

 

File

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

215.3. Spring Boot Auto-Configuration

组件支持 11 个选项,它们如下所列。

名称描述默认类型

camel.component.lucene.config.analyzer

Analyzer 构建 TokenStreams,用于分析文本。因此,它代表了从文本中提取索引术语的策略。分析器的值可以是扩展抽象类 org.apache.lucene.analysis.Analyzer 的任何类。Lucene 还提供一系列丰富的分析程序

 

Analyzer

camel.component.lucene.config.authority

  

字符串

camel.component.lucene.config.host

lucene 服务器的 URL

 

字符串

camel.component.lucene.config.index-directory

在分析指定分析文档时创建索引文件的文件系统目录

 

File

camel.component.lucene.config.lucene-version

  

版本

camel.component.lucene.config.max-hits

限制搜索操作结果集的整数值

 

整数

camel.component.lucene.config.operation

诸如插入或查询等操作。

 

LuceneOperation

camel.component.lucene.config.source-directory

包含要在生产者启动时用于分析和添加到索引中的可选目录。

 

File

camel.component.lucene.config.uri

  

URI

camel.component.lucene.enabled

启用 lucene 组件

true

布尔值

camel.component.lucene.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

215.4. 从缓存发送/查看消息

215.4.1. 消息标头

标头描述

查询

在索引上执行的 Lucene Query。查询可能包含通配符和短语

RETURN_LUCENE_DOCS

Camel 2.15: 将此标头设置为 true,以便在返回点击信息时包括实际的 Lucene 文档。

215.4.2. Lucene Producers

此组件支持 2 producer 端点。

insert - 插入制作者通过分析传入交换中的正文并将其与令牌("内容")关联的正文来构建可搜索索引。query - 查询制作者对预先创建的索引执行搜索。查询使用可搜索的索引来执行基于搜索的搜索分数和相关性。查询通过传入交换发送,包含名为"QUERY"的标头属性名称。标头属性"QUERY"的值是 Lucene Query。如何创建 Lucene Queries 的更多详细信息

215.4.3. Lucene Processor

有名为 LuceneQueryProcessor 的处理器可用于对lucene 执行查询,无需创建制作者。

215.5. Lucene 用法示例

215.5.1. 示例 1:创建 Lucene 索引

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
       from("direct:start").
           to("lucene:whitespaceQuotesIndex:insert?
               analyzer=#whitespaceAnalyzer&indexDir=#whitespace&srcDir=#load_dir").
           to("mock:result");
    }
};

215.5.2. 示例 2:在 Camel 上下文中加载属性到 JNDI 注册表中

@Override
protected JndiRegistry createRegistry() throws Exception {
  JndiRegistry registry =
         new JndiRegistry(createJndiContext());
  registry.bind("whitespace", new File("./whitespaceIndexDir"));
  registry.bind("load_dir",
        new File("src/test/resources/sources"));
  registry.bind("whitespaceAnalyzer",
        new WhitespaceAnalyzer());
  return registry;
}
...
CamelContext context = new DefaultCamelContext(createRegistry());

215.5.3. 示例 2:使用 Query Producer 执行搜索

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
       from("direct:start").
          setHeader("QUERY", constant("Seinfeld")).
          to("lucene:searchIndex:query?
             analyzer=#whitespaceAnalyzer&indexDir=#whitespace&maxHits=20").
          to("direct:next");

       from("direct:next").process(new Processor() {
          public void process(Exchange exchange) throws Exception {
             Hits hits = exchange.getIn().getBody(Hits.class);
             printResults(hits);
          }

          private void printResults(Hits hits) {
              LOG.debug("Number of hits: " + hits.getNumberOfHits());
              for (int i = 0; i < hits.getNumberOfHits(); i++) {
                 LOG.debug("Hit " + i + " Index Location:" + hits.getHit().get(i).getHitLocation());
                 LOG.debug("Hit " + i + " Score:" + hits.getHit().get(i).getScore());
                 LOG.debug("Hit " + i + " Data:" + hits.getHit().get(i).getData());
              }
           }
       }).to("mock:searchResult");
   }
};

215.5.4. 示例 3:使用 Query Processor 执行搜索

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        try {
            from("direct:start").
                setHeader("QUERY", constant("Rodney Dangerfield")).
                process(new LuceneQueryProcessor("target/stdindexDir", analyzer, null, 20)).
                to("direct:next");
        } catch (Exception e) {
            e.printStackTrace();
        }

        from("direct:next").process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                Hits hits = exchange.getIn().getBody(Hits.class);
                printResults(hits);
            }

            private void printResults(Hits hits) {
                LOG.debug("Number of hits: " + hits.getNumberOfHits());
                for (int i = 0; i < hits.getNumberOfHits(); i++) {
                    LOG.debug("Hit " + i + " Index Location:" + hits.getHit().get(i).getHitLocation());
                    LOG.debug("Hit " + i + " Score:" + hits.getHit().get(i).getScore());
                    LOG.debug("Hit " + i + " Data:" + hits.getHit().get(i).getData());
                }
            }
       }).to("mock:searchResult");
   }
};

第 216 章 Lumberjack 组件

作为 Camel 2.18 版提供

Lumberjack 组件使用 Lumberjack 协议从 Filebeat 获取通过网络发送的日志。网络通信可以通过 SSL 进行保护。

此组件仅支持使用者端点。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-lumberjack</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

216.1. URI 格式

lumberjack:host
lumberjack:host:port

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

216.2. 选项

Lumberjack 组件支持 3 个选项,它们如下所列。

名称描述默认类型

sslContextParameters (security)

设置用于所有端点的默认 SSL 配置。您也可以直接在端点级别进行配置。

 

SSLContextParameters

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Lumberjack 端点使用 URI 语法进行配置:

lumberjack:host:port

使用以下路径和查询参数:

216.2.1. 路径名(2 参数):

名称描述默认类型

主机

侦听 Lumberjack 所需的网络接口

 

字符串

port

侦听 Lumberjack 的网络端口

5044

int

216.2.2. 查询参数(5 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sslContextParameters (consumer)

SSL 配置

 

SSLContextParameters

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

216.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.lumberjack.enabled

启用 lumberjack 组件

true

布尔值

camel.component.lumberjack.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.lumberjack.ssl-context-parameters

设置用于所有端点的默认 SSL 配置。您也可以直接在端点级别进行配置。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.lumberjack.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

216.4. 结果

结果正文是一个 Map<String、Object> 对象。

216.5. Lumberjack 使用 Samples

216.5.1. 示例 1:流传输日志消息

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
       from("lumberjack:0.0.0.0").                  // Listen on all network interfaces using the default port
           setBody(simple("${body[message]}")).     // Select only the log message
           to("stream:out");                        // Write it into the output stream
    }
};

第 217 章 LZF Deflate Compression DataFormat

作为 Camel 2.17 版提供

LZF 数据格式 是消息压缩和解压缩格式。它使用 LZF 防御算法。 在端点使用 LZF 解压缩消息之前,可以使用 LZF 解压缩消息通过 LZF 解压缩。当您处理大型 XML 和基于文本的载荷时,或者当您使用 LZF algotithm 读取消息时,压缩功能非常有用。

217.1. 选项

LZF 取消压缩数据格式支持 2 个选项,它们列于下方所列。

名称默认Java 类型描述

usingParallelCompression

false

布尔值

使用多个处理内核启用编码(压缩)

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

217.2. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.lzf.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.lzf.enabled

启用 lzf 数据格式

true

布尔值

camel.dataformat.lzf.using-parallel-compression

使用多个处理内核启用编码(压缩)

false

布尔值

ND

217.3. marshal

在本例中,我们为压缩有效负载提供一个常规文本/XML 有效负载,使用 LZF 压缩格式并将其发送名为 MY_QUEUE 的 ActiveMQ 队列。

from("direct:start").marshal().lzf().to("activemq:queue:MY_QUEUE");

217.4. unmarshal

在本例中,我们从名为 MY_QUEUE 的 ActiveMQ 队列提供了 LZF 有效负载,并将其转发到 UnGZippedMessageProcessor

from("activemq:queue:MY_QUEUE").unmarshal().lzf().process(new UnCompressedMessageProcessor());

217.5. 依赖项

要在 camel 路由中使用LZF 压缩,您需要添加实现此数据格式的 camel-lzf 依赖项。

如果您使用 Maven,您只需在 pom.xml 中添加以下内容,替换最新和最大版本的版本号(请参阅 最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-lzf</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

第 218 章 邮件组件

作为 Camel 版本 1.0 可用

邮件组件通过 Spring 的邮件支持和底层 JavaMail 系统提供对电子邮件的访问。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mail</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
警告

geronimo mail .jar

我们发现 geronimo mail .jar (v1.6)具有在使用附件轮询邮件时的错误。它无法正确识别 Content-Type。因此,如果您将 .jpeg 文件附加到邮件并轮询该文件,则 Content-Type 会被解析为 text/plain,而不是 image/jpeg。因此,我们添加了一个 org.apache.camel.component.ContentTypeResolver SPI 接口,允许您根据文件名返回正确的 Mime 类型来修复此程序错误。因此,如果文件名以 jpeg/jpg 结尾,您可以返回 image/jpeg

您可以在 MailComponent 实例或 MailEndpoint 实例上设置自定义解析器。

提示

POP3 或 IMAP POP3 有一些限制,如果可能,建议使用 IMAP。

INFO: 使用模拟电子邮件进行测试,您可以使用模拟框架进行单元测试,无需实际邮件服务器。但是,当您进入生产环境或其他需要向其发送邮件到真实邮件服务器时,您应该记得不要包含模拟电子邮件。仅存在 classpath 上的模拟-javamail.jar 意味着它将启动并避免发送邮件。

218.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]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

218.2. 

邮件组件支持 4 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

设置邮件配置

 

MailConfiguration

contentTypeResolver (advanced)

用于为文件附加确定 Content-Type 的解析器。

 

ContentTypeResolver

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

218.3. 

邮件端点使用 URI 语法进行配置:

imap:host:port

使用以下路径和查询参数:

218.3.1. 路径名(2 参数):

名称描述默认类型

主机

所需的 邮件服务器主机名

 

字符串

port

邮件服务器的端口号

 

int

218.3.2. 查询参数(62 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

closeFolder (consumer)

轮询后,消费者是否应该关闭文件夹。将此选项设置为 false,并且具有 disconnect=false,然后消费者保持在轮询之间保持文件夹打开。

true

布尔值

copyTo (consumer)

处理邮件消息后,可以使用指定名称将其复制到邮件文件夹。您可以覆盖此配置值,使用带有键 copyTo 的标头,允许您将消息复制到运行时配置的文件夹名称。

 

字符串

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

布尔值

peek (consumer)

将 javax.mail.Message 标记为 peeked,然后处理邮件。这只适用于 IMAPMessage 消息类型。如果使用 peek 邮件,邮件将不会在邮件服务器上标记为 SEEN,如果 Camel 中存在错误处理,则让我们可以回滚邮件消息。

true

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

skipFailedMessage (consumer)

如果邮件使用者无法检索给定邮件邮件,则此选项允许跳过消息并继续检索下一个邮件。默认行为是消费者引发异常,来自批处理的任何邮件都无法通过 Camel 进行路由。

false

布尔值

unseen (消费者)

是否只通过未识别邮件来限制。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

fetchSize (consumer)

设置轮询过程中要消耗的最大消息数。如果邮箱文件夹包含大量邮件,这可用于避免过载邮件服务器。默认值 -1 表示没有获取大小,所有消息都将被消耗。将值设为 0 是一个特殊的基点,Camel 根本不消耗任何消息。

-1

int

folderName (consumer)

要轮询的文件夹。

INBOX

字符串

mailUidGenerator (consumer)

可插拔 mailUidGenerator,允许使用自定义逻辑来生成邮件的 UUID。

 

MailUidGenerator

mapMailMessage (consumer)

指定 Camel 是否应将接收的邮件信息映射到 Camel body/headers。如果设置为 true,邮件正文将映射到 Camel IN 消息的正文,邮件标题映射到 IN 标头。如果此选项设为 false,则 IN 消息包含 raw javax.mail.Message。You can retrieve this raw message by calling exchange.getIn().getBody(javax.mail.Message.class).

true

布尔值

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

postProcessAction (consumer)

在正常处理结束后,指的是 mailBoxPostProcessAction 在邮箱中处理后任务。

 

MailBoxPostProcess Action

bcc (producer)

设置 BCC 电子邮件地址。使用逗号分隔多个电子邮件地址。

 

字符串

cc (producer)

设置 CC 电子邮件地址。使用逗号分隔多个电子邮件地址。

 

字符串

from (producer)

来自电子邮件地址

camel@localhost

字符串

replyTo (producer)

Reply-To 接收者(响应邮件的接收器)。使用逗号分隔多个电子邮件地址。

 

字符串

subject (producer)

发送的消息的主题。注意:在标头中设置主题优先于这个选项。

 

字符串

to (producer)

设置 To 电子邮件地址。使用逗号分隔多个电子邮件地址。

 

字符串

javaMailSender (producer)

使用自定义 org.apache.camel.component.mail.JavaMailSender 来发送电子邮件。

 

JavaMailSender

additionalJavaMail Properties (高级)

设置其他 java 邮件属性,它将根据所有其他选项附加/覆盖任何默认设置。如果您需要添加一些特殊选项,但希望让其他内容保留原样,这很有用。

 

Properties

alternativeBodyHeader (advanced)

指定包含替代电子邮件正文的 IN 消息标题的键。例如:如果您以文本/html 格式发送电子邮件,并且想要为非 HTML 电子邮件客户端提供替代邮件正文,请将此密钥的备选邮件正文设置为标题。

CamelMailAlternativeBody

字符串

attachmentsContentTransfer EncodingResolver (advanced)

要使用自定义附件ContentTransferEncodingResolver 来解析要用于附件的内容类型代码。

 

AttachmentsContent TransferEncoding Resolver

binding (advanced)

设置用于从 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

布尔值

会话 (高级)

指定 camel 应该用于所有邮件交互的邮件会话。在由某些其他资源创建和管理邮件会话时(如 JavaEE 容器)的情景中非常有用。如果没有指定,Camel 会自动为您创建邮件会话。

 

session

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

useInlineAttachments (advanced)

是否使用对内联还是附加。

false

布尔值

idempotentRepository (filter)

可插入的存储库 org.apache.camel.spi.IdempotentRepository,它允许从同一邮箱消耗集群,并让存储库协调邮件是否对消费者而言有效。默认情况下,不使用任何存储库。

 

IdempotentRepository

idempotentRepositoryRemove OnCommit (filter)

使用幂等存储库时,当邮件消息被成功处理并提交后,则应将消息 ID 从幂等存储库(默认)中删除,或保留在存储库中。默认情况下,它假定消息 id 是唯一的,并且没有要保留在存储库中的值,因为邮件消息将被标记为 seen/moved 或 delete,以防止它被再次消耗。因此,使消息 id 存储在幂等存储库中的值较小。但是,这个选项允许存储消息 id,因为您可能具有的任何原因。

true

布尔值

searchTerm (filter)

引用 javax.mail.search.SearchTerm,它可根据搜索条件(如主题、正文等)过滤邮件。

 

SearchTerm

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。

60000

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

sortTerm (sort)

消息排序顺序。仅支持 IMAP 的原生支持。使用 POP3 或 IMAP 服务器没有 SORT 功能时可模拟到某种程度。

 

字符串

dummyTrustManager (security)

使用 dummy 安全设置信任所有证书。应该只用于开发模式,而不应该用于生产环境。

false

布尔值

密码 (安全)

登录的密码

 

字符串

sslContextParameters (security)

使用 SSLContextParameters 配置安全性。

 

SSLContextParameters

username (security)

登录的用户名

 

字符串

218.4. Spring Boot Auto-Configuration

组件支持 48 个选项,它们如下所列。

名称描述默认类型

camel.component.mail.configuration.additional-java-mail-properties

设置其他 java 邮件属性,它将根据所有其他选项附加/覆盖任何默认设置。如果您需要添加一些特殊选项,但希望让其他内容保留原样,这很有用。

 

Properties

camel.component.mail.configuration.alternative-body-header

指定包含替代电子邮件正文的 IN 消息标题的键。例如:如果您以文本/html 格式发送电子邮件,并且想要为非 HTML 电子邮件客户端提供替代邮件正文,请将此密钥的备选邮件正文设置为标题。

CamelMailAlternativeBody

字符串

camel.component.mail.configuration.attachments-content-transfer-encoding-resolver

要使用自定义附件ContentTransferEncodingResolver 来解析要用于附件的内容类型代码。

 

AttachmentsContent TransferEncoding Resolver

camel.component.mail.configuration.bcc

设置 BCC 电子邮件地址。使用逗号分隔多个电子邮件地址。

 

字符串

camel.component.mail.configuration.cc

设置 CC 电子邮件地址。使用逗号分隔多个电子邮件地址。

 

字符串

camel.component.mail.configuration.close-folder

轮询后,消费者是否应该关闭文件夹。将此选项设置为 false,并且具有 disconnect=false,然后消费者保持在轮询之间保持文件夹打开。

true

布尔值

camel.component.mail.configuration.connection-timeout

连接超时(以毫秒为单位)。

30000

整数

camel.component.mail.configuration.content-type

邮件消息内容类型。将 text/html 用于 HTML 邮件。

text/plain

字符串

camel.component.mail.configuration.copy-to

处理邮件消息后,可以使用指定名称将其复制到邮件文件夹。您可以覆盖此配置值,使用带有键 copyTo 的标头,允许您将消息复制到运行时配置的文件夹名称。

 

字符串

camel.component.mail.configuration.debug-mode

在底层邮件框架上启用调试模式。默认情况下,SUN 邮件框架将调试消息记录到 system.out。

false

布尔值

camel.component.mail.configuration.delete

在消息被处理后删除它们。这可以通过在邮件消息上设置 DELETED 标志来完成。如果为 false,则设置 SEEN 标志。自 Camel 2.10 起,您可以通过设置键 delete 的标头来决定是否应删除邮件是否应该删除。

false

布尔值

camel.component.mail.configuration.disconnect

轮询后使用者是否应该断开连接。如果启用它,它会强制 Camel 在每次轮询时连接。

false

布尔值

camel.component.mail.configuration.dummy-trust-manager

使用 dummy 安全设置信任所有证书。应该只用于开发模式,而不应该用于生产环境。

false

布尔值

camel.component.mail.configuration.fetch-size

设置轮询过程中要消耗的最大消息数。如果邮箱文件夹包含大量邮件,这可用于避免过载邮件服务器。默认值 -1 表示没有获取大小,所有消息都将被消耗。将值设为 0 是一个特殊的基点,Camel 根本不消耗任何消息。

-1

整数

camel.component.mail.configuration.folder-name

要轮询的文件夹。

INBOX

字符串

camel.component.mail.configuration.from

来自电子邮件地址

camel@localhost

字符串

camel.component.mail.configuration.handle-failed-message

如果邮件使用者无法检索给定邮件邮件,则此选项允许处理由消费者的错误处理程序导致异常。通过在消费者上启用网桥错误处理程序,Camel 路由错误处理程序可以改为处理异常。默认行为是消费者引发异常,来自批处理的任何邮件都无法通过 Camel 进行路由。

false

布尔值

camel.component.mail.configuration.host

邮件服务器主机名

 

字符串

camel.component.mail.configuration.ignore-unsupported-charset

让 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset 选项。如果不支持 charset,则 charset=XXX(其中 XXX 代表不受支持的 charset)已从 content-type 中删除,它依赖于平台默认值。

false

布尔值

camel.component.mail.configuration.ignore-uri-scheme

让 Camel 在发送邮件时忽略本地 JVM 中不支持的 charset 选项。如果不支持 charset,则 charset=XXX(其中 XXX 代表不受支持的 charset)已从 content-type 中删除,它依赖于平台默认值。

false

布尔值

camel.component.mail.configuration.java-mail-properties

设置 java 邮件选项。将清除任何默认属性,并且仅使用为此方法提供的属性。

 

Properties

camel.component.mail.configuration.java-mail-sender

使用自定义 org.apache.camel.component.mail.JavaMailSender 来发送电子邮件。

 

JavaMailSender

camel.component.mail.configuration.map-mail-message

指定 Camel 是否应将接收的邮件信息映射到 Camel body/headers。如果设置为 true,邮件正文将映射到 Camel IN 消息的正文,邮件标题映射到 IN 标头。如果此选项设为 false,则 IN 消息包含 raw javax.mail.Message。You can retrieve this raw message by calling exchange.getIn().getBody(javax.mail.Message.class).

true

布尔值

camel.component.mail.configuration.mime-decode-headers

此选项为邮件标头启用透明 MIME 解码和取消折叠数据。

false

布尔值

camel.component.mail.configuration.password

登录的密码

 

字符串

camel.component.mail.configuration.peek

将 javax.mail.Message 标记为 peeked,然后处理邮件。这只适用于 IMAPMessage 消息类型。如果使用 peek 邮件,邮件将不会在邮件服务器上标记为 SEEN,如果 Camel 中存在错误处理,则让我们可以回滚邮件消息。

true

布尔值

camel.component.mail.configuration.port

邮件服务器的端口号

 

整数

camel.component.mail.configuration.protocol

与邮件服务器通信的协议

 

字符串

camel.component.mail.configuration.reply-to

Reply-To 接收者(响应邮件的接收器)。使用逗号分隔多个电子邮件地址。

 

字符串

camel.component.mail.configuration.session

指定 camel 应该用于所有邮件交互的邮件会话。在由某些其他资源创建和管理邮件会话时(如 JavaEE 容器)的情景中非常有用。如果没有指定,Camel 会自动为您创建邮件会话。

 

session

camel.component.mail.configuration.skip-failed-message

如果邮件使用者无法检索给定邮件邮件,则此选项允许跳过消息并继续检索下一个邮件。默认行为是消费者引发异常,来自批处理的任何邮件都无法通过 Camel 进行路由。

false

布尔值

camel.component.mail.configuration.ssl-context-parameters

使用 SSLContextParameters 配置安全性。

 

SSLContextParameters

camel.component.mail.configuration.subject

发送的消息的主题。注意:在标头中设置主题优先于这个选项。

 

字符串

camel.component.mail.configuration.to

设置 To 电子邮件地址。使用逗号分隔多个电子邮件地址。

 

字符串

camel.component.mail.configuration.unseen

是否只通过未识别邮件来限制。

true

布尔值

camel.component.mail.configuration.use-inline-attachments

是否使用对内联还是附加。

false

布尔值

camel.component.mail.configuration.username

登录的用户名

 

字符串

camel.component.mail.content-type-resolver

用于为文件附加确定 Content-Type 的解析器。选项是 org.apache.camel.component.mail.ContentTypeResolver 类型。

 

字符串

camel.component.mail.enabled

启用邮件组件

true

布尔值

camel.component.mail.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.mail.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

camel.dataformat.mime-multipart.binary-content

定义 MIME 多部分二进制部分的内容是否为二进制(true)还是 Base-64 编码(false)默认是否为 false。

false

布尔值

camel.dataformat.mime-multipart.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.mime-multipart.enabled

启用 mime-multipart dataformat

true

布尔值

camel.dataformat.mime-multipart.headers-inline

定义 MIME-Multipart 标头是邮件正文的一部分(true)还是设置为 Camel 标头(false)。默认为 false。

false

布尔值

camel.dataformat.mime-multipart.include-headers

定义哪些 Camel 标头也作为 MIME 多部件包含的正则表达式。只有将 headerInline 设置为 true 时才可以正常工作。默认为不包含任何标头

 

字符串

camel.dataformat.mime-multipart.multipart-sub-type

指定 MIME 多部件的子类型。默认为混合使用。

mixed

字符串

camel.dataformat.mime-multipart.multipart-without-attachment

定义没有附加的消息是否也被放入 MIME 多部件(仅含有一个正文部分)。默认为 false。

false

布尔值

218.4.1. 端点示例

通常,您可以按照如下所示指定一个带有登录凭证的 URI(作为示例进行 SMTP):

smtp://[username@]host[:port][?password=somepwd]

或者,也可以将用户名和密码指定为查询选项:

smtp://host[:port]?password=somepwd&username=someuser

例如:

smtp://mycompany.mailserver:30?password=tiger&username=scott

218.5. 组件

  • IMAP
  • IMAPS
  • POP3s
  • POP3s
  • SMTP
  • SMTPs

218.5.1. 默认端口

支持默认端口号。如果省略端口号,Camel 将根据协议确定要使用的端口号。

协议默认端口号

SMTP

25

SMTPS

465

POP3

110

POP3S

995

IMAP

143

IMAPS

993

218.6. SSL 支持

底层邮件框架负责提供 SSL 支持。 您可以通过完全指定所需的 Java 邮件 API 配置选项来配置 SSL/TLS 支持,或者您可以通过组件或端点配置来提供配置的 SSLContextParameters。

218.6.1. 使用 JSSE 配置实用程序

Camel 2.10 开始,邮件组件通过 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(...)
&nbsp; &nbsp; .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"/>...

218.6.2. 直接配置 JavaMail

Camel 使用 SUN JavaMail,其仅信任由众所周知的证书颁发机构(默认 JVM 信任配置)发布的证书。如果您发布自己的证书,您必须将 CA 证书导入到 JVM 的 Java 信任/密钥存储文件中,覆盖默认的 JVM 信任/密钥存储文件(请参阅 JavaMail 中的 SSLNOTES.txt 详情)。

218.7. 邮件消息内容

Camel 使用消息交换的 IN 正文作为 MimeMessage 文本内容。正文转换为 String.class

Camel 将所有交换的 IN 标头复制到 MimeMessage 标头。

可以使用 IN 消息上的标头属性来配置 MimeMessage 的主题。以下代码演示了以下代码:

同样的信息适用于其他 MimeMessage 标头,如接收者,因此您可以使用一个标头属性作为 To

因为 Camel 2.11 当使用 mailProducer 将邮件发送到 server 时,您应该能够从 Camel 邮件标头中获取 MimeMessage 的消息 ID,其键为 CamelMailMessageId

218.8. 标头优先于预先配置的接收者

在邮件标头中指定的接收者始终优先于在端点 URI 中预先配置的接收者。其理念是,如果您在消息标头中提供任何接收者,即您得到的。端点 URI 中预先配置的接收者被视为回退。

在以下示例中,电子邮件信息会发送到 davsclaus@apache.org,因为它优先于预先配置的接收者 info@mycompany.com。端点 URI 中的任何 CCBCC 设置也会被忽略,这些接收者不会接收任何邮件。标头和预先配置的设置之间的选择不是:邮件组件只能从标头获取收件人,也可以只从预先配置的设置中独占。无法混合和匹配标头和预先配置的设置。

        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);

218.9. 多个接收者以便更轻松地配置

可以使用逗号分隔或分号分隔列表来设置多个接收者。这同时适用于标头设置,并使用端点 URI 中的设置。例如:

        Map<String, Object> headers = new HashMap<String, Object>();
        headers.put("to", "davsclaus@apache.org ; jstrachan@apache.org ; ningjiang@apache.org");

前面的示例使用分号 ; 作为分隔符。

218.10. 设置发件人名称和电子邮件

您可以使用格式( 名称 <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");

218.11. javamail API(ex SUN JavaMail)

javamail API 用于消耗和生成邮件
在使用 POP3 或 IMAP 协议时,鼓励最终用户参考这些引用。请注意,POP3 比 IMAP 具有很多有限的功能。

218.12. Samples

我们从一个简单的路由开始,该路由发送从 JMS 队列接收的消息作为电子邮件。电子邮件帐户是 mymailserver.com 上的 admin 帐户。

from("jms://queue:subscription").to("smtp://admin@mymailserver.com?password=secret");

在下一个示例中,我们每分钟轮询一次新电子邮件的邮箱。请注意,我们使用特殊 使用者 选项设置轮询间隔为 consumer.delay,即 60000 毫秒 = 60 秒。

from("imap://admin@mymailserver.com
     password=secret&unseen=true&consumer.delay=60000")
    .to("seda://mails");

在这个示例中,我们想将邮件发送到多个收件人:

218.13. 使用附加示例发送邮件

警告

附件组件不支持所有 Camel 组件附件 API 基于 Java 激活框架,通常仅由邮件 API 使用。由于很多其他 Camel 组件不支持附加,所以附件可能会在路由间传播时丢失。因此,经验规则是仅在向邮件端点发送消息前添加附件。

邮件组件支持附件。在下面的示例中,我们发送一条包含纯文本消息及徽标文件附加的邮件。

218.14. SSL 示例

在本例中,我们希望定期轮询 Google 邮件进行邮件。要将邮件下载到本地邮件客户端,Google 邮件需要您启用和配置 SSL。这可以通过登录到 Google 邮件帐户并更改您的设置来允许 IMAP 访问来完成。Google 包含了有关如何进行此操作的文档。

from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD"
    + "&delete=false&unseen=true&consumer.delay=60000").to("log:newmail");

前面的路由每分钟轮询 Google 邮件一次新邮件,并将收到的消息记录到 新邮件 日志记录器类别。
启用 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=[...

218.15. 使用附加示例消耗邮件

在该示例中,我们轮询一个邮箱,并将邮件中的所有附件存储为文件。首先,我们将定义一个路由来轮询邮箱。如本示例基于 google 邮件,它使用与 SSL 示例中所示相同的路由:

from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD"
    + "&delete=false&unseen=true&consumer.delay=60000").process(new MyMailProcessor());

我们使用可以从 java 代码处理邮件的处理器,而不是记录以下邮件:

    public void process(Exchange exchange) throws Exception {
        // the API is a bit clunky so we need to loop
        Map<String, DataHandler> attachments = exchange.getIn().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 处理附件。

218.16. 如何使用附加分割邮件

在这个示例中,我们使用可能有多个附件的邮件。我们要做的是在每个单独附件中使用 Splitter EIP 来单独处理附件。例如,如果邮件消息有 5 个附件,则我们希望 Splitter 处理五个邮件,每个消息各自都有一个附件。要做到这一点,我们需要为 Splitter 提供自定义表达式,在其中提供了一个 List<Message>,其中包含带有单个附件的五条消息。

在 Camel 2.10 开始,该代码已于 camel-mail 组件中获取。代码位于类中: org.apache.camel.component.mail.SplitAttachmentsExpression,您可以在 此处找到源代码

在 Camel 路由中,您需要在路由中使用此表达式,如下所示:

如果使用 XML DSL,则需要在 Splitter 中声明方法调用表达式,如下所示

<split>
  <method beanType="org.apache.camel.component.mail.SplitAttachmentsExpression"/>
  <to uri="mock:split"/>
</split>

 

从 Camel 2.16 开始,您还可以将附件拆分为字节[],以作为邮件正文存储。这可以通过创建带有布尔值 true 的表达式来实现

SplitAttachmentsExpression split = SplitAttachmentsExpression(true);

然后,在 splitter eip 中使用表达式。

218.17. 使用自定义搜索终端

可从 Camel 2.11 开始

您可以在 MailEndpoint 上配置 搜索 终端,以便您过滤出不需要的邮件。

例如,要过滤 mails 以在 Subject 或 Text 中包含 Camel,您可以执行以下操作:

<route>
  <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subjectOrBody=Camel"/>
  <to uri="bean:myBean"/>
</route>

请注意,我们使用 "searchTerm.subjectOrBody" 作为参数键,指明我们想要在邮件主题或正文中搜索包含单词 "Camel"。
org.apache.camel.component.mail.SimpleSearchTerm 有多个可以配置的选项:

或在短时间内重新上线 24 小时的新电子邮件。请注意 "now-24h" 语法。详情请查看下表。

<route>
  <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.fromSentDate=now-24h"/>
  <to uri="bean:myBean"/>
</route>

您可以在 endpoint uri 配置中有多个 searchTerm。然后,它们将使用 AND 运算符合并在一起,因此这两个条件都必须匹配。例如,获得最后的未证书电子邮件 24 小时(在邮件主体中带 Camel ),您可以执行以下操作:

<route>
  <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subject=Camel&searchTerm.fromSentDate=now-24h"/>
  <to uri="bean:myBean"/>
</route>

SimpleSearchTerm 旨在从 OVA 中轻松配置,因此您还可以使用 XML 中的 <bean> 风格来配置它

<bean id="mySearchTerm" class="org.apache.camel.component.mail.SimpleSearchTerm">
  <property name="subject" value="Order"/>
  <property name="to" value="acme-order@acme.com"/>
  <property name="fromSentDate" value="now"/>
 </bean>

然后,您可以使用 Camel 路由中的 #beanId 来引用这个 bean,如下所示:

<route>
  <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm=#mySearchTerm"/>
  <to uri="bean:myBean"/>
</route>

在 Java 中,有一个构建器类,可使用 org.apache.camel.component.mail.SearchTermBuilder 类来构建复合搜索终端。这可让您构建复杂的术语,例如:

// 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();

218.18. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 219 章 Master 组件

可作为 Camel 版本 2.20 可用

camel-master: 端点提供了一种方式来确保集群中只有单一使用者消耗给定的端点;如果 JVM 中断,则自动故障转移。

如果您需要与一些传统后端使用,而不需要支持并发消耗的旧后端,或者由于在任何时间点上可以有商业或稳定性的原因,这非常有用。

219.1. 使用 master 端点

仅用 master:someName: 为任何 camel 端点添加前缀,其中 someName 是一个逻辑名称,用于获取 master 锁定。例如。

from("master:cheese:jms:foo").to("activemq:wine");

以上模拟 ActiveMQ 中的 [Exclusive Consumers](http://activemq.apache.org/exclusive-consumer.html)类型功能,但任何第三方 JMS 供应商可能不支持专用消费者。

219.2. URI 格式

master:namespace:endpoint[?options]

其中端点是在 master/slave 模式下运行的任何 Camel 端点。

219.3. 选项

主组件支持 3 个选项,它们如下所列。

名称描述默认类型

service (advanced)

注入要使用的服务。

 

CamelClusterService

serviceSelector (advanced)

注入用于查找 CamelClusterService 要使用的服务选择器。

 

选择器

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Master 端点使用 URI 语法进行配置:

master:namespace:delegateUri

使用以下路径和查询参数:

219.3.1. 路径名(2 参数):

名称描述默认类型

namespace

所需的 集群命名空间的名称

 

字符串

delegateUri

在 master/slave 模式中使用端点 uri

 

字符串

219.3.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

219.4. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.master.enabled

是否启用主组件的自动配置。默认启用。

 

布尔值

camel.component.master.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.master.service

注入要使用的服务。选项是 org.apache.camel.cluster.CamelClusterService 类型。

 

字符串

camel.component.master.service-selector

注入用于查找 CamelClusterService 要使用的服务选择器。选项是 org.apache.camel.cluster.CamelClusterService.Selector 类型。

 

字符串

219.5. 示例

您可以保护集群 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

219.6. 实施

Camel 提供以下 ClusterService 实施:

  • camel-atomix
  • camel-consul
  • camel-file
  • camel-kubernetes
  • camel-zookeeper

219.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 220 章 指标组件

220.1. 指标组件

指标: 组件允许从 Camel 路由直接收集各种指标。支持的指标类型是 计数器、 直方图计量、 计时器量表。 指标 提供测量应用行为的简单方法。可配置的报告后端为收集和视觉化统计启用不同的集成选项。组件还提供一个 MetricsRoutePolicyFactory,它允许使用 Dropwizard Metrics 公开路由统计信息,请参阅页面底部了解详细信息。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-metrics</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

220.2. URI 格式

metrics:[ meter | counter | histogram | timer | gauge ]:metricname[?options]

220.3. 选项

Metrics 组件支持 2 个选项,它们如下所列。

名称描述默认类型

metricRegistry (advanced)

使用配置的自定义 MetricRegistry。

 

MetricRegistry

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Metrics 端点使用 URI 语法配置:

metrics:metricsType:metricsName

使用以下路径和查询参数:

220.3.1. 路径名(2 参数):

名称描述默认类型

metricsType

所需的 指标类型

 

MetricsType

metricsName

指标 所需的 名称

 

字符串

220.3.2. 查询参数(7 参数):

名称描述默认类型

action (producer)

使用计时器类型时的操作

 

MetricsTimerAction

decrement (producer)

使用计数器类型时的减少值

 

Long

increment (producer)

使用计数器类型时递增值

 

Long

mark (producer)

使用计量类型时标记

 

Long

subject (producer)

使用量表类型时的 subject 值

 

对象

value (producer)

使用直方类型时的值

 

Long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

220.4. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.metrics.enabled

启用指标组件

true

布尔值

camel.component.metrics.metric-registry

使用配置的自定义 MetricRegistry。选项是一个 com.codahale.metrics.MetricRegistry 类型。

 

字符串

camel.component.metrics.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

220.5. Metric Registry

Camel Metrics 组件默认使用带有 60 秒报告间隔的 Slf4jReporterMetricRegistry 实例。通过提供一个 MetricRegistry bean,可以将此默认 registry 替换为自定义 registry。如果应用中存在多个 MetricRegistry Bean,则会使用其名称 metricRegistry 的密钥。

例如,使用 Spring Java 配置:

@Configuration
public static class MyConfig extends SingleRouteCamelConfiguration {

    @Bean
    @Override
    public RouteBuilder route() {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                // define Camel routes here
            }
        };
    }

    @Bean(name = MetricsComponent.METRIC_REGISTRY_NAME)
    public MetricRegistry getMetricRegistry() {
        MetricRegistry registry = ...;
        return registry;
    }
}

或者使用 CDI:

class MyBean extends RouteBuilder {

    @Override
    public void configure() {
      from("...")
          // Register the 'my-meter' meter in the MetricRegistry below
          .to("metrics:meter:my-meter");
    }

    @Produces
    // If multiple MetricRegistry beans
    // @Named(MetricsComponent.METRIC_REGISTRY_NAME)
    MetricRegistry registry() {
        MetricRegistry registry = new MetricRegistry();
        // ...
        return registry;
    }
}

220.6. 使用

每个指标都有 type 和 name。支持的类型包括 计数器直方图、 计量计时器量表。指标名称是简单字符串。如果未提供指标类型,则默认使用类型计量。

220.6.1. Headers

可以使用名为 CamelMetricsName 的标头来覆盖 URI 中定义的指标名称。

例如:

from("direct:in")
    .setHeader(MetricsConstants.HEADER_METRIC_NAME, constant("new.name"))
    .to("metrics:counter:name.not.used")
    .to("direct:out");

将更新带有名称 new.name 而不是 name.not.used 计数器。

在 Metrics 端点完成交换处理后,所有指标特定的标头都会从消息中删除。在处理交换指标端点时,使用级别 warn 捕获所有例外和写入日志条目。

220.7. Metrics type counter

metrics:counter:metricname[?options]

220.7.1. 选项

名称default描述

递增 

-

要添加到计数器的长值

decrement

-

从计数器中减减的长值

如果没有定义 递增递减,则计数器值将递增。如果只定义了 递增递减 操作,则只调用递增操作。 

// update counter simple.counter by 7
from("direct:in")
    .to("metric:counter:simple.counter?increment=7")
    .to("direct:out");
// increment counter simple.counter by 1
from("direct:in")
    .to("metric:counter:simple.counter")
    .to("direct:out");
// decrement counter simple.counter by 3
from("direct:in")
    .to("metrics:counter:simple.counter?decrement=3")
    .to("direct:out");

220.7.2. Headers

消息标头可用于覆盖 Metrics 组件 URI 中指定的 递增递减 值。

名称描述预期类型

CamelMetricsCounterIncrement 

覆盖 URI 中的递增值

Long

CamelMetricsCounterDecrement 

覆盖 URI 中的 decrement 值

Long

// update counter simple.counter by 417
from("direct:in")
    .setHeader(MetricsConstants.HEADER_COUNTER_INCREMENT, constant(417L))
    .to("metrics:counter:simple.counter?increment=7")
    .to("direct:out");
// updates counter using simple language to evaluate body.length
from("direct:in")
    .setHeader(MetricsConstants.HEADER_COUNTER_INCREMENT, simple("${body.length}"))
    .to("metrics:counter:body.length")
    .to("mock:out");

220.8. Metric type histogram

metrics:histogram:metricname[?options]

220.8.1. 选项

名称default描述

value

-

在直方图中使用的值

如果没有设置任何 ,则会向直方图添加任何内容,并且会记录警告。

// adds value 9923 to simple.histogram
from("direct:in")
    .to("metric:histogram:simple.histogram?value=9923")
    .to("direct:out");
// nothing is added to simple.histogram; warning is logged
from("direct:in")
    .to("metric:histogram:simple.histogram")
    .to("direct:out");

220.8.2. Headers

message 标头可用于覆盖 Metrics 组件 URI 中指定的值。

名称描述预期类型

CamelMetricsHistogramValue

覆盖 URI 中的 histogram 值

Long

// adds value 992 to simple.histogram
from("direct:in")
    .setHeader(MetricsConstants.HEADER_HISTOGRAM_VALUE, constant(992L))
    .to("metrics:histogram:simple.histogram?value=700")
    .to("direct:out")

220.9. Metric type meter

metrics:meter:metricname[?options]

220.9.1. 选项

名称default描述

mark 

-

用作标记的长值

如果未设置 标记,则在没有参数的情况下调用 meter.mark ()

// marks simple.meter without value
from("direct:in")
    .to("metric:simple.meter")
    .to("direct:out");
// marks simple.meter with value 81
from("direct:in")
    .to("metric:meter:simple.meter?mark=81")
    .to("direct:out");

220.9.2. Headers

message 标头可用于覆盖 Metrics 组件 URI 中指定的 标记 值。

名称描述预期类型

CamelMetricsMeterMark

覆盖 URI 中的标记值

Long

// updates meter simple.meter with value 345
from("direct:in")
    .setHeader(MetricsConstants.HEADER_METER_MARK, constant(345L))
    .to("metrics:meter:simple.meter?mark=123")
    .to("direct:out");

220.10. Metrics 类型计时器

metrics:timer:metricname[?options]

220.10.1. 选项

名称default描述

action

-

启动或停止

如果没有提供 操作 或无效值,则会记录警告而无需任何计时器更新。如果在已在运行计时器或停止操作调用时未运行计时器调用,则不会更新任何更新并记录警告。

// measure time taken by route "calculate"
from("direct:in")
    .to("metrics:timer:simple.timer?action=start")
    .to("direct:calculate")
    .to("metrics:timer:simple.timer?action=stop");

TimerContext 对象作为 Exchange 属性存储在不同的指标组件调用之间。

220.10.2. Headers

Message 标头可用于覆盖 Metrics 组件 URI 中指定的操作值。

名称描述预期类型

CamelMetricsTimerAction

覆盖 URI 中的计时器操作

org.apache.camel.component.metrics.timer.TimerEndpoint.TimerAction

// sets timer action using header
from("direct:in")
    .setHeader(MetricsConstants.HEADER_TIMER_ACTION, TimerAction.start)
    .to("metrics:timer:simple.timer")
    .to("direct:out");

220.11. Metric type gauge

metrics:gauge:metricname[?options]

220.11.1. 选项

名称default描述

subject 

-

量表观察到的任何对象

如果未定义 主题,只需忽略它,即不注册量表。

// update gauge "simple.gauge" by a bean "mySubjectBean"
from("direct:in")
    .to("metrics:gauge:simple.gauge?subject=#mySubjectBean")
    .to("direct:out");

220.11.2. Headers

消息标头可用于覆盖 Metrics 组件 URI 中指定的 主题 值。注:如果指定了 CamelMetricsName 标头,则除了在 URI 中指定的默认量表外,还会注册新的量表。

名称描述预期类型

CamelMetricsGaugeSubject 

覆盖 URI 中的 subject 值

对象

// update gauge simple.gauge by a String literal "myUpdatedSubject"
from("direct:in")
    .setHeader(MetricsConstants.HEADER_GAUGE_SUBJECT, constant("myUpdatedSubject"))
    .to("metrics:counter:simple.gauge?subject=#mySubjectBean")
    .to("direct:out");

220.12. MetricsRoutePolicyFactory

此工厂允许为每个路由添加 RoutePolicy,该路由使用 Dropwizard 指标公开路由利用率统计。此工厂可以在 Java 和 XML 中使用,作为以下示例。 

注意

如果只想检测一些选择的路由,您可以使用 MetricsRoutePolicyFactory 定义 MetricsRoutePolicy。

从 Java 中,您刚刚将工厂添加到 CamelContext 中,如下所示:

context.addRoutePolicyFactory(new MetricsRoutePolicyFactory());

在 XML DSL 中,您将定义 <bean>,如下所示:

  <!-- use camel-metrics route policy to gather metrics for all routes -->
  <bean id="metricsRoutePolicyFactory" class="org.apache.camel.component.metrics.routepolicy.MetricsRoutePolicyFactory"/>

MetricsRoutePolicyFactory 和 MetricsRoutePolicy 支持以下选项:

名称default描述

useJmx

false

是否使用 com.codahale.metrics.JmxReporter 向 JMX 报告精细统计。
请注意,如果在 CamelContext 上启用了 JMX,则会在 JMX 树中的服务类型下列出 MetricsRegistryService mbean。该 mbean 有一个操作来通过 json 输出统计信息。只有在每个统计类型需要精细的 mbeans 时,才需要将 useJmx 设置为 true。

jmxDomain

org.apache.camel.metrics

JMX 域名

prettyPrint

false

是否在以 json 格式输出统计信息时打印情况

metricsRegistry

 

allow 使用共享的 com.codahale.metrics.MetricRegistry。如果没有提供,Camel 将创建此 CamelContext 使用的共享实例。

rateUnit

TimeUnit.SECONDS

指标报告者中用于速率的单位,或者将统计信息转储到 json。

durationUnit

TimeUnit.MILLISECONDS

指标报告程序中的 for 持续时间或者将统计信息转储到 json 时使用的单位。

namePattern

名称.routeId.type

Camel 2.17: 要使用的名称模式。使用点作为分隔符,但您可以修改。值 名称routeIdtype 将替换为实际值。其中 name 是 CamelContext 的名称。routeId 是路由的名称。type 是响应的值。

 

从 Java 代码中,您可以存放来自 org.apache.camel.component.metrics.routepolicy.MetricsRegistry 的 com.codahale.metrics.MetricsRegistryService 的 com.codahale.metrics.MetricRegistry Registry。

MetricRegistryService registryService = context.hasService(MetricsRegistryService.class);
if (registryService != null) {
  MetricsRegistry registry = registryService.getMetricsRegistry();
  ...
}

220.13. MetricsMessageHistoryFactory

可从 Camel 2.17 开始

此工厂允许使用指标在路由消息期间捕获消息历史性能统计数据。它的工作原理是在所有路由中的每个节点使用指标计时器。 此工厂可以在 Java 和 XML 中使用,作为以下示例。 

从 Java 中,您要将工厂设置为 CamelContext ,如下所示:

context.setMessageHistoryFactory(new MetricsMessageHistoryFactory());

在 XML DSL 中,您将定义 <bean>,如下所示:

  <!-- use camel-metrics message history to gather metrics for all messages being routed -->
  <bean id="metricsMessageHistoryFactory" class="org.apache.camel.component.metrics.messagehistory.MetricsMessageHistoryFactory"/>

因工厂支持以下选项:

名称default描述

useJmx

false

是否使用 com.codahale.metrics.JmxReporter 向 JMX 报告精细统计。
请注意,如果在 CamelContext 上启用了 JMX,则会在 JMX 树中的服务类型下列出 MetricsRegistryService mbean。该 mbean 有一个操作来通过 json 输出统计信息。只有在每个统计类型需要精细的 mbeans 时,才需要将 useJmx 设置为 true。

jmxDomain

org.apache.camel.metrics

JMX 域名

prettyPrint

false

是否在以 json 格式输出统计信息时打印情况

metricsRegistry

 

allow 使用共享的 com.codahale.metrics.MetricRegistry。如果没有提供,Camel 将创建此 CamelContext 使用的共享实例。

rateUnit

TimeUnit.SECONDS

指标报告者中用于速率的单位,或者将统计信息转储到 json。

durationUnit

TimeUnit.MILLISECONDS

指标报告程序中的 for 持续时间或者将统计信息转储到 json 时使用的单位。

namePattern

名称.routeId.id.type

要使用的名称模式。使用点作为分隔符,但您可以修改。值 名称routeIdtypeid 和 id 将替换为实际值。其中 name 是 CamelContext 的名称。routeId 是路由的名称。id 模式表示节点 ID。type 是 history 的值。

在运行时,指标可以从 Java API 或 JMX 访问,后者可以将数据作为 json 输出来收集。

从 Java 代码中,您可以从 CamelContext 获取服务,如下所示:

MetricsMessageHistoryService service = context.hasService(MetricsMessageHistoryService.class);
String json = service.dumpStatisticsAsJson();

而 JMX API,MBean 在 type=services 树中注册, 名称为=MetricsMessageHistoryService

220.14. InstrumentedThreadPoolFactory

可从 Camel 2.18 开始

此工厂允许您通过注入一个从 Camel 内部收集信息的 InstrumentedThreadPoolFactory 来收集 Camel 线程池的性能信息。请参阅 使用 Spring 的 CamelContext 高级配置的详情

220.15. 另请参阅

  • camel-example-cdi-metrics 示例说明了 Camel、Metrics 和 CDI 之间的集成。

第 221 章 Micrometer 组件

221.1. Micrometer 组件

Micrometer: 组件允许直接从 Camel 路由中收集各种指标。支持的指标类型是 计数器、 概述 和 计时器。 Micrometer 提供了用于测量应用行为的简单方法。可配置报告后端(通过 Micrometer registry)启用不同的集成选项来收集和视觉化统计。

组件还提供 MicrometerRoutePolicyFactory,允许使用 Micrometer 和 EventNotifier 实施来公开路由统计,用于统计从创建到他们的完成。

Maven 用户需要将以下依赖项添加到其 pom.xml 中,以便该组件:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-micrometer</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

221.2. URI 格式

micrometer:[ counter | summary | timer ]:metricname[?options]

221.3. 选项

Micrometer 组件支持 2 个选项,它们如下所列。

名称描述默认类型

metricsRegistry (advanced)

使用配置的自定义 MetricRegistry。

 

MeterRegistry

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Micrometer 端点使用 URI 语法进行配置:

micrometer:metricsType:metricsName

使用以下路径和查询参数:

221.3.1. 路径名(3 参数):

名称描述默认类型

metricsType

所需的 指标类型

 

类型

metricsName

指标 所需的 名称

 

字符串

tags

指标标签

 

可生成

221.3.2. 查询参数(5 参数):

名称描述默认类型

action (producer)

使用计时器类型时的操作表达式

 

字符串

decrement (producer)

使用计数器类型时的递减值表达式

 

字符串

increment (producer)

使用计数器类型时递增值表达式

 

字符串

value (producer)

使用直方图类型时的值表达式

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

221.4. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.micrometer.enabled

是否启用 micrometer 组件的自动配置。默认启用。

 

布尔值

camel.component.micrometer.metrics-registry

使用配置的自定义 MetricRegistry。选项是一个 io.micrometer.core.instrument.MeterRegistry 类型。

 

字符串

camel.component.micrometer.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

221.5. Meter Registry

默认情况下,Camel Micrometer 组件会创建一个 SimpleMeterRegistry 实例,主要用于测试。您应当通过提供 MeterRegistry bean 来定义专用 registry。Micrometer registry 主要决定要使用的后端监控系统。CompositeMeterRegistry 可用于处理多个监控目标。

例如,使用 Spring Java 配置:

@Configuration
public static class MyConfig extends SingleRouteCamelConfiguration {

    @Bean
    @Override
    public RouteBuilder route() {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                // define Camel routes here
            }
        };
    }

    @Bean(name = MicrometerComponent.METRICS_REGISTRY_NAME)
    public MeterRegistry getMeterRegistry() {
        CompositeMeterRegistry registry = ...;
        registry.add(...);
        // ...
        return registry;
    }
}

或者使用 CDI:

class MyBean extends RouteBuilder {

    @Override
    public void configure() {
      from("...")
          // Register the 'my-meter' meter in the MetricRegistry below
          .to("metrics:meter:my-meter");
    }

    @Produces
    // If multiple MetricRegistry beans
    // @Named(MicrometerComponent.METRIC_REGISTRY_NAME)
    MetricRegistry registry() {
        CompositeMeterRegistry registry = ...;
        registry.add(...);
        // ...
        return registry;
    }
}

221.6. 制作者使用

每个计量都有类型和名称。支持的类型包括 计数器分发概述计时器。如果没有提供类型,则默认使用计数器。

计量名称是一个字符串,作为 简单 表达式评估。除了使用 CamelMetricsName 标头(请参阅以下)外,这还允许根据交换数据选择计量。

可选的 tags URI 参数是一个用逗号分开的字符串,由 key=value 表达式组成。keyvalue 都是也会以 简单 表达式评估的字符串。例如,URI 参数 tags=X=${header.Y} 会将标题 Y 的当前值分配给键 X

221.6.1. Headers

通过填充名为 CamelMetricsName 的标头,可以覆盖 URI 中定义的计量名称。通过填充名为 CamelMetricsTags 的标头,可以增强定义为 URI 参数的计量标签。

例如:

from("direct:in")
    .setHeader(MicrometerConstants.HEADER_METRIC_NAME, constant("new.name"))
    .setHeader(MicrometerConstants.HEADER_METRIC_TAGS, constant(Tags.of("dynamic-key", "dynamic-value")))
    .to("metrics:counter:name.not.used?tags=key=value")
    .to("direct:out");

将更新一个带有名称 new.name 而不是 name.not. used 计数器,该标签 dynamic- key 还带有 值 dynamic- value (值 为 )。

在 Micrometer 端点完成交换处理后,所有指标特定的标头都会从消息中删除。在处理 Micrometer 端点时,使用级别 warn 捕获所有例外和写入日志条目。

221.7. Counter

micrometer:counter:name[?options]

221.7.1. 选项

名称default描述

递增 

-

双值添加到计数器

decrement

-

双值从计数器中减去

如果没有定义 递增递减,则计数器值将递增。如果只定义了 递增递减 操作,则只调用递增操作。

// update counter simple.counter by 7
from("direct:in")
    .to("micrometer:counter:simple.counter?increment=7")
    .to("direct:out");
// increment counter simple.counter by 1
from("direct:in")
    .to("micrometer:counter:simple.counter")
    .to("direct:out");

递增递减 值均以 简单 表达式评估,例如,如果标题 X 包含评估为 3.0 的值,则由 3.0 解除 simple.counter 计数器:

// decrement counter simple.counter by 3
from("direct:in")
    .to("micrometer:counter:simple.counter?decrement=${header.X}")
    .to("direct:out");

221.7.2. Headers

camel-metrics 一样,特定的消息标头可用于覆盖 Micrometer 端点 URI 中指定的 递增 和解除值。

名称描述预期类型

CamelMetricsCounterIncrement 

覆盖 URI 中的递增值

CamelMetricsCounterDecrement 

覆盖 URI 中的 decrement 值

// update counter simple.counter by 417
from("direct:in")
    .setHeader(MicrometerConstants.HEADER_COUNTER_INCREMENT, constant(417.0D))
    .to("micrometer:counter:simple.counter?increment=7")
    .to("direct:out");
// updates counter using simple language to evaluate body.length
from("direct:in")
    .setHeader(MicrometerConstants.HEADER_COUNTER_INCREMENT, simple("${body.length}"))
    .to("micrometer:counter:body.length")
    .to("direct:out");

221.8. Distribution Summary

micrometer:summary:metricname[?options]

221.8.1. 选项

名称default描述

value

-

在直方图中使用的值

如果没有设置 ,则不向直方图添加任何内容,并且会记录警告。

// adds value 9923 to simple.histogram
from("direct:in")
    .to("micrometer:summary:simple.histogram?value=9923")
    .to("direct:out");
// nothing is added to simple.histogram; warning is logged
from("direct:in")
    .to("micrometer:summary:simple.histogram")
    .to("direct:out");

通过 Double 结果评估为 Simple 表达式,例如,如果标题 X 包含评估为 3.0 的值,则该值会使用 simple.histogram 注册:

from("direct:in")
    .to("micrometer:summary:simple.histogram?value=${header.X}")
    .to("direct:out");

221.8.2. Headers

camel-metrics 一样,可以使用特定的消息标头来覆盖 Micrometer 端点 URI 中指定的值。

名称描述预期类型

CamelMetricsHistogramValue

覆盖 URI 中的 histogram 值

Long

// adds value 992.0 to simple.histogram
from("direct:in")
    .setHeader(MicrometerConstants.HEADER_HISTOGRAM_VALUE, constant(992.0D))
    .to("micrometer:summary:simple.histogram?value=700")
    .to("direct:out")

221.9. Timer

micrometer:timer:metricname[?options]

221.9.1. 选项

名称default描述

action

-

启动或停止

如果没有提供 操作 或无效值,则会记录警告而无需任何计时器更新。如果在已在运行的计时器上调用操作 启动,或者在未知计时器上调用 停止,则不会更新任何内容并记录警告。

// measure time spent in route "direct:calculate"
from("direct:in")
    .to("micrometer:timer:simple.timer?action=start")
    .to("direct:calculate")
    .to("micrometer:timer:simple.timer?action=stop");

timer.Sample 对象作为 Exchange 属性存储在不同的 Metrics 组件调用之间。

操作 被评估为 简单 表达式返回类型为 MicrometerTimerAction 的结果。

221.9.2. Headers

camel-metrics 一样,可以使用特定的消息标头来覆盖 Micrometer 端点 URI 中指定的操作值。

名称描述预期类型

CamelMetricsTimerAction

覆盖 URI 中的计时器操作

org.apache.camel.component.micrometer.MicrometerTimerAction

// sets timer action using header
from("direct:in")
    .setHeader(MicrometerConstants.HEADER_TIMER_ACTION, MicrometerTimerAction.start)
    .to("micrometer:timer:simple.timer")
    .to("direct:out");

221.10. MicrometerRoutePolicyFactory

此工厂允许为每个路由添加 RoutePolicy,以便使用 Micrometer 来公开路由利用率统计。此工厂可以在 Java 和 XML 中使用,作为以下示例。 

注意

如果只想检测一些选择的路由,可以不必使用 MicrometerRoutePolicy Factory 来定义一个专用的 MicrometerRoutePolicy。

从 Java 中,您刚刚将工厂添加到 CamelContext 中,如下所示:

context.addRoutePolicyFactory(new MicrometerRoutePolicyFactory());

在 XML DSL 中,您将定义 <bean>,如下所示:

  <!-- use camel-micrometer route policy to gather metrics for all routes -->
  <bean id="metricsRoutePolicyFactory" class="org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory"/>

MicrometerRoutePolicyFactory 和 MicrometerRoutePolicy 支持以下选项:

名称default描述

prettyPrint

false

是否在以 json 格式输出统计信息时打印情况

meterRegistry

 

允许使用共享的 MeterRegistry。如果没有提供,Camel 将创建此 CamelContext 使用的共享实例。

durationUnit

TimeUnit.MILLISECONDS

在将统计数据作为 json 转储时,使用 期间要使用的单位。

如果在 CamelContext 中启用了 JMX,则 MBean 会在 type=services 树中注册, 名称为=MicrometerRoutePolicy

221.11. MicrometerMessageHistoryFactory

此工厂允许使用指标在路由消息期间捕获消息历史性能统计数据。它的工作原理是在所有路由中的每个节点使用 Micrometer Timer。 此工厂可以在 Java 和 XML 中使用,作为以下示例。 

从 Java 中,您要将工厂设置为 CamelContext ,如下所示:

context.setMessageHistoryFactory(new MicrometerMessageHistoryFactory());

在 XML DSL 中,您将定义 <bean>,如下所示:

  <!-- use camel-micrometer message history to gather metrics for all messages being routed -->
  <bean id="metricsMessageHistoryFactory" class="org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory"/>

因工厂支持以下选项:

名称default描述

prettyPrint

false

是否在以 json 格式输出统计信息时打印情况

meterRegistry

 

允许使用共享的 MeterRegistry。如果没有提供,Camel 将创建此 CamelContext 使用的共享实例。

durationUnit

TimeUnit.MILLISECONDS

将统计作为 json 转储时,使用的单位是持续时间。

在运行时,指标可以从 Java API 或 JMX 访问,后者可以将数据作为 json 输出来收集。

在 Java 代码中,您可以从 CamelContext 获取服务,如下所示:

MicrometerMessageHistoryService service = context.hasService(MicrometerMessageHistoryService.class);
String json = service.dumpStatisticsAsJson();

如果在 CamelContext 中启用了 JMX,则 MBean 会在 type=services 树中注册, 名称为=MicrometerMessageHistory

221.12. MicrometerEventNotifiers

有一个 MicrometerRouteEventNotifier (计算并运行路由)和一个 MicrometerExchangeEventNotifier (模拟交换从其创建到其完成)。

EventNotifier 可以添加到 CamelContext 中,例如:

camelContext.getManagementStrategy().addEventNotifier(new MicrometerExchangeEventNotifier())

在运行时,指标可以从 Java API 或 JMX 访问,后者可以将数据作为 json 输出来收集。

从 Java 代码中,您可以从 CamelContext 获取服务,如下所示:

MicrometerEventNotifierService service = context.hasService(MicrometerEventNotifierService.class);
String json = service.dumpStatisticsAsJson();

如果在 CamelContext 中启用了 JMX,则 MBean 会在 type=services 树中注册, 名称为=MicrometerEventNotifier

221.13. InstrumentedThreadPoolFactory

此工厂允许您通过注入一个从 Camel 内部收集信息的 InstrumentedThreadPoolFactory 来收集 Camel 线程池的性能信息。有关使用 Spring,请参阅 CamelContext 高级配置的详情。

221.14. 在 JMX 中公开 Micrometer 统计信息

Micrometer 使用 MeterRegistry 实现发布统计信息。虽然在生产环境中,建议您选择专用后端,如 Prometheus 或 Graphite,但可能足以用于测试或本地部署以将统计信息发布到 JMX。

要达到此目的,请添加以下依赖项:

    <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-registry-jmx</artifactId>
      <version>${micrometer-version}</version>
    </dependency>

并添加 JmxMeterRegistry 实例:

    @Bean(name = MicrometerComponent.METRICS_REGISTRY_NAME)
    public MeterRegistry getMeterRegistry() {
        CompositeMeterRegistry meterRegistry = new CompositeMeterRegistry();
        meterRegistry.add(...);
        meterRegistry.add(new JmxMeterRegistry(
           CamelJmxConfig.DEFAULT,
           Clock.SYSTEM,
           HierarchicalNameMapper.DEFAULT));
        return meterRegistry;
    }
}

HierarchicalNameMapper 策略决定将计量名称和标签组合成 MBean 名称。

221.15. 示例

Camel -example-micrometer 提供了一个示例,有关如何使用 Java 配置和 Prometheus 后端通过 Camel 设置 Micrometer 监控。

第 222 章 OPC UA 客户端组件

作为 Camel 版本 2.19 可用

Milo Client 组件提供对使用 Eclipse Milo™ 实施的 OPC UA 服务器的访问。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-milo</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

OPC UA Client 组件支持 6 个选项,它们如下所列。

名称描述默认类型

defaultConfiguration (common)

客户端的所有默认选项

 

MiloClientConfiguration

applicationName (common)

默认应用程序名称

 

字符串

applicationUri (common)

默认应用程序 URI

 

字符串

productUri (common)

默认产品 URI

 

字符串

reconnectTimeout (common)

默认重新连接超时

 

Long

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

222.1. URI 格式

端点的 URI 语法是:

milo-client:tcp://[user:password@]host:port/path/to/service?node=RAW(nsu=urn:foo:bar;s=item-1)

如果服务器没有使用路径,则可以简单地省略它:

milo-client:tcp://[user:password@]host:port?node=RAW(nsu=urn:foo:bar;s=item-1)

如果没有提供用户凭证,客户端将切换到匿名模式。

222.2. URI 选项

组客户端中的所有配置选项都适用于共享客户端实例。端点将共享每个端点 URI 的客户端实例。因此,第一次发出该端点 URI 的请求时,将应用 client 组的选项。所有进一步的实例将被忽略。

如果您需要同一端点 URI 的备用选项,但可以设置 clientId 选项,该选项在内部将添加到端点 URI 中以选择不同的共享连接实例。换句话说,通过端点 URI 和客户端 ID 的组合来共享连接。

OPC UA 客户端端点使用 URI 语法配置:

milo-client:endpointUri

使用以下路径和查询参数:

222.2.1. 路径名(1 参数):

名称描述默认类型

endpointUri

所需的 OPC UA 服务器端点

 

字符串

222.2.2. 查询参数(27 参数):

名称描述默认类型

clientId (common)

虚拟客户端 ID,用于强制创建新连接实例

 

字符串

defaultAwaitWrites (common)

默认用于写入的等待设置

false

布尔值

discoveryEndpointSuffix (common)

发现时端点 URI 的后缀

 

字符串

discoveryEndpointUri (common)

另一种发现 URI

 

字符串

方法 (通用)

方法定义(请参阅方法 ID)

 

ExpandedNodeId

node (common)

节点定义(请参阅节点 ID)

 

ExpandedNodeId

samplingInterval (common)

抽样间隔(毫秒)

 

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

allowedSecurityPolicies (client)

组允许的安全策略 URI。默认值为 全部并使用最高。

 

字符串

applicationName (client)

应用程序名称

Eclipse Milo 的 Apache Camel 适配器

字符串

applicationUri (client)

应用程序 URI

http://camel.apache.org/EclipseMilo/Client

字符串

channelLifetime (client)

频道生命周期(毫秒)

 

Long

keyAlias (client)

密钥存储文件中密钥的名称

 

字符串

keyPassword (client)

密钥密码

 

字符串

keyStorePassword (client)

密钥存储密码

 

字符串

keyStoreType (client)

关键存储类型

 

字符串

keyStoreUrl (client)

从中加载密钥的 URL

 

URL

maxPendingPublishRequests (client)

待处理的发布请求的最大数量

 

Long

maxResponseMessageSize (client)

响应消息可能具有的最大字节数

 

Long

overrideHost (client)

使用端点 URI 中的主机覆盖服务器报告的端点主机。

false

布尔值

productUri (client)

产品 URI

http://camel.apache.org/EclipseMilo

字符串

requestTimeout (client)

请求超时(以毫秒为单位)

 

Long

sessionName (client)

会话名称

 

字符串

sessionTimeout (client)

会话超时(毫秒)

 

Long

222.3. Spring Boot Auto-Configuration

组件支持 24 个选项,它们如下所列。

名称描述默认类型

camel.component.milo-client.application-name

默认应用程序名称

 

字符串

camel.component.milo-client.application-uri

默认应用程序 URI

 

字符串

camel.component.milo-client.default-configuration.allowed-security-policies

组允许的安全策略 URI。默认值为 全部并使用最高。

 

Set

camel.component.milo-client.default-configuration.application-name

应用程序名称

Eclipse Milo 的 Apache Camel 适配器

字符串

camel.component.milo-client.default-configuration.application-uri

应用程序 URI

http://camel.apache.org/EclipseMilo/Client

字符串

camel.component.milo-client.default-configuration.channel-lifetime

频道生命周期(毫秒)

 

Long

camel.component.milo-client.default-configuration.client-id

虚拟客户端 ID,用于强制创建新连接实例

 

字符串

camel.component.milo-client.default-configuration.discovery-endpoint-suffix

发现时端点 URI 的后缀

 

字符串

camel.component.milo-client.default-configuration.discovery-endpoint-uri

另一种发现 URI

 

字符串

camel.component.milo-client.default-configuration.key-alias

密钥存储文件中密钥的名称

 

字符串

camel.component.milo-client.default-configuration.key-password

密钥密码

 

字符串

camel.component.milo-client.default-configuration.key-store-password

密钥存储密码

 

字符串

camel.component.milo-client.default-configuration.key-store-type

关键存储类型

 

字符串

camel.component.milo-client.default-configuration.max-pending-publish-requests

待处理的发布请求的最大数量

 

Long

camel.component.milo-client.default-configuration.max-response-message-size

响应消息可能具有的最大字节数

 

Long

camel.component.milo-client.default-configuration.override-host

使用端点 URI 中的主机覆盖服务器报告的端点主机。

false

布尔值

camel.component.milo-client.default-configuration.product-uri

产品 URI

http://camel.apache.org/EclipseMilo

字符串

camel.component.milo-client.default-configuration.request-timeout

请求超时(以毫秒为单位)

 

Long

camel.component.milo-client.default-configuration.session-name

会话名称

 

字符串

camel.component.milo-client.default-configuration.session-timeout

会话超时(毫秒)

 

Long

camel.component.milo-client.enabled

启用 milo-client 组件

true

布尔值

camel.component.milo-client.product-uri

默认产品 URI

 

字符串

camel.component.milo-client.reconnect-timeout

默认重新连接超时

 

Long

camel.component.milo-client.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

222.3.1. Discovery(发现)

如果服务器使用专用的发现端点(例如 /discovery),它可能支持不同的(无安全)安全策略,那么您可以通过参数 discoveryEndpointSuffix 使用它,该端点将被附加到 endpointUri。或者使用显式 discoveryEndpointUri

222.3.2. 覆盖主机名

客户端使用来自服务器查询的端点信息的主机信息。但是,在某些情况下,此端点 URI 可能不同,来自连接客户端(如内部主机名)的视角中的错误。

在这种情况下,可以将参数 overrideHost 设置为 true,这将获取发现的端点信息,但使用原始 URI 的值覆盖主机信息。

222.3.3. 节点 ID

要定义命名空间和节点 ID 的目标命名空间和节点 ID。在以前的版本中,可以通过指定 nodeIdnamespaceUrinamespaceIndex 来实现。但是,这只允许使用基于字符串的节点 ID。虽然此配置仍可行,但首选较新的配置。

新方法就是以 ns=1 格式指定完整的命名空间+节点 ID;i=1 还允许使用其他节点 ID 格式(如数字、GUID/UUID 或 opaque)。如果使用了 node 参数,则不能使用旧的参数。此节点格式的语法是一组 键=值对,用分号(;)分隔。

必须使用一个命名空间和一个节点 id 键。有关可能的密钥,请查看下表:

类型描述

ns

namespace

数字命名空间索引

nsu

namespace

Namespace URI

s

node

字符串节点 ID

i

node

数字节点 ID

g

node

GUID/UUID 节点 ID

b

node

用于不透明节点 ID 的 Base64 编码字符串

由于语法生成的值无法透明地编码为 URI 参数值,因此需要转义它们。但是,Camel 允许嵌套 RAW (…) 中的实际值,这样可以不需要进行转义。例如:

milo-client:tcp://user:password@localhost:12345?node=RAW(nsu=http://foo.bar;s=foo/bar)

222.3.4. 方法 ID

可以对 OPC UA 节点执行方法调用。如果参数 方法 设置为方法调用的节点 ID (节点 ID 必须设为本例中的父对象),则执行方法调用而不是写入操作。

从正文中获取输入参数:

  • 如果正文为空,则使用空 Variant[]
  • 如果正文为 Variant[],则它将原样使用
  • 如果正文是 变体 的,则它将嵌套在 Variant[] 阵列中
  • 否则,正文将被转换为 变体,并嵌套在 Variant[]的数组中

222.3.5. 安全策略

当设置允许安全策略时,可以使用已知的 OPC UA URI (例如 http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15)或使用 Milo enum literals (例如 None)。指定未知安全策略 URI 或 enum 是一项错误。

已知的安全策略 URI 和 enum 文字可以在此处看到: SecurityPolicy.java

注: 在任何情况下,安全策略被视为区分大小写。

222.4. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 223 章 OPC UA 服务器组件

作为 Camel 版本 2.19 可用

Milo Server 组件使用 Eclipse Milo™ 实施提供一个 OPC UA 服务器。

Java 8 :该组件在运行时需要 Java 8。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-milo</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

发送到来自 Camel 的端点的消息将从 OPC UA 服务器发送到 OPC UA 客户端。来自 OPC UA Client 的写入请求将触发发送到 Apache Camel 的消息。

OPC UA 服务器组件支持 20 个选项,它们如下所列。

名称描述默认类型

namespaceUri (common)

命名空间的 URI,默认为 urn:org:apache:camel

 

字符串

applicationName (common)

应用程序名称

 

字符串

applicationUri (common)

应用程序 URI

 

字符串

productUri (common)

产品 URI

 

字符串

bindPort (common)

服务器绑定到的 TCP 端口

 

int

strictEndpointUrls Enabled (common)

设置是否强制使用严格的端点 URL

false

布尔值

serverName (common)

服务器名称

 

字符串

hostname (common)

服务器主机名

 

字符串

securityPolicies (common)

安全策略

 

Set

securityPoliciesById (common)

使用 URI 或名称的安全策略

 

集合

UserAuthentication 凭证 (通用)

以 user1:pwd1,user2:pwd2 Usernames 的形式设置用户密码组合,密码将被解码

 

字符串

enableAnonymous Authentication (通用)

启用匿名验证,默认禁用

false

布尔值

usernameSecurityPolicy Uri (common)

设置时使用的 UserTokenPolicy

 

SecurityPolicy

bindAddresses (common)

设置服务器应绑定到的本地地址

 

字符串

buildInfo (common)

服务器构建信息

 

BuildInfo

serverCertificate (common)

服务器证书

 

结果

certificateManager (common)

服务器证书管理器

 

CertificateManager

certificateValidator (common)

客户端证书的验证器

 

供应商

defaultCertificate Validator (common)

使用默认基于文件的客户端证书验证器

 

File

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

223.1. URI 格式

milo-server:itemId[?options]

223.2. URI 选项

OPC UA 服务器端点使用 URI 语法配置:

milo-server:itemId

使用以下路径和查询参数:

223.2.1. 路径名(1 参数):

名称描述默认类型

itemId

项目 所需的 ID

 

字符串

223.2.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

223.3. Spring Boot Auto-Configuration

组件支持 21 个选项,它们如下所列。

名称描述默认类型

camel.component.milo-server.application-name

应用程序名称

 

字符串

camel.component.milo-server.application-uri

应用程序 URI

 

字符串

camel.component.milo-server.bind-addresses

设置服务器应绑定到的本地地址

 

字符串

camel.component.milo-server.bind-port

服务器绑定到的 TCP 端口

 

整数

camel.component.milo-server.build-info

服务器构建信息.选项是一个 org.eclipse.milo.opcua.stack.core.types.BuildInfo 类型。

 

字符串

camel.component.milo-server.certificate-manager

服务器证书管理器.选项是一个 org.eclipse.milo.opcua.stack.core.application.CertificateManager 类型。

 

字符串

camel.component.milo-server.certificate-validator

客户端证书的验证器。选项是一个 java.util.function.Supplier <org.eclipse.milo.opcua.stack.core.application.CertificateValidator> 类型。

 

字符串

camel.component.milo-server.default-certificate-validator

使用默认基于文件的客户端证书验证器

 

File

camel.component.milo-server.enable-anonymous-authentication

启用匿名验证,默认禁用

false

布尔值

camel.component.milo-server.enabled

启用 milo-server 组件

true

布尔值

camel.component.milo-server.hostname

服务器主机名

 

字符串

camel.component.milo-server.namespace-uri

命名空间的 URI,默认为 urn:org:apache:camel

 

字符串

camel.component.milo-server.product-uri

产品 URI

 

字符串

camel.component.milo-server.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.milo-server.security-policies

安全策略

 

Set

camel.component.milo-server.security-policies-by-id

使用 URI 或名称的安全策略

 

集合

camel.component.milo-server.server-certificate

服务器证书.选项是一个 org.apache.camel.component.milo.KeyStoreLoader.Result 类型。

 

字符串

camel.component.milo-server.server-name

服务器名称

 

字符串

camel.component.milo-server.strict-endpoint-urls-enabled

设置是否强制使用严格的端点 URL

false

布尔值

camel.component.milo-server.user-authentication-credentials

以 user1:pwd1,user2:pwd2 Usernames 的形式设置用户密码组合,密码将被解码

 

字符串

camel.component.milo-server.username-security-policy-uri

设置时使用的 UserTokenPolicy

 

SecurityPolicy

223.4. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 224 章 MIME 多部件数据格式

作为 Camel 2.17 版提供

此数据格式可以将带有附件的 Camel 消息转换为 Camel 消息,以将 MIME-Multipart 消息作为消息正文(无附件)。

这种情况的用例是让用户通过不支持附加的端点(例如,作为特殊协议实施)发送 MIME-multipart (通过 HTTP 端点发送 MIME-multipart),或者作为一种隧道解决方案(例如 camel-jms)不支持附件,而是通过附件(通过 HTTP 端点向 MIME)发送 MIME-multipart,或作为一种隧道解决方案(例如,因为 camel-jms 不支持附件),但通过附件发送 MIME-multipart,或作为一种隧道解决方案(例如 camel-jms)不支持附加附件,而是通过附件(通过 HTTP 端点发送 MIME-multipart),或作为一种隧道解决方案(例如 camel-jms)支持附件,而是通过附件(通过 HTTP 端点发送 MIME),或作为一种隧道解决方案(例如 camel-jms-jms)支持附件,而是通过 HTTP 端点发送 MIME-multipart,或作为一种隧道解决方案(例如 camel-jms)不支持附件,但通过 HTTP 端点发送 MIME-multipart,或作为一种隧道解决方案(例如 camel-jms)不支持附加内容,而是通过附件(通过 HTTP 端点发送 MIME)或作为隧道解决方案(例如 camel-jms)不支持附加附件,但通过附件将消息聚合到 MIME/Multi-Multippart 发送到 JMS 队列,从 JMS 队列接收消息并再次进行恢复(与附件相关的消息正文)。

mime-multipart 数据格式的 marshal 选项会将带有附件的消息转换为 MIME-Multipart 消息。如果将参数 "multipartWithoutAttachment" 设为 true,它还会在不附加单个部分的情况下将消息过滤至多部分消息,如果 参数设为 false,它将仅保留该消息。

mulitpart 的 MIME 标头设置为 "MIME-Version",并将 "Content-Type" 设置为 camel 标头到邮件。如果将参数 "headersInline" 设为 true,它也会在任何情况下创建一个 MIME 多部件信息。
另外,多部分的 MIME 标头作为邮件正文的一部分编写,而不是作为 camel 标头。

mime-multipart 数据格式的 unmarshal 选项会将 MIME-Multipart 消息转换为带有附件消息的 camel 消息,并单独保留其他消息。MIME-Multipart 消息的 MIME 标头必须设置为 Camel 标头。只有在将 "Content-Type" 标头设置为"multipart"类型时,才会进行解压缩。如果选项"headersInline"设为 true,则正文将始终解析为 MIME 消息。如果消息正文是流,并且未启用流缓存,则消息正文中实际上不是带有 MIME 标头的 MIME 消息。最多 Camel 版本 2.17.1 时将发生所有不包含 MIME 多部件消息的消息正文,而不考虑正文类型和流缓存设置。

224.1. 选项

MIME 多部件数据格式支持 6 选项,它们如下所列。

名称默认Java 类型描述

multipartSubType

mixed

字符串

指定 MIME 多部件的子类型。默认为混合使用。

multipartWithoutAttachment

false

布尔值

定义没有附加的消息是否也被放入 MIME 多部件(仅含有一个正文部分)。默认为 false。

headersInline

false

布尔值

定义 MIME-Multipart 标头是邮件正文的一部分(true)还是设置为 Camel 标头(false)。默认为 false。

includeHeaders

 

字符串

定义哪些 Camel 标头也作为 MIME 多部件包含的正则表达式。只有将 headerInline 设置为 true 时才可以正常工作。默认为不包含任何标头

binaryContent

false

布尔值

定义 MIME 多部分二进制部分的内容是否为二进制(true)还是 Base-64 编码(false)默认是否为 false。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

224.2. 消息标头(marshal)

名称类型描述

Message-Id

字符串

如果 "headersInline" 参数设置为 false,则 marshal 操作会将此参数设置为生成的 MIME 消息 ID。

MIME-Version

字符串

如果 "headersInline" 参数设置为 false,则 marshal 操作会将此参数设置为应用的 MIME 版本(1.0)。

Content-Type

字符串

此标头的内容将用作消息正文部分的内容类型。如果没有设置内容类型,则假定为"application/octet-stream"。如果 "headersInline" 参数设置为 true,则内容类型会将内容类型设置为"multipart/related"或为空。

内容编码

字符串

如果传入的内容类型是 "text/*",则内容编码将设置为正文部分的 Content-Type MIME 标头的编码参数。另外,指定的 charset 将应用文本到二进制转换。

224.3. Message Headers (unmarshal)

名称类型描述

Content-Type

字符串

如果此标头没有设置为 "multipart/*",则 unmarshal 操作不会进行任何操作。在其他情况下,多部分将解析到带有附件的 camel 消息,标头被设置为正文部分的 Content-Type 标头,除非应用程序/octet-stream 除外。在后者的情形中,标头被删除。

内容编码

字符串

如果正文部分的内容类型包含此标头的编码参数,则将设置为此编码参数的值(从 MIME 结尾描述符到 Java 编码描述符)

MIME-Version

字符串

unmarshal 操作将读取此标头,并使用它来解析 MIME 多部分。之后会删除标头

224.4. 例子

from(...).marshal().mimeMultipart()

如果设置了 no Content-Type 标头的消息,将创建一个带有以下消息 Camel 标头的消息:

Camel 消息标头

Content-Type=multipart/mixed; \n boundary="----=_Part_0_14180567.1447658227051"
Message-Id=<...>
MIME-Version=1.0
The message body will be:

Camel 消息正文

------=_Part_0_14180567.1447658227051
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Qm9keSB0ZXh0
------=_Part_0_14180567.1447658227051
Content-Type: application/binary
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Attachment File Name"
AAECAwQFBgc=
------=_Part_0_14180567.1447658227051--

带有标头 Content-Type 设置为 "text/plain" 的消息发送到路由

from("...").marshal().mimeMultipart("related", true, true, "(included|x-.*)", true);

将创建一个消息,而不设置为 Camel 标头( Content-Type 标头从 Camel 消息中移除)和以下消息正文,其中包含以 "x-" 开头的原始消息的所有标头,以及名称"included"的标头:

Camel 消息正文

Message-ID: <...>
MIME-Version: 1.0
Content-Type: multipart/related;
    boundary="----=_Part_0_1134128170.1447659361365"
x-bar: also there
included: must be included
x-foo: any value
 
------=_Part_0_1134128170.1447659361365
Content-Type: text/plain
Content-Transfer-Encoding: 8bit

Body text
------=_Part_0_1134128170.1447659361365
Content-Type: application/binary
Content-Transfer-Encoding: binary
Content-Disposition: attachment; filename="Attachment File Name"

[binary content]
------=_Part_0_1134128170.1447659361365

224.5. 依赖项

要在 Camel 路由中使用 MIME-Multipart,您需要添加实施此数据格式的 camel-mail 依赖关系。

如果使用 Maven,则只需在 pom.xml 中添加以下内容:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-mail</artifactId>
  <version>x.x.x</version> <!-- use the same version as your Camel core version -->
</dependency>

第 225 章 Mina2 组件

作为 Camel 2.10 版本提供

mina2: 组件是处理 Apache MINA 2.x的传输

提示

使用 Netty 作为 Netty 是更加活跃的,且目前的流行项目目前为 Apache Mina。

INFO:在消费者端点上仔细使用 sync=false。由于 camel-mina2 所有消费者交换都为InOut。这有别于 camel-mina。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mina2</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

225.1. URI 格式

mina2:tcp://hostname[:port][?options]
mina2:udp://hostname[:port][?options]
mina2:vm://hostname[:port][?options]

您可以使用 codec 选项指定 registry 中的 codec。如果您使用 TCP,且没有指定 codec,则使用 文本行 标记来确定应使用基于文本的代码或对象序列化。默认情况下,使用对象序列化。

对于 UDP,如果未指定 codec,则默认使用基本的 ByteBuffer 的 codec。

VM 协议用作同一 JVM 中的直接转发机制。

Mina producer 默认超时值为 30 秒,它会等待来自远程服务器的响应。

在正常使用中,camel-mina 仅支持发送正文内容-message 标头和交换属性。
但是,使用 transferExchange 选项允许您通过线路传输交换本身。请参见以下的选项。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

225.2. 选项

Mina2 组件支持 3 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享 mina 配置。

 

Mina2Configuration

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Mina2 端点使用 URI 语法进行配置:

mina2:protocol:host:port

使用以下路径和查询参数:

225.2.1. 路径名(3 参数):

名称描述默认类型

protocol

要使用 所需的 协议

 

字符串

主机

要使用 所需的 主机名。使用 localhost 或 0.0.0.0 作为本地服务器作为使用者。对于制作者,使用远程服务器的主机名或 ip 地址。

 

字符串

port

所需的 端口号

 

int

225.2.2. 查询参数(27 参数):

名称描述默认类型

disconnect (common)

使用后是否从 Mina 会话断开连接(关闭)。可用于使用者和制作者。

false

布尔值

minaLogger (common)

您可以启用 Apache MINA 日志记录过滤器。Apache MINA 使用 INFO 级别的 slf4j 日志记录记录所有输入和输出。

false

布尔值

sync (common)

将 设置为将端点设置为单向或请求响应。

true

布尔值

timeout (common)

您可以配置超时,以指定从远程服务器等待响应的时长。超时单位为毫秒,因此 60000 为 60 秒。

30000

long

writeTimeout (common)

将数据发送到 MINA 会话应花费的最大时间。默认为 10000 毫秒。

10000

long

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

clientMode (consumer)

如果 clientMode 为 true,mina 使用者会将地址连接为 TCP 客户端。

false

布尔值

disconnectOnNoReply (consumer)

如果启用了同步,则此选项将指示 MinaConsumer,如果应该断开连接,则没有回复发送。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

noReplyLogLevel (consumer)

如果启用了同步,则此选项将指示在日志没有回复发送时应使用的 MinaConsumer。

WARN

LoggingLevel

cachedAddress (producer)

是否要创建 InetAddress 一次并重复使用。将其设置为 false 允许在网络中选取 DNS 更改。

true

布尔值

lazySessionCreation (producer)

如果远程服务器启动时没有启动并运行,则会话可能会延迟以避免异常。

true

布尔值

maximumPoolSize (advanced)

TCP 和 UDP 的 worker 池中的 worker 线程数量

16

int

orderedThreadPoolExecutor (advanced)

是否使用排序的线程池,确保事件在同一频道中按顺序处理。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

transferExchange (advanced)

仅用于 TCP。您可以通过线路来传输交换,而不是只是正文。以下字段会被传输:在正文、传出正文、错误正文、标题、错误标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

allowDefaultCodec (codec)

如果两个代码都为 null,则 mina 组件会安装默认的 codec,并且 textline 为 false。将 allowDefaultCodec 设置为 false 可防止 mina 组件安装默认 codec 作为过滤器链中的第一个元素。当另一个过滤器必须是过滤器链中的第一个过滤器(如 SSL 过滤器)时,这非常有用。

true

布尔值

codec (codec)

使用定制代码实施。

 

ProtocolCodecFactory

decoderMaxLineLength (codec)

设置文本协议解码器最大行长度。默认情况下,使用 Mina 本身的默认值为 1024。

1024

int

encoderMaxLineLength (codec)

设置文本协议编码器最大行长度。默认情况下,会使用 Mina 本身的默认值,即 Integer.MAX_VALUE。

-1

int

encoding (codec)

您可以配置编码(a charset name),以用于 TCP 文本行 codec 和 UDP 协议。如果没有提供,Camel 将使用 JVM 默认 Charset

 

字符串

filters (codec)

您可以设置要使用的 Mina IoFilters 列表。

 

list

textline (codec)

仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的 codec;如果未指定或值为 false,则通过 TCP 假定 Object Serialization。

false

布尔值

textlineDelimiter (codec)

仅用于 TCP 和 textline=true。设置要使用的文本行分隔符。如果没有提供,Camel 将使用 DEFAULT。此分隔符用于标记文本末尾。

 

Mina2TextLineDelimiter

autoStartTls (security)

是否自动启动 SSL 握手。

true

布尔值

sslContextParameters (security)

配置 SSL 安全性。

 

SSLContextParameters

225.3. Spring Boot Auto-Configuration

组件支持 29 选项,它们如下所列。

名称描述默认类型

camel.component.mina2.configuration.allow-default-codec

如果两个代码都为 null,则 mina 组件会安装默认的 codec,并且 textline 为 false。将 allowDefaultCodec 设置为 false 可防止 mina 组件安装默认 codec 作为过滤器链中的第一个元素。当另一个过滤器必须是过滤器链中的第一个过滤器(如 SSL 过滤器)时,这非常有用。

true

布尔值

camel.component.mina2.configuration.auto-start-tls

是否自动启动 SSL 握手。

true

布尔值

camel.component.mina2.configuration.cached-address

是否要创建 InetAddress 一次并重复使用。将其设置为 false 允许在网络中选取 DNS 更改。

true

布尔值

camel.component.mina2.configuration.client-mode

如果 clientMode 为 true,mina 使用者会将地址连接为 TCP 客户端。

false

布尔值

camel.component.mina2.configuration.codec

使用定制代码实施。

 

ProtocolCodecFactory

camel.component.mina2.configuration.decoder-max-line-length

设置文本协议解码器最大行长度。默认情况下,使用 Mina 本身的默认值为 1024。

1024

整数

camel.component.mina2.configuration.disconnect

使用后是否从 Mina 会话断开连接(关闭)。可用于使用者和制作者。

false

布尔值

camel.component.mina2.configuration.disconnect-on-no-reply

如果启用了同步,则此选项将指示 MinaConsumer,如果应该断开连接,则没有回复发送。

true

布尔值

camel.component.mina2.configuration.encoder-max-line-length

设置文本协议编码器最大行长度。默认情况下,会使用 Mina 本身的默认值,即 Integer.MAX_VALUE。

-1

整数

camel.component.mina2.configuration.encoding

您可以配置编码(a charset name),以用于 TCP 文本行 codec 和 UDP 协议。如果没有提供,Camel 将使用 JVM 默认 Charset

 

字符串

camel.component.mina2.configuration.filters

您可以设置要使用的 Mina IoFilters 列表。

 

list

camel.component.mina2.configuration.host

要使用的主机名。使用 localhost 或 0.0.0.0 作为本地服务器作为使用者。对于制作者,使用远程服务器的主机名或 ip 地址。

 

字符串

camel.component.mina2.configuration.lazy-session-creation

如果远程服务器启动时没有启动并运行,则会话可能会延迟以避免异常。

true

布尔值

camel.component.mina2.configuration.maximum-pool-size

TCP 和 UDP 的 worker 池中的 worker 线程数量

16

整数

camel.component.mina2.configuration.mina-logger

您可以启用 Apache MINA 日志记录过滤器。Apache MINA 使用 INFO 级别的 slf4j 日志记录记录所有输入和输出。

false

布尔值

camel.component.mina2.configuration.no-reply-log-level

如果启用了同步,则此选项将指示在日志没有回复发送时应使用的 MinaConsumer。

 

LoggingLevel

camel.component.mina2.configuration.ordered-thread-pool-executor

是否使用排序的线程池,确保事件在同一频道中按顺序处理。

true

布尔值

camel.component.mina2.configuration.port

端口号

 

整数

camel.component.mina2.configuration.protocol

要使用的协议

 

字符串

camel.component.mina2.configuration.ssl-context-parameters

配置 SSL 安全性。

 

SSLContextParameters

camel.component.mina2.configuration.sync

将 设置为将端点设置为单向或请求响应。

true

布尔值

camel.component.mina2.configuration.textline

仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的 codec;如果未指定或值为 false,则通过 TCP 假定 Object Serialization。

false

布尔值

camel.component.mina2.configuration.textline-delimiter

仅用于 TCP 和 textline=true。设置要使用的文本行分隔符。如果没有提供,Camel 将使用 DEFAULT。此分隔符用于标记文本末尾。

 

Mina2TextLineDelimiter

camel.component.mina2.configuration.timeout

您可以配置超时,以指定从远程服务器等待响应的时长。超时单位为毫秒,因此 60000 为 60 秒。

30000

Long

camel.component.mina2.configuration.transfer-exchange

仅用于 TCP。您可以通过线路来传输交换,而不是只是正文。以下字段会被传输:在正文、传出正文、错误正文、标题、错误标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

camel.component.mina2.configuration.write-timeout

将数据发送到 MINA 会话应花费的最大时间。默认为 10000 毫秒。

10000

Long

camel.component.mina2.enabled

启用 mina2 组件

true

布尔值

camel.component.mina2.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.mina2.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

225.4. 使用自定义 codec

查看 Mina 如何编写自己的代码。要将自定义 codec 与 camel-mina 一起使用,您应该在 registry 中注册您的 codec;例如,在 Spring XML 文件中创建一个 bean。然后使用 codec 选项指定 您的 codec 的 bean ID。请参阅具有自定义 codec 的 HL7

225.5. 带有 sync=false 的示例

在本例中,Camel 公开服务,侦听端口 6200 上的 TCP 连接。我们使用 文本代码。在我们的路由中,我们创建一个侦听端口 6200 的 Mina consumer 端点:

from("mina2:tcp://localhost:" + port1 + "?textline=true&sync=false").to("mock:result");

由于示例是单元测试的一部分,我们可以通过在端口 6200 上向其发送一些数据来测试。

MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedBodiesReceived("Hello World");

template.sendBody("mina2:tcp://localhost:" + port1 + "?textline=true&sync=false", "Hello World");

assertMockEndpointsSatisfied();

225.6. 带有 sync=true 的示例

在下一个示例中,我们有一个更常见的用例,在端口 6201 上公开 TCP 服务也使用文本代码。但是,这次我们想要返回响应,因此我们将消费者的 同步 选项设置为 true

from("mina2:tcp://localhost:" + port2 + "?textline=true&sync=true").process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        String body = exchange.getIn().getBody(String.class);
        exchange.getOut().setBody("Bye " + body);
    }
});

然后,我们通过使用 template.requestBody () 方法发送一些数据并检索响应来测试示例。随着我们知道的响应是 字符串,我们将其转换为 字符串,可以说在处理器代码逻辑中动态设置的响应是。

String response = (String)template.requestBody("mina2:tcp://localhost:" + port2 + "?textline=true&sync=true", "World");
assertEquals("Bye World", response);

225.7. Spring DSL 示例

Spring DSL 也可用于 MINA。在以下示例中,我们将在端口 5555 上公开 TCP 服务器:

   <route>
     <from uri="mina2:tcp://localhost:5555?textline=true"/>
     <to uri="bean:myTCPOrderHandler"/>
  </route>

在上面的路由中,我们使用文本 codec 在端口 5555 上公开 TCP 服务器。我们让 Spring bean 带有 ID myTCPOrderHandler,处理请求并返回回复。例如,处理器 bean 可以按如下方式实现:

    public String handleOrder(String payload) {
        ...
        return "Order: OK"
   }

225.8. 完成后关闭会话

当作为服务器执行时,有时要关闭会话,例如:客户端转换已完成。要指示 Camel 关闭会话,您应该添加一个带有键 CamelMinaCloseSessionWhenComplete 设置为布尔值 true 的标头。

例如,以下示例会在将 bye 消息写回客户端后关闭会话:

        from("mina2:tcp://localhost:8080?sync=true&textline=true").process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                String body = exchange.getIn().getBody(String.class);
                exchange.getOut().setBody("Bye " + body);
                exchange.getOut().setHeader(Mina2Constants.MINA_CLOSE_SESSION_WHEN_COMPLETE, true);
            }
        });

225.9. 获取消息的 IoSession

您可以使用键 Mina2Constants.MINA_IOSESSION 获取消息标头中的 IoSession,并使用键 Mina2Constants.MINA_LOCAL_ADDRESS.MINA_LOCAL_ADDRS 和远程主机地址获得本地主机地址。MINA_REMOTE_ADDRESS .MINA_REMOTE_ADDRESS.

225.10. 配置 Mina 过滤器

过滤器允许您使用一些 Mina Filters,如 SslFilter。您还可以实施一些自定义过滤器。请注意,codeclogger 也作为类型 IoFilter 的过滤器来实施。您可以定义的任何过滤器都会附加到过滤器链的末尾,即 codeclogger 后面。

225.11. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • Netty

第 226 章 MLLP 组件

作为 Camel 2.17 版提供

MLLP 组件专门设计为处理 MLLP 协议的 nuances,并提供医疗提供商使用 MLLP 协议与其他系统通信所需的功能。 MLLP 组件提供简单的配置 URI,自动化 HL7 确认生成和自动确认间。

MLLP 协议通常不使用大量并发 TCP 连接 - 一个活跃的 TCP 连接是正常情况。 因此,MLLP 组件使用基于标准的 JavaSockets 的简单线程-per-connection 模型。这将使实施保持简单,并消除了 Camel 本身之外的其他依赖项。

组件支持以下内容:

  • 使用 TCP 服务器的 Camel 使用者
  • 使用 TCP 客户端的 Camel 制作者

MLLP 组件使用字节[] 有效负载,并依赖 Camel 类型转换转换将 byte[] 转换为其他类型。 

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mllp</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

226.1. MLLP 选项

MLLP 组件支持 5 个选项,它们如下所列。

名称描述默认类型

logPhi (advanced)

设置组件以记录 PHI 数据。

true

布尔值

logPhiMaxBytes (advanced)

设置在日志条目中登录的 PHI 的最大字节数。

5120

整数

defaultCharset (advanced)

将默认字符设置为用于字节/从字符串转换中用于 /。

ISO-8859-1

字符串

configuration (common)

设置创建 MLLP 端点时要使用的默认配置。

 

MllpConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

MLLP 端点使用 URI 语法进行配置:

mllp:hostname:port

使用以下路径和查询参数:

226.1.1. 路径名(2 参数):

名称描述默认类型

hostname

为 TCP 连接连接所需的主机名或 IP。默认值为 null,即任何本地 IP 地址

 

字符串

port

TCP 连接所需的端口号

 

int

226.1.2. 查询参数(27 参数):

名称描述默认类型

autoAck (common)

启用/禁用 MLLP Acknowledgement MLLP Consumers 的自动生成

true

布尔值

bufferWrites (common)

在写入套接字前,弃用了 HL7 有效负载的 Enable/Disable the buffering。

false

布尔值

hl7Headers (通用)

仅在 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 将验证转换为 String。如果设置了 charsetName 属性,则该字符集将用于转换。如果没有设置 charsetName 属性,则将使用 MSH-18 的值来决定相应的字符集。如果没有设置 MSH-18,则会使用默认的 ISO-8859-1 字符集。

true

布尔值

validatePayload (common)

启用/禁用 HL7 Payloads If enabled,则会验证从外部系统接收的 HL7 Payloads 将验证(请参阅 Hl7Util.generateInvalidPayloadExceptionMessage)。如果检测到无效的有效负载,则会抛出 MllpInvalidMessageException(针对使用者)或 MllpInvalidAcknowledgementException。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着在消费者尝试接收传入的消息时发生任何异常,或像这样一样处理,由路由 Error Handler 处理的消息和由路由 Error Handler 处理。如果禁用,消费者将使用 org.apache.camel.spi.ExceptionHandler 通过在 WARN 或 ERROR 级别中记录它们来处理异常,并忽略它们。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

InOut

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用(此组件仅支持同步操作)。

true

布尔值

backlog (tcp)

传入连接的最大队列长度(请求连接)设置为 backlog 参数。如果连接在队列已满时到达,连接将被拒绝。

5

整数

lenientBind (tcp)

仅限 TCP Server - 允许端点在 TCP 服务器套接字绑定前启动。在某些环境中,可能需要允许端点在 TCP 服务器套接字绑定前启动。

false

布尔值

maxConcurrentConsumers (tcp)

将允许的最大并发 MLLP Consumer 连接数。如果收到新连接并且已建立最大连接数,则新连接将立即重置。

5

int

reuseAddress (tcp)

启用/禁用 SO_REUSEADDR 套接字选项。

false

布尔值

acceptTimeout (timeout)

只等待 TCP 连接 TCP 服务器时超时(以毫秒为单位)

60000

int

bindRetryInterval (timeout)

仅限 TCP 服务器 - 绑定尝试之间要等待的毫秒数

5000

int

bindTimeout (timeout)

仅限 TCP 服务器 - 重试绑定到服务器端口的毫秒数

30000

int

connectTimeout (timeout)

仅建立 TCP 连接 TCP 客户端的超时(毫秒)

30000

int

idleTimeout (timeout)

在重置客户端 TCP 连接前允许执行大约闲置时间。null 值或小于零的值将禁用闲置超时。

 

整数

maxReceiveTimeouts (timeout)

弃用了 在重置 TCP 连接前允许的最大超时数(由 receiveTimeout 指定)。

 

整数

keepAlive (tcp)

启用/禁用 SO_KEEPALIVE 套接字选项。

true

布尔值

receiveBufferSize (tcp)

将 SO_RCVBUF 选项设置为指定的值(以字节为单位)

8192

整数

sendBufferSize (tcp)

将 SO_SNDBUF 选项设置为指定的值(以字节为单位)

8192

整数

tcpNoDelay (tcp)

启用/禁用 TCP_NODELAY 套接字选项。

true

布尔值

readTimeout (timeout)

收到 MLLP 帧后使用的 SO_TIMEOUT 值(以毫秒为单位)

5000

int

receiveTimeout (timeout)

等待 MLLP 帧的开头时使用的 SO_TIMEOUT 值(以毫秒为单位)。

15000

int

charsetName (codec)

在交换上设置 CamelCharsetName 属性

 

字符串

226.2. Spring Boot Auto-Configuration

组件支持 31 选项,如下所示。

名称描述默认类型

camel.component.mllp.configuration.accept-timeout

只等待 TCP 连接 TCP 服务器时超时(以毫秒为单位)

60000

整数

camel.component.mllp.configuration.auto-ack

启用/禁用 MLLP Acknowledgement MLLP Consumers 的自动生成

true

布尔值

camel.component.mllp.configuration.backlog

传入连接的最大队列长度(请求连接)设置为 backlog 参数。如果连接在队列已满时到达,连接将被拒绝。

5

整数

camel.component.mllp.configuration.bind-retry-interval

仅限 TCP 服务器 - 绑定尝试之间要等待的毫秒数

5000

整数

camel.component.mllp.configuration.bind-timeout

仅限 TCP 服务器 - 重试绑定到服务器端口的毫秒数

30000

整数

camel.component.mllp.configuration.bridge-error-handler

允许将消费者桥接到 Camel 路由 Error Handler,这意味着在消费者尝试接收传入的消息时发生任何异常,或像这样一样处理,由路由 Error Handler 处理的消息和由路由 Error Handler 处理。如果禁用,消费者将使用 org.apache.camel.spi.ExceptionHandler 通过在 WARN 或 ERROR 级别中记录它们来处理异常,并忽略它们。

true

布尔值

camel.component.mllp.configuration.charset-name

在交换上设置 CamelCharsetName 属性

 

字符串

camel.component.mllp.configuration.connect-timeout

仅建立 TCP 连接 TCP 客户端的超时(毫秒)

30000

整数

camel.component.mllp.configuration.exchange-pattern

在使用者创建交换时设置交换模式。

 

ExchangePattern

camel.component.mllp.configuration.hl7-headers

仅在 HL7 Message MLLP Consumers 中自动生成消息标头

true

布尔值

camel.component.mllp.configuration.idle-timeout

在重置客户端 TCP 连接前允许执行大约闲置时间。null 值或小于零的值将禁用闲置超时。

 

整数

camel.component.mllp.configuration.keep-alive

启用/禁用 SO_KEEPALIVE 套接字选项。

true

布尔值

camel.component.mllp.configuration.lenient-bind

仅限 TCP Server - 允许端点在 TCP 服务器套接字绑定前启动。在某些环境中,可能需要允许端点在 TCP 服务器套接字绑定前启动。

false

布尔值

camel.component.mllp.configuration.max-concurrent-consumers

将允许的最大并发 MLLP Consumer 连接数。如果收到新连接并且已建立最大连接数,则新连接将立即重置。

5

整数

camel.component.mllp.configuration.read-timeout

收到 MLLP 帧后使用的 SO_TIMEOUT 值(以毫秒为单位)

5000

整数

camel.component.mllp.configuration.receive-buffer-size

将 SO_RCVBUF 选项设置为指定的值(以字节为单位)

8192

整数

camel.component.mllp.configuration.receive-timeout

等待 MLLP 帧的开头时使用的 SO_TIMEOUT 值(以毫秒为单位)。

15000

整数

camel.component.mllp.configuration.require-end-of-data

启用/禁用对 MLLP 标准的严格合规性。MLLP 标准指定 START_OF_BLOCKhl7 有效负载END_OF_BLOCKEND_OF_DATA,但有些系统不会发送最终的 END_OF_DATA 字节。此设置控制最终 END_OF_DATA 字节是否是必需的。

true

布尔值

camel.component.mllp.configuration.reuse-address

启用/禁用 SO_REUSEADDR 套接字选项。

false

布尔值

camel.component.mllp.configuration.send-buffer-size

将 SO_SNDBUF 选项设置为指定的值(以字节为单位)

8192

整数

camel.component.mllp.configuration.string-payload

启用/禁用将有效负载转换为字符串。如果启用,则从外部系统接收的 HL7 Payloads 将验证转换为 String。如果设置了 charsetName 属性,则该字符集将用于转换。如果没有设置 charsetName 属性,则将使用 MSH-18 的值来决定相应的字符集。如果没有设置 MSH-18,则会使用默认的 ISO-8859-1 字符集。

true

布尔值

camel.component.mllp.configuration.synchronous

设置同步处理是否应当严格使用(此组件仅支持同步操作)。

true

布尔值

camel.component.mllp.configuration.tcp-no-delay

启用/禁用 TCP_NODELAY 套接字选项。

true

布尔值

camel.component.mllp.configuration.validate-payload

启用/禁用 HL7 Payloads If enabled,则会验证从外部系统接收的 HL7 Payloads 将验证(请参阅 Hl7Util.generateInvalidPayloadExceptionMessage)。如果检测到无效的有效负载,则会抛出 MllpInvalidMessageException(针对使用者)或 MllpInvalidAcknowledgementException。

false

布尔值

camel.component.mllp.default-charset

将默认字符设置为用于字节/从字符串转换中用于 /。

ISO-8859-1

字符串

camel.component.mllp.enabled

启用 mllp 组件

true

布尔值

camel.component.mllp.log-phi

设置组件以记录 PHI 数据。

true

布尔值

camel.component.mllp.log-phi-max-bytes

设置在日志条目中登录的 PHI 的最大字节数。

5120

整数

camel.component.mllp.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.mllp.configuration.buffer-writes

在写入套接字前启用/禁用 HL7 有效负载的缓冲。

false

布尔值

camel.component.mllp.configuration.max-receive-timeouts

在重置 TCP 连接前允许的最大超时数(由 receiveTimeout 指定)。

 

整数

226.3. MLLP Consumer

MLLP Consumer 支持接收 MLLP-framed 消息并发送 HL7 Acknowledgements。 MLLP Consumer 可以自动生成 HL7 Acknowledgement (仅限 AA、AE 和 AR)或确认性交换属性。 此外,通过设置 CamelMllpAcknowledgement Exchange 属性来控制生成的确认类型。

226.4. 消息标头

MLLP Consumer 在 Camel 消息中添加这些标头:

描述

 

CamelMllpLocalAddress

 套接字的本地 TCP 地址

 

CamelMllpRemoteAddress

 套接字的本地 TCP 地址 

 

CamelMllpSendingApplication

MSH-3 值

 

CamelMllpSendingFacility

MSH-4 值

 

CamelMllpReceivingApplication

MSH-5 value

 

CamelMllpReceivingFacility

MSH-6 value

 

CamelMllpTimestamp

MSH-7 value

 

CamelMllpSecurity

MSH-8 value 

 

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。

226.5. 交换属性

MLLP Consumer 生成和 TCP 套接字的状态的类型可由 Camel 交换上的这些属性控制:

类型

描述

CamelMllpAcknowledgement

byte[] 

如果存在,此属性将作为 MLLP Acknowledgement 发送到客户端

CamelMllpAcknowledgementString

 字符串

如果不存在且 CamelMllpAcknowledgement,则此属性将作为 MLLP Acknowledgement 发送到客户端

CamelMllpAcknowledgementMsaText

字符串

如果没有 CamelMllpAcknowledgement 或 CamelMllpAckck,则此属性可在生成的 HL7 确认中指定 MSA-3 的内容。

CamelMllpAcknowledgementType

 字符串

如果没有 CamelMllpAcknowledgement 或 CamelMllpAckck,则此属性可用于指定 HL7 确认类型(如 AA、AE、AR)

CamelMllpAutoAcknowledge

布尔值

覆盖 autoAck 查询参数

CamelMllpCloseConnectionBeforeSend

布尔值

如果为 true,在发送数据前将关闭套接字

CamelMllpResetConnectionBeforeSend

布尔值

如果为 true,在发送数据前将重置套接字

CamelMllpCloseConnectionAfterSend

布尔值

如果为 true,在发送数据后套接字会立即关闭

CamelMllpResetConnectionAfterSend

布尔值

如果为 true,在发送任何数据后将立即重置套接字

226.6. MLLP Producer

MLLP Producer 支持发送 MLLP-framed 消息并接收 HL7 Acknowledgements。 MLLP Producer interrogates the HL7 Acknowgments,并在收到负确认时引发异常。 接收确认为干预,如果出现负确认,将引发异常。

226.7. 消息标头

MLLP Producer 在 Camel 消息中添加这些标头:

描述

 

CamelMllpLocalAddress

 套接字的本地 TCP 地址

 

CamelMllpRemoteAddress

 套接字的远程 TCP 地址

 

CamelMllpAcknowledgement

 HL7 Acknowledgment byte[] 收到

 

CamelMllpAcknowledgementString

 接收的 HL7 Acknowledgment 转换为 String

 

226.8. 交换属性

TCP 套接字的状态可由 Camel 交换上的这些属性控制:

类型

描述

CamelMllpCloseConnectionBeforeSend

布尔值

如果为 true,在发送数据前将关闭套接字

CamelMllpResetConnectionBeforeSend

布尔值

如果为 true,在发送数据前将重置套接字

CamelMllpCloseConnectionAfterSend

布尔值

如果为 true,在发送数据后套接字会立即关闭

CamelMllpResetConnectionAfterSend

布尔值

如果为 true,在发送任何数据后将立即重置套接字

第 227 章 模拟组件

作为 Camel 版本 1.0 可用

测试分布式和异步处理非常困难。MockTestingDataSet 端点与 Camel 测试框架配合良好,使用 企业集成模式 和 Camel 的大型组件与强大的 Bean 集成来简化您的单元和集成测试。

Mock 组件提供了一个强大的声明性测试机制,与 jMock 类似,它允许在测试开始前在任意 Mock 端点上创建声明性预期。然后运行该测试,这通常会在一个或多个端点上触发消息,最后,可以在测试案例中断言预期,以确保系统按预期工作。

这可让您测试各种内容,例如:

  • 每个端点上接收了正确的消息数量,
  • 正确的有效负载(按正确的顺序)收到正确的有效负载,
  • 消息按顺序到达端点,使用一些表达式创建顺序测试功能,
  • 消息到达某些类型相等,例如,特定标头具有特定的值,或者消息的部分与某些 predicate 匹配,例如通过评估 XPathXQuery 表达式。
注意

还有一个 Test 端点,它是一个 Mock 端点,它使用第二个端点提供预期消息正文列表,并自动设置 Mock endpoint assertions。换句话说,它是一个 Mock 端点,它会自动从文件或 数据库中 的一些示例消息设置断言,例如:

小心

模拟端点可无限期地保留接收的 Exchange。

请记住,Mock 是用于测试的。当您将 Mock 端点添加到路由时,发送到端点的每个 Exchange 将存储(以允许稍后验证),直到重启明确重置或 JVM。如果您要发送大量卷和/或大型消息,则可能导致过量内存使用。如果您的目标是在内联测试可部署的路由,请考虑在测试中使用 NotifyBuilder 或 AdviceWith,而不是直接向路由添加 Mock 端点。

从 Camel 2.10 开始,有两个新选项保留了 First,并且保留了 Last,可用于限制 Mock 端点在内存中保存的消息数量

227.1. URI 格式

mock:someName[?options]

其中 someName 可以是唯一标识端点的任意字符串。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

227.2. 选项

Mock 组件没有选项。

Mock 端点使用 URI 语法进行配置:

mock:name

使用以下路径和查询参数:

227.2.1. 路径名(1 参数):

名称描述默认类型

name

模拟端点 所需的 名称

 

字符串

227.2.2. 查询参数(10 参数):

名称描述默认类型

assertPeriod (producer)

设置一个宽限期,在模拟端点将重新排序后,以确保预消除断言仍然有效。例如,这使用 断言完全到达多个消息。例如,如果 expectedMessageCount(int)被设置为 5,则当 5 个或更多消息到达时满足断言。要确保正好 5 个消息到达,您需要等待一些期限以确保没有进一步的消息到达。这是您可以使用此 setAssertPeriod (长)方法。默认情况下禁用这个周期。

0

long

expectedCount (producer)

指定此端点应收到的预期消息交换数量。注意:如果您想要预期是 0 信息,那么在测试开始时,需要设置 0 匹配,以便让测试在一定时间运行期间,以确保没有消息被到达;对于使用 setAssertPeriod(long)。另一种方法是使用 NotifyBuilder,并在在模拟器上调用 assertIsSatisfied()方法前,使用通知程序来知道 Camel 需要路由某些信息。这可让您使用固定的断言周期来加快测试时间。如果您想要断言有 n 条消息到达这个模拟端点,则还需要看到 setAssertPeriod(long)方法了解更多详情。

-1

int

reportGroup (producer)

用于根据大小组打开吞吐量日志的数字。

 

int

resultMinimumWaitTime (producer)

设置 assertIsSatised ()将在 latch 上等待的时间最少的时间(以 millisisis)等待。

0

long

resultWaitTime (producer)

设置 assertIsSatised ()将在 latch 上等待的最大时间(以 millisisis)等待的时间,直到它满足为止

0

long

retainFirst (producer)

指定仅保留第 n 个接收交换的数量。这在测试大数据时,通过不存储每个 Exchange this模拟端点的副本来减少内存消耗。重要信息:使用这个限制时,getReceivedCounter()仍会返回接收的 Exchange 的实际数量。例如,如果我们收到 5000 Exchanges,并且已配置为仅保留第 10 个 Exchanges,则 getReceivedCounter()将仍然返回 5000,但 getExchanges()中只有前 10 Exchanges()和 getReceivedExchanges()方法。使用此方法时,某些其它预期方法不被支持,例如 expectedBodiesReceived (Object…​)会设置收到的第一个数量的正文。您可以配置 setRetainFirst(int)和 setRetainLast(int)方法来限制第一个和最后一个接收的方法。

-1

int

retainLast (producer)

指定仅保留最近 n 个接收的 Exchange 数。这在测试大数据时,通过不存储每个 Exchange this模拟端点的副本来减少内存消耗。重要信息:使用这个限制时,getReceivedCounter()仍会返回接收的 Exchange 的实际数量。例如,如果我们收到 5000 Exchanges,并且已配置为仅保留最后 20 个 Exchanges,则 getReceivedCounter()将仍然返回 5000,但 getExchanges()中只有最后 20 Exchanges()和 getReceivedExchanges()方法。使用此方法时,某些其它预期方法不被支持,例如 expectedBodiesReceived (Object…​)会设置收到的第一个数量的正文。您可以配置 setRetainFirst(int)和 setRetainLast(int)方法来限制第一个和最后一个接收的方法。

-1

int

sleepForEmptyTest (producer)

允许指定睡眠,在 expectedMessageCount (int)被调用时,等待此端点是否确实为空。

0

long

copyOnExchange (producer)

设定在这种模拟端点接收时是否对传入 Exchange 进行深度副本。默认为 true。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

227.3. 简单示例

以下是正在使用的 Mock 端点的简单示例。首先,在上下文上解析端点。然后,我们设置了预期,然后在测试运行后,我们断言我们的预期已经满足:

MockEndpoint resultEndpoint = context.resolveEndpoint("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 () 方法来测试在测试后是否满足预期。

当调用 assertIsSatisfied() 时,Camel 默认会等待 10 秒。这可以通过设置 setResultWaitTime(millis) 方法来配置。

227.4. 使用 assertPeriod

作为 Camel 2.7
,当断言被满足时,Camel 将停止等待并继续来自 断言 的方法。这意味着,如果新消息到达模拟端点(只是稍后),arrival 不会影响断言的结果。假设您要测试在一段时间后没有新消息到达,那么您可以通过设置 setAssertPeriod 方法来实现上述操作,例如:

MockEndpoint resultEndpoint = context.resolveEndpoint("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();

227.5. 设置预期

您可以从 MockEndpoint 的 Javadoc 中查看用于设定预期的各种帮助程序方法。主要方法如下:

方法描述

expectedMessageCount(int)

在端点上定义预期的消息计数。

expectedMinimumMessageCount(int)

在端点上定义预期消息的最小数量。

expectedBodiesReceived(…​)

定义应该收到的预期正文(按顺序)。

expectedHeaderReceived(…​)

定义应该接收的预期标头

expectsAscending(Expression)

要添加一个预期信息,需要使用给定的表达式来比较消息。

expectsDescending(Expression)

要添加一个预期信息,需要使用给定的表达式来比较消息。

expectsNoDuplicates(Expression)

要添加一个预期不会接收任何重复的消息,请使用 Expression 来计算每条消息的唯一标识符。如果使用 JMS,这可能类似于 JMS 或消息 内某些唯一引用号。

下面是另一个示例:

resultEndpoint.expectedBodiesReceived("firstMessageBody", "secondMessageBody", "thirdMessageBody");

227.6. 为特定消息添加预期

另外,您可以使用 message(int messageIndex) 方法添加有关收到特定消息的断言。

例如,要添加第一个消息的标头或正文(使用基于零的索引(如 java.util.List)的期望,您可以使用以下代码:

resultEndpoint.message(0).header("foo").isEqualTo("bar");

camel-core 处理器测试 中使用的 Mock 端点会有一些示例。

227.7. 模拟现有端点

可作为 Camel 2.7 提供

Camel 现在允许您自动模拟 Camel 路由中的现有端点。

注意

它的工作原理是 端点仍然在操作中。另一种情况是,注入 Mock 端点并接收消息,然后将消息委派给目标端点。您可以将此操作视为截获类型,并委派或端点监听程序。

假设您有以下给定的路由:

Route(路由)

@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"));
        }
    };
}

然后,您可以使用 Camel 中的 建议 带功能来模拟来自单元测试给定路由中的所有端点,如下所示:

提供模拟所有端点的建议

public void testAdvisedMockEndpoints() throws Exception {
       // advice the first route using the inlined AdviceWith route builder
       // which has extended capabilities than the regular route builder
       context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
           @Override
           public void configure() throws Exception {
               // mock all endpoints
               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 Vulnerability:& lt;endpoint>,如 模拟:direct:fooINFO 级别的 Camel 日志是模拟的端点:

INFO  Adviced endpoint [direct://foo] with mock endpoint [mock:direct:foo]
注意

模拟端点不使用参数
端点,模拟它们的参数会被剥离。例如,端点 log:foo?showAll=true 将模拟到以下端点 模拟:log:foo。请注意,参数已被删除。

它还可能仅使用模式模拟某些端点。例如,模拟您 执行 的所有日志端点,如下所示:

提供只使用模式的模拟日志端点 的建议

public void testAdvisedMockEndpointsWithPattern() throws Exception {
    // advice the first route using the inlined AdviceWith route builder
    // which has extended capabilities than the regular route builder
    context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            // mock only log endpoints
            mockEndpoints("log*");
        }
    });

    // now we can refer to log:foo as a mock and set our expectations
    getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World");

    getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");

    template.sendBody("direct:start", "Hello World");

    assertMockEndpointsSatisfied();

    // additional test to ensure correct endpoints in registry
    assertNotNull(context.hasEndpoint("direct:start"));
    assertNotNull(context.hasEndpoint("direct:foo"));
    assertNotNull(context.hasEndpoint("log:foo"));
    assertNotNull(context.hasEndpoint("mock:result"));
    // only the log:foo endpoint was mocked
    assertNotNull(context.hasEndpoint("mock:log:foo"));
    assertNull(context.hasEndpoint("mock:direct:start"));
    assertNull(context.hasEndpoint("mock:direct:foo"));
}

支持的模式可以是通配符或正则表达式。有关此问题的详细信息,请参阅 Intercept,及其与 Camel 使用的相同匹配功能。

注意

模拟端点时会导致在消息到达模拟时复制消息。
这意味着 Camel 将使用更多内存。当您在很多消息中发送时,可能不适用。

227.8. 使用 camel-test 组件模拟现有端点

除了指示 Camel 进行模拟端点外,您还可使用 cameltest Test Kit 轻松地启用此行为。

同一路由可以测试如下:请注意,我们从 isMockEndpoints 方法返回 "*",它会告诉 Camel 模拟所有端点。

如果只想模拟所有日志端点,您可以返回 " log * "。

使用 camel-test kit 的 isMockEndpoints

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"));
            }
        };
    }
}

227.9. 使用 XML DSL 模拟现有端点

如果不使用 camel-test 组件进行单元测试(如上所示),您可以在路由中使用 XML 文件使用不同的方法。
解决办法是创建新的 XML 文件,供单元测试使用,然后包括具有您要测试的路由的预期 XML 文件。

假设我们在 camel-route.xml 文件中有路由:

camel-route.xml 1

<!-- this camel route is in the camel-route.xml file -->
<camelContext xmlns="http://camel.apache.org/schema/spring">

    <route>
        <from uri="direct:start"/>
        <to uri="direct:foo"/>
        <to uri="log:foo"/>
        <to uri="mock:result"/>
    </route>

    <route>
        <from uri="direct:foo"/>
        <transform>
            <constant>Bye World</constant>
        </transform>
    </route>

</camelContext>

然后,我们按如下所示创建一个新的 XML 文件,其中包含 camel-route.xml 文件,并定义一个带有类 org.apache.camel.impl.InterceptSendToMockEndpointStrategy 的 spring bean,它告知 Camel 模拟所有端点:

test-camel-route.xml

<!-- the Camel route is defined in another XML file -->
 <import resource="camel-route.xml"/>

 <!-- bean which enables mocking all endpoints -->
 <bean id="mockAllEndpoints" class="org.apache.camel.component.mock.InterceptSendToMockEndpointStrategy"/>

然后,在单元测试中载入新的 XML 文件(test-camel-route.xml),而不是 camel-route.xml

要只模拟所有日志端点,您可以在 bean 的构造器中定义模式: ???

<bean id="mockAllEndpoints" class="org.apache.camel.impl.InterceptSendToMockEndpointStrategy">
    <constructor-arg index="0" value="log*"/>
</bean>

227.10. 模拟端点并跳过发送到原始端点

可从 Camel 2.10 开始

有时您需要轻松模拟,并跳过发送到特定端点。因此,消息会被取消,仅发送到模拟端点。从 Camel 2.10 开始,您现在可以使用 AdviceWith 或 Test Kit 使用 mockEndpointsAndSkip 方法。以下示例将跳过发送到两个端点 "direct:foo""direct:bar" 的发送。

使模拟器并跳过发送到端点的建议

public void testAdvisedMockEndpointsWithSkip() throws Exception {
    // advice the first route using the inlined AdviceWith route builder
    // which has extended capabilities than the regular route builder
    context.getRouteDefinitions().get(0).adviceWith(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");
            }
        };
    }
}

227.11. 限制要保留的消息数量

可从 Camel 2.10 开始

Mock 端点默认保留其收到的每个交换的副本。因此,如果您使用大量消息进行测试,那么它将消耗内存。
从 Camel 2.10 开始,我们引入了两个选项 保留了First 保留,它可用于仅保留第 N 个和/或最后一个 Exchange。

例如,在下面的代码中,我们只想保留第 5 个并最后的 5 Exchange 接收的模拟数据副本。

  MockEndpoint mock = getMockEndpoint("mock:data");
  mock.setRetainFirst(5);
  mock.setRetainLast(5);
  mock.expectedMessageCount(2000);

  mock.assertIsSatisfied();

使用此功能存在一些限制。MockEndpoint 上的 getExchanges()getReceivedExchanges() 方法仅返回 Exchanges 的保留副本。因此,在上面的示例中,列表将包含 10 个 Exchanges、前五个和最后五个。
retainFirstretainLast 选项也有一些限制,您可以预期使用方法。例如,针对消息正文、标头等操作 的预期XXX 方法将仅对保留的消息执行操作。在上例中,它们只能测试 10 个保留的消息中的预期。

227.12. 通过 arrival 时间进行测试

可作为 Camel 2.7 提供

Mock 端点将消息的 arrival 时间存储为 Exchange 上的属性。

Date time = exchange.getProperty(Exchange.RECEIVED_TIMESTAMP, Date.class);

您可以使用此信息知道消息何时到达模拟。但是,它还提供了解之前和下一个消息之间的间隔在模拟过程中的间隔的基础。您可以使用此功能在 Mock 端点上使用 到达 DSL 设置预期。

例如,在下一个操作前,第一个信息应该在 0-2 秒间进行到达:

mock.message(0).arrives().noLaterThan(2).seconds().beforeNext();

您还可以将其定义为第 2 个消息(基于 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 提供 毫秒,以及 分钟

227.13. 另请参阅

  • Spring 测试
  • 测试

第 228 章 MongoDB 组件(已弃用)

作为 Camel 2.10 版本提供

维基百科:"NoSQL 是促进一个松散定义的非关系数据存储类的移动,该类会破坏相关数据库和 ACID 保障的长期历史记录"。 NoSQL 解决方案在过去几年中日益普及,以及一些主要使用的网站和服务(如 Facebook、LinkedIn、Twitter 等)被广泛地使用它们来实现可扩展性和敏捷性。

基本上,NoSQL 解决方案与传统 RDBMS(消息传递数据库管理系统)有所不同,他们不会将 SQL 用作查询语言,通常不提供类似于 ACID 的事务或相关数据。相反,它们围绕灵活的数据结构和模式概念而设计(假设缺少带有固定模式的数据库表的传统概念),对商业硬件的极端可扩展性以及超快处理。

MongoDB 是一个非常流行的 NoSQL 解决方案,而 camel-mongodb 组件可将 Camel 与 MongoDB 集成,允许您将 MongoDB 集合作为生产者(对集合执行操作)和消费者(由 MongoDB 集合中使用文档)进行交互。

MongoDB 会重包文档概念(而不是作为办公室文档,而是在 JSON/BSON)和集合中定义的分层数据。此组件页面会假定您熟悉它们。否则,请访问 http://www.mongodb.org/

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mongodb</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>

228.1. URI 格式

mongodb:connectionBean?database=databaseName&collection=collectionName&operation=operationName[&moreOptions...]

228.2. MongoDB 选项

MongoDB 组件没有选项。

MongoDB 端点使用 URI 语法进行配置:

mongodb:connectionBean

使用以下路径和查询参数:

228.2.1. 路径名(1 参数):

名称描述默认类型

connectionBean

要使用的 com.mongodb.Mongo 所需 名称。

 

字符串

228.2.2. 查询参数(23 参数):

名称描述默认类型

集合 (通用)

设置要绑定到此端点的 MongoDB 集合名称

 

字符串

collectionIndex (common)

设置集合索引(JSON FORMAT : field1 : order1,field2 : order2)

 

字符串

createCollection (common)

如果初始创建集合不存在,则进行创建。默认为 true。

true

布尔值

database (common)

将 MongoDB 数据库的名称设置为目标

 

字符串

operation (common)

设置此端点将对 MongoDB 执行的操作。有关可能的值,请参阅 MongoDbOperation。

 

MongoDbOperation

outputType (common)

将制作者的输出转换为所选的类型 : DBObjectList DBObject 或 DBCursor。DBObjectList 或 DBCursor 适用于 findAll 和 aggregate。DBObject 适用于所有其他操作。

 

MongoDbOutputType

writeConcern (common)

为 MongoDB 使用标准操作的 WriteConcern 设置 WriteConcern。通过调用 WriteConcern#valueOf (String)方法,从 WriteConcern 类的字段解析。

已确认

WriteConcern

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

cursorRegenerationDelay (advanced)

MongoDB tail 可移动的光标将阻止,直到新数据到达。如果没有插入新数据,在一段时间后,光标将自动由 MongoDB 服务器释放并关闭。如果需要,客户端应该重新生成光标。这个值指定在尝试获取新光标前要等待的时间,如果尝试失败,则指定下一次尝试前要等待的时间。默认值为 1000ms。

1000

long

dynamicity (advanced)

设定此端点是否尝试从传入的 Exchange 属性中动态解析目标数据库和集合。可用于在运行时覆盖在其他静态端点 URI 中指定的数据库和集合。默认情况下禁用它来提高性能。启用它将会获得最小的性能命中。

false

布尔值

readPreference (advanced)

在 Mongo 连接上设置 MongoDB ReadPreference。此设置将直接覆盖连接上设置的读取首选项。ReadPreference#valueOf (String) utility 方法用于解析传递的 readPreference 值。某些可能值的示例为接近、主要或次要等。

 

ReadPreference

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

writeResultAsHeader (advanced)

在写入操作中,它会确定是否返回 WriteResult 作为 OUT 消息主体,我们将 IN 消息传输到 OUT,并将 WriteResult 作为标头附加。

false

布尔值

persistentId (tail)

一个尾部跟踪集合可为多个尾部的用户托管多个跟踪器。为了保持它们独立,每个跟踪器都应具有自己的唯一的 persistentId。

 

字符串

persistentTailTracking (tail)

启用持久跟踪跟踪,这是在系统重启后跟踪最后一次使用的消息的机制。下次系统启动后,端点将从其上停止的滑动记录中恢复光标。

false

布尔值

persistRecords (tail)

设置 tail 跟踪数据被保留到 MongoDB 的尾部记录数量。

-1

int

tailTrackCollection (tail)

个集合,其中将保留尾部跟踪信息。如果没有指定,则默认将使用 MongoDbTailTrackingConfig#DEFAULT_COLLECTION。

 

字符串

tailTrackDb (tail)

表示尾部跟踪机制将保留哪些数据库。如果未指定,则默认会选择当前数据库。即使启用,即使已启用,就不会考虑动态性,即尾部跟踪数据库不会有不同端点初始状态。

 

字符串

tailTrackField (tail)

将放置最后一个跟踪值的字段。如果没有指定,则默认使用 MongoDbTailTrackingConfig#DEFAULT_FIELD。

 

字符串

tailTrackIncreasingField (tail)

传入 记录中的关联字段(即增加的性质),每次生成时都会用来定位尾部光标。光标将是(re)创建,其查询为: tailTrackIncreasingField lastValue (可能从持久跟踪中恢复)。可以是类型 Integer、Date、String 等。注意:当前不支持点符号,因此该字段应位于文档的顶级。

 

字符串

tailTrackingStrategy (tail)

设置用于提取增大字段值的策略并创建查询来定位 tail 光标。

字面

MongoDBTailTracking Enum

228.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.mongodb.enabled

启用 mongodb 组件

true

布尔值

camel.component.mongodb.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

228.4. 在 Spring XML 中配置数据库

以下 Spring XML 创建一个用来定义与 MongoDB 实例的连接。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="mongoBean" class="com.mongodb.Mongo">
        <constructor-arg name="host" value="${mongodb.host}" />
        <constructor-arg name="port" value="${mongodb.port}" />
    </bean>
</beans>

228.5. 路由示例

Spring XML 中定义的以下路由在集合上执行操作 dbStats

获取指定集合的 DB 统计

<route>
  <from uri="direct:start" />
  <!-- using bean 'mongoBean' defined above -->
  <to uri="mongodb:mongoBean?database=${mongodb.database}&amp;collection=${mongodb.collection}&amp;operation=getDbStats" />
  <to uri="direct:result" />
</route>

228.6. MongoDB 操作 - producer 端点

228.6.1. 查询操作

228.6.1.1. findById

此操作只从 _id 字段的集合中检索一个元素,该元素与 IN 消息正文的内容匹配。传入对象可以是与 BSON 类型等效的任何内容。请参阅 http://bsonspec.org//specification[http://bsonspec.org// specification] 和 http://www.mongodb.org/display/DOCS/Java+Types

from("direct:findById")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
    .to("mock:resultFindById");
提示

支持可选参数。此操作支持指定字段过滤器。请参阅 指定可选参数

228.6.1.2. findOneByQuery

使用此操作从与 MongoDB 查询匹配的集合中检索一个元素。查询对象从 IN 消息正文中提取,即,它的类型应该是 DBObject 的类型,或者转换为 DBObject。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅 #Type 转换

没有查询的示例(返回集合的任何对象):

from("direct:findOneByQuery")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
    .to("mock:resultFindOneByQuery");

带有查询的示例(返回一个匹配的结果):

from("direct:findOneByQuery")
    .setBody().constant("{ \"name\": \"Raul Kripalani\" }")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
    .to("mock:resultFindOneByQuery");
提示

支持可选参数。此操作支持指定字段过滤器和/或排序子。请参阅 指定可选参数

228.6.1.3. findAll

findAll 操作会返回与查询匹配或 none 的所有文档,在这种情况下,当集合中包含的所有文档都会被返回。查询对象从 IN 消息正文中提取,即,它的类型应该是 DBObject 的类型,或者转换为 DBObject。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅 #Type 转换

没有查询的示例(在集合中返回所有对象):

from("direct:findAll")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
    .to("mock:resultFindAll");

带有查询的示例(返回所有匹配结果):

from("direct:findAll")
    .setBody().constant("{ \"name\": \"Raul Kripalani\" }")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
    .to("mock:resultFindAll");

以下标头支持分页和有效的检索:

标头密钥快速持续描述(从 MongoDB API doc中提取)预期类型

CamelMongoDbNumToSkip

MongoDbConstants.NUM_TO_SKIP

在光标的开头丢弃指定数量的元素。

int/Integer

CamelMongoDbLimit

MongoDbConstants.LIMIT

限制返回的元素数量。

int/Integer

CamelMongoDbBatchSize

MongoDbConstants.BATCH_SIZE

限制一个批处理中返回的元素数量。光标通常获取结果对象的批处理,并将它们保存到本地。如果 batchSize 是正数的,它代表检索的每个批处理对象的大小。可以调整它以优化性能和限制数据传输。如果 batchSize 为负数,它将限制返回的数字对象,这适用于最大批处理大小限制(通常为 4MB),光标将被关闭。例如,如果 batchSize 是 -10,则服务器将返回最多 10 个文档,并且尽可能多地在 4MB 中容纳,然后关闭光标。请注意,这个功能与文档中的 limit()不同,该文档必须在最大大小内容纳,它不再需要发送请求以关闭光标服务器。即使要迭代光标,也可以更改批处理大小,在这种情况下,设置将应用到下一个批处理检索。

int/Integer

您还可以通过包含 outputType=DBCursor (Camel 2.16+)作为 endpoint 选项,从服务器返回至您的路由的文档可能比设置上述标头更简单。这个 Exchange the DBCursor 来自 Mongo 驱动程序,就如同是在 Mongo shell 中执行 findAll ()一样,允许您的路由迭代结果。默认情况下,如果不使用此选项,此组件会将驱动程序的光标中的文档加载到列表,并将此数据返回到您的路由 - 这可能导致大量内存对象。请记住,使用 DBCursor 并不要求提供匹配的文档数量 - 请参阅 MongoDB 文档网站了解详细信息。

带有选项 outputType=DBCursor 和批处理大小 的示例:

from("direct:findAll")
    .setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
    .setBody().constant("{ \"name\": \"Raul Kripalani\" }")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll&outputType=DBCursor")
    .to("mock:resultFindAll");

findAll 操作还会返回以下 OUT 标头,以便在使用分页时迭代结果页面:

标头密钥快速持续描述(从 MongoDB API doc中提取)数据类型

CamelMongoDbResultTotalSize

MongoDbConstants.RESULT_TOTAL_SIZE

与查询匹配的对象数。这不会考虑 limit/skip。

int/Integer

CamelMongoDbResultPageSize

MongoDbConstants.RESULT_PAGE_SIZE

与查询匹配的对象数。这不会考虑 limit/skip。

int/Integer

提示

支持可选参数。此操作支持指定字段过滤器和/或排序子。请参阅 指定可选参数

228.6.1.4. 数量

返回集合中对象总数,返回 OUT 邮件正文。
以下示例将计算"dynamicCollectionName"集合中的记录数。请注意如何启用动态性,因此操作不会针对"明确的家"集合运行,而是针对"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);

从 Camel 2.14 开始,您可以提供消息正文中的 com.mongodb.DBObject 对象作为查询,操作会返回与此条件匹配的文档量。 

 

DBObject query = ...
Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");

228.6.1.5. 指定字段过滤器(项目)

默认情况下,查询操作将全部返回匹配对象(含有所有字段)。如果您的文档庞大,且您只需要检索其字段的子集,只需在所有查询操作中指定字段过滤器,只需设置相关的 DBObject (或者类型可以转换为 DBObject,如 JSON String、Map 等)在 CamelMongoDbFieldsFilter 标头上指定字段过滤器,持续快捷键:Mon DConstants.FIELDS_FILTER

下面是一个示例,它使用 MongoDB 的 BasicDBObjectBuilder 来简化 DBObject 的创建。它检索 _idboringField 以外的所有字段:

// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
DBObject fieldFilter = BasicDBObjectBuilder.start().add("_id", 0).add("boringField", 0).get();
Object result = template.requestBodyAndHeader("direct:findAll", (Object) null, MongoDbConstants.FIELDS_FILTER, fieldFilter);

228.6.1.6. 指定 sort 子句

通常需要根据特定字段排序从集合中获取 min/max 记录。在 Mongo 中,操作是使用类似如下的语法执行的:

db.collection.find().sort({_id: -1}).limit(1)
// or
db.collection.findOne({$query:{},$orderby:{_id:-1}})

在 Camel 路由中,SORT_BY 标头可与 findOneByQuery 操作一起使用,以获得相同的结果。如果还指定 FIELDS_FILTER 标头,其操作会返回可直接传递给另一个组件的单个字段/值对(例如,参数化 MyBatis SELECT 查询)。本例演示了根据文档 Timestamp 字段从集合中获取最新文档,并将结果减少到单个字段:

.from("direct:someTriggeringEvent")
.setHeader(MongoDbConstants.SORT_BY).constant("{\"documentTimestamp\": -1}")
.setHeader(MongoDbConstants.FIELDS_FILTER).constant("{\"documentTimestamp\": 1}")
.setBody().constant("{}")
.to("mongodb:myDb?database=local&collection=myDemoCollection&operation=findOneByQuery")
.to("direct:aMyBatisParameterizedSelect")
;

228.6.2. 创建/更新操作

228.6.2.1. insert

将一个新的对象插入到 MongoDB 集合中,从 IN 消息正文获取。尝试键入转换,把它换为 DBObject 或一个列表。
支持两种模式:单个插入和多个插入。对于多个插入,端点将期望一种任何类型的对象列表、数组或集合,只要它们为 - 或可以转换为 - DBObject。所有对象都被插入一次。端点将根据输入智能地决定调用(单或多个插入)哪些后端操作。

例如:

from("direct:insert")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=insert");

该操作将返回 WriteResult,并根据 WriteConcerninvokeGetLastError 选项的值被 getLastError() 调用。如果要访问写入操作的最终结果,则需要通过在 WriteResult 上调用 getLastError()getCachedLastError() 来检索 CommandResult。然后,您可以通过调用 CommandResult.ok()、CommandResult. getErrorMessage() 和/或 CommandResult.getException() 来验证结果。

请注意,新对象的 _id 在集合中必须是唯一的。如果没有指定值,MongoDB 将自动为您生成一个值。但是,如果您指定它且不唯一,插入操作将失败(对于 Camel 需要通知,您需要启用调用GetLastError 或设置 WriteConcern 会等待写结果)。

这并不是组件的限制,而是在 MongoDB 中处理更高的吞吐量。如果您使用自定义 _id,则预期在应用程序级别保持唯一性(而且这是个好的做法)。

自 Camel 2.15 开始,插入记录的 OID 存储在 CamelMongoOid 键下的消息标头中(MongoDbConstants.OID constant)。存储的值是 org.bson.types.ObjectId,用于单个插入或 java.util.List<org.bson.types.ObjectId&gt; (如果插入多个记录)。

228.6.2.2. save

save 操作等同于一个 upsert (UPdate、inSERT)操作,其中将会更新记录,如果不存在,则会插入一个 atomic 操作。MongoDB 将根据 _id 字段执行匹配。

请注意,如果更新,对象会被完全替换,且不允许使用 MongoDB 的 $mod ifier。因此,如果您要操作对象已存在,有两个选项:

  1. 执行查询以首先与所有对象一同检索整个对象(可能并不有效),在 Camel 内进行更改,然后保存它。
  2. 使用 $modifiers 的更新操作,其将在服务器端执行更新。您可以启用 upsert 标志。在这种情况下,MongoDB 将 $modifiers 应用到过滤器查询对象并插入结果。

例如:

from("direct:insert")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=save");

228.6.2.3. update

更新集合上的一个或多个记录。需要 List<DBObject> 作为 IN 消息正文,该正文正好包含 2 个元素:

  • 元素 1(index 0)IFL 过滤器查询 apiVersion 决定哪些对象会受到影响,这与典型的查询对象相同
  • 元素 2(index 1)IFL 更新规则 >_< 如何更新匹配的对象。支持 MongoDB 中的所有 修饰符操作
注意

Multiupdates .默认情况下,即使多个对象与过滤器查询匹配,MongoDB 也会更新 1 对象。要指示 MongoDB 更新所有 匹配记录,请将 CamelMongoDbMultiUpdate IN 消息标头设置为 true

带有密钥 CamelMongoDbRecords 受影响的 标头(带有更新的记录数的MongoDbConstants.RECORDS_AFFECTED constant)被更新(由 WriteResult.getN()生成)。

支持以下 IN 消息标头:

标头密钥快速持续描述(从 MongoDB API doc中提取)预期类型

CamelMongoDbMultiUpdate

MongoDbConstants.MULTIUPDATE

如果更新应应用于所有匹配对象。See http://www.mongodb.org/display/DOCS/Atomic+Operations

boolean/Boolean

CamelMongoDbUpsert

MongoDbConstants.UPSERT

如果数据库应该创建这个元素(如果不存在)

boolean/Boolean

例如,以下命令将 filterField 字段的值设为 "Darwin" 字段的值来更新其 filterField 字段等于 true 的所有记录:

// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update");
DBObject filterField = new BasicDBObject("filterField", true);
DBObject updateObj = new BasicDBObject("$set", new BasicDBObject("scientist", "Darwin"));
Object result = template.requestBodyAndHeader("direct:update", new Object[] {filterField, updateObj}, MongoDbConstants.MULTIUPDATE, true);

228.6.3. 删除操作

228.6.3.1. remove

从集合中删除匹配的记录。IN 消息正文将充当删除过滤器查询,预期为 DBObject 类型或可转换的类型。
以下示例将删除所有字段"conditionField"等于 true 的对象,位于科学数据库中(ableScientists 集合):

// route: from("direct:remove").to("mongodb:myDb?database=science&collection=notableScientists&operation=remove");
DBObject conditionField = new BasicDBObject("conditionField", true);
Object result = template.requestBody("direct:remove", conditionField);

返回带有键 CamelMongoDbRecords 受影响的 标头(带有类型为 intMongoDbConstants.RECORDS_AFFECTED constant),其中包含已删除的记录数(从 WriteResult.getN()中过期)。

228.6.4. 批量写入操作

228.6.4.1. bulkWrite

可作为 Camel 2.21 可用

批量执行写入操作,控制执行顺序。需要 List<WriteModel<DBObject > 作为 IN 消息正文,其中包含用于插入、更新和删除操作的命令。

下面的示例将插入新的科学家"Pierre Curie",将"科学家"字段的值设置为 "Marie Curie" 并使用 id "3" 删除记录:

// route: from("direct:bulkWrite").to("mongodb:myDb?database=science&collection=notableScientists&operation=bulkWrite");
List<WriteModel<DBObject>> bulkOperations = Arrays.asList(
            new InsertOneModel<>(new BasicDBObject("scientist", "Pierre Curie")),
            new UpdateOneModel<>(new BasicDBObject("_id", "5"),
                                 new BasicDBObject("$set", new BasicDBObject("scientist", "Marie Curie"))),
            new DeleteOneModel<>(new BasicDBObject("_id", "3")));

BulkWriteResult result = template.requestBody("direct:bulkWrite", bulkOperations, BulkWriteResult.class);

默认情况下,操作会按顺序执行,并在第一个写入错误上中断,而不会处理列表中任何剩余的写操作。要指示 MongoDB 继续处理列表中剩余的写操作,请将 CamelMongoDbBulkOrdered IN 邮件标题设置为 false。未排序的操作并行执行,此行为无法保证。

标头密钥快速持续描述(从 MongoDB API doc中提取)预期类型

CamelMongoDbBulkOrdered

MongoDbConstants.BULK_ORDERED

执行排序或未排序的操作执行。默认值为 true。

boolean/Boolean

228.6.5. 其他操作

228.6.5.1. aggregate

可从 Camel 2.14 开始

使用正文中包含的给定管道执行聚合。聚合可能比较长且重度的操作。谨慎使用。

// route: from("direct:aggregate").to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate");
from("direct:aggregate")
    .setBody().constant("[{ $match : {$or : [{\"scientist\" : \"Darwin\"},{\"scientist\" : \"Einstein\"}]}},{ $group: { _id: \"$scientist\", count: { $sum: 1 }} } ]")
    .to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate")
    .to("mock:resultAggregate");

支持以下 IN 消息标头:

标头密钥快速持续描述(从 MongoDB API doc中提取)预期类型

CamelMongoDbBatchSize

MongoDbConstants.BATCH_SIZE

设置每个批处理要返回的文档数量。

int/Integer

CamelMongoDbAllowDiskUse

MongoDbConstants.ALLOW_DISK_USE

启用聚合管道阶段,将数据写入临时文件。

boolean/Boolean

通过 outputType=DBCursor 支持有效的检索。

您还可以通过包含 outputType=DBCursor (Camel 2.21+)作为 endpoint 选项,从服务器返回至您的路由的文档可能比设置上述标头更简单。这了来自 Mongo 驱动程序的 DBCursor,就像您在 Mongo shell 中执行 aggregate ()一样,允许您的路由迭代结果。默认情况下,如果不使用此选项,此组件会将驱动程序的光标中的文档加载到列表,并将此数据返回到您的路由 - 这可能导致大量内存对象。请记住,使用 DBCursor 并不要求提供匹配的文档数量 - 请参阅 MongoDB 文档网站了解详细信息。

带有选项 outputType=DBCursor 和 batch 大小的示例:

// route: from("direct:aggregate").to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate");
from("direct:aggregate")
    .setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
    .setBody().constant("[{ $match : {$or : [{\"scientist\" : \"Darwin\"},{\"scientist\" : \"Einstein\"}]}},{ $group: { _id: \"$scientist\", count: { $sum: 1 }} } ]")
    .to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate&outputType=DBCursor")
    .to("mock:resultAggregate");

228.6.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 DBObject", result instanceof DBObject);

该操作将返回与 shell 中显示的数据结构,其格式为 OUT 消息正文中的 DBObject

228.6.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 DBObject", result instanceof DBObject);

该操作将返回与 shell 中显示的数据结构,其格式为 OUT 消息正文中的 DBObject

228.6.5.4. 命令

可作为 Camel 2.15 可用

在数据库上,作为命令运行正文。Usefull 用于 admin 操作,如获取主机信息、复制或分片状态。

此操作不使用 collection 参数。

// route: from("command").to("mongodb:myDb?database=science&operation=command");
DBObject commandBody = new BasicDBObject("hostInfo", "1");
Object result = template.requestBody("direct:command", commandBody);

228.6.6. 动态操作

Exchange 可以通过设置 CamelMongoDbOperation 标头(由 MongoDbConstants.OPERATION_HEADER 持续定义)来覆盖端点的固定操作。
支持的值由 MongoDbOperation 枚举决定,并与端点 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);

228.7. Tailable Cursor Consumer

MongoDB 提供了一种机制来即时消耗来自集合的持续数据,方法是使光标像对 *nix 系统的 tail -f 命令一样打开。这种机制比调度的轮询效率要高得多,因为服务器在客户端上推送新数据就会可用,而不是让客户端按计划的间隔返回来获取新数据。它还减少了其他冗余网络流量。

只需要使用尾部的光标,即集合必须是 "capped collection",这意味着它仅拥有 N 对象,并在达到限制时,MongoDB 清除旧对象与其最初插入的顺序相同。如需更多信息,请参阅 :http://www.mongodb.org/display/DOCS/Tailable+Cursors。

Camel MongoDB 组件实施尾部的光标消费者,使此功能可用于您的 Camel 路由。当新对象插入时,MongoDB 会将它们作为 DBObjects 推送为 DBObjects,以便您的可跟踪光标使用者将将其转换为交换器并将触发路由逻辑。

228.8. 尾部的光标消费者的工作方式

要将光标置于可尾部的光标中,在第一次生成光标时,会将几个特殊标记信号分配给 MongoDB。创建之后,光标将保持打开状态,并在调用 DBCursor.next () 方法时阻止,直到新数据到达为止。但是,如果新数据在非确定周期后没有出现,MongoDB 服务器保留自己要终止您的光标。如果您有兴趣继续使用新数据,则必须重新生成光标。为此,您必须记住离开的位置,或者您将再次占用率的其他位置。

Camel MongoDB tail 可移动的光标消费者为您处理所有这些任务。您只是向数据中增加性质的部分字段提供密钥,这样每次重新生成时,都将作为您的光标定位的标记,例如时间戳、后续 ID 等。它可以是 MongoDB 支持的任何数据类型。日期、字符串和 Integers 可以正常工作。我们在这个组件上下文中调用这种机制"tail 跟踪"。

使用者将记住此字段的最后值,以及每当要重新生成光标时,将通过一个过滤器(如 increase Field > lastValue )运行查询,以便只消耗非读数据。

设置 increasing 字段: 在端点 URI tailTrackingIncreasingField 选项上设置 increase 字段的键。在 Camel 2.10 中,它必须是数据中的顶层字段,目前还不支持此字段的嵌套导航。也就是说,"timestamp"字段是 okay,但"nested.timestamp"将无法工作。如果您需要支持嵌套增加的字段,请在 Camel JIRA 中创建一个 ticket。

光标重新生成延迟: 一个需要注意的是,如果新数据在初始发生时还没有提供,MongoDB 将立即终止光标。由于我们不想超过服务器,因此引进了 cursorRegenerationDelay 选项(默认值为 1000ms)。

例如:

from("mongodb:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime")
    .id("tailableCursorConsumer1")
    .autoStartup(false)
    .to("mock:test");

以上路由将消耗来自"flights.cancellations"功能的集合,使用 "departureTime" 作为 increasing 字段,默认的重新生成光标延迟为 1000ms。

228.9. 持久跟踪

标准尾部跟踪是易失性,最后一个值仅保存在内存中。但是,在实践中,您需要现在每一次重启 Camel 容器,但最后的值将会丢失,并且您的尾部光标消费者再次使用自上而来,很可能将重复的记录发送到您的路由。

要克服这种情况,您可以启用 持久的尾部跟踪 功能,以便在 MongoDB 数据库的特殊集合中跟踪最后一次消耗的值。当消费者再次指出时,它将恢复最后的跟踪值,并在没有任何情况时继续操作。

最后的 read 值会保留两个结果:每次重新生成光标以及消费者关闭的时间。在未来 5 秒内,我们可能会考虑定期持续保留时间(每 5 秒清空一次),以便在需求时增加稳健性。要请求此功能,请在 Camel JIRA 中创建一个 ticket。

228.10. 启用持久跟踪

要启用此功能,在端点 URI 中至少设置以下选项:

  • persistentTailTracking 选项为 true
  • persistentId 选项针对这个消费者的唯一标识符,以便可以在许多用户间重复使用相同的集合

另外,您还可以将 tailTrackDbtailTrackCollectiontailTrackField 选项设置为保存运行时信息的自定义。有关每个选项的描述,请参考本页顶部的端点选项表。

例如,以下路由会使用 "flights.cancellations" 容量收集,使用 "departureTime" 作为 increasing 字段,默认的重新生成光标延迟为 1000ms,并打开持久跟踪,并保留在 "flights.camelTailTracking" 的"cancellationsTracker" id 下。 在 "lastTrackingValue" 字段中存储最后处理的值(camelTailTrackinglastTrackingValue 都是默认值)。

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");

228.11. Oplog Tail Tracking

oplog 集合跟踪功能允许在 MongoDB 中实施触发器(如 MongoDB 的功能)。要激活这个集合,您必须先激活副本集。有关此主题的详情请参考 https://docs.mongodb.com/manual/tutorial/deploy-replica-set/

您可以在下面找到一个基于 Java DSL 的路由的示例,演示如何使用组件跟踪 oplog 集合的方式。在这种特定情况下,我们将过滤影响数据库中收集 客户 的事件。请注意,tailTrackIncreasingField 是一个 timestamp 字段('ts'),这意味着您必须使用带有 TIMESTAMP 值的 tailTrackingStrategy 参数。

import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mongodb.MongoDBTailTrackingEnum;
import org.apache.camel.main.Main;

import java.io.InputStream;

/**
 * For this to work you need to turn on the replica set
 * <p>
 * Commands to create a replica set:
 * <p>
 * rs.initiate( {
 * _id : "rs0",
 * members: [ { _id : 0, host : "localhost:27017" } ]
 * })
 */
public class MongoDbTracker {

    private final String database;

    private final String collection;

    private final String increasingField;

    private MongoDBTailTrackingEnum trackingStrategy;

    private int persistRecords = -1;

    private boolean persistenTailTracking;

    public MongoDbTracker(String database, String collection, String increasingField) {
        this.database = database;
        this.collection = collection;
        this.increasingField = increasingField;
    }

    public static void main(String[] args) throws Exception {
        final MongoDbTracker mongoDbTracker = new MongoDbTracker("local", "oplog.rs", "ts");
        mongoDbTracker.setTrackingStrategy(MongoDBTailTrackingEnum.TIMESTAMP);
        mongoDbTracker.setPersistRecords(5);
        mongoDbTracker.setPersistenTailTracking(true);
        mongoDbTracker.startRouter();
        // run until you terminate the JVM
        System.out.println("Starting Camel. Use ctrl + c to terminate the JVM.\n");

    }

    public void setTrackingStrategy(MongoDBTailTrackingEnum trackingStrategy) {
        this.trackingStrategy = trackingStrategy;
    }

    public void setPersistRecords(int persistRecords) {
        this.persistRecords = persistRecords;
    }

    public void setPersistenTailTracking(boolean persistenTailTracking) {
        this.persistenTailTracking = persistenTailTracking;
    }

    void startRouter() throws Exception {
        // create a Main instance
        Main main = new Main();
        main.bind(MongoConstants.CONN_NAME, new MongoClient("localhost", 27017));
        main.addRouteBuilder(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                getContext().getTypeConverterRegistry().addTypeConverter(InputStream.class, BasicDBObject.class,
                        new MongoToInputStreamConverter());
                from("mongodb://" + MongoConstants.CONN_NAME + "?database=" + database
                        + "&collection=" + collection
                        + "&persistentTailTracking=" + persistenTailTracking
                        + "&persistentId=trackerName" + "&tailTrackDb=local"
                        + "&tailTrackCollection=talendTailTracking"
                        + "&tailTrackField=lastTrackingValue"
                        + "&tailTrackIncreasingField=" + increasingField
                        + "&tailTrackingStrategy=" + trackingStrategy.toString()
                        + "&persistRecords=" + persistRecords
                        + "&cursorRegenerationDelay=1000")
                        .filter().jsonpath("$[?(@.ns=='optlog_test.customers')]")
                        .id("logger")
                        .to("log:logger?level=WARN")
                        .process(new Processor() {
                            public void process(Exchange exchange) throws Exception {
                                Message message = exchange.getIn();
                                System.out.println(message.getBody().toString());
                                exchange.getOut().setBody(message.getBody().toString());
                            }
                        });
            }
        });
        main.run();
    }
}

228.12. 类型转换

camel-mongodb 组件中包含的 MongoDbBasicConverters 类型转换器提供以下转换:

名称从类型要键入如何?

fromMapToDBObject

Map

DBObject

通过新的 BasicDBObject (Map m)构造一个新的 BasicDBObject

fromBasicDBObjectToMap

BasicDBObject

Map

BasicDBObject 已实现 Map

fromStringToDBObject

字符串

DBObject

uses com.mongodb.util.JSON.parse(String s)

fromAnyObjectToDBObject

对象 

DBObject

使用 Jackson 库 将对象转换为 Map,后者用于初始化新的 BasicDBObject

这个类型转换器会被自动发现,因此您不需要手动配置任何配置。

228.13. 另请参阅

第 229 章 MongoDB GridFS Component

作为 Camel 2.18 版提供

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mongodb-gridfs</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>

229.1. URI 格式

mongodb-gridfs:connectionBean?database=databaseName&bucket=bucketName[&moreOptions...]

229.2. MongoDB GridFS 选项

MongoDB GridFS 组件没有选项。

MongoDB GridFS 端点使用 URI 语法进行配置:

mongodb-gridfs:connectionBean

使用以下路径和查询参数:

229.2.1. 路径名(1 参数):

名称描述默认类型

connectionBean

要使用的 com.mongodb.Mongo 所需 名称。

 

字符串

229.2.2. 查询参数(17 参数):

名称描述默认类型

bucket (common)

在数据库中设置 GridFS 存储桶的名称。默认为 fs。

fs

字符串

database (common)

必需 将 MongoDB 数据库的名称设置为目标

 

字符串

readPreference (common)

在 Mongo 连接上设置 MongoDB ReadPreference。此设置将直接覆盖连接上设置的读取首选项。com.mongodb.ReadPreference#valueOf (String) utility 方法用于解析传递的 readPreference 值。某些可能值的示例为接近、主要或次要等。

 

ReadPreference

writeConcern (common)

为 MongoDB 使用标准操作的 WriteConcern 设置 WriteConcern。通过调用 WriteConcern#valueOf (String)方法,从 WriteConcern 类的字段解析。

 

WriteConcern

writeConcernRef (common)

为 MongoDB 的写操作设置 WriteConcern,将 bean ref 传递给 Registry 中存在的自定义 WriteConcern。您还可以通过在密钥中输入标准 WriteConcerns 来使用。请参阅 #setWriteConcern (String) setWriteConcern method。

 

WriteConcern

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

delay (consumer)

设置使用者内轮询之间的延迟。默认值为 500ms

500

long

fileAttributeName (consumer)

如果 QueryType 使用 FileAttribute,这会设置使用的属性的名称。默认为 camel-processed。

Camel-processed

字符串

initialDelay (consumer)

在消费者开始轮询之前设置 initialDelay。默认为 1000ms

1000

long

persistentTSCollection (consumer)

如果 QueryType 使用持久性时间戳,这会设置 DB 中集合的名称来存储时间戳。

camel-timestamps

字符串

persistentTSObject (consumer)

如果 QueryType 使用持久性时间戳,这是集合中对象的 ID 来存储时间戳。

camel-timestamp

字符串

query (consumer)

其他查询参数(在 JSON 中),用于配置在 GridFsConsumer 中查找文件的查询参数

 

字符串

queryStrategy (consumer)

设置用于轮询新文件的 QueryStrategy。默认为 Timestamp

TimeStamp

QueryStrategy

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

设置此端点将针对 GridRS 执行的操作。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

229.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.mongodb-gridfs.enabled

启用 mongodb-gridfs 组件

true

布尔值

camel.component.mongodb-gridfs.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

229.4. 在 Spring XML 中配置数据库

以下 Spring XML 创建一个用来定义与 MongoDB 实例的连接。

<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">
    <bean id="mongoBean" class="com.mongodb.Mongo">
        <constructor-arg name="host" value="${mongodb.host}" />
        <constructor-arg name="port" value="${mongodb.port}" />
    </bean>
</beans>

229.5. 路由示例

Spring XML 中定义的以下路由在集合上执行操作 findOne

从 GridFS 获取文件

<route>
  <from uri="direct:start" />
  <!-- using bean 'mongoBean' defined above -->
  <to uri="mongodb-gridfs:mongoBean?database=${mongodb.database}&amp;operation=findOne" />
  <to uri="direct:result" />
</route>

 

229.6. GridFS 操作 - producer 端点

229.6.1. 数量

返回集合中文件总数,返回 Integer 作为 OUT 消息正文。

// from("direct:count").to("mongodb-gridfs?database=tickets&operation=count");
Integer result = template.requestBodyAndHeader("direct:count", "irrelevantBody");
assertTrue("Result is not of type Long", result instanceof Integer);

您可以提供一个文件名标头,以提供与文件名匹配的文件计数。

Map<String, Object> headers = new HashMap<String, Object>();
headers.put(Exchange.FILE_NAME, "filename.txt");
Integer count = template.requestBodyAndHeaders("direct:count", query, headers);

229.6.2. listAll

返回列出以制表符分隔的流中所有文件名及其 ID 的 Reader。

// from("direct:listAll").to("mongodb-gridfs?database=tickets&operation=listAll");
Reader result = template.requestBodyAndHeader("direct:listAll", "irrelevantBody");

filename1.txt   1252314321
filename2.txt   2897651254

 

229.6.3. findOne

在 GridFS 系统中查找文件,并将正文设置为内容的 InputStream。  还提供元数据的标头。 它使用来自传入标题的 Exchange.FILE_NAME 来确定要查找的文件。

// from("direct:findOne").to("mongodb-gridfs?database=tickets&operation=findOne");
Map<String, Object> headers = new HashMap<String, Object>();
headers.put(Exchange.FILE_NAME, "filename.txt");
InputStream result = template.requestBodyAndHeaders("direct:findOne", "irrelevantBody", headers);

 

229.6.4. create

在 GridFs 数据库中创建新文件。它使用 name 的传入标题中的 Exchange.FILE_NAME,以及正文内容(作为 InputStream)作为内容。

// from("direct:create").to("mongodb-gridfs?database=tickets&operation=create");
Map<String, Object> headers = new HashMap<String, Object>();
headers.put(Exchange.FILE_NAME, "filename.txt");
InputStream stream = ... the data for the file ...
template.requestBodyAndHeaders("direct:create", stream, headers);

229.6.5. remove

从 GridFS 数据库中删除文件。

// from("direct:remove").to("mongodb-gridfs?database=tickets&operation=remove");
Map<String, Object> headers = new HashMap<String, Object>();
headers.put(Exchange.FILE_NAME, "filename.txt");
template.requestBodyAndHeaders("direct:remove", "", headers);

229.7. GridFS Consumer

另请参阅

第 230 章 MongoDB Component

作为 Camel 版本 2.19 可用

注意

Camel MongoDB3 组件使用 Mongo Driver for Java 3.4。如果您使用之前的版本,请使用 Camel MongoDB 组件。

维基百科:"NoSQL 是促进一个松散定义的非关系数据存储类的移动,该类会破坏相关数据库和 ACID 保障的长期历史记录"。 NoSQL 解决方案在过去几年中日益普及,以及一些主要使用的网站和服务(如 Facebook、LinkedIn、Twitter 等)被广泛地使用它们来实现可扩展性和敏捷性。

基本上,NoSQL 解决方案与传统 RDBMS(消息传递数据库管理系统)有所不同,他们不会将 SQL 用作查询语言,通常不提供类似于 ACID 的事务或相关数据。相反,它们围绕灵活的数据结构和模式概念而设计(假设缺少带有固定模式的数据库表的传统概念),对商业硬件的极端可扩展性以及超快处理。

MongoDB 是一个非常流行的 NoSQL 解决方案,而 camel-mongodb 组件可将 Camel 与 MongoDB 集成,允许您将 MongoDB 集合作为生产者(对集合执行操作)和消费者(由 MongoDB 集合中使用文档)进行交互。

MongoDB 会重包文档概念(而不是作为办公室文档,而是在 JSON/BSON)和集合中定义的分层数据。此组件页面会假定您熟悉它们。否则,请访问 http://www.mongodb.org/

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mongodb3</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>

230.1. URI 格式

mongodb3:connectionBean?database=databaseName&collection=collectionName&operation=operationName[&moreOptions...]

230.2. MongoDB 选项

MongoDB 组件支持 4 个选项,如下所示。

名称描述默认类型

mongoConnection (common)

设置用于连接的客户端:组件生成的所有端点将共享此连接 bean。

 

MongoClient

basicPropertyBinding (advanced)

组件是否应使用基本的属性绑定(Camel 2.x)或较新的属性绑定额外功能

false

布尔值

lazyStartProducer (producer)

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

MongoDB 端点使用 URI 语法进行配置:

mongodb3:connectionBean

使用以下路径和查询参数:

230.2.1. 路径名(1 参数):

名称描述默认类型

connectionBean

要使用的 com.mongodb.Mongo 所需 名称。

 

字符串

230.2.2. 查询参数(26 参数):

名称描述默认类型

集合 (通用)

设置要绑定到此端点的 MongoDB 集合名称

 

字符串

collectionIndex (common)

设置集合索引(JSON FORMAT : { field1 : order1, field2 : order2})

 

字符串

createCollection (common)

如果初始创建集合不存在,则进行创建。默认为 true。

true

布尔值

database (common)

将 MongoDB 数据库的名称设置为目标

 

字符串

mongoConnection (common)

设置代表后备连接的 Mongo 实例

 

MongoClient

operation (common)

设置此端点将对 MongoDB 执行的操作。

 

MongoDbOperation

outputType (common)

将制作者的输出转换为所选的类型:DocumentList Document 或 MongoIterable。DocumentList 或 MongoIterable 适用于 findAll 和 aggregate。文档适用于所有其他操作。

 

MongoDbOutputType

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

consumerType (consumer)

消费者类型。

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

lazyStartProducer (producer)

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

basicPropertyBinding (advanced)

端点是否应使用基本的属性绑定(Camel 2.x),或者较新的属性绑定额外功能

false

布尔值

cursorRegenerationDelay (advanced)

MongoDB tail 可移动的光标将阻止,直到新数据到达。如果没有插入新数据,在一段时间后,光标将自动由 MongoDB 服务器释放并关闭。如果需要,客户端应该重新生成光标。这个值指定在尝试获取新光标前要等待的时间,如果尝试失败,则指定下一次尝试前要等待的时间。默认值为 1000ms。

1000

long

dynamicity (advanced)

设定此端点是否尝试从传入的 Exchange 属性中动态解析目标数据库和集合。可用于在运行时覆盖在其他静态端点 URI 中指定的数据库和集合。默认情况下禁用它来提高性能。启用它将会获得最小的性能命中。

false

布尔值

readPreference (advanced)

配置 MongoDB 客户端将读取操作到副本集的成员。可能的值有 PRIMARY、PRIMARY_PREFERRED、SECONDARY、SECONDARY_PREFERRED 或 NEAREST

主要

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

writeConcern (advanced)

将连接配置为 bean,其级别是 MongoDB 请求给独立 mongod、Replicaet 或 cluster 的写入操作级别。可能的值有 ACKNOWLEDGED、W1、W2、W3、UNACKNOWLEDGED、JOURNALED 或 MAJORITY。

已确认

字符串

writeResultAsHeader (advanced)

在写入操作中,它会确定是否返回 WriteResult 作为 OUT 消息主体,我们将 IN 消息传输到 OUT,并将 WriteResult 作为标头附加。

false

布尔值

streamFilter (changeStream)

过滤更改流消费者的条件。

 

字符串

persistentId (tail)

一个尾部跟踪集合可为多个尾部的用户托管多个跟踪器。为了保持它们独立,每个跟踪器都应具有自己的唯一的 persistentId。

 

字符串

persistentTailTracking (tail)

启用持久跟踪跟踪,这是在系统重启后跟踪最后一次使用的消息的机制。下次系统启动后,端点将从其上停止的滑动记录中恢复光标。

false

布尔值

tailTrackCollection (tail)

个集合,其中将保留尾部跟踪信息。如果没有指定,则默认将使用 MongoDbTailTrackingConfig#DEFAULT_COLLECTION。

 

字符串

tailTrackDb (tail)

表示尾部跟踪机制将保留哪些数据库。如果未指定,则默认会选择当前数据库。即使启用,即使已启用,就不会考虑动态性,即尾部跟踪数据库不会有不同端点初始状态。

 

字符串

tailTrackField (tail)

将放置最后一个跟踪值的字段。如果没有指定,则默认使用 MongoDbTailTrackingConfig#DEFAULT_FIELD。

 

字符串

tailTrackIncreasingField (tail)

传入 记录中的关联字段(即增加的性质),每次生成时都会用来定位尾部光标。光标将被(重新)通过查询类型创建:tailTrackIncreasingField than lastValue(可能从持久跟踪中恢复)。可以是类型 Integer、Date、String 等。注意:当前不支持点符号,因此该字段应位于文档的顶级。

 

字符串

230.3. Spring Boot Auto-Configuration

在使用 Spring Boot 时,请确保使用以下 Maven 依赖项来支持自动配置:

<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-mongodb3-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.mongodb3.basic-property-binding

组件是否应使用基本的属性绑定(Camel 2.x)或较新的属性绑定额外功能

false

布尔值

camel.component.mongodb3.bridge-error-handler

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

camel.component.mongodb3.enabled

是否启用 mongodb 组件的自动配置。默认启用。

 

布尔值

camel.component.mongodb3.lazy-start-producer

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

camel.component.mongodb3.mongo-connection

设置用于连接的客户端:组件生成的所有端点将共享此连接 bean。选项是 com.mongodb.client.MongoClient 类型。

 

字符串

230.4. 在 Spring XML 中配置数据库

以下 Spring XML 创建一个用来定义与 MongoDB 实例的连接。

由于 mongo java 驱动程序 3,WriteConcern 和 readPreference 选项不可动态修改。它们在 mongoClient 对象中定义

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/data/mongo
      http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd">

  <mongo:mongo-client id="mongoBean" host="${mongo.url}" port="${mongo.port}" credentials="${mongo.user}:${mongo.pass}@${mongo.dbname}">
    <mongo:client-options write-concern="NORMAL" />
  </mongo:mongo-client>
</beans>

230.5. 路由示例

Spring XML 中定义的以下路由在集合上执行操作 dbStats

获取指定集合的 DB 统计

<route>
  <from uri="direct:start" />
  <!-- using bean 'mongoBean' defined above -->
  <to uri="mongodb3:mongoBean?database=${mongodb.database}&amp;collection=${mongodb.collection}&amp;operation=getDbStats" />
  <to uri="direct:result" />
</route>

230.6. MongoDB 操作 - producer 端点

230.6.1. 查询操作

230.6.1.1. findById

此操作只从 _id 字段的集合中检索一个元素,该元素与 IN 消息正文的内容匹配。传入对象可以是等同于 Bson 类型的任何对象。请参阅 http://bsonspec.org//specification[http://bsonspec.org// specification] 和 http://www.mongodb.org/display/DOCS/Java+Types

from("direct:findById")
    .to("mongodb3:myDb?database=flights&collection=tickets&operation=findById")
    .to("mock:resultFindById");
提示

支持可选参数。此操作支持指定字段过滤器。请参阅 指定可选参数

230.6.1.2. findOneByQuery

使用这个操作从与 MongoDB 查询匹配的集合中仅检索一个元素(第一个)。查询对象被提取为 CamelMongoDbCriteria 标头。如果 CamelMongoDbCriteria 标头为空,则会提取查询对象正文,例如: Bson 或将可转换为 Bson。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅 #Type 转换。您可以使用 MongoDB Driver 中的 Filters 类。

没有查询的示例(返回集合的任何对象):

from("direct:findOneByQuery")
    .to("mongodb3:myDb?database=flights&collection=tickets&operation=findOneByQuery")
    .to("mock:resultFindOneByQuery");

带有查询的示例(返回一个匹配的结果):

from("direct:findOneByQuery")
    .setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani"))
    .to("mongodb3:myDb?database=flights&collection=tickets&operation=findOneByQuery")
    .to("mock:resultFindOneByQuery");
提示

支持可选参数。此操作支持指定字段投射和/或排序子。请参阅 指定可选参数

230.6.1.3. findAll

findAll 操作会返回与查询匹配或 none 的所有文档,在这种情况下,当集合中包含的所有文档都会被返回。query 对象提取 CamelMongoDbCriteria 标头。如果 CamelMongoDbCriteria 标头为 null,则查询对象正在提取消息正文,即它应当键入 Bson 或转换为 Bson。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅 #Type 转换

没有查询的示例(在集合中返回所有对象):

from("direct:findAll")
    .to("mongodb3:myDb?database=flights&collection=tickets&operation=findAll")
    .to("mock:resultFindAll");

带有查询的示例(返回所有匹配结果):

from("direct:findAll")
    .setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani"))
    .to("mongodb3:myDb?database=flights&collection=tickets&operation=findAll")
    .to("mock:resultFindAll");

以下标头支持分页和有效的检索:

标头密钥快速持续描述(从 MongoDB API doc中提取)预期类型

CamelMongoDbNumToSkip

MongoDbConstants.NUM_TO_SKIP

在光标的开头丢弃指定数量的元素。

int/Integer

CamelMongoDbLimit

MongoDbConstants.LIMIT

限制返回的元素数量。

int/Integer

CamelMongoDbBatchSize

MongoDbConstants.BATCH_SIZE

限制一个批处理中返回的元素数量。光标通常获取结果对象的批处理,并将它们保存到本地。如果 batchSize 是正数的,它代表检索的每个批处理对象的大小。可以调整它以优化性能和限制数据传输。如果 batchSize 为负数,它将限制返回的数字对象,这适用于最大批处理大小限制(通常为 4MB),光标将被关闭。例如,如果 batchSize 是 -10,则服务器将返回最多 10 个文档,并且尽可能多地在 4MB 中容纳,然后关闭光标。请注意,这个功能与文档中的 limit()不同,该文档必须在最大大小内容纳,它不再需要发送请求以关闭光标服务器。即使要迭代光标,也可以更改批处理大小,在这种情况下,设置将应用到下一个批处理检索。

int/Integer

带有选项 outputType=MongoIterable 和 batch 大小示例:

from("direct:findAll")
    .setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
    .setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani"))
    .to("mongodb3:myDb?database=flights&collection=tickets&operation=findAll&outputType=MongoIterable")
    .to("mock:resultFindAll");

findAll 操作还会返回以下 OUT 标头,以便在使用分页时迭代结果页面:

标头密钥快速持续描述(从 MongoDB API doc中提取)数据类型

CamelMongoDbResultTotalSize

MongoDbConstants.RESULT_TOTAL_SIZE

与查询匹配的对象数。这不会考虑 limit/skip。

int/Integer

CamelMongoDbResultPageSize

MongoDbConstants.RESULT_PAGE_SIZE

与查询匹配的对象数。这不会考虑 limit/skip。

int/Integer

提示

支持可选参数。此操作支持指定字段投射和/或排序子。请参阅 指定可选参数

230.6.1.4. 数量

返回集合中对象总数,返回 OUT 邮件正文。
以下示例将计算"dynamicCollectionName"集合中的记录数。请注意如何启用动态性,因此操作不会针对"明确的家"集合运行,而是针对"dynamicCollectionName"集合来运行。

// from("direct:count").to("mongodb3: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 标头为空,则查询对象是提取的消息正文,即: Bson 或将可转换为 Bson。操作将返回匹配此条件的文档数量。  

Document query = ...
Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");

230.6.1.5. 指定字段过滤器(项目)

默认情况下,查询操作将全部返回匹配对象(含有所有字段)。如果您的文档较大,且您只需要检索其字段的子集,您可以在所有查询操作中指定字段过滤器,只需设置相关的 Bson (或类型转换为 Bson),如 CamelMongoDbFieldsProjection 标头上的 JSON String、Map 等。

下面是一个示例,它使用 MongoDB 的投射来简化 Bson 的创建。它检索 _idboringField 以外的所有字段:

// route: from("direct:findAll").to("mongodb3:myDb?database=flights&collection=tickets&operation=findAll")
Bson fieldProjection = Projection.exclude("_id", "boringField");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.FIELDS_PROJECTION, fieldProjection);

下面是一个示例,它使用 MongoDB 的投射来简化 Bson 的创建。它检索 _idboringField 以外的所有字段:

// route: from("direct:findAll").to("mongodb3: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);

230.6.1.6. 指定 sort 子句

通常需要根据特定字段排序从集合中获取 min/max 记录,以使用 MongoDB 的 Sorts 简化 Bson 的创建。它检索 _idboringField 以外的所有字段:

// route: from("direct:findAll").to("mongodb3: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 查询)。本例演示了根据文档 Timestamp 字段从集合中获取最新文档,并将结果减少到单个字段:

.from("direct:someTriggeringEvent")
.setHeader(MongoDbConstants.SORT_BY).constant(Sorts.descending("documentTimestamp"))
.setHeader(MongoDbConstants.FIELDS_PROJECTION).constant(Projection.include("documentTimestamp"))
.setBody().constant("{}")
.to("mongodb3:myDb?database=local&collection=myDemoCollection&operation=findOneByQuery")
.to("direct:aMyBatisParameterizedSelect")
;

230.6.2. 创建/更新操作

230.6.2.1. insert

将一个新的对象插入到 MongoDB 集合中,从 IN 消息正文获取。类型转换试图将其转换为 文档或 列表
支持两种模式:单个插入和多个插入。对于多个插入,端点将预期是任何类型的对象的 List、Array 或 Collections,只要它们是 - 或可以转换为 - 文档。例如:

from("direct:insert")
    .to("mongodb3:myDb?database=flights&collection=tickets&operation=insert");

该操作将返回 WriteResult,并根据 WriteConcerninvokeGetLastError 选项的值被 getLastError() 调用。如果要访问写入操作的最终结果,则需要通过在 WriteResult 上调用 getLastError()getCachedLastError() 来检索 CommandResult。然后,您可以通过调用 CommandResult.ok()、CommandResult. getErrorMessage() 和/或 CommandResult.getException() 来验证结果。

请注意,新对象的 _id 在集合中必须是唯一的。如果没有指定值,MongoDB 将自动为您生成一个值。但是,如果您指定它且不唯一,插入操作将失败(对于 Camel 需要通知,您需要启用调用GetLastError 或设置 WriteConcern 会等待写结果)。

这并不是组件的限制,而是在 MongoDB 中处理更高的吞吐量。如果您使用自定义 _id,则预期在应用程序级别保持唯一性(而且这是个好的做法)。

插入记录的 OID 存储在 CamelMongoOid 键(MongoDbConstants.OID constant)下的消息标头中。存储的值是 org.bson.types.ObjectId,用于单个插入或 java.util.List<org.bson.types.ObjectId&gt; (如果插入多个记录)。

在 MongoDB Java Driver 3.x 中插入One 和 insertMany 操作返回 void。Camel 插入操作会返回插入文档或文档列表。请注意,每个文档都由新的 OID 更新(如果需要)。

230.6.2.2. save

save 操作等同于一个 upsert (UPdate、inSERT)操作,其中将会更新记录,如果不存在,则会插入一个 atomic 操作。MongoDB 将基于 _id 字段执行匹配。

请注意,如果更新,对象会被完全替换,且不允许使用 MongoDB 的 $mod ifier。因此,如果您要操作对象已存在,有两个选项:

  1. 执行查询以首先与所有对象一同检索整个对象(可能并不有效),在 Camel 内进行更改,然后保存它。
  2. 使用 $modifiers 的更新操作,其将在服务器端执行更新。您可以启用 upsert 标志。在这种情况下,MongoDB 将 $modifiers 应用到过滤器查询对象并插入结果。

如果要保存的文档不包含 _id 属性,则操作将是插入,并且创建的新的 _id 将放在 CamelMongoOid 标头中。

例如:

from("direct:insert")
    .to("mongodb3:myDb?database=flights&collection=tickets&operation=save");

230.6.2.3. update

更新集合上的一个或多个记录。需要过滤器查询和更新规则。

您可以使用 MongoDBConstants.CRITERIA 标头定义为 Bson,并将更新规则定义为 Body 中的 Bson

注意

丰富后更新 .在使用 MongoDBConstants.CRITERIA 标头作为 Bson 来定义过滤器时,要在更新前查询 mongodb,您应当注意到,如果在聚合策略使用丰富的模式,则应用 mongodb 更新时,应该会发现它从聚合的交换中删除。如果您在聚合和/或重新定义 MongoDBConstants.CRITERIA 标头期间没有删除这个标头,则在发送 camel Exchange to mongodb producer 端点之前,您可能会在更新 mongodb 时出现无效的 camel Exchange payload。

第二种方法是将 List<Bson> 用作包含 2 项的 IN 消息正文:

  • 元素 1(index 0)IFL 过滤器查询 apiVersion 决定哪些对象会受到影响,这与典型的查询对象相同
  • 元素 2(index 1)IFL 更新规则 >_< 如何更新匹配的对象。支持 MongoDB 中的所有 修饰符操作
注意

Multiupdates .默认情况下,即使多个对象与过滤器查询匹配,MongoDB 也会更新 1 对象。要指示 MongoDB 更新所有 匹配记录,请将 CamelMongoDbMultiUpdate IN 消息标头设置为 true

带有密钥 CamelMongoDbRecords 受影响的 标头(带有更新的记录数的MongoDbConstants.RECORDS_AFFECTED constant)被更新(由 WriteResult.getN()生成)。

支持以下 IN 消息标头:

标头密钥快速持续描述(从 MongoDB API doc中提取)预期类型

CamelMongoDbMultiUpdate

MongoDbConstants.MULTIUPDATE

如果更新应应用于所有匹配对象。See http://www.mongodb.org/display/DOCS/Atomic+Operations

boolean/Boolean

CamelMongoDbUpsert

MongoDbConstants.UPSERT

如果数据库应该创建这个元素(如果不存在)

boolean/Boolean

例如,以下命令将 filterField 字段的值设为 "Darwin" 字段的值来更新其 filterField 字段等于 true 的所有记录:

// route: from("direct:update").to("mongodb3:myDb?database=science&collection=notableScientists&operation=update");
Bson filterField = Filters.eq("filterField", true);
String updateObj = Updates.set("scientist", "Darwin");
Object result = template.requestBodyAndHeader("direct:update", new Bson[] {filterField, Document.parse(updateObj)}, MongoDbConstants.MULTIUPDATE, true);
// route: from("direct:update").to("mongodb3: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("mongodb3:myDb?database=science&collection=notableScientists&operation=update");
String updateObj = "[{\"filterField\": true}, {\"$set\", {\"scientist\", \"Darwin\"}}]";
Object result = template.requestBodyAndHeader("direct:update", updateObj, MongoDbConstants.MULTIUPDATE, true);

230.6.3. 删除操作

230.6.3.1. remove

从集合中删除匹配的记录。IN 消息正文将充当删除过滤器查询,预期为 DBObject 类型或可转换的类型。
以下示例将删除所有字段"conditionField"等于 true 的对象,位于科学数据库中(ableScientists 集合):

// route: from("direct:remove").to("mongodb3:myDb?database=science&collection=notableScientists&operation=remove");
Bson conditionField = Filters.eq("conditionField", true);
Object result = template.requestBody("direct:remove", conditionField);

返回带有键 CamelMongoDbRecords 受影响的 标头(带有类型为 intMongoDbConstants.RECORDS_AFFECTED constant),其中包含已删除的记录数(从 WriteResult.getN()中过期)。

230.6.4. 批量写入操作

230.6.4.1. bulkWrite

可作为 Camel 2.21 可用

批量执行写入操作,控制执行顺序。需要 List<WriteModel<Document > 作为 IN 消息正文,其中包含用于插入、更新和删除操作的命令。

下面的示例将插入新的科学家"Pierre Curie",将"科学家"字段的值设置为 "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 doc中提取)预期类型

CamelMongoDbBulkOrdered

MongoDbConstants.BULK_ORDERED

执行排序或未排序的操作执行。默认值为 true。

boolean/Boolean

230.6.5. 其他操作

230.6.5.1. aggregate

使用正文中包含的给定管道执行聚合。聚合可能比较长且重度的操作。谨慎使用。

// route: from("direct:aggregate").to("mongodb3: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("mongodb3:myDb?database=science&collection=notableScientists&operation=aggregate")
    .to("mock:resultAggregate");

支持以下 IN 消息标头:

标头密钥快速持续描述(从 MongoDB API doc中提取)预期类型

CamelMongoDbBatchSize

MongoDbConstants.BATCH_SIZE

设置每个批处理要返回的文档数量。

int/Integer

CamelMongoDbAllowDiskUse

MongoDbConstants.ALLOW_DISK_USE

启用聚合管道阶段,将数据写入临时文件。

boolean/Boolean

默认情况下,返回所有结果的列表。根据结果的大小,这可能会对内存进行重度。更安全的选择是设置您的 outputType=MongoIterable。下一个处理器会在消息正文中看到一个可迭代状态,允许它逐个完成结果。因此,设置批处理大小并返回可迭代操作,以便有效地检索和处理结果。

您还可以通过包含 outputType=DBCursor (Camel 2.21+)作为 endpoint 选项,从服务器返回至您的路由的文档可能比设置上述标头更简单。这了来自 Mongo 驱动程序的 DBCursor,就像您在 Mongo shell 中执行 aggregate ()一样,允许您的路由迭代结果。默认情况下,如果不使用此选项,此组件会将驱动程序的光标中的文档加载到列表,并将此数据返回到您的路由 - 这可能导致大量内存对象。请记住,使用 DBCursor 并不要求提供匹配的文档数量 - 请参阅 MongoDB 文档网站了解详细信息。

带有选项 outputType=MongoIterable 和 batch 大小示例:

// route: from("direct:aggregate").to("mongodb3:myDb?database=science&collection=notableScientists&operation=aggregate&outputType=MongoIterable");
List<Bson> aggregate = Arrays.asList(match(or(eq("scientist", "Darwin"), eq("scientist",
        group("$scientist", sum("count", 1)));
from("direct:aggregate")
    .setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
    .setBody().constant(aggregate)
    .to("mongodb3:myDb?database=science&collection=notableScientists&operation=aggregate&outputType=MongoIterable")
    .split(body())
    .streaming()
    .to("mock:resultAggregate");

请注意,调用 .split(body()) 足以将路由一发回,但是它仍然会先将所有条目加载到内存中。因此,需要通过批处理将数据加载到内存中,需要调用 .streaming()

230.6.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("mongodb3: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 消息正文。

230.6.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("mongodb3: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 消息正文。

230.6.5.4. 命令

在数据库上,作为命令运行正文。Usefull 用于 admin 操作,如获取主机信息、复制或分片状态。

此操作不使用 collection 参数。

// route: from("command").to("mongodb3:myDb?database=science&operation=command");
DBObject commandBody = new BasicDBObject("hostInfo", "1");
Object result = template.requestBody("direct:command", commandBody);

230.6.6. 动态操作

Exchange 可以通过设置 CamelMongoDbOperation 标头(由 MongoDbConstants.OPERATION_HEADER 持续定义)来覆盖端点的固定操作。
支持的值由 MongoDbOperation 枚举决定,并与端点 URI 上的 operation 参数的接受值匹配。

例如:

// from("direct:insert").to("mongodb3: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);

230.7. 消费者

有几种类型的用户:

230.7.1. Tailable Cursor Consumer

MongoDB 提供了一种机制来即时消耗来自集合的持续数据,方法是使光标像对 *nix 系统的 tail -f 命令一样打开。这种机制比调度的轮询效率要高得多,因为服务器在客户端上推送新数据就会可用,而不是让客户端按计划的间隔返回来获取新数据。它还减少了其他冗余网络流量。

只需要使用尾部的光标,即集合必须是 "capped collection",这意味着它仅拥有 N 对象,并在达到限制时,MongoDB 清除旧对象与其最初插入的顺序相同。如需更多信息,请参阅 :http://www.mongodb.org/display/DOCS/Tailable+Cursors。

Camel MongoDB 组件实施尾部的光标消费者,使此功能可用于您的 Camel 路由。在插入新对象后,MongoDB 会将它们作为文档 推送到您的尾部光标消费者,这将将其转换为 Exchange,并触发您的路由逻辑。

230.7.1.1. 尾部的光标消费者的工作方式

要将光标置于可尾部的光标中,在第一次生成光标时,会将几个特殊标记信号分配给 MongoDB。创建后,光标将保持打开状态,并将在调用 MongoCursor.next() 方法时阻止,直到新数据到达。但是,如果新数据在非确定周期后没有出现,MongoDB 服务器保留自己要终止您的光标。如果您有兴趣继续使用新数据,则必须重新生成光标。为此,您必须记住离开的位置,或者您将再次占用率的其他位置。

Camel MongoDB tail 可移动的光标消费者为您处理所有这些任务。您只是向数据中增加性质的部分字段提供密钥,这样每次重新生成时,都将作为您的光标定位的标记,例如时间戳、后续 ID 等。它可以是 MongoDB 支持的任何数据类型。日期、字符串和 Integers 可以正常工作。我们在这个组件上下文中调用这种机制"tail 跟踪"。

使用者将记住此字段的最后值,以及每当要重新生成光标时,将通过一个过滤器(如 increase Field > lastValue )运行查询,以便只消耗非读数据。

设置 increasing 字段: 在端点 URI tailTrackingIncreasingField 选项上设置 increase 字段的键。在 Camel 2.10 中,它必须是数据中的顶层字段,目前还不支持此字段的嵌套导航。也就是说,"timestamp"字段是 okay,但"nested.timestamp"将无法工作。如果您需要支持嵌套增加的字段,请在 Camel JIRA 中创建一个 ticket。

光标重新生成延迟: 一个需要注意的是,如果新数据在初始发生时还没有提供,MongoDB 将立即终止光标。由于我们不想超过服务器,因此引进了 cursorRegenerationDelay 选项(默认值为 1000ms)。

例如:

from("mongodb3:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime")
    .id("tailableCursorConsumer1")
    .autoStartup(false)
    .to("mock:test");

以上路由将消耗来自"flights.cancellations"功能的集合,使用 "departureTime" 作为 increasing 字段,默认的重新生成光标延迟为 1000ms。

230.7.1.2. 持久跟踪

标准尾部跟踪是易失性,最后一个值仅保存在内存中。但是,在实践中,您需要现在每一次重启 Camel 容器,但最后的值将会丢失,并且您的尾部光标消费者再次使用自上而来,很可能将重复的记录发送到您的路由。

要克服这种情况,您可以启用 持久的尾部跟踪 功能,以便在 MongoDB 数据库的特殊集合中跟踪最后一次消耗的值。当消费者再次指出时,它将恢复最后的跟踪值,并在没有任何情况时继续操作。

最后的 read 值会保留两个结果:每次重新生成光标以及消费者关闭的时间。在未来 5 秒内,我们可能会考虑定期持续保留时间(每 5 秒清空一次),以便在需求时增加稳健性。要请求此功能,请在 Camel JIRA 中创建一个 ticket。

230.7.1.3. 启用持久跟踪

要启用此功能,在端点 URI 中至少设置以下选项:

  • persistentTailTracking 选项为 true
  • persistentId 选项针对这个消费者的唯一标识符,以便可以在许多用户间重复使用相同的集合

另外,您还可以将 tailTrackDbtailTrackCollectiontailTrackField 选项设置为保存运行时信息的自定义。有关每个选项的描述,请参考本页顶部的端点选项表。

例如,以下路由会使用 "flights.cancellations" 容量收集,使用 "departureTime" 作为 increasing 字段,默认的重新生成光标延迟为 1000ms,并打开持久跟踪,并保留在 "flights.camelTailTracking" 的"cancellationsTracker" id 下。 在 "lastTrackingValue" 字段中存储最后处理的值(camelTailTrackinglastTrackingValue 都是默认值)。

from("mongodb3:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime&persistentTailTracking=true" +
     "&persistentId=cancellationsTracker")
    .id("tailableCursorConsumer2")
    .autoStartup(false)
    .to("mock:test");

以下是与以上地址相同的另一个示例,但永久跟踪运行时信息将存储在 "trackers.camelTrackers" 集合中,在"lastProcessedDepartureTime"字段中:

from("mongodb3:myDb?database=flights&collection=cancellations&tailTrackIncreasingField=departureTime&persistentTailTracking=true" +
     "&persistentId=cancellationsTracker&tailTrackDb=trackers&tailTrackCollection=camelTrackers" +
     "&tailTrackField=lastProcessedDepartureTime")
    .id("tailableCursorConsumer3")
    .autoStartup(false)
    .to("mock:test");

230.7.2. 更改 Streams Consumer

通过更改流,应用程序就可以访问实时数据更改,而无需跟踪 MongoDB oplog 的复杂性和风险。应用程序可以使用更改流来订阅集合上的所有数据更改,并立即对其做出反应。由于更改流使用聚合框架,应用程序也可以过滤特定更改或转换通知。

要配置 Change Streams Consumer,您需要指定 consumerType数据库收集和 可选的 JSON 属性 streamFilter 来过滤事件。该 JSON 属性是标准 MongoDB $match 聚合。它可以通过 XML DSL 配置轻松指定:

<route id="filterConsumer">
    <from uri="mongodb3:myDb?consumerType=changeStreams&amp;database=flights&amp;collection=tickets"/>
    <to uri="mock:test"/>

    <routeProperty key="streamFilter" value="{'$match':{'$or':[{'fullDocument.stringValue': 'specificValue'}]}}"/>
</route>

Java 配置:

from("mongodb3:myDb?consumerType=changeStreams&database=flights&collection=tickets")
    .routeProperty("streamFilter", "{'$match':{'$or':[{'fullDocument.stringValue': 'specificValue'}]}}")
    .to("mock:test");

230.8. 类型转换

camel-mongodb 组件中包含的 MongoDbBasicConverters 类型转换器提供以下转换:

名称从类型要键入如何?

fromMapToDocument

Map

文档

通过 新的 Document (Map m) 构造器构建新的文档。

fromDocumentToMap

文档

Map

文档 已经实现 映射

fromStringToDocument

字符串

文档

使用 com.mongodb.Document.parse(String s)

fromAnyObjectToDocument

对象 

文档

使用 Jackson 库 将对象转换为 映射,后者又用于初始化 文档

fromStringToList

字符串

列表<Bson>

使用 org.bson.codecs.configuration.CodecRegistries 转换为 BsonArray,再转换为 List<Bson>。

这个类型转换器会被自动发现,因此您不需要手动配置任何配置。

230.9. 另请参阅

第 231 章 MQTT 组件

作为 Camel 2.10 版本提供

mqtt: 组件用于与 MQTT 兼容消息代理(如 Apache ActiveMQMosquitto)通信

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mqtt</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

231.1. URI 格式

mqtt://name[?options]

其中 name 是您要分配组件的名称。

231.2. 选项

MQTT 组件支持 4 个选项,它们如下所列。

名称描述默认类型

host (common)

要连接的 MQTT 代理的 URI,这个组件也支持 SSL -g. ssl://127.0.0.1:8883

 

字符串

userName (security)

用于对 MQTT 代理进行身份验证的用户名

 

字符串

密码 (安全)

用于对 MQTT 代理进行身份验证的密码

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

MQTT 端点使用 URI 语法配置:

mqtt:name

使用以下路径和查询参数:

231.2.1. 路径名(1 参数):

名称描述默认类型

name

要使用的逻辑名称,这不是主题名称。

 

字符串

231.2.2. 查询参数(39 参数):

名称描述默认类型

blockingExecutor (common)

SSL 连接对内部线程池执行阻塞操作,除非您调用 setBlockingExecutor 方法来配置它们将改为使用的 executor。

 

executor

byDefaultRetain (common)

发送到 MQTT 代理的消息使用的默认保留策略

false

布尔值

cleanSession (common)

如果您希望 MQTT 服务器在客户端会话之间保留主题订阅和黑名单,则设置为 false。默认值为 true。

false

布尔值

clientId (common)

使用 设置会话中的客户端。这是一个 MQTT 服务器用来识别使用 setCleanSession (false); 的会话。id 必须为 23 个字符或更少。默认为自动生成的 id (基于套接字地址、端口和时间戳)。

 

字符串

connectAttemptsMax (common)

错误报告回客户端在第一次尝试连接到服务器前的最大重新连接尝试次数。设置为 -1 来使用无限尝试。默认值为 -1。

-1

long

connectWaitInSeconds (common)

组件将等待与 MQTT 代理建立连接的延迟(以秒为单位)

10

int

disconnectWaitInSeconds (common)

组件将在 MQTT 代理上的 stop ()上等待有效断开连接的秒数

5

int

dispatchQueue (common)

HawtDispatch 分配队列用于同步对连接的访问。如果没有通过 setDispatchQueue 方法配置显式队列,则会为连接创建新队列。如果您希望多个连接共享同一队列进行同步,则设置显式队列可能是方便的。

 

DispatchQueue

host (common)

要连接的 MQTT 代理的 URI,这个组件也支持 SSL -g. ssl://127.0.0.1:8883

tcp://127.0.0.1:1883

URI

keepAlive (common)

以秒为单位配置 keep Alive 计时器。定义从客户端接收的消息之间的最大间隔时间。它使服务器能够检测到与客户端的网络连接是否已丢弃,而无需等待长的 TCP/IP 超时。

 

localAddress (common)

要使用的本地 InetAddress 和端口

 

URI

maxReadRate (common)

设定此传输将接收数据每秒的最大字节数。此设置节流的读取,因此不会超过比率。默认为 0,它禁用节流。

 

int

maxWriteRate (common)

设置此传输将在以下位置发送数据的最大字节数。此设置节流写入,因此不会超过比率。默认为 0,它禁用节流。

 

int

mqttQosPropertyName (common)

在 Exchange 上查找独立发布的消息的属性名称。如果设置了此项( AtMostOnce 或 ExactlyOnce )-那么在发送到 MQTT 消息代理的消息中会设置 QoS。

MQTTQos

字符串

mqttRetainPropertyName (common)

在 Exchange 上查找独立发布的消息的属性名称。如果设置此项(选择布尔值)- 则保留的属性将针对发送到 MQTT 消息代理的消息上设置。

MQTTRetain

字符串

mqttTopicPropertyName (common)

这些在 Exchange 中查找的属性 - 以发布至

MQTTTopicPropertyName

字符串

publishTopicName (common)

发布消息的默认主题

camel/mqtt/test

字符串

qualityOfService (common)

用于主题的服务级别质量。

AtLeastOnce

字符串

receiveBufferSize (common)

设置内部套接字接收缓冲区的大小。默认值为 65536 (64k)

65536

int

reconnectAttemptsMax (common)

在服务器连接之前向客户端报告错误前的最大重新连接尝试次数。设置为 -1 来使用无限尝试。默认值为 -1。

-1

long

reconnectBackOffMultiplier (common)

在重新连接尝试之间使用 Exponential backoff。设置为 1 可禁用 exponential backoff。默认值为 2。

2.0

double

reconnectDelay (common)

在第一次重新连接尝试前等待 ms 中的多长时间。默认值为 10。

10

long

reconnectDelayMax (common)

重新尝试之间要等待的最大时间量(以 ms 为单位)。默认值为 30,000。

30000

long

sendBufferSize (common)

设置内部套接字发送缓冲区的大小。默认值为 65536 (64k)

65536

int

sendWaitInSeconds (common)

组件在引发异常前等待来自 MQTT 代理收到确认已发布的消息的最长时间。

5

int

sslContext (common)

使用 SSLContext 配置配置安全性

 

SSLContext

subscribeTopicName (common)

deprecated These 在 Endpoint - 中设置了从 MQTT 继承的属性

 

字符串

subscribeTopicNames (common)

要查找消息的以逗号分隔的主题列表。请注意,此列表中的每一项都可以包含 MQTT 通配符(和/或 #),以便订阅在层次结构中与特定模式匹配的主题。例如,是层次结构中层次结构中所有主题的通配符,因此如果代理主题为 topics/one 和 topics/two,则主题/可用于订阅这两者。这里需要考虑的注意事项是,如果代理添加了 topics/three,路由也将开始从该主题接收消息。

 

字符串

trafficClass (common)

设置从传输发送的数据包的 IP 标头中的流量类或类型服务八位字节。默认为 8,这意味着流量应该针对吞吐量进行优化。

8

int

版本 (通用)

设置为 3.1.1,以使用 MQTT 版本 3.1.1.否则默认为 3.1 协议版本。

3.1

字符串

willMessage (common)

要发送的消息。默认为零长度。

 

字符串

willQos (common)

设置用于 Will 消息的服务质量。默认为 AT_MOST_ONCE。

AtMostOnce

QoS

willRetain (common)

如果您希望使用保留选项发布,则设置为 true。

 

QoS

willTopic (common)

如果服务器设置了服务器,如果客户端有意外断开连接,则将向指定的主题发布消息。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

lazySessionCreation (producer)

如果远程服务器启动时没有启动并运行,则会话可能会延迟以避免异常。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

231.3. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.mqtt.enabled

启用 mqtt 组件

true

布尔值

camel.component.mqtt.host

要连接的 MQTT 代理的 URI,这个组件也支持 SSL -g. ssl://127.0.0.1:8883

 

字符串

camel.component.mqtt.password

用于对 MQTT 代理进行身份验证的密码

 

字符串

camel.component.mqtt.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.mqtt.user-name

用于对 MQTT 代理进行身份验证的用户名

 

字符串

231.4. Samples

发送消息:

from("direct:foo").to("mqtt:cheese?publishTopicName=test.mqtt.topic");

消耗消息:

from("mqtt:bar?subscribeTopicName=test.mqtt.topic").transform(body().convertToString()).to("mock:result")

231.5. Endpoints

Camel 使用 Endpoint 接口支持 Message Endpoint 模式。端点通常由组件和端点创建,通常在 DSL 中通过其 URI 引用。

在端点中,您可以使用以下方法

231.6. 另请参阅

  • 配置 Camel
  • 消息端点模式
  • URIs
  • 编写组件

第 232 章 MSV 组件

可作为 Camel 版本 1.1 提供

MSV 组件使用 MSV 库和任何受支持的 XML 模式语言(如 XML SchemaRelaxNG XML 语法)执行消息正文的 XML 验证。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-msv</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

请注意,Jing 组件还支持 RelaxNG Compact 语法

232.1. URI 格式

msv:someLocalOrRemoteResource[?options]

其中,一些LocalOrRemoteResource 是类路径上本地资源的 URL,也可以是文件系统中远程资源或资源的完整 URL。例如:

msv:org/foo/bar.rng
msv:file:../foo/bar.rng
msv:http://acme.com/cheese.rng

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

232.2. 选项

MSV 组件支持 3 个选项,它们如下所列。

名称描述默认类型

schemaFactory (advanced)

使用 javax.xml.validation.SchemaFactory。

 

SchemaFactory

resourceResolverFactory (advanced)

使用依赖于动态端点资源 URI 的自定义 LSResourceResolver

 

ValidatorResource ResolverFactory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

MSV 端点使用 URI 语法配置:

msv:resourceUri

使用以下路径和查询参数:

232.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

类路径上的本地资源的 URL,或引用在 Registry 中查询 Bean 或包含 XSD 进行验证的文件系统上的远程资源或资源的完整 URL。

 

字符串

232.2.2. 查询参数(11 参数):

名称描述默认类型

failOnNullBody (producer)

如果不存在正文,是否失败。

true

布尔值

failOnNullHeader (producer)

在对标头验证时是否不存在任何标头,是否失败。

true

布尔值

headerName (producer)

要针对标头而不是邮件正文进行验证。

 

字符串

errorHandler (advanced)

要使用自定义 org.apache.camel.processor.validation.ValidatorErrorHandler。默认错误处理程序捕获错误并抛出异常。

 

ValidatorErrorHandler

resourceResolver (advanced)

要使用自定义 LSResourceResolver。不要与 resourceResolverFactory 一起使用

 

LSResourceResolver

resourceResolverFactory (advanced)

要使用依赖于动态端点资源 URI 的自定义 LSResourceResolver。默认资源解析器会工厂让资源解析程序从类路径和文件系统中读取文件。不要与 resourceResolver 一起使用。

 

ValidatorResource ResolverFactory

schemaFactory (advanced)

使用自定义 javax.xml.validation.SchemaFactory

 

SchemaFactory

schemaLanguage (advanced)

配置 W3C XML 架构命名空间 URI。

http://www.w3.org/2001/XMLSchema

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

useDom (advanced)

验证器应使用 DOMSource/DOMResult 还是 SaxSource/SaxResult。

false

布尔值

useSharedSchema (advanced)

架构实例是否应该共享。引入了这个选项来围绕 JDK 1.6.x 程序错误工作。Xerces 不应该出现这个问题。

true

布尔值

232.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.msv.enabled

启用 msv 组件

true

布尔值

camel.component.msv.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.msv.resource-resolver-factory

要使用依赖于动态端点资源 URI 的自定义 LSResourceResolver。选项是 org.apache.camel.component.validator.ValidatorResourceResolverFactory 类型。

 

字符串

camel.component.msv.schema-factory

使用 javax.xml.validation.SchemaFactory。选项是一个 javax.xml.validation.SchemaFactory 类型。

 

字符串

232.4. 示例

以下示例演示了如何 配置来自端点 direct:start 的路由,然后进入两个端点之一,可以是 mock:validmock:invalid,基于 XML 是否匹配给定的 RelaxNG XML Schema (在类路径上提供)。

232.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 233 章 Mustache 组件

作为 Camel 2.12 版本提供

mustache: 组件允许使用 Mustache 模板处理消息。这在使用 Templating 生成请求的响应时是理想的选择。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mustache</artifactId>
<version>x.x.x</version> <!-- use the same version as your Camel core version -->
</dependency>

233.1. URI 格式

mustache:templateName[?options]

其中 templateName 是要调用的模板的类路径路径 URI;或者,也可以是远程模板的完整 URL (如 file://folder/myfile.mustache)。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

233.2. 选项

Mustache 组件支持 4 个选项,它们如下所列。

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

mustacheFactory (advanced)

使用自定义 MustacheFactory

 

MustacheFactory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Mustache 端点使用 URI 语法进行配置:

mustache:resourceUri

使用以下路径和查询参数:

233.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

资源 所需的 路径。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。

 

字符串

233.2.2. 查询参数(7 参数):

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

encoding (producer)

资源内容的字符编码。

 

字符串

endDelimiter (producer)

用于标记模板代码结尾的字符。

}}

字符串

startDelimiter (producer)

用于标记模板代码开始的字符。

{{

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

233.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.mustache.enabled

启用 mustache 组件

true

布尔值

camel.component.mustache.mustache-factory

使用自定义 MustacheFactory。选项是一个 com.github.mustachejava.MustacheFactory 类型。

 

字符串

camel.component.mustache.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

233.4. Mustache 上下文

Camel 将在 Mustache 环境中提供交换信息(调整 映射)。交换 的传输如下:

keyvalue

exchange

Exchange 本身。

exchange.properties

Exchange 属性。

标头

In 消息的标头。

camelContext

Camel 上下文.

request

In 消息。

正文(body)

In message body。

response

Out 消息(仅适用于 InOut 消息交换模式)。

233.5. 动态模板

Camel 提供了两个标头,您可以为模板或模板内容本身定义不同的资源位置。如果设置了其中任何标头,Camel 会将其用于端点配置的资源。这可让您在运行时提供动态模板。

标头类型描述支持版本

MustacheConstants.MUSTACHE_RESOURCE_URI

字符串

要使用的模板资源的 URI,而不是配置的端点。

 

MustacheConstants.MUSTACHE_TEMPLATE

字符串

要使用的模板,而不使用配置的端点。

 

233.6. Samples

例如,您可以使用如下内容:

from("activemq:My.Queue").
to("mustache:com/acme/MyResponse.mustache");

使用 Mustache 模板来制定对 InOut 消息交换的消息做出响应(其中有 JMSReplyTo 标头)。

如果要使用 InOnly 并消耗信息并将其发送到您可以使用的其他目的地:

from("activemq:My.Queue").
to("mustache:com/acme/MyResponse.mustache").
to("activemq:Another.Queue");

可以指定组件应该通过标头动态使用的模板,例如:

from("direct:in").
setHeader(MustacheConstants.MUSTACHE_RESOURCE_URI).constant("path/to/my/template.mustache").
to("mustache:dummy?allowTemplateFromHeader=true");
警告

启用 allowTemplateFromHeader 选项具有安全 RAMification。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

233.7. 电子邮件示例

在本例中,我们想使用 Mustache 模板进行单次确认电子邮件。电子邮件模板在 Mustache 中进行布局,如下所示:

Dear {{headers.lastName}}}, {{headers.firstName}}

Thanks for the order of {{headers.item}}.

Regards Camel Riders Bookstore
{{body}}

233.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 234 章 MVEL 组件

作为 Camel 2.12 版本提供

mvel: 组件允许您使用 MVEL 模板处理消息。这在使用 Templating 生成请求的响应时是理想的选择。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mvel</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

234.1. URI 格式

mvel:templateName[?options]

其中 templateName 是要调用的模板的类路径路径 URI;或者,也可以是远程模板的完整 URL (如 file://folder/myfile.mvel)。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

234.2. 选项

MVEL 组件支持 2 个选项,它们如下所列。

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

MVEL 端点使用 URI 语法进行配置:

mvel:resourceUri

使用以下路径和查询参数:

234.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

资源 所需的 路径。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。

 

字符串

234.2.2. 查询参数(5 参数):

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

encoding (producer)

资源内容的字符编码。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

234.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.mvel.enabled

启用 mvel 组件

true

布尔值

camel.component.mvel.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.language.mvel.enabled

启用 mvel 语言

true

布尔值

camel.language.mvel.trim

是否修剪值是否删除前导(尾随空格和换行符)

true

布尔值

234.4. 消息标头

mvel 组件在消息上设置几个标头。

标头描述

CamelMvelResourceUri

templateName 作为 String 对象。

234.5. MVEL 上下文

Camel 将在 MVEL 上下文中提供交换信息(调整 映射)。Exchange 被传输为:

keyvalue

exchange

Exchange 本身。

exchange.properties

Exchange 属性。

标头

In 消息的标头。

camelContext

Camel 上下文手册.

request

In 消息。

in

In 消息。

正文(body)

In message body。

out

Out 消息(仅适用于 InOut 消息交换模式)。

response

Out 消息(仅适用于 InOut 消息交换模式)。

234.6. 热重新加载

mvel 模板资源默认为文件和类路径资源(expanded jar)进行热重新加载。如果您设置了 contentCache=true,Camel 只会加载资源,因此无法进行热重新加载。当资源永不改变时,可以在生产环境中使用此场景。

234.7. 动态模板

Camel 提供了两个标头,您可以为模板或模板内容本身定义不同的资源位置。如果设置了其中任何标头,Camel 会将其用于端点配置的资源。这可让您在运行时提供动态模板。

标头类型描述

CamelMvelResourceUri

字符串

要使用的模板资源的 URI,而不是配置的端点。

CamelMvelTemplate

字符串

要使用的模板,而不使用配置的端点。

234.8. Samples

例如,您可以使用如下内容:

from("activemq:My.Queue").
  to("mvel:com/acme/MyResponse.mvel");

使用 MVEL 模板来制定对 InOut 消息交换的消息的响应(其中有一个 JMSReplyTo 标头)。

要指定组件应该通过标头动态使用的模板,例如:

from("direct:in").
  setHeader("CamelMvelResourceUri").constant("path/to/my/template.mvel").
  to("mvel:dummy?allowTemplateFromHeader=true");

将模板直接指定为组件应该通过标头动态使用的标头,例如:

from("direct:in").
  setHeader("CamelMvelTemplate").constant("@{\"The result is \" + request.body * 3}\" }").
  to("velocity:dummy?allowTemplateFromHeader=true");
警告

启用 allowTemplateFromHeader 选项具有安全 RAMification。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

234.9. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 235 章 MVEL 语言

可作为 Camel 版本 2.0 提供

Camel 允许将 Mvel 用作表达式或指示 DSL 或 Xml 配置。

您可以使用 Mvel 在 Message Filter 中创建 Predicate,或作为 Recipient List 的表达式

您可以使用 Mvel dot 标记来调用操作。如果您用于实例的正文包含 POJO,它具有 getFamiliyName 方法,则可以按照如下所示构造语法:

"request.body.familyName"
   // or
"getRequest().getBody().getFamilyName()"

235.1. MVEL 选项

MVEL 语言支持 1 选项,它们如下所列。

名称默认Java 类型描述

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

235.2. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.mvel.enabled

启用 mvel 组件

true

布尔值

camel.component.mvel.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.language.mvel.enabled

启用 mvel 语言

true

布尔值

camel.language.mvel.trim

是否修剪值是否删除前导(尾随空格和换行符)

true

布尔值

235.3. 变量

变量类型描述

this

Exchange

Exchange 是 root 对象

exchange

Exchange

Exchange 对象

例外

Throwable

Exchange 异常(如果有)

exchangeId

字符串

交换 ID

故障

消息

失败消息(如果有)

Request (请求)

消息

Exchange.in 消息

响应

消息

Exchange.out 消息(如果有)

属性

map

交换属性

property(name)

对象

给定名称中的 属性

property(name, type)

类型

给定名称中的 属性作为给定类型

235.4. Samples

例如,您可以在 XML 中的 Message Filter 中使用 Mvel

<route>
  <from uri="seda:foo"/>
  <filter>
    <mvel>request.headers.foo == 'bar'</mvel>
    <to uri="seda:bar"/>
  </filter>
</route>

使用 Java DSL 的示例:

   from("seda:foo").filter().mvel("request.headers.foo == 'bar'").to("seda:bar");

235.5. 从外部资源载入脚本

可从 Camel 2.11 开始

您可以对脚本进行外部化,并使 Camel 从资源(如 "classpath:""file:""http:" )加载。
这可通过以下语法完成: "resource:scheme:location",例如参考类路径上的文件,您可以执行以下操作:

.setHeader("myHeader").mvel("resource:classpath:script.mvel")

235.6. 依赖项

要在 camel 路由中使用 Mvel,您需要添加一个实现 Mvel 语言的 camel-mvel

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-mvel</artifactId>
  <version>x.x.x</version>
</dependency>

第 236 章 MyBatis Component

可作为 Camel 版本 2.7 提供

mybatis: 组件允许您使用 MyBatis 在关系数据库中查询、轮询、插入、更新和删除数据。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mybatis</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

236.1. URI 格式

mybatis:statementName[?options]

其中 statementName 是 MyBatis XML 映射文件中的声明名称,它映射到您想要评估的查询、插入、更新或删除操作。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

此组件默认从 classpath 根加载 MyBatis SqlMapConfig 文件,其预期名称为 SqlMapConfig.xml
如果该文件位于其他位置,则需要在 MyBatisComponent 组件上配置 configurationUri 选项。

236.2. 选项

MyBatis 组件支持 3 个选项,它们如下所列。

名称描述默认类型

sqlSessionFactory (advanced)

使用 SqlSessionFactory

 

SqlSessionFactory

configurationUri (common)

MyBatis xml 配置文件的位置。默认值为:SqlMapConfig.xml 从 classpath 加载

SqlMapConfig.xml

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

MyBatis 端点使用 URI 语法配置:

mybatis:statement

使用以下路径和查询参数:

236.2.1. 路径名(1 参数):

名称描述默认类型

声明

需要 MyBatis XML 映射文件中的 语句名称,该文件映射到您要评估的查询、插入、更新或删除操作。

 

字符串

236.2.2. 查询参数(29 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

maxMessagesPerPoll (consumer)

此选项旨在将数据库池返回的结果拆分到批处理中,并将它们传送到多个交换中。此整数定义在单个交换中要交付的最大消息。默认情况下不设置最大值。可用于设置 e.g. 1000 的限制,以避免在启动存在数千台服务器时。将值设为 0 或负数可禁用它。

0

int

onConsume (consumer)

在路由中处理数据后要运行的语句

 

字符串

routeEmptyResultSet (consumer)

是否允许空 resultset 路由到下一个跃点

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

翻译( 消费者)

启用或禁用事务。如果启用,如果处理交换失败,使用者将中断处理任何进一步的交换会导致回滚预先处理

false

布尔值

useIterator (consumer)

单独处理结果,或以列表的形式处理

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

processingStrategy (consumer)

使用自定义 MyBatisProcessingStrategy

 

MyBatisProcessing Strategy

executorType (producer)

执行语句时要使用的 executor 类型。简单 - executor no special. reuse - executor reuses prepared 语句。batch - executor 重复使用语句和批处理更新。

简单

ExecutorType

inputHeader (producer)

用户 用户,输入参数的标头值,而不是消息正文。默认情况下,输入Header == null,以及输入参数从消息正文中获取。如果设置了输出Header,则使用值,并将从标头中而不是正文获取查询参数。

 

字符串

outputHeader (producer)

将查询结果存储在标题中,而不是消息正文。默认情况下,输出Header == null,并且查询结果存储在消息正文中,消息正文中的所有现有内容将被丢弃。如果设置了输出Header,则值用作存储查询结果的标头名称,并保留原始消息正文。设置输出标头也会省略默认的 CamelMyBatisResult 标头,因为它与所有时间的输出标头相同。

 

字符串

statementType (producer)

必须要指定制作者来控制要调用的操作种类。

 

StatementType

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

236.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.mybatis.configuration-uri

MyBatis xml 配置文件的位置。默认值为:SqlMapConfig.xml 从 classpath 加载

SqlMapConfig.xml

字符串

camel.component.mybatis.enabled

启用 mybatis 组件

true

布尔值

camel.component.mybatis.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.mybatis.sql-session-factory

使用 SqlSessionFactory。选项是一个 org.apache.ibatis.session.SqlSessionFactory 类型。

 

字符串

236.4. 消息标头

Camel 将使用使用的 语句填充结果消息,即 IN 或 OUT:

标头类型描述

CamelMyBatisStatementName

字符串

使用的 statementName (例如: insertAccount)。

CamelMyBatisResult

对象

在任何操作中,从 MtBatis 返回的 响应。例如,INSERT 可能会返回自动生成的密钥或行数等。

236.5. Message Body

只有在 MyBatis 的 SELECT 语句时,才会将来自 MyBatis 的响应设置为正文。例如,如果 INSERT 语句 Camel 不会替换正文。这可让您继续路由并保留原始正文。MyBatis 的响应始终存储在带有键 CamelMyBatisResult 的标头中。

236.6. Samples

例如,如果您想要使用 JMS 队列中的 Bean,并将其插入到数据库中:

from("activemq:queue:newAccount")
  .to("mybatis:insertAccount?statementType=Insert");

请注意,我们必须指定 语句类型,因为我们需要指示 Camel 要调用的操作。

其中 insertAccount 是 SQL 映射文件中的 MyBatis ID:

  <!-- Insert example, using the Account parameter class -->
  <insert id="insertAccount" parameterType="Account">
    insert into ACCOUNT (
      ACC_ID,
      ACC_FIRST_NAME,
      ACC_LAST_NAME,
      ACC_EMAIL
    )
    values (
      #{id}, #{firstName}, #{lastName}, #{emailAddress}
    )
  </insert>

236.7. 使用 statementType 更好地控制 MyBatis

当路由到 MyBatis 端点时,您需要更精细的控制,以便您可以控制要执行的 SQL 语句是否为 SELECTUPDATEDELETEINSERT 等。因此,如果实例要路由到 MyBatis 端点,其中的 IN body 包含参数到可以执行以下操作的 SELECT 语句:

在上面的代码中,我们可以调用 MyBatis 语句 选择AccountById,IN body 应该包含您要检索的帐户 ID,如 Integer 类型。

对于某些其他操作,我们可以执行相同的操作,如 SelectList

以及 UPDATE 的相同,我们可以将 Account 对象作为 IN body 发送到 MyBatis:

236.7.1. Using InsertList StatementType

可从 Camel 2.10 开始

MyBatis 允许您使用其每个批处理驱动程序插入多行。要使用这个功能,您需要使用 mapper XML 文件中的 <foreach>。例如,如下所示:

然后,您可以通过向使用 InsertList 语句类型的 mybatis 端点发送 Camel 消息来插入多行,如下所示:

236.7.2. 使用 UpdateList 语句Type

可从 Camel 2.11 开始

MyBatis 允许您使用它每个批处理驱动程序更新多行。要使用这个功能,您需要使用 mapper XML 文件中的 <foreach>。例如,如下所示:

<update id="batchUpdateAccount" parameterType="java.util.Map">
    update ACCOUNT set
    ACC_EMAIL = #{emailAddress}
    where
    ACC_ID in
    <foreach item="Account" collection="list" open="(" close=")" separator=",">
        #{Account.id}
    </foreach>
</update>

然后,您可以通过向使用 UpdateList 语句类型的 mybatis 端点发送 Camel 消息来更新多行,如下所示:

from("direct:start")
    .to("mybatis:batchUpdateAccount?statementType=UpdateList")
    .to("mock:result");

236.7.3. Using DeleteList StatementType

可从 Camel 2.11 开始

MyBatis 允许您使用其每个批处理驱动程序删除多行。要使用这个功能,您需要使用 mapper XML 文件中的 <foreach>。例如,如下所示:

<delete id="batchDeleteAccountById" parameterType="java.util.List">
    delete from ACCOUNT
    where
    ACC_ID in
    <foreach item="AccountID" collection="list" open="(" close=")" separator=",">
        #{AccountID}
    </foreach>
</delete>

然后,您可以通过向使用 DeleteList 语句类型的 mybatis 端点发送 Camel 消息来删除多行,如下所示:

from("direct:start")
    .to("mybatis:batchDeleteAccount?statementType=DeleteList")
    .to("mock:result");

236.7.4. 注意 InsertList、UpdateList 和 DeleteList statementTypes

任何类型的参数(List、Map 等)可以传递给 mybatis,最终用户则负责按照 required
按照 mybatis 动态查询 功能的帮助来进行处理。

236.7.5. 调度的轮询示例

此组件支持调度的轮询,因此可用作轮询消费者。例如,要每分钟轮询数据库:

from("mybatis:selectAllAccounts?delay=60000")
  .to("activemq:queue:allAccounts");

如需了解更多选项,请参阅 Polling Consumer 上的"ScheduledPollConsumer Options"。

另外,您可以使用另一种机制来触发调度的轮询,如 TimerQuartz 组件。 在以下示例中,我们轮询数据库,每 30 秒使用 Timer 组件并将数据发送到 JMS 队列:

from("timer://pollTheDatabase?delay=30000")
  .to("mybatis:selectAllAccounts")
  .to("activemq:queue:allAccounts");

以及使用的 MyBatis SQL 映射文件:

  <!-- Select with no parameters using the result map for Account class. -->
  <select id="selectAllAccounts" resultMap="AccountResult">
    select * from ACCOUNT
  </select>

236.7.6. 使用 onConsume

此组件支持在数据被 Camel 使用和处理 后执行 语句。这可让您在数据库中进行后更新。请注意,所有语句都必须是 UPDATE 语句。Camel 支持执行多个语句,它们的名称应该用逗号分开。

以下路由演示了我们执行 consumeAccount 语句数据已被处理。这样,我们可以更改数据库中行的状态以进行处理,因此我们可避免消耗两次或更多。

以及 sql 映射文件中的声明:

236.7.7. 参与事务

在 camel-mybatis 下设置事务管理器可能只是一小的,因为它涉及在标准的 MyBatis SqlMapConfig.xml 文件外部提供数据库配置。

第一部分需要设置 DataSource。这通常是一个池(DBCP 或 c3p0),它需要嵌套在 Spring 代理中。此代理可让 DataSource 的非 Spring 使用参与 Spring 事务(即 MyBatis SqlSessionFactory 只是此目的)。

<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg>
        <bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="org.postgresql.Driver"/>
            <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/myDatabase"/>
            <property name="user" value="myUser"/>
            <property name="password" value="myPassword"/>
        </bean>
    </constructor-arg>
</bean>

这样做的额外优点是使数据库配置通过使用属性占位符进行外部化。

然后,一个事务管理器被被配置为管理 外部数据源

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

一个 mybatis-spring SqlSessionFactoryBean,然后包装相同的 DataSource

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!-- standard mybatis config file -->
<property name="configLocation" value="/META-INF/SqlMapConfig.xml"/>
    <!-- externalised mappers -->
<property name="mapperLocations" value="classpath*:META-INF/mappers/**/*.xml"/>
</bean>

然后,camel-mybatis 组件被配置为使用该工厂:

<bean id="mybatis" class="org.apache.camel.component.mybatis.MyBatisComponent">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

最后,一个事务策略在交易管理器的顶部定义,然后可以正常使用:

<bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="txManager"/>
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>

<camelContext id="my-model-context" xmlns="http://camel.apache.org/schema/spring">
    <route id="insertModel">
        <from uri="direct:insert"/>
        <transacted ref="PROPAGATION_REQUIRED"/>
        <to uri="mybatis:myModel.insert?statementType=Insert"/>
    </route>
</camelContext>

第 237 章 MyBatis Bean Component

可作为 Camel 版本 2.22 可用

mybatis-bean: 组件允许您使用 MyBatis bean 注解来查询、插入、更新和删除关系数据库中的数据。

此组件 只能 用作制作者。如果您想要使用 MyBatis,则使用常规 mybatis 组件。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mybatis</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

此组件默认从 classpath 根加载 MyBatis SqlMapConfig 文件,其预期名称为 SqlMapConfig.xml
如果该文件位于其他位置,则需要在 MyBatisComponent 组件上配置 configurationUri 选项。

237.1. 选项

MyBatis Bean 组件支持 3 个选项,它们如下所列。

名称描述默认类型

sqlSessionFactory (advanced)

使用 SqlSessionFactory

 

SqlSessionFactory

configurationUri (producer)

MyBatis xml 配置文件的位置。默认值为:SqlMapConfig.xml 从 classpath 加载

SqlMapConfig.xml

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

MyBatis Bean 端点使用 URI 语法配置:

mybatis-bean:beanName:methodName

使用以下路径和查询参数:

237.1.1. 路径名(2 参数):

名称描述默认类型

beanName

使用 MyBatis 注释 需要 Bean 的 Name。这可以通过类型别名或 FQN 类名称。

 

字符串

methodName

对具有要执行的 SQL 查询的 bean 的方法 必填 名称。

 

字符串

237.1.2. 查询参数(4 参数):

名称描述默认类型

executorType (producer)

执行语句时要使用的 executor 类型。简单 - executor no special. reuse - executor reuses prepared 语句。batch - executor 重复使用语句和批处理更新。

简单

ExecutorType

inputHeader (producer)

用户 用户,输入参数的标头值,而不是消息正文。默认情况下,输入Header == null,以及输入参数从消息正文中获取。如果设置了输出Header,则使用值,并将从标头中而不是正文获取查询参数。

 

字符串

outputHeader (producer)

将查询结果存储在标题中,而不是消息正文。默认情况下,输出Header == null,并且查询结果存储在消息正文中,消息正文中的所有现有内容将被丢弃。如果设置了输出Header,则值用作存储查询结果的标头名称,并保留原始消息正文。设置输出标头也会省略默认的 CamelMyBatisResult 标头,因为它与所有时间的输出标头相同。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

237.2. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.mybatis-bean.configuration-uri

MyBatis xml 配置文件的位置。默认值为:SqlMapConfig.xml 从 classpath 加载

SqlMapConfig.xml

字符串

camel.component.mybatis-bean.enabled

是否启用 mybatis-bean 组件自动配置。默认启用。

 

布尔值

camel.component.mybatis-bean.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.mybatis-bean.sql-session-factory

使用 SqlSessionFactory。选项是一个 org.apache.ibatis.session.SqlSessionFactory 类型。

 

字符串

237.3. 消息标头

Camel 将使用使用的 语句填充结果消息,即 IN 或 OUT:

标头类型描述

CamelMyBatisResult

对象

在任何操作中,从 MtBatis 返回的 响应。例如,INSERT 可能会返回自动生成的密钥或行数等。

237.4. Message Body

只有在 MyBatis 的 SELECT 语句时,才会将来自 MyBatis 的响应设置为正文。例如,如果 INSERT 语句 Camel 不会替换正文。这可让您继续路由并保留原始正文。MyBatis 的响应始终存储在带有键 CamelMyBatisResult 的标头中。

237.5. Samples

例如,如果您想要使用 JMS 队列中的 Bean,并将其插入到数据库中:

from("activemq:queue:newAccount")
  .to("mybatis-bean:AccountService:insertBeanAccount");

请注意,我们必须指定 bean 名称和方法名称,因为我们需要指示 Camel 要调用的操作。

其中 AccountService 是带有 MyBatis bean 注解的 bean 类型别名。您可以在 SqlMapConfig 文件中配置类型别名:

    <typeAliases>
        <typeAlias alias="Account" type="org.apache.camel.component.mybatis.Account"/>
        <typeAlias alias="AccountService" type="org.apache.camel.component.mybatis.bean.AccountService"/>
    </typeAliases>
On the `AccountService` bean you can declare the MyBatis mappins using annotations as shown:
public interface AccountService {

    @Select("select ACC_ID as id, ACC_FIRST_NAME as firstName, ACC_LAST_NAME as lastName"
        + ", ACC_EMAIL as emailAddress from ACCOUNT where ACC_ID = #{id}")
    Account selectBeanAccountById(@Param("id") int no);

    @Select("select * from ACCOUNT order by ACC_ID")
    @ResultMap("Account.AccountResult")
    List<Account> selectBeanAllAccounts();

    @Insert("insert into ACCOUNT (ACC_ID,ACC_FIRST_NAME,ACC_LAST_NAME,ACC_EMAIL)"
        + " values (#{id}, #{firstName}, #{lastName}, #{emailAddress})")
    void insertBeanAccount(Account account);

}

第 238 章 Nagios 组件

作为 Camel 版本 2.3 可用

Nagios 组件可让您向 Nagios 发送被动检查。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-nagios</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

238.1. URI 格式

nagios://host[:port][?Options]

Camel 为 Nagios 组件提供了两个功能。您可以通过将消息发送到其端点来发送被动检查消息。
Camel 还提供了 EventNotifer,供您向 Nagios 发送通知。

238.2. 选项

Nagios 组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享的 NagiosConfiguration

 

NagiosConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Nagios 端点使用 URI 语法配置:

nagios:host:port

使用以下路径和查询参数:

238.2.1. 路径名(2 参数):

名称描述默认类型

主机

需要此项 是应发送检查的 Nagios 主机的地址。

 

字符串

port

必需的 主机端口号。

 

int

238.2.2. 查询参数(7 参数):

名称描述默认类型

connectionTimeout (producer)

millis 中的连接超时。

5000

int

sendSync (producer)

发送被动检查时是否使用同步。将它设置为 false 时,允许 Camel 继续路由消息,被动检查消息将被异步发送。

true

布尔值

timeout (producer)

在 millis 中发送超时。

5000

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

加密 (安全)

指定加密方法。

 

Encryption

encryptionMethod (security)

弃用了 指定加密方法。

 

NagiosEncryptionMethod

密码 (安全)

将检查发送到 Nagios 时要进行身份验证的密码。

 

字符串

238.3. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.nagios.configuration.connection-timeout

millis 中的连接超时。

5000

整数

camel.component.nagios.configuration.encryption

指定加密方法。

 

Encryption

camel.component.nagios.configuration.host

这是应发送检查的 Nagios 主机的地址。

 

字符串

camel.component.nagios.configuration.nagios-settings

  

NagiosSettings

camel.component.nagios.configuration.password

将检查发送到 Nagios 时要进行身份验证的密码。

 

字符串

camel.component.nagios.configuration.port

主机的端口号。

 

整数

camel.component.nagios.configuration.timeout

在 millis 中发送超时。

5000

整数

camel.component.nagios.enabled

启用 nagios 组件

true

布尔值

camel.component.nagios.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.nagios.configuration.encryption-method

指定加密方法。

 

NagiosEncryptionMethod

238.4. 发送消息示例

您可以向 Nagios 发送消息,其中消息有效负载包含消息。默认情况下,它将是 OK 级别,并使用 CamelContext 名称作为服务名称。您可以使用上方所示的标头替换这些值。

例如,我们将 Hello Nagios 消息发送到 Nagios,如下所示:

    template.sendBody("direct:start", "Hello Nagios");

    from("direct:start").to("nagios:127.0.0.1:5667?password=secret").to("mock:result");

要发送 CRITICAL 消息,您可以发送标头,例如:

        Map headers = new HashMap();
        headers.put(NagiosConstants.LEVEL, "CRITICAL");
        headers.put(NagiosConstants.HOST_NAME, "myHost");
        headers.put(NagiosConstants.SERVICE_NAME, "myService");
        template.sendBodyAndHeaders("direct:start", "Hello Nagios", headers);

238.5. Using NagiosEventNotifer

Nagios 组件还提供 EventNotifer,可用于向 Nagios 发送事件。例如,我们可以从 Java 中启用它,如下所示:

        NagiosEventNotifier notifier = new NagiosEventNotifier();
        notifier.getConfiguration().setHost("localhost");
        notifier.getConfiguration().setPort(5667);
        notifier.getConfiguration().setPassword("password");

        CamelContext context = ...
        context.getManagementStrategy().addEventNotifier(notifier);
        return context;

在 Spring XML 中,它只是使用 EventNotifier 定义 Spring bean 的问题,Camel 会在此处获取它: 使用 Spring 的 CamelContext 高级配置

238.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 239 章 NAT 组件

作为 Camel 2.17 版提供

NATS 是一个快速而可靠的消息传递平台。

Maven 用户需要将以下依赖项添加到其 pom.xml 中,以便该组件:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-nats</artifactId>
    <!-- use the same version as your Camel core version -->
    <version>x.y.z</version>
</dependency>

239.1. URI 格式

nats:servers[?options]

其中的服务器代表 NATS 服务器列表。 

239.2. 选项

Nats 组件支持 2 个选项,它们如下所列。

名称描述默认类型

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Nats 端点使用 URI 语法配置:

nats:servers

使用以下路径和查询参数:

239.2.1. 路径名(1 参数):

名称描述默认类型

servers

需要 URL 到一个或多个 NAT 服务器。在指定多个服务器时,使用逗号分隔 URL。

 

字符串

239.2.2. 查询参数(25 参数):

名称描述默认类型

connection (common)

引用已实例化连接到 Nats 服务器

 

连接

connectionTimeout (common)

连接尝试超时。(以毫秒为单位)

2000

int

flushConnection (common)

定义是否要刷新连接

false

布尔值

flushTimeout (common)

设置刷新超时(以毫秒为单位)

1000

int

maxPingsOut (common)

客户端不允许收到最多的 ping 数量

2

int

maxReconnectAttempts (common)

最大重新连接尝试

60

int

noEcho (common)

关闭 echo。如果您正在连接到此标志的 gnatsd 版本支持,则服务器如果发布在主体上有订阅,则阻止服务器将消息回显到连接。

false

布尔值

noRandomizeServers (common)

连接尝试是否随机化服务器顺序

false

布尔值

pedantic (common)

是否以 pedantic 模式运行(这会影响 performace)

false

布尔值

pingInterval (common)

ping 间隔以知道连接仍然处于活动状态(以毫秒为单位)

120000

int

reconnect (common)

是否使用 reconnection 功能

true

布尔值

reconnectTimeWait (common)

尝试重新连接前等待的时间(以毫秒为单位)

2000

int

requestCleanupInterval (common)

清理取消/超时请求的间隔。

5000

int

topic (common)

要使用 的主题名称

 

字符串

verbose (common)

是否以详细模式运行

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

maxMessages (consumer)

停止从主题接收信息,我们将在 maxMessages 后订阅

 

字符串

poolSize (consumer)

消费者池大小

10

int

queueName (consumer)

如果我们为队列配置使用 nats,则队列名称

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

replySubject (producer)

订阅者发送响应的约束

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

安全 (安全)

设置安全选项,表示需要 TLS

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

239.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.nats.enabled

启用 nats 组件

true

布尔值

camel.component.nats.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.nats.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

239.4. Headers

名称类型描述

CamelNatsMessageTimestamp

long

消耗的消息的时间戳。

  制作者示例:

from("direct:send").to("nats://localhost:4222?topic=test");

如果使用授权,您可以在服务器 URL 中直接指定凭证

from("direct:send").to("nats://username:password@localhost:4222?topic=test");

或您的令牌

from("direct:send").to("nats://token@localhost:4222?topic=test");

使用者示例:

from("nats://localhost:4222?topic=test&maxMessages=5&queueName=test").to("mock:result");

第 240 章 Netty 组件(已弃用)

作为 Camel 版本 2.3 可用

警告

此组件已弃用。您应使用 Netty4

Camel 中的 netty 组件是一个基于 Netty 项目的套接字通信组件。

Netty 是一个 NIO 客户端服务器框架,可快速轻松地开发协议服务器和客户端等网络应用程序。
Netty 大大简化和简化 TCP 和 UDP 套接字服务器等网络编程。

此 camel 组件支持制作者和消费者端点。

Netty 组件具有多个选项,允许对多个 TCP/UDP 通信参数(buffer 大小、keepAlives、tcpNoDelay 等)进行精细控制,并促进 Camel 路由上仅限和非范围通信。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-netty</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

240.1. URI 格式

netty 组件的 URI 方案如下

netty:tcp://0.0.0.0:99999[?options]
netty:udp://remotehost:99999/[?options]

此组件支持 TCP 和 UDP 的生产者和消费者端点。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

240.2. 选项

Netty 组件支持 4 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

在创建端点时,使用 NettyConfiguration 作为配置。

 

NettyConfiguration

maximumPoolSize (advanced)

订购的线程池的默认池大小(若使用)。默认值为 16。

16

int

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Netty 端点使用 URI 语法进行配置:

netty:protocol:host:port

使用以下路径和查询参数:

240.2.1. 路径名(3 参数):

名称描述默认类型

protocol

要求使用 协议(可以是 tcp 或 udp)。

 

字符串

主机

所需的 主机名。对于使用者,主机名为 localhost 或 0.0.0.0,hostname 是要连接的远程主机

 

字符串

port

所需的 主机端口号

 

int

240.2.2. 查询参数(67 参数):

名称描述默认类型

disconnect (common)

使用后是否立即断开(关闭)与 Netty Channel 的连接。可用于使用者和制作者。

false

布尔值

keepAlive (common)

设置 以确保因为不活跃而关闭套接字

true

布尔值

reuseAddress (common)

设置 以便于套接字多路

true

布尔值

sync (common)

设置 将端点设置为单向或请求响应

true

布尔值

tcpNoDelay (common)

设置 来提高 TCP 协议性能

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

broadcast (consumer)

设置以通过 UDP 选择多播

false

布尔值

clientMode (consumer)

如果 clientMode 为 true,netty 消费者将地址连接为 TCP 客户端。

false

布尔值

backlog (consumer)

允许为 netty 消费者(server)配置积压。请注意,积压只是取决于操作系统的最佳工作。将此选项设置为 200、500 或 1000 之类的值,告知 TCP 堆栈在未配置此选项时接受队列的时长,如果不配置这个选项,则后端日志依赖于 OS 设置。

 

int

bossCount (consumer)

当 netty 在 nio 模式上工作时,它使用 Netty 中的默认 位于Count 参数,即 1。用户可使用此操作覆盖 Netty 中的默认 bossCount

1

int

bossPool (consumer)

使用显式 org.jboss.netty.channel.socket.nio.BossPool 作为 boss 线程池。例如,使用多个用户共享线程池。默认情况下,每个使用者都有自己的 boss 池,其中包含 1 个核心线程。

 

BossPool

channelGroup (consumer)

使用显式 ChannelGroup。

 

ChannelGroup

disconnectOnNoReply (consumer)

如果启用了同步,则此选项将指定 NettyConsumer,如果它应该断开连接,没有回复回复。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

maxChannelMemorySize (consumer)

使用排序ThreadPoolExecutor 时每个频道的已排队事件的最大总大小。指定要禁用的 0。

10485760

long

maxTotalMemorySize (consumer)

使用排序ThreadPoolExecutor 时,这个池的已排队事件的最大总大小。指定要禁用的 0。

209715200

long

nettyServerBootstrapFactory (consumer)

使用自定义 NettyServerBootstrapFactory

 

NettyServerBootstrap Factory

networkInterface (consumer)

在使用 UDP 时,此选项可根据其名称指定网络接口,如 eth0 来加入多播组。

 

字符串

noReplyLogLevel (consumer)

如果启用了同步,则此选项指定在日志记录没有回复时要使用的 NettyConsumer。

WARN

LoggingLevel

orderedThreadPoolExecutor (consumer)

是否使用排序的线程池,确保事件在同一频道中按顺序处理。详情请查看 org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor 的 netty javadoc。

true

布尔值

serverClosedChannel ExceptionCaughtLogLevel (consumer)

如果服务器(NettyConsumer)捕获 java.nio.channels.ClosedChannelException,则使用这个日志记录级别登录。这用于避免记录关闭频道例外,因为客户端可以断开,然后在 Netty 服务器中造成意外的异常。

DEBUG

LoggingLevel

serverExceptionCaughtLog Level (consumer)

如果服务器(NettyConsumer)捕获异常,则使用此日志记录级别记录。

WARN

LoggingLevel

serverPipelineFactory (consumer)

使用自定义服务器PipelineFactory

 

ServerPipelineFactory

workerCount (consumer)

当 netty 在 nio 模式下工作时,它会使用来自 Netty 的默认 workerCount 参数,即 cpu_core_threads2。用户可使用此操作覆盖 Netty 中的默认 workerCount

 

int

workerPool (consumer)

使用显式 org.jboss.netty.channel.socket.nio.WorkerPool 作为 worker 线程池。例如,使用多个用户共享线程池。默认情况下,每个使用者都有自己的 worker 池,其中有 2 个 x cpu 数核心线程。

 

WorkerPool

connectTimeout (producer)

等待套接字连接可用的时间。值为 millis。

10000

long

requestTimeout (producer)

允许在调用远程服务器时为 Netty producer 使用超时。默认情况下,不使用超时。该值在 milli 秒内,因此 eg 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 触发超时。

 

long

clientPipelineFactory (producer)

使用自定义 ClientPipelineFactory

 

ClientPipelineFactory

lazyChannelCreation (producer)

如果远程服务器在 Camel 制作者启动时未启动并运行,可以先创建频道来避免异常。

true

布尔值

producerPoolEnabled (producer)

制作者池是否启用。重要:不要关闭它,因为需要池处理并发且可靠的请求/回复。

true

布尔值

producerPoolMaxActive (producer)

设置可由池分配的对象数量(签出到客户端,或者在给定时间闲置等待签出)。在没有限制的情况下使用负值。

-1

int

producerPoolMaxIdle (producer)

设置池中空闲实例的数量。

100

int

producerPoolMinEvictable Idle (producer)

在对象满足闲置对象驱除前,对象可能会处于空闲时间(millis)的最少时间(以 millis)设置。

300000

long

producerPoolMinIdle (producer)

在驱除器线程(如果活跃)生成新对象前,设置制作池中允许的实例的最小数量。

 

int

udpConnectionlessSending (producer)

此选项支持 udp 发送较少连接,这是实际触发和忘记。连接的 udp 会发送 PortUnreachableException(如果没有这些端口侦听接收端口)。

false

布尔值

useChannelBuffer (producer)

如果 useChannelBuffer 为 true,则 netty producer 将把消息正文转变为 ChannelBuffer,然后再将其发送。

false

布尔值

bootstrapConfiguration (advanced)

要使用自定义配置的 NettyServerBootstrapConfiguration 来配置这个端点。

 

NettyServerBootstrap Configuration

选项 (高级)

允许使用 选项作为前缀来配置额外的 netty 选项。例如,option.child.keepAlive=false,以设置 netty 选项 child.keepAlive=false。有关可以使用的可能选项,请参阅 Netty 文档。

 

map

receiveBufferSize (advanced)

要在入站通信中使用的 TCP/UDP 缓冲大小。大小为字节。

65536

long

receiveBufferSizePredictor (advanced)

配置缓冲区大小预测器。请参阅 Jetty 文档和这个邮件线程的详细信息。

 

int

sendBufferSize (advanced)

在出站通信期间使用的 TCP/UDP 缓冲大小。大小为字节。

65536

long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

transferExchange (advanced)

仅用于 TCP。您可以通过线路来传输交换,而不是只是正文。以下字段会被传输:在正文、传出正文、错误正文、标题、错误标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

allowDefaultCodec (codec)

如果既是,netty 组件都会安装一个默认的 codec,则 encoder/decoder 是 null,文本行是 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件作为过滤器链中的第一个元素安装默认 codec。

true

布尔值

autoAppendDelimiter (codec)

在使用文本 codec 发送时,是否自动附加缺少的最终分隔符。

true

布尔值

decoder (codec)

弃用了 一个自定义 ChannelHandler 类,可用于执行入站有效负载的特殊摘要。Must override org.jboss.netty.channel.ChannelUpStreamHandler.

 

ChannelHandler

decoderMaxLineLength (codec)

用于文本行代码的最大行长度。

1024

int

decoders (codec)

要使用的解码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

字符串

delimiter (codec)

用于文本行代码的分隔符。可能的值有 LINE 和 NULL。

TextLineDelimiter

encoder (codec)

弃用了 一个自定义 ChannelHandler 类,可用于对出站有效负载执行特殊汇总。Must override org.jboss.netty.channel.ChannelDownStreamHandler.

 

ChannelHandler

encoders (codec)

要使用的编码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

字符串

encoding (codec)

用于文本代码的编码(一个 charset 名称)。如果没有提供,Camel 将使用 JVM 默认 Charset。

 

字符串

textline (codec)

仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的 codec;如果未指定或值为 false,则通过 TCP 假定 Object Serialization。

false

布尔值

enabledProtocols (security)

使用 SSL 时要启用哪些协议

TLSv1,TLSv1.1,TLSv1.2

字符串

keyStoreFile (security)

用于加密的客户端证书密钥存储

 

File

keyStoreFormat (security)

用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS

JKS

字符串

keyStoreResource (security)

用于加密的客户端侧证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

needClientAuth (security)

配置服务器在使用 SSL 时是否需要客户端身份验证。

false

布尔值

密语 (安全性)

要使用的密码设置,用于加密/解密使用 SSH 发送的有效负载

 

字符串

securityProvider (security)

用于有效负载加密的安全供应商。如果没有设置,则默认为 SunX509。

SunX509

字符串

SSL (安全性)

设置以指定是否将 SSL 加密应用到此端点

false

布尔值

sslClientCertHeaders (security)

在 SSL 模式中启用和启用后,Netty consumer 将增强 Camel 消息以及包含客户端证书信息(如主题名称、签发者名称、序列号和有效日期范围)的信息。

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

sslHandler (security)

对可用于返回 SSL 处理程序的类的引用

 

SslHandler

trustStoreFile (security)

用于加密的服务器端证书密钥存储

 

File

trustStoreResource (security)

用于加密的服务器端证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

240.3. Spring Boot Auto-Configuration

组件支持 70 个选项,它们如下所列。

名称描述默认类型

camel.component.netty.configuration.allow-default-codec

如果既是,netty 组件都会安装一个默认的 codec,则 encoder/decoder 是 null,文本行是 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件作为过滤器链中的第一个元素安装默认 codec。

true

布尔值

camel.component.netty.configuration.auto-append-delimiter

在使用文本 codec 发送时,是否自动附加缺少的最终分隔符。

true

布尔值

camel.component.netty.configuration.backlog

允许为 netty 消费者(server)配置积压。请注意,积压只是取决于操作系统的最佳工作。将此选项设置为 200、500 或 1000 之类的值,告知 TCP 堆栈在未配置此选项时接受队列的时长,如果不配置这个选项,则后端日志依赖于 OS 设置。

 

整数

camel.component.netty.configuration.boss-count

当 netty 在 nio 模式上工作时,它使用 Netty 中的默认 位于Count 参数,即 1。用户可使用此操作覆盖 Netty 中的默认 bossCount

1

整数

camel.component.netty.configuration.boss-pool

使用显式 org.jboss.netty.channel.socket.nio.BossPool 作为 boss 线程池。例如,使用多个用户共享线程池。默认情况下,每个使用者都有自己的 boss 池,其中包含 1 个核心线程。

 

BossPool

camel.component.netty.configuration.broadcast

设置以通过 UDP 选择多播

false

布尔值

camel.component.netty.configuration.channel-group

使用显式 ChannelGroup。

 

ChannelGroup

camel.component.netty.configuration.client-mode

如果 clientMode 为 true,netty 消费者将地址连接为 TCP 客户端。

false

布尔值

camel.component.netty.configuration.client-pipeline-factory

使用自定义 ClientPipelineFactory

 

ClientPipelineFactory

camel.component.netty.configuration.connect-timeout

等待套接字连接可用的时间。值为 millis。

10000

Long

camel.component.netty.configuration.decoder-max-line-length

用于文本行代码的最大行长度。

1024

整数

camel.component.netty.configuration.decoders

要使用的解码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

list

camel.component.netty.configuration.delimiter

用于文本行代码的分隔符。可能的值有 LINE 和 NULL。

 

TextLineDelimiter

camel.component.netty.configuration.disconnect

使用后是否立即断开(关闭)与 Netty Channel 的连接。可用于使用者和制作者。

false

布尔值

camel.component.netty.configuration.disconnect-on-no-reply

如果启用了同步,则此选项将指定 NettyConsumer,如果它应该断开连接,没有回复回复。

true

布尔值

camel.component.netty.configuration.enabled-protocols

使用 SSL 时要启用哪些协议

TLSv1,TLSv1.1,TLSv1.2

字符串

camel.component.netty.configuration.encoders

要使用的编码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

list

camel.component.netty.configuration.encoding

用于文本代码的编码(一个 charset 名称)。如果没有提供,Camel 将使用 JVM 默认 Charset。

 

字符串

camel.component.netty.configuration.host

主机名.对于使用者,主机名为 localhost 或 0.0.0.0,hostname 是要连接的远程主机

 

字符串

camel.component.netty.configuration.keep-alive

设置 以确保因为不活跃而关闭套接字

true

布尔值

camel.component.netty.configuration.key-store-format

用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS

JKS

字符串

camel.component.netty.configuration.key-store-resource

用于加密的客户端侧证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

camel.component.netty.configuration.lazy-channel-creation

如果远程服务器在 Camel 制作者启动时未启动并运行,可以先创建频道来避免异常。

true

布尔值

camel.component.netty.configuration.max-channel-memory-size

使用排序ThreadPoolExecutor 时每个频道的已排队事件的最大总大小。指定要禁用的 0。

10485760

Long

camel.component.netty.configuration.max-total-memory-size

使用排序ThreadPoolExecutor 时,这个池的已排队事件的最大总大小。指定要禁用的 0。

209715200

Long

camel.component.netty.configuration.need-client-auth

配置服务器在使用 SSL 时是否需要客户端身份验证。

false

布尔值

camel.component.netty.configuration.netty-server-bootstrap-factory

使用自定义 NettyServerBootstrapFactory

 

NettyServerBootstrap Factory

camel.component.netty.configuration.network-interface

在使用 UDP 时,此选项可根据其名称指定网络接口,如 eth0 来加入多播组。

 

字符串

camel.component.netty.configuration.no-reply-log-level

如果启用了同步,则此选项指定在日志记录没有回复时要使用的 NettyConsumer。

 

LoggingLevel

camel.component.netty.configuration.options

允许使用 选项作为前缀来配置额外的 netty 选项。例如,option.child.keepAlive=false,以设置 netty 选项 child.keepAlive=false。有关可以使用的可能选项,请参阅 Netty 文档。

 

map

camel.component.netty.configuration.ordered-thread-pool-executor

是否使用排序的线程池,确保事件在同一频道中按顺序处理。详情请查看 org.jboss .netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor 的 netty javadoc。

true

布尔值

camel.component.netty.configuration.passphrase

要使用的密码设置,用于加密/解密使用 SSH 发送的有效负载

 

字符串

camel.component.netty.configuration.port

主机端口号

 

整数

camel.component.netty.configuration.producer-pool-enabled

制作者池是否启用。重要:不要关闭它,因为需要池处理并发且可靠的请求/回复。

true

布尔值

camel.component.netty.configuration.producer-pool-max-active

设置可由池分配的对象数量(签出到客户端,或者在给定时间闲置等待签出)。在没有限制的情况下使用负值。

-1

整数

camel.component.netty.configuration.producer-pool-max-idle

设置池中空闲实例的数量。

100

整数

camel.component.netty.configuration.producer-pool-min-evictable-idle

在对象满足闲置对象驱除前,对象可能会处于空闲时间(millis)的最少时间(以 millis)设置。

300000

Long

camel.component.netty.configuration.producer-pool-min-idle

在驱除器线程(如果活跃)生成新对象前,设置制作池中允许的实例的最小数量。

 

整数

camel.component.netty.configuration.protocol

要使用的协议,可以是 tcp 或 udp。

 

字符串

camel.component.netty.configuration.receive-buffer-size

要在入站通信中使用的 TCP/UDP 缓冲大小。大小为字节。

65536

Long

camel.component.netty.configuration.receive-buffer-size-predictor

配置缓冲区大小预测器。请参阅 Jetty 文档和这个邮件线程的详细信息。

 

整数

camel.component.netty.configuration.request-timeout

允许在调用远程服务器时为 Netty producer 使用超时。默认情况下,不使用超时。该值在 milli 秒内,因此 eg 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 触发超时。

 

Long

camel.component.netty.configuration.reuse-address

设置 以便于套接字多路

true

布尔值

camel.component.netty.configuration.security-provider

用于有效负载加密的安全供应商。如果没有设置,则默认为 SunX509。

SunX509

字符串

camel.component.netty.configuration.send-buffer-size

在出站通信期间使用的 TCP/UDP 缓冲大小。大小为字节。

65536

Long

camel.component.netty.configuration.server-closed-channel-exception-caught-log-level

如果服务器(NettyConsumer)捕获 java.nio.channels.ClosedChannelException,则使用这个日志记录级别登录。这用于避免记录关闭频道例外,因为客户端可以断开,然后在 Netty 服务器中造成意外的异常。

 

LoggingLevel

camel.component.netty.configuration.server-exception-caught-log-level

如果服务器(NettyConsumer)捕获异常,则使用此日志记录级别记录。

 

LoggingLevel

camel.component.netty.configuration.server-pipeline-factory

使用自定义服务器PipelineFactory

 

ServerPipelineFactory

camel.component.netty.configuration.ssl

设置以指定是否将 SSL 加密应用到此端点

false

布尔值

camel.component.netty.configuration.ssl-client-cert-headers

在 SSL 模式中启用和启用后,Netty consumer 将增强 Camel 消息以及包含客户端证书信息(如主题名称、签发者名称、序列号和有效日期范围)的信息。

false

布尔值

camel.component.netty.configuration.ssl-context-parameters

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

camel.component.netty.configuration.ssl-handler

对可用于返回 SSL 处理程序的类的引用

 

SslHandler

camel.component.netty.configuration.sync

设置 将端点设置为单向或请求响应

true

布尔值

camel.component.netty.configuration.tcp-no-delay

设置 来提高 TCP 协议性能

true

布尔值

camel.component.netty.configuration.textline

仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的 codec;如果未指定或值为 false,则通过 TCP 假定 Object Serialization。

false

布尔值

camel.component.netty.configuration.transfer-exchange

仅用于 TCP。您可以通过线路来传输交换,而不是只是正文。以下字段会被传输:在正文、传出正文、错误正文、标题、错误标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

camel.component.netty.configuration.trust-store-resource

用于加密的服务器端证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

camel.component.netty.configuration.udp-connectionless-sending

此选项支持 udp 发送较少连接,这是实际触发和忘记。连接的 udp 会发送 PortUnreachableException(如果没有这些端口侦听接收端口)。

false

布尔值

camel.component.netty.configuration.use-channel-buffer

如果 useChannelBuffer 为 true,则 netty producer 将把消息正文转变为 ChannelBuffer,然后再将其发送。

false

布尔值

camel.component.netty.configuration.worker-count

当 netty 在 nio 模式下工作时,它会使用来自 Netty 的默认 workerCount 参数,即 cpu_core_threads2。用户可使用此操作覆盖 Netty 中的默认 workerCount

 

整数

camel.component.netty.configuration.worker-pool

使用显式 org.jboss.netty.channel.socket.nio.WorkerPool 作为 worker 线程池。例如,使用多个用户共享线程池。默认情况下,每个使用者都有自己的 worker 池,其中有 2 个 x cpu 数核心线程。

 

WorkerPool

camel.component.netty.enabled

启用 netty 组件

true

布尔值

camel.component.netty.maximum-pool-size

订购的线程池的默认池大小(若使用)。默认值为 16。

16

整数

camel.component.netty.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.netty.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

camel.component.netty.configuration.decoder

自定义 ChannelHandler 类,可用于执行入站有效负载的特殊汇总。Must override org.jboss.netty.channel.ChannelUpStreamHandler.

 

ChannelHandler

camel.component.netty.configuration.encoder

自定义 ChannelHandler 类,可用于对出站有效负载进行特殊汇总。Must override org.jboss.netty.channel.ChannelDownStreamHandler.

 

ChannelHandler

camel.component.netty.configuration.key-store-file

用于加密的客户端证书密钥存储

 

File

camel.component.netty.configuration.maximum-pool-size

  

整数

camel.component.netty.configuration.trust-store-file

用于加密的服务器端证书密钥存储

 

File

240.4. 基于 registry 的选项

codec Handler 和 SSL 密钥存储可以列在 registry 中,例如在 Spring XML 文件中。可以传递的值如下:

名称描述

passphrase

要使用的密码设置来加密/使用 SSH 发送的有效负载

keyStoreFormat

用于有效负载加密的密钥存储格式。如果没有设置,则默认为 "JKS"

securityProvider

用于有效负载加密的安全供应商。如果没有设置,则默认为 "SunX509"。

keyStoreFile

弃用: 用于加密的客户端侧证书密钥存储

trustStoreFile

弃用: 用于加密的服务器侧证书密钥存储

keyStoreResource

Camel 2.11.1: 要用于加密的客户端侧证书密钥存储。默认情况下,由 classpath 加载,但您可以使用 "classpath:""file:""http:" 前缀来从不同的系统加载资源。

trustStoreResource

Camel 2.11.1: 用于加密的服务器侧证书密钥存储。默认情况下,由 classpath 加载,但您可以使用 "classpath:""file:""http:" 前缀来从不同的系统加载资源。

sslHandler

对可用于返回 SSL 处理程序的类的引用

encoder

自定义 ChannelHandler 类,可用于执行出站有效负载的特殊包。Must override org.jboss.netty.channel.ChannelDownStreamHandler.

encorders

要使用的编码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

decoder

自定义 ChannelHandler 类,可用于执行入站有效负载的特殊摘要。Must override org.jboss.netty.channel.ChannelUpStreamHandler.

decoders

要使用的解码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

重要信息: 以下关于使用不可共享编码器/解密代码器的阅读。

240.4.1. 使用非共享的编码或解码器

如果您的编码或解码器无法共享(例如,具有 @Shareable 类注释),则您的 encoder/decoder 必须实施 org.apache.camel.component.netty.ChannelHandlerFactory 接口,并在 newChannelHandler 方法中返回新实例。这是为了确保安全使用编码器/编码器。否则,当创建端点时 Netty 组件会记录 WARN。

Netty 组件提供了 org.apache.camel.component.netty.ChannelHandler factory 类,它含有一些常用方法。

240.5. 将消息发送到/从 Netty 端点

240.5.1. Netty Producer

在 Producer 模式中,组件提供了使用 TCP 或 UDP 协议(具有可选 SSL 支持)将有效负载发送到套接字端点
的功能。

制作者模式支持单向和基于请求响应的操作。

240.5.2. Netty Consumer

在 Consumer 模式中,组件提供以下功能:

  • 使用 TCP 或 UDP 协议侦听指定的套接字(具有可选的 SSL 支持)
  • 使用文本/xml、二进制和序列化对象有效负载和接收套接字上的请求
  • 将它们与路由一起作为消息交换。

消费者模式支持单向和基于请求响应的操作。

240.6. Headers

为 Netty consumer 创建的交换填充了以下标头:

标头密钥描述

NettyConstants.NETTY_CHANNEL_HANDLER_CONTEXT / CamelNettyChannelHandlerContext

org.jboss.netty.channel.ChannelHandlerContext

'ChannelHandlerContext 'instance associated with the connection by netty.

NettyConstants.NETTY_MESSAGE_EVENT / CamelNettyMessageEvent

org.jboss.netty.channel.MessageEvent

'MessageEvent 'instance associated the connection by netty.

NettyConstants.NETTY_REMOTE_ADDRESS / CamelNettyRemoteAddress

java.net.SocketAddress

传入套接字连接的远程地址。

NettyConstants.NETTY_LOCAL_ADDRESS / CamelNettyLocalAddress

java.net.SocketAddress

传入套接字连接的本地地址。

240.7. 使用示例

240.7.1. 使用 Request-Reply 和 serialized 对象有效负载的 UDP Netty 端点

RouteBuilder builder = new RouteBuilder() {
  public void configure() {
    from("netty:udp://0.0.0.0:5155?sync=true")
      .process(new Processor() {
         public void process(Exchange exchange) throws Exception {
           Poetry poetry = (Poetry) exchange.getIn().getBody();
           poetry.setPoet("Dr. Sarojini Naidu");
           exchange.getOut().setBody(poetry);
         }
       }
    }
};

240.7.2. 使用单向通信基于 TCP 的 Netty consumer 端点

RouteBuilder builder = new RouteBuilder() {
  public void configure() {
       from("netty:tcp://0.0.0.0:5150")
           .to("mock:result");
  }
};

240.7.3. 使用 Request-Reply 通信基于 SSL/TCP 的 Netty 消费者端点

使用 JSSE 配置实用程序

从 Camel 2.9 开始,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 配置

JndiRegistry registry = new JndiRegistry(createJndiContext());
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.createRegistry(registry);
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 和客户端证书访问权限

可作为 Camel 2.12 提供

如果要访问 javax.net.ssl.SSLSession,则可获得有关客户端证书的详细信息。当 ssl=true 时,Netty 组件会将 SSLSession 存储为 Camel 消息上的标头,如下所示: ???

SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class);
// get the first certificate which is client certificate
javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0];
Principal principal = cert.getSubjectDN();

请记住,要设置 需要ClientAuth=true 以验证客户端,否则 SSLSession 无法访问客户端证书的信息,并且您可能会获得一个例外 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated。如果客户端证书过期或者无效等,您也可能会得到这个异常。

提示

选项 sslClientCertHeaders 可以设置为 true,然后使用包含客户端证书详情的标题增强 Camel 消息消息。例如,在标题 CamelNettySSLClientCertSubjectName 中可轻松获取主题名称。

240.7.4. 使用多代码

在某些情况下,可能需要将编码器和解码器链添加到 netty 管道。要将 multpile codecs 添加到 camel netty 端点,应使用 'encoders' 和 'decoders' uri 参数。与 'encoder' 和 'decoder' 参数类似,它们用于提供要添加到管道中的 ChannelUpstreamHandler 和 ChannelDownstreamHandler 列表。请注意,如果指定 encoders,则将忽略 encoder param,类似于解码器和解码器 param。

INFO:进一步阅读有关使用非可共享代码器/解密代码器的信息。

代码列表需要添加到 Camel 的 registry 中,以便在创建端点时解析它们。

Spring 的原生集合支持可用于在应用程序环境中指定 codec 列表

然后,bean 名称可以在 netty endpoint 定义中使用,作为逗号分隔列表或在 List e.g 中包含。

或通过 spring.

240.8. 完成频道后关闭

当用作服务器时,有时要在关闭频道时关闭该频道,例如:客户端转换已完成。
您可以通过直接设置 endpoint 选项 disconnect=true 来完成此操作。

但是,您也可以根据每个消息指示 Camel,如下所示:
要指示 Camel 关闭频道,您应该添加将键为 CamelNettyCloseChannelWhenComplete 的标头设置为布尔值 true
例如,以下示例将在将消息写回客户端后关闭频道:

        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);
                }
            }
        });

240.9. 添加自定义频道管道工厂以获得对创建的管道的完整控制

可作为 Camel 2.5 提供

自定义频道管道通过插入自定义处理程序(s)、编码器和解码器(无需以 Netty Endpoint URL)来指定它们,可以在不需要以 Netty Endpoint URL 中指定它们,从而提供对处理程序/中断的链的完整控制。

要添加自定义管道,必须通过上下文 registry (JNDIRegistry,或 camel-spring ApplicationContextRegistry 等)使用上下文创建并注册自定义频道管道工厂。

必须按照以下方式构建自定义管道工厂:

  • 与 Producer 链接的频道工厂必须扩展抽象类 ClientPipelineFactory
  • Consumer 链接的频道管道工厂必须扩展抽象类 ServerPipelineFactory
  • 类应覆盖 getPipeline ()方法,以插入自定义处理程序、编码器和解码器。没有覆盖 getPipeline ()方法会创建一个没有处理程序、编码器或解码器线到管道的管道。

以下示例演示了如何创建 ServerChannel Pipeline 工厂

使用自定义管道工厂

public class SampleServerChannelPipelineFactory extends ServerPipelineFactory {
    private int maxLineSize = 1024;

    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline channelPipeline = Channels.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));

        return channelPipeline;
    }
}

然后,自定义频道管道工厂可以添加到 registry 中,并按照以下方式在 camel 路由中实例化/使用

Registry registry = camelContext.getRegistry();
serverPipelineFactory = new TestServerChannelPipelineFactory();
registry.bind("spf", serverPipelineFactory);
context.addRoutes(new RouteBuilder() {
  public void configure() {
      String netty_ssl_endpoint =
         "netty:tcp://0.0.0.0:5150?serverPipelineFactory=#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);
          }
       }
  }
});

240.10. 重新使用 Netty boss 和 worker 线程池

可作为 Camel 2.12 提供

Netty 有两个线程池:WE 和 worker。默认情况下,每个 Netty 使用者和制作者都有自己的私有线程池。如果要在多个消费者或制作者之间重复使用这些线程池,则必须在 Registry 中创建并列出线程池。

例如,使用 Spring XML,我们可使用 NettyWorkerPoolBuilder 和 2 worker 线程创建共享 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 线程池,存在用于 Netty producers 的 org.apache.camel.component.nettyServerBossPoolBuilder 构建器,以及 org.apache.camel.component.nettyClientBossPoolBuilder,用于 Netty producers。

然后,在 Camel 路由中,通过配置 URI 中的 workerPool 选项,即可引用此 worker 池,如下所示:

    <route>
      <from uri="netty:tcp://0.0.0.0:5021?textline=true&amp;sync=true&amp;workerPool=#sharedPool&amp;orderedThreadPoolExecutor=false"/>
      <to uri="log:result"/>
      ...
    </route>

另外,如果我们有另一个路由,我们可以参考共享 worker 池:

    <route>
      <from uri="netty:tcp://0.0.0.0:5022?textline=true&amp;sync=true&amp;workerPool=#sharedPool&amp;orderedThreadPoolExecutor=false"/>
      <to uri="log:result"/>
      ...
    </route>
  1. 以此类推。

240.11. 另请参阅

第 241 章 Netty HTTP 组件(已弃用)

作为 Camel 2.12 版本提供

netty-http 组件是对 Netty 组件的扩展,使用 Netty 分离 HTTP 传输。

此 camel 组件支持制作者和消费者端点。

警告

此组件已弃用。您应该使用 Netty4 HTTP

INFO: .Netty 基于流,这意味着其接收的输入被提交到 Camel 作为流。这意味着,一次只能读取流的内容 如果发现消息正文显示为空的情况,或者您需要多次访问数据(例如:执行多播或重新传送错误处理),您应该使用 Stream 缓存或将消息正文转换为可安全地重新读取多次的 String。注意 Netty4 HTTP 使用 io.netty.handler.codec.http.HttpObjectAggregator 将整个流读取到内存中,以构建完整的 http 消息。但是生成的消息仍是一个基于流的消息,它可以被读取一次。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-netty-http</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

241.1. URI 格式

netty 组件的 URI 方案如下

netty-http:http://0.0.0.0:8080[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

INFO: 查询参数与端点选项。您可以了解 Camel 如何识别 URI 查询参数和端点选项。例如,您可以创建如下所示的端点 URI - netty-http:http//example.com?myParam=myValue&compression=true。在本例中,myParam 是 HTTP 参数,而 compression 是 Camel 端点选项。在这种情况下,Camel 使用的策略是解析可用的端点选项,并将它们从 URI 中删除。这意味着,对于所讨论的示例,由 Netty HTTP producer 发送的 HTTP 请求将如下所示: http//example.com?myParam=myValue,因为 压缩 端点选项将从目标 URL 中解析并删除。请记住,您不能使用动态标头(如 CamelHttpQuery)指定端点选项。端点选项只能在端点 URI 定义级别上指定(如 DSL 元素)。

241.2. HTTP 选项

INFO: 更多选项重要: 此组件从 Netty 继承所有选项。因此,还要查看 Netty 文档。
请注意,在使用这个 Netty HTTP 组件时,Netty 中的一些选项不适用,如与 UDP 传输相关的选项。

Netty HTTP 组件支持 7 个选项,它们如下所列。

名称描述默认类型

nettyHttpBinding (advanced)

使用自定义 org.apache.camel.component.netty.http.NettyHttpBinding 绑定到/从 Netty 和 Camel Message API 绑定。

 

NettyHttpBinding

configuration (common)

在创建端点时,使用 NettyConfiguration 作为配置。

 

NettyHttpConfiguration

headerFilterStrategy (advanced)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头。

 

HeaderFilterStrategy

securityConfiguration (security)

指的是 org.apache.camel.component.netty.http.NettyHttpSecurityConfiguration,以配置安全 Web 资源。

 

NettyHttpSecurity Configuration

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

maximumPoolSize (advanced)

订购的线程池的默认池大小(若使用)。默认值为 16。

16

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Netty HTTP 端点使用 URI 语法配置:

netty-http:protocol:host:port/path

使用以下路径和查询参数:

241.2.1. 路径名(4 参数):

名称描述默认类型

protocol

要使用的协议(http 或 https)

 

字符串

主机

必需 本地主机名,如 localhost 或 0.0.0.0 作为消费者。使用制作者时的远程 HTTP 服务器主机名。

 

字符串

port

主机端口号

 

int

path

资源路径

 

字符串

241.2.2. 查询参数(78 参数):

名称描述默认类型

bridgeEndpoint (common)

如果 选项为 true,则制作者将忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 进行请求。您也可以将 throwExceptionOnFailure 设置为 false,以便制作者将所有故障响应发送回送。在网桥模式中工作的使用者将跳过 gzip 压缩和 WWW URL 表单编码(通过添加 Exchange.SKIP_GZIP_ENCODING 和 Exchange.SKIP_WWW_FORM_URLENCODED 标头到被使用的交换)。

false

布尔值

disconnect (common)

使用后是否立即断开(关闭)与 Netty Channel 的连接。可用于使用者和制作者。

false

布尔值

keepAlive (common)

设置 以确保因为不活跃而关闭套接字

true

布尔值

reuseAddress (common)

设置 以便于套接字多路

true

布尔值

sync (common)

设置 将端点设置为单向或请求响应

true

布尔值

tcpNoDelay (common)

设置 来提高 TCP 协议性能

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

matchOnUriPrefix (consumer)

如果找不到任何匹配项,Camel 应该尝试通过匹配 URI 前缀来查找目标使用者。

false

布尔值

send503whenSuspended (consumer)

是否要在消费者被暂停时回发送 HTTP 状态代码 503。如果 选项为 false,则当使用者暂停时 Netty Acceptor 被 unbound,以便客户端无法再连接。

true

布尔值

backlog (consumer)

允许为 netty 消费者(server)配置积压。请注意,积压只是取决于操作系统的最佳工作。将此选项设置为 200、500 或 1000 之类的值,告知 TCP 堆栈在未配置此选项时接受队列的时长,如果不配置这个选项,则后端日志依赖于 OS 设置。

 

int

bossCount (consumer)

当 netty 在 nio 模式上工作时,它使用 Netty 中的默认 位于Count 参数,即 1。用户可使用此操作覆盖 Netty 中的默认 bossCount

1

int

bossPool (consumer)

使用显式 org.jboss.netty.channel.socket.nio.BossPool 作为 boss 线程池。例如,使用多个用户共享线程池。默认情况下,每个使用者都有自己的 boss 池,其中包含 1 个核心线程。

 

BossPool

channelGroup (consumer)

使用显式 ChannelGroup。

 

ChannelGroup

chunkedMaxContentLength (consumer)

该值以字节为单位,以字节在 Netty HTTP 服务器上接收的每个块帧的最大内容长度。

1048576

int

compression (consumer)

如果客户端支持来自 HTTP 标头的,则允许使用 gzip/defdef 进行 Netty HTTP 服务器上的压缩。

false

布尔值

disableStreamCache (consumer)

确定 Netty HttpRequest#getContent ()的原始输入流是否已缓存(Camel 将读取流型基于流缓存)中的流。默认情况下,Camel 将缓存 Netty 输入流,以支持多次读取,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。请记住,如果启用这个选项,则不能多次读取 Netty 流,而且您需要手动在 Netty 原始流中重置 reader 索引。

false

布尔值

disconnectOnNoReply (consumer)

如果启用了同步,则此选项将指定 NettyConsumer,如果它应该断开连接,没有回复回复。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

httpMethodRestrict (consumer)

要禁用 Netty HTTP consumer 上的 HTTP 方法。您可以用逗号分隔多个。

 

字符串

mapHeaders (consumer)

如果启用了这个选项,则当从 Netty 绑定到 Camel 消息时,将映射标头(如作为标头添加到 Camel 消息)。您可以关闭这个选项来禁用这个选项。该标头仍然可以从 org.apache.camel.component.netty.http.NettyHttpMessage 消息访问,该方法的 getHttpRequest ()返回 Netty HTTP 请求 org.jboss.netty.handler.codec.http.HttpRequest 实例。

true

布尔值

maxChannelMemorySize (consumer)

使用排序ThreadPoolExecutor 时每个频道的已排队事件的最大总大小。指定要禁用的 0。

10485760

long

maxHeaderSize (consumer)

所有标头的最大长度。如果每个标头的长度总和不能超过这个值,将引发 TooLongFrameException。

8192

int

maxTotalMemorySize (consumer)

使用排序ThreadPoolExecutor 时,这个池的已排队事件的最大总大小。指定要禁用的 0。

209715200

long

nettyServerBootstrapFactory (consumer)

使用自定义 NettyServerBootstrapFactory

 

NettyServerBootstrap Factory

nettySharedHttpServer (consumer)

使用共享的 Netty HTTP 服务器。如需了解更多详细信息,请参阅 Netty HTTP Server 示例。

 

NettySharedHttpServer

noReplyLogLevel (consumer)

如果启用了同步,则此选项指定在日志记录没有回复时要使用的 NettyConsumer。

WARN

LoggingLevel

orderedThreadPoolExecutor (consumer)

是否使用排序的线程池,确保事件在同一频道中按顺序处理。详情请查看 org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor 的 netty javadoc。

true

布尔值

serverClosedChannel ExceptionCaughtLogLevel (consumer)

如果服务器(NettyConsumer)捕获 java.nio.channels.ClosedChannelException,则使用这个日志记录级别登录。这用于避免记录关闭频道例外,因为客户端可以断开,然后在 Netty 服务器中造成意外的异常。

DEBUG

LoggingLevel

serverExceptionCaughtLog Level (consumer)

如果服务器(NettyConsumer)捕获异常,则使用此日志记录级别记录。

WARN

LoggingLevel

serverPipelineFactory (consumer)

使用自定义服务器PipelineFactory

 

ServerPipelineFactory

traceEnabled (consumer)

指定是否为这个 Netty HTTP 用户启用 HTTP TRACE。默认关闭 TRACE。

false

布尔值

urlDecodeHeaders (consumer)

如果启用了这个选项,则当从 Netty 绑定到 Camel Message 时,标头值将被 URL 解码(例如 %20)是空格字符。请注意,默认的 org.apache.camel.component.netty.http.NettyHttpBinding 使用这个选项,因此如果实施了自定义 org.apache.camel.component.netty.http.NettyHttpBinding,因此您需要相应地对标头进行解码。

false

布尔值

workerCount (consumer)

当 netty 在 nio 模式下工作时,它会使用来自 Netty 的默认 workerCount 参数,即 cpu_core_threads2。用户可使用此操作覆盖 Netty 中的默认 workerCount

 

int

workerPool (consumer)

使用显式 org.jboss.netty.channel.socket.nio.WorkerPool 作为 worker 线程池。例如,使用多个用户共享线程池。默认情况下,每个使用者都有自己的 worker 池,其中有 2 个 x cpu 数核心线程。

 

WorkerPool

connectTimeout (producer)

等待套接字连接可用的时间。值为 millis。

10000

long

requestTimeout (producer)

允许在调用远程服务器时为 Netty producer 使用超时。默认情况下,不使用超时。该值在 milli 秒内,因此 eg 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 触发超时。

 

long

throwExceptionOnFailure (producer)

禁用丢弃 HttpOperationFailedException 的选项(如果来自远程服务器的响应失败)。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

clientPipelineFactory (producer)

使用自定义 ClientPipelineFactory

 

ClientPipelineFactory

lazyChannelCreation (producer)

如果远程服务器在 Camel 制作者启动时未启动并运行,可以先创建频道来避免异常。

true

布尔值

okStatusCodeRange (producer)

被视为成功响应的状态代码。值包括:可以定义多个范围,以逗号分隔,例如 200-204,209,301-304。每个范围必须是单个数字,或使用包括横线的短划线。默认范围为 200-299

200-299

字符串

producerPoolEnabled (producer)

制作者池是否启用。重要:不要关闭它,因为需要池处理并发且可靠的请求/回复。

true

布尔值

producerPoolMaxActive (producer)

设置可由池分配的对象数量(签出到客户端,或者在给定时间闲置等待签出)。在没有限制的情况下使用负值。

-1

int

producerPoolMaxIdle (producer)

设置池中空闲实例的数量。

100

int

producerPoolMinEvictable Idle (producer)

在对象满足闲置对象驱除前,对象可能会处于空闲时间(millis)的最少时间(以 millis)设置。

300000

long

producerPoolMinIdle (producer)

在驱除器线程(如果活跃)生成新对象前,设置制作池中允许的实例的最小数量。

 

int

useChannelBuffer (producer)

如果 useChannelBuffer 为 true,则 netty producer 将把消息正文转变为 ChannelBuffer,然后再将其发送。

false

布尔值

useRelativePath (producer)

设置是否在 HTTP 请求中使用相对路径。有些第三方后端系统(如 IBM Datapower)不支持 HTTP POST 中的绝对 URI,并将此选项设置为 true 可解决此问题。

false

布尔值

bootstrapConfiguration (advanced)

要使用自定义配置的 NettyServerBootstrapConfiguration 来配置这个端点。

 

NettyServerBootstrap Configuration

配置 (高级)

使用自定义配置的 NettyHttpConfiguration 来配置此端点。

 

NettyHttpConfiguration

headerFilterStrategy (advanced)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头。

 

HeaderFilterStrategy

nettyHttpBinding (advanced)

使用自定义 org.apache.camel.component.netty.http.NettyHttpBinding 绑定到/从 Netty 和 Camel Message API 绑定。

 

NettyHttpBinding

选项 (高级)

允许使用 选项作为前缀来配置额外的 netty 选项。例如,option.child.keepAlive=false,以设置 netty 选项 child.keepAlive=false。有关可以使用的可能选项,请参阅 Netty 文档。

 

map

receiveBufferSize (advanced)

要在入站通信中使用的 TCP/UDP 缓冲大小。大小为字节。

65536

long

receiveBufferSizePredictor (advanced)

配置缓冲区大小预测器。请参阅 Jetty 文档和这个邮件线程的详细信息。

 

int

sendBufferSize (advanced)

在出站通信期间使用的 TCP/UDP 缓冲大小。大小为字节。

65536

long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

transferException (高级)

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。在制作者端,异常会按原样进行反序列化和丢弃,而不是 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

transferExchange (advanced)

仅用于 TCP。您可以通过线路来传输交换,而不是只是正文。以下字段会被传输:在正文、传出正文、错误正文、标题、错误标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

decoder (codec)

弃用 使用单个解码器。这个选项已弃用,使用 encoders 替代。

 

ChannelHandler

decoders (codec)

要使用的解码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

字符串

encoder (codec)

弃用 使用单个编码程序。这个选项已弃用,使用 encoders 替代。

 

ChannelHandler

encoders (codec)

要使用的编码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

字符串

enabledProtocols (security)

使用 SSL 时要启用哪些协议

TLSv1,TLSv1.1,TLSv1.2

字符串

keyStoreFile (security)

用于加密的客户端证书密钥存储

 

File

keyStoreFormat (security)

用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS

JKS

字符串

keyStoreResource (security)

用于加密的客户端侧证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

needClientAuth (security)

配置服务器在使用 SSL 时是否需要客户端身份验证。

false

布尔值

密语 (安全性)

要使用的密码设置,用于加密/解密使用 SSH 发送的有效负载

 

字符串

securityConfiguration (security)

指的是 org.apache.camel.component.netty.http.NettyHttpSecurityConfiguration,以配置安全 Web 资源。

 

NettyHttpSecurity Configuration

securityOptions (security)

使用映射中的键/值对配置 NettyHttpSecurityConfiguration

 

map

securityProvider (security)

用于有效负载加密的安全供应商。如果没有设置,则默认为 SunX509。

SunX509

字符串

SSL (安全性)

设置以指定是否将 SSL 加密应用到此端点

false

布尔值

sslClientCertHeaders (security)

在 SSL 模式中启用和启用后,Netty consumer 将增强 Camel 消息以及包含客户端证书信息(如主题名称、签发者名称、序列号和有效日期范围)的信息。

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

sslHandler (security)

对可用于返回 SSL 处理程序的类的引用

 

SslHandler

trustStoreFile (security)

用于加密的服务器端证书密钥存储

 

File

trustStoreResource (security)

用于加密的服务器端证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

241.3. Spring Boot Auto-Configuration

组件支持 31 选项,如下所示。

名称描述默认类型

camel.component.netty-http.configuration.allow-default-codec

  

布尔值

camel.component.netty-http.configuration.bridge-endpoint

如果 选项为 true,则制作者将忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 进行请求。您也可以将 throwExceptionOnFailure 设置为 false,以便制作者将所有故障响应发送回送。在网桥模式中工作的使用者将跳过 gzip 压缩和 WWW URL 表单编码(通过添加 Exchange.SKIP_GZIP_ENCODING 和 Exchange.SKIP_WWW_FORM_URLENCODED 标头到被使用的交换)。

false

布尔值

camel.component.netty-http.configuration.chunked-max-content-length

该值以字节为单位,以字节在 Netty HTTP 服务器上接收的每个块帧的最大内容长度。

1048576

整数

camel.component.netty-http.configuration.compression

如果客户端支持来自 HTTP 标头的,则允许使用 gzip/defdef 进行 Netty HTTP 服务器上的压缩。

false

布尔值

camel.component.netty-http.configuration.disable-stream-cache

确定 Netty HttpRequest#getContent ()的原始输入流是否已缓存(Camel 将读取流型基于流缓存)中的流。默认情况下,Camel 将缓存 Netty 输入流,以支持多次读取,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。请记住,如果启用这个选项,则不能多次读取 Netty 流,而且您需要手动在 Netty 原始流中重置 reader 索引。

false

布尔值

camel.component.netty-http.configuration.host

当消费者时,本地主机名(如 localhost 或 0.0.0.0)使用制作者时的远程 HTTP 服务器主机名。

 

字符串

camel.component.netty-http.configuration.map-headers

如果启用了这个选项,则当从 Netty 绑定到 Camel 消息时,将映射标头(如作为标头添加到 Camel 消息)。您可以关闭这个选项来禁用这个选项。该标头仍然可以从 org.apache.camel.component.netty.http.NettyHttpMessage 消息访问,该方法的 getHttpRequest ()返回 Netty HTTP 请求 org.jboss.netty.handler.codec.http.HttpRequest 实例。

true

布尔值

camel.component.netty-http.configuration.match-on-uri-prefix

如果找不到任何匹配项,Camel 应该尝试通过匹配 URI 前缀来查找目标使用者。

false

布尔值

camel.component.netty-http.configuration.max-header-size

所有标头的最大长度。如果每个标头的长度总和不能超过这个值,将引发 TooLongFrameException。

8192

整数

camel.component.netty-http.configuration.ok-status-code-range

被视为成功响应的状态代码。值包括:可以定义多个范围,以逗号分隔,例如 200-204,209,301-304。每个范围必须是单个数字,或使用包括横线的短划线。默认范围为 200-299

200-299

字符串

camel.component.netty-http.configuration.path

资源路径

 

字符串

camel.component.netty-http.configuration.port

端口号。https 是 http 和 443 的默认 80。

 

整数

camel.component.netty-http.configuration.protocol

要使用的协议,即 http 或 https

 

字符串

camel.component.netty-http.configuration.send503when-suspended

是否要在消费者被暂停时回发送 HTTP 状态代码 503。如果 选项为 false,则当使用者暂停时 Netty Acceptor 被 unbound,以便客户端无法再连接。

true

布尔值

camel.component.netty-http.configuration.throw-exception-on-failure

禁用丢弃 HttpOperationFailedException 的选项(如果来自远程服务器的响应失败)。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

camel.component.netty-http.configuration.transfer-exception

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。在制作者端,异常会按原样进行反序列化和丢弃,而不是 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

camel.component.netty-http.configuration.url-decode-headers

如果启用了这个选项,则当从 Netty 绑定到 Camel Message 时,标头值将被 URL 解码(例如 %20)是空格字符。请注意,默认的 org.apache.camel.component.netty.http.NettyHttpBinding 使用这个选项,因此如果实施了自定义 org.apache.camel.component.netty.http.NettyHttpBinding,因此您需要相应地对标头进行解码。

false

布尔值

camel.component.netty-http.configuration.use-relative-path

设置是否在 HTTP 请求中使用相对路径。有些第三方后端系统(如 IBM Datapower)不支持 HTTP POST 中的绝对 URI,并将此选项设置为 true 可解决此问题。

false

布尔值

camel.component.netty-http.enabled

启用 netty-http 组件

true

布尔值

camel.component.netty-http.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.netty-http.maximum-pool-size

订购的线程池的默认池大小(若使用)。默认值为 16。

16

整数

camel.component.netty-http.netty-http-binding

使用自定义 org.apache.camel.component.netty.http.NettyHttpBinding 绑定到/从 Netty 和 Camel Message API 绑定。选项是一个 org.apache.camel.component.netty.http.NettyHttpBinding 类型。

 

字符串

camel.component.netty-http.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.netty-http.security-configuration.authenticate

是否默认启用身份验证 <p/>。

 

布尔值

camel.component.netty-http.security-configuration.constraint

支持的限制。<p/> Currently only Basic 支持。

 

字符串

camel.component.netty-http.security-configuration.login-denied-logging-level

设置日志记录拒绝登录尝试(cl stacktraces)<p/> 此级别默认为 DEBUG 的日志记录级别。

 

LoggingLevel

camel.component.netty-http.security-configuration.realm

设置要使用的域的名称。

 

字符串

camel.component.netty-http.security-configuration.role-class-name

  

字符串

camel.component.netty-http.security-configuration.security-authenticator

设置 {@link SecurityAuthenticator} 以用于对 {@link HttpPrincipal} 进行身份验证。

 

SecurityAuthenticator

camel.component.netty-http.security-configuration.security-constraint

设置 {@link SecurityConstraint} 来检查 web 资源是否受限制或不限制 <p/>。这是 <tt>null</tt>,这表示所有资源都是受限的。

 

SecurityConstraint

camel.component.netty-http.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

241.4. 消息标头

以下标头可用于制作者来控制 HTTP 请求。

名称类型描述

CamelHttpMethod

字符串

允许控制要使用的 HTTP 方法,如 GET、POST 和 TRACE 等。类型也可以是 org.jboss.netty.handler.codec.http.HttpMethod 实例。

CamelHttpQuery

字符串

允许提供 URI 查询参数作为覆盖端点配置的 String 值。使用 和 符号分隔多个参数。例如: foo=bar&beer=yes

CamelHttpPath

字符串

Camel 2.13.1/2.12.4: 允许提供 URI 上下文路径和查询参数,作为覆盖端点配置的 String 值。这允许重复使用相同的制作者来调用同一远程 http 服务器,但可以使用动态上下文路径和查询参数。

Content-Type

字符串

设置 HTTP 正文的内容类型。例如: text/plain; charset="UTF-8".

CamelHttpResponseCode

int

允许设置要使用的 HTTP 状态代码。默认情况下 200 用于成功,使用 500 个失败。

当路由从 Netty HTTP 端点启动时,以下标头作为 meta-data:

表中的描述在路由 with: from ("netty-http:http:0.0.0.0:8080/myapp")…​

名称类型描述

CamelHttpMethod

字符串

使用的 HTTP 方法,如 GET、POST、TRACE 等。

CamelHttpUrl

字符串

URL,包括协议、主机和端口等

CamelHttpUri

字符串

无协议、主机和端口的 URI,等等

CamelHttpQuery

字符串

任何查询参数,如 foo=bar&beer=yes

CamelHttpRawQuery

字符串

Camel 2.13.0 :任何查询参数,如 foo=bar&beer=yes。以原始形式存储,因为它们到达消费者(即在 URL 解码前)。

CamelHttpPath

字符串

其他上下文路径.如果客户端名为 context-path /myapp,则这个值为空。如果客户端调用 /myapp/mystuff,则此标头值是 /mystuff。换句话说,在路由端点上配置了 context-path 后的值是值。

CamelHttpCharacterEncoding

字符串

来自 content-type 标头的 charset。

CamelHttpAuthentication

字符串

如果用户使用 HTTP Basic 进行身份验证,则使用基本值添加此标头。

Content-Type

字符串

如果提供,则内容类型。例如: text/plain; charset="UTF-8".

241.5. 访问 Netty 类型

此组件使用 org.apache.camel.component.netty.http.NettyHttpMessage 作为 Exchange 上的消息实施。这可让最终用户根据需要访问原始 Netty 请求/响应实例,如下所示。请注意,原始响应可能根本无法访问。

org.jboss.netty.handler.codec.http.HttpRequest request = exchange.getIn(NettyHttpMessage.class).getHttpRequest();

241.6. 例子

在下面的路由中,我们使用 Netty HTTP 作为 HTTP 服务器,这将返回硬编码"Bye World"消息。

    from("netty-http:http://0.0.0.0:8080/foo")
      .transform().constant("Bye World");

此外,我们还可以使用 Camel 调用此 HTTP 服务器,并带有 ProducerTemplate,如下所示:

    String out = template.requestBody("netty-http:http://0.0.0.0:8080/foo", "Hello World", String.class);
    System.out.println(out);

我们再回到"按世界"作为输出。

241.7. 如何让 Netty 匹配通配符

默认情况下,Netty HTTP 将仅匹配特定 uri 的。但是您可以指示 Netty 匹配前缀。例如:

from("netty-http:http://0.0.0.0:8123/foo").to("mock:foo");

在以上 Netty HTTP 的路由中,只有与 uri 完全匹配,因此如果输入
http://0.0.0.0:8123/foo,则匹配,但如果确实是 http://0.0.0.0:8123/foo/bar,则匹配。

因此,如果要启用通配符匹配,如下所示:

from("netty-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");

因此,Netty 与以 foo 开头的任何端点匹配。

要匹配您可以 执行的任何 端点:

from("netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");

241.8. 使用具有相同端口的多个路由

在同一个 CamelContext 中,您可以有多个来自 Netty HTTP 的路由,该路由共享相同的端口(如 org.jboss.netty.bootstrap.ServerBootstrap 实例)。这样做需要在路由中有多个 bootstrap 选项,因为路由将共享相同的 org.jboss.netty.bootstrap.ServerBootstrap 实例。该实例将使用创建的第一个路由中的选项进行配置。

路由必须相同的选项是 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 配置类中定义的所有选项。如果您为另一个路由配置了不同的选项,Camel 将在启动时抛出异常,表示选项不相同。要缓解这个问题,请确保所有选项都相同。

下面是两个共享同一端口的路由的示例:

两个路由共享相同的端口

from("netty-http:http://0.0.0.0:{{port}}/foo")
  .to("mock:foo")
  .transform().constant("Bye World");

from("netty-http:http://0.0.0.0:{{port}}/bar")
  .to("mock:bar")
  .transform().constant("Bye Camel");

下面是一个错误配置的 2nd 路由示例,它没有与 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 选项作为 1st 路由相同的。这会导致 Camel 启动时失败。

两个共享同一端口的路由,但第二代路由被错误配置,并将在启动时失败

from("netty-http:http://0.0.0.0:{{port}}/foo")
  .to("mock:foo")
  .transform().constant("Bye World");

// we cannot have a 2nd route on same port with SSL enabled, when the 1st route is NOT
from("netty-http:http://0.0.0.0:{{port}}/bar?ssl=true")
  .to("mock:bar")
  .transform().constant("Bye Camel");

241.8.1. 使用多个路由重复使用相同的服务器 bootstrap 配置

通过在 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 类型的单一实例中配置通用服务器 bootstrap 选项,我们可以在所有消费者中使用 bootstrapConfiguration 选项,以引用和重复使用所有消费者的相同选项。???

<bean id="nettyHttpBootstrapOptions" class="org.apache.camel.component.netty.NettyServerBootstrapConfiguration">
  <property name="backlog" value="200"/>
  <property name="connectTimeout" value="20000"/>
  <property name="workerCount" value="16"/>
</bean>

在路由中,您引用这个选项,如下所示

<route>
  <from uri="netty-http:http://0.0.0.0:{{port}}/foo?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

<route>
  <from uri="netty-http:http://0.0.0.0:{{port}}/bar?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

<route>
  <from uri="netty-http:http://0.0.0.0:{{port}}/beer?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

241.8.2. 在 OSGi 容器中使用多个捆绑包间重复使用相同的服务器 bootstrap 配置

如需更多详细信息和示例,请参阅 Netty HTTP Server 示例。

241.9. 使用 HTTP 基本身份验证

Netty HTTP 使用者支持 HTTP 基本身份验证,方法是指定要使用的安全域名称,如下所示

<route>
   <from uri="netty-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=karaf"/>
   ...
</route>

realm 名称是启用基本身份验证的强制性。默认情况下,使用了基于 JAAS 的验证器,它将使用指定的域名(上例中的karaf),并使用此域的 JAAS 域和 JAAS \{{LoginModule}}s 进行身份验证。

Apache Karaf / ServiceMix 的末尾有一个 karaf 域开箱即用,因此上面的示例在这些容器中无法使用该框的原因。

241.9.1. 在 web 资源中指定 ACL

org.apache.camel.component.netty.http.SecurityConstraint 允许定义 Web 资源约束。而且,org.apache.camel.component.netty.http.SecurityConstraintMapping 开箱即用,允许轻松定义包含和排除角色。

例如,如 XML DSL 所示,我们定义约束 bean:

  <bean id="constraint" class="org.apache.camel.component.netty.http.SecurityConstraintMapping">
    <!-- inclusions defines url -> roles restrictions -->
    <!-- a * should be used for any role accepted (or even no roles) -->
    <property name="inclusions">
      <map>
        <entry key="/*" value="*"/>
        <entry key="/admin/*" value="admin"/>
        <entry key="/guest/*" value="admin,guest"/>
      </map>
    </property>
    <!-- exclusions is used to define public urls, which requires no authentication -->
    <property name="exclusions">
      <set>
        <value>/public/*</value>
      </set>
    </property>
  </bean>

上述限制已定义

  • 对 /* 的访问受到限制,且接受任何角色(如果用户没有角色)
  • 访问 /admin/* 需要 admin 角色
  • 访问 /guest/* 需要 admin 或 guest 角色
  • 访问 /public/* 是一个排除,这意味着不需要身份验证,因此在没有登录的情况下,所有人都可以公开

要使用这个约束,我们需要引用 bean id,如下所示:

<route>
   <from uri="netty-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&amp;securityConfiguration.realm=karaf&amp;securityConfiguration.securityConstraint=#constraint"/>
   ...
</route>

241.10. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • Netty
  • Netty HTTP 服务器示例
  • Jetty

第 242 章 Netty4 Component

作为 Camel 版本 2.14 可用

Camel 中的 netty4 组件是一个套接字通信组件,基于 Netty 项目版本 4。
Netty 是一个 NIO 客户端服务器框架,能够快速轻松地开发 networkServerInitializerFactory 应用程序,如协议服务器和客户端。
Netty 大大简化和简化 TCP 和 UDP 套接字服务器等网络编程。

此 camel 组件支持制作者和消费者端点。

Netty 组件有几个选项,并允许精细地控制多个 TCP/UDP 通信参数(缓冲大小、keepAlives、tcpNoDelay 等),并促进 Camel 路由上的 In-Only 和 In-Out 通信。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-netty4</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

242.1. URI 格式

netty 组件的 URI 方案如下

netty4:tcp://0.0.0.0:99999[?options]
netty4:udp://remotehost:99999/[?options]

此组件支持 TCP 和 UDP 的生产者和消费者端点。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

242.2. 选项

Netty4 组件支持 6 个选项,它们如下所列。

名称描述默认类型

maximumPoolSize (advanced)

EventExecutorGroup 的线程池大小(如果其使用)。默认值为 16。

16

int

配置 (高级)

在创建端点时,使用 NettyConfiguration 作为配置。

 

NettyConfiguration

executorService (advanced)

使用给定的 EventExecutorGroup。

 

EventExecutorGroup

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Netty4 端点使用 URI 语法进行配置:

netty4:protocol:host:port

使用以下路径和查询参数:

242.2.1. 路径名(3 参数):

名称描述默认类型

protocol

要求使用 协议(可以是 tcp 或 udp)。

 

字符串

主机

所需的 主机名。对于消费者,主机名为 localhost 或 0.0.0.0。对于制作者,主机名是要连接的远程主机

 

字符串

port

所需的 主机端口号

 

int

242.2.2. 查询参数(72 参数):

名称描述默认类型

disconnect (common)

使用后是否立即断开(关闭)与 Netty Channel 的连接。可用于使用者和制作者。

false

布尔值

keepAlive (common)

设置 以确保因为不活跃而关闭套接字

true

布尔值

reuseAddress (common)

设置 以便于套接字多路

true

布尔值

reuseChannel (common)

此选项允许制作者和消费者(在客户端模式中)在处理 Exchange 的生命周期中重复使用相同的 Netty Channel。如果您需要在 Camel 路由中多次调用服务器,并且想要使用相同的网络连接,这很有用。当使用此功能时,在 Exchange 完成后,频道不会返回到连接池,如果断开连接选项被设置为 true,则频道不会返回到连接池。重复使用的频道作为带有键 NettyConstants#NETTY_CHANNEL 的交换属性存储在 Exchange 中,也可以在路由过程中获取频道并使用它来使用它。

false

布尔值

sync (common)

设置 将端点设置为单向或请求响应

true

布尔值

tcpNoDelay (common)

设置 来提高 TCP 协议性能

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

broadcast (consumer)

设置以通过 UDP 选择多播

false

布尔值

clientMode (consumer)

如果 clientMode 为 true,netty 消费者将地址连接为 TCP 客户端。

false

布尔值

reconnect (consumer)

仅在使用者中使用,如果启用了此操作,使用者将尝试重新连接。

true

布尔值

reconnectInterval (consumer)

如果重新连接,并且启用了 clientMode。尝试重新连接的时间间隔(以秒为单位)

10000

int

backlog (consumer)

允许为 netty 消费者(server)配置积压。请注意,积压只是取决于操作系统的最佳工作。将此选项设置为 200、500 或 1000 之类的值,告知 TCP 堆栈在未配置此选项时接受队列的时长,如果不配置这个选项,则后端日志依赖于 OS 设置。

 

int

bossCount (consumer)

当 netty 在 nio 模式上工作时,它使用 Netty 中的默认 位于Count 参数,即 1。用户可使用此操作覆盖 Netty 中的默认 bossCount

1

int

bossGroup (consumer)

设置 BossGroup,该组可用于处理 NettyEndpoint 中服务器端的新连接

 

EventLoopGroup

disconnectOnNoReply (consumer)

如果启用了同步,则此选项将指定 NettyConsumer,如果它应该断开连接,没有回复回复。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

nettyServerBootstrapFactory (consumer)

使用自定义 NettyServerBootstrapFactory

 

NettyServerBootstrap Factory

networkInterface (consumer)

在使用 UDP 时,此选项可根据其名称指定网络接口,如 eth0 来加入多播组。

 

字符串

noReplyLogLevel (consumer)

如果启用了同步,则此选项指定在日志记录没有回复时要使用的 NettyConsumer。

WARN

LoggingLevel

serverClosedChannel ExceptionCaughtLogLevel (consumer)

如果服务器(NettyConsumer)捕获 java.nio.channels.ClosedChannelException,则使用这个日志记录级别登录。这用于避免记录关闭频道例外,因为客户端可以断开,然后在 Netty 服务器中造成意外的异常。

DEBUG

LoggingLevel

serverExceptionCaughtLog Level (consumer)

如果服务器(NettyConsumer)捕获异常,则使用此日志记录级别记录。

WARN

LoggingLevel

serverInitializerFactory (consumer)

使用自定义 ServerInitializerFactory

 

ServerInitializer Factory

usingExecutorService (consumer)

是否使用排序的线程池,确保事件在同一频道中按顺序处理。

true

布尔值

connectTimeout (producer)

等待套接字连接可用的时间。值以毫秒为单位。

10000

int

requestTimeout (producer)

允许在调用远程服务器时为 Netty producer 使用超时。默认情况下,不使用超时。该值在 milli 秒内,因此 eg 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 触发超时。

 

long

clientInitializerFactory (producer)

使用自定义 ClientInitializerFactory

 

ClientInitializer Factory

correlationManager (producer)

要使用自定义关联管理器来管理请求和回复消息的方式,在将请求/回复消息与 netty producer 搭配使用时进行映射。只有在您有方法将请求与回复请求(如请求和回复消息中都存在关联 id 时)进行使用。如果您希望在 netty 在同一频道(也称为连接)上的多个并发信息上,可以使用这个信息。当这样做时,您必须有关联请求和回复消息的方法,以便您可以在航班的 Camel Exchange 上存储正确的回复,然后再继续路由。我们建议在构建自定义关联管理器时扩展 TimeoutCorrelationManagerSupport。这为需要实施的超时和其他复杂性提供支持。如需了解更多详细信息,请参阅 producerPoolEnabled 选项。

 

NettyCamelState CorrelationManager

lazyChannelCreation (producer)

如果远程服务器在 Camel 制作者启动时未启动并运行,可以先创建频道来避免异常。

true

布尔值

producerPoolEnabled (producer)

制作者池是否启用。重要信息:如果您关闭此关闭,那么将使用一个共享连接用于制作者(如果您正在执行请求/回复)。这意味着,如果回复返回异常,则存在交集响应的问题。因此,您需要在请求和回复消息中有一个关联 id,以便您可以正确地将回复与负责在 Camel 中处理消息的 Camel 回调相关联。要这样做,您需要将 NettyCamelStateCorrelationManager 作为关联管理器实施,并通过 correlationManager 选项进行配置。如需了解更多详细信息,请参阅 correlationManager 选项。

true

布尔值

producerPoolMaxActive (producer)

设置可由池分配的对象数量(签出到客户端,或者在给定时间闲置等待签出)。在没有限制的情况下使用负值。

-1

int

producerPoolMaxIdle (producer)

设置池中空闲实例的数量。

100

int

producerPoolMinEvictable Idle (producer)

在对象满足闲置对象驱除前,对象可能会处于空闲时间(millis)的最少时间(以 millis)设置。

300000

long

producerPoolMinIdle (producer)

在驱除器线程(如果活跃)生成新对象前,设置制作池中允许的实例的最小数量。

 

int

udpConnectionlessSending (producer)

此选项支持 udp 发送较少连接,这是实际触发和忘记。连接的 udp 会发送 PortUnreachableException(如果没有这些端口侦听接收端口)。

false

布尔值

useByteBuf (producer)

如果 useByteBuf 为 true,netty producer 会在发送消息正文前将消息正文转变为 ByteBuf。

false

布尔值

allowSerializedHeaders (advanced)

仅在 transferExchange 为 true 时使用 TCP。当设置为 true 时,标头和属性中的 serializable 对象将添加到交换中。否则,Camel 将排除任何非序列化对象,并将其记录在 WARN 级别。

false

布尔值

bootstrapConfiguration (advanced)

要使用自定义配置的 NettyServerBootstrapConfiguration 来配置这个端点。

 

NettyServerBootstrap Configuration

channelGroup (advanced)

使用显式 ChannelGroup。

 

ChannelGroup

nativeTransport (advanced)

是否使用原生传输,而不是 NIO。原生传输利用主机操作系统,且仅在某些平台上受支持。需要为您要使用的主机操作系统添加 netty JAR。更多信息请参阅 :http://netty.io/wiki/native-transports.html

false

布尔值

选项 (高级)

允许使用 选项作为前缀来配置额外的 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

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

transferExchange (advanced)

仅用于 TCP。您可以通过线路来传输交换,而不是只是正文。以下字段会被传输:在正文、传出正文、错误正文、标题、错误标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

udpByteArrayCodec (advanced)

仅限 UDP。如果启用使用字节阵列代码而不是 Java 序列化协议。

false

布尔值

workerCount (advanced)

当 netty 在 nio 模式下工作时,它会使用来自 Netty 的默认 workerCount 参数,即 cpu_core_threads x 2。用户可以使用此操作覆盖 Netty 中的默认 workerCount。

 

int

workerGroup (advanced)

使用显式 EventLoopGroup 作为 scanner 线程池。例如,若要与多个使用者或制作者共享一个线程池。默认情况下,每个消费者或制作者都有自己的 worker 池,有 2 个 CPU 数量核心线程。

 

EventLoopGroup

allowDefaultCodec (codec)

如果既是,netty 组件都会安装一个默认的 codec,则 encoder/decoder 是 null,文本行是 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件作为过滤器链中的第一个元素安装默认 codec。

true

布尔值

autoAppendDelimiter (codec)

在使用文本 codec 发送时,是否自动附加缺少的最终分隔符。

true

布尔值

decoder (codec)

弃用了 一个自定义 ChannelHandler 类,可用于执行入站有效负载的特殊摘要。

 

ChannelHandler

decoderMaxLineLength (codec)

用于文本行代码的最大行长度。

1024

int

decoders (codec)

要使用的解码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

字符串

delimiter (codec)

用于文本行代码的分隔符。可能的值有 LINE 和 NULL。

TextLineDelimiter

encoder (codec)

弃用了 一个自定义 ChannelHandler 类,可用于对出站有效负载执行特殊汇总。

 

ChannelHandler

encoders (codec)

要使用的编码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

字符串

encoding (codec)

用于文本代码的编码(一个 charset 名称)。如果没有提供,Camel 将使用 JVM 默认 Charset。

 

字符串

textline (codec)

仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的 codec;如果未指定或值为 false,则通过 TCP 假定 Object Serialization。

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 消息以及包含客户端证书信息(如主题名称、签发者名称、序列号和有效日期范围)的信息。

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

sslHandler (security)

对可用于返回 SSL 处理程序的类的引用

 

SslHandler

trustStoreFile (security)

用于加密的服务器端证书密钥存储

 

File

trustStoreResource (security)

用于加密的服务器端证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

242.3. Spring Boot Auto-Configuration

组件支持 78 个选项,它们如下所列。

名称描述默认类型

camel.component.netty4.configuration.allow-default-codec

如果既是,netty 组件都会安装一个默认的 codec,则 encoder/decoder 是 null,文本行是 false。将 allowDefaultCodec 设置为 false 可防止 netty 组件作为过滤器链中的第一个元素安装默认 codec。

true

布尔值

camel.component.netty4.configuration.allow-serialized-headers

仅在 transferExchange 为 true 时使用 TCP。当设置为 true 时,标头和属性中的 serializable 对象将添加到交换中。否则,Camel 将排除任何非序列化对象,并将其记录在 WARN 级别。

false

布尔值

camel.component.netty4.configuration.auto-append-delimiter

在使用文本 codec 发送时,是否自动附加缺少的最终分隔符。

true

布尔值

camel.component.netty4.configuration.backlog

允许为 netty 消费者(server)配置积压。请注意,积压只是取决于操作系统的最佳工作。将此选项设置为 200、500 或 1000 之类的值,告知 TCP 堆栈在未配置此选项时接受队列的时长,如果不配置这个选项,则后端日志依赖于 OS 设置。

 

整数

camel.component.netty4.configuration.boss-count

当 netty 在 nio 模式上工作时,它使用 Netty 中的默认 位于Count 参数,即 1。用户可使用此操作覆盖 Netty 中的默认 bossCount

1

整数

camel.component.netty4.configuration.boss-group

设置 BossGroup,该组可用于处理 NettyEndpoint 中服务器端的新连接

 

EventLoopGroup

camel.component.netty4.configuration.broadcast

设置以通过 UDP 选择多播

false

布尔值

camel.component.netty4.configuration.channel-group

使用显式 ChannelGroup。

 

ChannelGroup

camel.component.netty4.configuration.client-initializer-factory

使用自定义 ClientInitializerFactory

 

ClientInitializer Factory

camel.component.netty4.configuration.client-mode

如果 clientMode 为 true,netty 消费者将地址连接为 TCP 客户端。

false

布尔值

camel.component.netty4.configuration.connect-timeout

等待套接字连接可用的时间。值以毫秒为单位。

10000

整数

camel.component.netty4.configuration.correlation-manager

要使用自定义关联管理器来管理请求和回复消息的方式,在将请求/回复消息与 netty producer 搭配使用时进行映射。只有在您有方法将请求与回复请求(如请求和回复消息中都存在关联 id 时)进行使用。如果您希望在 netty 在同一频道(也称为连接)上的多个并发信息上,可以使用这个信息。当这样做时,您必须有关联请求和回复消息的方法,以便您可以在航班的 Camel Exchange 上存储正确的回复,然后再继续路由。我们建议在构建自定义关联管理器时扩展 TimeoutCorrelationManagerSupport。这为需要实施的超时和其他复杂性提供支持。如需了解更多详细信息,请参阅 producerPoolEnabled 选项。

 

NettyCamelState CorrelationManager

camel.component.netty4.configuration.decoder-max-line-length

用于文本行代码的最大行长度。

1024

整数

camel.component.netty4.configuration.decoders

要使用的解码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

list

camel.component.netty4.configuration.delimiter

用于文本行代码的分隔符。可能的值有 LINE 和 NULL。

 

TextLineDelimiter

camel.component.netty4.configuration.disconnect

使用后是否立即断开(关闭)与 Netty Channel 的连接。可用于使用者和制作者。

false

布尔值

camel.component.netty4.configuration.disconnect-on-no-reply

如果启用了同步,则此选项将指定 NettyConsumer,如果它应该断开连接,没有回复回复。

true

布尔值

camel.component.netty4.configuration.enabled-protocols

使用 SSL 时要启用哪些协议

TLSv1,TLSv1.1,TLSv1.2

字符串

camel.component.netty4.configuration.encoders

要使用的编码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

list

camel.component.netty4.configuration.encoding

用于文本代码的编码(一个 charset 名称)。如果没有提供,Camel 将使用 JVM 默认 Charset。

 

字符串

camel.component.netty4.configuration.host

主机名.对于消费者,主机名为 localhost 或 0.0.0.0。对于制作者,主机名是要连接的远程主机

 

字符串

camel.component.netty4.configuration.keep-alive

设置 以确保因为不活跃而关闭套接字

true

布尔值

camel.component.netty4.configuration.key-store-format

用于有效负载加密的密钥存储格式。如果没有设置,则默认为 JKS

 

字符串

camel.component.netty4.configuration.key-store-resource

用于加密的客户端侧证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

camel.component.netty4.configuration.lazy-channel-creation

如果远程服务器在 Camel 制作者启动时未启动并运行,可以先创建频道来避免异常。

true

布尔值

camel.component.netty4.configuration.native-transport

是否使用原生传输,而不是 NIO。原生传输利用主机操作系统,且仅在某些平台上受支持。需要为您要使用的主机操作系统添加 netty JAR。更多信息请参阅 :http://netty.io/wiki/native-transports.html

false

布尔值

camel.component.netty4.configuration.need-client-auth

配置服务器在使用 SSL 时是否需要客户端身份验证。

false

布尔值

camel.component.netty4.configuration.netty-server-bootstrap-factory

使用自定义 NettyServerBootstrapFactory

 

NettyServerBootstrap Factory

camel.component.netty4.configuration.network-interface

在使用 UDP 时,此选项可根据其名称指定网络接口,如 eth0 来加入多播组。

 

字符串

camel.component.netty4.configuration.no-reply-log-level

如果启用了同步,则此选项指定在日志记录没有回复时要使用的 NettyConsumer。

 

LoggingLevel

camel.component.netty4.configuration.options

允许使用 选项作为前缀来配置额外的 netty 选项。例如,option.child.keepAlive=false,以设置 netty 选项 child.keepAlive=false。有关可以使用的可能选项,请参阅 Netty 文档。

 

map

camel.component.netty4.configuration.passphrase

要使用的密码设置,用于加密/解密使用 SSH 发送的有效负载

 

字符串

camel.component.netty4.configuration.port

主机端口号

 

整数

camel.component.netty4.configuration.producer-pool-enabled

制作者池是否启用。重要信息:如果您关闭此关闭,那么将使用一个共享连接用于制作者(如果您正在执行请求/回复)。这意味着,如果回复返回异常,则存在交集响应的问题。因此,您需要在请求和回复消息中有一个关联 id,以便您可以正确地将回复与负责在 Camel 中处理消息的 Camel 回调相关联。要这样做,您需要将 NettyCamelStateCorrelationManager 作为关联管理器实施,并通过 correlationManager 选项进行配置。如需了解更多详细信息,请参阅 correlationManager 选项。

true

布尔值

camel.component.netty4.configuration.producer-pool-max-active

设置可由池分配的对象数量(签出到客户端,或者在给定时间闲置等待签出)。在没有限制的情况下使用负值。

-1

整数

camel.component.netty4.configuration.producer-pool-max-idle

设置池中空闲实例的数量。

100

整数

camel.component.netty4.configuration.producer-pool-min-evictable-idle

在对象满足闲置对象驱除前,对象可能会处于空闲时间(millis)的最少时间(以 millis)设置。

300000

Long

camel.component.netty4.configuration.producer-pool-min-idle

在驱除器线程(如果活跃)生成新对象前,设置制作池中允许的实例的最小数量。

 

整数

camel.component.netty4.configuration.protocol

要使用的协议,可以是 tcp 或 udp。

 

字符串

camel.component.netty4.configuration.receive-buffer-size

要在入站通信中使用的 TCP/UDP 缓冲大小。大小为字节。

65536

整数

camel.component.netty4.configuration.receive-buffer-size-predictor

配置缓冲区大小预测器。请参阅 Jetty 文档和这个邮件线程的详细信息。

 

整数

camel.component.netty4.configuration.reconnect

仅在使用者中使用,如果启用了此操作,使用者将尝试重新连接。

true

布尔值

camel.component.netty4.configuration.reconnect-interval

如果重新连接,并且启用了 clientMode。尝试重新连接的时间间隔(以秒为单位)

10000

整数

camel.component.netty4.configuration.request-timeout

允许在调用远程服务器时为 Netty producer 使用超时。默认情况下,不使用超时。该值在 milli 秒内,因此 eg 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 触发超时。

 

Long

camel.component.netty4.configuration.reuse-address

设置 以便于套接字多路

true

布尔值

camel.component.netty4.configuration.reuse-channel

此选项允许制作者和消费者(在客户端模式中)在处理 Exchange 的生命周期中重复使用相同的 Netty Channel。如果您需要在 Camel 路由中多次调用服务器,并且想要使用相同的网络连接,这很有用。当使用此功能时,在 Exchange 完成后,频道不会返回到连接池,如果断开连接选项被设置为 true,则频道不会返回到连接池。重复使用的频道作为带有键 NettyConstants#NETTY_CHANNEL 的交换属性存储在 Exchange 中,也可以在路由过程中获取频道并使用它来使用它。

false

布尔值

camel.component.netty4.configuration.security-provider

用于有效负载加密的安全供应商。如果没有设置,则默认为 SunX509。

 

字符串

camel.component.netty4.configuration.send-buffer-size

在出站通信期间使用的 TCP/UDP 缓冲大小。大小为字节。

65536

整数

camel.component.netty4.configuration.server-closed-channel-exception-caught-log-level

如果服务器(NettyConsumer)捕获 java.nio.channels.ClosedChannelException,则使用这个日志记录级别登录。这用于避免记录关闭频道例外,因为客户端可以断开,然后在 Netty 服务器中造成意外的异常。

 

LoggingLevel

camel.component.netty4.configuration.server-exception-caught-log-level

如果服务器(NettyConsumer)捕获异常,则使用此日志记录级别记录。

 

LoggingLevel

camel.component.netty4.configuration.server-initializer-factory

使用自定义 ServerInitializerFactory

 

ServerInitializer Factory

camel.component.netty4.configuration.ssl

设置以指定是否将 SSL 加密应用到此端点

false

布尔值

camel.component.netty4.configuration.ssl-client-cert-headers

在 SSL 模式中启用和启用后,Netty consumer 将增强 Camel 消息以及包含客户端证书信息(如主题名称、签发者名称、序列号和有效日期范围)的信息。

false

布尔值

camel.component.netty4.configuration.ssl-context-parameters

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

camel.component.netty4.configuration.ssl-handler

对可用于返回 SSL 处理程序的类的引用

 

SslHandler

camel.component.netty4.configuration.sync

设置 将端点设置为单向或请求响应

true

布尔值

camel.component.netty4.configuration.tcp-no-delay

设置 来提高 TCP 协议性能

true

布尔值

camel.component.netty4.configuration.textline

仅用于 TCP。如果没有指定 codec,您可以使用此标志来指示基于文本的 codec;如果未指定或值为 false,则通过 TCP 假定 Object Serialization。

false

布尔值

camel.component.netty4.configuration.transfer-exchange

仅用于 TCP。您可以通过线路来传输交换,而不是只是正文。以下字段会被传输:在正文、传出正文、错误正文、标题、错误标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

camel.component.netty4.configuration.trust-store-resource

用于加密的服务器端证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

camel.component.netty4.configuration.udp-byte-array-codec

仅限 UDP。如果启用使用字节阵列代码而不是 Java 序列化协议。

false

布尔值

camel.component.netty4.configuration.udp-connectionless-sending

此选项支持 udp 发送较少连接,这是实际触发和忘记。连接的 udp 会发送 PortUnreachableException(如果没有这些端口侦听接收端口)。

false

布尔值

camel.component.netty4.configuration.use-byte-buf

如果 useByteBuf 为 true,netty producer 会在发送消息正文前将消息正文转变为 ByteBuf。

false

布尔值

camel.component.netty4.configuration.using-executor-service

是否使用排序的线程池,确保事件在同一频道中按顺序处理。

true

布尔值

camel.component.netty4.configuration.worker-count

当 netty 在 nio 模式下工作时,它会使用来自 Netty 的默认 workerCount 参数,即 cpu_core_threads x 2。用户可以使用此操作覆盖 Netty 中的默认 workerCount。

 

整数

camel.component.netty4.configuration.worker-group

使用显式 EventLoopGroup 作为 scanner 线程池。例如,若要与多个使用者或制作者共享一个线程池。默认情况下,每个消费者或制作者都有自己的 worker 池,有 2 个 CPU 数量核心线程。

 

EventLoopGroup

camel.component.netty4.enabled

启用 netty4 组件

true

布尔值

camel.component.netty4.executor-service

使用给定的 EventExecutorGroup。选项是 io.netty.util.concurrent.EventExecutorGroup 类型。

 

字符串

camel.component.netty4.maximum-pool-size

EventExecutorGroup 的线程池大小(如果其使用)。默认值为 16。

16

整数

camel.component.netty4.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.netty4.ssl-context-parameters

使用 SSLContextParameters 配置安全性。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.netty4.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

camel.component.netty4.configuration.client-pipeline-factory

@deprecated use #setClientInitializerFactory

 

ClientInitializer Factory

camel.component.netty4.configuration.decoder

自定义 ChannelHandler 类,可用于执行入站有效负载的特殊汇总。

 

ChannelHandler

camel.component.netty4.configuration.encoder

自定义 ChannelHandler 类,可用于对出站有效负载进行特殊汇总。

 

ChannelHandler

camel.component.netty4.configuration.key-store-file

用于加密的客户端证书密钥存储

 

File

camel.component.netty4.configuration.server-pipeline-factory

@deprecated use #setServerInitializerFactory

 

ServerInitializer Factory

camel.component.netty4.configuration.trust-store-file

用于加密的服务器端证书密钥存储

 

File

242.4. 基于 registry 的选项

codec Handler 和 SSL 密钥存储可以列在 registry 中,例如在 Spring XML 文件中。可以传递的值如下:

名称描述

passphrase

要使用的密码设置来加密/使用 SSH 发送的有效负载

keyStoreFormat

用于有效负载加密的密钥存储格式。如果没有设置,则默认为 "JKS"

securityProvider

用于有效负载加密的安全供应商。如果没有设置,则默认为 "SunX509"。

keyStoreFile

弃用: 用于加密的客户端侧证书密钥存储

trustStoreFile

弃用: 用于加密的服务器侧证书密钥存储

keyStoreResource

Camel 2.11.1: 要用于加密的客户端侧证书密钥存储。默认情况下,由 classpath 加载,但您可以使用 "classpath:""file:""http:" 前缀来从不同的系统加载资源。

trustStoreResource

Camel 2.11.1: 用于加密的服务器侧证书密钥存储。默认情况下,由 classpath 加载,但您可以使用 "classpath:""file:""http:" 前缀来从不同的系统加载资源。

sslHandler

对可用于返回 SSL 处理程序的类的引用

encoder

自定义 ChannelHandler 类,可用于执行出站有效负载的特殊包。必须覆盖 io.netty.channel.ChannelInboundHandlerAdapter。

encoders

要使用的编码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

decoder

自定义 ChannelHandler 类,可用于执行入站有效负载的特殊摘要。必须覆盖 io.netty.channel.ChannelOutboundHandlerAdapter。

decoders

要使用的解码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

注意

请阅读以下关于使用不可共享编解码器/解码器的信息。

242.4.1. 使用非共享的编码或解码器

如果您的编码器或解码器无法共享(例如,它们没有 @Shareable 类注解),那么您的 encoder/decoder 必须实现 org.apache.camel.component.netty.ChannelHandlerDefinition y 接口,并在 newChannelHandler 方法中返回新实例。这是为了确保安全使用编码器/编码器。否则,Netty 组件在创建端点时将记录 WARN。

Netty 组件提供了 org.apache.camel.component.netty.ChannelHandler factory 类,它含有一些常用方法。

242.5. 将消息发送到/从 Netty 端点

242.5.1. Netty Producer

在 Producer 模式中,组件可以使用 TCP 或 UDP 协议(具有可选 SSL 支持)将有效负载发送到套接字端点。

制作者模式支持单向和基于请求响应的操作。

242.5.2. Netty Consumer

在 Consumer 模式中,组件提供以下功能:

  • 使用 TCP 或 UDP 协议侦听指定的套接字(具有可选的 SSL 支持)
  • 使用文本/xml、二进制和序列化对象有效负载和接收套接字上的请求
  • 将它们与路由一起作为消息交换。

消费者模式支持单向和基于请求响应的操作。

242.6. 例子

242.6.1. 使用 Request-Reply 和 serialized 对象有效负载的 UDP Netty 端点

RouteBuilder builder = new RouteBuilder() {
  public void configure() {
    from("netty4:udp://0.0.0.0:5155?sync=true")
      .process(new Processor() {
         public void process(Exchange exchange) throws Exception {
           Poetry poetry = (Poetry) exchange.getIn().getBody();
           poetry.setPoet("Dr. Sarojini Naidu");
           exchange.getOut().setBody(poetry);
         }
       }
    }
};

242.6.2. 使用单向通信基于 TCP 的 Netty consumer 端点

RouteBuilder builder = new RouteBuilder() {
  public void configure() {
       from("netty4:tcp://0.0.0.0:5150")
           .to("mock:result");
  }
};

242.6.3. 使用 Request-Reply 通信基于 SSL/TCP 的 Netty 消费者端点

使用 JSSE 配置实用程序

从 Camel 2.9 开始,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("netty4", 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="netty4:tcp://0.0.0.0:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/>
...

[[Netty4-UsingBasicSSL/TLSconfigurationontheJettyComponent] 在 Jetty 组件中使用基本 SSL/TLS 配置

JndiRegistry registry = new JndiRegistry(createJndiContext());
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.createRegistry(registry);
context.addRoutes(new RouteBuilder() {
  public void configure() {
      String netty_ssl_endpoint =
         "netty4: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 4 组件会将 SSLSession 存储为 Camel 消息上的标头,如下所示:

SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class);
// get the first certificate which is client certificate
javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0];
Principal principal = cert.getSubjectDN();

请记住,要设置 需要ClientAuth=true 以验证客户端,否则 SSLSession 无法访问客户端证书的信息,并且您可能会获得一个例外 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated。如果客户端证书过期或者无效等,您也可能会得到这个异常。

提示

选项 sslClientCertHeaders 可以设置为 true,然后使用包含客户端证书详情的标题增强 Camel 消息消息。例如,在标题 CamelNettySSLClientCertSubjectName 中可轻松获取主题名称。

242.6.4. 使用多代码

在某些情况下,可能需要将编码器和解码器链添加到 netty 管道。要将 multpile codecs 添加到 camel netty 端点,应使用 'encoders' 和 'decoders' uri 参数。与 'encoder' 和 'decoder' 参数相似,它们用来提供应添加到管道中的 ChannelUpstreamHandlers 和 ChannelDownstreamHandlers。请注意,如果指定 encoders,则将忽略 encoder param,类似于解码器和解码器 param。

注意

了解有关使用不可共享代码/解码器的进一步功能。

代码列表需要添加到 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.netty4.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.netty4.ChannelHandlerFactories" factory-method="newLengthFieldBasedFrameDecoder">
        <constructor-arg value="1048576"/>
        <constructor-arg value="0"/>
        <constructor-arg value="4"/>
        <constructor-arg value="0"/>
        <constructor-arg value="4"/>
    </bean>
    <bean id="string-decoder" class="io.netty.handler.codec.string.StringDecoder"/>

然后,bean 名称可以在 netty endpoint 定义中使用,作为逗号分隔列表或在 List e.g 中包含。

 from("direct:multiple-codec").to("netty4:tcp://0.0.0.0:{{port}}?encoders=#encoders&sync=false");

 from("netty4: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="netty4:tcp://0.0.0.0:5150?encoders=#encoders&amp;sync=false"/>
    </route>
    <route>
        <from uri="netty4:tcp://0.0.0.0:5150?decoders=#length-decoder,#string-decoder&amp;sync=false"/>
        <to uri="mock:multiple-codec"/>
    </route>
</camelContext>

242.7. 完成频道后关闭

当用作服务器时,有时要在关闭频道时关闭该频道,例如:客户端转换已完成。
您可以通过直接设置 endpoint 选项 disconnect=true 来完成此操作。

但是,您也可以根据每个消息指示 Camel,如下所示:
要指示 Camel 关闭频道,您应该添加将键为 CamelNettyCloseChannelWhenComplete 的标头设置为布尔值 true
例如,以下示例将在将消息写回客户端后关闭频道:

from("netty4: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);
        }
    }
});

添加自定义频道管道工厂以获得对创建的管道的完整控制

242.8. 自定义管道

自定义频道管道通过插入自定义处理程序和解码器(而无需以非常简单的方式在 Netty Endpoint URL 中指定它们)来提供对处理器/interceptor 链的完整控制。

要添加自定义管道,必须通过上下文 registry (JNDIRegistry 或 camel-spring ApplicationContextRegistry 等)使用上下文创建并注册自定义频道管道工厂。

必须按照以下方式构建自定义管道工厂:

  • 与 Producer 链接的频道工厂必须扩展抽象类 ClientPipelineFactory
  • Consumer 链接的频道管道工厂必须扩展抽象类 ServerInitializerFactory
  • 类应该覆盖 initChannel()方法,以插入自定义处理程序、编码器和解码器。没有覆盖 initChannel() 方法,创建没有处理程序、编码器或解码器到管道的管道。

以下示例显示如何创建 ServerInitializer factory 工厂

242.8.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 =
         "netty4: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);
          }
       }
  }
});

242.9. 重新使用 Netty boss 和 worker 线程池

Netty 有两个线程池:WE 和 worker。默认情况下,每个 Netty 使用者和制作者都有自己的私有线程池。如果要在多个消费者或制作者之间重复使用这些线程池,则必须在 Registry 中创建并列出线程池。

例如,使用 Spring XML,我们可使用 NettyWorkerPoolBuilder 和 2 worker 线程创建共享 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.netty4.NettyServerBossPool builder builder for Netty consumers,而 org.apache.camel.component.netty4.NettyClientBossPoolBuilder for the Netty producers。

然后,在 Camel 路由中,通过配置 URI 中的 workerPool 选项,即可引用此 worker 池,如下所示:

<route>
  <from uri="netty4:tcp://0.0.0.0:5021?textline=true&amp;sync=true&amp;workerPool=#sharedPool&amp;usingExecutorService=false"/>
  <to uri="log:result"/>
  ...
</route>

另外,如果我们有另一个路由,我们可以参考共享 worker 池:

<route>
  <from uri="netty4:tcp://0.0.0.0:5022?textline=true&amp;sync=true&amp;workerPool=#sharedPool&amp;usingExecutorService=false"/>
  <to uri="log:result"/>
  ...
</route>

以此类推。

242.10. 通过与 request/reply 连接的多个并发消息

当通过 netty producer 使用 Netty 进行请求/回复消息时,默认情况下,每个消息都通过非共享连接(池)发送每个消息。这样可确保回复自动映射到正确的请求线程,以便在 Camel 中进行进一步路由。换而言之,请求/回复信息之间的词语关联将不会出现,因为回复会返回用于发送请求的相同连接;而且此连接不会与他人共享。当响应返回时,连接会返回连接池,从中可以被其他人重复使用。

但是,如果您要在单个共享连接上有多个并发请求/响应,需要通过设置 producerPoolEnabled=false 来关闭连接池。现在,这意味着如果回复返回异常,则存在交集响应的问题。因此,您需要在请求和回复消息中有一个关联 id,以便您可以正确地将回复与负责在 Camel 中处理消息的 Camel 回调相关联。要这样做,您需要将 NettyCamelStateCorrelationManager 作为关联管理器实施,并通过 correlationManager=#myManager 选项进行配置。

注意

我们建议在构建自定义关联管理器时扩展 TimeoutCorrelationManagerSupport。这为需要实施的超时和其他复杂性提供支持。

您可以在 camel-example-netty-custom-correlation 目录下找到带有 Apache Camel 源代码的示例。

242.11. 另请参阅

第 243 章 Netty4 HTTP Component

作为 Camel 版本 2.14 可用

netty4-http 组件是对 Netty4 组件的一个扩展,通过 Netty4 分离 HTTP 传输。

此 camel 组件支持制作者和消费者端点。

INFO: .Netty 基于流,这意味着其接收的输入被提交到 Camel 作为流。这意味着,一次只能读取流的内容 如果发现消息正文显示为空的情况,或者您需要多次访问数据(例如:执行多播或重新传送错误处理),您应该使用 Stream 缓存或将消息正文转换为可安全地重新读取多次的 String。注意 Netty4 HTTP 使用 io.netty.handler.codec.http.HttpObjectAggregator 将整个流读取到内存中,以构建完整的 http 消息。但是生成的消息仍是一个基于流的消息,它可以被读取一次。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-netty4-http</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

INFO: 输入Stream.如果将 InputStream 用作消息正文,并且您想要写入或读取大型数据流(如 > 2 GB),则必须通过将 disableStreamCache 参数设置为 true 来使用流传输支持。

示例 1:将大型数据流上传到服务器

// Upload a large data stream to the server
from("direct:upstream-call")
        .bean(Helper.class, "prepareStream")
        .to("netty-http:http://localhost:{{port}}/upstream?disableStreamCache=true")
        .log("get ${body}");

// Read a large data stream from the client
from("netty-http:http://0.0.0.0:{{port}}/upstream?disableStreamCache=true")
        .bean(Helper.class, "processStream")
        .to("mock:stream-size");

示例 2:从服务器下载大型数据流

// Download a large data stream from the server
from("direct:download-call")
        .to("netty-http:http://localhost:{{port}}/downstream?disableStreamCache=true")
        .bean(Helper.class, "asyncProcessStream")
        .log("get ${body}");

// Write a large data stream to the client
from("netty-http:http://0.0.0.0:{{port}}/downstream?disableStreamCache=true")
        .bean(Helper.class, "prepareStream");

在下载示例中,您必须从其他线程的 InputStream 中读取以避免阻断底层流处理程序(请参阅 asyncProcessStream)。

    public static void processStream(Exchange exchange) throws Exception {
        InputStream is = exchange.getIn().getBody(InputStream.class);

        byte[] buffer = new byte[1024];
        long read = 0;
        long total = 0;
        while ((read = is.read(buffer, 0, buffer.length)) != -1) {
            total += read;
        }

        exchange.getIn().setBody(new Long(total));
    }

    public static CompletableFuture<Void> asyncProcessStream(Exchange exchange) {
        return CompletableFuture.runAsync(() -> {
            try {
                processStream(exchange);
            } catch (Exception e) {
                exchange.setException(e);
            }
        });
    }

243.1. URI 格式

netty 组件的 URI 方案如下

netty4-http:http://0.0.0.0:8080[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

INFO: 查询参数与端点选项。您可以了解 Camel 如何识别 URI 查询参数和端点选项。例如,您可以按照如下所示创建端点 URI - netty4-http:http//example.com?myParam=myValue&compression=true。在本例中,myParam 是 HTTP 参数,而 compression 是 Camel 端点选项。在这种情况下,Camel 使用的策略是解析可用的端点选项,并将它们从 URI 中删除。这意味着,对于所讨论的示例,由 Netty HTTP producer 发送的 HTTP 请求将如下所示: http//example.com?myParam=myValue,因为 压缩 端点选项将从目标 URL 中解析并删除。请记住,您不能使用动态标头(如 CamelHttpQuery)指定端点选项。端点选项只能在端点 URI 定义级别上指定(如 DSL 元素)。

243.2. HTTP 选项

INFO: 更多选项重要: 此组件从 Netty4 继承所有选项。因此,还要查看 Netty4 文档。
请注意,在使用这个 Netty4 HTTP 组件时,Netty4 HTTP 组件中一些选项不适用,如与 UDP 传输相关的选项。

Netty4 HTTP 组件支持 9 个选项,它们如下所列。

名称描述默认类型

nettyHttpBinding (advanced)

使用自定义 org.apache.camel.component.netty4.http.NettyHttpBinding 绑定到/从 Netty 和 Camel Message API 绑定。

 

NettyHttpBinding

configuration (common)

在创建端点时,使用 NettyConfiguration 作为配置。

 

NettyHttpConfiguration

headerFilterStrategy (advanced)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头。

 

HeaderFilterStrategy

securityConfiguration (security)

指的是 org.apache.camel.component.netty4.http.NettyHttpSecurityConfiguration,以配置安全 Web 资源。

 

NettyHttpSecurity Configuration

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

maximumPoolSize (advanced)

EventExecutorGroup 的线程池大小(如果其使用)。默认值为 16。

16

int

executorService (advanced)

使用给定的 EventExecutorGroup。

 

EventExecutorGroup

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Netty4 HTTP 端点使用 URI 语法配置:

netty4-http:protocol:host:port/path

使用以下路径和查询参数:

243.2.1. 路径名(4 参数):

名称描述默认类型

protocol

要使用的协议(http 或 https)

 

字符串

主机

必需 本地主机名,如 localhost 或 0.0.0.0 作为消费者。使用制作者时的远程 HTTP 服务器主机名。

 

字符串

port

主机端口号

 

int

path

资源路径

 

字符串

243.2.2. 查询参数(79 参数):

名称描述默认类型

bridgeEndpoint (common)

如果 选项为 true,则制作者将忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 进行请求。您也可以将 throwExceptionOnFailure 设置为 false,以便制作者将所有故障响应发送回送。在网桥模式中工作的使用者将跳过 gzip 压缩和 WWW URL 表单编码(通过添加 Exchange.SKIP_GZIP_ENCODING 和 Exchange.SKIP_WWW_FORM_URLENCODED 标头到被使用的交换)。

false

布尔值

disconnect (common)

使用后是否立即断开(关闭)与 Netty Channel 的连接。可用于使用者和制作者。

false

布尔值

keepAlive (common)

设置 以确保因为不活跃而关闭套接字

true

布尔值

reuseAddress (common)

设置 以便于套接字多路

true

布尔值

reuseChannel (common)

此选项允许制作者和消费者(在客户端模式中)在处理 Exchange 的生命周期中重复使用相同的 Netty Channel。如果您需要在 Camel 路由中多次调用服务器,并且想要使用相同的网络连接,这很有用。当使用此功能时,在 Exchange 完成后,频道不会返回到连接池,如果断开连接选项被设置为 true,则频道不会返回到连接池。重复使用的频道作为带有键 NettyConstants#NETTY_CHANNEL 的交换属性存储在 Exchange 中,也可以在路由过程中获取频道并使用它来使用它。

false

布尔值

sync (common)

设置 将端点设置为单向或请求响应

true

布尔值

tcpNoDelay (common)

设置 来提高 TCP 协议性能

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

matchOnUriPrefix (consumer)

如果找不到任何匹配项,Camel 应该尝试通过匹配 URI 前缀来查找目标使用者。

false

布尔值

send503whenSuspended (consumer)

是否要在消费者被暂停时回发送 HTTP 状态代码 503。如果 选项为 false,则当使用者暂停时 Netty Acceptor 被 unbound,以便客户端无法再连接。

true

布尔值

backlog (consumer)

允许为 netty 消费者(server)配置积压。请注意,积压只是取决于操作系统的最佳工作。将此选项设置为 200、500 或 1000 之类的值,告知 TCP 堆栈在未配置此选项时接受队列的时长,如果不配置这个选项,则后端日志依赖于 OS 设置。

 

int

bossCount (consumer)

当 netty 在 nio 模式上工作时,它使用 Netty 中的默认 位于Count 参数,即 1。用户可使用此操作覆盖 Netty 中的默认 bossCount

1

int

bossGroup (consumer)

设置 BossGroup,该组可用于处理 NettyEndpoint 中服务器端的新连接

 

EventLoopGroup

chunkedMaxContentLength (consumer)

该值以字节为单位,以字节在 Netty HTTP 服务器上接收的每个块帧的最大内容长度。

1048576

int

compression (consumer)

如果客户端支持来自 HTTP 标头的,则允许使用 gzip/defdef 进行 Netty HTTP 服务器上的压缩。

false

布尔值

disconnectOnNoReply (consumer)

如果启用了同步,则此选项将指定 NettyConsumer,如果它应该断开连接,没有回复回复。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

httpMethodRestrict (consumer)

要禁用 Netty HTTP consumer 上的 HTTP 方法。您可以用逗号分隔多个。

 

字符串

mapHeaders (consumer)

如果启用了这个选项,则当从 Netty 绑定到 Camel 消息时,将映射标头(如作为标头添加到 Camel 消息)。您可以关闭这个选项来禁用这个选项。该标头仍然可以从 org.apache.camel.component.netty.http.NettyHttpMessage 消息访问,方法为 Netty HTTP 请求 io.netty.handler.codec.http.HttpRequest 实例。

true

布尔值

maxHeaderSize (consumer)

所有标头的最大长度。如果每个标头的长度的总和超过这个值,则将引发 io.netty.handler.codec.TooLongFrameException。

8192

int

nettyServerBootstrapFactory (consumer)

使用自定义 NettyServerBootstrapFactory

 

NettyServerBootstrap Factory

nettySharedHttpServer (consumer)

使用共享的 Netty HTTP 服务器。如需了解更多详细信息,请参阅 Netty HTTP Server 示例。

 

NettySharedHttpServer

noReplyLogLevel (consumer)

如果启用了同步,则此选项指定在日志记录没有回复时要使用的 NettyConsumer。

WARN

LoggingLevel

serverClosedChannel ExceptionCaughtLogLevel (consumer)

如果服务器(NettyConsumer)捕获 java.nio.channels.ClosedChannelException,则使用这个日志记录级别登录。这用于避免记录关闭频道例外,因为客户端可以断开,然后在 Netty 服务器中造成意外的异常。

DEBUG

LoggingLevel

serverExceptionCaughtLog Level (consumer)

如果服务器(NettyConsumer)捕获异常,则使用此日志记录级别记录。

WARN

LoggingLevel

serverInitializerFactory (consumer)

使用自定义 ServerInitializerFactory

 

ServerInitializer Factory

traceEnabled (consumer)

指定是否为这个 Netty HTTP 用户启用 HTTP TRACE。默认关闭 TRACE。

false

布尔值

urlDecodeHeaders (consumer)

如果启用了这个选项,则当从 Netty 绑定到 Camel Message 时,标头值将被 URL 解码(例如 %20)是空格字符。请注意,默认的 org.apache.camel.component.netty.http.NettyHttpBinding 使用这个选项,因此如果实施了自定义 org.apache.camel.component.netty4.http.NettyHttpBinding,因此您需要相应地对标头进行解码。

false

布尔值

usingExecutorService (consumer)

是否使用排序的线程池,确保事件在同一频道中按顺序处理。

true

布尔值

connectTimeout (producer)

等待套接字连接可用的时间。值以毫秒为单位。

10000

int

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

requestTimeout (producer)

允许在调用远程服务器时为 Netty producer 使用超时。默认情况下,不使用超时。该值在 milli 秒内,因此 eg 30000 为 30 秒。requestTimeout 使用 Netty 的 ReadTimeoutHandler 触发超时。

 

long

throwExceptionOnFailure (producer)

禁用丢弃 HttpOperationFailedException 的选项(如果来自远程服务器的响应失败)。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

clientInitializerFactory (producer)

使用自定义 ClientInitializerFactory

 

ClientInitializer Factory

lazyChannelCreation (producer)

如果远程服务器在 Camel 制作者启动时未启动并运行,可以先创建频道来避免异常。

true

布尔值

okStatusCodeRange (producer)

被视为成功响应的状态代码。值包括:可以定义多个范围,以逗号分隔,例如 200-204,209,301-304。每个范围必须是单个数字,或使用包括横线的短划线。默认范围为 200-299

200-299

字符串

producerPoolEnabled (producer)

制作者池是否启用。重要信息:如果您关闭此关闭,那么将使用一个共享连接用于制作者(如果您正在执行请求/回复)。这意味着,如果回复返回异常,则存在交集响应的问题。因此,您需要在请求和回复消息中有一个关联 id,以便您可以正确地将回复与负责在 Camel 中处理消息的 Camel 回调相关联。要这样做,您需要将 NettyCamelStateCorrelationManager 作为关联管理器实施,并通过 correlationManager 选项进行配置。如需了解更多详细信息,请参阅 correlationManager 选项。

true

布尔值

producerPoolMaxActive (producer)

设置可由池分配的对象数量(签出到客户端,或者在给定时间闲置等待签出)。在没有限制的情况下使用负值。

-1

int

producerPoolMaxIdle (producer)

设置池中空闲实例的数量。

100

int

producerPoolMinEvictable Idle (producer)

在对象满足闲置对象驱除前,对象可能会处于空闲时间(millis)的最少时间(以 millis)设置。

300000

long

producerPoolMinIdle (producer)

在驱除器线程(如果活跃)生成新对象前,设置制作池中允许的实例的最小数量。

 

int

useRelativePath (producer)

设置是否在 HTTP 请求中使用相对路径。

false

布尔值

allowSerializedHeaders (advanced)

仅在 transferExchange 为 true 时使用 TCP。当设置为 true 时,标头和属性中的 serializable 对象将添加到交换中。否则,Camel 将排除任何非序列化对象,并将其记录在 WARN 级别。

false

布尔值

bootstrapConfiguration (advanced)

要使用自定义配置的 NettyServerBootstrapConfiguration 来配置这个端点。

 

NettyServerBootstrap Configuration

channelGroup (advanced)

使用显式 ChannelGroup。

 

ChannelGroup

配置 (高级)

使用自定义配置的 NettyHttpConfiguration 来配置此端点。

 

NettyHttpConfiguration

disableStreamCache (advanced)

确定 Netty HttpRequest#getContent ()或 HttpResponset#getContent ()的原始输入流是否已缓存(Camel 将把流读到以轻量级内存流缓存)缓存中。默认情况下,Camel 将缓存 Netty 输入流,以支持多次读取,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。请记住,如果启用这个选项,则不能多次读取 Netty 流,而且您需要手动在 Netty 原始流中重置 reader 索引。另外,当 Netty HTTP 服务器/HTTP 客户端处理时,Netty 将自动关闭 Netty 流,这意味着如果异步路由引擎正在使用,则可能会继续路由 org.apache.camel.Exchange 无法读取 Netty 流,因为 Netty 已关闭它。

false

布尔值

headerFilterStrategy (advanced)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头。

 

HeaderFilterStrategy

nativeTransport (advanced)

是否使用原生传输,而不是 NIO。原生传输利用主机操作系统,且仅在某些平台上受支持。需要为您要使用的主机操作系统添加 netty JAR。更多信息请参阅 :http://netty.io/wiki/native-transports.html

false

布尔值

nettyHttpBinding (advanced)

使用自定义 org.apache.camel.component.netty4.http.NettyHttpBinding 绑定到/从 Netty 和 Camel Message API 绑定。

 

NettyHttpBinding

选项 (高级)

允许使用 选项作为前缀来配置额外的 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

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

transferException (高级)

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。在制作者端,异常会按原样进行反序列化和丢弃,而不是 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

transferExchange (advanced)

仅用于 TCP。您可以通过线路来传输交换,而不是只是正文。以下字段会被传输:在正文、传出正文、错误正文、标题、错误标头、交换属性、交换异常。这要求对象是序列化的。Camel 将排除任何非序列化对象,并在 WARN 级别记录它。

false

布尔值

workerCount (advanced)

当 netty 在 nio 模式下工作时,它会使用来自 Netty 的默认 workerCount 参数,即 cpu_core_threads x 2。用户可以使用此操作覆盖 Netty 中的默认 workerCount。

 

int

workerGroup (advanced)

使用显式 EventLoopGroup 作为 scanner 线程池。例如,若要与多个使用者或制作者共享一个线程池。默认情况下,每个消费者或制作者都有自己的 worker 池,有 2 个 CPU 数量核心线程。

 

EventLoopGroup

decoder (codec)

弃用 使用单个解码器。这个选项已弃用,使用 encoders 替代。

 

ChannelHandler

decoders (codec)

要使用的解码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

字符串

encoder (codec)

弃用 使用单个编码程序。这个选项已弃用,使用 encoders 替代。

 

ChannelHandler

encoders (codec)

要使用的编码器列表。您可以使用带有用逗号分开的值的 String,并在 Registry 中查找值。只需记得使用 # so Camel 知道它应该查找的值。

 

字符串

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 发送的有效负载

 

字符串

securityConfiguration (security)

指的是 org.apache.camel.component.netty4.http.NettyHttpSecurityConfiguration,以配置安全 Web 资源。

 

NettyHttpSecurity Configuration

securityOptions (security)

使用映射中的键/值对配置 NettyHttpSecurityConfiguration

 

map

securityProvider (security)

用于有效负载加密的安全供应商。如果没有设置,则默认为 SunX509。

 

字符串

SSL (安全性)

设置以指定是否将 SSL 加密应用到此端点

false

布尔值

sslClientCertHeaders (security)

在 SSL 模式中启用和启用后,Netty consumer 将增强 Camel 消息以及包含客户端证书信息(如主题名称、签发者名称、序列号和有效日期范围)的信息。

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

sslHandler (security)

对可用于返回 SSL 处理程序的类的引用

 

SslHandler

trustStoreFile (security)

用于加密的服务器端证书密钥存储

 

File

trustStoreResource (security)

用于加密的服务器端证书密钥存储。从 classpath 中默认加载,但您可以使用 classpath:、file: 或 http: 前缀来从不同的系统加载资源。

 

字符串

243.3. Spring Boot Auto-Configuration

组件支持 33 选项,如下所示。

名称描述默认类型

camel.component.netty4-http.configuration.allow-default-codec

  

布尔值

camel.component.netty4-http.configuration.bridge-endpoint

如果 选项为 true,则制作者将忽略 Exchange.HTTP_URI 标头,并使用端点的 URI 进行请求。您也可以将 throwExceptionOnFailure 设置为 false,以便制作者将所有故障响应发送回送。在网桥模式中工作的使用者将跳过 gzip 压缩和 WWW URL 表单编码(通过添加 Exchange.SKIP_GZIP_ENCODING 和 Exchange.SKIP_WWW_FORM_URLENCODED 标头到被使用的交换)。

false

布尔值

camel.component.netty4-http.configuration.chunked-max-content-length

该值以字节为单位,以字节在 Netty HTTP 服务器上接收的每个块帧的最大内容长度。

1048576

整数

camel.component.netty4-http.configuration.compression

如果客户端支持来自 HTTP 标头的,则允许使用 gzip/defdef 进行 Netty HTTP 服务器上的压缩。

false

布尔值

camel.component.netty4-http.configuration.disable-stream-cache

确定 Netty HttpRequest#getContent ()或 HttpResponset#getContent ()的原始输入流是否已缓存(Camel 将把流读到以轻量级内存流缓存)缓存中。默认情况下,Camel 将缓存 Netty 输入流,以支持多次读取,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。请记住,如果启用这个选项,则不能多次读取 Netty 流,而且您需要手动在 Netty 原始流中重置 reader 索引。另外,当 Netty HTTP 服务器/HTTP 客户端处理时,Netty 将自动关闭 Netty 流,这意味着如果异步路由引擎正在使用,则可能会继续路由 org.apache.camel.Exchange 无法读取 Netty 流,因为 Netty 已关闭它。

false

布尔值

camel.component.netty4-http.configuration.host

当消费者时,本地主机名(如 localhost 或 0.0.0.0)使用制作者时的远程 HTTP 服务器主机名。

 

字符串

camel.component.netty4-http.configuration.map-headers

如果启用了这个选项,则当从 Netty 绑定到 Camel 消息时,将映射标头(如作为标头添加到 Camel 消息)。您可以关闭这个选项来禁用这个选项。该标头仍然可以从 org.apache.camel.component.netty.http.NettyHttpMessage 消息访问,方法为 Netty HTTP 请求 io.netty.handler.codec.http.HttpRequest 实例。

true

布尔值

camel.component.netty4-http.configuration.match-on-uri-prefix

如果找不到任何匹配项,Camel 应该尝试通过匹配 URI 前缀来查找目标使用者。

false

布尔值

camel.component.netty4-http.configuration.max-header-size

所有标头的最大长度。如果每个标头的长度的总和超过这个值,则将引发 io.netty.handler.codec.TooLongFrameException。

8192

整数

camel.component.netty4-http.configuration.ok-status-code-range

被视为成功响应的状态代码。值包括:可以定义多个范围,以逗号分隔,例如 200-204,209,301-304。每个范围必须是单个数字,或使用包括横线的短划线。默认范围为 200-299

200-299

字符串

camel.component.netty4-http.configuration.path

资源路径

 

字符串

camel.component.netty4-http.configuration.port

端口号。https 是 http 和 443 的默认 80。

 

整数

camel.component.netty4-http.configuration.protocol

要使用的协议,即 http 或 https

 

字符串

camel.component.netty4-http.configuration.send503when-suspended

是否要在消费者被暂停时回发送 HTTP 状态代码 503。如果 选项为 false,则当使用者暂停时 Netty Acceptor 被 unbound,以便客户端无法再连接。

true

布尔值

camel.component.netty4-http.configuration.throw-exception-on-failure

禁用丢弃 HttpOperationFailedException 的选项(如果来自远程服务器的响应失败)。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

camel.component.netty4-http.configuration.transfer-exception

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。在制作者端,异常会按原样进行反序列化和丢弃,而不是 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

camel.component.netty4-http.configuration.url-decode-headers

如果启用了这个选项,则当从 Netty 绑定到 Camel Message 时,标头值将被 URL 解码(例如 %20)是空格字符。请注意,默认的 org.apache.camel.component.netty.http.NettyHttpBinding 使用这个选项,因此如果实施了自定义 org.apache.camel.component.netty4.http.NettyHttpBinding,因此您需要相应地对标头进行解码。

false

布尔值

camel.component.netty4-http.configuration.use-relative-path

设置是否在 HTTP 请求中使用相对路径。

false

布尔值

camel.component.netty4-http.enabled

启用 netty4-http 组件

true

布尔值

camel.component.netty4-http.executor-service

使用给定的 EventExecutorGroup。选项是 io.netty.util.concurrent.EventExecutorGroup 类型。

 

字符串

camel.component.netty4-http.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.netty4-http.maximum-pool-size

EventExecutorGroup 的线程池大小(如果其使用)。默认值为 16。

16

整数

camel.component.netty4-http.netty-http-binding

使用自定义 org.apache.camel.component.netty4.http.NettyHttpBinding 绑定到/从 Netty 和 Camel Message API 绑定。选项是一个 org.apache.camel.component.netty4.http.NettyHttpBinding 类型。

 

字符串

camel.component.netty4-http.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.netty4-http.security-configuration.authenticate

是否默认启用身份验证 <p/>。

 

布尔值

camel.component.netty4-http.security-configuration.constraint

支持的限制。<p/> Currently only Basic 支持。

 

字符串

camel.component.netty4-http.security-configuration.login-denied-logging-level

设置日志记录拒绝登录尝试(cl stacktraces)<p/> 此级别默认为 DEBUG 的日志记录级别。

 

LoggingLevel

camel.component.netty4-http.security-configuration.realm

设置要使用的域的名称。

 

字符串

camel.component.netty4-http.security-configuration.role-class-name

  

字符串

camel.component.netty4-http.security-configuration.security-authenticator

设置 {@link SecurityAuthenticator} 以用于对 {@link HttpPrincipal} 进行身份验证。

 

SecurityAuthenticator

camel.component.netty4-http.security-configuration.security-constraint

设置 {@link SecurityConstraint} 来检查 web 资源是否受限制或不限制 <p/>。这是 <tt>null</tt>,这表示所有资源都是受限的。

 

SecurityConstraint

camel.component.netty4-http.ssl-context-parameters

使用 SSLContextParameters 配置安全性。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.netty4-http.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

243.4. 消息标头

以下标头可用于制作者来控制 HTTP 请求。

名称类型描述

CamelHttpMethod

字符串

允许控制要使用的 HTTP 方法,如 GET、POST 和 TRACE 等。类型也可以是 io.netty.handler.codec.http.HttpMethod 实例。

CamelHttpQuery

字符串

允许提供 URI 查询参数作为覆盖端点配置的 String 值。使用 和 符号分隔多个参数。例如: foo=bar&beer=yes

CamelHttpPath

字符串

允许提供 URI 上下文路径和查询参数,作为覆盖端点配置的 String 值。这允许重复使用相同的制作者来调用同一远程 http 服务器,但可以使用动态上下文路径和查询参数。

Content-Type

字符串

设置 HTTP 正文的内容类型。例如: text/plain; charset="UTF-8".

CamelHttpResponseCode

int

允许设置要使用的 HTTP 状态代码。默认情况下 200 用于成功,使用 500 个失败。

当路由从 Netty4 HTTP 端点启动时,以下标头作为 meta-data:

表中的描述在路由中的偏移位置: from ("netty4-http:http:0.0.0.0:8080/myapp")…​

名称类型描述

CamelHttpMethod

字符串

使用的 HTTP 方法,如 GET、POST、TRACE 等。

CamelHttpUrl

字符串

URL,包括协议、主机和端口等: http://0.0.0.0:8080/myapp

CamelHttpUri

字符串

无协议、主机和端口的 URI,如 /myapp

CamelHttpQuery

字符串

任何查询参数,如 foo=bar&beer=yes

CamelHttpRawQuery

字符串

任何查询参数,如 foo=bar&beer=yes。以原始形式存储,因为它们到达消费者(即在 URL 解码前)。

CamelHttpPath

字符串

其他上下文路径.如果客户端名为 context-path /myapp,则这个值为空。如果客户端调用 /myapp/mystuff,则此标头值是 /mystuff。换句话说,在路由端点上配置了 context-path 后的值是值。

CamelHttpCharacterEncoding

字符串

来自 content-type 标头的 charset。

CamelHttpAuthentication

字符串

如果用户使用 HTTP Basic 进行身份验证,则使用基本值添加此标头。

Content-Type

字符串

如果提供,则内容类型。例如: text/plain; charset="UTF-8".

243.5. 访问 Netty 类型

此组件使用 org.apache.camel.component.netty4.http.NettyHttpMessage 作为 Exchange 上的消息实施。这可让最终用户根据需要访问原始 Netty 请求/响应实例,如下所示。 请注意,原始响应可能根本无法访问。

io.netty.handler.codec.http.HttpRequest request = exchange.getIn(NettyHttpMessage.class).getHttpRequest();

243.6. 例子

在下面的路由中,我们使用 Netty4 HTTP 作为 HTTP 服务器,这将返回硬编码"Bye World"消息。

    from("netty4-http:http://0.0.0.0:8080/foo")
      .transform().constant("Bye World");

此外,我们还可以使用 Camel 调用此 HTTP 服务器,并带有 ProducerTemplate,如下所示:

    String out = template.requestBody("netty4-http:http://0.0.0.0:8080/foo", "Hello World", String.class);
    System.out.println(out);

我们再回到"按世界"作为输出。

243.7. 如何让 Netty 匹配通配符

默认情况下,Netty4 HTTP 将仅匹配精确的 uri 的。但是您可以指示 Netty 匹配前缀。例如:

from("netty4-http:http://0.0.0.0:8123/foo").to("mock:foo");

在以上 Netty4 HTTP 中,只有如果 uri 是完全匹配,因此如果输入
http://0.0.0.0:8123/foo,则匹配,但如果确实是 http://0.0.0.0:8123/foo,则不会匹配。http://0.0.0.0:8123/foo/bar

因此,如果要启用通配符匹配,如下所示:

from("netty4-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");

因此,Netty 与以 foo 开头的任何端点匹配。

要匹配您可以 执行的任何 端点:

from("netty4-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");

243.8. 使用具有相同端口的多个路由

在同一个 CamelContext 中,您可以有多个来自 Netty4 HTTP 的路由,该 HTTP 共享同一端口(如 io.netty.bootstrap.ServerBootstrap 实例)。这样做需要在路由中有多个 bootstrap 选项,因为路由将共享相同的 io.netty.bootstrap.ServerBootstrap 实例。该实例将使用创建的第一个路由中的选项进行配置。

路由必须相同的选项是 org.apache.camel.component.netty4.NettyServerBootstrapConfiguration 配置类中定义的所有选项。如果您为另一个路由配置了不同的选项,Camel 将在启动时抛出异常,表示选项不相同。要缓解这个问题,请确保所有选项都相同。

下面是两个共享同一端口的路由的示例:

两个路由共享相同的端口

from("netty4-http:http://0.0.0.0:{{port}}/foo")
  .to("mock:foo")
  .transform().constant("Bye World");

from("netty4-http:http://0.0.0.0:{{port}}/bar")
  .to("mock:bar")
  .transform().constant("Bye Camel");

下面是一个错误配置的 2nd 路由示例,它没有与 org.apache.camel.component.netty4.NettyServerBootstrapConfiguration 选项作为 1st 路由相同的。这会导致 Camel 启动时失败。

两个共享同一端口的路由,但第二代路由被错误配置,并将在启动时失败

from("netty4-http:http://0.0.0.0:{{port}}/foo")
  .to("mock:foo")
  .transform().constant("Bye World");

// we cannot have a 2nd route on same port with SSL enabled, when the 1st route is NOT
from("netty4-http:http://0.0.0.0:{{port}}/bar?ssl=true")
  .to("mock:bar")
  .transform().constant("Bye Camel");

243.8.1. 使用多个路由重复使用相同的服务器 bootstrap 配置

通过在 org.apache.camel.component.netty4.NettyServerBootstrapConfiguration 类型的单个实例中配置通用服务器 bootstrap 选项,我们可以在所有消费者中使用 bootstrapConfiguration 选项,以引用和重复使用所有消费者的相同选项。

<bean id="nettyHttpBootstrapOptions" class="org.apache.camel.component.netty4.NettyServerBootstrapConfiguration">
  <property name="backlog" value="200"/>
  <property name="connectionTimeout" value="20000"/>
  <property name="workerCount" value="16"/>
</bean>

在路由中,您引用这个选项,如下所示

<route>
  <from uri="netty4-http:http://0.0.0.0:{{port}}/foo?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

<route>
  <from uri="netty4-http:http://0.0.0.0:{{port}}/bar?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

<route>
  <from uri="netty4-http:http://0.0.0.0:{{port}}/beer?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

243.8.2. 在 OSGi 容器中使用多个捆绑包间重复使用相同的服务器 bootstrap 配置

如需更多详细信息和示例,请参阅 Netty HTTP Server 示例。

243.9. 使用 HTTP 基本身份验证

Netty HTTP 使用者支持 HTTP 基本身份验证,方法是指定要使用的安全域名称,如下所示

<route>
   <from uri="netty4-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=karaf"/>
   ...
</route>

realm 名称是启用基本身份验证的强制性。默认情况下,使用了基于 JAAS 的验证器,它将使用指定的域名(上例中的karaf),并使用此域的 JAAS 域和 JAAS \{{LoginModule}}s 进行身份验证。

Apache Karaf / ServiceMix 的末尾有一个 karaf 域开箱即用,因此上面的示例在这些容器中无法使用该框的原因。

243.9.1. 在 web 资源中指定 ACL

org.apache.camel.component.netty4.http.SecurityConstraint 允许定义 Web 资源约束。而且,org.apache.camel.component.netty.http.SecurityConstraintMapping 开箱即用,允许轻松定义包含和排除角色。

例如,如 XML DSL 所示,我们定义约束 bean:

  <bean id="constraint" class="org.apache.camel.component.netty4.http.SecurityConstraintMapping">
    <!-- inclusions defines url -> roles restrictions -->
    <!-- a * should be used for any role accepted (or even no roles) -->
    <property name="inclusions">
      <map>
        <entry key="/*" value="*"/>
        <entry key="/admin/*" value="admin"/>
        <entry key="/guest/*" value="admin,guest"/>
      </map>
    </property>
    <!-- exclusions is used to define public urls, which requires no authentication -->
    <property name="exclusions">
      <set>
        <value>/public/*</value>
      </set>
    </property>
  </bean>

上述限制已定义

  • 对 /* 的访问受到限制,且接受任何角色(如果用户没有角色)
  • 访问 /admin/* 需要 admin 角色
  • 访问 /guest/* 需要 admin 或 guest 角色
  • 访问 /public/* 是一个排除,这意味着不需要身份验证,因此在没有登录的情况下,所有人都可以公开

要使用这个约束,我们需要引用 bean id,如下所示:

<route>
   <from uri="netty4-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&amp;securityConfiguration.realm=karaf&amp;securityConfiguration.securityConstraint=#constraint"/>
   ...
</route>

243.10. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • Netty
  • Netty HTTP 服务器示例
  • Jetty

第 244 章 NSQ 组件

作为 Camel 版本 2.23 可用

作为 Camel 版本 2.23 可用

NSQ 是一个实时分布式消息传递平台。

Maven 用户需要将以下依赖项添加到其 pom.xml 中,以便该组件:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-nsq</artifactId>
    <!-- use the same version as your Camel core version -->
    <version>x.y.z</version>
</dependency>

244.1. URI 格式

nsq:servers[?options]

其中的服务器代表 NSQ 服务器列表 - 在制作者时消费者和 nsqd 服务器的情况下,对服务器进行 nsqlookupd 服务器。 

244.2. 选项

NSQ 组件支持 2 个选项,它们如下所列。

名称描述默认类型

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

NSQ 端点使用 URI 语法配置:

nsq:servers

使用以下路径和查询参数:

244.2.1. 路径名(1 参数):

名称描述默认类型

servers

需要 一个或多个 nsqlookupd 服务器(consumer)或 nsqd 服务器(生成的服务器)的主机名。

 

字符串

244.2.2. 查询参数(16 参数):

名称描述默认类型

topic (common)

要使用 的主题名称

 

字符串

userAgent (common)

用于标识客户端类型的字符串

 

字符串

autoFinish (consumer)

从排序和处理交换之前检索时,自动完成 NSQ 消息。

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

channel (consumer)

要使用的频道名称

 

字符串

lookupInterval (consumer)

查找重试间隔

5000

long

lookupServerPort (consumer)

nsqdlookupd 服务器的端口

4161

int

messageTimeout (consumer)

使用者的 NSQ 消息超时。

-1

long

poolSize (consumer)

消费者池大小

10

int

requeueInterval (consumer)

requeue 间隔

-1

long

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

port (producer)

nsqd 服务器的端口

4150

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

安全 (安全)

设置安全选项,表示需要 TLS

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

244.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.nsq.enabled

是否启用 nsq 组件的自动配置。默认启用。

 

布尔值

camel.component.nsq.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.nsq.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

第 245 章 OGNL 语言

可作为 Camel 版本 1.1 提供

Camel 允许 OGNL 用作表达式或表示 DSL 或 Xml 配置。

您可以使用 OGNL 在 Message Filter 中创建 Predicate,或作为 Recipient List 的表达式

您可以使用 OGNL点符号来调用操作。如果您用于实例的正文包含 POJO,它具有 getFamilyName 方法,则可以按照如下所示构建语法:

"request.body.familyName"
   // or
"getRequest().getBody().getFamilyName()"

245.1. OGNL 选项

OGNL 语言支持 1 选项,这些选项如下。

名称默认Java 类型描述

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

245.2. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.language.ognl.enabled

启用 ognl 语言

true

布尔值

camel.language.ognl.trim

是否修剪值是否删除前导(尾随空格和换行符)

true

布尔值

245.3. 变量

变量类型描述

this

Exchange

Exchange 是 root 对象

exchange

Exchange

Exchange 对象

例外

Throwable

Exchange 异常(如果有)

exchangeId

字符串

交换 ID

故障

消息

失败消息(如果有)

Request (请求)

消息

Exchange.in 消息

响应

消息

Exchange.out 消息(如果有)

属性

map

交换属性

property(name)

对象

给定名称中的 属性

property(name, type)

类型

给定名称中的 属性作为给定类型

245.4. Samples

例如,您可以在 XML 中的 Message Filter 中使用 OGNL

<route>
  <from uri="seda:foo"/>
  <filter>
    <ognl>request.headers.foo == 'bar'</ognl>
    <to uri="seda:bar"/>
  </filter>
</route>

使用 Java DSL 的示例:

   from("seda:foo").filter().ognl("request.headers.foo == 'bar'").to("seda:bar");

245.5. 从外部资源载入脚本

可从 Camel 2.11 开始

您可以对脚本进行外部化,并使 Camel 从资源(如 "classpath:""file:""http:" )加载。
这可通过以下语法完成: "resource:scheme:location",例如参考类路径上的文件,您可以执行以下操作:

.setHeader("myHeader").ognl("resource:classpath:myognl.txt")

245.6. 依赖项

要在 camel 路由中使用 OGNL,您需要添加实现 OGNL 语言的依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-ognl</artifactId>
  <version>x.x.x</version>
</dependency>

否则,您还需要 OGNL

第 246 章 Olingo2 组件

作为 Camel 版本 2.14 可用

Olingo2 组件使用 Apache Olingo 版本 2.0 API 与 OData 2.0 兼容服务交互。许多流行的商业和企业供应商及产品都支持 OData 协议。有关支持产品的示例列表,请参见 OData 网站

Olingo2 组件支持读取反馈、增量源、实体、简单和复杂属性、链接、计数、使用自定义和 OData 系统查询参数。它支持更新实体、属性和关联链接。它还支持以单个 OData 批处理操作形式提交查询和更改请求。 

组件支持为 OData 服务连接配置 HTTP 连接参数和标头。这允许根据目标 OData 服务的要求配置使用 SSL、OAuth2.0 等。 

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-olingo2</artifactId>
        <version>${camel-version}</version>
    </dependency>

246.1. URI 格式

    olingo2://endpoint/<resource-path>?[options]

246.2. Olingo2 选项

Olingo2 组件支持 3 个选项,它们如下所列。

名称描述默认类型

configuration (common)

使用共享配置

 

Olingo2Configuration

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Olingo2 端点使用 URI 语法配置:

olingo2:apiName/methodName

使用以下路径和查询参数:

246.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

Olingo2ApiName

methodName

所选操作需要什么子操作

 

字符串

246.2.2. 查询参数(14 参数):

名称描述默认类型

connectTimeout (common)

HTTP 连接创建超时,以毫秒为单位,默认为 30,000 (30 秒)

30000

int

contentType (common)

content-Type 标头值可以用来指定 JSON 或 XML 消息格式,默认为 application/json;charset=utf-8

application/json;charset=utf-8

字符串

httpAsyncClientBuilder (common)

自定义 HTTP async 客户端构建器用于更复杂的 HTTP 客户端配置,覆盖 connectionTimeout、socketTimeout、代理和 sslContext。请注意,在构建器中指定 socketTimeout MUST,否则 OData 请求可能会无限期阻断

 

HttpAsyncClientBuilder

httpClientBuilder (common)

自定义 HTTP 客户端构建器用于更复杂的 HTTP 客户端配置,覆盖 connectionTimeout、socketTimeout、代理和 sslContext。请注意,在构建器中指定 socketTimeout MUST,否则 OData 请求可能会无限期阻断

 

HttpClientBuilder

httpHeaders (common)

要注入每个请求的自定义 HTTP 标头,这可能包括 OAuth 令牌等。

 

map

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

proxy (common)

HTTP 代理服务器配置

 

HttpHost

serviceUri (common)

目标 OData 服务基础 URI,例如 http://services.odata.org/OData/OData.svc

 

字符串

socketTimeout (common)

HTTP 请求超时(毫秒)默认为 30,000 (30 秒)

30000

int

sslContextParameters (common)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

246.3. Spring Boot Auto-Configuration

组件支持 14 个选项,它们如下所列。

名称描述默认类型

camel.component.olingo2.configuration.api-name

要执行的操作种类

 

Olingo2ApiName

camel.component.olingo2.configuration.connect-timeout

HTTP 连接创建超时,以毫秒为单位,默认为 30,000 (30 秒)

30000

整数

camel.component.olingo2.configuration.content-type

content-Type 标头值可以用来指定 JSON 或 XML 消息格式,默认为 application/json;charset=utf-8

application/json;charset=utf-8

字符串

camel.component.olingo2.configuration.http-async-client-builder

自定义 HTTP async 客户端构建器用于更复杂的 HTTP 客户端配置,覆盖 connectionTimeout、socketTimeout、代理和 sslContext。请注意,在构建器中指定 socketTimeout MUST,否则 OData 请求可能会无限期阻断

 

HttpAsyncClientBuilder

camel.component.olingo2.configuration.http-client-builder

自定义 HTTP 客户端构建器用于更复杂的 HTTP 客户端配置,覆盖 connectionTimeout、socketTimeout、代理和 sslContext。请注意,在构建器中指定 socketTimeout MUST,否则 OData 请求可能会无限期阻断

 

HttpClientBuilder

camel.component.olingo2.configuration.http-headers

要注入每个请求的自定义 HTTP 标头,这可能包括 OAuth 令牌等。

 

map

camel.component.olingo2.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.olingo2.configuration.proxy

HTTP 代理服务器配置

 

HttpHost

camel.component.olingo2.configuration.service-uri

目标 OData 服务基础 URI,例如 http://services.odata.org/OData/OData.svc

 

字符串

camel.component.olingo2.configuration.socket-timeout

HTTP 请求超时(毫秒)默认为 30,000 (30 秒)

30000

整数

camel.component.olingo2.configuration.ssl-context-parameters

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

camel.component.olingo2.enabled

启用 olingo2 组件

true

布尔值

camel.component.olingo2.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.olingo2.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

246.4. 生产端点

制作者端点可以使用下一个列出的端点名称和选项。 制作者端点也可以使用特殊选项 inBody ,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。inBody 选项默认为使用该选项的端点 的数据 。 

246.5. 端点选项

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelOlingo2.<option> 的格式。请注意, inBody 选项会覆盖消息标头,例如, Body=option 中的 endpoint 选项会覆盖 CamelOlingo2.option 标头。另外,也可以指定查询参数。 

名称类型描述

data

对象

用于创建或修改 OData 资源的适当类型的数据

keyPredicate

字符串

创建参数化 OData 资源端点的关键 predicate。对于在标头中动态提供 key predicate 值的 create/update 操作

queryParams

java.util.Map<String,String>

OData 系统选项和自定义查询选项。如需更多信息,请参阅 OData 2.0 URI Conventions

resourcePath

字符串

OData 资源路径,不可包含键 predicate

endpointHttpHeaders

java.util.Map<String, String>

要发送到端点的动态 HTTP 标头

responseHttpHeaders

java.util.Map<String, String>

端点的动态 HTTP 响应标头

请注意,resourcePath 选项可以在 URI 路径中指定,作为端点选项 ?resourcePath=<resource-path> 或作为标头值 CamelOlingo2.resourcePath。OData 实体键 predicate 可以是资源路径的一部分,例如 Manufacturers ( '1' ),其中 '__1' 是键 predicate,或者与资源路径 Manufacturers 和 keyPredicate 选项 '1' 分开指定。 

端点选项HTTP 方法结果 Body 类型

batch

data, endpointHttpHeaders

带有多部分/批批请求的 POST

java.util.List<org.apache.camel.component.olingo2.api.batch.Olingo2BatchResponse>

create

data, resourcePath, endpointHttpHeaders

POST

org.apache.olingo.odata2.api.ep.entry.ODataEntry 用于新条目 org.apache.olingo.odata2.api.commons.HttpStatusCodes for other OData 资源

delete

resourcePath, endpointHttpHeaders

DELETE

org.apache.olingo.odata2.api.commons.HttpStatusCodes

merge

data, resourcePath, endpointHttpHeaders

MERGE

org.apache.olingo.odata2.api.commons.HttpStatusCodes

patch

data, resourcePath, endpointHttpHeaders

PATCH

org.apache.olingo.odata2.api.commons.HttpStatusCodes

读取

queryParams, resourcePath, endpointHttpHeaders

GET

取决于接下来要查询的 OData 资源

update

data, resourcePath, endpointHttpHeaders

PUT

org.apache.olingo.odata2.api.commons.HttpStatusCodes

246.6. 端点 HTTP 标头(Since 2.20)

组件级别配置属性 httpHeaders 提供静态 HTTP 标头信息。但是,有些系统需要从端点传递给和接收动态标头信息。示例用例是需要动态安全令牌的系统。endpointHttpHeadersresponseHttpHeaders 端点属性提供此功能。设置需要在 CamelOlingo2.endpointHttpHeaders 属性中传递给端点的标头,并在 CamelOlingo2.responseHttpHeaders 属性中返回响应标头。这两个属性都是 java.util.Map<String, String> 类型。

246.7. OData Resource Type Mapping

读取 端点和数据类型的数据选项的结果取决于正在查询、创建或修改的 OData 资源。 

OData 资源类型resourcePath 和 keyPredicate 中的资源 URIin 或 Out Body Type

实体数据模型

$metadata

org.apache.olingo.odata2.api.edm.Edm

服务文档

/

org.apache.olingo.odata2.api.servicedocument.ServiceDocument

OData 源

<entity-set>

org.apache.olingo.odata2.api.ep.feed.ODataFeed

OData 条目

<entity-set>(<key-predicate>)

org.apache.olingo.odata2.api.ep.entry.ODataEntry for Out body (response) java.util.Map<String, Object> for In body (request)

简单属性

<entity-set>(<key-predicate>)/<simple-property>

Olingo EdmProperty 描述的 Java 数据类型

简单属性值

<entity-set>(<key-predicate>)/<simple-property>/$value

Olingo EdmProperty 描述的 Java 数据类型

复杂的属性

<entity-set>(<key-predicate>)/<complex-property>

java.util.Map<String, Object>

零个或一个关联链接

<entity-set>(<key-predicate>/$link/<one-to-one-entity-set-property>

用于响应 java.util.Map<String、Object> 且具有键属性名称和用于请求值的字符串

零个或多个关联链接

<entity-set>(<key-predicate>/$link/<one-to-many-entity-set-property>

java.util.List<String> for response java.util.List<java.util.Map<String, Object>> 包含键属性名称和值的列表

数量

<resource-uri>/$count

java.lang.Long

246.8. 消费者端点

只有 读取 端点可以用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Options 和 consumer. 前缀来调度端点调用。默认情况下,返回数组或集合的使用者端点将为每个元素生成一个交换,并且每个交换将执行一次其路由。可以通过设置 endpoint 属性 consumer.splitResult=false 来禁用此行为。 

246.9. 消息标头

任何 URI 选项都可以在生产端点的消息标头中提供,前缀为 CamelOlingo2 。

246.10. Message Body

所有结果消息正文都使用 Olingo2Component 使用底层 Apache Olingo 2.0 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息,除非 consumer.splitResult 设置为 false

246.11. 使用案例

以下路由从 Manufacturer 源中读取前 5 条目,通过升序名称属性读取。 

 

from("direct:...")
    .setHeader("CamelOlingo2.$top", "5");
    .to("olingo2://read/Manufacturers?orderBy=Name%20asc");

 

以下路由使用传入 id 标头中的 key 属性值读取 Manufacturer 条目。 

 

from("direct:...")
    .setHeader("CamelOlingo2.keyPredicate", header("id"))
    .to("olingo2://read/Manufacturers");

 

以下路由使用正文消息中的 java.util.Map<String, Object> 创建 Manufacturer 条目。 

 

from("direct:...")
    .to("olingo2://create/Manufacturers");

 

以下路由每 30 秒轮询 Manufacturer delta 源 。bean blah 更新 bean paramsBean ,将更新的 !deltatoken 属性添加 ODataDeltaFeed 结果中返回的值。由于初始 delta 令牌未知,消费者端点将首次生成 ODataFeed 值,并在后续轮询时 ODataDeltaFeed。 

 

from("olingo2://read/Manufacturers?queryParams=#paramsBean&consumer.timeUnit=SECONDS&consumer.delay=30")
    .to("bean:blah");

第 247 章 Olingo4 组件

作为 Camel 版本 2.19 可用

Olingo4 组件使用 Apache Olingo 版本 4.0 API 与 OData 4.0 兼容服务交互。自版本 4.0 OData 是 OASIS 标准,以及流行开源和商业供应商以及产品支持此协议的数目。有关支持产品的示例列表,请参见 OData 网站

Olingo4 组件支持读取实体集、实体、简单和复杂属性、使用自定义和 OData 系统查询参数。它支持更新实体和属性。它还支持以单个 OData 批处理操作形式提交查询和更改请求。 

组件支持为 OData 服务连接配置 HTTP 连接参数和标头。这允许根据目标 OData 服务的要求配置使用 SSL、OAuth2.0 等。 

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-olingo4</artifactId>
        <version>x.x.x</version>
        <!-- use the same version as your Camel core version -->
    </dependency>

247.1. URI 格式

    olingo4://endpoint/<resource-path>?[options]

247.2. Olingo4 选项

Olingo4 组件支持 3 个选项,它们如下所列。

名称描述默认类型

configuration (common)

使用共享配置

 

Olingo4Configuration

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Olingo4 端点使用 URI 语法配置:

olingo4:apiName/methodName

使用以下路径和查询参数:

247.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

Olingo4ApiName

methodName

所选操作需要什么子操作

 

字符串

247.2.2. 查询参数(14 参数):

名称描述默认类型

connectTimeout (common)

HTTP 连接创建超时,以毫秒为单位,默认为 30,000 (30 秒)

30000

int

contentType (common)

content-Type 标头值可以用来指定 JSON 或 XML 消息格式,默认为 application/json;charset=utf-8

application/json;charset=utf-8

字符串

httpAsyncClientBuilder (common)

自定义 HTTP async 客户端构建器用于更复杂的 HTTP 客户端配置,覆盖 connectionTimeout、socketTimeout、代理和 sslContext。请注意,在构建器中指定 socketTimeout MUST,否则 OData 请求可能会无限期阻断

 

HttpAsyncClientBuilder

httpClientBuilder (common)

自定义 HTTP 客户端构建器用于更复杂的 HTTP 客户端配置,覆盖 connectionTimeout、socketTimeout、代理和 sslContext。请注意,在构建器中指定 socketTimeout MUST,否则 OData 请求可能会无限期阻断

 

HttpClientBuilder

httpHeaders (common)

要注入每个请求的自定义 HTTP 标头,这可能包括 OAuth 令牌等。

 

map

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

proxy (common)

HTTP 代理服务器配置

 

HttpHost

serviceUri (common)

目标 OData 服务基础 URI,例如 http://services.odata.org/OData/OData.svc

 

字符串

socketTimeout (common)

HTTP 请求超时(毫秒)默认为 30,000 (30 秒)

30000

int

sslContextParameters (common)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

247.3. Spring Boot Auto-Configuration

组件支持 14 个选项,它们如下所列。

名称描述默认类型

camel.component.olingo4.configuration.api-name

要执行的操作种类

 

Olingo4ApiName

camel.component.olingo4.configuration.connect-timeout

HTTP 连接创建超时,以毫秒为单位,默认为 30,000 (30 秒)

30000

整数

camel.component.olingo4.configuration.content-type

content-Type 标头值可以用来指定 JSON 或 XML 消息格式,默认为 application/json;charset=utf-8

application/json;charset=utf-8

字符串

camel.component.olingo4.configuration.http-async-client-builder

自定义 HTTP async 客户端构建器用于更复杂的 HTTP 客户端配置,覆盖 connectionTimeout、socketTimeout、代理和 sslContext。请注意,在构建器中指定 socketTimeout MUST,否则 OData 请求可能会无限期阻断

 

HttpAsyncClientBuilder

camel.component.olingo4.configuration.http-client-builder

自定义 HTTP 客户端构建器用于更复杂的 HTTP 客户端配置,覆盖 connectionTimeout、socketTimeout、代理和 sslContext。请注意,在构建器中指定 socketTimeout MUST,否则 OData 请求可能会无限期阻断

 

HttpClientBuilder

camel.component.olingo4.configuration.http-headers

要注入每个请求的自定义 HTTP 标头,这可能包括 OAuth 令牌等。

 

map

camel.component.olingo4.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.olingo4.configuration.proxy

HTTP 代理服务器配置

 

HttpHost

camel.component.olingo4.configuration.service-uri

目标 OData 服务基础 URI,例如 http://services.odata.org/OData/OData.svc

 

字符串

camel.component.olingo4.configuration.socket-timeout

HTTP 请求超时(毫秒)默认为 30,000 (30 秒)

30000

整数

camel.component.olingo4.configuration.ssl-context-parameters

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

camel.component.olingo4.enabled

启用 olingo4 组件

true

布尔值

camel.component.olingo4.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.olingo4.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

247.4. 生产端点

制作者端点可以使用下一个列出的端点名称和选项。 制作者端点也可以使用特殊选项 inBody ,它应当包含该端点选项的名称,其值将包含在 Camel Exchange In 消息中。inBody 选项默认为使用该选项的端点 的数据 。 

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelOlingo4.<option> 的格式。请注意, inBody 选项会覆盖消息标头,例如, Body=option 中的 endpoint 选项会覆盖 CamelOlingo4.option 标头。另外,也可以指定查询参数 

请注意,resourcePath 选项可以在 URI 路径中指定,作为端点选项 ?resourcePath=<resource-path> 或作为标头值 CamelOlingo4.resourcePath。OData 实体键 predicate 可以是资源路径的一部分,例如 Manufacturers ( '1' ),其中 '__1' 是键 predicate,或者与资源路径 Manufacturers 和 keyPredicate 选项 '1' 分开指定。 

端点选项HTTP 方法结果 Body 类型

batch

data, endpointHttpHeaders

带有多部分/批批请求的 POST

java.util.List<org.apache.camel.component.olingo4.api.batch.Olingo4BatchResponse>

create

data, resourcePath, endpointHttpHeaders

POST

org.apache.olingo.client.api.domain.ClientEntity for new entries org.apache.olingo.commons.api.http.HttpStatusCode for other OData 资源

delete

resourcePath, endpointHttpHeaders

DELETE

org.apache.olingo.commons.api.http.HttpStatusCode

merge

data, resourcePath, endpointHttpHeaders

MERGE

org.apache.olingo.commons.api.http.HttpStatusCode

patch

data, resourcePath, endpointHttpHeaders

PATCH

org.apache.olingo.commons.api.http.HttpStatusCode

读取

queryParams, resourcePath, endpointHttpHeaders

GET

取决于接下来要查询的 OData 资源

update

data, resourcePath, endpointHttpHeaders

PUT

org.apache.olingo.commons.api.http.HttpStatusCode

247.5. 端点 HTTP 标头(自 Camel 2.20开始)

组件级别配置属性 httpHeaders 提供静态 HTTP 标头信息。但是,有些系统需要从端点传递给和接收动态标头信息。示例用例是需要动态安全令牌的系统。endpointHttpHeadersresponseHttpHeaders 端点属性提供此功能。设置需要在 CamelOlingo4.endpointHttpHeaders 属性中传递给端点的标头,并在 CamelOlingo4.responseHttpHeaders 属性中返回响应标头。这两个属性都是 java.util.Map<String, String> 类型。

247.6. OData Resource Type Mapping

读取 端点和数据类型的数据选项的结果取决于正在查询、创建或修改的 OData 资源。 

OData 资源类型resourcePath 和 keyPredicate 中的资源 URIin 或 Out Body Type

实体数据模型

$metadata

org.apache.olingo.commons.api.edm.Edm

服务文档

/

org.apache.olingo.client.api.domain.ClientServiceDocument

OData 实体集

<entity-set>

org.apache.olingo.client.api.domain.ClientEntitySet

OData 实体

<entity-set>(<key-predicate>)

org.apache.olingo.client.api.domain.ClientEntity for Out body (response) java.util.Map<String, Object> for In body (request)

简单属性

<entity-set>(<key-predicate>)/<simple-property>

org.apache.olingo.client.api.domain.ClientPrimitiveValue

简单属性值

<entity-set>(<key-predicate>)/<simple-property>/$value

org.apache.olingo.client.api.domain.ClientPrimitiveValue

复杂的属性

<entity-set>(<key-predicate>)/<complex-property>

org.apache.olingo.client.api.domain.ClientComplexValue

数量

<resource-uri>/$count

java.lang.Long

247.7. 消费者端点

只有 读取 端点可以用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Options 和 consumer. 前缀来调度端点调用。默认情况下,返回数组或集合的使用者端点将为每个元素生成一个交换,并且每个交换将执行一次其路由。可以通过设置 endpoint 属性 consumer.splitResult=false 来禁用此行为。 

247.8. 消息标头

任何 URI 选项都可以在具有 CamelOlingo4 前缀的生产端点的消息标头中提供。

247.9. Message Body

所有结果消息正文都使用 Olingo4Component 使用底层 Apache Olingo 4.0 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息,除非 consumer.splitResult 设置为 false

247.10. 使用案例

以下路由从 People 实体由 FirstName 属性排序的前 5 条目读取前 5 条目。 

 

from("direct:...")
    .setHeader("CamelOlingo4.$top", "5");
    .to("olingo4://read/People?orderBy=FirstName%20asc");

 

以下路由使用传入 id 标头中的 key 属性值来读取 Airports 实体。 

 

from("direct:...")
    .setHeader("CamelOlingo4.keyPredicate", header("id"))
    .to("olingo4://read/Airports");

 

以下路由使用正文消息中 的客户端增强创建 People 实体。 

 

from("direct:...")
    .to("olingo4://create/People");

第 248 章 OpenShift Component (deprecated)

作为 Camel 版本 2.14 可用

openshift 组件是管理 OpenShift 应用程序的组件。 

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-openshift</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

248.1. URI 格式

openshift:clientId[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

248.2. 选项

OpenShift 组件支持 5 个选项,它们如下所列。

名称描述默认类型

username (security)

要登录到 openshift 服务器的用户名。

 

字符串

密码 (安全)

登录 openshift 服务器的密码。

 

字符串

domain (common)

域名.如果未指定,则使用默认域。

 

字符串

server (common)

openshift 服务器的 URL。如果没有指定,则使用本地 openshift 配置文件 /.openshift/express.conf 的默认值。如果使用失败,则使用 openshift.redhat.com。

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

OpenShift 端点使用 URI 语法配置:

openshift:clientId

使用以下路径和查询参数:

248.2.1. 路径名(1 参数):

名称描述默认类型

clientId

所需的 客户端 ID

 

字符串

248.2.2. 查询参数(26 参数):

名称描述默认类型

domain (common)

域名.如果未指定,则使用默认域。

 

字符串

password (common)

需要 密码以登录 openshift 服务器。

 

字符串

server (common)

openshift 服务器的 URL。如果没有指定,则使用本地 openshift 配置文件 /.openshift/express.conf 的默认值。如果使用失败,则使用 openshift.redhat.com。

 

字符串

username (common)

需要登录 openshift 服务器的用户名。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

application (producer)

要启动、停止、重启或获取状态的应用程序名称。

 

字符串

mode (producer)

将消息正文输出为 pojo 或 json。对于 pojo,消息是 List 类型。

 

字符串

operation (producer)

要执行的操作,可以是:list、start、stop、restart 和 state。list 操作以 json 格式返回有关所有应用程序的信息。状态操作返回状态,如:start、已停止等。其他操作不会返回任何值。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

248.3. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.openshift.domain

域名.如果未指定,则使用默认域。

 

字符串

camel.component.openshift.enabled

启用 openshift 组件

true

布尔值

camel.component.openshift.password

登录 openshift 服务器的密码。

 

字符串

camel.component.openshift.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.openshift.server

openshift 服务器的 URL。如果没有指定,则使用本地 openshift 配置文件 /.openshift/express.conf 的默认值。如果使用失败,则使用 openshift.redhat.com。

 

字符串

camel.component.openshift.username

要登录到 openshift 服务器的用户名。

 

字符串

248.4. 例子

248.4.1. 列出所有应用程序

// sending route
from("direct:apps")
    .to("openshift:myClient?username=foo&password=secret&operation=list");
    .to("log:apps");

在本例中,所有应用程序的信息返回为 pojo。如果您想要 json 响应,则设置 mode=json。

248.4.2. 停止应用程序

// stopping the foobar application
from("direct:control")
    .to("openshift:myClient?username=foo&password=secret&operation=stop&application=foobar");
 

在上面的示例中,我们停止名为 foobar 的应用程序。

 

轮询 gear 状态更改

使用者用于 Gears 中的轮询状态变化。例如,当添加新设备/删除/或其生命周期被改变、eg started 或 stopped 等时。

// trigger when state changes on our gears
from("openshift:myClient?username=foo&password=secret&delay=30s")
    .log("Event ${header.CamelOpenShiftEventType} on application ${body.name} changed state to ${header.CamelOpenShiftEventNewState}");

 

当消费者发出 Exchange 时,正文包含 com.openshift.client.IApplication 作为消息正文。包括以下标头。

标头可以是 null描述

CamelOpenShiftEventType

事件类型,可以是:添加、删除或更改的。

CamelOpenShiftEventOldState

事件类型更改时,旧状态。

CamelOpenShiftEventNewState

任何事件类型的新状态

248.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 249 章 OpenShift Build Config 组件

作为 Camel 2.17 版提供

OpenShift Build Config 组件是 Kubernetes 组件 中的一个,它提供了一个制作者来执行 kubernetes 构建配置操作。

249.1. 组件选项

Openshift Build Config 组件没有选项。

249.2. 端点选项

Openshift Build Config 端点使用 URI 语法进行配置:

openshift-build-configs:masterUrl

使用以下路径和查询参数:

249.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

249.2.2. 查询参数(20 参数):

名称描述默认类型

apiVersion (producer)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (producer)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (producer)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

portName (producer)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (producer)

用于 ServiceCall EIP 的端口协议

tcp

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

第 250 章 OpenShift Builds 组件

作为 Camel 2.17 版提供

Kubernetes Builds 组件是 Kubernetes 组件 中的一个,提供执行 kubernetes 构建操作的制作者。

250.1. 组件选项

Openshift Builds 组件没有选项。

250.2. 端点选项

Openshift Builds 端点使用 URI 语法进行配置:

openshift-builds:masterUrl

使用以下路径和查询参数:

250.2.1. 路径名(1 参数):

名称描述默认类型

masterUrl

所需的 Kubernetes 主 URL

 

字符串

250.2.2. 查询参数(20 参数):

名称描述默认类型

apiVersion (producer)

要使用的 Kubernetes API 版本

 

字符串

dnsDomain (producer)

用于 ServiceCall EIP 的 dns 域

 

字符串

kubernetesClient (producer)

如果提供,则使用默认 KubernetesClient

 

KubernetesClient

operation (producer)

在 Kubernetes 上执行的操作

 

字符串

portName (producer)

用于 ServiceCall EIP 的端口名称

 

字符串

portProtocol (producer)

用于 ServiceCall EIP 的端口协议

tcp

字符串

connectionTimeout (advanced)

对 Kubernetes API 服务器发出请求时使用的连接超时(毫秒)。

 

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

caCertData (security)

CA 证书数据

 

字符串

caCertFile (security)

CA 证书文件

 

字符串

clientCertData (security)

客户端证书数据

 

字符串

clientCertFile (security)

客户端证书文件

 

字符串

clientKeyAlgo (security)

客户端使用的 Key Algorithm

 

字符串

clientKeyData (security)

客户端密钥数据

 

字符串

clientKeyFile (security)

Client Key 文件

 

字符串

clientKeyPassphrase (security)

客户端密钥密码

 

字符串

oauthToken (security)

Auth Token

 

字符串

密码 (安全)

连接到 Kubernetes 的密码

 

字符串

trustCerts (security)

定义我们使用的证书是否被信任

 

布尔值

username (security)

要连接到 Kubernetes 的用户名

 

字符串

250.3. OpenStack 组件

可作为 Camel 2.19 提供

openstack 组件是管理 OpenStack 应用程序的组件。 

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-openstack</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
OpenStack 服务Camel 组件描述

OpenStack Cinder

openstack-cinder

维护 OpenStack cinder 的组件。

OpenStack Glance

openstack-glance

维护 OpenStack glance 的组件。

OpenStack Keystone

openstack-keystone

维护 OpenStack Keystone 的组件。

OpenStack Neutron

openstack-neutron

维护 OpenStack neutron 的组件。

OpenStack Nova

openstack-nova

维护 OpenStack nova 的组件。

OpenStack Swift

openstack-swift

用于维护 OpenStack swift 的组件。

第 251 章 OpenStack Cinder Component

作为 Camel 版本 2.19 可用

openstack-cinder 组件允许消息发送到 OpenStack 块存储服务。

251.1. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-openstack</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本。

251.2. URI 格式

openstack-cinder://hosturl[?options]

您可以以以下格式将查询选项附加到 URI 中 ?options=value&option2=value&…​

251.3. URI 选项

OpenStack Cinder 组件没有选项。

OpenStack Cinder 端点使用 URI 语法进行配置:

openstack-cinder:host

使用以下路径和查询参数:

251.3.1. 路径名(1 参数):

名称描述默认类型

主机

所需的 OpenStack 主机 URL

 

字符串

251.3.2. 查询参数(9 参数):

名称描述默认类型

apiVersion (producer)

OpenStack API 版本

V3

字符串

config (producer)

OpenStack 配置

 

config

domain (producer)

身份验证域

default

字符串

operation (producer)

要执行的操作

 

字符串

password (producer)

所需的 OpenStack 密码

 

字符串

project (producer)

所需的项目 ID

 

字符串

subsystem (producer)

所需的 OpenStack Cinder 子系统

 

字符串

username (producer)

所需的 OpenStack 用户名

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

251.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.openstack-cinder.enabled

启用 openstack-cinder 组件

true

布尔值

camel.component.openstack-cinder.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

251.5. 使用

您可以为每个子系统使用以下设置:

251.6. 卷

251.6.1. 您可以使用卷制作者执行的操作

操作描述

create

创建新卷。

get

获取卷。

getAll

获取所有卷。

getAllTypes

获取卷类型。

update

更新卷。

delete

删除卷。

251.6.2. Volume producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

卷的 ID。

name

字符串

卷名称。

description

字符串

卷描述.

size

整数

卷的大小。

volumeType

字符串

卷类型.

imageRef

字符串

映像 ID。

snapshotId

字符串

快照 ID。

isBootable

布尔值

可启动。

如果您需要更精确的卷设置,您可以创建类型为 org.openstack4j.model.storage.block.Volume 的新对象,并在消息正文中发送。

251.7. 快照

251.7.1. 您可以使用 Snapshot producer 执行操作

操作描述

create

创建新快照。

get

获取快照。

getAll

获取所有快照。

update

获取快照更新。

delete

删除快照。

251.7.2. Snapshot producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

服务器的 ID。

name

字符串

服务器名称。

description

字符串

快照描述。

VolumeId

字符串

卷 ID。

force

布尔值

强制.

如果您需要更精确的服务器设置,您可以创建类型为 org.openstack4j.model.storage.block.VolumeSnapshot 的新对象,并在消息正文中发送。

251.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • OpenStack 组件

第 252 章 OpenStack Glance Component

作为 Camel 版本 2.19 可用

openstack-glance 组件允许将消息发送到 OpenStack 镜像服务。

252.1. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-openstack</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本。

252.2. URI 格式

openstack-glance://hosturl[?options]

您可以以以下格式将查询选项附加到 URI 中 ?options=value&option2=value&…​

252.3. URI 选项

OpenStack Glance 组件没有选项。

OpenStack Glance 端点使用 URI 语法配置:

openstack-glance:host

使用以下路径和查询参数:

252.3.1. 路径名(1 参数):

名称描述默认类型

主机

所需的 OpenStack 主机 URL

 

字符串

252.3.2. 查询参数(8 参数):

名称描述默认类型

apiVersion (producer)

OpenStack API 版本

V3

字符串

config (producer)

OpenStack 配置

 

config

domain (producer)

身份验证域

default

字符串

operation (producer)

要执行的操作

 

字符串

password (producer)

所需的 OpenStack 密码

 

字符串

project (producer)

所需的项目 ID

 

字符串

username (producer)

所需的 OpenStack 用户名

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

252.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.openstack-glance.enabled

启用 openstack-glance 组件

true

布尔值

camel.component.openstack-glance.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

252.5. 使用

操作描述

reserve

保留镜像。

create

创建新镜像。

update

更新镜像。

upload

上传镜像。

get

获取镜像。

getAll

获取所有镜像。

delete

删除镜像。

252.5.1. Glance producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

类别的 ID。

name

字符串

类别名称。

diskFormat

org.openstack4j.model.image.DiskFormat

类别 VCPU 数。

containerFormat

org.openstack4j.model.image.ContainerFormat

RAM 大小。

owner

字符串

镜像所有者.

isPublic

布尔值

是公共的。

minRam

Long

最低限度.

minDisk

Long

最小磁盘.

size

Long

大小.

checksum

字符串

校验和.

属性

Map

映像属性.

252.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • OpenStack 组件

第 253 章 OpenStack Keystone Component

作为 Camel 版本 2.19 可用

openstack-keystone 组件允许消息发送到 OpenStack 身份服务。

openstack-keystone 组件仅支持 Identity API v3!

253.1. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-openstack</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本。

253.2. URI 格式

openstack-keystone://hosturl[?options]

您可以以以下格式将查询选项附加到 URI 中 ?options=value&option2=value&…​

253.3. URI 选项

OpenStack Keystone 组件没有选项。

OpenStack Keystone 端点使用 URI 语法配置:

openstack-keystone:host

使用以下路径和查询参数:

253.3.1. 路径名(1 参数):

名称描述默认类型

主机

所需的 OpenStack 主机 URL

 

字符串

253.3.2. 查询参数(8 参数):

名称描述默认类型

config (producer)

OpenStack 配置

 

config

domain (producer)

身份验证域

default

字符串

operation (producer)

要执行的操作

 

字符串

password (producer)

所需的 OpenStack 密码

 

字符串

project (producer)

所需的项目 ID

 

字符串

subsystem (producer)

所需的 OpenStack Keystone 子系统

 

字符串

username (producer)

所需的 OpenStack 用户名

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

253.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.openstack-keystone.enabled

启用 openstack-keystone 组件

true

布尔值

camel.component.openstack-keystone.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

253.5. 使用

您可以为每个子系统使用以下设置:

253.6. domains

253.6.1. 您可以使用域制作者执行的操作

操作描述

create

创建新域。

get

获取域。

getAll

获取所有域。

update

更新域。

delete

删除域。

253.6.2. Domain producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

域的 ID。

name

字符串

域名。

description

字符串

域描述.

如果需要更精确的域设置,您可以创建类型为 org.openstack4j.model.identity.v3.Domain 的新对象,并在消息正文中发送。

253.7. groups

253.7.1. 您可以使用 Group producer 执行的操作

操作描述

create

创建新组。

get

获取组。

getAll

获取所有组。

update

更新组。

delete

删除组。

addUserToGroup

将用户添加到组。

checkUserGroup

检查组中的用户。

removeUserFromGroup

从组中删除用户。

253.7.2. Group producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

groupId

字符串

组的 ID。

name

字符串

组名称。

userId

字符串

用户的 ID。

domainId

字符串

域的 ID。

description

字符串

组描述。

如果需要更精确的组设置,您可以创建类型为 org.openstack4j.model.identity.v3.Group 的新对象,并在消息正文中发送。

253.8. projects

253.8.1. 您可以使用项目制作者执行的操作

操作描述

create

创建新项目。

get

获取该项目。

getAll

获取所有项目。

update

更新项目。

delete

删除项目。

253.8.2. 项目制作者评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

项目的 ID。

name

字符串

项目名称。

description

字符串

项目描述.

domainId

字符串

域的 ID。

parentId

字符串

父项目 ID。

如果需要更精确的项目设置,您可以创建类型为 org.openstack4j.model.identity.v3.Project 的新对象,并在消息正文中发送。

253.9. 区域

253.9.1. 您可以使用 Region producer 执行的操作

操作描述

create

创建新区域。

get

获取地区。

getAll

获取所有区域。

update

更新区域。

delete

删除地区。

253.9.2. 由 Region producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

区域的 ID。

description

字符串

地区描述.

如果需要更精确的区域设置,您可以创建类型为 org.openstack4j.model.identity.v3.Region 的新对象,并在消息正文中发送。

253.10. users

253.10.1. 您可以使用用户制作者执行的操作

操作描述

create

创建新用户。

get

获取用户。

getAll

获取所有用户。

update

更新用户。

delete

删除用户。

253.10.2. 用户制作者评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

用户的 ID。

name

字符串

用户名。

description

字符串

用户描述.

domainId

字符串

域的 ID。

password

字符串

用户的密码。

email

字符串

用户的电子邮件。

如果需要更精确的用户设置,您可以创建类型为 org.openstack4j.model.identity.v3.User 的新对象,并在消息正文中发送。

253.11. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • OpenStack 组件

第 254 章 OpenStack Neutron Component

作为 Camel 版本 2.19 可用

openstack-neutron 组件允许消息发送到 OpenStack 网络服务。

254.1. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-openstack</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本。

254.2. URI 格式

openstack-neutron://hosturl[?options]

您可以以以下格式将查询选项附加到 URI 中 ?options=value&option2=value&…​

254.3. URI 选项

OpenStack Neutron 组件没有选项。

OpenStack Neutron 端点使用 URI 语法配置:

openstack-neutron:host

使用以下路径和查询参数:

254.3.1. 路径名(1 参数):

名称描述默认类型

主机

所需的 OpenStack 主机 URL

 

字符串

254.3.2. 查询参数(9 参数):

名称描述默认类型

apiVersion (producer)

OpenStack API 版本

V3

字符串

config (producer)

OpenStack 配置

 

config

domain (producer)

身份验证域

default

字符串

operation (producer)

要执行的操作

 

字符串

password (producer)

所需的 OpenStack 密码

 

字符串

project (producer)

所需的项目 ID

 

字符串

subsystem (producer)

所需的 OpenStack Neutron 子系统

 

字符串

username (producer)

所需的 OpenStack 用户名

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

254.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.openstack-neutron.enabled

启用 openstack-neutron 组件

true

布尔值

camel.component.openstack-neutron.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

254.5. 使用

您可以为每个子系统使用以下设置:

254.6. 网络

254.6.1. 您可以使用网络制作者执行的操作

操作描述

create

创建新网络。

get

获取网络。

getAll

获取所有网络。

delete

删除该网络。

254.6.2. Network producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

网络的 ID。

name

字符串

网络名称。

tenantId

字符串

租户 ID。

adminStateUp

布尔值

AdminStateUp 标头.

networkType

org.openstack4j.model.network.NetworkType

网络类型。

physicalNetwork

字符串

物理网络.

segmentId

字符串

网段 ID。

isShared

布尔值

共享。

isRouterExternal

布尔值

是路由器外部。

如果需要更精确的网络设置,您可以创建类型为 org.openstack4j.model.network.Network 的新对象,并在消息正文中发送。

254.7. subnets

254.7.1. 您可以使用 Subnet producer 执行的操作

操作描述

create

创建新子网。

get

获取子网。

getAll

获取所有子网。

delete

删除子网。

action

对子网执行操作。

254.7.2. 子网制作者评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

子网的 ID。

name

字符串

子网名称。

networkId

字符串

网络 ID。

enableDHCP

布尔值

启用 DHCP。

gateway

字符串

网关.

如果您需要更精确的子网设置,您可以创建类型为 org.openstack4j.model.network.Subnet 的新对象,并在消息正文中发送。

254.8. ports

254.8.1. 您可以使用端口制作器执行的操作

操作描述

create

创建新端口。

get

获取端口。

getAll

获取所有端口。

update

更新端口。

delete

删除端口。

254.8.2. 端口制作者评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

name

字符串

端口名称。

networkId

字符串

网络 ID。

tenantId

字符串

租户 ID。

deviceId

字符串

设备 ID。

macAddress

字符串

MAC 地址.

254.9. 路由器

254.9.1. 您可以使用路由器制作者执行的操作

操作描述

create

创建新路由器。

get

获取路由器。

getAll

获取所有路由器。

update

更新路由器。

delete

删除路由器。

attachInterface

连接接口。

detachInterface

分离接口。

254.9.2. 端口制作者评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

name

字符串

路由器名称。

routerId

字符串

路由器 ID.

subnetId

字符串

子网 ID。

portId

字符串

端口 ID。

interfaceType

org.openstack4j.model.network.AttachInterfaceType

接口类型。

tenantId

字符串

租户 ID。

254.10. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • OpenStack 组件

第 255 章 OpenStack Nova Component

作为 Camel 版本 2.19 可用

openstack-nova 组件允许消息发送到 OpenStack 计算服务。

255.1. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-openstack</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本。

255.2. URI 格式

openstack-nova://hosturl[?options]

您可以以以下格式将查询选项附加到 URI 中 ?options=value&option2=value&…​

255.3. URI 选项

OpenStack Nova 组件没有选项。

OpenStack Nova 端点使用 URI 语法配置:

openstack-nova:host

使用以下路径和查询参数:

255.3.1. 路径名(1 参数):

名称描述默认类型

主机

所需的 OpenStack 主机 URL

 

字符串

255.3.2. 查询参数(9 参数):

名称描述默认类型

apiVersion (producer)

OpenStack API 版本

V3

字符串

config (producer)

OpenStack 配置

 

config

domain (producer)

身份验证域

default

字符串

operation (producer)

要执行的操作

 

字符串

password (producer)

所需的 OpenStack 密码

 

字符串

project (producer)

所需的项目 ID

 

字符串

subsystem (producer)

所需的 OpenStack Nova 子系统

 

字符串

username (producer)

所需的 OpenStack 用户名

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

255.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.openstack-nova.enabled

启用 openstack-nova 组件

true

布尔值

camel.component.openstack-nova.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

255.5. 使用

您可以为每个子系统使用以下设置:

255.6. flavors

255.6.1. 您可以使用类别制作者执行的操作

操作描述

create

创建新类别。

get

获取类别。

getAll

获取所有类别。

delete

删除类别。

255.6.2. Flavor producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

类别的 ID。

name

字符串

类别名称。

VCPU

整数

类别 VCPU 数。

ram

整数

RAM 大小。

disk

整数

磁盘大小。

swap

整数

交换的大小。

rxtxFactor

整数

Rxtx Factor.

如果需要更精确的类别设置,您可以创建类型为 org.openstack4j.model.compute.Flavor 的新对象,并在消息正文中发送。

255.7. Server

255.7.1. 您可以使用服务器制作者执行的操作

操作描述

create

创建新服务器。

createSnapshot

创建服务器的快照。

get

获取服务器。

getAll

获取所有服务器。

delete

删除服务器。

action

对服务器执行操作。

255.7.2. 服务器制作者评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

ID

字符串

服务器的 ID。

name

字符串

服务器名称。

ImageId

字符串

镜像 ID。

FlavorId

字符串

将使用的类别的 ID。

KeypairName

字符串

密钥对名称。

NetworkId

字符串

网络 ID。

AdminPassword

字符串

新服务器的管理员密码。

action

org.openstack4j.model.compute.Action

要执行的操作。

如果需要更精确的服务器设置,您可以在消息正文中创建类型为 org.openstack4j.model.compute.ServerCreate 和 send 的新对象。

255.8. keypairs

255.8.1. 您可以使用密钥对制作者执行的操作

操作描述

create

创建新密钥对.

get

获取密钥对。

getAll

获取所有密钥对。

delete

删除密钥对。

255.8.2. Keypair producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

name

字符串

密钥对名称。

255.9. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • OpenStack 组件

第 256 章 OpenStack Swift Component

作为 Camel 版本 2.19 可用

openstack-swift 组件允许消息发送到 OpenStack 对象存储服务。

256.1. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-openstack</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本。

256.2. URI 格式

openstack-swift://hosturl[?options]

您可以以以下格式将查询选项附加到 URI 中 ?options=value&option2=value&…​

256.3. URI 选项

OpenStack Swift 组件没有选项。

OpenStack Swift 端点使用 URI 语法配置:

openstack-swift:host

使用以下路径和查询参数:

256.3.1. 路径名(1 参数):

名称描述默认类型

主机

所需的 OpenStack 主机 URL

 

字符串

256.3.2. 查询参数(9 参数):

名称描述默认类型

apiVersion (producer)

OpenStack API 版本

V3

字符串

config (producer)

OpenStack 配置

 

config

domain (producer)

身份验证域

default

字符串

operation (producer)

要执行的操作

 

字符串

password (producer)

所需的 OpenStack 密码

 

字符串

project (producer)

所需的项目 ID

 

字符串

subsystem (producer)

所需的 OpenStack Swift 子系统

 

字符串

username (producer)

所需的 OpenStack 用户名

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

256.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.openstack-swift.enabled

启用 openstack-swift 组件

true

布尔值

camel.component.openstack-swift.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

256.5. 使用

您可以为每个子系统使用以下设置:

256.6. containers

256.6.1. 您可以使用容器制作者执行的操作

操作描述

create

创建新容器。

get

获取容器。

getAll

获取所有容器。

update

更新容器。

delete

删除容器。

getMetadata

获取元数据。

createUpdateMetadata

创建/更新元数据.

deleteMetadata

删除元数据。

256.6.2. Volume producer 评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

name

字符串

容器名称。

X-Container-Meta-

Map

容器元数据前缀。

x-Versions-Location

字符串

版本位置。

x-Container-Read

字符串

ACL - 容器读取。

X-Container-Write

字符串

acl - 容器写入。

limit

整数

列出选项 - 限制.

marker

字符串

列出选项 - 标记。

end_marker

字符串

列出选项 - 结束标记。

delimiter

字符

列出选项 - 分隔符.

path

字符串

列出选项 - 路径。

如果需要更精确的容器设置,您可以创建类型为 org.openstack4j.model.storage.object.options.CreateUpdateContainerOptions 的新对象(如果创建或更新操作)或 org.openstack4j.model.storage.object.options.ContainerListOptions,用于列出容器并在消息正文中发送。

256.7. 对象

256.7.1. 您可以使用对象制作者执行的操作

操作描述

create

创建新对象。

get

获取对象。

getAll

获取所有对象。

update

获取对象更新。

delete

删除对象。

getMetadata

获取元数据。

createUpdateMetadata

创建/更新元数据.

256.7.2. 由对象制作者评估的消息标头

标头类型描述

operation

字符串

要执行的操作。

containerName

字符串

容器名称。

objectName

字符串

对象名称。

256.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • OpenStack 组件

第 257 章 OpenTracing 组件

可作为 Camel 2.19 提供

重要

从 Camel 2.21 开始,需要使用与 OpenTracing Java API 版本 0.31 或更高版本兼容的 OpenTracing 错误跟踪器。

camel-opentracing 组件用于使用 OpenTracing 进行追踪和传入和传出的 Camel 消息。

事件(span)捕获用于传入和发送到 Camel 的传出消息。

如需受支持的 tracers 列表,请参阅 OpenTracing 网站。

257.1. 配置

OpenTracing 跟踪器的配置属性有:

选项默认值描述

excludePatterns

 

设置 exclude 模式,它将为与 模式匹配的 Camel 消息禁用追踪。内容是一个 Set<String>,其中键是一个模式。该模式使用来自 Intercept 的规则。

encoding

false

设置标头键是否需要编码(特定于连接器)。该值是一个布尔值。需要为 JMS 属性键编码实例。

可以将 OpenTracing 跟踪器配置为为 Camel 应用提供分布式追踪方法:

257.1.1. explicit

在您的 POM 中包含 camel-opentracing 组件,以及与所选 OpenTracing 兼容 Tracer 关联的特定依赖项。

若要显式配置 OpenTracing 支持,可实例化 OpenTracingTracer 并初始化 camel 上下文。您可以选择指定一个 Tracer,或使用 RegistryServiceLoader 隐式发现它。

OpenTracingTracer ottracer = new OpenTracingTracer();
// By default it uses a Noop Tracer, but you can override it with a specific OpenTracing implementation.
ottracer.setTracer(...);
// And then initialize the context
ottracer.init(camelContext);

若要在 XML 中使用 OpenTracingTracer,您需要做的一点就是定义 OpenTracing tracer Bean。Camel 将自动发现并使用它们。

  <bean id="tracer" class="..."/>
  <bean id="ottracer" class="org.apache.camel.opentracing.OpenTracingTracer">
    <property name="tracer" ref="tracer"/>
  </bean>

257.2. Spring Boot

如果使用 Spring Boot,可以添加 camel-opentracing-starter 依赖项,并使用 @CamelOpenTracing 标注主类来打开 OpenTracing。

Tracer 将从 camel 上下文 的 RegistryServiceLoader 隐式获取,除非应用程序定义了 Tracer bean。

257.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.opentracing.encoding

在标头中激活或停用短划线编码(JMS 时需要)用于消息传递

 

布尔值

camel.opentracing.exclude-patterns

设置 exclude 模式,它将为与 模式匹配的 Camel 消息禁用追踪。

 

Set

257.4. Java Agent

第三种方式是使用 Java 代理自动配置 OpenTracing 支持。

在您的 POM 中包含 camel-opentracing 组件,以及与所选 OpenTracing 兼容 Tracer 关联的特定依赖项。

OpenTracing Java 代理与以下依赖项关联:

    <dependency>
      <groupId>io.opentracing.contrib</groupId>
      <artifactId>opentracing-agent</artifactId>
    </dependency>

使用的 Tracer 将从 camel 上下文 RegistryServiceLoader 中隐式加载。

如何使用此代理来特定于如何执行您的应用程序。camel-example-opentracing 将代理下载到本地文件夹中,然后使用 exec-maven-plugin 使用 -javaagent 命令行选项启动服务。

257.5. 示例

您可在此处查找配置 OpenTracing 的三种方法示例: camel-example-opentracing

第 258 章 OptaPlanner Component

作为 Camel 版本 2.13 可用

optaplanner: 组件解决了在带有 OptaPlanner 的消息中包含的规划问题。
例如:提供无法解决的 Vehicle Routing 问题,它解决了这一问题。

组件支持使用者为 BestSolutionChangedEvent 侦听器,以及用于处理解决方案和 ProblemFactChange 的制作者

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-optaplanner</artifactId>
    <version>x.x.x</version><!-- use the same version as your Camel core version -->
</dependency>

258.1. URI 格式

optaplanner:solverConfig[?options]

solverConfig 是 solverConfig 的 classpath-local URI,如 /org/foo/barSolverConfig.xml

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

258.2. OptaPlanner 选项

OptaPlanner 组件没有选项。

OptaPlanner 端点使用 URI 语法配置:

optaplanner:configFile

使用以下路径和查询参数:

258.2.1. 路径名(1 参数):

名称描述默认类型

configFile

必需 指定 solver 文件的位置

 

字符串

258.2.2. 查询参数(7 参数):

名称描述默认类型

solverId (common)

为 solver instance 键指定用户的 solverId

DEFAULT_SOLVER

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

async (producer)

指定在同步模式中执行操作

false

布尔值

threadPoolSize (producer)

指定当 async 为 true 时使用的线程池大小

10

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

258.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.optaplanner.enabled

启用 optaplanner 组件

true

布尔值

camel.component.optaplanner.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

258.4. 消息标头

名称默认值类型Context描述

CamelOptaPlannerSolverId

null

字符串

共享

指定要使用的 solverId

CamelOptaPlannerIsAsync

PUT

字符串

制作者

指定是否使用另一个线程提交解决方案实例,而不是阻止当前线程。

258.5. Message Body

Camel 对 IN 正文的规划问题,对其进行解决,并在 OUT 正文(自 v 2.16)上返回它(自 v 2.16)支持以下用例:

  • 如果正文是解决方案的实例,则会使用 solverId 识别的 solverId 以及异步或异步标识的 solver 解决它。
  • 如果正文是 ProblemFactChange 实例,则它将触发 addProblemFactChange。如果处理是异步的,它将等待 till 为EveryProblemFactChangeProcessed,然后再返回结果。
  • 如果正文没有上述类型,则制作者将从 solverId 标识的 solver 返回最佳结果。

258.6. 终止

只要 solverConfig 中的规定,解决将花费很长时间。

<solver>
  ...
  <termination>
    <!-- Terminate after 10 seconds, unless it's not feasible by then yet -->
    <terminationCompositionStyle>AND</terminationCompositionStyle>
    <secondsSpentLimit>10</secondsSpentLimit>
    <bestScoreLimit>-1hard/0soft</bestScoreLimit>
  </termination>
  ...
<solver>

 

258.6.1. Samples

解决使用 OptaPlanner 的 ActiveMQ 队列上的计划问题:

from("activemq:My.Queue").
  .to("optaplanner:/org/foo/barSolverConfig.xml");

公开 OptaPlanner 作为 REST 服务:

from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
  .to("optaplanner:/org/foo/barSolverConfig.xml");

258.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 259 章 Paho Component

作为 Camel 版本 2.16 可用

Paho 组件使用 Eclipse Paho 库为 MQTT 消息协议提供连接器。Paho 是最受欢迎的 awx 库之一,因此,如果您希望将其与 Java 项目集成 - Camel Paho 连接器是一种好方法。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-paho</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>

请记住,Pho 工件没有托管在 Maven Central 中,因此您需要将 Eclipse Paho 存储库添加到 POM xml 文件中:

<repositories>
  <repository>
    <id>eclipse-paho</id>
    <url>https://repo.eclipse.org/content/repositories/paho-releases</url>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
</repositories>

259.1. URI 格式

paho:topic[?options]

其中,topic 是主题的名称。

259.2. 选项

Paho 组件支持 4 个选项,它们如下所列。

名称描述默认类型

brokerUrl (common)

MCG 代理的 URL。

 

字符串

clientId (common)

awx 客户端标识符。

 

字符串

connectOptions (advanced)

客户端连接选项

 

MqttConnectOptions

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Paho 端点使用 URI 语法进行配置:

paho:topic

使用以下路径和查询参数:

259.2.1. 路径名(1 参数):

名称描述默认类型

topic

主题 所需的 名称

 

字符串

259.2.2. 查询参数(15 参数):

名称描述默认类型

autoReconnect (common)

如果连接丢失,客户端将自动尝试重新连接服务器

true

布尔值

brokerUrl (common)

MCG 代理的 URL。

tcp://localhost:1883

字符串

clientId (common)

awx 客户端标识符。

 

字符串

connectOptions (common)

客户端连接选项

 

MqttConnectOptions

filePersistenceDirectory (common)

文件持久性提供程序使用的基础目录。

 

字符串

password (common)

用于对 MQTT 代理进行身份验证的密码

 

字符串

persistence (common)

使用的客户端持久性 - 内存或文件.

内存

PahoPersistence

qos (common)

客户端服务质量(0-2)。

2

int

resolveMqttConnectOptions (common)

定义是否不想从 registry 解析 MQTT Connect Options

true

布尔值

retained (common)

保留选项

false

布尔值

userName (common)

用于对 MQTT 代理进行身份验证的用户名

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

259.3. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.component.paho.broker-url

MCG 代理的 URL。

 

字符串

camel.component.paho.client-id

awx 客户端标识符。

 

字符串

camel.component.paho.connect-options

客户端连接选项。选项是一个 org.eclipse.paho.client.mqttv3.MqttConnectOptions 类型。

 

字符串

camel.component.paho.enabled

启用 paho 组件

true

布尔值

camel.component.paho.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

259.4. Headers

以下标头可以通过 Paho 组件识别:

标头Java constant端点类型值类型描述

CamelMqttTopic

PahoConstants.MQTT_TOPIC

消费者

字符串

主题的名称

CamelPahoOverrideTopic

PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC

制作者

字符串

要覆盖并发送到的主题名称,而不是在端点中指定的主题

259.5. 默认有效负载类型

默认情况下,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);

259.6. Samples

例如,以下代码片段读取来自与 Camel 路由器相同的主机上安装代理的消息:

from("paho:some/queue")
    .to("mock:test");

虽然以下代码片段将信息发送到 LAST 代理:

from("direct:test")
    .to("paho:some/target/queue");

例如,如何从远程 MQTT 代理读取信息: 

from("paho:some/queue?brokerUrl=tcp://iot.eclipse.org:1883")
    .to("mock:test");

在这里,我们将覆盖默认主题并设置为动态主题

from("direct:test")
    .setHeader(PahoConstants.CAMEL_PAHO_OVERRIDE_TOPIC, simple("${header.customerId}"))
    .to("paho:some/target/queue");

第 260 章 OSGi PAX Logging 组件

可作为 Camel 版本 2.6 提供。

paxlogging 组件可在 OSGi 环境中使用,以接收 PaxLogging 事件并处理它们。

260.1. 依赖项

Maven 用户需要在其 pom.xml中添加以下依赖项

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-paxlogging</artifactId>
  <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.6.0 或更高版本)。

260.2. URI 格式

paxlogging:appender[?options]

其中 appender 是 PaxLogging 服务配置中需要配置的 pax 附加器的名称。

260.3. URI 选项

OSGi PAX Logging 组件支持 2 个选项,它们如下所列。

名称描述默认类型

bundleContext (consumer)

Camel 自动注入 OSGi BundleContext

 

BundleContext

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

OSGi PAX Logging 端点使用 URI 语法进行配置:

paxlogging:appender

使用以下路径和查询参数:

260.3.1. 路径名(1 参数):

名称描述默认类型

appender

必需 Appender 是 PaxLogging 服务配置中需要配置的 pax 附加器的名称。

 

字符串

260.3.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

260.4. 邮件正文

邮件正文 中的 设置为收到的 PaxLoggingEvent。

260.5. 用法示例

<route>
    <from uri="paxlogging:camel"/>
    <to uri="stream:out"/>
</route>

配置:

log4j.rootLogger=INFO, out, osgi:VmLogAppender, osgi:camel

第 261 章 PDF 组件

作为 Camel 版本 2.16 可用

PDF: 组件提供从 PDF 文档创建、修改或提取内容的功能。此组件使用 Apache PDFBox 作为基础库来使用 PDF 文档。

要使用 PDF 组件,Maven 用户需要将以下依赖项添加到其 pom.xml 中:

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-pdf</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

261.1. URI 格式

PDF 组件仅支持制作者端点。

pdf:operation[?options]

261.2. 选项

PDF 组件没有选项。

PDF 端点使用 URI 语法配置:

pdf:operation

使用以下路径和查询参数:

261.2.1. 路径名(1 参数):

名称描述默认类型

operation

所需的 Operation 类型

 

PdfOperation

261.2.2. 查询参数(9 参数):

名称描述默认类型

font (producer)

font

Helvetica

PDFont

fontSize (producer)

pixels 中的字体大小

14

浮点值

marginBottom (producer)

pixels 中的利润

20

int

marginLeft (producer)

pixels 左侧的利润

20

int

marginRight (producer)

pixels 右侧的利润

40

int

marginTop (producer)

pixels 中的利润

20

int

pageSize (producer)

页面大小

A4

PDRectangle

textProcessingFactory (producer)

要使用的文本处理。使用文本按单词获取分片,然后在行中获取适合该行的最大单词的数量。使用这个策略,所有在行中不匹配的词语都将移至新行。行终止终止:构建一组行终止写入策略。文本通过行终止符号分片,然后写入,无论它适合行中。

lineTermination

TextProcessingFactory

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

261.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.pdf.enabled

启用 pdf 组件

true

布尔值

camel.component.pdf.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

261.4. Headers

标头描述

pdf-document

附加 操作和忽略的强制标头,在所有其他操作中忽略。预期类型为 PDDocument。存储 PDF 文档,以用于附加操作。

protection-policy

预期类型为https://pdfbox.apache.org/docs/1.8.10/javadocs/org/apache/pdfbox/pdmodel/encryption/ProtectionPolicy.html[ProtectionPolicy]。如果指定,则 PDF 文档将与其加密。

decryption-material

预期类型为https://pdfbox.apache.org/docs/1.8.10/javadocs/org/apache/pdfbox/pdmodel/encryption/DecryptionMaterial.html[DecryptionMaterial]。如果 PDF 文档已加密,则需要填写。

261.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

-   -

第 262 章 PostgresSQL Event Component

作为 Camel 版本 2.15 可用

这是 Apache Camel 的组件,允许在 PostgreSQL 8.3 后添加与 LISTEN/NOTIFY 命令相关的 PostgreSQL 事件。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-pgevent</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

URI 格式

pgevent 组件使用以下两种端点 URI 表示法:

pgevent:datasource[?parameters]
pgevent://host:port/database/channel[?parameters]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

262.1. 选项

PostgresSQL 事件组件没有选项。

PostgresSQL 事件端点使用 URI 语法进行配置:

pgevent:host:port/database/channel

使用以下路径和查询参数:

262.1.1. 路径名(4 参数):

名称描述默认类型

主机

要使用主机名和端口连接到数据库,请执行以下操作:

localhost

字符串

port

要使用主机名和端口连接到数据库,请执行以下操作:

5432

整数

database

所需的 数据库名称

 

字符串

channel

所需的 频道名称

 

字符串

262.1.2. 查询参数(7 参数):

名称描述默认类型

datasource (common)

使用给定的 javax.sql.DataSource 而不是使用主机名和端口进行连接。

 

DataSource

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

PASS (安全性)

用于登录的密码

 

字符串

user (security)

用于登录的用户名

postgres

字符串

262.2. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.pgevent.enabled

启用 pgevent 组件

true

布尔值

camel.component.pgevent.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

262.3. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 263 章 PGP DataFormat

作为 Camel 版本 2.9 提供。

PGP 数据格式将 Java Cryptographic Extension 集成到 Camel 中,允许使用 Camel 熟悉的 marshall 和 unmarshal 格式对消息进行简单、灵活的加密和解密。它假定 marshalling 为意味着对cyphertext 和 unmarshalling 的加密功能,意味着解密回原始明文。此数据格式仅实施对称(共享密钥)加密和取消处理。

263.1. PGPDataFormat Options

PGP 数据格式支持 15 个选项,它们如下。

名称默认Java 类型描述

keyUserid

 

字符串

在加密过程中使用的 PGP 密钥环中密钥的用户 ID。也可以是用户 ID 的一部分。例如,如果用户 ID 是 Test User,那么您可以使用 Test User 部分或处理用户 ID。

signatureKeyUserid

 

字符串

用于签名(加密)或签名验证(解密解密)中密钥的用户 ID。在签名验证过程中,指定的用户 ID 限制来自公共密钥环的公钥,这些密钥可用于验证。如果没有为签名指定用户 ID,那么可以使用公共密钥环中的任何公钥进行验证。也可以是用户 ID 的一部分。例如,如果用户 ID 是 Test User,那么您可以使用 Test User 部分或处理用户 ID。

password

 

字符串

打开私钥时使用的密码(不用于加密)。

signaturePassword

 

字符串

打开用于签名(加密)的私钥时使用的密码。

keyFileName

 

字符串

密钥环的文件名;必须可作为类路径资源进行访问(但您可以使用 file: 前缀在文件系统中指定位置)。

signatureKeyFileName

 

字符串

用于签名(加密)或签名验证(解密)的密钥环的文件名;必须作为类路径资源访问(但您可以使用 file: prefix 指定文件系统中的位置)。

signatureKeyRing

 

字符串

用于签名/验证为字节阵列的密钥环。您不能同时设置 signatureKeyFileName 和 signatureKeyRing。

armored

false

布尔值

这个选项将导致 PGP 对加密的文本进行编码,使其可用于复制/粘贴等。

integrity

true

布尔值

在加密文件中添加完整性检查/签名。默认值为 true。

provider

 

字符串

Java Cryptography Extension (JCE)供应商,默认为 Bouncy Castle (BC)。另外,您可以使用 IAIK JCE 提供商;在这种情况下,必须事先注册该提供程序,并且 Bouncy Castle 提供商不能事先注册。Sun JCE 供应商不起作用。

algorithm

 

整数

对称密钥加密算法; 可能的值在 org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags; 例如 2 (= TRIPLE DES), 3 (= CAST5), 4 (= BLOWFISH), 6 (= DES), 7 (= AES_128)。仅与加密相关。

compressionAlgorithm

 

整数

压缩算法;可能的值在 org.bouncycastle.bcpg.CompresionAlgorithmTags; 例如 0 (= UNCOMPRESSED), 1 (= ZIP), 2 (= ZLIB), 3 (= BZIP2)。仅与加密相关。

hashAlgorithm

 

整数

签名哈希算法;可能的值在 org.bouncycastle.bcpg.HashAlgorithmTags; 例如 2 (= SHA1), 8 (= SHA256), 9 (= SHA384), 10 (= SHA512), 11 (=SHA224)。仅与签名相关。

signatureVerificationOption

 

字符串

控制在取消处理过程中验证签名的行为。可以有 4 个值:可选:PGP 消息可能包含签名,如果它包含签名,则执行签名验证。必需: PGP 消息必须至少包含一个签名;如果这不是例外(PGPException),则引发异常(PGPException)。一个签名验证会被执行。忽略 PGP 消息中的签名将被忽略;不会执行签名验证。no_signature_allowed: no_signature_allowed: PGP 消息不得包含签名;否则会抛出异常(PGPException)。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

263.2. PGPDataFormat 消息标题

您可以通过动态将以下标头应用到消息来覆盖 PGPDataFormat 选项。

名称类型描述

CamelPGPDataFormatKeyFileName

字符串

由于 Camel 2.11.0 ;密钥环的文件名; 将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatEncryptionKeyRing

byte[]

由于 Camel 2.12.1 ;加密密钥环; 将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatKeyUserid

字符串

由于 Camel 2.11.0 ;PGP 密钥环中密钥的用户 ID; 将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatKeyUserids

列出<字符串>

由于 camel 2.12.2 :PGP 密钥环中密钥的用户 ID; 将覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatKeyPassword

字符串

由于 Camel 2.11.0 ;打开私钥时使用的密码; 将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatSignatureKeyFileName

字符串

由于 Camel 2.11.0 ;签名密钥环的文件名; 将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatSignatureKeyRing

byte[]

由于 Camel 2.12.1 ;签名密钥环; 将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatSignatureKeyUserid

字符串

由于 Camel 2.11.0 ;PGP 密钥环中签名密钥的用户 ID; 将覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatSignatureKeyUserids

列出<字符串>

自 Camel 2.12.3 起,PGP 密钥环中签名密钥的用户 ID; 将覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatSignatureKeyPassword

字符串

由于 Camel 2.11.0 ;打开签名私钥时使用的密码; 将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatEncryptionAlgorithm

int

自 Camel 2.12.2 起,对称密钥加密算法;将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatSignatureHashAlgorithm

int

由于 Camel 2.12.2 ;签名哈希算法; 将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatCompressionAlgorithm

int

由于 Camel 2.12.2 ;压缩算法; 将直接覆盖 PGPDataFormat 上的现有设置。

CamelPGPDataFormatNumberOfEncryptionKeys

整数

 *Camel 2.12.3 起,用于加密 symmectric 密钥的公钥数,在加密过程中由 PGPDataFormat 设置

CamelPGPDataFormatNumberOfSigningKeys

整数

 *Camel 2.12.3 起,用于创建签名的私钥数,在签名过程中由 PGPDataFormat 设置

263.3. 使用 PGPDataFormat 进行加密

以下示例使用流行的 PGP 格式加密/解密使用 Bouncy Castle Java 库 的文件:

以下示例执行签名 + 加密,然后签名验证 + 解密。它使用相同的密钥环进行签名和加密,但您可以区分不同的密钥:

或者使用 Spring:

263.3.1. 要使用上述示例,您需要以下内容

  • 一个公共密钥环文件,其中包含用于加密数据的公钥
  • 私有密钥环文件,其中包含用于解密数据的密钥
  • 密钥环密码

263.3.2. 管理密钥环

要管理密钥环,我使用 命令行工具,我发现这是管理密钥的最简单方法。如果您愿意做到这一点,还有来自 http://www.bouncycastle.org/java.html 的 Java 库。

在 linux 上安装命令行工具

apt-get install gnupg

创建密钥环,输入安全密码

gpg --gen-key

如果您需要导入其他人的公钥,以便您可以为它们加密文件。

gpg --import <filename.key

以下文件现在应存在,并可用于运行示例

ls -l ~/.gnupg/pubring.gpg ~/.gnupg/secring.gpg

[[crypto-PGPDecrypting/VerifyingofMessagesEncrypted/SignedbyDifferentPrivate/PublicKeys]] PGP Decrypting/Verifying of Messages Encrypted/Signed by different # Private/Public Keys

Camel 2.12.2 起,

PGP Data Formater 可以解密/验证通过不同公钥加密或由不同私钥签名的消息。只是在密钥密钥环中提供对应的私钥、公钥公钥、公钥以及密语访问者中的密码短语。

Map<String, String> userId2Passphrase = new HashMap<String, String>(2);
// add passphrases of several private keys whose corresponding public keys have been used to encrypt the messages
userId2Passphrase.put("UserIdOfKey1","passphrase1"); // you must specify the exact User ID!
userId2Passphrase.put("UserIdOfKey2","passphrase2");
PGPPassphraseAccessor passphraseAccessor = new PGPPassphraseAccessorDefault(userId2Passphrase);

PGPDataFormat pgpVerifyAndDecrypt = new PGPDataFormat();
pgpVerifyAndDecrypt.setPassphraseAccessor(passphraseAccessor);
// the method getSecKeyRing() provides the secret keyring as byte array containing the private keys
pgpVerifyAndDecrypt.setEncryptionKeyRing(getSecKeyRing()); // alternatively you can use setKeyFileName(keyfileName)
// the method getPublicKeyRing() provides the public keyring as byte array containing the public keys
pgpVerifyAndDecrypt.setSignatureKeyRing((getPublicKeyRing());  // alternatively you can use setSignatureKeyFileName(signatgureKeyfileName)
// it is not necessary to specify the encryption or signer  User Id

from("direct:start")
         ...
        .unmarshal(pgpVerifyAndDecrypt) // can decrypt/verify messages encrypted/signed by different private/public keys
        ...
  • 这个功能对支持密钥交换特别有用。如果您想交换用于解密的私钥,可以在一段时间内接受使用旧公钥加密或新的对应公钥的消息。或者,如果发送者要交换其签名密钥,您可以接受一段时间、旧人或新签名密钥。
  • 技术背景:PGP 加密的数据包含用于加密数据的公钥的密钥 ID。此密钥 ID 可用于在机密密钥环中查找私钥以解密数据。相同的机制也用于查找验证签名的公钥。因此,您不再需要为 unmarshaling 指定用户 ID。

263.4. 在 PGP 签名验证过程中限制签名身份

自 Camel 2.12.3 起.

如果您验证签名不仅要验证签名的正确性,而且您还需要检查签名是否来自特定身份或一组特定的身份。因此,可以限制公共密钥环中的公钥数量,这些公钥可用于验证签名。 

签名用户 ID

// specify the User IDs of the expected signer identities
 List<String> expectedSigUserIds = new ArrayList<String>();
 expectedSigUserIds.add("Trusted company1");
 expectedSigUserIds.add("Trusted company2");
 
 PGPDataFormat pgpVerifyWithSpecificKeysAndDecrypt = new PGPDataFormat();
 pgpVerifyWithSpecificKeysAndDecrypt.setPassword("my password"); // for decrypting with private key
 pgpVerifyWithSpecificKeysAndDecrypt.setKeyFileName(keyfileName);
 pgpVerifyWithSpecificKeysAndDecrypt.setSignatureKeyFileName(signatgureKeyfileName);
 pgpVerifyWithSpecificKeysAndDecrypt.setSignatureKeyUserids(expectedSigUserIds); // if you have only one signer identity then you can also use setSignatureKeyUserid("expected Signer")
 
from("direct:start")
         ...
        .unmarshal(pgpVerifyWithSpecificKeysAndDecrypt)
        ...
  • 如果 PGP 内容有几个签名,则在验证一个签名后立即进行验证。
  • 如果您不想限制 signer 身份进行验证,请不要指定签名密钥用户 ID。在这种情况下,公共密钥环中的所有公钥都会被考虑。

263.5. 一个 PGP 数据格式中的几个签名

自 Camel 2.12.3 起.

PGP 规范允许一个 PGP 数据格式包含来自不同密钥的多个签名。由于 Camel 2.13.3 能够通过指定与 secret 密钥环中若干私钥相关的签名用户 ID 来创建此类 PGP 内容。

几个签名

 PGPDataFormat pgpSignAndEncryptSeveralSignerKeys = new PGPDataFormat();
 pgpSignAndEncryptSeveralSignerKeys.setKeyUserid(keyUserid); // for encrypting, you can also use setKeyUserids if you want to encrypt with several keys
 pgpSignAndEncryptSeveralSignerKeys.setKeyFileName(keyfileName);
 pgpSignAndEncryptSeveralSignerKeys.setSignatureKeyFileName(signatgureKeyfileName);
 pgpSignAndEncryptSeveralSignerKeys.setSignaturePassword("sdude"); // here we assume that all private keys have the same password, if this is not the case then you can use setPassphraseAccessor

 List<String> signerUserIds = new ArrayList<String>();
 signerUserIds.add("company old key");
 signerUserIds.add("company new key");
 pgpSignAndEncryptSeveralSignerKeys.setSignatureKeyUserids(signerUserIds);
 
from("direct:start")
         ...
        .marshal(pgpSignAndEncryptSeveralSignerKeys)
        ...

263.6. 支持 PGP Data Format Marshaler 中的 Sub-Keys 和 Key Flags

自 *Camel 2.12.3.
*An OpenPGP V4 密钥 可以有一个主密钥和子密钥。密钥的使用由名为 Key 标记的指示。例如,您可以有一个主键(带有两个子键):主键只用于验证其他键(Key Flag 0x01),第一个子键只能用于签名(Key Flag 0x02),第二个子键只用于加密(Key Flag 0x04 或 0x08)。PGP Data Format marshaler 考虑了主密钥和子键的这些密钥标志,以确定签名和加密的正确密钥。这是必要的,因为主密钥及其子键具有相同的用户 ID。

263.7. 自定义密钥访问器支持

因为 *Camel 2.13.0.
*You 可以实施自定义密钥访问器用于加密/签名。以上 PGPDataFormat 类以特定预定义的方式选择用于签名/加密或验证/解密的密钥。如果您有特殊的要求,应该如何选择您的密钥,应使用 PGPKeyAccessDataFormat 类,并将 interfaces PGPPublicKeyAccessorPGPSecretKeyAccessor 实施为 Bean。默认实施 DefaultPGPPublicKeyAccessorDefaultPGPSecretKeyAccessor 会缓存密钥,因此当处理器被调用时不会解析密钥环。

PGPKeyAccessDataFormat 与 PGPDataFormat 的选项相同,但 password、keyFileName、encryptionKeyRing、signPassword、signKeyFileName 和 signatureKeyRing 除外。

263.8. 依赖项

若要在您的 camel 路由中使用 PGP 数据格式,需要向您的 pom 添加以下依赖项:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-crypto</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

263.9. 另请参阅

第 264 章 属性组件

作为 Camel 版本 2.3 可用

264.1. URI 格式

properties:key[?options]

其中 key 是属性查找的密钥

264.2. 选项

Properties 组件支持 17 选项,这些选项如下。

名称描述默认类型

locations (common)

加载属性的位置列表。这个选项将覆盖任何默认位置,且只使用这个选项中的位置。

 

list

location (common)

加载属性的位置列表。您可以使用逗号分隔多个位置。这个选项将覆盖任何默认位置,且只使用这个选项中的位置。

 

字符串

encoding (common)

从文件系统或类路径加载属性文件时要使用的编码。如果没有设置编码,则属性文件使用 ISO-8859-1 编码(latin-1)加载,如 java.util.Properties#load (java.io.InputStream)

 

字符串

propertiesResolver (common)

使用自定义 PropertiesResolver

 

PropertiesResolver

propertiesParser (common)

使用自定义 PropertiesParser

 

PropertiesParser

cache (common)

是否要缓存加载的属性。默认值为 true。

true

布尔值

propertyPrefix (advanced)

在解析前添加属性名称前的可选前缀。

 

字符串

propertySuffix (advanced)

在解析前,附加到属性名称的可选后缀。

 

字符串

fallbackToUnaugmented Property (高级)

如果为 true,则首先尝试使用 propertyPrefix 和 propertySuffix 解析属性名称,然后回退指定的纯文本名称。如果为 false,则只搜索 augmented 属性名称。

true

布尔值

defaultFallbackEnabled (common)

如果为 false,则组件不会通过在冒号分隔符后尝试查找密钥的默认值。

true

布尔值

ignoreMissingLocation (common)

是否静默地忽略某个位置是否无法找到,例如未找到属性文件。

false

布尔值

prefixToken (advanced)

设置用于识别要替换属性的前缀令牌的值。设置 null 值可恢复默认令牌(链接 DEFAULT_PREFIX_TOKEN)。

{{

字符串

suffixToken (advanced)

设置用于识别要替换属性的后缀令牌的值。设置 null 值可恢复默认令牌(link DEFAULT_SUFFIX_TOKEN)。

}}

字符串

initialProperties (advanced)

设置在解析任何位置之前将使用的初始属性。

 

Properties

overrideProperties (advanced)

设置具有优先级的覆盖属性的特殊列表,并将首先使用属性(如果属性存在)。

 

Properties

systemPropertiesMode (common)

设置系统属性模式。

2

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Properties 端点使用 URI 语法配置:

properties:key

使用以下路径和查询参数:

264.2.1. 路径名(1 参数):

名称描述默认类型

key

必需的 Property 键以用作占位符

 

字符串

264.2.2. 查询参数(6 参数):

名称描述默认类型

ignoreMissingLocation (common)

是否静默地忽略某个位置是否无法找到,例如未找到属性文件。

false

布尔值

locations (common)

加载属性的位置列表。您可以使用逗号分隔多个位置。这个选项将覆盖任何默认位置,且只使用这个选项中的位置。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

提示

解决 Java 代码
中的属性
,您可以使用 CamelContext 上的 PropertyPlace holders 来解析任何 Java 代码中的属性。

264.3. 使用 PropertyPlaceholder

可作为 Camel 2.3 提供

Camel 现在在 camel-core 中提供一个新的 PropertiesComponent,它允许您在定义 Camel 端点 URI 时使用属性占位符。

这在使用 Spring 的 < property-placeholder&gt; 标签时您这样做。但是,Spring 有一个限制,可以防止第三方框架将 Spring 属性占位符应用到完整。请参阅 如何在 Camel XML 中使用 Spring Property Placeholder

提示

桥接 Spring 和 Camel 属性占位符
from Camel 2.10 后,您可以使用 Camel 桥接 Spring 属性占位符,更多详情请参阅下文。

属性占位符通常在操作时使用:

  • 查找或创建端点
  • 在 registry 中查找 Bean
  • Spring XML 支持的附加(示例如下)
  • 使用带有 Camel Properties 组件的 Blueprint PropertyPlaceholder
  • 使用 @PropertyInject 注入 POJO 中的属性
  • 如果属性不存在,则使用默认值 Camel 2.14.1
  • Camel 2.14.1 包括了开箱即用的功能,以从操作系统环境变量、JVM 系统属性或服务 IDiom 中查找属性值。
  • Camel 2.14.1 使用自定义功能,可插入到属性组件中。

264.4. 语法

使用 Camel 的属性占位符语法是使用 {{key}} 示例,例如 {{file.uri}},其中 file.uri 是该属性键。

您可以使用端点 URI 的部分中的属性占位符,例如,您可以在 URI 中使用参数占位符。

从 Camel 2.14.1 开始,您可以指定一个默认值;如果键为属性不存在,则使用默认值;例如 file.url:/some/path,其中默认值是冒号(如 /some/path)后面的文本。

注意

不要在 property 键中使用冒号。当您提供默认值时,冒号用作分隔符令牌,从 Camel 2.14.1 开始被支持。

264.5. PropertyResolver

Camel 提供了一个可插拔机制,它允许第三部分提供自己的解析器查找属性。Camel 提供了一个默认的实现 org.apache.camel.component.properties.DefaultPropertiesResolver,它能够从文件系统、classpath 或 Registry 载入属性。您可以通过以下方法为位置添加前缀:

  • ref: Camel 2.4: to lookup in the Registry
  • file: 从文件系统载入
  • classpath: 从 classpath 中加载(如果没有提供前缀,这也为默认值)
  • 蓝图: Camel 2.7: 使用特定的 OSGi 蓝图占位符服务

264.6. 定义位置

PropertiesResolver 需要知道在什么位置解析属性。您可以将 1 定义为多个位置。如果您在一个 String 属性中定义位置,您可以使用逗号分隔多个位置,例如:

pc.setLocation("com/mycompany/myprop.properties,com/mycompany/other.properties");

可从 Camel 2.19.0 开始

您可以通过设置 optional 属性(默认为 false)设置可以丢弃哪些位置,即:

pc.setLocations(
    "com/mycompany/override.properties;optional=true"
    "com/mycompany/defaults.properties");

264.7. 在位置中使用系统和环境变量

可作为 Camel 2.7 提供

该位置现在支持对 JVM 系统属性和 OS 环境变量使用占位符。

例如:

location=file:${karaf.home}/etc/foo.properties

在以上位置上,我们将 JVM 系统属性与 key karaf.home 使用文件方案来定义位置。

要使用 OS 环境变量,而您必须带有 env 的前缀:

location=file:${env:APP_HOME}/etc/foo.properties

其中 APP_HOME 是 OS 环境。

您可以在同一位置上有多个占位符,例如:

location=file:${env:APP_HOME}/etc/${prop.name}.properties

#=== 使用系统和环境变量配置属性前缀和后缀

可作为 Camel 2.12.5、2.13.3、2.14.0 提供

属性前缀属性Suffix 配置属性支持将占位符用于 JVM 系统属性和 OS 环境变量。

例如:如果使用以下属性文件配置了 PropertiesComponent

dev.endpoint = result1
test.endpoint = result2

然后,使用以下路由定义:

PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class);
pc.setPropertyPrefix("${stage}.");
// ...
context.addRoutes(new RouteBuilder() {
    @Override
    public void configure() throws Exception {
        from("direct:start").to("properties:mock:{{endpoint}}");
    }
});

通过将系统属性 暂存更改 为 dev (消息将路由到 mock:result 1)或 test (消息将路由到 mock:result2),可以更改目标端点。

264.8. 在 Java DSL 中配置

您必须在 name 属性下创建并注册 PropertiesComponent,例如:

PropertiesComponent pc = new PropertiesComponent();
pc.setLocation("classpath:com/mycompany/myprop.properties");
context.addComponent("properties", pc);

264.9. 在 Spring XML 中配置

Spring XML 提供了两种配置变体。您可以将 spring bean 定义为 PropertiesComponent,它与 Java DSL 中执行的操作类似。或者,您可以使用 < propertyPlaceholder> 标签。

<bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
    <property name="location" value="classpath:com/mycompany/myprop.properties"/>
</bean>

使用 & lt;propertyPlaceholder > 标签使配置更加新的,例如:

<camelContext ...>
   <propertyPlaceholder id="properties" location="com/mycompany/myprop.properties"/>
</camelContext>

通过位置标签设置属性位置只是精细的,但您有一些资源可以考虑帐户并从 Camel 2.19.0 开始,您可以使用专用属性Location 设置属性位置:

<camelContext ...>
  <propertyPlaceholder id="myPropertyPlaceholder">
    <propertiesLocation
      resolver = "classpath"
      path     = "com/my/company/something/my-properties-1.properties"
      optional = "false"/>
    <propertiesLocation
      resolver = "classpath"
      path     = "com/my/company/something/my-properties-2.properties"
      optional = "false"/>
    <propertiesLocation
      resolver = "file"
      path     = "${karaf.home}/etc/my-override.properties"
      optional = "true"/>
   </propertyPlaceholder>
</camelContext>
提示

指定 XML
Camel 2.10 中的
缓存选项支持为 Spring 内的缓存选项和 Blueprint XML 指定值。

264.10. 使用 registry 中的属性

作为 Camel 2.4
以供在 OSGi 中提供,您可能想公开将属性作为 java.util.Properties 对象的服务。

然后,您可以按照如下所示设置 Properties 组件:

 <propertyPlaceholder id="properties" location="ref:myProperties"/>

其中 myProperties 是要在 OSGi 注册表中查找的 id。请注意,我们使用 ref: 前缀来告诉 Camel,它应该查找 Registry 的属性。

264.11. 使用属性组件的示例

在端点 URI 中使用属性占位符时,您可以使用 properties: 组件,或者直接在 URI 中定义占位符。从之前开始,我们将显示这两种情况的示例。

// properties
cool.end=mock:result

// route
from("direct:start").to("properties:{{cool.end}}");

您还可以使用占位符作为端点 uri 的一部分:

// properties
cool.foo=result

// route
from("direct:start").to("properties:mock:{{cool.foo}}");

在上面的示例中,指向 端点的 将解析为 mock:result

您还可以使用属性来互相参考,例如:

// properties
cool.foo=result
cool.concat=mock:{{cool.foo}}

// route
from("direct:start").to("properties:mock:{{cool.concat}}");

注意 cool.concat 如何引用另一属性。

properties: 组件还为您提供使用 位置 选项覆盖并提供给定 uri 中的位置:

   from("direct:start").to("properties:bar.end?locations=com/mycompany/bar.properties");

264.12. 例子

您还可以直接在端点 uris 中使用属性占位符,而无需使用 属性:

// properties
cool.foo=result

// route
from("direct:start").to("mock:{{cool.foo}}");

您可以在需要多个地方使用它们:

// properties
cool.start=direct:start
cool.showid=true
cool.result=result

// route
from("{{cool.start}}")
    .to("log:{{cool.start}}?showBodyType=false&showExchangeId={{cool.showid}}")
    .to("mock:{{cool.result}}");

例如,在使用 ProducerTemplate 时您的属性占位符:

template.sendBody("{{cool.start}}", "Hello World");

264.13. 使用 Simple 语言的示例

简单 语言现在支持使用属性占位符,例如在以下路由中使用:

// properties
cheese.quote=Camel rocks

// route
from("direct:start")
    .transform().simple("Hi ${body} do you think ${properties:cheese.quote}?");

您还可以在 Simple 语言中指定位置,例如:

// bar.properties
bar.quote=Beer tastes good

// route
from("direct:start")
    .transform().simple("Hi ${body}. ${properties:com/mycompany/bar.properties:bar.quote}.");

264.14. Spring XML 支持的其他属性占位符

属性占位符也在许多 Camel Spring XML 标签中支持,如 <package>、& lt;packageScan>、<contextScan>、<jmxAgent>、<endpoint>、<routeBuilder> 和 <proxy > 等等。

以下示例在 < jmxAgent> 标签中包含属性占位符:

您还可以在 < camelContext> 标签的不同属性 中定义属性占位符,如 trace,如下所示:

264.15. 使用 JVM System Property 覆盖属性设置

从 Camel 2.5开始,
可以在运行时使用 JVM System 属性覆盖属性值,而无需重启应用程序来获取更改。也可从命令行创建名称与它替换为新值的属性相同的 JVM 系统属性来实现。下面是一个示例

PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class);
pc.setCache(false);

System.setProperty("cool.end", "mock:override");
System.setProperty("cool.result", "override");

context.addRoutes(new RouteBuilder() {
    @Override
    public void configure() throws Exception {
        from("direct:start").to("properties:cool.end");
        from("direct:foo").to("properties:mock:{{cool.result}}");
    }
});
context.start();

getMockEndpoint("mock:override").expectedMessageCount(2);

template.sendBody("direct:start", "Hello World");
template.sendBody("direct:foo", "Hello Foo");

System.clearProperty("cool.end");
System.clearProperty("cool.result");

assertMockEndpointsSatisfied();

264.16. 对 XML DSL 中任何类型的属性使用属性占位符

可作为 Camel 2.7 提供

注意

如果您使用 OSGi Blueprint,则这只能从 2.11.12.10.5 开始工作。

在以前的版本中,它只是支持占位符的 XML DSL 中的 xs:string 类型属性。例如,超时属性通常是 xs:int 类型,因此您无法将字符串值设置为占位符键。现在,可以使用特殊的占位符命名空间从 Camel 2.7 开始。

在以下示例中,我们使用命名空间 http://camel.apache.org/schema/placeholderprop 前缀,它可以使用 XML DSL 中的属性中的 prop 前缀。请注意,我们在多播中使用该命令来指示选项 stopOnException 应当是带有键 "stop" 的占位符值。

在我们的属性文件中,我们具有定义的值

stop=true

264.17. 使用带有 Camel 路由的 Blueprint 属性占位符

可作为 Camel 2.7 提供

Camel 支持蓝图还提供属性占位符服务。Camel 支持有关配置的惯例,因此您必须做的一点是定义 XML 文件中的 OSGi Blueprint 属性占位符,如下所示:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

    <!-- OSGI blueprint property placeholder -->
    <cm:property-placeholder id="myblueprint.placeholder" persistent-id="camel.blueprint">
        <!-- list some properties as needed -->
        <cm:default-properties>
            <cm:property name="result" value="mock:result"/>
        </cm:default-properties>
    </cm:property-placeholder>

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <!-- in the route we can use {{ }} placeholders which will lookup in blueprint
             as Camel will auto detect the OSGi blueprint property placeholder and use it -->
        <route>
            <from uri="direct:start"/>
            <to uri="mock:foo"/>
            <to uri="{{result}}"/>
        </route>
    </camelContext>
</blueprint>

264.17.1. 在 Camel 路由中使用 OSGi 蓝图属性占位符

默认情况下,Camel 会检测并使用 OSGi 蓝图属性占位符服务。您可以通过在 < camelContext > 定义中将属性 useBlueprintPropertyResolver 设置为 false 来禁用此功能。

264.17.2. 关于占位符语法

注意我们如何将 Camel 语法用于 Camel 路由中的占位符 {{ 和 }},这将从 OSGi 蓝图中查找值。

占位符的蓝图语法为 ${ }。因此,在 & lt;camelContext& gt; 之外,您必须使用 ${ } 语法。在 < camelContext> 中,您必须使用 { { 和 }} 语法。

OSGi 蓝图允许您配置语法,这样您就可以真正地匹配它们。

您还可以显式引用特定 OSGi 蓝图属性占位符。因此,您需要使用 Camel 的 < propertyPlaceholder >,如下例所示:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

    <!-- OSGI blueprint property placeholder -->
    <cm:property-placeholder id="myblueprint.placeholder" persistent-id="camel.blueprint">
        <!-- list some properties as needed -->
        <cm:default-properties>
            <cm:property name="prefix.result" value="mock:result"/>
        </cm:default-properties>
    </cm:property-placeholder>

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <!-- using Camel properties component and refer to the blueprint property placeholder by its id -->
        <propertyPlaceholder id="properties" location="blueprint:myblueprint.placeholder"
                             prefixToken="[[" suffixToken="]]"
                             propertyPrefix="prefix."/>

        <!-- in the route we can use {{ }} placeholders which will lookup in blueprint -->
        <route>
            <from uri="direct:start"/>
            <to uri="mock:foo"/>
            <to uri="[[result]]"/>
        </route>
    </camelContext>
</blueprint>

264.18. 明确引用 Camel 中的 OSGi 蓝图占位符

请注意,我们如何使用 蓝图 方案通过其 id 引用 OSGi 蓝图占位符。这样,您可以混合和匹配,例如,您也可以在位置上有其他方案。例如,从 classpath 中载入一个文件,您可以:

location="blueprint:myblueprint.placeholder,classpath:myproperties.properties"

每个位置用逗号分隔。

264.19. 覆盖 CamelContext 以外的 Blueprint 属性占位符

可从 Camel 2.10.4 开始

当使用 Blueprint XML 文件中的 Blueprint 属性占位符时,您可以直接声明 XML 文件中的属性,如下所示:

请注意,我们有一个 &lt ;bean >,它代表其中一个属性。在 Camel 路由中,我们使用 {{ 和 }} 表示法引用另一个使用。

现在,如果要从单元测试覆盖这些蓝图属性,您可以如下所示:

为此,我们覆盖和实施 useOverridePropertiesWithConfigAdmin 方法。然后,我们可以将想要覆盖的属性放在给定的 props 参数上。return 值必须是 您在蓝图 XML 文件中定义的 &lt ;cm:property- placeholder> 标签的 persistence-id

264.20. 将 .cfg 或 .properties 文件用于 Blueprint 属性占位符

可从 Camel 2.10.4 开始

当使用 Blueprint XML 文件中的 Blueprint 属性占位符时,您可以在 .properties.cfg 文件中声明属性。如果您使用 Apache ServieMix / Karaf,则该容器具有从 etc/pid.cfg 的 etc/pid.cfg 的 etc 目录中加载属性的惯例,其中 pidpersistence-id

例如,在蓝图 XML 文件中,我们具有 persistence-id="stuff",这意味着它将把配置文件加载为 etc/stuff.cfg

现在,如果要单元测试这个蓝图 XML 文件,您可以覆盖 loadConfigAdminConfigurationFile,并告知 Camel 哪个文件载入如下:

请注意,此方法需要返回值为 2 值的 String[]。1st 值是加载的配置文件的路径。2nd 值是 < cm:property-placeholder> 标签的 persistence- id

stuff.cfg 文件只是一个纯文本文件,其属性占位符如下:

== this is a comment
greeting=Bye

264.21. 使用 .cfg 文件并覆盖 Blueprint 属性占位符的属性

同样也可以这样做。下面是一个完整的示例。首先,我们使用 Blueprint XML 文件:

在单元测试类中,我们按以下方式进行以下操作:

以及 etc/stuff.cfg 配置文件包含

greeting=Bye
echo=Yay
destination=mock:result

264.22. 桥接 Spring 和 Camel 属性占位符

可从 Camel 2.10 开始

Spring 框架不允许 Apache Camel 等第三方框架无缝 hook 到 Spring 属性占位符机制。但是,您可以通过声明类型为 org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer 类型的 Spring Bean 来轻松桥接 Spring org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 类型。

要桥接 Spring 和 Camel,您必须定义一个 bean,如下所示:

桥接 Spring 和 Camel 属性占位符

您不能 同时使用 spring <context:property-placeholder> 命名空间,这是不可能的。

在声明此 bean 后,您可以使用 Spring 风格来定义属性占位符,以及 <camelContext> 标签中的 Camel 风格,如下所示:

使用网桥属性占位符

注意 hello bean 如何使用 ${ } 表示法的纯 Spring 属性占位符。在 Camel 路由中,我们使用 {{ 和 }} 的 Camel 占位符表示法。

264.23. 使用 Camels Simple 语言清除 Spring 属性占位符

在使用 Spring 桥接占位符时请注意,在 Camel 中带有 Simple 的 spring ${ } 语法冲突,因此请小心。例如:

<setHeader headerName="Exchange.FILE_NAME">
  <simple>{{file.rootdir}}/${in.header.CamelFileName}</simple>
</setHeader>

与 Spring 属性占位符冲突,并且您应使用 $simple{ } 来指明在 Camel 中使用 简单 语言。

<setHeader headerName="Exchange.FILE_NAME">
  <simple>{{file.rootdir}}/$simple{in.header.CamelFileName}</simple>
</setHeader>

另一种方法是将 ignoreUn resolvablePlaceholders 选项为 true 来配置 Property Placeholderurer。

264.24. 覆盖 Camel 测试工具包的属性

可从 Camel 2.10 开始

使用 Camel 测试并使用 Properties 组件时,您可能想提供在单元测试源代码中直接使用的属性。
从 Camel 2.10 开始,作为 Camel 测试工具包,例如 CamelTestSupport 类提供以下方法

  • useOverridePropertiesWithPropertiesComponent
  • ignoreMissingLocationWithPropertiesComponent

因此,在单元测试类中,您可以覆盖 useOverridePropertiesWithPropertiesComponent 方法并返回 java.util.Properties,其中包含应使用的属性。

264.24.1. 从单元测试源中提供属性

这可以通过任何 Camel Test kits 进行,如 camel-test、camel-test-spring 和 camel-test-blueprint。

ignoreMissingLocationWithPropertiesComponent 可用于指示 Camel 忽略无法发现的任何位置,例如,在无法访问属性位置的环境中。

264.25. 使用 @PropertyInject

可作为 Camel 2.12 提供

Camel 允许使用 @PropertyInject 注释来注入 POJO 中的属性占位符,这些注释可设置字段和设置方法。

例如,您可以使用 RouteBuilder 类,如下所示:

public class MyRouteBuilder extends RouteBuilder {

    @PropertyInject("hello")
    private String greeting;

    @Override
    public void configure() throws Exception {
        from("direct:start")
            .transform().constant(greeting)
            .to("{{result}}");
    }

}

请注意,我们已向 greeting 字段标上 @PropertyInject,并把它定义为使用 "hello" 键。然后,Camel 将使用此键查找 属性并注入其值,转换为 String 类型。

您还可以在键中使用多个占位符和文本,例如,我们可以:

@PropertyInject("Hello {{name}} how are you?")
private String greeting;

这将查找带有键 "name" 的占位符。

如果键不存在,您也可以添加默认值,例如:

@PropertyInject(value = "myTimeout", defaultValue = "5000")
private int timeout;

264.26. 使用开箱即用的功能

可从 Camel 2.14.1 开始

Properties 组件包括以下功能开箱即用

  • env - 从操作系统环境变量中查找属性的功能
  • sys - 从 Java JVM 系统属性查找属性的功能
  • service - 使用服务命名 idiom 从 OS 环境变量查找属性的功能
  • service.name - Camel 2.16.1: 使用服务命名 idiom 仅返回主机名部分,从 OS 环境变量查找属性的功能
  • service.port - Camel 2.16.1: 利用服务命名 idiom 返回端口部分从 OS 环境变量查找属性的功能

如您所见,这些功能要从环境中轻松查找值。当它们开箱即用,它们可轻松使用,如下所示:

  <camelContext xmlns="http://camel.apache.org/schema/blueprint">

    <route>
      <from uri="direct:start"/>
      <to uri="{`{env:SOMENAME}`}"/>
      <to uri="{`{sys:MyJvmPropertyName}`}"/>
    </route>
  </camelContext>

您还可以使用默认值,因此如果属性不存在,您可以定义默认值,其中默认值是 log:foolog:bar 值。

  <camelContext xmlns="http://camel.apache.org/schema/blueprint">

    <route>
      <from uri="direct:start"/>
      <to uri="{`{env:SOMENAME:log:foo}`}"/>
      <to uri="{`{sys:MyJvmPropertyName:log:bar}`}"/>
    </route>
  </camelContext>

 

服务功能用于使用服务命名 idiom 来查找使用 OS 环境变量定义的服务,以使用 主机名 : 端口引用服务位置。

  • NAME_SERVICE_HOST
  • NAME_SERVICE_PORT

换句话说,服务使用 _SERVICE_HOST_SERVICE_PORT 作为前缀。因此,如果服务命名为 FOO,则 OS 环境变量应设置为

export $FOO_SERVICE_HOST=myserver
export $FOO_SERVICE_PORT=8888

例如,如果 FOO 服务远程 HTTP 服务,则我们可以引用 Camel 端点 uri 中的服务,并使用 HTTP 组件进行 HTTP 调用:

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
  <route>
    <from uri="direct:start"/>
    <to uri="http://{`{service:FOO}`}/myapp"/>
  </route>
</camelContext>

如果尚未定义该服务,可以使用默认值,例如在本地主机上调用服务,可能用于单元测试等

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
  <route>
    <from uri="direct:start"/>
    <to uri="http://{`{service:FOO:localhost:8080}`}/myapp"/>
  </route>
</camelContext>

264.27. 使用自定义功能

可从 Camel 2.14.1 开始

Properties 组件允许插件第三方功能,在解析属性占位符时使用。然后,这些函数能够执行自定义逻辑来解析占位符,如在数据库中查找、执行自定义计算或不用。函数的名称成为占位符中使用的前缀。这在以下示例代码中给出了最佳说明

<bean id="beerFunction" class="MyBeerFunction"/>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
  <propertyPlaceholder id="properties">
    <propertiesFunction ref="beerFunction"/>
  </propertyPlaceholder>

  <route>
    <from uri="direct:start"/>
    <to uri="{`{beer:FOO}`}"/>
    <to uri="{`{beer:BAR}`}"/>
  </route>
</camelContext>
注意

来自 camel 2.19.0,位置属性(on propertyPlaceholder)并不是更强制的

在这里,我们有一个 Camel XML 路由,其中定义了 & lt;propertyPlaceholder > 以使用自定义功能,我们称为 bean id - 也就是 beerFunction。由于er 函数使用 "beer" 作为其名称,因此占位符语法可以通过以 beer:value 开始来触发 beer 函数。

这个功能的实现只有两种方法,如下所示:

public static final class MyBeerFunction implements PropertiesFunction {

    @Override
    public String getName() {
        return "beer";
    }

    @Override
    public String apply(String remainder) {
        return "mock:" + remainder.toLowerCase();
    }
}

该函数必须实施 org.apache.camel.component.properties.PropertiesFunction 接口。method getName 是函数的名称,eg beer。应用 方法是我们实施自定义逻辑。由于示例代码来自单元测试,它只是返回一个值以引用模拟端点。

要从 Java 代码中注册自定义功能,如下所示:

PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class);
pc.addFunction(new MyBeerFunction());

 

264.28. 另请参阅

  • 属性 组件
  • Jasypt,在属性中使用加密值(如密码)

第 265 章 protobuf DataFormat

作为 Camel 版本 2.2.0 提供

第 266 章 protobuf - 协议缓冲器

"协议缓冲 - Google 的数据交换格式"

Camel 提供了一个数据格式,用于压缩 Java 和协议缓冲区协议。您要通过 xml 选择此格式 时,项目的网站详细信息。协议缓冲是语言中立且中立的平台,因此您的 Camel 路由生成的消息可以被其他语言实施使用。

API 站点
Protobuf 实现

Protobuf Java Tutorial

266.1. protobuf 选项

Protobuf 数据格式支持 3 个选项,它们如下所列。

名称默认Java 类型描述

instanceClass

 

字符串

取消armshalling 时要使用的类名称

contentTypeFormat

native

字符串

定义内容类型格式,protobuf 消息在 Java 中被序列化/反序列化。对于原生 protobuf 或 json 字段,格式可以是 native 或 json 字段。默认值为 native。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

266.2. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.dataformat.protobuf.content-type-format

定义内容类型格式,protobuf 消息在 Java 中被序列化/反序列化。对于原生 protobuf 或 json 字段,格式可以是 native 或 json 字段。默认值为 native。

原生

字符串

camel.dataformat.protobuf.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.protobuf.enabled

启用 protobuf dataformat

true

布尔值

camel.dataformat.protobuf.instance-class

取消armshalling 时要使用的类名称

 

字符串

ND

266.3. 内容类型格式(从 Camel 2.19开始)

可以解析 JSON 消息,将其转换为 protobuf 格式,并使用原生 util converter 重新解析。要使用这个选项,将 contentTypeFormat 值设置为 'json',或调用 protobuf with second 参数。如果没有指定默认实例,请始终使用原生 protobuf 格式。示例代码显示如下:

from("direct:marshal")
    .unmarshal()
    .protobuf("org.apache.camel.dataformat.protobuf.generated.AddressBookProtos$Person", "json")
    .to("mock:reverse");

266.4. protobuf overview

这一快速概览如何使用 Protobuf。如需更多详情,请参阅 完整教程

266.5. 定义 proto 格式

第一步是定义交换正文的格式。这在 .proto 文件中定义:

addressbook.proto

syntax = "proto2";

package org.apache.camel.component.protobuf;

option java_package = "org.apache.camel.component.protobuf";
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

message AddressBook {
  repeated Person person = 1;
}

266.6. 生成 Java 类

Protobuf SDK 提供了一个编译器,它会为在 .proto 文件中定义的格式生成 Java 类。如果您的操作系统由 Protobuf Java 代码生成器 maven 插件支持,您可以通过在 pom.xml 中添加以下配置来自动生成 Java 代码:

在项目 pom.xml 或设置 ${os.detected.classifier} 参数的 < build > 标签内插入操作系统和 CPU 架构检测扩展

<extensions>
  <extension>
    <groupId>kr.motd.maven</groupId>
    <artifactId>os-maven-plugin</artifactId>
    <version>1.4.1.Final</version>
  </extension>
</extensions>

插入 gRPC 和 protobuf Java code generator 插件 &lt ;plugins&gt; tag of the project pom.xml

<plugin>
  <groupId>org.xolstice.maven.plugins</groupId>
  <artifactId>protobuf-maven-plugin</artifactId>
  <version>0.5.0</version>
  <extensions>true</extensions>
  <executions>
    <execution>
      <goals>
        <goal>test-compile</goal>
        <goal>compile</goal>
      </goals>
      <configuration>
        <protocArtifact>com.google.protobuf:protoc:${protobuf-version}:exe:${os.detected.classifier}</protocArtifact>
      </configuration>
    </execution>
  </executions>
</plugin>

您还可以手动运行任何需要的额外支持语言的编译器。

protoc --java_out=. ./proto/addressbook.proto

这将生成一个名为 AddressBookProtos 的 Java 类,其中包含 Person 和 AddressBook 的内部类。构建器也为您实施。生成的类实现 com.google.protobuf.Message,这是序列化机制所需要的。因此,只有这些类在交换的正文中使用很重要。如果您试图告诉 Data Format 使用没有实现 com.google.protobuf.Message 的类,Camel 将抛出一个例外。使用生成的构建器从任何现有域类转换数据。

266.7. Java DSL

您可以使用 create ProtobufDataFormat 实例并将它传递到 Camel DataFormat marshal 和 unmarshal API。

   ProtobufDataFormat format = new ProtobufDataFormat(Person.getDefaultInstance());

   from("direct:in").marshal(format);
   from("direct:back").unmarshal(format).to("mock:reverse");

或者,使用 DSL protobuf ()传递 unmarshal default 实例或默认实例类名称,如下所示。

   // You don't need to specify the default instance for protobuf marshaling
   from("direct:marshal").marshal().protobuf();
   from("direct:unmarshalA").unmarshal()
       .protobuf("org.apache.camel.dataformat.protobuf.generated.AddressBookProtos$Person")
       .to("mock:reverse");

   from("direct:unmarshalB").unmarshal().protobuf(Person.getDefaultInstance()).to("mock:reverse");

266.8. Spring DSL

以下示例演示了如何使用 Protobuf 使用 Spring 配置 protobuf 数据类型

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <unmarshal>
      <protobuf instanceClass="org.apache.camel.dataformat.protobuf.generated.AddressBookProtos$Person" />
    </unmarshal>
    <to uri="mock:result"/>
  </route>
</camelContext>

266.9. 依赖项

要在 camel 路由中使用 Protobuf,您需要添加对 camel-protobuf 的依赖项,这将实现这些数据格式。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-protobuf</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

266.10. 另请参阅

第 267 章 PubNub 组件

作为 Camel 版本 2.19 可用

Camel PubNub 组件可用于与已连接设备的 PubNub 数据流网络通信。此组件使用 pubnub java 库

用例:

  • 聊天房间:发送和接收信息
  • 位置和连接车:分配税务人
  • Smart sensors:从传感器中接收数据,以进行数据视觉化
  • 健康:从患者的可穿过设备监控核心速率
  • Multiplayer gamings
  • 互动媒体:听学投票系统

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-pubnub</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

267.1. URI 格式

pubnub:channel[?options]

其中,频道 是要发布或订阅的 PubNub 频道。

267.2. 选项

PubNub 组件没有选项。

PubNub 端点使用 URI 语法进行配置:

pubnub:channel

使用以下路径和查询参数:

267.2.1. 路径名(1 参数):

名称描述默认类型

channel

所需 频道用于订阅/发布事件

 

字符串

267.2.2. 查询参数(14 参数):

名称描述默认类型

uuid (common)

要用作设备标识符的 UUID,如果没有传递,则生成默认 UUID。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

withPresence (consumer)

另外,订阅相关的存在信息

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

operation (producer)

要执行的操作。PUBLISH:默认.向频道的所有订阅者发送消息。FIRE:允许客户端发送消息到 BLOCKS Event Handler。这些消息将直接转到频道上注册的任何事件处理程序。HERENOW:包含有关频道当前状态的信息,其中包括当前订阅到频道的唯一用户 ID 列表和总 occupancy 计数。WHERENOW:包含有关 uuid 订阅当前频道列表的信息。GETSTATE:用于获取特定于订阅者 uuid 的键/值对。状态信息作为键/值对 SETSTATE: 的 JSON 对象提供:用于设置特定于订阅者 uuid GETHISTORY 的键/值对。

 

字符串

pubnub (advanced)

引用 registry 中的 Pubnub 客户端。

 

PubNub

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

authKey (security)

如果使用 Access Manager,客户端将在所有受限请求中使用这个 authKey。

 

字符串

PasswordKey (security)

如果传递密码,则所有来自 PubNub 的 communicatons 将被加密。

 

字符串

publishKey (security)

从 PubNub 帐户获取的发布密钥。发布消息时是必需的。

 

字符串

secretKey (security)

用于消息签名的 secret 密钥。

 

字符串

安全 (安全)

使用 SSL 进行安全传输.

true

布尔值

subscribeKey (security)

订阅密钥从您的 PubNub 帐户获取。订阅频道或侦听存在事件时是必需的

 

字符串

267.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.pubnub.enabled

启用 pubnub 组件

true

布尔值

camel.component.pubnub.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

267.4. 订阅时的消息标头

名称描述

CamelPubNubTimeToken

事件的 Timestamp。

CamelPubNubChannel

消息所属的频道。

267.5. 邮件正文

邮件正文可以包含任何 JSON 序列化数据,包括:对象、数组、Ints 和 String。消息数据不应包含特殊的 Java V4 类或功能,因为它们不会序列化。字符串内容可以包含任何单字节或多字节 UTF-8

自动发送时对象序列化。只需传递完整对象作为消息有效负载。PubNub 将负责对象序列化。

收到消息正文时使用 PubNub API 提供的对象。

267.6. 例子

267.6.1. 发布事件

生成的默认操作。以下片段将 PojoBean 生成的事件发布到频道 iot。

from("timer:mytimer")
    // generate some data as POJO.
    .bean(PojoBean.class)
    .to("pubnub:iot?publishKey=mypublishKey");

267.6.2. 触发事件 aka BLOCKS Event Handler

有关可调用的所有无服务器功能,请参阅 https://www.pubnub.com/blocks-catalog/。地理位置查找示例

from("timer:geotimer")
    .process(exchange -> exchange.getIn().setBody(new Foo("bar", "TEXT")))
    .to("pubnub:eon-maps-geolocation-input?operation=fire&publishKey=mypubkey&subscribeKey=mysubkey");

from("pubnub:eon-map-geolocation-output?subscribeKey=mysubkey)
    // geolocation output will be logged here
    .log("${body}");

267.6.3. 订阅事件

以下片段侦听 iot 通道上的事件。如果可以通过Presens 添加选项,您还会接收频道 Join,Leave asf 事件。

from("pubnub:iot?subscribeKey=mySubscribeKey")
    .log("${body}")
    .to("mock:result");

267.6.4. 执行操作

在此处:包含有关频道当前状态的信息,包括当前订阅到频道的唯一用户 ID 列表以及频道的总 occupancy 计数

from("direct:control")
    .to("pubnub:myChannel?publishKey=mypublishKey&subscribeKey=mySubscribeKey&operation=herenow")
    .to("mock:result");

其中,现在 : 包含有关 uuid 订阅的当前频道列表的信息

from("direct:control")
    .to("pubnub:myChannel?publishKey=mypublishKey&subscribeKey=mySubscribeKey&operation=wherenow&uuid=spyonme")
    .to("mock:result");

setstate : 用于设置特定于订阅者 uuid 的键/值对。

from("direct:control")
    .bean(StateGenerator.class)
    .to("pubnub:myChannel?publishKey=mypublishKey&subscribeKey=mySubscribeKey&operation=setstate&uuid=myuuid");

gethistory : Fetches historical message of a channel。

from("direct:control")
    .to("pubnub:myChannel?publishKey=mypublishKey&subscribeKey=mySubscribeKey&operation=gethistory");

测试目录中有几个示例显示了一些 PubNub 功能。它们需要一个 PubNub 帐户,您可以在其中获取发布和订阅密钥。

示例 PubNubSensorExample 已包含 PubNubub 提供的订阅密钥,因此无需帐户即可运行。这个示例演示了 PubNub 组件订阅无限 sensor 数据流。

267.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • RSS

第 268 章 Apache Pulsar 组件

作为 Camel 版本 2.24 可用

Maven 用户需要将以下依赖项添加到其 pom.xml 中,以便该组件:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-pulsar</artifactId>
    <!-- use the same version as your Camel core version -->
    <version>x.y.z</version>
</dependency>

268.1. URI 格式

pulsar:[persistent|non-persistent]://tenant/namespace/topic

268.2. 选项

Apache Pulsar 组件支持 3 个选项,它们如下所列。

名称描述默认类型

autoConfiguration (common)

pulsar 自动配置

 

AutoConfiguration

pulsarClient (common)

pulsar 客户端

 

PulsarClient

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Apache Pulsar 端点使用 URI 语法配置:

pulsar:uri

使用以下路径和查询参数:

268.2.1. 路径名(1 参数):

名称描述默认类型

topicUri

主题完整 URI 路径,包括类型、租户和命名空间

 

字符串

268.2.2. 查询参数(11 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

consumerName (consumer)

订阅为 EXCLUSIVE 时使用者的名称

sole-consumer

字符串

consumerNamePrefix (consumer)

使用 SHARED 或 FAILOVER 订阅添加到消费者名称的前缀

cons

字符串

consumerQueueSize (consumer)

consumer 队列的大小 - 默认为 10

10

int

numberOfConsumers (consumer)

用户数量 - 默认为 1

1

int

subscriptionName (consumer)

要使用的订阅名称

subscription

字符串

subscriptionType (consumer)

订阅类型 EXCLUSIVEREDFAILOVER,默认为 EXCLUSIVE

独占

SubscriptionType

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

producerName (producer)

producer 的名称

default-producer

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

268.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.pulsar.enabled

是否启用 pulsar 组件的自动配置。默认启用。

 

布尔值

camel.component.pulsar.pulsar-client

pulsar 客户端。选项是一个 org.apache.pulsar.client.api.PulsarClient 类型。

 

字符串

camel.component.pulsar.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 269 章 Quartz 组件(已弃用)

作为 Camel 版本 1.0 可用

quartz: 组件使用 Quartz Scheduler 1.x 提供调度的消息交付。
每个端点代表不同的计时器(在 Quartz 术语中,一个 Trigger 和 JobDetail)。

提示

如果您正在使用 Quartz 2.x,那么从 Camel 2.12 开始,您应该使用 Quartz2 组件

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-quartz</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

269.1. URI 格式

quartz://timerName?options
quartz://groupName/timerName?options
quartz://groupName/timerName?cron=expression
quartz://timerName?cron=expression

组件使用 CronTriggerSimpleTrigger。如果没有提供 cron 表达式,则组件将使用一个简单的触发器。如果没有提供 groupName,则 quartz 组件会使用 Camel 组名称。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

269.2. 选项

Quartz 组件支持 8 个选项,它们如下所列。

名称描述默认类型

factory (advanced)

要使用自定义调度程序工厂,用于创建调度程序。

 

SchedulerFactory

调度程序 (高级)

要使用自定义配置的 Quartz 调度程序,而不是创建新调度程序。

 

scheduler

属性 (使用者)

配置 Quartz 调度程序的属性。

 

Properties

propertiesFile (consumer)

从 classpath 中加载的属性的文件名

 

字符串

startDelayedSeconds (scheduler)

启动 quartz 调度程序前等待的秒数。

 

int

autoStartScheduler (consumer)

调度程序是否应该自动启动。这个选项为默认 true

true

布尔值

enableJmx (consumer)

是否启用 Quartz JMX,它能够从 JMX 管理 Quartz 调度程序。这个选项为默认 true

true

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Quartz 端点使用 URI 语法进行配置:

quartz:groupName/timerName

使用以下路径和查询参数:

269.2.1. 路径名(2 参数):

名称描述默认类型

groupName

要使用的 quartz 组名称。组名称和计时器名称的组合应该是唯一的。

Camel

字符串

timerName

要使用的 quartz 计时器名称。组名称和计时器名称的组合应该是唯一的。

 

字符串

269.2.2. 查询参数(13 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

Cron (消费者)

指定要定义何时触发的 cron 表达式。

 

字符串

deleteJob (consumer)

如果设置为 true,则当路由停止时触发器会自动删除。其他设置为 false 时,它将保留在调度程序中。当设置为 false 时,这意味着用户可能会重复使用带有 camel Uri 的预配置触发器。只需确保名称匹配。请注意,您无法将 deleteJob 和 pauseJob 设置为 true。

true

布尔值

fireNow (consumer)

是否在使用简单触发器(这个选项不支持 cron)启动时触发 SAP 调度程序。

false

布尔值

pauseJob (consumer)

如果设置为 true,则触发器会在路由停止时自动暂停。其他设置为 false 时,它将保留在调度程序中。当设置为 false 时,这意味着用户可能会重复使用带有 camel Uri 的预配置触发器。只需确保名称匹配。请注意,您无法将 deleteJob 和 pauseJob 设置为 true。

false

布尔值

startDelayedSeconds (consumer)

启动 quartz 调度程序前等待的秒数。

 

int

stateful (consumer)

使用 Quartz StatefulJob 而不是默认作业。

false

布尔值

usingFixedCamelContextName (consumer)

如果是 true,则 JobDataMap 使用 CamelContext 名称直接引用 CamelContext (如果为 false),则 JobDataMap 使用 CamelContext 管理名称,该名称可以在部署期间更改。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

jobParameters (advanced)

要在作业上配置附加选项。

 

map

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

triggerParameters (advanced)

要在触发器上配置附加选项。

 

map

使用 StatefulJob 时,JobDataMap 在每次执行作业后都会重新渲染,从而保留下一次执行的状态。

INFO: 在 OSGi 中运行并具有多个带有 quartz 路由 的捆绑包,如 Apache ServiceMix 或 Apache Karaf,并且有多个与 Camel 路由相关的捆绑包,请从 Quartz 端点开始的多个捆绑包,然后确保您将 ID 分配给 <camelContext>,因为此 id 是唯一的,因为 OSGi 容器中 QuartzScheduler 需要它。
如果您没有在 <camelContext> 上设置任何 id,则会自动分配
一个唯一的 ID,且不会出现问题。

269.3. 配置 quartz.properties 文件

默认情况下,Qartz 将在 classpath 的 org/quartz 目录中查找 quartz.properties 文件。如果您使用 WAR 部署,则意味着在 WEB-INF/classes/org/quartz 中丢弃 quartz.properties。

但是,Camel Quartz 组件还允许您配置属性:

参数默认类型描述

属性

null

Properties

Camel 2.4 :您可以配置 java.util.Properties 实例。

propertiesFile

null

字符串

Camel 2.4 :要从类路径加载的属性名称

要做到这一点,您可以在 Spring XML 中配置它,如下所示

<bean id="quartz" class="org.apache.camel.component.quartz.QuartzComponent">
    <property name="propertiesFile" value="com/mycompany/myquartz.properties"/>
</bean>

269.4. 在 JMX 中启用 Quartz 调度程序

您需要配置 quartz 调度程序属性来启用 JMX。
这通常将选项 "org.quartz.scheduler.jmx.export" 设置为 配置文件中的 true 值。

从 Camel 2.13 开始,Camel 2.13 将自动将此选项设置为 true,除非明确禁用。

269.5. 启动 Quartz 调度程序

这是一个示例:

<bean id="quartz" class="org.apache.camel.component.quartz.QuartzComponent">
    <property name="startDelayedSeconds" value="5"/>
</bean>

269.6. 集群

可作为 Camel 2.4 提供

如果您在集群模式中使用 Quartz,例如 cluster jobStore。然后,当节点停止/关闭时,从 Quartz 组件的 Camel 2.4 on the Quartz 组件 不会 暂停/删除触发器。这允许触发器在集群中的其他节点上运行。

注意 :当在集群节点中运行时,未进行检查以确保端点的唯一作业名称/组。

269.7. 消息标头

Camel 在 Quartz Execution Context 中添加 getters 作为标头值。添加了以下标头:
日历,fireTime,jobDetail,jobInstance, jobInstance ,jobRuntTime,mergedJobDataMap,nextFireTime ,refireCount,结果, scheduleFireTime,scheduler,trigger Name ,triggerName triggerGroup.

fireTime 标头包含触发交换时的 java.util.Date

269.8. 使用 Cron Triggers

Quartz 支持类似于 Cron 的表达式,以方便的格式指定计时器。您可以在 cron URI 参数中使用这些表达式;尽管保留有效的 URI 编码,我们允许使用 + 而不是空格。Quartz 提供了一些关于 如何使用 cron 表达式的教程。

例如,以下命令将每五分钟每五分钟执行一次从 12pm (下午)到下午 6pm 到下午 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 CharacterCron 字符

+

空格

269.9. 指定时区

Quartz Scheduler 以 Camel 2.8.1
提供
,您可以为每个触发器配置时区。例如,要使用您所在国家的时区,您可以执行以下操作:

quartz://groupName/timerName?cron=0+0/5+12-18+?+*+MON-FRI&trigger.timeZone=Europe/Stockholm

timeZone 值是 java.util.TimeZone 接受的值。

在 Camel 2.8.0 或更早的版本中,您必须将自定义 String 提供给 java.util.TimeZone Type Converter,以便从端点 uri 配置此功能。
从 Camel 2.8.1 开始,我们已在 camel-core 中包含此类类型 Converter。

269.10. 另请参阅

第 270 章 Quartz2 组件

作为 Camel 2.12 版本提供

quartz2: 组件使用 Quartz Scheduler 2.x 提供调度的消息交付。
每个端点代表不同的计时器(在 Quartz 术语中,一个 Trigger 和 JobDetail)。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-quartz2</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

注意: Qartz 2.x API 与 Quartz 1.x 不兼容。如果您需要继续使用旧的 Quartz 1.x,请改为使用旧的 Quartz 组件。

270.1. URI 格式

quartz2://timerName?options
quartz2://groupName/timerName?options
quartz2://groupName/timerName?cron=expression
quartz2://timerName?cron=expression

组件使用 CronTriggerSimpleTrigger。如果没有提供 cron 表达式,则组件将使用一个简单的触发器。如果没有提供 groupName,则 quartz 组件会使用 Camel 组名称。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

270.2. 选项

Quartz2 组件支持 11 个选项,它们如下所列。

名称描述默认类型

autoStartScheduler (scheduler)

调度程序是否应该自动启动。这个选项为默认 true

true

布尔值

startDelayedSeconds (scheduler)

启动 quartz 调度程序前等待的秒数。

 

int

prefixJobNameWith EndpointId (consumer)

是否将 quartz 任务与端点 ID 为前缀。此选项默认为 false。

false

布尔值

enableJmx (consumer)

是否启用 Quartz JMX,它能够从 JMX 管理 Quartz 调度程序。这个选项为默认 true

true

布尔值

属性 (使用者)

配置 Quartz 调度程序的属性。

 

Properties

propertiesFile (consumer)

从 classpath 中加载的属性的文件名

 

字符串

prefixInstanceName (consumer)

是否使用 CamelContext 名称为 Quartz Scheduler 实例名称添加前缀。默认情况下启用此项,让每个 CamelContext 使用自己的 Quartz 调度程序实例。您可以将这个选项设置为 false,以在多个 CamelContext 间重复使用 Quartz 调度程序实例。

true

布尔值

interruptJobsOn Shutdown (scheduler)

是否要在关闭时中断作业,它会强制调度程序更快地关闭并尝试中断任何正在运行的作业。如果启用此项,则任何正在运行的作业可能会因为中断而失败。

false

布尔值

schedulerFactory (advanced)

要使用自定义调度程序工厂,用于创建调度程序。

 

SchedulerFactory

调度程序 (高级)

要使用自定义配置的 Quartz 调度程序,而不是创建新调度程序。

 

scheduler

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Quartz2 端点使用 URI 语法进行配置:

quartz2:groupName/triggerName

使用以下路径和查询参数:

270.2.1. 路径名(2 参数):

名称描述默认类型

groupName

要使用的 quartz 组名称。组名称和计时器名称的组合应该是唯一的。

Camel

字符串

triggerName

要使用的 quartz 计时器名称。组名称和计时器名称的组合应该是唯一的。

 

字符串

270.2.2. 查询参数(19 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

Cron (消费者)

指定要定义何时触发的 cron 表达式。

 

字符串

deleteJob (consumer)

如果设置为 true,则当路由停止时触发器会自动删除。其他设置为 false 时,它将保留在调度程序中。当设置为 false 时,这意味着用户可能会重复使用带有 camel Uri 的预配置触发器。只需确保名称匹配。请注意,您无法将 deleteJob 和 pauseJob 设置为 true。

true

布尔值

durableJob (consumer)

任务是否应该保留在孤立后(没有触发器指向它)。

false

布尔值

pauseJob (consumer)

如果设置为 true,则触发器会在路由停止时自动暂停。其他设置为 false 时,它将保留在调度程序中。当设置为 false 时,这意味着用户可能会重复使用带有 camel Uri 的预配置触发器。只需确保名称匹配。请注意,您无法将 deleteJob 和 pauseJob 设置为 true。

false

布尔值

recoverableJob (consumer)

如果遇到"恢复"或"故障切换"状况,指示应重新执行作业的调度程序。

false

布尔值

stateful (consumer)

使用 Quartz PersistJobDataAfterExecution 和 DisallowConcurrentExecution 而不是默认作业。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

customCalendar (advanced)

指定自定义日历以避免特定日期范围

 

日历

jobParameters (advanced)

要在作业上配置附加选项。

 

map

prefixJobNameWithEndpoint Id (advanced)

作业名称是否应该带有端点 ID 前缀

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

triggerParameters (advanced)

要在触发器上配置附加选项。

 

map

usingFixedCamelContextName (advanced)

如果是 true,则 JobDataMap 使用 CamelContext 名称直接引用 CamelContext (如果为 false),则 JobDataMap 使用 CamelContext 管理名称,该名称可以在部署期间更改。

false

布尔值

autoStartScheduler (scheduler)

调度程序是否应该自动启动。

true

布尔值

fireNow (scheduler)

如果使用 SimpleTrigger,则路由启动时将触发触发器。

false

布尔值

startDelayedSeconds (scheduler)

启动 quartz 调度程序前等待的秒数。

 

int

triggerStartDelay (scheduler)

如果调度程序已经启动,我们想在当前时间之后,触发的启动略微,以确保在作业开始之前完全启动端点。

500

long

270.3. Spring Boot Auto-Configuration

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.component.quartz2.auto-start-scheduler

调度程序是否应该自动启动。这个选项为默认 true

true

布尔值

camel.component.quartz2.enable-jmx

是否启用 Quartz JMX,它能够从 JMX 管理 Quartz 调度程序。这个选项为默认 true

true

布尔值

camel.component.quartz2.enabled

启用 quartz2 组件

true

布尔值

camel.component.quartz2.interrupt-jobs-on-shutdown

是否要在关闭时中断作业,它会强制调度程序更快地关闭并尝试中断任何正在运行的作业。如果启用此项,则任何正在运行的作业可能会因为中断而失败。

false

布尔值

camel.component.quartz2.prefix-instance-name

是否使用 CamelContext 名称为 Quartz Scheduler 实例名称添加前缀。默认情况下启用此项,让每个 CamelContext 使用自己的 Quartz 调度程序实例。您可以将这个选项设置为 false,以在多个 CamelContext 间重复使用 Quartz 调度程序实例。

true

布尔值

camel.component.quartz2.prefix-job-name-with-endpoint-id

是否将 quartz 任务与端点 ID 为前缀。此选项默认为 false。

false

布尔值

camel.component.quartz2.properties

配置 Quartz 调度程序的属性。选项是 java.util.Properties 类型。

 

字符串

camel.component.quartz2.properties-file

从 classpath 中加载的属性的文件名

 

字符串

camel.component.quartz2.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.quartz2.scheduler

要使用自定义配置的 Quartz 调度程序,而不是创建新调度程序。选项是一个 org.quartz.Scheduler 类型。

 

字符串

camel.component.quartz2.scheduler-factory

要使用自定义调度程序工厂,用于创建调度程序。选项是一个 org.quartz.SchedulerFactory 类型。

 

字符串

camel.component.quartz2.start-delayed-seconds

启动 quartz 调度程序前等待的秒数。

 

整数

例如,以下路由规则将触发两个计时器事件到 mock:results 端点:

from("quartz2://myGroup/myTimerName?trigger.repeatInterval=2&trigger.repeatCount=1").routeId("myRoute")
    .to("mock:result");

使用 stateful=true 时,JobDataMap 在每次执行作业后都会重新渲染,从而保留下一次执行的状态。

INFO: 在 OSGi 中运行并具有多个带有 quartz 路由 的捆绑包,例如 Apache ServiceMix 或 Apache Karaf,并且有多个带有从 Quartz2 端点开头的 Camel 路由捆绑包,然后确保您为这个 ID 分配了一个 id 的唯一 ID,因为这是 OSGi 容器中 QuartzScheduler 需要这一 ID。如果您没有在 <camelContext> 上设置任何 id,则会自动分配一个唯一 ID,且不会出现问题。

270.4. 配置 quartz.properties 文件

默认情况下,Qartz 将在 classpath 的 org/quartz 目录中查找 quartz.properties 文件。如果您使用 WAR 部署,则意味着在 WEB-INF/classes/org/quartz 中丢弃 quartz.properties。

但是,Camel Quartz2 组件还允许您配置属性:

参数默认类型描述

属性

null

Properties

您可以配置 java.util.Properties 实例。

propertiesFile

null

字符串

从 classpath 中加载的属性的文件名

要做到这一点,您可以在 Spring XML 中配置它,如下所示

<bean id="quartz2" class="org.apache.camel.component.quartz2.QuartzComponent">
    <property name="propertiesFile" value="com/mycompany/myquartz.properties"/>
</bean>

270.5. 在 JMX 中启用 Quartz 调度程序

您需要配置 quartz 调度程序属性来启用 JMX。
这通常将选项 "org.quartz.scheduler.jmx.export" 设置为 配置文件中的 true 值。

从 Camel 2.13 开始,Camel 2.13 将自动将此选项设置为 true,除非明确禁用。

270.6. 启动 Quartz 调度程序

Quartz2 组件提供了一个选项,可让 Quartz 调度程序启动延迟,或根本不自动启动。

这是一个示例:

<bean id="quartz2" class="org.apache.camel.component.quartz2.QuartzComponent">
    <property name="startDelayedSeconds" value="5"/>
</bean>

270.7. 集群

如果您在集群模式中使用 Quartz,例如 cluster jobStore。然后,当节点被停止/关闭时,Qartz2 组件 不会 暂停/删除触发器。这允许触发器在集群中的其他节点上运行。

注意 :当在集群节点中运行时,未进行检查以确保端点的唯一作业名称/组。

270.8. 消息标头

Camel 在 Quartz Execution Context 中添加 getters 作为标头值。添加了以下标头:
日历,fireTime,jobDetail,jobInstance, jobInstance ,jobRuntTime,mergedJobDataMap,nextFireTime ,refireCount,结果, scheduleFireTime,scheduler,trigger Name ,triggerName triggerGroup.

fireTime 标头包含触发交换时的 java.util.Date

270.9. 使用 Cron Triggers

Quartz 支持类似于 Cron 的表达式,以方便的格式指定计时器。您可以在 cron URI 参数中使用这些表达式;尽管保留有效的 URI 编码,我们允许使用 + 而不是空格。

例如,以下命令将每五分钟每五分钟执行一次从 12pm (下午)到下午 6pm 到下午 6pm 的消息:

from("quartz2://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 CharacterCron 字符

+

空格

270.10. 指定时区

Quartz 调度程序允许您为每个触发器配置时区。例如,要使用您所在国家的时区,您可以执行以下操作:

quartz2://groupName/timerName?cron=0+0/5+12-18+?+*+MON-FRI&trigger.timeZone=Europe/Stockholm

timeZone 值是 java.util.TimeZone 接受的值。

270.11. Using QuartzScheduledPollConsumerScheduler

Quartz2 组件提供了一个轮询消费者调度程序,它允许对 轮询消费者 (如文件和 FTP 用户)使用基于 cron 的调度。

例如,要使用基于 cron 的表达式每 2 秒钟轮询文件,则可以直接定义 Camel 路由,如下所示:

    from("file:inbox?scheduler=quartz2&scheduler.cron=0/2+*+*+*+*+?")
       .to("bean:process");

请注意,我们定义 scheduler=quartz2 来指示 Camel 使用基于 Quartz2 的调度程序。然后,我们使用 scheduler.xxx 选项配置调度程序。Quartz2 调度程序要求设置 cron 选项。

支持以下选项:

参数默认类型描述

quartzScheduler

null

org.quartz.Scheduler

使用自定义 Quartz 调度程序。如果没有配置,则使用 Quartz2 组件中的共享调度程序。

cron

null

字符串

必需 :定义用于触发轮询的 cron 表达式。

triggerId

null

字符串

指定触发器 ID。如果没有提供,则生成并使用 UUID。

triggerGroup

QuartzScheduledPollConsumerScheduler

字符串

指定触发器组。

timeZone

默认

TimeZone

用于 CRON 触发器的时区。

重要信息: 记住端点 URI 配置这些选项必须带有 调度程序前缀。例如,配置触发器 id 和组:

    from("file:inbox?scheduler=quartz2&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");

第 271 章 QuickFix 组件

作为 Camel 版本 2.1 提供

快速修复 组件适应在 Camel 中使用的快速修复 /J 修复引擎。该组件使用标准 Financial Interchange (FIX)协议进行 消息传输。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-quickfix</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

271.1. URI 格式

quickfix:configFile[?sessionID=sessionID&lazyCreateEngine=true|false]

configFile 是要用于 FIX 引擎的 QuickFIX/J 配置的名称(作为 classpath 中找到的资源)。可选的 sessionID 标识特定的 FIX 会话。sessionID 的格式是:

(BeginString):(SenderCompID)[/(SenderSubID)[/(SenderLocationID)]]->(TargetCompID)[/(TargetSubID)[/(TargetLocationID)]]

可选的 lazyCreateEngine (Camel 2.12.3+)参数允许根据需要创建 QuickFIX/J 引擎。值 true 表示当第一个消息发送或在路由定义中配置了消费者时,引擎将启动。使用 false 值时,引擎将在端点创建时启动。缺少此参数时,会使用组件属性 lazyCreateEngines 的值。

URI 示例:

quickfix:config.cfg

quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange

quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange&lazyCreateEngine=true

271.2. Endpoints

修复会话是 快速修复 组件的端点。端点 URI 可以指定一个会话,或者由特定快速修复/J 引擎管理的所有会话。典型的应用程序只使用一个修复引擎,但高级用户可以通过引用 快速修复 组件端点 URI 中的不同配置文件来创建多个修复引擎。

当消费者不在端点 URI 中包括会话 ID 时,它将接收与 URI 中指定的配置文件关联的 FIX 引擎所管理的所有会话的交换。如果制作者未在端点 URI 中指定会话,则它必须在发送的 FIX 消息中包含与会话相关的字段。如果在 URI 中指定会话,则组件会自动将与会话相关的字段注入到 FIX 消息中。

271.3. 选项

QuickFix 组件支持 6 选项,它们如下所列。

名称描述默认类型

messageFactory (advanced)

使用给定的 MessageFactory

 

MessageFactory

logFactory (advanced)

使用给定的 LogFactory

 

LogFactory

messageStoreFactory (advanced)

使用给定的 MessageStoreFactory

 

MessageStoreFactory

configurations (common)

使用给定的配置快速Fix 配置映射到这个密钥

 

map

lazyCreateEngines (common)

如果设置为 true,将根据需要创建并启动引擎(当第一个信息发送时)

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

QuickFix 端点使用 URI 语法配置:

quickfix:configurationName

使用以下路径和查询参数:

271.3.1. 路径名(1 参数):

名称描述默认类型

configurationName

必需 The configFile 是要用于修复引擎(位于您的类路径中找到的资源)的 QuickFIX/J 配置的名称。

 

字符串

271.3.2. 查询参数(6 参数):

名称描述默认类型

lazyCreateEngine (common)

此选项允许根据需要创建快速修复/J 引擎。值 true 表示当第一个消息发送或在路由定义中配置了消费者时,引擎将启动。使用 false 值时,引擎将在端点创建时启动。缺少此参数时,会使用组件属性 lazyCreateEngines 的值。

false

布尔值

sessionID (common)

可选的 sessionID 标识特定的 FIX 会话。sessionID is format: (BeginString): (SenderCompID)/(SenderSubID)/(SenderLocationID)-(TargetCompID)/(TargetSubID)/(TargetLocationID)/(SenderSubID)/(SenderSubID)/(SenderSubID)/(TargetSubID)

 

SessionID

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

271.4. Spring Boot Auto-Configuration

组件支持 7 个选项,如下所示。

名称描述默认类型

camel.component.quickfix.configurations

使用给定的配置快速Fix 配置映射到这个密钥

 

map

camel.component.quickfix.enabled

启用快速修复组件

true

布尔值

camel.component.quickfix.lazy-create-engines

如果设置为 true,将根据需要创建并启动引擎(当第一个信息发送时)

false

布尔值

camel.component.quickfix.log-factory

使用给定的 LogFactory。选项是一个快速修复.LogFactory 类型。

 

字符串

camel.component.quickfix.message-factory

使用给定的 MessageFactory。选项是一个快速修复.MessageFactory 类型。

 

字符串

camel.component.quickfix.message-store-factory

使用给定的 MessageStoreFactory。选项是一个快速修复.MessageStoreFactory 类型。

 

字符串

camel.component.quickfix.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

271.5. Exchange Format

交换标头包括有助于交换过滤、路由和其他处理的信息。可用的标头如下:

标头名称描述

EventCategory

一个 AppMessageReceived,AppMessageSent,AdminMessageReceived,AdminMessageSent,SessionCreated,SessionLogon,SessionLogoff.请参阅 QuickfixjEventCategory enum。

SessionID

FIX 消息 SessionID

MessageType

FIX MsgType 标签值

DataDictionary

指定用于解析传入消息的数据字典。可以是数据字典的实例,也可以是快速修复/J 数据字典文件的资源路径

如果在接收字符串消息并且需要解析路由中时,DataDictionary 标头很有用。QuickFIX/J 需要数据字典来解析某些类型的消息(例如重复组)。在收到消息字符串后,在路由中注入 DataDictionary 标头,FIX 引擎可以正确解析数据。

271.6. QuickFIX/J 配置扩展

直接使用 QuickFIX/J 时,通常写入代码以创建日志记录适配器实例、消息存储和通信连接器。快速修复 组件将根据配置文件中的信息自动创建这些类的实例。它还为许多常见所需设置提供默认值,并添加了附加功能(例如,激活 JMX 支持)。

以下小节介绍了如何 快速修复 组件处理 QuickFIX/J 配置。有关快速修复/J 配置的综合信息,请参阅 QFJ 用户手册

271.6.1. 通信连接器

当组件检测到 QuickFIX/J 配置文件中的 initiator 或 acceptor 会话设置时,它将自动创建对应的启动器和/或接受或连接器。这些设置可以在默认值中,也可以在配置文件的特定会话中。

会话设置组件操作

ConnectionType=initiator

创建发起端连接器

ConnectionType=acceptor

创建接收器连接器

还可以指定 QuickFIX/J 会话连接器的线程模型。这些设置会影响配置文件中的所有会话,且必须放在设置默认部分中。

默认/Global 设置组件操作

ThreadModel=ThreadPerConnector

使用 SocketInitiatorSocketAcceptor (默认)

ThreadModel=ThreadPerSession

使用 ThreadedSocketInitiatorThreadedSocketAcceptor

271.6.2. 日志记录

通过在配置文件的 default 部分包含下列设置,即可指定 QuickFIX/J 日志记录器实施。如果配置中都没有以下设置,则 ScreenLog 是默认值。它有一个错误,它包括表示多个日志实施的设置。日志工厂实施也可以直接在 Quickfix 组件上设置。这将覆盖 QuickFIX/J 设置文件中的任何相关值。

默认/Global 设置组件操作

ScreenLogShowEvents

使用 ScreenLog

ScreenLogShowIncoming

使用 ScreenLog

ScreenLogShowOutgoing

使用 ScreenLog

SLF4J*

Camel 2.6+.使用 SLF4JLog。任何 SLF4J 设置将导致使用此日志。

FileLogPath

使用 FileLog

JdbcDriver

使用 JdbcLog

271.6.3. Message Store

通过在配置文件的默认部分包含下列设置,即可指定 QuickFIX/J 邮件存储实施。如果配置中都没有以下设置,则 MemoryStore 是默认值。它有一个错误,它包括了表示多条消息存储实施的设置。邮件存储工厂实施也可以直接在 Quickfix 组件上设置。这将覆盖 QuickFIX/J 设置文件中的任何相关值。

默认/Global 设置组件操作

JdbcDriver

Use a JdbcStore

FileStorePath

使用 FileStore

SleepycatDatabaseDir

使用 SleepcatStore

271.6.4. 消息工厂

消息工厂用于从原始修复消息构造域对象。默认消息工厂是 DefaultMessageFactory。但是,高级应用程序可能需要自定义消息工厂。这可在 QuickFIX/J 组件中设置。

271.6.5. JMX

默认/Global 设置组件操作

UseJmx

如果 Y,则启用快速修复/J JMX

271.6.6. 其他默认

组件为快速修复/J 配置文件中通常需要的设置提供一些默认设置。SessionStartTimeSessionEndTime 默认为 "00:00:00",这意味着会话不会自动启动和停止。HeartBtInt (间隔号)默认为 30 秒。

271.6.7. 最小 Initiator 配置示例

[SESSION]
ConnectionType=initiator
BeginString=FIX.4.4
SenderCompID=YOUR_SENDER
TargetCompID=YOUR_TARGET

271.7. 使用 InOut Message Exchange Pattern

Camel 2.8+

虽然 FIX 协议是事件驱动的和异步,但有特定的消息对代表请求的消息交换。要使用 InOut Exchange 模式,应有一个请求消息,并向请求显示单一回复消息。示例包括 OrderStatusRequest message 和 UserRequest。

271.7.1. 为消费者实施 InOut Exchanges

将"exchangePattern=InOut"添加到 QuickFIX/J enpoint URI 中。以下示例中的 MessageOrderStatusService 是一个具有同步服务方法的 bean。该方法返回对请求的响应(本例中为执行端口),然后发回到 requestor 会话。

    from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER&exchangePattern=InOut")
        .filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.ORDER_STATUS_REQUEST))
        .bean(new MarketOrderStatusService());

271.7.2. 为 Producers 实施 InOut Exchanges

对于制作者,发送消息将阻止,直到收到回复或超时。在修复中,没有标准的方式来关联回复消息。因此,必须为每种类型的 InOut 交换定义关联条件。可使用 Exchange 属性指定关联条件和超时。

描述Key Stringkey Constant默认

关联标准

"CorrelationCriteria"

QuickfixjProducer.CORRELATION_CRITERIA_KEY

Milliseconds 中的关联超时

"CorrelationTimeout"

QuickfixjProducer.CORRELATION_TIMEOUT_KEY

1000

correlation 条件通过 MessagePredicate 对象定义。以下示例将来自指定会话的 FIX ExecutionReport,其中事务类型是 STATUS,Order ID 将与我们的请求匹配。会话 ID 应为 requestor,当查找回复时,发件人和目标 CompID 字段将被反向。

exchange.setProperty(QuickfixjProducer.CORRELATION_CRITERIA_KEY,
    new MessagePredicate(new SessionID(sessionID), MsgType.EXECUTION_REPORT)
        .withField(ExecTransType.FIELD, Integer.toString(ExecTransType.STATUS))
        .withField(OrderID.FIELD, request.getString(OrderID.FIELD)));

271.7.3. 示例

源代码包含一个名为 RequestReplyExample 的示例,它演示了消费者和制作者的 InOut 交换。这个示例创建一个简单的 HTTP 服务器端点,它接受订购状态请求。HTTP 请求转换为 FIXStatusRequestMessage,它带有关联条件,然后路由到快速修复端点。然后,响应转换为 JSON 格式的字符串,再发回要作为 Web 响应提供的 HTTP 服务器端点。

Spring 配置从 Camel 2.9 开始有所变化。请参阅以下示例。

271.8. Spring 配置

Camel 2.6 - 2.8.x

QuickFIX/J 组件包含 Spring FactoryBean,用于在 Spring 上下文中配置会话设置。还包括用于 QuickFIX/J 会话 ID 字符串的类型转换器。以下示例显示两个会话都有默认设置的接收器和启动器会话的简单配置。

<!--  camel route  -->
<camelContext xmlns="http://camel.apache.org/schema/spring" id="quickfixjContext">
    <route>
        <from uri="quickfix:example"/>
        <filter>
            <simple>${in.header.EventCategory} == 'AppMessageReceived'</simple>
            <to uri="log:test"/>
        </filter>
    </route>
</camelContext>
        <!--  quickfix component  -->
<bean id="quickfix" class="org.apache.camel.component.quickfixj.QuickfixjComponent">
<property name="engineSettings">
    <util:map>
        <entry key="quickfix:example" value-ref="quickfixjSettings"/>
    </util:map>
</property>
<property name="messageFactory">
    <bean class="org.apache.camel.component.quickfixj.QuickfixjSpringTest.CustomMessageFactory"/>
</property>
</bean>
        <!--  quickfix settings  -->
<bean id="quickfixjSettings" class="org.apache.camel.component.quickfixj.QuickfixjSettingsFactory">
<property name="defaultSettings">
    <util:map>
        <entry key="SocketConnectProtocol" value="VM_PIPE"/>
        <entry key="SocketAcceptProtocol" value="VM_PIPE"/>
        <entry key="UseDataDictionary" value="N"/>
    </util:map>
</property>
<property name="sessionSettings">
    <util:map>
        <entry key="FIX.4.2:INITIATOR->ACCEPTOR">
            <util:map>
                <entry key="ConnectionType" value="initiator"/>
                <entry key="SocketConnectHost" value="localhost"/>
                <entry key="SocketConnectPort" value="5000"/>
            </util:map>
        </entry>
        <entry key="FIX.4.2:ACCEPTOR->INITIATOR">
            <util:map>
                <entry key="ConnectionType" value="acceptor"/>
                <entry key="SocketAcceptPort" value="5000"/>
            </util:map>
        </entry>
    </util:map>
</property>
</bean>

Camel 2.9 公布

QuickFIX/J 组件包含用于配置会话设置的 QuickfixjConfiguration 类。还包括用于 QuickFIX/J 会话 ID 字符串的类型转换器。以下示例显示两个会话都有默认设置的接收器和启动器会话的简单配置。

<!-- camel route -->
<camelContext id="quickfixjContext" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="quickfix:example"/>
        <filter>
            <simple>${in.header.EventCategory} == 'AppMessageReceived'</simple>
            <to uri="log:test"/>
        </filter>
    </route>
    <route>
        <from uri="vm:test"/>
        <to uri="lazyQuickfix:example"/>
    </route>
</camelContext>

<!-- quickfix component -->
<bean id="quickfix" class="org.apache.camel.component.quickfixj.QuickfixjComponent">
    <property name="configurations">
        <util:map>
            <entry key="example" value-ref="quickfixjConfiguration"/>
        </util:map>
    </property>
    <property name="messageFactory">
        <bean class="org.apache.camel.component.quickfixj.QuickfixjSpringTest.CustomMessageFactory"/>
    </property>
</bean>

<!-- lazy quickfix component -->
<bean id="lazyQuickfix" class="org.apache.camel.component.quickfixj.QuickfixjComponent">
    <property name="lazyCreateEngines" value="true" />
    <property name="configurations">
        <util:map>
            <entry key="example" value-ref="lazyQuickfixjConfiguration"/>
        </util:map>
    </property>
    <property name="messageFactory">
        <bean class="org.apache.camel.component.quickfixj.QuickfixjSpringTest.CustomMessageFactory"/>
    </property>
</bean>

<!-- quickfix settings -->
<bean id="quickfixjConfiguration" class="org.apache.camel.component.quickfixj.QuickfixjConfiguration">
    <property name="defaultSettings">
        <util:map>
            <entry key="SocketConnectProtocol" value="VM_PIPE"/>
            <entry key="SocketAcceptProtocol" value="VM_PIPE"/>
            <entry key="UseDataDictionary" value="N"/>
        </util:map>
    </property>
    <property name="sessionSettings">
        <util:map>
            <entry key="FIX.4.2:INITIATOR->ACCEPTOR">
                <util:map>
                    <entry key="ConnectionType" value="initiator"/>
                    <entry key="SocketConnectHost" value="localhost"/>
                    <entry key="SocketConnectPort" value="5000"/>
                </util:map>
            </entry>
            <entry key="FIX.4.2:ACCEPTOR->INITIATOR">
                <util:map>
                    <entry key="ConnectionType" value="acceptor"/>
                    <entry key="SocketAcceptPort" value="5000"/>
                </util:map>
            </entry>
        </util:map>
    </property>
</bean>

271.9. 异常处理

如果在处理消息期间引发特定异常,则可以修改 QuickFIX/J 行为。如果在处理传入的日志on 管理消息时抛出 RejectLogon 异常,则 logon 将被拒绝。

通常,快速修复/J 可自动处理登录进程。但是,有时必须修改传出的 logon 消息,以包含修复计数器所需的凭据。如果在发送 logon 消息时修改了 FIX logon 消息正文(EventCategory=AdminMessageSent the the modified 消息)将发送到计数器。务必要使传出的 logon 消息被同步 处理。如果以异步方式处理(在另一个线程中),修复引擎会在回调方法返回时立即发送未经修改的传出消息。

271.10. 修复序列号管理

如果在 同步 交换处理过程中抛出应用程序异常,这将导致 QuickFIX/J 不会递增传入的修复消息序列号,并导致计数器消息的重新发送。此修复协议行为主要旨在处理 传输 错误,而不是应用程序错误。使用此机制处理应用错误时存在风险。主要风险是,该消息每次重新收到时都会重复导致应用程序错误。更好的解决方法是在处理前立即保留传入的消息(数据库、JMS 队列)。这也使得应用能够异步处理消息,而不会在出错时丢失消息。

虽然可以在登录后将消息发送到 FIX 会话(在登录时发送消息),但通常最好等待该会话登录。这可消除 logon 中所需的序列号重新同步步骤。通过设置处理 SessionLogon 事件类别的路由,并允许应用程序启动发送消息来实现。

有关修复序列号管理的更多详情,请参阅修复协议规格和 QuickFIX/J 文档。

271.11. 路由示例

QuickFIX/J 组件源代码(测试子目录)中包含几个示例。这些示例之一实施了 trival trade excecution 模拟。示例定义了一个应用程序组件,它使用 URI 方案 "trade-executor"。

以下路由接收 trade executor 会话的消息,并将应用程序消息传递给 trade执行器组件。

from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER").
    filter(header(QuickfixjEndpoint.EVENT_CATEGORY_KEY).isEqualTo(QuickfixjEventCategory.AppMessageReceived)).
    to("trade-executor:market");

trade executor 组件会生成消息被路由到交易会话。会话 ID 必须在 FIX 消息本身中设置,因为在端点 URI 中没有指定会话 ID。

from("trade-executor:market").to("quickfix:examples/inprocess.cfg");

交易者会话消耗了市场上的执行报告消息,并处理它们。

from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:TRADER->MARKET").
    filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.EXECUTION_REPORT)).
    bean(new MyTradeExecutionProcessor());

271.12. 对 Camel 2.5 之前的快速修复/J 组件

快速修复组件是 Java 的 QuickFIX/J 引擎的实现。此引擎允许连接 FIX 服务器,该服务器用于根据 修复协议标准 交换财务消息。

注意: 该组件可用于发送/收到消息到修复服务器。

271.13. URI 格式

quickfix-server:config file
quickfix-client:config file

其中,配置文件是用来在启动时配置引擎的快速修复 配置文件的位置 (在您的类路径中)。

注: 有关快速修复的参数信息,请参阅快速修复 /J 网站。

在您要向修复网关发送消息时,必须使用快速修复服务器来从 FIX 服务器修复消息和快速修复客户端端点接收。

271.14. 交换数据格式

快速修复/J 引擎类似于 CXF 组件,它使用 MINA 作为协议层来创建与修复引擎网关的套接字连接。

当 QuickFIX/J 引擎收到消息时,它会创建一个 QuickFix.Message 实例,该实例由 camel 端点接收。此对象是一个"映射对象",从最初作为键值对数据集合而成 FIX 消息创建。您可以使用此对象,也可以使用方法 'toString' 来检索原始修复消息。

注: 也可以使用 camel bindy 数据格式 将修复消息转换为您自己的 java POJO。

当消息必须发送到 QuickFix 时,您必须创建一个 QuickFix.Message 实例。

271.15. Lazy 创建引擎

Camel 2.12.3 开始,您可以将 QuickFixComponent 配置为 lazy 创建并启动引擎,然后仅在需要时启动这些引擎。例如,当您在具有 master/slaves 的集群中有多个 Camel 应用程序时,您可以使用此参数。并希望从卷处于备用状态。

271.16. Samples

方向:修复网关

<route>
  <from uri="activemq:queue:fix"/>
  <bean ref="fixService" method="createFixMessage"/> // bean method in charge to transform message into a QuickFix.Message
  <to uri="quickfix-client:META-INF/quickfix/client.cfg"/> // Quickfix engine who will send the FIX messages to the gateway
</route>

方向:修复网关

<route>
  <from uri="quickfix-server:META-INF/quickfix/server.cfg"/> // QuickFix engine who will receive the message from FIX gateway
  <bean ref="fixService" method="parseFixMessage"/> // bean method parsing the QuickFix.Message
  <to uri="uri="activemq:queue:fix"/>"
</route>

271.17. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 272 章 RabbitMQ Component

作为 Camel 2.12 版本提供

rabbitmq: 组件允许您生成和使用来自 RabbitMQ 实例的消息。使用 RabbitMQ AMQP 客户端时,该组件对通用 AMQP 组件提供了纯 RabbitMQ 的方法。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-rabbitmq</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

272.1. URI 格式

旧语法 已弃用

rabbitmq://hostname[:port]/exchangeName?[options]

相反,主机名和端口是在组件级别上配置的,或者可作为 uri 查询参数提供。

新语法为:

rabbitmq:exchangeName?[options]

其中 hostname 是运行 rabbitmq 实例或集群的主机名。端口是可选的,如果未指定,则默认为 RabbitMQ 客户端默认值(5672)。交换名称决定了生成的消息将发送到的交换。对于消费者而言,交换名称决定队列要绑定的交换。

272.2. 选项

RabbitMQ 组件支持 50 个选项,它们如下所列。

名称描述默认类型

hostname (common)

运行 RabbitMQ 实例或集群的主机名。

 

字符串

portNumber (common)

运行 rabbitmq 实例或集群的主机的端口号。

5672

int

username (security)

身份验证访问时的用户名

客户机

字符串

密码 (安全)

用于经过身份验证的访问的密码

客户机

字符串

vhost (common)

频道的 vhost

/

字符串

addresses (common)

如果设置了这个选项,则 camel-rabbitmq 将尝试根据选项地址的设置来创建连接。address 值是一个字符串,它类似于 server1:12345, server2:12345

 

字符串

connectionFactory (common)

使用自定义 RabbitMQ 连接工厂。当设定这个选项时,不会使用 URI 上设置的所有连接选项(connectionTimeout、requestChannelMax…​)

 

ConnectionFactory

threadPoolSize (consumer)

使用者使用 Thread Pool Executor,带有固定数量的线程。此设置允许您设定该线程数。

10

int

autoDetectConnection Factory (advanced)

是否从注册表自动探测到 RabbitMQ 连接工厂。启用并且找到连接工厂的单一实例后,它将被使用。可以在组件或端点级别上配置显式连接工厂,其具有优先权。

true

布尔值

connectionTimeout (advanced)

连接超时

60000

int

requestedChannelMax (advanced)

请求的连接频道最大(提供的最大频道数)

2047

int

requestedFrameMax (advanced)

请求的连接帧最大(提供的最大帧大小)

0

int

requestedHeartbeat (advanced)

请求的连接心跳(以秒为单位)

60

int

自动恢复启用 (高级)

启用连接自动恢复(使用连接实现,在应用程序没有启动连接时执行自动恢复)

 

布尔值

networkRecoveryInterval (advanced)

网络恢复间隔(以毫秒为单位(从网络故障恢复时使用的间隔)

5000

整数

topologyRecoveryEnabled (advanced)

启用连接拓扑恢复(应该执行拓扑恢复)

 

布尔值

prefetchEnabled (consumer)

在 RabbitMQConsumer side 上启用服务质量。您需要同时指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项

false

布尔值

prefetchSize (consumer)

服务器将提供的最大内容(以八位字节的形式),如果没有限制。您需要同时指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项

 

int

prefetchCount (consumer)

服务器将提供的最大消息数(如果没有限制)。您需要同时指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项

 

int

prefetchGlobal (consumer)

如果设置应应用到整个频道,而不是每个消费者需要指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项。

false

布尔值

channelPoolMaxSize (producer)

获取池中打开的频道的最大数量

10

int

channelPoolMaxWait (producer)

设置池中要等待频道的最大毫秒数

1000

long

requestTimeout (advanced)

在使用 InOut Exchange Pattern (以毫秒为单位)设置等待回复的超时。

20000

long

requestTimeoutChecker Interval (advanced)

为Out Exchange 设置 requestTimeoutCheckerInterval

1000

long

transferException (高级)

当 true 和 inOut Exchange 在消费者侧向响应中发送导致的 Exception 返回时失败

false

布尔值

publisher Acknowledgements (producer)

为 true 时,信息将打开在发布时被发布。

false

布尔值

publisher AcknowledgementsTimeout (producer)

从 RabbitMQ 服务器等待 basic.ack 响应的时间(毫秒)

 

long

guaranteedDeliveries (producer)

为 true 时,当无法发送消息(basic.return)且消息标记为强制时,则会抛出异常。该例中还将激活发布者确认。请参阅发布软件确认 - 当信息将被确认时。

false

布尔值

mandatory (producer)

此标志将告知服务器如何响应消息是否无法路由到队列。如果设置了此标志,服务器会返回一个带有返回方法的无法路由的消息。如果此标志为零,服务器会静默丢弃信息。如果标头存在 rabbitmq.MANDATORY,它将覆盖此选项。

false

布尔值

immediate (producer)

此标志将告知服务器如何响应消息是否无法立即路由到队列消费者。如果设置了此标志,服务器会返回一个带有返回方法的无法传输的消息。如果此标志为零,服务器会将该消息排队,但不保证其被使用。如果标头存在 rabbitmq.IMMEDIATE,它将覆盖这个选项。

false

布尔值

args (advanced)

指定配置不同 RabbitMQ 概念的参数,每个前缀都需要不同的前缀: Exchange: arg.exchange。queue:arg.queue.绑定:arg.binding.例如,使用消息 ttl 参数声明队列 :http://localhost:5672/exchange/queueargs=arg.queue.x-message-ttl=60000

 

map

clientProperties (advanced)

连接客户端属性(在服务器中用于客户端的信息)

 

map

sslProtocol (security)

在连接中启用 SSL,接受的值是 true、TLS 和 'SSLv3

 

字符串

trustManager (security)

配置 SSL 信任管理器,应启用 SSL 才能使用这个选项

 

TrustManager

autoAck (consumer)

如果消息被自动确认

true

布尔值

autoDelete (common)

如果为 true,则在不再使用交换时,它将被删除

true

布尔值

durable (common)

如果我们声明了一个持久的交换(在服务器重新启动后交换)

true

布尔值

专用 (通用)

独占队列只能被当前连接访问,并在该连接关闭时删除。

false

布尔值

exclusiveConsumer (consumer)

请求对队列的独占访问(只有这个消费者可以访问队列)。当您希望长期共享队列可以临时被一个消费者访问时,这非常有用。

false

布尔值

passive (common)

被动队列取决于已在 RabbitMQ 上可用的队列。

false

布尔值

skipQueueDeclare (common)

如果为 true,则制作者不会声明和绑定一个队列。这可用于通过现有路由密钥来指示信息。

false

布尔值

skipQueueBind (common)

如果为 true,在声明队列后不会绑定到交换

false

布尔值

skipExchangeDeclare (common)

如果我们需要声明队列,而不使用交换,则可以使用它

false

布尔值

declare (common)

如果 选项为 true,则 camel 声明交换和队列名称并将其绑定在一起。如果 选项为 false,则 camel 不会声明服务器上的交换和队列名称。

true

布尔值

deadLetterExchange (common)

死信交换的名称

 

字符串

deadLetterQueue (common)

死信队列的名称

 

字符串

deadLetterRoutingKey (common)

死信交换的路由密钥

 

字符串

deadLetterExchangeType (common)

死信交换的类型

direct

字符串

allowNullHeaders (producer)

允许将 null 值传递给标头

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

RabbitMQ 端点使用 URI 语法配置:

rabbitmq:exchangeName

使用以下路径和查询参数:

272.2.1. 路径名(1 参数):

名称描述默认类型

exchangeName

必需。交换名称决定了生成的消息将发送到的交换。对于消费者而言,交换名称决定队列要绑定的交换。

 

字符串

272.2.2. 查询参数(62 参数):

名称描述默认类型

addresses (common)

如果设置了这个选项,则 camel-rabbitmq 将尝试根据选项地址的设置来创建连接。address 值是一个字符串,它类似于 server1:12345, server2:12345

 

address[]

autoDelete (common)

如果为 true,则在不再使用交换时,它将被删除

true

布尔值

connectionFactory (common)

使用自定义 RabbitMQ 连接工厂。当设定这个选项时,不会使用 URI 上设置的所有连接选项(connectionTimeout、requestChannelMax…​)

 

ConnectionFactory

deadLetterExchange (common)

死信交换的名称

 

字符串

deadLetterExchangeType (common)

死信交换的类型

direct

字符串

deadLetterQueue (common)

死信队列的名称

 

字符串

deadLetterRoutingKey (common)

死信交换的路由密钥

 

字符串

declare (common)

如果 选项为 true,则 camel 声明交换和队列名称并将其绑定在一起。如果 选项为 false,则 camel 不会声明服务器上的交换和队列名称。

true

布尔值

durable (common)

如果我们声明了一个持久的交换(在服务器重新启动后交换)

true

布尔值

exchangeType (common)

交换类型,如直接或主题。

direct

字符串

专用 (通用)

独占队列只能被当前连接访问,并在该连接关闭时删除。

false

布尔值

hostname (common)

运行 rabbitmq 实例或集群的主机名称。

 

字符串

passive (common)

被动队列取决于已在 RabbitMQ 上可用的队列。

false

布尔值

portNumber (common)

运行 rabbitmq 实例或集群的主机的端口号。默认值为 5672。

 

int

queue (common)

从中接收消息的队列

 

字符串

routingKey (common)

将消费者队列绑定到交换时使用的路由密钥。对于制作者路由密钥,您将设置标头 rabbitmq.ROUTING_KEY。

 

字符串

skipExchangeDeclare (common)

如果我们需要声明队列,而不使用交换,则可以使用它

false

布尔值

skipQueueBind (common)

如果为 true,在声明队列后不会绑定到交换

false

布尔值

skipQueueDeclare (common)

如果为 true,则制作者不会声明和绑定一个队列。这可用于通过现有路由密钥来指示信息。

false

布尔值

vhost (common)

频道的 vhost

/

字符串

autoAck (consumer)

如果消息被自动确认

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

concurrentConsumers (consumer)

使用代理时的并发用户数量(例如,与 JMS 组件相同的选项一样)。

1

int

exclusiveConsumer (consumer)

请求对队列的独占访问(只有这个消费者可以访问队列)。当您希望长期共享队列可以临时被一个消费者访问时,这非常有用。

false

布尔值

prefetchCount (consumer)

服务器将提供的最大消息数(如果没有限制)。您需要同时指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项

 

int

prefetchEnabled (consumer)

在 RabbitMQConsumer side 上启用服务质量。您需要同时指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项

false

布尔值

prefetchGlobal (consumer)

如果设置应应用到整个频道,而不是每个消费者需要指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项。

false

布尔值

prefetchSize (consumer)

服务器将提供的最大内容(以八位字节的形式),如果没有限制。您需要同时指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项

 

int

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

threadPoolSize (consumer)

使用者使用 Thread Pool Executor,带有固定数量的线程。此设置允许您设定该线程数。

10

int

allowNullHeaders (producer)

允许将 null 值传递给标头

false

布尔值

bridgeEndpoint (producer)

如果 bridgeEndpoint 为 true,则制作者将忽略 rabbitmq.EXCHANGE_NAME 和 rabbitmq.ROUTING_KEY 的消息标题

false

布尔值

channelPoolMaxSize (producer)

获取池中打开的频道的最大数量

10

int

channelPoolMaxWait (producer)

设置池中要等待频道的最大毫秒数

1000

long

guaranteedDeliveries (producer)

为 true 时,当无法发送消息(basic.return)且消息标记为强制时,则会抛出异常。该例中还将激活发布者确认。请参阅发布软件确认 - 当信息将被确认时。

false

布尔值

immediate (producer)

此标志将告知服务器如何响应消息是否无法立即路由到队列消费者。如果设置了此标志,服务器会返回一个带有返回方法的无法传输的消息。如果此标志为零,服务器会将该消息排队,但不保证其被使用。如果标头存在 rabbitmq.IMMEDIATE,它将覆盖这个选项。

false

布尔值

mandatory (producer)

此标志将告知服务器如何响应消息是否无法路由到队列。如果设置了此标志,服务器会返回一个带有返回方法的无法路由的消息。如果此标志为零,服务器会静默丢弃信息。如果标头存在 rabbitmq.MANDATORY,它将覆盖此选项。

false

布尔值

publisherAcknowledgements (producer)

为 true 时,信息将打开在发布时被发布。

false

布尔值

publisherAcknowledgements Timeout (producer)

从 RabbitMQ 服务器等待 basic.ack 响应的时间(毫秒)

 

long

args (advanced)

指定配置不同 RabbitMQ 概念的参数,每个前缀都需要不同的前缀: Exchange: arg.exchange。queue:arg.queue.绑定:arg.binding.例如,使用消息 ttl 参数声明队列 :http://localhost:5672/exchange/queueargs=arg.queue.x-message-ttl=60000

 

map

automaticRecoveryEnabled (advanced)

启用连接自动恢复(使用连接实现,在应用程序没有启动连接时执行自动恢复)

 

布尔值

bindingArgs (advanced)

弃用的 Key/value args 在 declare=true 时配置队列绑定参数

 

map

clientProperties (advanced)

连接客户端属性(在服务器中用于客户端的信息)

 

map

connectionTimeout (advanced)

连接超时

60000

int

exchangeArgs (advanced)

弃用的 Key/value args 在 declare=true 时配置交换参数

 

map

exchangeArgsConfigurer (advanced)

弃用了 设置在 Channel.exchangeDeclare 中设置 exchange args 的 configurer

 

ArgsConfigurer

networkRecoveryInterval (advanced)

网络恢复间隔(以毫秒为单位(从网络故障恢复时使用的间隔)

5000

整数

queueArgs (advanced)

弃用的 Key/value args 在 declare=true 时配置队列参数

 

map

queueArgsConfigurer (advanced)

弃用了 在 Channel.queueDeclare 中设置队列 args 的 configurer

 

ArgsConfigurer

requestedChannelMax (advanced)

请求的连接频道最大(提供的最大频道数)

2047

int

requestedFrameMax (advanced)

请求的连接帧最大(提供的最大帧大小)

0

int

requestedHeartbeat (advanced)

请求的连接心跳(以秒为单位)

60

int

requestTimeout (advanced)

在使用 InOut Exchange Pattern (以毫秒为单位)设置等待回复的超时。

20000

long

requestTimeoutChecker Interval (advanced)

为Out Exchange 设置 requestTimeoutCheckerInterval

1000

long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

topologyRecoveryEnabled (advanced)

启用连接拓扑恢复(应该执行拓扑恢复)

 

布尔值

transferException (高级)

当 true 和 inOut Exchange 在消费者侧向响应中发送导致的 Exception 返回时失败

false

布尔值

密码 (安全)

用于经过身份验证的访问的密码

客户机

字符串

sslProtocol (security)

在连接中启用 SSL,接受的值是 true、TLS 和 'SSLv3

 

字符串

trustManager (security)

配置 SSL 信任管理器,应启用 SSL 才能使用这个选项

 

TrustManager

username (security)

身份验证访问时的用户名

客户机

字符串

272.3. Spring Boot Auto-Configuration

组件支持 51 选项,如下所示。

名称描述默认类型

camel.component.rabbitmq.addresses

如果设置了这个选项,则 camel-rabbitmq 将尝试根据选项地址的设置来创建连接。address 值是一个字符串,它类似于 server1:12345, server2:12345

 

字符串

camel.component.rabbitmq.allow-null-headers

允许将 null 值传递给标头

false

布尔值

camel.component.rabbitmq.args

指定配置不同 RabbitMQ 概念的参数,每个前缀都需要不同的前缀: Exchange: arg.exchange。queue:arg.queue.绑定:arg.binding.例如,使用消息 ttl 参数声明队列 :http://localhost:5672/exchange/queueargs=arg.queue.x-message-ttl=60000

 

map

camel.component.rabbitmq.auto-ack

如果消息被自动确认

true

布尔值

camel.component.rabbitmq.auto-delete

如果为 true,则在不再使用交换时,它将被删除

true

布尔值

camel.component.rabbitmq.auto-detect-connection-factory

是否从注册表自动探测到 RabbitMQ 连接工厂。启用并且找到连接工厂的单一实例后,它将被使用。可以在组件或端点级别上配置显式连接工厂,其具有优先权。

true

布尔值

camel.component.rabbitmq.automatic-recovery-enabled

启用连接自动恢复(使用连接实现,在应用程序没有启动连接时执行自动恢复)

 

布尔值

camel.component.rabbitmq.channel-pool-max-size

获取池中打开的频道的最大数量

10

整数

camel.component.rabbitmq.channel-pool-max-wait

设置池中要等待频道的最大毫秒数

1000

Long

camel.component.rabbitmq.client-properties

连接客户端属性(在服务器中用于客户端的信息)

 

map

camel.component.rabbitmq.connection-factory

使用自定义 RabbitMQ 连接工厂。当设定这个选项时,不会使用 URI 上设置的所有连接选项(connectionTimeout、requestChannelMax…​)。选项为 com.rabbitmq.client.ConnectionFactory 类型。

 

字符串

camel.component.rabbitmq.connection-timeout

连接超时

60000

整数

camel.component.rabbitmq.dead-letter-exchange

死信交换的名称

 

字符串

camel.component.rabbitmq.dead-letter-exchange-type

死信交换的类型

direct

字符串

camel.component.rabbitmq.dead-letter-queue

死信队列的名称

 

字符串

camel.component.rabbitmq.dead-letter-routing-key

死信交换的路由密钥

 

字符串

camel.component.rabbitmq.declare

如果 选项为 true,则 camel 声明交换和队列名称并将其绑定在一起。如果 选项为 false,则 camel 不会声明服务器上的交换和队列名称。

true

布尔值

camel.component.rabbitmq.durable

如果我们声明了一个持久的交换(在服务器重新启动后交换)

true

布尔值

camel.component.rabbitmq.enabled

启用 rabbitmq 组件

true

布尔值

camel.component.rabbitmq.exclusive

独占队列只能被当前连接访问,并在该连接关闭时删除。

false

布尔值

camel.component.rabbitmq.exclusive-consumer

请求对队列的独占访问(只有这个消费者可以访问队列)。当您希望长期共享队列可以临时被一个消费者访问时,这非常有用。

false

布尔值

camel.component.rabbitmq.guaranteed-deliveries

为 true 时,当无法发送消息(basic.return)且消息标记为强制时,则会抛出异常。该例中还将激活发布者确认。请参阅发布软件确认 - 当信息将被确认时。

false

布尔值

camel.component.rabbitmq.hostname

运行 RabbitMQ 实例或集群的主机名。

 

字符串

camel.component.rabbitmq.immediate

此标志将告知服务器如何响应消息是否无法立即路由到队列消费者。如果设置了此标志,服务器会返回一个带有返回方法的无法传输的消息。如果此标志为零,服务器会将该消息排队,但不保证其被使用。如果标头存在 rabbitmq.IMMEDIATE,它将覆盖这个选项。

false

布尔值

camel.component.rabbitmq.mandatory

此标志将告知服务器如何响应消息是否无法路由到队列。如果设置了此标志,服务器会返回一个带有返回方法的无法路由的消息。如果此标志为零,服务器会静默丢弃信息。如果标头存在 rabbitmq.MANDATORY,它将覆盖此选项。

false

布尔值

camel.component.rabbitmq.network-recovery-interval

网络恢复间隔(以毫秒为单位(从网络故障恢复时使用的间隔)

5000

整数

camel.component.rabbitmq.passive

被动队列取决于已在 RabbitMQ 上可用的队列。

false

布尔值

camel.component.rabbitmq.password

用于经过身份验证的访问的密码

客户机

字符串

camel.component.rabbitmq.port-number

运行 rabbitmq 实例或集群的主机的端口号。

5672

整数

camel.component.rabbitmq.prefetch-count

服务器将提供的最大消息数(如果没有限制)。您需要同时指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项

 

整数

camel.component.rabbitmq.prefetch-enabled

在 RabbitMQConsumer side 上启用服务质量。您需要同时指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项

false

布尔值

camel.component.rabbitmq.prefetch-global

如果设置应应用到整个频道,而不是每个消费者需要指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项。

false

布尔值

camel.component.rabbitmq.prefetch-size

服务器将提供的最大内容(以八位字节的形式),如果没有限制。您需要同时指定 prefetchSize、prefetchCount 和 prefetchGlobal 选项

 

整数

camel.component.rabbitmq.publisher-acknowledgements

为 true 时,信息将打开在发布时被发布。

false

布尔值

camel.component.rabbitmq.publisher-acknowledgements-timeout

从 RabbitMQ 服务器等待 basic.ack 响应的时间(毫秒)

 

Long

camel.component.rabbitmq.request-timeout

在使用 InOut Exchange Pattern (以毫秒为单位)设置等待回复的超时。

20000

Long

camel.component.rabbitmq.request-timeout-checker-interval

为Out Exchange 设置 requestTimeoutCheckerInterval

1000

Long

camel.component.rabbitmq.requested-channel-max

请求的连接频道最大(提供的最大频道数)

2047

整数

camel.component.rabbitmq.requested-frame-max

请求的连接帧最大(提供的最大帧大小)

0

整数

camel.component.rabbitmq.requested-heartbeat

请求的连接心跳(以秒为单位)

60

整数

camel.component.rabbitmq.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.rabbitmq.skip-exchange-declare

如果我们需要声明队列,而不使用交换,则可以使用它

false

布尔值

camel.component.rabbitmq.skip-queue-bind

如果为 true,在声明队列后不会绑定到交换

false

布尔值

camel.component.rabbitmq.skip-queue-declare

如果为 true,则制作者不会声明和绑定一个队列。这可用于通过现有路由密钥来指示信息。

false

布尔值

camel.component.rabbitmq.ssl-protocol

在连接中启用 SSL,接受的值是 true、TLS 和 'SSLv3

 

字符串

camel.component.rabbitmq.thread-pool-size

使用者使用 Thread Pool Executor,带有固定数量的线程。此设置允许您设定该线程数。

10

整数

camel.component.rabbitmq.topology-recovery-enabled

启用连接拓扑恢复(应该执行拓扑恢复)

 

布尔值

camel.component.rabbitmq.transfer-exception

当 true 和 inOut Exchange 在消费者侧向响应中发送导致的 Exception 返回时失败

false

布尔值

camel.component.rabbitmq.trust-manager

配置 SSL 信任管理器,应启用 SSL 才能使用这个选项。选项是一个 javax.net.ssl.TrustManager 类型。

 

字符串

camel.component.rabbitmq.username

身份验证访问时的用户名

客户机

字符串

camel.component.rabbitmq.vhost

频道的 vhost

/

字符串

有关连接选项的更多信息,请参阅 http://www.rabbitmq.com/releases/rabbitmq-java-client/current-javadoc/com/rabbitmq/client/ConnectionFactory.html 和 AMQP 规格。

272.4. 使用连接工厂

要连接到 RabbitMQ,您可以设置 ConnectionFactory (与 JMS 一样),并提供登录详细信息,例如:

<bean id="rabbitConnectionFactory" class="com.rabbitmq.client.ConnectionFactory">
  <property name="host" value="localhost"/>
  <property name="port" value="5672"/>
  <property name="username" value="camel"/>
  <property name="password" value="bugsbunny"/>
</bean>

And then refer to the connection factory in the endpoint uri as shown below:

<camelContext>
  <route>
    <from uri="direct:rabbitMQEx2"/>
    <to uri="rabbitmq:ex2?connectionFactory=#rabbitConnectionFactory"/>
  </route>
</camelContext>

ConnectionFactory 的 Camel 2.21 上,默认情况下会自动探测到,因此您可以仅执行。

<camelContext>
  <route>
    <from uri="direct:rabbitMQEx2"/>
    <to uri="rabbitmq:ex2"/>
  </route>
</camelContext>

272.5. 消息标头

在使用消息时,会对交换设置以下标头。

属性

rabbitmq.ROUTING_KEY

用于接收消息的路由密钥,或者用于生成消息时将使用的路由密钥

rabbitmq.EXCHANGE_NAME

收到该消息的交换信息

rabbitmq.DELIVERY_TAG

接收消息的 rabbitmq delivery 标签

rabbitmq.REDELIVERY_TAG

消息是否红色

rabbitmq.REQUEUE

Camel 2.14.2: 这供使用者用于控制消息的拒绝。当消费者完成交换时,如果交换失败,使用者将拒绝来自 RabbitMQ 代理的消息。此标头的值控制此行为。如果值为 false (默认),则消息将被丢弃/死信。如果值为 true,则消息为 re-queued。 

生产者使用以下标头。如果在 camel Exchange 上设置了这些,则在 RabbitMQ 消息上设置它们。

属性

rabbitmq.ROUTING_KEY

发送消息时要使用的路由密钥

rabbitmq.EXCHANGE_NAME

收到该消息的交换信息

rabbitmq.EXCHANGE_OVERRIDE_NAME

Camel 2.21: 用于强制将消息发送到此交换,而不是制作者上配置的端点名称

rabbitmq.CONTENT_TYPE

在 RabbitMQ 消息上设置的 contentType

rabbitmq.PRIORITY

在 RabbitMQ 消息上设置的优先级标头

rabbitmq.CORRELATIONID

在 RabbitMQ 消息上设置的 correlationId

rabbitmq.MESSAGE_ID

在 RabbitMQ 消息上设置的消息 ID

rabbitmq.DELIVERY_MODE

如果消息应为 persistent 或 not

rabbitmq.USERID

在 RabbitMQ 消息上设置的 userId

rabbitmq.CLUSTERID

在 RabbitMQ 消息上设置的 clusterId

rabbitmq.REPLY_TO

在 RabbitMQ 消息上设置的 replyTo

rabbitmq.CONTENT_ENCODING

在 RabbitMQ 消息上设置的内容编码

rabbitmq.TYPE

在 RabbitMQ 消息上设置的类型

rabbitmq.EXPIRATION

在 RabbitMQ 消息上设置的过期时间

rabbitmq.TIMESTAMP

在 RabbitMQ 消息上设置的时间戳

rabbitmq.APP_ID

在 RabbitMQ 消息上设置的 appId

在收到消息后,消费者设置标头。在交换进行后,生产者还将为下游处理器设置标头。在生产之前设置的任何标头都会覆盖制作者集。

272.6. Message Body

组件将在正文中使用 camel Exchange 作为 rabbit mq 消息正文。对象中的 camel Exchange 必须可以被转换为字节阵列。否则,生产者将抛出一个不支持的正文类型例外。

272.7. Samples

使用路由密钥 B 从绑定到交换 A 的队列接收消息,

from("rabbitmq:A?routingKey=B")

从队列接收带有自动确认禁用的单个线程的消息。

from("rabbitmq:A?routingKey=B&threadPoolSize=1&autoAck=false")

发送消息到名为 C 的交换

to("rabbitmq:C")

声明标头交换和队列

from("rabbitmq:ex?exchangeType=headers&queue=q&bindingArgs=#bindArgs")

然后,将对应的 Map<String、Object > 与 registry 中的 "bindArgs" id 放置在其中。

例如,在 spring 中声明方法

@Bean(name="bindArgs")
public Map<String, Object> bindArgsBuilder() {
    return Collections.singletonMap("foo", "bar");
}

272.7.1. 交换间的路由时出现问题(在 Camel 2.20.x 或更早版本中)

例如,要将来自一个 Rabbit 交换的信息路由到另一个 Rabbit 交换的信息,如 foo → bar 所示:

from("rabbitmq:foo")
  .to("rabbitmq:bar")

请注意,Camel 会将消息路由到其自身,例如 foo → foo。那么,为什么会这样呢?这是因为接收消息(例如,)的使用者提供消息标题 rabbitmq.EXCHANGE_NAME,其名称为 eg foo。而当 Camel 制作者向 bar 发送消息时,标题 rabbitmq.EXCHANGE_NAME 将覆盖此消息,而是将消息发送到 foo

为了避免这种情况,您需要:

  • 删除标头:
from("rabbitmq:foo")
  .removeHeader("rabbitmq.EXCHANGE_NAME")
  .to("rabbitmq:bar")
  • 或打开制作者上的 bridgeEndpoint 模式:
from("rabbitmq:foo")
  .to("rabbitmq:bar?bridgeEndpoint=true")

从 Camel 2.21 开始已改进,您可以在交换间轻松路由。标头 rabbitmq.EXCHANGE_NAME 不再供制作者用来覆盖目标交换。可以使用一个新的标头 rabbitmq.EXCHANGE_OVERRIDE_NAME 来发送到不同的交换。例如,要发送到 cheese Exchange,您可以完成

from("rabbitmq:foo")
  .setHeader("rabbitmq.EXCHANGE_OVERRIDE_NAME", constant("cheese"))
  .to("rabbitmq:bar")

第 273 章 Reactive Streams 组件

作为 Camel 版本 2.19 可用

reactive -streams: 组件允许您使用与被动流标准兼容的 被动 流处理库交换信息。

组件支持 backpressure,并且已使用 reactive Streams 技术兼容性套件(TCK) 进行测试。

Camel 模块提供了一个 被动(active-streams )组件,允许用户在 Camel 路由中定义传入和传出流,以及直接客户端 API,允许直接使用 Camel 端点进入任何外部被动框架。

Camel 使用被动流 发布程序 和订阅程序的内部实现,因此它不与任何特定的框架绑定。在集成测试中使用了以下被动框架: Reactor Core 3,RxJava 2

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-reactive-streams</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

273.1. URI 格式

reactive-streams://stream?[options]

其中 stream 是用于将 Camel 路由绑定到外部流处理系统的逻辑流名称。

273.2. 选项

Reactive Streams 组件支持 4 个选项,它们如下所列。

名称描述默认类型

internalEngine 配置 (高级)

为 Reactive Streams 配置内部引擎。

 

ReactiveStreamsEngine Configuration

backpressureStrategy (producer)

将事件推送到缓慢订户时使用的 backpressure 策略。

缓冲

ReactiveStreams BackpressureStrategy

serviceType (advanced)

设置要使用的底层被动流的类型。实现从 registry 或使用 ServiceLoader 中查找,默认实现是 DefaultCamelReactiveStreamsService

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Reactive Streams 端点使用 URI 语法配置:

reactive-streams:stream

使用以下路径和查询参数:

273.2.1. 路径名(1 参数):

名称描述默认类型

stream

用于交换消息的端点使用的流频道名称。

 

字符串

273.2.2. 查询参数(10 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

concurrentConsumers (consumer)

用于处理 Camel 路由中交换的线程数量。

1

int

exchangesRefillLowWatermark (consumer)

将请求的交换的低水位线设置为活跃订阅,以 maxInflightExchanges 的百分比。当上游源中的待处理项目数量低于水位线时,可以向订阅请求新项目。如果设置为 0,则订阅者将请求 maxInflightExchanges 批处理中的项,仅在处理上一个批处理的所有项目之后。如果设置为 1,则订阅者每次处理交换(chatty)时可以请求一个新项目。可以使用任何中间值。

0.25

double

forwardOnComplete (consumer)

确定Complete 事件是否应推送到 Camel 路由。

false

布尔值

forwardOnError (consumer)

确定是否应该将 onError 事件推送到 Camel 路由。例外情况将被设置为消息正文。

false

布尔值

maxInflightExchanges (consumer)

Camel 同时处理的最大交换数。此参数控制流中的 backpressure。设置非正数值将禁用后端。

128

整数

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

backpressureStrategy (producer)

将事件推送到缓慢订户时使用的 backpressure 策略。

 

ReactiveStreams BackpressureStrategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

273.3. Spring Boot Auto-Configuration

组件支持 7 个选项,如下所示。

名称描述默认类型

camel.component.reactive-streams.backpressure-strategy

将事件推送到缓慢订户时使用的 backpressure 策略。

 

ReactiveStreams BackpressureStrategy

camel.component.reactive-streams.enabled

启用 reactive-streams 组件

true

布尔值

camel.component.reactive-streams.internal-engine-configuration.thread-pool-max-size

重新主动流内部引擎使用的最大线程数量。

 

整数

camel.component.reactive-streams.internal-engine-configuration.thread-pool-min-size

重新主动流内部引擎使用的最小线程数量。

 

整数

camel.component.reactive-streams.internal-engine-configuration.thread-pool-name

重新主动流内部引擎使用的线程池的名称。

 

字符串

camel.component.reactive-streams.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.reactive-streams.service-type

设置要使用的底层被动流的类型。实现从 registry 或使用 ServiceLoader 中查找,默认实现是 DefaultCamelReactiveStreamsService

 

字符串

273.4. 使用

该库旨在支持应用程序与 Camel 数据交互所需的所有通信模式:

  • 从 Camel 路由中获取数据(仅限来自 Camel)
  • 将数据发送到 Camel 路由(仅适用于 Camel)
  • 请求 向 Camel 路由转换(从 Camel 开始)
  • 使用被动 处理 步骤(从 Camel 开始)处理来自 Camel 路由的数据流。

273.5. 从 Camel 获取数据

要订阅来自 Camel 路由的数据流,交换应重定向到指定的流,如下代码片段:

from("timer:clock")
.setBody().header(Exchange.TIMER_COUNTER)
.to("reactive-streams:numbers");

也可以使用 XML DSL 编写路由。

在示例中,未绑定的数字流与名称 编号 相关联。使用 CamelReactiveStreams 实用程序类可以访问该流。

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

// Getting a stream of exchanges
Publisher<Exchange> exchanges = camel.fromStream("numbers");

// Getting a stream of Integers (using Camel standard conversion system)
Publisher<Integer> numbers = camel.fromStream("numbers", Integer.class);

该流可轻松与任何 reactive stream 兼容库一起使用。以下是如何将它与 RxJava 2 搭配使用的示例(尽管任何被动框架可用于处理事件)。

Flowable.fromPublisher(integers)
    .doOnNext(System.out::println)
    .subscribe();

示例将 Camel 生成的所有数字打印到 System.out 中。

273.5.1. 使用直接 API 从 Camel 获取数据

对于短的 Camel 路由,而对于更喜欢使用被动框架的功能结构定义整个处理流的用户(无需使用 Camel DSL),也可以使用 Camel URI 定义流。

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

// Get a stream from all the files in a directory
Publisher<String> files = camel.from("file:folder", String.class);

// Use the stream in RxJava2
Flowable.fromPublisher(files)
    .doOnNext(System.out::println)
    .subscribe();

273.6. 将数据发送到 Camel

当外部库需要将事件推送到 Camel 路由时,Reactive Streams 端点必须设置为使用者。

from("reactive-streams:elements")
.to("log:INFO");

元素 流的句柄可以从 CamelReactiveStreams 实用程序类获取。

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

Subscriber<String> elements = camel.streamSubscriber("elements", String.class);

订阅者可用于将事件推送到从 元素 流中消耗的 Camel 路由。

以下是如何将它与 RxJava 2 搭配使用的示例(尽管任何被动框架可用于发布事件)。

Flowable.interval(1, TimeUnit.SECONDS)
    .map(i -> "Item " + i)
    .subscribe(elements);

字符串项由示例中 RxJava 生成,它们被推送到以上定义的 Camel 路由中。

273.6.1. 使用直接 API 将数据发送到 Camel

在这种情况下,可以使用直接 API 从端点 URI 获取 Camel 订阅者。

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

// Send two strings to the "seda:queue" endpoint
Flowable.just("hello", "world")
    .subscribe(camel.subscriber("seda:queue", String.class));

273.7. 请求向 Camel 转型

某些 Camel DSL 中定义的路由可以在被动流框架中使用,以执行特定的转换(相同机制也可用于将数据发送到 http 端点并继续)。

下列代码片段演示了 RxJava 功能代码如何能够请求加载和汇总文件到 Camel 的任务。

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

// Process files starting from their names
Flowable.just(new File("file1.txt"), new File("file2.txt"))
    .flatMap(file -> camel.toStream("readAndMarshal", String.class))
    // Camel output will be converted to String
    // other steps
    .subscribe();

要达到此目的,在 Camel 上下文中应定义类似以下的路由:

from("reactive-streams:readAndMarshal")
.marshal() // ... other details

273.7.1. 使用直接 API 请求向 Camel 转型

另一种方法是直接在被动流中使用 URI 端点:

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

// Process files starting from their names
Flowable.just(new File("file1.txt"), new File("file2.txt"))
    .flatMap(file -> camel.to("direct:process", String.class))
    // Camel output will be converted to String
    // other steps
    .subscribe();

使用 to () 方法而不是 toStream 时,不需要使用 "reactive-streams:" 端点(尽管在功能下使用它们)定义路由。

在这种情况下,Camel 转型只是:

from("direct:process")
.marshal() // ... other details

273.8. 将 Camel 数据处理为被动框架

虽然重新活动流 发布程序 允许以单向的方式交换数据,但 Camel 路由通常使用外部交换模式(例如,定义 REST 端点,一般是为每个请求需要回复)。

在这些情况下,用户可以向流添加被动处理步骤,以增强 Camel 路由或使用被动框架定义整个转换。

例如,给定以下路由:

from("timer:clock")
.setBody().header(Exchange.TIMER_COUNTER)
.to("direct:reactive")
.log("Continue with Camel route... n=${body}");

被动处理步骤可以与 "direct:reactive" 端点关联:

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

camel.process("direct:reactive", Integer.class, items ->
    Flowable.fromPublisher(items) // RxJava2
        .map(n -> -n)); // make every number negative

Camel 路由中的数据流将由外部被动框架处理,然后在 Camel 中继续处理流。

这种机制也可用于以完全被动的方式定义非外包交换。

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

// requires a rest-capable Camel component
camel.process("rest:get:orders", exchange ->
                    Flowable.fromPublisher(exchange)
                            .flatMap(ex -> allOrders())); // retrieve orders asynchronously

有关详细信息,请参阅 Camel 示例(camel-example-reactive-streams)。

273.9. 高级主题

273.9.1. 控制 Backpressure (重现方)

将 Camel 交换路由到外部订阅者时,由内部缓冲区处理,该缓冲区在传送之前缓存交换。如果订阅者比交换率慢,则缓冲区可能会变得太大。在很多情况下,必须避免出现这种情况。

考虑以下路由:

from("jms:queue")
.to("reactive-streams:flow");

如果 JMS 队列包含大量消息,并且与 流流 关联的 Subscriber 太慢,则消息会从 JMS 进行排队并附加到缓冲区中,这可能会导致"内存不足"错误。为避免这个问题,可在路由中设置 ThrottlingInflightRoutePolicy

ThrottlingInflightRoutePolicy policy = new ThrottlingInflightRoutePolicy();
policy.setMaxInflightExchanges(10);

from("jms:queue")
.routePolicy(policy)
.to("reactive-streams:flow");

策略限制活动交换的最大数量(以及缓冲区的最大大小),使其小于阈值(示例中为10 )。当超过 10 条消息时,该路由将被暂停,等待订阅者处理它们。

使用这种机制时,订阅者通过回溯方式自动控制路由挂起/恢复。当多个订阅者消耗同一流的项目时,自动控制路由状态最慢。

在其他情况下,例如,在使用 http 消费者时,路由挂起使 http 服务不可用,因此将使用默认配置(无策略,未绑定的缓冲)应首选使用。用户应该通过将请求数量限制为 http 服务(例如,横向扩展)来避免内存问题。

在可以接受某些数量数据丢失的情况下,设置 BUFFER 以外的回溯策略可能是处理快速源的解决方案。

from("direct:thermostat")
.to("reactive-streams:flow?backpressureStrategy=LATEST");

当使用 LATEST backpressure 策略时,发布者只保留从该路由接收的最后一次交换,同时丢弃较旧的数据(其它选项可用)。

273.9.2. 控制 Backpressure (消费者侧)

当 Camel 消耗来自 Reactive-streams publisher 的项时,动态交换的最大数量可以设置为端点选项。

与消费者关联的订阅者与发布者交互,以使路由中的消息数量低于阈值。

backpressure-aware 路由示例:

from("reactive-streams:numbers?maxInflightExchanges=10")
.to("direct:endpoint");

Camel 向源发布者请求(通过被动流后端机制)的项数量始终低于 10。消息由 Camel 一侧的单个线程处理。

并发使用者(线程)的数量也可以设置为端点选项(并发Consumers)。使用 1 个消费者(默认值)时,源流中的项目顺序会被维护。当此值增加时,项目将由多个线程同时处理(因此不会保留顺序)。

273.10. Camel Reactive Streams Starter

spring-boot 用户提供了一个初学者模块。在使用初学者时,CamelReactiveStreamsService 可以直接注入到 Spring 组件中。

要使用初学者,请在 spring boot pom.xml 文件中添加以下内容:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-reactive-streams-starter</artifactId>
    <version>${camel.version}</version> <!-- use the same version as your Camel core version -->
</dependency>

273.11. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 274 章 Reactor 组件

可作为 Camel 版本 2.20 可用

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-reactor</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

第 275 章 ref 组件

可作为 Camel 版本 1.2 提供

ref: 组件用于查找 Registry 中绑定的现有端点。

275.1. URI 格式

ref:someName[?options]

其中 someName 是 Registry 中的端点名称(通常为,但不总是,Spring registry)。如果使用 Spring registry,则 someName 将是 Spring registry 中端点的 bean ID。

275.2. ref 选项

Ref 组件没有选项。

Ref 端点使用 URI 语法进行配置:

ref:name

使用以下路径和查询参数:

275.2.1. 路径名(1 参数):

名称描述默认类型

name

在 registry 中查询 所需的 端点名称。

 

字符串

275.2.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

275.3. runtime lookup

当您在 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>

275.4. 示例

在以下示例中,我们使用 URI 中的 ref: 来引用 spring ID, endpoint2 的端点:

当然,您可以改为使用 ref 属性:

<to ref="endpoint2"/>

这也是编写更常见的方法。

第 276 章 REST 组件

作为 Camel 版本 2.14 可用

其余组件允许使用 Rest DSL 和插件到其他 Camel 组件(作为 REST 传输)来定义 REST 端点(使用者)。

从 Camel 2.18 开始,剩余组件也可以用作客户端(生产者)来调用 REST 服务。

276.1. URI 格式

rest://method:path[:uriTemplate]?[options]

276.2. URI 选项

REST 组件支持 4 个选项,它们如下所列。

名称描述默认类型

componentName (common)

用于 REST 传输的 Camel Rest 组件,如 restlet、spark-rest.如果没有明确配置组件,则 Camel 将会查找(如果是与 Rest DSL 集成)的 Camel 组件,或者一个 org.apache.camel.spi.RestConsumerFactory (consumer)或 org.apache.camel.spi.RestProducerFactory (producer)会在 registry 中注册。如果找到其中任何一个,那么将使用。

 

字符串

apiDoc (producer)

要使用的 OpenAPI api doc 资源。资源默认从 classpath 加载,且必须采用 JSon 格式。

 

字符串

host (producer)

要使用的 HTTP 服务的主机和端口(在 OpenAPI 模式中覆盖主机)

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

REST 端点使用 URI 语法配置:

rest:method:path:uriTemplate

使用以下路径和查询参数:

276.2.1. 路径名(3 参数):

名称描述默认类型

方法

要使用 所需的 HTTP 方法。

 

字符串

path

所需的 基本路径

 

字符串

uriTemplate

uri 模板

 

字符串

276.2.2. 查询参数(15 参数):

名称描述默认类型

componentName (common)

用于 REST 传输的 Camel Rest 组件,如 restlet、spark-rest.如果没有明确配置组件,则 Camel 将会查找(如果是与 Rest DSL 集成)的 Camel 组件,或者一个 org.apache.camel.spi.RestConsumerFactory 在注册表中注册。如果找到其中任何一个,那么将使用。

 

字符串

consumes (common)

介质类型,如 'text/xml',或 'application/json' this REST 服务接受。默认情况下,我们接受各种类型。

 

字符串

inType (common)

将传入的 POJO 绑定类型声明为 FQN 类名称

 

字符串

outType (common)

将传出 POJO 绑定类型声明为 FQN 类名称

 

字符串

produces (common)

介质类型,如: 'text/xml' 或 'application/json' this REST service returns。

 

字符串

routeId (common)

此 REST 服务创建的路由的名称

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

description (consumer)

记录此 REST 服务的人类描述

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

apiDoc (producer)

要使用的 OpenAPI api doc 资源。资源默认从 classpath 加载,且必须采用 JSon 格式。

 

字符串

bindingMode (producer)

配置制作者的绑定模式。如果设置为 'off' 以外的任何内容,则制作者将尝试将传入消息的正文从 inType 转换为 json 或 xml,响应从 json 或 xml 到 outType。

 

RestBindingMode

host (producer)

要使用的 HTTP 服务的主机和端口(在 OpenAPI 模式中覆盖主机)

 

字符串

queryParameters (producer)

查询要调用的 HTTP 服务的参数

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

276.3. 支持的其他组件

下列组件支持其他使用者(Rest DSL):

  • camel-coap
  • camel-netty-http
  • camel-netty4-http
  • camel-jetty
  • camel-restlet
  • camel-servlet
  • camel-spark-rest
  • camel-undertow

下列组件支持其他制作者:

  • camel-http
  • camel-http4
  • camel-netty4-http
  • camel-jetty
  • camel-restlet
  • camel-undertow

276.4. 路径和 uriTemplate 语法

路径和 uriTemplate 选项采用 REST 语法来定义,您可以在其中使用 支持参数来定义 REST 上下文路径。 

TIP:如果没有配置 uriTemplate,则 path 选项的工作方式相同。如果您只配置路径或者您同时配置了这两个选项,这无关紧要。虽然配置路径和 uriTemplate 是使用 REST 更为常见的做法。

以下是只使用路径的 Camel 路由

from("rest:get:hello")
  .transform().constant("Bye World");

以下路由使用了参数,该参数映射到带有键 "me" 的 Camel 标头。

from("rest:get:hello/{me}")
  .transform().simple("Bye ${header.me}");

以下示例已将基本路径配置为"hello",然后使用 uriTemplates 配置两个 REST 服务。

from("rest:get:hello:/{me}")
  .transform().simple("Hi ${header.me}");

from("rest:get:hello:/french/{me}")
  .transform().simple("Bonjour ${header.me}");

276.5. REST producer 示例

您可以使用其余组件来调用 REST 服务,如任何其他 Camel 组件。

例如,若要使用 hello/{me} 调用 REST 服务,您可以

from("direct:start")
  .to("rest:get:hello/{me}");

然后,动态值 {me} 映射到 Camel 消息,名称相同。因此,要调用此 REST 服务,您可以发送空消息正文和标题,如下所示:

template.sendBodyAndHeader("direct:start", null, "me", "Donald Duck");

Rest producer 需要知道 REST 服务的主机名和端口,您可以按照如下所示配置它们:

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}");

您可以使用 制作者Component 来选择将哪个 Camel 组件用作 HTTP 客户端,例如,可以使用 http4:

restConfiguration().host("myserver:8080/foo").producerComponent("http4");

from("direct:start")
  .to("rest:get:hello/{me}");

276.6. REST producer 绑定

REST 制作者支持使用 JSon 或 XML (如 rest-dsl )的绑定。

例如,要在其余配置中打开对 json 绑定模式使用 jetty:

restConfiguration().component("jetty").host("localhost").port(8080).bindingMode(RestBindingMode.json);

from("direct:start")
  .to("rest:post:user");

然后,当使用其他制作者调用 REST 服务时,它将在调用 REST 服务前自动将任何 POJO 绑定到 json:

  UserPojo user = new UserPojo();
  user.setId(123);
  user.setName("Donald Duck");

  template.sendBody("direct:start", user);

在上面的示例中,我们发送 POJO 实例 UserPojo 作为消息正文。由于我们在其余配置中打开了 JSon 绑定,因此 POJO 会在调用 REST 服务之前从 POJO 派生到 JSon。

但是,如果要为响应消息执行绑定(例如 REST 服务发回为响应)您需要配置 outType 选项以指定 POJO 到 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 绑定到 POJO,则必须配置 outType 选项,以获取从调用 REST 服务收到的响应消息。

276.7. 更多示例

请参阅 Rest DSL 提供了更多示例,以及如何使用 Rest DSL 以 nicer RESTful 方法定义它们。

Apache Camel 分发中有一个 camel-example-servlet-rest-tomcat 示例,它演示了如何将带有 SERVLET 的 Rest DSL 用于 SERVLET,作为可在 Apache Tomcat 或类似 Web 容器上部署的传输。

276.8. 另请参阅

部分 I. REST OpenApi Component

Since Camel 3.1

仅支持制作者

REST OpenApi* 配置 OpenApi (Open API)规范文档的其余部分制作者,并委托给实施 RestProducerFactory 接口的组件。当前已知的组件是:

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-rest-openapi</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

第 277 章 URI 格式

rest-openapi:[specificationPath#]operationId

其中 operationId 是 OpenApi 规格中的操作 ID,并且 specificationPath 是规格的路径。如果没有指定 specificationPath,则默认为 openapi.json。查找机制使用 Camels ResourceHelper 来加载资源,这意味着您可以使用 CLASSPATH 资源(classpath:my-specification.json)、文件(/some/path.json)、Web (http://api.example.com/openapi.json)或引用 bean (ref:nameOfBean)或使用 abean (an:name:OfBean)的方法。 未能实现 OpenApi 自己的资源加载支持。

此组件不充当 HTTP 客户端,它将委托给上述其他组件。查找机制会搜索实现 RestProducerFactory 接口并使用该界面的单个组件。如果 CLASSPATH包含多个,则应该设置属性 componentName 来指明要委托哪个组件。

大多数配置从 OpenApi 规范中获取,但该选项存在,可以通过在组件或端点中指定它们来覆盖它们。通常,如果与规格不同,您只需覆盖 主机或 basePath

注意

host 参数应包含包括方案、主机名和端口号的绝对 URI,例如 :https://api.example.com

使用 componentName 指定用于执行请求的组件,这需要在 Camel 上下文中显示此指定组件,并实施所需的 RestProducerFactory interface©-OPTSas 执行顶部列出的组件。

如果您没有在组件或端点级别上指定 componentName,则会搜索 CLASSPATH 以获取合适的委派。CLASSPATH 中应只有一个组件,它实施 RestProducerFactory 接口才能正常工作。

此组件的端点 URI 是很方便的,这意味着除了消息标头外,除了消息标头外,您还可以将 REST 操作的参数指定为端点参数,这样才能对后续调用(如 /api/{version}/users/users/users/{id})参数进行持续使用,因此最好只针对所有调用(如 /api/{version}/users/{id} )中的 API 版本使用这个功能。

第 278 章 选项

REST OpenApi 组件支持 10 个选项,它们如下所列。

名称描述默认类型

basePath (producer)

API basePath,如 /v2。默认为 unset,如果设置会覆盖 OpenApi 规格中存在的值。

 

字符串

componentName (producer)

将执行请求的 Camel 组件的名称。组件必须存在于 Camel 注册表中,并且必须实施 RestProducerFactory 服务提供商接口。如果没有设置 CLASSPATH,则会搜索实现 RestProducerFactory SPI 的单个组件。可以在端点配置中覆盖。

 

字符串

consumes (producer)

此组件可以消耗的有效负载类型。根据 RFC7231,可以是 type,如 application/json 或多个类型作为 application/json、application/xml; q=0.5。这等同于 Accept HTTP 标头的值。如果设置覆盖 OpenApi 规格中找到的任何值。可以在端点配置中覆盖

 

字符串

host (producer)

方案主机名和端口以 https://hostname:port 的形式将 HTTP 请求定向到。可以在端点、组件或在 Camel 上下文中对应的 REST 配置中进行配置。如果您为这个组件指定一个名称(如 petstore),则首先会参考 REST 配置、下一个 rest-openapi 下一个和全局配置。如果设置覆盖 OpenApi 规格, RestConfiguration 中的任何值。可以在端点配置中覆盖。

 

字符串

produces (producer)

生成此组件的有效负载类型。例如,根据 RFC7231 的 application/json 示例。这等同于 Content-Type HTTP 标头的值。如果 set 覆盖 OpenApi 规格中存在的任何值。可以在端点配置中覆盖。

 

字符串

specificationUri (producer)

OpenApi 规格文件的路径。这个规格中采用主机基本路径,但可以使用组件或端点级别的属性覆盖它们。如果未指定组件,则组件会尝试加载 openapi.json 资源。请注意,在组件和端点中定义的主机应该包含 URI 语法(例如 https://api.example.com:8080)中的方案、主机名和端口的可选端口。可以在端点配置中覆盖。

openapi.json

URI

sslContextParameters (security)

自定义组件使用的 TLS 参数。如果没有设置,则默认为 Camel 上下文中设定的 TLS 参数

 

SSLContextParameters

useGlobalSslContextParameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

basicPropertyBinding (advanced)

组件是否应使用基本的属性绑定(Camel 2.x)或较新的属性绑定额外功能

false

布尔值

lazyStartProducer (producer)

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

REST OpenApi 端点使用 URI 语法配置:

rest-openapi:specificationUri#operationId

使用以下路径和查询参数:

278.1. 路径名(2 参数):

名称描述默认类型

specificationUri

OpenApi 规格文件的路径。这个规格中采用主机基本路径,但可以使用组件或端点级别的属性覆盖它们。如果没有给定组件尝试从 classpath 加载 openapi.json 资源。请注意,在组件和端点中定义的主机应该包含 URI 语法(例如 http://api.example.com:8080)中的方案、主机名和端口的可选端口。覆盖组件配置。OpenApi 规格可以通过前缀 file: classpath: http: https 从不同的源加载。对 https 的支持仅限于使用 JDK 安装的 UrlHandler,因此可为 https 设置 TLS/SSL 证书(如设置多个 javax.net.ssl JVM 系统属性)可能比较繁琐。如何参考 JDK 文档获取 UrlHandler。

openapi.json

URI

operationId

OpenApi 规范中操作所需的 ID。

 

字符串

278.2. 查询参数(8 参数):

名称描述默认类型

basePath (producer)

API basePath,如 /v2。默认为 unset,如果设置会覆盖 OpenApi 规格和组件配置中的值。

 

字符串

componentName (producer)

将执行请求的 Camel 组件的名称。组件必须存在于 Camel 注册表中,并且必须实施 RestProducerFactory 服务提供商接口。如果没有设置 CLASSPATH,则会搜索实现 RestProducerFactory SPI 的单个组件。覆盖组件配置。

 

字符串

consumes (producer)

此组件可以消耗的有效负载类型。根据 RFC7231,可以是 type,如 application/json 或多个类型作为 application/json、application/xml; q=0.5。这等同于 Accept HTTP 标头的值。如果 set 覆盖 OpenApi 规格和组件配置中的任何值。

 

字符串

host (producer)

方案主机名和端口以 https://hostname:port 的形式将 HTTP 请求定向到。可以在端点、组件或在 Camel 上下文中对应的 REST 配置中进行配置。如果您为这个组件指定一个名称(如 petstore),则首先会参考 REST 配置、下一个 rest-openapi 下一个和全局配置。如果设置覆盖 OpenApi 规格, RestConfiguration 中的任何值。覆盖所有其他配置。

 

字符串

lazyStartProducer (producer)

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

produces (producer)

生成此组件的有效负载类型。例如,根据 RFC7231 的 application/json 示例。这等同于 Content-Type HTTP 标头的值。如果 set 覆盖 OpenApi 规格中存在的任何值。覆盖所有其他配置。

 

字符串

basicPropertyBinding (advanced)

端点是否应使用基本的属性绑定(Camel 2.x),或者较新的属性绑定额外功能

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

第 279 章 Spring Boot Auto-Configuration

在使用 Spring Boot 时,请确保使用以下 Maven 依赖项来支持自动配置:

<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-rest-openapi-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.component.rest-openapi.base-path

API basePath,如 /v2。默认为 unset,如果设置会覆盖 OpenApi 规格中存在的值。

 

字符串

camel.component.rest-openapi.basic-property-binding

组件是否应使用基本的属性绑定(Camel 2.x)或较新的属性绑定额外功能

false

布尔值

camel.component.rest-openapi.bridge-error-handler

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

camel.component.rest-openapi.component-name

将执行请求的 Camel 组件的名称。组件必须存在于 Camel 注册表中,并且必须实施 RestProducerFactory 服务提供商接口。如果没有设置 CLASSPATH,则会搜索实现 RestProducerFactory SPI 的单个组件。可以在端点配置中覆盖。

 

字符串

camel.component.rest-openapi.consumes

此组件可以消耗的有效负载类型。根据 RFC7231,可以是 type,如 application/json 或多个类型作为 application/json、application/xml; q=0.5。这等同于 Accept HTTP 标头的值。如果设置覆盖 OpenApi 规格中找到的任何值。可以在端点配置中覆盖

 

字符串

camel.component.rest-openapi.enabled

是否启用 rest-openapi 组件的自动配置。默认启用。

 

布尔值

camel.component.rest-openapi.host

方案主机名和端口以 https://hostname:port 的形式将 HTTP 请求定向到。可以在端点、组件或在 Camel 上下文中对应的 REST 配置中进行配置。如果您为这个组件指定一个名称(如 petstore),则首先会参考 REST 配置、下一个 rest-openapi 下一个和全局配置。如果设置覆盖 OpenApi 规格, RestConfiguration 中的任何值。可以在端点配置中覆盖。

 

字符串

camel.component.rest-openapi.lazy-start-producer

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

camel.component.rest-openapi.produces

生成此组件的有效负载类型。例如,根据 RFC7231 的 application/json 示例。这等同于 Content-Type HTTP 标头的值。如果 set 覆盖 OpenApi 规格中存在的任何值。可以在端点配置中覆盖。

 

字符串

camel.component.rest-openapi.specification-uri

OpenApi 规格文件的路径。这个规格中采用主机基本路径,但可以使用组件或端点级别的属性覆盖它们。如果未指定组件,则组件会尝试加载 openapi.json 资源。请注意,在组件和端点中定义的主机应该包含 URI 语法(例如 https://api.example.com:8080)中的方案、主机名和端口的可选端口。可以在端点配置中覆盖。

 

URI

camel.component.rest-openapi.ssl-context-parameters

自定义组件使用的 TLS 参数。如果没有设置,则默认为 Camel 上下文中设置的 TLS 参数。选项是一个 org.apache.camel.support.jsse.SSLContextParameters 类型。

 

字符串

camel.component.rest-openapi.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

第 280 章 示例: PetStore

在 example 目录中的 camel-example-rest-openapi 项目中签出 示例

例如,如果您使用 PetStore 提供的 REST API 只引用 OpenApi 规格中的规范 URI 和所需的操作 ID,或者下载规格并将其作为 openapi.json (在 root 用户)的 CLASSPATH 的形式被自动使用。我们使用 Undertow 组件对 Spring Boot 执行所有请求和 Camel 体验支持。

以下是在 Maven POM 文件中定义的依赖关系:

<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-undertow-starter</artifactId>
</dependency>

<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-rest-openapi-starter</artifactId>
</dependency>

首先定义 Undertow 组件和 RestOpenApiComponent

@Bean
public Component petstore(CamelContext camelContext, UndertowComponent undertow) {
    RestOpenApiComponent petstore = new RestOpenApiComponent(camelContext);
    petstore.setSpecificationUri("https://petstore3.swagger.io/api/v3/openapi.json");
    petstore.setDelegate(undertow);

    return petstore;
}
注意

对 Spring Boot 的 Camel 的支持将自动创建 UndertowComponent Spring bean,您可以使用带有前缀 camel.component.undertow 的 application.properties (或 application.yml )进行配置。这里定义了 petstore 组件,以便在 Camel 上下文中有一个指定组件,以便我们可以用来与 PetStore REST API 交互,只要 这是我们 以相同方式配置它(使用 application.properties)。

现在,在我们的应用程序中,我们只需使用 ProducerTemplate 调用 PetStore REST 方法:

@Autowired
ProducerTemplate template;

String getPetJsonById(int petId) {
    return template.requestBodyAndHeaders("petstore:getPetById", null, "petId", petId);
}

第 281 章 REST Swagger 组件

作为 Camel 版本 2.19 可用

rest-swagger 配置 Swagger (Open API)规范文档中的其他制作者,并委派给实施 RestProducerFactory 接口的组件。当前已知的组件是:

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-rest-swagger</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

281.1. URI 格式

rest-swagger:[specificationPath#]operationId

其中 operationId 是 Swagger 规格中的操作 ID,并且 specificationPath 是规格的路径。如果没有指定 specificationPath,则默认为 swagger.json。查找机制使用 Camels ResourceHelper 来加载资源,这意味着您可以使用 CLASSPATH 资源(classpath:my-specification.json)、文件(/some/path.json)、Web (http://api.example.com/swagger.json)或引用 bean (ref:nameOfBean)或使用 abean (an:name:OfBean)的方法。 如果 Swagger 自己的资源加载支持失败。

此组件不充当 HTTP 客户端,它将委托给上述其他组件。查找机制会搜索实现 RestProducerFactory 接口并使用该界面的单个组件。如果 CLASSPATH包含多个,则应该设置属性 componentName 来指明要委托哪个组件。

大多数配置从 Swagger 规格中获取,但该选项存在,可以通过在组件或端点中指定它们来覆盖它们。通常,如果与规格不同,您只需覆盖 主机或 basePath

注意

host 参数应包含包括方案、主机名和端口号的绝对 URI,例如 :https://api.example.com

使用 componentName 指定用于执行请求的组件,这需要在 Camel 上下文中显示此指定组件,并实施所需的 RestProducerFactory interface©-OPTSas 执行顶部列出的组件。

如果您没有在组件或端点级别上指定 componentName,则会搜索 CLASSPATH 以获取合适的委派。CLASSPATH 中应只有一个组件,它实施 RestProducerFactory 接口才能正常工作。

此组件的端点 URI 是很方便的,这意味着除了消息标头外,除了消息标头外,您还可以将 REST 操作的参数指定为端点参数,这样这样才能对后续调用(如 /api/7.10/users/{id} )进行持续使用这个功能。

281.2. 选项

REST Swagger 组件支持 9 个选项,它们如下所列。

名称描述默认类型

basePath (producer)

API basePath,如 /v2。默认为 unset,如果设置会覆盖 Swagger 规格中的值。

 

字符串

componentName (producer)

将执行请求的 Camel 组件的名称。Camel 注册表中必须包括 compnent,它必须实施 RestProducerFactory 服务提供程序接口。如果没有设置 CLASSPATH,则会搜索实现 RestProducerFactory SPI 的单个组件。可以在端点配置中覆盖。

 

字符串

consumes (producer)

此组件可以消耗的有效负载类型。根据 RFC7231,可以是 type,如 application/json 或多个类型作为 application/json、application/xml; q=0.5。这等同于 Accept HTTP 标头的值。如果设置覆盖 Swagger 规格中找到的任何值。可以在端点配置中覆盖

 

字符串

host (producer)

方案主机名和端口以 https://hostname:port 的形式将 HTTP 请求定向到。可以在 端点、组件或在 Camel 上下文中配置 REST 配置。如果您为这个组件指定一个名称(例如,Ppetstore),则首先会参考 REST 配置、下一个 rest-swagger 下一个和全局配置。如果设置覆盖 Swagger 规格, RestConfiguration 中的任何值。可以在端点配置中覆盖。

 

字符串

produces (producer)

生成此组件的有效负载类型。例如,根据 RFC7231 的 application/json 示例。这等同于 Content-Type HTTP 标头的值。如果设置覆盖 Swagger 规格中存在的任何值。可以在端点配置中覆盖。

 

字符串

specificationUri (producer)

Swagger 规格文件的路径。这个规格中采用主机基本路径,但可以使用组件或端点级别的属性覆盖它们。如果未指定组件,则组件会尝试加载 swagger.json 资源。请注意,在组件和端点中定义的主机应包含 URI 语法(例如 https://api.example.com:8080)中的方案、主机名和端口的可选端口。可以在端点配置中覆盖。

swagger.json

URI

sslContextParameters (security)

自定义组件使用的 TLS 参数。如果没有设置,则默认为 Camel 上下文中设定的 TLS 参数

 

SSLContextParameters

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

REST Swagger 端点使用 URI 语法进行配置:

rest-swagger:specificationUri#operationId

使用以下路径和查询参数:

281.2.1. 路径名(2 参数):

名称描述默认类型

specificationUri

Swagger 规格文件的路径。这个规格中采用主机基本路径,但可以使用组件或端点级别的属性覆盖它们。如果未指定组件,则组件会尝试加载 swagger.json 资源。请注意,在组件和端点中定义的主机应包含 URI 语法(例如 https://api.example.com:8080)中的方案、主机名和端口的可选端口。覆盖组件配置。

swagger.json

URI

operationId

Swagger 规格中操作所需的 ID。

 

字符串

281.2.2. 查询参数(6 参数):

名称描述默认类型

basePath (producer)

API basePath,如 /v2。默认为 unset,如果设置会覆盖 Swagger 规格和组件配置中的值。

 

字符串

componentName (producer)

将执行请求的 Camel 组件的名称。Camel 注册表中必须包括 compnent,它必须实施 RestProducerFactory 服务提供程序接口。如果没有设置 CLASSPATH,则会搜索实现 RestProducerFactory SPI 的单个组件。覆盖组件配置。

 

字符串

consumes (producer)

此组件可以消耗的有效负载类型。根据 RFC7231,可以是 type,如 application/json 或多个类型作为 application/json、application/xml; q=0.5。这等同于 Accept HTTP 标头的值。如果 set 覆盖 Swagger 规格和组件配置中的任何值。

 

字符串

host (producer)

方案主机名和端口以 https://hostname:port 的形式将 HTTP 请求定向到。可以在 端点、组件或在 Camel 上下文中配置 REST 配置。如果您为这个组件指定一个名称(例如,Ppetstore),则首先会参考 REST 配置、下一个 rest-swagger 下一个和全局配置。如果设置覆盖 Swagger 规格, RestConfiguration 中的任何值。覆盖所有其他配置。

 

字符串

produces (producer)

生成此组件的有效负载类型。例如,根据 RFC7231 的 application/json 示例。这等同于 Content-Type HTTP 标头的值。如果设置覆盖 Swagger 规格中存在的任何值。覆盖所有其他配置。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

281.3. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.rest-swagger.base-path

API basePath,如 /v2。默认为 unset,如果设置会覆盖 Swagger 规格中的值。

 

字符串

camel.component.rest-swagger.component-name

将执行请求的 Camel 组件的名称。Camel 注册表中必须包括 compnent,它必须实施 RestProducerFactory 服务提供程序接口。如果没有设置 CLASSPATH,则会搜索实现 RestProducerFactory SPI 的单个组件。可以在端点配置中覆盖。

 

字符串

camel.component.rest-swagger.consumes

此组件可以消耗的有效负载类型。根据 RFC7231,可以是 type,如 application/json 或多个类型作为 application/json、application/xml; q=0.5。这等同于 Accept HTTP 标头的值。如果设置覆盖 Swagger 规格中找到的任何值。可以在端点配置中覆盖

 

字符串

camel.component.rest-swagger.enabled

启用 rest-swagger 组件

true

布尔值

camel.component.rest-swagger.host

方案主机名和端口以 https://hostname:port 的形式将 HTTP 请求定向到。可以在 端点、组件或在 Camel 上下文中配置 REST 配置。如果您为这个组件指定一个名称(例如,Ppetstore),则首先会参考 REST 配置、下一个 rest-swagger 下一个和全局配置。如果设置覆盖 Swagger 规格, RestConfiguration 中的任何值。可以在端点配置中覆盖。

 

字符串

camel.component.rest-swagger.produces

生成此组件的有效负载类型。例如,根据 RFC7231 的 application/json 示例。这等同于 Content-Type HTTP 标头的值。如果设置覆盖 Swagger 规格中存在的任何值。可以在端点配置中覆盖。

 

字符串

camel.component.rest-swagger.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.rest-swagger.specification-uri

Swagger 规格文件的路径。这个规格中采用主机基本路径,但可以使用组件或端点级别的属性覆盖它们。如果未指定组件,则组件会尝试加载 swagger.json 资源。请注意,在组件和端点中定义的主机应包含 URI 语法(例如 https://api.example.com:8080)中的方案、主机名和端口的可选端口。可以在端点配置中覆盖。

 

URI

camel.component.rest-swagger.ssl-context-parameters

自定义组件使用的 TLS 参数。如果没有设置,则默认为 Camel 上下文中设置的 TLS 参数。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.rest-swagger.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

281.4. 示例: PetStore

在 example 目录中,签出 camel-example-rest-swagger 项目中的 示例

例如,如果您使用 PetStore 提供的 REST API 只引用 Swagger 规格中的规范 URI 和所需的操作 ID,或者下载规格并将其作为 swagger.json (在 root 中)进行自动使用。我们使用 undertow 组件对 Spring Boot 执行所有请求和 Camel 体验支持。

以下是在 Maven POM 文件中定义的依赖关系:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-undertow-starter</artifactId>
</dependency>

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-rest-swagger-starter</artifactId>
</dependency>

首先定义 Undertow 组件和 RestSwaggerComponent

@Bean
public Component petstore(CamelContext camelContext, UndertowComponent undertow) {
    RestSwaggerComponent petstore = new RestSwaggerComponent(camelContext);
    petstore.setSpecificationUri("http://petstore.swagger.io/v2/swagger.json");
    petstore.setDelegate(undertow);

    return petstore;
}
注意

对 Spring Boot 的 Camel 的支持将自动创建 UndertowComponent Spring bean,您可以使用带有前缀 camel.component.undertow 的 application.properties (或 application.yml )进行配置。这里定义了 petstore 组件,以便在 Camel 上下文中有一个指定组件,以便我们可以用来与 PetStore REST API 交互,只要 这是我们 以相同方式配置它(使用 application.properties)。

现在,在我们的应用程序中,我们只需使用 ProducerTemplate 调用 PetStore REST 方法:

@Autowired
ProducerTemplate template;

String getPetJsonById(int petId) {
    return template.requestBodyAndHeaders("petstore:getPetById", null, "petId", petId);
}

第 282 章 Restlet 组件

可作为 Camel 版本 2.0 提供

Restlet 组件提供基于 Restlet 的端点,以用于消耗和生成 RESTful 资源。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-restlet</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

另外,您需要在 pom.xml 文件中添加对 restlet maven 存储库的依赖:

<repository>
   <id>maven-restlet</id>
   <name>Public online Restlet repository</name>
   <url>https://maven.restlet.com</url>
</repository>

282.1. URI 格式

restlet:restletUrl[?options]

restletUrl 格式:

protocol://hostname[:port][/resourcePattern]

Restlet 可促进协议和应用程序问题的分离。Restlet Engine 的参考实施支持很多协议。但是,我们只测试了 HTTP 协议。默认端口为端口 80。我们还没有根据协议自动切换默认端口。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

 

INFO:在理解标头时,Restlet 似乎区分大小写。例如,要使用 content-type,请使用 Content-Type 和,使用 Location 等。

警告

我们收到有关 Camel 2.14.0 和 2.14.1 中 camel-restlet 的性能报告。我们已向 Restlet 团队报告了 问题 996。要更正这个问题,请从 Camel 2.14.2 开始,将 synchronous=true 设置为端点 uris 上的选项,Or 在 RestletComponent 作为全局选项上将其设置为全局选项,以便所有端点都继承这个选项。

282.2. 选项

Restlet 组件支持 23 个选项,它们如下所列。

名称描述默认类型

controllerDaemon (consumer)

指明控制器线程是否应该是守护进程(不阻止 JVM 退出)。

 

布尔值

controllerSleepTimeMs (consumer)

控制器线程在各个控制之间处于睡眠状态的时间。

 

整数

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

inboundBufferSize (consumer)

读取消息时缓冲的大小。

 

整数

maxConnectionsPerHost (common)

每个主机的最大并发连接数(IP 地址)。

 

整数

maxThreads (consumer)

服务请求的最大线程。

 

整数

lowThreads (consumer)

确定连接器何时被过载的 worker 线程数量。

 

整数

maxTotalConnections (common)

总计并发连接的最大数量。

 

整数

minThreads (consumer)

等待服务请求的最小线程。

 

整数

outboundBufferSize (consumer)

编写消息时缓冲区的大小。

 

整数

persistingConnections (consumer)

指明在调用后是否应保持连接。

 

布尔值

pipeliningConnections (consumer)

指明是否支持 pipelining 连接。

 

布尔值

threadMaxIdleTimeMs (consumer)

在收集之前,空闲线程等待某一操作的时间。

 

整数

useForwardedForHeader (consumer)

查找常见代理支持的 X-Forwarded-For 标头并使用它来填充 Request.getClientAddresses ()方法结果。此信息只对本地网络中的中间组件是安全的。通过设置虚拟标头而不应信任严重的安全检查,可以轻松地更改其他地址。

 

布尔值

reuseAddress (consumer)

启用/禁用 SO_REUSEADDR 套接字选项。如需了解更多详细信息,请参阅 java.io.ServerSocket#reuseAddress 属性。

 

布尔值

maxQueued (consumer)

如果没有可用于服务的任何 worker 线程,则最多可以排队的调用数。如果值为 '0',则不使用队列,如果没有 worker 线程立即可用,则拒绝调用。如果值为 '-1',则使用未绑定的队列,并且不会拒绝调用。

 

整数

disableStreamCache (consumer)

确定 Restlet 的原始输入流是否已缓存(Camel 将读取流到文件,流缓存)缓存。默认情况下,Camel 将缓存 Restlet 输入流,以支持多次读取,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。DefaultRestletBinding 将把请求输入流复制到流缓存中,如果这个选项为 false,则将请求输入流设置为消息正文,以便支持多次读取流。

false

布尔值

port (consumer)

为 restlet consumer 路由配置端口号。这允许配置这一次为这些消费者重复使用相同的端口。

 

int

synchronous (producer)

是否对制作者使用同步的 Restlet 客户端。将这个选项设置为 true 以获得更快的性能,因为它似乎 Restlet 同步客户端正常工作。

 

布尔值

enabledConverters (advanced)

用作完整类名称或简单类名称的转换器列表。如果为空或为空,则会自动注册所有转换器

 

list

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Restlet 端点使用 URI 语法配置:

restlet:protocol:host:port/uriPattern

使用以下路径和查询参数:

282.2.1. 路径名(4 参数):

名称描述默认类型

protocol

需要使用 该协议(http 或 https)

 

字符串

主机

所需的 restlet 服务的主机名

 

字符串

port

所需的 restlet 服务的端口号

80

int

uriPattern

资源模式,如 /customer/id

 

字符串

282.2.2. 查询参数(18 参数):

名称描述默认类型

restletMethod (common)

在制作者端点上,指定要使用的请求方法。在消费者端点上,指定端点仅消耗 restletMethod 请求。

GET

方法

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

restletMethods (consumer)

指定以逗号分开的一个或多个方法(例如 restletMethods=post,put),以便由 restlet 消费者端点提供服务。如果指定了 restletMethod 和 restletMethods 选项,则 restletMethod 设置将被忽略。可能的方法有: ALL,CONNECT,DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,TRACE

 

字符串

disableStreamCache (consumer)

确定 Restlet 的原始输入流是否已缓存(Camel 将读取流到文件,流缓存)缓存。默认情况下,Camel 将缓存 Restlet 输入流,以支持多次读取,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。DefaultRestletBinding 将把请求输入流复制到流缓存中,如果这个选项为 false,则将请求输入流设置为消息正文,以便支持多次读取流。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

restletUriPatterns (consumer)

弃用了 通过 restlet 消费者端点提供服务的一个或多个 URI 模板,使用 # 表示法来引用 Camel Registry 中的列表。如果在端点 URI 中定义了 URI 模式,那么端点中定义的 URI 模式和 restletUriPatterns 选项将被遵守。

 

list

connectTimeout (producer)

如果连接超时,则客户端将放弃连接,0 代表无限等待。

30000

int

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

socketTimeout (producer)

客户端套接字接收超时为 0 (无限等待)。

30000

int

throwExceptionOnFailure (producer)

是否在制作者失败时引发异常。如果这个选项为 false,则 http status code 被设置为 message 标头,如果它有错误值,则可以检查它。

true

布尔值

autoCloseStream (producer)

是否使用 restlet producer 调用 REST 服务,以自动关闭流表示。如果响应流流并且启用了选项 streamRepresentation,则您可能需要从流传输响应中自动关闭 InputStream,以确保在路由 Camel Exchange 完成后关闭输入流。但是,如果您需要读取 Camel 路由之外的流,您可能需要关闭流。

false

布尔值

streamRepresentation (producer)

是否使用 restlet producer 从调用 REST 服务时是否支持流表示。如果响应流化,则该选项可启用将 java.io.InputStream 用作 Camel 消息正文上的消息正文。如果使用这个选项,您可能需要启用 autoCloseStream 选项,确保在 Camel Exchange 进行路由时输入流关闭。但是,如果您需要读取 Camel 路由之外的流,您可能需要关闭流。

false

布尔值

headerFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

restletBinding (advanced)

使用自定义 RestletBinding 在 Restlet 和 Camel 消息之间进行绑定。

 

RestletBinding

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

restletRealm (security)

将 restlet 的安全域配置为映射:

 

map

sslContextParameters (security)

使用 SSLContextParameters 配置安全性。

 

SSLContextParameters

282.3. Spring Boot Auto-Configuration

组件支持 24 个选项,它们如下所列。

名称描述默认类型

camel.component.restlet.controller-daemon

指明控制器线程是否应该是守护进程(不阻止 JVM 退出)。

 

布尔值

camel.component.restlet.controller-sleep-time-ms

控制器线程在各个控制之间处于睡眠状态的时间。

 

整数

camel.component.restlet.disable-stream-cache

确定 Restlet 的原始输入流是否已缓存(Camel 将读取流到文件,流缓存)缓存。默认情况下,Camel 将缓存 Restlet 输入流,以支持多次读取,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。DefaultRestletBinding 将把请求输入流复制到流缓存中,如果这个选项为 false,则将请求输入流设置为消息正文,以便支持多次读取流。

false

布尔值

camel.component.restlet.enabled

启用 restlet 组件

true

布尔值

camel.component.restlet.enabled-converters

用作完整类名称或简单类名称的转换器列表。如果为空或为空,则会自动注册所有转换器

 

list

camel.component.restlet.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.restlet.inbound-buffer-size

读取消息时缓冲的大小。

 

整数

camel.component.restlet.low-threads

确定连接器何时被过载的 worker 线程数量。

 

整数

camel.component.restlet.max-connections-per-host

每个主机的最大并发连接数(IP 地址)。

 

整数

camel.component.restlet.max-queued

如果没有可用于服务的任何 worker 线程,则最多可以排队的调用数。如果值为 '0',则不使用队列,如果没有 worker 线程立即可用,则拒绝调用。如果值为 '-1',则使用未绑定的队列,并且不会拒绝调用。

 

整数

camel.component.restlet.max-threads

服务请求的最大线程。

 

整数

camel.component.restlet.max-total-connections

总计并发连接的最大数量。

 

整数

camel.component.restlet.min-threads

等待服务请求的最小线程。

 

整数

camel.component.restlet.outbound-buffer-size

编写消息时缓冲区的大小。

 

整数

camel.component.restlet.persisting-connections

指明在调用后是否应保持连接。

 

布尔值

camel.component.restlet.pipelining-connections

指明是否支持 pipelining 连接。

 

布尔值

camel.component.restlet.port

为 restlet consumer 路由配置端口号。这允许配置这一次为这些消费者重复使用相同的端口。

 

整数

camel.component.restlet.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.restlet.reuse-address

启用/禁用 SO_REUSEADDR 套接字选项。如需了解更多详细信息,请参阅 java.io.ServerSocket#reuseAddress 属性。

 

布尔值

camel.component.restlet.ssl-context-parameters

使用 SSLContextParameters 配置安全性。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.restlet.synchronous

是否对制作者使用同步的 Restlet 客户端。将这个选项设置为 true 以获得更快的性能,因为它似乎 Restlet 同步客户端正常工作。

 

布尔值

camel.component.restlet.thread-max-idle-time-ms

在收集之前,空闲线程等待某一操作的时间。

 

整数

camel.component.restlet.use-forwarded-for-header

查找常见代理支持的 X-Forwarded-For 标头并使用它来填充 Request.getClientAddresses ()方法结果。此信息只对本地网络中的中间组件是安全的。通过设置虚拟标头而不应信任严重的安全检查,可以轻松地更改其他地址。

 

布尔值

camel.component.restlet.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

282.4. 消息标头

名称类型描述

Content-Type

字符串

指定内容类型,可在应用程序/处理器的 OUT 消息上设置。值是响应消息的 内容类型。如果没有设置此标头,则内容类型基于 OUT 消息正文的对象类型。在 Camel 2.3 onward 中,如果在 Camel IN 消息中指定 Content-Type 标头,标头的值决定了 Restlet 请求消息的内容类型。   否则,它默认为 "application/x-www-form-urlencoded'。在版本 2.3 之前,无法更改请求内容类型 default。

CamelAcceptContentType

字符串

Camel 2.9.3, 2.10.0 开始: HTTP Accept 请求标头。

CamelHttpMethod

字符串

HTTP 请求方法。这在 IN 消息标头中设置。

CamelHttpQuery

字符串

请求 URI 的查询字符串。当 restlet 组件收到请求时,它由 DefaultRestletBinding 在 IN 消息上设置。

CamelHttpResponseCode

字符串Integer

响应代码可由应用程序/处理器在 OUT 消息上设置。值是响应消息的响应代码。如果没有设置此标头,则响应代码由 restlet 运行时引擎设置。

CamelHttpUri

字符串

HTTP 请求 URI。这在 IN 消息标头中设置。

CamelRestletLogin

字符串

基本身份验证的登录名。它由应用程序在 IN 消息上设置,并在 Camel 的 restlet 请求标头之前过滤。

CamelRestletPassword

字符串

用于基本身份验证的密码名称。它由应用程序在 IN 消息上设置,并在 Camel 的 restlet 请求标头之前过滤。

CamelRestletRequest

Request(请求)

Camel 2.8: 保存所有请求详细信息的 org.restlet.Request 对象。

CamelRestletResponse

响应

Camel 2.8: org.restlet.Response 对象。您可以使用它来从 Restlet 使用 API 创建响应。请参见以下示例。

org.restlet.*

 

传播到 Camel IN 标头的 Restlet 消息的属性。

cache-control

字符串List<CacheDirective>

Camel 2.11: 用户可以通过 camel 消息标头中的 String 值或 CacheDirective of Restlet 列表设置 cache-control。

282.5. Message Body

Camel 会将外部服务器的 restlet 响应存储在 OUT 正文中。来自 IN 消息的所有标头都将被复制到 OUT 消息,以便在路由过程中保留该标头。

282.6. Samples

282.6.1. 带有身份验证的 Restlet 端点

以下路由启动一个 restlet 消费者端点,用于侦听 http://localhost:8080 上的 POST 请求。处理器创建一个回复来回显请求正文和 id 标头的值。

URI 查询中的 restletRealm 设置用于在 registry 中查找 Realm Map。如果指定了这个选项,则 restlet 使用者使用信息来验证用户登录。只有 经过身份验证的用户可以访问 资源。在本例中,我们创建一个作为 registry 的 Spring 应用程序上下文。Realm Map 的 bean ID 应该与 restletRealmRef 匹配。

以下示例启动一个 直接 端点,该端点将请求发送到 http://localhost:8080 上的服务器(即我们剩余的消费者端点)。

这正是我们需要的。我们已准备好发送请求并尝试其余组件:

示例客户端使用以下标头向 direct:start-auth 端点发送请求:

  • CamelRestletLogin (由 Camel 内部使用)
  • CamelRestletPassword (由 Camel 内部使用)
  • ID (应用程序标头)
注意

org.apache.camel.restlet.auth.loginorg.apache.camel.restlet.auth.password 不会作为 Restlet 标头传播。

示例客户端获取类似如下的响应:

received [<order foo='1'/>] as an order id = 89531

282.6.2. 单个 restlet 端点服务多种方法和 URI 模板(已弃用)

这个功能 已弃用,因此不要使用!

可使用 restletMethods 选项创建指向多个 HTTP 方法的单一路由。此片断还演示了如何从标头检索请求方法:

除了提供多种方法外,下一个代码片段还演示了如何使用 restletUriPatterns 选项创建一个支持多个 URI 模板的端点。请求 URI 也位于 IN 消息的标头中。如果在端点 URI 中定义了 URI (本例中为如此),那么端点中定义的 URI 模式和 restletUriPatterns 选项将被遵守。

restletUriPatterns=#uriTemplates 选项引用 Spring XML 配置中定义的 List<String > bean。

<util:list id="uriTemplates">
    <value>/users/{username}</value>
    <value>/atom/collection/{id}/component/{cid}</value>
</util:list>

282.6.3. 使用 Restlet API 填充响应

可从 Camel 2.8 开始

您可能希望使用 org.restlet.Response API 来填充响应。这可让您完全访问 Restlet API,并对响应进行精细的控制。请参阅下面的路由片段,其中从内联 Camel 处理器生成响应:

使用 Restlet Response API 生成响应

282.6.4. 在组件上配置最大线程数

要配置最大线程选项,您必须在组件中执行此操作,例如:

<bean id="restlet" class="org.apache.camel.component.restlet.RestletComponent">
  <property name="maxThreads" value="100"/>
</bean>

282.6.5. 在 webapp 中使用 Restlet servlet

根据 Camel 2.8
三种方式,可以在 servlet 容器中配置 Restlet 应用程序,并使用子类 SpringServerServlet 通过注入 Restlet 组件来启用 Camel 中的配置。

在 servlet 容器中使用 Restlet servlet 可让路由配置 URI 中的相对路径(删除硬编码的绝对 URI 的限制),以及用于托管 servlet 容器来处理传入请求(而不是在新端口上生成单独的服务器进程)。

前提条件

  • 您需要在 Maven pom.xml 文件中的 restlet 中添加对 Spring 扩展的依赖项:

    <dependency>
      <groupId>org.restlet.jee</groupId>
      <artifactId>org.restlet.ext.spring</artifactId>
      <version>${restlet-version}</version>
    </dependency>

流程

  1. 要配置 Restlet 应用,请在您的 camel-context.xml 中添加以下内容:

    <camelContext>
      <route id="RS_RestletDemo">
        <from uri="restlet:/demo/{id}" />
        <transform>
          <simple>Request type : ${header.CamelHttpMethod} and ID : ${header.id}</simple>
        </transform>
      </route>
    </camelContext>
    
    <bean id="RestletComponent" class="org.restlet.Component" />
    
    <bean id="RestletComponentService" class="org.apache.camel.component.restlet.RestletComponent">
      <constructor-arg index="0">
        <ref bean="RestletComponent" />
      </constructor-arg>
    </bean>
  2. 将以下内容添加到 web.xml; 中 ;

    <!-- Restlet Servlet -->
    <servlet>
      <servlet-name>RestletServlet</servlet-name>
      <servlet-class>org.restlet.ext.spring.SpringServerServlet</servlet-class>
      <init-param>
        <param-name>org.restlet.component</param-name>
        <param-value>RestletComponent</param-value>
      </init-param>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>RestletServlet</servlet-name>
      <url-pattern>/rs/*</url-pattern>
    </servlet-mapping>

结果

您可以在 http://localhost:8080/mywebapp/rs/demo/1234 中访问部署的路由,其中 localhost:8080 是 servlet 容器的服务器和端口,mywebapp 是部署的 webapp 的名称。

您的浏览器将显示以下内容:

"Request type : GET and ID : 1234"

第 283 章 Ribbon 组件

作为 Camel 2.18 版提供

ribbon 组件提供对客户端侧负载平衡的 Netflix Ribbon 使用。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ribbon</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

当使用 ServiceCall EIP 时,这个组件有助于在客户端中应用负载平衡功能。

283.1. 配置

  • Programmatic

    RibbonConfiguration configuration = new RibbonConfiguration();
    configuration.addProperties("ServerListRefreshInterval", "250");
    
    RibbonLoadBalancer loadBalancer = new RibbonLoadBalancer(configuration);
    
    from("direct:start")
        .serviceCall()
            .name("myService")
            .loadBalancer(loadBalancer)
            .consulServiceDiscovery()
            .end()
        .to("mock:result");
  • Spring Boot

    application.properties

    camel.cloud.ribbon.properties[ServerListRefreshInterval] = 250

    Routes

    from("direct:start")
        .serviceCall()
            .name("myService")
            .ribbonLoadBalancer()
            .consulServiceDiscovery()
            .end()
        .to("mock:result");

  • XML

    <route>
        <from uri="direct:start"/>
        <serviceCall name="myService">
            <!-- enable ribbon load balancer -->
            <ribbonLoadBalancer>
                <properties key="ServerListRefreshInterval" value="250"/>
            </ribbonLoadBalancer>
        </serviceCall>
    </route>

283.2. 另请参阅

第 284 章 RMI 组件

作为 Camel 版本 1.0 可用

rmi: 组件将交换绑定到 RMI 协议(JRMP)。

由于此绑定仅使用 RMI,因此正常的 RMI 规则仍适用于可以调用的方法。此组件只支持从扩展 远程 接口的接口执行方法调用的 Exchange。方法中的所有参数都应是 SerializableRemote 对象。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-rmi</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

284.1. URI 格式

rmi://rmi-regisitry-host:rmi-registry-port/registry-path[?options]

例如:

rmi://localhost:1099/path/to/service

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

284.2. 选项

RMI 组件没有选项。

RMI 端点使用 URI 语法配置:

rmi:hostname:port/name

使用以下路径和查询参数:

284.2.1. 路径名(3 参数):

名称描述默认类型

hostname

RMI 服务器的主机名

localhost

字符串

name

绑定到 RMI 服务器的 所需 名称

 

字符串

port

RMI 服务器的端口号

1099

int

284.2.2. 查询参数(6 参数):

名称描述默认类型

方法 (通用)

您可以设置要调用的方法的名称。

 

字符串

remoteInterfaces (common)

远程接口。

 

list

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

284.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.rmi.enabled

启用 rmi 组件

true

布尔值

camel.component.rmi.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

284.4. 使用

要调用在 RMI registry 中注册的现有 RMI 服务,请创建一个类似如下的路由:

from("pojo:foo").to("rmi://localhost:1099/foo");

要在 RMI registry 中绑定现有 camel 处理器或服务,请按如下所示定义 RMI 端点:

RmiEndpoint endpoint= (RmiEndpoint) endpoint("rmi://localhost:1099/bar");
endpoint.setRemoteInterfaces(ISay.class);
from(endpoint).to("pojo:bar");

请注意,当绑定 RMI 消费者端点时,您必须指定公开的 远程 接口。

在 XML DSL 中,您可以从 Camel 2.7 开始操作:

    <camel:route>
        <from uri="rmi://localhost:37541/helloServiceBean?remoteInterfaces=org.apache.camel.example.osgi.HelloService"/>
        <to uri="bean:helloServiceBean"/>
    </camel:route>

284.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 285 章 RouteBox 组件(已弃用)

可作为 Camel 版本 2.6 提供。

Routebox 的变化

routebox 组件支持创建提供封装的专用端点,以及基于策略间接服务的集合到由自动创建或注入的 camel 上下文托管的 camel 路由的集合。

Routebox 端点是 camel 端点,可以直接在 camel 路由上调用。routebox 端点执行以下关键功能

  • 封装 - 充当黑盒,托管存储在内部的 camel 上下文中的 camel 路由。内部上下文完全受路由box组件的控制,并且 JVM 绑定
  • 基于策略的间接 - 根据用户定义的内部路由策略或发送映射,将发送到路由程序端点的直接有效负载以及发送到特定内部路由路由的路由。
  • Exchange propagation - 将路由box 端点修改的交换与 camel 路由的下一段进行转发。

routebox 组件支持使用者和制作者端点。

制作者端点有两种类型

  • 将传入请求发送到外部路由box 消费者端点的生产者
  • 直接调用内部嵌入式 camel 上下文中路由的生产者不会向外部使用者发送请求。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-routebox</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

285.1. Camel Routebox 端点的需求

routebox 组件旨在简化需要复杂环境中的集成

  • 大量路由和
  • 涉及广泛的端点技术需要以不同的方式集成

在这种环境中,通常需要通过创建分层路由有效整理到其中来制作集成解决方案

  • 细粒度或更高级别的路由 - 以内或较低级别的路由集公开为代表集成关注区域的 Routebox 端点。例如:
关注区域coarse grained Route 示例

部门重点

HR 路由、销售路由等

供应链和 B2B Focus

发运路由、填充路由、第三方服务等

技术重点

数据库路由、JMS 路由、调度的批处理路由等

  • 精细路由 - 执行单和特定业务和/或集成模式的路由。

然后,发送到合作路由上的 Routebox 端点的请求可以把请求委托给内部精细的路由,以实现特定的集成目标,收集最终的内部结果,并继续在下一步中逐步推进到下一步骤。

285.2. URI 格式

routebox:routeboxname[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

285.3. 选项

RouteBox 组件没有选项。

RouteBox 端点使用 URI 语法进行配置:

routebox:routeboxName

使用以下路径和查询参数:

285.3.1. 路径名(1 参数):

名称描述默认类型

routeboxName

routebox 必需 的逻辑名称(如队列名称)

 

字符串

285.3.2. 查询参数(17 参数):

名称描述默认类型

dispatchMap (common)

在 Camel Registry 中代表键的字符串,与 type HashMap 的对象值匹配。HashMap 键应包含字符串,可以与为交换标头 ROUTE_DISPATCH_KEY 的值匹配。HashMap 值应包含内部路由使用者 URI 应该定向到哪些请求。

 

map

dispatchStrategy (common)

要使用自定义 RouteboxDispatchStrategy,它允许使用自定义分配程序而不是默认值。

 

RouteboxDispatch Strategy

forkContext (common)

是否要分叉和创建新内部 CamelContext,而不是重复使用相同的 CamelContext。

true

布尔值

innerProtocol (common)

该协议由 Routebox 组件内部使用。可以是直接或 SEDA。Routebox 组件目前提供 JVM 绑定的协议。

direct

字符串

queueSize (common)

创建固定大小队列来接收请求。

 

int

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollInterval (consumer)

从 seda 轮询时使用的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

long

threads (consumer)

路由box 用于接收请求的线程数量。

20

int

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

connectionTimeout (producer)

发送消息时生产者使用的超时。

20000

long

sendToConsumer (producer)

指示 Producer 端点是否向外部路由box 使用者发送请求。如果设置为 false,则 Producer 创建一个嵌入式内部上下文,并在内部处理请求。

true

布尔值

innerContext (advanced)

在 Camel Registry 中代表键的字符串,与 type org.apache.camel.CamelContext 的对象值匹配。如果 CamelContext 没有由用户提供,则会自动创建 CamelContext 以部署内部路由。

 

CamelContext

innerProducerTemplate (advanced)

内部嵌入的 CamelContext 要使用的 ProducerTemplate

 

ProducerTemplate

innerRegistry (advanced)

将自定义注册表用于内部嵌入式 CamelContext。

 

Registry

routeBuilders (advanced)

代表 Camel Registry 中键与类型列表的对象值匹配的字符串。如果用户没有提供内部路由的内部Context,则路由Builders 选项必须作为包含内部路由的非空列表提供。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

285.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.routebox.enabled

启用 routebox 组件

true

布尔值

camel.component.routebox.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

285.5. 将消息发送到/从路由箱发送/接收消息

在发送请求前,需要通过将所需的 URI 参数加载到 registry 中来正确配置路由程序,如下所示。如果是 Spring,如果正确声明了必要的 Bean,则 registry 由 Camel 自动填充。

285.5.1. 第 1 步:把内部路由详情加载到 registry 中

@Override
protected JndiRegistry createRegistry() throws Exception {
    JndiRegistry registry = new JndiRegistry(createJndiContext());

    // Wire the routeDefinitions & dispatchStrategy to the outer camelContext where the routebox is declared
    List<RouteBuilder> routes = new ArrayList<RouteBuilder>();
    routes.add(new SimpleRouteBuilder());
    registry.bind("registry", createInnerRegistry());
    registry.bind("routes", routes);

    // Wire a dispatch map to registry
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("addToCatalog", "seda:addToCatalog");
    map.put("findBook", "seda:findBook");
    registry.bind("map", map);

    // Alternatively wiring a dispatch strategy to the registry
    registry.bind("strategy", new SimpleRouteDispatchStrategy());

    return registry;
}

private JndiRegistry createInnerRegistry() throws Exception {
    JndiRegistry innerRegistry = new JndiRegistry(createJndiContext());
    BookCatalog catalogBean = new BookCatalog();
    innerRegistry.bind("library", catalogBean);

    return innerRegistry;
}
...
CamelContext context = new DefaultCamelContext(createRegistry());

285.5.2. 第 2 步:使用 Dispatch 策略而不是 Dispatch Map 的可选信息

使用分配策略涉及实施接口 org.apache.camel.component.routebox.strategy.RouteboxDispatchStrategy,如下例所示。

public class SimpleRouteDispatchStrategy implements RouteboxDispatchStrategy {

    /* (non-Javadoc)
     * @see org.apache.camel.component.routebox.strategy.RouteboxDispatchStrategy#selectDestinationUri(java.util.List, org.apache.camel.Exchange)
     */
    public URI selectDestinationUri(List<URI> activeDestinations,
            Exchange exchange) {
        URI dispatchDestination = null;

        String operation = exchange.getIn().getHeader("ROUTE_DISPATCH_KEY", String.class);
        for (URI destination : activeDestinations) {
            if (destination.toASCIIString().equalsIgnoreCase("seda:" + operation)) {
                dispatchDestination = destination;
                break;
            }
        }

        return dispatchDestination;
    }
}

285.5.3. 第 2 步:启动路由box消费者

在创建路由消费者时,请注意 routeboxUri 中的 # 条目与在 CamelContext Registry 中创建的内部 registry 中的 # 条目匹配,routebuilder 列表和分配Strategy/dispatchMap。请注意,所有路由builder 和相关路由都在内部上下文创建的 routebox 中启动

private String routeboxUri = "routebox:multipleRoutes?innerRegistry=#registry&routeBuilders=#routes&dispatchMap=#map";

public void testRouteboxRequests() throws Exception {
    CamelContext context = createCamelContext();
    template = new DefaultProducerTemplate(context);
    template.start();

    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from(routeboxUri)
                .to("log:Routes operation performed?showAll=true");
        }
    });
    context.start();

    // Now use the ProducerTemplate to send the request to the routebox
    template.requestBodyAndHeader(routeboxUri, book, "ROUTE_DISPATCH_KEY", "addToCatalog");
}

285.5.4. 步骤 3:使用 routebox producer

将请求发送到 routebox 时,生产者不需要知道内部路由端点 URI,它们只需通过发送策略或分配Map 来调用 Routebox URI 端点,如下所示

需要设置一个特殊的交换标头,名为 ROUTE_DISPATCH_KEY (为 Dispatch Strategy (可选)与分配映射中的键匹配的密钥,以便请求可以发送到正确的内部路由

from("direct:sendToStrategyBasedRoutebox")
    .to("routebox:multipleRoutes?innerRegistry=#registry&routeBuilders=#routes&dispatchStrategy=#strategy")
    .to("log:Routes operation performed?showAll=true");

from ("direct:sendToMapBasedRoutebox")
    .setHeader("ROUTE_DISPATCH_KEY", constant("addToCatalog"))
    .to("routebox:multipleRoutes?innerRegistry=#registry&routeBuilders=#routes&dispatchMap=#map")
    .to("log:Routes operation performed?showAll=true");

第 286 章 RSS 组件

可作为 Camel 版本 2.0 提供

rss: 组件用于轮询 RSS 源。Camel 默认每 60 秒轮询源。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-rss</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

注: 这些组件目前仅支持轮询(耗时)源。

注意

Camel-rss 内部使用由 ServiceMix 托管的 ROME 补丁版本来解决某些 OSGi 类加载问题http://svn.apache.org/repos/asf/servicemix/smx4/bundles/trunk/rome-1.0/

286.1. URI 格式

rss:rssUri

其中 rssUri 是要轮询的 RSS 源的 URI。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

286.2. 选项

RSS 组件没有选项。

RSS 端点使用 URI 语法配置:

rss:feedUri

使用以下路径和查询参数:

286.2.1. 路径名(1 参数):

名称描述默认类型

feedUri

需要 要轮询的源 URI。

 

字符串

286.2.2. 查询参数(27 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

feedHeader (consumer)

设置是否将 feed 对象添加为标头

true

布尔值

filter (consumer)

设定是否使用过滤,还是不是条目。

true

布尔值

lastUpdate (consumer)

设置用于从 atom feeds 过滤条目的时间戳。这个选项只与 splitEntries 结合使用。

 

Date

password (consumer)

设置 HTTP 源轮询时用于基本身份验证的密码

 

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

sortEntries (consumer)

设定是否按公布的日期对条目进行排序。仅在 splitEntries = true 时才起作用。

false

布尔值

splitEntries (consumer)

设置是否应单独发送条目,还是应将整个源作为单个消息发送

true

布尔值

throttleEntries (consumer)

设定是否应立即发送单一源轮询中的所有条目。如果为 true,则每个 consumer.delay 只处理一个条目。仅在 splitEntries = true 时才适用。

true

布尔值

username (consumer)

设置 HTTP 源轮询时用于基本身份验证的用户名

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

286.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.rss.enabled

启用 rss 组件

true

布尔值

camel.component.rss.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.dataformat.rss.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.rss.enabled

启用 rss 数据格式

true

布尔值

286.4. 交换数据类型

Camel 通过 ROME SyndFeed 在 Exchange 上初始化 In body。根据 splitEntries 标志的值,Camel 返回一个 SyndFeed,带有一个 SyndEntryjava.util.List of SyndEntrys

选项行为

splitEntries

true

在交换中设置来自当前源的单个条目。

splitEntries

false

交换中设置了来自当前源的整个条目列表。

286.5. 消息标头

标头描述

CamelRssFeed

整个 SyncFeed 对象。

286.6. RSS 数据格式

RSS 组件附带一个 RSS 数据格式,可用于在字符串(作为 XML)和 ROME RSS 模型对象之间转换。

  • marshal = 从 ROME SyndFeed 到 XML 字符串
  • unmarshal = 从 XML 字符串 到 ROME SyndFeed

使用 RSS 数据格式的路由将类似如下:( "rss:file:src/test/data/rss20.xml?splitEntries=false&consumer.delay=1000").marshal ().rss ().to ("mock:marshal");

这个功能的目的是,可以使用 Camel 的内置表达式来操作 RSS 信息。如下所示,可以使用 XPath 表达式来过滤 RSS 消息。在以下示例中,标题中带有 Camel 的条目将通过过滤器。

`from("rss:file:src/test/data/rss20.xml?splitEntries=true&consumer.delay=100").marshal().rss().filter().xpath("//item/title[contains(.,'Camel')]").to("mock:result");`
提示

查询参数 如果 RSS 源的 URL 使用查询参数,则此组件将解析它们。例如,如果源使用 alt=rss,则以下示例将得到解决: 来自("rss:http://someserver.com/feeds/posts/default?alt=rss&splitEntries=false&consumer.delay=1000").to"bean:rss");

286.7. 过滤条目

您可以使用 XPath 过滤掉条目,如上面的 data format 部分所示。您还可以利用 Camel 的 Bean 集成来实施自己的条件。例如,与以上 XPath 示例等效的过滤器是:

from ("rss:file:src/test/data/rss20.xml?splitEntries=true&consumer.delay=100"). filter ().method ("myFilterBean", "titleContainsCamel").to ("mock:result");

这个自定义 bean 将是:

public static class FilterBean {
       public boolean titleContainsCamel(@Body SyndFeed feed) {
           SyndEntry firstEntry = (SyndEntry) feed.getEntries().get(0);
return firstEntry.getTitle().contains("Camel");

286.8. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • Atom

第 287 章 RSS DataFormat

作为 Camel 版本 2.1 提供

RSS 组件附带一个 RSS 数据格式,可用于在字符串(作为 XML)和 ROME RSS 模型对象之间转换。

  • marshal = 从 ROME SyndFeed 到 XML 字符串
  • unmarshal = 从 XML 字符串 到 ROME SyndFeed

使用这个路由,如下所示:

这个功能的目的是为了能够使用 Camel 喜欢内置表达式来操作 RSS 信息。如下所示,可以使用 XPath 表达式来过滤 RSS 消息:

提示

查询参数 如果 RSS 源的 URL 使用查询参数,则此组件也会理解它们,例如,如果源使用 alt=rss,那么您可以将它们 从("rss:http://someserver.com/feeds/posts/default?alt=rss&splitEntries=false&consumer.delay=1000").to ("bean:rss";

287.1. 选项

RSS 数据格式支持 1 选项,它们如下所列。

名称默认Java 类型描述

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

287.2. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.rss.enabled

启用 rss 组件

true

布尔值

camel.component.rss.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.dataformat.rss.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.rss.enabled

启用 rss 数据格式

true

布尔值

ND

第 288 章 RxJava2 Component

可作为 Camel 版本 2.22 可用

RxJava2 基于 Camel 的被动流组件的后端。

请参阅 camel-streams-component 文档中的更多详情。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-rxjava2</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

第 289 章 Salesforce Component

作为 Camel 2.12 版本提供

此组件支持制作者和消费者端点,以便使用 Java DTOs 与 Salesforce 通信。
有一个生成这些 DTO 的 companion maven 插件 Camel Salesforce 插件(请参阅以下)。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-salesforce</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
注意

希望对组件贡献的开发人员按照关于如何启动和设置您的环境以运行集成测试的说明查看 README.md 文件。

289.1. 向 Salesforce 进行验证

组件支持三个 OAuth 身份验证流程:

对于每个流不同的属性集合,需要设置:

表 289.1. 为每个身份验证流设置的属性

属性在哪里可以在 Salesforce 上找到它

clientId

已连接的应用程序、消费者密钥

所有流

clientSecret

connected App、Consumer Secret

username-Password, Refresh Token

userName

Salesforce 用户用户名

username-Password、JWT Bearer Token

password

Salesforce 用户密码

username-Password

refreshToken

来自 OAuth 流回调

刷新令牌

keystore

连接的应用程序,数字证书

JWT Bearer 令牌

组件自动决定要配置哪些流,以消除模糊设置 authenticationType 属性。

注意

不建议在生产环境中使用 Username-Password 流。

注意

JWT Bearer Token Flow 中使用的证书可以是自签名证书。保存证书和私钥的 KeyStore 只能包含单个 certificate-private key 条目。

289.2. URI 格式

当用作消费者时,接收流事件时,URI 方案是:

salesforce:topic?options

当用作制作者时,调用 Salesforce RSET API 时,URI 方案为:

salesforce:operationName?options

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

289.3. 在 Salesforce 标头中传递并获取 Salesforce 响应标头

在 Camel 2.21 中支持通过入站 邮件标题传递 Salesforce 标头、以 Sforcex-sfdc 开头的标题名称,将在请求中传递 Camel 消息上的 Sforce 或 x-sfdc,并响应以 Sforce 开头的响应标头。

例如,若要获取 API 限制,您可以指定:

// in your Camel route set the header before Salesforce endpoint
//...
  .setHeader("Sforce-Limit-Info", constant("api-usage"))
  .to("salesforce:getGlobalObjects")
  .to(myProcessor);

// myProcessor will receive `Sforce-Limit-Info` header on the outbound
// message
class MyProcessor implements Processor {
    public void process(Exchange exchange) throws Exception {
        Message in = exchange.getIn();
        String apiLimits = in.getHeader("Sforce-Limit-Info", String.class);
   }
}

289.4. 支持的 Salesforce API

组件支持以下 Salesforce API

producer 端点可以使用以下 API:大多数 API 每次处理一个记录时,Query API 可以检索多个记录。

289.4.1. REST API

对于 operationName,您可以使用以下内容:

  • getVersions - Gets supported 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
  • 查询 - 运行 Salesforce SOQL 查询
  • 查询更多 - 使用从 'query' API 返回的结果链接返回的结果(如果是大量结果)
  • search - 运行 Salesforce SOSL 查询
  • limits - 获取机构 API 用量限制
  • recent - 获取最新项目
  • 批准 - 提交记录或记录(批处理)以提交批准过程
  • Approvals - 获取所有批准过程列表
  • 复合 - 提交至 25 个可能相关的 REST 请求并接收单个响应
  • 复合树 - 一次性创建 200 个记录,并附带父子关系(最多 5 个级别)
  • 复合 - 在批处理中提交请求组成
  • queryAll - 运行 SOQL 查询。它会返回因为合并或删除而被删除的结果。另外,还返回有关归档任务和事件记录的信息。
  • getBlobField - 从单独的记录中检索指定的 blob 字段。
  • apexCall - 执行用户定义的 APEX REST API 调用。

例如,以下制作者端点使用 upsertSObject API,sObjectIdName 参数指定 'Name' 作为外部 ID 字段。请求消息正文应该是使用 maven 插件生成的 SObject DTO。如果现有记录被更新,或者 CreateSObjectResult 带有新记录的 id,或者在创建新对象时出现错误列表,则响应消息将为空。

...to("salesforce:upsertSObject?sObjectIdName=Name")...

289.4.2. 批量 2.0 API

与原始 Bulk API 相比,Bulk 2.0 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 a job.jobId 参数是必需的。
  • bulk2DeleteJob - 删除作业。jobId 参数是必需的。
  • bulk2GetSuccessfulResults - 为作业获得成功结果。返回的消息正文将包含 CSV 数据的 InputStream。jobId 参数是必需的。
  • bulk2GetFailedResults - 获取作业失败的结果。返回的消息正文将包含 CSV 数据的 InputStream。jobId 参数是必需的。
  • bulk2GetUnprocessedRecords - 为某个作业获取未处理记录。返回的消息正文将包含 CSV 数据的 InputStream。jobId 参数是必需的。
  • bulk2GetAllJobs - 获取所有作业。响应正文是 作业 的实例。如果 done 属性为 false,则可使用额外的页面来获取,nextRecordsUrl 属性包含要在后续调用的 queryLocator 参数中设置的值。
  • bulk2CreateQueryJob - 创建批量查询作业。在邮件正文中提供 QueryJob 实例。
  • bulk2GetQueryJob - 获取批量查询作业。jobId 参数是必需的。
  • bulk2GetQueryJobResults - 获取批量查询作业结果。jobId 参数是必需的。
  • bulk2AbortQueryJob - Abort a bulk query job。jobId 参数是必需的。
  • bulk2DeleteQueryJob - 删除批量查询任务。jobId 参数是必需的。
  • bulk2GetAllQueryJobs - 获取所有作业。响应正文是 QueryJobs 的实例。如果 done 属性为 false,则可使用额外的页面来获取,nextRecordsUrl 属性包含要在后续调用的 queryLocator 参数中设置的值。

289.4.3. REST Bulk(原始)API

producer 端点可以使用以下 API:支持所有作业数据格式,如 xml、csv、zip/xml 和 zip/csv。
请求和响应必须被路由提取/清除。通常,请求会作为 CSV 文件等一些流源,
,响应也可以保存到要与请求关联的文件中。

对于 operationName,您可以使用以下内容:

  • CreateJob - 创建 Salesforce Bulk 作业
  • getJob - 使用其 Salesforce Id 获得一个作业
  • closeJob - Closes a Job
  • abortJob - Aborts a Job
  • createBatch - 在 Bulk Job 中提交 Batch
  • getBatch - 使用 Id 获得批处理
  • getAllBatches - 获取 Bulk Job Id 的所有批处理
  • getRequest - 获取批处理数据(XML/CSV)
  • getResults - 获取其完成后 Batch 的结果
  • createBatchQuery - 从 SOQL 查询创建一个 Batch
  • getQueryResultIds - 获取 Batch Query 的 Result Ids 列表
  • getQueryResult - 获取结果结果
  • getRecentReports - 通过向 Report List 资源发送 GET 请求,获取您最近的报告最多 200 份报告。
  • getReportDescription - Retrieves report、报告类型和报告相关元数据,可以是表格或概述或列表格式。
  • 执行SyncReport - 以同步或不更改过滤器运行报告并返回最新的摘要数据。
  • executeAsyncReport - 以异步或不带过滤器运行报告实例,并返回带有或不详情的摘要数据。
  • getReportInstances - 返回实例列表以获取您异步运行的报告。列表中的每个项目被视为报告的独立实例。
  • getReportResults:包含运行报告的结果。

例如,以下制作者端点使用 createBatch API 来创建作业批处理。中的消息必须包含可转换为 InputStream 的正文(通常是来自文件的 UTF-8 CSV 或 XML 内容),以及作业内容类型的作业和 'contentType' 的作业和 'contentType' 的标头字段,可以是 XML、CSV、ZIP_XML 或 ZIPIP_CSV。放置消息正文将包含在成功时的 BatchInfo,或者抛出 SalesforceException 错误。

...to("salesforce:createBatchJob")..

289.4.4. REST Streaming API

消费者端点可以使用以下 sytax 用于流端点,以在创建/更新时接收 Salesforce 通知。

创建并订阅一个主题

from("salesforce:CamelTestTopic?notifyForFields=ALL&notifyForOperations=ALL&sObjectName=Merchandise__c&updateTopic=true&sObjectQuery=SELECT Id, Name FROM Merchandise__c")...

要订阅现有主题

from("salesforce:CamelTestTopic&sObjectName=Merchandise__c")...

289.4.5. 平台事件

要发出平台事件,请使用 createSObject 操作。然后,设置消息正文可以是 JSON 字符串或 InputStream,它带有键-value datagradle-jaxbin,该 case sObjectName 需要设置为事件的 API 名称,或者一个从 AbstractDTOBase(带有适当类名称)的类(tag)来扩展事件的类。

例如,使用 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" + String.valueOf(in.getHeader(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" + String.valueOf(in.getHeader(Exchange.TIMER_COUNTER));
        in.setBody("{\"OrderNumber\":\"" + orderNumber + "\"}");
    })
    .to("salesforce:createSObject?sObjectName=Order_Event__e");

要接收平台事件,请使用带有 event/(或 / event/ )前缀为 platform 事件的API 名称,例如:ifcfg :events/Order_Event_e。从该端点使用的处理器将分别接收 org.apache.camel.component. Salesforce.api.dto.PlatformEvent 对象或 org.cometd.bayeux.Message (根据 rawPayloadfalsetrue )。

例如,使用最简单的形式来消耗一个事件:

PlatformEvent event = consumer.receiveBody("salesforce:event/Order_Event__e", PlatformEvent.class);

289.5. 例子

289.5.1. 将文档上传到内容工作空间

使用处理器实例在 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");

289.6. Using Salesforce Limits API

使用 salesforce:limits 操作,您可以从 Salesforce 获取 API 限制,然后针对收到的数据进行操作。salesforce:limits 操作的结果映射到 org.apache.camel.component.orderforce.api.dto.Limits 类,并可用于自定义处理器或表达式。

例如,您需要限制 Salesforce 的 API 使用,以便其他路由保留每日 API 请求 10%。输出消息正文包含一个 org.apache.camel.component. Salesforce.api.dto.Limits 对象,它们可与 Content Based Router 和 Content Based Router 和 Spring Expression Language(SpEL) 一同选择,可在执行查询时选择。

注意在 body.dailyApiRequests.remaining 中包括整数值的多路 1.0 如何评估表达式评估,没有浮动点,而没有区别,而是发出一个不可或缺的部门,结果为 0( 消耗某些 API 限制)或 1(消耗的 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()

289.7. 使用批准

所有属性都与带有批准的 Salesforce REST API 中的名称 完全相同。您可以通过设置 Endpoint .PropertyName 设置批准 属性来设置批准属性,这些端点将用作 template","- themeaning,这些属性在 body 或 header 中都不会显示任何属性。或者,您可以通过将 批准 属性分配给 Registry 中 bean 的引用,来设置端点上的批准模板。

您还可以在传入消息标头中使用相同的 approval.PropertyName 来提供标头值。

最后,正文可以包含一个 AprovalRequestIterable of ApprovalRequest 对象作为批处理。

要记住的重要事项是这三个机制中指定的值的优先级:

  1. body 中的值优先于其它值
  2. message 标头中的值在模板值前具有优先权
  3. 如果没有提供标头或正文中的其他值,则设置模板中的值

例如,使用标头使用中的值发送一条记录进行批准:

给定路由:

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);

289.8. 使用 Salesforce Recent Items API

若要获取最近的项目,请使用 salesforce:recent 操作。此操作会返回 java.util.List of org.apache.camel.component.salesforce.api.dto.RecentItem 对象(List<RecentItem>),其中包含 IdNameAttributes (带有 类型和 url 属性)。您可以通过指定要返回的最大记录数 来限制 返回的项目数量。例如:

from("direct:fetchRecentItems")
    to("salesforce:recent")
        .split().body()
            .log("${body.name} at ${body.attributes.url}");

289.9. 使用批准

所有属性都与带有批准的 Salesforce REST API 中的名称 完全相同。您可以通过设置 Endpoint .PropertyName 设置批准 属性来设置批准属性,这些端点将用作 template","- themeaning,这些属性在 body 或 header 中都不会显示任何属性。或者,您可以通过将 批准 属性分配给 Registry 中 bean 的引用,来设置端点上的批准模板。

您还可以在传入消息标头中使用相同的 approval.PropertyName 来提供标头值。

最后,正文可以包含一个 AprovalRequestIterable of ApprovalRequest 对象作为批处理。

要记住的重要事项是这三个机制中指定的值的优先级:

  1. body 中的值优先于其它值
  2. message 标头中的值在模板值前具有优先权
  3. 如果没有提供标头或正文中的其他值,则设置模板中的值

例如,使用标头使用中的值发送一条记录进行批准:

给定路由:

from("direct:example1")//
        .setHeader("approval.ContextId", simple("${body['contextId']}"))
        .setHeader("approval.NextApproverIds", simple("${body['nextApproverIds']}"))
        .to("salesforce:approval?"//
            + "approvalActionType=Submit"//
            + "&approvalComments=this is a test"//
            + "&approvalProcessDefinitionNameOrId=Test_Account_Process"//
            + "&approvalSkipEntryCriteria=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);

289.10. 使用 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 property)或对应的 org.apache.camel.component.salesforce.api.dto.composite.SObjectNode 填充。

请注意,对于一些记录操作可能会成功,一些记录可能会失败,因此您需要手动检查错误。

使用此功能的最简单方法是使用 camel- Salesforce-maven-plugin 生成的 DTOs,但您也可以自定义在树中标识每个对象(针对您的数据库)中每个对象的引用。

让我们来看看一个例子:

Account account = ...
Contact president = ...
Contact marketing = ...

Account anotherAccount = ...
Contact sales = ...
Asset someAsset = ...

// build the tree
SObjectTree request = new SObjectTree();
request.addObject(account).addChildren(president, marketing);
request.addObject(anotherAccount).addChild(sales).addChild(someAsset);

final SObjectTree response = template.requestBody("salesforce:composite-tree", tree, SObjectTree.class);
final Map<Boolean, List<SObjectNode>> result = response.allNodes()
                                                   .collect(Collectors.groupingBy(SObjectNode::hasErrors));

final List<SObjectNode> withErrors = result.get(true);
final List<SObjectNode> succeeded = result.get(false);

final String firstId = succeeded.get(0).getId();

289.11. 使用 Salesforce Composite API 批量提交多个请求

Composite API 批处理操作(复合-batch)允许您批量累积多个请求,然后在一个位置提交请求,保存多个单独请求的往返成本。然后,每个响应都会在保留订单的情况下收到每个响应,因此第 n 条请求响应就会出现在响应中。

注意

结果可能与 API 和 API 不同,因此请求的结果是 java.lang.Object 的结果。在大多数情况下,结果将是 java.util.Map,带有字符串键和值或其他 java.util.Map 作为值。以 JSON 格式发出的请求保存了一些类型信息(例如,即字符串,哪些值为数字),因此这些格式中的请求会更加友好。请注意,其响应在 XML 和 JSON 之间有所不同,这是由于来自 Salesforce API 的响应不同。如果您在不更改响应处理代码的情况下在格式间切换,请小心。

让我们来看看一个例子:

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?format=JSON", 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

289.12. 使用 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?format=JSON", 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()

289.13. 生成 SOQL 查询字符串

org.apache.camel.component.salesforce.api.utils.QueryHelper 包含帮助程序方法来生成 SOQL 查询。例如,若要从 帐户 SObject 获取所有自定义字段,只需调用即可生成 SOQL SELECT:

String allCustomFieldsQuery = QueryHelper.queryToFetchFilteredFieldsOf(new Account(), SObjectField::isCustom);

289.14. Camel Salesforce Maven 插件

此 Maven 插件为 Camel Salesforce 生成 DTO。

显然,建议在 pom.xml 中设置 clientId、clientSecret、userName 和 password 字段。该插件应配置为剩余属性,并可以使用以下命令执行:

mvn camel-salesforce:generate -DcamelSalesforce.clientId=<clientid> -DcamelSalesforce.clientSecret=<clientsecret> \
    -DcamelSalesforce.userName=<username> -DcamelSalesforce.password=<password>

生成的 DTOs 使用 Jackson 和 XStream 注解。支持所有 Salesforce 字段类型。默认情况下,日期和时间字段映射到 java.time.ZonedDateTime,picklist 字段映射到生成的 Java Enumerations。

289.15. 选项

Salesforce 组件支持 31 选项,它们如下所列。

名称描述默认类型

authenticationType (security)

要使用的显式身份验证方法、USERNAME_PASSWORD、REFRESH_TOKEN 或 JWT 之一。Salesforce 组件可自动按验证方法从属性集使用,设置此属性以消除这种不确定性。

 

AuthenticationType

loginConfig (security)

在一个嵌套的 bean 中的所有身份验证配置,组件上还可直接设置所有属性

 

SalesforceLoginConfig

instanceUrl (security)

authantication 后所用的 Salesforce 实例的 URL,默认为从 Salesforce 上收到成功身份验证的 URL

 

字符串

loginUrl (security)

用于身份验证的 Salesforce 实例的 所需 URL,默认设置为 https://login.salesforce.com

https://login.salesforce.com

字符串

clientId (security)

在 Salesforce 实例设置中配置的已连接应用程序的 所需 OAuth 消费者密钥。通常,需要配置一个连接的应用,但可以通过安装软件包来提供。

 

字符串

clientSecret (security)

在 Salesforce 实例设置中配置的已连接应用程序的 OAuth Consumer Secret。

 

字符串

keystore (security)

要在 OAuth JWT 流中使用的密钥存储参数。KeyStore 应该仅包含一个包含私钥和证书的条目。Salesforce 不验证证书链,因此这很容易是一个自签名证书。确保将证书上传到对应的连接应用程序。

 

KeyStoreParameters

refreshToken (security)

刷新令牌已在刷新令牌 OAuth 流中获取。个需要设置 Web 应用并配置回调 URL 以接收刷新令牌,或者使用 https://login.salesforce.com/services/oauth2/successhttps://test.salesforce.com/services/oauth2/success 的内置回调进行配置,然后从流末尾的 URL 重新执行 refresh_token。请注意,在开发机构中,Salesforce 允许在 localhost 上托管回调 Web 应用程序。

 

字符串

userName (security)

OAuth 流中使用的用户名以获取访问令牌的访问权限。从密码 OAuth 流中易于启动,但一般应该避免,因为与其他流程相比安全性较低。

 

字符串

密码 (安全)

OAuth 流中使用的密码获取访问令牌的访问权限。从密码 OAuth 流中易于启动,但一般应该避免,因为与其他流程相比安全性较低。如果使用一个密码,请确保将安全令牌附加到密码的末尾。

 

字符串

lazyLogin (security)

如果设置为 true,则组件会阻止组件开始向 Salesforce 进行身份验证。您通常把它设置为 (默认)假,并提前进行身份验证,并立即了解任何身份验证问题。

false

布尔值

config (common)

全局端点配置 - 用来设置适用于所有端点的值

 

SalesforceEndpoint Config

httpClientProperties (common)

用于设置可在底层 HTTP 客户端上配置的任何属性。查看 SalesforceHttpClient 和 Jetty HttpClient 的属性,了解所有可用的选项。

 

map

longPollingTransport Properties (common)

用于设置可以在流 api 使用的 BayeuxClient (CometD)使用的 LongPollingTransport 上配置的任何属性

 

map

sslContextParameters (security)

要使用的 SSL 参数,请参阅 SSLContextParameters 类有关所有可用选项。

 

SSLContextParameters

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数

false

布尔值

httpProxyHost (proxy)

要使用的 HTTP 代理服务器主机名。

 

字符串

httpProxyPort (proxy)

要使用的 HTTP 代理服务器的端口号。

 

整数

httpProxyUsername (security)

用于对 HTTP 代理服务器进行身份验证的用户名。

 

字符串

httpProxyPassword (security)

用于对 HTTP 代理服务器进行身份验证的密码。

 

字符串

isHttpProxySocks4 (proxy)

如果设置为 true,请将 HTTP 代理配置为用作 SOCKS4 代理。

false

布尔值

isHttpProxySecure (security)

如果设置为 false,则在访问 HTTP 代理时禁用使用 TLS。

true

布尔值

httpProxyIncluded address (proxy)

应使用 HTTP 代理服务器的地址列表。

 

Set

httpProxyExcluded address (proxy)

不使用 HTTP 代理服务器的地址列表。

 

Set

httpProxyAuthUri (security)

用于对 HTTP 代理服务器进行身份验证,需要与代理服务器的 URI 匹配,以便 httpProxyUsername 和 httpProxyPassword 用于身份验证。

 

字符串

httpProxyRealm (security)

代理服务器的域,用于针对 HTTP 代理服务器抢占 Basic/Digest 身份验证方法。

 

字符串

httpProxyUseDigest Auth (security)

如果设置为 true Digest 身份验证,则在向 HTTP 代理进行身份验证时将使用其他明智基本授权方法。

false

布尔值

packages (common)

在哪些软件包中生成的 DTO 类。通常,这些类使用 camel-force-maven-plugin 生成。如果使用生成的 DTOs 获得在 parameters/header 值中使用简短 SObject 名称的好处,则进行设置。

 

String[]

queryLocator (common)

当查询结果超过单个调用中检索结果时,由 salesforce 提供的查询查找器以供使用。在随后的调用中使用这个值来检索其他记录。

 

字符串

jobType (common)

仅获取与指定作业类型匹配的作业的信息。可能的值有:

经典 的 Bulk API 作业(这包括查询作业和 ingest 作业)。

V2Query Bulk API 2.0 查询作业。

V2Ingest Bulk API 2.0ingest (upload and upsert)作业。

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Salesforce 端点使用 URI 语法配置:

salesforce:operationName:topicName

使用以下路径和查询参数:

289.15.1. 路径名(2 参数):

名称描述默认类型

operationName

要使用的操作。共有 59 enums 和 value 之一: getVersions, getResources, getGlobalObjects, getBasicInfo, getDescription, getSObject, createSObject, updateSObject, deleteSObject, getSObject, getSObjectWithId, upsertSObject, deleteSObjectWithId, getBlobField, query, queryMore, queryAll, search, apexCall, recent, createJob, getJob, closeJob, abortJob, createBatch, getBatch, getAllBatches, getRequest, getResults, createBatchQuery, getQueryResultIds, getQueryResults, getRecentReports, getReportDescription, 执行SyncReport, executeAsyncReport, getReportInstances, getReportResults, limits, approval, approval, 复合树, composite-batch, 复合, bulk2GetAllJobs, bulk2CreateJob, bulk2GetJob, bulk2CreateBatch, bulk2CloseJob, bulk2AbortJob, bulk2AbortJob, bulk2DeleteJob, bulk2GetSuccessfulResults, bulk2GetFailedResults, bulk2GetprocessedRecords, bulk2CreateQueryJob, bulk2GetQueryJob, bulk2GetQueryJobResults, bulk2AbortQueryJob, bulk2AbortQueryJob, bulk2DeleteQueryJob

 

OperationName

topicName

要使用的主题名称

 

字符串

289.15.2. 查询参数(46 参数):

名称描述默认类型

apexMethod (common)

APEX 方法名称

 

字符串

apexQueryParams (common)

为 APEX 方法查询参数

 

map

apexUrl (common)

APEX 方法 URL

 

字符串

apiVersion (common)

Salesforce API 版本,默认为 SalesforceEndpointConfig.DEFAULT_VERSION

 

字符串

backoffIncrement (common)

backoff 间隔递增,流连接重启尝试超过 CometD 自动连接尝试。

 

long

batchId (common)

批量 API 批处理 ID

 

字符串

contentType (common)

批量 API 内容类型,一种 XML、CSV、ZIP_XML、ZIP_CSV

 

ContentType

defaultReplayId (common)

如果 initialReplayIdMap 中没有找到值,则默认 replayId 设置

 

Long

format (common)

用于 Salesforce API 调用的有效负载格式(JSON 或 XML)默认为 JSON

 

PayloadFormat

httpClient (common)

自定义 Jetty Http 客户端用于连接到 Salesforce。

 

SalesforceHttpClient

includeDetails (common)

在 Salesforce1 Analytics 报告中包含详情,默认为 false。

 

布尔值

initialReplayIdMap (common)

重播 ID,从每个频道名称启动。

 

map

instanceId (common)

Salesforce1 分析报告执行实例 ID

 

字符串

jobId (common)

批量 API 作业 ID

 

字符串

jobType (common)

仅获取与指定作业类型匹配的作业的信息。可能的值有:

经典 的 Bulk API 作业(这包括查询作业和 ingest 作业)。

V2Query Bulk API 2.0 查询作业。

V2Ingest Bulk API 2.0ingest (upload and upsert)作业。

 

字符串

limit (common)

返回记录的限值。适用于一些 API,请查看 Salesforce 文档。

 

整数

maxBackoff (common)

在 CometD 自动连接失败之外,流连接重启尝试的最大 backoff 间隔。

 

long

notFoundBehaviour (common)

设置来自 Salesforce API 的 404 未找到状态的行为。正文应设置为 NULL NotFoundBehaviour#NULL,或在交换 NotFoundBehaviour#EXTION 上发出一个异常。

 

NotFoundBehaviour

notifyForFields (common)

notify for fields, options are ALL, REFERENCED, SELECT, WHERE

 

NotifyForFieldsEnum

notifyForOperationCreate (common)

notify for create operation, 默认为 false (API version = 29.0)

 

布尔值

notifyForOperationDelete (common)

notify for delete operation, 默认为 false (API version = 29.0)

 

布尔值

notifyForOperations (common)

通知操作,选项是 ALL、CREATE、EXTENDED、UPDATE (API 版本 29.0)

 

NotifyForOperations Enum

notifyForOperationUndelete (common)

notify for un-delete operation, 默认为 false (API version = 29.0)

 

布尔值

notifyForOperationUpdate (common)

通知更新操作,默认为 false (API 版本 = 29.0)

 

布尔值

objectMapper (common)

自定义 Jackson ObjectMapper,以在以串行方式处理 Salesforce 对象时使用。

 

ObjectMapper

queryLocator (common)

当查询结果超过单个调用中检索结果时,由 salesforce 提供的查询查找器以供使用。在随后的调用中使用这个值来检索其他记录。

 

字符串

rawPayload (common)

为请求和响应使用原始有效负载字符串(根据格式使用 JSON 或 XML,而不是默认为 DTOs)

false

布尔值

reportId (common)

Salesforce1 分析报告 Id

 

字符串

reportMetadata (common)

Salesforce1 分析报告过滤的元数据

 

ReportMetadata

resultId (common)

批量 API 结果 ID

 

字符串

serializeNulls (common)

如果给定 DTO 的 NULL 值应该使用空(NULL)值进行序列化。这只会影响 JSON 数据格式。

false

布尔值

sObjectBlobFieldName (common)

SObject blob 字段名称

 

字符串

sObjectClass (common)

完全限定 SObject 类名称,通常使用 camel-salesforce-maven-plugin 生成。

 

字符串

sObjectFields (common)

要检索的 SObject 字段

 

字符串

sObjectId (common)

API 所需的 SObject ID

 

字符串

sObjectIdName (common)

SObject external ID 字段名称

 

字符串

sObjectIdValue (common)

SObject external ID 字段值

 

字符串

sObjectName (common)

API 需要或支持 SObject 名称

 

字符串

sObjectQuery (common)

Salesforce SOQL 查询字符串

 

字符串

sObjectSearch (common)

Salesforce SOSL 搜索字符串

 

字符串

updateTopic (common)

在使用流 API 时是否更新现有的 Push Topic,都默认为 false

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

replayId (consumer)

订阅时使用的 replayId 值

 

Long

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

289.16. Spring Boot Auto-Configuration

组件支持 85 个选项,它们如下所列。

名称描述默认类型

camel.component.salesforce.authentication-type

要使用的显式身份验证方法、USERNAME_PASSWORD、REFRESH_TOKEN 或 JWT 之一。Salesforce 组件可自动按验证方法从属性集使用,设置此属性以消除这种不确定性。

 

AuthenticationType

camel.component.salesforce.client-id

在 Salesforce 实例设置中配置的已连接应用程序的 OAuth 消费者密钥。通常,需要配置一个连接的应用,但可以通过安装软件包来提供。

 

字符串

camel.component.salesforce.client-secret

在 Salesforce 实例设置中配置的已连接应用程序的 OAuth Consumer Secret。

 

字符串

camel.component.salesforce.config.apex-method

APEX 方法名称

 

字符串

camel.component.salesforce.config.apex-query-params

为 APEX 方法查询参数

 

map

camel.component.salesforce.config.apex-url

APEX 方法 URL

 

字符串

camel.component.salesforce.config.api-version

Salesforce API 版本,默认为 SalesforceEndpointConfig.DEFAULT_VERSION

 

字符串

camel.component.salesforce.config.approval

批准 API 的批准请求。@param 批准

 

ApprovalRequest

camel.component.salesforce.config.approval-action-type

表示要执行的操作类型: Submit、Approve 或 Reject. @param actionType

 

ApprovalRequest$Action

camel.component.salesforce.config.approval-comments

要添加到与此请求关联的历史记录步骤的注释。@param 注释

 

字符串

camel.component.salesforce.config.approval-context-actor-id

请求批准记录的提交者 ID。@param contextActorId

 

字符串

camel.component.salesforce.config.approval-context-id

正在对其采取的项的 ID。@param contextId

 

字符串

camel.component.salesforce.config.approval-next-approver-ids

如果进程需要指定下一个批准,则必须分配下一个请求的 ID。@param nextApproverIds

 

list

camel.component.salesforce.config.approval-process-definition-name-or-id

进程定义的开发人员名称或 ID。@param processDefinitionNameOrId

 

字符串

camel.component.salesforce.config.approval-skip-entry-criteria

决定是否在进程定义名称或 ID 不为空时评估进程(true)或非(false)的条目标准。如果没有指定进程定义名称或 ID,则忽略此参数,并将根据进程顺序来遵循标准评估。默认情况下,如果此请求未设置,则条目条件不会被跳过。@param skipEntryCriteria

 

布尔值

camel.component.salesforce.config.backoff-increment

backoff 间隔递增,流连接重启尝试超过 CometD 自动连接尝试。

 

Long

camel.component.salesforce.config.batch-id

批量 API 批处理 ID

 

字符串

camel.component.salesforce.config.content-type

批量 API 内容类型,一种 XML、CSV、ZIP_XML、ZIP_CSV

 

ContentType

camel.component.salesforce.config.default-replay-id

如果 initialReplayIdMap 中没有找到值,则默认 replayId 设置

 

Long

camel.component.salesforce.config.format

用于 Salesforce API 调用的有效负载格式(JSON 或 XML)默认为 JSON

 

PayloadFormat

camel.component.salesforce.config.http-client

自定义 Jetty Http 客户端用于连接到 Salesforce。

 

SalesforceHttpClient

camel.component.salesforce.config.include-details

在 Salesforce1 Analytics 报告中包含详情,默认为 false。

 

布尔值

camel.component.salesforce.config.initial-replay-id-map

重播 ID,从每个频道名称启动。

 

map

camel.component.salesforce.config.instance-id

Salesforce1 分析报告执行实例 ID

 

字符串

camel.component.salesforce.config.job-id

批量 API 作业 ID

 

字符串

camel.component.salesforce.config.limit

返回记录的限值。适用于一些 API,请查看 Salesforce 文档。

 

整数

camel.component.salesforce.config.max-backoff

在 CometD 自动连接失败之外,流连接重启尝试的最大 backoff 间隔。

 

Long

camel.component.salesforce.config.not-found-behaviour

设置来自 Salesforce API 的 404 未找到状态的行为。正文应设置为 NULL NotFoundBehaviour#NULL,或在交换 NotFoundBehaviour#EXTION 上发出一个异常。

 

NotFoundBehaviour

camel.component.salesforce.config.notify-for-fields

notify for fields, options are ALL, REFERENCED, SELECT, WHERE

 

NotifyForFieldsEnum

camel.component.salesforce.config.notify-for-operation-create

notify for create operation, 默认为 false (API version = 29.0)

 

布尔值

camel.component.salesforce.config.notify-for-operation-delete

notify for delete operation, 默认为 false (API version = 29.0)

 

布尔值

camel.component.salesforce.config.notify-for-operation-undelete

notify for un-delete operation, 默认为 false (API version = 29.0)

 

布尔值

camel.component.salesforce.config.notify-for-operation-update

通知更新操作,默认为 false (API 版本 = 29.0)

 

布尔值

camel.component.salesforce.config.notify-for-operations

通知操作,选项是 ALL、CREATE、EXTENDED、UPDATE (API 版本 29.0)

 

NotifyForOperations Enum

camel.component.salesforce.config.object-mapper

自定义 Jackson ObjectMapper,以在以串行方式处理 Salesforce 对象时使用。

 

ObjectMapper

camel.component.salesforce.config.raw-payload

为请求和响应使用原始有效负载字符串(根据格式使用 JSON 或 XML,而不是默认为 DTOs)

false

布尔值

camel.component.salesforce.config.report-id

Salesforce1 分析报告 Id

 

字符串

camel.component.salesforce.config.report-metadata

Salesforce1 分析报告过滤的元数据

 

ReportMetadata

camel.component.salesforce.config.result-id

批量 API 结果 ID

 

字符串

camel.component.salesforce.config.s-object-blob-field-name

SObject blob 字段名称

 

字符串

camel.component.salesforce.config.s-object-class

完全限定 SObject 类名称,通常使用 camel-salesforce-maven-plugin 生成。

 

字符串

camel.component.salesforce.config.s-object-fields

要检索的 SObject 字段

 

字符串

camel.component.salesforce.config.s-object-id

API 所需的 SObject ID

 

字符串

camel.component.salesforce.config.s-object-id-name

SObject external ID 字段名称

 

字符串

camel.component.salesforce.config.s-object-id-value

SObject external ID 字段值

 

字符串

camel.component.salesforce.config.s-object-name

API 需要或支持 SObject 名称

 

字符串

camel.component.salesforce.config.s-object-query

Salesforce SOQL 查询字符串

 

字符串

camel.component.salesforce.config.s-object-search

Salesforce SOSL 搜索字符串

 

字符串

camel.component.salesforce.config.serialize-nulls

如果给定 DTO 的 NULL 值应该使用空(NULL)值进行序列化。这只会影响 JSON 数据格式。

false

布尔值

camel.component.salesforce.config.update-topic

在使用流 API 时是否更新现有的 Push Topic,都默认为 false

false

布尔值

camel.component.salesforce.enabled

启用 salesforce 组件

true

布尔值

camel.component.salesforce.http-client-properties

用于设置可在底层 HTTP 客户端上配置的任何属性。查看 SalesforceHttpClient 和 Jetty HttpClient 的属性,了解所有可用的选项。

 

map

camel.component.salesforce.http-proxy-auth-uri

用于对 HTTP 代理服务器进行身份验证,需要与代理服务器的 URI 匹配,以便 httpProxyUsername 和 httpProxyPassword 用于身份验证。

 

字符串

camel.component.salesforce.http-proxy-excluded-addresses

不使用 HTTP 代理服务器的地址列表。

 

Set

camel.component.salesforce.http-proxy-host

要使用的 HTTP 代理服务器主机名。

 

字符串

camel.component.salesforce.http-proxy-included-addresses

应使用 HTTP 代理服务器的地址列表。

 

Set

camel.component.salesforce.http-proxy-password

用于对 HTTP 代理服务器进行身份验证的密码。

 

字符串

camel.component.salesforce.http-proxy-port

要使用的 HTTP 代理服务器的端口号。

 

整数

camel.component.salesforce.http-proxy-realm

代理服务器的域,用于针对 HTTP 代理服务器抢占 Basic/Digest 身份验证方法。

 

字符串

camel.component.salesforce.http-proxy-use-digest-auth

如果设置为 true Digest 身份验证,则在向 HTTP 代理进行身份验证时将使用其他明智基本授权方法。

false

布尔值

camel.component.salesforce.http-proxy-username

用于对 HTTP 代理服务器进行身份验证的用户名。

 

字符串

camel.component.salesforce.instance-url

authantication 后所用的 Salesforce 实例的 URL,默认为从 Salesforce 上收到成功身份验证的 URL

 

字符串

camel.component.salesforce.is-http-proxy-secure

如果设置为 false,则在访问 HTTP 代理时禁用使用 TLS。

true

布尔值

camel.component.salesforce.is-http-proxy-socks4

如果设置为 true,请将 HTTP 代理配置为用作 SOCKS4 代理。

false

布尔值

camel.component.salesforce.keystore

要在 OAuth JWT 流中使用的密钥存储参数。KeyStore 应该仅包含一个包含私钥和证书的条目。Salesforce 不验证证书链,因此这很容易是一个自签名证书。确保将证书上传到对应的连接应用程序。选项是一个 org.apache.camel.util.jsse.KeyStoreParameters 类型。

 

字符串

camel.component.salesforce.lazy-login

如果设置为 true,则组件会阻止组件开始向 Salesforce 进行身份验证。您通常把它设置为 (默认)假,并提前进行身份验证,并立即了解任何身份验证问题。

false

布尔值

camel.component.salesforce.login-config.client-id

Salesforce 连接的应用程序消费者密钥

 

字符串

camel.component.salesforce.login-config.client-secret

Salesforce connected application Consumer Secret

 

字符串

camel.component.salesforce.login-config.instance-url

  

字符串

camel.component.salesforce.login-config.keystore

包含 OAuth 2.0 JWT 持有者令牌流所需的证书和私钥的密钥存储参数。

 

KeyStoreParameters

camel.component.salesforce.login-config.lazy-login

启用/禁用 lazy OAuth 的标记,默认为 false。启用后,OAuth 令牌检索或生成后才会在第一个 API 调用前完成

 

布尔值

camel.component.salesforce.login-config.login-url

Salesforce 登录 URL,默认为 https://login.salesforce.com

 

字符串

camel.component.salesforce.login-config.password

Salesforce 帐户密码

 

字符串

camel.component.salesforce.login-config.refresh-token

Salesforce 连接的应用程序消费者令牌

 

字符串

camel.component.salesforce.login-config.type

  

AuthenticationType

camel.component.salesforce.login-config.user-name

Salesforce 帐户用户名

 

字符串

camel.component.salesforce.login-url

用于身份验证的 Salesforce 实例的 URL,默认设置为 https://login.salesforce.com

https://login.salesforce.com

字符串

camel.component.salesforce.long-polling-transport-properties

用于设置可以在流 api 使用的 BayeuxClient (CometD)使用的 LongPollingTransport 上配置的任何属性

 

map

camel.component.salesforce.packages

在哪些软件包中生成的 DTO 类。通常,这些类使用 camel-force-maven-plugin 生成。如果使用生成的 DTOs 获得在 parameters/header 值中使用简短 SObject 名称的好处,则进行设置。

 

String[]

camel.component.salesforce.password

OAuth 流中使用的密码获取访问令牌的访问权限。从密码 OAuth 流中易于启动,但一般应该避免,因为与其他流程相比安全性较低。如果使用一个密码,请确保将安全令牌附加到密码的末尾。

 

字符串

camel.component.salesforce.refresh-token

刷新令牌已在刷新令牌 OAuth 流中获取。个需要设置 Web 应用并配置回调 URL 以接收刷新令牌,或者使用 https://login.salesforce.com/services/oauth2/successhttps://test.salesforce.com/services/oauth2/success 的内置回调进行配置,然后从流末尾的 URL 重新执行 refresh_token。请注意,在开发机构中,Salesforce 允许在 localhost 上托管回调 Web 应用程序。

 

字符串

camel.component.salesforce.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.salesforce.ssl-context-parameters

要使用的 SSL 参数,请参阅 SSLContextParameters 类有关所有可用选项。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.salesforce.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数

false

布尔值

camel.component.salesforce.user-name

OAuth 流中使用的用户名以获取访问令牌的访问权限。从密码 OAuth 流中易于启动,但一般应该避免,因为与其他流程相比安全性较低。

 

字符串

第 290 章 SAP 组件

SAP 组件是一个由 10 个不同的 SAP 组件套件组成的软件包。有支持 sRFC、tRFC 和 qRFC 协议的远程函数调用(RFC)组件;还有 IDoc 组件使用 IDoc 格式的消息来促进通信。组件使用 SAP Java Connector (SAP JCo)库来简化与 SAP 和 SAP IDoc 库的双向通信,以促进 Intermediate 文档(IDoc)格式的文档传输。

290.1. 概述

依赖项

Maven 用户需要在其 pom.xml 文件中添加以下依赖项以使用这个组件:

<dependency>
    <groupId>org.fusesource</groupId>
    <artifactId>camel-sap</artifactId>
    <version>x.x.x</version>
<dependency>

SAP 组件的其他平台限制

因为 SAP 组件依赖于第三方 JCo 3 和 IDoc 3 库,所以只能在这些库支持的平台上安装。有关支持的库版本和平台限制的详情,请参阅 Red Hat JBoss Fuse 支持的配置

SAP JCo 和 SAP IDoc 库

使用 SAP 组件的先决条件是将 SAP Java Connector (SAP JCo)库和 SAP IDoc 库安装到 Java 运行时的 lib/ 目录中。您必须确保从 SAP Service Marketplace 下载适合作为目标操作系统的 SAP 库集合。

库文件的名称因目标操作系统而异,如 表 290.1 “所需的 SAP 库” 所示。

表 290.1. 所需的 SAP 库

SAP 组件Linux 和 UNIXWindows

SAP JCo 3

sapjco3.jar

libsapjco3.so

sapjco3.jar

sapjco3.dll

SAP IDoc

sapidoc3.jar

sapidoc3.jar

在 Fuse OSGi 容器中部署

您可以将 SAP JCo 库和 SAP IDoc 库安装到 JBoss Fuse OSGi 容器中,如下所示:

  1. 从 SAP Service Marketplace 下载 SAP JCo 库和 SAP IDoc 库,确保为您的操作系统选择适当的库版本。http://service.sap.com/public/connectorshttp://service.sap.com/public/connectors

    注意

    您必须有一个 SAP Service Marketplace 帐户 才能下载和使用这些库。

  2. sapjco3.jarlibsapjco3.so (或 Windows 中的 sapjco3.dll )和 sapidoc3.jar 库文件复制到 Fuse 安装的 lib/ 目录中。
  3. 在文本编辑器中打开 配置属性文件 etc/config.properties 以及自定义属性文件 etc/custom.properties。在 etc/config.properties 文件中,查找 org.osgi.framework.system.packages.extra 属性并复制完整的属性设置(此设置通过反斜杠字符 \ 进行扩展),使用反斜杠字符 \ 来指示行。现在,将此设置粘贴到 etc/custom.properties 文件中。

    现在,您可以添加支持 SAP 库所需的额外软件包。在 etc/custom.properties 文件中,将所需的软件包添加到 org.osgi.framework.system.extra 设置中,如下所示:

    org.osgi.framework.system.packages.extra = \
     ... , \
     com.sap.conn.idoc, \
     com.sap.conn.idoc.jco, \
     com.sap.conn.jco, \
     com.sap.conn.jco.ext, \
     com.sap.conn.jco.monitor, \
     com.sap.conn.jco.rt, \
     com.sap.conn.jco.server

    别忘了在新条目的每一行的结尾包含一个逗号和反斜杠 \,以便列表能够正确地继续。

  4. 您需要重启容器才能使这些更改生效。
  5. 您需要在容器中安装 camel-sap 功能。在 Karaf 控制台中,输入以下命令:

    JBossFuse:karaf@root> features:install camel-sap

在 JBoss EAP 容器中部署

要在 JBoss EAP 容器中部署 SAP 组件,请执行以下步骤:

  1. 从 SAP Service Marketplace 下载 SAP JCo 库和 SAP IDoc 库,确保为您的操作系统选择适当的库版本。http://service.sap.com/public/connectorshttp://service.sap.com/public/connectors

    注意

    您必须有一个 SAP Service Marketplace 帐户 才能下载和使用这些库。

  2. 将 JCo 库文件和 IDoc 库文件复制到 JBoss EAP 安装的适当子目录中。例如,如果您的主机平台是 64 位 Linux (linux-x86_64),则按如下方式安装库文件:

    cp sapjco3.jar sapidoc3.jar $JBOSS_HOME/modules/system/layers/fuse/com/sap/conn/jco/main/
    mkdir -p $JBOSS_HOME/modules/system/layers/fuse/com/sap/conn/jco/main/lib/linux-x86_64
    cp libsapjco3.so $JBOSS_HOME/modules/system/layers/fuse/com/sap/conn/jco/main/lib/linux-x86_64/
    重要

    对于将原生库(如 libsapjco3.so)安装到 JBoss EAP 安装中,对库子目录命名有一个标准化的约定,必须遵循它们。如果是 64 位 Linux,子目录是 linux-x86_64。有关其他平台,请参阅 https://docs.jboss.org/author/display/MODULES/Native+Libraries

  3. 创建一个名为 $JBOSS_HOME/modules/system/layers/fuse/org/wildfly/camel/extras/main/module.xml 的新文件,并添加以下内容

    <?xml version="1.0" encoding="UTF-8"?>
    <module xmlns="urn:jboss:module:1.1" name="org.wildfly.camel.extras">
    
    	<dependencies>
    		<module name="org.fusesource.camel.component.sap" export="true" services="export" />
    	</dependencies>
    
    </module>

URI 格式

SAP 组件提供两种不同的端点:远程功能调用(RFC)端点和 Intermediate Document (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 实例的特定出站连接的名称。出站连接在组件级别上命名和配置,如 第 290.2.2 节 “目标配置” 所述。

带有 sap-endpointKind-server 前缀的 URI 格式用于定义服务器端点(换句话说,Camel consumer 端点),serverName 则是来自 SAP 实例的特定入站连接的名称。入站连接在组件级别上命名和配置,如 第 290.2.3 节 “服务器配置” 所述。

RFC 端点 URI 的其他组件如下:

rfcName
(必需) 在目的地端点 URI 中,是连接的 SAP 实例中端点调用的 RFC 名称。在服务器端点 URI 中,是从连接的 SAP 实例调用时端点处理的 RFC 名称。
queueName
指定此端点将 SAP 请求发送到的队列。

IDoc 端点 URI 的其他组件如下:

idocType
(必需) 指定此端点生成的 IDoc 类型的基本 IDoc 类型。
idocTypeExtension
指定此端点生成的 IDoc Type Extension (若有)。
systemRelease
指定此端点生成的 IDoc 的相关 SAP Basis Release。
applicationRelease
Specifes相关的 Application Release (如果有)由这个端点生成的 IDoc。
queueName
指定此端点将 SAP 请求发送到的队列。

RFC 目标端点的选项

RFC 目标端点(sap-srfc-destinationsap-trfc-destinationsap-qrfc-destination)支持以下 URI 选项:

名称default描述

有状态

false

如果为 true,指定此端点启动 SAP 有状态会话

transacted

false

如果为 true,指定此端点启动 SAP 事务

RFC 服务器端点的选项

SAP RFC 服务器端点(sap-srfc-serversap-trfc-server)支持以下 URI 选项:

名称default描述

有状态

false

如果为 true,指定此端点启动 SAP 有状态会话。

propagateExceptions

false

(仅限 SAP-trfc-server 端点) 如果为 true,指定此端点在 SAP 中的调用者将异常传播回 SAP 中的调用者,而不是交换异常处理程序

IDoc List 服务器端点的选项

SAP IDoc List Server 端点(sap-idoclist-server)支持以下 URI 选项:

名称default描述

有状态

false

如果为 true,指定此端点启动 SAP 有状态会话。

propagateExceptions

false

如果为 true,指定此端点在 SAP 中将异常传播回调用者,而不是交换异常处理器

RFC 和 IDoc 端点概述

SAP 组件软件包提供以下 RFC 和 IDoc 端点:

sap-srfc-destination

JBoss Fuse SAP 同步远程功能调用目标 Camel 组件.如果 Camel 路由需要同步向 SAP 系统发送到和响应的请求,则使用此端点。

注意

此组件使用的 sRFC 协议提供了 SAP 系统以及从 具有最佳努力的 SAP 系统的请求和响应。如果在发送请求时出现通信错误,接收 SAP 系统中的远程功能调用的完成状态将保持在 有疑问

sap-trfc-destination

JBoss Fuse SAP 交易远程功能调用目标 Camel 组件.当请求必须 最多传送到接收 SAP 系统时,应该使用这个端点。为实现这一目标,组件会生成事务 ID tid,它包括了通过路由交换中组件发送的每个请求。接收 SAP 系统 记录在 发出请求前附带的请求;如果 SAP 系统再次收到请求,则不会提供请求。因此,如果路由在通过这个组件的端点发送请求时遇到通信错误,它可以在同一交换中重试发送请求并只能进行一次。

注意

此组件使用的 tRFC 协议是异步的,不会返回响应。因此,此组件的端点不会返回响应信息。

注意

此组件不能通过端点保证一系列请求的顺序,这些请求的交付和执行顺序因通信错误而在接收 SAP 系统中有所不同。有关保证的交付顺序,请参阅 JBoss Fuse SAP Queued Remote Function Call Destination Camel 组件。

sap-qrfc-destination

JBoss Fuse SAP Queued Remote Function 调用目标 Camel 组件.此组件通过添加 JBoss Fuse Transactional Remote Function Call Destination camel 组件来扩展 JBoss Fuse 行动 远程功能,从而通过其端点提供请求交付保证。如果一系列请求相互依赖,并且必须 最多 传送到接收 SAP 系统并按顺序将这个端点发送到接收 SAP 系统时,应该使用 此端点。该组件使用与 JBoss Fuse SAP 事务性远程功能调用目标 Camel 组件相同的机制,实现大多数 交付保证。排序保证通过将请求按 SAP 系统接收的顺序序列化为 入站队列 来实现。入站队列由 SAP 中的 QIN 调度程序 处理。当 激活 入站队列时,QIN 调度程序将按顺序执行队列请求。

注意

此组件使用的 qRFC 协议是异步的,且不会返回响应。因此,此组件的端点不会返回响应信息。

sap-srfc-server
JBoss Fuse SAP 同步远程功能调用服务器 Camel 组件.如果 Camel 路由需要同步处理来自 SAP 系统的请求以及响应 SAP 系统,则应该使用此组件及其端点。
sap-trfc-server
JBoss Fuse SAP 交易远程功能调用服务器 Camel 组件.当发送 SAP 系统需要 一次 将其请求发送到 Camel 路由时,应使用此端点。为实现这一目标,发送 SAP 系统会生成事务 ID tid,它会为每个请求发送给组件的端点。发送 SAP 系统将首先检查组件,在发送与 tid 相关的一系列请求之前,是否收到了相应的组件。该组件将检查收到的 tid列表,记录所发送的 tid (如果尚未在该列表中),然后响应发送 SAP 系统,指明是否已记录 tid。发送 SAP 系统只有在之前未记录 tid 时发送一系列请求。这可让发送 SAP 系统以可靠地发送一系列请求一次到 camel 路由。
sap-idoc-destination
JBoss Fuse SAP IDoc Destination Camel 组件.当需要 Camel 路由向 SAP 系统发送 Intermediate 文档(IDoc)列表时,应该使用此端点。
sap-idoclist-destination
JBoss Fuse SAP IDoc List Destination Camel 组件.当需要 Camel 路由向 SAP 系统发送 Intermediate 文档(IDocs)列表时,需要使用此端点。
sap-qidoc-destination
JBoss Fuse SAP Queued IDoc Destination Camel 组件.如果 Camel 路由需要向 SAP 系统发送 Intermediate 文档(IDoc)列表,则应该使用此组件及其端点。
sap-qidoclist-destination
JBoss Fuse SAP Queued IDoc List Destination Camel 组件.如果需要 camel route 列表来向 SAP 系统发送 Intermediate 文档(IDocs)列表,则应该使用这个组件及其端点。
sap-idoclist-server
JBoss Fuse SAP IDoc List Server Camel 组件.如果发送 SAP 系统需要向 Camel 路由发送 Intermediate 文档列表,则使用这个端点。此组件使用 tRFC 协议与 SAP 通信,如 sap-trfc-server-standalone quick start 所述。

SAP RFC 目标端点

RFC 目的地端点支持到 SAP 的出站通信,这使得这些端点使 RFC 调用 SAP 中的 ABAP 功能模块。将 RFC 目标端点配置为通过与 SAP 实例的特定连接进行 RFC 调用特定的 ABAP 功能。RFC 目的地是出站连接的逻辑设计,具有唯一的名称。RFC 目的地由一组称为 目标数据 的连接参数指定。

RFC 目的地端点将从接收的 IN-OUT 交换的输入消息中提取 RFC 请求,并在向 SAP 函数调用该请求进行分配。来自功能调用的响应将在交换的输出消息中返回。由于 SAP RFC 目的地端点仅支持出站通信,因此 RFC 目标端点仅支持创建制作者。

SAP RFC 服务器端点

RFC 服务器端点支持 SAP 的入站通信,它允许 SAP 中的 ABAP 应用程序向服务器端点发出 RFC 调用。ABAP 应用程序与 RFC 服务器端点交互,就像它是远程功能模块一样。RFC 服务器端点配置为通过 SAP 实例的特定连接接收 RFC 调用特定的 RFC 功能。RFC 服务器是入站连接的逻辑设计,具有唯一的名称。RFC 服务器通过一组称为 服务器数据 的连接参数 指定。

RFC 服务器端点将处理传入的 RFC 请求,并将其作为 IN-OUT 交换的输入信息进行分配。交换的输出信息将作为 RFC 调用的响应返回。由于 SAP RFC 服务器端点仅支持入站通信,因此 RFC 服务器端点只支持创建用户。

SAP IDoc 和 IDoc list目的地端点

IDoc 目的地端点支持对 SAP 的出站通信,然后可以对 IDoc 消息执行进一步处理。IDoc 文档代表业务交易,可轻松与非 SAP 系统交换。IDoc 目的地由一组称为 目标数据 的连接参数指定。

IDoc 列表目的地端点与 IDoc目的地端点类似,除了它处理的消息由 IDoc 文档列表组成。

SAP IDoc list服务器端点

IDoc list服务器端点支持 SAP 的入站通信,启用 Camel 路由从 SAP 系统接收 IDoc 文档列表。IDoc list服务器由一组称为 服务器数据 的连接参数指定。

meta-data 软件仓库

meta-data 存储库用于存储以下元数据类型:

功能模块的接口描述
JCo 和 ABAP 运行时使用此元数据数据来检查 RFC 调用,以确保在分配这些调用前确保通信合作伙伴之间数据的类型安全传输。存储库填充了存储库数据。存储库数据是指定功能模板的映射。功能模板包含 meta-data,用于描述所有参数以及传递给和从 function 模块传递的信息,并且具有它所描述的功能模块的唯一名称。
IDoc 类型描述
IDoc 运行时使用此元数据来确保在向通信合作伙伴发送前正确格式化 IDoc 文档。基本 IDoc 类型由名称、允许的网段列表以及网段之间分层关系的描述组成。可以在网段上实施一些额外的限制:片段可以是强制或可选的;可以为每个网段指定最小/最大范围(保留该片段的允许重复请求的数量)。

因此,SAP 目的地和服务器端点需要访问存储库,以便发送和接收 RFC 调用,以便发送和接收 IDoc 文档。对于 RFC 调用,由端点调用和处理的所有功能模块的 meta-data 必须位于存储库中;对于 IDoc 端点,端点处理的所有 IDoc 类型和 IDoc 类型扩展必须位于存储库中。由目标和服务器端点使用的存储库的位置在目的地数据和对应连接的服务器数据中指定。

如果是 SAP 目标端点,它所使用的存储库通常位于 SAP 系统中,它默认为它所连接的 SAP 系统。此默认值在目标数据中不需要显式配置。此外,针对远程功能调用的 meta-data,目标端点发出的元数据将已经存在,用于它调用的任何现有功能模块。由目的地端点发出的元数据需要 SAP 组件中的配置。

另一方面,由服务器端点处理的函数调用的元数据通常不驻留在 SAP 系统的存储库中,而是必须由位于 SAP 组件中的存储库提供。SAP 组件维护了一个名为 meta-data 存储库的映射。存储库的名称对应于它提供 meta-data 的服务器名称。

290.2. 配置

SAP 组件维护了三种映射来存储目标数据、服务器数据和存储库数据。目标 数据存储和 服务器数据存储在 特殊的配置对象 SapConnectionConfiguration 上配置,它们会自动注入到 SAP 组件(在 Blueprint XML 配置或 Spring XML 配置文件的上下文中)。存储库数据存储 必须直接在相关的 SAP 组件上配置。

290.2.1. 配置概述

概述

SAP 组件维护了三种映射来存储目标数据、服务器数据和存储库数据。组件的属性, destinationDataStore 存储由目的地名称密钥、属性、serverDataStore、存储由服务器名称和属性、repositoryDataStore 所签署的服务器数据、存储库数据存储仓库数据。这些配置必须在初始化过程中传递给组件。

示例

以下示例演示了如何在 Blueprint XML 文件中配置示例目标数据存储和示例服务器数据存储。sap-configuration bean (类型为 SapConnectionConfiguration)将自动注入到此 XML 文件中使用的任何 SAP 组件。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint ... >
    ...
    <!-- Configures the Inbound and Outbound SAP Connections -->
    <bean id="sap-configuration"
        class="org.fusesource.camel.component.sap.SapConnectionConfiguration">
        <property name="destinationDataStore">
            <map>
                <entry key="quickstartDest" value-ref="quickstartDestinationData" />
            </map>
        </property>
        <property name="serverDataStore">
            <map>
                <entry key="quickstartServer" value-ref="quickstartServerData" />
            </map>
        </property>
    </bean>

    <!-- Configures an Outbound SAP Connection -->
    <!-- *** Please enter the connection property values for your environment *** -->
    <bean id="quickstartDestinationData"
        class="org.fusesource.camel.component.sap.model.rfc.impl.DestinationDataImpl">
        <property name="ashost" value="example.com" />
        <property name="sysnr" value="00" />
        <property name="client" value="000" />
        <property name="user" value="username" />
        <property name="passwd" value="passowrd" />
        <property name="lang" value="en" />
    </bean>

    <!-- Configures an Inbound SAP Connection -->
    <!-- *** Please enter the connection property values for your environment ** -->
    <bean id="quickstartServerData"
        class="org.fusesource.camel.component.sap.model.rfc.impl.ServerDataImpl">
        <property name="gwhost" value="example.com" />
        <property name="gwserv" value="3300" />
        <!-- The following property values should not be changed -->
        <property name="progid" value="QUICKSTART" />
        <property name="repositoryDestination" value="quickstartDest" />
        <property name="connectionCount" value="2" />
    </bean>
</blueprint>

290.2.2. 目标配置

概述

目的地的配置在 SAP 组件的 destinationDataStore 属性中维护。此映射中的每个条目都会配置与 SAP 实例的有不同出站连接。每个条目的密钥是出站连接的名称,在目的地端点 URI 的 destinationName 组件中使用,如 URI 格式部分中所述。

每个条目的值是目标数据配置对象 - org.fusesource.camel.component.sap.model.rfc.DestinationDataImpl - 指定出站 SAP 连接的配置。

目标配置示例

下面的蓝图 XML 代码演示了如何使用名称 quickstartDest 配置示例目的地。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint ... >
    ...
    <!-- Create interceptor to support tRFC processing -->
    <bean id="currentProcessorDefinitionInterceptor"
          class="org.fusesource.camel.component.sap.CurrentProcessorDefinitionInterceptStrategy" />

    <!-- Configures the Inbound and Outbound SAP Connections -->
    <bean id="sap-configuration"
        class="org.fusesource.camel.component.sap.SapConnectionConfiguration">
        <property name="destinationDataStore">
            <map>
                <entry key="quickstartDest" value-ref="quickstartDestinationData" />
            </map>
        </property>
    </bean>

    <!-- Configures an Outbound SAP Connection -->
    <!-- *** Please enter the connection property values for your environment *** -->
    <bean id="quickstartDestinationData"
        class="org.fusesource.camel.component.sap.model.rfc.impl.DestinationDataImpl">
        <property name="ashost" value="example.com" />
        <property name="sysnr" value="00" />
        <property name="client" value="000" />
        <property name="user" value="username" />
        <property name="passwd" value="password" />
        <property name="lang" value="en" />
    </bean>

</blueprint>

例如,在配置上述 Blueprint XML 文件中的目的地后,您可以使用以下 URI 调用 BAPI_FLCUST_GETLIST 远程函数调用:

sap-srfc-destination:quickstartDest:BAPI_FLCUST_GETLIST

拦截器用于 tRFC 和 qRFC 目的地

前面的目的地配置显示了 CurrentProcessorDefinitionInterceptStrategy 对象的实例化。此对象会在 Camel 运行时安装拦截器,它允许 Camel SAP 组件在处理 RFC 事务时跟踪其在 Camel 路由中的位置。如需了解更多详细信息,请参阅 “事务性 RFC 目标端点”一节

重要

这个拦截器对于事务 RFC 目标端点至关重要(如 sap-trfc-destinationsap-qrfc-destination),且必须在 Camel 运行时中安装,才能正确管理出站事务的 RFC 通信。如果在运行时未找到策略,则目标 RFC 事务处理程序会在 Camel 日志中发出警告,在这种情况下,Camel 运行时需要重新置备并重启,以正确地管理出站事务 RFC 通信。

登录和身份验证选项

下表列出了在 SAP 目标数据存储中配置目的地的 logon 和身份验证选项

名称

默认值

描述

client

 

SAP 客户端, 必需的 logon 参数

user

 

logon user,用于基于密码的身份验证的 logon 参数

aliasUser

 

可以使用 logon 用户别名而不是 logon 用户

userId

 

用于登录至 ABAP AS 的用户身份。如果目标配置使用 SSO/assertion ticket、证书、当前用户、或 SNC 环境进行身份验证,则由 JCo 运行时使用。如果未设置用户和用户别名,则需要用户 ID。此 ID 永不会发送到 SAP 后端,它会被本地的 JCo 运行时使用。

passwd

 

logon password,用于基于密码的身份验证的 logon 参数

lang

 

尚未定义,则使用默认用户语言的登录语言

mysapsso2

 

使用指定的 SAP Cookie Version 2 作为基于 SSO 验证的 logon ticket

x509cert

 

使用指定的 X509 证书进行基于证书的身份验证

lcheck

 

延迟身份验证后,直到第一次调用 - 1 (enable)。仅在特殊情况下使用。

useSapGui

 

使用可见、隐藏或不使用 SAP GUI

codePage

 

其他 logon 参数用于定义将用于转换 logon 参数的代码页面。仅在特殊情况下使用

getsso2

 

在登录后订购 SSO 票据,其获取的票据在目标属性中可用

denyInitialPassword

 

如果设置为 1,使用初始密码将导致异常(默认为 0)。

连接选项

下表列出了在 SAP 目标数据存储中配置目的地的连接选项:

名称

默认值

描述

saprouter

 

用于连接 SAP Router 后系统的 SAP Router 字符串。SAP Router 字符串包含 SAP 路由器及其端口号链,格式为 :(/H/<host>[/S/<port>])+

sysnr

 

SAP ABAP 应用程序服务器的系统数量,需要直接连接

ashost

 

SAP ABAP 应用程序服务器,需要直接连接

mshost

 

SAP message server, 用于负载平衡连接的必需属性

msserv

 

SAP 消息服务器端口,用于负载平衡连接的可选属性。为了解决 etc/services 中的服务名称 sapmsXXX 查找,由操作系统的网络层执行。如果使用端口号而不是符号服务名称,则不会执行查找,不需要其他条目。

gwhost

 

允许指定 concrete 网关,该网关应该用于建立与应用服务器的连接。如果没有在应用程序服务器中指定网关

gwserv

 

使用 gwhost 时,应设置。允许指定该网关上使用的端口。如果不指定应用服务器上的网关端口。为了解决 etc/services 中的服务名称 sapgwXXX 查找,由操作系统的网络层执行。如果使用端口号,而不是符号服务名称,则不会执行任何查找,不需要额外的条目。

r3name

 

SAP 系统,即负载平衡连接的强制属性的系统 ID。

group

 

SAP 应用程序服务器组,负载均衡连接的强制属性

network

LAN

根据 JCo 和目标系统之间的网络质量来设置这个值,以优化性能。有效值为 LANWAN (仅适用于快速序列化)。如果将 网络配置选项设置为 WAN,使用速度较慢但效率更高的压缩算法,并且分析用于进一步压缩选项的数据。如果将 网络配置 设置为 LAN,则使用非常快速的压缩算法,且数据分析只在非常基本的级别上执行。当您设置 LAN 选项时,压缩率并不高效,但网络传输时间会被视为不太重要的。默认设置为 LAN

serializationFormat

rowBased

有效值为 基于行或 。要进行快速序列化 ,必须设置。默认序列化设置是 基于行的

连接池选项

下表列出了在 SAP 目标数据存储中配置目的地的 连接池 选项:

名称

默认值

描述

peakLimit

0

可以同时为目的地创建的活跃出站连接数上限。值 0 可允许无限数量的活动连接,否则如果值小于 jpoolCapacity 的值,它将自动增加到这个值。默认设置为 poolCapacity 的值,或者如果尚未指定 池容量,则默认值为 0 ( 无限)。

poolCapacity

1

目标打开的最大空闲出站连接数。值 0 具有没有连接池(默认为 1)的效果。

expirationTime

 

目标内部有空闲连接可以关闭的时间(以毫秒为单位)

expirationPeriod

 

目标检查所发行的连接的过期时间(以毫秒为单位)。

maxGetTime

 

如果应用已经分配了最多允许的连接数,以毫秒为单位等待连接数上限。

保护网络连接选项

下表列出了在 SAP 目标数据存储中配置目的地 的安全网络选项

名称

默认值

描述

sncMode

 

安全网络连接(SNC)模式, 0 (off)或 1 (on)

sncPartnername

 

SNC 合作伙伴,例如: p:CN=R3、O=XYZ-INC、C=EN

sncQop

 

SNC 级安全: 19

sncMyname

 

自己的 SNC 名称。覆盖环境设置

sncLibrary

 

提供 SNC 服务的库的路径

仓库选项

下表列出了在 SAP 目标数据存储中配置目的地 的存储库 选项:

名称

默认值

描述

repositoryDest

 

指定应将哪个目的地用作存储库。

repositoryUser

 

如果没有设置存储库目的地,并且设置了此属性,它将被用作用户进行存储库调用。这可让您使用其他用户进行存储库查找。

repositoryPasswd

 

仓库用户的密码。必需,如果应使用存储库用户。

repositorySnc

 

(可选) 如果将 SNC 用于此目的地,如果此属性设为 0, 则可以将其关闭用于存储库连接。默认设置为 jco.client.snc_mode。仅适用于特殊情况。

repositoryRoundtripOptimization

 

启用 RFC_METADATA_GET API,在单个往返中提供存储库数据。

1
激活在 ABAP 系统中使用 RFC_METADATA_GET
0
在 ABAP 系统中取消激活 RFC_METADATA_GET

如果没有设置属性,则目的地最初执行远程调用来检查 RFC_METADATA_GET 可用。如果可用,则目的地将使用它。

注意: 如果存储库已初始化(例如,由于该仓库被其他目标使用),则此属性不起作用。通常,此属性与 ABAP 系统有关,所有目的地的值应与同一 ABAP 系统相同。如需后端先决条件,请参阅 1456826

跟踪配置选项

下表列出了在 SAP 目标数据存储中配置目的地的 trace 配置选项

名称

默认值

描述

trace

 

启用/禁用 RFC 跟踪(01)

cpicTrace

 

启用/禁用 CPIC trace [0..3]

290.2.3. 服务器配置

概述

服务器的配置在 SAP 组件的 serverDataStore 属性中维护。此映射中的每个条目都会配置与 SAP 实例不同的入站连接。每个条目的密钥是出站连接的名称,在服务器端点 URI 的 serverName 组件中使用,如 URI 格式部分中所述。

每个条目的值是 服务器数据 配置对象,org.fusesource.camel.component.sap.model.rfc.ServerDataImpl,用于定义入站 SAP 连接的配置。

服务器配置示例

下面的蓝图 XML 代码演示了如何使用名称 quickstartServer 创建示例服务器配置。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint ... >
    ...
    <!-- Configures the Inbound and Outbound SAP Connections -->
    <bean id="sap-configuration"
        class="org.fusesource.camel.component.sap.SapConnectionConfiguration">
        <property name="destinationDataStore">
            <map>
                <entry key="quickstartDest" value-ref="quickstartDestinationData" />
            </map>
        </property>
        <property name="serverDataStore">
            <map>
                <entry key="quickstartServer" value-ref="quickstartServerData" />
            </map>
        </property>
    </bean>

    <!-- Configures an Outbound SAP Connection -->
    <!-- *** Please enter the connection property values for your environment *** -->
    <bean id="quickstartDestinationData"
        class="org.fusesource.camel.component.sap.model.rfc.impl.DestinationDataImpl">
        <property name="ashost" value="example.com" />
        <property name="sysnr" value="00" />
        <property name="client" value="000" />
        <property name="user" value="username" />
        <property name="passwd" value="passowrd" />
        <property name="lang" value="en" />
    </bean>

    <!-- Configures an Inbound SAP Connection -->
    <!-- *** Please enter the connection property values for your environment ** -->
    <bean id="quickstartServerData"
        class="org.fusesource.camel.component.sap.model.rfc.impl.ServerDataImpl">
        <property name="gwhost" value="example.com" />
        <property name="gwserv" value="3300" />
        <!-- The following property values should not be changed -->
        <property name="progid" value="QUICKSTART" />
        <property name="repositoryDestination" value="quickstartDest" />
        <property name="connectionCount" value="2" />
    </bean>
</blueprint>

注意此示例如何配置目标连接 quickstartDest,该服务器将用于从远程 SAP 实例检索 meta-data。此目的地通过 repositoryDestination 选项在服务器数据中配置。如果您没有配置这个选项,则需要创建一个本地 meta-data 仓库(请参阅 第 290.2.4 节 “存储库配置”)。

例如,在配置上述 Blueprint XML 文件中的目的地后,您可以使用以下 URI 处理来自调用客户端的 BAPI_FLCUST_GETLIST 远程函数调用:

sap-srfc-server:quickstartServer:BAPI_FLCUST_GETLIST

所需选项

服务器数据配置对象所需的选项如下:

名称

默认值

描述

gwhost

 

应该注册服务器连接的网关主机。

gwserv

 

网关服务,即注册可以在其上执行的端口。为了解析服务名称 sapgwXXX,在 etc/services 中查找是由操作系统的网络层执行的。如果使用端口号而不是符号服务名称,则不会执行查找,不需要其他条目。

progid

 

注册注册的程序 ID。在 ABAP 系统中作为网关和目的地上的标识符。

repositoryDestination

 

指定服务器可以使用的目的地名称,以便从远程 SAP 服务器上托管的 meta-data 存储库检索 meta-data。

connectionCount

 

在网关中注册的连接数量。

保护网络连接选项

服务器数据配置对象的安全网络连接选项如下:

名称

默认值

描述

sncMode

 

安全网络连接(SNC)模式, 0 (off)或 1 (on)

sncQop

 

SNC 级的安全性,19

sncMyname

 

服务器的 SNC 名称。覆盖默认的 SNC 名称。通常,p:CN=JCoServer、O=ACompany、C=EN

sncLib

 

提供 SNC 服务的库的路径。如果没有提供此属性,则使用 jco.middleware.snc_lib 属性的值

其他选项

服务器数据配置对象的其它选项如下:

名称

默认值

描述

saprouter

 

SAP 路由器字符串,用于防火墙保护的系统,因此当使用该 ABAP 系统的网关注册服务器时,只能通过 SAProuter 访问它。典型的路由器字符串是 /H/firewall.hostname/H/

maxStartupDelay

 

失败时两个启动尝试之间的最长时间(以秒为单位)。每次启动失败后,等待时间从最初为 1 秒,直到达到最大值或服务器可以成功启动为止。

trace

 

启用/禁用 RFC 跟踪(01)

workerThreadCount

 

服务器连接使用的最大线程数。如果没有设置,则 connectionCount 的值被用作 workerThreadCount。最大线程数量不能超过 99。

workerThreadMinCount

 

服务器连接使用的最小线程数。如果没有设置,则 connectionCount 的值被用作 workerThreadMinCount

290.2.4. 存储库配置

概述

存储库的配置在 SAP 组件的 repositoryDataStore 属性中维护。此映射中的每个条目都配置不同的存储库。每个条目的密钥都是存储库的名称,此键也对应于此存储库所附加的服务器名称。

每个条目的值都是存储库数据配置对象 org.fusesource.camel.component.sap.model.rfc.RepositoryDataImpl,用于定义 meta-data 存储库的内容。存储库数据对象是功能模板配置对象的映射,org.fuesource.camel.component.sap.model.rfc.FunctionTemplateImpl.此映射中的每个条目都指定了功能模块的接口,每个条目的键是指定的功能模块的名称。

仓库数据示例

以下代码显示了配置 meta-data 存储库的简单示例:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint ... >
    ...
    <!-- Configures the sap-srfc-server component -->
    <bean id="sap-configuration"
        class="org.fusesource.camel.component.sap.SapConnectionConfiguration">
        <property name="repositoryDataStore">
            <map>
                <entry key="nplServer" value-ref="nplRepositoryData" />
            </map>
        </property>
    </bean>

    <!-- Configures a Meta-Data Repository -->
    <bean id="nplRepositoryData"
        class="org.fusesource.camel.component.sap.model.rfc.impl.RepositoryDataImpl">
        <property name="functionTemplates">
            <map>
                <entry key="BOOK_FLIGHT" value-ref="bookFlightFunctionTemplate" />
            </map>
        </property>
    </bean>
    ...
</blueprint>

功能模板属性

功能模块的接口由四个参数列表组成,它们通过根据 RFC 调用来回传输给 function 模块。每个参数列表各自包含一个或多个字段,每个字段都是 RFC 调用中传输的命名参数。支持以下参数列表和例外列表:

  • import 参数列表包含在 RFC 调用中发送到功能模块的参数值
  • export 参数列表 包含 RFC 调用中函数模块返回的参数值 ;
  • 更改参数列表 包含在 RFC 调用中由功能模块发送到和返回的参数值;
  • table 参数列表 包含在 RFC 调用中由功能模块发送到和返回的内部表值。
  • 功能模块的接口也由 ABAP 异常列表组成,在 RFC 调用中调用该模块时可能会引发这些异常。

功能模板描述了功能接口的每个参数列表中的名称和参数类型,以及函数引发 ABAP 异常。功能模板对象维护 meta-data 对象的五个属性列表,如下表所示。

属性

描述

importParameterList

列表字段 meta-data 对象列表 org.fusesource.camel.component.sap.model.rfc.ListFieldMeataDataImpl.指定在 RFC 调用到功能模块时发送的参数。

changingParameterList

列表字段 meta-data 对象列表 org.fusesource.camel.component.sap.model.rfc.ListFieldMeataDataImpl.指定在 RFC 调用中发送和接收到功能模块的参数。

exportParameterList

列表字段 meta-data 对象列表 org.fusesource.camel.component.sap.model.rfc.ListFieldMeataDataImpl.指定从 function 模块的 RFC 调用返回的参数。

tableParameterList

列表字段 meta-data 对象列表 org.fusesource.camel.component.sap.model.rfc.ListFieldMeataDataImpl.指定在 RFC 调用中发送和接收给函数模块的表参数。

exceptionList

ABAP 异常 meta-data 对象列表,org.fusesource.camel.component.sap.model.rfc.impl.AbapExceptionImpl.指定在 RFC 调用 function 模块时可能会引发 ABAP 异常。

功能模板示例

以下示例显示了如何配置功能模板的概述:

<bean id="bookFlightFunctionTemplate"
    class="org.fusesource.camel.component.sap.model.rfc.impl.FunctionTemplateImpl">
    <property name="importParameterList">
        <list>
            ...
        </list>
    </property>
    <property name="changingParameterList">
        <list>
            ...
        </list>
    </property>
    <property name="exportParameterList">
        <list>
            ...
        </list>
    </property>
    <property name="tableParameterList">
        <list>
            ...
        </list>
    </property>
    <property name="exceptionList">
        <list>
            ...
        </list>
    </property>
</bean>

列出字段 meta-data 属性

list 字段 meta-data 对象 org.fusesource.camel.component.sap.model.rfc.ListFieldMeataDataImpl 指定参数列表中字段的名称和类型。对于 elementary 参数字段(CHAR,DATE,BCD,TIME,BYTE,NUM,FLOAT,INT 1 ,INT1,INT2,DECF16,DECF34,STRING,XSTRING,下表列出了配置属性:

名称

默认值

描述

name

-

参数字段的名称。

type

-

字段的参数类型。

byteLength

-

非一致性布局的字节字段长度(以字节为单位)。这个值取决于参数类型。请参阅 第 290.5 节 “RFC 的消息正文”

unicodeByteLength

-

Unicode 布局的字段长度(以字节为单位)。这个值取决于参数类型。请参阅 第 290.5 节 “RFC 的消息正文”

decimals

0

字段值中的十进制数 ; 只需要参数类型 BCD 和 FLOAT。请参阅 第 290.5 节 “RFC 的消息正文”

optional

false

如果为 true,则字段是可选的,且不需要在 RFC 调用中设置

请注意,所有 elementary 参数字段要求 名称typebyteLengthunicodeByteLength 属性在字段 meta-data 对象中指定。另外,BCDFLOATDECF16DECF34 字段要求在字段 meta-data 对象中指定十进制属性。

对于类型为 TABLESTRUCTURE 的复杂参数字段,下表列出了可以在列表字段 meta-data 对象上设置的配置属性:

名称

默认值

描述

name

-

参数字段的名称

type

-

字段的参数类型

recordMetaData

-

结构或表的元数据。一个记录 meta-data 对象 org.fusesource.camel.component.sap.model.rfc.impl.RecordMetaDataImpl 会被传递在结构或表行中指定字段。

optional

false

如果为 true,则字段是可选的,且不需要在 RFC 调用中设置

请注意,所有复杂的参数字段都需要在字段 meta-data 对象中指定 名称typerecordMetaData 属性。recordMetaData 属性的值是一个记录字段 meta-data 对象,org.fusesource.camel.component.sap.model.rfc.impl.RecordMetaDataImpl 指定嵌套结构或表行的结构。

Elementary list 字段 meta-data 示例

以下 meta-data 配置指定一个一个可选的 24 位 packed BCD number 参数,它有两个十进制位置,名为 TICKET_PRICE

<bean    class="org.fusesource.camel.component.sap.model.rfc.impl.ListFieldMetaDataImpl">
    <property name="name" value="TICKET_PRICE" />
    <property name="type" value="BCD" />
    <property name="byteLength" value="12" />
    <property name="unicodeByteLength" value="24" />
    <property name="decimals" value="2" />
    <property name="optional" value="true" />
</bean>

复杂列表字段 meta-data 示例

以下 meta-data 配置指定一个名为 CONNINFO 所需的 TABLE 参数,其行结构由 connectionInfo 记录 meta-data 对象指定:

<bean    class="org.fusesource.camel.component.sap.model.rfc.impl.ListFieldMetaDataImpl">
    <property name="name" value="CONNINFO" />
    <property name="type" value="TABLE" />
    <property name="recordMetaData" ref="connectionInfo" />
</bean>

记录 meta-data 属性

记录元数据对象, org.fusesource.camel.component.sap.model.rfc.impl.RecordMetaDataImpl 指定嵌套的 STRUCTURETABLE 参数行的名称和内容。记录 meta-data 对象维护一个记录字段元数据对象列表,即 org.fusesource.camel.component.sap.model.rfc.FieldMetaDataImpl,用于指定驻留在嵌套结构或表行中的参数。

下表列出了在记录 meta-data 对象上设置的配置属性:

名称

默认值

描述

name

-

记录的名称。

recordFieldMetaData

-

记录字段 meta-data 对象列表 org.fusesource.camel.component.sap.model.rfc.FieldMetaDataImpl.指定结构中包含的字段。

注意

记录 meta-data 对象的所有属性都是必需的。

记录 meta-data 示例

以下示例演示了如何配置记录 meta-data 对象:

<bean    id="connectionInfo"
        class="org.fusesource.camel.component.sap.model.rfc.impl.RecordMetaDataImpl">
    <property name="name" value="CONNECTION_INFO" />
    <property name="recordFieldMetaData">
        <list>
            ...
        </list>
    </property>
</bean>

record 字段 meta-data 属性

记录字段 meta-data 对象 org.fusesource.camel.component.sap.model.rfc.FieldMetaDataImpl,使用结构指定参数字段的名称和类型。

记录字段 meta-data 对象类似于参数字段 meta-data 对象,但必须额外指定嵌套结构或表行中个别字段位置的偏移。必须计算单个字段的非Unicode 和 Unicode 误差,并指定自结构或行中前字段的 Unicode 字节长度的总和。请注意,在嵌套结构和表行中正确指定字段偏移会导致底层 JCo 和 ABAP 运行时的参数字段存储,从而重叠并防止 RFC 调用中的相应值传输。

对于 elementary 参数字段(CHAR,DATE,BCD,TIME,BYTE,NUM,FLOAT,INT 1 ,INT1,INT2,DECF16,DECF34,STRING,XSTRING),下表列出了配置属性: meta-data 对象:

名称

默认值

描述

name

-

参数字段的名称

type

-

字段的参数类型

byteLength

-

非一致性布局的字节字段长度(以字节为单位)。这个值取决于参数类型。请参阅 第 290.5 节 “RFC 的消息正文”

unicodeByteLength

-

Unicode 布局的字段长度(以字节为单位)。这个值取决于参数类型。请参阅 第 290.5 节 “RFC 的消息正文”

byteOffset

-

非Unicode 布局的字节字段偏移。这个偏移是所属结构中字段的字节位置。

unicodeByteOffset

-

Unicode 布局的字段偏移,以字节为单位。这个偏移是所属结构中字段的字节位置。

decimals

0

字段值中的十进制数 ; 仅参数类型 BCDFLOAT 需要。请参阅 第 290.5 节 “RFC 的消息正文”

对于类型为 TABLESTRUCTURE 的复杂参数字段,下表列出了在记录字段 meta-data 对象上设置的配置属性:

名称

默认值

描述

name

-

参数字段的名称

type

-

字段的参数类型

byteOffset

-

非Unicode 布局的字节字段偏移。这个偏移是所属结构中字段的字节位置。

unicodeByteOffset

-

Unicode 布局的字段偏移,以字节为单位。这个偏移是所属结构中字段的字节位置。

recordMetaData

-

结构或表的元数据。一个记录 meta-data 对象 org.fusesource.camel.component.sap.model.rfc.impl.RecordMetaDataImpl 会被传递在结构或表行中指定字段。

Elementary record 字段 meta-data 示例

以下 meta-data 配置指定了一个名为 ARR DATE 的 DATE 字段参数(如果非Unicode 布局为 170 字节),并在 Unicode 布局时位于 170 字节到外围结构中:

<bean    class="org.fusesource.camel.component.sap.model.rfc.impl.FieldMetaDataImpl">
    <property name="name" value="ARRDATE" />
    <property name="type" value="DATE" />
    <property name="byteLength" value="8" />
    <property name="unicodeByteLength" value="16" />
    <property name="byteOffset" value="85" />
    <property name="unicodeByteOffset" value="170" />
</bean>

复杂的记录字段 meta-data 示例

以下 meta-data 配置指定名为 FLTINFOSTRUCTURE 字段参数,其结构由 flightInfo 记录 meta-data 对象指定。参数位于包含结构的开头,出现非Unicode 和 Unicode 布局。

<bean    class="org.fusesource.camel.component.sap.model.rfc.impl.FieldMetaDataImpl">
    <property name="name" value="FLTINFO" />
    <property name="type" value="STRUCTURE" />
    <property name="byteOffset" value="0" />
    <property name="unicodeByteOffset" value="0" />
    <property name="recordMetaData" ref="flightInfo" />
</bean>

290.3. 消息标头

SAP 组件支持以下消息标头:

标头

描述

CamelSap.scheme

最后一次端点的 URI 方案,以处理消息。使用以下值之一:

sap-srfc-destination

sap-trfc-destination

sap-qrfc-destination

sap-srfc-server

sap-trfc-server

sap-idoc-destination

sap-idoclist-destination

sap-qidoc-destination

sap-qidoclist-destination

sap-idoclist-server

CamelSap.destinationName

用来处理消息的最后一个目的地端点的目的地名称。

CamelSap.serverName

用来处理消息的最后一个服务器端点的服务器名称。

CamelSap.queueName

用来处理消息的最后一个排队端点的队列名称。

CamelSap.rfcName

用来处理消息的最后一个 RFC 端点的 RFC 名称。

CamelSap.idocType

用于处理消息的最后一个 IDoc 端点的 IDoc 类型。

CamelSap.idocTypeExtension

IDoc 类型扩展(若有)来处理消息的最后一个 IDoc 端点。

CamelSap.systemRelease

系统发行版本(若有),以处理消息的最后一个 IDoc 端点。

CamelSap.applicationRelease

应用程序发布(若有),以处理消息的最后一个 IDoc 端点。

290.4. 交换属性

SAP 组件添加以下交换属性:

属性

描述

CamelSap.destinationPropertiesMap

包含交换遇到的每个 SAP 目标属性的映射。映射由目的地名称键,每个条目都是 java.util.Properties 对象,其中包含该目的地的配置属性。

CamelSap.serverPropertiesMap

包含交换遇到的每个 SAP 服务器属性的映射。该映射由服务器名称键化,每个条目都是 java.util.Properties 对象,其中包含该服务器的配置属性。

290.5. RFC 的消息正文

请求和响应对象

SAP 端点希望收到包含 SAP 请求对象的消息正文消息,并将返回包含 SAP 响应对象的消息正文。SAP 请求和响应是固定映射数据结构,其中包含命名的字段,每个字段都有预定义的数据类型。

请注意,SAP 请求中的 named 字段和响应特定于 SAP 端点,每个端点在 SAP 请求中定义参数并对其接受的响应。SAP 端点提供工厂方法来创建特定于它的请求和响应对象。

public class SAPEndpoint ... {
    ...
    public Structure getRequest() throws Exception;

    public Structure getResponse() throws Exception;
    ...
}

结构对象

SAP 请求和响应对象以 Java 中表示为一个结构对象,该对象支持 org.fusesource.camel.component.sap.model.rfc.Structure 接口。这个接口扩展了 java.util.Maporg.eclipse.emf.ecore.EObject 接口。

public interface Structure extends org.eclipse.emf.ecore.EObject,
                                        java.util.Map<String, Object> {

    <T> T get(Object key, Class<T> type);

}

结构对象中的字段值通过 map 界面中字段的 getter 方法访问。另外,结构接口提供了检索字段值的 type-restricted 方法。

结构对象使用 Eclipse Modeling Framework (EMF)在组件运行时中实施,并且支持框架的 EObject 接口。结构对象的实例已附加了 meta-data,用于定义和限制它提供的字段结构和内容。可以使用 EMF 提供的标准方法访问和内省此元数据。有关更多详细信息,请参阅 EMF 文档。

注意

尝试获取在结构对象上未定义的参数将返回 null。尝试设置结构上未定义的参数将抛出异常,并尝试设置带有错误类型的参数值。

如以下部分中所述,结构对象可以包含包含复杂字段类型、STRUCTURETABLE 的字段。请注意,创建这些类型的实例并不需要将它们添加到结构中。如果需要在所属结构中访问时,根据需要创建这些字段值的实例。

字段类型

驻留在 SAP 请求的结构对象或响应中的字段可以是 元素复杂的。elementary 字段包含一个 scalar 值,而复杂的字段则包含元素或复杂类型的一个或多个字段。

Elementary 字段类型

elementary 字段可以是字符、数字、十六进制或字符串字段类型。下表总结了可能位于结构对象中的元素字段类型:

字段类型

对应的 Java 类型

Byte Length

Unicode Byte Length

number Decimals Digits

描述

CHAR

java.lang.String

1 到 65535

1 到 65535

-

ABAP 类型 'C': Fixed sized 字符字符串

DATE

java.util.Date

8

16

-

ABAP Type 'D': Date (format: YYYYMMDD)

BCD

java.math.BigDecimal

1 到 16

1 到 16

0 到 14

ABAP 类型"P":打包的 BCD 编号.BCD 编号每字节包含两个数字。

时间

java.util.Date

6

12

-

ABAP Type 'T': Time (format: HHMMSS)

BYTE

byte[]

1 到 65535

1 到 65535

-

ABAP Type 'X':Fixed size byte 数组

NUM

java.lang.String

1 到 65535

1 到 65535

-

ABAP 类型 'N': Fixed sized numeric character string

浮点值

java.lang.Double

8

8

0 到 15

ABAP 类型 'F':浮动点号

INT

java.lang.Integer

4

4

-

ABAP Type 'I': 4 字节 Integer

INT2

java.lang.Integer

2

2

-

ABAP Type 'S': 2 字节 Integer

INT1

java.lang.Integer

1

1

-

ABAP Type 'B': 1byte Integer

DECF16

java.match.BigDecimal

8

8

16

ABAP Type 'decfloat16': 8 -byte Decimal Floating Point Number

DECF34

java.math.BigDecimal

16

16

34

ABAP Type 'decfloat34': 16 字节 Decimal Floating Point Number

字符串

java.lang.String

8

8

-

ABAP 类型 'G':变量长度字符字符串

XSTRING

byte[]

8

8

-

ABAP Type 'Y': Variable length byte 数组

字符字段类型

字符字段包含一个固定大小字符字符串,可以在底层 JCo 和 ABAP 运行时使用非Unicode 或 Unicode 字符编码。非 Unicode 字符字符串对每字节的一个字符进行编码。Unicode 字符字符串使用 UTF-16 编码在两个字节中编码。字符字段值以 java.lang.String 对象表示,底层 JCo 运行时负责转换为他们的 ABAP 表示。

字符字段在其关联的 字节 长度和 unicodeByteLength 属性中声明了字段长度,决定了每个编码系统中字段字符字符串的长度。

CHAR
CHAR 字符字段是一个包含字母数字字符的文本字段,对应于 ABAP 类型 C。
NUM
NUM 字符字段是一个数字文本字段,仅包含数字字符,对应于 ABAP 类型 N。
DATE
DATE 字符字段是 8 个字符的日期字段,其年份、月份和每日格式为 YYYYMMDD,对应于 ABAP 类型 D。
时间
TIME 字符字段是 6 个字符的时间字段,其小时、分钟和秒被格式化为 HHMMSS,对应于 ABAP 类型 T。

数字字段类型

数字字段包含一个数字。支持以下数字字段类型:

INT
INT numeric 字段是基础 JCo 和 ABAP 运行时的 4 字节整数值,并对应于 ABAP 类型 I。一个 INT 字段值以 java.lang.Integer 对象中表示。
INT2
INT2 numeric 字段是基础 JCo 和 ABAP 运行时的双字节整数值,并对应于 ABAP 类型 S。一个 INT2 字段值在 Java 中以 java.lang.Integer 对象的形式表示。
INT1
INT1 字段是基础 JCo 和 ABAP 运行时值中的单字节整数值,并对应于 ABAP 类型 B。一个 INT1 字段值以 java.lang.Integer 对象中表示。
浮点值
FLOAT 字段是二进制浮动点数字段,作为基础 JCo 和 ABAP 运行时的 8 字节字节值存储,并对应于 ABAP 类型 F。A FLOAT 字段声明字段的十进制数字的数量,该值包含在其关联的十进制属性中。如果是 FLOAT 字段,此十进制属性可以有 1 到 15 位之间的值。FLOAT 字段值在 Java 中表示为 java.lang.Double 对象。
BCD
BCD 字段是二进制代码的十进制字段,它使用底层 JCo 和 ABAP 运行时的 1 到 16 字节装号,并对应于 ABAP 类型 P。打包的数字为每个字节保存两个十进制数字。BCD 字段在其关联的 字节长度和 unicodeByteLength 属性中声明其字段长度。对于 BCD 字段,这些属性可以在 1 到 16 字节之间有一个值,且这两个属性的值都相同。BCD 字段声明字段的值包含在其关联的十进制属性中的十进制数字数。如果是 BCD 字段,此十进制属性可以有 1 位和 14 位数字之间的值。BCD 字段值在 Java 中表示为 java.math.BigDecimal
DECF16
DECF16 字段是以 8 字节 IEEE 754十进制64 浮动点值保存在底层 JCo 和 ABAP 运行时的十进制浮动点,并对应于 ABAP 类型 decfloat16DECF16 字段的值具有 16 十进制数字。DECF16 字段的值在 Java 中以 java.math.BigDecimal 的形式表示。
DECF34
DECF34 字段是一个十进制浮动点,它使用底层 JCo 和 ABAP 运行时的 16 字节 IEEE 754 十进制浮动点值,并对应于 ABAP 类型 decfloat34DECF34 字段的值具有 34 个十进制数字。DECF34 字段的值在 Java 中以 java.math.BigDecimal 的形式表示。

十六进制字段类型

十六进制字段包含原始二进制数据。支持以下十六进制字段类型:

BYTE
BYTE 字段是固定的字节字符串,作为基础 JCo 和 ABAP 运行时的字节数组,对应于 ABAP 类型 X。A BYTE 字段在与其关联的 字节长度和 unicodeByteLength 属性中声明其字段长度。对于 BYTE 字段,这些属性可以在 1 到 65535 字节之间有一个值,且这两个属性的值都相同。BYTE 字段的值在 Java 中表示为 byte[] 对象。

字符串字段类型

string 字段引用变量长度字符串值。该字符串值的长度在运行时不会固定。字符串值的存储会在底层 JCo 和 ABAP 运行时动态创建。字符串字段本身的存储已被修复,仅包含一个字符串标头。

字符串
STRING 字段引用字符字符串,并作为 8 字节值存储在底层 JCo 和 ABAP 运行时。它对应于 ABAP 类型 G。STRING 字段的值以 java.lang.String 对象表示。
XSTRING
XSTRING 字段引用字节字符串,并作为 8 字节值存储在底层 JCo 和 ABAP 运行时。它对应于 ABAP 类型 Y。STRING 字段的值以字节 []对象表示

复杂字段类型

复杂的字段可以是结构或表字段类型。下表总结了这些复杂的字段类型。

字段类型

对应的 Java 类型

Byte Length

Unicode Byte Length

number Decimals Digits

描述

结构

org.fusesource.camel.component.sap.model.rfc.Structure

单个字段字节长度总数

单个字段 Unicode 字节长度的总数

-

ABAP 类型 'u' 和 'v': Heterogeneous 结构

org.fusesource.camel.component.sap.model.rfc.Table

行结构的字节长度

行结构的 Unicode 字节长度

-

ABAP Type 'h': Table

结构字段类型

STRUCTURE 字段包含一个 结构 对象,并以 ABAP 结构记录的形式存储在底层 JCo 和 ABAP 运行时。它对应于 ABAP 类型 uvSTRUCTURE 字段的值在 Java 中作为带有接口 org.fusesource.camel.component.sap.model.rfc.Structure 的结构对象来表示。

表字段类型

TABLE 字段包含一个表对象,以 ABAP 内部表的形式存储在底层 JCo 和 ABAP 运行时。它对应于 ABAP 类型 h。字段的值由带有接口 org.fusesource.camel.component.sap.model.rfc.Table 的表对象中的表对象来表示。

表对象

表对象是包含相同结构的行结构的同构列表数据结构。这个接口扩展了 java.util.Listorg.eclipse.emf.ecore.EObject 接口。

public interface Table<S extends Structure>
    extends org.eclipse.emf.ecore.EObject,
    java.util.List<S> {

    /**
     * Creates and adds table row at end of row list
     */
    S add();

    /**
     * Creates and adds table row at index in row list
     */
    S add(int index);

}

使用列表接口中定义的标准方法访问和管理表对象中的行列表。除表接口外,提供了两种工厂方法,可用于创建和添加结构对象到行列表中。

表对象使用 Eclipse Modeling Framework (EMF)在组件运行时中实施,并且支持框架的 EObject 接口。表对象的实例已附加了 meta-data,后者定义和限制它所提供的行的结构和内容。可以使用 EMF 提供的标准方法访问和内省此元数据。有关更多详细信息,请参阅 EMF 文档。

注意

尝试添加或设置错误类型的行结构值将抛出异常。

290.6. IDoc 的消息正文

IDoc 消息类型

当使用 IDoc Camel SAP 端点时,消息正文类型取决于您使用的特定端点。

对于 sap-idoc-destination 端点或 sap-qidoc-destination 端点,消息正文为 Document 类型:

org.fusesource.camel.component.sap.model.idoc.Document

对于 sap-idoclist-destination 端点、sap-qidoclist-destination 端点或 sap-idoclist-server 端点,消息正文为 DocumentList 类型:

org.fusesource.camel.component.sap.model.idoc.DocumentList

IDoc 文档模型

对于 Camel SAP 组件,使用 Eclipse 建模框架(EMF)对 IDoc 文档进行建模,该文档围绕底层 SAP IDoc API 提供打包程序 API。这个模型中最重要的类型有:

org.fusesource.camel.component.sap.model.idoc.Document
org.fusesource.camel.component.sap.model.idoc.Segment

文档 类型表示 IDoc 文档实例。总之,Document 接口公开以下方法:

// Java
package org.fusesource.camel.component.sap.model.idoc;
...
public interface Document extends EObject {
    // Access the field values from the IDoc control record
    String getArchiveKey();
    void setArchiveKey(String value);
    String getClient();
    void setClient(String value);
    ...

    // Access the IDoc document contents
    Segment getRootSegment();
}

以下一种方法是 Document 接口公开:

访问控制记录的方法
大多数方法是访问或修改 IDoc 控制记录的字段值。这些方法的格式为 AttributeName,AttributeName,其中 AttributeName 是字段值的名称(请参阅 表 290.2 “IDoc 文档属性”)。
访问文档内容的方法

getRoot Segment 方法提供对文档内容(IDoc 数据记录)的访问,以分段对象返回内容。每个分段对象可以包含任意数量的子片段,片段可以嵌套在任意程度上。

但请注意,片段层次结构的精确布局由文档的特定 IDoc 类型定义。在创建(或读取)片段层次结构时,您必须确保遵循 IDoc 类型定义的确切结构。

分段类型用于访问 IDoc 文档的数据记录,其中片段根据文档的 IDoc 类型定义的结构而出。在提纲中,Segment 接口公开以下方法:

// Java
package org.fusesource.camel.component.sap.model.idoc;
...
public interface Segment extends EObject, java.util.Map<String, Object> {
    // Returns the value of the '<em><b>Parent</b></em>' reference.
    Segment getParent();

    // Return a immutable list of all child segments
    <S extends Segment> EList<S> getChildren();

    // Returns a list of child segments of the specified segment type.
    <S extends Segment> SegmentList<S> getChildren(String segmentType);

    EList<String> getTypes();

    Document getDocument();

    String getDescription();

    String getType();

    String getDefinition();

    int getHierarchyLevel();

    String getIdocType();

    String getIdocTypeExtension();

    String getSystemRelease();

    String getApplicationRelease();

    int getNumFields();

    long getMaxOccurrence();

    long getMinOccurrence();

    boolean isMandatory();

    boolean isQualified();

    int getRecordLength();

    <T> T get(Object key, Class<T> type);
}

getChildren (String segmentType) 方法对于向网段添加新(嵌套)子项特别有用。它返回一个类型为 SegmentList 的对象,它的定义如下:

// Java
package org.fusesource.camel.component.sap.model.idoc;
...
public interface SegmentList<S extends Segment> extends EObject, EList<S> {
    S add();

    S add(int index);
}

因此,要创建 E1SCU_CRE 类型的数据记录,您可以使用类似如下的 Java 代码:

Segment rootSegment = document.getRootSegment();

Segment E1SCU_CRE_Segment = rootSegment.getChildren("E1SCU_CRE").add();

创建文档实例示例

例如: 例 290.1 “在 Java 中创建 IDoc 文档” 演示了如何使用 IDoc 类型 FLCUSTOMER_CREATEFROMDATA01 在 Java 中创建 IDoc 模型 API。

例 290.1. 在 Java 中创建 IDoc 文档

// Java
import org.fusesource.camel.component.sap.model.idoc.Document;
import org.fusesource.camel.component.sap.model.idoc.Segment;
import org.fusesource.camel.component.sap.util.IDocUtil;

import org.fusesource.camel.component.sap.model.idoc.Document;
import org.fusesource.camel.component.sap.model.idoc.DocumentList;
import org.fusesource.camel.component.sap.model.idoc.IdocFactory;
import org.fusesource.camel.component.sap.model.idoc.IdocPackage;
import org.fusesource.camel.component.sap.model.idoc.Segment;
import org.fusesource.camel.component.sap.model.idoc.SegmentChildren;
...
//
// Create a new IDoc instance using the modelling classes
//

// Get the SAP Endpoint bean from the Camel context.
// In this example, it's a 'sap-idoc-destination' endpoint.
SapTransactionalIDocDestinationEndpoint endpoint =
    exchange.getContext().getEndpoint(
        "bean:SapEndpointBeanID",
        SapTransactionalIDocDestinationEndpoint.class
    );

// The endpoint automatically populates some required control record attributes
Document document = endpoint.createDocument()

// Initialize additional control record attributes
document.setMessageType("FLCUSTOMER_CREATEFROMDATA");
document.setRecipientPartnerNumber("QUICKCLNT");
document.setRecipientPartnerType("LS");
document.setSenderPartnerNumber("QUICKSTART");
document.setSenderPartnerType("LS");

Segment rootSegment = document.getRootSegment();

Segment E1SCU_CRE_Segment = rootSegment.getChildren("E1SCU_CRE").add();

Segment E1BPSCUNEW_Segment = E1SCU_CRE_Segment.getChildren("E1BPSCUNEW").add();
E1BPSCUNEW_Segment.put("CUSTNAME", "Fred Flintstone");
E1BPSCUNEW_Segment.put("FORM", "Mr.");
E1BPSCUNEW_Segment.put("STREET", "123 Rubble Lane");
E1BPSCUNEW_Segment.put("POSTCODE", "01234");
E1BPSCUNEW_Segment.put("CITY", "Bedrock");
E1BPSCUNEW_Segment.put("COUNTR", "US");
E1BPSCUNEW_Segment.put("PHONE", "800-555-1212");
E1BPSCUNEW_Segment.put("EMAIL", "fred@bedrock.com");
E1BPSCUNEW_Segment.put("CUSTTYPE", "P");
E1BPSCUNEW_Segment.put("DISCOUNT", "005");
E1BPSCUNEW_Segment.put("LANGU", "E");

文档属性

表 290.2 “IDoc 文档属性” 显示您可以在 Document 对象上设置的控制记录属性。

表 290.2. IDoc 文档属性

属性长度SAP 字段描述

archiveKey

70

ARCKEY

EDI 归档密钥

client

3

MANDT

客户端

creationDate

8

CREDAT

创建日期 IDoc

creationTime

6

CRETIM

创建时间 IDoc

方向

1

直接

方向

eDIMessage

14

REFMES

引用消息

eDIMessageGroup

14

REFGRP

引用消息组

eDIMessageType

6

STDMES

EDI 消息类型

eDIStandardFlag

1

STD

EDI 标准

eDIStandardVersion

6

STDVRS

EDI 标准的版本

eDITransmissionFile

14

REFINT

引用交换文件

iDocCompoundType

8

DOCTYP

IDoc 类型

iDocNumber

16

DOCNUM

IDoc number

iDocSAPRelease

4

DOCREL

SAP Release of IDoc

iDocType

30

IDOCTP

基本 IDoc类型的名称

iDocTypeExtension

30

CIMTYP

扩展类型的名称

messageCode

3

MESCOD

逻辑消息代码

messageFunction

3

MESFCT

逻辑消息功能

messageType

30

MESTYP

逻辑消息类型

outputMode

1

OUTMOD

输出模式

recipientAddress

10

RCVSAD

接收器地址(SADR)

recipientLogicalAddress

70

RCVLAD

接收器的逻辑地址

recipientPartnerFunction

2

RCVPFC

接收器的合作伙伴功能

recipientPartnerNumber

10

RCVPRN

合作伙伴接收器数量

recipientPartnerType

2

RCVPRT

合作伙伴类型的接收器

recipientPort

10

RCVPOR

接收器端口(SAP 系统、EDI 子系统)

senderAddress

 

SNDSAD

发件人地址(SADR)

senderLogicalAddress

70

SNDLAD

发件人的逻辑地址

senderPartnerFunction

2

SNDPFC

sender 的合作伙伴功能

senderPartnerNumber

10

SNDPRN

合作伙伴发件人数量

senderPartnerType

2

SNDPRT

合作伙伴的发件人类型

senderPort

10

SNDPOR

发件人端口(SAP 系统、EDI 子系统)

序列化

20

SERIAL

EDI/ALE: Serialization 字段

status

2

状态

IDoc 的状态

testFlag

1

测试

test 标记

在 Java 中设置文档属性

在 Java 中设置控制记录属性时(来自 表 290.2 “IDoc 文档属性”)时,会遵循 Java bean 属性的常规约定。也就是说,可以通过 getNamesetName 方法来访问 name 属性,以获取和设置属性值。例如,iDocTypeiDocTypeExtensionmessageType 属性可按照 文档 对象设置如下:

// Java
document.setIDocType("FLCUSTOMER_CREATEFROMDATA01");
document.setIDocTypeExtension("");
document.setMessageType("FLCUSTOMER_CREATEFROMDATA");

在 XML 中设置文档属性

在 XML 中设置控制记录属性时,必须在 idoc:Document 元素上设置属性。例如,iDocTypeiDocTypeExtensionmessageType 属性可以设置如下:

<?xml version="1.0" encoding="ASCII"?>
<idoc:Document ...
               iDocType="FLCUSTOMER_CREATEFROMDATA01"
               iDocTypeExtension=""
               messageType="FLCUSTOMER_CREATEFROMDATA" ... >
    ...
</idoc:Document>

290.7. 事务支持

BAPI 事务模型

SAP 组件支持 BAPI 事务模型用于与 SAP 进行出站通信。如果需要,如果将含有 transacted 选项设为 true 的 URL 的 URL 的目标端点,在端点的出站连接上启动有状态会话,并通过交换注册 Camel Synchronization 对象。此同步对象将调用 BAPI 服务方法 BAPI_TRANSACTION_COMMIT,并在处理消息交换时结束有状态会话。如果消息交换的处理失败,同步对象将调用 BAPI_TRANSACTION_ROLLBACK 并结束有状态会话。

RFC 事务模型

tRFC 协议通过使用唯一事务标识符(TID)识别每个事务请求(TID)来实现 AT-MOST-ONCE 交付和处理保证。TID 配有协议中发送的每个请求。使用 tRFC 协议发送应用程序必须在发送请求时识别具有唯一 TID 的请求实例。应用程序可以多次发送带有给定 TID 的请求,但协议可确保请求在接收系统中最多交付并处理。当遇到通信或系统错误时,应用程序可以选择在发送请求时重新发送带有给定 TID 的请求,因此与在接收系统中是否交付并处理了该请求的问题。通过在遇到通信错误时重新发送请求,使用 tRFC 协议的客户端应用程序可以确保 EXACTLY-ONCE 交付并处理请求的保证。

要使用哪些事务模型?

BAPI 事务是一个应用程序级别事务,它有意义了 ACID 可保证由 BAPI 方法或 SAP 数据库中 RFC 功能执行的持久性数据更改。RFC 事务是一种通信事务,以合理方式提供保证(AT-MOST-ONCE、EXACTLY-ONCE、EXACTLY-ONCE-IN-ORDER)请求 BAPI 方法和/或 RFC 功能。

事务性 RFC 目标端点

以下目的地端点支持 RFC 事务:

  • sap-trfc-destination
  • sap-qrfc-destination

单个 Camel 路由可以包含多个事务 RFC 目标端点,将消息发送到多个 RFC 目的地,甚至多次将消息发送到同一 RFC 目标。这意味着,Camel SAP 组件可能需要为通过路由的每个 Exchange 对象跟踪 许多 事务 ID (TID)。现在,如果路由处理失败且必须重试,则情况会变得非常复杂。RFC 事务语义要求每个 RFC 目的地必须与路由一同调用,该路由必须使用第一次使用时所用的相同 TID (以及每个目的地的 TID 相互不同)。换句话说,Camel SAP 组件必须跟踪使用哪些 TID 并在该路由中使用,并记住这些信息,以便 TID 可以按照正确的顺序重新显示。

默认情况下,Camel 不提供一种机制,使 Exchange 能够知道路由中的位置。要提供这样的机制,需要在 Camel 运行时安装 CurrentProcessorDefinitionInterceptStrategy 拦截器。此拦截器必须安装到 Camel 运行时,以便 Camel SAP 组件跟踪路由中的 TID。有关如何配置拦截器的详情,请参考 “拦截器用于 tRFC 和 qRFC 目的地”一节

事务性 RFC 服务器端点

以下服务器端点支持 RFC 事务:

  • sap-trfc-server

当 Camel 交换处理事务请求遇到处理错误时,Camel 通过其标准错误处理机制来处理错误。如果 Camel 路由处理过程被配置为将错误传播到调用者,发起交换的 SAP 服务器端点会注意到失败,发送 SAP 系统会收到该错误通知。发送 SAP 系统随后可以通过使用相同的 TID 发送另一个事务请求来再次处理请求。

290.8. RFC 的 XML Serialization

概述

SAP 请求和响应对象支持 XML 序列化格式,使这些对象能够被序列化和 XML 文档。

XML 命名空间

存储库中每个 RFC 都定义了用于组成其 Request 和 Response 对象的序列化形式元素的特定 XML 命名空间。这个命名空间 URL 的形式如下:

http://sap.fusesource.org/rfc/<Repository Name>/<RFC Name>

RFC 命名空间 URL 有一个通用 http://sap.fusesource.org/rfc 前缀,后跟定义 RFC 元数据的存储库的名称。URL 中的最后一个组件是 RFC 本身的名称。

请求和响应 XML 文档

SAP 请求对象将序列化为 XML 文档,其中包含名为 Request 的文档根目录元素,且由请求 RFC 的命名空间的范围划分。

<?xml version="1.0" encoding="ASCII"?>
<BOOK_FLIGHT:Request
     xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
    ...
</BOOK_FLIGHT:Request>

SAP 响应对象将按照名为 Response 的文档根元素序列化为 XML 文档,并归响应 RFC 的命名空间的范围进行序列化。

<?xml version="1.0" encoding="ASCII"?>
<BOOK_FLIGHT:Response
     xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
    ...
</BOOK_FLIGHT:Response>

结构字段

参数列表中的结构字段或嵌套结构被序列化为元素。serialized 结构的元素名称对应于其所驻留的参数列表、结构或表行条目中结构的字段名称。

<BOOK_FLIGHT:FLTINFO
     xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
    ...
</BOOK_FLIGHT:FLTINFO>

请注意,RFC 命名空间中的结构元素的名称与定义结构的记录元数据数据对象的名称对应,如下例所示:

<xs:schema
     targetNamespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
     xmlns:xs="http://www.w3.org/2001/XMLSchema">
    ...
    <xs:complexType name="FLTINFO_STRUCTURE”>
    ...
    </xs:complexType>
    ...
</xs:schema>

在指定 JAXB bean 到 marshal 和 unmarshal 将出现在 第 290.12 节 “示例 3:处理 SAP 的请求” 中时,这种区别将很重要。

表字段

参数列表中的表字段或嵌套结构被序列化为元素。serialized 结构的元素名称将与所驻留的参数列表、结构或表行条目中的表的字段名称对应。table 元素将包含一系列行元素,用于保存表行条目的序列化值。

<BOOK_FLIGHT:CONNINFO
     xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
    <row ... > ... </row>
    ...
    <row ... > ... </row>
</BOOK_FLIGHT:CONNINFO>

请注意,RFC 命名空间中的 table 元素的类型的名称将与记录元数据对象的名称对应,后者定义 _TABLE 后缀的表格行结构。RFC 名称中的表行元素的类型对应于记录元数据对象的名称,该对象定义了表的行结构,如下例中所示:

<xs:schema
     targetNamespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT"
     xmlns:xs="http://www.w3.org/2001/XMLSchema">
    ...
    <xs:complextType name="CONNECTION_INFO_STRUCTURE_TABLE”>
        <xs:sequence>
            <xs:element
                name="row”
                minOccures="0”
                maxOccurs="unbounded”
                type="CONNECTION_INFO_STRUCTURE”/>
            ...
            <xs:sequence>
        </xs:sequence>
    </xs:complexType>

    <xs:complextType name="CONNECTION_INFO_STRUCTURE”>
            ...
    </xs:complexType>
    ...
</xs:schema>

在指定 JAXB bean 到 marshal 和 unmarshal 将出现在 第 290.12 节 “示例 3:处理 SAP 的请求” 中时,这种区别将很重要。

元素字段

参数列表中的元素字段或嵌套结构在带参数列表或结构的元素上被序列化为属性。serialized 字段的属性名称对应于所驻留的参数列表、结构或表行条目的字段名称,如下例所示:

<?xml version="1.0" encoding="ASCII"?>
<BOOK_FLIGHT:Request
     xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT"
     CUSTNAME="James Legrand"
    PASSFORM="Mr"
    PASSNAME="Travelin Joe"
    PASSBIRTH="1990-03-17T00:00:00.000-0500"
    FLIGHTDATE="2014-03-19T00:00:00.000-0400"
    TRAVELAGENCYNUMBER="00000110"
    DESTINATION_FROM="SFO"
    DESTINATION_TO="FRA"/>

日期和时间格式

日期和时间字段使用以下格式序列化为属性值:

yyyy-MM-dd'T'HH:mm:ss.SSSZ

日期字段只会按年、月份、日期和时区组件集进行序列化:

DEPDATE="2014-03-19T00:00:00.000-0400"

时间字段只会按小时、分钟、第二个、millisecond 和 timezone 组件集进行序列化:

DEPTIME="1970-01-01T16:00:00.000-0500"

290.9. IDoc 的 XML Serialization

概述

IDoc 消息正文可以序列化为 XML 字符串格式,并提供内置类型转换器的帮助。

XML 命名空间

每个序列化 IDoc 均与 XML 命名空间关联,其格式为以下通用格式:

http://sap.fusesource.org/idoc/repositoryName/idocType/idocTypeExtension/systemRelease/applicationRelease

repositoryName (远程 SAP meta-data 存储库的名称)和 idocType (IDoc 文档类型)是必需的,但命名空间的其他组件可以留空。例如,您可以有一个类似以下的 XML 命名空间:

http://sap.fusesource.org/idoc/MY_REPO/FLCUSTOMER_CREATEFROMDATA01///

内置类型转换器

Camel SAP 组件具有一个内置类型转换器,它能够将 Document 对象或 DocumentList 对象转换为 String 类型。

例如,要将 Document 对象序列化为 XML 字符串,您只需向 XML DSL 中的路由中添加以下行:

<convertBodyTo type="java.lang.String"/>

您还可以使用此方法将 XML 消息序列化为 Document 对象。例如,假设当前消息正文是一个序列化 XML 字符串,您可以通过将以下行添加到 XML DSL 中的路由将其重新转换为 Document 对象:

<convertBodyTo type="org.fusesource.camel.component.sap.model.idoc.Document"/>

XML 格式的 IDoc 消息正文示例

当您将 IDoc 消息转换为 字符串 时,它将被序列化为 XML 文档,其中 root 元素是 idoc:Document (表示单个文档)或 idoc:DocumentList (文档列表)。例 290.2 “IDoc Message Body in XML” 显示一个 IDoc 文档,已序列化为 idoc:Document 元素。

例 290.2. IDoc Message Body in XML

<?xml version="1.0" encoding="ASCII"?>
<idoc:Document
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:FLCUSTOMER_CREATEFROMDATA01---="http://sap.fusesource.org/idoc/XXX/FLCUSTOMER_CREATEFROMDATA01///"
    xmlns:idoc="http://sap.fusesource.org/idoc"
    creationDate="2015-01-28T12:39:13.980-0500"
    creationTime="2015-01-28T12:39:13.980-0500"
    iDocType="FLCUSTOMER_CREATEFROMDATA01"
    iDocTypeExtension=""
    messageType="FLCUSTOMER_CREATEFROMDATA"
    recipientPartnerNumber="QUICKCLNT"
    recipientPartnerType="LS"
    senderPartnerNumber="QUICKSTART"
    senderPartnerType="LS">
  <rootSegment xsi:type="FLCUSTOMER_CREATEFROMDATA01---:ROOT" document="/">
    <segmentChildren parent="//@rootSegment">
      <E1SCU_CRE parent="//@rootSegment" document="/">
        <segmentChildren parent="//@rootSegment/@segmentChildren/@E1SCU_CRE.0">
          <E1BPSCUNEW parent="//@rootSegment/@segmentChildren/@E1SCU_CRE.0"
              document="/"
              CUSTNAME="Fred Flintstone" FORM="Mr."
              STREET="123 Rubble Lane"
              POSTCODE="01234"
              CITY="Bedrock"
              COUNTR="US"
              PHONE="800-555-1212"
              EMAIL="fred@bedrock.com"
              CUSTTYPE="P"
              DISCOUNT="005"
              LANGU="E"/>
        </segmentChildren>
      </E1SCU_CRE>
    </segmentChildren>
  </rootSegment>
</idoc:Document>

290.10. 示例 1:从 SAP 读取数据

概述

本例演示了从 SAP 读取 FlightCustomer 业务对象数据的路由。路由会调用 FlightCustomer BAPI 方法 BAPI_FLCUST_GETLIST 使用 SAP 同步 RFC 目标端点来检索数据。

用于路由的 Java DSL

示例路由的 Java DSL 如下:

from("direct:getFlightCustomerInfo")
    .to("bean:createFlightCustomerGetListRequest")
    .to("sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST")
    .to("bean:returnFlightCustomerInfo");

用于路由的 XML DSL

同一路由的 Spring DSL 如下:

<route>
    <from uri="direct:getFlightCustomerInfo"/>
    <to uri="bean:createFlightCustomerGetListRequest"/>
    <to uri="sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST"/>
    <to uri="bean:returnFlightCustomerInfo"/>
</route>

createFlightCustomerGetListRequest bean

createFlightCustomerGetListRequest bean 负责在其交换方法中构建 SAP 请求对象,这些方法用于后续 SAP 端点 RFC 调用。以下代码片段演示了构建请求对象的操作序列:

public void create(Exchange exchange) throws Exception {

    // Get SAP Endpoint to be called from context.
    SapSynchronousRfcDestinationEndpoint endpoint =
        exchange.getContext().getEndpoint("sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST",
                                                 SapSynchronousRfcDestinationEndpoint.class);

    // Retrieve bean from message containing Flight Customer name to
    // look up.
    BookFlightRequest bookFlightRequest =
        exchange.getIn().getBody(BookFlightRequest.class);

    // Create SAP Request object from target endpoint.
    Structure request = endpoint.getRequest();

    // Add Customer Name to request if set
    if (bookFlightRequest.getCustomerName() != null &&
        bookFlightRequest.getCustomerName().length() > 0) {
            request.put("CUSTOMER_NAME",
                          bookFlightRequest.getCustomerName());
        }
    } else {
        throw new Exception("No Customer Name");
    }

    // Put request object into body of exchange message.
    exchange.getIn().setBody(request);
}

returnFlightCustomerInfo bean

returnFlightCustomerInfo bean 负责在其从上一 SAP 端点接收的交换方法中提取 SAP 响应对象的数据。以下代码片段演示了一系列操作,从响应对象中提取数据:

public void createFlightCustomerInfo(Exchange exchange) throws Exception {

    // Retrieve SAP response object from body of exchange message.
    Structure flightCustomerGetListResponse =
        exchange.getIn().getBody(Structure.class);

    if (flightCustomerGetListResponse == null) {
        throw new Exception("No Flight Customer Get List Response");
    }

    // Check BAPI return parameter for errors
    @SuppressWarnings("unchecked")
    Table<Structure> bapiReturn =
        flightCustomerGetListResponse.get("RETURN", Table.class);
    Structure bapiReturnEntry = bapiReturn.get(0);
    if (bapiReturnEntry.get("TYPE", String.class) != "S") {
        String message = bapiReturnEntry.get("MESSAGE", String.class);
        throw new Exception("BAPI call failed: " + message);
    }

    // Get customer list table from response object.
    @SuppressWarnings("unchecked")
    Table<? extends Structure> customerList =
        flightCustomerGetListResponse.get("CUSTOMER_LIST", Table.class);

    if (customerList == null || customerList.size() == 0) {
        throw new Exception("No Customer Info.");
    }

    // Get Flight Customer data from first row of table.
    Structure customer = customerList.get(0);

    // Create bean to hold Flight Customer data.
    FlightCustomerInfo flightCustomerInfo = new FlightCustomerInfo();

    // Get customer id from Flight Customer data and add to bean.
    String customerId = customer.get("CUSTOMERID", String.class);
    if (customerId != null) {
        flightCustomerInfo.setCustomerNumber(customerId);
    }

    ...

    // Put bean into body of exchange message.
    exchange.getIn().setHeader("flightCustomerInfo", flightCustomerInfo);

}

290.11. 示例 2:编写到 SAP 的数据

概述

本例演示了一个路由,它在 SAP 中创建 FlightTrip 业务对象实例。路由调用 FlightTrip BAPI 方法 BAPI_FLTRIP_CREATE 并使用目的地端点来创建对象。

用于路由的 Java DSL

示例路由的 Java DSL 如下:

from("direct:createFlightTrip")
    .to("bean:createFlightTripRequest")
    .to("sap-srfc-destination:nplDest:BAPI_FLTRIP_CREATE?transacted=true")
    .to("bean:returnFlightTripResponse");

用于路由的 XML DSL

同一路由的 Spring DSL 如下:

<route>
    <from uri="direct:createFlightTrip"/>
    <to uri="bean:createFlightTripRequest"/>
    <to uri="sap-srfc-destination:nplDest:BAPI_FLTRIP_CREATE?transacted=true"/>
    <to uri="bean:returnFlightTripResponse"/>
</route>

事务支持

请注意,SAP 端点的 URL 将已翻译 选项设置为 true。如 第 290.7 节 “事务支持” 中所述,当启用此选项时,端点可确保在调用 RFC 调用前已启动了 SAP 事务会话。由于此端点的 RFC 在 SAP 中创建新数据,因此必须在 SAP 中实现路由更改所必需的。

填充请求参数

createFlightTripRequestreturnFlightTripResponse Bean 负责将请求参数填充到 SAP 请求中,并分别从 SAP 响应中提取响应参数,遵循上例中所示的相同操作序列。

290.12. 示例 3:处理 SAP 的请求

概述

本例演示了一个路由,该路由处理从 SAP 到 BOOK_FLIGHT RFC 的请求,该路由实施该路由。此外,它展示了组件的 XML 序列化支持,使用 JAXB 总结和 marshal SAP 请求对象,并对自定义 Bean 的响应对象。

此路由代表旅游代理 FlightTrip 业务对象 FlightCustomer。路由首先不会编出 SAP 服务器端点接收的 SAP 请求对象到自定义 JAXB bean。然后,这个自定义 bean 可以在交换中多播到三个子路由,后者收集旅游代理、航班连接和乘客信息以创建航班行程。最后的子路由在 SAP 中创建飞行对象,如上例中所示。最终的子路由还会创建并返回一个自定义的 JAXB bean,它被 marshaled 到 SAP 响应对象,并由服务器端点返回。

用于路由的 Java DSL

示例路由的 Java DSL 如下:

DataFormat jaxb = new JaxbDataFormat("org.fusesource.sap.example.jaxb");

from("sap-srfc-server:nplserver:BOOK_FLIGHT")
    .unmarshal(jaxb)
    .multicast()
    .to("direct:getFlightConnectionInfo",
        "direct:getFlightCustomerInfo",
        "direct:getPassengerInfo")
    .end()
    .to("direct:createFlightTrip")
    .marshal(jaxb);

用于路由的 XML DSL

同一路由的 XML DSL 如下:

<route>
    <from uri="sap-srfc-server:nplserver:BOOK_FLIGHT"/>
    <unmarshal>
        <jaxb contextPath="org.fusesource.sap.example.jaxb"/>
    </unmarshal>
    <multicast>
        <to uri="direct:getFlightConnectionInfo"/>
        <to uri="direct:getFlightCustomerInfo"/>
        <to uri="direct:getPassengerInfo"/>
    </multicast>
    <to uri="direct:createFlightTrip"/>
    <marshal>
        <jaxb contextPath="org.fusesource.sap.example.jaxb"/>
    </marshal>
</route>

BookFlightRequest bean

以下列表演示了一个 JAXB bean,它来自 SAP BOOK_FLIGHT 请求对象的序列化形式:

@XmlRootElement(name="Request", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class BookFlightRequest {

    @XmlAttribute(name="CUSTNAME")
    private String customerName;

    @XmlAttribute(name="FLIGHTDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date flightDate;

    @XmlAttribute(name="TRAVELAGENCYNUMBER")
    private String travelAgencyNumber;

    @XmlAttribute(name="DESTINATION_FROM")
    private String startAirportCode;

    @XmlAttribute(name="DESTINATION_TO")
    private String endAirportCode;

    @XmlAttribute(name="PASSFORM")
    private String passengerFormOfAddress;

    @XmlAttribute(name="PASSNAME")
    private String passengerName;

    @XmlAttribute(name="PASSBIRTH")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date passengerDateOfBirth;

    @XmlAttribute(name="CLASS")
    private String flightClass;

    ...
}

BookFlightResponse bean

以下列表演示了一个 JAXB bean,它被提供给 SAP BOOK_FLIGHT 响应对象的序列化形式:

@XmlRootElement(name="Response", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class BookFlightResponse {

    @XmlAttribute(name="TRIPNUMBER")
    private String tripNumber;

    @XmlAttribute(name="TICKET_PRICE")
    private BigDecimal ticketPrice;

    @XmlAttribute(name="TICKET_TAX")
    private BigDecimal ticketTax;

    @XmlAttribute(name="CURRENCY")
    private String currency;

    @XmlAttribute(name="PASSFORM")
    private String passengerFormOfAddress;

    @XmlAttribute(name="PASSNAME")
    private String passengerName;

    @XmlAttribute(name="PASSBIRTH")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date passengerDateOfBirth;

    @XmlElement(name="FLTINFO")
    private FlightInfo flightInfo;

    @XmlElement(name="CONNINFO")
    private ConnectionInfoTable connectionInfo;

    ...
}
注意

响应对象的复杂参数字段被序列化为响应的子元素。

FlightInfo bean

以下列表演示了一个 JAXB bean,它被提供给复杂结构参数 FLTINFO 的序列化形式:

@XmlRootElement(name="FLTINFO", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class FlightInfo {

    @XmlAttribute(name="FLIGHTTIME")
    private String flightTime;

    @XmlAttribute(name="CITYFROM")
    private String cityFrom;

    @XmlAttribute(name="DEPDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date departureDate;

    @XmlAttribute(name="DEPTIME")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date departureTime;

    @XmlAttribute(name="CITYTO")
    private String cityTo;

    @XmlAttribute(name="ARRDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date arrivalDate;

    @XmlAttribute(name="ARRTIME")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date arrivalTime;

    ...
}

ConnectionInfoTable bean

以下列表演示了一个 JAXB bean,它过滤为复杂表参数 CONNINFO 的序列化形式。请注意,JAXB bean 的根元素类型的名称对应于以 _TABLE 后缀的行结构类型的名称,而 bean 包含行元素列表。

@XmlRootElement(name="CONNINFO_TABLE", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConnectionInfoTable {

    @XmlElement(name="row")
    List<ConnectionInfo> rows;

    ...
}

ConnectionInfo bean

以下列表演示了 JAXB bean,它会被提供给上表中行元素的序列化形式:

@XmlRootElement(name="CONNINFO", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConnectionInfo {

    @XmlAttribute(name="CONNID")
    String connectionId;

    @XmlAttribute(name="AIRLINE")
    String airline;

    @XmlAttribute(name="PLANETYPE")
    String planeType;

    @XmlAttribute(name="CITYFROM")
    String cityFrom;

    @XmlAttribute(name="DEPDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    Date departureDate;

    @XmlAttribute(name="DEPTIME")
    @XmlJavaTypeAdapter(DateAdapter.class)
    Date departureTime;

    @XmlAttribute(name="CITYTO")
    String cityTo;

    @XmlAttribute(name="ARRDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    Date arrivalDate;

    @XmlAttribute(name="ARRTIME")
    @XmlJavaTypeAdapter(DateAdapter.class)
    Date arrivalTime;

    ...
}

第 291 章 SAP NetWeaver Component

作为 Camel 2.12 版本提供

sap-netweaver 使用 HTTP 传输与 SAP NetWeaver Gateway 集成。

此 camel 组件仅支持制作者端点。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sap-netweaver</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

291.1. URI 格式

sap netweaver 网关组件的 URI 方案如下

sap-netweaver:https://host:8080/path?username=foo&password=secret

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

291.2. 前提条件

您需要拥有能够利用此组件的 SAP NetWeaver 系统的帐户。SAP 提供了一个 演示设置,您可在此处设置帐户。

此组件使用基本身份验证方案登录 SAP NetWeaver。

291.3. SAPNetWeaver 选项

SAP NetWeaver 组件没有选项。

SAP NetWeaver 端点使用 URI 语法配置:

sap-netweaver:url

使用以下路径和查询参数:

291.3.1. 路径名(1 参数):

名称描述默认类型

url

SAP net-weaver 网关服务器 所需的 Url。

 

字符串

291.3.2. 查询参数(6 参数):

名称描述默认类型

flatternMap (producer)

如果 JSON map 仅包含单个条目,则将单个条目值存储为消息正文。

true

布尔值

json (producer)

是否以 JSON 格式返回数据。如果这个选项为 false,则以 Atom 格式返回 XML。

true

布尔值

jsonAsMap (producer)

将 JSON 从 String 转换为消息正文中的 Map。

true

布尔值

password (producer)

帐户 所需的密码.

 

字符串

username (producer)

帐户 所需的 用户名。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

291.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.sap-netweaver.enabled

启用 sap-netweaver 组件

true

布尔值

camel.component.sap-netweaver.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

291.5. 消息标头

以下标头可由制作者使用。

名称类型描述

CamelNetWeaverCommand

字符串

必需 :以 MS ADO.Net Data Service 格式执行的命令。

291.6. 例子

这个示例使用 SAP 的飞机演示示例,可在互联网上通过互联网进行在线。http://scn.sap.com/docs/DOC-31221

在以下路由中,我们使用以下 url 请求 SAP NetWeaver 演示服务器

https://sapes1.sapdevcenter.com/sap/opu/odata/IWBEP/RMTSAMPLEFLIGHT_2/

我们希望执行以下命令

FlightCollection(AirLineID='AA',FlightConnectionID='0017',FlightDate=datetime'2012-08-29T00%3A00%3A00')

获得给定航班的航班详细信息。命令语法采用 MS ADO.Net Data Service 格式。

我们有以下 Camel 路由

from("direct:start")
    .setHeader(NetWeaverConstants.COMMAND, constant(command))
    .toF("sap-netweaver:%s?username=%s&password=%s", url, username, password)
    .to("log:response")
    .to("velocity:flight-info.vm")

其中 url、username、password 和 command 定义为:

    private String username = "P1909969254";
    private String password = "TODO";
    private String url = "https://sapes1.sapdevcenter.com/sap/opu/odata/IWBEP/RMTSAMPLEFLIGHT_2/";
    private String command = "FlightCollection(AirLineID='AA',FlightConnectionID='0017',FlightDate=datetime'2012-08-29T00%3A00%3A00')";

密码无效。您需要首先在 SAP 中创建帐户来运行演示。

velocity 模板用于将响应格式化到基本 HTML 页面

<html>
  <body>
  Flight information:

  <p/>
  <br/>Airline ID: $body["AirLineID"]
  <br/>Aircraft Type: $body["AirCraftType"]
  <br/>Departure city: $body["FlightDetails"]["DepartureCity"]
  <br/>Departure airport: $body["FlightDetails"]["DepartureAirPort"]
  <br/>Destination city: $body["FlightDetails"]["DestinationCity"]
  <br/>Destination airport: $body["FlightDetails"]["DestinationAirPort"]

  </body>
</html>

运行应用程序时,您会看到 sampel 输出:

Flight information:
Airline ID: AA
Aircraft Type: 747-400
Departure city: new york
Departure airport: JFK
Destination city: SAN FRANCISCO
Destination airport: SFO

291.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • HTTP

第 292 章 调度程序组件

作为 Camel 版本 2.15 可用

调度程序: 组件用于在调度程序触发时生成消息交换。此组件与 Timer 组件相似,但它在调度方面提供更多功能。另外,这个组件使用 JDK ScheduledExecutorService。其中,作为计时器使用 JDK 计时器

您只能消耗来自此端点的事件。

292.1. URI 格式

scheduler:name[?options]

其中 name 是调度程序的名称,在端点之间创建和共享。因此,如果您对所有调度程序端点使用相同的名称,则只使用一个调度程序线程池和线程 - 但是,您可以将线程池配置为允许更多的并发线程。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

注意: 生成的交换的 IN body 是 null。so exchange.getIn ().getBody () 返回 null

292.2. 选项

调度程序组件支持 2 个选项,它们如下所列。

名称描述默认类型

concurrentTasks (scheduler)

调度线程池使用的线程数量。默认情况下使用单个线程

1

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

调度程序端点使用 URI 语法进行配置:

scheduler:name

使用以下路径和查询参数:

292.2.1. 路径名(1 参数):

名称描述默认类型

name

所需的 调度程序名称

 

字符串

292.2.2. 查询参数(20 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。换句话说,在轮询信息时发生错误,对文件网络的实例访问失败,因此 Camel 无法访问该文件扫描文件。默认实现会将导致的异常记录在 WARN 级别,并忽略它。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

concurrentTasks (scheduler)

调度线程池使用的线程数量。默认情况下使用单个线程

1

int

延迟 (scheduler)

下次轮询前的毫秒。默认值为 500。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。默认值为 1000。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。此选项允许您在多个消费者之间共享线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

允许插入自定义 org.apache.camel.spi.ScheduledPollConsumerScheduler,以在轮询消费者运行时用作触发的调度程序。默认实施使用 ScheduledExecutorService,它有一个 Quartz2 和 Spring,它支持 CRON 表达式。注意:如果使用自定义调度程序,那么 initialDelay 的选项可以使用FixedDelay、timeUnit 和 scheduledExecutorService。使用文本 quartz2 引用使用 Quartz2 调度程序;并使用文本 spring 基于 Spring;并使用文本 #myScheduler 来指代 registry 中的自定义调度程序。如需示例,请参阅 Quartz2 页面。

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

292.3. 更多信息

此组件是一个调度程序 轮询使用者 ,您可以在其中找到有关以上选项的更多信息,以及 轮询消费者页面上的 示例。

292.4. 交换属性

当触发计时器时,它会将以下信息添加为 Exchange 的属性:

名称类型描述

Exchange.TIMER_NAME

字符串

name 选项的值。

Exchange.TIMER_FIRED_TIME

Date

消费者触发的时间。

292.5. 示例

设置每 60 秒生成事件的路由:

from("scheduler://foo?delay=60s").to("bean:myBean?method=someMethodName");

以上路由将生成事件,然后在 Registry 中调用名为 myBeansomeMethodName 方法,如 JNDI 或 Spring。

Spring DSL 中的路由:

<route>
  <from uri="scheduler://foo?delay=60s"/>
  <to uri="bean:myBean?method=someMethodName"/>
</route>

292.6. 强制调度程序在完成后立即触发

要在上一任务完成后马上让调度程序触发器,您可以设置 greedy=true 选项。但请注意,调度程序会始终保持触发。请小心谨慎使用。

292.7. 强制调度程序闲置

在一些用例中,您可能想要调度程序触发并且是灰色的。但有时候,您希望"不轮询任务",因此调度程序可以使用 backoff 选项更改为空闲模式。为此,您需要使用密钥 Exchange.SCHEDULER_POLLED_MESSAGES 在交换上设置属性到布尔值值 false。这将导致使用者表示没有轮询消息。 

在消费者完成交换时,消费者都会默认向调度程序返回 1 消息。

292.8. 另请参阅

第 293 章 Schematron 组件

作为 Camel 版本 2.15 可用

Schematron 是用于验证 XML 实例文档的 XML 语言。它用于对 XML 文档中的数据进行断言,它也用于表达运营和业务规则。Schematron 是 ISO 标准。schematron 组件使用 ISO schematron 的领先 实施。它是基于 XSLT 的实现。schematron 规则通过 四个 XSLT 管道运行,它会生成一个最终的 XSLT,它将用作针对 XML 文档运行断言的基础。组件以一种方式编写,使得 Schematron 规则在端点开始时(仅一次)被加载,这可以减去实例化代表规则的 Java 模板对象的开销。

293.1. URI 格式

schematron://path?[options]

293.2. URI 选项

Schematron 组件没有选项。

Schematron 端点使用 URI 语法进行配置:

schematron:path

使用以下路径和查询参数:

293.2.1. 路径名(1 参数):

名称描述默认类型

path

需要 schematron 规则文件的路径。可以位于类路径或文件系统中的位置。

 

字符串

293.2.2. 查询参数(4 参数):

名称描述默认类型

abort (producer)

用于中止路由并抛出 schematron 验证异常的标志。

false

布尔值

rules (producer)

使用给定的 schematron 规则而不是从路径加载

 

模板

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

uriResolver (advanced)

设置用于解析 schematron 的 URIResolver,包含在规则文件中。

 

URIResolver

293.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.schematron.enabled

启用 schematron 组件

true

布尔值

camel.component.schematron.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

293.4. Headers

名称描述类型in/Out

CamelSchematronValidationStatus

schematron 验证状态: SUCCESS / FAILED

字符串

IN

CamelSchematronValidationReport

模式报告正文采用 XML 格式。请参见以下示例

字符串

IN

293.5. URI 和路径语法

以下示例演示了如何在 Java DSL 中调用 schematron 处理器。schematron 规则文件由类路径提供:

from("direct:start").to("schematron://sch/schematron.sch").to("mock:result")

 

以下示例演示了如何在 XML DSL 中调用 schematron 处理器。schematrion 规则文件来自文件系统:

<route>
   <from uri="direct:start" />
   <to uri="schematron:///usr/local/sch/schematron.sch" />
   <log message="Schematron validation status: ${in.header.CamelSchematronValidationStatus}" />
   <choice>
      <when>
         <simple>${in.header.CamelSchematronValidationStatus} == 'SUCCESS'</simple>
         <to uri="mock:success" />
      </when>
      <otherwise>
         <log message="Failed schematron validation" />
         <setBody>
            <header>CamelSchematronValidationReport</header>
         </setBody>
         <to uri="mock:failure" />
      </otherwise>
   </choice>
</route>
提示

在哪里存储 schematron 规则?Schematron 规则可能会因业务需求而改变,因此建议在文件系统中将这些规则存储在文件系统中。当启动 schematron 组件端点时,规则作为 Java 模板对象编译到 XSLT 中。这只是为了减少实例化 Java 模板对象的开销,对于大量规则集合而言,这个过程可以通过 XSLT 转换 的四个管道进行昂贵操作。因此,如果您发生在文件系统中存储规则,在更新时,您只需要重启路由或组件。然而,在类路径中存储这些规则不会损害,但您必须构建和部署组件才能获取更改。

293.6. Schematron 规则和报告示例

下面是 schematron 规则示例

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron">
   <title>Check Sections 12/07</title>
   <pattern id="section-check">
      <rule context="section">
         <assert test="title">This section has no title</assert>
         <assert test="para">This section has no paragraphs</assert>
      </rule>
   </pattern>
</schema>

下面是 schematron 报告的示例:

<?xml version="1.0" encoding="UTF-8"?>
<svrl:schematron-output xmlns:svrl="http://purl.oclc.org/dsdl/svrl"
 xmlns:iso="http://purl.oclc.org/dsdl/schematron"
 xmlns:saxon="http://saxon.sf.net/"
 xmlns:schold="http://www.ascc.net/xml/schematron"
 xmlns:xhtml="http://www.w3.org/1999/xhtml"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaVersion="" title="">

   <svrl:active-pattern document="" />
   <svrl:fired-rule context="chapter" />
   <svrl:failed-assert test="title" location="/doc[1]/chapter[1]">
      <svrl:text>A chapter should have a title</svrl:text>
   </svrl:failed-assert>
   <svrl:fired-rule context="chapter" />
   <svrl:failed-assert test="title" location="/doc[1]/chapter[2]">
      <svrl:text>A chapter should have a title</svrl:text>
   </svrl:failed-assert>
   <svrl:fired-rule context="chapter" />
</svrl:schematron-output>
提示

有用的链接和资源 * Mulleberry 技术 介绍 Schematron 。在 PDF 中是一个不错的文档,供您在 Schematron 上开始。* Schematron 官方网站。这包括其他资源的链接

第 294 章 SCP 组件

作为 Camel 2.10 版本提供

camel-jsch 组件支持使用 Jsch 项目的客户端 API 的 SCP 协议sftp: 协议的 FTP 组件已经使用 Jsch。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jsch</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

294.1. URI 格式

scp://host[:port]/destination[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

文件名可以在 URI 的 <path> 部分中指定,或者在消息中的 "CamelFileName" 标头中指定(如果代码使用,则使用Exchange.FILE_NAME )。

294.2. 选项

SCP 组件支持 2 个选项,它们如下所列。

名称描述默认类型

verboseLogging (producer)

JSCH 是开箱即用的详细注销。因此,默认情况下,我们将日志记录切换到 DEBUG 日志记录。但是,将此选项设置为 true 可再次打开详细记录。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

SCP 端点使用 URI 语法配置:

scp:host:port/directoryName

使用以下路径和查询参数:

294.2.1. 路径名(3 参数):

名称描述默认类型

主机

FTP 服务器 所需的 主机名

 

字符串

port

FTP 服务器的端口

 

int

directoryName

启动目录

 

字符串

294.2.2. 查询参数(22 参数):

名称描述默认类型

disconnect (common)

使用后是否与远程 FTP 服务器断开连接。断开连接只会断开当前与 FTP 服务器的连接。如果您有一个要停止的消费者,则需要停止消费者/路由。

false

布尔值

chmod (producer)

允许您在存储的文件上设置 chmod。例如 chmod=664。

664

字符串

fileName (producer)

使用文件语言等表达式动态设置文件名。对于消费者,它被用作文件名过滤器。对于制作者而言,用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注:标题本身也可以是 Expression)。表达式选项支持 String 和 Expression 类型。如果表达式是 String 类型,则始终会使用文件语言来评估。如果表达式是 Expression 类型,则使用指定的 Expression 类型 - 这允许您使用 OGNL 表达式。对于消费者,您可以使用文件名来过滤文件名,因此您可以使用文件语言语法:mydata-$date:now:yyyyMMdd.txt。生产者支持 CamelOverruleFileName 标头,其优先级高于任何现有的 CamelFileName 标头;CamelOverruleFileName 只是一个标头,而且可以更轻松地进行临时存储 CamelFileName,且必须稍后恢复。

 

字符串

flatten (producer)

flatten 用于扁平化文件名路径,以剥离任何前导路径,因此这仅仅是文件名。这样,您可以以递归方式使用子目录,但当您将这些文件写入单个目录中时。在制作者上,在制作者上将强制将设置 CamelFileName 标头中的任何文件名用于任何领先的路径。

false

布尔值

jailStartingDirectory (producer)

用于判断(限制)将文件写入起始目录(和子目录)。默认情况下,启用此项以允许 Camel 将文件写入外部目录(从该框更受保护)。您可以关闭此目的,允许将文件写入起始目录之外的目录,如父级或根文件夹。

true

布尔值

strictHostKeyChecking (producer)

设置是否使用严格的主机密钥检查。可能的值有:no, yes

字符串

allowNullBody (producer)

用于指定在写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,如果设为 false,并且试图向文件组件发送 null 正文,则使用"Cannot将 null body 写入空正文到 file.' 的 GenericFileWriteException 的 GenericFileWriteException 来抛出。'如果将 fileExist 选项设置为 'Override',则文件将被截断,如果设置为 append,则文件将保持不变。

false

布尔值

disconnectOnBatchComplete (producer)

批处理上传完成后是否与远程 FTP 服务器断开连接。disconnectedOnBatchComplete 将仅断开当前与 FTP 服务器的连接。

false

布尔值

moveExistingFileStrategy (producer)

用于在配置 fileExist=Move 时移动带有特殊命名令牌的文件的策略(Custom 策略)。默认情况下,如果没有提供自定义策略,则使用实施

 

FileMoveExisting 策略

connectTimeout (advanced)

设置等待由 FTPClient 和 JSCH 使用的连接的连接超时

10000

int

soTimeout (advanced)

设置仅由 FTPClient 使用的 so 超时

300000

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

timeout (advanced)

设置数据超时,以等待仅由 FTPClient 使用回复

30000

int

knownHostsFile (security)

设置 known_hosts 文件,以便 jsch 端点能够执行主机密钥验证。您可以使用 classpath: 前缀,从 classpath 中加载文件,而不是文件系统。

 

字符串

密码 (安全)

用于登录的密码

 

字符串

preferredAuthentications (security)

设置一个以逗号分开的验证列表,用于按照偏好顺序使用。可能的身份验证方法由 JCraft JSCH 定义。一些示例包括: gssapi-with-mic,publickey,keyboard-interactive,password 若没有指定 JSCH 和/或系统默认值。

 

字符串

privateKeyBytes (security)

将私钥字节设置为端点可以进行私钥验证。这只有在未设置 privateKeyFile 时使用此。否则,该文件将具有优先权。

 

byte[]

privateKeyFile (security)

将私钥文件设置为该端点可以进行私钥验证。您可以使用 classpath: 前缀,从 classpath 中加载文件,而不是文件系统。

 

字符串

privateKeyFilePassphrase (security)

将私钥文件密语设置为该端点可以进行私钥验证。

 

字符串

username (security)

用于登录的用户名

 

字符串

useUserKnownHostsFile (security)

如果尚未明确配置 knownHostFile,则使用 System.getProperty (user.home)/.ssh/known_hosts 中的主机文件

true

布尔值

加密 (安全)

设置一个以逗号分隔的密码列表,它们将按顺序使用。可能的密码名称由 JCraft JSCH 定义。些示例包括:aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc。如果未从 JSCH 指定默认列表,则将使用。

 

字符串

294.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.scp.enabled

启用 scp 组件

true

布尔值

camel.component.scp.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.scp.verbose-logging

JSCH 是开箱即用的详细注销。因此,默认情况下,我们将日志记录切换到 DEBUG 日志记录。但是,将此选项设置为 true 可再次打开详细记录。

false

布尔值

294.4. 限制

目前 camel-jsch 只支持 Producer (例如,将文件复制到其他主机)。 

294.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 295 章 Camel SCR (已弃用)

可作为 Camel 2.15 可用

SCR 代表服务组件运行时,也是 OSGi Declarative 服务规范的实现。SCR 支持任何普通旧 Java 对象公开和使用没有样板代码的 OSGi 服务。

OSGi 框架通过在捆绑包中查找 SCR 描述符文件,这些文件通常由 org.apache.felix:maven-scr-plugin 等插件从 Java 注解生成。

在 SCR 捆绑包中运行 Camel 是 Spring DM 和 Blueprint 解决方案(在您和 OSGi 框架之间大大减少代码行)的绝佳选择。使用 SCR 您的捆绑包可以在 Java 世界中保持完整状态;无需编辑 XML 或属性文件。这让您可以完全控制所有内容,意味着您选择的 IDE 准确了解项目的实际情况。

295.1. Camel SCR 支持

Camel-scr 捆绑包不包括在 2.15.0 之前的 Apache Camel 版本,但工件本身可与从 2.12.0 开始的任何 Camel 版本一起使用。

org.apache.camel/camel-scr 捆绑包提供基础类 AbstractCamelRunner,它为您管理 Camel 上下文,以及帮助程序类 ScrHelper,以用于单元测试中的 SCR 属性。Apache Karaf Camel-scr 功能定义了在 SCR 捆绑包中运行 Camel 所需的所有功能和捆绑包。

AbstractCamelRunner 类 ties CamelContext 的生命周期与服务组件的生命周期,并通过 Camel 的 PropertiesComponent 的帮助来处理配置。您只需在 java 类之外进行服务组件,从 AbstractCamelRunner 进行扩展,并在类级别添加以下 org.apache.felix.scr.annotations

添加所需的注解

@Component
@References({
    @Reference(name = "camelComponent",referenceInterface = ComponentResolver.class,
        cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy = ReferencePolicy.DYNAMIC,
        policyOption = ReferencePolicyOption.GREEDY, bind = "gotCamelComponent", unbind = "lostCamelComponent")
})

然后,实现 getRouteBuilders () 方法,用于返回您要运行的 Camel 路由:

Implement getRouteBuilders()

    @Override
    protected List<RoutesBuilder> getRouteBuilders() {
        List<RoutesBuilder> routesBuilders = new ArrayList<>();
        routesBuilders.add(new YourRouteBuilderHere(registry));
        routesBuilders.add(new AnotherRouteBuilderHere(registry));
        return routesBuilders;
    }

最后,通过以下方法提供默认配置:

注解中的默认配置

@Properties({
   @Property(name = "camelContextId", value = "my-test"),
   @Property(name = "active", value = "true"),
   @Property(name = "...", value = "..."),
   ...
})

 

就是.如果使用了 camel-archetype-scr 来生成已经关注的项目。

以下是由 camel-archetype-scr 生成的完整服务组件类示例:

CamelScrExample.java

// This file was generated from org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example;

import java.util.ArrayList;
import java.util.List;

import org.apache.camel.scr.AbstractCamelRunner;
import example.internal.CamelScrExampleRoute;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.spi.ComponentResolver;
import org.apache.felix.scr.annotations.*;

@Component(label = CamelScrExample.COMPONENT_LABEL, description = CamelScrExample.COMPONENT_DESCRIPTION, immediate = true, metatype = true)
@Properties({
    @Property(name = "camelContextId", value = "camel-scr-example"),
    @Property(name = "camelRouteId", value = "foo/timer-log"),
    @Property(name = "active", value = "true"),
    @Property(name = "from", value = "timer:foo?period=5000"),
    @Property(name = "to", value = "log:foo?showHeaders=true"),
    @Property(name = "messageOk", value = "Success: {{from}} -> {{to}}"),
    @Property(name = "messageError", value = "Failure: {{from}} -> {{to}}"),
    @Property(name = "maximumRedeliveries", value = "0"),
    @Property(name = "redeliveryDelay", value = "5000"),
    @Property(name = "backOffMultiplier", value = "2"),
    @Property(name = "maximumRedeliveryDelay", value = "60000")
})
@References({
    @Reference(name = "camelComponent",referenceInterface = ComponentResolver.class,
        cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy = ReferencePolicy.DYNAMIC,
        policyOption = ReferencePolicyOption.GREEDY, bind = "gotCamelComponent", unbind = "lostCamelComponent")
})
public class CamelScrExample extends AbstractCamelRunner {

    public static final String COMPONENT_LABEL = "example.CamelScrExample";
    public static final String COMPONENT_DESCRIPTION = "This is the description for camel-scr-example.";

    @Override
    protected List<RoutesBuilder> getRouteBuilders() {
        List<RoutesBuilder> routesBuilders = new ArrayList<>();
        routesBuilders.add(new CamelScrExampleRoute(registry));
        return routesBuilders;
    }
}

 

CamelContextId 和 active 属性控制 CamelContext 的名称(默认为 "camel-runner-default")以及它是否启动(默认为"false")。除了这些之外,您还可以添加和使用所需很多属性。Camel 的 PropertiesComponent 处理递归属性,并在没有问题的情况下使用回退进行前缀。

AbstractCamelRunner 将使这些属性可供您的 RouteBuilder 使用,并在 Camel 的 PropertiesComponent 的帮助下将这些值注入到服务组件的名称匹配时,将这些值注入到您的 Service 组件和 RouteBuilder 字段中。这些字段可以声明任何可见性级别,并且支持许多类型(String、int、布尔值、URL、…​)。

以下是 camel-archetype-scr 生成的 RouteBuilder 类示例:

 

CamelScrExampleRoute.java

// This file was generated from org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example.internal;

import org.apache.camel.LoggingLevel;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.SimpleRegistry;
import org.apache.commons.lang.Validate;

public class CamelScrExampleRoute extends RouteBuilder {

    SimpleRegistry registry;

    // Configured fields
    private String camelRouteId;
    private Integer maximumRedeliveries;
    private Long redeliveryDelay;
    private Double backOffMultiplier;
    private Long maximumRedeliveryDelay;

    public CamelScrExampleRoute(final SimpleRegistry registry) {
        this.registry = registry;
    }

    @Override
    public void configure() throws Exception {
        checkProperties();

        // Add a bean to Camel context registry
        registry.put("test", "bean");

        errorHandler(defaultErrorHandler()
            .retryAttemptedLogLevel(LoggingLevel.WARN)
            .maximumRedeliveries(maximumRedeliveries)
            .redeliveryDelay(redeliveryDelay)
            .backOffMultiplier(backOffMultiplier)
            .maximumRedeliveryDelay(maximumRedeliveryDelay));

        from("{{from}}")
            .startupOrder(2)
            .routeId(camelRouteId)
            .onCompletion()
                .to("direct:processCompletion")
            .end()
            .removeHeaders("CamelHttp*")
            .to("{{to}}");


        from("direct:processCompletion")
            .startupOrder(1)
            .routeId(camelRouteId + ".completion")
            .choice()
                .when(simple("${exception} == null"))
                    .log("{{messageOk}}")
                .otherwise()
                    .log(LoggingLevel.ERROR, "{{messageError}}")
            .end();
        }
    }

    public void checkProperties() {
        Validate.notNull(camelRouteId, "camelRouteId property is not set");
        Validate.notNull(maximumRedeliveries, "maximumRedeliveries property is not set");
        Validate.notNull(redeliveryDelay, "redeliveryDelay property is not set");
        Validate.notNull(backOffMultiplier, "backOffMultiplier property is not set");
        Validate.notNull(maximumRedeliveryDelay, "maximumRedeliveryDelay property is not set");
    }
}

 

让我们更详细地了解 CamelScrExampleRoute

 

    // Configured fields
    private String camelRouteId;
    private Integer maximumRedeliveries;
    private Long redeliveryDelay;
    private Double backOffMultiplier;
    private Long maximumRedeliveryDelay;

这些字段的值通过匹配名称来设置来自属性的值。

 

        // Add a bean to Camel context registry
        registry.put("test", "bean");

如果需要为路由添加一些 Bean 到 CamelContext 的注册表,您可以执行以下操作:

 

    public void checkProperties() {
        Validate.notNull(camelRouteId, "camelRouteId property is not set");
        Validate.notNull(maximumRedeliveries, "maximumRedeliveries property is not set");
        Validate.notNull(redeliveryDelay, "redeliveryDelay property is not set");
        Validate.notNull(backOffMultiplier, "backOffMultiplier property is not set");
        Validate.notNull(maximumRedeliveryDelay, "maximumRedeliveryDelay property is not set");
    }

最好检查设置所需的参数,并在允许路由启动前有有意义的值。

 

        from("{{from}}")
            .startupOrder(2)
            .routeId(camelRouteId)
            .onCompletion()
                .to("direct:processCompletion")
            .end()
            .removeHeaders("CamelHttp*")
            .to("{{to}}");


        from("direct:processCompletion")
            .startupOrder(1)
            .routeId(camelRouteId + ".completion")
            .choice()
                .when(simple("${exception} == null"))
                    .log("{{messageOk}}")
                .otherwise()
                    .log(LoggingLevel.ERROR, "{{messageError}}")
            .end();

请注意,路由中的一切均使用属性进行配置。这基本上使您的 RouteBuilder 称为模板。SCR 允许您通过提供替代配置来创建更多路由实例。更多信息,请参阅将 Camel SCR 捆绑包用作模板

295.2. SCR 中的 AbstractCamelRunner 的生命周期

  1. 当组件的配置策略和强制引用满足 SCR 调用 activate () 时。这会通过以下调用链创建和设置 CamelContext: activate () → prepare () → createCamelContext () → setupPropertiesComponent () → configure () → setupCamelContext ()。最后,上下文会在 AbstractCamelRunner.START_DELAY 中定义的延迟之后启动,并带有 runWithDelay ()
  2. 当 Camel 组件(componentResolver 服务)在 OSGi 中注册时,SCR 调用 getCamelComponent'()'( CamelComponent'()'),CamelComponent'()' 将在同一个 AbstractCamelRunner.START_DELAY 开始更多。这会导致 CamelContext 在加载所有 Camel 组件或两者之间有足够的空白处等待。同一逻辑将告知在我们添加更多 CamelContext 时尝试失败的 CamelContext。
  3. When Camel components are unregistered SCR calls lostCamelComponent`()`.这个调用不会进行任何操作。
  4. 当导致调用 激活() 的要求之一是 SCR 将 停用() 时。这将关闭 CamelContext。

在 (非OSGi)单元测试,您应该使用 prepare () → run () → stop () 而不是 activate () → deactivate () → deactivate ()进行更精细的控制。另外,这让我们可以在测试中避免可能的 SCR 特定操作。

295.3. 使用 camel-archetype-scr

创建 Camel SCR 捆绑包项目的最简单方法是使用 camel-archetype-scr 和 Maven。

您可以按照以下步骤生成项目:

生成项目

$ mvn archetype:generate -Dfilter=org.apache.camel.archetypes:camel-archetype-scr
 
Choose archetype:
1: local -> org.apache.camel.archetypes:camel-archetype-scr (Creates a new Camel SCR bundle project for Karaf)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 1
Define value for property 'groupId': : example
[INFO] Using property: groupId = example
Define value for property 'artifactId': : camel-scr-example
Define value for property 'version': 1.0-SNAPSHOT: :
Define value for property 'package': example: :
[INFO] Using property: archetypeArtifactId = camel-archetype-scr
[INFO] Using property: archetypeGroupId = org.apache.camel.archetypes
[INFO] Using property: archetypeVersion = 2.15-SNAPSHOT
Define value for property 'className': : CamelScrExample
Confirm properties configuration:
groupId: example
artifactId: camel-scr-example
version: 1.0-SNAPSHOT
package: example
archetypeArtifactId: camel-archetype-scr
archetypeGroupId: org.apache.camel.archetypes
archetypeVersion: 2.15-SNAPSHOT
className: CamelScrExample
Y: :

完成!

现在运行:

mvn install

捆绑包可以部署。

295.4. 单元测试 Camel 路由

服务组件是一个 POJO,对(非 OSGi)单元测试没有特殊要求。然而,某些特定于 Camel SCR 的技术或只是为了简化测试。

以下是 camel-archetype-scr 生成的单元测试:

// This file was generated from org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example;

import java.util.List;

import org.apache.camel.scr.internal.ScrHelper;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.component.mock.MockComponent;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.model.ModelCamelContext;
import org.apache.camel.model.RouteDefinition;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
public class CamelScrExampleTest {

    Logger log = LoggerFactory.getLogger(getClass());

    @Rule
    public TestName testName = new TestName();

    CamelScrExample integration;
    ModelCamelContext context;

    @Before
    public void setUp() throws Exception {
        log.info("*******************************************************************");
        log.info("Test: " + testName.getMethodName());
        log.info("*******************************************************************");

        // Set property prefix for unit testing
        System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");

        // Prepare the integration
        integration = new CamelScrExample();
        integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));
        context = integration.getContext();

        // Disable JMX for test
        context.disableJMX();

        // Fake a component for test
        context.addComponent("amq", new MockComponent());
    }

    @After
    public void tearDown() throws Exception {
        integration.stop();
    }

    @Test
    public void testRoutes() throws Exception {
        // Adjust routes
        List<RouteDefinition> routes = context.getRouteDefinitions();

        routes.get(0).adviceWith(context, new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                // Replace "from" endpoint with direct:start
                replaceFromWith("direct:start");
                // Mock and skip result endpoint
                mockEndpoints("log:*");
            }
        });

        MockEndpoint resultEndpoint = context.getEndpoint("mock:log:foo", MockEndpoint.class);
        // resultEndpoint.expectedMessageCount(1); // If you want to just check the number of messages
        resultEndpoint.expectedBodiesReceived("hello"); // If you want to check the contents

        // Start the integration
        integration.run();

        // Send the test message
        context.createProducerTemplate().sendBody("direct:start", "hello");

        resultEndpoint.assertIsSatisfied();
    }
}

 

现在,让我们来看看一个有趣的位。

使用属性前缀

        // Set property prefix for unit testing
        System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");

这可让您使用"单元"添加属性来覆盖配置的部分。例如,从 中进行单元测试的 unit. from 覆盖。

前缀可用于处理可能会运行路由的运行时环境之间的区别。通过开发、测试和生产环境迁移未做的捆绑包是典型的用例。

 

从注解获取测试配置

        integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));

此处我们使用 OSGi 环境中使用的相同属性在测试中配置服务组件。

 

模拟测试组件

        // Fake a component for test
        context.addComponent("amq", new MockComponent());

测试中不可用的组件可以模拟,如下所示,以允许路由启动。

 

调整测试的路由

        // Adjust routes
        List<RouteDefinition> routes = context.getRouteDefinitions();

        routes.get(0).adviceWith(context, new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                // Replace "from" endpoint with direct:start
                replaceFromWith("direct:start");
                // Mock and skip result endpoint
                mockEndpoints("log:*");
            }
        });

Camel 的 AdviceWith 功能允许修改路由进行测试。

 

启动路由

        // Start the integration
        integration.run();

此处我们启动 Service 组件及其路由。

 

发送测试信息

        // Send the test message
        context.createProducerTemplate().sendBody("direct:start", "hello");

此处我们发送消息到测试中的路由。

295.5. 在 Apache Karaf 中运行捆绑包

使用 mvn install 构建捆绑包后,就可以部署它。 要在 Apache Karaf 上部署捆绑包,请在 Karaf 命令行上执行以下步骤:

在 Apache Karaf 中部署捆绑包

# Add Camel feature repository
karaf@root> features:chooseurl camel 2.15-SNAPSHOT
 
# Install camel-scr feature
karaf@root> features:install camel-scr
 
# Install commons-lang, used in the example route to validate parameters
karaf@root> osgi:install mvn:commons-lang/commons-lang/2.6
 
# Install and start your bundle
karaf@root> osgi:install -s mvn:example/camel-scr-example/1.0-SNAPSHOT
 
# See how it's running
karaf@root> log:tail -n 10
 
Press ctrl-c to stop watching the log.

295.5.1. 覆盖默认配置

默认情况下,Service 组件的配置 PID 与其类的完全限定名称相同。您可以使用 Karaf 的配置:* 命令更改示例 捆绑包的属性

覆盖属性

# Override 'messageOk' property
karaf@root> config:propset -p example.CamelScrExample messageOk "This is better logging"

也可以通过编辑 Karaf 的 etc 文件夹中的 属性文件来更改配置。

295.5.2. 使用 Camel SCR 捆绑包作为模板

假设您有一个实现您经常使用的集成模式的 Camel SCR 捆绑包,即: 从 → 到,成功/失败日志记录,并重新传送(同样是我们的示例路由实施模式)。您可能不希望为每个实例创建单独的捆绑包。没有覆盖的 SCR。

为您的 Service 组件创建一个配置 PID,但添加一个带有短划线和 SCR 的尾部,将使用该配置来创建组件的新实例。

创建新的服务组件实例

# Create a PID with a tail
karaf@root> config:edit example.CamelScrExample-anotherone
 
# Override some properties
karaf@root> config:propset camelContextId my-other-context
karaf@root> config:propset to "file://removeme?fileName=removemetoo.txt"
 
# Save the PID
karaf@root> config:update

这将使用您覆盖的属性启动新的 CamelContext。如何方便.

295.6. 备注

当设计一个服务组件作为模板时,通常您不希望它在不出现 "tailed" 配置的情况下启动它。例如,默认配置。

要防止您的 Service 组件从默认配置添加 policy = ConfigurationPolicy.REQUIRE ' to the class level '@Component 注解开头。

第 296 章 XML 安全数据格式

可作为 Camel 版本 2.0 提供

XMLSecurity Data Format 在 Document、Element 和 Element Content 级别(包括使用 XPath 同时的多节点加密/解密)中促进 XML 有效负载的加密和解密。要使用 XML 签名规范为消息,请参阅 Camel XML 安全组件。

加密功能基于使用 Apache XML 安全(Santuario)项目支持的格式。对称加密/解密功能目前支持使用 Triple-DES 和 AES (128、192 和 256)加密格式。可以根据需要轻松添加其他格式。此功能允许 Camel 用户在与路由分配或接收时加密/解密有效负载。

从 Camel 2.9开始,
XMLSecurity Data Format 支持非对称密钥加密。在这个加密模型中会生成对称密钥,并用来执行 XML 内容加密或解密。然后,这个"内容加密密钥"本身使用非对称加密算法进行加密,该算法利用接收者的公钥作为"密钥加密密钥"。使用非对称密钥加密算法可确保仅收件人的私钥的拥有者可以访问生成的对称加密密钥。因此,只有私钥持有者才能解码信息。XMLSecurity Data Format 处理使用非对称密钥加密和解密消息内容和加密密钥所需的所有逻辑。

在处理选择加密内容的 XPath 查询时,XMLSecurity Data Format 还改进了对命名空间的支持。命名空间定义映射可作为数据格式配置的一部分包含在内。这启用了 true 命名空间匹配,即使 XPath 查询中的前缀值和目标 xml 文档中的前缀值不等同字符串。

296.1. XMLSecurity 选项

XML 安全数据格式支持 13 个选项,它们如下。

名称默认Java 类型描述

xmlCipherAlgorithm

TRIPLEDES

字符串

用于加密/解密 XML 消息内容的密码算法。可用选择包括: xmlCipher.TRIPLEDES XMLCipher.AES_128 XMLCipher.AES_128_GCM XMLCipher.AES_192 XMLCipher.AES_192_GCM XMLCipher.AES_256 XMLCipher.AES_256_GCM XMLCipher.SEED_128 XMLCipher.AES_192 XMLCipher. .CAMELLIA_128 XMLCipher.CAMELLIA_192 XMLCipher.CAMELLIA_256 的默认值为 MLCipher.TRIPLEDES

passPhrase

 

字符串

用于加密/解密内容的 passPhrase 的字符串。必须提供 passPhrase。如果没有指定 passPhrase,则使用默认的 passPhrase。passPhrase 需要与相应的加密算法结合使用。例如,使用 TRIPLEDES Phase 只能是一个 24 Byte 键

passPhraseByte

 

byte[]

字节用作加密/解密内容的 passPhrase。必须提供 passPhrase。如果没有指定 passPhrase,则使用默认的 passPhrase。passPhrase 需要与相应的加密算法结合使用。例如,使用 TRIPLEDES Phase 只能是一个 24 Byte 键

secureTag

 

字符串

XPath 引用为加密/解密选择的 XML 元素。如果没有指定标签,则整个有效负载都会被加密/解密。

secureTagContents

false

布尔值

一个布尔值,用于指定 XML 元素是否被加密,或者 XML Element false = Element Level true = Element Content Level

keyCipherAlgorithm

RSA_OAEP

字符串

用于非对称密钥加密/解密的密码算法。可用的选择有: XMLCipher.RSA_v1dot5 XMLCipher.RSA_OAEPCipher.RSA_OAEP_11 默认值为 XMLCipher.RSA_OAEP

recipientKeyAlias

 

字符串

在执行非对称密钥加密或解密时,用于从 KeyStore 检索接收者公钥或私钥时所使用的密钥别名。

keyOrTrustStoreParametersId

 

字符串

请参考 registry 中的 KeyStore 实例,它用于创建和加载一个代表发件人的信任Store 或收件人的 keyStore 实例的 KeyStore 实例。

keyPassword

 

字符串

用于从 KeyStore 检索私钥的密码。这个密钥用于非对称解密。

digestAlgorithm

SHA1

字符串

与 RSA OAEP 算法一起使用的摘要算法。可用的选择有: XMLCipher.SHA1 XMLCipher.SHA256 XMLCipher.SHA512 的默认值为 XMLCipher.SHA1

mgfAlgorithm

MGF1_SHA1

字符串

与 RSA OAEP 算法一起使用的 MGF Algorithm。可用的选择有: EncryptionConstants.MGF1_SHA1 EncryptionConstants.MGF1_SHA256 EncryptionConstants.MGF1_SHA512 的默认值为 EncryptionConstants.MGF1_SHA1

addKeyValueForEncryptedKey

true

布尔值

是否在 EncryptedKey 结构中将用于加密会话密钥的公钥添加为 KeyValue。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

296.1.1. key Cipher Algorithm

从 Camel 2.12.0 开始,默认的 Key Cipher Algorithm 现在是 XMLCipher.RSA_OAEP,而不是 XMLCipher.RSA_v1dot5。由于各种攻击,不建议使用 XMLCipher.RSA_v1dot5。使用 RSA v1.5 作为密钥加密算法的请求将被拒绝,除非它被明确配置为密钥加密算法。

296.2. marshal

要加密有效负载,需要在路由上应用 marshal 处理器(后跟 secureXML () 标签)。

296.3. unmarshal

要解密有效负载,需要在路由上应用 unmarshal 处理器(后跟 secureXML () 标签)。

296.4. 例子

下面是几个示例,如何在 Document、Element 和 Content 级别执行 marshalling。

296.4.1. 全 Payload 加密/解密

from("direct:start")
    .marshal().secureXML()
    .unmarshal().secureXML()
    .to("direct:end");

296.4.2. 部分 Payload 内容仅加密/解密

String tagXPATH = "//cheesesites/italy/cheese";
boolean secureTagContent = true;
...
from("direct:start")
    .marshal().secureXML(tagXPATH, secureTagContent)
    .unmarshal().secureXML(tagXPATH, secureTagContent)
    .to("direct:end");

296.4.3. 部分 Multi Node Payload Content Only encryption/decryption

String tagXPATH = "//cheesesites/*/cheese";
boolean secureTagContent = true;
...
from("direct:start")
    .marshal().secureXML(tagXPATH, secureTagContent)
    .unmarshal().secureXML(tagXPATH, secureTagContent)
    .to("direct:end");

296.4.4. 部分 Payload 内容仅在选择 passPhrase (密码)的情况下加密/解密。

String tagXPATH = "//cheesesites/italy/cheese";
boolean secureTagContent = true;
...
String passPhrase = "Just another 24 Byte key";
from("direct:start")
    .marshal().secureXML(tagXPATH, secureTagContent, passPhrase)
    .unmarshal().secureXML(tagXPATH, secureTagContent, passPhrase)
    .to("direct:end");

296.4.5. 部分 Payload 内容只支持使用 passPhrase (password)和 Algorithm 的加密/解密

import org.apache.xml.security.encryption.XMLCipher;
....
String tagXPATH = "//cheesesites/italy/cheese";
boolean secureTagContent = true;
String passPhrase = "Just another 24 Byte key";
String algorithm= XMLCipher.TRIPLEDES;
from("direct:start")
    .marshal().secureXML(tagXPATH, secureTagContent, passPhrase, algorithm)
    .unmarshal().secureXML(tagXPATH, secureTagContent, passPhrase, algorithm)
    .to("direct:end");

296.4.6. 带有命名空间支持的部分 Payload 内容

Java DSL

final Map<String, String> namespaces = new HashMap<String, String>();
namespaces.put("cust", "http://cheese.xmlsecurity.camel.apache.org/");

final KeyStoreParameters tsParameters = new KeyStoreParameters();
tsParameters.setPassword("password");
tsParameters.setResource("sender.ts");

context.addRoutes(new RouteBuilder() {
    public void configure() {
        from("direct:start")
           .marshal().secureXML("//cust:cheesesites/italy", namespaces, true, "recipient",
                                testCypherAlgorithm, XMLCipher.RSA_v1dot5, tsParameters)
           .to("mock:encrypted");
    }
}

Spring XML

作为 camelContext 定义的一部分定义的命名空间前缀可以在 secureXML 元素的数据格式 secureTag 属性中重新使用。

<camelContext id="springXmlSecurityDataFormatTestCamelContext"
              xmlns="http://camel.apache.org/schema/spring"
              xmlns:cheese="http://cheese.xmlsecurity.camel.apache.org/">
    <route>
        <from uri="direct://start"/>
            <marshal>
                <secureXML secureTag="//cheese:cheesesites/italy"
                           secureTagContents="true"/>
            </marshal>
            ...

296.4.7. 非对称密钥加密

Spring XML Sender

<!--  trust store configuration -->
<camel:keyStoreParameters id="trustStoreParams" resource="./sender.ts" password="password"/>

<camelContext id="springXmlSecurityDataFormatTestCamelContext"
              xmlns="http://camel.apache.org/schema/spring"
              xmlns:cheese="http://cheese.xmlsecurity.camel.apache.org/">
    <route>
        <from uri="direct://start"/>
            <marshal>
                <secureXML secureTag="//cheese:cheesesites/italy"
                           secureTagContents="true"
                           xmlCipherAlgorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"
                           keyCipherAlgorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"
                           recipientKeyAlias="recipient"
                           keyOrTrustStoreParametersId="trustStoreParams"/>
            </marshal>
            ...

Spring XML Recipient

<!--  key store configuration -->
<camel:keyStoreParameters id="keyStoreParams" resource="./recipient.ks" password="password" />

<camelContext id="springXmlSecurityDataFormatTestCamelContext"
              xmlns="http://camel.apache.org/schema/spring"
              xmlns:cheese="http://cheese.xmlsecurity.camel.apache.org/">
    <route>
        <from uri="direct://encrypted"/>
            <unmarshal>
                <secureXML secureTag="//cheese:cheesesites/italy"
                           secureTagContents="true"
                           xmlCipherAlgorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"
                           keyCipherAlgorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"
                           recipientKeyAlias="recipient"
                           keyOrTrustStoreParametersId="keyStoreParams"
                           keyPassword="privateKeyPassword" />
            </unmarshal>
            ...

296.5. 依赖项

这个数据格式在 camel-xmlsecurity 组件中提供。

第 297 章 SEDA 组件

可作为 Camel 版本 1.1 提供

seda: 组件提供异步 SEDA 行为,使得消息在 BlockingQueue 和消费者上交换,用户是从生产者的独立线程调用。

请注意,队列只能在 单个 CamelContext 中可见。如果要跨 CamelContext 实例通信(例如,在 Web 应用程序间通信),请查看 虚拟机 组件。

如果虚拟机在处理消息时终止,则此组件不实施任何类型的持久性或恢复。如果您需要持久性、可靠性或分布式 SEDA,请尝试使用 JMSActiveMQ

TIP:*Synchronous* 直接 组件在制作者发送消息交换时,任何消费者提供同步调用。

297.1. URI 格式

seda:someName[?options]

其中 someName 可以是当前 CamelContext 中唯一标识端点的任何字符串。

您可以以以下格式将查询选项附加到 URI: ?option=value&option=value&…

297.2. 选项

SEDA 组件支持 6 个选项,它们如下所列。

名称描述默认类型

queueSize (advanced)

设置 SEDA 队列的默认最大容量(例如,它可以保存的消息数)。

1000

int

concurrentConsumers (consumer)

设置默认并发线程处理交换的数量。

1

int

defaultQueueFactory (advanced)

设置默认队列工厂。

 

BlockingQueueFactory

defaultBlockWhenFull (producer)

将消息发送到完整 SEDA 队列的线程是否将阻止,直到队列的容量不再耗尽。默认情况下,将抛出异常表示队列已满。通过启用此选项,调用线程将阻止并等待消息被接受。

false

布尔值

defaultOfferTimeout (producer)

将消息发送到完整 SEDA 队列的线程是否将阻止,直到队列的容量不再耗尽。默认情况下,将抛出异常表示队列已满。启用这个选项,其中可将配置的超时时间添加到块中。使用正在 lint java 队列的 .offer (timeout)方法

 

long

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

SEDA 端点使用 URI 语法配置:

seda:name

使用以下路径和查询参数:

297.2.1. 路径名(1 参数):

名称描述默认类型

name

队列 所需的 名称

 

字符串

297.2.2. 查询参数(17 参数):

名称描述默认类型

size (common)

SEDA 队列的最大容量(例如,它可以持有的消息数)。默认情况下,将使用 SEDA 组件上设置的默认Size。

1000

int

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

concurrentConsumers (consumer)

并发线程处理次数。

1

int

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

limitConcurrentConsumers (consumer)

是否将并发Consumers 数限制为 500 的最大值。默认情况下,如果端点配置了更多数字,则会抛出异常。您可以通过关闭这个选项来禁用该检查。

true

布尔值

multipleConsumers (consumer)

指定是否允许多个消费者。如果启用,您可以使用 SEDA 进行 Publish-Subscribe 消息传递。也就是说,您可以将消息发送到 SEDA 队列,并让每个消费者收到邮件的副本。启用后,应在每个消费者端点上指定这个选项。

false

布尔值

pollTimeout (consumer)

轮询时使用的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

purgeWhenStopping (consumer)

在停止使用者/路由时,要清除任务队列。这允许更快地停止,因为队列上任何待处理的消息都已被丢弃。

false

布尔值

blockWhenFull (producer)

将消息发送到完整 SEDA 队列的线程是否将阻止,直到队列的容量不再耗尽。默认情况下,将抛出异常表示队列已满。通过启用此选项,调用线程将阻止并等待消息被接受。

false

布尔值

discardIfNoConsumers (producer)

制作者是否应丢弃该消息(不要将该消息添加到队列中),在发送到没有活动使用者的队列时。只有一个选项丢弃IfNoConsumers,并且可以同时启用 failIfNoNoNoConsumers。

false

布尔值

failIfNoConsumers (producer)

当发送到没有活动用户的队列时,生产者是否应引发异常。只有一个选项丢弃IfNoConsumers,并且可以同时启用 failIfNoNoNoConsumers。

false

布尔值

offerTimeout (producer)

当队列满时,可以将 offerTimeout (以毫秒为单位)添加到块问题单中。您可以使用 0 或一个负值禁用超时。

 

long

timeout (producer)

SEDA 生产者将在等待异步任务完成前超时(以毫秒为单位)。您可以使用 0 或一个负值禁用超时。

30000

long

waitForTaskToComplete (producer)

指定 caller 是否应该等待 async 任务完成的选项,然后再继续。支持以下三个选项: Always、Never 或 IfReplyExpected。前两个值有自我说明。最后一个值 ifReplyExpected 只有在消息是 Request Reply based.默认选项是 IfReplyExpected。

IfReplyExpected

WaitForTaskToComplete

queue (advanced)

定义将由端点使用的队列实例。这个选项只适用于非常罕见的用例,供您使用自定义队列实例。

 

BlockingQueue

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

297.3. 选择 BlockingQueue 实现

可作为 Camel 2.12 提供

默认情况下,SEDA 组件总是 intantiates LinkedBlockingQueue,但您可以使用不同的实现,您可以在不使用 size 选项的情况下引用您自己的 BlockingQueue 实现。

<bean id="arrayQueue" class="java.util.ArrayBlockingQueue">
  <constructor-arg index="0" value="10" ><!-- size -->
  <constructor-arg index="1" value="true" ><!-- fairness -->
</bean>

<!-- ... and later -->
<from>seda:array?queue=#arrayQueue</from>

或者,您可以引用 BlockingQueueFactory 实现,3 个实现是 LinkedBlockingQueueFactory、ArrayBlockingQueueFactory 和 PriorityBlockingQueueFactory:

<bean id="priorityQueueFactory" class="org.apache.camel.component.seda.PriorityBlockingQueueFactory">
  <property name="comparator">
    <bean class="org.apache.camel.demo.MyExchangeComparator" />
  </property>
</bean>

<!-- ... and later -->
<from>seda:priority?queueFactory=#priorityQueueFactory&size=100</from>

297.4. Reply 使用请求

SEDA 组件支持使用 Request Reply,调用者将等待 Async 路由完成。例如:

from("mina:tcp://0.0.0.0:9876?textline=true&sync=true").to("seda:input");

from("seda:input").to("bean:processInput").to("bean:createResponse");

在上面的路由中,我们在端口 9876 上有一个 TCP 侦听器接受传入请求。该请求被路由到 seda:input 队列。由于它是 Request Reply 消息,我们会等待响应。当 seda:input 队列中的使用者完成时,它会将响应复制到原始消息响应。

注意

直到 2.2:只有使用请求超过 SEDA 或 VM 的 2 端点 才可用于 2 端点。您无法通过 发送到 A → B → C 等来链端点。仅在 A → B 之间。原因是实现逻辑非常简单。为了支持 3+ 端点,逻辑更加复杂,可以正确处理等待线程间的排序和通知。这个问题已在 Camel 2.3 开始进行了改进,这可让您像您这样一样链接多个端点。

297.5. 并发消费者

默认情况下,SEDA 端点使用单个使用者线程,但您可以将它配置为使用并发使用者线程。因此,您可以使用的线程池而不是线程池:

from("seda:stageName?concurrentConsumers=5").process(...)

至于两者之间的差别,请注意,线程池 可以在运行时动态增加/缩小,具体取决于负载,而并发使用者的数量始终会被修复。

297.6. 线程池

请注意,通过类似以下内容将线程池添加到 SEDA 端点:

from("seda:stageName").thread(5).process(...)

可以取出两个 BlockQueues :一个来自 SEDA 端点,另一个来自线程池的工作队列,这可能不是您想要的。您可能希望使用线程池配置 直接 端点,这样可同步和异步处理消息。例如:

from("direct:stageName").thread(5).process(...)

您还可以使用 并发Consumers 选项直接配置在 SEDA 端点上处理消息的线程数。

297.7. 示例

在下面的路径中,我们使用 SEDA 队列来向这个 async 队列发送请求,以便能够向另一个线程发送 fire-and-forget 消息,并将此线程中的恒定回复返回至原始调用者。

此处我们发送 Hello World 消息,并预期回复是 OK。

"Hello World"消息将从另一个线程的 SEDA 队列中使用,以进行进一步处理。由于这是一个单元测试,因此它将发送到 模拟 端点,在单元测试中我们可以进行断言。

297.8. 使用多个Consumers

可作为 Camel 2.2 提供

在这个示例中,我们定义了两个消费者,并将它们注册为 spring beans。

由于我们在 seda foo 端点上 指定了多个Consumers=true,所以这两个消费者可以接收他们自己的消息副本作为 pub-sub 风格的消息传递。

作为 Beans 是单元测试的一部分,它们只需向模拟端点发送消息,但请注意,我们可以如何使用 @Consume 从 seda 队列中使用 @Consume。

297.9. 提取队列信息.

如果需要,可以在不使用 JMX 的情况下获取队列大小等信息:

SedaEndpoint seda = context.getEndpoint("seda:xxxx");
int size = seda.getExchanges().size();

297.10. 另请参阅

第 298 章 Java Object Serialization DataFormat

作为 Camel 2.12 版本提供

序列化是一种数据格式,它使用标准的 Java Serialization 机制将二进制有效负载整理到 Java 对象,或将 Java 对象编入二进制 blob 中。
例如,以下使用 Java 序列化来联合二进制文件,然后将它作为 ObjectMessage 发送到 ActiveMQ

from("file://foo/bar").
  unmarshal().serialization().
  to("activemq:Some.Queue");

298.1. 选项

Java Object Serialization dataformat 支持 1 选项,它们如下。

名称默认Java 类型描述

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

298.2. 依赖项

此数据格式以 camel-core 提供,因此不需要额外的依赖项。

第 299 章 服务组件

可作为 Camel 版本 2.22 可用

299.1. 使用服务端点

299.2. URI 格式

service:serviceName:endpoint[?options]

299.3. 选项

Service 组件支持 3 个选项,它们如下所列。

名称描述默认类型

service (advanced)

注入要使用的服务。

 

ServiceRegistry

serviceSelector (advanced)

注入用于查找 ServiceRegistry 的 ServiceRegistry 的服务选择器。

 

选择器

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

服务端点使用 URI 语法配置:

service:delegateUri

使用以下路径和查询参数:

299.3.1. 路径名(1 参数):

名称描述默认类型

delegateUri

所需的 端点 uri 以作为服务公开

 

字符串

299.3.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

299.4. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.service.enabled

是否启用服务组件的自动配置。默认启用。

 

布尔值

camel.component.service.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.service.service

注入要使用的服务。选项是一个 org.apache.camel.cloud.ServiceRegistry 类型。

 

字符串

camel.component.service.service-selector

注入用于查找 ServiceRegistry 的 ServiceRegistry 的服务选择器。选项是一个 org.apache.camel.cloud.ServiceRegistry.Selector 类型。

 

字符串

299.5. 实施

Camel 提供以下 ServiceRegistry 实现:

  • camel-consul
  • camel-zookeeper
  • camel-spring-cloud

299.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 300 章 ServiceNow Component

作为 Camel 2.18 版提供

ServiceNow 组件通过 REST API 提供对 ServiceNow 平台的访问。

注意

从 Camel 2.18.1 中,该组件支持多个 ServiceNow 平台版本,默认为 Helsinki。支持的版本是 表 300.1 “API 映射”表 300.2 “API 映射”

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-servicenow</artifactId>
        <version>${camel-version}</version>
    </dependency>

300.1. URI 格式

    servicenow://instanceName?[options]

300.2. 选项

ServiceNow 组件支持 14 个选项,它们如下所列。

名称描述默认类型

instanceName (advanced)

ServiceNow 实例名称

 

字符串

配置 (高级)

ServiceNow 默认配置

 

ServiceNowConfiguration

apiUrl (producer)

ServiceNow REST API url

 

字符串

userName (security)

ServiceNow 用户帐户名称

 

字符串

密码 (安全)

ServiceNow 帐户密码

 

字符串

oauthClientId (security)

OAuth2 ClientID

 

字符串

oauthClientSecret (security)

OAuth2 ClientSecret

 

字符串

oauthTokenUrl (security)

OAuth 令牌 Url

 

字符串

proxyHost (advanced)

代理主机名

 

字符串

proxyPort (advanced)

代理端口号

 

整数

proxyUserName (security)

用于代理身份验证的用户名

 

字符串

proxyPassword (安全性)

用于代理验证的密码

 

字符串

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

ServiceNow 端点使用 URI 语法配置:

servicenow:instanceName

使用以下路径和查询参数:

300.2.1. 路径名(1 参数):

名称描述默认类型

instanceName

所需的 ServiceNow 实例名称

 

字符串

300.2.2. 查询参数(44 参数):

名称描述默认类型

display (producer)

将此参数设置为 true 以只返回选择 indicator Display 字段的 scorecard。将此参数设置为 all 以返回具有任何 Display 字段值的 scorecard。此参数默认为 true。

true

字符串

displayValue (producer)

为参考字段返回显示值(true)、实际值(false)或(all) (默认: false)

false

字符串

excludeReferenceLink (producer)

true 以排除参考字段的表 API 链接(默认: false)

 

布尔值

favorites (producer)

将此参数设置为 true 以仅返回查询用户收藏的 scorecard。

 

布尔值

includeAggregates (producer)

将此参数设置为 true 以始终返回指标的所有可用聚合,包括已应用聚合的时间。如果没有指定值,则此参数默认为 false,并返回没有聚合。

 

布尔值

includeAvailableAggregates (producer)

将此参数设置为 true,以在没有应用聚合时返回指标的所有可用聚合。如果没有指定值,则此参数默认为 false,并返回没有聚合。

 

布尔值

includeAvailableBreakdowns (producer)

将此参数设为 true,以返回指示器的所有可用细分。如果没有指定值,则此参数默认为 false,且不会返回 breakdowns。

 

布尔值

includeScoreNotes (producer)

将这个参数设置为 true 返回与分数关联的所有备注。备注元素包含注释文本,以及添加备注时的作者和时间戳。

 

布尔值

includeScores (producer)

将此参数设置为 true 以返回 scorecard 的所有分数。如果没有指定值,则此参数默认为 false,仅返回最新的分数值。

 

布尔值

inputDisplayValue (producer)

true 设置输入字段的原始值(默认值: false)

 

布尔值

key (producer)

将此参数设置为 true 以只针对密钥指示符返回 scorecard。

 

布尔值

models (producer)

定义请求和响应模型

 

字符串

perPage (producer)

输入每个查询可以返回的最大 scorecard 数量。默认值为 10,最大值为 100。

10

整数

release (producer)

ServiceNow release to target, default to Helsinki See https://docs.servicenow.com

HELSINKI

ServiceNowRelease

requestModels (producer)

定义请求模型

 

字符串

resource (producer)

默认资源可以被标头 CamelServiceNowResource 覆盖

 

字符串

responseModels (producer)

定义响应模型

 

字符串

sortBy (producer)

指定要在排序结果时使用的值。默认情况下,查询会根据值排序记录。

 

字符串

sortDir (producer)

指定排序方向、升序或降序。默认情况下,查询以降序排列记录。使用 sysparm_sortdir=asc 以升序排序。

 

字符串

suppressAutoSysField (producer)

True 用于抑制自动生成的系统字段(默认为 false)

 

布尔值

suppressPaginationHeader (producer)

将此值设置为 true,从响应中删除 Link 标头。通过 Link 标头,当匹配查询的记录数超过查询限制时,可以请求其他数据页面

 

布尔值

table (producer)

默认表可以被标头 CamelServiceNowTable 覆盖

 

字符串

target (producer)

将此参数设置为 true 以仅返回具有目标的 scorecard。

 

布尔值

topLevelOnly (producer)

仅获取其父目录的类别。

 

布尔值

apiVersion (advanced)

ServiceNow REST API 版本, default latest

 

字符串

dateFormat (advanced)

用于 Json serialization/deserialization 的日期格式

yyyy-MM-dd

字符串

dateTimeFormat (advanced)

用于 Json serialization/deserialization 的 date-time 格式

yyyy-MM-dd HH:mm:ss

字符串

httpClientPolicy (advanced)

配置 http-client

 

HTTPClientPolicy

mapper (advanced)

设置 Jackson's ObjectMapper for for request/reply

 

ObjectMapper

proxyAuthorizationPolicy (advanced)

配置代理身份验证

 

ProxyAuthorization 策略

retrieveTargetRecordOn Import (advanced)

将此参数设置为 true,在使用 import set api 时检索目标记录。然后,导入集的结果会被目标记录替代

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

timeFormat (advanced)

用于 Json serialization/deserialization 的时间格式

Hh:mm:ss

字符串

proxyHost (proxy)

代理主机名

 

字符串

proxyPort (proxy)

代理端口号

 

整数

apiUrl (security)

ServiceNow REST API url

 

字符串

oauthClientId (security)

OAuth2 ClientID

 

字符串

oauthClientSecret (security)

OAuth2 ClientSecret

 

字符串

oauthTokenUrl (security)

OAuth 令牌 Url

 

字符串

密码 (安全)

所需的 ServiceNow 帐户密码,提供 MUST

 

字符串

proxyPassword (安全性)

用于代理验证的密码

 

字符串

proxyUserName (security)

用于代理身份验证的用户名

 

字符串

sslContextParameters (security)

使用 SSLContextParameters 配置安全性。See http://camel.apache.org/camel-configuration-utilities.html

 

SSLContextParameters

userName (security)

所需的 ServiceNow 用户帐户名称,提供 MUST

 

字符串

300.3. Spring Boot Auto-Configuration

组件支持 57 选项,它们如下所列。

名称描述默认类型

camel.component.servicenow.api-url

ServiceNow REST API url

 

字符串

camel.component.servicenow.configuration.api-url

ServiceNow REST API url

 

字符串

camel.component.servicenow.configuration.api-version

ServiceNow REST API 版本, default latest

 

字符串

camel.component.servicenow.configuration.date-format

用于 Json serialization/deserialization 的日期格式

yyyy-MM-dd

字符串

camel.component.servicenow.configuration.date-time-format

用于 Json serialization/deserialization 的 date-time 格式

yyyy-MM-dd HH:mm:ss

字符串

camel.component.servicenow.configuration.display

将此参数设置为 true 以只返回选择 indicator Display 字段的 scorecard。将此参数设置为 all 以返回具有任何 Display 字段值的 scorecard。此参数默认为 true。

true

字符串

camel.component.servicenow.configuration.display-value

为参考字段返回显示值(true)、实际值(false)或(all) (默认: false)

false

字符串

camel.component.servicenow.configuration.exclude-reference-link

true 以排除参考字段的表 API 链接(默认: false)

 

布尔值

camel.component.servicenow.configuration.favorites

将此参数设置为 true 以仅返回查询用户收藏的 scorecard。

 

布尔值

camel.component.servicenow.configuration.http-client-policy

配置 http-client

 

HTTPClientPolicy

camel.component.servicenow.configuration.include-aggregates

将此参数设置为 true 以始终返回指标的所有可用聚合,包括已应用聚合的时间。如果没有指定值,则此参数默认为 false,并返回没有聚合。

 

布尔值

camel.component.servicenow.configuration.include-available-aggregates

将此参数设置为 true,以在没有应用聚合时返回指标的所有可用聚合。如果没有指定值,则此参数默认为 false,并返回没有聚合。

 

布尔值

camel.component.servicenow.configuration.include-available-breakdowns

将此参数设为 true,以返回指示器的所有可用细分。如果没有指定值,则此参数默认为 false,且不会返回 breakdowns。

 

布尔值

camel.component.servicenow.configuration.include-score-notes

将这个参数设置为 true 返回与分数关联的所有备注。备注元素包含注释文本,以及添加备注时的作者和时间戳。

 

布尔值

camel.component.servicenow.configuration.include-scores

将此参数设置为 true 以返回 scorecard 的所有分数。如果没有指定值,则此参数默认为 false,仅返回最新的分数值。

 

布尔值

camel.component.servicenow.configuration.input-display-value

true 设置输入字段的原始值(默认值: false)

 

布尔值

camel.component.servicenow.configuration.key

将此参数设置为 true 以只针对密钥指示符返回 scorecard。

 

布尔值

camel.component.servicenow.configuration.mapper

设置 Jackson's ObjectMapper for for request/reply

 

ObjectMapper

camel.component.servicenow.configuration.models

定义请求和响应模型

 

map

camel.component.servicenow.configuration.oauth-client-id

OAuth2 ClientID

 

字符串

camel.component.servicenow.configuration.oauth-client-secret

OAuth2 ClientSecret

 

字符串

camel.component.servicenow.configuration.oauth-token-url

OAuth 令牌 Url

 

字符串

camel.component.servicenow.configuration.password

ServiceNow 帐户密码,提供 MUST

 

字符串

camel.component.servicenow.configuration.per-page

输入每个查询可以返回的最大 scorecard 数量。默认值为 10,最大值为 100。

10

整数

camel.component.servicenow.configuration.proxy-authorization-policy

配置代理身份验证

 

ProxyAuthorization 策略

camel.component.servicenow.configuration.proxy-host

代理主机名

 

字符串

camel.component.servicenow.configuration.proxy-password

用于代理验证的密码

 

字符串

camel.component.servicenow.configuration.proxy-port

代理端口号

 

整数

camel.component.servicenow.configuration.proxy-user-name

用于代理身份验证的用户名

 

字符串

camel.component.servicenow.configuration.release

ServiceNow release to target, default to Helsinki See https://docs.servicenow.com

 

ServiceNowRelease

camel.component.servicenow.configuration.request-models

定义请求模型

 

map

camel.component.servicenow.configuration.resource

默认资源可以被标头 CamelServiceNowResource 覆盖

 

字符串

camel.component.servicenow.configuration.response-models

定义响应模型

 

map

camel.component.servicenow.configuration.retrieve-target-record-on-import

将此参数设置为 true,在使用 import set api 时检索目标记录。然后,导入集的结果会被目标记录替代

false

布尔值

camel.component.servicenow.configuration.sort-by

指定要在排序结果时使用的值。默认情况下,查询会根据值排序记录。

 

字符串

camel.component.servicenow.configuration.sort-dir

指定排序方向、升序或降序。默认情况下,查询以降序排列记录。使用 sysparm_sortdir=asc 以升序排序。

 

字符串

camel.component.servicenow.configuration.ssl-context-parameters

使用 SSLContextParameters 配置安全性。See http://camel.apache.org/camel-configuration-utilities.html

 

SSLContextParameters

camel.component.servicenow.configuration.suppress-auto-sys-field

True 用于抑制自动生成的系统字段(默认为 false)

 

布尔值

camel.component.servicenow.configuration.suppress-pagination-header

将此值设置为 true,从响应中删除 Link 标头。通过 Link 标头,当匹配查询的记录数超过查询限制时,可以请求其他数据页面

 

布尔值

camel.component.servicenow.configuration.table

默认表可以被标头 CamelServiceNowTable 覆盖

 

字符串

camel.component.servicenow.configuration.target

将此参数设置为 true 以仅返回具有目标的 scorecard。

 

布尔值

camel.component.servicenow.configuration.time-format

用于 Json serialization/deserialization 的时间格式

Hh:mm:ss

字符串

camel.component.servicenow.configuration.top-level-only

仅获取其父目录的类别。

 

布尔值

camel.component.servicenow.configuration.user-name

ServiceNow 用户帐户名称,提供 MUST

 

字符串

camel.component.servicenow.enabled

启用服务现在组件

true

布尔值

camel.component.servicenow.instance-name

ServiceNow 实例名称

 

字符串

camel.component.servicenow.oauth-client-id

OAuth2 ClientID

 

字符串

camel.component.servicenow.oauth-client-secret

OAuth2 ClientSecret

 

字符串

camel.component.servicenow.oauth-token-url

OAuth 令牌 Url

 

字符串

camel.component.servicenow.password

ServiceNow 帐户密码

 

字符串

camel.component.servicenow.proxy-host

代理主机名

 

字符串

camel.component.servicenow.proxy-password

用于代理验证的密码

 

字符串

camel.component.servicenow.proxy-port

代理端口号

 

整数

camel.component.servicenow.proxy-user-name

用于代理身份验证的用户名

 

字符串

camel.component.servicenow.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.servicenow.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

camel.component.servicenow.user-name

ServiceNow 用户帐户名称

 

字符串

300.4. Headers

名称类型ServiceNow API Parameter端点选项描述

CamelServiceNowResource

字符串

-

-

访问该资源

CamelServiceNowAction

字符串

-

-

要执行的操作

CamelServiceNowActionSubject

-

-

字符串

应用该操作的约束

CamelServiceNowModel

-

-

数据模型

CamelServiceNowRequestModel

-

-

请求数据模型

CamelServiceNowResponseModel

-

-

响应数据模型

CamelServiceNowOffsetNext

-

-

-

-

CamelServiceNowOffsetPrev

-

-

-

-

CamelServiceNowOffsetFirst

-

-

-

-

CamelServiceNowOffsetLast

-

-

-

-

CamelServiceNowContentType

-

-

-

-

CamelServiceNowContentEncoding

-

-

-

-

CamelServiceNowContentMeta

-

-

-

-

CamelServiceNowSysId

字符串

sys_id

-

-

CamelServiceNowUserSysId

字符串

user_sysid

-

-

CamelServiceNowUserId

字符串

user_id

-

-

CamelServiceNowCartItemId

字符串

cart_item_id

-

-

CamelServiceNowFileName

字符串

file_name

-

-

CamelServiceNowTable

字符串

table_name

-

-

CamelServiceNowTableSysId

字符串

table_sys_id

-

-

CamelServiceNowEncryptionContext

字符串

encryption_context

-

-

CamelServiceNowCategory

字符串

sysparm_category

-

-

CamelServiceNowType

字符串

sysparm_type

-

-

CamelServiceNowCatalog

字符串

sysparm_catalog

-

-

CamelServiceNowQuery

字符串

sysparm_query

-

-

CamelServiceNowDisplayValue

字符串

sysparm_display_value

displayValue

-

CamelServiceNowInputDisplayValue

布尔值

sysparm_input_display_value

inputDisplayValue

-

CamelServiceNowExcludeReferenceLink

布尔值

sysparm_exclude_reference_link

excludeReferenceLink

-

CamelServiceNowFields

字符串

sysparm_fields

-

-

CamelServiceNowLimit

整数

sysparm_limit

-

-

CamelServiceNowText

字符串

sysparm_text

-

-

CamelServiceNowOffset

整数

sysparm_offset

-

-

CamelServiceNowView

字符串

sysparm_view

-

-

CamelServiceNowSuppressAutoSysField

布尔值

sysparm_suppress_auto_sys_field

suppressAutoSysField

-

CamelServiceNowSuppressPaginationHeader

Booleab

sysparm_suppress_pagination_header

suppressPaginationHeader

-

CamelServiceNowMinFields

字符串

sysparm_min_fields

-

-

CamelServiceNowMaxFields

字符串

sysparm_max_fields

-

-

CamelServiceNowSumFields

字符串

sysparm_sum_fields

-

-

CamelServiceNowAvgFields

字符串

sysparm_avg_fields

-

-

CamelServiceNowCount

布尔值

sysparm_count

-

-

CamelServiceGroupBy

字符串

sysparm_group_by

-

-

CamelServiceOrderBy

字符串

sysparm_order_by

-

-

CamelServiceHaving

字符串

sysparm_having

-

-

CamelServiceNowUUID

字符串

sysparm_uuid

-

-

CamelServiceNowBreakdown

字符串

sysparm_breakdown

-

-

CamelServiceNowIncludeScores

布尔值

sysparm_include_scores

includeScores

-

CamelServiceNowIncludeScoreNotes

布尔值

sysparm_include_score_notes

includeScoreNotes

-

CamelServiceNowIncludeAggregates

布尔值

sysparm_include_aggregates

includeAggregates

-

CamelServiceNowIncludeAvailableBreakdowns

布尔值

sysparm_include_available_breakdowns

includeAvailableBreakdowns

-

CamelServiceNowIncludeAvailableAggregates

布尔值

sysparm_include_available_aggregates

includeAvailableAggregates

-

CamelServiceNowFavorites

布尔值

sysparm_favorites

favorites

-

CamelServiceNowKey

布尔值

sysparm_key

key

-

CamelServiceNowTarget

布尔值

sysparm_target

target

-

CamelServiceNowDisplay

字符串

sysparm_display

显示

-

CamelServiceNowPerPage

整数

sysparm_per_page

perPage

-

CamelServiceNowSortBy

字符串

sysparm_sortby

sortBy

-

CamelServiceNowSortDir

字符串

sysparm_sortdit

sortDir

-

CamelServiceNowContains

字符串

sysparm_contains

-

-

CamelServiceNowTags

字符串

sysparm_tags

-

-

CamelServiceNowPage

字符串

sysparm_page

-

-

CamelServiceNowElementsFilter

字符串

sysparm_elements_filter

-

-

CamelServiceNowBreakdownRelation

字符串

sysparm_breakdown_relation

-

-

CamelServiceNowDataSource

字符串

sysparm_data_source

-

-

CamelServiceNowTopLevelOnly

布尔值

sysparm_top_level_only

topLevelOnly

-

CamelServiceNowApiVersion

字符串

-

-

REST API 版本

CamelServiceNowResponseMeta

map

-

-

提供的元数据及响应

表 300.1. API 映射

CamelServiceNowResourceCamelServiceNowAction方法API URI

RETRIEVE

GET

/api/now/v1/table/{table_name}/{sys_id}

CREATE

POST

/api/now/v1/table/{table_name}

修改

PUT

/api/now/v1/table/{table_name}/{sys_id}

DELETE

DELETE

/api/now/v1/table/{table_name}/{sys_id}

更新

PATCH

/api/now/v1/table/{table_name}/{sys_id}

AGGREGATE

RETRIEVE

GET

/api/now/v1/stats/{table_name}

IMPORT

RETRIEVE

GET

/api/now/import/{table_name}/{sys_id}

CREATE

POST

/api/now/import/{table_name}

表 300.2. API 映射

CamelServiceNowResourceCamelServiceNowActionCamelServiceNowActionSubject方法API URI

RETRIEVE

 

GET

/api/now/v1/table/{table_name}/{sys_id}

CREATE

 

POST

/api/now/v1/table/{table_name}

修改

 

PUT

/api/now/v1/table/{table_name}/{sys_id}

DELETE

 

DELETE

/api/now/v1/table/{table_name}/{sys_id}

更新

 

PATCH

/api/now/v1/table/{table_name}/{sys_id}

AGGREGATE

RETRIEVE

 

GET

/api/now/v1/stats/{table_name}

IMPORT

RETRIEVE

 

GET

/api/now/import/{table_name}/{sys_id}

CREATE

 

POST

/api/now/import/{table_name}

ATTACHMENT

RETRIEVE

 

GET

/api/now/api/now/attachment/{sys_id}

内容

 

GET

/api/now/attachment/{sys_id}/file

上传

 

POST

/api/now/api/now/attachment/file

DELETE

 

DELETE

/api/now/attachment/{sys_id}

SCORECARDS

RETRIEVE

PERFORMANCE_ANALYTICS

GET

/api/now/pa/scorecards

MISC

RETRIEVE

USER_ROLE_INHERITANCE

GET

/api/global/user_role_inheritance

CREATE

IDENTIFY_RECONCILE

POST

/api/now/identifyreconcile

SERVICE_CATALOG

RETRIEVE

 

GET

/sn_sc/servicecatalog/catalogs/{sys_id}

RETRIEVE

类别

GET

/sn_sc/servicecatalog/catalogs/{sys_id}/categories

SERVICE_CATALOG_ITEMS

RETRIEVE

 

GET

/sn_sc/servicecatalog/items/{sys_id}

RETRIEVE

SUBMIT_GUIDE

POST

/sn_sc/servicecatalog/items/{sys_id}/submit_guide

RETRIEVE

CHECKOUT_GUIDE

POST

/sn_sc/servicecatalog/items/{sys_id}/checkout_guide

CREATE

SUBJECT_CART

POST

/sn_sc/servicecatalog/items/{sys_id}/add_to_cart

CREATE

SUBJECT_PRODUCER

POST

/sn_sc/servicecatalog/items/{sys_id}/submit_producer

SERVICE_CATALOG_CARTS

RETRIEVE

 

GET

/sn_sc/servicecatalog/cart

RETRIEVE

DELIVERY_ADDRESS

GET

/sn_sc/servicecatalog/cart/delivery_address/{user_id}

RETRIEVE

CHECKOUT

POST

/sn_sc/servicecatalog/cart/checkout

更新

 

POST

/sn_sc/servicecatalog/cart/{cart_item_id}

更新

CHECKOUT

POST

/sn_sc/servicecatalog/cart/submit_order

DELETE

 

DELETE

/sn_sc/servicecatalog/cart/{sys_id}/empty

SERVICE_CATALOG_CATEGORIES

RETRIEVE

 

GET

/sn_sc/servicecatalog/categories/{sys_id}

300.5. 使用示例:

 

检索 10 个事件

context.addRoutes(new RouteBuilder() {
    public void configure() {
       from("direct:servicenow")
           .to("servicenow:{{env:SERVICENOW_INSTANCE}}"
               + "?userName={{env:SERVICENOW_USERNAME}}"
               + "&password={{env:SERVICENOW_PASSWORD}}"
               + "&oauthClientId={{env:SERVICENOW_OAUTH2_CLIENT_ID}}"
               + "&oauthClientSecret={{env:SERVICENOW_OAUTH2_CLIENT_SECRET}}"
           .to("mock:servicenow");
    }
}); 

FluentProducerTemplate.on(context)
    .withHeader(ServiceNowConstants.RESOURCE, "table")
    .withHeader(ServiceNowConstants.ACTION, ServiceNowConstants.ACTION_RETRIEVE)
    .withHeader(ServiceNowConstants.SYSPARM_LIMIT.getId(), "10")
    .withHeader(ServiceNowConstants.TABLE, "incident")
    .withHeader(ServiceNowConstants.MODEL, Incident.class)
    .to("direct:servicenow")
    .send();

第 301 章 Servlet 组件

可作为 Camel 版本 2.0 提供

servlet: 组件提供基于 HTTP 的端点,用于消耗 HTTP 请求,该请求到达一个绑定到公布的 Servlet 的 HTTP 端点。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-servlet</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
注意

Stream

servlet 基于流,这意味着其接收的输入被提交到 Camel 作为流。这意味着,您只能 一次 读取流的内容。如果发现消息正文似乎为空,或者您需要多次访问数据(例如:执行多播或重新传送错误处理),您应该使用 Stream 缓存或将消息正文转换为可多次读取多次的 String

301.1. URI 格式

servlet://relative_path[?options]

您可以使用以下格式将查询选项附加到 URI: ?option=value&option=value&…​

301.2. 选项

Servlet 组件支持 9 个选项,它们如下所列。

名称描述默认类型

servletName (consumer)

要使用的默认 servlet 名称。默认名称为 CamelServlet。

CamelServlet

字符串

httpRegistry (consumer)

使用自定义 org.apache.camel.component.servlet.HttpRegistry。

 

HttpRegistry

附加多部分绑定 (使用者)

是否会在 Camel Exchange 上自动绑定多部分/信息数据作为附件。选项附加MultipartBinding=true 和 disableStreamCache=false 无法一起工作。删除 disableStreamCache 以使用 AttachmentMultipartBinding。这将默认关闭,因为这可能需要 servlet 特定配置在使用 Servlet 时启用此功能。

false

布尔值

fileNameExtWhitelist (consumer)

接受上传的文件的接受文件名扩展白名单。多个扩展可以通过逗号分隔,如 txt,xml。

 

字符串

httpBinding (advanced)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

HttpBinding

httpConfiguration (advanced)

使用共享 HttpConfiguration 作为基本配置。

 

HttpConfiguration

allowJavaSerialized Object (advanced)

请求使用 context-type=application/x-java-serialized-object 时,是否允许 java serialization。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Servlet 端点使用 URI 语法进行配置:

servlet:contextPath

使用以下路径和查询参数:

301.2.1. 路径名(1 参数):

名称描述默认类型

contextPath

要使用的 context-path

 

字符串

301.2.2. 查询参数(22 参数):

名称描述默认类型

disableStreamCache (common)

确定 Servlet 的原始输入流是否已缓存(Camel 将读取流到文件,流缓存)缓存。默认情况下,Camel 会缓存 Servlet 输入流,以支持多次读取它,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。DefaultHttpBinding 会将请求输入流复制到流缓存中,如果这个选项为 false,则会将其放入消息正文,以便支持多次读取流。如果使用 Servlet 桥接/代理端点,请考虑启用这个选项来提高性能,如果不需要多次读取消息有效负载。http/http4 producer 默认将缓存响应正文流。如果将此选项设置为 true,则生产者不会缓存响应正文流,而是使用响应流,作为消息正文。

false

布尔值

headerFilterStrategy (common)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

httpBinding (common)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

HttpBinding

async (consumer)

将消费者配置为以同步模式工作

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

块( 消费者)

如果这个选项为 false,则 Servlet 将禁用 HTTP 流并在响应上设置内容长度的标头

true

布尔值

httpMethodRestrict (consumer)

仅用于允许消耗 HttpMethod 匹配,如 GET/POST/PUT 等。可以使用逗号分隔多个方法。

 

字符串

matchOnUriPrefix (consumer)

如果找不到完全匹配,则使用者是否应该尝试通过匹配 URI 前缀来查找目标使用者。

false

布尔值

responseBufferSize (consumer)

使用 javax.servlet.ServletResponse 的自定义缓冲区大小。

 

整数

servletName (consumer)

要使用的 servlet 的名称

CamelServlet

字符串

transferException (consumer)

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。在制作者端,异常会按原样进行反序列化和丢弃,而不是 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

attachmentMultipartBinding (consumer)

是否会在 Camel Exchange 上自动绑定多部分/信息数据作为附件。选项附加MultipartBinding=true 和 disableStreamCache=false 无法一起工作。删除 disableStreamCache 以使用 AttachmentMultipartBinding。这将默认关闭,因为这可能需要 servlet 特定配置在使用 Servlet 时启用此功能。

false

布尔值

eagerCheckContentAvailable (consumer)

是否预先检查 HTTP 请求是否有内容(如果 content-length 标头为 0 )是否有内容。这可在问题单中打开 HTTP 客户端不会发送流化数据。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

fileNameExtWhitelist (consumer)

接受上传的文件的接受文件名扩展白名单。多个扩展可以通过逗号分隔,如 txt,xml。

 

字符串

optionsEnabled (consumer)

指定是否为这个 Servlet consumer 启用 HTTP OPTIONS。默认情况下,OPTIONS 会被关闭。

false

布尔值

traceEnabled (consumer)

指定是否为这个 Servlet consumer 启用 HTTP TRACE。默认关闭 TRACE。

false

布尔值

mapHttpMessageBody (advanced)

如果此选项正确,则交换正文将映射到 HTTP 正文。将其设置为 false 将避免 HTTP 映射。

true

布尔值

mapHttpMessageFormUrl EncodedBody (advanced)

如果这个选项为 true,则交换的 IN Exchange Form Encode 正文将映射到 HTTP。将其设置为 false 可以避免 HTTP Form Encoded body 映射。

true

布尔值

mapHttpMessageHeaders (advanced)

如果此选项为 true,则交换的 IN Exchange Headers 将映射到 HTTP 标头。将其设置为 false 将避免 HTTP 标头映射。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

301.3. Spring Boot Auto-Configuration

组件支持 13 个选项,它们如下所列。

名称描述默认类型

camel.component.servlet.allow-java-serialized-object

请求使用 context-type=application/x-java-serialized-object 时,是否允许 java serialization。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

camel.component.servlet.attachment-multipart-binding

是否会在 Camel Exchange 上自动绑定多部分/信息数据作为附件。选项附加MultipartBinding=true 和 disableStreamCache=false 无法一起工作。删除 disableStreamCache 以使用 AttachmentMultipartBinding。这将默认关闭,因为这可能需要 servlet 特定配置在使用 Servlet 时启用此功能。

false

布尔值

camel.component.servlet.enabled

启用 servlet 组件

true

布尔值

camel.component.servlet.file-name-ext-whitelist

接受上传的文件的接受文件名扩展白名单。多个扩展可以通过逗号分隔,如 txt,xml。

 

字符串

camel.component.servlet.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.servlet.http-binding

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。选项是一个 org.apache.camel.http.common.HttpBinding 类型。

 

字符串

camel.component.servlet.http-configuration

使用共享 HttpConfiguration 作为基本配置。选项是一个 org.apache.camel.http.common.HttpConfiguration 类型。

 

字符串

camel.component.servlet.http-registry

使用自定义 org.apache.camel.component.servlet.HttpRegistry。选项是一个 org.apache.camel.component.servlet.HttpRegistry 类型。

 

字符串

camel.component.servlet.mapping.context-path

servlet 组件用于自动映射的上下文路径。

/camel/*

字符串

camel.component.servlet.mapping.enabled

启用 servlet 组件到 Spring web 上下文的自动映射。

true

布尔值

camel.component.servlet.mapping.servlet-name

Camel servlet 的名称。

CamelServlet

字符串

camel.component.servlet.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.servlet.servlet-name

要使用的默认 servlet 名称。默认名称为 CamelServlet。

CamelServlet

字符串

301.4. 消息标头

Camel 将应用与 HTTP 组件相同的消息标头。

Camel 还将填充 所有 request.parameterrequest.headers。例如,如果客户端请求的 URL 为 http://myserver/myserver?orderid=123,则交换将包含名为 orderid 的标头,其值为 123。

301.5. 使用

您只能使用 来自 Servlet 组件生成的端点。因此,它应该只用作 Camel 路由的输入。要针对其他 HTTP 端点发出 HTTP 请求,请使用 HTTP 组件

301.6. 将 Camel JAR 放在 app 服务器引导类路径中

如果您将 Camel JAR (如 camel-corecamel-servlet 等)放在应用服务器的启动类路径中(通常位于其 lib 目录中),那么注意 servlet 映射列表现在会在应用服务器中的多个部署的 Camel 应用程序间共享。

请记住,将 Camel JAR 放在应用服务器的引导类路径中通常并非最佳实践!

因此,在这些情况下,您必须在每个 Camel 应用程序中定义自定义和唯一的 servlet 名称,例如 web.xml 定义:

<servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

然后,在您的 Camel 端点中包含 servlet 名称

<route>
  <from uri="servlet://foo?servletName=MyServlet"/>
  ...
</route>

Camel 2.11 开始,Camel 2.11 将检测此重复,且无法启动应用程序。您可以通过将 servlet init-parameter ignoreDuplicateServletName 设置为 true 来控制忽略这个重复,如下所示:

  <servlet>
    <servlet-name>CamelServlet</servlet-name>
    <display-name>Camel Http Transport Servlet</display-name>
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
    <init-param>
      <param-name>ignoreDuplicateServletName</param-name>
      <param-value>true</param-value>
    </init-param>
  </servlet>

强烈建议您 为每个 Camel 应用程序使用唯一的 servlet-name,以避免此重复,以及任何不预见的副作用。

301.7. 示例

注意

从 Camel 2.7 开始,在 Spring web 应用程序中使用 Servlet 更加简单。详情请查看 Servlet Tomcat 示例

在本例中,我们定义了一个在 http://localhost:8080/camel/services/hello 中公开 HTTP 服务的路由。

首先,您需要通过普通 Web 容器或 OSGi 服务发布 CamelHttpTransportServlet。使用 Web.xml 文件发布 CamelHttpTransportServlet,如下所示:

<web-app>

  <servlet>
    <servlet-name>CamelServlet</servlet-name>
    <display-name>Camel Http Transport Servlet</display-name>
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>CamelServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

</web-app>

然后,您可以按照以下方法定义路由:

from("servlet:hello?matchOnUriPrefix=true").process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
        String path = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
        path = path.substring(path.lastIndexOf("/"));

        assertEquals("Get a wrong content type", CONTENT_TYPE, contentType);
        // assert camel http header
        String charsetEncoding = exchange.getIn().getHeader(Exchange.HTTP_CHARACTER_ENCODING, String.class);
        assertEquals("Get a wrong charset name from the message heaer", "UTF-8", charsetEncoding);
        // assert exchange charset
        assertEquals("Get a wrong charset naem from the exchange property", "UTF-8", exchange.getProperty(Exchange.CHARSET_NAME));
        exchange.getOut().setHeader(Exchange.CONTENT_TYPE, contentType + "; charset=UTF-8");
        exchange.getOut().setHeader("PATH", path);
        exchange.getOut().setBody("<b>Hello World</b>");
    }
});
注意

指定 camel-servlet 端点的相对路径

由于我们将 HTTP 传输与公布的 servlet 绑定,因此我们不知道 servlet 的应用上下文路径,因此 camel-servlet 端点使用相对路径来指定端点的 URL。客户端可以通过 servlet 发布地址( "http://localhost:8080/camel/services")+ RELATIVE_PATH ("/hello")访问 camel-servlet 端点。

301.7.1. 使用 Spring 3.x 时的示例

请参阅 Servlet Tomcat 示例

301.7.2. 使用 Spring 2.x 时的示例

在 Camel/Spring 应用程序中使用 Servlet 组件时,通常需要在 Servlet 组件启动后加载 Spring ApplicationContext。这可以通过使用 Spring 的 ContextLoaderServlet 而不是 ContextLoaderListener 来完成。在这种情况下,您需要在 CamelHttpTransportServlet 后启动 ContextLoaderServlet,如下所示:

<web-app>
  <servlet>
        <servlet-name>CamelServlet</servlet-name>
        <servlet-class>
            org.apache.camel.component.servlet.CamelHttpTransportServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
        <servlet-name>SpringApplicationContext</servlet-name>
        <servlet-class>
            org.springframework.web.context.ContextLoaderServlet
        </servlet-class>
        <load-on-startup>2</load-on-startup>
  </servlet>
<web-app>

301.7.3. 使用 OSGi 的示例

Camel 2.6.0,您可以使用蓝图发布 CamelHttpTransportServlet 作为 OSGi 服务,如下所示:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

    <bean id="camelServlet" class="org.apache.camel.component.servlet.CamelHttpTransportServlet" />

    <!--
        Enlist it in OSGi service registry.
        This will cause two things:
        1) As the pax web whiteboard extender is running the CamelServlet will
           be registered with the OSGi HTTP Service
        2) It will trigger the HttpRegistry in other bundles so the servlet is
           made known there too
    -->
    <service ref="camelServlet">
        <interfaces>
            <value>javax.servlet.Servlet</value>
            <value>org.apache.camel.http.common.CamelServlet</value>
        </interfaces>
        <service-properties>
            <entry key="alias" value="/camel/services" />
            <entry key="matchOnUriPrefix" value="true" />
            <entry key="servlet-name" value="CamelServlet" />
        </service-properties>
    </service>

</blueprint>

然后,在您的 Camel 路由中使用该服务,如下所示:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

    <reference id="servletref" ext:proxy-method="classes" interface="org.apache.camel.http.common.CamelServlet">
        <reference-listener ref="httpRegistry" bind-method="register" unbind-method="unregister" />
    </reference>

    <bean id="httpRegistry" class="org.apache.camel.component.servlet.DefaultHttpRegistry" />

    <bean id="servlet" class="org.apache.camel.component.servlet.ServletComponent">
        <property name="httpRegistry" ref="httpRegistry" />
    </bean>

    <bean id="servletProcessor" class="org.apache.camel.example.servlet.ServletProcessor" />

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <!-- Notice how we can use the servlet scheme which is that reference above -->
            <from uri="servlet://hello" />
            <process ref="servletProcessor" />
        </route>
    </camelContext>

</blueprint>

对于 Camel 2.6 之前的版本,您可以使用 Activator 在 OSGi 平台上发布 CamelHttpTransportServlet

import java.util.Dictionary;
import java.util.Hashtable;

import org.apache.camel.component.servlet.CamelHttpTransportServlet;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.osgi.context.BundleContextAware;

public final class ServletActivator implements BundleActivator, BundleContextAware {
    private static final Logger LOG = LoggerFactory.getLogger(ServletActivator.class);
    private static boolean registerService;

    /**
     * HttpService reference.
     */
    private ServiceReference<?> httpServiceRef;

    /**
     * Called when the OSGi framework starts our bundle
     */
    public void start(BundleContext bc) throws Exception {
        registerServlet(bc);
    }

    /**
     * Called when the OSGi framework stops our bundle
     */
    public void stop(BundleContext bc) throws Exception {
        if (httpServiceRef != null) {
            bc.ungetService(httpServiceRef);
            httpServiceRef = null;
        }
    }

    protected void registerServlet(BundleContext bundleContext) throws Exception {
        httpServiceRef = bundleContext.getServiceReference(HttpService.class.getName());

        if (httpServiceRef != null && !registerService) {
            LOG.info("Register the servlet service");
            final HttpService httpService = (HttpService)bundleContext.getService(httpServiceRef);
            if (httpService != null) {
                // create a default context to share between registrations
                final HttpContext httpContext = httpService.createDefaultHttpContext();
                // register the hello world servlet
                final Dictionary<String, String> initParams = new Hashtable<String, String>();
                initParams.put("matchOnUriPrefix", "false");
                initParams.put("servlet-name", "CamelServlet");
                httpService.registerServlet("/camel/services", // alias
                    new CamelHttpTransportServlet(), // register servlet
                    initParams, // init params
                    httpContext // http context
                );
                registerService = true;
            }
        }
    }

    public void setBundleContext(BundleContext bc) {
        try {
            registerServlet(bc);
        } catch (Exception e) {
            LOG.error("Cannot register the servlet, the reason is " + e);
        }
    }

}

301.7.4. Spring-Boot 的使用情况

Camel 2.19.0 开始,camel-servlet-starter 库自动绑定 /camel/* 上下文路径下的所有其他端点。下表总结了 camel-servlet-starter 库中提供的其他配置属性。也可以禁用 Camel servlet 的自动映射。

spring-Boot Property默认描述

camel.component.servlet.mapping.enabled

true

启用 servlet 组件到 Spring web 上下文的自动映射

camel.component.servlet.mapping.context-path

/camel/*

servlet 组件用于自动映射的上下文路径

camel.component.servlet.mapping.servlet-name

CamelServlet

Camel servlet 的名称

301.8. 另请参阅

301.9. ServletListener Component

可从 Camel 2.11 开始

此组件用于引导 Web 应用程序中 Camel 应用程序。例如,您必须先找到自己的引导 Camel 的方式,或者依赖 Spring 等第三方框架来完成它。

注意

侧边栏 (侧边栏)支持 Servlet 2.x onwards,这意味着它也在较旧的 Web 容器中工作;这是此组件的目标。虽然 Servlet 2.x 需要使用 web.xml 文件作为配置。对于 Servlet 3.x 容器,您可以使用注解驱动的配置来利用 @WebListener 增加 Camel,并在您提升 Camel 时实施您自己的类。这样做仍然会面临如何让最终用户轻松配置 Camel,通过旧学校 web.xml 文件可以免费获取这些挑战。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-servletlistener</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

301.9.1. 使用

您需要选择以下一种提取类 org.apache.camel.component.servletlistener.CamelServletContextListener

  • JndiCamelServletContextListener 使用 JndiRegistry 为其 registry 使用 JNDI。
  • SimpleCamelServletContextListener,它使用 SimpleRegistry 来利用 java.util.Map 作为其 registry。

要使用此目的,您需要在 WEB-INF/web .xml 文件中配置 org.apache.camelServletContextListener,如下所示:

301.9.2. 选项

org.apache.camel.component.servletlistener.CamelServletContextListener 支持将以下选项配置为 web.xml 文件中的 context-param。

选项类型描述

propertyPlaceholder.XXX

 

在 Camel 中配置属性占位符。您应该为选项添加"propertyPlaceholder"。例如,要配置位置,请使用 propertyPlaceholder.location 作为名称。您可以配置 Properties 组件中的所有选项。

jmx.XXX

 

要配置 JMX。您应该为 选项加上"jmx."前缀,例如禁用 JMX,使用 jmx.disabled 作为名称。您可以配置 org.apache.camel.spi.ManagementAgent 中的所有选项。以及 JMX 页面中提到的选项。

name

字符串

配置 CamelContext 的名称。

messageHistory

布尔值

Camel 2.12.2: 要启用或禁用消息历史(默认为启用)是否是谁。

streamCache

布尔值

是否启用流缓存。

trace

布尔值

是否启用 tracer。

delayer

Long

要为 Delay Interceptor 设置延迟值。

handleFault

布尔值

是否启用处理错误。

errorHandlerRef

字符串

指的是要使用上下文范围的 Error Handler。

autoStartup

布尔值

启动 Camel 时是否启动所有路由。

useMDCLogging

布尔值

是否使用 MDC 日志记录。

useBreadcrumb

布尔值

是否使用面包屑导航栏.

managementNamePattern

字符串

要为 JMX MBeans 设置自定义命名模式,请执行以下操作:

threadNamePattern

字符串

要为线程设置自定义命名模式。

properties.XXX

 

设置 CamelContext.getProperties 上的自定义属性。这是使用很少的。

routebuilder.XXX

 

配置要使用的路由。详情请查看以下信息。

CamelContextLifecycle

 

指的是 org.apache.camel.component.servletlistener.CamelContextLifecycle 的 FQN 类名称。它允许在 CamelContext 启动和停止之前和之后执行自定义代码。详情请查看以下信息。

XXX

 

要在 CamelContext 上设置任何选项。

301.9.3. 例子

请参阅 Servlet Tomcat No Spring Example

301.9.4. 访问创建的 CamelContext

可作为 Camel 2.14/2.13.3/2.12.5 可用

创建的 CamelContext 存储在 ServletContext 上,作为带有键 "CamelContext" 的属性。如果可以容纳 ServletContext,如下所示:

ServletContext sc = ...
CamelContext camel = (CamelContext) sc.getAttribute("CamelContext");

 

301.9.5. 配置路由

您需要配置 web.xml 文件中要使用的路由。您可以以多种方式完成此操作,但所有参数都必须以 "routeBuilder" 前缀。

301.9.5.1. 使用 RouteBuilder 类

默认情况下,Camel 将假定 param-value 是 Camel RouteBuilder 类的 FQN 类名称,如下所示:

  <context-param>
    <param-name>routeBuilder-MyRoute</param-name>
    <param-value>org.apache.camel.component.servletlistener.MyRoute</param-value>
  </context-param>

您可以在相同的 param-value 中指定多个类,如下所示:

  <context-param>
    <param-name>routeBuilder-routes</param-name>
    <!-- we can define multiple values separated by comma -->
    <param-value>
      org.apache.camel.component.servletlistener.MyRoute,
      org.apache.camel.component.servletlistener.routes.BarRouteBuilder
    </param-value>
  </context-param>

参数的名称在运行时没有意义。它只需要是唯一的,且以"routeBuilder"开始。在上面的示例中,我们有 "routeBuilder-routes"。但也可以将其命名为 "routeBuilder.foo"。

301.9.5.2. 使用软件包扫描

您还可以告诉 Camel 使用软件包扫描,这意味着它将查找所有类 RouteBuilder 类型,并将其作为 Camel 路由自动添加。要做到这一点,您需要使用 "packagescan:" 为值添加前缀,如下所示:

  <context-param>
    <param-name>routeBuilder-MyRoute</param-name>
    <!-- define the routes using package scanning by prefixing with packagescan: -->
    <param-value>packagescan:org.apache.camel.component.servletlistener.routes</param-value>
  </context-param>

301.9.5.3. 使用 XML 文件

您还可以使用 XML DSL 定义 Camel 路由,尽管我们不使用 Spring 或 Blueprint,而 XML 文件只能包含 Camel 路由。

在 web.xml 中,您可以引用来自 "classpath"、"file" 或 "http" url 的 XML 文件,如下所示:

  <context-param>
    <param-name>routeBuilder-MyRoute</param-name>
    <param-value>classpath:routes/myRoutes.xml</param-value>
  </context-param>

XML 文件是:

routes/myRoutes.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- the xmlns="http://camel.apache.org/schema/spring" is needed -->
<routes xmlns="http://camel.apache.org/schema/spring">

  <route id="foo">
    <from uri="direct:foo"/>
    <to uri="mock:foo"/>
  </route>

  <route id="bar">
    <from uri="direct:bar"/>
    <to uri="mock:bar"/>
  </route>

</routes>

请注意,在 XML 文件中,root 标签为 <routes>,必须使用命名空间 "http://camel.apache.org/schema/spring"。此命名空间在名称中包含 spring,但由于历史原因,因为 Spring 是首次存在,因此此时只有 XML DSL。在运行时不需要 Spring JAR。或许在 Camel 3.0 中,命名空间可以重命名为通用名称。

301.9.5.4. 配置正确的占位符

以下是设置属性占位符以加载 classpath 中的 myproperties.properties 的 web.xml 配置片段

  <!-- setup property placeholder to load properties from classpath -->
  <!-- we do this by setting the param-name with propertyPlaceholder. as prefix and then any options such as location, cache etc -->
  <context-param>
    <param-name>propertyPlaceholder.location</param-name>
    <param-value>classpath:myproperties.properties</param-value>
  </context-param>
  <!-- for example to disable cache on properties component, you do -->
  <context-param>
    <param-name>propertyPlaceholder.cache</param-name>
    <param-value>false</param-value>
  </context-param>

301.9.5.5. 配置 JMX

以下是用于配置 JMX 的 web.xml 配置片段,如禁用 JMX。

  <!-- configure JMX by using names that is prefixed with jmx. -->
  <!-- in this example we disable JMX -->
  <context-param>
    <param-name>jmx.disabled</param-name>
    <param-value>true</param-value>
  </context-param>

JNDI 或 Simple 作为 Camel Registry ^^^^^^^^^^^^^

此组件使用 JNDI 或 Simple 作为 Registry。
这可让您在 JNDI 中查找 Bean和其它服务,并绑定和取消绑定您自己的 Bean

这通过实施 org.apache.camel.component.servletlistener.CamelContextLifecycle,从 Java 代码执行。

301.9.5.6. 使用自定义 CamelContextLifecycle

在下面的代码中,我们使用 beforeStartafterStop 将自定义 bean 列在 Simple Registry 中,并在我们停止时进行清理。

然后,我们需要使用名称"CamelContextLifecycle"在 web.xml 文件中注册本课程。该值必须是 FQN,它引用了实施 org.apache.camel.component.servletlistener.CamelContext Life 周期接口的类。

  <context-param>
    <param-name>CamelContextLifecycle</param-name>
    <param-value>org.apache.camel.component.servletlistener.MyLifecycle</param-value>
  </context-param>

我们使用名称"my Bean "列出 HelloBean Bean,我们在 Camel 路由中引用此 Bean,如下所示:

public class MyBeanRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("seda:foo").routeId("foo")
            .to("bean:myBean")
            .to("mock:foo");
    }
}

重要信息: 如果您使用 org.apache.camel.component.servletlistener.JndiCamelServletContextListener,那么 CamelContext Life 周期也必须使用 JndiRegistry。如果 servlet 为 org.apache.camel.component.servletlistener.SimpleCamelServletContextListener,那么 CamelContextLifecycle 必须使用 SimpleRegistry

301.9.6. 另请参阅

第 302 章 SFTP 组件

可作为 Camel 版本 1.1 提供

此组件通过 FTP 和 SFTP 协议提供对远程文件系统的访问。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ftp</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

如需更多信息,您可以查看 FTP 组件

302.1. URI 选项

以下选项适用于 FTPS 组件。

SFTP 组件没有选项。

SFTP 端点使用 URI 语法进行配置:

sftp:host:port/directoryName

使用以下路径和查询参数:

302.1.1. 路径名(3 参数):

名称描述默认类型

主机

FTP 服务器 所需的 主机名

 

字符串

port

FTP 服务器的端口

 

int

directoryName

启动目录

 

字符串

302.1.2. 查询参数(117 参数):

名称描述默认类型

charset (common)

此选项用于指定文件的编码。您可以在使用者上使用此来指定文件的编码,允许 Camel 知道 charset,以便在访问文件内容时加载文件内容。同样在编写文件时,也可以使用这个选项来指定 charset 以写入该文件。请记住,在编写文件 Camel 时,可能需要读取消息内容到内存中,以便能够将数据转换为配置的 charset,因此如果您有较大消息,则不会使用此消息。

 

字符串

disconnect (common)

使用后是否与远程 FTP 服务器断开连接。断开连接只会断开当前与 FTP 服务器的连接。如果您有一个要停止的消费者,则需要停止消费者/路由。

false

布尔值

doneFileName (common)

制作者:如果提供,Camel 将在写入原始文件时写入 2 个操作文件。完成的文件将为空。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。生成的文件将始终写在与原始文件相同的文件夹中。消费者:如果提供,Camel 才会消耗文件(如果存在)文件。此选项配置要使用的文件名。您可以指定一个固定名称。或者您可以使用动态占位符。完成的文件始终与原始文件在同一文件夹中。只支持 $file.name 和 $file.name.noext 作为动态占位符。

 

字符串

fileName (common)

使用文件语言等表达式动态设置文件名。对于消费者,它被用作文件名过滤器。对于制作者而言,用于评估要写入的文件名。如果设置了表达式,它将优先于 CamelFileName 标头。(注:标题本身也可以是 Expression)。表达式选项支持 String 和 Expression 类型。如果表达式是 String 类型,则始终会使用文件语言来评估。如果表达式是 Expression 类型,则使用指定的 Expression 类型 - 这允许您使用 OGNL 表达式。对于消费者,您可以使用文件名来过滤文件名,因此您可以使用文件语言语法:mydata-$date:now:yyyyMMdd.txt。生产者支持 CamelOverruleFileName 标头,其优先级高于任何现有的 CamelFileName 标头;CamelOverruleFileName 只是一个标头,而且可以更轻松地进行临时存储 CamelFileName,且必须稍后恢复。

 

字符串

jschLoggingLevel (common)

用于 JSCH 活动日志记录的日志级别。默认情况下,JSCH 详细于 INFO 级别,阈值默认为 WARN。

WARN

LoggingLevel

separator (common)

设置要使用的路径分隔符。Unix = 使用 unix 风格路径分隔符 Windows = 使用 Windows 风格的路径分隔符 = Auto = (默认)在文件名称中使用现有路径分隔符

UNIX

PathSeparator

fastExistsCheck (common)

如果将这个选项设置为 true,则 camel-ftp 将使用列表文件直接检查文件是否存在。由于某些 FTP 服务器可能不支持直接列出文件,如果 选项为 false,则 camel-ftp 将使用旧方法列出该目录并检查文件是否存在。这个选项还会影响 readLock=changed,以控制它执行快速检查来更新文件信息。如果 FTP 服务器具有很多文件,则这可用于加快进程速度。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

delete (consumer)

如果为 true,则在成功处理该文件后会删除该文件。

false

布尔值

moveFailed (consumer)

根据简单语言设置移动失败表达式。例如,将文件移动到 .error 子目录,请使用: .error。注意:将文件移动到故障位置 Camel 将处理错误,且不会再次选择该文件。

 

字符串

noop (consumer)

如果为 true,则该文件不会以任何方式移动或删除。此选项对于只读数据或者 ETL 类型要求是很好的选择。如果 noop=true,Camel 也将设置 idempotent=true,以避免再次消耗相同的文件。

false

布尔值

preMove (consumer)

用于在处理前动态设置文件名的表达式(如文件语言)。例如,要将 in-progres 文件移动到 order 目录中,把这个值设置为 order。

 

字符串

preSort (consumer)

启用预先排序后,消费者将在轮询过程中对文件和目录名称进行排序,该名称是从文件系统检索的。如果需要以有序的顺序处理文件,您可能希望执行此操作。预先排序是在消费者开始过滤之前执行,并接受 Camel 进行处理的文件。这个选项为 default=false 表示禁用。

false

布尔值

recursive (consumer)

如果某个目录也会在所有子目录中查找文件。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

streamDownload (consumer)

设置不使用本地工作目录时要使用的下载方法。如果设置为 true,则远程文件会在读取时流传输至路由。当设置为 false 时,在将远程文件发送到路由之前将远程文件加载到内存。

false

布尔值

directoryMustExist (consumer)

与 startDirectoryMustExist 类似,但这在轮询递归子目录期间应用。

false

布尔值

download (consumer)

FTP 用户是否应下载 文件。如果此选项设置为 false,则消息正文将为空,但使用者仍将触发 Camel Exchange,其具有文件名、文件大小等文件的详细信息。这只是文件不会下载。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

ignoreFileNotFoundOr PermissionError (consumer)

是否要忽略(尝试列出目录中的文件或在下载文件时),它们不存在或因为权限错误而存在。默认情况下,当目录或文件不存在或权限不足时,会抛出异常。将这个选项设置为 true 可强制忽略它。

false

布尔值

inProgressRepository (consumer)

可插拔插入存储库 org.apache.camel.spi.IdempotentRepository。in-progress 存储库用于考虑当前正在使用的进程文件中。默认情况下会使用基于内存的存储库。

 

IdempotentRepository

localWorkDirectory (consumer)

消耗时,可以使用本地工作目录直接将远程文件内容存储在本地文件中,以避免将内容加载到内存中。这在您消耗非常大的远程文件时很有用,因此可以节省内存。

 

字符串

onCompletionException Handler (consumer)

使用自定义 org.apache.camel.spi.ExceptionHandler 处理在完成过程中文件的异常,以处理使用者在完成过程中进行的提交或回滚。默认实现会将任何异常记录在 WARN 级别,并忽略。

 

ExceptionHandler

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

processStrategy (consumer)

可插拔 org.apache.camel.component.file.GenericFileProcessStrategy 允许您实施自己的 readLock 选项或类似内容。在文件被消耗(如有特殊就绪文件)之前,还可使用特殊条件。如果设置了这个选项,则不会应用 readLock 选项。

 

GenericFileProcess Strategy

startingDirectoryMustExist (consumer)

启动目录是否必须存在。请注意,autoCreate 选项是默认的启用状态,这意味着如果起始目录不存在,通常会自动创建起始目录。您可以禁用 autoCreate 并启用它,以确保起始目录必须存在。如果目录不存在,将抛出异常。

false

布尔值

useList (consumer)

下载文件时是否允许使用 LIST 命令.默认为 true。在某些情况下,您可能需要下载特定文件,且不允许使用 LIST 命令,因此您可以将这个选项设置为 false。请注意,使用这个选项时,要下载的特定文件不包含 meta-data 信息,如文件大小、时间戳、权限等,因为这些信息仅在使用 LIST 命令时检索。

true

布尔值

fileExist (producer)

如果文件已存在相同名称的文件,应该怎么办?覆盖(默认)替换现有文件。append - 将内容添加到现有文件中。fail - 引发 GenericFileOperationException,这表示已有的文件。ignore - 静默忽略问题且不覆盖现有文件,但假设一切正常。move - 选项需要使用同时配置 moveExisting 选项。选项 eagerDeleteTargetFile 可用于控制移动文件要做什么,并且已存在一个现有文件,否则会导致移动操作失败。Move 选项将在编写目标文件之前移动任何现有文件。TryRename 仅在使用 tempFileName 选项时才适用。这样,可以在不做任何检查的情况下,尝试将文件从临时名称重命名为实际名称。在某些文件系统中,这个检查可能会更快,特别是 FTP 服务器。

覆盖

GenericFileExist

flatten (producer)

flatten 用于扁平化文件名路径,以剥离任何前导路径,因此这仅仅是文件名。这样,您可以以递归方式使用子目录,但当您将这些文件写入单个目录中时。在制作者上,在制作者上将强制将设置 CamelFileName 标头中的任何文件名用于任何领先的路径。

false

布尔值

jailStartingDirectory (producer)

用于判断(限制)将文件写入起始目录(和子目录)。默认情况下,启用此项以允许 Camel 将文件写入外部目录(从该框更受保护)。您可以关闭此目的,允许将文件写入起始目录之外的目录,如父级或根文件夹。

true

布尔值

moveExisting (producer)

配置 fileExist=Move 时要使用的表达式(如文件语言)。要将文件移动到备份子目录中,只需输入备份。这个选项只支持以下文件语言令牌:file:name、file:name.ext、file:name.noext、file:onlyname、file:onlyname.noext、file:ext 和 file:parent。注意 file:parent 不受 FTP 组件支持,因为 FTP 组件只能将任何现有文件移到基于当前 dir 的相对目录中。

 

字符串

tempFileName (producer)

与 tempPrefix 选项相同,但可以为临时文件名命名提供更精细的控制,因为它使用文件语言。

 

字符串

tempPrefix (producer)

这个选项用于使用临时名称写入文件,然后在写入完成后将其重命名为真实名称。可用于识别正在写入的文件,并避免消费者(不使用专用读取锁定)读取进度文件。上传较大的文件时通常由 FTP 使用。

 

字符串

allowNullBody (producer)

用于指定在写入过程中是否允许 null 正文。如果设置为 true,则会创建一个空文件,如果设为 false,并且试图向文件组件发送 null 正文,则使用"Cannot将 null body 写入空正文到 file.' 的 GenericFileWriteException 的 GenericFileWriteException 来抛出。'如果将 fileExist 选项设置为 'Override',则文件将被截断,如果设置为 append,则文件将保持不变。

false

布尔值

chmod (producer)

允许您在存储的文件上设置 chmod。例如 chmod=640。

 

字符串

disconnectOnBatchComplete (producer)

批处理上传完成后是否与远程 FTP 服务器断开连接。disconnectedOnBatchComplete 将仅断开当前与 FTP 服务器的连接。

false

布尔值

eagerDeleteTargetFile (producer)

是否完全删除任何现有的目标文件。这个选项只适用于使用 fileExists=Override 和 tempFileName 选项。您可以使用它来禁用(将其设置为 false)在写入 temp 文件前删除目标文件。例如,您可以写入大文件,并且希望目标文件在正在写入时存在。这样可保证目标文件仅在最后一开始删除,而在 temp 文件被重命名为目标文件名之前。这个选项还用来控制是否在启用 fileExist=Move 时删除任何现有文件,并且存在现有文件。如果此选项 copyAndDeleteOnRenameFails false,则在存在现有文件(如果其 true)存在时,则会抛出异常(如果存在),那么在移动操作前会删除现有文件。

true

布尔值

keepLastModified (producer)

将保留来自源文件(若有)的最后修改的时间戳。将使用 Exchange.FILE_LAST_MODIFIED 标头来定位时间戳。此标头可以包含 java.util.Date 或 long with timestamp。如果存在时间戳,并且启用 选项,它将对写入的文件设置此时间戳。注:此选项仅适用于文件制作者。您不能对任何 ftp 制作者使用这个选项。

false

布尔值

moveExistingFileStrategy (producer)

用于在配置 fileExist=Move 时移动带有特殊命名令牌的文件的策略(Custom 策略)。默认情况下,如果没有提供自定义策略,则使用实施

 

FileMoveExisting 策略

sendNoop (producer)

在上传文件到 FTP 服务器之前,是否以预先写入的方式发送 noop 命令。这默认是启用的,因为连接的验证仍然有效,这样可以静默地重新连接来上传文件。但是,如果这会导致问题,您可以关闭这个选项。

true

布尔值

autoCreate (advanced)

在文件路径名称中自动创建缺失的目录。对于文件使用者,这意味着创建起始目录。对于文件制作者,这意味着文件应写入到其中的目录。

true

布尔值

bindAddress (advanced)

指定连接应绑定的本地接口地址。

 

字符串

bufferSize (advanced)

以字节为单位写入缓冲区大小。

131072

int

bulkRequests (advanced)

指定在任何一个时间点上可以处理多少个请求。增加这个值可能会稍提高文件传输速度,但会增加内存用量。

 

整数

压缩 (高级)

使用 压缩。指定从 1 到 10 的级别。重要信息:您必须手动将所需的 JSCH zlib JAR 添加到用于压缩支持的类路径中。

 

int

connectTimeout (advanced)

设置等待由 FTPClient 和 JSCH 使用的连接的连接超时

10000

int

maximumReconnectAttempts (advanced)

指定在尝试连接到远程 FTP 服务器时,Camel 会执行的最大重新连接尝试。使用 0 禁用此行为。

 

int

代理 (高级)

使用已配置的自定义 com.jcraft.jsch.Proxy。此代理用于消耗目标 SFTP 主机中的/发送消息。

 

Proxy

reconnectDelay (advanced)

在执行重新连接尝试前,millis Camel 会等待延迟。

 

long

serverAliveCountMax (advanced)

允许您设置 sftp 会话的 serverAliveCountMax

1

int

serverAliveInterval (advanced)

允许您设置 sftp 会话的 serverAliveInterval

 

int

soTimeout (advanced)

设置仅由 FTPClient 使用的 so 超时

300000

int

stepwise (advanced)

设置在下载文件时是否应采取措施更改目录,或在上传文件到目录时。例如,如果因为安全原因而无法更改 FTP 服务器上的目录,您可以禁用此设置。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

throwExceptionOnConnect Failed (advanced)

如果连接失败(费用)默认情况下不会抛出异常,则应该抛出异常,日志为 WARN。您可以使用此功能启用异常,并处理来自 org.apache.camel.spi.PollingConsumerPollStrategy rollback 方法的抛出异常。

false

布尔值

antExclude (filter)

Ant 样式过滤器排除.如果使用 antInclude 和 antExclude,则 antExclude 优先于 antInclude。可以用逗号分隔的格式指定多个排除项。

 

字符串

antFilterCaseSensitive (filter)

在 at 过滤器中设置区分大小写的标记

true

布尔值

antInclude (filter)

Ant 风格过滤器包含.可以用逗号分隔的格式指定多个包含。

 

字符串

eagerMaxMessagesPerPoll (filter)

允许控制 maxMessagesPerPoll 的限制是预先控制。如果预先考虑,则限制会在扫描文件期间进行。如果为 false,则扫描所有文件,然后执行排序。将此选项设置为 false 可首先对所有文件进行排序,然后限制轮询。请注意,这需要较高的内存用量,因为所有文件详细信息都位于内存中来执行排序。

true

布尔值

exclude (filter)

如果文件名与 regex 模式匹配,则使用 排除文件(匹配是 in-senstive)。请注意,如果将这个符号配置为端点 uri,则需要使用 RAW ()语法等符号(如加号)进行配置。有关配置端点 uris 时的详情,请参阅

 

字符串

filter (filter)

可插入的过滤器作为 org.apache.camel.component.file.GenericFileFilter 类。如果过滤器在其 accept ()方法中返回 false,则将跳过文件。

 

GenericFileFilter

filterDirectory (filter)

根据简单语言过滤目录。例如,要过滤当前日期,您可以使用一个简单的日期模式,如 $date:now:yyyMMdd

 

字符串

filterFile (filter)

根据简单语言过滤文件。例如,要根据文件大小进行过滤,可以使用 $file:size 5000

 

字符串

idempotent (filter)

使用 Idempotent Consumer EIP 模式的选项允许 Camel 跳过已处理的文件。默认情况下,将使用包含 1000 条目的基于内存的 LRUCache。如果 noop=true 之后,将启用幂等性,以避免再次消耗相同的文件。

false

布尔值

idempotentKey (filter)

使用自定义幂等密钥。默认情况下,使用文件的绝对路径。您可以使用文件语言(例如,使用文件名和文件大小),您可以完成: idempotentKey=$file:name-$file:size

 

字符串

idempotentRepository (filter)

可插拔存储库 org.apache.camel.spi.IdempotentRepository,如果未指定,则默认使用 MemoryMessageIdRepository,并且幂等为 true。

 

IdempotentRepository

include (filter)

如果文件名与 regex 模式匹配,则用于包含文件(匹配区分大小写)。请注意,如果将这个符号配置为端点 uri,则需要使用 RAW ()语法等符号(如加号)进行配置。有关配置端点 uris 时的详情,请参阅

 

字符串

maxDepth (filter)

递归处理目录时要遍历的最大深度。

2147483647

int

maxMessagesPerPoll (filter)

定义要为每个轮询收集的最大消息。默认情况下没有设置最大值。可用于设置 e.g. 1000 的限制,以避免在启动存在数千台服务器时。将值设为 0 或负数设为 disabled。注意:如果使用这个选项正在使用,则文件和 FTP 组件将在任何排序前限制。例如,如果您有 100000 文件并使用 maxMessagesPerPoll=500,则只会提取前 500 个文件,然后排序。您可以使用 eagerMaxMessagesPerPoll 选项,将其设置为 false,以允许首先扫描所有文件,然后再排序。

 

int

minDepth (filter)

递归处理目录时开始处理的最小深度信息。使用 minDepth=1 意味着基础目录。使用 minDepth=2 表示第一个子目录。

 

int

Move (filter)

表达式(如简单语言),用于在处理后动态设置文件名。要将文件移动到 .done 子目录中,只需输入 .done。

 

字符串

exclusiveReadLockStrategy (lock)

可插拔 read-lock 作为 org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy 实施。

 

GenericFileExclusive ReadLockStrategy

readLock (lock)

供使用者使用,仅当文件具有独占的 read-lock 时(例如,该文件没有处于-progres 或被写入时)轮询文件。Camel 将等待文件锁定。此选项以策略形式提供构建:无 - 无读取锁定在使用 markerFile - Camel 创建一个标志文件(fileName.camelLock),然后保存锁定。FTP 组件更改的这个选项 - 更改使用文件长度/修改时间戳来检测当前正在复制的文件。将至少使用 1 sec 来确定这一点,因此此选项无法像其他形式使用文件一样迅速使用,但由于 JDK IO API 无法始终确定文件当前是否正在被另一个进程使用。选项 readLockCheckInterval 可用于设置检查频率。fileLock - 用于使用 java.nio.channels.FileLock。这个选项不适用于 Windows 或 FTP 组件。在通过 mount/share 访问远程文件系统时,应该避免这种方法,除非文件系统支持分布式文件锁定。重命名 - 使用重命名文件作为测试,如果我们可以获得独占的 read-lock。幂等 - (对于文件组件)幂等的幂等性是使用 idempotentRepository 作为 read-lock 的 read-lock。这允许在幂等存储库实现支持集群时使用读取锁定,该锁定支持集群。幂等更改 - (对于文件组件)使用 idempotentRepository,并随着合并的 read-lock 改变。这允许使用支持集群的读取锁定,如果幂等存储库实施支持集群。幂等-rename - ( file 组件)幂等-rename 使用 idempotentRepository 并将 重命名为 combined read-lock。这允许在幂等存储库实现支持的情况下使用支持集群的读取锁定。注意:各种读取锁定不适用于在集群模式下工作,不同节点上的并发用户对共享文件系统上的相同文件都竞争。使用接近 atomic 操作来创建空的标志文件,但它无法保证在集群中工作。fileLock 可以更好地工作,但文件系统需要支持分布式文件锁定,以此类推。如果幂等存储库支持集群(如 Hazelcast 组件或 Infinispan),则使用幂等的读取锁定可以支持集群。

none

字符串

readLockCheckInterval (lock)

read-lock 的间隔(如果被读取锁定支持)。这个间隔用于在尝试获取读取锁定间进行睡眠状态。例如,在使用 changed 的 read lock 时,您可以将更高的间隔周期设置为 cater 以慢速写入。如果制作者非常慢,写入文件,则默认为 1 sec.。注意:对于 FTP 默认 readLockCheckInterval 为 5000。readLockTimeout 值必须大于 readLockCheckInterval,但经验规则至少为 2 个或更多或更多为 readLockCheckInterval。这需要确保读取锁定进程允许修改时间尝试在超时达到前获取锁。

1000

long

readLockDeleteOrphanLock Files (lock)

如果 Camel 未正确关闭,则启动时是否应该在启动时使用标志文件读取锁定文件来读取锁定文件(如 JVM 崩溃)。如果将此选项转换为 false,则任何孤立的锁定文件将导致 Camel 无法启动该文件,这可能是因为另一个节点同时从同一共享目录中读取文件。

true

布尔值

readLockIdempotentRelease Async (lock)

延迟发行版本任务应该是同步还是异步。请参阅 readLockIdempotentReleaseDelay 选项的详情。

false

布尔值

readLockIdempotentRelease AsyncPoolSize (lock)

使用异步发行任务时调度线程池中的线程数量。使用默认 1 个核心线程几乎应该已经足够了,只有更新幂等存储库或需要处理大量文件时,它才会将其设置为更高的值。如果您通过配置 readLockIdempotentReleaseExecutorService 选项,则使用这个选项。请参阅 readLockIdempotentReleaseDelay 选项的详情。

 

int

readLockIdempotentRelease Delay (lock)

是否延迟发布任务在millis 的期间。在带有共享幂等库的主动/主动集群场景中使用共享幂等存储库来确保其他节点无法扫描和获取同一文件,这可用于延迟发行任务以扩展窗口。通过扩展发行任务的 time-window 有助于防止这些情况。只有在将 readLockRemoveOnCommit 配置为 true 时,才需要注意延迟。

 

int

readLockIdempotentRelease ExecutorService (lock)

要将自定义和共享线程池用于异步发行任务。请参阅 readLockIdempotentReleaseDelay 选项的详情。

 

ScheduledExecutor 服务

readLockLoggingLevel (lock)

无法获取读取锁定时使用的日志记录级别。默认情况下记录 WARN。您可以更改此级别,例如,变为 OFF 以没有任何日志。这个选项仅适用于 readLock 类型的 readLock: changed、fileLock、幂等、幂等更改、幂等名称、重命名。

DEBUG

LoggingLevel

readLockMarkerFile (lock)

是否使用带 changed、重命名或专用读锁定类型的标记文件。默认情况下,也可使用标志文件来保护其他进程的获取相同的文件。可以通过将此选项设置为 false 来关闭此行为。例如,如果您不想将标记文件写入 Camel 应用程序的文件系统。

true

布尔值

readLockMinAge (lock)

此选项仅适用于 readLock=changed。它允许在尝试获取读取锁定前指定文件的最短期限。例如,使用 readLockMinAge=300s 来要求文件最多 5 分钟。这可能会加快更改的读取锁定,因为它只会试图获取至少是给定期限的文件。

0

long

readLockMinLength (lock)

此选项仅适用于 readLock=changed。它允许您配置最小长度。默认情况下,Camel 预期文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度的文件。

1

long

readLockRemoveOnCommit (lock)

此选项仅适用于 readLock=idempotent。它允许您指定在处理文件成功并且提交发生时是否从幂等存储库中删除文件名条目。默认情况下,该文件不会被删除,以确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可能会支持驱除策略,您可以配置在 X 分钟后驱除文件名条目 - 这可确保出现竞争条件的问题。请参阅 readLockIdempotentReleaseDelay 选项的详情。

false

布尔值

readLockRemoveOnRollback (lock)

此选项仅适用于 readLock=idempotent。它允许您指定在处理文件失败时是否从幂等存储库中删除文件名条目,并进行回滚。如果此选项为 false,则文件名条目已确认(如同文件提交一样)。

true

布尔值

readLockTimeout (lock)

如果 read-lock 支持,则 millis 中的可选超时。如果无法授予 read-lock 且触发超时,则 Camel 将跳过该文件。下次轮询 Camel 时,将重试文件,此时可能会授予 read-lock。使用 0 或 lower 值来永久指示。目前,fileLock,更改并重命名支持超时。注意:对于 FTP,默认的 readLockTimeout 值为 20000,而不是 10000。readLockTimeout 值必须大于 readLockCheckInterval,但经验规则至少为 2 个或更多或更多为 readLockCheckInterval。这需要确保读取锁定进程允许修改时间尝试在超时达到前获取锁。

10000

long

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

shuffle (sort)

要取消文件列表(以随机顺序排序)

false

布尔值

sortBy (sort)

内置使用文件语言排序.支持嵌套的排序,因此您可以按文件名排序,并根据修改日期进行排序。

 

字符串

排序 器(排序)

可插拔排序器作为 java.util.Comparator 类。

 

比较器

加密 (安全)

设置一个以逗号分隔的密码列表,它们将按顺序使用。可能的密码名称由 JCraft JSCH 定义。些示例包括:aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc。如果未从 JSCH 指定默认列表,则将使用。

 

字符串

keyPair (security)

设置公钥和私钥对,以便 SFTP 端点可以进行公钥/私钥验证。

 

KeyPair

knownHosts (security)

设置字节阵列中的 known_hosts,以便 SFTP 端点可以进行主机密钥验证。

 

byte[]

knownHostsFile (security)

设置 known_hosts 文件,以便 SFTP 端点可以进行主机密钥验证。

 

字符串

knownHostsUri (security)

设置 known_hosts 文件(默认情况下从 classpath 加载),以便 SFTP 端点可以进行主机密钥验证。

 

字符串

密码 (安全)

用于登录的密码

 

字符串

preferredAuthentications (security)

设置将使用 SFTP 端点的首选身份验证。例如:password,publickey.如果未从 JSCH 指定默认列表,则将使用。

 

字符串

privateKey (security)

将私钥设置为字节,以便 SFTP 端点能够进行私钥验证。

 

byte[]

privateKeyFile (security)

设置私钥文件,以便 SFTP 端点可以进行私钥验证。

 

字符串

privateKeyPassphrase (security)

设置私钥文件密语,以便 SFTP 端点可以进行私钥验证。

 

字符串

privateKeyUri (security)

设置私钥文件(默认情况下从类路径加载),以便 SFTP 端点能够进行私钥验证。

 

字符串

strictHostKeyChecking (security)

设置是否使用严格的主机密钥检查。

字符串

username (security)

用于登录的用户名

 

字符串

useUserKnownHostsFile (security)

如果没有显式配置 knownHostFile,则使用 System.getProperty (user.home)/.ssh/known_hosts 中的主机文件

true

布尔值

第 303 章 Shiro Security 组件

可作为 Camel 2.5 提供

Camel 中的 shiro-security 组件是一个基于 Apache Shiro security 项目的安全组件。

Apache Shiro 是一个强大而灵活的开源安全框架,可完全处理身份验证、授权、企业会话管理和加密。Apache Shiro 项目的目标是提供最强大、最全面的应用程序安全框架,同时还可轻松理解和非常容易使用。

此 camel shiro-security 组件允许将身份验证和授权支持应用到来自 camel 路由的不同网段。

使用 Camel 策略在路由上应用 Shiro 安全。Camel 中的策略利用策略模式在 Camel 处理器上应用拦截器。它能够对来自 Camel 路由的不同部分/终端应用跨复杂问题(如安全、事务等)。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-shiro</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

303.1. Shiro Security Basics

要在 camel 路由上使用 Shiro Security,B ShiroSecurityPolicy 对象必须使用安全配置详情(包括用户、密码、角色等)进行实例化。然后,此对象必须应用于 camel 路由。此 ShiroSecurityPolicy 对象也可以在 Camel 注册表中注册(JNDI 或 ApplicationContextRegistry),然后在 Camel 上下文中的其他路由上使用。

使用 Ini 文件(properties 文件)或 Ini 对象向 ShiroSecurityPolicy 提供配置详情。Ini 文件是一个标准 Shiro 配置文件,其中包含用户/角色详情,如下所示

[users]
# user 'ringo' with password 'starr' and the 'sec-level1' role
ringo = starr, sec-level1
george = harrison, sec-level2
john = lennon, sec-level3
paul = mccartney, sec-level3

[roles]
# 'sec-level3' role has all permissions, indicated by the
# wildcard '*'
sec-level3 = *

# The 'sec-level2' role can do anything with access of permission
# readonly (*) to help
sec-level2 = zone1:*

# The 'sec-level1' role can do anything with access of permission
# readonly
sec-level1 = zone1:readonly:*

303.2. 实例化 ShiroSecurityPolicy 对象

ShiroSecurityPolicy 对象按如下方式实例化

        private final String iniResourcePath = "classpath:shiro.ini";
        private final byte[] passPhrase = {
            (byte) 0x08, (byte) 0x09, (byte) 0x0A, (byte) 0x0B,
            (byte) 0x0C, (byte) 0x0D, (byte) 0x0E, (byte) 0x0F,
            (byte) 0x10, (byte) 0x11, (byte) 0x12, (byte) 0x13,
            (byte) 0x14, (byte) 0x15, (byte) 0x16, (byte) 0x17};
        List<permission> permissionsList = new ArrayList<permission>();
        Permission permission = new WildcardPermission("zone1:readwrite:*");
        permissionsList.add(permission);

        final ShiroSecurityPolicy securityPolicy =
            new ShiroSecurityPolicy(iniResourcePath, passPhrase, true, permissionsList);

303.3. ShiroSecurityPolicy Options

名称默认值类型描述

iniResourcePath 或 ini

none

资源字符串或 Ini 对象

必须将 iniResourcePath 或 Ini 对象的实例的强制资源字符串传递给安全策略。当以"file:、classpath: 或 url:"前缀时,可以从文件系统、类路径或 URL 获取资源。例如 "classpath:shiro.ini"

passPhrase

基于 AES 128 的密钥

byte[]

passPhrase 可解密随消息交换一起发送的 ShiroSecurityToken (s)

alwaysReauthenticate

true

布尔值

设置 以确保每个单独请求重新身份验证。如果设置为 false,则用户会被验证并锁定,而不是只对来自同一用户发出的请求进行身份验证。

permissionsList

none

List<Permission>

需要的权限列表,以便经过身份验证的用户被授权来执行进一步操作,即在路由上继续进一步操作。如果没有为 ShiroSecurityPolicy 对象提供权限列表或角色列表(请参阅以下),则授权将被视为不需要。请注意,如果列表中有任何 Permission Objects 适用,则默认是授权。

rolesList

none

List<String>

Camel 2.13: 为经过身份验证的用户授权执行进一步操作所需的角色列表,即在路由上继续进一步操作。如果没有向 ShiroSecurityPolicy 对象提供角色列表或权限列表,则授权将被视为不需要。请注意,如果列表中有任何角色适用,则默认会被授权。

cipherService

AES

org.apache.shiro.crypto.CipherService

Shiro 附带 AES 和 Blowfish 基于 CipherServices。您可以使用其中一项或传递您自己的实施

base64

false

布尔值

Camel 2.12: 要将 base64 编码用于安全令牌标头,后者允许通过 JMS 传输标头。还必须在 ShiroSecurityTokenInjector 上设置此选项。

allPermissionsRequired

false

布尔值

Camel 2.13: 如果在 权限List 参数中有任何 Permission Objects,则默认设置会被授予该授权。把它设置为 true 以要求满足所有权限。

allRolesRequired

false

布尔值

Camel 2.13: 如果 rolesList 参数中有任何角色适用,则默认是授权的。把它设置为 true 以要求满足所有角色。

303.4. 在 Camel 路由中应用 Shiro 身份验证

ShiroSecurityPolicy、测试并允许在 Message Header 中包含加密安全Token 的传入消息交换,以进一步进行后续身份验证。SecurityToken 对象包含一个 Username/Password 详情,用于决定用户是有效用户的位置。

    protected RouteBuilder createRouteBuilder() throws Exception {
        final ShiroSecurityPolicy securityPolicy =
            new ShiroSecurityPolicy("classpath:shiro.ini", passPhrase);

        return new RouteBuilder() {
            public void configure() {
                onException(UnknownAccountException.class).
                    to("mock:authenticationException");
                onException(IncorrectCredentialsException.class).
                    to("mock:authenticationException");
                onException(LockedAccountException.class).
                    to("mock:authenticationException");
                onException(AuthenticationException.class).
                    to("mock:authenticationException");

                from("direct:secureEndpoint").
                    to("log:incoming payload").
                    policy(securityPolicy).
                    to("mock:success");
            }
        };
    }

303.5. 在 Camel 路由中应用 Shiro 授权

通过将 Permissions List 与 ShiroSecurityPolicy 关联,授权可以在 camel 路由上应用。Permissions List 指定用户执行路由片段所需的权限。如果用户未设置适当的权限,则请求将无法继续。

    protected RouteBuilder createRouteBuilder() throws Exception {
        final ShiroSecurityPolicy securityPolicy =
            new ShiroSecurityPolicy("./src/test/resources/securityconfig.ini", passPhrase);

        return new RouteBuilder() {
            public void configure() {
                onException(UnknownAccountException.class).
                    to("mock:authenticationException");
                onException(IncorrectCredentialsException.class).
                    to("mock:authenticationException");
                onException(LockedAccountException.class).
                    to("mock:authenticationException");
                onException(AuthenticationException.class).
                    to("mock:authenticationException");

                from("direct:secureEndpoint").
                    to("log:incoming payload").
                    policy(securityPolicy).
                    to("mock:success");
            }
        };
    }

303.6. 创建 ShiroSecurityToken 并将其注入消息交换

ShiroSecurityToken 对象可以通过名为 ShiroSecurityTokenInjector 的 Shiro Processor 创建并注入到消息交换中。使用客户端中的 ShiroSecurityTokenInjector 注入 ShiroSecurityToken 示例

    ShiroSecurityToken shiroSecurityToken = new ShiroSecurityToken("ringo", "starr");
    ShiroSecurityTokenInjector shiroSecurityTokenInjector =
        new ShiroSecurityTokenInjector(shiroSecurityToken, passPhrase);

    from("direct:client").
        process(shiroSecurityTokenInjector).
        to("direct:secureEndpoint");

303.7. 将消息发送到由 ShiroSecurityPolicy 保护的路由

在 ExchangeHeader 中的 SecurityToken (SecurityToken)中,在 camel 路由中发送的消息和消息交换程序需要被安全策略应用。SecurityToken 是一个加密对象,包含 Username 和 Password。SecurityToken 默认使用 AES 128 位安全加密,并可改为您选择的任何密码。

下面是如何在 Camel 中使用 ProducerTemplate 以及 SecurityToken 发送请求的示例。

    @Test
    public void testSuccessfulShiroAuthenticationWithNoAuthorization() throws Exception {
        //Incorrect password
        ShiroSecurityToken shiroSecurityToken = new ShiroSecurityToken("ringo", "stirr");

        // TestShiroSecurityTokenInjector extends ShiroSecurityTokenInjector
        TestShiroSecurityTokenInjector shiroSecurityTokenInjector =
            new TestShiroSecurityTokenInjector(shiroSecurityToken, passPhrase);

        successEndpoint.expectedMessageCount(1);
        failureEndpoint.expectedMessageCount(0);

        template.send("direct:secureEndpoint", shiroSecurityTokenInjector);

        successEndpoint.assertIsSatisfied();
        failureEndpoint.assertIsSatisfied();
    }

303.8. 将消息发送到由 ShiroSecurityPolicy 保护的路由(从 Camel 2.12 更容易)

Camel 2.12 开始,通过两种不同的方式,您可以更轻松地提供主题。

303.8.1. 使用 ShiroSecurityToken

您可以使用包含用户名和密码的 key ShiroSecurityConstants.SHIROI TY_TOKEN 发送消息到 Camel 路由,其中包含用户名和密码。例如:

        ShiroSecurityToken shiroSecurityToken = new ShiroSecurityToken("ringo", "starr");

        template.sendBodyAndHeader("direct:secureEndpoint", "Beatle Mania", ShiroSecurityConstants.SHIRO_SECURITY_TOKEN, shiroSecurityToken);

您还可以在两个不同的标头中提供用户名和密码,如下所示:

        Map<String, Object> headers = new HashMap<String, Object>();
        headers.put(ShiroSecurityConstants.SHIRO_SECURITY_USERNAME, "ringo");
        headers.put(ShiroSecurityConstants.SHIRO_SECURITY_PASSWORD, "starr");
        template.sendBodyAndHeaders("direct:secureEndpoint", "Beatle Mania", headers);

当使用用户名和密码标头时,Camel 路由的 ShiroSecurityPolicy 会将它们自动转换为带有键 ShiroSecurityConstants.SHIRO_SECURITY_TOKEN 的单个标头。然后,令牌是 ShiroSecurityToken 实例,或者 base64 表示作为字符串(后者在设置了 base64=true 时)。

第 304 章 简单语言

可作为 Camel 版本 1.1 提供

从创建简单表达式语言时,简单表达式语言是一种简单语言,但由于发展更加强大。它主要是为了作为评估表达式和谓词的小而简单的语言,无需 XPath 的任何新依赖关系或知识;因此,最好在 camel-core 中进行测试。当您在 Camel 路由中需要一些基于表达式的脚本时,这些理念涵盖了常见用例的 95%。

但是,对于更复杂的用例,通常建议您选择更加表达力和强大的语言,例如:

对于表达式包含恒定字面值的复杂表达式,简单语言使用 ${body} 占位符。如果表达式仅是令牌本身,则可以省略 $\{ } 占位符。

提示

另一种 语法 :从 Camel 2.5 开始,您还可以使用替代语法,该语法使用 $simple{ } 作为占位符。这可用于避免在将 Spring 属性占位符与 Camel 一起使用时发生冲突。

304.1. Camel 2.9 中的简单语言变化

从 Camel 2.9 开始,简单 语言改进为使用更好的语法解析程序,可以进行索引精确的错误消息,因此您知道错误以及问题所在位置。例如,如果您在其中一个操作器中有拼写错误,则解析器将无法检测到此问题,并导致评估为 true。语法中的一些更改不再向后兼容。使用 简单 语言作为谓词时,必须用 单引号或双引号括起字面文本。例如: "${body} == 'Camel'"。请注意,我们如何用单引号括起字面。使用 "body""header.foo" 的旧风格来指代消息正文和标题为 @ deprecated,我们鼓励始终为内置函数使用 $\{ } 令牌。范围 Operator 现在需要以单引号括起,也显示: "${header.zip}"介于 '30000..39999' 之间"。

以获得消息正文:"body" 或 "in.body ""${body}"

复杂的表达式必须使用 $\{ } 占位符,例如 :"Hello ${in.header.name} 如何?"

您可以在同一表达式中有多个函数:" Hello ${in.header.name} is ${in.header.me} speaking"
但是,您不能将 功能嵌套在 Camel 2.8.x 或更早的版本中(例如,不允许在现有的 $\{ } 占位符中使用其他 $\{ } 占位符)。
Camel 2.9 开始,您可以嵌套功能。

304.2. 简单语言选项

简单语言支持 2 选项,它们如下所列。

名称默认Java 类型描述

resultType

 

字符串

设置结果类型的类名称(从输出中输入)

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

304.3. 变量

变量类型描述

camelId

字符串

Camel 2.10: CamelContext 名称

camelContext.OGNL

对象

Camel 2.11: CamelContext 使用 Camel OGNL 表达式调用。

exchange

Exchange

Camel 2.16: 交换

exchange.OGNL

对象

Camel 2.16: 使用 Camel OGNL 表达式调用的 Exchange。

exchangeId

字符串

Camel 2.3: 交换 ID

id

字符串

输入消息 id

正文(body)

对象

输入正文

in.body

对象

输入正文

body.OGNL

对象

Camel 2.3: 使用 Camel OGNL 表达式调用的输入正文。

in.body.OGNL

对象

Camel 2.3: 使用 Camel OGNL 表达式调用的输入正文。

bodyAs(type)

类型

Camel 2.3: 将正文转换为由类名称决定的给定类型。转换的正文可以是 null。

bodyAs(type).OGNL

对象

Camel 2.18: 将正文转换为由类名称决定的给定类型,然后使用 Camel OGNL 表达式调用方法。转换的正文可以是 null。

mandatoryBodyAs(type)

类型

Camel 2.5: 将正文转换为由类名称决定的给定类型,并且希望正文不为空。

mandatoryBodyAs(type).OGNL

对象

Camel 2.18: 将正文转换为由类名称决定的给定类型,然后使用 Camel OGNL 表达式调用方法。

out.body

对象

输出正文

header.foo

对象

请参阅输入 foo 标头

header[foo]

对象

Camel 2.9.2 引用输入 foo 标头

headers.foo

对象

请参阅输入 foo 标头

headers[foo]

对象

Camel 2.9.2 引用输入 foo 标头

in.header.foo

对象

请参阅输入 foo 标头

in.header[foo]

对象

Camel 2.9.2 引用输入 foo 标头

in.headers.foo

对象

请参阅输入 foo 标头

in.headers[foo]

对象

Camel 2.9.2 引用输入 foo 标头

header.foo[bar]

对象

Camel 2.3: 关于输入 foo 标头作为映射的信息,并使用栏作为键在映射上执行查找

in.header.foo[bar]

对象

Camel 2.3: 关于输入 foo 标头作为映射的信息,并使用栏作为键在映射上执行查找

in.headers.foo[bar]

对象

Camel 2.3: 关于输入 foo 标头作为映射的信息,并使用栏作为键在映射上执行查找

header.foo.OGNL

对象

Camel 2.3: 引用输入 foo 标头并使用 Camel OGNL 表达式调用其值。

in.header.foo.OGNL

对象

Camel 2.3: 引用输入 foo 标头并使用 Camel OGNL 表达式调用其值。

in.headers.foo.OGNL

对象

Camel 2.3: 引用输入 foo 标头并使用 Camel OGNL 表达式调用其值。

out.header.foo

对象

请参阅 out header foo

out.header[foo]

对象

Camel 2.9.2 引用标题 foo

out.headers.foo

对象

请参阅 out header foo

out.headers[foo]

对象

Camel 2.9.2 引用标题 foo

headerAs(key,type)

类型

Camel 2.5: 将标头转换为由类名称决定的给定类型

标头

map

Camel 2.9: 引用输入标头

in.headers

map

Camel 2.9: 引用输入标头

property.foo

对象

弃用: 引用交换中的 foo 属性

exchangeProperty.foo

对象

Camel 2.15: 引用交换上的 foo 属性

property[foo]

对象

弃用: 引用交换中的 foo 属性

exchangeProperty[foo]

对象

Camel 2.15: 引用交换上的 foo 属性

property.foo.OGNL

对象

deprecated: 引用交换上的 foo 属性,并使用 Camel OGNL 表达式调用其值。

exchangeProperty.foo.OGNL

对象

Camel 2.15: 引用交换上的 foo 属性,并使用 Camel OGNL 表达式来调用其值。

sys.foo

字符串

请参阅系统属性

sysenv.foo

字符串

Camel 2.3: 引用系统环境

例外

对象

Camel 2.4: 请参阅交换上的异常对象,如果交换没有设置异常,则为空。如果交换具有任何,则回退和发现异常(Exchange.EXCEPTION_CAUGHT)

例外。OGNL

对象

Camel 2.4: 请参阅使用 Camel OGNL 表达式对象调用的交换异常

exception.message

字符串

如果交换时没有设置异常,请参阅交换上的例外消息。如果交换具有任何,则回退和发现异常(Exchange.EXCEPTION_CAUGHT)

exception.stacktrace

字符串

Camel 2.6.如果交换没有设置异常,请参阅交换上的例外。stracktrace 是 null。如果交换具有任何,则回退和发现异常(Exchange.EXCEPTION_CAUGHT)

date:_command_

Date

评估到日期对象。支持的命令有: 现在,对于当前时间戳,in.header.xxxheader.xxx 使用 IN 标头中的 Date 对象,带有键 xxx。out.header.xxx,使用带有键 xxx 的 OUT 标头中的 Date 对象。property.xxx,使用 exchange 属性中的 Date 对象和键 xxx。文件,用于上次修改文件的时间戳(可通过文件使用者提供)。命令接受偏移量,如: now-24hin.header.xxx+1h,甚至 现在是+1h30m-100

date:_command:pattern_

字符串

使用 java.text.SimpleDataFormat 模式的日期格式。

date-with-timezone:_command:timezone:pattern_

字符串

使用 java.text.SimpleDataFormat timezones 和模式的时间戳格式。

bean:_bean expression_

对象

使用 Bean 语言调用 Bean 表达式。指定方法名称必须使用点作为分隔符。我们也支持 Bean 组件使用的 ?method=methodname 语法。

properties:_locations:key_

字符串

弃用(使用属性的位置)Camam 2.3:查找带有给定密钥的属性location 选项是可选的。更多信息,请参阅 使用 PropertyPlaceholder。

properties-location:_http://locationskey[locations:key]_

字符串

Camel 2.14.1: 使用给定密钥查找属性.location 选项是可选的。更多信息,请参阅 使用 PropertyPlaceholder。

properties:key:default

字符串

Camel 2.14.1 :使用给定密钥查找属性.如果键不存在或者没有值,则可以指定可选的默认值。

routeId

字符串

Camel 2.11: 返回 Exchange 正在路由的当前路由的 id。

threadName

字符串

Camel 2.3: 返回当前线程的名称。可用于日志记录用途。

ref:xxx

对象

Camel 2.6: 使用给定 ID 从注册表查找 Bean.

type:name.field

对象

Camel 2.11: 引用其 FQN 名称的 type 或 字段。要引用一个字段,您可以附加 .FIELD_NAME。例如,您可以指代 Exchange 中的恒定字段: org.apache.camel.Exchange.FILE_NAME

null

null

Camel 2.12.3: 代表一个 null

random_(value)_

整数

*Camel 2.16.0:*returns a random Integer between 0 (included)和 value (excluded)

random_(min,max)_

整数

*Camel 2.16.0:*returns a random Integer between min (included)和 max (excluded)

collate(group)

list

Camel 2.17: 合作功能将消息正文和将数据分组到指定大小的子列表中。这可与 Splitter EIP 搭配使用,将消息正文和组/批处理分割为一组 N 子列表。此方法的工作方式与 Groovy 中的合作方法类似。

skip(number)

erator

Camel 2.19: 跳过功能会迭代消息正文,并跳过第一个项目数。这可以与 Splitter EIP 搭配,以分割消息正文并跳过前 N 个项目数。

messageHistory

字符串

Camel 2.17: 当前交换的消息历史记录。这与路由 stack-trace 消息历史记录在出现未处理的异常时出现错误处理程序日志。

messageHistory(false)

字符串

Camel 2.17: 作为消息History,但无交换详情(仅包含路由跟踪)。如果您不想从消息本身记录敏感数据,可以使用此命令。

304.4. OGNL 表达式支持

可作为 Camel 2.3 提供

INFO:Camel 的 OGNL 支持仅用于调用方法。您无法访问字段。从 Camel 2.11.1 开始,我们添加了对访问 Java 阵列长度字段的特例支持。

SimpleBean 语言现在支持 Camel OGNL 表示法在链中调用 Bean。假设 Message IN body 包含 POJO,它使用 getAddress () 方法。

然后,您可以使用 Camel OGNL 表示法访问地址对象:

simple("${body.address}")
simple("${body.address.street}")
simple("${body.address.zip}")

Camel 了解 getter 的短名称,但您可以调用任何方法或使用类似的实际名称:

simple("${body.address}")
simple("${body.getAddress.getStreet}")
simple("${body.address.getZip}")
simple("${body.doSomething}")

例如,如果正文没有地址,您可以使用 null 安全运算符()以避免 NPE

simple("${body?.address?.street}")

也可以以 MapList 类型索引,因此您可以:

simple("${body[foo].name}")

假设正文基于 Map,并使用 foo 作为键查找值,并在该值上调用 getName 方法。

如果键有空格,则必须使用 引号包括密钥,例如 'foo bar':

simple("${body['foo bar'].name}")

您可以使用密钥名称(带有或不带句点)直接访问 MapList 对象:

simple("${body[foo]}")
simple("${body[this.is.foo]}")

假设键为 foo 没有值,您可以使用 null 安全 Operator 以避免 NPE,如下所示:

simple("${body[foo]?.name}")

您还可以访问 列表 类型,例如从地址中获取行:

simple("${body.address.lines[0]}")
simple("${body.address.lines[1]}")
simple("${body.address.lines[2]}")

有一个特殊的 last 关键字,可用于从列表中获取最后一个值。

simple("${body.address.lines[last]}")

最后,您可以减去一个数字,因此我们可以使用 last-1 来指明这一点:

simple("${body.address.lines[last-1]}")

最后第三步是课程:

simple("${body.address.lines[last-2]}")

您可以在列表中调用 size 方法

simple("${body.address.lines.size}")

Camel 2.11.1 开始,我们增加了对 Java 阵列的长度字段的支持,例如:

String[] lines = new String[]{"foo", "bar", "cat"};
exchange.getIn().setBody(lines);

simple("There are ${body.length} lines")

和 yes,您可以将其与 Operator 支持合并,如下所示:

simple("${body.address.zip} > 1000")

304.5. Operator 支持

解析器仅限于支持单个操作器。

若要启用左侧值,必须用 $\{ } 括起。语法是:

${leftValue} OP rightValue

其中,右Value 可以是 String 文字,包含在 ', null、一个常量值或包含于 $\{ } 的另一个表达式中。

重要

Operator 必须 有空格。

Camel 会自动将右Value 类型转换为 leftValue 类型,因此可以将字符串转换为数字,以便您可以对数值使用 > 比较。

支持以下 Operator:

Operator描述

==

等于

=~

Camel 2.16: 等于忽略问题单(在比较字符串值时忽略大小写)

>

大于

>=

大于等于

<

小于

小于或等于

!=

不等于

contains

在基于字符串的值中包含,用于测试

不包含

要进行测试,如果未包含基于字符串的值

~~

在基于字符串的值忽略大小写中,要进行测试

regex

针对以 String 值定义的指定正则表达式模式匹配

Not regex

对于不与给定正则表达式模式匹配,定义为 String 值

in

如果在一组值中匹配,则必须用逗号分开每个元素。如果要包含空值,则必须使用双逗号来定义,例如 ',,bronze,silver,gold',它是带有空值的一组四个值,然后是三个 medal。

not in

如果不在一组值中匹配,则必须用逗号分开每个元素。如果要包含空值,则必须使用双逗号来定义,例如 ',,bronze,silver,gold',它是带有空值的一组四个值,然后是三个 medal。

is

对于匹配(如果左侧类型)是值的实例。

不是

对于匹配,如果左侧类型不是值的实例。

range

对于匹配,如果左边的值位于定义为数字的范围内: from.to。从 Camel 2.9 开始,范围值必须用单引号括起。

限制范围

如果左侧不在以数字定义的范围内,从.到,则匹配。从 Camel 2.9 开始,范围值必须用单引号括起。

Camel 2.17.1、2.18 :用于测试左侧字符串是否以右手字符串开始。

结束

Camel 2.17.1, 2.18: 用于测试左侧字符串是否以右手字符串结束。

然后可以使用以下 unary 运算符:

Operator描述

++

Camel 2.9: 将数字递增一。左侧必须为某个功能,否则将解析为文字。

 — 

Camel 2.9: 减少一个数字。左侧必须为某个功能,否则将解析为文字。

\

Camel 2.9.3 到 2.10.x,要转义一个值,如 \$,表示 $ 符号。特殊:使用 \n 作为新行,\t 表示制表符,使用 \r 表示回车。注意: 使用文件 语言 不支持 转义。注意: 从 Camel 2.11 开始,不再支持转义字符,但使用以下三个特殊转义替代。

\n

Camel 2.11: 使用换行符.

\t

Camel 2.11: 要使用制表符字符。

\r

Camel 2.11: 使用回车符返回字符。

\}

Camel 2.18: 使用 } 字符作为文本

以下逻辑运算符可用于分组表达式:

Operator描述

弃用的 use && 替代。logical 和 运算符用于对两个表达式进行分组。

或者

弃用 使用 ||。逻辑或运算符用于对两个表达式进行分组。

&&

Camel 2.9: 逻辑和运算符用于对两个表达式进行分组。

||

Camel 2.9: 逻辑或运算符用于对两个表达式进行分组。

重要

使用 和,或运算符Camel 2.4 或更早的版本 中,或者只能以简单语言表达式使用 一次Camel 2.5 开始,您可以多次使用这些运算符。

AND 的语法是:

${leftValue} OP rightValue and ${leftValue} OP rightValue

OR 的语法是:

${leftValue} OP rightValue or ${leftValue} OP rightValue

一些示例:

// exact equals match
simple("${in.header.foo} == 'foo'")

// ignore case when comparing, so if the header has value FOO this will match
simple("${in.header.foo} =~ 'foo'")

// here Camel will type convert '100' into the type of in.header.bar and if it is an Integer '100' will also be converter to an Integer
simple("${in.header.bar} == '100'")

simple("${in.header.bar} == 100")

// 100 will be converter to the type of in.header.bar so we can do > comparison
simple("${in.header.bar} > 100")

304.5.1. 与不同类型进行比较

当您与不同类型(如 String 和 int)进行比较时,您必须小心。Camel 将左手中的类型用作1优先级。如果这两个值都无法根据该类型进行比较,则回退到右边类型。
这意味着您可以颠倒值来强制使用特定的类型。假设上面的栏值是一个字符串。然后,您可以加剧:

simple("100 < ${in.header.bar}")

然后,这将确保 int 类型用作1优先级。

如果 Camel 团队对二进制比较操作进行了改变,则最好使用基于字符串的数字类型。它最常是 String 类型,在与数字进行比较时会导致问题。

// testing for null
simple("${in.header.baz} == null")

// testing for not null
simple("${in.header.baz} != null")

而且,一个更高级的示例,正确的值是另一个表达式

simple("${in.header.date} == ${date:now:yyyyMMdd}")

simple("${in.header.type} == ${bean:orderService?method=getOrderType}")

以及包含 的示例,并在标题包含 Camel 一词时进行测试

simple("${in.header.title} contains 'Camel'")

以及带有 regex 的示例,测试该数字标头是 4 个数字值:

simple("${in.header.number} regex '\\d{4}'")

最后,如果标头等于列表中任何值,则示例。每个元素都必须用逗号分开,且没有空格。
这也适用于数字,因为 Camel 会将每个元素转换为左侧类型。

simple("${in.header.type} in 'gold,silver'")

对于所有最后 3,我们还不支持使用以下内容的 negate 测试:

simple("${in.header.type} not in 'gold,silver'")

您可以测试该类型是否为特定实例,例如,表示实例是一个字符串

simple("${in.header.type} is 'java.lang.String'")

我们为所有 java.lang 类型添加了一个速记,因此您可以将其写成:

simple("${in.header.type} is 'String'")

还支持范围。范围间隔需要数字,来自 和 结尾。例如,要测试一个值介于 100 到 199 之间:

simple("${in.header.number} range 100..199")

请注意,我们在没有空格的范围内使用。 它基于与 Groovy 相同的语法。

Camel 2.9 开始,范围值必须采用单引号

simple("${in.header.number} range '100..199'")

304.5.2. 使用 Spring XML

因为 Spring XML 没有所有电源作为 Java DSL,其所有构建程序方法都不需要使用其他语言来测试简单操作器。现在,您可以使用简单语言进行此操作。在以下示例中,我们要测试标头是小部件顺序:

<from uri="seda:orders">
   <filter>
       <simple>${in.header.type} == 'widget'</simple>
       <to uri="bean:orderService?method=handleWidget"/>
   </filter>
</from>

304.6. 使用 和 / 或者

如果您有两个表达式,您可以将其与 运算符组合。

提示

Camel 2.9 开始,Camel 2.9 的使用 && 或 ||

例如:

simple("${in.header.title} contains 'Camel' and ${in.header.type'} == 'gold'")

当然,支持 。这个示例是:

simple("${in.header.title} contains 'Camel' or ${in.header.type'} == 'gold'")

注意: 当前和 中只能以简单语言表达式使用 一次。这可能会改变。
因此,您无法

simple("${in.header.title} contains 'Camel' and ${in.header.type'} == 'gold' and ${in.header.number} range 100..200")

304.7. Samples

在 Spring XML 示例中,我们基于一个标头值进行过滤:

<from uri="seda:orders">
   <filter>
       <simple>${in.header.foo}</simple>
       <to uri="mock:fooOrders"/>
   </filter>
</from>

可以在 Message Filter 模式下将简单语言用于上述 predicate 测试,其中我们测试消息中是否有 foo 标头(包含 foo 键的标题)。如果表达式评估为 true,则消息将路由到 模拟:fooOrders 端点,否则会丢弃消息。

Java DSL 中的相同示例:

from("seda:orders")
    .filter().simple("${in.header.foo}")
        .to("seda:fooOrders");

您还可以使用简单语言进行简单文本组合,例如:

from("direct:hello")
    .transform().simple("Hello ${in.header.user} how are you?")
    .to("mock:reply");

请注意,我们现在必须使用 $\{ } 占位符来允许 Camel 正确解析它。

此示例使用 date 命令输出当前日期。

from("direct:hello")
    .transform().simple("The today is ${date:now:yyyyMMdd} and it is a great day.")
    .to("mock:reply");

在下面的示例中,我们调用 bean 语言以调用要包含在返回的字符串中的 Bean 方法:

from("direct:order")
    .transform().simple("OrderId: ${bean:orderIdGenerator}")
    .to("mock:reply");

其中 orderIdGenerator 是 registry 中注册的 bean 的 id。如果使用 Spring,则它是 Spring bean id。

如果我们希望声明在订购 id 生成器中调用的方法,则必须添加 .method 名称,如我们调用 generateId 方法的下方。

from("direct:order")
    .transform().simple("OrderId: ${bean:orderIdGenerator.generateId}")
    .to("mock:reply");

我们可以使用我们熟悉 Bean 组件本身的 ?method=methodname 选项:

from("direct:order")
    .transform().simple("OrderId: ${bean:orderIdGenerator?method=generateId}")
    .to("mock:reply");

通过从 Camel 2.3 开始,您可以将正文转换为给定类型,例如确保它是一个 String:

<transform>
  <simple>Hello ${bodyAs(String)} how are you?</simple>
</transform>

有几个类型有简写表示法,因此我们可以使用 String 而不是 java.lang.String。它们是: byte[]、String、Integer、Long。所有其他类型都必须使用其 FQN 名称,如 org.w3c.dom.Document

也可以从 Camel 2.3 中的标头 映射 中查找值:

<transform>
  <simple>The gold value is ${header.type[gold]}</simple>
</transform>

在上面的代码中,我们使用名称 类型 查找标头,并将其视为 java.util.Map,然后使用键 gold 键进行查找并返回值。如果标头无法转换为映射异常。如果名称 类型为 的标头不存在 null

在 Camel 2.9 开始,您可以嵌套功能,如下所示:

<setHeader headerName="myHeader">
  <simple>${properties:${header.someKey}}</simple>
</setHeader>

304.8. 引用常量或枚举

可从 Camel 2.11 开始

假设您的客户有枚举

在以内容为基础的路由器中,我们可以使用 简单 语言引用此枚举语言,检查其匹配的消息。

304.9. 在 XML DSL 中使用新行或标签页

作为 Camel 2.9.3 提供

从 Camel 2.9.3 开始,更容易在 XML DSL 中指定新行或标签页,因为现在您可以转义该值

<transform>
  <simple>The following text\nis on a new line</simple>
</transform>

304.10. 导和结尾空格处理

可从 Camel 2.10.0 开始

从 Camel 2.10.0 开始,表达式的修剪属性可用于控制是否删除前导和尾随空白字符。默认值为 true,用于删除空格字符。

<setBody>
  <simple trim="false">You get some trailing whitespace characters.     </simple>
</setBody>

304.11. 设置结果类型

可从 Camel 2.8 开始

现在,您可以为 Simple 表达式提供结果类型,这意味着评估结果将转换为所需的类型。这最常用来定义布尔值、整数等类型。

例如,要将标头设置为布尔值类型,您可以执行以下操作:

.setHeader("cool", simple("true", Boolean.class))

和在 XML DSL 中

<setHeader headerName="cool">
  <!-- use resultType to indicate that the type should be a java.lang.Boolean -->
  <simple resultType="java.lang.Boolean">true</simple>
</setHeader>

304.12. 更改函数启动和结束令牌

可从 Camel 2.9.1 开始

您可以使用 Java 代码,配置函数开始和结束令牌 - 使用 setters changeFunctionStartTokenchangeFunctionEndToken $\{ }。在 Spring XML 中,您可以使用属性中的新更改令牌定义 <bean> 标签,如下所示:

<!-- configure Simple to use custom prefix/suffix tokens -->
<bean id="simple" class="org.apache.camel.language.simple.SimpleLanguage">
  <property name="functionStartToken" value="["/>
  <property name="functionEndToken" value="]"/>
</bean>

在上面的示例中,我们使用 [ ] 作为更改的令牌。

请注意,更改您更改所有 Camel 应用程序中的 start/end 令牌,这些令牌在类路径上共享相同的 camel-core
例如,在 OSGi 服务器中,这会影响到许多应用程序,因为 Web 应用程序作为一个 WAR 文件,它只影响 Web 应用程序。

304.13. 从外部资源载入脚本

可从 Camel 2.11 开始

您可以对脚本进行外部化,并使 Camel 从资源(如 "classpath:""file:""http:" )加载。
这可通过以下语法完成: "resource:scheme:location",例如参考类路径上的文件,您可以执行以下操作:

.setHeader("myHeader").simple("resource:classpath:mysimple.txt")

304.14. 将 Spring Bean 设置为 Exchange 属性

可作为 Camel 2.6 使用。

您可以将 spring bean 设置为交换属性,如下所示:

<bean id="myBeanId" class="my.package.MyCustomClass" />
...
<route>
  ...
  <setProperty propertyName="monitoring.message">
    <simple>ref:myBeanId</simple>
  </setProperty>
  ...
</route>

304.15. 依赖项

简单 语言是 camel-core 的一部分。

第 305 章 SIP 组件

可作为 Camel 版本 2.5 提供

Camel 中的 sip 组件是一个通信组件,基于 Jain SIP 实施(可在 JCP 许可证下可用)。

会话初始协议(SIP)是一种 IETF 定义的信号协议,广泛用于控制多媒体通信会话,如语音和视频调用(IP)。SIP 协议是一个独立于底层传输层的应用程序层协议,它可以在传输控制协议(TCP)、用户数据报协议(UDP)或流控制传输协议(SCTP)上运行。

Jain SIP 实施仅支持 TCP 和 UDP。

根据 RFC3903 - Session Initiation Protocol (SIP) Extension 所述,Camel SIP 组件 只支持 SIPPublish 和 Subscribe 功能。

此 camel 组件支持制作者和消费者端点。

Camel SIP Producers (Event Publishers)和 SIP Consumers (Event Subscribers)使用称为 SIP Presence Agent (有状态代理实体)将事件和状态信息相互通信。

对于基于 SIP 的通信,必须在 SIP Producer 和 Consumer (如果使用本地主机时使用单独的端口)实例化带有监听程序的 SIP 堆栈。这是为了支持在通信期间在 SIP 堆栈之间交换的握手和确认。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sip</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

305.1. URI 格式

sip 端点的 URI 方案如下:

sip://johndoe@localhost:99999[?options]
sips://johndoe@localhost:99999/[?options]

此组件支持 TCP 和 UDP 的生产者和消费者端点。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

305.2. 选项

SIP 组件提供了一组广泛的配置选项和相应的功能,可以创建自定义有状态标头来通过 SIP 协议传播状态。

SIP 组件没有选项。

SIP 端点使用 URI 语法配置:

sip:uri

使用以下路径和查询参数:

305.2.1. 路径名(1 参数):

名称描述默认类型

uri

要连接的 SIP 服务器 所需的 URI (可以包括用户名和密码,如 john:secretmyserver:9999)

 

URI

305.2.2. 查询参数(44 参数):

名称描述默认类型

cacheConnections (common)

SipStack 缓存应连接缓存,以减少连接创建的成本。如果连接用于长时间运行的对话,这将非常有用。

false

布尔值

contentSubType (common)

contentSubType 的设置可设置为任何有效的 MimeSubType。

plain

字符串

contentType (common)

contentType 的设置可设置为任何有效的 MimeType。

text

字符串

eventHeaderName (common)

为基于字符串的事件类型设置 String。

 

字符串

eventId (common)

为基于字符串的事件 Id 设置 String。除非指定了基于 registry 的 FromHeader,否则强制设置

 

字符串

fromHost (common)

消息来源器的主机名。除非指定了基于 registry 的 FromHeader,否则强制设置

 

字符串

fromPort (common)

消息来源的端口。除非指定了基于 registry 的 FromHeader,否则强制设置

 

int

fromUser (common)

消息源器的用户名。除非指定了基于 registry 的自定义 FromHeader,否则强制设置。

 

字符串

msgExpiration (common)

端点收到的消息被视为有效的时间

3600

int

receiveTimeoutMillis (common)

可从其他 SIP 堆栈接收有关等待响应和/或确认的时间设置

10000

long

stackName (common)

与 SIP 端点关联的 SIP Stack 实例的名称。

NAME_NOT_SET

字符串

toHost (common)

消息接收器的主机名。除非指定了基于 registry 的 ToHeader,否则强制设置

 

字符串

toPort (common)

消息接收器的 PORTNAME。除非指定了基于 registry 的 ToHeader,否则强制设置

 

int

toUser (common)

消息接收器的用户名。除非指定了基于 registry 的自定义 ToHeader,否则强制设置。

 

字符串

transport (common)

设置传输协议。有效的选择是 tcp 或 udp。

tcp

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

consumer (consumer)

此设置用于决定为此端点创建的标头(FromHeader、ToHeader 等)

false

布尔值

presenceAgent (consumer)

此设置用于区分 Presence Agent 和消费者。这是因为 SIP Camel 组件随附了基本的 Presence Agent (仅用于测试目的)。消费者必须将此标志设置为 true。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

addressFactory (advanced)

使用自定义地址工厂

 

AddressFactory

callIdHeader (advanced)

包含调用详情的自定义标头对象。必须实现 javax.sip.header.CallIdHeader 类型

 

CallIdHeader

contactHeader (advanced)

可选的自定义标头对象,其中包含详细联系人详情(电子邮件、电话号码等)。必须实施 javax.sip.header.ContactHeader

 

ContactHeader

contentTypeHeader (advanced)

包含消息内容详情的自定义标头对象。必须实施 javax.sip.header.ContentTypeHeader

 

ContentTypeHeader

eventHeader (advanced)

包含事件详情的自定义标头对象。必须实施 javax.sip.header.EventHeader

 

EventHeader

expiresHeader (advanced)

包含消息过期详情的自定义标头对象。必须实施 javax.sip.header.ExpiresHeader

 

ExpiresHeader

extensionHeader (advanced)

包含用户/应用程序特定详情的自定义标头对象。必须实施 javax.sip.header.ExtensionHeader

 

ExtensionHeader

fromHeader (advanced)

包含消息源器设置的自定义标头对象。必须实施 javax.sip.header.FromHeader

 

FromHeader

headerFactory (advanced)

使用自定义HeaderFactory

 

HeaderFactory

listeningPoint (advanced)

使用自定义 ListeningPoint 实现

 

ListeningPoint

maxForwardsHeader (advanced)

包含最大代理转发详情的自定义标头对象。这个标头可能会通过Headers 在可能上放置一个限制。必须实施 javax.sip.header.MaxForwardsHeader

 

MaxForwardsHeader

maxMessageSize (advanced)

设置最大允许的消息大小(以字节为单位)。

1048576

int

messageFactory (advanced)

使用自定义消息系数

 

MessageFactory

sipFactory (advanced)

使用自定义 SipFactory 创建要使用的 SipStack

 

SipFactory

sipStack (advanced)

使用自定义 SipStack

 

SipStack

sipUri (advanced)

使用自定义 SipURI。如果没有配置,则 SipUri fallback 将使用 options toUser toHost:toPort

 

SipURI

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

toHeader (advanced)

包含消息接收器设置的自定义标头对象。必须实施 javax.sip.header.ToHeader

 

ToHeader

viaHeaders (advanced)

类型 javax.sip.header.ViaHeader 的自定义标头对象列表。每个 ViaHeader 包含用于请求转发的代理地址。(请注意,当请求到达其侦听器时,每个代理都会自动更新此标头。)

 

list

implementationDebugLogFile (logging)

用于日志记录的客户端调试日志文件名称

 

字符串

implementationServerLogFile (logging)

用于日志记录的服务器日志文件名称

 

字符串

implementationTraceLevel (logging)

用于追踪的日志记录级别

0

字符串

maxForwards (proxy)

最大代理转发数

 

int

useRouterForAllUris (proxy)

当请求通过代理发送到 Presence Agent 时,将使用此设置。

false

布尔值

305.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.sip.enabled

启用 sip 组件

true

布尔值

camel.component.sip.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

305.4. 向 SIP 端点发送消息/来自 SIP 端点

305.4.1. 创建 Camel SIP 发布程序

在以下示例中,会创建一个 SIP Publisher 将 SIP 事件发布发送到
一个用户 "agent@localhost:5152"。这是 SIP Presence Agent 的地址,它充当 SIP Publisher 和 Subscriber 之间的代理

  • 使用名为 client 的 SIP Stack
  • 使用名为 evtHdrName 的 registry 的事件标头
  • 使用基于 registry 的 eventId,名为 evtId
  • 从带有 Listener 的 SIP Stack 中,设置为 user2@localhost:3534
  • 事件正在发布为 EVENT_A
  • 名为 REQUEST_METHOD 的 Mandatory 标头设置为 Request.Publish,从而将端点设置为 Event publisher"。
producerTemplate.sendBodyAndHeader(
    "sip://agent@localhost:5152?stackName=client&eventHeaderName=evtHdrName&eventId=evtid&fromUser=user2&fromHost=localhost&fromPort=3534",
    "EVENT_A",
    "REQUEST_METHOD",
    Request.PUBLISH);

305.4.2. 创建 Camel SIP Subscriber

在以下示例中,会创建一个 SIP Subscriber 来接收发送到
的 SIP 事件发布程序,用户"johndoe@localhost:5154"

  • 使用名为 Subscriber 的 SIP Stack
  • 使用名为 agent@localhost:5152 的 Presence Agent 用户注册
  • 使用名为 evtHdrName 的 registry 的事件标头。evtHdrName 包含 Event,它 se to "Event_A"
  • 使用基于 registry 的 eventId,名为 evtId
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            // Create PresenceAgent
            from("sip://agent@localhost:5152?stackName=PresenceAgent&presenceAgent=true&eventHeaderName=evtHdrName&eventId=evtid")
                .to("mock:neverland");

            // Create Sip Consumer(Event Subscriber)
            from("sip://johndoe@localhost:5154?stackName=Subscriber&toUser=agent&toHost=localhost&toPort=5152&eventHeaderName=evtHdrName&eventId=evtid")
                .to("log:ReceivedEvent?level=DEBUG")
                .to("mock:notification");

        }
    };
}

Camel SIP 组件附带一个 Presence Agent,用于仅用于测试和演示目的。上面提供了实例化代理的示例。

请注意,Presence Agent 设置为用户 agent@localhost:5152,并可与发布程序以及 Subscriber 通信。它有单独的 SIP stackName 与 Publisher 以及 Subscriber 不同。虽然它被设置为 Camel Consumer,但它实际上不会将任何消息发送到端点"mock:neverland"。

第 306 章 简单 JMS Batch 组件

作为 Camel 版本 2.16 可用

SJMS Batch 是 JMS 队列中具有高性能、事务批处理使用的专用组件。它可以被看作是仅消费者的组件和聚合器的混合。

Camel 中的常见用例是使用来自队列的消息,并在将聚合状态发送到另一个端点前对其进行聚合。为确保数据在执行处理失败时不会丢失,它通常会使用来自队列的事务中,并且聚合到持久聚合了(如 JDBC 组件 中找到的)中。

聚合器模式的行为涉及在聚合了传入消息前从 AggregationRepository 中获取数据,并在结果后回写结果。从本质上讲,当聚合工件的数量增加时,读取和写入会逐渐增加。使用任意时间单元的这个示例显示这个影响如下:

读取时间写时间总时间

0

0

1

1

1

1

2

4

2

2

3

9

3

3

4

16

4

4

5

25

5

5

6

36

6

6

7

49

7

7

8

64

8

8

9

81

9

9

10

100

相反,使用 SJMS Batch 组件消耗性能是线性的。在获取下一个消息前,每个消息都会使用 AggregationStrategy 进行消耗和聚合。由于所有消耗和聚合都在单一 JMS 事务中执行,因此不需要保留中间状态,从而避免了上述的读取和写入成本。实际上,这会产生多个更高吞吐量的订单。

满足完成条件后,根据大小或周期在第一个消息后,就会将聚合的 Exchange 传递到路由。在此 Exchange 处理过程中,如果引发异常或系统关闭,则所有原始使用的消息都后端在队列中(或者被置于死信队列上,具体取决于代理配置)。

与使用常规聚合器不同的是,没有聚合条件的功能,这意味着无法将消耗在多个消息组中。所有使用的消息都会聚合到单个批处理中。

有多个 JMS 使用者支持允许您使用一个路由并行使用,同时使用 JMS 消息组等功能来分组相关消息。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sjms</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

306.1. URI 格式

sjms:[queue:]destinationName[?options]

其中 destinationName 是 JMS 队列。默认情况下,targetName 解释为队列名称。

sjms:FOO.BAR

如果需要,可以包括可选 queue: 前缀:

sjms:queue:FOO.BAR

不支持主题消耗,因为在该上下文中不使用批处理功能没有优点。主题消息通常非持久性,而且丢失是可以接受的。如果在失败的事务中使用,则代理可能无法对主题消息进行恢复。在这种情况下,可以将普通 SJMS 使用者端点与常规非永久性支持的聚合器一起使用。

306.2. 组件选项和配置

Simple JMS Batch 组件支持 5 选项,它们如下所列。

名称描述默认类型

connectionFactory (advanced)

需要 ConnectionFactory 来启用 SjmsBatchComponent。

 

ConnectionFactory

asyncStartListener (advanced)

启动路由时是否异步启动使用者消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

recoveryInterval (advanced)

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

int

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Simple JMS Batch 端点使用 URI 语法配置:

sjms-batch:destinationName

使用以下路径和查询参数:

306.2.1. 路径名(1 参数):

名称描述默认类型

destinationName

所需 目的地名称。只支持队列,名称可以使用 'queue:' 前缀。

 

字符串

306.2.2. 查询参数(23 参数):

名称描述默认类型

aggregationStrategy (consumer)

需要 聚合策略来使用,它将所有批处理消息合并到一个消息中

 

AggregationStrategy

allowNullBody (consumer)

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

completionInterval (consumer)

millis 的完成间隔,这会导致批处理每间隔以调度的固定率完成。如果触发超时且批处理中没有消息,则批处理可能为空。请注意,您不能同时使用完成超时和完成间隔,只能配置一个。

1000

int

completionPredicate (consumer)

completion predicate,这会导致当谓词评估为 true 时完成批处理。也可以使用简单语言配置谓词,使用字符串语法。您可能需要将选项 eagerCheckCompletion 设置为 true,以便 predicate 与传入消息匹配,否则它与聚合的消息匹配。

 

字符串

completionSize (consumer)

批处理将完成的消息数量

200

int

completionTimeout (consumer)

在批处理完成时,millis 收到第一个一条消息的超时。如果触发超时且批处理中没有消息,则批处理可能为空。请注意,您不能同时使用完成超时和完成间隔,只能配置一个。

500

int

consumerCount (consumer)

要使用的 JMS 会话数量

1

int

eagerCheckCompletion (consumer)

使用预先完成检查,这表示 completionPredicate 将使用传入的 Exchange。与不预先完成检查 completion 外,将使用聚合的 Exchange。

false

布尔值

includeAllJMSXProperties (consumer)

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

mapJmsMessage (consumer)

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。如需了解更多详细信息,请参阅下面映射如何工作的部分。

true

布尔值

pollDuration (consumer)

消息轮询的毫秒毫秒。如果时间更短且批处理已启动,则使用 completionTimeOut。

1000

int

sendEmptyMessageWhenIdle (consumer)

如果使用完成超时或间隔,则批处理可能会在触发超时且批处理中没有消息时为空。如果这个选项为 true,且批处理为空,则会将空消息添加到批处理中,因此路由空消息。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

asyncStartListener (advanced)

启动路由时是否异步启动使用者消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

headerFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

jmsKeyFormatStrategy (advanced)

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了两个开箱即用的实现:默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

JmsKeyFormatStrategy

keepAliveDelay (advanced)

millis 试图重新建立有效会话之间的延迟。如果这是正数的,如果 SjmsBatchConsumer 在消息消耗期间看到 IllegalStateException,它将尝试创建新的会话。这个延迟值允许您在尝试之间暂停以防止垃圾邮件日志。如果这是负值(默认为 -1),则 SjmsBatchConsumer 的行为与它始终有一样工作 - 也就是说,如果路由看到 IllegalStateException,则路由将关闭。

-1

int

messageCreatedStrategy (advanced)

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

recoveryInterval (advanced)

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

timeoutCheckerExecutor Service (advanced)

如果使用 completionInterval 选项,则创建一个后台线程来触发完成间隔。设置这个选项,以提供要使用的自定义线程池,而不是为每个消费者创建新线程。

 

ScheduledExecutor 服务

306.3. Spring Boot Auto-Configuration

组件支持 6 个选项,它们如下所列。

名称描述默认类型

camel.component.sjms-batch.async-start-listener

启动路由时是否异步启动使用者消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

camel.component.sjms-batch.connection-factory

需要 ConnectionFactory 来启用 SjmsBatchComponent。选项是一个 javax.jms.ConnectionFactory 类型。

 

字符串

camel.component.sjms-batch.enabled

启用 sjms-batch 组件

true

布尔值

camel.component.sjms-batch.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.sjms-batch.recovery-interval

指定恢复尝试之间的间隔,即当连接被刷新时(以毫秒为单位)。默认值为 5000 ms,即 5 秒。

5000

整数

camel.component.sjms-batch.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

completionSize 端点属性与 completionTimeout 结合使用,其中要满足的第一个条件将导致聚合的 Exchange 发出中断路由。

第 307 章 简单的 JMS 组件

作为 Camel 2.11 版本提供

简单 JMS 组件(SJMS 组件或 SJMS)是与 Camel 一起使用的 JMS 客户端,它在 JMS 客户端创建和配置时使用众所周知的最佳实践。SJMS 包含明确编写的用于消除第三方消息传递实施的品牌新的 JMS 客户端 API,使其保持系统正常和弹性。包括以下功能:

  • 标准队列和主题支持(不可处理和不可处理)
  • InOnly 和 InOut MEP 支持
  • 异步生产和消费者处理
  • 内部 JMS 事务支持

其他主要功能包括:

  • 可插拔连接资源管理
  • session、Consumer 和 Producer Pooling and caching Management
  • 批处理消费者和 Producers
  • transacted Batch Consumers & Producers
  • 支持定制交易委员会策略(仅限本地 JMS 事务)
注意

为什么 S 在 SJMS 中

S 代表简单和标准,无 Spring。另外,已经参加了 camel-jms。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sjms</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

307.1. URI 格式

sjms:[queue:|topic:]destinationName[?options]

其中 destinationName 是 JMS 队列或主题名称。默认情况下,targetName 解释为队列名称。例如,要连接到队列,FOO.BAR 使用:

sjms:FOO.BAR

如果需要,可以包括可选 queue: 前缀:

sjms:queue:FOO.BAR

要连接到一个主题,您必须 包括 主题: 前缀。例如,要连接到主题(rades .Prices), 请使用:

sjms:topic:Stocks.Prices

您可以使用以下格式将查询选项附加到 URI,?option=value&amp ;option=value&…​

307.2. 组件选项和配置

Simple JMS 组件支持 15 个选项,它们如下所列。

名称描述默认类型

connectionFactory (advanced)

需要 ConnectionFactory 来启用 SjmsComponent。它可以直接设置,也可以设置为 ConnectionResource 的一部分。

 

ConnectionFactory

connectionResource (advanced)

ConnectionResource 是一个接口,它允许对 ConnectionFactory 进行自定义和容器控制。详情请查看可插拔连接资源管理。

 

ConnectionResource

connectionCount (common)

此组件下启动的端点的最大连接数

1

整数

jmsKeyFormatStrategy (advanced)

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了一个开箱即用的实施:default.默认策略将安全汇总点和连字符(. 和 -)。可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

JmsKeyFormatStrategy

transactionCommit Strategy (transaction)

配置要使用的提交策略。Camel 提供了两个开箱即用的实施,即 default 和 batch。

 

TransactionCommit Strategy

destinationCreation Strategy (advanced)

使用自定义 DestinationCreationStrategy。

 

DestinationCreation Strategy

timedTaskManager (advanced)

使用自定义 TimedTaskManager

 

TimedTaskManager

messageCreatedStrategy (advanced)

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

connectionTestOnBorrow (advanced)

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,应测试每个 javax.jms.Connection,然后从池返回(计算启动)。

true

布尔值

connectionUsername (security)

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的用户名。

 

字符串

connectionPassword (security)

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的密码。

 

字符串

connectionClientId (advanced)

在使用默认的 org.apache.camel.component.sjms.jms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的客户端 ID。

 

字符串

connectionMaxWait (advanced)

当使用默认的 org.apache.camel.component.sjms.jms.ConnectionFactoryResource 时,在池被耗尽时,可以阻止 millis 最多等待可用连接。

5000

long

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Simple JMS 端点使用 URI 语法配置:

sjms:destinationType:destinationName

使用以下路径和查询参数:

307.2.1. 路径名(2 参数):

名称描述默认类型

destinationType

要使用的目的地种类

队列

字符串

destinationName

required DestinationName 是 JMS 队列或主题名称。默认情况下,targetName 解释为队列名称。

 

字符串

307.2.2. 查询参数(34 参数):

名称描述默认类型

acknowledgementMode (common)

JMS 确认名称之一: SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE

AUTO_ ACKNOWLEDGE

SessionAcknowledgement 类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

consumerCount (consumer)

设置用于此端点的使用者监听程序数量。

1

int

durableSubscriptionId (consumer)

设置持久主题所需的 durable 订阅 Id。

 

字符串

同步 (消费者)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

messageSelector (consumer)

设置 JMS 消息选择器语法。

 

字符串

namedReplyTo (producer)

设置用于 InOut producer 端点的目的地名称的回复。对目的地的回复类型可以通过名称中的起始前缀(主题:或 queue:)决定。

 

字符串

persistent (producer)

用于启用/禁用消息持久性的标志。

true

布尔值

producerCount (producer)

设置用于此端点的制作者数量。

1

int

ttl (producer)

用于调整生成消息的生存时间值的标志。

-1

long

allowNullBody (producer)

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

prefillPool (producer)

是否在启动时预先填充制作者连接池,或在需要时创建连接延迟。

true

布尔值

responseTimeOut (producer)

设置在超时外部响应前应等待的时间。

5000

long

asyncStartListener (advanced)

启动路由时是否异步启动使用者消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

asyncStopListener (advanced)

是否在停止路由时异步停止使用者消息监听程序。

false

布尔值

connectionCount (advanced)

此端点可用的连接数上限

 

整数

connectionFactory (advanced)

为端点初始化 connectionFactory,这会优先于组件的 connectionFactory 的优先级(若有)

 

ConnectionFactory

connectionResource (advanced)

初始化端点的连接Resource,其优先于组件的 connectionResource (若有)

 

ConnectionResource

destinationCreationStrategy (advanced)

使用自定义 DestinationCreationStrategy。

 

DestinationCreation Strategy

exceptionListener (advanced)

指定任何底层 JMS 异常通知的 JMS Exception Listener。

 

ExceptionListener

headerFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

includeAllJMSXProperties (advanced)

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

jmsKeyFormatStrategy (advanced)

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了两个开箱即用的实现:默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

JmsKeyFormatStrategy

mapJmsMessage (advanced)

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。如需了解更多详细信息,请参阅下面映射如何工作的部分。

true

布尔值

messageCreatedStrategy (advanced)

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

errorHandlerLoggingLevel (logging)

允许配置默认错误处理程序日志记录级别,以记录异常。

WARN

LoggingLevel

errorHandlerLogStackTrace (logging)

允许控制是否应该记录堆栈追踪,默认错误处理程序。

true

布尔值

transacted (transaction)

指定是否使用翻译模式

false

布尔值

transactionBatchCount (transaction)

如果在提交事务前对要处理的消息数进行了转换。

-1

int

transactionBatchTimeout (transaction)

为批处理事务设置超时(millis),该值应为 1000 或更高。

5000

long

transactionCommitStrategy (transaction)

设置提交策略。

 

TransactionCommit Strategy

sharedJMSSession (transaction)

指定是否与其他 SJMS 端点共享 JMS 会话。如果您的路由正在访问多个 JMS 提供程序,请关闭。如果您需要对多个 JMS 提供程序的事务,请使用 jms 组件来利用 XA 事务。

true

布尔值

307.3. Spring Boot Auto-Configuration

组件支持 15 个选项,它们如下所列。

名称描述默认类型

camel.component.sjms.connection-client-id

在使用默认的 org.apache.camel.component.sjms.jms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的客户端 ID。

 

字符串

camel.component.sjms.connection-count

此组件下启动的端点的最大连接数

1

整数

camel.component.sjms.connection-factory

需要 ConnectionFactory 来启用 SjmsComponent。它可以直接设置,也可以设置为 ConnectionResource 的一部分。选项是一个 javax.jms.ConnectionFactory 类型。

 

字符串

camel.component.sjms.connection-max-wait

当使用默认的 org.apache.camel.component.sjms.jms.ConnectionFactoryResource 时,在池被耗尽时,可以阻止 millis 最多等待可用连接。

5000

Long

camel.component.sjms.connection-password

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的密码。

 

字符串

camel.component.sjms.connection-resource

ConnectionResource 是一个接口,它允许对 ConnectionFactory 进行自定义和容器控制。详情请查看可插拔连接资源管理。选项是一个 org.apache.camel.component.sjms.ConnectionResource 类型。

 

字符串

camel.component.sjms.connection-test-on-borrow

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,应测试每个 javax.jms.Connection,然后从池返回(计算启动)。

true

布尔值

camel.component.sjms.connection-username

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的用户名。

 

字符串

camel.component.sjms.destination-creation-strategy

使用自定义 DestinationCreationStrategy。选项是一个 org.apache.camel.component.sjms.DestinationCreationStrategy 类型。

 

字符串

camel.component.sjms.enabled

启用 sjms 组件

true

布尔值

camel.component.sjms.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.sjms.jms-key-format-strategy

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了一个开箱即用的实施:default.默认策略将安全汇总点和连字符(. 和 -)。可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。选项是一个 org.apache.camel.component.sjms.jms.JmsKeyFormatStrategy type。

 

字符串

camel.component.sjms.message-created-strategy

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。选项是一个 org.apache.camel.component.sjms.MessageCreatedStrategy type。

 

字符串

camel.component.sjms.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.sjms.transaction-commit-strategy

配置要使用的提交策略。Camel 提供了两个开箱即用的实施,即 default 和 batch。选项是一个 org.apache.camel.component.sjms.TransactionCommitStrategy type。

 

字符串

以下是如何将 SjmsComponent 配置为其所需的 ConnectionFactory provider。默认情况下,它将创建一个连接,并使用内部池 API 来存储它,以确保它可以以线程安全的方式创建请求。

SjmsComponent component = new SjmsComponent();
component.setConnectionFactory(new ActiveMQConnectionFactory("tcp://localhost:61616"));
getContext().addComponent("sjms", component);

对于支持持久订阅的 SJMS 组件,您可以覆盖默认的 ConnectionFactoryResource 实例,并设置 clientId 属性。

ConnectionFactoryResource connectionResource = new ConnectionFactoryResource();
connectionResource.setConnectionFactory(new ActiveMQConnectionFactory("tcp://localhost:61616"));
connectionResource.setClientId("myclient-id");

SjmsComponent component = new SjmsComponent();
component.setConnectionResource(connectionResource);
component.setMaxConnections(1);

307.4. 制作者使用情况

307.4.1. InOnly Producer - (默认)

InOnly producer 是 SJMS Producer Endpoint 的默认行为。

from("direct:start")
    .to("sjms:queue:bar");

307.4.2. InOut Producer

要启用 InOut 行为,请将 exchangePattern 属性附加到 URI。默认情况下,它将为每个使用者使用一个专用的 TemporaryQueue。

from("direct:start")
    .to("sjms:queue:bar?exchangePattern=InOut");

您可以指定 namedReplyTo,虽然它可以提供更好的监控器点。

from("direct:start")
    .to("sjms:queue:bar?exchangePattern=InOut&namedReplyTo=my.reply.to.queue");

307.5. 消费者使用

307.5.1. InOnly Consumer - (默认)

InOnly xonsumer 是 SJMS Consumer Endpoint 的默认 Exchange 行为。

from("sjms:queue:bar")
    .to("mock:result");

307.5.2. InOut Consumer

要启用 InOut 行为,请将 exchangePattern 属性附加到 URI。

from("sjms:queue:in.out.test?exchangePattern=InOut")
    .transform(constant("Bye Camel"));

307.6. 高级使用备注

307.6.1. 可插拔连接资源管理

SJMS 通过内置连接池提供 JMS 连接资源管理。 http://docs.oracle.com/javaee/5/api/javax/jms/Connection.html这消除了依赖第三方 API 池逻辑的需求。但是,您可能需要使用外部连接资源管理器,如 J2EE 或 OSGi 容器提供的资源管理器。对于此 SJMS 提供了一个接口,可用于覆盖内部 SJMS 连接池功能。这通过 ConnectionResource 接口来完成。

Connection Resource 提供了根据需要来浏览和返回连接方法,即用于向 SJMS 组件提供连接池的合同。如果需要将 SJMS 与外部连接池管理器集成时,应使用用户。

建议您为标准的 ConnectionFactory 提供程序使用通过 SJMS as-is 提供的 ConnectionFactoryResource 实施,或者随着该组件优化而扩展。

以下是将插件的 ConnectionResource 和 ActiveMQ PooledConnectionFactory 搭配使用的示例:

public class AMQConnectionResource implements ConnectionResource {
    private PooledConnectionFactory pcf;

    public AMQConnectionResource(String connectString, int maxConnections) {
        super();
        pcf = new PooledConnectionFactory(connectString);
        pcf.setMaxConnections(maxConnections);
        pcf.start();
    }

    public void stop() {
        pcf.stop();
    }

    @Override
    public Connection borrowConnection() throws Exception {
        Connection answer = pcf.createConnection();
        answer.start();
        return answer;
    }

    @Override
    public Connection borrowConnection(long timeout) throws Exception {
        // SNIPPED...
    }

    @Override
    public void returnConnection(Connection connection) throws Exception {
        // Do nothing since there isn't a way to return a Connection
        // to the instance of PooledConnectionFactory
        log.info("Connection returned");
    }
}

然后,将 ConnectionResource 传递到 SjmsComponent

CamelContext camelContext = new DefaultCamelContext();
AMQConnectionResource pool = new AMQConnectionResource("tcp://localhost:33333", 1);
SjmsComponent component = new SjmsComponent();
component.setConnectionResource(pool);
camelContext.addComponent("sjms", component);

要查看其使用的完整示例,请参阅 ConnectionResourceIT

307.6.2. 批处理消息支持

SjmsProducer 支持通过创建封装列表 的 Exchange 发布一系列消息。此 SjmsProducer 将进行迭代列表的内容并单独发布每条消息。

如果出现批处理消息,则需要设置每个消息唯一的标头,您可以使用 SJMS BatchMessage 类。当 SjmsProducer 遇到 BatchMessage 列表时,它将迭代每个 BatchMessage 并发布包括的有效负载和标头。

以下是使用 BatchMessage 类的示例。首先,我们创建一个 BatchMessage 列表:

List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
    String body = "Hello World " + i;
    BatchMessage<String> message = new BatchMessage<String>(body, null);
    messages.add(message);
}

然后发布列表:

template.sendBody("sjms:queue:batch.queue", messages);

307.6.3. 可自定义的事务委员会策略(仅限本地 JMS 事务)

SJMS 为开发人员提供了一种使用 TransactionCommitStrategy 接口来创建自定义和可插入事务策略的方法。这允许用户定义 SessionTransactionSynchronization 将用来决定何时提交会话的唯一环境。用法的示例是 BatchTransactionCommitStrategy,将在下一节中详细阐述。

307.6.4. transacted Batch Consumers & Producers

SJMS 组件旨在支持对 Producer 和 Consumer 端点上的本地 JMS 事务的批处理。它们的处理方式各不相同。

SJMS 使用者端点是一种简单的实施,可以在将 X 消息提交至关联的会话之前处理 X 消息。要在使用者上启用批处理事务,首先将 transacted 参数设置为 true,然后添加 transactionBatchCount 并将其设置为大于 0 的值。例如,以下配置将每 10 个消息提交 Session:

sjms:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10

如果在处理消费者端点上的批处理过程中发生异常,则会调用 Session rollback,从而导致消息重放给下一个可用的消费者。该计数器还被重置为相关会话的 BatchTransactionCommitStrategy 的 0。用户负责确保其批处理消息处理器中的 hook 监视 JMSRedelivered 标头设置为 true 的消息。这是指示消息在某一时间点回滚,并且应进行成功处理验证。

翻译的批处理消费者还附带的内部计时器实例,在消息之间等待默认时间(5000ms),然后提交会话上的开放事务。默认值为 5000ms (最小 1000ms)应该足以满足大多数用例,但是如果需要进一步调整,只需要设置 transactionBatchTimeout 参数。

sjms:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10&transactionBatchTimeout=2000

可以接受的最小值是 1000ms,因为上下文切换的数量可能会导致不必要的性能影响,而不获得好处。

生产者端点处理方式有不同。在每条消息传送给 Exchange 的目标后,生产者都关闭,不再引用该消息。为了让所有消息可用于重新传送,您只需在发布 BatchMessages 的 Producer Endpoints 上启用事务。事务将在交换结束时提交,其中包含批处理列表中的所有消息。不需要配置任何其他操作。例如:

List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
    String body = "Hello World " + i;
    BatchMessage<String> message = new BatchMessage<String>(body, null);
    messages.add(message);
}

现在发布启用了事务的列表:

template.sendBody("sjms:queue:batch.queue?transacted=true", messages);

307.7. 其他备注

307.7.1. Message Header Format

SJMS 组件使用相同的标头格式策略,它在 Camel JMS 组件中使用。此可插入策略可确保通过线发送的消息符合 JMS Message spec。

对于 exchange.in.header,以下规则适用于标头键:

  • JMSJMSX 开头的密钥被保留。
  • Exchange.in.headers 键必须是文字,且所有有效的 Java 标识符(不要在键名称中使用点)。
  • 在使用 JMS 消息时,Camel 替换了点和连字符以及反向。

    • 在 Camel 使用消息时,由 DOT 和反向替换替换。
    • 在 Camel 使用消息时,由 HYPHEN 和反向替换替代。
      另请参阅 jmsKeyFormatStrategy 选项,它允许使用您自己的自定义策略格式化密钥。

对于 exchange.in.header,以下规则适用于标头值:

307.7.2. 消息内容

要通过线传递内容,我们必须确保正在向 JMS 消息规范发送的消息正文。因此,生成的一切都必须是原语或其计数器对象(如 IntegerLongCharacter)。类型、StringCharSequenceDate、bigD ecimal 和 BigInteger 都被转换为 String () 表示。所有其他类型被丢弃。

307.7.3. 集群

在集群环境中使用 InOut 和 SJMS 时,您必须使用 TemporaryQueue 目的地,或使用每个 InOut producer 端点的唯一命名回复目的地。消息关联由端点处理,而不是代理中的消息代理。InOut Producer Endpoint 使用由 Message JMSCorrelationID 缓存的 Java Concurrency Exchangers。这提高了 nice 性能,同时减少代理的开销,因为所有消息都会按照感兴趣的消费者生成的顺序从目的地使用。

目前唯一的关联策略是使用 JMSCorrelationIdInOut Consumer 使用此策略并确保所有对包含的 JMSReplyTo 目的地的响应消息也都有从请求中复制的 JMSCorrelationId

307.8. 事务支持

SJMS 目前仅支持使用内部 JMS 事务。不支持 Camel 事务处理器或 Java 事务 API (JTA)。

307.8.1. Springless Mean 是否无法使用 Spring?

根本不是.以下是使用 Spring DSL 的 SJMS 组件示例:

<route
    id="inout.named.reply.to.producer.route">
    <from
        uri="direct:invoke.named.reply.to.queue" />
    <to
        uri="sjms:queue:named.reply.to.queue?namedReplyTo=my.response.queue&amp;exchangePattern=InOut" />
</route>

Spring JMS API 的依赖 Spring JMS API 解放出来。正从头开始开发一个新的 JMS 客户端 API,以支持 SJMS。

第 308 章 简单 JMS2 组件

作为 Camel 版本 2.19 可用

简单 JMS 2.0 组件(或 SJMS2)是与 Camel 一起使用的 JMS 客户端,它在 JMS 客户端创建和配置时使用众所周知的最佳实践。SJMS2 包含专为消除第三方消息传递实施明确编写的全新 JMS 2.0 客户端 API,使其保持系统正常运转和弹性。包括以下功能:

  • 标准队列和主题支持(不可处理和不可处理)
  • InOnly 和 InOut MEP 支持
  • 异步生产和消费者处理
  • 内部 JMS 事务支持

其他主要功能包括:

  • 可插拔连接资源管理
  • session、Consumer 和 Producer Pooling and caching Management
  • 批处理消费者和 Producers
  • transacted Batch Consumers & Producers
  • 支持定制交易委员会策略(仅限本地 JMS 事务)
注意

为什么 S 在 SJMS 中

S 代表简单和标准,无 Spring。另外,已经参加了 camel-jms。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sjms2</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

308.1. URI 格式

sjms2:[queue:|topic:]destinationName[?options]

其中 destinationName 是 JMS 队列或主题名称。默认情况下,targetName 解释为队列名称。例如,要连接到队列,FOO.BAR 使用:

sjms2:FOO.BAR

如果需要,可以包括可选 queue: 前缀:

sjms2:queue:FOO.BAR

要连接到一个主题,您必须 包括 主题: 前缀。例如,要连接到主题(rades .Prices), 请使用:

sjms2:topic:Stocks.Prices

您可以使用以下格式将查询选项附加到 URI,?option=value&amp ;option=value&…​

308.2. 组件选项和配置

Simple JMS2 组件支持 15 选项,它们如下所列。

名称描述默认类型

connectionFactory (advanced)

需要 ConnectionFactory 来启用 SjmsComponent。它可以直接设置,也可以设置为 ConnectionResource 的一部分。

 

ConnectionFactory

connectionResource (advanced)

ConnectionResource 是一个接口,它允许对 ConnectionFactory 进行自定义和容器控制。详情请查看可插拔连接资源管理。

 

ConnectionResource

connectionCount (common)

此组件下启动的端点的最大连接数

1

整数

jmsKeyFormatStrategy (advanced)

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了一个开箱即用的实施:default.默认策略将安全汇总点和连字符(. 和 -)。可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

JmsKeyFormatStrategy

transactionCommit Strategy (transaction)

配置要使用的提交策略。Camel 提供了两个开箱即用的实施,即 default 和 batch。

 

TransactionCommit Strategy

destinationCreation Strategy (advanced)

使用自定义 DestinationCreationStrategy。

 

DestinationCreation Strategy

timedTaskManager (advanced)

使用自定义 TimedTaskManager

 

TimedTaskManager

messageCreatedStrategy (advanced)

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

connectionTestOnBorrow (advanced)

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,应测试每个 javax.jms.Connection,然后从池返回(计算启动)。

true

布尔值

connectionUsername (security)

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的用户名。

 

字符串

connectionPassword (security)

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的密码。

 

字符串

connectionClientId (advanced)

在使用默认的 org.apache.camel.component.sjms.jms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的客户端 ID。

 

字符串

connectionMaxWait (advanced)

当使用默认的 org.apache.camel.component.sjms.jms.ConnectionFactoryResource 时,在池被耗尽时,可以阻止 millis 最多等待可用连接。

5000

long

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Simple JMS2 端点使用 URI 语法配置:

sjms2:destinationType:destinationName

使用以下路径和查询参数:

308.2.1. 路径名(2 参数):

名称描述默认类型

destinationType

要使用的目的地种类

队列

字符串

destinationName

required DestinationName 是 JMS 队列或主题名称。默认情况下,targetName 解释为队列名称。

 

字符串

308.2.2. 查询参数(37 参数):

名称描述默认类型

acknowledgementMode (common)

JMS 确认名称之一: SESSION_TRANSACTED、CLIENT_ACKNOWLEDGE、AUTO_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE

AUTO_ ACKNOWLEDGE

SessionAcknowledgement 类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

consumerCount (consumer)

设置用于此端点的使用者监听程序数量。

1

int

durable (consumer)

将主题消费者设置为 durable。

false

布尔值

durableSubscriptionId (consumer)

设置持久主题所需的 durable 订阅 Id。

 

字符串

共享 (消费者)

将消费者设置为共享。

false

布尔值

subscriptionId (consumer)

设置持久或共享主题所需的订阅 Id。

 

字符串

同步 (消费者)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

messageSelector (consumer)

设置 JMS 消息选择器语法。

 

字符串

namedReplyTo (producer)

设置用于 InOut producer 端点的目的地名称的回复。

 

字符串

persistent (producer)

用于启用/禁用消息持久性的标志。

true

布尔值

producerCount (producer)

设置用于此端点的制作者数量。

1

int

ttl (producer)

用于调整生成消息的生存时间值的标志。

-1

long

allowNullBody (producer)

是否允许在没有正文的情况下发送消息。如果此选项为 false,并且消息正文为空,则将引发 JMSException。

true

布尔值

prefillPool (producer)

是否在启动时预先填充制作者连接池,或在需要时创建连接延迟。

true

布尔值

responseTimeOut (producer)

设置在超时外部响应前应等待的时间。

5000

long

asyncStartListener (advanced)

启动路由时是否异步启动使用者消息监听程序。例如,如果 JmsConsumer 无法连接到远程 JMS 代理,则在重试和/或故障转移时可能会阻止它。这将导致 Camel 在启动路由时阻止。通过将此选项设置为 true,您将让路由启动,而 JmsConsumer 使用一个专用线程以异步模式连接到 JMS 代理。如果使用这个选项,那么请注意,如果无法建立连接,则会在 WARN 级别记录异常,并且使用者将无法接收消息;然后,您可以重启要重试的路由。

false

布尔值

asyncStopListener (advanced)

是否在停止路由时异步停止使用者消息监听程序。

false

布尔值

connectionCount (advanced)

此端点可用的连接数上限

 

整数

connectionFactory (advanced)

为端点初始化 connectionFactory,这会优先于组件的 connectionFactory 的优先级(若有)

 

ConnectionFactory

connectionResource (advanced)

初始化端点的连接Resource,其优先于组件的 connectionResource (若有)

 

ConnectionResource

destinationCreationStrategy (advanced)

使用自定义 DestinationCreationStrategy。

 

DestinationCreation Strategy

exceptionListener (advanced)

指定任何底层 JMS 异常通知的 JMS Exception Listener。

 

ExceptionListener

headerFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

includeAllJMSXProperties (advanced)

从 JMS 到 Camel 消息映射时是否包括所有 JMSXxxx 属性。将其设置为 true 将包括 JMSXAppID 和 JMSXUserID 等属性。注:如果您使用自定义 headerFilterStrategy,则这个选项不会应用。

false

布尔值

jmsKeyFormatStrategy (advanced)

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规格.Camel 提供的两个实施,即默认和直通。默认策略将安全汇总点和连字符(. 和 -)。passthrough 策略会保留密钥,即:可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。

 

JmsKeyFormatStrategy

mapJmsMessage (advanced)

指定 Camel 是否应将收到的 JMS 消息自动映射到合适的载荷类型,如 javax.jms.TextMessage 到字符串等。如需了解更多详细信息,请参阅下面映射如何工作的部分。

true

布尔值

messageCreatedStrategy (advanced)

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。

 

MessageCreatedStrategy

errorHandlerLoggingLevel (logging)

允许配置默认错误处理程序日志记录级别,以记录异常。

WARN

LoggingLevel

errorHandlerLogStackTrace (logging)

允许控制是否应该记录堆栈追踪,默认错误处理程序。

true

布尔值

transacted (transaction)

指定是否使用翻译模式

false

布尔值

transactionBatchCount (transaction)

如果在提交事务前对要处理的消息数进行了转换。

-1

int

transactionBatchTimeout (transaction)

为批处理事务设置超时(millis),该值应为 1000 或更高。

5000

long

transactionCommitStrategy (transaction)

设置提交策略。

 

TransactionCommit Strategy

sharedJMSSession (transaction)

指定是否与其他 SJMS 端点共享 JMS 会话。如果您的路由正在访问多个 JMS 提供程序,请关闭。如果您需要对多个 JMS 提供程序的事务,请使用 jms 组件来利用 XA 事务。

true

布尔值

308.3. Spring Boot Auto-Configuration

组件支持 16 个选项,如下所示。

名称描述默认类型

camel.component.sjms2.connection-client-id

在使用默认的 org.apache.camel.component.sjms.jms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的客户端 ID。

 

字符串

camel.component.sjms2.connection-count

此组件下启动的端点的最大连接数

1

整数

camel.component.sjms2.connection-factory

需要 ConnectionFactory 来启用 SjmsComponent。它可以直接设置,也可以设置为 ConnectionResource 的一部分。选项是一个 javax.jms.ConnectionFactory 类型。

 

字符串

camel.component.sjms2.connection-max-wait

当使用默认的 org.apache.camel.component.sjms.jms.ConnectionFactoryResource 时,在池被耗尽时,可以阻止 millis 最多等待可用连接。

5000

Long

camel.component.sjms2.connection-password

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的密码。

 

字符串

camel.component.sjms2.connection-resource

ConnectionResource 是一个接口,它允许对 ConnectionFactory 进行自定义和容器控制。详情请查看可插拔连接资源管理。选项是一个 org.apache.camel.component.sjms.ConnectionResource 类型。

 

字符串

camel.component.sjms2.connection-test-on-borrow

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,应测试每个 javax.jms.Connection,然后从池返回(计算启动)。

true

布尔值

camel.component.sjms2.connection-username

在使用默认的 org.apache.camel.component.sjms.ConnectionFactoryResource 时,创建 javax.jms.Connection 时使用的用户名。

 

字符串

camel.component.sjms2.destination-creation-strategy

使用自定义 DestinationCreationStrategy。选项是一个 org.apache.camel.component.sjms.DestinationCreationStrategy 类型。

 

字符串

camel.component.sjms2.enabled

启用 sjms2 组件

true

布尔值

camel.component.sjms2.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.sjms2.jms-key-format-strategy

用于编码和解码 JMS 密钥的可插拔策略,以便它们符合 JMS 规范。Camel 提供了一个开箱即用的实施:default.默认策略将安全汇总点和连字符(. 和 -)。可用于不小心 JMS 标头键是否包含非法字符的 JMS 代理。您可以自行实施 org.apache.camel.component.jms.JmsKeyFormatStrategy,并使用 # 表示法引用它。选项是一个 org.apache.camel.component.sjms.jms.JmsKeyFormatStrategy type。

 

字符串

camel.component.sjms2.message-created-strategy

要使用给定的 MessageCreatedStrategy,在 Camel 发送 JMS 消息时,将在 Camel 创建新实例 javax.jms.Message 对象时来调用。选项是一个 org.apache.camel.component.sjms.MessageCreatedStrategy type。

 

字符串

camel.component.sjms2.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.sjms2.timed-task-manager

使用自定义 TimedTaskManager。选项是一个 org.apache.camel.component.sjms.taskmanager.TimedTaskManager 类型。

 

字符串

camel.component.sjms2.transaction-commit-strategy

配置要使用的提交策略。Camel 提供了两个开箱即用的实施,即 default 和 batch。选项是一个 org.apache.camel.component.sjms.TransactionCommitStrategy type。

 

字符串

以下是如何将 Sjms2Component 配置为其所需的 ConnectionFactory provider。默认情况下,它将创建一个连接,并使用组件的内部池 API 存储它以确保它可以以线程安全的方式服务会话创建请求。

Sjms2Component component = new Sjms2Component();
component.setConnectionFactory(new ActiveMQConnectionFactory("tcp://localhost:61616"));
getContext().addComponent("sjms2", component);

对于支持持久订阅的 SJMS2 组件,您可以覆盖默认的 ConnectionFactoryResource 实例,并设置 clientId 属性。

ConnectionFactoryResource connectionResource = new ConnectionFactoryResource();
connectionResource.setConnectionFactory(new ActiveMQConnectionFactory("tcp://localhost:61616"));
connectionResource.setClientId("myclient-id");

Sjms2Component component = new Sjms2Component();
component.setConnectionResource(connectionResource);
component.setMaxConnections(1);

308.4. 制作者使用情况

308.4.1. InOnly Producer - (默认)

InOnly producer 是 SJMS2 Producer Endpoint 的默认行为。

from("direct:start")
    .to("sjms2:queue:bar");

308.4.2. InOut Producer

要启用 InOut 行为,请将 exchangePattern 属性附加到 URI。默认情况下,它将为每个使用者使用一个专用的 TemporaryQueue。

from("direct:start")
    .to("sjms2:queue:bar?exchangePattern=InOut");

您可以指定 namedReplyTo,虽然它可以提供更好的监控器点。

from("direct:start")
    .to("sjms2:queue:bar?exchangePattern=InOut&namedReplyTo=my.reply.to.queue");

308.5. 消费者使用

308.5.1. durable Shared Subscription

创建可在一个或多个消费者之间共享的持久订阅。使用 JMS 2.0 兼容连接工厂并指定通用 subscriptionId。然后,将订阅属性 durable 和共享设置为 true。

from("sjms2:topic:foo?consumerCount=3&subscriptionId=bar&durable=true&shared=true")
    .to("mock:result");

from("sjms2:topic:foo?consumerCount=2&subscriptionId=bar&durable=true&shared=true")
    .to("mock:result");

308.5.2. InOnly Consumer - (默认)

InOnly xonsumer 是 SJMS2 Consumer Endpoint 的默认 Exchange 行为。

from("sjms2:queue:bar")
    .to("mock:result");

308.5.3. InOut Consumer

要启用 InOut 行为,请将 exchangePattern 属性附加到 URI。

from("sjms2:queue:in.out.test?exchangePattern=InOut")
    .transform(constant("Bye Camel"));

308.6. 高级使用备注

308.6.1. 可插拔连接资源管理

SJMS2 通过内置连接池提供 JMS 连接资源管理。 http://docs.oracle.com/javaee/5/api/javax/jms/Connection.html这消除了依赖第三方 API 池逻辑的需求。但是,您可能需要使用外部连接资源管理器,如 J2EE 或 OSGi 容器提供的资源管理器。对于此 SJMS2,提供了一个接口,可用于覆盖内部 SJMS2 连接池功能。这通过 ConnectionResource 接口来完成。

Connection Resource 提供了根据需要来浏览和返回连接方法,即用于向 SJMS2 组件提供连接池的合同。如果需要将 SJMS2 与外部连接池管理器集成时,应使用用户。

建议您为标准的 ConnectionFactory 提供程序使用通过 SJMS2 作为原样提供的 ConnectionFactoryResource 实施,或者根据该组件优化的扩展。

以下是将插件的 ConnectionResource 和 ActiveMQ PooledConnectionFactory 搭配使用的示例:

public class AMQConnectionResource implements ConnectionResource {
    private PooledConnectionFactory pcf;

    public AMQConnectionResource(String connectString, int maxConnections) {
        super();
        pcf = new PooledConnectionFactory(connectString);
        pcf.setMaxConnections(maxConnections);
        pcf.start();
    }

    public void stop() {
        pcf.stop();
    }

    @Override
    public Connection borrowConnection() throws Exception {
        Connection answer = pcf.createConnection();
        answer.start();
        return answer;
    }

    @Override
    public Connection borrowConnection(long timeout) throws Exception {
        // SNIPPED...
    }

    @Override
    public void returnConnection(Connection connection) throws Exception {
        // Do nothing since there isn't a way to return a Connection
        // to the instance of PooledConnectionFactory
        log.info("Connection returned");
    }
}

然后,将 ConnectionResource 传递到 Sjms2Component

CamelContext camelContext = new DefaultCamelContext();
AMQConnectionResource pool = new AMQConnectionResource("tcp://localhost:33333", 1);
Sjms2Component component = new Sjms2Component();
component.setConnectionResource(pool);
camelContext.addComponent("sjms2", component);

要查看其使用的完整示例,请参阅 ConnectionResourceIT

308.6.2. session、Consumer 和 Producer Pooling and caching Management

即将推出 …​

308.6.3. 批处理消息支持

Sjms2Producer 支持通过创建封装列表 的 Exchange 发布一系列消息。此 Sjms2Producer 将迭代列表的内容并单独发布每条消息。

如果出现批处理消息,则需要设置每个消息唯一的标头,您可以使用 SJMS2 BatchMessage 类。当 Sjms2Producer 遇到 BatchMessage 列表时,它将迭代每个 BatchMessage 并发布包括的有效负载和标头。

以下是使用 BatchMessage 类的示例。首先,我们创建一个 BatchMessage 列表:

List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
    String body = "Hello World " + i;
    BatchMessage<String> message = new BatchMessage<String>(body, null);
    messages.add(message);
}

然后发布列表:

template.sendBody("sjms2:queue:batch.queue", messages);

308.6.4. 可自定义的事务委员会策略(仅限本地 JMS 事务)

SJMS2 为开发人员提供了一种使用 TransactionCommitStrategy 接口来创建自定义和可插入事务策略的方法。这允许用户定义 SessionTransactionSynchronization 将用来决定何时提交会话的唯一环境。用法的示例是 BatchTransactionCommitStrategy,将在下一节中详细阐述。

308.6.5. transacted Batch Consumers & Producers

SJMS2 组件旨在支持对 Producer 和 Consumer 端点上的本地 JMS 事务的批处理。它们的处理方式各不相同。

SJMS2 消费者端点是一种简单的实施,可以在将 X 消息提交至关联的会话之前处理 X 消息。要在使用者上启用批处理事务,首先将 transacted 参数设置为 true,然后添加 transactionBatchCount 并将其设置为大于 0 的值。例如,以下配置将每 10 个消息提交 Session:

sjms2:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10

如果在处理消费者端点上的批处理过程中发生异常,则会调用 Session rollback,从而导致消息重放给下一个可用的消费者。该计数器还被重置为相关会话的 BatchTransactionCommitStrategy 的 0。用户负责确保其批处理消息处理器中的 hook 监视 JMSRedelivered 标头设置为 true 的消息。这是指示消息在某一时间点回滚,并且应进行成功处理验证。

翻译的批处理消费者还附带的内部计时器实例,在消息之间等待默认时间(5000ms),然后提交会话上的开放事务。默认值为 5000ms (最小 1000ms)应该足以满足大多数用例,但是如果需要进一步调整,只需要设置 transactionBatchTimeout 参数。

sjms2:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10&transactionBatchTimeout=2000

可以接受的最小值是 1000ms,因为上下文切换的数量可能会导致不必要的性能影响,而不获得好处。

生产者端点处理方式有不同。在每条消息传送给 Exchange 的目标后,生产者都关闭,不再引用该消息。为了让所有消息可用于重新传送,您只需在发布 BatchMessages 的 Producer Endpoints 上启用事务。事务将在交换结束时提交,其中包含批处理列表中的所有消息。不需要配置任何其他操作。例如:

List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
    String body = "Hello World " + i;
    BatchMessage<String> message = new BatchMessage<String>(body, null);
    messages.add(message);
}

现在发布启用了事务的列表:

template.sendBody("sjms2:queue:batch.queue?transacted=true", messages);

308.7. 其他备注

308.7.1. Message Header Format

SJMS2 组件使用相同的标头格式策略,该策略在 Camel JMS 组件中使用。此可插入策略可确保通过线发送的消息符合 JMS Message spec。

对于 exchange.in.header,以下规则适用于标头键:

  • JMSJMSX 开头的密钥被保留。
  • Exchange.in.headers 键必须是文字,且所有有效的 Java 标识符(不要在键名称中使用点)。
  • 在使用 JMS 消息时,Camel 替换了点和连字符以及反向。

    • 在 Camel 使用消息时,由 DOT 和反向替换替换。
    • 在 Camel 使用消息时,由 HYPHEN 和反向替换替代。
      另请参阅 jmsKeyFormatStrategy 选项,它允许使用您自己的自定义策略格式化密钥。

对于 exchange.in.header,以下规则适用于标头值:

308.7.2. 消息内容

要通过线传递内容,我们必须确保正在向 JMS 消息规范发送的消息正文。因此,生成的一切都必须是原语或其计数器对象(如 IntegerLongCharacter)。类型、StringCharSequenceDate、bigD ecimal 和 BigInteger 都被转换为 String () 表示。所有其他类型被丢弃。

308.7.3. 集群

在集群环境中使用 InOut 和 SJMS2 时,您必须使用 TemporaryQueue 目的地,或使用每个 InOut producer 端点对目的地进行唯一命名回复。消息关联由端点处理,而不是代理中的消息代理。InOut Producer Endpoint 使用由 Message JMSCorrelationID 缓存的 Java Concurrency Exchangers。这提高了 nice 性能,同时减少代理的开销,因为所有消息都会按照感兴趣的消费者生成的顺序从目的地使用。

目前唯一的关联策略是使用 JMSCorrelationIdInOut Consumer 使用此策略并确保所有对包含的 JMSReplyTo 目的地的响应消息也都有从请求中复制的 JMSCorrelationId

308.8. 事务支持

SJMS2 目前仅支持使用内部 JMS 事务。不支持 Camel 事务处理器或 Java 事务 API (JTA)。

308.8.1. Springless Mean 是否无法使用 Spring?

根本不是.以下是使用 Spring DSL 的 SJMS2 组件示例:

<route
    id="inout.named.reply.to.producer.route">
    <from
        uri="direct:invoke.named.reply.to.queue" />
    <to
        uri="sjms2:queue:named.reply.to.queue?namedReplyTo=my.response.queue&amp;exchangePattern=InOut" />
</route>

Spring JMS API 的依赖 Spring JMS API 解放出来。正从头开始开发一个新的 JMS 客户端 API,以支持 SJMS2。

第 309 章 Slack 组件

作为 Camel 版本 2.16 可用

slack 组件允许您连接到 Slack 实例,并通过预建立的 Slack 传入的 Webhook 来提供消息正文中包含的消息。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-slack</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

309.1. URI 格式

将信息发送到频道。

slack:#channel[?options]

将直接消息发送到 slackuser。

slack:@username[?options]

309.2. 选项

Slack 组件支持 2 个选项,它们如下所列。

名称描述默认类型

webhookUrl (common)

传入的 webhook URL

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Slack 端点使用 URI 语法进行配置:

slack:channel

使用以下路径和查询参数:

309.2.1. 路径名(1 参数):

名称描述默认类型

channel

需要 频道名称(RHEV #name)或 slackuser(syntax userName)直接向用户发送邮件。

 

字符串

309.2.2. 查询参数(26 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

maxResults (consumer)

轮询的最大结果

10

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

serverUrl (consumer)

Slack 实例的服务器 URL

https://slack.com

字符串

令牌 (使用者)

要使用的令牌

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

iconEmoji (producer)

使用 Slack emoji 作为 avatar

 

字符串

iconUrl (producer)

向频道或用户发送消息时,组件将使用的 avatar。

 

字符串

username (producer)

这是 bot 在向频道或用户发送消息时具有的用户名。

 

字符串

webhookUrl (producer)

传入的 webhook URL

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

309.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.slack.enabled

启用 slack 组件

true

布尔值

camel.component.slack.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.slack.webhook-url

传入的 webhook URL

 

字符串

309.4. SlackComponent

带有 XML 的 SlackComponent 必须配置为 Spring 或 Blueprint bean,其中包含集成作为参数的传入 webhook url。

<bean id="slack" class="org.apache.camel.component.slack.SlackComponent">
    <property name="webhookUrl" value="https://hooks.slack.com/services/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"/>
</bean>

对于 Java,您可以使用 Java 代码配置。

309.5. 示例

带有 Blueprint 的 CamelContext 如下:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">

    <bean id="slack" class="org.apache.camel.component.slack.SlackComponent">
        <property name="webhookUrl" value="https://hooks.slack.com/services/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"/>
    </bean>

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <from uri="direct:test"/>
            <to uri="slack:#channel?iconEmoji=:camel:&amp;username=CamelTest"/>
        </route>
    </camelContext>

</blueprint>

309.6. 消费者

也可以将消费者用于频道中的信息

from("slack://general?token=RAW(<YOUR_TOKEN>)&maxResults=1")
    .to("mock:result");

这样,您可以从常规频道获得最后一条信息。使用者将跟踪所消耗的最后消息的时间戳,下一次轮询将从该时间戳检查。

309.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 310 章 SMPP 组件

可作为 Camel 版本 2.2 提供

此组件通过 SMPP 协议访问 SMSC (Short Message Service Center),以发送和接收 SMS。JSMPP 库用于协议实施。

Camel 组件目前作为 ESME (外部的消息传递实体)运行,而不是作为 SMSC 本身运行。

从*Camel 2.9* 开始,您还可执行 replaceSm、QuerySm、SubmitMulti、CancelSm 和 DataSm。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-smpp</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

310.1. SMS 限制

SMS 不是可靠或安全。  需要可靠且安全的交付的用户可能想考虑使用 XMPP 或 SIP 组件,以及支持所选协议的智能手机应用程序。

  • 可靠性:虽然 SMPP 标准提供了一系列反馈机制来指示错误,但未传送和确认发送,对移动网络来说并不常见,以隐藏或模拟这些响应。  例如,有些网络会自动为每个消息发送发送确认,即使目标编号无效或未切换。  如果某些网络认为有垃圾邮件的丢弃消息,则某些网络静默丢弃消息。  网络中的垃圾邮件检测规则可能会非常入侵,有时每天来自单一发送方的 100 条消息可能被视为垃圾邮件。
  • 安全性:对来自 radio tower 的最后跃点进行基本加密,向下到接收方。  在网络的任何其他部分中不会加密或验证 SMS 消息。  些运营商允许零售专卖店或致电 Centres,浏览客户的 SMS 消息。  邮件发送者身份很容易被忽略。  在双因素验证方案和其他目的中,规范人员甚至是移动电话行业本身也很谨慎。

虽然 Camel 组件使将消息发送到 SMS 网络变得更加容易,但无法对这些问题提供简单的解决方案。

310.2. 数据编码、字母和国际字符集

数据编码和字母顺序可以基于每消息进行指定。  可以为端点指定默认值。  理解这些选项之间的关系和设置了多个值时组件的行为方式非常重要。

数据编码是 SMPP wire 格式的 8 位字段。

alphabet 对应于数据编码字段的 0-3 位。  对于某些类型的消息,使用消息类(通过设置数据编码字段的位 5),数据编码字段的较低两个位不解释为 alphabet,只有第 2 位和第 3 位影响 alphabet。

另外,当前 JSMPP 库的版本只能显示支持位 2 和 3,假定位 0 和 1 用于消息类。  这就是为什么 JSMPP 中的 Alphabet 类不支持值 3 (二进制 0011),它代表 ISO-8859-1。

虽然 JSMPP 提供了消息类参数表示,但 Camel 组件目前并不提供在 data coding 字段中手动设置对应位的方法。

在传出消息中设置 data coding 字段时,Camel 组件将考虑以下值并使用它的第一个值:

  • 在标头中指定的数据编码
  • 在标头中指定的 alphabet
  • 端点配置中指定的数据编码(URI 参数)

旧版本 Camel 对国际字符集的支持有错误。  此功能仅在单个编码用于所有消息时发挥作用,并且在用户想要逐个消息进行改变时非常有用。  需要此工作的用户应该确保其版本的 Camel 包括针对 

JIRA issues Macro:com.atlassian.sal.api.net.ResponseStatusException: Unexpected 响应。状态代码: 404

.

除了试图向 SMSC 发送数据编码值外,Camel 组件还会尝试分析消息正文,将其转换为 Java String (Unicode),并把它转换为对应的 alphabet 在决定在字节数组中使用的字节阵列时,Camel SMPP 组件不会考虑使用数据编码值(header 或配置),它只考虑在指定的顺序中的字节阵列。

如果 String 中的一些字符不能以所选字母代表,则它们可能会被问号(?)符号替代。  API 用户可能需要考虑检查其消息正文是否可以转换为 ISO-8859-1,然后再将其传递至组件,如果不是,请设置 alphabet 标头来请求 UCS-2 编码。  如果根本没有指定 alphabet 和数据编码选项,则组件可能会尝试检测所需的编码,并为您设置数据编码。

alphabet 代码列表在 SMPP 规范 v3.4 节 5.2.19 节中指定。  SMPP 规范的一个显著限制是,明确请求使用 GSM 3.38 (7 位)字符集没有字母代码。  为 alphabet 选择 0 值选择 SMSC 默认 alphabet,这通常意味着 GSM 3.38,但不保证。  SMPP 网关 Nexmo 实际上允许使用控制面板选项 将默认映射到任何其他字符集。建议用户与 SMSC 运算符进行检查,以确认使用哪个字符集作为默认值。

310.3. 消息分割和节流

将消息正文从 String 转换为字节阵列后,Camel 组件还负责将消息拆分为部分(在 140 字节 SMS 大小限制中),然后再将其传递到 JSMPP。  这是自动完成的。

如果使用 GSM 3.38 alphabet,该组件会将多达 160 个字符打包成 140 字节消息正文。  如果使用 8 位字符集(例如,用于 west Europe 的 ISO-8859-1),则 140 个字符将在 140 字节消息正文中允许。  如果使用 16 位 UCS-2 编码,则每个 140 字节消息中只有 70 个字符。

某些 SMSC 提供程序实施节流规则。  已分割的消息的每个部分可以通过提供商的节流机制单独计算。  在将 SMPP 路由的节流消息发送到 SMSC 之前,Camel Throttler 组件很有用。

310.4. URI 格式

smpp://[username@]hostname[:port][?options]
smpps://[username@]hostname[:port][?options]

如果没有提供 用户名,Camel 将提供默认值 smppclient
如果没有提供 端口号,Camel 将提供默认值 2775
Camel 2.3: 如果协议名称为 "smpps",则 camel-smpp 尝试使用 SSLSocket 来初始化到服务器的连接。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

310.5. URI 选项

SMPP 组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

将共享的 SmppConfiguration 用作配置:

 

SmppConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

SMPP 端点使用 URI 语法配置:

smpp:host:port

使用以下路径和查询参数:

310.5.1. 路径名(2 参数):

名称描述默认类型

主机

要使用的 SMSC 服务器的主机名。

localhost

字符串

port

要使用的 SMSC 服务器的端口号。

2775

整数

310.5.2. 查询参数(38 参数):

名称描述默认类型

initialReconnectDelay (common)

在连接丢失后,定义消费者/生产者尝试重新连接 SMSC 后的初始延迟(毫秒)。

5000

long

maxReconnect (common)

如果 SMSC 返回负绑定响应,定义重新连接到 SMSC 的最大尝试次数

2147483647

int

reconnectDelay (common)

如果与 SMSC 的连接丢失,且之前没有成功,则定义了重新连接尝试间隔(毫秒)。

5000

long

splittingPolicy (common)

您可以为处理长消息指定一个策略:ALLOW - 默认,每个消息 TRUNCATE - 较长的消息会分割为 140 字节,并且只有第一个片段才会发送到 SMSC。某些载体会丢弃后续的片段,从而减少了对 SMPP 连接发送部分永不发送的消息的负载。REJECT - 如果需要分割消息,则通过 SMPP NegativeResponseException 被拒绝,以及代码表示消息的原因太长。

ALLOW

SmppSplittingPolicy

systemType (common)

这个参数用于对绑定到 SMSC (max. 13 个字符)的 ESME (外部消息实体)的类型进行分类。

cp

字符串

addressRange (consumer)

您可以在 SMPP 3.4 规范的 5.2.7 节中定义的 SmppConsumer 指定地址范围。SmppConsumer 将仅接收来自 SMSC 的消息,该地址以这个范围内的地址(MSISDN 或 IP 地址)为目标。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

destAddr (producer)

定义目标 SME 地址。对于移动终止的消息,这是接收者 MS 的目录号。仅适用于 SubmitSm、SubmitMulti、CancelSm 和 DataSm。

1717

字符串

destAddrNpi (producer)

定义 SME 目标地址参数中使用的数字(TON)类型。仅适用于 SubmitSm、SubmitMulti、CancelSm 和 DataSm。以下 NPI 值被定义:0: Unknown 1: ISDN (E163/E164) 2: Data (X.121) 3: Telex (F.69) 6: Land Mobile (E.212) 8: National 9: Private 10: ERMES 13: Internet (IP) 18: WAP Client Id (至 WAP Forum 定义)

 

byte

destAddrTon (producer)

定义 SME 目标地址参数中使用的数字(TON)类型。仅适用于 SubmitSm、SubmitMulti、CancelSm 和 DataSm。以下 TON 值被定义:0: Unknown 1: International 2: National 3: Network Specific 4: Subscriber Number 5: Alphanumeric 6: Abbreviated

 

byte

lazySessionCreation (producer)

当启动 Camel 制作者时,如果 SMSC 不可用,则会话可以被创建以避免异常。Camel 将检查第一个交换的消息标题 'CamelSmppSystemId' 和 'CamelSmppPassword'。如果存在,Camel 将使用这些数据连接到 SMSC。

false

布尔值

numberingPlanIndicator (producer)

定义 SME 中使用的数字计划指示符(NPI)。以下 NPI 值被定义:0: Unknown 1: ISDN (E163/E164) 2: Data (X.121) 3: Telex (F.69) 6: Land Mobile (E.212) 8: National 9: Private 10: ERMES 13: Internet (IP) 18: WAP Client Id (至 WAP Forum 定义)

 

byte

priorityFlag (producer)

允许原始 SME 为短消息分配优先级级别。仅适用于 SubmitSm 和 SubmitMulti.支持四个级别:0 级别 0 (最低)优先级 1:级别 1 优先级 2:级别 2 优先级 3:级别 3 (最高)优先级

 

byte

protocolId (producer)

协议 ID

 

byte

registeredDelivery (producer)

用于请求 SMSC 收据和/或 SME 发起的确认信息。定义了以下值:0: No SMSC 交付接收请求。1:SMSC 交付收据请求,最终交付结果是成功或失败。2:发送结果请求的交付结果是交付失败的位置。

 

byte

replaceIfPresentFlag (producer)

用于请求 SMSC 来替换之前提交的消息,该消息仍在进行等待发送。SMSC 将替换提供的源地址、目标地址和服务类型的现有消息,与新消息中的相同字段匹配。以下替换 if present 标记值如下: 0: Don't replace 1: replace

 

byte

serviceType (producer)

服务类型参数可用于指示与消息关联的 SMS Application 服务。以下通用 service_types 被定义:CMT: Cellular Messaging CPT: Cellular Paging VMN: Voice Mail Notification VMA: Voice Mail Alerting WAP: Wireless Application Protocol USSD: Unstructured Supplementary Services Data

CMT

字符串

sourceAddr (producer)

定义源自此消息的 SME (Short Message Entity)地址。

1616

字符串

sourceAddrNpi (producer)

定义 SME originator 地址参数中使用的数字计划指示符(NPI)。以下 NPI 值被定义:0: Unknown 1: ISDN (E163/E164) 2: Data (X.121) 3: Telex (F.69) 6: Land Mobile (E.212) 8: National 9: Private 10: ERMES 13: Internet (IP) 18: WAP Client Id (至 WAP Forum 定义)

 

byte

sourceAddrTon (producer)

定义在 SME originator 地址参数中使用的数字类型(TON)。以下 TON 值被定义:0: Unknown 1: International 2: National 3: Network Specific 4: Subscriber Number 5: Alphanumeric 6: Abbreviated

 

byte

typeOfNumber (producer)

定义要在 SME 中使用的数字类型(TON)。以下 TON 值被定义:0: Unknown 1: International 2: National 3: Network Specific 4: Subscriber Number 5: Alphanumeric 6: Abbreviated

 

byte

enquireLinkTimer (advanced)

定义信心检查之间以毫秒为单位的时间间隔。信心检查用于测试 ESME 和 SMSC 之间的通信路径。

5000

整数

sessionStateListener (advanced)

您可以参考 registry 中的 org.jsmpp.session.SessionStateListener,以在会话状态发生变化时接收回调。

 

SessionStateListener

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

transactionTimer (advanced)

定义事务后允许的最长期限,之后 SMPP 实体可能假定会话不再活跃。这个计时器可能会在通信 SMPP 实体(如 SMSC 或 ESME)上处于活跃状态。

10000

整数

alphabet (codec)

根据 SMPP 3.4 规范定义数据编码,第 5.2.19. 0: SMSC 默认 Alphabet 4: 8 位 Alphabet 8: UCS2 Alphabet

 

byte

dataCoding (codec)

根据 SMPP 3.4 规范定义数据编码,第 5.2.19 节。数据编码示例有:0: SMSC 默认 Alphabet 3:拉号 1 (ISO-8859-1) 4: 10et unspecified (8-bit binary) 8: UCS2 (ISO/IEC-10646) 13: Extended Kanji JIS (X 0212-1990)

 

byte

encoding (codec)

定义简短消息用户数据的编码方案。只适用于 SubmitSm、replaceSm 和 SubmitMulti。

ISO-8859-1

字符串

httpProxyHost (proxy)

如果您需要通过 HTTP 代理传输 SMPP,请将此属性设置为 HTTP 代理的主机名或 ip 地址。

 

字符串

httpProxyPassword (proxy)

如果您的 HTTP 代理需要基本身份验证,请将此属性设置为 HTTP 代理所需的密码。

 

字符串

httpProxyPort (proxy)

如果您需要通过 HTTP 代理隧道 SMPP,请将此属性设置为 HTTP 代理的端口。

3128

整数

httpProxyUsername (proxy)

如果您的 HTTP 代理需要基本身份验证,请将此属性设置为 HTTP 代理所需的用户名。

 

字符串

proxyHeaders (proxy)

这些标头将在建立连接时传递给代理服务器。

 

map

密码 (安全)

用于连接 SMSC 服务器的密码。

 

字符串

systemId (security)

用于连接到 SMSC 服务器的系统 ID (用户名)。

smppclient

字符串

usingSSL (security)

是否使用带有 smpps 协议的 SSL

false

布尔值

310.6. Spring Boot Auto-Configuration

组件支持 38 选项,它们如下所列。

名称描述默认类型

camel.component.smpp.configuration.address-range

您可以在 SMPP 3.4 规范的 5.2.7 节中定义的 SmppConsumer 指定地址范围。SmppConsumer 将仅接收来自 SMSC 的消息,该地址以这个范围内的地址(MSISDN 或 IP 地址)为目标。

 

字符串

camel.component.smpp.configuration.alphabet

根据 SMPP 3.4 规范定义数据编码,第 5.2.19. 0: SMSC 默认 Alphabet 4: 8 位 Alphabet 8: UCS2 Alphabet

 

Byte

camel.component.smpp.configuration.data-coding

根据 SMPP 3.4 规范定义数据编码,第 5.2.19 节。数据编码示例有:0: SMSC 默认 Alphabet 3:拉号 1 (ISO-8859-1) 4: 10et unspecified (8-bit binary) 8: UCS2 (ISO/IEC-10646) 13: Extended Kanji JIS (X 0212-1990)

 

Byte

camel.component.smpp.configuration.dest-addr

定义目标 SME 地址。对于移动终止的消息,这是接收者 MS 的目录号。仅适用于 SubmitSm、SubmitMulti、CancelSm 和 DataSm。

1717

字符串

camel.component.smpp.configuration.dest-addr-npi

定义 SME 目标地址参数中使用的数字(TON)类型。仅适用于 SubmitSm、SubmitMulti、CancelSm 和 DataSm。以下 NPI 值被定义:0: Unknown 1: ISDN (E163/E164) 2: Data (X.121) 3: Telex (F.69) 6: Land Mobile (E.212) 8: National 9: Private 10: ERMES 13: Internet (IP) 18: WAP Client Id (至 WAP Forum 定义)

 

Byte

camel.component.smpp.configuration.dest-addr-ton

定义 SME 目标地址参数中使用的数字(TON)类型。仅适用于 SubmitSm、SubmitMulti、CancelSm 和 DataSm。以下 TON 值被定义:0: Unknown 1: International 2: National 3: Network Specific 4: Subscriber Number 5: Alphanumeric 6: Abbreviated

 

Byte

camel.component.smpp.configuration.encoding

定义简短消息用户数据的编码方案。只适用于 SubmitSm、replaceSm 和 SubmitMulti。

ISO-8859-1

字符串

camel.component.smpp.configuration.enquire-link-timer

定义信心检查之间以毫秒为单位的时间间隔。信心检查用于测试 ESME 和 SMSC 之间的通信路径。

5000

整数

camel.component.smpp.configuration.host

要使用的 SMSC 服务器的主机名。

localhost

字符串

camel.component.smpp.configuration.http-proxy-host

如果您需要通过 HTTP 代理传输 SMPP,请将此属性设置为 HTTP 代理的主机名或 ip 地址。

 

字符串

camel.component.smpp.configuration.http-proxy-password

如果您的 HTTP 代理需要基本身份验证,请将此属性设置为 HTTP 代理所需的密码。

 

字符串

camel.component.smpp.configuration.http-proxy-port

如果您需要通过 HTTP 代理隧道 SMPP,请将此属性设置为 HTTP 代理的端口。

3128

整数

camel.component.smpp.configuration.http-proxy-username

如果您的 HTTP 代理需要基本身份验证,请将此属性设置为 HTTP 代理所需的用户名。

 

字符串

camel.component.smpp.configuration.initial-reconnect-delay

在连接丢失后,定义消费者/生产者尝试重新连接 SMSC 后的初始延迟(毫秒)。

5000

Long

camel.component.smpp.configuration.lazy-session-creation

当启动 Camel 制作者时,如果 SMSC 不可用,则会话可以被创建以避免异常。Camel 将检查第一个交换的消息标题 'CamelSmppSystemId' 和 'CamelSmppPassword'。如果存在,Camel 将使用这些数据连接到 SMSC。

false

布尔值

camel.component.smpp.configuration.max-reconnect

如果 SMSC 返回负绑定响应,定义重新连接到 SMSC 的最大尝试次数

2147483647

整数

camel.component.smpp.configuration.numbering-plan-indicator

定义 SME 中使用的数字计划指示符(NPI)。以下 NPI 值被定义:0: Unknown 1: ISDN (E163/E164) 2: Data (X.121) 3: Telex (F.69) 6: Land Mobile (E.212) 8: National 9: Private 10: ERMES 13: Internet (IP) 18: WAP Client Id (至 WAP Forum 定义)

 

Byte

camel.component.smpp.configuration.password

用于连接 SMSC 服务器的密码。

 

字符串

camel.component.smpp.configuration.port

要使用的 SMSC 服务器的端口号。

2775

整数

camel.component.smpp.configuration.priority-flag

允许原始 SME 为短消息分配优先级级别。仅适用于 SubmitSm 和 SubmitMulti.支持四个级别:0 级别 0 (最低)优先级 1:级别 1 优先级 2:级别 2 优先级 3:级别 3 (最高)优先级

 

Byte

camel.component.smpp.configuration.protocol-id

协议 ID

 

Byte

camel.component.smpp.configuration.proxy-headers

这些标头将在建立连接时传递给代理服务器。

 

map

camel.component.smpp.configuration.reconnect-delay

如果与 SMSC 的连接丢失,且之前没有成功,则定义了重新连接尝试间隔(毫秒)。

5000

Long

camel.component.smpp.configuration.registered-delivery

用于请求 SMSC 收据和/或 SME 发起的确认信息。定义了以下值:0: No SMSC 交付接收请求。1:SMSC 交付收据请求,最终交付结果是成功或失败。2:发送结果请求的交付结果是交付失败的位置。

 

Byte

camel.component.smpp.configuration.replace-if-present-flag

用于请求 SMSC 来替换之前提交的消息,该消息仍在进行等待发送。SMSC 将替换提供的源地址、目标地址和服务类型的现有消息,与新消息中的相同字段匹配。以下替换 if present 标记值如下: 0: Don't replace 1: replace

 

Byte

camel.component.smpp.configuration.service-type

服务类型参数可用于指示与消息关联的 SMS Application 服务。以下通用 service_types 被定义:CMT: Cellular Messaging CPT: Cellular Paging VMN: Voice Mail Notification VMA: Voice Mail Alerting WAP: Wireless Application Protocol USSD: Unstructured Supplementary Services Data

CMT

字符串

camel.component.smpp.configuration.session-state-listener

您可以参考 registry 中的 org.jsmpp.session.SessionStateListener,以在会话状态发生变化时接收回调。

 

SessionStateListener

camel.component.smpp.configuration.source-addr

定义源自此消息的 SME (Short Message Entity)地址。

1616

字符串

camel.component.smpp.configuration.source-addr-npi

定义 SME originator 地址参数中使用的数字计划指示符(NPI)。以下 NPI 值被定义:0: Unknown 1: ISDN (E163/E164) 2: Data (X.121) 3: Telex (F.69) 6: Land Mobile (E.212) 8: National 9: Private 10: ERMES 13: Internet (IP) 18: WAP Client Id (至 WAP Forum 定义)

 

Byte

camel.component.smpp.configuration.source-addr-ton

定义在 SME originator 地址参数中使用的数字类型(TON)。以下 TON 值被定义:0: Unknown 1: International 2: National 3: Network Specific 4: Subscriber Number 5: Alphanumeric 6: Abbreviated

 

Byte

camel.component.smpp.configuration.splitting-policy

您可以为处理长消息指定一个策略:ALLOW - 默认,每个消息 TRUNCATE - 较长的消息会分割为 140 字节,并且只有第一个片段才会发送到 SMSC。某些载体会丢弃后续的片段,从而减少了对 SMPP 连接发送部分永不发送的消息的负载。REJECT - 如果需要分割消息,则通过 SMPP NegativeResponseException 被拒绝,以及代码表示消息的原因太长。

 

SmppSplittingPolicy

camel.component.smpp.configuration.system-id

用于连接到 SMSC 服务器的系统 ID (用户名)。

smppclient

字符串

camel.component.smpp.configuration.system-type

这个参数用于对绑定到 SMSC (max. 13 个字符)的 ESME (外部消息实体)的类型进行分类。

cp

字符串

camel.component.smpp.configuration.transaction-timer

定义事务后允许的最长期限,之后 SMPP 实体可能假定会话不再活跃。这个计时器可能会在通信 SMPP 实体(如 SMSC 或 ESME)上处于活跃状态。

10000

整数

camel.component.smpp.configuration.type-of-number

定义要在 SME 中使用的数字类型(TON)。以下 TON 值被定义:0: Unknown 1: International 2: National 3: Network Specific 4: Subscriber Number 5: Alphanumeric 6: Abbreviated

 

Byte

camel.component.smpp.configuration.using-s-s-l

是否使用带有 smpps 协议的 SSL

false

布尔值

camel.component.smpp.enabled

启用 smpp 组件

true

布尔值

camel.component.smpp.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

您可以像这样一样多地使用这些选项。

smpp://smppclient@localhost:2775?password=password&enquireLinkTimer=3000&transactionTimer=5000&systemType=consumer

310.7. 生产者消息标头

以下消息标头可用于影响 SMPP producer 的行为

标头类型描述

CamelSmppDestAddr

列出/字符串

仅适用于 SubmitSm,SubmitMulti, CancelSm 和 DataSm 定义目标 SME 地址。对于移动终止的消息,这是接收者 MS 的目录号。是 SubmitMulti 和 String> 的 List < String >。

CamelSmppDestAddrTon

Byte

仅适用于 SubmitSm,SubmitMulti, CancelSm 和 DataSm 定义要在 SME 目标地址参数中使用的数字(TON)类型。使用以上定义的 sourceAddrTon URI 选项值。

CamelSmppDestAddrNpi

Byte

仅适用于 SubmitSm,SubmitMulti, CancelSm 和 DataSm 定义要在 SME 目标地址参数中使用的数字计划指示符(NPI)。使用以上定义的 URI 选项 sourceAddrNpi 值。

CamelSmppSourceAddr

字符串

定义源自此消息的 SME (Short Message Entity)地址。

CamelSmppSourceAddrTon

Byte

定义在 SME originator 地址参数中使用的数字类型(TON)。使用以上定义的 sourceAddrTon URI 选项值。

CamelSmppSourceAddrNpi

Byte

定义 SME originator 地址参数中使用的数字计划指示符(NPI)。使用以上定义的 URI 选项 sourceAddrNpi 值。

CamelSmppServiceType

字符串

服务类型参数可用于指示与消息关联的 SMS Application 服务。使用上面的 URI 选项 serviceType 设置。

CamelSmppRegisteredDelivery

Byte

仅提交 Sm、替换Sm、SubmitMulti 和 DataSm Is 用来请求 SMSC 交付收据和/或 SME 发起的确认信息。使用上面 注册的 URI 选项。

CamelSmppPriorityFlag

Byte

只有 SubmitSm 和 SubmitMulti 允许原始 SME 为 短消息分配优先级级别。使用上面的 URI 选项 优先级标记 设置。

CamelSmppScheduleDeliveryTime

Date

仅 SubmitSm,SubmitMulti 和 replaceSm This 参数指定应首次尝试消息传送的计划时间。它定义从当前的 SMSC 时间传送此消息将试图通过 SMSC 进行尝试时的绝对日期和时间或相对时间。它可以以绝对时间格式或相对时间格式指定。时间格式的编码在 smpp 规格 v3.4 一章中指定。

CamelSmppValidityPeriod

字符串/日期

仅适用于 SubmitSm,SubmitMulti 和 replaceSm 有效期 period 参数表示 SMSC 过期时间,如果不传送到该目的地,消息应被丢弃。如果它作为 日期 提供,它将解释为绝对时间。Camel 2.9.1 代表: 如果以绝对时间格式定义,或者相对时间格式,如果您以 smpp 规格 v3 章节 7.1.1 的形式指定,则它以绝对时间格式或相对时间格式定义。

CamelSmppReplaceIfPresentFlag

Byte

只适用于 SubmitSm 和 SubmitMulti The replace if present 标记参数来请求 SMSC 替换之前提交的消息,该消息仍为待处理的交付。SMSC 将替换提供的源地址、目标地址和服务类型的现有消息,与新消息中的相同字段匹配。定义了以下值:0、Don't replace 和 1, 替换

CamelSmppAlphabet / CamelSmppDataCoding

Byte

Camel 2.5 For SubmitSm,SubmitMulti and replaceSm (至 Camel 2.9 )使用 CamelSmppDataCoding 而不是 CamelSmppAlphabet。) 根据 SMPP 3.4 规范的数据编码,第 5.2.19 节。使用上面的 URI 选项 alphabet 设置。

CamelSmppOptionalParameters

Map<String, String>

弃用并将在 Camel 2.13.0/3.0.0 中删除,
Camel 2.10.5 和 2.11.1 将于 SubmitSm, SubmitSm, SubmitMulti 和 DataSm
(可选参数)发送由 SMSC 发回。

CamelSmppOptionalParameter

map<Short, Object>

Camel 2.10.7 和 2.11.2 截止,仅适用于 SubmitSm,SubmitMulti 和 DataSm The 可选参数发送给 SMSC。该值使用以下方法转换: stringorg.jsmpp.bean. optionalParameter.COctetString,byte[]org.jsmpp.bean. OptionalParameter.OctetString Byteorg.jsmpp.bean.optionalParameter.Byte,Integerorg.jsmpp.bean.Int.Int, Byte → org.jsmpp.bean.Int shortorg.jsmpp.bean. optionalParameter.Short,nullorg.jsmpp.bean. OptionalParameter.Null

CamelSmppEncoding

字符串

Camel 2.14.1 和 Camel 2.15.0截止日期为 SubmitSm,SubmitMulti 和 DataSm*。  指定消息正文中字节的编码(字符集名称)。  如果消息正文是一个字符串,则这不相关,因为 Java Strings 始终为 Unicode。  如果正文是一个字节阵列,则可以使用此标头来指示它是 ISO-8859-1 或某个其他值。  默认值由端点配置参数 编码指定

CamelSmppSplittingPolicy

字符串

Camel 2.14.1 和 Camel 2.15.0截止日期为 SubmitSm,SubmitMulti 和 DataSm*。  指定此交换的消息分割策略。  端点配置参数 split Policy中描述了可能的值

SMPP producer 使用以下消息标头来设置来自消息标头中 SMSC 的响应

标头类型描述

CamelSmppId

list<String&gt; /String

用于识别提交的简短消息的 id,供以后使用。从 Camel 2.9.0 :如果 replaceSm、QuerySm、CancelSm 和 DataSm,此标题 vaule 是一个 String。如果是 SubmitSm 或 SubmitMultiSm,则此标题 vaule 是一个 List<String>

CamelSmppSentMessageCount

整数

从 Camel 2.9 开始,仅提交提交Sm 并提交 已发送的消息总数。

CamelSmppError

map<String, List<Map<String, Object>>

从 Camel 2.9 开始,只有 SubmitMultiSm: address, error : error (s) form Map<String, List<Map<String, Object>>> (messageID : (destAddr : address, error : error : errorCode))造成的错误。

CamelSmppOptionalParameters

Map<String, String>

弃用并将在 Camel 2.13.0/3.0.0 中从 Camel 2.11.1 开始删除,只有通过 发送消息从 SMSC 返回的可选参数。

CamelSmppOptionalParameter

map<Short, Object>

从 Camel 2.10.7, 2.11.2 仅适用于 DataSm The optional 参数,后者通过发送消息从 SMSC 返回。key 是可选参数的 Short 代码。该值使用以下方法转换: org.jsmpp.bean. OptionalParameter.COctetStringString,org.jsmpp.bean. OptionalParameter.OctetStringbyte[], org.jsmpp.bean.optionalParameter.ByteByte,org.jsmpp.bean. OptionalParameter.Int →teger, Intes.jsmpp.bean. org.jsmpp.bean. optionalParameter.ShortShort,org.jsmpp.bean. OptionalParameter.Nullnull

310.8. 消费者消息标头

SMPP 使用者使用以下消息标头从消息标头中的 SMSC 设置请求数据

标头类型描述

CamelSmppSequenceNumber

整数

只有 AlertNotification、DeliverSm 和 DataSm A 序列号允许把响应 PDU 与请求 PDU 关联。关联的 SMPP 响应 PDU 必须保留此字段。

CamelSmppCommandId

整数

仅适用于 AlertNotification、DeliverSm 和 DataSm The command id 字段标识特定的 SMPP PDU。有关已定义值的完整列表,请参阅 smpp 规格 v3.4 章节 5.1.2.1。

CamelSmppSourceAddr

字符串

仅针对 AlertNotification、DeliverSm 和 DataSm 定义来自此消息的 SME (Short Message Entity)地址。

CamelSmppSourceAddrNpi

Byte

只适用于 AlertNotification 和 DataSm 定义要在 SME originator 地址参数中使用的数字计划指标(NPI)。使用以上定义的 URI 选项 sourceAddrNpi 值。

CamelSmppSourceAddrTon

Byte

只适用于 AlertNotification 和 DataSm 定义要在 SME originator 地址参数中使用的数字(TON)类型。使用以上定义的 sourceAddrTon URI 选项值。

CamelSmppEsmeAddr

字符串

只适用于 AlertNotification 来定义目标 ESME 地址。对于移动终止的消息,这是接收者 MS 的目录号。

CamelSmppEsmeAddrNpi

Byte

只有 AlertNotification 指定了要在 ESME 来源器地址参数中使用的数字计划指示器(NPI)。使用以上定义的 URI 选项 sourceAddrNpi 值。

CamelSmppEsmeAddrTon

Byte

仅适用于 AlertNotification 定义了要在 ESME originator 地址参数中使用的数字(TON)类型。使用以上定义的 sourceAddrTon URI 选项值。

CamelSmppId

字符串

仅适用于 smsc DeliveryReceipt 和 DataSm The message ID (在最初提交时由 SMSC 分配的消息 ID)。

CamelSmppDelivered

整数

只适用于发送的简短消息的 smsc DeliveryReceipt 编号。这仅与将原始消息提交到一个发布列表时才相关。如果需要,该值会在前导零添加。

CamelSmppDoneDate

Date

只适用于 smsc DeliveryReceipt The time and date,其中简短消息到达最终状态。格式如下:YYMMDDhhmm。

CamelSmppStatus

DeliveryReceiptState

只适用于 smsc DeliveryReceipt: 消息的最终状态。定义以下值: delIVRD : 消息传送到目的地 EXPIRED: 消息有效期周期已过期,DELETED: 信息已删除,UNDELIV : 消息不可交付,ACCEPTD : 消息为接受状态(例如,被客户服务代表订阅者手动读取),UNKNOWN : Message 处于无效状态,REJECTD : Message 处于 rejected 状态

CamelSmppCommandStatus

整数

仅适用于 DataSm 的消息的命令状态。

CamelSmppError

字符串

仅适用于 smsc DeliveryReceipt,它可能存放了特定于网络的错误代码,或用于 尝试发送邮件的 SMSC 错误代码。这些错误是网络或 SMSC 特定错误,不包含在内。

CamelSmppSubmitDate

Date

仅适用于 smsc DeliveryReceipt The time and date (提交短消息的时间和日期)。如果是已被替换的消息,这是替换原始消息的日期。格式如下:YYMMDDhhmm。

CamelSmppSubmitted

整数

仅针对最初提交的简短消息的 smsc DeliveryReceipt 编号。仅当原始消息被提交到发布列表时,这才有意义。如果需要,这个值会带有前导零添加。

CamelSmppDestAddr

字符串

仅用于 deliverSm 和 DataSm: 定义目的地 SME 地址。对于移动终止的消息,这是接收者 MS 的目录号。

CamelSmppScheduleDeliveryTime

字符串

仅 for DeliverSm: 此参数指定首次尝试消息传送的计划时间。它定义从当前的 SMSC 时间传送此消息将试图通过 SMSC 进行尝试时的绝对日期和时间或相对时间。它可以以绝对时间格式或相对时间格式指定。时间格式的编码在 smpp 规格 v3.4 节中指定。

CamelSmppValidityPeriod

字符串

仅用于提供Sm 有效期参数,表示 SMSC 过期时间(如果不传送到该目的地),应丢弃该消息。它可以以绝对时间格式或相对时间格式定义。smpp 规格 v3.4 第 7.1.1 节中指定绝对和相对时间格式的编码。

CamelSmppServiceType

字符串

仅用于 deliverSm 和 DataSm The service type 参数表示与消息关联的 SMS 应用程序服务。

CamelSmppRegisteredDelivery

Byte

DataSm 仅用于 请求发送收据和/或 SME 发起的确认。与上面的 Producer 标头列表中的值相同。

CamelSmppDestAddrNpi

Byte

仅适用于 DataSm 在目标地址参数中定义数字计划指示符(NPI)。使用以上定义的 URI 选项 sourceAddrNpi 值。

CamelSmppDestAddrTon

Byte

仅适用于 DataSm 在目标地址参数中定义数字(TON)。使用以上定义的 sourceAddrTon URI 选项值。

CamelSmppMessageType

字符串

Camel 2.6 onwards :识别传入消息的类型: AlertNotification: SMSC 警报通知, DataSm: SMSC 数据短消息, DeliveryReceipt: SMSC 收据, DeliverSm: SMSC 交付短消息

CamelSmppOptionalParameters

map<String, Object>

弃用并将在 Camel 2.13.0/3.0.0 开始删除 Camel 2.10.5,仅用于提供 由 SMSC 发送的可选参数。

CamelSmppOptionalParameter

map<Short, Object>

Camel 2.10.7, 2.11.2 截止,仅提供 由 SMSC 发送的可选参数。key 是可选参数的 Short 代码。该值使用以下方法转换: org.jsmpp.bean. OptionalParameter.COctetStringString,org.jsmpp.bean. OptionalParameter.OctetStringbyte[], org.jsmpp.bean.optionalParameter.ByteByte,org.jsmpp.bean. OptionalParameter.Int →teger, Intes.jsmpp.bean. org.jsmpp.bean. optionalParameter.ShortShort,org.jsmpp.bean. OptionalParameter.Nullnull

提示

JSMPP 库 请查看 JSMPP 库 文档,以了解有关基础库的更多详情。

310.9. 异常处理

这个组件支持常规 Camel 异常处理功能

当发生错误时,使用 SubmitSm (默认操作)发送消息时,org.apache.camel.component.smpp.SmppException 会引发嵌套异常,即 org.jsmpp.extra.NegativeResponseException。  调用 NegativeResponseException.getCommandStatus ()以获取精确的 SMPP 负响应代码,其值在 SMPP 规范 3.4 节中阐述。
发布的 Camel 2.8 :当 SMPP 使用者收到 交付SmDataSm 短消息并且这些消息的处理失败时,您也可以抛出 ProcessRequestException 而不是处理失败。在这种情况下,这个例外会转发到底层 JSMPP 库,该库 会将包括的错误代码返回到 SMSC。此功能对 e.g. 指示 SMSC 稍后重新发送简短消息。这可以通过以下代码行完成:

from("smpp://smppclient@localhost:2775?password=password&enquireLinkTimer=3000&transactionTimer=5000&systemType=consumer")
  .doTry()
    .to("bean:dao?method=updateSmsState")
  .doCatch(Exception.class)
    .throwException(new ProcessRequestException("update of sms state failed", 100))
  .end();

有关错误代码的完整列表及其含义,请参阅 SMPP 规格

310.10. Samples

使用 Java DSL 发送 SMS 的路由:

from("direct:start")
  .to("smpp://smppclient@localhost:2775?
      password=password&enquireLinkTimer=3000&transactionTimer=5000&systemType=producer");

使用 Spring XML DSL 发送 SMS 的路由:

<route>
  <from uri="direct:start"/>
  <to uri="smpp://smppclient@localhost:2775?
           password=password&amp;enquireLinkTimer=3000&amp;transactionTimer=5000&amp;systemType=producer"/>
</route>

使用 Java DSL 接收 SMS 的路由:

from("smpp://smppclient@localhost:2775?password=password&enquireLinkTimer=3000&transactionTimer=5000&systemType=consumer")
  .to("bean:foo");

使用 Spring XML DSL 接收 SMS 的路由:

  <route>
     <from uri="smpp://smppclient@localhost:2775?
                password=password&amp;enquireLinkTimer=3000&amp;transactionTimer=5000&amp;systemType=consumer"/>
     <to uri="bean:foo"/>
  </route>
提示

SMSC 模拟器 需要 SMSC 模拟器供您进行测试,您可以使用 Logica 提供的模拟器。

310.11. 调试日志记录

此组件具有日志级别 DEBUG,有助于调试问题。如果使用 log4j,您可以在配置中添加以下行:

log4j.logger.org.apache.camel.component.smpp=DEBUG

310.12. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 311 章 SNMP 组件

作为 Camel 版本 2.1 提供

snmp: 组件可让您轮询 SNMP 功能的设备或接收陷阱

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-snmp</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

311.1. URI 格式

snmp://hostname[:port][?Options]

组件支持来自 SNMP enabled 设备和接收陷阱的轮询 OID 值。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

311.2. SNMP Producer

2.18 发行版本提供

它还可用来使用 GET 方法请求信息。

响应正文类型是 org.apache.camel.component.snmp.SnmpMessage

311.3. 选项

SNMP 组件没有选项。

SNMP 端点使用 URI 语法配置:

snmp:host:port

使用以下路径和查询参数:

311.3.1. 路径名(2 参数):

名称描述默认类型

主机

SNMP 启用设备 所需的 主机名

 

字符串

port

SNMP 启用设备 所需的 端口号

 

整数

311.3.2. 查询参数(35 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

delay (consumer)

设置更新率(以秒为单位)

60000

long

OID ( 消费者)

定义您感兴趣的值。请查看维基百科,以更好地了解。您可以提供一个 OID 或 coma 分隔的 OID 列表。示例: oids=1.3.6.1.2.1.1.3.0,1.3.6.1.25.3.2.1.5.1,1.3.6.1.2.1.25.3.5.1.1.1,1.3.6.1.2.1.43.5.1.1.11.1

 

字符串

protocol (consumer)

您可以在此处选择要使用的协议。您可以使用 udp 或 tcp。

udp

字符串

重试 (消费者)

定义取消请求前重试的频率。

2

int

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

snmpCommunity (consumer)

为 snmp 请求设置社区八进制字符串。

public

字符串

snmpContextEngineId (consumer)

设置范围 PDU 的上下文引擎 ID 字段。

 

字符串

snmpContextName (consumer)

设置此范围 PDU 的上下文名称字段。

 

字符串

snmpVersion (consumer)

为请求设置 snmp 版本。值 0 表示 SNMPv1,1 表示 SNMPv2c,值 3 表示 SNMPv3

0

int

timeout (consumer)

在 millis 中设置请求的超时值。

1500

int

treeList (consumer)

设置 PDU 是否会在树中包含子元素时显示为列表

false

布尔值

type (consumer)

要执行的操作,如 poll、trap 等。

 

SnmpActionType

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

authenticationPassphrase (security)

身份验证密码短语。如果没有 null,则 authenticationProtocol 还必须为空。RFC3414 11.2 要求密码短语至少为 8 字节。如果 authenticationPassphrase 的长度小于 8 字节,则会引发 IllegalArgumentException。

 

字符串

authenticationProtocol (security)

如果将安全级别设置为启用验证,要使用的身份验证协议有: MD5、SHA1

 

字符串

privacyPassphrase (security)

隐私密码短语。如果没有为空,则隐私Protocol 还必须为空。RFC3414 11.2 要求密码短语至少为 8 字节。如果 authenticationPassphrase 的长度小于 8 字节,则会引发 IllegalArgumentException。

 

字符串

privacyProtocol (security)

与此用户关联的隐私协议 ID。如果设置为 null,则此用户只支持未加密的信息。

 

字符串

securityLevel (security)

设定此目标的安全级别。提供的安全级别必须由与为该目标设定的安全名称关联的安全模型相依信息提供支持。值 1 表示:不进行身份验证且没有加密。任何人都可以创建并读取此安全级别的消息。值 2 表示:身份验证和没有加密。只有具有适当身份验证密钥的用户才能创建具有此安全级别的消息,但任何人都可以读取消息的内容。值 3 表示:身份验证和加密。只有具有适当验证密钥的用户才能创建具有此安全级别的消息,并且只有具有正确加密/解密密钥的密钥才能读取消息的内容。

3

int

securityName (security)

设置与此目标一起使用的安全名称。

 

字符串

311.4. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.snmp.enabled

启用 snmp 组件

true

布尔值

camel.component.snmp.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

311.5. 轮询结果

鉴于这种情况,我轮询以下 OID:

OID

1.3.6.1.2.1.1.3.0
1.3.6.1.2.1.25.3.2.1.5.1
1.3.6.1.2.1.25.3.5.1.1.1
1.3.6.1.2.1.43.5.1.1.11.1

结果为:

字符串转换的结果

<?xml version="1.0" encoding="UTF-8"?>
<snmp>
  <entry>
    <oid>1.3.6.1.2.1.1.3.0</oid>
    <value>6 days, 21:14:28.00</value>
  </entry>
  <entry>
    <oid>1.3.6.1.2.1.25.3.2.1.5.1</oid>
    <value>2</value>
  </entry>
  <entry>
    <oid>1.3.6.1.2.1.25.3.5.1.1.1</oid>
    <value>3</value>
  </entry>
  <entry>
    <oid>1.3.6.1.2.1.43.5.1.1.11.1</oid>
    <value>6</value>
  </entry>
  <entry>
    <oid>1.3.6.1.2.1.1.1.0</oid>
    <value>My Very Special Printer Of Brand Unknown</value>
  </entry>
</snmp>

因为您可能会发现,超过 request…​.1.3.6.1.2.1.1.1.0 的结果。
这个设备会在这个特殊情况下自动填写。因此,您可能绝对发生,您收到了超过您所请求的…​be 准备情况。

OID 以点表示开头

.1.3.6.1.4.1.6527.3.1.2.21.2.1.50

如您所见,默认的 snmpVersion 为 0,表示端点中的 version1 (如果未明确设置)。如果能够查询具有不同版本的 SNMP 表,请确保明确设置不是默认值的 snmpVersion。其他可能的值是 version2cversion3

311.6. 例子

轮询远程设备:

snmp:192.168.178.23:161?protocol=udp&type=POLL&oids=1.3.6.1.2.1.1.5.0

设置陷阱接收器(请注意,此处不需要 OID 信息!):

snmp:127.0.0.1:162?protocol=udp&type=TRAP

从 Camel 2.10.0,您可以获得 SNMP TRAP 的社区,并带有消息标题 'securityName'
SNMP TRAP 的对等地址,并带有消息标题 'peerAddress'。

Java 中的路由示例:(将 SNMP PDU 整合到 XML 字符串)

from("snmp:192.168.178.23:161?protocol=udp&type=POLL&oids=1.3.6.1.2.1.1.5.0").
convertBodyTo(String.class).
to("activemq:snmp.states");

311.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 312 章 SOAP DataFormat

作为 Camel 版本 2.3 可用

SOAP 是一个数据格式,使用 JAXB2 和 JAX-WS 注释来组合和联合 SOAP 有效负载。它提供了 Apache CXF 的基本功能,无需 CXF 堆栈。

支持的 SOAP 版本

默认支持 SOAP 1.1。从 Camel 2.11 开始支持 SOAP 1.2。

命名空间前缀映射

如需有关如何使用 SOAP 数据格式时控制命名空间前缀映射的详细信息,请参阅 JAXB

312.1. SOAP 选项

SOAP 数据格式支持 7 个选项,它们如下。

名称默认Java 类型描述

contextPath

 

字符串

您的 JAXB 类所在的软件包名称。

encoding

 

字符串

使用规则规则并使用特定的编码

elementNameStrategyRef

 

字符串

指的是从 registry 查找的元素策略。元素名称策略用于两个目的。第一种方法是查找给定对象的 xml 元素名称,并在将对象放入 SOAP 消息时采取 soap 操作。第二个是查找给定 soap 错误名称的 Exception 类。以下三个元素策略类名称是开箱即用的。QNameStrategy - 使用在实例化时配置的固定 qName。不支持 TypeNameStrategy 时出现异常查找 - 使用给定类型的 XMLType 注解中的名称和命名空间。如果没有设置 namespace,则使用 package-info。异常查找不支持 ServiceInterfaceStrategy - 使用 webservice 接口中的信息来确定类型名称,并为 SOAP 错误或类似工具找到异常类。这个类位于软件包名称 org.apache.camel.dataformat. makingp.name。如果您已使用 cxf-codegen 或类似工具生成了 web 服务 stub 代码,那么您可能想使用 ServiceInterface.apache.camel.dataformat.rhnp.name。如果没有注解的服务接口,您应该使用 QNameStrategy 或 TypeNameStrategy。

version

1.1

字符串

SOAP 版本应为 1.1 或 1.2。默认为 1.1

namespacePrefixRef

 

字符串

使用 JAXB 或 SOAP 总结时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。要控制此映射,Camel 允许您引用包含所需映射的映射。

schema

 

字符串

对现有架构进行验证。您可以使用前缀 classpath:、file: 或 http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个 schema 文件。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

312.2. Spring Boot Auto-Configuration

组件支持 8 个选项,如下所示。

名称描述默认类型

camel.dataformat.soapjaxb.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.soapjaxb.context-path

您的 JAXB 类所在的软件包名称。

 

字符串

camel.dataformat.soapjaxb.element-name-strategy-ref

指的是从 registry 查找的元素策略。元素名称策略用于两个目的。第一种方法是查找给定对象的 xml 元素名称,并在将对象放入 SOAP 消息时采取 soap 操作。第二个是查找给定 soap 错误名称的 Exception 类。以下三个元素策略类名称是开箱即用的。QNameStrategy - 使用在实例化时配置的固定 qName。不支持 TypeNameStrategy 时出现异常查找 - 使用给定类型的 XMLType 注解中的名称和命名空间。如果没有设置 namespace,则使用 package-info。异常查找不支持 ServiceInterfaceStrategy - 使用 webservice 接口中的信息来确定类型名称,并为 SOAP 错误或类似工具找到异常类。这个类位于软件包名称 org.apache.camel.dataformat. makingp.name。如果您已使用 cxf-codegen 或类似工具生成了 web 服务 stub 代码,那么您可能想使用 ServiceInterface.apache.camel.dataformat.rhnp.name。如果没有注解的服务接口,您应该使用 QNameStrategy 或 TypeNameStrategy。

 

字符串

camel.dataformat.soapjaxb.enabled

启用 soapjaxb 数据格式

true

布尔值

camel.dataformat.soapjaxb.encoding

使用规则规则并使用特定的编码

 

字符串

camel.dataformat.soapjaxb.namespace-prefix-ref

使用 JAXB 或 SOAP 总结时,JAXB 实施将自动分配命名空间前缀,如 ns2、ns3、ns4 等。要控制此映射,Camel 允许您引用包含所需映射的映射。

 

字符串

camel.dataformat.soapjaxb.schema

对现有架构进行验证。您可以使用前缀 classpath:、file: 或 http: 指定资源通过解析的方式。您可以使用 ',' 字符分隔多个 schema 文件。

 

字符串

camel.dataformat.soapjaxb.version

SOAP 版本应为 1.1 或 1.2。默认为 1.1

1.1

字符串

ND

312.3. ElementNameStrategy

元素名称策略用于两个目的。第一种方法是查找给定对象的 xml 元素名称,并在将对象放入 SOAP 消息时采取 soap 操作。第二个是查找给定 soap 错误名称的 Exception 类。

策略使用

QNameStrategy

使用实例化时配置的固定 qName。不支持异常查找

TypeNameStrategy

使用给定类型的 @XMLType 注释中的 name 和 namespace。如果没有设置 namespace,则使用 package-info。不支持异常查找

ServiceInterfaceStrategy

使用 webservice 接口中的信息来确定类型名称并查找 SOAP 错误异常类

如果您使用 cxf-codegen 或类似工具生成了 web 服务 stub 代码,那么您可能要使用 ServiceInterfaceStrategy。如果没有注解的服务接口,您应该使用 QNameStrategy 或 TypeNameStrategy。

312.4. 使用 Java DSL

以下示例使用了名称 soap 的 DataFormat,它配置有软件包 com.example.customerservice 来初始化 JAXBContext。第二个参数是 ElementNameStrategy。路由也可以编入普通对象以及例外。(注意以下只是将 SOAP Envelope 发送至队列。Web 服务提供商实际上需要侦听实际发生的 SOAP 调用队列,在这种情况下,它是 SOAP 请求的一种方式。如果您需要请求答复,那么您应该查看下一个示例。)

SoapJaxbDataFormat soap = new SoapJaxbDataFormat("com.example.customerservice", new ServiceInterfaceStrategy(CustomerService.class));
from("direct:start")
  .marshal(soap)
  .to("jms:myQueue");
提示

另请参阅,因为 SOAP 数据格式从 JAXB 数据格式大多数设置中继承。

312.4.1. 使用 SOAP 1.2

可从 Camel 2.11 开始

SoapJaxbDataFormat soap = new SoapJaxbDataFormat("com.example.customerservice", new ServiceInterfaceStrategy(CustomerService.class));
soap.setVersion("1.2");
from("direct:start")
  .marshal(soap)
  .to("jms:myQueue");

当使用 XML DSL 时,您可以在 <SOApjaxb> 元素中设置 version 属性。

    <!-- Defining a ServiceInterfaceStrategy for retrieving the element name when marshalling -->
    <bean id="myNameStrategy" class="org.apache.camel.dataformat.soap.name.ServiceInterfaceStrategy">
        <constructor-arg value="com.example.customerservice.CustomerService"/>
    <constructor-arg value="true"/>
    </bean>

在 Camel 路由中

<route>
  <from uri="direct:start"/>
  <marshal>
    <soapjaxb contentPath="com.example.customerservice" version="1.2" elementNameStrategyRef="myNameStrategy"/>
  </marshal>
  <to uri="jms:myQueue"/>
</route>

312.5. 多部分消息

可从 Camel 2.8.1 开始

ServiceInterfaceStrategy 支持多部分 SOAP 信息。ServiceInterfaceStrategy 必须使用一个服务接口定义初始化,该定义会根据 JAX-WS 2.2 进行注解,并符合 Document Bare 风格的要求。目标方法必须满足以下条件,如 JAX-WS 规格:1。如果它具有大多数 /out 的非header参数或非header 参数中,则它必须具有最多的非header 参数,2)。如果它具有不得在 / out 或 out non-header 参数中的 返回类型,则它必须具有最多的 / out 或非header 参数。

ServiceInterfaceStrategy 应使用布尔值参数进行初始化,该参数指示映射策略应用到请求参数或响应参数。

ServiceInterfaceStrategy strat =  new ServiceInterfaceStrategy(com.example.customerservice.multipart.MultiPartCustomerService.class, true);
SoapJaxbDataFormat soapDataFormat = new SoapJaxbDataFormat("com.example.customerservice.multipart", strat);

312.5.1. 多部分请求

多部分请求的有效负载参数使用可反映目标操作的 BeanInvocation 对象进行 initiazlied。在调用 marshal () 处理器时,camel-soap DataFormat 将 BeanInvocation 中的内容映射到 SOAP 标头中的字段,并根据 JAX-WS 映射进行正文。

BeanInvocation beanInvocation = new BeanInvocation();

// Identify the target method
beanInvocation.setMethod(MultiPartCustomerService.class.getMethod("getCustomersByName",
    GetCustomersByName.class, com.example.customerservice.multipart.Product.class));

// Populate the method arguments
GetCustomersByName getCustomersByName = new GetCustomersByName();
getCustomersByName.setName("Dr. Multipart");

Product product = new Product();
product.setName("Multiuse Product");
product.setDescription("Useful for lots of things.");

Object[] args = new Object[] {getCustomersByName, product};

// Add the arguments to the bean invocation
beanInvocation.setArgs(args);

// Set the bean invocation object as the message body
exchange.getIn().setBody(beanInvocation);

312.5.2. 多部分响应

多部分的 soap 响应可能包含 soap 正文中的元素,并在 soap 标头中包含一个或多个元素。camel-soap DataFormat 将取消汇总 soap 正文中的元素(如果存在),并将其放到交换的正文中。标题元素 将不会 编入其 JAXB 映射的对象类型。相反,这些元素被放入 camel out 消息标题 org.apache.camel.dataformat.soap.UNMARSHALLED_HEADER_LIST。这些元素将显示为元素实例值,或显示为 JAXBElement 值,具体取决于 ignoreJAXBElement 属性的设置。此属性继承自 camel-jaxb。

您还可以通过将 ignoreUnmarshalledHeaders 值设置为 true,将 camel-soap DataFormate 忽略标题内容 all-togethers。

312.5.3. 拥有者对象映射

JAX-WS 指定在 In/OutOut 参数中使用 type-parameterized javax.xml.ws.Holder 对象。在构建 BeanInvocation 时可以使用 Holder 对象,或者您可以直接使用参数ized-type 实例。camel-soap DataFormat marshals Holder 值取决于 Holder 的值的类 JAXB 映射。没有为未摘要响应中的 'Holder 对象提供映射。

312.6. 例子

312.6.1. WebService 客户端

以下路由支持收集请求和解包响应或故障。

String WS_URI = "cxf://http://myserver/customerservice?serviceClass=com.example.customerservice&dataFormat=MESSAGE";
SoapJaxbDataFormat soapDF = new SoapJaxbDataFormat("com.example.customerservice", new ServiceInterfaceStrategy(CustomerService.class));
from("direct:customerServiceClient")
  .onException(Exception.class)
    .handled(true)
    .unmarshal(soapDF)
  .end()
  .marshal(soapDF)
  .to(WS_URI)
  .unmarshal(soapDF);

以下片段为服务接口创建了一个代理,并对上述路由进行 SOAP 调用。

import org.apache.camel.Endpoint;
import org.apache.camel.component.bean.ProxyHelper;
...

Endpoint startEndpoint = context.getEndpoint("direct:customerServiceClient");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// CustomerService below is the service endpoint interface, *not* the javax.xml.ws.Service subclass
CustomerService proxy = ProxyHelper.createProxy(startEndpoint, classLoader, CustomerService.class);
GetCustomersByNameResponse response = proxy.getCustomersByName(new GetCustomersByName());

312.6.2. Webservice Server

使用以下路由设置 Web 服务服务器,该服务器使用类 customerServiceImpl 侦听 jms 队列 customerServiceQueue 并处理请求。本课程的 customerServiceImpl 应实施接口 CustomerService。不是直接实例化服务器类,而是可以作为常规 bean 在 spring 上下文中定义。

SoapJaxbDataFormat soapDF = new SoapJaxbDataFormat("com.example.customerservice", new ServiceInterfaceStrategy(CustomerService.class));
CustomerService serverBean = new CustomerServiceImpl();
from("jms://queue:customerServiceQueue")
  .onException(Exception.class)
    .handled(true)
    .marshal(soapDF)
  .end()
  .unmarshal(soapDF)
  .bean(serverBean)
  .marshal(soapDF);

312.7. 依赖项

要在 camel 路由中使用 SOAP 数据格式,您需要将以下依赖项添加到您的 pom 中。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-soap</artifactId>
  <version>2.3.0</version>
</dependency>

第 313 章 Solr 组件

作为 Camel 版本 2.9 提供。

Solr 组件允许您与 Apache Lucene Solr 服务器(基于 SolrJ 3.5.0)进行接口。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-solr</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

313.1. URI 格式

注意:Camel 2.14 开始,新功能会添加 solrs 和 solrCloud。

solr://host[:port]/solr?[options]
solrs://host[:port]/solr?[options]
solrCloud://host[:port]/solr?[options]

313.2. Solr 选项

Solr 组件没有选项。

Solr 端点使用 URI 语法进行配置:

solr:url

使用以下路径和查询参数:

313.2.1. 路径名(1 参数):

名称描述默认类型

url

solr 服务器所需的主机名和端口

 

字符串

313.2.2. 查询参数(13 参数):

名称描述默认类型

allowCompression (producer)

服务器侧必须支持 gzip 或防御才能生效

 

布尔值

connectionTimeout (producer)

底层 HttpConnectionManager 上的 connectionTimeout

 

整数

defaultMaxConnectionsPer Host (producer)

底层 HttpConnectionManager 上的 maxConnectionsPerHost

 

整数

followRedirects (producer)

指明是否使用了重定向来获取 Solr 服务器

 

布尔值

maxRetries (producer)

临时错误尝试的最大重试次数

 

整数

maxTotalConnections (producer)

底层 HttpConnectionManager 上的 maxTotalConnectionion

 

整数

requestHandler (producer)

设置要使用的请求处理程序

 

字符串

soTimeout (producer)

在底层 HttpConnectionManager 上读取超时。这适用于查询,但可能不适用于索引

 

整数

streamingQueueSize (producer)

为 StreamingUpdateSolrServer 设置队列大小

10

int

streamingThreadCount (producer)

设置 StreamingUpdateSolrServer 的线程数量

2

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

collection (solrCloud)

设置 solrCloud 服务器可以使用的集合名称

 

字符串

zkHost (solrCloud)

设置 solrCloud 可以使用的 ZooKeeper 主机信息,如 zkhost=localhost:8123。

 

字符串

313.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.solr.enabled

启用 solr 组件

true

布尔值

camel.component.solr.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

313.4. Message Operations

目前支持以下 Solr 操作。只需使用 "SolrOperation" 键设置交换标头,以及一个值设置为以下之一:有些操作还需要设置消息正文。

操作邮件正文描述

INSERT/INSERT_STREAMING

不适用

使用消息标头添加索引(必须为前缀为 "SolrField."

INSERT/INSERT_STREAMING

File

使用给定文件添加索引(使用 ContentStreamUpdateRequest)

INSERT/INSERT_STREAMING

SolrInputDocument

Camel 2.9.2 根据给定的 SolrInput 文档更新索引

INSERT/INSERT_STREAMING

字符串 XML

Camel 2.9.2 根据给定的 XML 更新索引(必须采用 SolrInput 文档)

ADD_BEAN

Bean 实例

根据 注解的 bean中的值添加索引

ADD_BEANS

collection<bean>

Camel 2.15 根据被注释的 bean 的集合添加索引

DELETE_BY_ID

要删除的索引 ID

根据 ID 删除记录

DELETE_BY_QUERY

查询字符串

通过查询删除记录

COMMIT

不适用

对任何待处理的索引更改执行提交

ROLLBACK

不适用

对任何待处理的索引更改执行回滚

优化

不适用

对任何待处理的索引更改执行提交,然后运行 optimize 命令

313.5. 示例

以下是一个简单的 INSERT、DELETE 和 COMMIT 示例

from("direct:insert")
    .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_INSERT))
    .setHeader(SolrConstants.FIELD + "id", body())
    .to("solr://localhost:8983/solr");

from("direct:delete")
    .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_DELETE_BY_ID))
    .to("solr://localhost:8983/solr");

from("direct:commit")
    .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_COMMIT))
    .to("solr://localhost:8983/solr");
<route>
    <from uri="direct:insert"/>
    <setHeader headerName="SolrOperation">
        <constant>INSERT</constant>
    </setHeader>
    <setHeader headerName="SolrField.id">
        <simple>${body}</simple>
    </setHeader>
    <to uri="solr://localhost:8983/solr"/>
</route>
<route>
    <from uri="direct:delete"/>
    <setHeader headerName="SolrOperation">
        <constant>DELETE_BY_ID</constant>
    </setHeader>
    <to uri="solr://localhost:8983/solr"/>
</route>
<route>
    <from uri="direct:commit"/>
    <setHeader headerName="SolrOperation">
        <constant>COMMIT</constant>
    </setHeader>
    <to uri="solr://localhost:8983/solr"/>
</route>

客户端只需要将正文消息传递给插入或删除路由,然后调用提交路由。

    template.sendBody("direct:insert", "1234");
    template.sendBody("direct:commit", null);
    template.sendBody("direct:delete", "1234");
    template.sendBody("direct:commit", null);

313.6. 查询 Solr

目前,这个组件不支持原生查询数据(稍后添加)。现在,您可以使用 HTTP 查询 Solr,如下所示:

//define the route to perform a basic query
from("direct:query")
    .recipientList(simple("http://localhost:8983/solr/select/?q=${body}"))
    .convertBodyTo(String.class);
...
//query for an id of '1234' (url encoded)
String responseXml = (String) template.requestBody("direct:query", "id%3A1234");

如需更多信息,请参阅这些资源…​

Solr Query Tutorial

Solr 查询语法

313.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 314 章 Apache Spark 组件

作为 Camel 2.17 版提供

本文档页面涵盖了 Apache Camel 的 Apache Spark 组件。Spark 与 Camel 集成的主要目的是在 Camel 连接器和 Spark 任务之间提供一个桥接。特别是 Camel 连接器提供了一种方法来路由来自各种传输的消息,动态选择要执行的任务,使用传入消息作为该任务的输入数据,最后将执行结果传送回 Camel 管道。

314.1. 支持的架构风格

spark 组件可用作部署到应用服务器(或作为 fat jar 执行)的驱动程序应用。

image

也可以将 spark 组件作为作业直接提交到 Spark 集群。

image

虽然 Spark 组件是设计的主要设计,作为 Spark 集群和其他端点之间的 一个长运行的作业 服务,但您也可以将它用作 触发器的短 作业。  

314.2. 在 OSGi 服务器中运行 Spark

目前,Spark 组件不支持 OSGi 容器中执行。spark 已作为 fat jar 执行,通常作为作业提交到集群。由于在 OSGi 服务器中运行 Spark 的原因至少具有挑战性,而且不受 Camel 的支持。

314.3. URI 格式

目前,Spark 组件仅支持制作者 - 它旨在调用 Spark 作业和返回结果。您可以调用 RDD、数据框架或 Hive SQL 作业。

spark URI 格式

spark:{rdd|dataframe|hive}

314.3.1. spark 选项

Apache Spark 组件支持 3 个选项,它们如下。

名称描述默认类型

rdd (producer)

用于计算的 RDD,

 

JavaRDDLike

rddCallback (producer)

针对 RDD 执行操作的功能.

 

RddCallback

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Apache Spark 端点使用 URI 语法进行配置:

spark:endpointType

使用以下路径和查询参数:

314.3.2. 路径名(1 参数):

名称描述默认类型

endpointType

端点 所需的 类型(rdd、dataframe、hive)。

 

EndpointType

314.3.3. 查询参数(6 参数):

名称描述默认类型

collect (producer)

指明是否应该收集或计算结果。

true

布尔值

dataFrame (producer)

对计算数据进行计算.

 

dataset

dataFrameCallback (producer)

对 DataFrame 进行功能执行。

 

DataFrameCallback

rdd (producer)

用于计算的 RDD,

 

JavaRDDLike

rddCallback (producer)

针对 RDD 执行操作的功能.

 

RddCallback

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

314.4. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.spark.enabled

启用 spark 组件

true

布尔值

camel.component.spark.rdd

用于计算的 RDD,选项是一个 org.apache.spark.api.java.JavaRDDLike 类型。

 

字符串

camel.component.spark.rdd-callback

针对 RDD 执行操作的功能.选项是一个 org.apache.camel.component.spark.RddCallback 类型。

 

字符串

camel.component.spark.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

  # RDD job 

要调用 RDD 作业,请使用以下 URI:

spark RDD producer

spark:rdd?rdd=#testFileRdd&rddCallback=#transformation

 其中 rdd 选项是指 RDD 实例的名称(subclass of org.apache.spark.api.java.JavaRDDLike),而 rddCallback 指的是 org.apache.camel.component.spark.RddCallback 接口(也来自 registry)的实现。RDD 回调提供单一方法,用于针对给定的 RDD 应用传入的消息。回调计算结果保存为交换的正文。

spark RDD 回调

public interface RddCallback<T> {
    T onRdd(JavaRDDLike rdd, Object... payloads);
}

以下片段演示了如何将消息作为输入发送到作业并返回结果:

调用 spark 任务

String pattern = "job input";
long linesCount = producerTemplate.requestBody("spark:rdd?rdd=#myRdd&rddCallback=#countLinesContaining", pattern, long.class);

上面注册为 Spring bean 的 RDD 回调可能如下所示:

spark RDD 回调

@Bean
RddCallback<Long> countLinesContaining() {
    return new RddCallback<Long>() {
        Long onRdd(JavaRDDLike rdd, Object... payloads) {
            String pattern = (String) payloads[0];
            return rdd.filter({line -> line.contains(pattern)}).count();
        }
    }
}

Spring 中的 RDD 定义可能如下所示:

spark RDD 定义

@Bean
JavaRDDLike myRdd(JavaSparkContext sparkContext) {
  return sparkContext.textFile("testrdd.txt");
}

314.4.1. void RDD 回调

如果您的 RDD 回调不会将任何值返回至 Camel 管道,您可以返回 null 值或使用 VoidRddCallback 基础类:

spark RDD 定义

@Bean
RddCallback<Void> rddCallback() {
  return new VoidRddCallback() {
        @Override
        public void doOnRdd(JavaRDDLike rdd, Object... payloads) {
            rdd.saveAsTextFile(output.getAbsolutePath());
        }
    };
}

314.4.2. 转换 RDD 回调

如果您知道哪些输入数据被发送到 RDD 回调,您可以使用 ConvertingRddCallback,并让 Camel 自动转换传入的信息,然后再将它们插入到回调中:

spark RDD 定义

@Bean
RddCallback<Long> rddCallback(CamelContext context) {
  return new ConvertingRddCallback<Long>(context, int.class, int.class) {
            @Override
            public Long doOnRdd(JavaRDDLike rdd, Object... payloads) {
                return rdd.count() * (int) payloads[0] * (int) payloads[1];
            }
        };
    };
}

314.4.3. 注解的 RDD 回调

使用 RDD 回调的最简单方式是为类提供标有 @RddCallback 注解的方法:

注解的 RDD 回调定义

import static org.apache.camel.component.spark.annotations.AnnotatedRddCallback.annotatedRddCallback;
 
@Bean
RddCallback<Long> rddCallback() {
    return annotatedRddCallback(new MyTransformation());
}
 
...
 
import org.apache.camel.component.spark.annotation.RddCallback;
 
public class MyTransformation {
 
    @RddCallback
    long countLines(JavaRDD<String> textFile, int first, int second) {
        return textFile.count() * first * second;
    }
 
}

如果将 CamelContext 传递给注解的 RDD 回调工厂方法,则创建的回调将可以转换传入的有效负载以匹配注解方法的参数:

注解的 RDD 回调的正文转换

import static org.apache.camel.component.spark.annotations.AnnotatedRddCallback.annotatedRddCallback;
 
@Bean
RddCallback<Long> rddCallback(CamelContext camelContext) {
    return annotatedRddCallback(new MyTransformation(), camelContext);
}
 
...

 
import org.apache.camel.component.spark.annotation.RddCallback;
 
public class MyTransformation {
 
    @RddCallback
    long countLines(JavaRDD<String> textFile, int first, int second) {
        return textFile.count() * first * second;
    }
 
}
 
...
 
// Convert String "10" to integer
long result = producerTemplate.requestBody("spark:rdd?rdd=#rdd&rddCallback=#rddCallback" Arrays.asList(10, "10"), long.class);

 

314.5. DataFrame 作业

无法使用 RDDs Spark 组件也可以使用 DataFrames。 

要调用 DataFrame 作业,请使用以下 URI:

spark RDD producer

spark:dataframe?dataFrame=#testDataFrame&dataFrameCallback=#transformation

 其中 dataFrame 选项是指 DataFrame实例的名称( org.apache.spark.sql.Dataset 和 org.apache.spark.sql.Row)的名称,而 dataFrameCallback 则引用 org.apache.camel.component.spark.sql.sparDataFeCallback 接口(也来自 registry)。DataFrame 回调提供了一种单一方法,用于针对给定的 DataFrame 应用传入的消息。回调计算结果保存为交换的正文。

spark RDD 回调

public interface DataFrameCallback<T> {
    T onDataFrame(Dataset<Row> dataFrame, Object... payloads);
}

以下片段演示了如何将消息作为输入发送到作业并返回结果:

调用 spark 任务

String model = "Micra";
long linesCount = producerTemplate.requestBody("spark:dataFrame?dataFrame=#cars&dataFrameCallback=#findCarWithModel", model, long.class);

以 Spring bean 形式注册的代码片段的数据Frame 回调如下所示:

spark RDD 回调

@Bean
RddCallback<Long> findCarWithModel() {
    return new DataFrameCallback<Long>() {
        @Override
        public Long onDataFrame(Dataset<Row> dataFrame, Object... payloads) {
            String model = (String) payloads[0];
            return dataFrame.where(dataFrame.col("model").eqNullSafe(model)).count();
        }
    };
}

Spring 中的 DataFrame 定义如下:

spark RDD 定义

@Bean
Dataset<Row> cars(HiveContext hiveContext) {
    Dataset<Row> jsonCars = hiveContext.read().json("/var/data/cars.json");
    jsonCars.registerTempTable("cars");
    return jsonCars;
}

314.6. Hive 任务

 除了使用 RDD 或 DataFrame Spark 组件外,还可接收 Hive SQL 查询作为有效负载。 要将 Hive 查询发送到 Spark 组件,请使用以下 URI:

spark RDD producer

spark:hive

以下片段演示了如何将消息作为输入发送到作业并返回结果:

调用 spark 任务

long carsCount = template.requestBody("spark:hive?collect=false", "SELECT * FROM cars", Long.class);
List<Row> cars = template.requestBody("spark:hive", "SELECT * FROM cars", List.class);

在我们查询前,我们希望对 进行查询的表应在 HiveContext 中注册。例如,在 Spring 中,注册示例如下:

spark RDD 定义

@Bean
Dataset<Row> cars(HiveContext hiveContext) {
     jsonCars = hiveContext.read().json("/var/data/cars.json");
    jsonCars.registerTempTable("cars");
    return jsonCars;
}

314.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 315 章 spark Rest 组件

作为 Camel 版本 2.14 可用

Spark-rest 组件允许使用 Rest DSL 使用 Spark REST Java 库 来定义 REST 端点。

INFO:Spark Java 需要 Java 8 运行时。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

 <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-spark-rest</artifactId>
        <version>${camel-version}</version>
    </dependency>

315.1. URI 格式

spark-rest://verb:path?[options]

315.2. URI 选项

Spark Rest 组件支持 12 个选项,它们如下。

名称描述默认类型

port (consumer)

端口号。默认情况下将使用 4567

4567

int

ipAddress (consumer)

设置 Spark 应该侦听的 IP 地址。如果没有调用默认地址,则为 '0.0.0.0'。

0.0.0.0

字符串

minThreads (advanced)

Spark thread-pool 中的最少线程数量(全局共享)

 

int

maxThreads (advanced)

Spark thread-pool 中的最大线程数量(全局共享)

 

int

timeOutMillis (advanced)

在 millis 中处于空闲状态的线程在线程闲置时超时将从线程池中终止

 

int

keystoreFile (security)

配置连接,使其安全使用密钥存储文件

 

字符串

keystorePassword (security)

配置与使用密钥存储密码的安全连接

 

字符串

truststoreFile (security)

配置连接以使用 truststore 文件的安全

 

字符串

truststorePassword (security)

配置连接以使用 truststore 密码的安全

 

字符串

sparkConfiguration (advanced)

使用共享的 SparkConfiguration

 

SparkConfiguration

sparkBinding (advanced)

使用自定义 SparkBinding 映射到/来自 Camel 消息。

 

SparkBinding

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Spark Rest 端点使用 URI 语法进行配置:

spark-rest:verb:path

使用以下路径和查询参数:

315.2.1. 路径名(2 参数):

名称描述默认类型

verb

需要 得到、发布、放置、补丁、删除、头、跟踪、连接或选项。

 

字符串

path

需要支持 Spark 语法的内容路径。

 

字符串

315.2.2. 查询参数(11 参数):

名称描述默认类型

接受 (消费者)

接受类型,如 'text/xml' 或 'application/json'。默认情况下,我们接受各种类型。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

disableStreamCache (consumer)

确定 Spark HttpRequest#getContent ()的原始输入流是否已被缓存(Camel 将读取流型流缓存)缓存中的流(Camel)。默认情况下,Camel 将缓存 Netty 输入流,以支持多次读取,以确保 Camel 可以从流检索所有数据。但是,当您需要访问原始流(如直接流传输到文件或其他持久性存储)时,您可以将这个选项设置为 true。请记住,如果启用这个选项,则不能多次读取 Netty 流,而且您需要手动在 Spark raw 流上重置 reader 索引。

false

布尔值

mapHeaders (consumer)

如果启用了这个选项,则当从 Spark 绑定到 Camel 消息时,也会映射标头(如作为标头添加到 Camel 消息)。您可以关闭这个选项来禁用这个选项。该标头仍然可以从 org.apache.camel.component.sparkrest.SparkMessage 消息访问,方法 getRequest ()返回 Spark HTTP 请求实例。

true

布尔值

transferException (consumer)

如果对使用者端启用和交换失败处理,并且如果导致的例外在响应中作为应用程序/x-java-serialized-object 内容类型发送回序列化,则进行后定。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

urlDecodeHeaders (consumer)

如果启用了这个选项,则从 Spark to Camel Message 绑定到 Camel Message 时,标头值将被 URL 解码(例如 %20 将是空格)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

matchOnUriPrefix (advanced)

如果找不到完全匹配,则使用者是否应该尝试通过匹配 URI 前缀来查找目标使用者。

false

布尔值

sparkBinding (advanced)

使用自定义 SparkBinding 映射到/来自 Camel 消息。

 

SparkBinding

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

315.3. 使用 Spark 语法的路径

path 选项使用 Spark REST 语法来定义,您可以在其中使用对参数和 splat 的支持来定义 REST 上下文路径。如需更多相关信息,请参阅 Spark Java Route 文档。

以下是使用固定路径的 Camel 路由

from("spark-rest:get:hello")
  .transform().constant("Bye World");

以下路由使用了参数,该参数映射到带有键 "me" 的 Camel 标头。

from("spark-rest:get:hello/:me")
  .transform().simple("Bye ${header.me}");

315.4. 映射到 Camel 消息

Spark Request 对象作为 org.apache.camel.component.sparkrest.SparkMessage,它可以通过 getRequest 方法访问原始 Spark 请求。默认情况下,Spark 正文映射到 Camel 消息正文,任何 HTTP 标头 / Spark 参数都映射到 Camel 消息标头。对 Spark splat 语法有特殊支持,它通过键 splat 映射到 Camel 邮件标题。

例如,以下给定路由在上下文路径中使用 Spark splat (星号符号),我们可作为标头格式访问,以构造响应消息。

from("spark-rest:get:/hello/*/to/*")
  .transform().simple("Bye big ${header.splat[1]} from ${header.splat[0]}");

315.5. REST DSL

Apache Camel 提供了一个新的 Rest DSL,允许在 nice REST 样式中定义 REST 服务。例如,我们可以定义 REST hello 服务,如下所示:

return new RouteBuilder() {
    @Override
    public void configure() throws Exception {
          rest("/hello/{me}").get()
              .route().transform().simple("Bye ${header.me}");
      }
  };
<camelContext xmlns="http://camel.apache.org/schema/spring">
  <rest uri="/hello/{me}">
    <get>
      <route>
        <transform>
          <simple>Bye ${header.me}</simple>
        </transform>
      </route>
    </get>
  </rest>
</camelContext>

请参阅 Rest DSL 的更多详细信息。

315.6. 更多示例

Apache Camel 分发中存在 camel-example-spark-rest-tomcat 示例,它演示了如何在 Apache Tomcat 或类似 Web 容器的 web 应用程序中使用 camel-spark-rest。

第 316 章 SpEL 语言

可作为 Camel 版本 2.7 提供

Camel 允许 Spring Expression Language (SpEL) 用作 DSL 或 XML 配置中的表达式或 predicates。

注意

建议您在 Spring 运行时使用 SpEL。但是,从 Camel 2.21 开始,您可以在其他运行时使用 SpEL (在 Spring 运行时中没有运行 SpEL 无法正常工作)

316.1. 变量

以下变量可在 SpEL 语言编写的表达式和 predicates 中提供:

变量类型描述

Exchange

Exchange 是 root 对象

exchange

Exchange

Exchange 对象

例外

Throwable

Exchange 异常(如果有)

exchangeId

字符串

交换 ID

故障

消息

失败消息(如果有)

正文(body)

对象

IN 消息正文。

Request (请求)

消息

Exchange.in 消息

响应

消息

Exchange.out 消息(如果有)

属性

map

交换属性

property(name)

对象

给定名称中的 属性

property(name, type)

类型

给定名称中的 属性作为给定类型

316.2. 选项

SpEL 语言支持 1 选项,它们如下所列。

名称默认Java 类型描述

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

316.3. Samples

316.3.1. 表达式模板

启用表达式时,SpEL 表达式需要被 #{ } 分隔符括起。这可让您将 SpEL 表达式与常规文本合并,并使用它作为非常轻量级的模板语言。

例如,如果您构建以下路由:

from("direct:example")
    .setBody(spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}"))
    .to("mock:result");

在上面的路由中,注意 spel 是一个静态方法,我们需要从 org.apache.camel.language.spel.SpelExpression.spel 导入到 setBody 方法中传递的表达式。虽然我们使用 fluent API,但我们可以这样做:

from("direct:example")
    .setBody().spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}")
    .to("mock:result");

请注意,我们现在使用 setBody () 方法的 spel 方法。这不要求我们从 org.apache.camel.language.spel.SpelExpression.spel 静态导入 spel 方法。

并发送一个在正文中带有字符串 "World" 的消息,以及带有值 "dayOrNight" 的标头 "dayOrNight":

template.sendBodyAndHeader("direct:example", "World", "dayOrNight", "day");

mock:result 上的输出为 "Hello World!什么 autiful day"

316.3.2. Bean 集成

您可以在 SpEL 表达式中引用 registry 中定义的 Bean (很可能是 应用程序Context)。例如,如果您在 应用程序Context 中有一个名为"foo"的 bean,您可以在这个 bean 中调用 "bar" 方法,如下所示:

#{@foo.bar == 'xyz'}

316.3.3. 企业集成模式中的 SpEL

您可以使用 SpEL 作为 Recipient ListMessage Filter 中的 predicate 的表达式:

<route>
  <from uri="direct:foo"/>
  <filter>
    <spel>#{request.headers['foo'] == 'bar'}</spel>
    <to uri="direct:bar"/>
  </filter>
</route>

以及 Java DSL 中的等效功能:

from("direct:foo")
    .filter().spel("#{request.headers['foo'] == 'bar'}")
    .to("direct:bar");

316.4. 从外部资源载入脚本

可从 Camel 2.11 开始

您可以对脚本进行外部化,并使 Camel 从资源(如 "classpath:""file:""http:" )加载。
这可通过以下语法完成: "resource:scheme:location",例如参考类路径上的文件,您可以执行以下操作:

.setHeader("myHeader").spel("resource:classpath:myspel.txt")

第 317 章 Splunk 组件

作为 Camel 版本 2.13 可用

Splunk 组件使用 Splunk 提供的 客户端 api 提供访问 Splunk,它可让您在 Splunk 中发布和搜索事件。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

 <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-splunk</artifactId>
        <version>${camel-version}</version>
    </dependency>

317.1. URI 格式

  splunk://[endpoint]?[options]

317.2. 制作者端点:

端点描述

stream

若未指定,将数据流到指定索引或默认值。当使用流模式时,Splunk 在事件进入索引前,Splunk 在事件到索引之前具有一些内部缓冲区(关于 1MB 或 so)。如果您需要实时,最好使用提交或 tcp 模式。

submit

提交模式.如果未指定,使用 Splunk rest api 将事件发布到指定的索引或默认值。

tcp

TCP 模式。将数据流化到 tcp 端口,并在 Splunk 中需要一个开放的接收器端口。

在发布事件时,消息正文应包含 SplunkEvent。  请参阅消息正文中的注释。

示例

      from("direct:start").convertBodyTo(SplunkEvent.class)
          .to("splunk://submit?username=user&password=123&index=myindex&sourceType=someSourceType&source=mySource")...

在本例中,需要一个转换器来转换为 SplunkEvent 类。

317.3. 消费者端点:

端点描述

normal

执行正常的搜索,并在搜索选项中要求搜索查询。

savedsearch

根据在 splunk 中保存的搜索查询执行搜索,并在 savedSearch 选项中要求查询的名称。

示例

      from("splunk://normal?delay=5s&username=user&password=123&initEarliestTime=-10s&search=search index=myindex sourcetype=someSourcetype")
          .to("direct:search-result");

Camel-splunk 在正文中通过 SplunkEvent 创建每个搜索结果的路由交换。

317.4. URI 选项

Splunk 组件支持 2 个选项,它们如下所列。

名称描述默认类型

splunkConfiguration Factory (高级)

使用 SplunkConfigurationFactory

 

SplunkConfiguration Factory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Splunk 端点使用 URI 语法配置:

splunk:name

使用以下路径和查询参数:

317.4.1. 路径名(1 参数):

名称描述默认类型

name

所需的 名称没有目的

 

字符串

317.4.2. 查询参数(42 参数):

名称描述默认类型

app (common)

Splunk 应用程序

 

字符串

connectionTimeout (common)

连接到 Splunk 服务器时的 MS 超时

5000

int

host (common)

Splunk 主机.

localhost

字符串

owner (common)

Splunk 所有者

 

字符串

port (common)

Splunk 端口

8089

int

scheme (common)

Splunk 方案

https

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

count (consumer)

表示要返回的最大实体数的数字。

 

int

earliestTime (consumer)

搜索时间窗最早的时间。

 

字符串

initEarliestTime (consumer)

初始搜索开始偏移

 

字符串

latestTime (consumer)

搜索时间窗的最新时间。

 

字符串

savedSearch (consumer)

运行 Splunk 中保存的查询的名称

 

字符串

搜索 (消费者)

要运行的 Splunk 查询

 

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

streaming (consumer)

设置流传输模式。流模式会在收到交换时发送交换,而不是在批处理中发送。

 

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

eventHost (producer)

覆盖默认的 Splunk 事件主机字段

 

字符串

index (producer)

Splunk 索引以写入

 

字符串

raw (producer)

应将有效负载插入原始数据

false

布尔值

source (producer)

Splunk 源参数

 

字符串

sourceType (producer)

Splunk sourcetype 参数

 

字符串

tcpReceiverPort (producer)

Splunk tcp 接收器端口

 

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

密码 (安全)

Splunk 的密码

 

字符串

sslProtocol (security)

将 ssl 协议设置为使用

TLSv1.2

SSLSecurityProtocol

username (security)

Splunk 的用户名

 

字符串

useSunHttpsHandler (security)

使用 sun.net.www.protocol.https.Handler Https 处理程序建立 Splunk 连接。在应用服务器中运行以避免 app. server https 处理时很有用。

false

布尔值

317.5. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.splunk.enabled

启用 splunk 组件

true

布尔值

camel.component.splunk.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.splunk.splunk-configuration-factory

使用 SplunkConfigurationFactory。选项是一个 org.apache.camel.component.splunk.SplunkConfigurationFactory 类型。

 

字符串

317.6. 邮件正文

Splunk 在键/值对中运行数据。SplunkEvent 类是此类数据的占位符,应该位于制作者的消息正文中。同样,每次消费者的搜索结果都会在正文中返回。

从 Camel 2.16.0 开始,您可以通过设置制作者端点上的 raw 选项,向 Splunk 发送原始数据。这可用于使用 Splunk 在支持时构建的 eg. json/xml 和其他有效负载。 

317.7. 使用案例

搜索 Twitter,了解带有 music 的二十位,并将事件发布到 Splunk

      from("twitter://search?type=polling&keywords=music&delay=10&consumerKey=abc&consumerSecret=def&accessToken=hij&accessTokenSecret=xxx")
          .convertBodyTo(SplunkEvent.class)
          .to("splunk://submit?username=foo&password=bar&index=camel-tweets&sourceType=twitter&source=music-tweets");

要将 Tweet 转换为 SplunkEvent,您可以使用类似如下的转换程序

@Converter
public class Tweet2SplunkEvent {
    @Converter
    public static SplunkEvent convertTweet(Status status) {
        SplunkEvent data = new SplunkEvent("twitter-message", null);
        //data.addPair("source", status.getSource());
        data.addPair("from_user", status.getUser().getScreenName());
        data.addPair("in_reply_to", status.getInReplyToScreenName());
        data.addPair(SplunkEvent.COMMON_START_TIME, status.getCreatedAt());
        data.addPair(SplunkEvent.COMMON_EVENT_ID, status.getId());
        data.addPair("text", status.getText());
        data.addPair("retweet_count", status.getRetweetCount());
        if (status.getPlace() != null) {
            data.addPair("place_country", status.getPlace().getCountry());
            data.addPair("place_name", status.getPlace().getName());
            data.addPair("place_street", status.getPlace().getStreetAddress());
        }
        if (status.getGeoLocation() != null) {
            data.addPair("geo_latitude", status.getGeoLocation().getLatitude());
            data.addPair("geo_longitude", status.getGeoLocation().getLongitude());
        }
        return data;
    }
}

搜索 Splunk 以获得调整信息

      from("splunk://normal?username=foo&password=bar&initEarliestTime=-2m&search=search index=camel-tweets sourcetype=twitter")
          .log("${body}");

317.8. 其他注释

Splunk 附带各种选项,可用于利用预置型应用程序的数据进行分析和显示。
例如,jmx 应用可用于发布 jmx 属性,如 eg. route 和 jvm 指标到 Splunk,并在仪表板中显示此属性。

317.9. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 318 章 Spring 支持

Apache Camel 旨在以多种方式与 Spring Framework 配合工作。

  • Camel 使用 Spring 事务作为组件(如 JMSJPA)的默认事务处理
  • Camel 与 Spring 2 XML 处理与 Xml 配置配合使用
  • Camel Spring XML Schema 在 Xml Reference中定义
  • Camel 支持强大的 Spring Remoting 版本,可在客户端和服务器端使用强大的路由,同时使用所有可用组件进行传输
  • Camel 提供强大的 Bean 集成与 Spring ApplicationContext 中定义的任何 bean
  • Camel 与各种 Spring 帮助程序类集成;例如,为 Spring 资源提供 Type Converter 支持
  • 允许 Spring 依赖关系注入组件实例或 CamelContext 实例本身,以及作为组件和端点自动公开的 Spring Bean。
  • 您可以利用 企业集成模式 和 Camel 强大的 MockTest 端点来重复使用 Spring 测试框架,以简化您的单元和集成测试
  • 从 Camel 2.15 开始,Clal -spring-boot 组件支持 Spring Boot。

318.1. 使用 Spring 配置 CamelContext

您可以使用 CamelContextFactoryBean 在 spring.xml 中配置 CamelContext。这将自动启动 CamelContext 以及任何引用的路由以及任何引用的组件和端点实例。

  • 添加 Camel 模式
  • 通过两种方式配置路由:

    • 使用 Java 代码
    • 使用 Spring XML

318.2. 添加 Camel Schema

对于 Camel 1.x,您需要使用以下命名空间:

http://activemq.apache.org/camel/schema/spring

使用以下架构位置:

http://activemq.apache.org/camel/schema/spring/camel-spring.xsd

您需要将 Camel 添加到 schemaLocation 声明中

http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd

因此,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">

318.2.1. 使用 camel: namespace

或者您可以在 XML 声明中引用 camel XSD:

xmlns:camel="http://camel.apache.org/schema/spring"
  1. 因此,声明为:
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       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">
  1. 然后,使用 camel: 命名空间前缀,您可以省略内联命名空间声明:
<camel:camelContext id="camel5">
  <camel:package>org.apache.camel.spring.example</camel:package>
</camel:camelContext>

318.2.2. 使用 Spring 进行高级配置

请参阅 使用 Spring 的 CamelContext 高级配置的详情

$# using Java Code

您可以使用 Java Code 定义 RouteBuilder 实施。它们可定义为 spring 中的 bean,然后在您的 camel 上下文 e.g 中引用。

318.2.3. 使用 <package>

Camel 还提供了一项强大的功能,允许在给定软件包中自动发现和初始化路由。这可以通过在 spring 上下文定义中添加标签到 camel 上下文定义,指定要递归地搜索 RouteBuilder 实现的软件包。要在 1.X 中使用这个功能,需要一个 <package></package> 标签,指定应当搜索的以逗号分隔的软件包列表。

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <package>org.apache.camel.spring.config.scan.route</package>
  </camelContext>

警告:在将软件包名称指定为 org.apache.camel 或这个子软件包时要小心。这会导致 Camel 在自己的软件包中搜索可能会导致您的路由出现问题。

INFO:* 将忽略已经实例化的类*。<package> 和 <packageScan> 将跳过任何已经由 Spring etc 创建的类。因此,如果您将路由构建器定义为 spring bean 标签,则将跳过该类。您可以使用 < routeBuilder ref="theBeanId"/> 或 < contextScan> 功能包含这些 Bean。

318.2.4. 使用 <packageScan>

在 Camel 2.0 中,这个问题已被解决,允许使用 Ant (如路径匹配)有选择性包含和排除发现的路由类。在 spring 中,这通过添加 <packageScan/> 标签来指定。标签必须包含一个或多个 'package' 元素(类似于 1.x),以及可选的一个或多个 'includes' 元素,指定要应用到所发现类的完全限定域名的模式。例如:

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <packageScan>
      <package>org.example.routes</package>
      <excludes>**.*Excluded*</excludes>
      <includes>**.*</includes>
    </packageScan>
  </camelContext>

排除的模式在包括模式前应用。如果没有定义 include 或 exclude 模式,则返回软件包中发现的所有 Route 类。

在上例中,camel 将扫描所有 'org.example.routes' 软件包和 RouteBuilder 类的任何子软件包。说明扫描会找到两个 RouteBuilders,一个位于 org.example.routes 中名为"MyRoute",另一个名为"MyExcludedRoute" (子软件包")。提取每个类的完全限定名称(org.example.routes.MyRoute, org.example.routes.excluded.MyExcludedRoute),同时应用 include 和 exclude 模式。

exclude pattern *.*Excluded 将与 fqcn 'org.example.routes.excluded.MyExcludedRoute' 和 veto camel 从初始化它匹配。

在介绍的下面,这使用 Spring 的 AntPatternMatcher 实施,其匹配如下

? matches one character
* matches zero or more characters
** matches zero or more segments of a fully qualified name

例如:

*.*excluded 会与 org.simple.Excluded, org.apache.camel.SomeExcludedRoute 或 org.example.RouteWhichIsExcluded

*.?cluded 将与 org.simple.IncludedRoute 和 org.simple.ExcludedRoute 匹配 org.simple.PrecludedRoute

318.2.5. 使用 contextScan

可作为 Camel 2.4 提供

您可以允许 Camel 扫描容器上下文,例如 Spring ApplicationContext 以用于路由构建器实例。这可让您使用 Spring < component-scan&gt; 功能,并让 Camel 选取任何由 Spring 在扫描过程中创建的 RouteBuilder 实例。

这可让您使用 Spring @Component 注解路由,并将这些路由包含在 Camel 中

@Component
public class MyRoute extends SpringRouteBuilder {

    @Override
    public void configure() throws Exception {
        from("direct:start").to("mock:result");
    }
}

您还可以使用 ANT 风格进行包含和排除,如 < packageScan&gt; 文档中所述。

318.3. 如何从其他 XML 文件导入路由

可作为 Camel 2.3 提供

当使用 Xml 配置 在 Camel 中定义路由时,您可能需要在其他 XML 文件中定义一些路由。例如,您可能有多个路由,如果某些路由位于单独的 XML 文件中,则可能有助于维护应用程序。您可能还想将通用和可重复使用的路由存储在其他 XML 文件中,您可以在需要时轻松导入。

Camel 2.3 中,现在可以定义您在新 &lt ; routeContext/> tag 中进行的 <camel Context/> 外部的路由。

注意: 当您使用 <routeContext> 时,它们会被分隔,且无法重复使用现有的 <onException>、<intercept>、<dataFormats> 和类似在 <camelContext> 中定义的跨域功能。换句话说,<routeContext> 当前是隔离的。这可能会改变 Camel 3.x。

例如,我们可以有一个名为 myCoolRoutes.xml 的文件,其中包含几个路由,如下所示:

myCoolRoutes.xml

然后,在包含 CamelContext 的 XML 文件中,您可以使用 Spring 导入 myCoolRoute.xml 文件。
然后,在 <camelContext/& gt; 内,您可以通过其 ID 引用 <routeContext />,如下所示:

另请注意,您可以混合和匹配 CamelContext 中的路由,并在 RouteContext 中进行外部化。

您可以像这样一样拥有数量的 <routeContextRef />。

可重复使用路由

< routeContext/& gt; 中定义的路由可以被多个 < camelContext/> 重复使用。但是,它只有重复使用的定义。在运行时,每个 CamelContext 将根据定义创建自己的路由实例。

318.3.1. 测试时间线索.

在测试时,通常需要能够选择性地将匹配路由从不能供测试场景使用或有用的路由。例如,您可能在 'org.example.routes' 软件包中有一个 spring 上下文文件 routes-context.xml 和三个 Route builder RouteA、RouteB 和 RouteC。packageScan 定义将发现所有这些路由中的所有三个路由,并初始化它们。

称 RouteC 不适用于我们的测试方案,并在测试过程中生成大量 noise。在这个特定测试中可以排除此路由会很方便。SpringTestSupport 类已被修改以允许执行此操作。它提供了两个方法(excludedRoute 和 excludeRoutes),可覆盖这些方法,以排除单个类或一组类。

public class RouteAandRouteBOnlyTest extends SpringTestSupport {
    @Override
    protected Class excludeRoute() {
        return RouteC.class;
    }
}

为了通过 spring 初始化 camelContext 初始化 hook,排除了 MyExcludedRouteBuilder.class,我们需要截获 spring 上下文创建。当覆盖 createApplicationContext 以创建 spring 上下文时,我们会调用 getRouteExcludingApplicationContext ()方法提供处理排除的特殊父 spring 上下文。

@Override
protected AbstractXmlApplicationContext createApplicationContext() {
    return new ClassPathXmlApplicationContext(new String[] {"routes-context.xml"}, getRouteExcludingApplicationContext());
}

现在初始化中排除 RouteC。同样,在仅测试 RouteC 的另一个测试中,我们可以通过覆盖来排除 RouteB 和 RouteA

@Override
protected Class[] excludeRoutes() {
    return new Class[]{RouteA.class, RouteB.class};
}

318.4. 使用 Spring XML

您可以使用 Spring 2.0 XML 配置为路由指定 Xml 配置,如以下示例。http://svn.apache.org/repos/asf/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/routingUsingCamelContextFactory.xml

318.5. 配置组件和端点

您可以在 Spring XML 中配置组件或端点实例 ,如下例所示

它允许您使用某些名称(上例中的activemq)配置组件,然后使用 activemq:[queue:|topic:]destinationName 来引用该组件。这由 SpringCamelContext lazily 从 spring 上下文获取您用于 Endpoint URI 的方案名称。

详情请查看 配置端点和组件

318.6. CamelContextAware

如果您要在 POJO 内与 CamelContext 注入一起,只需实施 CamelContextAware 界面,则当 Spring 创建 POJO 时,CamelContext 将注入到 POJO 中。另外,请参阅 Bean 集成 来进一步注入。

318.7. 集成测试

在使用 Spring 事务进行测试时,为了避免挂起的路由,请参阅有关交易客户端下的 Spring Integration Testing 的注释。

318.8. 另请参阅

第 319 章 Spring Batch 组件

作为 Camel 2.10 版本提供

spring-batch: 组件和支持类在 Camel 和 Spring Batch 基础架构之间提供集成桥接。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-batch</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

319.1. URI 格式

spring-batch:jobName[?options]

其中 jobName 代表 Camel registry 中的 Spring Batch 作业名称。或者,如果提供了 JobRegistry,它将用于定位作业。

警告:此组件只能用于定义制作者端点,这意味着您无法在 from () 语句中使用 Spring Batch 组件。

319.2. 选项

Spring Batch 组件支持 3 个选项,它们如下。

名称描述默认类型

jobLauncher (producer)

明确指定要使用的 JobLauncher。

 

JobLauncher

jobRegistry (producer)

明确指定要使用的 JobRegistry。

 

JobRegistry

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Spring Batch 端点使用 URI 语法配置:

spring-batch:jobName

使用以下路径和查询参数:

319.2.1. 路径名(1 参数):

名称描述默认类型

jobName

需要 registry 中的 Spring Batch 作业名称。

 

字符串

319.2.2. 查询参数(4 参数):

名称描述默认类型

jobFromHeader (producer)

明确定义是否应该从标头而不是 URI 获取 jobName。

false

布尔值

jobLauncher (producer)

明确指定要使用的 JobLauncher。

 

JobLauncher

jobRegistry (producer)

明确指定要使用的 JobRegistry。

 

JobRegistry

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

319.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.spring-batch.enabled

启用 spring-batch 组件

true

布尔值

camel.component.spring-batch.job-launcher

明确指定要使用的 JobLauncher。选项是一个 org.springframework.batch.core.launch.JobLauncher 类型。

 

字符串

camel.component.spring-batch.job-registry

明确指定要使用的 JobRegistry。选项是一个 org.springframework.batch.core.configuration.JobRegistry 类型。

 

字符串

camel.component.spring-batch.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

319.4. 使用

当 Spring Batch 组件收到消息时,它将触发作业执行。该作业将使用 org.springframework.batch.core.launch.JobLaucher 实例根据以下算法解析:

  • 如果在组件上手动设置 JobLauncher,则使用它。
  • 如果在组件上设置了 jobLauncherRef 选项,则搜索 Camel Registry 以获取具有给定名称的 JobLauncher弃用并将在 Camel 3.0 中删除!
  • 如果在 jobLauncher 名称的 Camel Registry 中注册了 JobLauncher,则可使用它。
  • 如果上述任何步骤都不允许解决 JobLauncher,并且 Camel 注册表中只有一个 JobLauncher 实例,则使用它。

消息中找到的所有标头都作为作业参数传递给 JobLauncher字符串LongDoublejava.util.Date 值被复制到 org.springframework.batch.core.JobParametersBuilder - 其他数据类型将转换为 Strings。

319.5. 例子

触发 Spring Batch 任务执行:

from("direct:startBatch").to("spring-batch:myJob");

使用 JobLauncher 设置来触发 Spring Batch 作业执行。

from("direct:startBatch").to("spring-batch:myJob?jobLauncherRef=myJobLauncher");

JobLauncher 返回的 Camel 2.11.1 JobExecution 实例开始,由 SpringBatchProducer 作为输出消息转发。您可以使用 JobExecution 实例直接使用 Spring Batch API 执行一些操作。

from("direct:startBatch").to("spring-batch:myJob").to("mock:JobExecutions");
...
MockEndpoint mockEndpoint = ...;
JobExecution jobExecution = mockEndpoint.getExchanges().get(0).getIn().getBody(JobExecution.class);
BatchStatus currentJobStatus = jobExecution.getStatus();

319.6. 支持类

除了组件外,Camel Spring Batch 还提供支持类,这些类可用于在 Spring Batch 基础架构中 hook。

319.6.1. CamelItemReader

CamelItemReader 可用于直接从 Camel 基础架构读取批处理数据。

例如,以下示例代码片段将 Spring Batch 配置为从 JMS 队列中读取数据。

<bean id="camelReader" class="org.apache.camel.component.spring.batch.support.CamelItemReader">
  <constructor-arg ref="consumerTemplate"/>
  <constructor-arg value="jms:dataQueue"/>
</bean>

<batch:job id="myJob">
  <batch:step id="step">
    <batch:tasklet>
      <batch:chunk reader="camelReader" writer="someWriter" commit-interval="100"/>
    </batch:tasklet>
  </batch:step>
</batch:job>

319.6.2. CamelItemWriter

CamelItemWriterCamelItemReader 类似,但专用于写入已处理数据的块。

例如,以下示例代码片段将 Spring Batch 配置为从 JMS 队列中读取数据。

<bean id="camelwriter" class="org.apache.camel.component.spring.batch.support.CamelItemWriter">
  <constructor-arg ref="producerTemplate"/>
  <constructor-arg value="jms:dataQueue"/>
</bean>

<batch:job id="myJob">
  <batch:step id="step">
    <batch:tasklet>
      <batch:chunk reader="someReader" writer="camelwriter" commit-interval="100"/>
    </batch:tasklet>
  </batch:step>
</batch:job>

319.6.3. CamelItemProcessor

CamelItemProcessor 是 Spring Batch org.springframework.batch.item.ItemProcessor 接口的实现。后者的实施转发是 请求 Reply 模式,以将批处理项目处理委派给 Camel 基础架构。要处理的项目作为消息正文发送到 Camel 端点。

例如,下面的代码片段使用直接 端点和简单表达式语言 执行简单的批处理

<camel:camelContext>
  <camel:route>
    <camel:from uri="direct:processor"/>
    <camel:setExchangePattern pattern="InOut"/>
    <camel:setBody>
      <camel:simple>Processed ${body}</camel:simple>
    </camel:setBody>
  </camel:route>
</camel:camelContext>

<bean id="camelProcessor" class="org.apache.camel.component.spring.batch.support.CamelItemProcessor">
  <constructor-arg ref="producerTemplate"/>
  <constructor-arg value="direct:processor"/>
</bean>

<batch:job id="myJob">
  <batch:step id="step">
    <batch:tasklet>
      <batch:chunk reader="someReader" writer="someWriter" processor="camelProcessor" commit-interval="100"/>
    </batch:tasklet>
  </batch:step>
</batch:job>

319.6.4. CamelJobExecutionListener

CamelJobExecutionListenerorg.springframework.batch.core.JobExecutionListener 接口实施,将作业执行事件发送到 Camel 端点。

Spring Batch 生成的 org.springframework.batch.core.JobExecution 实例作为消息正文发送。要区分 before- 和 after-callbacks SPRING_BATCH_JOB_EVENT_TYPE 标头设置为 BEFOREAFTER 值。

以下示例片断会将 Spring Batch 作业执行事件发送到 JMS 队列。

<bean id="camelJobExecutionListener" class="org.apache.camel.component.spring.batch.support.CamelJobExecutionListener">
  <constructor-arg ref="producerTemplate"/>
  <constructor-arg value="jms:batchEventsBus"/>
</bean>

<batch:job id="myJob">
  <batch:step id="step">
    <batch:tasklet>
      <batch:chunk reader="someReader" writer="someWriter" commit-interval="100"/>
    </batch:tasklet>
  </batch:step>
  <batch:listeners>
    <batch:listener ref="camelJobExecutionListener"/>
  </batch:listeners>
</batch:job>

319.7. Spring Cloud

可作为 Camel 2.19 提供

Spring Cloud 组件

Maven 用户需要将以下依赖关系添加到其 pom.xml 中,才能使用此组件:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-cloud</artifactId>
    <version>${camel.version}</version> <!-- use the same version as your Camel core version -->
</dependency>

Camel -spring-cloud jar 与 spring.factories 文件一同推出,因此当将该依赖关系添加到类路径后,Spring Boot 会自动为您自动配置 Camel。

319.7.1. Camel Spring Cloud Starter

可作为 Camel 2.19 提供

要使用初学者,请在 spring boot pom.xml 文件中添加以下内容:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-cloud-starter</artifactId>
    <version>${camel.version}</version> <!-- use the same version as your Camel core version -->
</dependency>

319.8. Spring Cloud Consul

可作为 Camel 2.22 提供

319.9. Spring Cloud Zookeeper

可作为 Camel 2.22 提供

319.10. Spring Cloud Netflix

可作为 Camel 2.19 提供

Spring Cloud Netflix 组件桥接 Camel Cloud 和 Spring Cloud Netflix,因此您可以利用 Camel 中的 Spring Cloud Netflix 服务发现和负载均衡功能,您可以使用 Camel 服务发现实施,作为 Spring Cloud Netflix 的 Ribbon 负载 balabncer 的 ServerList 源。

Maven 用户需要将以下依赖关系添加到其 pom.xml 中,才能使用此组件:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-cloud-netflix</artifactId>
    <version>${camel.version}</version>
    <!-- use the same version as your Camel core version -->
</dependency>

Camel -spring-cloud-netflix jar 与 spring.factories 文件一同提供,因此一旦您会将该依赖项添加到类路径中,Spring Boot 将为您自动配置 Camel。

您可以使用以下属性禁用 Camel Spring Cloud Netflix:

# Enable/Disable the whole integration, default true
camel.cloud.netflix = true

# Enable/Disable the integration with Ribbon, default true
camel.cloud.netflix.ribbon = true

319.11. Spring Cloud Netflix Starter

可作为 Camel 2.19 提供

要使用初学者,请在 spring boot pom.xml 文件中添加以下内容:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-cloud-netflix-starter</artifactId>
    <version>${camel.version}</version>
    <!-- use the same version as your Camel core version -->
</dependency>

第 320 章 Spring 事件组件

作为 Camel 版本 1.4 可用

spring-event: 组件提供对 Spring ApplicationEvent 对象的访问。这可让您将 ApplicationEvent 对象发布到 Spring ApplicationContext 或使用它们。然后,您可以使用 企业集成模式 来处理它们,如 消息 Filter

320.1. URI 格式

spring-event://default[?options]

请注意,目前这个组件没有选项。这样就可以在将来的版本中轻松更改,请重新检查。

320.2. Spring 事件选项

Spring Event 组件没有选项。

Spring 事件端点使用 URI 语法配置:

spring-event:name

使用以下路径和查询参数:

320.2.1. 路径名(1 参数):

名称描述默认类型

name

端点的名称

 

字符串

320.2.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

320.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.spring-event.enabled

启用 spring-event 组件

true

布尔值

camel.component.spring-event.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.language.spel.enabled

启用 spel 语言

true

布尔值

camel.language.spel.trim

是否修剪值是否删除前导(尾随空格和换行符)

true

布尔值

320.4. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 321 章 Spring Integration 组件

作为 Camel 版本 1.4 可用

spring-integration: 组件为 Camel 组件提供桥接,以与 spring 集成端点 进行通信。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-integration</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

321.1. URI 格式

spring-integration:defaultChannelName[?options]

其中 defaultChannelName 代表 Spring Integration Spring 上下文使用的默认频道名称。它与 Spring Integration consumer 的 inputChannel 名称以及 Spring Integration provider 的 outputChannel 名称相同。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

321.2. 选项

Spring Integration 组件没有选项。

Spring Integration 端点使用 URI 语法配置:

spring-integration:defaultChannel

使用以下路径和查询参数:

321.2.1. 路径名(1 参数):

名称描述默认类型

defaultChannel

必需,默认频道名称供 Spring Integration Spring 上下文使用。它与 Spring Integration consumer 的 inputChannel 名称以及 Spring Integration provider 的 outputChannel 名称相同。

 

字符串

321.2.2. 查询参数(7 参数):

名称描述默认类型

inOut (common)

Spring 集成端点应使用的交换模式。如果 inOut=true,则应该来自 Spring Integration Message 标头或在端点上配置的回复频道。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

inputChannel (consumer)

此端点希望使用来自 Spring 集成的 Spring 集成输入频道名称。

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

outputChannel (producer)

用于向 Spring 集成发送消息的 Spring 集成输出频道名称。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

321.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.spring-integration.enabled

启用 spring-integration 组件

true

布尔值

camel.component.spring-integration.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

321.4. 使用

Spring 集成组件是一个网桥,通过 Spring 集成的输入频道和输出频道将 Camel 端点与 Spring 集成端点连接。使用这个组件,我们可以将 Camel 消息发送到 Spring Integration 端点,或者从 Camel 路由上下文中的 Spring 集成端点接收消息。

321.5. 例子

321.5.1. 使用 Spring 集成端点

您可以使用 URI 设置 Spring 集成端点,如下所示:

或者直接使用 Spring 集成频道名称:

321.5.2. 源和目标适配器

Spring 集成还提供 Spring 集成源和目标适配器,它可以将消息从 Spring 集成频道路由到 Camel 端点,或从 Camel 端点路由到 Spring 集成频道。

这个示例使用以下命名空间:

您可以将源或目标绑定到 Camel 端点,如下所示:

321.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

321.7. Spring Java 配置

Spring 开始使用 XML Config 将有线 bean 共同使用。然而,某些人并不喜欢使用 XML,而是使用 Java 代码,这导致与 Spring JavaConfig 项目一起创建 Guice。

您可以将 XML 或 Java 配置方法与 Camel 搭配使用;选择是您的最佳选择。

321.7.1. 使用 Spring Java 配置

要在 Camel 项目中使用 Spring Java Config,最简单的操作是将以下内容添加到您的 pom.xml 中

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-spring-javaconfig</artifactId>
  <version>${camel-version}</version>
</dependency>

然后,这会添加 Spring JavaConfig 库的依赖项以及用于在 Spring 中配置 Camel 的一些帮助程序类。

请注意,这个库完全是可选的;您只能将 Camel 与 Java 配置相连接。

321.7.2. 配置

使用带 Camel 的 JavaConfig 的最常见情况是创建具有供路由器使用的路由列表的配置。

@Configuration
public class MyRouteConfiguration extends CamelConfiguration {

    @Autowire
    private MyRouteBuilder myRouteBuilder;

    @Autowire
    private MyAnotherRouteBuilder myAnotherRouteBuilder;

    @Override
    public List<RouteBuilder> routes() {
        return Arrays.asList(myRouteBuilder, myAnotherRouteBuilder);
    }

}

从 Camel 2.13.0 开始,您可以跳过 routes () 定义,然后回退到 Spring 上下文中的 RouteBuilder 实例。

@Configuration
@ComponentScan("com.example.routes")
public class MyRouteConfiguration extends CamelConfiguration {
}

321.7.3. 测试

Camel 2.11.0 开始,您可以使用 CamelSpringJUnit4ClassRunner 以及 CamelSpringDelegatingTestContextLoader。这是测试 Java 配置和 Camel 集成的建议方法。

如果要创建 RouteBuilder 实例集合,请从 CamelConfiguration 帮助程序类中提取和实施 routes () 方法。请记住,如果没有覆盖 routes () 方法,则 Camel 2.13.0 开始,CamelConfiguration 将使用 Spring 上下文中提供的所有 RouteBuilder 实例。

以下示例演示了如何使用 Java Config 测试 Java 配置与 Camel 2.10 的集成,并更低。请记住,JavaConfigContextLoader 已被弃用,并可能代表 CamelSpringDelegatingTestContextLoader 在以后的 Camel 版本中删除。

@ContextConfiguration 注释告诉 Spring 测试框架,以加载 ContextConfig 类作为要使用的配置。此类从 SingleRouteCamelConfiguration 派生而来,它是一个帮助 Spring Java Config 类,为我们配置 CamelContext,然后注册我们创建的 RouteBuilder。

第 322 章 Spring LDAP 组件

作为 Camel 2.11 版本提供

spring-ldap: 组件为 Spring LDAP 提供 Camel 打包程序。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-ldap</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

322.1. URI 格式

spring-ldap:springLdapTemplate[?options]

其中 springLdapTemplateSpring LDAP Template bean 的名称。在这个 bean 中,您要配置 LDAP 访问的 URL 和凭证。

322.2. 选项

Spring LDAP 组件没有选项。

Spring LDAP 端点使用 URI 语法配置:

spring-ldap:templateName

使用以下路径和查询参数:

322.2.1. 路径名(1 参数):

名称描述默认类型

templateName

Spring LDAP 模板 bean 所需的 名称

 

字符串

322.2.2. 查询参数(3 参数):

名称描述默认类型

operation (producer)

需要执行 LDAP 操作。

 

LdapOperation

scope (producer)

搜索操作的范围。

subtree

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

322.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.spring-ldap.enabled

启用 spring-ldap 组件

true

布尔值

camel.component.spring-ldap.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

322.4. 使用

组件仅支持制作者端点。尝试创建消费者端点将导致 UnsupportedOperationException
消息的正文必须是映射( java.util.Map实例)。除非在 ContextSource 配置中指定基础 DN,否则此映射必须至少包含一个带有 key dn (没有为 function_driven 操作需要)的条目,用于指定要执行的 LDAP 操作的根节点。映射的其他条目是特定于操作的(参见下文)。

对于 bindunbind 操作,消息的正文不会改变。对于 search and function_driven 操作,正文被设置为搜索的结果,请参阅 http://static.springsource.org/spring-ldap/site/apidocs/org/springframework/ldap/core/LdapTemplate.html#search%28java.lang.String,%20java.lang.String,%20int,%20org.springframework.ldap.core.AttributesMapper%29

322.4.2. 绑定

消息正文必须具有一个键 属性 的条目。该值必须是 javax.naming.directory.Attributes 此条目的实例指定要创建的 LDAP 节点。

322.4.3. unbind

不需要进一步条目,删除具有指定 dn 的节点。

322.4.4. 验证

消息正文必须具有带有键 过滤器 和密码 的条目。该值必须是代表有效 LDAP 过滤器和用户密码的 String 实例。

322.4.5. 修改属性

消息正文必须具有一个带有密钥 modify Items 的条目。该值必须是类型为 javax.naming.directory.ModificationItem的任意数组的实例

322.4.6. function-Driven

消息正文必须具有键 函数请求 的条目。功能 值必须是 java.util.function.BiFunction<L, Q, S >。L type 参数必须是 org.springframework.ldap.core.LdapOperations 类型。请求 值必须与函数中的 Q 类型参数相同,它必须封装 函数 中被调用的 LdapTemplate 方法的预期参数。 S type 参数表示被调用的 LdapTemplate 方法返回的响应类型。此操作允许动态调用 LdapTemplate 方法,这些方法不是由上面提到的操作所涵盖的。

主要定义

为避免拼写错误,在 org.apache.camel.springldap.SpringLdapProducer 中定义以下常量:

  • public static final String DN = "dn"
  • 公共静态字符串 FILTER = "filter"
  • 公共静态字符串 ATTRIBUTES = "attributes"
  • 公共静态字符串 PASSWORD = "password";
  • public static final String MODIFICATION_ITEMS = "modificationItems";
  • 公共静态字符串:FUNCTION = "function";
  • public static final String REQUEST = "request";

第 323 章 Spring Redis 组件

作为 Camel 2.11 版本提供

此组件允许从 Redis 发送和接收消息。Redis 是高级键值存储,其中键可以包含字符串、哈希、列表、集合和排序。此外,它还为应用间通信提供 pub/sub 功能。
Camel 提供了一个生产程序,用于订阅 pub/sub 消息的使用者,用于过滤重复消息的幂等存储库。

INFO:*Prerequisites* 才能使用此组件,您必须运行 Redis 服务器。

323.1. URI 格式

spring-redis://host:port[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

323.2. URI 选项

Spring Redis 组件没有选项。

Spring Redis 端点使用 URI 语法配置:

spring-redis:host:port

使用以下路径和查询参数:

323.2.1. 路径名(2 参数):

名称描述默认类型

主机

需要运行 Redis 服务器的主机。

 

字符串

port

所需的 Redis 服务器端口号

 

整数

323.2.2. 查询参数(10 参数):

名称描述默认类型

channels (common)

要订阅的主题名称或名称模式列表。可以使用逗号分隔多个名称。

 

字符串

command (common)

默认命令,可通过邮件标题覆盖。请注意,使用者只支持以下命令:PSUBSCRIBE 和 SUBSCRIBE

SET

命令

connectionFactory (common)

引用预配置的 RedisConnectionFactory 实例。

 

RedisConnectionFactory

redisTemplate (common)

引用预先配置的 RedisTemplate 实例。

 

RedisTemplate

serializer (common)

引用预先配置的 RedisSerializer 实例。

 

RedisSerializer

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

listenerContainer (consumer)

引用预先配置的 RedisMessageListenerContainer 实例。

 

RedisMessageListener Container

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

323.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.spring-redis.enabled

启用 spring-redis 组件

true

布尔值

camel.component.spring-redis.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

323.4. 使用

另请参阅 https://github.com/apache/camel/tree/master/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis 的单元测试。

323.4.1. Redis producer 评估的消息标头

生产者向服务器发出命令,每个命令具有一套不同的参数,它们具有特定类型。命令执行的结果将在消息正文中返回。

hash 命令描述参数结果

HSET

设置 hash 字段的字符串值

CamelRedis.Key (字符串)、CamelRedis.Field (字符串)、CamelRedis.Value (Object)

void

HGET

获取 hash 字段的值

CamelRedis.Key (字符串)、CamelRedis.Field (字符串)

字符串

HSETNX

设置 hash 字段的值,只有在字段不存在时

CamelRedis.Key (字符串)、CamelRedis.Field (字符串)、CamelRedis.Value (Object)

void

HMSET

将多个 hash 字段设置为多个值

CamelRedis.Key (字符串)、CamelRedis.Values (Map<String, Object>)

void

HMGET

获取所有给定哈希字段的值

CamelRedis.Key (字符串)、CamelRedis.Fields (Collection<String>)

collection<Object>

HINCRBY

根据给定数量递增散列字段的整数值

CamelRedis.Key (字符串)、CamelRedis.Field (字符串)、CamelRedis.Value (Long)

Long

HEXISTS

确定 hash 字段是否存在

CamelRedis.Key (字符串)、CamelRedis.Field (字符串)

布尔值

HDEL

删除一个或多个 hash 字段

CamelRedis.Key (字符串)、CamelRedis.Field (字符串)

void

HLEN

获取哈希中的字段数

CamelRedis.Key (String)

Long

HKEYS

获取哈希中的所有字段

CamelRedis.Key (String)

Set<String>

HVALS

获取哈希中的所有值

CamelRedis.Key (String)

collection<Object>

HGETALL

获取哈希中的所有字段和值

CamelRedis.Key (String)

map<String, Object>

列出命令描述参数结果

RPUSH

在列表中附加一个或多个值

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

Long

RPUSHX

只有在列表存在时,附加一个值到列表中

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

Long

LPUSH

将一个或多个值添加到列表中

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

Long

LLEN

获取列表的长度

CamelRedis.Key (String)

Long

LRANGE

从列表中获取一系列元素

CamelRedis.Key (字符串)、CamelRedis.Start (Long)、CamelRedis.End (Long)

List<Object>

LTRIM

修剪到指定范围的列表

CamelRedis.Key (字符串)、CamelRedis.Start (Long)、CamelRedis.End (Long)

void

LINDEX

根据索引从列表中获取一个元素

CamelRedis.Key (字符串)、CamelRedis.Index (Long)

字符串

LINSERT

在列表中的另一个元素之前或之后插入元素

CamelRedis.Key (字符串)、CamelRedis.Value (Object)、CamelRedis.Pivot (字符串)、CamelRedis.Position (字符串)

Long

LSET

根据索引设置列表中元素的值

CamelRedis.Key (字符串)、CamelRedis.Value (Object)、CamelRedis.Index (Long)

void

LREM

从列表中删除元素

CamelRedis.Key (字符串)、CamelRedis.Value (Object)、CamelRedis.Count (Long)

Long

LPOP

删除并获取列表中的第一个元素

CamelRedis.Key (String)

对象

RPOP

删除并获取列表中的最后一个元素

CamelRedis.Key (String)

字符串

RPOPLPUSH

删除列表中的最后一个元素,将其附加到另一个列表并返回

CamelRedis.Key (字符串)、CamelRedis.Destination (字符串)

对象

BRPOPLPUSH

来自列表中的一个值,将其推送到另一个列表并返回它;或阻止一个值,直到列表可用

CamelRedis.Key (字符串)、CamelRedis.Destination (字符串)、CamelRedis.Timeout (Long)

对象

BLPOP

删除并获取列表中的第一个元素,或阻止一个元素可用

CamelRedis.Key (字符串)、CamelRedis.Timeout (Long)

对象

BRPOP

删除并获取列表中的最后一个元素,或者块(直到有可用)

CamelRedis.Key (字符串)、CamelRedis.Timeout (Long)

字符串

设置命令描述参数结果

SADD

为集合添加一个或多个成员

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

布尔值

SMEMBERS

获取集合中的所有成员

CamelRedis.Key (String)

Set<Object>

SREM

从集合中删除一个或多个成员

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

布尔值

SPOP

从集合中删除并返回随机成员

CamelRedis.Key (String)

字符串

SMOVE

将成员从一个设置移动到另一个集合

CamelRedis.Key (字符串)、CamelRedis.Value (Object)、CamelRedis.Destination (字符串)

布尔值

SCARD

获取集合中的成员数量

CamelRedis.Key (String)

Long

SISMEMBER

确定给定值是否为集合的成员

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

布尔值

SINTER

交集多个集合

CamelRedis.Key (字符串)、CamelRedis.Keys (字符串)

Set<Object>

SINTERSTORE

对多个集合进行交集,并将生成的集合存储在一个键中

CamelRedis.Key (字符串)、CamelRedis.Keys (字符串)、CamelRedis.Destination (字符串)

void

SUNION

添加多个集合

CamelRedis.Key (字符串)、CamelRedis.Keys (字符串)

Set<Object>

SUNIONSTORE

添加多个集合,并将生成的集合存储在一个键中

CamelRedis.Key (字符串)、CamelRedis.Keys (字符串)、CamelRedis.Destination (字符串)

void

SDIFF

减去多个集合

CamelRedis.Key (字符串)、CamelRedis.Keys (字符串)

Set<Object>

SDIFFSTORE

减去多个集合,并将生成的集合存储在一个键中

CamelRedis.Key (字符串)、CamelRedis.Keys (字符串)、CamelRedis.Destination (字符串)

void

SRANDMEMBER

从集合中获取一个或多个随机成员

CamelRedis.Key (String)

字符串

排序的集合命令描述参数结果

ZADD

向排序集添加一个或多个成员,如果其分数已存在,则更新其分数

CamelRedis.Key (字符串)、CamelRedis.Value (Object)、CamelRedis.Score (Double)

布尔值

ZRANGE

根据索引返回排序集合中的一系列成员

CamelRedis.Key (字符串)、CamelRedis.Start (Long)、CamelRedis.End (Long)、CamelRedis.WithScore (Boolean)

对象

ZREM

从排序集合中删除一个或多个成员

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

布尔值

ZINCRBY

递增排序集中成员的分数

CamelRedis.Key (字符串)、CamelRedis.Value (Object)、CamelRedis.Increment (Double)

ZRANK

确定排序集合中成员的索引

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

Long

ZREVRANK

确定排序集合中成员的索引,并将分数从高到低排序

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

Long

ZREVRANGE

返回按索引排序集的成员范围,分数从高到低排序

CamelRedis.Key (字符串)、CamelRedis.Start (Long)、CamelRedis.End (Long)、CamelRedis.WithScore (Boolean)

对象

ZCARD

获取排序集合中的成员数量

CamelRedis.Key (String)

Long

ZCOUNT

计算在给定值中带有分数排序的成员

CamelRedis.Key (字符串)、CamelRedis.Min (Double)、CamelRedis.Max (Double)

Long

ZRANGEBYSCORE

根据分数返回排序集合中的一系列成员

CamelRedis.Key (字符串)、CamelRedis.Min (Double)、CamelRedis.Max (Double)

Set<Object>

ZREVRANGEBYSCORE

返回排序集合中的一系列成员,分数为从高到低排序的分数

CamelRedis.Key (字符串)、CamelRedis.Min (Double)、CamelRedis.Max (Double)

Set<Object>

ZREMRANGEBYRANK

删除给定索引中排序集的所有成员

CamelRedis.Key (字符串)、CamelRedis.Start (Long)、CamelRedis.End (Long)

void

ZREMRANGEBYSCORE

删除给定分数内排序集合的所有成员

CamelRedis.Key (字符串)、CamelRedis.Start (Long)、CamelRedis.End (Long)

void

ZUNIONSTORE

添加多个排序集,并将生成的排序集存储在新密钥中

CamelRedis.Key (字符串)、CamelRedis.Keys (字符串)、CamelRedis.Destination (字符串)

void

ZINTERSTORE

对多个排序集进行交集,并将结果排序存储在新密钥中

CamelRedis.Key (字符串)、CamelRedis.Keys (字符串)、CamelRedis.Destination (字符串)

void

字符串命令描述参数结果

SET

设置键的字符串值

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

void

GET

获取密钥值

CamelRedis.Key (String)

对象

STRLEN

获取存储在键中的值的长度

CamelRedis.Key (String)

Long

附加

在键中附加一个值

CamelRedis.Key (字符串)、CamelRedis.Value (字符串)

整数

SETBIT

在偏移时设置或清除存储在键中的字符串值的位

CamelRedis.Key (字符串)、CamelRedis.Offset (Long)、CamelRedis.Value (Boolean)

void

GETBIT

返回偏移值为键中存储的字符串值的位值

CamelRedis.Key (字符串)、CamelRedis.Offset (Long)

布尔值

SETRANGE

覆盖自指定偏移开头的字符串部分

CamelRedis.Key (字符串)、CamelRedis.Value (Object)、CamelRedis.Offset (Long)

void

GETRANGE

获取存储在键中的字符串的子字符串

CamelRedis.Key (字符串)、CamelRedis.Start (Long)、CamelRedis.End (Long)

字符串

SETNX

设置键的值,仅当键不存在时

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

布尔值

SETEX

设置密钥的值和过期

CamelRedis.Key (字符串)、CamelRedis.Value (Object)、CamelRedis.Timeout (Long)、SECONDS

void

DECRBY

根据给定数量递减键的整数值

CamelRedis.Key (字符串)、CamelRedis.Value (Long)

Long

DECR

将键的整数值减少一个

CamelRedis.Key (String),

Long

INCRBY

根据给定数量递增键的整数值

CamelRedis.Key (字符串)、CamelRedis.Value (Long)

Long

INCR

按一递增键的整数值

CamelRedis.Key (String)

Long

MGET

获取所有给定密钥的值

CamelRedis.Fields (Collection<String>)

List<Object>

MSET

将多个键设置为多个值

CamelRedis.Values(Map<String, Object>)

void

MSETNX

将多个键设置为多个值,仅当键都不存在时

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

void

GETSET

设置键的字符串值,并返回其旧值

CamelRedis.Key (字符串)、CamelRedis.Value (Object)

对象

密钥命令描述参数结果

EXISTS

确定是否存在密钥

CamelRedis.Key (String)

布尔值

DEL

删除密钥

CamelRedis.Keys (String)

void

TYPE

确定存储在密钥中的类型

CamelRedis.Key (String)

DataType

KEYS

查找与给定模式匹配的所有密钥

CamelRedis.Pattern (String)

collection<String>

RUNDOMKEY

从 keyspace 返回随机密钥

CamelRedis.Pattern (字符串)、CamelRedis.Value (字符串)

字符串

重命名

重命名密钥

CamelRedis.Key (String)

void

RENAMENX

重命名密钥,仅当新密钥不存在时

CamelRedis.Key (字符串)、CamelRedis.Value (字符串)

布尔值

过期

将密钥时间设置为实时(以秒为单位)

CamelRedis.Key (字符串)、CamelRedis.Timeout (Long)

布尔值

排序

对列表中的元素进行排序,设置或排序

CamelRedis.Key (String)

List<Object>

持久性

从密钥中删除过期

CamelRedis.Key (String)

布尔值

EXPIREAT

将密钥的过期设置为 UNIX 时间戳

CamelRedis.Key (字符串)、CamelRedis.Timestamp (Long)

布尔值

PEXPIRE

以毫秒为单位将密钥时间设置为实时

CamelRedis.Key (字符串)、CamelRedis.Timeout (Long)

布尔值

PEXPIREAT

将密钥的过期设置为以毫秒为单位指定的 UNIX 时间戳

CamelRedis.Key (字符串)、CamelRedis.Timestamp (Long)

布尔值

TTL

为密钥获取实时的时间

CamelRedis.Key (String)

Long

MOVE

将密钥移动到另一个数据库

CamelRedis.Key (字符串)、CamelRedis.Db (Integer)

布尔值

其它命令描述参数结果

MULTI

标记事务块的开头

none

void

DISCARD

丢弃 MULTI 后发出的所有命令

none

void

EXEC

执行 MULTI 后发出的所有命令

none

void

WATCH

查看给定密钥来确定 MULTI/EXEC 块的执行

CamelRedis.Keys (String)

void

UNWATCH

忘记所有观察的密钥

none

void

ECHO

回显给定字符串

CamelRedis.Value (String)

字符串

PING

Ping 服务器

none

字符串

退出

关闭连接

none

void

PUBLISH

将信息发送到频道

CamelRedis.Channel (字符串)、CamelRedis.Message (Object)

void

323.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中。

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-redis</artifactId>
    <version>${camel-version}</version>
</dependency>

其中 ${camel-version} 必须替换为 Camel 的实际版本(2.11 或更高版本)。

323.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 324 章 Spring Security

可作为 Camel 2.3 提供

camel-spring-security 组件为 Camel 路由提供基于角色的授权。它利用 Spring Security (以前称为 Acegi Security)提供的身份验证和用户服务,并添加了一个声明式、基于角色的策略系统来控制路由是否可由给定主体执行。

如果您不熟悉 Spring Security 身份验证和授权系统,请查看上面链接的 SpringSource 网站的当前参考文档。

324.1. 创建授权策略

对路由的访问由 SpringSecurityAuthorizationPolicy 对象的实例控制。策略对象包含运行一组端点所需的 Spring Security authority (角色)的名称,并引用用于决定当前主体是否已分配该角色的 Spring Security AuthenticationManagerAccessDecisionManager 对象。策略对象可以被配置为 Spring Bean,也可以使用 Spring XML 中的 &lt ;authorizationPolicy > 元素。

& lt;authorizationPolicy > 元素可包含以下属性:

名称默认值描述

id

null

唯一的 Spring Bean 标识符,用于引用路由中的策略(必需)

access

null

传递给访问决策管理器的 Spring Security authority 名称(必需)

authenticationManager

authenticationManager

上下文中 Spring Security AuthenticationManager 对象的名称

accessDecisionManager

accessDecisionManager

上下文中 Spring Security AccessDecisionManager 对象的名称

authenticationAdapter

DefaultAuthenticationAdapter

Camel 2.4 用于转换 javax.security.auth.Subject 中的 camel-spring-security AuthenticationAdapter 对象的名称,用于将 javax.security.auth.Subject 转换为 Spring Security Authentication 实例。

useThreadSecurityContext

true

如果在 Exchange .AUTHENTICATION 下的 In message 标头中找不到 javax.security.auth.auth.Subject,请检查 Spring Security SecurityContextHolder for Authentication 对象。

alwaysReauthenticate

false

如果设置为 true,则 SpringSecurityAuthorizationPolicy 将在每次访问策略时始终调用 AuthenticationManager.authenticate ()

324.2. 控制对 Camel 路由的访问

使用这个组件需要 Spring Security AuthenticationManagerAccessDecisionManager。以下是如何使用 Spring Security 命名空间在 Spring XML 中配置这些对象的示例:

现在,底层安全对象已设置,我们可使用它们来配置授权策略,并使用该策略控制对路由的访问:

在本例中,除非已验证或可以进行身份验证的 Spring Security Authentication 对象,否则不会执行端点 模拟:end,并且包含 ROLE_ADMIN 授权可由 SpringSecurityAuthorizationPolicy 定位。

324.3. 身份验证

获取用于授权的安全凭证的过程不是由此组件指定的。您可以自行编写处理器或组件,它们从交换中获取身份验证信息,具体取决于您的需要。例如,您可以创建一个处理器,从源自 Jetty 组件中的 HTTP 请求标头获取凭证。无论如何收集凭证,都需要将其放置在 In 消息或 SecurityContextHolder 中,以便 Camel Spring Security 组件可以访问它们:

import javax.security.auth.Subject;
import org.apache.camel.*;
import org.apache.commons.codec.binary.Base64;
import org.springframework.security.authentication.*;


public class MyAuthService implements Processor {
    public void process(Exchange exchange) throws Exception {
        // get the username and password from the HTTP header
        // http://en.wikipedia.org/wiki/Basic_access_authentication
        String userpass = new String(Base64.decodeBase64(exchange.getIn().getHeader("Authorization", String.class)));
        String[] tokens = userpass.split(":");

        // create an Authentication object
        UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(tokens[0], tokens[1]);

        // wrap it in a Subject
        Subject subject = new Subject();
        subject.getPrincipals().add(authToken);

        // place the Subject in the In message
        exchange.getIn().setHeader(Exchange.AUTHENTICATION, subject);

        // you could also do this if useThreadSecurityContext is set to true
        // SecurityContextHolder.getContext().setAuthentication(authToken);
    }
}

如果需要,SpringSecurityAuthorizationPolicy 将会自动验证 Authentication 对象。

在使用 SecurityContextHolder 而不是 Exchange.AUTHENTICATION 标头外,需要注意两个问题。首先,上下文拥有者使用 thread-local 变量来保存 身份验证 对象。跨线程边界的任何路由(如 sedajms )都将丢失 Authentication 对象。其次,Spring Security 系统似乎已验证了 身份验证 对象,并且具有角色(请参阅 Technical Overview 部分 5.3.1 了解更多信息)。

camel-spring-security 的默认行为是在 Exchange.AUTHENTICATION 标头中查找对象。此对象必须至少包含一个主体,它必须是 org.springframework.security.core.Authentication 的子类。您可以通过提供 org.apache.camel.component.spring.security. Authentication Adapter to your < authorizationPolicy > bean 来自定义 Subject to Authentication 对象的映射。如果您使用不使用 Spring Security 的组件,但确实提供 Subject,这很有用。目前,只有 CXF 组件会填充 Exchange.AUTHENTICATION 标头。

324.4. 处理身份验证和授权错误

如果 SpringSecurityAuthorizationPolicy 中的身份验证或授权失败,则将抛出 CamelAuthorizationException。这可使用 Camel 的标准异常处理方法处理方法,如 Exception Clause。CamelAuthorizationException 将具有对策略 ID 的引用,该策略会引用该例外情况,因此您可以根据策略处理错误以及异常类型:

<onException>
  <exception>org.springframework.security.authentication.AccessDeniedException</exception>
  <choice>
    <when>
      <simple>${exception.policyId} == 'user'</simple>
      <transform>
        <constant>You do not have ROLE_USER access!</constant>
      </transform>
    </when>
    <when>
      <simple>${exception.policyId} == 'admin'</simple>
      <transform>
        <constant>You do not have ROLE_ADMIN access!</constant>
      </transform>
    </when>
  </choice>
</onException>

324.5. 依赖项

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-spring-security</artifactId>
  <version>2.4.0</version>
</dependency>

这个依赖关系也会拉取到 org.springframework.security:spring-security-core:3.0.3.RELEASEorg.springframework.security:spring-security-config:3.0.3.RELEASE

324.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • 组件

第 325 章 Spring WebService Component

可作为 Camel 版本 2.6 提供。

重要

Red Hat JBoss Enterprise Application Platform (JBoss EAP)容器 不支持 Camel WebService, camel-spring-ws。如果您需要在 JBoss EAP 容器上实施 JAX-WS 端点,建议的方法是使用内置于 JBoss EAP 容器中的 Web 服务 子系统。这种方法会自动为您提供企业级的服务(包括管理、安全性等等)。如果您随后需要将 JAX-WS 端点与 Camel 路由集成,您可以在初始有效负载处理后将生成的 EndpointImpl bean 传递给 Camel 路由。

spring-ws: 组件允许您与 Spring Web Services 集成。它提供对 客户端的支持、访问 Web 服务和 服务器(包括创建您自己的合同优先 Web 服务)的支持。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-ws</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

INFO:*Dependencies* As of Camel 2.8 this component with Spring-WS 2.0.x (与 Camel 的其余部分相同)需要 Spring 3.0.x。较早版本的 Camel 版本发布了 Spring-WS 1.5.9,它与 Spring 2.5.x 和 3.0.x 兼容。要在 Spring 2.5.x 上运行较早版本的 camel-spring-ws,您需要添加 Spring 2.5.x 中的 spring-webmvc 模块。要在 Spring 3.0.x 上运行 Spring-WS 1.5.9,您需要从 Spring 3.0.x 排除 OXM 模块,因为此模块也包含在 Spring-WS 1.5.9 中(请参阅 此后期

325.1. URI 格式

此组件的 URI 方案如下

spring-ws:[mapping-type:]address[?options]

要公开 web 服务 映射类型,需要设置为以下任意一种:

映射类型描述

rootqname

提供 选项,以根据消息中包含的根元素的限定名称来映射 Web 服务请求。

soapaction

用于映射基于消息标题中指定的 SOAP 操作的 Web 服务请求。

uri

映射以特定 URI 为目标的 Web 服务请求。

xpathresult

用于根据对传入消息的 XPath 表达式 的评估来映射 Web 服务请求。评估结果应与端点 URI 中指定的 XPath 结果匹配。

beanname

允许您引用 org.apache.camel.component.spring.ws.bean.CamelEndpointDispatcher 对象,以便与现有的(legacy) 端点映射 (如 PayloadRootQNameEndpointMappingSoapActionEndpointMapping 等等)集成

作为使用者,该地址 应包含与指定映射类型相关的值(例如,SOAP 操作,XPath 表达式)。作为制作者,地址应设置为您调用的 Web 服务的 URI。

您可以使用以下格式在 URI 中附加查询 选项 ?option=value&option=value&…​

325.2. 选项

Spring WebService 组件支持 2 个选项,它们如下。

名称描述默认类型

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Spring WebService 端点使用 URI 语法进行配置:

spring-ws:type:lookupKey:webServiceEndpointUri

使用以下路径和查询参数:

325.2.1. 路径名(3 参数):

名称描述默认类型

type

如果使用端点映射,如果使用了端点映射。rootqname - 提供根据消息中包含的根元素的限定名称映射 web 服务请求的选项。soapaction - 用来根据消息的标头中指定的 SOAP 操作映射 web 服务请求。uri - order map web 服务请求以特定 URI. xpathresult - 用于映射以特定 URI. xpathresult - 用于根据 XPath 评估中的 web 服务请求来映射用于对传入消息的 web 服务请求。评估结果应当与端点 URI. beanname - 中指定的 XPath 结果匹配 - 允许您引用 org.apache.camel.component.spring.ws.bean.CamelEndpointspatcher 对象,以便与现有(传统)端点映射(传统)端点映射(如 PayloadRootQNameEndpointMapping、SoapActionEndpointMapping 等)集成

 

EndpointMappingType

lookupKey

如果使用端点映射

 

字符串

webServiceEndpointUri

用于制作者的默认 Web 服务端点 uri。

 

字符串

325.2.2. 查询参数(22 参数):

名称描述默认类型

messageFilter (common)

提供自定义 MessageFilter 的选项。例如,当您想自行处理标头或附加时。

 

MessageFilter

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

endpointDispatcher (consumer)

Spring org.springframework.ws.server.endpoint.MessageEndpoint (用于将 Spring-WS 收到的消息发送到 Camel 端点),以与现有(传统的)端点映射(如 PayloadRootQNameEndpointMapping、SapActionEndpointMapping 等)集成。

 

CamelEndpointDispatcher

endpointMapping (consumer)

引用 registry/ApplicationContext 中的 org.apache.camel.component.spring.ws.bean.CamelEndpointMapping。注册表中只需要一个 bean 来提供所有 Camel/Spring-WS 端点。此 Bean 由 MessageDispatcher 自动发现,并根据端点指定的特征(如 root QName、SOAP 操作等)将请求映射到 Camel 端点。)

 

CamelSpringWSEndpoint Mapping

表达式 (消费者)

XPath 表达式使用 when 选项 type=xpathresult。然后需要配置这个选项。

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

allowResponseAttachment Override (producer)

使用实际服务层中的附件覆盖 soap 响应附件的选项。如果调用的服务在设置为 true 时附加或者重写了 soap 附加选项,则允许在/out 消息附件中覆盖 soap 附加。

false

布尔值

allowResponseHeaderOverride (producer)

在实际服务层中使用标头信息覆盖/传出交换中的 soap 响应标头的选项。如果调用的服务在设置为 true 时附加或者重写了 soap 标头,允许在/out 消息标头中覆盖修改 soap 标头。

false

布尔值

faultAction (producer)

表示通过方法提供的 faultAction 响应 WS-Addressing Fault Action 标头的值。

 

URI

faultTo (producer)

表示通过方法提供的 faultAction 响应 WS-Addressing FaultTo 标头的值。

 

URI

messageFactory (producer)

提供自定义 WebServiceMessageFactory 选项。例如,您希望 Apache Axiom 处理 Web 服务消息而不是 SAAJ。

 

WebServiceMessage Factory

messageIdStrategy (producer)

提供自定义 MessageIdStrategy 来控制唯一消息 id 的生成选项。

 

MessageIdStrategy

messageSender (producer)

提供自定义 WebServiceMessageSender 的选项。例如,执行身份验证或使用替代传输

 

WebServiceMessage Sender

outputAction (producer)

表示方法提供的响应 WS-Addressing Action 标头的值。

 

URI

replyTo (producer)

表示通过方法提供的 replyTo 响应 WS-Addressing ReplyTo 标头的值。

 

URI

soapAction (producer)

在访问远程 Web 服务时包括 SOAP 请求中的 SOAP 操作

 

字符串

timeout (producer)

在使用制作者调用 webservice 时设置套接字读取超时(以毫秒为单位),请参阅 URLConnection.setReadTimeout ()和 CommonsHttpMessageSender.setReadTimeout ()。在使用内置消息发件人实现时,这个选项可以正常工作: CommonsHttpMessageSender 和 HttpUrlConnectionMessageSender。这些实施之一将默认用于基于 HTTP 的服务,除非您自定义提供给组件的 Spring WS 配置选项。如果您使用非标准发件人,则假定您要处理自己的超时配置。内置消息 sender HttpComponentsMessageSender 被视为被视为已经弃用的 CommonsHttpMessageSender,请参阅 HttpComponentsMessageSender.setReadTimeout ()。

 

int

webServiceTemplate (producer)

提供自定义 WebServiceTemplate 的选项。这允许完全控制客户端 Web 服务处理;例如添加自定义拦截器或指定故障解析器、消息发件人或消息工厂。

 

WebServiceTemplate

wsAddressingAction (producer)

WS-Addressing 1.0 操作标头,以便在访问 Web 服务时包括。To 标头设置为端点 URI 中指定的 web 服务的地址(默认的 Spring-WS 行为)。

 

URI

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

325.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.spring-ws.enabled

启用 spring-ws 组件

true

布尔值

camel.component.spring-ws.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.spring-ws.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

325.3.1. 邮件标题

名称类型描述

CamelSpringWebserviceEndpointUri

字符串

您作为客户端访问的 Web 服务的 URI,覆盖端点 URI 的地址 部分

CamelSpringWebserviceSoapAction

字符串

指定消息的 SOAP 操作的标头(如果存在)覆盖 soapAction 选项

CamelSpringWebserviceSoapHeader

Camel 2.11.1: 使用此标头指定消息的 SOAP 标头。

CamelSpringWebserviceAddressingAction

URI

使用此标头指定消息的 WS-Addressing 操作,在存在时会覆盖 wsAddressingAction 选项

CamelSpringWebserviceAddressingFaultTo

URI

使用此标头指定 WS-Addressing FaultTo,则会覆盖 faultTo 选项(如果存在)

CamelSpringWebserviceAddressingReplyTo

URI

使用此标头指定 WS-Addressing ReplyTo,在存在时覆盖 replyTo 选项

CamelSpringWebserviceAddressingOutputAction

URI

使用此标头指定 WS-Addressing Action,如果存在,则覆盖 outputAction 选项

CamelSpringWebserviceAddressingFaultAction

URI

使用此标头指定 WS-Addressing Fault Action,覆盖 faultAction 选项(如果存在)

325.4. 访问 Web 服务

要在 http://foo.com/bar 中调用 Web 服务,只需定义路由:

from("direct:example").to("spring-ws:http://foo.com/bar")

并发送了一个信息:

template.requestBody("direct:example", "<foobar xmlns=\"http://foo.com\"><msg>test message</msg></foobar>");

请记住,如果要调用 SOAP 服务,则不必包含 SOAP 标签。spring-WS 将执行 XML 至 SOAP 总结。

325.5. 发送 SOAP 和 WS-Addressing 操作标头

当远程 web 服务需要 SOAP 操作或使用 WS-Addressing 标准时,您可以将路由定义为:

from("direct:example")
.to("spring-ws:http://foo.com/bar?soapAction=http://foo.com&wsAddressingAction=http://bar.com")

另外,您还可以使用标头值覆盖端点选项:

template.requestBodyAndHeader("direct:example",
"<foobar xmlns=\"http://foo.com\"><msg>test message</msg></foobar>",
SpringWebserviceConstants.SPRING_WS_SOAP_ACTION, "http://baz.com");

325.6. 使用 SOAP 标头

可从 Camel 2.11.1 开始

当向 spring-ws 端点发送消息时,您可以提供 SOAP 标头作为 Camel 消息标头,例如在 String 中给定以下 SOAP 标头

String body = ...
String soapHeader = "<h:Header xmlns:h=\"http://www.webserviceX.NET/\"><h:MessageID>1234567890</h:MessageID><h:Nested><h:NestedID>1111</h:NestedID></h:Nested></h:Header>";

我们可以在 Camel 消息上设置正文和标题,如下所示:

exchange.getIn().setBody(body);
exchange.getIn().setHeader(SpringWebserviceConstants.SPRING_WS_SOAP_HEADER, soapHeader);

然后,将 Exchange 发送到 spring-ws 端点来调用 Web 服务。

同样,spring-ws 使用者也将通过 SOAP 标头丰富的 Camel 消息。

有关一个示例,请参见以下 单元测试

325.7. 标头和附加传播

Spring WS Camel 支持从版本 2.10.3 开始传播标题,并将其附加到 Spring-WS WebServiceMessage 响应。端点将使用名为"hook"的 MessageFilter (默认实现由 BasicMessageFilter 提供),以传播交换标头和附件到 WebServiceMessage 响应。现在,您可以使用

exchange.getOut().getHeaders().put("myCustom","myHeaderValue")
exchange.getIn().addAttachment("myAttachment", new DataHandler(...))

注: 如果管道中的交换标头包含文本,它会在 soap 标头中生成 Qname (key)=value 属性。建议是直接创建一个 QName 类,并将任意键放入标题中。

325.8. 如何使用样式表转换 soap 标头

标头转换过滤器(HeaderTransformationMessageFilter.java)可用于转换 soap 请求的 soap 标头。如果要使用标头转换过滤器,请查看以下示例:

<bean id="headerTransformationFilter" class="org.apache.camel.component.spring.ws.filter.impl.HeaderTransformationMessageFilter">
    <constructor-arg index="0" value="org/apache/camel/component/spring/ws/soap-header-transform.xslt"/>
</bean

使用 camel 端点中定义的 bead

<route>
    <from uri="direct:stockQuoteWebserviceHeaderTransformation"/>
    <to uri="spring-ws:http://localhost?webServiceTemplate=#webServiceTemplate&amp;soapAction=http://www.stockquotes.edu/GetQuote&amp;messageFilter=#headerTransformationFilter"/>
</route>

325.9. 如何使用 MTOM 附加

BasicMessageFilter 为 Apache Axiom 提供所有必需信息,以生成 MTOM 信息。如果要在 Apache Axiom 中使用 Apache Camel Spring WS,以下示例: - 简化了消息Factory 为 bellow,Spring-WS 将使用 MTOM 策略填充您的 SOAP 消息并带有优化的附件。

<bean id="axiomMessageFactory"
class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
<property name="payloadCaching" value="false" />
<property name="attachmentCaching" value="true" />
<property name="attachmentCacheThreshold" value="1024" />
</bean>
  • 将 添加到 pom.xml 中以下依赖项
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-impl</artifactId>
<version>1.2.13</version>
<scope>runtime</scope>
</dependency>
  • 将附件添加到管道中,例如使用 Processor 实现。
private class Attachement implements Processor {
public void process(Exchange exchange) throws Exception
{ exchange.getOut().copyFrom(exchange.getIn()); File file = new File("testAttachment.txt"); exchange.getOut().addAttachment("test", new DataHandler(new FileDataSource(file)));  }
}
  • 将端点(生成器)定义为 ussual,如下所示:
from("direct:send")
.process(new Attachement())
.to("spring-ws:http://localhost:8089/mySoapService?soapAction=mySoap&messageFactory=axiomMessageFactory");
  • 现在,您的制作者将通过 otpmized attachments 生成 MTOM 消息。

325.10. 自定义标头和附加过滤

如果您需要提供标题或附加的自定义处理,请扩展现有的 BasicMessageFilter,并覆盖适当方法或编写 MessageFilter 接口的品牌新实施。
要使用自定义过滤器,请将以下内容添加到 spring 上下文中:

您可以按如下方式指定全局一个或多个本地消息过滤器: a)为所有 Spring-WS 端点提供全局自定义过滤器

<bean id="messageFilter" class="your.domain.myMessageFiler" scope="singleton" />

或 b)直接在端点上的本地 messageFilter,如下所示:

to("spring-ws:http://yourdomain.com?messageFilter=#myEndpointSpecificMessageFilter");

如需更多信息,请参阅 CAMEL-5724

如果要创建自己的 MessageFilter,请考虑在类 BasicMessageFilter 中,在 MessageFilter 的默认实现中覆盖以下方法:

protected void doProcessSoapHeader(Message inOrOut, SoapMessage soapMessage)
{your code /*no need to call super*/ }

protected void doProcessSoapAttachements(Message inOrOut, SoapMessage response)
{ your code /*no need to call super*/ }

325.11. 使用自定义消息Sender 和 MessageFactory

可以引用 registry 中的自定义消息发件人或工厂,如下所示:

from("direct:example")
.to("spring-ws:http://foo.com/bar?messageFactory=#messageFactory&messageSender=#messageSender")

Spring 配置:

<!-- authenticate using HTTP Basic Authentication -->
<bean id="messageSender" class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
    <property name="credentials">
        <bean class="org.apache.commons.httpclient.UsernamePasswordCredentials">
            <constructor-arg index="0" value="admin"/>
            <constructor-arg index="1" value="secret"/>
        </bean>
    </property>
</bean>

<!-- force use of Sun SAAJ implementation, http://static.springsource.org/spring-ws/sites/1.5/faq.html#saaj-jboss -->
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
    <property name="messageFactory">
        <bean class="com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"></bean>
    </property>
</bean>

325.12. 公开 Web 服务

要使用此组件公开 Web 服务,首先需要设置 MessageDispatcher 以在 Spring XML 文件中查找端点映射。如果您计划在 servlet 容器内运行,您可能想使用在 web.xml 中配置的 MessageDispatcherServlet

默认情况下,MessageDispatcherServlet 将查找名为 /WEB-INF/spring-ws-servlet.xml 的 Spring XML。要将 Camel 与 Spring-WS 一起使用,则 XML 文件中唯一必需是 CamelEndpointMapping。此 Bean 允许 MessageDispatcher 将 Web 服务请求分配到您的路由。

web.xml

<web-app>
    <servlet>
        <servlet-name>spring-ws</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-ws</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

spring-ws-servlet.xml

<bean id="endpointMapping" class="org.apache.camel.component.spring.ws.bean.CamelEndpointMapping" />

<bean id="wsdl" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
    <property name="schema">
        <bean class="org.springframework.xml.xsd.SimpleXsdSchema">
            <property name="xsd" value="/WEB-INF/foobar.xsd"/>
        </bean>
    </property>
    <property name="portTypeName" value="FooBar"/>
    <property name="locationUri" value="/"/>
    <property name="targetNamespace" value="http://example.com/"/>
</bean>

有关设置 Spring-WS 的更多信息,请参阅指定承包商的 Web 服务。3.6 "创建端点"的段落由这个组件处理(特别是 3.6.2 段落 3.6.2 "从 Message to the Message to the Endpoint"中称为 CamelEndpointMapping 处)。另外,不要忘记查看 Camel 分发中包含的 Spring Web 服务示例。

325.13. 路由中的端点映射

使用 XML 配置位,您现在可以使用 Camel 的 DSL 定义端点处理什么 Web 服务请求:

以下路由将接收所有在 http://example.com/ 命名空间中具有名为 "GetFoo" 的根元素的 web 服务请求。

from("spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)

以下路由将接收包含 http://example.com/GetFoo SOAP 操作的 Web 服务请求。

from("spring-ws:soapaction:http://example.com/GetFoo?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)

以下路由将接收发送到 http://example.com/foobar 的所有请求。

from("spring-ws:uri:http://example.com/foobar?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)

以下路由将收到包含消息内任何位置的 < foobar>abc</foobar > 元素的请求(和默认命名空间)。

from("spring-ws:xpathresult:abc?expression=//foobar&endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)

325.14. 备用配置,使用现有端点映射

对于带有映射类型 beanname 的每个端点,在 Registry/ApplicationContext 中需要带有相应名称的 CamelEndpointDispatcher 类型。这个 bean 充当 Camel 端点和现有 端点映射 (如 PayloadRootQNameEndpointMapping )之间的桥接。

注意:在您已使用 Spring-WS 且在 Spring XML 文件中定义的端点映射时,使用 beanname 映射类型主要用于(传统的)情况。beanname mapping-type 可用于将 Camel 路由连接到现有端点映射。当从头开始时,建议您将端点映射定义为 Camel URI (如如 endpointMapping所示),因为它需要较少的配置并且更具表达力。或者,您可以使用带有注解帮助的 vanilla Spring-WS。

使用 beanname 的路由示例:

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="spring-ws:beanname:QuoteEndpointDispatcher" />
        <to uri="mock:example" />
    </route>
</camelContext>

<bean id="legacyEndpointMapping" class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
    <property name="mappings">
        <props>
            <prop key="{http://example.com/}GetFuture">FutureEndpointDispatcher</prop>
            <prop key="{http://example.com/}GetQuote">QuoteEndpointDispatcher</prop>
        </props>
    </property>
</bean>

<bean id="QuoteEndpointDispatcher" class="org.apache.camel.component.spring.ws.bean.CamelEndpointDispatcher" />
<bean id="FutureEndpointDispatcher" class="org.apache.camel.component.spring.ws.bean.CamelEndpointDispatcher" />

325.15. POJO (un) marshalling

Camel 的可插拔数据格式支持使用 JAXB、XStream、JibX、Castor 和 XMLBeans 等库 pojo/xml marshalling。您可以使用路由中的这些数据格式来发送和接收 pojo 的、到 Web 服务中的 pojo。

访问 Web 服务时,您可以汇总请求并总结响应信息:

JaxbDataFormat jaxb = new JaxbDataFormat(false);
jaxb.setContextPath("com.example.model");

from("direct:example").marshal(jaxb).to("spring-ws:http://foo.com/bar").unmarshal(jaxb);

同样,在提供 Web 服务时,您可以将对 POJO 的 XML 请求并汇总回 XML:

from("spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping").unmarshal(jaxb)
.to("mock:example").marshal(jaxb);

325.16. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 326 章 SQL 组件

作为 Camel 版本 1.4 可用

sql: 组件允许您使用 JDBC 查询来处理数据库。此组件与 JDBC 组件之间的区别是,如果 SQL 查询是端点的属性,它会使用消息有效负载作为传递给查询的参数。

此组件使用 spring-jdbc 在 scenes 后面进行实际处理。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sql</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

SQL 组件还支持:

326.1. URI 格式

警告:从该组件开始的 Camel 2.11 可同时创建使用者(例如,来自())和制作者端点(如 to ())。在以前的版本中,它只能充当制作者。

INFO:此组件可用作 事务客户端

SQL 组件使用以下端点 URI 表示法:

sql:select * from table where id=# order by name[?options]

从 Camel 2.11 开始,您可以使用 :'#name_of_the_parameter' 样式,如下所示:

sql:select * from table where id=:#myId order by name[?options]

当使用命名参数时,Camel 将从给定的优先级查找名称:
1。如果消息正文使用 java.util.Map
2。来自邮件标题

如果无法解析命名参数,则会抛出异常。

Camel 2.14 开始,您可以使用 Simple 表达式作为参数,如下所示:

sql:select * from table where id=:#${property.myId} order by name[?options]

请注意,表示 SQL 查询的参数的标准 ? 符号替换为 # 符号,因为 ? 符号用于指定端点的选项。? 符号替换可以在端点基础上配置。

Camel 2.17 开始,您可以将 SQL 查询外部化到 classpath 或文件系统中的文件,如下所示:

sql:classpath:sql/myquery.sql[?options]

和 myquery.sql 文件位于 classpath 中,只是纯文本

-- this is a comment
select *
from table
where
  id = :#${property.myId}
order by
  name

在文件中,您可以根据需要使用多行并格式化 SQL。和 也可以使用 - dash 行等注释。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

326.2. 选项

SQL 组件支持 3 个选项,它们如下所列。

名称描述默认类型

dataSource (common)

设置用于与数据库通信的 DataSource。

 

DataSource

usePlaceholder (advanced)

设置是否在 SQL 查询中使用占位符和替换所有占位符字符。这个选项默认为 true

true

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

SQL 端点使用 URI 语法配置:

sql:query

使用以下路径和查询参数:

326.2.1. 路径名(1 参数):

名称描述默认类型

query

必需 设置要执行的 SQL 查询。您可以使用 file: 或 classpath: 作为前缀来对查询进行外部化,并指定文件的位置。

 

字符串

326.2.2. 查询参数(45 参数):

名称描述默认类型

allowNamedParameters (common)

是否允许使用查询中的指定参数。

true

布尔值

dataSource (common)

设置用于与数据库通信的 DataSource。

 

DataSource

dataSourceRef (common)

弃用了 设置对 DataSource 的引用以从 registry 中查询,以用于与数据库通信。

 

字符串

outputClass (common)

指定在 outputType=SelectOne 或 SelectList 时用作转换的完整软件包和类名称。

 

字符串

outputHeader (common)

将查询结果存储在标题中,而不是消息正文。默认情况下,输出Header == null,并且查询结果存储在消息正文中,消息正文中的所有现有内容将被丢弃。如果设置了输出Header,则值用作存储查询结果的标头名称,并保留原始消息正文。

 

字符串

outputType (common)

使消费者或制作者的输出选择列表为 Map,或者以以下方式选择为单个 Java 对象: a)如果查询仅含有单一列,则返回 JDBC Column 对象。(如 SELECT COUNT ()FROM PROJECT 将返回 Long 对象。b)如果查询有多个列,则返回 JDBC Column 对象。(如 SELECT COUNT ()FROM PROJECT)将返回 Long 对象。 然后,它将返回该结果的 map。如果设置了 outputClass,它将查询结果转换为 Java Bean 对象,方法是调用与列名称匹配的所有 setter。它将假设您的类有一个默认的构造器来创建带有. d 的实例。如果查询导致多个行,它将抛出一个非唯一结果异常。

SelectList

SqlOutputType

separator (common)

从消息正文中获取参数值时使用的分隔符(如果正文为 String 类型),则会在 # 占位符中插入。请注意,如果您使用命名参数,则改为使用 Map 类型。默认值为 comma。

,

char

breakBatchOnConsumeFail (consumer)

如果Consume 失败,则设置是否中断批处理。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

expectedUpdateCount (consumer)

设置预期的更新数,以便在使用 onConsume 时进行验证。

-1

int

maxMessagesPerPoll (consumer)

设置要轮询的最大消息数

 

int

onConsume (consumer)

在处理每一行后,可以执行此查询,如果交换被成功处理,例如,将行标记为已处理。查询可以具有 参数。

 

字符串

onConsumeBatchComplete (consumer)

在处理整个批处理后,可以执行此查询以批量更新行等。查询不能有参数。

 

字符串

onConsumeFailed (consumer)

处理每行后,可以执行此查询,如果 Exchange 失败,例如要将行标记为失败。查询可以具有 参数。

 

字符串

routeEmptyResultSet (consumer)

设置是否应该允许将空 resultset 发送到下一个跃点。默认为false。因此,空 resultset 将会被过滤掉。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

翻译( 消费者)

启用或禁用事务。如果启用,如果处理交换失败,使用者将中断处理任何进一步的交换会导致回滚预先处理

false

布尔值

useIterator (consumer)

设置应该如何传送给路由。表示作为列表或单个对象进行交付。默认为 true。

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

processingStrategy (consumer)

允许插件使用自定义 org.apache.camel.component.sql.SqlProcessingStrategy 在使用者处理行/batch 时执行查询。

 

SqlProcessingStrategy

batch (producer)

启用或禁用批处理模式

false

布尔值

noop (producer)

如果设置,将忽略 SQL 查询的结果,并使用现有的 IN 消息作为处理的 OUT 消息

false

布尔值

useMessageBodyForSql (producer)

是否使用消息正文作为 SQL,然后是参数的标头。如果启用了这个选项,则不会使用 uri 中的 SQL。

false

布尔值

alwaysPopulateStatement (advanced)

如果启用,则来自 org.apache.camel.component.sql.SqlPrepareStatementStrategy 的 populateStatement 方法始终被调用,如果没有预期的参数,则也会调用。当为 false 时,只有在设置了 1 个或更多预期参数时,才会调用 populateStatement;例如,为了避免读取没有参数的 SQL 查询的消息正文/headers。

false

布尔值

parametersCount (advanced)

如果设置大于零,则 Camel 将使用此计数值参数来替换,而不是通过 JDBC 元数据 API 进行查询。这在 JDBC 供应商无法返回正确的参数计数时很有用,然后用户可能会覆盖。

 

int

placeholder (advanced)

指定在 SQL 查询中将替换为 的字符。请注意,它是 simple String.replaceAll ()操作,不涉及 SQL 解析(引号的字符串也会更改)。

#

字符串

prepareStatementStrategy (advanced)

允许插件使用自定义 org.apache.camel.component.sql.SqlPrepareStatementStrategy 来控制对查询准备和准备的语句。

 

SqlPrepareStatement Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

templateOptions (advanced)

使用 Map 中的键/值配置 Spring JdbcTemplate

 

map

usePlaceholder (advanced)

设置是否在 SQL 查询中使用占位符和替换所有占位符字符。这个选项默认为 true

true

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

326.3. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.sql.data-source

设置用于与数据库通信的 DataSource。选项是一个 javax.sql.DataSource 类型。

 

字符串

camel.component.sql.enabled

启用 sql 组件

true

布尔值

camel.component.sql.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.sql.use-placeholder

设置是否在 SQL 查询中使用占位符和替换所有占位符字符。这个选项默认为 true

true

布尔值

326.4. 消息正文处理

SQL 组件会尝试将消息正文转换为 java.util.Iterator 类型的对象,然后使用这个迭代器填充查询参数(其中每个查询参数由端点 URI 中的 # 符号(或配置了占位符)表示。如果消息正文不是数组或集合,则转换会导致迭代一个对象(即正文本身)。

例如,如果消息正文是 java.util.List 的实例,列表中的第一个项将替换到 SQL 查询中的第一个出现的 # 查询中,则列表中的第二个项将被替换为 # 的第二个位置,以此类推。

如果 批处理 设置为 true,则入站消息正文的解释稍为 - 而不是参数程序,组件需要含有参数迭代器的迭代器;外部器的大小决定批处理大小。

从 Camel 2.16 开始,您可以使用 选项 useMessageBodyForSql 将消息正文用作 SQL 语句,然后在带有键 SqlConstants.SQL_PARAMETERS 的标头中提供 SQL 参数。这使得 SQL 组件能够在消息正文中时更动态地工作。

326.5. 查询结果

对于 选择 操作,结果是 List<Map<String、Object>& gt; 类型,如 JdbcTemplate.queryForList () 方法返回。对于 更新 操作,当 更新 操作只被设置为标头且永远不会设置为正文时,将返回 NULL body。

注意

有关更新 操作的更多信息,请参阅 标头值

默认情况下,结果放置在消息正文中。  如果设置了 outputHeader 参数,则结果将放在标头中。  这是一种使用完整消息丰富的模式来添加标头,它提供了一种简洁的语法,用于将序列或某些其他小值查询到标头中。  最好将 outputHeader 和 outputType 一起一起使用:

from("jms:order.inbox")
    .to("sql:select order_seq.nextval from dual?outputHeader=OrderId&outputType=SelectOne")
    .to("jms:order.booking");

326.6. 使用 StreamList

从*Camel 2.18* 颁发者支持 outputType=StreamList,它使用 iterator 来流传输查询的输出。这允许以流的方式处理数据(例如,Splitter EIP)可一次处理每个行,并在需要时从数据库加载数据。

from("direct:withSplitModel")
        .to("sql:select * from projects order by id?outputType=StreamList&outputClass=org.apache.camel.component.sql.ProjectModel")
        .to("log:stream")
        .split(body()).streaming()
            .to("log:row")
            .to("mock:result")
        .end();

 

 

326.7. 标头值

执行更新 操作时,SQL 组件会在以下消息标头中存储更新计数:

标头描述

CamelSqlUpdateCount

更新操作的行数量,返回为 Integer 对象。当使用 outputType=StreamList 时,不提供此标头。

CamelSqlRowCount

选择 操作返回的行数,返回为 Integer 对象。当使用 outputType=StreamList 时,不提供此标头。

CamelSqlQuery

Camel 2.8: 执行的查询。此查询优先于端点 URI 中指定的查询。请注意,标头中的查询参数由 ? 而不是一个 # 符号表示。

在执行 插入 操作时,SQL 组件会在以下消息标题中使用生成的键和这些行号(作为 Camel 2.12.4, 2.13.1)保存行:

标头描述

CamelSqlGeneratedKeysRowCount

标头中包含生成的密钥的行数。

CamelSqlGeneratedKeyRows

包含生成的密钥的行(键映射列表)。

326.8. 生成的密钥

* 从 Camel 2.12.4、2.13.1 和 2.14 提供 *

如果使用 SQL INSERT 插入数据,RDBMS 可能支持自动生成的密钥。您可以指示 SQL producer 在标头中返回生成的密钥。
为此,请设置标头 CamelSqlRetrieveGeneratedKeys=true。然后,生成的密钥将作为标头提供,并带有上表中列出的键。

您可以在这个 单元测试 中看到更多详细信息。

326.9. DataSource

现在,您可以在 URI 中直接设置对 DataSource 的引用:

sql:select * from table where id=# order by name?dataSource=myDS

326.10. 示例

在以下示例中,我们执行查询并检索结果作为行列表,其中每一行都是 Map<String, objects 则是列名。

首先,我们设置一个用于我们的样本的表。由于基于单元测试,我们在 java 中对其进行了:

SQL 脚本 createAndPopulateDatabase.sql 我们执行如下:

然后,我们将配置我们的路由和 sql 组件。请注意,我们在 sql 端点前面使用 直接 端点。这样,我们可以使用 URI 直接将交换发送到 直接 端点,直接:简单,客户端使用比长 sql: URI 更容易。请注意,DataSource 在 registry 中查找,因此我们可以使用标准的 Spring XML 配置我们的 DataSource

然后,我们将触发消息到 直接 端点,将它路由到查询数据库的 sql 组件。

我们可以在 Spring XML 中配置 DataSource,如下所示:

 <jee:jndi-lookup id="myDS" jndi-name="jdbc/myDataSource"/>

326.10.1. 使用命名参数

可从 Camel 2.11 开始

在给定路由中,我们希望从 projects 表中获取所有项目。请注意,SQL 查询具有 2 个命名参数 :#lic 和 :#min。
然后,Camel 将从消息正文或邮件标头中查找这些参数。请注意,在上面的示例中,我们为命名参数设置了带有恒定值
的两个标头:

   from("direct:projects")
     .setHeader("lic", constant("ASF"))
     .setHeader("min", constant(123))
     .to("sql:select * from projects where license = :#lic and id > :#min order by id")

虽然消息正文为 java.util.Map,则将从正文中获取命名参数。

   from("direct:projects")
     .to("sql:select * from projects where license = :#lic and id > :#min order by id")

326.11. 在制作者中使用表达式参数

可从 Camel 2.14 开始

在下面的给定路由中,我们希望从数据库获取所有项目。它使用交换的正文来定义许可证,并将 属性的值用作第二个参数。

from("direct:projects")
  .setBody(constant("ASF"))
  .setProperty("min", constant(123))
  .to("sql:select * from projects where license = :#${body} and id > :#${property.min} order by id")

326.11.1. 在消费者中使用表达式参数

可作为 Camel 2.23 使用

当将 SQL 组件用作消费者时,您现在还可以使用表达式参数(简单语言)构建动态查询参数,如在 bean 上调用 bean 以检索 id、date 或 something 的方法。

例如,以下示例中调用 bean myIdGenerator 上的 nextId 方法:

from("sql:select * from projects where id = :#${bean:myIdGenerator.nextId}")
    .to("mock:result");

和 bean 有以下方法:

public static class MyIdGenerator {

    private int id = 1;

    public int nextId() {
        return id++;
    }

请注意,没有消息正文和标头的现有 Exchange,因此消费者中使用的简单表达式最可用于调用 bean 方法,如本例中所示。

326.12. 使用带有动态值的 IN 查询

可从 Camel 2.17 开始

从采用 SQL 生产者的 Camel 2.17,通过 IN 语句使用 SQL 查询,其中 IN 值是动态计算的。例如,邮件正文或标题等。

使用 IN (CA)需要:

  • 为参数名称加上前缀 
  • 在 参数中添加 ()

解释这个示例可以更好地说明。使用以下查询:

-- this is a comment
select *
from projects
where project in (:#in:names)
order by id

在以下路由中:

from("direct:query")
    .to("sql:classpath:sql/selectProjectsIn.sql")
    .to("log:query")
    .to("mock:query");

然后 IN 查询可以使用带有动态值的密钥名称的标头,例如:

// use an array
template.requestBodyAndHeader("direct:query", "Hi there!", "names", new String[]{"Camel", "AMQ"});

// use a list
List<String> names = new ArrayList<String>();
names.add("Camel");
names.add("AMQ");

template.requestBodyAndHeader("direct:query", "Hi there!", "names", names);

// use a string separated values with comma
template.requestBodyAndHeader("direct:query", "Hi there!", "names", "Camel,AMQ");

查询也可以在端点中指定,而不是外部化(注意,外部大小可使维护 SQL 查询更为简单)

from("direct:query")
    .to("sql:select * from projects where project in (:#in:names) order by id")
    .to("log:query")
    .to("mock:query");

 

326.13. 使用基于 JDBC 的幂等存储库

可用作 Camel 2.7: 在本节中,我们将使用基于 JDBC 的幂等存储库。

TIP:*Abstract 类* From Camel 2.9 开始存在抽象类 org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository,您可以扩展为构建自定义 JDBC 幂等存储库。

首先,我们必须创建供幂等存储库使用的数据库表。对于 Camel 2.7,我们使用以下模式:

CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255),
messageId VARCHAR(100) )

 

Camel 2.8 中,我们添加了 createdAt 列:

CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255),
messageId VARCHAR(100), createdAt TIMESTAMP )

警告:SQL 服务器 TIMESTAMP 类型是一个固定长度的二进制字符串类型。它不能映射到任何 JDBC 时间类型: DATETIMETIMESTAMP

自定义 JdbcMessageIdRepository

Camel 2.9.1 开始,您可以有一些选项来调整 org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository

参数默认值描述

createTableIfNotExists

true

定义 Camel 是否应该尝试创建表(如果不存在)。

tableExistsString

SELECT 1 FROM CAMEL_MESSAGEPROCESSED WHERE 1 = 0

此查询用于找出表是否已存在。它必须抛出异常来指示表不存在。

createString

CREATE TABLE CAMEL_MESSAGEPROCESSED (processorName VARCHAR (255), messageId VARCHAR (100) createdAt TIMESTAMP)

用于创建表的 语句。

queryString

SELECT COUNT(*) FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?AND messageId = ?

用于查明存储库中消息是否已存在的查询(结果不等于 '0')。它取两个参数。第一个是处理器名称(字符串),第二个是消息 ID (字符串)。

insertString

INSERT INTO CAMEL_MESSAGEPROCESSED (processorName、MessageId、createdAt) valueS (?、?、?)

语句用于将条目添加到表中。它采用三个参数。第一个是处理器名称(字符串),第二个是消息 ID (字符串),第三个是默认值(java.sql.Timestamp)到存储库中。

deleteString

DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?AND messageId = ?

语句用于从数据库中删除条目。它取两个参数。第一个是处理器名称(字符串),第二个是消息 ID (字符串)。

326.14. 使用基于 JDBC 的聚合存储库

可作为 Camel 2.6 使用。

INFO:在 Camel 2.6 中使用 JdbcAggregationRepository

在 Camel 2.6 中,JdbcAggregationRepository 在 camel-jdbc-aggregator 组件中提供。从 Camel 2.7 开始,JdbcAggregationRepositorycamel-sql 组件中提供。

JdbcAggregationRepository 是一个 AggregationRepository,它可即时保留聚合的消息。这可确保您不会松散的消息,因为默认聚合器将仅使用内存 AggregationRepositoryJdbcAggregationRepository 允许与 Camel 一起为聚合器提供持续支持。

只有当成功处理 Exchange 时,它才会标记为完成,当 确认 方法在 AggregationRepository 上调用时,才会将其标记为完成。这意味着,如果同一交换再次失败,它将被重试,直到成功为止。

您可以使用选项 maximumRedeliveries 来限制给定恢复的 Exchange 的最大重新传送尝试次数。您还必须设置 deadLetterUri 选项,因此 Camel 知道在点击 的最大值时要发送交换 的位置。

您可以在 camel-sql 单元测试中看到一些示例,例如: https://svn.apache.org/repos/asf/camel/trunk/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregateRecoverDeadLetterChannelTest.java

326.14.1. 数据库

要正常运行,每个聚合器使用两个表:聚合和完成一个。按照惯例,已完成的聚合的名称与带有 "_COMPLETED" 后缀的聚合名称相同。名称必须在 Spring bean 中通过 RepositoryName 属性进行配置。在以下示例中,将使用下列聚合。

两个表的表结构定义都相同:如果一个 String 值用作键(id),而 Blob 包含字节数组中的交换序列化。
但应该记住有一个区别: id 字段没有相同的内容,具体取决于表。
在聚合表 id 中,包含组件用于聚合消息的关联 ID。在完成的表中,id 包含相应 blob 字段中存储的交换的 id。

以下是用于创建表的 SQL 查询,只需将 "aggregation" 替换为您的聚合器存储库名称。

CREATE TABLE aggregation (
 id varchar(255) NOT NULL,
 exchange blob NOT NULL,
 constraint aggregation_pk PRIMARY KEY (id)
);
CREATE TABLE aggregation_completed (
 id varchar(255) NOT NULL,
 exchange blob NOT NULL,
 constraint aggregation_completed_pk PRIMARY KEY (id)
);

326.15. 将正文和标头存储为文本

可从 Camel 2.11 开始

您可以配置 JdbcAggregationRepository 来存储消息正文,并在单独的列中选择(ed)标头作为 String。例如,要存储正文,以下两个标题为 companyNameaccountName,使用以下 SQL:

CREATE TABLE aggregationRepo3 (
 id varchar(255) NOT NULL,
 exchange blob NOT NULL,
 body varchar(1000),
 companyName varchar(1000),
 accountName varchar(1000),
 constraint aggregationRepo3_pk PRIMARY KEY (id)
);
CREATE TABLE aggregationRepo3_completed (
 id varchar(255) NOT NULL,
 exchange blob NOT NULL,
 body varchar(1000),
 companyName varchar(1000),
 accountName varchar(1000),
 constraint aggregationRepo3_completed_pk PRIMARY KEY (id)
);

  然后,将存储库配置为启用此行为,如下所示:

<bean id="repo3"
  class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
  <property name="repositoryName" value="aggregationRepo3"/>
  <property name="transactionManager" ref="txManager3"/>
  <property name="dataSource" ref="dataSource3"/>
  <!-- configure to store the message body and following headers as text in the repo -->
  <property name="storeBodyAsText" value="true"/>
  <property name="headersToStoreAsText">
    <list>
      <value>companyName</value>
      <value>accountName</value>
    </list>
  </property>
</bean>

326.15.1. codec (导航)

由于它们可以包含任何类型的有效负载,因此设计交换并不被序列化。它转换为数据库 BLOB 字段中存储的字节阵列。所有这些转换都由 JdbcCodec 类处理。代码细节需要您关注: ClassLoadingAwareObjectInputStream

ClassLoadingAwareObjectInputStream 已从 Apache ActiveMQ 项目中重复使用。它将打包了 ObjectInputStream,并将其与 ContextClassLoader 而非当前Thread 一起一起使用。这样做的好处是能够加载由其他捆绑包公开的类。这允许交换正文和标头具有自定义类型对象引用。

326.15.2. 事务

需要 Spring PlatformTransactionManager 来编配事务。

326.15.2.1. 服务(Start/Stop)

start 方法验证数据库的连接和是否存在所需的表。如果有任何错误,它会在启动过程中失败。

326.15.3. 聚合器配置

根据目标环境,聚合器可能需要一些配置。既然已经知道,每个聚合器都应拥有自己的存储库(具有数据库中创建的表的对应对)和一个数据源。如果默认 lobHandler 不适合您的数据库系统,可以使用 lobHandler 属性来注入它。

以下是 Oracle 的声明:

<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">
  <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/>
</bean>
<bean id="nativeJdbcExtractor"
  class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/>
<bean id="repo"
  class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
  <property name="transactionManager" ref="transactionManager"/>
  <property name="repositoryName" value="aggregation"/>
  <property name="dataSource" ref="dataSource"/>
  <!-- Only with Oracle, else use default -->
  <property name="lobHandler" ref="lobHandler"/>
</bean>

  ==== optimistic 锁定

Camel 2.12 开始,您可以打开 optimisticLocking,并在集群环境中使用此基于 JDBC 的聚合存储库,其中多个 Camel 应用程序为聚合存储库共享同一数据库。如果存在一个竞争条件,则 JDBC 驱动程序将抛出一个特定于供应商的异常,则 JdbcAggregationRepository 可以响应。要知道从 JDBC 驱动程序造成异常,作为光明锁定错误,我们需要一个映射程序来执行此操作。因此,有一个 org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper (如果需要),您可以实施自定义逻辑。有一个默认的实现 org.apache.camel.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper (如下所示):

以下检查已完成:

  • 如果导致的异常是 SQLException,则如果以 23 开始,则检查 SQLState。
  • 如果导致的异常是 DataIntegrityViolationException
  • 如果导致的异常类名称的名称中包含 "ConstraintViolation"。
  • 如果配置了任何类名称,可以选择检查 FQN 类名称

您还可以添加 FQN 类名称,如果任何导致异常(或任何嵌套)等于 FQN 类名称的任何错误,则它是一个光纤锁定错误。

以下是一个示例,其中定义了来自 JDBC 供应商的 2 额外 FQN 类名称:

<bean id="repo"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
  <property name="transactionManager" ref="transactionManager"/>
  <property name="repositoryName" value="aggregation"/>
  <property name="dataSource" ref="dataSource"/>
  <property name="jdbcOptimisticLockingExceptionMapper" ref="myExceptionMapper"/>
</bean>
<!-- use the default mapper with extraFQN class names from our JDBC driver -->
<bean id="myExceptionMapper" class="org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper">
  <property name="classNames">
    <util:set>
      <value>com.foo.sql.MyViolationExceptoion</value>
      <value>com.foo.sql.MyOtherViolationExceptoion</value>
    </util:set>
  </property>
</bean>

326.16. 传播行为

JdbcAggregationRepository 使用了 Spring-TX 的两个不同 事务模板。个是只读的,另一个用于读写操作。

但是,当在其自身使用 < transacted /&gt; 的路由中使用 JdbcAggregationRepository 时,且使用了常见的 平台TransactionManager 时,可能需要配置 JdbcAggregationRepository 内部使用的 传播行为

以下是实现它的方法:

<bean id="repo"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
  <property name="propagationBehaviorName" value="PROPAGATION_NESTED" />
</bean>

传播通过 org.springframework.transaction.TransactionDefinition 接口来定义,因此 propagationBehaviorName 非常方便,允许使用恒定的名称。

326.17. PostgreSQL 问题单

有特殊的数据库可能会导致 JdbcAggregationRepository 使用优化式锁定时出现问题。在数据完整性违反异常时,PostgreSQL 会将连接标记为无效(一个具有 SQLState 23505)。这使得连接在嵌套的事务中有效不可用。有关详细信息,请参阅 本文档

org.apache.camel.aggregate.jdbc.PostgresAggregationRepository 扩展 JdbcAggregationRepository,并使用特殊的 INSERT。ONCONFLICT . 用来提供优化锁定行为的声明。

此声明为 (具有默认聚合表定义):

INSERT INTO aggregation (id, exchange) values (?, ?) ON CONFLICT DO NOTHING

有关详细信息,请参阅 PostgreSQL 文档

当使用此子句时,java.sql.PreparedStatement.executeUpdate () 调用返回 0, 而不是通过 SQLState=23505 引发 SQLException。进一步处理与通用 JdbcAggregationRepository 完全相同,但不将 PostgreSQL 连接标记为无效。

326.18. Camel SQL Starter

spring-boot 用户提供了一个初学者模块。在使用初学者时,可以使用 spring-boot 属性直接配置 DataSource

# Example for a mysql datasource
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

要使用这个功能,请在 spring boot pom.xml 文件中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sql-starter</artifactId>
    <version>${camel.version}</version> <!-- use the same version as your Camel core version -->
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>${spring-boot-version}</version>
</dependency>

如果需要,您还应包含特定的数据库驱动程序。

第 327 章 SQL Stored Procedure 组件

作为 Camel 2.17 版提供

sql-stored: 组件允许您使用 JDBC Stored Procedure 查询来处理数据库。这个组件是对 SQL 组件的扩展,但专门调用存储的步骤。

此组件使用 spring-jdbc 在 scenes 后面进行实际处理。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sql</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

327.1. URI 格式

SQL 组件使用以下端点 URI 表示法:

sql-stored:template[?options]

其中模板是存储的步骤模板,在其中声明存储的步骤名称和 IN、INOUT 和 OUT 参数。 

您还可以引用文件系统或类路径的外部文件中的模板,例如:

sql-stored:classpath:sql/myprocedure.sql[?options]

其中 sql/myprocedure.sql 是 classpath 中带有模板的纯文本文件,如下所示:

SUBNUMBERS(
  INTEGER ${headers.num1},
  INTEGER ${headers.num2},
  INOUT INTEGER ${headers.num3} out1,
  OUT INTEGER out2
)

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

327.2. 选项

SQL Stored Procedure 组件支持 2 个选项,它们如下所列。

名称描述默认类型

dataSource (producer)

设置用于与数据库通信的 DataSource。

 

DataSource

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

SQL Stored Procedure 端点使用 URI 语法配置:

sql-stored:template

使用以下路径和查询参数:

327.2.1. 路径名(1 参数):

名称描述默认类型

模板

必需 设置 StoredProcedure 模板来执行

 

字符串

327.2.2. 查询参数(7 参数):

名称描述默认类型

batch (producer)

启用或禁用批处理模式

false

布尔值

dataSource (producer)

设置用于与数据库通信的 DataSource。

 

DataSource

function (producer)

此调用是否适合某个功能。

false

布尔值

noop (producer)

如果设置,将忽略模板的结果,并使用现有的 IN 消息作为处理连续的 OUT 消息

false

布尔值

outputHeader (producer)

将模板结果存储在标题中,而不是消息正文。默认情况下,输出Header == null,并且模板结果存储在消息正文中,消息正文中的所有现有内容将被丢弃。如果设置了输出Header,则值用作存储模板结果的标头名称,并保留原始消息正文。

 

字符串

useMessageBodyForTemplate (producer)

是否使用消息正文作为模板,然后是参数的标头。如果启用了这个选项,则不会使用 uri 中的模板。

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

327.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.sql-stored.data-source

设置用于与数据库通信的 DataSource。选项是一个 javax.sql.DataSource 类型。

 

字符串

camel.component.sql-stored.enabled

启用 sql-stored 组件

true

布尔值

camel.component.sql-stored.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

327.4. 声明存储的步骤模板

模板是使用与 Java 方法签名类似的语法声明。存储的流程的名称,然后使用括号括起的参数。下面是一个优点的示例:

<to uri="sql-stored:STOREDSAMPLE(INTEGER ${headers.num1},INTEGER ${headers.num2},INOUT INTEGER ${headers.num3} result1,OUT INTEGER result2)"/>

参数由类型声明,然后使用简单表达式与 Camel 消息的映射。在本例中,前两个参数是 INTEGER 类型的 IN 值,映射到消息标头。第三个参数是 INOUT,这表示它接受 INTEGER,然后返回不同的 INTEGER 结果。最后一个参数是 OUT 值,也是 INTEGER 类型。

在 SQL 术语中,存储的步骤可以声明为:

CREATE PROCEDURE STOREDSAMPLE(VALUE1 INTEGER, VALUE2 INTEGER, INOUT RESULT1 INTEGER, OUT RESULT2 INTEGER)

327.4.1. IN 参数

IN 参数取四个部分,用空格分开:参数名称、SQL 类型(扩展)、类型名称和值源。

参数名称是可选的,如果不提供,则会自动生成。它必须在引号(')之间指定。

SQL 类型是必需的,可以是整数(正数或负数)或引用某些类中的整数字段。如果 SQL 类型包含一个点,则组件会尝试解析该类并读取给定字段。例如,com.Foo.INTEGER 从类 com.Foo 的字段读取。如果类型不包含逗号,那么要解析整数值的类将为 java.sql.Types。类型可以通过扩展(如 DECIMAL (10))表示表示 scale 10 的 java.sql.Types.DECIMAL

类型名称是可选的,必须在引号(')之间给定。

值源是必需的。值源从 Exchange 填充参数值。它可以是简单表达式或标头位置,例如 ::#<header name>。例如,简单表达式 ${header.val} 意味着将从标题"val"读取参数值。标头位置表达式 :#val 将具有相同的效果。

<to uri="sql-stored:MYFUNC('param1' org.example.Types.INTEGER(10) ${header.srcValue})"/>

URI 表示,使用参数名称 "param1" 调用存储的步骤,它的 SQL 类型是从类 org.example.Types 字段的 INTEGER 字段读取,并且扩展将设置为 10。参数的输入值从标题 "srcValue" 传递。

<to uri="sql-stored:MYFUNC('param1' 100 'mytypename' ${header.srcValue})"/>

URI 与之前在 前面相同,但 SQL-type 是 100,类型名称为 "mytypename"。

实际调用将通过 org.springframework.jdbc.core.SqlParameter 进行。

327.4.2. 输出参数

OUT 参数的工作方式类似于 IN 参数,包含三个部分:SQL 类型(扩展),类型名称和输出参数名称。

SQL 类型的工作方式与 IN 参数相同。

类型名称是可选的,并且工作与 IN 参数相同。

输出参数名称用于 OUT 参数名称,以及存储结果的标头名称。

<to uri="sql-stored:MYFUNC(OUT org.example.Types.DECIMAL(10) outheader1)"/>

URI 表示 OUT 参数的名称为 "outheader1",结果将是标题 "outheader1"。

<to uri="sql-stored:MYFUNC(OUT org.example.Types.NUMERIC(10) 'mytype' outheader1)"/>

这与前一个相同,但类型名称将是"mytype"。

实际调用将通过 org.springframework.jdbc.core.SqlOutParameter 进行。

327.4.3. INOUT 参数

INOUT 参数是以上所有参数的组合。它们从交换接收值,并将结果存储为邮件标头。唯一的注意事项是,会跳过 IN 参数的"name"。相反,OUT 参数的 "name" 定义了 SQL 参数名称以及结果标头名称。

<to uri="sql-stored:MYFUNC(INOUT DECIMAL(10) ${headers.inheader} outheader)"/>

实际调用将通过 org.springframework.jdbc.core.SqlInOutParameter 进行。

327.5. Camel SQL Starter

spring-boot 用户提供了一个初学者模块。在使用初学者时,可以使用 spring-boot 属性直接配置 DataSource

# Example for a mysql datasource
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

要使用这个功能,请在 spring boot pom.xml 文件中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sql-starter</artifactId>
    <version>${camel.version}</version> <!-- use the same version as your Camel core version -->
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>${spring-boot-version}</version>
</dependency>

如果需要,您还应包含特定的数据库驱动程序。

327.6. 另请参阅

第 328 章 SSH 组件

作为 Camel 2.10 版本提供

SSH 组件支持访问 SSH 服务器,以便可以发送 SSH 命令,并处理响应。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ssh</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

328.1. URI 格式

ssh:[username[:password]@]host[:port][?options]

328.2. 选项

SSH 组件支持 15 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享的 SSH 配置

 

SshConfiguration

host (common)

设置远程 SSH 服务器的主机名。

 

字符串

port (common)

设置远程 SSH 服务器的端口号。

 

int

username (security)

设置用于登录到远程 SSH 服务器的用户名。

 

字符串

密码 (安全)

设置连接到远程 SSH 服务器时使用的密码。需要 keyPairProvider 设为 null。

 

字符串

pollCommand (common)

设置要在每个轮询周期期间发送到远程 SSH 服务器的命令字符串。只适用于 camel-ssh 组件作为消费者,例如:来自(ssh://…​)。您可能需要以换行符结尾,且必须是编码的 %0A 的 URL

 

字符串

keyPairProvider (security)

设置在使用证书连接到远程 SSH 服务器时使用的 KeyPairProvider 参考。

 

KeyPairProvider

keyType (security)

设置用作身份验证一部分的 KeyPairProvider 的密钥类型。KeyPairProvider.loadKey (…​)将传递此值。默认为 ssh-rsa。

 

字符串

timeout (common)

将超时设置为毫秒,以等待建立远程 SSH 服务器连接。默认为 30000 毫秒。

 

long

certFilename (security)

弃用了 设置用于身份验证的证书的资源路径。

 

字符串

certResource (security)

设置用于身份验证的证书的资源路径。将使用 ResourceHelperKeyPairProvider 来解析基于文件的证书,并取决于 keyType 设置。

 

字符串

channelType (advanced)

设置要传递给 Channel 的频道类型,作为命令执行的一部分。默认为 exec。

 

字符串

shellPrompt (advanced)

在命令执行后读取响应时,将 shell 提示符设置为丢弃

 

字符串

sleepForShellPrompt (advanced)

设置休眠周期(以毫秒为单位),以从 shell 提示符读取响应。默认值为 100 毫秒。

 

long

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

SSH 端点使用 URI 语法配置:

ssh:host:port

使用以下路径和查询参数:

328.2.1. 路径名(2 参数):

名称描述默认类型

主机

必需 设置远程 SSH 服务器的主机名。

 

字符串

port

设置远程 SSH 服务器的端口号。

22

int

328.2.2. 查询参数(31 参数):

名称描述默认类型

failOnUnknownHost (common)

指定到未知主机的连接是否应该会失败。只有在设置了属性 knownHosts 时,才会检查这个值。

false

布尔值

knownHostsResource (common)

为 known_hosts 文件设置资源路径

 

字符串

timeout (common)

将超时设置为毫秒,以等待建立远程 SSH 服务器连接。默认为 30000 毫秒。

30000

long

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

pollCommand (consumer)

设置要在每个轮询周期期间发送到远程 SSH 服务器的命令字符串。只适用于 camel-ssh 组件作为使用者,例如:(ssh://…​)可能需要以换行符结尾,且必须是编码的 %0A

 

字符串

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

channelType (advanced)

设置要传递给 Channel 的频道类型,作为命令执行的一部分。默认为 exec。

exec

字符串

shellPrompt (advanced)

在命令执行后读取响应时,将 shell 提示符设置为丢弃

 

字符串

sleepForShellPrompt (advanced)

设置休眠周期(以毫秒为单位),以从 shell 提示符读取响应。默认值为 100 毫秒。

100

long

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

certResource (security)

设置用于身份验证的证书的资源路径。将使用 ResourceHelperKeyPairProvider 来解析基于文件的证书,并取决于 keyType 设置。

 

字符串

keyPairProvider (security)

设置在使用证书连接到远程 SSH 服务器时使用的 KeyPairProvider 参考。

 

KeyPairProvider

keyType (security)

设置用作身份验证一部分的 KeyPairProvider 的密钥类型。KeyPairProvider.loadKey (…​)将传递此值。默认为 ssh-rsa。

ssh-rsa

字符串

密码 (安全)

设置连接到远程 SSH 服务器时使用的密码。需要 keyPairProvider 设为 null。

 

字符串

username (security)

设置用于登录到远程 SSH 服务器的用户名。

 

字符串

328.3. Spring Boot Auto-Configuration

组件支持 30 选项,它们如下所列。

名称描述默认类型

camel.component.ssh.cert-resource

设置用于身份验证的证书的资源路径。将使用 ResourceHelperKeyPairProvider 来解析基于文件的证书,并取决于 keyType 设置。

 

字符串

camel.component.ssh.channel-type

设置要传递给 Channel 的频道类型,作为命令执行的一部分。默认为 exec。

 

字符串

camel.component.ssh.configuration.cert-resource

设置用于身份验证的证书的资源路径。将使用 ResourceHelperKeyPairProvider 来解析基于文件的证书,并取决于 keyType 设置。

 

字符串

camel.component.ssh.configuration.channel-type

设置要传递给 Channel 的频道类型,作为命令执行的一部分。默认为 exec。

exec

字符串

camel.component.ssh.configuration.fail-on-unknown-host

指定到未知主机的连接是否应该会失败。只有在设置了属性 knownHosts 时,才会检查这个值。

false

布尔值

camel.component.ssh.configuration.host

设置远程 SSH 服务器的主机名。

 

字符串

camel.component.ssh.configuration.key-pair-provider

设置在使用证书连接到远程 SSH 服务器时使用的 KeyPairProvider 参考。

 

KeyPairProvider

camel.component.ssh.configuration.key-type

设置用作身份验证一部分的 KeyPairProvider 的密钥类型。KeyPairProvider.loadKey (…​)将传递此值。默认为 ssh-rsa。

ssh-rsa

字符串

camel.component.ssh.configuration.known-hosts-resource

为 known_hosts 文件设置资源路径

 

字符串

camel.component.ssh.configuration.password

设置连接到远程 SSH 服务器时使用的密码。需要 keyPairProvider 设为 null。

 

字符串

camel.component.ssh.configuration.poll-command

设置要在每个轮询周期期间发送到远程 SSH 服务器的命令字符串。只适用于 camel-ssh 组件作为使用者,例如:(ssh://…​)可能需要以换行符结尾,且必须是编码的 %0A

 

字符串

camel.component.ssh.configuration.port

设置远程 SSH 服务器的端口号。

22

整数

camel.component.ssh.configuration.shell-prompt

在命令执行后读取响应时,将 shell 提示符设置为丢弃

 

字符串

camel.component.ssh.configuration.sleep-for-shell-prompt

设置休眠周期(以毫秒为单位),以从 shell 提示符读取响应。默认值为 100 毫秒。

100

Long

camel.component.ssh.configuration.timeout

将超时设置为毫秒,以等待建立远程 SSH 服务器连接。默认为 30000 毫秒。

30000

Long

camel.component.ssh.configuration.username

设置用于登录到远程 SSH 服务器的用户名。

 

字符串

camel.component.ssh.enabled

启用 ssh 组件

true

布尔值

camel.component.ssh.host

设置远程 SSH 服务器的主机名。

 

字符串

camel.component.ssh.key-pair-provider

设置在使用证书连接到远程 SSH 服务器时使用的 KeyPairProvider 参考。选项是一个 org.apache.sshd.common.keyprovider.KeyPairProvider 类型。

 

字符串

camel.component.ssh.key-type

设置用作身份验证一部分的 KeyPairProvider 的密钥类型。KeyPairProvider.loadKey (…​)将传递此值。默认为 ssh-rsa。

 

字符串

camel.component.ssh.password

设置连接到远程 SSH 服务器时使用的密码。需要 keyPairProvider 设为 null。

 

字符串

camel.component.ssh.poll-command

设置要在每个轮询周期期间发送到远程 SSH 服务器的命令字符串。只适用于 camel-ssh 组件作为消费者,例如:来自(ssh://…​)。您可能需要以换行符结尾,且必须是编码的 %0A 的 URL

 

字符串

camel.component.ssh.port

设置远程 SSH 服务器的端口号。

 

整数

camel.component.ssh.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.ssh.shell-prompt

在命令执行后读取响应时,将 shell 提示符设置为丢弃

 

字符串

camel.component.ssh.sleep-for-shell-prompt

设置休眠周期(以毫秒为单位),以从 shell 提示符读取响应。默认值为 100 毫秒。

 

Long

camel.component.ssh.timeout

将超时设置为毫秒,以等待建立远程 SSH 服务器连接。默认为 30000 毫秒。

 

Long

camel.component.ssh.username

设置用于登录到远程 SSH 服务器的用户名。

 

字符串

camel.component.ssh.cert-filename

设置用于身份验证的证书的资源路径。

 

字符串

camel.component.ssh.configuration.cert-filename

@已弃用 2.11 版本,被 {@link #setCertResource (String)} 替换

 

字符串

328.4. 使用 作为 Producer 端点

当 SSH 组件用作 Producer (.to ("ssh://…​")时,它将发送消息正文作为要在远程 SSH 服务器上执行的命令。

以下是 XML DSL 中的示例。请注意,该命令具有 XML 编码的换行符( 和#10;)。

<route id="camel-example-ssh-producer">
  <from uri="direct:exampleSshProducer"/>
  <setBody>
    <constant>features:list&#10;</constant>
  </setBody>
  <to uri="ssh://karaf:karaf@localhost:8101"/>
  <log message="${body}"/>
</route>

328.5. 身份验证

SSH 组件可以使用以下两种机制之一向远程 SSH 服务器进行身份验证:公钥证书或用户名/密码。配置 SSH 组件如何进行身份验证以及要设置哪些选项。

  1. 首先,它将查看是否设置了 certResource 选项;如果已设置,则使用它找到引用的公钥证书并使用它来进行身份验证。
  2. 如果没有设置 certResource,它将查看 keyPairProvider 是否已设置,如果已设置,它将使用该证书进行基于证书的身份验证。
  3. 如果没有设置 certResourcekeyPairProvider,它将使用 用户名和密码 选项进行身份验证。即使在带有 SshConstants.USERNAME_HEADER (CamelSshUsername)和 SshConstants.PASSWORD_HEADER 的端点配置和标题中提供了 用户名和密码,但端点配置将超过标头中设置的凭证。

以下路由片段演示了使用 classpath 中的证书进行 SSH 轮询使用者。

在 XML DSL 中,

<route>
  <from uri="ssh://scott@localhost:8101?certResource=classpath:test_rsa&amp;useFixedDelay=true&amp;delay=5000&amp;pollCommand=features:list%0A"/>
  <log message="${body}"/>
</route>

在 Java DSL 中,

from("ssh://scott@localhost:8101?certResource=classpath:test_rsa&useFixedDelay=true&delay=5000&pollCommand=features:list%0A")
    .log("${body}");

例如 /camel-example-ssh-security 提供了使用公钥身份验证的示例

证书依赖项

如果使用基于证书的身份验证,则需要添加一些额外的运行时依赖项。显示的依赖项版本为 Camel 2.11,您可能需要使用更新的版本,具体取决于您使用的 Camel 版本。

<dependency>
  <groupId>org.apache.sshd</groupId>
  <artifactId>sshd-core</artifactId>
  <version>0.8.0</version>
</dependency>
<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcpg-jdk15on</artifactId>
  <version>1.47</version>
</dependency>
<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcpkix-jdk15on</artifactId>
  <version>1.47</version>
</dependency>

328.6. 示例

请参阅 Camel 分发中的 example/camel-example-sshexample/camel-example-ssh-security

328.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 329 章 stax 组件

作为 Camel 版本 2.9 提供。

StAX 组件允许通过 SAX 内容处理程序处理消息
此组件的另一项功能是使用 StAX 迭代 JAXB 记录,例如使用 Splitter EIP。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-stax</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

329.1. URI 格式

stax:content-handler-class

示例:

stax:org.superbiz.FooContentHandler

Camel 2.11.1 开始,您可以使用 # 语法从 registry 中查找 org.xml.sax.ContentHandler bean,如下所示:

stax:#myHandler

329.2. 选项

StAX 组件没有选项。

StAX 端点使用 URI 语法进行配置:

stax:contentHandlerClass

使用以下路径和查询参数:

329.2.1. 路径名(1 参数):

名称描述默认类型

contentHandlerClass

需要使用的内容处理程序实施的 FQN 类名称。

 

字符串

329.2.2. 查询参数(1 参数):

名称描述默认类型

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

329.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.stax.enabled

启用 stax 组件

true

布尔值

camel.component.stax.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

329.4. 将内容处理程序用作 StAX 解析器

处理后的消息正文是处理程序本身。

例如:

from("file:target/in")
  .to("stax:org.superbiz.handler.CountingHandler")
  // CountingHandler implements org.xml.sax.ContentHandler or extends org.xml.sax.helpers.DefaultHandler
  .process(new Processor() {
    @Override
    public void process(Exchange exchange) throws Exception {
        CountingHandler handler = exchange.getIn().getBody(CountingHandler.class);
        // do some great work with the handler
    }
  });

329.5. 使用 JAXB 和 StAX 迭代集合

首先,我们假设您具有 JAXB 对象。

例如,在 wrapper 对象中记录列表:

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "records")
public class Records {
    @XmlElement(required = true)
    protected List<Record> record;

    public List<Record> getRecord() {
        if (record == null) {
            record = new ArrayList<Record>();
        }
        return record;
    }
}

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "record", propOrder = { "key", "value" })
public class Record {
    @XmlAttribute(required = true)
    protected String key;

    @XmlAttribute(required = true)
    protected String value;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

然后,您可以获取 XML 文件进行处理:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<records>
  <record value="v0" key="0"/>
  <record value="v1" key="1"/>
  <record value="v2" key="2"/>
  <record value="v3" key="3"/>
  <record value="v4" key="4"/>
  <record value="v5" key="5"/>
</record>

StAX 组件提供了一个 StAXBuilder,可在使用 Camel Splitter 迭代 XML 元素时使用

from("file:target/in")
    .split(stax(Record.class)).streaming()
        .to("mock:records");

其中 staxorg.apache.camel.component.stax.StAXBuilder 中的一个静态导入 Java 代码中的静态方法。stax 构建器默认为默认命名空间感知到它所使用的 XMLReader。从 Camel 2.11.1 开始,您可以通过将 布尔值 参数设置为 false 来关闭,如下所示:

from("file:target/in")
    .split(stax(Record.class, false)).streaming()
        .to("mock:records");

329.5.1. 以上使用 XML DSL 的示例

以上示例可以在 XML DSL 中实施

329.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 330 章 STOMP 组件

作为 Camel 2.12 版本提供

stomp: 组件用于与 Stomp 兼容消息代理(如 Apache ActiveMQActiveMQ Apollo)通信

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-stomp</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

330.1. URI 格式

stomp:queue:destination[?options]

其中 destination 是队列的名称。

330.2. 选项

Stomp 组件支持 8 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享的 stomp 配置

 

StompConfiguration

brokerURL (common)

要连接的 Stomp 代理的 URI

 

字符串

登录 (安全性)

用户名

 

字符串

passcode (security)

密码

 

字符串

host (common)

虚拟主机

 

字符串

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

headerFilterStrategy (filter)

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Stomp 端点使用 URI 语法进行配置:

stomp:destination

使用以下路径和查询参数:

330.2.1. 路径名(1 参数):

名称描述默认类型

目的地

队列 所需的 名称

 

字符串

330.2.2. 查询参数(10 参数):

名称描述默认类型

brokerURL (common)

需要 要连接的 Stomp 代理的 URI

tcp://localhost:61613

字符串

host (common)

虚拟主机名称

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

headerFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

登录 (安全性)

用户名

 

字符串

passcode (security)

密码

 

字符串

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

330.3. Spring Boot Auto-Configuration

组件支持 13 个选项,它们如下所列。

名称描述默认类型

camel.component.stomp.broker-u-r-l

要连接的 Stomp 代理的 URI

 

字符串

camel.component.stomp.configuration.broker-u-r-l

要连接的 Stomp 代理的 URI

tcp://localhost:61613

字符串

camel.component.stomp.configuration.host

虚拟主机名称

 

字符串

camel.component.stomp.configuration.login

用户名

 

字符串

camel.component.stomp.configuration.passcode

密码

 

字符串

camel.component.stomp.configuration.ssl-context-parameters

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

camel.component.stomp.enabled

启用 stomp 组件

true

布尔值

camel.component.stomp.header-filter-strategy

使用自定义 org.apache.camel.spi.HeaderFilterStrategy 过滤来自 Camel 消息的标头。选项是一个 org.apache.camel.spi.HeaderFilterStrategy 类型。

 

字符串

camel.component.stomp.host

虚拟主机

 

字符串

camel.component.stomp.login

用户名

 

字符串

camel.component.stomp.passcode

密码

 

字符串

camel.component.stomp.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.stomp.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

330.4. Samples

发送消息:

from("direct:foo").to("stomp:queue:test");

消耗消息:

from("stomp:queue:test").transform(body().convertToString()).to("mock:result")

330.5. Endpoints

Camel 使用 Endpoint 接口支持 Message Endpoint 模式。端点通常由组件和端点创建,通常在 DSL 中通过其 URI 引用。

在端点中,您可以使用以下方法

* createProducer () 将创建一个 Producer 用于向端点发送消息交换器 * createConsumer () 实施 Event Driven Consumer 模式,以便在创建 Consumer * createPollingConsumer () 时通过处理器消耗来自端点的消息交换的轮询器。http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Processor.html http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/PollingConsumer.html

330.6. 另请参阅

  • 配置 Camel
  • 消息端点模式
  • URIs
  • 编写组件

第 331 章 Stream Component

作为 Camel 版本 1.3 提供

流: 组件提供对 System.inSystem.outSystem.err 流的访问,并允许流传输文件和 URL。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-stream</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

331.1. URI 格式

stream:in[?options]
stream:out[?options]
stream:err[?options]
stream:header[?options]

另外,支持 文件和 url 端点 URI:

stream:file?fileName=/foo/bar.txt
stream:url[?options]

如果指定了 stream:header URI,则会使用 标头来查找要写入的流。此选项仅适用于流制作者(即,它不能出现在 from ()中)。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

331.2. 选项

Stream 组件没有选项。

Stream 端点使用 URI 语法配置:

stream:kind

使用以下路径和查询参数:

331.2.1. 路径名(1 参数):

名称描述默认类型

kind

需要使用 System.in 或 System.out 等流的 Kind。

 

字符串

331.2.2. 查询参数(22 参数):

名称描述默认类型

encoding (common)

您可以将编码(是一个 charset 名称)配置为使用基于文本的流(例如,消息正文是一个 String 对象)。如果没有提供,Camel 将使用 JVM 默认 Charset。

 

字符串

fileName (common)

在使用 stream:file URI 格式时,这个选项指定到/来自的流文件名。

 

字符串

url (common)

使用 stream:url URI 格式时,这个选项指定要流到/来自于的 URL。输入/输出流将使用 JDK URLConnection 工具打开。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

fileWatcher (consumer)

要使用 JVM 文件观察程序来侦听文件更改事件以支持重载文件,这些文件可能被覆盖,就如 tail --retry

false

布尔值

groupLines (consumer)

对消费者中的 X 号的行进行分组。例如:要对 10 行进行分组,因此只会对有 10 行的交换进行高峰,而不是每行 1 个交换。

 

int

groupStrategy (consumer)

允许使用自定义 GroupStrategy 控制如何分组行。

 

GroupStrategy

initialPromptDelay (consumer)

显示消息提示之前以毫秒为单位的初始延迟。这个延迟只会发生一次。可在系统启动期间使用,以避免在系统执行其他日志记录时写入消息提示。

2000

long

promptDelay (consumer)

显示消息提示前,以毫秒为单位的可选延迟。

 

long

promptMessage (consumer)

从 stream:in 读取时要使用的消息提示符;例如,您可以将它设置为 Enter a command:

 

字符串

retry (consumer)

如果流被覆盖,如 tail --retry 如果从文件中读取,那么您还应启用文件Watcher 选项,使其工作可靠。

false

布尔值

scanStream (consumer)

用于持续读取流,如 unix tail 命令。

false

布尔值

scanStreamDelay (consumer)

使用 scanStream 时读取尝试之间的延迟(毫秒)。

 

long

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

autoCloseCount (producer)

在 Producer side 关闭流前要处理的消息数。默认情况下,从不关闭流(仅在 Producer 被停止时)。如果发送更多消息,则会为另一个 autoCloseCount 批处理重新打开流。

 

int

closeOnDone (producer)

这个选项与 Splitter 结合使用并流传输到同一文件。其理念是保持流打开,只有在完成 Splitter 来提高性能。请记住,这需要您只流到同一文件,而不是 2 个或更多文件。

false

布尔值

delay (producer)

在生成流前以毫秒为单位进行初始延迟。

 

long

connectTimeout (advanced)

设置指定超时值(以毫秒为单位),用于在打开此 URLConnection 所引用资源的通讯链接时使用。如果在建立连接前超时过期,则将引发 java.net.SocketTimeoutException。超时为零被解释为无限超时。

 

int

httpHeaders (advanced)

使用 HTTP URL 时用于请求时使用的可选 http 标头。

 

map

readTimeout (advanced)

将读取超时设置为指定超时,以毫秒为单位。当建立到资源的连接时,非零值会从输入流读取时指定超时。如果在可用于读取数据前超时过期,则将引发 java.net.SocketTimeoutException。超时为零被解释为无限超时。

 

int

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

331.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.stream.enabled

启用流组件

true

布尔值

camel.component.stream.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

331.4. 消息内容

stream: 组件支持将 Stringbyte[] 写入流。只需将 Stringbyte[] 内容添加到 消息.in.body。发送到 流: 二进制模式的制作者不后跟换行字符(而不是 String 消息)。带有 null body 的消息将不会附加到输出流中。
特殊的 stream:header URI 用于自定义输出流。只需在键 标头 中添加 java.io.OutputStream 对象到 message.in. header
请参阅示例示例。

331.5. Samples

在以下示例中,我们将来自 direct:in 端点的消息路由到 system .out 流:

// Route messages to the standard output.
from("direct:in").to("stream:out");

// Send String payload to the standard output.
// Message will be followed by the newline.
template.sendBody("direct:in", "Hello Text World");

// Send byte[] payload to the standard output.
// No newline will be added after the message.
template.sendBody("direct:in", "Hello Bytes World".getBytes());

以下示例演示了如何使用标头类型来确定要使用的流。在示例中,我们使用自己的输出流 MyOutputStream

以下示例演示如何持续读取文件流(与 UNIX tail 命令相关):

from("stream:file?fileName=/server/logs/server.log&scanStream=true&scanStreamDelay=1000")
  .to("bean:logService?method=parseLogLine");

一个带有 scanStream (pre Camel 2.7)或 scanStream + 重试的 getcha 是指文件将重新打开并扫描,并在每次 scanStreamDelay 每次进行扫描。在 NIO2 可用之前,当文件被删除/重新创建时,我们无法可靠检测。

如果要重新加载文件,如果该文件滚动/写入,则您还应打开文件 Watcher重试 选项。

from("stream:file?fileName=/server/logs/server.log&scanStream=true&scanStreamDelay=1000&retry=true&fileWatcher=true")
  .to("bean:logService?method=parseLogLine");

第 332 章 String Encoding DataFormat

作为 Camel 2.12 版本提供

String Data Format 是支持编码的基于文本的格式。

332.1. 选项

String Encoding dataformat 支持 2 选项,它们如下所列。

名称默认Java 类型描述

charset

 

字符串

设置要使用的编码。默认情况下,将使用 JVM 平台默认的 charset。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

332.2. marshal

在本例中,我们将文件内容提供给 UTF-8 编码中的 String 对象。

from("file://data.csv").marshal().string("UTF-8").to("jms://myqueue");

332.3. unmarshal

在本例中,我们在由 newOrder 处理器处理前使用 UTF-8 编码将来自 JMS 队列有效负载到 String 对象。

from("jms://queue/order").unmarshal().string("UTF-8").processRef("newOrder");

332.4. 依赖项

此数据格式以 camel-core 提供,因此不需要额外的依赖项。

第 333 章 字符串模板组件

可作为 Camel 版本 1.2 提供

string-template: 组件允许您使用 String Template 来处理消息。这在使用 Templating 生成请求的响应时是理想的选择。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-stringtemplate</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

333.1. URI 格式

string-template:templateName[?options]

其中 templateName 是要调用的模板的 classpath-local URI;或者,也可以是远程模板的完整 URL。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

333.2. 选项

String Template 组件支持 2 个选项,它们如下所列。

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

String Template 端点使用 URI 语法配置:

string-template:resourceUri

使用以下路径和查询参数:

333.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

资源 所需的 路径。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。

 

字符串

333.2.2. 查询参数(6 参数):

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

delimiterStart (producer)

变量启动分隔符

<

char

delimiterStop (producer)

变量结束分隔符

>

char

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

333.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.string-template.enabled

启用 string-template 组件

true

布尔值

camel.component.string-template.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

333.4. Headers

Camel 会将对资源的引用存储在消息标头中,其键为 org.apache.camel.stringtemplate.resource。资源是一个 org.springframework.core.io.Resource 对象。

333.5. 热重新加载

字符串模板资源默认为 file 和 classpath 资源(expanded jar)的默认 hot-reloadable。如果设置了 contentCache=true,Camel 只加载资源一次,且无法热重新加载。当资源永不改变时,可以在生产环境中使用此场景。

333.6. StringTemplate 属性

自 Camel 2.14 起,您可以通过设置消息标题"CamelStringTemplateVariableMap"来定义自定义上下文映射,就像以下代码一样。

Map<String, Object> variableMap = new HashMap<String, Object>();
Map<String, Object> headersMap = new HashMap<String, Object>();
headersMap.put("name", "Willem");
variableMap.put("headers", headersMap);
variableMap.put("body", "Monday");
variableMap.put("exchange", exchange);
exchange.getIn().setHeader("CamelStringTemplateVariableMap", variableMap);

333.7. Samples

例如,您可以使用字符串模板来制定对消息的响应:

from("activemq:My.Queue").
  to("string-template:com/acme/MyResponse.tm");

333.8. 电子邮件示例

在本例中,我们想要使用字符串模板来发送订单确认电子邮件。电子邮件模板在 StringTemplate 中称为 laid out,因为此示例适用于 camel 2.11.0。如果您的 camel 版本小于 2.11.0,应启动 变量并以 $ 结尾。

Dear <headers.lastName>, <headers.firstName>

Thanks for the order of <headers.item>.

Regards Camel Riders Bookstore
<body>

java 代码如下:

333.9. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 334 章 stub 组件

作为 Camel 2.10 版本提供

stub: 组件提供了一种在开发或测试时存出任何物理端点的简单方法,允许您示例运行路由,而无需实际连接到特定的 SMTPHttp 端点。只需在任何端点 URI 的前面添加 stub: 以存入端点。

Stub 组件在内部 创建虚拟机 端点。Stub VM 之间的主要区别在于,虚拟机将验证您提供的 URI 和参数,因此将 vm: 放在带有查询参数的典型 URI 之前。根根不会被忽略,因为它基本上忽略所有查询参数,以便您在路由中临时存出一个或多个端点。

334.1. URI 格式

stub:someUri

其中,有些Uri 可以是具有任何查询参数的任何 URI。

334.2. 选项

Stub 组件支持 6 选项,它们如下所列。

名称描述默认类型

queueSize (advanced)

设置 SEDA 队列的默认最大容量(例如,它可以保存的消息数)。

1000

int

concurrentConsumers (consumer)

设置默认并发线程处理交换的数量。

1

int

defaultQueueFactory (advanced)

设置默认队列工厂。

 

BlockingQueueFactory

defaultBlockWhenFull (producer)

将消息发送到完整 SEDA 队列的线程是否将阻止,直到队列的容量不再耗尽。默认情况下,将抛出异常表示队列已满。通过启用此选项,调用线程将阻止并等待消息被接受。

false

布尔值

defaultOfferTimeout (producer)

将消息发送到完整 SEDA 队列的线程是否将阻止,直到队列的容量不再耗尽。默认情况下,将抛出异常表示队列已满。启用这个选项,其中可将配置的超时时间添加到块中。使用正在 lint java 队列的 .offer (timeout)方法

 

long

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Stub 端点使用 URI 语法进行配置:

stub:name

使用以下路径和查询参数:

334.2.1. 路径名(1 参数):

名称描述默认类型

name

队列 所需的 名称

 

字符串

334.2.2. 查询参数(17 参数):

名称描述默认类型

size (common)

SEDA 队列的最大容量(例如,它可以持有的消息数)。默认情况下,将使用 SEDA 组件上设置的默认Size。

1000

int

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

concurrentConsumers (consumer)

并发线程处理次数。

1

int

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

limitConcurrentConsumers (consumer)

是否将并发Consumers 数限制为 500 的最大值。默认情况下,如果端点配置了更多数字,则会抛出异常。您可以通过关闭这个选项来禁用该检查。

true

布尔值

multipleConsumers (consumer)

指定是否允许多个消费者。如果启用,您可以使用 SEDA 进行 Publish-Subscribe 消息传递。也就是说,您可以将消息发送到 SEDA 队列,并让每个消费者收到邮件的副本。启用后,应在每个消费者端点上指定这个选项。

false

布尔值

pollTimeout (consumer)

轮询时使用的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

purgeWhenStopping (consumer)

在停止使用者/路由时,要清除任务队列。这允许更快地停止,因为队列上任何待处理的消息都已被丢弃。

false

布尔值

blockWhenFull (producer)

将消息发送到完整 SEDA 队列的线程是否将阻止,直到队列的容量不再耗尽。默认情况下,将抛出异常表示队列已满。通过启用此选项,调用线程将阻止并等待消息被接受。

false

布尔值

discardIfNoConsumers (producer)

制作者是否应丢弃该消息(不要将该消息添加到队列中),在发送到没有活动使用者的队列时。只有一个选项丢弃IfNoConsumers,并且可以同时启用 failIfNoNoNoConsumers。

false

布尔值

failIfNoConsumers (producer)

当发送到没有活动用户的队列时,生产者是否应引发异常。只有一个选项丢弃IfNoConsumers,并且可以同时启用 failIfNoNoNoConsumers。

false

布尔值

offerTimeout (producer)

当队列满时,可以将 offerTimeout (以毫秒为单位)添加到块问题单中。您可以使用 0 或一个负值禁用超时。

 

long

timeout (producer)

SEDA 生产者将在等待异步任务完成前超时(以毫秒为单位)。您可以使用 0 或一个负值禁用超时。

30000

long

waitForTaskToComplete (producer)

指定 caller 是否应该等待 async 任务完成的选项,然后再继续。支持以下三个选项: Always、Never 或 IfReplyExpected。前两个值有自我说明。最后一个值 ifReplyExpected 只有在消息是 Request Reply based.默认选项是 IfReplyExpected。

IfReplyExpected

WaitForTaskToComplete

queue (advanced)

定义将由端点使用的队列实例。这个选项只适用于非常罕见的用例,供您使用自定义队列实例。

 

BlockingQueue

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

334.3. 例子

以下是 stubbing endpoint uris 的几个示例

stub:smtp://somehost.foo.com?user=whatnot&something=else
stub:http://somehost.bar.com/something

部分 II. OpenApi Java Component

可从 Camel 3.1.0 开始

Rest DSL 可以和 camel-openapi-java 模块集成,该模块用于通过 OpenApi 公开 REST 服务及其 API。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-openapi-java</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

camel-openapi-java 模块可以从 REST 组件中使用(不需要 servlet)

第 335 章 在 rest-dsl 中使用 OpenApi

您可以通过配置 apiContextPath dsl 从 rest-dsl 启用 OpenApi api,如下所示:

public class UserRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        // configure we want to use servlet as the component for the rest DSL
        // and we enable json binding mode
        restConfiguration().component("netty-http").bindingMode(RestBindingMode.json)
            // and output using pretty print
            .dataFormatProperty("prettyPrint", "true")
            // setup context path and port number that netty will use
            .contextPath("/").port(8080)
            // add OpenApi api-doc out of the box
            .apiContextPath("/api-doc")
                .apiProperty("api.title", "User API").apiProperty("api.version", "1.2.3")
                // and enable CORS
                .apiProperty("cors", "true");

        // this user REST service is json only
        rest("/user").description("User rest service")
            .consumes("application/json").produces("application/json")
            .get("/{id}").description("Find user by id").outType(User.class)
                .param().name("id").type(path).description("The id of the user to get").dataType("int").endParam()
                .to("bean:userService?method=getUser(${header.id})")
            .put().description("Updates or create a user").type(User.class)
                .param().name("body").type(body).description("The user to update or create").endParam()
                .to("bean:userService?method=updateUser")
            .get("/findAll").description("Find all users").outType(User[].class)
                .to("bean:userService?method=listUsers");
    }
}

第 336 章 选项

OpenApi 模块可使用以下选项进行配置:要使用 servlet 配置,请使用上文所示的 init-param。在 rest-dsl 中直接配置时,您可以使用适当的方法,如 enableCORShost、contextPath、dsl。api.xxx 的选项使用 apiProperty dsl 配置。

选项类型描述

CORS

布尔值

是否启用 CORS。请注意,这只会为 api 浏览器启用 CORS,而不启用对 REST 服务的实际访问权限。默认为 false。

openapi.version

字符串

OpenAPI spec 版本。是默认的 3.0。

主机

字符串

设置主机名。如果没有配置 camel-openapi-java,它将计算为基于 localhost 的名称。

方案

字符串

要使用的协议方案。可以使用逗号分隔多个值,如 "http,https"。默认值为 "http"。

base.path

字符串

必需 :要设置 REST 服务可用的基本路径。该路径为 relative (例如,不以 http/https 开头),Clal-openapi-java 将在运行时计算绝对基本路径,即 protocol://host:port/context-path/base.path

api.path

字符串

要设置 API 可用的路径(如 /api-docs)。该路径是相对的(例如,从 http/https 开始),Carl-openapi-java 将在运行时计算绝对基本路径,即 protocol://host:port/context-path/api.path So 使用相对路径非常容易。请参阅上面的示例。

api.version

字符串

api 的版本。是默认的 0.0.0。

api.title

字符串

应用程序的标题。

api.description

字符串

应用程序的简短描述。

api.termsOfService

字符串

API 术语的 URL。

api.contact.name

字符串

要联系的人员或机构名称

api.contact.email

字符串

用于 API 相关的电子邮件。

api.contact.url

字符串

网站 URL 以获取更多信息。

api.license.name

字符串

用于 API 的许可证名称。

api.license.url

字符串

用于 API 的许可证的 URL。

apiContextIdListing

布尔值

是否允许列出 JVM 中具有 REST 服务的所有 CamelContext 名称。启用后,api-doc 的根路径将列出所有上下文。禁用后没有列出上下文 id,api-doc 的根路径列出了当前的 CamelContext。默认为 false。

apiContextIdPattern

字符串

允许过滤在上下文列表中显示 CamelContext 名称的模式。模式使用正则表达式和 * 作为通配符。其与 Intercept 使用的相同的模式匹配

第 337 章 在 API 中添加安全定义

可从 Camel 3.1.0 开始

Rest DSL 现在支持在生成的 API 文档中声明 OpenApi securityDefinitions。例如,如下所示:

rest("/user").tag("dude").description("User rest service")
    // setup security definitions
    .securityDefinitions()
        .oauth2("petstore_auth").authorizationUrl("http://petstore.swagger.io/oauth/dialog").end()
        .apiKey("api_key").withHeader("myHeader").end()
    .end()
    .consumes("application/json").produces("application/json")

此处已设置两个安全定义

  • OAuth2 - 带有提供的 url 的隐式授权
  • API Key - 使用来自名为 myHeader的 HTTP 标头的 api 键

然后,您需要通过引用密钥(petstore_auth 或 api_key)来指定安全使用的剩余操作。

.get("/{id}/{date}").description("Find user by id and date").outType(User.class)
    .security("api_key")

...

.put().description("Updates or create a user").type(User.class)
    .security("petstore_auth", "write:pets,read:pets")

此处的 get 操作使用 Api Key 安全性,而 放置操作则正在使用 OAuth 安全性,具有允许的读取和写入宠物。

第 338 章 ContextIdListing enabled

启用 contextIdListing 后,它将检测到所有正在运行的 CamelContexts 在同一个 JVM 中。这些上下文以 json 格式列在根路径中,eg /api-docs 作为简单名称列表。若要访问 OpenApi 文档,必须先将 context-path 附加到 Camel 上下文 ID,如 api-docs/myCamel。选项 apiContextIdPattern 可用于过滤此列表中的名称。

第 339 章 JSON 或 Yaml

* 可作为 Camel 3.1.0 提供

camel-openapi-java 模块同时支持 JSon 和 Yaml out 框。您可以在请求 URL 中指定您要使用 /openapi.json 或 /openapi.yaml 返回的内容。如果没有指定任何,则使用 HTTP Accept 标头来检测是否可以接受 json 或 yaml。如果同时接受或没有被设置为接受,则 json 将返回为默认格式。

第 340 章 例子

在 Apache Camel 发行版中,我们提供了 camel-example-openapi-cdicamel-example-openapi-java,它演示了使用此 OpenApi 组件。

第 341 章 Swagger Java 组件

可从 Camel 2.16 开始

Rest DSL 可以和 camel-swagger-java 模块集成,该模块用于使用 Swagger 来公开 REST 服务及其 API。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-swagger-java</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

camel-swagger-java 模块可以从 REST 组件使用(不需要 servlet)

341.1. 在 rest-dsl 中使用 Swagger

您可以通过配置 apiContextPath dsl 从 rest-dsl 启用 swagger api,如下所示:

public class UserRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        // configure we want to use servlet as the component for the rest DSL
        // and we enable json binding mode
        restConfiguration().component("netty4-http").bindingMode(RestBindingMode.json)
            // and output using pretty print
            .dataFormatProperty("prettyPrint", "true")
            // setup context path and port number that netty will use
            .contextPath("/").port(8080)
            // add swagger api-doc out of the box
            .apiContextPath("/api-doc")
                .apiProperty("api.title", "User API").apiProperty("api.version", "1.2.3")
                // and enable CORS
                .apiProperty("cors", "true");

        // this user REST service is json only
        rest("/user").description("User rest service")
            .consumes("application/json").produces("application/json")
            .get("/{id}").description("Find user by id").outType(User.class)
                .param().name("id").type(path).description("The id of the user to get").dataType("int").endParam()
                .to("bean:userService?method=getUser(${header.id})")
            .put().description("Updates or create a user").type(User.class)
                .param().name("body").type(body).description("The user to update or create").endParam()
                .to("bean:userService?method=updateUser")
            .get("/findAll").description("Find all users").outTypeList(User.class)
                .to("bean:userService?method=listUsers");
    }
}

 

341.2. 选项

可以使用以下选项配置 swagger 模块:要使用 servlet 配置,请使用上文所示的 init-param。在 rest-dsl 中直接配置时,您可以使用适当的方法,如 enableCORS、 host、contextPath、dsl。api.xxx 的选项使用 apiProperty dsl 配置。

选项类型描述

CORS

布尔值

是否启用 CORS。请注意,这只会为 api 浏览器启用 CORS,而不启用对 REST 服务的实际访问权限。默认为 false。

swagger.version

字符串

Swagger spec 版本.默认 2.0。

主机

字符串

设置主机名。如果没有配置 camel-swagger-java,它将计算为基于 localhost 的名称。

模式

字符串

要使用的协议方案。可以使用逗号分隔多个值,如 "http,https"。默认值为 "http"。这个选项从 Camel 2.17 开始被弃用,因为它应该已命名为 schemes。

方案

字符串

Camel 2.17: 要使用的协议方案。可以使用逗号分隔多个值,如 "http,https"。默认值为 "http"。

base.path

字符串

必需 :要设置 REST 服务可用的基本路径。该路径为 relative (例如,不以 http/https 开头),camel-swagger-java 会在运行时计算绝对基本路径,即 protocol://host:port/context-path/base.path

api.path

字符串

要设置 API 可用的路径(如 /api-docs)。该路径为 relative (例如,不以 http/https 开头),Carl-swagger-java 会在运行时计算绝对基本路径,即使用相对路径的 protocol://host:port/context-path/api.path So 更为简单。请参阅上面的示例。

api.version

字符串

api 的版本。是默认的 0.0.0。

api.title

字符串

应用程序的标题。

api.description

字符串

应用程序的简短描述。

api.termsOfService

字符串

API 术语的 URL。

api.contact.name

字符串

要联系的人员或机构名称

api.contact.email

字符串

用于 API 相关的电子邮件。

api.contact.url

字符串

网站 URL 以获取更多信息。

api.license.name

字符串

用于 API 的许可证名称。

api.license.url

字符串

用于 API 的许可证的 URL。

apiContextIdListing

布尔值

是否允许列出 JVM 中具有 REST 服务的所有 CamelContext 名称。启用后,api-doc 的根路径将列出所有上下文。禁用后没有列出上下文 id,api-doc 的根路径列出了当前的 CamelContext。默认为 false。

apiContextIdPattern

字符串

允许过滤在上下文列表中显示 CamelContext 名称的模式。模式使用正则表达式和 * 作为通配符。其与 Intercept 使用的相同的模式匹配

341.3. 在 API 中添加安全定义

可作为 Camel 2.22.0 提供

Rest DSL 现在支持在生成的 API 文档中声明 Swagger securityDefinitions。例如,如下所示:

rest("/user").tag("dude").description("User rest service")
    // setup security definitions
    .securityDefinitions()
        .oauth2("petstore_auth").authorizationUrl("http://petstore.swagger.io/oauth/dialog").end()
        .apiKey("api_key").withHeader("myHeader").end()
    .end()
    .consumes("application/json").produces("application/json")

此处已设置两个安全定义

  • OAuth2 - 带有提供的 url 的隐式授权
  • API Key - 使用来自名为 myHeader的 HTTP 标头的 api 键

然后,您需要通过引用密钥(petstore_auth 或 api_key)来指定安全使用的剩余操作。

.get("/{id}/{date}").description("Find user by id and date").outType(User.class)
    .security("api_key")

...

.put().description("Updates or create a user").type(User.class)
    .security("petstore_auth", "write:pets,read:pets")

此处的 get 操作使用 Api Key 安全性,而 放置操作则正在使用 OAuth 安全性,具有允许的读取和写入宠物。

341.4. ContextIdListing enabled

启用 contextIdListing 后,它将检测到所有正在运行的 CamelContexts 在同一个 JVM 中。这些上下文以 json 格式列在根路径中,eg /api-docs 作为简单名称列表。若要访问 swagger 文档,必须先将 context-path 附加到 Camel 上下文 ID,如 api-docs/myCamel。选项 apiContextIdPattern 可用于过滤此列表中的名称。

341.5. JSON 或 Yaml

可从 Camel 2.17 开始

camel-swagger-java 模块同时支持 JSon 和 Yaml out 框。您可以在请求 url 中指定您要返回的内容,分别使用 /swagger.json 或 /swagger.yaml。如果没有指定任何,则使用 HTTP Accept 标头来检测是否可以接受 json 或 yaml。如果同时接受或没有被设置为接受,则 json 将返回为默认格式。

341.6. 例子

在 Apache Camel 发行版中,我们提供了 camel-example-swagger-cdi 和 camel-example-swagger-java ,它演示了使用此 Swagger 组件。

第 342 章 Syslog DataFormat

可作为 Camel 版本 2.6 提供。

syslog dataformat 用于使用 RFC3164 和 RFC5424 信息。

这个组件支持以下内容:

  • syslog 信息的 UDP 消耗
  • 使用纯文本字符串对象或 SyslogMessage 模型对象进行无关的数据格式。
  • 键入 Converter from/to SyslogMessage 和 String
  • camel-mina 组件集成。
  • camel-netty 组件集成。
  • Camel 2.14: camel-netty 组件的 Encoder 和解码器。
  • Camel 2.14: 对 RFC5424 的支持也.

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-syslog</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

342.1. RFC3164 Syslog 协议

syslog 使用用户数据报协议(UDP) 1 作为其底层传输层机制。分配给 syslog 的 UDP 端口是 514。

要公开 Syslog 侦听器服务,我们重复使用现有的 camel-mina 组件或 camel-netty,其中我们仅使用 Rfc3164SyslogDataFormat marshal 和 unmarshal 消息。请注意,从位于 syslog dataformat 的 Camel 2.14 被重命名为 SyslogDataFormat

342.2. 选项

Syslog 数据格式支持 1 选项,它们列如下。

名称默认Java 类型描述

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

342.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.dataformat.syslog.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.syslog.enabled

启用 syslog dataformat

true

布尔值

ND

342.4. RFC5424 Syslog 协议

可从 Camel 2.14 开始

要公开 Syslog 侦听器服务,我们重复使用现有的 camel-mina 组件或 camel-netty ,其中我们仅使用 SyslogDataFormat 进行汇总和解封消息

342.4.1. 公开 Syslog 侦听程序

在 Spring XML 文件中,我们将端点配置为在端口 10514 上侦听 udp 信息,请注意,在 netty 中,我们将禁用默认的Codec,允许一个回退到 NettyTypeConverter,并将消息作为 InputStream 传递:

<camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring">

    <dataFormats>
          <syslog id="mySyslog"/>
    </dataFormats>

    <route>
          <from uri="netty:udp://localhost:10514?sync=false&amp;allowDefaultCodec=false"/>
          <unmarshal ref="mySyslog"/>
          <to uri="mock:stop1"/>
    </route>

</camelContext>

使用 camel-mina的相同路由

<camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring">

    <dataFormats>
          <syslog id="mySyslog"/>
    </dataFormats>

    <route>
          <from uri="mina:udp://localhost:10514"/>
          <unmarshal ref="mySyslog"/>
          <to uri="mock:stop1"/>
    </route>

</camelContext>

342.4.2. 将 syslog 信息发送到远程目的地

<camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring">

    <dataFormats>
        <syslog id="mySyslog"/>
    </dataFormats>

    <route>
        <from uri="direct:syslogMessages"/>
        <marshal ref="mySyslog"/>
        <to uri="mina:udp://remotehost:10514"/>
    </route>

</camelContext>

342.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 343 章 tar File DataFormat

作为 Camel 版本 2.16 可用

Tar File Data Format 是消息压缩和 de-compression 格式。可将消息提取(压缩的)到包含单个条目的 Tar 文件,并且可以将含有单个条目的 Tar Files 解封(被压缩)到原始文件内容。

还有一个聚合策略,可以将多个信息聚合到一个 Tar 文件中。

343.1. tarfile 选项

Tar 文件数据格式支持 4 个选项,它们如下。

名称默认Java 类型描述

usingIterator

false

布尔值

如果 tar 文件又有一个条目,则此选项将此选项设置为 true,允许使用 splitter EIP,在流模式中使用它分割数据。

allowEmptyDirectory

false

布尔值

如果 tar 文件包含多个条目,则将此选项设置为 true,即使该目录为空,也允许 获取它程序。

preservePathElements

false

布尔值

如果文件名包含路径元素,请将此选项设置为 true,允许在 tar 文件中维护该路径。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

343.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.tarfile.allow-empty-directory

如果 tar 文件包含多个条目,则将此选项设置为 true,即使该目录为空,也允许 获取它程序。

false

布尔值

camel.dataformat.tarfile.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.tarfile.enabled

启用 tarfile 数据格式

true

布尔值

camel.dataformat.tarfile.preserve-path-elements

如果文件名包含路径元素,请将此选项设置为 true,允许在 tar 文件中维护该路径。

false

布尔值

camel.dataformat.tarfile.using-iterator

如果 tar 文件又有一个条目,则此选项将此选项设置为 true,允许使用 splitter EIP,在流模式中使用它分割数据。

false

布尔值

ND

343.3. marshal

在本例中,我们使用 Tar 文件压缩将常规文本/XML 有效负载汇总为压缩有效负载,并将其发送到名为 MY_QUEUE 的 ActiveMQ 队列。

from("direct:start").marshal().tarFile().to("activemq:queue:MY_QUEUE");

创建 Tar File 中的 Tar 条目的名称基于传入的 CamelFileName 消息标头,这是由文件组件使用的标准消息标头。另外,传出的 CamelFileName 消息标头会自动设置为传入的 CamelFileName 邮件标头的值,带有 ".tar" 后缀。例如,如果以下路由在输入目录中找到名为"test.txt"的文件,则输出将是名为"test.txt.tar"的 Tar 文件,其中包含一个名为 "test.txt" 的单个 Tar 条目:

from("file:input/directory?antInclude=*/.txt").marshal().tarFile().to("file:output/directory");

如果没有传入的 CamelFileName 消息标头(例如,如果文件组件不是消费者),则默认使用消息 ID,因为消息 ID 通常是一个唯一生成的 ID,因此,您将以 ID-MACHINENAME-24-1211718892437-1-0.tar 等文件名结束。如果要覆盖此行为,可以在路由中明确设置 CamelFileName 标头的值:

from("direct:start").setHeader(Exchange.FILE_NAME, constant("report.txt")).marshal().tarFile().to("file:output/directory");

此路由会导致输出目录中名为"report.txt.tar"的 Tar 文件,其中包含一个名为 "report.txt" 的单个 Tar 条目。

343.4. unmarshal

在本例中,我们从名为 MY_QUEUE 的 ActiveMQ 队列传播 Tar 文件有效负载,并将其转发到 UnTarpedMessageProcessor

from("activemq:queue:MY_QUEUE").unmarshal().tarFile().process(new UnTarpedMessageProcessor()); 

如果 Tar 文件有更多条目,则使用 TarFileDataFormat 的使用Iterator 选项为 true,您可以使用 splitter 进行进一步工作。

  TarFileDataFormat tarFile = new TarFileDataFormat();
  tarFile.setUsingIterator(true);
  from("file:src/test/resources/org/apache/camel/dataformat/tarfile/?consumer.delay=1000&noop=true")
    .unmarshal(tarFile)
    .split(body(Iterator.class))
        .streaming()
          .process(new UnTarpedMessageProcessor())
    .end();

或者您可以使用 TarSplitter 作为拆分人的表达式,如下所示

   from("file:src/test/resources/org/apache/camel/dataformat/tarfile?consumer.delay=1000&noop=true")
     .split(new TarSplitter())
        .streaming()
        .process(new UnTarpedMessageProcessor())
     .end();

343.5. aggregate

INFO:请注意,此聚合策略需要预先完成检查才能正常工作。

在本例中,我们将输入目录中找到的所有文本文件汇集到一个存储在输出目录中的一个 Tar 文件中。 

   from("file:input/directory?antInclude=*/.txt")
     .aggregate(new TarAggregationStrategy())
       .constant(true)
       .completionFromBatchConsumer()
       .eagerCheckCompletion()
   .to("file:output/directory");

传出的 CamelFileName 消息标头使用 java.io.File.createTempFile 创建,带有 ".tar" 后缀。 如果要覆盖此行为,您可以在路由中明确设置 CamelFileName 标头的值:

   from("file:input/directory?antInclude=*/.txt")
     .aggregate(new TarAggregationStrategy())
       .constant(true)
       .completionFromBatchConsumer()
       .eagerCheckCompletion()
     .setHeader(Exchange.FILE_NAME, constant("reports.tar"))
   .to("file:output/directory");

343.6. 依赖项

要在 camel 路由中使用 Tar 文件,您需要添加实现此数据格式的 camel-tarfile 依赖项。

如果使用 Maven,您只需在 pom.xml 中添加以下内容,替换最新和最长版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-tarfile</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

第 344 章 Telegram 组件

作为 Camel 2.18 版提供

Telegram 组件提供对 Telegram Bot API 的访问。它允许基于 Camel 的应用程序作为 Bot 发送和接收消息,并参与与普通用户、私有和公共组或频道直接对话。

必须使用此组件前必须创建 Telegram Bot,遵循 Telegram Bot 开发人员主页 的说明。当创建新 Bot 时,B BotFather 提供了一个与 Bot 对应的 授权令牌。授权令牌是 camel-telegram 端点的必需参数。

注意

要允许 Bot 接收在组或频道中交换的所有消息(而不只是以 '/' 字符开始),询问 BotFather 禁用隐私模式,请使用 /setprivacy 命令。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-telegram</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

344.1. URI 格式

telegram:type/authorizationToken[?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

344.2. 选项

Telegram 组件支持 2 个选项,它们如下所列。

名称描述默认类型

authorizationToken (security)

在端点中未提供信息时,要使用的默认的 Telegram 授权令牌。

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Telegram 端点使用 URI 语法进行配置:

telegram:type/authorizationToken

使用以下路径和查询参数:

344.2.1. 路径名(2 参数):

名称描述默认类型

type

所需的 端点类型。目前,只支持 'bots' 类型。

 

字符串

authorizationToken

使用 bot 的授权令牌(绑定 BotFather)、eg. 654321531:HGF_dTra456323dHuOedsE343211fqr3t-H。

 

字符串

344.2.2. 查询参数(22 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

limit (consumer)

在单个轮询请求中收到的更新数量的限值。

100

整数

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

timeout (consumer)

长时间轮询超时(以秒为单位)。让 0 用于短轮询或更大数字,以便进行长期轮询。长期轮询会产生较短的响应时间。

30

整数

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

chatId (producer)

接收所生成消息的 chat 标识符。可以首先从传入消息获取 chat id(例如,当 telegram 用户开始与 bot 的对话时,其客户端会自动发送包含 chat id 的"/start"消息)。这是一个可选参数,因为可以为每个传出消息动态设置 chat id(使用正文或标头)。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

344.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.telegram.authorization-token

在端点中未提供信息时,要使用的默认的 Telegram 授权令牌。

 

字符串

camel.component.telegram.enabled

启用 telegram 组件

true

布尔值

camel.component.telegram.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

344.4. 消息标头

名称描述

CamelTelegramChatId

此标头供制作者端点使用,以解析接收消息的 chat id。接收者 chat id 可以在邮件正文中(按优先级顺序)放置在 CamelTelegramChatId 标头或端点配置(chatId 选项)中。所有传入信息中也存在此标头。

CamelTelegramMediaType

此标头用于在由纯二进制数据构成传出消息时标识介质类型。可能的值有属于 org.apache.camel.component.telegram.TelegramMediaType enumeration 的字符串或 enum 值。

CamelTelegramMediaTitleCaption

此标头用于为传出的二进制邮件提供标题或标题。

CamelTelegramParseMode

此标头用于通过 HTML 或 Markdown 格式化文本消息(请参阅 org.apache.camel.component.telegram.TelegParseMode)。

344.5. 使用

Telegram 组件支持使用者和制作者端点。它也可用于 被动 chat-bot 模式 (使用,然后生成消息)。

344.6. producer 示例

以下是如何通过 Telegram Bot API 发送消息到 Telegram Bot API 的消息。

在 Java DSL 中

from("direct:start").to("telegram:bots/123456789:insertYourAuthorizationTokenHere");

或在 Spring XML 中

<route>
    <from uri="direct:start"/>
    <to uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
<route>

代码 123456789:insertYourAuthorizationTokenHere 是与 Bot 对应的 授权令牌

在使用制作者端点而不指定 chat id 选项时,会使用消息正文或标题中包含的信息来识别目标 chat。以下消息正文用于制作者端点(类型为 OutgoingXXXMessage 的消息属于软件包 org.apache.camel.component.telegram.model

Java 类型描述

OutgoingTextMessage

向聊天中发送文本信息

OutgoingPhotoMessage

将照片(JPG、PNG)发送到聊天

OutgoingAudioMessage

将 mp3 音频发送到一个聊天

OutgoingVideoMessage

将 mp4 视频发送到聊天

OutgoingDocumentMessage

将文件发送到聊天(任何介质类型)

byte[]

发送支持的任何介质类型。它要求将 CamelTelegramMediaType 标头设置为适当的介质类型

字符串

向聊天发送文本信息。它会自动转换为 OutgoingTextMessage

344.7. 消费者示例

以下是如何接收 telegram 用户将发送到配置的 Bot 的所有信息的基本示例。在 Java DSL 中

from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
.bean(ProcessorBean.class)

或在 Spring XML 中

<route>
    <from uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
    <bean ref="myBean" />
<route>

<bean id="myBean" class="com.example.MyBean"/>

MyBean 是一个将接收消息的简单 bean

public class MyBean {

    public void process(String message) {
        // or Exchange, or org.apache.camel.component.telegram.model.IncomingMessage (or both)

        // do process
    }

}

传入消息的受支持类型包括

Java 类型描述

IncomingMessage

传入消息的完整对象表示

字符串

消息的内容,仅用于文本信息

344.8. Reactive Chat-Bot 示例

被动聊天模式是使用 Camel 组件构建一个简单的聊天 bot 的简单方式,以回复直接从 Telegram 用户接收的消息。

以下是 Java DSL 中 chat-bot 的基本配置

from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
.bean(ChatBotLogic.class)
.to("telegram:bots/123456789:insertYourAuthorizationTokenHere");

或在 Spring XML 中

<route>
    <from uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
    <bean ref="chatBotLogic" />
    <to uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
<route>

<bean id="chatBotLogic" class="com.example.ChatBotLogic"/>

ChatBotLogic 是一个实现通用字符串到字符串方法的简单 bean。

public class ChatBotLogic {

    public String chatBotProcess(String message) {
        if( "do-not-reply".equals(message) ) {
            return null; // no response in the chat
        }

        return "echo from the bot: " + message; // echoes the message
    }

}

chatBotProcess 方法返回的每个非空字符串会自动路由到源自该请求的聊天(因为 CamelTelegramChatId 标头用于路由消息)。

344.9. 获取 Chat ID

如果要在发生事件时将消息推送到特定的 Telegram chat,则需要检索对应的 chat ID。chat ID 目前没有在 telegram 客户端中显示,但您可以使用一个简单的路由来获取。

首先,将 bot 添加到您要推送消息的 chat 中,然后运行类似以下的路由。

from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
.to("log:INFO?showHeaders=true");

bot 收到的所有消息都将转储到您的日志中,并提供聊天信息(CamelTelegramChatId 标头)。

获取聊天 ID 后,您可以使用以下示例路由将其推送消息。

from("timer:tick")
.setBody().constant("Hello")
to("telegram:bots/123456789:insertYourAuthorizationTokenHere?chatId=123456")

请注意,对应的 URI 参数只是 chatId

344.10. 自定义键盘

您可以自定义用户键盘,而不必要求他编写选项。OutgoingTextMessage 具有 ReplyKeyboardMarkup 属性,可用于此类事情。

from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
    .process(exchange -> {

        OutgoingTextMessage msg = new OutgoingTextMessage();
        msg.setText("Choose one option!");

        InlineKeyboardButton buttonOptionOneI = InlineKeyboardButton.builder()
                .text("Option One - I").build();

        InlineKeyboardButton buttonOptionOneII = InlineKeyboardButton.builder()
                .text("Option One - II").build();

        InlineKeyboardButton buttonOptionTwoI = InlineKeyboardButton.builder()
                .text("Option Two - I").build();

        ReplyKeyboardMarkup replyMarkup = ReplyKeyboardMarkup.builder()
                .keyboard()
                    .addRow(Arrays.asList(buttonOptionOneI, buttonOptionOneII))
                    .addRow(Arrays.asList(buttonOptionTwoI))
                    .close()
                .oneTimeKeyboard(true)
                .build();

        msg.setReplyKeyboardMarkup(replyMarkup);

        exchange.getIn().setBody(msg);
    })
    .to("telegram:bots/123456789:insertYourAuthorizationTokenHere");

如果要禁用下一消息,则必须在 ReplyKeyboardMarkup 对象中设置属性 removeKeyboard Markup。

from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
    .process(exchange -> {

        OutgoingTextMessage msg = new OutgoingTextMessage();
        msg.setText("Your answer was accepted!");

        ReplyKeyboardMarkup replyMarkup = ReplyKeyboardMarkup.builder()
                .removeKeyboard(true)
                .build();

        msg.setReplyKeyboardMarkup(replyMarkup);

        exchange.getIn().setBody(msg);
    })
    .to("telegram:bots/123456789:insertYourAuthorizationTokenHere");

第 345 章 测试组件

作为 Camel 版本 1.3 提供

测试分布式和异步处理非常困难。MockTestingDataSet 端点与 Camel 测试框架配合良好,使用 企业集成模式 和 Camel 的大型组件与强大的 Bean 集成来简化您的单元和集成测试。

测试 组件扩展了 Mock 组件,以支持在启动时从另一端点拉取消息,以在底层 Mock 端点上设置预期的消息正文。也就是说,您在路由中使用测试端点,到达它的消息将与从某个其他位置中提取的一些预期消息进行比较。

因此,您可以使用一组预期消息正文作为文件。然后,这将设置正确配置的 Mock 端点,只有在收到的消息与预期消息的数量及其消息有效负载数相等时才有效。

使用 Camel 2.8 或更早版本时,Maven 用户需要在其 pom.xml 中添加以下依赖关系:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

在 camel-core 中直接提供 测试 组件的 Camel 2.9。

345.1. URI 格式

test:expectedMessagesEndpointUri

其中 expectedMessagesEndpointUri 是指启动测试前从中拉取了预期的消息正文的一些其他组件 URI。

345.2. URI 选项

Test 组件没有选项。

Test 端点使用 URI 语法配置:

test:name

使用以下路径和查询参数:

345.2.1. 路径名(1 参数):

名称描述默认类型

name

注册表中查找所需的端点名称,以用于测试的轮询消息

 

字符串

345.2.2. 查询参数(14 参数):

名称描述默认类型

anyOrder (producer)

预期消息是否应该以相同顺序到达,还是以任何顺序排列。

false

布尔值

assertPeriod (producer)

设置一个宽限期,在模拟端点将重新排序后,以确保预消除断言仍然有效。例如,这使用 断言完全到达多个消息。例如,如果 expectedMessageCount(int)被设置为 5,则当 5 个或更多消息到达时满足断言。要确保正好 5 个消息到达,您需要等待一些期限以确保没有进一步的消息到达。这是您可以使用此 setAssertPeriod (长)方法。默认情况下禁用这个周期。

0

long

delimiter (producer)

启用分割时使用的分割分隔符。默认情况下,分隔符以新行为基础。分隔符可以是正则表达式。

 

字符串

expectedCount (producer)

指定此端点应收到的预期消息交换数量。注意:如果您想要预期是 0 信息,那么在测试开始时,需要设置 0 匹配,以便让测试在一定时间运行期间,以确保没有消息被到达;对于使用 setAssertPeriod(long)。另一种方法是使用 NotifyBuilder,并在在模拟器上调用 assertIsSatisfied()方法前,使用通知程序来知道 Camel 需要路由某些信息。这可让您使用固定的断言周期来加快测试时间。如果您想要断言有 n 条消息到达这个模拟端点,则还需要看到 setAssertPeriod(long)方法了解更多详情。

-1

int

reportGroup (producer)

用于根据大小组打开吞吐量日志的数字。

 

int

resultMinimumWaitTime (producer)

设置 assertIsSatised ()将在 latch 上等待的时间最少的时间(以 millisisis)等待。

0

long

resultWaitTime (producer)

设置 assertIsSatised ()将在 latch 上等待的最大时间(以 millisisis)等待的时间,直到它满足为止

0

long

retainFirst (producer)

指定仅保留第 n 个接收交换的数量。这在测试大数据时,通过不存储每个 Exchange this模拟端点的副本来减少内存消耗。重要信息:使用这个限制时,getReceivedCounter()仍会返回接收的 Exchange 的实际数量。例如,如果我们收到 5000 Exchanges,并且已配置为仅保留第 10 个 Exchanges,则 getReceivedCounter()将仍然返回 5000,但 getExchanges()中只有前 10 Exchanges()和 getReceivedExchanges()方法。使用此方法时,某些其它预期方法不被支持,例如 expectedBodiesReceived (Object…​)会设置收到的第一个数量的正文。您可以配置 setRetainFirst(int)和 setRetainLast(int)方法来限制第一个和最后一个接收的方法。

-1

int

retainLast (producer)

指定仅保留最近 n 个接收的 Exchange 数。这在测试大数据时,通过不存储每个 Exchange this模拟端点的副本来减少内存消耗。重要信息:使用这个限制时,getReceivedCounter()仍会返回接收的 Exchange 的实际数量。例如,如果我们收到 5000 Exchanges,并且已配置为仅保留最后 20 个 Exchanges,则 getReceivedCounter()将仍然返回 5000,但 getExchanges()中只有最后 20 Exchanges()和 getReceivedExchanges()方法。使用此方法时,某些其它预期方法不被支持,例如 expectedBodiesReceived (Object…​)会设置收到的第一个数量的正文。您可以配置 setRetainFirst(int)和 setRetainLast(int)方法来限制第一个和最后一个接收的方法。

-1

int

sleepForEmptyTest (producer)

允许指定睡眠,在 expectedMessageCount (int)被调用时,等待此端点是否确实为空。

0

long

split (producer)

如果启用从测试端点加载的消息将使用新行分隔符来拆分,则每行为预期消息。例如,使用文件端点来加载一行为预期消息的文件。

false

布尔值

timeout (producer)

轮询 URI 中消息正文时使用的超时

2000

long

copyOnExchange (producer)

设定在这种模拟端点接收时是否对传入 Exchange 进行深度副本。默认为 true。

true

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

345.3. 示例

例如,您可以按照如下所示编写测试案例:

from("seda:someEndpoint").
  to("test:file://data/expectedOutput?noop=true");

如果您的测试随后调用 MockEndpoint.assertIsSatisfied (camelContext)方法,则您的测试案例将执行必要的断言。

要了解如何可以在测试端点上设置其他预期,请参阅 Mock 组件。

345.4. 另请参阅

  • Spring 测试

第 346 章 Thrift 组件

可作为 Camel 版本 2.20 可用

Thrift 组件允许您使用 Apache Thrift 二进制通信协议和序列化机制调用或公开远程过程调用(RPC)服务。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-thrift</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

346.1. URI 格式

thrift://service[?options]

346.2. 端点选项

Thrift 组件支持 2 个选项,它们如下所列。

名称描述默认类型

useGlobalSslContext Parameters (security)

确定thrift 组件是否使用全局 SSL 上下文参数

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Thrift 端点使用 URI 语法进行配置:

thrift:host:port/service

使用以下路径和查询参数:

346.2.1. 路径名(3 参数):

名称描述默认类型

主机

Thrift 服务器主机名。在使用制作者时,这是 localhost 或 0.0.0.0 (如果未定义)为消费者或远程服务器主机名。

 

字符串

port

所需的 Thrift 服务器端口

 

int

service

thrift 描述符文件(软件包点服务名称) 需要 Fully qualified service name。

 

字符串

346.2.2. 查询参数(12 参数):

名称描述默认类型

compressionType (common)

协议压缩机制类型

NONE

ThriftCompressionType

exchangeProtocol (common)

交换协议序列化类型

二进制

ThriftExchangeProtocol

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

clientTimeout (consumer)

用户的客户端超时

 

int

maxPoolSize (consumer)

Thrift 服务器使用者最大线程池大小

10

int

poolSize (consumer)

Thrift 服务器使用者初始线程池大小

1

int

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

方法 (生成器)

Thrift 调用的方法名称

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

negotiationType (security)

安全协商类型

PLAINTEXT

ThriftNegotiationType

sslParameters (security)

SSL/TLS 安全协商的配置参数

 

SSLContextParameters

346.3. Spring Boot Auto-Configuration

组件支持 7 个选项,如下所示。

名称描述默认类型

camel.component.thrift.enabled

是否启用 thrift 组件自动配置。默认启用。

 

布尔值

camel.component.thrift.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.thrift.use-global-ssl-context-parameters

确定thrift 组件是否使用全局 SSL 上下文参数

false

布尔值

camel.dataformat.thrift.content-type-format

定义内容类型格式,其中的 thrift 消息将被序列化/反序列化为 Java。格式可以是 native 或 json,可以是原生二进制偏移 json 或简单的 json 字段表示。默认值为 binary。

binary

字符串

camel.dataformat.thrift.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.thrift.enabled

是否启用偏移数据格式的自动配置。默认启用。

 

布尔值

camel.dataformat.thrift.instance-class

取消armshalling 时要使用的类名称

 

字符串

346.4. Thrift 方法参数映射

称为流程中的参数必须作为消息正文中的对象列表进行传递。原语以实时地从对象转换。要正确查找对应的方法,无论值如何,必须传输所有类型。请查看下图图,如何使用 Camel 正文将不同的参数传递给方法

List requestBody = new ArrayList();

requestBody.add((boolean)true);
requestBody.add((byte)THRIFT_TEST_NUM1);
requestBody.add((short)THRIFT_TEST_NUM1);
requestBody.add((int)THRIFT_TEST_NUM1);
requestBody.add((long)THRIFT_TEST_NUM1);
requestBody.add((double)THRIFT_TEST_NUM1);
requestBody.add("empty"); // String parameter
requestBody.add(ByteBuffer.allocate(10)); // binary parameter
requestBody.add(new Work(THRIFT_TEST_NUM1, THRIFT_TEST_NUM2, Operation.MULTIPLY)); // Struct parameter
requestBody.add(new ArrayList<Integer>()); // list paramater
requestBody.add(new HashSet<String>()); // set parameter
requestBody.add(new HashMap<String, Long>()); // map parameter

Object responseBody = template.requestBody("direct:thrift-alltypes", requestBody);

服务使用者中的传入参数也将作为对象列表传递给消息正文。

346.5. Thrift 使用者标头(在消费者调用后安装)

标头名称描述可能的值

CamelThriftMethodName

使用者服务处理的方法名称

 

346.6. 例子

以下是通过主机和端口参数调用的简单同步方法

from("direct:thrift-calculate")
.to("thrift://localhost:1101/org.apache.camel.component.thrift.generated.Calculator?method=calculate&synchronous=true");

以下是 XML DSL 配置的简单同步方法调用

<route>
    <from uri="direct:thrift-add" />
    <to uri="thrift://localhost:1101/org.apache.camel.component.thrift.generated.Calculator?method=add&synchronous=true"/>
</route>

带有异步通信的服务消费者

from("thrift://localhost:1101/org.apache.camel.component.thrift.generated.Calculator")
.to("direct:thrift-service");

可以使用 thrift-maven-plugin 自动进行 Java 代码生成 .thrift 文件,但在启动 thrift 编译器二进制分发之前,您的操作系统必须在运行的主机上存在。

346.7. 如需更多信息,请参阅这些资源

Thrift 项目 GitHub https://thrift.apache.org/tutorial/java [Apache Thrift Java 教程]

346.8. 另请参阅

  • 开始使用
  • 配置 Camel
  • 组件
  • 端点

第 347 章 Thrift DataFormat

可作为 Camel 版本 2.20 可用

Camel 提供了一个数据格式,用于压缩 Java 和 Apache Thrift。该项目的站点详细信息,您为什么可能希望 https://thrift.apache.org/。Apache Thrift 是中立的语言和平台中立性,因此您的 Camel 路由生成的消息可以被其他语言实施使用。

Apache Thrift 实现

347.1. Thrift 选项

Thrift dataformat 支持 3 个选项,它们如下。

名称默认Java 类型描述

instanceClass

 

字符串

取消armshalling 时要使用的类名称

contentTypeFormat

binary

字符串

定义内容类型格式,其中的 thrift 消息将被序列化/反序列化为 Java。格式可以是 native 或 json,可以是原生二进制偏移 json 或简单的 json 字段表示。默认值为 binary。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

347.2. Spring Boot Auto-Configuration

组件支持 7 个选项,如下所示。

名称描述默认类型

camel.component.thrift.enabled

是否启用 thrift 组件自动配置。默认启用。

 

布尔值

camel.component.thrift.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.thrift.use-global-ssl-context-parameters

确定thrift 组件是否使用全局 SSL 上下文参数

false

布尔值

camel.dataformat.thrift.content-type-format

定义内容类型格式,其中的 thrift 消息将被序列化/反序列化为 Java。格式可以是 native 或 json,可以是原生二进制偏移 json 或简单的 json 字段表示。默认值为 binary。

binary

字符串

camel.dataformat.thrift.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.thrift.enabled

是否启用偏移数据格式的自动配置。默认启用。

 

布尔值

camel.dataformat.thrift.instance-class

取消armshalling 时要使用的类名称

 

字符串

ND

347.3. 内容类型格式

可以解析 JSON 消息,将其转换为 Thrift 格式,并使用原生 util converter 重新解析。要使用这个选项,请将 contentTypeFormat 值设置为 'json',或使用第二个参数调用 thrift。如果没有指定默认实例,请始终使用原生二进制 Thrift 格式。简单 JSON 格式是只写的(marshal),它生成适合通过脚本语言解析的简单输出格式。示例代码显示如下:

from("direct:marshal")
    .unmarshal()
    .thrift("org.apache.camel.dataformat.thrift.generated.Work", "json")
    .to("mock:reverse");

347.4. Thrift 概述

这个快速概述如何使用 Thrift。如需更多详情,请参阅 完整教程

347.5. 定义thrift 格式

第一步是定义交换正文的格式。这在 .thrift 文件中定义,如下所示:

tutorial.thrift

namespace java org.apache.camel.dataformat.thrift.generated

enum Operation {
  ADD = 1,
  SUBTRACT = 2,
  MULTIPLY = 3,
  DIVIDE = 4
}

struct Work {
  1: i32 num1 = 0,
  2: i32 num2,
  3: Operation op,
  4: optional string comment,
}

347.6. 生成 Java 类

Apache Thrift 提供编译器,它将为在 .thrift 文件中定义的格式生成 Java 类。

您还可以手动运行任何需要的额外支持语言的编译器。

thrift -r --gen java -out ../java/ ./tutorial-dataformat.thrift

这将为 .thrift 文件中定义的每种类型生成单独的 Java 类,即 struct 或 enum。生成的类实施 org.apache.thrift.TBase,这是序列化机制所需要的。因此,只有这些类在交换的正文中使用很重要。如果您试图告诉数据格式使用没有实现 org.apache.thrift.TBase 的类,Camel 将抛出一个例外。

347.7. Java DSL

您可以使用 create ThriftDataFormat 实例并将它传递到 Camel DataFormat marshal 和 unmarshal API。

   ThriftDataFormat format = new ThriftDataFormat(new Work());

   from("direct:in").marshal(format);
   from("direct:back").unmarshal(format).to("mock:reverse");

或者,使用 DSL thrift ()传递 unmarshal default 实例或默认实例类名称,如下所示。

   // You don't need to specify the default instance for the thrift marshaling
   from("direct:marshal").marshal().thrift();
   from("direct:unmarshalA").unmarshal()
       .thrift("org.apache.camel.dataformat.thrift.generated.Work")
       .to("mock:reverse");

   from("direct:unmarshalB").unmarshal().thrift(new Work()).to("mock:reverse");

347.8. Spring DSL

以下示例演示了如何使用 Thrift 来使用 Spring 配置thrift 数据类型

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <unmarshal>
      <thrift instanceClass="org.apache.camel.dataformat.thrift.generated.Work" />
    </unmarshal>
    <to uri="mock:result"/>
  </route>
</camelContext>

347.9. 依赖项

要在 camel 路由中使用 Thrift,您需要添加对 camel-thrift 的依赖项,以实施此数据格式。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-thrift</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

第 348 章 TidyMarkup DataFormat

可作为 Camel 版本 2.0 提供

TidyMarkup 是一个数据格式,它使用 TagSoup 来缓解 HTML。它可用于解析 ugly HTML,并返回格式良好的 HTML。

Camel eats 属于我们自己 -dog food- soap

我们的 pdf 手册中有一些问题,其中有些奇怪的符号。因此 Jonathan 使用这个数据格式来浏览 wiki html 页面,这些页面用作渲染 pdf 手册的基础。接着是无奇怪的符号。

TidyMarkup 只支持 unmarshal 操作,因为我们不希望将 HTML 形成成大型 HTML。

348.1. TidyMarkup 选项

TidyMarkup 数据格式支持 3 个选项,它们如下所列。

名称默认Java 类型描述

dataObjectType

org.w3c.dom.Node

字符串

要传播的数据类型可以是 org.w3c.dom.Node 或 java.lang.String。默认为 org.w3c.dom.Node

omitXmlDeclaration

false

布尔值

当返回字符串时,请省略 top 中的 XML 声明。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

348.2. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.dataformat.tidymarkup.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.tidymarkup.data-object-type

要传播的数据类型可以是 org.w3c.dom.Node 或 java.lang.String。默认为 org.w3c.dom.Node

org.w3c.dom.Node

字符串

camel.dataformat.tidymarkup.enabled

启用 tidymarkup 数据格式

true

布尔值

camel.dataformat.tidymarkup.omit-xml-declaration

当返回字符串时,请省略 top 中的 XML 声明。

false

布尔值

348.3. Java DSL 示例

使用者提供了一些 HTML 的示例

from("file://site/inbox").unmarshal().tidyMarkup().to("file://site/blogs");

348.4. Spring XML 示例

以下示例演示了如何使用 TidyMarkup 使用 Spring 传播

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="file://site/inbox"/>
    <unmarshal>
      <tidyMarkup/>
    </unmarshal>
    <to uri="file://site/blogs"/>
  </route>
</camelContext>

348.5. 依赖项

要在您的 camel 路由中使用 TidyMarkup,您需要添加实现此数据格式的 camel-tagsoup

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-tagsoup</artifactId>
  <version>x.x.x</version>
</dependency>

第 349 章 Tika Component

作为 Camel 版本 2.19 可用

Tika :组件提供了使用 Apache Tika 检测和解析文档的功能。此组件使用 Apache Tika 作为基础库来操作文档。

要使用 Tika 组件,Maven 用户需要将以下依赖项添加到其 pom.xml 中:

pom.xml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-tika</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

TIKA 组件仅支持制作者端点。

349.1. 选项

Tika 组件没有选项。

Tika 端点使用 URI 语法进行配置:

tika:operation

使用以下路径和查询参数:

349.1.1. 路径名(1 参数):

名称描述默认类型

operation

所需的 Tika Operation. parse 或 detect

 

TikaOperation

349.1.2. 查询参数(5 参数):

名称描述默认类型

tikaConfig (producer)

Tika Config

 

TikaConfig

tikaConfigUri (producer)

Tika Config Uri: tika-config.xml 的 URI

 

字符串

tikaParseOutputEncoding (producer)

Tika Parse Output Encoding - 用来指定解析输出的字符编码。Defaults to Charset.defaultCharset() .

 

字符串

tikaParseOutputFormat (producer)

Tika 输出格式.支持的输出格式.xml:返回 Parsed 内容作为 XML.html:返回 Parsed Contents Parsed Content: returns Parsed Content as Text. textMain: 使用 boilerpipe 库自动从 web 页面中提取主内容。

xml

TikaParseOutputFormat

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

349.2. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.tika.enabled

启用 tika 组件

true

布尔值

camel.component.tika.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

349.3. 取消激活文件的 MIME 类型

该文件应当放在 Body 中。

from("direct:start")
        .to("tika:detect");

349.4. 解析文件

该文件应当放在 Body 中。

from("direct:start")
        .to("tika:parse");

第 350 章 timer 组件

作为 Camel 版本 1.0 可用

timer: 当计时器触发时,组件用于生成消息交换,您只能消耗此端点的事件。

350.1. URI 格式

timer:name[?options]

其中 nameTimer 对象的名称,它会在端点中创建和共享它。因此,如果您为所有定时端点使用相同的名称,则只会使用一个 Timer 对象和线程。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

注意: 生成的交换的 IN body 是 null。so exchange.getIn ().getBody () 返回 null

TIP:*高级调度程序*查看支持更高级的调度的 Quartz 组件。

TIP:*Specify 时间为用户友好的格式*在 Camel 2.3 中,您可以以 人类友好的语法指定时间

350.2. 选项

Timer 组件没有选项。

Timer 端点使用 URI 语法进行配置:

timer:timerName

使用以下路径和查询参数:

350.2.1. 路径名(1 参数):

名称描述默认类型

timerName

所需的 计时器名称

 

字符串

350.2.2. 查询参数(12 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

delay (consumer)

生成第一个事件前要等待的毫秒数。不应与时间选项结合使用。默认值为 1000。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

fixedRate (consumer)

事件大约需要定期进行,间隔由指定周期分开。

false

布尔值

周期 (消费者)

如果大于 0,则每以毫秒为单位生成定期事件。默认值为 1000。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

repeatCount (consumer)

指定触发的最大数量上限。因此,如果您将其设置为 1,则计时器将仅触发一次。如果将其设置为 5,它将仅触发 5 次。值零或负数表示会永久触发。

0

long

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

daemon (advanced)

指定与计时器端点关联的线程是否作为守护进程运行。默认值为 true。

true

布尔值

pattern (advanced)

允许您指定自定义日期模式,以使用 URI 语法设置时间选项。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

time (advanced)

应该生成一个 java.util.Date the first event.如果使用 URI,则模式预期为:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd'T'HH:mm:ss。

 

Date

timer (advanced)

使用自定义计时器

 

timer

350.3. 交换属性

当触发计时器时,它会将以下信息添加为 Exchange 的属性:

名称类型描述

Exchange.TIMER_NAME

字符串

name 选项的值。

Exchange.TIMER_TIME

Date

time 选项的值。

Exchange.TIMER_PERIOD

long

period 选项的值。

Exchange.TIMER_FIRED_TIME

Date

消费者触发的时间。

Exchange.TIMER_COUNTER

Long

Camel 2.8: 当前触发计数器。从 1 开始.

350.4. 示例

设置每 60 秒生成事件的路由:

from("timer://foo?fixedRate=true&period=60000").to("bean:myBean?method=someMethodName");
提示

您可以使用 period=60s 而不是 60000,它们对于阅读更加友好。

以上路由将生成事件,然后在 Registry 中调用名为 myBeansomeMethodName 方法,如 JNDI 或 Spring。

Spring DSL 中的路由:

<route>
  <from uri="timer://foo?fixedRate=true&amp;period=60000"/>
  <to uri="bean:myBean?method=someMethodName"/>
</route>

350.5. 尽快触发

可从 Camel 2.17 开始

您可能希望尽快触发 Camel 路由中的消息,您可以使用负延迟:

<route>
  <from uri="timer://foo?delay=-1"/>
  <to uri="bean:myBean?method=someMethodName"/>
</route>

这样,计时器将立即触发信息。

您还可以同时指定 repeatCount 参数,以便在达到固定数量后停止触发的消息。

如果您没有指定 repeatCount,则计时器将继续触发的消息,直到路由停止为止。 

350.6. 仅触发一次

可从 Camel 2.8 开始

您可能只想在 Camel 路由中触发一条消息,例如在启动路由时。要做到这一点,使用 repeatCount 选项:

<route>
  <from uri="timer://foo?repeatCount=1"/>
  <to uri="bean:myBean?method=someMethodName"/>
</route>

350.7. 另请参阅

第 351 章 Twilio Component

可作为 Camel 版本 2.20 可用

Twilio 组件提供对使用 Twilio Java SDK 访问的 Twilio REST API 版本 2010-04-01 的访问。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-twilio</artifactId>
        <version>${camel-version}</version>
    </dependency>

351.1. Twilio 选项

Twilio 组件支持 6 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享配置

 

TwilioConfiguration

restClient (advanced)

使用共享的 REST 客户端

 

TwilioRestClient

username (security)

要使用的帐户。

 

字符串

密码 (安全)

帐户的身份验证令牌。

 

字符串

accountSid (security)

要使用的帐户 SID。

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Twilio 端点使用 URI 语法进行配置:

twilio:apiName/methodName

使用以下路径和查询参数:

351.1.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

TwilioApiName

methodName

所选操作需要什么子操作

 

字符串

351.1.2. 查询参数(5 参数):

名称描述默认类型

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

351.2. Spring Boot Auto-Configuration

组件支持 8 个选项,如下所示。

名称描述默认类型

camel.component.twilio.account-sid

要使用的帐户 SID。

 

字符串

camel.component.twilio.configuration.api-name

要执行的操作种类

 

TwilioApiName

camel.component.twilio.configuration.method-name

用于所选操作的子操作

 

字符串

camel.component.twilio.enabled

启用 twilio 组件

true

布尔值

camel.component.twilio.password

帐户的身份验证令牌。

 

字符串

camel.component.twilio.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.twilio.rest-client

使用共享的 REST 客户端。选项为 com.twilio.http.TwilioRestClient 类型。

 

字符串

camel.component.twilio.username

要使用的帐户。

 

字符串

351.3. URI 格式

    twilio://endpoint-prefix/endpoint?[options]

端点前缀可以是以下之一:

  • account
  • address
  • address-dependent-phone-number
  • application
  • available-phone-number-country
  • available-phone-number-country-local
  • available-phone-number-country-mobile
  • available-phone-number-country-toll-free
  • 调用
  • call-feedback
  • call-feedback-summary
  • call-notification
  • call-recording
  • 会议
  • conference-participant
  • connect-app
  • incoming-phone-number
  • incoming-phone-number-local
  • incoming-phone-number-mobile
  • incoming-phone-number-toll-free
  • key
  • message
  • message-feedback
  • message-media
  • new-key
  • new-signing-key
  • 通知
  • outgoing-caller-id
  • 队列
  • queue-member
  • 记录
  • recording-add-on-result
  • recording-add-on-result-payload
  • recording-transcription
  • short-code
  • signing-key
  • sip-credential-list
  • sip-credential-list-credential
  • sip-domain
  • sip-domain-credential-list-mapping
  • sip-domain-ip-access-control-list-mapping
  • sip-ip-access-control-list
  • sip-ip-access-control-list-ip-address
  • token
  • transcription
  • usage-record
  • usage-record-all-time
  • usage-record-daily
  • usage-record-last-month
  • usage-record-monthly
  • usage-record-this-month
  • usage-record-today
  • usage-record-yearly
  • usage-record-yesterday
  • usage-trigger
  • validation-request

351.4. 制作者端点:

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于所有端点。端点 URI MUST 包含一个前缀。

端点 URI 中都可以提供任何端点选项,或者在消息标头中动态提供。消息标头名称必须是 CamelTwilio.<option> 的格式。请注意, inBody 选项会覆盖消息标头,例如, Body=option 中的 endpoint 选项会覆盖 CamelTwilio.option 标头。

端点可以是以下之一:

端点简写别名描述

creator

create

向 Twilio API 发出请求来执行创建

deleter

delete

向 Twilio API 发出请求来执行删除

fetcher

fetch

向 Twilio API 发出请求来执行获取

reader

读取

向 Twilio API 发出请求来执行读取

updater

update

向 Twilio API 发出请求来执行更新

可用的端点根据端点前缀而有所不同。

有关端点和选项的更多信息,请参阅 API 文档 https://www.twilio.com/docs/libraries/reference/twilio-java/index.html

351.5. 消费者端点:

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

如果要使用 Camel 消费者端点(如 camel-servletcamel-undertowcamel-jetty、camel-jetty 和 camel-netty-http)响应来自 Twilio 的调用或消息,您可以使用 camel-netty-http 使用 TwiML 来查询。

351.6. 邮件标题

任何选项都可以在带有 CamelTwilio. 前缀的制作者端点的消息标头中提供。

351.7. 邮件正文

所有结果消息正文都使用 Twilio Java SDK 提供的对象。producer 端点可以在 inBody endpoint 参数中为传入消息正文指定选项名称。

第 352 章 Twitter 组件

作为 Camel 2.10 版本提供

camel-twitter 由 4 个组件组成:

Twitter 组件通过封装 Twitter4J 来启用 Twitter API 的最有用的功能。它支持直接、轮询或事件驱动的时间表、用户、趋势和直接消息。另外,它还支持将消息生成为状态更新或直接消息。

Twitter 现在需要使用 OAuth 进行所有客户端应用程序身份验证。为了将 camel-twitter 与您的帐户搭配使用,您需要在 Twitter 中创建一个新应用程序,并授予应用程序对您的帐户的访问权限。https://dev.twitter.com/apps/new最后,生成您的访问令牌和 secret。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-twitter</artifactId>
    <version>${camel-version}</version>
</dependency>

352.1. 消费者端点

camel-twitter 不会通过一个路由交换返回列表,而是为每个返回的对象创建一个路由交换。例如,如果"timeline/home"的结果为五个状态,则路由将执行五次(每个状态对应一个)。

端点Context正文类型备注

twitter-directmessage

直接、轮询

twitter4j.DirectMessage

 

twitter-search

直接、轮询

twitter4j.Status

 

twitter-streaming

事件, 轮询

twitter4j.Status

 

twitter-timeline

直接、轮询

twitter4j.Status

 

352.2. 制作者端点

端点正文类型备注

twitter-directmessage

字符串

 

twitter-search

List<twitter4j.Status>

 

twitter-timeline

字符串

生产者只支持 'user' timelineType

352.3. 邮件标题

名称描述

CamelTwitterKeywords

搜索者使用此标头来动态更改搜索关键字。

CamelTwitterSearchLanguage

Camel 2.11.0: 此标头可以覆盖 lang 选项,该选项用于动态地为搜索端点设置搜索语言

CamelTwitterCount

Camel 2.11.0 此标头可以覆盖可设置返回最多十亿数 的计数 选项。

CamelTwitterNumberOfPages

Camel 2.11.0 此标头可以覆盖 numberOfPages 选项,它设定了我们需要二十个返回的页面。

352.4. 邮件正文

所有消息正文都使用 Twitter4J API 提供的对象。

352.5. 使用案例

注意

API 速率限制: Twitter REST API 由 Twitter4J 封装有 API 率限制。您可以在 API Rate Limits 文档中找到每个方法限制。请注意,该页面中未列出的端点/资源将默认为每个窗口分配的用户 15 请求。

352.5.1. 要在 Twitter 配置集中创建状态更新,请将此制作者发送一个 String body:

from("direct:foo")
  .to("twitter-timeline://user?consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]);

352.5.2. 要轮询一次,每 60 个 sec.,您的主页时间表上的所有状态:

from("twitter-timeline://home?type=polling&delay=60&consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]")
  .to("bean:blah");

352.5.3. 使用关键字 'camel' 仅搜索所有状态:

from("twitter-search://foo?type=polling&keywords=camel&consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]")
  .to("bean:blah");

352.5.4. 使用带有静态关键字的制作者搜索:

from("direct:foo")
  .to("twitter-search://foo?keywords=camel&consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]");

352.5.5. 使用来自标头的动态关键字搜索制作者:

标题中,我们有要搜索的关键字,因此我们可将这个值分配给 CamelTwitterKeywords 标头:

from("direct:foo")
  .setHeader("CamelTwitterKeywords", header("bar"))
  .to("twitter-search://foo?consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]");

352.6. 示例

另请参阅 Twitter Websocket 示例

352.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • Twitter Websocket 示例

第 353 章 Twitter Direct Message 组件

作为 Camel 2.10 版本提供

Twitter Direct Message 组件使用/复制用户直接消息。

353.1. 组件选项

Twitter Direct Message 组件支持 9 个选项,它们如下。

名称描述默认类型

accessToken (安全性)

访问令牌

 

字符串

accessTokenSecret (security)

访问令牌 secret

 

字符串

consumerKey (security)

消费者密钥

 

字符串

consumerSecret (security)

使用者 secret

 

字符串

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。

 

字符串

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。

 

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

353.2. 端点选项

Twitter Direct Message 端点使用 URI 语法进行配置:

twitter-directmessage:user

使用以下路径和查询参数:

353.2.1. 路径名(1 参数):

名称描述默认类型

user

必需 The user name to send a direct message。对于使用者,这将忽略此项。

 

字符串

353.2.2. 查询参数(42 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

type (consumer)

要使用的端点类型。仅流支持事件类型。

轮询

EndpointType

distanceMetric (consumer)

由非流地域搜索使用,使用所配置的指标来搜索。这个单元可以是 miles 的 mi,也可以是 km for kilometers。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

km

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

extendedMode (consumer)

用于从二十个启用完整文本(例如接收包含 140 个字符的二十位)。

true

布尔值

latitude (consumer)

由非流地域搜索使用,以便按称号搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

位置 (消费者)

绑定框,由 lat/lons 的对创建。可用于流传输/filter。对定义为 lat,lon。和多个 paris 可以通过分号来分隔。

 

字符串

longitude (consumer)

由非流地域搜索使用,以长期搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

radius (consumer)

由非流地域搜索使用,通过拉dius 搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

twitterStream (consumer)

使用 TwitterStream 的自定义实例

 

TwitterStream

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

计数 (过滤器)

每页限制结果数。

5

整数

filterOld (filter)

过滤掉旧的二十位,之前已轮询。这个状态仅存储在内存中,基于最后的二十个 ID。

true

布尔值

lang (filter)

用于搜索的 lang 字符串 ISO_639-1

 

字符串

numberOfPages (filter)

您要使用的页面结果数。

1

整数

sinceId (filter)

最后的二十个 id 将用于拉取调整。当 camel 路由在长时间运行后重启时,会很有用。

1

long

userIds (filter)

按流/过滤器的用户 ID 过滤:可以使用逗号分隔多个值。

 

字符串

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。

30000

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

sortById (sort)

按 id 排序,因此最旧是首字母,最近是最新的。

true

布尔值

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。也可以在 TwitterComponent 级别上配置。

 

整数

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。也可以在 TwitterComponent 级别上配置。

 

字符串

accessToken (安全性)

访问令牌。也可以在 TwitterComponent 级别上配置。

 

字符串

accessTokenSecret (security)

访问 secret。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerKey (security)

消费者密钥。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerSecret (security)

使用者机密。也可以在 TwitterComponent 级别上配置。

 

字符串

353.3. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.twitter-directmessage.access-token

访问令牌

 

字符串

camel.component.twitter-directmessage.access-token-secret

访问令牌 secret

 

字符串

camel.component.twitter-directmessage.consumer-key

消费者密钥

 

字符串

camel.component.twitter-directmessage.consumer-secret

使用者 secret

 

字符串

camel.component.twitter-directmessage.enabled

是否启用 twitter-directmessage 组件的自动配置。默认启用。

 

布尔值

camel.component.twitter-directmessage.http-proxy-host

可用于 camel-twitter 的 http 代理主机。

 

字符串

camel.component.twitter-directmessage.http-proxy-password

可用于 camel-twitter 的 http 代理密码。

 

字符串

camel.component.twitter-directmessage.http-proxy-port

可用于 camel-twitter 的 http 代理端口。

 

整数

camel.component.twitter-directmessage.http-proxy-user

可用于 camel-twitter 的 http 代理用户。

 

字符串

camel.component.twitter-directmessage.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 354 章 Twitter Search 组件

作为 Camel 2.10 版本提供

Twitter Search 组件消耗搜索结果。

354.1. 组件选项

Twitter Search 组件支持 9 个选项,它们如下所列。

名称描述默认类型

accessToken (安全性)

访问令牌

 

字符串

accessTokenSecret (security)

访问令牌 secret

 

字符串

consumerKey (security)

消费者密钥

 

字符串

consumerSecret (security)

使用者 secret

 

字符串

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。

 

字符串

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。

 

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

354.2. 端点选项

Twitter Search 端点使用 URI 语法进行配置:

twitter-search:keywords

使用以下路径和查询参数:

354.2.1. 路径名(1 参数):

名称描述默认类型

keywords

必需的 搜索关键字。可以使用逗号分隔多个值。

 

字符串

354.2.2. 查询参数(42 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

type (consumer)

要使用的端点类型。仅流支持事件类型。

轮询

EndpointType

distanceMetric (consumer)

由非流地域搜索使用,使用所配置的指标来搜索。这个单元可以是 miles 的 mi,也可以是 km for kilometers。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

km

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

extendedMode (consumer)

用于从二十个启用完整文本(例如接收包含 140 个字符的二十位)。

true

布尔值

latitude (consumer)

由非流地域搜索使用,以便按称号搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

位置 (消费者)

绑定框,由 lat/lons 的对创建。可用于流传输/filter。对定义为 lat,lon。和多个 paris 可以通过分号来分隔。

 

字符串

longitude (consumer)

由非流地域搜索使用,以长期搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

radius (consumer)

由非流地域搜索使用,通过拉dius 搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

twitterStream (consumer)

使用 TwitterStream 的自定义实例

 

TwitterStream

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

计数 (过滤器)

每页限制结果数。

5

整数

filterOld (filter)

过滤掉旧的二十位,之前已轮询。这个状态仅存储在内存中,基于最后的二十个 ID。

true

布尔值

lang (filter)

用于搜索的 lang 字符串 ISO_639-1

 

字符串

numberOfPages (filter)

您要使用的页面结果数。

1

整数

sinceId (filter)

最后的二十个 id 将用于拉取调整。当 camel 路由在长时间运行后重启时,会很有用。

1

long

userIds (filter)

按流/过滤器的用户 ID 过滤:可以使用逗号分隔多个值。

 

字符串

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。

30000

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

sortById (sort)

按 id 排序,因此最旧是首字母,最近是最新的。

true

布尔值

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。也可以在 TwitterComponent 级别上配置。

 

整数

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。也可以在 TwitterComponent 级别上配置。

 

字符串

accessToken (安全性)

访问令牌。也可以在 TwitterComponent 级别上配置。

 

字符串

accessTokenSecret (security)

访问 secret。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerKey (security)

消费者密钥。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerSecret (security)

使用者机密。也可以在 TwitterComponent 级别上配置。

 

字符串

354.3. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.twitter-search.access-token

访问令牌

 

字符串

camel.component.twitter-search.access-token-secret

访问令牌 secret

 

字符串

camel.component.twitter-search.consumer-key

消费者密钥

 

字符串

camel.component.twitter-search.consumer-secret

使用者 secret

 

字符串

camel.component.twitter-search.enabled

是否启用 twitter-search 组件的自动配置。默认启用。

 

布尔值

camel.component.twitter-search.http-proxy-host

可用于 camel-twitter 的 http 代理主机。

 

字符串

camel.component.twitter-search.http-proxy-password

可用于 camel-twitter 的 http 代理密码。

 

字符串

camel.component.twitter-search.http-proxy-port

可用于 camel-twitter 的 http 代理端口。

 

整数

camel.component.twitter-search.http-proxy-user

可用于 camel-twitter 的 http 代理用户。

 

字符串

camel.component.twitter-search.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 355 章 Twitter 流组件

作为 Camel 2.10 版本提供

Twitter 流组件使用流 API 使用二十个状态。

355.1. 组件选项

Twitter 流组件支持 9 个选项,它们如下。

名称描述默认类型

accessToken (安全性)

访问令牌

 

字符串

accessTokenSecret (security)

访问令牌 secret

 

字符串

consumerKey (security)

消费者密钥

 

字符串

consumerSecret (security)

使用者 secret

 

字符串

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。

 

字符串

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。

 

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

355.2. 端点选项

Twitter 流端点使用 URI 语法进行配置:

twitter-streaming:streamingType

使用以下路径和查询参数:

355.2.1. 路径名(1 参数):

名称描述默认类型

streamingType

要使用的 streaming 类型。

 

StreamingType

355.2.2. 查询参数(43 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

type (consumer)

要使用的端点类型。仅流支持事件类型。

轮询

EndpointType

distanceMetric (consumer)

由非流地域搜索使用,使用所配置的指标来搜索。这个单元可以是 miles 的 mi,也可以是 km for kilometers。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

km

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

extendedMode (consumer)

用于从二十个启用完整文本(例如接收包含 140 个字符的二十位)。

true

布尔值

latitude (consumer)

由非流地域搜索使用,以便按称号搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

位置 (消费者)

绑定框,由 lat/lons 的对创建。可用于流传输/filter。对定义为 lat,lon。和多个 paris 可以通过分号来分隔。

 

字符串

longitude (consumer)

由非流地域搜索使用,以长期搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

radius (consumer)

由非流地域搜索使用,通过拉dius 搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

twitterStream (consumer)

使用 TwitterStream 的自定义实例

 

TwitterStream

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

计数 (过滤器)

每页限制结果数。

5

整数

filterOld (filter)

过滤掉旧的二十位,之前已轮询。这个状态仅存储在内存中,基于最后的二十个 ID。

true

布尔值

keywords (filter)

可用于流传输过滤器。可以使用逗号分隔多个值。

 

字符串

lang (filter)

用于搜索的 lang 字符串 ISO_639-1

 

字符串

numberOfPages (filter)

您要使用的页面结果数。

1

整数

sinceId (filter)

最后的二十个 id 将用于拉取调整。当 camel 路由在长时间运行后重启时,会很有用。

1

long

userIds (filter)

按流/过滤器的用户 ID 过滤:可以使用逗号分隔多个值。

 

字符串

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。

30000

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

sortById (sort)

按 id 排序,因此最旧是首字母,最近是最新的。

true

布尔值

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。也可以在 TwitterComponent 级别上配置。

 

整数

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。也可以在 TwitterComponent 级别上配置。

 

字符串

accessToken (安全性)

访问令牌。也可以在 TwitterComponent 级别上配置。

 

字符串

accessTokenSecret (security)

访问 secret。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerKey (security)

消费者密钥。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerSecret (security)

使用者机密。也可以在 TwitterComponent 级别上配置。

 

字符串

355.3. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.twitter-streaming.access-token

访问令牌

 

字符串

camel.component.twitter-streaming.access-token-secret

访问令牌 secret

 

字符串

camel.component.twitter-streaming.consumer-key

消费者密钥

 

字符串

camel.component.twitter-streaming.consumer-secret

使用者 secret

 

字符串

camel.component.twitter-streaming.enabled

是否启用 twitter-streaming 组件自动配置。默认启用。

 

布尔值

camel.component.twitter-streaming.http-proxy-host

可用于 camel-twitter 的 http 代理主机。

 

字符串

camel.component.twitter-streaming.http-proxy-password

可用于 camel-twitter 的 http 代理密码。

 

字符串

camel.component.twitter-streaming.http-proxy-port

可用于 camel-twitter 的 http 代理端口。

 

整数

camel.component.twitter-streaming.http-proxy-user

可用于 camel-twitter 的 http 代理用户。

 

字符串

camel.component.twitter-streaming.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 356 章 Twitter Timeline 组件

作为 Camel 2.10 版本提供

Twitter Timeline 组件使用三秒时间表或更新特定用户的状态。

356.1. 组件选项

Twitter Timeline 组件支持 9 个选项,它们如下。

名称描述默认类型

accessToken (安全性)

访问令牌

 

字符串

accessTokenSecret (security)

访问令牌 secret

 

字符串

consumerKey (security)

消费者密钥

 

字符串

consumerSecret (security)

使用者 secret

 

字符串

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。

 

字符串

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。

 

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

356.2. 端点选项

Twitter Timeline 端点使用 URI 语法进行配置:

twitter-timeline:timelineType

使用以下路径和查询参数:

356.2.1. 路径名(1 参数):

名称描述默认类型

timelineType

需要 时间表类型来生成/恢复。

 

TimelineType

356.2.2. 查询参数(43 参数):

名称描述默认类型

user (common)

使用 timelineType=user 时的用户名

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

type (consumer)

要使用的端点类型。仅流支持事件类型。

轮询

EndpointType

distanceMetric (consumer)

由非流地域搜索使用,使用所配置的指标来搜索。这个单元可以是 miles 的 mi,也可以是 km for kilometers。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

km

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

extendedMode (consumer)

用于从二十个启用完整文本(例如接收包含 140 个字符的二十位)。

true

布尔值

latitude (consumer)

由非流地域搜索使用,以便按称号搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

位置 (消费者)

绑定框,由 lat/lons 的对创建。可用于流传输/filter。对定义为 lat,lon。和多个 paris 可以通过分号来分隔。

 

字符串

longitude (consumer)

由非流地域搜索使用,以长期搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

radius (consumer)

由非流地域搜索使用,通过拉dius 搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

twitterStream (consumer)

使用 TwitterStream 的自定义实例

 

TwitterStream

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

计数 (过滤器)

每页限制结果数。

5

整数

filterOld (filter)

过滤掉旧的二十位,之前已轮询。这个状态仅存储在内存中,基于最后的二十个 ID。

true

布尔值

lang (filter)

用于搜索的 lang 字符串 ISO_639-1

 

字符串

numberOfPages (filter)

您要使用的页面结果数。

1

整数

sinceId (filter)

最后的二十个 id 将用于拉取调整。当 camel 路由在长时间运行后重启时,会很有用。

1

long

userIds (filter)

按流/过滤器的用户 ID 过滤:可以使用逗号分隔多个值。

 

字符串

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。

30000

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

sortById (sort)

按 id 排序,因此最旧是首字母,最近是最新的。

true

布尔值

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。也可以在 TwitterComponent 级别上配置。

 

整数

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。也可以在 TwitterComponent 级别上配置。

 

字符串

accessToken (安全性)

访问令牌。也可以在 TwitterComponent 级别上配置。

 

字符串

accessTokenSecret (security)

访问 secret。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerKey (security)

消费者密钥。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerSecret (security)

使用者机密。也可以在 TwitterComponent 级别上配置。

 

字符串

356.3. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.twitter-timeline.access-token

访问令牌

 

字符串

camel.component.twitter-timeline.access-token-secret

访问令牌 secret

 

字符串

camel.component.twitter-timeline.consumer-key

消费者密钥

 

字符串

camel.component.twitter-timeline.consumer-secret

使用者 secret

 

字符串

camel.component.twitter-timeline.enabled

是否启用 twitter-timeline 组件自动配置。默认启用。

 

布尔值

camel.component.twitter-timeline.http-proxy-host

可用于 camel-twitter 的 http 代理主机。

 

字符串

camel.component.twitter-timeline.http-proxy-password

可用于 camel-twitter 的 http 代理密码。

 

字符串

camel.component.twitter-timeline.http-proxy-port

可用于 camel-twitter 的 http 代理端口。

 

整数

camel.component.twitter-timeline.http-proxy-user

可用于 camel-twitter 的 http 代理用户。

 

字符串

camel.component.twitter-timeline.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

第 357 章 Twitter 组件(已弃用)

作为 Camel 2.10 版本提供

重要

复合九个组件已弃用。使用各个组件进行 directmessage、搜索、流化和时间表。

Twitter 组件通过封装 Twitter4J 启用 Twitter API 的最有用的功能。它支持直接、轮询或事件驱动的时间表、用户、趋势和直接消息。另外,它还支持将消息生成为状态更新或直接消息。

Twitter 现在需要使用 OAuth 进行所有客户端应用程序身份验证。为了将 camel-twitter 与您的帐户搭配使用,您需要在 Twitter 中创建一个新应用程序,并授予应用程序对您的帐户的访问权限。https://dev.twitter.com/apps/new最后,生成您的访问令牌和 secret。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-twitter</artifactId>
    <version>${camel-version}</version>
</dependency>

357.1. URI 格式

twitter://endpoint[?options]

357.2. Twitter 组件

二十个组件可以通过 Twitter 帐户设置来配置,在使用之前是强制进行配置。

Twitter 组件支持 9 个选项,它们如下所列。

名称描述默认类型

accessToken (安全性)

访问令牌

 

字符串

accessTokenSecret (security)

访问令牌 secret

 

字符串

consumerKey (security)

消费者密钥

 

字符串

consumerSecret (security)

使用者 secret

 

字符串

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。

 

字符串

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。

 

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

您还可以直接在端点中配置这些选项。

357.3. 消费者端点

camel-twitter 不会通过一个路由交换返回列表,而是为每个返回的对象创建一个路由交换。例如,如果"timeline/home"的结果为五个状态,则路由将执行五次(每个状态对应一个)。

端点Context正文类型备注

directmessage

直接、轮询

twitter4j.DirectMessage

 

search

直接、轮询

twitter4j.Status

 

streaming/filter

事件, 轮询

twitter4j.Status

 

streaming/sample

事件, 轮询

twitter4j.Status

 

streaming/user

事件, 轮询

twitter4j.Status

Camel 2.16 :从受保护的用户和帐户接收二十种。

timeline/home

直接、轮询

twitter4j.Status

 

时间表/划分

直接、轮询

twitter4j.Status

 

timeline/public

直接、轮询

twitter4j.Status

@deprecated.改为使用时间表/home 或 direct/home。从 *Camel 2.11 开始删除。*

timeline/retweetsofme

直接、轮询

twitter4j.Status

 

timeline/user

直接、轮询

twitter4j.Status

 

trends/daily

*Camel 2.10.1: 直接、轮询*

twitter4j.Status

@deprecated.从 Camel 2.11 开始删除。

trends/weekly

*Camel 2.10.1: 直接、轮询*

twitter4j.Status

@deprecated.从 Camel 2.11 开始删除。

357.4. 制作者端点

端点正文类型

directmessage

字符串

search

List<twitter4j.Status>

timeline/user

字符串

357.5. URI 选项

Twitter 端点使用 URI 语法配置:

twitter:kind

使用以下路径和查询参数:

357.5.1. 路径名(1 参数):

名称描述默认类型

kind

所需的 端点类型

 

字符串

357.5.2. 查询参数(44 参数):

名称描述默认类型

user (common)

用户名,用于用户时间表消耗、直接消息生产等。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

type (consumer)

要使用的端点类型。仅流支持事件类型。

轮询

EndpointType

distanceMetric (consumer)

由非流地域搜索使用,使用所配置的指标来搜索。这个单元可以是 miles 的 mi,也可以是 km for kilometers。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

km

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

extendedMode (consumer)

用于从二十个启用完整文本(例如接收包含 140 个字符的二十位)。

true

布尔值

latitude (consumer)

由非流地域搜索使用,以便按称号搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

位置 (消费者)

绑定框,由 lat/lons 的对创建。可用于流传输/filter。对定义为 lat,lon。和多个 paris 可以通过分号来分隔。

 

字符串

longitude (consumer)

由非流地域搜索使用,以长期搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

radius (consumer)

由非流地域搜索使用,通过拉dius 搜索。您需要配置所有以下选项:长度、口号、拉dius 和 distanceMetric。

 

twitterStream (consumer)

使用 TwitterStream 的自定义实例

 

TwitterStream

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

计数 (过滤器)

每页限制结果数。

5

整数

filterOld (filter)

过滤掉旧的二十位,之前已轮询。这个状态仅存储在内存中,基于最后的二十个 ID。

true

布尔值

keywords (filter)

可用于搜索和流传输/过滤器。可以使用逗号分隔多个值。

 

字符串

lang (filter)

用于搜索的 lang 字符串 ISO_639-1

 

字符串

numberOfPages (filter)

您要使用的页面结果数。

1

整数

sinceId (filter)

最后的二十个 id 将用于拉取调整。当 camel 路由在长时间运行后重启时,会很有用。

1

long

userIds (filter)

按流/过滤器的用户 ID 过滤:可以使用逗号分隔多个值。

 

字符串

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。

30000

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

sortById (sort)

按 id 排序,因此最旧是首字母,最近是最新的。

true

布尔值

httpProxyHost (proxy)

可用于 camel-twitter 的 http 代理主机。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPassword (proxy)

可用于 camel-twitter 的 http 代理密码。也可以在 TwitterComponent 级别上配置。

 

字符串

httpProxyPort (proxy)

可用于 camel-twitter 的 http 代理端口。也可以在 TwitterComponent 级别上配置。

 

整数

httpProxyUser (proxy)

可用于 camel-twitter 的 http 代理用户。也可以在 TwitterComponent 级别上配置。

 

字符串

accessToken (安全性)

访问令牌。也可以在 TwitterComponent 级别上配置。

 

字符串

accessTokenSecret (security)

访问 secret。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerKey (security)

消费者密钥。也可以在 TwitterComponent 级别上配置。

 

字符串

consumerSecret (security)

使用者机密。也可以在 TwitterComponent 级别上配置。

 

字符串

357.6. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.twitter.access-token

访问令牌

 

字符串

camel.component.twitter.access-token-secret

访问令牌 secret

 

字符串

camel.component.twitter.consumer-key

消费者密钥

 

字符串

camel.component.twitter.consumer-secret

使用者 secret

 

字符串

camel.component.twitter.enabled

启用 Fitter 组件

true

布尔值

camel.component.twitter.http-proxy-host

可用于 camel-twitter 的 http 代理主机。

 

字符串

camel.component.twitter.http-proxy-password

可用于 camel-twitter 的 http 代理密码。

 

字符串

camel.component.twitter.http-proxy-port

可用于 camel-twitter 的 http 代理端口。

 

整数

camel.component.twitter.http-proxy-user

可用于 camel-twitter 的 http 代理用户。

 

字符串

camel.component.twitter.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

357.7. 邮件标题

名称描述

CamelTwitterKeywords

搜索者使用此标头来动态更改搜索关键字。

CamelTwitterSearchLanguage

Camel 2.11.0: 此标头可以覆盖 lang 选项,该选项用于动态地为搜索端点设置搜索语言

CamelTwitterCount

Camel 2.11.0 此标头可以覆盖可设置返回最多十亿数 的计数 选项。

CamelTwitterNumberOfPages

Camel 2.11.0 此标头可以覆盖 numberOfPages 选项,它设定了我们需要二十个返回的页面。

357.8. 邮件正文

所有消息正文都使用 Twitter4J API 提供的对象。

357.9. 使用案例

注意

API 速率限制: Twitter REST API 由 Twitter4J 封装有 API 率限制。您可以在 API Rate Limits 文档中找到每个方法限制。请注意,该页面中未列出的端点/资源将默认为每个窗口分配的用户 15 请求。

357.9.1. 要在 Twitter 配置集中创建状态更新,请将此制作者发送一个 String body:

from("direct:foo")
  .to("twitter://timeline/user?consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]);

357.9.2. 要轮询一次,每 60 个 sec.,您的主页时间表上的所有状态:

from("twitter://timeline/home?type=polling&delay=60&consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]")
  .to("bean:blah");

357.9.3. 使用关键字 'camel' 仅搜索所有状态:

from("twitter://search?type=polling&keywords=camel&consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]")
  .to("bean:blah");

357.9.4. 使用带有静态关键字的制作者搜索:

from("direct:foo")
  .to("twitter://search?keywords=camel&consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]");

357.9.5. 使用来自标头的动态关键字搜索制作者:

标题中,我们有要搜索的关键字,因此我们可将这个值分配给 CamelTwitterKeywords 标头:

from("direct:foo")
  .setHeader("CamelTwitterKeywords", header("bar"))
  .to("twitter://search?consumerKey=[s]&consumerSecret=[s]&accessToken=[s]&accessTokenSecret=[s]");

357.10. 示例

另请参阅 Twitter Websocket 示例

357.11. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • Twitter Websocket 示例

第 358 章 Undertow 组件

作为 Camel 版本 2.16 可用

undertow 组件提供 HTTP 和 WebSocket 型端点,以用于消耗和生成 HTTP/WebSocket 请求。

也就是说,Undertow 组件的行为是简单的 Web 服务器。Undertow 也可以用作 http 客户端,这意味着您还可将其用于 Camel 作为制作者。

提示

自 Camel 版本 2.21 起,undertow 组件还支持 WebSocket 连接,因此可以替代 Camel websocket 组件或开mosphere-websocket 组件。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-undertow</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

358.1. URI 格式

undertow:http://hostname[:port][/resourceUri][?options]
undertow:https://hostname[:port][/resourceUri][?options]
undertow:ws://hostname[:port][/resourceUri][?options]
undertow:wss://hostname[:port][/resourceUri][?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

358.2. 选项

Undertow 组件支持 5 个选项,它们如下所列:

名称描述默认类型

undertowHttpBinding (advanced)

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。

 

UndertowHttpBinding

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

主机Options (高级)

配置常见选项,如线程池

 

UndertowHostOptions

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Undertow 端点使用 URI 语法配置:

undertow:httpURI

使用以下路径和查询参数:

358.2.1. 路径名(1 参数):

名称描述默认类型

httpURI

需要 要使用的 HTTP 端点的 url。

 

URI

358.2.2. 查询参数(21 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

httpMethodRestrict (consumer)

仅用于允许消耗 HttpMethod 匹配,如 GET/POST/PUT 等。可以使用逗号分隔多个方法。

 

字符串

matchOnUriPrefix (consumer)

如果找不到完全匹配,则使用者是否应该尝试通过匹配 URI 前缀来查找目标使用者。

false

布尔值

optionsEnabled (consumer)

指定是否为这个 Servlet consumer 启用 HTTP OPTIONS。默认情况下,OPTIONS 会被关闭。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

cookieHandler (producer)

配置 Cookie 处理程序以维护 HTTP 会话

 

CookieHandler

keepAlive (producer)

设置 以确保因为不活跃而关闭套接字

true

布尔值

options (producer)

设置其他频道选项。可以使用的选项在 org.xnio.Options 中定义。要从 endpoint uri 配置,然后使用 选项为每个选项添加前缀。如 option.close-abort=true&option.send-buffer=8192

 

map

reuseAddresses (producer)

设置 以便于套接字多路

true

布尔值

tcpNoDelay (producer)

设置 来提高 TCP 协议性能

true

布尔值

throwExceptionOnFailure (producer)

禁用丢弃 HttpOperationFailedException 的选项(如果来自远程服务器的响应失败)。这可让您获得所有响应,无论 HTTP 状态代码如何。

true

布尔值

transferException (producer)

如果对使用者端启用和交换失败处理,并且导致的例外在响应中作为 application/x-java-serialized-object 内容类型发送反序列化。在制作者端,异常将被反序列化和引发,即 HttpOperationFailedException。导致的异常需要被序列化。默认情况下关闭。如果您启用此功能,Java 将把传入的数据从请求中反序列化为 Java,这可能会成为潜在的安全风险。

false

布尔值

headerFilterStrategy (advanced)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

undertowHttpBinding (advanced)

使用自定义 UndertowHttpBinding 控制 Camel 消息和 undertow 之间的映射:

 

UndertowHttpBinding

fireWebSocketChannelEvents (websocket)

如果为 true,则使用者将在新的 WebSocket peer 连接、断开连接等时向路由发布通知。请参阅 UndertowConstants.EVENT_TYPE 和 EventType。

false

布尔值

sendTimeout (websocket)

发送到 websocket 频道时的超时(毫秒)。默认超时为 30000 (30 秒)。

30000

整数

sendToAll (websocket)

发送到所有 websocket 订阅者。可用于在端点级别上配置,而不必在消息上使用 UndertowConstants.SEND_TO_ALL 标头。

 

布尔值

useStreaming (websocket)

如果为 true,则来自 WebSocket 的文本和二进制消息将被嵌套为 java.io.Reader 和 java.io.InputStream 后,它们将分别作为 String 和 byte 分别传递。

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

358.3. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.undertow.enabled

启用 undertow 组件

true

布尔值

camel.component.undertow.host-options.buffer-size

Undertow 主机的缓冲区大小。

 

整数

camel.component.undertow.host-options.direct-buffers

如果 Undertow 主机应使用直接缓冲区,则设置。

 

布尔值

camel.component.undertow.host-options.http2-enabled

如果 Undertow 主机应该使用 http2 协议,则设置。

 

布尔值

camel.component.undertow.host-options.io-threads

Undertow 主机中使用的 io 线程数量。

 

整数

camel.component.undertow.host-options.worker-threads

Undertow 主机中使用的 worker 线程数量。

 

整数

camel.component.undertow.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.undertow.ssl-context-parameters

使用 SSLContextParameters 配置安全性。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.undertow.undertow-http-binding

使用自定义 HttpBinding 控制 Camel 消息和 HttpClient 之间的映射。选项是一个 org.apache.camel.component.undertow.UndertowHttpBinding 类型。

 

字符串

camel.component.undertow.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

358.4. 消息标头

Camel 使用与 HTTP 组件相同的消息标头。在 Camel 2.2 中,它还使用 Exchange.HTTP_CHUNKED,CamelHttpChunked 标头打开或关闭 camel-undertow consumer 上的chuched 编码。

Camel 还填充 所有 request.parameter 和 request.headers。例如,如果客户端请求带有 URL http://myserver/myserver?orderid=123,交换将包含名为 orderid 的标头,其值为 123。

358.5. HTTP Producer 示例

以下是如何将 HTTP 请求发送到现有 HTTP 端点的基本示例。

在 Java DSL 中

from("direct:start")
    .to("undertow:http://www.google.com");

或在 XML 中

<route>
    <from uri="direct:start"/>
    <to uri="undertow:http://www.google.com"/>
<route>

358.6. HTTP Consumer 示例

在本例中,我们定义了一个在 http://localhost:8080/myapp/myservice 中公开 HTTP 服务的路由:

<route>
  <from uri="undertow:http://localhost:8080/myapp/myservice"/>
  <to uri="bean:myBean"/>
</route>

358.7. WebSocket Example

在本例中,我们定义了一个在 http://localhost:8080/myapp/mysocket 中公开 WebSocket 服务的路由,并返回对同一频道的响应:

<route>
  <from uri="undertow:ws://localhost:8080/myapp/mysocket"/>
  <transform><simple>Echo ${body}</simple></transform>
  <to uri="undertow:ws://localhost:8080/myapp/mysocket"/>
</route>

358.8. HTTP/2 示例

在本例中,我们将 camel-undertow 组件配置为支持 HTTP/2 协议,并在 http://localhost:7766/foo/bar 中公开 HTTP 服务。

这个示例的目录结构如下:

├── pom.xml 1
├── README.md
└── src
    └── main
        └── resources
            └── META-INF
                └── spring
                    └── camel-context.xml 2

以下文件务必要配置 camel-undertow 组件来支持 HTTP/2 协议:

1
pom.xml:包含以下属性和依赖项:
<properties>
    <camel.version>2.23.1</camel.version>
</properties>

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-core</artifactId>
    <version>${camel.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring</artifactId>
    <version>${camel.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-undertow</artifactId>
    <version>${camel.version}</version>
    </dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-http-common</artifactId>
    <version>${camel.version}</version>
</dependency>

<plugin>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-maven-plugin</artifactId>
    <version>${camel.version}</version>
    <configuration>
        <fileApplicationContextUri>src/main/resources/META-INF/spring/camel-context.xml</fileApplicationContextUri>
    </configuration>
</plugin>
2
Camel-context.xml:配置 camel-undertow 组件,如下所示:
<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="cbr-example-context" xmlns="http://camel.apache.org/schema/spring">
        <route id="cbr-route" trace="true">
            <from id="_from1" uri="undertow:http://localhost:7766/foo/bar"/>
            <setBody id="_setBody1">
                <constant>Sending Response</constant>
            </setBody>
            <log id="_log5" message="Headers ${in.headers}"/>
            <log id="_log5" message="Done processing ${body}"/>
        </route>
    </camelContext>
    <bean class="org.apache.camel.component.undertow.UndertowComponent" id="undertow">
        <property name="hostOptions" ref="undertowHostOptions"/>
    </bean>
    <bean     class="org.apache.camel.component.undertow.UndertowHostOptions" id="undertowHostOptions">
        <property name="http2Enabled" value="true"/>
    </bean>
</beans>
注意

对于 UndertowHostOptions 类,默认为 falsehttp2Enabled 属性设为 true。然后,这个类被指代在 camel 路由中使用的 UndertowComponent

在本例中,通过使用 pom.xml 文件中的 camel-maven-plugin,我们可以在执行 Maven 命令 mvn camel:run 时在 http://localhost:7766/foo/bar 中公开 HTTP 服务。

我们可以使用 curl 命令测试此示例,如下所示:

$ curl -v --http2 http://localhost:7766/foo/bar
* Trying ::1...
* TCP_NODELAY set
* connect to ::1 port 7766 failed: Connection refused
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 7766 (#0)
> GET /foo/bar HTTP/1.1
> Host: localhost:7766
> User-Agent: curl/7.53.1
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
>
< HTTP/1.1 101 Switching Protocols
< Connection: Upgrade
< Upgrade: h2c
< Date: Sun, 10 Dec 2017 08:43:58 GMT
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200
< accept: */*
< http2-settings: AAMAAABkAARAAAAAAAIAAAAA
< breadcrumbid: ID-dhcppc1-1512886066149-0-25
< content-length: 16
< user-agent: curl/7.53.1
< date: Sun, 10 Dec 2017 08:43:58 GMT
<
* Connection #0 to host localhost left intact
Sending Response

358.9. 使用 localhost 作为主机

当您在 URL 中指定 localhost 时,Camel 只在本地 TCP/IP 网络接口上公开端点,因此无法从其操作的机器外部访问该端点。

如果您需要在特定网络接口上公开 Jetty 端点,则该接口的数字 IP 地址应用作主机。如果您需要在所有网络接口上公开 Jetty 端点,则应使用 0.0.0.0 地址。

要侦听整个 URI 前缀,请参阅 如何让 Jetty 匹配通配符

如果您实际上想要通过 HTTP 公开路由,并且已经具有 Servlet,则应引用 Servlet 传输

358.10. WildFly 上的 Undertow使用者

WildFly 上的 camel-undertow 消费者的配置与独立的 Camel 不同。制作者端点可以正常工作。

在 WildFly 上,camel-undertow 使用者利用容器提供的默认 Undertow HTTP 服务器。服务器在 undertow 子系统配置中定义。以下是 standalone.xml 中默认配置的摘录:

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
    <buffer-cache name="default" />
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" />
        <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true" />
        <host name="default-host" alias="localhost">
            <location name="/" handler="welcome-content" />
            <filter-ref name="server-header" />
            <filter-ref name="x-powered-by-header" />
            <http-invoker security-realm="ApplicationRealm" />
        </host>
    </server>
</subsystem>

在本例中,Undertow 配置为侦听由 http 和 https socket-binding 指定的接口/端口。默认情况下,这是 https 和 8443 的端口 8080。

这有以下影响:

  • Camel-undertow 用户仅绑定到 localhost:8080 或 localhost:8443
  • 有些端点消费者配置选项没有影响(请参阅以下),因为这些设置由 WildFly 容器管理

例如,如果您使用不同的主机或端口组合配置端点使用者,服务器日志文件中将显示一个警告。例如,会忽略以下主机和端口配置:

from("undertow:http://somehost:1234/path/to/resource")
[org.wildfly.extension.camel] (pool-2-thread-1) Ignoring configured host: http://somehost:1234/path/to/resource

但是,使用者仍可在默认主机和端口 localhost:8080 或 localhost:8443 上可用。

358.10.1. 配置备用端口

如果需要接受其他端口,则必须通过 WildFly 子系统配置来配置这些端口。这在服务器文档中阐述:

https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html/configuration_guide/configuring_the_web_server_undertow

358.10.2. 在 WildFly 上忽略了 camel-undertow consumer 配置选项

hostOptions

有关如何配置服务器主机选项,请参阅 WildFly undertow 配置指南:

https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html-single/how_to_configure_server_security/#configure_one_way_and_two_way_ssl_tls_for_application

sslContextParameters

要配置 SSL,请参考 WildFly SSL 配置指南:

https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html-single/how_to_configure_server_security/#configure_one_way_and_two_way_ssl_tls_for_application

第 359 章 uniVocity CSV DataFormat

作为 Camel 版本 2.15 可用

这个 数据格式 使用 uniVocity-parsers 来读写 3 种表格数据文本文件:

  • CSV (Comma 9arated Values),其中这些值用符号(通常是逗号)分开。
  • 修复了宽度,值有已知大小
  • TSV (Tabular 9arated Values),其中字段由 tabulation 分隔

因此,有 3 个基于 uniVocity-parsers 的数据格式。

如果您使用 Maven,您只需在 pom.xml 中添加以下内容,将最新和最大版本的版本号替换(请参阅 下载页面)。

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-univocity-parsers</artifactId>
    <version>x.x.x</version>
</dependency>

359.1. 选项

uniVocity-parsers 的大部分配置选项都位于数据格式中。如果您希望有关特定选项的更多信息,请参阅其 文档页面

3 数据格式共享常用选项并有专用选项,本节将全部说明。

359.2. 选项

uniVocity CSV 数据格式支持 18 个选项,它们如下所列。

名称默认Java 类型描述

quoteAllFields

false

布尔值

编写时是否必须用引号括起所有值。

quote

"

字符串

引号符号。

quoteEscape

"

字符串

引号转义符号

delimiter

,

字符串

值的分隔符

nullValue

 

字符串

null 值表示的字符串。默认值为 null

skipEmptyLines

true

布尔值

是否必须忽略空行。默认值为 true

ignoreTrailingWhitespaces

true

布尔值

尾部空格是否必须忽略。默认值为 true

ignoreLeadingWhitespaces

true

布尔值

是否必须忽略前导空格。默认值为 true

headersDisabled

false

布尔值

是否禁用了标头。在定义时,这个选项将标头显式设置为 null,这代表没有标头。默认值为 false

headerExtractionEnabled

false

布尔值

在测试文档的第一行中是否必须读取标头。默认值为 false

numberOfRecordsToRead

 

整数

要读取的最大记录数。

emptyValue

 

字符串

空值的 String 表示

lineSeparator

 

字符串

文件的行分隔符(默认值)是使用 JVM 平台行分隔符

normalizedLineSeparator

 

字符串

文件的规范化行分隔符 The 默认值是新行字符。

comment

#

字符串

注释符号。默认值为 #

lazyLoad

false

布尔值

只要所有行都必须被读取,则未编出出行是否应该生成迭代器器。默认值为 false

asMap

false

布尔值

unmarshalling 是否应该为 lines 值而不是列表生成映射。它需要有标头(已定义或收集)。默认值为 false

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

359.3. Spring Boot Auto-Configuration

组件支持 19 选项,如下所示。

名称描述默认类型

camel.dataformat.univocity-csv.as-map

unmarshalling 是否应该为 lines 值而不是列表生成映射。它需要有标头(已定义或收集)。默认值为 false

false

布尔值

camel.dataformat.univocity-csv.comment

注释符号。默认值为 #

#

字符串

camel.dataformat.univocity-csv.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.univocity-csv.delimiter

值的分隔符

,

字符串

camel.dataformat.univocity-csv.empty-value

空值的 String 表示

 

字符串

camel.dataformat.univocity-csv.enabled

启用 univocity-csv dataformat

true

布尔值

camel.dataformat.univocity-csv.header-extraction-enabled

在测试文档的第一行中是否必须读取标头。默认值为 false

false

布尔值

camel.dataformat.univocity-csv.headers-disabled

是否禁用了标头。在定义时,这个选项将标头显式设置为 null,这代表没有标头。默认值为 false

false

布尔值

camel.dataformat.univocity-csv.ignore-leading-whitespaces

是否必须忽略前导空格。默认值为 true

true

布尔值

camel.dataformat.univocity-csv.ignore-trailing-whitespaces

尾部空格是否必须忽略。默认值为 true

true

布尔值

camel.dataformat.univocity-csv.lazy-load

只要所有行都必须被读取,则未编出出行是否应该生成迭代器器。默认值为 false

false

布尔值

camel.dataformat.univocity-csv.line-separator

文件的行分隔符(默认值)是使用 JVM 平台行分隔符

 

字符串

camel.dataformat.univocity-csv.normalized-line-separator

文件的规范化行分隔符 The 默认值是新行字符。

 

字符串

camel.dataformat.univocity-csv.null-value

null 值表示的字符串。默认值为 null

 

字符串

camel.dataformat.univocity-csv.number-of-records-to-read

要读取的最大记录数。

 

整数

camel.dataformat.univocity-csv.quote

引号符号。

"

字符串

camel.dataformat.univocity-csv.quote-all-fields

编写时是否必须用引号括起所有值。

false

布尔值

camel.dataformat.univocity-csv.quote-escape

引号转义符号

"

字符串

camel.dataformat.univocity-csv.skip-empty-lines

是否必须忽略空行。默认值为 true

true

布尔值

359.4. marshalling 用法

marshalling 接受:

  • 映射列表(L'ist<Map<String ?>'),每行一个
  • 一行一个映射(Map<String ?&gt; ?>)

任何其他正文将抛出异常。

359.4.1. usage 示例:将 map 整合到 CSV 格式

<route>
    <from uri="direct:input"/>
    <marshal>
        <univocity-csv/>
    </marshal>
    <to uri="mock:result"/>
</route>

359.4.2. usage 示例:将 map 整合到固定宽度格式中

<route>
    <from uri="direct:input"/>
    <marshal>
        <univocity-fixed padding="_">
            <univocity-header length="5"/>
            <univocity-header length="5"/>
            <univocity-header length="5"/>
        </univocity-fixed>
    </marshal>
    <to uri="mock:result"/>
</route>

359.4.3. usage 示例:将 map 整合到 TSV 格式

<route>
    <from uri="direct:input"/>
    <marshal>
        <univocity-tsv/>
    </marshal>
    <to uri="mock:result"/>
</route>

359.5. unmarshalling 用法

unmarshalling 使用 InputStream 来读取数据。

每行都会产生:

  • 包含其中所有值的列表(以Map 选项为 false);
  • 包含标头索引的所有值的映射(使用 true为Map 选项)。

所有行都可以:

  • 一次收集到列表(带有 falselazyLoad 选项);
  • 即时使用迭代器(lazyLoad 选项 )

359.5.1. usage 示例:将 CSV 格式合并到带有自动标头的映射中

<route>
    <from uri="direct:input"/>
    <unmarshal>
        <univocity-csv headerExtractionEnabled="true" asMap="true"/>
    </unmarshal>
    <to uri="mock:result"/>
</route>

359.5.2. usage 示例:将固定宽度格式解压缩到列表中

<route>
    <from uri="direct:input"/>
    <unmarshal>
        <univocity-fixed>
            <univocity-header length="5"/>
            <univocity-header length="5"/>
            <univocity-header length="5"/>
        </univocity-fixed>
    </unmarshal>
    <to uri="mock:result"/>
</route>

第 360 章 uniVocity Fixed Length DataFormat

作为 Camel 版本 2.15 可用

这个 数据格式 使用 uniVocity-parsers 来读写 3 种表格数据文本文件:

  • CSV (Comma 9arated Values),其中这些值用符号(通常是逗号)分开。
  • 修复了宽度,值有已知大小
  • TSV (Tabular 9arated Values),其中字段由 tabulation 分隔

因此,有 3 个基于 uniVocity-parsers 的数据格式。

如果您使用 Maven,您只需在 pom.xml 中添加以下内容,将最新和最大版本的版本号替换(请参阅 下载页面)。

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-univocity-parsers</artifactId>
    <version>x.x.x</version>
</dependency>

360.1. 选项

uniVocity-parsers 的大部分配置选项都位于数据格式中。如果您希望有关特定选项的更多信息,请参阅其 文档页面

3 数据格式共享常用选项并有专用选项,本节将全部说明。

360.2. 选项

uniVocity Fixed Length dataformat 支持 17 个选项,它们列于下方。

名称默认Java 类型描述

skipTrailingCharsUntilNewline

false

布尔值

在必须忽略新行之前,是否结尾字符。默认值为 false

recordEndsOnNewline

false

布尔值

记录是否以新行结束。默认值为 false

padding

 

字符串

padding 字符。默认值为空格

nullValue

 

字符串

null 值表示的字符串。默认值为 null

skipEmptyLines

true

布尔值

是否必须忽略空行。默认值为 true

ignoreTrailingWhitespaces

true

布尔值

尾部空格是否必须忽略。默认值为 true

ignoreLeadingWhitespaces

true

布尔值

是否必须忽略前导空格。默认值为 true

headersDisabled

false

布尔值

是否禁用了标头。在定义时,这个选项将标头显式设置为 null,这代表没有标头。默认值为 false

headerExtractionEnabled

false

布尔值

在测试文档的第一行中是否必须读取标头。默认值为 false

numberOfRecordsToRead

 

整数

要读取的最大记录数。

emptyValue

 

字符串

空值的 String 表示

lineSeparator

 

字符串

文件的行分隔符(默认值)是使用 JVM 平台行分隔符

normalizedLineSeparator

 

字符串

文件的规范化行分隔符 The 默认值是新行字符。

comment

#

字符串

注释符号。默认值为 #

lazyLoad

false

布尔值

只要所有行都必须被读取,则未编出出行是否应该生成迭代器器。默认值为 false

asMap

false

布尔值

unmarshalling 是否应该为 lines 值而不是列表生成映射。它需要有标头(已定义或收集)。默认值为 false

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

360.3. Spring Boot Auto-Configuration

组件支持 18 个选项,如下所示。

名称描述默认类型

camel.dataformat.univocity-fixed.as-map

unmarshalling 是否应该为 lines 值而不是列表生成映射。它需要有标头(已定义或收集)。默认值为 false

false

布尔值

camel.dataformat.univocity-fixed.comment

注释符号。默认值为 #

#

字符串

camel.dataformat.univocity-fixed.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.univocity-fixed.empty-value

空值的 String 表示

 

字符串

camel.dataformat.univocity-fixed.enabled

启用非动态修复的数据格式

true

布尔值

camel.dataformat.univocity-fixed.header-extraction-enabled

在测试文档的第一行中是否必须读取标头。默认值为 false

false

布尔值

camel.dataformat.univocity-fixed.headers-disabled

是否禁用了标头。在定义时,这个选项将标头显式设置为 null,这代表没有标头。默认值为 false

false

布尔值

camel.dataformat.univocity-fixed.ignore-leading-whitespaces

是否必须忽略前导空格。默认值为 true

true

布尔值

camel.dataformat.univocity-fixed.ignore-trailing-whitespaces

尾部空格是否必须忽略。默认值为 true

true

布尔值

camel.dataformat.univocity-fixed.lazy-load

只要所有行都必须被读取,则未编出出行是否应该生成迭代器器。默认值为 false

false

布尔值

camel.dataformat.univocity-fixed.line-separator

文件的行分隔符(默认值)是使用 JVM 平台行分隔符

 

字符串

camel.dataformat.univocity-fixed.normalized-line-separator

文件的规范化行分隔符 The 默认值是新行字符。

 

字符串

camel.dataformat.univocity-fixed.null-value

null 值表示的字符串。默认值为 null

 

字符串

camel.dataformat.univocity-fixed.number-of-records-to-read

要读取的最大记录数。

 

整数

camel.dataformat.univocity-fixed.padding

padding 字符。默认值为空格

 

字符串

camel.dataformat.univocity-fixed.record-ends-on-newline

记录是否以新行结束。默认值为 false

false

布尔值

camel.dataformat.univocity-fixed.skip-empty-lines

是否必须忽略空行。默认值为 true

true

布尔值

camel.dataformat.univocity-fixed.skip-trailing-chars-until-newline

在必须忽略新行之前,是否结尾字符。默认值为 false

false

布尔值

360.4. marshalling 用法

marshalling 接受:

  • 映射列表(L'ist<Map<String ?>'),每行一个
  • 一行一个映射(Map<String ?&gt; ?>)

任何其他正文将抛出异常。

360.4.1. usage 示例:将 map 整合到 CSV 格式

<route>
    <from uri="direct:input"/>
    <marshal>
        <univocity-csv/>
    </marshal>
    <to uri="mock:result"/>
</route>

360.4.2. usage 示例:将 map 整合到固定宽度格式中

<route>
    <from uri="direct:input"/>
    <marshal>
        <univocity-fixed padding="_">
            <univocity-header length="5"/>
            <univocity-header length="5"/>
            <univocity-header length="5"/>
        </univocity-fixed>
    </marshal>
    <to uri="mock:result"/>
</route>

360.4.3. usage 示例:将 map 整合到 TSV 格式

<route>
    <from uri="direct:input"/>
    <marshal>
        <univocity-tsv/>
    </marshal>
    <to uri="mock:result"/>
</route>

360.5. unmarshalling 用法

unmarshalling 使用 InputStream 来读取数据。

每行都会产生:

  • 包含其中所有值的列表(以Map 选项为 false);
  • 包含标头索引的所有值的映射(使用 true为Map 选项)。

所有行都可以:

  • 一次收集到列表(带有 falselazyLoad 选项);
  • 即时使用迭代器(lazyLoad 选项 )

360.5.1. usage 示例:将 CSV 格式合并到带有自动标头的映射中

<route>
    <from uri="direct:input"/>
    <unmarshal>
        <univocity-csv headerExtractionEnabled="true" asMap="true"/>
    </unmarshal>
    <to uri="mock:result"/>
</route>

360.5.2. usage 示例:将固定宽度格式解压缩到列表中

<route>
    <from uri="direct:input"/>
    <unmarshal>
        <univocity-fixed>
            <univocity-header length="5"/>
            <univocity-header length="5"/>
            <univocity-header length="5"/>
        </univocity-fixed>
    </unmarshal>
    <to uri="mock:result"/>
</route>

第 361 章 uniVocity TSV DataFormat

作为 Camel 版本 2.15 可用

这个 数据格式 使用 uniVocity-parsers 来读写 3 种表格数据文本文件:

  • CSV (Comma 9arated Values),其中这些值用符号(通常是逗号)分开。
  • 修复了宽度,值有已知大小
  • TSV (Tabular 9arated Values),其中字段由 tabulation 分隔

因此,有 3 个基于 uniVocity-parsers 的数据格式。

如果您使用 Maven,您只需在 pom.xml 中添加以下内容,将最新和最大版本的版本号替换(请参阅 下载页面)。

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-univocity-parsers</artifactId>
    <version>x.x.x</version>
</dependency>

361.1. 选项

uniVocity-parsers 的大部分配置选项都位于数据格式中。如果您希望有关特定选项的更多信息,请参阅其 文档页面

3 数据格式共享常用选项并有专用选项,本节将全部说明。

361.2. 选项

uniVocity TSV 数据存储支持 15 个选项,它们列于下方所列。

名称默认Java 类型描述

escapeChar

\

字符串

转义字符。

nullValue

 

字符串

null 值表示的字符串。默认值为 null

skipEmptyLines

true

布尔值

是否必须忽略空行。默认值为 true

ignoreTrailingWhitespaces

true

布尔值

尾部空格是否必须忽略。默认值为 true

ignoreLeadingWhitespaces

true

布尔值

是否必须忽略前导空格。默认值为 true

headersDisabled

false

布尔值

是否禁用了标头。在定义时,这个选项将标头显式设置为 null,这代表没有标头。默认值为 false

headerExtractionEnabled

false

布尔值

在测试文档的第一行中是否必须读取标头。默认值为 false

numberOfRecordsToRead

 

整数

要读取的最大记录数。

emptyValue

 

字符串

空值的 String 表示

lineSeparator

 

字符串

文件的行分隔符(默认值)是使用 JVM 平台行分隔符

normalizedLineSeparator

 

字符串

文件的规范化行分隔符 The 默认值是新行字符。

comment

#

字符串

注释符号。默认值为 #

lazyLoad

false

布尔值

只要所有行都必须被读取,则未编出出行是否应该生成迭代器器。默认值为 false

asMap

false

布尔值

unmarshalling 是否应该为 lines 值而不是列表生成映射。它需要有标头(已定义或收集)。默认值为 false

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

361.3. Spring Boot Auto-Configuration

组件支持 16 个选项,如下所示。

名称描述默认类型

camel.dataformat.univocity-tsv.as-map

unmarshalling 是否应该为 lines 值而不是列表生成映射。它需要有标头(已定义或收集)。默认值为 false

false

布尔值

camel.dataformat.univocity-tsv.comment

注释符号。默认值为 #

#

字符串

camel.dataformat.univocity-tsv.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.univocity-tsv.empty-value

空值的 String 表示

 

字符串

camel.dataformat.univocity-tsv.enabled

启用 univocity-tsv 数据格式

true

布尔值

camel.dataformat.univocity-tsv.escape-char

转义字符。

\

字符串

camel.dataformat.univocity-tsv.header-extraction-enabled

在测试文档的第一行中是否必须读取标头。默认值为 false

false

布尔值

camel.dataformat.univocity-tsv.headers-disabled

是否禁用了标头。在定义时,这个选项将标头显式设置为 null,这代表没有标头。默认值为 false

false

布尔值

camel.dataformat.univocity-tsv.ignore-leading-whitespaces

是否必须忽略前导空格。默认值为 true

true

布尔值

camel.dataformat.univocity-tsv.ignore-trailing-whitespaces

尾部空格是否必须忽略。默认值为 true

true

布尔值

camel.dataformat.univocity-tsv.lazy-load

只要所有行都必须被读取,则未编出出行是否应该生成迭代器器。默认值为 false

false

布尔值

camel.dataformat.univocity-tsv.line-separator

文件的行分隔符(默认值)是使用 JVM 平台行分隔符

 

字符串

camel.dataformat.univocity-tsv.normalized-line-separator

文件的规范化行分隔符 The 默认值是新行字符。

 

字符串

camel.dataformat.univocity-tsv.null-value

null 值表示的字符串。默认值为 null

 

字符串

camel.dataformat.univocity-tsv.number-of-records-to-read

要读取的最大记录数。

 

整数

camel.dataformat.univocity-tsv.skip-empty-lines

是否必须忽略空行。默认值为 true

true

布尔值

361.4. marshalling 用法

marshalling 接受:

  • 映射列表(L'ist<Map<String ?>'),每行一个
  • 一行一个映射(Map<String ?&gt; ?>)

任何其他正文将抛出异常。

361.4.1. usage 示例:将 map 整合到 CSV 格式

<route>
    <from uri="direct:input"/>
    <marshal>
        <univocity-csv/>
    </marshal>
    <to uri="mock:result"/>
</route>

361.4.2. usage 示例:将 map 整合到固定宽度格式中

<route>
    <from uri="direct:input"/>
    <marshal>
        <univocity-fixed padding="_">
            <univocity-header length="5"/>
            <univocity-header length="5"/>
            <univocity-header length="5"/>
        </univocity-fixed>
    </marshal>
    <to uri="mock:result"/>
</route>

361.4.3. usage 示例:将 map 整合到 TSV 格式

<route>
    <from uri="direct:input"/>
    <marshal>
        <univocity-tsv/>
    </marshal>
    <to uri="mock:result"/>
</route>

361.5. unmarshalling 用法

unmarshalling 使用 InputStream 来读取数据。

每行都会产生:

  • 包含其中所有值的列表(以Map 选项为 false);
  • 包含标头索引的所有值的映射(使用 true为Map 选项)。

所有行都可以:

  • 一次收集到列表(带有 falselazyLoad 选项);
  • 即时使用迭代器(lazyLoad 选项 )

361.5.1. usage 示例:将 CSV 格式合并到带有自动标头的映射中

<route>
    <from uri="direct:input"/>
    <unmarshal>
        <univocity-csv headerExtractionEnabled="true" asMap="true"/>
    </unmarshal>
    <to uri="mock:result"/>
</route>

361.5.2. usage 示例:将固定宽度格式解压缩到列表中

<route>
    <from uri="direct:input"/>
    <unmarshal>
        <univocity-fixed>
            <univocity-header length="5"/>
            <univocity-header length="5"/>
            <univocity-header length="5"/>
        </univocity-fixed>
    </unmarshal>
    <to uri="mock:result"/>
</route>

第 362 章 验证器组件

可作为 Camel 版本 1.1 提供

Validation 组件使用 JAXP Validation API 执行消息正文的 XML 验证,并基于任何支持的 XML 模式语言,默认为 XML 架构

请注意,Jing 组件还支持以下有用的模式语言:

MSV 组件还支持 RelaxNG XML 语法

362.1. URI 格式

validator:someLocalOrRemoteResource

其中,有些LocalOrRemoteResource 是类路径上的本地资源的 URL,或文件系统中包含 XSD 进行验证的远程资源或资源的完整 URL。例如:

  • msv:org/foo/bar.xsd
  • msv:file:../foo/bar.xsd
  • msv:http://acme.com/cheese.xsd
  • validator:com/mypackage/myschema.xsd

使用 Camel 2.8 或更早版本时,Maven 用户需要在其 pom.xml 中添加以下依赖关系:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

从 Camel 2.9 开始,由 camel-core 直接提供 Validation 组件。

362.2. 选项

Validator 组件支持 2 选项,这些选项如下。

名称描述默认类型

resourceResolverFactory (advanced)

使用依赖于动态端点资源 URI 的自定义 LSResourceResolver

 

ValidatorResource ResolverFactory

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Validator 端点使用 URI 语法进行配置:

validator:resourceUri

使用以下路径和查询参数:

362.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

类路径上的本地资源的 必需 URL,或引用在 Registry 中查找 bean,或者指向文件系统中远程资源或资源的完整 URL,其中包含 XSD 以进行验证。

 

字符串

362.2.2. 查询参数(11 参数):

名称描述默认类型

failOnNullBody (producer)

如果不存在正文,是否失败。

true

布尔值

failOnNullHeader (producer)

在对标头验证时是否不存在任何标头,是否失败。

true

布尔值

headerName (producer)

要针对标头而不是邮件正文进行验证。

 

字符串

errorHandler (advanced)

要使用自定义 org.apache.camel.processor.validation.ValidatorErrorHandler。默认错误处理程序捕获错误并抛出异常。

 

ValidatorErrorHandler

resourceResolver (advanced)

要使用自定义 LSResourceResolver。另请参阅 setResourceResolverFactory (ValidatorResourceResolverFactory)

 

LSResourceResolver

resourceResolverFactory (advanced)

创建依赖于端点资源 URI 的资源解析器。不得与设置ResourceResolver (LSResourceResolver)结合使用。如果没有设置,则使用 DefaultValidatorResourceResolverFactory

 

ValidatorResource ResolverFactory

schemaFactory (advanced)

使用自定义 javax.xml.validation.SchemaFactory

 

SchemaFactory

schemaLanguage (advanced)

配置 W3C XML 架构命名空间 URI。

http://www.w3.org/2001/XMLSchema

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

useDom (advanced)

验证器应使用 DOMSource/DOMResult 还是 SaxSource/SaxResult。

false

布尔值

useSharedSchema (advanced)

架构实例是否应该共享。引入了这个选项来围绕 JDK 1.6.x 程序错误工作。Xerces 不应该出现这个问题。

true

布尔值

362.3. 示例

以下示例演示了如何 从端点 direct:start 配置路由,然后进入两个端点之一,可以是 模拟:valid模拟:invalid,具体取决于 XML 是否与给定模式匹配(在 classpath 上提供)。

362.4. 高级:JMX 方法 clearCachedSchema

Camel 2.17 开始,您可以强制验证端点中的缓存模式被清除并重新读,使用 JMX 操作 clearCachedSchema 进行重新读取。'You 还可使用此方法以编程方式清除缓存。此方法可用于 'ValidatorEndpoint 'class '

第 363 章 velocity 组件

可作为 Camel 版本 1.2 提供

velocity: 组件允许您使用 Apache Velocity 模板来处理消息。这在使用 Templating 生成请求的响应时是理想的选择。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-velocity</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

363.1. URI 格式

velocity:templateName[?options]

其中 templateName 是要调用的模板的类路径路径 URI;或者,也可以是远程模板的完整 URL (如 file://folder/myfile.vm)。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

363.2. 选项

Velocity 组件支持 4 个选项,它们如下所列。

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

velocityEngine (advanced)

要使用 VelocityEngine,否则创建了一个新的引擎

 

VelocityEngine

Velocity 端点使用 URI 语法配置:

velocity:resourceUri

使用以下路径和查询参数:

363.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

资源 所需的 路径。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,如 bean:myBean.myMethod。

 

字符串

363.2.2. 查询参数(7 参数):

名称描述默认类型

allowContextMapAll (producer)

设置上下文映射是否应该允许访问所有详细信息。默认情况下,只能访问消息正文和标头。可以启用这个选项,以便完全访问当前 Exchange 和 CamelContext。这样会带来潜在的安全风险,因为这会打开对 CamelContext API 的完整功能的访问。

false

布尔值

allowTemplateFromHeader (producer)

是否允许从标头使用资源模板(默认为 false)。启用此选项具有安全特性。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

false

布尔值

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

encoding (producer)

资源内容的字符编码。

 

字符串

loaderCache (producer)

启用/禁用默认启用的 velocity 资源加载程序缓存

true

布尔值

propertiesFile (producer)

用于 VelocityEngine 初始化的属性文件的 URI。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

363.3. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.component.velocity.enabled

启用 velocity 组件

true

布尔值

camel.component.velocity.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.velocity.velocity-engine

要使用 VelocityEngine,否则创建了一个新的引擎。选项是一个 org.apache.velocity.app.VelocityEngine 类型。

 

字符串

363.4. 消息标头

velocity 组件在消息上设置几个标头(您无法自己设置这些标头,来自 Camel 2.1 velocity 组件)不会设置这些标头,这会导致对动态模板支持的一些副作用:

标头描述

CamelVelocityResourceUri

templateName 作为 String 对象。

CamelVelocitySupplementalContext

Camel 2.16: 向使用的 VelocityContext 添加其他信息。此标头的值应该是带有键/值的 Map,它将添加(覆盖名称的任何现有密钥)。
这可用于预设置您要在 velocity 端点中重复使用的一些通用键/值。

在 Velocity 评估期间设置的标题将返回到邮件并添加为标头。然后,它可以将值从 Velocity 返回到 Message。

例如,要在 Velocity 模板 .tm 中设置 fruit 的标头值:

$in.setHeader("fruit", "Apple")

F ru it 标头现在可以从 message.out.headers 访问。

363.5. velocity Context

Camel 将在 Velocity 上下文中提供交换信息(调整 映射)。Exchange 被传输为:

keyvalue

exchange

Exchange 本身。

exchange.properties

Exchange 属性。

标头

In 消息的标头。

camelContext

Camel 上下文实例。

request

In 消息。

in

In 消息。

正文(body)

In message body。

out

Out 消息(仅适用于 InOut 消息交换模式)。

response

Out 消息(仅适用于 InOut 消息交换模式)。

从 Camel-2.14 开始,您可以通过设置消息标题 *CamelVelocityContext *just like

   VelocityContext velocityContext = new VelocityContext(variableMap);
   exchange.getIn().setHeader("CamelVelocityContext", velocityContext);

 

363.6. 热重新加载

Velocity 模板资源默认为文件和类路径资源(expanded jar)进行热重新加载。如果您设置了 contentCache=true,Camel 只会加载资源,因此无法进行热重新加载。当资源永不改变时,可以在生产环境中使用此场景。

363.7. 动态模板

作为 Camel 2.1
Camel 提供两个标头,您可以针对模板或模板内容本身定义不同的资源位置。如果设置了其中任何标头,Camel 会将其用于端点配置的资源。这可让您在运行时提供动态模板。

标头类型描述

CamelVelocityResourceUri

字符串

Camel 2.1: 要使用的模板资源的 URI,而不是配置的端点。

CamelVelocityTemplate

字符串

Camel 2.1: 要使用的模板,而不使用配置的端点。

363.8. Samples

例如,您可以使用如下内容:

from("activemq:My.Queue").
  to("velocity:com/acme/MyResponse.vm");

使用 Velocity 模板来制定对 InOut 消息交换的消息的响应(其中有 JMSReplyTo 标头)。

如果要使用 InOnly 并消耗信息并将其发送到另一个目的地,您可以使用以下路由:

from("activemq:My.Queue").
  to("velocity:com/acme/MyResponse.vm").
  to("activemq:Another.Queue");

和 使用内容缓存,例如用于生产环境,其中 .vm 模板永远不会更改:

from("activemq:My.Queue").
  to("velocity:com/acme/MyResponse.vm?contentCache=true").
  to("activemq:Another.Queue");

以及基于文件的资源:

from("activemq:My.Queue").
  to("velocity:file://myfolder/MyResponse.vm?contentCache=true").
  to("activemq:Another.Queue");

Camel 2.1 中,可以指定组件应该通过标头动态使用的模板,例如:

from("direct:in").
  setHeader("CamelVelocityResourceUri").constant("path/to/my/template.vm").
  to("velocity:dummy?allowTemplateFromHeader=true");

Camel 2.1 中,可以直接将模板指定为组件应通过标头动态使用的标头,例如:

from("direct:in").
  setHeader("CamelVelocityTemplate").constant("Hi this is a velocity template that can do templating ${body}").
  to("velocity:dummy?allowTemplateFromHeader=true");
警告

启用 allowTemplateFromHeader 选项具有安全 RAMification。例如,如果标头包含不受信任的或用户派生内容,这最终可能会影响您的最终应用程序的信心和完整性,因此请小心使用这个选项。

363.9. 电子邮件示例

在此例中,我们想使用 Velocity 模板进行单次确认电子邮件。电子邮件模板在 Velocity 中称为:

Dear ${headers.lastName}, ${headers.firstName}

Thanks for the order of ${headers.item}.

Regards Camel Riders Bookstore
${body}

和 java 代码:

363.10. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 364 章 Vert.x 组件

作为 Camel 2.12 版本提供

vertx 组件用于 Vertx 事件Bus

vertx 事件Bus 发送并接收 JSON 事件。

INFO:从 vertx 3 开始使用 Camel 2.16,它在运行时需要 Java 1.8。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-vertx</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

364.1. URI 格式

vertx:channelName[?options]

364.2. 选项

Vert.x 组件支持 7 选项,这些选项如下。

名称描述默认类型

vertxFactory (advanced)

使用自定义 VertxFactory 实现

 

VertxFactory

host (common)

创建嵌入式集群事件Bus的主机名

 

字符串

port (common)

创建嵌入式集群事件Bus 的端口

 

int

vertxOptions (common)

用于创建 vertx 的选项

 

VertxOptions

vertx (common)

使用给定的 vertx EventBus 而不是创建新的嵌入式事件Bus

 

Vertx

timeout (common)

等待集群的 Vertx 事件Bus 就绪超时(以秒为单位)。默认值为 60。

60

int

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Vert.x 端点使用 URI 语法进行配置:

vertx:address

使用以下路径和查询参数:

364.2.1. 路径名(1 参数):

名称描述默认类型

address

必需 设置用于通信的事件总线地址

 

字符串

364.2.2. 查询参数(5 参数):

名称描述默认类型

pubSub (common)

是否使用发布/订阅,而不是在发送到 vertx 端点时点。

 

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

364.3. Spring Boot Auto-Configuration

组件支持 8 个选项,如下所示。

名称描述默认类型

camel.component.vertx.enabled

启用 vertx 组件

true

布尔值

camel.component.vertx.host

创建嵌入式集群事件Bus的主机名

 

字符串

camel.component.vertx.port

创建嵌入式集群事件Bus 的端口

 

整数

camel.component.vertx.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.vertx.timeout

等待集群的 Vertx 事件Bus 就绪超时(以秒为单位)。默认值为 60。

60

整数

camel.component.vertx.vertx

使用给定的 vertx EventBus 而不是创建新的嵌入式事件Bus。选项为 io.vertx.core.Vertx 类型。

 

字符串

camel.component.vertx.vertx-factory

使用自定义 VertxFactory 实现。选项是一个 io.vertx.core.spi.VertxFactory 类型。

 

字符串

camel.component.vertx.vertx-options

用于创建 vertx 的选项。选项是一个 io.vertx.core.VertxOptions 类型。

 

字符串

Camel 2.12.3: 发送到 vertx 端点时,使用 publish/subscribe 而不是指向点的发布/订阅。

You can append query options to the URI in the following format, ?option=value&option=value&...

364.4. 连接到现有的 Vert.x 实例

如果要连接到 JVM 中已存在的 Vert.x 实例,您可以在组件级别上设置实例:

Vertx vertx = ...;
VertxComponent vertxComponent = new VertxComponent();
vertxComponent.setVertx(vertx);
camelContext.addComponent("vertx", vertxComponent);

364.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 365 章 虚拟机组件

可作为 Camel 版本 1.1 提供

vm: 组件提供异步 SEDA 行为,在 BlockingQueue 上交换消息,并在单独的线程池中调用消费者。

此组件与 Seda 组件不同,因为虚拟机支持 CamelContext 实例间的通信 - 因此,您可以使用此机制在 web 应用程序间通信(提供 camel-core.jar 是在 系统/引导 类路径上)。

虚拟机是 Seda 组件的扩展。

365.1. URI 格式

vm:queueName[?options]

其中 queueName 可以是任何字符串,以在 JVM 中唯一标识端点(或者至少在加载 camel-core.jar 的类加载器中)

您可以使用以下格式将查询选项附加到 URI: ?option=value&option=value&…​

必须与制作者和消费者端点 URI 使用完全相同的 虚拟机 端点 URI。否则,Camel 会创建第二个 虚拟机 端点,尽管 URI 的 queueName 部分是相同的。例如:

from("direct:foo").to("vm:bar?concurrentConsumers=5");

from("vm:bar?concurrentConsumers=5").to("file://output");

请注意,我们必须使用完整的 URI,包括生产者和消费者中的选项。

在 Camel 2.4 中这个问题已被解决,因此只有队列名称必须匹配。使用队列名称 bar,您可以按照如下所示重写前面的 exmple:

from("direct:foo").to("vm:bar");

from("vm:bar?concurrentConsumers=5").to("file://output");

365.2. 选项

VM 组件支持 6 个选项,它们如下所列。

名称描述默认类型

queueSize (advanced)

设置 SEDA 队列的默认最大容量(例如,它可以保存的消息数)。

1000

int

concurrentConsumers (consumer)

设置默认并发线程处理交换的数量。

1

int

defaultQueueFactory (advanced)

设置默认队列工厂。

 

BlockingQueueFactory

defaultBlockWhenFull (producer)

将消息发送到完整 SEDA 队列的线程是否将阻止,直到队列的容量不再耗尽。默认情况下,将抛出异常表示队列已满。通过启用此选项,调用线程将阻止并等待消息被接受。

false

布尔值

defaultOfferTimeout (producer)

将消息发送到完整 SEDA 队列的线程是否将阻止,直到队列的容量不再耗尽。默认情况下,将抛出异常表示队列已满。启用这个选项,其中可将配置的超时时间添加到块中。使用正在 lint java 队列的 .offer (timeout)方法

 

long

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

VM 端点使用 URI 语法配置:

vm:name

使用以下路径和查询参数:

365.2.1. 路径名(1 参数):

名称描述默认类型

name

队列 所需的 名称

 

字符串

365.2.2. 查询参数(17 参数):

名称描述默认类型

size (common)

SEDA 队列的最大容量(例如,它可以持有的消息数)。默认情况下,将使用 SEDA 组件上设置的默认Size。

1000

int

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN/ERROR 级别并忽略。

false

布尔值

concurrentConsumers (consumer)

并发线程处理次数。

1

int

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN/ERROR 级别记录并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在创建交换时设置默认交换模式。

 

ExchangePattern

limitConcurrentConsumers (consumer)

是否将并发Consumers 数限制为 500 的最大值。默认情况下,如果端点配置了更多数字,则会抛出异常。您可以通过关闭这个选项来禁用该检查。

true

布尔值

multipleConsumers (consumer)

指定是否允许多个消费者。如果启用,您可以使用 SEDA 进行 Publish-Subscribe 消息传递。也就是说,您可以将消息发送到 SEDA 队列,并让每个消费者收到邮件的副本。启用后,应在每个消费者端点上指定这个选项。

false

布尔值

pollTimeout (consumer)

轮询时使用的超时。发生超时时,消费者可以检查是否允许继续运行。设置较低值可让使用者在关闭时更快地响应。

1000

int

purgeWhenStopping (consumer)

在停止使用者/路由时,要清除任务队列。这允许更快地停止,因为队列上任何待处理的消息都已被丢弃。

false

布尔值

blockWhenFull (producer)

将消息发送到完整 SEDA 队列的线程是否将阻止,直到队列的容量不再耗尽。默认情况下,将抛出异常表示队列已满。通过启用此选项,调用线程将阻止并等待消息被接受。

false

布尔值

discardIfNoConsumers (producer)

制作者是否应丢弃该消息(不要将该消息添加到队列中),在发送到没有活动使用者的队列时。只有一个选项丢弃IfNoConsumers,并且可以同时启用 failIfNoNoNoConsumers。

false

布尔值

failIfNoConsumers (producer)

当发送到没有活动用户的队列时,生产者是否应引发异常。只有一个选项丢弃IfNoConsumers,并且可以同时启用 failIfNoNoNoConsumers。

false

布尔值

offerTimeout (producer)

当队列满时,可以将 offerTimeout (以毫秒为单位)添加到块问题单中。您可以使用 0 或一个负值禁用超时。

 

long

timeout (producer)

SEDA 生产者将在等待异步任务完成前超时(以毫秒为单位)。您可以使用 0 或一个负值禁用超时。

30000

long

waitForTaskToComplete (producer)

指定 caller 是否应该等待 async 任务完成的选项,然后再继续。支持以下三个选项: Always、Never 或 IfReplyExpected。前两个值有自我说明。最后一个值 ifReplyExpected 只有在消息是 Request Reply based.默认选项是 IfReplyExpected。

IfReplyExpected

WaitForTaskToComplete

queue (advanced)

定义将由端点使用的队列实例。这个选项只适用于非常罕见的用例,供您使用自定义队列实例。

 

BlockingQueue

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

有关选项和其他重要使用详情,请参阅 Seda 组件,与适用于 Vm 组件的规则相同。

365.3. Samples

在以下路由中,我们将跨 CamelContext 实例交换到名为 order.email 的 VM 队列:

from("direct:in").bean(MyOrderBean.class).to("vm:order.email");

然后我们将在某些其他 Camel 上下文中接收交换(比如在另一个 .war 应用程序中部署):

from("vm:order.email").bean(MyOrderEmailSender.class);

365.4. 另请参阅

第 366 章 Weather 组件

作为 Camel 2.12 版本提供

weather: 组件用于轮询 Open Weather Map 的天气信息,提供免费的全球天气和预测信息。这些信息返回为 json String 对象。

默认情况下,Camel 将轮询当前天气和每小时一次的更新。它还可用来根据作为制作者定义的端点上定义的参数来查询 weather api。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-weather</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

366.1. URI 格式

weather://<unused name>[?options]

366.2. REMARK

自 10 月 9 日起,需要获得 openweather 服务所需的 Api Key。这个密钥作为参数传递给 weather 端点的 URI 定义,使用 appid param !

366.3. 地理位置供应商

自 2018 年 7 月开始,不再提供 2018 FreegeoIP。camel-weather 组件使用这个 API。我们将切换到 IPstack,因此您需要从现在使用 API 指定并访问密钥和 IP。

366.4. 选项

Weather 组件支持 3 个选项,它们如下所列。

名称描述默认类型

geolocationAccessKey (common)

地理位置服务现在需要一个 accessKey 才能使用

 

字符串

geolocationRequestHost IP (common)

地理位置服务现在需要指定与您正在使用的 accessKey 关联的 IP

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Weather 端点使用 URI 语法进行配置:

weather:name

使用以下路径和查询参数:

366.4.1. 路径名(1 参数):

名称描述默认类型

name

必需。name 值没有被使用。

 

字符串

366.4.2. 查询参数(45 参数):

名称描述默认类型

appid (common)

所需 APPID ID 用于验证连接到 API 服务器的用户

 

字符串

headerName (common)

将 weather 结果存储在此标题中,而不是消息正文。如果您想使当前邮件正文保持原样,可以使用此项。

 

字符串

language (common)

响应的语言。

en

WeatherLanguage

mode (common)

weather 数据的输出格式。

JSON

WeatherMode

period (common)

如果 null,则返回当前的 weather 值,否则将使用 5、7、14 天。仅预测周期的数字值实际会被解析,因此时间段的拼写是您的(忽略的)

 

字符串

units (common)

温度测量的单位。

 

WeatherUnits

weatherApi (common)

要使用的 API (当前、预计/3 小时,预计每日、站)

 

WeatherApi

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

httpConnectionManager (advanced)

使用自定义 HttpConnectionManager 管理连接

 

HttpConnectionManager

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

cnt (filter)

要找到的结果数

 

整数

ID (过滤器)

城市/站点 ID 的列表.您可以用逗号分隔多个 ID。

 

字符串

lat (filter)

拉ti度.您可以使用 lat 和 lon 选项而不是位置。对于框化的查询,这是下级。

 

字符串

位置 (过滤器)

如果 null Camel 将使用您的 ip 地址的地理位置尝试和确定当前位置,则其他则指定城市(country)。对于已知的城市名称,Open Weather Map 将决定最适合的城市名称,但可能会返回多个结果。因此,指定和国家也一样返回更准确的数据。如果将当前指定为位置,则组件将尝试获得当前的一度和长度,并使用该数量来获取 weather 详细信息。您可以使用 lat 和 lon 选项而不是位置。

 

字符串

lon (filter)

地点范围。您可以使用 lat 和 lon 选项而不是位置。对于 boxed 的查询,这是非常长的。

 

字符串

rightLon (filter)

对于不选框的查询,这是正确的长度。需要与 topLat 和 zoom 结合使用。

 

字符串

topLat (filter)

对于 boxed 的查询,这是顶级级。需要与 rightLon 和 zoom 结合使用。

 

字符串

zip (filter)

zip-code,例如 94040,us

 

字符串

zoom (filter)

对于框化的查询,这是缩放。需要与 rightLon 和 topLat 结合使用。

 

整数

proxyAuthDomain (proxy)

代理 NTLM 身份验证的域

 

字符串

proxyAuthHost (proxy)

用于代理 NTLM 身份验证的可选主机

 

字符串

proxyAuthMethod (proxy)

代理的身份验证方法,可以是 Basic、Digest 或 NTLM。

 

字符串

proxyAuthPassword (proxy)

用于代理验证的密码

 

字符串

proxyAuthUsername (proxy)

用于代理身份验证的用户名

 

字符串

proxyHost (proxy)

代理主机名

 

字符串

proxyPort (proxy)

代理端口号

 

整数

geolocationAccessKey (security)

需要 的地理位置服务现在需要一个 accessKey 才能使用

 

字符串

geolocationRequestHostIP (security)

所需的 地理位置服务现在需要指定与您正在使用的 accessKey 关联的 IP

 

字符串

366.5. Spring Boot Auto-Configuration

组件支持 4 个选项,如下所示。

名称描述默认类型

camel.component.weather.enabled

启用 weather 组件

true

布尔值

camel.component.weather.geolocation-access-key

地理位置服务现在需要一个 accessKey 才能使用

 

字符串

camel.component.weather.geolocation-request-host-i-p

地理位置服务现在需要指定与您正在使用的 accessKey 关联的 IP

 

字符串

camel.component.weather.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

366.6. 交换数据格式

Camel 将以 json 格式的 java.lang.String (请参阅上述 模式 选项)提供正文。

366.7. 消息标头

标头描述

CamelWeatherQuery

发送至 Open Weather Map 站点的原始查询 URL

CamelWeatherLocation

供制作者用于覆盖端点位置,并使用此标头中的位置。

366.8. Samples

在此例中,我们发现马德里地铁公司 7 天气预测:

from("weather:foo?location=Madrid,Spain&period=7 days&appid=APIKEY&geolocationAccessKey=IPSTACK_ACCESS_KEY&geolocationRequestHostIP=LOCAL_IP").to("jms:queue:weather");

要只找到当前位置的当前天,您可以使用以下内容:

from("weather:foo?appid=APIKEY&geolocationAccessKey=IPSTACK_ACCESS_KEY&geolocationRequestHostIP=LOCAL_IP").to("jms:queue:weather");

使用我们所执行的操作的制作者查找天气:

from("direct:start")
  .to("weather:foo?location=Madrid,Spain&appid=APIKEY&geolocationAccessKey=IPSTACK_ACCESS_KEY&geolocationRequestHostIP=LOCAL_IP");

另外,我们可以在带有标头的消息中发送,从而获取任何位置的天气,如下所示:

  String json = template.requestBodyAndHeader("direct:start", "", "CamelWeatherLocation", "Paris,France&appid=APIKEY", String.class);

然后,若要获取当前位置的天气,然后:

  String json = template.requestBodyAndHeader("direct:start", "", "CamelWeatherLocation", "current&appid=APIKEY", String.class);

第 367 章 Web3j Eum Blockchain 组件

可作为 Camel 版本 2.22 可用

E haveum blockchain 组件使用 web3j 客户端 API,并允许您与 Eeth、Parity、Queity、QuorumInfura 等交互。https://github.com/ethereum/go-ethereum/wiki/geth

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-web3j</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

367.1. URI 格式

web3j://<local/remote host:port or local IPC path>[?options]

367.2. Web3j 选项

Web3j Ethereum Blockchain 组件支持 2 选项,它们如下所列。

名称描述默认类型

configuration (common)

默认配置

 

Web3jConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Web3j Ethereum Blockchain 端点使用 URI 语法配置:

web3j:nodeAddress

使用以下路径和查询参数:

367.2.1. 路径名(1 参数):

名称描述默认类型

nodeAddress

必需 设置用来通信的节点地址

 

字符串

367.2.2. 查询参数(38 参数):

名称描述默认类型

addresses (common)

合同地址或地址列表。

 

list

fromAddress (common)

事务所发送到的地址

 

字符串

fromBlock (common)

块号,或者最后一个 mined 块或 pending 状态的字符串 latest,用于尚未 mined 事务。

latest

DefaultBlockParameter

fullTransactionObjects (common)

如果为 true,它会返回完整的事务对象,如果只为 false 事务哈希,则返回完整的事务对象。

false

布尔值

gasLimit (common)

此块中允许的最大 gas。

 

BigInteger

privateFor (common)

在 Quorum 网络中使用公钥的事务 privateFor 节点

 

list

quorumAPI (common)

如果为 true,这将支持 Quorum API。

false

布尔值

toAddress (common)

事务定向到的地址。

 

字符串

toBlock (common)

块号,或者最后一个 mined 块或 pending 状态的字符串 latest,用于尚未 mined 事务。

latest

DefaultBlockParameter

topics (common)

主题是独立于订单的。每个主题也可以是主题的列表。指定用逗号分开的多个主题。

 

字符串

web3j (common)

预配置的 Web3j 对象。

 

Web3j

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

address (producer)

合同地址.

 

字符串

atBlock (producer)

块号,或者最后一个 mined 块或 pending 状态的字符串 latest,用于尚未 mined 事务。

latest

DefaultBlockParameter

blockHash (producer)

此事务所在块的哈希。

 

字符串

clientId (producer)

用于标识客户端的随机十六进制(32 字节) ID。

 

字符串

data (producer)

合约编译的代码或调用方法签名和编码参数的哈希。

 

字符串

databaseName (producer)

本地数据库名称。

 

字符串

filterId (producer)

要使用的过滤器 ID。

 

BigInteger

gasPrice (producer)

用于每个付费的 gas 价格。

 

BigInteger

hashrate (producer)

哈希速率的十六进制字符串表示(32 字节)。

 

字符串

headerPowHash (producer)

用于提交概念验证解决方案的 pow-hash (256 位)。

 

字符串

index (producer)

块中的事务/电源索引位置。

 

BigInteger

keyName (producer)

数据库中的密钥名称。

 

字符串

mixDigest (producer)

用于提交概念验证解决方案的混合摘要(256 位)。

 

字符串

nonce (producer)

未找到的(64 位)用于提交概念验证。

 

字符串

operation (producer)

要使用的操作。

transaction

字符串

position (producer)

事务索引与块的位置。

 

BigInteger

priority (producer)

whisper 消息的优先级。

 

BigInteger

sha3HashOfDataToSign (producer)

通过计算特定签名来签署的消息。

 

字符串

signedTransactionData (producer)

用于新消息调用事务或为签名交易的合同创建签名的事务数据。

 

字符串

sourceCode (producer)

编译的源代码。

 

字符串

transactionHash (producer)

有关事务哈希所请求的事务的信息。

 

字符串

ttl (producer)

whisper 消息的秒数。

 

BigInteger

value (producer)

事务中发送的值。

 

BigInteger

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

367.3. Spring Boot Auto-Configuration

组件支持 33 选项,如下所示。

名称描述默认类型

camel.component.web3j.configuration.address

合同地址.

 

字符串

camel.component.web3j.configuration.addresses

合同地址或地址列表。

 

list

camel.component.web3j.configuration.block-hash

此事务所在块的哈希。

 

字符串

camel.component.web3j.configuration.client-id

用于标识客户端的随机十六进制(32 字节) ID。

 

字符串

camel.component.web3j.configuration.data

合约编译的代码或调用方法签名和编码参数的哈希。

 

字符串

camel.component.web3j.configuration.database-name

本地数据库名称。

 

字符串

camel.component.web3j.configuration.filter-id

要使用的过滤器 ID。

 

BigInteger

camel.component.web3j.configuration.from-address

事务所发送到的地址

 

字符串

camel.component.web3j.configuration.full-transaction-objects

如果为 true,它会返回完整的事务对象,如果只为 false 事务哈希,则返回完整的事务对象。

false

布尔值

camel.component.web3j.configuration.gas-limit

此块中允许的最大 gas。

 

BigInteger

camel.component.web3j.configuration.gas-price

用于每个付费的 gas 价格。

 

BigInteger

camel.component.web3j.configuration.hashrate

哈希速率的十六进制字符串表示(32 字节)。

 

字符串

camel.component.web3j.configuration.header-pow-hash

用于提交概念验证解决方案的 pow-hash (256 位)。

 

字符串

camel.component.web3j.configuration.index

块中的事务/电源索引位置。

 

BigInteger

camel.component.web3j.configuration.key-name

数据库中的密钥名称。

 

字符串

camel.component.web3j.configuration.mix-digest

用于提交概念验证解决方案的混合摘要(256 位)。

 

字符串

camel.component.web3j.configuration.nonce

未找到的(64 位)用于提交概念验证。

 

字符串

camel.component.web3j.configuration.operation

要使用的操作。

transaction

字符串

camel.component.web3j.configuration.position

事务索引与块的位置。

 

BigInteger

camel.component.web3j.configuration.priority

whisper 消息的优先级。

 

BigInteger

camel.component.web3j.configuration.private-for

在 Quorum 网络中使用公钥的事务 privateFor 节点

 

list

camel.component.web3j.configuration.quorum-a-p-i

如果为 true,这将支持 Quorum API。

false

布尔值

camel.component.web3j.configuration.sha3-hash-of-data-to-sign

通过计算特定签名来签署的消息。

 

字符串

camel.component.web3j.configuration.signed-transaction-data

用于新消息调用事务或为签名交易的合同创建签名的事务数据。

 

字符串

camel.component.web3j.configuration.source-code

编译的源代码。

 

字符串

camel.component.web3j.configuration.to-address

事务定向到的地址。

 

字符串

camel.component.web3j.configuration.topics

主题是独立于订单的。每个主题也可以是主题的列表。指定用逗号分开的多个主题。

 

list

camel.component.web3j.configuration.transaction-hash

有关事务哈希所请求的事务的信息。

 

字符串

camel.component.web3j.configuration.ttl

whisper 消息的秒数。

 

BigInteger

camel.component.web3j.configuration.value

事务中发送的值。

 

BigInteger

camel.component.web3j.configuration.web3j

预配置的 Web3j 对象。

 

Web3j

camel.component.web3j.enabled

启用 web3j 组件

true

布尔值

camel.component.web3j.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

367.4. 消息标头

标头描述

所有 URI 选项

所有 URI 选项也可以设置为交换标头。

367.5. Samples

侦听新的 mined 块,并将块散列发送到 jms 队列:

from("web3j://http://127.0.0.1:7545?operation=ETH_BLOCK_HASH_OBSERVABLE")
    .to("jms:queue:blocks");

使用块哈希代码来检索块和完整事务详情:

from("jms:queue:blocks")
    .setHeader(BLOCK_HASH, body())
    .to("web3j://http://127.0.0.1:7545?operation=ETH_GET_BLOCK_BY_HASH&fullTransactionObjects=true");

根据特定块号读取地址的余额:

from("direct:start")
    .to("web3j://http://127.0.0.1:7545?operation=ETH_GET_BALANCE&address=0xc8CDceCE5d006dAB638029EBCf6Dd666efF5A952&atBlock=10");

第 368 章 Jetty Websocket Component

作为 Camel 2.10 版本提供

websocket 组件为使用 websocket 与客户端通信的 websocket 端点。组件使用 Eclipse Jetty 服务器实现 IETF 规范(drafts 和 RFC 6455)。它支持 ws:// 和 wss:// 协议。要使用 ws:// 协议,必须定义 SSLContextParameters。

当前支持的版本

Camel 2.18 使用 Jetty 9

368.1. URI 格式

websocket://hostname[:port][/resourceUri][?options]

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

368.2. websocket 选项

Jetty Websocket 组件支持 14 选项,它们如下所列。

名称描述默认类型

staticResources (consumer)

为静态资源(如 .html 文件等)设置资源路径。如果您使用 classpath: 前缀,可以从 classpath 加载这些资源,否则会从文件系统或 JAR 文件加载资源。例如,要从 root classpath 中加载使用 classpath:. 或 classpath:WEB-INF/static 如果尚未配置(为空),则不会使用静态资源。

 

字符串

host (common)

主机名.默认值为 0.0.0.0

0.0.0.0

字符串

port (common)

端口号。默认值为 9292

9292

整数

sslKeyPassword (security)

使用 SSL 时密钥存储的密码。

 

字符串

sslPassword (security)

使用 SSL 时的密码。

 

字符串

sslKeystore (security)

密钥存储的路径。

 

字符串

enableJmx (advanced)

如果这个选项为 true,将为此端点启用 Jetty JMX 支持。详情请查看 Jetty JMX 支持。

false

布尔值

minThreads (advanced)

设置服务器线程池中最少的线程数量的值。由于切换到 Jetty9,需要 MaxThreads/minThreads 或 threadPool 字段。minThreads 的默认值为 1。

 

整数

maxThreads (advanced)

设置服务器线程池中最大线程数的值。由于切换到 Jetty9,需要 MaxThreads/minThreads 或 threadPool 字段。最大线程数的默认值为 1 2 noCores。

 

整数

threadPool (advanced)

为服务器使用自定义线程池。由于切换到 Jetty9,需要 MaxThreads/minThreads 或 threadPool 字段。

 

ThreadPool

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

useGlobalSslContext Parameters (security)

启用使用全局 SSL 上下文参数。

false

布尔值

socketFactory (common)

要配置包含用于子协议的自定义 WebSocketFactory 的映射。映射中的密钥是子协议。默认密钥为默认实现保留。

 

map

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Jetty Websocket 端点使用 URI 语法配置:

websocket:host:port/resourceUri

使用以下路径和查询参数:

368.2.1. 路径名(3 参数):

名称描述默认类型

主机

主机名.默认值为 0.0.0.0。在组件上设置这个选项将使用组件配置的值作为默认值。

0.0.0.0

字符串

port

端口号。默认值为 9292。在组件上设置这个选项将使用组件配置的值作为默认值。

9292

整数

resourceUri

要使用的 websocket 频道 需要 名称

 

字符串

368.2.2. 查询参数(18 参数):

名称描述默认类型

maxBinaryMessageSize (common)

可用于设置在关闭前可以接受 websocketServlet 创建的 websocket 的大小(以字节为单位)。(默认为 -1 或无限)

-1

整数

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sessionSupport (consumer)

是否为每个 http 请求启用 HttpSession。

false

布尔值

staticResources (consumer)

为静态资源(如 .html 文件等)设置资源路径。如果您使用 classpath: 前缀,可以从 classpath 加载这些资源,否则会从文件系统或 JAR 文件加载资源。例如,要从 root classpath 中加载使用 classpath:. 或 classpath:WEB-INF/static 如果尚未配置(为空),则不会使用静态资源。

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

sendTimeout (producer)

发送到 websocket 频道时的超时。默认超时为 30000 (30 秒)。

30000

整数

sendToAll (producer)

发送到所有 websocket 订阅者。可用于在端点级别上配置,而不必在消息中使用 WebsocketConstants.SEND_TO_ALL 标头。

 

布尔值

bufferSize (advanced)

设置 websocketServlet 的缓冲区大小,它也是最大帧字节大小(默认值 8192)

8192

整数

maxIdleTime (advanced)

设置 ms 中,websocketServlet 创建的 websocket 可能会闲置在关闭。(默认为 300000)

300000

整数

maxTextMessageSize (advanced)

可用于设置在关闭前可以接受 websocketServlet 创建的 websocket 的大小。

 

整数

minVersion (advanced)

可用于设置 websocketServlet 接受的最低协议版本。(默认值 13 - RFC6455 版本)

13

整数

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

allowedOrigins (cors)

允许的 CORS。使用 允许所有.

 

字符串

crossOriginFilterOn (cors)

是否启用 CORS

false

布尔值

filterPath (cors)

用于过滤 CORS 的上下文路径

 

字符串

enableJmx (monitoring)

如果这个选项为 true,将为此端点启用 Jetty JMX 支持。详情请查看 Jetty JMX 支持。

false

布尔值

sslContextParameters (security)

使用 SSLContextParameters 配置安全性

 

SSLContextParameters

368.3. Spring Boot Auto-Configuration

组件支持 15 个选项,它们如下所列。

名称描述默认类型

camel.component.websocket.enable-jmx

如果这个选项为 true,将为此端点启用 Jetty JMX 支持。详情请查看 Jetty JMX 支持。

false

布尔值

camel.component.websocket.enabled

启用 websocket 组件

true

布尔值

camel.component.websocket.host

主机名.默认值为 0.0.0.0

0.0.0.0

字符串

camel.component.websocket.max-threads

设置服务器线程池中最大线程数的值。由于切换到 Jetty9,需要 MaxThreads/minThreads 或 threadPool 字段。最大线程数的默认值为 1 2 noCores。

 

整数

camel.component.websocket.min-threads

设置服务器线程池中最少的线程数量的值。由于切换到 Jetty9,需要 MaxThreads/minThreads 或 threadPool 字段。minThreads 的默认值为 1。

 

整数

camel.component.websocket.port

端口号。默认值为 9292

9292

整数

camel.component.websocket.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.websocket.socket-factory

要配置包含用于子协议的自定义 WebSocketFactory 的映射。映射中的密钥是子协议。默认密钥为默认实现保留。

 

map

camel.component.websocket.ssl-context-parameters

使用 SSLContextParameters 配置安全性。选项是一个 org.apache.camel.util.jsse.SSLContextParameters 类型。

 

字符串

camel.component.websocket.ssl-key-password

使用 SSL 时密钥存储的密码。

 

字符串

camel.component.websocket.ssl-keystore

密钥存储的路径。

 

字符串

camel.component.websocket.ssl-password

使用 SSL 时的密码。

 

字符串

camel.component.websocket.static-resources

为静态资源(如 .html 文件等)设置资源路径。如果您使用 classpath: 前缀,可以从 classpath 加载这些资源,否则会从文件系统或 JAR 文件加载资源。例如,要从 root classpath 中加载使用 classpath:. 或 classpath:WEB-INF/static 如果尚未配置(为空),则不会使用静态资源。

 

字符串

camel.component.websocket.thread-pool

为服务器使用自定义线程池。由于切换到 Jetty9,需要 MaxThreads/minThreads 或 threadPool 字段。选项是一个 org.eclipse.jetty.util.thread.ThreadPool 类型。

 

字符串

camel.component.websocket.use-global-ssl-context-parameters

启用使用全局 SSL 上下文参数。

false

布尔值

 

368.4. 消息标头

websocket 组件使用 2 标头来向单个/当前客户端发送消息,或发送到所有客户端。

WebsocketConstants.SEND_TO_ALL将消息发送到所有当前连接的客户端。您可以在端点上使用 sendToAll 选项,而不使用此标头。

WebsocketConstants.CONNECTION_KEY

使用给定连接密钥向客户端发送消息。

WebsocketConstants.REMOTE_ADDRESS

websocket 会话的远程地址。

368.5. 使用

在本例中,我们让 Camel 公开了客户端可以与之通信的 websocket 服务器。websocket 服务器使用默认的主机和端口,即 0.0.0.0:9292
这个示例将发回输入的回显。要发回消息,我们需要将转换的消息发送到同一端点 "websocket://echo"。这是需要的
,因为默认是 InOnly 的消息。

这个示例是单元测试的一部分,您可以在 中找到。作为客户端,我们使用 AHC 库,为 Web 套接字提供支持。

下面是一个另一个例子,它定义了 webapp 资源位置,以允许 Jetty 应用服务器不仅注册 WebSocket servlet,同时也为浏览器公开 Web 资源。资源应该在 webapp 目录下定义。

from("activemq:topic:newsTopic")
   .routeId("fromJMStoWebSocket")
   .to("websocket://localhost:8443/newsTopic?sendToAll=true&staticResources=classpath:webapp");

368.6. 为 WebSocket 组件设置 SSL

368.6.1. 使用 JSSE 配置实用程序

从 Camel 2.10 开始,WebSocket 组件通过 Camel JSSE 配置实用程序 支持 SSL/TLS 配置。  这个实用程序可大大减少您需要编写的组件特定代码的数量,并在端点和组件级别进行配置。  以下示例演示了如何将 实用程序与 Cometd 组件搭配使用。

组件的程序配置

KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");

KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");

TrustManagersParameters tmp = new TrustManagersParameters();
tmp.setKeyStore(ksp);

SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
scp.setTrustManagers(tmp);

CometdComponent commetdComponent = getContext().getComponent("cometds", CometdComponent.class);
commetdComponent.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:trustManagers>
      <camel:keyStore
          resource="/users/home/server/keystore.jks"
          password="keystorePassword"/>
    </camel:trustManagers>
  </camel:sslContextParameters>...
...
  <to uri="websocket://127.0.0.1:8443/test?sslContextParameters=#sslContextParameters"/>...

基于 Java DSL 的端点配置

...
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() {

                String uri = "websocket://127.0.0.1:8443/test?sslContextParameters=#sslContextParameters";

                from(uri)
                     .log(">>> Message received from WebSocket Client : ${body}")
                     .to("mock:client")
                     .loop(10)
                         .setBody().constant(">> Welcome on board!")
                         .to(uri);
...

368.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • AHC
  • Jetty
  • Twitter Websocket 示例演示如何轮询二十位搜索的恒定源,并使用 Web 套接字实时发布结果到网页。

第 369 章 Weka Component

Since Camel 3.1

仅支持制作者

Weka 组件提供对 (Weka Data Mining) 工具组的访问。

weka 被尝试和测试了开源计算机学习软件,该软件可通过图形用户界面、标准终端应用程序或 Java API 访问。它广泛用于教学、研究和工业应用程序,包含适用于标准机器学习任务的多种内置工具,另外还提供对知名 toolboxes 的透明访问,如 scikit-learn、R 和 Deeplearning4j。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-weka</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

369.1. URI 格式

weka://cmd

369.2. 选项

Weka 组件支持 2 个选项,它们如下所列。

名称描述默认类型

lazyStartProducer (producer)

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

basicPropertyBinding (advanced)

组件是否应使用基本的属性绑定(Camel 2.x)或较新的属性绑定额外功能

false

布尔值

Weka 端点使用 URI 语法配置:

weka:command

使用以下路径和查询参数:

369.2.1. 路径名(1 参数):

名称描述默认类型

命令

要使用 的命令。该值可以是以下之一: filter, model, read, write, push, pop, version

 

命令

369.2.2. 查询参数(12 参数):

名称描述默认类型

lazyStartProducer (producer)

制作者是否应该启动 lazy(在第一个消息上)。通过启动 lazy,您可以使用它来允许 CamelContext 和路由在启动期间启动,否则在启动期间出现问题,并导致路由启动失败。通过将这个启动延迟到 lazy 后,可以在通过 Camel 的路由错误处理程序路由消息期间处理启动失败。注意在处理第一个消息时,创建并启动制作者可能花费较少的时间,从而延长处理的总处理时间。

false

布尔值

basicPropertyBinding (advanced)

端点是否应使用基本的属性绑定(Camel 2.x),或者较新的属性绑定额外功能

false

布尔值

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

应用 (filter)

过滤器 spec (如名称选项)

 

字符串

build (model)

分类规范(如名称选项)

 

字符串

dsname (model)

指定的数据集,用于培训分类器

 

字符串

folds (model)

用于跨验证的折叠数

10

int

loadFrom (model)

加载模型的路径

 

字符串

saveTo (model)

为保存模型的路径

 

字符串

SEED ( model)

随机化器的一个可选 seed

1

int

xval (model)

是否对当前 dataset 使用跨验证的标记

false

布尔值

path (write)

read/write 命令的 in/out 路径

 

字符串

369.3. Karaf 支持

在 Karaf 中不支持这个组件

369.4. 消息标头

369.5. Samples

369.5.1. Read + Filter + Write

第一个示例演示了如何使用文件组件读取 CSV 文件,然后将其传递到 Weka。在 Weka 中,我们对数据集应用几个过滤器,然后将其传递到文件组件以进行写入。

    @Override
    public void configure() throws Exception {

        // Use the file component to read the CSV file
        from("file:src/test/resources/data?fileName=sfny.csv")

        // Convert the 'in_sf' attribute to nominal
        .to("weka:filter?apply=NumericToNominal -R first")

        // Move the 'in_sf' attribute to the end
        .to("weka:filter?apply=Reorder -R 2-last,1")

        // Rename the relation
        .to("weka:filter?apply=RenameRelation -modify sfny")

        // Use the file component to write the Arff file
        .to("file:target/data?fileName=sfny.arff")
    }

此处我们执行与上述操作相同的操作,无需使用文件组件。

    @Override
    public void configure() throws Exception {

        // Initiate the route from somewhere
        .from("...")

        // Use Weka to read the CSV file
        .to("weka:read?path=src/test/resources/data/sfny.csv")

        // Convert the 'in_sf' attribute to nominal
        .to("weka:filter?apply=NumericToNominal -R first")

        // Move the 'in_sf' attribute to the end
        .to("weka:filter?apply=Reorder -R 2-last,1")

        // Rename the relation
        .to("weka:filter?apply=RenameRelation -modify sfny")

        // Use Weka to write the Arff file
        .to("weka:write?path=target/data/sfny.arff");
    }

在本例中,客户端将提供输入路径或其它受支持的类型。查看 WekaTypeConverters 用于支持的输入类型集合。

    @Override
    public void configure() throws Exception {

        // Initiate the route from somewhere
        .from("...")

        // Convert the 'in_sf' attribute to nominal
        .to("weka:filter?apply=NumericToNominal -R first")

        // Move the 'in_sf' attribute to the end
        .to("weka:filter?apply=Reorder -R 2-last,1")

        // Rename the relation
        .to("weka:filter?apply=RenameRelation -modify sfny")

        // Use Weka to write the Arff file
        .to("weka:write?path=target/data/sfny.arff");
    }

369.5.2. 构建模型

在构建模型时,我们首先选择要使用的分类算法,然后利用一些数据对其进行培训。结果是我们稍后用来分类未量数据的培训模式。

我们在此培训 J48,达到 10 倍的交叉验证。

try (CamelContext camelctx = new DefaultCamelContext()) {

    camelctx.addRoutes(new RouteBuilder() {

        @Override
        public void configure() throws Exception {

            // Use the file component to read the training data
            from("file:src/test/resources/data?fileName=sfny-train.arff")

            // Build a J48 classifier using cross-validation with 10 folds
            .to("weka:model?build=J48&xval=true&folds=10&seed=1")

            // Persist the J48 model
            .to("weka:model?saveTo=src/test/resources/data/sfny-j48.model")
        }
    });
    camelctx.start();
}

369.5.3. 预测类

在这里,我们使用 Processor 访问无法从端点 URI 直接提供的功能。

如果您在这里直接介绍,这种语法看起来比较困难,您可能想简要了解有关 Nessus API 概念的部分

try (CamelContext camelctx = new DefaultCamelContext()) {

    camelctx.addRoutes(new RouteBuilder() {

        @Override
        public void configure() throws Exception {

            // Use the file component to read the test data
            from("file:src/test/resources/data?fileName=sfny-test.arff")

            // Remove the class attribute
            .to("weka:filter?apply=Remove -R last")

            // Add the 'prediction' placeholder attribute
            .to("weka:filter?apply=Add -N predicted -T NOM -L 0,1")

            // Rename the relation
            .to("weka:filter?apply=RenameRelation -modify sfny-predicted")

            // Load an already existing model
            .to("weka:model?loadFrom=src/test/resources/data/sfny-j48.model")

            // Use a processor to do the prediction
            .process(new Processor() {
                public void process(Exchange exchange) throws Exception {
                    Dataset dataset = exchange.getMessage().getBody(Dataset.class);
                    dataset.applyToInstances(new NominalPredictor());
                }
            })

            // Write the data file
            .to("weka:write?path=src/test/resources/data/sfny-predicted.arff")
        }
    });
    camelctx.start();
}

369.6. Resources

第 370 章 wordpress 组件

可作为 Camel 版本 2.21 可用

Wordpress API 的 Camel 组件.

目前只支持 PostsUsers 操作。

370.1. 选项

Wordpress 组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

wordpress 组件配置

 

WordpressComponent Configuration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Wordpress 端点使用 URI 语法配置:

wordpress:operationDetail

使用以下路径和查询参数:

370.1.1. 路径名(2 参数):

名称描述默认类型

operation

所需的 端点操作。

 

字符串

operationDetail

端点操作的第二部分。仅在端点语义不够时才需要,如 wordpress:post:delete

 

字符串

370.1.2. 查询参数(11 参数):

名称描述默认类型

apiVersion (common)

Wordpress REST API 版本

2

字符串

criteria (common)

用于复杂搜索的条件。

 

map

force (common)

是否绕过垃圾箱并强制删除。

false

布尔值

id (common)

实体 ID

 

整数

password (common)

来自授权用户的密码

 

字符串

url (common)

从您的站点 需要 Wordpress API URL,例如 http://myblog.com/wp-json/

 

字符串

user (common)

授权用户执行写入操作

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

370.2. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.component.wordpress.configuration.api-version

Wordpress REST API 版本

2

字符串

camel.component.wordpress.configuration.criteria-properties

  

map

camel.component.wordpress.configuration.force

是否绕过垃圾箱并强制删除。

false

布尔值

camel.component.wordpress.configuration.id

实体 ID

 

整数

camel.component.wordpress.configuration.password

来自授权用户的密码

 

字符串

camel.component.wordpress.configuration.search-criteria

  

SearchCriteria

camel.component.wordpress.configuration.url

您站点中的 Wordpress API URL,例如 http://myblog.com/wp-json/

 

字符串

camel.component.wordpress.configuration.user

授权用户执行写入操作

 

字符串

camel.component.wordpress.enabled

是否启用 wordpress 组件的自动配置。默认启用。

 

布尔值

camel.component.wordpress.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

从官方 API 执行读取操作镜像时,需要的大部分参数。执行搜索操作时,需要 条件。 后缀。将以下 消费者 视为示例:

wordpress:post?criteria.perPage=10&criteria.orderBy=author&criteria.categories=camel,dozer,json

370.2.1. 配置 Wordpress 组件

WordpressConfiguration 类可用于将初始属性配置设置为组件,而不是将其作为查询参数传递。以下列表演示了如何设置要在路由中使用的组件。

public void configure() {
    final WordpressConfiguration configuration = new WordpressConfiguration();
    final WordpressComponentConfiguration component = new WordpressComponentConfiguration();
    configuration.setApiVersion("2");
    configuration.setUrl("http://yoursite.com/wp-json/");
    component.setConfiguration(configuration);
    getContext().addComponent("wordpress", component);

    from("wordpress:post?id=1")
      .to("mock:result");
}

370.2.2. 消费者示例

消费者从 API 定期轮询 Wordpress 中域对象的时间。以下示例使用 Post 操作示例:

  • wordpress:post 检索 posts (默认为 10 个后)
  • wordpress:post?id=1 搜索特定的后

370.2.3. producer 示例

制作者在 Wordpress 上执行写入操作,如添加新用户或更新后。要进行写入,您必须具有授权的用户凭证(请参阅身份验证)。

  • wordpress:post 在消息正文中的 org.apache.camel.component.wordpress.api.model.Post 类中创建一个新的 post。
  • wordpress:post?id=1 根据数据 org.apache.camel.component.wordpress.api.model.Post from the message body.Post 来更新 post。
  • wordpress:post:delete?id=1 deletes a specific post

370.3. 身份验证

执行写入操作的制作者(例如,创建新提交后) 必须具有经过身份验证的用户 才能这样做。Wordpress 使用的标准身份验证机制是 cookie。遗憾的是,在 Wordpress 环境外不支持此方法,因为它依赖于 内部功能。

有一些选择使用 Wordpress API 而无需使用,但需要安装特定的插件。

此时,l-wordpress 仅支持基本身份验证(更多内容)。要配置它,您必须安装 Basic-Auth Wordpress 插件,并将凭证传递给端点:

from ("direct:delete").to ("wordpress:post:delete?id=9&user=ben&password=password123").to ("mock:resultDelete");

不建议在没有 TLS 的情况下在生产环境中使用基本身份验证!

第 371 章 XChange Component

可作为 Camel 版本 2.21 可用

xchange: 组件使用 XChange Java 库提供对 60+ Bitcoin 和 Altcoin 交换的访问。它提供用于交易和访问市场数据的一致接口。

Camel 可以获得加密货币市场数据、查询历史数据、排列市场订单等等。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-xchange</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

371.1. URI 格式

xchange://exchange?options

371.2. 选项

XChange 组件没有选项。

XChange 端点使用 URI 语法配置:

xchange:name

使用以下路径和查询参数:

371.2.1. 路径名(1 参数):

名称描述默认类型

name

需要 交换来连接到

 

字符串

371.2.2. 查询参数(5 参数):

名称描述默认类型

currency (producer)

货币

 

货币

currencyPair (producer)

货币对

 

CurrencyPair

方法 (生成器)

必要方法执行

 

XChangeMethod

service (producer)

所需的服务 要调用

 

XChangeService

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

371.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.xchange.enabled

是否启用 xchange 组件的自动配置。默认启用。

 

布尔值

camel.component.xchange.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

371.4. 身份验证

此组件通过 REST API 与支持的加密货币交换通信。有些 API 请求使用简单的未经身份验证的 GET 请求。然而,对于大多数有趣的事情,您需要一个交换帐户并启用 API 访问密钥。

这些 API 访问密钥需要被严格保护,特别是在允许撤回功能时。在这种情况下,任何可获取 API 密钥的人都可以轻松地将资金从您的帐户转移到某些其他地址,即您的资金。

您的 API 访问密钥可以在 SSH 目录中的交换特定属性文件中进行。例如,对于 Binance,即 ~/.ssh/binance-secret.keys

##
# This file MUST NEVER be commited to source control.
# It is therefore added to .gitignore.
#
apiKey = GuRW0*********
secretKey = nKLki************

371.5. 消息标头

<TODO><title>Samples</title>

在这个示例中,我们在 USDT 找到当前的 Bitcoin 市场价格:

from("direct:ticker").to("xchange:binance?service=market&method=ticker&currencyPair=BTC/USDT")
</TODO>

第 372 章 XML Beans DataFormat (已弃用)

可作为 Camel 版本 1.2 提供

XmlBeans 是一个数据格式,它使用 XmlBeans 库 将 XML 有效负载合并到 Java 对象中,或将 marshal Java 对象编入 XML 有效负载中。

from("activemq:My.Queue").
  unmarshal().xmlBeans().
  to("mqseries:Another.Queue");

372.1. 选项

XML Beans 数据格式支持 2 选项,它们如下。

名称默认Java 类型描述

prettyPrint

false

布尔值

启用大量打印输出。默认为 false。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

372.2. Spring Boot Auto-Configuration

组件支持 3 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.xmlbeans.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.xmlbeans.enabled

启用 xmlbeans 数据格式

true

布尔值

camel.dataformat.xmlbeans.pretty-print

启用大量打印输出。默认为 false。

false

布尔值

372.3. 依赖项

要在 camel 路由中使用 XmlBeans,您需要添加实现此数据格式的 camel-xmlbeans 依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-xmlbeans</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

第 373 章 XML JSon DataFormat (已弃用)

作为 Camel 2.10 版本提供

Camel 已经支持很多数据格式来执行 XML 和 JSON 相关的转换,但所有这些数据都需要 POJO 作为输入(绑定)或生成 POJO 作为输出(用于取消传输)。这个数据格式提供了从 XML 转换为 JSON 的能力,反之亦然,而无需通过中间 POJO。

此数据格式利用 Json-lib 库来实现直接转换。在这种情况下,XML 被视为高级别的格式,而 JSON 是低级格式。因此,marshal/unmarshal 语义分配如下:

  • marshalling TOKEN 从 XML 转换为 JSON
  • 从 JSON 转换为 XML 的 unmarshalling TOKEN。

373.1. 选项

XML JSon 数据格式支持 13 个选项,它们如下所列。

名称默认Java 类型描述

encoding

 

字符串

设置编码。用于取消过滤(JSON 到 XML 转换)。

elementName

 

字符串

指定代表每个数组元素的 XML 元素的名称。用于取消过滤(JSON 到 XML 转换)。

arrayName

 

字符串

指定顶级 XML 元素的名称。用于取消过滤(JSON 到 XML 转换)。例如,在转换 1 时,2 为 3,默认情况下它将默认是 123。通过设置这个选项或 rootName,您可以更改元素 'a' 的名称。

forceTopLevelObject

false

布尔值

确定生成的 JSON 是否以名称与 XML 根元素匹配的顶层元素开始。用于总结(XML 到 JSon 转换)。如果禁用,XML 字符串 12 可切换到 'x: '1','y': '2'。否则,它将进入 'a': 'x: '1', 'y': '2'。

namespaceLenient

false

布尔值

标记可以接受不完整的命名空间前缀。用于取消过滤(JSON 到 XML 转换)。在大多数情况下,json-lib 会在运行时自动更改此标志以匹配处理。

rootName

 

字符串

指定顶级元素的名称。用于取消过滤(JSON 到 XML 转换)。如果没有设置,则 json-lib 将使用 arrayName 或 objectName (默认值:'o',当前无法以此数据格式配置)。如果设置为 'root',JSON 字符串 'x': 'value1', 'y' : 'value2' 将转换为 value1value2,否则 'root' 元素将被命名为 'o'。

skipWhitespace

false

布尔值

确定 XML 元素之间的空格是否作为文本值或忽略。用于总结(XML 到 JSon 转换)。

trimSpaces

false

布尔值

确定 String 值中是否会省略前导和尾随空格。用于总结(XML 到 JSon 转换)。

skipNamespaces

false

布尔值

信号是否应该忽略命名空间。默认情况下,它们将使用 xmlns 元素添加到 JSON 输出中。用于总结(XML 到 JSon 转换)。

removeNamespacePrefixes

false

布尔值

从 XML 限定元素中删除命名空间前缀,以便生成的 JSON 字符串不包含它们。用于总结(XML 到 JSon 转换)。

expandableProperties

 

list

通过可扩展属性,JSON 数组元素转换为 XML,因为本地名称等于 JSON 密钥的重复 XML 元素序列,例如: number: 1,2,3,通常转换为 123 (其中 e 可以通过设置 elementName)进行修改,而如果数字被设置为 123,则该编号被设置为不过滤(JSON 到 XML)。

typeHints

 

字符串

在生成的 XML 中添加类型提示,以帮助转换回 JSON。用于取消过滤(JSON 到 XML 转换)。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

373.2. Spring Boot Auto-Configuration

组件支持 14 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.xmljson.array-name

指定顶级 XML 元素的名称。用于取消过滤(JSON 到 XML 转换)。例如,在转换 1 时,2 为 3,默认情况下它将默认是 123。通过设置这个选项或 rootName,您可以更改元素 'a' 的名称。

 

字符串

camel.dataformat.xmljson.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.xmljson.element-name

指定代表每个数组元素的 XML 元素的名称。用于取消过滤(JSON 到 XML 转换)。

 

字符串

camel.dataformat.xmljson.enabled

启用 xmljson 数据格式

true

布尔值

camel.dataformat.xmljson.encoding

设置编码。用于取消过滤(JSON 到 XML 转换)。

 

字符串

camel.dataformat.xmljson.expandable-properties

通过可扩展属性,JSON 数组元素转换为 XML,因为本地名称等于 JSON 密钥的重复 XML 元素序列,例如: number: 1,2,3,通常转换为 123 (其中 e 可以通过设置 elementName)进行修改,而如果数字被设置为 123,则该编号被设置为不过滤(JSON 到 XML)。

 

list

camel.dataformat.xmljson.force-top-level-object

确定生成的 JSON 是否以名称与 XML 根元素匹配的顶层元素开始。用于总结(XML 到 JSon 转换)。如果禁用,XML 字符串 12 可切换到 'x: '1','y': '2'。否则,它将进入 'a': 'x: '1', 'y': '2'。

false

布尔值

camel.dataformat.xmljson.namespace-lenient

标记可以接受不完整的命名空间前缀。用于取消过滤(JSON 到 XML 转换)。在大多数情况下,json-lib 会在运行时自动更改此标志以匹配处理。

false

布尔值

camel.dataformat.xmljson.remove-namespace-prefixes

从 XML 限定元素中删除命名空间前缀,以便生成的 JSON 字符串不包含它们。用于总结(XML 到 JSon 转换)。

false

布尔值

camel.dataformat.xmljson.root-name

指定顶级元素的名称。用于取消过滤(JSON 到 XML 转换)。如果没有设置,则 json-lib 将使用 arrayName 或 objectName (默认值:'o',当前无法以此数据格式配置)。如果设置为 'root',JSON 字符串 'x': 'value1', 'y' : 'value2' 将转换为 value1value2,否则 'root' 元素将被命名为 'o'。

 

字符串

camel.dataformat.xmljson.skip-namespaces

信号是否应该忽略命名空间。默认情况下,它们将使用 xmlns 元素添加到 JSON 输出中。用于总结(XML 到 JSon 转换)。

false

布尔值

camel.dataformat.xmljson.skip-whitespace

确定 XML 元素之间的空格是否作为文本值或忽略。用于总结(XML 到 JSon 转换)。

false

布尔值

camel.dataformat.xmljson.trim-spaces

确定 String 值中是否会省略前导和尾随空格。用于总结(XML 到 JSon 转换)。

false

布尔值

camel.dataformat.xmljson.type-hints

在生成的 XML 中添加类型提示,以帮助转换回 JSON。用于取消过滤(JSON 到 XML 转换)。

 

字符串

ND

373.3. Java DSL 的基本使用情况

373.3.1. 明确实例化数据格式

只需从软件包 org.apache.camel.dataformat.xmljson 实例化 XmlJsonDataFormat。请确定您安装了 camel-xmljson 功能(如果在 OSGi 上运行),或者您已在类路径中包含 camel-xmljson-7.10.jar 及其传输依赖关系。使用默认配置进行初始化示例:

XmlJsonDataFormat xmlJsonFormat = new XmlJsonDataFormat();

要根据以上选项调整数据格式的行为,请使用适当的集合:

XmlJsonDataFormat xmlJsonFormat = new XmlJsonDataFormat();
xmlJsonFormat.setEncoding("UTF-8");
xmlJsonFormat.setForceTopLevelObject(true);
xmlJsonFormat.setTrimSpaces(true);
xmlJsonFormat.setRootName("newRoot");
xmlJsonFormat.setSkipNamespaces(true);
xmlJsonFormat.setRemoveNamespacePrefixes(true);
xmlJsonFormat.setExpandableProperties(Arrays.asList("d", "e"));

在实例化数据格式后,下一步实际上会从 marshal ()unmarshal () DSL 元素中使用它:

// from XML to JSON
from("direct:marshal").marshal(xmlJsonFormat).to("mock:json");
// from JSON to XML
from("direct:unmarshal").unmarshal(xmlJsonFormat).to("mock:xml");

373.3.2. 以指定数据格式(line)

或者,您可以使用 xmljson () DSL 元素定义内联数据格式:

// from XML to JSON - inline dataformat
from("direct:marshalInline").marshal().xmljson().to("mock:jsonInline");
// from JSON to XML - inline dataformat
from("direct:unmarshalInline").unmarshal().xmljson().to("mock:xmlInline");

如果您想要,甚至可以将 Map<String, String&gt; 传递给内联方法来提供自定义选项:

Map<String, String> xmlJsonOptions = new HashMap<String, String>();
xmlJsonOptions.put(org.apache.camel.model.dataformat.XmlJsonDataFormat.ENCODING, "UTF-8");
xmlJsonOptions.put(org.apache.camel.model.dataformat.XmlJsonDataFormat.ROOT_NAME, "newRoot");
xmlJsonOptions.put(org.apache.camel.model.dataformat.XmlJsonDataFormat.SKIP_NAMESPACES, "true");
xmlJsonOptions.put(org.apache.camel.model.dataformat.XmlJsonDataFormat.REMOVE_NAMESPACE_PREFIXES, "true");
xmlJsonOptions.put(org.apache.camel.model.dataformat.XmlJsonDataFormat.EXPANDABLE_PROPERTIES, "d e");

// from XML to JSON - inline dataformat w/ options
from("direct:marshalInlineOptions").marshal().xmljson(xmlJsonOptions).to("mock:jsonInlineOptions");
// form JSON to XML - inline dataformat w/ options
from("direct:unmarshalInlineOptions").unmarshal().xmljson(xmlJsonOptions).to("mock:xmlInlineOptions");

373.4. Spring 或 Blueprint DSL 的基本用法

在 & lt;dataFormats > 块中,只需要使用唯一 ID 配置 xmljson 元素:

<dataFormats>
    <xmljson id="xmljson"/>
    <xmljson id="xmljsonWithOptions" forceTopLevelObject="true" trimSpaces="true" rootName="newRoot" skipNamespaces="true"
             removeNamespacePrefixes="true" expandableProperties="d e"/>
</dataFormats>

然后,您只需引用 < marshal /> 和 < unmarshal /> DSLs 中的数据格式对象:

<route>
    <from uri="direct:marshal"/>
    <marshal ref="xmljson"/>
    <to uri="mock:json" />
</route>

<route>
    <from uri="direct:unmarshalWithOptions"/>
    <unmarshal ref="xmljsonWithOptions"/>
    <to uri="mock:xmlWithOptions"/>
</route>

为此组件启用 XML DSL 自动完成比较简单:只是根据您使用的 SpringBlueprint DSL 来指代适当的 Schema 位置。请记住,这种数据格式可从 Camel 2.10 开始获得,因此只有该版本中的模式才会包含这些新的 XML 元素和属性。

使用 Blueprint 的语法与 Spring DSL 的语法相同。只需确保使用了正确的命名空间和 schemaLocation。

373.5. 命名空间映射

XML 具有命名空间,可以完全符合元素和属性;JSON 不。执行 XML-JSON 转换时,您需要考虑这一点。

要缩小差距,Json-lib 具有一个选项,可将命名空间声明(以前缀和命名空间 URI 的形式)绑定为 XML 输出元素(例如,从 JSON 转换为 XML)。例如,提供以下 JSON 字符串:

{ "pref1:a": "value1", "pref2:b": "value2" }

您可以要求 Json-lib 输出元素 pref1:apref2:b 上的命名空间声明,以将前缀 pref1pref2 绑定到特定的命名空间 URI。

要使用此功能,只需创建 XmlJsonDataFormat.NamespacesPerElementMapping 对象,并将其添加到 namespaceMappings 选项(这是 List)。

XmlJsonDataFormat.NamespacesPerElementMapping 包含元素名称,以及 [prefix misconfiguration 命名空间 URI]。为便于映射多个前缀和命名空间 URI,NamespacesPerElementMapping (String element, String pipeSeparatedMappings) 构造器采用基于字符串的管道序列 [prefix, namespaceURI] 对: |ns2|http://camel.apache.org/personalData|ns3|http://camel.apache.org/personalData2|

要定义默认命名空间,只需将对应的键字段留空: |ns1|http://camel.apache.org/test1||http://camel.apache.org/default|

将命名空间声明绑定到元素 name = 空字符串会将这些命名空间附加到根元素。

完整代码类似如下:

XmlJsonDataFormat namespacesFormat = new XmlJsonDataFormat();
List<XmlJsonDataFormat.NamespacesPerElementMapping> namespaces = new ArrayList<XmlJsonDataFormat.NamespacesPerElementMapping>();
namespaces.add(new XmlJsonDataFormat.
                       NamespacesPerElementMapping("", "|ns1|http://camel.apache.org/test1||http://camel.apache.org/default|"));
namespaces.add(new XmlJsonDataFormat.
                       NamespacesPerElementMapping("surname", "|ns2|http://camel.apache.org/personalData|" +
                           "ns3|http://camel.apache.org/personalData2|"));
namespacesFormat.setNamespaceMappings(namespaces);
namespacesFormat.setRootElement("person");

您可以在 Spring DSL 中实现相同的功能。

373.5.1. 示例

在以上 Java 代码段中使用以下 JSON 字符串中的命名空间绑定:

{ "name": "Raul", "surname": "Kripalani", "f": true, "g": null}

 

会产生以下 XML:

<person xmlns="http://camel.apache.org/default" xmlns:ns1="http://camel.apache.org/test1">
    <f>true</f>
    <g null="true"/>
    <name>Raul</name>
    <surname xmlns:ns2="http://camel.apache.org/personalData" xmlns:ns3="http://camel.apache.org/personalData2">Kripalani</surname>
</person>

请记住,JSON spec 定义了 JSON 对象,如下所示:

对象是一组未排序的名称/值对。[…​]。

这就是这些元素在输出 XML 中以不同顺序排列的原因。

373.6. 依赖项

要在 camel 路由中使用 XmlJson dataformat,您需要将以下依赖项添加到您的 pom:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-xmljson</artifactId>
  <version>x.x.x</version>
  <!-- Use the same version as camel-core, but remember that this component is only available from 2.10 onwards -->
</dependency>

<!-- And also XOM must be included. XOM cannot be included by default due to an incompatible
license with ASF; so add this manually -->
<dependency>
  <groupId>xom</groupId>
  <artifactId>xom</artifactId>
  <version>1.2.5</version>
</dependency>

373.7. 另请参阅

第 374 章 XML 安全组件

作为 Camel 2.12 版本提供

使用这个 Apache Camel 组件,您可以生成和验证 XML 签名,如 W3C 标准 XML 签名语法和处理, 或如 successor 版本 1.1 中所述。有关 XML 加密支持,请参阅 XML 安全 数据格式

您可以在此处找到 XML 签名 简介。组件实施基于 JSR 105,即与 W3C 标准对应的 Java API,支持 Apache Santuario 和 JSR 105 的 JDK 供应商。实施将首先尝试使用 Apache Santuario 提供程序;如果找不到 Santuario 供应商,它将使用 JDK 提供程序。此外,实施基于 DOM。

从 Camel 2.15.0 开始,我们为 signer 端点提供对 XAdES-BES/EPES 的支持;请参阅"签名端点"的"XAdES-BES/EPES"部分。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-xmlsecurity</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

374.1. XML 签名 Wrapping 模式

XML 签名在信封、信封和分离 XML 签名之间有所不同。在 信封 XML 签名案例中,XML 签名被签名的 XML 文档嵌套;这意味着 XML 签名元素是父元素的子元素,属于签名的 XML 文档。在 信封 XML 签名案例中,XML 签名包含签名内容。所有其他情况称为 分离 XML 签名。从 2.14.0 开始,支持某种形式的分离 XML 签名。

信封的 XML 签名 案例中,支持的 XML 签名有以下结构(可能被 []括起)。

<[parent element]>
   ... <!-- Signature element is added as last child of the parent element-->
   <Signature Id="generated_unique_signature_id">
       <SignedInfo>
             <Reference URI="">
                   <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                   (<Transform>)* <!-- By default "http://www.w3.org/2006/12/xml-c14n11" is added to the transforms -->
                   <DigestMethod>
                   <DigestValue>
             </Reference>
             (<Reference URI="#[keyinfo_Id]">
                   <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                   <DigestMethod>
                   <DigestValue>
             </Reference>)?
             <!-- further references possible, see option 'properties' below -->
      </SignedInfo>
      <SignatureValue>
      (<KeyInfo Id="[keyinfo_id]">)?
      <!-- Object elements possible, see option 'properties' below -->
  </Signature>
</[parent element]>

信封 XML 签名 案例中,支持的 XML 签名结构如下:

<Signature Id="generated_unique_signature_id">
  <SignedInfo>
         <Reference URI="#generated_unique_object_id" type="[optional_type_value]">
               (<Transform>)* <!-- By default "http://www.w3.org/2006/12/xml-c14n11" is added to the transforms -->
               <DigestMethod>
               <DigestValue>
         </Reference>
         (<Reference URI="#[keyinfo_id]">
               <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
               <DigestMethod>
               <DigestValue>
         </Reference>)?
          <!-- further references possible, see option 'properties' below  -->
  </SignedInfo>
  <SignatureValue>
  (<KeyInfo Id="[keyinfo_id]">)?
  <Object Id="generated_unique_object_id"/> <!-- The Object element contains the in-message body; the object ID can either be generated or set by the option parameter "contentObjectId" -->
  <!-- Further Object elements possible, see option 'properties' below -->
</Signature>

自 2.14.0 起,支持通过以下结构 分离的 XML 签名 (请参阅关于已签名元素的子章节 XML 签名):

(<[signed element] Id="[id_value]">
<!-- signed element must have an attribute of type ID -->
      ...

</[signed element]>
<other sibling/>* 
<!-- between the signed element and the corresponding signature element, there can be other siblings.
 Signature element is added as last sibling. -->
<Signature Id="generated_unique_ID">
   <SignedInfo>
      <CanonicalizationMethod>
      <SignatureMethod>
      <Reference URI="#[id_value]" type="[optional_type_value]">
      <!-- reference URI contains the ID attribute value of the signed element -->
            (<Transform>)* <!-- By default "http://www.w3.org/2006/12/xml-c14n11" is added to the transforms -->
            <DigestMethod>
            <DigestValue>
      </Reference>
      (<Reference URI="#[generated_keyinfo_Id]">
            <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <DigestMethod>
            <DigestValue>
      </Reference>)?
   </SignedInfo>
   <SignatureValue>
   (<KeyInfo Id="[generated_keyinfo_id]">)?
</Signature>)+

 

374.2. URI 格式

camel 组件由两个端点组成,它们具有以下 URI 格式:

xmlsecurity:sign:name[?options]
xmlsecurity:verify:name[?options]
  • 使用 signer 端点,您可以为 in-message 的正文生成 XML 签名,该签名可以是 XML 文档或纯文本。信封、信封或分离(自 12.14 个 XML 签名)将设置为 out-message 的正文。
  • 使用验证端点,您可以验证信封或信封或信封 XML 签名,甚至是分离(从 2.14.0 起)XML 签名中包含的 XML 签名;如果验证成功,则原始内容是从 XML 签名中提取,并设置为 out-message 的正文。
  • 用户可以选择 URI 中的 name 部分,以区分 camel 上下文内的不同 signer/verifier 端点。

374.3. 基本示例

以下示例显示了组件的基本用法。

from("direct:enveloping").to("xmlsecurity:sign://enveloping?keyAccessor=#accessor",
                             "xmlsecurity:verify://enveloping?keySelector=#selector",
                             "mock:result")

在 Spring XML 中:

<from uri="direct:enveloping" />
    <to uri="xmlsecurity:sign://enveloping?keyAccessor=#accessor" />
    <to uri="xmlsecurity:verify://enveloping?keySelector=#selector" />
<to uri="mock:result" />

对于签名过程,需要私钥。您可以指定一个提供此私钥的密钥访问者。对于验证,需要对应的公钥;您可以指定一个提供此公钥的密钥选择器为an。

密钥 accessor bean 必须实施 KeyAccessor 接口。软件包 org.apache.camel.component.xmlsecurity.api 包含默认的实施类 DefaultKeyAccessor,它从 Java 密钥存储读取私钥。

key selector bean 必须实施 javax.xml.crypto.KeySelector 接口。软件包 org.apache.camel.component.xmlsecurity.api 包含默认的实施类 DefaultKeySelector,它从密钥存储读取公钥。

在这个示例中,使用默认签名算法 http://www.w3.org/2000/09/xmldsig#rsa-sha1。您可以通过选项 signatureAlgorithm 设置您选择的签名算法(请参阅以下)。签名者端点 会创建一个信封 XML 签名。如果要创建 信封 XML 签名,您必须指定 Signature 元素的父元素;如需更多信息,请参阅 父LocalName 选项。

有关创建 分离的 XML 签名,请参阅子章节 "Detached XML Signatures as Sibling of the Signed Elements"。

374.4. 组件选项

XML 安全组件支持 3 个选项,它们如下所列。

名称描述默认类型

signerConfiguration (advanced)

使用共享的 XmlSignerConfiguration 配置,以用作配置端点的基础。

 

XmlSignerConfiguration

verifierConfiguration (advanced)

使用共享的 XmlVerifierConfiguration 配置,以用作配置端点的基础。

 

XmlVerifier Configuration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

374.5. 端点选项

XML 安全端点使用 URI 语法配置:

xmlsecurity:command:name

使用以下路径和查询参数:

374.5.1. 路径名(2 参数):

名称描述默认类型

命令

必需的 Whether 以签名或验证。

 

XmlCommand

name

需要该 URI 中的 name 部分可以由用户选择,以区分 camel 上下文内的不同 signer/verifier 端点。

 

字符串

374.5.2. 查询参数(35 参数):

名称描述默认类型

baseUri (common)

您可以设置 URI 解引用中使用的基本 URI。然后,相对 URI 与基本 URI 串联。

 

字符串

clearHeaders (common)

确定在签名并验证后是否清除 XML 签名特定标头。默认值为 true。

true

布尔值

cryptoContextProperties (common)

设置加密上下文属性。请参阅链接 XMLCryptoContext#setProperty (String, Object)。在 XMLSignContext a XMLValidateContext 中定义了可能的属性(请参阅支持的属性)。以下属性默认为 XML 验证的值为值#TRUE。如果要关闭这些功能,您必须将属性值设置为 Boolean#FALSE. org.jcp.xml.dsig.validateManifests javax.xml.crypto.cacheReference

 

map

disallowDoctypeDecl (common)

不允许传入的 XML 文档包含 DTD DOCTYPE 声明。默认值为 Boolean#TRUE。

true

布尔值

omitXmlDeclaration (common)

代表传出消息正文中的 XML 声明是否应该被省略。默认值为 false。可以使用标头 XmlSignatureConstants#HEADER_OMIT_XML_DECLARATION 覆盖。

false

布尔值

outputXmlEncoding (common)

生成的签名 XML 文档的字符编码。如果使用 null,则使用原始 XML 文档的编码。

 

字符串

schemaResourceUri (common)

XML Schema 的类路径。在用于决定 ID 属性的分离 XML 签名案例中指定,可以在信封和信封问题单中设置。如果设置,则使用指定的 XML 模式验证 XML 文档。架构资源 URI 可以被标头 XmlSignatureConstants#HEADER_SCHEMA_RESOURCE_URI 覆盖。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

uriDereferencer (advanced)

如果要通过参考 URI 限制远程访问,您可以设置自己的解引用器。可选参数。如果没有设置提供程序默认解引用器,可以使用该引用程序解析 URI 片段、HTTP、文件和 XPpointer URI。注意:实施是供应商依赖的!

 

URIDereferencer

addKeyInfoReference (sign)

为了保护 KeyInfo 元素不受篡改,您可以添加对签名信息元素的引用,以便它通过签名值进行保护。默认值为 true。只有 KeyAccessor 返回的 KeyInfo 和 KeyInfo#getId ()不是 null 时才相关。

true

布尔值

canonicalizationMethod (sign)

在计算摘要前,规范性方法用于规范 SignedInfo 元素。您可以使用 helper 方法 XmlSignatureHelper.getCanonicalizationMethod (字符串算法)或 getCanonicalizationMethod (String 算法,ListinclusiveNamespacePrefixes)来创建规范方法。

http://www.w3.org/TR/2001/REC-xml-c14n-20010315

AlgorithmMethod

contentObjectId (sign)

设置内容对象 Id 属性值。默认情况下会生成 UUID。如果您设置了 null 值,则会生成一个新 UUID。仅在信封问题单中使用。

 

字符串

contentReferenceType (sign)

内容引用的类型。默认值为 null。这个值可以被标头 XmlSignatureConstants#HEADER_CONTENT_REFERENCE_TYPE 覆盖。

 

字符串

contentReferenceUri (sign)

要签名的内容的参考 URI。仅在信封案例中使用。如果引用 URI 包含 ID 属性值,则还必须设置资源 schema URI ( setSchemaResourceUri (String)),因为 schema 验证器将找到哪个属性是 ID 属性。在信封或分离的情况下将被忽略。

 

字符串

digestAlgorithm (sign)

摘要算法 URI。可选参数。此摘要算法用于计算输入消息摘要。如果没有指定此摘要算法,则从签名算法计算摘要算法。示例: http://www.w3.org/2001/04/xmlenc#sha256

 

字符串

keyAccessor (sign)

对于签名过程,需要私钥。您可以指定一个提供此私钥的密钥访问者。密钥 accessor bean 必须实施 KeyAccessor 接口。软件包 org.apache.camel.component.xmlsecurity.api 包含默认的实施类 DefaultKeyAccessor,它从 Java 密钥存储读取私钥。

 

KeyAccessor

parentLocalName (sign)

将添加 XML 签名元素的父元素的本地名称。仅与信封 XML 签名相关。另外,您还可以使用 setParentXpath (XPathFilterParameterSpec)。默认值为 null。该值必须为 null,以用于信封和分离 XML 签名。用于 enveloped signature 的此参数或参数 setParentXpath (XPathFilterParameterSpec)和参数 setXpathsToIdAttributes (List)不能在同一个配置中设置。如果在同一配置中指定了参数 parentXpath 和 parentLocalName,则会抛出异常。

 

字符串

parentNamespace (sign)

添加 XML 签名元素的父元素的命名空间。

 

字符串

parentXpath (sign)

在信封问题单中设置 XPath 以查找父节点。您可以通过此方法或父项的本地名称和命名空间来指定父节点,方法为 setParentLocalName (String)和 setParentNamespace (String)。默认值为 null。该值必须为 null,以用于信封和分离 XML 签名。如果在同一配置中指定了参数 parentXpath 和 parentLocalName,则会抛出异常。

 

XPathFilterParameter Spec

plainText (sign)

指示邮件正文是否包含纯文本。默认值为 false,表示邮件正文包含 XML。该值可以被标头 XmlSignatureConstants#HEADER_MESSAGE_IS_PLAIN_TEXT 覆盖。

false

布尔值

plainTextEncoding (sign)

纯文本编码。只有消息正文为纯文本时(请参阅参数 plainText)相关。默认值为 UTF-8。

UTF-8

字符串

prefixForXmlSignature Namespace (sign)

XML 签名命名空间 http://www.w3.org/2000/09/xmldsig# 的命名空间前缀。默认值为 ds。如果设置了 null 或空值,则不会将前缀用于 XML 签名命名空间。查看最佳实践 http://www.w3.org/TR/xmldsig-bestpractices/#signing-xml- without-namespaces

ds

字符串

属性 (签名)

要在包含额外属性的 XML 签名中添加额外参考和对象,您可以提供一个实现 XmlSignatureProperties 接口的 bean。

 

XmlSignatureProperties

signatureAlgorithm (sign)

签名算法.默认值为 http://www.w3.org/2000/09/xmldsig#rsa-sha1

http://www.w3.org/2000/09/xmldsig#rsa-sha1

字符串

signatureId (sign)

设置签名 Id。如果没有设置此参数(null 值),则会为签名 ID (默认)生成唯一的 ID。如果此参数设为 (空字符串),则在签名元素中不会创建 Id 属性。

 

字符串

transformMethods (sign)

在计算摘要之前,在消息正文上执行的转换。默认情况下,添加了 C14n,如果被信封签名(请参阅选项父LocalName)也会在列表的位置 0 中添加了。http://www.w3.org/2000/09/xmldsig#enveloped-signature使用 XmlSignatureHelper 中的方法创建转换方法。

 

list

xpathsToIdAttributes (sign)

通过 XPATH 表达式,定义在分离中签署的元素到 ID 属性(类型为 ID 的attributes)。对于通过 XPATH 表达式找到的每个元素,会创建分离的签名,其引用 URI 包含对应的属性值(由 '#' 提供)。签名会成为签名元素的最后同级。层次层次层次的元素首先进行签名。您还可以通过标头 XmlSignatureConstants#HEADER_XPATHS_TO_ID_ATTRIBUTES 动态设置 XPATH 列表。适用于 enveloped 签名的参数 setParentLocalName (String)或 setParentXpath (XPathFilterParameterSpec),且不得在同一配置中设置用于分离的签名参数。

 

list

keySelector (verify)

提供验证 XML 签名的密钥。

 

KeySelector

outputNodeSearch (verify)

设置输出节点搜索值,用于从 XML 签名文档确定节点,这些文档应设置为输出消息正文。值的类取决于输出节点搜索的类型。输出节点搜索转发到 XmlSignature2Message。

 

字符串

outputNodeSearchType (verify)

决定用于决定输出消息正文输出节点的搜索类型。请参阅 setOutputNodeSearch (Object)。您可以在 DefaultXmlSignature2Message 中找到支持的默认搜索类型。

默认

字符串

removeSignatureElements (verify)

指示 XML 签名元素(带有本地名称签名和名称sapce http://www.w3.org/2000/09/xmldsig#的元素)是否应该从设置为输出消息的文档中删除。通常,这只被信任 XML 签名。默认值为 Boolean#FALSE。此参数转发到 XmlSignature2Message。如果输出节点搜索类型是 DefaultXmlSignature2Message#OUTPUT_NODE_SEARCH_TYPE_DEFAULT.F

false

布尔值

secureValidation (verify)

启用安全验证。如果为 true,则启用了安全验证。

true

布尔值

validationFailedHandler (verify)

处理不同的验证失败情况。默认实施会引发不同情况的特定例外(所有例外的软件包名称 org.apache.camel.component.xmlsecurity.api,是 XmlSignatureInvalidException 的子类。如果签名值验证失败,则将引发 XmlSignatureInvalidValueException。如果引用验证失败,则引发 XmlSignatureInvalidContentHashException。如需更多信息,请参阅 JavaDoc。

 

ValidationFailedHandler

xmlSignature2Message (verify)

在验证后将 XML 签名映射到 output-message 的 bean。该映射应如何通过选项 outputNodeSearchType、outputNodeSearch 和 removeSignatureElements 进行配置。默认实现提供三种可能,它们与三个输出节点搜索类型 Default、ElementName 和 XPath 相关。默认实现决定节点被序列化,然后设置为输出消息的正文(如果搜索类型为 ElementName),则输出节点(在本例中为某一元素)由搜索值中定义的本地名称和命名空间(请参阅输出输出NodeSearch)决定。如果搜索类型是 XPath,则输出节点由搜索值中指定的 XPath 决定(本例中为输出节点可以是 Element, TextNode 或 Document)。如果输出节点搜索类型是 Default,则应用以下规则: 在信封 XML 签名案例中(使用 URI= 的引用并转换 http://www.w3.org/2000/09/xmldsig#enveloped-signature),没有 Signature 元素的传入 XML 文档设置为输出消息正文。在非envoped XML 签名案例中,消息正文从引用的对象决定 ; 在输出节点确定"Enveloping XML 签名案例"章节中对此进行了详细阐述。

 

XmlSignature2Message

xmlSignatureChecker (verify)

此接口允许应用程序在验证执行前检查 XML 签名。建议在 http://www.w3.org/TR/xmldsig-bestpractices/#check-what-is-signed中使用这个步骤

 

XmlSignatureChecker

374.6. Spring Boot Auto-Configuration

组件支持 63 选项,它们如下所列。

名称描述默认类型

camel.component.xmlsecurity.enabled

启用 xmlsecurity 组件

true

布尔值

camel.component.xmlsecurity.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.xmlsecurity.signer-configuration.add-key-info-reference

为了保护 KeyInfo 元素不受篡改,您可以添加对签名信息元素的引用,以便它通过签名值进行保护。默认值为 true。只有 KeyAccessor 返回的 KeyInfo 和 KeyInfo#getId ()不是 null 时才相关。

true

布尔值

camel.component.xmlsecurity.signer-configuration.base-uri

您可以设置 URI 解引用中使用的基本 URI。然后,相对 URI 与基本 URI 串联。

 

字符串

camel.component.xmlsecurity.signer-configuration.canonicalization-method

在计算摘要前,规范性方法用于规范 SignedInfo 元素。您可以使用 helper 方法 XmlSignatureHelper.getCanonicalizationMethod (字符串算法)或 getCanonicalizationMethod (String 算法,ListinclusiveNamespacePrefixes)来创建规范方法。

 

AlgorithmMethod

camel.component.xmlsecurity.signer-configuration.canonicalization-method-name

  

字符串

camel.component.xmlsecurity.signer-configuration.clear-headers

确定在签名并验证后是否清除 XML 签名特定标头。默认值为 true。

true

布尔值

camel.component.xmlsecurity.signer-configuration.content-object-id

设置内容对象 Id 属性值。默认情况下会生成 UUID。如果您设置了 null 值,则会生成一个新 UUID。仅在信封问题单中使用。

 

字符串

camel.component.xmlsecurity.signer-configuration.content-reference-type

内容引用的类型。默认值为 null。这个值可以被标头 XmlSignatureConstants#HEADER_CONTENT_REFERENCE_TYPE 覆盖。

 

字符串

camel.component.xmlsecurity.signer-configuration.content-reference-uri

要签名的内容的参考 URI。仅在信封案例中使用。如果引用 URI 包含 ID 属性值,则还必须设置资源 schema URI ( setSchemaResourceUri (String)),因为 schema 验证器将找到哪个属性是 ID 属性。在信封或分离的情况下将被忽略。

 

字符串

camel.component.xmlsecurity.signer-configuration.crypto-context-properties

设置加密上下文属性。请参阅链接 XMLCryptoContext#setProperty (String, Object)。在 XMLSignContext a XMLValidateContext 中定义了可能的属性(请参阅支持的属性)。以下属性默认为 XML 验证的值为值#TRUE。如果要关闭这些功能,您必须将属性值设置为 Boolean#FALSE. org.jcp.xml.dsig.validateManifests javax.xml.crypto.cacheReference

 

map

camel.component.xmlsecurity.signer-configuration.digest-algorithm

摘要算法 URI。可选参数。此摘要算法用于计算输入消息摘要。如果没有指定此摘要算法,则从签名算法计算摘要算法。示例: http://www.w3.org/2001/04/xmlenc#sha256

 

字符串

camel.component.xmlsecurity.signer-configuration.disallow-doctype-decl

不允许传入的 XML 文档包含 DTD DOCTYPE 声明。默认值为 Boolean#TRUE。

true

布尔值

camel.component.xmlsecurity.signer-configuration.key-accessor

对于签名过程,需要私钥。您可以指定一个提供此私钥的密钥访问者。密钥 accessor bean 必须实施 KeyAccessor 接口。软件包 org.apache.camel.component.xmlsecurity.api 包含默认的实施类 DefaultKeyAccessor,它从 Java 密钥存储读取私钥。

 

KeyAccessor

camel.component.xmlsecurity.signer-configuration.key-accessor-name

  

字符串

camel.component.xmlsecurity.signer-configuration.omit-xml-declaration

代表传出消息正文中的 XML 声明是否应该被省略。默认值为 false。可以使用标头 XmlSignatureConstants#HEADER_OMIT_XML_DECLARATION 覆盖。

false

布尔值

camel.component.xmlsecurity.signer-configuration.output-xml-encoding

生成的签名 XML 文档的字符编码。如果使用 null,则使用原始 XML 文档的编码。

 

字符串

camel.component.xmlsecurity.signer-configuration.parent-local-name

将添加 XML 签名元素的父元素的本地名称。仅与信封 XML 签名相关。另外,您还可以使用 setParentXpath (XPathFilterParameterSpec)。默认值为 null。该值必须为 null,以用于信封和分离 XML 签名。用于 enveloped signature 的此参数或参数 setParentXpath (XPathFilterParameterSpec)和参数 setXpathsToIdAttributes (List)不能在同一个配置中设置。如果在同一配置中指定了参数 parentXpath 和 parentLocalName,则会抛出异常。

 

字符串

camel.component.xmlsecurity.signer-configuration.parent-namespace

添加 XML 签名元素的父元素的命名空间。

 

字符串

camel.component.xmlsecurity.signer-configuration.parent-xpath

在信封问题单中设置 XPath 以查找父节点。您可以通过此方法或父项的本地名称和命名空间来指定父节点,方法为 setParentLocalName (String)和 setParentNamespace (String)。默认值为 null。该值必须为 null,以用于信封和分离 XML 签名。如果在同一配置中指定了参数 parentXpath 和 parentLocalName,则会抛出异常。

 

XPathFilterParameter Spec

camel.component.xmlsecurity.signer-configuration.plain-text

指示邮件正文是否包含纯文本。默认值为 false,表示邮件正文包含 XML。该值可以被标头 XmlSignatureConstants#HEADER_MESSAGE_IS_PLAIN_TEXT 覆盖。

false

布尔值

camel.component.xmlsecurity.signer-configuration.plain-text-encoding

纯文本编码。只有消息正文为纯文本时(请参阅参数 plainText)相关。默认值为 UTF-8。

UTF-8

字符串

camel.component.xmlsecurity.signer-configuration.prefix-for-xml-signature-namespace

XML 签名命名空间 http://www.w3.org/2000/09/xmldsig# 的命名空间前缀。默认值为 ds。如果设置了 null 或空值,则不会将前缀用于 XML 签名命名空间。查看最佳实践 http://www.w3.org/TR/xmldsig-bestpractices/#signing-xml- without-namespaces

ds

字符串

camel.component.xmlsecurity.signer-configuration.properties

要在包含额外属性的 XML 签名中添加额外参考和对象,您可以提供一个实现 XmlSignatureProperties 接口的 bean。

 

XmlSignatureProperties

camel.component.xmlsecurity.signer-configuration.properties-name

  

字符串

camel.component.xmlsecurity.signer-configuration.schema-resource-uri

XML Schema 的类路径。在用于决定 ID 属性的分离 XML 签名案例中指定,可以在信封和信封问题单中设置。如果设置,则使用指定的 XML 模式验证 XML 文档。架构资源 URI 可以被标头 XmlSignatureConstants#HEADER_SCHEMA_RESOURCE_URI 覆盖。

 

字符串

camel.component.xmlsecurity.signer-configuration.signature-algorithm

签名算法.默认值为 http://www.w3.org/2000/09/xmldsig#rsa-sha1

http://www.w3.org/2000/09/xmldsig#rsa-sha1

字符串

camel.component.xmlsecurity.signer-configuration.signature-id

设置签名 Id。如果没有设置此参数(null 值),则会为签名 ID (默认)生成唯一的 ID。如果此参数设为 (空字符串),则在签名元素中不会创建 Id 属性。

 

字符串

camel.component.xmlsecurity.signer-configuration.transform-methods

在计算摘要之前,在消息正文上执行的转换。默认情况下,添加了 C14n,如果被信封签名(请参阅选项父LocalName)也会在列表的位置 0 中添加了。http://www.w3.org/2000/09/xmldsig#enveloped-signature使用 XmlSignatureHelper 中的方法创建转换方法。

 

list

camel.component.xmlsecurity.signer-configuration.transform-methods-name

  

字符串

camel.component.xmlsecurity.signer-configuration.uri-dereferencer

如果要通过参考 URI 限制远程访问,您可以设置自己的解引用器。可选参数。如果没有设置提供程序默认解引用器,可以使用该引用程序解析 URI 片段、HTTP、文件和 XPpointer URI。注意:实施是供应商依赖的!

 

URIDereferencer

camel.component.xmlsecurity.signer-configuration.xpaths-to-id-attributes

通过 XPATH 表达式,定义在分离中签署的元素到 ID 属性(类型为 ID 的attributes)。对于通过 XPATH 表达式找到的每个元素,会创建分离的签名,其引用 URI 包含对应的属性值(由 '#' 提供)。签名会成为签名元素的最后同级。层次层次层次的元素首先进行签名。您还可以通过标头 XmlSignatureConstants#HEADER_XPATHS_TO_ID_ATTRIBUTES 动态设置 XPATH 列表。适用于 enveloped 签名的参数 setParentLocalName (String)或 setParentXpath (XPathFilterParameterSpec),且不得在同一配置中设置用于分离的签名参数。

 

list

camel.component.xmlsecurity.verifier-configuration.base-uri

您可以设置 URI 解引用中使用的基本 URI。然后,相对 URI 与基本 URI 串联。

 

字符串

camel.component.xmlsecurity.verifier-configuration.clear-headers

确定在签名并验证后是否清除 XML 签名特定标头。默认值为 true。

true

布尔值

camel.component.xmlsecurity.verifier-configuration.crypto-context-properties

设置加密上下文属性。请参阅链接 XMLCryptoContext#setProperty (String, Object)。在 XMLSignContext a XMLValidateContext 中定义了可能的属性(请参阅支持的属性)。以下属性默认为 XML 验证的值为值#TRUE。如果要关闭这些功能,您必须将属性值设置为 Boolean#FALSE. org.jcp.xml.dsig.validateManifests javax.xml.crypto.cacheReference

 

map

camel.component.xmlsecurity.verifier-configuration.disallow-doctype-decl

不允许传入的 XML 文档包含 DTD DOCTYPE 声明。默认值为 Boolean#TRUE。

true

布尔值

camel.component.xmlsecurity.verifier-configuration.key-selector

提供验证 XML 签名的密钥。

 

KeySelector

camel.component.xmlsecurity.verifier-configuration.omit-xml-declaration

代表传出消息正文中的 XML 声明是否应该被省略。默认值为 false。可以使用标头 XmlSignatureConstants#HEADER_OMIT_XML_DECLARATION 覆盖。

false

布尔值

camel.component.xmlsecurity.verifier-configuration.output-node-search

设置输出节点搜索值,用于从 XML 签名文档确定节点,这些文档应设置为输出消息正文。值的类取决于输出节点搜索的类型。输出节点搜索转发到 XmlSignature2Message。

 

对象

camel.component.xmlsecurity.verifier-configuration.output-node-search-type

决定用于决定输出消息正文输出节点的搜索类型。请参阅 setOutputNodeSearch (Object)。您可以在 DefaultXmlSignature2Message 中找到支持的默认搜索类型。

默认

字符串

camel.component.xmlsecurity.verifier-configuration.output-xml-encoding

生成的签名 XML 文档的字符编码。如果使用 null,则使用原始 XML 文档的编码。

 

字符串

camel.component.xmlsecurity.verifier-configuration.remove-signature-elements

指示 XML 签名元素(带有本地名称签名和名称sapce http://www.w3.org/2000/09/xmldsig#的元素)是否应该从设置为输出消息的文档中删除。通常,这只被信任 XML 签名。默认值为 Boolean#FALSE。此参数转发到 XmlSignature2Message。如果输出节点搜索类型是 DefaultXmlSignature2Message#OUTPUT_NODE_SEARCH_TYPE_DEFAULT.F

false

布尔值

camel.component.xmlsecurity.verifier-configuration.schema-resource-uri

XML Schema 的类路径。在用于决定 ID 属性的分离 XML 签名案例中指定,可以在信封和信封问题单中设置。如果设置,则使用指定的 XML 模式验证 XML 文档。架构资源 URI 可以被标头 XmlSignatureConstants#HEADER_SCHEMA_RESOURCE_URI 覆盖。

 

字符串

camel.component.xmlsecurity.verifier-configuration.secure-validation

启用安全验证。如果为 true,则启用了安全验证。

true

布尔值

camel.component.xmlsecurity.verifier-configuration.uri-dereferencer

如果要通过参考 URI 限制远程访问,您可以设置自己的解引用器。可选参数。如果没有设置提供程序默认解引用器,可以使用该引用程序解析 URI 片段、HTTP、文件和 XPpointer URI。注意:实施是供应商依赖的!

 

URIDereferencer

camel.component.xmlsecurity.verifier-configuration.validation-failed-handler

处理不同的验证失败情况。默认实施会引发不同情况的特定例外(所有例外的软件包名称 org.apache.camel.component.xmlsecurity.api,是 XmlSignatureInvalidException 的子类。如果签名值验证失败,则将引发 XmlSignatureInvalidValueException。如果引用验证失败,则引发 XmlSignatureInvalidContentHashException。如需更多信息,请参阅 JavaDoc。

 

ValidationFailedHandler

camel.component.xmlsecurity.verifier-configuration.validation-failed-handler-name

@param validationFailedHandlerName 的处理程序名称

 

字符串

camel.component.xmlsecurity.verifier-configuration.xml-signature-checker

此接口允许应用程序在验证执行前检查 XML 签名。建议在 http://www.w3.org/TR/xmldsig-bestpractices/#check-what-is-signed中使用这个步骤

 

XmlSignatureChecker

camel.component.xmlsecurity.verifier-configuration.xml-signature2-message

在验证后将 XML 签名映射到 output-message 的 bean。该映射应如何通过选项 outputNodeSearchType、outputNodeSearch 和 removeSignatureElements 进行配置。默认实现提供三种可能,它们与三个输出节点搜索类型 Default、ElementName 和 XPath 相关。默认实现决定节点被序列化,然后设置为输出消息的正文(如果搜索类型为 ElementName),则输出节点(在本例中为某一元素)由搜索值中定义的本地名称和命名空间(请参阅输出输出NodeSearch)决定。如果搜索类型是 XPath,则输出节点由搜索值中指定的 XPath 决定(本例中为输出节点可以是 Element, TextNode 或 Document)。如果输出节点搜索类型是 Default,则应用以下规则: 在信封 XML 签名案例中(使用 URI= 的引用并转换 http://www.w3.org/2000/09/xmldsig#enveloped-signature),没有 Signature 元素的传入 XML 文档设置为输出消息正文。在非envoped XML 签名案例中,消息正文从引用的对象决定 ; 在输出节点确定"Enveloping XML 签名案例"章节中对此进行了详细阐述。

 

XmlSignature2Message

camel.dataformat.securexml.add-key-value-for-encrypted-key

是否在 EncryptedKey 结构中将用于加密会话密钥的公钥添加为 KeyValue。

true

布尔值

camel.dataformat.securexml.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.securexml.digest-algorithm

与 RSA OAEP 算法一起使用的摘要算法。可用的选择有: XMLCipher.SHA1 XMLCipher.SHA256 XMLCipher.SHA512 的默认值为 XMLCipher.SHA1

SHA1

字符串

camel.dataformat.securexml.enabled

启用 securexml dataformat

true

布尔值

camel.dataformat.securexml.key-cipher-algorithm

用于非对称密钥加密/解密的密码算法。可用的选择有: XMLCipher.RSA_v1dot5 XMLCipher.RSA_OAEPCipher.RSA_OAEP_11 默认值为 XMLCipher.RSA_OAEP

RSA_OAEP

字符串

camel.dataformat.securexml.key-or-trust-store-parameters-id

请参考 registry 中的 KeyStore 实例,它用于创建和加载一个代表发件人的信任Store 或收件人的 keyStore 实例的 KeyStore 实例。

 

字符串

camel.dataformat.securexml.key-password

用于从 KeyStore 检索私钥的密码。这个密钥用于非对称解密。

 

字符串

camel.dataformat.securexml.mgf-algorithm

与 RSA OAEP 算法一起使用的 MGF Algorithm。可用的选择有: EncryptionConstants.MGF1_SHA1 EncryptionConstants.MGF1_SHA256 EncryptionConstants.MGF1_SHA512 的默认值为 EncryptionConstants.MGF1_SHA1

MGF1_SHA1

字符串

camel.dataformat.securexml.pass-phrase

用于加密/解密内容的 passPhrase 的字符串。必须提供 passPhrase。如果没有指定 passPhrase,则使用默认的 passPhrase。passPhrase 需要与相应的加密算法结合使用。例如,使用 TRIPLEDES Phase 只能是一个 24 Byte 键

 

字符串

camel.dataformat.securexml.pass-phrase-byte

字节用作加密/解密内容的 passPhrase。必须提供 passPhrase。如果没有指定 passPhrase,则使用默认的 passPhrase。passPhrase 需要与相应的加密算法结合使用。例如,使用 TRIPLEDES Phase 只能是一个 24 Byte 键

 

Byte[]

camel.dataformat.securexml.recipient-key-alias

在执行非对称密钥加密或解密时,用于从 KeyStore 检索接收者公钥或私钥时所使用的密钥别名。

 

字符串

camel.dataformat.securexml.secure-tag

XPath 引用为加密/解密选择的 XML 元素。如果没有指定标签,则整个有效负载都会被加密/解密。

 

字符串

camel.dataformat.securexml.secure-tag-contents

一个布尔值,用于指定 XML 元素是否被加密,或者 XML Element false = Element Level true = Element Content Level

false

布尔值

camel.dataformat.securexml.xml-cipher-algorithm

用于加密/解密 XML 消息内容的密码算法。可用选择包括: xmlCipher.TRIPLEDES XMLCipher.AES_128 XMLCipher.AES_128_GCM XMLCipher.AES_192 XMLCipher.AES_192_GCM XMLCipher.AES_256 XMLCipher.AES_256_GCM XMLCipher.SEED_128 XMLCipher.AES_192 XMLCipher. .CAMELLIA_128 XMLCipher.CAMELLIA_192 XMLCipher.CAMELLIA_256 的默认值为 MLCipher.TRIPLEDES

TRIPLEDES

字符串

374.6.1. 输出节点确定在 Enveloping XML 签名问题单中

在从 XML 签名文档中提取节点验证后,该文档最终返回到 output-message 正文。在信封 XML 签名案例中,默认的实施 DefaultXmlSignature2Message of XmlSignature2Message 对节点搜索类型 Default 进行了这一操作(请参阅选项 xmlSignature2Message):

  • 首先决定对象引用:

    • 帐户只考虑相同的文档参考(URI 必须以 #开始)
    • 另外,将考虑通过清单对对象进行间接相同的文档引用。
    • 由此产生的对象引用数量必须是 1。
  • 然后,对象会被解引用,对象必须仅包含一个 XML 元素。此元素返回为输出节点。

这意味着,信封 XML 签名必须采用以下结构:

<Signature>
      <SignedInfo>
         <Reference URI="#object"/>
         <!-- further references possible but they must not point to an Object or Manifest containing an object reference -->
         ...
      </SignedInfo>

      <Object Id="object">
           <!-- contains one XML element which is extracted to the message body -->
      <Object>
      <!-- further object elements possible which are not referenced-->
      ...
      (<KeyInfo>)?
</Signature>

或结构:

<Signature>
      <SignedInfo>
         <Reference URI="#manifest"/>
         <!-- further references  are possible but they must not point to an Object or other manifest containing an object reference -->
         ...
      </SignedInfo>

      <Object >
         <Manifest Id="manifest">
            <Reference URI=#object/>
         </Manifest>
      </Objet>
      <Object Id="object">
          <!-- contains the DOM node which is extracted to the message body -->
      </Object>
       <!-- further object elements possible which are not referenced -->
      ...
      (<KeyInfo>)?
</Signature>

374.7. 分离的 XML 签名作为签名元素的 Siblings

Since 2.14.0

您可以创建分离的签名,其中签名是签名元素的同级签名。以下示例包含两个分离的签名。第一个签名用于 C 元素,第二个签名是元素 A。签名被 嵌套 ;第二个签名是包括第一个签名的元素 A

分离 XML 签名示例

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <A ID="IDforA">
        <B>
            <C ID="IDforC">
                <D>dvalue</D>
            </C>
            <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                Id="_6bf13099-0568-4d76-8649-faf5dcb313c0">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod
                        Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
                    <ds:SignatureMethod
                        Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
                    <ds:Reference URI="#IDforC">
                        ...
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>aUDFmiG71</ds:SignatureValue>
            </ds:Signature>
        </B>
    </A>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"Id="_6b02fb8a-30df-42c6-ba25-76eba02c8214">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod
                Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
            <ds:SignatureMethod
                Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
            <ds:Reference URI="#IDforA">
                ...
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>q3tvRoGgc8cMUqUSzP6C21zb7tt04riPnDuk=</ds:SignatureValue>
    </ds:Signature>
<root>

示例中显示您可以签署多个元素,每个元素都会创建一个签名,作为同级的。要签名的元素必须具有类型为 ID 的属性。该属性的 ID 类型必须在 XML 架构中定义(请参阅 模式ResourceUri)。 您可以指定 XPATH 表达式列表,指向类型 ID 的属性(请参阅选项 xpathsToIdAttributes)。这些属性决定了要签名的元素。元素由 keyAccessor bean 提供的同一密钥签名。层次结构级别较高(即更深入)的元素首先进行签名。在示例中,元素 C 在元素 A 之前签名。

Java DSL 示例

from("direct:detached")
  .to("xmlsecurity:sign://detached?keyAccessor=#keyAccessorBeant&xpathsToIdAttributes=#xpathsToIdAttributesBean&schemaResourceUri=Test.xsd")
  .to("xmlsecurity:verify://detached?keySelector=#keySelectorBean&schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd")
  .to("mock:result");

Spring 示例

   
<bean id="xpathsToIdAttributesBean" class="java.util.ArrayList">
      <constructor-arg type="java.util.Collection">
          <list>
              <bean
                  class="org.apache.camel.component.xmlsecurity.api.XmlSignatureHelper"
                  factory-method="getXpathFilter">
                  <constructor-arg type="java.lang.String"
                      value="/ns:root/a/@ID" />
                  <constructor-arg>
                      <map key-type="java.lang.String" value-type="java.lang.String">
                          <entry key="ns" value="http://test" />
                      </map>
                  </constructor-arg>
              </bean>
          </list>
      </constructor-arg>
  </bean>
...
 <from uri="direct:detached" />
      <to
          uri="xmlsecurity:sign://detached?keyAccessor=#keyAccessorBean&amp;xpathsToIdAttributes=#xpathsToIdAttributesBean&amp;schemaResourceUri=Test.xsd" />
      <to
          uri="xmlsecurity:verify://detached?keySelector=#keySelectorBean&amp;schemaResourceUri=Test.xsd" />
      <to uri="mock:result" />

374.8. Signer 端点的 XAdES-BES/EPES

作为 Camel 2.15.0 可用 

XML 高级电子签名(XAdES) 定义对 XML 签名的扩展。该标准由 欧洲电信标准研究机构 定义,它允许您创建符合 电子签名社区框架的欧盟直接(1999/93/EC)的签名。XAdES 定义不同的签名属性集合,这些属性称为签名表单。我们支持签名表格 Basic Electronic Signature (XAdES-BES)和 Explicit Policy Based Electronic Signature (XAdES-EPES)。不支持具有 Validation Data XAdES-T 和 XAdES-C 的电子请求签名 。 

我们支持 XAdES-EPES 表单的以下属性("是否表示零或一个"):

支持的 XAdES-EPES 属性

<QualifyingProperties Target>
    <SignedProperties>
        <SignedSignatureProperties>
            (SigningTime)?
            (SigningCertificate)?
            (SignaturePolicyIdentifier)
            (SignatureProductionPlace)?
            (SignerRole)?
        </SignedSignatureProperties>
        <SignedDataObjectProperties>
            (DataObjectFormat)?
            (CommitmentTypeIndication)?
        </SignedDataObjectProperties>
    </SignedProperties>
</QualifyingProperties>

XAdES-BES 表单的属性相同,但 SignaturePolicyIdentifier 属性不是 XAdES-BES 的一部分。 

您可以通过 bean org.apache.camel.component.xmlsecurity.api.XAdESSignatureProperties 或 org.apache.camel.component.xmlsecurity.api.DefaultXAdESSignatureProperties 配置 XAdES-BES/EPES 属性。XAdESSignatureProperties 不支持上述所有属性,但 SigningCertificate 属性除外。要获取 SigningCertificate 属性,您必须覆盖 XAdESSignatureProperties.getSigningCertificate ()XAdESSignatureProperties.getSigningCertificateChain () 方法。 类 DefaultXAdESSignatureProperties 覆盖方法 getSigningCertificate () ,并允许您通过密钥存储和别名指定签名证书。以下示例显示了您可以指定的所有参数。如果不需要某些参数,您可以只省略它们。

Java DSL 中的 XAdES-BES/EPES 示例

 Keystore keystore = ... // load a keystore
DefaultKeyAccessor accessor = new DefaultKeyAccessor();
accessor.setKeyStore(keystore);
accessor.setPassword("password");
accessor.setAlias("cert_alias"); // signer key alias
 
DefaultXAdESSignatureProperties props = new DefaultXAdESSignatureProperties();
props.setNamespace("http://uri.etsi.org/01903/v1.3.2#"); // sets the namespace for the XAdES elements; the namspace is related to the XAdES version, default value is "http://uri.etsi.org/01903/v1.3.2#", other possible values are "http://uri.etsi.org/01903/v1.1.1#" and "http://uri.etsi.org/01903/v1.2.2#"
props.setPrefix("etsi"); // sets the prefix for the XAdES elements, default value is "etsi"
 
// signing certificate
props.setKeystore(keystore));
props.setAlias("cert_alias"); // specify the alias of the signing certificate in the keystore = signer key alias
props.setDigestAlgorithmForSigningCertificate(DigestMethod.SHA256); // possible values for the algorithm are "http://www.w3.org/2000/09/xmldsig#sha1", "http://www.w3.org/2001/04/xmlenc#sha256", "http://www.w3.org/2001/04/xmldsig-more#sha384", "http://www.w3.org/2001/04/xmlenc#sha512", default value is "http://www.w3.org/2001/04/xmlenc#sha256"
props.setSigningCertificateURIs(Collections.singletonList("http://certuri"));
 
// signing time
props.setAddSigningTime(true);
 
// policy
props.setSignaturePolicy(XAdESSignatureProperties.SIG_POLICY_EXPLICIT_ID);
// also the values XAdESSignatureProperties.SIG_POLICY_NONE ("None"), and XAdESSignatureProperties.SIG_POLICY_IMPLIED ("Implied")are possible, default value is XAdESSignatureProperties.SIG_POLICY_EXPLICIT_ID ("ExplicitId")
// For "None" and "Implied" you must not specify any further policy parameters
props.setSigPolicyId("urn:oid:1.2.840.113549.1.9.16.6.1");
props.setSigPolicyIdQualifier("OIDAsURN"); //allowed values are empty string, "OIDAsURI", "OIDAsURN"; default value is empty string
props.setSigPolicyIdDescription("invoice version 3.1");
props.setSignaturePolicyDigestAlgorithm(DigestMethod.SHA256);// possible values for the algorithm are "http://www.w3.org/2000/09/xmldsig#sha1", http://www.w3.org/2001/04/xmlenc#sha256", "http://www.w3.org/2001/04/xmldsig-more#sha384", "http://www.w3.org/2001/04/xmlenc#sha512", default value is http://www.w3.org/2001/04/xmlenc#sha256"
props.setSignaturePolicyDigestValue("Ohixl6upD6av8N7pEvDABhEL6hM=");
// you can add  qualifiers for the signature policy either by specifying text or an XML fragment with the root element "SigPolicyQualifier"
props.setSigPolicyQualifiers(Arrays
    .asList(new String[] {
        "<SigPolicyQualifier xmlns=\"http://uri.etsi.org/01903/v1.3.2#\"><SPURI>http://test.com/sig.policy.pdf</SPURI><SPUserNotice><ExplicitText>display text</ExplicitText>"
            + "</SPUserNotice></SigPolicyQualifier>", "category B" }));
props.setSigPolicyIdDocumentationReferences(Arrays.asList(new String[] {"http://test.com/policy.doc.ref1.txt",
    "http://test.com/policy.doc.ref2.txt" }));
 
// production place
props.setSignatureProductionPlaceCity("Munich");
props.setSignatureProductionPlaceCountryName("Germany");
props.setSignatureProductionPlacePostalCode("80331");
props.setSignatureProductionPlaceStateOrProvince("Bavaria");
 
//role
// you can add claimed roles either by specifying text or an XML fragment with the root element "ClaimedRole"
props.setSignerClaimedRoles(Arrays.asList(new String[] {"test",
    "<a:ClaimedRole xmlns:a=\"http://uri.etsi.org/01903/v1.3.2#\"><TestRole>TestRole</TestRole></a:ClaimedRole>" }));
props.setSignerCertifiedRoles(Collections.singletonList(new XAdESEncapsulatedPKIData("Ahixl6upD6av8N7pEvDABhEL6hM=",
    "http://uri.etsi.org/01903/v1.2.2#DER", "IdCertifiedRole")));
 
// data object format
props.setDataObjectFormatDescription("invoice");
props.setDataObjectFormatMimeType("text/xml");
props.setDataObjectFormatIdentifier("urn:oid:1.2.840.113549.1.9.16.6.2");
props.setDataObjectFormatIdentifierQualifier("OIDAsURN"); //allowed values are empty string, "OIDAsURI", "OIDAsURN"; default value is empty string
props.setDataObjectFormatIdentifierDescription("identifier desc");
props.setDataObjectFormatIdentifierDocumentationReferences(Arrays.asList(new String[] {
    "http://test.com/dataobject.format.doc.ref1.txt", "http://test.com/dataobject.format.doc.ref2.txt" }));
 
//commitment
props.setCommitmentTypeId("urn:oid:1.2.840.113549.1.9.16.6.4");
props.setCommitmentTypeIdQualifier("OIDAsURN"); //allowed values are empty string, "OIDAsURI", "OIDAsURN"; default value is empty string
props.setCommitmentTypeIdDescription("description for commitment type ID");
props.setCommitmentTypeIdDocumentationReferences(Arrays.asList(new String[] {"http://test.com/commitment.ref1.txt",
    "http://test.com/commitment.ref2.txt" }));
// you can specify a commitment type qualifier either by simple text or an XML fragment with root element "CommitmentTypeQualifier"
props.setCommitmentTypeQualifiers(Arrays.asList(new String[] {"commitment qualifier",
    "<c:CommitmentTypeQualifier xmlns:c=\"http://uri.etsi.org/01903/v1.3.2#\"><C>c</C></c:CommitmentTypeQualifier>" }));
 
beanRegistry.bind("xmlSignatureProperties",props);
beanRegistry.bind("keyAccessorDefault",keyAccessor);
 
// you must reference the properties bean in the "xmlsecurity" URI
from("direct:xades").to("xmlsecurity:sign://xades?keyAccessor=#keyAccessorDefault&properties=#xmlSignatureProperties")
             .to("mock:result");

Spring XML 中的 XAdES-BES/EPES 示例

...
<from uri="direct:xades" />
    <to
        uri="xmlsecurity:sign://xades?keyAccessor=#accessorRsa&amp;properties=#xadesProperties" />
    <to uri="mock:result" />
...
<bean id="xadesProperties"
    class="org.apache.camel.component.xmlsecurity.api.XAdESSignatureProperties">
    <!-- For more properties see the previous Java DSL example. 
         If you want to have a signing certificate then use the bean class DefaultXAdESSignatureProperties (see the previous Java DSL example). -->
    <property name="signaturePolicy" value="ExplicitId" />
    <property name="sigPolicyId" value="http://www.test.com/policy.pdf" />
    <property name="sigPolicyIdDescription" value="factura" />
    <property name="signaturePolicyDigestAlgorithm" value="http://www.w3.org/2000/09/xmldsig#sha1" />
    <property name="signaturePolicyDigestValue" value="Ohixl6upD6av8N7pEvDABhEL1hM=" />
    <property name="signerClaimedRoles" ref="signerClaimedRoles_XMLSigner" />
    <property name="dataObjectFormatDescription" value="Factura electrónica" />
    <property name="dataObjectFormatMimeType" value="text/xml" />
</bean>
<bean class="java.util.ArrayList" id="signerClaimedRoles_XMLSigner">
    <constructor-arg>
        <list>
            <value>Emisor</value>
            <value>&lt;ClaimedRole
                xmlns=&quot;http://uri.etsi.org/01903/v1.3.2#&quot;&gt;&lt;test
                xmlns=&quot;http://test.com/&quot;&gt;test&lt;/test&gt;&lt;/ClaimedRole&gt;</value>
        </list>
    </constructor-arg>
</bean>

374.8.1. Headers

标头类型描述

CamelXmlSignatureXAdESQualifyingPropertiesId

字符串

对于 QualifyingProperties 元素的 'Id' 属性值

CamelXmlSignatureXAdESSignedDataObjectPropertiesId

字符串

对于 SignedDataObjectProperties 元素的 'Id' 属性值

CamelXmlSignatureXAdESSignedSignaturePropertiesId

字符串

对于 SignedSignatureProperties 元素的 'Id' 属性值

CamelXmlSignatureXAdESDataObjectFormatEncoding

字符串

对于 DataObjectFormat 元素的 Encoding 元素的值

CamelXmlSignatureXAdESNamespace

字符串

 覆盖 XAdES 命名空间参数值

CamelXmlSignatureXAdESPrefix

字符串

覆盖 XAdES 前缀值

374.8.2. 有关 XAdES 版本 1.4.2 的限制

  • 不支持 XAdES-T 和 XAdES-C 格式的签名
  • 仅实施 signer 部分。验证部分当前不可用。
  • 没有对 QualifyingPropertiesReference 元素的支持(请参阅 6.3.2 部分)。
  • 不支持 SignaturePolicy Identifier 元素中包含的 SignaturePolicyId 元素中包含的 Transforms 元素
  • 不支持 CounterSignature 元素 → 不支持 UnsignedProperties 元素
  • 最多一个 DataObjectFormat 元素。DataObjectFormat 元素不合理,因为我们只有一个数据对象被签名(这是传入消息正文到 XML 签名端点)。
  • 最多一个 CommitmentTypeIndication 元素。多个 CommitmentTypeIndication 元素并不合理,因为我们只有一个数据对象被签名(这是到 XML 签名端点的传入消息正文)。
  • CommitmentTypeIndication 元素始终包含 AllSignedDataObjects 元素。不支持 Commitment TypeIndication 元素 中的 ObjectReference 元素。
  • 不支持 AllDataObjectsTimeStamp 元素
  • 不支持 individualDataObjectsTime Stamp 元素

374.9. 另请参阅

第 375 章 XMPP 组件

作为 Camel 版本 1.0 可用

xmpp: 组件实施 XMPP (Jabber)传输。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-xmpp</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

375.1. URI 格式

xmpp://[login@]hostname[:port][/participant][?Options]

组件支持基于房间和私人人对话。
组件支持制作者和使用者(您可以从 XMPP 获取消息或发送消息到 XMPP)。消费者模式支持开始空间。

您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

375.2. 选项

XMPP 组件没有选项。

XMPP 端点使用 URI 语法配置:

xmpp:host:port/participant

使用以下路径和查询参数:

375.2.1. 路径名(3 参数):

名称描述默认类型

主机

聊天服务器 所需的 主机名

 

字符串

port

聊天服务器所需的端口号

 

int

participant

要接收消息的人员的 JID (Jabber ID)。room 参数优先于参与者。

 

字符串

375.2.2. 查询参数(18 参数):

名称描述默认类型

login (common)

是否登录用户。

true

布尔值

nickname (common)

加入房时使用 nickname。如果没有指定空间,且 nickname 将用于 nickname。

 

字符串

pubsub (common)

接受输入上的 pubsub 数据包,默认为 false

false

布尔值

room (common)

如果指定了这个选项,则组件将连接到 MUC (Multi User Chat)。通常,MUC 的域名与登录域不同。例如,如果您是 supermanjabber.org,并且想加入 krypton 房间,那么房间 URL 为 kryptonconference.jabber.org。请注意会议部分。不需要提供完整的房 JID。如果 room参数不包含符号,则 Camel 将发现域部分并添加域部分

 

字符串

serviceName (common)

要连接的服务名称。对于 Google Talk,此为 gmail.com。

 

字符串

testConnectionOnStartup (common)

指定是否在启动时测试连接。这用于确保在路由启动时,XMPP 客户端具有与 XMPP 服务器的有效连接。如果无法建立连接,Camel 会抛出异常。当此选项设置为 false 时,Camel 会尝试在制作者需要时建立延迟的连接,并将轮询使用者连接,直到建立连接为止。默认为 true。

true

布尔值

createAccount (common)

如果为 true,则会尝试创建帐户。默认为 false。

false

布尔值

resource (common)

XMP 资源.默认值为 Camel。

Camel

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

connectionPollDelay (consumer)

轮询之间的秒数(以秒为单位)以验证 XMP 连接的健康状况,或者尝试在尝试建立初始消费者连接之间建立初始消费者连接。如果连接处于非活动状态,Camel 将尝试重新建立连接。默认值为 10 秒。

10

int

doc (consumer)

在 IN 消息上设置 doc 标头,其中包含传入数据包的 Document 形式;如果存在或 pubsub 为 true,则默认为 true,否则为 false

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

connectionConfig (advanced)

使用现有连接配置。目前只支持 org.jivesoftware.smack.tcp.XMPTCPConnectionConfiguration (XMP over TCP)。

 

ConnectionConfiguration

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

headerFilterStrategy (filter)

使用自定义 HeaderFilterStrategy 过滤来自 Camel 消息的标头。

 

HeaderFilterStrategy

密码 (安全)

用于登录的密码

 

字符串

user (security)

用户名(不含服务器名称)。如果没有指定,将尝试匿名登录。

 

字符串

375.3. Spring Boot Auto-Configuration

组件支持 2 个选项,如下所示。

名称描述默认类型

camel.component.xmpp.enabled

启用 xmpp 组件

true

布尔值

camel.component.xmpp.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

375.4. 标头和设置对象或语言

Camel 将消息 IN 标头设置为 XMPP 消息的属性。如果您需要自定义标题过滤,您可以配置 HeaderFilterStategy。如果 XMPP 消息的对象和语言提供为 IN 标头,也会设置它们。

375.5. 例子

用户 supermanjabber server with password, secret 处加入房间 krypton

xmpp://superman@jabber.org/?room=krypton@conference.jabber.org&password=secret

用户 superman 将信息发送到 joker

xmpp://superman@jabber.org/joker@jabber.org?password=secret

Java 中的路由示例:

from("timer://kickoff?period=10000").
setBody(constant("I will win!\n Your Superman.")).
to("xmpp://superman@jabber.org/joker@jabber.org?password=secret");

使用者配置,将来自 joker 的所有消息写入队列,即 evil.talk

from("xmpp://superman@jabber.org/joker@jabber.org?password=secret").
to("activemq:evil.talk");

消费者配置,侦听房间信息:

from("xmpp://superman@jabber.org/?password=secret&room=krypton@conference.jabber.org").
to("activemq:krypton.talk");

短表示法中的房间(无域部分):

from("xmpp://superman@jabber.org/?password=secret&room=krypton").
to("activemq:krypton.talk");

连接到 Google Chat 服务时,您需要指定 serviceName 和您的凭证:

from("direct:start").
  to("xmpp://talk.google.com:5222/touser@gmail.com?serviceName=gmail.com&user=fromuser&password=secret").
  to("mock:result");

 

375.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 376 章 XPath 语言

可作为 Camel 版本 1.1 提供

Camel 支持 XPath,允许在 DSL 或 Xml 配置中使用表达式或 predicates。例如,您可以使用 XPath 在 Message Filter 中创建 Predicate,或作为 Recipient List 的 Expression。

如果消息正文基于流,这意味着它接收的输入将提交至 Camel 作为流。这意味着,您只能 一次 读取流的内容。因此,通常当使用 XPath 作为 消息过滤器 或内容基于内容的路由器时,您需要多次访问数据,并且您应使用流缓存或将消息正文转换为 String,然后再安全地重新读取多次。

from("queue:foo").
  filter().xpath("//foo")).
  to("queue:bar")
from("queue:foo").
  choice().xpath("//foo")).to("queue:bar").
  otherwise().to("queue:others");

376.1. XPath 语言选项

XPath 语言支持 9 选项,这些选项如下。

名称默认Java 类型描述

documentType

 

字符串

文档类型的类名称是 org.w3c.dom.Document

resultType

NODESET

字符串

设置结果类型的类名称(输出中的类型)默认结果类型是 NodeSet

saxon

false

布尔值

是否使用 Saxon。

factoryRef

 

字符串

对 registry 中查询的自定义 XPathFactory 的引用

objectModel

 

字符串

使用的 XPath 对象模型

logNamespaces

false

布尔值

是否记录命名空间,在拍摄过程中有助于进行

headerName

 

字符串

用作输入的标头名称,而不是消息正文

threadSafety

false

布尔值

为 xpath 表达式返回的结果启用 thread-safety。这适用于在将 NODESET 用作结果类型时,返回的集合具有多个元素。在这种情况下,如果同时处理 NODESET,比如以并行处理模式从 Camel Splitter EIP 中处理 NODESET,则可能会出现线程安全的问题。这个选项可防止对节点进行防御副本的并发问题。如果您在应用程序中使用 camel-saxon 或 Saxon,则建议启用此选项。Saxon 具有 thread-safety 问题,可以通过打开这个选项来阻止。

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

376.2. 命名空间

您可以使用 Namespaces helper 类轻松使用 XPath 表达式的命名空间。

376.3. 变量

XPath 中的变量在不同的命名空间中定义。默认命名空间是 http://camel.apache.org/schema/spring

Namespace URI本地部分类型描述

http://camel.apache.org/xml/in/

in

消息

Exchange.in 消息

http://camel.apache.org/xml/out/

out

消息

Exchange.out 消息

http://camel.apache.org/xml/function/

功能

对象

Camel 2.5: 附加功能

http://camel.apache.org/xml/variables/environment-variables

env

对象

OS 环境变量

http://camel.apache.org/xml/variables/system-properties

system

对象

Java 系统属性

http://camel.apache.org/xml/variables/exchange-property

 

对象

exchange 属性

Camel 将根据以下方法解析变量:

  • 给定命名空间
  • 未提供命名空间

376.3.1. 给定命名空间

如果指定命名空间,Camel 将指示 Camel 准确返回的内容。但是,当解析 Camel 或 out Camel 时,会尝试首先使用给定本地部分解析标头,并返回。如果本地部分具有值 正文,则返回正文。

376.3.2. 未提供命名空间

如果没有给定命名空间,Camel 仅会基于本地部分进行解析。Camel 将在以下步骤中尝试解析变量:

  • 使用变量 (name, value)流畅 构建程序设置的变量
  • 如果给定密钥有标头,则 from message.in.header
  • 如果给定密钥有属性,则来自 exchange.properties

376.4. Functions

Camel 添加以下 XPath 功能来访问交换:

功能参数类型描述

in:body

none

对象

将返回消息正文。

in:header

标头名称

对象

将返回消息 标题中的

out:body

none

对象

将返回 出封邮件 正文。

out:header

标头名称

对象

将返回 out 消息标头。

function:properties

属性的密钥

字符串

Camel 2.5: 要使用 Properties 组件(非操作占位符)查找属性。

功能:simple

简单表达式

对象

Camel 2.5: 要评估 简单 表达式。

小心

function:properties and function:simple is not when the return type is a NodeSet,例如在 Splitter EIP 中使用时。

以下是一些使用这些功能的示例:

以及 Camel 2.5 中引入的新功能:

376.5. 使用 XML 配置

如果要在 Spring XML 文件中配置路由,那么您可以使用 XPath 表达式,如下所示

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring" xmlns:foo="http://example.com/person">
    <route>
      <from uri="activemq:MyQueue"/>
      <filter>
        <xpath>/foo:person[@name='James']</xpath>
        <to uri="mqseries:SomeOtherQueue"/>
      </filter>
    </route>
  </camelContext>
</beans>

请注意,我们如何重复使用命名空间前缀 foo,本例中为 XPath 表达式,以方便基于命名空间的 XPath 表达式!

另请参阅 关于将您自己的命名空间与 xpath 搭配使用的 mailinglist 的讨论

376.6. 设置结果类型

XPath 表达式将使用本地 XML 对象(如 org.w3c.dom.NodeList )返回结果类型。但很多时候,您希望结果类型是一个字符串。要做到这一点,您必须指示 XPath 要使用的结果类型。

在 Java DSL 中:

xpath("/foo:person/@id", String.class)

在 Spring DSL 中,您可以使用 resultType 属性提供完全限定的 classname:

<xpath resultType="java.lang.String">/foo:person/@id</xpath>

在 @XPath:
中作为 Camel 2.1 提供

@XPath(value = "concat('foo-',//order/name/)", resultType = String.class) String name)

如果我们使用 xpath 功能将顺序名称加前缀为 foo-。在本例中,我们必须指定,我们需要一个字符串作为结果类型,因此 concat 函数可以正常工作。

376.7. 在 Headers 上使用 XPath

可从 Camel 2.11 开始

有些用户可能将 XML 存储在标头中。要将 XPath 应用到标头的值,您可以通过定义 'headerName' 属性来执行此操作。

在 Java DSL 中,您将 headerName 指定为 2nd 参数,如下所示:

  xpath("/invoice/@orderType = 'premium'", "invoiceDetails")

376.8. 例子

以下是在 Message Filter 中将 XPath 表达式用作 predicate 的简单示例

如果您有一个标准命名空间集合,您希望在许多不同的 XPath 表达式间共享它们,您可以使用 NamespaceBuilder ,如下例所示

在本例中,我们有选择结构。如果消息具有值为 Camel 的标头 密钥类型,则第一个选择撤离。
第二代选择将评估消息正文是否具有名称标签 <name >,值为 Kong
如果没有为 true,则在其他块中路由消息:

和 spring XML 等效于路由:

376.9. XPath 注入

您可以使用 Bean 集成在 bean 上调用方法,并使用 XPath 等各种语言从消息中提取值并将其绑定到方法参数。

默认 XPath 注解具有 SOAP 和 XML 命名空间可用。如果要在 XPath 表达式中使用自己的命名空间 URI,您可以使用 XPath 注解的 自己的副本来创建您要使用的任何命名空间前缀。

i.e. 在不同的软件包和/或注解名称中,将大写代码剪切和粘贴到您自己的项目,然后在使用方法参数时使用注解时添加所需的任何命名空间前缀/uri。然后,当您对方法参数使用注解时,您希望在 XPath 表达式中使用所有命名空间。

例如:

public class Foo {

    @MessageDriven(uri = "activemq:my.queue")
    public void doSomething(@MyXPath("/ns1:foo/ns2:bar/text()") String correlationID, @Body String body) {
        // process the inbound message here
    }
}

376.10. 在没有交换的情况下使用 XPathBuilder

可作为 Camel 2.3 提供

现在,您可以使用 org.apache.camel.builder.XPathBuilder,无需 Exchange。如果您想将其用作执行自定义 xpath 评估的帮助程序,这将很方便。

它要求您传递 CamelContext,因为 XPathBuilder 中的多个移动部分需要访问 Camel Type Converter,因此为什么需要 CamelContext。

例如,您可以做到这一点:

boolean matches = XPathBuilder.xpath("/foo/bar/@xyz").matches(context, "<foo><bar xyz='cheese'/></foo>"));

这将与给定的 predicate 匹配。

您还可以评估示例,如以下三个示例所示:

String name = XPathBuilder.xpath("foo/bar").evaluate(context, "<foo><bar>cheese</bar></foo>", String.class);
Integer number = XPathBuilder.xpath("foo/bar").evaluate(context, "<foo><bar>123</bar></foo>", Integer.class);
Boolean bool = XPathBuilder.xpath("foo/bar").evaluate(context, "<foo><bar>true</bar></foo>", Boolean.class);

使用 String 结果进行评估是常见的要求,因此您可以做一些简单:

String name = XPathBuilder.xpath("foo/bar").evaluate(context, "<foo><bar>cheese</bar></foo>");

376.11. 在 XPathBuilder 中使用 Saxon

可作为 Camel 2.3 提供

您需要将 camel-saxon 作为项目的依赖。

现在,在 XPathBuilder 中使用 Saxon,可以通过以下几种方法完成。
其中,作为后者是最简单的。

  • 使用工厂
  • 使用 ObjectModel

一个简单的

376.12. 使用系统Property 设置自定义 XPathFactory

可作为 Camel 2.3 提供

Camel 现在支持读取 JVM 系统属性 javax.xml.xpath.XPathFactory,它可用于设置要使用的自定义 XPathFactory。

这个单元测试显示如何进行这个操作来使用 Saxon:

如果 Camel 使用非默认 XPathFactory,如:

XPathBuilder  INFO  Using system property javax.xml.xpath.XPathFactory:http://saxon.sf.net/jaxp/xpath/om with value:
                    net.sf.saxon.xpath.XPathFactoryImpl when creating XPathFactory

要使用 Apache Xerces,您可以配置系统属性

-Djavax.xml.xpath.XPathFactory=org.apache.xpath.jaxp.XPathFactoryImpl

376.13. 从 Spring DSL 启用 Saxon

可从 Camel 2.10 开始

与 Java DSL 类似,若要启用 Spring DSL 中的 Saxon,您可以有三个选项:

指定工厂

<xpath factoryRef="saxonFactory" resultType="java.lang.String">current-dateTime()</xpath>

指定对象模型

<xpath objectModel="http://saxon.sf.net/jaxp/xpath/om" resultType="java.lang.String">current-dateTime()</xpath>

快捷键

<xpath saxon="true" resultType="java.lang.String">current-dateTime()</xpath>

376.14. 命名空间审核以协助调试

可从 Camel 2.10 开始

用户经常会遇到到命名空间使用大量 XPath 相关的问题。您可能会在消息中的命名空间和 XPath 表达式知道或引用命名空间之间有一些错误。由于命名空间问题无法找到 XML 元素和属性的 XPath predicates 或表达式可能只是类似"它们无法正常工作",当事实上都缺少命名空间定义。

XML 中的命名空间是完全必要的,而我们希望通过实施一些音量或 voodoo 来自动进行有线命名空间的使用,但事实上是,对路径的任何行动都将与标准不满意,并且大大阻碍了互操作性。

因此,我们可以通过向 XPath 表达式语言添加两个新功能,从而帮助您对这些问题进行调试。

#=== 记录您的 XPath 表达式/predicate 的 Namespace Context

每次在内部池中创建新的 XPath 表达式时,Camel 会将表达式的命名空间上下文记录到 org.apache.camel.builder.xml.XPathBuilder 日志记录器下。由于 Camel 以分层方式(父关系)表示命名空间上下文,因此整个树是以递归方式的输出,其格式如下:

[me: {prefix -> namespace}, {prefix -> namespace}], [parent: [me: {prefix -> namespace}, {prefix -> namespace}], [parent: [me: {prefix -> namespace}]]]

这些选项中的任何一个都可用于激活这个日志:

  1. org.apache.camel.builder.xml.XPathBuilder 日志记录器或一些父级日志记录器(如 org.apache.camel 或根日志记录器)上启用 TRACE 日志记录
  2. 启用 logNamespaces 选项,如 Auditing Namespaces 中所示,在这种情况下,日志将在 INFO 级别上发生。

376.15. 审核命名空间

在评估 XPath 表达式前,Camel 能够发现并转储每个传入消息上存在的所有命名空间,为您提供所需信息的丰富性,以帮助您了解可能的命名空间问题。

为实现此目的,它会内部使用另一个特别定制的 XPath 表达式来提取信息中显示的所有命名空间映射,显示前缀以及每个映射的完整命名空间 URI。

有些点考虑如下:

  • 从输出中禁止隐式 XML 命名空间(xmlns:xml="http://www.w3.org/XML/1998/namespace"),因为它没有添加值
  • 默认命名空间列在输出中的 DEFAULT 关键字下
  • 请记住,命名空间可以被重新 map 到不同的范围下。考虑一个顶级 'a' 前缀,该前缀可在内部元素中分配不同的命名空间,或者 default 命名空间在内部范围内更改。对于每个发现的前缀,会列出所有关联的 URI。

您可以在 Java DSL 和 Spring DSL 中启用这个选项。

Java DSL:

XPathBuilder.xpath("/foo:person/@id", String.class).logNamespaces()

Spring DSL:

<xpath logNamespaces="true" resultType="String">/foo:person/@id</xpath>

审计的结果将显示在 org.apache.camel.builder.xml.XPathBuilder 日志记录器下的 INFO 级别,并类似如下:

2012-01-16 13:23:45,878 [stSaxonWithFlag] INFO  XPathBuilder  - Namespaces discovered in message:
{xmlns:a=[http://apache.org/camel], DEFAULT=[http://apache.org/default],
xmlns:b=[http://apache.org/camelA, http://apache.org/camelB]}

376.16. 从外部资源载入脚本

可从 Camel 2.11 开始

您可以对脚本进行外部化,并使 Camel 从资源(如 "classpath:""file:""http:" )加载。
这可通过以下语法完成: "resource:scheme:location",例如参考类路径上的文件,您可以执行以下操作:

.setHeader("myHeader").xpath("resource:classpath:myxpath.txt", String.class)

376.17. 依赖项

XPath 语言是 camel-core 的一部分。

第 377 章 XQuery Component

作为 Camel 版本 1.0 可用

Camel 支持 XQuery,允许在 DSL 或 Xml 配置中使用表达式或 predicates。例如,您可以使用 XQuery 在 Message Filter 中创建 Predicate,或作为 Recipient List 的 Expression。

377.1. 选项

XQuery 组件支持 4 个选项,它们如下所列。

名称描述默认类型

moduleURIResolver (高级)

使用自定义 ModuleURIResolver

 

ModuleURIResolver

配置 (高级)

使用自定义 Saxon 配置

 

配置

configurationProperties (advanced)

设置自定义 Saxon 配置属性

 

map

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

XQuery 端点使用 URI 语法进行配置:

xquery:resourceUri

使用以下路径和查询参数:

377.1.1. 路径名(1 参数):

名称描述默认类型

resourceUri

需要 模板的名称以便从 classpath 或文件系统载入

 

字符串

377.1.2. 查询参数(31 参数):

名称描述默认类型

allowStAX (common)

是否允许使用 StAX 模式

false

布尔值

headerName (common)

使用 Camel 消息标头作为输入源,而不是消息正文。

 

字符串

namespacePrefixes (common)

允许控制用于一组命名空间映射的命名空间前缀

 

map

resultsFormat (common)

要使用的输出结果

DOM

ResultFormat

resultType (common)

使用什么输出结果将定义为类

 

stripsAllWhiteSpace (common)

是否要剥离所有空格

true

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

配置 (高级)

使用自定义 Saxon 配置

 

配置

configurationProperties (advanced)

设置自定义 Saxon 配置属性

 

map

moduleURIResolver (高级)

使用自定义 ModuleURIResolver

 

ModuleURIResolver

参数 (高级)

其他参数

 

map

属性 (高级)

配置序列化参数的属性

 

Properties

staticQueryContext (advanced)

使用自定义 Saxon StaticQueryContext

 

StaticQueryContext

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

延迟 (scheduler)

下次轮询前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

500

long

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

377.2. Spring Boot Auto-Configuration

组件支持 8 个选项,如下所示。

名称描述默认类型

camel.component.xquery.configuration

使用自定义 Saxon 配置。选项是一个 net.sf.saxon.Configuration 类型。

 

字符串

camel.component.xquery.configuration-properties

设置自定义 Saxon 配置属性

 

map

camel.component.xquery.enabled

启用 xquery 组件

true

布尔值

camel.component.xquery.module-u-r-i-resolver

使用自定义 ModuleURIResolver。选项是一个 net.sf.saxon.lib.ModuleURIResolver 类型。

 

字符串

camel.component.xquery.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.language.xquery.enabled

启用 xquery 语言

true

布尔值

camel.language.xquery.trim

是否修剪值是否删除前导(尾随空格和换行符)

true

布尔值

camel.language.xquery.type

设置结果类型的类名称(输出中的类型)默认结果类型是 NodeSet

 

字符串

377.3. 例子

from("queue:foo").filter().
  xquery("//foo").
  to("queue:bar")

您还可以在查询中使用函数,在这种情况下,您需要明确类型转换(或者您将 get a org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR)将类作为第二个参数传递给 xquery () 方法。

from("direct:start").
  recipientList().xquery("concat('mock:foo.', /person/@city)", String.class);

377.4. 变量

IN 消息正文将设置为 contextItem。除了这些变量外,也会添加为参数:

变量类型描述

exchange

Exchange

当前交换

in.body

对象

In message 的正文

out.body

对象

OUT 消息的正文(若有)

in.headers.*

对象

您可以使用名为 in.headers.foo 的变量来使用键 foo 访问 exchange.in.headers 的值。

out.headers.*

对象

您可以使用名为 out.headers.foo 变量来访问带有键 foo 的 exchange.out.headers 的值

密钥名称

对象

任何使用 setParameters (Map) 设置的 Exchange.properties 和 exchange.in.headers 及任何其他参数。如果使用自己的密钥名称添加这些参数,例如,如果有名为 foo 的 IN 标头,则将其添加为 foo

377.5. 使用 XML 配置

如果要在 Spring XML 文件中配置路由,那么您可以使用 XPath 表达式,如下所示

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:foo="http://example.com/person"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
    <route>
      <from uri="activemq:MyQueue"/>
      <filter>
        <xquery>/foo:person[@name='James']</xquery>
        <to uri="mqseries:SomeOtherQueue"/>
      </filter>
    </route>
  </camelContext>
</beans>

请注意,我们如何重复使用命名空间前缀 foo,本例中为 XPath 表达式,以方便基于命名空间的 XQuery 表达式!

当您在 XQuery 表达式中使用功能时,您需要显式类型转换,该转换可通过 @type 属性在 xml 配置中完成:

    <xquery type="java.lang.String">concat('mock:foo.', /person/@city)</xquery>

377.6. 使用 XQuery 作为转换

我们可以在路由中使用转换或设置消息转换,如下所示:

from("direct:start").
   transform().xquery("/people/person");

请注意,xquery 默认将使用 DOMResult。因此,如果我们希望获取用户角色节点的值,则需要使用 text ()告知 xquery 使用 String 作为结果类型,如下所示:

from("direct:start").
   transform().xquery("/people/person/text()", String.class);

 

377.7. 使用 XQuery 作为端点

有时 XQuery 表达式非常大,它可以用来使用。因此,您可能需要使用 XQuery 端点,以便您可以使用 XQuery 模板进行路由。

以下示例演示了如何获取 ActiveMQ 队列(MyQueue)的消息,并使用 XQuery 对其进行转换,并将它发送到 MQSeries。

  <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="activemq:MyQueue"/>
      <to uri="xquery:com/acme/someTransform.xquery"/>
      <to uri="mqseries:SomeOtherQueue"/>
    </route>
  </camelContext>

目前,XQuery 中的自定义功能可能会导致 NullPointerException (Camel 2.18、2.19 和 2.20)。预期在 Camel 2.21 中修复

377.8. 例子

以下是在 Message Filter 中将 XQuery 表达式用作 predicate 的简单示例

这个示例在 Message Filter 中使用带有命名空间的 XQuery 作为 predicate

377.9. 学习 XQuery

XQuery 是一个功能强大的语言,可用于查询、搜索、排序和返回 XML。如需帮助学习 XQuery,请尝试这些教程

您可能还会找到 XQuery 功能参考

377.10. 从外部资源载入脚本

可从 Camel 2.11 开始

您可以对脚本进行外部化,并使 Camel 从资源(如 "classpath:""file:""http:" )加载。
这可通过以下语法完成: "resource:scheme:location",例如参考类路径上的文件,您可以执行以下操作:

.setHeader("myHeader").xquery("resource:classpath:myxquery.txt", String.class)

377.11. 依赖项

要在 camel 路由中使用 XQuery,您需要添加实现 XQuery 语言的 camel-saxon 的依赖项。

如果您使用 maven,只需在 pom.xml 中添加以下内容,替换最新和最高版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-saxon</artifactId>
  <version>x.x.x</version>
</dependency>

第 378 章 XSLT Component

作为 Camel 版本 1.3 提供

xslt: 组件允许您使用 XSLT 模板来处理消息。这在使用 Templating 来为请求生成 respopns 时的理想选择。

378.1. URI 格式

xslt:templateName[?options]

URI 格式包含 templateName,它可以是以下之一:

  • 要调用的模板的 classpath-local URI
  • 远程模板的完整 URL。

您可以按照以下格式将查询选项附加到 URI:

?option=value&option=value&…​

有关 URI 语法的详情,请参阅 Spring 文档

表 378.1. URI 示例

URI描述

xslt:com/acme/mytransform.xsl

代表 classpath 上的 com/acme/mytransform.xsl 文件

xslt:file:///foo/bar.xsl

引用文件 /foo/bar.xsl

xslt:http://acme.com/cheese/foo.xsl

代表远程 http 资源

对于 Camel 2.8 或更早的版本,Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

来自 XSLT 组件的 Camel 2.9 直接在 camel-core 中提供。

378.2. 选项

XSLT 组件支持 9 个选项,它们如下。

名称描述默认类型

xmlConverter (advanced)

使用 org.apache.camel.converter.jaxp.XmlConverter 的自定义实现

 

XmlConverter

uriResolverFactory (advanced)

要使用依赖于动态端点资源 URI 的自定义 UriResolver。不应与选项"uriResolver"一起使用。

 

XsltUriResolverFactory

uriResolver (advanced)

使用自定义 UriResolver。不应与"uriResolverFactory"选项一起使用。

 

URIResolver

contentCache (producer)

加载资源内容(样式表文件)的缓存。如果设置为 false Camel,则每个消息处理时重新加载 样式表文件。这对于开发非常好。可以使用 clearCachedStylesheet 操作,通过 JMX 在运行时强制重新加载缓存的样式表。

true

布尔值

saxon (producer)

是否将 Saxon 用作 transformerFactoryClass。如果启用,则类 net.sf.saxon.TransformerFactoryImpl。您需要将 Saxon 添加到 classpath 中。

false

布尔值

saxonExtensionFunctions (advanced)

允许您使用自定义 net.sf.saxon.lib.ExtensionFunctionDefinition。您需要将 camel-saxon 添加到 classpath 中。该函数在 registry 中查找,您可以使用逗号来分隔要查找的多个值。

 

字符串

saxonConfiguration (advanced)

使用自定义 Saxon 配置

 

对象

saxonConfiguration Properties (advanced)

设置自定义 Saxon 配置属性

 

map

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

XSLT 端点使用 URI 语法进行配置:

xslt:resourceUri

使用以下路径和查询参数:

378.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

模板所需的 路径。以下为默认的 URIResolver 支持。您可以加上前缀: classpath、file、http、ref 或 bean. classpath、file 和 http 使用这些协议(classpath 为 default)。ref 将查询 registry 中的资源。bean 将调用 bean 上的方法以用作资源。对于 bean,您可以在点后指定方法名称,eg bean:myBean.myMethod

 

字符串

378.2.2. 查询参数(17 参数):

名称描述默认类型

allowStAX (producer)

是否允许使用 StAX 作为 javax.xml.transform.Source.

true

布尔值

contentCache (producer)

加载资源内容(样式表文件)的缓存。如果设置为 false Camel,则每个消息处理时重新加载 样式表文件。这对于开发非常好。可以使用 clearCachedStylesheet 操作,通过 JMX 在运行时强制重新加载缓存的样式表。

true

布尔值

deleteOutputFile (producer)

如果您有 output=file,则此选项将指定在 Exchange 处理时是否应删除输出文件。例如,假设输出文件是一个临时文件,在使用后最好将其删除。

false

布尔值

failOnNullBody (producer)

如果输入正文为空,是否抛出异常。

true

布尔值

output (producer)

指定要使用的输出类型的选项。可能的值有: string、bytes、DOM、file。前三个选项都基于内存,其中 将文件直接流传输到 java.io.File。对于文件,您必须在 IN 标头中使用密钥 Exchange.XSLT_FILE_NAME 指定文件名,也是 CamelXsltFileName。另外,必须预先创建文件名的任何路径,否则在运行时抛出异常。

字符串

XsltOutput

saxon (producer)

是否将 Saxon 用作 transformerFactoryClass。如果启用,则类 net.sf.saxon.TransformerFactoryImpl。您需要将 Saxon 添加到 classpath 中。

false

布尔值

transformerCacheSize (producer)

缓存的 javax.xml.transform.Transformer 对象的数量,以避免对 Template.newTransformer()的调用。

0

int

converter (高级)

使用 org.apache.camel.converter.jaxp.XmlConverter 的自定义实现

 

XmlConverter

entityResolver (advanced)

使用 javax.xml.transform.sax.SAXSource 的自定义 org.xml.sax.EntityResolver。

 

EntityResolver

errorListener (advanced)

允许将 配置为使用自定义 javax.xml.transform.ErrorListener.在执行此操作时,注意默认错误监听程序会捕获任何错误或致命错误,并在交换上存储有关属性的信息。因此,只对特殊用例使用这个选项。

 

ErrorListener

resultHandlerFactory (advanced)

允许您使用自定义 org.apache.camel.builder.xml.ResultHandlerFactory,它能够使用自定义 org.apache.camel.builder.xml.ResultHandler 类型。

 

ResultHandlerFactory

saxonConfiguration (advanced)

使用自定义 Saxon 配置

 

对象

saxonExtensionFunctions (advanced)

允许您使用自定义 net.sf.saxon.lib.ExtensionFunctionDefinition。您需要将 camel-saxon 添加到 classpath 中。该函数在 registry 中查找,您可以使用逗号来分隔要查找的多个值。

 

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

transformerFactory (advanced)

使用自定义 XSLT 转换器工厂

 

TransformerFactory

transformerFactoryClass (advanced)

要使用自定义 XSLT 转换器工厂,指定为 FQN 类名称

 

字符串

uriResolver (advanced)

使用自定义 javax.xml.transform.URIResolver

 

URIResolver

378.3. 使用 XSLT 端点

以下格式是使用 XSLT 模板为 InOut 消息交换消息(其中有一个 JMSReplyTo 标头)来回复回复。

from("activemq:My.Queue").
  to("xslt:com/acme/mytransform.xsl");

如果要使用 InOnly 并使用这个信息,并将其发送到另一个目的地,您可以使用以下路由:

from("activemq:My.Queue").
  to("xslt:com/acme/mytransform.xsl").
  to("activemq:Another.Queue");

378.4. 在 XSLT 中获取使用参数

默认情况下,所有标头都添加为参数,然后在 XSLT 中提供。
要让参数可以使用,您将需要声明它们。

<setHeader headerName="myParam"><constant>42</constant></setHeader>
<to uri="xslt:MyTransform.xsl"/>

参数也需要在 XSLT 的顶层声明,以便其可用:

<xsl: ...... >

   <xsl:param name="myParam"/>

    <xsl:template ...>

378.5. Spring XML 版本

要使用 Spring XML 中的以上示例,您可以使用类似以下代码的内容:

  <camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
    <route>
      <from uri="activemq:My.Queue"/>
      <to uri="xslt:org/apache/camel/spring/processor/example.xsl"/>
      <to uri="activemq:Another.Queue"/>
    </route>
  </camelContext>

要查看示例,请查看 测试案例 及其 Spring XML

378.6. 使用 xsl:include

Camel 2.2 或更早的
如果您使用 xsl:includeCamel 2.2 或更早的 XSL 文件中包括,则会使用默认的 javax.xml.transform.URIResolver。文件将相对于 JVM 启动文件夹解析。

例如,以下 include 语句将从启动应用的文件夹中查找 staff_template.xsl 文件。

<xsl:include href="staff_template.xsl"/>

Camel 2.3 或更高版本
用于 Camel 2.3 或更新版本,提供自己的 URIResolver 实施。这使得 Camel 可以从类路径加载包含的文件。

例如,以下代码中的 include 文件将相对于起始端点。

<xsl:include href="staff_template.xsl"/>

这意味着 Camel 会将 类路径中 的 文件定位为 org/apache/camel/component/xslt/staff_template.xsl

您可以使用 classpath:file: 来指示 Camel 在类路径或文件系统中查找。如果省略前缀,则 Camel 将使用端点配置的前缀。如果在端点配置中没有指定前缀,则默认为 classpath:

您还可以在 include 路径中引用后方。在以下示例中,xsl 文件将在 org/apache/camel/component 下解析。

    <xsl:include href="../staff_other_template.xsl"/>

378.7. 使用 xsl:include 和 default 前缀

Camel 2.10.3 和 更早的 中,classpath: 用作默认前缀。
如果将起始资源配置为使用 file: 来加载,则后续所有后续课程都必须以 file: 为前缀:。

Camel 2.10.4,Camel 将使用端点配置中的前缀作为默认前缀。

您可以明确指定 file:classpath: load。如果需要,可以在 XSLT 脚本中混合使用两种加载类型。

378.8. 使用 Saxon 扩展功能

由于 Saxon 9.2,编写扩展功能已被一个新的机制补充,称为 集成 扩展功能,您现在可以轻松使用 camel,如下例所示:

SimpleRegistry registry = new SimpleRegistry();
registry.put("function1", new MyExtensionFunction1());
registry.put("function2", new MyExtensionFunction2());

CamelContext context = new DefaultCamelContext(registry);
context.addRoutes(new RouteBuilder() {
    @Override
    public void configure() throws Exception {
        from("direct:start")
            .to("xslt:org/apache/camel/component/xslt/extensions/extensions.xslt?saxonExtensionFunctions=#function1,#function2");
    }
});

使用 Spring XML:

<bean id="function1" class="org.apache.camel.component.xslt.extensions.MyExtensionFunction1"/>
<bean id="function2" class="org.apache.camel.component.xslt.extensions.MyExtensionFunction2"/>

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:extensions"/>
    <to uri="xslt:org/apache/camel/component/xslt/extensions/extensions.xslt?saxonExtensionFunctions=#function1,#function2"/>
  </route>
</camelContext>

378.9. 动态风格表

要在运行时提供动态风格表,您可以定义动态 URI。如需更多信息,请参阅 如何在 to ()中使用动态 URI

从 Camel 2.9 开始( 2.11.4、2.12.3 和 2.13.0)
Camel 提供了 CamelXsltResourceUri 标头,您可以使用它为端点 URI 上配置的替代样式表。这可让您在运行时提供动态风格的表。

378.10. 从 XSLT ErrorListener 访问警告、错误和严重错误

可从 Camel 2.14 开始

Camel 2.14,任何警告/错误或严重错误都作为密钥 Exchange.XSLT_ERROR、 Exchange.XSLT_ERROR、 Exchange.XSLT_ERROR 或 Exchange.XSLT_WARNING 存储在当前 Exchange 上,这将允许最终用户在转换过程中丢失所有错误。

例如,在下面的样式表中,如果某个员工有一个空 dob 字段,我们希望终止。和 包含使用 xsl:message 的自定义错误消息。

<xsl:template match="/">
  <html>
    <body>
      <xsl:for-each select="staff/programmer">
        <p>Name: <xsl:value-of select="name"/><br />
          <xsl:if test="dob=''">
            <xsl:message terminate="yes">Error: DOB is an empty string!</xsl:message>
          </xsl:if>
        </p>
      </xsl:for-each>
    </body>
  </html>
</xsl:template>

例外作为带有密钥 Exchange.XSLT_WARNING 的警告保存在 Exchange.XSLT_WARNING 中。

378.11. 使用 XSLT 和 Java 版本备注

以下是 Camel 用户 Sameer 的一些观察结果,他与我们共享:

如果有人在 XSLT 端点出现问题时,请查看这些点。

我试图使用 xslt 端点,使用简单的 xsl 从一个 xml 简单的转换至另一个 xml。输出 xml 保持显示(在路由中的 xslt 处理器之后),带有mostermost xml 标签,其中没有其中的内容。

DEBUG 日志中没有显示任何解释。但是,在 TRACE 日志中,我找不到一些错误/警告,表明无法初始化 XMLConverter bean。

在我想到几个小时之后,我必须完成以下操作才能让它正常工作(假设用户出现一些声明会给出一些问题):

  1. 使用路由 ("xslt:my-transformer.xsl?transformerFactory= tFactory =tFactory") 中的 TranserFactory 选项,使用 class="org.apache.xalan.xsltc.trax.trax.TransformerFactoryImpl".
  2. 将 Xalan jar 添加到 my maven pom。

my guess 是 JDK (使用 1.6.0_03)中提供的默认 xml 解析机制在此上下文中无法正常工作,且不会抛出任何错误。当我通过此方法切换到 Xalan 时,它可以正常工作。这不是 Camel 问题,但可能需要提及 xslt 组件页面。

另一个备注,jdk 1.6.0_03 附带了 JAXB 2.0,而 Camel 需要 2.1。种临时解决方案是将 2.1 jar 添加到 jvm 的 jre/lib/endorsed 目录中或由容器指定。

希望这段时间为 Camel riders 节省时间。

378.12. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 379 章 XStream DataFormat

作为 Camel 版本 1.3 提供

XStream 是一个数据格式,它使用 XStream 库 到 marshal 和 unmarshal Java 对象,从 XML 使用。

要在 camel 路由中使用 XStream,您需要添加实现此数据格式的 camel-xstream 依赖项。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-xstream</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

379.1. 选项

XStream 数据格式支持 10 个选项,它们如下。

名称默认Java 类型描述

权限

 

字符串

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

encoding

 

字符串

设置要使用的编码

driver

 

字符串

使用自定义 XStream 驱动程序。该实例必须是 com. thoughtworks.xstream.io.HierarchicalStreamDriver 类型

driverRef

 

字符串

要引用 registry 中的自定义 XStream 驱动程序。该实例必须是 com. thoughtworks.xstream.io.HierarchicalStreamDriver 类型

模式

 

字符串

处理重复引用的模式有: NO_REFERENCES ID_REFERENCES XPATH_RELATIVE_REFERENCES XPATH_ABSOLUTE_REFERENCES SINGLE_NODE_XPATH_RELATIVE_REFERENCES SINGLE_NODE_XPATH_ABSOLUTE_REFERENUER

converters

 

list

使用自定义 XStream 转换器的类名称列表。class com 类型必须是 com. thoughtworks.xstream.converters.Converter

别名

 

Map

别名为在 XML 元素中使用的短名称的类。

omitFields

 

Map

防止字段被序列化。要省略一个字段,您必须始终提供声明类型,而不一定是转换的类型。

implicitCollections

 

Map

添加用于任何未映射 XML 标签的默认隐式集合。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

379.2. Spring Boot Auto-Configuration

组件支持 31 选项,如下所示。

名称描述默认类型

camel.dataformat.json-xstream.allow-jms-type

用于 JMS 用户,允许 JMS spec 中的 JMSType 标头指定用于 unmarshal 的 FQN 类名称。

false

布尔值

camel.dataformat.json-xstream.allow-unmarshall-type

如果启用,则 Jackson 可以在 unmarshalling 中尝试使用 CamelJacksonUnmarshalType 标头。只有在需要使用时,才应启用它。

false

布尔值

camel.dataformat.json-xstream.collection-type-name

指的是要在注册表中查找的自定义集合类型。这个选项很少被使用,但允许使用与 java.util.Collection 不同的集合类型作为默认值。

 

字符串

camel.dataformat.json-xstream.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.json-xstream.disable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上禁用功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-xstream.enable-features

在 Jackson com.fasterxml.jackson.databind.ObjectMapper 上启用的功能集。这个功能应当是与 com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature 或 com.fasterxml.jackson.jackson.jackson.databind.MapperFeature.jackson.databind.

 

字符串

camel.dataformat.json-xstream.enable-jaxb-annotation-module

使用 jackson 时是否启用 JAXB 注解模块。启用之后,Jackson 可以使用 JAXB 注释。

false

布尔值

camel.dataformat.json-xstream.enabled

启用 json-xstream 数据格式

true

布尔值

camel.dataformat.json-xstream.include

如果您想将 pojo to JSON 放入 JSON,则 pojo 含有一些带有 null 值的字段。而且您要跳过这些 null 值,您可以将这个选项设置为 NON_NULL

 

字符串

camel.dataformat.json-xstream.json-view

当 marshalling a POJO to JSON 时,您可能想要从 JSON 输出中排除某些字段。通过 Jackson,您可以使用 JSON 视图来达到此目的。此选项引用包含 JsonView 注解的类

 

camel.dataformat.json-xstream.library

要使用的 json 库。

 

JsonLibrary

camel.dataformat.json-xstream.module-class-names

要使用自定义 Jackson 模块 com.fasterxml.jackson.databind.Module 指定为带有 FQN 类名称的 String。可以使用逗号分隔多个类。

 

字符串

camel.dataformat.json-xstream.module-refs

使用由 Camel registry 引用的自定义 Jackson 模块。可以使用逗号分隔多个模块。

 

字符串

camel.dataformat.json-xstream.object-mapper

在使用 Jackson 时,查找并使用给定 ID 的现有 ObjectMapper。

 

字符串

camel.dataformat.json-xstream.permissions

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

 

字符串

camel.dataformat.json-xstream.pretty-print

启用大量打印输出。默认为 false。

false

布尔值

camel.dataformat.json-xstream.timezone

如果设置,则 Jackson 会在 marshalling/unmarshalling 时使用 Timezone。此选项对其他 Json DataFormat (如 gson、fastjson 和 xstream)没有影响。

 

字符串

camel.dataformat.json-xstream.unmarshal-type-name

取消armshalling 时要使用的 java 类型的类名称

 

字符串

camel.dataformat.json-xstream.use-default-object-mapper

是否从注册表中查找和使用默认 Jackson ObjectMapper。

true

布尔值

camel.dataformat.json-xstream.use-list

要取消与映射列表或 Pojo 列表相关的内容。

false

布尔值

camel.dataformat.xstream.aliases

别名为在 XML 元素中使用的短名称的类。

 

map

camel.dataformat.xstream.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.xstream.converters

使用自定义 XStream 转换器的类名称列表。class com 类型必须是 com. thoughtworks.xstream.converters.Converter

 

list

camel.dataformat.xstream.driver

使用自定义 XStream 驱动程序。该实例必须是 com. thoughtworks.xstream.io.HierarchicalStreamDriver 类型

 

字符串

camel.dataformat.xstream.driver-ref

要引用 registry 中的自定义 XStream 驱动程序。该实例必须是 com. thoughtworks.xstream.io.HierarchicalStreamDriver 类型

 

字符串

camel.dataformat.xstream.enabled

启用 xstream 数据格式

true

布尔值

camel.dataformat.xstream.encoding

设置要使用的编码

 

字符串

camel.dataformat.xstream.implicit-collections

添加用于任何未映射 XML 标签的默认隐式集合。

 

map

camel.dataformat.xstream.mode

处理重复引用的模式有: NO_REFERENCES ID_REFERENCES XPATH_RELATIVE_REFERENCES XPATH_ABSOLUTE_REFERENCES SINGLE_NODE_XPATH_RELATIVE_REFERENCES SINGLE_NODE_XPATH_ABSOLUTE_REFERENUER

 

字符串

camel.dataformat.xstream.omit-fields

防止字段被序列化。要省略一个字段,您必须始终提供声明类型,而不一定是转换的类型。

 

map

camel.dataformat.xstream.permissions

将控制在 xml/json 的未编出时允许使用哪些 Java 软件包和类 XStream 的权限添加到 Java Bean。必须在此处配置权限,或使用 JVM 系统属性进行全局配置。可以通过允许加号符号的语法指定权限,并且拒绝减us 符号。使用 . 作为前缀支持通配符。例如,允许 com.foo 和所有子软件包,然后选择 specfy com.foo。多个权限可以通过逗号分隔,如 com.foo.,-com.foo.bar.MySecretBean。以下默认权限始终包括: -,java.lang.,java.util.,除非它通过用键 org.apache.camel.xstream.permissions 指定 JVM 系统属性而覆盖。

 

字符串

ND

379.3. 使用 Java DSL

// lets turn Object messages into XML then send to MQSeries
from("activemq:My.Queue").
  marshal().xstream().
  to("mqseries:Another.Queue");

如果要配置 Camel 用于消息转换的 XStream 实例,只需传递对 DSL 级别的实例的引用。

XStream xStream = new XStream();
xStream.aliasField("money", PurchaseOrder.class, "cash");
// new Added setModel option since Camel 2.14
xStream.setModel("NO_REFERENCES");
...

from("direct:marshal").
  marshal(new XStreamDataFormat(xStream)).
  to("mock:marshaled");

379.4. XMLInputFactory and XMLOutputFactory

XStream 库使用 javax.xml.stream.XMLInputFactoryjavax.xml.stream.XMLOutputFactory,您可以控制应使用该工厂的哪个实施。

使用这种算法发现 Factory:1。使用 javax.xml.stream.XMLInputFactory , javax.xml.stream.XMLOutputFactory 系统属性。2.使用 JRE_HOME 目录中的 lib/xml.stream.properties 文件。3.使用 Services API (如果可用),通过查找 META-INF/services/javax.xml.stream.XMLInputFactory,META-INF/services/javax.xml.stream.XMLOutput factory 文件提供给 JRE。4.使用平台默认的 XMLInputFactory、XMLOutputFactory 实例。

379.5. 如何在 Xstream DataFormat 中设置 XML 编码?

在 Camel 2.2.0 中,您可以通过密钥 Exchange.CHARSET_NAME 设置 Xstream DataFormat 中的 XML 编码,或者从 DSL 或 Spring 配置设置 Xstream 上的编码属性。

from("activemq:My.Queue").
  marshal().xstream("UTF-8").
  to("mqseries:Another.Queue");

379.6. 设置 Xstream DataFormat 的类型权限

在 Camel 中,路由中始终可以使用自己的处理步骤,并阻止要路由到 XStream 的 unmarhall 步骤的特定 XML 文档。从 Camel 2.16.1, 2.15.5,您可以设置 XStream 的类型权限 ,以自动允许或拒绝某些类型的实例化。

Camel 使用的默认类型权限设置拒绝除 java.lang 和 java.util 包之外的所有类型。可以通过设置系统属性 org.apache.camel.xstream.permissions 来更改此设置。其值是一个以逗号分隔的权限术语的字符串,它们分别代表要允许或拒绝的类型,具体取决于术语是前缀的 ''(注 '' 可能被省略)或使用 '-'。

每个术语都可以包含一个通配符字符 ''。例如,值 "-,java.lang.,java.util." 表示拒绝除 java.lang.* 和 java.util.* 类以外的所有类型。将这个值设置为空字符串""恢复到默认的 XStream 的类型权限处理,该处理拒绝某些列入黑名单的类并允许其他人。

type permissions 设置可以通过设置其 type permissions 属性的独立 XStream DataFormat 实例进行扩展。

    <dataFormats>
        <xstream id="xstream-default"
                 permissions="org.apache.camel.samples.xstream.*"/>
        ...

第 380 章 YAML SnakeYAML DataFormat

作为 Camel 2.17 版提供

YAML 是一个数据格式,用于从 YAML 中汇总和解封 Java 对象。

对于对象 marshalling 的 YAML,Camel 提供三种常见 YAML 库的集成:

每个库都需要添加特殊的 camel 组件(请参阅"Dependency…​"段落进一步下)。默认情况下,Camel 使用 SnakeYAML 库。

380.1. YAML 选项

YAML SnakeYAML 数据格式支持 11 个选项,它们如下所列。

名称默认Java 类型描述

library

SnakeYAML

YAMLLibrary

要使用的 yaml 库。默认为 SnakeYAML

unmarshalTypeName

 

字符串

取消armshalling 时要使用的 java 类型的类名称

constructor

 

字符串

构造传入文档的 BaseConstructor。

representer

 

字符串

用来发出传出对象的代表。

dumperOptions

 

字符串

DumperOptions,以配置传出对象。

resolver

 

字符串

检测到隐式类型的解析器

useApplicationContextClassLoader

true

布尔值

使用 ApplicationContextClassLoader 作为自定义类Loader

prettyFlow

false

布尔值

在使用流风格时,强制发出程序生成用户 YAML 文档。

allowAnyType

false

布尔值

允许任何类被取消封(un-marshaled)

typeFilter

 

list

设置 SnakeYAML 允许的 un-marshall 类型

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

380.2. Spring Boot Auto-Configuration

组件支持 12 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.yaml-snakeyaml.allow-any-type

允许任何类被取消封(un-marshaled)

false

布尔值

camel.dataformat.yaml-snakeyaml.constructor

构造传入文档的 BaseConstructor。

 

字符串

camel.dataformat.yaml-snakeyaml.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.yaml-snakeyaml.dumper-options

DumperOptions,以配置传出对象。

 

字符串

camel.dataformat.yaml-snakeyaml.enabled

启用 yaml-snakeyaml dataformat

true

布尔值

camel.dataformat.yaml-snakeyaml.library

要使用的 yaml 库。默认为 SnakeYAML

 

YAMLLibrary

camel.dataformat.yaml-snakeyaml.pretty-flow

在使用流风格时,强制发出程序生成用户 YAML 文档。

false

布尔值

camel.dataformat.yaml-snakeyaml.representer

用来发出传出对象的代表。

 

字符串

camel.dataformat.yaml-snakeyaml.resolver

检测到隐式类型的解析器

 

字符串

camel.dataformat.yaml-snakeyaml.type-filter

设置 SnakeYAML 允许的 un-marshall 类型

 

list

camel.dataformat.yaml-snakeyaml.unmarshal-type-name

取消armshalling 时要使用的 java 类型的类名称

 

字符串

camel.dataformat.yaml-snakeyaml.use-application-context-class-loader

使用 ApplicationContextClassLoader 作为自定义类Loader

true

布尔值

警告

SnakeYAML 可以从 YAML 定义中加载任何类,这可能会导致安全漏洞。默认情况下,SnakeYAML DataForma 限制对象可以加载到标准 Java 对象,如 List 或 Long。如果要载入自定义 POJO,需要将类型添加到 SnakeYAML DataFormat 类型过滤器列表中。如果您的源是可信的,您可以将属性 allowAnyType 设置为 true,因此 SnakeYAML DataForma 不会对类型执行任何过滤器。

380.3. 使用 SnakeYAML 库的 YAML 数据格式

  • 将对象消息转换为 yaml,然后发送到 MQSeries

    from("activemq:My.Queue")
      .marshal().yaml()
      .to("mqseries:Another.Queue");
    from("activemq:My.Queue")
      .marshal().yaml(YAMLLibrary.SnakeYAML)
      .to("mqseries:Another.Queue");
  • 限制要从 YAML 加载的类

    // Creat a SnakeYAMLDataFormat instance
    SnakeYAMLDataFormat yaml = new SnakeYAMLDataFormat();
    
    // Restrict classes to be loaded from YAML
    yaml.addTypeFilters(TypeFilters.types(MyPojo.class, MyOtherPojo.class));
    
    from("activemq:My.Queue")
      .unmarshal(yaml)
      .to("mqseries:Another.Queue");

380.4. 在 Spring DSL 中使用 YAML

在 Spring DSL 中使用数据格式时,您需要首先声明数据格式。这是在 DataFormats XML 标签中进行的。

<dataFormats>
  <!--
    here we define a YAML data format with the id snake and that it should use
    the TestPojo as the class type when doing unmarshal. The unmarshalTypeName
    is optional
  -->
  <yaml
    id="snake"
    library="SnakeYAML"
    unmarshalTypeName="org.apache.camel.component.yaml.model.TestPojo"/>

  <!--
    here we define a YAML data format with the id snake-safe which restricts the
    classes to be loaded from YAML to TestPojo and those belonging to package
    com.mycompany
  -->
  <yaml id="snake-safe">
    <typeFilter value="org.apache.camel.component.yaml.model.TestPojo"/>
    <typeFilter value="com.mycompany\..*" type="regexp"/>
  </yaml>
</dataFormats>

然后您可以引用路由中的 id:

  <route>
    <from uri="direct:unmarshal"/>
    <unmarshal>
      <custom ref="snake"/>
    </unmarshal>
    <to uri="mock:unmarshal"/>
  </route>
  <route>
    <from uri="direct:unmarshal-safe"/>
    <unmarshal>
      <custom ref="snake-safe"/>
    </unmarshal>
    <to uri="mock:unmarshal-safe"/>
  </route>

380.5. SnakeYAML 的依赖项

要在 camel 路由中使用 YAML,您需要添加实现此数据格式的 camel-snakeyaml 的依赖项。

如果您使用 maven,您只能在 pom.xml 中添加以下内容,将最新的和最大发行版本的版本号替换(请参阅最新版本下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-snakeyaml</artifactId>
  <version>${camel-version}</version>
</dependency>

 

 

第 381 章 Yammer 组件

作为 Camel 2.12 版本提供

Yammer 组件允许您与 Yammer 企业社交网络进行交互。支持消耗消息、用户和用户关系以及创建新消息。

Yammer 使用 OAuth 2 进行所有客户端应用程序身份验证。为了与您的帐户结合使用 camel-yammer,您需要在 Yammer 中创建一个新应用程序,并授权应用程序对您的帐户的访问权限。最后,生成您的访问令牌。如需更多详细信息,请参见 https://developer.yammer.com/authentication/

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-yammer</artifactId>
    <version>${camel-version}</version>
</dependency>

381.1. URI 格式

yammer:[function]?[options]

381.2. 组件选项

Yammer 组件可以使用 Yammer 帐户设置进行配置,这些设置在使用之前需要进行配置。

Yammer 组件支持 5 个选项,它们如下所列。

名称描述默认类型

consumerKey (security)

消费者密钥

 

字符串

consumerSecret (security)

使用者 secret

 

字符串

accessToken (安全性)

访问令牌

 

字符串

config (advanced)

使用共享 yammer 配置

 

YammerConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

您还可以直接在端点中配置这些选项。

381.3. 端点选项

Yammer 端点使用 URI 语法配置:

yammer:function

使用以下路径和查询参数:

381.3.1. 路径名(1 参数):

名称描述默认类型

function

要使用的功能

 

YammerFunctionType

381.3.2. 查询参数(28 参数):

名称描述默认类型

useJson (common)

如果要使用原始 JSON 而不是转换为 POJO,则设置为 true。

false

布尔值

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

delay (consumer)

millis 中轮询之间的延迟

5000

long

limit (consumer)

仅返回指定的消息数。适用于 threaded=true 和 threaded=extended。

-1

int

newerThan (consumer)

返回比以数字字符串指定的消息 ID 的消息。这应在轮询新消息时使用。如果您正在查看消息,并且返回最新消息返回为 3516,则可以通过参数 newerThan=3516 发出请求,以确保您还没有在页面上获取消息的重复副本。

-1

int

olderThan (consumer)

返回比以数字字符串指定的消息 ID 旧消息。这可用于对消息进行分页。例如,如果您当前查看 20 个信息并且最旧的是第 2912,可以在您的请求中附加旧的Than=2912,以便在您看到之前获取 20 个信息。

-1

int

sendEmptyMessageWhenIdle (consumer)

如果轮询使用者没有轮询任何文件,您可以启用这个选项来发送空消息(无正文)。

false

布尔值

threaded (consumer)

threaded=true 将仅返回每个线程中的第一个消息。此参数用于显示消息线程折叠的应用程序。threaded=extended 将以最新活动的顺序返回线程启动器消息以及两个最新消息,因为它们在 Yammer Web 界面的默认视图中查看。

 

字符串

userId (consumer)

用户 ID

 

字符串

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

pollStrategy (consumer)

可插拔 org.apache.camel.PollingConsumerPollingStrategy 允许您提供自定义实施来控制在轮询操作中通常会发生错误处理,然后再在 Camel 中创建并被路由。

 

PollingConsumerPoll Strategy

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

backoffErrorThreshold (scheduler)

后续错误轮询(因某些错误导致的失败)的数量,在 backoffMultipler 应该启动前发生。

 

int

backoffIdleThreshold (scheduler)

后续闲置轮询的数量,在 backoffMultipler 应该启动之前发生。

 

int

backoffMultiplier (scheduler)

如果行中有多个后续闲置/errors,让调度的轮询消费者重新关闭。然后,倍数是下一次实际尝试发生前跳过的轮询数量。当使用这个选项时,还必须配置 backoffIdleThreshold 和/or backoffErrorThreshold。

 

int

greedy (scheduler)

如果启用了 greedy,则 ScheduledPollConsumer 将立即再次运行,如果上一运行轮询了 1 或更多消息。

false

布尔值

initialDelay (scheduler)

第一次轮询启动前的毫秒。您还可以使用单位(60 秒)、5m30s (5 分钟和 30 秒)和 1h (1 小时)指定时间值。

1000

long

runLoggingLevel (scheduler)

消费者日志轮询轮询时启动/完成日志行。此选项允许您为其配置日志级别。

TRACE

LoggingLevel

scheduledExecutorService (scheduler)

允许配置用于使用者的自定义/共享线程池。默认情况下,每个使用者都有自己的单个线程池。

 

ScheduledExecutor 服务

调度程序 (scheduler)

使用来自 camel-spring 或 camel-quartz2 组件的 cron 调度程序

none

ScheduledPollConsumer Scheduler

schedulerProperties (scheduler)

在使用自定义调度程序或任何基于 Spring 的调度程序时配置额外属性。

 

map

startScheduler (scheduler)

调度程序是否应自动启动。

true

布尔值

timeUnit (scheduler)

初始延迟和延迟选项的时间单位。

毫秒

TimeUnit

useFixedDelay (scheduler)

控制是否使用固定延迟或固定率。详情请参阅 JDK 中的 ScheduledExecutorService。

true

布尔值

accessToken (安全性)

所需的 访问令牌

 

字符串

consumerKey (security)

所需的 消费者密钥

 

字符串

consumerSecret (security)

所需的 消费者 secret

 

字符串

381.4. Spring Boot Auto-Configuration

组件支持 18 个选项,如下所示。

名称描述默认类型

camel.component.yammer.access-token

访问令牌

 

字符串

camel.component.yammer.config.access-token

访问令牌

 

字符串

camel.component.yammer.config.consumer-key

消费者密钥

 

字符串

camel.component.yammer.config.consumer-secret

使用者 secret

 

字符串

camel.component.yammer.config.delay

millis 中轮询之间的延迟

5000

Long

camel.component.yammer.config.function

要使用的功能

 

字符串

camel.component.yammer.config.function-type

要使用的功能

 

YammerFunctionType

camel.component.yammer.config.limit

仅返回指定的消息数。适用于 threaded=true 和 threaded=extended。

-1

整数

camel.component.yammer.config.newer-than

返回比以数字字符串指定的消息 ID 的消息。这应在轮询新消息时使用。如果您正在查看消息,并且返回最新消息返回为 3516,则可以通过参数 newerThan=3516 发出请求,以确保您还没有在页面上获取消息的重复副本。

-1

整数

camel.component.yammer.config.older-than

返回比以数字字符串指定的消息 ID 旧消息。这可用于对消息进行分页。例如,如果您当前查看 20 个信息并且最旧的是第 2912,可以在您的请求中附加旧的Than=2912,以便在您看到之前获取 20 个信息。

-1

整数

camel.component.yammer.config.requestor

  

ApiRequestor

camel.component.yammer.config.threaded

threaded=true 将仅返回每个线程中的第一个消息。此参数用于显示消息线程折叠的应用程序。threaded=extended 将以最新活动的顺序返回线程启动器消息以及两个最新消息,因为它们在 Yammer Web 界面的默认视图中查看。

 

字符串

camel.component.yammer.config.use-json

如果要使用原始 JSON 而不是转换为 POJO,则设置为 true。

false

布尔值

camel.component.yammer.config.user-id

用户 ID

 

字符串

camel.component.yammer.consumer-key

消费者密钥

 

字符串

camel.component.yammer.consumer-secret

使用者 secret

 

字符串

camel.component.yammer.enabled

启用 yammer 组件

true

布尔值

camel.component.yammer.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

381.5. 消耗消息

Yammer 组件为消耗消息提供了多个端点:

URI描述
 yammer:messages?[options]

用户的所有公共消息(其访问令牌用于进行 API 调用)Yammer 网络。对应于 Yammer Web 界面中的"所有"对话。

 yammer:my_feed?[options]

用户反馈,根据他们在"Following"和"回复"对话之间作出的选择。

yammer:algo?[options]

与"Top"对话对应的用户的算法源,这是大多数用户在 Yammer Web 界面中看到的内容。

yammer:following?[options]

"后续"反馈,是涉及用户所遵循的人员、组和主题的对话。

yammer:sent?[options]

用户发送的所有消息。

yammer:private?[options]

用户接收的专用消息。

yammer:received?[options]

Camel 2.12.1: 用户接收的所有消息

381.5.1. 消息格式

默认情况下,所有消息都会转换为 org.apache.camel.component.yammer.model 包中提供的 POJO 模型。来自 yammer 的原始消息采用 JSON。对于消耗和生成端点的所有消息,将返回 Messages 对象。使用类似以下的路由示例:

from("yammer:messages?consumerKey=aConsumerKey&consumerSecret=aConsumerSecretKey&accessToken=aAccessToken")
    .to("mock:result");

和 lets 表示 yammer 服务器返回:

{
    "messages":[
        {
            "replied_to_id":null,
            "network_id":7654,
            "url":"https://www.yammer.com/api/v1/messages/305298242",
            "thread_id":305298242,
            "id":305298242,
            "message_type":"update",
            "chat_client_sequence":null,
            "body":{
                "parsed":"Testing yammer API...",
                "plain":"Testing yammer API...",
                "rich":"Testing yammer API..."
            },
            "client_url":"https://www.yammer.com/",
            "content_excerpt":"Testing yammer API...",
            "created_at":"2013/06/25 18:14:45 +0000",
            "client_type":"Web",
            "privacy":"public",
            "sender_type":"user",
            "liked_by":{
                "count":1,
                "names":[
                    {
                        "permalink":"janstey",
                        "full_name":"Jonathan Anstey",
                        "user_id":1499642294
                    }

                ]

            },
            "sender_id":1499642294,
            "language":null,
            "system_message":false,
            "attachments":[

            ],
            "direct_message":false,
            "web_url":"https://www.yammer.com/redhat.com/messages/305298242"
        },
        {
            "replied_to_id":null,
            "network_id":7654,
            "url":"https://www.yammer.com/api/v1/messages/294326302",
            "thread_id":294326302,
            "id":294326302,
            "message_type":"system",
            "chat_client_sequence":null,
            "body":{
                "parsed":"(Principal Software Engineer) has [[tag:14658]] the redhat.com network. Take a moment to welcome Jonathan.",
                "plain":"(Principal Software Engineer) has #joined the redhat.com network. Take a moment to welcome Jonathan.",
                "rich":"(Principal Software Engineer) has #joined the redhat.com network. Take a moment to welcome Jonathan."
            },
            "client_url":"https://www.yammer.com/",
            "content_excerpt":"(Principal Software Engineer) has #joined the redhat.com network. Take a moment to welcome Jonathan.",
            "created_at":"2013/05/10 19:08:29 +0000",
            "client_type":"Web",
            "sender_type":"user",
            "privacy":"public",
            "liked_by":{
                "count":0,
                "names":[

                ]

            }
        }
        ]

    }

Camel 将摘要到包含 2 消息 对象的 Messages 对象中。如下所示,有一个丰富的对象模型,可轻松获得您需要的信息:

Exchange exchange = mock.getExchanges().get(0);
Messages messages = exchange.getIn().getBody(Messages.class);

assertEquals(2, messages.getMessages().size());
assertEquals("Testing yammer API...", messages.getMessages().get(0).getBody().getPlain());
assertEquals("(Principal Software Engineer) has #joined the redhat.com network. Take a moment to welcome Jonathan.", messages.getMessages().get(1).getBody().getPlain());

具体说,通过向您的 URI 添加 使用Json=false 选项,则将此数据进行汇总为 POJO 不可行。

381.6. 创建消息

要在当前用户的帐户中创建新消息,您可以使用以下 URI:

yammer:messages?[options]

当前的 Camel 消息正文用于设置 Yammer 消息的文本。响应正文将包括新消息格式的格式与使用消息时(如默认 Messages 对象)相同。

将这个路由用于实例:

from("direct:start")
    .to("yammer:messages?consumerKey=aConsumerKey&consumerSecret=aConsumerSecretKey&accessToken=aAccessToken")
    .to("mock:result");

通过向 direct:start 端点发送 来自 Camel!"消息正文"的"Hi

template.sendBody("direct:start", "Hi from Camel!");

将在服务器上的当前用户帐户中创建新消息,并将此新消息返回到 Camel,并转换为 Messages 对象。与消耗消息时一样,您可以交集 Messages 对象:

Exchange exchange = mock.getExchanges().get(0);
Messages messages = exchange.getIn().getBody(Messages.class);

assertEquals(1, messages.getMessages().size());
assertEquals("Hi from Camel!", messages.getMessages().get(0).getBody().getPlain());

381.7. 检索用户关系

Yammer 组件可以检索用户关系:

yammer:relationships?[options]

381.8. 检索用户

Yammer 组件为检索用户提供了多个端点:

URI描述
yammer:users?[options]

检索当前用户的 Yammer 网络中的用户。

yammer:current?[options]

查看当前用户的数据。

381.9. 使用 enricher

它有时会使用用户或关系消费者使用增强模式而不是由其中一个轮询消费者发起的路由。这是因为用户会重复触发,但通常您设置延迟。如果只想查看用户数据或获取一次消息,最好一次调用消费者,然后使用您的路由获得一个信息。

我们假设您有一个路由,在某个时间点需要退出并获取当前用户的用户数据。使用 pollEnrich DSL 方法,而不是再次轮询此用户:

from("direct:start")
    .pollEnrich("yammer:current?consumerKey=aConsumerKey&consumerSecret=aConsumerSecretKey&accessToken=aAccessToken")
    .to("mock:result");

这将退出并获取当前用户的 用户 对象,并将其设置为 Camel 消息正文。

381.10. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 382 章 Zendesk 组件

作为 Camel 版本 2.19 可用

Zendesk 组件提供对可通过 zendesk-java-client 访问的所有 zendesk.com API 的访问。它允许生成信息来管理 Zendesk ticket、用户、机构等。

Maven 用户需要在这些组件的 pom.xml 中添加以下依赖项:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-zendesk</artifactId>
        <version>${camel-version}</version>
    </dependency>

382.1. Zendesk 选项

Zendesk 组件支持 3 个选项,它们如下。

名称描述默认类型

configuration (common)

使用共享配置

 

ZendeskConfiguration

zendesk (advanced)

使用共享 Zendesk 实例。

 

Zendesk

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

Zendesk 端点使用 URI 语法进行配置:

zendesk:methodName

使用以下路径和查询参数:

382.1.1. 路径名(1 参数):

名称描述默认类型

methodName

需要使用 什么操作

 

字符串

382.1.2. 查询参数(10 参数):

名称描述默认类型

inBody (common)

设置在 Exchange In Body 中传递的参数名称

 

字符串

serverUrl (common)

要连接的服务器 URL。

 

字符串

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

oauthToken (security)

OAuth 令牌。

 

字符串

密码 (安全)

密码。

 

字符串

令牌 (安全性)

安全令牌。

 

字符串

username (security)

用户名。

 

字符串

382.2. Spring Boot Auto-Configuration

组件支持 9 个选项,如下所示。

名称描述默认类型

camel.component.zendesk.configuration.method-name

要使用的操作

 

字符串

camel.component.zendesk.configuration.oauth-token

OAuth 令牌。

 

字符串

camel.component.zendesk.configuration.password

密码。

 

字符串

camel.component.zendesk.configuration.server-url

要连接的服务器 URL。

 

字符串

camel.component.zendesk.configuration.token

安全令牌。

 

字符串

camel.component.zendesk.configuration.username

用户名。

 

字符串

camel.component.zendesk.enabled

启用 zendesk 组件

true

布尔值

camel.component.zendesk.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.zendesk.zendesk

使用共享 Zendesk 实例。选项是一个 org.zendesk.client.v2.Zendesk 类型。

 

字符串

382.3. URI 格式

    zendesk://endpoint?[options]

382.4. 制作者端点:

制作者端点可以使用下描述的端点名称和关联选项。

382.5. 消费者端点:

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

382.6. 邮件标题

任何选项都可以在带有 CamelZendesk. 前缀的制作者端点的消息标头中提供。在主体中,参数名称与原始 org.zendesk.client.v2.Zendesk 类中每个 API 方法的强制名称相同。但是,其中一些被重命名为其他名称,以避免在 camel API 组件框架中发生冲突。要查看实际参数名称,请检查 org.apache.camel.component.zendesk.internal.ZendeskApiMethod

382.7. 邮件正文

所有结果消息正文都使用 Zendesk Java 客户端提供的对象。producer 端点可以在 inBody endpoint 参数中为传入消息正文指定选项名称。

第 383 章 zip Deflate Compression DataFormat

作为 Camel 2.12 版本提供

Zip Data Format 是消息压缩和 de-compression 格式。在使用 Zip 压缩进行提取的信息可以使用 Zip 解压缩前,在端点被消耗前使用 Zip 解压缩。当您处理大量 XML 和基于文本的载荷时,压缩功能非常有用。它促进了网络带宽的优化使用,同时减少少量成本,以便在端点压缩和解压缩有效负载。

INFO:*关于 files*About,使用 Files*About,Zip 数据格式没有对文件有特殊支持。这意味着,在使用大文件时,整个文件内容会加载到内存中。这可能会改变,以便基于流式的解决方案具有低内存占用量。

383.1. 选项

Zip Deflate Compression dataformat 支持 2 选项,这些选项如下。

名称默认Java 类型描述

compressionLevel

-1

整数

要指定 0-9. -1 之间的特定压缩方式,1 是默认的压缩,0 也不压缩,因此 9 是最佳压缩。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

383.2. marshal

在这个示例中,我们为压缩的有效负载提供一个常规文本/XML 有效负载,使用 zip 压缩 Deflater.BEST_COMPRESSION 并将其发送名为 MY_QUEUE 的 ActiveMQ 队列。

from("direct:start").marshal().zip(Deflater.BEST_COMPRESSION).to("activemq:queue:MY_QUEUE");

或者,如果使用默认设置,可以将其发送为

from("direct:start").marshal().zip().to("activemq:queue:MY_QUEUE");

383.3. unmarshal

在本例中,我们从名为 MY_QUEUE 的 ActiveMQ 队列提供了 zipped 有效负载,并将其转发到 UnZippedMessageProcessor。请注意,在 marshalling 期间使用的压缩级别应当与在未总结期间被使用期间使用的压缩级别相同,以避免出错。

from("activemq:queue:MY_QUEUE").unmarshal().zip().process(new UnZippedMessageProcessor()); 

383.4. 依赖项

此数据格式以 camel-core 提供,因此不需要额外的依赖项。

第 384 章 zip File DataFormat

作为 Camel 2.11 版本提供

Zip File Data Format 是消息压缩和压缩格式。可将消息打包(压缩的)到包含单一条目的 Zip 文件,而包含单一条目的 Zip 文件则可能会被解除(压缩的)到原始文件内容。此数据格式支持 ZIP64,只要 Java 7 或更高版本被使用]。

384.1. zipfile 选项

Zip File dataformat 支持 4 选项,如下所示。

名称默认Java 类型描述

usingIterator

false

布尔值

如果 zip 文件具有多个条目,则将此选项设为 true,则允许使用 splitter EIP 在流传输模式中使用迭代器对数据进行分割。

allowEmptyDirectory

false

布尔值

如果 zip 文件包含多个条目,则将此选项设置为 true,允许在目录为空时获得它程序。

preservePathElements

false

布尔值

如果文件名包含 path 元素,则将此选项设置为 true,允许在 zip 文件中维护路径。

contentTypeHeader

false

布尔值

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

384.2. Spring Boot Auto-Configuration

组件支持 5 个选项,它们如下所列。

名称描述默认类型

camel.dataformat.zipfile.allow-empty-directory

如果 zip 文件包含多个条目,则将此选项设置为 true,允许在目录为空时获得它程序。

false

布尔值

camel.dataformat.zipfile.content-type-header

如果数据格式能够这样做,则数据格式是否应该以 data 格式设置 Content-Type 标头。例如,用于数据格式的 application/xml (数据格式)或 application/json 用于数据格式 marshalling to JSon etc。

false

布尔值

camel.dataformat.zipfile.enabled

启用 zipfile dataformat

true

布尔值

camel.dataformat.zipfile.preserve-path-elements

如果文件名包含 path 元素,则将此选项设置为 true,允许在 zip 文件中维护路径。

false

布尔值

camel.dataformat.zipfile.using-iterator

如果 zip 文件具有多个条目,则将此选项设为 true,则允许使用 splitter EIP 在流传输模式中使用迭代器对数据进行分割。

false

布尔值

ND

384.3. marshal

在本例中,我们使用 Zip 文件压缩将常规文本/XML 有效负载附加到压缩有效负载,并将其发送到名为 MY_QUEUE 的 ActiveMQ 队列。

from("direct:start")
    .marshal().zipFile()
    .to("activemq:queue:MY_QUEUE");

创建 Zip 文件中的 Zip 条目的名称基于传入的 CamelFileName 消息标头,即文件组件使用的标准消息标头。另外,传出的 CamelFileName 邮件标头会自动设置为传入 CamelFileName 消息标头的值,其带有 ".zip" 后缀。例如,如果以下路由在输入目录中找到名为"test.txt"的文件,则输出将是名为 "test.txt.zip" 的 Zip 文件,其中包含一个名为 "test.txt" 的单个 Zip 条目:

from("file:input/directory?antInclude=*/.txt")
    .marshal().zipFile()
    .to("file:output/directory");

如果没有传入的 CamelFileName 邮件标题(例如,如果文件组件不是使用者),则消息 ID 将被默认使用,因为消息 ID 通常是一个唯一生成的 ID,所以您将以文件名结尾,如 ID-MACHINENAME-2443-1211718892437-1-0.zip。如果要覆盖此行为,可以在路由中明确设置 CamelFileName 标头的值:

from("direct:start")
    .setHeader(Exchange.FILE_NAME, constant("report.txt"))
    .marshal().zipFile()
    .to("file:output/directory");

此路由会在输出目录中生成名为 "report.txt.zip" 的 Zip 条目,其中包含一个名为 "report.txt" 的 Zip 条目。

384.4. unmarshal

在本例中,我们将 Zip 文件有效负载从名为 MY_QUEUE 的 ActiveMQ 队列解压缩到其原始格式,并将它转发到 UnZippedMessageProcessor

from("activemq:queue:MY_QUEUE")
    .unmarshal().zipFile()
    .process(new UnZippedMessageProcessor());

如果 zip 文件具有多个条目,则 ZipFileDataFormat 的使用Iterator 选项为 true,您可以使用 splitter 来做进一步工作。

ZipFileDataFormat zipFile = new ZipFileDataFormat();
zipFile.setUsingIterator(true);

from("file:src/test/resources/org/apache/camel/dataformat/zipfile/?consumer.delay=1000&noop=true")
    .unmarshal(zipFile)
    .split(body(Iterator.class)).streaming()
        .process(new UnZippedMessageProcessor())
    .end();

或者您可以直接将 ZipSplitter 用作 splitter 的表达式

from("file:src/test/resources/org/apache/camel/dataformat/zipfile?consumer.delay=1000&noop=true")
    .split(new ZipSplitter()).streaming()
        .process(new UnZippedMessageProcessor())
    .end();

384.5. aggregate

注意

请注意,这种聚合策略需要预先完成检查才能正常工作。

在本例中,我们将输入目录中找到的所有文本文件聚合到一个存储在输出目录中的 Zip 文件中。 

from("file:input/directory?antInclude=*/.txt")
    .aggregate(constant(true), new ZipAggregationStrategy())
        .completionFromBatchConsumer().eagerCheckCompletion()
        .to("file:output/directory");

传出的 CamelFileName 消息标头使用 java.io.File.createTempFile 创建,带有 ".zip" 后缀。 如果要覆盖此行为,您可以在路由中明确设置 CamelFileName 标头的值:

from("file:input/directory?antInclude=*/.txt")
    .aggregate(constant(true), new ZipAggregationStrategy())
        .completionFromBatchConsumer().eagerCheckCompletion()
        .setHeader(Exchange.FILE_NAME, constant("reports.zip"))
        .to("file:output/directory");

384.6. 依赖项

要在 camel 路由中使用 Zip 文件,您需要添加对 camel-zipfile 的依赖项,以实施此数据格式。

如果使用 Maven,您只需在 pom.xml 中添加以下内容,替换最新和最长版本的版本号(请参阅最新版本的下载页面)。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-zipfile</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

384.7. Zipkin 组件

可从 Camel 2.18 开始

camel-zipkin 组件用于使用 zipkin 来跟踪和计时的 Camel 消息。

事件(span)捕获用于传入和发送到 Camel 中的/传出消息。

注意

在 Camel 2.22.0 中,计划重构 Camel-zipkin,使其不使用 zipkin-scribe,但使用默认的 http 传输。此操作可能会导致向后兼容。

这意味着您需要配置哪个 Camel 端点映射到 zipkin 服务名称。

映射可通过以下方式进行配置:

  • 路由 id - Camel 路由 id
  • endpoint url - Camel 端点 url

对于这两种类型,您可以使用通配符和正则表达式来匹配,使用来自 Intercept 的规则。

要匹配您可以模式中使用 * 的所有 Camel 消息,并将其配置为相同的服务名称。

如果没有配置映射,Camel 将回退,并使用端点 uri 作为服务名称。 
但是,建议您配置服务映射,以便您可以在名称中使用人类可读的名称而不是 Camel 端点 uri。

Camel 将自动配置一个 span 报告程序,但没有明确配置,如果到 zipkin 收集程序的主机名和端口都被配置为环境变量

  • ZIPKIN_COLLECTOR_HTTP_SERVICE_HOST - http 主机名
  • ZIPKIN_COLLECTOR_HTTP_SERVICE_PORT - 端口号

或者

  • ZIPKIN_COLLECTOR_THRIFT_SERVICE_HOST - Scribe (Thrift RPC) hostname
  • ZIPKIN_COLLECTOR_THRIFT_SERVICE_PORT - 端口号

这使得在平台可以在 linux 容器中运行应用程序的容器平台中很容易使用 camel-zipkin,其中服务配置作为环境变量提供。

384.8. 选项

选项默认值描述

速率限制

1.0f

配置一个速率,决定通过 zipkin 跟踪多少事件。速率表示为百分比(1.0f = 100%,0.5f 为 50%,0.1f 为 10%。

spanReporter

 

必需: 用于将 zipkin span 事件发送到 zipkin 服务器的报告程序。

serviceName

 

使用与所有 Camel 事件匹配的全局服务名称

clientServiceMappings

 

将与 Camel 事件匹配的 客户端 服务映射设置为给定的 zipkin 服务名称。内容是一个 Map<String,String>,其中键是模式,值是服务名称。该模式使用来自 Intercept 的规则。

serverServiceMappings

 

将与 Camel 事件匹配的 服务器 服务映射设置为给定的 zipkin 服务名称。内容是一个 Map<String,String>,其中键是模式,值是服务名称。该模式使用来自 Intercept 的规则。

excludePatterns

 

设置 exclude pattern (s),使用 zipkin 为模式匹配的 Camel 消息禁用追踪。内容是一个 Set<String>,其中键是一个模式。该模式使用来自 Intercept 的规则。

includeMessageBody

false

是否在 zipkin trace 中包含 Camel 消息正文。不建议在生产环境中使用,或者当有大有效负载时。您可以通过配置 max debug 日志大小 来限制大小。 

includeMessageBodyStreams

false

是否包括了基于 zipkin trace 的消息正文。这需要对 CamelContext 的路由或全局启用流缓存。不建议在生产环境中使用,或者当有大有效负载时。您可以通过配置 max debug 日志大小 来限制大小。  

384.9. Spring Boot Auto-Configuration

组件支持 10 个选项,如下所示。

名称描述默认类型

camel.zipkin.client-service-mappings

将与 Camel 事件匹配的客户端服务映射设置为给定的 zipkin 服务名称。键是模式,value 是服务名称。

 

map

camel.zipkin.endpoint

为 zipkin 的 <a href="http://zipkin.io/zipkin-api/#/">v2 api</a>设置 POST URL,通常为 "http://zipkinhost:9411/api/v2/spans"

 

字符串

camel.zipkin.exclude-patterns

设置 exclude pattern (s),使用 zipkin 为模式匹配的 Camel 消息禁用追踪。

 

Set

camel.zipkin.host-name

如果发送范围到远程 zipkin scribe (thrift RPC)收集器,则设置主机名。

 

字符串

camel.zipkin.include-message-body

是否在 zipkin trace 中包含 Camel 消息正文。不建议在生产环境中使用,或者当有大有效负载时。您可以配置 camel.springboot.log-debug-max-chars 选项来限制大小。

false

布尔值

camel.zipkin.include-message-body-streams

是否包括了基于 zipkin trace 的消息正文。不建议在生产环境中使用,或者当有大有效负载时。您可以配置 camel.springboot.log-debug-max-chars 选项来限制大小。

false

布尔值

camel.zipkin.port

如果向远程 zipkin scribe (第rift RPC)收集器发送 span,则设置端口。

0

整数

camel.zipkin.rate

配置一个速率,决定通过 zipkin 跟踪多少事件。速率表示为百分比(1.0f = 100%,0.5f 为 50%,0.1f 为 10%。

1

浮点值

camel.zipkin.server-service-mappings

将与 Camel 事件匹配的服务器服务映射设置为给定的 zipkin 服务名称。键是模式,value 是服务名称。

 

map

camel.zipkin.service-name

使用与所有 Camel 事件匹配的全局服务名称

 

字符串

384.10. 示例

要启用 camel-zipkin,您需要首先配置

ZipkinTracer zipkin = new ZipkinTracer();
// Configure a reporter, which controls how often spans are sent
//   (the dependency is io.zipkin.reporter2:zipkin-sender-okhttp3)
sender = OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans");
zipkin.setSpanReporter(AsyncReporter.create(sender));
// and then add zipkin to the CamelContext
zipkin.init(camelContext);

上述配置将跟踪 Camel 路由中的所有传入和传出消息。 

要在 XML 中使用 ZipkinTracer,所有您需要做的就是定义 scribe 和 zipkin tracer Bean。Camel 将自动发现并使用它们。

  <!-- configure how to reporter spans to a Zipkin collector
          (the dependency is io.zipkin.reporter2:zipkin-reporter-spring-beans) -->
  <bean id="http" class="zipkin2.reporter.beans.AsyncReporterFactoryBean">
    <property name="sender">
      <bean id="sender" class="zipkin2.reporter.beans.OkHttpSenderFactoryBean">
        <property name="endpoint" value="http://localhost:9411/api/v2/spans"/>
      </bean>
    </property>
    <!-- wait up to half a second for any in-flight spans on close -->
    <property name="closeTimeout" value="500"/>
  </bean>

  <!-- setup zipkin tracer -->
  <bean id="zipkinTracer" class="org.apache.camel.zipkin.ZipkinTracer">
    <property name="serviceName" value="dude"/>
    <property name="spanReporter" ref="http"/>
  </bean>

384.10.1. ServiceName

但是,如果要将 Camel 端点映射到人类友好逻辑名称,您可以添加映射

  • ServiceName *

您可以配置所有事件将回退和使用的全局服务名称,例如:

zipkin.setServiceName("invoices");

这将对所有传入和传出的 zipkin trace 使用相同的服务名称。如果您的应用程序使用不同的服务,您应该将它们映射到更精细的客户端/服务器服务映射

384.10.2. 客户端和服务器服务映射

  • ClientServiceMappings
  • ServerServiceMappings

如果您的应用程序托管其他人可以调用的服务,您可以将 Camel 路由端点映射到服务器服务映射。例如,假设您的 Camel 应用程序有以下路由:

from("activemq:queue:inbox")
  .to("http:someserver/somepath");

而且您要将其设置为服务器服务,您可以添加以下映射:

zipkin.addServerServiceMapping("activemq:queue:inbox", "orders");

然后,当从该 inbox 队列中使用消息时,它会使用服务名称 'orders' 变成 zipkin server event。

现在,假设调用 http:someserver/somepath 也是要映射到客户端服务名称的服务,它可作为:

zipkin.addClientServiceMapping("http:someserver/somepath", "audit");

然后,在同一 Camel 应用程序中,您要将进入和传出端点映射到不同的 zipkin 服务名称。

您可以在服务映射中使用通配符。要匹配对同一 HTTP 服务器的所有传出调用,您可以:

zipkin.addClientServiceMapping("http:someserver*", "audit");

384.11. 映射规则

服务器的服务名称映射使用下列规则进行

  1. 是否存在与来自 端点的 endpoint uri 匹配的排除模式?如果 yes,则跳过。
  2. 在 serviceServiceMapping 中是否存在与来自 端点的端点 uri 匹配的 serviceServiceMapping 吗?如果是,则使用找到的服务名称
  3. 在 serviceServiceMapping 中是否存在与当前路由的路由 ID 匹配的 serviceServiceMapping 吗?如果是,则使用找到的服务名称
  4. serviceServiceMapping 中是否存在与启动交换的原始路由 ID 匹配的匹配项?如果是,则使用找到的服务名称
  5. 未找到服务名称,不会按 zipkin 跟踪交换

客户端的服务名称映射使用以下规则进行

  1. 是否存在与来自 端点的 endpoint uri 匹配的排除模式?如果 yes,则跳过。
  2. clientServiceMapping 中是否存在与要发送到消息的端点端点的端点 uri 匹配的匹配项?如果是,则使用找到的服务名称
  3. clientServiceMapping 中是否存在与当前路由的路由 ID 匹配的匹配项?如果是,则使用找到的服务名称
  4. clientServiceMapping 中是否存在与启动交换的原始路由 ID 匹配的匹配项?如果是,则使用找到的服务名称
  5. 未找到服务名称,不会按 zipkin 跟踪交换

384.11.1. 没有客户端或服务器映射

如果没有配置客户端或服务器服务映射,CamelZipkin 以回退模式运行,并使用 endpoint uris 作为服务名称。

在上例中,这意味着服务名称将被定义为您自己添加以下代码:

zipkin.addServerServiceMapping("activemq:queue:inbox", "activemq:queue:inbox");
zipkin.addClientServiceMapping("http:someserver/somepath", "http:someserver/somepath");

这不是推荐的方法,但可以在不执行任何服务名称映射的情况下快速启动并运行。但是,当您在基础架构中有多个系统时,您应该考虑使用人类可读的服务名称,而是映射到,而不使用 camel 端点 uri。

384.12. camel-zipin-starter

如果您使用 Spring Boot,可以添加 camel-zipkin-starter 依赖项,并使用 @CamelZipkin 注解主类来打开 zipkin。然后,您可以在 application.properties 文件中配置 camel-zipkin,您可以在其中为 Zipkin Server 配置主机名和端口号,以及以上选项表中列出的所有其他选项。

您可以在 camel-example-zipkin中找到此示例

第 385 章 ZooKeeper Component

作为 Camel 版本 2.9 提供。

ZooKeeper 组件允许与 ZooKeeper 集群交互,并将以下功能公开给 Camel:

  1. 以任何 ZooKeeper 创建模式创建节点。
  2. 获取和设置任意集群节点的数据内容(所设置的数据必须转换为 字节[])。
  3. 创建并检索附加到特定节点的子节点。
  4. 利用 ZooKeeper 与 ZooKeeper 协调的分布式 RoutePolicy,以确定交换是否应该被处理。

Maven 用户需要将以下依赖项添加到其 pom.xml 中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-zookeeper</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

385.1. URI 格式

zookeeper://zookeeper-server[:port][/path][?options]

来自 URI 的路径在 ZooKeeper 服务器中指定节点(a.k.a)。znode),作为端点的目标:

385.2. 选项

ZooKeeper 组件支持 2 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享的 ZooKeeperConfiguration

 

ZooKeeperConfiguration

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

ZooKeeper 端点使用 URI 语法配置:

zookeeper:serverUrls/path

使用以下路径和查询参数:

385.2.1. 路径名(2 参数):

名称描述默认类型

serverUrls

所需的 zookeeper 服务器主机(多个服务器可以通过逗号分隔)

 

字符串

path

ZooKeeper 服务器中 所需的 节点(也称为 znode)

 

字符串

385.2.2. 查询参数(12 参数):

名称描述默认类型

awaitExistence (common)

未使用 未使用

true

布尔值

listChildren (common)

应该列出节点的子项

false

布尔值

timeout (common)

在超时前,等待连接的时间间隔。

5000

int

backoff (consumer)

重试前在出错后返回的时间间隔。

5000

long

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

repeat (consumer)

应对对 znode 的更改"观察"并重复处理。

false

布尔值

sendEmptyMessageOnDelete (consumer)

删除 znode 后,应该向使用者发送空消息

true

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

create (producer)

如果端点当前还不存在,该端点应创建该节点。

false

布尔值

createMode (producer)

应该用于新创建的节点的创建模式

EPHEMERAL

字符串

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

385.3. Spring Boot Auto-Configuration

组件支持 57 选项,它们如下所列。

名称描述默认类型

camel.component.zookeeper.cluster.service.attributes

自定义服务属性。

 

map

camel.component.zookeeper.cluster.service.auth-info-list

  

list

camel.component.zookeeper.cluster.service.base-path

  

字符串

camel.component.zookeeper.cluster.service.connection-timeout

  

Long

camel.component.zookeeper.cluster.service.connection-timeout-unit

  

TimeUnit

camel.component.zookeeper.cluster.service.curator-framework

  

CuratorFramework

camel.component.zookeeper.cluster.service.enabled

如果 zookeeper 集群服务应启用或不应当启用,则设置为 false。

false

布尔值

camel.component.zookeeper.cluster.service.id

Cluster Service ID

 

字符串

camel.component.zookeeper.cluster.service.max-close-wait

  

Long

camel.component.zookeeper.cluster.service.max-close-wait-unit

  

TimeUnit

camel.component.zookeeper.cluster.service.namespace

  

字符串

camel.component.zookeeper.cluster.service.nodes

  

list

camel.component.zookeeper.cluster.service.order

服务查找顺序/优先级.

 

整数

camel.component.zookeeper.cluster.service.reconnect-base-sleep-time

  

Long

camel.component.zookeeper.cluster.service.reconnect-base-sleep-time-unit

  

TimeUnit

camel.component.zookeeper.cluster.service.reconnect-max-retries

  

整数

camel.component.zookeeper.cluster.service.reconnect-max-sleep-time

  

Long

camel.component.zookeeper.cluster.service.reconnect-max-sleep-time-unit

  

TimeUnit

camel.component.zookeeper.cluster.service.retry-policy

  

RetryPolicy

camel.component.zookeeper.cluster.service.session-timeout

  

Long

camel.component.zookeeper.cluster.service.session-timeout-unit

  

TimeUnit

camel.component.zookeeper.configuration.backoff

重试前在出错后返回的时间间隔。

5000

Long

camel.component.zookeeper.configuration.create

如果端点当前还不存在,该端点应创建该节点。

false

布尔值

camel.component.zookeeper.configuration.create-mode

应该用于新创建的节点的创建模式

EPHEMERAL

字符串

camel.component.zookeeper.configuration.list-children

应该列出节点的子项

false

布尔值

camel.component.zookeeper.configuration.path

ZooKeeper 服务器中的节点(也称为 znode)

 

字符串

camel.component.zookeeper.configuration.repeat

应对对 znode 的更改"观察"并重复处理。

false

布尔值

camel.component.zookeeper.configuration.send-empty-message-on-delete

删除 znode 后,应该向使用者发送空消息

true

布尔值

camel.component.zookeeper.configuration.servers

zookeeper 服务器主机

 

list

camel.component.zookeeper.configuration.timeout

在超时前,等待连接的时间间隔。

5000

整数

camel.component.zookeeper.enabled

启用 zookeeper 组件

true

布尔值

camel.component.zookeeper.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.zookeeper.service-registry.attributes

自定义服务属性。

 

map

camel.component.zookeeper.service-registry.auth-info-list

  

list

camel.component.zookeeper.service-registry.base-path

  

字符串

camel.component.zookeeper.service-registry.connection-timeout

  

Long

camel.component.zookeeper.service-registry.connection-timeout-unit

  

TimeUnit

camel.component.zookeeper.service-registry.curator-framework

  

CuratorFramework

camel.component.zookeeper.service-registry.deregister-services-on-stop

  

布尔值

camel.component.zookeeper.service-registry.enabled

如果 zookeeper 服务 registry 应该启用或不启用,则设置为 false。

false

布尔值

camel.component.zookeeper.service-registry.id

服务 Registry ID

 

字符串

camel.component.zookeeper.service-registry.max-close-wait

  

Long

camel.component.zookeeper.service-registry.max-close-wait-unit

  

TimeUnit

camel.component.zookeeper.service-registry.namespace

  

字符串

camel.component.zookeeper.service-registry.nodes

  

list

camel.component.zookeeper.service-registry.order

服务查找顺序/优先级.

 

整数

camel.component.zookeeper.service-registry.override-service-host

  

布尔值

camel.component.zookeeper.service-registry.reconnect-base-sleep-time

  

Long

camel.component.zookeeper.service-registry.reconnect-base-sleep-time-unit

  

TimeUnit

camel.component.zookeeper.service-registry.reconnect-max-retries

  

整数

camel.component.zookeeper.service-registry.reconnect-max-sleep-time

  

Long

camel.component.zookeeper.service-registry.reconnect-max-sleep-time-unit

  

TimeUnit

camel.component.zookeeper.service-registry.retry-policy

  

RetryPolicy

camel.component.zookeeper.service-registry.service-host

  

字符串

camel.component.zookeeper.service-registry.session-timeout

  

Long

camel.component.zookeeper.service-registry.session-timeout-unit

  

TimeUnit

camel.component.zookeeper.configuration.await-existence

未使用

true

布尔值

385.4. 使用案例

385.4.1. 从 znode读取

以下片段将从已存在的 znode /somepath/somenode/ 读取数据。检索的数据将放入交换中,并传递给路由的其余部分:

from("zookeeper://localhost:39913/somepath/somenode").to("mock:result");

如果节点尚不存在,则可以提供一个标志,使端点为等待其创建状态:

from("zookeeper://localhost:39913/somepath/somenode?awaitCreation=true").to("mock:result");

385.4.2. 从 znode 中读取(更多 Camel 2.10 表示)

当因为 ZooKeeper ensemble 收到的 WatchedEvent 读取数据时,CamelZookeeperEventType 标头包含该 WatchedEvent 的 ZooKeeper' EventType 值。如果数据最初读取(未由 WatchedEvent触发),则不会设置 CamelZookeeperEventType 标头。

385.4.3. 写入 znode

以下片段会将交换的有效负载写入在已存在的 /somepath/somenode/ 提供的 znode 中:

from("direct:write-to-znode")
    .to("zookeeper://localhost:39913/somepath/somenode");

为获得灵活性,端点允许将目标 znode 动态指定为消息标头。如果存在字符串 CamelZooKeeperNode 的标头键,则标头的值将用作服务器上 znode 的路径。对于使用上述相同路由定义的实例,以下代码片段会将数据不写入 /somepath/somenode,而是指向标头 /somepath/someothernode 的路径。

警告

testPayload 必须可以被转换为 字节[],因为 ZooKeeper 中存储的数据基于字节。

Object testPayload = ...
template.sendBodyAndHeader("direct:write-to-znode", testPayload, "CamelZooKeeperNode", "/somepath/someothernode");

如果节点不存在,则应使用 create 选项。

from("direct:create-and-write-to-znode")
    .to("zookeeper://localhost:39913/somepath/somenode?create=true");

启动 2.11 版本 也可以通过将标头 CamelZookeeperOperation 设置为 DELETE 来删除 节点:

from("direct:delete-znode")
    .setHeader(ZooKeeperMessage.ZOOKEEPER_OPERATION, constant("DELETE"))
    .to("zookeeper://localhost:39913/somepath/somenode");

或者同等:

<route>
  <from uri="direct:delete-znode" />
  <setHeader headerName="CamelZookeeperOperation">
     <constant>DELETE</constant>
  </setHeader>
  <to uri="zookeeper://localhost:39913/somepath/somenode" />
</route>

zookeeper 节点可以有不同的类型,可以是 'Ephemeral' 或 'Persistent' 和 'Sequenced' 或 'Unsequenced'。有关您可以在 此处查看 每种类型的更多信息。默认情况下,端点将创建不透明的临时节点,但该类型可以通过 uri 配置参数或特殊消息标头来轻松操作。创建模式的值只是来自 CreateMode 枚举的名称:

  • PERSISTENT
  • PERSISTENT_SEQUENTIAL
  • EPHEMERAL
  • EPHEMERAL_SEQUENTIAL

例如,通过 URI 配置创建持久性 znode

from("direct:create-and-write-to-persistent-znode")
    .to("zookeeper://localhost:39913/somepath/somenode?create=true&createMode=PERSISTENT");

或者使用标头 CamelZookeeperCreateMode

警告

testPayload 必须可以被转换为 字节[],因为 ZooKeeper 中存储的数据基于字节。

Object testPayload = ...
template.sendBodyAndHeader("direct:create-and-write-to-persistent-znode", testPayload, "CamelZooKeeperCreateMode", "PERSISTENT");

385.5. zookeeper 启用 Route 策略

zookeeper 实现了非常简单、有效的领导选举。此组件利用 RoutePolicy 中的这种选择功能来控制如何启用路由。此策略通常用于故障转移情况,以控制基于 Camel 的服务器的群集中路由的相同实例。一个非常常见的场景是一个简单的 'Master-Slave' 设置,其中多个路由实例分布在一个集群中,但只有一个(主设备)应一次运行。如果主设备出现故障,应从可用的从接口中选择新的主设备,并且此新主服务器中的路由应启动。

该策略在所有将涉及选举的 RoutePolicy 实例间使用通用 znode 路径。每条策略都会将其 ID 写入此节点,而 Zookeeper 将根据收到的顺序对写入进行排序。然后,策略读取节点列表以查看其 ID 的位置;此位置用于确定路由是否应启动。该策略在启动时使用应在集群中启动的路由实例数量进行配置,如果列表中的位置小于这个值,则其路由将启动。对于 Master-slave 情景,路由配置有 1 路由实例,并且只有列表中的第一个条目将启动其路由。所有策略都会监视对列表的更新,以及列表在应启动路由时重新计算它们。有关 Zookeeper 的领导选举功能的更多信息,请参阅 此页面

以下示例将节点 /someapplication/somepolicy 用于选举,并被设置为仅启动节点列表中的顶级 '1' 条目,例如选择 master:

ZooKeeperRoutePolicy policy = new ZooKeeperRoutePolicy("zookeeper:localhost:39913/someapp/somepolicy", 1);
from("direct:policy-controlled")
    .routePolicy(policy)
    .to("mock:controlled");

组件中目前定义了 3 个策略,具有不同的 SLA:

  • ZooKeeperRoutePolicy
  • CuratorLeaderRoutePolicy (since 2.19)
  • MultiMasterCuratorLeaderRoutePolicy (since 2.19)

ZooKeeperRoutePolicy 支持多个活跃节点,但仅在 Camel 组件及其对应消费者启动后启动激活,这将会基于您的路由定义,您组件可以启动消耗事件的风险,并生成 'Exchange's,然后策略无法激活。

CuratorLeaderRoutePolicy 只支持一个活跃的节点,但它与不同的 CamelContext 生命周期方法绑定 ; 此策略在启动任何路由或消费者之前启动,因此可以在策略决定前没有处理。

MultiMasterCuratorLeaderRoutePolicy 支持多个活跃节点,并绑定到与 CuratorLeaderRoutePolicy 相同的生命周期方法;这个策略在启动路由或消费者之前启动,因此可以保证在策略启动前没有处理。

385.6. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用

第 386 章 ZooKeeper Master Component

作为 Camel 版本 2.19 可用

zookeeper-master: 端点提供了一种方式来确保集群中只有单一使用者消耗给定的端点;如果 JVM 死机,则自动故障切换。

如果您需要与一些传统后端使用,而不需要支持并发消耗的旧后端,或者由于在任何时间点上可以有商业或稳定性的原因,这非常有用。

386.1. 使用 master 端点

只需为任何带有 zookeeper-master:someName: someName: 其中 someName 是逻辑名称的 camel 端点,用于获取 master 锁定。例如:

from("zookeeper-master:cheese:jms:foo").to("activemq:wine");

以上模拟 ActiveMQ 中的 [Exclusive Consumers](http://activemq.apache.org/exclusive-consumer.html)类型功能,但任何第三方 JMS 供应商可能不支持专用消费者。

386.2. URI 格式

zookeeper-master:name:endpoint[?options]

其中端点是在 master/slave 模式下运行的任何 Camel 端点。

386.3. 选项

ZooKeeper Master 组件支持 7 选项,它们如下所列。

名称描述默认类型

containerIdFactory (consumer)

使用自定义 ContainerIdFactory 来创建容器 ID。

 

ContainerIdFactory

zkRoot (consumer)

在 zookeeper 中使用的根路径,其中存储了哪些节点是 master/slave 等信息。默认将使用: /camel/zookeepermaster/clusters/master

/camel/zookeepermaster/clusters/master

字符串

Curator (高级)

使用自定义配置的 CuratorFramework 作为与 zookeeper ensemble 的连接。

 

CuratorFramework

最大连接超时 (消费者)

连接到 zookeeper ensemble 时使用的超时

10000

int

zooKeeperUrl (consumer)

zookeeper ensemble 的 url

localhost:2181

字符串

zooKeeperPassword (security)

连接到 zookeeper ensemble 时使用的密码

 

字符串

resolveProperty Placeholders (advanced)

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

ZooKeeper Master 端点使用 URI 语法配置:

zookeeper-master:groupName:consumerEndpointUri

使用以下路径和查询参数:

386.3.1. 路径名(2 参数):

名称描述默认类型

groupName

必需 使用的集群组群名称

 

字符串

consumerEndpointUri

需要 要在主/从模式中使用的消费者端点

 

字符串

386.3.2. 查询参数(4 参数):

名称描述默认类型

bridgeErrorHandler (consumer)

允许将消费者桥接到 Camel 路由 Error Handler,这意味着使用者试图获取传入消息或类似信息时出现任何异常,现在将作为一个消息进行处理,并由路由 Error Handler 处理。默认情况下,使用者将使用 org.apache.camel.spi.Exception 处理程序处理异常,该处理程序将记录在 WARN 或 ERROR 级别,并忽略。

false

布尔值

exceptionHandler (consumer)

要让使用者使用自定义 ExceptionHandler。请注意,如果启用了选项 bridgeErrorHandler,则不使用这个选项。默认情况下,消费者处理异常,这将在 WARN 或 ERROR 级别记录,并忽略。

 

ExceptionHandler

exchangePattern (consumer)

在使用者创建交换时设置交换模式。

 

ExchangePattern

同步 (高级)

设置同步处理是否应当严格使用,还是允许 Camel 使用异步处理(如果受支持)。

false

布尔值

386.4. Spring Boot Auto-Configuration

组件支持 8 个选项,如下所示。

名称描述默认类型

camel.component.zookeeper-master.container-id-factory

使用自定义 ContainerIdFactory 来创建容器 ID。选项是一个 org.apache.camel.component.zookeepermaster.ContainerIdFactory 类型。

 

字符串

camel.component.zookeeper-master.curator

使用自定义配置的 CuratorFramework 作为与 zookeeper ensemble 的连接。选项是一个 org.apache.curator.framework.CuratorFramework 类型。

 

字符串

camel.component.zookeeper-master.enabled

启用 zookeeper-master 组件

true

布尔值

camel.component.zookeeper-master.maximum-connection-timeout

连接到 zookeeper ensemble 时使用的超时

10000

整数

camel.component.zookeeper-master.resolve-property-placeholders

启动时,组件是否应自行解析属性占位符。只有 String 类型的属性才能使用属性占位符。

true

布尔值

camel.component.zookeeper-master.zk-root

在 zookeeper 中使用的根路径,其中存储了哪些节点是 master/slave 等信息。默认将使用: /camel/zookeepermaster/clusters/master

/camel/zookeepermaster/clusters/master

字符串

camel.component.zookeeper-master.zoo-keeper-password

连接到 zookeeper ensemble 时使用的密码

 

字符串

camel.component.zookeeper-master.zoo-keeper-url

zookeeper ensemble 的 url

localhost:2181

字符串

386.5. 示例

您可以保护集群 Camel 应用程序,使其仅使用来自一个活跃节点的文件。

    // the file endpoint we want to consume from
    String url = "file:target/inbox?delete=true";

    // use the zookeeper master component in the clustered group named myGroup
    // to run a master/slave mode in the following Camel url
    from("zookeeper-master:myGroup:" + url)
        .log(name + " - Received file: ${file:name}")
        .delay(delay)
        .log(name + " - Done file:     ${file:name}")
        .to("file:target/outbox");

默认情况下,zookeeper 将连接到 localhost:2181,但您可以在组件级别上配置它。

    MasterComponent master = new MasterComponent();
    master.setZooKeeperUrl("myzookeeper:2181");

但是,您也可以使用环境变量配置 ZooKeeper ensemble 的 url。

export ZOOKEEPER_URL = "myzookeeper:2181"

第 387 章 Master RoutePolicy

您还可以使用 RoutePolicy 来控制 master/slave 模式中的路由。

在这样做时,您必须使用

  • zookeeper ensemble 的 URL
  • 集群组群名称
  • 重要 并将路由设置为不自动启动

一个例子

    MasterRoutePolicy master = new MasterRoutePolicy();
    master.setZooKeeperUrl("localhost:2181");
    master.setGroupName("myGroup");

    // its import to set the route to not auto startup
    // as we let the route policy start/stop the routes when it becomes a master/slave etc
    from("file:target/inbox?delete=true").noAutoStartup()
        // use the zookeeper master route policy in the clustered group
        // to run this route in master/slave mode
        .routePolicy(master)
        .log(name + " - Received file: ${file:name}")
        .delay(delay)
        .log(name + " - Done file:     ${file:name}")
        .to("file:target/outbox");

387.1. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用