1.什么是MQ,有什么用?

MQ 是message queue ,消息队列,也叫消息中间件,遵守JMS(java message service)规范的一种软件。(同时还有另一个叫AMQP的应用层协议,语言无关性不受产品 语言等限制,rabbitMQ支持这个 )

是类似于数据库一样需要独立部署在服务器上的一种应用,提供接口给其他系统调用。

主要用于各个系统之间通信的解耦。

举例:

比如登陆系统,在登陆之后需要调用短信系统给用户发短信说已经登陆,同时还需要调用日志系统记录登陆日志,需要调用积分系统对登陆签到的积分进行增加 等等等。

这种情况下,登陆系统和日志系统,短信系统,积分系统等等 强耦合,其中存在可能调用失败,信息丢失等风险,同时会提高系统复杂度。

比如说登陆之后调用日志系统失败,那么该次登陆的日志信息就会丢失,无法再找回。

而且顺序执行,会导致登陆系统运行效率低。

那么如果使用消息中间件,登陆之后只需要将任务推入到消息队列中,就不用去管了。其他系统则从队列中去获取任务。

实现解耦和异步调用 (异步是相对于同步而言,同步是就等待,当系统执行某个任务的时候,一定要等到该任务结束,系统才会继续往下执行,异步则不等待。)

同时还有可以实现横向拓展 安全可靠优点

2.常见MQ的类型

activeMQ 对java支持良好,缺点是对其他语言支持不够友好,适合中小企业系统

rabbitMQ 对java支持良好,对其他语言也支持良好,跨平台,语言无关

kaffka 日志消息中间件 支持大数据场景

3.JMS规范

MQ实现参照了jms规范,(规范就是一种约定)

该规范中包括

提供者:实现jms规范的中间件服务器

客户端:发送或者接受消息的应用程序

生产者/发布者:创建并发送消息的客户端

消费者/订阅者:接受并处理消息的客户端

消息:应用程序之间传递的内容

消息模式:在客户端之间传递消息的方式,jms中定义了主题和队列两种模式

主题模式:

假如发布者发布了100条消息,那么如果有n个订阅者,每个订阅者都可以获取到100条消息。即订阅者可以获取到所有的消息(但如果订阅是在主题发布消息之后,则获取不到任何消息,只能获取到订阅时间之后主题的发布的消息,比如说A订阅了B, B发布了消息,C再订阅了B,那么只有a能够获取到消息,C不能,因为它的订阅行为发生在B发布消息之后)

队列模式:

假如生产者发送了100条消息,如果有n个消费者,那么每个订阅者加起来获取到的消息总数是100。

没有时间上限制。只要队列中有消息,消费者可以任意时间去取消息,一个消息只能被一个消费者消费。

4.jms约定的接口

ConnectionFactory 获取与MQ服务连接的工厂类

Connection 与MQ服务的连接, 由ConnectionFactory 创建

Session 会MQ服务的会话 由Connection 创建

MessageProducer 消息生产者,由Session 创建

MessageConsumer 消息消费者 由Session创建

Message 消息,由Session创建

Desination 消息的目的地

5.原生实际代码例子

一.原生mq用法 队列, 创建生产者消费者模式

生产者发送消息

------------------------

//1.创建connectionFactory 与mq服务器进行连接

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 为该mq的实现 比如activeMQ rabbitMQ等

// url为服务器地址 tcp格式 比如 tcp://xxxx:xxx

//2.创建Connection

Connection connection=connectionFactory.createConnection();

//3.启动连接

connection,start();

//4.创建会话

Session session=connection.createSession(XXX); //xx为该session的创建时候的参数 比如设定事务,模式等等,具体依据不同的实现形式

//5.创建一个目标

Destination destination=session.createQueue(queueName);

//6.创建一个生产者

MessageProducer producer=session.createProducer(destination);

//7.创建消息

TextMessage textMessage=session.createTextMessage("text");

//8.发送消息

producer.send(textMessage);

//9.关闭连接

connection.close();

----------------

消费者获取消息

