本文代码使用ActiveMq5.6

一、什么是JMS

JMS(Java Message Service,Java消息服务)是一组Java应用程序接口(Java API),它提供创建、发送、接收、读取消息的服务。它给消息中间件生产商提供了一个统一API的标准。
第一个版本1998年,目前最新的2.0版本(2013年第一季度发布)
JMS规范地址:
http://www.oracle.com/technetwork/java/docs-136352.html(1.1版本)
http://download.oracle.com/otndocs/jcp/jms-2_0-fr-eval-spec/index.html(2.0版本)

中间件(MOM):中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。也就是应用程序A与应用程序B之间不是直接交互,而是通过中间件进行资源共享。

Active MQ的主要功能就是实现JMS Provider,用来实现高可用、高性能、可伸缩、易用、安全的企业级面向消息服务的系统。

消息中间件的功能:将信息按照消息的形式,从一个应用程序传输到另一个或多个应用程序。

消息中间件的特点:

  •   消息的接受是异步,犹如发短信,发送消息的人不必等待接受消息人的响应,以此减少多系统之间的耦合度。
  • 消息的可靠性,为确保消息在中间节可靠保存,只有在接受方收到消息后,才删除消息,多个消息也可以组册原子事务。

应用场景:多个系统间通讯的时候,一般需要保证:

  •   可靠传输,数据不可以丢失,有的时候,也会保证数据不可以重复传输。
  • 异步传输,多个系统同步调用会因为互相等待而造成系统瓶颈。

二、JMS消息模型

1、JMS元素

  • JMS provider:An implementation of the JMS interface for a Message Oriented Middleware (MOM)  面向消息中间件的JMS接口的实现

  • JMS client:An application or process that produces and/or receives messages. 产生和/或接收消息的应用程序或过程

  • JMS producer/publisher:A JMS client that creates and sends messages. 创建和发送消息的JMS客户端。

  • JMS consumer/subscriber:A JMS client that receives messages. 接收消息的JMS客户机。

  • JMS message(header/payload):An object that contains the data being transferred between JMS clients. 包含JMS客户机之间传输数据的对象

  • JMS queue:A staging area that contains messages that have been sent and are waiting to be read. A JMS queue only guarantees that each message is processed only once.包含已发送并等待被读取的消息的暂存区域。JMS队列只保证每个消息只处理一次。

  • JMS topic:A distribution mechanism for publishing messages that are delivered to multiple subscribers. 发布消息传递给多个订阅服务器的分发机制。

2、JMS消息模型

a、点对点的消息模型: 每个消息只能有一个消费者。

消息的生产者和消费者之间没有时间上的相关性。无论消费者在生产者发送消息的时候是否处于运行状态,它都可以提取消息。

b、发布订阅消息模型   每个消息可以有多个消费者

生产者和消费者之间有时间上的相关性。订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS规范允许客户创建持久订阅,这在一定程度上放松了时间上的相关性要求。持久订阅允许消费者消费它在未处于激活状态时发送的消息。

三、JMS消息接口

JMS支持两种消息类型P -to- P 和 Pub-Sub 这两种消息类型都继承统一接口JMS Parent,主要接口是

JMS Parent

P -to -P

Pub - Sub

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

QueueDestination

TopicDestination

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicPublisher

MessageConsumer

QueueReceiver

TopicSubscriber

1、接口描述:

ConnectionFactory:连接工厂,JMS创建连接的方式

Connection:JMS客户端与JMS Provider的连接(通过ConnectionFactory创建的)。

Destination:消息的目的地

Session:一个接收或发送消息的一次回话

MessageProducer:由session对象创建的用于发送消息的对象

MessageConsumer:由session对象创建的用来接收消息的对象

2、JMS的创建流程

  • 创建ConnectionFactory工厂
  • 通过工厂创建Connection连接
  • 通过连接创建一个连接回话Session
  • 通过Session创建消息的生产者MessageProducer和消息的消费者MessageConsumer;同时Session也创建一个消息Mesage。
  • 消息的生产者MessageProducer将该消息发送到目的地中Destination;消费者同时监听该消息目的地Destination。

