使用dwr实现消息后台消息推送功能
大多数网站都有站内信,未读消息,今日要闻等消息的推送功能,就拿本站来说打开今日第一次csdn首页,立马会在右下角出现一个弹出窗口,就是下图这样的,你一定见过的:
很多无良网站都会有各种各样的浮动层,飘来飘去的很烦人,一不小心点到了,弹出令人更烦的无良广告。csdn当然不是无良网站,尽管有弹出层,但没有乱飞,并且也不是以广告为目的的,这样大家伙就不会抵制和排斥了。作为一个web开发者,我曾经略微思考过,如何实现这种功能呢?什么触发事件,如何响应的呢?正好用户要求加这么一个消息提醒功能,就借此深入研究了一下。
至于消息推送的功能,网上给的建议是使用dwr的消息推送,由于平时我们所做的操作都是基于请求--》处理--》响应模式的,那么没有请求直接响应可以吗?http协议似乎对此支持的并不好。我们常见的消息推送,短信、聊天工具、邮件,这些都是需要服务器来支持的,那么在javaEE web开发中,能不能实现无请求的消息推送呢?
遍差网上资料,发现有几个方案可以支持:1,dwr3实现;2,comet4j实现。这两个技术之前都没怎么接触过,如何选择呢?dwr技术毕竟更为成熟,网上的资料更多,可行性更强些。毕竟身边的人会的不多,客户那边要求挺紧,必须兼顾到各种情况。
客户要求是:当后台发布了一篇内容(报道、公告、新闻通知或其他)之后,前台已登录的用户在首页上可以看到消息提醒。
那么我就把问题分成几步来解决:
1,后台发布消息的时候要做登记,不能直接广播,要指定推送目标,那么就要做一个内容和接收人的对应关系,后台发布内容时作登记。
2,用户进入首页的时候,检测是否存在符合推送条件(有文章且允许)。
3,查出所有用户的未读信息列表,弹出提醒窗口。
4,用户点击某条信息后,把状态为设为已读。
这么几个步骤,就可以解决问题了。
首先说第一步:这一步似乎是最简单的,但却是最不容易思考的地方,由于项目本身对用户的管理师通过组来实现,在发布内容的时候也是列出的所有的组供用户选择,让用户勾选。我们可以在这个时候“趁火打劫”,在存数组的时候,不妨把数组里面的用户也一一取到,放入我们的操作表中,操作表结构如下:
仅有两列,一列是内容id,一列是user_id,本想再弄一个标志位,后台觉得用户把信息读取一条信息之后就可以把本表中的直接删除了,留着也没有实际意义。
后台代码(hibernate实现):
如果点击不在提醒,那么用户表中的标志位就起了作用,这里没有设解锁功能,一段设置了不再提醒,想恢复就需要修改数据库。这是功能不够完善,用户暂时没提这个功能,也就乐得不改动。
后台发布的时候:
红框是可接收的会员组选择,绿框表示本次发表是否作为提醒的消息,有了这两个参数,操作起来就变得灵活多了。
如果未读消息过多,那么弹出层右下角会出现“查看所有未读消息”,这样就能看全了。
总结:本方案并没有彻底实现消息推送功能,依然是前台刷新,后台响应这种模式,消息的推送不是即时的。但考虑到用户最常去的页面就是首页,session超时也设为10分钟,本项目发布的消息也不是十分紧急,考虑上述情况,无需采用即时推送,如果用户经常在线,那么最多延迟十分钟,如果用户不经常在线,即时推送也没有意义。
本方案并没有完全发挥dwr消息推送的优势,这样的推送形式ajax似乎也办得到,效率未必比它差,有时间可以换一种形式来实现。