消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成,通过提供消息传递消息排队模型,它可以在分布式环境下拓展进程间的通信,对于消息中间件,常见的角色大致也就有Producer(生产者).Consumer(消费者)

MQ     消息中间件     消息队列

Message Queue简称MQ

种类:

1.Apache  ActiveMQ  

  ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provider实现.我们在本次课程中介绍ActiveMQ的使用.

2.阿里  RocketMQ

  

3.Pivotal 开发RabbitMQ

  AMQP协议的领导实现,支持多种场景.淘宝的Mysql集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用.

ZeroMQ

  史上最快的消息队列系统.

kafka:

  Apache下的一个子项目.特点:高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统.适合处理海量数据.

使用场景(为什么使用MQ?):

//TODO

JMS简介

什么是JMS?

    JMS(Java Messaging Service)是java平台上有关面向消息中间件的技术规范(可以使用jmsTemplate),它便于消息系统中的java应用程序进行消息交换,并且通过提供标准的产生,发送,接收消息的接口库简化企业应用的开发.

  JMS本身只定义了一系列的接口规范,是一种与厂商无关的API.用来访问消息收发系统.它类似于JDBC(java Database Connectivity);这里,JDBC是可以用来访问许多不同关系数据库的的API.而JMS则提供同样与厂商无关的访问方法,以访问消息收发服务.许多厂商目前都支持JMS,包括IBM的MQseries.BEA的Weblogic.JMSservice和Progress的SonicMQ,这只是几个例子.JMS使您能够通过消息收发服务(有时称为消息中介程序或者路由器)从一个JMS客户机向另一个JMS客户机发送消息,消息是JMS中的一种类型对象,由两部分组成:报头消息主体.

报头由路由信息以及有关该消息的元数据组成.

消息主体则携带着应用程序的数据或有效负载.

  JMS定义了五种不同的消息正文格式,以及调用的消息类型.允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性.

  TextMessage ---一个字符串对象

  MapMessage---一套名称-值对

  ObjectMessage--一个序列化的java对象

  ByteMessage -- 一个字节的数据流

  StreamMessage --Java原始值的数据流

JMS消息传递类型

  对于消息的传递有两种类型:

    一种是点对点,即一个生产者和一个消费者一一对应.

    

    另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收.

JMS入门小Demo

现在是点对点模式:

  点对点的模式主要建立在一个队列上面,当连接一个列队的时候,发送端不需要知道接收端是否正在接收,可以直接行ActiveMQ发送消息,发送的消息,将会先进入队列中,如果有接收端在监听,则会发现接收端,如果没有接收端接收,多个接收端,但是一条消息,只会被一个接收端给接收到,那个接收端先连上ActiveMQ,则会先接收到,而后来的接收端则接收不到那条消息.

创建的是一个没有使用任何骨架的java工程

引入的依赖为:

   <dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.13.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>

代码

/**
* @Auther:qingmu
* @Description:脚踏实地,只为出人头地
* @Date:Created in 16:16 2019/4/23
*/ import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; /**
* 点对点模式
* 生产者
*/ public class QueueProducer {
public static void main(String[] args) throws Exception {
//1.创建连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.200.128:61616");
//2.获取连接
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.获取session (参数1:是否启动事务,参数2:消息确认模式)
/**
* AUTO_ACKNOWLEDGE = 1 自动确认
• CLIENT_ACKNOWLEDGE = 2 客户端手动确认
• DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
• SESSION_TRANSACTED = 0 事务提交并确认 */
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建队列对象
Queue queue = session.createQueue("test-queue");
//6.创建消息生产者
MessageProducer producer = session.createProducer(queue);
//7.创建消息
TextMessage textMessage = session.createTextMessage("欢迎来到神奇的");
//8.发送消息
producer.send(textMessage);
//9.关闭资源
producer.close();
session.close();
connection.close(); }
}

直接运行这个main方法,后可以mq中查看到:

消费者的代码为:

