标签:运行 校验 定义 而且 声明 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中的所有任务结果,如果发现没有再规定时间内完成的则结束它们。这样我们就免去了把渠道---任务---执行结果对应起来的大麻烦。
接下来撸代码的时候遇到这样一个问题,我首先定义了任务池
标签:运行 校验 定义 而且 声明 call 无限 处理 isp
原文地址:https://www.cnblogs.com/bk1166/p/13156034.html