Apache Camel 组件参考


Red Hat Fuse 7.6

配置 Camel 组件参考

摘要

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

第 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 1.xSpring Boot 2.xKarafJBoss EAP

activemq-camel

端点

camel-ahc

端点

camel-ahc-ws

端点

camel-ahc-wss

端点

camel-amqp

端点

camel-apns

端点

camel-asn1

数据格式

camel-as2

端点

camel-asterisk

端点

camel-atmos

端点

camel-atmosphere-websocket

端点

camel-atom

端点

camel-atomix

端点

camel-avro

端点

camel-avro

数据格式

camel-aws

端点

camel-azure

端点

camel-bam

端点

已弃用

已弃用

已弃用

已弃用

camel-barcode

数据格式

camel-base64

数据格式

camel-bean

端点

camel-bean

语言

camel-bean-validator

端点

camel-beanio

数据格式

camel-beanstalk

端点

camel-binding

端点

已弃用

已弃用

已弃用

已弃用

camel-bindy

端点

camel-bindy

数据格式

camel-blueprint

端点

camel-bonita

端点

camel-boon

数据格式

camel-box

端点

camel-braintree

端点

camel-browse

端点

camel-cache

端点

已弃用

已弃用

已弃用

已弃用

camel-caffeine

端点

camel-castor

数据格式

已弃用

已弃用

已弃用

已弃用

camel-cdi

端点

已弃用

camel-chronicle-engine

端点

camel-chunk

端点

camel-class

端点

camel-cm-sms

端点

camel-cmis

端点

camel-coap

端点

camel-cometd

端点

camel-constant

语言

camel-context

端点

已弃用

camel-consul

端点

camel-controlbus

端点

camel-couchbase

端点

camel-couchdb

端点

camel-cql

端点

camel-crypto

端点

camel-crypto

数据格式

camel-crypto-cms

端点

camel-csv

数据格式

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-el

语言

已弃用

camel-elasticsearch

端点

camel-elasticsearch5

端点

camel-elasticsearch-rest

端点

camel-elsql

端点

camel-etcd

端点

camel-eventadmin

端点

camel-exchangeProperty

语言

camel-exec

端点

camel-facebook

端点

camel-fhir

数据格式

camel-fhir

端点

camel-file

端点

camel-file

语言

camel-flatpack

端点

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

语言

camel-groovy-dsl

 

已弃用

camel-grpc

端点

camel-guava-eventbus

端点

camel-guice

端点

已弃用

已弃用

已弃用

camel-gzip

数据格式

camel-hawtdb

端点

已弃用

已弃用

已弃用

已弃用

camel-hazelcast

端点

camel-hbase

端点

camel-hdfs

端点

已弃用

camel-hdfs2

端点

camel-header

语言

camel-headersmap

 

camel-hessian

数据格式

已弃用

已弃用

已弃用

已弃用

已弃用

camel-hipchat

端点

camel-hl7

数据格式

camel-http

端点

已弃用

已弃用

已弃用

camel-http4

端点

camel-hystrix

端点

camel-ibatis

端点

已弃用

camel-ical

数据格式

camel-iec60870

端点

camel-ignite

端点

camel-imap

端点

camel-infinispan

端点

camel-influxdb

端点

camel-ipfs

端点

camel-irc

端点

camel-ironmq

端点

camel-jacksonxml

数据格式

camel-jasypt

端点

camel-javaspace

端点

已弃用

camel-jaxb

数据格式

camel-jbpm

端点

camel-jcache

端点

camel-jcifs

端点

camel-jclouds

端点

camel-jcr

端点

camel-jdbc

端点

camel-jetty

端点

已弃用

已弃用

已弃用

已弃用

camel-jetty8

端点

camel-jetty9

端点

camel-jgroups

端点

camel-jibx

数据格式

camel-jing

端点

camel-jira

端点

camel-jms

端点

camel-jmx

端点

camel-jolt

端点

camel-josql

端点

已弃用

已弃用

已弃用

已弃用

camel-jpa

端点

camel-jsch

端点

camel-json-fastjson

数据格式

camel-json-gson

数据格式

camel-json-jackson

数据格式

camel-json-johnzon

数据格式

camel-json-validator

端点

camel-json-xstream

数据格式

camel-jsonpath

语言

camel-jt400

端点

camel-juel

端点

已弃用

已弃用

已弃用

已弃用

camel-jxpath

语言

已弃用

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-lzf

数据格式

camel-master

 

camel-mail

端点

camel-metrics

端点

camel-micrometer

端点

camel-milo

端点

camel-mime-multipart

数据格式

camel-mina

端点

已弃用

camel-mina2

端点

camel-mllp

端点

camel-mock

端点

camel-mongodb

端点

camel-mongodb-gridfs

端点

camel-mongodb3

端点

camel-mqtt

端点

已弃用

已弃用

已弃用

已弃用

已弃用

camel-msv

端点

camel-mustache

端点

camel-mvel

端点

camel-mvel

语言

camel-mybatis

端点

camel-nagios

端点

camel-nats

端点

camel-netty

端点

已弃用

已弃用

已弃用

camel-netty-http

端点

已弃用

已弃用

已弃用

camel-netty4

端点

camel-netty4-http

端点

camel-nsq

端点

camel-ognl

语言

camel-olingo2

端点

camel-olingo4

端点

camel-openshift

端点

已弃用

camel-openstack

端点

camel-opentracing

 

camel-optaplanner

端点

camel-paho

端点

camel-paxlogging

端点

camel-pdf

端点

camel-pgevent

端点

camel-pgp

数据格式

camel-php

语言

已弃用

已弃用

已弃用

已弃用

camel-pop3

端点

camel-printer

端点

camel-properties

端点

camel-protobuf

数据格式

camel-pubnub

端点

camel-pulsar

端点

camel-python

语言

已弃用

已弃用

已弃用

已弃用

camel-quartz

端点

已弃用

camel-quartz2

端点

camel-quickfix

端点

camel-rabbitmq

端点

camel-reactive-streams

端点

camel-reactor

 

camel-ref

端点

camel-ref

语言

camel-rest

端点

camel-rest-api

端点

camel-rest-openapi

camel-rest-swagger

端点

camel-restlet

端点

camel-ribbon

 

camel-rmi

端点

camel-routebox

端点

已弃用

camel-rss

端点

camel-rss

数据格式

camel-ruby

语言

已弃用

已弃用

已弃用

已弃用

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-serialization

数据格式

camel-service

端点

camel-servicenow

端点

camel-servlet

端点

camel-servletlistener

端点

已弃用

已弃用

已弃用

已弃用

camel-sftp

端点

camel-shiro

端点

camel-simple

语言

camel-sip

端点

camel-sjms

端点

camel-sjms2

端点

camel-slack

端点

camel-smpp

端点

camel-snakeyaml

端点

camel-snmp

端点

camel-soapjaxb

数据格式

camel-solr

端点

camel-spark

端点

camel-spark-rest

端点

camel-spel

语言

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

数据格式

camel-string-template

端点

camel-stub

端点

camel-swagger

端点

已弃用

已弃用

camel-openapi-java

端点

camel-swagger-java

端点

camel-syslog

数据格式

camel-tagsoup

端点

camel-tarfile

数据格式

camel-telegram

端点

camel-thrift

端点

camel-thrift

数据格式

camel-tika

端点

camel-timer

端点

camel-tokenize

语言

camel-twilio

端点

camel-twitter

端点

camel-undertow

端点

camel-univocity-csv

数据格式

camel-univocity-fixed

数据格式

camel-univocity-tsv

数据格式

camel-urlrewrite

端点

已弃用

已弃用

已弃用

已弃用

camel-validator

端点

camel-velocity

端点

camel-vertx

端点

camel-vm

端点

camel-weather

端点

camel-web3j

端点

camel-websocket

端点

camel-wordpress

端点

camel-xchange

端点

camel-xmlbeans

数据格式

已弃用

已弃用

已弃用

已弃用

camel-xmljson

数据格式

已弃用

已弃用

已弃用

已弃用

已弃用

camel-xmlrpc

端点

camel-xmlrpc

数据格式

camel-xmlsecurity

端点

camel-xmpp

端点

camel-xpath

语言

camel-xquery

端点

camel-xquery

语言

camel-xslt

端点

camel-xstream

数据格式

camel-xtokenize

语言

camel-yaml-snakeyaml

数据格式

camel-yammer

端点

camel-yql

端点

camel-zendesk

端点

camel-zip

数据格式

camel-zipfile

数据格式

camel-zipkin

端点

camel-zookeeper

端点

camel-zookeeper-master

端点

第 2 章 ActiveMQ

ActiveMQ 组件

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

此组件基于 第 177 章 JMS 组件,并使用 Spring 的 JMS 支持声明事务,使用 Spring 的 JmsTemplate 来发送和接收 MessageListenerContainer 进行消耗。第 177 章 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

选项

请参阅 第 177 章 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。这意味着,第 43 章 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 项目 发布的 第 177 章 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. 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.4. 消息标头

名称类型描述

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.5. Message Body

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

3.6. 响应代码

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

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

    throwExceptionOnFailure

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

3.7. AhcOperationFailedException

这个例外包含以下信息:

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

3.8. 使用 GET 或 POST 调用

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

3.9. 配置要调用的 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.10. 配置 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.11. 如何将 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.12. 配置 charset

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

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

3.12.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.12.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.12.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.13. 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.14. 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.15. 另请参阅

第 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. 通过 Websocket 编写和阅读数据

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

4.4. 配置 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.5. 另请参阅

第 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 组件支持 80 个选项,它们如下所列。

名称描述默认类型

配置 (高级)

使用共享的 JMS 配置

 

JmsConfiguration

acceptMessagesWhile Stopping (consumer)

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

false

布尔值

allowReplyManagerQuick Stop (consumer)

如果 JmsConfigurationisAcceptMessagesWhileStopping 在启用 JmsConfigurationisAcceptMessagesWhileStopping 中,并且 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

includeAmqpAnnotations (consumer)

指定在从 AMQP 到 Camel 消息映射时是否包括 AMQP 注解。将此选项设置为 true 可将包含 JMS_AMQP_MA_ 前缀的 AMQP 消息注解映射到 JMS 消息标头。由于 Apache Qpid JMS API 的限制,传输注解将被忽略。

注意: includeAmqpAnnotations 选项只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的详情,请参考 https://access.redhat.com/support/offerings/techpreview/

false

布尔值

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

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 故障(不是例外),则 MessageisFault ()上的 fault 标志作为 JMS 标头以其键 org.apache.camel.component.jms.JmsConstantsJMS_TRAFER_JMS_TRAFER_JMS_TRATRATRATRATER_JMSTRATRATRATRATRATRATERTRATER如果客户端是 Camel,则返回的 fault 标志将在链接 org.apache.camel.MessagesetFault (布尔值)上设置。在使用支持故障的 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. 查询参数(91 参数):

名称描述默认类型

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)

如果 JmsConfigurationisAcceptMessagesWhileStopping 在启用 JmsConfigurationisAcceptMessagesWhileStopping 中,并且 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

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 故障(不是例外),则 MessageisFault ()上的 fault 标志作为 JMS 标头以其键 org.apache.camel.component.jms.JmsConstantsJMS_TRAFER_JMS_TRAFER_JMS_TRATRATRATRATER_JMSTRATRATRATRATRATRATERTRATER如果客户端是 Camel,则返回的 fault 标志将在链接 org.apache.camel.MessagesetFault (布尔值)上设置。在使用支持故障的 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. 使用

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

使用 AMQP 组件

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

5.4. 配置 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://lcoalhost: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.5. 使用主题

要使用与 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.6. 另请参阅

  • 配置 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

布尔值

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

6.2.3. 组件

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

6.2.3.1. SSL 设置

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

6.3. 交换数据格式

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

6.4. 消息标头

Camel Apns 使用这些标头。

属性默认描述

CamelApnsTokens

 

默认为空。

CamelApnsMessageType

字符串、载荷、PNS_NOTIFICATION 

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

6.5. 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.6. Samples

6.6.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.6.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.7. 另请参阅

第 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. 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.3. 依赖项

要在 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. 操作

支持的操作包括:

  • 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. 依赖项

要在 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.3. 集成

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

  • Get

其中有 4 种类型的制作者

  • Get
  • Del
  • Move
  • put

10.4. 例子

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

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.5. 另请参阅

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

第 11 章 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>

11.1. Atmosphere-Websocket 选项

Atmosphere Websocket 组件支持列出了 8 个选项。

名称描述默认类型

servletName (common)

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

 

字符串

httpRegistry (common)

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

 

HttpRegistry

附加多部分绑定 (常见)

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

false

布尔值

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

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

11.1.1. 路径名(1 参数):

名称描述默认类型

servicePath

websocket 端点 所需的 名称

 

字符串

11.1.2. 查询参数(37 参数):

名称描述默认类型

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

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 的身份验证主机

 

字符串

11.2. URI 格式

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

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

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

11.4. 将 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>

 

11.5. 另请参阅

第 12 章 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>

12.1. URI 格式

atom://atomUri[?options]

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

12.2. 选项

Atom 组件没有选项。

Atom 端点使用 URI 语法配置:

atom:feedUri

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

12.2.1. 路径名(1 参数):

名称描述默认类型

feedUri

需要 要轮询的源 URI。

 

字符串

12.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

布尔值

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

12.3. 交换数据格式

Camel 将在返回的 Exchange 上通过条目设置 In 正文。根据 splitEntries 标记 Camel 将返回一个 EntryList<Entry>

选项行为

splitEntries

true

只设置来自当前处理源的一个条目: Exchange. in.body (Entry)

splitEntries

false

源中的整个条目列表被设置: exchange.in.body (List<Entry>)

Camel 可以在 In 标头上设置 Feed 对象(请参阅 feedHeader 选项来禁用此选项):

12.4. 消息标头

Camel atom 使用这些标头。

标头描述

CamelAtomFeed

当使用 org.apache.abdera.model.Feed 对象时,将设置为此标头。

12.5. Samples

在本例中,我们轮询 James Strachan 的博客。

from("atom://http://macstrac.blogspot.com/feeds/posts/default").to("seda:feeds");

在此例中,我们希望仅过滤我们想到 SEDA 队列的良好博客。这个示例还演示了如何设置 Camel 独立,而不在任何容器或 Spring 中运行。

12.6. 另请参阅

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

第 13 章 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>

13.1. URI 格式

    atomix-map:mapName

13.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

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

13.2.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

13.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

布尔值

13.3. 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

读取一致性级别

13.4. 配置组件以连接到 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>

13.5. 使用示例:

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

第 14 章 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>

14.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

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

14.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

14.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 章 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>

15.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

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

15.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

15.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 章 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>

16.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

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

16.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

16.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 章 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>

17.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

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

17.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

17.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 章 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>

18.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

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

18.1.1. 路径名(1 参数):

名称描述默认类型

resourceName

所需的 分布式资源名称

 

字符串

18.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 章 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>

19.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 (请参阅以下),而不是数据格式。

19.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。

19.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" 消息正文中接收它,而无需数组嵌套。

19.4. Avro RPC URI 选项

Avro 组件支持下面列出的 2 个选项。

名称描述默认类型

配置 (高级)

使用共享的 AvroConfiguration 一次配置选项

 

AvroConfiguration

resolveProperty Placeholders (advanced)

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

true

布尔值

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

avro:transport:host:port/messageName

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

19.4.1. 路径名(4 参数):

名称描述默认类型

传输

要使用 所需的 传输

 

AvroTransport

port

要使用 所需的 端口号

 

int

主机

要使用 所需的 主机名

 

字符串

messageName

要发送的消息的名称。

 

字符串

19.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

布尔值

19.5. Avro RPC 标头

名称描述

CamelAvroMessageName

要发送的消息的名称。在消费者中,从 URI 覆盖消息名称(若有)

19.6. 例子

通过 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 值,并以数组内容填充。

第 20 章 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>

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. Avro Dataformat 选项

Avro 数据格式支持下面列出的 2 个选项。

名称默认Java 类型描述

instanceClassName

 

字符串

用于 marshal 和 unmarshalling 的类名称

contentTypeHeader

false

布尔值

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

第 21 章 AWS CloudWatch 组件

作为 Camel 2.11 版本提供

CW 组件允许将消息发送到 Amazon CloudWatch 指标。Amazon API 的实现由 AWS SDK 提供。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并被签名才能使用 Amazon CloudWatch。如需更多信息,请参阅 Amazon CloudWatch

21.1. URI 格式

aws-cw://namespace[?options]

如果指标不存在,则会创建指标。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

21.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

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

21.2.1. 路径名(1 参数):

名称描述默认类型

namespace

所需的 指标命名空间

 

字符串

21.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

 

字符串

所需的 CW 组件选项

您必须提供 Registry 中的 amazonCwClient 或您的 accessKey 和 secretKey 以访问 Amazon 的 CloudWatch

21.3. 使用

21.3.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: 维度名称和度量值的映射。

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

21.4. 依赖项

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 或更高版本)。

21.5. 另请参阅

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

第 22 章 AWS DynamoDB Component

作为 Camel 2.10 版本提供

DynamoDB 组件支持存储和检索来自 Amazon 的 DynamoDB 服务的数据。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并被签名才能使用 Amazon DynamoDB。有关更多信息,请参见 Amazon DynamoDB

22.1. URI 格式

aws-ddb://domainName[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

22.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

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

22.2.1. 路径名(1 参数):

名称描述默认类型

tableName

当前用于的表的名称。

 

字符串

22.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

 

字符串

所需的 DDB 组件选项

您必须提供 Registry 中的 amazonDDBClient 或您的 accessKey 和 secretKey 以访问 Amazon 的 DynamoDB

22.3. 使用

22.3.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>

将属性名称映射到更新的新值和操作。

22.3.2. 在 BatchGetItems 操作过程中设置的消息标头

标头类型描述

CamelAwsDdbBatchResponse

Map<String,BatchResponse>

表名称和表中的对应项目属性。

CamelAwsDdbUnprocessedKeys

Map<String,KeysAndAttributes>

包含与当前响应没有处理的表格及其对应键的映射。

22.3.3. DeleteItem 操作期间设置的消息标头

标头类型描述

CamelAwsDdbAttributes

Map<String, AttributeValue>

操作返回的属性列表。

22.3.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

22.3.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 属性。

22.3.6. GetItem 操作期间设置消息标头

标头类型描述

CamelAwsDdbAttributes

Map<String, AttributeValue>

操作返回的属性列表。

22.3.7. PutItem 操作期间设置的消息标头

标头类型描述

CamelAwsDdbAttributes

Map<String, AttributeValue>

操作返回的属性列表。

22.3.8. Query 操作期间设置的消息标头

标头类型描述

CamelAwsDdbItems

List<java.util.Map<String,AttributeValue>>

操作返回的属性列表。

CamelAwsDdbLastEvaluatedKey

查询操作停止的项目的主键,包括上一个结果集。

CamelAwsDdbConsumedCapacity

操作期间所消耗的表调配吞吐量的容量单位数。

CamelAwsDdbCount

整数

响应中的项目数。

22.3.9. 在 Scan 操作期间设置消息标头

标头类型描述

CamelAwsDdbItems

List<java.util.Map<String,AttributeValue>>

操作返回的属性列表。

CamelAwsDdbLastEvaluatedKey

查询操作停止的项目的主键,包括上一个结果集。

CamelAwsDdbConsumedCapacity

操作期间所消耗的表调配吞吐量的容量单位数。

CamelAwsDdbCount

整数

响应中的项目数。

CamelAwsDdbScannedCount

整数

应用任何过滤器前的完整扫描中的项目数。

22.3.10. UpdateItem 操作期间设置的消息标头

标头类型描述

CamelAwsDdbAttributes

Map<String, AttributeValue>

操作返回的属性列表。

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

22.4. 依赖项

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.5. 另请参阅

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

第 23 章 AWS DynamoDB Streams Component

作为 Camel 2.17 版提供

DynamoDB Stream 组件支持接收来自 Amazon DynamoDB Stream 服务的消息。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon DynamoDB Streams。如需更多信息,请参阅 AWS DynamoDB

23.1. URI 格式

aws-ddbstream://table-name[?options]

需要在使用流前创建流。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

23.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

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

23.2.1. 路径名(1 参数):

名称描述默认类型

tableName

dynamodb 表的 必填 名称

 

字符串

23.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

 

字符串

所需的 DynampDBStream 组件选项

您必须在 registry 中提供 amazonDynamoDbStreamsClient,并配置了代理和相关凭证。

23.3. 序列号

您可以提供一个字面字符串作为序列号,或者在 registry 中提供 bean。使用 bean 的示例将您当前的位置保存在更改源中,并在 Camel 启动中恢复它。

提供大于 describe-streams 结果中最大序列号的错误,因为它将导致 AWS 调用返回 HTTP 400。

23.4. 批处理消费者

此组件实施 Batch Consumer。

这样,您可以让实例知道此批处理中有多少消息,而实例可让聚合器聚合这个数量的消息。

23.5. 使用

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

23.5.2. 提供 AWS 凭证

建议利用 DefaultAWSCredentialsProviderChain 获取凭证,这是创建新 ClientConfiguration 实例时的默认设置,但可以在调用 createClient (…​)时指定不同的 AWSCredentialsProvider

23.6. 与 Downtime 冲突

23.6.1. AWS DynamoDB Streams 中断时间少于 24 小时

消费者将从上一次看到的序列号(针对 CAMEL-9515进行了实施)进行恢复,因此,只要停机没有包括 DynamoDB 本身,因此您应该收到大量事件。

23.6.2. AWS DynamoDB Streams 中断 24 小时

假定 AWS 只保留 24 小时更改,因此无论有哪些缓解措施如何,您都会错过更改事件。

23.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.7 或更高版本)。

23.8. 另请参阅

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

第 24 章 AWS EC2 组件

作为 Camel 版本 2.16 可用

EC2 组件支持创建、运行、启动、停止和终止 AWS EC2 实例。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon EC2。如需更多信息,请参阅 Amazon EC2

24.1. URI 格式

aws-ec2://label[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

24.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

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

24.2.1. 路径名(1 参数):

名称描述默认类型

label

所需 的逻辑名称

 

字符串

24.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

布尔值

所需的 EC2 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonEc2Client,才能访问 Amazon EC2 服务。

24.3. 使用

24.3.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 或更高版本)。

24.4. 另请参阅

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

第 25 章 AWS IAM 组件

作为 Camel 版本 2.23 可用

KMS 组件支持创建、运行、启动、停止和终止 AWS IAM 实例。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon IAM。如需更多信息,请参阅 Amazon IAM

25.1. URI 格式

aws-kms://label[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

25.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

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

25.2.1. 路径名(1 参数):

名称描述默认类型

label

所需 的逻辑名称

 

字符串

25.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

布尔值

25.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 服务。

25.4. 使用

25.4.1. IAM producer 评估的消息标头

标头类型描述

CamelAwsIAMOperation

字符串

我们要执行的操作

CamelAwsIAMUsername

字符串

要管理的用户的用户名

CamelAwsIAMAccessKeyID

字符串

要管理的 accessKey

CamelAwsIAMAccessKeyStatus

字符串

您要设置的 AccessKey 的 Status 是 active 和 inactive

25.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 或更高版本)。

25.5. 另请参阅

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

第 26 章 AWS Kinesis 组件

作为 Camel 2.17 版提供

Kinesis 组件支持接收来自消息并将消息发送到 Amazon Kinesis 服务。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并被签名才能使用 Amazon Kinesis。如需更多信息,请访问 AWS Kinesis

26.1. URI 格式

aws-kinesis://stream-name[?options]

需要在使用流前创建流。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

26.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

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

26.2.1. 路径名(1 参数):

名称描述默认类型

streamName

所需的 名称

 

字符串

26.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

 

字符串

所需的 Kinesis 组件选项

您必须在 registry 中提供 amazonKinesisClient,并配置了代理和相关凭证。

26.3. 批处理消费者

此组件实施 Batch Consumer。

这样,您可以让实例知道此批处理中有多少消息,而实例可让聚合器聚合这个数量的消息。

26.4. 使用

26.4.1. Kinesis 使用者设置的消息标头

标头类型描述

CamelAwsKinesisSequenceNumber

字符串

记录的序列号。这代表为一个 String,因为它大小不是由 API 定义。如果将其用作数字类型,则请使用

CamelAwsKinesisApproximateArrivalTimestamp

字符串

AWS 分配为记录的 arrival 时间。

CamelAwsKinesisPartitionKey

字符串

标识流中分配给数据记录的分片。

26.4.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");

26.4.3. 提供 AWS 凭证

建议利用 DefaultAWSCredentialsProviderChain 获取凭证,这是创建新 ClientConfiguration 实例时的默认设置,但可以在调用 createClient (…​)时指定不同的 AWSCredentialsProvider

26.4.4. Kinesis producer 用来写入 Kinesis 的消息标头。该制作者希望消息正文为 ByteBuffer

标头类型描述

CamelAwsKinesisPartitionKey

字符串

要传递给 Kinesis 的 PartitionKey 来存储此记录。

CamelAwsKinesisSequenceNumber

字符串

可选参数来指示此记录的序列号。

26.4.5. 在成功存储记录时 Kinesis producer 设置的消息标头

标头类型描述

