java进程等待时间_在Java 6中实现进程“等待”(长超时,时间单位)

我正在研究一个遗留的(Java 6/7)项目,它使用

ProcessBuilder

以操作系统不可知的方式从机器请求uuid。我想用

Process.waitFor(long timeout, TimeUnit unit)

方法从

Java 8

,但这不是在Java 6中实现的。相反,我可以用

waitFor()

,它将阻塞直到完成或出错。

如果可能的话,我希望避免将Java版本升级到8,因为这就需要进行很多其他的更改(例如,迁移代码从删除的内部API和升级生产Tomcat服务器)。

如何在超时的情况下最好地实现用于执行进程的代码?我正在考虑以某种方式实现一个时间表,检查进程是否仍在运行,如果进程仍在运行,则取消/销毁它,并且已达到超时时间。

我的当前(Java 8)代码看起来像这样:

/** USE WMIC on Windows */

private static String getSystemProductUUID() {

String uuid = null;

String line;

List cmd = new ArrayList() {{

add("WMIC.exe"); add("csproduct"); add("get"); add("UUID");

}};

BufferedReader br = null;

Process p = null;

SimpleLogger.debug("Attempting to retrieve Windows System UUID through WMIC ...");

try {

ProcessBuilder pb = new ProcessBuilder().directory(getExecDir());

p = pb.command(cmd).start();

if (!p.waitFor(TIMEOUT, SECONDS)) { // No timeout in Java 6

throw new IOException("Timeout reached while waiting for UUID from WMIC!");

}

br = new BufferedReader(new InputStreamReader(p.getInputStream()));

while ((line = br.readLine()) != null) {

if (null != line) {

line = line.replace("\t", "").replace(" ", "");

if (!line.isEmpty() && !line.equalsIgnoreCase("UUID")) {

uuid = line.replace("-", "");

}

}

}

} catch (IOException | InterruptedException ex) {

uuid = null;

SimpleLogger.error(

"Failed to retrieve machine UUID from WMIC!" + SimpleLogger.getPrependedStackTrace(ex)

);

// ex.printStackTrace(System.err);

} finally {

if (null != br) {

try {

br.close();

} catch (IOException ex) {

SimpleLogger.warn(

"Failed to close buffered reader while retrieving machine UUID!"

);

}

if (null != p) {

p.destroy();

}

}

}

return uuid;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过使用JDBC API的Statement接口的getQueryTimeout()方法来获取JDBC查询执行所在的SQL进程ID。查询超时时间是指JDBC查询在等待响应时的最时间。在等待超时时,查询将自动终止,并且对应的SQL进程ID将被释放。以下是一个示例代码: ```java import java.sql.*; public class SQLProcessID { public static void main(String[] args) { String url = "jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks"; String user = "myUserName"; String password = "myPassword"; String query = "SELECT * FROM Sales.SalesOrderHeader"; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement()) { // 设置查询超时时间 stmt.setQueryTimeout(30); // 设置30秒超时 // 执行查询 ResultSet rs = stmt.executeQuery(query); ResultSetMetaData md = rs.getMetaData(); // 获取SQL进程ID int processId = ((SQLServerStatement) stmt).getProcessID(); System.out.println("SQL进程ID:" + processId); // 处理结果集 while (rs.next()) { for (int i = 1; i <= md.getColumnCount(); i++) { System.out.print(rs.getString(i) + "\t"); } System.out.println(); } rs.close(); } catch (SQLException e) { System.out.println("Error message: " + e.getMessage()); System.out.println("Error code: " + e.getErrorCode()); System.out.println("SQL state: " + e.getSQLState()); } } } ``` 在上面的示例,我们通过使用JDBC API连接到SQL Server,并使用Statement接口的setQueryTimeout()方法设置查询超时时间。然后,我们执行查询,并从结果集获取ResultSetMetaData。最后,我们使用SQLServerStatement接口的getProcessID()方法获取查询执行所在的SQL进程ID。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值