[java] Include retries mechanism when executing SM from Java
diff --git a/java/src/org/openqa/selenium/manager/SeleniumManager.java b/java/src/org/openqa/selenium/manager/SeleniumManager.java
index 55e9302..ea2a214 100644
--- a/java/src/org/openqa/selenium/manager/SeleniumManager.java
+++ b/java/src/org/openqa/selenium/manager/SeleniumManager.java
@@ -66,6 +66,8 @@ public class SeleniumManager {
private static final String CACHE_PATH_ENV = "SE_CACHE_PATH";
private static final String BETA_PREFIX = "0.";
private static final String EXE = ".exe";
+ private static final int RUN_COMMAND_RETRIES = 3;
+ private static final int RUN_COMMAND_POLL_TIME_SEC = 3;
private static volatile SeleniumManager manager;
private final String managerPath = System.getenv("SE_MANAGER_PATH");
@@ -118,21 +120,37 @@ public static SeleniumManager getInstance() {
private static Result runCommand(Path binary, List<String> arguments) {
LOG.fine(String.format("Executing Process: %s", arguments));
- String output;
- int code;
- try {
- arguments.add(0, binary.toAbsolutePath().toString());
- Process process = new ProcessBuilder(arguments).redirectErrorStream(true).start();
- if (!process.waitFor(1, TimeUnit.HOURS)) {
- LOG.warning("Selenium Manager did not exit, shutting it down");
- process.destroy();
+ String output = null;
+ int code = 0;
+ int retryCount = 0;
+ arguments.add(0, binary.toAbsolutePath().toString());
+ while (retryCount < RUN_COMMAND_RETRIES) {
+ try {
+ Process process = new ProcessBuilder(arguments).redirectErrorStream(true).start();
+ if (!process.waitFor(1, TimeUnit.HOURS)) {
+ LOG.warning("Selenium Manager did not exit, shutting it down");
+ process.destroy();
+ }
+ code = process.exitValue();
+ output = new String(process.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
+ break; // Break out of the retry loop on success
+ } catch (Exception e) {
+ retryCount++;
+ if (retryCount >= RUN_COMMAND_RETRIES) {
+ throw new WebDriverException(
+ "Failed to run command after " + retryCount + " retries: " + arguments, e);
+ }
+ LOG.fine(
+ String.format(
+ "Failed to run command, retrying in %d seconds", RUN_COMMAND_POLL_TIME_SEC));
+ try {
+ Thread.sleep(TimeUnit.SECONDS.toMillis(RUN_COMMAND_POLL_TIME_SEC));
+ } catch (InterruptedException ex) {
+ // Ignored
+ }
}
- code = process.exitValue();
- output = new String(process.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
-
- } catch (Exception e) {
- throw new WebDriverException("Failed to run command: " + arguments, e);
}
+
SeleniumManagerOutput jsonOutput = null;
JsonException failedToParse = null;
String dump = output;