【问题标题】:How subscribe in an RabbitMQ queue with MQTT Paho如何使用 MQTT Paho 订阅 RabbitMQ 队列
【发布时间】:2019-05-30 23:32:50
【问题描述】:

我正在尝试从我的 Android 应用程序连接到一个名为“消息”的队列。

生产者(AMQP协议下的一个网络服务)已经连接,可以通过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”的新队列。

发生了什么事?如何订阅“消息”队列?

【问题讨论】:

    标签: rabbitmq mqtt


    【解决方案1】:

    关于这个问题有两点很重要。

    根据 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..”路由键。

    【讨论】:

      【解决方案2】:

      首先,确保启用 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。

      希望我的回答有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多