实现预约提醒功能

需求:提醒用户30分钟内即将到期的预约

分析:如果是单纯采用很短时间间隔的轮询来判断并获取30分钟内的有效数据会发出很多不必要的请求,或者不准确的请求。也比较消耗资源。

如果单纯采用服务器推送技术,只能保证在发生推送的时候,能够获取到正确的数据,在不推送(同时增加数条几小时后的数据,则这几小时后的数据,在没有推送的情况下是无法获取的)或者推送前(如用户刚刚登陆时)是获取不到的。

解决方案:  1、用户登陆后进入页面即获取数据,并取得下一次要发送请求获取数据的时间(即数据队列中第一条30分钟以外的数据)。这样的话就避免了不间断的轮询。

2、在没有任何用户新增预约数据时,上面的方法已经可以满足需求了。但是如果有用户新增了数据,这个时候,第1步中获取的下一次发送请求的时间就有可能因为新插入的数据而不准确,所以在可以新增数据的入口,都采用服务器推送(精确推送到指定用户指定页面)让相关用户的页面自动触发第1步。

第1步代码:

1.1 HTML页面

var timeoutFun = null;
function getNextTimeForRequestReserve
{
    $.ajax({
        url : url,
        data : data,
        type : "POST",
        success : function (data)
        {
            var nextTimeForRequestReserve = data.nextTimeForRequestReserve;
            if(nextTimeForRequestReserve && nextTimeForRequestReserve != "null")
            {
                if(timeoutFun)
                {
                    clearTimeout(timeoutFun);
                }
                timeoutFun = setTimeout(function (){getNextTimeForRequestReserve()}, nextTimeForRequestReserve);
            }
        }
    });
}

1.2 Action

nextTimeForRequestReserve = this.reserveBiz.getTimeForNextRequest(queryObj);

1.3 Biz

public Long getTimeForNextRequest(QueryObj queryObj)
{
    Long reuslt = null;
    String timeRange = queryObj.getQueryValue("timerange");
    String nowTime = queryObj.getQueryValue("date");
    Reserve reserve = this.reserveDao.getReserveForCalculateNextReqTime(queryObj);
    if(reserve != null)
    {
        reuslt =  reserve.getRecallDateStart().getTime() - Long.parseLong(nowTime) - 
        1000L * 60L * Long.parseLong(timeRange);
    }
    return reuslt;
}

1.4 Dao

public Reserve getReserveForCalculateNextReqTime(QueryObj queryObj)
{
    //timerange==>30 minutes
    String timeRange = queryObj.getQueryValue("timerange");
    String userId = queryObj.getQueryValue("creater");
    final String sql = "select {trra.*} from " +
    "(select * from reserve_record trr " +
    "where trr.creater = ‘" + userId + "‘ and (recall_result = 0 or recall_result is null) and trunc(trr.recall_date_start, ‘MI‘) > " +
    "trunc(sysdate + interval ‘" + timeRange + "‘ MINUTE, ‘MI‘) order by trr.recall_date_start) trra" +
    " where rownum = 1 ";
    Reserve result = getHibernateTemplate().execute(new HibernateCallback<Reserve>(){
    @SuppressWarnings("unchecked")
        public Reserve doInHibernate(Session session)
        throws HibernateException, SQLException {
            SQLQuery sqlQuery = session.createSQLQuery(sql);
            sqlQuery.addEntity("trra", Reserve.class);
            List<Reserve> resultList = sqlQuery.list();
            if(CollectionUtils.isNotEmpty(resultList))
            {
                return resultList.get(0);
            }
            return null;
        }
    });
    return result;
}

第2步代码:

web.xml中

<servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
        <param-name>activeReverseAjaxEnabled</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>  
    <servlet-name>dwr-invoker</servlet-name>  
    <url-pattern>/dwr/*</url-pattern>  
</servlet-mapping>

类路径下dwr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
  <allow>
    <create creator="new" javascript="SendMessage" scope="application">
      <param name="class" value="com.module.call.action.SendMessage"/>
    </create>
  </allow>
</dwr>
public class SendMessage {
    public void send(String userTag) {
        ScriptBuffer scriptBuffer = new ScriptBuffer();
        scriptBuffer.appendScript("showReserveMessage()");
        WebContext webContext = WebContextFactory.get();
        String page = "/frontPageManage/showFrontPage.action";
        Collection<ScriptSession> scSession = webContext.getScriptSessionsByPage(page);
        for(ScriptSession s : scSession)
        {
            if(userTag.equals(s.getAttribute("userTag")))
            {
                s.addScript(scriptBuffer);
            }
        }
    }
    public void setUserTag(String userTag) {
        ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
        scriptSession.setAttribute("userTag", userTag);
    }
}

需要实现功能的页面

<script type=‘text/javascript‘ src=‘../dwr/engine.js‘> </script>
<script type="text/javascript" src="../dwr/interface/SendMessage.js"> </script>

页面加载完成需要执行

dwr.engine.setActiveReverseAjax(true);
SendMessage.setUserTag(currentUser);

Dwr调用的方法

function showReserveMessage()
{
    getNextTimeForRequestReserve();
}
时间: 2024-10-18 10:29:01

实现预约提醒功能的相关文章

Ios开发中UILocalNotification实现本地通知实现提醒功能

这两天在做一个日程提醒功能,用到了本地通知的功能,记录相关知识如下: 1.本地通知的定义和使用: 本地通知是UILocalNotification的实例,主要有三类属性: scheduled time,时间周期,用来指定iOS系统发送通知的日期和时间: notification type,通知类型,包括警告信息.动作按钮的标题.应用图标上的badge(数字标记)和播放的声音: 自定义数据,本地通知可以包含一个dictionary类型的本地数据. 对本地通知的数量限制,iOS最多允许最近本地通知数

Chrome桌面提醒功能,兼容新老版本,firefox最新版本也通过

Chrome新版升级api,与w3一致,为了兼容,代码如下: //桌面提醒 function notify(title, content) { if(!title && !content){ title = "桌面提醒"; content = "您看到此条信息桌面提醒设置成功"; } var iconUrl = "/images/send_ok.png"; if (window.webkitNotifications) { //c

[转载]TFS发送邮件提醒功能

第一次使用TFS 2010,发现有Project Alerts功能,就是项目组工程中若有任何改动时,TFS Server会自动发邮件提醒.Microsoft提供的配置方法(http://msdn.microsoft.com/en-us/library/ms400808(VS.80).aspx)中不适合TFS 2010,因此,我提供了以下参考方法: 1.安装SMTP Server 首先,在装有TFS 2010的服务中先安装SMTP服务,我使用的是Windows Server 2008,在Serve

iOS开发中UILocalNotification本地通知实现简单的提醒功能

这段时间项目要求做一个类似的闹钟提醒功能,对通知不太熟悉的我,决定先用到xcode自带的本地通知试试,最终成功的实现了功能,特整理分享下. 它的表现特点: app关闭的时候也能接收和显示通知. app处于后台的时候能接收通知也能显示. app处于前台的时候能接收,但不能显示,但是会走应用程序delegate中的方法 具体的创建方法: ->创建一个本地通知对象UILocalNotification ->设置fireDate,AlertBody,AlertAction,soundName,appl

微信上线朋友圈屏蔽提醒功能

你的朋友圈是不是经常被某些人的鸡汤文.装*图充斥着,直接屏蔽不看他的朋友圈也不是良策,现在好了,微信官方上线了朋友圈屏蔽提醒功能,对于朋友圈内发信息过于频繁的用户,,尤其是消息中经常出现美女图片.鸡汤.“卖”等内容,微信官方将会在消息下方出现“若对他的内容不感兴趣,可轻触此处设置权限”的提示. 除了这条提示外,在朋友圈长按用户头像时,会直接出现“设置朋友圈权限”.“举报”.“取消”等选项(苹果和安卓设备的弹出内容略有差异),进一步方便用户随手屏蔽不想看到的内容和用户. 朋友圈屏蔽提醒功能,不仅有

按钮特效-删除按钮必需的提醒功能

————————————————————————— <script type="text/javascript">                        //删除按钮必须的提醒功能            function deleteInfo(){                var confirmDel = false;        //初始为false                //使用弹出框来接受用户是否确定删除                conf

JavaScript 离开页面提醒,在编辑页面常用的关闭提醒功能

在一些页面中,用户在退出前需要提示用户是否已经保存当前页面的内容,以达到防止数据丢失的目的! 我们可以通过 onbeforeunload  事件来实现这个功能 关闭窗口或者按下F5的时候触发"onbeforeunload" 事件 定义和用法 onbeforeunload 事件在即将离开当前页面(刷新或关闭)时触发. 该事件可用于弹出对话框,提示用户是继续浏览页面还是离开当前页面. 对话框默认的提示信息根据不同的浏览器有所不同,标准的信息类似 "确定要离开此页吗?".

jira邮件自动提醒功能配置

1.开启Jelly Runner功能,点击administrator,进入管理员配置界面,依次选择system-advanced-Jelly Runner我们会看到以下英文提示As a security precaution, the Jelly Runner on this installation is currently disabled. To enable Jelly support, please start JIRA with "-Djira.jelly.on=true"

Python实现农历生日提醒功能

前言: 某天突发奇想,想要实现一个农历生日提醒.这个时候有了如下的大概思路: 获取农历   -->    匹配    -->     提醒 发现实现这个需求最主要的在获取农历这一块,后边两个不是什么巨大挑战.遂查阅一番资料,发现数据库可以实现阳历转阴历功能.在数据库这一块,我是在是小菜,看不懂存储过程.蛋疼!直接放弃改用其他思路.思考了许久,想到可以通过爬虫爬取现成的日历信息,存库再进行匹配.所以,现在思路如下: 爬取农历存库   -->    匹配姓名表    -->     提