RabbitMq 集成 spring boot 消息队列 入门Demo

简介:

spring boot 集成 RabbitMq还是很方便的。现在来一个简单的例子来集成rabbitmq。入门demo。

主要概念:

其中比较重要的概念有 4 个,分别为:虚拟主机,交换机,队列,和绑定。


虚拟主机:一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?很简单,RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制。 因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机“/”。

交换机:Exchange 用于转发消息,但是它不会做存储 ,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。 这里有一个比较重要的概念:路由键 。消息到交换机的时候,交互机会转发到对应的队列中,那么究竟转发到哪个队列,就要根据该路由键。

绑定:也就是交换机需要和队列相绑定,这其中如上图所示,是多对多的关系。


首先是配制文件。

1
2
3
4
5
#spring.application.name=spring-boot-rabbitmq
spring.rabbitmq.host= 127.0 . 0.1
spring.rabbitmq.port= 5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest


发送者:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package  com.basic.rabbitmq.send;
 
import  com.basic.rabbitmq.configuration.RabbitMqConfig2;
import  org.springframework.amqp.core.AmqpTemplate;
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.stereotype.Component;
import  org.springframework.stereotype.Service;
 
import  java.util.Date;
 
/**
  * Created by sdc on 2017/6/17.
  */
@Service ( "helloSender" )
public  class  HelloSender {
 
     @Autowired
     private  AmqpTemplate amqpTemplate;
 
//    private Rabbitt
 
     public  void  send() {
         String contenxt =  "order_queue_message" ;
         this .amqpTemplate.convertAndSend(RabbitMqConfig2.QUEUE_EXCHANGE_NAME, "order_queue_routing" ,contenxt);
//        this.amqpTemplate.conver
     }
 
}


配制信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package  com.basic.rabbitmq.configuration;
 
import  com.basic.rabbitmq.receiver.Receiver;
import  com.rabbitmq.client.Channel;
import  com.rabbitmq.client.ConfirmListener;
import  org.springframework.amqp.core.*;
import  org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import  org.springframework.amqp.rabbit.connection.ConnectionFactory;
import  org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;
import  org.springframework.amqp.rabbit.listener.MessageListenerContainer;
import  org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import  org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import  org.springframework.context.annotation.Bean;
import  org.springframework.context.annotation.Configuration;
 
import  java.io.IOException;
 
/**
  * Created by sdc on 2017/6/17.
  */
@Configuration
public  class  RabbitMqConfig2 {
 
     public  static  final  String QUEUE_NAME =  "order_queue" ;
 
     public  static  final  String QUEUE_EXCHANGE_NAME =  "topic_exchange_new" ;
 
     public  static  final   String routing_key =  "order_queue_routing" ;
 
     @Bean
     public  Queue queue() {
         //是否持久化
         boolean  durable =  false ;
         //仅创建者可以使用该队列,断开后自动删除
         boolean  exclusive =  false ;
         //当所有消费者都断开连接后,是否删除队列
         boolean  autoDelete =  false ;
         return  new  Queue(QUEUE_NAME, durable, exclusive, autoDelete);
     }
 
     @Bean
     public  TopicExchange exchange() {
         //是否持久化
         boolean  durable =  false ;
         //当所有消费者都断开连接后,是否删除队列
         boolean  autoDelete =  false ;
         return   new  TopicExchange(QUEUE_EXCHANGE_NAME, durable, autoDelete);
     }
 
     @Bean
     public  Binding binding() {
         return  BindingBuilder.bind(queue()).to(exchange()).with(routing_key);
     }
 
     @Bean
     public  ConnectionFactory connectionFactory() {
         CachingConnectionFactory connectionFactory =  new  CachingConnectionFactory( "127.0.0.1" , 5672 );
 
         connectionFactory.setUsername( "admin" );
         connectionFactory.setPassword( "admin" );
         connectionFactory.setVirtualHost( "/" );
         /** 如果要进行消息回调,则这里必须要设置为true */
         connectionFactory.setPublisherConfirms( true );  // 必须要设置
//        connectionFactory.setPublisherReturns();
         return  connectionFactory;
     }
 
     @Bean
     SimpleMessageListenerContainer container() {
 
         SimpleMessageListenerContainer container =  new  SimpleMessageListenerContainer();
         container.setConnectionFactory(connectionFactory());
//        container.setQueueNames(QUEUE_NAME);
         container.setQueues(queue());
         container.setAcknowledgeMode(AcknowledgeMode.MANUAL);  //设置确认模式手工确认
         container.setMessageListener( new  ChannelAwareMessageListener() {
             @Override
             public  void  onMessage(Message message, Channel channel)  throws  Exception {
                 byte [] body = message.getBody();
                 System.out.println( "收到消息 : "  new  String(body));
                 channel.queueDeclare(QUEUE_NAME,  true false false null );
//                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //确认消息成功消费
//                channel.basicAck(); //应答
//                channel.basicReject();//拒绝
//                channel.basicRecover(); //恢复
//                channel.basicQos();
//                channel.addConfirmListener(new ConfirmListener() {
//                    @Override
//                    public void handleAck(long deliveryTag, boolean multiple) throws IOException {
//                        //失败重发
//                    }
//
//                    @Override
//                    public void handleNack(long deliveryTag, boolean multiple) throws IOException {
//                        //确认ok
//                    }
//                });
             }
         });
         return   container;
     }
 
//    @Bean
//    MessageListenerAdapter listenerAdapter(Receiver receiver) {
//        return new MessageListenerAdapter(receiver, "receiveMessage");
//    }
 
}


测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package  com.rabbit.test;
 
import  com.basic.rabbitmq.send.HelloSender;
import  com.basic.system.Application;
import  org.junit.Test;
import  org.junit.runner.RunWith;
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.boot.test.context.SpringBootTest;
import  org.springframework.test.context.junit4.SpringRunner;
 
import  javax.annotation.Resource;
 
/**
  * Created by sdc on 2017/6/17.
  */
@RunWith(SpringRunner. class )
@SpringBootTest(classes = Application. class )
public  class  RabbitMqTest {
 
     @Autowired
     public  HelloSender helloSender;
 
     @Test
     public  void helloword() throws  Exception {
         helloSender.send();
     }
 
 
}


这只是一个demo,学习的时候会测试各种的事情,在这基础上更改就可以了,心中的疑虑测试没了就可以写一些项目了。


本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/1944218


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2天前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
15 1
|
11天前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
16天前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
49 5
|
12天前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
18 1
|
14天前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!
|
24天前
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
58 5
|
22天前
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践
|
2天前
|
XML 存储 Java
SpringBoot集成Flowable:构建强大的工作流引擎
在企业级应用开发中,工作流管理是核心功能之一。Flowable是一个开源的工作流引擎,它提供了BPMN 2.0规范的实现,并且与SpringBoot框架完美集成。本文将探讨如何使用SpringBoot和Flowable构建一个强大的工作流引擎,并分享一些实践技巧。
14 0
|
27天前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
48 1
|
27天前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
75 0

相关产品

  • 云消息队列 MQ
  • 下一篇
    无影云桌面