我正在为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中获得永久订阅?
答案 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,该永久订阅者已经运行了数周之久!