前言

MQ,即消息队列Message Queue的缩写。

RabbitMQ 是MQ的一种,就像招商银行是银行的一种一样。主要是用来实现应用程序的异步解耦,同时也能起到消息缓冲,消息分发的作用。

消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在生产消息,从而达到解耦的目的。在分布式的系统中,消息队列也会被用在很多其它的方面,比如:分布式事务的支持,RPC的调用等等。

安装

1.windows

2.centos

springboot集成

简单的(一个生产者,一个消费者,使用TopicExchange)

MAVEN依赖:

		<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

application.properties

根据自己的配置调整

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

配置Queue,Exchange及其绑定关系

@Configuration
public class RabbitConfig { @Bean
public Queue commonQueue() {
return new Queue("commonQueue");
} @Bean
public TopicExchange commonExchange() {
return new TopicExchange("topicExchange");
} @Bean
public Binding commonBinding() {
return BindingBuilder.bind(commonQueue()).to(commonExchange()).with("topic.unique.key");
} }

这里我只配了一个队列,并将其绑定到了指定的TopicExchange上,用于生产者和消费者建立联系。

生产者(发送消息)

springboot已经为我们封装好了Rabbit模板类RabbitTemplate,它可以用来发送和接收消息,直接注入即可使用。

这里我们发送一条日期字符串到服务器。

@Component
public class Producer {
private final RabbitTemplate rabbitTemplate; @Autowired
public Producer(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
} public void send() {
String msg = new Date().toString();
rabbitTemplate.convertAndSend("topicExchange", "topic.unique.key", msg);
LoggerFactory.getLogger(this.getClass()).info("消息{}已发送!", msg);
}
}

注意:send()方法是自定义的,用来供外部调用,可以带参数。

如果有外部程序调用了生成者的send方法,根据exchange和queue可以在服务器上直接查看。

测试类:

@SpringBootTest
@RunWith(SpringRunner.class)
public class SimpleTest { @Autowired
private Producer producer; @Test
public void testSimple() {
producer.send();
}
}

服务器效果:

说明我们的消息发送成功了,那么如何获取并处理呢?

消费者

在springboot接收消息非常容易,只需要在方法上添加注解@RabbitListener并通过queues参数绑定监听的队列即可,由于上例中我们只有一个队列commonQueue,那么我们绑定它并把接收到的消息打印出来:

@Component
public class Consumer extends RabbitProperties.Listener {
private static final Logger LOGGER = LoggerFactory.getLogger(Consumer.class);
private static final String COMMON_QUEUE = "commonQueue"; @RabbitListener(queues = COMMON_QUEUE)
public void dealMessageOfCommonQueue(String msg) {
LOGGER.info("接收到来自队列{}的消息:{}", COMMON_QUEUE, msg);
}
}

启动服务看看会不会从服务器中拿到刚才发送的字符串:



看到打印出来了消息说明成功消费了它,此时如果再去服务器查看,会发现消息为空,因为它已经被消费掉了。

注意:

  • 处理消息的方法中,传入了一个String类型参数,是因为很清楚生产者发送的消息是字符串类型。也可以是其他类型,对的上就行。
  • 用Object类型接收的话,会传入除了发送者发送的消息外还有一些配置信息。故不建议使用Object来入参。
  • 此处为了方便演示,将生产者和消费者写在一个服务中了,它们可以在不同的(微)服务中,此处应该想到前言中的解耦二字。

参考

RabbitMQ学习笔记(一):安装及Springboot集成的更多相关文章

  1. .NET之RabbitMQ学习笔记(二)-安装

    安装 1.安装erlang语言环境 因为rabbitmq是基于erlang进行开发,所以需要安装相应的依赖环境,学习中用到的erlang包下载地址:http://www.erlang.org/down ...

  2. rabbitmq学习笔记1 安装和配置

    环境 OS: CentOS Linux release 7.1.1503 (Core) kernel:3.10.0-229.el7.x86_64   安装 参考:http://www.rabbitmq ...

  3. RabbitMQ学习笔记1-hello world

    安装过程略过,一搜一大把. rabbitmq管理控制台:http://localhost:15672/   默认账户:guest/guest RabbitMQ默认监听端口:5672 JAVA API地 ...

  4. 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群

    在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...

  5. 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ

    鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...

  6. RabbitMQ学习笔记五:RabbitMQ之优先级消息队列

    RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java ...

  7. CentOS学习笔记--Tomcat安装

    Tomcat安装 通常情况下我们要配置Tomcat是很容易的一件事情,但是如果您要架设多用户多服务的Java虚拟主机就不那么容易了.其中最大的一个问题就是Tomcat执行权限.普通方式配置的Tomca ...

  8. RabbitMQ学习笔记(五) Topic

    更多的问题 Direct Exchange帮助我们解决了分类发布与订阅消息的问题,但是Direct Exchange的问题是,它所使用的routingKey是一个简单字符串,这决定了它只能按照一个条件 ...

  9. OracleDesigner学习笔记1――安装篇

    OracleDesigner学习笔记1――安装篇   QQ:King MSN:qiutianwh@msn.com Email:qqking@gmail.com 一.       前言 Oracle是当 ...

  10. (转) Rabbitmq学习笔记

    详见原文: http://blog.csdn.net/shatty/article/details/9529463 Rabbitmq学习笔记

随机推荐

  1. Python- requests详解

    Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...

  2. RabbitMQ文档翻译——Work queues

    原文链接:https://www.rabbitmq.com/tutorials/tutorial-two-java.html Work Queues (using the Java Client) I ...

  3. [转]python进行中文文本聚类(切词以及Kmeans聚类)

    简介 查看百度搜索中文文本聚类我失望的发现,网上竟然没有一个完整的关于Python实现的中文文本聚类(乃至搜索关键词python 中文文本聚类也是如此),网上大部分是关于文本聚类的Kmeans聚类的原 ...

  4. Medium开发团队谈架构设计_转

    转自:Medium开发团队谈架构设计 背景 说到底,Medium是个社交网络,人们可以在这里分享有意思的故事和想法.据统计,目前累积的用户阅读时间已经超过14亿分钟,合两千六百年. 我们支持着每个月两 ...

  5. RavenDb学习(十)附件,存储大对象

    .读取 Raven.Abstractions.Data.Attachment attachment = documentStore.DatabaseCommands.GetAttachment(&qu ...

  6. mysql中varbinary、binary、char、varchar异同

    binary 与 varbinary 类型和char与varchar类型是相似的,只是他们存储的是二进制数据,也就是说他们是包含字节流而不是字符流,他们有二进制字符的集合和顺序,他们的对比,排序是基于 ...

  7. java replaceall 使用正则表达式替换单等号,不替换其他相关的等号。

    写项目需要将公式配置到数据库中,取出后根据公式规则进行比较,由于公式的等于是用单等号,在java中无法直接使用,故需要将单等号替换成双等号,单又不能影响大于等于以及其他形式.故果断选择正则表达式替换. ...

  8. PCL行人检测

    首先我们知道Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很 ...

  9. 攻城狮送女友的CSS3生日蛋糕

    在线预览:http://keleyi.com/keleyi/phtml/html5/29.htm 代码如下: <!DOCTYPE html> <html> <head&g ...

  10. altium designer 软件常用技巧总结(实时更新)

    1.在使用altium designer画PCB时,在PCB界面画线找不到焊盘的中心点,将输入法切换到英文状态,按键盘D---O---勾选snap to object hotspots即可. 2.想高 ...