Created 05-24-2017 09:01 AM
As the title says, I want to write down into a file a nifi attribute, but maintaining the original flowfile. I have a external .jar that only accepts files, so I need to write an attribute into a file, and syncronhize the output with the corresponding flowfile.
Thanks in advance.
Created 05-24-2017 12:28 PM
You can use the replaceText processor to do this. It offers prepend and append replacement strategies.
Just provide the name of the FlowFile Attribute you which to append or prepend in the "Replacement Value:" property of the processor in the form of a NiFi Expression Language statement.
${<flowfile-attribute-name>}
Thanks,
Matt
Created 05-24-2017 08:51 PM
Are you saying you would like, at the end of this particular portion of your flow, to have the original content in a flowfile, and a second flowfile with the output generated by your external jar?
If so, there are a few ways you could do this... One of them would be to use a DuplicateFlowFile processor to create a second copy of your flowfile, and use a ReplaceText processor on flowfile with the attribute value as content. You can use the Wait and Notify processors to wait for the processing of that flowfile. An example usage of the Wait/Notify processors can be found here.
For the Release Signal Identifier, you can use ${filename} as the example suggests, but if your filenames aren't unique, you could use an UpdateAttribute processor to capture the original UUID of the flowfile before the DuplicateFlowFile processor.
This is probably the easiest way to be able to know when that second flowfile has been processed. You could use MergeContent with a Correlation Attribute Name set to the same value as the Release Signal Identifier (and Max Number of Entries set to 2), and make sure the original flowfile gets routed from its Wait processor success relationship to the MergeContent processor, along with the success relationship of the second flowfile.
If you're processing many different files concurrently, make sure that Maximum Number of Bins is equal to or greater than the number of concurrent files.
I could probably create a sample flow of this, if you have trouble putting it together.
Created 05-30-2017 04:07 PM
Did this answer end up solving your use case?
Created 06-06-2017 11:05 AM
Finally I made my own script. Something like that
//WRITE AN ATTRIBUTE INTO A FILE var flowFile = session.get(); var File = Java.type("java.io.RandomAccessFile"); if (flowFile != null) { var filename = flowFile.getAttribute("filename"); var lang = flowFile.getAttribute("lang"); var text = flowFile.getAttribute("text"); /// write to file var filePath = "/home/test/" + lang + "/inputData/" + filename; flowFile = session.putAttribute(flowFile, "filePath", filePath); var file = new File(filePath, "rw"); file.write(text.getBytes()); file.close(); // Finish by transferring the FlowFile to an output relationship session.transfer(flowFile, REL_SUCCESS); }
Created 05-30-2017 08:01 AM
Thanks so much