简介:JMS(Java Messaging Service) 是Java EE中的一种技术,它定义一套完整的接口,来实现不同系统或应用之间的消息通信。这意味着:我们针对JMS接口编写的应用程序(客户程序),在任何一个实现了标准JMS接口的容器下都能运行起来,我们的应用程序与容器实现了真正的解藕,这也就是面向接口编程的好处之一吧。这点类似JDBC编程。概念:有几个概念必须要搞清楚:1.Messaging (消息通知、消息通信)  一种应用系统或组件之间相互通信的方式。2.Message (消息) 消息即为消息通信的载体,消息包括Message Headers, Message properties, Message bodies1.JMS有两种方式进行消息通信:Point-to-Point (P2P) 和 Publish/Subscriber (PUB/SUB)1.1 P2P方式是一对一的,一条消息只有一个接收者,默认情况下是P2P消息是持久的,也就是说发送者(sender)产生的一条消息(message)发送到消息队列(queue)之上后,只有等到消息接收者(receiver)接收到它,才会从消息队列中删除,没有被接收的消息会一直存在JMS容器里。这种方式有点像邮政通信,信件只有一个接收者,信件在接收之前,会一直存放在信箱里。1.2 PUB/SUB方式的工作流程,首先subscriber(订阅者)向JMS容器订阅(Listen to)自己感兴趣的topic(主题),多个订阅者可以同时对一个主题进行订阅,消息发布者发布一条消息,所有订阅了该主题的订阅者都能收到这个消息。默认情况下,pub/sub方式下的消息不是持久的,这意味着,消息一经发出,不管有没有人接收,都不会保存下来,而且订阅者只能接收到自已订阅之后发布者发出的消息。这种方式有点像订阅报刊杂志,一种报刊可以有多人同时订阅,但订阅者只能收到开始订阅之后的报社发行的期刊。2. JMS提供者(JMS Provider)JMS提供者,也叫JMS服务器或JMS容器,也就是JMS服务的提供者,主流的J2EE容器一般都提供JMS服务(比如JBoss,BEA WebLogic,IBM WebSphere,Oracle Application Server等都支持)3.连接工厂(Connection Factories)连接工厂是用来创建客户端到JMS容器之间JMS连接的工厂,连接工厂有两种:(QueueConnectionFactory和TopicConnectionFactory),分别用来创建QueueConnection和 TopicConnection的。Context ctx = new InitialContext();QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) ctx.lookup("TopicConnectionFactory");4.目的地(Destinations) 目的地是消息生产者(producer)消息发住的目的地,也是消费者(consumer)接收消息的来源地,它有点像信箱,邮递员把信件投往信箱,收件人从信箱取信件。4.1对P2P方式来说,目的地就是Queue,4.2对pub/sub方式来说,目的地就是Topic。我们要得到这个目的地的引用,只能通过JNDI查找(lookup)的方式得到,因为目的地是注册在JMS服务器的Topic myTopic = (Topic) ctx.lookup("MyTopic");Queue myQueue = (Queue) ctx.lookup("MyQueue");5.连接(Connection)这里说的连接是指客户端与JMS提供者(容器)之间的连接,连接也分两种5.1 QueueConnection   --->  P2P5.2 TopicConnection   ---> Pub/Sub QueueConnection queueConnection = queueConnectionFactory.createQueueConnection();TopicConnection topicConnection = topicConnectionFactory.createTopicConnection();连接用完之后必须记得关闭,否则连接资源不会被释放掉。关闭连接的同时会自动把会话、产生者、消费者都关闭掉。6.会话(Session)会话是用来创建消息产生者和消息消费者的单线程环境,你可以它来创建消息生产者、消费者、消息,用它来维持消息监听。6.1 TopicSession topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);6.2 QueueSession queueSession = queueConnection.createQueueSession(true, 0);7.消息生产者(Message Producers)消息生产者也就是消息的产生者或发送者7.1 在P2P方式下它是QueueSender         --> QueueSender queueSender = queueSession.createSender(myQueue);7.2 在Pub/Sub方式下它是TopicPublisher。 -->TopicPublisher topicPublisher = topicSession.createPublisher(myTopic);它是一个由session创建的,用来把把消息发送到目的地的对象, 一旦你创建好生产者,你就可以用它来发送消息queueSender.send(message);topicPublisher.publish(message);8.消息消费者(Message Consumer)消息消费者也就是消息的接收者或使用者, 8.1 在P2P方式下这是QueueReceiver,        -->  QueueReceiver queueReceiver = queueSession.createReceiver(myQueue);8.1 在Pub/Sub方式下它是TopicSubscriber    -->  TopicSubscriber topicSubscriber = topicSession.createSubscriber(myTopic);       这是一个由session来创建的,用来接收来自目的地消息的对象。JMS容器来负责把消息从目的地投递到注册了该目的地的消息消费者。 一旦创建好消息消费者,它就是活动的,你可以用它来接收消息,你也可以用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)了。9.消息监听器(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,这就接收到的消息。10. 消息选择器(Message Selectors)假如你只需要一个对滤器来过滤收到的消息,那么你可以使用消息选择器,它允许消费者指定只对特定的消息感兴趣。消息选择器只能是工作在JMS容器的,而不是我们的应用程序上。消息选择器是一个包含一个表达式的字符串,这个表达式的语法类似SQL的条件表达式,在createReceiver, createSubscriber这些方法里有一个参数让你指定一个消息选择器,由这些方法创建的消费者就只能收到与消息选择器匹配的消息了。l1. 消息(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}

JMS(Java Messaging Service)基础知识相关推荐

  1. JMS(Java Messaging Service)基础

    1.基础结构 1)图表结构 2)各部分介绍 ConnectionFactory 封装了一组连接配置参数,它已被定义为管理员.每个连接工厂都是队列(Queue)连接工厂或主题(Topic)连接工厂接口的 ...

  2. JMS : Java Message Service (Java消息服务)之一 [转]

    为什么80%的码农都做不了架构师?>>>    1 引言 1.1 编写目的 本文作为B2bi项目中开源产品JORAM的使用指导文档,旨在帮助项目组人员方便明了的进行JMS模块的详细设 ...

  3. Java 网络编程基础知识

    Java 网络编程基础知识 基础概念 计算机网络的基本概念 ​ 网络:多台计算机使用网络设备互联在一起,计算机之间可以进行通信,这样就组成了一个计算机网络. ​ 网络设备:集线器(HUB),路由器,交 ...

  4. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  5. 第76节:Java中的基础知识

    第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...

  6. Java核心技术卷一基础知识第10版demo实例

    Java核心技术卷一基础知识第10版demo实例 第三章 JAVA的基本程序设计结构 3.7输入与输出 3.7.1读取输入 3.8控制流程 3.8.3循环 3.10数组 3.10.6多维数组 第四章 ...

  7. java的一些基础知识(引用BlogJava 落花飞雪)

     java的一些基础知识(引用BlogJava 落花飞雪) <Practical Java>笔记 1. 声明是什么? String s = "Hello world!" ...

  8. 黑马程序员 一、java 概述与基础知识

    获取更多资源关注Java帮帮IT资源分享网 一.黑马程序员-java 概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果 的过程. 为了使 ...

  9. java to go 基础知识与区别入土指南

    java to go 基础知识与区别入土指南 文章目录 java to go 基础知识与区别入土指南 @[toc] 基础篇 关于基础类型 关于复合数据类型 关于切片 关于Map 关于sync.map ...

