# Frage zu JNDI



## noch_anfänger (1. Mrz 2010)

Hallo,

ich kann nicht mit JNDI und JMS klar zu kommen...
Habe einige Beispiele für AqtiveMQ gefunden:

```
package activeMQ;

import java.io.*;
import javax.jms.*;
import javax.naming.*;

public class QSender {

    public static void main(String[] args) {

        new QSender().send();
    }

    public void send() {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        try {
            
            System.out.println("Enter QueueConnectionFactory name:");
            String factoryName = reader.readLine();
            System.out.println("Enter Queue name:");
            String queueName = reader.readLine();

           
            InitialContext initContext = new InitialContext();
            QueueConnectionFactory factory =
                (QueueConnectionFactory) initContext.lookup(factoryName);
            Queue queue = (Queue) initContext.lookup(queueName);
            initContext.close();

            
            QueueConnection connection = factory.createQueueConnection();
            QueueSession session =
                connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueSender sender = session.createSender(queue);

            
            String messageText = null;
            while (true) {
                System.out.println("Enter message to send or 'quit':");
                messageText = reader.readLine();
                if ("quit".equals(messageText))
                    break;
                TextMessage message = session.createTextMessage(messageText);
                sender.send(message);
            }

           
            System.out.println("Exiting...");
            reader.close();
            connection.close();
            System.out.println("Goodbye!");

        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}
```


```
package activeMQ;

import java.io.*;
import javax.jms.*;
import javax.naming.*;

public class QReceiver implements MessageListener {

    private boolean stop = false;

    public static void main(String[] args) {

        new QReceiver().receive();
    }

    public void receive() {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        try {
            //JNDI-Namen
            System.out.println("Enter QueueConnectionFactory name:");
            String factoryName = reader.readLine();
            System.out.println("Enter Queue name:");
            String queueName = reader.readLine();
            reader.close();

            //Finde adm. Objekte
            InitialContext initContext = new InitialContext();
            QueueConnectionFactory factory =
                (QueueConnectionFactory) initContext.lookup(factoryName);
            Queue queue = (Queue) initContext.lookup(queueName);
            initContext.close();

            //Erzeuge JMS-Objekte
            QueueConnection connection = factory.createQueueConnection();
            QueueSession session =
                connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueReceiver receiver = session.createReceiver(queue);
            receiver.setMessageListener(this);
            connection.start();

            //Warte auf Stop
            while (!stop) {
                Thread.sleep(1000);
            }

            //Exit
            System.out.println("Exiting...");
            connection.close();
            System.out.println("Goodbye!");

        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    public void onMessage(Message message) {

        try {
            String msgText = ((TextMessage) message).getText();
            System.out.println(msgText);
            if ("stop".equals(msgText))
                stop = true;
        } catch (JMSException e) {
            e.printStackTrace();
            stop = true;
        }
    }
}
```

Um JNDI zu benutzen, braucht man auch jndi.properties:

```
# START SNIPPET: jndi

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

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

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

# 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

# END SNIPPET: jndi
```

Ich will mit Queues arbeiten, deswegen brauche ich Topics nicht.

Was soll ich als nächstes machen? JNDI soll ausgelesen werden. Wie macht man das?
Und wie kann ich beide Klassen QSender und QReceiver gleichzeitig starten? Aus cmd.exe? Ich danke im Voraus.


----------



## Kr0e (6. Mrz 2010)

Hi, ich kann dir leider nicht allzu viel dazu sagen, da ich selber grad erst seit 4-5 Tagen mich damit beschäftige...
Aber ich hab schon soviel rausgefunden, vlt hilfts dir ja:

Sofern du bei deinen Umgebungsvariablen nichts verändert hast, klappt das glaub ich nicht:

```
InitialContext initContext = new InitialContext();
            QueueConnectionFactory factory =
                (QueueConnectionFactory) initContext.lookup(factoryName);
            Queue queue = (Queue) initContext.lookup(queueName);
            initContext.close();
```

Ich mach das so und es klappt:

```
Properties props = new Properties();
            props.setProperty(Context.INITIAL_CONTEXT_FACTORY, HornetQConnectionFactory.class.getName());
            props.put(Context.PROVIDER_URL, "jnp://localhost:1099");
            props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");

            InitialContext initContext = new InitialContext(props);
            QueueConnectionFactory factory =
                (QueueConnectionFactory) initContext.lookup(factoryName);
            Queue queue = (Queue) initContext.lookup(queueName);
            initContext.close();
```

Wie du siehst, benutze ich nicht ActiveMQ, du musst also HornetQConnectionFactory durch iwas ActiveMQ spezifisches ersetzen...

Sofern der Server läuft und die conf. Datei richtig ist, sollte das alles klappen.
Hab inzwischen noch ein anderen Problem:

Wenn ich das hier ändere von props.put(Context.PROVIDER_URL, "jnp://localhost:1099"); nach
props.put(Context.PROVIDER_URL, "jnp://192.168.178.11:1099"); //Das ist meine lokale IP
dann sagt er "Connection refused". Das ergibt ggarkeinen Sinn, da localhost ja dasselbe ist wie 192.168.178.11 in meinem Fall...

Ich bin zwar iwie begeistert von JMS aber andererseits ist es auch ne ganz andere Ebene als Java SE...^^

Wenn du was herausgefunden hast, kannst es hier ruhig posten.. bin ja auch am lernen 

Gruß,Chris


----------



## Kr0e (6. Mrz 2010)

Problem gelöst:

Man musste in der conf. Datei vom JNDI Service die Line "bindAddress" auskommentieren. Ansonsten kann der JNDI Server nur von Clienten angesprochen werden, die von dieser Adresse kommen!


----------

