Connecting to remote ConnectionFactory and Queue
jimdarkmagic Mar 11, 2014 1:02 PMHi,
I got a problem with lookup of a remote ConnectionFactory.
On my JBoss 7.2.0 I have this code deployed as an ejb.
package server; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.Message; import javax.jms.MessageListener; @MessageDriven ( activationConfig = { @ActivationConfigProperty(propertyName="destination", propertyValue="queue/FibonacciQueue"), @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty(propertyName="subscriptionDurability", propertyValue="NonDurable") } ) public class FibonacciBean implements MessageListener { @Override public void onMessage(Message msg) { System.out.println(msg); } }
The server is also giving me greenlight that everything is deployed and my queues are existent.
17:52:52,916 INFO [org.hornetq.core.server] (MSC service thread 1-5) HQ221009: Server is now live
17:52:52,916 INFO [org.hornetq.core.server] (MSC service thread 1-5) HQ221003: HornetQ Server version 2.3.0.CR1 (buzzzzz!, 122) [81c1c181-a930-11e3-8454-fba40b6c1c76]
17:52:52,932 INFO [org.hornetq.core.server] (ServerService Thread Pool -- 58) HQ221005: trying to deploy queue jms.queue.Fibonacci
17:52:53,025 INFO [org.jboss.as.jacorb] (MSC service thread 1-6) JBAS016328: CORBA Naming Service started
17:52:53,041 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 58) JBAS011601: Bound messaging object to jndi name java:/queue/FibonacciQueue
17:52:53,041 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 58) JBAS011601: Bound messaging object to jndi name java:jboss/exported/queue/FibonacciQueue
17:52:53,057 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 60) JBAS011601: Bound messaging object to jndi name java:/ConnectionFactory
17:52:53,057 INFO [org.jboss.as.connector.deployment] (MSC service thread 1-1) JBAS010406: Registered connection factory java:/JmsXA
17:52:53,057 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 59) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/RemoteConnectionFactory
17:52:53,103 INFO [org.hornetq.ra] (MSC service thread 1-1) HornetQ resource adaptor started
17:52:53,103 INFO [org.jboss.as.connector.services.resourceadapters.ResourceAdapterActivatorService$ResourceAdapterActivator] (MSC service thread 1-1) IJ020002: Deployed: file://RaActivatorhornetq-ra
17:52:53,103 INFO [org.jboss.as.connector.deployment] (MSC service thread 1-1) JBAS010401: Bound JCA ConnectionFactory [java:/JmsXA]
17:52:53,213 INFO [org.jboss.as.ejb3] (MSC service thread 1-7) JBAS014142: Started message driven bean 'FibonacciBean' with 'hornetq-ra' resource adapter
17:52:53,369 INFO [org.jboss.as.server] (ServerService Thread Pool -- 32) JBAS018559: Deployed "Rechner.jar" (runtime-name : "Rechner.jar")
17:52:53,384 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://127.0.0.1:9990/management
17:52:53,384 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990
17:52:53,384 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss AS 7.2.0.Final "Janus" started in 4107ms - Started 194 of 255 services (60 services are passive or on-demand)
In my management webgui I also see all the queus and factories.
And now I try to connect with a client to the Server, but he can't find the factories or queues and I have no idea on how to get the proper jndi-name.
package client; import java.util.Hashtable; import java.util.Properties; import javax.jms.Connection; import javax.jms.ConnectionFactory; 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; import javax.rmi.PortableRemoteObject; import org.jboss.ejb.client.EJBClientContext; import org.jboss.ejb.client.PropertiesBasedEJBClientConfiguration; import org.jboss.ejb.client.remoting.ConfigBasedEJBClientContextSelector; public class Client { private final String factoryJNDILookup = "jms/RemoteConnectionFactory"; private final String queueJNDILookup = "queue/FibonacciQueue"; private ConnectionFactory connectionFactory; private Queue queue; public Client() { Properties jbossClientProps = new Properties(); jbossClientProps.setProperty("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false"); jbossClientProps.setProperty("remote.connections", "default"); jbossClientProps.setProperty("remote.connection.default.host", "localhost"); jbossClientProps.setProperty("remote.connection.default.port", "4447"); jbossClientProps.setProperty("remote.connection.default.username", "user"); jbossClientProps.setProperty("remote.connection.default.password", "pass"); jbossClientProps.setProperty("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false"); jbossClientProps.setProperty("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS", "true"); jbossClientProps.setProperty("remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS", "JBOSS-LOCAL-USER"); PropertiesBasedEJBClientConfiguration ejbcfg = new PropertiesBasedEJBClientConfiguration(jbossClientProps); ConfigBasedEJBClientContextSelector ejbClientSelector = new ConfigBasedEJBClientContextSelector(ejbcfg); EJBClientContext.setSelector(ejbClientSelector); Hashtable<String, String> env = new Hashtable<String, String>(); env.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); try { InitialContext initialContext = new InitialContext(env); Object connectionFactoryObjectReference = initialContext.lookup(factoryJNDILookup); Object connectionFactoryObject = PortableRemoteObject.narrow(connectionFactoryObjectReference, ConnectionFactory.class); this.connectionFactory = ConnectionFactory.class.cast(connectionFactoryObject); Object queueReference = initialContext.lookup(queueJNDILookup); Object queueObject = PortableRemoteObject.narrow(queueReference, Queue.class); this.queue = Queue.class.cast(queueObject); } catch (NamingException e) { e.printStackTrace(); } } public void start() { try { Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(queue); TextMessage message = session.createTextMessage(); message.setText("This is a message, Hello"); messageProducer.send(message); System.out.println("done"); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) { Client client = new Client(); client.start(); } }
And it all fails in Line 51 with:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
He is unable to find either the queue nore the factory.
Also tried it with: jboss/exported/jms/RemoteConnectionFactory ; ejb:/jboss/exported/jms/RemoteConnectionFactory!RemoteConnectionFactory ; RemoteConnectionFactory
Any help would be appreciated.