本文主要参考张丰哲大神的简书文章,链接 https://www.jianshu.com/p/ecdc6eab554c

JMS,即Java Message Service,通过面向消息中间件(MOM:Message Oriented Middleware)的方式很好的解决了上面的问题。大致的过程是这样的:发送者把消息发送给消息服务器,消息服务器将消息存放在若干队列/主题中,在合适的时候,消息服务器会将消息转发给接受者。在这个过程中,发送和接受是异步的,也就是发送无需等待,而且发送者和接受者的生命周期也没有必然关系;在pub/sub模式下,也可以完成一对多的通信,即让一个消息有多个接受者。

 
JMS

需要注意的是,JMS只是定义了Java访问消息中间件的接口,其实就是在包javax.jms中,你会发现这个包下除了异常定义,其他都是interface。我们可以扫一眼,比如Message:

 
Message接口

JMS只给出接口,然后由具体的中间件去实现,比如ActiveMQ就是实现了JMS的一种Provider,JMS规范定义的一些术语:

Provider/MessageProvider:生产者

Consumer/MessageConsumer:消费者

PTP:Point To Point,点对点通信消息模型

Pub/Sub:Publish/Subscribe,发布订阅消息模型

Queue:队列,目标类型之一,和PTP结合

Topic:主题,目标类型之一,和Pub/Sub结合

ConnectionFactory:连接工厂,JMS用它创建连接

Connnection:JMS Client到JMS Provider的连接

Destination:消息目的地,由Session创建

Session:会话,由Connection创建,实质上就是发送、接受消息的一个线程,因此生产者、消费者都是Session创建的


首先将active的压缩包上传至服务器并解压

在保证JDK已经安装的情况下可以直接通过bin目录下的activemq文件启动activemq服务。

使用命令:./apache-activemq-5.12.0/bin/activemq启动服务

控制台登录的用户名密码可以在apache-activemq-5.12.0/conf/jetty-realm.properties文件中配置:

activemq的默认端口是8161,可以在apache-activemq-5.12.0/conf/jetty.xml文件中配置

现在,我们可以直接访问activemq的控制台,在输入用户名密码登录之后,如下:

下面我们可以试着在JAVA中写一个P2P类型生产者用于发送消息,一个消费者用于接收消息:

        @Test
public void testQueueProducer() throws Exception{
//1、创建一个连接工厂对象,需要指定服务的IP及端口
ConnectionFactory factory=new ActiveMQConnectionFactory("tcp://192.168.1.102:61616");
//2、使用工厂对象创建一个connection对象
Connection connection = factory.createConnection();
//3、调用connection对象的start方法开启连接
connection.start();
//4、创建一个session对象:第一个参数是是否开启事务,一般不开启,如果为true,第二个参数无意义;第二个参数是应答模式,包括自动应答和手动应答,一般为自动
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5、使用session创建一个destination(消息的目的地)对象
Queue queue = session.createQueue("test-queue");
//6、使用session对象创建一个produce对象
MessageProducer producer = session.createProducer(queue);
//7、创建一个message对象,可以使用TestMessage
/*TextMessage TextMessage = new ActiveMQTextMessage();
TextMessage.setText("hello ActiveMQ");*/
TextMessage textMessage = session.createTextMessage("hello ActiveMQ");
//8、发送消息
producer.send(textMessage);
//9、关闭资源
producer.close();
session.close();
connection.close();
}

消息生产者发送消息

我们这里创建连接工厂使用的是tcp协议的61616端口,其实activemq还对其他协议开放了多个端口,我们在conf/activemq.xml文件中可以查看

@Test
public void testQueueConsumer() throws Exception{
//1、创建一个ConnectionFactory
ConnectionFactory factory=new ActiveMQConnectionFactory("tcp://192.168.1.102:61616");
//2、创建连接对象connection
Connection connection = factory.createConnection();
//3、开启连接
connection.start();
//4、使用connection创建Session对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5、创建一个destination对象,queue对象
Queue queue = session.createQueue("test-queue");
//6、使用session创建一个consumer对象
MessageConsumer consumer = session.createConsumer(queue);
//7、接受消息打印结果
consumer.setMessageListener(new MessageListener() { @Override
public void onMessage(Message message) {
TextMessage textMessage=(TextMessage) message;
String text;
try {
text=textMessage.getText();
System.out.println(text);
} catch (JMSException e) {
e.printStackTrace();
}
}
}); //等待接受消息
System.in.read();
//8、关闭资源
consumer.close();
session.close();
connection.close();
}