最新文章

  1. PHP/TP5 接口设计中异常处理
  2. How your face shapes your economic chances
  3. 第三周 数据分析之概要 Pandas库数据特征分析
  4. 喜报!神策数据荣获“2019 银行业数字营销大赛”智能营销类金奖
  5. SOCKADDR_IN
  6. 研发工作中芯片选型需要考虑的问题
  7. Linux 添加DNS配置
  8. linux fstream open,fstream创建文件的问题
  9. js页面上的excel导出
  10. c语言循环结构菱形九九乘法表,C语言基础用基本的循环语句打印实心和空心菱形、九九乘法表 ....
  11. linux服务器_Linux 服务器为什么被黑?
  12. fedora 23 vlc 以root运行的方法
  13. redis java客户端封装_redis的java客户端Jedis简单封装
  14. windows系统迁移,C盘搬家
  15. 【教程】Edraw Max(亿图图示):使用免费模板和示例快速制作发票
  16. 机顶盒系统升级服务器,服务器及其软件升级方法、IP机顶盒及其软件升级方法...
  17. 计算机组装模拟系统吗,怎么在线模拟组装电脑
  18. Spring Cloud Gateway源码解析
  19. UML之教学管理系统——4、Rational Rose画活动图
  20. CTF杂项小结--沙窝李的王

热门文章

  1. CV codes代码分类整理合集 《转》
  2. 介绍 5种 绘制炫酷的地图方法
  3. 青藤正式加入微软MAPP计划
  4. 1.41亿部手机装有间谍软件! 360推国内首个CIQ查杀工具
  5. eja智能压力变送器工作原理_EJA压力变送器与普通压力变送器的区别
  6. Delphi考虑sql注入
  7. 关于程序员如何提高自己的一些感言
  8. 廖雪峰Git学习笔记1-Git简介
  9. 2012总结--第6篇--装备篇
  10. Bootstrap、栅格系统布局