java - netbeans java 检查本地服务是否正在运行

标签 java mysql

我有 n 个连接到 MYSQL 的 Netbeans Java 项目,用于从我的数据库读取数据。

但是MYSQL服务没有运行,我必须手动启动它。 我可以在我的代码中启动此服务吗? Windows Services

最佳答案

此解决方案特定于 Windows,并假设 MySQL 服务名称为 MySQL80(如屏幕截图所示)。如果 MySQL 服务不是从 Windows 中的 Java 运行,则启动它:

  • 创建一个 BAT 文件,仅包含 NET START MySQL80
  • 创建该 BAT 文件的快捷方式。在 Windows 文件资源管理器中显示该快捷方式的属性,单击快捷方式选项卡,单击高级...按钮,然后选中以管理员身份运行> 框:

    asAdmin

  • 运行如下所示的 Java 应用程序,它将:

    • 通过解析命令 sc query MySQL80 返回的输出来检查 MySQL80 服务的状态。请参阅下面代码中的方法 getServiceState()
    • 如果服务未运行(因为 getServiceState() 返回“已停止”),请运行 BAT 文件的快捷方式(以管理员身份)来启动服务。请参阅下面代码中的方法 startService(),并根据需要设置 String shortcut 的值。
    • 如果服务已在运行(getServiceState() 返回“RUNNING”),或者服务名称无法识别,则代码不执行任何操作。
    • 如果启动服务时出现问题,则会显示错误流。

这是代码:

package servicestarter;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ServiceStarter {

public static void main(String[] args) {
    try {
        ServiceStarter ss = new ServiceStarter();
        String serviceName = "MySQL80";
        String serviceStatus = ss.getServiceState(serviceName);

        if ("STOPPED".equals(serviceStatus)) {
            System.out.println("Service " + serviceName + " is stopped. Starting the service...");
            String shortcut = "D:\\temp\\netstartmysql80.bat.lnk";
            Process process = ss.startService(shortcut);
            // Display any error output. Should be nothing there if all goes well...
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

private String getServiceState(String serviceName) throws IOException {
    String state = "";
    Process process = Runtime.getRuntime().exec("cmd.exe /c sc query " + serviceName);
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;

    while ((line = reader.readLine()) != null) {
        if (line.contains("STATE")) {
            String[] tokens = line.split("\\s+");
            state = tokens[tokens.length - 1];
            break;
        }
    }
    reader.close();
    return state; // Returns "STOPPED" or "RUNNING", or empty string for invalid service name.
}

private Process startService(String shortcut) throws IOException {
    return Runtime.getRuntime().exec("cmd.exe /c " + shortcut);
}
}

方法getServiceState()只是解析sc查询MySQL80产生的内容来确定服务的状态(“STATE”):

C:\WINDOWS\system32>sc query MySQL80

SERVICE_NAME: MySQL80
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

注释:

  • 上面的代码适用于我在 Windows 10 上启动名为“MySQL80”的 MySQL 8.0 服务,尽管它应该通过更改 String serviceName 的值来启动任何 STOPPED 服务,以及运行的快捷方式的名称和内容。
  • 此方法有一个可能会破坏交易的问题:因为该服务必须以管理员身份启动,当 BAT 文件运行,询问“您想要允许此应用程序对您的设备进行更改吗?”。您可以通过从以管理员身份运行命令提示符窗口运行应用程序来轻松避免出现该提示,但这对您来说不一定是可行的方法。
  • 这不是一个可靠的解决方案。如果 SC QUERY {service name} 生成的输出发生更改,此代码可能会损坏,但我不知道有 Java API 可以直接查询 Windows 服务。

关于java - netbeans java 检查本地服务是否正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52588402/

相关文章:

java - DataSource.setLoginTimeout 和 DriverManager.setLoginTimeout 全局?

java - 为什么我可以使用 biginteger 变量获取 while 条件的过程

java - 如何在 Java 中有效使用模数运算符

java - 相机关闭虚拟机 - java.lang.RuntimeException : setParameters failed

java - 如何将MIME类型添加到POST请求Java?

Javascript:如何从 mysql 查询中过滤对象数组推送

mysql - 使用触发器更新DATETIME,在MySQL中得到错误1442

PHP/MySQL - 在适当的工作日安排约会

PHP MySQL ORDER BY level DESC LIMIT 1 不适用于所有搜索

java - 未使用PreparedStatement将数据插入到数据库表中