使用NodeJS的RabbitMQ,EasyNetQ?

时间:2014-05-08 00:47:54

标签: node.js rabbitmq node-amqp easynetq

我试图了解整合这些技术的合理性。我如何在RabbitMQ到EasyNetQ之间集成NodeJS(目前使用amqplib,但可以更改)?

我有点工作,除了EasyNetQ期待一个对象(我认为),Node / amqplib只能发送字符串。

C#代码:

Bus.Subscribe<BusManifestHolla>(HollaID,
    msg => {
        Console.WriteLine("Received Manifest Holla ID {0}", msg.ManifestID.ToString());
        Console.WriteLine("Responding with Manifest Yo ID {0}", YoID_1);
        Bus.Publish(new BusManifestYo { ManifestID = msg.ManifestID, ServiceName = YoID_1 });
    }
);

NodeJS代码:

var b = new Buffer(JSON.stringify(new dto.BusManifestHolla(uuid.v4())));
ch.publish(Play.exchangeName, '#', b);

结果:

DEBUG: HandleBasicDeliver on consumer: a60b7760-e22f-4685-9f65-039bef19f58c, deliveryTag: 1
DEBUG: Recieved
    RoutingKey: '#'
    CorrelationId: ''
    ConsumerTag: 'a60b7760-e22f-4685-9f65-039bef19f58c'
    DeliveryTag: 1
    Redelivered: False
ERROR: Exception thrown by subscription callback.
    Exchange:    'RabbitMon.BusManifestHolla:RabbitMon'
    Routing Key: '#'
    Redelivered: 'False'
Message:
{"Guid":"a6cf174d-9b77-4558-bbda-efe9d8451dff"}
BasicProperties:
ContentType=NULL, ContentEncoding=NULL, Headers=[], DeliveryMode=0, Priority=0,    CorrelationId=NULL, ReplyTo=NULL, Expiration=NULL, MessageId=NULL, Timestamp=0, Type=NULL, UserId=NULL, AppId=NULL, ClusterId=
Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
   at EasyNetQ.TypeNameSerializer.DeSerialize(String typeName)
   at EasyNetQ.RabbitAdvancedBus.<>c__DisplayClass16.<Consume>b__15(Byte[] body, MessageProperties properties, MessageReceivedInfo messageRecievedInfo)
   at EasyNetQ.Consumer.HandlerRunner.InvokeUserMessageHandler(ConsumerExecutionContext context)

没有办法在公交车上发送物品吗?你如何整合这两个?

1 个答案:

答案 0 :(得分:2)

它在TypeNameSerializer.DeSerialize调用上失败了。在您的节点代码中,您需要使用EasyNetQ在另一端应该具有的类型填充BasicProperties.Type。这需要是一个完全限定的名称,包括程序集名称。只需看看EasyNetQ给你的BusManifestHolla队列减去HollaID值(和下划线)的名称。

不可否认,错误信息并非有用。它可能会得到改善。