消息中间件在互联网公司中使用的越来越多,主要用于分布式系统中的消息存储和转发,在易用性、可扩展性、高可用等方面等表现良好。消息队列实现了系统间的双向解耦。生产者向消息队列发送消息,消费者从队列中取出消息并进行处理。生产者不关心谁消费它们,消费者也不关心谁在生产消息。达到了系统解耦的目的,同时大大提高了系统的高可用和高并发能力。接下来介绍一下SpringBoot对RabbitMQ的支持。如何在SpringBoot项目中使用RabbitMQ?SpringBoot提供了spring-bootstarter-amqp组件来支持消息队列。它使用起来非常简单,只需要很少的配置就可以实现一个完整的消息队列服务。1、SpringBoot集成RabbitMQSpringBoot提供了spring-boot-starter-amqp组件,通过简单的配置即可与SpringBoot无缝集成。下面的例子演示了集成RabbitMQ实现消息的接收和发送。第一步是配置pom包。创建一个SpringBoot工程,在pom.xml文件中添加spring-bootstarter-amqp等相关组件依赖:org.springframework.bootspring-boot-starter-amqp上面的例子中引入了SpringBoot自带的amqp组件spring-bootstarter-amqp。第二步是修改配置文件。修改application.properties配置文件,配置rabbitmq的主机地址、端口和账户信息。spring.rabbitmq.host=10.2.1.231spring.rabbitmq.port=5672spring.rabbitmq.username=zhangweizhongspring.rabbitmq.password=weizhong1988spring.rabbitmq.virtualHost=order在上面的例子中,主要是配置RabbitMQ服务的地址。RabbitMQ配置由spring.rabbitmq.*配置属性控制。virtual-host配置项指定了RabbitMQ服务创建的虚拟主机,但该配置项不是必须的。第三步是创造消费者。消费者可以消费生产者发送的消息。接下来创建一个消费者类Consumer,并使用@RabbitListener注解指定消息处理方式。示例代码如下:@ComponentpublicclassConsumer{@RabbitHandler@RabbitListener(queuesToDeclare=@Queue("rabbitmq_queue"))publicvoidprocess(Stringmessage){System.out.println("消费者消费消息111====="+message);}}在上面的例子中,Consumer消费者通过@RabbitListener注解创建了一个监听端点,并绑定了rabbitmq_queue队列。(1)@RabbitListener注解提供了@QueueBinding、@Queue、@Exchange等对象,通过这个组合注解,配置开关,绑定路由,配置监听功能。(2)@RabbitHandler注解为具体的接收方法。第四步,创建生产者。生产者用于生成消息并发送消息,需要使用RabbitTemplate类。和前面的RedisTemplate类似,RabbitTemplate是发送消息的关键类。示例代码如下:@ComponentpublicclassProducer{@AutowiredprivateRabbitTemplaterabbitTemplate;publicvoidproduce(){Stringmessage=newDate()+"北京";System.out.println("生产者生产一条消息====="+message);rabbitTemplate.convertAndSend("rabbitmq_queue",message);}}如上例所示,RabbitTemplate提供了convertAndSend方法来发送消息。convertAndSend方法有两个参数,routingKey和message:(1)routingKey是要发送的路由地址。(2)message是具体的消息内容。发送方和接收方的queuename必须相同,否则无法接收。最后,测试验证。创建对应的测试类ApplicationTests,验证消息收发是否成功。@RunWith(SpringRunner.class)@SpringBootTestpublicclassApplicationTests{@AutowiredProducerproducer;@TestpublicvoidcontextLoads()throwsInterruptedException{producer.produce();Thread.sleep(1*1000);}}在上面的例子中,先注入producer对象,然后调用produce()方法发送消息。最后点击RunTest或者右键点击方法,选择Run'contextLoads()',运行单元测试程序,查看后台输出,结果如下图所示。从上面的程序输出日志可以看出,消费者已经接收并处理了生产者发送的消息。这是一个常见的简单用法示例。2、发送和接收实体对象SpringBoot支持发送和接收实体对象,无需额外配置。下面举例说明RabbitMQ发送和接收实体对象。1.定义实体类首先定义发送和接收的对象实体User类。代码如下:publicclassUserimplementsSerializable{publicStringname;publicStringpassword;//省略get和set方法}上面的例子中,定义了一个普通的User实体对象。需要注意的是,实体类对象必须继承Serializable序列化接口,否则会报数据无法序列化的错误。2.定义消费者修改Co??nsumer类,将参数替换为User对象。示例代码如下:@ComponentpublicclassConsumer{@RabbitHandler@RabbitListener(queuesToDeclare=@Queue("rabbitmq_queue_object"))publicvoidprocess(Useruser){System.out.println("消费者消费消息111user=====name:"+user.getName()+",password:"+user.getPassword());}}其实消费类和消息处理方法和前面的差不多,只是参数换成了实体对象,和rabbitmq_queue_object队列被监控。3.定义生产者修改Producer类,定义User实体对象,通过convertAndSend方法发送对象消息。示例代码如下:@ComponentpublicclassProducer{@AutowiredprivateRabbitTemplaterabbitTemplate;publicvoidproduce(){Useruser=newUser();user.setName("weiz");user.setPassword("123456");System.out.println("Producerproducesmessage111====="+user";rabbitTemplate.convertAndSend("rabbitmq_queue_object",user);}}在上面的例子中,仍然调用convertAndSend()方法来发送实体对象。convertAndSend()方法支持基本数据类型,例如String、Integer和Object。4、验证测试创建一个单元测试类,注入生产者对象,然后调用produceObj()方法发送实体对象消息,以验证是否能成功接收到消息。@RunWith(SpringRunner.class)@SpringBootTestpublicclassApplicationTests{@AutowiredProducerproducer;@TestpublicvoidtestProduceObj()throwsInterruptedException{producer.produceObj();Thread.sleep(1*1000);}}最后,点击RunTest或者右键点击方法并选择运行'contextLoads()',运行单元测试程序,查看后台输出,运行结果如图12-8所示。通过上面的例子,RabbitMQ成功实现了发送和接收实体对象,使得消息的数据结构更加清晰,更加符合面向对象的编程思想。