`
zengshaotao
  • 浏览: 788760 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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,是消息发送者,创建这个组件的代码类似: 

Java代码  收藏代码
  1. Destination dest = session.createQueue("dotaQueue");// 消息目的地  
  2.   
  3.         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的例子: 

Java代码  收藏代码
  1. public class Main {  
  2.   
  3.     public static void main(String[] args) throws JMSException {  
  4.   
  5.         String jmsProviderAddress = "tcp://localhost:61616";// 地址  
  6.   
  7.         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(  
  8.                 jmsProviderAddress);// 连接器  
  9.   
  10.         Connection connection = connectionFactory.createConnection();// 创建连接  
  11.   
  12.         Session session = connection.createSession(false,  
  13.                 Session.AUTO_ACKNOWLEDGE);// 打开会话  
  14.   
  15.         Destination dest = session.createQueue("demoQueue");// 消息目的地  
  16.   
  17.         MessageProducer producer = session.createProducer(dest);// 消息发送者  
  18.   
  19.         Message message = session.createTextMessage("hello world");// 消息  
  20.   
  21.         producer.send(message);// 发送  
  22.   
  23.         producer.close();// 关闭  
  24.         session.close();  
  25.         connection.close();  
  26.   
  27.     }  
  28.   
  29. }  


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

然后是Message Consumer的例子: 

Java代码  收藏代码
  1. public static void main(String[] args) throws JMSException {  
  2.   
  3.         String jmsProviderAddress = "tcp://localhost:61616";// 地址  
  4.   
  5.         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(  
  6.                 jmsProviderAddress);// 连接器  
  7.   
  8.         Connection connection = connectionFactory.createConnection();// 创建连接  
  9.   
  10.         Session session = connection.createSession(false,  
  11.                 Session.AUTO_ACKNOWLEDGE);// 打开会话  
  12.   
  13.         String destinationName = "demoQueue";  
  14.   
  15.         Destination dest = session.createQueue(destinationName);// 消息目的地  
  16.   
  17.         MessageConsumer consumer = session.createConsumer(dest);  
  18.   
  19.         connection.start();  
  20.   
  21.         Message message = consumer.receive();  
  22.   
  23.         TextMessage textMessage = (TextMessage) message;  
  24.   
  25.         String text = textMessage.getText();  
  26.   
  27.         System.out.println("从ActiveMQ取回一条消息: " + text);  
  28.   
  29.         consumer.close();  
  30.         session.close();  
  31.         connection.close();  
  32.   
  33.     }  


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

分享到:
评论

相关推荐

    JMS完全实例(八个实例)

    JMS的基本操作是发送和接收消息。在这些实例中,我们将看到如何使用生产者(Producer)创建消息并发送到队列(Queue)或主题(Topic)。消费者(Consumer)则从这些队列或主题中接收消息。理解如何创建消息对象,...

    activeMQ-JMS实例

    首先,让我们理解ActiveMQ和JMS的基本概念。 ActiveMQ是Apache软件基金会开发的一款开源消息代理,它实现了JMS规范,允许应用程序之间进行异步通信。JMS是一种标准接口,用于Java平台上的消息传递,提供了可靠的...

    JBOSS建立JMS应用实例

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

    ActiveMq-JMS简单实例

    在这个"ActiveMQ-JMS简单实例"中,我们将探讨如何在Tomcat服务器上部署并使用ActiveMQ,以及通过代码实现JMS的基本功能。 首先,让我们了解ActiveMQ的核心概念。ActiveMQ作为消息代理,它接收和转发消息,提供持久...

    JMS信息传输实例代码

    JMS 信息传输实例代码 JMS (Java Message Service) 是 Java 消息服务,提供标准的产生、发送、接收消息的接口,简化企业应用的开发。JMS 支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅...

    Java-JMS实例

    **JMS基本概念** 1. **JMS API**:JMS 提供了一组接口和类,使得开发者能够创建、发送、接收和消费消息。它定义了生产者(Producer)和消费者(Consumer)的概念,生产者负责创建和发送消息,消费者则负责接收和...

    JMS 文档实例讲解

    JMS(Java Message Service)是Java平台...通过理解其基本概念和核心组件,我们可以构建可靠的异步通信系统,提高系统的可扩展性和解耦性。在实际项目中,选择合适的JMS提供者并结合具体需求,可以实现高效的消息传递。

    JMS 参考实例相关讲解

    Java消息服务(Java Message ...了解和掌握JMS的基本概念、生命周期以及如何与EJB等其他技术结合,对于提升企业级应用的开发能力至关重要。通过实践和学习提供的资料,你可以更深入地理解JMS的工作原理和使用方法。

    jms入门实例

    通过上述JMS的基本概念和使用方式,开发者可以构建可靠且松耦合的分布式系统。在实际应用中,JMS常用于企业级应用集成、大数据流处理、事件驱动架构等场景。例如,Test文件可能包含了JMS的入门示例代码,展示了如何...

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

    通过以上步骤,你可以理解并实践在JBoss中构建JMS应用的基本过程。记住,JMS的关键在于其异步通信能力,能够帮助提升系统的并发处理能力和容错性。在实际项目中,根据业务需求灵活运用JMS,可以实现更高效、更可靠的...

    ActiveMq-JMS简单实例使用tomcat.pdf

    这个实例对初学者来说是一个很好的起点,能够理解ActiveMQ的基本使用和集成步骤。但需要注意的是,实际生产环境中可能还需要考虑安全性、集群、持久化、事务处理等高级特性,这些都是在基础之上进一步深入学习的内容...

    JMS-ActiveMQ入门实例

    **JMS与ActiveMQ入门实例...理解并实践这些基本概念,你就能开始探索JMS和ActiveMQ更高级的功能,如事务、持久订阅、消息选择器以及消息优先级等。记得查看提供的文档,以获取更多关于配置、性能优化和故障排查的信息。

    java-jms小例子

    本示例“java-jms小例子”旨在演示JMS的基本用法。JMS的核心概念包括消息生产者、消息消费者和消息队列/主题。在这个小例子中,我们将探讨如何创建这两者以及如何利用它们进行通信。 1. **消息生产者**:在JMS中,...

    activemq与spring整合发送jms消息入门实例

    本教程将深入探讨如何将这两个强大的工具结合在一起,以创建一个简单的发送JMS消息的入门实例。 首先,我们需要理解ActiveMQ的基本概念。ActiveMQ是Apache软件基金会开发的一个开源消息代理,它实现了JMS规范,提供...

    基于WebSphere MQ发送消息的简单JMS实例

    通过这个简单的JMS和WebSphere MQ实例,你可以了解到消息队列的基本用法。在实际项目中,这可以扩展到处理大量并发请求、保证数据一致性、或者实现解耦的微服务架构。了解和掌握JMS与WebSphere MQ的结合使用,对于...

    spring中集成JMS使用工程实例..eclipse项目例子,带注解.导入即可运行.

    2. **JMS基本概念** - **消息队列**:JMS的核心概念,用于存储待处理的消息。 - **消息**:传输的数据单元,包含了消息头和消息体。 - **生产者**:发送消息的应用。 - **消费者**:接收消息的应用。 - **提供...

    JMS和MDB的实例代码

    本文将深入探讨JMS和MDB的概念、工作原理,并通过一个具体的实例代码来阐述它们如何协同工作。 首先,让我们了解JMS。JMS是一种标准接口,允许应用程序创建、发送、接收和读取消息。它提供了一种平台无关的方式,...

    Weblogic创建JMS服务器

    7. **分配JMS服务器**:将JMS服务器分配到一个特定的WebLogic服务器实例或集群,确保它们可以在运行时找到JMS资源。 8. **保存并激活更改**:完成所有配置后,记得保存设置,并部署到目标WebLogic服务器实例或集群...

    Sun 官方JMS教程

    通过理解JMS的基本概念、核心组件和使用流程,开发者可以更加高效地利用JMS来满足复杂的业务需求。随着技术的发展,尽管JMS已经存在了一段时间,但它仍然是企业级应用开发中的重要组成部分之一。

Global site tag (gtag.js) - Google Analytics