March 7th, 2007
JBoss AS mit JNDI auf Port 1199
Das Problem war eigentlich ganz einfach: Bei der Installation des JBoss AS 4.0.5 inklusive JBoss ESB (Enterprise Service Bus), Portal und einigen Seam-Applikationen auf einem Kundenserver stellte sich heraus, dass der Port 1099, der standardmäßig vom Java Naming Service JNDI verwendet wird, bereits belegt ist. Die Umkonfiguration auf einen anderen Port (ich entschied mich für 1199) stellte sich jedoch als ein steiniger Weg dar…
Folgende Schritte waren letztendlich nötig:
1. Server Konfiguration
In der Datei ${jboss.home}/server/default/conf/service.xml muss folgender Block eingefügt (bzw. einkommentiert und angepasst) werden:
<mbean code="org.jboss.services.binding.ServiceBindingManager"Damit wird über service-bindings.xml ein alternatives Binding, also eine alternative Portkonfiguration definiert. Diese Date findet man als Vorlage unter ${jboss.home}/docs/examples/binding-manager/sample-bindings.xml
name="jboss.system:service=ServiceBindingManager">
<attribute name="ServerName">ports-01</attribute>
<attribute name=”StoreURL”>
${jboss.home.url}/server/default/conf/service-bindings.xml
</attribute>
<attribute name=”StoreFactoryClassName”>
org.jboss.services.binding.XMLServicesStoreFactory
</attribute>
</mbean>
Inder Datei service-bindings.xml werden zwei Serverkonfigurationen definiert: ports-default, die bleibt so wie sie ist, und server-01, das ist unsere modifizierte Konfiguration.
Hier die wichtigen Stellen aus dieser Datei:
<service-bindings>
<!-- Standardkonfiguration -->
<server name="ports-default">
<service-config name="jboss:service=Naming"
delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
<delegate-config portName="Port" hostName="BindAddress">
<attribute name="RmiPort">1098</attribute>
</delegate-config>
<binding port="1099" host="${jboss.bind.address}" />
</service-config>
<service-config name="jboss:service=WebService"
delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
<delegate-config portName="Port" />
<binding port="8083" />
</service-config>
<!-- usw. für alle definierten Portnummern -->
</server>
<!-- Hier wirds spannend... -->
<server name="ports-01">
<!-- Umkonfiguration des Naming-Dienstes -->
<service-config name="jboss:service=Naming"
delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
<delegate-config portName="Port" hostName="BindAddress">
<attribute name="RmiPort">1198</attribute>
</delegate-config>
<binding port="1199" host="${jboss.bind.address}" />
</service-config>
<!-- Der Rest bleibt wie er ist... -->
</server>
</service-bindings>
2. Patch für JBoss ESB 4.0
Beim Hochfahren der jUDDI-Registry ver sucht der ESB, diese bei localhost:1099 anzumelden, was ja normalerweise auch richtig ist. Nutzt man den ESB mit jUDDI, so muss im Verzeichnis ${jboss.home}/server/default/conf die Datei juddi.properties vorhanden sein. In dieser lässt sich so einiges bzgl. der Registry für den Service-Bus konfigurieren, unter Anderem folgendes:
# JNDI settings (used by RMITransportSuper, genau, was man braucht! Denkste. Die olle Registry meldet sich immer noch auf localhost:1099 an. Der Grung dafür ist ein Bug im JBoss ESB, genauer am jUDDI-Proxy. Folgende Klasse existiert im ESB:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1199
java.naming.factory.url.pkgs=org.jboss.naming
# JNDI settings (used by RMITransport)Der Fehler tritt bei JNDIRegistration.register() auf. Das Problem ist, dass die jUDDI-Konfiguratiuon beim Aufruf dieser Static-Methode noch gar nicht eingelesen ist, also wird fröhlich weiter beim Standard JNDI-Port localhost:1099 angemeldet. Hier der Patch:
package org.jboss.internal.soa.esb.dependencies;
import java.io.File;
import java.net.URI;
import java.util.Properties;
import java.io.IOException;
import java.io.InputStream;
import javax.naming.InitialContext;
public class JuddiRMIService extends ServiceMBeanSupport
implements JuddiRMIServiceMBean {
private Logger logger = Logger.getLogger(this.getClass());
protected void startService() throws Exception {
logger.info("starting juddi RMI service");
final String confURL = System.getProperty("jboss.server.config.url") ;
final URI confDirURI = new URI(confURL) ;
final File confDir = new File(confDirURI) ;
System.setProperty("juddi.propertiesFile", confDir + "/juddi.properties");
JNDIRegistration.register();
}
protected void stopService() throws Exception {
logger.info("Unbinding juddi services");
final InitialContext ic = new InitialContext() ;
ic.unbind(JNDIRegistration.INQUIRY_SERVICE) ;
ic.unbind(JNDIRegistration.PUBLISH_SERVICE) ;
}
}
package org.jboss.internal.soa.esb.dependencies;Jetzt muss noch das Build der JBoss ESB-Quellen angeschmissen werden und es entsteht u. A. die Datei jbossesb-dependencies.jar, die in der Original-Distribution ersetzt werden muss.
import java.io.File;
import java.net.URI;
import java.util.Properties;
import java.io.IOException;
import java.io.InputStream;
import javax.naming.InitialContext;
import org.apache.juddi.registry.RegistryEngine;
import org.apache.juddi.registry.rmi.JNDIRegistration;
import org.apache.log4j.Logger;
import org.jboss.system.ServiceMBeanSupport;
import org.apache.juddi.util.Config;
import org.apache.juddi.util.Loader;
public class JuddiRMIService extends ServiceMBeanSupport
implements JuddiRMIServiceMBean {
private Logger logger = Logger.getLogger(this.getClass());
private static final String PROPFILE_NAME = “juddi.properties”;
protected void startService() throws Exception {
logger.info(”starting juddi RMI service”);
final String confURL = System.getProperty(”jboss.server.config.url”) ;
final URI confDirURI = new URI(confURL) ;
final File confDir = new File(confDirURI) ;
System.setProperty(”juddi.propertiesFile”, confDir + “/juddi.properties”);
logger.info(”** Patch om@form4: start preloading properties”);
try {
InputStream stream = Loader.getResourceAsStream(PROPFILE_NAME);
if (stream != null) {
Properties props = new Properties();
props.load(stream);
Config.addProperties(props);
logger.info(”** Patch om@form4: preloading properties successful”);
}
} catch (IOException ioex) {
logger.error(”An error occured while loading properties
from: “+PROPFILE_NAME,ioex);
}
JNDIRegistration.register();
}
protected void stopService() throws Exception {
logger.info(”Unbinding juddi services”);
final InitialContext ic = new InitialContext() ;
ic.unbind(JNDIRegistration.INQUIRY_SERVICE) ;
ic.unbind(JNDIRegistration.PUBLISH_SERVICE) ;
}
}
Nun geht auch das.
3. Umkonfiguration des ESB
Was auch stundenlanges Debuggen erfordert hat, ist eigentlich ganz einfach: In der Datei ${jboss.home}/server/default/conf/jbossesb.xml wird die jndi-url lapidar mit “localhost” angegeben. Das muss konkretisiert werden. Aus:
<jms-provider name="JBossMQ"wird:
connection-factory="ConnectionFactory"
jndi-context-factory="org.jnp.interfaces.NamingContextFactory"
jndi-URL="localhost">
<jms-provider name="JBossMQ"Ähnliches nochmal in ${jboss.home}/server/default/conf/jbossesb-properties.xml . Aus:
connection-factory="ConnectionFactory"
jndi-context-factory="org.jnp.interfaces.NamingContextFactory"
jndi-URL="localhost:1199">
<property name="org.jboss.soa.esb.jndi.server.url" value="localhost“/>wird:
<property name="org.jboss.soa.esb.jndi.server.url" value="localhost:1199“/>
4. jndi.properties umkonfigurieren
Zu guter letzt noch in der Datei ${jboss.home}/server/default/conf/jndi.properties folgende Zeile ergänzen:
java.naming.provider.url=jnp://localhost:1199Jetzt ist alles gut!


No Responses to “JBoss AS mit JNDI auf Port 1199”
No comments yet
Leave a Reply