代码之家  ›  专栏  ›  技术社区  ›  Piotr Kula David Boike

azure webjobs中的eventstore c客户端

  •  0
  • Piotr Kula David Boike  · 技术社区  · 6 年前

    我正在为net 4.6.1和eventstore.client4.1.1使用webjob模板

    在program.cs中

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

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

    [NoAutomaticTrigger]
    static void ProcessMethod {
    

    我正在使用一个持久连接,这可以作为一个正常的控制台应用程序正常工作。当我试着把它作为WebWork的长时间运行时,EnnStury.Client将连接,有时会得到1个事件,然后断开连接。

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

    代码在using中,例如

    using (var conn = EvenStoreConnection.Create....)))
    {
      con.ConnectAsync().Wait();
    
      con.ConnectToPersistentSubscription(STREAM, GROUP, (_,X) =>
      {
        int en = x.EventNumber;
        ...
    

    我用一段时间(真的)来堵住这条线。这是一个正常的控制台应用程序。

    有什么我需要特别为webjobs做的事情来防止连接中断吗?如果我在本地运行,或者在云中运行,同样的事情也会发生。

    我只是想找到一种方法来订阅事件存储事件,使用某种azure的方法,这样我们就可以监视它。也许我做错了?如何在azure中获得持久订阅?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Piotr Kula David Boike    6 年前

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

    所以关键的选择之一就是 保持预连接()

     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来说是显而易见的 但接下来的两项是行动代表 它处理出现的事件和已断开的可用连接。

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

    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运行数周,没有问题!