Good evening. I am trying to get this simple update attribute function to
work in an InvokeScriptedProcessor ....processor. I wish to initialize
custom logging to a distinct log file specifically associated with this
processor. While updating an attribute is (should be) a very simple case,
it seems that making the ISP work with this custom directed logging is not.

I was able to get a simple filename attribute change to work, but a
particular ERROR gets thrown each and every time the ISP wkaes up and
checks for flowfiles to process. The error is this:

2017-04-03 10:59:31,370 ERROR [Timer-Driven Process Thread-4]
o.a.n.p.script.InvokeScriptedProcessor
InvokeScriptedProcessor[id=1f379.....] Unable to get property descriptors
from Processor: java.lang.reflect.UndeclaredThrowableException

I am running NiFi 0.7.1.

Either there is something obvious that I've done wrong in the following
code or I'm not using ISP properly. I did research this error and found a
link that appeared to be directly related (at Hortonworks), but
unfortunately when I incorporated the change to PySet it did not resolve my
issue. Here is that link in case you are interested:
https://community.hortonworks.com/questions/75420/invokescriptedprocessor-in-python.html

I also want to point out that I found this approach documented here, and
referenced by Matt. B:
https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/jython/test_update_attribute.py

Please note that I had to recreate my code here. Typos if found are not in
the code but are introduced by my mad typing "skills" here.

Anyone encounter and fix such a problem, eliminating this error? Thanks in
advance for any help. Code shown below. -Jim

# Approach:
# First, get a simple attribute to update (DONE)
# Second, add directed logging to a specific file (getting many of the
ERRORs detailed above)
# Third, expand on the update attribute concept to select a small subset of
attributes, form them into a json object, and replace the existing flowfile
payload with that

import sys
import traceback
import logging
from org.apache.nifi.processor import Processor
from org.apache.nifi.processor import Relationship
from org.apache.nifi.components import PropertyDescriptor
from org.apache.nifi.processor.util import StandardValidators
from org.python.core import PySet

class UpdateAttributes(Processor) :
     #__rel_success =
Relationship.Builder().description("Success").name("success".build()
     def __init__(self) :
          self.__rel_success =
Relationship.Builder().description("Success").name("success".build()
          self.log = None

     def initialize(self,context) :
          try :
               LOG_FILENAME='/home/nifi/latest/logs/TestLog.log'
               # Still tbd:
               # FORMAT='%(asctime)-15s %(message)s'
               # formatter = logging.Formatter('%(asctime)-15s %(message)s)'
               # self.log = context.getLogger()
               # handler = context.FileHandler(LOG_FILENAME)
               # handler.setFormatter(formatter)
               #self.addHandler(handler)
          except :
               pass

     def getRelationships(self) :
          return PySet([self.__rel_success])

     def validate(self,context) :
          return None

     def getPropertyDescriptor(self) :
          return None
          # try :
          #      descriptor =
PropertyDescriptor.Builder().name("filename").addValidators(StandardValidators.NON_EMPTY_VALIDATOR).build()
          #      return [descriptor]
          # except :
          #      pass

     def getPropertyDescriptors(self) :
          return None

     def onPropertyModified(self,descriptor,newValue,oldValue) :
          pass

     def onTrigger(self,context,sessionFactory) :
          session = sessionFactory.createSession()
          try :
               # ensure there is work to do
               flowfile = session.,get()
               if flowfile is None :
                    return

               # extract some attribute value of interest
               # fromPropertyValue =
context.getProperty("for-attributes").getValue()
               fromAttributeValue = flowfile.getAttribute("filename")

               # set our attribute to the desired new value
               # flowfile = session.putAttribute(flowfile, "from-property",
fromPropertyValue)
               flowfile = session.putAttribute(flowfile, "filename",
"LARRY_CURLEY_MOE")

               # transfer
               session.transfer(flowfile, self.__rel_success)
               session.commit()
          except:
               session.rollback()
               raise

processor = UpdateAttributes()

Reply via email to