月眸


ActiveMQ学习二:JMS规范和落地产品

毛毛小妖 2019-07-31 168浏览 0条评论
首页/ 正文
分享到: / / / /

这篇文章将从以下几个方面来介绍:

1,JMS是什么?

2,MQ中间件的其他落地产品

3,JMS组成结构和特点

4,JMS的可靠性

5,JMS的点对点总结

6,JMS的发布订阅总结

7、Broker

一、JMS是什么?

JMS全称是java message service,指的是两个应用程序之间进行异步通信的API。它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持java应用程序开发。在javaEE中,当两个应用程序使用JMS进行通信时,他们之间并不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到解耦/异步削峰的效果。

由上图我们可以看出,消息服务由四大部分组成:生产者、消费者、发送的具体消息、JMS服务

二、MQ中间件的其他落地产品

三、JMS组成结构和特点

上面说过,消息的组成部分有四大块:

1、JMS provider

实现JMS接口和规范的消息中间件,也就是我们的MQ服务

2、JMS producer

消息生产者,创建和发送JMS消息的客户端应用

3、JMS consumer

消息消费者,接收和处理JMS消息的客户端应用

4、JSM message

JMS message又分为三大部分,分别是:

4.1,消息头

消息头主要关注一下五个属性:

4.1.1,JMSDestination

消息发送目的地,主要是指queue和topic

4.1.2,JMSDeliveryMode

持久模式和非持久模式,如果设置了这个属性为持久化的,那么当JMS服务器出现故障时,该消息不会消失,他会在服务器恢复之后继续传递。如果设置为非持久化的,意味着服务器出现故障了,消息也会随之消失

4.1.3,JMSExpiration

这个属性可以设置消息的过期时间,默认永不过期

4.1.4,JMSPriority

消息优先级,从0-9共十个级别,0-4是普通消息,5-9是加急消息。JMS不要求严格按照这十个优先级发送消息,但是必须保证加急消息优先于普通消息,默认是4级。

4.1.5,JMSMessageID

消息ID,用来明确标识消息唯一属性

4.2,消息体

封装具体的消息数据,有五种消息格式,发送和接收的消息类型必须一致对应。这五种消息体分别是:

TextMessage,MapMessage,ByteMessage,StreamMessage,ObjectMessage。

4.3,消息属性

如果需要初消息头以外的值,可以使用消息属性,可以用来识别、去重、重点标注等。他们是以key/value形式制定的。比如message.setStringProperty("type","1")

四、JMS可靠性

消息可靠性包括三个方面:

1、持久性

设置为非持久,当服务器宕机,消息丢失:messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT)

设置为持久,当服务器宕机,消息依然存在。队列默认的模式就是持久化:messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT)

2、事务

当设置事务为true时,则签收参数设置自动签收和手动签收都可以;当设置事务为false时,签收参数如果设置为手动签收,则必须要手动acknowledge

3,签收

签收分为自动签收和手动签收,手动签收必须要主动调用acknowledge()方法

五、JMS的点对点总结

点对点模式是基于队列的,生产者发消息到队列,消费者从队列接收消息,队列的存在使得消息的异步传输成为可能。可以想象成发短信的情景。

1、如果session关闭时有部分消息已经受到但还没有签收,那当消费者下次连接到相同的队列时,这些消息还会被再次接收。

2、队列可以长久保存消息,直到消费者收到消息。消费者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势。

六、JMS的发布订阅总结

1、JMS Pub/Sub模式定义了如何向一个内容节点发布和订阅消息,这些节点被称为topic。主题可以被认为是消息的传输介质,发布者发布消息到主题,订阅者从主题订阅消息。主题使得消息订阅者和消息发布者保持相互独立。

2、非持久订阅:非持久订阅只有当客户端处于激活状态,也就是和MQ保持连接状态才能收到发送到某个主题的消息。如果消费者处于离线状态,生产者发布的消息将会被作废,消费者永远不会收到。总结就是:先要订阅注册才能接收到发布,只给订阅者发布消息。

3、持久订阅:客户端首先向MQ注册一个自己的clientID,当这个客户端处于离线时,生产者会为这个id保存所有发送到主题的消息,当客户端再次连接到MQ时,会根据客户端的id得到消息。

4、那平时用持久订阅还是非持久订阅呢?如果消息必须被接收,那就用持久化订阅,当丢失消息能够被容忍,则用非持久订阅。

七、Broker

简单介绍一下Broker,Broker相当于一个MQ服务器实例。说白了,就是用代码形式启动MQ,以便于随时使用随时启动,在用的时候去启动MQ,更节省了资源,也保证了可靠性。代码如下:

package org.producer;

import org.apache.activemq.broker.BrokerService;

public class Broker {

	public static void main(String[] args) throws Exception {
		BrokerService service = new BrokerService();
		service.setUseJmx(true);
		service.addConnector("tcp://localhost:61616");
		service.start();
	}
}

八、脑图分享

我用百度脑图制作了一个知识整理,点击这个链接可以直接查看:http://naotu.baidu.com/file/fb87f54f6e7669071ac570b0ca96191c?token=bda2a5b0efa16d80

最后修改:2019-07-31 17:22:57 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

评论列表

还没有人评论哦~赶快抢占沙发吧~