Glassfish Fehler IOP00410201 in Verbindung mit EJB

Der folgende Fehler taucht unerwartet auf:

[#|2010-04-20T05:00:00.015+0200|WARNING|sun-appserver9.1|javax.enterprise.resource.corba.ee.S1AS-ORB.rpc.transport|_ThreadID=19;_ThreadName=QuartzScheduler_Worker-2;IIOP_CLEAR_TEXT;localhost;18037;_RequestID=cd0aa279-4fbf-4de9-b1c8-c4f10db37d3b;|”IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: localhost; port: 3700”
org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No

Dieser Fehler wird durch folgende Codezeile verursacht:

        InitialContext ic;
try {
    ic = new InitialContext();
    coreProxy = (HelloWorldLocal) ic.lookup("ejb/anwendung/HelloWorldBean");
    ic.close();
} catch (NamingException e) {
    e.printStackTrace();
}

Warum taucht dieser Fehler auf und wodurch? Dieser Fehler entsteht nicht aufgrund eines Fehler im Quellcode, sondern hat andere Gründe. Eine Domain eines Glassfish-Servers hat verschiedene Ports. Wenn neben der Domain 1, weitere Domains erstellt werden, ändern sich nicht nur die Ports 8080 und 4949. Es ändern sicht auch die Ports für den iiop-service und den jms-service. Gleichzeitg werden andere Namen für den Rechner vergeben. Bei mir wurde hinter den Namen des Rechners bei der Domain 2 “fritz.box” angehängt. Von diesen Änderungen ist aber auch die sun-acc.xml betroffen. Dort werden die Einstellungen für den “target-server …” verändert. Es bestehen nun verschiedene Lösungsmöglichkeiten:

  • Einstellungen auf die Einstellungen von Domain 1 zurück setzen
  • Die neuen Einstellungen an das Objekt InitialContext übergeben

Die Lösung eins ist entsprechend einfach. Die Werte für den iiop-service und für den jms-service in der “domain.xml” der Domain 1 müssen in die “domain.xml” der Domain 2 kopiert werden. Die dort vorhandenen Werte für beide Services müssen dabei überschrieben werden. Weiterhin muss die target-server Zeile aus der “sun-acc.xml” von der Domain 1 in die “sun-acc-xml” von der Domain 2 kopiert werden und die dort vorhandene target-server Zeile überschrieben werden. Die Lösung zwei ist dagegen ein wenig umständlicher. Zuerst muss gebprüft werden ob der neue Servername auch wirklich stimmt, da ansonsten der Server nicht anrufbar ist. Durch

Properties env = new Properties();
env.put(“java.naming.factory.initial”,”com.sun.jndi.cosnaming.CNCtxFactory”);
env.put(“java.naming.provider.url”, “iiop://0.0.0.0:3700”);

können verschiedene Werte festgelegt werden. Dies kann auch durch das einlesen einer Propertie-Datei übernommen werden. Durch folgende Codezeile werden diese Einstellungen dann gesetzt:

ic = new InitialContext(env);

Mögliche Einstellungen für Glassfish laut https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB

Properties props = new Properties();

props.setProperty(“java.naming.factory.initial”,
“com.sun.enterprise.naming.SerialInitContextFactory”);

props.setProperty(“java.naming.factory.url.pkgs”,
“com.sun.enterprise.naming”);

props.setProperty(“java.naming.factory.state”,
“com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl”);

// optional. Defaults to localhost. Only needed if web server is running
// on a different host than the appserver
props.setProperty(“org.omg.CORBA.ORBInitialHost”, “localhost”);

// optional. Defaults to 3700. Only needed if target orb port is not 3700.
props.setProperty(“org.omg.CORBA.ORBInitialPort”, “3700”);

InitialContext ic = new InitialContext(props);