RMIRegistry

Zilchinger

Mitglied
Hi,
mal ne Frage zur RMIRegistry. Ich habe zwei Methoden, die einmal einen Serverstart und einen Serverstop wiederspiegeln.

das Starten mache ich so:


Code:
registry = LocateRegistry.createRegistry(port);
registry.rebind (SERVER_NAME,this);

Klappt auch.

wenn ich jetzt den Server stoppen will, möchte ich das auch die Registry verschwindet, das tut sie aber nicht! Wenn ich den Server jetzt wieder mit der gleichen Portnummer starten will, kracht es!
Nehme ich eine andere Portnummer gehts!

Wie kann ich das machen? Hab mir schon die API angeschaut, aber leider nix gefunden.
 
Hallo!

Eine Möglichkeit wäre es beispielsweise die Nr. des Betriebssystemprozesses herauszufinden und den Prozess dann mit nativen Mitteln zu killen.

Eine andere Möglichkeit wäre beispielsweise folgende:
Du startest die rmiregistry nicht über die RMIRegsitry.exe sondern du "baust" dir deine eigene. -> Du hast nun Kontrolle über die JVM. Direkt nach der Initialisierung der RMIRegsitry bindest du einen eigenen SHUTDOWN_SERVICE in die Registry. Dieser Shutdown Service bietet die Methode shutdown() an welche nach ein paar Aufräumarbeiten die JVM beendet.
Der ShutdownService kann dann beispielsweise von "priviligierten" Clients aufgerufen werden...

Unser ShutdownService:
Code:
/**
 * 
 */
package de.tutorials.rmi.service;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * @author Tom
 *
 */
public interface IShutdownService extends Remote{
	void shutdown() throws RemoteException;
}

Code:
package de.tutorials.rmi.service.impl;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.Timer;
import java.util.TimerTask;

import javax.rmi.PortableRemoteObject;

import de.tutorials.rmi.service.IShutdownService;

public class ShutdownServiceImpl extends UnicastRemoteObject implements IShutdownService{
	
	public ShutdownServiceImpl() throws RemoteException{
		super();
	};
	
	public void shutdown(){
		new Timer().schedule(new TimerTask(){
			public void run() {
				
				try {
					Registry registry = LocateRegistry.getRegistry();
					String[] services = registry.list();
					for (int i = 0; i < services.length; i++) {
						String service = services[i];
						System.out.println("Unregistering service: " + service);
						try {
							registry.unbind(service);
						} catch (NotBoundException e) {
							e.printStackTrace();
						}
					}
				} catch (RemoteException e) {
					e.printStackTrace();
				}
				
				System.out.println("Halting vm...now!");
				System.exit(0);				
			}
		},5000L);
	}
}

Unser Server:
Code:
/**
 * 
 */
package de.tutorials.rmi;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import de.tutorials.rmi.service.impl.ShutdownServiceImpl;

/**
 * @author Tom
 * 
 */
public class RmiRegistryExtension {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Thread() {
			public void run() {
				try {
					Registry registry = LocateRegistry.createRegistry(1099);
					registry.rebind("SHUTDOWN_SERVICE",
							new ShutdownServiceImpl());
					
					System.out.println("RMI Registry ready for service!");

					while (true) {
						sleep(1000);
					}

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}.start();
	}
}

Unser Client:
Code:
/**
 * 
 */
package de.tutorials.rmi;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import de.tutorials.rmi.service.IShutdownService;

/**
 * @author Tom
 *
 */
public class RemoteShutdownRMIRegistryExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		Registry registry = LocateRegistry.getRegistry();
		IShutdownService shutdownService = (IShutdownService)registry.lookup("SHUTDOWN_SERVICE");
		shutdownService.shutdown();
		System.out.println("Execute remote shutdown of RMIREGISTRY@" + registry.toString());
	}
}

Beispielsitzung:
Server:
RMI Registry ready for service!

Client:
Execute remote shutdown of RMIREGISTRY@RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[192.168.75.98:1099](remote),objID:[0:0:0, 0]]]]

Server:
Unregistering service: SHUTDOWN_SERVICE
Halting vm...now!

Gruß Tom
 
Hi Tom,
danke für das tolle Beispiel, habs soweit kapiert, aber jetzt kommt das nächste problem:

Der Client/Server-Chat funktioniert wunderbar, jedoch nur im LAN!

Wenn ich das ganze übers Internet versuche geht es nicht. Ich habe schon den Router abgeklemmt und alle Firewalls, die ich irgendwie besitze deaktiviert -> kein Erfolg.

Könnte es sein, das ich dafür den RMISecurityManager brauche, den habe ich nämlich weggelassen! Oder braucht man den nur, wenn ich zb Klassen vom Server nachladen will? Das mache ich jedoch nicht.
 
Zurück