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.