NIFI:使用ExecuteScript处理器在两个日期之间生成日期

时间:2018-11-23 17:37:26

标签: groovy apache-nifi

我目前正在尝试获取使用ExecuteScript指定的两个日期之间的流文件中所有日期的列表。但是我不知何故获得了空属性。

以下是我对指定的startdateenddate变量指定的ExecuteScript Groovy代码:

flowFile = session.get();
if(!flowFile)
    return;

DATE_FORMAT = 'dd-MM-yyyy';
startDate = Date.parse(DATE_FORMAT, flowFile.getAttribute("startdate"));
endDate = Date.parse(DATE_FORMAT, flowFile.getAttribute("enddate"));
allDates = "";

Calendar calendar = Calendar.getInstance();
Set allDates = new LinkedHashSet();
numbers = TimeUnit.MILLISECONDS.toDays(Math.abs(endDate - startDate))


for (int i = 1; i <= numbers; i++) {
calendar.setTime( startDate );
calendar.add( Calendar.DATE, i );
}

days.each {
    day -> allDates = allDates + day + "\n";
}

flowFile = session.putAttribute(flowFile,"allDates", allDates );
session.transfer(flowFile,REL_SUCCESS)

在我的传出队列中,我发现属性allDates为空字符串

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

您的代码有问题

例如变量allDates在两个不同的作用域中两次声明:

全局(无类型或def)

allDates = "";

和本地(带有类型)

Set allDates = new LinkedHashSet();

之后,很难预测使用了哪一个

实际上,使用Groovy编写代码可能会更容易:

def DATE_FORMAT = 'dd-MM-yyyy';
def startDate = Date.parse(DATE_FORMAT, '01-11-1970');
def endDate = Date.parse(DATE_FORMAT, '09-11-1970');
def allDates = ""

for (def d = startDate; d<=endDate; d++){
    allDates+=d.format(DATE_FORMAT)+"\n"
}
println allDates

请注意,这是可运行的代码,因此您可以在集成到nifi中之前使用groovyconsole或任何IDE对其进行调试

原因,在nifi中使用

之前,必须将其与流文件处理一起包装