我编写了一个程序集来接收来自 Azure 存储总线队列的消息。该程序集被编写为无 regfree COM 控件。它用于以 Clarion for Windows 语言编写的 Windows 服务。Windows Server 是 2016。Microsoft.Azure.ServiceBus 版本:4.1.4.0 .Net 版本 4.7.2
服务成功接收消息一段时间后停止接收新消息。该服务也是一个网络服务器,当它没有接收到存储总线消息时,我可以成功浏览到服务器,所以我知道该服务仍在运行。真正奇怪的是,如果我将桌面远程连接到 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 服务总线程序集更新到最新的 5.0。其次,我完全在 C# .Net 中重新编写了服务,从等式中消除了 Clarion。新服务仍然会出现错误,并且在远程进入服务器并登录时仍然会自行解决。这是抛出的异常。
Microsoft.Azure.ServiceBus.ServiceBusCommunicationException:现有连接被远程主机强制关闭错误代码:ConnectionReset
现在在我的代码中,当异常发生时,我将关闭我的侦听器并创建一个新的 QueueClient。但是,一旦服务处于这种“错误”状态,新的 QueueClient 就会失败并出现同样的错误。直到我登录服务器,“错误”状态才消失,服务再次开始读取队列消息。
另外,我应该提一下,此时我的消息数量非常少。大概一天最多20个。在我们解决这个问题之前,我们不会扩大规模。