在这段代码中
 希望将lastDate保存在数组中,并使用它自动增加startDate和endDate属性值。但不会生成流文件。
我尝试修复它,但它无法创建flofwile,我应该更改什么?

 var OutputStreamCallback = Java.type("org.apache.nifi.processor.io.OutputStreamCallback");
var StandardCharsets = Java.type("java.nio.charset.StandardCharsets");

Date.prototype.isValid = function () {
    return (Object.prototype.toString.call(this) === "[object Date]")
        && !isNaN(this.getTime());
};

var toDate = endDate.getValue(),
    parameter1=parameter.getValue(),
    count1=count.getValue();

function addDays(date, days) {
    var result =new Date(date);
    result.setDate(result.getDate() + days);

    return formatDate(result);
}
function formatDate(date) {
    var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) month = '0' + month;
    if (day.length < 2) day = '0' + day;

    return [year, month, day].join('-');
}

var flowFile = session.create();
if(flowFile==null) {
    var param = 8;
    //count = Number(count1);
   //var item = item + count1;
    var endDate1 = addDays(toDate, param);
    var startDate = toDate;
    var arr = [];
    arr.push(endDate1);

}
    if(arr.length>1){
        startDate1=arr.pop();
        var endDate1 = addDays(startDate1, param);
        var startDate = startDate1;
        flowFile = session.putAttribute(flowFile, 'startDate', startDate1);
        flowFile = session.putAttribute(flowFile, 'endDate', endDate1);
        flowFile = session.putAttribute(flowFile, 'parameter', parameter);
    }
    else {
        var param = 8;
        var endDate1 = addDays(toDate, param);
        var startDate = toDate;
        flowFile = session.putAttribute(flowFile, 'count', 1);
        flowFile = session.putAttribute(flowFile, 'startDate', startDate);
        flowFile = session.putAttribute(flowFile, 'endDate', endDate1);
        flowFile = session.putAttribute(flowFile, 'parameter', parameter1);
    }

    session.transfer(flowFile, REL_SUCCESS);


**它不会抛出异常,但也不会创建flowfile


**我应该添加(flowfile == null)以使新创建的流文件初始化吗?
您向我推荐一些使我的代码更加持久和快速的东西吗?

最佳答案

代码的问题在于,您正在创建一个新的流文件,并确保该文件不是null。然后,您评估if (flowFile == null),它将始终返回false。您只能在该控制块内初始化变量paramendDate1startDatearr。其余代码将无法按预期执行,并且您引用了未定义的变量(例如,parameter1var toDate = endDate.getValue())。 flowFile在传输时不会具有您期望的任何属性。

您不需要ExecuteScript处理器即可执行任何上述操作。将UpdateAttribute与Apache NiFi表达式语言一起使用可以执行简单的日期数学运算。

如果这启动了流程,请使用GenerateFlowFile处理器最初创建流程文件并将其发送到UpdateAttribute。如果您从其他地方接收到流文件,则只需要UpdateAttribute(但是您需要两个;一个用于创建添加变量的天数,另一个用于执行数学运算;或者,如果该增量是常数,则只需一个并改变变量引用为文字数字)。

定义了动态属性(template as GitHub Gist)的处理器:

GenerateFlowFile:
startDate: ${now():toNumber()} <- puts the start date in "number of milliseconds since Jan 1, 1970 00:00:00.000 GMT" format
numberOfDaysToAdd: 8 <- or whatever static or dynamic value you want here
startDateFormatted: ${now():format("YYYY-MM-dd")} <- (optional) startDate in readable format if you need it

UpdateAttribute:
endDate: ${startDate:plus(${numberOfDaysToAdd:multiply(86400000)}):format("YYYY-MM-dd")} <- adds the number of milliseconds in a day * the number of days to the start date and formats it the way you want


生成的流文件将如下所示:

o.a.n.processors.standard.LogAttribute LogAttribute[id=d06d3a2d-015e-1000-0820-087660238327] logging for flow file StandardFlowFileRecord[uuid=6d26df1a-fd52-407e-b549-0599d6ab3a21,claim=,offset=0,name=1636687405556264,size=0]
--------------------------------------------------
Standard FlowFile Attributes
Key: 'entryDate'
    Value: 'Fri Sep 29 18:40:06 PDT 2017'
Key: 'lineageStartDate'
    Value: 'Fri Sep 29 18:40:06 PDT 2017'
Key: 'fileSize'
    Value: '0'
FlowFile Attribute Map Content
Key: 'endDate'
    Value: '2017-10-07'
Key: 'filename'
    Value: '1636687405556264'
Key: 'numberOfDaysToAdd'
    Value: '8'
Key: 'path'
    Value: './'
Key: 'startDate'
    Value: '1506735606982'
Key: 'startDateFormatted'
    Value: '2017-09-29'
Key: 'uuid'
    Value: '6d26df1a-fd52-407e-b549-0599d6ab3a21'
--------------------------------------------------


与使用ExecuteScript相比,这将具有更高的性能和稳定性。

10-06 07:59