2008-10-10 5 views
5

Ich muss einen JNDI-Provider ohne den Overhead eines J2EE-Containers ausführen. Ich habe versucht, den Anweisungen in diesem article zu folgen, der (auf Seite 3) genau beschreibt, was ich tun möchte. Leider scheitern diese Richtungen. Ich musste das jboss-common.jar auch meinem Klassenpfad hinzufügen. Sobald ich das täte, bekomme ich einen Stack-Trace:JNDI ohne J2EE Container (mit JNP? Vielleicht ein anderer Anbieter?)

$ 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) 

Ich hoffe, diese Arbeit zu machen, aber ich würde auch zu einem anderen leichten Standalone-JNDI-Provider offen. All dies soll ActiveMQ zum Laufen bringen, und wenn jemand einen anderen leichten JMS-Provider vorschlagen kann, der außerhalb der VM gut funktioniert, sind die Clients ohne einen voll funktionsfähigen App-Server, der auch funktioniert.

Antwort

6

Apache ActiveMQ schon kommt mit einem integrierten leichten JNDI-Provider. Siehe these instructions on using it.

Im Grunde fügen Sie nur die Datei jndi.properties zum Klassenpfad hinzu und fertig.

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

Dies scheint nicht die Tatsache abzudecken, dass wir einen TCP JNDI-Provider benötigen. Sofern ich mich nicht irre, funktionieren VM-Endpunkte nicht über VMs hinweg. Ich muss in der Lage sein, getrennte Prozesse zu führen, die über JNDI sprechen. Ist das mit diesem JNDI-Anbieter möglich? – Benson

+1

Entschuldigung - ausschneiden und einfügen Problem. Ich habe gerade den * java.naming.provider.url * -Eintrag aktualisiert, so dass TCP verwendet wird - und Failover verwendet, den Sie standardmäßig verwenden sollten, um die Verbindung wiederherzustellen, wenn ein Socket fehlschlägt oder ein Broker geblockt wird –

+0

Toll, danke. Ich muss das ausprobieren und sehen, ob es für mich funktioniert. – Benson

1

Der JBoss JMQ kann auch mit nur dem MicroKernel und einem sehr kleinen Satz von Bibliotheken betrieben werden. Das JBoss AS-Installationsprogramm bietet Optionen für "Profile", von denen eines für ein eigenständiges JMQ ist. Es erlaubt Ihnen auch, Komponenten auszuwählen (obwohl es Ihnen mit Abhängigkeiten nicht zu viel hilft). Haben Sie versucht, das Installationsprogramm auszuführen?

+0

Das ist ein guter Vorschlag, aber ich muss wirklich weg von JBoss, wenn überhaupt möglich. Wenn ich nicht davon wegkommen kann, werde ich es auf jeden Fall so weit wie möglich reduzieren, wie Sie es vorgeschlagen haben. – Benson

2

Verwenden Sie einen jndi.properties wie diese Datei:

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 

Stellen Sie sicher, dass diese Datei in Ihrem Classpath ist. Dann können Sie das Thema Nachschlag/Warteschlange wie dieser (minus entsprechenden try/Fänge):

context = new InitialContext(properties); 

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

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

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

Beachten Sie, dass der JNDI-Provider, den Sie verwenden, nicht Simple JNDI ist - sondern der JNDI-Provider, der mit ActiveMQ geliefert wird :). Siehe den Klassennamen des Eintrags * java.naming.factory.initial * :) –

+0

Wow, du hast Recht. Ich dachte, dass Simple-Jndi diese Arbeit machen würde. Wir hatten es bereits im Projekt für JDBC DataSource-Lookups. Ich habe meinen Eintrag korrigiert. –