Java Message Service是java ee的规范之一,可以用来发送异步消息,在某些场景下,可以作为不同系统,或者不同模块之间的集成方式。可以类比为通过数据库来集成的方式,模块A完成逻辑以后,往数据库插入一条记录,模块B定时轮询数据库,如果查到相应的记录,就进行处理。JMS集成实际上思路是差不多的功能更强,并且提供了标准的API支持,而且也可以避免反复轮询数据库或者读取文件的I/O操作,对系统的整体性能可能会有提升。

有两个明显的优点。首先可使2个系统或模块实现松耦合,模块A不需要直接调用模块B,只需要往jms provider上发送一条约定格式的消息,模块B收到这条消息,进行后续的业务处理。其次jms方式是异步的,意味着模块A发送消息之后,不需要等待模块B或者jms provider的响应,自身的业务逻辑可以继续。

JMS技术对应的规范是jsr914,规范的实现称为jms provider,常见的实现有ActiveMQ、JBoss MQ、IBM Websphere MQ等。本文以ActiveMQ举例。

一、ActiveMQ使用

ActiveMQ(其他jms provider也差不多)安装之后,目录结构是这样的

运行bin目录下的activemq.bat,会根据默认配置启动一个broker。各种jms实现都有broker的概念。

启动之后会占用至少2个端口,默认的是61616和8161。61616是等待jms client的连接,8161是ActiveMQ自带的一个web应用。

http://localhost:8161/demo可看到各种官方提供的例子

http://localhost:8161/admin是ActiveMQ的管理控制台。这里可以对队列进行各种操作,如发送消息,查看消息,清空队列等。

ActiveMQ即使在不编程的情况下也可以通过这种方式来使用,如用Websphere MQ有时也不编程,直接通过Websphere MQ在两地进行消息传输。当然大部分情况还是需要针对jms client进行编程的。

二、jms基本概念

前面说过jms的实现,称为jms provider,可认为是jms的服务器。jms的客户端需要开发人员自行开发,称为jms client。

jms的消息机制有2种模型,一种是Point to Point,表现为队列的形式,发送的消息只能被一个接收者取走。另一种是Topic,可被多个订阅者订阅,类似于群发。

ConnectionFactory用于jms client获取与jms provider的连接。不同的jms产品对这个接口有不同的实现,如说ActiveMQ的该接口的实现类是ActiveMQConnectionFactory。

Connection由ConnectionFactory产生的,表示jms client与jms provider的连接。

Session由Connection产生的,表示一个会话。Session是关键组件,Message、Producer/Consumer、Destination都是在Session上创建的。

Message传输的消息,包括head、properties、body,其中head必选。

Destination消息源,对发送者来说就是消息发到哪里,对接收者来说就是从哪里取消息。Destination有2个子接口,Queue和Topic,分别对应上面提到的2种模型。

Message Producer消息发送者,可注意到这里需要把Destination作为参数,传入createProducer()方法,说明消息发送者是绑定到Destination上的,这个发送者发送的消息会发送到这个绑定的Destination上。

// 消息目的地

Destination dest = session.createQueue("dotaQueue");

// 消息发送者

MessageProducer producer = session.createProducer(dest);

Message Consumer消息接收者,和Message Producer是相反的一种组件。

三、代码实例

这里基于ActiveMQ进行开发,所以需要导入ActiveMQ提供的jar包。不过开发时应该尽量针对jms接口进行开发,不依赖特定的实现。例子是用main函数跑的,没有在JAVA EE容器里跑,所以没有办法依赖JNDI拿到ConnectionFactory的实例,只能手工创建ActiveMQConnectionFactory,所以和ActiveMQ的实现耦合了,没有办法连到别的jms实现上。如果实际的代码用JNDI或者spring来获取ConnectionFactory的实例的话,那就可以仅针对接口编程,连接到任意jms provider了。为了简单起见例子也没有用到spring,实际上spring对jms client提供了很好的支持。本例开发环境只要导入activemq-all-5.6.0.jar,里面已经包括了jms API、activemq-core、javaee-management API等必须的class。

Message Producer

public class Main {

public static void main(String[] args) throws JMSException {

String jmsProviderAddress = "tcp://localhost:61616";//  地址

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(jmsProviderAddress);// 连接器

Connection connection = connectionFactory.createConnection();//  创建连接

Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);//  打开会话

Destination dest = session.createQueue("demoQueue");//  消息目的地

MessageProducer producer = session.createProducer(dest);//  消息发送者

Message message = session.createTextMessage("hello world");//  消息

producer.send(message);// 发送

producer.close();// 关闭

session.close();

connection.close();

}

}

