Azure WebJobs中的EventStore C#客户端

时间:2018-06-19 14:09:03

标签: .net azure azure-webjobs get-event-store

我正在为Net 4.6.1和EventStore.Client 4.1.1使用WebJob模板

在Program.cs

var host = new jobHost(config);
host.Call(typeof(Functions).GetMethod("Processmethod"));
host.RunAndBlock;

我已经在Function类中创建了一个公共函数,例如

[NoAutomaticTrigger]
static void ProcessMethod {

我使用的是持久连接,可以正常使用控制台应用程序。当我尝试使其长期作为WebJob运行时,EvernStore.Client将连接,有时可能会收到1个事件,然后断开连接。

  

关闭原因:[成功]客户端请求关闭连接。

代码在诸如

的用法中
using (var conn = EvenStoreConnection.Create....)))
{
  con.ConnectAsync().Wait();

  con.ConnectToPersistentSubscription(STREAM, GROUP, (_,X) =>
  {
    int en = x.EventNumber;
    ...

我使用while(true)阻塞线程。这可以用作普通的控制台应用程序。

我是否需要为WebJobs做一些特别的事情以防止连接丢失?如果我在本地或云中运行它,则会发生同样的事情。

我只是想尝试使用某种Azure方式来订阅事件存储事件,以便我们对其进行监视。我可能做错了吗?如何在Azure中获得永久订阅?

1 个答案:

答案 0 :(得分:0)

客户端似乎会根据各种内部事件(例如异常或错误)断开连接。

因此,关键选项之一是使用 KeepReconnecting()

 var settings = ConnectionSettings
           .Create()
           .KeepReconnecting()
           .KeepRetrying()
           //.EnableVerboseLogging()
           .UseConsoleLogger();

这本身将防止客户端退出并应重新连接。因此,实际的连接代码将如下所示:

  _subscription = _conn.ConnectToPersistentSubscription(STREAM, GROUP,
      (_base, _event) => { EventAppeared(_base, _event); },
      (_base, _reason, _exception) => { SubscriptionDropped(_base, _reason, _exception); },
      User, bufferSize, autoAck);

对于我曾经使用过的.NET类型的客户端连接,这有点不寻常。对于STREAM和GROUP ,发生的事情非常明显,但接下来的两个是Action <>代表,它们处理出现的事件并断开有用的连接。

在那种情况下,我的处理关闭连接的方法看起来像这样

private void SubscriptionDropped(EventStorePersistentSubscriptionBase eventStorePersistentSubscriptionBase, SubscriptionDropReason subscriptionDropReason, Exception ex)
{
   Console.WriteLine($"**** Connection dropped reason? '{subscriptionDropReason}' exception? '{ex.Message}'- Reconnecting ...");
   ConnectToSubscription();
}

并且事件出现了

private static void EventAppeared(EventStorePersistentSubscriptionBase eventStorePersistentSubscriptionBase, ResolvedEvent resolvedEvent)
{
    var x = resolvedEvent;
    ... your code
}

作为AppService WebJob,该永久订阅者已经运行了数周之久!