# JMS Newbie braucht hilfe



## noerion (22. Dez 2004)

morgen zusammen

ich beschäftige mich grad mit JMS als Kommunikation für eine verteilte Anwendung (Spiel). ich arbeite grad mal die Tutorials durch, die Sache mit den Topics senden und empfangen klappt schon ganz gut auch im Netzwerk.
wenn ich allerdings eine Queue benutzen will, gibt er mir immer


> JNDI lookup failed: 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


aus.
ich hab den Fehler in der Beipieldatei "SampleUtilities.java" gefunden.
in diese Klasse wird nach dem Context gefragt und anscheinend keiner gefunden.

```
public static Object jndiLookup(String name) throws NamingException {
        Object    obj = null;

        if (jndiContext == null) {
            try {
                jndiContext = new InitialContext();
                                
            } catch (NamingException e) {
                System.out.println("Could not create JNDI context: " + 
                    e.toString());
                throw e;
            }
        }
        try {
           obj = jndiContext.lookup(name);
        } catch (NamingException e) {
            System.out.println("JNDI lookup failed: " + e.toString());
            throw e;
        }
        return obj;
    }
```
ich hab den Server von openjms laufen, sonst würd das ja mit den Topic auch nicht funzen. JAVA_HOME und OPENJMS_HOME sind gesetzt. die jars sind eingebunden, ach und ich nehm Eclipse 3.0.

nun meine Frage, hab ich noch irgendwas übersehen? muss ich noch was setzen oder in den Code fassen das es klappt? wie kann ihc den Context gesetzt bekommen, notfalls "brute force"?

ich hoffe jemande kann mir helfen
Noerion


----------



## Bleiglanz (22. Dez 2004)

normalerweise musst du noch Properties übergeben (oder jndi.properties im Classpath haben)

ein "blanker" Aufruf von new InitialContext() kann nicht funktionieren, diese JVM hat ja dann keine Ahnung, dass da irgendwo ein JMS Server läuft und wie man auf den Namensdienst zugreift

```
Hashtable properties = new Hashtable();
   properties.put(Context.INITIAL_CONTEXT_FACTORY,
      "org.exolab.jms.jndi.InitialContextFactory");
   properties.put(Context.PROVIDER_URL,
      "rmi://localhost:1099/");
   Context context = new InitialContext(properties);
```


----------



## noerion (22. Dez 2004)

hab ich schon gemacht, zwar in einer anderen Datei, aber das macht in diesem Fall nix. die Klasse wird ja nur aufgerufen. 
wie gesagt, sonst hätte es ja auch mit der Topic nicht funktioniert


----------



## Bleiglanz (22. Dez 2004)

noerion hat gesagt.:
			
		

> hab ich schon gemacht, zwar in einer anderen Datei, aber das macht in diesem Fall nix. die Klasse wird ja nur aufgerufen.


was ist die andere Datei?
wenn du das nicht global machst (mit properties im Cp) musst du es bei jedem Aufruf von new InitialContext machen?


----------



## noerion (23. Dez 2004)

ich hab es mal deinem Vorschlag angepasst und die ganzen Sachen in die Klasse geschrieben
jetzt sieht es so aus

```
public static javax.jms.QueueConnectionFactory getQueueConnectionFactory() 
      throws Exception {
        if (USE_JNDI) {
            return (javax.jms.QueueConnectionFactory) jndiLookup(QUEUECONFAC);
        } else {
            // return new provider-specific QueueConnectionFactory
        	Hashtable properties = new Hashtable(); 
        	properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.exolab.jms.jndi.InitialContextFactory"); 
        	properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/"); 
        	InitialContext jndiContext = new InitialContext(properties);
        	     	
         return null;
        	}
    }
```
jetzt wirft er mir aber ne java.lang.NullPointerException. beim Debuggen stellt sich raus das der irgendwelche Probleme mit meinen JARs hat. irgendwelche Klassen nicht findet. ich hab grad mal nachgeschaut, die sind da. auch in den JARs die ich ihm gegeben habe. bin etwas ratlos!


----------



## Bleiglanz (23. Dez 2004)

>>jetzt wirft er mir aber ne java.lang.NullPointerException.

WO?

Classpath zur Runtime richtig?


----------



## LastUnicorn (2. Mai 2005)

Ich hab momentan auch das Problem, dass die jndi.properties nicht benutzt wird und es so zu einer Exception kommt. 

Ich hab die aus dem JBoss/config/default Verzeichnis genommen und in den CLASSPATH bei den Umgebungsvariablen gesetzt, jedoch kommt es immer noch zur Exception: 

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(NamingManager.java:640)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:280)
    at javax.naming.InitialContext.lookup(InitialContext.java:347)
    at mqtest.Ticker.NewsTickerSender.main(NewsTickerSender.java:32)



Ich werd noch wahnsinnig.....


----------

