JavaEE 6: ¿Cómo inyectar recursos JMS en un cliente JMS independiente?
-
27-10-2019 - |
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?
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.