spring-boot 集成 rabbitmq

本文转载自:https://blog.csdn.net/zl18310999566/article/details/54341057

之前说了集成的ActiveMQ,那就再说说集成另一个很火的MQ,兔子。

本文示例主要参看官方的演示

https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-amqp

https://github.com/spring-projects/spring-amqp-samples

的RabbitMQ

介绍

的RabbitMQ是流行的开源消息队列系统,用二郎语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现。


概念

  • 经纪人:简单来说就是消息队列服务器实体。
  • 外汇:消息交换机,它指定消息按什么规则,路由到哪个队列。
  • 队列:消息队列载体,每个消息都会被投入到一个或多个队列。
  • 绑定:绑定,它的作用就是把交换和队列按照路由规则绑定起来。
  • 路由密钥:路由关键字,交换根据这个关键字进行消息投递。
  • 虚拟主机:虚拟主机,一个经纪人里可以开设多个虚拟主机,用作不同用户的权限分离。
  • 制片人:消息生产者,就是投递消息的程序。
  • 消费者:消息消费者,就是接受消息的程序。
  • 信道:消息通道,在客户端的每个连接里,可建立多个信道,每个信道代表一个会话任务。

使用过程

  1. 客户端连接到消息队列服务器,打开一个信道。
  2. 客户端声明一个交换,并设置相关属性。
  3. 客户端声明一个队列,并设置相关属性。
  4. 客户端使用路由密钥,在交换和队列之间建立好绑定关系。
  5. 客户端投递消息到交换。
交换接收到消息后,就根据消息的关键和已经设置的结合,进行消息路由,将消息投递到一个或多个队列里。
exchange也有几个类型,完全根据key进行投递的叫做直接交换机,例如,绑定时设置了routing key为“abc”,那么客户端提交的消息,只有设置了key为“abc”的才会投递到队列。对按键进行模式匹配后进行投递的叫做主题交换机,符号”#”匹配一个或多个词,符号” *”匹配正好一个词。例如” ABC。#”匹配” abc.def.ghi” “ABC *”只匹配” abc.def”。还有一种不需要钥匙的,叫做扇出交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。
。RabbitMQ的支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化消息队列持久化包括3个部分:
  1. exchange持久化,在声明时指定durable => 1
  2. 队列持久化,在声明时指定耐用=> 1
  3. 消息持久化,在投递时指定delivery_mode => 2(1是非持久化)
如果交换和队列都是持久化的,那么它们之间的结合也是持久化的。如果交换和队列两者之间有一个持久化,一个非持久化,就不允许建立绑定。
以上内容抄自百岁百科RabbitMQ百度百科
其它关于RabbitMQ的介绍的看可以  http://www.cnblogs.com/qiyebao/p/4205626.html

Spring-boot集成rabbitmq

添加Maven的依赖

[html]   查看纯 文本  
  1. < dependency >  
  2.       < groupId > org.springframework.boot </ groupId >  
  3.       < artifactId > spring-boot-starter-amqp </ artifactId >  
  4. </ dependency >  

简单实现

配置

在application.properties中增加如下配置
[纯]   查看纯 文本  
  1. spring.rabbitmq.addresses = 127.0.0.1:5672  
  2. spring.rabbitmq.username =客人  
  3. spring.rabbitmq.password =客人  
  4. spring.rabbitmq.publisher-确认=真  
  5. spring.rabbitmq.virtual主机= /  
RabbitMQ的端口说明:5672-AMQP,25672聚类,61613-蹬地,1883年,MQTT

消息生产者

[java]   查看纯 文本  
  1.  com.rabbitmq.send;  
  2.   
  3. import  org.springframework.amqp.rabbit.core.RabbitTemplate;  
  4. import  org.springframework.beans.factory.annotation.Autowired;  
  5. import  org.springframework.stereotype.Component;  
  6.   
  7. @零件  
  8. 公共 发件人{   
  9.   
  10.     @Autowired  
  11.     私人 兔子模板rabbitTemplate;  
  12.   
  13.     public void  send(String msg){   
  14.         这个.rabbitTemplate.convertAndSend(“foo” ,msg);  
  15.     }  
  16. }  

消息监听者

[java]   查看纯 文本  
  1.  com.rabbitmq.listener;  
  2.   
  3. 导入 org.slf4j.Logger;  
  4. import  org.slf4j.LoggerFactory;  
  5. import  org.springframework.amqp.core.Queue;  
  6. import  org.springframework.amqp.rabbit.annotation.RabbitHandler;  
  7. import  org.springframework.amqp.rabbit.annotation.RabbitListener;  
  8. import  org.springframework.context.annotation.Bean;  
  9. import  org.springframework.context.annotation.Configuration;  
  10. import  org.springframework.messaging.handler.annotation.Payload;  
  11.   
  12. @组态  
  13. @RabbitListener (queues =  “foo” )  
  14. 公共 Listener {   
  15.   
  16.     私人静态最终 记录器记录仪= LoggerFactory.getLogger(监听器。);    
  17.   
  18.     @豆  
  19.     公共 队列fooQueue(){  
  20.         返回新的 队列(“foo” );   
  21.     }  
  22.   
  23.     @RabbitHandler  
  24.     public void  process(@Payload  String foo){   
  25.         LOGGER.info(“Listener:”  + foo);  
  26.     }  
  27. }  

测试控制器

[java]   查看纯 文本  
  1.  com.rabbitmq.controller;  
  2.   
  3. import  com.rabbitmq.send.Sender;  
  4. import  org.springframework.beans.factory.annotation.Autowired;  
  5. import  org.springframework.web.bind.annotation.GetMapping;  
  6. import  org.springframework.web.bind.annotation.RestController;  
  7.   
  8. import  javax.servlet.http.HttpServletRequest;  
  9.   
  10. @RestController  
  11. 公共 RabbitmqController {   
  12.   
  13.     @Autowired  
  14.     私人 发件人发件人;  
  15.   
  16.     @GetMapping “/ send” )  
  17.     公共 字符串发送(HttpServletRequest请求,字符串味精){  
  18.         sender.send(MSG);  
  19.         返回“发送OK”。;   
  20.     }  
  21. }  

测试

启动服务,在浏览器输入http://127.0.0.1:8080/send?msg=this%20is%20a%20test,点击回车可以在控制台看到如下输出
[纯]   查看纯 文本  
  1. INFO 5559 --- [cTaskExecutor-1] c.rabbitmq.listener.Listener:Listener:这是一个测试  
  2. [SimpleAsyncTaskExecutor-1]信息c.rabbitmq.listener.Listener - Listener:这是一个测试  

带ConfirmCallback的使用

增加回调处理,这里不再使用application.properties默认配置的方式,会在程序中显示的使用文件中的配置信息。

配置

