JMS开发(一):基础理论认知
JMS全称是Java Message Service.其是JavaEE技术规范中的一个重要组成部分,是一种企业消息处理的规范.它的作用就像一个智能交换机,它负责路由分布式应用中各个组件所发出的消息.
JMS提供了一组通用的Java API,开发者可以通过API来 创建,发送,接收,读取 消息.JMS是一种和具体实现厂商无关的API.它的作用类似于JDBC.不管底层采用何种消息服务器的实现,应用程序总是面向通用的JMS API编程.
用的比较多的是apache的ActiveMQ,以前浮皮开发过ActiveMQ.了解不深,但这个总体国内用的还是非常多的.现在公司采用的都是JBOSS那帮家伙的一套东西,使用了HornetQ,因为JBOSS7采用了这货.google搜了下,据说性能比ActiveMQ还好点.不过想来好的也有限.其他的诸如IBM的MQSeries什么的,基本没见过.新手初学我觉得可以考虑ActiveMQ和HornetQ.一个用的多,一个JBOSS集成并且汉化很彻底.
JMS主要用于分布式应用的各组件之间的通信.它不仅使应用组件之间的通信变得更加松耦合,而且还有以下优势:
1.消息采用异步处理机制,避免客户机等待.
2.JMS可以持久的保存消息,因而提高系统的可靠性.
3.JMS允许一条消息同时发给多个接受者,更具效率.
JMS的架构总体分为3个:
- JMS服务器,路由消息的服务系统,广义上说就是服务器,比如JBOSS,GLASSFISH,WAS8.(都开发过,吐槽下GlassFish,数它麻烦.JBOSS还没试,不过既然集成了,还好吧.WAS8一般般.)
- JMS生产者,负责创建并发送消息的程序组件.
- JMS消费者.负责读取并处理消息的程序组件.
JMS的消息机制模型主要分为两大类:
- 点对点PTP模型:这种消息处理模型为应用中的各个逻辑处理单元提供可靠的通信支持.在PTP通信中,JMS把每一个消息传递给一个消息消费者.JMS系统保证消息传递给消费者,消息不会同时被多个消费者接受.如果消息消费者不在连接范围内,JMS会自动保证消息不会丢失.直到消息消费者进入连接,消息将自动送达.因此JMS需要将消息保存到永久介质上如数据库.
- 发布/订阅 Pub-Sub模型:在这种模型中,每个消息被发送到一个消息主题,该主题可以拥有多个订阅者.JMS系统负责将消息的副本传给该主题的每个订阅者.
JMS的API主要的对象:
- 连接工厂:它由服务器管理员创建,并绑定到JNDI树上,JMS客户端使用JNDI查找,定位连接工厂,然后利用连接工厂创建JMS连接.
- JMS连接:连接表示客户机和服务器之间的活动连接.JMS通过连接工厂创建连接.JMS是一个相当重要的对象.通常,每个客户机使用单独的连接,而每个连接则可以连接多个JMS目的.
- JMS会话:会话表示客户机与JMS服务器之间的通信状态.JMS会话建立在连接之上,表示JMS客户机与服务器之间的通信线程.会话定义了消息的顺序.JMS使用会话进行事务性的消息处理.
- JMS消息目的:即消息生产者发送消息的目的地,也就是消息消费者获取消息的消息源.
- JMS消息生产者:消息生产者负责创建消息并将消息发送到消息目的.
- JMS消息消费者:消息消费者负责接收消息并读取消息内容.
JMS版本
现在大家只需要关注JMS1.1即可,老版本是1.0.2,PTP模型和Pub-Sub模型在1.0.2里有两套不同的API,而1.1统一了这些API.只需关注JMS1.1即可.
接着是一份JMS提供的API接口的图标:
JMS1.1统一域模型的API | |
连接工厂 | ConnectionFactory |
JMS连接 | Connection |
消息会话 | Session |
消息目的 | Destination |
消息生产者 | MessageProducer |
消息消费者 | MessageConsumer |
producer: [prə'dʊsɚ] n. 制作人,制片人;生产者;发生器
consumer:[kən'sumɚ] n. 消费者;用户,顾客
下面是一个简单的示例代码:
01
|
/**
|
02
|
* @description 下面是要从服务器上获取连接工厂的JNDI和队列地址的JNDI. 然后就是发送信息到服务器端.
|
03
|
* @param msg 消息的文本内容
|
04
|
* @param cfJNDI 连接工厂的JNDI
|
05
|
* @param queueJNDI 队列的JNDI
|
06
|
* @return 如果成功返回true.
|
07
|
* @throws JMSException
|
08
|
* @throws NamingException
|
09
|
*/
|
10
|
private boolean getConnectFactory(String msg, String cfJNDI, String queueJNDI) throws JMSException, NamingException {
|
11
|
Connection connection = null ;
|
12
|
MessageProducer producer = null ;
|
13
|
try {
|
14
|
//初始化上下文
|
15
|
InitialContext ic = new InitialContext();
|
16
|
//JMS客户端使用JNDI 查找,定位 连接工厂
|
17
|
ConnectionFactory connectionFactory = (ConnectionFactory) ic.lookup(cfJNDI);
|
18
|
//PTP模式,使用Queue.JMS客户端使用JNDI 查找,定位 Queue.
|
19
|
Queue queue = (Queue) ic.lookup(queueJNDI);
|
20
|
//通过连接工厂,获取 JMS连接.
|
21
|
connection = connectionFactory.createConnection();
|
22
|
//通过JMS连接,获取到 JMS会话.后面的参数下章或下下章讲解.
|
23
|
Session session = connection.createSession( false , Session.AUTO_ACKNOWLEDGE);
|
24
|
//在JMS会话中,创建一个 JMS消息生产者.
|
25
|
producer = session.createProducer(queue);
|
26
|
//在JMS会话中,创建Text文本消息.
|
27
|
TextMessage message = session.createTextMessage();
|
28
|
message.setText(msg);
|
29
|
//发送到JMS目的.
|
30
|
producer.send(message);
|
31
|
//关闭JMS.
|
32
|
this .close(connection, producer);
|
33
|
} catch (JMSException e) {
|
34
|
this .close(connection, producer);
|
35
|
throw new JMSException(e.getMessage());
|
36
|
} catch (NamingException e) {
|
37
|
this .close(connection, producer);
|
38
|
throw new NamingException(e.getMessage());
|
39
|
}
|
40
|
return true ;
|
41
|
}
|
42
|
43
|
private void close(Connection connection, MessageProducer producer) throws JMSException {
|
44
|
try {
|
45
|
if ( null != producer) {
|
46
|
producer.close();
|
47
|
}
|
48
|
if ( null != connection) {
|
49
|
connection.close();
|
50
|
}
|
51
|
} catch (JMSException e) {
|
52
|
throw new JMSException(e.getMessage());
|
53
|
}
|
54
|
}
|
转载自:http://my.oschina.net/zhaoqian/blog/90121
转载于:https://www.cnblogs.com/chenying99/p/3164635.html
JMS开发(一):基础理论认知相关推荐
- 使用Apache ActiveMQ的JMS开发基础
去年是我尝试JMS的时候. 背后的想法和概念让我有些困惑,但是当我知道它的用途后,我很快就掌握了它. 在本文中,我将展示使用Apache ActiveMQ作为后端使用Java开发简单的生产者/消费者的 ...
- 我对前端开发的粗浅认知
我对前端开发的粗浅认知 静态页面阶段 后端采用MVC模式开发,模型层提供保存数据,控制层处理数据,实现业务逻辑,视图层展示数据,前端只是后端的视图层 前端只负责展示信息 前端只负责处理交互 Ajax ...
- 软件开发中的10个认知偏差
最近,在和同事们讨论产品经理职责的时候,聊到了关于产品的定义,如果不能准确定义"产品"的时候,可以考虑其必要条件,即可没有用户的产品肯定是没有意义的.产品有了用户, 必然存在用户与 ...
- JMS入门——开发起步之ActiveMQ
J2EE与JMS JMS是J2EE的13种核心技术规范之一,是J2EE众多应用程序组件中的重要一员.J2EE有标准的JMS API开放,以支持各个JMS应用生产厂商的产品,开源的有jbossmq,op ...
- JMS规范、ActiveMQ Broker和ActiveMQ传输协议
Java实现ActiveMQ通讯(构建过程) 编写pom.xml配置文件 <!-- https://mvnrepository.com/artifact/org.apache.activemq/ ...
- 美国科学家成功恢复老年人工作记忆,望奠定认知干预疗法基础
来源:科技日报 伴随着人体衰老,大脑对信息加工和贮存的能力也必然会下降,但如果这种能力可以被逆转呢?据英国<Nature Neuroscience>杂志8日在线发表的一项研究,美国科学家通 ...
- Spring JMS
异步处理通信是面向服务架构(SOA)的重要部分,因为企业中的许多系统通信,尤其是跟外部系统通信本来就是异步的.Java消息服务(JMS)就是用来编写异步消息J2EE应用的API.使用JMS API的传 ...
- SCRUM敏捷开发官方权威指南
由Scrum创始人 Ken Schwaber 和 Jeff Sutherland 开发并维护 版本:2017中文版 SCRUM指南的目的 Scrum 是用于开发.交付和持续支持复杂产品的一个框架.本 ...
- 颠覆游戏开发,引领行业革命,从 Unite 2019 看 Unity 技术亮点
在谈及 Unity 引擎时,或许不少开发者对其还停留在游戏开发的固有认知中.事实上,Unity 在"实时 3D 内容创作"的伟大航路上,已向更为广阔的全行业领域的星辰大海前进. 从 ...
- jms.jar 2.0_JMS API 2.0生产者和使用者
jms.jar 2.0 Please go through my previous post at "JMS API 1.1 Producer and Consumer" to g ...
最新文章
- VBS 自动打开软件
- ora-24247:网络访问被访问控制列表(ACL)拒绝
- 无码系列-1-架构师启蒙篇
- 黑苹果16g内存够用吗_现阶段最便宜的完美黑苹果配置是什么?
- IPC通信:Posix消息队列的属性设置
- 计算机辅助翻译入门试题,2011级计算机辅助翻译考试试题纸(A卷)
- 梯度为什么是函数增加最快的方向
- 禁止root用户远程登录或者禁止其他用户登录而不删除它
- 转: 中/英文资料 PKCS #11 函数列表
- 打印机显示服务器脱机是什么原因,脱机使用打印机是什么意思?脱机打印机状态显示错误怎么办...
- 史上最完整的《指环王》魔戒战争大事记(编年体长文)
- PHP连接并使用人大金仓数据库kingbase
- 【宽创热点】为什么博物馆要展示古代糕点和比基督更古老的牛肉
- C/C++ 引用作为函数的返回值
- [增强现实]Unity制作AR增强现实--茶壶(亲测)
- 如何将邮件导出为PDF
- Visualization of Detail Point Set by Local Algebraic Sphere Fitting
- konva系列教程4:图形属性
- 入门计算机视觉学习路线
- POCO C++ Libraries 学习
热门文章
- Somer’s D(Somers’ Delta)-顺序变量相关性分析方法
- Pytorch tensor基础知识
- SLAM--搭建自己的视觉里程计VO-RGBD相机(一)
- ds查找—二叉树平衡因子_《大话数据结构》C++实现二叉平衡树的建立
- 用计算机探索规律概括,《用计算器探索规律》优秀教学设计
- C/C++[算法入门]续
- 详解iOS打包、发布与证书体系,深入解析证书非对称加密原理 知其所以然
- 易实战Spring Boot 2 资源汇总 从入门到精通 内含实战github代码 毫无保留分享
- 匹配出html代码中的table的全部内容,如何在table这样的形式 获取多个tr中的值?以下是我写的简易html 和凌乱的代码。求解答Q.Q...
- java封装的注意事项_新手学习Java之对象---封装