【消息队列】java代码实现对mq进行收发消息

       

目录

一、简单上手:

(1)引入依赖

(2)配置MQ地址

(3)发送消息

(4)接收消息

二、workQueue:任务模型

(1)定义两个消费者监听同一个队列

(2)让生产者发送多条消息

(3)运行查看消费情况

(4)结论

(5)更换消息处理的分配方式


        大家好,我是jstart千语。上一期讲了RabbitMQ的一些基本认识,以及控制台中的操作。但在实际上开发中,都是使用程序来进行的,讲了控制台的操作主要是让大家更好地认识mq,以及他们一些交换机的区别,下面是上一期的关于MQ的基本认识的讲解:


【消息队列】RabbitMQ基本认识-CSDN博客


一、简单上手:

(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一段时间即可

效果:

敬请期待:

下期将会讲解在代码中创建交换机的优雅方式~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值