For a project of mine, I was looking to connect a standalone Java application via JMS with a GlassFish 4 backend service. To put it in other words, I wanted to run GlassFish 4 and get access to the JMS queues and topics from a standalone container.
Having done this before with GlassFish 3.1. and JMS 1.8, I figured this be an easy migration task.
Wrong. As it turns out, it is not quite as simple. However, here is the solution to it.
I assume you are building your standalone application with Maven or, preferably, Gradle. The only artifact that you need to add to your build file is
That alone should give you access to your GlassFish’s JMS queues. It doesn’t though. Instead, it will give you
Lookup failed for 'jms/__defaultConnectionFactory'
if you try to connect to your queues. As an example, use the following code:
QueueConnectionFactory connectionFactory = ServiceLocator.getInstance(). getQueueConnectionFactory(Constants.JMS_CONNECTION_FACTORY); Queue queue = ServiceLocator.getInstance().getQueue(Constants.JMS_QUEUE_OUTBOUND); Connection connection = connectionFactory.createConnection(); connection.setExceptionListener(new JMSExceptionListener()); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer consumer = session.createConsumer(queue); consumer.setMessageListener(this); connection.start();
After trying around for a while, I found that (at least in the current version that I am using) you will also require two additional jars:
See also this thread on stackoverflow. If you have both jars in a subdirectory called “jms”, you can just add the following dependency to your gradle build script:
compile fileTree(dir: '../lib/jms', includes: ['*.jar'])
Note: The GlassFish Maven artifacts have huge dependencies, in particular gf-client:4.0 requires about 60 MB of libraries.