怎么在spring中使用RabbitMQ传递消息

  • 时间:
  • 浏览:44
  • 来源:恰卡网

导读怎么在spring中使用RabbitMQ传递消息?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 构建 构建一个使用Spring AM...

怎么在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
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传递消息问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注恰卡网行业资讯频道了解更多相关知识。

猜你喜欢

飞利浦278E1显示器体验如何(飞利浦278E1显示器体验评测)

飞利浦278E1显示器体验如何,飞利浦278E1显示器体验评测 目前27寸显示器已经成为了市面上的主流产品。这样尺寸的显示器在桌面上,整体的观感更好,再搭配了更高的分辨率,让显示器可以显示

2021-06-22

Python(中的单分派泛函数你真的了解吗)

Python,中的单分派泛函数你真的了解吗 泛型,如果你学过Java ,应该对它不陌生吧。但你可能不知道在 Python 中(3.4+ ),也可以实现简单的泛型函数。 在Python中只能实现基于单个(第一个)参

2021-06-22

Java8新特性:函数式编程

Java8新特性:函数式编程 首先需要清楚一个概念:函数式接口;它指的是有且只有一个未实现的方法的接口,一般通过FunctionalInterface这个注解来表明某个接口是一个函数式接口。函数式接口是

2021-06-22

Python实现DBSCAN聚类算法并样例测试

Python实现DBSCAN聚类算法并样例测试 什么是聚类算法?聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,

2021-06-22