我想在创建新的SessionWindow以及结束会话时向Kafka主题发送消息。我有以下代码
stream
.filter(user -> user.isAdmin)
.keyBy(user -> user.username)
.window(ProcessingTimeSessionWindows.withGap(Time.seconds(10)))
//what now? Trigger?
现在,我想在新会话开始时发送消息(使用一些元数据,例如Web浏览器和时间戳,这些信息在流的每个元素中都可用),并在会话结束时(在此示例中,在10秒后)将消息发送到Kafka。我认为是最后一个元素),其中包含请求总数。
在Flink中可以吗?我想我应该使用一些触发器,但我不知道如何,也找不到任何示例。
答案 0 :(得分:1)
如果要在处理窗口时执行此操作,则可以简单地使用 make a global.aspx file
protected void Application_BeginRequest(object sender, EventArgs e)
{
var context = HttpContext.Current;
var response = context.Response;
// enable CORS
response.AddHeader("Access-Control-Allow-Origin", "*");
if (context.Request.HttpMethod == "OPTIONS")
{
response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
response.End();
}
}
in your web.config
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Headers" value="accept, content-type" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />
</customHeaders>
</httpProtocol>
</system.webServer>
,基本上需要做的就是将WindowProcessFunction
添加到代码中。在.process(new MyProcessFunction()
中,您可以访问整个窗口,包括其第一个(开始)和最后一个(结束)元素。您可以简单地使用Side输出来只输出给定窗口的开始和结束。然后,您可以从侧面输出创建流并将其沉入Kafka。可以在here中找到更多有关侧面输出的信息。
答案 1 :(得分:0)
您可以编写自定义窗口触发器。
如何告知开始新会话?
您可以创建一个ThreadPoolExecutor executor = Executors.newSingleThreadExecutor();
executor.scheduleAtFixedRate(() -> renderFrame(), 0, 1000 / 60, TimeUnit.ms);
,默认值为null,因此,如果状态值为null,则它是会话开始。
会话何时结束?
就在ValueState
之前。
这是一个基于Flink的TriggerResult.FIRE
的演示,我仅在此处添加与问题相关的逻辑,您可以从源代码中查看其他详细信息。
ProcessingTimeTrigger