Voici mon code:
import javax.naming.InitialContext;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSender;
import javax.jms.DeliveryMode;
import javax.jms.QueueSession;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
public class Sender
{
public static void main(String[] args) throws Exception
{
// get the initial context
InitialContext ctx = new InitialContext();
// lookup the queue object
Queue queue = (Queue) ctx.lookup("queue/queue0");
// lookup the queue connection factory
QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.
lookup("queue/connectionFactory");
// create a queue connection
QueueConnection queueConn = connFactory.createQueueConnection();
// create a queue session
QueueSession queueSession = queueConn.createQueueSession(false,Session.DUPS_OK_ACKNOWLEDGE);
// create a queue sender
QueueSender queueSender = queueSession.createSender(queue);
queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// create a simple message to say "Hello"
TextMessage message = queueSession.createTextMessage("Hello");
// send the message
queueSender.send(message);
// print what we did
System.out.println("sent: " + message.getText());
// close the queue connection
queueConn.close();
}
}
Eclipse ne rapporte aucune erreur dans le code ci-dessus - je suis capable de compiler avec succès. Cependant, lorsque j'essaie de l'exécuter, j'obtiens l'exception suivante:
Exception in thread "main" javax.naming.NoInitialContextException: Need to specify
class name in environment or system property, or as an applet parameter, or in an application resource file: Java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at Sender.main(Sender.Java:21)
Quelqu'un peut-il s'il vous plaît m'aider à corriger le bogue? J'ai essayé de le réparer pendant quelques heures mais je n'arrive toujours pas à le comprendre.
Nous devons spécifier les paramètres INITIAL_CONTEXT_FACTORY, PROVIDER_URL, USERNAME, PASSWORD, etc. de JNDI pour créer une InitialContext
.
Dans une application autonome, vous pouvez spécifier cela comme ci-dessous
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.Sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://ldap.wiz.com:389");
env.put(Context.SECURITY_PRINCIPAL, "joeuser");
env.put(Context.SECURITY_CREDENTIALS, "joepassword");
Context ctx = new InitialContext(env);
Mais si vous exécutez votre code dans un conteneur Java EE, ces valeurs seront extraites par le conteneur et utilisées pour créer une InitialContext
comme ci-dessous.
System.getProperty(Context.PROVIDER_URL);
et
ces valeurs seront définies lors du démarrage du conteneur en tant qu'arguments JVM . Ainsi, si vous exécutez le code dans un conteneur, ce qui suit fonctionnera.
InitialContext ctx = new InitialContext();
Si vous travaillez sur la bibliothèque client EJB:
Vous devez mentionner l'argument pour obtenir le contexte initial.
InitialContext ctx = new InitialContext();
Sinon, le fichier de propriétés sera recherché dans le dossier du projet. Vous pouvez également inclure les informations d'identification ou les valeurs des propriétés dans votre fichier de classe comme suit:
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
props.put(Context.PROVIDER_URL, "jnp://localhost:1099");
InitialContext ctx = new InitialContext(props);
URL_PKG_PREFIXES: Constante qui contient le nom de la propriété d'environnement pour spécifier la liste des préfixes de package à utiliser lors du chargement dans des fabriques de contexte URL.
La bibliothèque client EJB est la bibliothèque principale pour appeler des composants EJB distants.
Cette bibliothèque peut être utilisée via InitialContext. Pour appeler des composants EJB, la bibliothèque crée un contexte client EJB via une fabrique de contexte URL. La seule configuration nécessaire consiste à analyser la valeur org.jboss.ejb.client.naming de la propriété Java.naming.factory.url.pkgs pour instancier un InitialContext.