Sample JMS Application with HornetQ 2.4 Fails with javaee-api-5.0.1.jar
kaluibu Apr 14, 2015 2:44 AMHi,
I wrote a sample JMS application where I am using HornetQ 2.4.0.Final. Please find below the code.
*******************************************************
package jms2.framework;
import java.util.Hashtable;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class HornetqMessageSender {
public static void main (String [] args) throws JMSException
{
HornetqMessageSender.TestJMS();
}
protected static void TestJMS() throws JMSException {
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces ");
try {
Context ctx = new InitialContext(env);
ConnectionFactory cf = (ConnectionFactory)ctx.lookup("/ConnectionFactory");
Queue queue = (Queue)ctx.lookup("/queue/DLQ");
Connection connection= cf.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(queue);
TextMessage message = session.createTextMessage("Hello, HornetQ!");
producer.send(message);
System.out.println("Sent message: " + message.getText());
MessageConsumer messageConsumer = session.createConsumer(queue);
connection.start();
TextMessage messageRecv = (TextMessage) messageConsumer.receive(5000);
System.out.println("Received Msg is" + messageRecv.getText());
connection.close();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
********************************************************************************************************************************
I am using JMS 1.1 methods by using javaee-api-7.0.jar where JMS 2.0 classes are also available.
When I used javaee-api-7.0.jar, I got the output successfully.
But when I replaced the jar with javaee-api-5.0.1.jar, I got an exception. Please find below the same.
*************************************************************************************
Exception in thread "main" java.lang.NoClassDefFoundError: javax/jms/JMSSecurityRuntimeException
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Unknown Source)
at java.lang.Class.getDeclaredField(Unknown Source)
at java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source)
at java.io.ObjectStreamClass.access$700(Unknown Source)
at java.io.ObjectStreamClass$2.run(Unknown Source)
at java.io.ObjectStreamClass$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(Unknown Source)
at java.io.ObjectStreamClass.lookup(Unknown Source)
at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at org.hornetq.jms.referenceable.SerializableObjectRefAddr.deserialize(SerializableObjectRefAddr.java:78)
at org.hornetq.jms.referenceable.ConnectionFactoryObjectFactory.getObjectInstance(ConnectionFactoryObjectFactory.java:42)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at org.jnp.interfaces.NamingContext.getObjectInstance(NamingContext.java:1479)
at org.jnp.interfaces.NamingContext.getObjectInstanceWrapFailure(NamingContext.java:1496)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:822)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:686)
at javax.naming.InitialContext.lookup(Unknown Source)
at jms2.framework.HornetqMessageSender.TestJMS(HornetqMessageSender.java:33)
at jms2.framework.HornetqMessageSender.main(HornetqMessageSender.java:22)
Caused by: java.lang.ClassNotFoundException: javax.jms.JMSSecurityRuntimeException
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 28 more
*************************************************************************************************************************************************************************
As per HornetQ documentation, HornetQ provides a fully compliant JMS 1.1 and JMS 2.0 API.
What I could understand is that even though HornetQ provides a fully compliant JMS 1.1 and JMS 2.0 API, it requires javaee-api-7.0.jar which contains both JMS 1.1 and JMS 2.0.
Please let me know whether we can get the output by using javaee-api-5.0.1.jar, which obviously doesn't have JMSSecurityRuntimeException class as got above.
My challenge here is I cannot just replace javaee-api-5.0.1.jar in my application since there are some other dependencies too.
Please clarify whether javaee-api-7.0.jar would be required for using HornetQ 2.4.
Regards,
Khaleel