【问题标题】:Using RabbitMQ with Ruby and Node.js apps?将 RabbitMQ 与 Ruby 和 Node.js 应用程序一起使用?
【发布时间】:2014-02-20 14:33:08
【问题描述】:

我在 Rails 中使用 Bunny gem,在 Node.js 中使用 AMQP。 Rails 是发布者,Node.js 应用程序是订阅者。

来自 Rails 的代码:

conn = Bunny.new
conn.start

ch = conn.create_channel
x = Bunny::Exchange.new(ch, :direct, "messenger")
q1 = ch.queue("new_messages").bind(x, :routing_key => 'send')
x.publish('hi', :routing_key => 'send')

来自 Node.js 的代码:

var amqp = require('amqp');

var connection = amqp.createConnection();

connection.addListener('ready', function(){
    var exchange = connection.exchange('messenger');
    var queue = connection.queue('new_messages')

    queue.bind('messenger', 'send')

    queue.subscribe( {ack:true}, function(message){
        console.log(message.data.toString())
        queue.shift()
    });
});

从管理插件中,我可以看到 Rails 代码运行良好,但来自 Node.js 的代码没有意义。

我的错误在哪里?

【问题讨论】:

  • “messanger”(Ruby)/“messenger”(node.js)是错字吗?
  • 这不是一个真正的答案,所以我正在使用评论,但如果它有帮助,请告诉我。使用 Redis 在 Ruby 和 Node 之间发送消息有一种更简单的方法。 Redis API 更容易理解,在 Ruby 和 Node.js 中有很好的客户端,你可以在互联网上以每月 5 美元的价格找到基本计划的服务提供商。你想要的命令是 rpoplpush redis.io/commands/rpoplpush。这里有一些其他帮助:github.com/mranney/node_redisgithub.com/redis/redis-rb

标签: ruby-on-rails ruby node.js rabbitmq amqp


【解决方案1】:

主要问题在于您如何尝试将队列绑定到“信使”交换。您已经使用交换名称来获取对交换对象的引用。将队列绑定到交换器时,不要再次传入字符串名称,而是将 此引用 传递到 queue.bind()。只需更改第一个 queue.bind() 参数:

var exchange = connection.exchange('messenger');    
var queue = connection.queue('new_messages');

// Use the reference to the exchange object you just received;
// pass it in here instead of the exchange's name
queue.bind(exchange, 'send');

编辑

这是一个完整的工作示例;只需放入您自己的连接属性:

var amqp = require('amqp');

var connection = amqp.createConnection({
    host: 'my_host',
    login: 'my_login',
    password: 'my_password',
    authMechanism: 'AMQPLAIN',
    vhost: 'my_vhost'
});

connection.addListener('ready', function(){

    console.log('ready');

    var exchange = connection.exchange('messenger');
    var queue = connection.queue('new_messages');

    queue.bind(exchange, 'send');

    // if message successfully received, print message
    queue.subscribe( {ack:true}, function(message){

        console.log(message.data.toString());
        queue.shift();
    });

    // test by sending a message
    exchange.publish('send', 'this is a test message', {}, function() {})
});

干杯。

【讨论】:

  • 没有意义。订阅回调中的 Console.log 显示,NodeJS 无法捕获消息。
  • @Zhirayr,我已经用完整的工作代码更新了示例,包括将消息发布到节点进程中的队列。你可以用它来确认我上面的回答;只需放入您的连接属性即可。
猜你喜欢
  • 2016-11-29
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2016-06-05
  • 1970-01-01
  • 2017-09-22
相关资源
最近更新 更多