Bom dia, criei uma aplicação que ao executada ela entra em loop infinito e fica chamando uma thread que dispara uma ação. Implementei nesta aplicação uma comunicação com sockets que irá permitir que uma aplicação cliente inicie, pare e pegue o status desta thread. A ideia é que eu possa ter uma aplicação cliente gerenciando esta thread (a aplicação principal sempre ficará rodando, mas a thread poderá ser finalizada e iniciado quando o usuário desejar - como nos serviços do windows).
O Iniciar e Status estão funcionando perfeitamente, mas o problema está no parar o funcionamento da thread. Ao disparar o comando thread.interrupt() ele dá um erro e derruba toda minha aplicação.
O erro que etá dando é:java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at thread.ProcessaEmailThread.run(ProcessaEmailThread.java:28)
Java Result: 1
public class EmailService {
public static void main(String[] args) {
int portaJOB = 7278;
Logger.setHeader("1.0.120608 BETA", portaJOB);
try {
JOBThread job = new JOBThread(portaJOB);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
public class JOBThread implements Runnable {
private ServerSocket serv;
private ProcessaEmailThread procThread;
private int porta;
public JOBThread(int porta) throws Exception{
this.porta = porta;
this.serv = new ServerSocket(this.porta);
this.procThread = new ProcessaEmailThread();
new Thread(this).start();
}
@Override
public void run() {
try {
while(true){
new SocketJOB(serv.accept(), this.procThread).start();
}
}catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
class SocketJOB extends Thread {
private Socket client;
private ProcessaEmailThread thread;
public SocketJOB(Socket s, ProcessaEmailThread pt) {
client = s;
thread = pt;
}
private String getStatus(ProcessaEmailThread pthread) {
if (pthread.getState() == Thread.State.RUNNABLE) {
return Consts.RUNNABLE;
} else if (pthread.getState() == Thread.State.TERMINATED) {
return Consts.TERMINATED;
} else if (pthread.getState() == Thread.State.NEW) {
return Consts.NEW;
} else if (pthread.getState() == Thread.State.BLOCKED) {
return Consts.BLOCKED;
} else if (pthread.getState() == Thread.State.TIMED_WAITING) {
return Consts.TIMED_WAITING;
} else {
return Consts.WAITING;
}
}
public void run() {
String retServer = "";
try {
Logger.setLog("Conectado ao Cliente");
//Cria uma stream de entrada de dados para receber o arquivos
DataOutputStream ostream = new DataOutputStream(client.getOutputStream());
DataInputStream istream = new DataInputStream(client.getInputStream());
String inJson = istream.readUTF();
Logger.setLog("Recebendo JSON pela porta "+ client.getPort());
JSONObject jsonIn = new JSONObject(inJson);
Date data = new Date();
SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Logger.setLogNoDate("- App Cliente: "+ jsonIn.getString("client-name"));
Logger.setLogNoDate("- Nome Usuário: "+ jsonIn.getString("username"));
Logger.setLogNoDate("- Horário Envio: "+ jsonIn.getString("dtenviado"));
Logger.setLogNoDate("- Horário Recibido: "+ fmt.format(data));
Logger.setLogNoDate("- Comando: "+ jsonIn.getString("operacao"));
String operation = jsonIn.getString("operacao");
if (operation.equals(Consts.START)) {
Logger.setLog("Iniciando serviço");
thread.start();
retServer = this.getStatus(thread);
} else if (operation.equals(Consts.STOP)) {
Logger.setLog("Parando serviço");
thread.interrupt();
retServer = this.getStatus(thread);
} else if (operation.equals(Consts.RESTART)) {
Logger.setLog("Reiniciando serviço");
thread.interrupt();
thread.start();
retServer = this.getStatus(thread);
} else if (operation.equals(Consts.STATUS)) {
Logger.setLog("Pegando status do serviço");
retServer = this.getStatus(thread);
} else {
Logger.setLog("Operação desconhecida");
retServer = Consts.OPERATION_FAIL;
}
//Retorno para o cliente
JSONObject jsonOut = new JSONObject();
jsonOut.put("dtenviado", jsonIn.getString("dtenviado"));
jsonOut.put("dtrecebido", fmt.format(data));
jsonOut.put("dtexecutado", fmt.format(new Date()));
jsonOut.put("resposta", retServer);
Logger.setLog("Retornando JSON para porta "+ client.getPort());
Logger.setLogNoDate("- Resposta: "+ jsonOut.getString("resposta"));
Logger.setLogNoDate("- Horário Enviado: "+ jsonOut.getString("dtenviado"));
Logger.setLogNoDate("- Horário Recebido: "+ jsonOut.getString("dtrecebido"));
Logger.setLogNoDate("- Horário Executado: "+ jsonOut.getString("dtexecutado"));
ostream.writeUTF(jsonOut.toString());
ostream.flush();
client.close();
} catch(Exception e) {
Logger.setLog("Ocorreu um erro no recebimento da mensagem do servidor: "+ e.getMessage());
System.exit(1);
}
}
}
}
public class ProcessaEmailThread extends Thread {
private int minutos;
@Override
public void run() {
ProcessaEmailAction action = new ProcessaEmailAction();
while (true) {
//Faz a importação
action.run();
try {
//Lê o tempo
this.minutos = Util.getMinutos();
Thread.sleep(this.minutos * 60000);
} catch(InterruptedException e) {
e.printStackTrace();
System.exit(1);
}
}
}
}
Por que será que ao enviar do cliente uma operação de parar (Consts.STOP) meu aplicativo para junto (com erro)?
Obrigado!