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. java 语言里 遍历 collection 的方式

    我来简单说一下吧,一般有2种方法来遍历collection中的元素,以HashSet为例子HashSet hs=new HashSet();hs.add("hello");hs.a ...

  2. UVa 10285 Longest Run on a Snowboard【记忆化搜索】

    题意:和最长滑雪路径一样, #include<iostream> #include<cstdio> #include<cstring> #include <c ...

  3. 通过AJAX与ASP.NET结合实现的仿GridView增删改查功能

    jQurey代码部分: 1.    <script type="text/javascript"> 2.            var flag = 0; 3. 4.  ...

  4. [反汇编练习] 160个CrackMe之010

    [反汇编练习] 160个CrackMe之010. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. substring函数——sql

    --substring( expression, start, length ) expression待截取的文字 start 截取位置的起始下标 length 要截取的长度 --左边第一个字符的下标 ...

  6. ASP.NET MVC模型部分验证

    在很多情况下,我们为了代码的复用可能会存在ViewModel共用的情形.比方说,web应用中常常会遇到的一个需求就是用户找回密码的功能.用户首先要验证通过验证邮箱(通常是用户名)来获取验证码,然后再进 ...

  7. ActionBarSherlock的学习笔记(四) ------------ ActionBarSherlock中的搜索及SearchView的使用

    在使用ActionBarSherlock定义app的头部操作时,会经常看见搜索的动作,本文主要介绍一下搜索是如何实现的. 1. SearchView 是搜索的核心组件,具体介绍请参考Android官方 ...

  8. 一天一个Java基础——泛型

    这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债 这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲 ...

  9. Delphi Waring 的信息

    Display PreferencesWarning messages (Delphi)Go Up to Delphi Compiler Directives (List) Index TypeSwi ...

  10. Ejabberd源码解析前奏--管理

    一.ejabberdctl 使用ejabberdctl命令行管理脚本,你可以执行ejabberdctl命令和一些普通的ejabberd命令(后面会详细解说).这意味着你可以在一个本地或远程ejabbe ...