Pregunta

Estoy tratando de crear simplemente conectarme con ActiveMQ usando JNDI.


Tengo

  1. Cola llamada 'ejemplo.A'.

  2. 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

  3. 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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top