Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0

...

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

...

is

...

included:

...

  • Standard

...

  • Queue

...

  • and

...

  • Topic

...

  • Support

...

  • (Durable

...

  • &

...

  • Non-Durable)

...

  • InOnly

...

  • &

...

  • InOut

...

  • MEP

...

  • Support

...

  • Asynchronous

...

  • Producer

...

  • and

...

  • Consumer

...

  • Processing

...

  • Internal

...

  • JMS

...

  • Transaction

...

  • Support

...

Additional

...

key

...

features

...

include:

...

  • Plugable

...

  • Connection

...

  • Resource

...

  • Management

...

  • Session,

...

  • Consumer,

...

  • &

...

  • Producer

...

  • Pooling

...

  • &

...

  • Caching

...

  • Management

...

  • Batch

...

  • Consumers

...

  • and

...

  • Producers

...

  • Transacted

...

  • Batch

...

  • Consumers

...

  • &

...

  • Producers

...

  • Support

...

  • for

...

  • Customizable

...

  • Transaction

...

  • Commit

...

  • Strategies

...

  • (Local

...

  • JMS

...

  • Transactions

...

  • only)
{:=
Info
title
Why
the
S
in
SJMS
}

S

stands

for

Simple

and

Standard

and

Springless.

Also

camel-jms

was

already

taken. (smile)

Warning

This is a rather new component in a complex world of JMS messaging. So this component is ongoing development and hardening.
The classic JMS component based on Spring JMS has been hardened and battle tested extensively.

Maven users will need to add the following dependency to their pom.xml for this component:

Code Block
xml
xml
 :-)
{info}

{warning}
This is a rather new component in a complex world of JMS messaging. So this component is ongoing development and hardening.
The classic [JMS] component based on Spring JMS has been hardened and battle tested extensively.
{warning}

Maven users will need to add the following dependency to their {{pom.xml}} for this component:
{code:xml}
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sjms</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
{code}

h4. URI format

{code}

URI format

Code Block
sjms:[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:

Code Block
{code}

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:

{code}
sjms:FOO.BAR
{code}

You

...

can

...

include

...

the

...

optional

...

queue:

...

prefix,

...

if

...

you

...

prefer:

{
Code Block
}
sjms:queue:FOO.BAR
{code}

To connect to a 

To connect to a topic,

...

you

...

must

...

include

...

the

...

topic:

...

prefix.

...

For

...

example,

...

to

...

connect

...

to

...

the

...

topic,

...

Stocks.Prices

...

,

...

use:

{
Code Block
}
sjms:topic:Stocks.Prices
{code}

You

...

append

...

query

...

options

...

to

...

the

...

URI

...

using

...

the

...

following

...

format,

...

?option=value&option=value&...

Component Options and Configurations

The SJMS Component supports the following configuration options:

Wiki Markup
}}

h3. Component Options and Configurations

The SJMS Component supports the following configuration options:

