C# ActiveMQ NMS使用者在C中的某些场景下未接收消息#

C# ActiveMQ NMS使用者在C中的某些场景下未接收消息#,c#,activemq,C#,Activemq,ActiveMQ NMS使用者(C#)无法接收旧消息:我的C#程序将在一个while循环中对接收到的消息进行操作 每当我需要消息并对接收到的消息进行操作时,我都会建立NMS用户连接 问题是,每当我启动程序并在程序第一次连接尝试后发布消息时,我都可以下载/使用它们 但是,如果没有消息流入,并且在建立第一个连接之前我有一些旧消息,则这些消息不会被使用。我使用了正确的连接。start()。我使用的是consumer.receive(0)0-waittime。任何时候,如果您在没有超时的情况下调用con

ActiveMQ NMS使用者(C#)无法接收旧消息:我的C#程序将在一个while循环中对接收到的消息进行操作

每当我需要消息并对接收到的消息进行操作时,我都会建立NMS用户连接

问题是,每当我启动程序并在程序第一次连接尝试后发布消息时,我都可以下载/使用它们


但是,如果没有消息流入,并且在建立第一个连接之前我有一些旧消息,则这些消息不会被使用。我使用了正确的
连接。start()
。我使用的是consumer.receive(0)0-waittime。

任何时候,如果您在没有超时的情况下调用consumer-receive,您都会面临无法收到消息的风险,必须为此做好准备。消费者不会在呼叫接收时向代理查询消息,因此如果尚未发送消息或消息仍在传输中,则接收将返回空消息


在每次获取消息的尝试中创建一个新的连接实际上是一种反模式,您应该考虑使用长寿命的连接/消费者来避免这种情况,尽管在您正在接收(0)时不能完全减轻这一点。

NNS消费者示例包含以下行:

// Consume a message
ITextMessage message = consumer.Receive() as ITextMessage;
运行此代码时,使用者可能会返回
null
(但不会)

这里的问题是
consumer.Receive()
返回的
IMessage
类型并不总是
ITextMessage
。在我的例子中,它返回类型完全不同的
ActiveMQBytesMessage
,并将其转换为
中的
ITextMessage
,因为ITextMessage
返回null

以下代码更适合作为示例:

// Consume a message
IMessage message = consumer.Receive();

非常感谢。正如你所说的,为每封邮件建立和断开连接不是一个好的设计,我尝试将其更改为永久性的。我解决了这个问题,添加了2秒的等待作为接收(2秒),它工作了。它并不是每次收到返回的消息都要等待整整2秒钟。如果没有消息,它将等待2秒钟。