JavaEE 6: Wie füge ich JMS-Ressourcen in einen eigenständigen JMS-Client ein?
-
27-10-2019 - |
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?
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.