[java]   查看纯 文本  
  1.  com.rabbitmq.config;  
  2.   
  3. import  org.springframework.amqp.rabbit.connection.CachingConnectionFactory;  
  4. import  org.springframework.amqp.rabbit.connection.ConnectionFactory;  
  5. import  org.springframework.amqp.rabbit.core.RabbitTemplate;  
  6. import  org.springframework.beans.factory.annotation.Value;  
  7. import  org.springframework.beans.factory.config.ConfigurableBeanFactory;  
  8. import  org.springframework.context.annotation.Bean;  
  9. import  org.springframework.context.annotation.Configuration;  
  10. import  org.springframework.context.annotation.Scope;  
  11.   
  12. @组态  
  13. 公共 AmqpConfig {   
  14.   
  15.     public static final  String FOO_EXCHANGE =  “callback.exchange.foo” ;    
  16.     public static final  String FOO_ROUTINGKEY =  “callback.routingkey.foo” ;    
  17.     public static final  String FOO_QUEUE =  “callback.queue.foo” ;    
  18.   
  19.     @Value “$ { spring.rabbitmq.addresses }” )  
  20.     私人 字符串地址;  
  21.     @Value “$ { spring.rabbitmq.username }” )  
  22.     私人 字符串用户名  
  23.     @Value “$ { spring.rabbitmq.password }” )  
  24.     私人 字符串密码;  
  25.     @Value “$ { spring.rabbitmq.virtual -host}” )  
  26.     私人 字符串virtualHost;  
  27.     @Value “$ { spring.rabbitmq.publisher -confirms}” )  
  28.     私人布尔 publisherConfirms;   
  29.   
  30.     @豆  
  31.     public  ConnectionFactory connectionFactory(){  
  32.         CachingConnectionFactory connectionFactory =  new  CachingConnectionFactory();  
  33.         connectionFactory.setAddresses(地址);  
  34.         connectionFactory.setUsername(用户名);  
  35.         connectionFactory.setPassword(密码);  
  36.         connectionFactory.setVirtualHost(虚拟主机);  
  37.         / **如果要进行消息回调,则这里必须要设置为true * /  
  38.         connectionFactory.setPublisherConfirms(publisherConfirms);  
  39.         返回 connectionFactory;  
  40.     }  
  41.   
  42.     @豆  
  43.     / **因为要设置回调类,所以应该是prototype类型,如果是单例类型,则回调类为最后一次设置* /  
  44.     @Scope (ConfigurableBeanFactory.SCOPE_PROTOTYPE)  
  45.     public  RabbitTemplate rabbitTemplate(){  
  46.         RabbitTemplate template =  new  RabbitTemplate(connectionFactory());  
  47.         返回 模板;  
  48.     }  
  49.   
  50. }  


消息生产者

[java]   查看纯 文本  
  1.  com.rabbitmq.send;  
  2.   
  3. import  com.rabbitmq.config.AmqpConfig;  
  4. 导入 org.slf4j.Logger;  
  5. import  org.slf4j.LoggerFactory;  
  6. import  org.springframework.amqp.rabbit.core.RabbitTemplate;  
  7. import  org.springframework.amqp.rabbit.support.CorrelationData;  
  8. import  org.springframework.beans.factory.annotation.Autowired;  
  9. import  org.springframework.stereotype.Component;  
  10.   
  11. import  java.util.UUID;  
  12.   
  13. @零件  
  14. 公共 发件人  实现 RabbitTemplate.ConfirmCallback {   
  15.   
  16.     私人静态最终 记录器记录仪= LoggerFactory.getLogger(发件人。);    
  17.   
  18.     私人 兔子模板rabbitTemplate;  
  19.   
  20.     @Autowired  
  21.     公共 发件人(RabbitTemplate rabbitTemplate){  
  22.         这个.rabbitTemplate = rabbitTemplate;  
  23.         这个.rabbitTemplate.setConfirmCallback(this );  
  24.     }  
  25.   
  26.     public void  send(String msg){   
  27.         CorrelationData correlationData =  new  CorrelationData(UUID.randomUUID()。toString());  
  28.         LOGGER.info(“send:”  + correlationData.getId());  
  29.         这个.rabbitTemplate.convertAndSend(AmqpConfig.FOO_EXCHANGE,AmqpConfig.FOO_ROUTINGKEY,msg,correlationData);  
  30.     }  
  31.   
  32.     / **回调方法* /  
  33.     @覆盖  
  34.     public void  confirm(CorrelationData correlationData,  boolean  ack,String cause){   
  35.         LOGGER.info(“confirm:”  + correlationData.getId());  
  36.     }  
  37. }  

消息监听者

