Zugriff auf JMX funktioniert lokal aber nicht remote

Boemm

Grünschnabel
Hallo,

nachdem ich nun eine ganze Weile an MBeans entwickelt habe wollte ich nun eine Kommunikation von einem lokalen JBoss zu einem jBoss auf nem anderen Rechner einrichten und dabei bin ich auf folgendes Problem gestoßen:

Mein Stückchen Quellcode:

Code:
		Hashtable attr = new Hashtable();
		attr.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		attr.put(Context.PROVIDER_URL, "jnp://localhost:1099");

		InitialContext ic = new InitialContext(attr);
		
		Enumeration names = ic.list("");
		while(names.hasMoreElements()) {
			NameClassPair name = (NameClassPair)names.nextElement();
			System.out.println(name);
		}

funktioniert wunderbar auf meinen lokalen Rechner (also lokal gestartet und zur lokalen jBoss-Instanz verbunden).

Versuche ich das nun mit einem Remote-jBoss:

Code:
		Hashtable attr = new Hashtable();
		attr.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		attr.put(Context.PROVIDER_URL, "jnp://192.168.1.3:1099");

		InitialContext ic = new InitialContext(attr);
		
		Enumeration names = ic.list("");
		while(names.hasMoreElements()) {
			NameClassPair name = (NameClassPair)names.nextElement();
			System.out.println(name);
		}

kriege ich folgende Exception:

Exception in thread "main" javax.naming.CommunicationException [Root exception is java.rmi.NoSuchObjectException: no such object in table]
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:722)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at de.tutorials.JBossRMIConnectorExampleModified.main(JBossRMIConnectorExampleModified.java:27)
Caused by: java.rmi.NoSuchObjectException: no such object in table
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625)
... 3 more

seltsamerweise kriege ich, wenn ich den lokalen jBoss runterfahre und die Verbindung aus einem normalen kleinen Java-Client teste, noch eine andere Exception:

Exception in thread "main" javax.naming.CommunicationException [Root exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.2; nested exception is:
java.net.ConnectException: Connection refused]
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:722)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at de.tutorials.JBossRMIConnectorExampleModified.main(JBossRMIConnectorExampleModified.java:27)
Caused by: java.rmi.ConnectException: Connection refused to host: 127.0.0.2; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625)
... 3 more
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:516)
at java.net.Socket.connect(Socket.java:466)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:179)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569)
... 8 more

Ich habe den jBoss von meinem lokalen Rechner 1 zu 1 auf den entfernten Rechner kopiert (die Rechner stehen beide im selben Lan ... können sich also gegenseitig ohne Probleme erreichen) ...
Führe ich dort meinen Code aus passiert das gleiche analog ... Zugriff auf den dort lokal laufenden jBoss funktioniert, Zugriff auf den Remote nicht ...

Ich habe versucht ob es was bringt, in der conf/jboss-service.xml die
<attribute name="BindAddress">${jboss.bind.address}</attribute>
auf
<attribute name="BindAddress"></attribute>
zu setzen, aber da gabs gar keine Änderungen.

Wenn ich versuche eine Verbindung mit Twiddle aufzubauen bekomme ich die gleichen Exceptions ...

An einem Firewall kanns nicht liegen, die sind deaktiviert ...
Ich kann mir nur noch vorstellen, dass das irgendeine jBoss-Konfigurationsgeschichte ist.

Kann mir da irgendwer weiter helfen und mir sagen, wo ich was einstellen muss, um remote auf einen jBoss zugreifen zu können!?

btw: Zugriff über die JMX-Console bringt an der Stelle nichts, da ich ja meine eigene Klasse mit dem JMX-Interface des jBoss verbinden will ...

Ich wäre für Tips und Hilfe dankbar!

Grüße
Steffen
 
Hallo!

Hat der andere Rechner 2 Netzwerkkarten? An welchem netzwerk-Interface lauscht der JBoss auf Verbindungen (Auf dem Loop-back oder dem "externen" Netzwerkadapter?)?

Gruß Tom
 
Hi,

