我已经问过这个关于从amqplib发布的问题 - > EasyNetQ,并得到了EasyNetQ作者的帮助。
现在,我很难走另一条路。
它简单地做了#34;工作",然后我回去清理了我创建的所有队列现在 - 它不会工作(从amqplib发布到ENQ仍然有效,但ENQ到amqplib没有。
如果我有这段代码:
Bus.SubscribeAsync<BusManifestHolla>(HollaSubID_1,
msg => Task.Factory.StartNew(() => {
Console.WriteLine("LOOK===> Received Manifest Holla ID {0}", msg.ManifestID.ToString());
Console.WriteLine("LOOK===> Responding with Manifest Yo ID {0}", HollaSubID_1);
Bus.PublishAsync(new BusManifestYo { ManifestID = msg.ManifestID, ServiceName = HollaSubID_1 });
})
);
我需要在下面的Node / amqplib中插件来订阅/使用它吗?
Play.AMPQ.then((connection) => {
return connection.createChannel().then((channel) => {
return channel.assertExchange(dto.BusManifestYo.Type, 'topic', { durable: true, autoDelete: false }).then((okExchangeReply) => {
return channel.assertQueue(dto.BusManifestYo.Type).then((ok) => {
return channel.consume(ok.queue, (msg) => {
console.log(util.format('Received message: %s', msg.content.toString()));
var bmy: dto.interfaces.IBusManifestYo = JSON.parse(msg.content.toString());
channel.ack(msg);
});
});
});
});
});
更新
如果我有EasyNetQ首先创建队列(它将发布到),然后删除&#39; assertQueue&#39;在Node中调用(因此它不会阻塞队列),然后遵循命名约定 - 它可以工作。当然,这不是一个真正的解决方案,但它可能会帮助某人指出解决方案吗?
更新#2
好吧,显然我需要将队列绑定到交换机。这是新的工作代码:
Play.AMPQ.then((connection) => {
return connection.createChannel().then((channel) => {
channel.on('error', Play.handleChannelError);
return channel.assertQueue(dto.BusManifestYo.Type + '_Node', { durable: true, exclusive: false, autoDelete: false }).then((okQueueReply) => {
return channel.assertExchange(dto.BusManifestYo.Type, 'topic', { durable: true, autoDelete: false }).then((okExchangeReply) => {
return channel.bindQueue(dto.BusManifestYo.Type + '_Node', dto.BusManifestYo.Type, '#').then((okBindReply) => {
return channel.consume(dto.BusManifestYo.Type + '_Node', (msg) => {
console.log(util.format('Received message: %s', msg.content.toString()));
var bmy: dto.interfaces.IBusManifestYo = JSON.parse(msg.content.toString());
channel.ack(msg);
});
});
});
});
});
});
我不清楚的一件事是我将绑定模式设置为&#39;#&#39;。它起作用,但我只是因为我看到ENQ使用它,而其他价值似乎不起作用......
答案 0 :(得分:1)
EasyNetQ拥有自己的交换绑定队列约定。当它订阅时,它就像你发现的那样:
它使用主题交换(而不是直接)的原因是支持主题路由,这就是为什么我们绑定'#'(给我一切)绑定。如果不使用主题发布,则使用空白路由键发布消息,并且只会将其路由到“#”绑定。
我希望这会有所帮助。