基础篇
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Linyufa/archive/2009/07/24/4375670.aspx
JMS是应用系统或组件之间相互通信的应用程序接口,利用它,我们可以轻易实现在不同JVM之间相互的远程通信。要实现远程通信,RPC同样也能做到,但RPC却不可避免地增加了不同系统之间的耦合度,JMS能极大地降低不同的应用系统之间的耦合。
要学习JMS,有几个概念必须要搞清楚:
l Messaging (消息通知、消息通信)
一种应用系统或组件之间相互通信的方式。
l Message (消息)
消息即为消息通信的载体,消息包括Message Headers, Message properties, Message bodies
l JMS有两种方式进行消息通信:Point-to-Point (P2P) 和 Publish/Subscriber (PUB/SUB)
P2P方式是一对一的,一条消息只有一个接收者,默认情况下是P2P消息是持久的,也就是说发送者(sender)产生的一条消息(message)发送到消息队列(queue)之上后,只有等到消息接收者(receiver)接收到它,才会从消息队列中删除,没有被接收的消息会一直存在JMS容器里。这种方式有点像邮政通信,信件只有一个接收者,信件在接收之前,会一直存放在信箱里。
PUB/SUB方式的工作流程,首先subscriber(订阅者)向JMS容器订阅(Listen to)自己感兴趣的topic(主题),多个订阅者可以同时对一个主题进行订阅,消息发布者发布一条消息,所有订阅了该主题的订阅者都能收到这个消息。默认情况下,pub/sub方式下的消息不是持久的,这意味着,消息一经发出,不管有没有人接收,都不会保存下来,而且订阅者只能接收到自已订阅之后发布者发出的消息。这种方式有点像订阅报刊杂志,一种报刊可以有多人同时订阅,但订阅者只能收到开始订阅之后的报社发行的期刊。
l JMS(Java Messaging Service)
是Java EE中的一种技术,它定义一套完整的接口,来实现不同系统或应用之间的消息通信。这意味着:我们针对JMS接口编写的应用程序(客户程序),在任何一个实现了标准JMS接口的容器下都能运行起来,我们的应用程序与容器实现了真正的解藕,这也就是面向接口编程的好处之一吧。这点类似JDBC编程。
l JMS提供者(JMS Provider)
JMS提供者,也叫JMS服务器或JMS容器,也就是JMS服务的提供者,主流的J2EE容器一般都提供JMS服务(比如JBoss,BEA WebLogic,IBM WebSphere,Oracle Application Server等都支持)
l 连接工厂(Connection Factories)
连接工厂是用来创建客户端到JMS容器之间JMS连接的工厂,连接工厂有两种: (QueueConnectionFactory和TopicConnectionFactory),分别用来创建QueueConnection 和 TopicConnection的。
Context ctx = new InitialContext();QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) ctx.lookup("TopicConnectionFactory"); l 目的地(Destinations)
目的地是消息生产者(producer)消息发住的目的地,也是消费者(consumer)接收消息的来源地,它有点像信箱,邮递员把信件投往信箱,收件人从信箱取信件。对P2P方式来说,目的地就是Queue,对pub/sub方式来说,目的地就是Topic。我们要得到这个目的地的引用,只能通过JNDI查找(lookup)的方式得到,因为目的地是注册在JMS服务器的(后面的章节会讲到如何注册一个目的地)
Topic myTopic = (Topic) ctx.lookup("MyTopic");Queue myQueue = (Queue) ctx.lookup("MyQueue");
l 连接(Connection)
这里说的连接是指客户端与JMS提供者(容器)之间的连接。连接也分两种:QueueConnection和TopicConnection,分别对应于P2P连接和Pub/Sub连接。
QueueConnection queueConnection = queueConnectionFactory.createQueueConnection();TopicConnection topicConnection = topicConnectionFactory.createTopicConnection();
连接用完之后必须记得关闭,否则连接资源不会被释放掉。关闭连接的同时会自动把会话、产生者、消费者都关闭掉。
l 会话(Session)
会话是用来创建消息产生者和消息消费者的单线程环境,你可以它来创建消息生产者、消费者、消息,用它来维持消息监听。
TopicSession topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);QueueSession queueSession = queueConnection.createQueueSession(true, 0);l 消息生产者(Message Producers)
消息生产者也就是消息的产生者或发送者,在P2P方式下它是QueueSender,在Pub/Sub方式下它是TopicPublisher。它是一个由session创建的,用来把把消息发送到目的地的对象。
QueueSender queueSender = queueSession.createSender(myQueue);TopicPublisher topicPublisher = topicSession.createPublisher(myTopic);
一旦你创建好生产者,你就可以用它来发送消息
queueSender.send(message);topicPublisher.publish(message);
l 消息消费者(Message Consumer)
消息消费者也就是消息的接收者或使用者,在P2P方式下这是QueueReceiver,在Pub/Sub方式下它是TopicSubscriber。这是一个由session来创建的,用来接收来自目的地消息的对象。JMS容器来负责把消息从目的地投递到注册了该目的地的消息消费者。
QueueReceiver queueReceiver = queueSession.createReceiver(myQueue);TopicSubscriber topicSubscriber = topicSession.createSubscriber(myTopic);
一旦创建好消息消费者,它就是活动的,你可以用它来接收消息,你也可以用close()方法来使它失效(Inactive)。当你调用Connection的start()方法之前,消费者是不会接收到任何消息的。两种接收者都有一个receive方法,这是一个同步的方法,也就是说程序执行到这个方法会被阻塞,直到收到消息为止。
queueConnection.start();Message m = queueReceiver.receive(); topicConnection.start();Message m = topicSubscriber.receive(1000); // time out after a second
如果我们不想它被阻塞,就需要异步的接收消息,这时我们得用消息临听器(Message Listener)了。
l 消息监听器(Message Listener)
消息监听器是一个充当消息的异步事件处理器的对象,它实现了MessageListener接口,这个接口只有一个方法onMessage,在这个方法里,你可以定义当接收到消息之后的要做的操作。你可以用setMessageListener方法为消息消费者注册一个监听器。
MessageListener listener = new MessageListener( { public void onMessage(Message msg) { // }});topicSubscriber.setMessageListener(listener); //注册监听topicConnection.start();有一点要注意,如果你先调用Connection的start,然后再调用setMessageListener,消息很可能接收不到,正确的做法是先注册监听,再启动Connection。
注册监听之后,一旦JMS容器有消费投递过来,消息消费(接收)者就会自动调用监听器的onMessage方法。这个方法的带有一个参数Message,这就接收到的消息。
l 消息选择器(Message Selectors)
假如你只需要一个对滤器来过滤收到的消息,那么你可以使用消息选择器,它允许消费者指定只对特定的消息感兴趣。消息选择器只能是工作在JMS容器的,而不是我们的应用程序上。消息选择器是一个包含一个表达式的字符串,这个表达式的语法类似SQL的条件表达式,在createReceiver, createSubscriber这些方法里有一个参数让你指定一个消息选择器,由这些方法创建的消费者就只能收到与消息选择器匹配的消息了。
l 消息(Messages)
JMS消息包括三个部分:消息头(Header),属性(Properties),消息体(Body)
其中消息头是必须的,后两个是可选的。
1)消息头里你可以指定JMSMessageID, JMSCorrelationID, JMSReplyTo, JMSType等信息。
2)属性指定一些消息头没有包括的附加信息,比如可以在属性里指定消息选择器。
3)消息体是消息的内容,有5种消息类型:TextMessage,MapMessage,BytesMessage,StreamMessage,ObjectMessage=-
TextMessage message = queueSession.createTextMessage();message.setText(msg_text); // msg_text is a StringqueueSender.send(message); 在消费者端,接收到的总是一个通用的Message对象,你需要把它转型成特定的类型才能提取出里面的内容。
Message m = queueReceiver.receive();if (m instanceof TextMessage) { TextMessage message = (TextMessage) m; System.out.println("Reading message: " + message.getText());} else { // Handle error}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Linyufa/archive/2009/07/24/4375670.aspx
分享到:
相关推荐
Java消息服务(Java Message ..."JMS简明教程.pdf"这份文档应该详细介绍了这些概念,并可能包括实例代码和最佳实践,可以帮助初学者快速入门JMS。学习JMS不仅可以提升你的专业技能,也有助于解决复杂的企业级问题。
Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的API...通过阅读"JMS简明教程.pdf",你可以进一步深化对JMS的理解,同时"中国java下载站.url"可能是获取更多Java资源和学习资料的链接。
**JMS(Java Message Service)教程** Java Message Service(JMS)是Java平台中用于创建、发送、接收和读取消息的应用程序接口。...本JMS简明教程将帮助初学者理解其核心概念,并逐步掌握如何在实际项目中运用。
**《JMS消息简明教程》** 提供了一个快速入门的指南,简化了JMS的基础知识,适合初学者快速了解JMS的基本概念和操作。它可能包括创建连接工厂、创建和发送消息的示例代码,以及如何测试和调试JMS应用程序的方法。 ...
在学习JMS时,可以参考《JMS简明教程.pdf》这样的文档,它通常会涵盖以上概念,并提供实例代码来帮助理解如何在Java应用程序中使用JMS API创建、发送和接收消息。通过深入学习,开发者可以掌握如何利用JMS构建高可用...
4. **JMS简明教程** 这份教程可能提供了JMS基础概念的快速入门,包括消息类型(如TextMessage、ObjectMessage等)、消息模式、生产者和消费者的角色、事务处理以及JMS API的使用方法。 5. **JMS规范教程** JMS...
《Java EE 5 Tutorial》是SUN公司发布的一份官方教程,主要针对Java企业级应用开发,涵盖了J2EE 5版本的相关技术。...这份教程对于想要进入Java企业级开发领域的初学者或是希望更新技能的专业人士都是宝贵的资源。
这些电子书资源都是世界级程序设计大师作品,包括 Thinking in Java、Java 数据库高级编程宝典、Java distribute computing、JMS 简明教程等。 Java 基础知识 * Thinking in Java 第三版+第四版(中文版+习题答案...
《JMS简明教程.pptx》则会帮助你理解JMS的基本概念和使用方式,以及它在企业级应用中的作用。 总之,EJB是Java EE中的重要组成部分,提供了构建企业级应用的强大工具。通过学习和掌握EJB,开发者可以构建出高度模块...
11. **分布式计算和消息队列**:《Java distribute computing》和《JMS 简明教程》探讨了Java在分布式环境和消息传递中的应用。 12. **游戏编程**:《J2ME Game Programming》介绍了在Java平台上开发移动游戏的技术...
J2EE中文教材以简明易懂的语言,结合实际案例,为学习者提供了全面、系统的J2EE学习资源。 **J2EE核心组件** 1. **Java Servlets**: 是J2EE中的核心部分,用于处理HTTP请求并生成响应。Servlets可以扩展服务器功能...
- **《UML精粹:标准建模语言简明教程》** - 内容:教授UML语言的基本概念和使用方法,有助于软件设计和团队沟通。 - **《重构:改善既有代码的设计》** - 作者:Martin Fowler - 内容:介绍了重构技术,帮助...