dein Hinweis hat mich nochmal ein wenig testen lassen ...
Es liegt natürlich an dem Host-Binding ...
Per default lauscht der jBoss auf 0.0.0.0
2006-11-10 15:05:40,635 DEBUG [org.jboss.web.WebServer] Started server: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=8083]
2006-11-10 15:05:40,638 DEBUG [org.jboss.web.WebService] Started WebServer with address: 0.0.0.0:8083
2006-11-10 15:05:40,663 DEBUG [org.jboss.naming.NamingService] Creating NamingServer stub, theServer=org.jnp.server.NamingServer@18c3679,rmiPort=1098,clientSocketFactory=null,serverSocketFactory=org.jboss.net.sockets.DefaultSocketFactory@fbc4815d[bindAddress=/0.0.0.0]
2006-11-10 15:05:40,682 DEBUG [org.jboss.naming.NamingService] NamingServer stub: org.jnp.server.NamingServer_Stub[RemoteStub [ref: [endpoint:[127.0.0.1:1098,org.jboss.net.sockets.DefaultSocketFactory@fbc4815d[bindAddress=/0.0.0.0]](local),objID:[0]]]]
2006-11-10 15:05:40,731 DEBUG [org.jboss.naming.NamingService] JNDI bootstrap JNP=/0.0.0.0:1099, RMI=/0.0.0.0:1098, backlog=50, no client SocketFactory, Server SocketFactory=org.jboss.net.sockets.DefaultSocketFactory@fbc4815d[bindAddress=/0.0.0.0]
2006-11-10 15:05:41,051 DEBUG [org.jboss.invocation.jrmp.server.JRMPInvoker] Server SocketFactory='org.jboss.net.sockets.DefaultSocketFactory@fbc4815d[bindAddress=/0.0.0.0]'
2006-11-10 15:05:41,051 DEBUG [org.jboss.invocation.jrmp.server.JRMPInvoker] Server SocketAddr='0.0.0.0'
2006-11-10 15:05:53,603 INFO [org.apache.coyote.http11.Http11BaseProtocol] Initializing Coyote HTTP/1.1 on http-0.0.0.0-8080
2006-11-10 15:05:59,852 DEBUG [org.jboss.system.ServiceConfigurator] BindAddress set to 0.0.0.0 in jboss.mq:service=InvocationLayer,type=UIL2
2006-11-10 15:06:05,228 INFO [org.jboss.mq.il.uil2.UILServerILService] JBossMQ UIL service available at : /0.0.0.0:8093
2006-11-10 15:06:08,920 INFO [org.apache.coyote.http11.Http11BaseProtocol] Starting Coyote HTTP/1.1 on http-0.0.0.0-8080
2006-11-10 15:06:09,173 INFO [org.apache.jk.common.ChannelSocket] JK: ajp13 listening on /0.0.0.0:8009
seltsamerweise lässt er damit aber unter linux keine Verbindungen über das externe Interface zu ...
Allerdings funktioniert es in dieser default-config unter Windows!

Wenn ich den bind-host auf die externe IP ändere:
jboss/bin/run.sh -b "192.168.1.3"
kann man von "draußen" zugreifen, dann funktioniert aber kein Zugriff vom localhost mehr ...

Wenn ich den bind-host leer lasse, lauscht er auf "null" und kann gar nicht mehr angesprochen werden.
jboss/bin/run.sh -b ""
(obwohl in den Kommentaren in der jboss-service.xml steht, wenn man den Bind-Host leer lässt, lauscht jboss auf allen interfaces ... möglicherweise habe ich das falsche Bindung in der config leer gelassen)

Zum Erfolg (also das jBoss auf localhost und auf der externen Schnittstelle lauscht) hat mich dieser Aufruf gebracht:
jboss/bin/run.sh -b "0.0.0.0"
Damit lauscht jBoss anscheinend auf allen Interfaces und akzeptiert auch Verbindungen.

Muss heute abend dann mal testen, ob meine MBeans so auch funktionieren :).

Gruß
Steffen
 

Neue Beiträge

Zurück