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
compile 'org.glassfish.main.appclient:gf-client:4.0'
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:
- imqbroker.jar
- imqjmsra.jar
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.