我正在努力将一些Reactive Extension查询移植到StreamInsight,但遇到了重叠窗口查询的问题。
我的StreamInsight服务器中有源设置,我试图编写一个重叠的窗口查询,如下所示:
var source = streamInsightServer.GetObservable<EventPattern<MyEventArg>>("EventSource");
var query = source.Window(new TimeSpan(0, 0, 1), new TimeSpan(0, 0, 0, 250));
其中,来源为IQbservable<EventPattern<MyEventArg>>
,然后查询为IQbservable<IObserverable<EventPattern<MyEventArg>>>
使用Reactive,观察者的创建如下:
_observer = query.Subscribe(evts =>
{
evts.Count().Subscribe(c =>
{
//push output here
});
});
如何附加观察者以从StreamInsight检索等效输出?
答案 0 :(得分:0)
好的,所以我设法创建了两个与Rx订阅相同输出的接收器,如下所示:
var query = source.Window(TimeSpan.FromSeconds(1), TimeSpan.FromMilliseconds(250));
query.Deploy("windowQuery");
var innerSink = applicationStatus.DefineObserver(() => Observer.Create<int>(c => /*output here*/));
innerSink.Deploy("innerSink");
var sink = applicationStatus.DefineObserver(() => Observer.Create<IObservable<EventPattern<MyEventArg>>>(e => e.Count().AsQbservable().Bind(innerSink).Run().Void()));
sink.Deploy("mySink");
ProcessBinding = query.Bind(sink).Run("processBindingName");
要注意,虽然.Void()
方法只是一个不执行任何操作并返回void的扩展方法,导致表达式被解释为Action
而不是Func
以匹配所需的签名。此外,通过运行内部接收器创建的所有绑定都不会被处理和堆积;这些可以在StreamInsight Event FLow Debugger中看到。
虽然这实现了相同的结果,但由于扩展方法hack并且没有处理内部进程绑定,我不确定它是否是一个好的解决方案。仍在寻找是否有人知道如何在没有这些问题的情况下写这个!
答案 1 :(得分:0)
如果您的目标是共享数据源,则需要使用.With()
。
所以你的过程应该是:
var process = query.Bind(innerSink).With(query.Bind(sink).Run("processBindingName");
当您完成该过程或想要关闭该应用程序时,您只需要致电.Dispose()
。
就你的窗口而言,你应该像这样使用HoppingWindow:
var query = from win in source.HoppingWindow(new TimeSpan(0, 0, 1), new TimeSpan(0, 0, 0, 250))
select win.Count();