CamelAwsKinesisSequenceNumber

字符串

记录的顺序号,如 Response 语法中所定义

CamelAwsKinesisShardId

字符串

存储记录的分片 ID

26.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.17 或更高版本)。

26.6. 另请参阅

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

第 27 章 AWS Kinesis Firehose 组件

作为 Camel 版本 2.19 可用

Kinesis Firehose 组件支持向 Amazon Kinesis Firehose 服务发送消息。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon Kinesis Firehose。如需更多信息,请参阅 AWS Kinesis Firehose

27.1. URI 格式

aws-kinesis-firehose://delivery-stream-name[?options]

需要在使用流前创建流。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

27.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

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

27.2.1. 路径名(1 参数):

名称描述默认类型

streamName

所需的 名称

 

字符串

27.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

 

字符串

所需的 Kinesis Firehose 组件选项

您必须在 registry 中提供 amazonKinesisClient,并配置了代理和相关凭证。

27.3. 使用

27.3.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");

27.3.2. 提供 AWS 凭证

建议利用 DefaultAWSCredentialsProviderChain 获取凭证,这是创建新 ClientConfiguration 实例时的默认设置,但可以在调用 createClient (…​)时指定不同的 AWSCredentialsProvider

27.3.3. 在成功存储记录时 Kinesis producer 设置的消息标头

标头类型描述

CamelAwsKinesisFirehoseRecordId

字符串

记录 ID,如 响应语法中定义的

27.4. 依赖项

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 或更高版本)。

27.5. 另请参阅

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

第 28 章 AWS KMS 组件

可作为 Camel 版本 2.21 可用

KMS 组件支持创建、运行、启动、停止和终止 AWS KMS 实例。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon KMS。如需更多信息,请参阅 Amazon KMS

28.1. URI 格式

aws-kms://label[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

28.2. URI 选项

AWS KMS 组件支持 5 个选项,它们如下。

名称描述默认类型

配置 (高级)

AWS MQ 默认配置

 

KMSConfiguration

accessKey (producer)

Amazon AWS 访问密钥

 

字符串

secretKey (producer)

Amazon AWS Secret Key

 

字符串

region (producer)

MQ 客户端需要正常工作的区域

 

字符串

resolveProperty Placeholders (advanced)

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

true

布尔值

AWS KMS 端点使用 URI 语法配置:

aws-kms:label

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

28.2.1. 路径名(1 参数):

名称描述默认类型

label

所需 的逻辑名称

 

字符串

28.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

布尔值

所需的 KMS 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonKmsClient 访问 Amazon KMS 服务。

28.3. 使用

28.3.1. MQ producer 评估的消息标头

标头类型描述

CamelAwsKMSLimit

整数

执行 listKeys 操作时要返回的键数

CamelAwsKMSOperation

字符串

我们要执行的操作

CamelAwsKMSDescription

字符串

执行 createKey 操作时要使用的密钥描述

CamelAwsKMSKeyId

字符串

密钥 Id

依赖项

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 或更高版本)。

28.4. 另请参阅

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

第 29 章 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 功能在其他区域不可用。

29.1. URI 格式

aws-lambda://functionName[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

29.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

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

29.2.1. 路径名(1 参数):

名称描述默认类型

function

Lambda 功能 所需的 Name。

 

字符串

29.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

 

字符串

所需的 Lambda 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 awsLambdaClient,才能访问 Amazon Lambda 服务。

29.3. 使用

29.3.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 的列表。

依赖项

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.4. 另请参阅

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

第 30 章 AWS MQ 组件

可作为 Camel 版本 2.21 可用

MQ 组件支持创建、运行、启动、停止和终止 AWS MQ 实例。

前提条件

您必须拥有有效的 Amazon Web Services 开发人员帐户,并且必须注册才能使用 Amazon MQ。如需更多信息,请参阅 Amazon MQ

30.1. URI 格式

aws-mq://label[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

30.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

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

30.2.1. 路径名(1 参数):

名称描述默认类型

label

所需 的逻辑名称

 

字符串

30.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

布尔值

所需的 EC2 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonEc2Client,才能访问 Amazon EC2 服务。

30.3. 使用

30.3.1. MQ producer 评估的消息标头

标头类型描述

CamelAwsMQMaxResults

字符串

从 listBrokers 操作中检索的结果数量

CamelAwsMQBrokerName

字符串

代理名称

CamelAwsMQOperation

字符串

我们要执行的操作

CamelAwsMQBrokerId

字符串

代理 ID

CamelAwsMQBrokerDeploymentMode

字符串

在 createBroker 操作中的代理部署模式

依赖项

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.4. 另请参阅

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

第 31 章 AWS S3 Storage Service Component

可作为 Camel 版本 2.8 使用

S3 组件支持从/到 Amazon 的 S3 服务存储和检索 objetc。

前提条件

您必须具有有效的 Amazon Web Services 开发人员帐户,并经过签名才能使用 Amazon S3。如需更多信息,请参阅 Amazon S3

31.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");

31.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

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

31.2.1. 路径名(1 参数):

名称描述默认类型

bucketNameOrArn

所需的 Bucket name 或 ARN

 

字符串

31.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.AmazonS3setBucketPolicy ()方法中设置。

 

字符串

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 来过滤重复的。您可以使用链接 S3ConstantsBUCKET_NAME 和链接 S3ConstantsKEY 标头过滤,或者只有链接 S3ConstantsKEY 标头。

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

 

字符串

所需的 S3 组件选项

您必须提供 registry 中的 amazonS3Client 或您的 accessKey 和 secretKey 以访问 Amazon 的 S3

31.3. 批处理消费者

此组件实施 Batch Consumer。

这样,您可以让实例知道此批处理中有多少消息,而实例可让聚合器聚合这个数量的消息。

31.4. 使用

31.4.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, listBuckets, deleteBucket, downloadLink

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

字符串

要从当前操作存储或返回的对象版本

31.4.2. S3 producer 设置的消息标头

标头类型描述

CamelAwsS3ETag

字符串

新上传对象的 ETag 值。

CamelAwsS3VersionId

字符串

新上传对象 的可选 版本 ID。

CamelAwsS3DownloadLinkExpiration

字符串

URL 下载链接的过期(millis)该链接将存储在 CamelAwsS3DownloadLink 响应标头中。

31.4.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 管理的密钥加密对象时的服务器端加密算法。

31.4.4. 高级 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");

31.4.5. 使用带有 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。当您需要下载此文件时,解密将在下载前直接进行。

31.4.6. 将"useIAMCredentials"用于 s3 组件

要使用 AWS IAM 凭证,您必须首先验证您在 上启动 Camel 应用程序的 EC2 是否具有一个 IAM 角色,其中包含附加的适当策略以便有效地运行。请记住,这个功能应该只在远程实例上设置为"true"。要进一步说明,由于 IAM 是 AWS 特定组件,所以您仍然需要在本地使用静态凭证,但 AWS 环境现在应该更易于管理。在实现并理解后,您可以将 AWS 环境的查询参数 "useIAMCredentials" 设置为 "true"!要根据本地和远程环境有效地打开和关闭此项,您可以考虑使用系统环境变量启用这个查询参数。例如,您的代码可将"useIAMCredentials"查询参数设置为 "true",当系统名为 "isRemote" 的环境变量被设置为 true 时(有很多其他方法可以这样做,这应该是一个简单示例)。虽然它并不完全取消对静态凭证的要求,但在 AWS 环境中使用 IAM 凭证无需在远程环境中刷新,并添加主要的安全增强(IAM 凭证会在策略被更新时自动刷新一次)。这是管理凭证的 AWS 建议的方法,因此应该尽可能使用。

31.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 或更高版本)。

31.6. 另请参阅

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

第 32 章 AWS SimpleDB Component

作为 Camel 版本 2.9 提供。

sdb 组件支持从/检索到 Amazon 的 SDB 服务中的数据。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并且必须注册才能使用 Amazon SDB。如需更多信息,请参阅 Amazon SDB

32.1. URI 格式

aws-sdb://domainName[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

32.2. URI 选项

AWS SimpleDB 组件没有选项。

AWS SimpleDB 端点使用 URI 语法配置:

aws-sdb:domainName

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

32.2.1. 路径名(1 参数):

名称描述默认类型

domainName

必需,当前使用的域的名称。

 

字符串

32.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

布尔值

所需的 SDB 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSDBClient,才能访问 Amazon 的 SDB

32.3. 使用

32.3.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

更新条件(如果指定)决定指定属性是否被更新/删除。

32.3.2. DomainMetadata 操作过程中设置的消息标头

标头类型描述

CamelAwsSdbTimestamp

整数

计算元数据的数据和时间(UNIX)秒。

CamelAwsSdbItemCount

整数

域中所有项目的数量。

CamelAwsSdbAttributeNameCount

整数

域中唯一属性名称的数量。

CamelAwsSdbAttributeValueCount

整数

域中所有属性名称/值对的数量。

CamelAwsSdbAttributeNameSize

Long

域中所有唯一属性名称的总大小(以字节为单位)。

CamelAwsSdbAttributeValueSize

Long

域中所有属性值的总大小(以字节为单位)。

CamelAwsSdbItemNameSize

Long

域中所有项名称的总大小(以字节为单位)。

32.3.3. 在 GetAttributes 操作过程中设置消息标头

标头类型描述

CamelAwsSdbAttributes

list<Attribute>

操作返回的属性列表。

32.3.4. ListDomains 操作过程中设置的消息标头

标头类型描述

CamelAwsSdbDomainNames

列出<字符串>

与表达式匹配的域名列表。

CamelAwsSdbNextToken

字符串

opaque 令牌表示超过指定的 MaxNumberOfDomains 所在域更多。

32.3.5. 在选择操作过程中设置消息标头

标头类型描述

CamelAwsSdbItems

list<Item>

与所选表达式匹配的项目列表。

CamelAwsSdbNextToken

字符串

opaque 令牌表示匹配了 MaxNumberOfItems 的项目数量、响应大小超过 1MB 字节,或者执行时间超过 5 秒。

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

32.4. 依赖项

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 或更高版本)。

32.5. 另请参阅

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

第 33 章 AWS Simple Email Service 组件

作为 Camel 版本 2.9 提供。

ses 组件支持向 Amazon 的 SES 服务发送电子邮件。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,且必须注册才能使用 Amazon SES。如需更多信息,请参阅 Amazon SES

33.1. URI 格式

aws-ses://from[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

33.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

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

33.2.1. 路径名(1 参数):

名称描述默认类型

from

需要 发送者的电子邮件地址。

 

字符串

33.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

 

字符串

所需的 SES 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSESClient,才能访问 Amazon 的 SES

33.3. 使用

33.3.1. 由 SES producer 评估的消息标头

标头类型描述

CamelAwsSesFrom

字符串

发件人的电子邮件地址。

CamelAwsSesTo

列出<字符串>

此电子邮件的目的地。

CamelAwsSesSubject

字符串

消息的主题。

CamelAwsSesReplyToAddresses

列出<字符串>

邮件的答复电子邮件地址。

CamelAwsSesReturnPath

字符串

要转发退回通知的电子邮件地址。

CamelAwsSesHtmlEmail

布尔值

自 Camel 2.12.3 起,显示电子邮件内容是否为 HTML 的标记。

33.3.2. 由 SES producer 设置的消息标头

标头类型描述

CamelAwsSesMessageId

字符串

Amazon SES 消息 ID。

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

33.4. 依赖项

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.5. 另请参阅

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

第 34 章 AWS Simple notification System 组件

可作为 Camel 版本 2.8 使用

SNS 组件允许将消息发送到 Amazon Simple Notification Topic。Amazon API 的实现由 AWS SDK 提供。

前提条件

您必须具有有效的 Amazon Web Services 开发人员帐户,并经过签名才能使用 Amazon SNS。如需更多信息,请参阅 Amazon SNS

34.1. URI 格式

aws-sns://topicNameOrArn[?options]

如果主题不存在,则会创建这些主题。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

34.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

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

34.2.1. 路径名(1 参数):

名称描述默认类型

topicNameOrArn

所需的 主题名称或 ARN

 

字符串

34.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

 

字符串

所需的 SNS 组件选项

您必须提供 registry 中的 amazonSNSClient 或您的 accessKey 和 secretKey 以访问 Amazon 的 SNS

34.3. 使用

34.3.1. SNS producer 评估的消息标头

标头类型描述

CamelAwsSnsSubject

字符串

Amazon SNS 消息主题。如果没有设置,则使用 SnsConfiguration 中的主题。

34.3.2. SNS producer 设置的消息标头

标头类型描述

CamelAwsSnsMessageId

字符串

Amazon SNS 消息 ID。

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

34.4. 依赖项

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 或更高版本)。

34.5. 另请参阅

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

第 35 章 AWS Simple Queue Service 组件

可作为 Camel 版本 2.6 提供。

sqs 组件支持向 Amazon 的 SQS 服务发送和接收信息。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并被签名才能使用 Amazon SQS。如需更多信息,请参阅 Amazon SQS

35.1. URI 格式

aws-sqs://queueNameOrArn[?options]

如果队列不存在,则会创建队列。
您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

35.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

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

35.2.1. 路径名(1 参数):

名称描述默认类型

queueNameOrArn

所需的 队列名称或 ARN

 

字符串

35.2.2. 查询参数(46 参数):

名称描述默认类型

amazonAWSHost (common)

Amazon AWS 云的主机名。

amazonaws.com

字符串

amazonSQSClient (common)

使用 AmazonSQS 作为客户端

 

AmazonSQS

headerFilterStrategy (common)

使用自定义 HeaderFilterStrategy 将标头映射到/来自 Camel。

 

HeaderFilterStrategy

queueOwnerAWSAccountId (common)

当您需要使用不同的帐户拥有者时,请指定队列拥有者 aws 帐户 id。

 

字符串

region (common)

指定可与 queueOwnerAWSAccountId 一起使用的队列区域,以构建服务 URL。

 

字符串

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

同步 (高级)

设置同步处理是否应当严格使用,还是允许 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

 

字符串

所需的 SQS 组件选项

您必须提供 Registry 中的 amazonSQSClient 或您的 accessKey 和 secretKey 以访问 Amazon 的 SQS

35.3. 批处理消费者

此组件实施 Batch Consumer。

这样,您可以让实例知道此批处理中有多少消息,而实例可让聚合器聚合这个数量的消息。

35.4. 使用

35.4.1. SQS producer 设置的消息标头

标头类型描述

CamelAwsSqsMD5OfBody

字符串

Amazon SQS 消息的 MD5 校验和。

CamelAwsSqsMessageId

字符串

Amazon SQS 消息 ID。

CamelAwsSqsDelaySeconds

整数

Camel 2.11 起,Amazon SQS 消息可以被其他人看到的延迟秒数。

35.4.2. SQS 消费者设置的消息标头

标头类型描述

CamelAwsSqsMD5OfBody

字符串

Amazon SQS 消息的 MD5 校验和。

CamelAwsSqsMessageId

字符串

Amazon SQS 消息 ID。

CamelAwsSqsReceiptHandle

字符串

Amazon SQS 消息接收处理。

CamelAwsSqsAttributes

Map<String, String>

Amazon SQS 消息属性。

35.4.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");

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.6 或更高版本)。

35.6. 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 后,信息将对其他消费者可见。

35.7. 另请参阅

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

第 36 章 AWS Simple Workflow 组件

作为 Camel 版本 2.13 可用

简单工作流组件支持从 Amazon 简单工作流服务 管理工作流。

前提条件

您必须有有效的 Amazon Web Services 开发人员帐户,并且必须注册以使用 Amazon Simple Workflow。如需更多信息,请参阅 Amazon Simple Workflow

36.1. URI 格式

aws-swf://<workflow|activity>[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

36.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

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

36.2.1. 路径名(1 参数):

名称描述默认类型

type

所需的 活动或工作流

 

字符串

36.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 密钥。

 

字符串

所需的 SWF 组件选项

您必须在 Registry 或 accessKey 和 secretKey 中提供 amazonSWClient,才能访问 Amazon 的 Simple Workflow Service

36.3. 使用

36.3.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

字符串

终止工作流时要用于子工作流的策略。

36.3.2. SWF Workflow Producer 设置的消息标头

标头类型描述

CamelSWFWorkflowId

字符串

使用的 worfklow 或新生成的 ID。

CamelAwsDdbKeyCamelSWFRunId

字符串

worfklow 运行 ID 已使用或生成。

36.3.3. 由 SWF Workflow Consumer 设置的消息标头

工作流使用者表示工作流逻辑。启动之后,它将开始轮询工作流决策任务并进行处理。除了处理决策任务外,工作流使用者路由还会接收信号(从工作流制作者结束)或状态查询。工作流消费者的主要目的是使用活动制作者安排活动任务以进行执行。实际活动任务只能从工作流消费者启动的线程调度。

标头类型描述

CamelSWFAction

字符串

指明什么是当前事件:CamelSWFActionExecute、CamelSWFSignalReceivedAction 或 CamelSWFGetStateAction。

CamelSWFWorkflowReplaying

布尔值

指明当前的决策任务是重播的。

CamelSWFWorkflowStartTime

long

此决策任务的开始事件的时间。

36.3.4. SWF Activity Producer 设置的消息标头

活动制作者允许调度活动任务。活动制作者只能从工作流消费者开启的线程使用,它可以处理由工作流使用者启动的同步交换。

标头类型描述

CamelSWFEventName

字符串

要调度的活动名称。

CamelSWFVersion

字符串

要调度的活动版本。

36.3.5. SWF Activity Consumer 设置的消息标头

标头类型描述

CamelSWFTaskToken

字符串

报告手动完成任务完成的任务令牌。

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

36.4. 依赖项

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 或更高版本)。

36.5. 另请参阅

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

AWS 组件

第 37 章 AWS XRay Component

可作为 Camel 2.21 可用

camel-aws-xray 组件用于使用 AWS XRay 跟踪和计时传入的 Camel 消息。

事件(subsegments)会捕获用于传入和传出消息。

37.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>

37.2. 配置

AWS XRay tracer 的配置属性是:

选项默认值描述

addExcludePatterns

 

设置 exclude 模式,它将为与 模式匹配的 Camel 消息禁用追踪。内容是一个 Set<String>,其中密钥是匹配的 routeId。该模式使用来自 Intercept 的规则。

setTracingStrategy

NoopTracingStrategy

可以提供自定义 Camel InterceptStrategy 来跟踪 BeanDefinitionProcessDefinition 等调用的处理器定义。TraceAnnotatedTracingStrategy 将跟踪通过 .bean (…​).process (…​) 调用的所有类,并在类级别包含 @XRayTrace 注解。

目前,只有 AWS XRay tracer 可以配置为为 Camel 应用程序提供分布式追踪:

37.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 模式。

37.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 进程。

37.3. 示例

您可以找到一个演示在此项目附带的测试中配置 AWS XRay 追踪方法示例。

第 38 章 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

支持在队列中存储和检索消息

第 39 章 Azure Storage Blob Service Component

作为 Camel 版本 2.19 可用

Azure Blob 组件支持从 Azure Storage Blob 服务存储和检索 Blob。

前提条件

您必须具有有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户

39.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");

39.2. URI 选项

Azure Storage Blob Service 组件没有选项。

Azure Storage Blob Service 端点使用 URI 语法进行配置:

azure-blob:containerOrBlobUri

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

39.2.1. 路径参数(1 参数)

名称描述默认类型

containerOrBlobUri

必需 : Container 或 Blob compact URI。

 

字符串

39.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 的 file 目录。

 

字符串

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 元数据。

 

map

blobPrefix (producer)

设置可用于列出 Blob 的前缀。

 

字符串

closeStreamAfterWrite (producer)

在写入或保持打开后关闭流,默认为 true。

true

布尔值

operation (producer)

blob 服务操作提示到制作者。

listBlobs

BlobServiceOperations

streamWriteSize (producer)

设置写入块和页面块的缓冲大小。

 

int

useFlatListing (producer)

指定是否应使用扁平或分级 blob 列表。

true

布尔值

同步 (高级)

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

false

布尔值

所需的 Azure Storage Blob Service 组件选项

如果需要访问私有 Blob,则必须提供 containerOrBlob 名称和凭证。

39.3. 使用

39.3.1. Azure Storage Blob Service producer 设置的消息标头

标头类型描述

CamelFileName

字符串

下载的 blob 内容的文件名。

39.3.2. Azure Storage Blob Service producer consumer 设置的消息标头

标头类型描述

CamelFileName

字符串

下载的 blob 内容的文件名。

39.3.3. 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 页面范围。

39.3.4. Azure Blob 客户端配置

如果您的 Camel 应用程序是在防火墙后面运行,或者您需要更多地控制 Azure Blob 客户端配置,您可以创建自己的实例:

StorageCredentials credentials = new StorageCredentialsAccountAndKey(accountName, accessKey);
CloudBlob client = new CloudBlockBlob(URI.create("https://"
                    + accountName + ".blob.core.windows.net/" + containerName
                    + "/" + fileName), credentials);
registry.bind("azureBlobClient", client);

在 Camel azure-blob 组件配置中引用此实例:

from("azure-blob://" + accountName + "/" + containerName + "/" + fileName + "?azureBlobClient=#client")
.to("mock:result");

39.4. 依赖项

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 或更高版本)。

39.5. 另请参阅

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

第 40 章 Azure Storage Queue Service 组件

作为 Camel 版本 2.19 可用

Azure Queue 组件支持存储和检索消息到 Azure Storage Queue 服务。

前提条件

您必须具有有效的 Windows Azure Storage 帐户。如需更多信息,请参阅 Azure 文档门户

40.1. URI 格式

azure-queue://accountName/queueName[?options]

如果队列尚不存在,则会创建队列。
您可以以以下格式将查询选项附加到 URI: ?options=value&option2=value&…​

例如,若要从 camelazure 存储帐户中的队列 messageQueue 中获取消息内容,请使用以下代码片段:

from("azure-queue:camelazure/messageQueue").
to("file://queuedirectory");

40.2. URI 选项

Azure Storage Queue Service 组件没有选项。

Azure Storage Queue Service 端点使用 URI 语法进行配置:

azure-queue:containerAndQueueUri

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

40.2.1. 路径参数(1 参数)

名称描述默认类型

containerAndQueueUri

必需 :容器队列紧凑 URI。

 

字符串

40.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)

消息可见性延迟(以秒为单位)。

 

int

operation (producer)

将服务操作排队到制作者。

listQueues

QueueServiceOperations

queuePrefix (producer)

设置可用于列出队列的前缀。

 

字符串

同步 (高级)

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

false

布尔值

所需的 Azure Storage Queue Service 组件选项

您必须提供 containerAndQueue URI 和凭证。

40.3. 使用

40.3.1. Azure Queue Service 操作

操作描述

listQueues

列出队列。

createQueue

创建队列。

deleteQueue

删除队列。

addMessage

向队列添加消息。

retrieveMessage

从队列检索消息。

peekMessage

查看队列中的消息,例如,确定消息是否到达正确的队列。

updateMessage

更新队列中的消息。

deleteMessage

删除队列中的消息。

40.3.2. 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");

40.4. 依赖项

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.5. 另请参阅

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

第 41 章 Barcode DataFormat

作为 Camel 版本 2.14 可用

条形数据格式基于 zxing 库。此组件的目标是从字符串(marshal)和 barcode 镜像(unmarshal)创建 barcode 镜像。您可以自由选择使用 zxing 提供的所有功能。

41.1. 依赖项

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

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-barcode</artifactId>
  <version>x.x.x</version>
</dependency>

41.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。

41.3. 使用 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 文档。

41.3.1. marshalling

from("direct://code")
  .marshal(code)
  .to("file://barcode_out");

您可以使用以下测试类调用路由:

template.sendBody("direct://code", "This is a testmessage!");

您应该在该镜像的 'barcode_out' 文件夹中找到:

image

41.3.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 的值。

 

 

第 42 章 Base64 DataFormat

作为 Camel 2.11 版本提供

Base64 数据格式用于 base64 编码和解码。

42.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。

在 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>

大多数时候,如果您使用默认选项,则不需要声明数据格式。在这种情况下,您可以声明内联数据格式,如下所示。

42.2. 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"/>

42.3. unmarshal

在本例中,我们在由 newOrder 处理器处理前,将来自 JMS 队列的有效负载分到字节[] 对象。

from("jms://queue/order")
    .unmarshal().base64()
    .process("newOrder");

在 Spring DSL 中:

 <from uri="jms://queue/order">
 <marshal>
     <base64/>
 </marshal>
 <to uri="bean:newOrder"/>

42.4. 依赖项

要在 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>

第 43 章 Bean 组件

作为 Camel 版本 1.0 可用

bean: 组件将 Bean 绑定到 Camel 消息交换。

43.1. URI 格式

bean:beanName[?options]

其中 beanID 可以是用于在 Registry 中查找 bean 的任何字符串

43.2. 选项

Bean 组件没有选项。

Bean 端点使用 URI 语法配置:

bean:beanName

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

43.2.1. 路径名(1 参数):

名称描述默认类型

beanName

必需 设置要调用的 bean 的名称

 

字符串

43.2.2. 查询参数(5 参数):

名称描述默认类型

方法 (生成器)

设置在 bean 上调用的方法的名称

 

字符串

