Repository: camel Updated Branches: refs/heads/master d5fc6d6af -> f6fea27ac
http://git-wip-us.apache.org/repos/asf/camel/blob/f6fea27a/components/camel-jms/src/main/docs/readme.adoc ---------------------------------------------------------------------- diff --git a/components/camel-jms/src/main/docs/readme.adoc b/components/camel-jms/src/main/docs/readme.adoc deleted file mode 100644 index e63dc8d..0000000 --- a/components/camel-jms/src/main/docs/readme.adoc +++ /dev/null @@ -1,1700 +0,0 @@ -[[JMS-JMSComponent]] -JMS Component -~~~~~~~~~~~~~ - -[TIP] -==== -*Using ActiveMQ* - -If you are using http://activemq.apache.org/[Apache ActiveMQ], you -should prefer the link:activemq.html[ActiveMQ] component as it has been -optimized for link:activemq.html[ActiveMQ]. All of the options and -samples on this page are also valid for the link:activemq.html[ActiveMQ] -component. -==== - -[NOTE] -==== -*Transacted and caching* - -See section _Transactions and Cache Levels_ below if you are using -transactions with link:jms.html[JMS] as it can impact performance. -==== - -[NOTE] -==== -*Request/Reply over JMS* - -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. -==== - -This component allows messages to be sent to (or consumed from) a -http://java.sun.com/products/jms/[JMS] Queue or Topic. It uses Spring's -JMS support for declarative transactions, including 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: - -[source,xml] ------------------------------------------------------------- -<dependency> - <groupId>org.apache.camel</groupId> - <artifactId>camel-jms</artifactId> - <version>x.x.x</version> - <!-- use the same version as your Camel core version --> -</dependency> ------------------------------------------------------------- - -[[JMS-URIformat]] -URI format -^^^^^^^^^^ - --------------------------------------------- -jms:[queue:|topic:]destinationName[?options] --------------------------------------------- - -Where `destinationName` is a JMS queue or topic name. By default, the -`destinationName` is interpreted as a queue name. For example, to -connect to the queue, `FOO.BAR` use: - ------------ -jms:FOO.BAR ------------ - -You can include the optional `queue:` prefix, if you prefer: - ------------------ -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&...` - -[[JMS-Notes]] -Notes -^^^^^ - -[[JMS-UsingActiveMQ]] -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 -http://activemq.apache.org/jmstemplate-gotchas.html[poor performance]. - -If you intend to use http://activemq.apache.org/[Apache ActiveMQ] as -your Message Broker - which is a good choice as ActiveMQ rocks -image:https://cwiki.apache.org/confluence/s/en_GB/5982/f2b47fb3d636c8bc9fd0b11c0ec6d0ae18646be7.1/_/images/icons/emoticons/smile.png[(smile)] -, then we recommend that you either: - -* Use the link:activemq.html[ActiveMQ] component, which is already -optimized to use ActiveMQ efficiently -* Use the `PoolingConnectionFactory` in ActiveMQ. - -[[JMS-TransactionsandCacheLevels]] -Transactions and Cache Levels -+++++++++++++++++++++++++++++ - -If you are consuming messages and using transactions -(`transacted=true`) then the default settings for cache level can impact -performance. + - If you are using XA transactions then you cannot cache as it can cause -the XA transaction to not work properly. - -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 - -So you can say the default setting is conservative. Consider using -`cacheLevelName=CACHE_CONSUMER` if you are using non-XA transactions. - -[[JMS-DurableSubscriptions]] -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 -http://activemq.apache.org/virtual-destinations.html[Virtual Topics] -instead to avoid this limitation. More background on durable messaging -http://activemq.apache.org/how-do-durable-queues-and-topics-work.html[here]. - -[[JMS-MessageHeaderMapping]] -Message Header Mapping -++++++++++++++++++++++ - -When using message headers, the JMS specification states that header -names must be valid Java identifiers. So try to name your headers to be -valid Java identifiers. One benefit of doing this is that you 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 - -[[JMS-Options]] -Options -^^^^^^^ - -You can configure many different properties on the JMS endpoint which -map to properties on the -http://camel.apache.org/maven/current/camel-jms/apidocs/org/apache/camel/component/jms/JmsConfiguration.html[JMSConfiguration -POJO]. - -[WARNING] -==== -*Mapping to Spring JMS* - -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. - -[[JMS-Mostcommonlyusedoptions]] -Most commonly used options -++++++++++++++++++++++++++ - -[width="100%",cols="10%,10%,80%",options="header",] -|======================================================================= -|Option |Default Value |Description -|`clientId` |`null` |Sets the JMS client ID to use. Note that this -value, if specified, must be unique and can only be used by a single JMS -connection instance. It is typically only required for durable topic -subscriptions. You may prefer to use -http://activemq.apache.org/virtual-destinations.html[Virtual Topics] -instead. - -|`concurrentConsumers` |`1` |Specifies the default number of concurrent -consumers. From *Camel 2.10.3* onwards this option can also be used when -doing request/reply over JMS. From *Camel 2.16* onwards there is a new -replyToConcurrentConsumers. See also the `maxMessagesPerTask` option to -control dynamic scaling up/down of threads. - -|`replyToConcurrentConsumers` |1 |*Camel 2.16:* Specifies the default -number of concurrent consumers when doing request/reply over JMS. - -|`disableReplyTo` |`false` |If `true`, a producer will behave like a -InOnly exchange with the exception that `JMSReplyTo` header is sent out -and not be suppressed like in the case of `InOnly`. Like `InOnly` the -producer will not wait for a reply. A consumer with this flag will -behave like `InOnly`. This feature can be used to bridge `InOut` -requests to another queue so that a route on the other queue will send -it´s response directly back to the original `JMSReplyTo`. - -|`durableSubscriptionName` |`null` |The durable subscriber name for -specifying durable topic subscriptions. The `clientId` option *must* be -configured as well. - -|`maxConcurrentConsumers` |`1` |Specifies the maximum number of -concurrent consumers. From *Camel 2.10.3* onwards this option can also -be used when doing request/reply over JMS. From **Camel 2.16** onwards -there is a new replyToMaxConcurrentConsumers. See also the -`maxMessagesPerTask` option to control dynamic scaling up/down of -threads. The `maxMessagesPerTask` option MUST be set to an integer -greater than 0 for threads to scale down. Otherwise, the number of -threads will stay at maxConcurrentConsumers until shutdown. - -|`replyToMaxConcurrentConsumers` |1 |*Camel 2.16:* Specifies the maximum -number of concurrent consumers when doing request/reply over JMS. See -also the `maxMessagesPerTask` option to control dynamic scaling up/down -of threads. - -|`maxMessagesPerTask` |`-1` |The number of messages per task. -1 is -unlimited. If you use a range for concurrent consumers (eg min < max), -then this option can be used to set a value to eg `100` to control how -fast the consumers will shrink when less work is required. - -|`preserveMessageQos` |`false` |Set to `true`, if you want to send -message using the QoS settings specified on the message, instead of the -QoS settings on the JMS endpoint. The following three headers are -considered `JMSPriority`, `JMSDeliveryMode`, and `JMSExpiration`. You -can provide all or only some of them. If not provided, Camel will fall -back to use the values from the endpoint instead. So, when using this -option, the headers override the values from the endpoint. The -`explicitQosEnabled` option, by contrast, will only use options set on -the endpoint, and not values from the message header. - -|`replyTo` |`null` |Provides an explicit ReplyTo destination, which -overrides any incoming value of `Message.getJMSReplyTo()`. If you do -link:request-reply.html[Request Reply] over JMS then *make sure* to read -the section _Request-reply over JMS_ further below for more details, and -the `replyToType` option as well. - -|`replyToOverride` |`null` |*Camel 2.15:* Provides an explicit ReplyTo -destination in the JMS message, which overrides the setting of replyTo. -It is useful if you want to forward the message to a remote Queue and -receive the reply message from the ReplyTo destination. - -|`replyToType` |`null` |*Camel 2.9:* Allows for explicitly specifying -which kind of strategy to use for replyTo queues when doing -request/reply over JMS. Possible values are: `Temporary`, `Shared`, or -`Exclusive`. By default Camel will use temporary queues. However if -`replyTo` has been configured, then `Shared` is used by default. This -option allows you to use exclusive queues instead of shared ones. See -further below for more details, and especially the notes about the -implications if running in a clustered environment, and the fact that -`Shared` reply queues has lower performance than its alternatives -`Temporary` and `Exclusive`. - -|`requestTimeout` |`20000` |*Producer only:* The timeout for waiting for -a reply when using the InOut link:exchange-pattern.html[Exchange -Pattern] (in milliseconds). The default is 20 seconds. From *Camel -2.13/2.12.3* onwards you can include the header -`"CamelJmsRequestTimeout"` to override this endpoint configured timeout -value, and thus have per message individual timeout values. See below in -section _About time to live_ for more details. See also the -_requestTimeoutCheckerInterval_ option. - -|`selector` |`null` |Sets the JMS Selector, which is an SQL 92 predicate -that is used to filter messages within the broker. You may have to -encode special characters such as = as %3D **Before Camel 2.3.0**, we -don't support this option in CamelConsumerTemplate - -|`timeToLive` |`null` |When sending messages, specifies the time-to-live -of the message (in milliseconds). See below in section _About time to -live_ for more details. - -|`transacted` |`false` |Specifies whether to use transacted mode for -sending/receiving messages using the InOnly -link:exchange-pattern.html[Exchange Pattern]. - -|`testConnectionOnStartup` |`false` |*Camel 2.1:* Specifies whether to -test the connection on startup. This ensures that when Camel starts that -all the JMS consumers have a valid connection to the JMS broker. If a -connection cannot be granted then Camel throws an exception on startup. -This ensures that Camel is not started with failed connections. From -*Camel 2.8* onwards also the JMS producers is tested as well. -|======================================================================= - -[[JMS-Alltheotheroptions]] -All the other options -+++++++++++++++++++++ - - - -[width="100%",cols="10%,10%,80%",options="header",] -|======================================================================= -|Option |Default Value |Description -|`acceptMessagesWhileStopping` |`false` |Specifies whether the consumer -accept messages while it is stopping. You may consider enabling this -option, if you start and stop link:jms.html[JMS] routes at runtime, -while there are still messages enqued on the queue. If this option is -`false`, and you stop the link:jms.html[JMS] route, then messages may be -rejected, and the JMS broker would have to attempt redeliveries, which -yet again may be rejected, and eventually the message may be moved at a -dead letter queue on the JMS broker. To avoid this its recommended to -enable this option. - -|`acknowledgementModeName` |`AUTO_ACKNOWLEDGE` |The JMS acknowledgement -name, which is one of: `SESSION_TRANSACTED`, `CLIENT_ACKNOWLEDGE`, -`AUTO_ACKNOWLEDGE`, `DUPS_OK_ACKNOWLEDGE` - -|`acknowledgementMode` |`-1` |The JMS acknowledgement mode defined as an -Integer. Allows you to set vendor-specific extensions to the -acknowledgment mode. For the regular modes, it is preferable to use the -`acknowledgementModeName` instead. - -|`allowNullBody` |`true` |*Camel 2.9.3/2.10.1:* Whether to allow sending -messages with no body. If this option is `false` and the message body is -null, then an `JMSException` is thrown. - -|`alwaysCopyMessage` |`false` |If `true`, Camel will always make a JMS -message copy of the message when it is passed to the producer for -sending. Copying the message is needed in some situations, such as when -a `replyToDestinationSelectorName` is set (incidentally, Camel will set -the `alwaysCopyMessage` option to `true`, if a -`replyToDestinationSelectorName` is set) - -|`asyncConsumer` |`false` |*Camel 2.9:* Whether the `JmsConsumer` -processes the link:exchange.html[Exchange] -link:asynchronous-routing-engine.html[asynchronously]. If enabled then -the `JmsConsumer` may pickup the next message from the JMS queue, while -the previous message is being processed asynchronously (by the -link:asynchronous-routing-engine.html[Asynchronous Routing Engine]). -This means that messages may be processed not 100% strictly in order. If -disabled (as default) then the link:exchange.html[Exchange] is fully -processed before the `JmsConsumer` will pickup the next message from the -JMS queue. Note if `transacted` has been enabled, then -`asyncConsumer=true` does not run asynchronously, as transactions must -be executed synchronously (Camel 3.0 may support async transactions). - -|`asyncStartListener` |`false` |*Camel 2.10:* Whether to startup the -`JmsConsumer` message listener asynchronously, when starting a route. -For example if a `JmsConsumer` cannot get a connection to a remote JMS -broker, then it may block while retrying and/or failover. This will -cause Camel to block while starting routes. By setting this option to -`true`, you will let routes startup, while the `JmsConsumer` connects to -the JMS broker using a dedicated thread in asynchronous mode. If this -option is used, then beware that if the connection could not be -established, then an exception is logged at `WARN` level, and the -consumer will not be able to receive messages; You can then restart the -route to retry. - -|`asyncStopListener` |`false` |*Camel 2.10:* Whether to stop the -`JmsConsumer` message listener asynchronously, when stopping a route. - -|`autoStartup` |`true` |Specifies whether the consumer container should -auto-startup. - -|`cacheLevelName` |CACHE_AUTO (Camel >= 2.8.0) + - CACHE_CONSUMER (Camel <= 2.7.1) |Sets the cache level by name for the -underlying JMS resources. 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 -http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jms/listener/DefaultMessageListenerContainer.html[Spring -documentation] and link:jms.html[Transactions Cache Levels] for more -information. - -|`cacheLevel` | |Sets the cache level by ID for the underlying JMS -resources. See `cacheLevelName` option for more details. - -|`consumerType` |`Default` |The consumer type to use, which can be one -of: `Simple`, `Default`, or `Custom`. The consumer type determines which -Spring JMS listener to use. `Default` will use -`org.springframework.jms.listener.DefaultMessageListenerContainer`, -`Simple` will use -`org.springframework.jms.listener.SimpleMessageListenerContainer`. When -`Custom` is specified, the `MessageListenerContainerFactory` defined by -the `messageListenerContainerFactoryRef` option will determine what -`org.springframework.jms.listener.AbstractMessageListenerContainer` to -use (**new option in Camel 2.10.2 onwards**). This option was temporary -removed in Camel 2.7 and 2.8. But has been added back from Camel 2.9 -onwards. - -|`connectionFactory` |`null` |The default JMS connection factory to use -for the `listenerConnectionFactory` and `templateConnectionFactory`, if -neither is specified. - -|`defaultTaskExecutorType` |(see description) |*Camel 2.10.4:* Specifies -what default TaskExecutor type to use in the -DefaultMessageListenerContainer, for both consumer endpoints and the -ReplyTo consumer of producer endpoints. Possible values: `SimpleAsync` -(uses Spring's -http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/task/SimpleAsyncTaskExecutor.html[SimpleAsyncTaskExecutor]) -or `ThreadPool` (uses Spring's -http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html[ThreadPoolTaskExecutor] -with optimal values - cached threadpool-like). If not set, it defaults -to the previous behaviour, which uses a cached thread pool for consumer -endpoints and SimpleAsync for reply consumers. The use of `ThreadPool` -is recommended to reduce "thread trash" in elastic configurations with -dynamically increasing and decreasing concurrent consumers. - -|`deliveryMode` |null |*Camel 2.12.2/2.13:* Specifies the delivery mode -to be used. Possibles values are those defined by -`javax.jms.DeliveryMode`. - -|`deliveryPersistent` |`true` |Specifies whether persistent delivery is -used by default. - -|`destination` |`null` |Specifies the JMS Destination object to use on -this endpoint. - -|`destinationName` |`null` |Specifies the JMS destination name to use on -this endpoint. - -|`destinationResolver` |`null` |A pluggable -`org.springframework.jms.support.destination.DestinationResolver` that -allows you to use your own resolver (for example, to lookup the real -destination in a JNDI registry). - -|`disableTimeToLive` |`false` |*Camel 2.8:* Use this option to force -disabling time to live. For example when you do request/reply over JMS, -then Camel will by default use the `requestTimeout` value as time to -live on the message being sent. The problem is that the sender and -receiver systems have to have their clocks synchronized, so they are in -sync. This is not always so easy to archive. So you can use -`disableTimeToLive=true` to *not* set a time to live value on the sent -message. Then the message will not expire on the receiver system. See -below in section _About time to live_ for more details. - -|`eagerLoadingOfProperties` |`false` |Enables eager loading of JMS -properties as soon as a message is received, which is generally -inefficient, because the JMS properties might not be required. But this -feature can sometimes catch early any issues with the underlying JMS -provider and the use of JMS properties. This feature can also be used -for testing purposes, to ensure JMS properties can be understood and -handled correctly. - -|`exceptionListener` |`null` |Specifies the JMS Exception Listener that -is to be notified of any underlying JMS exceptions. - -|`errorHandler` |`null` |*Camel 2.8.2, 2.9:* Specifies a -`org.springframework.util.ErrorHandler` to be invoked in case of any -uncaught exceptions thrown while processing a `Message`. By default -these exceptions will be logged at the WARN level, if no `errorHandler` -has been configured. From *Camel 2.9.1:* onwards you can configure -logging level and whether stack traces should be logged using the below -two options. This makes it much easier to configure, than having to code -a custom `errorHandler`. - -|`errorHandlerLoggingLevel` |`WARN` |*Camel 2.9.1:* Allows to configure -the default `errorHandler` logging level for logging uncaught -exceptions. - -|`errorHandlerLogStackTrace` |`true` |*Camel 2.9.1:* Allows to control -whether stacktraces should be logged or not, by the default -`errorHandler`. - -|`explicitQosEnabled` |`false` |Set if the `deliveryMode`, `priority` or -`timeToLive` qualities of service should be used when sending messages. -This option is based on Spring's `JmsTemplate`. The `deliveryMode`, -`priority` and `timeToLive` options are applied to the current endpoint. -This contrasts with the `preserveMessageQos` option, which operates at -message granularity, reading QoS properties exclusively from the Camel -In message headers. - -|`exposeListenerSession` |`true` |Specifies whether the listener session -should be exposed when consuming messages. - -|`forceSendOriginalMessage` |`false` |*Camel 2.7:* When using -`mapJmsMessage=false` Camel will create a new JMS message to send to a -new JMS destination if you touch the headers (get or set) during the -route. Set this option to `true` to force Camel to send the original JMS -message that was received. - -|`idleTaskExecutionLimit` |`1` |Specifies the limit for idle executions -of a receive task, not having received any message within its execution. -If this limit is reached, the task will shut down and leave receiving to -other executing tasks (in the case of dynamic scheduling; see the -`maxConcurrentConsumers` setting). There is additional doc available -from -http://static.springsource.org/spring/docs/3.0.5.RELEASE/api/org/springframework/jms/listener/DefaultMessageListenerContainer.html#setIdleTaskExecutionLimit(int)[Spring]. - -|`idleConsumerLimit` |`1` |*Camel 2.8.2, 2.9:* Specify the limit for the -number of consumers that are allowed to be idle at any given time. - -|`includeSentJMSMessageID` |`false` |*Camel 2.10.3:* Only applicable -when sending to JMS destination using InOnly (eg fire and forget). -Enabling this option will enrich the Camel link:exchange.html[Exchange] -with the actual JMSMessageID that was used by the JMS client when the -message was sent to the JMS destination. - -|`includeAllJMSXProperties` |`false` |*Camel 2.11.2/2.12:* Whether to -include all JMSXxxx properties when mapping from JMS to Camel Message. -Setting this to `true` will include properties such as `JMSXAppID`, and -`JMSXUserID` etc. *Note:* If you are using a custom -`headerFilterStrategy` then this option does not apply. - -|`jmsMessageType` |`null` |Allows you to force the use of a specific -`javax.jms.Message` implementation for sending JMS messages. Possible -values are: `Bytes`, `Map`, `Object`, `Stream`, `Text`. By default, -Camel would determine which JMS message type to use from the In body -type. This option allows you to specify it. - -|`jmsKeyFormatStrategy` |`default` |Pluggable strategy for encoding and -decoding JMS keys so they can be compliant with the JMS specification. -Camel provides two implementations out of the box: `default` and -`passthrough`. The `default` strategy will safely marshal dots and -hyphens (`.` and `-`). The `passthrough` strategy leaves the key as is. -Can be used for JMS brokers which do not care whether JMS header keys -contain illegal characters. You can provide your own implementation of -the `org.apache.camel.component.jms.JmsKeyFormatStrategy` and refer to -it using the `#` notation. - -|`jmsOperations` |`null` |Allows you to use your own implementation of -the `org.springframework.jms.core.JmsOperations` interface. Camel uses -`JmsTemplate` as default. Can be used for testing purpose, but not used -much as stated in the spring API docs. - -|`lazyCreateTransactionManager` |`true` |If `true`, Camel will create a -`JmsTransactionManager`, if there is no `transactionManager` injected -when option `transacted=true`. - -|`listenerConnectionFactory` |`null` |The JMS connection factory used -for consuming messages. - -|`mapJmsMessage` |`true` |Specifies whether Camel should auto map the -received JMS message to an appropiate payload type, such as -`javax.jms.TextMessage` to a `String` etc. See section about how mapping -works below for more details. - -|`maximumBrowseSize` |`-1` |Limits the number of messages fetched at -most, when browsing endpoints using link:browse.html[Browse] or JMX API. - -|`messageConverter` |`null` |To use a custom Spring -`org.springframework.jms.support.converter.MessageConverter` so you can -be 100% in control how to map to/from a `javax.jms.Message`. - -|`messageIdEnabled` |`true` |When sending, specifies whether message IDs -should be added. - -|`messageListenerContainerFactoryRef` |`null` |*Camel 2.10.2:* Registry -ID of the `MessageListenerContainerFactory` used to determine what -`org.springframework.jms.listener.AbstractMessageListenerContainer` to -use to consume messages. Setting this will automatically set -`consumerType` to `Custom`. - -|`messageTimestampEnabled` |`true` |Specifies whether timestamps should -be enabled by default on sending messages. - -|`password` |`null` |The password for the connector factory. - -|`priority` |`4` |Values greater than 1 specify the message priority -when sending (where 0 is the lowest priority and 9 is the highest). The -`explicitQosEnabled` option *must* also be enabled in order for this -option to have any effect. - -|`pubSubNoLocal` |`false` |Specifies whether to inhibit the delivery of -messages published by its own connection. - -|`receiveTimeout` |1000 |The timeout for receiving messages (in -milliseconds). - -|`recoveryInterval` |`5000` |Specifies the interval between recovery -attempts, i.e. when a connection is being refreshed, in milliseconds. -The default is 5000 ms, that is, 5 seconds. - -|`replyToSameDestinationAllowed` |`false` |*Camel 2.16:* **Consumer -only:**Whether a JMS consumer is allowed to send a reply message to the -same destination that the consumer is using to consume from. This -prevents an endless loop by consuming and sending back the same message -to itself. - -|`replyToCacheLevelName` |CACHE_CONSUMER |*Camel 2.9.1:* Sets the cache -level by name for the reply consumer when doing request/reply over JMS. -This option only applies when using fixed reply queues (not temporary). -Camel will by default use: `CACHE_CONSUMER` for exclusive or shared w/ -`replyToSelectorName`. And `CACHE_SESSION` for shared without -`replyToSelectorName`. Some JMS brokers such as IBM WebSphere may -require to set the `replyToCacheLevelName=CACHE_NONE` to work. *Note:* -If using temporary queues then `CACHE_NONE` is not allowed, and you must -use a higher value such as `CACHE_CONSUMER` or `CACHE_SESSION`. - -|`replyToDestinationSelectorName` |`null` |Sets the JMS Selector using -the fixed name to be used so you can filter out your own replies from -the others when using a shared queue (that is, if you are not using a -temporary reply queue). - -|`replyToDeliveryPersistent` |`true` |Specifies whether to use -persistent delivery by default for replies. - -|`requestTimeoutCheckerInterval` |`1000` |*Camel 2.9.2:* Configures how -often Camel should check for timed out link:exchange.html[Exchange]s -when doing request/reply over JMS.By default Camel checks once per -second. But if you must react faster when a timeout occurs, then you can -lower this interval, to check more frequently. The timeout is determined -by the option __requestTimeout__. - -|`subscriptionDurable` |`false` |*@deprecated:* Enabled by default, if -you specify a `durableSubscriptionName` and a `clientId`. - -|`taskExecutor` |`null` |Allows you to specify a custom task executor -for consuming messages. - -|`taskExecutorSpring2` |`null` |*Camel 2.6:* To use when using Spring -2.x with Camel. Allows you to specify a custom task executor for -consuming messages. - -|`templateConnectionFactory` |`null` |The JMS connection factory used -for sending messages. - -|`transactedInOut` |`false` |*@deprecated:* Specifies whether to use -transacted mode for sending messages using the InOut -link:exchange-pattern.html[Exchange Pattern]. Applies only to producer -endpoints. See section link:jms.html[Enabling Transacted Consumption] -for more details. - -|`transactionManager` |`null` |The Spring transaction manager to use. - -|`transactionName` |`"JmsConsumer [destinationName]"` |The name of the -transaction to use. - -|`transactionTimeout` |`null` |The timeout value of the transaction (in -seconds), if using transacted mode. - -|`transferException` |`false` |If enabled and you are using -link:request-reply.html[Request Reply] messaging (InOut) and an -link:exchange.html[Exchange] failed on the consumer side, then the -caused `Exception` will be send back in response as a -`javax.jms.ObjectMessage`. If the client is Camel, the returned -`Exception` is rethrown. This allows you to use Camel link:jms.html[JMS] -as a bridge in your routing - for example, using persistent queues to -enable robust routing. Notice that if you also have *transferExchange* -enabled, this option takes precedence. The caught exception is required -to be serializable. The original `Exception` on the consumer side can be -wrapped in an outer exception such as -`org.apache.camel.RuntimeCamelException` when returned to the producer. - -|`transferFault` |`false` |*Camel 2.17:* If enabled and you are using -Request Reply messaging (InOut) and an Exchange failed with a SOAP fault -(not exception) on the consumer side, then the fault flag on -org.apache.camel.Message.isFault() will be send back in the response as -a JMS header with the key JmsConstants.JMS_TRANSFER_FAULT. If the client -is Camel, the returned fault flag will be set on the -org.apache.camel.Message.setFault(boolean). You may want to enable this -when using Camel components that support faults such as SOAP based such -as cxf or spring-ws. - -|`transferExchange` |`false` |You can transfer the exchange over the -wire instead of just the body and headers. The following fields are -transferred: In body, Out body, Fault body, In headers, Out headers, -Fault headers, exchange properties, exchange exception. This requires -that the objects are serializable. Camel will exclude any -non-serializable objects and log it at `WARN` level. You *must* enable -this option on both the producer and consumer side, so Camel knows the -payloads is an Exchange and not a regular payload. - -|`username` |`null` |The username for the connector factory. - -|`useMessageIDAsCorrelationID` |`false` |Specifies whether -`JMSMessageID` should always be used as `JMSCorrelationID` for *InOut* -messages. - -|`useVersion102` |`false` |*@deprecated (removed from Camel 2.5 -onwards):* Specifies whether the old JMS API should be used. -|======================================================================= - -[[JMS-MessageMappingbetweenJMSandCamel]] -Message Mapping between JMS and Camel -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Camel automatically maps messages between `javax.jms.Message` and -`org.apache.camel.Message`. - -When sending a JMS message, Camel converts the message body to the -following JMS message types: - -[width="100%",cols="10%,10%,80%",options="header",] -|======================================================================= -|Body Type |JMS Message |Comment -|`String` |`javax.jms.TextMessage` | - -|`org.w3c.dom.Node` |`javax.jms.TextMessage` |The DOM will be converted -to `String`. - -|`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: - -[width="100%",cols="50%,50%",options="header",] -|============================================= -|JMS Message |Body Type -|`javax.jms.TextMessage` |`String` -|`javax.jms.BytesMessage` |`byte[]` -|`javax.jms.MapMessage` |`Map<String, Object>` -|`javax.jms.ObjectMessage` |`Object` -|============================================= - -[[JMS-Disablingauto-mappingofJMSmessages]] -Disabling auto-mapping of JMS messages -++++++++++++++++++++++++++++++++++++++ - -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. - -[[JMS-UsingacustomMessageConverter]] -Using a custom MessageConverter -+++++++++++++++++++++++++++++++ - -You can use the `messageConverter` option to do the mapping yourself in -a Spring `org.springframework.jms.support.converter.MessageConverter` -class. - -For example, in the route below we use a custom message converter when -sending a message to the JMS order queue: - -[source,java] ----------------------------------------------------------------------------------------- - from("file://inbox/order").to("jms:queue:order?messageConverter=#myMessageConverter"); ----------------------------------------------------------------------------------------- - -You can also use a custom message converter when consuming from a JMS -destination. - -[[JMS-Controllingthemappingstrategyselected]] -Controlling the mapping strategy selected -+++++++++++++++++++++++++++++++++++++++++ - -You can use the *jmsMessageType* option on the endpoint URL to force a -specific message type for all messages. + - In the route below, we poll files from a folder and send them as -`javax.jms.TextMessage` as we have forced the JMS producer endpoint to -use text messages: - -[source,java] ------------------------------------------------------------------------ - 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: - -[source,java] ---------------------------------------------------------------------------------------------------------- - from("file://inbox/order").setHeader("CamelJmsMessageType", JmsMessageType.Text).to("jms:queue:order"); ---------------------------------------------------------------------------------------------------------- - -The possible values are defined in the `enum` class, -`org.apache.camel.jms.JmsMessageType`. - -[[JMS-Messageformatwhensending]] -Message format when sending -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The exchange that is sent over the JMS wire must conform to the -http://java.sun.com/j2ee/1.4/docs/api/javax/jms/Message.html[JMS Message -spec]. - -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**: - -* 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 will log with category `org.apache.camel.component.jms.JmsBinding` -at *DEBUG* level if it drops a given header value. For example: - ----------------------------------------------------------------------------------------------------------------------------------------------------------------- -2008-07-09 06:43:04,046 [main ] DEBUG JmsBinding - - Ignoring non primitive header: order of class: org.apache.camel.component.jms.issues.DummyOrder with value: DummyOrder{orderId=333, itemId=4444, quantity=2} ----------------------------------------------------------------------------------------------------------------------------------------------------------------- - -[[JMS-Messageformatwhenreceiving]] -Message format when receiving -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Camel adds the following properties to the `Exchange` when it receives a -message: - -[width="100%",cols="10%,10%,80%",options="header",] -|======================================================================= -|Property |Type |Description -|`org.apache.camel.jms.replyDestination` |`javax.jms.Destination` |The -reply destination. -|======================================================================= - -Camel adds the following JMS properties to the In message headers when -it receives a JMS message: - -[width="100%",cols="10%,10%,80%",options="header",] -|======================================================================= -|Header |Type |Description -|`JMSCorrelationID` |`String` |The JMS correlation ID. - -|`JMSDeliveryMode` |`int` |The JMS delivery mode. - -|`JMSDestination` |`javax.jms.Destination` |The JMS destination. - -|`JMSExpiration` |`long` |The JMS expiration. - -|`JMSMessageID` |`String` |The JMS unique message ID. - -|`JMSPriority` |`int` |The JMS priority (with 0 as the lowest priority -and 9 as the highest). - -|`JMSRedelivered` |`boolean` |Is the JMS message redelivered. - -|`JMSReplyTo` |`javax.jms.Destination` |The JMS reply-to destination. - -|`JMSTimestamp` |`long` |The JMS timestamp. - -|`JMSType` |`String` |The JMS type. - -|`JMSXGroupID` |`String` |The JMS group ID. -|======================================================================= - -As all the above information is standard JMS you can check the -http://java.sun.com/javaee/5/docs/api/javax/jms/Message.html[JMS -documentation] for further details. - -[[JMS-AboutusingCameltosendandreceivemessagesandJMSReplyTo]] -About using Camel to send and receive messages and JMSReplyTo -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The JMS component is complex and you have to pay close attention to how -it works in some cases. So this is a short summary of some of the -areas/pitfalls to look for. - -When Camel sends a message using its `JMSProducer`, it checks the -following conditions: - -* The message exchange pattern, -* Whether a `JMSReplyTo` was set in the endpoint or in the message -headers, -* 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. - -[[JMS-JmsProducer]] -JmsProducer -+++++++++++ - -The `JmsProducer` behaves as follows, depending on configuration: - -[width="100%",cols="10%,10%,80%",options="header",] -|======================================================================= -|Exchange Pattern |Other options |Description -|_InOut_ |- |Camel will expect a reply, set a temporary `JMSReplyTo`, -and after sending the message, it will start to listen for the reply -message on the temporary queue. - -|_InOut_ |`JMSReplyTo` is set |Camel will expect a reply and, after -sending the message, it will start to listen for the reply message on -the specified `JMSReplyTo` queue. - -|_InOnly_ |- |Camel will send the message and *not* expect a reply. - -|_InOnly_ |`JMSReplyTo` is set |By default, Camel discards the -`JMSReplyTo` destination and clears the `JMSReplyTo` header before -sending the message. Camel then sends the message and does *not* expect -a reply. Camel logs this in the log at `WARN` level (changed to `DEBUG` -level from *Camel 2.6* onwards. You can use `preserveMessageQuo=true` to -instruct Camel to keep the `JMSReplyTo`. In all situations the -`JmsProducer` does *not* expect any reply and thus continue after -sending the message. -|======================================================================= - -[[JMS-JmsConsumer]] -JmsConsumer -+++++++++++ - -The `JmsConsumer` behaves as follows, depending on configuration: - -[width="100%",cols="10%,10%,80%",options="header",] -|======================================================================= -|Exchange Pattern |Other options |Description -|_InOut_ |- |Camel will send the reply back to the `JMSReplyTo` queue. - -|_InOnly_ |- |Camel will not send a reply back, as the pattern is -__InOnly__. - -|- |`disableReplyTo=true` |This option suppresses replies. -|======================================================================= - -So pay attention to the message exchange pattern set on your exchanges. - -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 -link:request-reply.html[Request Reply]. + - This is useful if you want to send an `InOnly` message to a JMS topic: - -[source,java] ------------------------------------------------------- -from("activemq:queue:in") - .to("bean:validateOrder") - .to(ExchangePattern.InOnly, "activemq:topic:order") - .to("bean:handleOrder"); ------------------------------------------------------- - -[[JMS-Reuseendpointandsendtodifferentdestinationscomputedatruntime]] -Reuse endpoint and send to different destinations computed at runtime -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you need to send messages to a lot of different JMS destinations, it -makes sense to reuse a JMS endpoint and specify the real destination in -a message header. This allows Camel to reuse the same endpoint, but send -to different destinations. This greatly reduces the number of endpoints -created and economizes on memory and thread resources. - -You can specify the destination in the following headers: - -[width="100%",cols="10%,10%,80%",options="header",] -|===================================================================== -|Header |Type |Description -|`CamelJmsDestination` |`javax.jms.Destination` |A destination object. -|`CamelJmsDestinationName` |`String` |The destination name. -|===================================================================== - -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: - -[source,java] --------------------------------- -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. - -In the `computeDestination` bean, specify the real destination by -setting the `CamelJmsDestinationName` header as follows: - -[source,java] -------------------------------------------------------------------------- -public void setJmsHeader(Exchange exchange) { - String id = .... - exchange.getIn().setHeader("CamelJmsDestinationName", "order:" + id"); -} -------------------------------------------------------------------------- - -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. - -If both the `CamelJmsDestination` and the `CamelJmsDestinationName` -headers are set, `CamelJmsDestination` takes priority. Keep in mind that -the JMS producer removes both `CamelJmsDestination` and -`CamelJmsDestinationName` headers from the exchange and do not propagate -them to the created JMS message in order to avoid the accidental loops -in the routes (in scenarios when the message will be forwarded to the -another JMS endpoint). - -[[JMS-ConfiguringdifferentJMSproviders]] -Configuring different JMS providers -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can configure your JMS provider in link:spring.html[Spring] XML as -follows: - -Basically, you can configure as many JMS component instances as you wish -and give them *a unique name using the* `id` **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 -link:endpoint.html[Endpoint] link:uris.html[URIs] and having the -link:component.html[Component] resolve the endpoint URIs. - -[[JMS-UsingJNDItofindtheConnectionFactory]] -Using JNDI to find the ConnectionFactory -++++++++++++++++++++++++++++++++++++++++ - -If you are using a J2EE container, you might need to look up JNDI to -find the JMS `ConnectionFactory` rather than use the usual `<bean>` -mechanism in Spring. You can do this using Spring's factory bean or the -new Spring XML namespace. For example: - -[source,xml] ------------------------------------------------------------------------------ -<bean id="weblogic" class="org.apache.camel.component.jms.JmsComponent"> - <property name="connectionFactory" ref="myConnectionFactory"/> -</bean> - -<jee:jndi-lookup id="myConnectionFactory" jndi-name="jms/connectionFactory"/> ------------------------------------------------------------------------------ - -See -http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html#xsd-config-body-schemas-jee[The -jee schema] in the Spring reference documentation for more details about -JNDI lookup. - -[[JMS-ConcurrentConsuming]] -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: - -[source,java] ---------------------------------------------- -from("jms:SomeQueue?concurrentConsumers=20"). - bean(MyClass.class); ---------------------------------------------- - -You can configure this option in one of the following ways: - -* On the `JmsComponent`, -* On the endpoint URI or, -* By invoking `setConcurrentConsumers()` directly on the `JmsEndpoint`. - -[[JMS-ConcurrentConsumingwithasyncconsumer]] -Concurrent Consuming with async consumer -++++++++++++++++++++++++++++++++++++++++ - -Notice that each concurrent consumer will only pickup the next available -message from the JMS broker, when the current message has been fully -processed. You can set the option `asyncConsumer=true` to let the -consumer pickup the next message from the JMS queue, while the previous -message is being processed asynchronously (by the -link:asynchronous-routing-engine.html[Asynchronous Routing Engine]). See -more details in the table on top of the page about the `asyncConsumer` -option. - -[source,java] ----------------------------------------------------------------- -from("jms:SomeQueue?concurrentConsumers=20&asyncConsumer=true"). - bean(MyClass.class); ----------------------------------------------------------------- - -[[JMS-Request-replyoverJMS]] -Request-reply over JMS -^^^^^^^^^^^^^^^^^^^^^^ - -Camel supports link:request-reply.html[Request Reply] over JMS. In -essence the MEP of the Exchange should be `InOut` when you send a -message to a JMS queue. - -Camel offers a number of options to configure request/reply over JMS -that influence performance and clustered environments. The table below -summaries the options. - -[width="100%",cols="10%,10%,10%,70%",options="header",] -|======================================================================= -|Option |Performance |Cluster |Description -|`Temporary` |Fast |Yes |A temporary queue is used as reply queue, and -automatic created by Camel. To use this do *not* specify a replyTo queue -name. And you can optionally configure `replyToType=Temporary` to make -it stand out that temporary queues are in use. - -|`Shared` |Slow |Yes |A shared persistent queue is used as reply queue. -The queue must be created beforehand, although some brokers can create -them on the fly such as Apache ActiveMQ. To use this you must specify -the replyTo queue name. And you can optionally configure -`replyToType=Shared` to make it stand out that shared queues are in use. -A shared queue can be used in a clustered environment with multiple -nodes running this Camel application at the same time. All using the -same shared reply queue. This is possible because JMS Message selectors -are used to correlate expected reply messages; this impacts performance -though. JMS Message selectors is slower, and therefore not as fast as -`Temporary` or `Exclusive` queues. See further below how to tweak this -for better performance. - -|`Exclusive` |Fast |No (*Yes) |An exclusive persistent queue is used as -reply queue. The queue must be created beforehand, although some brokers -can create them on the fly such as Apache ActiveMQ. To use this you must -specify the replyTo queue name. And you *must* configure -`replyToType=Exclusive` to instruct Camel to use exclusive queues, as -`Shared` is used by default, if a `replyTo` queue name was configured. -When using exclusive reply queues, then JMS Message selectors are *not* -in use, and therefore other applications must not use this queue as -well. An exclusive queue *cannot* be used in a clustered environment -with multiple nodes running this Camel application at the same time; as -we do not have control if the reply queue comes back to the same node -that sent the request message; that is why shared queues use JMS Message -selectors to make sure of this. *Though* if you configure each Exclusive -reply queue with an unique name per node, then you can run this in a -clustered environment. As then the reply message will be sent back to -that queue for the given node, that awaits the reply message. - -|`concurrentConsumers` |Fast |Yes |*Camel 2.10.3:* Allows to process -reply messages concurrently using concurrent message listeners in use. -You can specify a range using the `concurrentConsumers` and -`maxConcurrentConsumers` options. *Notice:* That using `Shared` reply -queues may not work as well with concurrent listeners, so use this -option with care. - -|`maxConcurrentConsumers` |Fast |Yes |*Camel 2.10.3:* Allows to process -reply messages concurrently using concurrent message listeners in use. -You can specify a range using the `concurrentConsumers` and -`maxConcurrentConsumers` options. *Notice:* That using `Shared` reply -queues may not work as well with concurrent listeners, so use this -option with care. -|======================================================================= - -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: - -Instead of using threads, then use concurrentConsumers option if using -Camel 2.10.3 or better. See further below. - -[source,java] ---------------------------------- -from(xxx) -.inOut().to("activemq:queue:foo") -.threads(5) -.to(yyy) -.to(zzz); ---------------------------------- - -In this route we instruct Camel to route replies -link:async.html[asynchronously] using a thread pool with 5 threads. - -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: - -[source,java] -------------------------------------------------------- -from(xxx) -.inOut().to("activemq:queue:foo?concurrentConsumers=5") -.to(yyy) -.to(zzz); -------------------------------------------------------- - -[[JMS-Request-replyoverJMSandusingasharedfixedreplyqueue]] -Request-reply over JMS and using a shared fixed reply queue -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -If you use a fixed reply queue when doing -link:request-reply.html[Request Reply] over JMS as shown in the example -below, then pay attention. - -[source,java] ---------------------------------------------- -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: - -[source,java] ----------------------------------------------------------------- -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. - -[[JMS-Request-replyoverJMSandusinganexclusivefixedreplyqueue]] -Request-reply over JMS and using an exclusive fixed reply queue -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -*Available as of Camel 2.9* - -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 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: - -[source,java] -------------------------------------------------------------------- -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: - -[source,java] ------------------------------------------------------------------------------ -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. - -[[JMS-Synchronizingclocksbetweensendersandreceivers]] -Synchronizing clocks between senders and receivers -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When doing messaging between systems, its desirable that the systems -have synchronized clocks. For example when sending a link:jms.html[JMS] -message, then you can set a time to live value on the message. Then the -receiver can inspect this value, and determine if the message is already -expired, and thus drop the message instead of consume and process it. -However this requires that both sender and receiver have synchronized -clocks. If you are using http://activemq.apache.org/[ActiveMQ] then you -can use the http://activemq.apache.org/timestampplugin.html[timestamp -plugin] to synchronize clocks. - -[[JMS-Abouttimetolive]] -About time to live -^^^^^^^^^^^^^^^^^^ - -Read first above about synchronized clocks. - -When you do request/reply (InOut) over link:jms.html[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 link:jms.html[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 link:jms.html[JMS] -messages. *But* the request timeout is still active. So for example if -you do request/reply over link:jms.html[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: - -[source,java] --------------------------------------------------------- - from("direct:someWhere") - .to("jms:queue:foo?replyTo=bar&requestTimeout=30s") - .to("bean:processReply"); --------------------------------------------------------- - -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 -link:exchange.html[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: - -[source,java] ----------------------------------------------------------------------------------------- - 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 link:jms.html[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. - -[[JMS-EnablingTransactedConsumption]] -Enabling Transacted Consumption -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -A common requirement is to consume from a queue in a transaction and -then process the message using the Camel route. To do this, just ensure -that you set the following properties on the component/endpoint: - -* `transacted` = true -* `transactionManager` = a _Transsaction Manager_ - typically the -`JmsTransactionManager` - -See the link:transactional-client.html[Transactional Client] EIP pattern -for further details. - -Transactions and [Request Reply] over JMS - -When using link:request-reply.html[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 link:request-reply.html[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 -link:exchange-pattern.html[Exchange Pattern] (MEP). - -The `transactedInOut` property applies to the -InOut(link:request-reply.html[Request Reply]) message -link:exchange-pattern.html[Exchange Pattern] (MEP). - -If you want to use transactions for link:request-reply.html[Request -Reply](InOut MEP), you *must* set `transactedInOut=true`. - -*Available as of Camel 2.10* - -You can leverage the -http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.html#setSessionTransacted(boolean)[DMLC -transacted session API] using the following properties on -component/endpoint: - -* `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 -http://tmielke.blogspot.com/2012/03/camel-jms-with-transactions-lessons.html[here] -and -http://forum.springsource.org/showthread.php?123631-JMS-DMLC-not-caching%20connection-when-using-TX-despite-cacheLevel-CACHE_CONSUMER&p=403530&posted=1#post403530[here]. - -[[JMS-UsingJMSReplyToforlatereplies]] -Using JMSReplyTo for late replies -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When using Camel as a JMS listener, it sets an Exchange property with -the value of the ReplyTo `javax.jms.Destination` object, having the key -`ReplyTo`. You can obtain this `Destination` as follows: - -[source,java] ------------------------------------------------------------------------------------------------------------------ -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. - -[source,java] ----------------------------------------------------------------------------------------- - // 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: - -[source,java] ----------------------------------------------------------------------------------------------------------------------------------------- - // we pretend to send it to some non existing dummy queue - template.send("activemq:queue:dummy, new Processor() { - public void process(Exchange exchange) throws Exception { - // and here we override the destination with the ReplyTo destination object so the message is sent to there instead of dummy - exchange.getIn().setHeader(JmsConstants.JMS_DESTINATION, replyDestination); - exchange.getIn().setBody("Here is the late reply."); - } - } ----------------------------------------------------------------------------------------------------------------------------------------- - -[[JMS-Usingarequesttimeout]] -Using a request timeout -^^^^^^^^^^^^^^^^^^^^^^^ - -In the sample below we send a link:request-reply.html[Request Reply] -style message link:exchange.html[Exchange] (we use the `requestBody` -method = `InOut`) to the slow queue for further processing in Camel and -we wait for a return reply: - -[[JMS-Samples]] -Samples -^^^^^^^ - -JMS is used in many examples for other components as well. But we -provide a few samples below to get started. - -[[JMS-ReceivingfromJMS]] -Receiving from JMS -++++++++++++++++++ - -In the following sample we configure a route that receives JMS messages -and routes the message to a POJO: - -[source,java] --------------------------------- - 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: - -[source,java] ----------------------------------------------- -from("jms:topic:OrdersTopic"). - filter().method("myBean", "isGoldCustomer"). - to("jms:queue:BigSpendersQueue"); ----------------------------------------------- - -[[JMS-SendingtoaJMS]] -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`: - -[source,java] ------------------------------- -from("file://orders"). - convertBodyTo(String.class). - to("jms:topic:OrdersTopic"); ------------------------------- - -[[JMS-UsingAnnotations]] -Using link:bean-integration.html[Annotations] -+++++++++++++++++++++++++++++++++++++++++++++ - -Camel also has annotations so you can use link:pojo-consuming.html[POJO -Consuming] and link:pojo-producing.html[POJO Producing]. - -[[JMS-SpringDSLsample]] -Spring DSL sample -+++++++++++++++++ - -The preceding examples use the Java DSL. Camel also supports Spring XML -DSL. Here is the big spender sample using Spring DSL: - -[source,xml] ---------------------------------------------------- -<route> - <from uri="jms:topic:OrdersTopic"/> - <filter> - <method bean="myBean" method="isGoldCustomer"/> - <to uri="jms:queue:BigSpendersQueue"/> - </filter> -</route> ---------------------------------------------------- - -[[JMS-Othersamples]] -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 link:tutorial-jmsremoting.html[Tutorial-JmsRemoting]. - -[[JMS-UsingJMSasaDeadLetterQueuestoringExchange]] -Using JMS as a Dead Letter Queue storing Exchange -+++++++++++++++++++++++++++++++++++++++++++++++++ - -Normally, when using link:jms.html[JMS] as the transport, it only -transfers the body and headers as the payload. If you want to use -link:jms.html[JMS] with a link:dead-letter-channel.html[Dead Letter -Channel], using a JMS queue as the Dead Letter Queue, then 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 link:exchange.html[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: - -[source,java] ------------------------------------------------------------------------- -// 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: - -[source,java] ------------------------------------------------------------------------------------ -from("jms:queue:dead").to("bean:myErrorAnalyzer"); - -// and in our bean -String body = exchange.getIn().getBody(); -Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); -// the cause message is -String problem = cause.getMessage(); ------------------------------------------------------------------------------------ - -[[JMS-UsingJMSasaDeadLetterChannelstoringerroronly]] -Using JMS as a Dead Letter Channel storing error only -+++++++++++++++++++++++++++++++++++++++++++++++++++++ - -You can use JMS to store the cause error message or to store a custom -body, which you can initialize yourself. The following example uses the -link:message-translator.html[Message Translator] EIP to do a -transformation on the failed exchange before it is moved to the -link:jms.html[JMS] dead letter queue: - -[source,java] --------------------------------------------------------------------------------------------------- -// we sent it to a seda dead queue first -errorHandler(deadLetterChannel("seda:dead")); - -// and on the seda dead queue we can do the custom transformation before its sent to the JMS queue -from("seda:dead").transform(exceptionMessage()).to("jms:queue:dead"); --------------------------------------------------------------------------------------------------- - -Here we only store the original cause error message in the transform. -You can, however, use any link:expression.html[Expression] to send -whatever you like. For example, you can invoke a method on a Bean or use -a custom processor. - -[[JMS-SendinganInOnlymessageandkeepingtheJMSReplyToheader]] -Sending an InOnly message and keeping the JMSReplyTo header -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When sending to a link:jms.html[JMS] destination using *camel-jms* the -producer will use the MEP to detect if its InOnly or InOut messaging. -However there can be times where you want to send an InOnly message but -keeping the JMSReplyTo header. To do so you have to instruct Camel to -keep it, otherwise the JMSReplyTo header will be dropped. - -For example to send an InOnly message to the foo queue, but with a -JMSReplyTo with bar queue you can do as follows: - -[source,java] -------------------------------------------------------------------------------------- - template.send("activemq:queue:foo?preserveMessageQos=true", new Processor() { - public void process(Exchange exchange) throws Exception { - exchange.getIn().setBody("World"); - exchange.getIn().setHeader("JMSReplyTo", "bar"); - } - }); -------------------------------------------------------------------------------------- - -Notice we use `preserveMessageQos=true` to instruct Camel to keep the -JMSReplyTo header. - -[[JMS-SettingJMSprovideroptionsonthedestination]] -Setting JMS provider options on the destination -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Some JMS providers, like IBM's WebSphere MQ need options to be set on -the JMS destination. For example, you may need to specify the -targetClient option. Since targetClient is a WebSphere MQ option and not -a Camel URI option, you need to set that on the JMS destination name -like so: - -[source,java] ------------------------------------------------------------------------------------ -... -.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: - -________________________________________________________________________________________________________________________________________________ -com.ibm.msg.client.jms.DetailedJMSException: JMSCC0005: The specified -value 'MY_QUEUE?targetClient=1' is not allowed for -'XMSC_DESTINATION_NAME' -________________________________________________________________________________________________________________________________________________ - -A workaround is to use a custom DestinationResolver: - -[source,java] ----------------------------------------------------------------------------------------------------------------------------------- -JmsComponent wmq = new JmsComponent(connectionFactory); - -wmq.setDestinationResolver(new DestinationResolver(){ - public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException { - MQQueueSession wmqSession = (MQQueueSession) session; - return wmqSession.createQueue("queue:///" + destinationName + "?targetClient=1"); - } -}); ----------------------------------------------------------------------------------------------------------------------------------- - -[[JMS-SeeAlso]] -See Also -^^^^^^^^ - -* link:configuring-camel.html[Configuring Camel] -* link:component.html[Component] -* link:endpoint.html[Endpoint] -* link:getting-started.html[Getting Started] - -* link:transactional-client.html[Transactional Client] -* link:bean-integration.html[Bean Integration] -* link:tutorial-jmsremoting.html[Tutorial-JmsRemoting] -* http://activemq.apache.org/jmstemplate-gotchas.html[JMSTemplate -gotchas] http://git-wip-us.apache.org/repos/asf/camel/blob/f6fea27a/docs/user-manual/en/SUMMARY.md ---------------------------------------------------------------------- diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md index 1c653fd..208916e 100644 --- a/docs/user-manual/en/SUMMARY.md +++ b/docs/user-manual/en/SUMMARY.md @@ -3,9 +3,9 @@ * [Introduction](README.md) * [Legal Notice](notice.md) * Components References - * [Async Http Client (AHC)](components/camel-ahc/src/main/docs/readme.adoc) - * [AHC Websocket (AHC-WS)](components/camel-ahc-ws/src/main/docs/readme.adoc) - * [Amqp](components/camel-amqp/src/main/docs/readme.adoc) - * [Atom](components/camel-atom/src/main/docs/readme.adoc) - * [CDI](components/camel-cdi/src/main/docs/readme.adoc) - * [JMS](components/camel-jms/src/main/docs/readme.adoc) + * [Async Http Client (AHC)](ahc.adoc) + * [AHC Websocket (AHC-WS)](ahc-ws.adoc) + * [Amqp](amqp.adoc) + * [Atom](atom.adoc) + * [CDI](cdi.adoc) + * [JMS](jms.adoc)