0

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

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

[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 中获得持久订阅?

4

1 回答 1

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,这个持久订阅者已经运行了数周而没有出现问题!

于 2018-07-11T14:38:30.910 回答