Pregunta

No puedo inyectar javax.jms.ConnectionFactory en mi cliente JMS independiente. Obtengo un java.lang.NullPointerException en connectionFactory.createConnection() en el siguiente código.

<×JmsClient.java

public class JmsClient {

    @Resource(mappedName="jms/QueueConnectionFactory")
    private static ConnectionFactory connectionFactory;    

    @Resource(mappedName="jms/ShippingRequestQueue")
    private static Destination destination;

    public static void main(String[] args) {        
        try {
            Connection connection = connectionFactory.createConnection();
            connection.start();

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(destination);
            ObjectMessage message = session.createObjectMessage();

            ShippingRequestQueue shippingRequest = new ShippingRequestQueue(1, "107, Old Street");

            message.setObject(shippingRequest);
            producer.send(message);
            session.close();
            connection.close();

            System.out.println("Shipping request message sent ..");
        } catch (Throwable ex) {
            ex.printStackTrace();
        }        
    }

}

He creado la fábrica de conexiones y el recurso de destino correspondientes en Open MQ (MoM) utilizando la consola de administración de Glassfish 3.1.

¿Podría alguien ayudarme a entender qué me estoy perdiendo?

¿Fue útil?

Solución

La inyección de recursos solo funciona en un entorno administrado, como un servidor de aplicaciones Java EE o un contenedor Spring, por ejemplo. En una aplicación independiente, JNDI es su única opción .

Las anotaciones en general están destinadas a ser procesadas por alguna herramienta / marco, y la JVM simple que ejecuta su método main() simplemente no las contiene. Las únicas anotaciones que conozco que son procesadas por JVM de forma inmediata son @Deprecated en tiempo de compilación, @Override y @SuppressWarnings.

Respondiendo a su comentario: no tengo acceso al libro, así que solo supongo que probablemente describen la ejecución de un componente de cliente de aplicación y no cliente de aplicación independiente . No es lo mismo: consulte las preguntas frecuentes de Glassfish EJB . Los ACC normalmente se implementan en un servidor de aplicaciones y se pueden ejecutar a través de Java Web Start o sin él, pero de una manera específica de AS. Consulte ejemplo de Glassfish ( no dijo en qué se ejecuta AS su EJB).

Otros consejos

@skip: prueba @Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")

nombre= nombre JNDI según javax.annotation.Resource java doc.

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