本文将集成SpringBoot,采用自动配置的方式开发。我们只需要声明RabbitMQ的地址即可。关于创建和关闭连接有各种各样的事情。让Spring来帮我们吧~让Spring帮我们管理连接,让我们专注于业务逻辑,和声明式事务一样简单易用、方便高效。祝您收获满满,先赞后观,幸福无限。本文代码:https://gitee.com/he-erduo/spring-boot-learning-demohttps://github.com/he-erduo/spring-boot-learning-demo1。🔍环境配置先从环境的配置说起。在上一篇文章中,我们介绍了自动配置包。既然我们已经使用了自动配置的方式,那么我们可以直接将RabbitMQ的连接信息放在配置文件中,就像我们需要使用JDBC连接时,也配置DataSource一样。如图,我们只需要指定连接IP+端口号和用户名密码即可。这里我使用默认的用户名和密码。主要是看手动确认消息的配置。需要配置为manual,进行手动确认。以后还会有其他的配置项。现在,我们可以配置这个。接下来,我们需要配置一个队列。在上一篇文章中,我们将消息发送到名为erduo的队列。当时,我们手动定义了这个队列。这里我们也需要手动配置,声明一个Bean即可。@ConfigurationpublicclassRabbitmqConfig{@BeanpublicQueuerduo(){//它的三个参数:durableexclusiveautoDelete//一般只设置持久化为returnnewQueue("erduo",true);}}声明就这么简单,当然RabbitMQ毕竟是一个独立的组件。如果你已经在RabbitMQ中通过其他方式创建了一个名为erduo的队列,则无需在此声明。这里的一个作用是,如果你没有这个队列,它会按照你的声明方式帮你创建这个队列。配置好环境后,我们就可以用SpringBoot的方式编写生产者和消费者了。2.📕Producer和RabbitTemplate的节奏跟上一篇一样。先写生产者吧,不过这次要介绍一个新的工具:RabbitTemplate。听名字就知道是另一个即用型工具类。Spring家族在这方面是很自在的。一切都为您打包,让您使用起来更方便、更流畅。RabbitTemplate实现了标准的AmqpTemplate接口,其功能大致可以分为发送消息和接收消息。我们这里在生产者中使用它,主要是利用它的消息发送功能:send和convertAndSend方法。//发送消息到默认的Exchange,使用默认的routingkeyvoidsend(Messagemessage)throwsAmqpException;//使用指定的routingkey发送消息到默认的exchangevoidsend(StringroutingKey,Messagemessage)throwsAmqpException;//使用指定的routingkey发送到指定交换的消息voidsend(Stringexchange,StringroutingKey,Messagemessage)throwsAmqpException;send方法是发送字节数组数据的方式,这里代表消息内容的对象是Message对象,它的构造方法是传入字节数组数据,所以我们需要将我们的数据转换成字节数组,然后构造放入消息对象并发送。//对象类型,可以传入POJOvoidconvertAndSend(Objectmessage)throwsAmqpException;voidconvertAndSend(StringroutingKey,Objectmessage)throwsAmqpException;voidconvertAndSend(Stringexchange,StringroutingKey,Objectmessage)throwsAmqpException;convertAndSend方法可以传入POJO对象作为参数,verter底层有一个MessageConverter帮助我们自动将数据转换成byte类型或者String或者序列化类型。所以这里只支持三种类型的传入对象:byte类型、String类型和实现了Serializable接口的POJO。介绍完之后,我们可以看一下代码:@Slf4j@Component("rabbitProduce")publicclassRabbitProduce{@AutowiredprivateRabbitTemplaterabbitTemplate;publicvoidsend(){Stringmessage="你好,我是作者耳,欢迎关注我。"+LocalDateTime.now().toString();System.out.println("Messagecontent:"+message);//指定消息类型MessagePropertiesprops=MessagePropertiesBuilder.newInstance().setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN).build();rabbitTemplate.send(Producer.QUEUE_NAME,newMessage(message.getBytes(StandardCharsets.UTF_8),props));System.out.println("消息已发送。");}publicvoidconvertAndSend(){Useruser=newUser();System.out.println("Messagecontent:"+user);rabbitTemplate.convertAndSend(Producer.QUEUE_NAME,user);System.out.println("消息已发送。");}}这里我具体写两个例子,一个用于测试发送,另一个用于测试convertAndSend。在send方法中,我们可以看到和前面的代码差不多,定义一个消息,然后直接发送,但是这个消息的构造方法可能比我们想象的多了一个参数,我们本来说的是把数据转成二进制数组可以放进去,现在好像还需要多放一个参数。MessageProperties,是的,我们需要添加一个额外的MessageProperties对象。从它的名字我们也可以看出它的作用就是附加一些参数,但是有些参数是不可或缺的,没有它们是无法工作的。比如我这里的代码是设置消息的类型。消息的类型有很多种,可以是二进制类型,文本类型,也可以是序列化类型,JSON类型。我这里设置的是文本类型,需要指定的类型。它可以为我们在获取到消息后要将消息转换成什么样的对象提供一个参考。convertAndSend方法要简单得多。这里我放了一个User对象来测试,只要指定队列,放到这个对象中即可。提示:用户必须实现Serializable接口,否则调用该方法时会抛出IllegalArgumentException。代码完成后,我们就可以调用了。这里我写了一个测试类调用:@SpringBootTestpublicclassRabbitProduceTest{@AutowiredprivateRabbitProducerabbitProduce;@TestpublicvoidsendSimpleMessage(){rabbitProduce.send();rabbitProduce.convertAndSend();}}效果如下图~同时控制使用命令rabbitmqctl.batlist_queues查看queue-erduo的当前情况:这样我们的producer测试就完成了,现在消息队列中有两条消息,而且消息类型肯定是不同的,一条是我们设置的文本类型,一条是自动设置的序列化类型。3.📗Consumer和RabbitListener现在队列中有了消息,我们需要看看如何获??取消息并以新的方式消费和确认消息。这里的Consumers我们需要使用@RabbitListener来帮我们获取指定队列的消息。它的用法很简单也很复杂。可以先说简单的方式,直接放在方法上,指定要监听的队列。@Slf4j@Component("rabbitConsumer")publicclassRabbitConsumer{@RabbitListener(queues=Producer.QUEUE_NAME)publicvoidonMessage(Messagemessage,Channelchannel)throwsException{System.out.println("Messagecontent:"+message);channel.basicAck(messageget.getMessage().getDeliveryTag(),false);System.out.println("Themessagehasbeenconfirmed");}}这段代码表示onMessage方法将处理erduo队列中的消息(Producer.QUEUE_NAME为常量字符串“erduo”)。我们可以看到这个方法中有两个参数,Message和Channel。如果不使用Channel,这个参数可以省略,但是必须要有Message消息,代表消息本身。我们可以想一想,我们的程序从RabbitMQ中拉回消息后,会如何展示给我们呢?没错,它被封装成了Message对象,里面包含了一条消息的所有信息,我跑一会就知道数据结构是什么样的了。同时,这里我们使用Channel来进行消息确认操作。这里的DeliveryTag代表消息在队列中的序号,这个信息保存在MessageProperties中。4.📖SpringBoot启动!写好生产者和消费者,并运行生产者将两条信息放入消息队列后,我们就可以直接启动消息,查看消费情况:在红框标注的地方可以看到,因为我们在那里都是消费者,所以项目启动后,与RabbitMQ建立连接,监控队列。然后我们开始消费我们队列中的两条消息:第一条消息是contentType=text/plain类型的,所以直接在控制台打印具体内容。第二条消息是contentType=application/x-java-serialized-object,打印的时候只打印一个内存地址+字节大小。不管怎样,我们都拿到了数据,说明我们的消费没有问题,我们也进行了消息确认操作。从数据上看,整个消息可以分为body和MessageProperties两部分。我们可以单独使用注解来获取这个主体的内容-@Payload@RabbitListener(queues=Producer.QUEUE_NAME)publicvoidonMessage(@PayloadStringbody,Channelchannel)throwsException{System.out.println("Messagecontent:"+body);}也可以使用单个注解获取MessageProperties的headers属性,截图中也可以看到headers属性,但是是空的——@Headers。@RabbitListener(queues=Producer.QUEUE_NAME)publicvoidonMessage(@PayloadStringbody,@HeadersMap
