Frage

Ich kann keinen javax.jms.ConnectionFactory in meinen eigenständigen JMS-Client injizieren lassen. Ich erhalte einen java.lang.NullPointerException unter connectionFactory.createConnection() im folgenden Code.

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

}

Ich habe die entsprechende Verbindungsfactory und Zielressource bei Open MQ (MoM) mit Glassfish 3.1 Admin Console erstellt.

Könnte mir jemand helfen zu verstehen, was ich vermisse?

War es hilfreich?

Lösung

Die Ressourceninjektion funktioniert nur in einer verwalteten Umgebung, z. B. einem Java EE-Anwendungsserver oder einem Spring-Container. In einer eigenständigen Anwendung ist JNDI Ihre einzige Wahl .

Anmerkungen im Allgemeinen sollen von einem Tool / Framework verarbeitet werden, und eine einfache JVM, die Ihre main()-Methode ausführt, enthält solche einfach nicht. Die einzigen mir bekannten Anmerkungen, die von JVM sofort verarbeitet werden, sind @Deprecated, @Override und @SuppressWarnings zur Kompilierungszeit.

Antwort auf Ihren Kommentar: Ich habe keinen Zugriff auf das Buch, daher werde ich nur vermuten, dass sie wahrscheinlich die Ausführung einer Anwendungsclient-Komponente und nicht eigenständiger Anwendungsclient . Es ist nicht dasselbe - Überprüfen Sie die FAQ zu Glassfish EJB . ACCs werden normalerweise auf einem Anwendungsserver bereitgestellt und können über Java Web Start oder ohne Java-Start ausgeführt werden, jedoch auf AS-spezifische Weise. Siehe Glassfish-Beispiel ( Sie haben nicht gesagt, in welchem ​​AS Ihr EJB ausgeführt wird.

Andere Tipps

@skip: Versuchen Sie es mit @Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")

name= JNDI-Name gemäß javax.annotation.Resource java doc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top