[JAVA] Hoe een java applicatie stoppen vanaf command line?

Pagina: 1
Acties:
  • 229 views sinds 30-01-2008
  • Reageer

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 23-04 09:54
Ondertussen heb ik al flink zitten Googlen en ook de search op dit forum gebruikt maar ik kan geen oplossing vinden voor het volgende.

Ik heb een java class die een applicatie opstart.
Deze class heeft een Main die wordt aangeroepen.

In windows doe ik dit gewoon in een Dos box waarna het programma draait.

Nu wil ik dit programma echter ook weer netjes afsluiten.
Natuurlijk kan ik de dos box dicht gooien maar kan ik ook een eigen java class gebruiken die commando's geeft aan mijn class?
Of kan ik gewoon via een command line een commando geven zodat mijn java applicatie netjes stopt?

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 16-04 11:36

pjvandesande

GC.Collect(head);

Gewoon je Main laten returnen? :?

  • Denker
  • Registratie: Maart 2003
  • Laatst online: 07-04 10:37
Zoals questa zegt, een return statement in je main-methode. Of een System.exit(0); werkte toch ook?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je kunt je applicatie naar de commandline laten luisteren mbv de System.in. Je bent dan wel een aparte thread nodig die een readLine uitvoert (die blokkeerd als er geen commando`s binnenkomen). Deze thread die zou een statusvlag kunnen zetten waardoor de hoofdthread kan besluiten om ermee te stoppen.

Je zou ook kunnen werken met RMI. Je maakt een afsluit-applicatie die via rmi contactopneemt met de hoofdapplicatie.

[ Voor 17% gewijzigd door Alarmnummer op 29-11-2005 13:18 ]


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 23-04 09:54
@questa, @Denker:

Wat jullie met 'main' returnen bedoelen snap ik even niet.
Met een batch file start ik de main van mijn java class.
Deze blijft vervolgens draaien.
Deze class start wel een andere java class op die als RMI server draait.

Het idee van 'Alarmnummer' gaat niet werken omdat de class die het geheel aan het rollen brengt zelf niks met RMI te maken heeft.
Dan moet ik het een en ander gaan aanpassen, wat overblijft als ik geen simpelere methode kan vinden.

De class die het geheel start ziet er zo uit:

Java:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class ProductManagerServer {

    static Logger log = Logger.getLogger("ProductManagerServer");

    public ProductManagerServer()
    {
        super();
    }

    public static void main(String[] args) {

        System.out.println("Starting ProductManagerServer - Version 1.0 ");
        log.info("\n\n");
        log.info(" -- Starting ProductManagerServer - Version 1.0 -- ");

        // Properties file
        final String PROPFILE= "jc_se_rmi.properties";

        // Create and install a security manager
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }

        log.debug( "Load properties file: "+PROPFILE );
        Properties props = loadProperties(PROPFILE);

        /* Register new DataSource */
        log.debug( "Try registering the DataSource connection.");
        DSConnectionPoolFactory dscf = new DSConnectionPoolFactory(props);
        dscf.createMySQLDataSourceJNDI();

        /* Register ProductManager  */
        try {
            // Instantiate.
            log.debug( "Constructing a ProductManagerImpl");
            ProductManagerImpl impl = new ProductManagerImpl(PROPFILE);

            // Bind into the registry using the java.rmi.Naming API.
            log.debug("(re)binding it");
            Naming.rebind ("//"+props.getProperty("rmi.host")+":"+props.getProperty("rmi.port")+"/"+props.getProperty("rmi.servicename"), impl);
            log.debug("ProductManagerImpl ready and waiting on clients");
        } catch (RemoteException re) {
            log.error(re);
        } catch (MalformedURLException mue) {
            log.error(mue);
        }
    }

    private static Properties loadProperties(String fileName) {

        InputStream propsFile;
        Properties tempProp = new Properties();

        try {
            propsFile = new FileInputStream(fileName);
            tempProp.load(propsFile);
            propsFile.close();
        } catch (IOException ioe) {
            log.error("I/O Exception.");
            log.error( ioe.getMessage() );
            System.exit(0);
        }
        return tempProp;
    }
}

[ Voor 7% gewijzigd door rvrbtcpt op 29-11-2005 13:26 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Frijns.Net schreef op dinsdag 29 november 2005 @ 13:24:
@questa, @Denker:

Wat jullie met 'main' returnen bedoelen snap ik even niet.
Met een batch file start ik de main van mijn java class.
Deze blijft vervolgens draaien.
Deze class start wel een andere java class op die als RMI server draait.

Het idee van 'Alarmnummer' gaat niet werken omdat de class die het geheel aan het rollen brengt zelf niks met RMI te maken heeft.
Ja und? Dat hoeft geen enkel probleem op te leveren. Als jij stop functionaliteit kunt aanbieden op jouw hoofdobject dan kan je zo een RMI-wrapper om dat object heen plaatsen.
Dan moet ik het een en ander gaan aanpassen, wat overblijft als ik geen simpelere methode kan vinden.
Als jouw systeem goed gestopt kan worden dan is het zo gedaan.

Kladje
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface StopService{
   void stop()throws RemoteException;
}

class StopServiceImpl implements StopService{
    
    ProductManagerServer _server;

    public StopServiceImpl(ProductManagerServer  server){
           _server = server;
    }

    void stop(){
           _server.stop();
    }
}


Je kunt dan via een RMI-client bij de StopService komen en de server stoppen.

[ Voor 9% gewijzigd door Alarmnummer op 29-11-2005 13:36 ]

Pagina: 1