我有一个POST请求,我在Postman中使用它来改变设备的状态,当我直接通过Postman进行请求时,它似乎可以工作,但我一直无法使它与RabbitMQ一起工作。
这是我的Postman。
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的新手,我看不出我犯了什么错误。
您的路由密钥变量是 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,队列,以及它们之间的绑定,从它们的文档中找到Exchange类型。