RabbitMQ:在Java中以node.js订阅发布

时间:2014-06-05 11:29:15

标签: java node.js rabbitmq

鉴于node.js中的以下发布商以及java中的以下订阅者(此设置功能齐全),我有以下两个问题:

  1. 我应该在queueBind中使用什么作为第三个参数?为什么?为什么它按原样运行("test"是一个随机选择)?
  2. 除了rabbit.js中的交换之外,还有办法指定队列吗?如果是,那怎么样?如果没有,那么为什么以及我应该使用哪个模块(代码示例是受欢迎的)?
  3. // node.js
    var context = require("rabbit.js").createContext();
    
    var pub = context.socket('PUB');
    pub.connect(config.exchange);
    
    server.post("/message/:msg", function(req, res) {
        pub.write(req.params.msg, 'utf8');
        res.end();
    });
    
    // java
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost(host);
    try {
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
    
        channel.exchangeDeclare(exchange, "fanout");
    
        String queueName = channel.queueDeclare().getQueue();
        channel.queueBind(queueName, exchange, "test"); // Question1: what should I use as the third argument and why?
        // Question2: is there a way to configure rabbit.js with a queue name instead?
        //channel.queueDeclare(queueName, false, false, false, null);
    
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(queueName, true, consumer);
    
        try {
            while (true) {
                QueueingConsumer.Delivery delivery = consumer.nextDelivery();
                String message = new String(delivery.getBody());
                LOG.info("Received message: " + message);
            }
        } catch (InterruptedException e) {
            LOG.catching(e);
        } finally {
            channel.close();
            connection.close();
        }
    } catch (IOException e) {
        LOG.catching(e);
    }
    

1 个答案:

答案 0 :(得分:1)

自己的答案,到目前为止我已经挖掘出来了:

  1. 第三个参数是路由密钥,在topic中称为rabbit.js。通过提供test,我只订阅发送到test主题或没有主题集的消息(默认情况下为rabbit.js)。如果我也在发布商中使用主题,我可以使用pub.publish(topic, message, encoding)代替pub.write(message, encoding)或将其提供给connect方法

  2. 看起来不是这样,仍然不知道为什么。该论点认为rabbit.js是一个更高级别的库,因此它进行了某些简化。为什么这个简化是我不知道的。但是,我主要想为单个交换使用多个通信线程,我也可以通过使用主题/路由键来实现。所以没什么大不了的。