C# 为什么我的流被同行关闭?

C# 为什么我的流被同行关闭?,c#,.net,stomp,nms,apache-nms,C#,.net,Stomp,Nms,Apache Nms,我有以下控制台程序,用于侦听ActiveMQ Stomp服务器上的目标(队列或主题,这无关紧要),并将收到的消息简单地记录到控制台: using System; using Apache.NMS.Stomp; using Apache.NMS; using Apache.NMS.Util; namespace StompTest { class Program { static void Main(string[] args) {

我有以下控制台程序,用于侦听ActiveMQ Stomp服务器上的目标(队列或主题,这无关紧要),并将收到的消息简单地记录到控制台:

using System;
using Apache.NMS.Stomp;
using Apache.NMS;
using Apache.NMS.Util;

namespace StompTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var connectionFactory = new ConnectionFactory("stomp:tcp://mybroker:61613");

                var connection = connectionFactory.CreateConnection();
                connection.ExceptionListener += new ExceptionListener(connection_ExceptionListener);
                connection.Start();

                var session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);

                IDestination dest = SessionUtil.GetDestination(session, "queue://MyQueue");

                var consumer = session.CreateConsumer(dest);
                consumer.Listener += new MessageListener(consumer_Listener);

                Console.ReadKey();
            }
            catch (NMSException ex)
            {
                Console.WriteLine("NMSException !! ==> " + ex.Message);
            }
        }

        static void connection_ExceptionListener(Exception exception)
        {
            Console.WriteLine("Exception!! ==> " + exception.ToString());
        }

        static void consumer_Listener(IMessage message)
        {
            var textMessage = message as ITextMessage;
            if (textMessage == null)
                Console.WriteLine("No ITextMessage...");
            else
                Console.WriteLine("Received => " + textMessage.Text);
        }
    }
}
当我启动它时,只要我继续发送消息,它就可以正常工作。但是当有30秒的不活动时,我会得到一个例外。即使不向队列发送消息,也会发生这种情况:

异常!!=>Apache.NMS.Stomp.IOException:对等方关闭了流。
在c:\d中的Apache.NMS.Stomp.Protocol.StompFrame.ReadLine(BinaryReader数据输入)处
ev\NMS.Stomp\src\main\csharp\Protocol\StompFrame.cs:第284行
在Apache.NMS.Stomp.Protocol.StompFrame.ReadCommandHeader(BinaryReader dataIn
)在c:\dev\NMS.Stomp\src\main\csharp\Protocol\StompFrame.cs中:第208行
在c中的Apache.NMS.Stomp.Protocol.StompFrame.FromStream(BinaryReader数据输入)中:
\dev\NMS.Stomp\src\main\csharp\Protocol\StompFrame.cs:第197行
在Apache.NMS.Stomp.Protocol.StompWireFormat.Unmarshal(BinaryReaderDataIn)i
n c:\dev\NMS.Stomp\src\main\csharp\Protocol\StompWireFormat.cs:第121行
在c:\dev\NMS.Stomp中的Apache.NMS.Stomp.Transport.Tcp.tcpttransport.ReadLoop()处
\src\main\csharp\Transport\Tcp\tcpttransport.cs:第279行
通过谷歌搜索和阅读Apache.NMS源代码,我发现它必须与'InactivityMonitor'有关,显然,当我在连接字符串上指定参数
transport.useInactivityMonitor=false
时,我没有得到异常,一切都正常运行

但据我所知,不活动监视器有一个目的:确保“死”连接被检测并正确清理

所以一定是出了什么问题!我在上面的代码中添加了一个简单的控制台跟踪器,这是连接时不使用
transport.useInactivityMonitor=false
参数时的输出:

Info:连接到:tcp://mybroker:61613/
调试:打开端口61613上mybroker的套接字
调试:使用互联网协议连接到mybroker:61613。
调试:创建非活动监视器:1
调试:StompWireFormat-封送:ConnectionInfo[ConnectionId=ID:mypc-309
6-634896376801461632-0:0,主机=mybroker,MaxInactivityDuration=30000,ReadChec
kInterval=30000,WriteCheckKinterval=10000,MaxInactivityDurationInitialDelay=0,
ClientId=ID:mypc-3096-634896376801461632-1:0,密码=,用户名=]
调试:StompWireFormat-写入StompFrame[Command=CONNECT,Properties={heart]
-beat=100003000客户id=id:mypc-3096-634896376801461632-1:0接受版本
on=1.0,1.1 host=mybroker},Content=]
调试:StompWireFormat-收到StompFrame[Command=CONNECTED,Properties={ve
rsion=1.1服务器=ActiveMQ/5.6.0会话=ID:mypc-3096-634896376801461632-1:0
心跳=0,0},内容=System.Byte[]
调试:不活动监视器[1]:读取检查时间间隔:30000
调试:InactivityMonitor[1]:初始延迟时间间隔:10000
调试:InactivityMonitor[1]:写检查时间间隔:10000
调试:不活动监视器[1]:启动监视器计时器。
调试:StompWireFormat-收到StompFrame[Command=KEEPALIVE,Properties={},
内容=]
调试:InactivityMonitor[1]:在->18:28:00.419收到新的保持活动状态
调试:StompWireFormat-封送:ConsumerInfo[ConsumerId=ID:mypc-3096-63
4896376801461632-0:0:1:1,目的地=queue://MyQueue,确认模式=自动确认,
PrefetchSize=1000,MaximumPendingMessageLimit=0,DispatchAsync=True,Selector=,
SubscriptionName=,NoLocal=False,Exclusive=False,Retroactive=False,Priority=
0,转换]
调试:StompWireFormat-写入StompFrame[Command=SUBSCRIBE,Properties={id=
ID:mypc-3096-634896376801461632-0:0:1:1收据=2 activemq.dispatchAsync=Tru
e activemq.maximumPendingMessageLimit=0 activemq.priority=0 ack=client activemq。
prefetchSize=1000 transformation=jms xml destination=/queue/MyQueue},Content=]
调试:StompWireFormat-收到的StompFrame[命令=接收,属性={rece]
ipt id=2},Content=System.Byte[]
调试:StompWireFormat-收到StompFrame[Command=KEEPALIVE,Properties={},
内容=]
调试:InactivityMonitor[1]:在->18:28:00.508收到新的保持活动状态
调试:检查连接:计时器于2012年11月27日18:28:10运行
调试:InactivityMonitor[1]:自上次写检查以来发送的消息。重置标志
.
调试:InactivityMonitor[1]:接收正在进行或已失败。
调试:检查连接:计时器于2012年11月27日18:28:20运行
调试:InactivityMonitor[1]:自上次写检查以来未发送任何消息。发送K
eepAliveInfo。
调试:不活动监视器[1]:当前不允许进行读取检查。
调试:不活动监视器[1]正在进行另一次写入检查
调试:不活动监视器[1]需要写检查发送KeepAlive。
调试:StompWireFormat-封送:KeepAliveInfo[commandId=0,responseRequi
红色=假,]
调试:StompWireFormat-编写StompFrame[Command=KEEPALIVE,Properties={},C
内容=]
调试:检查连接:计时器在2012年11月27日18:28:30运行
调试:InactivityMonitor[1]:自上次写检查以来未发送任何消息。发送K
eepAliveInfo。
调试:不活动监视器[1]:当前不允许进行读取检查。
调试:不活动监视器[1]正在进行另一次写入检查
调试:不活动监视器[1]需要写检查发送KeepAlive。
调试:StompWireFormat-封送:KeepAliveInfo[commandId=0,responseRequi
红色=假,]
调试:StompWireFormat-编写StompFrame[Command=KEEPALIVE,Properties={},C
内容=]
调试:在非活动监视器中收到异常:Apache.NMS.Stomp.IOExceptio
n:Peer关闭了这条流。
在c:\d中的Apache.NMS.Stomp.Protocol.StompFrame.ReadLine(BinaryReader数据输入)处
ev\NMS.Stomp\src\main\csharp\Protocol\StompFrame.cs:第284行
在Apache.NMS.Stomp.Protocol.StompFrame.ReadCommandHeader(BinaryReader dataIn
)在c:\dev\NMS.Stomp\src\main\csharp\Protocol\StompFrame.cs中:第208行
在c中的Apache.NMS.Stomp.Protocol.StompFrame.FromStream(BinaryReader数据输入)中:
\dev\NMS.Stomp\src\main\csharp\Protocol\StompFram
var connectionFactory = new ConnectionFactory("stomp:tcp://mybroker:61613");
var connectionFactory = new ConnectionFactory("failover:tcp://mybroker:61613");