cache (advanced)

如果启用,Camel 将缓存第一个 Registry 查找的结果。如果 registry 中的 bean 定义为单例范围,则可以启用缓存。

false

布尔值

multiParameterArray (advanced)

弃用了 如何处理从消息正文传递的参数;如果为 true,则消息正文应该是参数的数组。注:此选项由 Camel 内部使用,它不适用于最终用户。弃用备注:此选项由 Camel 内部使用,且不适用于最终用户。

false

布尔值

参数 (高级)

用于配置 bean 中的其他属性

 

map

同步 (高级)

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

false

布尔值

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

43.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>

43.4. Bean 作为端点

Camel 还支持调用 Bean 作为端点。在以下路由中:

情况是,当交换路由到 myBean Camel 时,将使用 Bean Binding 调用 bean。
bean 的源只是普通 POJO:

Camel 将使用 Bean Binding 来调用 sayHello 方法,通过将 Exchange 的 In body 转换为 String 类型,并将方法的输出存储在 Exchange Out 正文中。

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

43.6. bean Binding

如何选择需要调用的方法(如果没有通过 方法 参数明确指定),并从消息构建参数值如何由 Bean Binding 机制定义,该机制在整个 Camel 中各种 Bean 集成机制都使用它。

43.7. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • 组件
  • bean Binding
  • Bean 集成

第 44 章 BeanIO DataFormat

作为 Camel 2.10 版本提供

BeanIO 数据格式使用 BeanIO 处理扁平载荷(如 XML、CSV、分隔或固定长度格式)。

BeanIO 使用一个 映射 XML 文件进行配置,在其中定义从扁平格式到对象(POJO)的映射。使用这个映射文件是必须的。

44.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。

44.2. 使用

映射文件的示例如下:

44.2.1. 使用 Java DSL

要使用 BeanIODataFormat,您需要使用映射文件以及流的名称配置数据格式。
在 Java DSL 中,这可如下所示。streamName 是 "employeeFile"。

然后,我们有两个路由。第一个路由用于将 CSV 数据转换为 List<Employee> Java 对象。然后,我们被分割,因此模拟端点
会接收每行的消息。

第二代路由用于反向操作,以将 List<Employee> 转换为 CSV 数据流。

例如,CSV 数据可如下所示:

44.2.2. 使用 XML DSL

要在 XML 中使用 BeanIO 数据格式,您需要使用 <beanio> XML 标签进行配置,如下所示。路由与上例类似。

44.3. 依赖项

要在 Camel 路由中使用 BeanIO,您需要添加实现此数据格式的 camel-beanio 依赖关系。

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-beanio</artifactId>
  <version>2.10.0</version>
</dependency>

第 45 章 Beanstalk 组件

作为 Camel 版本 2.15 可用

Camel-beanstalk 项目为 Beanstalk 作业检索和后处理作业提供了 Camel 组件。

您可以在 Beanstalk 协议 中找到 Beanstalk 作业生命周期的详细说明。

45.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 或更高版本)。

45.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。

45.3. Beanstalk 选项

Beanstalk 组件支持下面列出的 2 个选项。

名称描述默认类型

connectionSettings Factory (common)

自定义 ConnectionSettingsFactory.指定使用哪个 ConnectionSettingsFactory 连接到 Beanstalkd。在没有 Beantalkd 守护进程的情况下进行单元测试(您可以模拟 ConnectionSettings)

 

ConnectionSettings Factory

resolveProperty Placeholders (advanced)

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

true

布尔值

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

beanstalk:connectionSettings

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

45.3.1. 路径名(1 参数):

名称描述默认类型

connectionSettings

连接设置主机:port/tube

 

字符串

45.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

布尔值

producer 行为受 command 参数影响,后者告知执行该作业的操作,可以是

用户在保留或等待 Camel 路由处理它后马上删除作业。虽然第一种方案更像是"消息队列",但第二个情况与"作业队列"类似。这个行为由 consumer.awaitJob 参数控制,它等于 true (后续 Beanstalkd 性质)。

同步时,消费者在成功完成时调用 delete ,并在失败时调用 bury 。您可以通过在 URI 中指定 consumer.onFailure 参数,在失败时执行哪一个命令。它可以取 bur y 的值, 删除或 释放

有一个布尔值参数 consumer.useBlockIO ,它对应于 JavaBeanstalkClient 库中的相同参数。默认情况下,它是 true

在指定版本 时要小心,因为失败的作业将立即出现在同一 tube 中,并且您的消费者将尝试再次获取它。 您可以 在此期间发布 并指定 jobDelay 。

Beantalk使用者是一个 Scheduled Polling Consumer,这意味着您可以配置更多选项,如消费者轮询的频率。如需了解更多详细信息,请参阅轮询消费者。

45.4. 使用者标头

使用者在 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

该作业启动的次数

45.5. 例子

此 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 个作业到正常队列。 

 

45.6. 另请参阅

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

第 46 章 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>

46.1. URI 格式

bean-validator:label[?options]

或者

bean-validator://label[?options]

其中 label 是描述端点的任意文本值。
您可以使用以下格式在 URI 中附加查询选项 ?option=value&option=value&…​

46.2. URI 选项

Bean Validator 组件没有选项。

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

bean-validator:label

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

46.2.1. 路径名(1 参数):

名称描述默认类型

label

需要 标签是描述端点的任意文本值

 

字符串

46.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

布尔值

46.3. 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

46.4. 示例

假设我们带有以下注解的 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>

46.5. 另请参阅

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

第 47 章 绑定组件(已弃用)

作为 Camel 2.11 版本提供

在 Camel 术语中,绑定 是一种在合同中嵌套端点的方法;如数据格式、内容增强器 或验证步骤。绑定是可选的,您可以选择在任何 camel 端点上使用它们。

SwitchYard 项目 将服务合同添加到各种技术(如 Camel 和许多其他技术)来激发绑定。但是,Camel Bindings 并未将 Camel 嵌套在 SCA 中,而是提供将 Camel 端点嵌套在 Camel 框架本身中的合同;因此,您可以在任何 Camel 路由中使用它们。

47.1. 选项

Binding 组件没有选项。

Binding 端点使用 URI 语法配置:

binding:bindingName:delegateUri

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

47.1.1. 路径名(2 参数):

名称描述默认类型

bindingName

Camel 注册表中查询 所需的 绑定名称。

 

字符串

delegateUri

需要 委派端点的 Uri。

 

字符串

47.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

布尔值

47.2. 使用绑定

绑定目前是一个定义合同的 bean (尽管我们希望向 Camel DSL 添加绑定)。

定义绑定端点的方法有几种(即具有绑定绑定的端点)。

47.3. 使用绑定 URI

您可以使用 binding:nameOfBinding: 前缀为任何端点 URI,其中 nameOfBinding 是 registry 中的 Binding bean 的名称。

from("binding:jaxb:activemq:myQueue").to("binding:jaxb:activemq:anotherQueue")

此处我们使用了"jaxb"绑定,例如,可以使用 JAXB 数据格式进行汇总和未汇总的消息。

47.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 来回放和关闭队列。

47.5. 何时使用绑定

如果您在一个路由中仅使用端点一次,则绑定实际上可能比直接使用 'raw' 端点并照正常使用显式 marshalling 和 验证更为复杂和工作。

但是,当您将多个路由组成在一起时,绑定可以有所帮助;或使用一个路由作为"模板",用于配置输入和输出端点;绑定提供了将合同和端点嵌套在一起的不错方法。

绑定的另一个优点是,当您使用多个使用相同绑定的端点时,而不必提到特定的数据格式或验证规则,您只能使用 BindingComponent 将端点嵌套在您选择的绑定中。

因此绑定是构成工具的真正位置;只有当情况至关重要时,使用它们才会有额外的复杂性,除非您有大量路由或端点。

第 48 章 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 开始,不再如此,因为您可以在同一软件包中安全地有多个模型,因为现在您可以使用类名称而不是软件包名称来配置绑定。

48.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。

48.2. 注解

创建的注解可将您的模型的不同概念映射到 POJO,如 :

  • 记录类型(csv、键值对(例如 FIX 消息)、固定长度 …​)、
  • 链接(用于链接对象),
  • DataField 及其属性(int、type、…​))
  • KeyValuePairField(对于在修复财务消息中具有的 key = 价值格式)
  • 部分(用于识别标题、正文和页脚部分)
  • OneToMany,
  • BindyConverter (since 2.18.0),
  • 格式因素(自 2.18.0 开始)

本节将描述它们:

48.3. 1. CsvRecord

CsvRecord 注解用于标识模型的根类。它代表记录 = CSV 文件的一行,并可链接到多个子模型类。

注解名称记录类型级别

CsvRecord

csv

参数名称typeinfo

分隔符

字符串

必需 - 可以是 '、' 或 ';' 或 'anything"。这个值被解释为正则表达式。如果要使用正则表达式中具有特殊含义的符号,例如 '|' 符号,而不是您必须屏蔽它,如 '|'

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

48.5. 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;
}

此属性仅适用于可选字段。

48.6. 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

}

48.7. 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)

48.8. 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;
}

48.9. 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;
    }

48.10. 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;
}

48.11. 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();
    }
}

48.12. 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);
            }
        };
    }
}

48.13. 支持的 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。

48.14. 使用 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);

48.14.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());

48.14.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");

48.14.3. marshaling

要从模型对象集合生成 CSV 记录,请创建以下路由:

from("direct:handleOrders")
   .marshal(bindy)
   .to("file://outbox")

48.15. 使用 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>
注意

请验证您的模型类是否实现序列化,否则队列管理器将引发错误

48.16. 依赖项

要在 camel 路由中使用 Bindy,需要添加对 camel-bindy 的依赖来实施此数据格式。

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-bindy</artifactId>
  <version>x.x.x</version>
</dependency>

第 49 章 将 OSGi 蓝图与 Camel 搭配使用

已创建一个用于 Blueprint 的自定义 XML 命名空间,以便让您充分利用 nice XML 死机。由于 Blueprint 自定义命名空间尚未标准化,但这个命名空间只能用于 Apache Aries Blueprint 实施,后者是 Apache Karaf 所用命名空间。

49.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 属性占位符

49.2. 使用 camel-blueprint

要在 OSGi 中利用 camel-blueprint,除了 camel-core 及其依赖软件包外,您还需要 Aries Blueprint 捆绑包和 camel-blueprint 捆绑包。

如果使用 Karaf,您可以使用名为 camel-blueprint 的功能,它将安装所有所需的捆绑包。

第 50 章 Bonita Component

作为 Camel 版本 2.19 可用

用于与远程 Bonita BPM 流程引擎通信。

50.1. URI 格式

bonita://[operation]?[options]

其中 operation 是要在 Bonita 上执行的特定操作。

50.2. 常规选项

Bonita 组件没有选项。

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

bonita:operation

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

50.2.1. 路径名(1 参数):

名称描述默认类型

operation

要使用 所需的操作

 

BonitaOperation

50.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 引擎进行身份验证的用户名。

 

字符串

50.3. 正文内容

对于 startCase 操作,输入变量是从正文消息中检索。这个方法必须包含一个 Map<String,Serializable>。

50.4. 例子

以下示例在 Bonita 中启动新的问题单:

from("direct:start").to("bonita:startCase?hostname=localhost&amp;port=8080&amp;processName=TestProcess&amp;username=install&amp;password=install")

50.5. 依赖项

要在 Camel 路由中使用 Bonita,您需要添加实施该组件的 camel-bonita 的依赖项。

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-bonita</artifactId>
  <version>x.x.x</version>
</dependency>

第 51 章 Boon DataFormat

作为 Camel 版本 2.16 可用

boon 是一个数据格式,它使用 Boon JSON marshalling 库将 JSON 有效负载分到 Java 对象,或将 JSON 对象聚合到 JSON 有效负载中。boon 旨在比当前使用的其他常见 解析器是一个简单而快速的 解析器。

51.1. 选项

Boon dataformat 支持下列 3 个选项。

名称默认Java 类型描述

unmarshalTypeName

 

字符串

取消armshalling 时要使用的 java 类型的类名称

useList

false

布尔值

要取消与映射列表或 Pojo 列表相关的内容。

contentTypeHeader

false

布尔值

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

51.2. 使用 Java DSL

DataFormat boonDataFormat = new BoonDataFormat("com.acme.model.Person");

from("activemq:My.Queue")
  .unmarshal(boonDataFormat)
  .to("mqseries:Another.Queue");

51.3. 使用 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>

51.4. 依赖项

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-boon</artifactId>
  <version>x.x.x</version>
</dependency>

第 52 章 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>

52.1. 连接身份验证类型

Box 组件支持三种不同类型的身份验证的连接。

52.1.1. 标准身份验证

标准身份验证 使用 OAuth 2.0 三组身份验证过程 通过 Box.com 验证其连接。这种类型的身份验证可让 Box 受管用户和 外部用户 通过 Box 组件访问、编辑并保存其 Box 内容。

52.1.2. 应用程序企业身份验证

应用 企业身份验证 使用 OAuth 2.0 和 JSON Web 令牌(JWT),将其连接验证为 Box 应用的 服务帐户。这种类型的身份验证可让服务帐户访问、编辑并保存其 Box 应用的 Box 内容(通过 Box 组件)。

52.1.3. 应用程序用户身份验证

应用程序 用户身份验证 使用带有 JSON Web 令牌(JWT)的 OAuth 2.0,将其连接验证为 Box 应用的 App User。这种类型的身份验证可让 应用程序 用户访问、编辑并保存其 Box 内容(通过 Box 组件)。

52.2. 选框选项

Box 组件支持下面列出的 2 个选项。

名称描述默认类型

configuration (common)

使用共享配置

 

BoxConfiguration

resolveProperty Placeholders (advanced)

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

true

布尔值

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

box:apiName/methodName

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

52.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

BoxApiName

methodName

所选操作需要什么子操作

 

字符串

52.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

 

字符串

52.3. URI 格式

box:apiName/methodName

apiName 可以是以下之一:

  • 协作
  • 注释
  • event-logs
  • files
  • 文件夹
  • groups
  • 事件
  • search
  • tasks
  • users

52.4. 制作者端点:

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 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。

52.4.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

52.4.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

字符串

52.4.3. endpoint Prefix events-logs

有关 Box 事件日志的更多信息,请参阅 https://developer.box.com/reference#events。以下端点可以通过前缀事件调用  如下所示:

box:event-logs/endpoint?[options]
端点简写别名选项结果 Body 类型

getEnterpriseEvents

事件

位置, after, before, [types]

java.util.List

event-logs的 URI 选项

名称类型

position

字符串

结束后

Date

之前

Date

类型

com.box.sdk.BoxEvent.Types[]

52.4.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

字符串

52.4.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, 字段

com.box.sdk.BoxFolder

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

52.4.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

groupMembershipId

com.box.sdk.BoxGroup.Info

updateGroupMembershipInfo

updateMembershipInfo

groupMembershipId, info

com.box.sdk.BoxGroupMembership

组的 URI 选项 

名称类型

name

字符串

groupId

字符串

userId

字符串

role

com.box.sdk.BoxGroupMembership.Role

groupMembershipId

字符串

info

com.box.sdk.BoxGroupMembership.Info

52.4.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

字符串

52.4.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

字符串

52.4.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

52.5. 消费者端点:

有关 Box 事件的更多信息,请参阅 https://developer.box.com/reference#events。消费者端点只能使用端点前缀 事件,如下一示例所示。

box:events/endpoint?[options]
端点简写别名选项结果 Body 类型

事件

 

[startingPosition]

com.box.sdk.BoxEvent

事件的 URI 选项 

名称类型

startingPosition

Long

52.6. 邮件标题

任何选项都可以在带有 CamelBox. 前缀的制作者端点的消息标头中提供。

52.7. 邮件正文

所有结果消息正文都使用 Box Java SDK 提供的对象。producer 端点可以在 inBody endpoint 参数中为传入消息正文指定选项名称。

52.8. 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://...");

第 53 章 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>

 

53.1. Braintree 选项

Braintree 组件支持下面列出的 2 个选项。

名称描述默认类型

configuration (common)

使用共享配置

 

BraintreeConfiguration

resolveProperty Placeholders (advanced)

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

true

布尔值

Braintree 端点使用 URI 语法配置:

braintree:apiName/methodName

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

53.1.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

BraintreeApiName

methodName

用于所选操作的子操作

 

字符串

53.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)

代理端口

 

整数

53.2. URI 格式

 

braintree://endpoint-prefix/endpoint?[options]

 

端点前缀可以是以下之一:

  • addOn
  • address
  • clientToken
  • creditCardverification
  • customer
  • 折扣
  • merchantAccount
  • paymentmethod
  • paymentmethodNonce
  • plan
  • settlementBatchSummary
  • subscription
  • transaction
  • webhookNotification

 

53.3. BraintreeComponent

Braintree 组件可使用以下选项进行配置。可以使用组件的 bean 属性 配置 org.apache.camel.component.braintree.BraintreeConfiguration 来提供这些选项。

选项类型描述

环境

字符串

指定请求应定向到 - sandbox 或 production 的位置

merchantId

字符串

网关帐户的唯一标识符,与merchant 帐户 ID 不同

publicKey

字符串

用户特定的公共标识符

privateKey

字符串

用户特定的安全标识符不应共享 - 即使与我们共享!

accessToken

字符串

使用 Braintree Auth 授予令牌,以便它们能够代表处理事务。用于代替环境、merchantId、publicKey 和 privateKey 选项。

以上所有选项都由 Braintree 支付提供

53.4. 制作者端点:

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 URI MUST 包含一个前缀。

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

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

有关端点和选项的更多信息,请参阅 https://developers.braintreepayments.com/reference/overview的 Braintree 参考。

 

53.4.1. 端点前缀 addOn

以下端点可以通过前缀 addOn 来调用,如下所示:

 

braintree://addOn/endpoint
端点简写别名选项结果 Body 类型

all

 

 

List<com.braintreegateway.Addon>

53.4.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

字符串

53.4.3. 端点前缀 clientToken

以下端点可以通过前缀 clientToken 调用,如下所示:

 

braintree://clientToken/endpoint?[options]
端点简写别名选项结果 Body 类型

generate

 

 Request (请求)

字符串

clientToken的 URI 选项

名称类型

Request (请求)

com.braintreegateway.ClientTokenrequest

53.4.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

53.4.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

53.4.6. 端点前缀 折扣

以下端点可以通过前缀 折扣 调用,如下所示:

 

braintree://discount/endpoint
端点简写别名选项结果 Body 类型

all

 

 

List<com.braintreegateway.Discount>

+
+

53.4.7. 端点前缀 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

53.4.8. 端点前缀 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

53.4.9. 端点前缀 paymentMethodNonce

以下端点可以使用前缀 paymentMethodNonce 调用,如下所示:

 

braintree://paymentMethodNonce/endpoint?[options]
端点简写别名选项结果 Body 类型

create

 

paymentMethodToken

com.braintreegateway.Result<com.braintreegateway.PaymentMethodNonce>

find

 

paymentMethodNonce

com.braintreegateway.PaymentMethodNonce

支付MethodNonce的 URI 选项

名称类型

paymentMethodToken

字符串

paymentMethodNonce

字符串

53.4.10. 端点前缀 计划

以下端点可以通过前缀 计划 调用,如下所示:

 

braintree://plan/endpoint
端点简写别名选项结果 Body 类型

all

 

 

List<com.braintreegateway.Plan>

 

53.4.11. 端点前缀 settlementBatchSummary

以下端点可以通过前缀 settlement BatchBatchBatchmary 调用,如下所示:

 

braintree://settlementBatchSummary/endpoint?[options]
端点简写别名选项结果 Body 类型

generate

 

 Request (请求)

com.braintreegateway.Result<com.braintreegateway.SettlementBatchSummary>

settlement BatchSummary 的URI 选项

名称类型

settlementDate

日历

groupByCustomField

字符串

53.4.12. 端点前缀 订阅

以下端点可以通过前缀 订阅 调用,如下所示:

 

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.

 

53.4.13. 端点前缀 事务

以下端点可以通过前缀 事务 调用,如下所示:

 

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

53.4.14. 端点前缀 WebhookNotification

以下端点可以通过前缀 webhookNotification 来调用,如下所示:

 

braintree://webhookNotification/endpoint?[options]
端点简写别名选项结果 Body 类型

parse

 

 签名, 有效负载

com.braintreegateway.WebhookNotification

验证

 

挑战

字符串

WebhookNotification的 URI 选项

名称类型

签名

字符串

有效负载

字符串

挑战

字符串

 

53.5. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Options 和 consumer. 前缀来调度端点调用。默认情况下,返回数组或集合的 Consumer 端点将为每个元素生成一个交换,并且每个交换将执行一次其路由。要更改此行为,请使用属性 consumer.splitResults=true 为整个列表或数组返回单个交换。 

53.6. 消息标头

任何 URI 选项都可以在具有 CamelBraintree. 前缀的生产端点的消息标头中提供。

53.7. 邮件正文

所有结果消息正文都使用 Braintree Java SDK 提供的对象。producer 端点可以在 inBody endpoint 参数中为传入消息正文指定选项名称。

 

 

53.8. 例子

蓝图(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>

53.9. 另请参阅

* 配置 Camel * 组件 * Endpoint * Getting Started

 

 

第 54 章 浏览组件

作为 Camel 版本 1.3 提供

Browse 组件提供了一个简单的 BrowsableEndpoint,可用于测试、可视化工具或调试。发送到端点的交换都可用于浏览。

54.1. URI 格式

browse:someName[?options]

其中 someName 可以是唯一标识端点的任意字符串。

54.2. 选项

Browse 组件没有选项。

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

browse:name

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

54.2.1. 路径名(1 参数):

名称描述默认类型

name

必需 A 名称,可以是任何可唯一标识端点的字符串

 

字符串

54.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

布尔值

54.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
    }
}

54.4. 另请参阅

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

第 55 章 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>

55.1. URI 格式

cache://cacheName[?options]

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

55.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

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

55.2.1. 路径名(1 参数):

名称描述默认类型

cacheName

缓存 所需的 名称

 

字符串

55.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

布尔值

55.3. 从缓存发送/查看消息

55.3.1. Message Headers 最多为 Camel 2.7

标头描述

CACHE_OPERATION

要在缓存上执行的操作。有效选项包括

* GET * CHECK * ADD * UPDATE * DELETE * DELETEALL
GETCHECK 需要 Camel 2.3 开始。

CACHE_KEY

用于将消息存储在缓存中的缓存密钥。如果 CACHE_OPERATION 是 DELETEALL,则缓存键是可选的

55.3.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: 内容是否合理。

55.3.3. cache Producer

将数据发送到缓存时,需要能够直接将交换的有效负载存储在预先存在的或创建on-按需缓存中。这样做的好处包括

  • 设置上述显示的消息交换标头。
  • 确保 Message Exchange Body 包含定向到缓存的消息

55.3.4. 缓存消费者

从缓存接收数据涉及使用事件 Listener 侦听预先存在的或创建按需缓存的功能,并在任何缓存活动发生时接收自动通知(例如 CamelCacheGet/CamelCacheUpdate/CamelCacheDelete/CamelCacheDelete/CamelCacheDelete/CamelCacheDelete/CamelCacheDeleteAll)。在这样的活动中

  • 包含消息交换标头和消息交换正文(包含刚刚添加/更新有效负载)的交换会被放入并发送。
  • 如果是 CamelCacheDeleteAll 操作,则不会填充消息交换标头 CamelCacheKey 和 Message Exchange Body。

55.3.5. 缓存处理器

有一组 nice 处理器,能够执行缓存查找并有选择地替换有效负载内容。

  • 正文(body)
  • token
  • XPath 级别

55.4. 缓存使用示例

55.4.1. 示例 1:配置缓存

from("cache://MyApplicationCache" +
          "?maxElementsInMemory=1000" +
          "&memoryStoreEvictionPolicy=" +
              "MemoryStoreEvictionPolicy.LFU" +
          "&overflowToDisk=true" +
          "&eternal=true" +
          "&timeToLiveSeconds=300" +
          "&timeToIdleSeconds=true" +
          "&diskPersistent=true" +
          "&diskExpiryThreadIntervalSeconds=300")

55.4.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")
   }
};

55.4.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")
   }
};

55.4.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")
   }
};

55.4.5. 示例 4:删除缓存中的所有现有密钥

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("direct:start")
     .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_DELETEALL))
     .to("cache://TestCache1");
    }
};

55.4.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
        }
     })
   }
};

55.4.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");
   }
};

55.4.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");

55.4.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();

55.5. 管理 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 参数。

55.6. 缓存复制 Camel 2.8

Camel 缓存组件可以使用多种不同的复制机制在服务器节点之间分发缓存,包括:RMI、JGroups、JMS 和缓存服务器。

使其工作有两种不同的方法:

1.您可以手动配置 ehcache.xml

或者

2.您可以配置以下三个选项:

  • cacheManagerFactory
  • eventListenerRegistry
  • cacheLoaderRegistry

使用第一个选项配置 Camel 缓存复制是一些硬工作,因为您必须单独配置所有缓存。因此,当所有缓存名称未知时,使用 ehcache.xml 不是一个好主意。

