将接收器连接到StreamInsight中的重叠Windows

时间:2015-02-13 16:36:38

标签: c# system.reactive streaminsight

我正在努力将一些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检索等效输出?

2 个答案:

答案 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();