如何以long(数据类型)的形式向activemq有效负载发送消息?

时间:2014-05-14 09:33:20

标签: .net activemq nms apache-nms


我使用.NET 3.5将消息发送到活动mq,我有一个java侦听器,它从队列中处理这些消息。

标题包含

userId - long
type - string
isAdd-bool

监听器期望有效负载的数据类型为long。所以我应该在有效载荷中发送长数据类型。

以下是我用于将消息发布到活动mq的代码。

string payLoad = "123";    
IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");
                    using (IConnection connection = factory.CreateConnection())
                    {
                        using (ISession session = connection.CreateSession())
                        {
                            IDestination destination = Apache.NMS.Util.SessionUtil.GetDestination(session
                                , "Message.AddUser");
                            using (IMessageProducer producer = 

session.CreateProducer(destination))
                            {
                            // Start the connection so that messages will be processed.
                            connection.Start();

                            //here i need to pass payload as datatype "long"
                            ITextMessage request = session.CreateTextMessage(payLoad);
                            request.Properties["userid"] = 123;
                            request.Properties["type"] = "USER";
                            request.Properties["isAdd"] = true;
                            producer.Send(request);

                        }

                    }
                }

目前根据代码,我发送字符串作为有效负载。

 ITextMessage request = session.CreateTextMessage(payLoad);

如何更改此代码以将有效负载作为数据类型发送多长时间?我试图将有效载荷作为对象发送。但是当听众选择此消息时我收到错误。错误:无效的流标头已损坏。

根据评论,我使用了IStreamMessage

            int userId = 123;
            IStreamMessage message = session.CreateStreamMessage()
            message.WriteInt64((long)idToUpdate);
            message.Properties.SetLong("userId", (long)userId);
            message.Properties.SetString("type", "USER");
            message.Properties.SetBool("isDelete", true);

然后我看了tomcat日志,这就是我能看到的,Header在这里缺失了。我只有Payload

[Payload=ActiveMQStreamMessage {commandId = 5, responseRequired = true, messageId = ID:XXXXX-60790-
stamp=1400070001928, jms_redelivered=false, userId=123, type=USER, jms_messageId=ID:XXXXX-60790-635356865723233336-0:0:1:2:1}]

由于这不起作用,我尝试使用ITextMessage。

int userId = 123;
ITextMessage request = session.CreateTextMessage();
request.Text = idToUpdate.ToString();
request.Properties["companyId"] = (long)userId;
request.Properties["type"] = "USER";
request.Properties["isDelete"] = true;

以下是我在日志中可以看到的内容。

[Payload=46][Headers={timestamp=1400072608501, id=dde638d2-4036-4e81-a3c8-97937ac11087, isDelete=true, jms_timestamp=1400072608280, jms_redelivered=false, userId=1, type=USER, jms_messageId=ID:xxxx-53593-635356892076410652-0:0:1:2:1}]

我正在使用Sprint Integration并且监听器期望List作为输入参数

public void updateUser(Message<List<Long>> message) {
    Long userId = (Long) message.getHeaders().get("userId");    
    for (Long userId : message.getPayLoad()) { // exception is thrown here "Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long"
        //doing somethign here with userid
    }
}

如何发送长数据类型的有效负载?

2 个答案:

答案 0 :(得分:0)

您可以使用ObjectMessage而不是TextMessage。

见这里:

http://docs.oracle.com/javaee/6/api/javax/jms/ObjectMessage.html

答案 1 :(得分:0)

您有多种选择可以实现它。

  • 你可以使用BytesMessage并使用对longs进行操作的读/写方法,但是那里没有类型检查,所以要确保你的客户端都做正确的事。
  • 您可以使用具有读/写功能的StreamMessage,并根据需要检查类型并根据需要进行某些类型的转换。
  • 您可以使用MapMessage并将long存储在键/值映射中。
  • 您可以使用标准Java代码将TextMessage的文本解析为long。

你不能在.NET和Java之间真正使用ObjectMessage,在这种情况下你也不想这样,因为它是一个简单的原始类型。