我是使用EventProcessorHost和IEventProcessor的新手,我正在试图弄清楚如何从EventProcessorClass中获取数据。如果我只是想将新消息记录到控制台,我现在已经完成了所有工作。
我当前的实现(我甚至不确定它是否可接受甚至是良好的实践)创建一个静态变量,然后只是将数据存储在其中,以便另一个处理器可以收集它。这样做是否可行,或者是否有更清晰的方式来访问数据?
这是我到目前为止(锁定机制是非常基本的,当我让其余代码工作时将会修复):
internal class Receiver
{
public static List<string> incommingMessagesList = new List<string>();
public static bool fIsDataListLocked = false;
private EventProcessorHost m_EPHClient;
...
Console.WriteLine( "Registering EventProcessor..." );
await m_EPHClient.RegisterEventProcessorAsync<SimpleEventProcessor>();
}
public class SimpleEventProcessor : IEventProcessor
{
...
public Task ProcessEventsAsync( PartitionContext context, IEnumerable<EventData> messages )
{
foreach( var eventData in messages )
{
while( !Receiver.fIsDataListLocked )
{
Receiver.fIsDataListLocked = true ;
Receiver.incommingMessagesList.Add( Encoding.UTF8.GetString( eventData.Body.Array, eventData.Body.Offset, eventData.Body.Count ) );
Receiver.fIsDataListLocked = false ;
}
}
return context.CheckpointAsync();
}
}
更新:
根据要求提供更多信息:
基本上我从管道的两个不同端抽取数据来验证所有消息通过并跟踪它们的吞吐量,一端是eventhub,另一端是来自lwm2m服务器作为HTTP请求。所以我运行一个控制器进程,需要从两端获取数据以清理/分析数据。就像我说的,我是Event Processors的新手,但是对我来说没有意义让EventProcessorHost处理收集两组数据然后清理/分析它。我当然可以改变做那样的事情,但看起来很笨拙。
答案 0 :(得分:1)
在典型情况下,事件处理器以尽可能最快的方式接收并保留数据。多个事件处理器实例将从不同的EventHub分区读取数据。
在您的情况下,您希望将数据发送到其他位置,并将其与该数据的另一个流组合处理。像List这样的内存中集合可能不是最好的方法:
您将需要某种生产者/消费者实施。
一种可能的解决方案是将两个数据流写入单个目标,如Azure存储队列。这样做的主要优点是,当出现故障时,所有数据仍然存在且不会丢失。您的最终处理器可以从队列中以自己的速度读取。