alopresto commented on issue #4147: NIFI-7260: Fix error handling and 
re-evaluate Module Directory property on changed for scripted controller 
services
URL: https://github.com/apache/nifi/pull/4147#issuecomment-599829133
 
 
   Hi Matt, the code all seems to make sense but when I tested it out with a 
simple `GFF` -> `QueryRecord` -> `LogAttribute` flow, I get an error enabling 
the `ScriptedReader` (using the same script you provide for testing) which 
doesn't block enabling the `QR` processor, which I thought was the whole point 
of the PR? Hopefully I'm just doing something wrong? I've attached the flow 
definition as it exists. 
   
   ```
   <?xml version="1.0" encoding="UTF-8" standalone="no"?>
   <flowController encoding-version="1.4">
     <maxTimerDrivenThreadCount>10</maxTimerDrivenThreadCount>
     <maxEventDrivenThreadCount>1</maxEventDrivenThreadCount>
     <registries/>
     <parameterContexts/>
     <rootGroup>
       <id>e60749ef-0170-1000-f44e-ff67968bebad</id>
       <name>NiFi Flow</name>
       <position x="0.0" y="0.0"/>
       <comment/>
       <processor>
         <id>e60aa427-0170-1000-a067-6c850d09968d</id>
         <name>GenerateFlowFile</name>
         <position x="498.0" y="179.0"/>
         <styles/>
         <comment/>
         <class>org.apache.nifi.processors.standard.GenerateFlowFile</class>
         <bundle>
           <group>org.apache.nifi</group>
           <artifact>nifi-standard-nar</artifact>
           <version>1.12.0-SNAPSHOT</version>
         </bundle>
         <maxConcurrentTasks>1</maxConcurrentTasks>
         <schedulingPeriod>1 sec</schedulingPeriod>
         <penalizationPeriod>30 sec</penalizationPeriod>
         <yieldPeriod>1 sec</yieldPeriod>
         <bulletinLevel>WARN</bulletinLevel>
         <lossTolerant>false</lossTolerant>
         <scheduledState>STOPPED</scheduledState>
         <schedulingStrategy>TIMER_DRIVEN</schedulingStrategy>
         <executionNode>ALL</executionNode>
         <runDurationNanos>0</runDurationNanos>
         <property>
           <name>File Size</name>
           <value>0B</value>
         </property>
         <property>
           <name>Batch Size</name>
           <value>1</value>
         </property>
         <property>
           <name>Data Format</name>
           <value>Text</value>
         </property>
         <property>
           <name>Unique FlowFiles</name>
           <value>false</value>
         </property>
         <property>
           <name>generate-ff-custom-text</name>
         </property>
         <property>
           <name>character-set</name>
           <value>UTF-8</value>
         </property>
         <property>
           <name>mime-type</name>
         </property>
       </processor>
       <processor>
         <id>e60cb66f-0170-1000-d8c3-7b9cfcac060e</id>
         <name>LogAttribute</name>
         <position x="496.0" y="704.0"/>
         <styles/>
         <comment/>
         <class>org.apache.nifi.processors.standard.LogAttribute</class>
         <bundle>
           <group>org.apache.nifi</group>
           <artifact>nifi-standard-nar</artifact>
           <version>1.12.0-SNAPSHOT</version>
         </bundle>
         <maxConcurrentTasks>1</maxConcurrentTasks>
         <schedulingPeriod>0 sec</schedulingPeriod>
         <penalizationPeriod>30 sec</penalizationPeriod>
         <yieldPeriod>1 sec</yieldPeriod>
         <bulletinLevel>WARN</bulletinLevel>
         <lossTolerant>false</lossTolerant>
         <scheduledState>DISABLED</scheduledState>
         <schedulingStrategy>TIMER_DRIVEN</schedulingStrategy>
         <executionNode>ALL</executionNode>
         <runDurationNanos>0</runDurationNanos>
         <property>
           <name>Log Level</name>
           <value>info</value>
         </property>
         <property>
           <name>Log Payload</name>
           <value>false</value>
         </property>
         <property>
           <name>Attributes to Log</name>
         </property>
         <property>
           <name>attributes-to-log-regex</name>
           <value>.*</value>
         </property>
         <property>
           <name>Attributes to Ignore</name>
         </property>
         <property>
           <name>attributes-to-ignore-regex</name>
         </property>
         <property>
           <name>Log prefix</name>
         </property>
         <property>
           <name>character-set</name>
           <value>UTF-8</value>
         </property>
       </processor>
       <processor>
         <id>e60b1443-0170-1000-77f9-682b26bcba4c</id>
         <name>QueryRecord</name>
         <position x="496.0" y="432.0"/>
         <styles/>
         <comment/>
         <class>org.apache.nifi.processors.standard.QueryRecord</class>
         <bundle>
           <group>org.apache.nifi</group>
           <artifact>nifi-standard-nar</artifact>
           <version>1.12.0-SNAPSHOT</version>
         </bundle>
         <maxConcurrentTasks>1</maxConcurrentTasks>
         <schedulingPeriod>0 sec</schedulingPeriod>
         <penalizationPeriod>30 sec</penalizationPeriod>
         <yieldPeriod>1 sec</yieldPeriod>
         <bulletinLevel>WARN</bulletinLevel>
         <lossTolerant>false</lossTolerant>
         <scheduledState>STOPPED</scheduledState>
         <schedulingStrategy>TIMER_DRIVEN</schedulingStrategy>
         <executionNode>ALL</executionNode>
         <runDurationNanos>0</runDurationNanos>
         <property>
           <name>record-reader</name>
           <value>e60b4c69-0170-1000-b09b-0ac9ef941c55</value>
         </property>
         <property>
           <name>record-writer</name>
           <value>e60b77f3-0170-1000-18d5-06515ce81d48</value>
         </property>
         <property>
           <name>include-zero-record-flowfiles</name>
           <value>true</value>
         </property>
         <property>
           <name>cache-schema</name>
           <value>true</value>
         </property>
         <property>
           <name>Name</name>
           <value>SELECT name FROM FLOWFILE</value>
         </property>
       </processor>
       <connection>
         <id>e60dcafa-0170-1000-a59f-a40c85941004</id>
         <name/>
         <bendPoints>
           <bendPoint x="472.0" y="632.0"/>
         </bendPoints>
         <labelIndex>1</labelIndex>
         <zIndex>0</zIndex>
         <sourceId>e60b1443-0170-1000-77f9-682b26bcba4c</sourceId>
         <sourceGroupId>e60749ef-0170-1000-f44e-ff67968bebad</sourceGroupId>
         <sourceType>PROCESSOR</sourceType>
         <destinationId>e60cb66f-0170-1000-d8c3-7b9cfcac060e</destinationId>
         
<destinationGroupId>e60749ef-0170-1000-f44e-ff67968bebad</destinationGroupId>
         <destinationType>PROCESSOR</destinationType>
         <relationship>Name</relationship>
         <maxWorkQueueSize>10000</maxWorkQueueSize>
         <maxWorkQueueDataSize>1 GB</maxWorkQueueDataSize>
         <flowFileExpiration>0 sec</flowFileExpiration>
         <loadBalanceStrategy>DO_NOT_LOAD_BALANCE</loadBalanceStrategy>
         <partitioningAttribute/>
         <loadBalanceCompression>DO_NOT_COMPRESS</loadBalanceCompression>
       </connection>
       <connection>
         <id>e60cd44b-0170-1000-9753-597cb32bc4f5</id>
         <name/>
         <bendPoints>
           <bendPoint x="848.0" y="632.0"/>
         </bendPoints>
         <labelIndex>0</labelIndex>
         <zIndex>0</zIndex>
         <sourceId>e60b1443-0170-1000-77f9-682b26bcba4c</sourceId>
         <sourceGroupId>e60749ef-0170-1000-f44e-ff67968bebad</sourceGroupId>
         <sourceType>PROCESSOR</sourceType>
         <destinationId>e60cb66f-0170-1000-d8c3-7b9cfcac060e</destinationId>
         
<destinationGroupId>e60749ef-0170-1000-f44e-ff67968bebad</destinationGroupId>
         <destinationType>PROCESSOR</destinationType>
         <relationship>original</relationship>
         <relationship>failure</relationship>
         <maxWorkQueueSize>10000</maxWorkQueueSize>
         <maxWorkQueueDataSize>1 GB</maxWorkQueueDataSize>
         <flowFileExpiration>0 sec</flowFileExpiration>
         <loadBalanceStrategy>DO_NOT_LOAD_BALANCE</loadBalanceStrategy>
         <partitioningAttribute/>
         <loadBalanceCompression>DO_NOT_COMPRESS</loadBalanceCompression>
       </connection>
       <connection>
         <id>e60b8cee-0170-1000-8dbe-05792b5f420e</id>
         <name/>
         <bendPoints/>
         <labelIndex>1</labelIndex>
         <zIndex>0</zIndex>
         <sourceId>e60aa427-0170-1000-a067-6c850d09968d</sourceId>
         <sourceGroupId>e60749ef-0170-1000-f44e-ff67968bebad</sourceGroupId>
         <sourceType>PROCESSOR</sourceType>
         <destinationId>e60b1443-0170-1000-77f9-682b26bcba4c</destinationId>
         
<destinationGroupId>e60749ef-0170-1000-f44e-ff67968bebad</destinationGroupId>
         <destinationType>PROCESSOR</destinationType>
         <relationship>success</relationship>
         <maxWorkQueueSize>10000</maxWorkQueueSize>
         <maxWorkQueueDataSize>1 GB</maxWorkQueueDataSize>
         <flowFileExpiration>0 sec</flowFileExpiration>
         <loadBalanceStrategy>DO_NOT_LOAD_BALANCE</loadBalanceStrategy>
         <partitioningAttribute/>
         <loadBalanceCompression>DO_NOT_COMPRESS</loadBalanceCompression>
       </connection>
       <controllerService>
         <id>e60b4c69-0170-1000-b09b-0ac9ef941c55</id>
         <name>ScriptedReader</name>
         <comment/>
         <class>org.apache.nifi.record.script.ScriptedReader</class>
         <bundle>
           <group>org.apache.nifi</group>
           <artifact>nifi-scripting-nar</artifact>
           <version>1.12.0-SNAPSHOT</version>
         </bundle>
         <enabled>true</enabled>
         <property>
           <name>Script Engine</name>
           <value>Groovy</value>
         </property>
         <property>
           <name>Script File</name>
         </property>
         <property>
           <name>Script Body</name>
           <value>import org.apache.nifi.controller.AbstractControllerService
   import org.apache.nifi.logging.ComponentLog
   import org.apache.nifi.schema.access.SchemaNotFoundException
   import org.apache.nifi.serialization.MalformedRecordException
   import org.apache.nifi.serialization.RecordReader
   import org.apache.nifi.serialization.RecordReaderFactory
   import org.apache.nifi.serialization.SimpleRecordSchema
   import org.apache.nifi.serialization.record.MapRecord
   import org.apache.nifi.serialization.record.Record
   import org.apache.nifi.serialization.record.RecordField
   import org.apache.nifi.serialization.record.RecordFieldType
   import org.apache.nifi.serialization.record.RecordSchema
   
   // import a test class to ensure Module Directory property is working 
correctly
   import org.apache.nifi.script.ModulePropertyExample
   
   
   class GroovyModuleRecordReader implements RecordReader {
   
       def recordSchema = new SimpleRecordSchema(
               [new RecordField('id', RecordFieldType.INT.dataType),
                new RecordField('name', RecordFieldType.STRING.dataType),
                new RecordField('code', RecordFieldType.INT.dataType)]
       )
   
       def recordIterator = [
               new MapRecord(recordSchema, ['id': 1, 'name': 'John', 'code': 
100]),
               new MapRecord(recordSchema, ['id': 2, 'name': 'Mary', 'code': 
200]),
               new MapRecord(recordSchema, ['id': 3, 'name': 'Ramon', 'code': 
300])
       ].iterator()
   
       Record nextRecord(boolean coerceTypes, boolean dropUnknown) throws 
IOException, MalformedRecordException {
           return recordIterator.hasNext() ? recordIterator.next() : null
       }
   
       RecordSchema getSchema() throws MalformedRecordException {
           return recordSchema
       }
   
       void close() throws IOException {
       }
   }
   
   class GroovyModuleRecordReaderFactory extends AbstractControllerService 
implements RecordReaderFactory {
   
       RecordReader createRecordReader(Map&lt;String, String&gt; variables, 
InputStream inputStream, long inputLength, ComponentLog logger) throws 
MalformedRecordException, IOException, SchemaNotFoundException {
           return new GroovyModuleRecordReader()
       }
   }
   
   reader = new GroovyModuleRecordReaderFactory()</value>
         </property>
         <property>
           <name>Module Directory</name>
         </property>
       </controllerService>
       <controllerService>
         <id>e60b77f3-0170-1000-18d5-06515ce81d48</id>
         <name>JsonRecordSetWriter</name>
         <comment/>
         <class>org.apache.nifi.json.JsonRecordSetWriter</class>
         <bundle>
           <group>org.apache.nifi</group>
           <artifact>nifi-record-serialization-services-nar</artifact>
           <version>1.12.0-SNAPSHOT</version>
         </bundle>
         <enabled>true</enabled>
         <property>
           <name>Schema Write Strategy</name>
           <value>no-schema</value>
         </property>
         <property>
           <name>schema-cache</name>
         </property>
         <property>
           <name>schema-access-strategy</name>
           <value>inherit-record-schema</value>
         </property>
         <property>
           <name>schema-registry</name>
         </property>
         <property>
           <name>schema-name</name>
           <value>${schema.name}</value>
         </property>
         <property>
           <name>schema-version</name>
         </property>
         <property>
           <name>schema-branch</name>
         </property>
         <property>
           <name>schema-text</name>
           <value>${avro.schema}</value>
         </property>
         <property>
           <name>Date Format</name>
         </property>
         <property>
           <name>Time Format</name>
         </property>
         <property>
           <name>Timestamp Format</name>
         </property>
         <property>
           <name>Pretty Print JSON</name>
           <value>false</value>
         </property>
         <property>
           <name>suppress-nulls</name>
           <value>never-suppress</value>
         </property>
         <property>
           <name>output-grouping</name>
           <value>output-array</value>
         </property>
         <property>
           <name>compression-format</name>
           <value>none</value>
         </property>
         <property>
           <name>compression-level</name>
           <value>1</value>
         </property>
       </controllerService>
     </rootGroup>
     <controllerServices/>
     <reportingTasks/>
   </flowController>
   ```
   
   And the log output:
   
   ```
   2020-03-16 18:16:38,401 ERROR [Timer-Driven Process Thread-10] 
o.a.n.c.s.StandardControllerServiceNode 
StandardControllerServiceNode[service=ScriptedReader[id=e60b4c69-0170-1000-b09b-0ac9ef941c55],
 versionedComponentId=null, 
processGroup=StandardProcessGroup[identifier=e60749ef-0170-1000-f44e-ff67968bebad],
 active=true] Failed to invoke @OnEnabled method due to 
org.apache.nifi.processor.exception.ProcessException: Error during loading of 
script: {}
   org.apache.nifi.processor.exception.ProcessException: Error during loading 
of script
        at 
org.apache.nifi.record.script.AbstractScriptedRecordFactory.setup(AbstractScriptedRecordFactory.java:50)
        at 
org.apache.nifi.script.AbstractScriptedControllerService.onEnabled(AbstractScriptedControllerService.java:143)
        at 
org.apache.nifi.record.script.ScriptedReader.onEnabled(ScriptedReader.java:59)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at 
org.apache.nifi.util.ReflectionUtils.invokeMethodsWithAnnotations(ReflectionUtils.java:142)
        at 
org.apache.nifi.util.ReflectionUtils.invokeMethodsWithAnnotations(ReflectionUtils.java:130)
        at 
org.apache.nifi.util.ReflectionUtils.invokeMethodsWithAnnotations(ReflectionUtils.java:75)
        at 
org.apache.nifi.util.ReflectionUtils.invokeMethodsWithAnnotation(ReflectionUtils.java:52)
        at 
org.apache.nifi.controller.service.StandardControllerServiceNode$2.run(StandardControllerServiceNode.java:432)
        at org.apache.nifi.engine.FlowEngine$2.run(FlowEngine.java:110)
        at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
   2020-03-16 18:16:38,401 ERROR [Timer-Driven Process Thread-10] 
o.a.n.c.s.StandardControllerServiceNode Failed to invoke @OnEnabled method of 
ScriptedReader[id=e60b4c69-0170-1000-b09b-0ac9ef941c55] due to 
org.apache.nifi.processor.exception.ProcessException: Error during loading of 
script
   ```
   
   <img width="2032" alt="Screen Shot 2020-03-16 at 6 14 37 PM" 
src="https://user-images.githubusercontent.com/798465/76812470-32107380-67b2-11ea-8365-e6414e51c912.png";>
   <img width="2032" alt="Screen Shot 2020-03-16 at 6 14 40 PM" 
src="https://user-images.githubusercontent.com/798465/76812472-3341a080-67b2-11ea-8d5a-aa4a7e338b8c.png";>
   
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to