当希望使用多个不同的缓存时,第二个选项会更好,因为您不需要为每个缓存定义选项。这是因为,每个 CacheManager 和每个 CacheEndpoint 设置复制选项。另外,这也是在开发阶段不能知道缓存名称的唯一方法。

注意 :阅读 EHCache 手动 以更好地了解 Camel 缓存复制机制可能会很有用。

55.6.1. 示例: JMS 缓存复制

JMS 复制是最强大且安全的复制方法。与 Camel 缓存复制一同使用使得它变得更加简单。一个示例 位于单独的页面 中。

第 56 章 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>

56.1. URI 格式

caffeine-cache://cacheName[?options]

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

56.2. 选项

Caffeine Cache 组件支持下面列出了 2 个选项。

名称描述默认类型

配置 (高级)

设置全局组件配置

 

CaffeineConfiguration

resolveProperty Placeholders (advanced)

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

true

布尔值

Caffeine Cache 端点使用 URI 语法配置:

caffeine-cache:cacheName

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

56.2.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

56.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 章 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>

57.1. URI 格式

caffeine-loadcache://cacheName[?options]

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

57.2. 选项

Caffeine LoadCache 组件支持下面列出的 2 选项。

名称描述默认类型

配置 (高级)

设置全局组件配置

 

CaffeineConfiguration

resolveProperty Placeholders (advanced)

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

true

布尔值

Caffeine LoadCache 端点使用 URI 语法配置:

caffeine-loadcache: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

字符串

第 58 章 Castor DataFormat (已弃用)

作为 Camel 版本 2.1 提供

Castor 是一个数据格式,它使用 Cast or XML 库 将 XML 有效负载分到 Java 对象或将 Java 对象编入 XML 有效负载中。

通常使用 Java DSL 或 Spring XML 来操作 Castor 数据格式。

58.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();

58.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>

58.3. 选项

Castor 数据格式支持 9 个选项,它们如下。

名称默认Java 类型描述

mappingFile

 

字符串

从 classpath 中加载的 Castor 映射文件的路径。

whitelistEnabled

true

布尔值

定义是否启用 Whitelist 功能

allowedUnmarshallObjects

 

字符串

定义允许的对象进行取消marshalled。您可以指定允许对象的 FQN 类名称,您可以使用逗号分隔多个条目。也可以使用通配符和正则表达式,该表达式基于链接 org.apache.camel.util.EndpointHelpermatchPattern (String, String)定义的模式。拒绝的对象优先于允许的对象。

deniedUnmarshallObjects

 

字符串

定义要取消摘要的拒绝对象。您可以指定取消对象的 FQN 类名称,您可以使用逗号来分隔多个条目。也可以使用通配符和正则表达式,该表达式基于链接 org.apache.camel.util.EndpointHelpermatchPattern (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。

58.4. 依赖项

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

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-castor</artifactId>
  <version>x.x.x</version>
</dependency>

第 59 章 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 蓝图。

59.1. 自动配置的 Camel 上下文

Camel CDI 自动部署和配置 CamelContext bean。当 CDI 容器初始化(关机)时,CamelContext bean 会自动实例化、配置和启动(重新创建)。它可在应用程序中注入,例如:

@Inject
CamelContext context;

默认的 CamelContext bean 通过内置的 @Default qualifier 进行授权,范围为 @ApplicationScoped,是 DefaultCamelContext 类型。

请注意,这个 bean 也可以以编程方式自定义,其他 Camel 上下文 Bean 也可以部署到应用程序中。

59.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);
}

59.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;

59.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);
    }
}

59.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;

59.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 示例。

59.7. 自动配置的类型转换器

使用 @Converter 注释标注的 CDI Bean 会自动注册到部署的 Camel 上下文中,例如:

@Converter
public class MyTypeConverter {

    @Converter
    public Output convert(Input input) {
        //...
    }
}

请注意,CDI 注入在类型转换器中被支持。

59.8. Camel Bean 集成

59.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) {
    //...
}

 

59.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");

59.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;
}

59.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 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 事件的支持才会激活。

59.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 上下文模型,在端点实例和观察程序方法之间可以有效绑定。

59.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/>

59.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 资源。

以后将添加更多灵活的策略来支持更广泛的部署场景。

59.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.

59.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));
    }
}

59.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 示例。

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

59.15. Maven Archetype

在可用的 Camel Maven 原型 中,您可以使用提供的 camel-archetype-cdi 生成 Camel CDI Maven 项目,例如:

mvn archetype:generate -DarchetypeGroupId=org.apache.camel.archetypes -DarchetypeArtifactId=camel-archetype-cdi

59.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

59.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 用例

59.18. 另请参阅

59.19. 在 {wildfly-camel} 上进行 EAR 部署的 Camel CDI

与标准 WAR 或 JAR 部署相比,在 {wildfly-camel} 上的 Camel CDI EAR 部署在类和资源加载方面存在一些差异。

{WildFly} bootstraps weld 使用 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 搭配使用的正确 ClassLoader。

第 60 章 Chronicle Engine 组件

作为 Camel 2.18 版提供

camel chronicle-engine 组件可让您利用 OpenHFT 的 Chronicle-Engine 的力量

60.1. URI 格式

chronicle-engine:addresses/path[?options]

60.2. URI 选项

Chronicle Engine 组件没有选项。

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

chronicle-engine:addresses/path

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

60.2.1. 路径名(2 参数):

名称描述默认类型

addresses

所需的 引擎地址。可以使用逗号分隔多个地址。

 

字符串

path

所需的 引擎路径

 

字符串

60.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 章 块组件

作为 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>

61.1. URI 格式

chunk:templateName[?options]

其中 templateName 是要调用的模板的 classpath-local URI。

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

61.2. 选项

Chunk 组件没有选项。

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

chunk:resourceUri

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

61.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

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

 

字符串

61.2.2. 查询参数(7 参数):

名称描述默认类型

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

encoding (producer)

定义正文编码

 

字符串

extension (producer)

定义模板的文件扩展

 

字符串

themeFolder (producer)

定义要扫描的 themes 文件夹

 

字符串

themeLayer (producer)

将主题层定义为 elaborate

 

字符串

themeSubfolder (producer)

定义要扫描的辅助子文件夹

 

字符串

同步 (高级)

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

false

布尔值

chunk 组件将在其文件夹中查找带有 extensions .chtml 或 _.cxml. _If 的特定模板,您需要指定不同的文件夹或扩展,您需要使用上面列出的特定选项。

61.3. 块上下文

Camel 将在 Chunk 上下文中提供交换信息(调整 map)。交换 的传输如下:

 

keyvalue

exchange

Exchange 本身。

exchange.properties

Exchange 属性。

标头

In 消息的标头。

camelContext

Camel 上下文.

request

In 消息。

正文(body)

In message body。

response

Out 消息(仅适用于 InOut 消息交换模式)。

61.4. 动态模板

Camel 提供了两个标头,您可以为模板或模板内容本身定义不同的资源位置。如果设置了其中任何标头,Camel 会将其用于端点配置的资源。这可让您在运行时提供动态模板。

标头类型描述支持版本

ChunkConstants.CHUNK_RESOURCE_URI

字符串

要使用的模板资源的 URI,而不是配置的端点。

 

ChunkConstants.CHUNK_TEMPLATE

字符串

要使用的模板,而不使用配置的端点。

 

61.5. 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");

使用 Chunk 组件选项的示例:

from("direct:in").
to("chunk:file_example?themeFolder=template&themeSubfolder=subfolder&extension=chunk");

在这个示例中,Chunk 组件会在文件夹 template/subfolder 中查找 file_example.chunk 文件。

61.6. 电子邮件示例

在本例中,我们想使用 Chunk 模板进行单次确认电子邮件。电子邮件模板在 Chunk 中称为:

 
Dear {$headers.lastName}, {$headers.firstName}

Thanks for the order of {$headers.item}.

Regards Camel Riders Bookstore
{$body}

61.7. 另请参阅

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

第 62 章 类组件

Camel 版本 2.4 中可用

类: 组件将 Bean 绑定到 Camel 消息交换。它的工作方式与 Bean 组件相同,但并不是从 Registry 中查找 Bean,而是根据类名称创建 bean。

62.1. URI 格式

class:className[?options]

其中 className 是要创建和使用为 bean 的完全限定类名称。

62.2. 选项

Class 组件没有选项。

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

class:beanName

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

62.2.1. 路径名(1 参数):

名称描述默认类型

beanName

必需 设置要调用的 bean 的名称

 

字符串

62.2.2. 查询参数(5 参数):

名称描述默认类型

方法 (生成器)

设置在 bean 上调用的方法的名称

 

字符串

cache (advanced)

如果启用,Camel 将缓存第一个 Registry 查找的结果。如果 registry 中的 bean 定义为单例范围,则可以启用缓存。

false

布尔值

multiParameterArray (advanced)

弃用了 如何处理从消息正文传递的参数;如果为 true,则消息正文应该是参数的数组。注:此选项由 Camel 内部使用,它不适用于最终用户。弃用备注:此选项由 Camel 内部使用,且不适用于最终用户。

false

布尔值

参数 (高级)

用于配置 bean 中的其他属性

 

map

同步 (高级)

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

false

布尔值

62.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");

62.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 组件中更详细,因为 该类组件的工作方式与这个类 组件相同。

62.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • bean
  • bean Binding
  • Bean 集成

第 63 章 CMIS 组件

作为 Camel 2.11 版本提供

cmis 组件使用 Apache Chemistry 客户端 API,并允许您从 CMIS 兼容内容存储库中添加/读取节点。

63.1. URI 格式

cmis://cmisServerUrl[?options]

您可以以以下格式将查询选项附加到 URI 中,?options=value&option2=value&…​

63.2. CMIS 选项

CMIS 组件支持下面列出的 2 个选项。

名称描述默认类型

sessionFacadeFactory (common)

使用自定义 CMISSessionFacadeFactory 来创建 CMISSessionFacade 实例

 

CMISSessionFacade Factory

resolveProperty Placeholders (advanced)

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

true

布尔值

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

cmis:cmsUrl

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

63.2.1. 路径名(1 参数):

名称描述默认类型

cmsUrl

cmis 仓库 所需的 URL

 

字符串

63.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 仓库的用户名

 

字符串

63.3. 使用

63.3.1. 由制作者评估的消息标头

标头默认值描述

CamelCMISFolderPath

/

执行期间要使用的当前文件夹。如果未指定,则使用根文件夹

CamelCMISRetrieveContent

false

queryMode 中,此标头将强制制作者检索文档节点的内容。

CamelCMISReadSize

0

要读取的节点数量上限。

cmis:path

null

如果没有设置 CamelCMISFolderPath,将尝试从此 cmis 属性中找到节点的路径,并将其命名为

cmis:name

null

如果没有设置 CamelCMISFolderPath,将尝试从此 cmis 属性查找节点的路径,且路径

cmis:objectTypeId

null

节点的类型

cmis:contentStreamMimeType

null

为文档设置的 mimetype

63.3.2. 查询 Producer 操作过程中设置的消息标头

标头类型描述

CamelCMISResultCount

整数

从查询返回的节点数。

消息正文将包含映射列表,映射中的每个条目都是 cmis 属性及其值。如果将 CamelCMISRetrieveContent 标头设置为 true,则映射中带有键 CamelCMISContent 的另一个条目将包含节点类型的 输入Stream

63.4. 依赖项

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 或更高版本)。

63.5. 另请参阅

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

第 64 章 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>

64.1. 选项

CM SMS 网关组件没有选项。

CM SMS 网关端点使用 URI 语法配置:

cm-sms:host

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

64.1.1. 路径名(1 参数):

名称描述默认类型

主机

使用方案 所需的 SMS Provider HOST

 

字符串

64.1.2. 查询参数(5 参数):

名称描述默认类型

defaultFrom (producer)

这是发件人名称。最大长度为 11 个字符。

 

字符串

defaultMaxNumberOfParts (producer)

如果它是多部分消息,则强制使用 max 号。消息可以被截断。从技术上讲,网关将首先检查消息是否大于 160 个字符,消息将被剪切至由这些参数限制的多个 153 字符部分。

8

int

productToken (producer)

要使用 的唯一令牌

 

字符串

testConnectionOnStartup (producer)

是否在启动时测试与 SMS 网关的连接

false

布尔值

同步 (高级)

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

false

布尔值

64.2. 示例

您可以尝试 此项目, 了解 camel-cm-sms 如何集成到 camel-cm-sms 中。

第 65 章 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>

65.1. 选项

CoAP 组件没有选项。

CoAP 端点使用 URI 语法配置:

coap:uri

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

65.1.1. 路径名(1 参数):

名称描述默认类型

uri

CoAP 端点的 URI

 

URI

65.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

布尔值

65.2. 消息标头

名称类型描述

CamelCoapMethod

字符串

CoAP producer 在调用目标 CoAP 服务器 URI 时应使用的请求方法。有效选项包括 DELETE、GET、PING、POST 和 PUT。

CamelCoapResponseCode

字符串

外部服务器发送的 CoAP 响应代码。如需了解每个代码的含义的详细信息,请参阅 RFC 7252。

CamelCoapUri

字符串

要调用的 CoAP 服务器的 URI。将覆盖端点上直接配置的任何现有 URI。

65.2.1. 配置 CoAP producer 请求方法

以下规则决定了 CoAP producer 将用来调用目标 URI 的请求方法:

  1. CamelCoapMethod 标头的值
  2. 如果目标 CoAP 服务器 URI 上提供了查询字符串,GET
  3. POST 如果消息交换正文不为空。
  4. 否则 GET

第 66 章 恒定语言

可作为 Camel 版本 1.5 提供

Constant Expression Language 实际上是将恒定字符串指定为表达式类型的方法。

注意

这是一个固定常量值,仅在启动路由期间仅设置一次,在路由期间需要动态值,请不要使用这个选项。

66.1. 常量选项

Constant 语言支持 1 选项,这些选项如下。

名称默认Java 类型描述

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

66.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");

66.3. 依赖项

Constant 语言是 camel-core 的一部分。

第 67 章 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>

67.1. URI 格式

cometd://host:port/channelName[?options]

channelName 表示可由 Camel 端点订阅的主题。

67.2. 例子

cometd://localhost:8080/service/mychannel
cometds://localhost:8443/service/mychannel

where cometds: 表示 SSL 配置端点。

67.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

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

67.3.1. 路径名(3 参数):

名称描述默认类型

主机

所需的 主机名

 

字符串

port

所需的 主机端口号

 

int

channelName

必需的 channelName 代表 Camel 端点可订阅的主题。

 

字符串

67.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

布尔值

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

以下是如何传递参数的一些示例

对于 file (用于 Web 应用程序目录中的 webapp 资源 -→ cometd://localhost:8080?resourceBase=file./webapp
For classpath)(例如,web 资源被打包在 webapp 文件夹中 -→ istd://localhost:8080?resourceBase=classpath:webapp)

67.4. 身份验证

可从 Camel 2.8 开始

您可以将自定义 SecurityPolicyExtension's 配置为 'CometdComponent,它允许您使用 这里所述的身份验证

67.5. 为 Cometd 组件设置 SSL

67.5.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"/>...

67.6. 另请参阅

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

第 68 章 Consul 组件

作为 Camel 2.18 版提供

Consul 组件是一个将您的应用程序与 Consul 集成的组件。

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

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-consul</artifactId>
        <version>${camel-version}</version>
    </dependency>

68.1. URI 格式

    consul://domain?[options]

您可以按照以下格式将查询选项附加到 URI:

    ?option=value&option=value&...

68.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

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

68.2.1. 路径名(1 参数):

名称描述默认类型

apiEndpoint

所需的 API 端点

 

字符串

68.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

布尔值

68.3. 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 检索的值转换为字符串:

第 69 章 控制总线组件

作为 Camel 2.11 版本提供

通过 EIP 模式的 控制总线,可以在框架中监控和管理集成系统。

image

使用控制总线来管理企业集成系统。Control Bus 使用与应用程序数据相同的消息机制,但使用单独的通道来传输与消息流中涉及的组件管理相关的数据。

在 Camel 中,您可以使用 JMX 管理和监控,或者使用 CamelContext 中的 Java API,或者从 org.apache.camel.api.management 软件包
或者使用具有示例的事件通知程序。

从 Camel 2.11 开始,我们引入了一个新的 ControlBus 组件,可让您将消息发送到相应地响应的控制总线端点。

69.1. ControlBus Component

可从 Camel 2.11 开始

控制总线: 组件提供对基于 控制 总线 EIP 模式的 Camel 应用程序的简单管理。例如,通过向端点发送消息来控制路由的生命周期,或者收集性能统计。

controlbus:command[?options]

其中 命令 可以是任意字符串,以标识要使用的命令类型。

69.2. 命令

命令描述

route

使用 routeIdaction 参数控制路由。

language

允许您指定用于评估邮件正文的语言。???如果评估有任何结果,则结果将放入消息正文。

69.3. 选项

Control Bus 组件没有选项。

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

controlbus:command:language

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

69.3.1. 路径名(2 参数):

名称描述默认类型

命令

必需 命令可以是路由或语言

 

字符串

language

允许您指定用于评估消息正文的语言名称。如果评估有任何结果,则结果将放入消息正文。

 

语言

69.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&…​

69.4. 使用路由命令

通过路由命令,您可以非常轻松地在给定路由上执行常见任务,例如启动路由,您可以将空消息发送到此端点:

template.sendBody("controlbus:route?routeId=foo&action=start", null);

要获取路由的状态,您可以执行以下操作:

String status = template.requestBody("controlbus:route?routeId=foo&action=status", null, String.class);

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

69.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 等。

第 70 章 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>

70.1. URI 格式

couchbase:url

70.2. 选项

Couchbase 组件没有选项。

Couchbase 端点使用 URI 语法配置:

couchbase:protocol:hostname:port

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

70.2.1. 路径名(3 参数):

名称描述默认类型

protocol

要使用的协议

 

字符串

hostname

需要 要使用的主机名

 

字符串

port

要使用的端口号

8091

int

70.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 章 CouchDB Component

作为 Camel 2.11 版本提供

通过 couchdb: 组件,您可以将 CouchDB 实例视为生成者或消息使用者。使用轻量级 LightCouch API,这个 camel 组件具有以下特性:

  • 作为使用者,monitor couch changesets 用于插入、更新和删除和删除这些消息并将其作为消息发布到 camel 路由。
  • 作为制作者,可以保存、更新并从 Camel 2.18 删除(通过使用 DELETE 值的 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>

71.1. URI 格式

couchdb:http://hostname[:port]/database?[options]

其中 hostname 是正在运行的 couchdb 实例的主机名。端口是可选的,如果没有指定,则默认为 5984。

71.2. 选项

CouchDB 组件没有选项。

CouchDB 端点使用 URI 语法配置:

couchdb:protocol:hostname:port/database

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

71.2.1. 路径名(4 参数):

名称描述默认类型

protocol

需要 用于与数据库通信的协议。

 

字符串

hostname

运行 couchdb 实例的 所需 主机名

 

字符串

port

运行 couchdb 实例的端口号

5984

int

database

要使用的数据库 所需的 名称

 

字符串

71.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)

身份验证数据库时的用户名

 

字符串

71.3. Headers

在消息传输过程中,会对交换设置以下标头。

属性

CouchDbDatabase

消息来自的数据库

CouchDbSeq

couchdb 更改更新/删除消息的序列号

CouchDbId

couchdb 文档 id

CouchDbRev

couchdb 文档修订

CouchDbMethod

方法(删除 / update)

在收到消息后,消费者设置标头。在进行插入/更新之后,生产者还将为下游处理器设置标头。在制作者之前设置的任何标头都将被忽略。例如,如果您将 CouchDbId 设为标头,则不会将其用作插入的 id,则仍会使用文档的 id。

71.4. Message Body

组件将使用消息正文作为要插入的文档。如果正文是一个 String 实例,则会在插入前将其整合到 GSON 对象中。这意味着字符串必须是有效的 JSON,否则插入 / 更新将失败。如果正文是 com.google.gson.JsonElement 的实例,它将按原样进行插入。否则,生产者将抛出一个不支持的正文类型例外。

71.5. 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")

第 72 章 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>

72.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 端点。

72.2. Cassandra 选项

Cassandra CQL 组件没有选项。

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

cql:beanRef:hosts:port/keyspace

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

72.2.1. 路径名(4 参数):

名称描述默认类型

beanRef

beanRef 使用 bean:id 定义

 

字符串

主机

hostname (s) cassansdra server (s)。可以使用逗号分隔多个主机。

 

字符串

port

cassansdra server (s)的端口号

 

整数

keyspace

要使用的密钥空间

 

字符串

72.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

布尔值

72.3. 消息

72.3.1. 传入信息

Camel Cassandra 端点预计将作为查询参数绑定到 CQL 语句的简单对象(对象或 Object [] 或 Collection<Object>)。如果消息正文为空或为空,则执行 CQL 查询而无需绑定参数。

标头:

  • CamelCqlQuery (可选、StringRegularStatement):CQL 查询可以是纯文本字符串,也可以使用 QueryBuilder 构建的。

72.3.2. 传出消息

Camel Cassandra 端点根据 结果SetConversionStrategy 生成一个或多个 Cassandra Row 对象:

 

  • 如果 resultSetConversionStrategyALLLIMIT_[0-9]+,则 列出<Row >
  • single'ow' if resultSetConversionStrategy is ONE
  • 否则,如果 resultSetConversionStrategyResultSetConversionStrategy的自定义实现

72.4. 软件仓库

Cassandra 可用于存储幂等和聚合 EIP 的消息密钥或消息。

Cassandra 可能不是排队用例的最佳工具,读取 Cassandra 反关联性队列和队列,如 datasets。建议使用这些表的 LeveledCompaction 和一个小的 GC 宽限期设置,以便快速删除多组行。

72.5. 幂等仓库

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

72.6. 聚合仓库

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 章 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>

73.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

73.2. URI 格式

如前所述,Camel 提供了一组加密端点来创建和验证签名

crypto:sign:name[?options]
crypto:verify:name[?options]
  • crypto:签名,创建签名并将其存储在恒定的 org.apache.camel.component.crypto.DigitalSignatureConstants.SIGNATURE 中的标头中。"CamelDigitalSignature".
  • crypto:验证 将在此标头的内容中读取并进行验证计算。

为了能正常工作,签名和验证进程需要共享的密钥对,签名需要 私钥 并验证 公钥 (或包含 证书 )。使用 JCE 生成这些密钥对非常简单,但通常最好使用 KeyStore 来安置和共享您的密钥。DSL 非常灵活,关于如何提供密钥并提供多个机制。

注意 加密:签名 端点通常在一个路由中定义,而免费 加密:在另一个路由中进行验证,尽管在它们后出现的一个示例中简单性。它不表示签名和验证应当相同。

73.3. 选项

Crypto (JCE)组件支持下面列出的 2 个选项。

名称描述默认类型

配置 (高级)

使用共享的 DigitalSignatureConfiguration 作为配置

 

DigitalSignature Configuration

resolveProperty Placeholders (advanced)

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

true

布尔值

Crypto (JCE)端点使用 URI 语法配置:

crypto:cryptoOperation:name

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

73.3.1. 路径名(2 参数):

名称描述默认类型

cryptoOperation

必需,从端点 uri 的加密方案后提供的 Crypto 操作设置为 Crypto 操作,即 crypto:sign 设置为操作。

 

CryptoOperation

name

必需 此操作的逻辑名称。

 

字符串

73.3.2. 查询参数(19 参数):

名称描述默认类型

algorithm (producer)

设置用于 signer 的 Algorithm 的 JCE 名称。

SHA1WithDSA

字符串

alias (producer)

设置用于查询 KeyStore 的密钥和链接 java.security.cert.Certificate Certificates 的别名,以用于签名和验证交换。这个值可以在运行时通过消息标头链接 org.apache.camel.component.crypto.DigitalSignatureConstantsKEYSTORE_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 的密码。

 

字符串

73.4. 使用

73.4.1. 原始密钥

签名和验证交换的最基本的方式是使用 KeyPair,如下所示:

可使用对键的 Spring XML 扩展 实现相同的操作

73.4.2. 密钥存储和别名.

JCE 为对私钥和证书进行非常通用的密钥存储概念,保持了加密和密码保护。可以通过在检索 API 中应用别名来检索它们。可以通过多种方式将密钥和证书放入密钥存储中,最常见的方法是通过外部"keytool"应用完成。这是 使用 keytool 使用自签名 Cert 和 Private key 创建 KeyStore 的好示例。

示例使用带有"bob"别名的密钥和证书的密钥存储。密钥存储的密码,键是"letmein"

下面介绍如何通过 Fluent builders 使用 Keystore,它还演示了如何加载和初始化密钥存储。

在 Spring 中,使用 ref 来查找实际的密钥存储实例。

73.4.3. 更改 JCE Provider 和 Algorithm

更改签名算法或安全提供程序是指定其名称的简单方法。您还需要使用与您选择的算法兼容的密钥。

或者

73.4.4. 更改签名消息头

可能需要更改用于存储签名的消息标头。可以在路由定义中指定不同的标头名称,如下所示

或者

73.4.5. 更改 buffersize

如果需要更新 buffer…​ 的大小

或者

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

73.5. 另请参阅

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

第 74 章 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 组件将注册该提供程序。

74.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

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

74.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 端点。

 

字符串

74.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/rfc5652section-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/rfc5652section-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

布尔值

74.2. 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>

74.3. 签名的数据

请注意,一个 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>

第 75 章 crypto (Java Cryptographic Extension) DataFormat

作为 Camel 版本 2.3 可用

Crypto Data Format 将 Java Cryptographic Extension 集成到 Camel 中,允许使用 Camel 熟悉的 marshall 和 unmarshal 格式机制进行简单、灵活的加密和解密消息。它假定 marshalling 为意味着对cyphertext 和 unmarshalling 的加密功能,意味着解密回原始明文。此数据格式仅实施对称(共享密钥)加密和取消处理。

75.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。

75.2. 基本用法

在其最基本的中,需要加密/解密交换是共享密钥。如果 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>

75.3. 指定加密算法

更改算法是提供 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 文档获得。

75.4. 指定初始化向量

某些加密算法(特别是块算法)需要配置一个初始数据块,称为初始化向量。在 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 的更多信息,请参考

75.5. 散列消息身份验证代码(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" />

75.6. 动态提供密钥

当使用 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" />

75.7. 依赖项

要使用 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>

75.8. 另请参阅

第 76 章 CSV DataFormat

作为 Camel 版本 1.3 提供

CSV 数据格式使用 Apache Commons CSV 处理 CSV 有效负载(Comma09arated Values),比如由 Excel 导出/导入的值。

76.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。

76.2. 将 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

76.3. 将 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)));
}

