in nifi-registry/nifi-registry-core/nifi-registry-bootstrap/src/main/java/org/apache/nifi/registry/bootstrap/RunNiFiRegistry.java [776:1028]
public void start() throws IOException {
final Integer port = getCurrentPort(cmdLogger);
if (port != null) {
cmdLogger.info("Apache NiFi Registry is already running, listening to Bootstrap on port {}", port);
return;
}
final File prevLockFile = getLockFile(cmdLogger);
if (prevLockFile.exists() && !prevLockFile.delete()) {
cmdLogger.warn("Failed to delete previous lock file {}; this file should be cleaned up manually", prevLockFile);
}
final ProcessBuilder builder = new ProcessBuilder();
if (!bootstrapConfigFile.exists()) {
throw new FileNotFoundException(bootstrapConfigFile.getAbsolutePath());
}
final Properties properties = new Properties();
try (final FileInputStream fis = new FileInputStream(bootstrapConfigFile)) {
properties.load(fis);
}
final Map<String, String> props = new HashMap<>();
props.putAll((Map) properties);
// Determine the working dir for launching the NiFi Registry process
// The order of precedence is:
// 1) Specified in bootstrap.conf via working.dir
// 2) NIFI_REGISTRY_HOME env variable
// 3) Parent of bootstrap config file's parent
final File workingDir;
final String specifiedWorkingDir = props.get("working.dir");
final String nifiRegistryHome = System.getenv("NIFI_REGISTRY_HOME");
final File bootstrapConfigAbsoluteFile = bootstrapConfigFile.getAbsoluteFile();
if (!StringUtils.isBlank(specifiedWorkingDir)) {
workingDir = new File(specifiedWorkingDir.trim());
} else if (!StringUtils.isBlank(nifiRegistryHome)) {
workingDir = new File(nifiRegistryHome.trim());
} else {
final File binDir = bootstrapConfigAbsoluteFile.getParentFile();
workingDir = binDir.getParentFile();
}
builder.directory(workingDir);
final String nifiRegistryLogDir = replaceNull(System.getProperty("org.apache.nifi.registry.bootstrap.config.log.dir"), DEFAULT_LOG_DIR).trim();
final String nifiRegistryDocsDir = replaceNull(props.get("docs.dir"), DEFAULT_DOCS_DIR).trim();
final String libFilename = replaceNull(props.get("lib.dir"), "./lib").trim();
File libDir = getFile(libFilename, workingDir);
File libSharedDir = getFile(libFilename + "/shared", workingDir);
final String confFilename = replaceNull(props.get("conf.dir"), "./conf").trim();
File confDir = getFile(confFilename, workingDir);
String nifiRegistryPropsFilename = props.get("props.file");
if (nifiRegistryPropsFilename == null) {
if (confDir.exists()) {
nifiRegistryPropsFilename = new File(confDir, "nifi-registry.properties").getAbsolutePath();
} else {
nifiRegistryPropsFilename = DEFAULT_CONFIG_FILE;
}
}
nifiRegistryPropsFilename = nifiRegistryPropsFilename.trim();
final List<String> javaAdditionalArgs = new ArrayList<>();
for (final Map.Entry<String, String> entry : props.entrySet()) {
final String key = entry.getKey();
final String value = entry.getValue();
if (key.startsWith("java.arg")) {
javaAdditionalArgs.add(value);
}
}
final File[] libSharedFiles = libSharedDir.listFiles((dir, filename) -> filename.toLowerCase().endsWith(".jar"));
if (libSharedFiles == null || libSharedFiles.length == 0) {
throw new RuntimeException("Could not find lib shared directory at " + libSharedDir.getAbsolutePath());
}
final File[] libFiles = libDir.listFiles((dir, filename) -> filename.toLowerCase().endsWith(".jar"));
if (libFiles == null || libFiles.length == 0) {
throw new RuntimeException("Could not find lib directory at " + libDir.getAbsolutePath());
}
final File[] confFiles = confDir.listFiles();
if (confFiles == null || confFiles.length == 0) {
throw new RuntimeException("Could not find conf directory at " + confDir.getAbsolutePath());
}
final List<String> cpFiles = new ArrayList<>(confFiles.length + libFiles.length + libSharedFiles.length);
cpFiles.add(confDir.getAbsolutePath());
for (final File file : libSharedFiles) {
cpFiles.add(file.getAbsolutePath());
}
for (final File file : libFiles) {
cpFiles.add(file.getAbsolutePath());
}
final StringBuilder classPathBuilder = new StringBuilder();
for (int i = 0; i < cpFiles.size(); i++) {
final String filename = cpFiles.get(i);
classPathBuilder.append(filename);
if (i < cpFiles.size() - 1) {
classPathBuilder.append(File.pathSeparatorChar);
}
}
final String classPath = classPathBuilder.toString();
String javaCmd = props.get("java");
if (javaCmd == null) {
javaCmd = DEFAULT_JAVA_CMD;
}
if (javaCmd.equals(DEFAULT_JAVA_CMD)) {
String javaHome = System.getenv("JAVA_HOME");
if (javaHome != null) {
String fileExtension = isWindows() ? ".exe" : "";
File javaFile = new File(javaHome + File.separatorChar + "bin"
+ File.separatorChar + "java" + fileExtension);
if (javaFile.exists() && javaFile.canExecute()) {
javaCmd = javaFile.getAbsolutePath();
}
}
}
final NiFiRegistryListener listener = new NiFiRegistryListener();
final int listenPort = listener.start(this);
final List<String> cmd = new ArrayList<>();
cmd.add(javaCmd);
cmd.add("-classpath");
cmd.add(classPath);
cmd.addAll(javaAdditionalArgs);
cmd.add("-Dnifi.registry.properties.file.path=" + nifiRegistryPropsFilename);
cmd.add("-Dnifi.registry.bootstrap.config.file.path=" + bootstrapConfigFile.getAbsolutePath());
cmd.add("-Dnifi.registry.bootstrap.listen.port=" + listenPort);
cmd.add("-Dnifi.registry.bootstrap.config.docs.dir=" + nifiRegistryDocsDir);
cmd.add("-Dapp=NiFiRegistry");
cmd.add("-Dorg.apache.nifi.registry.bootstrap.config.log.dir=" + nifiRegistryLogDir);
cmd.add("org.apache.nifi.registry.NiFiRegistry");
builder.command(cmd);
final StringBuilder cmdBuilder = new StringBuilder();
for (final String s : cmd) {
cmdBuilder.append(s).append(" ");
}
cmdLogger.info("Starting Apache NiFi Registry...");
cmdLogger.info("Working Directory: {}", workingDir.getAbsolutePath());
cmdLogger.info("Command: {}", cmdBuilder);
String gracefulShutdown = props.get(GRACEFUL_SHUTDOWN_PROP);
if (gracefulShutdown == null) {
gracefulShutdown = DEFAULT_GRACEFUL_SHUTDOWN_VALUE;
}
final int gracefulShutdownSeconds;
try {
gracefulShutdownSeconds = Integer.parseInt(gracefulShutdown);
} catch (final NumberFormatException nfe) {
throw new NumberFormatException("The '" + GRACEFUL_SHUTDOWN_PROP + "' property in Bootstrap Config File "
+ bootstrapConfigAbsoluteFile.getAbsolutePath() + " has an invalid value. Must be a non-negative integer");
}
if (gracefulShutdownSeconds < 0) {
throw new NumberFormatException("The '" + GRACEFUL_SHUTDOWN_PROP + "' property in Bootstrap Config File "
+ bootstrapConfigAbsoluteFile.getAbsolutePath() + " has an invalid value. Must be a non-negative integer");
}
Process process = builder.start();
handleLogging(process);
nifiRegistryPid = process.pid();
final Properties pidProperties = new Properties();
pidProperties.setProperty(PID_KEY, String.valueOf(nifiRegistryPid));
savePidProperties(pidProperties, cmdLogger);
cmdLogger.info("Application Process [{}] launched", nifiRegistryPid);
shutdownHook = new ShutdownHook(process, this, secretKey, gracefulShutdownSeconds, loggingExecutor);
final Runtime runtime = Runtime.getRuntime();
runtime.addShutdownHook(shutdownHook);
while (true) {
final boolean alive = isAlive(process);
if (alive) {
try {
Thread.sleep(1000L);
} catch (final InterruptedException ignored) {
}
} else {
try {
runtime.removeShutdownHook(shutdownHook);
} catch (final IllegalStateException ignored) {
// happens when already shutting down
}
if (autoRestartNiFiRegistry) {
final File statusFile = getStatusFile(defaultLogger);
if (!statusFile.exists()) {
defaultLogger.info("Status File no longer exists. Will not restart NiFi Registry ");
return;
}
final File lockFile = getLockFile(defaultLogger);
if (lockFile.exists()) {
defaultLogger.info("A shutdown was initiated. Will not restart NiFi Registry ");
return;
}
final boolean previouslyStarted = getNifiRegistryStarted();
if (!previouslyStarted) {
defaultLogger.info("NiFi Registry never started. Will not restart NiFi Registry ");
return;
} else {
setNiFiRegistryStarted(false);
}
defaultLogger.warn("Apache NiFi Registry appears to have died. Restarting...");
secretKey = null;
process = builder.start();
handleLogging(process);
nifiRegistryPid = process.pid();
pidProperties.setProperty(PID_KEY, String.valueOf(nifiRegistryPid));
savePidProperties(pidProperties, defaultLogger);
cmdLogger.info("Application Process [{}] launched", nifiRegistryPid);
shutdownHook = new ShutdownHook(process, this, secretKey, gracefulShutdownSeconds, loggingExecutor);
runtime.addShutdownHook(shutdownHook);
final boolean started = waitForStart();
if (started) {
defaultLogger.info("Application Process [{}] started", nifiRegistryPid);
} else {
defaultLogger.error("Application Process [{}] not started", nifiRegistryPid);
}
} else {
return;
}
}
}
}