一、消息中间件概述

什么是消息中间件

发送者将消息发送给消息服务器,消息服务器将消感存放在若千队列中,在合适的时候再将消息转发给接收者。
这种模式下,发送和接收是异步的,发送者无需等待; 二者的生命周期未必相同: 发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信: 对于一个消息可以有多个接收者。

二、JMS的介绍

2.1什么是JMS?

JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。

2.2消息模型

  • P2P (点对点):

    1.P2P模式图



    里面涉及到的概念以及其中的特点

    1.消息队列(Queue)

    2.发送者(Sender)

    3.接收者(Receiver)

    4.每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。

    特点:

    1.每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

    2.发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列

    3.接收者在成功接收消息之后需向队列应答成功
  • Pub/Sub (发布与订阅)

    Pub/Sub模式图

里面涉及到的概念以及特点

1.主题(Topic)

2.发布者(Publisher)

3.订阅者(Subscriber)

客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

Pub/Sub的特点

1.每个消息可以有多个消费者

2.发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。

  • 消息的消费的两个方式
  1. 同步

    订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞。

    2.异步

    订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。

应用场景:

用户注册、订单修改库存、日志存储

ActiveMQ的使用

window下 ActiveMQ安装

解压当前activeMQ



进入bin目录下启动64位系统下的



启动成功访问页面:

使用ActiveMQ完成点对点(p2p)通讯模式

引入pom文件依赖

  <dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
</dependencies>

生产者代码

	public static void main(String[] args) throws JMSException {
//连接工厂JMS 用它创建连接
ConnectionFactory collectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616"); Connection createConnection = collectionFactory.createConnection();
createConnection.start(); // Session: 一个发送或接收消息的线程
Session session = createConnection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// Destination :消息的目的地;消息发送给谁.
// 获取session注意参数值xiaobai是Query的名字 Destination destination = session.createQueue("xiaobai");
//MessageProducer:消息生产者
MessageProducer producer = session.createProducer(destination); //设置持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 0; i < 5; i++) {
System.out.println("我是生产者" + i);
sendMsg(session, producer, "我是生产者" + i);
session.commit();
} System.out.println("我是生产者发送完毕" );
} public static void sendMsg(Session session, MessageProducer producer, String i) throws JMSException {
TextMessage textMessage = session.createTextMessage("hello activemq" + i);
producer.send(textMessage); }

消费者代码:

	//连接工厂,JMS 用它创建连接
ConnectionFactory collectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616"); Connection createConnection = collectionFactory.createConnection();
createConnection.start();
//Session: 一个发送或接收消息的线程
Session session = createConnection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("xiaobai");
MessageConsumer createConsumer = session.createConsumer(destination);
while (true) {
TextMessage textMessage = (TextMessage) createConsumer.receive();
if (textMessage != null) {
String text = textMessage.getText();
System.out.println(text);
// textMessage.acknowledge();
session.commit();
} else {
break;
}
System.out.println("消费者消费完毕");
}

启动生产者,在消息中间查看数据



启动消费者,查看消费情况

发布订阅

生产者代码:

		ConnectionFactory collectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
Connection createConnection = collectionFactory.createConnection();
createConnection.start(); Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(null); producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (int i = 0; i < 5; i++) {
System.out.println("我是生产者" + i);
sendMsg(session, producer, "我是生产者" + i);
} System.out.println("我是生产者发送完毕" );
} public static void sendMsg(Session session, MessageProducer producer, String i) throws JMSException {
TextMessage textMessage = session.createTextMessage("hello activemq" + i);
Destination destination = session.createTopic("xiao_topic");
producer.send(destination,textMessage); }

消费者代码

		ConnectionFactory collectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
Connection createConnection = collectionFactory.createConnection();
createConnection.start(); Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createTopic("xiao_topic");
MessageConsumer createConsumer = session.createConsumer(destination);
while (true) {
TextMessage textMessage = (TextMessage) createConsumer.receive();
if (textMessage != null) {
String text = textMessage.getText();
System.out.println(text);
} else {
break;
}
System.out.println("消费者消费完毕");
} }

先启动的消费者,后启动生产者

ActiveMQ的介绍及使用的更多相关文章

  1. activemq概念介绍

    ActiveMQ概念介绍 是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现,消息中间件. 消息中间件: A传递消息到B(功能或者系统),有比较强的耦合 ...

  2. 深入浅出JMS(二)--ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...

  3. JMS【二】--ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文JMS[一]--JMS基本概念,我们介绍了消息通信的规范JMS,我 ...

  4. ActiveMQ简单介绍以及安装

    概述 首先简单的介绍一下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送. ActiveMQ是Apache所提供 ...

  5. ActiveMQ简单介绍及安装

    消息中间件 我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:Message Orient middleware). 消息中间件有很多的用途和优点: 1. 将数据从一个应用程序 ...

  6. 【转】深入浅出JMS(二)--ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 这篇博文介绍一款开源的JMS具体实现——ActiveMQ.ActiveMQ ...

  7. ActiveMQ (一) 介绍与安装

    ActiveMQ是消息中间件的一种 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provide ...

  8. 消息队列activeMq 使用介绍

      深入浅出 消息队列 ActiveMQhttp://blog.csdn.net/jwdstef/article/details/17380471 一. 概述与介绍 ActiveMQ 是Apache出 ...

  9. Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用

    前话   项目需求,需要使用到mqtt协议,之前编译QtMqtt库,不支持队列模式queue(点对点),只支持订阅/发布者模式.,所以使用C++ ActiveMQ实现.   MQTT协议 简介   M ...

随机推荐

  1. linux运维、架构之路-xtrabackup

    一.XtraBackup介绍 1.备份工具 xtrabackup:是一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,占用磁盘空间小,能够非常快速地                   ...

  2. jquery-时间轴滑动

    效果预览图: html: <div class="tim"> <div class="timdiv"> <div class=&q ...

  3. codevs 2039 骑马修栅栏 USACO x

    题目描述 Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏 ...

  4. kohana orm巧用字段备注支持扩展

    1.SELECT * FROM `bota_language` WHERE `type` = 'order_type'; id  key     value      type        ---- ...

  5. 一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>

    题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...

  6. Dancing Stars on Me

    Dancing Stars on Me Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  7. unity项目中使用BUGLY遇到的的几个问题

    1,第一次对外测试中,发现某些机型游戏中卡死了,但bugly上没报错.后来发现是我们的代码使用 try catch把异常捕获了但什么都没做. 2,别人家项目的bugly上报都能显示出文件和代码行,我们 ...

  8. docker学习与应用

    概要 众所周知,Docker是当前非常火的虚拟化容器技术,对于它的优势以及使用场景网上的资料非常多,这里我推荐大家去这个网站去详细学习docker. 我这里就写一下作为一名后端开发程序员,自己学习do ...

  9. Gitblit 添加密钥实现客户端无密码pull、push代码

    之前管理代码用的是SVN,项目需要将管理代码软件切换为Git 折腾了一天,记录下遇到的小坑,方便后来人. 服务端 服务端 的系统是Windows Sever2008 ,首先在服务端安装window版本 ...

  10. (转)IDataGridViewEditingControl 接口 作用

    本文转载自:http://blog.csdn.net/zx13525079024/article/details/4814575 IDataGridViewEditingControl 接口 定义承载 ...