代码很简单,可以参考上面的图,各组件的关系比较清楚。

Message Consumer

public static void main(String[] args) throws JMSException {

String jmsProviderAddress = "tcp://localhost:61616";// 地址

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(jmsProviderAddress);//连接器

Connection connection = connectionFactory.createConnection();// 创建连接

Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);// 打开会话

String destinationName = "demoQueue";

Destination dest = session.createQueue(destinationName);// 消息来源地

MessageConsumer consumer = session.createConsumer(dest);

connection.start();

Message message = consumer.receive();

TextMessage textMessage = (TextMessage) message;

String text = textMessage.getText();

System.out.println("从ActiveMQ取回一条消息: " + text);

consumer.close();

session.close();

connection.close();

}

和MessageProducer的代码基本类似,实际中一般会实现javax.jms.MessageListener接口,这样就不需要手工调用receive()方法。

原帖地址:http://www.iteye.com/topic/1125922

转载于:https://blog.51cto.com/woshixy/1410063

JMS(1)——基本实例相关推荐

  1. Spring核心技术(十四)——ApplicationContext的额外功能

    在前文的介绍中我们知道,org.springframework.beans.factory包提供了一些基本的功能来管理和控制Bean,甚至通过编程的方式来实现.org.springframework. ...

  2. Java 实现单点登录功能

    J2EE社区 苟有恒,何必三更起五更眠; 最无益,只怕一日曝十日寒. posts - 238, comments - 317, trackbacks - 0, articles - 16 导航 首页 ...

  3. 前端开发基础知识汇总

    一.HTML 1.前言与常用标签 浏览器 内核 备注 IE Trident IE.猎豹安全.360极速浏览器.百度浏览器 firefox Gecko 可惜这几年已经没落了,打开速度慢.升级频繁.猪一样 ...

  4. Spring Cloud微服务系统架构的一些简单介绍和使用

    Spring Cloud 目录 特征 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序上下文层次结构 改变Bootstrap的位置Properties ...

  5. 深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例

    转载:http://blog.csdn.net/jiuqiyuliang/article/details/48758203 第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模 ...

  6. JMS学习(4):--Spring和ActiveMQ整合的完整实例

    前言 这篇博文,我们基于spring+JMS+ActiveMQ+Tomcat,做一个Spring4.1.0和ActiveMQ5.11.1整合实例,实现了Point-To-Point的异步队列消息和PU ...

  7. JMS学习(3):--ActiveMQ简单的HelloWorld实例

    第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...

  8. JMS学习二(简单的ActiveMQ实例)

    下载安装ActiveMQ服务,下载地址当然可以去官网下载 http://activemq.apache.org/download-archives.html ActiveMQ安装很简单,下载解压后到b ...

  9. 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例

    第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...

最新文章

  1. 翻译:CREATE DATABASE语句
  2. Java NIO理解与使用
  3. python爬取mysql数据_Python爬取数据并写入MySQL数据库的实例
  4. SQL Server 2019安装教程
  5. Linux 分割、合并文件
  6. python写内存挂_编写高效内存Python代码的3个技巧
  7. HZOJ 大佬(kat)
  8. mac上SVN简单几个命令
  9. 解决svn中“工作副本已经锁定”,或者svn清理失败的解决方法
  10. python之解决Cannot uninstall ‘certifi‘问题
  11. 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析
  12. 20145339顿珠 MS08_067漏洞测试
  13. 数论入门基础(同余定理/费马小定理/扩展欧几里德算法/中国剩余定理)
  14. Linux dos攻击服务器,Linux服务器如何防止DoS攻击
  15. FFT+NNT 深入学习记录 秦皇岛camp 乒乓球
  16. 解决方案:rabbitmq使用场景-超时未支付订单处理
  17. 『Kubernetes』Linux安装K8S集群过程笔记
  18. C#通用类库整理--字符串处理类
  19. androidTv获取TvProvider频道数据,播放Dvb的视频
  20. 樊登读书会用事实说话读后感_樊登读书《用事实说话》读书笔记

热门文章

  1. 架构探险笔记7-事务管理简介
  2. 51CTO-风哥-ORACLE学习计划(持续更新中)
  3. 【面试】shuffle函数的实现
  4. Django REST framework的各种技巧——1.基础讲解
  5. Windows 8.1 重复数据删除——规划部署(二)
  6. 竹笋炒肉 I18N和L10N
  7. [音乐欣赏]Craigie Hill
  8. mysql 创建师徒_mysql基础整理
  9. html表单文本框怎么输出函数值,如何获取用户输入的html文本表单字段传递给javascript函数的值?...
  10. backtrace java_在c file中打出backtrace到某个文件中