Coming in Karaf 3.0.0: new enterprise JMS feature
In my previous post, I introduced the new enterprise JDBC feature.
To follow the same purpose, we introduced the new enterprise JMS feature.
JMS feature
Like the JDBC feature, the JMS feature is an optional one. It means that you have to install it first:
karaf@root()> feature:install jms
The jms
feature installs the JMS service which is mostly a JMS “client”. It doesn’t install any broker.
For the rest of this post, I’m using a ActiveMQ embedded in my Karaf:
karaf@root()> feature:repo-add activemq 5.9.0karaf@root()> feature:install activemq-broker
Like the JDBC feature, the JMS feature provides:
- an OSGi service
- jms:* commands
- a JMX JMS MBean
The OSGi service provides a set of operation to create JMS connection factories, send JMS messages, browse a JMS queue, etc.
The commands and MBean manipulate the OSGi service.
Commands
The jms:create
command allows you to create a JMS connection factory.
This command automatically creates a connectionfactory-[name].xml
blueprint file in the deploy
folder.
However, it doesn’t install any bundle or feature providing the JMS connection factory classes. It’s up to you to previously install the jar files, bundles, or features providing the actual JMS connection factory.
The jms:create
command expects one argument and two options:
karaf@root()> jms:create --helpDESCRIPTION jms:create Create a JMS connection factory.SYNTAX jms:create [options] name ARGUMENTS name The JMS connection factory nameOPTIONS -u, --url The JMS URL. NB: for WebsphereMQ type, the URL is hostname/port/queuemanager/channel --help Display this help message -t, --type The JMS connection factory type (ActiveMQ or WebsphereMQ)
name
argument is the JMS connection factory name. It’s used in the JNDI name given to the connection factory (e.g./jms/[name]
) and in the blueprint file name in thedeploy
folder.-t
(--type
) option is the JMS connection factory type. For now, the command supports two kinds of connection factory: ActiveMQ or WebsphereMQ. If you want to use another kind of connection factory, you can create the connection factory file yourself (using a ActiveMQ file created by thejms:create
command as a template).-u
(--url
) is the URL used by the connection factory. For instance, for ActiveMQ type, the URL looks liketcp://localhost:61616
. For WebSphereMQ type, the URL looks likehost/port/queuemanager/channel
.
As I installed the activemq-broker
feature in my Karaf, I can create the JMS connection factory for this broker:
karaf@root()> jms:create -t activemq -u tcp://localhost:61616 default
We can see the JMS connection factory file correclty deployed:
karaf@root()> la...151 | Active | 80 | 0.0.0 | connectionfactory-default.xml
The connectionfactory-default.xml
file has been created in the deploy
folder and contains:
<?xml version="1.0" encoding="UTF-8"?><blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="activemqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616" /> </bean> <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"> <property name="maxConnections" value="8" /> <property name="connectionFactory" ref="activemqConnectionFactory" /> </bean> <bean id="resourceManager" class="org.apache.activemq.pool.ActiveMQResourceManager" init-method="recoverResource"> <property name="transactionManager" ref="transactionManager" /> <property name="connectionFactory" ref="activemqConnectionFactory" /> <property name="resourceName" value="activemq.localhost" /> </bean> <reference id="transactionManager" interface="javax.transaction.TransactionManager" /> <service ref="pooledConnectionFactory" interface="javax.jms.ConnectionFactory"> <service-properties> <entry key="name" value="default" /> <entry key="osgi.jndi.service.name" value="/jms/default" /> </service-properties> </service></blueprint>
We can see the JMS connection factories available in Karaf (created by the jms:create
command, or by hand) using the jms:connectionfactories
command:
karaf@root()> jms:connectionfactories JMS Connection Factory----------------------/jms/default
The jms:info
command gives details about a JMS connection factory:
karaf@root()> jms:info /jms/default Property | Value -------------------product | ActiveMQversion | 5.9.0
We are now ready to manipulate the JMS broker.
Let start by sending some messages to a queue in the JMS broker. We can use the jms:send
command to do that:
karaf@root()> jms:send /jms/default MyQueue "Hello World"karaf@root()> jms:send /jms/default MyQueue "Hello Karaf"karaf@root()> jms:send /jms/default MyQueue "Hello ActiveMQ"
The jms:count
command counts the number of messages in a JMS queue. We can check if we have our messages:
karaf@root()> jms:count /jms/default MyQueueMessages Count--------------3
When using ActiveMQ, the jms:queues
and jms:topics
commands can lists the queues and topics available in the JMS broker:
karaf@root()> jms:queues /jms/default JMS Queues----------MyQueue
We can see the MyQueue
queue where we sent our messages.
We can also browse the messages in a queue using the jms:browse
command. We can have the details of the messages:
karaf@root()> jms:browse /jms/default MyQueueMessage ID | Content | Charset | Type | Correlation ID | Delivery Mode | Destination | Expiration | Priority | Redelivered | ReplyTo | Timestamp -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ID:vostro-33323-1387464670760-3:2:1:1:1 | Hello World | UTF-8 | | | Persistent | queue://MyQueue | Never | 4 | false | | Thu Dec 19 15:57:06 CET 2013ID:vostro-33323-1387464670760-3:3:1:1:1 | Hello Karaf | UTF-8 | | | Persistent | queue://MyQueue | Never | 4 | false | | Thu Dec 19 15:57:10 CET 2013ID:vostro-33323-1387464670760-3:4:1:1:1 | Hello ActiveMQ | UTF-8 | | | Persistent | queue://MyQueue | Never | 4 | false | | Thu Dec 19 15:57:14 CET 2013
By default, the jms:browse
command displays all messages in the given queue. You can specify a selector with the -s
(--selector
) option to select the messages to browse.
The jms:consume
command consumes messages from a queue. By consuming, it means removing.
To consume/remove the messages in MyQueue
queue, we can use:
karaf@root()> jms:consume /jms/default MyQueue3 message(s) consumed
JMX JMS MBean
All actions that we did using the jms:* commands can be performed using the JMS MBean (the object name is org.apache.karaf:type=jms,name=*
).
More over, if you want to perform JMS operations programmatically, you can use the org.apache.karaf.jms.JmsService OSGi service.
Comments
Post a Comment