java后台系统实现动态新闻列表实时更新

1.首先我们有了这样一个需求:实现网站的动态数据更新,前台滚动刷新.

一个人说:我们可以再前台设置ajax定时发起请求,动态请求数据,并刷新页面.

分析:功能实现,技术简单
缺点:倘若系统的使用量较大,每个用户长时间驻留页面都会发起大量的后台请求,并查询数据库,数据库压力增大

这也是一种实现方法,虽然实现了功能但是并不适合大数据量的网站.

其实我们仔细分析一下,我们只是需要所有用户展示动态数据,那么有什么是所有用户都可以共享的尼?对,恭喜你想到了,application域.我们只要每个一定的时间就将最新的数据取出,比如10条数据取出,放到application域中,然后后台每次请求application 域中的数据即可.这样每个用户请求都不会穿透数据库.

这里写图片描述
说干就干

假设系统是spring系统,那么我们如何执行定时任务尼
三种方案:
jdk的timertask,
spring的定时任务,
quartz的定时任务调度

这里采用第二种:实现简单,定时实现:
开启定时注解:

 <task:annotation-driven  />
 或者设定线程池大小
 <task:scheduler id="excutor" pool-size="3"/>

定时方法实现简单,但是难点我们如何定时对象中获取spring容器对象和web的application域对象
好了不卖关子了,
spring容器对象获取可以继承ApplicationObjectSupport对象,并将该类交给spring管理自然可以获取spring对象

而获取application对象可以继承WebApplicationObjectSupport,获取

具体代码:


/**
 * @author ll
 *该类用于保存WebApplicationContext
 */
@Component
public class WebContext extends WebApplicationObjectSupport {
    public WebApplicationContext getWebApp(){
        return this.getWebApplicationContext();
    }
}

定时任务实现:





/**
 * @author ll
 *定时操作类
 */
@Lazy(false)
@Component
@EnableScheduling
public class EcrTimerTask extends ApplicationObjectSupport implements SchedulingConfigurer{
    private static String refrsh_cron;
    static{
        PropertiesUtils.init("config/deploy.properties");
        refrsh_cron=PropertiesUtils.getValue(Constants.TIMER_REFRESH__CONTRACT).toString();
    }


    public void refreshListCon(){
         ApplicationContext springApp = this.getApplicationContext();
         WebApplicationContext webApp = springApp.getBean(WebContext.class).getWebApp();
         SingedLogic singedLogic= springApp.getBean(SingedLogic.class);
         List<ConstractListVo> vos = singedLogic.queryActualContract();
         //放置到application域里
         webApp.getServletContext().setAttribute(Constants.CONTRACT_LIST_KEY,vos);
    }
    @Override
    public void configureTasks(ScheduledTaskRegistrar register) {
        /**
         * 定时刷新实时动态数据
         */
    register.addTriggerTask(new Runnable() {

            @Override
            public void run() {
                refreshListCon();
            }
        }, new Trigger() {

            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                CronTrigger trigger=new CronTrigger(refrsh_cron);
                Date nextExec=trigger.nextExecutionTime(triggerContext);
                System.out.println("执行了刷新缓存");
                return nextExec;
            }
        });

    }

}

注意:定时任务不要简单的使用注解实现,我们大部分的需求实现是将定时执行频率写在配置文件中,然后动态配置

TIMER_REFRESH=0/5 * * * * ?

cron表达式可以自行百度

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值