protected void connect() { connected = false; int count = 0; while (!connected) { // while try 5 times if (count != 0) { AutomationLogger.getInstance().info("Try to re-connect, time#" + count); } try { connectSession(); connected = true; } catch (ItemNotFoundException infe) { throw infe; } catch (Exception e) { if (count < 5) { AutomationLogger.getInstance().warn("Failed to connect due to " + e); } else { throw new ActionFailedException(e); } count++; Timer.sleep(2000); // sleep 2 seconds before re-connect } } }
/** * execute the given command in the remote host * * @param command * @return - command output in the remote host */ public String exec(String command) { if (!connected) { throw new ActionFailedException("There is no session!"); } StringBuffer data = new StringBuffer(); OutputStream out = null; InputStream in = null; try { Channel channel; boolean channel_connected = false; int count = 0; while (!channel_connected) { try { channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand(command); out = channel.getOutputStream(); in = channel.getInputStream(); channel.connect(); channel_connected = true; } catch (Exception e) { count++; String msg = e.getMessage(); if (count < 5) { AutomationLogger.getInstance() .warn( "Failed to connect to SSH server due to " + msg + ". Will try again in 1 second"); if (msg.startsWith("session is down")) { AutomationLogger.getInstance().info("Try to re-connect session"); connect(); } Timer.sleep(1000); } else { throw new ActionFailedException("Failed to connect to SSH server due to " + e); } } } byte[] buf = new byte[1024]; // read count = 0; while ((count = in.read(buf)) > 0) { data.append(new String(buf, 0, count)); } } catch (Exception e) { AutomationLogger.getInstance().warn(e); } finally { try { in.close(); } catch (Exception e) { } try { out.close(); } catch (Exception e) { } if (channel != null) { channel.disconnect(); } } return data.toString(); }