RMI, Spring und IP

Status
Nicht offen für weitere Antworten.

Aeroflare

Mitglied
Hallo!

Ich hab mal wieder eine Frage und hoffe ihr könnt mir helfen :)

Ich verwende RMI zusammen mit dem Springframework, wobei ich das Problem habe, dass ich die IP zur Compilezeit noch nicht kenne. Die IP wird (so wie ich es bisher überall gesehen habe) in der xml direkt gespeichert (und ich glaub nicht, dass ich die xml-Datei zur Laufzeit ändern muss um dynamische IPs zu verwenden :D )

Wie funktioniert sowas genau? Ich hoffe ihr könnt mir helfen:)
 
S

SlaterB

Gast
was ist denn 'die IP'? die vom RMI-Server aus Sicht des Clients?
natürlich muss die irgendwo konfiguriert sein und wenn die dynamisch ist, kann die auch niemand per Zauberhand raten,

oder möchtest du, dass das Programm sie setzt, z.B. nach Eingabe in einem Textfeld oder LookUp zu einer Adresse wie www. google. de?
(ich weiß dann aber nicht unbedingt weiter ;) )
 
S

SlaterB

Gast
wenn ich dann doch mehr als eine Sekunde nachdenke, dann wird die IP doch letzlich im Programm angegeben,
siehe z.B.
Getting Started Using RMI

> obj = (Hello)Naming.lookup("//" + getCodeBase().getHost() + "/HelloServer");
usw.
an der Stelle kann man doch eine beliebige Programmvariable einbinden?
oder welchen Code verwendest du, bei Spring mag ja alles anders sein
 

tfa

Top Contributor
Du kannst die Propertys der Beans auch programmatisch ändern, das ist am einfachsten.
Zum Beispiel:
Java:
ApplicationContext ctx = new ClassPathXmlApplicationContext("clientContext.xml");

RmiProxyFactoryBean r = (RmiProxyFactoryBean) ctx.getBean("&nameServiceBean");
r.setServiceUrl("rmi://127.0.0.1:1099/ServiceName");

MeinService service = (MeinService) r.getObject();

Man beachte das & vor dem Bean-Namen. Das verhindert, dass das RmiProxyFactoryBean gleich das Service-Objekt erzeugt. Es wird vielmehr die Factory selbst zurückgeliefert. Und die kann man dann wie gewünscht umkonfigurieren. In der (statischen) Config muss allerdings schon eine formal gültige URL stehen, sonst gibt es einen Laufzeitfehler.
 

Aeroflare

Mitglied
Du kannst die Propertys der Beans auch programmatisch ändern, das ist am einfachsten.
Zum Beispiel:
Java:
ApplicationContext ctx = new ClassPathXmlApplicationContext("clientContext.xml");

RmiProxyFactoryBean r = (RmiProxyFactoryBean) ctx.getBean("&nameServiceBean");
r.setServiceUrl("rmi://127.0.0.1:1099/ServiceName");

MeinService service = (MeinService) r.getObject();

Man beachte das & vor dem Bean-Namen. Das verhindert, dass das RmiProxyFactoryBean gleich das Service-Objekt erzeugt. Es wird vielmehr die Factory selbst zurückgeliefert. Und die kann man dann wie gewünscht umkonfigurieren. In der (statischen) Config muss allerdings schon eine formal gültige URL stehen, sonst gibt es einen Laufzeitfehler.

Ah, sehr gut! Genau das hab ich gesucht.

Vielen Dank! :)
 

Aeroflare

Mitglied
Ah!! Panik!

Der Code funktioniert nicht! Er greift trotzdem noch auf die IP zu, die in der xml steht. (Der Fehler ist mir erst jetzt aufgefallen, als ich zwei verschiedene Rechner verwendet hab um das zu testen...). Hab das so:

Code:
try{
			ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("rmi-client.xml");
			RmiProxyFactoryBean r = (RmiProxyFactoryBean) ctx.getBean("&remoteMethods");
			r.setServiceUrl("rmi://"+ip+":1099/remoteMethods");
			otherPlayer = (RemoteMethods) r.getObject();
			otherPlayer.setClient(2);
			
			new ClassPathXmlApplicationContext("rmi-server.xml");
		}
catch (BeanCreationException ex){}
sobald er jetzt das zweite Mal den Code aufruft verbindet er sich normal zu sich selbst. Selbst wenn der Server des anderen schon steht kann er sich nicht zu diesem connecten (die BeanCreationException wird auch bereits beim ApplicationContext erstellen geworfen.. :(
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben