RabbitMQ, EasyNetQ avec NodeJS (amqplib) – S’abonner

J’avais déjà posé cette question concernant la publication d’amqplib -> EasyNetQ, et je l’avais fait fonctionner avec l’aide de l’auteur de EasyNetQ.

Maintenant, j’ai du mal à aller dans l’autre sens.

Cela a fonctionné brièvement, mais ensuite je suis revenu et j’ai nettoyé toutes les files d’attente que j’avais créées et maintenant – ça ne marche pas (la publication d’amqplib vers ENQ fonctionne toujours, mais ENQ vers amqplib ne fonctionne pas).

Si j’ai ce code:

Bus.SubscribeAsync(HollaSubID_1, msg => Task.Factory.StartNew(() => { Console.WriteLine("LOOK===> Received Manifest Holla ID {0}", msg.ManifestID.ToSsortingng()); Console.WriteLine("LOOK===> Responding with Manifest Yo ID {0}", HollaSubID_1); Bus.PublishAsync(new BusManifestYo { ManifestID = msg.ManifestID, ServiceName = HollaSubID_1 }); }) ); 

De quoi ai-je besoin pour twigr le nœud / amqplib ci-dessous pour le souscrire / le consumr?

 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.toSsortingng())); var bmy: dto.interfaces.IBusManifestYo = JSON.parse(msg.content.toSsortingng()); channel.ack(msg); }); }); }); }); }); 

METTRE À JOUR

Si j’ai EasyNetQ, créez d’abord la file d’attente (sur laquelle il publiera), puis supprimez l’appel ‘assertQueue’ dans Node (pour ne pas vider la file d’attente), puis suivez les conventions de dénomination. Bien sûr, ce n’est pas une vraie solution, mais peut-être que ça aidera quelqu’un à trouver une solution?

MISE À JOUR # 2

Eh bien, apparemment, j’avais besoin de lier la queue à l’échange. Voici le nouveau code de travail:

 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.toSsortingng())); var bmy: dto.interfaces.IBusManifestYo = JSON.parse(msg.content.toSsortingng()); channel.ack(msg); }); }); }); }); }); }); 

Une chose que je ne comprends pas bien, c’est où j’ai placé le motif sur le lien avec ‘#’. Cela fonctionne, mais je ne l’ai dit que parce que j’ai vu ENQ l’utiliser, et que d’autres valeurs ne semblent pas fonctionner, alors …

    EasyNetQ a ses propres conventions d’échange de liaison de queue. Lorsqu’il s’abonne, il fait ce que vous avez découvert:

    1. Crée un échange de sujet nommé d’après le type de message.
    2. Crée une queue nommée d’après le type de message plus l’ID d’abonnement.
    3. Les lie avec la clé de liaison ‘#’.

    La raison pour laquelle il utilise un échange de sujet (plutôt que direct) est de prendre en charge le routage de sujet. C’est pourquoi nous lions avec une liaison ‘#’ (donnez-moi tout). Si vous ne publiez pas avec un sujet, le message est publié avec une clé de routage vierge, qui ne sera acheminée que vers des liaisons “#”.

    J’espère que ça aide.