几个角色:
-
P:生产者,负责向队列中发送消息。
-
C:消费者,负责从队列中接收消息。
maven依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.12.0</version>
</dependency>
发送消息
package com.morris.rabbit.helloworld;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Send {
private final static String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.80.205");
factory.setPort(5672);
factory.setUsername("root");
factory.setPassword("root");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
}
}
这时可以在管理后台http://192.168.80.205:15672/#/queues看到有一个名为hello的队列中有一条消息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNUVrQax-1624368630387)(https://tcs.teambition.net/storage/3126c3f99ffa3b9b8f8d2259df50193b56db?Signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBcHBJRCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9hcHBJZCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9vcmdhbml6YXRpb25JZCI6IiIsImV4cCI6MTYyNDk3MzU2NCwiaWF0IjoxNjI0MzY4NzY0LCJyZXNvdXJjZSI6Ii9zdG9yYWdlLzMxMjZjM2Y5OWZmYTNiOWI4ZjhkMjI1OWRmNTAxOTNiNTZkYiJ9.bHabSmxoHZ88euYvt5tTDLdLVwBEY4lKw6OWvTqrC1w&download=image.png “”)]
也可以在命令行进行查看:
# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name messages
hello 1
接收消息
package com.morris.rabbit.helloworld;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.80.205");
factory.setPort(5672);
factory.setUsername("root");
factory.setPassword("root");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
- 消费者和生产者都使用queueDeclare来声明队列,会不会重复创建?
queueDeclare做了幂等校验,不会重复校验,第二次声明时需与第一次声明的属性(如持久化、自动删除)一致,否则会抛出异常。
- 为什么不使用 try-with-resource来自动释放资源?
希望comsumer一直异步的消费消息,所以并没有自动关闭信道(channel)和连接(connection)。