2011-09-07 12 views
9

No puedo obtener javax.jms.ConnectionFactory inyectado en mi cliente JMS independiente. Obtengo java.lang.NullPointerException en connectionFactory.createConnection() en el código siguiente.JavaEE 6: ¿Cómo inyectar el recurso JMS en un cliente JMS independiente?

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 correspondiente y en el recurso de destino abierto MQ (MoM) usando GlassFish 3.1 consola de administración.

¿Alguien podría ayudarme a entender lo que me estoy perdiendo?

+2

'@ Resource' no funciona, pero buscar usando el nombre JNDI sí. \t 'Contexto jndiContext = new InitialContext(); \t \t ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext.lookup ("jms/QueueConnectionFactory"); \t Queue destination = (Queue) jndiContext.lookup ("jms/ShippingRequestQueue"); ' – skip

+0

Gracias, esto funcionó para mí. – Puckl

Respuesta

7

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 procesadas por JVM de fábrica son el tiempo de compilación @Deprecated, @Override y @SuppressWarnings.

En respuesta a tu comentario: que no tienen acceso al libro, así que sólo voy a adivinar que es probable que describen la ejecución de un componente de cliente de aplicación y nocliente aplicación independiente. No es lo mismo — check Glassfish EJB FAQ. Los ACC se implementan normalmente en un servidor de aplicaciones y se pueden ejecutar a través de Java Web Start o sin él, pero de forma específica para AS. Consulte Glassfish example (no indicó cómo se ejecuta su EJB).

+0

'public class ShippingRequestJMSProducer { @Resource (name =" jms/ShippingRequestQueue ", mappedName =" ShippingRequestQueue ") private static Destino destination; @Resource (name = "jms/QueueConnectionFactory") private static ConnectionFactory connectionFactory; public void main (String [] args) {estáticas \t // resto del código }} '. Esto es parte del código del capítulo 4 del libro ** EJB 3 en acción **. Inyección de dependencia de los recursos se están realizando en este cliente independiente. ¿Como funciona? – skip

+0

@skip Vea mi respuesta editada. – MaDa

+0

Derecha. Con ** gf-client.jar ** en la ruta de compilación, solo puedes usar el método 'lookup' con el nombre JNDI para acceder a los recursos. Pero para que la inyección de dependencia funcione en un cliente independiente, debe implementarse en un contenedor EJB para obtener ese jugo JavaEE adicional. http://www.ensode.net/glassfish_rich_ejb_clients.html fue útil. Con Glassfish 3.1 'appclient -client myappclient.jar' funciona. Gracias. – skip

1

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

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

+0

Lo probé, pero todavía no funciona :( – skip

+0

Probé '@Resource (lookup =" jms/QueueConnectionFactory ")' también pero sigo recibiendo el mismo error que el mencionado anteriormente porque no puedo obtener los recursos inyectados. – skip

+0

@skip, esto es extraño. Porque si mira el enlace: - http://java.sun.com/javaee/5/docs/api/javax/annotation/Resource.html nombre de atributo relacionado con JNDI nombre. ¿Intentó resolver este nombre JNDI explícitamente a través de NamingContext API? – ag112