在Nifi Groovy脚本中如何执行存储过程

时间:2019-08-05 13:21:12

标签: apache apache-nifi

使用nifi groovy脚本,我正在执行存储过程。

import java.sql.Connection;
import java.sql.PreparedStatement;
import org.apache.nifi.controller.ControllerService

def i;
def lookup = context.controllerServiceLookup
def dbServiceName = databaseConnectionPoolName.value
def dbcpServiceId = lookup.getControllerServiceIdentifiers(ControllerService).find { 
    cs -> lookup.getControllerServiceName(cs) == dbServiceName
}
def conn = lookup.getControllerService(dbcpServiceId)?.getConnection()
flowFile = session.get()
if(!flowFile) return

try {
flowFile = session.create()
PreparedStatement prepareStatement = conn.prepareStatement("exec dbo.terms 1,'test','test'");
i = prepareStatement.executeUpdate();
  conn?.close()
  }
 catch(e) {
    log.error('Scripting error', e)
}
session.transfer(flowFile, REL_SUCCESS)
session.commit();

以下是我遇到的例外,尽管我已经提到了这种关系。并且由于这些异常,即使生成流程文件生成了一个流程文件,并将其发送到executeSQL处理器,它也会执行相同的过程多次,而屈服时间为1秒。因此,对于一个流文件,相同的记录被插入了很多次。

因此,如何避免这种情况。 enter image description here

1 个答案:

答案 0 :(得分:2)

您不应该调用flowFile = session.create(),因为您已经从session.get()获得了流文件,因此您基本上是在覆盖原始引用,从而失去对从未使用过的原始流文件的跟踪转移到任何地方。