76.4. marshalling a List<Map> 到 CSV

可从 Camel 2.1 开始

如果您有多个要提取的数据的行以 CSV 格式,则您可以将消息有效负载存储为 List<Map<String, Object>> 对象,其中列表包含每行的一个映射。

76.5. 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>

76.6. 将管道聚合为分隔符

考虑以下正文

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>

76.7. 在解压缩时,使用 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");

76.8. 将管道作为分隔符解封

使用 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(';');

无法工作。您必须将分隔符设置为字符串!

76.9. 依赖项

要在 Camel 路由中使用 CSV,您需要添加对 camel-csv 的依赖项,该依赖项实施此数据格式。

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-csv</artifactId>
  <version>x.x.x</version>
</dependency>

第 77 章 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 标头中提供。

77.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,但不再被支持。

77.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

77.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

77.1.3. 使用 Elytron 配置安全性

{WildFly-camel} 支持使用 Elytron 安全框架提供安全 camel-cxf consumer 端点。

77.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 文档

77.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,{wildfly} 会在上下文路径 /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。

为了为此类 非上下文端点定义安全约束,{wildfly-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>

第 78 章 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>

78.1. URI 格式

cxfrs://address?options

其中 address 代表 CXF 端点的地址

cxfrs:bean:rsEndpoint

其中 rsEndpoint 代表 spring bean 的名称,它呈现 CXFRS 客户端或服务器

对于以上任意样式,您可以在 URI 中附加选项,如下所示:

cxfrs:bean:cxfEndpoint?resourceClasses=org.apache.camel.rs.Example

78.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

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

78.2.1. 路径名(2 参数):

名称描述默认类型

beanId

查找现有配置的 CxfRsEndpoint。必须使用 bean: 作为前缀。

 

字符串

address

服务发布地址。

 

字符串

78.2.2. 查询参数(29 参数):

名称描述默认类型

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

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

布尔值

您还可以通过 spring 配置配置 CXF REST 端点。由于 CXF REST 客户端和 CXF REST 服务器之间存在许多差异,因此我们为其提供了不同的配置。如需更多信息,请查看架构文件和 CXF JAX-RS 文档

78.3. 如何在 Camel 中配置 REST 端点

camel-cxf 架构文件 中,REST 端点定义有两个元素。cxf:rsServer for REST consumer, cxf:rsClient for REST producer.
您可以在此处找到 Camel REST 服务路由配置示例。

78.4. 如何覆盖邮件标头中的 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()));

78.5. 消耗 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 响应中。

78.5.1. 启用 Simple Binding Style

通过将消费者端点中的 bindingStyle 参数设置为 SimpleConsumer 来激活此绑定风格:

  from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
    .to("log:TEST?showAll=true");

78.5.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。

78.5.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>

有关如何处理请求和写入响应的更多示例,可在此处找到

78.6. 消耗 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 响应。

78.7. 如何通过 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 指定的类型类。

从 Camel 2.1 开始,我们还支持指定 CXFRS http 以客户端为 cxfrs URI 的查询参数。

格式化宏错误: snippet: java.lang.IndexOutOfBoundsException: Index: 20, Size: 20

要支持动态路由,您可以使用 CxfConstants.CAMEL_CXF_RS_QUERY_MAP 标头覆盖 URI 的查询参数。

78.8. 什么是 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 服务一同支持。

78.9. 将 Camel 集成到 CXF 传输层

将 Camel 场合成您的 CXF 总线,您需要使用 CamelTransportFactory。您可以在 Java 中和 Spring 中执行此操作。

78.9.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>

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

78.10. 使用 Spring 配置目的地和 conduit

78.10.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
                          ...>

78.10.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

78.10.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

78.11. 使用 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" />

78.12. 使用 Camel 作为 CXF 的负载均衡器示例

本例演示了如何在 CXF 中使用 camel 负载均衡功能。您需要在 CXF 中载入配置文件,并在地址 "camel://direct:EndpointA" 和 "camel://direct:EndpointB" 上发布端点。

78.13. 将 Camel 附加到 CXF 的完整方法和示例

使用 Apache Camel 更好的 JMS Transport for CXF Webservice 

第 79 章 Data Format 组件

作为 Camel 2.12 版本提供

dataformat: 组件允许使用 Data Format 作为 Camel 组件。

79.1. URI 格式

dataformat:name:(marshal|unmarshal)[?options]

其中 name 是 Data Format 的名称。然后遵循这个操作必须是 marshal 或 unmarshal 。这些选项用于配置 使用中的数据格式。有关它支持的选项,请参阅数据格式文档。

79.2. DataFormat Options

Data Format 组件没有选项。

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

dataformat:name:operation

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

79.2.1. 路径名(2 参数):

名称描述默认类型

name

数据格式 所需的 名称

 

字符串

operation

所需的 Operation 使用 marshal 或 unmarshal

 

字符串

79.2.2. 查询参数(1 参数):

名称描述默认类型

同步 (高级)

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

false

布尔值

79.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>

第 80 章 dataset 组件

作为 Camel 版本 1.3 提供

测试分布式和异步处理非常困难。MockTestingDataSet 端点与 Camel 测试框架配合良好,使用 企业集成模式 和 Camel 的大型组件与强大的 Bean 集成来简化您的单元和集成测试。

DataSet 组件提供了一种机制来轻松执行系统负载和进行测试。它通过允许您创建 DataSet 实例 作为消息来源,并以此作为断言收到数据集的方法。

在发送 dataset 时,Camel 将使用 吞吐量日志记录器

80.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

80.2. 选项

Dataset 组件没有选项。

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

dataset:name

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

80.2.1. 路径名(1 参数):

名称描述默认类型

name

在 registry 中查询 所需的 DataSet Name

 

DataSet

80.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,并使用通知程序知道 Camel 正在路由某些消息,然后再在模拟上调用链路 assertIsSatisfied ()方法。这可让您使用固定的断言周期来加快测试时间。如果您要断言,使第 n 条消息到达这个模拟端点,请参阅链接 setAssertPeriod (长)方法以了解更多详情。

-1

int

reportGroup (producer)

用于根据大小组打开吞吐量日志的数字。

 

int

resultMinimumWaitTime (producer)

设置链接 assertIsSatised ()将等待 latch 时的最短时间(在证书中)

0

long

resultWaitTime (producer)

设置链接 assertIsSatised ()将等待 latch 中的最长时间(以 millisisis)等待,直到满足前

0

long

retainFirst (producer)

指定仅保留第 n 个接收交换的数量。这在测试大数据时,通过不存储每个 Exchange this模拟端点的副本来减少内存消耗。重要信息:在使用这个限制时,链接 getReceivedCounter ()仍然会返回实际接收交换次数。例如,如果我们收到 5000 Exchanges,并且已配置为仅保留前 10 个交换,则 getReceivedCounter ()仍会返回 5000,但只有链接 getExchanges ()和链接 getReceivedExchanges ()方法。使用此方法时,某些其它预期方法不被支持,例如,link expectedBodiesReceived (Object…​)会设置在收到的第一个数量正文时的预期。您可以配置链路 setRetainFirst (int)和链路 setRetainLast (int)方法,以限制第一个和最后一个接收。

-1

int

retainLast (producer)

指定仅保留最近 n 个接收的 Exchange 数。这在测试大数据时,通过不存储每个 Exchange this模拟端点的副本来减少内存消耗。重要信息:在使用这个限制时,链接 getReceivedCounter ()仍然会返回实际接收交换次数。例如,如果我们收到 5000 Exchange,并且已配置为仅保留最后 20 个交换,则 getReceivedCounter ()仍会返回 5000,但连接 getExchanges ()和链路 getReceivedExchanges ()方法。使用此方法时,某些其它预期方法不被支持,例如,link 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&…​

80.3. Configuring DataSet

Camel 将在实施 DataSet 接口 bean 的 Registry 中查找。因此,您可以将自己的 DataSet 注册为:

<bean id="myDataSet" class="com.mycompany.MyDataSet">
  <property name="size" value="100"/>
</bean>

80.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,如配置数据集合方式以及消息等。   

80.5. DataSetSupport (abstract 类)

DataSetSupport 抽象类是新 DataSets 的 nice 起点,它为派生类提供一些有用的功能。

80.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 值。

80.6. SimpleDataSet

SimpleDataSet 扩展 DataSetSupport,并添加默认的正文。

80.6.1. SimpleDataSet 中的其他属性

属性类型默认值描述

defaultBody

对象

<hello>world!</hello>

指定默认的消息正文。默认情况下,SimpleDataSet 会为每个交换生成相同的恒定有效负载。如果要自定义每个交换的有效负载,请创建一个 Camel 处理器并通过设置 outputTransformer 属性来配置 SimpleDataSet 来使用它。

80.7. ListDataSet

自 Camel 2.17 开始可用

List'DataSet' 扩展 DataSetSupport 并添加默认正文列表。

80.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()

80.8. FileDataSet

自 Camel 2.17 开始可用

FileDataSet 扩展 ListDataSet,并添加从文件中加载正文的支持。

80.8.1. FileDataSet 上的其他属性

属性类型默认值描述

sourceFile

File

null

指定有效负载的源文件

delimiter

字符串

\z

指定 java.util.Scanner 用来将文件拆分为多个有效负载的分隔符模式。

第 81 章 DigitalOcean Component

作为 Camel 版本 2.19 可用

借助 DigitalOcean 组件,您可以通过封装 [digitalocean-java](https://www.digitalocean.com/community/projects/api-client-in-java)来管理 DigitalOcean 云中 Droplet 和资源。通过此 Camel 组件也提供您在 DigitalOcean 控制面板中熟悉的所有功能。

81.1. 前提条件

您必须具有有效的 DigitalOcean 帐户和有效的 OAuth 令牌。您可以通过访问您帐户的 DigitalOcean 控制面板的 [Apps & API (https://cloud.digitalocean.com/settings/applications)部分来生成 OAuth 令牌。

81.2. URI 格式

DigitalOcean 组件 使用以下 URI 格式:

digitalocean://endpoint?[options]

其中 端点 是 DigitalOcean 资源类型。

示例:列出您的 droplets:

digitalocean://droplets?operation=list&oAuthToken=XXXXXX&page=1&perPage=10

DigitalOcean 组件仅支持制作者端点,因此您无法在路由开始时使用此组件来侦听频道中的消息。

81.3. 选项

DigitalOcean 组件没有选项。

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

digitalocean:operation

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

81.3.1. 路径名(1 参数):

名称描述默认类型

operation

执行的操作。

 

DigitalOceanOperations

81.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 令牌

 

字符串

您必须为每个端点提供 操作值,使用 操作 URI 选项或 CamelDigitalOceanOperation 消息标头。

所有 操作值 都在 DigitalOceanOperations enumeration 中定义。

组件使用的所有 标头 名称在 DigitalOceanHeaders enumeration 中定义。

81.4. 消息正文结果

所有返回的消息正文都使用 数字ocean-api-java 库提供的对象。

81.5. API 速率限制

通过 camel-digitalocean 组件封装的 DigitalOcean REST API 被限制为 API Rate Limiting。您可以在 [API Rate Limits 文档](https://developers.digitalocean.com/documentation/v2/#rate-limit)中找到每种方法限值。

81.6. 帐户端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | get | get account info | | com.myjeeva.digitalocean.pojo.Account |

81.7. 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> |

81.8. 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> |

81.9. 镜像端点

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

81.10. 快照端点

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

81.11. 密钥端点

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

81.12. 区域端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list all areas | | List<com.myjeeva.digitalocean.pojo.Region > |

81.13. 大小端点

| operation | Description | Headers | Result | | ------ | ---- | ------- | ----------- | | list | list all size | | List<com.myjeeva.digitalocean.pojo.Size > |

81.14. 浮动 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> |

81.15. 标签端点

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

81.16. 例子

获取您的帐户信息

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

第 82 章 Direct Component

作为 Camel 版本 1.0 可用

直接: 组件在制作者发送消息交换时,为任何消费者提供直接同步调用。
此端点可用于连接 同一 camel 上下文中的现有路由。

提示

异步的 SEDA 组件可在生产者发送消息交换时提供异步调用任何消费者。

提示

连接到其他 camel 上下文虚拟机 组件提供 Camel 上下文之间的连接,只要它们在同一个 JVM 中运行。

82.1. URI 格式

direct:someName[?options]

其中 someName 可以是任何可唯一标识端点的字符串

82.2. 选项

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

名称描述默认类型

block (producer)

如果向没有活动使用者的直接端点发送消息,则制作者可以告知制作者块并等待使用者处于活动状态。

true

布尔值

timeout (producer)

如果启用了块,要使用的超时值。

30000

long

resolveProperty Placeholders (advanced)

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

true

布尔值

Direct 端点使用 URI 语法配置:

direct:name

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

82.2.1. 路径名(1 参数):

名称描述默认类型

name

直接端点 所需的 名称

 

字符串

82.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

布尔值

82.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 组件中的样本,它们如何一起使用。

82.4. 另请参阅

第 83 章 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

83.1. URI 格式

direct-vm:someName

其中 someName 可以是任何可唯一标识端点的字符串

83.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

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

83.2.1. 路径名(1 参数):

名称描述默认类型

name

direct-vm 端点 所需的 名称

 

字符串

83.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

布尔值

83.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>

83.4. 另请参阅

第 84 章 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>

84.1. URI 格式

 disruptor:someName[?options]

或者

 disruptor-vm:someName[?options]

其中 someName 可以是当前 CamelContext 中唯一标识端点的任何字符串(如果是
中断或-vm:),则可在上下文中标识。
您可以按照以下格式将查询选项附加到 URI:

  ?option=value&option=value&…

84.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

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

84.2.1. 路径名(1 参数):

名称描述默认类型

name

队列 所需的 名称

 

字符串

84.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

布尔值

84.3. 等待策略

等待被等待下一个交换的消费者线程执行的等待类型生效。可以选择以下策略:

名称描述建议

Blocking

阻塞策略使用锁定和状况变量等待在 barrier 上等待的消费者。

当吞吐量和低延迟不与 CPU 资源一样重要时,可以使用此策略。

sleeping

最初旋转的策略,然后使用 Thread.yield (),最终 OS 和 JVM 将允许最少的 nanos,而消费者正在等待 barrier。

此策略在性能和 CPU 资源之间是一个很好的折衷。延迟激增可能会在静默期后发生。

BusySpin

忙碌 Spin 策略使用忙碌的旋转循环来等待一个 barrier 的消费者。

此策略将使用 CPU 资源来避免出现延迟危机的 syscalls。当线程可以绑定到特定 CPU 内核时,最好使用它。

产生

生成使用 Thread.yield ()在初始启动后等待 barrier 消费的策略。

此策略在性能和 CPU 资源之间是一个很好的折衷,而不会产生大量延迟高峰。

84.4. 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 缓冲区上的使用者完成时,它会将响应复制到原始消息响应。

84.5. 并发消费者

默认情况下,Disruptor 端点使用单个使用者线程,但您可以将其配置为使用并发使用者线程。因此,您可以使用的线程池而不是线程池:

from("disruptor:stageName?concurrentConsumers=5").process(...)

至于两者之间的差别,请注意,线程池可以在运行时动态增加/缩小,而并发使用者的数量始终被内部修复和支持,因此性能会更高。

84.6. 线程池

请注意,通过类似以下内容将线程池添加到 Disruptor 端点:

from("disruptor:stageName").thread(5).process(...)

可以通过添加要与 Disruptor 结合使用的普通块 Queue,以有效地利用 Disruptor 来取代性能提升的一部分。相反,建议您使用并发Consumers 选项直接配置 Disruptor 端点上处理消息的线程数。

84.7. 示例

在下面的路径中,我们使用 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 中消耗来进一步处理。由于这是一个单元测试,因此它将发送到模拟端点,在单元测试中我们可以进行断言。

84.8. 使用多个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);
    }

}

84.9. 提取中断或信息

如果需要,可以在不使用 JMX 的情况下获取缓冲区大小等信息:

DisruptorEndpoint disruptor = context.getEndpoint("disruptor:xxxx");
int size = disruptor.getBufferSize();

第 85 章 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>

85.1. URI 格式

DNS 组件的 URI 方案如下

dns://operation[?options]

此组件仅支持制作者。

85.2. 选项

DNS 组件没有选项。

DNS 端点使用 URI 语法配置:

dns:dnsType

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

85.2.1. 路径名(1 参数):

名称描述默认类型

dnsType

所需的 查找类型。

 

DnsType

85.2.2. 查询参数(1 参数):

名称描述默认类型

同步 (高级)

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

false

布尔值

85.3. 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

特别用于查询的服务器。如果未指定,则使用操作系统指定的默认值。可选。

85.4. 例子

85.4.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 "。

85.4.2. DNS 查找

        <route id="IPCheck">
            <from uri="direct:start"/>
            <to uri="dns:lookup"/>
        </route>

这会返回与某个域关联的一组 DNS 记录。
要查找的名称必须在标头中通过键 "dns.name" 提供。

85.4.3. DNS Dig

dig 是用于运行 DNS 查询的 Unix 命令行工具。

        <route id="IPCheck">
            <from uri="direct:start"/>
            <to uri="dns:dig"/>
        </route>

该查询必须在标头中通过键 "dns.query" 提供。

85.5. 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" />
	</bean>

	<route id="routeId" autoStartup="false" routePolicyRef="dnsActivationPolicy">
	</route>

第 86 章 Docker 组件

作为 Camel 版本 2.15 可用

与 Docker 通信的 Camel 组件。

Docker Camel 组件通过 Docker 远程 API 利用 docker-java 。

86.1. URI 格式

docker://[operation]?[options]

其中 操作 是要在 Docker 上执行的特定操作。

86.2. 常规选项

Docker 组件支持下面列出了的 2 个选项。

名称描述默认类型

配置 (高级)

使用共享的 docker 配置

 

DockerConfiguration

resolveProperty Placeholders (advanced)

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

true

布尔值

Docker 端点使用 URI 语法配置:

docker:operation

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

86.2.1. 路径名(1 参数):

名称描述默认类型

operation

使用所需的 Which 操作

 

DockerOperation

86.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)

要进行身份验证的用户名

 

字符串

86.3. 标头策略

所有 URI 选项都可以作为标头属性传递。邮件标题中找到的值优先于 URI 参数。标头属性采用带有 CamelDocker 前缀的 URI 选项形式,如下所示

URI 选项标头属性

containerId

CamelDockerContainerId

86.4. 例子

以下示例使用来自 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");

86.5. 依赖项

要在 Camel 路由中使用 Docker,您需要添加对 camel-docker 的依赖项,该依赖项实施该组件。

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-docker</artifactId>
  <version>x.x.x</version>
</dependency>

第 87 章 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>

87.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");

87.2. 选项

Dozer 组件没有选项。

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

dozer:name

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

87.2.1. 路径名(1 参数):

名称描述默认类型

name

映射 的人类可读名称。

 

字符串

87.2.2. 查询参数(7 参数):

名称描述默认类型

mappingConfiguration (producer)

用于在 Camel 注册表中的 DozerBeanMapperConfiguration bean 的名称,用于配置 Dozer 映射。这是 mappingFile 选项的替代选择,可用于对配置 Dozer 如何进行精细的控制。请记住,使用值中的前缀来指示 bean 位于 Camel 注册表中(如 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

布尔值

87.3. 使用带有 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"/>

87.4. 配置 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>

87.5. 映射扩展

Dozer 组件将大量扩展实施到 Dozer 映射框架,作为自定义转换器。 这些转换器实现 Dozer 本身不支持的映射功能。

87.5.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>

87.5.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>

87.5.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 定义的变量值时出现错误。

第 88 章 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>

88.1. URI 格式

drill://host[?options]

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

88.2. drill Producer

制作者使用 CamelDrillQuery 标头执行查询,并将结果放入正文。

88.3. 选项

Drill 组件没有选项。

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

drill:host

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

88.3.1. 路径名(1 参数):

名称描述默认类型

主机

所需的 ZooKeeper 主机名或 IP 地址。使用 local 而不是主机名或 IP 地址连接到本地 Drillbit

 

字符串

88.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

布尔值

88.4. 另请参阅

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

第 89 章 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>

89.1. URI 格式

dropbox://[operation]?[options]

其中,操作 是要对 Dropbox 远程文件夹执行的特定操作(通常是 CRUD 操作)。

89.2. 操作

操作描述

del

删除 Dropbox 上的文件或目录

get

从 Dropbox 下载文件

Move

从 Dropbox 上的文件夹移动文件

put

在 Dropbox 上上传文件

search

根据字符串查询在 Dropbox 上搜索文件

操作 需要额外的选项才能工作,特别是操作需要满足一些。

89.3. 选项

要使用 Dropbox API,您需要获取 accessTokenclientIdentifier。
您可以参考 Dropbox 文档来说明如何获取它们。  

Dropbox 组件没有选项。

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

dropbox:operation

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

89.3.1. 路径名(1 参数):

名称描述默认类型

operation

必需的 特定操作(通常是 CRUD 操作)用于在 Dropbox 远程文件夹上执行。

 

DropboxOperation

89.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

布尔值

89.4. Del 操作

删除 Dropbox 上的文件。

只适用于 Camel 制作者。

下面列出了这个操作的选项:

属性Mandatory(必需)描述

remotePath

true

Dropbox 要删除的文件夹或文件

89.4.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");

89.4.2. 结果消息标头

在消息结果中设置了以下标头:

属性

DELETED_PATH

dropbox 上删除的路径名称

89.4.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

字符串

dropbox 上删除的路径名称

89.5. 获取(下载)操作

从 Dropbox 下载文件。

充当 Camel 制作者或 Camel 使用者。

下面列出了这个操作的选项:

属性Mandatory(必需)描述

remotePath

true

从 Dropbox 下载的文件夹或文件

89.5.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/");

89.5.2. 结果消息标头

在消息结果中设置了以下标头:

属性

DOWNLOADED_FILE

如果单个文件下载,则下载的远程文件的路径

DOWNLOADED_FILES

如果下载多个文件,则下载的远程文件的路径

89.5.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

ByteArrayOutputStream

如果单个文件下载,请代表下载的文件的流

Map<String, ByteArrayOutputStream>

如果多个文件下载,使用 作为下载远程文件路径的密钥映射,作为代表下载文件的流值

89.6. 移动操作

将 Dropbox 上的文件移动到另一个文件夹。

只适用于 Camel 制作者。

下面列出了这个操作的选项:

属性Mandatory(必需)描述

remotePath

true

要移动的原始文件或文件夹

newRemotePath

true

目标文件或文件夹

89.6.1. Samples

from("direct:start")
  .to("dropbox://move?accessToken=XXX&clientIdentifier=XXX&remotePath=/root/folder1&newRemotePath=/root/folder2")
  .to("mock:result");

89.6.2. 结果消息标头

在消息结果中设置了以下标头:

属性

MOVED_PATH

dropbox 上移动的路径名称

89.6.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

字符串

dropbox 上移动的路径名称

89.7. 放置(上传)操作

在 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"

89.7.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)用作文件名。

89.7.2. 结果消息标头

在消息结果中设置了以下标头:

属性

UPLOADED_FILE

如果是单一文件上传,则上传的远程路径的路径

UPLOADED_FILES

对于多个文件上传,使用上传的远程路径的字符串

89.7.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

字符串

如果是单一文件上传,则会导致上传操作、OK 或 KO

map<String, DropboxResultCode>

对于多个文件上传,使用 作为上传的远程文件路径的密钥,以及值上传操作、确定或 KO 的结果。

89.8. 搜索操作

在远程 Dropbox 文件夹中搜索,包括其子目录。

作为 Camel 制作者和 Camel 消费者工作。

下面列出了这个操作的选项:

属性Mandatory(必需)描述

remotePath

true

Dropbox 上的 文件夹,在其中搜索。

query

true