[java]   查看纯 文本  
  1.  com.rabbitmq.listener;  
  2.   
  3. import  com.rabbitmq.config.AmqpConfig;  
  4. 导入 org.slf4j.Logger;  
  5. import  org.slf4j.LoggerFactory;  
  6. import  org.springframework.amqp.core.Binding;  
  7. import  org.springframework.amqp.core.BindingBuilder;  
  8. import  org.springframework.amqp.core.DirectExchange;  
  9. import  org.springframework.amqp.core.Queue;  
  10. import  org.springframework.amqp.rabbit.annotation.RabbitHandler;  
  11. import  org.springframework.amqp.rabbit.annotation.RabbitListener;  
  12. import  org.springframework.context.annotation.Bean;  
  13. import  org.springframework.context.annotation.Configuration;  
  14. import  org.springframework.messaging.handler.annotation.Payload;  
  15.   
  16. @组态  
  17. @RabbitListener (队列= AmqpConfig.FOO_QUEUE)  
  18. 公共 Listener {   
  19.   
  20.     私人静态最终 记录器记录仪= LoggerFactory.getLogger(监听器。);    
  21.   
  22.     / **设置交换机类型* /  
  23.     @豆  
  24.     public  DirectExchange defaultExchange(){  
  25.         / ** 
  26.          * DirectExchange:按照路由密钥分发到指定队列 
  27.          * TopicExchange:多关键字匹配 
  28.          * FanoutExchange:将消息分发到所有的绑定队列,无路由密钥的概念 
  29.          * HeadersExchange:通过添加属性键值匹配 
  30.          * /  
  31.         返回新的 DirectExchange(AmqpConfig.FOO_EXCHANGE);   
  32.     }  
  33.   
  34.     @豆  
  35.     公共 队列fooQueue(){  
  36.         返回新的 队列(AmqpConfig.FOO_QUEUE);   
  37.     }  
  38.   
  39.     @豆  
  40.     公共 绑定绑定(){  
  41.         / **将队列绑定到交换机* /  
  42.          用(AmqpConfig.FOO_ROUTINGKEY)返回BindingBuilder.bind(fooQueue())。(defaultExchange())。  
  43.     }  
  44.   
  45.     @RabbitHandler  
  46.     public void  process(@Payload  String foo){   
  47.         LOGGER.info(“Listener:”  + foo);  
  48.     }  
  49. }  
或者使用下面的代码来代替@RabbitHandler注解的工艺方法
[java]   查看纯 文本  
  1. @豆  
  2. public  SimpleMessageListenerContainer messageContainer(){  
  3.     SimpleMessageListenerContainer container =  new  SimpleMessageListenerContainer(connectionFactory());  
  4.     container.setQueues(fooQueue());  
  5.     container.setExposeListenerChannel(true );  
  6.     container.setMaxConcurrentConsumers(1 );  
  7.     container.setConcurrentConsumers(1 );  
  8.     container.setAcknowledgeMode(AcknowledgeMode.MANUAL); //设置确认模式手工确认  
  9.     container.setMessageListener(new  ChannelAwareMessageListener(){  
  10.   
  11.         @覆盖  
  12.         public void  onMessage(Message message,Channel channel)  throws  Exception {   
  13.             byte [] body = message.getBody();  
  14.             LOGGER.info(“Listener onMessage:”  +  new  String(body));  
  15.             channel.basicAck(message.getMessageProperties()。getDeliveryTag(),  false ); //确认消息成功消费  
  16.         }  
  17.     });  
  18.     返回 容器;  
  19. }  
参看这里了这篇博文  http://blog.csdn.net/liaokailin/article/details/49559571

测试

运行服务,刷新上面的测试链接,可以在控制台看到如下输出
[纯]   查看纯 文本  
  1. INFO 15122 --- [nio-8080-exec-1] com.jikefriend.rabbitmq.send.Sender:send:c678afb7-af8b-42b2-9370-ea7f9d6004a0  
  2. [http-nio-8080-exec-1] INFO com.jikefriend.rabbitmq.send.Sender - send:c678afb7-af8b-42b2-9370-ea7f9d6004a0  
  3. INFO 15122 --- [127.0.0.1:5672] com.jikefriend.rabbitmq.send.Sender:confirm:c678afb7-af8b-42b2-9370-ea7f9d6004a0  
  4. [AMQP Connection 127.0.0.1:5672] INFO com.jikefriend.rabbitmq.send.Sender - confirm:c678afb7-af8b-42b2-9370-ea7f9d6004a0  
  5. INFO 15122 --- [cTaskExecutor-1] c.jikefriend.rabbitmq.listener.Listener:Listener:这是一个测试  
  6. [SimpleAsyncTaskExecutor-1]信息cjrabbitmq.listener.Listener - Listener:这是一个测试 

猜你喜欢

转载自blog.csdn.net/qq_40074764/article/details/80607092