P -to- P模型:

生产者:

  1. package com.jalja.org.base.JMS;
  2. import javax.jms.Connection;
  3. import javax.jms.ConnectionFactory;
  4. import javax.jms.Destination;
  5. import javax.jms.JMSException;
  6. import javax.jms.MessageProducer;
  7. import javax.jms.Session;
  8. import javax.jms.TextMessage;
  9. import org.apache.activemq.ActiveMQConnectionFactory;
  10. public class ProducerJMS {
  11. private static String url="http://localhost:61616";//ActiveMq的地址
  12. private static String queueName="queue-ch2";//创建一个队列
  13. public static void main(String[] args) throws JMSException {
  14. //
  15. ConnectionFactory connFactory = new ActiveMQConnectionFactory();
  16. Connection conn = connFactory.createConnection();
  17. conn.start();//开启连接
  18. //创建Session
  19. Session session = conn.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
  20. //创建一个p -to -P 类型的消息队列(消息目的地)
  21. Destination des = session.createQueue(queueName);
  22. //将消息交给消息发送者
  23. MessageProducer producer = session.createProducer(des);
  24. //创建一个text类型的消息
  25. TextMessage msg = session.createTextMessage();
  26. msg.setText("Hello World!");
  27. //将消息发送到消息队列中
  28. producer.send(msg);
  29. //关闭资源
  30. session.close();
  31. conn.close();
  32. }
  33. }

消费者

  1. package com.jalja.org.base.JMS;
  2. import javax.jms.Connection;
  3. import javax.jms.ConnectionFactory;
  4. import javax.jms.Destination;
  5. import javax.jms.MessageConsumer;
  6. import javax.jms.Session;
  7. import org.apache.activemq.ActiveMQConnectionFactory;
  8. public class ConsumerA {
  9. private static String url = "tcp://localhost:61616";
  10. private static String queueName = "queue-ch2";
  11. public static void main(String[] args) throws Exception {
  12. ConnectionFactory connFactory = new ActiveMQConnectionFactory();
  13. Connection conn = connFactory.createConnection();
  14. conn.start();//启动连接
  15. //创建Session
  16. Session session = conn.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
  17. //创建一个p -to -P 类型的消息队列(消息目的地)
  18. Destination des = session.createQueue(queueName);
  19. //创建一个消息消费者 并指定其消费信息的目的地
  20. MessageConsumer consumer = session.createConsumer(des);
  21. //监听消息队列
  22. Listener listener = new Listener();
  23. listener.setForm("ConsumerA");
  24. consumer.setMessageListener(listener);
  25.  
  26. }
  27. }