用于搜索的空格分隔的子字符串列表。仅当文件包含所有子字符串时,文件才匹配。如果没有设置这个选项,则会匹配所有文件。该查询需要在端点配置中提供,或者作为 Camel 消息上的标头 CamelDropboxQuery 提供。

89.8.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");

89.8.2. 结果消息标头

在消息结果中设置了以下标头:

属性

FOUNDED_FILES

构建的文件路径列表

89.8.3. 结果消息正文

在消息正文结果中设置了以下对象:

对象类型描述

List<DbxEntry>

成立文件路径列表。有关此对象的更多信息,请参阅 Dropbox 文档,

 

第 90 章 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>

90.1. URI 格式

ehcache://cacheName[?options]

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

90.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

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

90.2.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

90.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

字符串

90.2.3. 消息标头 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

接收的事件类型

90.3. 基于 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");

 

90.4. 基于 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;
    }
}

第 91 章 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>

91.1. URI 格式

ejb:ejbName[?options]

其中 ejbName 可以是用于在 Application Server JNDI Registry 中查找 EJB 的任何字符串

91.2. 选项

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

名称描述默认类型

context (producer)

用于查找 EJB 的上下文

 

Context

properties (producer)

如果尚未配置上下文,用于创建 javax.naming.Context 的属性。

 

Properties

resolveProperty Placeholders (advanced)

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

true

布尔值

EJB 端点使用 URI 语法配置:

ejb:beanName

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

91.2.1. 路径名(1 参数):

名称描述默认类型

beanName

必需 设置要调用的 bean 的名称

 

字符串

91.2.2. 查询参数(5 参数):

名称描述默认类型

方法 (生成器)

设置在 bean 上调用的方法的名称

 

字符串

cache (advanced)

如果启用,Camel 将缓存第一个 Registry 查找的结果。如果 registry 中的 bean 定义为单例范围,则可以启用缓存。

false

布尔值

multiParameterArray (advanced)

弃用了 如何处理从消息正文传递的参数。true 表示消息正文应该是参数的数组。弃用备注:此选项由 Camel 内部使用,且不适用于最终用户。弃用备注:此选项由 Camel 内部使用,且不适用于最终用户。

false

布尔值

参数 (高级)

用于配置 bean 中的其他属性

 

map

同步 (高级)

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

false

布尔值

91.3. bean Binding

如何选择需要调用的方法(如果没有通过 方法 参数明确指定),并从消息构建参数值如何由 Bean Binding 机制定义,该机制在整个 Camel 中各种 Bean 集成机制都使用它。

91.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;
    }

}

91.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 或类似方式访问应用服务器,则必须事先准备这些属性。

91.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>

91.5. 另请参阅

  • 配置 Camel
  • 组件
  • 端点
  • 开始使用
  • bean
  • bean Binding
  • Bean 集成

第 92 章 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>

92.1. URI 格式

elasticsearch://clusterName[?options]

92.2. 端点选项

Elasticsearch 组件支持下面列出的 2 个选项。

名称描述默认类型

client (advanced)

要使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。

 

客户端

resolveProperty Placeholders (advanced)

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

true

布尔值

Elasticsearch 端点使用 URI 语法配置:

elasticsearch:clusterName

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

92.2.1. 路径名(1 参数):

名称描述默认类型

clusterName

集群所需的 名称,或使用 local 作为本地模式

 

字符串

92.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

布尔值

92.3. 本地测试

如果要针对本地( JVM/classloader) ElasticSearch 服务器运行,只需要将 URI 中的 clusterName 值设置为"local"。详情请查看 客户端指南

92.4. 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。

92.5. 索引示例

以下是一个简单的 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);

92.6. 如需更多信息,请参阅这些资源

ElasticSearch Main Site

ElasticSearch Java API

92.7. 另请参阅

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

第 93 章 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>

93.1. URI 格式

elasticsearch5://clusterName[?options]

93.2. 端点选项

Elasticsearch5 组件支持下面列出的 2 个选项。

名称描述默认类型

client (advanced)

要使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。这允许使用特定设置自定义客户端。

 

TransportClient

resolveProperty Placeholders (advanced)

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

true

布尔值

Elasticsearch5 端点使用 URI 语法配置:

elasticsearch5:clusterName

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

93.2.1. 路径名(1 参数):

名称描述默认类型

clusterName

集群的 必填 名称

 

字符串

93.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

 

字符串

93.3. 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。

93.4. 索引示例

以下是一个简单的 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);

93.5. 如需更多信息,请参阅这些资源

Elastic Main Site

ElasticSearch Java API

93.6. 另请参阅

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

第 94 章 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>

94.1. URI 格式

elasticsearch-rest://clusterName[?options]

94.2. 端点选项

Elastichsearch Rest 组件支持 12 个选项,它们如下。

名称描述默认类型

client (advanced)

要使用现有配置的 Elasticsearch 客户端,而不是为每个端点创建客户端。这允许使用特定设置自定义客户端。

 

RestClient

主机地址( 高级)

使用 ip:port 格式的远程传输地址的逗号分隔列表。对于要考虑的主机地址,IP 和端口选项必须留空。

 

字符串

socketTimeout (advanced)

在套接字超时前等待的 ms 中的超时时间。

30000

int

connectionTimeout (advanced)

连接超时前要等待的 ms 的时间。

30000

int

user (advance)

基本验证用户

 

字符串

password (producer)

进行身份验证的密码

 

字符串

enableSSL (advanced)

启用 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

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

94.2.1. 路径名(1 参数):

名称描述默认类型

clusterName

集群的 必填 名称

 

字符串

94.2.2. 查询参数(11 参数):

名称描述默认类型

connectionTimeout (producer)

连接超时前要等待的 ms 的时间。

30000

int

disconnect (producer)

在完成调用制作者后断开连接

false

布尔值

enableSSL (producer)

启用 SSL

false

布尔值

hostAddresses (producer)

必需的 Comma 分离列表,使用 ip:port 格式的远程传输地址。对于要考虑的主机地址,IP 和端口选项必须留空。

 

字符串

indexName (producer)

要针对的索引名称

 

字符串

indexType (producer)

要针对的索引类型

 

字符串

maxRetryTimeout (producer)

重试前 ms 的时间

30000

int

operation (producer)

要执行的操作

 

ElasticsearchOperation

socketTimeout (producer)

在套接字超时前等待的 ms 中的超时时间。

30000

int

waitForActiveShards (producer)

索引创建会等待对分片的写入一致性数量可用

1

int

同步 (高级)

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

false

布尔值

94.3. 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

使用查询字符串映射搜索内容

Exists

索引名称(indexName)作为标头

检查索引是否存在或者不存在正文中的布尔值标志

Update(更新)

映射UpdateRequestStringbyte[]XContentBuilder 内容以更新

将内容更新至索引,并返回正文中的 indexId。

ping

对远程 Elasticsearch 集群进行 Ping 操作,如果 ping 成功,则为 false,则返回 true。

94.4. 配置组件并启用基本身份验证

要使用 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);

94.5. 索引示例

以下是一个简单的 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>

客户端只需要将含有 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. 搜索示例

根据特定字段和值搜索,使用 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="eelasticsearch-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 章 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,则来自消息正文。

如果无法解析命名参数,则会抛出异常。

95.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

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

95.1.1. 路径名(2 参数):

名称描述默认类型

elsqlName

要使用的 elsql 名称( elsql 文件中是 NAMED)

 

字符串

resourceUri

包含要使用的 elsql SQL 语句的资源文件。您可以用逗号分隔多个资源。默认情况下,这些资源会在类路径上加载,前缀为 file: 从文件系统加载。请注意,您可以在组件上设置这个选项,因此您不必在端点上配置此选项。

 

字符串

95.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 类型),将插入占位符。请注意,如果使用命名参数,则会使用 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 (producer)

如果启用,则来自 org.apache.camel.component.sql.SqlPrepareStatementStrategy 的 populateStatement 方法始终被调用,如果没有预期的参数,则也会调用。当为 false 时,只有在设置了 1 个或更多预期参数时,才会调用 populateStatement;例如,为了避免读取没有参数的 SQL 查询的消息正文/headers。

false

布尔值

parametersCount (producer)

如果设置大于零,则 Camel 将使用此计数值参数来替换,而不是通过 JDBC 元数据 API 进行查询。这在 JDBC 供应商无法返回正确的参数计数时很有用,然后用户可能会覆盖。

 

int

elSqlConfig (advanced)

使用特定配置的 ElSqlConfig。相反,最好使用 databaseVendor 选项。

 

ElSqlConfig

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

布尔值

95.2. 查询结果

对于 选择 操作,结果是 List<Map<String、Object>& gt; 类型,如 JdbcTemplate.queryForList ()方法返回。对于 更新 操作,结果是更新的行数,返回的是 Integer 返回的。

默认情况下,结果放置在消息正文中。  如果设置了 outputHeader 参数,则结果将放在标头中。  这是一种使用完整消息丰富的模式来添加标头,它提供了一种简洁的语法,用于将序列或某些其他小值查询到标头中。  最好将 outputHeader 和 outputType 一起一起使用:

95.3. 标头值

执行更新 操作时,SQL 组件会在以下消息标头中存储更新计数:

标头描述

CamelSqlUpdateCount

更新操作的行数量,返回为 Integer 对象。

CamelSqlRowCount

选择 操作返回的行数,返回为 Integer 对象。

95.3.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")

在 Camel 2.16.1 起,您也可使用简单表达式,这允许在消息正文中使用类似符号的 OGNL,其中假定 获得License 和 getMinimum 方法:

@NAME(projects)
  SELECT *
  FROM projects
  WHERE license = :${body.license} AND id > :${body.minimum}
  ORDER BY id

95.4. 另请参阅

第 96 章 etcd 组件

作为 Camel 2.18 版提供

camel etcd 组件允许您使用 Etcd (一个分布式可靠的键值存储)。

96.1. URI 格式

etcd:namespace/path[?options]

96.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

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

96.2.1. 路径名(2 参数):

名称描述默认类型

namespace

要使用的 API 命名空间

 

EtcdNamespace

path

端点指向的路径

 

字符串

96.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 章 OSGi EventAdmin Component

可作为 Camel 版本 2.6 提供。

eventadmin 组件可用于 OSGi 环境,以接收 OSGi EventAdmin 事件并进行处理。

97.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 或更高版本)。

97.2. URI 格式

eventadmin:topic[?options]

其中 topic 是要监听的主题的名称。

97.3. URI 选项

OSGi EventAdmin 组件支持下面列出的 2 个选项。

名称描述默认类型

bundleContext (common)

Camel 自动注入 OSGi BundleContext

 

BundleContext

resolveProperty Placeholders (advanced)

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

true

布尔值

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

eventadmin:topic

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

97.3.1. 路径名(1 参数):

名称描述默认类型

topic

要侦听或发送到的主题名称

 

字符串

97.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

布尔值

97.4. 邮件标题

名称类型消息

描述

  

97.5. 邮件正文

邮件正文 中的 设置为接收的事件。

97.6. 用法示例

<route>
    <from uri="eventadmin:*"/>
    <to uri="stream:out"/>
</route>

第 98 章 exec 组件

作为 Camel 版本 2.3 可用

exec 组件可用于执行系统命令。

98.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 或更高版本)。

98.2. URI 格式

exec://executable[?options]

其中 executable 是要执行的系统命令的名称或文件路径。如果使用可执行名称(例如 exec:java),则可执行文件必须在系统路径中。

98.3. URI 选项

Exec 组件没有选项。

Exec 端点使用 URI 语法配置:

exec:executable

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

98.3.1. 路径名(1 参数):

名称描述默认类型

executable

必需 设置要执行的可执行文件。可执行文件不能为空或 null。

 

字符串

98.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

布尔值

98.4. 邮件标题

支持的标头在 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)。

98.5. 邮件正文

如果 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 转换为目标类型。详情请参考 以下示例

98.6. 用法示例

98.6.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
     }
});

98.6.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")

98.6.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
     }
  });

98.6.4. 执行 echo (Windows)

echodir 等命令只能使用操作系统的命令解释器执行。本例演示了如何在 Windows 中执行此类命令 - echo -。

from("direct:exec").to("exec:cmd?args=/C echo echoString")

98.7. 另请参阅

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

第 99 章 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>

99.1. URI 格式

  facebook://[endpoint]?[options]

99.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

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

99.2.1. 路径名(1 参数):

名称描述默认类型

methodName

执行 所需的操作

 

字符串

99.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)

可选的读取参数。请参阅阅读选项(读取)

 

读取

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

 

字符串

99.3. 制作者端点:

制作者端点可以使用下表中的端点名称和选项。端点也可以使用没有 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 导致。

99.4. 消费者端点:

使用 read#reading 参数的任何制作者端点都可用作消费者端点。轮询使用者使用 sinceuntil 字段在轮询间隔内获取响应。除了其他阅读字段外,可以在端点中提供初始( 因为 值)用于第一个轮询。

camel-facebook 并非通过单一路由交换返回 List (或 facebook4j.ResponseList)的端点,而是每个返回的对象创建一个路由交换。例如,如果 "facebook://home" 结果为五个后,该路由将执行五次(每个 Post )。

99.5. 读取选项

类型为 facebook4j.Reading 的 read 选项添加了对读取参数的支持,这允许选择特定字段,限制结果数量等。如需更多信息,请参阅 Graph API#reading - Facebook Developers

使用者端点也用于轮询 Facebook 数据,以避免在轮询之间发送重复消息。

read 选项可以是 facebook4j.Reading 的参考或值,也可以使用端点 URI 或与 CamelFacebook. 前缀交换标头来指定的以下读取选项。

99.6. 邮件标题

任何 URI 选项#urioptions 可以在带有 CamelFacebook. 前缀的 producer 端点的消息标头中提供。

99.7. 邮件正文

所有结果消息正文都使用 Facebook4J API 提供的对象。producer 端点可以在 inBody endpoint 参数中为传入消息正文指定选项名称。

对于返回数组或 facebook4j.ResponseListjava.util.List 的端点,消费者端点会将列表中的每个元素映射到不同的消息。

99.8. 使用案例

要在 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");

第 100 章 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>

100.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

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

100.1.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

FhirApiName

methodName

所选操作需要什么子操作

 

字符串

100.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)

用于基本身份验证的用户名

 

字符串

100.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

布尔值

第 101 章 FHIR JSon DataFormat

作为 Camel 版本 2.21可作为 Camel 版本 2.21 使用,可作为 Camel 2.21 版本使用

FHIR-JSON 数据格式利用 HAPI-FHIR 的 JSON 解析器解析到/从 JSON 格式解析到/来自 HAPI-FHIR 的 IBaseResource

101.1. FHIR JSON 格式选项

FHIR JSon 数据格式支持 2 个选项,它们列如下。

名称默认Java 类型描述

fhirVersion

DSTU3

字符串

要使用的 FHIR 版本。可能的值有:DSTU2,DSTU2_HL7ORG,DSTU2_1,DSTU3,R4

contentTypeHeader

false

布尔值

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

第 102 章 FHIR XML DataFormat

从 Camel 版本 2.21 开始,可用为 Camel 版本 2.21

FHIR-XML 数据格式利用 HAPI-FHIR 的 XML 解析器解析到/从 XML 格式解析到/从 HAPI-FHIR 的 IBaseResource

102.1. FHIR XML 格式选项

FHIR XML 数据格式支持如下所列的 2 个选项。

名称默认Java 类型描述

fhirVersion

DSTU3

字符串

要使用的 FHIR 版本。可能的值有:DSTU2,DSTU2_HL7ORG,DSTU2_1,DSTU3,R4

contentTypeHeader

false

布尔值

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

第 103 章 文件组件

作为 Camel 版本 1.0 可用

File 组件提供对文件系统的访问,允许由任何其他 Camel 组件或其他组件的消息处理,以保存到磁盘。

103.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 选项,您可以使用它们。另请参阅有关从 其他人直接丢弃文件的文件夹中 使用文件的部分。

103.2. URI 选项

File 组件没有选项。

File 端点使用 URI 语法配置:

file:directoryName

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

103.2.1. 路径名(1 参数):

名称描述默认类型

directoryName

所需的 起始目录

 

File

103.2.2. 查询参数(81 参数):

名称描述默认类型

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 存储库用于考虑当前正在使用的进程文件中。默认情况下会使用基于内存的存储库。

 

String>

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)

是否启用内容类型的探测。如果启用,则使用者使用 link FilesprobeContentType (java.nio.file.Path)来确定文件的 content-type,并将它存储为带有键链路 ExchangeFILE_CONTENT_TYPE 的标头。

false

布尔值

processStrategy (consumer)

可插拔 org.apache.camel.component.file.GenericFileProcessStrategy 允许您实施自己的 readLock 选项或类似内容。在文件被消耗(如有特殊就绪文件)之前,还可使用特殊条件。如果设置了这个选项,则不会应用 readLock 选项。

 

GenericFileProcess Strategy<T>

startingDirectoryMustExist (consumer)

启动目录是否必须存在。请注意,autoCreate 选项是默认的启用状态,这意味着如果起始目录不存在,通常会自动创建起始目录。您可以禁用 autoCreate 并启用它,以确保起始目录必须存在。如果目录不存在,将抛出异常。

false

布尔值

fileExist (producer)

如果文件已存在相同名称的文件,应该怎么办?覆盖(默认)替换现有文件。append - 将内容添加到现有文件中。fail - 引发 GenericFileOperationException,这表示已有的文件。ignore - 静默忽略问题且不覆盖现有文件,但假设一切正常。move - 选项需要使用同时配置 moveExisting 选项。选项 eagerDeleteTargetFile 可用于控制移动文件要做什么,并且已存在一个现有文件,否则会导致移动操作失败。Move 选项将在编写目标文件之前移动任何现有文件。TryRename 仅在使用 tempFileName 选项时才适用。这样,可以在不做任何检查的情况下,尝试将文件从临时名称重命名为实际名称。在某些文件系统中,这个检查可能会更快,特别是 FTP 服务器。

覆盖

GenericFileExist

flatten (producer)

flatten 用于扁平化文件名路径,以剥离任何前导路径,因此这仅仅是文件名。这样,您可以以递归方式使用子目录,但当您将这些文件写入单个目录中时。在制作者上,在制作者上将强制将设置 CamelFileName 标头中的任何文件名用于任何领先的路径。

false

布尔值

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

布尔值

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<T>

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。

 

String>

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<T>

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

布尔值

readLockLoggingLevel (lock)

无法获取读取锁定时使用的日志记录级别。默认情况下记录 WARN。您可以更改此级别,例如,变为 OFF 以没有任何日志。这个选项仅适用于 readLock 类型的 readLock: changed、fileLock、幂等、幂等更改、幂等名称、重命名。

DEBUG

LoggingLevel

readLockMarkerFile (lock)

是否使用带 changed、重命名或专用读锁定类型的标记文件。默认情况下,也可使用标志文件来保护其他进程的获取相同的文件。可以通过将此选项设置为 false 来关闭此行为。例如,如果您不想将标记文件写入 Camel 应用程序的文件系统。

true

布尔值

readLockMinAge (lock)

此选项仅适用于 readLock=change。此选项允许指定文件的最短期限,然后才能尝试获取读取锁定。例如,使用 readLockMinAge=300s 来要求文件最多 5 分钟。这可能会加快更改的读取锁定,因为它只会试图获取至少是给定期限的文件。

0

long

readLockMinLength (lock)

此选项仅适用于 readLock=changed。此选项允许您配置最小长度。默认情况下,Camel 预期文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度的文件。

1

long

readLockRemoveOnCommit (lock)

此选项仅适用于 readLock=idempotent。此选项允许指定在处理文件成功并且提交发生时是否从幂等存储库中删除文件名条目。默认情况下,该文件不会被删除,以确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可能会支持驱除策略,您可以配置在 X 分钟后驱除文件名条目 - 这可确保出现竞争条件的问题。

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 类。

 

GenericFile<T>>

提示

文件制作者的默认行为 默认将覆盖任何现有文件(如果名称相同)。

103.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 文件夹。

103.4. 对移动和 PreMove 选项进行精细控制