//1.创建connectionFactory 与mq服务器进行连接

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 为该mq的实现 比如activeMQ rabbitMQ等

// url为服务器地址 tcp格式 比如 tcp://xxxx:xxx

//2.创建Connection

Connection connection=connectionFactory.createConnection();

//3.启动连接

connection,start();

//4.创建会话

Session session=connection.createSession(XXX); //xx为该session的创建时候的参数 比如设定事务,模式等等,具体依据不同的实现形式

//5.创建一个目标

Destination destination=session.createQueue(queueName);

//6.创建一个消费者

MessageConsumer consumer=session.createConsumer(destination);

//7.创建一个监听器

consumer.setMessageListener(

new MessageListener(){

public void onMessage(Message message){

TextMessage textMessage=(TextMessage)message;

//8.获取消息

textMessage.getText();

}});

//9.关闭连接

connection.close();

二.原生mq用法 主题, 创建发布者 订阅者模式

发布者----

//1.创建connectionFactory 与mq服务器进行连接

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 为该mq的实现 比如activeMQ rabbitMQ等

// url为服务器地址 tcp格式 比如 tcp://xxxx:xxx

//2.创建Connection

Connection connection=connectionFactory.createConnection();

//3.启动连接

connection,start();

//4.创建会话

Session session=connection.createSession(XXX); //xx为该session的创建时候的参数 比如设定事务,模式等等,具体依据不同的实现形式

//5.创建一个目标

Destination destination=session.createTopic(topicName);

//6.创建一个生产者

MessageProducer producer=session.createProducer(destination);

//7.创建消息

TextMessage textMessage=session.createTextMessage("text");

//8.发送消息

producer.send(textMessage);

//9.关闭连接

connection.close();

---订阅者

//1.创建connectionFactory 与mq服务器进行连接

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 为该mq的实现 比如activeMQ rabbitMQ等

// url为服务器地址 tcp格式 比如 tcp://xxxx:xxx

//2.创建Connection

Connection connection=connectionFactory.createConnection();

//3.启动连接

connection,start();

//4.创建会话

Session session=connection.createSession(XXX); //xx为该session的创建时候的参数 比如设定事务,模式等等,具体依据不同的实现形式

//5.创建一个目标

Destination destination=session.createTopic(topicName);

//6.创建一个消费者

MessageConsumer consumer=session.createConsumer(destination);

//7.创建一个监听器

consumer.setMessageListener(

new MessageListener(){

public void onMessage(Message message){

TextMessage textMessage=(TextMessage)message;

//8.获取消息

textMessage.getText();

}});

//9.关闭连接

connection.close();

6.spring集成下的代码例子

ConnectionFactory用于管理连接的连接工厂 这个是

spring提供地连接池,spring提供了SingleConnectionFactory和

CachingConnectionFactory

JmsTemplate用于发送和接受消息的模板类,spring提供的 只要注入这个bean,既可以

用jmsTempalate方便的操作jms 不需要像之前那样写一堆重复代码

这个是线程安全的

MessageListerner 消息监听器,实现了一个onMessage方法,该方法只接收一个Message参数

发送消息的方法

@Autowired

JmsTemplate jmsTemplate;

@Autowired

Destination destination;

jmsTemplate.send(destination,new MessgaeCreator(){

public Message createMessage(Session session) {

TextMessage textMessage=session.createTextMessage("message");

return textMessage;

}});

JmsTemplate实际上就是做了一层封装而已 简化了用法 ,可以参考里面的源代码

--------------------- 
作者:laixiaoxing 
来源:CSDN 
原文:https://blog.csdn.net/qq_20009015/article/details/81409346 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

