Java架构之jms基础

JMS,即 Java Message Service(Java消息服务),是一个消息中间件。

假设A和B要沟通,要进行消息的传递,最基础的方式是直接沟通,A发送消息,B接收消息,但是这种方式下A和B之间的耦合太强,导致后期对代码和功能的扩展受限,极其不便,所以我们引入消息中间件的概念。消息中间件作为A和B之间消息沟通的桥梁。

JMS只定义了接口,并没有做出任何实现,实现JMS接口的消息中间件称为 JMS Provider, 市面上JMS Provider有很多,其中ActiveMQ是开源的一款性能优良的JMS Provider,并且是用java实现的。

JMS应用场景:
(1)可靠传输,数据不能丢失,有的时候会要求不能重复传输
(2)异步传输,提高传输效率
JMS的消息主要包括3部分:消息头,消息属性和消息体
应用的时候有两个部分的应用:
(1)JMS Producer:消息生产者,创建和发送消息
(2)JMS Consumer:消息消费者,接收和处理消息
消息的消费方式也分为两种:
(1)同步消费,通过调用消费者的receive方法,会阻塞,一直到消息到达消费者,接收到消息之后才会进行下一步的动作。
(2)异步消费,为消费者注册一个消息监听器,定义消息到达的时候所需要采取的下一步行动。消费者并不需要一直等待。

JMS有两种消息传递模式,点对点模式和发布/订阅模式。
(1)点对点模式:
这里写图片描述

1.一个消息只能有一个消费者,消费过了就没有这个消息了,最常见的是将消息存放在一个Queue(队列)中,供消费者使用,**这里有一个坑需要注意**,一个Queue可以有多个消费者,一个Queue中可以存多条消息,但是一条消息只能对应唯一的一个消费者。
2.消息的生产者和消费者之间没有时间上的相关性,它们都是分别对中间件负责就行,生产者负责将消息发到中间件(到此消费者的任务完成),消费者负责从中间件中取出消息,只要中间件中有消费者所需要的消息,不管什么时候,消费者都可以取用。(可以理解为异步)

(2)发布/订阅模式:
这里写图片描述

(1)每个消息可以有多个消费者,理解成一档广播节目,会有很多听众去订阅,当此节目更新之后,每个听众都会收到提醒。
(2)生产者和消费者有相关性,只有订阅了,才可以接收到消息,美誉订阅是无法及时收到更新通知。

两种不同的模式,消息存储的地方不同,点对点存储在(Queue)队列中,发布/订阅存储在Topic(主题)中。

2018/5/3 更 。。。。。。。。。。。。。。。

以下是在具体的开发过程中,遇到的问题以及解决方案:
背景:
传统的jms架构只有两种消息传递模式,分别是Queue(点对点)和Topic(发布-订阅)。
区别在于,Queue(点对点)被消费之后就没有了,一个消息只能有一个消费者。
Topic(发布-订阅)可以有多个消费者,需要订阅此topic,只有订阅了才能收到后台推送的消息。

详细的解释请参考 ↑

需求 : 在传统的jms架构之上,根据业务需求,我们需要做到以下两点:
(1) 可以被重复消费,消费者只有订阅之后,才能收到推送消息。
(2) 需要固定的只推送给某一个或者某几个用户。
综上,我们最终采用的思路是利用topic,在topic原有的基础之上做改进,加入用户的Id,用作用户身份标识,以下采用topics作为名称,方便描述。

假设我们现在需要后台向app推送消息,普遍采用的做法是利用activeMQ作为消息中间件,java后台消息通过topics 和activeMQ进行通讯, app端和activeMQ采用mqtt方式进行通讯。
需要注意的是:
(1)后台需要主动推送消息给app端,app端只需要订阅该主题就行
(2)app有过滤消息的机制,避免收到垃圾消息浪费资源
(3) 每个app有自己的id,用来标识自己的身份。
待更。

猜你喜欢

转载自blog.csdn.net/hqm12345qw/article/details/79512514