JMS
JMS(Java Message Service即JAVA消息服务)是一组jAVA应用程序接口,提供消息的创建、发送、接收、读取等服务;
JMS定义了一组公共应用程序接口和相应的语法,类似于JAVA数据库的统一访问接口JDBC,它是一种与厂商无关的API,使JAVA程序能与不同厂商的消息组件很好的通信;
JMS优势
异步:JMS天生就是异步的,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端
可靠:JMS保证消息只会递送一次。大家都遇到过重复创建消息问题,而JMS能帮你避免该问题,只是避免而不是杜绝,所以在一些糟糕的环境下还是有可能会出现重复
JMS消息传递模型
- 点对点(PTP)
- 发布/订阅(publish/subscribe)
点对点消息传送模型(P2P)
在点对点消息传送模型中,应用程序由消息队列,发送者,接收者组成。每一个消息发送给一个特殊的消息队列,该队列保存了所有发送给它的消息(除了被接收者消费掉的和过期的消息)
点对点消息模型有如下特性:
- 每个消息只有一个接受者;
- 消息发送者和消息接受者并没有时间依赖性;
- 当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息;
- 当接收者收到消息的时候,会发送确认收到通知(acknowledgement);
点对点消息模型图:
发布/订阅消息传送模型
在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端。在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅topic。topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端
发布/订阅消息模型有如下特性:
- 一个消息可以传递给多个订阅者;
- 发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息;
- 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息;
发布/订阅消息模型图:
JMS模块
- 管理对象(Administered objects)-连接工厂(Connection Factories)和目的地(Destination)
- 连接对象(Connections)
- 会话(Sessions)
- 消息生产者(Message Producers)
- 消息消费者(Message Consumers)
- 消息监听者(Message Listeners)
JMS消息结构
- 消息头
- 消息属性
- 消息体
JMS消息类型
- TextMessage
- MapMessage
- BytesMessage
- StreamMessage
- ObjectMessage
JMS消息接收方式
- 同步方式:使用同步方式接收消息的话,消息订阅者调用receive()方法。在receive()中,消息未到达或在到达指定时间之前,方法会阻塞,直到消息可用
- 异步方式:使用异步方式接收消息的话,消息订阅者需注册一个消息监听者,类似于事件监听器,只要消息到达,JMS服务提供者会通过调用监听器的onMessage()递送消息
开源的消息系统
- ActiveMQ
- Kafka
- RabbitMQ
- memchcheQ