/**
* @Auther:qingmu
* @Description:脚踏实地,只为出人头地
* @Date:Created in 16:23 2019/4/23
*/ import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; /**
* 点对点模式
* 消息消费者
*/
public class QueueConsumer {
public static void main(String[] args) throws Exception{
//1.创建连接工厂
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.200.128:61616");
//2.获取连接
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.获取session (参数1:是否启动事务,参数2:消息确认模式)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建队列对象
Queue queue = session.createQueue("test-queue");
//6.创建消息消费
MessageConsumer consumer = session.createConsumer(queue); //7.监听消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage=(TextMessage)message;
try {
System.out.println("接收到消息:"+textMessage.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//8.等待键盘输入
System.in.read();
//9.关闭资源
consumer.close();
session.close();
connection.close(); }
}

通过上面定义的监听器,可以获取到生产者生产的信息.在控制台上

在进行测试的时候,开启两个以上的消费者,开启一个生产者,然后可以观察到只能在一个消费者的控制台上进行显示,而在另一个消费者的控制台上不能进行打印.

发布和订阅者模式

消费生产者:

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
* @Auther:qingmu
* @Description:脚踏实地,只为出人头地
* @Date:Created in 16:32 2019/4/23
*/
public class TopicProducer {
public static void main(String[] args) throws Exception{
//1.创建连接工厂
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.200.128:61616");
//2.获取连接
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.获取session (参数1:是否启动事务,参数2:消息确认模式)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建主题对象
Topic topic = session.createTopic("test-topic");
//6.创建消息生产者
MessageProducer producer = session.createProducer(topic);
//7.创建消息
TextMessage textMessage = session.createTextMessage("欢迎来到神奇的世界");
//8.发送消息
producer.send(textMessage);
//9.关闭资源
producer.close();
session.close();
connection.close(); }
}

运行完以后的结果为:

消费者为:

/**
* @Auther:qingmu
* @Description:脚踏实地,只为出人头地
* @Date:Created in 16:36 2019/4/23
*/ import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; /**
* 订阅
* 多对多
*/
public class TopicConsumer {
public static void main(String[] args) throws Exception{
//1.创建连接工厂
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.200.128:61616");
//2.获取连接
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.获取session (参数1:是否启动事务,参数2:消息确认模式)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建主题对象
//Queue queue = session.createQueue("test-queue");
Topic topic = session.createTopic("test-topic");
//6.创建消息消费
MessageConsumer consumer = session.createConsumer(topic); //7.监听消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage=(TextMessage)message;
try {
System.out.println("接收到消息:"+textMessage.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//8.等待键盘输入
System.in.read();
//9.关闭资源
consumer.close();
session.close();
connection.close(); }
}

运行测试:

  同时开启2个以上的消费者,再次运行生产者,观察每一个消费者控制台的输出,会发现每个消费者会接收到消息.

MQ(队列消息的入门)的更多相关文章

  1. java 通过jmx获取active mq队列消息

    一.修改active mq配置文件 修改\conf\activemq.xml,带下划线部分 <!-- Licensed to the Apache Software Foundation (AS ...

  2. ASP.NET Core消息队列RabbitMQ基础入门实战演练

    一.课程介绍 人生苦短,我用.NET Core!消息队列RabbitMQ大家相比都不陌生,本次分享课程阿笨将给大家分享一下在一般项目中99%都会用到的消息队列MQ的一个实战业务运用场景.本次分享课程不 ...

  3. 消息队列之-RocketMQ入门

    简介 RocketMQ是阿里开源的消息中间件,目前已经捐献个Apache基金会,它是由Java语言开发的,具备高吞吐量.高可用性.适合大规模分布式系统应用等特点,经历过双11的洗礼,实力不容小觑. 官 ...

  4. springboot整合mq接收消息队列

    继上篇springboot整合mq发送消息队列 本篇主要在上篇基础上进行activiemq消息队列的接收springboot整合mq发送消息队列 第一步:新建marven项目,配置pom文件 < ...

  5. MQ中将消息发送至远程队列的配置

    MQ中将消息发送至远程队列的配置 摘自MQ资源管理器帮助文档V7 在开始学习本教程之前,您需要从系统管理员处了解标识网络上接收机器的名称:IP地址.MQ的端口号.队列管理器.接收(远程机器)或者是发送 ...

  6. SpringBoot集成RabbitMQ消息队列搭建与ACK消息确认入门

    1.RabbitMQ介绍 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.Rabbi ...

  7. .NET 环境中使用RabbitMQ RabbitMQ与Redis队列对比 RabbitMQ入门与使用篇

    .NET 环境中使用RabbitMQ   在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的 ...

  8. Spring和ActiveMQ集成实现队列消息以及PUB/SUB模型

    前言:本文是基于Spring和ActiveMQ的一个示例文章,包括了Point-To-Point的异步队列消息和PUB/SUB(发布/订阅)模型,只是做了比较简单的实现,无任何业务方面的东西,作为一个 ...

  9. MQ队列管理

    分享一段代码,很实用. 下面这段java代码是我在国外一个论坛上发现的,源地址已经忘了.代码的作用是可以删除正在使用的mq的队列消息,管理mq的人一定知道它的美妙了吧,哈哈. 我拿来改了下,增加了2个 ...

随机推荐

  1. day 24 二十四、组合、继承、方法重写和重用、super()

    一.组合 1.定义:自定义类的对象作为类的属性 A类的对象具备某一个属性,该属性的值是B类的对象 基于这种方式就把A类与B类组合到一起 对象既能使用A类中的数据与功能,也能使用B类中的数据与功能 2. ...

  2. ApiKernel

    using System; using System.Runtime.InteropServices; using System.Text; using HANDLE = System.IntPtr; ...

  3. Spring Boot2.1.3全局跨域

    /** * 配置跨域访问 * * @author Terwer */ @Bean public WebMvcConfigurer corsConfigurer() { return new WebMv ...

  4. STA 463 Simple Linear Regression Report

    STA 463 Simple Linear Regression ReportSpring 2019 The goal of this part of the project is to perfor ...

  5. 点击按钮如何改变当前窗口的url

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. netcorec程序部署配置

    IIS方式: 1:iis配置netcore发布的文件 2:iis设置运行库无托管模式 3:安装DotNetCore.1.0.4_1.1.1-WindowsHosting.exe 4:安装dotnet- ...

  7. iStatistica Pro for mac(mac系统监视器)

    iStatistica Pro for mac是一款运行在Mac平台上的mac系统监视器,你可以使用iStatistica pro for mac破解版轻松查看PAM使用情况.CPU信息.磁盘信息.本 ...

  8. jQuery-AutoComplete自动提示简单实现

    注:本次案列实现功能为 用户注册信息,如果数据库对应表中存在部分信息,点击已有的用户的用户名,自动补全其它已有的基本信息 实现思路:通过AutoComplete提示,异步通过用户名查询全表,充当Aut ...

  9. python基础之 time,datetime,collections

    1.time模块 python中的time和datetime模块是时间方面的模块 time模块中时间表现的格式主要有三种: 1.timestamp:时间戳,时间戳表示的是从1970年1月1日00:00 ...

  10. python类与对象-如何派生内置不可变类型并修其改实例化行为

    如何派生内置不可变类型并修其改实例化行为 问题举例 自定义一种新类型的元组,对传入的可迭代对象,我们只保留 其中int类型且值大于0的元素,例如 IntTuple([1, -1, 'abc', 6, ...