首页 > 解决方案 > 将 Postman 请求转换为 RabbitMQ

问题描述

我有一个 POST 请求,我在 Postman 中使用它来更改设备的状态,当我直接通过 Postman 发出请求时,它似乎可以工作,但我无法使其与 RabbitMQ 一起工作。

这是我的邮递员:

http://fakesite:123/api/exchanges/%2F/SOCKET_PROXY_EXCHANGE/publish

{
    "vhost": "/",
    "name": "SOCKET_PROXY_EXCHANGE",
    "properties": {
        "delivery_mode": 1,
        "headers": {}
    },
    "routing_key":"fakeid.test",
    "delivery_mode": "1",
    "payload": "{\"id\":\"fakeid\",\"status\":\"ON\"}",
    "headers": {},
    "props": {},
    "payload_encoding": "string"
}

这是我的 RabbitMQ 请求

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(fakesite);
        factory.setUsername(fakeusr);
        factory.setPassword(fakepass);
        factory.setVirtualHost("/");
        factory.setPort(123);

        String routingKey = "fakeid.test";
        String testQ = "testQ" + routingKey;
        String payload = "{\"id\":\"fakeid\",\"status\":\"ON\"}";

        try {
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();

            HashMap<String, Object> customProperties = new HashMap<>();
            customProperties.put("content_type", "text/plain");
            channel.queueDeclare(testQ, false, false, false, null);
            channel.basicPublish("SOCKET_PROXY_EXCHANGE", testQ, null, payload.getBytes());
            channel.queueDelete(testQ);
            channel.close();
            connection.close();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

关于为什么不起作用的任何想法,我对 RabbitMQ 真的很陌生,我看不出我是否犯了错误。

标签: javarabbitmqpostman

解决方案


您的路由键变量是 routingKey= fakeid.test 并且队列变量是 testQ= testQfakeid.test

方法语法,

 void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)

你正在使用

 channel.basicPublish("SOCKET_PROXY_EXCHANGE", testQ, null, payload.getBytes());

它应该是

 channel.basicPublish("SOCKET_PROXY_EXCHANGE", routingKey, null, payload.getBytes());

路由键,而不是队列。

当我们发布时,我们只需要路由键交换名称,根据我们与该交换绑定的内容,它将根据交换类型路由到该队列

RabbitMQ 队列、交换和它们之间的绑定可以通过使用Rabbitmq 管理控制台代码来完成

如何通过代码创建队列、交换和绑定它们,

            String exchangeName= "SOCKET_PROXY_EXCHANGE";

            channel.queueDeclare(testQ, false, false, false, null);
            channel.exchangeDeclare(exchangeName, "direct", true);
            channel.queueBind(testQ, exchangeName, routingKey);
            channel.basicPublish(exchangeName, routingKey, null, payload.getBytes());
          //  channel.queueDelete(testQ);
            channel.close();

您可以从他们的文档中引用 RabbitMQ Exchange、Queue 和它们之间的绑定、Exchange 类型。


推荐阅读