Red Hat Jboss Fuse-6.2.1-Apache Camel Component Reference-En-us
Red Hat Jboss Fuse-6.2.1-Apache Camel Component Reference-En-us
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons
Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is
available at
http://creativecommons.org/licenses/by-sa/3.0/
. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must
provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert,
Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity
logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other
countries.
Linux ® is the registered trademark of Linus Torvalds in the United States and other countries.
XFS ® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United
States and/or other countries.
MySQL ® is a registered trademark of MySQL AB in the United States, the European Union and
other countries.
Node.js ® is an official trademark of Joyent. Red Hat Software Collections is not formally related
to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack ® Word Mark and OpenStack logo are either registered trademarks/service marks
or trademarks/service marks of the OpenStack Foundation, in the United States and other
countries and are used with the OpenStack Foundation's permission. We are not affiliated with,
endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
Abstract
Apache Camel has over 100 components and each component is highly configurable. This guide
describes the settings for each of the components.
Table of Contents
Table of Contents
.CHAPTER
. . . . . . . . . . 1.
. .COMPONENTS
. . . . . . . . . . . . . . . OVERVIEW
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
..............
1.1. LIST OF CAMEL COMPONENTS FOR APACHE KARAF 42
1.2. LIST OF CAMEL COMPONENTS FOR JBOSS EAP 60
1.3. DEPLOYING CUSTOM CAMEL COMPONENTS ON JBOSS EAP 69
.CHAPTER
. . . . . . . . . . 2.
. . ACTIVEMQ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71
.............
ACTIVEMQ COMPONENT 71
URI FORMAT 71
OPTIONS 71
CAMEL ON EAP DEPLOYMENT 71
CONFIGURING THE CONNECTION FACTORY 72
CONFIGURING THE CONNECTION FACTORY USING SPRING XML 72
USING CONNECTION POOLING 72
INVOKING MESSAGELISTENER POJOS IN A ROUTE 73
USING ACTIVEMQ DESTINATION OPTIONS 74
CONSUMING ADVISORY MESSAGES 74
GETTING COMPONENT JAR 75
.CHAPTER
. . . . . . . . . . 3.
. . AHC
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
..............
ASYNC HTTP CLIENT (AHC) COMPONENT 76
URI FORMAT 76
AHCENDPOINT OPTIONS 76
AHCCOMPONENT OPTIONS 78
MESSAGE HEADERS 79
MESSAGE BODY 79
RESPONSE CODE 79
AHCOPERATIONFAILEDEXCEPTION 80
CALLING USING GET OR POST 80
CONFIGURING URI TO CALL 80
CONFIGURING URI PARAMETERS 81
HOW TO SET THE HTTP METHOD (GET/POST/PUT/DELETE/HEAD/OPTIONS/TRACE) TO THE HTTP
PRODUCER 81
CONFIGURING CHARSET 81
URI PARAMETERS FROM THE ENDPOINT URI 81
URI PARAMETERS FROM THE MESSAGE 82
GETTING THE RESPONSE CODE 82
CONFIGURING ASYNCHTTPCLIENT 82
SSL SUPPORT (HTTPS) 83
USING THE JSSE CONFIGURATION UTILITY 83
PROGRAMMATIC CONFIGURATION OF THE COMPONENT 83
SPRING DSL BASED CONFIGURATION OF ENDPOINT 83
. . . . . . . . . . . 4.
CHAPTER . . .AHC-WS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
..............
ASYNC HTTP CLIENT (AHC) WEBSOCKET CLIENT COMPONENT 85
URI FORMAT 85
AHC-WS OPTIONS 85
WRITING AND READING DATA OVER WEBSOCKET 85
CONFIGURING URI TO WRITE OR READ DATA 85
.CHAPTER
. . . . . . . . . . 5.
. . AMQP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
..............
AMQP 87
URI FORMAT 87
1
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.CHAPTER
. . . . . . . . . . 6.
. . APNS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
..............
APNS COMPONENT 88
URI FORMAT 88
OPTIONS 88
PRODUCER 88
CONSUMER 89
COMPONENT 89
EXCHANGE DATA FORMAT 89
MESSAGE HEADERS 89
APNSSERVICEFACTORY BUILDER CALLBACK 89
SAMPLES 90
CAMEL XML ROUTE 90
CAMEL JAVA ROUTE 91
CREATE CAMEL CONTEXT AND DECLARE APNS COMPONENT PROGRAMMATICALLY 91
APNSPRODUCER - IOS TARGET DEVICE DYNAMICALLY CONFIGURED VIA HEADER: "CAMELAPNSTOKENS"
91
APNSPRODUCER - IOS TARGET DEVICE STATICALLY CONFIGURED VIA URI 92
APNSCONSUMER 92
SEE ALSO 92
. . . . . . . . . . . 7.
CHAPTER . . ATMOSPHERE-WEBSOCKET
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
..............
ATMOSPHERE WEBSOCKET SERVLET COMPONENT 93
URI FORMAT 93
READING AND WRITING DATA OVER WEBSOCKET 93
CONFIGURING URI TO READ OR WRITE DATA 93
.CHAPTER
. . . . . . . . . . 8.
. . .ATOM
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
..............
ATOM COMPONENT 95
URI FORMAT 95
OPTIONS 95
CAMEL ON EAP DEPLOYMENT 96
EXCHANGE DATA FORMAT 96
MESSAGE HEADERS 97
SAMPLES 97
. . . . . . . . . . . 9.
CHAPTER . . AVRO
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
...............
AVRO COMPONENT 100
APACHE AVRO OVERVIEW 100
USING THE AVRO DATA FORMAT 101
USING AVRO RPC IN CAMEL 101
AVRO RPC URI OPTIONS 102
AVRO RPC HEADERS 103
EXAMPLES 103
. . . . . . . . . . . 10.
CHAPTER . . . AWS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
...............
10.1. INTRODUCTION TO THE AWS COMPONENTS 105
10.2. AWS-CW 105
10.3. AWS-DDB 108
10.4. AWS-S3 115
10.5. AWS-SDB 120
10.6. AWS-SES 125
10.7. AWS-SNS 128
10.8. AWS-SQS 130
10.9. AWS-SWF 136
2
Table of Contents
.CHAPTER
. . . . . . . . . . 11.
. . .BEAN
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
...............
BEAN COMPONENT 142
URI FORMAT 142
OPTIONS 142
USING 142
BEAN AS ENDPOINT 143
JAVA DSL BEAN SYNTAX 144
BEAN BINDING 144
. . . . . . . . . . . 12.
CHAPTER . . . BEAN
. . . . . . .VALIDATOR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
...............
BEAN VALIDATOR COMPONENT 145
URI FORMAT 145
URI OPTIONS 145
OSGI DEPLOYMENT 146
EXAMPLE 146
. . . . . . . . . . . 13.
CHAPTER . . . BEANSTALK
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
...............
BEANSTALK COMPONENT 149
DEPENDENCIES 149
URI FORMAT 149
COMMON URI OPTIONS 149
PRODUCER UIR OPTIONS 150
CONSUMER UIR OPTIONS 150
CONSUMER HEADERS 151
EXAMPLES 152
. . . . . . . . . . . 14.
CHAPTER . . . BINDY
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153
..............
BINDY COMPONENT 153
CAMEL ON EAP DEPLOYMENT 153
. . . . . . . . . . . 15.
CHAPTER . . . BOX
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
...............
BOX COMPONENT 154
URI FORMAT 154
BOX COMPONENT 155
PRODUCER ENDPOINTS: 156
ENDPOINT PREFIX COLLABORATIONS 156
URI OPTIONS FOR COLLABORATIONS 157
ENDPOINT PREFIX EVENTS 157
URI OPTIONS FOR EVENTS 157
ENDPOINT PREFIX GROUPS 158
URI OPTIONS FOR GROUPS 158
ENDPOINT PREFIX SEARCH 159
URI OPTIONS FOR SEARCH 159
ENDPOINT PREFIX COMMENTS AND SHARED-COMMENTS 159
URI OPTIONS FOR COMMENTS AND SHARED-COMMENTS 160
ENDPOINT PREFIX FILES AND SHARED-FILES 160
URI OPTIONS FOR FILES AND SHARED-FILES 161
ENDPOINT PREFIX FOLDERS AND SHARED-FOLDERS 162
URI OPTIONS FOR FOLDERS OR SHARED-FOLDERS 163
ENDPOINT PREFIX SHARED-ITEMS 163
URI OPTIONS FOR SHARED-ITEMS 163
ENDPOINT PREFIX USERS 164
URI OPTIONS FOR USERS 164
CONSUMER ENDPOINTS: 165
3
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
. . . . . . . . . . . 16.
CHAPTER . . . BROWSE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167
..............
BROWSE COMPONENT 167
URI FORMAT 167
SAMPLE 167
. . . . . . . . . . . 17.
CHAPTER . . . CACHE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
...............
17.1. CACHE COMPONENT 168
17.2. CACHEREPLICATIONJMSEXAMPLE 176
. . . . . . . . . . . 18.
CHAPTER . . . CDI
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181
..............
CDI COMPONENT 181
CAMEL ON EAP DEPLOYMENT 181
.CHAPTER
. . . . . . . . . . 19.
. . . CASSANDRA
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
...............
CAMEL CASSANDRA COMPONENT 182
URI FORMAT 182
ENDPOINT OPTIONS 182
MESSAGES 183
INCOMING MESSAGE 183
OUTGOING MESSAGE 183
REPOSITORIES 183
IDEMPOTENT REPOSITORY 184
AGGREGATION REPOSITORY 184
. . . . . . . . . . . 20.
CHAPTER . . . .CHUNK
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
...............
CHUNK COMPONENT 186
URI FORMAT 186
OPTIONS 186
CHUNK CONTEXT 187
DYNAMIC TEMPLATES 187
SAMPLES 187
THE EMAIL SAMPLE 188
. . . . . . . . . . . 21.
CHAPTER . . . CLASS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
...............
CLASS COMPONENT 189
URI FORMAT 189
OPTIONS 189
USING 189
SETTING PROPERTIES ON THE CREATED INSTANCE 190
. . . . . . . . . . . 22.
CHAPTER . . . .CMIS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .191
..............
CMIS COMPONENT 191
URI FORMAT 191
URI OPTIONS 191
USAGE 192
MESSAGE HEADERS EVALUATED BY THE PRODUCER 192
MESSAGE HEADERS SET DURING QUERYING PRODUCER OPERATION 192
. . . . . . . . . . . 23.
CHAPTER . . . .COMETD
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
...............
4
Table of Contents
. . . . . . . . . . . 24.
CHAPTER . . . .CONTEXT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
...............
CONTEXT COMPONENT 198
URI FORMAT 198
EXAMPLE 198
DEFINING THE CONTEXT COMPONENT 198
USING THE CONTEXT COMPONENT 199
NAMING ENDPOINTS 200
. . . . . . . . . . . 25.
CHAPTER . . . .CONTROLBUS
. . . . . . . . . . . . . . .COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
...............
CONTROLBUS COMPONENT 201
COMMANDS 201
OPTIONS 201
SAMPLES 202
USING ROUTE COMMAND 202
GETTING PERFORMANCE STATISTICS 202
USING SIMPLE LANGUAGE 203
. . . . . . . . . . . 26.
CHAPTER . . . .COUCHDB
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .204
...............
CAMEL COUCHDB COMPONENT 204
URI FORMAT 204
OPTIONS 204
HEADERS 205
MESSAGE BODY 205
SAMPLES 205
. . . . . . . . . . . 27.
CHAPTER . . . .CRYPTO
. . . . . . . . .(DIGITAL
. . . . . . . . . .SIGNATURES)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
...............
CRYPTO COMPONENT FOR DIGITAL SIGNATURES 207
CAMEL ON EAP DEPLOYMENT 207
INTRODUCTION 208
URI FORMAT 208
OPTIONS 209
1) RAW KEYS 210
2) KEYSTORES AND ALIASES. 210
3) CHANGING JCE PROVIDER AND ALGORITHM 211
4) CHANGING THE SIGNATURE MESASGE HEADER 211
5) CHANGING THE BUFFERSIZE 212
6) SUPPLYING KEYS DYNAMICALLY. 212
. . . . . . . . . . . 28.
CHAPTER . . . .CXF
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
...............
CXF COMPONENT 214
CAMEL ON EAP DEPLOYMENT 214
URI FORMAT 214
OPTIONS 215
THE DESCRIPTIONS OF THE DATAFORMATS 220
5
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
. . . . . . . . . . . 29.
CHAPTER . . . .CXF
. . . . BEAN
. . . . . . .COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240
...............
CXF BEAN COMPONENT (2.0 OR LATER) 240
URI FORMAT 240
OPTIONS 240
HEADERS 241
A WORKING SAMPLE 243
. . . . . . . . . . . 30.
CHAPTER . . . .CXFRS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .244
...............
CXFRS COMPONENT 244
URI FORMAT 244
OPTIONS 244
HOW TO CONFIGURE THE REST ENDPOINT IN APACHE CAMEL 251
HOW TO OVERRIDE THE CXF PRODUCER ADDRESS FROM MESSAGE HEADER 252
CONSUMING A REST REQUEST - SIMPLE BINDING STYLE 252
ENABLING THE SIMPLE BINDING STYLE 253
EXAMPLES OF REQUEST BINDING WITH DIFFERENT METHOD SIGNATURES 253
MORE EXAMPLES OF THE SIMPLE BINDING STYLE 253
CONSUMING A REST REQUEST - DEFAULT BINDING STYLE 254
HOW TO INVOKE THE REST SERVICE THROUGH CAMEL-CXFRS PRODUCER ? 256
.CHAPTER
. . . . . . . . . . 31.
. . . DATAFORMAT
. . . . . . . . . . . . . . . .COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
...............
DATA FORMAT COMPONENT 259
URI FORMAT 259
SAMPLES 259
.CHAPTER
. . . . . . . . . . 32.
. . . .DATASET
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260
...............
DATASET COMPONENT 260
URI FORMAT 260
OPTIONS 260
CONFIGURING DATASET 261
EXAMPLE 261
PROPERTIES ON SIMPLEDATASET 261
6
Table of Contents
.CHAPTER
. . . . . . . . . . 33.
. . . .DIRECT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
...............
DIRECT COMPONENT 263
URI FORMAT 263
OPTIONS 263
SAMPLES 263
.CHAPTER
. . . . . . . . . . 34.
. . . .DIRECT-VM
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
...............
DIRECT VM COMPONENT 265
URI FORMAT 265
OPTIONS 265
SAMPLES 266
. . . . . . . . . . . 35.
CHAPTER . . . .DISRUPTOR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
...............
DISRUPTOR COMPONENT 267
URI FORMAT 268
OPTIONS 268
WAIT STRATEGIES 270
USE OF REQUEST REPLY 271
CONCURRENT CONSUMERS 271
THREAD POOLS 271
SAMPLE 272
USING MULTIPLECONSUMERS 272
EXTRACTING DISRUPTOR INFORMATION 273
. . . . . . . . . . . 36.
CHAPTER . . . .DNS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
...............
DNS 274
URI FORMAT 274
OPTIONS 274
HEADERS 274
EXAMPLES 275
IP LOOKUP 275
DNS LOOKUP 275
DNS DIG 276
.CHAPTER
. . . . . . . . . . 37.
. . . .DOCKER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
...............
DOCKER COMPONENT 277
URI FORMAT 277
HEADER STRATEGY 277
GENERAL OPTIONS 277
CONSUMER OPERATIONS 278
PRODUCER OPERATIONS 278
EXAMPLES 281
. . . . . . . . . . . 38.
CHAPTER . . . .DOZER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .282
...............
DOZER COMPONENT 282
CAMEL ON EAP DEPLOYMENT 282
URI FORMAT 282
OPTIONS 282
USING DATA FORMATS WITH DOZER 283
CONFIGURING DOZER 284
MAPPING EXTENSIONS 284
VARIABLE MAPPINGS 284
CUSTOM MAPPINGS 285
EXPRESSION MAPPINGS 286
7
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
. . . . . . . . . . . 39.
CHAPTER . . . .DROPBOX
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
...............
CAMEL DROPBOX COMPONENT 287
URI FORMAT 287
OPERATION 287
OPTIONS 287
DEL OPERATION 288
SAMPLES 288
RESULT MESSAGE HEADERS 288
RESULT MESSAGE BODY 288
GET (DOWNLOAD) OPERATION 289
SAMPLES 289
RESULT MESSAGE HEADERS 289
RESULT MESSAGE BODY 289
MOVE OPERATION 290
SAMPLES 290
RESULT MESSAGE HEADERS 290
RESULT MESSAGE BODY 290
PUT (UPLOAD) OPERATION 291
SAMPLES 291
RESULT MESSAGE HEADERS 291
RESULT MESSAGE BODY 291
SEARCH OPERATION 292
SAMPLES 292
RESULT MESSAGE HEADERS 292
RESULT MESSAGE BODY 292
. . . . . . . . . . . 40.
CHAPTER . . . .EJB
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .294
...............
EJB COMPONENT 294
CAMEL ON EAP DEPLOYMENT 294
.CHAPTER
. . . . . . . . . . 41.
. . . ELASTICSEARCH
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
...............
ELASTICSEARCH COMPONENT 295
URI FORMAT 295
ENDPOINT OPTIONS 295
MESSAGE OPERATIONS 295
INDEX EXAMPLE 296
JAVA EXAMPLE 296
FOR MORE INFORMATION, SEE THESE RESOURCES 297
.CHAPTER
. . . . . . . . . . 42.
. . . .EVENTADMIN
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .298
...............
EVENTADMIN COMPONENT 298
DEPENDENCIES 298
URI FORMAT 298
URI OPTIONS 298
MESSAGE HEADERS 298
MESSAGE BODY 298
EXAMPLE USAGE 298
.CHAPTER
. . . . . . . . . . 43.
. . . .EXEC
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .300
...............
EXEC COMPONENT 300
DEPENDENCIES 300
URI FORMAT 300
8
Table of Contents
. . . . . . . . . . . 44.
CHAPTER . . . .FABRIC
. . . . . . . . COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305
...............
DEPENDENCIES 305
URI FORMAT 305
URI OPTIONS 305
USE CASES FOR FABRIC ENDPOINTS 306
LOCATION DISCOVERY 306
LOAD-BALANCING CLUSTER 306
AUTO-RECONNECT FEATURE 307
PUBLISHING AN ENDPOINT URI 307
LOOKING UP AN ENDPOINT URI 308
LOAD-BALANCING EXAMPLE 309
OSGI BUNDLE PLUG-IN CONFIGURATION 310
.CHAPTER
. . . . . . . . . . 45.
. . . .FACEBOOK
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .312
..............
FACEBOOK COMPONENT 312
URI FORMAT 312
FACEBOOKCOMPONENT 312
PRODUCER ENDPOINTS: 314
CONSUMER ENDPOINTS: 326
READING OPTIONS 329
MESSAGE HEADER 330
MESSAGE BODY 330
USE CASES 330
. . . . . . . . . . . 46.
CHAPTER . . . .FILE2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
...............
FILE COMPONENT - APACHE CAMEL 2.0 ONWARDS 332
URI FORMAT 332
CAMEL ON EAP DEPLOYMENT 332
URI OPTIONS 332
CONSUMER ONLY 334
DEFAULT BEHAVIOR FOR FILE CONSUMER 339
PRODUCER ONLY 339
DEFAULT BEHAVIOR FOR FILE PRODUCER 342
MOVE AND DELETE OPERATIONS 342
FINE GRAINED CONTROL OVER MOVE AND PREMOVE OPTION 343
ABOUT MOVEFAILED 343
MESSAGE HEADERS 344
FILE PRODUCER ONLY 344
FILE CONSUMER ONLY 344
BATCH CONSUMER 345
EXCHANGE PROPERTIES, FILE CONSUMER ONLY 345
COMMON GOTCHAS WITH FOLDER AND FILENAMES 345
FILENAME EXPRESSION 346
CONSUMING FILES FROM FOLDERS WHERE OTHERS DROP FILES DIRECTLY 346
USING DONE FILES 346
WRITING DONE FILES 347
9
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.CHAPTER
. . . . . . . . . . 47.
. . . .FLATPACK
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
...............
FLATPACK COMPONENT 358
URI FORMAT 358
URI OPTIONS 358
EXAMPLES 359
MESSAGE HEADERS 359
MESSAGE BODY 359
HEADER AND TRAILER RECORDS 359
USING THE ENDPOINT 360
. . . . . . . . . . . 48.
CHAPTER . . . .FOP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .361
..............
FOP COMPONENT 361
URI FORMAT 361
OUTPUT FORMATS 361
ENDPOINT OPTIONS 362
MESSAGE OPERATIONS 362
EXAMPLE 363
.CHAPTER
. . . . . . . . . . 49.
. . . .FREEMARKER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .364
...............
FREEMARKER 364
URI FORMAT 364
OPTIONS 364
FREEMARKER CONTEXT 364
HOT RELOADING 365
DYNAMIC TEMPLATES 365
SAMPLES 366
THE EMAIL SAMPLE 366
.CHAPTER
. . . . . . . . . . 50.
. . . .FTP2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .368
...............
FTP/SFTP COMPONENT 368
CAMEL ON EAP DEPLOYMENT 368
URI FORMAT 368
URI OPTIONS 368
10
Table of Contents
. . . . . . . . . . . 51.
CHAPTER . . . GAE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .386
...............
51.1. INTRODUCTION TO THE GAE COMPONENTS 386
51.2. GAUTH 389
51.3. GHTTP 397
51.4. GLOGIN 401
51.5. GMAIL 404
51.6. GSEC 407
51.7. GTASK 408
. . . . . . . . . . . 52.
CHAPTER . . . .GEOCODER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
...............
GEOCODER COMPONENT 412
URI FORMAT 412
OPTIONS 412
EXCHANGE DATA FORMAT 412
MESSAGE HEADERS 413
SAMPLES 413
.CHAPTER
. . . . . . . . . . 53.
. . . .GITHUB
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
...............
GITHUB COMPONENT 415
URI FORMAT 415
MANDATORY OPTIONS: 415
CONSUMER ENDPOINTS: 416
PRODUCER ENDPOINTS: 416
URI OPTIONS 416
. . . . . . . . . . . 54.
CHAPTER . . . .GOOGLECALENDAR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
...............
GOOGLECALENDAR COMPONENT 418
COMPONENT DESCRIPTION 418
URI FORMAT 418
GOOGLECALENDARCOMPONENT 418
PRODUCER ENDPOINTS 419
1. ENDPOINT PREFIX ACL 419
URI OPTIONS FOR ACL 420
11
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.CHAPTER
. . . . . . . . . . 55.
. . . .GOOGLEDRIVE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .426
...............
GOOGLEDRIVE COMPONENT 426
URI FORMAT 426
GOOGLEDRIVECOMPONENT 427
PRODUCER ENDPOINTS 427
1. ENDPOINT PREFIX DRIVE-ABOUT 428
URI OPTIONS FOR DRIVE-ABOUT 428
2. ENDPOINT PREFIX DRIVE-APPS 428
URI OPTIONS FOR DRIVE-APPS 428
3. ENDPOINT PREFIX DRIVE-CHANGES 428
URI OPTIONS FOR DRIVE-CHANGES 429
4. ENDPOINT PREFIX DRIVE-CHANNELS 429
URI OPTIONS FOR DRIVE-CHANNELS 429
5. ENDPOINT PREFIX DRIVE-CHILDREN 429
URI OPTIONS FOR DRIVE-CHILDREN 430
6. ENDPOINT PREFIX DRIVE-COMMENTS 430
URI OPTIONS FOR DRIVE-COMMENTS 431
7. ENDPOINT PREFIX DRIVE-FILES 431
URI OPTIONS FOR DRIVE-FILES 432
8. ENDPOINT PREFIX DRIVE-PARENTS 432
URI OPTIONS FOR DRIVE-PARENTS 433
9. ENDPOINT PREFIX DRIVE-PERMISSIONS 433
URI OPTIONS FOR DRIVE-PERMISSIONS 434
10. ENDPOINT PREFIX DRIVE-PROPERTIES 434
URI OPTIONS FOR DRIVE-PROPERTIES 435
11. ENDPOINT PREFIX DRIVE-REALTIME 435
URI OPTIONS FOR DRIVE-REALTIME 435
12. ENDPOINT PREFIX DRIVE-REPLIES 436
URI OPTIONS FOR DRIVE-REPLIES 436
13. ENDPOINT PREFIX DRIVE-REVISIONS 437
URI OPTIONS FOR DRIVE-REVISIONS 437
CONSUMER ENDPOINTS 437
MESSAGE HEADERS 438
MESSAGE BODY 438
12
Table of Contents
.CHAPTER
. . . . . . . . . . 56.
. . . .GOOGLEMAIL
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .439
...............
GOOGLEMAIL COMPONENT 439
COMPONENT DESCRIPTION 439
URI FORMAT 439
GOOGLEMAILCOMPONENT 439
PRODUCER ENDPOINTS 440
1. ENDPOINT PREFIX ATTACHMENTS 440
URI OPTIONS FOR ATTACHMENTS 441
2. ENDPOINT PREFIX DRAFTS 441
URI OPTIONS FOR DRAFTS 442
3. ENDPOINT PREFIX HISTORY 442
URI OPTIONS FOR HISTORY 442
4. ENDPOINT PREFIX LABELS 442
URI OPTIONS FOR LABELS 443
5. ENDPOINT PREFIX MESSAGES 443
URI OPTIONS FOR MESSAGES 444
6. ENDPOINT PREFIX THREADS 444
URI OPTIONS FOR THREADS 445
7. ENDPOINT PREFIX USERS 445
URI OPTIONS FOR USERS 445
CONSUMER ENDPOINTS 446
MESSAGE HEADERS 446
MESSAGE BODY 446
.CHAPTER
. . . . . . . . . . 57.
. . . .GUAVA
. . . . . . . .EVENTBUS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .447
...............
GUAVA EVENTBUS COMPONENT 447
URI FORMAT 447
OPTIONS 447
USAGE 448
DEADEVENT CONSIDERATIONS 448
CONSUMING MULTIPLE TYPE OF EVENTS 449
.CHAPTER
. . . . . . . . . . 58.
. . . .HAWTDB
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .450
...............
HAWTDB 450
USING HAWTDBAGGREGATIONREPOSITORY 450
WHAT IS PRESERVED WHEN PERSISTING 452
RECOVERY 452
USING HAWTDBAGGREGATIONREPOSITORY IN JAVA DSL 453
USING HAWTDBAGGREGATIONREPOSITORY IN SPRING XML 453
DEPENDENCIES 454
.CHAPTER
. . . . . . . . . . 59.
. . . .HAZELCAST
. . . . . . . . . . . . . COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .455
...............
HAZELCAST COMPONENT 455
URI FORMAT 455
OPTIONS 455
SECTIONS 456
USAGE OF MAP 456
MAP CACHE PRODUCER - TO("HAZELCAST:MAP:FOO") 456
SAMPLE FOR PUT: 457
SAMPLE FOR GET: 457
SAMPLE FOR UPDATE: 458
SAMPLE FOR DELETE: 458
SAMPLE FOR QUERY 459
MAP CACHE CONSUMER - FROM("HAZELCAST:MAP:FOO") 459
13
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
14
Table of Contents
.CHAPTER
. . . . . . . . . . 60.
. . . .HBASE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .482
...............
HBASE COMPONENT 482
APACHE HBASE OVERVIEW 482
CAMEL AND HBASE 482
CONFIGURING THE COMPONENT 482
HBASE PRODUCER 483
SUPPORTED URI OPTIONS ON PRODUCER 483
PUT OPERATIONS. 484
GET OPERATIONS. 485
DELETE OPERATIONS. 486
SCAN OPERATIONS. 486
HBASE CONSUMER 487
SUPPORTED URI OPTIONS ON CONSUMER 488
HBASE IDEMPOTENT REPOSITORY 489
HBASE MAPPING 489
HBASE HEADER MAPPING EXAMPLES 490
BODY MAPPING EXAMPLES 491
SEE ALSO 491
.CHAPTER
. . . . . . . . . . 61.
. . . HDFS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .492
...............
HDFS COMPONENT 492
URI FORMAT 492
OPTIONS 492
KEYTYPE AND VALUETYPE 494
SPLITTING STRATEGY 494
MESSAGE HEADERS 495
CONTROLLING TO CLOSE FILE STREAM 495
USING THIS COMPONENT IN OSGI 495
.CHAPTER
. . . . . . . . . . 62.
. . . .HDFS2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
...............
HDFS2 COMPONENT 497
URI FORMAT 497
OPTIONS 497
KEYTYPE AND VALUETYPE 499
SPLITTING STRATEGY 499
MESSAGE HEADERS 500
PRODUCER ONLY 500
CONTROLLING TO CLOSE FILE STREAM 500
USING THIS COMPONENT IN OSGI 500
USING THIS COMPONENT WITH MANUALLY DEFINED ROUTES 501
USING THIS COMPONENT WITH BLUEPRINT CONTAINER 501
.CHAPTER
. . . . . . . . . . 63.
. . . .HIPCHAT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .502
...............
HIPCHAT COMPONENT 502
URI FORMAT 502
URI OPTIONS 502
SCHEDULED POLL CONSUMER 503
MESSAGE HEADERS SET BY THE HIPCHAT CONSUMER 503
HIPCHAT PRODUCER 504
MESSAGE HEADERS EVALUATED BY THE HIPCHAT PRODUCER 504
MESSAGE HEADERS SET BY THE HIPCHAT PRODUCER 505
DEPENDENCIES 505
. . . . . . . . . . . 64.
CHAPTER . . . .HL7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
...............
15
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.CHAPTER
. . . . . . . . . . 65.
. . . .HTTP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .517
..............
HTTP COMPONENT 517
URI FORMAT 517
EXAMPLES 517
HTTPENDPOINT OPTIONS 518
AUTHENTICATION AND PROXY 520
HTTPCOMPONENT OPTIONS 521
MESSAGE HEADERS 522
MESSAGE BODY 523
RESPONSE CODE 523
HTTPOPERATIONFAILEDEXCEPTION 523
CALLING USING GET OR POST 523
HOW TO GET ACCESS TO HTTPSERVLETREQUEST AND HTTPSERVLETRESPONSE 524
USING CLIENT TIMEOUT - SO_TIMEOUT 524
CONFIGURING A PROXY 524
USING PROXY SETTINGS OUTSIDE OF URI 524
CONFIGURING CHARSET 524
SAMPLE WITH SCHEDULED POLL 525
GETTING THE RESPONSE CODE 525
USING THROWEXCEPTIONONFAILURE=FALSE TO GET ANY RESPONSE BACK 525
DISABLING COOKIES 526
ADVANCED USAGE 526
SETTING MAXCONNECTIONSPERHOST 526
USING PREEMPTIVE AUTHENTICATION 526
ACCEPTING SELF SIGNED CERTIFICATES FROM REMOTE SERVER 527
USING THE JSSE CONFIGURATION UTILITY 527
CONFIGURING APACHE HTTP CLIENT DIRECTLY 527
.CHAPTER
. . . . . . . . . . 66.
. . . .HTTP4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
...............
HTTP4 COMPONENT 529
CAMEL ON EAP DEPLOYMENT 529
URI FORMAT 529
HTTPCOMPONENT OPTIONS 529
HTTPENDPOINT OPTIONS 531
SETTING BASIC AUTHENTICATION AND PROXY 535
MESSAGE HEADERS 536
16
Table of Contents
.CHAPTER
. . . . . . . . . . 67.
. . . .IBATIS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .544
...............
IBATIS 544
URI FORMAT 544
OPTIONS 544
MESSAGE HEADERS 546
MESSAGE BODY 546
SAMPLES 547
USING STATEMENTTYPE FOR BETTER CONTROL OF IBATIS 547
SCHEDULED POLLING EXAMPLE 548
USING ONCONSUME 548
.CHAPTER
. . . . . . . . . . 68.
. . . .IRC
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .549
...............
IRC COMPONENT 549
URI FORMAT 549
OPTIONS 549
USING THE JSSE CONFIGURATION UTILITY 551
PROGRAMMATIC CONFIGURATION OF THE ENDPOINT 551
SPRING DSL BASED CONFIGURATION OF ENDPOINT 551
USING THE LEGACY BASIC CONFIGURATION OPTIONS 552
USING KEYS 552
. . . . . . . . . . . 69.
CHAPTER . . . .JASYPT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
...............
JASYPT COMPONENT 553
CAMEL ON EAP DEPLOYMENT 553
TOOLING 553
TOOLING DEPENDENCIES FOR CAMEL 2.5 AND 2.6 554
TOOLING DEPENDENCIES FOR CAMEL 2.7 OR BETTER 554
URI OPTIONS 554
17
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.CHAPTER
. . . . . . . . . . 70.
. . . .JAXB
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .558
...............
JAXB COMPONENT 558
CAMEL ON EAP DEPLOYMENT 558
.CHAPTER
. . . . . . . . . . 71.
. . . JCLOUDS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
...............
JCLOUDS COMPONENT 559
CONFIGURING THE COMPONENT 559
URI FORMAT 560
BLOBSTORE URI OPTIONS 560
MESSAGE HEADERS FOR BLOBSTORE 561
BLOBSTORE USAGE SAMPLES 561
EXAMPLE 1: PUTTING TO THE BLOB 561
EXAMPLE 2: GETTING/READING FROM A BLOB 561
EXAMPLE 3: CONSUMING A BLOB 562
COMPUTE SERVICE URI OPTIONS 562
COMPUTE USAGE SAMPLES 563
EXAMPLE 1: LISTING THE AVAILABLE IMAGES. 563
EXAMPLE 2: CREATE A NEW NODE. 563
EXAMPLE 3: RUN A SHELL SCRIPT ON RUNNING NODE. 564
SEE ALSO 564
.CHAPTER
. . . . . . . . . . 72.
. . . .JCR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
...............
JCR COMPONENT 565
URI FORMAT 565
USAGE 565
PRODUCER 565
CONSUMER 566
EXAMPLE 567
. . . . . . . . . . . 73.
CHAPTER . . . .JDBC
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .568
...............
JDBC COMPONENT 568
URI FORMAT 568
OPTIONS 568
RESULT 570
MESSAGE HEADERS 571
GENERATED KEYS 571
USING NAMED PARAMETERS 571
SAMPLES 572
SAMPLE - POLLING THE DATABASE EVERY MINUTE 573
SAMPLE - MOVE DATA BETWEEN DATA SOURCES 573
SEE ALSO 573
.CHAPTER
. . . . . . . . . . 74.
. . . .JETTY
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
...............
JETTY COMPONENT 575
URI FORMAT 575
OPTIONS 575
MESSAGE HEADERS 580
USAGE 580
COMPONENT OPTIONS 580
18
Table of Contents
.CHAPTER
. . . . . . . . . . 75.
. . . .JGROUPS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
...............
JGROUPS COMPONENT 593
CAMEL ON EAP DEPLOYMENT 593
URI FORMAT 593
OPTIONS 593
USAGE 593
.CHAPTER
. . . . . . . . . . 76.
. . . .JING
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
...............
JING COMPONENT 595
URI FORMAT 595
OPTIONS 595
EXAMPLE 595
. . . . . . . . . . . 77.
CHAPTER . . . .JIRA
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
...............
JIRA COMPONENT 597
URI FORMAT 597
MANDATORY OPTIONS: 597
CONSUMER ENDPOINTS: 597
PRODUCER ENDPOINTS: 598
URI OPTIONS: 598
JQL: 598
.CHAPTER
. . . . . . . . . . 78.
. . . .JMS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .600
...............
JMS COMPONENT 600
CAMEL ON EAP DEPLOYMENT 600
URI FORMAT 600
USING ACTIVEMQ 601
TRANSACTIONS AND CACHE LEVELS 601
DURABLE SUBSCRIPTIONS 601
MESSAGE HEADER MAPPING 601
OPTIONS 602
MOST COMMONLY USED OPTIONS 602
ALL THE OTHER OPTIONS 606
MESSAGE MAPPING BETWEEN JMS AND CAMEL 619
DISABLING AUTO-MAPPING OF JMS MESSAGES 619
USING A CUSTOM MESSAGECONVERTER 620
19
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.CHAPTER
. . . . . . . . . . 79.
. . . .JMX
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
...............
JMX COMPONENT 637
CAMEL ON EAP DEPLOYMENT 637
URI FORMAT 637
URI OPTIONS 637
OBJECTNAME CONSTRUCTION 639
DOMAIN WITH NAME PROPERTY 639
DOMAIN WITH HASHTABLE 640
EXAMPLE 640
FULL EXAMPLE 640
MONITOR TYPE CONSUMER 640
EXAMPLE 640
URI OPTIONS FOR MONITOR TYPE 641
.CHAPTER
. . . . . . . . . . 80.
. . . .JPA
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .643
...............
JPA COMPONENT 643
CAMEL ON EAP DEPLOYMENT 643
SENDING TO THE ENDPOINT 643
CONSUMING FROM THE ENDPOINT 643
URI FORMAT 643
OPTIONS 644
MESSAGE HEADERS 647
CONFIGURING ENTITYMANAGERFACTORY 647
20
Table of Contents
.CHAPTER
. . . . . . . . . . 81.
. . . JSCH
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .650
...............
JSCH 650
URI FORMAT 650
OPTIONS 650
COMPONENT OPTIONS 651
LIMITATIONS 651
.CHAPTER
. . . . . . . . . . 82.
. . . .JT400
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
...............
JT/400 COMPONENT 652
URI FORMAT 652
URI OPTIONS 652
USAGE 653
CONNECTION POOL 654
REMOTE PROGRAM CALL (CAMEL 2.7) 654
EXAMPLE 654
REMOTE PROGRAM CALL EXAMPLE (CAMEL 2.7) 654
WRITING TO KEYED DATA QUEUES 655
READING FROM KEYED DATA QUEUES 655
.CHAPTER
. . . . . . . . . . 83.
. . . .KAFKA
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
...............
KAFKA COMPONENT 656
URI FORMAT 656
OPTIONS 656
PRODUCER OPTIONS 657
CONSUMER OPTIONS 658
SAMPLES 658
ENDPOINTS 659
SEE ALSO 659
. . . . . . . . . . . 84.
CHAPTER . . . .KESTREL
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .660
...............
KESTREL COMPONENT 660
URI FORMAT 660
OPTIONS 660
CONFIGURING THE KESTREL COMPONENT USING SPRING XML 661
USAGE EXAMPLES 662
EXAMPLE 1: CONSUMING 662
EXAMPLE 2: PRODUCING 662
EXAMPLE 3: SPRING XML CONFIGURATION 662
DEPENDENCIES 663
SPYMEMCACHED 663
.CHAPTER
. . . . . . . . . . 85.
. . . .KRATI
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .664
...............
KRATI COMPONENT 664
URI FORMAT 664
KRATI URI OPTIONS 664
MESSAGE HEADERS FOR DATASTORE 665
USAGE SAMPLES 665
21
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.CHAPTER
. . . . . . . . . . 86.
. . . .KURA
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .668
...............
KURA COMPONENT 668
KURAROUTER ACTIVATOR 668
DEPLOYING KURAROUTER 668
KURAROUTER UTILITIES 669
SLF4J LOGGER 669
BUNDLECONTEXT 669
CAMELCONTEXT 670
OSGI SERVICE RESOLVER 670
KURAROUTER ACTIVATOR CALLBACKS 670
.CHAPTER
. . . . . . . . . . 87.
. . . .LANGUAGE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
...............
LANGUAGE 672
URI FORMAT 672
URI OPTIONS 672
MESSAGE HEADERS 673
EXAMPLES 673
LOADING SCRIPTS FROM RESOURCES 674
.CHAPTER
. . . . . . . . . . 88.
. . . .LDAP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
...............
LDAP COMPONENT 675
URI FORMAT 675
OPTIONS 675
RESULT 675
DIRCONTEXT 675
SAMPLES 676
BINDING USING CREDENTIALS 677
CONFIGURING SSL 677
. . . . . . . . . . . 89.
CHAPTER . . . .LEVELDB
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
...............
LEVELDB 681
USING LEVELDBAGGREGATIONREPOSITORY 681
WHAT IS PRESERVED WHEN PERSISTING 682
RECOVERY 682
USING LEVELDBAGGREGATIONREPOSITORY IN JAVA DSL 683
USING LEVELDBAGGREGATIONREPOSITORY IN SPRING XML 683
DEPENDENCIES 684
. . . . . . . . . . . 90.
CHAPTER . . . .LINKEDIN
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .685
...............
LINKEDIN COMPONENT 685
URI FORMAT 685
LINKEDINCOMPONENT 685
PRODUCER ENDPOINTS: 686
ENDPOINT PREFIX COMMENTS 687
URI OPTIONS FOR COMMENTS 687
ENDPOINT PREFIX COMPANIES 687
URI OPTIONS FOR COMPANIES 689
ENDPOINT PREFIX GROUPS 690
22
Table of Contents
.CHAPTER
. . . . . . . . . . 91.
. . . LIST
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .701
..............
LIST COMPONENT 701
URI FORMAT 701
SAMPLE 701
.CHAPTER
. . . . . . . . . . 92.
. . . .LOG
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
...............
LOG COMPONENT 702
URI FORMAT 702
OPTIONS 702
FORMATTING 703
REGULAR LOGGER SAMPLE 705
REGULAR LOGGER WITH FORMATTER SAMPLE 705
THROUGHPUT LOGGER WITH GROUPSIZE SAMPLE 705
THROUGHPUT LOGGER WITH GROUPINTERVAL SAMPLE 705
FULL CUSTOMIZATION OF THE LOGGING OUTPUT 706
USING LOG COMPONENT IN OSGI 707
.CHAPTER
. . . . . . . . . . 93.
. . . .LUCENE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
...............
LUCENE (INDEXER AND SEARCH) COMPONENT 708
CAMEL ON EAP DEPLOYMENT 708
URI FORMAT 708
INSERT OPTIONS 708
QUERY OPTIONS 709
MESSAGE HEADERS 709
LUCENE PRODUCERS 709
LUCENE PROCESSOR 710
EXAMPLE 1: CREATING A LUCENE INDEX 710
EXAMPLE 2: LOADING PROPERTIES INTO THE JNDI REGISTRY IN THE CAMEL CONTEXT 710
EXAMPLE 2: PERFORMING SEARCHES USING A QUERY PRODUCER 710
EXAMPLE 3: PERFORMING SEARCHES USING A QUERY PROCESSOR 711
.CHAPTER
. . . . . . . . . . 94.
. . . .MAIL
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .712
..............
MAIL COMPONENT 712
CAMEL ON EAP DEPLOYMENT 712
URI FORMAT 713
SAMPLE ENDPOINTS 713
DEFAULT PORTS 713
OPTIONS 714
SSL SUPPORT 720
USING THE JSSE CONFIGURATION UTILITY 720
23
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
. . . . . . . . . . . 95.
CHAPTER . . . .MASTER
. . . . . . . . . COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
...............
DEPENDENCIES 729
URI FORMAT 729
URI OPTIONS 729
HOW TO USE THE MASTER COMPONENT 729
EXAMPLE OF A MASTER-SLAVE CLUSTER POLLING A JMS ACTIVEMQ BROKER 730
STEPS TO CREATE A CLUSTER THAT POLLS MESSAGES FROM AN ACTIVEMQ BROKER 730
OSGI BUNDLE PLUG-IN CONFIGURATION 733
. . . . . . . . . . . 96.
CHAPTER . . . .METRICS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
...............
METRICS COMPONENT 734
URI FORMAT 734
METRIC REGISTRY 734
USAGE 735
HEADERS 735
METRICS TYPE COUNTER 735
OPTIONS 735
HEADERS 736
METRIC TYPE HISTOGRAM 736
OPTIONS 736
HEADERS 737
METRIC TYPE METER 737
OPTIONS 737
HEADERS 738
METRICS TYPE TIMER 738
OPTIONS 738
HEADERS 738
METRICSROUTEPOLICYFACTORY 739
. . . . . . . . . . . 97.
CHAPTER . . . .MINA2
. . . . . . .-. DEPRECATED
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .741
..............
MINA 2 COMPONENT 741
CAMEL ON EAP DEPLOYMENT 741
URI FORMAT 741
OPTIONS 742
USING A CUSTOM CODEC 745
SAMPLE WITH SYNC=FALSE 745
SAMPLE WITH SYNC=TRUE 745
SAMPLE WITH SPRING DSL 746
CLOSING SESSION WHEN COMPLETE 746
24
Table of Contents
. . . . . . . . . . . 98.
CHAPTER . . . .MOCK
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748
...............
MOCK COMPONENT 748
URI FORMAT 748
OPTIONS 749
SIMPLE EXAMPLE 749
USING ASSERTPERIOD 749
SETTING EXPECTATIONS 750
ADDING EXPECTATIONS TO SPECIFIC MESSAGES 750
MOCKING EXISTING ENDPOINTS 751
MOCKING EXISTING ENDPOINTS USING THE CAMEL-TEST COMPONENT 753
MOCKING EXISTING ENDPOINTS WITH XML DSL 754
MOCKING ENDPOINTS AND SKIP SENDING TO ORIGINAL ENDPOINT 754
LIMITING THE NUMBER OF MESSAGES TO KEEP 756
TESTING WITH ARRIVAL TIMES 756
. . . . . . . . . . . 99.
CHAPTER . . . .MONGODB
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758
...............
CAMEL MONGODB COMPONENT 758
URI FORMAT 758
ENDPOINT OPTIONS 758
CONFIGURATION OF DATABASE IN SPRING XML 765
SAMPLE ROUTE 765
MONGODB OPERATIONS - PRODUCER ENDPOINTS 765
QUERY OPERATIONS 765
FINDBYID 766
FINDONEBYQUERY 766
FINDALL 766
COUNT 769
SPECIFYING A FIELDS FILTER 769
CREATE/UPDATE OPERATIONS 770
INSERT 770
SAVE 770
UPDATE 771
DELETE OPERATIONS 772
REMOVE 772
OTHER OPERATIONS 772
AGGREGATE 772
GETDBSTATS 772
GETCOLSTATS 773
COMMAND 773
DYNAMIC OPERATIONS 774
TAILABLE CURSOR CONSUMER 774
HOW THE TAILABLE CURSOR CONSUMER WORKS 774
PERSISTENT TAIL TRACKING 775
ENABLING PERSISTENT TAIL TRACKING 775
TYPE CONVERSIONS 776
SEE ALSO 777
. . . . . . . . . . . 100.
CHAPTER . . . . .MQTT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
...............
MQTT COMPONENT 778
CAMEL ON EAP DEPLOYMENT 778
URI FORMAT 778
25
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
OPTIONS 778
SAMPLES 780
. . . . . . . . . . . 101.
CHAPTER . . . . MSV
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .781
..............
MSV COMPONENT 781
URI FORMAT 781
OPTIONS 781
EXAMPLE 781
. . . . . . . . . . . 102.
CHAPTER . . . . .MUSTACHE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783
...............
MUSTACHE 783
URI FORMAT 783
OPTIONS 783
MUSTACHE CONTEXT 783
DYNAMIC TEMPLATES 784
SAMPLES 784
THE EMAIL SAMPLE 785
.CHAPTER
. . . . . . . . . . 103.
. . . . .MVEL
. . . . . . COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786
...............
MVEL COMPONENT 786
CAMEL ON EAP DEPLOYMENT 786
URI FORMAT 786
OPTIONS 786
MESSAGE HEADERS 786
MVEL CONTEXT 787
HOT RELOADING 787
DYNAMIC TEMPLATES 787
SAMPLES 788
. . . . . . . . . . . 104.
CHAPTER . . . . .MYBATIS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789
...............
MYBATIS 789
URI FORMAT 789
OPTIONS 789
MESSAGE HEADERS 791
MESSAGE BODY 791
SAMPLES 792
USING STATEMENTTYPE FOR BETTER CONTROL OF MYBATIS 792
USING INSERTLIST STATEMENTTYPE 793
USING UPDATELIST STATEMENTTYPE 793
USING DELETELIST STATEMENTTYPE 794
NOTICE ON INSERTLIST, UPDATELIST AND DELETELIST STATEMENTTYPES 794
SCHEDULED POLLING EXAMPLE 794
USING ONCONSUME 795
PARTICIPATING IN TRANSACTIONS 795
. . . . . . . . . . . 105.
CHAPTER . . . . .NAGIOS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797
...............
NAGIOS 797
URI FORMAT 797
OPTIONS 797
HEADERS 798
SENDING MESSAGE EXAMPLES 798
USING NAGIOSEVENTNOTIFER 798
. . . . . . . . . . . 106.
CHAPTER . . . . .NETTY
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .800
...............
NETTY COMPONENT 800
26
Table of Contents
. . . . . . . . . . . 107.
CHAPTER . . . . .NETTY4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .817
..............
NETTY4 COMPONENT 817
CAMEL ON EAP DEPLOYMENT 817
URI FORMAT 817
OPTIONS 817
REGISTRY BASED OPTIONS 823
USING NON SHAREABLE ENCODERS OR DECODERS 824
SENDING MESSAGES TO/FROM A NETTY ENDPOINT 824
NETTY PRODUCER 824
NETTY CONSUMER 824
USAGE SAMPLES 824
A UDP NETTY ENDPOINT USING REQUEST-REPLY AND SERIALIZED OBJECT PAYLOAD 824
A TCP BASED NETTY CONSUMER ENDPOINT USING ONE-WAY COMMUNICATION 825
AN SSL/TCP BASED NETTY CONSUMER ENDPOINT USING REQUEST-REPLY COMMUNICATION 825
USING THE JSSE CONFIGURATION UTILITY 825
PROGRAMMATIC CONFIGURATION OF THE COMPONENT 825
SPRING DSL BASED CONFIGURATION OF ENDPOINT 825
USING BASIC SSL/TLS CONFIGURATION ON THE JETTY COMPONENT 826
GETTING ACCESS TO SSLSESSION AND THE CLIENT CERTIFICATE 826
USING MULTIPLE CODECS 827
CLOSING CHANNEL WHEN COMPLETE 829
ADDING CUSTOM CHANNEL PIPELINE FACTORIES TO GAIN COMPLETE CONTROL OVER A CREATED
PIPELINE 829
REUSING NETTY BOSS AND WORKER THREAD POOLS 830
. . . . . . . . . . . 108.
CHAPTER . . . . .NETTY
. . . . . . . HTTP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .832
...............
NETTY HTTP COMPONENT 832
URI FORMAT 832
HTTP OPTIONS 833
MESSAGE HEADERS 837
ACCESS TO NETTY TYPES 839
27
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
EXAMPLES 839
HOW DO I LET NETTY MATCH WILDCARDS 840
USING MULTIPLE ROUTES WITH SAME PORT 840
REUSING SAME SERVER BOOTSTRAP CONFIGURATION WITH MULTIPLE ROUTES 841
REUSING SAME SERVER BOOTSTRAP CONFIGURATION WITH MULTIPLE ROUTES ACROSS MULTIPLE
BUNDLES IN OSGI CONTAINER 841
USING HTTP BASIC AUTHENTICATION 842
SPECIFYING ACL ON WEB RESOURCES 842
. . . . . . . . . . . 109.
CHAPTER . . . . .NETTY4-HTTP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .844
...............
NETTY4 HTTP COMPONENT 844
URI FORMAT 844
HTTP OPTIONS 845
MESSAGE HEADERS 848
ACCESS TO NETTY TYPES 850
EXAMPLES 850
HOW DO I LET NETTY MATCH WILDCARDS 850
USING MULTIPLE ROUTES WITH SAME PORT 851
REUSING SAME SERVER BOOTSTRAP CONFIGURATION WITH MULTIPLE ROUTES 852
REUSING SAME SERVER BOOTSTRAP CONFIGURATION WITH MULTIPLE ROUTES ACROSS MULTIPLE
BUNDLES IN OSGI CONTAINER 852
USING HTTP BASIC AUTHENTICATION 852
SPECIFYING ACL ON WEB RESOURCES 853
.CHAPTER
. . . . . . . . . . 110.
. . . . OLINGO2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .854
...............
OLINGO2 COMPONENT 854
URI FORMAT 854
OLINGO2COMPONENT 854
PRODUCER ENDPOINTS 855
ODATA RESOURCE TYPE MAPPING 856
URI OPTIONS 858
CONSUMER ENDPOINTS 858
MESSAGE HEADERS 858
MESSAGE BODY 859
USE CASES 859
.CHAPTER
. . . . . . . . . . 111.
. . . .OPENSHIFT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .860
...............
OPENSHIFT COMPONENT 860
URI FORMAT 860
OPTIONS 860
EXAMPLES 861
LISTING ALL APPLICATIONS 861
STOPPING AN APPLICATION 861
. . . . . . . . . . . 112.
CHAPTER . . . . PAX-LOGGING
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .863
...............
PAXLOGGING COMPONENT 863
DEPENDENCIES 863
URI FORMAT 863
URI OPTIONS 863
MESSAGE HEADERS 863
MESSAGE BODY 863
EXAMPLE USAGE 863
. . . . . . . . . . . 113.
CHAPTER . . . . PGEVENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .865
...............
PGEVENT COMPONENT 865
28
Table of Contents
.CHAPTER
. . . . . . . . . . 114.
. . . . PRINTER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867
...............
PRINTER COMPONENT 867
URI FORMAT 867
OPTIONS 867
PRINTER PRODUCER 868
EXAMPLE 1: PRINTING TEXT BASED PAYLOADS ON A DEFAULT PRINTER USING LETTER STATIONARY AND
ONE-SIDED MODE 868
EXAMPLE 2: PRINTING GIF BASED PAYLOADS ON A REMOTE PRINTER USING A4 STATIONARY AND ONE-
SIDED MODE 869
EXAMPLE 3: PRINTING JPEG BASED PAYLOADS ON A REMOTE PRINTER USING JAPANESE POSTCARD
STATIONARY AND ONE-SIDED MODE 869
. . . . . . . . . . . 115.
CHAPTER . . . . PROPERTIES
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 870
...............
PROPERTIES COMPONENT 870
URI FORMAT 870
OPTIONS 870
SEE ALSO 871
.CHAPTER
. . . . . . . . . . 116.
. . . . QUARTZ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872
...............
QUARTZ COMPONENT 872
URI FORMAT 872
OPTIONS 872
CONFIGURING QUARTZ.PROPERTIES FILE 874
ENABLING QUARTZ SCHEDULER IN JMX 874
STARTING THE QUARTZ SCHEDULER 874
CLUSTERING 875
MESSAGE HEADERS 875
USING CRON TRIGGERS 875
SPECIFYING TIME ZONE 875
.CHAPTER
. . . . . . . . . . 117.
. . . . QUARTZ2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877
...............
QUARTZ2 COMPONENT 877
CAMEL ON EAP DEPLOYMENT 877
URI FORMAT 877
OPTIONS 877
CONFIGURING QUARTZ.PROPERTIES FILE 879
ENABLING QUARTZ SCHEDULER IN JMX 880
STARTING THE QUARTZ SCHEDULER 880
CLUSTERING 880
MESSAGE HEADERS 881
USING CRON TRIGGERS 881
SPECIFYING TIME ZONE 881
USING QUARTZSCHEDULEDPOLLCONSUMERSCHEDULER 881
. . . . . . . . . . . 118.
CHAPTER . . . . QUICKFIX
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .883
...............
QUICKFIX/J COMPONENT 883
URI FORMAT 883
ENDPOINTS 883
EXCHANGE FORMAT 884
QUICKFIX/J CONFIGURATION EXTENSIONS 884
COMMUNICATION CONNECTORS 884
LOGGING 885
29
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
. . . . . . . . . . . 119.
CHAPTER . . . . RABBITMQ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .893
...............
RABBITMQ COMPONENT 893
URI FORMAT 893
OPTIONS 893
CUSTOM CONNECTION FACTORY 896
HEADERS 897
MESSAGE BODY 898
SAMPLES 898
. . . . . . . . . . . 120.
CHAPTER . . . . .REF
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .899
...............
REF COMPONENT 899
URI FORMAT 899
RUNTIME LOOKUP 899
SAMPLE 899
.CHAPTER
. . . . . . . . . . 121.
. . . . REST
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
...............
REST COMPONENT 901
URI FORMAT 901
URI OPTIONS 901
PATH AND URITEMPLATE SYNTAX 901
MORE EXAMPLES 902
.CHAPTER
. . . . . . . . . . 122.
. . . . .RESTLET
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .903
...............
RESTLET COMPONENT 903
URI FORMAT 903
OPTIONS 903
COMPONENT OPTIONS 905
MESSAGE HEADERS 907
MESSAGE BODY 909
RESTLET ENDPOINT WITH AUTHENTICATION 909
SINGLE RESTLET ENDPOINT TO SERVICE MULTIPLE METHODS AND URI TEMPLATES (2.0 OR LATER) 910
USING RESTLET API TO POPULATE RESPONSE 911
CONFIGURING MAX THREADS ON COMPONENT 911
USING THE RESTLET SERVLET WITHIN A WEBAPP 911
30
Table of Contents
. . . . . . . . . . . 123.
CHAPTER . . . . .RMI
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
...............
RMI COMPONENT 914
URI FORMAT 914
OPTIONS 914
USING 914
.CHAPTER
. . . . . . . . . . 124.
. . . . .ROUTEBOX
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
...............
ROUTEBOX COMPONENT 916
THE NEED FOR A CAMEL ROUTEBOX ENDPOINT 916
URI FORMAT 917
OPTIONS 917
SENDING/RECEIVING MESSAGES TO/FROM THE ROUTEBOX 919
STEP 1: LOADING INNER ROUTE DETAILS INTO THE REGISTRY 919
STEP 2: OPTIONALY USING A DISPATCH STRATEGY INSTEAD OF A DISPATCH MAP 920
STEP 2: LAUNCHING A ROUTEBOX CONSUMER 920
STEP 3: USING A ROUTEBOX PRODUCER 921
. . . . . . . . . . . 125.
CHAPTER . . . . .RSS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .922
...............
RSS COMPONENT 922
CAMEL ON EAP DEPLOYMENT 922
URI FORMAT 922
OPTIONS 922
EXCHANGE DATA TYPES 923
MESSAGE HEADERS 924
RSS DATAFORMAT 924
FILTERING ENTRIES 924
SEE ALSO 925
.CHAPTER
. . . . . . . . . . 126.
. . . . .SALESFORCE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .926
...............
SALESFORCE COMPONENT 926
CAMEL ON EAP DEPLOYMENT 926
URI FORMAT 926
SUPPORTED SALESFORCE APIS 926
REST API 926
REST BULK API 927
REST STREAMING API 928
UPLOADING A DOCUMENT TO A CONTENTWORKSPACE 928
CAMEL SALESFORCE MAVEN PLUGIN 929
USAGE 929
.CHAPTER
. . . . . . . . . . 127.
. . . . .SAP
. . . . COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .931
..............
127.1. OVERVIEW 931
127.2. CONFIGURATION 941
127.3. MESSAGE BODY FOR RFC 955
127.4. MESSAGE BODY FOR IDOC 960
127.5. TRANSACTION SUPPORT 968
127.6. XML SERIALIZATION FOR RFC 969
127.7. XML SERIALIZATION FOR IDOC 971
127.8. EXAMPLE 1: READING DATA FROM SAP 973
127.9. EXAMPLE 2: WRITING DATA TO SAP 975
127.10. EXAMPLE 3: HANDLING REQUESTS FROM SAP 976
.CHAPTER
. . . . . . . . . . 128.
. . . . .SAP
. . . . .NETWEAVER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981
...............
SAP NETWEAVER GATEWAY COMPONENT 981
31
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
. . . . . . . . . . . 129.
CHAPTER . . . . .SCHEDULER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .984
...............
SCHEDULER COMPONENT 984
URI FORMAT 984
OPTIONS 984
MORE INFORMATION 987
EXCHANGE PROPERTIES 987
SAMPLE 987
FORCING THE SCHEDULER TO TRIGGER IMMEDIATELY WHEN COMPLETED 987
FORCING THE SCHEDULER TO BE IDLE 987
. . . . . . . . . . . 130.
CHAPTER . . . . .SCHEMATRON
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .989
...............
SCHEMATRON COMPONENT 989
URI FORMAT 989
URI OPTIONS 989
HEADERS 989
URI AND PATH SYNTAX 989
SCHEMATRON RULES AND REPORT SAMPLES 990
.CHAPTER
. . . . . . . . . . 131.
. . . . SEDA
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .992
...............
SEDA COMPONENT 992
URI FORMAT 992
OPTIONS 992
CHOOSING BLOCKINGQUEUE IMPLEMENTATION 995
USE OF REQUEST REPLY 995
CONCURRENT CONSUMERS 995
DIFFERENCE BETWEEN THREAD POOLS AND CONCURRENT CONSUMERS 996
THREAD POOLS 996
SAMPLE 996
USING MULTIPLECONSUMERS 997
EXTRACTING QUEUE INFORMATION. 997
. . . . . . . . . . . 132.
CHAPTER . . . . .SERVLET
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .998
...............
SERVLET COMPONENT 998
CAMEL ON EAP DEPLOYMENT 998
URI FORMAT 998
OPTIONS 998
MESSAGE HEADERS 999
USAGE 999
PUTTING CAMEL JARS IN THE APP SERVER BOOT CLASSPATH 999
SAMPLE 1000
SAMPLE WHEN USING SPRING 3.X 1001
SAMPLE WHEN USING SPRING 2.X 1002
SAMPLE WHEN USING OSGI 1002
. . . . . . . . . . . 133.
CHAPTER . . . . .SERVLETLISTENER
. . . . . . . . . . . . . . . . . . . . COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1006
................
SERVLETLISTENER COMPONENT 1006
USING 1006
OPTIONS 1007
32
Table of Contents
EXAMPLES 1009
CONFIGURING ROUTES 1009
USING A ROUTEBUILDER CLASS 1009
USING PACKAGE SCANNING 1009
USING A XML FILE 1009
CONFIGURING PROPERT PLACEHOLDERS 1010
CONFIGURING JMX 1010
JNDI OR SIMPLE AS CAMEL REGISTRY 1011
USING CUSTOM CAMELCONTEXTLIFECYCLE 1011
. . . . . . . . . . . 134.
CHAPTER . . . . .SHIRO
. . . . . . .SECURITY
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1013
...............
SHIRO SECURITY COMPONENT 1013
SHIRO SECURITY BASICS 1013
INSTANTIATING A SHIROSECURITYPOLICY OBJECT 1014
SHIROSECURITYPOLICY OPTIONS 1014
APPLYING SHIRO AUTHENTICATION ON A CAMEL ROUTE 1015
APPLYING SHIRO AUTHORIZATION ON A CAMEL ROUTE 1016
CREATING A SHIROSECURITYTOKEN AND INJECTING IT INTO A MESSAGE EXCHANGE 1016
SENDING MESSAGES TO ROUTES SECURED BY A SHIROSECURITYPOLICY 1017
SENDING MESSAGES TO ROUTES SECURED BY A SHIROSECURITYPOLICY (MUCH EASIER FROM CAMEL 2.12
ONWARDS) 1017
USING SHIROSECURITYTOKEN 1017
.CHAPTER
. . . . . . . . . . 135.
. . . . .SIP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1019
...............
SIP COMPONENT 1019
URI FORMAT 1019
OPTIONS 1019
REGISTRY BASED OPTIONS 1022
SENDING MESSAGES TO/FROM A SIP ENDPOINT 1023
CREATING A CAMEL SIP PUBLISHER 1023
CREATING A CAMEL SIP SUBSCRIBER 1023
.CHAPTER
. . . . . . . . . . 136.
. . . . .SJMS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1025
................
SJMS COMPONENT 1025
URI FORMAT 1026
COMPONENT OPTIONS AND CONFIGURATIONS 1026
PRODUCER CONFIGURATION OPTIONS 1027
PRODUCER USAGE 1028
INONLY PRODUCER - (DEFAULT) 1028
INOUT PRODUCER 1029
CONSUMERS CONFIGURATION OPTIONS 1029
CONSUMER USAGE 1030
INONLY CONSUMER - (DEFAULT) 1030
INOUT CONSUMER 1030
ADVANCED USAGE NOTES 1030
PLUGABLE CONNECTION RESOURCE MANAGEMENT 1030
SESSION, CONSUMER, AND PRODUCER POOLING AND CACHING MANAGEMENT 1031
BATCH MESSAGE SUPPORT 1031
CUSTOMIZABLE TRANSACTION COMMIT STRATEGIES (LOCAL JMS TRANSACTIONS ONLY) 1032
TRANSACTED BATCH CONSUMERS AND PRODUCERS 1032
ADDITIONAL NOTES 1033
MESSAGE HEADER FORMAT 1033
MESSAGE CONTENT 1033
CLUSTERING 1033
33
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.CHAPTER
. . . . . . . . . . 137.
. . . . .SMPP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035
................
SMPP COMPONENT 1035
SMS LIMITATIONS 1035
DATA CODING, ALPHABET AND INTERNATIONAL CHARACTER SETS 1035
MESSAGE SPLITTING AND THROTTLING 1036
URI FORMAT 1036
URI OPTIONS 1037
PRODUCER MESSAGE HEADERS 1044
CONSUMER MESSAGE HEADERS 1051
EXCEPTION HANDLING 1056
SAMPLES 1056
DEBUG LOGGING 1057
. . . . . . . . . . . 138.
CHAPTER . . . . .SNMP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058
................
SNMP COMPONENT 1058
URI FORMAT 1058
OPTIONS 1058
THE RESULT OF A POLL 1059
EXAMPLES 1060
. . . . . . . . . . . 139.
CHAPTER . . . . .SOLR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1061
...............
SOLR COMPONENT 1061
URI FORMAT 1061
ENDPOINT OPTIONS 1061
MESSAGE OPERATIONS 1062
EXAMPLE 1063
QUERYING SOLR 1064
. . . . . . . . . . . 140.
CHAPTER . . . . .SPLUNK
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1065
................
SPLUNK COMPONENT 1065
URI FORMAT 1065
PRODUCER ENDPOINTS: 1065
CONSUMER ENDPOINTS: 1065
URI OPTIONS 1066
MESSAGE BODY 1067
USE CASES 1067
OTHER COMMENTS 1068
SEE ALSO 1068
. . . . . . . . . . . 141.
CHAPTER . . . . SPRINGBATCH
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069
................
SPRING BATCH COMPONENT 1069
URI FORMAT 1069
OPTIONS 1069
USAGE 1069
EXAMPLES 1070
SUPPORT CLASSES 1070
CAMELITEMREADER 1070
CAMELITEMWRITER 1071
CAMELITEMPROCESSOR 1071
CAMELJOBEXECUTIONLISTENER 1072
. . . . . . . . . . . 142.
CHAPTER . . . . .SPRINGINTEGRATION
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
................
34
Table of Contents
.CHAPTER
. . . . . . . . . . 143.
. . . . .SPRING
. . . . . . . . EVENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1078
................
SPRING EVENT COMPONENT 1078
URI FORMAT 1078
. . . . . . . . . . . 144.
CHAPTER . . . . .SPRING
. . . . . . . . LDAP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1079
................
SPRING LDAP COMPONENT 1079
URI FORMAT 1079
OPTIONS 1079
USAGE 1079
SEARCH 1080
BIND 1080
UNBIND 1080
. . . . . . . . . . . 145.
CHAPTER . . . . .SPRING
. . . . . . . . REDIS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1081
...............
SPRING REDIS COMPONENT 1081
URI FORMAT 1081
URI OPTIONS 1081
USAGE 1082
MESSAGE HEADERS EVALUATED BY THE REDIS PRODUCER 1082
REDIS CONSUMER 1092
DEPENDENCIES 1092
. . . . . . . . . . . 146.
CHAPTER . . . . .SPRING
. . . . . . . . WEB
. . . . . .SERVICES
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1094
................
SPRING WEB SERVICES COMPONENT 1094
URI FORMAT 1094
OPTIONS 1095
REGISTRY BASED OPTIONS 1096
MESSAGE HEADERS 1097
ACCESSING WEB SERVICES 1098
SENDING SOAP AND WS-ADDRESSING ACTION HEADERS 1098
USING SOAP HEADERS 1099
THE HEADER AND ATTACHMENT PROPAGATION 1099
HOW TO USE MTOM ATTACHMENTS 1099
THE CUSTOM HEADER AND ATTACHMENT FILTERING 1100
USING A CUSTOM MESSAGESENDER AND MESSAGEFACTORY 1101
EXPOSING WEB SERVICES 1101
ENDPOINT MAPPING IN ROUTES 1102
ALTERNATIVE CONFIGURATION, USING EXISTING ENDPOINT MAPPINGS 1102
POJO (UN)MARSHALLING 1103
. . . . . . . . . . . 147.
CHAPTER . . . . .SQL
. . . . COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1104
................
SQL COMPONENT 1104
CAMEL ON EAP DEPLOYMENT 1104
URI FORMAT 1105
OPTIONS 1105
TREATMENT OF THE MESSAGE BODY 1111
RESULT OF THE QUERY 1111
35
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.CHAPTER
. . . . . . . . . . 148.
. . . . .SSH
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1124
...............
SSH 1124
URI FORMAT 1124
OPTIONS 1124
CONSUMER ONLY OPTIONS 1125
USAGE AS A PRODUCER ENDPOINT 1125
AUTHENTICATION 1126
CERTIFICATE DEPENDENCIES 1126
EXAMPLE 1127
. . . . . . . . . . . 149.
CHAPTER . . . . .STAX
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1128
...............
STAX COMPONENT 1128
URI FORMAT 1128
USAGE OF A CONTENT HANDLER AS STAX PARSER 1128
ITERATE OVER A COLLECTION USING JAXB AND STAX 1129
THE PREVIOUS EXAMPLE WITH XML DSL 1130
. . . . . . . . . . . 150.
CHAPTER . . . . .STOMP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1132
...............
STOMP COMPONENT 1132
URI FORMAT 1132
OPTIONS 1132
SAMPLES 1132
.CHAPTER
. . . . . . . . . . 151.
. . . . STREAM
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1133
...............
STREAM COMPONENT 1133
URI FORMAT 1133
CAMEL ON EAP DEPLOYMENT 1133
OPTIONS 1133
MESSAGE CONTENT 1135
SAMPLES 1135
. . . . . . . . . . . 152.
CHAPTER . . . . .STRINGTEMPLATE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1137
...............
STRING TEMPLATE 1137
URI FORMAT 1137
OPTIONS 1137
36
Table of Contents
HEADERS 1137
HOT RELOADING 1137
STRINGTEMPLATE ATTRIBUTES 1138
SAMPLES 1138
THE EMAIL SAMPLE 1138
. . . . . . . . . . . 153.
CHAPTER . . . . .STUB
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1140
................
STUB COMPONENT 1140
URI FORMAT 1140
EXAMPLES 1140
. . . . . . . . . . . 154.
CHAPTER . . . . .SWAGGER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1141
...............
154.1. OVERVIEW 1141
154.2. CONFIGURING WAR DEPLOYMENTS 1144
154.3. CONFIGURING OSGI DEPLOYMENTS 1146
. . . . . . . . . . . 155.
CHAPTER . . . . .TEST
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1148
...............
TEST COMPONENT 1148
URI FORMAT 1148
URI OPTIONS 1148
EXAMPLE 1148
. . . . . . . . . . . 156.
CHAPTER . . . . .TIMER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1150
...............
TIMER COMPONENT 1150
URI FORMAT 1150
OPTIONS 1150
EXCHANGE PROPERTIES 1151
MESSAGE HEADERS 1151
SAMPLE 1152
FIRING ONLY ONCE 1152
.CHAPTER
. . . . . . . . . . 157.
. . . . .TWITTER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1153
...............
TWITTER 1153
URI FORMAT 1153
TWITTERCOMPONENT: 1153
CONSUMER ENDPOINTS: 1153
PRODUCER ENDPOINTS: 1154
URI OPTIONS 1154
MESSAGE HEADER 1156
MESSAGE BODY 1157
TO CREATE A STATUS UPDATE WITHIN YOUR TWITTER PROFILE, SEND THIS PRODUCER A STRING BODY.
1157
TO POLL, EVERY 5 SEC., ALL STATUSES ON YOUR HOME TIMELINE: 1157
TO SEARCH FOR ALL STATUSES WITH THE KEYWORD 'CAMEL': 1157
SEARCHING USING A PRODUCER WITH STATIC KEYWORDS 1157
SEARCHING USING A PRODUCER WITH DYNAMIC KEYWORDS FROM HEADER 1157
EXAMPLE 1157
. . . . . . . . . . . 158.
CHAPTER . . . . .VALIDATION
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1159
...............
VALIDATION COMPONENT 1159
URI FORMAT 1159
OPTIONS 1159
EXAMPLE 1160
. . . . . . . . . . . 159.
CHAPTER . . . . .VELOCITY
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1161
...............
37
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
VELOCITY 1161
URI FORMAT 1161
OPTIONS 1161
MESSAGE HEADERS 1161
VELOCITY CONTEXT 1162
HOT RELOADING 1162
DYNAMIC TEMPLATES 1163
SAMPLES 1163
THE EMAIL SAMPLE 1164
. . . . . . . . . . . 160.
CHAPTER . . . . .VERTX
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1165
...............
VERTX COMPONENT 1165
URI FORMAT 1165
OPTIONS 1165
. . . . . . . . . . . 161.
CHAPTER . . . . VM
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1166
...............
VM COMPONENT 1166
URI FORMAT 1166
OPTIONS 1166
SAMPLES 1166
.CHAPTER
. . . . . . . . . . 162.
. . . . .WEATHER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1168
...............
WEATHER COMPONENT 1168
CAMEL ON EAP DEPLOYMENT 1168
URI FORMAT 1168
OPTIONS 1168
EXCHANGE DATA FORMAT 1170
MESSAGE HEADERS 1170
SAMPLES 1170
.CHAPTER
. . . . . . . . . . 163.
. . . . .WEBSOCKET
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1171
...............
WEBSOCKET COMPONENT 1171
URI FORMAT 1171
COMPONENT OPTIONS 1171
ENDPOINT OPTIONS 1172
MESSAGE HEADERS 1174
USAGE 1174
SETTING UP SSL FOR WEBSOCKET COMPONENT 1174
USING THE JSSE CONFIGURATION UTILITY 1174
PROGRAMMATIC CONFIGURATION OF THE COMPONENT 1175
SPRING DSL BASED CONFIGURATION OF ENDPOINT 1175
JAVA DSL BASED CONFIGURATION OF ENDPOINT 1175
. . . . . . . . . . . 164.
CHAPTER . . . . .XMLRPC
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1177
...............
XMLRPC COMPONENT 1177
XMLRPC OVERVIEW 1177
URI FORMAT 1178
OPTIONS 1178
MESSAGE HEADERS 1179
USING THE XMLRPC DATA FORMAT 1179
INVOKE XMLRPC SERVICE FROM CLIENT 1180
HOW TO CONFIGURE THE XMLRPCCLIENT WITH JAVA CODE 1180
. . . . . . . . . . . 165.
CHAPTER . . . . .XML
. . . . .SECURITY
. . . . . . . . . . .COMPONENT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1182
...............
XML SECURITY COMPONENT 1182
38
Table of Contents
.CHAPTER
. . . . . . . . . . 166.
. . . . .XMPP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1204
................
XMPP COMPONENT 1204
URI FORMAT 1204
OPTIONS 1204
HEADERS AND SETTING SUBJECT OR LANGUAGE 1205
EXAMPLES 1205
.CHAPTER
. . . . . . . . . . 167.
. . . . .XQUERY
. . . . . . . . . ENDPOINT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1207
................
XQUERY 1207
URI FORMAT 1207
. . . . . . . . . . . 168.
CHAPTER . . . . .XSLT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1208
................
XSLT 1208
URI FORMAT 1208
OPTIONS 1208
USING XSLT ENDPOINTS 1211
GETTING PARAMETERS INTO THE XSLT TO WORK WITH 1211
SPRING XML VERSIONS 1211
USING XSL:INCLUDE 1212
USING XSL:INCLUDE AND DEFAULT PREFIX 1212
DYNAMIC STYLESHEETS 1213
ACCESSING WARNINGS, ERRORS AND FATALERRORS FROM XSLT ERRORLISTENER 1213
. . . . . . . . . . . 169.
CHAPTER . . . . .XSTREAM
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1214
...............
XSTREAM COMPONENT 1214
CAMEL ON EAP DEPLOYMENT 1214
. . . . . . . . . . . 170.
CHAPTER . . . . .YAMMER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1215
...............
YAMMER 1215
URI FORMAT 1215
YAMMERCOMPONENT 1215
CONSUMING MESSAGES 1215
URI OPTIONS FOR CONSUMING MESSAGES 1216
MESSAGE FORMAT 1217
CREATING MESSAGES 1219
RETRIEVING USER RELATIONSHIPS 1220
URI OPTIONS FOR RETRIEVING RELATIONSHIPS 1220
RETRIEVING USERS 1220
URI OPTIONS FOR RETRIEVING USERS 1221
USING AN ENRICHER 1221
. . . . . . . . . . . 171.
CHAPTER . . . . ZOOKEEPER
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1222
................
39
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
ZOOKEEPER 1222
CAMEL ON EAP DEPLOYMENT 1222
URI FORMAT 1222
OPTIONS 1222
USE CASES 1223
READING FROM A ZNODE. 1223
READING FROM A ZNODE - (ADDITIONAL CAMEL 2.10 ONWARDS) 1223
WRITING TO A ZNODE. 1223
ZOOKEEPER ENABLED ROUTE POLICY. 1225
40
Table of Contents
41
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Abstract
This chapter provides a summary of all the components available for Apache Camel.
Table of components
The following Camel components are supported on the Apache Karaf (OSGi) container:
42
CHAPTER 1. COMPONENTS OVERVIEW
43
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
44
CHAPTER 1. COMPONENTS OVERVIEW
45
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
46
CHAPTER 1. COMPONENTS OVERVIEW
47
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
48
CHAPTER 1. COMPONENTS OVERVIEW
49
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
50
CHAPTER 1. COMPONENTS OVERVIEW
51
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Master REVISIT
52
CHAPTER 1. COMPONENTS OVERVIEW
53
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
54
CHAPTER 1. COMPONENTS OVERVIEW
55
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
56
CHAPTER 1. COMPONENTS OVERVIEW
57
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
58
CHAPTER 1. COMPONENTS OVERVIEW
59
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Table of components
The following Camel components are supported on the Red Hat JBoss Enterprise Application Platform
(Java EE) container:
60
CHAPTER 1. COMPONENTS OVERVIEW
61
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
camel-csv
62
CHAPTER 1. COMPONENTS OVERVIEW
camel-groovy
63
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
camel-jackson
64
CHAPTER 1. COMPONENTS OVERVIEW
65
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
camel-protobuf
66
CHAPTER 1. COMPONENTS OVERVIEW
camel-soap
camel-spring
camel-spring-
security
67
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
camel-tagsoup
camel-xmlbeans
68
CHAPTER 1. COMPONENTS OVERVIEW
camel-zipfile
You can create an additional directory and add the module.xml file and any jar dependencies into it.
For example, modules/system/layers/fuse/org/apache/camel/component/ftp/main directory.
69
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<dependencies>
...
<module name="org.apache.camel.component.ftp" export="true" services="export"/>
</dependencies>
</module>
70
CHAPTER 2. ACTIVEMQ
CHAPTER 2. ACTIVEMQ
ACTIVEMQ COMPONENT
The ActiveMQ component allows messages to be sent to a JMS Queue or Topic; or messages to be
consumed from a JMS Queue or Topic using Apache ActiveMQ.
This component is based on the JMS Component and uses Spring's JMS support for declarative
transactions, using Spring's JmsTemplate for sending and a MessageListenerContainer for
consuming. All the options from the JMS component also apply for this component.
To use this component, make sure you have the activemq.jar or activemq-core.jar on your classpath
along with any Apache Camel dependencies such as camel-core.jar, camel-spring.jar and camel-
jms.jar.
See section Transactions and Cache Levels below on JMS page if you are using
transactions with JMS as it can impact performance.
URI FORMAT
activemq:[queue:|topic:]destinationName
activemq:FOO.BAR
activemq:queue:FOO.BAR
To connect to a topic, you must include the topic: prefix. For example, to connect to the topic,
Stocks.Prices, use:
activemq:topic:Stocks.Prices
OPTIONS
See Options on the JMS component as all these options also apply for this component.
You can configure the ActiveMQ Camel component to work either with an embedded broker or an
external broker. To embed a broker in the JBoss EAP container, configure the ActiveMQ Resource
71
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Adapter in the EAP container configuration file—for details, see ActiveMQ Resource Adapter
Configuration.
camelContext.addComponent("activemq", activeMQComponent("vm://localhost?
broker.persistent=false"));
<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>
</beans>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.3.2</version>
</dependency>
72
CHAPTER 2. ACTIVEMQ
<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>
NOTE
Notice the init and destroy methods on the pooled connection factory. This is important
to ensure the connection pool is properly started and shutdown.
The PooledConnectionFactory will then create a connection pool with up to 8 connections in use at
the same time. Each connection can be shared by many sessions. There is an option named maxActive
you can use to configure the maximum number of sessions per connection; the default value is 500.
From ActiveMQ 5.7 onwards the option has been renamed to better reflect its purpose, being named
as maxActiveSessionPerConnection. Notice the concurrentConsumers is set to a higher value than
maxConnections is. This is okay, as each consumer is using a session, and as a session can share the
same connection, we are in the safe. In this example we can have 8 * 500 = 4000 active sessions at
the same time.
from("file://foo/bar").
bean(MyListener.class);
That is, you can reuse any of the Apache Camel Components and easily integrate them into your JMS
MessageListener POJO\!
73
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can configure the Destination Options in the endpoint uri, using the "destination." prefix. For
example to mark a consumer as exclusive, and set its prefetch size to 50, you can do as follows:
<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&estination.consumer.prefetchSize=50"/>
<to uri="mock:results"/>
</route>
</camelContext>
<route>
<from uri="activemq:topic:ActiveMQ.Advisory.Connection?mapJmsMessage=false" />
<convertBodyTo type="java.lang.String"/>
<transform>
<simple>${in.body} </simple>
</transform>
<to uri="file://data/activemq/?fileExist=Append&ileName=advisoryConnection-
${date:now:yyyyMMdd}.txt" />
</route>
If you consume a message on a queue, you should see the following files under data/activemq folder :
advisoryConnection-20100312.txt advisoryProducer-20100312.txt
74
CHAPTER 2. ACTIVEMQ
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}
activemq-camel
ActiveMQ is an extension of the JMS component released with the ActiveMQ project.
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-camel</artifactId>
<version>5.6.0</version>
</dependency>
75
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CHAPTER 3. AHC
The ahc: component provides HTTP-based endpoints for consuming external HTTP resources (as a
client to call external servers using HTTP). The component uses the Async Http Client library.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
ahc:http://hostname[:port][/resourceUri][?options]
ahc:https://hostname[:port][/resourceUri][?options]
Will by default use port 80 for HTTP and 443 for HTTPS.
You can append query options to the URI in the following format, ?option=value&option=value&...
AHCENDPOINT OPTIONS
76
CHAPTER 3. AHC
77
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
AHCCOMPONENT OPTIONS
78
CHAPTER 3. AHC
Notice that setting any of the options on the AhcComponent will propagate those options to
AhcEndpoints being created. However the AhcEndpoint can also configure/override a custom option.
Options set on endpoints will always take precedence over options from the AhcComponent.
MESSAGE HEADERS
MESSAGE BODY
Camel will store the HTTP response from the external server on the OUT body. All headers from the IN
message will be copied to the OUT message, so headers are preserved during routing. Additionally
Camel will add the HTTP response headers as well to the OUT message headers.
RESPONSE CODE
79
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Response code is in the range 300..399, Camel regards it as a redirection response and will
throw a AhcOperationFailedException with the information.
Response code is 400+, Camel regards it as an external server failure and will throw a
AhcOperationFailedException with the information. The option, throwExceptionOnFailure,
can be set to false to prevent the AhcOperationFailedException from being thrown for failed
response codes. This allows you to get any response from the remote server.
AHCOPERATIONFAILEDEXCEPTION
This exception contains the following information:
from("direct:start")
.to("ahc:http://oldhost");
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="direct:start"/>
<to uri="ahc:http://oldhost"/>
</route>
</camelContext>
You can override the HTTP endpoint URI by adding a header with the key, Exchange.HTTP_URI, on
the message.
from("direct:start")
.setHeader(Exchange.HTTP_URI, constant("http://newhost"))
.to("ahc:http://oldhost");
80
CHAPTER 3. AHC
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");
from("direct:start")
.setHeader(Exchange.HTTP_METHOD, constant("POST"))
.to("ahc:http://www.google.com")
.to("mock:results");
<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>
CONFIGURING CHARSET
If you are using POST to send data you can configure the charset using the Exchange property:
exchange.setProperty(Exchange.CHARSET_NAME, "iso-8859-1");
81
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In the header value above notice that it should not be prefixed with ? and you can separate parameters
as usual with the & char.
CONFIGURING ASYNCHTTPCLIENT
The AsyncHttpClient client uses a AsyncHttpClientConfig to configure the client. See the
documentation at Async Http Client for more details.
The example below shows how to use a builder to create the AsyncHttpClientConfig which we
configure on the AhcComponent.
// lookup AhcComponent
AhcComponent component = context.getComponent("ahc", AhcComponent.class);
// and set our custom client config to be used
component.setClientConfig(config);
In Camel 2.9, the AHC component uses Async HTTP library 1.6.4. This newer version provides added
support for plain bean style configuration. The AsyncHttpClientConfigBean class provides getters
and setters for the configuration options available in AsyncHttpClientConfig. An instance of
AsyncHttpClientConfigBean may be passed directly to the AHC component or referenced in an
endpoint URI using the clientConfig URI parameter.
Also available in Camel 2.9 is the ability to set configuration options directly in the URI. URI
82
CHAPTER 3. AHC
parameters starting with "clientConfig." can be used to set the various configurable properties of
AsyncHttpClientConfig. The properties specified in the endpoint URI are merged with those specified
in the configuration referenced by the "clientConfig" URI parameter with those being set using the
"clientConfig." parameter taking priority. The AsyncHttpClientConfig instance referenced is always
copied for each endpoint such that settings on one endpoint will remain independent of settings on any
previously created endpoints. The example below shows how to configure the AHC component using
the "clientConfig." type URI parameters.
from("direct:start")
.to("ahc:http://localhost:8080/foo?
clientConfig.maxRequestRetry=3&clientConfig.followRedirects=true")
...
<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"/>
...
83
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Jetty
HTTP
HTTP4
84
CHAPTER 4. AHC-WS
CHAPTER 4. AHC-WS
The ahc-ws component provides Websocket based endpoints for a client communicating with external
servers over Websocket (as a client opening a websocket connection to an external server). The
component uses the Chapter 3, AHC component that in turn uses the Async Http Client library.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
ahc-ws://hostname[:port][/resourceUri][?options]
ahc-wss://hostname[:port][/resourceUri][?options]
Will by default use port 80 for ahc-ws and 443 for ahc-wss.
AHC-WS OPTIONS
As the AHC-WS component is based on the AHC component, you can use the various configuration
options of the AHC component.
from("direct:start")
.to("ahc-ws://targethost");
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start"/>
<to uri="ahc-ws://targethost"/>
</route>
</camelContext>
85
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In the route below, Camel will read from the specified websocket connection.
from("ahc-ws://targethost")
.to("direct:next");
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="ahc-ws://targethost"/>
<to uri="direct:next"/>
</route>
</camelContext>
86
CHAPTER 5. AMQP
CHAPTER 5. AMQP
AMQP
The AMQP component supports the AMQP protocol via the Qpid project.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ampq</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
amqp:[queue:|topic:]destinationName[?options]
You can specify all of the various configuration options of the JMS component after the destination
name.
87
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CHAPTER 6. APNS
APNS COMPONENT
Available as of Camel 2.8
The apns component is used for sending notifications to iOS devices. The apns components use
javapns library. The component supports sending notifications to Apple Push Notification Servers
(APNS) and consuming feedback from the servers.
The consumer is configured with a default polling time of 3600 seconds. It is advisable to consume the
feedback stream from Apple Push Notification Servers regularly at larger intervals to avoid flooding
the servers.
The feedback stream gives information about inactive devices. This information can be consumed
infrequently (every two or three hours) if your mobile application is not heavily used.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
To send notifications:
apns:notify[?options]
To consume feedback:
apns:consumer[?options]
OPTIONS
PRODUCER
88
CHAPTER 6. APNS
CONSUMER
You can append query options to the URI in the following format, ?option=value&option=value&...
COMPONENT
The ApnsComponent must be configured with a com.notnoop.apns.ApnsService. The service can be
created and configured using the org.apache.camel.component.apns.factory.ApnsServiceFactory.
See further below for an example. For further information, see the test source code .
MESSAGE HEADERS
Camel Apns uses these headers.
89
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
ApnsServiceFactory comes with an empty callback method that can be used to configure or replace
the default ApnsServiceBuilder instance. The method has the following format:
@Override
protected ApnsServiceBuilder configureServiceBuilder(ApnsServiceBuilder serviceBuilder) {
return serviceBuilder.withSocksProxy("my.proxy.com", 6666);
}
};
SAMPLES
<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">
90
CHAPTER 6. APNS
</beans>
return camelContext;
}
91
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.to("apns:notify");
}
}
}
APNSCONSUMER
from("apns:consumer?initialDelay=10&delay=3600&timeUnit=SECONDS")
.to("log:com.apache.camel.component.apns?showAll=true&multiline=true")
.to("mock:result");
SEE ALSO
Component
Endpoint
92
CHAPTER 7. ATMOSPHERE-WEBSOCKET
CHAPTER 7. ATMOSPHERE-WEBSOCKET
Unlike the Chapter 163, Websocket component that starts the embedded Jetty server, this component
uses the servlet provider of the container.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
atmosphere-websocket:///relative path[?options]
from("atmosphere-websocket:///servicepath")
.to("direct:next");
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="atmosphere-websocket:///servicepath"/>
<to uri="direct:next"/>
</route>
</camelContext>
In the route below, Camel will read from the specified websocket connection.
93
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:next")
.to("atmosphere-websocket:///servicepath");
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:next"/>
<to uri="atmosphere-websocket:///servicepath"/>
</route>
</camelContext>
94
CHAPTER 8. ATOM
CHAPTER 8. ATOM
ATOM COMPONENT
The atom: component is used for polling atom feeds.
Apache Camel will poll the feed every 500 milliseconds by default. Note: The component currently
supports only polling (consuming) feeds.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
atom://atomUri[?options]
OPTIONS
95
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can append query options to the URI in the following format, ?option=value&option=value&...
96
CHAPTER 8. ATOM
Apache Camel can set the Feed object on the in header (see feedHeader option to disable this):
MESSAGE HEADERS
Apache Camel atom uses these headers.
Header Description
SAMPLES
In the following sample we poll James Strachan's blog:
from("atom://http://macstrac.blogspot.com/feeds/posts/default").to("seda:feeds");
In this sample we want to filter only good blogs we like to a SEDA queue. The sample also shows how to
set up Apache Camel standalone, not running in any container or using Spring.
@Override
protected CamelContext createCamelContext() throws Exception {
// First we register a blog service in our bean registry
SimpleRegistry registry = new SimpleRegistry();
registry.put("blogService", new BlogService());
// Then we add all the routes we need using the route builder DSL syntax
context.addRoutes(createMyRoutes());
// And finally we must start Camel to let the magic routing begins
context.start();
return context;
}
/**
* This is the route builder where we create our routes using the Camel DSL syntax
97
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
*/
protected RouteBuilder createMyRoutes() throws Exception {
return new RouteBuilder() {
public void configure() throws Exception {
// We pool the atom feeds from the source for further processing in the seda queue
// we set the delay to 1 second for each pool.
// Using splitEntries=true will during polling only fetch one Atom Entry at any given time.
// As the feed.atom file contains 7 entries, using this will require 7 polls to fetch the entire
// content. When Camel have reach the end of entries it will refresh the atom feed from URI
source
// and restart - but as Camel by default uses the UpdatedDateFilter it will only deliver new
// blog entries to "seda:feeds". So only when James Strachan updates his blog with a new
entry
// Camel will create an exchange for the seda:feeds.
from("atom:file:src/test/data/feed.atom?
splitEntries=true&consumer.delay=1000").to("seda:feeds");
// From the feeds we filter each blot entry by using our blog service class
from("seda:feeds").filter().method("blogService", "isGoodBlog").to("seda:goodBlogs");
// And the good blogs is moved to a mock queue as this sample is also used for unit testing
// this is one of the strengths in Camel that you can also use the mock endpoint for your
// unit tests
from("seda:goodBlogs").to("mock:result");
}
};
}
/**
* This is the actual junit test method that does the assertion that our routes is working
* as expected
*/
@Test
public void testFiltering() throws Exception {
// create and start Camel
context = createCamelContext();
context.start();
// There should be at least two good blog entries from the feed
mock.expectedMinimumMessageCount(2);
// Asserts that the above expectations is true, will throw assertions exception if it failed
// Camel will default wait max 20 seconds for the assertions to be true, if the conditions
// is true sooner Camel will continue
mock.assertIsSatisfied();
/**
* Services for blogs
*/
98
CHAPTER 8. ATOM
/**
* Tests the blogs if its a good blog entry or not
*/
public boolean isGoodBlog(Exchange exchange) {
Entry entry = exchange.getIn().getBody(Entry.class);
String title = entry.getTitle();
99
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CHAPTER 9. AVRO
AVRO COMPONENT
Available as of Camel 2.10
This component provides a dataformat for avro, which allows serialization and deserialization of
messages using Apache Avro's binary dataformat. Moreover, it provides support for Apache Avro's rpc,
by providing producers and consumers endpoint for using avro over netty or http.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
{"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"
}
}
}
100
CHAPTER 9. AVRO
You can easily generate classes from a schema, using maven, ant etc. More details can be found at the
Apache Avro documentation .
However, it doesn't enforce a schema first approach and you can create schema for your existing
classes. Since 2.12 you can use existing protocol interfaces to make RCP calls. You should use
interface for the protocol itself and POJO beans or primitive/String classes for parameter and result
types. Here is an example of the class that corresponds to schema above:
package org.apache.camel.avro.reflection;
class Value {
private String value;
public String getValue() { return value; }
public void setValue(String value) { this.value = value; }
}
Note: Existing classes can be used only for RPC (see below), not in data format.
An alternative can be to specify the dataformat inside the context and reference it from your route.
In the same manner you can umarshal using the avro data format.
101
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
As mentioned above Avro also provides RPC support over multiple transports such as http and netty.
Camel provides consumers and producers for these two transports.
avro:[transport]:[host]:[port][?options]
Since 2.12 you can specify message name right in the URI:
avro:[transport]:[host]:[port][/messageName][?options]
For consumers this allows you to have multiple routes attached to the same socket. Dispatching to
correct route will be done by the avro component automatically. Route with no messageName
specified (if any) will be used as default.
When using camel producers for avro ipc, the "in" message body needs to contain the parameters of
the operation specified in the avro protocol. The response will be added in the body of the "out"
message.
In a similar manner when using camel avro consumers for avro ipc, the requests parameters will be
placed inside the "in" message body of the created exchange and once the exchange is processed the
body of the "out" message will be send as a response.
Note: By default consumer parameters are wrapped into array. If you've got only one parameter, since
2.12 you can use singleParameter URI option to receive it direcly in the "in" message body without
array wrapping.
102
CHAPTER 9. AVRO
Name Description
EXAMPLES
An example of using camel avro producers via http:
<route>
<from uri="direct:start"/>
<to uri="avro:http:localhost:{{avroport}}?
protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol"/>
<to uri="log:avro"/>
</route>
In the example above you need to fill CamelAvroMessageName header. Since 2.12 you can use
following syntax to call constant messages:
<route>
<from uri="direct:start"/>
<to uri="avro:http:localhost:{{avroport}}/put?
protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol"/>
<to uri="log:avro"/>
</route>
<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>
Since 2.12 you can set up two distinct routes to perform the same task:
<route>
<from uri="avro:netty:localhost:{{avroport}}/put?
protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol">
<process ref="putProcessor"/>
</route>
103
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from uri="avro:netty:localhost:{{avroport}}/get?
protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol&singleParameter=true"/>
<process ref="getProcessor"/>
</route>
In the example above, get takes only one parameter, so singleParameter is used and getProcessor
will receive Value class directly in body, while putProcessor will receive an array of size 2 with String
key and Value value filled as array contents.
104
CHAPTER 10. AWS
10.2. AWS-CW
CW Component
105
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PREREQUISITES
You must have a valid Amazon Web Services developer account, and be signed up to use
Amazon CloudWatch. More information are available at Amazon CloudWatch.
URI Format
aws-cw://namespace[?options]
The metrics will be created if they don't already exists. You can append query options to the URI in the
following format, ?options=value&option2=value&...
URI Options
106
CHAPTER 10. AWS
You have to provide the amazonCwClient in the Registry or your accessKey and
secretKey to access the Amazon's CloudWatch .
Usage
If you need more control over the AmazonCloudWatch instance configuration you can create your
own instance and refer to it from the URI:
107
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:start")
.to("aws-cw://namepsace?amazonCwClient=#client");
registry.bind("client", client);
Dependencies
Maven users will need to add the following dependency to their pom.xml.
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Camel (2.10 or higher).
AWS Component
10.3. AWS-DDB
DDB Component
The DynamoDB component supports storing and retrieving data from/to Amazon's DynamoDB
service.
PREREQUISITES
You must have a valid Amazon Web Services developer account, and be signed up to use
Amazon DynamoDB. More information are available at Amazon DynamoDB.
URI Format
aws-ddb://domainName[?options]
You can append query options to the URI in the following format, ?options=value&option2=value&...
108
CHAPTER 10. AWS
URI Options
You have to provide the amazonDDBClient in the Registry or your accessKey and
secretKey to access the Amazon's DynamoDB .
109
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Usage
110
CHAPTER 10. AWS
111
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
112
CHAPTER 10. AWS
113
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
If you need more control over the AmazonDynamoDB instance configuration you can create your own
instance and refer to it from the URI:
from("direct:start")
.to("aws-ddb://domainName?amazonDDBClient=#client");
registry.bind("client", client);
Dependencies
Maven users will need to add the following dependency to their pom.xml.
114
CHAPTER 10. AWS
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Camel (2.10 or higher).
AWS Component
10.4. AWS-S3
S3 Component
Available as of Camel 2.8
The S3 component supports storing and retrieving objetcs from/to Amazon's S3 service.
PREREQUISITES
You must have a valid Amazon Web Services developer account, and be signed up to use
Amazon S3. More information are available at Amazon S3.
URI Format
aws-s3://bucket-name[?options]
The bucket will be created if it don't already exists. You can append query options to the URI in the
following format, ?options=value&option2=value&...
URI Options
115
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
116
CHAPTER 10. AWS
You have to provide the amazonS3Client in the Registry or your accessKey and
secretKey to access the Amazon's S3.
Batch Consumer
This allows you, for example, to know how many messages exist in this batch and let the Aggregator
aggregate this number of messages.
Usage
117
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
118
CHAPTER 10. AWS
119
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
registry.bind("client", client);
from("aws-s3://MyBucket?amazonS3Client=#client&delay=5000&maxMessagesPerPoll=5")
.to("mock:result");
Dependencies
Maven users will need to add the following dependency to their pom.xml.
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws</artifactId>
<version>${camel-version}</version>
</dependency>
where $\{camel-version\} must be replaced by the actual version of Camel (2.8 or higher).
AWS Component
10.5. AWS-SDB
SDB Component
The sdb component supports storing and retrieving data from/to Amazon's SDB service.
PREREQUISITES
You must have a valid Amazon Web Services developer account, and be signed up to use
Amazon SDB. More information are available at Amazon SDB.
URI Format
120
CHAPTER 10. AWS
aws-sdb://domainName[?options]
You can append query options to the URI in the following format, ?options=value&option2=value&...
URI Options
121
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You have to provide the amazonSDBClient in the Registry or your accessKey and
secretKey to access the Amazon's SDB.
Usage
122
CHAPTER 10. AWS
123
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:start")
.to("aws-sdb://domainName?amazonSDBClient=#client");
registry.bind("client", client);
Dependencies
Maven users will need to add the following dependency to their pom.xml.
124
CHAPTER 10. AWS
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Camel (2.8.4 or higher).
AWS Component
10.6. AWS-SES
SES Component
The ses component supports sending emails with Amazon's SES service.
PREREQUISITES
You must have a valid Amazon Web Services developer account, and be signed up to use
Amazon SES. More information are available at Amazon SES.
URI Format
aws-ses://from[?options]
You can append query options to the URI in the following format, ?options=value&option2=value&...
URI Options
125
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You have to provide the amazonSESClient in the Registry or your accessKey and
secretKey to access the Amazon's SES .
Usage
126
CHAPTER 10. AWS
If you need more control over the AmazonSimpleEmailService instance configuration you can create
your own instance and refer to it from the URI:
from("direct:start")
.to("aws-ses://[email protected]?amazonSESClient=#client");
registry.bind("client", client);
Dependencies
Maven users will need to add the following dependency to their pom.xml.
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws</artifactId>
<version>${camel-version}</version>
</dependency>
127
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
where ${camel-version} must be replaced by the actual version of Camel (2.8.4 or higher).
AWS Component
10.7. AWS-SNS
SNS Component
The SNS component allows messages to be sent to an Amazon Simple Notification Topic. The
implementation of the Amazon API is provided by the AWS SDK .
PREREQUISITES
You must have a valid Amazon Web Services developer account, and be signed up to use
Amazon SNS. More information are available at Amazon SNS.
URI Format
aws-sns://topicName[?options]
The topic will be created if they don't already exists. You can append query options to the URI in the
following format, ?options=value&option2=value&...
URI Options
128
CHAPTER 10. AWS
You have to provide the amazonSNSClient in the Registry or your accessKey and
secretKey to access the Amazon's SNS.
Usage
from("direct:start")
.to("aws-sns://MyTopic?amazonSNSClient=#client");
129
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
registry.bind("client", client);
Dependencies
Maven users will need to add the following dependency to their pom.xml.
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws</artifactId>
<version>${camel-version}</version>
</dependency>
where $\{camel-version\} must be replaced by the actual version of Camel (2.8 or higher).
AWS Component
10.8. AWS-SQS
SQS Component
Available as of Camel 2.6
The sqs component supports sending and receiving messages to Amazon's SQS service.
PREREQUISITES
You must have a valid Amazon Web Services developer account, and be signed up to use
Amazon SQS. More information are available at Amazon SQS.
URI Format
aws-sqs://queue-name[?options]
The queue will be created if they don't already exists. You can append query options to the URI in the
following format, ?options=value&option2=value&...
URI Options
130
CHAPTER 10. AWS
131
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
132
CHAPTER 10. AWS
133
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You have to provide the amazonSQSClient in the Registry or your accessKey and
secretKey to access the Amazon's SQS.
Batch Consumer
This component implements the Batch Consumer.
This allows you for instance to know how many messages exists in this batch and for instance let the
Aggregator aggregate this number of messages.
Usage
134
CHAPTER 10. AWS
registry.bind("client", client);
from("aws-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5")
.to("mock:result");
Dependencies
135
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Maven users will need to add the following dependency to their pom.xml.
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws</artifactId>
<version>${camel-version}</version>
</dependency>
where $\{camel-version\} must be replaced by the actual version of Camel (2.6 or higher).
JMS-style Selectors
SQS does not allow selectors, but you can effectively achieve this by using the Camel Filter EIP and
setting an appropriate visibilityTimeout. When SQS dispatches a message, it will wait up to the
visibility timeout before it will try to dispatch the message to a different consumer unless a
DeleteMessage is received. By default, Camel will always send the DeleteMessage at the end of the
route, unless the route ended in failure. To achieve appropriate filtering and not send the
DeleteMessage even on successful completion of the route, use a Filter:
from("aws-sqs://MyQueue?
amazonSQSClient=#client&defaultVisibilityTimeout=5000&deleteIfFiltered=false")
.filter("${header.login} == true")
.to("mock:result");
In the above code, if an exchange doesn't have an appropriate header, it will not make it through the
filter AND also not be deleted from the SQS queue. After 5000 miliseconds, the message will become
visible to other consumers.
AWS Component
10.9. AWS-SWF
SWF Component
Available as of Camel 2.13
The Simple Workflow component supports managing workflows from Amazon's Simple Workflow
service.
NOTE
You must have a valid Amazon Web Services developer account, and be signed up to use
Amazon Simple Workflow. More information are available at Amazon Simple Workflow .
URI Format
aws-swf://<workflow|activity>[?options]
You can append query options to the URI in the following format, ?options=value&option2=value&...
136
CHAPTER 10. AWS
URI Options
137
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
NOTE
You have to provide the amazonSWClient in the Registry or your accessKey and
secretKey to access the Amazon's Simple Workflow Service .
Usage
138
CHAPTER 10. AWS
139
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
will also receive signals (send from a workflow producer) or state queries. The primary purpose of a
workflow consumer is to schedule activity tasks for execution using activity producers. Actually
activity tasks can be scheduled only from a thread started by a workflow consumer.
140
CHAPTER 10. AWS
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);
registry.bind("client", client);
Dependencies
Maven users will need to add the following dependency to their pom.xml.
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-aws</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Camel (2.13 or higher).
141
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
BEAN COMPONENT
The bean: component binds beans to Apache Camel message exchanges.
URI FORMAT
bean:beanID[?options]
Where beanID can be any string which is used to lookup look up the bean in the Registry
OPTIONS
You can append query options to the URI in the following format, ?option=value&option=value&...
USING
The object instance that is used to consume messages must be explicitly registered with the Registry.
For example, if you are using Spring you must define the bean in the Spring configuration, spring.xml;
or if you don't use Spring, put the bean in JNDI.
142
CHAPTER 11. BEAN
Once an endpoint has been registered, you can build routes that use it to process exchanges.
A bean: endpoint cannot be defined as the input to the route; i.e. you cannot consume from it, you can
only route from some inbound message Endpoint to the bean endpoint as output. So consider using a
direct: or queue: endpoint as the input.
You can use the createProxy() methods on ProxyHelper to create a proxy that will generate
BeanExchanges and send them to any endpoint:
<route>
<from uri="direct:hello">
<to uri="bean:bye"/>
</route>
BEAN AS ENDPOINT
Apache Camel also supports invoking Bean as an Endpoint. In the route below:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start"/>
<to uri="myBean"/>
<to uri="mock:results"/>
</route>
</camelContext>
What happens is that when the exchange is routed to the myBean, Apache Camel will use the Bean
Binding to invoke the bean. The source for the bean is just a plain POJO:
143
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Apache Camel will use Bean Binding to invoke the sayHello method, by converting the Exchange's In
body to the String type and storing the output of the method on the Exchange Out body.
Instead of passing name of the reference to the bean (so that Camel will lookup for it in the registry),
you can specify the bean itself:
// Camel will create the instance of bean and cache it for you.
from("direct:start").bean(ExampleBean.class);
BEAN BINDING
How bean methods to be invoked are chosen (if they are not specified explicitly through the method
parameter) and how parameter values are constructed from the Message are all defined by the Bean
Binding mechanism which is used throughout all of the various Bean Integration mechanisms in
Apache Camel.
Class component
Bean Binding
Bean Integration
144
CHAPTER 12. BEAN VALIDATOR
The Validator component performs bean validation of the message body using the Java Bean
Validation API (JSR 303). Camel uses the reference implementation, which is Hibernate Validator.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-bean-validator</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
bean-validator:label[?options]
or
bean-validator://label[?options]
Where label is an arbitrary text value describing the endpoint. You can append query options to the
URI in the following format, ?option=value&option=value&...
URI OPTIONS
The following URI options are supported:
145
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
OSGI DEPLOYMENT
To use Hibernate Validator in the OSGi environment use dedicated ValidationProviderResolver
implementation, just as
org.apache.camel.component.bean.validator.HibernateValidationProviderResolver. The snippet
below demonstrates this approach. Keep in mind that you can use
HibernateValidationProviderResolver starting from the Camel 2.13.0.
from("direct:test")
.to("bean-validator://ValidationProviderResolverTest?
validationProviderResolver=#myValidationProviderResolver");
...
<bean id="myValidationProviderResolver"
class="org.apache.camel.component.bean.validator.HibernateValidationProviderResolver"/>
If no custom ValidationProviderResolver is defined and the validator component has been deployed
into the OSGi environment, the HibernateValidationProviderResolver will be automatically used.
EXAMPLE
Assumed we have a Java bean with the following annotations
CAR.JAVA
// Java
public class Car {
@NotNull
private String manufacturer;
@NotNull
@Size(min = 5, max = 14, groups = OptionalChecks.class)
private String licensePlate;
146
CHAPTER 12. BEAN VALIDATOR
OPTIONALCHECKS.JAVA
with the following Apache Camel route, only the @NotNull constraints on the attributes manufacturer
and licensePlate will be validated (Apache Camel uses the default group
javax.validation.groups.Default).
from("direct:start")
.to("bean-validator://x")
.to("mock:end")
If you want to check the constraints from the group OptionalChecks, you have to define the route like
this
from("direct:start")
.to("bean-validator://x?group=OptionalChecks")
.to("mock:end")
If you want to check the constraints from both groups, you have to define a new interface first
ALLCHECKS.JAVA
@GroupSequence({Default.class, OptionalChecks.class})
public interface AllChecks {
}
from("direct:start")
.to("bean-validator://x?group=AllChecks")
.to("mock:end")
And if you have to provide your own message interpolator, traversable resolver and constraint
validator factory, you have to write a route like this
from("direct:start")
.to("bean-validator://x?
group=AllChecks&messageInterpolator=#myMessageInterpolator&traversableResolver=#myTraversabl
eResolver&constraintValidatorFactory=#myConstraintValidatorFactory")
.to("mock:end")
It's also possible to describe your constraints as XML and not as Java annotations. In this case, you
have to provide the file META-INF/validation.xml which could looks like this
147
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
VALIDATION.XML
<constraint-mapping>/constraints-car.xml</constraint-mapping>
</validation-config>
CONSTRAINTS-CAR.XML
<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>
148
CHAPTER 13. BEANSTALK
BEANSTALK COMPONENT
Available in Camel 2.15
camel-beanstalk project provides a Camel component for job retrieval and post-processing of
Beanstalk jobs.
You can find the detailed explanation of Beanstalk job life cycle at Beanstalk protocol.
DEPENDENCIES
Maven users need to add the following dependency to their pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-beanstalk</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Camel (2.15.0 or higher).
URI FORMAT
beanstalk://[host[:port]][/tube][?options]
You may omit either port or both host and port: for the Beanstalk defaults to be used (“localhost” and
11300). If you omit tube, Beanstalk component will use the tube with name “default”.
When listening, you may probably want to watch for jobs from several tubes. Just separate them with
plus sign, e.g.
beanstalk://localhost:11300/tube1+tube2
Tube name will be URL decoded, so if your tube names include special characters like + or ?, you need
to URL-encode them appropriately, or use the RAW syntax, see more details here .
By the way, you cannot specify several tubes when you are writing jobs into Beanstalk.
149
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
command put
put means to put the job
into Beanstalk. Job body
is specified in the Camel
message body. Job ID
will be returned in
beanstalk.jobId message
header.
When synchronous, the consumer calls delete on successful job completion and calls bury on failure.
You can choose which command to execute in the case of failure by specifying consumer.onFailure
parameter in the URI. It can take values of bury, delete or release.
Be careful when specifying release, as the failed job will immediately become available in the same
tube and your consumer will try to acquire it again. You can release and specify jobDelay though.
150
CHAPTER 13. BEANSTALK
The beanstalk consumer is a Scheduled Polling Consumer which means there is more options you can
configure, such as how frequent the consumer should poll. For more details see Polling Consumer.
CONSUMER HEADERS
The consumer stores a number of job headers in the Exchange message:
151
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
EXAMPLES
This Camel component lets you both request the jobs for processing and supply them to Beanstalkd
daemon. Our simple demo routes may look like
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");
In the first route we are listening for new jobs in tube “testTube”. When they are arriving, we are trying
to parse integer value from the message body. If done successful, we log it and this successful
exchange completion makes Camel component to delete this job from Beanstalk automatically.
Contrary, when we cannot parse the job data, the exchange failed and the Camel component buries it
by default, so that it can be processed later or probably we are going to inspect failed jobs manually.
So the second route periodically requests Beanstalk to kick 10 jobs out of buried and/or delayed state
to the normal queue.
152
CHAPTER 14. BINDY
BINDY COMPONENT
The camel-bindy component enables the parsing and binding of non-structured data via Java Beans.
These Java Beans consists of binding mappings defined with annotations.
@CsvRecord(separator = ",")
public class Customer {
@DataField(pos = 1)
private String firstName;
@DataField(pos = 2)
private String lastName;
...
}
For example, You can also provide the data format BindyCsvDataFormat unmarshall CSV data to the
domain model.
camelctx.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.unmarshal(new BindyCsvDataFormat(Customer.class))
.to("mock:result");
}
});
camelctx.start();
153
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
BOX COMPONENT
Available as of Camel 2.14
The Box component provides access to all of the Box.com APIs accessible using box-java-sdk-v2. It
allows producing messages to upload and download files, create, edit, and manage folders, etc. It also
supports APIs that allow polling for updates to user accounts and even changes to enterprise accounts,
etc.
Box.com requires the use of OAuth2.0 for all client application authentication. In order to use camel-
box with your account, you'll need to create a new application within Box.com at
https://app.box.com/developers/services/edit/. The Box application's client id and secret will allow
access to Box APIs which require a current user. A user access token is generated and managed by the
API for an end user. Alternatively the Camel application can register an implementation of
com.box.boxjavalibv2.authorization.IAuthSecureStorage to provide an
com.box.boxjavalibv2.dao.IAuthData OAuth token.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-box</artifactId>
<version>${camel-version}</version>
</dependency>
URI FORMAT
box://endpoint-prefix/endpoint?[options]
collaborations
comments
events
files
folders
groups
poll-events
search
shared-comments
shared-files
shared-folders
154
CHAPTER 15. BOX
shared-items
users
BOX COMPONENT
The Box Component can be configured with the options below. These options can be provided using
the component's bean property configuration of type
org.apache.camel.component.box.BoxConfiguration. These options can also be specified in the
endpoint URI.
155
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PRODUCER ENDPOINTS:
Producer endpoints can use endpoint prefixes followed by endpoint names and associated options
described next. A shorthand alias can be used for some endpoints. The endpoint URI MUST contain a
prefix.
Endpoint options that are not mandatory are denoted by []. When there are no mandatory options for
an endpoint, one of the set of [] options MUST be provided. Producer endpoints can also use a special
option inBody that in turn should contain the name of the endpoint option whose value will be
contained in the Camel Exchange In message.
Any of the endpoint options can be provided in either the endpoint URI, or dynamically in a message
header. The message header name must be of the format CamelBox.<option>. Note that the inBody
option overrides message header, i.e. the endpoint option inBody=option would override a
CamelBox.option header.
If a value is not provided for the option defaultRequest either in the endpoint URI or in a message
header, it will be assumed to be null. Note that the null value will only be used if other options do not
satisfy matching endpoints.
In case of Box API errors the endpoint will throw a RuntimeCamelException with a
com.box.restclientv2.exceptions.BoxSDKException derived exception cause.
box://collaborations/endpoint?[options]
156
CHAPTER 15. BOX
Name Type
collabId String
collabRequest com.box.boxjavalibv2.requests.requestobjects.BoxC
ollabRequestObject
defaultRequest com.box.restclientv2.requestsbase.BoxDefaultRequ
estObject
folderId String
getAllCollabsRequest com.box.boxjavalibv2.requests.requestobjects.BoxG
etAllCollabsRequestObject
box://events/endpoint?[options]
157
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Type
defaultRequest com.box.restclientv2.requestsbase.BoxDefaultRequ
estObject
eventRequest com.box.boxjavalibv2.requests.requestobjects.BoxE
ventRequestObject
box://groups/endpoint?[options]
158
CHAPTER 15. BOX
Name Type
defaultRequest com.box.restclientv2.requestsbase.BoxDefaultRequ
estObject
groupId String
groupMembershipRequest com.box.boxjavalibv2.requests.requestobjects.BoxG
roupMembershipRequestObject
groupRequest com.box.boxjavalibv2.requests.requestobjects.BoxG
roupRequestObject
membershipId String
name String
role String
userId String
box://search/endpoint?[options]
Name Type
defaultRequest com.box.restclientv2.requestsbase.BoxDefaultRequ
estObject
searchQuery String
159
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
box://comments/endpoint?[options]
box://shared-comments/endpoint?[options]
Name Type
commentId String
commentRequest com.box.boxjavalibv2.requests.requestobjects.BoxC
ommentRequestObject
commentedItemId String
commentedItemType com.box.boxjavalibv2.dao.IBoxType
defaultRequest com.box.restclientv2.requestsbase.BoxDefaultRequ
estObject
message String
box://files/endpoint?[options]
box://shared-files/endpoint?[options]
160
CHAPTER 15. BOX
Name Type
defaultRequest com.box.restclientv2.requestsbase.BoxDefaultRequ
estObject
destination java.io.File
extension String
161
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Type
fileId String
fileRequest com.box.boxjavalibv2.requests.requestobjects.BoxFi
leRequestObject
fileUploadRequest com.box.restclientv2.requestsbase.BoxFileUploadR
equestObject
imageRequest com.box.boxjavalibv2.requests.requestobjects.BoxI
mageRequestObject
itemCopyRequest com.box.boxjavalibv2.requests.requestobjects.BoxIt
emCopyRequestObject
listener com.box.boxjavalibv2.filetransfer.IFileTransferListe
ner
outputStreams java.io.OutputStream[]
sharedLinkRequest com.box.boxjavalibv2.requests.requestobjects.BoxS
haredLinkRequestObject
box://folders/endpoint?[options]
box://shared-folders/endpoint?[options]
162
CHAPTER 15. BOX
Name Type
defaultRequest com.box.restclientv2.requestsbase.BoxDefaultRequ
estObject
folderDeleteRequest com.box.boxjavalibv2.requests.requestobjects.BoxF
olderDeleteRequestObject
folderId String
folderRequest com.box.boxjavalibv2.requests.requestobjects.BoxF
olderRequestObject
itemCopyRequest com.box.boxjavalibv2.requests.requestobjects.BoxIt
emCopyRequestObject
pagingRequest com.box.boxjavalibv2.requests.requestobjects.BoxP
agingRequestObject
sharedLinkRequest com.box.boxjavalibv2.requests.requestobjects.BoxS
haredLinkRequestObject
box://shared-items/endpoint?[options]
163
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Type
defaultRequest com.box.restclientv2.requestsbase.BoxDefaultRequ
estObject
box://users/endpoint?[options]
deleteEnterpriseUser userDeleteRequest,
userId
164
CHAPTER 15. BOX
Name Type
defaultRequest com.box.restclientv2.requestsbase.BoxDefaultRequ
estObject
emailAliasRequest com.box.boxjavalibv2.requests.requestobjects.BoxE
mailAliasRequestObject
emailId String
filterTerm String
folderId String
simpleUserRequest com.box.boxjavalibv2.requests.requestobjects.BoxSi
mpleUserRequestObject
userDeleteRequest com.box.boxjavalibv2.requests.requestobjects.BoxU
serDeleteRequestObject
userId String
userRequest com.box.boxjavalibv2.requests.requestobjects.BoxU
serRequestObject
userUpdateLoginRequest com.box.boxjavalibv2.requests.requestobjects.BoxU
serUpdateLoginRequestObject
CONSUMER ENDPOINTS:
For more information on Box events see https://developers.box.com/docs/#events and for long
polling see https://developers.box.com/docs/#events-long-polling. Consumer endpoints can only use
the endpoint prefix poll-events as shown in the example next. By default the consumer will split the
com.box.boxjavalibv2.dao.BoxEventCollection from every long poll and create an exchange for every
com.box.boxjavalibv2.dao.BoxEvent. To make the consumer return the entire collection in a single
exchange, use the URI option consumer.splitResult=false.
box://poll-events/endpoint?[options]
165
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Type
limit Integer
streamPosition Long
streamType String
splitResult boolean
MESSAGE HEADER
Any of the options can be provided in a message header for producer endpoints with CamelBox. prefix.
MESSAGE BODY
All result message bodies utilize objects provided by the Box Java SDK. Producer endpoints can
specify the option name for incoming message body in the inBody endpoint parameter.
TYPE CONVERTER
The Box component also provides a Camel type converter to convert GenericFile objects from File
component to a com.box.restclientv2.requestsbase.BoxFileUploadRequestObject to upload files to
Box.com. The target folderId for the upload can be specified in the exchange property
CamelBox.folderId. If the exchange property is not specified the value defaults to "0" for the root
folder ID.
USE CASES
The following route uploads new files to the user's root folder:
from("file:...")
.to("box://files/upload/inBody=fileUploadRequest");
from("box://poll-events/poll?streamPosition=-1&streamType=all&limit=100")
.to("bean:blah");
The following route uses a producer with dynamic header options. The fileId property has the Box file
id , so its assigned to the CamelBox.fileId header as follows:
from("direct:foo")
.setHeader("CamelBox.fileId", header("fileId"))
.to("box://files/download")
.to("file://...");
166
CHAPTER 16. BROWSE
BROWSE COMPONENT
Available as of Apache Camel 2.0
The Browse component provides a simple BrowsableEndpoint which can be useful for testing,
visualisation tools or debugging. The exchanges sent to the endpoint are all available to be browsed.
URI FORMAT
browse:someName
SAMPLE
In the route below, we insert a browse: component to be able to browse the Exchanges that are
passing through:
from("activemq:order.in").to("browse:orderReceived").to("bean:processOrder");
We can now inspect the received exchanges from within the Java code:
167
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The Cache consumer is an event based consumer and can be used to listen and respond to specific
cache activities. If you need to perform selections from a pre-existing cache, use the processors
defined for the cache component.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI format
cache://cacheName[?options]
You can append query options to the URI in the following format, ?
option=value&option=#beanRef&...
Options
The Cache component supports the following options:
168
CHAPTER 17. CACHE
MemoryStoreEvictionPol
icy.LFU - Least
frequently used
MemoryStoreEvictionPol
icy.LRU - Least recently
used
MemoryStoreEvictionPol
icy.FIFO - first in first
out, the oldest element
by creation time
169
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
170
CHAPTER 17. CACHE
Header Description
CamelCacheGet
CamelCacheCheck
CamelCacheAdd
CamelCacheUpdate
CamelCacheDelete
CamelCacheDeleteAll
171
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The header names and supported values have changed to be prefixed with CamelCache
and use mixed case. This makes them easier to identify and keep separate from other
headers. The CacheConstants variable names remain unchanged, just their values have
been changed. Also, these headers are now removed from the exchange after the cache
operation is performed.
Cache Producer
Sending data to the cache involves the ability to direct payloads in exchanges to be stored in a pre-
existing or created-on-demand cache. The mechanics of doing this involve
ensuring that the Message Exchange Body contains the message directed to the cache
Cache Consumer
Receiving data from the cache involves the ability of the CacheConsumer to listen on a pre-existing or
created-on-demand Cache using an event Listener and receive automatic notifications when any
cache activity take place (i.e
CamelCacheGet/CamelCacheUpdate/CamelCacheDelete/CamelCacheDeleteAll). Upon such an
activity taking place
an exchange containing Message Exchange Headers and a Message Exchange Body containing
the just added/updated payload is placed and sent.
Cache Processors
There are a set of nice processors with the ability to perform cache lookups and selectively replace
payload content at the
body
token
xpath level
172
CHAPTER 17. CACHE
from("cache://MyApplicationCache" +
"?maxElementsInMemory=1000" +
"&memoryStoreEvictionPolicy=" +
"MemoryStoreEvictionPolicy.LFU" +
"&overflowToDisk=true" +
"&eternal=true" +
"&timeToLiveSeconds=300" +
"&timeToIdleSeconds=true" +
"&diskPersistent=true" +
"&diskExpiryThreadIntervalSeconds=300")
173
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
174
CHAPTER 17. CACHE
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");
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();
Management of EHCache
EHCache has its own statistics and management from JMX.
Here's a snippet on how to expose them via JMX in a Spring application context:
175
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<constructor-arg value="true"/>
<constructor-arg value="true"/>
<constructor-arg value="true"/>
<constructor-arg value="true"/>
</bean>
You can get cache hits, misses, in-memory hits, disk hits, size stats this way. You can also change
CacheConfiguration parameters on the fly.
cacheManagerFactory
eventListenerRegistry
cacheLoaderRegistry
Configuring Camel Cache replication using the first option is a bit of hard work as you have to configure
all caches separately. So in a situation when the all names of caches are not known, using ehcache.xml
is not a good idea.
The second option is much better when you want to use many different caches as you do not need to
define options per cache. This is because replication options are set per CacheManager and per
CacheEndpoint. Also it is the only way when cache names are not know at the development phase.
NOTE
It might be useful to read the EHCache manual to get a better understanding of the
Camel Cache replication mechanism.
17.2. CACHEREPLICATIONJMSEXAMPLE
176
CHAPTER 17. CACHE
NOTE
Please note, that this example is not finished yet. It is based on OSGi iTest instead of
real life example. But no matter to that it is very good staring point for all Camel Cache
Riders!
JMS replication is the most powerful and secured way. Used altogether with Camel Cache replication
options is also the most easy way. This basic example is divided to few important steps that have to be
made to get the cache replication to work.
[...]
@Override
protected synchronized CacheManager createCacheManagerInstance() {
//Singleton
if (cacheManager == null) {
cacheManager = new WrappedCacheManager(getClass().getResourceAsStream(xmlName));
}
return cacheManager;
}
Next step is to write your own implementation of CacheLoaderWrapper, the easiest one is:
177
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
[...]
@Override
public void init(Ehcache cache) {
jmsCacheLoader = new JMSCacheLoader(cache, defaultLoaderArgument,
getQueueConnection, getQueue, acknowledgementMode,
timeoutMillis);
}
@Override
public CacheLoader clone(Ehcache arg0) throws CloneNotSupportedException {
return jmsCacheLoader.clone(arg0);
}
@Override
public void dispose() throws CacheException {
jmsCacheLoader.dispose();
}
[...]
At the third step you can take care about Camel Cache options (prepare their values):
cacheManagerFactory
eventListenerRegistry
cacheLoaderRegistry
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-
spring.xsd">
178
CHAPTER 17. CACHE
<bean id="eventListenerRegistry1"
class="org.apache.camel.component.cache.CacheEventListenerRegistry">
<constructor-arg>
<list>
<ref bean="jmsListener1" />
</list>
</constructor-arg>
</bean>
<bean id="cacheLoaderRegistry1"
class="org.apache.camel.component.cache.CacheLoaderRegistry">
<constructor-arg>
<list>
<ref bean="jmsLoader1"/>
</list>
</constructor-arg>
</bean>
</beans>
<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="
179
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-
spring.xsd">
<camelContext xmlns="http://camel.apache.org/schema/spring">
<camel:endpoint id="fooCache1" uri="cache:foo?
cacheManagerFactory=#cacheManagerFactory1&ventListenerRegistry=#eventListenerRegistry1&acheL
oaderRegistry=#cacheLoaderRegistry1"/>
<camel:route>
<camel:from uri="direct:addRoute"/>
<camel:setHeader headerName="CamelCacheOperation">
<camel:constant>CamelCacheAdd</camel:constant>
</camel:setHeader>
<camel:setHeader headerName="CamelCacheKey">
<camel:constant>foo</camel:constant>
</camel:setHeader>
<camel:to ref="fooCache1"/>
</camel:route>
</camelContext>
</beans>
180
CHAPTER 18. CDI
CDI COMPONENT
The camel-cdi component provides CDI integration.
The following example illustrates how to provide and consume a context with an associated route:
@Startup
@ApplicationScoped
@ContextName("cdi-context")
public class MyRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:start").transform(body().prepend("Hi"));
}
}
The following example illustrates how to inject a Camel context into a private field:
@Inject
@ContextName("cdi-context")
private CamelContext camelctx;
NOTE
For more information related to Apache Camel in a CDI environment, refer Camel CDI.
181
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Apache Cassandra is an open source NoSQL database designed to handle large amounts on
commodity hardware. Like Amazon's DynamoDB, Cassandra has a peer-to-peer and master-less
architecture to avoid single point of failure and garanty high availability. Like Google's BigTable,
Cassandra data is structured using column families which can be accessed through the Thrift RPC API
or a SQL-like API called CQL.
This component aims at integrating Cassandra 2.0+ using the CQL3 API (not the Thrift API). It's based
on Cassandra Java Driver provided by DataStax.
Maven users will need to add the following dependency to their 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>
URI FORMAT
The endpoint can initiate the Cassandra connection or use an existing one.
URI Description
To fine tune the Cassandra connection (SSL options, pooling options, load balancing policy, retry
policy, reconnection policy...), create your own Cluster instance and give it to the Camel endpoint.
ENDPOINT OPTIONS
182
CHAPTER 19. CASSANDRA
MESSAGES
INCOMING MESSAGE
The Camel Cassandra endpoint expects a bunch of simple objects (Object or Object[] or
Collection<Object>) which will be bound to the CQL statement as query parameters. If message body
is null or empty, then CQL query will be executed without binding parameters.
Headers:
OUTGOING MESSAGE
The Camel Cassandra endpoint produces one or many a Cassandra Row objects depending on the
resultSetConversionStrategy:
REPOSITORIES
Cassandra can be used to store message keys or messages for the idempotent and aggregation EIP.
Cassandra might not be the best tool for queuing use cases yet, read Cassandra anti-patterns queues
and queue like datasets. It's advised to use LeveledCompaction and a small GC grace setting for these
tables to allow tombstoned rows to be removed quickly.
183
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
IDEMPOTENT REPOSITORY
The NamedCassandraIdempotentRepository stores messages keys in a Cassandra table like this:
This repository implementation uses lightweight transactions (also known as Compare and Set) and
requires Cassandra 2.0.7+.
Alternatively, the CassandraIdempotentRepository does not have a NAME column and can be
extended to use a different data model.
AGGREGATION REPOSITORY
The NamedCassandraAggregationRepository stores exchanges by correlation key in a Cassandra
table like this:
184
CHAPTER 19. CASSANDRA
Alternatively, the CassandraAggregationRepository does not have a NAME column and can be
extended to use a different data model.
185
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CHUNK COMPONENT
Available as of Camel 2.15
The chunk: component allows for processing a message using a Chunk template. This can be ideal
when using Templating to generate responses for requests.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
chunk:templateName[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
Chunk component will look for a specific template in themes folder with extensions .chtml or .cxml. If
you need to specify a different folder or extensions, you will need to use the specific options listed
above.
186
CHAPTER 20. CHUNK
CHUNK CONTEXT
Camel will provide exchange information in the Chunk context (just a Map). The Exchange is
transferred as:
key value
DYNAMIC TEMPLATES
Camel provides two headers by which you can define a different resource location for a template or the
template content itself. If any of these headers is set then Camel uses this over the endpoint configured
resource. This allows you to provide a dynamic template at runtime.
SAMPLES
For example you could use something like:
from("activemq:My.Queue").
to("chunk:template");
To use a Chunk template to formulate a response for a message for InOut message exchanges (where
there is a JMSReplyTo header).
187
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
If you want to use InOnly and consume the message and send it to another destination you could use:
from("activemq:My.Queue").
to("chunk:template").
to("activemq:Another.Queue");
It's possible to specify what template the component should use dynamically via a header, so for
example:
from("direct:in").
setHeader(ChunkConstants.CHUNK_RESOURCE_URI).constant("template").
to("chunk:dummy");
from("direct:in").
to("chunk:file_example?themeFolder=template&themeSubfolder=subfolder&extension=chunk");
In this example Chunk component will look for the file file_example.chunk in the folder
template/subfolder.
188
CHAPTER 21. CLASS
CLASS COMPONENT
Available as of Apache Camel 2.4
The class: component binds beans to message exchanges. It works in the same way as the Bean
component but instead of looking up beans from a Registry it creates the bean based on the class
name.
URI FORMAT
class:className[?options]
Where className is the fully qualified class name to create and use as bean.
OPTIONS
You can append query options to the URI in the following format, ?option=value&option=value&...
USING
You simply use the class component just as the Bean component but by specifying the fully qualified
classname instead. For example to use the MyFooBean you have to do as follows:
from("direct:start").to("class:org.apache.camel.component.bean.MyFooBean").to("mock:result");
You can also specify which method to invoke on the MyFooBean, for example hello:
from("direct:start").to("class:org.apache.camel.component.bean.MyFooBean?
method=hello").to("mock:result");
189
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:start")
.to("class:org.apache.camel.component.bean.MyPrefixBean?prefix=Bye")
.to("mock:result");
And you can also use the # syntax to refer to properties to be looked up in the Registry.
from("direct:start")
.to("class:org.apache.camel.component.bean.MyPrefixBean?cool=#foo")
.to("mock:result");
Which will lookup a bean from the Registry with the id foo and invoke the setCool method on the
created instance of the MyPrefixBean class.
NOTE
See more details at the Bean component as the class component works in much the
same way.
Bean
Bean Binding
Bean Integration
190
CHAPTER 22. CMIS
CMIS COMPONENT
Available as of Camel 2.11 The cmis component uses the Apache Chemistry client API and allows you
to add/read nodes to/from a CMIS compliant content repositories.
URI FORMAT
cmis://cmisServerUrl[?options]
You can append query options to the URI in the following format, ?options=value&option2=value&...
URI OPTIONS
191
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
USAGE
192
CHAPTER 22. CMIS
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-cmis</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Camel (2.11 or higher).
193
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
COMETD COMPONENT
The cometd: component is a transport for working with the jetty implementation of the
cometd/bayeux protocol. Using this component in combination with the dojo toolkit library it's
possible to push Apache Camel messages directly into the browser using an AJAX based mechanism.
URI FORMAT
cometd://host:port/channelName[?options]
The channelName represents a topic that can be subscribed to by the Apache Camel endpoints.
EXAMPLES
cometd://localhost:8080/service/mychannel
cometds://localhost:8443/service/mychannel
OPTIONS
194
CHAPTER 23. COMETD
195
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can append query options to the URI in the following format, ?option=value&option=value&...
For file (when the Webapp resources are located in the Web Application directory)
cometd://localhost:8080?resourceBase=file./webapp. For classpath (when the web resources are
packaged inside the Webapp folder) cometd://localhost:8080?resourceBase=classpath:webapp.
AUTHENTICATION
Available as of Camel 2.8
You can configure custom SecurityPolicy and Extension's to the CometdComponent which allows
you to use authentication as documented here
...
<camel:sslContextParameters
id="sslContextParameters">
<camel:keyManagers
196
CHAPTER 23. COMETD
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>
197
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CONTEXT COMPONENT
Available as of Camel 2.7
The context component allows you to create new Camel Components from a CamelContext with a
number of routes which is then treated as a black box, allowing you to refer to the local endpoints
within the component from other CamelContexts.
It is similar to the Routebox component in idea, though the Context component tries to be really
simple for end users; just a simple convention over configuration approach to refer to local endpoints
inside the CamelContext Component.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-context</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
context:camelContextId:localEndpointName[?options]
camelContextId:localEndpointName[?options]
camelContextId is the ID you used to register the CamelContext into the Registry.
localEndpointName can be a valid Camel URI evaluated within the black box CamelContext. Or
it can be a logical name which is mapped to any local endpoints. For example if you locally have
endpoints like direct:invoices and seda:purchaseOrders inside a CamelContext of id
supplyChain, then you can just use the URIs supplyChain:invoices or
supplyChain:purchaseOrders to omit the physical endpoint kind and use pure logical URIs.
You can append query options to the URI in the following format, ?option=value&option=value&...
EXAMPLE
In this example we'll create a black box context, then we'll use it from another CamelContext.
198
CHAPTER 24. CONTEXT
This can be done in the usual Camel way from this test case (see the createRegistry() method); this
example shows Java and JNDI being used...
// lets create our black box as a camel context and a set of routes
DefaultCamelContext blackBox = new DefaultCamelContext(registry);
blackBox.setName("blackBox");
blackBox.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
// receive purchase orders, lets process it in some way then send an invoice
// to our invoice endpoint
from("direct:purchaseOrder").
setHeader("received").constant("true").
to("direct:invoice");
}
});
blackBox.start();
registry.bind("accounts", blackBox);
Notice in the above route we are using pure local endpoints (direct and seda). Also note we expose
this CamelContext using the accounts ID. We can do the same thing in Spring via
If you prefer to be more verbose and explicit you could use context:accounts:purchaseOrder or even
context:accounts:direct://purchaseOrder if you prefer. But using logical endpoint URIs is preferred
as it hides the implementation detail and provides a simple logical naming scheme.
For example if we wish to then expose this accounts black box on some middleware (outside of the
black box) we can do things like...
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<!-- consume from an ActiveMQ into the black box -->
<from uri="activemq:Accounts.PurchaseOrders"/>
<to uri="accounts:purchaseOrders"/>
</route>
<route>
<!-- lets send invoices from the black box to a different ActiveMQ Queue -->
<from uri="accounts:invoice"/>
199
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<to uri="activemq:UK.Accounts.Invoices"/>
</route>
</camelContext>
NAMING ENDPOINTS
A context component instance can have many public input and output endpoints that can be accessed
from outside it's CamelContext. When there are many it is recommended that you use logical names for
them to hide the middleware as shown above.
However when there is only one input, output or error/dead letter endpoint in a component we
recommend using the common posix shell names in, out and err
200
CHAPTER 25. CONTROLBUS COMPONENT
CONTROLBUS COMPONENT
Available as of Camel 2.11
The controlbus: component provides easy management of Camel applications based on the Control
Bus EIP pattern . For example, by sending a message to an endpoint, you can control the lifecycle of
routes or gather performance statistics.
controlbus:command[?options]
Where command can be any string to identify which type of command to use.
COMMANDS
Command Description
OPTIONS
201
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can append query options to the URI in the following format, ?option=value&option=value&...
SAMPLES
template.sendBody("controlbus:route?routeId=foo&action=start", null);
202
CHAPTER 25. CONTROLBUS COMPONENT
This requires JMX to be enabled (is by default) then you can get the performance statics per route, or
for the CamelContext. For example to get the statics for a route named foo, we can do:
The returned statics is in XML format. Its the same data you can get from JMX with the
dumpRouteStatsAsXml operation on the ManagedRouteMBean.
To get statics for the entire CamelContext you just omit the routeId parameter as shown below:
template.sendBody("controlbus:language:simple", "${camelContext.stopRoute('myRoute')}");
As this is a void operation, no result is returned. However, if you want the route status you can do:
Notice: its easier to use the route command to control lifecycle of routes. The language command
allows you to execute a language script that has stronger powers such as Groovy or to some extend
the Simple language.
template.sendBody("controlbus:language:simple?async=true", "${camelContext.stop()}");
Notice we use async=true to stop Camel asynchronously as otherwise we would be trying to stop
Camel while it was in-flight processing the message we sent to the control bus component.
NOTE
ControlBus EIP
JMX Component
203
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The couchdb: component allows you to treat CouchDB instances as a producer or consumer of
messages. Using the lightweight LightCouch API, this camel component has the following features:
As a consumer, monitors couch changesets for inserts, updates and deletes and publishes
these as messages into camel routes.
Can support as many endpoints as required, eg for multiple databases across multiple
instances.
Ability to have events trigger for only deletes, only inserts/updates or all (default).
Headers set for sequenceId, document revision, document id, and HTTP method type.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
couchdb:http://hostname[:port]/database?[options]
Where hostname is the hostname of the running couchdb instance. Port is optional and if not specified
then defaults to 5984.
OPTIONS
204
CHAPTER 26. COUCHDB
HEADERS
The following headers are set on exchanges during message transport.
Property Value
Headers are set by the consumer once the message is received. The producer will also set the headers
for downstream processors once the insert/update has taken place. Any headers set prior to the
producer are ignored. That means for example, if you set CouchDbId as a header, it will not be used as
the id for insertion, the id of the document will still be used.
MESSAGE BODY
The component will use the message body as the document to be inserted. If the body is an instance of
String, then it will be marshalled into a GSON object before insert. This means that the string must be
valid JSON or the insert / update will fail. If the body is an instance of a com.google.gson.JsonElement
then it will be inserted as is. Otherwise the producer will throw an exception of unsupported body type.
SAMPLES
For example if you wish to consume all inserts, updates and deletes from a CouchDB instance running
locally, on port 9999 then you could use the following:
from("couchdb:http://localhost:9999").process(someProcessor);
If you were only interested in deletes, then you could use the following
from("couchdb:http://localhost:9999?updates=false").process(someProcessor);
205
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
If you wanted to insert a message as a document, then the body of the exchange is used
from("someProducingEndpoint").process(someProcessor).to("couchdb:http://localhost:9999")
206
CHAPTER 27. CRYPTO (DIGITAL SIGNATURES)
Using Apache Camel cryptographic endpoints and Java's Cryptographic extension it is easy to create
Digital Signatures for Exchanges. Apache Camel provides a pair of flexible endpoints which get used in
concert to create a signature for an exchange in one part of the exchange's workflow and then verify
the signature in a later part of the workflow.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
It is easy to create digital signatures for exchanges with the help of camel cryptographic endpoints and
Java's cryptographic extension. However, Camel also provides a pair of flexible endpoints. Initially, it
creates a signature for an exchange and then verify the signature in the later part of the workflow.
For example, you can start by loading a keystore for binding to JNDI, so that Camel can locate it from
the bean registry, as follows:
// Java
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream in = getClass().getResourceAsStream("/my-keystore.ks");
keystore.load(in, "my-keystore-password".toCharArray());
Certificate cert = keystore.getCertificate("my-certificate-alias");
207
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
// Java
CamelContext camelContext = new DefaultCamelContext();
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:sign")
.to("crypto:sign://basic?privateKey=#myPrivateKey")
.to("direct:verify");
from("direct:verify")
.to("crypto:verify://basic?publicKey=#myPublicKey")
.to("mock:result");
}
});
INTRODUCTION
Digital signatures make use Asymmetric Cryptographic techniques to sign messages. From a (very)
high level, the algorithms use pairs of complimentary keys with the special property that data
encrypted with one key can only be decrypted with the other. One, the private key, is closely guarded
and used to 'sign' the message while the other, public key, is shared around to anyone interested in
verifying your messages. Messages are signed by encrypting a digest of the message with the private
key. This encrypted digest is transmitted along with the message. On the other side the verifier
recalculates the message digest and uses the public key to decrypt the the digest in the signature. If
both digest match the verifier knows only the holder of the private key could have created the
signature.
Apache Camel uses the Signature service from the Java Cryptographic Extension to do all the heavy
cryptographic lifting required to create exchange signatures. The following are some excellent sources
for explaining the mechanics of Cryptography, Message digests and Digital Signatures and how to
leverage them with the JCE.
URI FORMAT
As mentioned Apache Camel provides a pair of crypto endpoints to create and verify signatures
crypto:sign:name[?options]
crypto:verify:name[?options]
crypto:sign creates the signature and stores it in the Header keyed by the constant
Exchange.SIGNATURE, i.e. "CamelDigitalSignature".
crypto:verify will read in the contents of this header and do the verification calculation.
In order to correctly function, sign and verify need to share a pair of keys, sign requiring a PrivateKey
and verify a PublicKey (or a Certificate containing one). Using the JCE is is very simple to generate
these key pairs but it is usually most secure to use a KeyStore to house and share your keys. The DSL is
very flexible about how keys are supplied and provides a number of mechanisms.
208
CHAPTER 27. CRYPTO (DIGITAL SIGNATURES)
Note a crypto:sign endpoint is typically defined in one route and the complimentary crypto:verify in
another, though for simplicity in the examples they appear one after the other. It goes without saying
that both sign and verify should be configured identically.
OPTIONS
209
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1) RAW KEYS
The most basic way to way to sign and verify an exchange is with a KeyPair as follows.
from("direct:keypair").to("crypto:sign://basic?privateKey=#myPrivateKey", "crypto:verify://basic?
publicKey=#myPublicKey", "mock:result");
The same can be achieved with the Spring XML Extensions using references to keys
<route>
<from uri="direct:keypair"/>
<to uri="crypto:sign://basic?privateKey=#myPrivateKey" />
<to uri="crypto:verify://basic?publicKey=#myPublicKey" />
<to uri="mock:result"/>
</route>
The examples use a Keystore with a key and cert aliased by 'bob'. The password for the keystore and
the key is 'letmein'
The following shows how to use a Keystore via the Fluent builders, it also shows how to load and
initialize the keystore.
from("direct:keystore").to("crypto:sign://keystore?keystore=#keystore&alias=bob&password=letmein",
"crypto:verify://keystore?keystore=#keystore&alias=bob", "mock:result");
<route>
<from uri="direct:keystore"/>
<to uri="crypto:sign://keystore?keystore=#keystore&lias=bob&assword=letmein" />
<to uri="crypto:verify://keystore?keystore=#keystore&lias=bob" />
<to uri="mock:result"/>
</route>
210
CHAPTER 27. CRYPTO (DIGITAL SIGNATURES)
from("direct:provider").to("crypto:sign://provider?privateKey=#myPrivateKey&provider=SUN",
"crypto:verify://provider?publicKey=#myPublicKey&provider=SUN", "mock:result");
or
<route>
<from uri="direct:algorithm"/>
<to uri="crypto:sign://rsa?algorithm=MD5withRSA&rivateKey=#rsaPrivateKey" />
<to uri="crypto:verify://rsa?algorithm=MD5withRSA&ublicKey=#rsaPublicKey" />
<to uri="mock:result"/>
</route>
<route>
<from uri="direct:provider"/>
<to uri="crypto:sign://provider?privateKey=#myPrivateKey&rovider=SUN" />
<to uri="crypto:verify://provider?publicKey=#myPublicKey&rovider=SUN" />
<to uri="mock:result"/>
</route>
from("direct:signature-header").to("crypto:sign://another?
privateKey=#myPrivateKey&signatureHeader=AnotherDigitalSignature",
"crypto:verify://another?
publicKey=#myPublicKey&signatureHeader=AnotherDigitalSignature", "mock:result");
or
<route>
<from uri="direct:signature-header"/>
<to uri="crypto:sign://another?
211
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
privateKey=#myPrivateKey&ignatureHeader=AnotherDigitalSignature" />
<to uri="crypto:verify://another?
publicKey=#myPublicKey&ignatureHeader=AnotherDigitalSignature" />
<to uri="mock:result"/>
</route>
from("direct:buffersize").to("crypto:sign://buffer?privateKey=#myPrivateKey&buffersize=1024",
"crypto:verify://buffer?publicKey=#myPublicKey&buffersize=1024", "mock:result");
or
<route>
<from uri="direct:buffersize" />
<to uri="crypto:sign://buffer?privateKey=#myPrivateKey&uffersize=1024" />
<to uri="crypto:verify://buffer?publicKey=#myPublicKey&uffersize=1024" />
<to uri="mock:result"/>
</route>
Exchange.SIGNATURE_PRIVATE_KEY, "CamelSignaturePrivateKey"
Exchange.SIGNATURE_PUBLIC_KEY_OR_CERT, "CamelSignaturePublicKeyOrCert"
from("direct:headerkey-sign").to("crypto:sign://alias");
from("direct:headerkey-verify").to("crypto:verify://alias", "mock:result");
or
<route>
<from uri="direct:headerkey-sign"/>
<to uri="crypto:sign://headerkey" />
</route>
<route>
<from uri="direct:headerkey-verify"/>
<to uri="crypto:verify://headerkey" />
<to uri="mock:result"/>
</route>
Better again would be to dynamically supply a keystore alias. Again the alias can be supplied in a
message header
Exchange.KEYSTORE_ALIAS, "CamelSignatureKeyStoreAlias"
212
CHAPTER 27. CRYPTO (DIGITAL SIGNATURES)
from("direct:alias-sign").to("crypto:sign://alias?keystore=#keystore");
from("direct:alias-verify").to("crypto:verify://alias?keystore=#keystore", "mock:result");
or
<route>
<from uri="direct:alias-sign"/>
<to uri="crypto:sign://alias?keystore=#keystore" />
</route>
<route>
<from uri="direct:alias-verify"/>
<to uri="crypto:verify://alias?keystore=#keystore" />
<to uri="mock:result"/>
</route>
See also:
213
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CXF COMPONENT
The cxf: component provides integration with Apache CXF for connecting to JAX-WS services hosted
in CXF.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
NOTE
If you want to learn about CXF dependencies, see the WHICH-JARS text file.
NOTE
When using CXF as a consumer, the CAMEL:CXF Bean Component allows you to factor
out how message payloads are received from their processing as a RESTful or SOAP
web service. This has the potential of using a multitude of transports to consume web
services. The bean component's configuration is also simpler and provides the fastest
method to implement web services using Camel and CXF.
NOTE
When using CXF in streaming modes (see DataFormat option), then also read about
Stream caching.
The CXF component integrates with the JBoss EAP webservices susbsystem that also uses Apache
CXF. For more information, see JAX-WS.
NOTE
At present, the Camel on EAP subsystem does not support CXF or Restlet consumers.
However, it is possible to mimic CXF consumer behaviour, using the CamelProxy.
URI FORMAT
cxf:bean:cxfEndpoint[?options]
214
CHAPTER 28. CXF
Where cxfEndpoint represents a bean ID that references a bean in the Spring bean registry. With this
URI format, most of the endpoint details are specified in the bean definition.
cxf://someAddress[?options]
Where someAddress specifies the CXF endpoint's address. With this URI format, most of the endpoint
details are specified using options.
For either style above, you can append options to the URI as follows:
cxf:bean:cxfEndpoint?wsdlURL=wsdl/hello_world.wsdl&dataFormat=PAYLOAD
OPTIONS
file://local/wsdl/hello.wsdl or
wsdl/hello.wsdl
215
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
For example:
org.apache.camel.Hello
serviceName Only if more than one The service name this service is
serviceName present in WSDL implementing, it maps to the
wsdl:service@name. For
example:
{http://org.apache.camel}Ser
viceName
endpointName Only if more than one portName The port name this service is
under the serviceName is implementing, it maps to the
wsdl:port@name. For example:
present, and it is required for
camel-cxf consumer since camel {http://org.apache.camel}Por
2.2 tName
216
CHAPTER 28. CXF
217
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
defaultOperationName=greet
Me
defaultOperationNamespace
=
http://apache.org/hello_world
_soap_http
publshedEndpointUrl=http://
example.com/service
218
CHAPTER 28. CXF
219
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The serviceName and portName are QNames, so if you provide them be sure to prefix them with their
{namespace} as shown in the examples above.
DataFormat Description
You can determine the data format mode of an exchange by retrieving the exchange property,
CamelCXFDataFormat. The exchange key constant is defined in
org.apache.camel.component.cxf.CxfConstants.DATA_FORMAT_PROPERTY.
220
CHAPTER 28. CXF
Since Camel 2.8, there is support for using Aries blueprint dependency injection for your CXF
endpoints. The schema is very similar to the Spring schema, so the transition is fairly transparent.
For example:
<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
http://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>
<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
http://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"
221
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
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>
The in-band headers are headers that are explicitly defined as part of the WSDL binding contract for an
endpoint such as SOAP headers.
The out-of-band headers are headers that are serialized over the wire, but are not explicitly part of the
WSDL binding contract.
222
CHAPTER 28. CXF
When a route has a CXF endpoint and the developer needs to have on-the-wire headers, such as SOAP
headers, be relayed along the route to be consumed say by another JAXWS endpoint, then
relayHeaders should be set to true, which is the default value.
The relayHeaders=false setting asserts that all headers, in-band and out-of-band, will be dropped.
You can plugin your own MessageHeadersRelay implementations overriding or adding additional
ones to the list of relays. In order to override a preloaded relay instance just make sure that your
MessageHeadersRelay implementation services the same name spaces as the one you looking to
override. Also note, that the overriding relay has to service all of the name spaces as the one you
looking to override, or else a runtime exception on route start up will be thrown as this would
introduce an ambiguity in name spaces to relay instance mappings.
<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"/>
Take a look at the tests that show how you'd be able to relay/drop headers here:
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
The Message Header Relay mechanism has been merged into CxfHeaderFilterStrategy. The
relayHeaders option, its semantics, and default value remain the same, but it is a property of
CxfHeaderFilterStrategy. Here is an example of configuring it.
223
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<bean id="dropAllMessageHeadersStrategy"
class="org.apache.camel.component.cxf.common.header.CxfHeaderFilterStrategy">
</bean>
<route>
<from uri="cxf:bean:routerNoRelayEndpoint?
headerFilterStrategy=#dropAllMessageHeadersStrategy"/>
<to uri="cxf:bean:serviceNoRelayEndpoint?
headerFilterStrategy=#dropAllMessageHeadersStrategy"/>
</route>
The MessageHeadersRelay interface has changed slightly and has been renamed to
MessageHeaderFilter. It is a property of CxfHeaderFilterStrategy. Here is an example of
configuring user defined Message Header Filters:
<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"/>
Other than relayHeaders, there are new properties that can be configured in
CxfHeaderFilterStrategy.
224
CHAPTER 28. 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 ">
...
NOTE
Be sure to include the JAX-WS schemaLocation attribute specified on the root beans element. This
allows CXF to validate the file and is required. Also note the namespace declarations at the end of the
<cxf:cxfEndpoint/> tag--these are required because the combined {namespace}localName syntax is
presently not supported for this tag's attribute values.
225
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Value
Name Value
226
CHAPTER 28. CXF
cxf:serviceFactory The service factory for this endpoint to use. This can
be supplied using the Spring <bean
class="MyServiceFactory"/> syntax
You can find more advanced examples which show how to provide interceptors, properties and
handlers here: http://cwiki.apache.org/CXF20DOC/jax-ws-configuration.html
NOTE
You can use CXF:properties to set the CXF endpoint's dataFormat and setDefaultBus
properties from a Spring configuration file, as follows:
227
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Error:sendSms: SoapFault exception: [Client] looks like we got no XML document in [...]
To resolved this issue, you just need to tell StaxOutInterceptor to write the XML start document for
you.
You can add a customer interceptor like this and configure it into you 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>
Or adding a message header for it like this if you are using Camel 2.4.
228
CHAPTER 28. CXF
The camel-cxf endpoint consumer POJO data format is based on the cxf invoker, so the message
header has a property with the name of CxfConstants.OPERATION_NAME and the message body is a
list of the SEI method parameters.
@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);
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});
}
229
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
this parameter list. The response message's body is a messageContentsList, you can get the result
from that list.
If you don't specify the operation name in the message header, CxfProducer will try to use the
defaultOperationName from CxfEndpoint. If there is no defaultOperationName set on CxfEndpoint,
it will pick up the first operation name from the operation list.
If you want to get the object array from the message body, you can get the body using
message.getbody(Object[].class), as follows:
230
CHAPTER 28. CXF
The following example illustrates how to get/set SOAP headers. Suppose we have a route that
forwards from one CXF endpoint to another. That is, SOAP Client -> Apache Camel -> CXF service. We
can attach two processors to obtain/insert SOAP headers at (1) before request goes out to the CXF
service and (2) before response comes back to the SOAP Client. Processor (1) and (2) in this example
are InsertRequestOutHeaderProcessor and InsertResponseOutHeaderProcessor. Our route looks like
this:
<route>
<from uri="cxf:bean:routerRelayEndpointWithInsertion"/>
<process ref="InsertRequestOutHeaderProcessor" />
<to uri="cxf:bean:serviceRelayEndpointWithInsertion"/>
<process ref="InsertResponseOutHeaderProcessor" />
</route>
In 2.x SOAP headers are propagated to and from Apache Camel Message headers. The Apache Camel
message header name is org.apache.cxf.headers.Header.list, which is a constant defined in CXF
(org.apache.cxf.headers.Header.HEADER_LIST). The header value is a List<> of CXF SoapHeader
objects (org.apache.cxf.binding.soap.SoapHeader). The following snippet is the
InsertResponseOutHeaderProcessor (that inserts a new SOAP header in the response message). The
231
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
@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>();
}
Once you obtain a CxfPayload object, you can invoke the CxfPayload.getHeaders() method that
returns a List of DOM Elements (SOAP headers).
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());
232
CHAPTER 28. CXF
})
.to(getServiceEndpointURI());
from(routerEndpointURI).setFaultBody(constant(SOAP_FAULT));
If your CXF endpoint is working in the MESSAGE data format, you could set the the SOAP Fault
message in the message body and set the response code in the message header.
from(routerEndpointURI).process(new Processor() {
});
The same is true for the POJO data format. You can set the SOAP Fault on the Out body and also
indicate it's a fault by calling Message.setFault(true), as follows:
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);
233
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
exchange.getOut().setFault(true);
exchange.getOut().setBody(fault);
}
}).end().to(serviceURI);
ATTACHMENT SUPPORT
POJO Mode: Both SOAP with Attachment and MTOM are supported (see example in Payload Mode for
enabling MTOM). However, SOAP with Attachment is not tested. Since attachments are marshalled and
unmarshalled into POJOs, users typically do not need to deal with the attachment
themself. Attachments are propagated to Camel message's attachments since 2.1. So, it is possible to
retreive attachments by Camel Message API
234
CHAPTER 28. CXF
Payload Mode: MTOM is supported since 2.1. Attachments can be retrieved by Camel Message APIs
mentioned above. SOAP with Attachment is not supported as there is no SOAP processing in this
mode.
To enable MTOM, set the CXF endpoint property "mtom_enabled" to true. (I believe you can only do it
with 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>
You can produce a Camel message with attachment to send to a CXF endpoint in Payload mode.
exchange.getIn().addAttachment(MtomTestHelper.REQ_IMAGE_CID,
new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
});
// process response
235
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
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());
You can also consume a Camel message received from a CXF endpoint in Payload mode.
@SuppressWarnings("unchecked")
public void process(Exchange exchange) throws Exception {
CxfPayload<SoapHeader> in = exchange.getIn().getBody(CxfPayload.class);
// verify request
assertEquals(1, in.getBody().size());
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);
236
CHAPTER 28. CXF
assertEquals("image/jpeg", dr.getContentType());
MtomTestHelper.assertEquals(MtomTestHelper.requestJpeg,
IOUtils.readBytesFromStream(dr.getInputStream()));
// create response
List<Source> elements = new ArrayList<Source>();
elements.add(new DOMSource(DOMUtils.readXml(new
StringReader(MtomTestHelper.RESP_MESSAGE)).getDocumentElement()));
CxfPayload<SoapHeader> sbody = new CxfPayload<SoapHeader>(new
ArrayList<SoapHeader>(),
elements, null);
exchange.getOut().setBody(sbody);
exchange.getOut().addAttachment(MtomTestHelper.RESP_PHOTO_CID,
new DataHandler(new ByteArrayDataSource(MtomTestHelper.RESP_PHOTO_DATA,
"application/octet-stream")));
exchange.getOut().addAttachment(MtomTestHelper.RESP_IMAGE_CID,
new DataHandler(new ByteArrayDataSource(MtomTestHelper.responseJpeg, "image/jpeg")));
}
}
Message Mode: Attachments are not supported as it does not process the message at all.
CXF_MESSAGE Mode: MTOM is supported, and Attachments can be retrieved by Camel Message APIs
mentioned above. Note that when receiving a multipart (that is, MTOM) message the default
SOAPMessage to String converter will provide the complete multi-part payload on the body. If you
require just the SOAP XML as a String, you can set the message body with message.getSOAPPart(),
and Camel convert can do the rest of work for you.
For security reasons, the stack trace does not include the causing exception (that is, the part of a stack
trace that follows Caused by). If you want to include the causing exception in the stack trace, set the
exceptionMessageCauseEnabled property to true in the cxfEndpoint element, as follows:
237
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
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>
WARNING
You should only enable the exceptionMessageCauseEnabled flag for testing and
diagnostic purposes. It is normal practice for servers to conceal the original cause
of an exception to make it harder for hostile users to probe the server.
However, there are cases where streaming may not be appropriate or desired. Due to the streaming
nature, invalid incoming XML may not be caught until later in the processing chain. Also, certain
actions may require the message to be DOM parsed anyway (like WS-Security or message tracing and
such) in which case the advantages of the streaming is limited. At this point, there are two ways to
control the streaming:
Endpoint property: you can add "allowStreaming=false" as an endpoint property to turn the
streaming on/off.
Component property: the CxfComponent object also has an allowStreaming property that can
set the default for endpoints created from that component.
238
CHAPTER 28. CXF
It is noted that the default CXF dispatch client does not send a specific SOAPAction header. Therefore,
when the target service requires a specific SOAPAction value, it is supplied in the Camel header using
the key SOAPAction (case-insensitive).
239
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
IMPORTANT
URI FORMAT
cxfbean:serviceBeanRef
Where serviceBeanRef is a registry key to look up the service bean object. If serviceBeanRef
references a List object, elements of the List are the service bean objects accepted by the endpoint.
OPTIONS
240
CHAPTER 29. CXF BEAN COMPONENT
HEADERS
241
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
242
CHAPTER 29. CXF BEAN COMPONENT
NOTE
Currently, CXF Bean component has (only) been tested with Jetty HTTP component it
can understand headers from Jetty HTTP component without requiring conversion.
A WORKING SAMPLE
This sample shows how to create a route that starts a Jetty HTTP server. The route sends requests to a
CXF Bean and invokes a JAXRS annotated service.
First, create a route as follows. The from endpoint is a Jetty HTTP endpoint that is listening on port
9000. Notice that the matchOnUriPrefix option must be set to true because RESTful request URI will
not match the endpoint's URI http://localhost:9000 exactly.
<route>
<from uri="jetty:http://localhost:9000?matchOnUriPrefix=true" />
<to uri="cxfbean:customerServiceBean" />
<to uri="mock:endpointA" />
</route>
The to endpoint is a CXF Bean with bean name customerServiceBean. The name will be looked up
from the registry. Next, we make sure our service bean is available in Spring registry. We create a bean
definition in the Spring configuration. In this example, we create a List of service beans (of one
element). We could have created just a single bean without a List.
<util:list id="customerServiceBean">
<bean class="org.apache.camel.component.cxf.jaxrs.testbean.CustomerService" />
</util:list>
That's it. Once the route is started, the web service is ready for business. A HTTP client can make a
request and receive response.
243
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CXFRS COMPONENT
The cxfrs: component provides integration with Apache CXF for connecting to JAX-RS services
hosted in CXF.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
NOTE
When using CXF as a consumer, the CXF Bean Component allows you to factor out how
message payloads are received from their processing as a RESTful or SOAP web service.
This has the potential of using a multitude of transports to consume web services. The
bean component's configuration is also simpler and provides the fastest method to
implement web services using Camel and CXF.
URI FORMAT
cxfrs://address?options
cxfrs:bean:rsEndpoint
Where rsEndpoint represents the Spring bean's name which represents the CXFRS client or server
For either style above, you can append options to the URI as follows:
cxfrs:bean:cxfEndpoint?resourceClasses=org.apache.camel.rs.Example
OPTIONS
244
CHAPTER 30. CXFRS
245
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
246
CHAPTER 30. CXFRS
SimpleC
onsume
r => see
the
Consumi
ng a
REST
Request
with the
Simple
Binding
Style
below.
Default
=> the
default
style. For
consume
rs this
passes
on a
Messag
eConten
tsList to
the route,
requiring
low-level
processin
g in the
route.
Custom
=> allows
you to
specify a
custom
binding
through
the
binding
option.
247
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
248
CHAPTER 30. CXFRS
249
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
250
CHAPTER 30. CXFRS
You can also configure the CXF REST endpoint through the Spring configuration. Since there are lots
of differences between the CXF REST client and CXF REST Server, we provide different configurations
for them. Please check out the schema file and the CXF JAX-RS documentation for more information.
<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"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
">
<!-- Defined the real JAXRS back end service -->
<jaxrs:server id="restService"
address="http://localhost:9002/rest"
staticSubresourceResolution="true">
<jaxrs:serviceBeans>
<ref bean="customerService"/>
</jaxrs:serviceBeans>
</jaxrs:server>
<bean id="customerService"
class="org.apache.camel.component.cxf.jaxrs.testbean.CustomerService" />
<!-- Defined the server endpoint to create the cxf-rs consumer -->
<cxf:rsServer id="rsServer" address="http://localhost:9000/route"
251
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
serviceClass="org.apache.camel.component.cxf.jaxrs.testbean.CustomerService"
loggingFeatureEnabled="true" loggingSizeLimit="20" skipFaultLogging="true"/>
<!-- Defined the client endpoint to create the cxf-rs consumer -->
<cxf:rsClient id="rsClient" address="http://localhost:9002/rest"
serviceClass="org.apache.camel.component.cxf.jaxrs.testbean.CustomerService"
loggingFeatureEnabled="true" skipFaultLogging="true"/>
</beans>
// 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()));
The Default binding style is rather low-level, requiring the user to manually process the
MessageContentsList object coming into the route. Thus, it tightly couples the route logic with the
method signature and parameter indices of the JAX-RS operation. Somewhat inelegant, difficult and
error-prone.
In contrast, the SimpleConsumer binding style performs the following mappings, in order to make the
request data more accessible to you within the Camel Message:
The request entity (POJO or other type) becomes the IN message body. If a single entity
cannot be identified in the JAX-RS method signature, it falls back to the original
MessageContentsList.
252
CHAPTER 30. CXFRS
Non-binary @Multipart body parts are mapped as IN message headers. The header name
matches the Body Part name.
If the message body type is equal to javax.ws.rs.core.Response, it means that the user has
built a custom response, and therefore it is respected and it becomes the final response.
In all cases, Camel headers permitted by custom or default HeaderFilterStrategy are added to
the HTTP response.
from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
.to("log:TEST?showAll=true");
253
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
@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}");
The following HTTP request with XML payload (given that the Customer DTO is JAXB-annotated):
POST /customers/gold?active=true
Payload:
<Customer>
<fullName>Raul Kripalani</fullName>
<country>Spain</country>
<project>Apache Camel</project>
</Customer>
For more examples on how to process requests and write responses can be found here.
254
CHAPTER 30. CXFRS
255
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
});
}
};
}
The corresponding resource class used to configure the endpoint is defined as an interface:
@Path("/customerservice/")
public interface CustomerServiceResource {
@GET
@Path("/customers/{id}/")
Customer getCustomer(@PathParam("id") String id);
@PUT
@Path("/customers/")
Response updateCustomer(Customer customer);
}
IMPORTANT
By default, JAX-RS resource classes are used to configure the JAX-RS properties only.
The methods will not be executed during the routing of messages to the endpoint, the
route itself is responsible for all processing instead.
NOTE
Note that starting from Camel 2.15, it is also sufficient to provide an interface only, as
opposed to a no-op service implementation class for the default mode. Starting from
Camel 2.15, if the performInvocation option is enabled, the service implementation will
be invoked first, the response will be set on the Camel exchange and the route
execution will continue as usual. This can be useful for integrating the existing JAX-RS
implementations into Camel routes and for post-processing JAX-RS Responses in
custom processors.
Here is an example:
256
CHAPTER 30. CXFRS
inMessage.setHeader(CxfConstants.OPERATION_NAME, "getCustomer");
// using the proxy client API
inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.FALSE);
// set a customer header
inMessage.setHeader("key", "value");
// set the parameters , if you just have one parameter
// camel will put this object into an Object[] itself
inMessage.setBody("123");
}
});
CXF JAXRS front end also provides a http centric client API , You can also invoke this API from camel-
cxfrs producer. You need to specify the HTTP_PATH and Http method and let the the producer know
to use the HTTP centric client by using the URI option httpClientAPI or set the message header with
CxfConstants.CAMEL_CXF_RS_USING_HTTP_API. You can turn the response object to the type
class that you specify with CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS.
});
257
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
From Apache Camel 2.1, we also support to specify the query parameters from CXFRS URI for the
CXFRS HTTP centric client.
To support the Dynamical routing, you can override the URI's query parameters by using the
CxfConstants.CAMEL_CXF_RS_QUERY_MAP header to set the parameter map for it.
258
CHAPTER 31. DATAFORMAT COMPONENT
URI FORMAT
dataformat:name:(marshal|unmarshal)[?options]
Where name is the name of the Data Format. And then followed by the operation which must either be
marshal or unmarshal. The options is used for configuring the Data Format in use. See the Data
Format documentation for which options it support.
SAMPLES
For example to use the JAXB Data Format we can do as follows:
from("activemq:My.Queue").
to("dataformat:jaxb:unmarshal?contextPath=com.acme.model").
to("mqseries:Another.Queue");
Data Format
259
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
DATASET COMPONENT
The DataSet component (available since 1.3.0) provides a mechanism to easily perform load & soak
testing of your system. It works by allowing you to create DataSet instances both as a source of
messages and as a way to assert that the data set is received.
Apache Camel will use the throughput logger when sending dataset's.
URI FORMAT
dataset:name[?options]
OPTIONS
260
CHAPTER 32. DATASET
You can append query options to the URI in the following format, ?option=value&option=value&...
CONFIGURING DATASET
Apache Camel will lookup in the Registry for a bean implementing the DataSet interface. So you can
register your own DataSet as:
EXAMPLE
For example, to test that a set of messages are sent to a queue and then consumed from the queue
without losing any messages:
The above would look in the Registry to find the foo DataSet instance which is used to create the
messages.
Then you create a DataSet implementation, such as using the SimpleDataSet as described below,
configuring things like how big the data set is and what the messages look like etc.
PROPERTIES ON SIMPLEDATASET
261
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Spring Testing
262
CHAPTER 33. DIRECT
DIRECT COMPONENT
The direct: component provides direct, synchronous invocation of any consumers when a producer
sends a message exchange. This endpoint can be used to connect existing routes in the same camel
context.
NOTE
NOTE
The VM component provides connections between Camel contexts as long they run in
the same JVM.
URI FORMAT
direct:someName[?options]
OPTIONS
You can append query options to the URI in the following format, ?option=value&option=value&...
SAMPLES
In the route below we use the direct component to link the two routes together:
from("activemq:queue:order.in")
.to("bean:orderServer?method=validate")
.to("direct:processOrder");
263
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:processOrder")
.to("bean:orderService?method=process")
.to("activemq:queue:order.out");
<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>
See also samples from the SEDA component, how they can be used together.
SEDA
VM
264
CHAPTER 34. DIRECT-VM
DIRECT VM COMPONENT
Available as of Camel 2.10
The direct-vm: component provides direct, synchronous invocation of any consumers in the JVM when
a producer sends a message exchange. This endpoint can be used to connect existing routes in the
same camel context, as well from other camel contexts in the same JVM.
This component differs from the Direct component in that Direct-VM supports communication across
CamelContext instances - so you can use this mechanism to communicate across web applications
(provided that camel-core.jar is on the system/boot classpath).
At runtime you can swap in new consumers, by stopping the existing consumer(s) and start new
consumers. But at any given time there can be at most only one active consumer for a given endpoint.
This component allows also to connect routes deployed in different OSGI Bundles as you can see here
after. Even if they are running in different bundles, the camel routes will use the same thread. That
autorises to develop applications using Transactions - Tx.
URI FORMAT
direct-vm:someName
OPTIONS
265
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SAMPLES
In the route below we use the direct component to link the two routes together:
from("activemq:queue:order.in")
.to("bean:orderServer?method=validate")
.to("direct-vm:processOrder");
from("direct-vm:processOrder")
.to("bean:orderService?method=process")
.to("activemq:queue:order.out");
<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>
Direct
SEDA
VM
266
CHAPTER 35. DISRUPTOR
DISRUPTOR COMPONENT
Available as of Camel 2.12
The disruptor: component provides asynchronous SEDA behavior much as the standard SEDA
Component, but utilizes a Disruptor instead of a BlockingQueue utilized by the standard SEDA.
Alternatively, a disruptor-vm: endpoint is supported by this component, providing an alternative to the
standard VM. As with the SEDA component, buffers of the disruptor: endpoints are only visible within a
single CamelContext and no support is provided for persistence or recovery. The buffers of the
*disruptor-vm:* endpoints also provides support for communication across CamelContexts instances
so you can use this mechanism to communicate across web applications (provided that camel-
disruptor.jar is on the system/boot classpath).
The main advantage of choosing to use the Disruptor Component over the SEDA or the VM Component
is performance in use cases where there is high contention between producer(s) and/or multicasted or
concurrent Consumers. In those cases, significant increases of throughput and reduction of latency has
been observed. Performance in scenarios without contention is comparable to the SEDA and VM
Components.
The Disruptor is implemented with the intention of mimicing the behaviour and options of the SEDA
and VM Components as much as possible. The main differences with the them are the following:
As a the buffer is always bouded, the default behaviour for the Disruptor is to block while the
buffer is full instead of throwing an exception. This default behaviour may be configured on the
component (see options).
The Disruptor enpoints don't implement the BrowsableEndpoint interface. As such, the
exchanges currently in the Disruptor can't be retrieved, only the amount of exchanges.
As a result of the reconfiguration: Data sent over a Disruptor is directly processed and 'gone' if
there is at least one consumer, late joiners only get new exchanges published after they've
joined.
When a producer blocks on a full Disruptor, it does not respond to thread interrupts.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
267
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
URI FORMAT
disruptor:someName[?options]
or
disruptor-vm:someName[?options]
Where *someName* can be any string that uniquely identifies the endpoint within the current
CamelContext (or across contexts in case of *disruptor-vm:*). You can append query options to the
URI in the following format:
?option=value&option=value&...
OPTIONS
All the following options are valid for both the *disruptor:* and *disruptor-vm:* components.
268
CHAPTER 35. DISRUPTOR
269
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
WAIT STRATEGIES
The wait strategy effects the type of waiting performed by the consumer threads that are currently
waiting for the next exchange to be published. The following strategies can be chosen:
Blocking Blocking strategy that uses a lock This strategy can be used when
and condition variable for throughput and low-latency are
Consumers waiting on a barrier. not as important as CPU resource.
270
CHAPTER 35. DISRUPTOR
BusySpin Busy Spin strategy that uses a This strategy will use CPU
busy spin loop for Consumers resource to avoid syscalls which
waiting on a barrier. can introduce latency jitter. It is
best used when threads can be
bound to specific CPU cores.
from("mina:tcp://0.0.0.0:9876?textline=true&sync=true").to("disruptor:input");
from("disruptor:input").to("bean:processInput").to("bean:createResponse");
In the route above, we have a TCP listener on port 9876 that accepts incoming requests. The request is
routed to the disruptor:input buffer. As it is a RequestReply message, we wait for the response. When
the consumer on the disruptor:input buffer is complete, it copies the response to the original message
response.
CONCURRENT CONSUMERS
By default, the Disruptor endpoint uses a single consumer thread, but you can configure it to use
concurrent consumer threads. So instead of thread pools you can use:
from("disruptor:stageName?concurrentConsumers=5").process(...)
As for the difference between the two, note a thread pool can increase/shrink dynamically at runtime
depending on load, whereas the number of concurrent consumers is always fixed and supported by the
Disruptor internally so performance will be higher.
THREAD POOLS
Be aware that adding a thread pool to a Disruptor endpoint by doing something like:
from("disruptor:stageName").thread(5).process(...)
Can wind up with adding a normal BlockingQueue to be used in conjunction with the Disruptor,
effectively negating part of the performance gains achieved by using the Disruptor. Instead, it is
271
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
advices to directly configure number of threads that process messages on a Disruptor endpoint using
the concurrentConsumers option.
SAMPLE
In the route below we use the Disruptor to send the request to this async queue to be able to send a
fire-and-forget message for further processing in another thread, and return a constant reply in this
thread to the original caller.
from("disruptor:next").to("mock:result");
}
Here we send a Hello World message and expects the reply to be OK.
The "Hello World" message will be consumed from the Disruptor from another thread for further
processing. Since this is from a unit test, it will be sent to a mock endpoint where we can do assertions
in the unit test.
USING MULTIPLECONSUMERS
In this example we have defined two consumers and registered them as spring beans.
<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>
Since we have specified multipleConsumers=true on the Disruptor foo endpoint we can have those two
or more consumers receive their own copy of the message as a kind of pub-sub style messaging. As the
beans are part of an unit test they simply send the message to a mock endpoint, but notice how we can
use @Consume to consume from the Disruptor.
@EndpointInject(uri = "mock:result")
private ProducerTemplate destination;
@Consume(ref = "foo")
272
CHAPTER 35. DISRUPTOR
273
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
DNS
Available as of Camel 2.7
This is an additional component for Camel to run DNS queries, using DNSJava. The component is a thin
layer on top of DNSJava. The component offers the following operations:
ip
To resolve a domain by its IP address.
lookup
To look up information about the domain.
dig
To run DNS queries.
The DNSJava library requires running on the SUN JVM. If you use Apache ServiceMix or
Apache Karaf, you'll need to adjust the etc/jre.properties file, to add
sun.net.spi.nameservice to the list of Java platform packages exported. The server will
need restarting before this change takes effect.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
The URI scheme for a DNS component is as follows
dns://operation
OPTIONS
None.
HEADERS
274
CHAPTER 36. DNS
EXAMPLES
IP LOOKUP
<route id="IPCheck">
<from uri="direct:start"/>
<to uri="dns:ip"/>
</route>
This looks up a domain's IP. For example, www.example.com resolves to 192.0.32.10. The IP address to
lookup must be provided in the header with key "dns.domain".
DNS LOOKUP
<route id="IPCheck">
<from uri="direct:start"/>
<to uri="dns:lookup"/>
</route>
This returns a set of DNS records associated with a domain. The name to lookup must be provided in
the header with key "dns.name".
275
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
DNS DIG
Dig is a Unix command-line utility to run DNS queries.
<route id="IPCheck">
<from uri="direct:start"/>
<to uri="dns:dig"/>
</route>
276
CHAPTER 37. DOCKER
DOCKER COMPONENT
Available as of Camel 2.15
The Docker Camel component leverages the docker-java via the Docker Remote API.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-docker</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
docker://[operation]?[options]
HEADER STRATEGY
All URI option can be passed as Header properties. Values found in a message header take precedence
over URI parameters. A header property takes the form of a URI option prefixed with *CamelDocker*
as shown below
containerId CamelDockerContainerId
GENERAL OPTIONS
The following parameters can be used with any invocation of the component
277
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CONSUMER OPERATIONS
The consumer supports the following operations.
PRODUCER OPERATIONS
The following producer operations are available.
278
CHAPTER 37. DOCKER
279
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
280
CHAPTER 37. DOCKER
EXAMPLES
The following example consumes events from Docker:
from("docker://events?host=192.168.59.103&port=2375").to("log:event");
from("docker://info?host=192.168.59.103&port=2375").to("log:info");
281
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
DOZER COMPONENT
The dozer: component provides the ability to map between Java beans using the Dozer mapping
framework. Camel also supports the ability to trigger Dozer mappings as a type converter . The primary
differences between using a Dozer endpoint and a Dozer converter are:
The ability to manage Dozer mapping configuration on a per-endpoint basis vs. global
configuration via the converter registry.
A Dozer endpoint can be configured to marshal/unmarshal input and output data using Camel
data formats to support a single, any-to-any transformation endpoint
The Dozer component allows for fine-grained integration and extension of Dozer to support
additional functionality (e.g. mapping literal values, using expressions for mappings, etc.).
In order to use the Dozer component, Maven users will need to add the following dependency to their
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>
URI FORMAT
The Dozer component only supports producer endpoints.
dozer:endpointId[?options]
Where endpointId is a name used to uniquely identify the Dozer endpoint configuration.
from("direct:orderInput").
to("dozer:transformOrder?mappingFile=orderMapping.xml&targetModel=example.XYZOrder").
to("direct:orderOutput");
OPTIONS
282
CHAPTER 38. DOZER
283
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
format prior to processing via Dozer. You can always do this on your own outside the call to Dozer, but
supporting it directly in the Dozer component allows you to use a single endpoints to configure any-to-
any transformation within Camel.
As an example, let's say you wanted to map between an XML data structure and a JSON data structure
using the Dozer component. If you had the following data formats defined in a Camel Context:
<dataFormats>
<json library="Jackson" id="myjson"/>
<jaxb contextPath="org.example" id="myjaxb"/>
</dataFormats>
You could then configure a Dozer endpoint to unmarshal the input XML using a JAXB data format and
marshal the mapping output using Jackson.
<endpoint uri="dozer:xml2json?
marshalId=myjson&unmarshalId=myjaxb&targetModel=org.example.Order"/>
CONFIGURING DOZER
All Dozer endpoints require a Dozer mapping configuration file which defines mappings between source
and target objects. The component will default to a location of META-INF/dozerBeanMapping.xml if the
mappingFile or mappingConfiguration options are not specified on an endpoint. If you need to supply
multiple mapping configuration files for a single endpoint or specify additional configuration options
(e.g. event listeners, custom converters, etc.), then you can use an instance of
org.apache.camel.converter.dozer.DozerBeanMapperConfiguration.
MAPPING EXTENSIONS
The Dozer component implements a number of extensions to the Dozer mapping framework as custom
converters. These converters implement mapping functions that are not supported directly by Dozer
itself.
VARIABLE MAPPINGS
Variable mappings allow you to map the value of a variable definition within a Dozer configuration into a
target field instead of using the value of a source field. This is equivalent to constant mapping in other
mapping frameworks, where can you assign a literal value to a target field. To use a variable mapping,
simply define a variable within your mapping configuration and then map from the VariableMapper
class into your target field of choice:
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
284
CHAPTER 38. DOZER
http://dozer.sourceforge.net/schema/beanmapping.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>
CUSTOM MAPPINGS
Custom mappings allow you to define your own logic for how a source field is mapped to a target field.
They are similar in function to Dozer customer converters, with two notable differences:
You can have multiple converter methods in a single class with custom mappings.
A custom mapping is declared by using the built-in '_customMapping' converter in your mapping
configuration. The parameter to this converter has the following syntax:
[class-name][,method-name]
Method name is optional - the Dozer component will search for a method that matches the input and
output types required for a mapping. An example custom mapping and configuration are provided
below.
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.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>
285
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
</field>
</mapping>
</mappings>
EXPRESSION MAPPINGS
Expression mappings allow you to use the powerful language capabilities of Camel to evaluate an
expression and assign the result to a target field in a mapping. Any language that Camel supports can
be used in an expression mapping. Basic examples of expressions include the ability to map a Camel
message header or exchange property to a target field or to concatenate multiple source fields into a
target field. The syntax of a mapping expression is:
[language]:[expression]
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.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>
Note that any properties within your expression must be escaped with "\" to prevent an error when
Dozer attempts to resolve variable values defined using the EL.
286
CHAPTER 39. DROPBOX
The dropbox: component allows you to treat Dropbox remote folders as a producer or consumer of
messages. Using the Dropbox Java Core API (reference version for this component is 1.7.x), this camel
component has the following features:
As a producer, download files, move files between remote directories, delete files/dir, upload
files and search files by queries
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
dropbox://[operation]?[options]
Where operation is the specific action (typically is a CRUD action) to perform on Dropbox remote
folder.
OPERATION
Operation Description
Operations require additional options to work, some are mandatory for the specific operation.
OPTIONS
287
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In order to work with Dropbox API you need to obtain an accessToken and a clientIdentifier. You can
refer to the Dropbox documentation that expalins how to get them.
DEL OPERATION
Delete files on Dropbox.
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");
Property Value
288
CHAPTER 39. DROPBOX
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/");
Property Value
289
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MOVE OPERATION
Move files on Dropbox between one folder to another.
SAMPLES
from("direct:start").to("dropbox://move?
accessToken=XXX&clientIdentifier=XXX&remotePath=/root/folder1&newRemotePath=/root/folder2").to("mock
Property Value
290
CHAPTER 39. DROPBOX
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
Property Value
291
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Map<String, DropboxResultCode> in case of multiple files upload, a map with as key the
path of the remote file uploaded and as value the
result of the upload operation, OK or KO
SEARCH OPERATION
Search inside a remote Dropbox folder including its sub directories.
SAMPLES
from("dropbox://search?
accessToken=XXX&clientIdentifier=XXX&remotePath=/XXX&query=XXX").to("mock:result");
from("direct:start").to("dropbox://search?
accessToken=XXX&clientIdentifier=XXX&remotePath=/XXX").to("mock:result");
Property Value
292
CHAPTER 39. DROPBOX
293
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
EJB COMPONENT
The EJB component binds Java Enterprise Java Beans to Camel message exchanges. For example:
294
CHAPTER 41. ELASTICSEARCH
ELASTICSEARCH COMPONENT
Available as of Camel 2.11
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
elasticsearch://clusterName?[options]
TIP
If you want to run against a local (in JVM/classloader) ElasticSearch server, just set the clusterName
value in the URI to local. See the client guide for more details.
ENDPOINT OPTIONS
The following options may be configured on the ElasticSearch endpoint. All are required to be set as
either an endpoint URI parameter or as a header (headers override endpoint properties)
name description
MESSAGE OPERATIONS
The following ElasticSearch operations are currently supported. Simply set an endpoint URI option or
exchange header with a key of operation and a value set to one of the following. Some operations also
require other parameters or the message body to be set.
295
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
INDEX EXAMPLE
Below is a simple INDEX example
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>
A client would simply need to pass a body message containing a Map to the route. The result body
contains the indexId created.
JAVA EXAMPLE
The following example shows how to use the ElasticSearch component from a Camel route defined in
Java:
296
CHAPTER 41. ELASTICSEARCH
.to("elasticsearch://local?operation=INDEX&indexName=twitter&indexType=tweet");
}
});
297
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
EVENTADMIN COMPONENT
Available in Camel 2.6
The eventadmin component can be used in an OSGi environment to receive OSGi EventAdmin events
and process them.
DEPENDENCIES
Maven users need to add the following dependency to their pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-eventadmin</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Camel (2.6.0 or higher).
URI FORMAT
eventadmin:topic[?options]
URI OPTIONS
MESSAGE HEADERS
MESSAGE BODY
The in message body will be set to the received Event.
EXAMPLE USAGE
<route>
<from uri="eventadmin:*"/>
298
CHAPTER 42. EVENTADMIN
<to uri="stream:out"/>
</route>
299
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
EXEC COMPONENT
Available in Apache Camel 2.3
DEPENDENCIES
Maven users need to add the following dependency to their pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-exec</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Apache Camel (2.3.0 or higher).
URI FORMAT
exec://executable[?options]
where executable is the name, or file path, of the system command that will be executed. If executable
name is used (e.g. exec:java), the executable must in the system path.
URI OPTIONS
300
CHAPTER 43. EXEC
MESSAGE HEADERS
The supported headers are defined in org.apache.camel.component.exec.ExecBinding.
301
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
302
CHAPTER 43. EXEC
MESSAGE BODY
If the Exec component receives an in message body that is convertible to java.io.InputStream, it is
used to feed input to the executable via its stdin. After execution, the message body is the result of the
execution, that is, an org.apache.camel.components.exec.ExecResult instance containing the
stdout, stderr, exit value, and out file. This component supports the following ExecResult type
converters for convenience:
From To
ExecResult java.io.InputStream
ExecResult String
ExecResult byte []
ExecResult org.w3c.dom.Document
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
}
});
303
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
EXECUTING JAVA
The example below executes java with 2 arguments: -server and -version, provided that java is in the
system path.
from("direct:exec")
.to("exec:java?args=-server -version")
The example below executes java in c:/temp with 3 arguments: -server, -version and the sytem
property user.name.
from("direct:exec")
.to("exec:c:/program files/jdk/bin/java?args=-server -version -
Duser.name=Camel&workingDir=c:/temp")
from("direct:exec")
.to("exec:ant.bat?args=-f CamelExecBuildFile.xml")
In the next example, the ant.bat command redirects its output to CamelExecOutFile.txt with -l. The
file CamelExecOutFile.txt is used as the out file with outFile=CamelExecOutFile.txt. The example
assumes that ant.bat is in the system path, and that CamelExecBuildFile.xml is in the current
directory.
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
}
});
304
CHAPTER 44. FABRIC COMPONENT
Abstract
The Fabric component implements a location discovery mechanism for Apache Camel endpoints. This
mechanism can also be used to provide load-balancing over a cluster of endpoints. On the client side
(producer endpoints), endpoints are represented by an abstract ID and at run time, the ID is resolved to
a specific endpoint URI. Because the URI is stored in a distributed registry (provided by Fuse Fabric),
this enables you to create flexible applications whose topology can be specified at deploy time and
updated dynamically.
DEPENDENCIES
The Fabric component can only be used in the context of a fabric-enabled Red Hat JBoss Fuse
container. You must ensure that the fabric-camel feature is installed. If necessary, you can install it
using the following console command:
In the context of Fabric, you install a feature by adding it to the relevant profile. For example, if you are
using a profile called my-master-profile, you would add the fabric-camel feature by entering the
following console command:
URI FORMAT
A fabric endpoint has the following URI format:
fabric:ClusterID[:PublishedURI[?Options]]
The format of the URI depends on whether it is used to specify a consumer endpoint or a producer
endpoint.
fabric:ClusterID:PublishedURI[?Options]
Where the specified URI, PublishedURI, is published in the fabric registry and associated with the
ClusterId cluster. The options, Options, are used when creating the producer endpoint instance, but
the options are not published with the PublishedURI in the fabric registry.
fabric:ClusterID
Where the client looks up the ID, ClusterId, in the fabric registry to discover the URI to connect to.
URI OPTIONS
The Fabric component itself does not support any URI options. It is possible, however, to specify
options for the published URI. These options are stored in the fabric registry as part of the URI and are
used as follows:
305
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Server-only options—options that are applicable only to the server are applied to the server
endpoint (consumer endpoint) at run time.
Client-only options—options that are applicable only to the client are applied to the client
endpoint (producer endpoint) at run time.
Common options—options common to the client and the server are applied to both.
LOCATION DISCOVERY
Figure 44.1, “Location Discovery through Fabric” gives an overview of how Fabric endpoints enable
location discovery at run time.
The server side of this application is defined by a route that starts with a Fabric endpoint, where the
Fabric endpoint publishes the URI, jetty:http://0.0.0.0:9090. When this route is started, it automatically
registers the Jetty URI in the fabric registry, under the cluster ID, foo.
The client side of the application is defined by a route that ends with the Fabric endpoint, fabric:foo.
Now, when the client route starts, it automatically looks up the ID, foo, in the fabric registry and
retrieves the associated Jetty endpoint URI. The client then creates a producer endpoint using the
discovered Jetty URI and connects to the corresponding server port.
LOAD-BALANCING CLUSTER
306
CHAPTER 44. FABRIC COMPONENT
Figure 44.2, “Load Balancing through Fabric” gives an overview of how Fabric endpoints enable you to
create a load-balancing cluster.
In this case, two Jetty servers are created, with the URIs, jetty:http://0.0.0.0:9090 and
jetty:http://0.0.0.0:9191. Because these published URIs are both prefixed by fabric:foo:, both of the
Jetty URIs are registered under the same cluster ID, foo, in the fabric registry.
Now, when the client routes starts, it automatically looks up the ID, foo, in the fabric registry. Because
the foo ID is associated with multiple endpoint URIs, fabric implements a random load balancing
algorithm to choose one of the available URIs. The client then creates a producer endpoint, using the
chosen URI.
AUTO-RECONNECT FEATURE
Fabric endpoints support auto-reconnection. So, if a client endpoint (producer endpoint) loses its
connection to a server endpoint, it will automatically go back to the fabric registry, ask for another URI,
and then connect to the new URI.
307
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Example 44.1, “Publishing a URI ” shows a route that implements a Jetty HTTP server, where the Jetty
URI is published to the fabric registry under the ID, cluster. The route is a simply HTTP server that
returns the constant message, Response from Zookeeper agent, in the body of the HTTP response.
</blueprint>
The Fabric component uses the CuratorFramework object to connect to the ZooKeeper
server (Fabric registry), where the reference to the CuratorFramework object is provided
automatically.
The specified jetty URI is published to the fabric registry under the cluster ID, cluster.
The Jetty endpoint is activated and used as the consumer endpoint of the route (just as if
it had been specified without the fabric-camel:cluster: prefix).
Because the route is implemented in blueprint XML, you would normally add the file containing this
code to the src/main/resources/OSGI-INF/blueprint directory of a Maven project.
308
CHAPTER 44. FABRIC COMPONENT
Example 44.2, “Looking up a URI” shows a route that implements a HTTP client, where the HTTP
endpoint is discovered dynamically at run time, by looking up the specified ID, cluster, in the fabric
registry.
<route id="fabric-client">
<from uri="timer://foo?fixedRate=true&period=10000"/>
<setBody>
<simple>Hello from Zookeeper server</simple>
</setBody>
<to uri="fabric-camel:cluster"/>
<log message=">>> ${body} : ${header.karaf.name}"/>
</route>
</camelContext>
<reference interface="org.apache.camel.spi.ComponentResolver"
filter="(component=jetty)"/>
</blueprint>
Because the route is implemented in blueprint XML, you would normally add the file containing this
code to the src/main/resources/OSGI-INF/blueprint directory of a Maven project.
LOAD-BALANCING EXAMPLE
In principle, implementing load balancing is easy using fabric endpoints. All that you have to do is to
publish more than one endpoint URI under the same cluster ID. Now, when a client looks up that cluster
ID, it gets a random selection out of the list of available endpoint URIs.
The servers in the load-balancing cluster have almost the same configuration. Essentially, the only
difference between them is that they publish an endpoint URI with a different hostname and/or IP port.
Instead of creating a separate OSGi bundle for every single server in the load-balancing cluster,
however, it is better to define a template that enables you to specify the host or port using a
configuration variable.
Example 44.3, “Server Template for a Load-Balancing Cluster” illustrates the template approach to
defining servers in a load-balancing cluster.
309
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route id="fabric-server">
<from uri="fabric-camel:cluster:jetty:http://0.0.0.0:[[portNumber]]/fabric"/>
<log message="Request received : ${body}"/>
<setHeader headerName="karaf.name">
<simple>${sys.karaf.name}</simple>
</setHeader>
<transform>
<simple>Response from Zookeeper agent</simple>
</transform>
</route>
</camelContext>
</blueprint>
First of all, you need to initialize the OSGi blueprint property placeholder. The property placeholder
mechanism enables you to read property settings from the OSGi Config Admin service and substitute
the properties in the blueprint configuration file. In this example, the property placeholder accesses
properties from the io.fabric8.examples.camel.loadbalancing.server persistent ID. A persistent ID in
the OSGi Config Admin service identifies a collection of related property settings. After initializing the
property placeholder, you can access any property values from the persistent ID using the syntax,
[[PropName]].
The Fabric endpont URI exploits the property placeholder mechanism to substitute the value of the
Jetty port, [[portNumber]], at run time. At deploy time, you can specify the value of the portName
property. For example, if using a custom feature, you could specify the property in the feature
definition (see Add OSGi configurations to the feature ). Alternatively, you can specify configuration
properties when defining deployment profiles in the Fuse Management Console.
310
CHAPTER 44. FABRIC COMPONENT
io.fabric8.zookeeper
For example, assuming that you use Maven to build your application, Example 44.4, “Maven Bundle
Plug-In Configuration” shows how you can configure the Maven bundle plug-in to import the required
packages.
311
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
FACEBOOK COMPONENT
Available as of Camel 2.12
The Facebook component provides access to all of the Facebook APIs accessible using Facebook4J. It
allows producing messages to retrieve, add, and delete posts, likes, comments, photos, albums, videos,
photos, checkins, locations, links, etc. It also supports APIs that allow polling for posts, users, checkins,
groups, locations, etc.
Facebook requires the use of OAuth for all client application authentication. In order to use camel-
facebook with your account, you'll need to create a new application within Facebook at
https://developers.facebook.com/apps and grant the application access to your account. The
Facebook application's id and secret will allow access to Facebook APIs which do not require a current
user. A user access token is required for APIs that require a logged in user. More information on
obtaining a user access token can be found at https://developers.facebook.com/docs/facebook-
login/access-tokens/.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-facebook</artifactId>
<version>${camel-version}</version>
</dependency>
URI FORMAT
facebook://[endpoint]?[options]
FACEBOOKCOMPONENT
The facebook component can be configured with the Facebook account settings below, which are
mandatory. The values can be provided to the component using the bean property configuration of
type org.apache.camel.component.facebook.config.FacebookConfiguration. The
oAuthAccessToken option may be ommited but that will only allow access to application APIs.
Option Description
312
CHAPTER 45. FACEBOOK
In addition to the above settings, non-mandatory options below can be used to configure the
underlying Facebook4J runtime through either the component's configuration property or in an
endpoint URI.
313
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PRODUCER ENDPOINTS:
Producer endpoints can use endpoint names and options from the table below. Endpoints can also use
the short name without the get or search prefix, except checkin due to ambiguity between
getCheckin and searchCheckin. Endpoint options that are not mandatory are denoted by [].
Producer endpoints can also use a special option *inBody* that in turn should contain the name of the
endpoint option whose value will be contained in the Camel Exchange In message. For example, the
facebook endpoint in the following route retrieves activities for the user id value in the incoming
message body.
from("direct:test").to("facebook://activities?inBody=userId")...
Any of the endpoint options can be provided in either the endpoint URI, or dynamically in a message
header. The message header name must be of the format CamelFacebook.option. For example, the
userId option value in the previous route could alternately be provided in the message header
CamelFacebook.userId. Note that the inBody option overrides message header, e.g. the endpoint
option inBody=user would override a CamelFacebook.userId header.
Endpoints that return a String return an Id for the created or modified entity, e.g. addAlbumPhoto
returns the new album Id. Endpoints that return a boolean, return true for success and false otherwise.
In case of Facebook API errors the endpoint will throw a RuntimeCamelException with a
facebook4j.FacebookException cause.
Accounts
314
CHAPTER 45. FACEBOOK
Activities
Albums
Checkins
315
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Comments
Domains
Events
316
CHAPTER 45. FACEBOOK
317
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Family
Favorites
Facebook Query
Language (FQL)
Friends
318
CHAPTER 45. FACEBOOK
Games
Groups
319
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Insights
Likes
Links
320
CHAPTER 45. FACEBOOK
Locations
Messages
Notes
Notifications
321
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Permissions
Photos
Pokes
322
CHAPTER 45. FACEBOOK
Posts
Questions
323
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Test Users
Users
324
CHAPTER 45. FACEBOOK
Videos
Search
325
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CONSUMER ENDPOINTS:
Any of the producer endpoints that take a reading#reading parameter can be used as a consumer
endpoint. The polling consumer uses the since and until fields to get responses within the polling
interval. In addition to other reading fields, an initial since value can be provided in the endpoint for the
first poll.
Rather than the endpoints returning a List (or facebook4j.ResponseList) through a single route
exchange, camel-facebook creates one route exchange per returned object. As an example, if
"facebook://home" results in five posts, the route will be executed five times (once for each Post).
URI Options
326
CHAPTER 45. FACEBOOK
327
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
328
CHAPTER 45. FACEBOOK
READING OPTIONS
The reading option of type facebook4j.Reading adds support for reading parameters, which allow
selecting specific fields, limits the number of results, etc. For more information see Graph API at
Facebook Developers.
It is also used by consumer endpoints to poll Facebook data to avoid sending duplicate messages
across polls.
The reading option can be a reference or value of type facebook4j.Reading, or can be specified using
the following reading options in either the endpoint URI or exchange header with CamelFacebook.
prefix.
Option Description
329
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
reading.offset Starting offset for list results, e.g. a limit of 10, and
offset of 10 returns items 11 through 20
MESSAGE HEADER
Any of the the section called “Consumer Endpoints: ” can be provided in a message header for
producer endpoints with CamelFacebook. prefix.
MESSAGE BODY
All result message bodies utilize objects provided by the Facebook4J API. Producer endpoints can
specify the option name for incoming message body in the inBody endpoint parameter.
USE CASES
To create a post within your Facebook profile, send this producer a facebook4j.PostUpdate body.
from("direct:foo")
.to("facebook://postFeed/inBody=postUpdate);
from("facebook://home?consumer.delay=5000")
.to("bean:blah");
330
CHAPTER 45. FACEBOOK
In the bar header we have the Facebook search string we want to execute in public posts, so we need
to assign this value to the CamelFacebook.query header.
from("direct:foo")
.setHeader("CamelFacebook.query", header("bar"))
.to("facebook://posts");
331
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
URI FORMAT
file:directoryName[?options]
or
file://directoryName[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
NOTE
Apache Camel only supports endpoints configured with a starting directory. So the
directoryName must be a directory. If you want to consume a single file only, you can
use the fileName option, e.g. by setting fileName=thefilename. Also, the starting
directory must not contain dynamic expressions with ${ } placeholders. Again use the
fileName option to specify the dynamic part of the filename.
AVOID READING FILES CURRENTLY BEING WRITTEN BY ANOTHER
APPLICATION
Beware the JDK File IO API is a bit limited in detecting whether another
application is currently writing/copying a file. And the implementation can be
different depending on OS platform as well. This could lead to that Apache Camel
thinks the file is not locked by another process and start consuming it. Therefore
you have to do your own investigation as to what suits your environment. To help
with this, Apache Camel provides different readLock options and the
doneFileName option that you can use. Also, see the section the section called
“Consuming files from folders where others drop files directly”.
URI OPTIONS
332
CHAPTER 46. FILE2
333
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CONSUMER ONLY
useFixedDela true Set to true to use fixed delay between pools, otherwise fixed rate is used.
y See ScheduledExecutorService in JDK for details.
334
CHAPTER 46. FILE2
runLoggingLe TRACE Camel 2.8: The consumer logs a start/complete log line when it polls. This
vel option allows you to configure the logging level for that.
recursive false If a directory, will look for files in all the sub-directories as well.
delete false If true, the file will be deleted after it is processed successfully.
noop false If true, the file is not moved or deleted in any way. This option is good for
readonly data, or for ETL type requirements. If noop=true, Apache Camel
will set idempotent=true as well, to avoid consuming the same files over
and over again.
preMove null Use Expression such as File Language to dynamically set the filename when
moving it before processing. For example to move in-progress files into the
order directory set this value to order.
move .camel Use Expression such as File Language to dynamically set the filename when
moving it after processing. To move files into a .done subdirectory just
enter .done.
moveFailed null Use Expression such as File Language to dynamically set the filename when
moving failed files after processing. To move files into a error subdirectory
just enter error . Note: When moving the files to another location it can/will
handle the error when you move it to another location so Apache Camel
cannot pick up the file again.
include null Is used to include files, if filename matches the regex pattern.
exclude null Is used to exclude files, if filename matches the regex pattern.
antInclude null Camel 2.10: Ant style filter inclusion, for exampleantInclude=\*{}*/*{}.txt.
Multiple inclusions may be specified in comma-delimited format. See the
section called “Filtering using ANT path matcher” for more details about
ant path filters.
antExclude null Camel 2.10: Ant style filter exclusion. If bothantInclude and antExclude
are used, antExclude takes precedence over antInclude. Multiple
exclusions may be specified in comma-delimited format. See the section
called “Filtering using ANT path matcher” for more details about ant path
filters.
antFilterCase true Camel 2.11: Ant style filter which is case sensitive or not.
Sensitive
idempotent false Option to use the Idempotent Consumer EIP pattern to let Apache Camel
skip already processed files. Will by default use a memory based LRUCache
that holds 1000 entries. If noop=true then idempotent will be enabled as
well to avoid consuming the same files over and over again.
335
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
idempotentKe Express Camel 2.11: To use a custom idempotent key. By default the absolute path
y ion of the file is used. You can use the File Language, for example to use the file
name and file size, you can do: idempotentKey=$-$ .
sortBy null Built-in sort using the File Language. Supports nested sorts, so you can
have a sort by file name and as a 2nd group sort by modified date. See
sorting section below for details.
readLock markerF Used by consumer, to only poll the files if it has exclusive read-lock on the
ile file (i.e. the file is not in-progress or being written). Apache Camel will wait
until the file lock is granted.
Note: In case of the foreign program writing the files, Red Hat recommend
you to use the doneFileName option instead of readLock option.
336
CHAPTER 46. FILE2
readLockTim 0 (for Optional timeout in milliseconds for the read-lock, if supported by the read-
eout FTP, lock. If the read-lock could not be granted and the timeout triggered, then
2000) Apache Camel will skip the file. At next poll Apache Camel, will try the file
again, and this time maybe the read-lock could be granted. Currently
fileLock , changed and rename support the timeout.
readLockChe 1000 (for Camel 2.6: Interval in millis for the read-lock, if supported by the read lock.
ckInterval FTP, This interval is used for sleeping between attempts to acquire the read lock.
5000) For example when using the changed read lock, you can set a higher
interval period to cater for slow writes. The default of 1 sec. may betoo fast if
the producer is very slow writing the file.
readLockMin 1 Camel 2.10.1: This option applied only for readLock=changed. This option
Length allows you to configure a minimum file length. By default Camel expects the
file to contain data, and thus the default value is 1. You can set this option
to zero, to allow consuming zero-length files.
readLockLog WARN Camel 2.12: Logging level used when a read lock could not be acquired. By
gingLevel default a WARN is logged. You can change this level, for example to OFF to
not have any logging. This option is only applicable for readLock of types:
changed, fileLock , rename.
readLockMark true Camel 2.14: Whether to use marker file with the changed, rename, or
erFile exclusive read lock types. By default a marker file is used as well to guard
against other processes picking up the same files. This behavior can be
turned off by setting this option to false. For example if you do not want to
write marker files to the file systems by the Camel application.
doneFileNam null Camel 2.6: If provided, Camel will only consume files if adone file exists.
e This option configures what file name to use. Either you can specify a fixed
name. Or you can use dynamic placeholders. The done file is always
expected in the same folder as the original file. See using done file and
writing done file sections for examples. Note: In case of the foreign program
writing the files, Red Hat recommend you to use the doneFileName
option.
maxMessages 0 An integer that defines the maximum number of messages to gather per
PerPoll poll. By default, no maximum is set. Can be used to set a limit of e.g. 1000
to avoid having the server read thousands of files as it starts up. Set a value
of 0 or negative to disabled it.
337
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
eagerMaxMes true Camel 2.9.3: Allows for controlling whether the limit from
sagesPerPoll maxMessagesPerPoll is eager or not. If eager then the limit is during the
scanning of files. Where as false would scan all files, and then perform
sorting. Setting this option to false allows for sorting all files first, and then
limit the poll. Mind that this requires a higher memory usage as all file
details are in memory to perform the sorting.
minDepth 0 Camel 2.8: The minimum depth to start processing when recursively
processing a directory. Using minDepth=1 means the base directory.
Using minDepth=2 means the first sub directory. This option isnot
supported by FTP consumer.
maxDepth Integer. Camel 2.8: The maximum depth to traverse when recursively processing a
MAX_V directory. This option is not supported by FTP consumer.
ALUE
startingDirect false Whether the starting directory must exist. Mind that the autoCreate
oryMustExist option is default enabled, which means the starting directory is normally
auto-created if it doesn't exist. You can disable autoCreate and enable this
to ensure the starting directory must exist. Will throw an exception, if the
directory doesn't exist.
sendEmptyM false Camel 2.9: If the polling consumer did not poll any files, you can enable this
essageWhenI option to send an empty message (no body) instead.
dle
consumer.bri false Camel 2.10: Allows for bridging the consumer to the Camel routing Error
dgeErrorHand Handler, which mean any exceptions occurred while trying to pick up files,
or the like, will now be processed as a message and handled by the routing
ler Error Handler. By default the consumer will use the
org.apache.camel.spi.ExceptionHandler to deal with exceptions, that
by default will be logged at WARN/ERROR level and ignored. See further
below on this page fore more details, at section How to use the Camel error
handler to deal with exceptions triggered outside the routing engine.
scheduledExe null Camel 2.10: Allows for configuring a custom/shared thread pool to use for
cutorService the consumer. By default each consumer has its own single threaded thread
pool. This option allows you to share a thread pool among multiple file
consumers.
338
CHAPTER 46. FILE2
scheduler null Camel 2.12: Use a custom scheduler to trigger the consumer to run.For
more details, see Polling Consumer. For example, there is aQuartz2, and
Spring-based scheduler that supports CRON expressions.
backoffMultipl 0 Camel 2.12: Let the scheduled polling consumer backoff if a number of
ier subsequent idles/errors occurred in a row. The multiplier is then the
number of polls that will be skipped before the next attempt is made. When
this option is set, backoffIdleThreshold and/or
backoffErrorThreshold must also be configured. See more details at
Polling Consumer.
backoffIdleTh 0 Camel 2.12: The number of subsequent idle polls that should happen before
reshold the backoffMultipler should kick-in.
backoffErrorT 0 Camel 2.12: The number of subsequent error polls (failed due some error)
hreshold that should happen before the backoffMultipler should kick-in.
After the route has completed, files are moved into the .camel subdirectory, so that they
appear to be deleted.
The File Consumer will always skip any file whose name starts with a dot, such as ., .camel, .m2
or .groovy.
Only files (not directories) are matched for valid filename, if options such as:
includeNamePrefix, includeNamePostfix, excludeNamePrefix, excludeNamePostfix,
regexPattern are used.
PRODUCER ONLY
339
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
340
CHAPTER 46. FILE2
341
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
342
CHAPTER 46. FILE2
from("file://inbox?move=.done").to("bean:handleOrder");
When a file is dropped in the inbox folder, the file consumer notices this and creates a new
FileExchange that is routed to the handleOrder bean. The bean then processes the File object. At this
point in time the file is still located in the inbox folder. After the bean completes, and thus the route is
completed, the file consumer will perform the move operation and move the file to the .done sub-
folder.
The move and preMove options is considered as a directory name (though if you use an expression
such as File Language, or Simple then the result of the expression evaluation is the file name to be
used - eg if you set
move=../backup/copy-of-${file:name}
then that's using the File Language which we use return the file name to be used), which can be either
relative or absolute. If relative, the directory is created as a sub-folder from within the folder where the
file was consumed.
By default, Apache Camel will move consumed files to the .camel sub-folder relative to the directory
where the file was consumed.
If you want to delete the file after processing, the route should be:
from("file://inobox?delete=true").to("bean:handleOrder");
We have introduced a pre move operation to move files before they are processed. This allows you to
mark which files have been scanned as they are moved to this sub folder before being processed.
from("file://inbox?preMove=inprogress").to("bean:handleOrder");
You can combine the pre move and the regular move:
from("file://inbox?preMove=inprogress&move=.done").to("bean:handleOrder");
So in this situation, the file is in the inprogress folder when being processed and after it's processed,
it's moved to the .done folder.
So if we want to move the file into a backup folder with today's date as the pattern, we can do:
move=backup/${date:now:yyyyMMdd}/${file:name}
ABOUT MOVEFAILED
343
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The moveFailed option allows you to move files that could not be processed succesfully to another
location such as a error folder of your choice. For example to move the files in an error folder with a
timestamp you can use moveFailed=/error/${file:name.noext}-
${date:now:yyyyMMddHHmmssSSS}.${file:name.ext}.
MESSAGE HEADERS
The following headers are supported by this component:
Header Description
Header Description
CamelFileNameOnly Only the file name (the name with no leading paths).
344
CHAPTER 46. FILE2
CamelFileAbsolutePath The absolute path to the file. For relative files this
path holds the relative path instead.
CamelFilePath The file path. For relative files this is the starting
directory + the relative filename. For absolute files
this is the absolute path.
BATCH CONSUMER
This component implements the Batch Consumer.
Property Description
This allows you, for example, to know how many files exists in this batch and let the Aggregator
aggregate this number of files.
345
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
When Apache Camel is producing files (writing files) there are a few gotchas affecting how to set a
filename of your choice. By default, Apache Camel will use the message ID as the filename, and since
the message ID is normally a unique generated ID, you will end up with filenames such as: ID-
MACHINENAME-2443-1211718892437-1-0. If such a filename is not desired, then you must provide a
filename in the CamelFileName message header. The constant, Exchange.FILE_NAME, can also be
used.
The sample code below produces files using the message ID as the filename:
from("direct:report").to("file:target/reports");
And a syntax where we set the filename on the endpoint with the fileName URI option.
from("direct:report").to("file:target/reports/?fileName=report.txt");
FILENAME EXPRESSION
Filename can be set either using the expression option or as a string-based File Language expression
in the CamelFileName header. See the File Language for syntax and samples.
If you want only to consume files when a done file exists, then you can use the doneFileName option
on the endpoint.
from("file:bar?doneFileName=done");
346
CHAPTER 46. FILE2
Will only consume files from the bar folder, if a file name done exists in the same directory as the target
files. Camel will automatically delete the done file when it's done consuming the files.
However its more common to have one done file per target file. This means there is a 1:1 correlation. To
do this you must use dynamic placeholders in the doneFileName option. Currently Camel supports the
following two dynamic tokens: file:name and file:name.noext which must be enclosed in ${ }. The
consumer only supports the static part of the done file name as either prefix or suffix (not both).
from("file:bar?doneFileName=${file:name}.done");
In this example only files will be polled if there exists a done file with the name file name.done. For
example
You can also use a prefix for the done file, such as:
from("file:bar?doneFileName=ready-${file:name}");
After you have written af file you may want to write an additional done file as a kinda of marker, to
indicate to others that the file is finished and has been written. To do that you can use the
doneFileName option on the file producer endpoint.
.to("file:bar?doneFileName=done");
Will simply create a file named done in the same directory as the target file.
However its more common to have one done file per target file. This means there is a 1:1 correlation. To
do this you must use dynamic placeholders in the doneFileName option. Currently Camel supports the
following two dynamic tokens: file:name and file:name.noext which must be enclosed in ${ }.
.to("file:bar?doneFileName=done-${file:name}");
Will for example create a file named done-foo.txt if the target file was foo.txt in the same directory as
the target file.
.to("file:bar?doneFileName=${file:name}.done");
Will for example create a file named foo.txt.done if the target file was foo.txt in the same directory as
the target file.
.to("file:bar?doneFileName=${file:name.noext}.done");
347
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Will for example create a file named foo.done if the target file was foo.txt in the same directory as the
target file.
from("file://inputdir/?delete=true").to("file://outputdir")
from("file://inputdir/?delete=true").to("file://outputdir?overruleFile=copy-of-${file:name}")
Listen on a directory and create a message for each file dropped there. Copy the contents to the
outputdir and delete the file in the inputdir.
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir")
Listen on a directory and create a message for each file dropped there. Copy the contents to the
outputdir and delete the file in the inputdir. Will scan recursively into sub-directories. Will lay out the
files in the same directory structure in the outputdir as the inputdir, including any sub-directories.
inputdir/foo.txt
inputdir/sub/bar.txt
outputdir/foo.txt
outputdir/sub/bar.txt
USING FLATTEN
If you want to store the files in the outputdir directory in the same directory, disregarding the source
directory layout (e.g. to flatten out the path), you just add the flatten=true option on the file producer
side:
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir?flatten=true")
outputdir/foo.txt
outputdir/bar.txt
348
CHAPTER 46. FILE2
Apache Camel will by default move any processed file into a .camel subdirectory in the directory the
file was consumed from.
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
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
}
});
The body will be a File object that points to the file that was just dropped into the inputdir directory.
from("file://inputdir/").convertBodyTo(String.class).to("jms:test.queue")
By default the file endpoint sends a FileMessage which contains a File object as the body. If you send
this directly to the JMS component the JMS message will only contain the File object but not the
content. By converting the File to a String, the message will contain the file contents, which is
probably what you want.
<route>
<from uri="file://inputdir/"/>
<convertBodyTo type="java.lang.String"/>
<to uri="jms:test.queue"/>
</route>
WRITING TO FILES
Apache Camel is of course also able to write files, i.e. produce files. In the sample below we receive
some reports on the SEDA queue that we process before they are written to a directory.
349
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
assertMockEndpointsSatisfied();
}
// set the output filename using java code logic, notice that this is done by setting
// a special header property of the out exchange
exchange.getOut().setHeader(Exchange.FILE_NAME, "report.txt");
}
<route>
<from uri="bean:myBean"/>
<to uri="file:/rootDirectory"/>
</route>
You can have myBean set the header Exchange.FILE_NAME to values such as:
350
CHAPTER 46. FILE2
This allows you to have a single route to write files to multiple destinations.
from("direct:start").
to("file:///var/myapp/finalDirectory?tempPrefix=/../filesInProgress/");
from("file://inbox?move=backup/${date:now:yyyyMMdd}/${file:name}").to("...");
from("file://inbox?idempotent=true").to("...");
Camel uses the absolute file name as the idempotent key, to detect duplicate files. From Camel 2.11
onwards you can customize this key by using an expression in the idempotentKey option. For example
to use both the name and the file size as the key
<route>
<from uri="file://inbox?idempotent=true&dempotentKey=${file:name}-${file:size}"/>
<to uri="bean:processInbox"/>
</route>
By default Apache Camel uses an in-memory based store for keeping track of consumed files, it uses a
least recently used cache holding up to 1000 entries. You can plugin your own implementation of this
store by using the idempotentRepository option using the # sign in the value to indicate it's a
referring to a bean in the Registry with the specified id.
351
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from uri="file://inbox?idempotent=true&dempotentRepository=#myStore"/>
<to uri="bean:processInbox"/>
</route>
Apache Camel will log at DEBUG level if it skips a file because it has been consumed before:
DEBUG FileConsumer is idempotent and the file has been consumed before. Will skip this file:
target\idempotent\report.txt
We configure our repository using Spring XML creating our file idempotent repository and define our
file consumer to use our repository with the idempotentRepository using \# sign to indicate Registry
lookup:
<!-- this is our file based idempotent store configured to use the .filestore.dat as file -->
<bean id="fileStore" class="org.apache.camel.processor.idempotent.FileIdempotentRepository">
<!-- the filename for the store -->
<property name="fileStore" value="target/fileidempotent/.filestore.dat"/>
<!-- the max filesize in bytes for the file. Apache Camel will trunk and flush the cache
if the file gets bigger -->
<property name="maxFileStoreSize" value="512000"/>
<!-- the number of elements in our store -->
<property name="cacheSize" value="250"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file://target/fileidempotent/?
idempotent=true&dempotentRepository=#fileStore&ove=done/${file:name}"/>
<to uri="mock:result"/>
</route>
</camelContext>
352
CHAPTER 46. FILE2
<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"/>
</properties>
</persistence-unit>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<!-- we use idempotentDB as the persitence unit name defined in the persistence.xml file -->
<property name="persistenceUnitName" value="idempotentDb"/>
</bean>
And finally we can create our JPA idempotent repository in the spring XML file as well:
<!-- 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 spring jpaTemplate -->
<constructor-arg index="0" ref="jpaTemplate"/>
<!-- This 2nd parameter is the name (= a cateogry name).
You can have different repositories with different names -->
<constructor-arg index="1" value="FileConsumer"/>
</bean>
And then we just need to reference the jpaStore bean in the file consumer endpoint, using the
idempotentRepository option and the # syntax:
<route>
<from uri="file://inbox?idempotent=true&dempotentRepository=#jpaStore"/>
<to uri="bean:processInbox"/>
</route>
FILTER USING
ORG.APACHE.CAMEL.COMPONENT.FILE.GENERICFILEFILTER
Apache Camel supports pluggable filtering strategies. You can then configure the endpoint with such a
filter to skip certain files being processed.
In the sample we have built our own filter that skips files starting with skip in the filename:
353
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
And then we can configure our route using the filter attribute to reference our filter (using # notation)
that we have defined in the spring XML file:
<route>
<from uri="file://inbox?filter=#myFilter"/>
<to uri="bean:processInbox"/>
</route>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<template id="camelTemplate"/>
<!-- use myFilter as filter to allow setting ANT paths for which files to scan for -->
<endpoint id="myFileEndpoint" uri="file://target/antpathmatcher?
recursive=true&ilter=#myAntFilter"/>
<route>
<from ref="myFileEndpoint"/>
<to uri="mock:result"/>
</route>
</camelContext>
<!-- we use the antpath file filter to use ant paths for includes and exlucde -->
<bean id="myAntFilter" class="org.apache.camel.component.file.AntPathMatcherGenericFileFilter">
<!-- include and file in the subfolder that has day in the name -->
<property name="includes" value="**/subfolder/**/*day*"/>
<!-- exclude all files with bad in name or .xml files. Use comma to seperate multiple excludes -->
<property name="excludes" value="**/*bad*,**/*.xml"/>
</bean>
354
CHAPTER 46. FILE2
In the sample we have built our own comparator that just sorts by file name:
And then we can configure our route using the sorter option to reference to our sorter ( mySorter) we
have defined in the spring XML file:
<route>
<from uri="file://inbox?sorter=#mySorter"/>
<to uri="bean:processInbox"/>
</route>
In the Spring DSL route about notice that we can reference beans in the Registry by prefixing the id
with #. So writing sorter=#mySorter, will instruct Apache Camel to go look in the Registry for a bean
with the ID, mySorter.
Where each group is separated with semi colon. In the simple situations you just use one group, so a
simple example could be:
sortBy=file:name
This will sort by file name, you can reverse the order by prefixing reverse: to the group, so the sorting
is now Z..A:
sortBy=reverse:file:name
As we have the full power of File Language we can use some of the other parameters, so if we want to
sort by file size we do:
sortBy=file:length
355
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can configure to ignore the case, using ignoreCase: for string comparison, so if you want to use
file name sorting but to ignore the case then we do:
sortBy=ignoreCase:file:name
You can combine ignore case and reverse, however reverse must be specified first:
sortBy=reverse:ignoreCase:file:name
sortBy=file:modified
And then we want to group by name as a 2nd option so files with same modifcation is sorted by name:
sortBy=file:modified;file:name
Now there is an issue here, can you spot it? Well the modified timestamp of the file is too fine as it will
be in milliseconds, but what if we want to sort by date only and then subgroup by name? Well as we
have the true power of File Language we can use the its date command that supports patterns. So this
can be solved as:
sortBy=date:file:yyyyMMdd;file:name
Yeah, that is pretty powerful, oh by the way you can also use reverse per group, so we could reverse
the file names:
sortBy=date:file:yyyyMMdd;reverse:file:name
USING GENERICFILEPROCESSSTRATEGY
The option processStrategy can be used to use a custom GenericFileProcessStrategy that allows
you to implement your own begin, commit and rollback logic. For instance lets assume a system writes a
file in a folder you should consume. But you should not start consuming the file before another ready
file have been written as well.
In the begin() method we can test whether the special ready file exists. The begin method
returns a boolean to indicate if we can consume the file or not.
in the commit() method we can move the actual file and also delete the ready file.
DEBUG LOGGING
This component has log level TRACE that can be helpful if you have problems.
356
CHAPTER 46. FILE2
See also:
File Language
FTP2
357
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
FLATPACK COMPONENT
The Flatpack component supports fixed width and delimited file parsing using the FlatPack library .
Notice: This component only supports consuming from flatpack files to Object model. You can not
(yet) write from Object model to flatpack format.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
flatpack:[delim|fixed]:flatPackConfig.pzmap.xml[?options]
flatpack:someName[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
URI OPTIONS
358
CHAPTER 47. FLATPACK
EXAMPLES
flatpack:fixed:foo.pzmap.xml creates a fixed-width endpoint using the foo.pzmap.xml file
configuration.
MESSAGE HEADERS
Apache Camel will store the following headers on the IN message:
Header Description
MESSAGE BODY
The component delivers the data in the IN message as a
org.apache.camel.component.flatpack.DataSetList object that has converters for java.util.Map or
java.util.List. Usually you want the Map if you process one row at a time ( splitRows=true). Use List for
the entire content (splitRows=false), where each element in the list is a Map. Each Map contains the
key for the column name and its corresponding value.
However, you can also always get it as a List (even for splitRows=true). The same example:
359
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The example below illustrates this fact that we have a header and a trailer. You can omit one or both of
them if not needed.
<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>
You can also convert the payload of each message created to a Map for easy Bean Integration
360
CHAPTER 48. FOP
FOP COMPONENT
Available as of Camel 2.10
The FOP component allows you to render a message into different output formats using Apache FOP.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
fop://outputFormat?[options]
OUTPUT FORMATS
The primary output format is PDF but other output formats are also supported:
361
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
ENDPOINT OPTIONS
MESSAGE OPERATIONS
362
CHAPTER 48. FOP
EXAMPLE
Below is an example route that renders PDFs from XML data and XSLT template and saves the PDF
files in target folder:
from("file:source/data/xml")
.to("xslt:xslt/template.xsl")
.to("fop:application/pdf")
.to("file:target/data");
363
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
FREEMARKER
The freemarker: component allows you to process a message using a FreeMarker template. This can
be ideal when using Templating to generate responses for requests.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
freemarker:templateName[?options]
Where templateName is the classpath-local URI of the template to invoke; or the complete URL of the
remote template (for example, file://folder/myfile.ftl).
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
FREEMARKER CONTEXT
Apache Camel will provide exchange information in the FreeMarker context (just a Map). The
Exchange is transferred as:
Key Value
364
CHAPTER 49. FREEMARKER
From Camel 2.14, you can set up your custom FreeMarker context in the message header with the key,
CamelFreemarkerDataModel, like this:
HOT RELOADING
The FreeMarker template resource is by default not hot reloadable for both file and classpath
resources (expanded jar). If you set contentCache=false, then Apache Camel will not cache the
resource and hot reloading is thus enabled. This scenario can be used in development.
DYNAMIC TEMPLATES
Available as of Camel 2.1 Camel provides two headers by which you can define a different resource
location for a template or the template content itself. If any of these headers is set then Camel uses this
over the endpoint configured resource. This allows you to provide a dynamic template at runtime.
365
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SAMPLES
For example, you can define a route like the following:
from("activemq:My.Queue").
to("freemarker:com/acme/MyResponse.ftl");
To use a FreeMarker template to formulate a response to InOut message exchanges (where there is a
JMSReplyTo header).
If you want to process InOnly exchanges, you could use a FreeMarker template to transform the
message before sending it on to another endpoint:
from("activemq:My.Queue").
to(ExchangePattern.InOut,"freemarker:com/acme/MyResponse.ftl").
to("activemq:Another.Queue");
And to disable the content cache (for example, for development usage where the .ftl template should
be hot reloaded):
from("activemq:My.Queue").
to(ExchangePattern.InOut,"freemarker:com/acme/MyResponse.ftl?contentCache=false").
to("activemq:Another.Queue");
from("activemq:My.Queue").
to(ExchangePattern.InOut,"freemarker:file://myfolder/MyResponse.ftl?contentCache=false").
to("activemq:Another.Queue");
In Camel 2.1 it's possible to specify what template the component should use dynamically via a header,
so for example:
from("direct:in").
setHeader(FreemarkerConstants.FREEMARKER_RESOURCE_URI).constant("path/to/my/template.ftl
").
to("freemarker:dummy");
366
CHAPTER 49. FREEMARKER
@Test
public void testFreemarkerLetter() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedMessageCount(1);
mock.expectedBodiesReceived("Dear Ibsen, Claus\n\nThanks for the order of Camel in Action."
+ "\n\nRegards Camel Riders Bookstore\nPS: Next beer is on me, James");
template.send("direct:a", createLetter());
mock.assertIsSatisfied();
}
367
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
FTP/SFTP COMPONENT
This component provides access to remote file systems over the FTP and SFTP protocols.
Make sure you read the section titled Default when consuming files further below for details related to
consuming files.
URI FORMAT
ftp://[username@]hostname[:port]/directoryname[?options]
sftp://[username@]hostname[:port]/directoryname[?options]
ftps://[username@]hostname[:port]/directoryname[?options]
Where directoryname represents the underlying directory. Can contain nested folders.
If no username is provided, then anonymous login is attempted using no password. If no port number
is provided, Apache Camel will provide default values according to the protocol (ftp = 21, sftp = 22, ftps
= 21).
This component uses two different libraries for the actual FTP work. FTP and FTPS use Apache
Commons Net while SFTP uses JCraft JSCH.
You can append query options to the URI in the following format, ?option=value&option=value&...
URI OPTIONS
The options below are exclusive to the FTP component:
368
CHAPTER 50. FTP2
369
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
370
CHAPTER 50. FTP2
371
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
372
CHAPTER 50. FTP2
373
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
374
CHAPTER 50. FTP2
When using the ftpClient. properties related to SSL with the FTPS component, the trust
store accept all certificates. If you only want trust selective certificates, you have to
configure the trust store with the ftpClient.trustStore.xxx options or by configuring a
custom ftpClient.
375
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MORE OPTIONS
See File for more options, as all the options from File are inherited by FTP2.
You can configure additional options on the ftpClient and ftpClientConfig from the URI directly by
using the ftpClient. or ftpClientConfig. prefix.
For example to set the setDataTimeout on the FTPClient to 30 seconds you can do:
from("ftp://foo@myserver?password=secret&ftpClient.dataTimeout=30000")
.to("bean:foo");
You can mix and match and have use both prefixes, for example to configure date format or timezones.
from("ftp://foo@myserver?
password=secret&ftpClient.dataTimeout=30000&ftpClientConfig.serverLanguageCode=fr")
.to("bean:foo");
See the documentation of the Apache Commons FTP FTPClientConfig for possible options and more
details. And as well for Apache Commons FTP FTPClient .
If you do not like having many and long configuration in the url you can refer to the ftpClient or
ftpClientConfig to use by letting Camel lookup in the Registry for it.
For example:
And then let Camel lookup this bean when you use the # notation in the url.
from("ftp://foo@myserver?password=secret&ftpClientConfig=#myConfig").to("bean:foo");
IMPORTANT
See File2 as all the options there also applies for this component.
EXAMPLES
Here are some examples of FTP endpoint URIs:
ftp://[email protected]/public/upload/images/holiday2008?password=secret&binary=true
ftp://[email protected]:12049/reports/2008/password=secret&binary=false
ftp://publicftpserver.com/download
376
CHAPTER 50. FTP2
FTP CONSUMER DOES NOT SUPPORT CONCURRENCY
The FTP consumer (with the same endpoint) does not support concurrency (the
backing FTP client is not thread safe). You can use multiple FTP consumers to poll
from different endpoints. It is only a single endpoint that does not support
concurrent consumers.
The FTP producer does not have this issue, it supports concurrency.
MORE INFORMATION
This component is an extension of the File2 component. So there are more samples and details on the
File2 component page.
The regular File consumer is different as it will by default move files to a .camel sub directory. The
reason Camel does not do this by default for the FTP consumer is that it may lack permissions by
default to be able to move or delete files.
LIMITATIONS
The option readLock can be used to force Apache Camel not to consume files that are currently in the
process of being written. However, this option is turned off by default, as it requires that the user has
write access. There are other solutions to avoid consuming files that are currently being written over
FTP; for instance, you can write to a temporary destination and move the file after it has been written.
The ftp producer does not support appending to existing files. Any existing files on the remote server
will be deleted before the file is written.
MESSAGE HEADERS
The following message headers can be used to affect the behavior of the component
Header Description
377
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In addition the FTP/FTPS consumer and producer will enrich the Camel Message with the following
headers:
Header Description
CamelFtpReplyCode Camel 2.11.1: The FTP client reply code (the type is a
integer)
ABOUT TIMEOUTS
The two sets of libraries (see above) have different APIs for setting the timeout. You can use the
connectTimeout option for both of them to set a timeout in milliseconds to establish a network
connection. An individual soTimeout can also be set on the FTP/FTPS, which corresponds to using
ftpClient.soTimeout. Notice SFTP will automatically use connectTimeout as its soTimeout. The
timeout option only applies for FTP/FTSP as the data timeout, which corresponds to the
ftpClient.dataTimeout value. All timeout values are in milliseconds.
Apache Camel will store to a local file with the same name as the remote file, though with .inprogress
as extension while the file is being downloaded. Afterwards, the file is renamed to remove the
.inprogress suffix. And finally, when the Exchange is complete the local file is deleted.
So if you want to download files from a remote FTP server and store it as files then you need to route
to a file endpoint such as:
from("ftp://[email protected]?password=secret&localWorkDirectory=/tmp").to("file://inbox");
378
CHAPTER 50. FTP2
The route above is ultra efficient as it avoids reading the entire file content into memory. It will
download the remote file directly to a local file stream. The java.io.File handle is then used as the
Exchange body. The file producer leverages this fact and can work directly on the work file java.io.File
handle and perform a java.io.File.rename to the target filename. As Apache Camel knows it's a local
work file, it can optimize and use a rename instead of a file copy, as the work file is meant to be deleted
anyway.
stepwise
not stepwise
You may want to pick either one depending on your situation and security issues. Some Camel end
users can only download files if they use stepwise, while others can only download if they do not. At
least you have the choice to pick.
Note that stepwise changing of directory will in most cases only work when the user is confined to it's
home directory and when the home directory is reported as /.
The difference between the two of them is best illustrated with an example. Suppose we have the
following directory structure on the remote FTP server we need to traverse and download files:
/
/one
/one/two
/one/two/sub-a
/one/two/sub-b
And that we have a file in each of sub-a (a.txt) and sub-b (b.txt) folder.
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.
379
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
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
380
CHAPTER 50. FTP2
As you can see when stepwise is enabled, it will traverse the directory structure using CD xxx.
USING STEPWISE=FALSE
The following log shows the conversation between the FTP endpoint and the remote FTP server when
the FTP endpoint is operating in non-stepwise mode:
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
381
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
QUIT
221 Goodbye
disconnected.
As you can see when not using stepwise, there are no CD operation invoked at all.
SAMPLES
In the sample below we set up Apache Camel to download all the reports from the FTP server once
every hour (60 min) as BINARY content and store it as files on the local file system.
// from the given FTP server we poll (= download) all the files
// from the public/reports folder as BINARY types and store this as files
// in a local directory. Apache Camel will use the filenames from the FTPServer
// notice that the FTPConsumer properties must be prefixed with "consumer." in the URL
// the delay parameter is from the FileConsumer component so we should use consumer.delay
as
// the URI parameter name. The FTP Component is an extension of the File Component.
from("ftp://tiger:scott@localhost/public/reports?binary=true&consumer.delay=" + delay).
to("file://target/test-reports");
}
};
}
<route>
<from uri="ftp://scott@localhost/public/reports?password=tiger&inary=true&elay=60000"/>
<to uri="file://target/test-reports"/>
</route>
from("seda:start")
// define the file name so that only a single file is polled and deleted once retrieved
.pollEnrich("ftp://admin@localhost:21/getme?
password=admin&binary=false&fileName=myFile.txt&delete=true")
.to("mock:result");
382
CHAPTER 50. FTP2
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");
from("ftps://admin@localhost:2222/public/camel?
password=admin&ftpClient.trustStore.file=./src/test/resources/server.jks&ftpClient.trustStore.password=
password")
.to("bean:foo");
FILTER USING
ORG.APACHE.CAMEL.COMPONENT.FILE.GENERICFILEFILTER
Apache Camel supports pluggable filtering strategies. You define a filter strategy by implementing the
org.apache.camel.component.file.GenericFileFilter interface in Java. You can then configure the
endpoint with the filter to skip certain files.
In the following sample we define a filter that only accepts files whose filename starts with report.
And then we can configure our route using the filter attribute to reference our filter (using # notation)
that we have defined in the spring XML file:
<route>
<from uri="ftp://[email protected]?password=secret&filter=#myFilter"/>
<to uri="bean:processInbox"/>
</route>
383
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<template id="camelTemplate"/>
<!-- use myFilter as filter to allow setting ANT paths for which files to scan for -->
<endpoint id="myFTPEndpoint"
uri="ftp://admin@localhost:${SpringFileAntPathMatcherRemoteFileFilterTest.ftpPort}/antpath?
password=admin&ecursive=true&elay=10000&nitialDelay=2000&ilter=#myAntFilter"/>
<route>
<from ref="myFTPEndpoint"/>
<to uri="mock:result"/>
</route>
</camelContext>
<!-- we use the AntPathMatcherRemoteFileFilter to use ant paths for includes and exclude -->
<bean id="myAntFilter" class="org.apache.camel.component.file.AntPathMatcherGenericFileFilter">
<!-- include any files in the sub-folder that have day in the name -->
<property name="includes" value="**/subfolder/**/*day*"/>
<!-- exclude all files with bad in name or .xml files. Use comma to seperate multiple excludes -->
<property name="excludes" value="**/*bad*,**/*.xml"/>
</bean>
<route>
<from uri="sftp://localhost:9999/root?username=admin&password=admin&proxy=#proxy"/>
<to uri="bean:processFile"/>
</route>
You can also assign a user name and password to the proxy, if necessary. Please consult the
documentation for com.jcraft.jsch.Proxy to discover all options.
384
CHAPTER 50. FTP2
component, use preferredAuthentications option. If for example you would like Camel to attempt to
authenticate with private/public SSH key and fallback to user/password authentication in the case
when no public key is available, use the following route configuration:
from("sftp://localhost:9999/root?
username=admin&password=admin&preferredAuthentications=publickey,password")
.to("bean:processFile");
For example to have a Camel route that pickup a single file, and delete it after use you can do
from("ftp://admin@localhost:21/nolist/?
password=admin&stepwise=false&useList=false&ignoreFileNotFoundOrPermissionError=true&fileName
=report.txt&delete=true")
.to("activemq:queue:report");
Notice that we have use all the options we talked above above.
You can also use this with ConsumerTemplate. For example to download a single file (if it exists) and
grab the file content as a String type:
DEBUG LOGGING
This component has log level TRACE that can be helpful if you have problems.
385
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
TUTORIALS
A good starting point for using Apache Camel on GAE is the Tutorial for Camel on Google App
Engine
The Apache Camel components for Google App Engine (GAE) are part of the camel-gae project and
provide connectivity to GAE's cloud computing services. They make the GAE cloud computing
environment accessible to applications via Apache Camel interfaces. Following this pattern for other
cloud computing environments could make it easier to port Apache Camel applications from one cloud
computing provider to another. The following table lists the cloud computing services provided by
Google App Engine and the supporting Apache Camel components. The documentation of each
component can be found by following the link in the Camel Component column.
386
CHAPTER 51. GAE
Camel context
Setting up a SpringCamelContext on Google App Engine differs between Camel 2.1 and higher
versions. The problem is that usage of the Camel-specific Spring configuration XML schema from the
http://camel.apache.org/schema/spring namespace requires JAXB and Camel 2.1 depends on a
Google App Engine SDK version that doesn't support JAXB yet. This limitation has been removed since
Camel 2.2.
JMX must be disabled in any case because the javax.management package isn't on the App Engine
JRE whitelist.
org.apache.camel.component.gae.context.GaeDefaultCamelContext (extends
org.apache.camel.impl.DefaultCamelContext)
org.apache.camel.component.gae.context.GaeSpringCamelContext (extends
org.apache.camel.spring.SpringCamelContext)
Both disable JMX before startup. The GaeSpringCamelContext additionally provides setter methods
adding route builders as shown in the next example.
387
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
APPCTX.XML
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="camelContext"
class="org.apache.camel.component.gae.context.GaeSpringCamelContext">
<property name="routeBuilder" ref="myRouteBuilder" />
</bean>
<bean id="myRouteBuilder"
class="org.example.MyRouteBuilder">
</bean>
</beans>
Alternatively, use the routeBuilders property of the GaeSpringCamelContext for setting a list of
route builders. Using this approach, a SpringCamelContext can be configured on GAE without the
need for JAXB.
APPCTX.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">
<camel:camelContext id="camelContext">
<camel:jmxAgent id="agent" disabled="true" />
<camel:routeBuilder ref="myRouteBuilder"/>
</camel:camelContext>
<bean id="myRouteBuilder"
class="org.example.MyRouteBuilder">
</bean>
</beans>
The web.xml
388
CHAPTER 51. GAE
Running Apache Camel on GAE requires usage of the CamelHttpTransportServlet from camel-servlet.
The following example shows how to configure this servlet together with a Spring application context
XML file.
WEB.XML
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>CamelServlet</servlet-name>
<servlet-
class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-
class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>appctx.xml</param-value>
</init-param>
</servlet>
<!--
Mapping used for external requests
-->
<servlet-mapping>
<servlet-name>CamelServlet</servlet-name>
<url-pattern>/camel/*</url-pattern>
</servlet-mapping>
<!--
Mapping used for web hooks accessed by task queueing service.
-->
<servlet-mapping>
<servlet-name>CamelServlet</servlet-name>
<url-pattern>/worker/*</url-pattern>
</servlet-mapping>
</web-app>
The location of the Spring application context XML file is given by the contextConfigLocation init
parameter. The appctx.xml file must be on the classpath. The servlet mapping makes the Apache
Camel application accessible under http://<appname>.appspot.com/camel/... when deployed to
Google App Engine where <appname> must be replaced by a real GAE application name. The second
servlet mapping is used internally by the task queueing service for background processing via web
hooks. This mapping is relevant for the gtask component and is explained there in more detail.
51.2. GAUTH
gauth Component
389
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The gauth component is used by web applications to implement a Google-specific OAuth consumer. It
will be later extended to support other OAuth providers as well. Although this component belongs to
the Camel Components for Google App Engine (GAE), it can also be used to OAuth-enable non-GAE
web applications. For a detailed description of Google's OAuth implementation refer to the Google
OAuth API reference .
URI format
gauth://name[?options]
The endpoint name can be either authorize or upgrade. An authorize endpoint is used to obtain an
unauthorized request token from Google and to redirect the user to the authorization page. The
upgrade endpoint is used to process OAuth callbacks from Google and to upgrade an authorized
request token to a long-lived access token. Refer to the usage section for an example.
Options
390
CHAPTER 51. GAE
391
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Message headers
Message body
The gauth component doesn't read or write message bodies.
Component configuration
392
CHAPTER 51. GAE
Some endpoint options such as consumerKey, consumerSecret or keyLoader are usually set to the
same values on gauth:authorize and gauth:upgrade endpoints. The gauth component allows to
configure them on component-level. These settings are then inherited by gauth endpoints and need
not be set redundantly in the endpoint URIs. Here are some configuration examples.
<!-- Loads the private key from a Java key store -->
<bean id="jksLoader"
class="org.apache.camel.component.gae.auth.GAuthJksLoader">
<property name="keyStoreLocation" value="myKeytore.jks" />
<property name="keyAlias" value="myKey" />
<property name="keyPass" value="myKeyPassword" />
<property name="storePass" value="myStorePassword" />
</bean>
Usage
393
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Here's the minimum setup for adding OAuth to a (non-GAE) web application. In the following example,
it is assumed that the web application is running on gauth.example.org.
GAUTHROUTEBUILDER.JAVA
import java.net.URLEncoder;
import org.apache.camel.builder.RouteBuilder;
@Override
public void configure() throws Exception {
// Calback URL to redirect user from Google Authorization back to the web
application
String encodedCallback =
URLEncoder.encode("https://gauth.example.org:8443/handler", "UTF-8");
// Application will request for authorization to access a user's Google Calendar
String encodedScope =
URLEncoder.encode("http://www.google.com/calendar/feeds/", "UTF-8");
// Route 2: Handle callback from Google. After the user granted access to Google
Calendar
// Google redirects the user to https://gauth.example.org:8443/handler (see
callback) along
// with an authorized request token. The gauth:access endpoint exchanges the
authorized
// request token against a long-lived access token.
from("jetty:https://0.0.0.0:8443/handler")
.to("gauth:upgrade")
// The access token can be obtained from
//
exchange.getOut().getHeader(GAuthUpgradeBinding.GAUTH_ACCESS_TOKEN)
// The access token secret can be obtained from
//
exchange.getOut().getHeader(GAuthUpgradeBinding.GAUTH_ACCESS_TOKEN_SEC
RET)
.process(/* store the tokens in context of the current user ... */);
}
394
CHAPTER 51. GAE
Google redirects the user to the web application which handles the callback and finally obtains a long-
lived access token from Google.
These two routes can perfectly co-exist with any other web application framework. The framework
provides the basis for web application-specific functionality whereas the OAuth service provider
integration is done with Apache Camel. The OAuth integration part could even use resources from an
existing servlet container by using the servlet component instead of the jetty component.
Application should store the access token in context of the current user. If the user logs in
next time, the access token can directly be loaded from the database, for example, without
doing the OAuth dance again.
The access token is then used to get access to Google services, such as a Google Calendar API,
on behalf of the user. Java applications will most likely use the GData Java library for that. See
below for an example how to use the access token with the GData Java library to read a user's
calendar feed.
The user can revoke the access token at any time from his Google Accounts page. In this case,
access to the corresponding Google service will throw an authorization exception. The web
application should remove the stored access token and redirect the user again to the Google
authorization page for creating another one.
If you don't want that Google displays a warning message on the authorization page, you'll need to
register your web application and change the consumerKey and consumerSecret settings.
GAE example
To OAuth-enable a Google App Engine application, only some small changes in the route builder are
required. Assuming the GAE application hostname is camelcloud.appspot.com a configuration might
look as follows. Here, the ghttp component is used to handle HTTP(S) requests instead of the jetty
component.
395
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
GAUTHROUTEBUILDER
import java.net.URLEncoder;
import org.apache.camel.builder.RouteBuilder;
@Override
public void configure() throws Exception {
String encodedCallback =
URLEncoder.encode("https://camelcloud.appspot.com/handler", "UTF-8");
String encodedScope =
URLEncoder.encode("http://www.google.com/calendar/feeds/", "UTF-8");
from("ghttp:///authorize")
.to("gauth:authorize?callback=" + encodedCallback + "&scope=" +
encodedScope);
from("ghttp:///handler")
.to("gauth:upgrade")
.process(/* store the tokens in context of the current user ... */);
}
396
CHAPTER 51. GAE
import com.google.gdata.client.authn.oauth.OAuthHmacSha1Signer;
import com.google.gdata.client.authn.oauth.OAuthParameters;
import com.google.gdata.client.calendar.CalendarService;
import com.google.gdata.data.calendar.CalendarEntry;
import com.google.gdata.data.calendar.CalendarFeed;
import java.net.URL;
System.out.println("Your calendars:");
System.out.println();
51.3. GHTTP
ghttp Component
The ghttp component contributes to the Camel Components for Google App Engine (GAE). It provides
connectivity to the GAE URL fetch service but can also be used to receive messages from servlets (the
only way to receive HTTP requests on GAE). This is achieved by extending the Servlet component. As a
consequence, ghttp URI formats and options sets differ on the consumer-side ( from) and producer-
side (to).
URI format
397
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Options
398
CHAPTER 51. GAE
Message headers
On the producer side, the following headers of the Http component are supported.
On the consumer-side all headers of the Servlet component component are supported.
399
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Message body
On the producer side the in message body is converted to a byte[]. The out message body is made
available as InputStream. If the reponse size exceeds 1 megabyte a ResponseTooLargeException is
thrown by the URL fetch service (see quotas and limits).
Receiving messages
For receiving messages via the ghttp component, a CamelHttpTransportServlet must be configured
and mapped in the application's web.xml (see the section called “The web.xml” ). For example, to
handle requests targeted at http://<appname>.appspot.com/camel/* or http://localhost/camel/*
(when using a local development server) the following servlet mapping must be defined:
WEB.XML
...
<servlet>
<servlet-name>CamelServlet</servlet-name>
<servlet-
class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-
class>
...
</servlet>
...
<servlet-mapping>
<servlet-name>CamelServlet</servlet-name>
<url-pattern>/camel/*</url-pattern>
</servlet-mapping>
...
Endpoint URI path definitions are relative to this servlet mapping e.g. the route
from("ghttp:///greeting").transform().constant("Hello")
from("ghttp:///greeting?matchOnUriPrefix=true").transform().constant("Hello")
Sending messages
For sending resquests to external HTTP services the ghttp component uses the URL fetch service. For
example, the Apache Camel homepage can the retrieved with the following endpoint definition on the
producer-side.
from(...)
...
.to("ghttp://camel.apache.org")
...
400
CHAPTER 51. GAE
The HTTP method used depends on the Exchange.HTTP_METHOD message header or on the
presence of an in-message body (GET if null, POST otherwise). Retrieving the Camel homepage via a
GAE application is as simple as
from("ghttp:///home")
.to("ghttp://camel.apache.org")
from(...)
...
.to("ghttps://svn.apache.org/repos/asf/camel/trunk/")
...
Dependencies
Maven users will need to add the following dependency to their pom.xml.
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-gae</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Apache Camel (2.1.0 or higher).
51.4. GLOGIN
glogin Component
Available in Apache Camel 2.3 (or latest development snapshot).
The glogin component is used by Apache Camel applications outside Google App Engine (GAE) for
programmatic login to GAE applications. It is part of the Chapter 51, GAE. Security-enabled GAE
applications normally redirect the user to a login page. After submitting username and password for
authentication, the user is redirected back to the application. That works fine for applications where
the client is a browser. For all other applications, the login process must be done programmatically. All
the necessary steps for programmatic login are implemented by the glogin component. These are
1. Get an authentication token from Google Accounts via the ClientLogin API.
The authorization cookie must then be send with subsequent HTTP requests to the GAE application. It
expires after 24 hours and must then be renewed.
URI format
401
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
glogin://hostname[:port][?options]
The hostname is either the internet hostname of a GAE application (e.g. camelcloud.appspot.com) or
the name of the host where the development server is running (e.g. localhost). The port is only used
when connecting to a development server (i.e. when devMode=true, see options) and defaults to 8080.
Options
Message headers
402
CHAPTER 51. GAE
Message body
The glogin component doesn't read or write message bodies.
Usage
The following JUnit test show an example how to login to a development server as well as to a
deployed GAE application located at http://camelcloud.appspot.com.
403
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
GLOGINTEST.JAVA
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.ProducerTemplate;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@Test
public void testDevLogin() {
Exchange result = template.request("glogin://localhost:8888?
[email protected]&devMode=true", null);
assertNotNull(result.getOut().getHeader(GLOGIN_COOKIE));
}
@Test
public void testRemoteLogin() {
Exchange result = template.request("glogin://camelcloud.appspot.com", new
Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(GLOGIN_USER_NAME,
"[email protected]");
exchange.getIn().setHeader(GLOGIN_PASSWORD, "replaceme");
}
});
assertNotNull(result.getOut().getHeader(GLOGIN_COOKIE));
}
The resulting authorization cookie from login to a development server looks like
[email protected]:false:11223191102230730701;Path=/
The resulting authorization cookie from login to a deployed GAE application looks (shortened) like
51.5. GMAIL
gmail Component
404
CHAPTER 51. GAE
The gmail component contributes to the Camel Components for Google App Engine (GAE). It supports
sending of emails via the GAE mail service. Receiving mails is not supported yet but will be added later.
Currently, only Google accounts that are application administrators can send emails.
URI format
gmail://[email protected][?options]
gmail://[email protected][?options]
Options
Message headers
405
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Message body
On the producer side the in message body is converted to a String.
Usage
...
.setHeader(GMailBinding.GMAIL_SUBJECT, constant("Hello"))
.setHeader(GMailBinding.GMAIL_TO, constant("[email protected]"))
.to("gmail://[email protected]");
Dependencies
Maven users will need to add the following dependency to their pom.xml.
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-gae</artifactId>
<version>${camel-version}</version>
</dependency>
where $\{camel-version\} must be replaced by the actual version of Apache Camel (2.1.0 or higher).
406
CHAPTER 51. GAE
51.6. GSEC
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>CamelServlet</servlet-name>
<servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-
class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>appctx.xml</param-value>
</init-param>
</servlet>
<!--
Mapping used for external requests
-->
<servlet-mapping>
<servlet-name>CamelServlet</servlet-name>
<url-pattern>/camel/*</url-pattern>
</servlet-mapping>
<!--
Mapping used for web hooks accessed by task queueing service.
-->
<servlet-mapping>
<servlet-name>CamelServlet</servlet-name>
<url-pattern>/worker/*</url-pattern>
</servlet-mapping>
<!--
By default allow any user who is logged in to access the whole
application.
-->
407
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
<!--
Allow only admin users to access /worker/* URLs e.g. to prevent
normal user to access gtask web hooks.
-->
<security-constraint>
<web-resource-collection>
<url-pattern>/worker/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
</web-app>
51.7. GTASK
gtask Component
The gtask component contributes to the Camel Components for Google App Engine (GAE). It supports
asynchronous message processing on GAE by using the task queueing service as message queue. For
adding messages to a queue it uses the task queue API. For receiving messages from a queue it installs
an HTTP callback handler. The handler is called by an HTTP POST callback (a web hook) initiated by
the task queueing service. Whenever a new task is added to a queue a callback will be sent. The gtask
component abstracts from these details and supports endpoint URIs that make message queueing on
GAE as easy as message queueing with JMS or SEDA.
URI format
gtask://queue-name
Options
408
CHAPTER 51. GAE
Message headers
On the consumer-side all headers of the Servlet component component are supported plus the
following.
409
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Message body
On the producer side the in message body is converted to a byte[] and is POSTed to the callback
handler as content-type application/octet-stream.
Usage
Setting up tasks queues is an administrative task on Google App Engine. Only one queue is pre-
configured and can be referenced by name out-of-the-box: the default queue. This queue will be used
in the following examples. Please note that when using task queues on the local development server,
tasks must be executed manually from the developer console.
Default queue
...
.to(gtask:default) // add message to default queue
WEB.XML
...
<servlet>
<servlet-name>CamelServlet</servlet-name>
<servlet-
class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-
class>
...
</servlet>
...
<servlet-mapping>
<servlet-name>CamelServlet</servlet-name>
<url-pattern>/worker/*</url-pattern>
</servlet-mapping>
...
Dependencies
Maven users will need to add the following dependency to their pom.xml.
410
CHAPTER 51. GAE
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-gae</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Apache Camel (2.1.0 or higher).
411
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
GEOCODER COMPONENT
Available as of Camel 2.12
The geocoder: component is used for looking up geocodes (latitude and longitude) for a given address,
or reverse lookup. The component uses the Java API for Google Geocoder library.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
geocoder:address:name[?options]
geocoder:latlng:latitude,longitude[?options]
OPTIONS
You can append query options to the URI in the following format, ?option=value&option=value&...
If the option headersOnly is set to true then the message body is left as-is, and only headers will be
added to the Exchange.
412
CHAPTER 52. GEOCODER
MESSAGE HEADERS
Header Description
Notice not all headers may be provided depending on available data and mode in use (address vs
latlng).
SAMPLES
In the example below we get the latitude and longitude for Paris, France
from("direct:start")
.to("geocoder:address:Paris, France")
If you provide a header with the CamelGeoCoderAddress then that overrides the endpoint
configuration, so to get the location of Copenhagen, Denmark we can send a message with a headers as
shown:
from("direct:start")
.to("geocoder:latlng:40.714224,-73.961452")
413
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
To get the current location you can use "current" as the address as shown:
from("direct:start")
.to("geocoder:address:current")
414
CHAPTER 53. GITHUB
GITHUB COMPONENT
Available as of Camel 2.15
The GitHub component interacts with the GitHub API by encapsulating egit-github. It currently
provides polling for new pull requests, pull request comments, tags, and commits. It is also able to
produce comments on pull requests, as well as close the pull request entirely.
Rather than webhooks, this endpoint relies on simple polling. Reasons include:
The types of payloads we're polling aren't typically large (plus, paging is available in the API)
The need to support apps running somewhere not publicly accessible where a webhook would
fail
Note that the GitHub API is fairly expansive. Therefore, this component could be easily expanded to
provide additional interactions.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-github</artifactId>
<version>${camel-version}</version>
</dependency>
URI FORMAT
gihub://endpoint[?options]
MANDATORY OPTIONS:
Note that these can be configured directly through the endpoint.
Option Description
415
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CONSUMER ENDPOINTS:
PRODUCER ENDPOINTS:
GitHubInResponseTo
(integer): Required if
responding to another
inline comment on the
pull request diff. If left
off, a general comment
on the pull request
discussion is assumed.
closePullRequest none
GitHubPullRequest
(integer) (REQUIRED):
Pull request number.
URI OPTIONS
416
CHAPTER 53. GITHUB
delay 60 in seconds
417
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
GOOGLECALENDAR COMPONENT
Available as of Camel 2.15
COMPONENT DESCRIPTION
The Google Calendar component provides access to Google Calendar via the Google Calendar Web
APIs.
Google Calendar uses the OAuth 2.0 protocol for authenticating a Google account and authorizing
access to user data. Before you can use this component, you will need to create an account and
generate OAuth credentials. Credentials comprise of a clientId, clientSecret, and a refreshToken. A
handy resource for generating a long-lived refreshToken is the OAuth playground.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-google-calendar</artifactId>
<version>2.15-SNAPSHOT</version>
</dependency>
URI FORMAT
The GoogleCalendar Component uses the following URI format:
google-calendar://endpoint-prefix/endpoint?[options]
acl
calendars
channels
colors
events
freebusy
list
settings
GOOGLECALENDARCOMPONENT
The GoogleCalendar Component can be configured with the options below. These options can be
provided using the component's bean property configuration of type
org.apache.camel.component.google.calendar.GoogleCalendarConfiguration.
418
CHAPTER 54. GOOGLECALENDAR
Option Type
PRODUCER ENDPOINTS
Producer endpoints can use endpoint prefixes followed by endpoint names and associated options
described next. A shorthand alias can be used for some endpoints. The endpoint URI MUST contain a
prefix.
Endpoint options that are not mandatory are denoted by []. When there are no mandatory options for
an endpoint, one of the set of [] options MUST be provided. Producer endpoints can also use a special
option inBody that in turn should contain the name of the endpoint option whose value will be
contained in the Camel Exchange In message.
Any of the endpoint options can be provided in either the endpoint URI, or dynamically in a message
header. The message header name must be of the format CamelGoogleCalendar.<option>. Note that
the inBody option overrides message header, i.e. the endpoint option inBody=option would override a
CamelGoogleCalendar.option header.
419
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
google-calendar://acl/endpoint?[options]
Name Type
calendarId String
content com.google.api.services.calendar.model.AclRule
contentChannel com.google.api.services.calendar.model.Channel
ruleId String
google-calendar://calendars/endpoint?[options]
420
CHAPTER 54. GOOGLECALENDAR
clear calendarId
delete calendarId
Name Type
calendarId String
content com.google.api.services.calendar.model.Calendar
google-calendar://channels/endpoint?[options]
stop contentChannel
Name Type
contentChannel com.google.api.services.calendar.model.Channel
421
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
google-calendar://colors/endpoint?[options]
get com.google.api.servi
ces.calendar.model.
Colors
Name Type
google-calendar://events/endpoint?[options]
422
CHAPTER 54. GOOGLECALENDAR
Name Type
calendarId String
content com.google.api.services.calendar.model.Event
contentChannel com.google.api.services.calendar.model.Channel
destination String
eventId String
text String
google-calendar://freebusy/endpoint?[options]
Name Type
423
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
content com.google.api.services.calendar.model.FreeBusyRe
quest
google-calendar://list/endpoint?[options]
delete calendarId
list com.google.api.servi
ces.calendar.model.
CalendarList
Name Type
calendarId String
content com.google.api.services.calendar.model.CalendarLis
tEntry
contentChannel com.google.api.services.calendar.model.Channel
424
CHAPTER 54. GOOGLECALENDAR
google-calendar://settings/endpoint?[options]
list com.google.api.servi
ces.calendar.model.
Settings
Name Type
contentChannel com.google.api.services.calendar.model.Channel
setting String
CONSUMER ENDPOINTS
Any of the producer endpoints can be used as a consumer endpoint. Consumer endpoints can use
Scheduled Poll Consumer Options with a consumer. prefix to schedule endpoint invocation. Consumer
endpoints that return an array or collection will generate one exchange per element, and their routes
will be executed once for each exchange.
MESSAGE HEADERS
Any URI option can be provided in a message header for producer endpoints with a
CamelGoogleCalendar. prefix.
MESSAGE BODY
All result message bodies utilize objects provided by the underlying APIs used by the
GoogleCalendarComponent. Producer endpoints can specify the option name for incoming message
body in the inBody endpoint URI parameter. For endpoints that return an array or collection, a
consumer endpoint will map every element to distinct messages.
425
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
GOOGLEDRIVE COMPONENT
Available as of Camel 2.14
The Google Drive component provides access to the Google Drive file storage service via the Google
Drive Web APIs.
Google Drive uses the OAuth 2.0 protocol for authenticating a Google account and authorizing access
to user data. Before you can use this component, you will need to create an account and generate
OAuth credentials. Credentials comprise of a clientId, clientSecret, and a refreshToken. A handy
resource for generating a long-lived refreshToken is the OAuth playground.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-google-drive</artifactId>
<version>2.14-SNAPSHOT</version>
</dependency>
URI FORMAT
The GoogleDrive Component uses the following URI format:
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
drive-revisions
426
CHAPTER 55. GOOGLEDRIVE
GOOGLEDRIVECOMPONENT
The GoogleDrive Component can be configured with the options below. These options can be provided
using the component's bean property configuration of type
org.apache.camel.component.google.drive.GoogleDriveConfiguration.
PRODUCER ENDPOINTS
Producer endpoints can use endpoint prefixes followed by endpoint names and associated options
described next. A shorthand alias can be used for some endpoints. The endpoint URI MUST contain a
prefix.
Endpoint options that are not mandatory are denoted by []. When there are no mandatory options for
an endpoint, one of the set of [] options MUST be provided. Producer endpoints can also use a special
option inBody that in turn should contain the name of the endpoint option whose value will be
contained in the Camel Exchange In message.
Any of the endpoint options can be provided in either the endpoint URI, or dynamically in a message
header. The message header name must be of the format CamelGoogleDrive.<option>. Note that the
inBody option overrides message header, i.e. the endpoint option inBody=option would override a
CamelGoogleDrive.option header.
427
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
For more information on the endpoints and options see API documentation at:
https://developers.google.com/drive/v2/reference/
google-drive://drive-about/endpoint?[options]
get com.google.api.servi
ces.drive.model.Abo
ut
Name Type
google-drive://drive-apps/endpoint?[options]
list com.google.api.servi
ces.drive.model.App
List
Name Type
appId String
428
CHAPTER 55. GOOGLEDRIVE
google-drive://drive-changes/endpoint?[options]
list com.google.api.servi
ces.drive.model.Cha
ngeList
Name Type
changeId String
contentChannel com.google.api.services.drive.model.Channe
l
google-drive://drive-channels/endpoint?[options]
stop contentChannel
Name Type
contentChannel com.google.api.services.drive.model.Channe
l
429
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The following endpoints can be invoked with the prefix drive-children as follows:
google-drive://drive-children/endpoint?[options]
Name Type
childId String
content com.google.api.services.drive.model.ChildRe
ference
folderId String
google-drive://drive-comments/endpoint?[options]
430
CHAPTER 55. GOOGLEDRIVE
Name Type
commentId String
content com.google.api.services.drive.model.Comme
nt
fileId String
google-drive://drive-files/endpoint?[options]
delete fileId
431
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
list com.google.api.servi
ces.drive.model.File
List
Name Type
content com.google.api.services.drive.model.File
contentChannel com.google.api.services.drive.model.Channe
l
fileId String
mediaContent com.google.api.client.http.AbstractInputStre
amContent
google-drive://drive-parents/endpoint?[options]
432
CHAPTER 55. GOOGLEDRIVE
Name Type
content com.google.api.services.drive.model.ParentR
eference
fileId String
parentId String
google-drive://drive-permissions/endpoint?[options]
433
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Type
content com.google.api.services.drive.model.Permis
sion
email String
fileId String
permissionId String
google-drive://drive-properties/endpoint?[options]
434
CHAPTER 55. GOOGLEDRIVE
Name Type
content com.google.api.services.drive.model.Propert
y
fileId String
propertyKey String
google-drive://drive-realtime/endpoint?[options]
get fileId
update [mediaContent] ,
fileId
Name Type
435
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
fileId String
mediaContent com.google.api.client.http.AbstractInputStre
amContent
google-drive://drive-replies/endpoint?[options]
Name Type
commentId String
content com.google.api.services.drive.model.Comme
ntReply
436
CHAPTER 55. GOOGLEDRIVE
fileId String
replyId String
google-drive://drive-revisions/endpoint?[options]
Name Type
content com.google.api.services.drive.model.Revisio
n
fileId String
revisionId String
CONSUMER ENDPOINTS
Any of the producer endpoints can be used as a consumer endpoint. Consumer endpoints can use
Scheduled Poll Consumer Options with a consumer. prefix to schedule endpoint invocation. Consumer
437
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
endpoints that return an array or collection will generate one exchange per element, and their routes
will be executed once for each exchange.
MESSAGE HEADERS
Any URI option can be provided in a message header for producer endpoints with a
CamelGoogleDrive. prefix.
MESSAGE BODY
All result message bodies utilize objects provided by the underlying APIs used by the
GoogleDriveComponent. Producer endpoints can specify the option name for incoming message body
in the inBody endpoint URI parameter. For endpoints that return an array or collection, a consumer
endpoint will map every element to distinct messages.
438
CHAPTER 56. GOOGLEMAIL
GOOGLEMAIL COMPONENT
Available as of Camel 2.15
COMPONENT DESCRIPTION
The Google Mail component provides access to Gmail via the Google Mail Web APIs .
Google Mail uses the OAuth 2.0 protocol for authenticating a Google account and authorizing access
to user data. Before you can use this component, you will need to create an account and generate
OAuth credentials. Credentials comprise of a clientId, clientSecret, and a refreshToken. A handy
resource for generating a long-lived refreshToken is the OAuth playground.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-google-mail</artifactId>
<version>2.15-SNAPSHOT</version>
</dependency>
URI FORMAT
The GoogleMail Component uses the following URI format:
google-mail://endpoint-prefix/endpoint?[options]
attachments
drafts
history
labels
messages
threads
users
GOOGLEMAILCOMPONENT
The GoogleMail Component can be configured with the options below. These options can be provided
using the component's bean property configuration of type
org.apache.camel.component.google.mail.GoogleMailConfiguration.
Option Type
439
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PRODUCER ENDPOINTS
Producer endpoints can use endpoint prefixes followed by endpoint names and associated options
described next. A shorthand alias can be used for some endpoints. The endpoint URI MUST contain a
prefix.
Endpoint options that are not mandatory are denoted by []. When there are no mandatory options for
an endpoint, one of the set of [] options MUST be provided. Producer endpoints can also use a special
option inBody that in turn should contain the name of the endpoint option whose value will be
contained in the Camel Exchange In message.
Any of the endpoint options can be provided in either the endpoint URI, or dynamically in a message
header. The message header name must be of the format CamelGoogleMail.<option>. Note that the
inBody option overrides message header, i.e. the endpoint option inBody=option would override a
CamelGoogleMail.option header.
For more information on the endpoints and options see API documentation at:
https://developers.google.com/gmail/api/v1/reference/
google-mail://attachments/endpoint?[options]
440
CHAPTER 56. GOOGLEMAIL
Name Type
id String
messageId String
userId String
google-mail://drafts/endpoint?[options]
441
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Type
content com.google.api.services.gmail.model.Draft
id String
mediaContent com.google.api.client.http.AbstractInputStreamCont
ent
userId String
google-mail://history/endpoint?[options]
Name Type
userId String
google-mail://labels/endpoint?[options]
442
CHAPTER 56. GOOGLEMAIL
Name Type
content com.google.api.services.gmail.model.Label
id String
userId String
google-mail://messages/endpoint?[options]
443
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Type
content com.google.api.services.gmail.model.Message
id String
mediaContent com.google.api.client.http.AbstractInputStreamCont
ent
modifyMessageRequest com.google.api.services.gmail.model.ModifyMessage
Request
userId String
google-mail://threads/endpoint?[options]
444
CHAPTER 56. GOOGLEMAIL
Name Type
content com.google.api.services.gmail.model.ModifyThreadR
equest
id String
userId String
google-mail://users/endpoint?[options]
Name Type
userId String
445
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CONSUMER ENDPOINTS
Any of the producer endpoints can be used as a consumer endpoint. Consumer endpoints can use
Scheduled Poll Consumer Options with a consumer. prefix to schedule endpoint invocation. Consumer
endpoints that return an array or collection will generate one exchange per element, and their routes
will be executed once for each exchange.
MESSAGE HEADERS
Any URI option can be provided in a message header for producer endpoints with a CamelGoogleMail.
prefix.
MESSAGE BODY
All result message bodies utilize objects provided by the underlying APIs used by the
GoogleMailComponent. Producer endpoints can specify the option name for incoming message body in
the inBody endpoint URI parameter. For endpoints that return an array or collection, a consumer
endpoint will map every element to distinct messages.
446
CHAPTER 57. GUAVA EVENTBUS
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
guava-eventbus:busName[?options]
OPTIONS
447
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
USAGE
Using guava-eventbus component on the consumer side of the route will capture messages sent to
the Guava EventBus and forward them to the Camel route. Guava EventBus consumer processes
incoming messages asynchronously.
from("guava-eventbus:busName").to("seda:queue");
Using guava-eventbus component on the producer side of the route will forward body of the Camel
exchanges to the Guava EventBus instance.
from("direct:start").to("guava-eventbus:busName");
eventBus.register(new Object(){
@Subscribe
public void messageHander(String message) {
System.out.println("Message received from the Camel: " + message);
}
});
DEADEVENT CONSIDERATIONS
Keep in mind that due to the limitations caused by the design of the Guava EventBus, you cannot
specify event class to be received by the listener without creating class annotated with @Subscribe
448
CHAPTER 57. GUAVA EVENTBUS
method. This limitation implies that endpoint with eventClass option specified actually listens to all
possible events (java.lang.Object) and filter appropriate messages programmatically at runtime. The
snipped below demonstrates an appropriate excerpt from the Camel code base.
@Subscribe
public void eventReceived(Object event) {
if (eventClass == null || eventClass.isAssignableFrom(event.getClass())) {
doEventReceived(event);
...
This drawback of this approach is that EventBus instance used by Camel will never generate
com.google.common.eventbus.DeadEvent notifications. If you want Camel to listen only to the
precisely specified event (and therefore enable DeadEvent support), use listenerInterface endpoint
option. Camel will create dynamic proxy over the interface you specify with the latter option and listen
only to messages specified by the interface handler methods. The example of the listener interface
with single method handling only SpecificEvent instances is demonstrated below.
package com.example;
@Subscribe
void eventReceived(SpecificEvent event);
The listener presented above could be used in the endpoint definition as follows.
from("guava-eventbus:busName?listenerInterface=com.example.CustomListener").to("seda:queue");
package com.example;
@Subscribe
void someEventReceived(SomeEvent event);
@Subscribe
void anotherEventReceived(AnotherEvent event);
The listener presented above could be used in the endpoint definition as follows.
from("guava-eventbus:busName?
listenerInterface=com.example.MultipleEventsListener").to("seda:queue");
449
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
HAWTDB
Available as of Apache Camel 2.3
HawtDB is a very lightweight and embeddable key value database. It allows together with Apache
Camel to provide persistent support for various Apache Camel features, such as Aggregator.
DEPRECATED
HawtDBAggregationRepository
USING HAWTDBAGGREGATIONREPOSITORY
HawtDBAggregationRepository is an AggregationRepository which on the fly persists the
aggregated messages. This ensures that you will not loose messages, as the default aggregator will use
an in memory only AggregationRepository.
450
CHAPTER 58. HAWTDB
451
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The repositoryName option must be provided. Then either the persistentFileName or the hawtDBFile
must be provided.
RECOVERY
The HawtDBAggregationRepository will by default recover any failed Exchange. It does this by having
a background tasks that scans for failed Exchanges in the persistent store. You can use the
checkInterval option to set how often this task runs. The recovery works as transactional which
ensures that Apache Camel will try to recover and redeliver the failed Exchange. Any Exchange which
was found to be recovered will be restored from the persistent store and resubmitted and send out
again.
Only when an Exchange has been successfully processed it will be marked as complete which happens
when the confirm method is invoked on the AggregationRepository. This means if the same
Exchange fails again it will be kept retried until it success.
You can use option maximumRedeliveries to limit the maximum number of redelivery attempts for a
given recovered Exchange. You must also set the deadLetterUri option so Apache Camel knows where
to send the Exchange when the maximumRedeliveries was hit.
452
CHAPTER 58. HAWTDB
You can see some examples in the unit tests of camel-hawtdb, for example this test.
<route>
<from uri="direct:start"/>
<!-- aggregate using our strategy and hawtdb repo, and complete when we have 5 messages
aggregated -->
<aggregate strategyRef="myAggregatorStrategy" aggregationRepositoryRef="repo"
completionSize="5">
<!-- correlate by header with the key id -->
<correlationExpression><header>id</header></correlationExpression>
<!-- send aggregated messages to the mock endpoint -->
<to uri="mock:aggregated"/>
</aggregate>
</route>
</camelContext>
453
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
DEPENDENCIES
To use HawtDB in your Apache Camel routes you need to add the a dependency on camel-hawtdb.
If you use maven you could just add the following to your pom.xml, substituting the version number for
the latest & greatest release (see the download page for the latest versions ).
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-hawtdb</artifactId>
<version>2.3.0</version>
</dependency>
See Also:
SQL
Components
454
CHAPTER 59. HAZELCAST COMPONENT
HAZELCAST COMPONENT
Available as of Apache Camel 2.7
The hazelcast: component allows you to work with the Hazelcast distributed data grid / cache.
Hazelcast is a in memory data grid, entirely written in Java (single jar). It offers a great palette of
different data stores like map, multi map (same key, n values), queue, list and atomic number. The main
reason to use Hazelcast is its simple cluster support. If you have enabled multicast on your network
you can run a cluster with hundred nodes with no extra configuration. Hazelcast can simply configured
to add additional features like n copies between nodes (default is 1), cache persistence, network
configuration (if needed), near cache, enviction and so on. For more information consult the Hazelcast
documentation on http://www.hazelcast.com/docs.jsp.
Maven users will need to add the following dependency to their pom.xml for this component:
<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>
URI FORMAT
hazelcast:[ map | multimap | queue | topic | seda | set | atomicvalue | instance | list]:cachename[?
options]
OPTIONS
hazelcastInstanceName No
455
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
WARNING
You have to use the second prefix to define which type of data store you want to
use.
SECTIONS
1. Usage of map
2. Usage of multimap
3. Usage of queue
4. Usage of topic
5. Usage of list
6. Usage of seda
USAGE OF MAP
456
CHAPTER 59. HAZELCAST COMPONENT
WARNING
template.sendBodyAndHeader("direct:[put|get|update|delete|query]", "my-foo",
HazelcastConstants.OBJECT_ID, "4711");
from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.PUT_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX);
Spring DSL:
<route>
<from uri="direct:put" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>put</constant>
</setHeader>
<to uri="hazelcast:map:foo" />
</route>
from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.GET_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX)
.to("seda:out");
457
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Spring DSL:
<route>
<from uri="direct:get" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>get</constant>
</setHeader>
<to uri="hazelcast:map:foo" />
<to uri="seda:out" />
</route>
from("direct:update")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.UPDATE_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX);
Spring DSL:
<route>
<from uri="direct:update" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>update</constant>
</setHeader>
<to uri="hazelcast:map:foo" />
</route>
from("direct:delete")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.DELETE_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX);
Spring DSL:
<route>
<from uri="direct:delete" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>delete</constant>
</setHeader>
<to uri="hazelcast:map:foo" />
</route>
458
CHAPTER 59. HAZELCAST COMPONENT
from("direct:query")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.QUERY_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX)
.to("seda:out");
Spring DSL:
<route>
<from uri="direct:query" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>query</constant>
</setHeader>
<to uri="hazelcast:map:foo" />
<to uri="seda:out" />
</route>
For the query operation Hazelcast offers a SQL like syntax to query your distributed map.
459
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
WARNING
The object value will be stored within put and update actions inside the message body.
Here's a sample:
fromF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX)
.log("object...")
.choice()
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
.log("...added")
.to("mock:added")
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ENVICTED))
.log("...envicted")
.to("mock:envicted")
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.UPDATED))
.log("...updated")
.to("mock:updated")
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
.log("...removed")
460
CHAPTER 59. HAZELCAST COMPONENT
.to("mock:removed")
.otherwise()
.log("fail!");
WARNING
template.sendBodyAndHeader("direct:[put|get|update|delete|query]", "my-foo",
HazelcastConstants.OBJECT_ID, "4711");
461
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.PUT_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX);
Spring DSL:
<route>
<from uri="direct:put" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>put</constant>
</setHeader>
<to uri="hazelcast:map:foo" />
</route>
from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.GET_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX)
.to("seda:out");
Spring DSL:
<route>
<from uri="direct:get" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>get</constant>
</setHeader>
<to uri="hazelcast:map:foo" />
<to uri="seda:out" />
</route>
from("direct:update")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.UPDATE_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX);
Spring DSL:
<route>
462
CHAPTER 59. HAZELCAST COMPONENT
from("direct:delete")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.DELETE_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX);
Spring DSL:
<route>
<from uri="direct:delete" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>delete</constant>
</setHeader>
<to uri="hazelcast:map:foo" />
</route>
from("direct:query")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.QUERY_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX)
.to("seda:out");
Spring DSL:
<route>
<from uri="direct:query" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>query</constant>
</setHeader>
<to uri="hazelcast:map:foo" />
<to uri="seda:out" />
</route>
For the query operation Hazelcast offers a SQL like syntax to query your distributed map.
463
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
WARNING
464
CHAPTER 59. HAZELCAST COMPONENT
The object value will be stored within put and update actions inside the message body.
Here's a sample:
fromF("hazelcast:%sfoo", HazelcastConstants.MAP_PREFIX)
.log("object...")
.choice()
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
.log("...added")
.to("mock:added")
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ENVICTED))
.log("...envicted")
.to("mock:envicted")
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.UPDATED))
.log("...updated")
.to("mock:updated")
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
.log("...removed")
.to("mock:removed")
.otherwise()
.log("fail!");
465
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
WARNING
from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.PUT_OPERATION))
.to(String.format("hazelcast:%sbar", HazelcastConstants.MULTIMAP_PREFIX));
Spring DSL:
<route>
<from uri="direct:put" />
<log message="put.."/>
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>put</constant>
</setHeader>
<to uri="hazelcast:multimap:foo" />
</route>
from("direct:removevalue")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.REMOVEVALUE_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.MULTIMAP_PREFIX);
466
CHAPTER 59. HAZELCAST COMPONENT
Spring DSL:
<route>
<from uri="direct:removevalue" />
<log message="removevalue..."/>
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>removevalue</constant>
</setHeader>
<to uri="hazelcast:multimap:foo" />
</route>
To remove a value you have to provide the value you want to remove inside the message body. If you
have a multimap object } you have to put "my-foo" inside the message body to remove the "my-foo"
value.
from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.GET_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.MULTIMAP_PREFIX)
.to("seda:out");
Spring DSL:
<route>
<from uri="direct:get" />
<log message="get.."/>
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
<setHeader headerName="hazelcast.operation.type">
<constant>get</constant>
</setHeader>
<to uri="hazelcast:multimap:foo" />
<to uri="seda:out" />
</route>
from("direct:delete")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.DELETE_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.MULTIMAP_PREFIX);
Spring DSL:
<route>
<from uri="direct:delete" />
<log message="delete.."/>
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
467
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<setHeader headerName="hazelcast.operation.type">
<constant>delete</constant>
</setHeader>
<to uri="hazelcast:multimap:foo" />
</route>
template.sendBodyAndHeader("direct:[put|get|removevalue|delete]", "my-foo",
HazelcastConstants.OBJECT_ID, "4711");
fromF("hazelcast:%sbar", HazelcastConstants.MULTIMAP_PREFIX)
.log("object...")
.choice()
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
.log("...added")
.to("mock:added")
//.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ENVICTED))
// .log("...envicted")
// .to("mock:envicted")
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
.log("...removed")
.to("mock:removed")
.otherwise()
.log("fail!");
468
CHAPTER 59. HAZELCAST COMPONENT
WARNING
USAGE OF QUEUE
from("direct:add")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.ADD_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.QUEUE_PREFIX);
469
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:put")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.PUT_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.QUEUE_PREFIX);
from("direct:poll")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.POLL_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.QUEUE_PREFIX);
from("direct:peek")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.PEEK_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.QUEUE_PREFIX);
from("direct:offer")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.OFFER_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.QUEUE_PREFIX);
from("direct:removevalue")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.REMOVEVALUE_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.QUEUE_PREFIX);
fromF("hazelcast:%smm", HazelcastConstants.QUEUE_PREFIX)
.log("object...")
.choice()
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
.log("...added")
.to("mock:added")
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
.log("...removed")
.to("mock:removed")
.otherwise()
.log("fail!");
470
CHAPTER 59. HAZELCAST COMPONENT
USAGE OF TOPIC
from("direct:add")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.PUBLISH_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.PUBLISH_OPERATION);
fromF("hazelcast:%sfoo", HazelcastConstants.TOPIC_PREFIX)
.choice()
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.RECEIVED))
.log("...message received")
.otherwise()
.log("...this should never have happened")
USAGE OF LIST
from("direct:add")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.ADD_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.LIST_PREFIX);
from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.GET_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.LIST_PREFIX)
.to("seda:out");
471
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:set")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.SETVALUE_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.LIST_PREFIX);
from("direct:removevalue")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.REMOVEVALUE_OPERATION))
.toF("hazelcast:%sbar", HazelcastConstants.LIST_PREFIX);
WARNING
Please note that set,get and removevalue and not yet supported by hazelcast, will
be added in the future..
fromF("hazelcast:%smm", HazelcastConstants.LIST_PREFIX)
.log("object...")
.choice()
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
.log("...added")
.to("mock:added")
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.REMOVED))
.log("...removed")
.to("mock:removed")
.otherwise()
.log("fail!");
USAGE OF SEDA
SEDA component differs from the rest components provided. It implements a work-queue in order to
support asynchronous SEDA architectures, similar to the core "SEDA" component.
472
CHAPTER 59. HAZELCAST COMPONENT
Java DSL :
from("direct:foo")
.to("hazelcast:seda:foo");
Spring DSL :
<route>
<from uri="direct:start" />
<to uri="hazelcast:seda:foo" />
</route>
473
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Java DSL :
from("hazelcast:seda:foo")
.to("mock:result");
Spring DSL:
<route>
<from uri="hazelcast:seda:foo" />
<to uri="mock:result" />
</route>
WARNING
474
CHAPTER 59. HAZELCAST COMPONENT
WARNING
from("direct:set")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.SETVALUE_OPERATION))
.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>
Provide the value to set inside the message body (here the value is 10):
template.sendBody("direct:set", 10);
from("direct:get")
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.GET_OPERATION))
.toF("hazelcast:%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX);
Spring DSL:
<route>
<from uri="direct:get" />
<!-- If using version 2.8 and above set headerName to "CamelHazelcastOperationType" -->
475
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<setHeader headerName="hazelcast.operation.type">
<constant>get</constant>
</setHeader>
<to uri="hazelcast:atomicvalue:foo" />
</route>
You can get the number with long body = template.requestBody("direct:get", null, Long.class);.
from("direct:increment")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.INCREMENT_OPERATION))
.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>
The actual value (after increment) will be provided inside the message body.
from("direct:decrement")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.DECREMENT_OPERATION))
.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>
The actual value (after decrement) will be provided inside the message body.
476
CHAPTER 59. HAZELCAST COMPONENT
WARNING
There's a bug inside Hazelcast. So this feature may not work properly. Will be fixed
in 1.9.3.
Java DSL:
from("direct:destroy")
.setHeader(HazelcastConstants.OPERATION,
constant(HazelcastConstants.DESTROY_OPERATION))
.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>
CLUSTER SUPPORT
WARNING
Here's a sample:
fromF("hazelcast:%sfoo", HazelcastConstants.INSTANCE_PREFIX)
.log("instance...")
.choice()
.when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
.log("...added")
477
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.to("mock:added")
.otherwise()
.log("...removed")
.to("mock:removed");
Each event provides the following information inside the message header:
WARNING
478
CHAPTER 59. HAZELCAST COMPONENT
BY ITS NAME
<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>
BY INSTANCE
<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">
479
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<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"/>
480
CHAPTER 59. HAZELCAST COMPONENT
481
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
HBASE COMPONENT
Available as of Camel 2.10
This component provides an idemptotent repository, producers and consumers for Apache HBase.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-hbase</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
HBase groups columns into families, so just mapping a property to a column using a name
convention is just not enough.
HBase doesn't have the notion of type, which means that it stores everything as byte[] and
doesn't know if the byte[] represents a String, a Number, a serialized Java object or just binary
data.
To overcome these challenges, camel-hbase makes use of the message headers to specify the mapping
of the message to HBase columns. It also provides the ability to use some camel-hbase provided
classes that model HBase data and can be easily convert to and from xml/json etc. Finally it provides
the ability to the user to implement and use his own mapping strategy.
482
CHAPTER 60. HBASE
The HBase component can be provided a custom HBaseConfiguration object as a property or it can
create an HBase configuration object on its own based on the HBase related resources that are found
on classpath.
If no configuration object is provided to the component, the component will create one. The created
configuration will search the class path for an hbase-site.xml file, from which it will draw the
configuration. You can find more information about how to configure HBase clients at: HBase client
configuration and dependencies
HBASE PRODUCER
As mentioned above camel provides produers endpoints for HBase. This allows you to store, delete,
retrieve or query data from HBase using your camel routes.
hbase://table[?options]
Put
Get
Delete
Scan
483
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PUT OPERATIONS.
HBase is a column based store, which allows you to store data into a specific column of a specific row.
Columns are grouped into families, so in order to specify a column you need to specify the column
family and the qualifier of that column. To store data into a specific column you need to specify both
the column and the row.
The simplest scenario for storing data into HBase from a camel route, would be to store part of the
message body to specified HBase column.
<route>
<from uri="direct:in"/>
484
CHAPTER 60. HBASE
The route above assumes that the message body contains an object that has an id and value property
and will store the content of value in the HBase column myfamily:myqualifier in the row specified by id.
If we needed to specify more than one column/value pairs we could just specify additional column
mappings. Notice that you must use numbers from the second header onwards, for example RowId2,
RowId3, RowId4, and so on. Only the first header does not have the number 1.
<route>
<from uri="direct:in"/>
<!-- Set the HBase Row 1st column -->
<setHeader headerName="CamelHBaseRowId">
<el>${in.body.id}</el>
</setHeader>
<!-- Set the HBase Row 2nd column -->
<setHeader headerName="CamelHBaseRowId2">
<el>${in.body.id}</el>
</setHeader>
<!-- Set the HBase Value for 1st column -->
<setHeader headerName="CamelHBaseValue">
<el>${in.body.value}</el>
</setHeader>
<!-- Set the HBase Value for 2nd column -->
<setHeader headerName="CamelHBaseValue2">
<el>${in.body.othervalue}</el>
</setHeader>
<to uri="hbase:mytable?
operation=CamelHBasePut&amily=myfamily&ualifier=myqualifier&amily2=myfamily&ualifier2=myqualifier
2"/>
</route>
It is important to remember that you can use uri options, message headers or a combination of both. It
is recommended to specify constants as part of the uri and dynamic values as headers. If something is
defined both as header and as part of the uri, the header will be used.
GET OPERATIONS.
A Get Operation is an operation that is used to retrieve one or more values from a specified HBase
row. To specify what are the values that you want to retrieve you can just specify them as part of the
uri or as message headers.
<route>
<from uri="direct:in"/>
<!-- Set the HBase Row of the Get -->
<setHeader headerName="CamelHBaseRowId">
<el>${in.body.id}</el>
485
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
</setHeader>
<to uri="hbase:mytable?
operation=CamelHBaseGet&amily=myfamily&ualifier=myqualifier&alueType=java.lang.Long"/>
<to uri="log:out"/>
</route>
In the example above the result of the get operation will be stored as a header with name
CamelHBaseValue.
DELETE OPERATIONS.
You can also you camel-hbase to perform HBase delete operation. The delete operation will remove an
entire row. All that needs to be specified is one or more rows as part of the message headers.
<route>
<from uri="direct:in"/>
<!-- Set the HBase Row of the Get -->
<setHeader headerName="CamelHBaseRowId">
<el>${in.body.id}</el>
</setHeader>
<to uri="hbase:mytable?operation=CamelHBaseDelete"/>
</route>
SCAN OPERATIONS.
A scan operation is the equivalent of a query in HBase. You can use the scan operation to retrieve
multiple rows. To specify what columns should be part of the result and also specify how the values will
be converted to objects you can use either uri options or headers.
<route>
<from uri="direct:in"/>
<to uri="hbase:mytable?
operation=CamelHBaseScan&amily=myfamily&ualifier=myqualifier&alueType=java.lang.Long&owType=j
ava.lang.String"/>
<to uri="log:out"/>
</route>
In this case its probable that you also also need to specify a list of filters for limiting the results. You
can specify a list of filters as part of the uri and camel will return only the rows that satisfy ALL the
filters. To have a filter that will be aware of the information that is part of the message, camel defines
the ModelAwareFilter. This will allow your filter to take into consideration the model that is defined by
the message and the mapping strategy. When using a ModelAwareFilter camel-hbase will apply the
selected mapping strategy to the in message, will create an object that models the mapping and will
pass that object to the Filter.
For example to perform scan using as criteria the message headers, you can make use of the
ModelAwareColumnMatchingFilter as shown below.
<route>
<from uri="direct:scan"/>
<!-- Set the Criteria -->
<setHeader headerName="CamelHBaseFamily">
<constant>name</constant>
</setHeader>
486
CHAPTER 60. HBASE
<setHeader headerName="CamelHBaseQualifier">
<constant>first</constant>
</setHeader>
<setHeader headerName="CamelHBaseValue">
<el>in.body.firstName</el>
</setHeader>
<setHeader headerName="CamelHBaseFamily2">
<constant>name</constant>
</setHeader>
<setHeader headerName="CamelHBaseQualifier2">
<constant>last</constant>
</setHeader>
<setHeader headerName="CamelHBaseValue2">
<el>in.body.lastName</el>
</setHeader>
<!-- Set additional fields that you want to be return by skipping value -->
<setHeader headerName="CamelHBaseFamily3">
<constant>address</constant>
</setHeader>
<setHeader headerName="CamelHBaseQualifier3">
<constant>country</constant>
</setHeader>
<to uri="hbase:mytable?operation=CamelHBaseScan&ilters=#myFilterList"/>
</route>
The route above assumes that a pojo is with properties firstName and lastName is passed as the
message body, it takes those properties and adds them as part of the message headers. The default
mapping strategy will create a model object that will map the headers to HBase columns and will pass
that model the the ModelAwareColumnMatchingFilter. The filter will filter out any rows, that do not
contain columns that match the model. It is like query by example.
HBASE CONSUMER
The Camel HBase Consumer, will perform repeated scan on the specified HBase table and will return
the scan results as part of the message. You can either specify header mapping (default) or body
mapping. The later will just add the org.apache.camel.component.hbase.model.HBaseData as part of
the message body.
hbase://table[?options]
You can specify the columns that you want to be return and their types as part of the uri options:
hbase:mutable?
family=name&qualifer=first&valueType=java.lang.String&family=address&qualifer=number&valueType2=j
ava.lang.Integer&rowType=java.lang.Long
487
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The example above will create a model object that is consisted of the specified fields and the scan
results will populate the model object with values. Finally the mapping strategy will be used to map this
model to the camel message.
488
CHAPTER 60. HBASE
If the role of the rowModel is not clear, it allows you to construct the HBaseRow modle
programmatically instead of "describing" it with uri options (such as family, qualifier, type etc).
from("direct:in")
.idempotentConsumer(header("messageId"), repository)
.to("log:out);
HBASE MAPPING
489
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
It was mentioned above that you the default mapping strategies are header and body mapping. Below
you can find some detailed examples of how each mapping strategy works.
Header Value
CamelHBaseRowId myrow
CamelHBaseFamily myfamily
CamelHBaseQualifier myqualifier
CamelHBaseValue myvalue
To put more values for different columns and / or different rows you can specify additional headers
suffixed with the index of the headers, e.g:
Header Value
CamelHBaseRowId myrow
CamelHBaseFamily myfamily
CamelHBaseQualifier myqualifier
CamelHBaseValue myvalue
CamelHBaseRowId2 myrow2
CamelHBaseFamily2 myfamily
CamelHBaseQualifier2 myqualifier
CamelHBaseValue2 myvalue2
In the case of retrieval operations such as get or scan you can also specify for each column the type
that you want the data to be converted to. For exampe:
Header Value
CamelHBaseFamily myfamily
490
CHAPTER 60. HBASE
CamelHBaseQualifier myqualifier
CamelHBaseValueType Long
Please note that in order to avoid boilerplate headers that are considered constant for all messages,
you can also specify them as part of the endpoint uri, as you will see below.
hbase:mytable?mappingStrategy=body
To use the body mapping strategy the body needs to contain an instance of
org.apache.camel.component.hbase.model.HBaseData. You can construct t
The object above can be used for example in a put operation and will result in creating or updating the
row with id myRowId and add the value myvalue to the column myfamily:myqualifier. The body
mapping strategy might not seem very appealing at first. The advantage it has over the header
mapping strategy is that the HBaseData object can be easily converted to or from xml/json.
SEE ALSO
Polling Consumer
Apache HBase
491
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
HDFS COMPONENT
Available as of Camel 2.8
The hdfs component enables you to read and write messages from/to an HDFS file system. HDFS is
the distributed file system at the heart of Hadoop.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-hdfs</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
hdfs://hostname[:port][/path][?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
The path is treated in the following way:
1. as a consumer, if it's a file, it just reads the file, otherwise if it represents a directory it scans all
the file under the path satisfying the configured pattern. All the files under that directory must
be of the same type.
2. as a producer, if at least one split strategy is defined, the path is considered a directory and
under that directory the producer creates a different file per split named using the configured
UuidGenerator.
NOTE
When consuming from HDFS in normal mode, a file is split into chunks, producing a
message per chunk. You can configure the size of the chunk using the chunkSize option.
If you want to read from HDFS and write to a regular file using the File component, you
can set fileMode=Append to concatenate the chunks.
OPTIONS
492
CHAPTER 61. HDFS
493
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
BYTE for writing a byte, the java Byte class is mapped into a BYTE
BYTES for writing a sequence of bytes. It maps the java ByteBuffer class
BYTES is also used with everything else, for example, in Camel a file is sent around as an InputStream,
int this case is written in a sequence file or a map file as a sequence of bytes.
SPLITTING STRATEGY
In the current version of Hadoop opening a file in append mode is disabled, since it's not reliable
enough. So, for the moment, it's only possible to create new files. The Camel HDFS endpoint tries to
solve this problem in this way:
If the split strategy option has been defined, the hdfs path will be used as a directory and files
will be created using the configured UuidGenerator.
Every time a splitting condition is met, a new file is created. The splitStrategy option is defined
as a string with the following syntax: splitStrategy=<ST>:<value>,<ST>:<value>,*
494
CHAPTER 61. HDFS
BYTES a new file is created, and the old is closed when the number of written bytes is more
than <value>
MESSAGES a new file is created, and the old is closed when the number of written messages is
more than <value>
IDLE a new file is created, and the old is closed when no writing happened in the last <value>
milliseconds
NOTE
This strategy currently requires either setting an IDLE value or setting the
HdfsConstants.HDFS_CLOSE header to false to use the BYTES/MESSAGES
configuration, otherwise the file will be closed with each message
For example:
hdfs://localhost/tmp/simple-file?splitStrategy=IDLE:1000,BYTES:5
it means: a new file is created either when it has been idle for more than 1 second or if more than 5
bytes have been written. So, running hadoop fs ls /tmp/simplefile you'll see that multiple files have
been created.
MESSAGE HEADERS
The following headers are supported by this component:
Producer only
Header Description
When using the HDFS producer without a split strategy, the file output stream is by default closed
after the write. However you may want to keep the stream open, and only explicitly close the stream
later. For that you can use the header HdfsConstants.HDFS_CLOSE (value = "CamelHdfsClose") to
control this. Setting this value to a boolean allows you to explicit control whether the stream should be
closed or not.
Notice this does not apply if you use a split strategy, as there are various strategies that can control
when the stream is closed.
495
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
user. Hadoop uses the thread context class loader in order to load resources. Usually, the thread
context classloader will be the bundle class loader of the bundle that contains the routes. So, the
default configuration files need to be visible from the bundle class loader. A typical way to deal with it is
to keep a copy of core-default.xml in your bundle root. That file can be found in the hadoop-
common.jar.
496
CHAPTER 62. HDFS2
HDFS2 COMPONENT
Available as of Camel 2.13
The hdfs2 component enables you to read and write messages from/to an HDFS file system using
Hadoop 2.x. HDFS is the distributed file system at the heart of Hadoop.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-hdfs2</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
hdfs2://hostname[:port][/path][?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
The path is treated in the following way:
1. as a consumer, if it's a file, it just reads the file, otherwise if it represents a directory it scans all
the file under the path satisfying the configured pattern. All the files under that directory must
be of the same type.
2. as a producer, if at least one split strategy is defined, the path is considered a directory and
under that directory the producer creates a different file per split named using the configured
UuidGenerator.
NOTE
When consuming from HDFS in normal mode, a file is split into chunks, producing a
message per chunk. You can configure the size of the chunk using the chunkSize option.
If you want to read from HDFS and write to a regular file using the File component, you
can set fileMode=Append to concatenate the chunks.
OPTIONS
497
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
498
CHAPTER 62. HDFS2
BYTE for writing a byte, the java Byte class is mapped into a BYTE
BYTES for writing a sequence of bytes. It maps the java ByteBuffer class
BYTES is also used with everything else, for example, in Camel a file is sent around as an InputStream,
int this case is written in a sequence file or a map file as a sequence of bytes.
SPLITTING STRATEGY
In the current version of Hadoop opening a file in append mode is disabled since it's not very reliable.
So, for the moment, it's only possible to create new files. The Camel HDFS endpoint tries to solve this
problem in this way:
If the split strategy option has been defined, the hdfs path will be used as a directory and files
will be created using the configured UuidGenerator
Every time a splitting condition is met, a new file is created. The splitStrategy option is defined
as a string with the following syntax: splitStrategy=<ST>:<value>,<ST>:<value>,*
BYTES a new file is created, and the old is closed when the number of written bytes is more
499
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
than <value>
MESSAGES a new file is created, and the old is closed when the number of written messages is
more than <value>
IDLE a new file is created, and the old is closed when no writing happened in the last <value>
milliseconds
NOTE
note that this strategy currently requires either setting an IDLE value or setting the
HdfsConstants.HDFS_CLOSE header to false to use the BYTES/MESSAGES
configuration...otherwise, the file will be closed with each message
for example:
hdfs2://localhost/tmp/simple-file?splitStrategy=IDLE:1000,BYTES:5
it means: a new file is created either when it has been idle for more than 1 second or if more than 5
bytes have been written. So, running hadoop fs -ls /tmp/simple-file you'll see that multiple files have
been created.
MESSAGE HEADERS
The following headers are supported by this component:
PRODUCER ONLY
Header Description
Notice this does not apply if you use a split strategy, as there are various strategies that can control
when the stream is closed.
500
CHAPTER 62. HDFS2
As with camel-hdfs component, the default configuration files need to be visible from the bundle class
loader. A typical way to deal with it is to keep a copy of core-default.xml (and e.g., hdfs-default.xml) in
your bundle root.
2. Provide boilerplate initialization code which populates internal, static cache inside
org.apache.hadoop.fs.FileSystem class:
This way Hadoop 2.x will have correct mapping of URI schemes to filesystem implementations.
501
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
HIPCHAT COMPONENT
Available as of Camel 2.15.0
The Hipchat component supports producing and consuming messages from/to Hipchat service.
You must have a valid Hipchat user account and get a personal access token that you can use to
produce/consume messages.
URI FORMAT
hipchat://[host][:port]?options
You can append query options to the URI in the following format, ?options=value&option2=value&...
URI OPTIONS
502
CHAPTER 63. HIPCHAT
@Override
public void configure() throws Exception {
String hipchatEndpointUri = "hipchat://?authToken=XXXX&consumeUsers=@Joe,@John";
from(hipchatEndpointUri)
.idempotentConsumer(
simple("${in.header.HipchatMessageDate} ${in.header.HipchatFromUser}"),
MemoryIdempotentRepository.memoryIdempotentRepository(200)
)
.to("mock:result");
}
503
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
HIPCHAT PRODUCER
Producer can send messages to both Room's and User's simultaneously. The body of the exchange is
sent as message. Sample usage is shown below. Appropriate headers needs to be set.
@Override
public void configure() throws Exception {
String hipchatEndpointUri = "hipchat://?authToken=XXXX";
from("direct:start")
.to(hipchatEndpointUri)
.to("mock:result");
}
504
CHAPTER 63. HIPCHAT
DEPENDENCIES
Maven users will need to add the following dependency to their pom.xml.
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-hipchat</artifactId>
505
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Camel (2.15.0 or higher)
506
CHAPTER 64. HL7
HL7 COMPONENT
The HL7 component is used for working with the HL7 MLLP protocol and HL7 v2 messages using the
HAPI library .
Even more ease-of-use as it's integrated well with the Chapter 97, MINA2 - Deprecated
component.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-hl7</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
To expose a HL7 listener service, the camel-mina2 or camel-netty4 component is used with the
HL7MLLPCodec (mina2) or HL7MLLPNettyDecoder/HL7MLLPNettyEncoder (Netty4).
507
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
sync=true indicates that this listener is synchronous and therefore will return a HL7 response to the
caller. The HL7 codec is set up with codec=#hl7codec. Note that hl7codec is just a Spring bean ID, so
it could be named mygreatcodecforhl7 or whatever you like. The codec is also set up in the Spring
XML file:
The endpoint hl7MinaListener can then be used in a route as a consumer, as this Java DSL example
illustrates:
from("hl7MinaListener").beanRef("patientLookupService");
This is a very simple route that will listen for HL7 and route it to a service named
patientLookupService. This is also Spring bean ID, configured in the Spring XML as:
<bean id="patientLookupService"
class="com.mycompany.healthcare.service.PatientLookupService"/>
508
CHAPTER 64. HL7
Another powerful feature of Camel is that we can have our business logic in POJO classes that is not
tied to Camel as shown here:
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.model.v24.segment.QRD;
// find patient data based on the patient id and create a HL7 model object with the response
Message response = ... create and set response data
return response
}
Notice that this class uses just imports from the HAPI library and not from Camel.
sync=true indicates that this listener is synchronous and therefore will return a HL7 response to the
caller. The HL7 codec is set up with encoder=#hl7encoder and decoder=#hl7decoder. Note that
hl7encoder and hl7decoder are just bean IDs, so they could be named differently. The beans can be
set in the Spring XML file:
The hl7NettyListener endpoint can then be used in a route as a consumer, as this Java DSL example
illustrates:
from("hl7NettyListener").beanRef("patientLookupService");
As of Camel 2.14.1 you can also let both the Mina and Netty codecs use a plain byte[] as its data format
by setting the produceString property to false. The Type Converter is also capable of converting the
byte[] to/from HAPI HL7 model objects.
509
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The HL7v2 model uses Java objects from the HAPI library. Using this library, you can encode and
decode from the EDI format (ER7) that is mostly used with HL7v2.
The sample below is a request to lookup a patient with the patient ID 0101701234.
MSH|^~\\&|MYSENDER|MYRECEIVER|MYAPPLICATION||200612211200||QRY^A19|1234|P|2.4
QRD|200612211200|R|I|GetPatient|||1^RD|0101701234|DEM||
Using the HL7 model, you can work with a ca.uhn.hl7v2.model.Message object, for example to
retrieve a patient ID:
This is powerful when combined with the HL7 listener, because you don't have to work with byte[],
String or any other simple object formats. You can just use the HAPI HL7v2 model objects. If you know
the message type in advance, you can be more type-safe:
HL7 DATAFORMAT
The HL7 component ships with a HL7 data format that can be used to marshal or unmarshal HL7 model
objects.
marshal = from Message to byte stream (can be used when responding using the HL7 MLLP
codec)
unmarshal = from byte stream to Message (can be used when receiving streamed data from
the HL7 MLLP
To use the data format, simply instantiate an instance and invoke the marshal or unmarshal
operation in the route builder:
In the sample above, the HL7 is marshalled from a HAPI Message object to a byte stream and put on a
JMS queue. The next example is the opposite:
Here we unmarshal the byte stream into a HAPI Message object that is passed to our patient lookup
service.
510
CHAPTER 64. HL7
NOTE
As of HAPI 2.0 (used by Camel 2.11), the HL7v2 model classes are fully serializable. So
you can put HL7v2 messages directly into a JMS queue (i.e. without calling marshal()
and read them again directly from the queue (i.e. without calling unmarshal()).
IMPORTANT
As of Camel 2.11, unmarshal does not automatically fix segment separators any more by
converting \n to \r. If you need this conversion,
org.apache.camel.component.hl7.HL7#convertLFToCR provides a handy Expression
for this purpose.
IMPORTANT
As of Camel 2.14.1, both marshal and unmarshal evaluate the charset provided in the
field MSH-18. If this field is empty, by default the charset contained in the corresponding
Camel charset property/header is assumed. You can even change this default behaviour
by overriding the guessCharsetName method when inheriting from the
HL7DataFormat class.
There is a shorthand syntax in Camel for well-known data formats that are commonly used. Then you
don't need to create an instance of the HL7DataFormat object:
from("direct:hl7in").marshal().hl7().to("jms:queue:hl7out");
from("jms:queue:hl7out").unmarshal().hl7().to("patientLookupService");
MESSAGE HEADERS
The unmarshal operation adds these fields from the MSH segment as headers on the Camel message:
511
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CamelHL7ProcessingId MSH-11 P
All headers except CamelHL7Context are String types. If a header value is missing, its value is null.
OPTIONS
The HL7 Data Format supports the following options:
DEPENDENCIES
To use HL7 in your Camel routes you'll need to add a dependency on camel-hl7 listed above, which
implements this data format.
512
CHAPTER 64. HL7
The HAPI library is been split into a base library and several structure libraries, one for each HL7v2
message version:
By default camel-hl7 only references the HAPI base library. Applications are responsible for including
structure libraries themselves. For example, if an application works with HL7v2 message versions 2.4
and 2.5 then the following dependencies must be added:
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v24</artifactId>
<version>2.2</version>
<!-- use the same version as your hapi-base version -->
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v25</artifactId>
<version>2.2</version>
<!-- use the same version as your hapi-base version -->
</dependency>
Alternatively, an OSGi bundle containing the base library, all structures libraries and required
dependencies (on the bundle classpath) can be downloaded from the central Maven repository .
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-osgi-base</artifactId>
<version>2.2</version>
</dependency>
TERSER LANGUAGE
HAPI provides a Terser class that provides access to fields using a commonly used terse location
specification syntax. The Terser language allows to use this syntax to extract values from messages
and to use them as expressions and predicates for filtering, content-based routing etc.
Sample:
513
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
// extract patient ID from field QRD-8 in the QRY_A19 message above and put into message
header
from("direct:test1")
.setHeader("PATIENT_ID",terser("QRD-8(0)-1"))
.to("mock:test1");
// continue processing if extracted field equals a message header
from("direct:test2")
.filter(terser("QRD-8(0)-1").isEqualTo(header("PATIENT_ID"))
.to("mock:test2");
Sample:
// customize HapiContext some more ... e.g. enforce that PID-8 in ADT_A01 messages of version
2.4 is not empty
ValidationRuleBuilder builder = new ValidationRuleBuilder() {
@Override
protected void configure() {
forVersion(Version.V24)
.message("ADT", "A01")
.terser("PID-8", not(empty()));
}
};
514
CHAPTER 64. HL7
hapiContext.setValidationRuleBuilder(builder);
from("direct:test1")
.unmarshal(hl7) // uses the GenericParser returned from the HapiContext
.validate(messageConforms()) // uses the validation rules returned from the HapiContext
// equivalent with .validate(messageConformsTo(hapiContext))
// route continues from here
from("direct:test1")
.onException(Exception.class)
.handled(true)
.transform(ack()) // auto-generates negative ack because of exception in Exchange
.end()
.validate(messageConformsTo(defaultContext))
// do something meaningful here
...
// acknowledgement
.transform(ack())
MORE SAMPLES
In the following example, a plain String HL7 request is sent to an HL7 listener that sends back a
response:
String line1 =
"MSH|^~\\&|MYSENDER|MYRECEIVER|MYAPPLICATION||200612211200||QRY^A19|1234|P|2.4";
String line2 = "QRD|200612211200|R|I|GetPatient|||1^RD|0101701234|DEM||";
515
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In the next sample, HL7 requests from the HL7 listener are routed to the business logic, which is
implemented as plain POJO registered in the registry as hl7service:
Note that by using the HL7 DataFormat the Camel message headers are populated with the fields from
the MSH segment. The headers are particularly useful for filtering or content-based routing as shown
in the example above.
516
CHAPTER 65. HTTP
HTTP COMPONENT
The http: component provides HTTP-based endpoints for consuming external HTTP resources (as a
client to call external servers using HTTP).
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
http:hostname[:port][/resourceUri][?param1=value1][¶m2=value2]
Will by default use port 80 for HTTP and 443 for HTTPS.
CAMEL-HTTP VS CAMEL-JETTY
You can only produce to endpoints generated by the HTTP component. Therefore it
should never be used as input into your camel Routes. To bind/expose an HTTP endpoint
via a HTTP server as input to a camel route, you can use the Jetty Component or the
Servlet component.
EXAMPLES
Call the url with the body using POST and return response as out message. If body is null call URL
using GET and return response as out message
You can override the HTTP endpoint URI by adding a header. Camel will call the http://newhost. This is
very handy for e.g. REST urls.
Java DSL
517
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:start")
.setHeader(Exchange.HTTP_URI, simple("http://myserver/orders/${header.orderId}"))
.to("http://dummyhost");
URI parameters can either be set directly on the endpoint URI or as a header
Java DSL
from("direct:start")
.to("http://oldhost?order=123&detail=short");
from("direct:start")
.setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
.to("http://oldhost");
HTTPENDPOINT OPTIONS
518
CHAPTER 65. HTTP
519
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
520
CHAPTER 65. HTTP
When using authentication you must provide the choice of method for the authMethod or
authProxyMethod options. You can configure the proxy and authentication details on either the
HttpComponent or the HttpEndoint. Values provided on the HttpEndpoint will take precedence over
HttpComponent. Its most likely best to configure this on the HttpComponent which allows you to do
this once.
The HTTP component uses convention over configuration which means that if you have not explicit set
a authMethodPriority then it will fallback and use the select(ed) authMethod as priority as well. So if
you use authMethod.Basic then the auhtMethodPriority will be Basic only.
HTTPCOMPONENT OPTIONS
521
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MESSAGE HEADERS
522
CHAPTER 65. HTTP
The header name above are constants. For the spring DSL you have to use the value of the constant
instead of the name.
MESSAGE BODY
Camel will store the HTTP response from the external server on the OUT body. All headers from the IN
message will be copied to the OUT message, so headers are preserved during routing. Additionally
Camel will add the HTTP response headers as well to the OUT message headers.
RESPONSE CODE
Camel will handle according to the HTTP response code:
Response code is in the range 300..399, Camel regards it as a redirection response and will
throw a HttpOperationFailedException with the information.
Response code is 400+, Camel regards it as an external server failure and will throw a
HttpOperationFailedException with the information.
THROWEXCEPTIONONFAILURE
HTTPOPERATIONFAILEDEXCEPTION
This exception contains the following information:
523
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The following algorithm is used to determine if either GET or POST HTTP method should be used: 1.
Use method provided in header. 2. GET if query string is provided in header. 3. GET if endpoint is
configured with a query string. 4. POST if there is data to send (body is not null). 5. GET otherwise.
CONFIGURING A PROXY
Java DSL
from("direct:start")
.to("http://oldhost?proxyHost=www.myproxy.com&proxyPort=80");
There is also support for proxy authentication via the proxyUsername and proxyPassword options.
context.getProperties().put("http.proxyHost", <camelContext>
"172.168.18.9"); <properties>
context.getProperties().put("http.proxyPort" <property key="http.proxyHost"
"8080"); value="172.168.18.9"/>
<property key="http.proxyPort"
value="8080"/>
</properties>
</camelContext>
CONFIGURING CHARSET
If you are using POST to send data you can configure the charset
setProperty(Exchange.CHARSET_NAME, "iso-8859-1");
524
CHAPTER 65. HTTP
from("timer://foo?fixedRate=true&delay=0&period=10000")
.to("http://www.google.com")
.setHeader(FileComponent.HEADER_FILE_NAME, "message.html").to("file:target/google");
// We set throwExceptionOnFailure to false to let Camel return any response from the remove HTTP
server without thrown
// HttpOperationFailedException in case of failures.
// This allows us to handle all responses in the aggregation strategy where we can check the HTTP
response code
// and decide what to do. As this is based on an unit test we assert the code is 404
from("direct:start").enrich("http://localhost:{{port}}/myserver?
throwExceptionOnFailure=false&user=Camel", new AggregationStrategy() {
public Exchange aggregate(Exchange original, Exchange resource) {
// get the response code
Integer code = resource.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
assertEquals(404, code.intValue());
return resource;
}
}).to("mock:result");
525
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
DISABLING COOKIES
To disable cookies you can set the HTTP Client to ignore cookies by adding this URI option:
httpClient.cookiePolicy=ignoreCookies
ADVANCED USAGE
If you need more control over the HTTP producer you should use the HttpComponent where you can
set various classes to give you custom behavior.
SETTING MAXCONNECTIONSPERHOST
The HTTP Component has a org.apache.commons.httpclient.HttpConnectionManager where you
can configure various global configuration for the given component. By global, we mean that any
endpoint the component creates has the same shared HttpConnectionManager. So, if we want to set a
different value for the max connection per host, we need to define it on the HTTP component and not
on the endpoint URI that we usually use. So here comes:
First, we define the http component in Spring XML. Yes, we use the same scheme name, http, because
otherwise Camel will auto-discover and create the component with default settings. What we need is to
overrule this so we can set our options. In the sample below we set the max connection to 5 instead of
the default of 2.
<bean id="myHttpConnectionManager"
class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
<property name="params" ref="myHttpConnectionManagerParams"/>
</bean>
<bean id="myHttpConnectionManagerParams"
class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
<property name="defaultMaxConnectionsPerHost" value="5"/>
</bean>
526
CHAPTER 65. HTTP
Authorization Required. The solution was to set the following URI option:
httpClient.authenticationPreemptive=true
The version of the Apache HTTP client used in this component resolves SSL/TLS information from a
global "protocol" registry. This component provides an implementation,
org.apache.camel.component.http.SSLContextParametersSecureProtocolSocketFactory, of the
HTTP client's protocol socket factory in order to support the use of the Camel JSSE Configuration
utility. The following example demonstrates how to configure the protocol registry and use the
registered protocol information in a route.
ProtocolSocketFactory factory =
new SSLContextParametersSecureProtocolSocketFactory(scp);
Protocol.registerProtocol("https",
new Protocol(
"https",
factory,
443));
from("direct:start")
.to("https://mail.google.com/mail/").to("mock:results");
However if you just want to specify the keystore and truststore you can do this with Apache HTTP
HttpClientConfigurer, for example:
527
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Protocol.registerProtocol("https", authhttps);
And then you need to create a class that implements HttpClientConfigurer, and registers https
protocol providing a keystore or truststore per example above. Then, from your camel route builder
class you can hook it up like so:
If you are doing this using the Spring DSL, you can specify your HttpClientConfigurer using the URI.
For example:
<bean id="myHttpClientConfigurer"
class="my.https.HttpClientConfigurer">
</bean>
<to uri="https://myhostname.com:443/myURL?httpClientConfigurerRef=myHttpClientConfigurer"/>
As long as you implement the HttpClientConfigurer and configure your keystore and truststore as
described above, it will work fine.
Jetty
528
CHAPTER 66. HTTP4
HTTP4 COMPONENT
Available as of Camel 2.3
The http4: component provides HTTP-based endpoints for calling external HTTP resources (as a client
to call external servers using HTTP).
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http4</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
CAMEL-HTTP4 VS CAMEL-HTTP
Camel-http4 uses Apache HttpClient 4.x while camel-http uses Apache HttpClient 3.x.
URI FORMAT
http4:hostname[:port][/resourceUri][?options]
Will by default use port 80 for HTTP and 443 for HTTPS.
You can append query options to the URI in the following format, ?option=value&option=value&...
CAMEL-HTTP4 VS CAMEL-JETTY
You can only produce to endpoints generated by the HTTP4 component. Therefore it
should never be used as input into your Camel Routes. To bind/expose an HTTP
endpoint via a HTTP server as input to a Camel route, use the Jetty Component instead.
HTTPCOMPONENT OPTIONS
529
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
530
CHAPTER 66. HTTP4
HTTPENDPOINT OPTIONS
531
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
532
CHAPTER 66. HTTP4
533
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
534
CHAPTER 66. HTTP4
535
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MESSAGE HEADERS
536
CHAPTER 66. HTTP4
MESSAGE BODY
Camel will store the HTTP response from the external server on the OUT body. All headers from the IN
message will be copied to the OUT message, so headers are preserved during routing. Additionally
Camel will add the HTTP response headers as well to the OUT message headers.
RESPONSE CODE
Camel will handle according to the HTTP response code:
Response code is in the range 300..399, Camel regards it as a redirection response and will
throw a HttpOperationFailedException with the information.
Response code is 400+, Camel regards it as an external server failure and will throw a
HttpOperationFailedException with the information.
THROWEXCEPTIONONFAILURE
HTTPOPERATIONFAILEDEXCEPTION
This exception contains the following information:
537
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:start")
.to("http4://oldhost");
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="direct:start"/>
<to uri="http4://oldhost"/>
</route>
</camelContext>
You can override the HTTP endpoint URI by adding a header with the key, Exchange.HTTP_URI, on
the message.
from("direct:start")
.setHeader(Exchange.HTTP_URI, constant("http://newhost"))
.to("http4://oldhost");
In the sample above Camel will call the http://newhost despite the endpoint is configured with
http4://oldhost. If the http4 endpoint is working in bridge mode, it will ignore the message header of
Exchange.HTTP_URI.
from("direct:start")
.to("http4://oldhost?order=123&detail=short");
from("direct:start")
.setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
.to("http4://oldhost");
538
CHAPTER 66. HTTP4
from("direct:start")
.setHeader(Exchange.HTTP_METHOD,
constant(org.apache.camel.component.http4.HttpMethods.POST))
.to("http4://www.google.com")
.to("mock:results");
The method can be written a bit shorter using the string constants:
.setHeader("CamelHttpMethod", constant("POST"))
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="direct:start"/>
<setHeader headerName="CamelHttpMethod">
<constant>POST</constant>
</setHeader>
<to uri="http4://www.google.com"/>
<to uri="mock:results"/>
</route>
</camelContext>
CONFIGURING A PROXY
The HTTP4 component provides a way to configure a proxy.
from("direct:start")
.to("http4://oldhost?proxyAuthHost=www.myproxy.com&proxyAuthPort=80");
There is also support for proxy authentication via the proxyAuthUsername and proxyAuthPassword
options.
context.getProperties().put("http.proxyHost", "172.168.18.9");
context.getProperties().put("http.proxyPort" "8080");
539
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Spring XML
<camelContext>
<properties>
<property key="http.proxyHost" value="172.168.18.9"/>
<property key="http.proxyPort" value="8080"/>
</properties>
</camelContext>
Camel will first set the settings from Java System or CamelContext Properties and then the endpoint
proxy options if provided. So you can override the system properties with the endpoint options.
Notice in Camel 2.8 there is also a http.proxyScheme property you can set to explicit configure the
scheme to use.
CONFIGURING CHARSET
If you are using POST to send data you can configure the charset using the Exchange property:
exchange.setProperty(Exchange.CHARSET_NAME, "ISO-8859-1");
from("timer://foo?fixedRate=true&delay=0&period=10000")
.to("http4://www.google.com")
.setHeader(FileComponent.HEADER_FILE_NAME, "message.html")
.to("file:target/google");
In the header value above notice that it should not be prefixed with ? and you can separate parameters
as usual with the & char.
540
CHAPTER 66. HTTP4
You can get the HTTP response code from the HTTP4 component by getting the value from the Out
message header with Exchange.HTTP_RESPONSE_CODE.
DISABLING COOKIES
To disable cookies you can set the HTTP Client to ignore cookies by adding this URI option:
httpClient.cookiePolicy=ignoreCookies
ADVANCED USAGE
If you need more control over the HTTP producer you should use the HttpComponent where you can
set various classes to give you custom behavior.
...
<camel:sslContextParameters
id="sslContextParameters">
<camel:keyManagers
keyPassword="keyPassword">
<camel:keyStore
541
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
resource="/users/home/server/keystore.jks"
password="keystorePassword"/>
</camel:keyManagers>
</camel:sslContextParameters>...
...
<to uri="https4://127.0.0.1/mail/?sslContextParametersRef=sslContextParameters"/>...
However if you just want to specify the keystore and truststore you can do this with Apache HTTP
HttpClientConfigurer, for example:
And then you need to create a class that implements HttpClientConfigurer, and registers https
protocol providing a keystore or truststore per example above. Then, from your camel route builder
class you can hook it up like so:
If you are doing this using the Spring DSL, you can specify your HttpClientConfigurer using the URI.
For example:
<bean id="myHttpClientConfigurer"
class="my.https.HttpClientConfigurer">
</bean>
<to uri="https4://myhostname.com:443/myURL?httpClientConfigurer=myHttpClientConfigurer"/>
As long as you implement the HttpClientConfigurer and configure your keystore and truststore as
described above, it will work fine.
542
CHAPTER 66. HTTP4
httpContext.setAttribute(ClientContext.AUTH_CACHE, authCache);
return httpContext;
}
<to uri="https4://myhostname.com:443/myURL?httpContext=myHttpContext"/>
543
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
IBATIS
The ibatis: component allows you to query, poll, insert, update and delete data in a relational database
using Apache iBATIS.
PREFER MYBATIS
The Apache iBatis project is no longer active. The project is moved outside Apache
and is now know as the MyBatis project. Therefore we encourage users to use
MyBatis instead. This camel-ibatis component will be removed in Camel 3.0.
iBatis does not support Spring 4.x. So you can only use Spring 3.x or older with
iBatis.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ibatis</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
ibatis:statementName[?options]
Where statementName is the name in the iBATIS XML configuration file which maps to the query,
insert, update or delete operation you wish to evaluate.
You can append query options to the URI in the following format, ?option=value&option=value&...
This component will by default load the iBatis SqlMapConfig file from the root of the classpath and
expected named as SqlMapConfig.xml. It uses Spring resource loading so you can define it using
classpath, file or http as prefix to load resources with those schemes. In Camel 2.2 you can configure
this on the iBatisComponent with the setSqlMapConfig(String) method.
OPTIONS
544
CHAPTER 67. IBATIS
545
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MESSAGE HEADERS
Apache Camel will populate the result message, either IN or OUT with a header with the
operationName used:
MESSAGE BODY
546
CHAPTER 67. IBATIS
Apache Camel 1.6.2/2.0: The response from iBatis will only be set as body if it's a SELECT statement.
That means, for example, for INSERT statements Apache Camel will not replace the body. This allows
you to continue routing and keep the original body. The response from iBatis is always stored in the
header with the key CamelIBatisResult.
SAMPLES
For example if you wish to consume beans from a JMS queue and insert them into a database you could
do the following:
from("activemq:queue:newAccount").
to("ibatis:insertAccount?statementType=Insert");
Notice we have to specify the statementType, as we need to instruct Apache Camel which
SqlMapClient operation to invoke.
from("direct:start")
.to("ibatis:selectAccountById?statementType=QueryForObject")
.to("mock:result");
In the code above we can invoke the iBatis statement selectAccountById and the IN body should
contain the account id we want to retrieve, such as an Integer type.
We can do the same for some of the other operations, such as QueryForList:
from("direct:start")
.to("ibatis:selectAllAccounts?statementType=QueryForList")
.to("mock:result");
And the same for UPDATE, where we can send an Account object as IN body to iBatis:
547
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:start")
.to("ibatis:updateAccount?statementType=Update")
.to("mock:result");
In the sample below we poll the database, every 30 seconds using the Timer component and send the
data to the JMS queue:
from("timer://pollTheDatabase?delay=30000").to("ibatis:selectAllAccounts?
statementType=QueryForList").to("activemq:queue:allAccounts");
<!-- Select with no parameters using the result map for Account class. -->
<select id="selectAllAccounts" resultMap="AccountResult">
select * from ACCOUNT
</select>
USING ONCONSUME
This component supports executing statements after data have been consumed and processed by
Apache Camel. This allows you to do post updates in the database. Notice all statements must be
UPDATE statements. Apache Camel supports executing multiple statements whose name should be
separated by comma.
The route below illustrates we execute the consumeAccount statement data is processed. This allows
us to change the status of the row in the database to processed, so we avoid consuming it twice or
more.
from("ibatis:selectUnprocessedAccounts?
consumer.onConsume=consumeAccount").to("mock:results");
548
CHAPTER 68. IRC
IRC COMPONENT
The irc component implements an IRC (Internet Relay Chat) transport.
URI FORMAT
irc:nick@host[:port]/#room[?options]
In Apache Camel 2.0, you can also use the following format:
irc:nick@host[:port]?channels=#channel1,#channel2,#channel3[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
549
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
550
CHAPTER 68. IRC
...
from(...)
.to("ircs://camel-prd-user@server:6669/#camel-test?nickname=camel-
prd&password=password&sslContextParameters=#sslContextParameters");
...
<camel:sslContextParameters
id="sslContextParameters">
551
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<camel:trustManagers>
<camel:keyStore
resource="/users/home/server/truststore.jks"
password="keystorePassword"/>
</camel:keyManagers>
</camel:sslContextParameters>...
...
<to uri="ircs://camel-prd-user@server:6669/#camel-test?nickname=camel-
prd&password=password&sslContextParameters=#sslContextParameters"/>...
ircs:host[:port]/#room?username=user&password=pass
By default, the IRC transport uses SSLDefaultTrustManager. If you need to provide your own custom
trust manager, use the trustManager parameter as follows:
ircs:host[:port]/#room?
username=user&password=pass&trustManager=#referenceToMyTrustManagerBean
USING KEYS
Available as of Camel 2.2 Some irc rooms requires you to provide a key to be able to join that channel.
The key is just a secret word.
For example we join 3 channels where as only channel 1 and 3 uses a key.
irc:[email protected]?channels=#chan1,#chan2,#chan3&keys=chan1Key,,chan3key
552
CHAPTER 69. JASYPT
JASYPT COMPONENT
Available as of Camel 2.5
Jasypt is a simplified encryption library which makes encryption and decryption easy. Camel integrates
with Jasypt to allow sensitive information in Properties files to be encrypted. By dropping camel-
jasypt on the classpath those encrypted values will automatic be decrypted on-the-fly by Camel. This
ensures that human eyes can't easily spot sensitive information such as usernames and passwords.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jasypt</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
TOOLING
The Jasypt component provides a little command line tooling to encrypt or decrypt values.
For example to encrypt the value tiger you run with the following parameters. In the apache camel kit,
you cd into the lib folder and run the following java cmd, where <CAMEL_HOME> is where you have
downloaded and extract the Camel distribution.
$ cd <CAMEL_HOME>/lib
$ java -jar camel-jasypt-2.5.0.jar -c encrypt -p secret -i tiger
553
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
So you can test it by running the tooling using the following parameters:
$ cd <CAMEL_HOME>/lib
$ java -jar camel-jasypt-2.5.0.jar -c decrypt -p secret -i qaEEacuW7BUti8LcMgyjKw==
The idea is then to use those encrypted values in your Properties files. Notice how the password value
is encrypted and the value has the tokens surrounding ENC(value here)
This JAR is not distributed by Apache Camel and you have to download it manually and
copy it to the lib/optional directory of the Camel distribution. You can download it from
Apache Central Maven repo .
URI OPTIONS
The options below are exclusive for the Jasypt component.
554
CHAPTER 69. JASYPT
For example you could provided the password before you start the application
$ export CAMEL_ENCRYPTION_PASSWORD=secret
When the application is up and running you can unset the environment
$ unset CAMEL_ENCRYPTION_PASSWORD
The properties file myproperties.properties then contain the encrypted value, such as shown below.
Notice how the password value is encrypted and the value has the tokens surrounding ENC(value
here)
555
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<!-- define the jasypt properties parser with the given password to be used -->
<bean id="jasypt" class="org.apache.camel.component.jasypt.JasyptPropertiesParser">
<property name="password" value="secret"/>
</bean>
The Properties component can also be inlined inside the <camelContext> tag which is shown below.
Notice how we use the propertiesParserRef attribute to refer to Jasypt.
<!-- define the jasypt properties parser with the given password to be used -->
<bean id="jasypt" class="org.apache.camel.component.jasypt.JasyptPropertiesParser">
<!-- password is mandatory, you can prefix it with sysenv: or sys: to indicate it should use
an OS environment or JVM system property value, so you dont have the master password
defined here -->
<property name="password" value="secret"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<!-- define the camel properties placeholder, and let it leverage jasypt -->
<propertyPlaceholder id="properties"
location="classpath:org/apache/camel/component/jasypt/myproperties.properties"
propertiesParserRef="jasypt"/>
<route>
<from uri="direct:start"/>
<to uri="{{cool.result}}"/>
</route>
</camelContext>
SEE ALSO
Security
Properties
556
CHAPTER 69. JASYPT
557
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
JAXB COMPONENT
The JAXB data format provides JAXB support. Camel supports unmarshalling XML data to JAXB
annotated classes and marshalling from classes to XML. For more information, see JAXB.
558
CHAPTER 71. JCLOUDS
JCLOUDS COMPONENT
Available as of Camel 2.9
This component allows interaction with cloud provider key-value engines (blobstores) and compute
services. The component uses jclouds which is a library that provides abstractions for blobstores and
compute services.
ComputeService simplifies the task of managing machines in the cloud. For example, you can use
ComputeService to start 5 machines and install your software on them. BlobStore simplifies dealing
with key-value providers such as Amazon S3. For example, BlobStore can give you a simple Map view
of a container.
The camel jclouds component allows you to use both abstractions, as it specifes two types of endpoint
the JcloudsBlobStoreEndpoint and the JcloudsComputeEndpoint. You can have both producers and
consumers on a blobstore endpoint but you can only have producers on compute endpoints.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jclouds</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
559
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
As you can see the component is capable of handling multiple blobstores and compute services. The
actual implementation that will be used by each endpoint is specified by passing the provider inside
the URI.
URI FORMAT
jclouds:blobstore:[provider id][?options]
jclouds:compute:[provider id][?options]
The provider id is the name of the cloud provider that provides the target service ( e.g. aws-s3 or
aws_ec2).
You can append query options to the URI in the following format, ?option=value&option=value&...
jclouds:blobstore:aws-s3?
operation=CamelJcloudsGet&container=mycontainer&blobName=someblob
560
CHAPTER 71. JCLOUDS
For producer endpoint you can override all of the above URI options by passing the appropriate
headers to the message.
Header Description
PUT
GET
from("direct:start")
.to("jclouds:blobstore:aws-s3" +
"?operation=PUT" +
"&container=mycontainer" +
"&blobName=myblob");
In the above example you can override any of the URI parameters with headers on the message. Here
is how the above example would look like using xml to define our route.
<route>
<from uri="direct:start"/>
<to uri="jclouds:blobstore:aws-s3?operation=PUT&container=mycontainer&blobName=myblob"/>
</route>
from("direct:start")
.to("jclouds:blobstore:aws-s3" +
"?operation=GET" +
"&container=mycontainer" +
"&blobName=myblob");
561
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In the above example you can override any of the URI parameters with headers on the message. Here
is how the above example would look like using xml to define our route.
<route>
<from uri="direct:start"/>
<to uri="jclouds:blobstore:aws-s3?operation=PUT&container=mycontainer&blobName=myblob"/>
</route>
from("jclouds:blobstore:aws-s3" +
"?container=mycontainer")
.to("direct:next");
You can achieve the same goal by using xml, as you can see below.
<route>
<from uri="jclouds:blobstore:aws-s3?
operation=GET&container=mycontainer&blobName=myblob"/>
<to uri="direct:next"/>
</route>
562
CHAPTER 71. JCLOUDS
The combination of parameters for use with the compute service depend on the operation.
jclouds:compute:aws-ec2?
operation=CamelJcloudsCreateNode&imageId=AMI_XXXXX&locationId=eu-west-1&group=mygroup
from("jclouds:compute:aws-ec2" +
"&operation=CamelJCloudsListImages")
.to("direct:next");
This will create a message that will contain the list of images inside its body. You can also do the same
using xml.
<route>
<from uri="jclouds:compute:aws-ec2?operation=CamelJCloudsListImages"/>
<to uri="direct:next"/>
</route>
from("direct:start").
563
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
to("jclouds:compute:aws-ec2" +
"?operation=CamelJcloudsCreateNode" +
"&imageId=AMI_XXXXX" +
"&locationId=XXXXX" +
"&group=myGroup");
This will create a new node on the cloud provider. The out message in this case will be a set of
metadata that contains information about the newly created node (e.g. the ip, hostname etc). Here is
the same using spring xml.
<route>
<from uri="direct:start"/>
<to uri="jclouds:compute:aws-ec2?
operation=CamelJcloudsCreateNode&imageId=AMI_XXXXX&locationId=XXXXX&group=myGroup"/>
</route>
from("direct:start").
to("jclouds:compute:aws-ec2" +
"?operation=CamelJcloudsRunScript" +
"?nodeId=10" +
"&user=ubuntu");
The sample above will retrieve the body of the in message, which is expected to contain the shell script
to be executed. Once the script is retrieved, it will be sent to the node for execution under the
specified user (in order case ubuntu). The target node is specified using its nodeId. The nodeId can be
retrieved either upon the creation of the node, it will be part of the resulting metadata or by a
executing a CamelJcloudsListNodes operation.
Note This will require that the compute service that will be passed to the component, to be initialized
with the appropriate JClouds SSH capable module (e.g. jsch or sshj).
<route>
<from uri="direct:start"/>
<to uri="jclouds:compute:aws-ec2?operation=CamelJcloudsRunScript&?
nodeId=10&user=ubuntu"/>
</route>
SEE ALSO
If you want to find out more about jclouds here is list of interesting resources Jclouds BlobStore Guide
Jclouds Compute Guide
564
CHAPTER 72. JCR
JCR COMPONENT
The jcr component allows you to add/read nodes to/from a JCR compliant content repository (for
example, Apache Jackrabbit) with its producer, or register an EventListener with the consumer.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jcr</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
jcr://user:password@repository/path/to/node
CONSUMER ADDED
From Camel 2.10 onwards you can use consumer as an EventListener in JCR or a producer to read a
node by identifier.
USAGE
The repository element of the URI is used to look up the JCR Repository object in the Camel context
registry.
PRODUCER
If the operation is CamelJcrInsert: A new node is created in the content repository, all the
message headers of the IN message are transformed to javax.jcr.Value instances and added to
the new node and the node's UUID is returned in the OUT message.
If the operation is CamelJcrGetById: A new node is retrieved from the repository using the
message body as node identifier.
565
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
NOTE
Please note that the JCR Producer used message properties instead of message headers
in Camel versions earlier than 2.12.3.
CONSUMER
The consumer will connect to JCR periodically and return a List<javax.jcr.observation.Event> in the
message body.
566
CHAPTER 72. JCR
EXAMPLE
The snippet below creates a node named node under the /home/test node in the content repository.
One additional property is added to the node as well: my.contents.property which will contain the
body of the message being sent.
from("direct:a").setHeader(JcrConstants.JCR_NODE_NAME, constant("node"))
.setHeader("my.contents.property", body())
.to("jcr://user:pass@repository/home/test");
The following code will register an EventListener under the path import-application/inbox for
Event.NODE_ADDED and Event.NODE_REMOVED events (event types 1 and 2, both masked as 3) and
listening deep for all the children.
<route>
<from uri="jcr://user:pass@repository/import-application/inbox?eventTypes=3&deep=true" />
<to uri="direct:execute-import-application" />
</route>
567
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
JDBC COMPONENT
The JDBC component enables you to access databases through JDBC, where SQL queries ( SELECT)
and operations (INSERT, UPDATE, and so on) are sent in the message body. This component uses the
standard JDBC API, unlike the SQL Component component, which uses spring-jdbc.
WARNING
This component can only be used to define producer endpoints, which means that
you cannot use the JDBC component in a from() statement.
URI FORMAT
jdbc:dataSourceName[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
568
CHAPTER 73. JDBC
569
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
RESULT
By default, the result is returned in the OUT body as an ArrayList<HashMap<String, Object>>. The
List object contains the list of rows and the Map objects contain each row with the String key as the
column name.
570
CHAPTER 73. JDBC
NOTE
MESSAGE HEADERS
Header Description
GENERATED KEYS
Available as of Camel 2.10
If you insert data using SQL INSERT, then the RDBMS may support auto generated keys. You can
instruct the JDBC producer to return the generated keys in headers. To do that set the header
CamelRetrieveGeneratedKeys=true. Then the generated keys will be provided as headers with the
keys listed in the table above.
IMPORTANT
Using generated keys does not work with together with named parameters.
In the given route below, we want to get all the projects from the projects table. Notice the SQL query
has 2 named parameters, :?lic and :?min. Camel will then lookup these parameters from the message
headers. Notice in the example above we set two headers with constant value for the named
parameters:
571
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:projects")
.setHeader("lic", constant("ASF"))
.setHeader("min", constant(123))
.setBody("select * from projects where license = :?lic and id > :?min order by id")
.to("jdbc:myDataSource?useHeadersAsParameters=true")
You can also store the header values in a java.util.Map and store the map on the headers with the key
CamelJdbcParameters.
SAMPLES
In the following example, we fetch the rows from the customer table.
Then we configure a route that routes to the JDBC component, so the SQL will be executed. Note how
we refer to the testdb datasource that was bound in the previous step:
We create an endpoint, add the SQL query to the body of the IN message, and then send the exchange.
The result of the query is returned in the OUT body:
572
CHAPTER 73. JDBC
// now we send the exchange to the endpoint, and receives the response from Camel
Exchange out = template.send(endpoint, exchange);
If you want to work on the rows one by one instead of the entire ResultSet at once, you need to use the
Splitter EIP such as:
from("direct:hello")
// here we split the data from the testdb into new messages one by one
// so the mock endpoint will receive a message per row in the table
// the StreamList option allows to stream the result of the query without creating a List of rows
// and notice we also enable streaming mode on the splitter
.to("jdbc:testdb?outputType=StreamList")
.split(body()).streaming()
.to("mock:result");
from("timer://foo?period=60000").setBody(constant("select * from
customer")).to("jdbc:testdb").to("activemq:queue:customers");
from("timer://MoveNewCustomersEveryHour?period=3600000")
.setBody(constant("select * from customer where create_time > (sysdate-1/24)"))
.to("jdbc:testdb")
.split(body())
.process(new MyCustomerProcessor()) //filter/transform results as needed
.setBody(simple("insert into processed_customer values('${body[ID]}','${body[NAME]}')"))
.to("jdbc:testdb");
SEE ALSO
573
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SQL
574
CHAPTER 74. JETTY
JETTY COMPONENT
The jetty component provides HTTP-based endpoints for consuming and producing HTTP requests.
That is, the Jetty component behaves as a simple Web server. Jetty can also be used as a http client
which mean you can also use it with Camel as a producer.
STREAM
Jetty is stream based, which means the input it receives is submitted to Camel as a
stream. That means you will only be able to read the content of the stream once. If you
find a situation where the message body appears to be empty or you need to access the
Exchange.HTTP_RESPONSE_CODE data multiple times (eg: doing multicasting, or
redelivery error handling) you should use Stream Caching or convert the message body
to a String which is safe to be re-read multiple times.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jetty</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
jetty:http://hostname[:port][/resourceUri][?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
575
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
576
CHAPTER 74. JETTY
577
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
578
CHAPTER 74. JETTY
579
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MESSAGE HEADERS
Camel uses the same message headers as the HTTP component. From Camel 2.2, it also uses
(Exchange.HTTP_CHUNKED,CamelHttpChunked) header to turn on or turn off the chuched encoding
on the camel-jetty consumer.
Camel also populates all request.parameter and request.headers. For example, given a client request
with the URL, http://myserver/myserver?orderid=123, the exchange will contain a header named
orderid with the value 123.
Starting with Camel 2.2.0, you can get the request.parameter from the message header not only from
Get Method, but also other HTTP method.
USAGE
The Jetty component supports both consumer and producer endpoints. Another option for producing
to other HTTP endpoints, is to use the HTTP Component
COMPONENT OPTIONS
The JettyHttpComponent provides the following options:
580
CHAPTER 74. JETTY
581
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
582
CHAPTER 74. JETTY
PRODUCER EXAMPLE
The following is a basic example of how to send an HTTP request to an existing HTTP endpoint.
in Java DSL
from("direct:start").to("jetty://http://www.google.com");
or in Spring XML
<route>
<from uri="direct:start"/>
<to uri="jetty://http://www.google.com"/>
<route>
CONSUMER EXAMPLE
In this sample we define a route that exposes a HTTP service at
http://localhost:8080/myapp/myservice:
from("jetty:http://localhost:{{port}}/myapp/myservice").process(new MyBookService());
USAGE OF LOCALHOST
When you specify localhost in a URL, Camel exposes the endpoint only on the local
TCP/IP network interface, so it cannot be accessed from outside the machine it
operates on.
If you need to expose a Jetty endpoint on a specific network interface, the numerical IP
address of this interface should be used as the host. If you need to expose a Jetty
endpoint on all network interfaces, the 0.0.0.0 address should be used.
TIP
To listen across an entire URI prefix, see How do I let Jetty match wildcards .
583
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
TIP
If you actually want to expose routes by HTTP and already have a Servlet, you should instead refer to
the Servlet Transport.
Our business logic is implemented in the MyBookService class, which accesses the HTTP request
contents and then returns a response. Note: The assert call appears in this example, because the code
is part of an unit test.
The following sample shows a content-based route that routes all requests containing the URI
parameter, one, to the endpoint, mock:one, and all others to mock:other.
from("jetty:" + serverUri)
.choice()
.when().simple("${header.one}").to("mock:one")
.otherwise()
.to("mock:other");
So if a client sends the HTTP request, http://serverUri?one=hello, the Jetty component will copy the
HTTP request parameter, one to the exchange's in.header. We can then use the simple language to
route exchanges that contain this header to a specific endpoint and all others to another. If we used a
language more powerful than Simple\-\--such as- El or OGNL\--we could also test for the parameter
value and do routing based on the header value as well.
SESSION SUPPORT
The session support option, sessionSupport, can be used to enable a HttpSession object and access
the session object while processing the exchange. For example, the following route enables sessions:
<route>
<from uri="jetty:http://0.0.0.0/myapp/myservice/?sessionSupport=true"/>
<processRef ref="myCode"/>
<route>
<bean id="myCode"class="com.mycompany.MyCodeProcessor"/>
584
CHAPTER 74. JETTY
...
<camel:sslContextParameters
id="sslContextParameters">
<camel:keyManagers
keyPassword="keyPassword">
<camel:keyStore
resource="/users/home/server/keystore.jks"
password="keystorePassword"/>
</camel:keyManagers>
</camel:sslContextParameters>...
...
<to uri="jetty:https://127.0.0.1/mail/?sslContextParametersRef=sslContextParameters"/>
...
585
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<from uri="jetty:https://0.0.0.0/myapp/myservice/"/>
Jetty also needs to know where to load your keystore from and what passwords to use in order to load
the correct SSL certificate. Set the following JVM System Properties:
jetty.ssl.keystore specifies the location of the Java keystore file, which contains the Jetty
server's own X.509 certificate in a key entry. A key entry stores the X.509 certificate
(effectively, the public key) and also its associated private key.
jetty.ssl.password the store password, which is required to access the keystore file (this is
the same password that is supplied to the keystore command's \-storepass option).
jetty.ssl.keypassword the key password, which is used to access the certificate's key entry in
the keystore (this is the same password that is supplied to the keystore command's \-keypass
option).
org.eclipse.jetty.ssl.keystore specifies the location of the Java keystore file, which contains
the Jetty server's own X.509 certificate in a key entry. A key entry stores the X.509 certificate
(effectively, the public key) and also its associated private key.
For details of how to configure SSL on a Jetty endpoint, read the following documentation at the Jetty
Site: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL
Some SSL properties aren't exposed directly by Camel, however Camel does expose the underlying
SslSocketConnector, which will allow you to set properties like needClientAuth for mutual
authentication requiring a client certificate or wantClientAuth for mutual authentication where a client
doesn't need a certificate but can have one. There's a slight difference between the various Camel
versions:
Up to Camel 2.2
586
CHAPTER 74. JETTY
</map>
</property>
</bean>
The value you use as keys in the above map is the port you configure Jetty to listen on.
Instead of a per port number specific SSL socket connector (as shown above) you can now configure
general properties which applies for all SSL socket connectors (which is not explicit configured as
above with the port number as entry).
587
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<entry key="keyPassword"value="..."/>
<entry key="keystore"value="..."/>
<entry key="needClientAuth"value="..."/>
<entry key="truststore"value="..."/>
</map>
</property>
</bean>
Instead of a per port number specific HTTP socket connector (as shown above) you can now configure
general properties which applies for all HTTP socket connectors (which is not explicit configured as
above with the port number as entry).
Jetty has a forwarded property which takes the value from X-Forwarded-For and places it in the
HttpServletRequest remoteAddr property. This property is not available directly through the
endpoint configuration but it can be easily added using the socketConnectors property:
588
CHAPTER 74. JETTY
</map>
</property>
</bean>
This is particularly useful when an existing Apache server handles TLS connections for a domain and
proxies them to application servers internally.
If the exchange was processed successfully, the 200 HTTP status code is returned. If the exchange
failed with an exception, the 500 HTTP status code is returned, and the stacktrace is returned in the
body. If you want to specify which HTTP status code to return, set the code in the
Exchange.HTTP_RESPONSE_CODE header of the OUT message.
CUSTOMIZING HTTPBINDING
By default, Camel uses the org.apache.camel.component.http.DefaultHttpBinding to handle how a
response is written. If you like, you can customize this behavior either by implementing your own
HttpBinding class or by extending DefaultHttpBinding and overriding the appropriate methods.
The following example shows how to customize the DefaultHttpBinding in order to change how
exceptions are returned:
We can then create an instance of our binding and register it in the Spring registry as follows:
<bean id="mybinding"class="com.mycompany.MyHttpBinding"/>
And then we can reference this binding when we define the route:
<route><from uri="jetty:http://0.0.0.0:8080/myapp/myservice?httpBindingRef=mybinding"/><to
uri="bean:doSomething"/></route>
589
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
And from Camel 2.3 onwards you can configure a list of Jetty handlers as follows:
from("jetty:http://0.0.0.0:9080/myservice?handlers=securityHandler")
590
CHAPTER 74. JETTY
If you need more handlers, set the handlers option equal to a comma-separated list of bean IDs.
from("jetty://http://localhost:{{port}}/myserver")
// use onException to catch all exceptions and return a custom reply message
.onException(Exception.class)
.handled(true)
// create a custom failure response
.transform(constant("Dude something went wrong"))
// we must remember to set error code 500 as handled(true)
// otherwise would let Camel thing its a OK response (200)
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(500))
.end()
// now just force an exception immediately
.throwException(new IllegalArgumentException("I cannot do this"));
// Set the jetty temp directory which store the file for multi part form
// camel-jetty will clean up the file after it handled the request.
// The option works rightly from Camel 2.4.0
getContext().getProperties().put("CamelJettyTempDir", "target");
from("jetty://http://localhost:{{port}}/test").process(new Processor() {
// The other form date can be get from the message header
591
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
exchange.getOut().setBody(in.getHeader("comment"));
}
});
<from uri="jetty:https://0.0.0.0/myapp/myservice1/?enableJmx=true"/>
<from uri="jetty:https://0.0.0.0/myapp/myservice2/?enableJmx=false"/>
The camel-jetty component also provides for direct configuration of the Jetty MBeanContainer. Jetty
creates MBean names dynamically. If you are running another instance of Jetty outside of the Camel
context and sharing the same MBeanServer between the instances, you can provide both instances
with a reference to the same MBeanContainer in order to avoid name collisions when registering Jetty
MBeans.
HTTP
592
CHAPTER 75. JGROUPS
JGROUPS COMPONENT
Available since Camel 2.10.0
JGroups is a toolkit for reliable multicast communication. The jgroups: component provides exchange
of messages between Camel infrastructure and JGroups clusters.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache-extra.camel</groupId>
<artifactId>camel-jgroups</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
jgroups:clusterName[?options]
Where clusterName represents the name of the JGroups cluster the component should connect to.
OPTIONS
USAGE
Using jgroups component on the consumer side of the route will capture messages received by the
JChannel associated with the endpoint and forward them to the Camel route. JGroups consumer
processes incoming messages asynchronously.
593
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Using jgroups component on the producer side of the route will forward body of the Camel exchanges
to the JChannel instance managed by the endpoint.
594
CHAPTER 76. JING
JING COMPONENT
The Jing component uses the Jing Library to perform XML validation of the message body using either:
Note that the MSV component can also support RelaxNG XML syntax.
URI FORMAT
rng:someLocalOrRemoteResource
rnc:someLocalOrRemoteResource
Where rng means use the RelaxNG XML Syntax whereas rnc means use RelaxNG Compact Syntax . The
following examples show possible URI values
Example Description
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
EXAMPLE
The following example shows how to configure a route from the endpoint direct:start which then goes
to one of two endpoints, either mock:valid or mock:invalid based on whether or not the XML matches
the given RelaxNG Compact Syntax schema (which is supplied on the classpath).
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start"/>
<doTry>
<to uri="rnc:org/apache/camel/component/validator/jing/schema.rnc"/>
<to uri="mock:valid"/>
595
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<doCatch>
<exception>org.apache.camel.ValidationException</exception>
<to uri="mock:invalid"/>
</doCatch>
<doFinally>
<to uri="mock:finally"/>
</doFinally>
</doTry>
</route>
</camelContext>
596
CHAPTER 77. JIRA
JIRA COMPONENT
Available as of Camel 2.15
The JIRA component interacts with the JIRA API by encapsulating Atlassian's REST Java Client for
JIRA. It currently provides polling for new issues and new comments. It is also able to create new
issues.
Rather than webhooks, this endpoint relies on simple polling. Reasons include:
The types of payloads we're polling aren't typically large (plus, paging is available in the API)
The need to support apps running somewhere not publicly accessible where a webhook would
fail
Note that the JIRA API is fairly expansive. Therefore, this component could be easily expanded to
provide additional interactions.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jira</artifactId>
<version>${camel-version}</version>
</dependency>
URI FORMAT
jira://endpoint[?options]
MANDATORY OPTIONS:
Note that these can be configured directly through the endpoint.
Option Description
CONSUMER ENDPOINTS:
597
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PRODUCER ENDPOINTS:
IssueSummary (String):
The issue summary (title)
URI OPTIONS:
delay 60 in seconds
JQL:
The JQL URI option is used by both consumer endpoints. Theoretically, items like project key, etc.
could be URI options themselves. However, by requiring the use of JQL, the consumers become much
more flexible and powerful.
One important thing to note is that the newIssue consumer will automatically append "ORDER BY key
desc" to your JQL. This is in order to optimize startup processing, rather than having to index every
single issue in the project.
Another note is that, similarly, the newComment consumer will have to index every single issue and
598
CHAPTER 77. JIRA
comment in the project. Therefore, for large projects, it's vital to optimize the JQL expression as much
as possible. For example, the JIRA Toolkit Plugin includes a "Number of comments" custom field -- use
'"Number of comments" > 0' in your query. Also try to minimize based on state (status=Open), increase
the polling delay, etc. Example:
599
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
JMS COMPONENT
USING ACTIVEMQ
If you are using Apache ActiveMQ, you should prefer the ActiveMQ component as it has
been optimized for ActiveMQ. All of the options and samples on this page are also valid
for the ActiveMQ component.
See section Transactions and Cache Levels below if you are using transactions with JMS as it can
impact performance.
Make sure to read the section Request-reply over JMS further below on this page for important notes
about request/reply, as Camel offers a number of options to configure for performance, and clustered
environments.
The JMS component allows messages to be sent to (or consumed from) a JMS Queue or Topic. The
implementation of the JMS Component uses Spring's JMS support for declarative transactions, using
Spring's JmsTemplate for sending and a MessageListenerContainer for consuming.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jms</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
jms:[queue:|topic:]destinationName[?options]
jms:FOO.BAR
600
CHAPTER 78. JMS
jms:queue:FOO.BAR
To connect to a topic, you must include the topic: prefix. For example, to connect to the topic,
Stocks.Prices, use:
jms:topic:Stocks.Prices
You append query options to the URI using the following format, ?option=value&option=value&...
USING ACTIVEMQ
The JMS component reuses Spring 2's JmsTemplate for sending messages. This is not ideal for use in
a non-J2EE container and typically requires some caching in the JMS provider to avoid poor
performance.
If you intend to use Apache ActiveMQ as your Message Broker - which is a good choice as ActiveMQ
rocks :-) , then we recommend that you either:
Use the ActiveMQ component, which is already optimized to use ActiveMQ efficiently
If you are not using XA, then you should consider caching as it speeds up performance, such as setting
cacheLevelName=CACHE_CONSUMER.
Through Camel 2.7.x, the default setting for cacheLevelName is CACHE_CONSUMER. You will need
to explicitly set cacheLevelName=CACHE_NONE. In Camel 2.8 onwards, the default setting for
cacheLevelName is CACHE_AUTO. This default auto detects the mode and sets the cache level
accordingly to:
CACHE_CONSUMER = if transacted=false
CACHE_NONE = if transacted=true
DURABLE SUBSCRIPTIONS
If you wish to use durable topic subscriptions, you need to specify both clientId and
durableSubscriptionName. The value of the clientId must be unique and can only be used by a single
JMS connection instance in your entire network. You may prefer to use Virtual Topics instead to avoid
this limitation. More background on durable messaging here.
601
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
can then use your headers inside a JMS Selector (whose SQL92 syntax mandates Java identifier
syntax for headers).
A simple strategy for mapping header names is used by default. The strategy is to replace any dots and
hyphens in the header name as shown below and to reverse the replacement when the header name is
restored from a JMS message sent over the wire. What does this mean? No more losing method names
to invoke on a bean component, no more losing the filename header for the File Component, and so on.
The current header name strategy for accepting header names in Camel is as follows:
Dots are replaced by \_DOT\_ and the replacement is reversed when Camel consume the
message
Hyphen is replaced by \_HYPHEN\_ and the replacement is reversed when Camel consumes
the message
OPTIONS
You can configure many different properties on the JMS endpoint which map to properties on the
JMSConfiguration POJO .
Many of these properties map to properties on Spring JMS, which Camel uses for
sending and receiving messages. So you can get more information about these
properties by consulting the relevant Spring documentation.
The options are divided into two tables, the first one with the most common options used. The latter
contains the rest.
602
CHAPTER 78. JMS
603
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
604
CHAPTER 78. JMS
605
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
606
CHAPTER 78. JMS
607
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
cacheLevelName CACHE_AUTO (Camel >= 2.8.0) Sets the cache level by name for
CACHE_CONSUMER (Camel <= the underlying JMS resources.
2.7.1) Possible values are:
CACHE_AUTO,
CACHE_CONNECTION,
CACHE_CONSUMER,
CACHE_NONE, and
CACHE_SESSION. The default
setting for Camel 2.8 and newer
is CACHE_AUTO. For Camel
2.7.1 and older the default is
CACHE_CONSUMER. See the
Spring documentation and
Transactions Cache Levels for
more information.
608
CHAPTER 78. JMS
609
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
610
CHAPTER 78. JMS
611
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
612
CHAPTER 78. JMS
613
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
614
CHAPTER 78. JMS
615
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
616
CHAPTER 78. JMS
617
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
618
CHAPTER 78. JMS
When sending a JMS message, Camel converts the message body to the following JMS message types:
String javax.jms.TextMessage
Map javax.jms.MapMessage
java.io.Serializable javax.jms.ObjectMessage
byte[] javax.jms.BytesMessage
java.io.File javax.jms.BytesMessage
java.io.Reader javax.jms.BytesMessage
java.io.InputStream javax.jms.BytesMessage
java.nio.ByteBuffer javax.jms.BytesMessage
When receiving a JMS message, Camel converts the JMS message to the following body type:
javax.jms.TextMessage String
javax.jms.BytesMessage byte[]
javax.jms.ObjectMessage Object
619
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can use the mapJmsMessage option to disable the auto-mapping above. If disabled, Camel will
not try to map the received JMS message, but instead uses it directly as the payload. This allows you to
avoid the overhead of mapping and let Camel just pass through the JMS message. For instance, it even
allows you to route javax.jms.ObjectMessage JMS messages with classes you do not have on the
classpath.
For example, in the route below we use a custom message converter when sending a message to the
JMS order queue:
from("file://inbox/order").to("jms:queue:order?messageConverter=#myMessageConverter");
You can also use a custom message converter when consuming from a JMS destination.
from("file://inbox/order").to("jms:queue:order?jmsMessageType=Text");
You can also specify the message type to use for each messabe by setting the header with the key
CamelJmsMessageType. For example:
from("file://inbox/order").setHeader("CamelJmsMessageType",
JmsMessageType.Text).to("jms:queue:order");
For the exchange.in.header the following rules apply for the header keys:
exchange.in.headers keys must be literals and all be valid Java identifiers (do not use dots in
the key name).
Camel replaces dots & hyphens and the reverse when when consuming JMS messages: . is
replaced by \_DOT\_ and the reverse replacement when Camel consumes the message. \- is
replaced by \_HYPHEN\_ and the reverse replacement when Camel consumes the message.
See also the option jmsKeyFormatStrategy, which allows use of your own custom strategy for
formatting keys.
For the exchange.in.header, the following rules apply for the header values:
620
CHAPTER 78. JMS
The values must be primitives or their counter objects (such as Integer, Long, Character). The
types, String, CharSequence, Date, BigDecimal and BigInteger are all converted to their
toString() representation. All other types are dropped.
Camel adds the following JMS properties to the In message headers when it receives a JMS message:
621
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
When Camel sends a message using its JMSProducer, it checks the following conditions:
Whether any of the following options have been set on the JMS endpoint: disableReplyTo,
preserveMessageQos, explicitQosEnabled.
All this can be a tad complex to understand and configure to support your use case.
JMSPRODUCER
The JmsProducer behaves as follows, depending on configuration:
622
CHAPTER 78. JMS
JMSCONSUMER
The JmsConsumer behaves as follows, depending on configuration:
If you send a message to a JMS destination in the middle of your route you can specify the exchange
pattern to use, see more at Request Reply. This is useful if you want to send an InOnly message to a
JMS topic:
from("activemq:queue:in")
.to("bean:validateOrder")
.to(ExchangePattern.InOnly, "activemq:topic:order")
.to("bean:handleOrder");
623
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
For example, the following route shows how you can compute a destination at run time and use it to
override the destination appearing in the JMS URL:
from("file://inbox")
.to("bean:computeDestination")
.to("activemq:queue:dummy");
The queue name, dummy, is just a placeholder. It must be provided as part of the JMS endpoint URL,
but it will be ignored in this example.
Then Camel will read this header and use it as the destination instead of the one configured on the
endpoint. So, in this example Camel sends the message to activemq:queue:order:2, assuming the id
value was 2.
624
CHAPTER 78. JMS
</bean>
</property>
</bean>
Basically, you can configure as many JMS component instances as you wish and give them a unique
name using theid attribute. The preceding example configures an activemq component. You could do
the same to configure MQSeries, TibCo, BEA, Sonic and so on.
Once you have a named JMS component, you can then refer to endpoints within that component using
URIs. For example for the component name, activemq, you can then refer to destinations using the URI
format, activemq:[queue:|topic:]destinationName. You can use the same approach for all other JMS
providers.
This works by the SpringCamelContext lazily fetching components from the spring context for the
scheme name you use for endpoint URIs and having the Component resolve the endpoint URIs.
See The jee schema in the Spring reference documentation for more details about JNDI lookup.
CONCURRENT CONSUMING
A common requirement with JMS is to consume messages concurrently in multiple threads in order to
make an application more responsive. You can set the concurrentConsumers option to specify the
number of threads servicing the JMS endpoint, as follows:
from("jms:SomeQueue?concurrentConsumers=20").
bean(MyClass.class);
On the JmsComponent,
625
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("jms:SomeQueue?concurrentConsumers=20&asyncConsumer=true").
bean(MyClass.class);
Camel offers a number of options to configure request/reply over JMS that influence performance and
clustered environments. The table below summaries the options.
626
CHAPTER 78. JMS
627
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
628
CHAPTER 78. JMS
The JmsProducer detects the InOut and provides a JMSReplyTo header with the reply destination to
be used. By default Camel uses a temporary queue, but you can use the replyTo option on the endpoint
to specify a fixed reply queue (see more below about fixed reply queue).
Camel will automatic setup a consumer which listen on the reply queue, so you should not do anything.
This consumer is a Spring DefaultMessageListenerContainer which listen for replies. However it's
fixed to 1 concurrent consumer. That means replies will be processed in sequence as there are only 1
thread to process the replies. If you want to process replies faster, then we need to use concurrency.
But not using the concurrentConsumer option. We should use the threads from the Camel DSL
instead, as shown in the route below:
from(xxx)
.inOut().to("activemq:queue:foo")
.threads(5)
.to(yyy)
.to(zzz);
629
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In this route we instruct Camel to route replies asynchronously using a thread pool with 5 threads.
TIP
Instead of using threads, then use concurrentConsumers option if using Camel 2.10.3 or better. See
further below.
From Camel 2.10.3 onwards you can now configure the listener to use concurrent threads using the
concurrentConsumers and maxConcurrentConsumers options. This allows you to easier configure
this in Camel as shown below:
from(xxx)
.inOut().to("activemq:queue:foo?concurrentConsumers=5")
.to(yyy)
.to(zzz);
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar")
.to(yyy)
In this example the fixed reply queue named "bar" is used. By default Camel assumes the queue is
shared when using fixed reply queues, and therefore it uses a JMSSelector to only pickup the
expected reply messages (eg based on the JMSCorrelationID). See next section for exclusive fixed
reply queues. That means its not as fast as temporary queues. You can speedup how often Camel will
pull for reply messages using the receiveTimeout option. By default its 1000 millis. So to make it
faster you can set it to 250 millis to pull 4 times per second as shown:
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&receiveTimeout=250")
.to(yyy)
Notice this will cause the Camel to send pull requests to the message broker more frequent, and thus
require more network traffic. It is generally recommended to use temporary queues if possible.
In the previous example, Camel would anticipate the fixed reply queue named "bar" was shared, and
thus it uses a JMSSelector to only consume reply messages which it expects. However there is a
drawback doing this as JMS selectos is slower. Also the consumer on the reply queue is slower to
update with new JMS selector ids. In fact it only updates when the receiveTimeout option times out,
which by default is 1 second. So in theory the reply messages could take up till about 1 sec to be
detected. On the other hand if the fixed reply queue is exclusive to the Camel reply consumer, then we
630
CHAPTER 78. JMS
can avoid using the JMS selectors, and thus be more performant. In fact as fast as using temporary
queues. So in Camel 2.9 onwards we introduced the ReplyToType option which you can configure to
Exclusive to tell Camel that the reply queue is exclusive as shown in the example below:
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)
Mind that the queue must be exclusive to each and every endpoint. So if you have two routes, then they
each need an unique reply queue as shown in the next example:
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)
from(aaa)
.inOut().to("activemq:queue:order?replyTo=order.reply&replyToType=Exclusive")
.to(bbb)
The same applies if you run in a clustered environment. Then each node in the cluster must use an
unique reply queue name. As otherwise each node in the cluster may pickup messages which was
intended as a reply on another node. For clustered environments its recommended to use shared reply
queues instead.
When you do request/reply (InOut) over JMS with Camel then Camel uses a timeout on the sender
side, which is default 20 seconds from the requestTimeout option. You can control this by setting a
higher/lower value. However the time to live value is still set on the JMS message being send. So that
requires the clocks to be synchronized between the systems. If they are not, then you may want to
disable the time to live value being set. This is now possible using the disableTimeToLive option from
Camel 2.8 onwards. So if you set this option to disableTimeToLive=true, then Camel does not set any
time to live value when sending JMS messages. But the request timeout is still active. So for example if
you do request/reply over JMS and have disabled time to live, then Camel will still use a timeout by 20
seconds (the requestTimeout option). That option can of course also be configured. So the two options
requestTimeout and disableTimeToLive gives you fine grained control when doing request/reply.
From Camel 2.13/2.12.3 onwards you can provide a header in the message to override and use as the
request timeout value instead of the endpoint configured value. For example:
from("direct:someWhere")
.to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
.to("bean:processReply");
631
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In the route above we have a endpoint configured requestTimeout of 30 seconds. So Camel will wait up
till 30 seconds for that reply message to come back on the bar queue. If no reply message is received
then a org.apache.camel.ExchangeTimedOutException is set on the Exchange and Camel continues
routing the message, which would then fail due the exception, and Camel's error handler reacts.
If you want to use a per message timeout value, you can set the header with key
org.apache.camel.component.jms.JmsConstants#JMS_REQUEST_TIMEOUT which has constant
value "CamelJmsRequestTimeout" with a timeout value as long type.
For example we can use a bean to compute the timeout value per individual message, such as calling
the whatIsTheTimeout method on the service bean as shown below:
from("direct:someWhere")
.setHeader("CamelJmsRequestTimeout", method(ServiceBean.class, "whatIsTheTimeout"))
.to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
.to("bean:processReply");
When you do fire and forget (InOut) over JMS with Camel then Camel by default does not set any time
to live value on the message. You can configure a value by using the timeToLive option. For example to
indicate a 5 sec., you set timeToLive=5000. The option disableTimeToLive can be used to force
disabling the time to live, also for InOnly messaging. The requestTimeout option is not being used for
InOnly messaging.
transacted = true
When using Request Reply over JMS you cannot use a single transaction; JMS will not
send any messages until a commit is performed, so the server side won't receive
anything at all until the transaction commits. Therefore to use Request Reply you must
commit a transaction after sending the request and then use a separate transaction for
receiving the response.
To address this issue the JMS component uses different properties to specify
transaction use for oneway messaging and request reply messaging:
The transacted property applies only to the InOnly message Exchange Pattern (MEP).
The transactedInOut property applies to the InOut( Request Reply) message Exchange
Pattern (MEP).
You can leverage the DMLC transacted session API using the following properties on
component/endpoint:
632
CHAPTER 78. JMS
transacted = true
lazyCreateTransactionManager = false
The benefit of doing so is that the cacheLevel setting will be honored when using local transactions
without a configured TransactionManager. When a TransactionManager is configured, no caching
happens at DMLC level and its necessary to rely on a pooled connection factory. For more details
about this kind of setup see here and here.
Destination replyDestination =
exchange.getIn().getHeader(JmsConstants.JMS_REPLY_DESTINATION, Destination.class);
And then later use it to send a reply using regular JMS or Camel.
// we need to pass in the JMS component, and in this sample we use ActiveMQ
JmsEndpoint endpoint = JmsEndpoint.newInstance(replyDestination, activeMQComponent);
// now we have the endpoint we can use regular Camel API to send a message to it
template.sendBody(endpoint, "Here is the late reply.");
A different solution to sending a reply is to provide the replyDestination object in the same Exchange
property when sending. Camel will then pick up this property and use it for the real destination. The
endpoint URI must include a dummy destination, however. For example:
SAMPLES
JMS is used in many examples for other components as well. But we provide a few samples below to
get started.
633
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In the following sample we configure a route that receives JMS messages and routes the message to a
POJO:
from("jms:queue:foo").
to("bean:myBusinessLogic");
You can of course use any of the EIP patterns so the route can be context based. For example, here's
how to filter an order topic for the big spenders:
from("jms:topic:OrdersTopic").
filter().method("myBean", "isGoldCustomer").
to("jms:queue:BigSpendersQueue");
SENDING TO A JMS
In the sample below we poll a file folder and send the file content to a JMS topic. As we want the
content of the file as a TextMessage instead of a BytesMessage, we need to convert the body to a
String:
from("file://orders").
convertBodyTo(String.class).
to("jms:topic:OrdersTopic");
USING ANNOTATIONS
Camel also has annotations so you can use POJO Consuming and POJO Producing.
<route>
<from uri="jms:topic:OrdersTopic"/>
<filter>
<method bean="myBean" method="isGoldCustomer"/>
<to uri="jms:queue:BigSpendersQueue"/>
</filter>
</route>
OTHER SAMPLES
JMS appears in many of the examples for other components and EIP patterns, as well in this Camel
documentation. So feel free to browse the documentation. If you have time, check out the this tutorial
that uses JMS but focuses on how well Spring Remoting and Camel works together Tutorial-
JmsRemoting.
634
CHAPTER 78. JMS
normally the caused Exception is not stored in the JMS message. You can, however, use the
transferExchange option on the JMS dead letter queue to instruct Camel to store the entire Exchange
in the queue as a javax.jms.ObjectMessage that holds a
org.apache.camel.impl.DefaultExchangeHolder. This allows you to consume from the Dead Letter
Queue and retrieve the caused exception from the Exchange property with the key
Exchange.EXCEPTION_CAUGHT. The demo below illustrates this:
// setup error handler to use JMS as queue and store the entire Exchange
errorHandler(deadLetterChannel("jms:queue:dead?transferExchange=true"));
Then you can consume from the JMS queue and analyze the problem:
from("jms:queue:dead").to("bean:myErrorAnalyzer");
// and on the seda dead queue we can do the custom transformation before its sent to the JMS queue
from("seda:dead").transform(exceptionMessage()).to("jms:queue:dead");
Here we only store the original cause error message in the transform. You can, however, use any
Expression to send whatever you like. For example, you can invoke a method on a Bean or use a
custom processor.
For example to send an InOnly message to the foo queue, but with a JMSReplyTo with bar queue you
can do as follows:
635
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
...
.setHeader("CamelJmsDestinationName", constant("queue:///MY_QUEUE?targetClient=1"))
.to("wmq:queue:MY_QUEUE?useMessageIDAsCorrelationID=true");
Some versions of WMQ won't accept this option on the destination name and you will get an exception
like:
wmq.setDestinationResolver(new DestinationResolver(){
public Destination resolveDestinationName(Session session, String destinationName, boolean
pubSubDomain) throws JMSException {
MQQueueSession wmqSession = (MQQueueSession) session;
return wmqSession.createQueue("queue:///" + destinationName + "?targetClient=1");
}
});
Transactional Client
Bean Integration
Tutorial-JmsRemoting
JMSTemplate gotchas
636
CHAPTER 79. JMX
JMX COMPONENT
The JMX component enables consumers to subscribe to an MBean's notifications. The component
supports passing the Notification object directly through the exchange or serializing it to XML
according to the schema provided within this project. This is a consumer-only component. Exceptions
are thrown if you attempt to create a producer for it.
In the context of the JBoss EAP container, the JMX component integrates with the JBoss EAP JMX
subsystem as follows:
URI FORMAT
The component can connect to the local platform MBean server with the following URI:
jmx://platform?options
A remote MBean server URL can be specified after the jmx: scheme prefix, as follows:
jmx:service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi?options
You can append query options to the URI in the following format, ?option=value&option=value&....
URI OPTIONS
637
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
638
CHAPTER 79. JMX
OBJECTNAME CONSTRUCTION
The URI must always have the objectDomain property. In addition, the URI must contain either
objectName or one or more properties that start with key.
The key value in the preceding constructor must be name and the value is the value of the
objectName property.
639
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The Hashtable is constructed by extracting properties that start with key. The properties will have the
key prefix stripped prior to building the Hashtable. This allows the URI to contain a variable number of
properties to identify the MBean.
EXAMPLE
from("jmx:platform?objectDomain=jmxExample&key.name=simpleBean").
to("log:jmxEvent");
FULL EXAMPLE
A complete example using the JMX component is available under the examples/camel-example-jmx
directory.
The 2.8 version introduces a new type of consumer that automatically creates and registers a monitor
bean for the specified objectName and attribute. Additional endpoint attributes allow the user to
specify the attribute to monitor, type of monitor to create, and any other required properties. The code
snippet above is condensed into a set of endpoint properties. The consumer uses these properties to
create the CounterMonitor, register it, and then subscribe to its changes. All of the JMX monitor types
are supported.
EXAMPLE
from("jmx:platform?objectDomain=myDomain&objectName=simpleBean&" +
"monitorType=counter&observedAttribute=MonitorNumber&initThreshold=1&" +
"granularityPeriod=500").to("mock:sink");
The example above will cause a new Monitor Bean to be created and depoyed to the local mbean
server that monitors the MonitorNumber attribute on the simpleBean. Additional types of monitor
beans and options are detailed below. The newly deployed monitor bean is automatically undeployed
when the consumer is stopped.
640
CHAPTER 79. JMX
641
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The monitor style consumer is only supported for the local mbean server. JMX does not currently
support remote deployment of mbeans without either having the classes already remotely deployed or
an adapter library on both the client and server to facilitate a proxy deployment.
642
CHAPTER 80. JPA
JPA COMPONENT
The jpa component enables you to store and retrieve Java objects from persistent storage using EJB
3's Java Persistence Architecture (JPA), which is a standard interface layer that wraps
Object/Relational Mapping (ORM) products such as OpenJPA, Hibernate, TopLink, and so on.
For more information about using the JPA component in a JBoss EAP container, see Integration with
JPA.
If the body does not contain one of the preceding types, put a Message TranslatorMessage Translator
in front of the endpoint to perform the necessary conversion first.
If you do not wish to delete the entity bean when it has been processed (and when routing is done), you
can specify consumeDelete=false on the URI. This will result in the entity being processed each poll.
If you would rather perform some update on the entity to mark it as processed (such as to exclude it
from a future query) then you can annotate a method with @Consumed which will be invoked on your
entity bean when the entity bean when it has been processed (and when routing is done).
From Camel 2.13 onwards you can use @PreConsumed which will be invoked on your entity bean
before it has been processed (before routing).
URI FORMAT
jpa:entityClassName[?options]
For sending to the endpoint, the entityClassName is optional. If specified, it helps the Type Converter to
ensure the body is of the correct type.
You can append query options to the URI in the following format, ?option=value&option=value&...
643
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
OPTIONS
644
CHAPTER 80. JPA
645
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
646
CHAPTER 80. JPA
MESSAGE HEADERS
Apache Camel adds the following message headers to the exchange:
CONFIGURING ENTITYMANAGERFACTORY
You are strongly advised to configure the JPA component to use a specific EntityManagerFactory
instance. If you do not do so, each JpaEndpoint will auto-create its own EntityManagerFactory
instance.For example, you can instantiate a JPA component that references the myEMFactory entity
manager factory, as follows:
In Camel 2.3 the JpaComponent will auto lookup the EntityManagerFactory from the Registry which
means you do not need to configure this on the JpaComponent as shown above. You only need to do
so if there is ambiguity, in which case Camel will log a WARN.
CONFIGURING TRANSACTIONMANAGER
Since Camel 2.3 the JpaComponent will auto lookup the TransactionManager from the Registry. If
Camel does not find any TransactionManager instance registered, it will also look up for the
TransactionTemplate and try to extract TransactionManager from it. If no TransactionTemplate is
available in the registry, JpaEndpoint will auto-create its own instance of TransactionManager.
If more than a single instance of the TransactionManager is found, Camel logs a WARN message. In
such cases, you might want to instantiate and explicitly configure a JPA component that references
the myTransactionManager transaction manager, as follows:
647
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
For consuming only selected entities, you can use the consumer.namedQuery URI query option. First,
you have to define the named query in the JPA Entity class:
@Entity
@NamedQuery(name = "step1", query = "select x from MultiSteps x where x.step = 1")
public class MultiSteps {
...
}
After that you can define a consumer uri like this one:
from("jpa://org.apache.camel.examples.MultiSteps?consumer.namedQuery=step1")
.to("bean:myBusinessLogic");
from("jpa://org.apache.camel.examples.MultiSteps?consumer.query=select o from
org.apache.camel.examples.MultiSteps o where o.step = 1")
.to("bean:myBusinessLogic");
If you use the native query option, you will receive an object array in the message body.
EXAMPLE
See the Tracer Example for an example using JPA to store traced messages into a database.
<properties>
<property name="openjpa.ConnectionURL"
value="jdbc:derby:target/idempotentTest;create=true"/>
<property name="openjpa.ConnectionDriverName"
value="org.apache.derby.jdbc.EmbeddedDriver"/>
648
CHAPTER 80. JPA
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<!-- we use idempotentDB as the persitence unit name defined in the persistence.xml file -->
<property name="persistenceUnitName" value="idempotentDb"/>
</bean>
<!-- 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 spring jpaTemplate -->
<constructor-arg index="0" ref="jpaTemplate"/>
<!-- This 2nd parameter is the name (= a cateogry name).
You can have different repositories with different names -->
<constructor-arg index="1" value="FileConsumer"/>
</bean>
And finally we can create our JPA idempotent repository in the spring XML file as well:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route id="JpaMessageIdRepositoryTest">
<from uri="direct:start" />
<idempotentConsumer messageIdRepositoryRef="jpaStore">
<header>messageId</header>
<to uri="mock:result" />
</idempotentConsumer>
</route>
</camelContext>
649
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
JSCH
The camel-jsch component supports the SCP protocol using the Client API of the Jsch project. Jsch is
already used in camel by the FTP component for the sftp: protocol.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jsch</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
scp://host[:port]/destination[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
The file name can be specified either in the <path> part of the URI or as a "CamelFileName" header on
the message (Exchange.FILE_NAME if used in code).
OPTIONS
650
CHAPTER 81. JSCH
COMPONENT OPTIONS
The JschComponent supports the following options:
verboseLogging Camel 2.15: JSCH is verbose logging out of the box. true
Therefore, we turn the logging down to DEBUG logging by
default.
LIMITATIONS
Currently camel-jsch supports only a Producer (i.e. copy files to another host).
651
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
JT/400 COMPONENT
The jt400 component allows you to exchanges messages with an AS/400 system using data queues.
URI FORMAT
jt400://user:password@system/QSYS.LIB/LIBRARY.LIB/QUEUE.DTAQ[?options]
jt400://user:password@system/QSYS.LIB/LIBRARY.LIB/program.PGM[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
URI OPTIONS
For the data queue message exchange:
ccsid default system CCSID Specifies the CCSID to use for the
connection with the AS/400
system.
652
CHAPTER 82. JT400
USAGE
When configured as a consumer endpoint, the endpoint will poll a data queue on a remote system. For
653
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
every entry on the data queue, a new Exchange is sent with the entry's data in the In message's body,
formatted either as a String or a byte[], depending on the format. For a provider endpoint, the In
message body contents will be put on the data queue as either raw bytes or text.
CONNECTION POOL
Available as of Camel 2.10
Connection pooling is in use from Camel 2.10 onwards. You can explicit configure a connection pool on
the Jt400Component, or as an uri option on the endpoint.
EXAMPLE
In the snippet below, the data for an exchange sent to the direct:george endpoint will be put in the
data queue PENNYLANE in library BEATLES on a system named LIVERPOOL. Another user connects
to the same data queue to receive the information from the data queue and forward it to the
mock:ringo endpoint.
@Override
public void configure() throws Exception {
from("direct:george").to("jt400://GEORGE:EGROEG@LIVERPOOL/QSYS.LIB/BEATLES.LIB/PENNY
LANE.DTAQ");
from("jt400://RINGO:OGNIR@LIVERPOOL/QSYS.LIB/BEATLES.LIB/PENNYLANE.DTAQ").to("mock:
ringo");
}
}
654
CHAPTER 82. JT400
fieldsLength=10,10,512&ouputFieldsIdx=2,3").to("direct:play");
}
}
from("jms:queue:input")
.to("jt400://username:password@system/lib.lib/MSGINDQ.DTAQ?keyed=true");
from("jt400://username:password@system/lib.lib/MSGOUTDQ.DTAQ?
keyed=true&searchKey=MYKEY&searchType=GE")
.to("jms:queue:output");
655
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
KAFKA COMPONENT
Available as of Camel 2.13
The kafka: component is used for communicating with Apache Kafka message broker.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-kafka</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
kafka:server:port[?options]
OPTIONS
groupId
partitioner
consumerStreams 10
clientId
zookeeperSessionTimeoutMs
zookeeperConnectionTimeoutMs
656
CHAPTER 83. KAFKA
zookeeperSyncTimeMs
You can append query options to the URI in the following format, ?option=value&option=value&...
PRODUCER OPTIONS
producerType
compressionCodec
compressedTopics
messageSendMaxRetries
retryBackoffMs
topicMetadataRefreshIntervalMs
sendBufferBytes
requestRequiredAcks
requestTimeoutMs
queueBufferingMaxMs
queueBufferingMaxMessages
queueEnqueueTimeoutMs
657
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
batchNumMessages
serializerClass
keySerializerClass
CONSUMER OPTIONS
consumerId
socketTimeoutMs
socketReceiveBufferBytes
fetchMessageMaxBytes
autoCommitEnable
autoCommitIntervalMs
queuedMaxMessages
rebalanceMaxRetries
fetchMinBytes
fetchWaitMaxMs
rebalanceBackoffMs
refreshLeaderBackoffMs
autoOffsetReset
consumerTimeoutMs
SAMPLES
Consuming messages:
from("kafka:localhost:9092?
topic=test&zookeeperHost=localhost&zookeeperPort=2181&groupId=group1").to("log:input");
658
CHAPTER 83. KAFKA
Producing messages:
ENDPOINTS
Camel supports the Message Endpoint pattern using the Endpoint interface. Endpoints are usually
created by a Component and Endpoints are usually referred to in the DSL via their URIs.
createProducer() will create a Producer for sending message exchanges to the endpoint
createConsumer() implements the Event Driven Consumer pattern for consuming message
exchanges from the endpoint via a Processor when creating a Consumer
SEE ALSO
Configuring Camel
URIs
Writing Components
659
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
KESTREL COMPONENT
The Kestrel component allows messages to be sent to a Kestrel queue, or messages to be consumed
from a Kestrel queue. This component uses the spymemcached client for memcached protocol
communication with Kestrel servers.
WARNING
URI FORMAT
kestrel://[addresslist/]queuename[?options]
Where queuename is the name of the queue on Kestrel. The addresslist part of the URI may include
one or more host:port pairs. For example, to connect to the queue foo on kserver01:22133, use:
kestrel://kserver01:22133/foo
kestrel://foo
Likewise, if a port is omitted from a host:port pair in addresslist, the default port 22133 is assumed,
i.e.:
kestrel://kserver01/foo
Here is an example of a Kestrel endpoint URI used for producing to a clustered queue:
kestrel://kserver01:22133,kserver02:22133,kserver03:22133/massive
Here is an example of a Kestrel endpoint URI used for consuming concurrently from a queue:
kestrel://kserver03:22133/massive?concurrentConsumers=25&waitTimeMs=500
OPTIONS
You can configure properties on each Kestrel endpoint individually by specifying them in the ?
parameters portion of the endpoint URI. Any ?parameters that are omitted will default to what is
configured on the KestrelComponent's base KestrelConfiguration. The following properties may be set
on KestrelConfiguration and/or each individual endpoint:
660
CHAPTER 84. KESTREL
NOTE: If waitTimeMs is set to zero (or negative), the /t=... specifier does not get passed to the server
on GET requests. When a queue is empty, the GET call returns immediately with no value. In order to
prevent "tight looping" in the polling phase, this component will do a Thread.sleep(100) whenever
nothing is returned from the GET request (only when nothing is returned). You are highly encouraged
to configure a positive non-zero value for waitTimeMs.
<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 xmlns="http://camel.apache.org/schema/spring">
</camelContext>
</beans>
That will enable the Kestrel component with all default settings, i.e. it will use localhost:22133, 100ms
wait time, and a single non-concurrent consumer by default.
To use specific options in the base configuration (which supplies configuration to endpoints whose ?
properties are not specified), you can set up a KestrelConfiguration POJO as follows:
<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">
661
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
</camelContext>
</beans>
USAGE EXAMPLES
EXAMPLE 1: CONSUMING
from("kestrel://kserver02:22133/massive?concurrentConsumers=10&waitTimeMs=500")
.bean("myConsumer", "onMessage");
EXAMPLE 2: PRODUCING
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="kestrel://ks01:22133/sequential?concurrentConsumers=1&waitTimeMs=500"/>
<bean ref="myBean" method="onMessage"/>
</route>
<route>
<from uri="direct:start"/>
<to uri="kestrel://ks02:22133/stuff"/>
</route>
</camelContext>
662
CHAPTER 84. KESTREL
...
}
}
DEPENDENCIES
The Kestrel component has the following dependencies:
SPYMEMCACHED
You must have the spymemcached jar on your classpath. Here is a snippet you can use in your
pom.xml:
<dependency>
<groupId>spy</groupId>
<artifactId>memcached</artifactId>
<version>2.5</version>
</dependency>
LIMITATIONS
NOTE: The spymemcached client library does not work properly with kestrel when
JVM assertions are enabled. There is a known issue with spymemcached when
assertions are enabled and a requested key contains the /t=... extension (i.e. if
you're using the waitTimeMs option on an endpoint URI, which is highly
encouraged).
Fortunately, JVM assertions are disabled by default , unless you explicitly enable
them, so this should not present a problem under normal circumstances.
Something to note is that Maven's Surefire test plugin enables assertions. If you're
using this component in a Maven test environment, you may need to set
enableAssertions to false. Please refer to the surefire:test reference for details.
663
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
KRATI COMPONENT
Available as of Camel 2.9
This component allows the use krati datastores and datasets inside Camel. Krati is a simple persistent
data store with very low latency and high throughput. It is designed for easy integration with read-
write-intensive applications with little effort in tuning configuration, performance and JVM garbage
collection.
Camel provides a producer and consumer for krati datastore_(key/value engine)_. It also provides an
idempotent repository for filtering out duplicate messages.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-krati</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The path of the datastore is the relative path of the folder that krati will use for its datastore.
You can append query options to the URI in the following format, ?option=value&option=value&...
664
CHAPTER 85. KRATI
For producer endpoint you can override all of the above URI options by passing the appropriate
headers to the message.
Header Description
CamelKratiAdd
CamelKratiGet
CamelKratiDelete
CamelKratiDeleteAll
USAGE SAMPLES
665
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:put").to("krati:target/test/producertest");
In the above example you can override any of the URI parameters with headers on the message. Here
is how the above example would look like using xml to define our route.
<route>
<from uri="direct:put"/>
<to uri="krati:target/test/producerspringtest"/>
</route>
from("direct:get")
.setHeader(KratiConstants.KRATI_OPERATION,
constant(KratiConstants.KRATI_OPERATION_GET))
.to("krati:target/test/producertest");
In the above example you can override any of the URI parameters with headers on the message. Here
is how the above example would look like using xml to define our route.
<route>
<from uri="direct:get"/>
<to uri="krati:target/test/producerspringtest?operation=CamelKratiGet"/>
</route>
from("krati:target/test/consumertest")
.to("direct:next");
You can achieve the same goal by using xml, as you can see below.
<route>
<from uri="krati:target/test/consumerspringtest"/>
<to uri="mock:results"/>
</route>
IDEMPOTENT REPOSITORY
As already mentioned this component also offers and idemptonet repository which can be used for
filtering out duplicate messages.
from("direct://in").idempotentConsumer(header("messageId"), new
KratiIdempotentRepositroy("/tmp/idempotent").to("log://out");
SEE ALSO
666
CHAPTER 85. KRATI
Krati Websitre
667
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
KURA COMPONENT
Kura component is available starting from Camel 2.15.
This documentation page covers the integration options of Camel with the Eclipse Kura M2M gateway.
The common reason to deploy Camel routes into the Eclipse Kura is to provide enterprise integration
patterns and Camel components to the messaging M2M gateway. For example you might want to
install Kura on Raspberry PI, then read temperature from the sensor attached to that Raspberry PI
using Kura services and finally forward the current temperature value to your data center service
using Camel EIP and components.
KURAROUTER ACTIVATOR
Bundles deployed to the Eclipse Kura are usually developed as bundle activators . So the easiest way to
deploy Apache Camel routes into the Kura is to create an OSGi bundle containing the class extending
org.apache.camel.kura.KuraRouter class:
@Override
public void configure() throws Exception {
from("timer:trigger").
to("netty-http:http://app.mydatacenter.com/api");
}
Kura router starts its own OSGi-aware CamelContext. It means that for every class extending
KuraRouter, there will be a dedicated CamelContext instance. Ideally we recommend to deploy one
KuraRouter per OSGi bundle.
DEPLOYING KURAROUTER
Bundle containing your Kura router class should import the following packages in the OSGi manifest:
Import-Package: org.osgi.framework;version="1.3.0",
org.slf4j;version="1.6.4",
668
CHAPTER 86. KURA
org.apache.camel,org.apache.camel.impl,org.apache.camel.core.osgi,org.apache.camel.builder,org.apa
che.camel.model,
org.apache.camel.component.kura
Keep in mind that you don't have to import every Camel component bundle you plan to use in your
routes, as Camel components are resolved as the services on the runtime level.
Before you deploy your router bundle, be sure that you have deployed (and started) the following
Camel core bundles (using Kura GoGo shell)...
install file:///home/user/.m2/repository/org/apache/camel/camel-core/2.15.0/camel-core-2.15.0.jar
start <camel-core-bundle-id>
install file:///home/user/.m2/repository/org/apache/camel/camel-core-osgi/2.15.0/camel-core-osgi-
2.15.0.jar
start <camel-core-osgi-bundle-id>
install file:///home/user/.m2/repository/org/apache/camel/camel-kura/2.15.0/camel-kura-2.15.0.jar
start <camel-kura-bundle-id>
install file:///home/user/.m2/repository/org/apache/camel/camel-stream/2.15.0/camel-stream-
2.15.0.jar
start <camel-stream-bundle-id>
install file:///home/user/.m2/repository/com/example/myrouter/1.0/myrouter-1.0.jar
start <your-bundle-id>
KURAROUTER UTILITIES
Kura router base class provides many useful utilities. This section explores each of them.
SLF4J LOGGER
Kura uses SLF4J facade for logging purposes. Protected member log returns SLF4J logger instance
associated with the given Kura router.
@Override
public void configure() throws Exception {
log.info("Configuring Camel routes!");
...
}
BUNDLECONTEXT
Protected member bundleContext returns bundle context associated with the given Kura router.
669
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
@Override
public void configure() throws Exception {
ServiceReference<MyService> serviceRef =
bundleContext.getServiceReference(LogService.class.getName());
MyService myService = content.getService(serviceRef);
...
}
CAMELCONTEXT
Protected member camelContext is the CamelContext associated with the given Kura router.
@Override
public void configure() throws Exception {
camelContext.getStatus();
...
}
@Override
public void configure() throws Exception {
MyService myService = service(MyService.class);
...
}
...
670
CHAPTER 86. KURA
671
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
LANGUAGE
Available as of Camel 2.5
The language component allows you to send Exchange to an endpoint which executes a script by any
of the supported Languages in Camel. By having a component to execute language scripts, it allows
more dynamic routing capabilities. For example by using the Routing SlipRouting Slip or Dynamic
RouterDynamic Router EIPs you can send messages to language endpoints where the script is
dynamic defined as well.
This component is provided out of the box in camel-core and hence no additional JARs is needed. You
only have to include additional Camel components if the language of choice mandates it, such as using
Groovy or JavaScript languages.
And from Camel 2.11 onwards you can refer to an external resource for the script using same notation
as supported by the other Languages in Camel
language://languageName:resource:scheme:location][?options]
URI FORMAT
language://languageName[:script][?options]
URI OPTIONS
The component supports the following options.
672
CHAPTER 87. LANGUAGE
MESSAGE HEADERS
The following message headers can be used to affect the behavior of the component
Header Description
EXAMPLES
For example you can use the Simple language to Message TranslatorMessage Translator a message:
In case you want to convert the message body type you can do this as well:
673
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can also use the Groovy language, such as this example where the input message will by multiplied
with 2:
from("direct:start").to("language:groovy:request.body * 2").to("mock:result");
You can also provide the script as a header as shown below. Here we use XPath language to extract
the text from the <foo> tag.
You can specify a resource uri for a script to load in either the endpoint uri, or in the
Exchange.LANGUAGE_SCRIPT header. The uri must start with one of the following schemes: file:,
classpath:, or http:
from("direct:start")
// load the script from the classpath
.to("language:simple:classpath:org/apache/camel/component/language/mysimplescript.txt")
.to("mock:result");
By default the script is loaded once and cached. However you can disable the contentCache option
and have the script loaded on each evaluation. For example if the file myscript.txt is changed on disk,
then the updated script is used:
from("direct:start")
// the script will be loaded on each message, as we disabled cache
.to("language:simple:file:target/script/myscript.txt?contentCache=false")
.to("mock:result");
From Camel 2.11 onwards you can refer to the resource similar to the other Languages in Camel by
prefixing with "resource:" as shown below:
from("direct:start")
// load the script from the classpath
.to("language:simple:resource:classpath:org/apache/camel/component/language/mysimplescript.txt")
.to("mock:result");
Languages
674
CHAPTER 88. LDAP
LDAP COMPONENT
The ldap component allows you to perform searches in LDAP servers using filters as the message
payload. This component uses standard JNDI (javax.naming package) to access the server.
URI FORMAT
ldap:ldapServerBean[?options]
The ldapServerBean portion of the URI refers to a DirContext bean in the registry. The LDAP
component only supports producer endpoints, which means that an ldap URI cannot appear in the
from at the start of a route.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
RESULT
The result is returned in the Out body as a ArrayList<javax.naming.directory.SearchResult> object.
DIRCONTEXT
675
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The URI, ldap:ldapserver, references a Spring bean with the ID, ldapserver. The ldapserver bean may
be defined as follows:
The preceding example declares a regular Sun based LDAP DirContext that connects anonymously to
a locally hosted LDAP server.
NOTE
SAMPLES
Following on from the Spring configuration above, the code sample below sends an LDAP request to
filter search a group for a member. The Common Name is then extracted from the response.
if (results.size() > 0) {
// Extract what we need from the device's profile
...
If no specific filter is required - for example, you just need to look up a single entry - specify a wildcard
filter expression. For example, if the LDAP entry has a Common Name, use a filter expression like:
(cn=*)
676
CHAPTER 88. LDAP
System.out.println(out.getOut().getBody());
context.stop();
CONFIGURING SSL
All that is required is to create a custom socket factory and reference it in the InitialDirContext bean,
as shown in the following example:
677
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<sslContextParameters xmlns="http://camel.apache.org/schema/blueprint"
id="sslContextParameters">
<keyManagers
keyPassword="{{keystore.pwd}}">
<keyStore
resource="{{keystore.url}}"
password="{{keystore.pwd}}"/>
</keyManagers>
</sslContextParameters>
import org.apache.camel.util.jsse.SSLContextParameters;
import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyStore;
/**
* The CustomSocketFactory. Loads the KeyStore and creates an instance of SSLSocketFactory
*/
public class CustomSocketFactory extends SSLSocketFactory {
/**
* Called by the getDefault() method.
*/
public CustomSocketFactory() {
678
CHAPTER 88. LDAP
/**
* Called by Blueprint DI to initialise an instance of SocketFactory
*
* @param sslContextParameters
*/
public CustomSocketFactory(SSLContextParameters sslContextParameters) {
try {
KeyStore keyStore =
sslContextParameters.getKeyManagers().getKeyStore().createKeyStore();
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
socketFactory = ctx.getSocketFactory();
} catch (Exception ex) {
ex.printStackTrace(System.err); /* handle exception */
}
}
/**
* Getter for the SocketFactory
*
* @return
*/
public static SocketFactory getDefault() {
return new CustomSocketFactory();
}
@Override
public String[] getDefaultCipherSuites() {
return socketFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return socketFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket(Socket socket, String string, int i, boolean bln) throws IOException {
return socketFactory.createSocket(socket, string, i, bln);
}
@Override
public Socket createSocket(String string, int i) throws IOException {
return socketFactory.createSocket(string, i);
}
@Override
public Socket createSocket(String string, int i, InetAddress ia, int i1) throws IOException {
return socketFactory.createSocket(string, i, ia, i1);
}
@Override
public Socket createSocket(InetAddress ia, int i) throws IOException {
return socketFactory.createSocket(ia, i);
679
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
@Override
public Socket createSocket(InetAddress ia, int i, InetAddress ia1, int i1) throws IOException {
return socketFactory.createSocket(ia, i, ia1, i1);
}
}
680
CHAPTER 89. LEVELDB
LEVELDB
Available as of Camel 2.10
Leveldb is a very lightweight and embedable key value database. With Camel, it provides persistent
support for various Camel features, such as Aggregator.
LevelDBAggregationRepository
USING LEVELDBAGGREGATIONREPOSITORY
LevelDBAggregationRepository is an AggregationRepository which on the fly persists the
aggregated messages. This ensures that you will not loose messages, as the default aggregator will use
an in memory only AggregationRepository.
681
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The repositoryName option must be provided. Then either the persistentFileName or the levelDBFile
must be provided.
RECOVERY
682
CHAPTER 89. LEVELDB
The LevelDBAggregationRepository will by default recover any failed Exchange. It does this by
having a background tasks that scans for failed Exchanges in the persistent store. You can use the
checkInterval option to set how often this task runs. The recovery works as transactional which
ensures that Camel will try to recover and redeliver the failed Exchange. Any Exchange which was
found to be recovered will be restored from the persistent store and resubmitted and send out again.
Only when an Exchange has been successfully processed it will be marked as complete which happens
when the confirm method is invoked on the AggregationRepository. This means if the same
Exchange fails again it will be kept retried until it success.
You can use option maximumRedeliveries to limit the maximum number of redelivery attempts for a
given recovered Exchange. You must also set the deadLetterUri option so Camel knows where to send
the Exchange when the maximumRedeliveries was hit.
You can see some examples in the unit tests of camel-leveldb, for example this test.
683
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from uri="direct:start"/>
<!-- aggregate using our strategy and leveldb repo, and complete when we have 5 messages
aggregated -->
<aggregate strategyRef="myAggregatorStrategy" aggregationRepositoryRef="repo"
completionSize="5">
<!-- correlate by header with the key id -->
<correlationExpression><header>id</header></correlationExpression>
<!-- send aggregated messages to the mock endpoint -->
<to uri="mock:aggregated"/>
</aggregate>
</route>
</camelContext>
DEPENDENCIES
To use LevelDB in your camel routes you need to add the a dependency on camel-leveldb.
If you use maven you could just add the following to your pom.xml, substituting the version number for
the latest & greatest release (see the download page for the latest versions ).
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-leveldb</artifactId>
<version>2.10.0</version>
</dependency>
Aggregator
HawtDB
Components
684
CHAPTER 90. LINKEDIN
LINKEDIN COMPONENT
Available as of Camel 2.14
The LinkedIn component provides access to all of LinkedIn REST APIs documented at
https://developer.linkedin.com/rest.
LinkedIn uses OAuth2.0 for all client application authentication. In order to use camel-linkedin with
your account, you'll need to create a new application for LinkedIn at
https://www.linkedin.com/secure/developer. The LinkedIn application's client id and secret will allow
access to LinkedIn REST APIs which require a current user. A user access token is generated and
managed by component for an end user. Alternatively the Camel application can register an
implementation of org.apache.camel.component.linkedin.api.OAuthSecureStorage to provide an
org.apache.camel.component.linkedin.apiOAuthToken OAuth token.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-linkedin</artifactId>
<version>${camel-version}</version>
</dependency>
URI FORMAT
linkedin://endpoint-prefix/endpoint?[options]
comments
companies
groups
jobs
people
posts
search
LINKEDINCOMPONENT
The LinkedIn Component can be configured with the options below. These options can be provided
using the component's bean property configuration of type
org.apache.camel.component.linkedin.LinkedInConfiguration.
685
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PRODUCER ENDPOINTS:
Producer endpoints can use endpoint prefixes followed by endpoint names and associated options
described next. A shorthand alias can be used for some endpoints. The endpoint URI MUST contain a
prefix.
Endpoint options that are not mandatory are denoted by []. When there are no mandatory options for
an endpoint, one of the set of [] options MUST be provided. Producer endpoints can also use a special
686
CHAPTER 90. LINKEDIN
option inBody that in turn should contain the name of the endpoint option whose value will be
contained in the Camel Exchange In message.
Any of the endpoint options can be provided in either the endpoint URI, or dynamically in a message
header. The message header name must be of the format CamelLinkedIn.<option>. Note that the
inBody option overrides message header, i.e. the endpoint option inBody=option would override a
CamelLinkedIn.option header.
For more information on the endpoints and options see LinkedIn REST API documentation at
https://developer.linkedin.com/rest.
linkedin://comments/endpoint?[options]
Name Type
comment_id String
fields String
linkedin://companies/endpoint?[options]
687
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
688
CHAPTER 90. LINKEDIN
Name Type
companySizes java.util.List
company_id Long
count Long
email_domain String
end_timestamp Long
event_type org.apache.camel.component.linkedin.api.Ev
enttype
fields String
geos java.util.List
industries java.util.List
689
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
is_company_admin Boolean
isliked org.apache.camel.component.linkedin.api.m
odel.IsLiked
jobFunc java.util.List
secure_urls Boolean
seniorities java.util.List
share org.apache.camel.component.linkedin.api.m
odel.Share
start Long
start_timestamp Long
time_granularity org.apache.camel.component.linkedin.api.Ti
megranularity
universal_name String
update_key String
updatecomment org.apache.camel.component.linkedin.api.m
odel.UpdateComment
linkedin://groups/endpoint?[options]
690
CHAPTER 90. LINKEDIN
Name Type
group_id Long
post org.apache.camel.component.linkedin.api.m
odel.Post
linkedin://jobs/endpoint?[options]
Name Type
fields String
job org.apache.camel.component.linkedin.api.m
odel.Job
job_id Long
partner_job_id Long
linkedin://people/endpoint?[options]
691
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
followCompany company
692
CHAPTER 90. LINKEDIN
693
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
stopFollowingComp company_id
any
updateGroupMembe group_id,
rship groupmembership
Name Type
activity org.apache.camel.component.linkedin.api.m
odel.Activity
after Long
694
CHAPTER 90. LINKEDIN
before Long
category org.apache.camel.component.linkedin.api.Ca
tegory
company org.apache.camel.component.linkedin.api.m
odel.Company
company_id Long
count Long
fields String
group_id Long
groupmembership org.apache.camel.component.linkedin.api.m
odel.GroupMembership
isliked org.apache.camel.component.linkedin.api.m
odel.IsLiked
job_id Long
jobbookmark org.apache.camel.component.linkedin.api.m
odel.JobBookmark
mailboxitem org.apache.camel.component.linkedin.api.m
odel.MailboxItem
membership_state org.apache.camel.component.linkedin.api.m
odel.MembershipState
modified_since Long
order org.apache.camel.component.linkedin.api.Or
der
person_id String
public_profile_url String
role org.apache.camel.component.linkedin.api.Ro
le
scope String
695
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
secure_urls Boolean
share org.apache.camel.component.linkedin.api.m
odel.Share
show_hidden_members Boolean
start Long
type org.apache.camel.component.linkedin.api.Ty
pe
update_key String
updatecomment org.apache.camel.component.linkedin.api.m
odel.UpdateComment
linkedin://posts/endpoint?[options]
flagCategory post_id,
postcategorycode
696
CHAPTER 90. LINKEDIN
If a value is not provided for one of the option(s) [count, start] either in the endpoint URI or in a
message header, it will be assumed to be null. Note that the null value(s) will only be used if other
options do not satisfy matching endpoints.
Name Type
comment org.apache.camel.component.linkedin.api.m
odel.Comment
count Long
fields String
isfollowing org.apache.camel.component.linkedin.api.m
odel.IsFollowing
isliked org.apache.camel.component.linkedin.api.m
odel.IsLiked
post_id String
postcategorycode org.apache.camel.component.linkedin.api.m
odel.PostCategoryCode
start Long
linkedin://search/endpoint?[options]
697
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Type
company_name String
count Long
country_code String
current_company String
current_school String
current_title String
distance org.apache.camel.component.linkedin.api.m
odel.Distance
facet String
facets String
fields String
first_name String
698
CHAPTER 90. LINKEDIN
hq_only String
job_title String
keywords String
last_name String
postal_code String
school_name String
sort String
start Long
title String
CONSUMER ENDPOINTS
Any of the producer endpoints can be used as a consumer endpoint. Consumer endpoints can use
Scheduled Poll Consumer Options with a consumer. prefix to schedule endpoint invocation. By default
Consumer endpoints that return an array or collection will generate one exchange per element, and
their routes will be executed once for each exchange. To change this behavior use the property
consumer.splitResults=true to return a single exchange for the entire list or array.
MESSAGE HEADERS
Any URI option can be provided in a message header for producer endpoints with a CamelLinkedIn.
prefix.
MESSAGE BODY
All result message bodies utilize objects provided by the Camel LinkedIn API SDK, which is built using
Apache CXF JAX-RS. Producer endpoints can specify the option name for incoming message body in
the inBody endpoint parameter.
USE CASES
The following route gets user's profile:
from("direct:foo")
.to("linkedin://people/person");
from("linkedin://people/connections?consumer.timeUnit=SECONDS&consumer.delay=30")
.to("bean:foo");
699
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The following route uses a producer with dynamic header options. The personId header has the
LinkedIn person ID, so its assigned to the CamelLinkedIn.person_id header as follows:
from("direct:foo")
.setHeader("CamelLinkedIn.person_id", header("personId"))
.to("linkedin://people/connectionsById")
.to("bean://bar");
700
CHAPTER 91. LIST
LIST COMPONENT
deprecated: is renamed to the Browse component in Apache Camel 2.0
The List component provides a simple BrowsableEndpoint which can be useful for testing, visualisation
tools or debugging. The exchanges sent to the endpoint are all available to be browsed.
URI FORMAT
list:someName
SAMPLE
In the route below we have the list component to be able to browse the Exchanges that is passed
through:
from("activemq:order.in").to("list:orderReceived").to("bean:processOrder");
Then we will be able to inspect the received exchanges from java code:
See also:
Browse
701
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
LOG COMPONENT
The log: component logs message exchanges to the underlying logging mechanism.
URI FORMAT
log:loggingCategory[?options]
Where loggingCategory is the name of the logging category to use. You can append query options to
the URI in the following format, ?option=value&option=value&...
For example, a log endpoint typically specifies the logging level using the level option, as follows:
log:org.apache.camel.example?level=DEBUG
The default logger logs every exchange (regular logging). But Apache Camel also ships with the
Throughput logger, which is used whenever the groupSize option is specified.
There is also a log directly in the DSL, but it has a different purpose. Its meant for lightweight and
human logs. See more details at LogEIP.
OPTIONS
702
CHAPTER 92. LOG
FORMATTING
The log formats the execution of exchanges to log lines. By default, the log uses LogFormatter to
format the log output, where LogFormatter has the following options:
703
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
704
CHAPTER 92. LOG
For older versions of Camel that do not support the showFiles or showStreams properties above, you
can set the following property instead on the CamelContext to log both stream and file bodies:
camelContext.getProperties().put(Exchange.LOG_DEBUG_BODY_STREAMS, true);
from("activemq:orders").to("log:com.mycompany.order?level=DEBUG").to("bean:processOrder");
<route>
<from uri="activemq:orders"/>
<to uri="log:com.mycompany.order?level=DEBUG"/>
<to uri="bean:processOrder"/>
</route>
from("activemq:orders").
to("log:com.mycompany.order?showAll=true&multiline=true").to("bean:processOrder");
from("activemq:orders").
to("log:com.mycompany.order?level=DEBUG&groupSize=10").to("bean:processOrder");
from("activemq:orders")
.to("log:com.mycompany.order?
705
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
level=DEBUG&groupInterval=10000&groupDelay=60000&groupActiveOnly=false")
.to("bean:processOrder");
"Received: 1000 new messages, with total 2000 so far. Last group took: 10000 millis which is: 100
messages per second. average: 100"
With the options outlined in the Formatting section, you can control much of the output of the logger.
However, log lines will always follow this structure:
Exchange[Id:ID-machine-local-50656-1234567901234-1-2, ExchangePattern:InOut,
Properties:{CamelToEndpoint=log://org.apache.camel.component.log.TEST?showAll=true,
CamelCreatedTimestamp=Thu Mar 28 00:00:00 WET 2013},
Headers:{breadcrumbId=ID-machine-local-50656-1234567901234-1-1}, BodyType:String, Body:Hello
World, Out: null]
This format is unsuitable in some cases, perhaps because you need to...
... filter the headers and properties that are printed, to strike a balance between insight and
verbosity.
... adjust the log message to whatever you deem most readable.
... tailor log messages for digestion by log mining systems, e.g. Splunk.
... etc.
Whenever you require absolute customization, you can create a class that implements the
ExchangeFormatter interface. Within the format(Exchange) method you have access to the full
Exchange, so you can select and extract the precise information you need, format it in a custom
manner and return it. The return value will become the final log message.
You can have the Log component pick up your custom ExchangeFormatter in either of two ways:
Simply by registering a bean with the name logFormatter; the Log Component is intelligent enough to
pick it up automatically.
706
CHAPTER 92. LOG
NOTE: the ExchangeFormatter gets applied to all Log endpoints within that Camel Context . If you
need different ExchangeFormatters for different endpoints, just instantiate the LogComponent as
many times as needed, and use the relevant bean name as the endpoint prefix.
From Camel 2.11.2/2.12 onwards when using a custom log formatter, you can specify parameters in the
log uri, which gets configured on the custom log formatter. Though when you do that you should define
the "logFormatter" as prototype scoped so its not shared if you have different parameters, eg:
And then we can have Camel routes using the log uri with different options:
<to uri="log:foo?param1=foo&aram2=100"/>
...
<to uri="log:bar?param1=bar&aram2=200"/>
When using Log component inside OSGi (e.g., in Karaf), the underlying logging mechanisms are
provided by PAX logging. It searches for a bundle which invokes org.slf4j.LoggerFactory.getLogger()
method and associates the bundle with the logger instance. Without specifying custom
org.sfl4j.Logger instance, the logger created by Log component is associated with camel-core
bundle.
In some scenarios it is required that the bundle associated with logger should be the bundle which
contains route definition. To do this, either register single instance of org.slf4j.Logger in the Registry
or reference it using logger URI parameter.
707
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The lucene component is based on the Apache Lucene project. Apache Lucene is a powerful high-
performance, full-featured text search engine library written entirely in Java. For more details about
Lucene, please see the following links:
http://lucene.apache.org/java/docs/
http://lucene.apache.org/java/docs/features.html
The lucene component in camel facilitates integration and utilization of Lucene endpoints in
enterprise integration patterns and scenarios. The lucene component does the following
builds a searchable index of documents when payloads are sent to the Lucene Endpoint
URI FORMAT
lucene:searcherName:insert[?options]
lucene:searcherName:query[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
INSERT OPTIONS
708
CHAPTER 93. LUCENE
QUERY OPTIONS
MESSAGE HEADERS
Header Description
LUCENE PRODUCERS
This component supports 2 producer endpoints.
709
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
insert - The insert producer builds a searchable index by analyzing the body in incoming
exchanges and associating it with a token ("content").
query - The query producer performs searches on a pre-created index. The query uses the
searchable index to perform score & relevance based searches. Queries are sent via the
incoming exchange contains a header property name called 'QUERY'. The value of the header
property 'QUERY' is a Lucene Query. For more details on how to create Lucene Queries check
out http://lucene.apache.org/java/3_0_0/queryparsersyntax.html
LUCENE PROCESSOR
There is a processor called LuceneQueryProcessor available to perform queries against lucene without
the need to create a producer.
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry registry =
new JndiRegistry(createJndiContext());
registry.bind("whitespace", new File("./whitespaceIndexDir"));
registry.bind("load_dir",
new File("src/test/resources/sources"));
registry.bind("whitespaceAnalyzer",
new WhitespaceAnalyzer());
return registry;
}
...
CamelContext context = new DefaultCamelContext(createRegistry());
710
CHAPTER 93. LUCENE
from("direct:next").process(new Processor() {
public void process(Exchange exchange) throws Exception {
Hits hits = exchange.getIn().getBody(Hits.class);
printResults(hits);
}
from("direct:next").process(new Processor() {
public void process(Exchange exchange) throws Exception {
Hits hits = exchange.getIn().getBody(Hits.class);
printResults(hits);
}
711
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MAIL COMPONENT
The mail component provides access to Email via Spring's Mail support and the underlying JavaMail
system.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mail</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
GERONIMO MAIL .JAR
We have discovered that the geronimo mail .jar (v1.6) has a bug when polling mails
with attachments. It cannot correctly identify the Content-Type. So, if you attach a
.jpeg file to a mail and you poll it, the Content-Type is resolved as text/plain and
not as image/jpeg. For that reason, we have added an
org.apache.camel.component.ContentTypeResolver SPI interface which enables
you to provide your own implementation and fix this bug by returning the correct
Mime type based on the file name. So if the file name ends with jpeg/jpg, you can
return image/jpeg.
You can set your custom resolver on the MailComponent instance or on the
MailEndpoint instance.
POP3 OR IMAP
POP3 has some limitations and end users are encouraged to use IMAP if possible.
You can use a mock framework for unit testing, which allows you to test without the
need for a real mail server. However you should remember to not include the mock-mail
when you go into production or other environments where you need to send mails to a
real mail server. Just the presence of the mock-javamail.jar on the classpath means that
it will kick in and avoid sending the mails.
712
CHAPTER 94. MAIL
By default, Camel creates its own mail session and uses this session to interact with your mail server.
However, JBoss EAP already provides a mail subsystem with all the relevant support for secure
connections, username and password encryption, and so on. It is recommended that you configure
your mail sessions within the JBoss EAP configuration and use JNDI to wire them into your Camel
endpoints.
URI FORMAT
Mail endpoints can have one of the following URI formats (for the protocols, SMTP, POP3, or IMAP,
respectively):
smtp://[username@]host[:port][?options]
pop3://[username@]host[:port][?options]
imap://[username@]host[:port][?options]
The mail component also supports secure variants of these protocols (layered over SSL). You can
enable the secure protocols by adding s to the scheme:
smtps://[username@]host[:port][?options]
pop3s://[username@]host[:port][?options]
imaps://[username@]host[:port][?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
SAMPLE ENDPOINTS
Typically, you specify a URI with login credentials as follows (taking SMTP as an example):
smtp://[username@]host[:port][?password=somepwd]
Alternatively, it is possible to specify both the user name and the password as query options:
smtp://host[:port]?password=somepwd&username=someuser
For example:
smtp://mycompany.mailserver:30?password=tiger&username=scott
DEFAULT PORTS
Default port numbers are supported. If the port number is omitted, Camel determines the port number
to use based on the protocol.
SMTP 25
SMTPS 465
713
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
POP3 110
POP3S 995
IMAP 143
IMAPS 993
OPTIONS
port See the section called “Default The TCP port number to connect
ports”. on.
714
CHAPTER 94. MAIL
715
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
716
CHAPTER 94. MAIL
717
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
718
CHAPTER 94. MAIL
719
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SSL SUPPORT
The underlying mail framework is responsible for providing SSL support. ou may either configure
SSL/TLS support by completely specifying the necessary Java Mail API configuration options, or you
may provide a configured SSLContextParameters through the component or endpoint configuration.
...
<camel:sslContextParameters id="sslContextParameters">
<camel:trustManagers>
<camel:keyStore resource="/users/home/server/truststore.jks" password="keystorePassword"/>
</camel:trustManagers>
</camel:sslContextParameters>...
720
CHAPTER 94. MAIL
...
<to uri="smtps://smtp.google.com?
[email protected]&password=password&sslContextParameters=#sslContextParameters"/>...
The subject of the MimeMessage can be configured using a header property on the IN message. The
code below demonstrates this:
from("direct:a").setHeader("subject", constant(subject)).to("smtp://james2@localhost");
The same applies for other MimeMessage headers such as recipients, so you can use a header property
as To:
Since Camel 2.11 When using the MailProducer the send the mail to server, you should be able to get
the message id of the MimeMessage with the key CamelMailMessageId from the Camel message
header.
In the sample code below, the email message is sent to [email protected], because it takes
precedence over the pre-configured recipient, [email protected]. Any CC and BCC settings in
the endpoint URI are also ignored and those recipients will not receive any mail. The choice between
headers and pre-configured settings is all or nothing: the mail component either takes the recipients
exclusively from the headers or exclusively from the pre-configured settings. It is not possible to mix
and match headers and pre-configured settings.
721
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
headers.put("to", "[email protected]");
template.sendBodyAndHeaders("smtp://admin@[email protected]", "Hello
World", headers);
SUN JAVAMAIL
SUN JavaMail is used under the hood for consuming and producing mails. We encourage end-users to
consult these references when using either POP3 or IMAP protocol. Note particularly that POP3 has a
much more limited set of features than IMAP.
SAMPLES
We start with a simple route that sends the messages received from a JMS queue as emails. The email
account is the admin account on mymailserver.com.
from("jms://queue:subscription").to("smtp://[email protected]?password=secret");
In the next sample, we poll a mailbox for new emails once every minute. Notice that we use the special
consumer option for setting the poll interval, consumer.delay, as 60000 milliseconds = 60 seconds.
from("imap://[email protected]
password=secret&unseen=true&consumer.delay=60000")
.to("seda://mails");
722
CHAPTER 94. MAIL
from("direct:a").to("smtp://[email protected]?password=secret&[email protected]" +
recipients);
ATTACHMENTS ARE NOT SUPPORT BY ALL CAMEL COMPONENTS
The Attachments API is based on the Java Activation Framework and is generally
only used by the Mail API. Since many of the other Camel components do not
support attachments, the attachments could potentially be lost as they propagate
along the route. The rule of thumb, therefore, is to add attachments just before
sending a message to the mail endpoint.
The mail component supports attachments. In the sample below, we send a mail message containing a
plain text message with a logo file attachment.
// create the exchange with the mail message that is multipart with a file and a Hello World text/plain
message.
Exchange exchange = endpoint.createExchange();
Message in = exchange.getIn();
in.setBody("Hello World");
in.addAttachment("logo.jpeg", new DataHandler(new FileDataSource("src/test/data/logo.jpeg")));
// create a producer that can produce the exchange (= send the mail)
Producer producer = endpoint.createProducer();
// start the producer
producer.start();
// and let it go (processes the exchange by sending the email)
producer.process(exchange);
SSL SAMPLE
In this sample, we want to poll our Google mail inbox for mails. To download mail onto a local mail client,
Google mail requires you to enable and configure SSL. This is done by logging into your Google mail
account and changing your settings to allow IMAP access. Google have extensive documentation on
723
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
how to do this.
from("imaps://imap.gmail.com?
[email protected]&password=YOUR_PASSWORD"
+ "&delete=false&unseen=true&consumer.delay=60000").to("log:newmail");
The preceding route polls the Google mail inbox for new mails once every minute and logs the received
messages to the newmail logger category. Running the sample with DEBUG logging enabled, we can
monitor the progress in the logs:
from("imaps://imap.gmail.com?
[email protected]&password=YOUR_PASSWORD"
+ "&delete=false&unseen=true&consumer.delay=60000").process(new MyMailProcessor());
Instead of logging the mail we use a processor where we can process the mail from java code:
724
CHAPTER 94. MAIL
As you can see the API to handle attachments is a bit clunky but it's there so you can get the
javax.activation.DataHandler so you can handle the attachments using standard API.
The code is provided out of the box in Camel 2.10 onwards in the camel-mail component. The code is
in the class: org.apache.camel.component.mail.SplitAttachmentsExpression, which you can find the
source code here
In the Camel route you then need to use this Expression in the route as shown below:
from("pop3://[email protected]?password=secret&consumer.delay=1000")
.to("log:email")
// use the SplitAttachmentsExpression which will split the message per attachment
.split(new SplitAttachmentsExpression())
// each message going to this mock has a single attachment
.to("mock:split")
.end();
If you use XML DSL then you need to declare a method call expression in the Splitter, as shown below
<split>
<method beanType="org.apache.camel.component.mail.SplitAttachmentsExpression"/>
<to uri="mock:split"/>
</split>
You can configure a searchTerm on the MailEndpoint which allows you to filter out unwanted mails.
For example to filter mails to contain Camel in either Subject or Text you can do as follows:
<route>
<from uri="imaps://mymailseerver?
username=foo&password=secret&searchTerm.subjectOrBody=Camel"/>
<to uri="bean:myBean"/>
</route>
Notice we use the "searchTerm.subjectOrBody" as parameter key to indicate that we want to search
on mail subject or body, to contain the word "Camel". The class
org.apache.camel.component.mail.SimpleSearchTerm has a number of options you can configure:
Or to get the new unseen emails going 24 hours back in time you can do. Notice the "now-24h" syntax.
See the table below for more details.
725
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from uri="imaps://mymailseerver?
username=foo&password=secret&searchTerm.fromSentDate=now-24h"/>
<to uri="bean:myBean"/>
</route>
You can have multiple searchTerm in the endpoint uri configuration. They would then be combined
together using AND operator, eg so both conditions must match. For example to get the last unseen
emails going back 24 hours which has Camel in the mail subject you can do:
<route>
<from uri="imaps://mymailseerver?
username=foo&password=secret&searchTerm.subject=Camel&searchTerm.fromSentDate=now-
24h"/>
<to uri="bean:myBean"/>
</route>
726
CHAPTER 94. MAIL
The SimpleSearchTerm is designed to be easily configurable from a POJO, so you can also configure
it using a <bean> style in XML
You can then refer to this bean, using #beanId in your Camel route as shown:
<route>
<from uri="imaps://mymailseerver?
username=foo&password=secret&searchTerm=#mySearchTerm"/>
<to uri="bean:myBean"/>
</route>
727
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
728
CHAPTER 95. MASTER COMPONENT
Abstract
The Master component provides a way to ensure that only a single consumer in a cluster consumes
from a given endpoint; with automatic failover if that JVM dies. This feature can be useful if you need to
consume from a legacy back-end that doesn't support concurrent consumption or, due to commercial
or stability reasons, you can have only a single connection to the back-end at any point in time.
DEPENDENCIES
The Master component can only be used in the context of a fabric-enabled Red Hat JBoss Fuse
container. You must ensure that the fabric-camel feature is installed.
In the context of Fabric, you install a feature by adding it to the relevant profile. For example, if you are
using a profile called my-master-profile, you would add the fabric-camel feature by entering the
following console command:
URI FORMAT
A Master endpoint can only be used as a consumer endpoint. It has the following URI format:
master:ClusterID:EndpointURI[?Options]
Where the URI, EndpointURI, is published in the fabric registry and associated with the ClusterId
cluster.
URI OPTIONS
The Master component itself does not support any URI options. Any options on the URI are, therefore,
applied to the specified consumer endpoint, EndpointURI.
For example, to set up a cluster of Master endpoints that can consume from the seda:bar endpoint,
you would proceed as follows:
1. Define the Master endpoints with the following URI (where each endpoint in the cluster uses
exactly the same URI):
master:mysedalock:seda:bar
Each of the Master endpoints in the cluster tries to get the mysedalock lock (implemented as
729
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
a key in the Zookeeper registry). The Master endpoint that succeeds in getting the lock
becomes active (the master) and starts consuming messages from the seda:bar endpoint. The
other Master endpoints enter a waiting state and continue to try the lock (the slaves).
2. You must remember to include the fabric-camel feature in the profile that deploys a Master
endpoint.
3. In Blueprint XML, you can define a Master endpoint at the start of a Camel route, as follows:
1. If you do not already have a fabric, enter the following console command to create one:
The --new-user and --new-user-password options specify the credentials for a new
administrator user. The Zookeeper password is used to protect sensitive data in the Fabric
registry service (all of the nodes under /fabric).
730
CHAPTER 95. MASTER COMPONENT
NOTE
If you use a VPN (virtual private network) on your local machine, it is advisable
to log off VPN before you create the fabric and to stay logged off while you are
using the local container. A local Fabric Server is permanently associated with a
fixed IP address or hostname. If VPN is enabled when you create the fabric, the
underlying Java runtime is liable to detect and use the VPN hostname instead of
your permanent local hostname. This can also be an issue with multi-homed
machines. To be absolutely sure about the hostname, you could specify the IP
address explicitly—see chapter "Creating a New Fabric" in "Fabric Guide" .
2. For this example, you must have access to a running instance of an Apache ActiveMQ broker
and you must know the TCP port of the broker's OpenWire connector. For example, you might
get access to an ActiveMQ broker in one of the following ways:
You just created the fabric on a clean installation of JBoss Fuse (after a cold restart). In
this case, the root container ought to include the jboss-fuse-full profile by default. You
can check whether this is the case by entering the fabric:container-list console
command, as follows:
JBossFuse:karaf@root> fabric:container-list
[id] [version] [connected] [profiles] [provision status]
root* 1.0 true fabric, fabric-ensemble-0000-1, jboss-fuse-full success
By default, the jboss-fuse-full profile instantiates an ActiveMQ broker that listens on port
61616. You can use this broker for the current example.
If no broker is running in the root container (or any other container), you can quickly
install a broker into a new fabric child container, broker1, by entering the following fabric
command at the console prompt:
In this case, you can use the browser-based Fuse Management Console to discover the TCP
port of the OpenWire connector on the broker.
3. Create the master-example profile, which will be used to deploy a simple Apache Camel route
that uses the Master component. Enter the following console command to create the profile:
4. Add the requisite Karaf features to the master-example profile. Enter the following console
commands:
5. Define the simple Camel route as a resource in the master-example profile. Invoke the built-in
text editor to create a new camel.xml resource, as follows:
Copy and paste the following content into the built-in text editor:
731
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL" value="tcp://localhost:OpenWirePort"/>
<property name="userName" value="UserName"/>
<property name="password" value="Password"/>
</bean>
</blueprint>
Remember to customize the route configuration by replacing OpenWirePort with the port
number of the OpenWire connector on the broker, and by replacing UserName and Password by
any valid JAAS credentials on the container (for example, you could substitute the AdminUser
and AdminPass credentials created in Step 1 of these instructions).
To save and exit from the text editor, type Ctrl-S, Ctrl-X.
6. Configure the master-example profile to deploy the camel.xml resource as an OSGi bundle.
Enter the following console command to create a new entry in the master-example agent
properties:
NOTE
The blueprint: prefix tells Fabric to deploy the specified resource as a Blueprint
XML file, and the profile: prefix tells Fabric where to find the resource (that is, in
the current version of the current profile).
7. Create two new child containers, so that you can deploy the master-example profile as a
cluster (one master and one slave). Enter the following console command:
8. Now deploy both the master-example profile and the mq-client profile to each of the child
containers, as follows:
9. If you now send some messages to the FABRIC.DEMO queue on the broker, the messages are
consumed by one (and only one) of the deployed master endpoints. For example, you can
easily create and send messages to the broker using the browser-based Fuse Management
console.
732
CHAPTER 95. MASTER COMPONENT
10. If you stop the container that hosts the current master (initially, the child1 container), the
slave will be promoted to be the new master (in the child2 container) and will start consuming
messages from the FABRIC.DEMO queue. For example, assuming that child2 contains the
current master, you can stop it by entering the following console command:
fabric:container-stop child2
io.fabric8.zookeeper
For example, assuming that you use Maven to build your application, Example 95.1, “Maven Bundle
Plug-In Configuration” shows how you can configure the Maven bundle plug-in to import the required
packages.
733
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
METRICS COMPONENT
Available as of Camel 2.14
The metrics: component allows to collect various metrics directly from Camel routes. Supported
metric types are counter, histogram, meter and timer. Metrics provides simple way to measure
behaviour of application. Configurable reporting backend is enabling different integration options for
collecting and visualizing statistics. The component also provides a MetricsRoutePolicyFactory which
allows to expose route statistics using codehale metrics, see bottom of page for details.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-metrics</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
METRIC REGISTRY
Camel Metrics Component uses by default MetricRegistry with Slf4jReporter and 60 second reporting
interval. Default registry can be replaced with custom one by providing bean with name
metricRegistry in Camel registry. For example using Spring Java Configuration.
@Configuration
public static class MyConfig extends SingleRouteCamelConfiguration {
@Bean
@Override
public RouteBuilder route() {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
// define Camel routes here
}
};
}
@Bean(name = MetricsComponent.METRIC_REGISTRY_NAME)
public MetricRegistry getMetricRegistry() {
MetricRegistry registry = ...;
return registry;
}
}
734
CHAPTER 96. METRICS
WARNING
USAGE
Each metric has type and name. Supported types are counter, histogram, meter and timer. Metric
name is simple string. If metric type is not provided then type meter is used by default.
HEADERS
Metric name defined in URI can be overridden by using header with name CamelMetricsName.
For example
from("direct:in")
.setHeader(MetricsConstants.HEADER_METRIC_NAME, constant("new.name"))
.to("metrics:counter:name.not.used")
.to("direct:out");
All Metrics specific headers are removed from the message once Metrics endpoint finishes processing
of exchange. While processing exchange Metrics endpoint will catch all exceptions and write log entry
using level warn.
metrics:counter:metricname[?options]
OPTIONS
If neither increment or decrement is defined then counter value will be incremented by one. If
increment and decrement are both defined only increment operation is called.
735
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.to("metric:counter:simple.counter?increment=7")
.to("direct:out");
HEADERS
Message headers can be used to override increment and decrement values specified in Metrics
component URI.
metrics:histogram:metricname[?options]
OPTIONS
736
CHAPTER 96. METRICS
HEADERS
Message header can be used to override value specified in Metrics component URI.
metrics:meter:metricname[?options]
OPTIONS
737
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
HEADERS
Message header can be used to override mark value specified in Metrics component URI.
metrics:timer:metricname[?options]
OPTIONS
If no action or invalid value is provided then warning is logged without any timer update. If action start
is called on already running timer or stop is called on not running timer then nothing is updated and
warning is logged.
TimerContext objects are stored as Exchange properties between different Metrics component calls.
HEADERS
Message header can be used to override action value specified in Metrics component URI.
738
CHAPTER 96. METRICS
from("direct:in")
.setHeader(MetricsConstants.HEADER_TIMER_ACTION, TimerAction.start)
.to("metric:timer:simple.timer")
.to("direct:out");
METRICSROUTEPOLICYFACTORY
This factory allows to add a RoutePolicy for each route which exposes route utilization statistics using
codehale metrics. This factory can be used in Java and XML as the examples below demonstrates.
TIP
Instead of using the MetricsRoutePolicyFactory you can define a MetricsRoutePolicy per route you
want to instrument, in case you only want to instrument a few selected routes.
From Java you just add the factory to the CamelContext as shown below:
context.addRoutePolicyFactory(new MetricsRoutePolicyFactory());
<!-- use camel-metrics route policy to gather metrics for all routes -->
<bean id="metricsRoutePolicyFactory"
class="org.apache.camel.component.metrics.routepolicy.MetricsRoutePolicyFactory"/>
739
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
From Java code tou can get hold of the com.codahale.metrics.MetricRegistry from the
org.apache.camel.component.metrics.routepolicy.MetricsRegistryService as shown below:
740
CHAPTER 97. MINA2 - DEPRECATED
MINA 2 COMPONENT
DEPRECATED
NOTE
The mina2: component is a transport for working with Apache MINA 2.x
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mina2</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
mina2:tcp://hostname[:port][?options]
mina2:udp://hostname[:port][?options]
mina2:vm://hostname[:port][?options]
You can specify a codec in the Registry using the codec option. If you are using TCP and no codec is
specified then the textline flag is used to determine if text line based codec or object serialization
should be used instead. By default the object serialization is used.
For UDP if no codec is specified the default uses a basic ByteBuffer based codec.
741
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
A Mina producer has a default timeout value of 30 seconds, while it waits for a response from the
remote server.
In normal use, camel-mina only supports marshalling the body content—essage headers and exchange
properties are not sent. However, the option, transferExchange, does allow you to transfer the
exchange itself over the wire. See options below.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
742
CHAPTER 97. MINA2 - DEPRECATED
743
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
744
CHAPTER 97. MINA2 - DEPRECATED
As the sample is part of a unit test, we test it by sending some data to it on port 6200.
assertMockEndpointsSatisfied();
Then we test the sample by sending some data and retrieving the response using the
template.requestBody() method. As we know the response is a String, we cast it to String and can
assert that the response is, in fact, something we have dynamically set in our processor code logic.
745
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from uri="mina2:tcp://localhost:5555?textline=true"/>
<to uri="bean:myTCPOrderHandler"/>
</route>
In the route above, we expose a TCP server on port 5555 using the textline codec. We let the Spring
bean with ID, myTCPOrderHandler, handle the request and return a reply. For instance, the handler
bean could be implemented as follows:
For instance, the example below will close the session after it has written the bye message back to the
client:
from("mina2:tcp://localhost:8080?sync=true&textline=true").process(new Processor() {
public void process(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
exchange.getOut().setBody("Bye " + body);
exchange.getOut().setHeader(Mina2Constants.MINA_CLOSE_SESSION_WHEN_COMPLETE,
true);
}
});
746
CHAPTER 97. MINA2 - DEPRECATED
customized filters. Please note that codec and logger are also implemented as Mina filters of type,
IoFilter. Any filters you may define are appended to the end of the filter chain; that is, after codec and
logger.
See also:
Netty
747
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MOCK COMPONENT
The Mock component provides a powerful declarative testing mechanism, which is similar to jMock in
that it allows declarative expectations to be created on any Mock endpoint before a test begins. Then
the test is run, which typically fires messages to one or more endpoints, and finally the expectations
can be asserted in a test case to ensure the system worked as expected.
Messages arrive on an endpoint in order, using some Expression to create an order testing
function,
Messages arrive match some kind of Predicate such as that specific headers have certain
values, or that parts of the messages match some predicate, such as by evaluating an XPath or
XQuery Expression.
Note that there is also the Test endpoint which is a Mock endpoint, but which uses a second endpoint to
provide the list of expected message bodies and automatically sets up the Mock endpoint assertions. In
other words, it's a Mock endpoint that automatically sets up its assertions from some sample messages
in a File or database, for example.
MOCK ENDPOINTS KEEP RECEIVED EXCHANGES IN MEMORY
INDEFINITELY
Remember that Mock is designed for testing. When you add Mock endpoints to a
route, each Exchange sent to the endpoint will be stored (to allow for later
validation) in memory until explicitly reset or the JVM is restarted. If you are
sending high volume and/or large messages, this may cause excessive memory
use. If your goal is to test deployable routes inline, consider using NotifyBuilder or
AdviceWith in your tests instead of adding Mock endpoints to routes directly.
From Camel 2.10 onwards there are two new options retainFirst, and retainLast
that can be used to limit the number of messages the Mock endpoints keep in
memory.
URI FORMAT
mock:someName[?options]
Where someName can be any string that uniquely identifies the endpoint.
You can append query options to the URI in the following format, ?option=value&option=value&...
748
CHAPTER 98. MOCK
OPTIONS
SIMPLE EXAMPLE
Here's a simple example of Mock endpoint in use. First, the endpoint is resolved on the context. Then
we set an expectation, and then, after the test has run, we assert that our expectations have been met.
resultEndpoint.expectedMessageCount(2);
You typically always call the assertIsSatisfied() method to test that the expectations were met after
running a test.
Apache Camel will by default wait 10 seconds when the assertIsSatisfied() is invoked. This can be
configured by setting the setResultWaitTime(millis) method.
USING ASSERTPERIOD
Available as of Camel 2.7 When the assertion is satisfied then Camel will stop waiting and continue
from the assertIsSatisfied method. That means if a new message arrives on the mock endpoint, just a
bit later, that arrival will not affect the outcome of the assertion. Suppose you do want to test that no
new messages arrives after a period thereafter, then you can do that by setting the setAssertPeriod
method, for example:
749
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SETTING EXPECTATIONS
You can see from the javadoc of MockEndpoint the various helper methods you can use to set
expectations. The main methods are as follows:
Method Description
resultEndpoint.expectedBodiesReceived("firstMessageBody", "secondMessageBody",
"thirdMessageBody");
For example, to add expectations of the headers or body of the first message (using zero-based
indexing like java.util.List), you can use the following code:
resultEndpoint.message(0).header("foo").isEqualTo("bar");
There are some examples of the Mock endpoint in use in the camel-core processor tests .
750
CHAPTER 98. MOCK
Camel now allows you to automatic mock existing endpoints in your Camel routes.
HOW IT WORKS
Important: The endpoints are still in action, what happens is that a Mock endpoint is
injected and receives the message first, it then delegate the message to the target
endpoint. You can view this as a kind of intercept and delegate or endpoint listener.
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").to("direct:foo").to("log:foo").to("mock:result");
from("direct:foo").transform(constant("Bye World"));
}
};
}
You can then use the adviceWith feature in Camel to mock all the endpoints in a given route from your
unit test, as shown below:
getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:direct:foo").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World");
getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
assertMockEndpointsSatisfied();
751
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
assertNotNull(context.hasEndpoint("mock:direct:start"));
assertNotNull(context.hasEndpoint("mock:direct:foo"));
assertNotNull(context.hasEndpoint("mock:log:foo"));
}
Notice that the mock endpoints is given the uri mock:<endpoint>, for example mock:direct:foo.
Camel logs at INFO level the endpoints being mocked:
Endpoints which are mocked will have their parameters stripped off. For example the
endpoint "log:foo?showAll=true" will be mocked to the following endpoint
"mock:log:foo". Notice the parameters has been removed.
Its also possible to only mock certain endpoints using a pattern. For example to mock all log endpoints
you do as shown:
getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
assertMockEndpointsSatisfied();
The pattern supported can be a wildcard or a regular expression. See more details about this at
Intercept as its the same matching function used by Camel.
752
CHAPTER 98. MOCK
IMPORTANT
Mind that mocking endpoints causes the messages to be copied when they arrive on the
mock. That means Camel will use more memory. This may not be suitable when you send
in a lot of messages.
@Override
public String isMockEndpoints() {
// override this method and return the pattern for which endpoints to mock.
// use * to indicate all
return "*";
}
@Test
public void testMockAllEndpoints() throws Exception {
// notice we have automatic mocked all endpoints and the name of the endpoints is "mock:uri"
getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:direct:foo").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World");
getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
assertMockEndpointsSatisfied();
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").to("direct:foo").to("log:foo").to("mock:result");
from("direct:foo").transform(constant("Bye World"));
}
753
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
};
}
}
<route>
<from uri="direct:start"/>
<to uri="direct:foo"/>
<to uri="log:foo"/>
<to uri="mock:result"/>
</route>
<route>
<from uri="direct:foo"/>
<transform>
<constant>Bye World</constant>
</transform>
</route>
</camelContext>
Then we create a new XML file as follows, where we include the camel-route.xml file and define a
spring bean with the class org.apache.camel.impl.InterceptSendToMockEndpointStrategy which
tells Camel to mock all endpoints:
Then in your unit test you load the new XML file (test-camel-route.xml) instead of camel-route.xml.
To only mock all log endpoints you can define the pattern in the constructor for the bean:
<bean id="mockAllEndpoints"
class="org.apache.camel.impl.InterceptSendToMockEndpointStrategy">
<constructor-arg index="0" value="log*"/>
</bean>
754
CHAPTER 98. MOCK
Sometimes you want to easily mock and skip sending to a certain endpoints. So the message is
detoured and send to the mock endpoint only. From Camel 2.10 onwards you can now use the
mockEndpointsAndSkip method using AdviceWith or the Test Kit. The example below will skip
sending to the two endpoints "direct:foo", and "direct:bar".
getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:direct:foo").expectedMessageCount(1);
getMockEndpoint("mock:direct:bar").expectedMessageCount(1);
assertMockEndpointsSatisfied();
// the message was not send to the direct:foo route and thus not sent to the seda endpoint
SedaEndpoint seda = context.getEndpoint("seda:foo", SedaEndpoint.class);
assertEquals(0, seda.getCurrentQueueSize());
}
@Override
public String isMockEndpointsAndSkip() {
// override this method and return the pattern for which endpoints to mock,
// and skip sending to the original endpoint.
return "direct:foo";
}
@Test
public void testMockEndpointAndSkip() throws Exception {
// notice we have automatic mocked the direct:foo endpoints and the name of the endpoints is
"mock:uri"
getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
getMockEndpoint("mock:direct:foo").expectedMessageCount(1);
assertMockEndpointsSatisfied();
// the message was not send to the direct:foo route and thus not sent to the seda endpoint
SedaEndpoint seda = context.getEndpoint("seda:foo", SedaEndpoint.class);
assertEquals(0, seda.getCurrentQueueSize());
755
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").to("direct:foo").to("mock:result");
from("direct:foo").transform(constant("Bye World")).to("seda:foo");
}
};
}
}
The Mock endpoints will by default keep a copy of every Exchange that it received. So if you test with a
lot of messages, then it will consume memory. From Camel 2.10 onwards we have introduced two
options retainFirst and retainLast that can be used to specify to only keep N'th of the first and/or last
Exchanges.
For example in the code below, we only want to retain a copy of the first 5 and last 5 Exchanges the
mock receives.
...
mock.assertIsSatisfied();
Using this has some limitations. The getExchanges() and getReceivedExchanges() methods on the
MockEndpoint will return only the retained copies of the Exchanges. So in the example above, the list
will contain 10 Exchanges; the first five, and the last five. The retainFirst and retainLast options also
have limitations on which expectation methods you can use. For example the expectedXXX methods
that work on message bodies, headers, etc. will only operate on the retained messages. In the example
above they can test only the expectations on the 10 retained messages.
The Mock endpoint stores the arrival time of the message as a property on the Exchange.
You can use this information to know when the message arrived on the mock. But it also provides
foundation to know the time interval between the previous and next message arrived on the mock. You
can use this to set expectations using the arrives DSL on the Mock endpoint.
756
CHAPTER 98. MOCK
For example to say that the first message should arrive between 0-2 seconds before the next you can
do:
mock.message(0).arrives().noLaterThan(2).seconds().beforeNext();
You can also define this as that 2nd message (0 index based) should arrive no later than 0-2 seconds
after the previous:
mock.message(1).arrives().noLaterThan(2).seconds().afterPrevious();
You can also use between to set a lower bound. For example suppose that it should be between 1-4
seconds:
mock.message(1).arrives().between(1, 4).seconds().afterPrevious();
You can also set the expectation on all messages, for example to say that the gap between them
should be at most 1 second:
mock.allMessages().arrives().noLaterThan(1).seconds().beforeNext();
TIME UNITS
In the example above we use seconds as the time unit, but Camel offers milliseconds, and minutes
as well.
757
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Basically, NoSQL solutions differ from traditional RDBMS (Relational Database Management Systems)
in that they don't use SQL as their query language and generally don't offer ACID-like transactional
behaviour nor relational data. Instead, they are designed around the concept of flexible data structures
and schemas (meaning that the traditional concept of a database table with a fixed schema is dropped),
extreme scalability on commodity hardware and blazing-fast processing.
MongoDB is a very popular NoSQL solution and the camel-mongodb component integrates Camel with
MongoDB allowing you to interact with MongoDB collections both as a producer (performing
operations on the collection) and as a consumer (consuming documents from a MongoDB collection).
MongoDB revolves around the concepts of documents (not as is office documents, but rather
hierarchical data defined in JSON/BSON) and collections. This component page will assume you are
familiar with them. Otherwise, visit http://www.mongodb.org/.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mongodb</artifactId>
<version>x.y.z</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
mongodb:connectionBean?
database=databaseName&collection=collectionName&operation=operationName[&moreOptions...]
ENDPOINT OPTIONS
MongoDB endpoints support the following options, depending on whether they are acting like a
Producer or as a Consumer (options vary based on the consumer type too).
758
CHAPTER 99. MONGODB
759
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Query
operation
s:
findById
,
findOne
ByQuer
y,
findAll,
count
Write
operation
s: insert,
save,
update
Delete
operation
s:
remove
Other
operation
s:
getDbSt
ats,
getColSt
ats,
comman
d
760
CHAPTER 99. MONGODB
761
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
762
CHAPTER 99. MONGODB
763
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
764
CHAPTER 99. MONGODB
SAMPLE ROUTE
The following route defined in Spring XML executes the operation dbStats on a collection.
<route>
<from uri="direct:start" />
<!-- using bean 'mongoBean' defined above -->
<to uri="mongodb:mongoBean?
database=${mongodb.database}&collection=${mongodb.collection}&operation=getDbStats"
/>
<to uri="direct:result" />
</route>
QUERY OPERATIONS
765
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
FINDBYID
This operation retrieves only one element from the collection whose _id field matches the content of
the IN message body. The incoming object can be anything that has an equivalent to a BSON type. See
http://bsonspec.org/#/specification and http://www.mongodb.org/display/DOCS/Java+Types.
from("direct:findById")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
.to("mock:resultFindById");
This operation supports specifying a fields filter. See the section called “Specifying a fields filter” .
FINDONEBYQUERY
Use this operation to retrieve just one element from the collection that matches a MongoDB query.
The query object is extracted from the IN message body , i.e. it should be of type DBObject or
convertible to DBObject. It can be a JSON String or a Hashmap. See Type conversions for more info.
from("direct:findOneByQuery")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
from("direct:findOneByQuery")
.setBody().constant("{ \"name\": \"Raul Kripalani\" }")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
This operation supports specifying a fields filter. See the section called “Specifying a fields filter” .
FINDALL
The findAll operation returns all documents matching a query, or none at all, in which case all
documents contained in the collection are returned. The query object is extracted from the IN
message body, i.e. it should be of type DBObject or convertible to DBObject. It can be a JSON String
or a Hashmap. See Type conversions for more info.
from("direct:findAll")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
.to("mock:resultFindAll");
766
CHAPTER 99. MONGODB
from("direct:findAll")
.setBody().constant("{ \"name\": \"Raul Kripalani\" }")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
.to("mock:resultFindAll");
767
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Additionally, you can set a sortBy criteria by putting the relevant DBObject describing your sorting in
the CamelMongoDbSortBy header, quick constant: MongoDbConstants.SORT_BY.
The findAll operation will also return the following OUT headers to enable you to iterate through result
pages if you are using paging:
768
CHAPTER 99. MONGODB
This operation supports specifying a fields filter. See the section called “Specifying a fields filter” .
COUNT
Returns the total number of objects in a collection, returning a Long as the Out message body. The
following example will count the number of records in the dynamicCollectionName collection. Notice
how dynamicity is enabled, and as a result, the operation will not run against the notableScientists
collection, but against the dynamicCollectionName collection.
// from("direct:count").to("mongodb:myDb?
database=tickets&collection=flights&operation=count&dynamicity=true");
Long result = template.requestBodyAndHeader("direct:count", "irrelevantBody",
MongoDbConstants.COLLECTION, "dynamicCollectionName");
assertTrue("Result is not of type Long", result instanceof Long);
From Camel 2.14 onwards you can provide a com.mongodb.DBObject object in the message body as a
query, and operation will return the amount of documents matching this criteria.
Here is an example that uses MongoDB's BasicDBObjectBuilder to simplify the creation of DBObjects.
It retrieves all fields except _id and boringField:
// route: from("direct:findAll").to("mongodb:myDb?
database=flights&collection=tickets&operation=findAll")
DBObject fieldFilter = BasicDBObjectBuilder.start().add("_id", 0).add("boringField", 0).get();
Object result = template.requestBodyAndHeader("direct:findAll", (Object) null,
MongoDbConstants.FIELDS_FILTER, fieldFilter);
769
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CREATE/UPDATE OPERATIONS
INSERT
Inserts an new object into the MongoDB collection, taken from the IN message body. Type conversion
is attempted to turn it into DBObject or a List. Two modes are supported: single insert and multiple
insert. For multiple insert, the endpoint will expect a List, Array or Collections of objects of any type, as
long as they are - or can be converted to - DBObject. All objects are inserted at once. The endpoint will
intelligently decide which backend operation to invoke (single or multiple insert) depending on the
input.
Example:
from("direct:insert")
.to("mongodb:myDb?database=flights&collection=tickets&operation=insert");
The operation will return a WriteResult, and depending on the WriteConcern or the value of the
invokeGetLastError option, getLastError() would have been called already or not. If you want to
access the ultimate result of the write operation, you need to retrieve the CommandResult by calling
getLastError() or getCachedLastError() on the WriteResult. Then you can verify the result by calling
CommandResult.ok(), CommandResult.getErrorMessage() and/or
CommandResult.getException().
Note that the new object's _id must be unique in the collection. If you don't specify the value,
MongoDB will automatically generate one for you. But if you do specify it and it is not unique, the insert
operation will fail (and for Camel to notice, you will need to enable invokeGetLastError or set a
WriteConcern that waits for the write result).
This is not a limitation of the component, but it is how things work in MongoDB for higher throughput. If
you are using a custom _id, you are expected to ensure at the application level that is unique (and this
is a good practice too).
Since Camel 2.15: OID(s) of the inserted record(s) is stored in the message header under
CamelMongoOid key ( MongoDbConstants.OID constant). The value stored is
org.bson.types.ObjectId for single insert or java.util.List<org.bson.types.ObjectId> if multiple
records have been inserted.
SAVE
The save operation is equivalent to an upsert (UPdate, inSERT) operation, where the record will be
updated, and if it doesn't exist, it will be inserted, all in one atomic operation. MongoDB will perform the
matching based on the _id field.
Beware that in case of an update, the object is replaced entirely and the usage of MongoDB's
$modifiers is not permitted. Therefore, if you want to manipulate the object if it already exists, you
have two options:
1. perform a query to retrieve the entire object first along with all its fields (may not be efficient),
alter it inside Camel and then save it.
2. use the update operation with $modifiers, which will execute the update at the server-side
instead. You can enable the upsert flag, in which case if an insert is required, MongoDB will
apply the $modifiers to the filter query object and insert the result.
770
CHAPTER 99. MONGODB
For example:
from("direct:insert")
.to("mongodb:myDb?database=flights&collection=tickets&operation=save");
UPDATE
Update one or multiple records on the collection. Requires a List<DBObject> as the IN message body
containing exactly 2 elements:
Element 1 (index 0) => filter query => determines what objects will be affected, same as a
typical query object
Element 2 (index 1) => update rules => how matched objects will be updated. All modifier
operations from MongoDB are supported.
MULTIUPDATES
By default, MongoDB will only update 1 object even if multiple objects match the filter
query. To instruct MongoDB to update all matching records, set the
CamelMongoDbMultiUpdate IN message header to true.
For example, the following will update all records whose filterField field equals true by setting the
value of the "scientist" field to "Darwin":
// route: from("direct:update").to("mongodb:myDb?
database=science&collection=notableScientists&operation=update");
DBObject filterField = new BasicDBObject("filterField", true);
DBObject updateObj = new BasicDBObject("$set", new BasicDBObject("scientist", "Darwin"));
Object result = template.requestBodyAndHeader("direct:update", new Object[] {filterField, updateObj},
MongoDbConstants.MULTIUPDATE, true);
771
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
DELETE OPERATIONS
REMOVE
Remove matching records from the collection. The IN message body will act as the removal filter
query, and is expected to be of type DBObject or a type convertible to it. The following example will
remove all objects whose field 'conditionField' equals true, in the science database, notableScientists
collection:
// route: from("direct:remove").to("mongodb:myDb?
database=science&collection=notableScientists&operation=remove");
DBObject conditionField = new BasicDBObject("conditionField", true);
Object result = template.requestBody("direct:remove", conditionField);
OTHER OPERATIONS
AGGREGATE
Camel 2.14: Perform a aggregation with the given pipeline contained in the body. Aggregations could
be long and heavy operations. Use with care.
// route: from("direct:aggregate").to("mongodb:myDb?
database=science&collection=notableScientists&operation=aggregate");
from("direct:aggregate")
.setBody().constant("[{ $match : {$or : [{\"scientist\" : \"Darwin\"},{\"scientist\" : \"Einstein\"}]}},{
$group: { _id: \"$scientist\", count: { $sum: 1 }} } ]")
.to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate")
.to("mock:resultAggregate");
GETDBSTATS
Equivalent of running the db.stats() command in the MongoDB shell, which displays useful statistic
figures about the database. For example:
> db.stats();
{
"db" : "test",
"collections" : 7,
"objects" : 719,
"avgObjSize" : 59.73296244784423,
"dataSize" : 42948,
"storageSize" : 1000058880,
"numExtents" : 9,
"indexes" : 4,
"indexSize" : 32704,
"fileSize" : 1275068416,
772
CHAPTER 99. MONGODB
"nsSizeMB" : 16,
"ok" : 1
}
Usage example:
// from("direct:getDbStats").to("mongodb:myDb?
database=flights&collection=tickets&operation=getDbStats");
Object result = template.requestBody("direct:getDbStats", "irrelevantBody");
assertTrue("Result is not of type DBObject", result instanceof DBObject);
The operation will return a data structure similar to the one displayed in the shell, in the form of a
DBObject in the OUT message body.
GETCOLSTATS
Equivalent of running the db.collection.stats() command in the MongoDB shell, which displays useful
statistic figures about the collection. For example:
> db.camelTest.stats();
{
"ns" : "test.camelTest",
"count" : 100,
"size" : 5792,
"avgObjSize" : 57.92,
"storageSize" : 20480,
"numExtents" : 2,
"nindexes" : 1,
"lastExtentSize" : 16384,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
Usage example:
// from("direct:getColStats").to("mongodb:myDb?
database=flights&collection=tickets&operation=getColStats");
Object result = template.requestBody("direct:getColStats", "irrelevantBody");
assertTrue("Result is not of type DBObject", result instanceof DBObject);
The operation will return a data structure similar to the one displayed in the shell, in the form of a
DBObject in the OUT message body.
COMMAND
Camel 2.15: Run the body as a command on database. Useful for admin operation as getting host
informations, replication or sharding status. Collection parameter is not use for this operation.
773
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
// route: from("command").to("mongodb:myDb?database=science&operation=command");
DBObject commandBody = new BasicDBObject("hostInfo", "1");
Object result = template.requestBody("direct:command", commandBody);
DYNAMIC OPERATIONS
An Exchange can override the endpoint's fixed operation by setting the CamelMongoDbOperation
header, defined by the MongoDbConstants.OPERATION_HEADER constant. The values supported
are determined by the MongoDbOperation enumeration and match the accepted values for the
operation parameter on the endpoint URI.
For example:
// from("direct:insert").to("mongodb:myDb?database=flights&collection=tickets&operation=insert");
Object result = template.requestBodyAndHeader("direct:insert", "irrelevantBody",
MongoDbConstants.OPERATION_HEADER, "count");
assertTrue("Result is not of type Long", result instanceof Long);
There is only one requisite to use tailable cursors: the collection must be a "capped collection",
meaning that it will only hold N objects, and when the limit is reached, MongoDB flushes old objects in
the same order they were originally inserted. For more information, please refer to:
http://www.mongodb.org/display/DOCS/Tailable+Cursors.
The Camel MongoDB component implements a tailable cursor consumer, making this feature available
for you to use in your Camel routes. As new objects are inserted, MongoDB will push them as
DBObjects in natural order to your tailable cursor consumer, who will transform them to an Exchange
and will trigger your route logic.
The Camel MongoDB tailable cursor consumer takes care of all these tasks for you. You will just need
to provide the key to some field in your data of increasing nature, which will act as a marker to position
your cursor every time it is regenerated, e.g. a timestamp, a sequential ID, etc. It can be of any datatype
supported by MongoDB. Date, Strings and Integers are found to work well. We call this mechanism "tail
tracking" in the context of this component.
The consumer will remember the last value of this field and whenever the cursor is to be regenerated,
it will run the query with a filter like: increasingField > lastValue, so that only unread data is
consumed.
774
CHAPTER 99. MONGODB
Setting the increasing field: Set the key of the increasing field on the endpoint URI
tailTrackingIncreasingField option. In Camel 2.10, it must be a top-level field in your data, as nested
navigation for this field is not yet supported. That is, the "timestamp" field is okay, but
"nested.timestamp" will not work. Please open a ticket in the Camel JIRA if you do require support for
nested increasing fields.
Cursor regeneration delay: One thing to note is that if new data is not already available upon
initialisation, MongoDB will kill the cursor instantly. Since we don't want to overwhelm the server in
this case, a cursorRegenerationDelay option has been introduced (with a default value of 1000ms.),
which you can modify to suit your needs.
An example:
from("mongodb:myDb?
database=flights&collection=cancellations&tailTrackIncreasingField=departureTime")
.id("tailableCursorConsumer1")
.autoStartup(false)
.to("mock:test");
The above route will consume from the "flights.cancellations" capped collection, using
"departureTime" as the increasing field, with a default regeneration cursor delay of 1000ms.
To overcome this situation, you can enable the persistent tail tracking feature to keep track of the
last consumed increasing value in a special collection inside your MongoDB database too. When the
consumer initialises again, it will restore the last tracked value and continue as if nothing happened.
The last read value is persisted on two occasions: every time the cursor is regenerated and when the
consumer shuts down. We may consider persisting at regular intervals too in the future (flush every 5
seconds) for added robustness if the demand is there. To request this feature, please open a ticket in
the Camel JIRA.
persistentId option to a unique identifier for this consumer, so that the same collection can be
reused across many consumers
Additionally, you can set the tailTrackDb, tailTrackCollection and tailTrackField options to customise
where the runtime information will be stored. Refer to the endpoint options table at the top of this
page for descriptions of each option.
For example, the following route will consume from the "flights.cancellations" capped collection, using
"departureTime" as the increasing field, with a default regeneration cursor delay of 1000ms, with
persistent tail tracking turned on, and persisting under the "cancellationsTracker" id on the
775
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
"flights.camelTailTracking", storing the last processed value under the "lastTrackingValue" field
(camelTailTracking and lastTrackingValue are defaults).
from("mongodb:myDb?
database=flights&collection=cancellations&tailTrackIncreasingField=departureTime&persistentTailTracki
ng=true" +
"&persistentId=cancellationsTracker")
.id("tailableCursorConsumer2")
.autoStartup(false)
.to("mock:test");
Below is another example identical to the one above, but where the persistent tail tracking runtime
information will be stored under the "trackers.camelTrackers" collection, in the
"lastProcessedDepartureTime" field:
from("mongodb:myDb?
database=flights&collection=cancellations&tailTrackIncreasingField=departureTime&persistentTailTracki
ng=true" +
"&persistentId=cancellationsTracker"&tailTrackDb=trackers&tailTrackCollection=camelTrackers" +
"&tailTrackField=lastProcessedDepartureTime")
.id("tailableCursorConsumer3")
.autoStartup(false)
.to("mock:test");
TYPE CONVERSIONS
The MongoDbBasicConverters type converter included with the camel-mongodb component
provides the following conversions:
776
CHAPTER 99. MONGODB
This type converter is auto-discovered, so you don't need to configure anything manually.
SEE ALSO
MongoDB website
777
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MQTT COMPONENT
Available as of Camel 2.10
The mqtt: component is used for communicating with MQTT compliant message brokers, like Apache
ActiveMQ or Mosquitto
Camel will poll the feed every 60 seconds by default. Note: The component currently only supports
polling (consuming) feeds.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mqtt</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
mqtt://name[?options]
OPTIONS
Property Default
host tcp://127.0.0.1:1883
localAddress
username
password
connectAttemptsMax -1
778
CHAPTER 100. MQTT
reconnectAttemptsMax -1
reconnectDelay 10
reconnectBackOffMultiplier 2.0
reconnectDelayMax 30000
qualityOfService AtLeastOnce
subscribeTopicName
subscribeTopicNames
publishTopicName camel/mqtt/test
byDefaultRetain false
mqttTopicPropertyName _MQTTTopicPropertyName+
mqttRetainPropertyName MQTTRetain
779
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
mqttQosPropertyName MQTTQos
connectWaitInSeconds 10
disconnectWaitInSeconds 5
sendWaitInSeconds 5
clientId
cleanSession true
You can append query options to the URI in the following format, ?option=value&option=value&...
SAMPLES
Sending messages:
from("direct:foo")
.to("mqtt:cheese?publishTopicName=test.mqtt.topic");
Consuming messages:
from("mqtt:bar?subscribeTopicName=test.mqtt.topic")
.transform(body().convertToString())
.to("mock:result")
780
CHAPTER 101. MSV
MSV COMPONENT
The MSV component performs XML validation of the message body using the MSV Library and any of
the supported XML schema languages, such as XML Schema or RelaxNG XML Syntax.
Note that the Jing component also supports RelaxNG Compact Syntax
URI FORMAT
msv:someLocalOrRemoteResource[?options]
Where someLocalOrRemoteResource is some URL to a local resource on the classpath or a full URL
to a remote resource or resource on the file system. For example
msv:org/foo/bar.rng
msv:file:../foo/bar.rng
msv:http://acme.com/cheese.rng
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
EXAMPLE
The following example shows how to configure a route from endpoint direct:start which then goes to
one of two endpoints, either mock:valid or mock:invalid based on whether or not the XML matches the
given RelaxNG XML Schema (which is supplied on the classpath).
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start"/>
<doTry>
<to uri="msv:org/apache/camel/component/validator/msv/schema.rng"/>
<to uri="mock:valid"/>
<doCatch>
<exception>org.apache.camel.ValidationException</exception>
<to uri="mock:invalid"/>
</doCatch>
<doFinally>
781
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<to uri="mock:finally"/>
</doFinally>
</doTry>
</route>
</camelContext>
782
CHAPTER 102. MUSTACHE
MUSTACHE
Available as of Camel 2.12
The mustache: component allows for processing a message using a Mustache template. This can be
ideal when using Templating to generate responses for requests.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mustache</artifactId>
<version>x.x.x</version> <!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
mustache:templateName[?options]
Where templateName is the classpath-local URI of the template to invoke; or the complete URL of the
remote template (eg: file://folder/myfile.mustache).
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
MUSTACHE CONTEXT
Camel will provide exchange information in the Mustache context (just a Map). The Exchange is
transferred as:
key value
783
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
DYNAMIC TEMPLATES
Camel provides two headers by which you can define a different resource location for a template or the
template content itself. If any of these headers is set then Camel uses this over the endpoint configured
resource. This allows you to provide a dynamic template at runtime.
SAMPLES
For example you could use something like:
from("activemq:My.Queue").
to("mustache:com/acme/MyResponse.mustache");
To use a Mustache template to formulate a response for a message for InOut message exchanges
(where there is a JMSReplyTo header).
If you want to use InOnly and consume the message and send it to another destination you could use:
from("activemq:My.Queue").
to("mustache:com/acme/MyResponse.mustache").
to("activemq:Another.Queue");
It's possible to specify what template the component should use dynamically via a header, so for
example:
784
CHAPTER 102. MUSTACHE
from("direct:in").
setHeader(MustacheConstants.MUSTACHE_RESOURCE_URI).constant("path/to/my/template.mustac
he").
to("mustache:dummy");
785
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MVEL COMPONENT
Available as of Camel 2.12
The mvel: component allows you to process a message using an MVEL template. This can be ideal
when using Templating to generate responses for requests.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mvel</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
mvel:templateName[?options]
Where templateName is the classpath-local URI of the template to invoke; or the complete URL of the
remote template (eg: file://folder/myfile.mvel).
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
MESSAGE HEADERS
The mvel component sets a couple headers on the message.
786
CHAPTER 103. MVEL COMPONENT
Header Description
MVEL CONTEXT
Camel will provide exchange information in the MVEL context (just a Map). The Exchange is
transfered as:
key value
in The In message.
HOT RELOADING
The mvel template resource is, by default, hot reloadable for both file and classpath resources
(expanded jar). If you set contentCache=true, Camel will only load the resource once, and thus hot
reloading is not possible. This scenario can be used in production, when the resource never changes.
DYNAMIC TEMPLATES
Camel provides two headers by which you can define a different resource location for a template or the
template content itself. If any of these headers is set then Camel uses this over the endpoint configured
resource. This allows you to provide a dynamic template at runtime.
787
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SAMPLES
For example you could use something like
from("activemq:My.Queue").
to("mvel:com/acme/MyResponse.mvel");
To use a MVEL template to formulate a response to a message for InOut message exchanges (where
there is a JMSReplyTo header).
To specify what template the component should use dynamically via a header, so for example:
from("direct:in").
setHeader("CamelMvelResourceUri").constant("path/to/my/template.mvel").
to("mvel:dummy");
To specify a template directly as a header the component should use dynamically via a header, so for
example:
from("direct:in").
setHeader("CamelMvelTemplate").constant("@{\"The result is \" + request.body * 3}\" }").
to("velocity:dummy");
788
CHAPTER 104. MYBATIS
MYBATIS
Available as of Camel 2.7
The mybatis: component allows you to query, poll, insert, update and delete data in a relational
database using MyBatis.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mybatis</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
mybatis:statementName[?options]
Where statementName is the statement name in the MyBatis XML mapping file which maps to the
query, insert, update or delete operation you wish to evaluate.
You can append query options to the URI in the following format, ?option=value&option=value&...
This component will by default load the MyBatis SqlMapConfig file from the root of the classpath with
the expected name of SqlMapConfig.xml. If the file is located in another location, you will need to
configure the configurationUri option on the MyBatisComponent component.
OPTIONS
789
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
790
CHAPTER 104. MYBATIS
MESSAGE HEADERS
Camel will populate the result message, either IN or OUT with a header with the statement used:
MESSAGE BODY
The response from MyBatis will only be set as the body if it's a SELECT statement. That means, for
example, for INSERT statements Camel will not replace the body. This allows you to continue routing
and keep the original body. The response from MyBatis is always stored in the header with the key
CamelMyBatisResult.
791
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SAMPLES
For example if you wish to consume beans from a JMS queue and insert them into a database you could
do the following:
from("activemq:queue:newAccount").
to("mybatis:insertAccount?statementType=Insert");
Notice we have to specify the statementType, as we need to instruct Camel which kind of operation to
invoke.
from("direct:start")
.to("mybatis:selectAccountById?statementType=SelectOne")
.to("mock:result");
In the code above we can invoke the MyBatis statement selectAccountById and the IN body should
contain the account id we want to retrieve, such as an Integer type.
We can do the same for some of the other operations, such as SelectList:
from("direct:start")
.to("mybatis:selectAllAccounts?statementType=SelectList")
.to("mock:result");
And the same for UPDATE, where we can send an Account object as the IN body to MyBatis:
from("direct:start")
.to("mybatis:updateAccount?statementType=Update")
.to("mock:result");
792
CHAPTER 104. MYBATIS
MyBatis allows you to insert multiple rows using its for-each batch driver. To use this, you need to use
the <foreach> in the mapper XML file. For example as shown below:
<!-- Batch Insert example, using the Account parameter class -->
<insert id="batchInsertAccount" parameterType="java.util.List">
insert into ACCOUNT (
ACC_ID,
ACC_FIRST_NAME,
ACC_LAST_NAME,
ACC_EMAIL
)
values (
<foreach item="Account" collection="list" open="" close="" separator="),(">
#{Account.id}, #{Account.firstName}, #{Account.lastName}, #{Account.emailAddress}
</foreach>
)
</insert>
Then you can insert multiple rows, by sending a Camel message to the mybatis endpoint which uses
the InsertList statement type, as shown below:
from("direct:start")
.to("mybatis:batchInsertAccount?statementType=InsertList")
.to("mock:result");
MyBatis allows you to update multiple rows using its for-each batch driver. To use this, you need to use
the <foreach> in the mapper XML file. For example as shown below:
Then you can update multiple rows, by sending a Camel message to the mybatis endpoint which uses
the UpdateList statement type, as shown below:
from("direct:start")
.to("mybatis:batchUpdateAccount?statementType=UpdateList")
.to("mock:result");
793
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MyBatis allows you to delete multiple rows using its for-each batch driver. To use this, you need to use
the <foreach> in the mapper XML file. For example as shown below:
Then you can delete multiple rows, by sending a Camel message to the mybatis endpoint which uses
the DeleteList statement type, as shown below:
from("direct:start")
.to("mybatis:batchDeleteAccount?statementType=DeleteList")
.to("mock:result");
from("mybatis:selectAllAccounts?delay=60000").to("activemq:queue:allAccounts");
Alternatively you can use another mechanism for triggering the scheduled polls, such as the Timer or
Quartz components.
In the sample below we poll the database, every 30 seconds using the Timer component and send the
data to the JMS queue:
from("timer://pollTheDatabase?
delay=30000").to("mybatis:selectAllAccounts").to("activemq:queue:allAccounts");
<!-- Select with no parameters using the result map for Account class. -->
<select id="selectAllAccounts" resultMap="AccountResult">
select * from ACCOUNT
794
CHAPTER 104. MYBATIS
</select>
USING ONCONSUME
This component supports executing statements after data have been consumed and processed by
Camel. This allows you to do post updates in the database. Notice all statements must be UPDATE
statements. Camel supports executing multiple statements whose names should be separated by
commas.
The route below illustrates we execute the consumeAccount statement data is processed. This allows
us to change the status of the row in the database to processed, so we avoid consuming it twice or
more.
from("mybatis:selectUnprocessedAccounts?
consumer.onConsume=consumeAccount").to("mock:results");
PARTICIPATING IN TRANSACTIONS
Setting up a transaction manager under camel-mybatis can be a little bit fiddly, as it involves
externalising the database configuration outside the standard MyBatis SqlMapConfig.xml file.
The first part requires the setup of a DataSource. This is typically a pool (either DBCP, or c3p0), which
needs to be wrapped in a Spring proxy. This proxy enables non-Spring use of the DataSource to
participate in Spring transactions (the MyBatis SqlSessionFactory does just this).
<bean id="dataSource"
class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<constructor-arg>
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="org.postgresql.Driver"/>
<property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/myDatabase"/>
<property name="user" value="myUser"/>
<property name="password" value="myPassword"/>
</bean>
</constructor-arg>
</bean>
This has the additional benefit of enabling the database configuration to be externalised using
property placeholders.
<bean id="txManager"
795
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
Finally, a transaction policy is defined over the top of the transaction manager, which can then be used
as usual:
<bean id="PROPAGATION_REQUIRED"
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="txManager"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>
796
CHAPTER 105. NAGIOS
NAGIOS
Available as of Apache Camel 2.3
URI FORMAT
nagios://host[:port][?Options]
Apache Camel provides two abilities with the Nagios component. You can send passive check
messages by sending a message to its endpoint. Apache Camel also provides a EventNotifer which
allows you to send notifications to Nagios.
OPTIONS
797
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
HEADERS
Name Description
from("direct:start").to("nagios:127.0.0.1:5667?password=secret").to("mock:result");
To send a CRITICAL message you can send the headers such as:
USING NAGIOSEVENTNOTIFER
The Nagios component also provides an EventNotifer which you can use to send events to Nagios. For
example we can enable this from Java as follows:
798
CHAPTER 105. NAGIOS
In Spring XML its just a matter of defining a Spring bean with the type EventNotifier and Apache Camel
will pick it up as documented here: Advanced configuration of CamelContext using Spring .
799
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
NETTY COMPONENT
Available as of Camel 2.3
The Netty component in Camel is a socket communication component, based on the Netty project.
Netty is a NIO client server framework which enables quick and easy development of network
applications such as protocol servers and clients. Netty greatly simplifies and streamlines network
programming such as TCP and UDP socket server.
TIP
There is a Netty4 component that is using the newer Netty 4 which is recommend to use as this
component is using the older Netty 3 library.
The Netty component has several options and allows fine-grained control of a number of TCP/UDP
communication parameters (buffer sizes, keepAlives, tcpNoDelay etc) and facilitates both In-Only and
In-Out communication on a Camel route.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The URI scheme for a netty component is as follows
netty:tcp://localhost:99999[?options]
netty:udp://remotehost:99999/[?options]
This component supports producer and consumer endpoints for both TCP and UDP.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
800
CHAPTER 106. NETTY
801
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
802
CHAPTER 106. NETTY
803
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
804
CHAPTER 106. NETTY
805
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
806
CHAPTER 106. NETTY
Codec Handlers and SSL Keystores can be enlisted in the Registry, such as in the Spring XML file. The
values that could be passed in, are the following:
Name Description
807
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
NETTY PRODUCER
In Producer mode, the component provides the ability to send payloads to a socket endpoint using
either TCP or UDP protocols (with optional SSL support).
The producer mode supports both one-way and request-response based operations.
NETTY CONSUMER
In Consumer mode, the component provides the ability to:
listen on a specified socket using either TCP or UDP protocols (with optional SSL support),
receive requests on the socket using text/xml, binary and serialized object based payloads
and
The consumer mode supports both one-way and request-response based operations.
HEADERS
808
CHAPTER 106. NETTY
The following headers are filled for the exchanges created by the Netty consumer:
809
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
...
<camel:sslContextParameters
id="sslContextParameters">
<camel:keyManagers
keyPassword="keyPassword">
<camel:keyStore
resource="/users/home/server/keystore.jks"
password="keystorePassword"/>
</camel:keyManagers>
</camel:sslContextParameters>...
...
<to uri="netty:tcp://localhost:5150?
sync=true&ssl=true&sslContextParameters=#sslContextParameters"/>
...
context.createRegistry(registry);
810
CHAPTER 106. NETTY
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty:tcp://localhost:5150?sync=true&ssl=true&passphrase=#password"
+ "&keyStoreFile=#ksf&trustStoreFile=#tsf";
String return_string =
"When You Go Home, Tell Them Of Us And Say,"
+ "For Your Tomorrow, We Gave Our Today.";
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});
You can get access to the javax.net.ssl.SSLSession if you eg need to get details about the client
certificate. When ssl=true then the Netty component will store the SSLSession as a header on the
Camel Message, as shown below:
TIP
The option sslClientCertHeaders can be set to true, which then enriches the Camel Message with
headers having details about the client certificate. For example the subject name is readily available in
the header CamelNettySSLClientCertSubjectName.
811
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
IMPORTANT
The lists of codecs need to be added to the Camel's registry so they can be resolved when the endpoint
is created.
ChannelHandlerFactory lengthDecoder =
ChannelHandlerFactories.newLengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4);
registry.bind("encoders", encoders);
registry.bind("decoders", decoders);
Spring's native collections support can be used to specify the codec lists in an application context
812
CHAPTER 106. NETTY
</beans>
The bean names can then be used in netty endpoint definitions either as a comma separated list or
contained in a List e.g.
from("direct:multiple-codec").to("netty:tcp://localhost:{{port}}?
encoders=#encoders&sync=false");
from("netty:tcp://localhost:{{port}}?decoders=#length-decoder,#string-
decoder&sync=false").to("mock:multiple-codec");
}
};
}
}
or via spring.
However you can also instruct Camel on a per message basis as follows. To instruct Camel to close the
channel, you should add a header with the key CamelNettyCloseChannelWhenComplete set to a
boolean true value. For instance, the example below will close the channel after it has written the bye
message back to the client:
from("netty:tcp://localhost:8080").process(new Processor() {
public void process(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
exchange.getOut().setBody("Bye " + body);
// some condition which determines if we should close
813
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
if (close) {
exchange.getOut().setHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE,
true);
}
}
});
Custom channel pipelines provide complete control to the user over the handler/interceptor chain by
inserting custom handler(s), encoder(s) & decoders without having to specify them in the Netty
Endpoint URL in a very simple way.
In order to add a custom pipeline, a custom channel pipeline factory must be created and registered
with the context via the context registry (JNDIRegistry,or the camel-spring
ApplicationContextRegistry etc).
A Producer linked channel pipeline factory must extend the abstract class
ClientPipelineFactory.
A Consumer linked channel pipeline factory must extend the abstract class
ServerPipelineFactory.
The classes should override the getPipeline() method in order to insert custom handler(s),
encoder(s) and decoder(s). Not overriding the getPipeline() method creates a pipeline with no
handlers, encoders or decoders wired to the pipeline.
The example below shows how ServerChannel Pipeline factory may be created
return channelPipeline;
}
}
814
CHAPTER 106. NETTY
The custom channel pipeline factory can then be added to the registry and instantiated/utilized on a
camel route in the following way
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});
Netty has two kind of thread pools: boss and worker. By default each Netty consumer and producer has
their private thread pools. If you want to reuse these thread pools among multiple consumers or
producers then the thread pools must be created and enlisted in the Registry.
For example using Spring XML we can create a shared worker thread pool using the
NettyWorkerPoolBuilder with 2 worker threads as shown below:
<!-- use the worker pool builder to create to help create the shared thread pool -->
<bean id="poolBuilder" class="org.apache.camel.component.netty.NettyWorkerPoolBuilder">
<property name="workerCount" value="2"/>
</bean>
TIP
Then in the Camel routes we can refer to this worker pools by configuring the workerPool option in
the URI as shown below:
815
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from uri="netty:tcp://localhost:5021?
textline=true&ync=true&orkerPool=#sharedPool&rderedThreadPoolExecutor=false"/>
<to uri="log:result"/>
...
</route>
And if we have another route we can refer to the shared worker pool:
<route>
<from uri="netty:tcp://localhost:5022?
textline=true&ync=true&orkerPool=#sharedPool&rderedThreadPoolExecutor=false"/>
<to uri="log:result"/>
...
</route>
SEE ALSO
Netty HTTP
Mina2
816
CHAPTER 107. NETTY4
NETTY4 COMPONENT
The Netty4 component in Camel is a socket communication component, based on the Netty project
version 4. Netty is a NIO client server framework which enables quick and easy development of
netwServerInitializerFactoryork applications such as protocol servers and clients. Netty4 greatly
simplifies and streamlines network programming such as TCP and UDP socket server.
The Netty component has several options and allows fine-grained control of a number of TCP/UDP
communication parameters (buffer sizes, keepAlives, tcpNoDelay etc) and facilitates both In-Only and
In-Out communication on a Camel route.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty4</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The URI scheme for a netty component is as follows
netty4:tcp://localhost:99999[?options]
netty4:udp://remotehost:99999/[?options]
This component supports producer and consumer endpoints for both TCP and UDP.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
817
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
818
CHAPTER 107. NETTY4
819
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
820
CHAPTER 107. NETTY4
821
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
822
CHAPTER 107. NETTY4
Name Description
passphrase password setting to use in order to encrypt/decrypt payloads sent using SSH
keyStoreFormat keystore format to be used for payload encryption. Defaults to "JKS" if not set
keyStoreResource Camel 2.11.1: Client side certificate keystore to be used for encryption. Is loaded
"classpath:", "file:", or "http:" to load the resource from different systems.
trustStoreResource Camel 2.11.1: Server side certificate keystore to be used for encryption. Is loaded
"classpath:", "file:", or "http:" to load the resource from different systems.
encoder A custom ChannelHandler class that can be used to perform special marshal
io.netty.channel.ChannelInboundHandlerAdapter.
encorders A list of encoders to be used. You can use a String which have values separated
Just remember to prefix the value with # so Camel knows it should lookup.
823
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
decoder A custom ChannelHandler class that can be used to perform special marshal
io.netty.channel.ChannelOutboundHandlerAdapter.
decoders A list of decoders to be used. You can use a String which have values separated
Just remember to prefix the value with # so Camel knows it should lookup.
NETTY PRODUCER
In Producer mode, the component provides the ability to send payloads to a socket endpoint using
either TCP or UDP protocols (with optional SSL support).
The producer mode supports both one-way and request-response based operations.
NETTY CONSUMER
In Consumer mode, the component provides the ability to:
listen on a specified socket using either TCP or UDP protocols (with optional SSL support),
receive requests on the socket using text/xml, binary and serialized object based payloads
and
The consumer mode supports both one-way and request-response based operations.
USAGE SAMPLES
824
CHAPTER 107. NETTY4
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
Poetry poetry = (Poetry) exchange.getIn().getBody();
poetry.setPoet("Dr. Sarojini Naidu");
exchange.getOut().setBody(poetry);
}
}
}
};
...
<camel:sslContextParameters
825
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
id="sslContextParameters">
<camel:keyManagers
keyPassword="keyPassword">
<camel:keyStore
resource="/users/home/server/keystore.jks"
password="keystorePassword"/>
</camel:keyManagers>
</camel:sslContextParameters>...
...
<to uri="netty4:tcp://localhost:5150?
sync=true&ssl=true&sslContextParameters=#sslContextParameters"/>
...
context.createRegistry(registry);
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty4:tcp://localhost:5150?sync=true&ssl=true&passphrase=#password"
+ "&keyStoreFile=#ksf&trustStoreFile=#tsf";
String return_string =
"When You Go Home, Tell Them Of Us And Say,"
+ "For Your Tomorrow, We Gave Our Today.";
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});
You can get access to the javax.net.ssl.SSLSession if you eg need to get details about the client
certificate. When ssl=true then the Netty4 component will store the SSLSession as a header on the
Camel Message as shown below:
826
CHAPTER 107. NETTY4
TIP
The option sslClientCertHeaders can be set to true which then enriches the Camel Message with
headers having details about the client certificate. For example the subject name is readily available in
the header CamelNettySSLClientCertSubjectName.
IMPORTANT
The lists of codecs need to be added to the Camel's registry so they can be resolved when the endpoint
is created.
ChannelHandlerFactory lengthDecoder =
ChannelHandlerFactories.newLengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4);
registry.bind("encoders", encoders);
registry.bind("decoders", decoders);
Spring's native collections support can be used to specify the codec lists in an application context
827
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The bean names can then be used in netty endpoint definitions either as a comma separated list or
contained in a List e.g.
from("direct:multiple-codec").to("netty4:tcp://localhost:{{port}}?encoders=#encoders&sync=false");
from("netty4:tcp://localhost:{{port}}?decoders=#length-decoder,#string-
decoder&sync=false").to("mock:multiple-codec");
or via spring.
828
CHAPTER 107. NETTY4
However you can also instruct Camel on a per message basis as follows. To instruct Camel to close the
channel, you should add a header with the key CamelNettyCloseChannelWhenComplete set to a
boolean true value. For instance, the example below will close the channel after it has written the bye
message back to the client:
from("netty4:tcp://localhost:8080").process(new Processor() {
public void process(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
exchange.getOut().setBody("Bye " + body);
// some condition which determines if we should close
if (close) {
exchange.getOut().setHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE,
true);
}
}
});
In order to add a custom pipeline, a custom channel pipeline factory must be created and registered
with the context via the context registry (JNDIRegistry,or the camel-spring
ApplicationContextRegistry etc).
A Producer linked channel pipeline factory must extend the abstract class
ClientInitializerFactory.
A Consumer linked channel pipeline factory must extend the abstract class
ServerInitializerFactory.
The classes should override the initChannel() method in order to insert custom handler(s),
encoder(s) and decoder(s). Not overriding the initChannel() method creates a pipeline with no
handlers, encoders or decoders wired to the pipeline.
829
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The custom server initializer factory can then be added to the registry and instantiated/utilized on a
camel route in the following way:
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});
Netty has two kind of thread pools: boss and worker. By default each Netty consumer and producer has
their private thread pools. If you want to reuse these thread pools among multiple consumers or
producers then the thread pools must be created and enlisted in the Registry.
For example using Spring XML we can create a shared worker thread pool using the
NettyWorkerPoolBuilder with 2 worker threads as shown below:
<!-- use the worker pool builder to create to help create the shared thread pool -->
<bean id="poolBuilder" class="org.apache.camel.component.netty.NettyWorkerPoolBuilder">
<property name="workerCount" value="2"/>
</bean>
830
CHAPTER 107. NETTY4
TIP
Then in the Camel routes we can refer to this worker pools by configuring the workerPool option in
the URI as shown below:
<route>
<from uri="netty4:tcp://localhost:5021?
textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/>
<to uri="log:result"/>
...
</route>
And if we have another route we can refer to the shared worker pool:
<route>
<from uri="netty4:tcp://localhost:5022?
textline=true&sync=true&workerPool=#sharedPool&usingExecutorService=false"/>
<to uri="log:result"/>
...
</route>
831
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The netty-http component is an extension to Netty component to facilitiate HTTP transport with
Netty.
STREAM
Netty is stream based, which means the input it receives is submitted to Camel as a
stream. That means you will only be able to read the content of the stream once. If you
find a situation where the message body appears to be empty or you need to access the
data multiple times (eg: doing multicasting, or redelivery error handling) you should use
Stream Caching or convert the message body to a String which is safe to be re-read
multiple times.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty-http</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The URI scheme for a netty component is as follows
netty-http:http://localhost:8080[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
832
CHAPTER 108. NETTY HTTP
You may be wondering how Camel recognizes URI query parameters and endpoint
options. For example you might create endpoint URI as follows - netty-
http:http//example.com?myParam=myValue&compression=true . In this example
myParam is the HTTP parameter, while compression is the Camel endpoint option. The
strategy used by Camel in such situations is to resolve available endpoint options and
remove them from the URI. It means that for the discussed example, the HTTP request
sent by Netty HTTP producer to the endpoint will look as follows - http//example.com?
myParam=myValue , because compression endpoint option will be resolved and
removed from the target URL.
Keep also in mind that you cannot specify endpoint options using dynamic headers (like
CamelHttpQuery). Endpoint options can be specified only at the endpoint URI definition
level (like to or from DSL elements).
HTTP OPTIONS
Important: This component inherits all the options from Netty. So make sure to look at
the Netty documentation as well. Notice that some options from Netty is not applicable
when using this Netty HTTP component, such as options related to UDP transport.
833
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
834
CHAPTER 108. NETTY HTTP
835
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
836
CHAPTER 108. NETTY HTTP
MESSAGE HEADERS
The following headers can be used on the producer to control the HTTP request.
837
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The following headers is provided as meta-data when a route starts from an Netty HTTP endpoint:
838
CHAPTER 108. NETTY HTTP
org.jboss.netty.handler.codec.http.HttpRequest request =
exchange.getIn(NettyHttpMessage.class).getHttpRequest();
EXAMPLES
In the route below we use Netty HTTP as a HTTP server, which returns back a hardcoded "Bye World"
message.
from("netty-http:http://0.0.0.0:8080/foo")
.transform().constant("Bye World");
And we can call this HTTP server using Camel also, with the ProducerTemplate as shown below:
839
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("netty-http:http://0.0.0.0:8123/foo").to("mock:foo");
In the route above Netty HTTP will only match if the uri is an exact match, so it will match if you enter
http://0.0.0.0:8123/foo but not match if you do http://0.0.0.0:8123/foo/bar.
from("netty-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");
from("netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
The options the routes must be identical configured is all the options defined in the
org.apache.camel.component.netty.NettyServerBootstrapConfiguration configuration class. If you
have configured another route with different options, Camel will throw an exception on startup,
indicating the options is not identical. To mitigate this ensure all options is identical.
Here is an example with two routes that share the same port.
from("netty-http:http://0.0.0.0:{{port}}/foo")
.to("mock:foo")
.transform().constant("Bye World");
from("netty-http:http://0.0.0.0:{{port}}/bar")
.to("mock:bar")
.transform().constant("Bye Camel");
And here is an example of a mis configured 2nd route that do not have identical
org.apache.camel.component.netty.NettyServerBootstrapConfiguration option as the 1st route.
This will cause Camel to fail on startup.
840
CHAPTER 108. NETTY HTTP
TWO ROUTES SHARING THE SAME PORT, BUT THE 2ND ROUTE IS
MISCONFIGURED AND WILL FAIL ON STARTING
from("netty-http:http://0.0.0.0:{{port}}/foo")
.to("mock:foo")
.transform().constant("Bye World");
// we cannot have a 2nd route on same port with SSL enabled, when the 1st route is
NOT
from("netty-http:http://0.0.0.0:{{port}}/bar?ssl=true")
.to("mock:bar")
.transform().constant("Bye Camel");
<bean id="nettyHttpBootstrapOptions"
class="org.apache.camel.component.netty.NettyServerBootstrapConfiguration">
<property name="backlog" value="200"/>
<property name="connectTimeout" value="20000"/>
<property name="workerCount" value="16"/>
</bean>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?
bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
...
</route>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/bar?
bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
...
</route>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/beer?
bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
...
</route>
841
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=karaf"/>
...
</route>
The realm name is mandatory to enable basic authentication. By default the JAAS based authenticator
is used, which will use the realm name specified (karaf in the example above) and use the JAAS realm
and the JAAS LoginModules of this realm for authentication.
End user of Apache Karaf / ServiceMix has a karaf realm out of the box, and hence why the example
above would work out of the box in these containers.
For example as shown below in the XML DSL, we define the constraint bean:
access to /* is restricted and any roles is accepted (also if user has no roles)
To use this constraint we just need to refer to the bean id as shown below:
842
CHAPTER 108. NETTY HTTP
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?
matchOnUriPrefix=true&ecurityConfiguration.realm=karaf&ecurityConfiguration.securityConstraint=#con
straint"/>
...
</route>
Netty
Jetty
843
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The netty4-http component is an extension to Netty4 component to facilitiate HTTP transport with
Netty4.
STREAM
Netty is stream based, which means the input it receives is submitted to Camel as a
stream. That means you will only be able to read the content of the stream once. If you
find a situation where the message body appears to be empty or you need to access the
data multiple times (eg: doing multicasting, or redelivery error handling) you should use
Stream caching or convert the message body to a String which is safe to be re-read
multiple times.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty4-http</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The URI scheme for a netty component is as follows
netty4-http:http://localhost:8080[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
You may be wondering how Camel recognizes URI query parameters and endpoint
options. For example you might create endpoint URI as follows - netty4-
http:http//example.com?myParam=myValue&compression=true . In this example
myParam is the HTTP parameter, while compression is the Camel endpoint option. The
strategy used by Camel in such situations is to resolve available endpoint options and
remove them from the URI. It means that for the discussed example, the HTTP request
sent by Netty HTTP producer to the endpoint will look as follows - http//example.com?
myParam=myValue , because compression endpoint option will be resolved and
removed from the target URL.
Keep also in mind that you cannot specify endpoint options using dynamic headers (like
CamelHttpQuery). Endpoint options can be specified only at the endpoint URI definition
level (like to or from DSL elements).
844
CHAPTER 109. NETTY4-HTTP
HTTP OPTIONS
Important: This component inherits all the options from Netty4. So make sure to look at
the Netty4 documentation as well. Notice that some options from Netty4 are not
applicable when using this Netty4 HTTP component, such as options related to UDP
transport.
845
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
846
CHAPTER 109. NETTY4-HTTP
847
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MESSAGE HEADERS
The following headers can be used on the producer to control the HTTP request.
848
CHAPTER 109. NETTY4-HTTP
The following headers is provided as meta-data when a route starts from an Netty4 HTTP endpoint:
http://0.0.0.0:8080/myapp
/myapp
849
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
io.netty.handler.codec.http.HttpRequest request =
exchange.getIn(NettyHttpMessage.class).getHttpRequest();
EXAMPLES
In the route below we use Netty4 HTTP as a HTTP server, which returns back a hardcoded "Bye World"
message.
from("netty4-http:http://0.0.0.0:8080/foo")
.transform().constant("Bye World");
And we can call this HTTP server using Camel also, with the ProducerTemplate as shown below:
850
CHAPTER 109. NETTY4-HTTP
from("netty4-http:http://0.0.0.0:8123/foo").to("mock:foo");
In the route above Netty4 HTTP will only match if the uri is an exact match, so it will match if you enter
http://0.0.0.0:8123/foo but not match if you do http://0.0.0.0:8123/foo/bar.
from("netty4-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");
from("netty4-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
The options the routes must be identical configured is all the options defined in the
org.apache.camel.component.netty4.NettyServerBootstrapConfiguration configuration class. If you
have configured another route with different options, Camel will throw an exception on startup,
indicating the options is not identical. To mitigate this ensure all options is identical.
Here is an example with two routes that share the same port.
from("netty4-http:http://0.0.0.0:{{port}}/foo")
.to("mock:foo")
.transform().constant("Bye World");
from("netty4-http:http://0.0.0.0:{{port}}/bar")
.to("mock:bar")
.transform().constant("Bye Camel");
And here is an example of a mis configured 2nd route that do not have identical
org.apache.camel.component.netty4.NettyServerBootstrapConfiguration option as the 1st route.
This will cause Camel to fail on startup.
Example 109.2. Two routes sharing the same port, but the 2nd route is misconfigured and will
fail on starting
from("netty4-http:http://0.0.0.0:{{port}}/foo")
.to("mock:foo")
.transform().constant("Bye World");
// we cannot have a 2nd route on same port with SSL enabled, when the 1st route is NOT
851
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("netty4-http:http://0.0.0.0:{{port}}/bar?ssl=true")
.to("mock:bar")
.transform().constant("Bye Camel");
<bean id="nettyHttpBootstrapOptions"
class="org.apache.camel.component.netty4.NettyServerBootstrapConfiguration">
<property name="backlog" value="200"/>
<property name="connectionTimeout" value="20000"/>
<property name="workerCount" value="16"/>
</bean>
<route>
<from uri="netty4-http:http://0.0.0.0:{{port}}/foo?
bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
...
</route>
<route>
<from uri="netty4-http:http://0.0.0.0:{{port}}/bar?
bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
...
</route>
<route>
<from uri="netty4-http:http://0.0.0.0:{{port}}/beer?
bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
...
</route>
<route>
<from uri="netty4-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=karaf"/>
852
CHAPTER 109. NETTY4-HTTP
...
</route>
The realm name is mandatory to enable basic authentication. By default the JAAS based authenticator
is used, which will use the realm name specified (karaf in the example above) and use the JAAS realm
and the JAAS {{LoginModule}}s of this realm for authentication.
End user of Apache Karaf / ServiceMix has a karaf realm out of the box, and hence why the example
above would work out of the box in these containers.
For example as shown below in the XML DSL, we define the constraint bean:
access to /* is restricted and any roles is accepted (also if user has no roles)
To use this constraint we just need to refer to the bean id as shown below:
<route>
<from uri="netty4-http:http://0.0.0.0:{{port}}/foo?
matchOnUriPrefix=true&securityConfiguration.realm=karaf&securityConfiguration.securityCon
straint=#constraint"/>
...
</route>
853
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
OLINGO2 COMPONENT
Available as of Camel 2.14
The Olingo2 component utilizes Apache Olingo version 2.0 APIs to interact with OData 2.0 and 3.0
compliant services. A number of popular commercial and enterprise vendors and products support the
OData protocol. A sample list of supporting products can be found on the OData website.
The Olingo2 component supports reading feeds, delta feeds, entities, simple and complex properties,
links, counts, using custom and OData system query parameters. It supports updating entities,
properties, and association links. It also supports submitting queries and change requests as a single
OData batch operation.
The component supports configuring HTTP connection parameters and headers for OData service
connection. This allows configuring use of SSL, OAuth2.0, etc. as required by the target OData service.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-olingo2</artifactId>
<version>${camel-version}</version>
</dependency>
URI FORMAT
olingo2://endpoint/<resource-path>?[options]
OLINGO2COMPONENT
The Olingo2 Component can be configured with the options below. These options can be provided
using the component's bean property configuration of type
org.apache.camel.component.olingo2.Olingo2Configuration.
854
CHAPTER 110. OLINGO2
PRODUCER ENDPOINTS
Producer endpoints can use endpoint names and options listed next. Producer endpoints can also use a
special option inBody that in turn should contain the name of the endpoint option whose value will be
contained in the Camel Exchange In message. The inBody option defaults to data for endpoints that
take that option.
Any of the endpoint options can be provided in either the endpoint URI, or dynamically in a message
header. The message header name must be of the format CamelOlingo2.<option>. Note that the
inBody option overrides message header, i.e. the endpoint option inBody=option would override a
CamelOlingo2.option header. In addition, query parameters can be specified
Note that the resourcePath option can either in specified in the URI as a part of the URI path, as an
endpoint option ?resourcePath=<resource-path> or as a header value CamelOlingo2.resourcePath.
The OData entity key predicate can either be a part of the resource path, e.g. Manufacturers('1'), where
'1' is the key predicate, or be specified separately with resource path Manufacturers and keyPredicate
option '1'.
855
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
OData Resource Type Resource URI from resourcePath In or Out Body Type
and keyPredicate
856
CHAPTER 110. OLINGO2
OData Resource Type Resource URI from resourcePath In or Out Body Type
and keyPredicate
857
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
OData Resource Type Resource URI from resourcePath In or Out Body Type
and keyPredicate
URI OPTIONS
If a value is not provided for queryParams either in the endpoint URI or in a message header, it will be
assumed to be null. Note that the null value will only be used if other options do not satisfy matching
endpoints.
CONSUMER ENDPOINTS
Only the read endpoint can be used as a consumer endpoint. Consumer endpoints can use Scheduled
Poll Consumer Options with a consumer. prefix to schedule endpoint invocation. By default consumer
endpoints that return an array or collection will generate one exchange per element, and their routes
will be executed once for each exchange. This behavior can be disabled by setting the endpoint
property consumer.splitResult=false.
MESSAGE HEADERS
Any URI option can be provided in a message header for producer endpoints with a CamelOlingo2.
prefix.
858
CHAPTER 110. OLINGO2
MESSAGE BODY
All result message bodies utilize objects provided by the underlying Apache Olingo 2.0 API used by the
Olingo2Component. Producer endpoints can specify the option name for incoming message body in
the inBody endpoint URI parameter. For endpoints that return an array or collection, a consumer
endpoint will map every element to distinct messages, unless consumer.splitResult is set to false.
USE CASES
The following route reads top 5 entries from the Manufacturer feed ordered by ascending Name
property.
from("direct:...")
.setHeader("CamelOlingo2.$top","5")
.to("olingo2://read/Manufacturers?orderBy=Name%20asc");
The following route reads Manufacturer entry using the key property value in incoming id header.
from("direct:...")
.setHeader("CamelOlingo2.keyPredicate", header("id"))
.to("olingo2://read/Manufacturers");
The following route creates Manufacturer entry using the java.util.Map<String, Object> in body
message.
from("direct:...")
.to("olingo2://create/Manufacturers");
The following route polls Manufacturer delta feed every 30 seconds. The bean blah updates the bean
paramsBean to add an updated !deltatoken property with the value returned in the ODataDeltaFeed
result. Since the initial delta token is not known, the consumer endpoint will produce an ODataFeed
value the first time, and ODataDeltaFeed on subsequent polls.
from("olingo2://read/Manufacturers?
queryParams=#paramsBean&consumer.timeUnit=SECONDS&consumer.delay=30")
.to("bean:blah");
859
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
OPENSHIFT COMPONENT
Available as of Camel 2.14
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-openshift</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
openshift:clientId[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
860
CHAPTER 111. OPENSHIFT
EXAMPLES
// sending route
from("direct:apps")
.to("openshift:myClient?username=foo&password=secret&operation=list");
.to("log:apps");
In this case the information about all the applications is returned as pojo. If you want a json response,
then set mode=json.
STOPPING AN APPLICATION
The consumer is used for polling state changes in gears. Such as when a new gear is added/removed/
or its lifecycle is changed, eg started, or stopped etc.
When the consumer emits an Exchange then the body contains the com.openshift.client.IApplication
as the message body. And the following headers is included.
861
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
862
CHAPTER 112. PAX-LOGGING
PAXLOGGING COMPONENT
Available in Camel 2.6
The paxlogging component can be used in an OSGi environment to receive PaxLogging events and
process them.
DEPENDENCIES
Maven users need to add the following dependency to their pom.xml
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-paxlogging</artifactId>
<version>${camel-version}</version>
</dependency>
where $\{camel-version\} must be replaced by the actual version of Camel (2.6.0 or higher).
URI FORMAT
paxlogging:appender
where appender is the name of the pax appender that need to be configured in the PaxLogging service
configuration.
URI OPTIONS
MESSAGE HEADERS
MESSAGE BODY
The in message body will be set to the received PaxLoggingEvent.
EXAMPLE USAGE
<route>
<from uri="paxlogging:camel"/>
<to uri="stream:out"/>
863
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
</route>
Configuration:
864
CHAPTER 113. PGEVENT
PGEVENT COMPONENT
This is a component for Apache Camel which allows for Producing/Consuming PostgreSQL events
related to the LISTEN/NOTIFY commands added since PostgreSQL 8.3.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-pgevent</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The pgevent component uses the following two styles of endpoint URI notation:
pgevent:datasource[?parameters]
pgevent://host:port/database/channel[?parameters]
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
865
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
866
CHAPTER 114. PRINTER
PRINTER COMPONENT
Available as of Apache Camel 2.1
The printer component provides a way to direct payloads on a route to a printer. Obviously the
payload has to be a formatted piece of payload in order for the component to appropriately print it.
The objective is to be able to direct specific payloads as jobs to a line printer in a Apache Camel flow.
The functionality allows for the payload to be printed on a default printer, named local, remote or
wirelessly linked printer using the javax printing API under the covers.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-printer</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
Since the URI scheme for a printer has not been standardized (the nearest thing to a standard being
the IETF print standard) and therefore not uniformly applied by vendors, we have chosen "lpr" as the
scheme.
lpr://localhost/default[?options]
lpr://remotehost:port/path/to/printer[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
867
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PRINTER PRODUCER
Sending data to the printer is very straightforward and involves creating a producer endpoint that can
be sent message exchanges on in route.
868
CHAPTER 114. PRINTER
"&flavor=DocFlavor.INPUT_STREAM&" +
"&mimeType=AUTOSENSE" +
"&mediaSize=NA_LETTER" +
"&sides=one-sided")
}};
869
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PROPERTIES COMPONENT
Available as of Apache Camel 2.3
URI FORMAT
properties:key[?options]
OPTIONS
870
CHAPTER 115. PROPERTIES
You can use the method resolvePropertyPlaceholders on the CamelContext to resolve a property
from any Java code.
SEE ALSO
section "Property Placeholders" in "Apache Camel Development Guide"
Jasypt for using encrypted values (for example, passwords) in the properties
871
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
QUARTZ COMPONENT
The quartz: component provides a scheduled delivery of messages using the Quartz Scheduler 1.x.
Each endpoint represents a different timer (in Quartz terms, a Trigger and JobDetail).
NOTE
If you are using Quartz 2.x then from Camel 2.12 onwards there is a Quartz2 component
you should use
URI FORMAT
quartz://timerName?options
quartz://groupName/timerName?options
quartz://groupName/timerName?cron=expression
quartz://timerName?cron=expression
The component uses either a CronTrigger or a SimpleTrigger. If no cron expression is provided, the
component uses a simple trigger. If no groupName is provided, the quartz component uses the Camel
group name.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
872
CHAPTER 116. QUARTZ
For example, the following routing rule will fire two timer events to the mock:results endpoint:
from("quartz://myGroup/myTimerName?
trigger.repeatInterval=2&trigger.repeatCount=1").routeId("myRoute").to("mock:result");
When using a StatefulJob, the JobDataMap is re-persisted after every execution of the job, thus
preserving state for the next execution.
If you run in OSGi such as Apache ServiceMix, or Apache Karaf, and have multiple
bundles with Camel routes that start from Quartz endpoints, then make sure if you
assign an id to the <camelContext> that this id is unique, as this is required by the
QuartzScheduler in the OSGi container. If you do not set any id on <camelContext>
then a unique id is auto assigned, and there is no problem.
873
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
However the Camel Quartz component also allows you to configure properties:
From Camel 2.13 onwards Camel will automatic set this option to true, unless explicit disabled.
The Quartz component offers an option to let the Quartz scheduler be started delayed, or not auto
started at all.
874
CHAPTER 116. QUARTZ
CLUSTERING
Available as of Camel 2.4
If you use Quartz in clustered mode, e.g. the JobStore is clustered. Then from Camel 2.4 onwards the
Quartz component will not pause/remove triggers when a node is being stopped/shutdown. This
allows the trigger to keep running on the other nodes in the cluster.
NOTE
When running in clustered node, no checking is done to ensure unique job name/group
for endpoints.
MESSAGE HEADERS
Apache Camel adds the getters from the Quartz Execution Context as header values. The following
headers are added: calendar, fireTime, jobDetail, jobInstance, jobRuntTime, mergedJobDataMap,
nextFireTime, previousFireTime, refireCount, result, scheduledFireTime, scheduler, trigger,
triggerName, triggerGroup.
The fireTime header contains the java.util.Date of when the exchange was fired.
For example the following will fire a message every five minutes starting at 12pm (noon) to 6pm on
weekdays:
from("quartz://myGroup/myTimerName?cron=0+0/5+12-18+?+*+MON-
FRI").to("activemq:Totally.Rocks");
The following table shows the URI character encodings we use to preserve valid URI syntax:
\+ Space
875
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Available as of Camel 2.8.1 The Quartz Scheduler allows you to configure time zone per trigger. For
example to use a timezone of your country, then you can do as follows:
quartz://groupName/timerName?cron=0+0/5+12-18+?+*+MON-
FRI&trigger.timeZone=Europe/Stockholm
In Camel 2.8.0 or older versions you would have to provide your custom String to java.util.TimeZone
Type Converter to be able configure this from the endpoint uri. From Camel 2.8.1 onwards we have
included such a Type Converter in the camel-core.
Quartz2
Timer
876
CHAPTER 117. QUARTZ2
QUARTZ2 COMPONENT
Available as of Camel 2.12.0
The quartz2: component provides a scheduled delivery of messages using the Quartz Scheduler 2.x.
Each endpoint represents a different timer (in Quartz terms, a Trigger and JobDetail).
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-quartz2</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
NOTE: Quartz 2.x API is not compatible with Quartz 1.x. If you need to remain on old Quartz 1.x, please
use the old Quartz component instead.
URI FORMAT
quartz2://timerName?options
quartz2://groupName/timerName?options
quartz2://groupName/timerName?cron=expression
quartz2://timerName?cron=expression
The component uses either a CronTrigger or a SimpleTrigger. If no cron expression is provided, the
component uses a simple trigger. If no groupName is provided, the quartz component uses the Camel
group name.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
877
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
878
CHAPTER 117. QUARTZ2
For example, the following routing rule will fire two timer events to the mock:results endpoint:
from("quartz2://myGroup/myTimerName?trigger.repeatInterval=2&trigger.repeatCount=1")
.routeId("myRoute")
.to("mock:result");
When using stateful=true, the JobDataMap is re-persisted after every execution of the job, thus
preserving state for the next execution.
If you run in OSGi such as Apache ServiceMix, or Apache Karaf, and have multiple
bundles with Camel routes that start from Quartz2 endpoints, then make sure if you
assign an id to the <camelContext> that this id is unique, as this is required by the
QuartzScheduler in the OSGi container. If you do not set any id on <camelContext>
then a unique id is auto assigned, and there is no problem.
However the Camel Quartz2 component also allows you to configure properties:
879
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
From Camel 2.13 onwards Camel will automatic set this option to true, unless explicit disabled.
CLUSTERING
If you use Quartz in clustered mode, e.g. the JobStore is clustered. Then the Quartz2 component will
not pause/remove triggers when a node is being stopped/shutdown. This allows the trigger to keep
running on the other nodes in the cluster.
880
CHAPTER 117. QUARTZ2
Note: When running in clustered node no checking is done to ensure unique job name/group for
endpoints.
MESSAGE HEADERS
Camel adds the getters from the Quartz Execution Context as header values. The following headers are
added: calendar, fireTime, jobDetail, jobInstance, jobRuntTime, mergedJobDataMap, nextFireTime,
previousFireTime, refireCount, result, scheduledFireTime, scheduler, trigger, triggerName,
triggerGroup.
The fireTime header contains the java.util.Date of when the exchange was fired.
For example, the following will fire a message every five minutes starting at 12pm (noon) to 6pm on
weekdays:
from("quartz2://myGroup/myTimerName?cron=0+0/5+12-18+?+*+MON-
FRI").to("activemq:Totally.Rocks");
The following table shows the URI character encodings we use to preserve valid URI syntax:
\+ Space
quartz2://groupName/timerName?cron=0+0/5+12-18+?+*+MON-
FRI&trigger.timeZone=Europe/Stockholm
USING QUARTZSCHEDULEDPOLLCONSUMERSCHEDULER
The Quartz2 component provides a Polling Consumer scheduler which allows to use cron based
scheduling for Polling Consumer such as the File and FTP consumers.
For example to use a cron based expression to poll for files every 2nd second, then a Camel route can
be define simply as:
881
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("file:inbox?scheduler=quartz2&scheduler.cron=0/2+*+*+*+*+?")
.to("bean:process");
Notice we define the scheduler=quartz2 to instruct Camel to use the Quartz2 based scheduler. Then
we use scheduler.xxx options to configure the scheduler. The Quartz2 scheduler requires the cron
option to be set.
Important: Remember configuring these options from the endpoint URIs must be prefixed with
scheduler.. For example to configure the trigger id and group:
from("file:inbox?scheduler=quartz2&scheduler.cron=0/2+*+*+*+*+?
&scheduler.triggerId=myId&scheduler.triggerGroup=myGroup")
.to("bean:process");
There is also a CRON scheduler in Spring, so you can use the following as well:
from("file:inbox?scheduler=spring&scheduler.cron=0/2+*+*+*+*+?")
.to("bean:process");
Quartz
Timer
882
CHAPTER 118. QUICKFIX
QUICKFIX/J COMPONENT
Available as of Camel 2.0
The quickfix component adapts the QuickFIX/J FIX engine for using in Camel . This component uses
the standard Financial Interchange (FIX) protocol for message transport.
PREVIOUS VERSIONS
The quickfix component was rewritten for Camel 2.5. For information about using the
quickfix component prior to 2.5 see the documentation section below.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-quickfix</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
quickfix:configFile[?sessionID=sessionID&lazyCreateEngine=true|false]
The configFile is the name of the QuickFIX/J configuration to use for the FIX engine (located as a
resource found in your classpath). The optional sessionID identifies a specific FIX session. The format of
the sessionID is:
(BeginString):(SenderCompID)[/(SenderSubID)[/(SenderLocationID)]]->(TargetCompID)
[/(TargetSubID)[/(TargetLocationID)]]
The optional lazyCreateEngine (Camel 2.12.3+) parameter allows to create QuickFIX/J engine on
demand. Value true means the engine is started when first message is send or there's consumer
configured in route definition. When false, the engine is started at the endpoint creation. When this
parameter is missing, the value of component's property lazyCreateEngines is used.
Example URIs:
quickfix:config.cfg
quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange
quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange&lazyCreateEngine=true
ENDPOINTS
FIX sessions are endpoints for the quickfix component. An endpoint URI may specify a single session
or all sessions managed by a specific QuickFIX/J engine. Typical applications will use only one FIX
883
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
engine but advanced users may create multiple FIX engines by referencing different configuration files
in quickfix component endpoint URIs.
When a consumer does not include a session ID in the endpoint URI, it will receive exchanges for all
sessions managed by the FIX engine associated with the configuration file specified in the URI. If a
producer does not specify a session in the endpoint URI then it must include the session-related fields
in the FIX message being sent. If a session is specified in the URI then the component will automatically
inject the session-related fields into the FIX message.
EXCHANGE FORMAT
The exchange headers include information to help with exchange filtering, routing and other
processing. The following headers are available:
The DataDictionary header is useful if string messages are being received and need to be parsed in a
route. QuickFIX/J requires a data dictionary to parse certain types of messages (with repeating
groups, for example). By injecting a DataDictionary header in the route after receiving a message
string, the FIX engine can properly parse the data.
The following sections describe how the quickfix component processes the QuickFIX/J configuration.
For comprehensive information about QuickFIX/J configuration, see the QFJ user manual.
COMMUNICATION CONNECTORS
884
CHAPTER 118. QUICKFIX
When the component detects an initiator or acceptor session setting in the QuickFIX/J configuration
file it will automatically create the corresponding initiator and/or acceptor connector. These settings
can be in the default or in a specific session section of the configuration file.
The threading model for the QuickFIX/J session connectors can also be specified. These settings
affect all sessions in the configuration file and must be placed in the settings default section.
LOGGING
The QuickFIX/J logger implementation can be specified by including the following settings in the
default section of the configuration file. The ScreenLog is the default if none of the following settings
are present in the configuration. It's an error to include settings that imply more than one log
implementation.
MESSAGE STORE
The QuickFIX/J message store implementation can be specified by including the following settings in
the default section of the configuration file. The MemoryStore is the default if none of the following
885
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
settings are present in the configuration. It's an error to include settings that imply more than one
message store implementation.
MESSAGE FACTORY
A message factory is used to construct domain objects from raw FIX messages. The default message
factory is DefaultMessageFactory. However, advanced applications may require a custom message
factory. This can be set on the QuickFIX/J component.
JMX
OTHER DEFAULTS
The component provides some default settings for what are normally required settings in QuickFIX/J
configuration files. SessionStartTime and SessionEndTime default to "00:00:00", meaning the
session will not be automatically started and stopped. The HeartBtInt (heartbeat interval) defaults to
30 seconds.
[SESSION]
ConnectionType=initiator
BeginString=FIX.4.4
SenderCompID=YOUR_SENDER
TargetCompID=YOUR_TARGET
Although the FIX protocol is event-driven and asynchronous, there are specific pairs of messages that
represent a request-reply message exchange. To use an InOut exchange pattern, there should be a
single request message and single reply message to the request. Examples include an
OrderStatusRequest message and UserRequest.
886
CHAPTER 118. QUICKFIX
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET-
>TRADER&exchangePattern=InOut")
.filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.ORDER_STATUS_REQ
UEST))
.bean(new MarketOrderStatusService());
The correlation criteria is defined with a MessagePredicate object. The following example will treat a
FIX ExecutionReport from the specified session where the transaction type is STATUS and the Order
ID matches our request. The session ID should be for the requestor, the sender and target CompID fields
will be reversed when looking for the reply.
exchange.setProperty(QuickfixjProducer.CORRELATION_CRITERIA_KEY,
new MessagePredicate(new SessionID(sessionID), MsgType.EXECUTION_REPORT)
.withField(ExecTransType.FIELD, Integer.toString(ExecTransType.STATUS))
.withField(OrderID.FIELD, request.getString(OrderID.FIELD)));
EXAMPLE
The source code contains an example called RequestReplyExample that demonstrates the InOut
exchanges for a consumer and producer. This example creates a simple HTTP server endpoint that
887
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
accepts order status requests. The HTTP request is converted to a FIX OrderStatusRequestMessage, is
augmented with a correlation criteria, and is then routed to a quickfix endpoint. The response is then
converted to a JSON-formatted string and sent back to the HTTP server endpoint to be provided as
the web response.
The Spring configuration have changed from Camel 2.9 onwards. See further below for example.
SPRING CONFIGURATION
Camel 2.6 - 2.8.x
The QuickFIX/J component includes a Spring FactoryBean for configuring the session settings within
a Spring context. A type converter for QuickFIX/J session ID strings is also included. The following
example shows a simple configuration of an acceptor and initiator session with default settings for both
sessions.
888
CHAPTER 118. QUICKFIX
The QuickFIX/J component includes a QuickfixjConfiguration class for configuring the session
settings. A type converter for QuickFIX/J session ID strings is also included. The following example
shows a simple configuration of an acceptor and initiator session with default settings for both
sessions.
889
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<util:map>
<entry key="FIX.4.2:INITIATOR->ACCEPTOR">
<util:map>
<entry key="ConnectionType" value="initiator"/>
<entry key="SocketConnectHost" value="localhost"/>
<entry key="SocketConnectPort" value="5000"/>
</util:map>
</entry>
<entry key="FIX.4.2:ACCEPTOR->INITIATOR">
<util:map>
<entry key="ConnectionType" value="acceptor"/>
<entry key="SocketAcceptPort" value="5000"/>
</util:map>
</entry>
</util:map>
</property>
</bean>
EXCEPTION HANDLING
QuickFIX/J behavior can be modified if certain exceptions are thrown during processing of a message.
If a RejectLogon exception is thrown while processing an incoming logon administrative message,
then the logon will be rejected.
Normally, QuickFIX/J handles the logon process automatically. However, sometimes an outgoing
logon message must be modified to include credentials required by a FIX counterparty. If the FIX logon
message body is modified when sending a logon message (EventCategory={{AdminMessageSent}} the
modified message will be sent to the counterparty. It is important that the outgoing logon message is
being processed synchronously. If it is processed asynchronously (on another thread), the FIX engine
will immediately send the unmodified outgoing message when it's callback method returns.
Although it's possible to send messages to a FIX session before it's logged on (the messages will be
sent at logon time), it is usually a better practice to wait until the session is logged on. This eliminates
the required sequence number resynchronization steps at logon. Waiting for session logon can be done
by setting up a route that processes the SessionLogon event category and signals the application to
start sending messages.
See the FIX protocol specifications and the QuickFIX/J documentation for more details about FIX
sequence number management.
ROUTE EXAMPLES
890
CHAPTER 118. QUICKFIX
Several examples are included in the QuickFIX/J component source code (test subdirectories). One of
these examples implements a trival trade excecution simulation. The example defines an application
component that uses the URI scheme "trade-executor".
The following route receives messages for the trade executor session and passes application
messages to the trade executor component.
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER").
filter(header(QuickfixjEndpoint.EVENT_CATEGORY_KEY).isEqualTo(QuickfixjEventCategory.AppMess
ageReceived)).
to("trade-executor:market");
The trade executor component generates messages that are routed back to the trade session. The
session ID must be set in the FIX message itself since no session ID is specified in the endpoint URI.
from("trade-executor:market").to("quickfix:examples/inprocess.cfg");
The trader session consumes execution report messages from the market and processes them.
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:TRADER->MARKET").
filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.EXECUTION_REPORT)).
bean(new MyTradeExecutionProcessor());
The quickfix component is an implementation of the QuickFIX/J engine for Java . This engine allows
to connect to a FIX server which is used to exchange financial messages according to FIX protocol
standard.
URI FORMAT
quickfix-server:config file
quickfix-client:config file
Where config file is the location (in your classpath) of the quickfix configuration file used to configure
the engine at the startup.
Note: Information about parameters available for quickfix can be found on QuickFIX/J web site.
The quickfix-server endpoint must be used to receive from FIX server FIX messages and quickfix-client
endpoint in the case that you want to send messages to a FIX gateway.
891
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
When QuickFIX/J engine receives a message, then it create a QuickFix.Message instance which is next
received by the camel endpoint. This object is a 'mapping object' created from a FIX message
formatted initially as a collection of key value pairs data. You can use this object or you can use the
method 'toString' to retrieve the original FIX message.
Note: Alternatively, you can use camel bindy dataformat to transform the FIX message into your own
Java POJO
When a message must be sent to QuickFix, you must create a QuickFix.Message instance.
SAMPLES
Direction : to FIX gateway
<route>
<from uri="activemq:queue:fix"/>
<bean ref="fixService" method="createFixMessage" /> // bean method in charge to transform
message into a QuickFix.Message
<to uri="quickfix-client:META-INF/quickfix/client.cfg" /> // Quickfix engine who will send the FIX
messages to the gateway
</route>
<route>
<from uri="quickfix-server:META-INF/quickfix/server.cfg"/> // QuickFix engine who will receive the
message from FIX gateway
<bean ref="fixService" method="parseFixMessage" /> // bean method parsing the
QuickFix.Message
<to uri="uri="activemq:queue:fix"/>" />
</route>
892
CHAPTER 119. RABBITMQ
RABBITMQ COMPONENT
Available as of Camel 2.12
The rabbitmq: component allows you produce and consume messages from RabbitMQ instances.
Using the RabbitMQ AMQP client, this component offers a pure RabbitMQ approach over the generic
AMQP component.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-rabbitmq</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
rabbitmq://hostname[:port]/exchangeName?[options]
Where hostname is the hostname of the running rabbitmq instance or cluster. Port is optional and if
not specified then defaults to the RabbitMQ client default (5672). The exchange name determines
which exchange produced messages will sent to. In the case of consumers, the exchange name
determines which exchange the queue will bind to.
OPTIONS
893
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
894
CHAPTER 119. RABBITMQ
895
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
896
CHAPTER 119. RABBITMQ
<from uri="direct:rabbitMQEx2"/>
<to uri="rabbitmq://localhost:5672/ex2?connectionFactory=#customConnectionFactory"/>
</route>
</camelContext>
HEADERS
The following headers are set on exchanges when consuming messages.
Property Value
The following headers are used by the producer. If these are set on the camel exchange then they will
be set on the RabbitMQ message.
Property Value
rabbitmq.ROUTING_KEY The routing key that will be used when sending the
message
897
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Headers are set by the consumer once the message is received. The producer will also set the headers
for downstream processors once the exchange has taken place. Any headers set prior to production
that the producer sets will be overriden.
MESSAGE BODY
The component will use the camel exchange in body as the rabbit mq message body. The camel
exchange in object must be convertible to a byte array. Otherwise the producer will throw an
exception of unsupported body type.
SAMPLES
To receive messages from a queue that is bound to an exchange A with the routing key B,
from("rabbitmq://localhost/A?routingKey=B")
To receive messages from a queue with a single thread with auto acknowledge disabled.
from("rabbitmq://localhost/A?routingKey=B&threadPoolSize=1&autoAck=false")
...to("rabbitmq://localhost/B")
898
CHAPTER 120. REF
REF COMPONENT
The ref: component is used for lookup of existing endpoints bound in the Registry.
URI FORMAT
ref:someName
Where someName is the name of an endpoint in the Registry (usually, but not always, the Spring
registry). If you are using the Spring registry, someName would be the bean ID of an endpoint in the
Spring registry.
RUNTIME LOOKUP
This component can be used when you need dynamic discovery of endpoints in the Registry where you
can compute the URI at runtime. Then you can look up the endpoint using the following code:
And you could have a list of endpoints defined in the Registry such as:
SAMPLE
In the sample below we use the ref: in the URI to reference the endpoint with the spring ID, endpoint2:
899
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from ref="endpoint1"/>
<to uri="ref:endpoint2"/>
</route>
</camelContext>
<to ref="endpoint2"/>
900
CHAPTER 121. REST
REST COMPONENT
Available as of Camel 2.14
The REST component allows you to define REST endpoints using the section "Defining Services with
REST DSL" in "Apache Camel Development Guide" and to plug in other Camel components as the
REST transport.
URI FORMAT
rest://method:path[:uriTemplate]?[options]
URI OPTIONS
TIP
If no uriTemplate is configured then path option works the same way. It does not matter if you
configure only path or if you configure both options. Though configuring both a path and uriTemplate
is a more common practice with REST.
901
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("rest:get:hello")
.transform().constant("Bye World");
And the following route uses a parameter which is mapped to a Camel header with the key "me".
from("rest:get:hello/{me}")
.transform().simple("Bye ${header.me}");
The following examples have configured a base path as "hello" and then have two REST services
configured using uriTemplates.
from("rest:get:hello:/{me}")
.transform().simple("Hi ${header.me}");
from("rest:get:hello:/french/{me}")
.transform().simple("Bonjour ${header.me}");
MORE EXAMPLES
See section "Defining Services with REST DSL" in "Apache Camel Development Guide" which offers
more examples and how you can use the Rest DSL to define those in a nicer RESTful way.
902
CHAPTER 122. RESTLET
RESTLET COMPONENT
The Restlet component provides Restlet-based endpoints for consuming and producing RESTful
resources.
IMPORTANT
The Restlet component enables asynchronous mode by default, but this setting appears
to cause a performance hit. If this is an issue, you can set the option, synchronous=true,
on the endpoint URI to improve performance.
URI FORMAT
restlet:restletUrl[?options]
Format of restletUrl:
protocol://hostname[:port][/resourcePattern]
Restlet promotes decoupling of protocol and application concerns. The reference implementation of
Restlet Engine supports a number of protocols. However, we have tested the HTTP protocol only. The
default port is port 80. We do not automatically switch default port based on the protocol yet.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
903
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
904
CHAPTER 122. RESTLET
COMPONENT OPTIONS
The Restlet component can be configured with the following options. Notice these are component
options and cannot be configured on the endpoint, see further below for an example.
905
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
906
CHAPTER 122. RESTLET
MESSAGE HEADERS
907
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
908
CHAPTER 122. RESTLET
NOTE
MESSAGE BODY
Apache Camel will store the restlet response from the external server on the OUT body. All headers
from the IN message will be copied to the OUT message, so that headers are preserved during routing.
from("restlet:http://localhost:9080/securedOrders?
restletMethod=post&restletRealm=#realm").process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(
"received [" + exchange.getIn().getBody()
+ "] as an order id = "
+ exchange.getIn().getHeader("id"));
}
});
The restletRealm setting in the URI query is used to look up a Realm Map in the registry. If this option
is specified, the restlet consumer uses the information to authenticate user logins. Only authenticated
requests can access the resources. In this sample, we create a Spring application context that serves
as a registry. The bean ID of the Realm Map should match the restletRealmRef.
<util:map id="realm">
<entry key="admin" value="foo" />
<entry key="bar" value="foo" />
</util:map>
The following sample starts a direct endpoint that sends requests to the server on
http://localhost:8080 (that is, our restlet consumer endpoint).
That is all we need. We are ready to send a request and try out the restlet component:
909
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The sample client sends a request to the direct:start-auth endpoint with the following headers:
id (application header)
NOTE
from("restlet:http://localhost:9080/users/{username}?restletMethods=post,get,put")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
// echo the method
exchange.getOut().setBody(exchange.getIn().getHeader(Exchange.HTTP_METHOD,
String.class));
}
});
In addition to servicing multiple methods, the next snippet shows how to create an endpoint that
supports multiple URI templates using the restletUriPatterns option. The request URI is available in
the header of the IN message as well. If a URI pattern has been defined in the endpoint URI (which is
not the case in this sample), both the URI pattern defined in the endpoint and the restletUriPatterns
option will be honored.
from("restlet:http://localhost:9080?restletMethods=post,get&restletUriPatterns=#uriTemplates")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
// echo the method
String uri = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
String out = exchange.getIn().getHeader(Exchange.HTTP_METHOD, String.class);
if ("http://localhost:9080/users/homer".equals(uri)) {
exchange.getOut().setBody(out + " " + exchange.getIn().getHeader("username",
String.class));
} else if ("http://localhost:9080/atom/collection/foo/component/bar".equals(uri)) {
910
CHAPTER 122. RESTLET
}
});
The restletUriPatterns=#uriTemplates option references the List<String> bean defined in the Spring
XML configuration.
<util:list id="uriTemplates">
<value>/users/{username}</value>
<value>/atom/collection/{id}/component/{cid}</value>
</util:list>
You may want to use the org.restlet.Response API to populate the response. This gives you full access
to the Restlet API and fine grained control of the response. See the route snippet below where we
generate the response from an inlined Camel Processor:
911
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Available as of Camel 2.8 There are three possible ways to configure a Restlet application within a
servlet container and using the subclassed SpringServerServlet enables configuration within Camel by
injecting the Restlet Component.
Use of the Restlet servlet within a servlet container enables routes to be configured with relative paths
in URIs (removing the restrictions of hard-coded absolute URIs) and for the hosting servlet container
to handle incoming requests (rather than have to spawn a separate server process on a new port).
<camelContext>
<route id="RS_RestletDemo">
<from uri="restlet:/demo/{id}" />
<transform>
<simple>Request type : ${header.CamelHttpMethod} and ID : ${header.id}</simple>
</transform>
</route>
</camelContext>
<bean id="RestletComponentService"
class="org.apache.camel.component.restlet.RestletComponent">
<constructor-arg index="0">
<ref bean="RestletComponent" />
</constructor-arg>
</bean>
<servlet-mapping>
<servlet-name>RestletServlet</servlet-name>
<url-pattern>/rs/*</url-pattern>
</servlet-mapping>
localhost:8080 is the server and port of your servlet container mywebapp is the name of your
deployed webapp Your browser will then show the following content;
You will need to add dependency on the Spring extension to restlet which you can do in your Maven
pom.xml file:
912
CHAPTER 122. RESTLET
<dependency>
<groupId>org.restlet.jee</groupId>
<artifactId>org.restlet.ext.spring</artifactId>
<version>${restlet-version}</version>
</dependency>
And you would need to add dependency on the restlet maven repository as well:
<repository>
<id>maven-restlet</id>
<name>Public online Restlet repository</name>
<url>http://maven.restlet.org</url>
</repository>
913
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
RMI COMPONENT
The rmi: component binds Exchanges to the RMI protocol (JRMP).
Since this binding is just using RMI, normal RMI rules still apply regarding what methods can be
invoked. This component supports only Exchanges that carry a method invocation from an interface
that extends the Remote interface. All parameters in the method should be either Serializable or
Remote objects.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-rmi</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
rmi://rmi-regisitry-host:rmi-registry-port/registry-path[?options]
For example:
rmi://localhost:1099/path/to/service
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
USING
To call out to an existing RMI service registered in an RMI registry, create a route similar to the
following:
from("pojo:foo").to("rmi://localhost:1099/foo");
914
CHAPTER 123. RMI
To bind an existing camel processor or service in an RMI registry, define an RMI endpoint as follows:
Note that when binding an RMI consumer endpoint, you must specify the Remote interfaces exposed.
<camel:route>
<from uri="rmi://localhost:37541/helloServiceBean?
remoteInterfaces=org.apache.camel.example.osgi.HelloService"/>
<to uri="bean:helloServiceBean"/>
</camel:route>
915
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
ROUTEBOX COMPONENT
Available as of Camel 2.6
ROUTEBOX SUBJECT TO CHANGE
The routebox component enables the creation of specialized endpoints that offer encapsulation and a
strategy based indirection service to a collection of camel routes hosted in an automatically created or
user injected camel context.
Routebox endpoints are camel endpoints that may be invoked directly on camel routes. The routebox
endpoint performs the following key functions * encapsulation - acts as a blackbox, hosting a collection
of camel routes stored in an inner camel context. The inner context is fully under the control of the
routebox component and is JVM bound. * strategy based indirection - direct payloads sent to the
routebox endpoint along a camel route to specific inner routes based on a user defined internal routing
strategy or a dispatch map. * exchange propagation - forward exchanges modified by the routebox
endpoint to the next segment of the camel route.
Producer endpoints are of two flavors * Producers that send or dispatch incoming requests to a
external routebox consumer endpoint * Producers that directly invoke routes in an internal embedded
camel context thereby not sending requests to an external consumer.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-routebox</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
916
CHAPTER 124. ROUTEBOX
Coarse grained or higher level routes - aggregated collection of inner or lower level routes
exposed as Routebox endpoints that represent an integration focus area. For example:
Supply chain & B2B Focus Shipping routes, Fulfillment routes, 3rd party
services etc
Fine grained routes - routes that execute a singular and specific business and/or integration
pattern.
Requests sent to Routebox endpoints on coarse grained routes can then delegate requests to inner
fine grained routes to achieve a specific integration objective, collect the final inner result, and
continue to progress to the next step along the coarse-grained route.
URI FORMAT
routebox:routeboxname[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
917
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
918
CHAPTER 124. ROUTEBOX
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry registry = new JndiRegistry(createJndiContext());
// Wire the routeDefinitions & dispatchStrategy to the outer camelContext where the routebox is
declared
List<RouteBuilder> routes = new ArrayList<RouteBuilder>();
routes.add(new SimpleRouteBuilder());
registry.bind("registry", createInnerRegistry());
registry.bind("routes", routes);
919
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
return registry;
}
return innerRegistry;
}
...
CamelContext context = new DefaultCamelContext(createRegistry());
/* (non-Javadoc)
* @see
org.apache.camel.component.routebox.strategy.RouteboxDispatchStrategy#selectDestinationUri(java.ut
il.List, org.apache.camel.Exchange)
*/
public URI selectDestinationUri(List<URI> activeDestinations,
Exchange exchange) {
URI dispatchDestination = null;
return dispatchDestination;
}
}
920
CHAPTER 124. ROUTEBOX
innerRegistry=#registry&routeBuilders=#routes&dispatchMap=#map";
context.addRoutes(new RouteBuilder() {
public void configure() {
from(routeboxUri)
.to("log:Routes operation performed?showAll=true");
}
});
context.start();
It is necessary to set a special exchange Header called ROUTE_DISPATCH_KEY (optional for Dispatch
Strategy) with a key that matches a key in the dispatch map so that the request can be sent to the
correct inner route
from("direct:sendToStrategyBasedRoutebox")
.to("routebox:multipleRoutes?
innerRegistry=#registry&routeBuilders=#routes&dispatchStrategy=#strategy")
.to("log:Routes operation performed?showAll=true");
from ("direct:sendToMapBasedRoutebox")
.setHeader("ROUTE_DISPATCH_KEY", constant("addToCatalog"))
.to("routebox:multipleRoutes?
innerRegistry=#registry&routeBuilders=#routes&dispatchMap=#map")
.to("log:Routes operation performed?showAll=true");
921
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
RSS COMPONENT
The rss: component is used for polling RSS feeds. Apache Camel will default poll the feed every 60th
seconds.
NOTE
URI FORMAT
rss:rssUri
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
922
CHAPTER 125. RSS
923
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Apache Camel initializes the In body on the Exchange with a ROME SyndFeed. Depending on the value
of the splitEntries flag, Apache Camel returns either a SyndFeed with one SyndEntry or a
java.util.List of SyndEntrys.
MESSAGE HEADERS
Header Description
RSS DATAFORMAT
The RSS component ships with an RSS dataformat that can be used to convert between String (as
XML) and ROME RSS model objects.
from("rss:file:src/test/data/rss20.xml?
splitEntries=false&consumer.delay=1000").marshal().rss().to("mock:marshal");
The purpose of this feature is to make it possible to use Apache Camel's lovely built-in expressions for
manipulating RSS messages. As shown below, an XPath expression can be used to filter the RSS
message:
// only entries with Apache Camel in the title will get through the filter
from("rss:file:src/test/data/rss20.xml?splitEntries=true&consumer.delay=100")
.marshal().rss().filter().xpath("//item/title[contains(.,'Camel')]").to("mock:result");
QUERY PARAMETERS
If the URL for the RSS feed uses query parameters, this component will understand them as well, for
example if the feed uses alt=rss, then you can for example do
from("rss:http://someserver.com/feeds/posts/default?
alt=rss&splitEntries=false&consumer.delay=1000").to("bean:rss");
FILTERING ENTRIES
924
CHAPTER 125. RSS
You can filter out entries quite easily using XPath, as shown in the data format section above. You can
also exploit Apache Camel's Bean Integration to implement your own conditions. For instance, a filter
equivalent to the XPath example above would be:
// only entries with Camel in the title will get through the filter
from("rss:file:src/test/data/rss20.xml?splitEntries=true&consumer.delay=100").
filter().method("myFilterBean", "titleContainsCamel").to("mock:result");
SEE ALSO
Atom
925
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SALESFORCE COMPONENT
Available as of Camel 2.12
This component supports producer and consumer endpoints to communicate with Salesforce using
Java DTOs. There is a companion maven plugin Camel Salesforce Plugin that generates these DTOs
(see further below).
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-salesforce</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The URI scheme for a salesforce component is as follows
salesforce:topic?options
You can append query options to the URI in the following format, ?option=value&option=value&...
Producer endpoints can use the following APIs. Most of the APIs process one record at a time, the
Query API can retrieve multiple Records.
REST API
getVersions - Gets supported Salesforce REST API versions
926
CHAPTER 126. SALESFORCE
queryMore - Retrieves more results (in case of large number of results) using result link
returned from the 'query' API
For example, the following producer endpoint uses the upsertSObject API, with the sObjectIdName
parameter specifying 'Name' as the external id field. The request message body should be an SObject
DTO generated using the maven plugin. The response message will either be null if an existing record
was updated, or CreateSObjectResult with an id of the new record, or a list of errors while creating the
new object.
...to("salesforce:upsertSObject?sObjectIdName=Name")...
927
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
For example, the following producer endpoint uses the createBatch API to create a Job Batch. The in
message must contain a body that can be converted into an InputStream (usually UTF-8 CSV or XML
content from a file, etc.) and header fields 'jobId' for the Job and 'contentType' for the Job content
type, which can be XML, CSV, ZIP\_XML or ZIP\_CSV. The put message body will contain BatchInfo on
success, or throw a SalesforceException on error.
...to("salesforce:createBatchJob")..
from("salesforce:CamelTestTopic?
notifyForFields=ALL¬ifyForOperations=ALL&sObjectName=Merchandise__c&updateTopic=true&sO
bjectQuery=SELECT Id, Name FROM Merchandise__c")...
from("salesforce:CamelTestTopic&sObjectName=Merchandise__c")...
928
CHAPTER 126. SALESFORCE
from("file:///home/camel/library")
.to(new ContentProcessor()) // convert bytes from the file into a ContentVersion SObject
// for the salesforce component
.to("salesforce:createSObject");
USAGE
The plug-in configuration has the following properties.
Option Description
929
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The generated DTOs use Jackson and XStream annotations. All Salesforce field types are supported.
Date and time fields are mapped to Joda DateTime, and picklist fields are mapped to generated Java
Enumerations.
930
CHAPTER 127. SAP COMPONENT
Abstract
The SAP component is a package consisting of a suite of ten different SAP components. There are
remote function call (RFC) components that support the sRFC, tRFC, and qRFC protocols; and there
are IDoc components that facilitate communication using messages in IDoc format. The component
uses the SAP Java Connector (SAP JCo) library to facilitate bidirectional communication with SAP and
the SAP IDoc library to facilitate the transmission of documents in the Intermediate Document (IDoc)
format.
127.1. OVERVIEW
Dependencies
Maven users need to add the following dependency to their pom.xml file to use this component:
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>camel-sap</artifactId>
<version>x.x.x</version>
<dependency>
The names of the library files vary depending on the target operating system, as shown in Table 127.1,
“Required SAP Libraries”.
libsapjco3.so sapjco3.dll
931
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can install the SAP JCo libraries and the SAP IDoc library into the JBoss Fuse OSGi container
(non-Fabric) as follows:
1. Download the SAP JCo libraries and the SAP IDoc library from the SAP Service Marketplace
(http://service.sap.com/public/connectors), making sure to choose the appropriate version of
the libraries for your operating system.
NOTE
You require version 3.0.11 or greater of the JCo library and version 3.0.10 or
greater of the IDoc library. You must have an SAP Service Marketplace Account in
order to download and use these libraries.
2. Copy the sapjco3.jar, libsapjco3.so (or sapjco3.dll on Windows), and sapidoc3.jar library
files into the lib/ directory of your JBoss Fuse installation.
3. Open both the configuration properties file, etc/config.properties, and the custom properties
file, etc/custom.properties, in a text editor. In the etc/config.properties file, look for the
org.osgi.framework.system.packages.extra property and copy the complete property
setting (this setting extends over multiple lines, with a backslash character, \, used to indicate
line continuation). Now paste this setting into the etc/custom.properties file.
You can now add the extra packages required to support the SAP libraries. In the
etc/custom.properties file, add the required packages to the
org.osgi.framework.system.packages.extra setting as shown:
org.osgi.framework.system.packages.extra = \
... , \
com.sap.conn.idoc, \
com.sap.conn.idoc.jco, \
com.sap.conn.jco, \
com.sap.conn.jco.ext, \
com.sap.conn.jco.monitor, \
com.sap.conn.jco.rt, \
com.sap.conn.jco.server
TIP
Don't forget to include a comma and a backslash, , \, at the end of each line preceding the new
entries, so that the list is properly continued.
4. You need to restart the container for these changes to take effect.
5. You need to install the camel-sap feature in the container. In the Karaf console, enter the
following command:
932
CHAPTER 127. SAP COMPONENT
In the case of a Fuse Fabric deployment, this requires some special configuration. There is no point in
simply installing the SAP libraries in the Java lib directory on a single machine, because Fabric
containers need to be deployable anywhere in the network. The correct approach is to define a special
profile that is capable of downloading and installing the SAP JCo libraries and the SAP IDoc library on
whichever host it is running on.
You can define a profile for the SAP JCo libraries and the SAP IDoc library as follows:
1. Deploy the JCo libraries and the IDoc library—sapjco3.jar, libsapjco3.so (or sapjco3.dll on
Windows), and sapidoc3.jar—to a network accessible location. For example, you could install
the libraries in a Web server, so that the JCo libraries and the IDoc library can be downloaded
through HTTP URLs, http://mywebserver/sapjco3.jar, http://mywebserver/libsapjco3.so, and
http://mywebserver/sapidoc3.jar.
3. Edit the agent properties of the camel-sap-profile profile, by entering the following console
command:
4. The built-in profile editor starts up. Use this built-in text editor to add the following contents to
the agent properties:
# Profile:my-camel-sap-profile
attribute.parents = feature-camel
lib.sapjco3.jar
Customize the HTTP URL to the actual location of the sapjco3.jar file on your Web server.
lib.sapjco3.so
Customize the HTTP URL to the actual location of the libsapjco3.so file (or sapjco3.dll) on
your Web server.
933
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
lib.sapidoc3.jar
Customize the HTTP URL to the actual location of the sapidoc3.jar file on your Web server.
config.org.osgi.framework.system.packages.extra
Open the container configuration properties file, etc/config.properties, of your JBoss Fuse
installation and look for the org.osgi.framework.system.packages.extra property setting.
Copy the list of packages from that setting and paste them into the profile's agent
properties, replacing the line:
NOTE
NOTE
5. You can now deploy the camel-sap-profile profile to any Fabric container where you want to
run the SAP component. For example, to deploy the camel-sap-profileprofile to the sap-
instance container:
1. Download the SAP JCo libraries and the SAP IDoc library from the SAP Service Marketplace
(http://service.sap.com/public/connectors), making sure to choose the appropriate version of
the libraries for your operating system.
NOTE
You require version 3.0.11 or greater of the JCo library and version 3.0.10 or
greater of the IDoc library. You must have an SAP Service Marketplace Account in
order to download and use these libraries.
2. Copy the JCo library files and the IDoc library file into the appropriate subdirectory of your
JBoss EAP installation. For example, if your host platform is 64-bit Linux (linux-x86_64), install
the library files as follows:
cp sapjco3.jar sapidoc3.jar
$JBOSS_HOME/modules/system/layers/fuse/com/sap/conn/jco/main/
mkdir -p $JBOSS_HOME/modules/system/layers/fuse/com/sap/conn/jco/main/lib/linux-
934
CHAPTER 127. SAP COMPONENT
x86_64
cp libsapjco3.so
$JBOSS_HOME/modules/system/layers/fuse/com/sap/conn/jco/main/lib/linux-x86_64/
IMPORTANT
For installing native libraries (such as libsapjco3.so) into the JBoss EAP
installation, there is a standardized convention for naming the library
subdirectory, which must be followed. In the case of 64-bit Linux, the
subdirectory is linux-x86_64. For other platforms, see
https://docs.jboss.org/author/display/MODULES/Native+Libraries.
URI format
There are two different kinds of endpoint provided by the SAP component: the Remote Function Call
(RFC) endpoints, and the Intermediate Document (IDoc) endpoints.
sap-srfc-destination:destinationName:rfcName
sap-trfc-destination:destinationName:rfcName
sap-qrfc-destination:destinationName:queueName:rfcName
sap-srfc-server:serverName:rfcName[?options]
sap-trfc-server:serverName:rfcName[?options]
sap-idoc-
destination:destinationName:idocType[:idocTypeExtension[:systemRelease[:applicationRelease]]]
sap-idoclist-
destination:destinationName:idocType[:idocTypeExtension[:systemRelease[:applicationRelease]]]
sap-qidoc-
destination:destinationName:queueName:idocType[:idocTypeExtension[:systemRelease[:applicationR
elease]]]
sap-qidoclist-
destination:destinationName:queueName:idocType[:idocTypeExtension[:systemRelease[:applicationR
elease]]]
sap-idoclist-server:serverName:idocType[:idocTypeExtension[:systemRelease[:applicationRelease]]]
[?options]
The URI formats prefixed by sap-endpointKind-destination are used to define destination endpoints
(in other words, Camel producer endpoints) and destinationName is the name of a specific outbound
connection to an SAP instance. Outbound connections are named and configured at the component
935
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The URI formats prefixed by sap-endpointKind-server are used to define server endpoints (in other
words, Camel consumer endpoints) and serverName is the name of a specific inbound connection
from an SAP instance. Inbound connections are named and configured at the component level, as
described in the Section 127.2.3, “Server Configuration”.
rfcName
(Required) In a destination endpoint URI, is the name of the RFC invoked by the endpoint in the
connected SAP instance. In a server endpoint URI, is the name of the RFC handled by the endpoint
when invoked from the connected SAP instance.
queueName
Specifies the queue this endpoint sends an SAP request to.
idocType
(Required) Specifies the Basic IDoc Type of an IDoc produced by this endpoint.
idocTypeExtension
Specifies the IDoc Type Extension, if any, of an IDoc produced by this endpoint.
systemRelease
Specifies the associated SAP Basis Release, if any, of an IDoc produced by this endpoint.
applicationRelease
Specifes the associated Application Release, if any, of an IDoc produced by this endpoint.
queueName
Specifies the queue this endpoint sends an SAP request to.
936
CHAPTER 127. SAP COMPONENT
The SAP RFC server endpoints (sap-srfc-server and sap-trfc-server) support the following URI
options:
sap-srfc-destination
JBoss Fuse SAP Synchronous Remote Function Call Destination Camel component. This endpoint
should be used in cases where Camel routes require synchronous delivery of requests to and
responses from an SAP system.
NOTE
The sRFC protocol used by this component delivers requests and responses to and
from an SAP system with best effort. In case of a communication error while sending a
request, the completion status of a remote function call in the receiving SAP system
remains in doubt.
sap-trfc-destination
JBoss Fuse SAP Transactional Remote Function Call Destination Camel component. This endpoint
should be used in cases where requests must be delivered to the receiving SAP system at most
once. To accomplish this, the component generates a transaction ID, tid, which accompanies every
request sent through the component in a route's exchange. The receiving SAP system records the
tid accompanying a request before delivering the request; if the SAP system receives the request
937
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
again with the same tid it will not deliver the request. Thus if a route encounters a communication
error when sending a request through an endpoint of this component, it can retry sending the
request within the same exchange knowing it will be delivered and executed only once.
NOTE
The tRFC protocol used by this component is asynchronous and does not return a
response. Thus the endpoints of this component do not return a response message.
NOTE
This component does not guarantee the order of a series of requests through its
endpoints, and the delivery and execution order of these requests may differ on the
receiving SAP system due to communication errors and resends of a request. For
guaranteed delivery order, please see the JBoss Fuse SAP Queued Remote Function
Call Destination Camel component.
sap-qrfc-destination
JBoss Fuse SAP Queued Remote Function Call Destination Camel component. This component
extends the capabilities of the JBoss Fuse Transactional Remote Function Call Destination camel
component by adding in order delivery guarantees to the delivery of requests through its endpoints.
This endpoint should be used in cases where a series of requests depend on each other and must be
delivered to the receiving SAP system at most onceand in order. The component accomplishes the
at most oncedelivery guarantees using the same mechanisms as the JBoss Fuse SAP Transactional
Remote Function Call Destination Camel component. The ordering guarantee is accomplished by
serializing the requests in the order they are received by the SAP system to an inbound queue.
Inbound queues are processed by the QIN scheduler within SAP. When the inbound queue is
activated, the QIN Scheduler will execute the queue requests in order.
NOTE
The qRFC protocol used by this component is asynchronous and does not return a
response. Thus the endpoints of this component do not return a response message.
sap-srfc-server
JBoss Fuse SAP Synchronous Remote Function Call Server Camel component. This component and
its endpoints should be used in cases where a Camel route is required to synchronously handle
requests from and responses to an SAP system.
sap-trfc-server
JBoss Fuse SAP Transactional Remote Function Call Server Camel component. This endpoint
should be used in cases where the sending SAP system requires at most oncedelivery of its
requests to a Camel route. To accomplish this, the sending SAP system generates a transaction ID,
tid, which accompanies every request it sends to the component's endpoints. The sending SAP
system will first check with the component whether a given tid has been received by it before
sending a series of requests associated with the tid. The component will check the list of received
tids it maintains, record the sent tid if it is not in that list, and then respond to the sending SAP
system, indicating whether or not the tid had already been recorded. The sending SAP system will
only then send the series of requests, if the tid has not been previously recorded. This enables a
sending SAP system to reliably send a series of requests once to a camel route.
sap-idoc-destination
938
CHAPTER 127. SAP COMPONENT
JBoss Fuse SAP IDoc Destination Camel component. This endpoint should be used in cases where a
Camel route is required to send a list of Intermediate Documents (IDocs) to an SAP system.
sap-idoclist-destination
JBoss Fuse SAP IDoc List Destination Camel component. This endpoint should be used in cases
where a Camel route is required to send a list of Intermediate documents (IDocs) list to an SAP
system.
sap-qidoc-destination
JBoss Fuse SAP Queued IDoc Destination Camel component. This component and its endpoints
should be used in cases where a Camel route is required to send a list of Intermediate documents
(IDocs) to an SAP system in order.
sap-qidoclist-destination
JBoss Fuse SAP Queued IDoc List Destination Camel component. This component and its endpoints
should be used in cases where a camel route is required to send a list of Intermediate documents
(IDocs) list to an SAP system in order.
sap-idoclist-server
JBoss Fuse SAP IDoc List Server Camel component. This endpoint should be used in cases where a
sending SAP system requires delivery of Intermediate Document lists to a Camel route. This
component uses the tRFC protocol to communicate with SAP as described in the `sap-trfc-server-
standalone` quick start.
An RFC destination endpoint will extract an RFC request from the input message of the IN-OUT
exchanges it receives and dispatch that request in a function call to SAP. The response from the
function call will be returned in the output message of the exchange. Since SAP RFC destination
endpoints only support outbound communication, an RFC destination endpoint only supports the
creation of producers.
An RFC server endpoint will handle an incoming RFC request and dispatch it as the input message of an
IN-OUT exchange. The output message of the exchange will be returned as the response of the RFC
call. Since SAP RFC server endpoints only support inbound communication, an RFC server endpoint
only supports the creation of consumers.
939
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
An IDoc list destination endpoint is similar to an IDoc destination endpoint, except that the messages it
handles consist of a list of IDoc documents.
Meta-data repositories
A meta-data repository is used to store the following kinds of meta-data:
SAP destination and server endpoints thus require access to a repository, in order to send and receive
RFC calls and in order to send and receive IDoc documents. For RFC calls, the meta-data for all
function modules invoked and handled by the endpoints must reside within the repository; and for IDoc
endpoints, the meta-data for all IDoc types and IDoc type extensions handled by the endpoints must
reside within the repository. The location of the repository used by a destination and server endpoint is
specified in the destination data and the server data of their respective connections.
In the case of an SAP destination endpoint, the repository it uses typically resides in an SAP system
and it defaults to the SAP system it is connected to. This default requires no explicit configuration in
the destination data. Furthermore, the meta-data for the remote function call that a destination
endpoint makes will already exist in a repository for any existing function module that it calls. The
meta-data for calls made by destination endpoints thus require no configuration in the SAP
component.
On the other hand, the meta-data for function calls handled by server endpoints do not typically reside
in the repository of an SAP system and must instead be provided by a repository residing in the SAP
component. The SAP component maintains a map of named meta-data repositories. The name of a
repository corresponds to the name of the server to which it provides meta-data.
940
CHAPTER 127. SAP COMPONENT
127.2. CONFIGURATION
Abstract
The SAP component maintains three maps to store destination data, server data and repository data.
The destination data store and the server data store are configured on a special configuration object,
SapConnectionConfiguration, which automatically gets injected into the SAP component (in the
context of Blueprint XML configuration or Spring XML configuration files). The repository data store
must be configured directly on the relevant SAP component.
Overview
The SAP component maintains three maps to store destination data, server data and repository data.
The component’s property, destinationDataStore, stores destination data keyed by destination name,
the property, serverDataStore, stores server data keyed by server name and the property,
repositoryDataStore, stores repository data keyed by repository name. These configurations must be
passed to the component during its initialization.
Example
The following example shows how to configure a sample destination data store and a sample server
data store in a Blueprint XML file. The sap-configuration bean (of type
SapConnectionConfiguration) will automatically be injected into any SAP component that is used in
this XML file.
941
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Overview
The configurations for destinations are maintained in the destinationDataStore property of the SAP
component. Each entry in this map configures a distinct outbound connection to an SAP instance. The
key for each entry is the name of the outbound connection and is used in the destinationName
component of a destination endpoint URI as described in the URI format section.
The following Blueprint XML code shows how to configure a sample destination with the name,
quickstartDest.
942
CHAPTER 127. SAP COMPONENT
</blueprint>
For example, after configuring the destination as shown in the preceding Blueprint XML file, you could
invoke the BAPI_FLCUST_GETLIST remote function call on the quickstartDest destination using the
following URI:
sap-srfc-destination:quickstartDest:BAPI_FLCUST_GETLIST
943
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Connection options
944
CHAPTER 127. SAP COMPONENT
Repository options
945
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1
Activates use of RFC_METADATA_GET
0
Deactivates RFC_METADATA_GET
Overview
The configurations for servers are maintained in the serverDataStore property of the SAP component.
Each entry in this map configures a distinct inbound connection from an SAP instance. The key for
each entry is the name of the outbound connection and is used in the serverName component of a
server endpoint URI as described in the URI format section.
The following Blueprint XML code shows how to create a sample server configuration with the name,
quickstartServer.
946
CHAPTER 127. SAP COMPONENT
Notice how this example also configures a destination connection, quickstartDest, which the server
uses to retrieve meta-data from a remote SAP instance. This destination is configured in the server
data through the repositoryDestination option. If you do not configure this option, you would need to
create a local meta-data repository instead (see Section 127.2.4, “Repository Configuration” ).
For example, after configuring the destination as shown in the preceding Blueprint XML file, you could
handle the BAPI_FLCUST_GETLIST remote function call from an invoking client, using the following
URI:
sap-srfc-server:quickstartServer:BAPI_FLCUST_GETLIST
Required options
The required options for the server data configuration object are, as follows:
947
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The secure network connection options for the server data configuration object are, as follows:
Other options
The other options for the server data configuration object are, as follows:
948
CHAPTER 127. SAP COMPONENT
Overview
The configuration for repositories are maintain in the repositoryDataStore property of the SAP
Component. Each entry in this map configures a distinct repository. The key for each entry is the name
of the repository and this key also corresponds to the name of server to which this repository is
attached.
949
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The interface of a function module consists of four parameter lists by which data is transferred back
and forth to the function module in an RFC call. Each parameter list consists of one or more fields, each
of which is a named parameter transferred in an RFC call. The following parameter lists and exception
list are supported:
The import parameter list contains parameter values that are sent to a function module in an
RFC call;
The export parameter list contains parameter values that are returned by a function module in
an RFC call;
The changing parameter list contains parameter values that are sent to and returned by a
function module in an RFC call;
The table parameter list contains internal table values that are sent to and returned by a
function module in an RFC call.
The interface of a function module also consists of an exception list of ABAP exceptions that
may be raised when the module is invoked in an RFC call.
A function template describes the name and type of parameters in each parameter list of a function
interface and the ABAP exceptions thrown by the function. A function template object maintains five
property lists of meta-data objects, as described in the following table.
Property Description
<bean id="bookFlightFunctionTemplate"
class="org.fusesource.camel.component.sap.model.rfc.impl.FunctionTemplateImpl">
950
CHAPTER 127. SAP COMPONENT
<property name="importParameterList">
<list>
...
</list>
</property>
<property name="changingParameterList">
<list>
...
</list>
</property>
<property name="exportParameterList">
<list>
...
</list>
</property>
<property name="tableParameterList">
<list>
...
</list>
</property>
<property name="exceptionList">
<list>
...
</list>
</property>
</bean>
optional false If true, the field is optional and need not be set in a
951
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Note that all elementary parameter fields require that the name, type, byteLength and
unicodeByteLength properties be specified in the field meta-data object. In addition, the BCD,
FLOAT, DECF16 and DECF34 fields require the decimal property to be specified in the field meta-data
object.
For a complex parameter field of type TABLE or STRUCTURE, the following table lists the
configuration properties that may be set on a list field meta-data object:
optional false If true, the field is optional and need not be set in a
Note that all complex parameter fields require that the name, type and recordMetaData properties be
specified in the field meta-data object. The value of the recordMetaData property is a record field
meta-data object, org.fusesource.camel.component.sap.model.rfc.impl.RecordMetaDataImpl,
which specifies the structure of a nested structure or the structure of a table row.
The following meta-data configuration specifies an optional, 24-digit packed BCD number parameter
with two decimal places named TICKET_PRICE:
<bean class="org.fusesource.camel.component.sap.model.rfc.impl.ListFieldMetaDataImpl">
<property name="name" value="TICKET_PRICE" />
<property name="type" value="BCD" />
<property name="byteLength" value="12" />
<property name="unicodeByteLength" value="24" />
<property name="decimals" value="2" />
<property name="optional" value="true" />
</bean>
The following meta-data configuration specifies a required TABLE parameter named CONNINFO with
a row structure specified by the connectionInfo record meta-data object:
<bean class="org.fusesource.camel.component.sap.model.rfc.impl.ListFieldMetaDataImpl">
<property name="name" value="CONNINFO" />
<property name="type" value="TABLE" />
<property name="recordMetaData" ref="connectionInfo" />
</bean>
952
CHAPTER 127. SAP COMPONENT
The following table lists configuration properties that may be set on a record meta-data object:
NOTE
<bean id="connectionInfo"
class="org.fusesource.camel.component.sap.model.rfc.impl.RecordMetaDataImpl">
<property name="name" value="CONNECTION_INFO" />
<property name="recordFieldMetaData">
<list>
...
</list>
</property>
</bean>
A record field meta-data object is similar to a parameter field meta-data object, except that the offsets
of the individual field locations within the nested structure or table row must be additionally specified.
The non-Unicode and Unicode offsets of an individual field must be calculated and specified from the
sum of non-Unicode and Unicode byte lengths of the preceding fields in the structure or row. Note that
failure to properly specify the offsets of fields in nested structures and table rows will cause the field
storage of parameters in the underlying JCo and ABAP runtimes to overlap and prevent the proper
transfer of values in RFC calls.
For an elementary parameter field (CHAR, DATE, BCD, TIME, BYTE, NUM, FLOAT, INT, INT1, INT2,
DECF16, DECF34, STRING, XSTRING), the following table lists the configuration properties that may
be set on a record field meta-data object:
953
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
unicodeByteOffset - The field offset in bytes for Unicode layout. This off
within the enclosing structure.
For a complex parameter field of type TABLE or STRUCTURE, the following table lists the
configuration properties that may be set on a record field meta-data object:
unicodeByteOffset - The field offset in bytes for Unicode layout. This off
within the enclosing structure.
The following meta-data configuration specifies a DATE field parameter named ARRDATE located 85
bytes into the enclosing structure in the case of a non-Unicode layout and located 170 bytes into the
enclosing structure in the case of a Unicode layout:
<bean class="org.fusesource.camel.component.sap.model.rfc.impl.FieldMetaDataImpl">
<property name="name" value="ARRDATE" />
954
CHAPTER 127. SAP COMPONENT
The following meta-data configuration specifies a STRUCTURE field parameter named FLTINFO with
a structure specified by the flightInfo record meta-data object. The parameter is located at the
beginning of the enclosing structure in both the case of a non-Unicode and Unicode layout.
<bean class="org.fusesource.camel.component.sap.model.rfc.impl.FieldMetaDataImpl">
<property name="name" value="FLTINFO" />
<property name="type" value="STRUCTURE" />
<property name="byteOffset" value="0" />
<property name="unicodeByteOffset" value="0" />
<property name="recordMetaData" ref="flightInfo" />
</bean>
Note that the named fields in an SAP request and response are specific to an SAP endpoint, with each
endpoint defining the parameters in the SAP request and response it will accept. An SAP endpoint
provides factory methods to create the request and response objects that are specific to it.
Structure objects
Both SAP request and response objects are represented in Java as a structure object which supports
the org.fusesource.camel.component.sap.model.rfc.Structure interface. This interface extends both
the java.util.Map and org.eclipse.emf.ecore.EObject interfaces.
955
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The field values in a structure object are accessed through the field’s getter methods in the map
interface. In addition, the structure interface provides a type-restricted method to retrieve field values.
Structure objects are implemented in the component runtime using the Eclipse Modeling Framework
(EMF) and support that framework’s EObject interface. Instances of a structure object have attached
meta-data which define and restrict the structure and contents of the map of fields it provides. This
meta-data can be accessed and introspected using the standard methods provided by EMF. Please
refer to the EMF documentation for further details.
NOTE
Attempts to get a parameter not defined on a structure object will return null. Attempts
to set a parameter not defined on a structure will throw an exception as well as
attempts to set the value of a parameter with an incorrect type.
As discussed in the following sections, structure objects can contain fields that contain values of the
complex field types, STRUCTURE and TABLE. Note that it is unnecessary to create instances of these
types and add them to the structure. Instances of these field values are created on demand if necessary
when accessed in the enclosing structure.
Field types
The fields that reside within the structure object of an SAP request or response may be either
elementary or complex. An elementary field contains a single scalar value, whereas a complex field will
contain one or more fields of either a elementary or complex type.
956
CHAPTER 127. SAP COMPONENT
A character field declares its field length in its associated byteLength and unicodeByteLength
properties, which determine the length of the field’s character string in each encoding system.
CHAR
A CHAR character field is a text field containing alphanumeric characters and corresponds to the
ABAP type C.
NUM
A NUM character field is a numeric text field containing numeric characters only and corresponds
to the ABAP type N.
DATE
A DATE character field is an 8 character date field with the year, month and day formatted as
YYYYMMDD and corresponds to the ABAP type D.
TIME
A TIME character field is a 6 character time field with the hours, minutes and seconds formatted as
HHMMSS and corresponds to the ABAP type T.
957
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
INT
An INT numeric field is an integer field stored as a 4-byte integer value in the underlying JCo and
ABAP runtimes and corresponds to the ABAP type I. An INT field value is represented in Java as a
java.lang.Integer object.
INT2
An INT2 numeric field is an integer field stored as a 2-byte integer value in the underlying JCo and
ABAP runtimes and corresponds to the ABAP type S. An INT2 field value is represented in Java as
a java.lang.Integer object.
INT1
An INT1 field is an integer field stored as a 1-byte integer value in the underlying JCo and ABAP
runtimes value and corresponds to the ABAP type B. An INT1 field value is represented in Java as a
java.lang.Integer object.
FLOAT
A FLOAT field is a binary floating point number field stored as an 8-byte double value in the
underlying JCo and ABAP runtimes and corresponds to the ABAP type F. A FLOAT field declares
the number of decimal digits that the field’s value contains in its associated decimal property. In the
case of a FLOAT field, this decimal property can have a value between 1 and 15 digits. A FLOAT
field value is represented in Java as a java.lang.Double object.
BCD
A BCD field is a binary coded decimal field stored as a 1 to 16 byte packed number in the underlying
JCo and ABAP runtimes and corresponds to the ABAP type P. A packed number stores two decimal
digits per byte. A BCD field declares its field length in its associated byteLength and
unicodeByteLength properties. In the case of a BCD field, these properties can have a value
between 1 and 16 bytes and both properties will have the same value. A BCD field declares the
number of decimal digits that the field’s value contains in its associated decimal property. In the
case of a BCD field, this decimal property can have a value between 1 and 14 digits. A BCD field
value is represented in Java as a java.math.BigDecimal.
DECF16
A DECF16 field is a decimal floating point stored as an 8-byte IEEE 754 decimal64 floating point
value in the underlying JCo and ABAP runtimes and corresponds to the ABAP type decfloat16. The
value of a DECF16 field has 16 decimal digits. The value of a DECF16 field is represented in Java as
java.math.BigDecimal.
DECF34
A DECF34 field is a decimal floating point stored as a 16-byte IEEE 754 decimal128 floating point
value in the underlying JCo and ABAP runtimes and corresponds to the ABAP type decfloat34. The
value of a DECF34 field has 34 decimal digits. The value of a DECF34 field is represented in Java as
java.math.BigDecimal.
958
CHAPTER 127. SAP COMPONENT
BYTE
A BYTE field is a fixed sized byte string stored as a byte array in the underlying JCo and ABAP
runtimes and corresponds to the ABAP type X. A BYTE field declares its field length in its
associated byteLength and unicodeByteLength properties. In the case of a BYTE field, these
properties can have a value between 1 and 65535 bytes and both properties will have the same
value. The value of a BYTE field is represented in Java as a byte[] object.
STRING
A STRING field refers to a character string and is stored in the underlying JCo and ABAP runtimes
as an 8-byte value. It corresponds to the ABAP type G. The value of the STRING field is
represented in Java as a java.lang.String object.
XSTRING
An XSTRING field refers to a byte string and is stored in the underlying JCo and ABAP runtimes as
an 8-byte value. It corresponds to the ABAP type Y. The value of the STRING field is represented in
Java as a byte[] object.
959
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
org.fusesource.camel.component.sap.model.rfc.Structure.
Table objects
A table object is a homogeneous list data structure containing rows of structure objects with the same
structure. This interface extends both the java.util.List and org.eclipse.emf.ecore.EObject interfaces.
/**
* Creates and adds table row at end of row list
*/
S add();
/**
* Creates and adds table row at index in row list
*/
S add(int index);
The list of rows in a table object are accessed and managed using the standard methods defined in the
list interface. In addition the table interface provides two factory methods for creating and adding
structure objects to the row list.
Table objects are implemented in the component runtime using the Eclipse Modeling Framework
(EMF) and support that framework’s EObject interface. Instances of a table object have attached meta-
data which define and restrict the structure and contents of the rows it provides. This meta-data can be
accessed and introspected using the standard methods provided by EMF. Please refer to the EMF
documentation for further details.
NOTE
Attempts to add or set a row structure value of the wrong type will throw an exception.
960
CHAPTER 127. SAP COMPONENT
org.fusesource.camel.component.sap.model.idoc.Document
org.fusesource.camel.component.sap.model.idoc.DocumentList
org.fusesource.camel.component.sap.model.idoc.Document
org.fusesource.camel.component.sap.model.idoc.Segment
The Document type represents an IDoc document instance. In outline, the Document interface
exposes the following methods:
// Java
package org.fusesource.camel.component.sap.model.idoc;
...
public interface Document extends EObject {
// Access the field values from the IDoc control record
String getArchiveKey();
void setArchiveKey(String value);
String getClient();
void setClient(String value);
...
Note, however, that the precise layout of the segment hierarchy is defined by the particular IDoc
type of the document. When creating (or reading) a segment hierarchy, therefore, you must be sure
to follow the exact structure as defined by the IDoc type.
961
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The Segment type is used to access the data records of the IDoc document, where the segments are
laid out in accordance with the structure defined by the document's IDoc type. In outline, the Segment
interface exposes the following methods:
// Java
package org.fusesource.camel.component.sap.model.idoc;
...
public interface Segment extends EObject, java.util.Map<String, Object> {
// Returns the value of the '<em><b>Parent</b></em>' reference.
Segment getParent();
EList<String> getTypes();
Document getDocument();
String getDescription();
String getType();
String getDefinition();
int getHierarchyLevel();
String getIdocType();
String getIdocTypeExtension();
String getSystemRelease();
String getApplicationRelease();
int getNumFields();
long getMaxOccurrence();
long getMinOccurrence();
boolean isMandatory();
boolean isQualified();
int getRecordLength();
The getChildren(String segmentType) method is particularly useful for adding new (nested) children
to a segment. It returns an object of type, SegmentList, which is defined as follows:
962
CHAPTER 127. SAP COMPONENT
// Java
package org.fusesource.camel.component.sap.model.idoc;
...
public interface SegmentList<S extends Segment> extends EObject, EList<S> {
S add();
S add(int index);
}
Hence, to create a data record of E1SCU_CRE type, you could use Java code like the following:
Control record
The control record (which contains the meta-data for the IDoc document) is represented by the
attributes on the Document object—see Table 127.2, “IDoc Document Attributes” for details.
Data records
The data records are represented by the Segment objects, which are constructed as a nested
hierarchy of segments. You can access the root segment through the Document.getRootSegment
method.
Status records
In the Camel SAP component, the status records are not represented by the document model. But
you do have access to the latest status value through the status attribute on the control record.
// Java
import org.fusesource.camel.component.sap.model.idoc.Document;
import org.fusesource.camel.component.sap.model.idoc.Segment;
import org.fusesource.camel.component.sap.util.IDocUtil;
import org.fusesource.camel.component.sap.model.idoc.Document;
import org.fusesource.camel.component.sap.model.idoc.DocumentList;
import org.fusesource.camel.component.sap.model.idoc.IdocFactory;
import org.fusesource.camel.component.sap.model.idoc.IdocPackage;
import org.fusesource.camel.component.sap.model.idoc.Segment;
import org.fusesource.camel.component.sap.model.idoc.SegmentChildren;
963
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
...
//
// Create a new IDoc instance using the modelling classes
//
Segment E1BPSCUNEW_Segment =
E1SCU_CRE_Segment.getChildren("E1BPSCUNEW").add();
E1BPSCUNEW_Segment.put("CUSTNAME", "Fred Flintstone");
E1BPSCUNEW_Segment.put("FORM", "Mr.");
E1BPSCUNEW_Segment.put("STREET", "123 Rubble Lane");
E1BPSCUNEW_Segment.put("POSTCODE", "01234");
E1BPSCUNEW_Segment.put("CITY", "Bedrock");
E1BPSCUNEW_Segment.put("COUNTR", "US");
E1BPSCUNEW_Segment.put("PHONE", "800-555-1212");
E1BPSCUNEW_Segment.put("EMAIL", "[email protected]");
E1BPSCUNEW_Segment.put("CUSTTYPE", "P");
E1BPSCUNEW_Segment.put("DISCOUNT", "005");
E1BPSCUNEW_Segment.put("LANGU", "E");
Document attributes
Table 127.2, “IDoc Document Attributes” shows the control record attributes that you can set on the
Document object.
964
CHAPTER 127. SAP COMPONENT
Attribute L SA Description
e P
n Fiel
g d
t
h
client 3 MA Client
ND
T
direction 1 DI Direction
RE
CT
965
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Attribute L SA Description
e P
n Fiel
g d
t
h
966
CHAPTER 127. SAP COMPONENT
Attribute L SA Description
e P
n Fiel
g d
t
h
967
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Attribute L SA Description
e P
n Fiel
g d
t
h
// Java
document.setIDocType("FLCUSTOMER_CREATEFROMDATA01");
document.setIDocTypeExtension("");
document.setMessageType("FLCUSTOMER_CREATEFROMDATA");
968
CHAPTER 127. SAP COMPONENT
Overview
SAP request and response objects support an XML serialization format which enable these objects to
be serialized to and from an XML document.
XML namespace
Each RFC in a repository defines a specific XML name space for the elements which compose the
serialized forms of its Request and Response objects. The form of this namespace URL is as follows:
RFC namespace URLs have a common http://sap.fusesource.org/rfc prefix followed by the name of
the repository in which the RFC’s metadata is defined. The final component in the URL is the name of
the RFC itself.
An SAP response object will be serialized into an XML document with the root element of that
document named Response and scoped by the namespace of the response’s RFC.
Structure fields
969
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Structure fields in parameter lists or nested structures are serialized as elements. The element name
of the serialized structure corresponds to the field name of the structure within the enclosing
parameter list, structure or table row entry it resides.
<BOOK_FLIGHT:FLTINFO
xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
...
</BOOK_FLIGHT:FLTINFO>
Note that the type name of the structure element in the RFC namespace will correspond to the name of
the record meta data object which defines the structure, as in the following example:
<xs:schema
targetNamespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
<xs:complexType name="FLTINFO_STRUCTURE”>
...
</xs:complexType>
...
</xs:schema>
This distinction will be important when specifying a JAXB bean to marshal and unmarshal the structure
as will be seen in Section 127.10, “Example 3: Handling Requests from SAP” .
Table fields
Table fields in parameter lists or nested structures are serialized as elements. The element name of the
serialized structure will correspond to the field name of the table within the enclosing parameter list,
structure, or table row entry it resides. The table element will contain a series of row elements to hold
the serialized values of the table's row entries.
<BOOK_FLIGHT:CONNINFO
xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
<row ... > ... </row>
...
<row ... > ... </row>
</BOOK_FLIGHT:CONNINFO>
Note that the type name of the table element in the RFC namespace will correspond to the name of the
record meta data object which defines the row structure of the table suffixed by _TABLE. The type
name of the table row element in the RFC name corresponds to the name of the record meta data
object which defines the row structure of the table, as in the following example:
<xs:schema
targetNamespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
<xs:complextType name="CONNECTION_INFO_STRUCTURE_TABLE”>
<xs:sequence>
<xs:element
name="row”
minOccures="0”
maxOccurs="unbounded”
970
CHAPTER 127. SAP COMPONENT
type="CONNECTION_INFO_STRUCTURE”/>
...
<xs:sequence>
</xs:sequence>
</xs:complexType>
<xs:complextType name="CONNECTION_INFO_STRUCTURE”>
...
</xs:complexType>
...
</xs:schema>
This distinction will be important when specifying a JAXB bean to marshal and unmarshal the structure
as will be seen in Section 127.10, “Example 3: Handling Requests from SAP” .
Elementary fields
Elementary fields in parameter lists or nested structures are serialized as attributes on the element of
the enclosing parameter list or structure. The attribute name of the serialized field corresponds to the
field name of the field within the enclosing parameter list, structure, or table row entry it resides, as in
the following example:
yyyy-MM-dd'T'HH:mm:ss.SSSZ
Date fields will be serialized with only the year, month, day and timezone components set:
DEPDATE="2014-03-19T00:00:00.000-0400"
Time fields will be serialized with only the hour, minute, second, millisecond and timezone components
set:
DEPTIME="1970-01-01T16:00:00.000-0500"
971
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Overview
An IDoc message body can be serialized into an XML string format, with the help of a built-in type
converter.
XML namespace
Each serialized IDoc is associated with an XML namespace, which has the following general format:
http://sap.fusesource.org/idoc/repositoryName/idocType/idocTypeExtension/systemRelease/applicati
onRelease
Both the repositoryName (name of the remote SAP meta-data repository) and the idocType (IDoc
document type) are mandatory, but the other components of the namespace can be left blank. For
example, you could have an XML namespace like the following:
http://sap.fusesource.org/idoc/MY_REPO/FLCUSTOMER_CREATEFROMDATA01///
For example, to serialize a Document object to an XML string, you can simply add the following line to
a route in XML DSL:
<convertBodyTo type="java.lang.String"/>
You can also use this approach to a serialized XML message into a Document object. For example,
given that the current message body is a serialized XML string, you can convert it back into a
Document object by adding the following line to a route in XML DSL:
<convertBodyTo type="org.fusesource.camel.component.sap.model.idoc.Document"/>
972
CHAPTER 127. SAP COMPONENT
messageType="FLCUSTOMER_CREATEFROMDATA"
recipientPartnerNumber="QUICKCLNT"
recipientPartnerType="LS"
senderPartnerNumber="QUICKSTART"
senderPartnerType="LS">
<rootSegment xsi:type="FLCUSTOMER_CREATEFROMDATA01---:ROOT" document="/">
<segmentChildren parent="//@rootSegment">
<E1SCU_CRE parent="//@rootSegment" document="/">
<segmentChildren parent="//@rootSegment/@segmentChildren/@E1SCU_CRE.0">
<E1BPSCUNEW parent="//@rootSegment/@segmentChildren/@E1SCU_CRE.0"
document="/"
CUSTNAME="Fred Flintstone" FORM="Mr."
STREET="123 Rubble Lane"
POSTCODE="01234"
CITY="Bedrock"
COUNTR="US"
PHONE="800-555-1212"
EMAIL="[email protected]"
CUSTTYPE="P"
DISCOUNT="005"
LANGU="E"/>
</segmentChildren>
</E1SCU_CRE>
</segmentChildren>
</rootSegment>
</idoc:Document>
Overview
This example demonstrates a route which reads FlightCustomer business object data from SAP. The
route invokes the FlightCustomer BAPI method, BAPI_FLCUST_GETLIST, using an SAP synchronous
RFC destination endpoint to retrieve the data.
from("direct:getFlightCustomerInfo")
.to("bean:createFlightCustomerGetListRequest")
.to("sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST")
.to("bean:returnFlightCustomerInfo");
<route>
<from uri="direct:getFlightCustomerInfo"/>
<to uri="bean:createFlightCustomerGetListRequest"/>
973
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<to uri="sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST"/>
<to uri="bean:returnFlightCustomerInfo"/>
</route>
createFlightCustomerGetListRequest bean
The createFlightCustomerGetListRequest bean is responsible for building an SAP request object in
its exchange method that is used in the RFC call of the subsequent SAP endpoint . The following code
snippet demonstrates the sequence of operations to build the request object:
returnFlightCustomerInfo bean
The returnFlightCustomerInfo bean is responsible for extracting data from the SAP response object
in its exchange method that it receives from the previous SAP endpoint . The following code snippet
demonstrates the sequence of operations to extract the data from the response object:
if (flightCustomerGetListResponse == null) {
throw new Exception("No Flight Customer Get List Response");
}
974
CHAPTER 127. SAP COMPONENT
...
Overview
This example demonstrates a route which creates a FlightTrip business object instance in SAP. The
route invokes the FlightTrip BAPI method, BAPI_FLTRIP_CREATE, using a destination endpoint to
create the object.
from("direct:createFlightTrip")
.to("bean:createFlightTripRequest")
.to("sap-srfc-destination:nplDest:BAPI_FLTRIP_GETLIST?transacted=true")
975
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
.to("bean:returnFlightTripResponse");
<route>
<from uri="direct:createFlightTrip"/>
<to uri="bean:createFlightTripRequest"/>
<to uri="sap-srfc-destination:nplDest:BAPI_FLTRIP_GETLIST?transacted=true"/>
<to uri="bean:returnFlightTripResponse"/>
</route>
Transaction support
Note that the URL for the SAP endpoint has the transacted option set to true. As discussed in
Section 127.5, “Transaction Support” , when this option is enabled the endpoint ensures that an SAP
transaction session has been initiated before invoking the RFC call. Because this endpoint’s RFC
creates new data in SAP, this options is necessary to make the route's changes permanent in SAP.
Overview
This example demonstrates a route which handles a request from SAP to the BOOK_FLIGHT RFC,
which is implemented by the route. In addition, it demonstrates the component's XML serialization
support, using JAXB to unmarshal and marshal SAP request objects and response objects to custom
beans.
This route creates a FlightTrip business object on behalf of a travel agent, FlightCustomer. The route
first unmarshals the SAP request object received by the SAP server endpoint into a custom JAXB
bean. This custom bean is then multicasted in the exchange to three sub-routes, which gather the
travel agent, flight connection and passenger information required to create the flight trip. The final
sub-route creates the flight trip object in SAP as demonstrated in the previous example. The final sub-
route also creates and returns a custom JAXB bean which is marshaled into an SAP response object
and returned by the server endpoint.
from("sap-srfc-server:nplserver:BOOK_FLIGHT")
.unmarshal(jaxb)
.multicast()
976
CHAPTER 127. SAP COMPONENT
.to("direct:getFlightConnectionInfo",
"direct:getFlightCustomerInfo",
"direct:getPassengerInfo")
.end()
.to("direct:createFlightTrip")
.marshal(jaxb);
<route>
<from uri="sap-srfc-server:nplserver:BOOK_FLIGHT"/>
<unmarshal>
<jaxb contextPath="org.fusesource.sap.example.jaxb"/>
</unmarshal>
<multicast>
<to uri="direct:getFlightConnectionInfo"/>
<to uri="direct:getFlightCustomerInfo"/>
<to uri="direct:getPassengerInfo"/>
</multicast>
<to uri="direct:createFlightTrip"/>
<marshal>
<jaxb contextPath="org.fusesource.sap.example.jaxb"/>
</marshal>
</route>
BookFlightRequest bean
The following listing illustrates a JAXB bean which unmarshals from the serialized form of an SAP
BOOK_FLIGHT request object:
@XmlRootElement(name="Request",
namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class BookFlightRequest {
@XmlAttribute(name="CUSTNAME")
private String customerName;
@XmlAttribute(name="FLIGHTDATE")
@XmlJavaTypeAdapter(DateAdapter.class)
private Date flightDate;
@XmlAttribute(name="TRAVELAGENCYNUMBER")
private String travelAgencyNumber;
@XmlAttribute(name="DESTINATION_FROM")
private String startAirportCode;
@XmlAttribute(name="DESTINATION_TO")
private String endAirportCode;
@XmlAttribute(name="PASSFORM")
977
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
@XmlAttribute(name="PASSNAME")
private String passengerName;
@XmlAttribute(name="PASSBIRTH")
@XmlJavaTypeAdapter(DateAdapter.class)
private Date passengerDateOfBirth;
@XmlAttribute(name="CLASS")
private String flightClass;
...
}
BookFlightResponse bean
The following listing illustrates a JAXB bean which marshals to the serialized form of an SAP
BOOK_FLIGHT response object:
@XmlRootElement(name="Response",
namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class BookFlightResponse {
@XmlAttribute(name="TRIPNUMBER")
private String tripNumber;
@XmlAttribute(name="TICKET_PRICE")
private BigDecimal ticketPrice;
@XmlAttribute(name="TICKET_TAX")
private BigDecimal ticketTax;
@XmlAttribute(name="CURRENCY")
private String currency;
@XmlAttribute(name="PASSFORM")
private String passengerFormOfAddress;
@XmlAttribute(name="PASSNAME")
private String passengerName;
@XmlAttribute(name="PASSBIRTH")
@XmlJavaTypeAdapter(DateAdapter.class)
private Date passengerDateOfBirth;
@XmlElement(name="FLTINFO")
private FlightInfo flightInfo;
@XmlElement(name="CONNINFO")
private ConnectionInfoTable connectionInfo;
978
CHAPTER 127. SAP COMPONENT
...
}
NOTE
The complex parameter fields of the response object are serialized as child elements of
the response.
FlightInfo bean
The following listing illustrates a JAXB bean which marshals to the serialized form of the complex
structure parameter FLTINFO:
@XmlRootElement(name="FLTINFO",
namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class FlightInfo {
@XmlAttribute(name="FLIGHTTIME")
private String flightTime;
@XmlAttribute(name="CITYFROM")
private String cityFrom;
@XmlAttribute(name="DEPDATE")
@XmlJavaTypeAdapter(DateAdapter.class)
private Date departureDate;
@XmlAttribute(name="DEPTIME")
@XmlJavaTypeAdapter(DateAdapter.class)
private Date departureTime;
@XmlAttribute(name="CITYTO")
private String cityTo;
@XmlAttribute(name="ARRDATE")
@XmlJavaTypeAdapter(DateAdapter.class)
private Date arrivalDate;
@XmlAttribute(name="ARRTIME")
@XmlJavaTypeAdapter(DateAdapter.class)
private Date arrivalTime;
...
}
ConnectionInfoTable bean
The following listing illustrates a JAXB bean which marshals to the serialized form of the complex table
parameter, CONNINFO. Note that the name of the root element type of the JAXB bean corresponds to
the name of the row structure type suffixed with _TABLE and the bean contains a list of row elements.
@XmlRootElement(name="CONNINFO_TABLE",
979
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConnectionInfoTable {
@XmlElement(name="row")
List<ConnectionInfo> rows;
...
}
ConnectionInfo bean
The following listing illustrates a JAXB bean, which marshals to the serialized form of the above tables
row elements:
@XmlRootElement(name="CONNINFO",
namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConnectionInfo {
@XmlAttribute(name="CONNID")
String connectionId;
@XmlAttribute(name="AIRLINE")
String airline;
@XmlAttribute(name="PLANETYPE")
String planeType;
@XmlAttribute(name="CITYFROM")
String cityFrom;
@XmlAttribute(name="DEPDATE")
@XmlJavaTypeAdapter(DateAdapter.class)
Date departureDate;
@XmlAttribute(name="DEPTIME")
@XmlJavaTypeAdapter(DateAdapter.class)
Date departureTime;
@XmlAttribute(name="CITYTO")
String cityTo;
@XmlAttribute(name="ARRDATE")
@XmlJavaTypeAdapter(DateAdapter.class)
Date arrivalDate;
@XmlAttribute(name="ARRTIME")
@XmlJavaTypeAdapter(DateAdapter.class)
Date arrivalTime;
...
}
980
CHAPTER 128. SAP NETWEAVER
The sap-netweaver integrates with the SAP NetWeaver Gateway using HTTP transports.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-sap-netweaver</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The URI scheme for a sap netweaver gateway component is as follows
sap-netweaver:https://host:8080/path?username=foo&password=secret
You can append query options to the URI in the following format, ?option=value&option=value&...
PREREQUISITES
You would need to have an account to the SAP NetWeaver system to be able to leverage this
component. SAP provides a demo setup where you can requires for an account.
This component uses the basic authentication scheme for logging into SAP NetWeaver.
981
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MESSAGE HEADERS
The following headers can be used by the producer.
EXAMPLES
This example is using the flight demo example from SAP, which is available online over the internet
here.
In the route below we request the SAP NetWeaver demo server using the following url
https://sapes1.sapdevcenter.com/sap/opu/odata/IWBEP/RMTSAMPLEFLIGHT_2/
FlightCollection(AirLineID='AA',FlightConnectionID='0017',FlightDate=datetime'2012-08-
29T00%3A00%3A00')
To get flight details for the given flight. The command syntax is in MS ADO.Net Data Service format.
from("direct:start")
.toF("sap-netweaver:%s?username=%s&password=%s", url, username, password)
.to("log:response")
.to("velocity:flight-info.vm")
982
CHAPTER 128. SAP NETWEAVER
The password is invalid. You would need to create an account at SAP first to run the demo.
The velocity template is used for formatting the response to a basic HTML page
<html>
<body>
Flight information:
<p/>
<br/>Airline ID: $body["AirLineID"]
<br/>Aircraft Type: $body["AirCraftType"]
<br/>Departure city: $body["FlightDetails"]["DepartureCity"]
<br/>Departure airport: $body["FlightDetails"]["DepartureAirPort"]
<br/>Destination city: $body["FlightDetails"]["DestinationCity"]
<br/>Destination airport: $body["FlightDetails"]["DestinationAirPort"]
</body>
</html>
Flight information:
Airline ID: AA
Aircraft Type: 747-400
Departure city: new york
Departure airport: JFK
Destination city: SAN FRANCISCO
Destination airport: SFO
HTTP
983
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SCHEDULER COMPONENT
Available as of Camel 2.15
The scheduler: component is used to generate message exchanges when a scheduler fires. This
component is similar to the Timer component, but it offers more functionality in terms of scheduling.
Also this component uses JDK ScheduledExecutorService. Where as the timer uses a JDK Timer.
URI FORMAT
scheduler:name[?options]
Where name is the name of the scheduler, which is created and shared across endpoints. So if you use
the same name for all your timer endpoints, only one scheduler thread pool and thread will be used -
but you can configure the thread pool to allow more concurrent threads.
You can append query options to the URI in the following format, ?option=value&option=value&...
Note: The IN body of the generated exchange is null. So exchange.getIn().getBody() returns null.
OPTIONS
984
CHAPTER 129. SCHEDULER
pollStrategy A pluggable
org.apache.camel.PollingCo
nsumerPollingStrategy
allowing you to provide your
custom implementation to control
error handling usually occurred
during the poll operation before
an Exchange have been created
and being routed in Camel. In
other words the error occurred
while the polling was gathering
information, for instance access
to a file network failed so Camel
cannot access it to scan for files.
The default implementation will
log the caused exception at
WARN level and ignore it.
985
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
986
CHAPTER 129. SCHEDULER
MORE INFORMATION
This component is a scheduler Polling Consumer where you can find more information about the
options above, and examples at the Polling Consumer page.
EXCHANGE PROPERTIES
When the timer is fired, it adds the following information as properties to the Exchange:
SAMPLE
To set up a route that generates an event every 60 seconds:
from("scheduler://foo?period=60s").to("bean:myBean?method=someMethodName");
The above route will generate an event and then invoke the someMethodName method on the bean
called myBean in the Registry such as JNDI or Spring.
<route>
<from uri="scheduler://foo?period=60s"/>
<to uri="bean:myBean?method=someMethodName"/>
</route>
The consumer will otherwise as by default return 1 message polled to the scheduler, every time the
consumer has completed processing the exchange.
Timer
987
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Quartz
988
CHAPTER 130. SCHEMATRON
SCHEMATRON COMPONENT
Available as of Camel 2.14
Schematron is an XML-based language for validating XML instance documents. It is used to make
assertions about data in an XML document and it is also used to express operational and business
rules. Schematron is an ISO Standard. The schematron component uses the leading implementation of
ISO schematron. It is an XSLT based implementation. The schematron rules is run through four XSLT
pipelines, which generates a final XSLT which will be used as the basis for running the assertion against
the XML document. The component is written in a way that Schematron rules are loaded at the start of
the endpoint (only once) this is to minimise the overhead of instantiating a Java Templates object
representing the rules.
URI FORMAT
schematron://path?[options]
URI OPTIONS
HEADERS
from("direct:start").to("schematron://sch/schematron.sch").to("mock:result")
989
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The following example shows how to invoke the schematron processor in XML DSL. The schematrion
rules file is sourced from the file system:
<route>
<from uri="direct:start" />
<to uri="schematron:///usr/local/sch/schematron.sch" />
<log message="Schematron validation status: ${in.header.CamelSchematronValidationStatus}" />
<choice>
<when>
<simple>${in.header.CamelSchematronValidationStatus} == 'SUCCESS'</simple>
<to uri="mock:success" />
</when>
<otherwise>
<log message="Failed schematron validation" />
<setBody>
<header>CamelSchematronValidationReport</header>
</setBody>
<to uri="mock:failure" />
</otherwise>
</choice>
</route>
Schematron rules can change with business requirement, as such it is recommended to store these
rules somewhere in file system. When the schematron component endpoint is started, the rules are
compiled into XSLT as a Java Templates Object. This is done only once to minimise the overhead of
instantiating Java Templates object, which can be an expensive operation for large set of rules and
given that the process goes through four pipelines of XSLT transformations. So if you happen to store
the rules in the file system, in the event of an update, all you need is to restart the route or the
component. No harm in storing these rules in the class path though, but you will have to build and
deploy the component to pick up the changes.
990
CHAPTER 130. SCHEMATRON
xmlns:schold="http://www.ascc.net/xml/schematron"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaVersion="" title="">
991
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SEDA COMPONENT
The seda: component provides asynchronous SEDA behavior, so that messages are exchanged on a
BlockingQueue and consumers are invoked in a separate thread from the producer.
Note that queues are only visible within a single CamelContext. If you want to communicate across
CamelContext instances (for example, communicating between Web applications), see the VM
component.
This component does not implement any kind of persistence or recovery, if the VM terminates while
messages are yet to be processed. If you need persistence, reliability or distributed SEDA, try using
either JMS or ActiveMQ.
SYNCHRONOUS
The Direct component provides synchronous invocation of any consumers when a producer sends a
message exchange.
URI FORMAT
seda:queueName[?options]
Where queueName can be any string that uniquely identifies the endpoint within the current
CamelContext.
You can append query options to the URI in the following format, ?option=value&option=value&...
NOTE
OPTIONS
992
CHAPTER 131. SEDA
993
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
994
CHAPTER 131. SEDA
By default, the SEDA component always intantiates LinkedBlockingQueue, but you can use different
implementation, you can reference your own BlockingQueue implementation, in this case the size
option is not used
<bean id="priorityQueueFactory"
class="org.apache.camel.component.seda.PriorityBlockingQueueFactory">
<property name="comparator">
<bean class="org.apache.camel.demo.MyExchangeComparator" />
</property>
</bean>
<!-- ... and later -->
<from>seda:priority?queueFactory=#priorityQueueFactory&size=100</from>
from("mina:tcp://0.0.0.0:9876?textline=true&sync=true").to("seda:input");
from("seda:input").to("bean:processInput").to("bean:createResponse");
In the route above, we have a TCP listener on port 9876 that accepts incoming requests. The request is
routed to the seda:input queue. As it is a Request Reply message, we wait for the response. When the
consumer on the seda:input queue is complete, it copies the response to the original message
response.
Using Request Reply over SEDA or VM only works with 2 endpoints. You cannot chain
endpoints by sending to A -> B -> C etc. Only between A -> B. The reason is the
implementation logic is fairly simple. To support 3+ endpoints makes the logic much
more complex to handle ordering and notification between the waiting threads properly.
This has been improved in Camel 2.3 onwards, which allows you to chain as many
endpoints as you like.
CONCURRENT CONSUMERS
995
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
By default, the SEDA endpoint uses a single consumer thread, but you can configure it to use
concurrent consumer threads. So instead of thread pools you can use:
from("seda:stageName?concurrentConsumers=5").process(...)
THREAD POOLS
Be aware that adding a thread pool to a SEDA endpoint by doing something like:
from("seda:stageName").thread(5).process(...)
Can wind up with two BlockQueues: one from the SEDA endpoint, and one from the workqueue of the
thread pool, which may not be what you want. Instead, you might want to consider configuring a Direct
endpoint with a thread pool, which can process messages both synchronously and asynchronously. For
example:
from("direct:stageName").thread(5).process(...)
You can also directly configure number of threads that process messages on a SEDA endpoint using
the concurrentConsumers option.
SAMPLE
In the route below we use the SEDA queue to send the request to this async queue to be able to send a
fire-and-forget message for further processing in another thread, and return a constant reply in this
thread to the original caller.
from("seda:next").to("mock:result");
}
Here we send a Hello World message and expect the reply to be OK.
The "Hello World" message will be consumed from the SEDA queue from another thread for further
processing. Since this is from a unit test, it will be sent to a mock endpoint where we can do assertions
in the unit test.
996
CHAPTER 131. SEDA
USING MULTIPLECONSUMERS
Available as of Camel 2.2
In this example we have defined two consumers and registered them as spring beans.
<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="seda:foo?multipleConsumers=true"/>
</camelContext>
Since we have specified multipleConsumers=true on the seda foo endpoint we can have those two
consumers receive their own copy of the message as a kind of pub-sub style messaging.
As the beans are part of an unit test they simply send the message to a mock endpoint, but notice how
we can use @Consume to consume from the seda queue.
@EndpointInject(uri = "mock:result")
private ProducerTemplate destination;
@Consume(ref = "foo")
public void doSomething(String body) {
destination.sendBody("foo" + body);
}
Disruptor
VM
Direct
997
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SERVLET COMPONENT
The servlet: component provides HTTP-based endpoints for consuming HTTP requests that arrive at a
HTTP endpoint and this endpoint is bound to a published Servlet.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-servlet</artifactId>
<version>x.x.x</version>
<\!-\- use the same version as your Camel core version \-->
</dependency>
URI FORMAT
servlet://relative_path[?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
998
CHAPTER 132. SERVLET
MESSAGE HEADERS
Apache Camel will apply the same Message Headers as the HTTP component.
Apache Camel will also populate allrequest.parameter and request.headers. For example, if a client
request has the URL, http://myserver/myserver?orderid=123, the exchange will contain a header
named orderid with the value 123.
USAGE
You can only consume from endpoints generated by the Servlet component. Therefore, it should only
be used as input into your Apache Camel routes. To issue HTTP requests against other HTTP
endpoints, use the HTTP Component
Mind that putting Camel JARs in the boot classpath of the application server is generally not best
practice!
So in those situations you must define a custom and unique servlet name in each of your Camel
application, eg in the web.xml define:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
And in your Camel endpoints then include the servlet name as well
999
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from uri="servlet://foo?servletName=MyServlet"/>
...
</route>
From Camel 2.11 onwards Camel will detect this duplicate and fail to start the application. You can
control to ignore this duplicate by setting the servlet init-parameter ignoreDuplicateServletName to
true as follows:
<servlet>
<servlet-name>CamelServlet</servlet-name>
<display-name>Camel Http Transport Servlet</display-name>
<servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
<init-param>
<param-name>ignoreDuplicateServletName</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
But its strongly advised to use unique servlet-name for each Camel application to avoid this
duplication clash, as well any unforeseen side-effects.
SAMPLE
IMPORTANT
From Camel 2.7 onwards its easier to use Servlet in Spring web applications. See
Servlet Tomcat Example for details.
<web-app>
<servlet>
<servlet-name>CamelServlet</servlet-name>
<display-name>Camel Http Transport Servlet</display-name>
<servlet-class>
org.apache.camel.component.servlet.CamelHttpTransportServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CamelServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
1000
CHAPTER 132. SERVLET
from("servlet:///hello?matchOnUriPrefix=true").process(new Processor() {
public void process(Exchange exchange) throws Exception {
String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
String path = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
path = path.substring(path.lastIndexOf("/"));
Since we are binding the Http transport with a published servlet, and we don't know the
servlet's application context path, the camel-servlet endpoint uses the relative path to
specify the endpoint's URL. A client can access the camel-servlet endpoint through the
servlet publish address: ("http://localhost:8080/camel/services") +
RELATIVE_PATH("/hello").
For example, to create a Spring application context that loads Spring definitions (including the
camelContext and route definitions) from the camel-config.xml file, define a web.xml file as follows:
1001
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
<web-app>
<servlet>
<servlet-name>CamelServlet</servlet-name>
<servlet-class>
org.apache.camel.component.servlet.CamelHttpTransportServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>SpringApplicationContext</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<web-app>
<bean id="camelServlet"
class="org.apache.camel.component.servlet.CamelHttpTransportServlet"/>
1002
CHAPTER 132. SERVLET
<!--
Enlist it in OSGi service registry
This will cause two things:
1) As the pax web whiteboard extender is running the CamelServlet will
be registered with the OSGi HTTP Service
2) It will trigger the HttpRegistry in other bundles so the servlet is
made known there too
-->
<service ref="camelServlet">
<interfaces>
<value>javax.servlet.Servlet</value>
<value>org.apache.camel.component.http.CamelServlet</value>
</interfaces>
<service-properties>
<entry key="alias" value="/camel/services" />
<entry key="matchOnUriPrefix" value="true" />
<entry key="servlet-name" value="CamelServlet"/>
</service-properties>
</service>
</blueprint>
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
<route>
<!-- notice how we can use the servlet scheme which is that osgi:reference above -->
<from uri="servlet:///hello"/>
<process ref="servletProcessor"/>
</route>
</camelContext>
</blueprint>
Alternatively - pre Camel 2.6 - you can use an Activator to publish the CamelHttpTransportServlet on
the OSGi platform
1003
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
import java.util.Dictionary;
import java.util.Hashtable;
import org.apache.camel.component.servlet.CamelHttpTransportServlet;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.osgi.context.BundleContextAware;
/**
* HttpService reference.
*/
private ServiceReference httpServiceRef;
/**
* Called when the OSGi framework starts our bundle
*/
public void start(BundleContext bc) throws Exception {
registerServlet(bc);
}
/**
* Called when the OSGi framework stops our bundle
*/
public void stop(BundleContext bc) throws Exception {
if (httpServiceRef != null) {
bc.ungetService(httpServiceRef);
httpServiceRef = null;
}
}
1004
CHAPTER 132. SERVLET
);
registerService = true;
}
}
}
1005
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SERVLETLISTENER COMPONENT
Available as of Camel 2.11
This component is used for bootstrapping Camel applications in web applications. For example
beforehand people would have to find their own way of bootstrapping Camel, or rely on 3rd party
frameworks such as Spring to do it.
SIDEBAR
This component supports Servlet 2.x onwards, which mean it works also in older web
containers; which is the goal of this component. Though Servlet 2.x requires to use a
web.xml file as configuration.
For Servlet 3.x containers you can use annotation driven configuration to boostrap
Camel using the @WebListener, and implement your own class, where you boostrap
Camel. Doing this still puts the challenge how to let end users easily configure Camel,
which you get for free with the old school web.xml file.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-servletlistener</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
USING
You would need to chose one of the following implementations of the abstract class
org.apache.camel.component.servletlistener.CamelServletContextListener.
<web-app>
<!-- the test parameter is only to be used for unit testing -->
<!-- you should not use this option for production usage -->
<context-param>
<param-name>test</param-name>
<param-value>true</param-value>
</context-param>
1006
CHAPTER 133. SERVLETLISTENER COMPONENT
<!-- you can configure any of the properties on CamelContext, eg setName will be configured as
below -->
<context-param>
<param-name>name</param-name>
<param-value>MyCamel</param-value>
</context-param>
<!-- register Camel as a listener so we can bootstrap Camel when the web application starts -->
<listener>
<listener-
class>org.apache.camel.component.servletlistener.SimpleCamelServletContextListener</listener-
class>
</listener>
</web-app>
OPTIONS
The org.apache.camel.component.servletlistener.CamelServletContextListener supports the
following options which can be configured as context-param in the web.xml file.
1007
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1008
CHAPTER 133. SERVLETLISTENER COMPONENT
EXAMPLES
See Servlet Tomcat No Spring Example .
CONFIGURING ROUTES
You need to configure which routes to use in the web.xml file. You can do this in a number of ways,
though all the parameters must be prefixed with "routeBuilder".
<context-param>
<param-name>routeBuilder-MyRoute</param-name>
<param-value>org.apache.camel.component.servletlistener.MyRoute</param-value>
</context-param>
You can specify multiple classes in the same param-value as shown below:
<context-param>
<param-name>routeBuilder-routes</param-name>
<!-- we can define multiple values separated by comma -->
<param-value>
org.apache.camel.component.servletlistener.MyRoute,
org.apache.camel.component.servletlistener.routes.BarRouteBuilder
</param-value>
</context-param>
The name of the parameter does not have a meaning at runtime. It just need to be unique and start with
"routeBuilder". In the example above we have "routeBuilder-routes". But you could just as well have
named it "routeBuilder.foo".
<context-param>
<param-name>routeBuilder-MyRoute</param-name>
<!-- define the routes using package scanning by prefixing with packagescan: -->
<param-value>packagescan:org.apache.camel.component.servletlistener.routes</param-value>
</context-param>
1009
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<context-param>
<param-name>routeBuilder-MyRoute</param-name>
<param-value>classpath:routes/myRoutes.xml</param-value>
</context-param>
<route id="foo">
<from uri="direct:foo"/>
<to uri="mock:foo"/>
</route>
<route id="bar">
<from uri="direct:bar"/>
<to uri="mock:bar"/>
</route>
</routes>
Notice that in the XML file the root tag is <routes> which must use the namespace
"http://camel.apache.org/schema/spring". This namespace is having the spring in the name, but that
is because of historical reasons, as Spring was the first and only XML DSL back in the time. At runtime
no Spring JARs is needed. Maybe in Camel 3.0 the namespace can be renamed to a generic name.
CONFIGURING JMX
Here is a snippet of a web.xml configuration for configuring JMX, such as disabling JMX.
<!-- configure JMX by using names that is prefixed with jmx. -->
<!-- in this example we disable JMX -->
<context-param>
1010
CHAPTER 133. SERVLETLISTENER COMPONENT
<param-name>jmx.disabled</param-name>
<param-value>true</param-value>
</context-param>
/**
* Our custom {@link CamelContextLifecycle} which allows us to enlist beans in the {@link
JndiContext}
* so the Camel application can lookup the beans in the {@link org.apache.camel.spi.Registry}.
* <p/>
* We can of course also do other kind of custom logic as well.
*/
public class MyLifecycle implements CamelContextLifecycle<SimpleRegistry> {
@Override
public void beforeStart(ServletCamelContext camelContext, SimpleRegistry registry) throws
Exception {
// enlist our bean(s) in the registry
registry.put("myBean", new HelloBean());
}
@Override
public void afterStart(ServletCamelContext camelContext, SimpleRegistry registry) throws
Exception {
// noop
}
@Override
public void beforeStop(ServletCamelContext camelContext, SimpleRegistry registry) throws
Exception {
// noop
}
@Override
public void afterStop(ServletCamelContext camelContext, SimpleRegistry registry) throws
Exception {
// unbind our bean when Camel has been stopped
registry.remove("myBean");
}
}
1011
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Then we need to register this class in the web.xml file as shown below, using the parameter name
"CamelContextLifecycle". The value must be a FQN which refers to the class implementing the
org.apache.camel.component.servletlistener.CamelContextLifecycle interface.
<context-param>
<param-name>CamelContextLifecycle</param-name>
<param-value>org.apache.camel.component.servletlistener.MyLifecycle</param-value>
</context-param>
As we enlisted our HelloBean Bean using the name "myBean" we can refer to this Bean in the Camel
routes as shown below:
1012
CHAPTER 134. SHIRO SECURITY
The shiro-security component in Camel is a security focused component, based on the Apache Shiro
security project.
Apache Shiro is a powerful and flexible open-source security framework that cleanly handles
authentication, authorization, enterprise session management and cryptography. The objective of the
Apache Shiro project is to provide the most robust and comprehensive application security framework
available while also being very easy to understand and extremely simple to use.
This camel shiro-security component allows authentication and authorization support to be applied to
different segments of a camel route.
Shiro security is applied on a route using a Camel Policy. A Policy in Camel utilizes a strategy pattern
for applying interceptors on Camel Processors. It offering the ability to apply cross-cutting concerns
(for example. security, transactions etc) on sections/segments of a camel route.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-shiro</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
Configuration details are provided to the ShiroSecurityPolicy using an Ini file (properties file) or an Ini
object. The Ini file is a standard Shiro configuration file containing user/role details as shown below
[users]
# user 'ringo' with password 'starr' and the 'sec-level1' role
ringo = starr, sec-level1
george = harrison, sec-level2
john = lennon, sec-level3
paul = mccartney, sec-level3
[roles]
# 'sec-level3' role has all permissions, indicated by the
# wildcard '*'
sec-level3 = *
1013
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
sec-level2 = zone1:*
SHIROSECURITYPOLICY OPTIONS
1014
CHAPTER 134. SHIRO SECURITY
1015
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:secureEndpoint").
to("log:incoming payload").
policy(securityPolicy).
to("mock:success");
}
};
}
from("direct:secureEndpoint").
to("log:incoming payload").
policy(securityPolicy).
to("mock:success");
}
};
}
1016
CHAPTER 134. SHIRO SECURITY
from("direct:client").
process(shiroSecurityTokenInjector).
to("direct:secureEndpoint");
Given below is an example of how a request may be sent using a ProducerTemplate in Camel along
with a SecurityToken
@Test
public void testSuccessfulShiroAuthenticationWithNoAuthorization() throws Exception {
//Incorrect password
ShiroSecurityToken shiroSecurityToken = new ShiroSecurityToken("ringo", "stirr");
successEndpoint.expectedMessageCount(1);
failureEndpoint.expectedMessageCount(0);
template.send("direct:secureEndpoint", shiroSecurityTokenInjector);
successEndpoint.assertIsSatisfied();
failureEndpoint.assertIsSatisfied();
}
USING SHIROSECURITYTOKEN
You can send a message to a Camel route with a header of key
ShiroSecurityConstants.SHIRO_SECURITY_TOKEN of the type
org.apache.camel.component.shiro.security.ShiroSecurityToken that contains the username and
password. For example:
1017
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can also provide the username and password in two different headers as shown below:
When you use the username and password headers, then the ShiroSecurityPolicy in the Camel route
will automatic transform those into a single header with key
ShiroSecurityConstants.SHIRO_SECURITY_TOKEN with the token. Then token is either a
ShiroSecurityToken instance, of a base64 representation as a String (the latter is when you have set
base64=true).
1018
CHAPTER 135. SIP
SIP COMPONENT
Available as of Camel 2.5
The sip component in Camel is a communication component, based on the Jain SIP implementation
(available under the JCP license).
Session Initiation Protocol (SIP) is an IETF-defined signaling protocol, widely used for controlling
multimedia communication sessions such as voice and video calls over Internet Protocol (IP).The SIP
protocol is an Application Layer protocol designed to be independent of the underlying transport layer;
it can run on Transmission Control Protocol (TCP), User Datagram Protocol (UDP) or Stream Control
Transmission Protocol (SCTP).
The Camel SIP component only supports the SIP Publish and Subscribe capability as described in the
RFC3903 - Session Initiation Protocol (SIP) Extension for Event
Camel SIP Producers (Event Publishers) and SIP Consumers (Event Subscribers) communicate event &
state information to each other using an intermediary entity called a SIP Presence Agent (a stateful
brokering entity).
For SIP based communication, a SIP Stack with a listener must be instantiated on both the SIP
Producer and Consumer (using separate ports if using localhost). This is necessary in order to support
the handshakes & acknowledgements exchanged between the SIP Stacks during communication.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-sip</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The URI scheme for a sip endpoint is as follows:
sip://johndoe@localhost:99999[?options]
sips://johndoe@localhost:99999/[?options]
This component supports producer and consumer endpoints for both TCP and UDP.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
1019
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The SIP Component offers an extensive set of configuration options & capability to create custom
stateful headers needed to propagate state via the SIP protocol.
1020
CHAPTER 135. SIP
1021
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Name Description
1022
CHAPTER 135. SIP
producerTemplate.sendBodyAndHeader(
"sip://agent@localhost:5152?
stackName=client&eventHeaderName=evtHdrName&eventId=evtid&fromUser=user2&fromHost=localho
st&fromPort=3534",
"EVENT_A",
"REQUEST_METHOD",
Request.PUBLISH);
1023
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
using a registry based eventHeader called evtHdrName. The evtHdrName contains the Event
which is se to "Event_A"
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
// Create PresenceAgent
from("sip://agent@localhost:5152?
stackName=PresenceAgent&presenceAgent=true&eventHeaderName=evtHdrName&eventId=evtid")
.to("mock:neverland");
}
};
}
The Camel SIP component also ships with a Presence Agent that is meant to be used for Testing
and Demo purposes only. An example of instantiating a Presence Agent is given above.
Note that the Presence Agent is set up as a user agent@localhost:5152 and is capable of
communicating with both Publisher as well as Subscriber. It has a separate SIP stackName distinct
from Publisher as well as Subscriber. While it is set up as a Camel Consumer, it does not actually send
any messages along the route to the endpoint "mock:neverland".
1024
CHAPTER 136. SJMS
SJMS COMPONENT
Available as of Camel 2.11
The Simple JMS Component, or SJMS, is a JMS client for use with Camel that uses well known best
practices when it comes to JMS client creation and configuration. SJMS contains a brand new JMS
client API written explicitly for Camel eliminating third party messaging implementations keeping it
light and resilient. The following features are included:
Support for Customizable Transaction Commit Strategies (Local JMS Transactions only)
S stands for Simple and Standard and Springless. Also camel-jms was already taken. :-)
WARNING
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-sjms</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
1025
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
URI FORMAT
sjms:[queue:|topic:]destinationName[?options]
sjms:FOO.BAR
sjms:queue:FOO.BAR
To connect to a topic, you must include the topic: prefix. For example, to connect to the topic,
Stocks.Prices, use:
sjms:topic:Stocks.Prices
You append query options to the URI using the following format, ?option=value&option=value&...
headerFilterStrategy DefaultJmsKeyForm
atStrategy
1026
CHAPTER 136. SJMS
keyFormatStrategy DefaultJmsKeyForm
atStrategy
transactionCommitS null
trategy
Below is an example of how to configure the SjmsComponent with its required ConnectionFactory
provider. It will create a single connection by default and store it using the components internal pooling
APIs to ensure that it is able to service Session creation requests in a thread safe manner.
For a SjmsComponent that is required to support a durable subscription, you can override the default
ConnectionFactoryResource instance and set the clientId property.
1027
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PRODUCER USAGE
from("direct:start")
.to("sjms:queue:bar");
1028
CHAPTER 136. SJMS
INOUT PRODUCER
To enable InOut behavior append the exchangePattern attribute to the URI. By default it will use a
dedicated TemporaryQueue for each consumer.
from("direct:start")
.to("sjms:queue:bar?exchangePattern=InOut");
You can specify a namedReplyTo though which can provide a better monitor point.
from("direct:start")
.to("sjms:queue:bar?exchangePattern=InOut&namedReplyTo=my.reply.to.queue");
1029
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CONSUMER USAGE
from("sjms:queue:bar")
.to("mock:result");
INOUT CONSUMER
To enable InOut behavior append the exchangePattern attribute to the URI.
from("sjms:queue:in.out.test?exchangePattern=InOut")
.transform(constant("Bye Camel"));
The ConnectionResource provides methods for borrowing and returning Connections as needed is the
contract used to provide Connection pools to the SJMS component. A user should use when it is
necessary to integrate SJMS with an external connection pooling manager.
It is recommended though that for standard ConnectionFactory providers you use the
ConnectionFactoryResource implementation that is provided with SJMS as-is or extend as it is
optimized for this component.
1030
CHAPTER 136. SJMS
@Override
public Connection borrowConnection() throws Exception {
Connection answer = pcf.createConnection();
answer.start();
return answer;
}
@Override
public Connection borrowConnection(long timeout) throws Exception {
// SNIPPED...
}
@Override
public void returnConnection(Connection connection) throws Exception {
// Do nothing since there isn't a way to return a Connection
// to the instance of PooledConnectionFactory
log.info("Connection returned");
}
}
To see the full example of its usage please refer to the ConnectionResourceIT.
1031
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
If when producing a batch of messages there is the need to set headers that are unique to each
message you can use the SJMS BatchMessage class. When the SjmsProducer encounters a
BatchMessage List it will iterate each BatchMessage and publish the included payload and headers.
Below is an example of using the BatchMessage class. First we create a List of BatchMessages:
template.sendBody("sjms:queue:batch.queue", messages);
The SjmsConsumer endpoint is a straitforward implementation that will process X messages before
committing them with the associated Session. To enable batched transaction on the consumer first
enable transactions by setting the transacted parameter to true and then adding the
transactionBatchCount and setting it to any value that is greater than 0. For example the following
configuration will commit the Session every 10 messages:
sjms:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10
If an exception occurs during the processing of a batch on the consumer endpoint, the Session
rollback is invoked causing the messages to be redelivered to the next available consumer. The
counter is also reset to 0 for the BatchTransactionCommitStrategy for the associated Session as well.
It is the responsibility of the user to ensure they put hooks in their processors of batch messages to
watch for messages with the JMSRedelivered header set to true. This is the indicator that messages
were rolled back at some point and that a verification of a successful processing should occur.
A transacted batch consumer also carries with it an instance of an internal timer that waits a default
amount of time (5000ms) between messages before committing the open transactions on the Session.
The default value of 5000ms (minimum of 1000ms) should be adequate for most use-cases but if
further tuning is necessary simply set the transactionBatchTimeout parameter.
sjms:queue:transacted.batch.consumer?
transacted=true&transactionBatchCount=10&transactionBatchTimeout=2000
1032
CHAPTER 136. SJMS
The minimal value that will be accepted is 1000ms as the amount of context switching may cause
unnecessary performance impacts without gaining benefit.
The producer endpoint is handled much differently though. With the producer after each message is
delivered to its destination the Exchange is closed and there is no longer a reference to that message.
To make a available all the messages available for redelivery you simply enable transactions on a
Producer Endpoint that is publishing BatchMessages. The transaction will commit at the conclusion of
the exchange which includes all messages in the batch list. Nothing additional need be configured. For
example:
template.sendBody("sjms:queue:batch.queue?transacted=true", messages);
ADDITIONAL NOTES
For the exchange.in.header the following rules apply for the header keys:
Keys starting with JMS or JMSX are reserved. exchange.in.headers keys must be literals and all be
valid Java identifiers (do not use dots in the key name). Camel replaces dots & hyphens and the reverse
when when consuming JMS messages:
is replaced by DOT and the reverse replacement when Camel consumes the message.
is replaced by HYPHEN and the reverse replacement when Camel consumes the message. See
also the option jmsKeyFormatStrategy, which allows use of your own custom strategy for
formatting keys.
For the exchange.in.header, the following rules apply for the header values:
MESSAGE CONTENT
To deliver content over the wire we must ensure that the body of the message that is being delivered
adheres to the JMS Message Specification. Therefore, all that are produced must either be primitives
or their counter objects (such as Integer, Long, Character). The types, String, CharSequence, Date,
BigDecimal and BigInteger are all converted to their toString() representation. All other types are
dropped.
CLUSTERING
1033
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
When using InOut with SJMS in a clustered environment you must either use TemporaryQueue
destinations or use a unique named reply to destination per InOut producer endpoint. Message
correlation is handled by the endpoint, not with message selectors at the broker. The InOut Producer
Endpoint uses Java Concurrency Exchangers cached by the Message JMSCorrelationID. This provides
a nice performance increase while reducing the overhead on the broker since all the messages are
consumed from the destination in the order they are produced by the interested consumer.
Currently the only correlation strategy is to use the JMSCorrelationId. The InOut Consumer uses this
strategy as well ensuring that all responses messages to the included JMSReplyTo destination also
have the JMSCorrelationId copied from the request as well.
TRANSACTION SUPPORT
SJMS currently only supports the use of internal JMS Transactions. There is no support for the Camel
Transaction Processor or the Java Transaction API (JTA).
<route id="inout.named.reply.to.producer.route">
<from uri="direct:invoke.named.reply.to.queue" />
<to uri="sjms:queue:named.reply.to.queue?
namedReplyTo=my.response.queue&xchangePattern=InOut" />
</route>
Springless refers to moving away from the dependency on the Spring JMS API. A new JMS client API is
being developed from the ground up to power SJMS.
1034
CHAPTER 137. SMPP
SMPP COMPONENT
This component provides access to an SMSC (Short Message Service Center) over the SMPP protocol
to send and receive SMS. The JSMPP library is used for the protocol implementation.
The Camel component currently operates as an ESME (External Short Messaging Entity) and not as an
SMSC itself.
Starting with Camel 2.9 you are also able to execute ReplaceSm, QuerySm, SubmitMulti, CancelSm
and DataSm.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-smpp</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
SMS LIMITATIONS
SMS is neither reliable or secure. Users who require reliable and secure delivery may want to consider
using the XMPP or SIP components instead, combined with a smartphone app supporting the chosen
protocol.
Reliability: although the SMPP standard offers a range of feedback mechanisms to indicate
errors, non-delivery and confirmation of delivery it is not uncommon for mobile networks to
hide or simulate these responses. For example, some networks automatically send a delivery
confirmation for every message even if the destination number is invalid or not switched on.
Some networks silently drop messages if they think they are spam. Spam detection rules in
the network may be very crude, sometimes more than 100 messages per day from a single
sender may be considered spam.
Security: there is basic encryption for the last hop from the radio tower down to the recipient
handset. SMS messages are not encrypted or authenticated in any other part of the network.
Some operators allow staff in retail outlets or call centres to browse through the SMS message
histories of their customers. Message sender identity can be easily forged. Regulators and
even the mobile telephone industry itself has cautioned against the use of SMS in two-factor
authentication schemes and other purposes where security is important.
While the Camel component makes it as easy as possible to send messages to the SMS network, it can
not offer an easy solution to these problems.
Data coding is an 8 bit field in the SMPP wire format. Alphabet corresponds to bits 0-3 of the data
coding field. For some types of message, where a message class is used (by setting bit 5 of the data
1035
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
coding field), the lower two bits of the data coding field are not interpreted as alphabet and only bits 2
and 3 impact the alphabet.
Furthermore, the current version of the JSMPP library only seems to support bits 2 and 3, assuming
that bits 0 and 1 are used for the message class. This is why the Alphabet class in JSMPP does not
support the value 3 (binary 0011) which indicates ISO-8859-1.
Although JSMPP provides a representation of the message class parameter, the Camel component
does not currently provide a way to set it other than manually setting the corresponding bits in the
data coding field.
When setting the data coding field in the outgoing message, the Camel component considers the
following values and uses the first one it can find:
In addition to trying to send the data coding value to the SMSC, the Camel component also tries to
analyse the message body, convert it to a Java String (Unicode) and convert that to a byte array in the
corresponding alphabet When deciding which alphabet to use in the byte array, the Camel SMPP
component does not consider the data coding value (header or configuration), it only considers the
specified alphabet (from either the header or endpoint parameter).
If some characters in the String cannot be represented in the chosen alphabet, they may be replaced
by the question mark, ?, symbol. Users of the API may want to consider checking if their message body
can be converted to ISO-8859-1 before passing it to the component and if not, setting the alphabet
header to request UCS-2 encoding. If the alphabet and data coding options are not specified at all then
the component may try to detect the required encoding and set the data coding for you.
The list of alphabet codes are specified in the SMPP specification v3.4, section 5.2.19. One notable
limitation of the SMPP specification is that there is no alphabet code for explicitly requesting use of
the GSM 3.38 (7 bit) character set. Choosing the value 0 for the alphabet selects the SMSC default
alphabet, this usually means GSM 3.38 but it is not guaranteed. The SMPP gateway Nexmo actually
allows the default to be mapped to any other character set with a control panel option. It is suggested
that users check with their SMSC operator to confirm exactly which character set is being used as the
default.
If the GSM 3.38 alphabet is used, the component will pack up to 160 characters into the 140 byte
message body. If an 8 bit character set is used (e.g. ISO-8859-1 for western Europe) then 140
characters will be allowed within the 140 byte message body. If 16 bit UCS-2 encoding is used then just
70 characters fit into each 140 byte message.
Some SMSC providers implement throttling rules. Each part of a message that has been split may be
counted separately by the provider's throttling mechanism. The Camel Throttler component can be
useful for throttling messages in the SMPP route before handing them to the SMSC.
URI FORMAT
1036
CHAPTER 137. SMPP
smpp://[username@]hostname[:port][?options]
smpps://[username@]hostname[:port][?options]
If no username is provided, then Apache Camel will provide the default value smppclient. If no port
number is provided, then Apache Camel will provide the default value 2775.Camel 2.3: If the protocol
name is smpps, camel-smpp with try to use SSLSocket to init a connection to the server.
You can append query options to the URI in the following format, ?option=value&option=value&...
URI OPTIONS
0: SMSC Default
Alphabet
3: Latin 1 (ISO-8859-1)
8: UCS2 (ISO/IEC-
10646)
1037
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1038
CHAPTER 137. SMPP
WAP : Wireless
Application Protocol
USSD : Unstructured
Supplementary Services
Data
0: Unknown
1: International
2: National
3: Network Specific
4: Subscriber Number
5: Alphanumeric
6: Abbreviated
1039
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
0: Unknown
1: International
2: National
3: Network Specific
4: Subscriber Number
5: Alphanumeric
6: Abbreviated
0: Unknown
1: ISDN (E163/E164)
2: Data (X.121)
3: Telex (F.69)
8: National
9: Private
10: ERMES
1040
CHAPTER 137. SMPP
0: Unknown
1: ISDN (E163/E164)
2: Data (X.121)
3: Telex (F.69)
8: National
9: Private
10: ERMES
0: Level 0 (lowest)
priority
1: Level 1 priority
2: Level 2 priority
3: Level 3 (highest)
priority
0: Don't replace
1: Replace
1041
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
0: Unknown
1: International
2: National
3: Network Specific
4: Subscriber Number
5: Alphanumeric
6: Abbreviated
0: Unknown
1: ISDN (E163/E164)
2: Data (X.121)
3: Telex (F.69)
8: National
9: Private
10: ERMES
1042
CHAPTER 137. SMPP
1043
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
TRUNCATE - long
messages are split and
only the first fragment
will be sent to the SMSC.
Some carriers drop
subsequent fragments
so this reduces load on
the SMPP connection
sending parts of a
message that will never
be delivered.
REJECT - if a message
would need to be split, it
is rejected with an SMPP
NegativeResponseEx
ception and the reason
code signifying the
message is too long.
smpp://smppclient@localhost:2775?
password=password&enquireLinkTimer=3000&transactionTimer=5000&systemType=consumer
1044
CHAPTER 137. SMPP
0: Unknown
1: International
2: National
3: Network Specific
4: Subscriber Number
5: Alphanumeric
6: Abbreviated
0: Unknown
1: ISDN (E163/E164)
2: Data (X.121)
3: Telex (F.69)
8: National
9: Private
10: ERMES
1045
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
0: Unknown
1: International
2: National
3: Network Specific
4: Subscriber Number
5: Alphanumeric
6: Abbreviated
0: Unknown
1: ISDN (E163/E164)
2: Data (X.121)
3: Telex (F.69)
8: National
9: Private
10: ERMES
1046
CHAPTER 137. SMPP
WAP : Wireless
Application Protocol
USSD : Unstructured
Supplementary Services
Data
0: No SMSC delivery
receipt requested.
1047
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
0: Level 0 (lowest)
priority
1: Level 1 priority
2: Level 2 priority
3: Level 3 (highest)
priority
0: Don't replace
1: Replace
1048
CHAPTER 137. SMPP
1049
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The following message headers are used by the SMPP producer to set the response from the SMSC in
the message header
1050
CHAPTER 137. SMPP
1051
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1052
CHAPTER 137. SMPP
1053
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1054
CHAPTER 137. SMPP
1055
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
JSMPP LIBRARY
See the documentation of the JSMPP Library for more details about the underlying library.
EXCEPTION HANDLING
This component supports the general Camel exception handling capabilities.
When an error occurs sending a message with SubmitSm (the default action), the
org.apache.camel.component.smpp.SmppException is thrown with a nested exception,
org.jsmpp.extra.NegativeResponseException. Call
NegativeResponseException.getCommandStatus() to obtain the exact SMPP negative response
code, the values are explained in the SMPP specification 3.4, section 5.1.3.
Camel 2.8 onwarts: When the SMPP consumer receives a DeliverSm or DataSm short message and
the processing of these messages fails, you can also throw a ProcessRequestException instead of
handle the failure. In this case, this exception is forwarded to the underlying JSMPP library which will
return the included error code to the SMSC. This feature is useful to e.g. instruct the SMSC to resend
the short message at a later time. This could be done with the following lines of code:
from("smpp://smppclient@localhost:2775?
password=password&enquireLinkTimer=3000&transactionTimer=5000&systemType=consumer")
.doTry()
.to("bean:dao?method=updateSmsState")
.doCatch(Exception.class)
.throwException(new ProcessRequestException("update of sms state failed", 100))
.end();
Please refer to the SMPP specification for the complete list of error codes and their meanings.
SAMPLES
A route which sends an SMS using the Java DSL:
from("direct:start")
.to("smpp://smppclient@localhost:2775?
password=password&enquireLinkTimer=3000&transactionTimer=5000&systemType=producer");
<route>
<from uri="direct:start"/>
<to uri="smpp://smppclient@localhost:2775?
password=password&nquireLinkTimer=3000&ransactionTimer=5000&ystemType=producer"/>
</route>
from("smpp://smppclient@localhost:2775?
password=password&enquireLinkTimer=3000&transactionTimer=5000&systemType=consumer")
.to("bean:foo");
1056
CHAPTER 137. SMPP
<route>
<from uri="smpp://smppclient@localhost:2775?
password=password&nquireLinkTimer=3000&ransactionTimer=5000&ystemType=consumer"/>
<to uri="bean:foo"/>
</route>
SMSC SIMULATOR
If you need an SMSC simulator for your test, you can use the simulator provided by Logica.
DEBUG LOGGING
This component has log level DEBUG, which can be helpful in debugging problems. If you use log4j,
you can add the following line to your configuration:
log4j.logger.org.apache.camel.component.smpp=DEBUG
1057
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SNMP COMPONENT
The snmp: component gives you the ability to poll SNMP capable devices or receiving traps.
URI FORMAT
snmp://hostname[:port][?Options]
The component supports polling OID values from an SNMP enabled device and receiving traps.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
snmpVersion 0 (which means SNMPv1) Sets the SNMP version for the
request.
1058
CHAPTER 138. SNMP
1.3.6.1.2.1.1.3.0
1.3.6.1.2.1.25.3.2.1.5.1
1.3.6.1.2.1.25.3.5.1.1.1
1.3.6.1.2.1.43.5.1.1.11.1
1059
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
As you maybe recognized there is one more result than requested....1.3.6.1.2.1.1.1.0. This one is filled in
by the device automatically in this special case. So it may absolutely happen, that you receive more
than you requested...be prepared.
EXAMPLES
Polling a remote device:
snmp:192.168.178.23:161?protocol=udp&type=POLL&oids=1.3.6.1.2.1.1.5.0
snmp:127.0.0.1:162?protocol=udp&type=TRAP
From Camel 2.10.0, you can get the community of SNMP TRAP with message header 'securityName',
peer address of the SNMP TRAP with message header 'peerAddress'.
from("snmp:192.168.178.23:161?protocol=udp&type=POLL&oids=1.3.6.1.2.1.1.5.0").
convertBodyTo(String.class).
to("activemq:snmp.states");
1060
CHAPTER 139. SOLR
SOLR COMPONENT
Available as of Camel 2.9
The Solr component allows you to interface with an Apache Lucene Solr server (based on SolrJ 3.5.0).
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-solr</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
The URI format is as follows:
solr://host[:port]/solr?[options]
solrs://host[:port]/solr ?[options]
solrCloud://host[:port]/solr?[options]
ENDPOINT OPTIONS
The following SolrServer options may be configured on the Solr endpoint.
1061
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MESSAGE OPERATIONS
The following Solr operations are currently supported. Simply set an exchange header with a key of
SolrOperation and a value set to one of the following. Some operations also require the message body
to be set.
1062
CHAPTER 139. SOLR
EXAMPLE
Below is a simple INSERT, DELETE and COMMIT example
from("direct:insert")
.setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_INSERT))
.setHeader(SolrConstants.FIELD + "id", body())
.to("solr://localhost:8983/solr");
from("direct:delete")
.setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_DELETE_BY_ID))
.to("solr://localhost:8983/solr");
from("direct:commit")
.setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_COMMIT))
.to("solr://localhost:8983/solr");
<route>
<from uri="direct:insert"/>
<setHeader headerName="SolrOperation">
<constant>INSERT</constant>
</setHeader>
<setHeader headerName="SolrField.id">
<simple>${body}</simple>
</setHeader>
<to uri="solr://localhost:8983/solr"/>
</route>
<route>
<from uri="direct:delete"/>
<setHeader headerName="SolrOperation">
<constant>DELETE_BY_ID</constant>
</setHeader>
<to uri="solr://localhost:8983/solr"/>
</route>
<route>
<from uri="direct:commit"/>
1063
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<setHeader headerName="SolrOperation">
<constant>COMMIT</constant>
</setHeader>
<to uri="solr://localhost:8983/solr"/>
</route>
A client would simply need to pass a message body to the insert route or to the delete route, and then
call the commit route.
template.sendBody("direct:insert", "1234");
template.sendBody("direct:commit", null);
template.sendBody("direct:delete", "1234");
template.sendBody("direct:commit", null);
QUERYING SOLR
Currently, this component doesn't support querying data natively (may be added later). For now, you
can query Solr using HTTP as follows:
1064
CHAPTER 140. SPLUNK
SPLUNK COMPONENT
Available as of Camel 2.13
The Splunk component provides access to Splunk using the Splunk provided client api, and it enables
you to publish and search for events in Splunk.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-splunk</artifactId>
<version>${camel-version}</version>
</dependency>
URI FORMAT
splunk://[endpoint]?[options]
PRODUCER ENDPOINTS:
Endpoint Description
Example
from("direct:start").convertBodyTo(SplunkEvent.class)
.to("splunk://submit?
username=user&password=123&index=myindex&sourceType=someSourceType&source=mySource"
)...
CONSUMER ENDPOINTS:
1065
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Endpoint Description
Example
from("splunk://normal?delay=5s&username=user&password=123&initEarliestTime=-
10s&search=search index=myindex sourcetype=someSourcetype")
.to("direct:search-result");
camel-splunk creates a route exchange per search result with a SplunkEvent in the body.
URI OPTIONS
1066
CHAPTER 140. SPLUNK
MESSAGE BODY
Splunk operates on data in key/value pairs. The SplunkEvent class is a placeholder for such data, and
should be in the message body for the producer. Likewise it will be returned in the body per search
result for the consumer.
USE CASES
Search Twitter for tweets with music and publish events to Splunk
from("twitter://search?
type=polling&keywords=music&delay=10&consumerKey=abc&consumerSecret=def&accessToken=hij&a
ccessTokenSecret=xxx")
.convertBodyTo(SplunkEvent.class)
.to("splunk://submit?username=foo&password=bar&index=camel-
tweets&sourceType=twitter&source=music-tweets");
1067
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
@Converter
public class Tweet2SplunkEvent {
@Converter
public static SplunkEvent convertTweet(Status status) {
SplunkEvent data = new SplunkEvent("twitter-message", null);
//data.addPair("source", status.getSource());
data.addPair("from_user", status.getUser().getScreenName());
data.addPair("in_reply_to", status.getInReplyToScreenName());
data.addPair(SplunkEvent.COMMON_START_TIME, status.getCreatedAt());
data.addPair(SplunkEvent.COMMON_EVENT_ID, status.getId());
data.addPair("text", status.getText());
data.addPair("retweet_count", status.getRetweetCount());
if (status.getPlace() != null) {
data.addPair("place_country", status.getPlace().getCountry());
data.addPair("place_name", status.getPlace().getName());
data.addPair("place_street", status.getPlace().getStreetAddress());
}
if (status.getGeoLocation() != null) {
data.addPair("geo_latitude", status.getGeoLocation().getLatitude());
data.addPair("geo_longitude", status.getGeoLocation().getLongitude());
}
return data;
}
}
from("splunk://normal?username=foo&password=bar&initEarliestTime=-2m&search=search
index=camel-tweets sourcetype=twitter")
.log("${body}");
OTHER COMMENTS
Splunk comes with a variety of options for leveraging machine generated data with prebuilt apps for
analyzing and displaying this. For example the jmx app. could be used to publish jmx attributes, eg.
route and jvm metrics to Splunk, and displaying this on a dashboard.
SEE ALSO
Configuring Camel
Component
Endpoint
Getting Started
1068
CHAPTER 141. SPRINGBATCH
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-batch</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
spring-batch:jobName[?options]
Where jobName represents the name of the Spring Batch job located in the Camel registry.
WARNING
This component can only be used to define producer endpoints, which means that
you cannot use the Spring Batch component in a from() statement.
OPTIONS
USAGE
When Spring Batch component receives the message, it triggers the job execution. The job will be
executed using the org.springframework.batch.core.launch.JobLaucher instance resolved
according to the following algorithm:
1069
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
if jobLauncherRef option is set on the component, then search Camel Registry for the
JobLauncher with the given name. Deprecated and will be removed in Camel 3.0!
if there is JobLauncher registered in the Camel Registry under jobLauncher name, then use
it.
if none of the steps above allow to resolve the JobLauncher and there is exactly one
JobLauncher instance in the Camel Registry, then use it.
All headers found in the message are passed to the JobLauncher as job parameters. String, Long,
Double and java.util.Date values are copied to the
org.springframework.batch.core.JobParametersBuilder - other data types are converted to Strings.
EXAMPLES
Triggering the Spring Batch job execution:
from("direct:startBatch").to("spring-batch:myJob");
Triggering the Spring Batch job execution with the JobLauncher set explicitly.
from("direct:startBatch").to("spring-batch:myJob?jobLauncherRef=myJobLauncher");
Starting from the Camel 2.11.1JobExecution instance returned by the JobLauncher is forwarded by
the SpringBatchProducer as the output message. You can use the JobExecution instance to perform
some operations using the Spring Batch API directly.
from("direct:startBatch").to("spring-batch:myJob").to("mock:JobExecutions");
...
MockEndpoint mockEndpoint = ...;
JobExecution jobExecution =
mockEndpoint.getExchanges().get(0).getIn().getBody(JobExecution.class);
BatchStatus currentJobStatus = jobExecution.getStatus();
SUPPORT CLASSES
Apart from the Component, Camel Spring Batch provides also support classes, which can be used to
hook into Spring Batch infrastructure.
CAMELITEMREADER
CamelItemReader can be used to read batch data directly from the Camel infrastructure.
For example the snippet below configures Spring Batch to read data from JMS queue.
<bean id="camelReader"
class="org.apache.camel.component.spring.batch.support.CamelItemReader">
<constructor-arg ref="consumerTemplate"/>
<constructor-arg value="jms:dataQueue"/>
</bean>
1070
CHAPTER 141. SPRINGBATCH
<batch:job id="myJob">
<batch:step id="step">
<batch:tasklet>
<batch:chunk reader="camelReader" writer="someWriter" commit-interval="100"/>
</batch:tasklet>
</batch:step>
</batch:job>
CAMELITEMWRITER
CamelItemWriter has similar purpose as CamelItemReader, but it is dedicated to write chunk of the
processed data.
For example the snippet below configures Spring Batch to write data to a JMS queue.
<bean id="camelwriter"
class="org.apache.camel.component.spring.batch.support.CamelItemWriter">
<constructor-arg ref="producerTemplate"/>
<constructor-arg value="jms:dataQueue"/>
</bean>
<batch:job id="myJob">
<batch:step id="step">
<batch:tasklet>
<batch:chunk reader="someReader" writer="camelwriter" commit-interval="100"/>
</batch:tasklet>
</batch:step>
</batch:job>
CAMELITEMPROCESSOR
CamelItemProcessor is the implementation of Spring Batch
org.springframework.batch.item.ItemProcessor interface. The latter implementation relays on
Request Reply pattern to delegate the processing of the batch item to the Camel infrastructure. The
item to process is sent to the Camel endpoint as the body of the message.
For example the snippet below performs simple processing of the batch item using the Direct endpoint
and the Simple expression language.
<camel:camelContext>
<camel:route>
<camel:from uri="direct:processor"/>
<camel:setExchangePattern pattern="InOut"/>
<camel:setBody>
<camel:simple>Processed ${body}</camel:simple>
</camel:setBody>
</camel:route>
</camel:camelContext>
<bean id="camelProcessor"
class="org.apache.camel.component.spring.batch.support.CamelItemProcessor">
<constructor-arg ref="producerTemplate"/>
<constructor-arg value="direct:processor"/>
</bean>
1071
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<batch:job id="myJob">
<batch:step id="step">
<batch:tasklet>
<batch:chunk reader="someReader" writer="someWriter" processor="camelProcessor" commit-
interval="100"/>
</batch:tasklet>
</batch:step>
</batch:job>
CAMELJOBEXECUTIONLISTENER
CamelJobExecutionListener is the implementation of the
org.springframework.batch.core.JobExecutionListener interface sending job execution events to
the Camel endpoint.
The example snippet below sends Spring Batch job execution events to the JMS queue.
<bean id="camelJobExecutionListener"
class="org.apache.camel.component.spring.batch.support.CamelJobExecutionListener">
<constructor-arg ref="producerTemplate"/>
<constructor-arg value="jms:batchEventsBus"/>
</bean>
<batch:job id="myJob">
<batch:step id="step">
<batch:tasklet>
<batch:chunk reader="someReader" writer="someWriter" commit-interval="100"/>
</batch:tasklet>
</batch:step>
<batch:listeners>
<batch:listener ref="camelJobExecutionListener"/>
</batch:listeners>
</batch:job>
1072
CHAPTER 142. SPRINGINTEGRATION
URI FORMAT
spring-integration:defaultChannelName[?options]
Where defaultChannelName represents the default channel name which is used by the Spring
Integration Spring context. It will equal to the inputChannel name for the Spring Integration consumer
and the outputChannel name for the Spring Integration provider.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
1073
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
USAGE
The Spring integration component is a bridge that connects Apache Camel endpoints with Spring
integration endpoints through the Spring integration's input channels and output channels. Using this
component, we can send Camel messages to Spring Integration endpoints or receive messages from
Spring integration endpoints in a Camel routing context.
<beans:beans xmlns="http://www.springframework.org/schema/integration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<channel id="inputChannel"/>
<channel id="outputChannel"/>
<channel id="onewayChannel"/>
<service-activator input-channel="inputChannel"
ref="helloService"
method="sayHello"/>
<service-activator input-channel="onewayChannel"
ref="helloService"
method="greet"/>
<beans:bean id="helloService"
class="org.apache.camel.component.spring.integration.HelloWorldService"/>
1074
CHAPTER 142. SPRINGINTEGRATION
<channel id="requestChannel"/>
<channel id="responseChannel"/>
<beans:bean id="myProcessor"
class="org.apache.camel.component.spring.integration.MyProcessor"/>
<beans:beans xmlns="http://www.springframework.org/schema/integration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<channel id="outputChannel"/>
<beans:beans xmlns="http://www.springframework.org/schema/integration"
xmlns:beans="http://www.springframework.org/schema/beans"
1075
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel-si="http://camel.apache.org/schema/spring/integration"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd
http://camel.apache.org/schema/spring/integration
http://camel.apache.org/schema/spring/integration/camel-spring-integration.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd
">
You can bind your source or target to a Apache Camel endpoint as follows:
<!-- We can bind the camelTarget to the camel context's endpoint by specifying the camelEndpointUri
attribute -->
<camel-si:camelTarget id="camelTargetA" camelEndpointUri="direct:EndpointA"
expectReply="false">
<camel-si:camelContextRef>camelTargetContext</camel-si:camelContextRef>
</camel-si:camelTarget>
<beans:bean id="myProcessor"
class="org.apache.camel.component.spring.integration.MyProcessor"/>
1076
CHAPTER 142. SPRINGINTEGRATION
<!-- camelSource will redirect the message coming for direct:EndpointB to the spring requestChannel
channelA -->
<!-- camelSource will redirect the message coming for direct:EndpointC to the spring requestChannel
channelB
then it will pull the response from channelC and put the response message back to direct:EndpointC -
->
1077
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
URI FORMAT
spring-event://default[?options]
Note, at the moment there are no options for this component. That can easily change in future
releases, so please check back.
1078
CHAPTER 144. SPRING LDAP
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-ldap</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
spring-ldap:springLdapTemplate[?options]
Where springLdapTemplate is the name of the Spring LDAP Template bean . In this bean, you configure
the URL and the credentials for your LDAP access.
OPTIONS
USAGE
The component supports producer endpoint only. An attempt to create a consumer endpoint will result
in an UnsupportedOperationException. The body of the message must be a map (an instance of
java.util.Map). This map must contain at least an entry with the key dn that specifies the root node for
the LDAP operation to be performed. Other entries of the map are operation-specific (see below).
The body of the message remains unchanged for the bind and unbind operations. For the search
operation, the body is set to the result of the search, see http://static.springsource.org/spring-
ldap/site/apidocs/org/springframework/ldap/core/LdapTemplate.html#search%28java.lang.String,%20java.lang
1079
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SEARCH
The message body must have an entry with the key filter. The value must be a String representing a
valid LDAP filter, see
http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol#Search_and_Compare.
BIND
The message body must have an entry with the key attributes. The value must be an instance of
javax.naming.directory.Attributes This entry specifies the LDAP node to be created.
UNBIND
No further entries necessary, the node with the specified dn is deleted.
Key definitions
1080
CHAPTER 145. SPRING REDIS
This component allows sending and receiving messages from Redis. Redis is advanced key-value store
where keys can contain strings, hashes, lists, sets and sorted sets. In addition it provides pub/sub
functionality for inter-app communications. Camel provides a producer for executing commands,
consumer for subscribing to pub/sub messages an idempotent repository for filtering out duplicate
messages.
PREREQUISITES
In order to use this component, you must have a Redis server running.
URI FORMAT
spring-redis://host:port[?options]
You can append query options to the URI in the following format, ?options=value&option2=value&...
URI OPTIONS
1081
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
USAGE
1082
CHAPTER 145. SPRING REDIS
HGETALL Get all the fields and CamelRedis.Key (String) Map<String, Object>
values in a hash
1083
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1084
CHAPTER 145. SPRING REDIS
1085
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1086
CHAPTER 145. SPRING REDIS
1087
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1088
CHAPTER 145. SPRING REDIS
1089
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1090
CHAPTER 145. SPRING REDIS
1091
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
REDIS CONSUMER
The consumer subscribes to a channel either by channel name using SUBSCRIBE or a string pattern
using PSUBSCRIBE commands. When a message is sent to the channel using PUBLISH command, it
will be consumed and the message will be available as Camel message body. The message is also
serialized using configured serializer or the default JdkSerializationRedisSerializer.
DEPENDENCIES
Maven users will need to add the following dependency to their pom.xml.
1092
CHAPTER 145. SPRING REDIS
POM.XML
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-redis</artifactId>
<version>${camel-version}</version>
</dependency>
where ${camel-version} must be replaced by the actual version of Camel (2.11 or higher).
1093
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
DEPENDENCIES
As of Camel 2.8 this component ships with Spring-WS 2.0.x which (like the rest of
Camel) requires Spring 3.0.x.
Earlier Camel versions shipped Spring-WS 1.5.9 which is compatible with Spring 2.5.x
and 3.0.x. In order to run earlier versions of camel-spring-ws on Spring 2.5.x you need
to add the spring-webmvc module from Spring 2.5.x. In order to run Spring-WS 1.5.9 on
Spring 3.0.x you need to exclude the OXM module from Spring 3.0.x as this module is
also included in Spring-WS 1.5.9 (see this post)
URI FORMAT
The URI scheme for this component is as follows
spring-ws:[mapping-type:]address[?options]
To expose a web service, mapping-type needs to be set to one of the following values:
1094
CHAPTER 146. SPRING WEB SERVICES
As a consumer the address should contain a value relevant to the specified mapping-type (e.g. a SOAP
action, XPath expression). As a producer the address should be set to the URI of the web service you
are calling upon.
You can append query options to the URI in the following format, ?option=value&option=value&....
OPTIONS
1095
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1096
CHAPTER 146. SPRING WEB SERVICES
MESSAGE HEADERS
1097
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:example").to("spring-ws:http://foo.com/bar")
Remember, if it's a SOAP service you're calling you don't have to include SOAP tags. Spring-WS will
perform the XML-to-SOAP marshaling.
from("direct:example")
.to("spring-ws:http://foo.com/bar?soapAction=http://foo.com&wsAddressingAction=http://bar.com")
Optionally you can override the endpoint options with header values:
template.requestBodyAndHeader("direct:example",
"<foobar xmlns=\"http://foo.com\"><msg>test message</msg></foobar>",
SpringWebserviceConstants.SPRING_WS_SOAP_ACTION, "http://baz.com");
1098
CHAPTER 146. SPRING WEB SERVICES
You can provide the SOAP header(s) as a Camel Message header when sending a message to a spring-
ws endpoint, for example given the following SOAP header in a String
We can set the body and header on the Camel Message as follows:
exchange.getIn().setBody(body);
exchange.getIn().setHeader(SpringWebserviceConstants.SPRING_WS_SOAP_HEADER,
soapHeader);
And then send the Exchange to a spring-ws endpoint to call the Web Service.
Likewise the spring-ws consumer will also enrich the Camel Message with the SOAP header.
exchange.getOut().getHeaders().put("myCustom","myHeaderValue")
exchange.getIn().addAttachment("myAttachment", new DataHandler(...))
Note: If the exchange header in the pipeline contains text, it generates Qname(key)=value attribute in
the soap header. Recommended is to create a QName class directly and put into any key into header.
<bean id="axiomMessageFactory"
class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
<property name="payloadCaching" value="false" />
<property name="attachmentCaching" value="true" />
<property name="attachmentCacheThreshold" value="1024" />
</bean>
1099
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-impl</artifactId>
<version>1.2.13</version>
<scope>runtime</scope>
</dependency>
3. Add your attachment into the pipeline, for example using a Processor implementation.
from("direct:send")
.process(new Attachement())
.to("spring-ws:http://localhost:8089/mySoapService?
soapAction=mySoap&messageFactory=axiomMessageFactory");
5. Now, your producer will generate MTOM message with otpmized attachments.
to("spring-ws:http://yourdomain.com?messageFilter=#myEndpointSpecificMessageFilter");
If you want to create your own MessageFilter, consider overriding the following methods in the default
implementation of MessageFilter in class BasicMessageFilter:
1100
CHAPTER 146. SPRING WEB SERVICES
from("direct:example")
.to("spring-ws:http://foo.com/bar?
messageFactory=#messageFactory&messageSender=#messageSender")
Spring configuration:
By default the MessageDispatcherServlet will look for a Spring XML named /WEB-INF/spring-ws-
servlet.xml. To use Camel with Spring-WS the only mandatory bean in that XML file is
CamelEndpointMapping. This bean allows the MessageDispatcher to dispatch web service requests
to your routes.
web.xml
<web-app>
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-ws</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
1101
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
spring-ws-servlet.xml
<bean id="endpointMapping"
class="org.apache.camel.component.spring.ws.bean.CamelEndpointMapping" />
More information on setting up Spring-WS can be found in Writing Contract-First Web Services .
from("spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
The following route will receive web service requests containing the http://example.com/GetFoo
SOAP action:
from("spring-ws:soapaction:http://example.com/GetFoo?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
from("spring-ws:uri:http://example.com/foobar?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
The route below receives requests that contain the element <foobar>abc</foobar> anywhere inside
the message (and the default namespace).
from("spring-ws:xpathresult:abc?expression=//foobar&endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
1102
CHAPTER 146. SPRING WEB SERVICES
NOTE
The use of the beanname mapping-type is primarily meant for (legacy) situations where
you're already using Spring-WS and have endpoint mappings defined in a Spring XML
file. The beanname mapping-type allows you to wire your Camel route into an existing
endpoint mapping. When you're starting from scratch it's recommended to define your
endpoint mappings as Camel URI's (as illustrated above with endpointMapping) since it
requires less configuration and is more expressive. Alternatively you could use vanilla
Spring-WS with the help of annotations.
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="spring-ws:beanname:QuoteEndpointDispatcher" />
<to uri="mock:example" />
</route>
</camelContext>
<bean id="legacyEndpointMapping"
class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
<property name="mappings">
<props>
<prop key="{http://example.com/}GetFuture">FutureEndpointDispatcher</prop>
<prop key="{http://example.com/}GetQuote">QuoteEndpointDispatcher</prop>
</props>
</property>
</bean>
<bean id="QuoteEndpointDispatcher"
class="org.apache.camel.component.spring.ws.bean.CamelEndpointDispatcher" />
<bean id="FutureEndpointDispatcher"
class="org.apache.camel.component.spring.ws.bean.CamelEndpointDispatcher" />
POJO (UN)MARSHALLING
Camel's pluggable data formats offer support for POJO/XML marshalling using libraries such as JAXB,
XStream, JibX, Castor and XMLBeans. You can use these data formats in your route to sent and
receive POJOs (Plain Old Java Objects), to and from web services.
When accessing web services you can marshal the request and unmarshal the response message:
from("direct:example").marshal(jaxb).to("spring-ws:http://foo.com/bar").unmarshal(jaxb);
Similarly when providing web services, you can unmarshal XML requests to POJOs and marshal the
response message back to XML:
from("spring-ws:rootqname:{http://example.com/}GetFoo?
endpointMapping=#endpointMapping").unmarshal(jaxb)
.to("mock:example").marshal(jaxb);
1103
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SQL COMPONENT
The sql: component allows you to work with databases using JDBC queries. The difference between
this component and JDBC component is that in case of SQL the query is a property of the endpoint and
it uses message payload as parameters passed to the query.
This component uses spring-jdbc behind the scenes for the actual SQL handling.
a JDBC based repository for the Idempotent Consumer EIP pattern. See further below.
a JDBC based repository for the Aggregator EIP pattern. See further below.
IMPORTANT
When used in conjunction with the camel-cdi component, Java EE annotations make a datasource
available to Camel. The following example uses the @Named annotation so that Camel can locate the
desired datasource:
@Produces
@Named("wildFlyExampleDS")
public DataSource getDataSource() {
return dataSource;
}
}
The datasource can now be referenced through the dataSource parameter on the camel-sql endpoint
configuration, as follows:
@ApplicationScoped
@ContextName("camel-sql-cdi-context")
@Startup
public class CdiRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
from("sql:select name from information_schema.users?dataSource=wildFlyExampleDS")
1104
CHAPTER 147. SQL COMPONENT
.to("direct:end");
}
}
URI FORMAT
WARNING
From Camel 2.11 onwards this component can create both consumer (e.g. from())
and producer endpoints (e. g. to()).In previous versions, it could only act as a
producer.
From Camel 2.11 onwards you can use named parameters by using #name_of_the_parameter style as
shown:
When using named parameters, Camel will lookup the names from, in the given precedence: 1. from
message body if its a java.util.Map 2. from message headers
From Camel 2.14 onward you can use Simple expressions as parameters as shown:
Notice that the standard ? symbol that denotes the parameters to an SQL query is substituted with
the # symbol, because the ? symbol is used to specify options for the endpoint. The ? symbol
replacement can be configured on endpoint basis.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
1105
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1106
CHAPTER 147. SQL COMPONENT
1107
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1108
CHAPTER 147. SQL COMPONENT
1109
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1110
CHAPTER 147. SQL COMPONENT
For example, if the message body is an instance of java.util.List, the first item in the list is substituted
into the first occurrence of # in the SQL query, the second item in the list is substituted into the
second occurrence of #, and so on.
If batch is set to true, then the interpretation of the inbound message body changes slightly - instead
of an iterator of parameters, the component expects an iterator that contains the parameter iterators;
the size of the outer iterator determines the batch size.
By default, the result is placed in the message body. If the outputHeader parameter is set, the result is
placed in the header. This is an alternative to using a full message enrichment pattern to add headers,
1111
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
it provides a concise syntax for querying a sequence or some other small value into a header. It is
convenient to use outputHeader and outputType together, for example:
from("jms:order.inbox")
.to("sql:select order_seq.nextval from dual?outputHeader=OrderId&outputType=SelectOne")
.to("jms:order.booking");
HEADER VALUES
When performing update operations, the SQL Component stores the update count in the following
message headers:
Header Description
When performing insert operations, the SQL Component stores the rows with the generated keys and
number of these rown in the following message headers (Available as of Camel 2.12.4, 2.13.1 ):
Header Description
GENERATED KEYS
Available as of Camel 2.12.4, 2.13.1 and 2.14
If you insert data using SQL INSERT, then the RDBMS may support auto generated keys. You can
instruct the SQL producer to return the generated keys in headers. To do that set the header
CamelSqlRetrieveGeneratedKeys=true. Then the generated keys will be provided as headers with the
keys listed in the table above.
CONFIGURATION
You can now set a reference to a DataSource in the URI directly:
1112
CHAPTER 147. SQL COMPONENT
SAMPLE
In the sample below we execute a query and retrieve the result as a List of rows, where each row is a
Map<String, Object and the key is the column name.
First, we set up a table to use for our sample. As this is based on an unit test, we do it java code:
// this is the database we create with some initial data for our unit test
db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.DERBY).addScript("sql/createAndPopulateDatabase.sql").build();
create table projects (id integer primary key, project varchar(10), license varchar(5));
insert into projects values (1, 'Camel', 'ASF');
insert into projects values (2, 'AMQ', 'ASF');
insert into projects values (3, 'Linux', 'XXX');
Then we configure our route and our sql component. Notice that we use a direct endpoint in front of
the sql endpoint. This allows us to send an exchange to the direct endpoint with the URI, direct:simple,
which is much easier for the client to use than the long sql: URI. Note that the DataSource is looked
up up in the registry, so we can use standard Spring XML to configure our DataSource.
from("direct:simple")
.to("sql:select * from projects where license = # order by id?dataSourceRef=jdbc/myDataSource")
.to("mock:result");
And then we fire the message into the direct endpoint that will route it to our sql component that
queries the database.
// send the query to direct that will route it to the sql where we will execute the query
// and bind the parameters with the data from the body. The body only contains one value
// in this case (XXX) but if we should use multi values then the body will be iterated
// so we could supply a List<String> instead containing each binding value.
template.sendBody("direct:simple", "XXX");
mock.assertIsSatisfied();
// and we should be able the get the project from the map that should be Linux
assertEquals("Linux", row.get("PROJECT"));
1113
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In the given route below, we want to get all the projects from the projects table. Notice the SQL query
has 2 named parameters, :#lic and :#min. Camel will then lookup for these parameters from the
message body or message headers. Notice in the example above we set two headers with constant
value for the named parameters:
from("direct:projects")
.setHeader("lic", constant("ASF"))
.setHeader("min", constant(123))
.to("sql:select * from projects where license = :#lic and id > :#min order by id")
Though if the message body is a java.util.Map then the named parameters will be taken from the body.
from("direct:projects")
.to("sql:select * from projects where license = :#lic and id > :#min order by id")
In the given route below, we want to get all the project from the database. It uses the body of the
exchange for defining the license and uses the value of a property as the second parameter.
from("direct:projects")
.setBody(constant("ASF"))
.setProperty("min", constant(123))
.to("sql:select * from projects where license = :#${body} and id > :#${property.min} order by id")
ABSTRACT CLASS
First we have to create the database table which will be used by the idempotent repository.
1114
CHAPTER 147. SQL COMPONENT
messageId VARCHAR(100),
createdAt TIMESTAMP
)
WARNING
The SQL Server TIMESTAMP type is a fixed-length binary-string type. It does not
map to any of the JDBC time types: DATE, TIME, or TIMESTAMP.
We recommend to have a unique constraint on the columns processorName and messageId. Because
the syntax for this constraint differs for database to database, we do not show it here.
And finally we can create our JDBC idempotent repository in the spring XML file as well:
<bean id="messageIdRepository"
class="org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository">
<constructor-arg ref="dataSource" />
<constructor-arg value="myProcessorName" />
</bean>
<camel:camelContext>
<camel:errorHandler id="deadLetterChannel" type="DeadLetterChannel"
deadLetterUri="mock:error">
<camel:redeliveryPolicy maximumRedeliveries="0" maximumRedeliveryDelay="0"
logStackTrace="false" />
</camel:errorHandler>
1115
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<bean id="messageIdRepository"
class="org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository">
<constructor-arg ref="dataSource" />
<constructor-arg value="myProcessorName" />
<property name="tableExistsString" value="SELECT 1 FROM
CUSTOMIZED_MESSAGE_REPOSITORY WHERE 1 = 0" />
<property name="createString" value="CREATE TABLE CUSTOMIZED_MESSAGE_REPOSITORY
1116
CHAPTER 147. SQL COMPONENT
lobHandler LobHandler A
org.springframework.jdbc.su
pport.lob.LobHandler to
handle Lob types in the database.
Use this option to use a vendor
specific LobHandler, for example
when using Oracle.
1117
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1118
CHAPTER 147. SQL COMPONENT
From Camel 2.11 onwards you can store the message body and select(ed) headers as String in separate
columns.
RECOVERY
The JdbcAggregationRepository will by default recover any failed Exchange. It does this by having a
background tasks that scans for failed Exchanges in the persistent store. You can use the
checkInterval option to set how often this task runs. The recovery works as transactional which
ensures that Camel will try to recover and redeliver the failed Exchange. Any Exchange which was
found to be recovered will be restored from the persistent store and resubmitted and send out again.
Only when an Exchange has been successfully processed it will be marked as complete which happens
when the confirm method is invoked on the AggregationRepository. This means if the same
Exchange fails again it will be kept retried until it success.
1119
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can use option maximumRedeliveries to limit the maximum number of redelivery attempts for a
given recovered Exchange. You must also set the deadLetterUri option so Camel knows where to send
the Exchange when the maximumRedeliveries was hit.
You can see some examples in the unit tests of camel-sql, for example this test.
DATABASE
To be operational, each aggregator uses two table: the aggregation and completed one. By convention
the completed has the same name as the aggregation one suffixed with "_COMPLETED". The name
must be configured in the Spring bean with the RepositoryName property. In the following example
aggregation will be used.
The table structure definition of both table are identical: in both case a String value is used as key (id)
whereas a Blob contains the exchange serialized in byte array. However one difference should be
remembered: the id field does not have the same content depending on the table. In the aggregation
table id holds the correlation Id used by the component to aggregate the messages. In the completed
table, id holds the id of the exchange stored in corresponding the blob field.
Here is the SQL query used to create the tables, just replace "aggregation" with your aggregator
repository name.
You can configure the JdbcAggregationRepository to store message body and select(ed) headers as
String in separate columns. For example to store the body, and the following two headers
companyName and accountName use the following SQL:
1120
CHAPTER 147. SQL COMPONENT
accountName varchar(1000),
constraint aggregationRepo3_completed_pk PRIMARY KEY (id)
);
And then configure the repository to enable this behavior as shown below:
<bean id="repo3"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
<property name="repositoryName" value="aggregationRepo3"/>
<property name="transactionManager" ref="txManager3"/>
<property name="dataSource" ref="dataSource3"/>
<!-- configure to store the message body and following headers as text in the repo -->
<property name="storeBodyAsText" value="true"/>
<property name="headersToStoreAsText">
<list>
<value>companyName</value>
<value>accountName</value>
</list>
</property>
</bean>
CODEC (SERIALIZATION)
Since they can contain any type of payload, Exchanges are not serializable by design. It is converted
into a byte array to be stored in a database BLOB field. All those conversions are handled by the
JdbcCodec class. One detail of the code requires your attention: the
ClassLoadingAwareObjectInputStream.
The ClassLoadingAwareObjectInputStream has been reused from the Apache ActiveMQ project. It
wraps an ObjectInputStream and use it with the ContextClassLoader rather than the currentThread
one. The benefit is to be able to load classes exposed by other bundles. This allows the exchange body
and headers to have custom types object references.
TRANSACTION
A Spring PlatformTransactionManager is required to orchestrate transaction.
SERVICE (START/STOP)
The start method verify the connection of the database and the presence of the required tables. If
anything is wrong it will fail during starting.
AGGREGATOR CONFIGURATION
Depending on the targeted environment, the aggregator might need some configuration. As you
already know, each aggregator should have its own repository (with the corresponding pair of table
created in the database) and a data source. If the default lobHandler is not adapted to your database
system, it can be injected with the lobHandler property.
1121
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
</bean>
<bean id="nativeJdbcExtractor"
class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/>
OPTIMISTIC LOCKING
From Camel 2.12 onwards you can turn on optimisticLocking and use this JDBC based aggregation
repository in a clustered environment where multiple Camel applications shared the same database for
the aggregation repository. If there is a race condition there JDBC driver will throw a vendor specific
exception which the JdbcAggregationRepository can react upon. To know which caused exceptions
from the JDBC driver is regarded as an optimistick locking error we need a mapper to do this.
Therefore there is a
org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper allows you
to implement your custom logic if needed. There is a default implementation
org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper
which works as follows:
If the caused exception is an SQLException then the SQLState is checked if starts with 23.
optional checking for FQN class name matches if any class names has been configured
You can in addition add FQN classnames, and if any of the caused exception (or any nested) equals any
of the FQN class names, then its an optimistick locking error.
Here is an example, where we define 2 extra FQN class names from the JDBC vendor.
<!-- use the default mapper with extra FQN class names from our JDBC driver -->
<bean id="myExceptionMapper"
class="org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper">
<property name="classNames">
<util:set>
<value>com.foo.sql.MyViolationExceptoion</value>
<value>com.foo.sql.MyOtherViolationExceptoion</value>
1122
CHAPTER 147. SQL COMPONENT
</util:set>
</property>
</bean>
See also:
JDBC
1123
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SSH
Available as of Camel 2.10
The SSH component enables access to SSH servers such that you can send an SSH command, and
process the response.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ssh</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
ssh:[username[:password]@]host[:port][?options]
OPTIONS
keyPairProvider Refers to a
org.apache.sshd.common.Ke
yPairProvider to use for loading
keys for authentication. If this
option is used, then password is
not used.
1124
CHAPTER 148. SSH
Here is an example of this within the XML DSL. Note that the command has an XML encoded newline
(&10;).
<route id="camel-example-ssh-producer">
<from uri="direct:exampleSshProducer"/>
<setBody>
<constant>features:list </constant>
</setBody>
1125
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<to uri="ssh://karaf:karaf@localhost:8101"/>
<log message="${body}"/>
</route>
AUTHENTICATION
The SSH Component can authenticate against the remote SSH server using one of two mechanisms:
Public Key certificate or username/password. Configuring how the SSH Component does
authentication is based on how and which options are set.
1. First, it will look to see if the certResource option has been set, and if so, use it to locate the
referenced Public Key certificate and use that for authentication.
2. If certResource is not set, it will look to see if a keyPairProvider has been set, and if so, it will
use that to for certificate based authentication.
3. If neither certResource nor keyPairProvider are set, it will use the username and password
options for authentication.
The following route fragment shows an SSH polling consumer using a certificate from the classpath.
<route>
<from uri="ssh://scott@localhost:8101?
certResource=classpath:test_rsa&seFixedDelay=true&elay=5000&ollCommand=features:list%0A"/>
<log message="${body}"/>
</route>
from("ssh://scott@localhost:8101?
certResource=classpath:test_rsa&useFixedDelay=true&delay=5000&pollCommand=features:list%0A")
.log("${body}");
CERTIFICATE DEPENDENCIES
You will need to add some additional runtime dependencies if you use certificate based authentication.
The dependency versions shown are as of Camel 2.11, you may need to use later versions depending
what version of Camel you are using.
<dependency>
<groupId>org.apache.sshd</groupId>
<artifactId>sshd-core</artifactId>
<version>0.8.0</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpg-jdk15on</artifactId>
<version>1.47</version>
</dependency>
1126
CHAPTER 148. SSH
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.47</version>
</dependency>
EXAMPLE
See the examples/camel-example-ssh and examples/camel-example-ssh-security in the Camel
distribution.
1127
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
STAX COMPONENT
Available as of Camel 2.9
The StAX component allows messages to be process through a SAX ContentHandler. Another feature
of this component is to allow to iterate over JAXB records using StAX, for example using the Splitter
EIP.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-stax</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
stax:content-handler-class
example:
stax:org.superbiz.FooContentHandler
From Camel 2.11.1 onwards you can lookup a org.xml.sax.ContentHandler bean from the Registry
using the # syntax as shown:
stax:#myHandler
Here an example:
from("file:target/in")
.to("stax:org.superbiz.handler.CountingHandler")
// CountingHandler implements org.xml.sax.ContentHandler or extends
org.xml.sax.helpers.DefaultHandler
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
CountingHandler handler = exchange.getIn().getBody(CountingHandler.class);
// do some great work with the handler
}
});
1128
CHAPTER 149. STAX
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "records")
public class Records {
@XmlElement(required = true)
protected List<Record> record;
and
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "record", propOrder = { "key", "value" })
public class Record {
@XmlAttribute(required = true)
protected String key;
@XmlAttribute(required = true)
protected String value;
1129
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The StAX component provides an StAXBuilder which can be used when iterating XML elements with
the Camel Splitter.
from("file:target/in")
.split(stax(Record.class)).streaming()
.to("mock:records");
from("file:target/in")
.split(stax(Record.class, false)).streaming()
.to("mock:records");
<!-- use STaXBuilder to create the expression we want to use in the route below for splitting the XML
file -->
<!-- notice we use the factory-method to define the stax method, and to pass in the parameter as a
constructor-arg -->
<bean id="staxRecord" class="org.apache.camel.component.stax.StAXBuilder" factory-
method="stax">
<!-- FQN class name of the POJO with the JAXB annotations -->
<constructor-arg index="0" value="org.apache.camel.component.stax.model.Record"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<!-- pickup XML files -->
<from uri="file:target/in"/>
<split streaming="true">
<!-- split the file using StAX (ref to bean above) -->
<!-- and use streaming mode in the splitter -->
1130
CHAPTER 149. STAX
<ref>staxRecord</ref>
<!-- and send each splitted to a mock endpoint, which will be a Record POJO instance -->
<to uri="mock:records"/>
</split>
</route>
</camelContext>
1131
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
STOMP COMPONENT
Available as of Camel 2.12
The stomp: component is used for communicating with Stomp compliant message brokers, like
Apache ActiveMQ or ActiveMQ Apollo
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-stomp</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
stomp:queue:destination[?options]
OPTIONS
You can append query options to the URI in the following format, ?option=value&option=value&...
SAMPLES
Sending messages:
from("direct:foo").to("stomp:queue:test");
Consuming messages:
from("stomp:queue:test").transform(body().convertToString()).to("mock:result")
1132
CHAPTER 151. STREAM
STREAM COMPONENT
The stream: component provides access to the System.in, System.out and System.err streams as
well as allowing streaming of file and URL.
URI FORMAT
stream:in[?options]
stream:out[?options]
stream:err[?options]
stream:header[?options]
In addition, the file and url endpoint URIs are supported in Apache Camel 2.0:
stream:file?fileName=/foo/bar.txt
stream:url[?options]
If the stream:header URI is specified, the stream header is used to find the stream to write to. This
option is available only for stream producers (that is, it cannot appear in from()).
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
1133
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1134
CHAPTER 151. STREAM
MESSAGE CONTENT
The stream: component supports either String or byte[] for writing to streams. Just add either String
or byte[] content to the message.in.body. Messages sent to the stream: producer in binary mode are
not followed by the newline character (as opposed to the String messages). Message with null body
will not be appended to the output stream.
SAMPLES
In the following sample we route messages from the direct:in endpoint to the System.out stream:
The following sample demonstrates how the header type can be used to determine which stream to
use. In the sample we use our own output stream, MyOutputStream.
1135
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
@Test
public void testStringContent() {
template.sendBody("direct:in", "Hello");
// StreamProducer appends \n in text mode
assertEquals("Hello\n", sb.toString());
}
@Test
public void testBinaryContent() {
template.sendBody("direct:in", "Hello".getBytes());
// StreamProducer is in binary mode so no \n is appended
assertEquals("Hello", sb.toString());
}
The following sample demonstrates how to continuously read a file stream (analogous to the UNIX tail
command):
from("stream:file?
fileName=/server/logs/server.log&scanStream=true&scanStreamDelay=1000").to("bean:logService?
method=parseLogLine");
NOTE
One difficulty with using the combination of scanStream and retry is that the file will be
re-opened and scanned with each iteration of scanStreamDelay. Until NIO2 is available,
we cannot reliably detect when a file is deleted or recreated.
1136
CHAPTER 152. STRINGTEMPLATE
STRING TEMPLATE
The string-template: component allows you to process a message using a String Template. This can be
ideal when using Templating to generate responses for requests.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-stringtemplate</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
string-template:templateName[?options]
Where templateName is the classpath-local URI of the template to invoke; or the complete URL of the
remote template.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
HEADERS
Apache Camel will store a reference to the resource in the message header with key,
org.apache.camel.stringtemplate.resource. The Resource is an
org.springframework.core.io.Resource object.
HOT RELOADING
1137
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
The string template resource is by default hot-reloadable for both file and classpath resources
(expanded jar). If you set contentCache=true, Apache Camel loads the resource only once and hot-
reloading is not possible. This scenario can be used in production when the resource never changes.
STRINGTEMPLATE ATTRIBUTES
Apache Camel will provide exchange information as attributes (just a java.util.Map) to the string
template. The Exchange is transfered as:
key value
in The In message.
Since Camel 2.14, you can define the custom context map by setting the message header
"CamelStringTemplateVariableMap" just like the below code.
SAMPLES
For example you could use a string template as follows in order to formulate a response to a message:
from("activemq:My.Queue").
to("string-template:com/acme/MyResponse.tm");
1138
CHAPTER 152. STRINGTEMPLATE
In this sample we want to use a string template to send an order confirmation email. The email
template is laid out in StringTemplate as: This example works for camel 2.11.0. If your camel version is
less than 2.11.0, the variables should be started and ended with $.
@Test
public void testVelocityLetter() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedMessageCount(1);
mock.expectedBodiesReceived("Dear Ibsen, Claus! Thanks for the order of Camel in Action.
Regards Camel Riders Bookstore PS: Next beer is on me, James");
template.send("direct:a", createLetter());
mock.assertIsSatisfied();
}
1139
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
STUB COMPONENT
Available as of Camel 2.10
The stub: component provides a simple way to stub out any physical endpoints while in development or
testing, allowing you for example to run a route without needing to actually connect to a specific SMTP
or HTTP endpoint. Just add stub: in front of any endpoint URI to stub out the endpoint.
Internally the Stub component creates VM endpoints. The main difference between Stub and VM is
that VM will validate the URI and parameters you give it, so putting vm: in front of a typical URI with
query arguments will usually fail. Stub won't though, as it basically ignores all query parameters to let
you quickly stub out one or more endpoints in your route temporarily.
URI FORMAT
stub:someUri
EXAMPLES
Here are a few samples:
stub:smtp://somehost.foo.com?user=whatnot&something=else
stub:http://somehost.bar.com/something
1140
CHAPTER 154. SWAGGER
Abstract
The Swagger component enables users to create API docs for any Rest-defined routes and endpoints
in a CamelContext file. The Swagger component creates a servlet integrated with the CamelContext
that pulls information from each Rest endpoint to generate the API docs (JSON file).
154.1. OVERVIEW
Available as of Camel 2.14
The Rest DSL can be integrated with the camel-swagger component, which is used for exposing REST
services and their APIs using Swagger.
Dependencies
Maven users need to add the following dependency to their pom.xml file to use this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-swagger</artifactId>
<version>x.x.x</version>
<!-- Use the same version as your Camel core version -->
<dependency>
Camel 2.15.x
org.apache.camel.component.swagger.DefaultCamelSwaggerServlet
NOTE
This default servlet integrates with any environment, using JMX to discover the
CamelContext(s) to use. It replaces both Camel 2.14.x servlets, which are
deprecated from Camel 2.15 onwards.
Camel 2.14.x
The Swagger servlet is integrated with either Spring or the servletListener component:
Spring
org.apache.camel.component.swagger.spring.SpringRestSwaggerApiDeclarationServ
let
servletListener component
1141
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
org.apache.camel.component.swagger.servletlistener.ServletListenerRestSwaggerAp
iDelarationServlet
1142
CHAPTER 154. SWAGGER
Access-Control-Allow-Origin = *
Access-Control-Max-Age = 3600
1143
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<!-- Use CORs filter so people can use Swagger UI to browse and test the APIs -->
<filter>
<filter-name>RestSwaggerCorsFilter</filter-name
<filter-class>org.apache.camel.component.swagger.RestSwaggerCorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RestSwaggerCorsFilter</filter-name>
<url-pattern>/api-docs/*</url-pattern>
<url-pattern>/rest/*</url-pattern>
</filter-mapping>
NOTE
This example shows a very simple CORS filter. You may need to use a more
sophisticated filter to set header values differently for a given client or to block certain
clients, and so on.
Camel 2.15.x
Use relative paths for both the base.path and api.path parameters.
For example, to set up the Camel Swagger API servlet for any environment:
...
<servlet>
<servlet-name>ApiDeclarationServlet</servlet-name>
<servlet-class>org.apache.camel.component.swagger.DefaultCamelSwaggerServlet</servlet-class>
<!-- Specify the base.path and the api.path values using relative notation
because the actual paths will be calculated at runtime as
http://server:port/contextpath/rest and http://server:port/contextpath/api-docs,
respectively -->
<init-param>
<param-name>base.path</param-name>
<param-value>rest</param-value>
</init-param>
<init-param>
<param-name>api.path</param-name>
<param-value>api-docs</param-value>
</init-param>
<init-param>
<param-name>api.version</param-name>
1144
CHAPTER 154. SWAGGER
<param-value>1.2.3</param-value>
</init-param>
<init-param>
<param-name>api.title</param-name>
<param-value>User Services</param-value>
</init-param>
<init-param>
<param-name>api.description</param-name>
<param-value>Camel Rest Example with Swagger that provides a User Rest
service</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
Camel 2.14.x
Both servlets,
org.apache.camel.component.swagger.spring.SpringRestSwaggerApiDeclarationServlet and
org.apache.camel.component.swagger.servletlistener.ServletListenerRestSwaggerApiDelaration
Servlet, support the same options.
Use absolute paths for both the base.path and api.path parameters.
For example, to set up the Camel Swagger API servlet for Spring:
...
<servlet>
<servlet-name>ApiDeclarationServlet</servlet-name>
<servlet-
class>org.apache.camel.component.swagger.spring.SpringRestSwaggerApiDeclarationServlet</servl
et-class>
<init-param>
<param-name>base.path</param-name>
<param-value>http://localhost:8080/rest</param-value>
</init-param>
<init-param>
<param-name>api.path</param-name>
<param-value>http://localhost:8080/api-docs</param-value>
</init-param>
<init-param>
<param-name>api.version</param-name>
<param-value>1.2.3</param-value>
</init-param>
<init-param>
<param-name>api.title</param-name>
1145
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<param-value>User Services</param-value>
</init-param>
<init-param>
<param-name>api.description</param-name>
<param-value>Camel Rest Example with Swagger that provides a User Rest
service</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
For OSGi deployments, you need to configure the servlet options and REST configuration in the
blueprint.xml file; for example:
<service interface="javax.servlet.http.HttpServlet">
<service-properties>
<entry key="alias" value="/api-docs/*"/>
<entry key="init-prefix" value="init."/>
<entry key="init.base.path" value="//localhost:8080/"/>
<entry key="init.api.path" value="//localhost:8181/api-docs"/>
<entry key="init.api.title" value="Camel Rest Example API"/>
<entry key="init.api.version" value="1.2"/>
<entry key="init.api.description"
value="Camel Rest Example with Swagger that provides an User REST service"/>
</service-properties>
<bean class="org.apache.camel.component.swagger.DefaultCamelSwaggerServlet" />
</service>
<!--
The namespace for the camelContext element in Blueprint
is 'http://camel.apache.org/schema/blueprint'.
While it is not required to assign id's to the <camelContext/> and <route/> elements,
it is a good idea to set those for runtime management purposes (logging, JMX MBeans, ...)
1146
CHAPTER 154. SWAGGER
-->
<camelContext id="log-example-context"
xmlns="http://camel.apache.org/schema/blueprint">
</camelContext>
</blueprint>
service
The service element exposes the camel swagger servlet ( <bean
class="org.apache.camel.component.swagger.DefaultCamelSwaggerServlet"/>) and initializes
several servlet properties.
alias
The alias property binds the camel swagger servlet to /api-docs/*.
init-prefix
The init-prefix property sets the prefix for all camel swagger servlet properties to init.. This is
analogous to using init-param elements in the web.xml configuration in WAR implementations.
restConfiguration
In the camelContext, the restConfiguration element specifies Jetty as the web servlet on port
8080.
rest
In the camelContext, the rest element sets two REST endpoints and routes them to the camel
endpoints defined in the following two route elements.
1147
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
TEST COMPONENT
The test component extends the Mock component to support pulling messages from another endpoint
on startup to set the expected message bodies on the underlying Mock endpoint. That is, you use the
test endpoint in a route and messages arriving on it will be implicitly compared to some expected
messages extracted from some other location.
So you can use, for example, an expected set of message bodies as files. This will then set up a properly
configured Mock endpoint, which is only valid if the received messages match the number of expected
messages and their message payloads are equal.
Maven users will need to add the following dependency to their pom.xml for this component when
using Camel 2.8 or older:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
From Camel 2.9 onwards the Test component is provided directly in the camel-core.
URI FORMAT
test:expectedMessagesEndpointUri
Where expectedMessagesEndpointUri refers to some other Component URI that the expected
message bodies are pulled from before starting the test.
URI OPTIONS
EXAMPLE
For example, you could write a test case as follows:
from("seda:someEndpoint").
to("test:file://data/expectedOutput?noop=true");
If your test then invokes the MockEndpoint.assertIsSatisfied(camelContext) method, your test case
will perform the necessary assertions.
1148
CHAPTER 155. TEST
Here is a real example test case using Mock and Spring along with its Spring XML.
To see how you can set other expectations on the test endpoint, see the Mock component.
1149
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
TIMER COMPONENT
The timer: component is used to generate message exchanges when a timer fires You can only
consume events from this endpoint.
URI FORMAT
timer:name[?options]
Where name is the name of the Timer object, which is created and shared across endpoints. So if you
use the same name for all your timer endpoints, only one Timer object and thread will be used.
You can append query options to the URI in the following format, ?option=value&option=value&...
Note: The IN body of the generated exchange is null. So exchange.getIn().getBody() returns null.
ADVANCED SCHEDULER
See also the Quartz component that supports much more advanced scheduling.
In Camel 2.3 onwards you can specify the time in human friendly syntax.
OPTIONS
1150
CHAPTER 156. TIMER
EXCHANGE PROPERTIES
When the timer is fired, it adds the following information as properties to the Exchange:
MESSAGE HEADERS
When the timer is fired, it adds the following information as headers to the IN message
1151
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
SAMPLE
To set up a route that generates an event every 60 seconds:
from("timer://foo?fixedRate=true&period=60000").to("bean:myBean?method=someMethodName");
TIP
The above route will generate an event and then invoke the someMethodName method on the bean
called myBean in the Registry such as JNDI or Spring.
<route>
<from uri="timer://foo?fixedRate=true&period=60000"/>
<to uri="bean:myBean?method=someMethodName"/>
</route>
You may want to fire a message in a Apache Camel route only once, such as when starting the route.
To do that, you use the repeatCount option as follows:
<route>
<from uri="timer://foo?repeatCount=1"/>
<to uri="bean:myBean?method=someMethodName"/>
</route>
See also:
Quartz
1152
CHAPTER 157. TWITTER
TWITTER
Available as of Camel 2.10
The Twitter component enables the most useful features of the Twitter API by encapsulating
Twitter4J. It allows direct, polling, or event-driven consumption of timelines, users, trends, and direct
messages. Also, it supports producing messages as status updates or direct messages.
Twitter now requires the use of OAuth for all client application authentication. In order to use camel-
twitter with your account, you'll need to create a new application within Twitter at
https://dev.twitter.com/apps/new and grant the application access to your account. Finally, generate
your access token and secret.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-twitter</artifactId>
<version>${camel-version}</version>
</dependency>
URI FORMAT
twitter://endpoint[?options]
TWITTERCOMPONENT:
The twitter component can be configured with the Twitter account settings which is mandatory to
configure before using. You can also configure these options directly in the endpoint.
Option Description
CONSUMER ENDPOINTS:
Rather than the endpoints returning a List through one single route exchange, camel-twitter creates
one route exchange per returned object. As an example, if timeline/home results in five statuses, the
route will be executed five times (once for each Status).
1153
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
PRODUCER ENDPOINTS:
directmessage String
search List<twitter4j.Tweet>
timeline/user String
URI OPTIONS
1154
CHAPTER 157. TWITTER
delay 60 in seconds
1155
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MESSAGE HEADER
Name Description
1156
CHAPTER 157. TWITTER
MESSAGE BODY
All message bodies utilize objects provided by the Twitter4J API.
from("direct:foo")
.to("twitter://timeline/user?consumerKey=[s]&consumerSecret=[s]&accessToken=
[s]&accessTokenSecret=[s]);
from("twitter://timeline/home?type=polling&delay=5&consumerKey=[s]&consumerSecret=
[s]&accessToken=[s]&accessTokenSecret=[s]")
.to("bean:blah");
from("twitter://search?type=direct&keywords=camel&consumerKey=[s]&consumerSecret=
[s]&accessToken=[s]&accessTokenSecret=[s]")
.to("bean:blah");
from("direct:foo")
.to("twitter://search?keywords=camel&consumerKey=[s]&consumerSecret=[s]&accessToken=
[s]&accessTokenSecret=[s]");
from("direct:foo")
.setHeader("CamelTwitterKeywords", header("bar"))
.to("twitter://search?consumerKey=[s]&consumerSecret=[s]&accessToken=
[s]&accessTokenSecret=[s]");
EXAMPLE
1157
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1158
CHAPTER 158. VALIDATION
VALIDATION COMPONENT
The Validation component performs XML validation of the message body using the JAXP Validation
API and based on any of the supported XML schema languages, which defaults to XML Schema
Note that the Jing component also supports the following useful schema languages:
URI FORMAT
validator:someLocalOrRemoteResource
Where someLocalOrRemoteResource is some URL to a local resource on the classpath or a full URL
to a remote resource or resource on the file system which contains the XSD to validate against. For
example:
msv:org/foo/bar.xsd
msv:file:../foo/bar.xsd
msv:http://acme.com/cheese.xsd
validator:com/mypackage/myschema.xsd
Maven users will need to add the following dependency to their pom.xml for this component when
using Camel 2.8 or older:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
From Camel 2.9 onwards the Validation component is provided directly in the camel-core.
OPTIONS
1159
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
EXAMPLE
The following example shows how to configure a route from endpoint direct:start which then goes to
one of two endpoints, either mock:valid or mock:invalid based on whether or not the XML matches the
given schema (which is supplied on the classpath).
<route>
<from uri="direct:start"/>
<doTry>
<to uri="validator:org/apache/camel/component/validator/schema.xsd"/>
<to uri="mock:valid"/>
<doCatch>
<exception>org.apache.camel.ValidationException</exception>
<to uri="mock:invalid"/>
</doCatch>
<doFinally>
<to uri="mock:finally"/>
</doFinally>
</doTry>
</route>
1160
CHAPTER 159. VELOCITY
VELOCITY
The velocity: component allows you to process a message using an Apache Velocity template. This
can be ideal when using Templating to generate responses for requests.
URI FORMAT
velocity:templateName[?options]
Where templateName is the classpath-local URI of the template to invoke; or the complete URL of the
remote template (for example, file://folder/myfile.vm).
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
MESSAGE HEADERS
The velocity component sets a couple headers on the message (you can't set these yourself and from
Camel 2.1 velocity component will not set these headers which will cause some side effect on the
dynamic template support):
Header Description
1161
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Headers set during the Velocity evaluation are returned to the message and added as headers. Then it
is effectively possible to return values from Velocity to the Message. For example, to set the header
value of fruit in the Velocity template, template.tm:
$in.setHeader("fruit", "Apple")
VELOCITY CONTEXT
Apache Camel will provide exchange information in the Velocity context (just a Map). The Exchange is
transfered as:
key value
in The In message.
Since Camel-2.14, you can setup a custom Velocity Context yourself by setting the message header
CamelVelocityContext just like this
HOT RELOADING
The Velocity template resource is, by default, hot reloadable for both file and classpath resources
(expanded jar). If you set contentCache=true, Apache Camel will only load the resource once, and thus
hot reloading is not possible. This scenario can be used in production, when the resource never
changes.
1162
CHAPTER 159. VELOCITY
DYNAMIC TEMPLATES
Available as of Camel 2.1 Camel provides two headers by which you can define a different resource
location for a template or the template content itself. If any of these headers is set then Camel uses this
over the endpoint configured resource. This allows you to provide a dynamic template at runtime.
SAMPLES
For example you could use something like
from("activemq:My.Queue").
to("velocity:com/acme/MyResponse.vm");
To use a Velocity template to formulate a response to a message for InOut message exchanges (where
there is a JMSReplyTo header).
If you want to use InOnly and consume the message and send it to another destination, you could use
the following route:
from("activemq:My.Queue").
to("velocity:com/acme/MyResponse.vm").
to("activemq:Another.Queue");
And to use the content cache, e.g. for use in production, where the .vm template never changes:
from("activemq:My.Queue").
to("velocity:com/acme/MyResponse.vm?contentCache=true").
to("activemq:Another.Queue");
from("activemq:My.Queue").
to("velocity:file://myfolder/MyResponse.vm?contentCache=true").
to("activemq:Another.Queue");
In Camel 2.1 it's possible to specify what template the component should use dynamically via a header,
so for example:
from("direct:in").
setHeader("CamelVelocityResourceUri").constant("path/to/my/template.vm").
to("velocity:dummy");
1163
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
In Camel 2.1 it's possible to specify a template directly as a header the component should use
dynamically via a header, so for example:
from("direct:in").
setHeader("CamelVelocityTemplate").constant("Hi this is a velocity template that can do templating
${body}").
to("velocity:dummy");
@Test
public void testVelocityLetter() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedMessageCount(1);
mock.expectedBodiesReceived("Dear Ibsen, Claus\n\nThanks for the order of Camel in
Action.\n\nRegards Camel Riders Bookstore\nPS: Next beer is on me, James");
template.send("direct:a", createLetter());
mock.assertIsSatisfied();
}
1164
CHAPTER 160. VERTX
VERTX COMPONENT
Available as of Camel 2.12
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-vertx</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
vertx:channelName[?options]
OPTIONS
You can append query options to the URI in the following format, ?
option=value&option=value&...
1165
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
CHAPTER 161. VM
VM COMPONENT
The vm: component provides asynchronous SEDA behavior, exchanging messages on a BlockingQueue
and invoking consumers in a separate thread pool.
This component differs from the SEDA component in that VM supports communication across
CamelContext instances - so you can use this mechanism to communicate across web applications
(provided that camel-core.jar is on the system/boot classpath).
URI FORMAT
vm:queueName[?options]
Where queueName can be any string to uniquely identify the endpoint within the JVM (or at least
within the classloader that loaded camel-core.jar)
You can append query options to the URI in the following format: ?option=value&option=value&...
BEFORE CAMEL 2.3 - SAME URI MUST BE USED FOR BOTH PRODUCER AND
CONSUMER
An exactly identical VM endpoint URI must be used for both the producer and the
consumer endpoint. Otherwise, Camel will create a second VM endpoint despite that the
queueName portion of the URI is identical. For example:
from("direct:foo").to("vm:bar?concurrentConsumers=5");
from("vm:bar?concurrentConsumers=5").to("file://output");
Notice that we have to use the full URI, including options in both the producer and
consumer.
In Camel 2.4 this has been fixed so that only the queue name must match. Using the
queue name bar, we could rewrite the previous exmple as follows:
from("direct:foo").to("vm:bar");
from("vm:bar?concurrentConsumers=5").to("file://output");
OPTIONS
See the SEDA component for options and other important usage details as the same rules apply to the
VM component.
SAMPLES
In the route below we send exchanges across CamelContext instances to a VM queue named
order.email:
1166
CHAPTER 161. VM
from("direct:in").bean(MyOrderBean.class).to("vm:order.email");
And then we receive exchanges in some other Camel context (such as deployed in another .war
application):
from("vm:order.email").bean(MyOrderEmailSender.class);
SEDA
1167
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
WEATHER COMPONENT
Available as of Camel 2.12
The weather: component is used for polling weather information from Open Weather Map - a site that
provides free global weather and forecast information. The information is returned as a json String
object.
Camel will poll for updates to the current weather and forecasts once per hour by default.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-weather</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
weather://<unused name>[?options]
OPTIONS
1168
CHAPTER 162. WEATHER
1169
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
You can append query options to the URI in the following format, ?option=value&option=value&...
MESSAGE HEADERS
Header Description
SAMPLES
In this sample we find the 7 day weather forecast for Madrid, Spain:
from("weather:foo?location=Madrid,Spain&period=7 days").to("jms:queue:weather");
To just find the current weather for your current location you can use this:
from("weather:foo").to("jms:queue:weather");
from("direct:start")
.to("weather:foo?location=Madrid,Spain");
And we can send in a message with a header to get the weather for any location as shown:
1170
CHAPTER 163. WEBSOCKET
WEBSOCKET COMPONENT
Available as of Camel 2.10
The websocket component provides websocket endpoints for communicating with clients using
websocket. The component uses Eclipse Jetty Server which implements the IETF specification (drafts
and RFC 6455). It supports the protocols ws:// and wss://. To use wss:// protocol, the
SSLContextParameters must be defined.
As Camel 2.10 uses Jetty 7.5.4.v20111024, only the D00 to D13 IETF implementations
are available. Camel 2.11 uses Jetty 7.6.7.
URI FORMAT
websocket://hostname[:port][/resourceUri][?options]
You can append query options to the URI in the following format, ?option=value&option=value&...
COMPONENT OPTIONS
The WebsocketComponent can be configured prior to use, to setup host, to act as a websocket
server.
1171
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
sslContextParameters Reference to a
org.apache.camel.util.jsse.S
SLContextParameters in the
Registry. This reference overrides
any configured
SSLContextParameters at the
component level. See Using the
JSSE Configuration Utility.
ENDPOINT OPTIONS
The WebsocketEndpoint can be configured prior to use
1172
CHAPTER 163. WEBSOCKET
sslContextParameters Reference to a
org.apache.camel.util.jsse.S
SLContextParameters in the
Registry. This reference overrides
any configured
SSLContextParameters at the
component level. See Using the
JSSE Configuration Utility.
1173
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
MESSAGE HEADERS
The websocket component uses 2 headers to indicate to either send messages back to a single/current
client, or to all clients.
Key Description
USAGE
In this example we let Camel exposes a websocket server which clients can communicate with. The
websocket server uses the default host and port, which would be 0.0.0.0:9292. The example will send
back an echo of the input. To send back a message, we need to send the transformed message to the
same endpoint "websocket://echo". This is needed because by default the messaging is InOnly.
This example is part of an unit test, which you can find here. As a client we use the AHC library which
offers support for web socket as well.
Here is another example where webapp resources location have been defined to allow the Jetty
Application Server to not only register the WebSocket servlet but also to expose web resources for
the browser. Resources should be defined under the webapp directory.
from("activemq:topic:newsTopic")
.routeId("fromJMStoWebSocket")
.to("websocket://localhost:8443/newsTopic?sendToAll=true&staticResources=classpath:webapp");
1174
CHAPTER 163. WEBSOCKET
JSSE Configuration Utility. This utility greatly decreases the amount of component specific code you
need to write and is configurable at the endpoint and component levels. The following examples
demonstrate how to use the utility with the Cometd component.
...
<camel:sslContextParameters
id="sslContextParameters">
<camel:keyManagers
keyPassword="keyPassword">
<camel:keyStore
resource="/users/home/server/keystore.jks"
password="keystorePassword"/>
</camel:keyManagers>
<camel:trustManagers>
<camel:keyStore
resource="/users/home/server/keystore.jks"
password="keystorePassword"/>
</camel:trustManagers>
</camel:sslContextParameters>...
...
<to uri="websocket://127.0.0.1:8443/test?sslContextParameters=#sslContextParameters"/>...
...
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
public void configure() {
1175
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from(uri)
.log(">>> Message received from WebSocket Client : ${body}")
.to("mock:client")
.loop(10)
.setBody().constant(">> Welcome on board!")
.to(uri);
...
AHC
Jetty
Twitter Websocket Example demonstrates how to poll a constant feed of twitter searches and
publish results in real time using web socket to a web page.
1176
CHAPTER 164. XMLRPC
XMLRPC COMPONENT
Available as of Camel 2.11
This component provides a dataformat for xml, which allows serialization and deserialization of request
messages and response message using Apache XmlRpc's bindary dataformat. You can also invoke the
XMLRPC Service through the camel-xmlrpc producer.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-xmlrpc</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
XMLRPC OVERVIEW
It's a spec and a set of implementations that allow software running on disparate operating systems,
running in different environments to make procedure calls over the Internet.
It's remote procedure calling using HTTP as the transport and XML as the encoding. XML-RPC is
designed to be as simple as possible, while allowing complex data structures to be transmitted,
processed and returned.
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>40</i4></value>
</param>
</params>
</methodCall>
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
1177
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Too many parameters.</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
URI FORMAT
xmlrpc://serverUri[?options]
OPTIONS
1178
CHAPTER 164. XMLRPC
MESSAGE HEADERS
Camel XmlRpc uses these headers.
Header Description
1179
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<route>
<from uri="direct:request"/>
<marshal ref="xmlrpcRequest"/>
<unmarshal>
<xmlrpc request="true"/>
</unmarshal>
<to uri="mock:request" />
</route>
<route>
<from uri="direct:response"/>
<marshal>
<xmlrpc request="false"/>
</marshal>
<unmarshal ref="xmlrpcResponse"/>
<to uri="mock:response" />
</route>
</camelContext>
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
@Override
public void configureXmlRpcClient(XmlRpcClient client) {
// get the configure first
XmlRpcClientConfigImpl clientConfig = (XmlRpcClientConfigImpl)client.getClientConfig();
// change the value of clientConfig
clientConfig.setEnabledForExtensions(true);
1180
CHAPTER 164. XMLRPC
1181
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
With this Apache Camel component, you can generate and validate XML signatures as described in the
W3C standard XML Signature Syntax and Processing or as described in the successor version 1.1. For
XML Encryption support, please refer to the XML Security Data Format.
You can find an introduction to XML signature here. The implementation of the component is based on
JSR 105, the Java API corresponding to the W3C standard and supports the Apache Santuario and the
JDK provider for JSR 105. The implementation will first try to use the Apache Santuario provider; if it
does not find the Santuario provider, it will use the JDK provider. Further, the implementation is DOM
based.
Since Camel 2.15.0 we also provide support for XAdES-BES/EPES for the signer endpoint; see the
section called “XAdES-BES/EPES for the Signer Endpoint”.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-xmlsecurity</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
In the enveloped XML signature case, the supported generated XML signature has the following
structure (Variables are surrounded by []).
<[parent element]>
... <!-- Signature element is added as last child of the parent element-->
<Signature Id="generated_unique_signature_id">
<SignedInfo>
<Reference URI="">
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
(<Transform>)* <!-- By default "http://www.w3.org/2006/12/xml-c14n11" is added to the
transforms -->
<DigestMethod>
<DigestValue>
</Reference>
(<Reference URI="#[keyinfo_Id]">
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<DigestMethod>
1182
CHAPTER 165. XML SECURITY COMPONENT
<DigestValue>
</Reference>)?
<!-- further references possible, see option 'properties' below -->
</SignedInfo>
<SignatureValue>
(<KeyInfo Id="[keyinfo_id]">)?
<!-- Object elements possible, see option 'properties' below -->
</Signature>
</[parent element]>
In the enveloping XML signature case, the supported generated XML signature has the structure:
<Signature Id="generated_unique_signature_id">
<SignedInfo>
<Reference URI="#generated_unique_object_id" type="[optional_type_value]">
(<Transform>)* <!-- By default "http://www.w3.org/2006/12/xml-c14n11" is added to the
transforms -->
<DigestMethod>
<DigestValue>
</Reference>
(<Reference URI="#[keyinfo_id]">
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<DigestMethod>
<DigestValue>
</Reference>)?
<!-- further references possible, see option 'properties' below -->
</SignedInfo>
<SignatureValue>
(<KeyInfo Id="[keyinfo_id]">)?
<Object Id="generated_unique_object_id"/> <!-- The Object element contains the in-message
body -->
<!-- The object ID can either be generated or set by the option parameter "contentObjectId" -->
<!-- Further Object elements possible, see option 'properties' below -->
</Signature>
As of Camel 2.14.0 detached XML signatures with the following structure are supported (see also the
section called “Detached XML Signatures as Siblings of the Signed Elements”):
</[signed element]>
<other sibling/>*
<!-- between the signed element and the corresponding signature element, there can be other
siblings.
Signature element is added as last sibling. -->
<Signature Id="generated_unique_ID">
<SignedInfo>
<CanonicalizationMethod>
<SignatureMethod>
<Reference URI="#[id_value]" type="[optional_type_value]">
<!-- reference URI contains the ID attribute value of the signed element -->
(<Transform>)* <!-- By default "http://www.w3.org/2006/12/xml-c14n11" is added to the
transforms -->
1183
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<DigestMethod>
<DigestValue>
</Reference>
(<Reference URI="#[generated_keyinfo_Id]">
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<DigestMethod>
<DigestValue>
</Reference>)?
</SignedInfo>
<SignatureValue>
(<KeyInfo Id="[generated_keyinfo_id]">)?
</Signature>)+
URI FORMAT
The camel component consists of two endpoints which have the following URI format.
xmlsecurity:sign:name[?options]
xmlsecurity:verify:name[?options]
With the signer endpoint, you can generate a XML signature for the body of the in-message
which can be either a XML document or a plain text. The enveloped enveloping, or detached (as
of Camel 12.14) XML signature(s) will be set to the body of the out-message.
With the verifier endpoint, you can validate an enveloped or enveloping XML signature or even
several detached (as of Camel 2.14.0) XML signatures contained in the body of the in-
message; if the validation is successful, then the original content is extracted from the XML
signature and set to the body of the out-message.
The name part in the URI can be chosen by the user to distinguish between different
signer/verifier endpoints within the camel context.
BASIC EXAMPLE
The following example shows the basic usage of the component.
from("direct:enveloping").to("xmlsecurity:sign://enveloping?keyAccessor=#accessor",
"xmlsecurity:verify://enveloping?keySelector=#selector","mock:result")
In Spring XML:
For the signing process, a private key is necessary. You specify a key accessor bean which provides
this private key. For the validation, the corresponding public key is necessary; you specify a key
selector bean which provides this public key.
The key accessor bean must implement the KeyAccessor interface. The package
org.apache.camel.component.xmlsecurity.api contains the default implementation class
DefaultKeyAccessor which reads the private key from a Java keystore.
1184
CHAPTER 165. XML SECURITY COMPONENT
The key selector bean must implement the javax.xml.crypto.KeySelector interface. The package
org.apache.camel.component.xmlsecurity.api contains the default implementation class
DefaultKeySelector which reads the public key from a keystore.
For creating detached XML signatures, see the section called “Detached XML Signatures as Siblings of
the Signed Elements”.
SIGNING OPTIONS
The signer endpoint has the following options.
1185
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1186
CHAPTER 165. XML SECURITY COMPONENT
1187
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1188
CHAPTER 165. XML SECURITY COMPONENT
1189
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1190
CHAPTER 165. XML SECURITY COMPONENT
1191
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
VERIFYING OPTIONS
The verifier endpoint has the following options.
1192
CHAPTER 165. XML SECURITY COMPONENT
1193
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
types "Default",
"ElementName", and
"XPath". The default
implementation
determines a node
which is then serialized
and set to the body of
the ouput message. If
the search type is
"ElementName" then
the ouput node (which
must be in this case an
element) is determined
by the local name and
namespace defined in
the search value (see
option
outputNodeSearch).
If the search type is
"XPath" then the output
node is determined by
the XPath specified in
the search value (in this
case the ouput node can
be of type "Element",
"TextNode" or
"Document"). If the
output node search
type is "Default" then
the following rules
apply: In the enveloped
XML signature case
(there is a reference
with URI="" and
transform
"http://www.w3.org/20
00/09/xmldsig#envelo
ped-signature"), the
incoming XML
document without the
Signature element is set
to the output message
body. In the non-
enveloped XML
signature case, the
message body is
determined from a
referenced Object; this
is explained in more
detail in chapter "Output
Node Determination in
Enveloping XML
Signature Case".
1194
CHAPTER 165. XML SECURITY COMPONENT
1195
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
Only same document references are taken into account (URI must start with '#')
Also indirect same document references to an object via manifest are taken into account.
Then, the Object is dereferenced and the Object must only contain one XML element. This element is
returned as output node.
This does mean that the enveloping XML signature must have either the structure
<Signature>
<SignedInfo>
<Reference URI="#object"/>
<!-- further references possible but they must not point to an Object or Manifest containing an
object reference -->
...
</SignedInfo>
<Object Id="object">
<!-- contains one XML element which is extracted to the message body -->
<Object>
<!-- further object elements possible which are not referenced-->
1196
CHAPTER 165. XML SECURITY COMPONENT
...
(<KeyInfo>)?
</Signature>
or the structure
<Signature>
<SignedInfo>
<Reference URI="#manifest"/>
<!-- further references are possible but they must not point to an Object or other manifest
containing an object reference -->
...
</SignedInfo>
<Object >
<Manifest Id="manifest">
<Reference URI=#object/>
</Manifest>
</Objet>
<Object Id="object">
<!-- contains the DOM node which is extracted to the message body -->
</Object>
<!-- further object elements possible which are not referenced -->
...
(<KeyInfo>)?
</Signature>
You can create detached signatures where the signature is a sibling of the signed element. The
following example contains two detached signatures. The first signature is for the element "C" and the
second signature is for element "A". The signatures are nested; the second signature is for the
element A which also contains the first signature.
1197
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
...
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>aUDFmiG71</ds:SignatureValue>
</ds:Signature>
</B>
</A>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"Id="_6b02fb8a-30df-42c6-ba25-
76eba02c8214">
<ds:SignedInfo>
<ds:CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<ds:SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#IDforA">
...
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>q3tvRoGgc8cMUqUSzP6C21zb7tt04riPnDuk=</ds:SignatureValue>
</ds:Signature>
<root>
The example shows that you can sign several elements and that for each element a signature is
created as sibling. The elements to be signed must have an attribute of type ID. The ID type of the
attribute must be defined in the XML schema (see option schemaResourceUri). You specify a list of
XPATH expressions pointing to attributes of type ID (see option xpathsToIdAttributes). These
attributes determine the elements to be signed. The elements are signed by the same key given by the
keyAccessor bean. Ements with higher (=deeper) hierarachy level are signed first. In the example, the
element "C" is signed before the element "A".
from("direct:detached")
.to("xmlsecurity:sign://detached?
keyAccessor=#keyAccessorBeant&xpathsToIdAttributes=#xpathsToIdAttributesBean&schemaResour
ceUri=Test.xsd")
.to("xmlsecurity:verify://detached?
keySelector=#keySelectorBean&schemaResourceUri=org/apache/camel/component/xmlsecurity/Test
.xsd")
.to("mock:result");
1198
CHAPTER 165. XML SECURITY COMPONENT
<constructor-arg>
<map key-type="java.lang.String" value-type="java.lang.String">
<entry key="ns" value="http://test" />
</map>
</constructor-arg>
</bean>
</list>
</constructor-arg>
</bean>
...
<from uri="direct:detached" />
<to
uri="xmlsecurity:sign://detached?
keyAccessor=#keyAccessorBean&xpathsToIdAttributes=#xpathsToIdAttributesBean&sche
maResourceUri=Test.xsd" />
<to
uri="xmlsecurity:verify://detached?
keySelector=#keySelectorBean&schemaResourceUri=Test.xsd" />
<to uri="mock:result" />
<QualifyingProperties Target>
<SignedProperties>
<SignedSignatureProperties>
(SigningTime)?
(SigningCertificate)?
(SignaturePolicyIdentifier)
(SignatureProductionPlace)?
(SignerRole)?
</SignedSignatureProperties>
<SignedDataObjectProperties>
(DataObjectFormat)?
(CommitmentTypeIndication)?
</SignedDataObjectProperties>
</SignedProperties>
</QualifyingProperties>
The properties of the XAdES-BES form are the same except that the SignaturePolicyIdentifier
property is not part of XAdES-BES.
1199
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
org.apache.camel.component.xmlsecurity.api.XAdESSignatureProperties or
org.apache.camel.component.xmlsecurity.api.DefaultXAdESSignatureProperties.
XAdESSignatureProperties does support all properties mentioned above except the
SigningCertificate property. To get the SigningCertificate property, you must overwrite either the
method XAdESSignatureProperties.getSigningCertificate() or
XAdESSignatureProperties.getSigningCertificateChain(). The class
DefaultXAdESSignatureProperties overwrites the method getSigningCertificate() and allows you to
specify the signing certificate via a keystore and alias. The following example shows all parameters you
can specify. If you do not need certain parameters you can just omit them.
// signing certificate
props.setKeystore(keystore));
props.setAlias("cert_alias"); // specify the alias of the signing certificate in the keystore =
signer key alias
props.setDigestAlgorithmForSigningCertificate(DigestMethod.SHA256); // possible values for
the algorithm are "http://www.w3.org/2000/09/xmldsig#sha1",
"http://www.w3.org/2001/04/xmlenc#sha256", "http://www.w3.org/2001/04/xmldsig-
more#sha384", "http://www.w3.org/2001/04/xmlenc#sha512", default value is
"http://www.w3.org/2001/04/xmlenc#sha256"
props.setSigningCertificateURIs(Collections.singletonList("http://certuri"));
// signing time
props.setAddSigningTime(true);
// policy
props.setSignaturePolicy(XAdESSignatureProperties.SIG_POLICY_EXPLICIT_ID);
// also the values XAdESSignatureProperties.SIG_POLICY_NONE ("None"), and
XAdESSignatureProperties.SIG_POLICY_IMPLIED ("Implied")are possible, default value is
XAdESSignatureProperties.SIG_POLICY_EXPLICIT_ID ("ExplicitId")
// For "None" and "Implied" you must not specify any further policy parameters
props.setSigPolicyId("urn:oid:1.2.840.113549.1.9.16.6.1");
props.setSigPolicyIdQualifier("OIDAsURN"); //allowed values are empty string, "OIDAsURI",
"OIDAsURN"; default value is empty string
props.setSigPolicyIdDescription("invoice version 3.1");
props.setSignaturePolicyDigestAlgorithm(DigestMethod.SHA256);// possible values for the
algorithm are "http://www.w3.org/2000/09/xmldsig#sha1",
http://www.w3.org/2001/04/xmlenc#sha256", "http://www.w3.org/2001/04/xmldsig-more#sha384",
"http://www.w3.org/2001/04/xmlenc#sha512", default value is
http://www.w3.org/2001/04/xmlenc#sha256"
props.setSignaturePolicyDigestValue("Ohixl6upD6av8N7pEvDABhEL6hM=");
// you can add qualifiers for the signature policy either by specifying text or an XML fragment
1200
CHAPTER 165. XML SECURITY COMPONENT
// production place
props.setSignatureProductionPlaceCity("Munich");
props.setSignatureProductionPlaceCountryName("Germany");
props.setSignatureProductionPlacePostalCode("80331");
props.setSignatureProductionPlaceStateOrProvince("Bavaria");
//role
// you can add claimed roles either by specifying text or an XML fragment with the root
element "ClaimedRole"
props.setSignerClaimedRoles(Arrays.asList(new String[] {"test",
"<a:ClaimedRole xmlns:a=\"http://uri.etsi.org/01903/v1.3.2#\">
<TestRole>TestRole</TestRole></a:ClaimedRole>" }));
props.setSignerCertifiedRoles(Collections.singletonList(new
XAdESEncapsulatedPKIData("Ahixl6upD6av8N7pEvDABhEL6hM=",
"http://uri.etsi.org/01903/v1.2.2#DER", "IdCertifiedRole")));
//commitment
props.setCommitmentTypeId("urn:oid:1.2.840.113549.1.9.16.6.4");
props.setCommitmentTypeIdQualifier("OIDAsURN"); //allowed values are empty string,
"OIDAsURI", "OIDAsURN"; default value is empty string
props.setCommitmentTypeIdDescription("description for commitment type ID");
props.setCommitmentTypeIdDocumentationReferences(Arrays.asList(new String[]
{"http://test.com/commitment.ref1.txt",
"http://test.com/commitment.ref2.txt" }));
// you can specify a commitment type qualifier either by simple text or an XML fragment with
root element "CommitmentTypeQualifier"
props.setCommitmentTypeQualifiers(Arrays.asList(new String[] {"commitment qualifier",
"<c:CommitmentTypeQualifier xmlns:c=\"http://uri.etsi.org/01903/v1.3.2#\"><C>c</C>
</c:CommitmentTypeQualifier>" }));
beanRegistry.bind("xmlSignatureProperties",props);
beanRegistry.bind("keyAccessorDefault",keyAccessor);
1201
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("direct:xades").to("xmlsecurity:sign://xades?
keyAccessor=#keyAccessorDefault&properties=#xmlSignatureProperties")
.to("mock:result");
...
<from uri="direct:xades" />
<to
uri="xmlsecurity:sign://xades?
keyAccessor=#accessorRsa&properties=#xadesProperties" />
<to uri="mock:result" />
...
<bean id="xadesProperties"
class="org.apache.camel.component.xmlsecurity.api.XAdESSignatureProperties">
<!-- For more properties see the the previous Java DSL example.
If you want to have a signing certificate then use the bean class
DefaultXAdESSignatureProperties (see the previous Java DSL example). -->
<property name="signaturePolicy" value="ExplicitId" />
<property name="sigPolicyId" value="http://www.test.com/policy.pdf" />
<property name="sigPolicyIdDescription" value="factura" />
<property name="signaturePolicyDigestAlgorithm"
value="http://www.w3.org/2000/09/xmldsig#sha1" />
<property name="signaturePolicyDigestValue" value="Ohixl6upD6av8N7pEvDABhEL1hM="
/>
<property name="signerClaimedRoles" ref="signerClaimedRoles_XMLSigner" />
<property name="dataObjectFormatDescription" value="Factura electrónica" />
<property name="dataObjectFormatMimeType" value="text/xml" />
</bean>
<bean class="java.util.ArrayList" id="signerClaimedRoles_XMLSigner">
<constructor-arg>
<list>
<value>Emisor</value>
<value><ClaimedRole
xmlns="http://uri.etsi.org/01903/v1.3.2#"><test
xmlns="http://test.com/">test</test></ClaimedRole></value>
</list>
</constructor-arg>
</bean>
HEADERS
1202
CHAPTER 165. XML SECURITY COMPONENT
At most one DataObjectFormat element. More than one DataObjectFormat element makes
no sense because we have only one data object which is signed (this is the incoming message
body to the XML signer endpoint).
SEE ALSO
Best Practices
1203
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
XMPP COMPONENT
The xmpp: component implements an XMPP (Jabber) transport.
URI FORMAT
xmpp://[login@]hostname[:port][/participant][?Options]
The component supports both room based and private person-person conversations. The component
supports both producer and consumer (you can get messages from XMPP or send messages to XMPP).
Consumer mode supports rooms.
You can append query options to the URI in the following format, ?option=value&option=value&...
OPTIONS
Name Description
password Password.
serviceName The name of the service you are connecting to. For
Google Talk, this would be gmail.com.
1204
CHAPTER 166. XMPP
EXAMPLES
User superman to join room krypton at jabber server with password, secret:
xmpp://[email protected]/[email protected]&password=secret
xmpp://[email protected]/[email protected]?password=secret
from("timer://kickoff?period=10000").
setBody(constant("I will win!\n Your Superman.")).
to("xmpp://[email protected]/[email protected]?password=secret");
Consumer configuration, which writes all messages from joker into the queue, evil.talk.
1205
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
from("xmpp://[email protected]/[email protected]?password=secret").
to("activemq:evil.talk");
from("xmpp://[email protected]/?password=secret&[email protected]").
to("activemq:krypton.talk");
from("xmpp://[email protected]/?password=secret&room=krypton").
to("activemq:krypton.talk");
When connecting to the Google Chat service, you'll need to specify the serviceName as well as your
credentials:
1206
CHAPTER 167. XQUERY ENDPOINT
XQUERY
The xquery: component allows you to process a message using an XQuery template. This can be ideal
when using Templating to generate respopnses for requests.
URI FORMAT
xquery:templateName
Where templateName is the classpath-local URI of the template to invoke; or the complete URL of the
remote template.
from("activemq:My.Queue").
to("xquery:com/acme/mytransform.xquery");
To use an XQuery template to formulate a response to a message for InOut message exchanges (where
there is a JMSReplyTo header).
If you want to use InOnly, consume the message, and send it to another destination, you could use the
following route:
from("activemq:My.Queue").
to("xquery:com/acme/mytransform.xquery").
to("activemq:Another.Queue");
1207
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
XSLT
The xslt: component allows you to process a message using an XSLT template. This can be ideal when
using Templating to generate respopnses for requests.
URI FORMAT
xslt:templateName[?options]
Where templateName is the classpath-local URI of the template to invoke; or the complete URL of the
remote template. Refer to the Spring Documentation for more detail of the URI syntax
You can append query options to the URI in the following format, ?option=value&option=value&...
URI Description
From Camel 2.9 onwards the XSLT component is provided directly in the camel-core.
OPTIONS
1208
CHAPTER 168. XSLT
1209
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1210
CHAPTER 168. XSLT
from("activemq:My.Queue").
to("xslt:com/acme/mytransform.xsl");
To use an XSLT template to forumulate a response for a message for InOut message exchanges (where
there is a JMSReplyTo header).
If you want to use InOnly and consume the message and send it to another destination you could use
the following route:
from("activemq:My.Queue").
to("xslt:com/acme/mytransform.xsl").
to("activemq:Another.Queue");
<setHeader headerName="myParam"><constant>42</constant></setHeader>
<to uri="xslt:MyTransform.xsl"/>
And the XSLT just needs to declare it at the top level for it to be available:
<xsl:param name="myParam"/>
<xsl:template ...>
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="activemq:My.Queue"/>
1211
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
<to uri="xslt:org/apache/camel/spring/processor/example.xsl"/>
<to uri="activemq:Another.Queue"/>
</route>
</camelContext>
There is a test case along with its Spring XML if you want a concrete example.
USING XSL:INCLUDE
Camel provides its own implementation of URIResolver which allows Camel to load included files from
the classpath and more intelligent than before.
<xsl:include href="staff_template.xsl"/>
Will now be located relative from the starting endpoint, which for example could be:
.to("xslt:org/apache/camel/component/xslt/staff_include_relative.xsl")
You can use the following two prefixes classpath: or file: to instruct Camel to look either in classpath
or file system. If you omit the prefix then Camel uses the prefix from the endpoint configuration. If that
neither has one, then classpath is assumed.
<xsl:include href="../staff_other_template.xsl"/>
<xsl:include href="staff_template.xsl"/>
Then in Camel 2.10.3 and older, then Camel will use "classpath:" as the default prefix, and load the
resource from the classpath. This works for most cases, but if you configure the starting resource to
load from file,
.to("xslt:file:etc/xslt/staff_include_relative.xsl")
.. then you would have to prefix all your includes with "file:" as well.
<xsl:include href="file:staff_template.xsl"/>
From Camel 2.10.4 onwards we have made this easier as Camel will use the prefix from the endpoint
configuration as the default prefix. So from Camel 2.10.4 onwards you can do:
1212
CHAPTER 168. XSLT
<xsl:include href="staff_template.xsl"/>
Which will load the staff_template.xsl resource from the file system, as the endpoint was configured
with "file:" as prefix. You can still though explicit configure a prefix, and then mix and match. And have
both file and classpath loading. But that would be unusual, as most people either use file or classpath
based resources.
DYNAMIC STYLESHEETS
To provide a dynamic stylesheet at runtime you can define a dynamic URI. For example, you can do this
using the Recipient List Enterprise Integration Pattern (EIP), which is invoked using the .recipientList
command in the Java DSL.
From Camel 2.14 onwards, any warning/error or fatalError is stored on the current Exchange as a
property with the keys Exchange.XSLT_ERROR, Exchange.XSLT_FATAL_ERROR, or
Exchange.XSLT_WARNING which allows end users to get hold of any errors happening during
transformation.
For example in the stylesheet below, we want to terminate if a staff has an empty dob field. And to
include a custom error message using xsl:message.
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="staff/programmer">
<p>Name: <xsl:value-of select="name"/><br />
<xsl:if test="dob=''">
<xsl:message terminate="yes">Error: DOB is an empty string!</xsl:message>
</xsl:if>
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
This information is not available on the Exchange stored as an Exception that contains the message in
the getMessage() method on the exception. The exception is stored on the Exchange as a warning
with the key Exchange.XSLT_WARNING.
1213
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
XSTREAM COMPONENT
The XStream component provides the XStream data format, which uses the XStream library to marshal
and unmarshal Java objects to and from XML. For example, you can convert a message body to XML
using the xstream() DSL command, as follows:
camelctx.start();
try {
ProducerTemplate producer = camelctx.createProducerTemplate();
String customer = producer.requestBody("direct:start", new Customer("John", "Doe"), String.class);
} finally {
camelctx.stop();
}
1214
CHAPTER 170. YAMMER
YAMMER
The Yammer component allows you to interact with the Yammer enterprise social network.
Consuming messages, users, and user relationships is supported as well as creating new messages.
Yammer uses OAuth 2 for all client application authentication. In order to use camel-yammer with your
account, you'll need to create a new application within Yammer and grant the application access to
your account. Finally, generate your access token. More details are at
https://developer.yammer.com/v1.0/docs/authentication.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-yammer</artifactId>
<version>${camel-version}</version>
</dependency>
URI FORMAT
yammer:[function]?[options]
YAMMERCOMPONENT
The yammer component can be configured with the Yammer account settings which are mandatory to
configure before using. You can also configure these options directly in the endpoint.
Option Description
CONSUMING MESSAGES
The camel-yammer component provides several endpoints for consuming messages:
URI Description
1215
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
1216
CHAPTER 170. YAMMER
MESSAGE FORMAT
All messages by default are converted to a POJO model provided in the
org.apache.camel.component.yammer.model package. The original message coming from yammer is in
JSON. For all message consuming & producing endpoints, a Messages object is returned. Take for
example a route like:
from("yammer:messages?
consumerKey=aConsumerKey&consumerSecret=aConsumerSecretKey&accessToken=aAccessToken")
.to("mock:result");
{
"messages":[
{
1217
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
"replied_to_id":null,
"network_id":7654,
"url":"https://www.yammer.com/api/v1/messages/305298242",
"thread_id":305298242,
"id":305298242,
"message_type":"update",
"chat_client_sequence":null,
"body":{
"parsed":"Testing yammer API...",
"plain":"Testing yammer API...",
"rich":"Testing yammer API..."
},
"client_url":"https://www.yammer.com/",
"content_excerpt":"Testing yammer API...",
"created_at":"2013/06/25 18:14:45 +0000",
"client_type":"Web",
"privacy":"public",
"sender_type":"user",
"liked_by":{
"count":1,
"names":[
{
"permalink":"janstey",
"full_name":"Jonathan Anstey",
"user_id":1499642294
}
},
"sender_id":1499642294,
"language":null,
"system_message":false,
"attachments":[
],
"direct_message":false,
"web_url":"https://www.yammer.com/redhat.com/messages/305298242"
},
{
"replied_to_id":null,
"network_id":7654,
"url":"https://www.yammer.com/api/v1/messages/294326302",
"thread_id":294326302,
"id":294326302,
"message_type":"system",
"chat_client_sequence":null,
"body":{
"parsed":"(Principal Software Engineer) has [[tag:14658]] the redhat.com network. Take a moment
to welcome Jonathan.",
"plain":"(Principal Software Engineer) has #joined the redhat.com network. Take a moment to
welcome Jonathan.",
"rich":"(Principal Software Engineer) has #joined the redhat.com network. Take a moment to
welcome Jonathan."
},
"client_url":"https://www.yammer.com/",
1218
CHAPTER 170. YAMMER
}
}
]
Camel will marshal that into a Messages object containing 2 Message objects. As shown below there is
a rich object model that makes it easy to get any information you need:
assertEquals(2, messages.getMessages().size());
assertEquals("Testing yammer API...", messages.getMessages().get(0).getBody().getPlain());
assertEquals("(Principal Software Engineer) has #joined the redhat.com network. Take a
moment to welcome Jonathan.", messages.getMessages().get(1).getBody().getPlain());
That said, marshaling this data into POJOs is not free so if you need you can switch back to using pure
JSON by adding the useJson=false option to your URI.
CREATING MESSAGES
To create a new message in the account of the current user, you can use the following URI:
yammer:messages?[options]
The current Camel message body is what will be used to set the text of the Yammer message. The
response body will include the new message formatted the same way as when you consume messages
(i.e. as a Messages object by default).
from("direct:start").to("yammer:messages?
consumerKey=aConsumerKey&consumerSecret=aConsumerSecretKey&accessToken=aAccessToken")
.to("mock:result");
1219
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
a new message will be created in the current user's account on the server and also this new message
will be returned to Camel and converted into a Messages object. Like when consuming messages you
can interrogate the Messages object:
assertEquals(1, messages.getMessages().size());
assertEquals("Hi from Camel!", messages.getMessages().get(0).getBody().getPlain());
yammer:relationships?[options]
RETRIEVING USERS
The camel-yammer component provides several endpoints for retrieving users:
1220
CHAPTER 170. YAMMER
URI Description
USING AN ENRICHER
It is helpful sometimes (or maybe always in the case of users or relationship consumers) to use an
enricher pattern rather than a route initiated with one of the polling consumers in camel-yammer. This
is because the consumers will fire repeatedly, however often you set the delay for. If you just want to
look up a user's data, or grab a message at a point in time, it is better to call that consumer once and
then get one with your route.
Lets say you have a route that at some point needs to go out and fetch user data for the current user.
Rather than polling for this user over and over again, use the pollEnrich DSL method:
from("direct:start").pollEnrich("yammer:current?
consumerKey=aConsumerKey&consumerSecret=aConsumerSecretKey&accessToken=aAccessToken")
.to("mock:result");
This will go out and fetch the current user's User object and set it as the Camel message body.
1221
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
ZOOKEEPER
Available as of Camel 2.9
The ZooKeeper component allows interaction with a ZooKeeper cluster and exposes the following
features to Camel:
3. Create and retrieve the list the child nodes attached to a particular node.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-zookeeper</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI FORMAT
zookeeper://zookeeper-server[:port][/path][?options]
The path from the uri specifies the node in the ZooKeeper server (aka znode) that will be the target of
the endpoint.
OPTIONS
1222
CHAPTER 171. ZOOKEEPER
USE CASES
from("zookeeper://localhost:39913/somepath/somenode").to("mock:result");
if the node does not yet exist then a flag can be supplied to have the endpoint await its creation
from("zookeeper://localhost:39913/somepath/somenode?awaitCreation=true").to("mock:result");
WRITING TO A ZNODE.
The following snippet will write the payload of the exchange into the znode at '/somepath/somenode/'
provided that it already exists
from("direct:write-to-znode").to("zookeeper://localhost:39913/somepath/somenode");
For flexibility, the endpoint allows the target znode to be specified dynamically as a message header. If
1223
Red Hat JBoss Fuse 6.2.1 Apache Camel Component Reference
a header keyed by the string 'CamelZooKeeperNode' is present then the value of the header will be
used as the path to the znode on the server. For instance using the same route definition above, the
following code snippet will write the data not to '/somepath/somenode' but to the path from the
header '/somepath/someothernode'
Exchange e = createExchangeWithBody(testPayload);
template.sendBodyAndHeader("direct:write-to-znode", e, "CamelZooKeeperNode",
"/somepath/someothernode");
To also create the node if it does not exist the 'create' option should be used.
from("direct:create-and-write-to-znode").to("zookeeper://localhost:39913/somepath/somenode?
create=true");
Starting version 2.11 it is also possible to delete a node using the header 'CamelZookeeperOperation'
by setting it to 'DELETE'.
from("direct:delete-znode").setHeader(ZooKeeperMessage.ZOOKEEPER_OPERATION,
constant("DELETE")).to("zookeeper://localhost:39913/somepath/somenode");
or equivalently
<route>
<from uri="direct:delete-znode" />
<setHeader headerName="CamelZookeeperOperation">
<constant>DELETE</constant>
</setHeader>
<to uri="zookeeper://localhost:39913/somepath/somenode" />
</route>
ZooKeeper nodes can have different types; they can be 'Ephemeral' or 'Persistent' and 'Sequenced' or
'Unsequenced'. For further information of each type you can check here. By default endpoints will
create unsequenced, ephemeral nodes, but the type can be easily manipulated via a uri config
parameter or via a special message header. The values expected for the create mode are simply the
names from the CreateMode enumeration
PERSISTENT
PERSISTENT_SEQUENTIAL
EPHEMERAL
EPHEMERAL_SEQUENTIAL
from("direct:create-and-write-to-persistent-
znode").to("zookeeper://localhost:39913/somepath/somenode?
create=true&createMode=PERSISTENT");
1224
CHAPTER 171. ZOOKEEPER
Exchange e = createExchangeWithBody(testPayload);
template.sendBodyAndHeader("direct:create-and-write-to-persistent-znode", e,
"CamelZooKeeperCreateMode", "PERSISTENT");
The policy uses a common znode path across all instances of the RoutePolicy that will be involved in
the election. Each policy writes its id into this node and zookeeper will order the writes in the order it
received them. The policy then reads the listing of the node to see what postion of its id; this postion is
used to determine if the route should be started or not. The policy is configured at startup with the
number of route instances that should be started across the cluster and if its position in the list is less
than this value then its route will be started. For a Master-slave scenario, the route is configured with 1
route instance and only the first entry in the listing will start its route. All policies watch for updates to
the listing and if the listing changes they recalculate if their route should be started. For more info on
Zookeeper's Leader election capability see this page.
The following example uses the node '/someapplication/somepolicy' for the election and is set up to
start only the top '1' entries in the node listing i.e. elect a master
1225