【问题标题】:NodeJS AMQP Client can't connectNodeJS AMQP客户端无法连接
【发布时间】:2012-08-23 17:04:58
【问题描述】:

这两天我快疯了,我无法通过持久交换和持久队列在 NodeJS 客户端上建立连接。

所以 PHP 代码创建并发送消息:

<?php 
$connection = new AMQPConnection(array(
'host' => 'localhost',
'vhost' => 'bvh',
'port' => 5672,
'login' => 'bizneus',
'password' => 'lozinkus'
));
    //$connection = new AMQPConnection();
    $connection->connect();
    if (!$connection->isConnected()) {
        die('Not connected :(' . PHP_EOL);
    }
    // Open Channel
    $channel    = new AMQPChannel($connection);
    // Declare exchange
    $exchange   = new AMQPExchange($channel);
    $exchange->setName('biznea_e_1');       
    $exchange->setType('fanout');
    $exchange->setFlags(AMQP_DURABLE);

    $exchange->declare();
    // Create Queue
    $queue      = new AMQPQueue($channel);
    $queue->setName('notify');
    $queue->setFlags(AMQP_DURABLE);
    $queue->declare();

    $message    = $exchange->publish(json_encode($s), 'kljuc');
    if (!$message) {
        echo 'Message not sent', PHP_EOL;
    } else {
        echo 'Message sent!', PHP_EOL;
    }

    if ($connection->isConnected()) {
       $connection->disconnect();
    }

屏幕上显示消息已发送。

接下来是 NodeJS 客户端,它应该获取消息,但它不能:

var amqp = require('amqp');

var conParam = { 
  host: 'localhost', 
  port: 5672,  
  login: 'bizneus',   
  password: 'lozinkus',    
  vhost: 'bvh'  
}
var connection = amqp.createConnection(conParam);
connection.on('ready', function(){

     var exchange = connection.exchange('biznea_e_1');
      var queue = connection.queue('notify');
      queue.bind('biznea_e_1', 'kljuc');

                queue.subscribe( {ack:true}, function(message){

                    var dj = JSON.parse(message.data.toString());

                    console.log(JSON.stringify(dj));

                    queue.shift();
            });
});

但我收到此错误

events.js:66
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: PRECONDITION_FAILED - cannot redeclare exchange 'biznea_e_1' in vhost 'bvh' with different type, durable, internal or autodelete value
    at Exchange._onMethod (/home/zijad/node_modules/amqp/amqp.js:1824:15)
    at Exchange.Channel._onChannelMethod (/home/zijad/node_modules/amqp/amqp.js:1365:14)
    at Connection._onMethod (/home/zijad/node_modules/amqp/amqp.js:922:28)
    at AMQPParser.self.addListener.parser.onMethod (/home/zijad/node_modules/amqp/amqp.js:797:12)
    at AMQPParser._parseMethodFrame (/home/zijad/node_modules/amqp/amqp.js:442:10)
    at frameEnd (/home/zijad/node_modules/amqp/amqp.js:187:16)
    at frame (/home/zijad/node_modules/amqp/amqp.js:172:14)
    at AMQPParser.header [as parse] (/home/zijad/node_modules/amqp/amqp.js:159:14)
    at AMQPParser.execute (/home/zijad/node_modules/amqp/amqp.js:231:21)
    at Connection.<anonymous> (/home/zijad/node_modules/amqp/amqp.js:837:12)

我试图删除 var exchange = connection.exchange('biznea_e_1');该行但不能声明队列。

我只想将消息从 PHP 发送到 NodeJS 守护进程,仅此而已!

帮助:)

【问题讨论】:

  • 我不再使用这种方法并开始使用 Redis 而不是 AMQP,几分钟后一切都安装并运行起来更容易。

标签: php node.js rabbitmq amqp


【解决方案1】:

试试这个:在 node.js 代码中,使用与 PHP 代码中相同的参数完全声明交换和队列。例如耐用的。这可能会解决您的问题。

干杯!

【讨论】:

  • 如何为节点设置这些参数?
  • 您是否查看了您正在使用的功能的 node-amqp 文档?它可能都在那里。查看 connection.exchange、connection.queue 等文档。
【解决方案2】:

看起来您正尝试在 node.js 代码中再次创建交换“biznea_e_1”。它已经由 php 代码创建。仅尝试订阅。

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 2018-09-03
    • 1970-01-01
    • 2011-09-19
    • 2023-04-10
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多