Aplicação (console) funcionando como serviço do windows/linux

BOm dia amigos,

Estou com uma dúvida… Tenho uma aplicação console que gostaria que ficasse funcionando no background do SO e a cada 5 minutos disparasse algo. Fiz assim:

Classe Executável

public class meu_aplicativo {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        MinhaThread t = new MinhaThread();
        t.run();
    }
}

MinhaThread

public class MinhaThread implements Runnable {
    
    @Override
    public void run() {
        
        while (true) {

            System.out.println("Entrei");
            
            try {
                Thread.sleep(300000);
            } catch(InterruptedException e) {}
        }
    }    
}

Como nunca tinha feito uma thread, não tenho certeza se está correta… Mas enfim, a minha dúvida é saber se há como eu deixar isto rodando como um serviços do windows e do linux, pois terei esta aplicação rodando num windows e em um linux.

Antes que alguém peça para eu descrever o que eu entendo como um serviço, adianto-me explicando que preciso fazer a app aparecer no services.msc do windows e que eu possa iniciar/pará-la e no caso do linux, que ele fique lá no /etc/init.d e que eu possa fazer o status | start | stop.

No caso do linux, consigo criar o script para funcionar ocmo serviço, só não saberia como pará-lo. Até penso que poderia fazer um meuApp -stop e ele para… mas não sei como faria isto em java…

Obrigado…

Dá pra deixar rodando sim, basta criar a rotina para o start, o stop e o status e coloca-lo no init.d

Olá André, mas como devo fazer isto? Ou melhor, como posso fazer para parar e tal?

Poderia me dar uma luz?

Se você está falando do stop, você pode, por exemplo, usar o método interrupt():

Thread.currentThread().interrupt();

Sugiro que dê uma lida:
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html

Ok, a minha dúvida será como eu vou saber que o cara deu um comando de parada. Por exemplo:

O que devo implementar para que eu perceba que o usuário mandou parar? É isto que não estou entendendo… Que evento (ou que interação) deverei ficar ouvindo para dar o interrupt na thread?

[quote=libajunior]Ok, a minha dúvida será como eu vou saber que o cara deu um comando de parada. Por exemplo:

O que devo implementar para que eu perceba que o usuário mandou parar? É isto que não estou entendendo… Que evento (ou que interação) deverei ficar ouvindo para dar o interrupt na thread?[/quote]

Você acessa o argumento do usuário através do segundo elemento do args[], no caso seria args[1]. Daí basta comparar. Por exemplo:

if (args[1].equals("stop")) { Thread.currentThread().interrupt(); }

Para isso utiliza-se alguma técnica de comunicação entre processos, tipo:

  • socket de rede
  • gravação em arquivo
  • algumas coisas de mais baixo nível que eu não entendo, como shared memory, pipes, etc

Em Java o jeito mais simples e elegante de fazer é utilizando sockets. O aplicativo principal escutaria em uma porta reservada especialmente para comandos de controle, e o “parador” conecta nessa porta e envia um sinal.
Também é possível implementar outros comandos nesse protocolo, como status do serviço, estatisticas, etc.

Bom dia Gomes, segui o teu conselho… fiz isto utilizando socket…deu certo…

Obrigado!

Depois de tudo prontinho, coloco aqui como ficou minha solução.

Obrigado a todos pela ajuda.