Repository: nifi
Updated Branches:
  refs/heads/master 775cf4256 -> 807e1e5c7


NIFI-5175 Updated NiFi compiled on Java 1.8 to run on Java 9
The bootstrap process (RunNiFi) detects Java 9 and adds 
"--add-modules=java.xml.bind" to the command to start NiFi
Updated OSUtils to detect Java 9 and reflectively invoke the Process.pid() 
method to get the PID of the NiFi process
Added java debug variable to nifi.sh to allow debugging of the bootstrap 
process (RunNiFi)

This closes #2708

Signed-off-by: Mike Thomsen <mikerthom...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/807e1e5c
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/807e1e5c
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/807e1e5c

Branch: refs/heads/master
Commit: 807e1e5c7a6e0af1917bbdf912cd9bc17561ae2a
Parents: 775cf42
Author: Jeff Storck <jtsw...@gmail.com>
Authored: Mon Feb 12 15:58:35 2018 -0500
Committer: Mike Thomsen <mikerthom...@gmail.com>
Committed: Thu May 17 07:00:46 2018 -0400

----------------------------------------------------------------------
 .../java/org/apache/nifi/bootstrap/RunNiFi.java |  4 +++
 .../org/apache/nifi/bootstrap/util/OSUtils.java | 36 +++++++++++++++++---
 .../src/main/resources/bin/nifi.sh              |  5 ++-
 3 files changed, 40 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/807e1e5c/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java
----------------------------------------------------------------------
diff --git 
a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java 
b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java
index 2a0e36e..953cdce 100644
--- a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java
+++ b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java
@@ -1032,6 +1032,10 @@ public class RunNiFi {
         cmd.add("-Dnifi.bootstrap.listen.port=" + listenPort);
         cmd.add("-Dapp=NiFi");
         cmd.add("-Dorg.apache.nifi.bootstrap.config.log.dir=" + nifiLogDir);
+        if (!System.getProperty("java.version").startsWith("1.")) {
+            // running on Java 9+, java.xml.bind module must be made available
+            cmd.add("--add-modules=java.xml.bind");
+        }
         cmd.add("org.apache.nifi.NiFi");
         if (isSensitiveKeyPresent(props)) {
             Path sensitiveKeyFile = createSensitiveKeyFile(confDir);

http://git-wip-us.apache.org/repos/asf/nifi/blob/807e1e5c/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/util/OSUtils.java
----------------------------------------------------------------------
diff --git 
a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/util/OSUtils.java 
b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/util/OSUtils.java
index 23b512a..7df5c37 100644
--- a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/util/OSUtils.java
+++ b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/util/OSUtils.java
@@ -18,6 +18,8 @@
 package org.apache.nifi.bootstrap.util;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 
 import org.slf4j.Logger;
 import com.sun.jna.Pointer;
@@ -94,14 +96,40 @@ public final class OSUtils {
      * Purpose for the Logger is to log any interaction for debugging.
      */
     public static Long getProcessId(final Process process, final Logger 
logger) {
-        if (process.getClass().getName().equals("java.lang.UNIXProcess")) {
-            return getUnicesPid(process, logger);
+        /*
+         * NIFI-5175: NiFi built with Java 1.8 and running on Java 9.  
Reflectively invoke Process.pid() on
+         * the given process instance to get the PID of this Java process.  
Reflection is required in this scenario
+         * due to NiFi being compiled on Java 1.8, which does not have the 
Process API improvements available in
+         * Java 9.
+         *
+         * Otherwise, if NiFi is running on Java 1.8, attempt to get PID using 
capabilities available on Java 1.8.
+         *
+         * TODO: When minimum Java version updated to Java 9+, this class 
should be removed with the addition
+         * of the pid method to the Process API.
+         */
+        Long pid = null;
+        if (!System.getProperty("java.version").startsWith("1.")) {
+            try {
+                Method pidMethod = process.getClass().getMethod("pid");
+                pidMethod.setAccessible(true);
+                Object pidMethodResult = pidMethod.invoke(process);
+                if (Long.class.isAssignableFrom(pidMethodResult.getClass())) {
+                    pid = (Long) pidMethodResult;
+                } else {
+                    logger.debug("Could not determine PID for child process 
because returned PID was not " +
+                            "assignable to type " + Long.class.getName());
+                }
+            } catch (NoSuchMethodException | IllegalAccessException | 
InvocationTargetException e) {
+                logger.debug("Could not find PID for child process due to {}", 
e);
+            }
+        } else if 
(process.getClass().getName().equals("java.lang.UNIXProcess")) {
+            pid = getUnicesPid(process, logger);
         } else if 
(process.getClass().getName().equals("java.lang.Win32Process")
                 || 
process.getClass().getName().equals("java.lang.ProcessImpl")) {
-            return getWindowsProcessId(process, logger);
+            pid = getWindowsProcessId(process, logger);
         }
 
-        return null;
+        return pid;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/807e1e5c/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/bin/nifi.sh
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/bin/nifi.sh
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/bin/nifi.sh
index 9174810..eaf4e1a 100755
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/bin/nifi.sh
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/bin/nifi.sh
@@ -303,9 +303,12 @@ run() {
     
BOOTSTRAP_PID_PARAMS="-Dorg.apache.nifi.bootstrap.config.pid.dir='${NIFI_PID_DIR}'"
     
BOOTSTRAP_CONF_PARAMS="-Dorg.apache.nifi.bootstrap.config.file='${BOOTSTRAP_CONF}'"
 
+    # uncomment to allow debugging of the bootstrap process
+    
#BOOTSTRAP_DEBUG_PARAMS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000"
+
     BOOTSTRAP_DIR_PARAMS="${BOOTSTRAP_LOG_PARAMS} ${BOOTSTRAP_PID_PARAMS} 
${BOOTSTRAP_CONF_PARAMS}"
 
-    run_nifi_cmd="'${JAVA}' -cp '${BOOTSTRAP_CLASSPATH}' -Xms12m -Xmx24m 
${BOOTSTRAP_DIR_PARAMS} org.apache.nifi.bootstrap.RunNiFi $@"
+    run_nifi_cmd="'${JAVA}' -cp '${BOOTSTRAP_CLASSPATH}' -Xms12m -Xmx24m 
${BOOTSTRAP_DIR_PARAMS} ${BOOTSTRAP_DEBUG_PARAMS} 
org.apache.nifi.bootstrap.RunNiFi $@"
 
     if [ -n "${run_as_user}" ]; then
       # Provide SCRIPT_DIR and execute nifi-env for the run.as user command

Reply via email to