tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
648
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Zilchinger
    Zilchinger Zilchinger ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    75
    Hi,
    mal ne Frage zur RMIRegistry. Ich habe zwei Methoden, die einmal einen Serverstart und einen Serverstop wiederspiegeln.

    das Starten mache ich so:


    Code :
    1
    2
    
    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.
     
    Viele Grüße,
    Zilchinger www.zilchinger.de

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    /**
     * 
     */
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    /**
     * 
     */
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    /**
     * 
     */
    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
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    Avatar von Zilchinger
    Zilchinger Zilchinger ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    75
    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.
     
    Viele Grüße,
    Zilchinger www.zilchinger.de

Ähnliche Themen

  1. JNDI über RMIRegistry
    Von Thomas Darimont im Forum Java
    Antworten: 0
    Letzter Beitrag: 07.12.04, 18:41