02.JMS基础
1.面向消息的中间件(MOM)

- 降低系统间通信复杂度:有了MOM,系统间的通信,不用考虑系统是什么语言开发的,也不用考虑复杂的网络编程,各个系统只需要关心自身和MOM之间如何进行消息的接受和发送即可,这些操作通过简单的API就可以完成。
- 提高了消息的灵活性:系统A通过MOM向系统B发送消息,消息可以存储在MOM中,并由MOM转发。即使是系统B不在线,MOM会持有这个消息,直到系统B连接并处理消息。这就是说,系统A发完消息后,就可以执行其它操作,而不必阻塞等待,尤其是对那些时间无关或者并行处理的操作,非常适用。
- 松散耦合:有了MOM的存在,对于系统B而言,只要发送的消息没有变化,就不必考虑系统A的变化。A系统的代码改变,不会影响到B系统,反之亦然。
2.JMS基本概念
- JMS Client,java语言编写的客户端,用于发送和接受消息。
- Non-JMS Client,使用消息系统本地API编写的客户端,而不是使用JMS API。
- Message,消息,被定义,用于在不同的客户端之间交换。
- JMS Provider,JMS提供商,是消息系统(比如ActiveMQ),当然,即可以支持JMS,也可以同时支持Non-JMS。
- Administered Objects,被管理的对象,预置的JMS对象,为客户端使用。
- soap描述的是xml格式的数据格式。关注于rpc,与wsdl组成一个体系。
- jms描述更通用的消息。
- 或者可以说soap专注于远程服务调用,jms专注于信息交换。
- soap是两个点的连接系统,jms是3个点。
- 一般来说,web service是同步的,jms是异步或同步的。
- rpc是remote process call,rmi是一种rpc,rpc本身没有规范,只要是实现了远程调用的,都是rpc。比如rmi .net-remoting ws/soap/rest hessian xmlrpc thrift potocolbuffer 等等。
- rpc有一个通用的结构,就是serialization/deserialization+stub+skeleton
- 这么说rpc是一种远程调用设计思维,强调的是透明的调用远程的方法,看起来就跟本地调用是一样的
- rpc强调的是透明的远程方法调用,而jms强调的是通用的信息交流。
3.JMS的消息模型
- 点对点模型(Point to Point,P2P)
- 发布者/订阅者模型(publish/subscribe, pub/sub)

- 只有一个消费者:每条消息只有一个消费者,如果这条消息被消费,那么其它消费者不能接受到此消息。
- 时间无关性:消息的消费和时间无关,只要消息被发送了,在消息过期之前,如果没有其他消费者消费了这个消息,那么客户端可以在任何时候来消费这条消息。
- 消费者必须确认:消费者收到消息之后,必须向Message Provider确认,否则会被认为消息没有被消费,仍然可以被其他消费者消费。可以设置自动确认。这个特点其实也是保证一条消息只能由一个消费者来消费。
- 非持久化的消息只发一次:非持久化的消息,可能会丢失,因为消息会过期,另外Message Provider可能宕机。
- 持久化的消息严格发一次:消息可以被持久化,比如持久化在文件系统或者数据库中,这样可以避免Message Provider的异常或者其它异常导致消息丢失。
- 每条消息可以有多个订阅者
- 订阅者只能消费它们订阅topic之后的消息
- 非持久化订阅,订阅者必须保持为活动状态才能使用这些消息,如果一个订阅者A断开了10分钟,那么A就会收不到这10分钟内的消息。
- 持久化订阅,Message Provider会保存这些消息,即使订阅者因为网络原因断开了,再重新连接以后,能让消费这些消息。
- 是否使用持久化订阅,需要根据业务场景判断。
4.队列和主题

- 初始化ConnetionFactory
- ConnetionFactory创建Connection
- Connection创建Session
- Session创建Destination(包括Queue 和 Topic两种)
- 发:Session创建消息生产者MessageProducer(收:Session创建消息消费者MessageConsumer)
- Seesion创建Message,(发:)MessageProducer发送到Destination,(收:)MessageConsumer从Destination接受消息。

