Apache flink 每当我在flink中使用TumblingEventWindow30秒并使用自定义触发器时,但该触发器未在注册的事件时间触发

Apache flink 每当我在flink中使用TumblingEventWindow30秒并使用自定义触发器时,但该触发器未在注册的事件时间触发,apache-flink,flink-streaming,eventtrigger,flink-cep,Apache Flink,Flink Streaming,Eventtrigger,Flink Cep,我正在使用flink进行tumblingEventOperation,并创建一个自定义触发器对其执行操作。 我的翻滚窗口代码- DataStream<JsonNode> processedWindowedStreamData = filteredData.assignTimestampsAndWatermarks(new ExtractTimeStamps()) .keyBy(jsonNode -> jsonNode.get("imei&quo

我正在使用flink进行tumblingEventOperation,并创建一个自定义触发器对其执行操作。 我的翻滚窗口代码-

DataStream<JsonNode> processedWindowedStreamData = filteredData.assignTimestampsAndWatermarks(new ExtractTimeStamps())
            .keyBy(jsonNode -> jsonNode.get("imei").asText()).window(TumblingEventTimeWindows.of(Time.seconds(30)))
            .trigger(new ProcessingTimeCustomTrigger())
            .process(new CollectTripStart());
DataStream processedWindowedStreamData=filteredData.AssignTimestamps和水印(新的ExtractTimeStamps())
.keyBy(jsonNode->jsonNode.get(“imei”).astex()).window(TumblingEventTimeWindows.of(Time.seconds(30)))
.trigger(新ProcessingTimeCustomTrigger())
.进程(新的CollectTripStart());
但是当我使用customTrigger在自定义时间触发它时,即在第一个元素(事件时间)后30秒,但它是根据timewindow.getEnd()触发的

公共类ProcessingTimeCustomTrigger扩展触发器{
@凌驾
public TriggerResult OneElement(JsonNode JsonNode,long l,TimeWindow TimeWindow,TriggerContext TriggerContext)引发异常{
ValueState firstSeen=triggerContext.getPartitionedState(
新的ValueStateDescriptor(“firstSeen”,Types.BOOLEAN));
//仅为第一个元素注册初始计时器
System.out.println(“开始时间是”+timeWindow.getStart());
System.out.println(“结束时间是”+timeWindow.getEnd());
if(firstSeen.value()==null){
//在第一个事件发生后60000毫秒启动窗口
long currentProcessingTime=triggerContext.getCurrentProcessingTime();
//triggerContext.RegisterProcessingTimer(currentProcessingTime+60000L);
长时间=l+30000L;
System.out.println(“事件时间为”+时间);
triggerContext.RegisterEventTimer(时间);
firstSeen.update(真);
}
//继续。现在不计算窗口
返回TriggerResult.CONTINUE;
}
@凌驾
public TriggerResult on ProcessingTime(长l、时间窗口时间窗口、TriggerContext TriggerContext)引发异常{
返回TriggerResult.CONTINUE;
}
@凌驾
public TriggerResult onEventTime(长ts、时间窗口、时间窗口、TriggerContext TriggerContext)引发异常{
System.out.println(“事件时间为”+ts);
返回TriggerResult.FIRE\u和\u PURGE;
}
@凌驾
公共无效清除(TimeWindow TimeWindow、TriggerContext TriggerContext)引发异常{
系统输出打印(“销毁”);
ValueState firstSeen=triggerContext.getPartitionedState(
新的ValueStateDescriptor(“firstSeen”,Types.BOOLEAN));
第一次看到。清除();
}
}

您能告诉我您使用的是真实数据还是虚拟数据吗?如果是这样的话,你能提供数据吗?现实生活中的数据…但我可以分享,记录时间是长格式的1606731168000所以,基本上你会收到上面带有时间戳的记录,你会期望它在
1606731198000
时触发,但它会在
1606731180000
附近触发??您还可以共享时间戳提取的代码吗?
    public class ProcessingTimeCustomTrigger extends Trigger<JsonNode, TimeWindow> {

    @Override
    public TriggerResult onElement(JsonNode jsonNode, long l, TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
        ValueState<Boolean> firstSeen = triggerContext.getPartitionedState(
                new ValueStateDescriptor<>("firstSeen", Types.BOOLEAN));

             // register initial timer only for first element

        System.out.println("The start time is"+timeWindow.getStart());
        System.out.println("The end time is"+timeWindow.getEnd());


        if (firstSeen.value() == null) {
            // FIRE the window 60000 msec after the first event
            long currentProcessingTime = triggerContext.getCurrentProcessingTime();
//            triggerContext.registerProcessingTimeTimer(currentProcessingTime + 60000L);
            long time = l + 30000L;
            System.out.println("The event time is"+time);
            triggerContext.registerEventTimeTimer(time);
            firstSeen.update(true);
                   }
        // Continue. Do not evaluate window now
        return TriggerResult.CONTINUE;
    }

    @Override
    public TriggerResult onProcessingTime(long l, TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
        return TriggerResult.CONTINUE;
    }

    @Override
    public TriggerResult onEventTime(long ts, TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
        System.out.println("Event time is"+ts);
        return TriggerResult.FIRE_AND_PURGE;
    }

    @Override
    public void clear(TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
        System.out.println("Destroying");
        ValueState<Boolean> firstSeen = triggerContext.getPartitionedState(
                new ValueStateDescriptor<>("firstSeen", Types.BOOLEAN));
        firstSeen.clear();
    }

}