如何在同一个StreamInsight进程中运行多个查询?

时间:2015-04-10 10:45:17

标签: streaminsight

我已经和StreamInsight一起工作了几个星期,并且通常会让它做我想要它做的一个例外。我无法在同一进程中运行多个查询。例如,鉴于eventStreamIQStreamable<eventClass>

var query1 = from e in eventStream
                    where e.EventCode == "33"
                    select e;    
var query2 = from e in eventStream
                        where e.EventCode == "1"
                        select e;
var query1Observable = from e in query1.ToPointObservable()
                        where e.EventKind == EventKind.Insert
                        select e.Payload.EventCode + ": " + e.Payload.EventDescription;
var query2Observable = from e in query2.ToPointObservable()
                        where e.EventKind == EventKind.Insert
                        select e.Payload.EventCode + ": " + e.Payload.EventDescription;
var query1Observer = myApp.DefineObserver(() => Observer.Create<string>(Console.WriteLine));
var query2Observer = myApp.DefineObserver(() => Observer.Create<string>(Console.WriteLine));
var binding = query1Observable.Bind(query1Observer).With(query2Observable.Bind(query2Observer));

using (binding.Run())
{
    System.Console.WriteLine("Press enter to stop at any time.");
    System.Console.ReadLine();
}

当此运行时,只有大约一半的query1事件被发送到query1Observer,并且只有大约一半的query2事件被发送到query2Observer。其他人就消失了。如果我只是制作我的装订

query1Observable.Bind(query1Observer)

然后将所有查询的结果通知给观察者 - 但当然只针对query1。如何运行2个查询,在同一过程中通知不同的观察者?

2 个答案:

答案 0 :(得分:0)

你有没有看到发生了什么?没有什么可以立即让我觉得你的查询不正确,它应该没有问题。但是,请记住,Console.WriteLine是静态的,单线程的,并不是最准确的方式来真正地看到&#34;所有正在发生的事件。很可能事件是发送的,但由于锁定而被观察者丢弃。

答案 1 :(得分:0)

@DevBiker,感谢您对trace.cmd的提醒 - 它让我看到了问题,即每个查询只接收流中一半的事件。这是我的Observable<T>来源中的问题,该来源正在从Azure主题接收事件。我没有意识到,.With扩展名会创建两个源Observable<T>的实例。每个来源都从app.config获取订阅ID,因此每个Observable都有一个具有相同订阅ID的SubscriptionClient实例。这意味着SubscriptionClient的每个实例都接收了一半的事件。