//Queue,队列Destination destination = session.createQueue(subject);//Topic,主题Destination destination = session.createTopic(subject);
5.通过ActiveMQ收发消息
public static void main(String[] args) throws Exception{String user = ActiveMQConnection.DEFAULT_USER;String password = ActiveMQConnection.DEFAULT_PASSWORD;String url = "tcp://localhost:61616";String subject = "TOOL.DEFAULT";// 1. 初始化连接工厂ConnectionFactory contectionFactory = new ActiveMQConnectionFactory(user, password, url);// 2. 创建连接Connection connection = contectionFactory.createConnection();connection.start();// 3.创建会话Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);// 4. 打开队列Destination destination = session.createQueue(subject);// 5. MessageProducer负责发送消息MessageProducer producer = session.createProducer(destination);TextMessage message = session.createTextMessage();for (int i = 0; i < 100; i++){String tmp = "测试消息:" + i;message.setStringProperty("Test", tmp);// 6. 发送消息producer.send(message);System.out.println("发送消息: " + tmp);// 只有commit之后,消息才会进入队列session.commit();}// 7. 关闭会话和连接session.close();connection.close();System.out.println("OK!!");}
public static void main(String[] args) throws Exception{String user = ActiveMQConnection.DEFAULT_USER;String password = ActiveMQConnection.DEFAULT_PASSWORD;String url = "tcp://localhost:61616";String subject = "TOOL.DEFAULT";ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);Connection connection = connectionFactory.createConnection();connection.start();final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);Destination destination = session.createQueue(subject);// MessageConsumer负责接受消息MessageConsumer consumer = session.createConsumer(destination);consumer.setMessageListener(new MessageListener(){public void onMessage(Message msg){try{String str = msg.getStringProperty("Test");System.out.println("收到消息:" + str);session.commit();}catch (JMSException e){e.printStackTrace();}}});Thread.sleep(1000 * 5);session.close();connection.close();System.out.println("OK!");}
public static void main(String[] args) throws Exception{String user = ActiveMQConnection.DEFAULT_USER;String password = ActiveMQConnection.DEFAULT_PASSWORD;String url = "tcp://localhost:61616";String subject = "MQ.TOPIC";// 1. 初始化连接工厂ConnectionFactory contectionFactory = new ActiveMQConnectionFactory(user, password, url);// 2. 创建连接Connection connection = contectionFactory.createConnection();connection.start();// 3.创建会话Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);// 4. 创建要发布的主题,和Queue的区别就在此Destination destination = session.createTopic(subject);// 5. MessageProducer负责发送消息MessageProducer producer = session.createProducer(destination);TextMessage message = session.createTextMessage();for (int i = 0; i < 10; i++){String tmp = "测试消息TOPIC:" + i;message.setStringProperty("Test", tmp);// 6. 发送消息producer.send(message);System.out.println("发送消息: " + tmp);// 只有commit之后,消息才会进入队列session.commit();}// 7. 关闭会话和连接session.close();connection.close();System.out.println("OK!");}
public static void main(String[] args) throws Exception{String user = ActiveMQConnection.DEFAULT_USER;String password = ActiveMQConnection.DEFAULT_PASSWORD;String url = "tcp://localhost:61616";String subject = "MQ.TOPIC";ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);Connection connection;connection = connectionFactory.createConnection();connection.start();final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);Topic topic = session.createTopic(subject);// MessageConsumer负责接受消息MessageConsumer consumer = session.createConsumer(topic);consumer.setMessageListener(new MessageListener(){public void onMessage(Message msg){try{String str = msg.getStringProperty("Test");System.out.println("订阅者---SecondSubscriber---收到消息:" + str);session.commit();}catch (JMSException e){e.printStackTrace();}}});Thread.sleep(1000 * 50);session.close();connection.close();System.out.println("OK!");}
02.JMS基础的更多相关文章
- php从入门到放弃系列-02.php基础语法
php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...
- 数据分析02 /pandas基础
数据分析02 /pandas基础 目录 数据分析02 /pandas基础 1. pandas简介 2. Series 3. DataFrame 4. 总结: 1. pandas简介 numpy能够帮助 ...
- 极简python教程02:基础变量,删繁就简
python极简教程已经开赛,如果错过说明可以回翻: 极简python教程:赛前说明 借这个机会,我再讲讲我的教程和其他网上的教程的区别: 1 我分享的内容,是我在工作中会高频使用的语法,是精华内容 ...
- JMS基础(2)
1. JMS基本概念 JMS(Java Message Service) ,即Java消息服务.JMS是SUN提出的旨在统一各种消息中间件(MOM)系统接口的规范.它提供标准的产生.发送.接收消息的 ...
- JMS基础(1)
1. 消息中间件: 将信息以消息的形式,从一个应用程序传送到另一个或多个应用程序. 主要特点: (1) 消息异步接收: 消息发送者不需要等待消息接收者的响应 (2) 消息可靠接收: 确保消息在中间件 ...
- 了不起的分支和循环02 - 零基础入门学习Python008
了不起的分支和循环02 让编程改变世界 Change the world by program 上节课,小甲鱼教大家如何正确的打飞机,其要点就是:判断和循环,判断就是该是不该做某事,循环就是持续做某事 ...
- JMS 基础
1. JMS基本概念 JMS(Java Message Service) 即Java消息服务.它提供标准的产生.发送.接收消息的接口简化企业应用的开发. 它支持两种消息通信模型:点到点(point-t ...
- JMS基础篇(二)
简介 异构集成是消息发挥作用的一个领域,大型公司内部可能会遇到很多的平台,Java,.net或者公司自己的平台等. 传送消息还应该支持异步机制,以提高系统整体的性能.异步传输一条消息意味着,发送者不必 ...
- JMS基础篇
首先我们需要下载 ActiveMQ:http://activemq.apache.org/. 启动 ActiveMQ 服务:解包下载的 ActiveMQ >进去其bin 目录>双击 act ...
随机推荐
- 【转】Spring 的下载、安装和使用
一.下载 Spring 下载地址:http://repo.spring.io/libs-release-local/org/springframework/spring/4.0.6.RELEASE/ ...
- FFmpeg在Android上的移植优化步骤
http://blog.csdn.net/feixiang_john/article/details/7894188 从事多媒体软件开发的人几乎没有不知道FFmpeg的,很多视频播放器都是基于FFmp ...
- apache -- 端口被占用
需求不断变更,总会安装不同的软件,这些软件理想情况下会使用不同的端口,但还是有软件之间端口被占的情况. 最近在电脑上装了一个VMware虚拟机软件,结果导致开启本机的Apache服务无法启动,报 “T ...
- 转载:mysql 操作总结 INSERT和REPLACE
转自:http://www.jb51.net/article/19411.htm 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做 ...
- JavaScript-事件冒泡简介及应用
一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事 ...
- C++ string(转)
C++中string是标准库中一种容器,相当于保存元素类型为char的vector容器(自己理解),这个类提供了相当丰富的函数来完成对字符串操作,以及与C风格字符串之间转换,下面是对string一些总 ...
- Linux jstack分析cpu占用100%
背景: 运行测试程序后,top命令发现某个进程(pid)占用cpu达到100%. 查看哪个线程占用最多资源: ps mp pid -o THREAD,tid,命令查看这个进程下面的所有线程占用情况 ...
- Unity的Asset Store商店下载文件路径
如果之前在Asset Store商店下载过资源包,结果下次用的时候找不到了,不用急,其实Unity把它自动保到下面这个目录了,最后一个文件夹名与版本号有关,找到前面的即可. C:\Users\Admi ...
- OpenCV学习:改变图像的对比度和亮度
本实例演示简单地改变图像的对比度和亮度,使用了如下线性变换来实现像素值的遍历操作: The parameters α > 0 and β often called the gain and bi ...
- PHPCMS v9设置文章的审核功能
对于新建的站点,如果想设置会员发布的文章必须通过审核后才能发布,则需要以下几步来完成: 1.根据需要自定义管理员角色或选择已有角色. 步骤:设置->管理员设置->角色管理->权限设置 ...