基于 Web 的消息订阅/发布系统可以分两部分考虑:一是使用什么工具搭建订阅/发布系统,二是如何进行 Web 前后端交互。
对于前者,业界很多 MQ 产品可以满足需求:RabbitMQ
、ActiveMQ
、ZeroMQ
等,本项目采用 ActiveMQ
。关于 Web 前后端交互,目前最流行的技术是 HTML5 的 WebSocket
,然而项目方要求兼容 IE8,因此只能寻求旧一点的技术,DWR
完全能满足项目的需求。
接下来介绍如何把这两种技术整合进基于 Spring + SpringMVC 的 Java Web 后台。
ActiveMQ 整合
- 引入 jar 包
org.apache.activemq:activemq-spring:5.14.5
; - 由于 Spring 驱动的 ActiveMQ 连接方式无法满足项目特定需求,我手动管理
ActiveMQConnectionFactory
。在 applicationContext-spring.xml 定义 ActiveMQ 的连接工厂:
1 | <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> |
DWR 整合
- 引入 jar 包
org.directwebremoting:dwr:3.0.2-RELEASE
; - 根据官方文档把 DWR 整合进 Spring 和 SpringMVC,在 web.xml 添加 DWR 的 JavaScript 文件路径:
1 | <servlet> |
- 在 applicationContext-spring.xml 添加 DWR 的 Servlet 配置:
1 | <!-- DWR3 --> |
业务需求实现
- 监控 DWR 的 ScriptSession 的生命周期:
1 | package project.dwr; |
- 为每个用户的连接绑定一个 ActiveMQ 的连接,用户离线后关闭连接:
1 | package project.dwr; |
- 前端调用的入口程序,这里前端定义自己的用户名和订阅内容:
1 | package project.dwr.service; |
- 前端入口程序为:
1 | <script src="dwr/engine.js"></script> |
- DWRMessageListener 获取到 MQ 发布的消息后,通过 DWR 的
反向 Ajax
机制通知前端(传递消息并执行前端函数),目前前端控制还没完成,用 console.log 函数替代。
1 | package project.dwr.service; |