2015-05-15 65 views
0

我正在使用akka-camel訂閱rabbitmq交換。將會有幾個這樣的演員創建​​......每個請求routingKey。交換和隊列不會改變。每次請求新的routingKey我創建一個新的演員,而不是創建一個新的頻道,正在創建一個全新的連接,這是不受歡迎的。我不太明白爲什麼每次創建消費者actor時都會創建一個新連接。Akka駱駝RabbitMQ每次創建新連接

這裏的演員代碼:

class CommandConsumer(routingKey: String) 
    extends Consumer with ActorLogging { 

    override def endpointUri = s"rabbitmq://localhost/hub_commands?exchangeType=topic&queue=test&autoDelete=false&routingKey=$routingKey" 

    override def receive: Receive = { 
    case msg: CamelMessage => { 
     log.debug(s"received {}", msg.bodyAs[String]) 
     sender ! msg.bodyAs[String] 
    } 
    } 
} 

我創建像這樣的演員:

context.actorOf(CommandConsumer.props("my.routing.key", sender)) 

UPDATE

這正是我需要完成:

我正在寫一個TCP/IP服務器,當一個客戶端連接被接受,需要接收來自後端架構中其他組件的消息。爲此,我想使用RabbitMQ。成功連接到我的服務器後,客戶端將發送一個ID,該ID將用作路由密鑰的一部分(例如command.<id>)。 RabbitMQ連接和隊列是在第一個客戶端連接時創建的,並且路由密鑰類似於command.first_id。當下一個客戶端連接時,我想command.second_d路由鍵指向已被接受的路由鍵列表,而不創建與RabbitMQ的新連接。

回答

1

我相信這是預期的。每個阿卡駱駝演員將擁有自己的駱駝上下文,這些駱駝上下文將獨立於其他人。這意味着對於您創建的每個新角色,您將創建一個新的駱駝上下文,並帶有一個新的RabbitMQ端點,該端點將保留一個新的RabbitMQ連接和一個新的通道。

如果在您的場景中,隊列和交換不會改變,只是路由鍵,爲什麼不只有一個Akka Camel actor從隊列中消耗,另一個actor則是管理綁定。每當需要消費一個新的路由密鑰時,該參與者將創建一個rabbitmq連接,並使用新的路由密鑰呼叫queueBind()。此外,您可以讓同一個actor解除不需要的路由密鑰。

+0

這聽起來像你建議我爲每個新的路由鍵創建一個新的連接。那是你在說什麼?每次請求新的路由密鑰時,都需要將其添加到已綁定到rabbitmq連接/交換/隊列的路由密鑰列表中。我可以通過簡單地爲已經存在的隊列創建另一個綁定來實現嗎? – threejeez

+0

我剛剛添加到我原來的問題,正是我想要做的。我希望這有助於更好地解決問題。謝謝!! – threejeez