目录
大家好,我是jstart千语。上一期讲了RabbitMQ的一些基本认识,以及控制台中的操作。但在实际上开发中,都是使用程序来进行的,讲了控制台的操作主要是让大家更好地认识mq,以及他们一些交换机的区别,下面是上一期的关于MQ的基本认识的讲解:
一、简单上手:
(1)引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
(2)配置MQ地址
spring:
rabbitmq:
host: 192.168.88.200 #
port: 5672
username: jstart
password: 123456
virtual-host: /test #虚拟主机
(3)发送消息
@SpringBootTest
class SpringAmqpTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testSimpleQueue(){
/**
* 只传两个参数时,表示直接向队列进行发送消息,绕过了交换机
* 第一个参数:队列名称
* 第二个参数:消息内容
*/
rabbitTemplate.convertAndSend("simple.queue","hello,mq");
}
@Test
public void testSimpleQueue2(){
/**
* 传入三个参数时,将消息发送到交换机,交换机会根据规则路由到各个队列
* 第一个参数:交换机名称
* routingKey:路由规则
* 第二个参数:消息内容
*/
rabbitTemplate.convertAndSend("amq.test","red","hello,my_mq2");
}
}
(4)接收消息
@Component
public class listener {
@RabbitListener(queues = "simple.queue") //直接绑定队列的名称
public void listenSimpleQueue(String message) { //参数类型就是发消息时的类型,会自动转换
log.info("监听到simple.queue队列的消息为:{}",message);
}
}
图文讲解:
二、workQueue:任务模型
意思就是:让多个消费者绑定一个队列。
思考:队列里面的消息是怎么样给消费者消费的?
猜测:当队列里有很多消息,并且有多个消费者来绑定这个队列。那么,消费者们可能是使用轮询的方式消费的,即一次消费一条,轮流消费。也可能有其他的消费方式。
(1)定义两个消费者监听同一个队列
@Slf4j
@Component
public class listener {
//性能好的服务器
@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String message) throws InterruptedException {
System.out.println("消费者1张三。。。监听到消息为:" + message);
Thread.sleep(25);
}
//性能差的机器,让它消费完sleep二百毫秒
@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String message) throws InterruptedException {
System.err.println("消费者2李四......监听到消息为:" + message);
Thread.sleep(200);
}
}
(2)让生产者发送多条消息
@Test
public void testWorkQueue(){
String queue = "work.queue";
for (int i = 0; i < 50; i++) {
String message = "hello,mq_"+ i + " " +LocalTime.now();
rabbitTemplate.convertAndSend(queue,message);
}
}
(3)运行查看消费情况
消费者1:
消费者2:
(4)结论
默认的使用轮询的方式,轮流处理消息
(5)更换消息处理的分配方式
spring:
rabbitmq:
host: 192.168.88.200 #
port: 5672
username: jstart
password: 123456
virtual-host: /test #虚拟主机
listener:
simple:
prefetch: 1 # 每次只能获取一条消息,处理完成后才能获取下一条消息
模拟在分布式情况下,一个服务可能会有多个实例,然后不同的服务器能承受的压力不同,所以给性能差的机器设置处理的消息少一点:让它每次处理完sleep一段时间即可
效果:
敬请期待:
下期将会讲解在代码中创建交换机的优雅方式~