`

学习jms(一)——基本实例

    博客分类:
  • JMS
阅读更多
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 dest = session.createQueue("dotaQueue");// 消息目的地

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

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

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()方法

下一篇博客,介绍jms与spring的集成
  • 大小: 44 KB
  • 大小: 50.7 KB
  • 大小: 24.5 KB
  • 大小: 25 KB
分享到:
评论
1 楼 Emotion_小寳 2014-03-21  
文章很不错,期待jms和spring的。。。

相关推荐

    JBOSS建立JMS应用实例

    总结来说,JBOSS中的JMS应用实例涉及了JMS的基本概念、JBOSST的配置、代码编写以及具体的应用场景。通过实践这些步骤,开发者可以掌握如何在JBOSST环境中利用JMS进行高效的数据通信。同时,提供的文档和项目文件为...

    Spring整合JMS——实现收发消息

    在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而JMS(Java Message Service)则是Java平台上的消息中间件标准,用于应用程序之间的异步通信。本篇文章将详细探讨如何通过Spring框架整合JMS,特别是...

    JMS-ActiveMQ入门实例

    1. **消息模型**:JMS支持两种消息模型——点对点(Point-to-Point,PTP)和发布/订阅(Publish/Subscribe,Pub/Sub)。点对点模型中,消息被发送到一个队列,每个消息只能被一个消费者接收;而在发布/订阅模型中,...

    Flex + BlazeDS + Java + JMS 通信实例(附源码)

    综上所述,这个实例是一个典型的富互联网应用(RIA)开发案例,展示了Flex、BlazeDS、Java和JMS在实时通信中的应用,对于理解和掌握相关技术具有很高的实践价值。通过学习和实践这个实例,开发者可以更好地理解如何...

    java-jms小例子

    在代码实现中,通常会创建一个`ConnectionFactory`实例,通过它创建一个`Connection`,然后从`Connection`创建一个`Session`,最后在`Session`上创建`MessageProducer`。 2. **消息消费者**:消息消费者是接收和...

    JBOSS建立JMS应用实例(附源码)

    - **消息模型**:JMS提供了两种主要的消息模型——点对点(Point-to-Point,P2P)和发布/订阅(Publish/Subscribe,Pub/Sub)。P2P模型基于队列,消息由一个生产者发送到队列,然后由一个或多个消费者接收;Pub/Sub...

    Spring 实现远程访问详解——jms和activemq

    本章我将通过spring jms和activemq实现单Web项目服务器间异步访问和多Web项目服务器间异步访问。 一. 简介 1. 什么是Apache ActiveMq Apache ActiveMq是最流行和最强大的开源消息和集成服务器。...7) 实例测试

    spring_jms

    在IT行业中,Spring框架是Java应用开发的基石,它提供了丰富的功能来简化企业级应用的构建。Spring JMS(Java Message...通过深入学习和实践这个实例,开发者将能够更好地理解和应用Spring JMS在实际项目中的各种场景。

    JMS1.1规范(中文)

    1. **消息**:JMS中的消息是数据传输的基本单元,它包含了要在应用程序之间传递的信息。消息可以是文本、二进制数据或其他复杂类型的数据。 2. **消息队列与主题**:JMS提供两种消息传递模型——点对点(Point-to-...

    ActiveMQ实战——实现一个简易版的聊天室

    在本篇《ActiveMQ实战——实现一个简易版的聊天室》中,我们将深入探讨如何利用Apache ActiveMQ构建一个简单的在线聊天应用。ActiveMQ是Apache软件基金会的一个开源项目,它是一款功能强大的消息中间件,用于在...

    JAVA消息服务实例

    Java消息服务(JMS,Java Message Service)是Java平台中用于企业级应用集成的一个标准API,它提供了一种可靠和高效的方式来进行异步通信。在JMS中,消息被发送到一个消息代理(message broker),然后由消费者从该...

    jms 1.1源码&中英文api

    在提供的资源中,有两个CHM帮助文件——"jms_en.chm"和"jms_zh.chm",分别提供了英文和中文的API文档。这些文档详细列出了JMS 1.1接口和类的功能,对于开发者来说是重要的参考资料。通过查阅这些文档,你可以了解...

    JMS.rar_answers_jms

    3. **两种消息类型**:JMS支持两种消息模型——点对点(Point-to-Point,PTP)和发布/订阅(Publish/Subscribe,Pub/Sub)模式。PTP模式下,每个消息只有一个消费者,而Pub/Sub模式中,一个消息可以被多个订阅者接收...

    深入掌握 JMS(java message service)

    - **消息模型**:JMS支持两种消息通信模型——**点到点**(Point-to-Point, P2P)和**发布/订阅**(Publish/Subscribe, Pub/Sub)。这两种模型分别适用于不同的场景: - **点到点模型**:在这种模型下,消息由发送...

    JMS_DEMO

    JMS_DEMO是一个用于演示JMS实际应用的实例,通过这个示例,我们可以深入学习JMS的工作原理和使用方法。 首先,JMS的核心概念包括生产者(Producer)、消费者(Consumer)、消息(Message)和代理(Broker)。生产者...

    求精要诀——JavaEE编程开发案例精讲 源代码

    《求精要诀——JavaEE编程开发案例精讲》是一本深入浅出的JavaEE编程教程,由清华大学出版社出版。本书旨在通过丰富的实例讲解,帮助读者掌握JavaEE平台上的核心开发技术,提升实际项目开发能力。书中源代码的提供,...

    《Java高手真经:Java Web高级开发技术》读书笔记模板.pptx

    + 使用Eclipse进行Java Web项目的开发——实例演示HelloWorld项目开发过程 * 第2课:创建企业信息管理系统数据库 + 基本需求功能——登录、退出与注册 + 业务需求功能——企业信息管理系统功能 + 设计页面结构 ...

    h_JAVA 2应用编程150例.rar

    实例119 Request-Reply模式的JMS应用 421 实例120 使用Java IDL 426 实例121 EJB与CORBA的交互 430 实例122 基于EJB的真实世界模型 433 实例123 EJB的商业应用——定购单 447 第11章 Java 2 Platform Micro Edition...

Global site tag (gtag.js) - Google Analytics