1. 简单模式
1.1 图示
从图上看,和JDK本身一样,生产者往队列添加数据,消费者从队列拿数据,如果业务场景确实这么简单,还可以使用redis的集合来代替,减少整个系统的复杂度,系统越简单问题越少
1.2 测试代码
public class RabbitMQ {
Logger logger = LoggerFactory.getLogger(RabbitMQ.class);
private ConnectionFactory factory;
// 初始化连接工厂
@Before
public void init() {
factory = new ConnectionFactory();
// 设置相关参数
factory.setHost("192.168.245.128");
factory.setPort(5672);
factory.setVirtualHost("/jt");
factory.setUsername("admin");
factory.setPassword("12340101");
}
@Test
public void simpleSend() throws Exception {
// 1.获取连接
Connection conn = factory.newConnection();
// 2.从连接获取信道
Channel channel = conn.createChannel();
// 3.利用channel声明一个队列
/*
queue 表示声明的queue对列的名字
durable 表示是否持久化
exclusive 表示当前声明的queue是否被当前信道独占
true:当前连接创建的任何channel都可以连接该queue
false:只有当前channel可以连接该queue
autoDelete Boolean类型:在最后连接使用完成后,是否删除队列,false
arguments 其他声明参数封装到map中传递给mq
*/
channel.queueDeclare("simple", false, false, false, null);
// 4.发送消息
/*
exchange 交换机名称,简单模式使用默认交换,该值设置为""
routingkey 当前的消息绑定的routingkey,简单模式下,与队列同名即可
props 消息的属性字段对象,例如BasicProperties,可以设置一个deliveryMode的值0 持久化,1 表示不持久化,durable配合使用
body 消息字符串的byte数组
*/
channel.basicPublish("", "simple", null, "简单模式的消息发送".getBytes());
}
@Test
public void simpleReciever() throws Exception {
// 1.获取连接
Connection conn = factory.newConnection();
// 2.获取信道
Channel channel = conn.createChannel();
// 3.绑定队列
channel.queueDeclare("simple", false, false, false, null);
// 4.创建一个消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 5.绑定消费者和队列
channel.basicConsume("simple", consumer);
// 6.获取消息
while(true) {
Delivery delivery = consumer.nextDelivery();
String msg=new String(delivery.getBody());
System.out.println(msg);
}
}
}
2. 工作模式
2.1 图示
一个队列由多个消费者共享,如果消费者处理速度落后于生产者,可以不断扩充消费,提高消息的处理能力
注意:这种模式队列的数据一旦被其中一个消费者拿走,其他消费者就不会再拿到,与下面的订阅发布模式不一样,它提供了两个队列,消息有两份
2.2 测试代码
@Test
public void workSender() throws Exception{
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
channel.queueDeclare("work", false, false, false, null