如何解决编写为作为服务运行的COM控件的Azure存储总线队列侦听器停止接收,直到用户登录服务器
我编写了一个程序集来接收来自Azure存储总线队列的消息。该程序集被编写为regfree COM控件。它在以称为Clarion for Windows的语言编写的Windows服务中使用。 Windows Server是2016年。 Microsoft.Azure.ServiceBus版本:4.1.4.0 .Net版本4.7.2
该服务在一段时间内成功接收到消息,然后停止接收新消息。该服务也是一个Web服务器,当它没有收到存储总线消息时,我可以成功浏览到该服务器,因此我知道该服务仍在运行。 真正奇怪的是,如果我将远程桌面放入Windows服务器,则消息服务突然开始再次读取消息。我对这项服务没有任何帮助。只是我登录服务器会导致收到消息。 该服务在一个域帐户下运行,该域帐户与我用来远程访问服务器的帐户不同。我还让该服务在本地系统下运行。
时间段差异很大。最近,它运行了3周没有问题,然后在24小时内两次失败。消息量很低,大约每天可能只有十几条。有几天没有任何消息,但这不一定是发生故障的时候。
服务代码非常简单:
public void Initialize(string pServiceBusConnection,string pQueueName)
{
try
{
WriteLog($"Initialize: " + pQueueName);
ServiceBusConnectionString = pServiceBusConnection;
QueueName = pQueueName;
queueClient = new QueueClient(ServiceBusConnectionString,QueueName);
RegisterOnMessageHandlerAndReceiveMessages();
}
catch (Exception e)
{
WriteLog(e.GetType().Name + " : " + e.Message);
}
}
private void RegisterOnMessageHandlerAndReceiveMessages()
{
var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
{
MaxConcurrentCalls = 1,AutoComplete = false
};
WriteLog($"Register the function that will process messages");
queueClient.RegisterMessageHandler(ProcessMessagesAsync,messageHandlerOptions);
}
private async Task ProcessMessagesAsync(Microsoft.Azure.ServiceBus.Message pMessage,CancellationToken pToken)
{
WriteLog($"ProcessMessagesAsync");
//Save off message details and send event back to window saying new data is available.
MsgReceived = JsonConvert.DeserializeObject<ReceiveStatusUpdate>(Encoding.UTF8.GetString(pMessage.Body));
WriteLog($"Received message: SequenceNumber:{pMessage.SystemProperties.SequenceNumber} Body:{MsgReceived.LoanNumber}");
LoanNumber.Text = MsgReceived.LoanNumber;
SigningStatus.Text = MsgReceived.SigningStatus;
LocationId.Text = MsgReceived.LocationId.ToString();
try
{
Invoke((Action)(() => MessageReceived(Encoding.UTF8.GetString(pMessage.Body))));
}
catch (Exception e)
{
WriteLog(e.GetType().Name + " : " + e.Message);
}
await queueClient.CompleteAsync(pMessage.SystemProperties.LockToken);
}
private Task ExceptionReceivedHandler(ExceptionReceivedEventArgs arg)
{
WriteLog(arg.Exception.GetType() + ":" + arg.Exception.Message);
throw arg.Exception;
}
不记录任何错误消息或异常。 有谁知道可能会发生什么导致消息停止接收? 我正在考虑定期停止侦听线程并重新启动它。迁移到服务器会影响侦听服务,这一事实非常令人困惑。
我还有其他信息可解决此问题。
首先,我将Azure Service总线程序集更新为最新的5.0。
其次,我完全用C#.Net重新编写了服务,从而从公式中消除了号角。
新服务仍然会发生错误,并且在移入服务器并登录时仍会自行解决。
这是抛出的异常。
Microsoft.Azure.ServiceBus.ServiceBusCommunicationException:现有连接被远程主机强行关闭错误代码:ConnectionReset
现在在我的代码中,当发生异常时,我将关闭侦听器并创建一个新的QueueClient。但是,一旦服务处于此“错误”状态,新的QueueClient将失败,并显示相同的错误。 直到我登录服务器后,“错误”状态才消失,并且服务再次开始读取队列消息。
此外,我要指出的是,此时我的邮件数量非常少。一天最多可能20次。在解决此问题之前,我们不会扩大规模。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。