Java ee 6: injizieren Sie JMS-Ressource, die in einem eigenständigen JMS-client?
Ich kann nicht javax.jms.ConnectionFactory
injiziert in meine standalone-JMS-client.
Ich bekomme eine java.lang.NullPointerException
bei connectionFactory.createConnection()
im code unten.
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();
}
}
}
Erstellt habe ich die entsprechende Verbindung Fabrik-und Ziel-Ressource Öffnen MQ (MoM) mit Glassfish 3.1 Admin-Konsole.
Könnte jemand mir helfen zu verstehen, was ich bin fehlt?
@Resource
funktioniert nicht, aber ein Blick über den JNDI-Namen ist.Context jndiContext = new InitialContext(); ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext.lookup("jms/QueueConnectionFactory"); Queue destination = (Queue) jndiContext.lookup("jms/ShippingRequestQueue");
- Vielen Dank, das funktionierte für mich.
InformationsquelleAutor skip | 2011-09-07
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ressource-injection funktioniert nur in einer verwalteten Umgebung, wie ein Java EE-application-server, oder ein Spring-container, zum Beispiel. In einer standalone-Anwendung JNDI ist Ihre einzige Wahl.
Anmerkungen im Allgemeinen gemeint sind, um verarbeitet werden, die durch irgendein tool/framework-und Reine JVM ausführt, Ihre
main()
Methode einfach nicht enthalten. Die einzigen Anmerkungen, die ich kenne, die verarbeitet werden, durch die JVM aus der box sind compile-time@Deprecated
,@Override
und@SuppressWarnings
.Antworten zu Ihrem Kommentar: ich keinen Zugang zu dem Buch, also werde ich nur vermuten, dass Sie wahrscheinlich beschreiben die Ausführung einer - Anwendung-client-Komponente und nicht standalone application client. Es ist nicht das gleiche — überprüfen Glassfish-EJB-FAQ. ACCs sind in der Regel bereitgestellt in application-server und können ausgeführt werden, die über Java Web Start oder ohne Sie, aber in einer bestimmten Weise. Sehen Glassfish Beispiel (Sie hat nicht gesagt, was ALS Ihre EJB führt in).
public class ShippingRequestJMSProducer { @Resource(name = "jms/ShippingRequestQueue", mappedName = "ShippingRequestQueue") private static Destination destination; @Resource(name = "jms/QueueConnectionFactory") private static ConnectionFactory connectionFactory; public static void main(String[] args) { // rest of the code } }
. Dies ist ein Teil des Codes aus Kapitel 4 aus dem Buch EJB 3 in Action. Dependency injection von Ressourcen durchgeführt werden, die in diesem standalone-client. Wie funktioniert es?lookup
Methode mit JNDI-Namen zu erhalten, um Ressourcen. Aber für dependency injection zur Arbeit in einem standalone-client es muss bereitgestellt werden, der einen EJB-container zu bekommen, dass zusätzliche Java ee-Saft. ensode.net/glassfish_rich_ejb_clients.html nützlich war. Mit Glassfish 3.1appclient -client myappclient.jar
funktioniert. Danke.@skip: versuchen
@Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")
name=JNDI-Namen gemäß javax.Anmerkung.Ressourcen-java-doc.
@Resource(lookup="jms/QueueConnectionFactory")
als gut, aber ich bin noch immer die gleichen Fehler, wie oben erwähnt, wie ich bin nicht in der Lage, die Ressourcen zu erhalten, injiziert.mappedName
, tragbarename
und die neue 'lookup' von Java ee 6, aber ich bin nicht in der Lage, um die Ressource injiziert. Einzige Weg, es funktionierte, war, als ich Folgendes gemacht:Context jndiContext = new InitialContext(); ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext.lookup("jms/QueueConnectionFactory"); Queue destination = (Queue) jndiContext.lookup("jms/ShippingRequestQueue");
. Ich habe versucht, anfügenjava:comp/env
angehängt explizit mit dem JNDI-Namen vor, die ich nicht sollte, aber das funktioniert auch nicht. Was vermisse ich hier?