SpringBoot对异步消息(MQ)的支持

1.异步消息的定义

  异步消息的主要目的是为了系统与系统之间的通信,所谓异步消息即消息发送者无需等待消息接收者的处理以及返回,甚至无需关心消息是否发送成功
  在异步消息中有两个很重要的概念,即消息代理和目的地,当消息发送者发送消息之后,消息将由消息代理接管,消息代理保证消息传递到指定目的地。
  异步消息主要有两种目的地形式,队列(queue)和主题(topic),队列用于点对点形式的消息通信,主题用于发布订阅式的消息通信。

1.1目的地形式分类

1.1.1点对点式

  当消息发送者发送消息,消息代理将消息后将消息放进一个队列里,当有消息接收者来接收消息的时候,消息将从队列中取出传递给消息接收者,这时候队列里就没有了这条消息。点对点式确保每一条消息只有唯一的发送者和接收者,但这并不能说明只有一个接收者能够从队列中接收消息,因为队列中有多个消息,点对点式只保证每一条消息只有唯一的发送者和接收者

1.1.2发布/订阅式

  发布订阅式是消息发送者发送消息到主题,而多个消息接收者监听这个主题,此时的消息发送者和接收者分别叫做发布者和订阅者

1.2 企业级消息代理

  JMS即JAVA消息服务,是基于JVM的消息代理规范,ActiveMQ是一个JMS的实现
AMQP也是一个消息代理的规范,他不仅兼容JMS,还支持跨语言和平台,AMQP的主要实现是RabbitMQ

1.3 Spring以及SpringBoot的支持

  Spring针对JMS和RabbitMQ分别提供了JmsTemplete和RabbitTemplete来发送消息。为我们提供了@JmsListener,@RabbitListener注解来监听消息代理发送的消息。我们分别需要通过@EnableJms和@EnableRabbit来开启支持
  SpringBoot自动配置了上述@EnableJms,@EnableRabbit,JmsTemplete,RabbitTemplete的支持,同时我们可以在application.properties文件中分别以spring.activemq和spring.rabbitmq来分别配置所需的属性。

2.SpringBoot对JMS(ActiveMQ)的支持

下载安装

ActiveMQ的官方下载地址:http://activemq.apache.org/download.html,下载安装完成后
进入bin目录,发现有win32和win64两个文件夹,这2个文件夹分别对应windows32位和windows64位操作系统的启动脚本。进入对应的文件夹中双击activemq.bat。即可正常启动
访问http://localhost:8161/admin。输入默认的用户名和密码:admin/admin即可进入ActiveMQ的控制台

2.2 配置

SpringBoot提供了针对ActiveMQ的支持,只需要在pom.xml文件中引入即可:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>

在application.properties配置ActiveMQ的消息代理地址:

spring.activemq.broker-url=tcp://localhost:61616

注意,此处配置的消息代理必须让ActiveMQ启动时才有作用,否则无效

在实际情况下,消息的发布者和接受者一般都是分开的,而这里,我们仅作测试,将消息发送者和接收者放在一个程序中

2.3代码文件

2.3.1消息定义

public class Msg implements MessageCreator {
    @Override
    public Message createMessage(Session session) throws JMSException {
        return session.createTextMessage("测试消息");
    }
}

2.3.2消息发送及目的地定义

@SpringBootApplication
public class SpringBootMqApplication implements CommandLineRunner{

    @Autowired
    JmsTemplate  jmsTemplate;
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMqApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
            jmsTemplate.send("my-destination",new Msg());
    }
}

CommandLineRunner接口中的run方法,是在程序启动后就会执行的代码。JmsTemplate 是用来操作JMS消息的操作类。

2.3.3消息监听

@Component
public class Receiver {
    @JmsListener(destination = "my-destination")
    public void  receivedMessage(String message){
        System.out.println("接受到"+message);
    }
}

@JmsListener显示的定义了指定要监听的目的地。

2.3.4运行结果

运行结果显示监听收到了消息


这里写图片描述

ActiveMQ的控制台中显示我们发送的消息


这里写图片描述

3.SpringBoot对AMQP(RabbitMQ)的支持

3.1RabbitMQ的安装配置

  RabbitMQ是基于Erlang语言开发的。所以安装RabbitMQ之前需要先下载安装配置Erlang,下载地址:http://www.erlang.org/downloads
并将安装后的D:\Program Files\erl9.0\bin的bin目录配置到path环境变量中。然后下载安装RabbitMQ。下载地址:http://www.rabbitmq.com/download.html
安装完成之后在开始菜单中找到RabbitMQ Command Promt,打开控制台,输入命令

rabbitmq-plugins enable rabbitmq_management

控制台无错误之后,访问http://localhost:15672。使用默认的用户名/密码:guest/guest进行登录
即可见到如图所示界面:

这里写图片描述

3.2 RabbitMQ测试代码文件

SpringBoot默认Rabbit的主机为localhost,端口号为5672,所以我们无需为RabbitMQ配置其他信息。
入口文件

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.lang.annotation.Annotation;

@SpringBootApplication
public class SpringBootAmqpApplication implements CommandLineRunner {
    @Autowired
     RabbitTemplate rabbitTemplate;
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAmqpApplication.class, args);
    }

    @Bean //2
    public Queue wiselyQueue(){
        return new Queue("my-queue");
    }

    @Override
    public void run(String... strings) throws Exception {
        rabbitTemplate.convertAndSend("my-queue","来自RabbitMQ的问候");
    }
}

接收类

@Component
public class Receiver {
    @RabbitListener(queues = "my-queue")
    public  void  ReceiveMesaage(String  message){
        System.out.println("接受到"+message);
    }
}

3.3 测试结果

这里写图片描述

在RabbitMQ控制台中额可以看到


这里写图片描述

4 小结

  这里主要是对ActiveMQ和RabbitMQ进行了简单的尝试,了解了异步消息的通信。有兴趣的同学可以进行深入研究。

代码文件
参考书籍:JavaEE开发的颠覆者--SpringBoot实战

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容