NIFI-250: Updated javadocs to clarify how lifecycle annotations are used; cleaned up handling of exceptions in scheduler
Project: http://git-wip-us.apache.org/repos/asf/incubator-nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-nifi/commit/767f37b8 Tree: http://git-wip-us.apache.org/repos/asf/incubator-nifi/tree/767f37b8 Diff: http://git-wip-us.apache.org/repos/asf/incubator-nifi/diff/767f37b8 Branch: refs/heads/NIFI-250 Commit: 767f37b8311f5fbbcfa5aacd6ef1230103034f09 Parents: 5f2a435 Author: Mark Payne <[email protected]> Authored: Thu Feb 19 14:46:32 2015 -0500 Committer: Mark Payne <[email protected]> Committed: Thu Feb 19 14:46:32 2015 -0500 ---------------------------------------------------------------------- .../nifi/annotation/lifecycle/OnDisabled.java | 29 ++++++++++++----- .../nifi/annotation/lifecycle/OnEnabled.java | 34 ++++++++++---------- .../annotation/lifecycle/OnUnscheduled.java | 2 -- .../scheduling/StandardProcessScheduler.java | 32 +++--------------- 4 files changed, 42 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/767f37b8/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnDisabled.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnDisabled.java b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnDisabled.java index 0f78010..b227968 100644 --- a/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnDisabled.java +++ b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnDisabled.java @@ -23,19 +23,32 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.apache.nifi.controller.ConfigurationContext; + /** - * Marker annotation a {@link org.apache.nifi.processor.Processor Processor}, - * {@link org.apache.nifi.controller.ControllerService ControllerService} or - * {@link org.apache.nifi.reporting.ReportingTask ReportingTask} - * can use to indicate a method should be called whenever the component is disabled. + * <p> + * Marker annotation a {@link org.apache.nifi.controller.ControllerService ControllerService} + * can use to indicate a method should be called whenever the service is disabled. + *</p> * * <p> - * Methods using this annotation must take no arguments. If a method with this annotation - * throws a Throwable, a log message and bulletin will be issued for the component, but - * the component will still be disabled. + * Methods using this annotation are permitted to take zero arguments or to take a single + * argument of type {@link ConfigurationContext}. If a method with this annotation + * throws a Throwable, a log message and bulletin will be issued for the service, and the + * service will remain in a 'DISABLING' state. When this occurs, the method with this annotation + * will be called again after some period of time. This will continue until the method returns + * without throwing any Throwable. Until that time, the service will remain in a 'DISABLING' state + * and cannot be enabled again. + * </p> + * + * <p> + * Note that this annotation will be ignored if applied to a ReportingTask or Processor. For a Controller + * Service, enabling and disabling are considered lifecycle events, as the action makes them usable or + * unusable by other components. However, for a Processor and a Reporting + * Task, these are not lifecycle events but rather a mechanism to allow a component to be excluded when + * starting or stopping a group of components. * </p> * - * @author none */ @Documented @Target({ElementType.METHOD}) http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/767f37b8/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnEnabled.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnEnabled.java b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnEnabled.java index 1536dec..32aeec6 100644 --- a/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnEnabled.java +++ b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnEnabled.java @@ -25,35 +25,35 @@ import java.lang.annotation.Target; /** * <p> - * Marker annotation a {@link org.apache.nifi.processor.Processor Processor}, - * {@link org.apache.nifi.controller.ControllerService ControllerService} or - * {@link org.apache.nifi.reporting.ReportingTask ReportingTask} - * can use to indicate a method should be called whenever the component is enabled. - * Any method that has this annotation will be called every time a user enables the component. + * Marker annotation a {@link org.apache.nifi.controller.ControllerService ControllerService} + * can use to indicate a method should be called whenever the service is enabled. + * Any method that has this annotation will be called every time a user enables the service. * Additionally, each time that NiFi is restarted, if NiFi is configured to "auto-resume state" - * and the component is enabled (whether stopped or running), the method will be invoked. + * and the service is enabled, the method will be invoked. * </p> * * <p> - * Methods using this annotation must take either 0 arguments or a single argument. + * Methods using this annotation must take either 0 arguments or a single argument of type + * {@link org.apache.nifi.controller.ConfigurationContext ConfigurationContext}. * </p> * * <p> - * If using 1 argument and the component using the annotation is a Processor, that argument must - * be of type {@link org.apache.nifi.processor.ProcessContext ProcessContext}. - * </p> - * - * <p> - * If using 1 argument and the component using the annotation is a Reporting Task or Controller Service, - * that argument must be of type {@link org.apache.nifi.controller.ConfigurationContext ConfigurationContext}. + * If a method with this annotation throws a Throwable, a log message and bulletin will be issued + * for the component. In this event, the service will remain in an 'ENABLING' state and will not be + * usable. All methods with this annotation will then be called again after a delay. The service will + * not be made available for use until all methods with this annotation have returned without throwing + * anything. * </p> * * <p> - * If a method with this annotation throws a Throwable, a log message and bulletin will be issued - * for the component, but the component will still be enabled. + * Note that this annotation will be ignored if applied to a ReportingTask or Processor. For a Controller + * Service, enabling and disabling are considered lifecycle events, as the action makes them usable or + * unusable by other components. However, for a Processor and a Reporting + * Task, these are not lifecycle events but rather a mechanism to allow a component to be excluded when + * starting or stopping a group of components. * </p> * - * @author none + * */ @Documented @Target({ElementType.METHOD}) http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/767f37b8/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnUnscheduled.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnUnscheduled.java b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnUnscheduled.java index b1dbde1..5c7e13d 100644 --- a/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnUnscheduled.java +++ b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/lifecycle/OnUnscheduled.java @@ -47,8 +47,6 @@ import java.lang.annotation.Target; * If using 1 argument and the component using the annotation is a Reporting Task, that argument must * be of type {@link org.apache.nifi.controller.ConfigurationContext ConfigurationContext}. * </p> - * - * @author none */ @Documented @Target({ElementType.METHOD}) http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/767f37b8/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/scheduling/StandardProcessScheduler.java ---------------------------------------------------------------------- diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/scheduling/StandardProcessScheduler.java b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/scheduling/StandardProcessScheduler.java index 2b4757d..0e181c5 100644 --- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/scheduling/StandardProcessScheduler.java +++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/scheduling/StandardProcessScheduler.java @@ -230,18 +230,12 @@ public final class StandardProcessScheduler implements ProcessScheduler { try (final NarCloseable x = NarCloseable.withNarLoader()) { ReflectionUtils.invokeMethodsWithAnnotation(OnUnscheduled.class, org.apache.nifi.processor.annotation.OnUnscheduled.class, reportingTask, configurationContext); } - } catch (final InvocationTargetException ite) { - LOG.error("Failed to invoke the @OnConfigured methods of {} due to {}; administratively yielding this ReportingTask and will attempt to schedule it again after {}", - new Object[]{reportingTask, ite.getTargetException(), administrativeYieldDuration}); - LOG.error("", ite.getTargetException()); - - try { - Thread.sleep(administrativeYieldMillis); - } catch (final InterruptedException ie) { - } } catch (final Exception e) { + final Throwable cause = (e instanceof InvocationTargetException) ? e.getCause() : e; LOG.error("Failed to invoke the @OnConfigured methods of {} due to {}; administratively yielding this ReportingTask and will attempt to schedule it again after {}", - new Object[]{reportingTask, e.toString(), administrativeYieldDuration}, e); + reportingTask, cause.toString(), administrativeYieldDuration); + LOG.error("", cause); + try { Thread.sleep(administrativeYieldMillis); } catch (final InterruptedException ie) { @@ -544,11 +538,6 @@ public final class StandardProcessScheduler implements ProcessScheduler { } procNode.setScheduledState(ScheduledState.STOPPED); - - try (final NarCloseable x = NarCloseable.withNarLoader()) { - final ProcessorLog processorLog = new SimpleProcessLogger(procNode.getIdentifier(), procNode.getProcessor()); - ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnEnabled.class, procNode.getProcessor(), processorLog); - } } @Override @@ -558,11 +547,6 @@ public final class StandardProcessScheduler implements ProcessScheduler { } procNode.setScheduledState(ScheduledState.DISABLED); - - try (final NarCloseable x = NarCloseable.withNarLoader()) { - final ProcessorLog processorLog = new SimpleProcessLogger(procNode.getIdentifier(), procNode.getProcessor()); - ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnDisabled.class, procNode.getProcessor(), processorLog); - } } public synchronized void enableReportingTask(final ReportingTaskNode taskNode) { @@ -571,10 +555,6 @@ public final class StandardProcessScheduler implements ProcessScheduler { } taskNode.setScheduledState(ScheduledState.STOPPED); - - try (final NarCloseable x = NarCloseable.withNarLoader()) { - ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnEnabled.class, taskNode.getReportingTask()); - } } public synchronized void disableReportingTask(final ReportingTaskNode taskNode) { @@ -583,10 +563,6 @@ public final class StandardProcessScheduler implements ProcessScheduler { } taskNode.setScheduledState(ScheduledState.DISABLED); - - try (final NarCloseable x = NarCloseable.withNarLoader()) { - ReflectionUtils.quietlyInvokeMethodsWithAnnotation(OnDisabled.class, taskNode.getReportingTask()); - } } @Override