{div:class=confluenceTableSmall}
|| Option || Required || Default Value || Description ||
| {{connectionCount}} | | {{1}} | The maximum number of connections available to endpoints started under this component |
| {{connectionFactory}} | (/) | {{null}} | A [ConnectionFactory|http://docs.oracle.com/javaee/5/api/javax/jms/ConnectionFactory.html] is required to enable the SjmsComponent. It can be set directly or set set as part of a ConnectionResource. |
| {{connectionResource}} | | {{null}} | A ConnectionResource is an interface that allows for customization and container control of the ConnectionFactory.  See [Plugable Connection Resource Management|#connectionresource] for further details. |
| {{headerFilterStrategy}} | | {{DefaultJmsKeyFormatStrategy}} | |
| {{keyFormatStrategy}} | | {{DefaultJmsKeyFormatStrategy}} | |
| {{transactionCommitStrategy}} | | {{null}} |  |
{div}

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.

{
Code Block
}
SjmsComponent component = new SjmsComponent();
component.setConnectionFactory(new ActiveMQConnectionFactory("tcp://localhost:61616"));
getContext().addComponent("sjms", component);
{code

For a SjmsComponent that is required to support a durable subscription, you can override the default ConnectionFactoryResource instance and set the clientId property.

Code Block
}

For a SjmsComponent that is required to support a durable subscription, you can override the default ConnectionFactoryResource instance and set the *clientId* property.

{code}
ConnectionFactoryResource connectionResource = new ConnectionFactoryResource();
connectionResource.setConnectionFactory(new ActiveMQConnectionFactory("tcp://localhost:61616"));
connectionResource.setClientId("myclient-id");

SjmsComponent component = new SjmsComponent();
component.setConnectionResource(connectionResource);
component.setMaxConnections(1);

Producer Configuration Options

The SjmsProducer Endpoint supports the following properties:

Wiki Markup
{code}

h3. Producer Configuration Options

The SjmsProducer Endpoint supports the following properties:

{div:class=confluenceTableSmall}
|| Option || Default Value || Description ||
| {{acknowledgementMode}} | {{AUTO_ACKNOWLEDGE}} | The JMS acknowledgement name, which is one of: {{SESSION_TRANSACTED}}, {{AUTO_ACKNOWLEDGE}} or {{DUPS_OK_ACKNOWLEDGE}}. {{CLIENT_ACKNOWLEDGE}} is not supported at this time. |
| {{consumerCount}} | {{1}} | *InOut only.* Defines the number of [MessageListener|http://docs.oracle.com/javaee/5/api/javax/jms/MessageListener.html] instances that for response consumers. |
| {{exchangePattern}} | {{InOnly}} | Sets the Producers message exchange pattern. |
| {{namedReplyTo}} | {{null}} | *InOut only.* Specifies a named reply to destination for responses. |
| {{persistent}} | {{true}} | Whether a message should be delivered with persistence enabled. |
| {{producerCount}} | {{1}} | Defines the number of [MessageProducer|http://docs.oracle.com/javaee/5/api/javax/jms/MessageProducer.html] instances. |
| {{responseTimeOut}} | {{5000}} | *InOut only.* Specifies the amount of time an InOut Producer will wait for its response. |
| {{synchronous}} | {{true}} | Sets whether the Endpoint will use synchronous or asynchronous processing. |
| {{transacted}} | {{false}} | If the endpoint should use a JMS Session transaction. |
| {{ttl}} | {{\-1}} | Disabled by default.  Sets the Message time to live header. |
{div}

h3. 

Producer

...

Usage

InOnly Producer - (Default)

...

The

...

InOnly

...

Producer

...

is

...

the

...

default

...

behavior

...

of

...

the

...

SJMS

...

Producer

...

Endpoint.

{
Code Block
}
from("direct:start")
    .to("sjms:queue:bar");
{code}

h4. InOut Producer

To enable InOut behavior append the {{exchangePattern}} attribute to the URI.  By default it will use a dedicated TemporaryQueue for each consumer.

{code

InOut Producer

To enable InOut behavior append the exchangePattern attribute to the URI. By default it will use a dedicated TemporaryQueue for each consumer.

Code Block
}
from("direct:start")
    .to("sjms:queue:bar?exchangePattern=InOut");
{code}

You can specify a {{namedReplyTo}} though which can provide a better monitor point.

{code}

You can specify a namedReplyTo though which can provide a better monitor point.

Code Block
from("direct:start")
    .to("sjms:queue:bar?exchangePattern=InOut&namedReplyTo=my.reply.to.queue");

Consumers Configuration Options

The SjmsConsumer Endpoint supports the following properties:

Wiki Markup
{code}

h3. Consumers Configuration Options

The SjmsConsumer Endpoint supports the following properties:

{div:class=confluenceTableSmall}
|| Option || Default Value || Description ||
| {{acknowledgementMode}} | {{AUTO_ACKNOWLEDGE}} | The JMS acknowledgement name, which is one of: {{TRANSACTED}}, {{AUTO_ACKNOWLEDGE}} or {{DUPS_OK_ACKNOWLEDGE}}. {{CLIENT_ACKNOWLEDGE}} is not supported at this time. |
| {{consumerCount}} | {{1}} | Defines the number of [MessageListener|http://docs.oracle.com/javaee/5/api/javax/jms/MessageListener.html] instances. |
| {{durableSubscriptionId}} | {{null}} | Required for a durable subscriptions. |
| {{exchangePattern}} | {{InOnly}} | Sets the Consumers message exchange pattern. |
| {{messageSelector}} | {{null}} | Sets the message selector. |
| {{synchronous}} | {{true}} | Sets whether the Endpoint will use synchronous or asynchronous processing. |
| {{transacted}} | {{false}} | If the endpoint should use a JMS Session transaction. |
| {{transactionBatchCount}} | {{1}} | The number of exchanges to process before committing a local JMS transaction.  The {{transacted}} property must also be set to true or this property will be ignored. |
| {{transactionBatchTimeout}} | {{5000}} | The amount of time a the transaction will stay open between messages before committing what has already been consumed.  Minimum value is 1000ms. |
| {{ttl}} | {{\-1}} | Disabled by default.  Sets the Message time to live header. |
{div}

h3. 

Consumer

...

Usage

...

InOnly

...

Consumer

...

-

...

(Default)

...

The

...

InOnly

...

Consumer

...

is

...

the

...

default

...

Exchange

...

behavior

...

of

...

the

...

SJMS

...

Consumer

...

Endpoint.

{
Code Block
}
from("sjms:queue:bar")
    .to("mock:result");
{code}

h4. InOut Consumer

To

InOut Consumer

To enable InOut behavior append the exchangePattern attribute to the URI.

Code Block
 enable InOut behavior append the {{exchangePattern}} attribute to the URI.

{code}
from("sjms:queue:in.out.test?exchangePattern=InOut")
    .transform(constant("Bye Camel"));

Advanced Usage Notes

Plugable Connection Resource Management
Anchor
connectionresource
connectionresource

SJMS provides JMS Connection resource management through built-in connection pooling. This eliminates the need to depend on third party API pooling logic. However there may be times that you are required to use an external Connection resource manager such as those provided by J2EE or OSGi containers. For this SJMS provides an interface that can be used to override the internal SJMS Connection pooling capabilities. This is accomplished through the ConnectionResource interface.

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.

Below is an example of using the pluggable ConnectionResource with the ActiveMQ PooledConnectionFactory:

Code Block
{code}

h3. Advanced Usage Notes

h4. Plugable Connection Resource Management {anchor:connectionresource}

SJMS provides JMS [Connection|http://docs.oracle.com/javaee/5/api/javax/jms/Connection.html] resource management through built-in connection pooling. This eliminates the need to depend on third party API pooling logic. However there may be times that you are required to use an external Connection resource manager such as those provided by J2EE or OSGi containers. For this SJMS provides an interface that can be used to override the internal SJMS Connection pooling capabilities. This is accomplished through the [ConnectionResource|https://svn.apache.org/repos/asf/camel/trunk/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/ConnectionResource.java] interface. 

The [ConnectionResource|https://svn.apache.org/repos/asf/camel/trunk/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/ConnectionResource.java] provides methods for borrowing and returning Connections as needed is the contract used to provide [Connection|http://docs.oracle.com/javaee/5/api/javax/jms/Connection.html] 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|http://docs.oracle.com/javaee/5/api/javax/jms/ConnectionFactory.html] providers you use the [ConnectionFactoryResource|https://svn.apache.org/repos/asf/camel/trunk/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/it/ConnectionResourceIT.java] implementation that is provided with SJMS as-is or extend as it is optimized for this component.

Below is an example of using the pluggable ConnectionResource with the ActiveMQ PooledConnectionFactory:

{code}
public class AMQConnectionResource implements ConnectionResource {
    private PooledConnectionFactory pcf;

    public AMQConnectionResource(String connectString, int maxConnections) {
        super();
        pcf = new PooledConnectionFactory(connectString);
        pcf.setMaxConnections(maxConnections);
        pcf.start();
    }

    public void stop() {
        pcf.stop();
    }

    @Override
    public Connection borrowConnection() throws Exception {
        Connection answer = pcf.createConnection();
        answer.start();
        return answer;
    }

    @Override
    public Connection borrowConnection(long timeout) throws Exception {
        // SNIPPED...
    }

    @Override
    public void returnConnection(Connection connection) throws Exception {
        // Do nothing since there isn't a way to return a Connection
        // to the instance of PooledConnectionFactory
        log.info("Connection returned");
    }
}
{code}

Then

...

pass

...

in

...

the

...

ConnectionResource

...

to

...

the

...

SjmsComponent:

{
Code Block
}
CamelContext camelContext = new DefaultCamelContext();
AMQConnectionResource pool = new AMQConnectionResource("tcp://localhost:33333", 1);
SjmsComponent component = new SjmsComponent();
component.setConnectionResource(pool);
camelContext.addComponent("sjms", component);

To see the full example of its usage please refer to the ConnectionResourceIT.

Session, Consumer, & Producer Pooling & Caching Management

Coming soon ...

Batch Message Support

The SjmsProducer supports publishing a collection of messages by creating an Exchange that encapsulates a List. This SjmsProducer will take then iterate through the contents of the List and publish each message individually.

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:

Code Block
{code}

To see the full example of its usage please refer to the [ConnectionResourceIT|https://svn.apache.org/repos/asf/camel/trunk/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/it/ConnectionResourceIT.java].

h4. Session, Consumer, & Producer Pooling & Caching Management

Coming soon ...

h4. Batch Message Support

The SjmsProducer supports publishing a collection of messages by creating an Exchange that encapsulates a List. This SjmsProducer will take then iterate through the contents of the List and publish each message individually.

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|https://svn.apache.org/repos/asf/camel/trunk/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/BatchMessage.java] 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:

{code}
List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
    String body = "Hello World " + i;
    BatchMessage<String> message = new BatchMessage<String>(body, null);
    messages.add(message);
}
{code}

Then

...

publish

...

the

...

List:

{
Code Block
}
template.sendBody("sjms:queue:batch.queue", messages);
{code}

h4. Customizable Transaction Commit Strategies (Local JMS Transactions only)

SJMS provides a developer the means to create a custom and plugable transaction strategy through the use of the [TransactionCommitStrategy|https://svn.apache.org/repos/asf/camel/trunk/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/TransactionCommitStrategy.java] interface. This allows a user to define a unique set of circumstances that the [SessionTransactionSynchronization|https://svn.apache.org/repos/asf/camel/trunk/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/tx/SessionTransactionSynchronization.java] will use to determine when to commit the Session. An example of its use is the [BatchTransactionCommitStrategy|https://svn.apache.org/repos/asf/camel/trunk/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/tx/BatchTransactionCommitStrategy.java] which is detailed further in the next section.

h4. Transacted Batch Consumers & Producers

The SjmsComponent has been designed to support the batching of local JMS transactions on both the Producer and Consumer endpoints. How they are handled on each is very different though.

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:

{code}

Customizable Transaction Commit Strategies (Local JMS Transactions only)

SJMS provides a developer the means to create a custom and plugable transaction strategy through the use of the TransactionCommitStrategy interface. This allows a user to define a unique set of circumstances that the SessionTransactionSynchronization will use to determine when to commit the Session. An example of its use is the BatchTransactionCommitStrategy which is detailed further in the next section.

Transacted Batch Consumers & Producers

The SjmsComponent has been designed to support the batching of local JMS transactions on both the Producer and Consumer endpoints. How they are handled on each is very different though.

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:

Code Block
sjms:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10
{code}

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.

{
Code Block
}
sjms:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10&transactionBatchTimeout=2000
{code}

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:

{
Code Block
}
List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
    String body = "Hello World " + i;
    BatchMessage<String> message = new BatchMessage<String>(body, null);
    messages.add(message);
}
{code}

Now

...

publish

...

the

...

List

...

with

...

transactions

...

enabled:

{
Code Block
}
template.sendBody("sjms:queue:batch.queue?transacted=true", messages);
{code}

h3. Additional Notes

h4. Message Header Format

The SJMS Component uses the same header format strategy that is used in the Camel JMS Component. This plugable strategy ensures that messages sent over the wire conform to the JMS Message spec.

For the 

Additional Notes

Message Header Format

The SJMS Component uses the same header format strategy that is used in the Camel JMS Component. This plugable strategy ensures that messages sent over the wire conform to the 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:

...

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

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
Anchor
transactions
transactions

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

Does Springless Mean I Can't Use Spring?

Not at all. Below is an example of the SJMS component using the Spring DSL:

Code Block


h4. Clustering

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.

h3. Transaction Support {anchor:transactions}

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

h4. Does Springless Mean I Can't Use Spring?

Not at all.  Below is an example of the SJMS component using the Spring DSL:

{code}
<route
    id="inout.named.reply.to.producer.route">
    <from
        uri="direct:invoke.named.reply.to.queue" />
    <to
        uri="sjms:queue:named.reply.to.queue?namedReplyTo=my.response.queue&amp;exchangePattern=InOut" />
</route>
{code}

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.