[ https://issues.apache.org/jira/browse/NIFI-8625?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17351419#comment-17351419 ]
KevinSky edited comment on NIFI-8625 at 5/26/21, 1:34 AM: ---------------------------------------------------------- hi [#Otto Fowler], you can refer that : https://issues.apache.org/jira/browse/NIFI-8461?focusedCommentId=17349069&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-17349069 Here is a better solution: nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JythonScriptEngineConfigurator.java {code:java} package org.apache.nifi.script.impl;import org.apache.nifi.logging.ComponentLog; import org.apache.nifi.processors.script.ScriptEngineConfigurator; import org.python.core.PyString;import javax.script.Compilable; import javax.script.CompiledScript; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.net.URL; import java.util.Arrays; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors;/** * A helper class to configure the Jython engine with any specific requirements */ public class JythonScriptEngineConfigurator implements ScriptEngineConfigurator { private final Map<ScriptEngine, CompiledScript> compiledScriptMap = new ConcurrentHashMap<>(); private String prefix = null; @Override public String getScriptEngineName() { return "python"; } @Override public URL[] getModuleURLsForClasspath(String[] modulePaths, ComponentLog log) { // We don't need to add the module paths to the classpath, they will be added via sys.path.append return new URL[0]; } @Override public Object init(ScriptEngine engine, String scriptBody, String[] modulePaths) throws ScriptException { if (engine == null) { return null; } CompiledScript compiled = compiledScriptMap.get(engine); if (compiled != null) { return compiled; } // Add prefix for import sys and all jython modules if (prefix == null) { prefix = "import sys\n" + Arrays.stream(modulePaths).map((modulePath) -> "sys.path.append(" + PyString.encode_UnicodeEscape(modulePath, true) + ")") .collect(Collectors.joining("\n")); } compiled = ((Compilable) engine).compile(prefix + scriptBody); compiledScriptMap.put(engine, compiled); return compiled; } @Override public Object eval(ScriptEngine engine, String scriptBody, String[] modulePaths) throws ScriptException { if (engine == null) { return null; } CompiledScript compiled = compiledScriptMap.get(engine); if (compiled == null) { throw new ScriptException("Jython script has not been compiled, the processor must be restarted."); } return compiled.eval(engine.getBindings(ScriptContext.ENGINE_SCOPE)); } }{code} nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java {code:java} public void stop() { if (engineQ != null) { engineQ.clear(); } scriptEngineConfiguratorMap.clear(); }{code} was (Author: kevinsky1093): hi [#Otto Fowler], Here is a better solution: nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JythonScriptEngineConfigurator.java {code:java} package org.apache.nifi.script.impl;import org.apache.nifi.logging.ComponentLog; import org.apache.nifi.processors.script.ScriptEngineConfigurator; import org.python.core.PyString;import javax.script.Compilable; import javax.script.CompiledScript; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.net.URL; import java.util.Arrays; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors;/** * A helper class to configure the Jython engine with any specific requirements */ public class JythonScriptEngineConfigurator implements ScriptEngineConfigurator { private final Map<ScriptEngine, CompiledScript> compiledScriptMap = new ConcurrentHashMap<>(); private String prefix = null; @Override public String getScriptEngineName() { return "python"; } @Override public URL[] getModuleURLsForClasspath(String[] modulePaths, ComponentLog log) { // We don't need to add the module paths to the classpath, they will be added via sys.path.append return new URL[0]; } @Override public Object init(ScriptEngine engine, String scriptBody, String[] modulePaths) throws ScriptException { if (engine == null) { return null; } CompiledScript compiled = compiledScriptMap.get(engine); if (compiled != null) { return compiled; } // Add prefix for import sys and all jython modules if (prefix == null) { prefix = "import sys\n" + Arrays.stream(modulePaths).map((modulePath) -> "sys.path.append(" + PyString.encode_UnicodeEscape(modulePath, true) + ")") .collect(Collectors.joining("\n")); } compiled = ((Compilable) engine).compile(prefix + scriptBody); compiledScriptMap.put(engine, compiled); return compiled; } @Override public Object eval(ScriptEngine engine, String scriptBody, String[] modulePaths) throws ScriptException { if (engine == null) { return null; } CompiledScript compiled = compiledScriptMap.get(engine); if (compiled == null) { throw new ScriptException("Jython script has not been compiled, the processor must be restarted."); } return compiled.eval(engine.getBindings(ScriptContext.ENGINE_SCOPE)); } }{code} nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java {code:java} public void stop() { if (engineQ != null) { engineQ.clear(); } scriptEngineConfiguratorMap.clear(); }{code} > ExecuteScript processor always stuck after restart or multi thread > ------------------------------------------------------------------ > > Key: NIFI-8625 > URL: https://issues.apache.org/jira/browse/NIFI-8625 > Project: Apache NiFi > Issue Type: Bug > Components: Core Framework > Affects Versions: 1.13.2 > Reporter: KevinSky > Priority: Critical > Labels: ExecuteScript,stcuk > Attachments: executeScript_nifi_8625.xml, > image-2021-05-21-16-22-34-775.png > > > In single thread, executeScript just stop and start, flow file always stuck > in connections. > In multi thread.executeScript always throw exception like is already marked > for transfer in or is not known in this session. > -- This message was sent by Atlassian Jira (v8.3.4#803005)