Groovy 访问NiFi流文件的沿袭
我正在为NiFi的流文件开发某种错误处理,例如,数据库子系统拒绝从流文件写入数据,因为数据不符合预期,因为该数据的源系统缺少一些主数据。Groovy 访问NiFi流文件的沿袭,groovy,apache-nifi,nifi-api,Groovy,Apache Nifi,Nifi Api,我正在为NiFi的流文件开发某种错误处理,例如,数据库子系统拒绝从流文件写入数据,因为数据不符合预期,因为该数据的源系统缺少一些主数据。 因此,此错误处理将数据写入MongoDB,并提供更多错误信息。 其中一个“更多信息”是这个流文件的某种堆栈跟踪,这意味着数据沿袭。为此,我编写了一个带有Groovy脚本的InvokeScriptedProcessor来实现这一点 以下是脚本的重要部分: ArrayList getStacktrace(flowfileUuid){ def lineage
因此,此错误处理将数据写入MongoDB,并提供更多错误信息。
其中一个“更多信息”是这个流文件的某种堆栈跟踪,这意味着数据沿袭。为此,我编写了一个带有Groovy脚本的InvokeScriptedProcessor来实现这一点 以下是脚本的重要部分:
ArrayList getStacktrace(flowfileUuid){
def lineage = this.provenanceRepository.createLineageQuery(flowfileUuid)
def lineageData = this.provenanceRepository.getLineageData(lineage.id)
if (lineageData.results == null || lineageData.results.nodes.size() == 0){
println "cannot find stacktrace for ${flowfileUuid}."
return []
}
def eventIds = lineageData.results.nodes.findAll {n -> n.type == 'EVENT'}.collect {n -> n.id }.sort()
def provenanceEvents = []
for (eventId in eventIds){
provenanceEvents << this.provenanceRepository.getProvenanceEvent(eventId).provenanceEvent.componentName
}
this.provenanceRepository.deleteLineageQuery(lineage.id)
return provenanceEvents
}
ArrayList getStacktrace(flowfileUuid){
def沿袭=this.provenanceRepository.Create沿袭查询(flowfileUuid)
def LEGANEDATA=this.provenanceRepository.getLineage数据(relege.id)
if(linecadata.results==null | | linecadata.results.nodes.size()==0){
println“找不到${flowfileUuid}的stacktrace。”
返回[]
}
def eventIds=delegediata.results.nodes.findAll{n->n.type=='EVENT'}.collect{n->n.id}.sort()
def provenanceEvents=[]
for(eventId中的eventId){
provenanceEvents我不完全确定问题出在哪里,但一般来说,provence数据并不真正意味着要从处理器访问,这就是为什么会话或上下文没有提供API来检索provence事件,只允许创建事件
为了运行来源查询,需要对事件进行索引,并且不能保证索引将在何时进行,这与处理流文件的时间有关。因此,事件可能还不可见
ReportingTask是访问源事件的理想方式,可用于将它们从NiFi推送到某个外部系统进行长期存储。实际上,我只使用NiFi api,因此这只是一个普通的api调用;我还尝试了InvokeHTTP处理器的相同功能。您有ReportingTask的示例吗?可能没有他为我的问题提供了正确的解决方案,因为我并不总是需要这些信息,只有当流文件运行到故障队列时才需要。是的,但如果我理解正确,您就在一个处理器(InvokeScriptedProcessor)中然后调用NiFi REST API,此时还不能保证起源事件已经被索引