Initial Context Lookup Timout bei Glassfish

luckyluke80de

Grünschnabel
Hallo,

seit kurzem schlage ich mich damit herum, die Reaktionszeit meines Clients zu verbessern, wenn der Server nicht erreichbar ist. Da die Standard Timouts für meine Begriffe zu hoch sind, wollte ich sie ändern. Nach langer Suche bin ich auf die (denke ich zumindest) richtigen Properties gestossen. Leider tut sich trotzdem nichts. Vielleicht hat hier ja jemand eine Idee, woran es liegen könnte.

Java:
public void connect() {

long start = new Date().getTime();

		Properties jndiProps = new Properties();
		jndiProps.setProperty(ORBConstants.INITIAL_HOST_PROPERTY, "localhost");   //sowieso Standard
		jndiProps.setProperty(ORBConstants.INITIAL_PORT_PROPERTY, "3700"); //auch Standard
		jndiProps.setProperty(ORBConstants.TRANSPORT_TCP_CONNECT_TIMEOUTS_PROPERTY, "250:3000:1:5000");
		jndiProps.setProperty(ORBConstants.WAIT_FOR_RESPONSE_TIMEOUT, "1");
		jndiProps.setProperty(ORBConstants.TRANSPORT_TCP_TIMEOUTS_PROPERTY, "1000:1500:1:10");

                BeanRemote bean = null;
		InitialContext ic;
		try {
			ic = new InitialContext(jndiProps);
			jndiProps.list(System.out);
			bean = (BeanRemote) ic.lookup("myBean");
			
		} catch (NamingException e) {
			long runningTime = new Date().getTime() - start; 
			System.out.println("running Time: " + runningTime);
			e.printStackTrace();
		}
		
		long runningTime = new Date().getTime() - start; 
		System.out.println("running Time: " + runningTime);

}

Das Problem ist nun: egal was ich an den Properties drehe: die running Time ändert sich kein bisschen.

Zur Erläuterung der einzelnen Parameter habe ich mir auch dieses Blog angeschaut:
http://blogs.sun.com/ejcorba/entry/client_side_transport_timeouts_and
 
Zuletzt bearbeitet:

luckyluke80de

Grünschnabel
Hallo genodeftest,

das bringt mich leider nicht weiter. Wenn ich es richtig verstanden habe, kann ich damit vielleicht real time untersuchen, dass der timeout zu lang ist. Ich kann ihn aber nicht damit heruntersetzen.

Vielleicht habe ich das Problem auch nicht genau genug beschrieben. Es handelt sich hierbei um eine verteilte Anwendung. Einen simplen Java Client und einen Glassfish Container, in welchem bspw. Stateless Session Beans laufen. Diese Beans instanziiere ich durch die oben beschriebene Vorgehensweise. Wenn jetzt der Server für den Client nicht erreichbar ist, dauert es ca. 7min bis die Exception geworfen wird. Dieses Timout möchte ich herabsetzen. Leider reagiert aber der Client nicht auf die Änderungen.

Als Workaround versuche ich gerade vorher einen Socket auf Port 7 zu öffnen und damit die Erreichbarkeit des Servers zu testen.
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

was dauert denn nun so lange, die Erzeugung des InitialContext's oder der erste Lookup (bis zum Fehlschlag)?
Wie hast du denn deinen InitialContext initalisiert, bevor du die Parameter "angepasst" hast?

Standardmäßig sucht der Mechanismus innerhalb von InitialContext nach einer Datei namens jndi.properties im Classpath....

schau doch mal, ob du damit:
Java:
package de.tutorials;

import java.net.URL;
import java.util.Collections;

public class JNDIPropertiesExample {
	public static void main(String[] args) throws Exception{
		for(URL url : Collections.list(JNDIPropertiesExample.class.getClassLoader().getResources("jndi.properties"))){
			System.out.println(url);
		}
	}
}
Eine JDNI Properties Datei findest die noch ein paar weitere Einstellungen vornimmt die du noch nicht angepasst hast ;-)

Gruß Tom
 

luckyluke80de

Grünschnabel
Ich hab die Datei gefunden, aber ich hatte mit list Properties vorher schon festgestellt, dass es keine weiteren Properties gibt, die man ändern könnte. Die Datei befindet sich in der glassfish-naming.jar Bibliothek. Sie beinhaltet folgende Properties:

Code:
java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory
java.naming.factory.url.pkgs=com.sun.enterprise.naming
# Required to add a javax.naming.spi.StateFactory for CosNaming that
# supports dynamic RMI-IIOP.
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl

Ich hatte mir schon teilweise den Glassfish Quellcode angeschaut, aber ich habe eigentlich aufgegeben. Ich werde über einen Workaround (Socket) vorher über ein anderes Port prüfen, ob der Server erreichbar ist oder nicht.

Vielen Dank für die Antworten

UPDATE:

Der Vollständigkeit halber, hier der Workaround:

Code:
		try {
			InetAddress address = InetAddress.getByName("myhost");
			System.out.println("Name: " + address.getHostName());
			System.out.println("Addr: " + address.getHostAddress());
			System.out.println("Reach: " + address.isReachable(3000));
		} catch (UnknownHostException e) {
			System.err.println("Unable to lookup myhost");
		} catch (IOException e) {
			System.err.println("Unable to reach myhost");
		}
 
Zuletzt bearbeitet:

Neue Beiträge