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