@Override public void shutdown() { if (!isLauncherRunning()) { return; } try { // Send a shutdown command to the launcher protocol.sendRequestWithoutResponse(MessageType.MSG_SHUTDOWN, null); } catch (IOException e) { // If launcher has already been shutdown, this shouldn't create an exception, all we want to // do is to make sure the protocol is down } try { // Then shutdown the protocol connection protocol.shutdown(); } catch (IOException e) { throw new OperaRunnerException("Unable to shut down launcher", e); } finally { binary.shutdown(); protocol = null; binary = null; } }
/** * {@inheritDoc} * * @throws OperaRunnerException if launcher is shut down or not running */ @Override public void startOpera() throws OperaRunnerException { assertLauncherAlive(); try { byte[] request = LauncherStartRequest.newBuilder().build().toByteArray(); ResponseEncapsulation res = protocol.sendRequest(MessageType.MSG_START, request); if (handleStatusMessage(res.getResponse()) != StatusType.RUNNING) { throw new IOException("launcher unable to start binary"); } // Check Opera hasn't immediately exited (e.g. due to unknown arguments) try { Thread.sleep(OperaIntervals.PROCESS_START_SLEEP.getMs()); } catch (InterruptedException e) { // nothing } res = protocol.sendRequest(MessageType.MSG_STATUS, request); if (handleStatusMessage(res.getResponse()) != StatusType.RUNNING) { throw new IOException( "Opera exited immediately; possibly incorrect arguments? Command: " + binary.getCommands()); } } catch (IOException e) { throw new OperaRunnerException("Could not start Opera: " + e.getMessage()); } }
private boolean isLauncherRunning() { return binary != null && binary.isRunning(); }