[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;