消息监听器:

  1. package com.jalja.org.base.JMS;
  2. import javax.jms.JMSException;
  3. import javax.jms.Message;
  4. import javax.jms.MessageListener;
  5. import javax.jms.TextMessage;
  6. public class Listener implements MessageListener {
  7. private String form = null;
  8. /**
  9. * 监听消息队列,如果该消息队列有消息,该监听器就可以获取消息
  10. */
  11. @Override
  12. public void onMessage(Message message) {
  13. TextMessage msg = (TextMessage)message;
  14. try {
  15. System.out.println(getForm() + ":" + msg.getText());
  16. } catch (JMSException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. public String getForm() {
  21. return form;
  22. }
  23. public void setForm(String form) {
  24. this.form = form;
  25. }
  26.  
  27. }

Pub - Sub 模型

生产者:

  1. package ch02.pubsub;
  2.  
  3. import javax.jms.Connection;
  4. import javax.jms.ConnectionFactory;
  5. import javax.jms.Destination;
  6. import javax.jms.JMSException;
  7. import javax.jms.MessageProducer;
  8. import javax.jms.Session;
  9. import javax.jms.TextMessage;
  10. import org.apache.activemq.ActiveMQConnectionFactory;
  11.  
  12. /*
  13. * pubsub MQ生产者
  14. */
  15. public class Publisher {
  16. private static String url = "tcp://localhost:8161";
  17. private static String topicName = "topic.ch02";
  18. public static void main(String[] args) throws Exception {
  19. // TODO Auto-generated method stub
  20. ConnectionFactory connFactory = new ActiveMQConnectionFactory();
  21. Connection conn = connFactory.createConnection();
  22. conn.start();
  23. Session session = conn.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
  24. Destination des = session.createTopic(topicName);
  25. MessageProducer publisher = session.createProducer(des);
  26. TextMessage msg = session.createTextMessage();
  27. msg.setText("Hello World!");
  28. publisher.send(msg);
  29. session.close();
  30. conn.close();
  31. }
  32. }

消费者:

  1. package ch02.pubsub;
  2.  
  3. import javax.jms.Connection;
  4. import javax.jms.ConnectionFactory;
  5. import javax.jms.Destination;
  6. import javax.jms.JMSException;
  7. import javax.jms.MessageConsumer;
  8. import javax.jms.Session;
  9.  
  10. import org.apache.activemq.ActiveMQConnectionFactory;
  11.  
  12. /**
  13. *
  14. * PTP 消费者A
  15. *
  16. */
  17. public class SubscriberA {
  18.  
  19. private static String url = "tcp://localhost:8161";
  20. private static String topicName = "topic.ch02";
  21.  
  22. /**
  23. * @param args
  24. * @throws Exception
  25. */
  26. public static void main(String[] args) throws Exception {
  27. // TODO Auto-generated method stub
  28. ConnectionFactory connFactory = new ActiveMQConnectionFactory();
  29. Connection conn = connFactory.createConnection();
  30. conn.start();
  31. Session session = conn.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
  32. Destination des = session.createTopic(topicName);
  33. MessageConsumer consumer = session.createConsumer(des);
  34. Listener listener = new Listener();
  35. listener.setForm("SubscriberA");
  36. consumer.setMessageListener(listener);
  37.  
  38. }
  39.  
  40. }

消息监听器:

  1. package ch02.pubsub;
  2.  
  3. import javax.jms.JMSException;
  4. import javax.jms.Message;
  5. import javax.jms.MessageListener;
  6. import javax.jms.TextMessage;
  7.  
  8. public class Listener implements MessageListener {
  9.  
  10. private String form = null;
  11.  
  12. @Override
  13. public void onMessage(Message message) {
  14. TextMessage msg = (TextMessage)message;
  15. try {
  16. System.out.println(getForm() + ":" + msg.getText());
  17. } catch (JMSException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. }
  21. }
  22.  
  23. public String getForm() {
  24. return form;
  25. }
  26.  
  27. public void setForm(String form) {
  28. this.form = form;
  29. }
  30.  
  31. }

JMS学习之理论基础的更多相关文章

  1. ActiveMQ基本详解与总结& 消息队列-推/拉模式学习 & ActiveMQ及JMS学习

    转自:https://www.cnblogs.com/Survivalist/p/8094069.html ActiveMQ基本详解与总结 基本使用可以参考https://www.cnblogs.co ...

  2. JMS学习(三)JMS 消息结构之属性及消息体详解

    一.前言 通过上一篇的学习我们知道了消息分为三个部分,即消息头,属性及消息体,并对消息头的十个属性进行了详细的介绍,本文再对消息属性及消息体进行详细的介绍. 二.属性介绍 消息属性的主要作用是可以对头 ...

  3. JMS学习的个人理解笔记

    Jms即java消息服务javamessage service,所谓的面向消息编程,主要应用在企业内部各个系统之间做接口,以异步方式传递消息数据. Jms有2种传送模式,先来看第一种,即点对点传送模式 ...

  4. JMS学习三(ActiveMQ消息的可靠性)

    下面我们来学习一下消息接受确认和发送持久化消息.消息的过期.消息的选择器和消息的优先级. 一.消息接收确认 1.jms消息只有在被确认之后才认为成功消费了这条消息.消息的成功消费通常包括三个步骤:(1 ...

  5. JMS学习之路(一):整合activeMQ到SpringMVC

    JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...

  6. JMS学习(四) Selector详解

    一.前言 在掌握了消息的结构之后,我们接下来看一下JMS的一个重要功能:选择器.有些时候,作为消费者只希望处理自己感兴趣的消息.如果某个消息只有一个消费者,我们可以在让该客户端根据规则来处理自己感兴趣 ...

  7. JMS学习(二)- JMS Message Model 组成介绍及消息头详解

    一.前言 从本文起依次详细介绍JMS中的一些重要的概念,主要参考了官方的JMS1.1的文档,该文档很老了,是02年的,那年,JAVA还没有被Oracle收购..本文主要介绍Message及其相关概念, ...

  8. JMS学习(一)基本概念

    这两天面试了一两个公司,由于简历中的最近一个项目用到了JMS,然而面试官似乎对这个很感兴趣,所以都被问到了,但可惜的是,我除了说我们使用了JMS外,面对他们提出的一些关于JMS的问题,我回答得相当差, ...

  9. 消息队列-推/拉模式学习 & ActiveMQ及JMS学习

    一种分类是推和拉 . 还有一种分类是 Queue 和 Pub/Sub . 先看的这一篇:http://blog.csdn.net/heyutao007/article/details/50131089 ...

随机推荐

  1. 安装ecb

    mac emacs上安装ecb,通过elpa折腾得要死,死活无法使用. 解决办法:下载https://github.com/alexott/ecb,添加路径,(require 'ecb),直接ok.

  2. php 运行模式

    1.php最常见的五种运行模式. CGI 通用网关接口 FastCGI 常驻内存的CGI CLI 命令行 Web模块  Apache等Web服务器 模块的形式加载php进程 ISAPI 已经不用了 2 ...

  3. 通俗讲讲FPGA

    通俗讲讲什么是FPGA. FPGA出现之前,所有集成电路都可以看成雕塑家,但是雕成一个成品,往往要浪费很多半成品和原料,这就是ASIC的制造. 后来FPGA出现了,FPGA就是块橡皮泥,什么硬件电路都 ...

  4. python 笔记2016

    列表,元组(不可添加和修改),字典 3种集合模式 模块----类---函数 要把文件变成双击运行,要把文件的属性选择python安装目录下的python.exe 1,查看数据类型 print(type ...

  5. python学习(二十一) Python 中的链式赋值

    Python的链式赋值如下:

  6. 利用html5制作一个时钟动画

    <canvas id="clock" width="500" height="500" style="background- ...

  7. 【HDU】2222 Keywords Search(AC自动机)

    题目 传送门:QWQ 分析 $ AC $自动机模板,黈力的码风真的棒极了,这是我抄他的. 还有 题号不错 代码 #include <cstdio> #include <cstring ...

  8. SSMS安装英文版后无法修改为中文

    SSMS的UI语言和所安装的Visual Studio的语言是相关的,你这种情况应该是第一次安装的时候安装了英文版的visual studio isolated shell,在卸载的时候你没有卸载这个 ...

  9. 关于SQLSERVER的全文目录跟全文索引的区别

    很久没有写随笔了,本来之前想写一篇关于SQLSERVER全文索引的随笔,可惜没有时间,一直拖到现在才有时间写,不好意思让各位久等了~ 先介绍一下SQLSERVER中的存储类对象,哈哈,先介绍一下概念嘛 ...

  10. Word域介绍文章

    https://www.cnblogs.com/ahuo/archive/2007/05/04/735520.html pageref 书签名 :返回书签所在页码 styleref 标题 1 在当前位 ...