文档章节

砖头人:消息通知

caoyongjun
 caoyongjun
发布于 2016/12/12 23:00
字数 850
阅读 36
收藏 0

此次最困难的功能,也找了很多资料最终花了一些时间实现了该功能(文章中的uml时序图是本人第一次画,有误差的地方肯定是有的,希望大家可以指点一二,在此谢过)

 

1.产品需求

从需求中提取了以下几点要完成

添加订阅动作
用户 发布,评论,送花,拍砖 会插入到 订阅表(为了订阅到后期有人评论时收到提醒)
评论内容动作时
用户每次对事件评论后产生信息并插入到消息表(为了订阅者获取某个事件的最后一个消息)
产生消息提醒
每次用户登陆或者其他操作时会触发产生消息队列,每次订阅表中获取订阅的事件最后产生的评论信息,放入消息表里
更新消息已读
每次点击进入详情时更新全部的消息提醒

 

2.设计实现

1.uml功能时序图

以下图是产生订阅事件信息及提醒信息时序图

 

以下图是用户触发从提醒表提取未读消息,放入未读表中,以及更改已读消息状态的时序图

2.数据库设计

主要字段解释 ( 红色部分为以后拓展功能时用到的这次不会用到的字段 )

  • subscription=订阅表:{content_id:“事件Id”,user_id:"用户id"}
  • notify=消息表:{sender_id:"对事件评论的用户id",content_id:”事件Id“}
  • user_notify=用户未读消息队列:{content_id:“事件Id”,user_id:"用户id",read_yn:"读取状态"}

3.重要代码实现部分

1.利用aop的after  每次拍砖,献花,评论后执行 后续的订阅,和生成评论消息动作,

此次使用aop 其实就是为了怕用户在做完主要动作后还要等待后续的动作会影响用户体验

<!-- 通知 -->
<bean id ="xmlHandler" class="com.brickman.aop.XMLAdvice"/>
	
<!-- aop 配置 消息-->
<aop:config>  
   <aop:aspect id="aspectService" ref="xmlHandler">
        	
    <!-- aop 监听拍砖,献花,评论后 执行 后续插入订阅表和生成评论-->
    <aop:pointcut id="remindPoint" expression="execution(* com.brickman.bo.*.insertRecord(..)) || execution(* com.brickman.bo.*.addComment(..))"/>  
            										
     <aop:after method="doAfterInsertRemind"  pointcut-ref="remindPoint"/>  
              
   </aop:aspect>  
</aop:config>  

 

2.每次如果订阅表里已经有了之前事件Id那么就更新订阅表的订阅时间

3.用户在登陆或者其他操作时触发生产未读消息队列

重点时找到notify中生成消息时间大于订阅表中的更新时间,并获取最大的notifyId相关数据

SELECT MAX(b.notify_id) AS notify_id,b.content_id AS content_id
FROM brick_subscription a,brick_notify b
WHERE a.content_id=b.content_id
    AND a.user_id = #{userId}
    AND b.sender_id <![CDATA[<>]]> #{userId}
    AND a.update_time <![CDATA[<]]> b.created_time
GROUP BY b.content_id

4.插入用户提醒队列表时 主要还要判断是否已经有过该事件如果有就不插入,为了避免两次mysql连接直接一次性写在一个sql中

INSERT INTO brick_user_notify ( user_id, content_id, notify_id ) 
  SELECT #{userId},#{contentId},#{notifyId}
  FROM DUAL
  WHERE NOT EXISTS (
    SELECT 1
    FROM brick_user_notify
    WHERE content_id=#{contentId} AND user_id=#{userId} AND notify_id=#{notifyId}
  )

点击进入用户未读消息的事件后,会更新某个事件的所有未读消息为已读

 

 

如果此时此刻,你也在北漂、上漂、广漂、深漂,那这里就是你的新家:www.brickman.cn。
欢迎加入砖头人大家庭,现邀请你体验为你定制开发的“砖头人app”。

© 著作权归作者所有

共有 人打赏支持
caoyongjun
粉丝 3
博文 9
码字总数 3875
作品 0
朝阳
程序员
Ubuntu 17.04 本周结束支持

Ubuntu 17.04 本周结束支持 IMCN 2小时前暂无评论 阅读 38 次 Ubuntu 17.04“Zesty Zapus”的官方支持将于2018年1月13日结束。 就是这个星期。 这个消息意味着,截至1月13日,在服务器、笔记...

IMCN
01/11
0
0
redis.conf中文版(基于2.4)

昨天研究Redis,顺便把配置文件翻译了。这是我学习技术的一种方法。 虽然还没仔细校对和润色,不过意思应该大体不错,特来分享。 求拍砖,让砖头来得更猛烈些吧!凑够砖头就可以回老家盖房子...

Liuxd
2012/06/05
0
25
安卓推送技术手册——使用透传消息的正确姿势

目前的消息推送方式主要有两种:通知和透传。 什么是透传?透传即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业...

illy安智
2015/06/03
9.6K
3
如何让编程产能翻二番?

软件开发过程有一个很自然的比喻:建楼房,要画图纸、搭架构、砌砖头。这个比喻大体说得过去,问题是,这个“砖头”绝非普通的砖头,具有以下特性: 一、每一块都由手工制作; 二、每一块的材...

dellfox
2014/05/08
0
0
网页端用HTTP收消息,怎么做到像TCP一样100%实时?

任何脱离业务的架构设计都是耍流氓。网页端收消息,究竟是推还是拉? 需求缘起 对于在网页端登录的用户A,发送方,也就是消息的来源有几方面: 系统发给A的“系统通知”,可能对实时性要求没...

萌闪电唰唰唰
08/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring加载properties文件的两种方式

在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可,不需要修...

架构师springboot
11分钟前
0
0
分布式事务,原来可以这么玩?

多个数据要同时操作,如何保证数据的完整性,以及一致性? 答 : 事务 ,是常见的做法。 举个栗子: 用户下了一个订单,需要修改 余额表 , 订单 表 , 流水 表 ,于是会有类似的伪代码: st...

微笑向暖wx
13分钟前
0
0
IE6兼容PNG32图片显示PNG8图片

IE6并不是不支持PNG图片,只是不支持半透明通道。 是支持PNG8色表引索全透明的。 以往都是通过滤镜或统统使用PNG8实现兼容。 但是我发现twitter的png图标可以在chrome中显示png32,在IE6显示...

linsk1998
25分钟前
0
0
linux运维需要掌握的基础知识

踏入linux运维工程师这一职业,其实有很多工具技能需要掌握,下面我来给大家一一介绍。 1、shell脚本和另一个脚本语言,shell是运维人员必须具备的,不懂这个连入职都不行,至少也要写出一些...

linuxprobe16
27分钟前
0
0
《netty入门与实战》笔记-03:数据传输载体 ByteBuf 介绍

ByteBuf结构 首先,我们先来了解一下 ByteBuf 的结构 以上就是一个 ByteBuf 的结构图,从上面这幅图可以看到: ByteBuf 是一个字节容器,容器里面的的数据分为三个部分,第一个部分是已经丢弃...

Funcy1122
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部