wol*_*ski 6 event-log system.reactive
我需要处理来自EventLog的事件.使用附加到EventRecordWritten事件的EventLogWatcher很容易.但是我感兴趣的查询(eventid == 299 || eventid == 500)提供了比我需要的更多的事件.这是流的示例
Event ID Correlation ID
299 1AD... (this is actually a guid) X1
500 1AD... X2
500 1AD...
500 1AD...
299 43B... Y1
299 EDB... Z1
500 43B... Y2
500 EDB... Z2
500 43B...
500 43B...
Run Code Online (Sandbox Code Playgroud)
我对事件299以及与299事件的相关id匹配的第一个事件500感兴趣.我在上面的流中标记了它们,这是我感兴趣的输出集合:[X1, X2, Y1, Y2, Z1, Z2]这可能是使用相关id作为键的字典和EventRecord作为值的元组
{ 1AD.., <X1, X2> }
{ 43B.., <Y1, Y2> }
{ EDB.., <Z1, Z2> }
Run Code Online (Sandbox Code Playgroud)
一般情况下,事件可能会按顺序排列(299然后是500),但在高并发情况下,我预见会有两个299个事件,然后是500个事件,所以我不想依赖事件发生的顺序.相关id是关联它们的关键(这是事件的第一个属性eventRecord.Properties[0])
我认为这可以通过状态机来解决,但是看看是否有人想出一个Rx的解决方案,这个解决方案由一个可观察的查询表示,这将是很有趣的.这将使模式匹配逻辑保持在一个位置.
更新:这是解决方案的答案.谢谢基甸,这正是我需要的起点!
var pairs = events
.Where(e299 => e299.EventArgs.EventRecord.Id == 299)
.SelectMany(e299 => events.Where(e500 => e500.EventArgs.EventRecord.Id == 500 &&
e299.EventArgs.EventRecord.Properties[0].Value.ToString() ==
e500.EventArgs.EventRecord.Properties[0].Value.ToString())
.Take(1),
(e299, e500) => new { First = e299, Second = e500 });
Run Code Online (Sandbox Code Playgroud)
在此先感谢Matias
如果299事件总是在500事件之前发生,SelectMany并且Where应该足够了.
var events; //declared somewhere
var pairs = from e299 in events
where e299.eventid == 299
from e500 in events
where e500.eventid == 500 &&
e299.Correlation == e500.Correlation
select new with {Correlation = e299.Correlation,
First = e299,
Second = e500}
Run Code Online (Sandbox Code Playgroud)
如果您的源有每个相关299事件的多个500事件,您可能需要切换到lambda语法并添加Take(1)到第二个订阅.
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |