背景:
ActiveMQ/JSON を介して Linux で実行されている Java サーバーと通信する C# WPF アプリケーション
接続の合計 5 インスタンス:
キュー: 2
トピック: 3 (1 プロデューサー、2 コンシューマー)
問題:
頻繁に使用すると (500 ミリ秒未満で約 200 件のメッセージを送受信するスループット レートと、約 1 ~ 1.2 GB のメモリ ワーキング セット)、「確立された接続がホスト マシンのソフトウェアによって中止されました」がスローされます。
サンプルスタック:
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()
これまでに試した:
- 非アクティブ モニタリングをオフにして、5 つの接続間のトラフィックを減らしました。ほとんどの場合、アプリケーションには独自のハートビート実装があるためです。
- ConnectionFactory.OptimizeAcknowledge を true に設定して、確認をバッチ処理します