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个:

  1. JMS服务器,路由消息的服务系统,广义上说就是服务器,比如JBOSS,GLASSFISH,WAS8.(都开发过,吐槽下GlassFish,数它麻烦.JBOSS还没试,不过既然集成了,还好吧.WAS8一般般.)
  2. JMS生产者,负责创建并发送消息的程序组件.
  3. JMS消费者.负责读取并处理消息的程序组件.

JMS的消息机制模型主要分为两大类:

  1. 点对点PTP模型:这种消息处理模型为应用中的各个逻辑处理单元提供可靠的通信支持.在PTP通信中,JMS把每一个消息传递给一个消息消费者.JMS系统保证消息传递给消费者,消息不会同时被多个消费者接受.如果消息消费者不在连接范围内,JMS会自动保证消息不会丢失.直到消息消费者进入连接,消息将自动送达.因此JMS需要将消息保存到永久介质上如数据库.
  2. 发布/订阅 Pub-Sub模型:在这种模型中,每个消息被发送到一个消息主题,该主题可以拥有多个订阅者.JMS系统负责将消息的副本传给该主题的每个订阅者.

JMS的API主要的对象:

  1. 连接工厂:它由服务器管理员创建,并绑定到JNDI树上,JMS客户端使用JNDI查找,定位连接工厂,然后利用连接工厂创建JMS连接.
  2. JMS连接:连接表示客户机和服务器之间的活动连接.JMS通过连接工厂创建连接.JMS是一个相当重要的对象.通常,每个客户机使用单独的连接,而每个连接则可以连接多个JMS目的.
  3. JMS会话:会话表示客户机与JMS服务器之间的通信状态.JMS会话建立在连接之上,表示JMS客户机与服务器之间的通信线程.会话定义了消息的顺序.JMS使用会话进行事务性的消息处理.
  4. JMS消息目的:即消息生产者发送消息的目的地,也就是消息消费者获取消息的消息源.
  5. JMS消息生产者:消息生产者负责创建消息并将消息发送到消息目的.
  6. 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

JMS开发(一):基础理论认知的更多相关文章

  1. JMS开发步骤和持久化/非持久化Topic消息

    ------------------------------------------------ 开发一个JMS的基本步骤如下: 1.创建一个JMS connection factory 2.通过co ...

  2. JMS开发指南

    1.JMS消息的异步与同步接收 消息的异步接收: 异步接收是指当消息到达时,主动通知客户端,即当消息到达时转发到客户端.JMS客户端可以通过注册一个实现MessageListener接口的对象到Mes ...

  3. JMS开发(三):JMS消息的确认方式

    这里单独列出来我也是觉得有点必要的,毕竟JMS总体知识点并不多,这点可能被很多人所忽视. 首选定义:消息的确认是指消息接受者接到消息,并做出了对应的处理之后,它将回送一个确认消息. 对于非事务性会话, ...

  4. JMS开发(二):深入PTP,Pub-Sub两种模式

    1.PTP模型 PTP(Point-to-Point)模型是基于队列(Queue)的,对于PTP消息模型而言,它的消息目的是一个消息队列(Queue),消息生产者每次发送消息总是把消息送入消息队列中, ...

  5. JMS与MQ详解(有项目)

    <一>m2mGW项目 1.ActiveMQ概述     企业消息软件从80年代起就存在,它不只是一种应用间消息传递风格,也是一种集成风格.因此,消息传递可以满足应用间的通知和互相操作.但是 ...

  6. JMS确认机制

    JMS中为数不多的重点就是消息的确认机制,下面分别介绍J2EE和Spring的MessageListenerContainer的确认机制 J2EE中JMS确认机制 在JMS规范中一共4种确认方式 AU ...

  7. JMS基本概念

    原文:http://blog.csdn.net/jiuqiyuliang/article/details/46701559 The Java Message Service (JMS) API is ...

  8. Android开发最佳学习路线图

          为了帮助大家更好的学习Android开发的相关知识,尚观4G智能操作系统研究室(www.up4g.com)为大家制作下面学习路线图:希望能帮助到广大的android爱好者. 在開始之前我们 ...

  9. ActiveMQ系列之三:理解和掌握JMS

    JMS是什么 JMS Java Message Service,Java消息服务,是Java EE中的一个技术. JMS规范 JMS定义了Java 中访问消息中间件的接口,并没有给予实现,实现JMS  ...

随机推荐

  1. tornado中使用torndb,连接数过高的问题

    问题背景 最近新的产品开发中,使用了到了Tornado和mysql数据库.但在基本框架完成之后,我在开发时候发现了一个很奇怪的现象,我在测试时,发现数据库返回不了结果,于是我在mysql中输入show ...

  2. (转)博弈问题与SG函数

    博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...

  3. apache开源项目 -- Tuscany

    tuscany是Apache组织关于SOA实现的一个开放源码的工程项目,目前处于孵化期阶段. 该项目主要基于SCA,SDO,DAS等技术上实现的. SCA 的基本概念以及 SCA 规范的具体内容并不在 ...

  4. 图文详解YUV420数据格式

    YUV格式有两大类:planar和packed.对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V.对于packed的YUV格式,每个像素点的Y,U ...

  5. 【转】iOS开发UITableViewCell的选中时的颜色设置

    原文网址:http://mobile.51cto.com/hot-404900.htm 1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSe ...

  6. C#中的lock关键字

    前几天与同事激烈讨论了一下,有一点收获,记录起来. 首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. ...

  7. DDOS的攻击原理和防护指南

    我们现在来分析DDOS的攻击原理. 首先,DDOS是英文Distributed Denial of Service的缩写,意思是分布式拒绝服务.拒绝服务又是什么意思呢?就是采取一些垃圾数据包来阻塞网站 ...

  8. extjs form submit 总是执行failure

    代码: function createWeekReort() { if (form.getForm().isValid()) { Ext.Msg.confirm("提示", &qu ...

  9. 【windows核心编程】一个HOOK的例子

    一.应用场景 封装一个OCX控件,该控件的作用是来播放一个视频文件,需要在一个进程中放置四个控件实例. 由于控件是提供给别人用的,因此需要考虑很多东西. 二.考虑因素 1.控件的父窗口resize时需 ...

  10. hashtable,hashMap,vector和ArrayList

    关于vector,ArrayList,hashMap和hashtable之间的区别 vector和ArrayList:  线程方面:  vector是旧的,是线程安全的  ArrayList是java ...