JMS(1)——基本实例

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

时间: 2024-08-29 12:57:04

JMS(1)——基本实例的相关文章

Tomcat下绑定JMS应用服务器的实例讲解

服务器 JMS做为J2EE的高级部分一直蒙着一层神秘的面纱,作为JMS的定制者SUN只规定了JMS规范,象很多其他SUN产品一样被多家厂商提供了具体的实现.但是作为tomcat和RESIN(今年初宣布全部支持J2EE规范).这些面向低端但却被广泛应用的服务器本身并不对JMS提供支持.庆幸的是openjms和activeMQ两家开源软件提供了插件式的支持. 在应用了一些开发框架如spring的项目里如果要使用到JMS,虽然SPRING提供了部分对JMS的支持但经过我一段时间的应用发现,OO的封装在

实例讲解Tomcat下绑定JMS应用服务器

JMS做为J2EE的高级部分一直蒙着一层神秘的面纱,作为JMS的定制者SUN只规定了JMS规范,象很多其他SUN产品一样被多家厂商提供了具体的实现.但是作为tomcat和RESIN(今年初宣布全部支持J2EE规范).这些面向低端但却被广泛应用的服务器本身并不对JMS提供支持.庆幸的是openjms和activeMQ两家开源软件提供了插件式的支持. 在应用了一些开发框架如spring的项目里如果要使用到JMS,虽然SPRING提供了部分对JMS的支持但经过我一段时间的应用发现,OO的封装在某些地方

转 JMS 实例讲解

1. JMS基本概念      JMS(Java Message Service) 即Java消息服务.它提供标准的产生.发送.接收消息的接口简化企业应用的开发.它支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型.P2P 模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者.     对于点到点模型,消息生产者产生一个消息后,把这个消息发送到一个Queue(队列)中,然后消息接收者再从这个Queue中读取

JMS 简单实例

使用 ActiveMQ 当做 JMS 提供者,写一个简单的 demo. 主要是模拟一个聊天室的样子,下面是源代码 package com.mycompany.app; import java.io.BufferedReader; import java.io.InputStreamReader; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import jav

Spring整合JMS(消息中间件)实例

本篇文章主要描述了如何配置Spring-JMS,至于为何这样配置及Spring-JMS相关介绍,请阅读这篇文章:Spring整合JMS(消息中间件).我们这里的消息broker用的是ActiveMQ. 一.相关配置 本篇主要讲解如何在Spring中配置JMS,关于Spring本身的配置本文就不多做介绍了. 1.1 配置maven依赖 在使用Spring-JMS之前,先配置相关依赖. <!-- Java JMS 原生API --> <dependency> <groupId&g

消息队列入门(四)ActiveMQ的应用实例

部署和启动ActiveMQ 去官网下载:http://activemq.apache.org/ 我下载的是apache-activemq-5.12.0-bin.tar.gz, 解压到本地目录,进入到bin路径下, 运行activemq启动ActiveMQ. 运行方式:启动 ./activemq start ActiveMQ默认使用的TCP连接端口是61616, 5.0以上版本默认启动时,开启了内置的Jetty服务器,可以进入控制台查看管理. 启动ActiveMQ以后,登陆:http://loca

J2EE tutorial 实例安装

j2ee 本节介绍各个代表性实例的安装,原英文介绍文档位于以下路径:J2EE1.4/samples/docs/list.html   Duke's Bookstore 1 编译. 切换到J2EE1.4 amples\webapps\bookstore\bookstore1 rc 1) 执行 asant clean.,这是清除 2) 执行 asant core,这是编译   2 启动PointBase数据库,并准备数据 1) 执行<pointbase_install_dir>/tools/ser

J2EE探索者:用JMS进行企业消息传递[Z]

j2ee 在本期的J2EE探索者( J2EE pathfinder)中,Java 开发者和咨询顾问Kyle Gabhart 解释了为什么消息服务对于企业的体系结构来说是至关重要的,您的解决方案必须克服什么类型的障碍,以及 除了Java消息服务(Java Message Service ,JMS)之外,还有哪些替代的解决方案.在本文的结尾,他分析了三种可用的解决方案(简单JMS客户机(Simple JMS Client).结合JMS使用的会话bean, 以及消息驱动bean),并且提供了一些特定的

JMS and ActiveMQ first lesson(转)

  JMS and ActiveMQ first lesson -- jms基础概念和应用场景 2011-6-18 PM 9:30 主讲:kimmking <kimmking@163.com> 整理:林木森 ppt下载地址: http://code.google.com/p/activemq-store-mongodb/downloads/list 下面开始: kimmking:介绍下jms和ActiveMQ.在讲JMS之前,我们聊聊相关的背景.谁知道JMS是什么意思? kimmking:对,