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. Codeforces 4538 (状态压缩dp)Little Pony and Harmony Chest

    Little Pony and Harmony Chest 经典状态压缩dp #include <cstdio> #include <cstring> #include < ...

  2. UVa 10341 (二分求根) Solve It

    很水的一道题,因为你发现这个函数是单调递减的,所以二分法求出函数的根即可. #include <cstdio> #include <cmath> //using namespa ...

  3. bzoj1054: [HAOI2008]移动玩具

    hash+bfs:要注意特殊情况.(似乎连sort.lower_bound都不用数据小直接判重了... #include<cstdio> #include<cstring> # ...

  4. CORS 跨域 实现思路及相关解决方案

    本篇包括以下内容: CORS 定义 CORS 对比 JSONP CORS,BROWSER支持情况 主要用途 Ajax请求跨域资源的异常 CORS 实现思路 安全说明 CORS 几种解决方案 自定义CO ...

  5. 监听某个div或其它标签的大小改变来执行相应的处理

    jquery 默认的resize只能监听到浏览器窗口大小的改变,但我们在实际使用过程中有可能还需要监听某个div或其它标签的大小改变来执行相应的处理,如果使用默认的resize就无能为力了.怎么办呢, ...

  6. HDU 5312 Sequence (规律题)

    题意: 一个序列的第n项为3*n*(n-1)+1,而 n>=1,现在给一个正整数m,问其最少由多少个序列中的数组成? 思路: 首先,序列第1项是1,所以任何数都能构成了.但是最少应该是多少?对式 ...

  7. 转载RabbitMQ入门(2)--工作队列

    工作队列 (使用Java客户端) 在这第一指南部分,我们写了通过同一命名的队列发送和接受消息.在这一部分,我们将会创建一个工作队列,在多个工作者之间使用分布式时间任务. 工作队列(亦称:任务队列)背后 ...

  8. Vagrant搭建Ubuntu-JavaEE开发环境——Tomcat+JDK+MySQL+dubbo+测试

    Vagrant搭建(Tomcat8+JDK7+MySQL5+dubbo) JDK 1.下载jdk 2.解压JDK tar -xzvf jdk-7u79-linux-x64.tar.gz 3.设置环境变 ...

  9. c# 利用反射动态给实体类对象赋值

    转:http://blog.sina.com.cn/s/blog_659a572b0100xp5s.html 例子如下 using System; using System.Collections.G ...

  10. Java Error和Exception区别

    Error和Exception都继承自Throwable: 二者不同之处: Exception: 1.可以是可被控制(checked)或者不可控制(unchecked): 2.表示一个由程序员导致的错 ...