目前,我正在使用rabbitmq来创建分布式系统。
我的目标是将对象从IOS(RabbitMQ)发送到服务器端(RabbitMQ),然后只对队列的所有订阅者进行扇出
我已经写了服务器和客户端
客户 - 发布商
@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对象?
答案 0 :(得分:1)
您似乎在RMQ服务器和正在运行的节点服务器之间感到困惑。您的节点服务器与RMQ服务器不同。您发布的消息不会通过您拥有的节点服务器。
您正在节点服务器上的队列上发布消息。相反,您必须侦听队列以获取节点服务器端的消息。然后,您的节点服务器实际上就像正在侦听扇出队列的客户端 - 消费者之一,除了在节点中。