GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Verificar se minha aplicação está executando

Tags: #<Tag:0x00007fa006e1a660>

Boa Tarde!
Sou iniciante em java e tenho uma aplicação em javafx preciso evitar que o jar seja executado mais de uma vez. Se estiver executando informa o usuário e não executa.
Existe alguma classe faz essa verificação para que possa chamar no metodo main da minha aplicação.
Desde ja agradeço pela ajuda.

Conheço 2 formas para controlar isso:

  • Ao iniciar a aplicação, vc pode criar um arquivo (ex.: .lock) na pasta onde está o jar e verificar se o arquivo existe ao abrir a aplicação, e, qdo a aplicação for encerrada, remover o arquivo. Se existir, significa que a aplicação já está sendo executada.

  • Abrir um socket em uma determinada porta. Ao tentar executar a aplicação com ela já rodando, o sistema irá tentar abrir a msm porta no socket novamente e irá receber um erro, e, com isso, vc pode tratar impedindo a aplicação de ser executada uma segunda vez.

Em relação à ter algo na API para controlar isso, não conheço.

2 Curtidas

Poderia fazer uma verificação dos softwares em memória, para bater o nome do arquivo?

Obrigado pela resposta.
Acho que pela porta seria mais viavel, você não acha?
Seria mais difícil de fazer.

É mais fácil do que gerenciar um arquivo. Só terá problema se por acaso usar alguma porta que possa ser usado por alguma outra aplicação.

Seria uma boa, mas pelo que pesquisei, não achei uma forma nativa para fazer esse tipo de busca. Se tiver, ótimo, senão ai fica um pouco mais zoado de fazer.

É bem fácil de implementar, em 2018 eu postei um exemplo neste post.

Agradeço ao Lucas_Camara e ao staroski pela ajuda.
Vou usar o exemplo do staroski: [RESOLVIDO] Impedir que crie duas instâncias?
Vou adaptar ao javafx
Valeu!

Tentei adaptar o codigo do staroski. Imprediu de executar mais de uma vez só que, queria uma msgbox avisando o usuário que sistema ja esta aberto depois encerrar o programa. só que não está avisando. Alguém me ajuda?
Veja como ficou o código:

package br.com.classes;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.image.Image;
import javafx.stage.Stage;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TelaLogin extends Application {

    private static final int PORTA = 7000;
    private static final int MENSAGEM = 1;
    private static final int RESPOSTA = 1;

    private ServerSocket server;

    private static Stage stage; // aqui é uma janela
           
    public static void main(String[] args) throws Exception {
        TelaLogin programa = new TelaLogin();
        programa.iniciar(args);
    }
    
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("/br/com/telas/TelaLogin.fxml"));                  //Carrega fxml
        Scene scene = new Scene(root);                                                                         //Coloca o fxml em uma cena
        stage.setResizable(false);                                                                            //Desabilita maximizar
        scene.getStylesheets().add(getClass().getResource("/br/com/stylos/TelaLogin.css").toExternalForm()); //Carrega o stylo da Tela
        stage.getIcons().add(new Image(getClass().getResourceAsStream("/br/com/imagens/login.png")));       //Carrega o icone da tela login e troca
        stage.setTitle("Programa executa uma vez Versão 1.0.0");                                           //Coloca o titulo na janela
        stage.setScene(scene);                                                                            //coloca a sena em uma janela
        stage.show();                                                                                    // abre a janela
        setStage(stage);
    }
    //Metodos gets e sets do atributo da tela login
    public static Stage getStage() {
        return stage;
    }

    public static void setStage(Stage stage) {
        TelaLogin.stage = stage;
    }

    public void iniciar(String[] args) throws Exception {
        if (estaExecutando() && focouJanela()) {


            Alert dialogoExe = new Alert(Alert.AlertType.CONFIRMATION);
            ButtonType btnOK = new ButtonType("OK");
            dialogoExe.setTitle("Atenção! Programa executando");
            dialogoExe.setHeaderText("Programa executa uma vez Versão 1.0.0 já está sendo executado");
            dialogoExe.setContentText(null);
            dialogoExe.getButtonTypes().setAll(btnOK);

            System.out.println("Programa ja esta sendo executado");

            System.exit(0);
            return;
        }
        launch(args);
        System.out.println("Programa executado");
    }

    private boolean estaExecutando() {
        try {
            server = new ServerSocket(PORTA);
            return false;
        } catch (IOException e) {
            return true;
        }
    }

    private boolean focouJanela() throws IOException {
        InetAddress localhost = InetAddress.getLocalHost();
        Socket client = new Socket(localhost, PORTA);
        OutputStream output = client.getOutputStream();
        int mensagem = MENSAGEM;
        output.write(mensagem);
        output.flush();
        InputStream input = client.getInputStream();
        int resposta = input.read();
        client.close();
        if (resposta == RESPOSTA) {
            return true;
        }
        return false;
    }
}

Em nenhum lugar você está chamando o dialogoExe.show().

Ficou assim. Grato a todos pela ajuda.

public void iniciar(String[] args) throws Exception {
if (estaExecutando()) {

        Platform.runLater(new Runnable() {
            public void run() {
                Alert dialogoExe = new Alert(Alert.AlertType.CONFIRMATION);
                ButtonType btnOK = new ButtonType("OK");
                dialogoExe.setTitle("Atenção! Programa executando");
                dialogoExe.setHeaderText("Programa executa uma vez Versão 1.0.0 já está sendo executado");
                dialogoExe.setContentText(null);
                dialogoExe.getButtonTypes().setAll(btnOK);

                dialogoExe.showAndWait().ifPresent(b -> {
                    if (b == btnOK) {
                        System.out.println("Programa ja esta sendo executado");
                        System.exit(0);
                        return;
                    }
                });

                }
        });
    }else{
        launch(args);
        System.out.println("Programa executado");
    }

}
1 Curtida
//