2011-09-07 11 views
9

Non riesco ad ottenere javax.jms.ConnectionFactory iniettato nel mio client JMS standalone. Ottengo uno java.lang.NullPointerException allo connectionFactory.createConnection() nel codice qui sotto.JavaEE 6: Come iniettare la risorsa JMS in un client JMS autonomo?

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(); 
     }   
    } 

} 

ho creato la fabbrica di collegamento corrispondente e delle risorse della destinazione aperto MQ (MoM) utilizzando Glassfish 3.1 Admin Console.

Qualcuno potrebbe aiutarmi a capire cosa mi manca?

+2

'@ Resource' non funziona, ma la ricerca avviene utilizzando il nome JNDI. \t 'Context jndiContext = new InitialContext(); \t \t ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext.lookup ("jms/QueueConnectionFactory"); \t Queue destination = (Queue) jndiContext.lookup ("jms/ShippingRequestQueue"); ' – skip

+0

Grazie, ha funzionato per me. – Puckl

risposta

7

L'iniezione di risorse funziona solo in un ambiente gestito, ad esempio un server di applicazioni Java EE o un contenitore Spring, ad esempio. In un'applicazione standalone, JNDI è la vostra unica scelta.

Le annotazioni in generale devono essere elaborate da alcuni strumenti/framework e la semplice JVM che esegue il metodo main() semplicemente non contiene tale. Le uniche annotazioni che conosco sono elaborate da JVM immediatamente dopo la compilazione @Deprecated, @Override e @SuppressWarnings.

Rispondendo al tuo commento: Non ho accesso al libro, quindi mi limiterò solo immaginare che probabilmente descrivono l'esecuzione di un componente client applicazione e nonstand-alone client applicativo. Non è lo stesso — check Glassfish EJB FAQ. Gli ACC vengono normalmente distribuiti in un application server e possono essere eseguiti tramite Java Web Start o senza di esso, ma in modo AS specifico. Vedi Glassfish example (non hai detto come si esegue il tuo EJB).

+0

'public class ShippingRequestJMSProducer { @Resource (name =" jms/ShippingRequestQueue ", mappedName =" ShippingRequestQueue ") destinazione statica privata Destinazione; @Resource (name = "jms/QueueConnectionFactory") private static ConnectionFactory connectionFactory; void main (String [] args) {public static \t // resto del codice }} '. Questa è una parte del codice del capitolo 4 del libro ** EJB 3 in Action **. In questo client standalone vengono eseguite iniezioni di risorse. Come funziona? – skip

+0

@skip Vedere la mia risposta modificata. – MaDa

+0

Giusto. Con ** gf-client.jar ** nel percorso di generazione è possibile utilizzare solo il metodo 'lookup' con il nome JNDI per accedere alle risorse. Tuttavia, per l'integrazione delle dipendenze in un client standalone, è necessario distribuirle in un contenitore EJB per ottenere il succo JavaEE aggiuntivo. http://www.ensode.net/glassfish_rich_ejb_clients.html è stato utile. Con Glassfish 3.1 'appclient -client myappclient.jar' funziona. Grazie. – skip

1

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

name = Nome JNDI secondo javax.annotation.Resource java doc.

+0

L'ho provato, ma ancora non funziona :( – skip

+0

Ho provato '@Resource (lookup =" jms/QueueConnectionFactory ")' pure, ma sto ancora ricevendo lo stesso errore di cui sopra visto che non riesco ad ottenere le risorse iniettate. – skip

+0

@skip, questo è strano, perché se si guarda il link: - http://java.sun.com/javaee/5/docs/api/javax/annotation/Resource.html nome attributo correlato a JNDI nome. Hai provato a risolvere questo nome JNDI esplicitamente tramite l'API NamingContext? – ag112