我正在尝试从我的Android应用程序连接到一个名为" message"的队列。
生产者(AMQP协议下的一个web服务)已经连接,可以通过RabbitMQ管理面板进行检查。
要从我的Android设备连接,我就像这样编码。
private void connect() throws Exception {
this.sampleClient = new MqttClient(this.broker, this.clientId);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setUserName("user");
connOpts.setPassword("user".toCharArray());
/*connOpts.setConnectionTimeout(60 * 10);
connOpts.setKeepAliveInterval(60 * 5);*/
connOpts.setCleanSession(true);
this.sampleClient.connect(connOpts);
this.sampleClient.setCallback(this);
this.sampleClient.subscribe("messages");
if(!this.sampleClient.isConnected()){
System.out.println("Not Connected");
return;
}
System.out.println("Connected");
}
我尝试过" amq.topic"," amq.topic。*"," amq.topic.messages"等...但是当我查看RabbitMQ队列部分"消息"有0个消费者,并且已经设置了一个名为" mqtt-subscription-Sampleqos1"的新队列。自动。
发生了什么?我怎样才能写出"消息"队列?
答案 0 :(得分:8)
关于这个问题有两点重要。
根据RabbitMQ MQTT文档:http://www.rabbitmq.com/mqtt.html
首先,mqtt-plugin会自动将每个队列绑定到 amq.topic 。
其次,每个订阅者都有自己的队列,如下所示: mqtt-subscription- {cliend_id} {qosX} (其中X是订阅的qos级别)
因此,生产者必须将消息发布到“amq.topic”交换,并且“amq.topic ..”路由密钥,接收者必须订阅“amq.topic ..”routing-key。
答案 1 :(得分:0)
首先,确保已启用MQTT插件:rabbitmq-plugins enable rabbitmq_mqtt
在客户端(这是您的Android应用),您需要主题的订阅者,可以说主题my / android / app / messages
this.sampleClient.subscribe("my/android/app/messages");
然后,从服务器端开始,由于RabbitMQ的实现,您需要使用适当的路由键my.android.app.messages将消息发送到特殊的交换“ amq.topic”(注意“ /”和“ 。',MQTT使用/和AMQP使用。)。例如,如果您通过pika AMQP Python lib发布,代码将如下所示:
channel.basic_publish(
exchange='amq.topic',
routing_key='my.android.app.messages',
body='hello world'
)
在您的情况下,您希望从队列“消息”接收消息,基本上没有办法直接从MQTT客户端上的该AMQP队列中订阅消息。解决方法是创建一个在服务器端运行的服务,作为AMQP订阅者,从“消息”队列接收消息,并透明转发消息以使用适当的路由密钥交换amq.topic。
希望我的回答有帮助。