编写为作为服务运行的COM控件的Azure存储总线队列侦听器停止接收,直到用户登录服务器

如何解决编写为作为服务运行的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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?