移动和 preMove 选项是基于 Expression,因此,我们有 文件语言 的完整功能,可用于执行目录和名称模式的高级配置。
实际上,Camel 将会内部将您输入的目录名称转换为 文件语言 表达式。因此,当进入 move=.done Camel 时,它会将它转换为 :${file:parent}/.done/${'file:onlyname}。只有在 Camel 检测到您没有提供选项值的 $\{ } 时,才能执行此操作。因此,当您输入 $\{ } Camel 时,将不会 转换它,因此您有完整的电源。

因此,如果我们希望将文件移至备份文件夹中,现在日期为模式,我们可以实现:

move=backup/${date:now:yyyyMMdd}/${file:name}

103.5. 关于 moveFailed

moveFailed 选项允许您 将无法处理的文件 移动到另一个位置,例如您选择的错误文件夹。例如,要将错误文件夹中的文件移至时间戳,您可以使用 moveFailed=/error/${file:name.noext}-${date:now:yyyyddHHmmssSSS}.${'file:ext}.

在文件 语言查看更多示例

103.6. 消息标头

此组件支持以下标头:

103.6.1. 仅文件制作者

标头描述

CamelFileName

指定要写入的文件的名称(相对于端点目录)。这个名称可以是 String ; 一个带有 文件语言简单 表达式的字符串;或 Expression 对象。如果它是空的,则 Camel 将根据消息唯一 ID 自动生成文件名。

CamelFileNameProduced

写入的输出文件的实际绝对文件路径(路径 + 名称)。Camel 设定此标头,其用途是为最终用户提供所写入的文件的名称。

CamelOverruleFileName

Camel 2.11: 用于过量使用 CamelFileName 标头并使用值(但仅一次,因为生产者在写入文件后将删除此标头)。该值只能是一个字符串。请注意,如果已配置了选项 fileName,那么这仍在评估。

103.6.2. 仅文件消费者

标头描述

CamelFileName

将所消耗的文件的名称为相对文件路径,其偏移来自端点上配置的起始目录。

CamelFileNameOnly

仅文件名(没有前导路径的名称)。

CamelFileAbsolute

布尔值 选项指定消耗的文件是否表示绝对路径。通常,对于相对路径,通常应为 false。通常不应该使用绝对路径,但添加到 move 选项中,以允许将文件移动到绝对路径。但也可在其他位置使用。

CamelFileAbsolutePath

文件的绝对路径。对于此路径覆盖的相对文件,而是保存相对路径。

CamelFilePath

文件路径。对于相对文件,这是起始目录 + 相对文件名。对于绝对文件,这是绝对路径。

CamelFileRelativePath

相对路径.

CamelFileParent

父路径。

CamelFileLength

包含文件大小 的长 值。

CamelFileLastModified

包含最近修改文件时间戳的 值。在 Camel 2.10.3 中,旧的 类型为 日期

103.7. 批处理消费者

此组件实施 Batch Consumer。

103.8. Exchange Properties,仅文件使用者

由于文件使用者实施 BatchConsumer,它支持对其轮询的文件进行批处理。通过批量,我们意味着 Camel 向 Exchange 添加以下额外属性,因此您知道轮询的文件数量、当前索引以及批处理是否已完成。

属性描述

CamelBatchSize

在此批处理中轮询文件总数。

CamelBatchIndex

批处理的当前索引。从 0 开始。

CamelBatchComplete

代表批处理中最后一个 Exchange 的布尔值。最后一个条目仅适用于 true

这样,您可以让实例知道此批处理中有多少文件,而实例则让 Aggregator2 聚合了这一数量的文件。

103.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

103.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");

103.11. 文件名表达式

可以使用 expression 选项或 Camel FileName 标头中的基于字符串的文件语言 表达式来设置文件名。有关语法和示例,请查看 文件语言

103.12. 从其他直接丢弃文件的文件夹消耗文件

如果您消耗其他应用程序将文件直接写入文件的文件夹,请留意。查看不同的 readLock 选项,以了解您的用例适合哪些内容。最好的方法是写入另一个文件夹,在写入移动 drop 文件夹中的文件后进行写入。但是,如果您直接向 drop 文件夹写入文件,则更改选项可能会更好地检测文件当前正在写入/复制的文件,因为它使用更改的算法来查看文件大小/修改在一段时间内是否更改。其他 readLock 选项依赖于 Java 文件 API,这些 API 在检测到此问题时并不总是更好。您可能还想查看 doneFileName 选项,该选项在文件完成并准备好被消耗时,使用标志文件(done 文件)来信号。

103.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 - 是关联的完成文件

103.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 的文件。

103.15. Samples

#=== 从目录中读取并写入另一个目录

from("file://inputdir/?delete=true").to("file://outputdir")

103.15.1. 从目录读取并使用规则动态名称写入另一个目录

from("file://inputdir/?delete=true").to("file://outputdir?overruleFile=copy-of-${file:name}")

侦听目录,并为每个文件创建一个消息。将内容复制到 outputdir,再删除 输入dir 中的 文件。

103.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

103.16. 使用 flatten

如果要将文件存储在同一目录中的 outputdir 目录中,忽略源目录布局(例如,要扁平化路径),只需在制作者端添加 flatten=true 选项:

from("file://inputdir/?recursive=true&delete=true").to("file://outputdir?flatten=true")

将生成以下输出布局:

outputdir/foo.txt
outputdir/bar.txt

103.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

103.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 目录的文件。

103.19. 写入文件

Camel 还可以编写文件,例如生成文件。在下面的示例中,我们收到一些有关在将进程写入目录之前处理的 SEDA 队列的报告。

103.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

这样,您可以有一个路由来将文件写入多个目的地。

103.19.2. 通过相对于最终目的地的临时目录写入文件

有些时候,您需要将文件临时写入相对于目标目录的某些目录。当从您写入的目录中读取具有有限过滤功能的一些外部进程时,通常会发生这种情况。在以下示例中,文件将写入 /var/myapp/filesInProgress 目录,在数据传输完成后,它们将以原子方式移至' /var/myapp/finalDirectory 'directory。

from("direct:start").
  to("file:///var/myapp/finalDirectory?tempPrefix=/../filesInProgress/");

103.20. 将表达式用于文件名

在本例中,我们想将消耗的文件移至备份文件夹作为子文件夹名称:

from("file://inbox?move=backup/${date:now:yyyyMMdd}/${file:name}").to("...");

有关更多示例,请参阅 文件语言

103.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

103.22. 使用基于文件的幂等存储库

在本节中,我们将使用基于文件的幂等存储库 org.apache.camel.processor.idempotent.FileIdempotentRepository 而不是使用用作 default 的内存中。
此仓库使用 1 级别的缓存以避免读取文件存储库。它只使用文件存储库来存储 1 级别的缓存的内容。因此,存储库可以在服务器重启后保留。它将在启动时将文件的内容加载到 1st 级别缓存中。文件结构非常简单,因为它将密钥存储在文件中的独立行中。默认情况下,文件存储的大小限制为 1mb。当文件增长较大的 Camel 将截断文件存储时,通过将 1st 级别缓存清空到新的空文件来重建内容。

我们使用 Spring XML 配置我们的存储库,创建文件幂等存储库,并使用 # 符号将我们的存储库与 idempotentRepository 搭配使用,以表示 Registry 查找:

103.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>

103.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>

103.25. 使用 ANT 路径匹配器过滤

ANT 路径匹配器在 camel-spring jar 中提供。因此,如果您使用 Maven,您需要依赖于 camel-spring
其原因在于,我们利用 Spring 的 AntPathMatcher 进行实际匹配。

文件路径与以下规则匹配:

  • ? 匹配一个字符
  • * 匹配零或更多字符
  • ** 匹配路径中的零或更多目录
提示

现在,Camel 2.10 的新选项为 atInclude ,AtExclude 选项方便指定 ANT 风格 include/exclude,而无需定义过滤器。如需更多信息,请参阅上面的 URI 选项。

以下示例演示了如何使用它:

103.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。

103.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

103.26. Using GenericFileProcessStrategy

选项 processStrategy 可用于使用自定义 GenericFileProcessStrategy,它允许您实施自己的 开始提交和 回滚 逻辑。
例如,可假定系统在应消耗的文件夹中写入一个文件。但是,您不应该在写入另一个 就绪 文件之前,也不应开始消耗该文件。

因此,通过实施我们自己的 GenericFileProcessStrategy,可通过以下方式实现:

  • begin () 方法中,我们可以测试是否存在特殊 就绪 文件。begin 方法返回一个 布尔值,以指示我们可以使用该文件。
  • abort () 方法(Camel 2.10)中,可在开始操作返回 false 时执行特殊逻辑,例如用于清理资源等。
  • commit () 方法中,我们可以移动实际文件并同时删除 可用的 文件。

103.27. 使用过滤器

您可以通过实施 org.apache.camel.component.file.GenericFileFilter 接口,在 Java 代码中实施自定义 过滤器。此接口具有可返回布尔值的 accept 方法。返回到 true,使其包含文件,false 跳过该文件。从 Camel 2.10 开始,存在 GenericFile 中的 GenericFile 方法,该文件是目录。这可让您过滤不需要的目录,以避免出现不需要的目录。

例如,要跳过名称中以 "skip" 开头的目录,可按照如下所示实施:

103.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 处理之前的操作,如拦截器。

103.29. 调试日志记录

此组件具有日志级别 TRACE,如果您遇到问题,会很有帮助。

103.30. 另请参阅

第 104 章 文件语言

可作为 Camel 版本 1.1 提供

INFO:*File 语言现在与简单语言*从 Camel 2.2 合并,该文件语言现在使用 简单 语言进行合并,这意味着您可以在简单语言中直接使用所有文件语法。

文件表达式语言是对 简单 语言的扩展,添加与文件相关的功能。这些功能与使用文件路径和名称的常见用例相关。目标是允许表达式与文件和 FTP 组件一起使用,以便为使用者和制作者设置动态文件模式。

104.1. 文件语言选项

文件语言支持下面列出了的 2 个选项。

名称默认Java 类型描述

resultType

 

字符串

设置结果类型的类名称(从输出中输入)

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

104.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 模式的日期格式。是 简单 语言 的扩展。额外命令为: 文件 (仅消费者)用于文件最近修改的时间戳。注意:也可以使用 简单 语言中的所有命令。

104.3. 文件令牌示例

104.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

104.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

104.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 语言。这对那些常见的文件路径模式来说非常强大。

104.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'

104.6. 依赖项

文件语言是 camel-core 的一部分。

第 105 章 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>

105.1. URI 格式

flatpack:[delim|fixed]:flatPackConfig.pzmap.xml[?options]

或对于不含配置文件的分隔文件处理程序

flatpack:someName[?options]

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

105.2. URI 选项

Flatpack 组件没有选项。

Flatpack 端点使用 URI 语法配置:

flatpack:type:resourceUri

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

105.2.1. 路径名(2 参数):

名称描述默认类型

type

是否使用固定还是分隔符

delim

FlatpackType

resourceUri

从 classpath 或文件系统载入 flatpack 映射文件 所需的 URL

 

字符串

105.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

布尔值

105.3. 例子

  • flatpack:fixed:foo.pzmap.xml 使用 foo.pzmap.xml 文件配置创建一个固定宽度端点。
  • flatpack:delim:bar.pzmap.xml 使用 bar.pzmap.xml 文件配置创建一个分隔端点。
  • flatpack:foo 会创建一个以 foo 分隔的端点,其中没有配置文件配置。

105.4. 消息标头

Camel 会将以下标头存储在 IN 消息中:

标头描述

camelFlatpackCounter

当前行索引。对于 splitRows=false,计数器是行总数。

105.5. 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");

105.6. 标头和 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>

105.7. 使用端点

常见用例是将文件发送到此端点,以便在单独的路由中进一步处理。例如:

  <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 集成

105.8. 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 操作的标头和尾随器。

105.9. 选项

数据格式有以下选项:

选项默认值描述

定义

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:允许行更长的时间,并忽略额外的字符。

105.10. 使用

要使用数据格式,只需实例化实例,并在路由构建器中调用 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 队列中。

105.11. 依赖项

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

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-flatpack</artifactId>
  <version>x.x.x</version>
</dependency>

105.12. 另请参阅

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

第 106 章 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 操作的标头和尾随器。

106.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。

106.2. 使用

要使用数据格式,只需实例化实例,并在路由构建器中调用 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.3. 依赖项

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

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-flatpack</artifactId>
  <version>x.x.x</version>
</dependency>

第 108 章 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>

108.1. URI 格式

fop://outputFormat?[options]

108.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

文本

有效输出格式的完整列表 可在此处找到

108.3. 端点选项

FOP 组件没有选项。

FOP 端点使用 URI 语法配置:

fop:outputType

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

108.3.1. 路径名(1 参数):

名称描述默认类型

outputType

必需 的主要输出格式为 PDF,但也有其他输出格式。

 

FopOutputType

108.3.2. 查询参数(3 参数):

名称描述默认类型

fopFactory (producer)

允许使用自定义配置或实施 org.apache.fop.apps.FopFactory。

 

FopFactory

userConfigURL (producer)

可以从 classpath 或文件系统加载的配置文件的位置。

 

字符串

同步 (高级)

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

false

布尔值

带有 以下结构 的配置文件的位置:从从 Camel 2.12 开始,文件默认情况下从 classpath 中加载。您可以使用 file:classpath: 作为前缀,从 file 或 classpath 中加载资源。在以前的版本中,该文件始终从文件系统载入。

fopFactory

 

允许使用自定义配置或实施 org.apache.fop.apps.FopFactory

108.4. 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

 

适用于本文档的关键字集

108.5. 示例

以下是从 xml 数据和 xslt 模板呈现 PDF 的路由,并将 PDF 文件保存在目标文件夹中:

from("file:source/data/xml")
    .to("xslt:xslt/template.xsl")
    .to("fop:application/pdf")
    .to("file:target/data");

如需更多信息,请参阅这些资源…​

108.6. 另请参阅

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

第 109 章 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>

109.1. URI 格式

freemarker:templateName[?options]

其中 templateName 是要调用的模板的类路径路径 URI;或者,也可以是远程模板的完整 URL (如 file://folder/myfile.ftl)。

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

109.2. 选项

Freemarker 组件支持下面列出的 2 选项。

名称描述默认类型

配置 (高级)

使用现有的 freemarker.template.Configuration 实例作为配置。

 

配置

resolveProperty Placeholders (advanced)

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

true

布尔值

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

freemarker:resourceUri

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

109.2.1. 路径名(1 参数):

名称描述默认类型

resourceUri

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

 

字符串

109.2.2. 查询参数(5 参数):

名称描述默认类型

configuration (producer)

设置要使用的自由标记器配置

 

配置

contentCache (producer)

设置是否使用资源内容缓存

false

布尔值

encoding (producer)

设置用于加载模板文件的编码。

 

字符串

templateUpdateDelay (producer)

加载的模板资源将保留在缓存中的秒数。

 

int

同步 (高级)

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

false

布尔值

109.3. Headers

在 FreeMarker 评估过程中设置的标题将返回到邮件并添加为标头。这为 FreeMarker 组件提供了向消息返回值的机制。

示例:在 FreeMarker 模板中设置 fruit 的标头值:

${request.setHeader('fruit', 'Apple')}

标头 fruit 现在可以从 message.out.headers 访问。

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

109.5. 热重新加载

FreeMarker 模板资源默认为文件和类路径资源(expanded jar)都 无法进行 热重新加载。如果设置了 contentCache=false,则 Camel 不会缓存资源并热重新加载,从而启用。这种情境可用于开发。

109.6. 动态模板

Camel 提供了两个标头,您可以为模板或模板内容本身定义不同的资源位置。如果设置了其中任何标头,Camel 会将其用于端点配置的资源。这可让您在运行时提供动态模板。

标头类型描述支持版本

FreemarkerConstants.FREEMARKER_RESOURCE

org.springframework.core.io.Resource

模板资源

⇐ 2.1

FreemarkerConstants.FREEMARKER_RESOURCE_URI

字符串

要使用的模板资源的 URI,而不是配置的端点。

>= 2.1

FreemarkerConstants.FREEMARKER_TEMPLATE

字符串

要使用的模板,而不使用配置的端点。

>= 2.1

109.7. 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");

109.8. 电子邮件示例

在本例中,我们想要使用 FreeMarker 模板来进行确认电子邮件。电子邮件模板在自由Marker 中称为:

Dear ${headers.lastName}, ${headers.firstName}

Thanks for the order of ${headers.item}.

Regards Camel Riders Bookstore
${body}

和 java 代码:

109.9. 另请参阅

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

第 110 章 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>

110.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)加密协议的支持。

110.2. URI 选项

以下选项适用于 FTP 组件。

FTP 组件没有选项。

FTP 端点使用 URI 语法配置:

ftp:host:port/directoryName

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

110.2.1. 路径名(3 参数):

名称描述默认类型

主机

FTP 服务器 所需的 主机名

 

字符串

port

FTP 服务器的端口

 

int

directoryName

启动目录

 

字符串

110.2.2. 查询参数(108 参数):

名称描述默认类型

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 存储库用于考虑当前正在使用的进程文件中。默认情况下会使用基于内存的存储库。

 

String>

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<T>

receiveBufferSize (producer, consumer)

receiveBufferSize 参数用于上传和下载;仅由 FTPClient 使用

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

布尔值

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

布尔值

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)

这是指 SocketOptions。SO_TIMEOUT 值以毫秒为单位。推荐的选项是将其设置为 300000,因此没有挂起的连接。在 SFTP 上,此选项设置为 JSCH Session 实例上的超时。对于 Camel 2.4,这个参数为 FTP 和 FTPS 设置 soTimeout。对于 Camel 2.14.3、2.15.3、2.16 和 onwards,这个参数指的是 SFTP。

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<T>

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。

 

String>

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<T>

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

布尔值

readLockLoggingLevel (lock)

无法获取读取锁定时使用的日志记录级别。默认情况下记录 WARN。您可以更改此级别,例如,变为 OFF 以没有任何日志。这个选项仅适用于 readLock 类型的 readLock: changed、fileLock、幂等、幂等更改、幂等名称、重命名。

DEBUG

LoggingLevel

readLockMarkerFile (lock)

是否使用带 changed、重命名或专用读锁定类型的标记文件。默认情况下,也可使用标志文件来保护其他进程的获取相同的文件。可以通过将此选项设置为 false 来关闭此行为。例如,如果您不想将标记文件写入 Camel 应用程序的文件系统。

true

布尔值

readLockMinAge (lock)

此选项仅适用于 readLock=change。此选项允许指定文件的最短期限,然后才能尝试获取读取锁定。例如,使用 readLockMinAge=300s 来要求文件最多 5 分钟。这可能会加快更改的读取锁定,因为它只会试图获取至少是给定期限的文件。

0

long

readLockMinLength (lock)

此选项仅适用于 readLock=changed。此选项允许您配置最小长度。默认情况下,Camel 预期文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度的文件。

1

long

readLockRemoveOnCommit (lock)

此选项仅适用于 readLock=idempotent。此选项允许指定在处理文件成功并且提交发生时是否从幂等存储库中删除文件名条目。默认情况下,该文件不会被删除,以确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可能会支持驱除策略,您可以配置在 X 分钟后驱除文件名条目 - 这可确保出现竞争条件的问题。

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 类。

 

GenericFile<T>>

帐户 (安全)

用于登录的帐户

 

字符串

密码 (安全)

用于登录的密码

 

字符串

username (security)

用于登录的用户名

 

字符串

110.3. 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");

110.4. 例子

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

110.5. 并发

FTP Consumer 不支持并发

FTP 用户(具有相同的端点)不支持并发(后备 FTP 客户端无法安全线程)。
您可以使用多个 FTP 用户来轮询不同端点。它只是一个不支持并发用户的端点。

FTP 生产者 没有 此问题,它支持并发。

110.6. 更多信息

这个组件是 File 组件的扩展。因此,File 组件页面中还有更多示例和详情。

110.7. 消耗文件时默认

默认情况下,FTP 用户将保留不动在远程 FTP 服务器中的消耗文件。如果您想要删除文件或者将其移动到其他位置,则必须明确配置它。例如,您可以使用 delete=true 删除文件,或使用 move=.done 将文件移动到隐藏的完成子目录中。

常规文件使用者不同,因为它默认将文件移动到 .camel 子目录中。默认情况下,Camel 不适用于 FTP 用户,也就是说,默认可能缺少权限才能移动或删除文件。

110.7.1. 限制

选项 readLock 可用于强制 Camel 不使用 当前正在写入的文件。但是,这个选项会被默认关闭,因为它要求用户具有写入权限。有关读取锁定的详情,请查看 File2 中的选项表。
还有其他解决方案可避免消耗目前通过 FTP 写入的文件;例如,您可以写入临时目标并在写入后移动文件。

使用 movepreMove 选项移动文件时,文件仅限于 FTP_ROOT 文件夹。这可防止您将文件移至 FTP 区域之外。如果要将文件移动到另一个区域,您可以使用软链接并将文件移动到软链接文件夹中。

110.8. 消息标头

以下消息标头可用于影响组件的行为

标头描述

CamelFileName

指定发送到端点时要用于输出消息的输出文件名(与端点目录相对)。如果不存在且没有表达式,则会将生成的消息 ID 用作文件名。

CamelFileNameProduced

写入的输出文件的实际文件路径(路径 + 名称)。此标头由 Camel 设置,其用途是为最终用户提供写入的文件的名称。

CamelFileIndex

当前索引除在此批处理中消耗的文件总数。

CamelFileSize

此批处理中消耗的文件总数。

CamelFileHost

远程主机名。

CamelFileLocalWorkPath

如果使用了本地工作目录,则本地工作文件的路径。

此外,FTP/FTPS 使用者和制作者还会使用以下标头增强 Camel 消息

标头描述

CamelFtpReplyCode

Camel 2.11.1: FTP 客户端回复代码(类型是一个整数)

CamelFtpReplyString

Camel 2.11.1: FTP 客户端回复字符串

110.9. 关于超时

这两组库(请参阅 top)有不同的 API 来设置超时。您可以使用两者的 connectTimeout 选项在 millis 中设置超时来建立网络连接。也可以使用 ftpClient. soTimeout 在 FTP/FTPS 上设置单个 soTimeout。注意 SFTP 将自动使用 connectTimeout 作为其 soTimeouttimeout 选项仅适用于 FTP/FTSP 作为数据超时,它对应于 ftpClient.dataTimeout 值。所有超时值都为 millis。

110.10. 使用本地工作目录

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 知道它是本地的工作文件,它可以优化并使用重命名而不是文件副本,因为该文件旨在完全删除。

110.11. 步骤更改目录

在消耗文件(例如下载)或生成文件(如上传)时,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)文件夹中都有一个文件。

110.11.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 遍历目录结构。

110.11.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 操作。

110.12. 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>

110.12.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");

110.12.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");

110.13. 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>

110.14. 使用 ANT 路径匹配器过滤

ANT 路径匹配器是 camel-spring jar 中附带的过滤器。因此,如果您使用 Maven,您需要依赖于 camel-spring
这就是我们利用 Spring 的 AntPathMatcher 进行实际匹配的原因。

文件路径与以下规则匹配:

  • ? 匹配一个字符
  • * 匹配零或更多字符
  • ** 匹配路径中的零或更多目录

以下示例演示了如何使用它:

110.15. 使用 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 文档来发现所有选项。

110.16. 设置首选 SFTP 验证方法

如果要显式指定由 sftp 组件使用的身份验证方法列表,请使用 preferredAuthentications 选项。例如,如果您想将 Camel 试图通过私有/公共 SSH 密钥进行身份验证,并在没有公钥时回退到用户/密码身份验证,则使用以下路由配置:

from("sftp://localhost:9999/root?username=admin&password=admin&preferredAuthentications=publickey,password").
  to("bean:processFile");

110.17. 使用固定名称消耗单个文件

如果要下载单个文件并知道文件名,您可以使用 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);

110.18. 调试日志记录

此组件具有日志级别 TRACE,如果您遇到问题,会很有帮助。

110.19. 另请参阅

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

第 111 章 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 组件

111.1. URI 选项

以下选项适用于 FTPS 组件。

FTPS 组件支持下面列出的 2 个选项。

名称描述默认类型

useGlobalSslContext Parameters (security)

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

false

布尔值

resolveProperty Placeholders (advanced)

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

true

布尔值

FTPS 端点使用 URI 语法配置:

ftps:host:port/directoryName

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

111.1.1. 路径名(3 参数):

名称描述默认类型

主机

FTP 服务器 所需的 主机名

 

字符串

port

FTP 服务器的端口

 

int

directoryName

启动目录

 

字符串

111.1.2. 查询参数(116 参数):

名称描述默认类型

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 存储库用于考虑当前正在使用的进程文件中。默认情况下会使用基于内存的存储库。

 

String>

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<T>

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

布尔值

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

布尔值

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)

这是指 SocketOptions。SO_TIMEOUT 值以毫秒为单位。推荐的选项是将其设置为 300000,因此没有挂起的连接。在 SFTP 上,此选项设置为 JSCH Session 实例上的超时。对于 Camel 2.4,这个参数为 FTP 和 FTPS 设置 soTimeout。对于 Camel 2.14.3、2.15.3、2.16 和 onwards,这个参数指的是 SFTP。

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<T>

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。

 

String>

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<T>

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

布尔值

readLockLoggingLevel (lock)

无法获取读取锁定时使用的日志记录级别。默认情况下记录 WARN。您可以更改此级别,例如,变为 OFF 以没有任何日志。这个选项仅适用于 readLock 类型的 readLock: changed、fileLock、幂等、幂等更改、幂等名称、重命名。

DEBUG

LoggingLevel

readLockMarkerFile (lock)

是否使用带 changed、重命名或专用读锁定类型的标记文件。默认情况下,也可使用标志文件来保护其他进程的获取相同的文件。可以通过将此选项设置为 false 来关闭此行为。例如,如果您不想将标记文件写入 Camel 应用程序的文件系统。

true

布尔值

readLockMinAge (lock)

此选项仅适用于 readLock=change。此选项允许指定文件的最短期限,然后才能尝试获取读取锁定。例如,使用 readLockMinAge=300s 来要求文件最多 5 分钟。这可能会加快更改的读取锁定,因为它只会试图获取至少是给定期限的文件。

0

long

readLockMinLength (lock)

此选项仅适用于 readLock=changed。此选项允许您配置最小长度。默认情况下,Camel 预期文件包含数据,因此默认值为 1。您可以将这个选项设置为零,以允许消耗零长度的文件。

1

long

readLockRemoveOnCommit (lock)

此选项仅适用于 readLock=idempotent。此选项允许指定在处理文件成功并且提交发生时是否从幂等存储库中删除文件名条目。默认情况下,该文件不会被删除,以确保不会发生任何竞争条件,因此另一个活跃节点可能会尝试获取该文件。相反,幂等存储库可能会支持驱除策略,您可以配置在 X 分钟后驱除文件名条目 - 这可确保出现竞争条件的问题。

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 类。

 

GenericFile<T>>

帐户 (安全)

用于登录的帐户

 

字符串

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 配置,可覆盖链接 FtpsEndpointftpClientKeyStoreParameters、链接 ftpClientTrustStoreParameters 和 link FtpsConfigurationgetSecurityProtocol ()中的任何设置。

 

SSLContextParameters

username (security)

用于登录的用户名

 

字符串

第 112 章 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>

112.1. URI 格式

ganglia:address:port[?options]

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

112.2. Ganglia 组件和端点 URI 选项

Ganglia 组件支持下面列出的 2 个选项。

名称描述默认类型

配置 (高级)

使用共享配置

 

GangliaConfiguration

resolveProperty Placeholders (advanced)

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

true

布尔值

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

ganglia:host:port

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

112.2.1. 路径名(2 参数):

名称描述默认类型

主机

Ganglia 服务器的主机名

239.2.11.71

字符串

port

Ganglia 服务器的端口

8649

int

112.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

布尔值

112.3. 邮件正文

正文中的任何值(如字符串或数字类型)都将发送到 Ganglia 系统。

112.4. 返回值/响应

Ganglia 使用单向 UDP 或多播发送指标。  邮件正文没有响应或更改。

112.5. 例子

112.5.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");

112.5.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");

第 113 章 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>

113.1. URI 格式

geocoder:address:name[?options]
geocoder:latlng:latitude,longitude[?options]

113.2. 选项

Geocoder 组件没有选项。

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

geocoder:address:latlng

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

113.2.1. 路径名(2 参数):

名称描述默认类型

address

应该带有地址前缀的 geo 地址:

 

字符串

latlng

应该以 latlng 前缀的地球关系和长度:

 

字符串

113.2.2. 查询参数(14 参数):

名称描述默认类型

clientId (producer)

使用带有这个客户端 ID 的 google 高级

 

字符串

clientKey (producer)

使用 google premium 带有这个客户端密钥

 

字符串

headersOnly (producer)

不论是否仅丰富带标头的 Exchange,还是使正文保持原样。

false

布尔值

language (producer)

要使用的语言。

en

字符串

httpClientConfigurer (advanced)

为生产者或消费者创建的新 HttpClient 实例注册自定义配置策略,如 配置身份验证机制等

 

HttpClientConfigurer

httpConnectionManager (advanced)

使用自定义 HttpConnectionManager 管理连接

 

HttpConnectionManager

同步 (高级)

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

false

布尔值

proxyAuthDomain (proxy)

代理 NTML 验证的域

 

字符串

proxyAuthHost (proxy)

用于代理 NTML 身份验证的可选主机

 

字符串

proxyAuthMethod (proxy)

代理的身份验证方法,可以是 Basic、Digest 或 NTLM。

 

字符串

proxyAuthPassword (proxy)

用于代理验证的密码

 

字符串

proxyAuthUsername (proxy)

用于代理身份验证的用户名

 

字符串

proxyHost (proxy)

代理主机名

 

字符串

proxyPort (proxy)

代理端口号

 

整数

113.3. 交换数据格式

Camel 将以 com.google.code.geocoder.model.GeocodeResponse 类型形式提供正文。
如果地址为 "current",则响应为 String 类型,其 JSON 表示当前位置。

如果选项 headersOnly 设为 true,则邮件正文将保留原样,并且只有标头才会添加到 Exchange 中。

113.4. 消息标头

标头描述

CamelGeoCoderStatus

