Avatar billede jannek_ek Nybegynder
11. oktober 2007 - 00:47 Der er 12 kommentarer og
1 løsning

brug taskkill igennem runtime

jeg er ikke alt for skarp til at bruge runtime i java, men jeg har lavet et program, der starter rmirgistry via min applikation, og derefter opretter en rmi server. alt dette går efter planen, men når programmet er slut, kan jeg ikke finde ud af at lukke rmiregistry igen.

min kode:
    public void run()
    {
        Runtime rt = Runtime.getRuntime();
        Process p;
       
        try
        {
            p = rt.exec("rmiregistry");
            System.out.println("rmiRegistry startes");
            p.waitFor();
           
        } catch (Exception e)
        {
            try
            {
                p = rt.exec("taskkill", new String[] {"/IM", "rmiregistry.exe"});
                System.out.println("rmiRegistry lukkes!");
                p.waitFor(); // ------- linie 55 -------
               
            } catch (Exception f)
            {
                System.out.println("rmiRegistry blev ikke lukket!");
                f.printStackTrace();
            }
            System.out.println("Serveren lukkes");
            System.exit(0);
            e.printStackTrace();
        }
    }

Først oprettes rmiregistry
når klienten er færdig, kaldes interrupt() på tråden, så der sker en fejl.
når "fejlen" er sket burde den lukke rmiregistry.

Jeg har også prøvet med
p = rt.exec("taskkill /IM rmiregistry.exe"});

Mit output er
rmiRegistry lukkes!
rmiRegistry blev ikke lukket!
java.lang.InterruptedException
        at java.lang.ProcessImpl.waitFor(Native Method)
        at Main.run(Main.java:55)
        at java.lang.Thread.run(Thread.java:619)
Serveren lukkes
Avatar billede arne_v Ekspert
11. oktober 2007 - 02:03 #1
Virker det med /F ?
Avatar billede arne_v Ekspert
11. oktober 2007 - 02:04 #2
Men jeg tror at det vil være både nemmere og pænere at hoste RMIRegistry i din
RMI server process.
Avatar billede jakoba Nybegynder
11. oktober 2007 - 07:58 #3
p.waitFor() afventer en programgenereret respons fra rmiRegistry.

Når du så tværer rmiRegistry programmet ud med en taskKill får den istedet en interrupt "det program du venter på er ophørt med at eksistere" eller noget lignende.

Og det er så også hvad din stacktrace siger. Fejler er at du ser det som en fejl ;-))
Avatar billede jannek_ek Nybegynder
11. oktober 2007 - 12:22 #4
jeg kan så på joblisten at rmireqistry ikke stopper. og taskkill /IM rmiregistry.exe virker fint hvis det køres direkte fra cmd.

hvordan kan jeg hoste min RMIRegistry i min applikation uden at forbinde til runtime?
Avatar billede arne_v Ekspert
11. oktober 2007 - 16:37 #5
Eksempel:

        // start registry
        LocateRegistry.createRegistry(60000);
        // bind server objekt
        Naming.rebind("rmi://localhost:60000/MyServer", new MyServerImpl());
Avatar billede jannek_ek Nybegynder
11. oktober 2007 - 21:08 #6
det virker til dels ... jeg kan sagtens oprette en server, og kontakte den, men den laver en:
Exception in thread "Thread-1" java.lang.AbstractMethodError: Main_Stub.forlad()V
        at Klient.run(Klient.java:26)

på linie 26 kaldes metoden forlad

public class Main extends UnicastRemoteObject implements Metoder
{
    public Main() throws RemoteException
    {
       
    }
   
    public double beregn()
    {
        return Math.sqrt(Math.pow((new Double(JOptionPane.showInputDialog("katete a"))).doubleValue(), 2) + Math.pow((new Double(JOptionPane.showInputDialog("katete b"))).doubleValue(), 2));
    }
   
    public void forlad() // klienten crasher når denne metode kaldes
    {
        System.out.println("Brugeren lukkede");
    }
   
    public static void main(String[] args)
    {
        try
        {
            (new Klient()).start(); // venter med at connecte indtil serveren er oprettet
           
            LocateRegistry.createRegistry(8001);
           
            System.out.println("Serveren startes");
            Naming.rebind("rmi://localhost:8001/metoder", (Metoder) new Main());
        } catch (Exception e)
        {
            System.out.println("Server fejl");
            e.printStackTrace();
        }
    }
   
}
Avatar billede jannek_ek Nybegynder
11. oktober 2007 - 21:10 #7
det virker dog fint når jeg manuelt bruger rmic Main i det byggede projekt. Så tror at det er den rmi stub som netBeans laver, der ikke virker optimalt
Avatar billede jannek_ek Nybegynder
11. oktober 2007 - 21:11 #8
Glemte at sige at metoden beregn(...) fint kan kaldes fra klienten
Avatar billede arne_v Ekspert
14. oktober 2007 - 03:08 #9
Med en nyere Java behøver du ikke lave stub overhovedet.
Avatar billede jannek_ek Nybegynder
31. oktober 2007 - 15:17 #10
har haft travlt med skolen på det sidste, men nu er jeg her igen.

Min java version hedder 1.6.0_01, så jeg forstår ikke hvorfor der bliver lavet stub når jeg ikke beder om det, men uanset hvad, så tror jeg ikke det er der fejlen ligger, da jeg sagtens kan kører programmet, oprette forbindelse, og bruge metoden beregn. det er først når metoden forlad kaldes, at den brokker sig, med fejlen:

Exception in thread "Thread-1" java.lang.AbstractMethodError: Main_Stub.forlad()V
        at Klient.run(Klient.java:26)

Derfor tror jeg ikke fejlen er direkte rmi-baseret

Metoden forlad:
    public void forlad()
    {
        System.out.println("Brugeren lukkede");
    }

koden i klienten:
        try
        {
            Metoder m = (Metoder) Naming.lookup("rmi://kaizer.zapto.org:8001/metoder");
            System.out.println(m.beregn());
            System.out.println(m.beregn());
            m.forlad(); // - linie 26 - klienten laver fejl, inden metoden gennemføres
            System.out.println(m.beregn());
           
        } catch (Exception e)
        {
            System.out.println("Klient!");
            e.printStackTrace();
        }
Avatar billede arne_v Ekspert
12. november 2007 - 03:08 #11
java.lang
Class AbstractMethodError

java.lang.Object
  extended by java.lang.Throwable
      extended by java.lang.Error
          extended by java.lang.LinkageError
              extended by java.lang.IncompatibleClassChangeError
                  extended by java.lang.AbstractMethodError

All Implemented Interfaces:
    Serializable

public class AbstractMethodError
extends IncompatibleClassChangeError

Thrown when an application tries to call an abstract method. Normally, this error is caught by the compiler; this error can only occur at run time if the definition of some class has incompatibly changed since the currently executing method was last compiled.
Avatar billede jannek_ek Nybegynder
12. november 2007 - 21:19 #12
Nådada ... Det var tilsyneladende der fejlen lå ... jeg slettede alt der var kompileret, og kompilerede interfacet først, og derefter selve programmet, og nu virker det.

Den havde jeg ikke gættet selv, men mange tak for hjælpen, og smid et svar.
Avatar billede arne_v Ekspert
12. november 2007 - 21:32 #13
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester