消息中间件
- 消息中间件 MOM(Message Oriented Middleware)是在分布式环境中,两个或多个独立运行的系统之间,提供消息通讯作用的中介
- 作用:把分布式应用中的各个子系统之间服务的调用以消息通讯的方式交互
- 应用场景:存在并发访问的业务(请求排队,流量削峰);耗时比较久的业务(异步处理);需要解耦的业务(应用解耦);海量数据同步(日志);任务调度;分布式事务
JMS
- JMS 即 Java 消息服务(Java Message Service),Java 访问消息中间件的一组应用程序接口,提供消息的创建、发送、接收、读取等一系列服务
- JMS Provider:实现 JMS 接口和规范的消息中间件
- JMS Producer:消息生产者,创建和发送 JMS 消息的客户端应用
- JMS Consumer:消息消费者,接收和处理 JMS 消息的客户端应用
- JMS Message:JMS 消息
- JMS 支持的消息类型包括:简单文本(TextMessage)、可序列化的对象(ObjectMessage )、键值对(MapMessage)、字节流(BytesMessage)、流(StreamMessage),以及无有效负载的消息(Message)等
- JMS Destination:消息目的地,包含 queue 和 topic
- JMS Domain:消息传递域,JMS 规范中定义了两种消息传递域,分别是点对点和发布/订阅消息传递域:
- 点对点(Point-to-Point,简写 PTP 或 P2P)消息传递域,该消息传递域发送的消息目的地称为队列(queue)
- 每个消息只能有一个消费者:当消息的生产者发送一条消息到队列之后,只有注册到同一个消息队列中一个消息消费者会接收到该消息
- 消息的生产者和消费者之间没有时间上的相关性,无论消息消费者在提取消息的时候,消息生产者是否处于运行状态,消息消费者还是可以提取消息
- 发布/订阅(Publish/Subscribe,简写 Pub/Sub)消息传递域,该消息传递域发送的消息目的地称为主题(topic)
- 每个消息可以有多个消费者:消息的发布者需将消息投递给 topic 后,所有订阅了该 topic 的消息订阅者都会接收到该消息
- 生产者和消费者之间有时间上的相关性,订阅一个主题的消费者只能接收自它订阅之后发布的消息
- 点对点(Point-to-Point,简写 PTP 或 P2P)消息传递域,该消息传递域发送的消息目的地称为队列(queue)
- JMS Session:与 JMS Provider 所建立的会话,可设置是否开启事务,消息消费确认模式
ActiveMQ
- 采用 Java 语言编写的完全基于 JMS1.1 规范的面向消息的中间件
- 运行:bin 目录下的 activemq.bat
-
- 设置 ActiveMQ 的消息监听端口,默认为 61616
- 设置 ActiveMQ 的 web 管理界面的端口,默认为 8161。ActiveMQ 使用的是内嵌的 jetty 服务器来运行它提供的管理界面的,该管理界面的访问地址为 localhost:8161
session 事务
- 消息生产者如果设置了事务,那么需要提交事务才会发送消息,如果没有设置事务,则自动发送消息
- 消息消费者如果设置了事务,那么需要提交事务才能确认消息,如果事务回滚,那么消息会再次传送
-
- 如果 session 开启事务,那么消息确认模式只能是 ,就算设置其它模式也会被忽略
- 如果 session 不开启事务,那么消息确认模式有以下三种:
Session.AUTO_ACKNOWLEDGE
表示 Session 会自动确认所接收到的消息- 表示由客户端调用消息的 acknowledge() 方法来确认所收到的消息
Session.DUPS_OK_ACKNOWLEDGE
使得 Session 将“懒惰”地确认消息,即不会立即确认消息,这样有可能导致消息重复投递。在第二次重新传递消息的时候,消息头的 JmsDelivered 会被置为 true 标示当前消息已经传送过一次,客户端需要进行消息的重复处理控制
- 如果 session 开启事务,那么消息确认模式只能是 ,就算设置其它模式也会被忽略
消息传送模式
- 默认使用持久化消息 ,特点:发送的消息会持久化到磁盘,消息不会丢失
- 非持久化消息
DeliveryMode.NON_PERSISTENT
,特点:发送的消息只存在内存
-
- 使用 receive() 方法,只能收到一条消息
- 使用 MessageListener,监听消息中心是否还有消息,如果有的话,实时通知消息消费者获取消息