如何使用RabbitMQ从客户端获取对象

时间:2017-07-14 11:09:18

标签: node.js rabbitmq

目前,我正在使用rabbitmq来创建分布式系统。

我的目标是将对象从IOS(RabbitMQ)发送到服务器端(RabbitMQ),然后只对队列的所有订阅者进行扇出

enter image description here

我已经写了服务器和客户端

客户 - 发布商

@IBAction func bookTripClicked(_ sender: Any) {

        if let user_id = keychain["id"] {
            print("Attempting to connect to local RabbitMQ broker")
            let conn = RMQConnection(uri: amqURL, delegate: RMQConnectionDelegateLogger())
            conn.start()
            let ch = conn.createChannel()
            let q = ch.queue("book")

        ch.defaultExchange().publish(user_id.data(using: .utf8), routingKey: q.name)
            print(user_id)

        }
    }

客户端将单击一个按钮,然后它将发送消息,但我对如何获取刚刚发送到服务器的对象的部分感到困惑。

服务器

var open = require('amqplib').connect('amqp://localhost');

var q = "book"

// Publisher
open.then(function(conn) {
  return conn.createChannel();
}).then(function(ch) {
  return ch.assertQueue(q).then(function(ok) {
    return ch.sendToQueue(q, new Buffer(JSON.stringify("How do I get the object?")));
  });
}).catch(console.warn);

客户 - 消费者

func receive() {
        print("Attempting to connect to local RabbitMQ broker") // Print the message
        let conn = RMQConnection(uri: amqURL, delegate: RMQConnectionDelegateLogger())
        conn.start()

        let ch = conn.createChannel() // Create the channel name on the rabbitMQ Server
        let q = ch.queue("book") // Queue the message in the channel || the name of the channel / queue
        print("Waiting for the messages")
        q.subscribe({(_ message: RMQMessage) -> Void in
            print("Received \(String(data: message.body, encoding: String.Encoding.utf8)!)")

        })
    }

我之所以需要它通过服务器是因为我想稍后保存该对象。我不能只删除服务器端,它可以在客户端到客户端之间正常工作,但我需要JSON对象将来将其保存在数据库中

所以主要问题是如何在服务器端获取JSON对象?

1 个答案:

答案 0 :(得分:1)

您似乎在RMQ服务器和正在运行的节点服务器之间感到困惑。您的节点服务器与RMQ服务器不同。您发布的消息不会通过您拥有的节点服务器。

您正在节点服务器上的队列上发布消息。相反,您必须侦听队列以获取节点服务器端的消息。然后,您的节点服务器实际上就像正在侦听扇出队列的客户端 - 消费者之一,除了在节点中。