Azure WebJobs 中的 EventStore C# 客户端

EventStore C# Client in Azure WebJobs

我正在使用 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;

并且我在函数 class 中创建了一个 public 函数,例如

[NoAutomaticTrigger]
static void ProcessMethod {

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

Close Reason: [Success] Connection close requested by client.

代码在使用中如

using (var conn = EvenStoreConnection.Create....)))
{
  con.ConnectAsync().Wait();

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

我使用 while(true) 来阻塞线程。这作为一个普通的控制台应用程序。

我需要专门为 WebJobs 做些什么来防止连接中断吗?如果我 运行 在本地或在云端,同样的事情会发生。

我只是想找到一种方法来使用某种 Azure 方式来订阅事件存储事件,以便我们可以对其进行监控。也许我做错了吗?如何获得在 Azure 中工作的永久订阅?

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

所以关键选项之一是使用 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<> Delegates,它们处理出现的 Event 和有用的 Connection dropped。

在那种情况下,为了更好地衡量,我处理连接关闭的方法如下所示

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!