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. Asp.Net多线程用法1

    Asp.Net多线程简单用法 一个web页面 default.aspx 里面有两个控件GridView1,GridView2,通过两个线程分别加载绑定数据. protected void Page_L ...

  2. 【C#学习笔记】载入图片并居中

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. 多线程程序设计学习(3)immutable pattern模式

    Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个 ...

  4. 【MySQL】Java对SQL时间类型的操作(获得当前、昨天、前年。。时间)

    Java获得当前时间 java.util.Date date = new java.util.Date(); Timestamp time = new Timestamp(date.getTime() ...

  5. android 滑动菜单SlidingMenu的实现

    首先我们看下面视图:       这种效果大家都不陌生,网上好多都说是仿人人网的,估计人家牛逼出来的早吧,我也参考了一一些例子,实现起来有三种方法,我下面简单介绍下: 方法一:其实就是对Gesture ...

  6. Android的SoundPool

    开发Android软件中我们可能经常需播放多媒体声音文件,一般使用MediaPlayer类但该类占用资源较多,对于游戏等应用可能不是很适合,SoundPool类在SDK的android.media.S ...

  7. ie对行高line-height的诡异解释

    切 游戏页面真地是要求太精细了,做按钮的时候我犯了一个错误,居然用span的内联元素的行高和padding来控制,虽然有很多好处,但是IE对 line-height的解释导致按钮经常下边会缺一小部分, ...

  8. Qt加载网页(加载浏览器插件)和制作托盘后台运行(南信大财务报账看号)

    程序模块要添加QNetWork和QWebKit模块: nuistfinancevideo.h文件: #ifndef NUISTFINANCEVIDEO_H #define NUISTFINANCEVI ...

  9. OnItemClickListener 的参数详解(转)

    转载地址:http://blog.iamzsx.me/show.html?id=147001 我们在使用ListView的时候,一般都会为ListView添加一个响应事件android.widget. ...

  10. linux下简单文本处理

    1. 根据第二列的数据来确定第一列的值 awk '{if(a!=$0)i++;print i,$0;a=$0}' arr >arr.out 2. 补齐长度 seq arr.out|awk '{p ...