mq的基本介绍和基本用法的更多相关文章

  1. SolidWorks的简单介绍及基本用法

    写这博客的动机来源于构建之法微信群里面的的一位老师.sw是一个强大的机械设计制图软件,我记得大一的时候学制图学的3d软件是inventor,而后发现sw用起来更方便更高效,于是就自学了sw,由于是自学 ...

  2. FlexboxLayout 的一些基本介绍与基本用法

    1什么是 Flexbox 简单来说 Flexbox 是属于web前端领域CSS的一种布局方案,是2009年W3C提出了一种新的布局方案,可以简便.完整.响应式地实现各种页面布局,并且 React Na ...

  3. SQLite 数据库介绍和基本用法

    Ø  简介 SQLite 是一款轻量级的关系型数据库,同时也是一种嵌入式数据库,与 Oracle.MySQL.SQL Server 等数据库不同,它可以内嵌在程序中,是程序中的一个组成部分.所以,经常 ...

  4. UML类图介绍及简单用法

    原文链接 一.类的属性的表示方式 在UML类图中,类使用包含类名.属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和em ...

  5. jQuery简单介绍及基本用法(选择器&DOM操作)

    简介 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“write Le ...

  6. js的简单介绍及基本用法

    1. JS的简介 概述: JavaScript, 是一门弱类型语言, 用来给页面增加动态功能的. //弱类型语言: 对数据的数据类型划分不精细(不明确). 特点: A. JavaScript 是一种轻 ...

  7. 近期用到了Git,就简单介绍下具体用法吧

    pull:是下拉代码,相等于将远程的代码下载到你本地,与你本地的代码合并push:是推代码,将你的代码上传到远程的动作完整的流程是: 第一种方法:(简单易懂) 1.git add .(后面有一个点,意 ...

  8. 爬虫之Scrapy框架介绍及基础用法

    今日内容概要 爬虫框架之Scrapy 利用该框架爬取博客园 并发编程 今日内容详细 爬虫框架Scrapy 1.什么是框架? 框架类似于房子的结构,框架会提前帮你创建好所有的文件和内部环境 你只需要往对 ...

  9. ElasticSearch介绍和基本用法(一)

    ElasticSearch 引言 1.在海量数据中执行搜索功能时,如果使用MySQL, 效率太低. 2.如果关键字输入的不准确,一样可以搜索到想要的数据. 3.将搜索关键字,以红色的字体展示. 介绍: ...

随机推荐

  1. maven管理jar,pom.xml导入spring依赖

    <properties> <junit.version>4.12</junit.version> <spring.version>4.3.9.RELEA ...

  2. webpack-dev-server报错

    运行npm run dev报错,---- webpack-dev-server --inline --progress --config build/webpack.dev.conf.js npm E ...

  3. python小趣味_520绘制一个心形.

    从某个公众号上看到的. 跑了一下, 居然可以成功运行. 有心的话可以研究下代码. 利用了turtle模块 #!/usr/bin/env python # coding:utf-8 import tur ...

  4. shell脚本定义输出字符颜色

    #-------------------定义输入颜色---------------------# RED='\033[1;31m' GREEN='\033[1;32m' YELLOW='\033[1; ...

  5. holer实现外网访问内网数据库

    外网访问本地数据库 本地安装了数据库,只能在局域网内访问,怎样从公网也能访问内网数据库? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安装并启动数据库 默认安装的数据库端口是33 ...

  6. 今日bug:error: invalid array assignment

    错误代码: struct STUD { int ID;//学号 ]; float score; }stud; STUD SS[]; student.open("student.dat&quo ...

  7. 剑指Offer 63. 数据流中的中位数(其他)

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...

  8. WEB学习笔记8-添加javascript禁用的提示

    最常用的方式是使用<noscript>标签,此标签就是当javascript被禁用或者不被支持的时候提供一种代替方式,即<noscript>标签的内容会在此时被浏览器解析,作为 ...

  9. if ,while ,for 的掌握

    a)python的缩进和冒号 对于Python而言代码缩进是一种语法,Python没有像其他语言一样采用{}或者begin...end分隔代码块,而是采用代码缩进和冒号来区分代码之间的层次. 缩进的空 ...

  10. iOS保持待续连接

    当iphone应用程序进行网络编程时,切到后台后,socket连接会断掉,ios的设计就是这样. 但是好在apple公司也没有那么绝,还是有一些东西可以在后台运行的(backgroundmodes), ...