2017-07-14 105 views
0

目前,我正在使用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

看來你在RMQ服務器和你正在運行的節點服務器之間感到困惑。您的節點服務器與RMQ服務器不同。您發佈的消息不會通過您擁有的節點服務器。

您正在節點服務器上的隊列上發佈消息。相反,您必須在隊列上偵聽以獲取節點服務器端的消息。然後,您的節點服務器實際上會像客戶端 - 使用者之一那樣在扇出隊列中偵聽,除了在節點中。

+0

所以技術上在節點服務器端,我只需要創建一個消費者選項? – sinusGob

+0

是的,你只需要在節點端的消費者 – raiyan

+1

感謝您的答案 – sinusGob

相關問題