簡體   English   中英

Nifi在ExecuteScript中出現錯誤

[英]Nifi getting error in ExecuteScript

我一直在嘗試從nifi的ExecuteScript Processor中提取數據並將其作為屬性附加到流文件中。 我已經嘗試了很多方法,尤其是Matt Burgess的funnifi博客中的方法。

以下是我的代碼

import json
import java.io
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
from org.apache.nifi.processor.io import StreamCallback

originalFlowFile = session.get()
text = IOUtils.toString(originalFlowFile)
log.info(text)

if(originalFlowFile != None):
    event = json.loads(text)
    if (event['true'] == 'Y'):
        flowfile = session.putAttribute(flowfile, "true", "Y")
    elif (event['src'] == 'ONE' ):
        allAttributes = { "true": "N", "src": "ONE" }
        flowfile = session.putAllAttributes(flowfile, allAttributes)
    elif (event['src'] == 'TWO' ):
        allAttributes = { "true": "N", "src": "TWO" }
        flowfile = session.putAllAttributes(flowfile, allAttributes)
    session.transfer(flowFile, REL_SUCCESS)
    session.commit()

這是在python中。 流文件數據是JSON。 不過,我無法解析它。

INFO部分是的輸出

text = IOUtils.toString(originalFlowFile)

我得到的錯誤

任何幫助將不勝感激。

ps我不熟悉python

測試數據

{
  "true":"N",
  "src":"ONE",
  "var1":"value1",
  "var2":"value2"
}

UPDATE

我的更新代碼仍然無效:

import json
import java.io
from org.apache.commons.io import IOUtils

originalFlowFile = session.get()

if(originalFlowFile != None):
    inputStream = session.read(originalFlowFile)
    text = IOUtils.toString(inputStream)
    log.info(text)
    event = json.loads(text)
     if (event['true'] == 'Y'):
        flowfile = session.putAttribute(flowfile, "true", "Y")
    elif (event['src'] == 'ONE' ):
        allAttributes = { "true": "N", "src": "ONE" }
        flowfile = session.putAllAttributes(flowfile, allAttributes)
    elif (event['src'] == 'TWO' ):
        allAttributes = { "true": "N", "src": "TWO" }
        flowfile = session.putAllAttributes(flowfile, allAttributes)
    session.transfer(flowFile, REL_SUCCESS)
    session.commit()

在流文件本身上調用IOUtils.toString()可能無法正常工作,因為流文件不是InputStream,Reader或可以自行讀取的東西。 實際上,令我驚訝的是,該行沒有產生異常。

您可以通過兩種方式獲取流文件的內容...

首先是通過從會話獲取流文件的InputStream:

originalFlowFile = session.get();
inputStream = session.read(originalFlowFile);
text = IOUtils.toString(inputStream);

第二個是通過使用InputStreamCallback:

flowFile = session.read(flowFile, {inputStream ->
   // read the inputStream
} as InputStreamCallback);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM