C# Apache NMS抛出一个已建立的连接,该连接被主机中的软件在大量使用时中止

C# Apache NMS抛出一个已建立的连接,该连接被主机中的软件在大量使用时中止,c#,.net,activemq,nms,apache-nms,C#,.net,Activemq,Nms,Apache Nms,背景: C WPF应用程序通过ActiveMQ/JSON与linux上运行的JAVA服务器对话 共有5个连接实例: 排队人数:2人 主题:3 1生产者,2消费者 问题: 在高使用吞吐量的情况下,在不到500毫秒的时间内发送/接收约200条消息,内存工作集约为1-1.2 GB,抛出“已建立的连接被主机中的软件中止” 样本堆栈: 迄今为止: 关闭不活动监视以减少5个连接之间的通信量。主要是因为应用程序有自己的心跳实现。 将ConnectionFactory.OptimizeAcknowledge设置

背景: C WPF应用程序通过ActiveMQ/JSON与linux上运行的JAVA服务器对话 共有5个连接实例: 排队人数:2人 主题:3 1生产者,2消费者

问题: 在高使用吞吐量的情况下,在不到500毫秒的时间内发送/接收约200条消息,内存工作集约为1-1.2 GB,抛出“已建立的连接被主机中的软件中止”

样本堆栈:

迄今为止:

关闭不活动监视以减少5个连接之间的通信量。主要是因为应用程序有自己的心跳实现。 将ConnectionFactory.OptimizeAcknowledge设置为true以批处理确认
在我看来,这是在任何网络场景中都可以预料到的事情。在这种情况下,由于各种原因,例如服务器太忙,无法及时响应,客户端缓冲区太满,无法及时确认,连接会断开。通常,如果断开连接的端点未脱机,则重试(有时使用指数退避延迟来提供喘息空间)将解决此问题。我想这是ActiveMQ所能做的。谢谢你。已通过批处理确认来增加超时和客户端缓冲区已满的情况,解决了服务器太忙的情况。当抛出此特定错误时,端点始终处于联机状态,并且确实有一个重新连接逻辑,可以在不到几秒钟的时间内很好地重新连接。令人恼火的是,它会影响任何基于用户的交互,而这些交互只能手动恢复!在使用Apache.NMS.ActiveMQ源代码时,注意到KeepAliveInfo消息在服务器->客户机->服务器上不断流动,即使在关闭不活动监视后也是如此,因为它在TCP级别使用。将尝试在服务器代理上设置keepAlive=false,并查看这是否会减少任何负载每20秒额外增加10条消息增加缓冲区/减少通信量可能只会在负载增长时出现此问题时才会延迟。如果一个基本上可恢复的临时连接断开,导致必须通过某种形式的手动干预恢复用户交互,我假设是通过将一条消息从死信队列移回处理队列,这是一个您必须解决的设计问题。请参阅您关于重新设计的观点。中断实际上并不需要管理员干预来恢复正在进行的工作流,因为它是从最后一次保留的位置自动恢复的,但它确实会阻止用户执行任何不能完全自动执行的新请求。关于断开,想知道是否可以以某种方式预期,在这种情况下,流量可以动态调节。Understand可以使用某种逻辑来跟踪吞吐量,当吞吐量接近通过容量测试确定的某个预定义阈值时,可以限制流量。
Apache.NMS.NMSException: Unable to read data from the transport connection: An established connection was aborted by the software in your host machine. ---> System.IO.IOException: Unable to read data from the transport connection: An established connection was aborted by the software in your host machine. ---> System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.IO.BufferedStream.Read(Byte[] array, Int32 offset, Int32 count)
   at System.IO.BinaryReader.FillBuffer(Int32 numBytes)
   at System.IO.BinaryReader.ReadInt32()
   at Apache.NMS.Util.EndianBinaryReader.ReadInt32()
   at Apache.NMS.ActiveMQ.OpenWire.OpenWireFormat.Unmarshal(BinaryReader dis)
   at Apache.NMS.ActiveMQ.Transport.Tcp.TcpTransport.ReadLoop()