我使用Google Cloud PubSub和Dataflow处理我的数据。我想检测我的日常工作何时完成,换句话说,何时完成窗口会话/达到间隔时间。在这种情况下是否可以触发一个触发器?如果没有,我可以使用一种解决方法吗?
Pipeline p = Pipeline.create(options);
p.apply("ReadPubSubMessage", PubsubIO.readMessages().fromSubscription("projects/project-id/subscriptions/my-sub"))
.apply("ApplyTimestamps", WithTimestamps.of((PubsubMessage pubSub) -> new Instant(System.currentTimeMillis())))
.apply("SessionWindowing", Window.<PubsubMessage>into(Sessions.withGapDuration(Duration.standardMinutes(10)))
.triggering(?)
.withAllowedLateness(Duration.standardSeconds(30))
.discardingFiredPanes())
.apply(new CountWords())
对不起,如果我错过了文档中明显的内容。
答案 0 :(得分:0)
如果我正确理解了您的情况,则达到间隔持续时间(根据sessions definition)时,窗口将结束。因此,您可以使用Default Trigger,因为您已绑定了窗口,所以它将仅触发一次。那有意义吗?
在这里您可以找到DefaultTrigger official documentation。
答案 1 :(得分:0)
是的,您可以使用DefaultTrigger.of()触发器,我在下面放了一个示例代码。 请注意,它不能在DirectRunner中使用,但可以在Google Dataflow中使用。
PCollection<KV<String, FormMessageMeta>> formMetaSessionWindowCollection = formMessageMetaKvCollection.apply(
"Session-Window",
Window.<KV<String, FormMessageMeta>>into(
Sessions.withGapDuration(Duration.standardMinutes(40)))
.triggering(DefaultTrigger.of())
.withAllowedLateness(Duration.ZERO).accumulatingFiredPanes());
会话窗口只能在KV上应用。