Usando ActiveMQ a través de JNDI
Pregunta
Estoy tratando de crear simplemente conectarme con ActiveMQ usando JNDI.
Tengo
-
Cola llamada 'ejemplo.A'.
-
Según documentación de ActiveMQ tocando JNDI , si quiero usar ConectionFactories y Colas (Temas) a través de JNDI, tengo que colocar el archivo jndi.properties en mi classpath. Como he entendido, activeMQ classpath es el directorio% activemq% / conf por defecto. No lo he cambiado. Entonces tengo esta propiedad para mi cola:
queue.MyQueue = example.A
-
He creado una clase de cliente java para ActiveMQ que usa JNDI como se muestra a continuación:
Properties jndiParameters = new Properties() ; jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616"); Context context = new InitialContext(jndiParameters); ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory"); Queue queue = (Queue) context.lookup("MyQueue");
pero no puede encontrar mi cola, arroja una excepción: javax.naming.NameNotFoundException: MyQueue
¿Dónde están mis errores?
Solución
El problema es que está creando explícitamente las propiedades y pasándolas al constructor InitialContext. Esto significa que jndi.properties en la ruta de clase no se leerá.
Su código debería ser algo como:
Context context = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory");
Queue queue = (Queue) context.lookup("MyQueue");
Otros consejos
Puede establecer propiedades estáticas, así como recuperarlas de un archivo como tal:
InputStream is = getClass().getResourceAsStream("/my.jndi.properties");
Properties jndiParameters = new Properties();
jndiParameters.load(is);
jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616");
Context ctx = new InitialContext(jndiParameters);
...
Esto funciona siempre que establezca los accesorios estáticos después de cargar el recurso. Útil si está cargando la URL del proveedor desde otro lugar, por ejemplo.