AMQP с использованием Node.js, Как я могу опубликовать / подписаться? - PullRequest
2 голосов
/ 29 августа 2011

Я делаю класс, управляющий модулем Node-AMQP, доступным здесь: https://github.com/postwait/node-amqp

Но я не могу публиковать / подписываться, используя это:

  var Queue = require('./Queue.js');
  var queue = new Queue();
  queue.addTaskToQueue('salut', 5);
  queue.subscribeTaskQueue('salut');

Вот класс, который я использую (я даю Код в CoffeeScript и в Node.js для тех, кто не знает CoffeeScript):

Спасибо за вашу помощь.

В CoffeeScript:

amqp = require('amqp')

class Queue

    constructor: (ip = 'localhost') ->
            @ip = ip
            @receivedObject
            @connection = amqp.createConnection({ host: @ip })
            @queue

    subscribeTaskQueue: (queueToSubscribe) ->
            self = @
            self.connection.on('ready', ->
                    q = self.connection.queue(queueToSubscribe)
                    q.bind('#')

                    q.subscribe({ ack: true }, (message) ->
                            self.receivedObject = message
                            console.log(self.receivedObject)
                    )
            )

    addTaskToQueue: (queue, objectToSend) ->
            @queue = @connection.queue("salut", { durable: true })
            @connection.publish(queue, objectToSend)

module.exports = Queue

В Node.js

(function() {
  var Queue, amqp;
  amqp = require('amqp');
  Queue = (function() {
    function Queue(ip) {
      if (ip == null) {
        ip = 'localhost';
      }
      this.ip = ip;
      this.receivedObject;
      this.connection = amqp.createConnection({
        host: this.ip
      });
      this.queue;
    }
    Queue.prototype.subscribeTaskQueue = function(queueToSubscribe) {
      var self;
      self = this;
      return self.connection.on('ready', function() {
        var q;
        q = self.connection.queue(queueToSubscribe);
        q.bind('#');
        return q.subscribe({
          ack: true
        }, function(message) {
          self.receivedObject = message;
          return console.log(self.receivedObject);
        });
      });
    };
    Queue.prototype.addTaskToQueue = function(queue, objectToSend) {
      this.queue = this.connection.queue("salut", {
        durable: true
      });
      return this.connection.publish(queue, objectToSend);
    };
    return Queue;
  })();
  module.exports = Queue;
}).call(this);

Я сделал то, что вы говорите + Я сделал небольшие изменения.

Вот мой класс Queue.coffee:

amqp = require('amqp')

class Queue

    constructor: (ip = "localhost", queueName = "salut") ->
            @ip = ip
            @receivedObject = "test"
            @connection = amqp.createConnection({ host: 'localhost' })
            @queueName = queueName

    subscribeTaskQueue: () ->
            @connection.on('ready', ->
                    q = @connection.queue(@queueName)
                    q.bind('#')

                    q.subscribe({ ack: true }, (message) ->
                            @receivedObject = message
                            console.log(@receivedObject)
                    )
            )

    addTaskToQueue: (objectToSend = "hello") ->
            @connection.publish(@queueName, objectToSend)


queue = new Queue("localhost", "salut")

queue.connection.on 'ready', ->
  queue.addTaskToQueue 'salut', 5
  queue.subscribeTaskQueue 'salut'

А вот и Rabbituser.Coffee:

Queue = require('./Queue.js')
queue = new Queue("localhost", "salut")

queue.addTaskToQueue("hello")
queue.subscribeTaskQueue()

Когда я делаю команду: узел rabbituser.js

Я получаю:

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
TypeError: Cannot read property '' of undefined
    at Connection.exchange (/home/armand/node_modules/amqp/amqp.js:1242:21)
    at Connection.publish (/home/armand/node_modules/amqp/amqp.js:1258:60)
    at Queue.addTaskToQueue (/home/armand/Desktop/RockSolidProject/coucheAMQP/Queue.js:36:30)
    at Object.<anonymous> (/home/armand/Desktop/RockSolidProject/coucheAMQP/rabbituser.js:5:9)
    at Object.<anonymous> (/home/armand/Desktop/RockSolidProject/coucheAMQP/rabbituser.js:7:4)
    at Module._compile (module.js:402:26)
    at Object..js (module.js:408:10)
    at Module.load (module.js:334:31)
    at Function._load (module.js:293:12)
    at Array.<anonymous> (module.js:421:10)

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Я не уверен, с какой ошибкой вы сталкиваетесь, но я укажу несколько вещей:

  1. В вашем конструкторе, когда вы пишете @receivedObject и @queue - это ничего не делает. В JavaScript каждый объект является хешем, и вы можете присоединять свойства в любое время; если @receivedObject и @queue изначально не определены в экземпляре Queue, вам не нужно определять их в конструкторе.

  2. Возможно, проблема в том, что вы звоните @connection.queue в addTaskToQueue до того, как соединение существует (то есть, до обратного вызова self.connection.on 'ready')?

Возможно, если вы изменили свой код на

queue = new Queue()
queue.connection.on 'ready', ->
  queue.addTaskToQueue 'salut', 5
  queue.subscribeTaskQueue 'salut'

Если это не решит вашу проблему, не могли бы вы описать точную ошибку, с которой вы столкнулись, и где вы ее встречаете?

0 голосов
/ 04 марта 2014

Чтобы позволить себе использовать amqp для публикации / подписки, прямо сейчас доступно rabbitmq-nodejs-client

...