码迷,mamicode.com
首页 > 编程语言 > 详细

java的基本汇合

时间:2020-06-18 11:16:34      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:运行   校验   定义   而且   声明   call   无限   处理   isp   

的解决思路是:

首先,给每个渠道定义一个对应的任务,这个任务要完成的就是轮询数据库中所有该渠道的订单并进行处理,使用Map作为渠道的任务池。有了任务,还得让它跑起来呀,而且还不能让它无限制的运行,所以考虑用Future<Boolean>来给每一个任务定时,所以把前面的梳理一下,我们要把每个渠道的任务,以及每个任务的一次执行对应起来(读者可以先想想你们会用到什么数据结构来把这三者存储起来)。

但我们总共有十个任务呢,如果让它们各自运行那岂不是像一盘散沙吗,所以我们还需要一个任务调度器,这个任务调度器负责把不同的渠道对应的任务添加进任务池,然后轮询任务池,并执行任务池中的任务,同时还要把每个任务的每次执行存储起来,方便我们对它们进行监测,防止有任务无限执行下去。

最后,我们的十个任务也不需要时刻运行,每十分钟触发一次。所以我们还需要一个任务触发器,每十分钟启动一次任务。

 

好了,思路终于理清了,再来进行具体的设计

1.先设计数据结构,用一个嵌套的Map来把渠道---任务---执行结果对应起来

Map<String, Map<? extends Callable<Boolean>,Future<Boolean>>>

2.给每一个渠道定义一个Task,实现Callable<Boolean>接口,完成向对应渠道发起校验以及过期检测的任务;

3.写一个TaskDispatcher类(正确的设计方式其实是定义一个接口,里面添加流程中涉及到的方法声明,然后让这个类实现这个接口),在里面实现添加如下几个方法:

这个方法用来向任务池中添加渠道对应的任务

/执行对应渠道的任务,并获取任务执行的Future<Boolean>存储起来

pollTasks(){} //轮询任务池中的所有任务,并执行它们

4.写一个任务触发器,每十分钟启动一次所有任务。

ps:写到这里我突然想到,如果我们不需要关心任务执行的结果,只需要知道它有没有在规定的时间执行完,我们完全可以把把任务结果独立拉出来放在一个List中,然后另起一个任务轮询List中的所有任务结果,如果发现没有再规定时间内完成的则结束它们。这样我们就免去了把渠道---任务---执行结果对应起来的大麻烦。

 

接下来撸代码的时候遇到这样一个问题,我首先定义了任务池

java的基本汇合

标签:运行   校验   定义   而且   声明   call   无限   处理   isp   

原文地址:https://www.cnblogs.com/bk1166/p/13156034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!