2008-10-10 7 views
5

J'ai besoin d'exécuter un fournisseur JNDI sans la surcharge d'un conteneur J2EE. J'ai essayé de suivre les instructions dans ce article, qui décrit (à la page 3) exactement ce que je veux faire. Malheureusement, ces directions échouent. J'ai dû ajouter jboss-common.jar à mon classpath aussi. Une fois que je l'ai fait, je reçois une trace de la pile:JNDI sans conteneur J2EE (avec JNP? Peut-être un autre fournisseur?)

$ java org.jnp.server.Main 
0 [main] DEBUG 
org.jboss.naming.Naming - Creating 
NamingServer stub, theServer=null,rmiPort=0,clientSocketFactory=null,[email protected]d093076[bindAddress=null] 
Exception in thread "main" 
java.lang.NullPointerException 
    at org.jnp.server.Main.getNamingInstance(Main.java:301) 
    at org.jnp.server.Main.initJnpInvoker(Main.java:354) 
    at org.jnp.server.Main.start(Main.java:316) 
    at org.jnp.server.Main.main(Main.java:104) 

J'espère faire ce travail, mais je voudrais aussi être ouvert à d'autres fournisseurs de JNDI autonomes légers. Tout ceci est de faire fonctionner ActiveMQ, et si quelqu'un peut suggérer un autre fournisseur JMS léger qui fonctionne bien en dehors de la VM, les clients sont dans sans un serveur d'application complet qui fonctionnerait aussi.

Répondre

6

Apache ActiveMQ vient déjà avec un fournisseur JNDI léger intégré. Voir these instructions on using it.

Fondamentalement, vous venez d'ajouter le fichier jndi.properties au classpath et vous avez terminé.

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory 

# use the following property to configure the default connector 
java.naming.provider.url = failover:tcp://localhost:61616 

# use the following property to specify the JNDI name the connection factory 
# should appear as. 
#connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry 

# register some queues in JNDI using the form 
# queue.[jndiName] = [physicalName] 
queue.MyQueue = example.MyQueue 


# register some topics in JNDI using the form 
# topic.[jndiName] = [physicalName] 
topic.MyTopic = example.MyTopic 
+1

Cela ne semble pas couvrir le fait que nous avons besoin d'un fournisseur JNDI TCP. Sauf erreur, les points de terminaison VM ne fonctionnent pas sur les machines virtuelles. Je dois pouvoir exécuter des processus séparés qui parlent via JNDI. Est-ce possible avec ce fournisseur JNDI? – Benson

+1

Désolé - couper et coller problème. Je viens de mettre à jour l'entrée * java.naming.provider.url * afin qu'elle utilise TCP - et utilise le basculement que vous devez utiliser par défaut pour vous reconnecter si un socket tombe en panne ou qu'un courtier est renvoyé –

+0

Excellent, merci. Je vais devoir essayer ça et voir si ça marche pour moi. – Benson

1

Le JBoss JMQ peut également être exécuté avec seulement le MicroKernel et un ensemble de bibliothèques très minimal. Le programme d'installation de JBoss AS a des options pour les "profils" dont l'un est pour un JMQ autonome. Il vous permet également de choisir et de choisir des composants (bien que cela ne vous aide pas trop avec les dépendances). Avez-vous essayé d'exécuter le programme d'installation?

+0

C'est une bonne suggestion, mais j'ai vraiment besoin de sortir de JBoss si possible. Si je ne peux pas m'en éloigner, je vais certainement le réduire le plus possible comme vous l'avez suggéré. – Benson

2

Utilisez un fichier jndi.properties comme ceci:

java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory 

# use the following property to configure the default connector 
java.naming.provider.url=tcp://jmshost:61616 

# use the following property to specify the JNDI name the connection factory 
# should appear as. 
#connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry 

# register some queues in JNDI using the form 
# queue.[jndiName] = [physicalName] 
#queue.MyQueue = example.MyQueue 


# register some topics in JNDI using the form 
# topic.[jndiName] = [physicalName] 
topic.myTopic = MY.TOPIC 

Assurez-vous que ce fichier est dans votre classpath. Ensuite, vous pouvez rechercher le sujet/file d'attente comme celui-ci (moins essayer/prises appropriées):

context = new InitialContext(properties); 

context = (Context) context.lookup("java:comp/env/jms"); 

topicConnectionFactory = (TopicConnectionFactory) context.lookup("ConnectionFactory"); 

topic = (Topic) context.lookup("myTopic"); 
+0

Notez que le fournisseur JNDI que vous utilisez n'est pas le JNDI simple, mais le proviseur de JNDI fourni avec ActiveMQ :). Voir le nom de classe de l'entrée * java.naming.factory.initial * :) –

+0

Wow, vous avez raison. Je pensais que simple-jndi faisait ce travail. Nous l'avions déjà dans le projet pour les recherches JDBC DataSource. J'ai corrigé mon entrée. –

Questions connexes