怎么在spring中使用RabbitMQ传递消息
怎么在spring中使用RabbitMQ传递消息?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
构建
构建一个使用Spring AMQP发布消息的应用程序,RabbitTemplate并使用POJO订阅消息MessageListenerAdapter。
创建Rabbit MQ消息接收器
使用任何基于消息传递的应用程序,您需要创建一个响应已发布消息的接收器。
@Slf4j @Component publicclassReceiver{ privateCountDownLatchlatch=newCountDownLatch(1); publicvoidreceiveMessage(Stringmessage){ log.info("Received<"+message+">"); latch.countDown(); } publicCountDownLatchgetLatch(){ returnlatch; } }
Receiver是一个简单的POJO,它定义了一种接收消息的方法。当您注册它以接收消息时,您可以将其命名为任何您想要的名称。
为方便起见,这个POJO也有一个CountDownLatch。这允许它发信号通知接收到消息。这是您不太可能在生产应用程序中实现的。
注册监听器并发送消息
Spring AMQP RabbitTemplate 提供了使用RabbitMQ发送和接收消息所需的一切。具体来说,你需要配置:
消息侦听器容器
声明队列,交换以及它们之间的绑定
用于发送一些消息以测试侦听器的组件
Spring Boot会自动创建连接工厂和RabbitTemplate,从而减少您必须编写的代码量。
您将使用RabbitTemplate发送消息,并将Receiver使用消息侦听器容器注册,以接收消息。连接工厂驱动两者,允许它们连接到RabbitMQ服务器。
@SpringBootApplication publicclassRabbitmqApplication{ staticfinalStringtopicExchangeName="spring-boot-exchange"; staticfinalStringqueueName="spring-boot"; @Bean Queuequeue(){ returnnewQueue(queueName,false); } @Bean TopicExchangeexchange(){ returnnewTopicExchange(topicExchangeName); } @Bean Bindingbinding(Queuequeue,TopicExchangeexchange){ returnBindingBuilder.bind(queue).to(exchange).with("foo.bar.#"); } @Bean SimpleMessageListenerContainercontainer(ConnectionFactoryconnectionFactory, MessageListenerAdapterlistenerAdapter){ SimpleMessageListenerContainercontainer=newSimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setQueueNames(queueName); container.setMessageListener(listenerAdapter); returncontainer; } @Bean MessageListenerAdapterlistenerAdapter(Receiverreceiver){ returnnewMessageListenerAdapter(receiver,"receiveMessage"); } publicstaticvoidmain(String[]args){ SpringApplication.run(RabbitmqApplication.class,args).close(); } }
@SpringBootApplication 是一个便利注释,添加了以下所有内容:
@Configuration 标记该类作为应用程序上下文的bean定义的源。
@EnableAutoConfiguration 告诉Spring Boot开始根据类路径设置,其他bean和各种属性设置添加bean。
通常你会添加@EnableWebMvc一个Spring MVC应用程序,但Spring Boot会在类路径上看到spring-webmvc时自动添加它。这会将应用程序标记为Web应用程序并激活关键行为,例如设置a DispatcherServlet。
@ComponentScan告诉Spring在包中寻找其他组件,配置和服务hello,允许它找到控制器。
该main()方法使用Spring Boot的SpringApplication.run()方法来启动应用程序。您是否注意到没有一行XML?也没有web.xml文件。此Web应用程序是100%纯Java,您无需处理配置任何管道或基础结构。
listenerAdapter()方法中定义的bean在定义的容器中注册为消息侦听器container()。它将侦听“spring-boot”队列中的消息。因为Receiver该类是POJO,所以需要将其包装在MessageListenerAdapter指定要调用的位置receiveMessage。
JMS队列和AMQP队列具有不同的语义。例如,JMS仅向一个使用者发送排队的消息。虽然AMQP队列执行相同的操作,但AMQP生成器不会直接向队列发送消息。相反,消息被发送到交换机,交换机可以转到单个队列,或扇出到多个队列,模仿JMS主题的概念。
消息监听器容器和接收器bean是您监听消息所需的全部内容。要发送消息,您还需要一个Rabbit模板。
该queue()方法创建AMQP队列。该exchange()方法创建主题交换。该binding()方法将这两者绑定在一起,定义RabbitTemplate发布到交换时发生的行为。
Spring AMQP要求将the Queue,the TopicExchange,和Binding声明为顶级Spring bean才能正确设置。
在这种情况下,我们使用主题交换,并且队列与路由密钥绑定,foo.bar.#这意味着使用以路由键开头的任何消息foo.bar.将被路由到队列。
发送测试消息
测试消息由CommandLineRunner,他还等待接收器中的锁存器并关闭应用程序上下文:
@Slf4j @Component publicclassRunnerimplementsCommandLineRunner{ privatefinalRabbitTemplaterabbitTemplate; privatefinalReceiverreceiver; publicRunner(Receiverreceiver,RabbitTemplaterabbitTemplate){ this.receiver=receiver; this.rabbitTemplate=rabbitTemplate; } @Override publicvoidrun(String...strings)throwsException{ log.info("Sendingmessage...."); rabbitTemplate.convertAndSend(RabbitmqApplication.topicExchangeName,"foo.bar.baz","HellofromRabbitMQ!"); receiver.getLatch().await(10000,TimeUnit.MILLISECONDS); } }
请注意,模板将消息路由到交换机,其路由密钥foo.bar.baz与绑定匹配。
可以在测试中模拟出运行器,以便可以单独测试接收器。
运行程序,你应该看到如下输出:
2018-12-0310:23:46.779INFO10828---[main]o.s.b.w.embedded.tomcat.TomcatWebServer:Tomcatstartedonport(s):8080(http)withcontextpath'' 2018-12-0310:23:46.782INFO10828---[main]c.g.unclecatmyself.RabbitmqApplication:StartedRabbitmqApplicationin3.61seconds(JVMrunningfor4.288) 2018-12-0310:23:46.784INFO10828---[main]com.github.unclecatmyself.Runner:Sendingmessage.... 2018-12-0310:23:46.793INFO10828---[container-1]com.github.unclecatmyself.Receiver:Received<HellofromRabbitMQ!> 2018-12-0310:23:46.799INFO10828---[main]o.s.a.r.l.SimpleMessageListenerContainer:Waitingforworkerstofinish. 2018-12-0310:23:47.813INFO10828---[main]o.s.a.r.l.SimpleMessageListenerContainer:Successfullywaitedforworkerstofinish. 2018-12-0310:23:47.815INFO10828---[main]o.s.s.concurrent.ThreadPoolTaskExecutor:ShuttingdownExecutorService'applicationTaskExecutor' 2018-12-0310:23:47.816INFO10828---[main]o.s.a.r.l.SimpleMessageListenerContainer:Shutdownignored-containerisnotactivealready
关于怎么在spring中使用RabbitMQ传递消息问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注恰卡编程网行业资讯频道了解更多相关知识。
推荐阅读
-
Spring框架基于注解开发CRUD详解
-
spring DI依赖注入方式和区别有哪些
-
spring data jpa开启批量插入、批量更新的示例分析
-
spring中怎么利用FactoryBean配置Bean
这篇文章将为大家详细讲解有关spring中怎么利用FactoryBean配置Bean,文章内容质量较高,因此小编分享给大家做个参考...
-
如何解决解决Spring Boot正常启动后访问Controller提示404的问题
小编给大家分享一下如何解决解决SpringBoot正常启动后访问Controller提示404的问题,希望大家阅读完这篇文章之后...
-
Spring中怎么解决循环依赖问题
本篇文章给大家分享的是有关Spring中怎么解决循环依赖问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有...
-
Spring(aop,如何通过获取代理对象实现事务切换)
Spring,aop,如何通过获取代理对象实现事务切换,恰卡网带你了解更多相关信息。Springaop获取代理对象实现...
-
Spring(bean,四种注入方式详解)
Spring,bean,四种注入方式详解,恰卡网带你了解更多相关信息。目录一、Set方式注入pojo层:1.xml文件t...
-
Spring(Cloud,如何保证微服务内安全)
-
Spring(Cloud,Config,使用本地配置文件方式)