From 7400b6f7c5a6f7ac3a682623772a306610036e72 Mon Sep 17 00:00:00 2001 From: Mark Payne Date: Fri, 11 Mar 2016 14:51:21 -0500 Subject: [PATCH] NIFI-1622: Ensure that the Nar Context Class Loader is used when calling Processor lifecycle methods Signed-off-by: joewitt --- .../controller/StandardProcessorNode.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardProcessorNode.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardProcessorNode.java index 85c5fe8f7a..9a6eba595e 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardProcessorNode.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardProcessorNode.java @@ -1247,14 +1247,19 @@ public class StandardProcessorNode extends ProcessorNode implements Connectable @SuppressWarnings("deprecation") @Override public Void call() throws Exception { - ReflectionUtils.invokeMethodsWithAnnotations(OnScheduled.class, org.apache.nifi.processor.annotation.OnScheduled.class, processor, schedulingContext); - return null; + try (final NarCloseable nc = NarCloseable.withNarLoader()) { + ReflectionUtils.invokeMethodsWithAnnotations(OnScheduled.class, org.apache.nifi.processor.annotation.OnScheduled.class, processor, schedulingContext); + return null; + } } }); if (scheduledState.compareAndSet(ScheduledState.STARTING, ScheduledState.RUNNING)) { schedulingAgentCallback.run(); // callback provided by StandardProcessScheduler to essentially initiate component's onTrigger() cycle } else { // can only happen if stopProcessor was called before service was transitioned to RUNNING state - ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnUnscheduled.class, processor, processContext); + try (final NarCloseable nc = NarCloseable.withNarLoader()) { + ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnUnscheduled.class, processor, processContext); + } + scheduledState.set(ScheduledState.STOPPED); } } catch (final Exception e) { @@ -1312,8 +1317,10 @@ public class StandardProcessorNode extends ProcessorNode implements Connectable invokeTaskAsCancelableFuture(scheduler, new Callable() { @Override public Void call() throws Exception { - ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnUnscheduled.class, processor, processContext); - return null; + try (final NarCloseable nc = NarCloseable.withNarLoader()) { + ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnUnscheduled.class, processor, processContext); + return null; + } } }); // will continue to monitor active threads, invoking OnStopped once @@ -1323,7 +1330,10 @@ public class StandardProcessorNode extends ProcessorNode implements Connectable public void run() { try { if (activeThreadMonitorCallback.call()) { - ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnStopped.class, processor, processContext); + try (final NarCloseable nc = NarCloseable.withNarLoader()) { + ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnStopped.class, processor, processContext); + } + scheduledState.set(ScheduledState.STOPPED); } else { scheduler.schedule(this, 100, TimeUnit.MILLISECONDS);