[RESOLVIDO] Thread segurando a aplicação

7 respostas
C

Pessoal, boa tarde!

Devido meu sistema rodar em Windows e Linux, desenvolvi um atualizador para facilitar a vida do usuário quando houver atualizações do sistema.
Como funciona:

O usuário inicia o sistema, insere o usuário e senha e faz login.
Após isso a aplicação verifica se o usuário está usando a versão mais atualizada do sistema.
Se não, o sistema mostra uma mensagem pedindo a atualização. Se usuário clicar no sim, automaticamente o sistema é finalizado, é executado o atualizador e o atualizador faz a instalação/atualização.

É aí que está o "problema": o sistema fica esperando o atualizador terminar o processo de instalação para ser finalizado.

Isso para mim não é nem um pouco interessante, pois não há como o atualizador sobrescrever o JAR do sistema se ele está em execução, esperando o atualizador terminar a instalação.

Abaixo o código que estou usando.

class IniciaAtualizacao implements Runnable{
	public void run() {
		try {
			Runtime.getRuntime().exec( System.getProperty("java.home")+ "/bin/java -jar \"" + System.getProperty("user.dir") + "/atualizador.jar\"");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
private void verificaAtualizacao(){
	Date dataBD = resultado.getDate("dataSistema");
	Date dataES = formatBR.parse(dataVersao);

	if (!dataBD.equals(dataES)) {
			boolean b = Mensagens.mostraConfirmacao(
			"<html>Há uma versão mais atualizada do sistema disponível para download.<br>Isso é ótimo! A cada nova atualização o sistema fica mais rápido,<br>seguro, intuitivo e inteligente.<br>O procedimento de atualização é obrigatório.<br><br>Deseja que o sistema lhe redirecione para o endereço de download<br>da versão mais atualizada, agora?<html>");

		if (b == true) {
			IniciaAtualizacao inicia = new IniciaAtualizacao();
			Thread t = new  Thread(inicia);
			t.start();
			System.exit(0);
		}
	}
}

Procurei material a respeito, mas não achei nada.

Obrigado!

7 Respostas

sephil

Olá,

Não tem como você transformar a instrução de atualização, em um método da sua aplicação?

tipo…

if (b)   
    this.iniciaAtualizacao();

e o método na mesma classe:

private void iniciaAtualizacao {  
        try {  
            Runtime.getRuntime().exec( System.getProperty("java.home")+ "/bin/java -jar \"" + System.getProperty("user.dir") + "/atualizador.jar\"");  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally{
             System.exit(0);
        }
}

E no final dos procedimentos do seu atualizador, ele chamaria uma nova instancia da aplicação.

C

Hmmmmmm… também não funcionou…
=\

Obrigado…

soaresinfo

Troca o /bin/java por /bin/javaw, esse comando inicia a aplicação e retorna imediatamente, iniciando o seu atualizador em um processo separado.

E

O problema do Cartoni é que, no Windows, arquivos .jar que estão sendo lidos ficam “presos” e não podem ser nem renomeados nem sobreescritos. No caso do Linux/Unix, você pode renomear os arquivos e até mesmo apagá-los em alguns casos, já que o Linux/Unix mantém uma referência para os arquivos (via “inodes”) e eles continuam presentes até que os processos que os estão acessando sejam encerrados.

Um modo de quebrar o galho nesse caso é usar um classloader não-padrão (como um URLClassLoader) mas o problema ainda não fica resolvido porque as classes antigas ainda permanecem em memória (o URLClassLoader só tem um método “close” a partir do Java 7).

G

eu faça assim:

um outro app baixa o arquivo e o salva com nomeDoAquivo.ExtensãoAlgoPraDiferenciar

(exemplo: Sistema.jar > Sistema.jar~1)

qdo concluir o download, esse mesmo app verifica se o  nomeDoAquivo.ExtensãoAlgoPraDiferenciar ta em uso;

caso não renomeia substituindo o  nomeDoAquivo.ExtensãoAlgoPraDiferenciar pra  nomeDoAquivo.Extensão;

caso sim renomeia usando a API MoveEx q tem um parametro UntilReboot, q é  mandar reiniciar o pc q ja volta atualizado;
C

É exatamente isso entanglement.
Vou continuar quebrando a cabeça, aqui.
Qualquer novidade eu posto pra vc’s.

Obrigado.

C

Pessoal, agora, aparentemente, tudo deu certo.
Não fiz nenhuma grande alteração.

O problema que relatei no tópico, que o sistema fica esperando o processo atualizador terminar, ocorre apenas no Eclipse.
Rodando o sistema “normalmente” esse engasgo não acontece. Assim que a pessoa clica no ‘Sim’ o sistema fecha, o atualizar inicia e atualiza o sistema.

Então fica a dica: às vezes no ambiente de desenvolvimento o processo é interpretado de um jeito e na execução de outro.

Obrigado a todos.
Abraço!

Criado 9 de abril de 2012
Ultima resposta 12 de abr. de 2012
Respostas 7
Participantes 5