必需。geocoder 库中的状态代码。如果状态为 GeocoderStatus.OK,则需要额外的标头

CamelGeoCoderAddress

格式化的地址

CamelGeoCoderLat

位置的感度。

CamelGeoCoderLng

地点范围。

CamelGeoCoderLatlng

各个位置的感度和长度。用逗号分开。

CamelGeoCoderCity

城市长名称。

CamelGeoCoderRegionCode

区域代码。

CamelGeoCoderRegionName

区域名称。

CamelGeoCoderCountryLong

国家/地区长名称。

CamelGeoCoderCountryShort

国家/地区短名称。

请注意,根据所使用的数据和模式,可能无法提供所有标头(地址与 latlng)。

113.5. 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")

第 114 章 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]

114.1. URI 选项

制作者允许在特定存储库上执行操作。
使用者允许在特定存储库上消耗提交、标签和分支。

Git 组件没有选项。

Git 端点使用 URI 语法配置:

git:localPath

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

114.1.1. 路径名(1 参数):

名称描述默认类型

localPath

所需的 Local 仓库路径

 

字符串

114.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

布尔值

114.2. 消息标头

名称默认值类型Context描述

CamelGitOperation

null

字符串

制作者

如果不将作为端点选项指定在存储库上执行的操作

CamelGitFilename

null

字符串

制作者

添加操作中的文件名

CamelGitCommitMessage

null

字符串

制作者

与提交操作相关的提交消息

CamelGitCommitUsername

null

字符串

制作者

提交操作中的提交用户名

CamelGitCommitEmail

null

字符串

制作者

提交操作中的提交电子邮件

CamelGitCommitId

null

字符串

制作者

提交 ID

CamelGitAllowEmpty

null

布尔值

制作者

管理空 git 提交的标志

114.3. 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")

114.4. 消费者示例

以下是消耗提交的使用者路由示例:

from("git:///tmp/testRepo?type=commit")
                        .to(....)

第 115 章 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>

115.1. URI 格式

github://endpoint[?options]

115.2. 必填选项:

请注意,这些可以通过端点直接配置。

GitHub 组件没有选项。

GitHub 端点使用 URI 语法配置:

github:type/branchName

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

115.2.1. 路径名(2 参数):

名称描述默认类型

type

执行所需的 git 操作

 

GitHubType

branchName

分支名称

 

字符串

115.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

布尔值

115.3. 消费者端点:

端点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

115.4. 制作者端点:

端点Body消息标头

pullRequestComment

字符串(注释文本)

- GitHubPullRequest (整数)(REQUIRED): Pull request number。

- GitHubInResponseTo (整数):如果响应拉取请求 diff 上的另一个内联注释,则需要。如果省略,则假定为拉取请求讨论的一般注释。

closePullRequest

none

- GitHubPullRequest (整数)(REQUIRED): Pull request number。

createIssue (From Camel 2.18)

字符串(签发的正文文本)

- GitHubIssueTitle (字符串)(REQUIRED):问题标题。

第 116 章 GZip DataFormat

可作为 Camel 版本 2.0 提供

GZip 数据格式是消息压缩和解压缩格式。它使用与 Zip DataFormat 中使用的相同防御算法,但提供了一些额外的标头。这个格式由常用的 gzip/gunzip 工具生成。在端点使用 GZip 解压缩消息之前,可以使用 GZip 解压缩消息来取消总结使用 GZip 压缩。当您处理大量 XML 和基于文本的有效负载时,或者当您使用 gzip 工具读取消息时,压缩功能非常有用。

116.1. 选项

GZip 数据格式支持以下列出的 1 选项。

名称默认Java 类型描述

contentTypeHeader

false

布尔值

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

116.2. marshal

在本例中,我们将一个常规文本/XML 有效负载传输到压缩的有效负载中,使用 gzip 压缩格式并将其发送名为 MY_QUEUE 的 ActiveMQ 队列。

from("direct:start").marshal().gzip().to("activemq:queue:MY_QUEUE");

116.3. unmarshal

在本例中,我们从名为 MY_QUEUE 的 ActiveMQ 队列传播出 gzip 的有效负载,并将其转发到 UnGZippedMessageProcessor

from("activemq:queue:MY_QUEUE").unmarshal().gzip().process(new UnGZippedMessageProcessor());

116.4. 依赖项

此数据格式以 camel-core 提供,因此不需要额外的依赖项。

第 117 章 Google BigQuery Component

可作为 Camel 版本 2.20 可用

117.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>

117.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 中找到。

117.3. URI 格式

        google-bigquery://project-id:datasetId[:tableId]?[options]

117.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

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

117.4.1. 路径名(3 参数):

名称描述默认类型

projectId

所需的 Google Cloud Project Id

 

字符串

datasetId

所需的 BigQuery 数据集 Id

 

字符串

tableId

BigQuery 表 ID

 

字符串

117.4.2. 查询参数(3 参数):

名称描述默认类型

connectionFactory (producer)

ConnectionFactory 以获取与 Bigquery 服务的连接。如果未提供默认值,则将使用。

 

GoogleBigQuery ConnectionFactory

useAsInsertId (producer)

用作插入 ID 的字段名称

 

字符串

同步 (高级)

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

false

布尔值

117.5. 消息标头

名称类型描述

CamelGoogleBigQuery.TableSuffix

字符串

插入数据时要使用的表后缀

CamelGoogleBigQuery.InsertId

字符串

插入数据时要使用的 InsertId

CamelGoogleBigQuery.PartitionDecorator

字符串

分区 decorator 来指示在插入数据时要使用的分区

CamelGoogleBigQuery.TableId

字符串

提交数据的表 ID。如果指定,则将覆盖端点配置

117.6. 生产端点

制作者端点可以接受并传送到 BigQuery 个人,并分组的交换。分组的交换设置有 Exchange.GROUPED_EXCHANGE 属性。

Goole BigQuery producer 将在单个 api 调用中发送一组交换,除非指定了不同的表后缀或分区 decorators,在这种情况下,它会破坏它以确保数据以正确的后缀或分区 decorator 编写。

Google BigQuery 端点需要有效负载可以是映射或映射列表。包含映射的有效负载将插入一行,并且包含一个含有映射列表列表的有效负载,将对列表中的每个条目插入一行。

117.7. 模板表

参考资料 :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")

请注意,建议将分区用于此用例。

117.8. 分区

参考资料 :https://cloud.google.com/bigquery/docs/creating-partitioned-tables

在创建表时指定分区,如果设置数据将自动分区到单独的表中。通过在交换上设置 GoogleBigQueryConstants.PARTITION_DECORATOR 标头来指定特定分区时。

117.9. 确保数据一致性

参考资料 :https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency

可以通过标头 GoogleBigQueryConstants.INSERT_ID 或指定查询参数 useAsInsertId 来设置插入 ID。当有效负载是列表时,就需要指定插入交换标头的行时插入的插入 id - 如果有效负载列表是 GoogleBigQueryConstants.INSERT_ID 将被忽略。在这种情况下,请使用查询参数 useAsInsertId

第 118 章 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>

118.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

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

118.1.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

GoogleCalendarApiName

methodName

所选操作需要什么子操作

 

字符串

118.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

布尔值

118.2. URI 格式

GoogleCalendar 组件使用以下 URI 格式:

        google-calendar://endpoint-prefix/endpoint?[options]

端点前缀可以是以下之一:

  • acl
  • calendars
  • Channels
  • colors
  • 事件
  • freebusy
  • list
  • 设置

118.3. 生产端点

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 URI MUST 包含一个前缀。

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

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

118.4. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

118.5. 消息标头

任何 URI 选项都可以在具有 CamelGoogleCalendar. 前缀的生产端点的消息标头中提供。

118.6. Message Body

所有结果消息正文都使用由 GoogleCalendarComponent 使用的底层 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息。    

第 119 章 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>

119.1. URI 格式

Google Calendar 组件使用以下 URI 格式:

        google-calendar-stream://index?[options]

119.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

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

119.2.1. 路径名(1 参数):

名称描述默认类型

index

为端点指定索引

 

字符串

119.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

布尔值

119.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

布尔值

119.4. 消费者

默认情况下,消费者的 maxResults 等于 5。

例如:

from("google-calendar-stream://test?markAsRead=true&delay=5000&maxResults=5").to("mock:result");

此路由将消耗从轮询日期开始的下一个五个事件。

  

第 120 章 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>

120.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
  • 驱动修订

120.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

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

120.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

GoogleDriveApiName

methodName

所选操作需要什么子操作

 

字符串

120.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

布尔值

120.3. 生产端点

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 URI MUST 包含一个前缀。

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

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

有关端点和选项的更多信息,请参阅 API 文档 https://developers.google.com/drive/v2/reference/

120.4. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

120.5. 消息标头

任何 URI 选项都可以在具有 CamelGoogleDrive. 前缀的生产端点的消息标头中提供。

120.6. Message Body

所有结果消息正文都使用由 GoogleDriveComponent 使用的底层 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息。    

第 121 章 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>

121.1. URI 格式

GoogleMail 组件使用以下 URI 格式:

        google-mail://endpoint-prefix/endpoint?[options]

端点前缀可以是以下之一:

  • attachments
  • 草案
  • history
  • labels
  • messages
  • threads
  • users

121.2. GoogleMailComponent

Google 邮件组件支持以下列出的 3 个选项。

名称描述默认类型

configuration (common)

使用共享配置

 

GoogleMailConfiguration

clientFactory (advanced)

使用 GoogleCalendarClientFactory 作为创建客户端的工厂。默认会使用 BatchGoogleMailClientFactory

 

GoogleMailClient Factory

resolveProperty Placeholders (advanced)

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

true

布尔值

Google 邮件端点使用 URI 语法配置:

google-mail:apiName/methodName

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

121.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

GoogleMailApiName

methodName

所选操作需要什么子操作

 

字符串

121.2.2. 查询参数(11 参数):

名称描述默认类型

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 - 应用程序长期需要。

 

字符串

scopes (common)

指定您希望邮件应用程序与用户帐户的权限级别。如需更多信息,请参阅 https://developers.google.com/gmail/api/auth/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. 生产端点

制作者端点可以使用端点前缀,后跟下描述的端点名称和关联选项。简写别名可用于某些端点。端点 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/

121.4. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

121.5. 消息标头

任何 URI 选项都可以在具有 CamelGoogleMail. 前缀的生产端点的消息标头中提供。

121.6. Message Body

所有结果消息正文都使用由 GoogleMailComponent 使用的底层 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息。    

第 122 章 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>

122.1. URI 格式

GoogleMail 组件使用以下 URI 格式:

        google-mail-stream://index?[options]

122.2. GoogleMailStreamComponent

Google Mail Stream 组件支持 3 个选项,它们如下。

名称描述默认类型

配置 (高级)

配置

 

GoogleMailStream Configuration

clientFactory (advanced)

客户端因素

 

GoogleMailClient Factory

resolveProperty Placeholders (advanced)

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

true

布尔值

Google 邮件流端点使用 URI 语法配置:

google-mail-stream:index

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

122.2.1. 路径名(1 参数):

名称描述默认类型

index

为端点指定索引

 

字符串

122.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

布尔值

122.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

布尔值

122.4. 消费者

默认情况下,消费者使用查询"is:unread"和 maxResults 等于 10。

例如:

from("google-mail-stream://test?markAsRead=true&delay=5000&maxResults=5&labels=GitHub,Apache").to("mock:result");

此路由将使用带有 Github 和 Apache 标签的未读取消息,它会将消息标记为读取。

  

第 123 章 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>

123.1. URI 格式

GoogleMail 组件使用以下 URI 格式:

google-pubsub://project-id:destinationName?[options]

目的地名称可以是主题或订阅名称。

123.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

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

123.2.1. 路径名(2 参数):

名称描述默认类型

projectId

所需的项目 Id

 

字符串

destinationName

所需的 目标名称

 

字符串

123.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

布尔值

123.3. 生产端点

生产者端点可以接受并交付给 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

123.4. 消费者端点

如果尚未被确认为订阅中的配置选项,Google PubSub 将恢复消息。

一旦交换处理完成后,该组件将确认消息。

如果路由抛出异常,则交换被标记为失败,组件会将 NACK 消息立即进行。

为黑色,该组件使用 Acknowledgement ID 存储为标头 GooglePubsubConstants.ACK_ID。如果删除或篡改了标头,则 ack 将失败,并且消息将在自动截止时间后再次进行恢复。

123.5. 消息标头

由消费者端点设置的标头:

  • GooglePubsubConstants.MESSAGE_ID
  • GooglePubsubConstants.ATTRIBUTES
  • GooglePubsubConstants.PUBLISH_TIME
  • GooglePubsubConstants.ACK_ID

123.6. Message Body

消费者端点将消息的内容返回为 byte[] - 正好与基础系统发送一样。它是转换/复制内容的路由。

123.7. 身份验证配置

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 中找到。

123.8. 回滚和重新传送

Google PubSub 的回滚依赖于 Acknowledgement Deadline (Google PubSub 期望收到确认的时间期限)。如果尚未收到确认信息,信息将会被红色。

Google 提供了一个 API,用于扩展消息的截止时间。

Google PubSub文档中的更多信息

因此,回滚实际上是一个带有零值的截止时间扩展 API 调用 - 现在到达截止时间,消息可以被重新提供给下一个消费者。

通过将消息标题 GooglePubsubConstants.ACK_DEADLINE 设置为以秒为单位的值,可以延迟消息重新传送。

第 124 章 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>

124.1. URI 格式

GoogleSheets 组件使用以下 URI 格式:

        google-sheets://endpoint-prefix/endpoint?[options]

端点前缀可以是以下之一:

  • spreadsheets
  • data

124.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

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

124.2.1. 路径名(2 参数):

名称描述默认类型

apiName

需要 什么操作才能执行

 

GoogleSheetsApiName

methodName

所选操作需要什么子操作

 

字符串

124.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

布尔值

124.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

布尔值

124.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/

124.5. 消费者端点

任何制作者端点都可用作消费者端点。消费者端点可以使用 Scheduled Poll Consumer Optionsconsumer. 前缀来调度端点调用。返回数组或集合的消费者端点将为每个元素生成一个交换,并且每个交换都会执行一次其路由。

124.6. 消息标头

任何 URI 选项都可以在具有 CamelGoogleSheets. 前缀的生产端点的消息标头中提供。

124.7. Message Body

所有结果消息正文都使用由 GoogleSheetsComponent 使用的底层 API 提供的对象。producer 端点可以在 inBody endpoint URI 参数中指定传入消息正文的选项名称。对于返回数组或集合的端点,消费者端点会将每个元素映射到不同的消息。    

第 125 章 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>

125.1. URI 格式

Google Sheets 组件使用以下 URI 格式:

        google-sheets-stream://apiName?[options]

125.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

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

125.2.1. 路径名(1 参数):

名称描述默认类型

apiName

设置 apiName。

 

字符串

125.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

布尔值

125.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

指定返回的结果的最大数量。这将限制返回的值范围数据集中的行数或批处理请求中返回的值范围的数量。

10

整数

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

布尔值

125.4. 消费者

默认情况下,消费者的 maxResults 等于 5。

例如:

from("google-sheets-stream://data?range=A:B&delay=5000&maxResults=5").to("mock:result");

此路由将消耗从轮询日期开始的下一个十个事件。

  

第 126 章 Groovy Language

作为 Camel 版本 1.3 提供

Camel 支持其它脚本语言中的 Groovy,允许在 DSL 或 Xml 配置中使用表达式或重复数据。

要使用 Groovy 表达式,请使用以下 Java 代码

... groovy("someGroovyExpression") ...

例如,您可以使用 groovy 功能在 Message Filter 中创建 Predicate,或作为 Recipient List 的表达式

126.1. Groovy 选项

Groovy 语言支持 1 选项,这些选项如下。

名称默认Java 类型描述

trim

true

布尔值

是否修剪值是否删除前导(尾随空格和换行符)

126.2. 自定义 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 实例(包含您的自定义静态导入),而不是默认导入。

126.3. 示例

// 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>

126.4. 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 的语言列表,请参阅脚本语言。

126.5. ScriptingEngine 的其他参数

可从 Camel 2.8 开始

您可以使用 Camel 消息上的标头和密钥 CamelScript 参数 向脚本提供附加参数。
请参见以下示例:

126.6. 使用属性功能

作为 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;))")

126.7. 从外部资源载入脚本

可从 Camel 2.11 开始

您可以对脚本进行外部化,并使 Camel 从资源(如 "classpath:""file:""http:" )加载。
这可通过以下语法完成: "resource:scheme:location",例如参考类路径上的文件,您可以执行以下操作:

.setHeader("myHeader").groovy("resource:classpath:mygroovy.groovy")

126.8. 如何从多个语句脚本获取结果

可从 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

126.9. 依赖项

要在 camel 路由中使用脚本语言,您需要添加对 camel-groovy 的依赖。

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-groovy</artifactId>
  <version>x.x.x</version>
</dependency>

第 127 章 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>

127.1. URI 格式

grpc://service[?options]

127.2. 端点选项

gRPC 组件没有选项。

gRPC 端点使用 URI 语法配置:

grpc:host:port/service

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

127.2.1. 路径名(3 参数):

名称描述默认类型

主机

需要 gRPC 服务器主机名。在使用制作者时,这是 localhost 或 0.0.0.0 作为使用者或远程服务器主机名。

 

字符串

port

所需的 gRPC 本地或远程服务器端口

 

int

service

协议缓冲区描述符文件 所需的 全限定服务名称(软件包点服务定义名称)

 

字符串

127.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)

PKCS8 私钥文件密码

 

字符串

keyResource (security)

PEM 格式链接中的 PKCS8 私钥 file 资源

 

字符串

negotiationType (security)

标识用于 HTTP/2 通信的安全协商类型

PLAINTEXT

NegotiationType

serviceAccountResource (security)

Google Cloud SDK 支持的 JSON 格式的资源链接中的服务帐户密钥文件

 

字符串

trustCertCollectionResource (security)

使用 PEM 格式验证远程端点的证书收集文件资源

 

字符串

127.3. 传输安全性和身份验证支持(可从 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 的必要密码。这个功能在组件中不实施。

127.4. 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>

127.5. gRPC 消费者标头(在消费者调用后安装)

标头名称描述可能的值

CamelGrpcMethodName

使用者服务处理的方法名称

 

CamelGrpcEventType

从发送的请求接收的事件类型

onNext,onCompleted 或 onError

CamelGrpcUserAgent

如果提供,指定代理会先添加 gRPC 库的用户代理信息

 

127.6. 例子

以下是通过主机和端口参数调用的简单同步方法

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

127.7. 配置

建议您使用 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>

127.8. 如需更多信息,请参阅这些资源

gRPC 项目网站

Maven 协议缓冲插件

127.9. 另请参阅

第 128 章 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>

128.1. URI 格式

guava-eventbus:busName[?options]

其中 busName 代表 Camel registry 中的 com.google.common.eventbus.EventBus 实例的名称。

128.2. 选项

Guava EventBus 组件支持以下列出的 3 个选项。

名称描述默认类型

eventBus (common)

使用给定的 Guava EventBus 实例

 

EventBus

listenerInterface (common)

带有带有 Subscribe 注解的方法的接口。动态代理将通过接口创建,以便其注册为 EventBus 侦听器。在创建多事件监听器并正确处理 DeadEvent 时特别有用。这个选项不能与 eventClass 选项一同使用。

 

class<?>

resolveProperty Placeholders (advanced)

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

true

布尔值

Guava EventBus 端点使用 URI 语法配置:

guava-eventbus:eventBusRef

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

128.2.1. 路径名(1 参数):

名称描述默认类型

eventBusRef

使用给定名称从 registry 中查找 Guava EventBus

 

字符串

128.2.2. 查询参数(6 参数):

名称描述默认类型

eventClass (common)

如果在路由使用者端使用,会将从 EventBus 接收的事件过滤到 eventClass 实例以及 eventClass 的超类。这个选项的 null 值等于将其设置为 java.lang.Object i.e。消费者将捕获传入事件总线的所有消息。这个选项不能与监听程序Interface 选项一起使用。

 

class<?>

listenerInterface (common)

带有带有 Subscribe 注解的方法的接口。动态代理将通过接口创建,以便其注册为 EventBus 侦听器。在创建多事件监听器并正确处理 DeadEvent 时特别有用。这个选项不能与 eventClass 选项一同使用。

 

class<?>

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

布尔值

128.3. 使用

路由消费者端使用 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);
  }
});

128.4. 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");

128.5. 消耗多种事件

为了定义由 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");

128.6. HawtDB

可作为 Camel 2.3 提供

HawtDB 是一个轻量级、可嵌入的键值数据库。它允许与 Camel 一起为各种 Camel 功能(如聚合器)提供持久性支持。

已弃用

HawtDB 项目已弃用,由 leveldb 替代,作为轻量级、可嵌入的键值数据库。要使用 leveldb 可轻松使用该 leveldbjni 项目。Apache ActiveMQ 项目正在计划将 leveldb 用作未来基于的主要消息存储位置,以取代 kahadb。

我们建议使用 camel-leveldb 组件替代它。

HawtDB 1.4 或更早版本的问题

HawtDB 1.4 或更早版本中存在一个错误,这意味着文件存储不会释放未使用的空间。这意味着文件在不断增长。这个问题已在带有 Camel 2.5 开始的 HawtDB 1.5 中解决。

它提供的当前功能:

  • HawtDBAggregationRepository

128.6.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

128.6.2. 永久保留什么

HawtDBAggregationRepository 只保留任何 Serializable 兼容数据类型。如果数据类型不是这样丢弃的类型,并记录 WARN。它只会保留 消息正文 和消息标题。Exchange 属性 不具有持久性

128.6.3. 恢复

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

128.6.3.1. 在 Java DSL 中使用 HawtDBAggregationRepository

在这个示例中,我们希望在 target/data/hawtdb.dat 文件中持续聚合的信息。

128.6.3.2. 在 Spring XML 中使用 HawtDBAggregationRepository

同一个示例,但使用 Spring XML :

128.6.4. 依赖项

要在 camel 路由中使用 HawtDB,您需要添加对 camel-hawtdb 的依赖项。

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

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-hawtdb</artifactId>
  <version>2.3.0</version>
</dependency>

128.6.5. 另请参阅

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

第 129 章 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>

129.1. Hazelcast 组件

请参阅以下组件用法:* map * multi map * queue * topic * list * seda * set * atomic number * cluster support (instance) * replicatedmap * ringbuffer 

129.2. 使用 hazelcast 参考

129.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>

129.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>

129.3. 发布 hazelcast 实例作为 OSGI 服务

如果在 OSGI 容器中操作,并且您希望在同一容器中使用 hazelcast 实例。您可以使用缓存来将实例发布为 OSGI 服务以及捆绑包,用于引用 hazelcast 端点中的服务。

129.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" />

129.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>

第 130 章 Hazelcast Atomic Number 组件

可作为 Camel 版本 2.7 提供

Hazelcast atomic 数量是 Camel Hazelcast 组件之一,它允许您访问 Hazelcast 原子数。原子数是一种对象,只是提供网格广泛的数量(长)。

此端点没有使用者!

130.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

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

130.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

130.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

布尔值

130.2. atomic number producer - to("hazelcast-atomicvalue:foo")

此制作者的操作为:* setvalue (使用给定值设置数字)* get * increase (+1)* reduce (-1)* destroy

请求消息的标头变量:

名称类型描述

CamelHazelcastOperationType

字符串

有效值为: setvalue、get、increased、decrease、destroy

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

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

130.2.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>

实际值(递增后)将在消息正文中提供。

130.2.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>

实际值(之后)将在消息正文中提供。

130.2.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>

第 131 章 Hazelcast 实例组件

可作为 Camel 版本 2.7 提供

Hazelcast 实例组件是 Camel Hazelcast 组件之一,它可让您在集群中使用缓存实例的加入/保留事件。Hazelcast 在一个"服务器节点"中有意义,但 extremly 在集群环境中强大。

此端点不提供制作者!

131.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

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

131.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

131.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

布尔值

131.2. 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

整数

实例的端口号

第 132 章 Hazelcast List 组件

可作为 Camel 版本 2.7 提供

Hazelcast List 组件是 Camel Hazelcast 组件之一,它允许您访问 Hazelcast 分布式列表。

132.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

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

132.1.1. 路径名(1 参数):

名称描述默认类型

cacheName

所需的 缓存名称

 

字符串

132.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

布尔值

132.2. 列出制作者 - 至("hazelcast-list:foo"

list producer 提供 7 个操作:* addAll * set * get * removevalue * removeAll * clear

132.2.1. 添加 的示例:

from("direct:add")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.ADD))
.toF("hazelcast-%sbar", HazelcastConstants.LIST_PREFIX);

132.2.2. 获取的示例

from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.GET))
.toF("hazelcast-%sbar", HazelcastConstants.LIST_PREFIX)
.to("seda:out");

132.2.3. setvalue 的示例:

from("direct:set")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.SET_VALUE))
.toF("hazelcast-%sbar", HazelcastConstants.LIST_PREFIX);

132.2.4. removevalue 的示例:

from("direct:removevalue")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastOperation.REMOVE_VALUE))
.toF("hazelcast-%sbar", HazelcastConstants.LIST_PREFIX);