消息接收者接收消息

下面我们到控制台查看:

Messages Enqueued:表示生产了多少条消息,记做P

Messages Dequeued:表示消费了多少条消息,记做C

Number Of Consumers:表示在该队列上还有多少消费者在等待接受消息

Number Of Pending Messages:表示还有多少条消息没有被消费,实际上是表示消息的积压程度,就是P-C

ActiveMQ初步学习的更多相关文章

  1. json2.js的初步学习与了解

    json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...

  2. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  3. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...

  4. EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库

    前提:搭建成功codefirst相关代码,参见EF Codefirst  初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...

  5. 初步学习python

    自计算机诞生以来,也伴随着计算机语言的诞生,现在,全世界的编程语言有600多种,但流行的编程语言也就20多种. Java和C一直占据着前两名.但是近年来伴随着人工智能的发展,Python发展迅猛,以其 ...

  6. Git的初步学习

    前言 感谢! 承蒙关照~ Git的初步学习 为什么要用Git和Github呢?它们的出现是为了用于提交项目和存储项目的,是一种很方便的项目管理软件和网址地址. 接下来看看,一家公司的基本流程图: 集中 ...

  7. 语法分析器初步学习——LISP语法分析

    语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...

  8. 状态保持以及AJAX的初步学习

    嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项 ...

  9. LinQ的初步学习与总结

    嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单 ...

随机推荐

  1. Git入门与常用操作简述

    下载gitbash及使用指南: http://rogerdudler.github.io/git-guide/index.zh.html 初次使用 配置用户名和邮箱: $ git config --g ...

  2. <Android 应用 之路> 天气预报(四)

    前言 第二次尝试完成天气预报应用,与上次不同的是,个人感觉这次的Ui不那么丑陋,整体的实用性和界面效果,用户体验相较上一次有所提升,但是还是有很多地方需要完善. 这次使用到的内容比较丰富,包括聚合数据 ...

  3. C# 获取文件夹下所有的文件

    static void getAllFileNameInDir(string path, ref List<string> files) { DirectoryInfo folder = ...

  4. hihoCoder hiho一下 第十二周 #1055 : 刷油漆 (树上DP)

    思路: 只能刷部分节点数m,总节点数n.如果m>=n那么就可以全刷了,那就不用任何算法了.如果m<n那么就要有取舍了.用DP思路,记录下每个节点如果获得到1~m个选择所能获得的最大权值.这 ...

  5. HDU 1114 Piggy-Bank 猪仔储钱罐(完全背包)

    题意: 给定一个存钱罐中要存硬币,知道空罐的重量和欲装满的重量,是否能装入?若能,打印最小价值.(注:能装的硬币重量一定刚刚好,里面的总价值要达到最小) 输入: 包含了T个测试例子,在第一行给出.接下 ...

  6. HDU2433 最短路 + 剪枝优化

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2433 ,最短路(SPFA或优化过的Dijstra) + 剪枝优化 这道题关键还是在几个剪枝上面,没有剪 ...

  7. java Vamei快速教程08 继承

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 继承(inheritance)是面向对象的重要概念.继承是除组合(composit ...

  8. js 中//<![CDATA[ 意义

    CDATA内部所有东西都会被解析器忽略,加入文本中包含了大量< 和 $符号,就像编程中经常出现的情况一样,那么这个元素就可以被定义为一个CDATA部分 ,CDATA 区段开始于 "&l ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  10. 自动生成 WebApi 在线说明文档。

    1.使用Swashbuckle实现 Swashbuckle 是.NET类库,可以将WebAPI所有开放的控制器方法生成对应SwaggerUI的JSON配置.再通过SwaggerUI 显示出来.类库中已 ...