这个问题通常发生在使用ActiveMQ和Apache.NMS时,当从队列中读取消息并将其转换为IBytesMessage时,消息可能会在消息体之前具有前缀。
解决此问题的一种方法是使用Marshal类中的Unmarshal方法将消息转换为字节数组,然后将字节数组转换为文本,如下所示:
using Apache.NMS; using Apache.NMS.Util; using System.Text;
//从队列中读取消息并将其转换为IBytesMessage IBytesMessage message = (IBytesMessage)consumer.Receive();
//使用Marshal类中的Unmarshal方法将消息转换为byte数组 byte[] messageBytes = message.Content as byte[];
//将byte数组转换为文本 string messageText = Encoding.UTF8.GetString(messageBytes, 0, messageBytes.Length);
//现在,消息文本中不会有前缀。 Console.WriteLine(messageText);
另一种解决方法是使用TextMessage而不是IBytesMessage。只需将以下行更改到代码中:
ITextMessage message = (ITextMessage)consumer.Receive();
现在,您可以像处理其他文本消息一样处理消息文本,并且不会有任何前缀。