Erro ao interromper uma thread

0 respostas
L

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
Minha classe principal está implementada assim:
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();
        }    
    }
}
a classe responsável pela comunicação por sockets está assim:
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);
               
            }
        }
    }
}
e por fim, a thread:
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!

Criado 8 de junho de 2012
Respostas 0
Participantes 1