JavaEE 6: Comment injecter des Ressources JMS dans un standalone client JMS?
Je ne peux pas obtenir javax.jms.ConnectionFactory
injecté dans mes autonome client JMS.
Je reçois un java.lang.NullPointerException
à connectionFactory.createConnection()
dans le code ci-dessous.
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();
}
}
}
J'ai créé la Connexion correspondante de l'Usine et de la Destination des Ressources à Ouvrir MQ (MoM) à l'aide de Glassfish 3.1 Console d'administration.
Quelqu'un pourrait-il m'aider à comprendre ce qui me manque?
@Resource
ne fonctionne pas, mais en regardant vers le haut en utilisant le nom JNDI. Context jndiContext = new InitialContext(); ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext.lookup("jms/QueueConnectionFactory"); Queue destination = (Queue) jndiContext.lookup("jms/ShippingRequestQueue");
Merci, cela a fonctionné pour moi.
OriginalL'auteur skip | 2011-09-07
Vous devez vous connecter pour publier un commentaire.
Des ressources d'injection ne fonctionne que dans un environnement géré, comme un serveur d'application Java EE, ou un Printemps conteneur, par exemple. Dans une application autonome JNDI est votre seul choix.
Annotations en général sont destinées à être traitées par des outils/framework, et la plaine de la JVM qui exécute votre
main()
méthode tout simplement ne contiennent pas de telles. La seule annotations je sais de qui sont traitées par la JVM de la boîte à la compilation@Deprecated
,@Override
et@SuppressWarnings
.De répondre à votre commentaire: je n'ai pas accès au livre, donc je vais seulement deviner qu'ils ont probablement décrire l'exécution d'une client de l'application de la composante et pas application autonome client. Ce n'est pas la même vérifier Glassfish EJB FAQ. ACCs sont généralement déployée dans un serveur d'application et peut être exécuté via Java Web Start ou sans elle, mais dans une manière spécifique. Voir Glassfish exemple (vous n'avez pas dit ce QUE votre EJB s'exécute dans).
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 } }
. C'est une partie du code à partir du chapitre 4 du livre EJB 3 en Action. L'injection de dépendance de ressources sont en train d'être fait dans ce client autonome. Comment ça fonctionne?Voir mon édité réponse.
La droite. Avec gf-client.jar dans le build path, vous ne pourriez utiliser le
lookup
méthode avec le nom JNDI pour obtenir des ressources. Mais pour l'injection de dépendances à travailler dans un client autonome, il doit être déployé sur un conteneur EJB pour obtenir ce supplément de JavaEE jus. ensode.net/glassfish_rich_ejb_clients.html a été utile. Avec Glassfish 3.1appclient -client myappclient.jar
œuvres. Merci.OriginalL'auteur MaDa
@skip: essayez
@Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")
nom=nom JNDI que par javax.annotation.Ressources java doc.
J'ai essayé
@Resource(lookup="jms/QueueConnectionFactory")
ainsi encore, mais je reçois le même message d'erreur tel que mentionné ci-dessus que je ne suis pas en mesure d'obtenir les ressources injectées.ce qui est étrange. Parce que si vous regardez le lien:- java.sun.com/javaee/5/docs/api/javax/annotation/Resource.html nom de l'attribut lié au nom JNDI. Avez-vous essayé de résoudre ce nom JNDI explicitement par NamingContext API?
J'ai essayé de serveur spécifique
mappedName
, portablename
et la nouvelle "recherche" de JavaEE 6 mais je ne suis pas en mesure d'obtenir les ressources injectées. Seule façon dont il a travaillé a été quand j'ai fait la suivante:Context jndiContext = new InitialContext(); ConnectionFactory connectionFactory = (ConnectionFactory) jndiContext.lookup("jms/QueueConnectionFactory"); Queue destination = (Queue) jndiContext.lookup("jms/ShippingRequestQueue");
. J'ai essayé en ajoutantjava:comp/env
ajouté explicitement avec les noms JNDI ci-dessus, ce qui je ne devrais pas, mais cela ne fonctionne pas non plus. Ce qui me manque ici?OriginalL'auteur ag112