java的基本汇合
Posted bk1166
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的基本汇合相关的知识,希望对你有一定的参考价值。
的解决思路是:
首先,给每个渠道定义一个对应的任务,这个任务要完成的就是轮询数据库中所有该渠道的订单并进行处理,使用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的基本汇合的主要内容,如果未能解决你的问题,请参考以下文章
汇合:Hdfs 沉入 avro 格式,但在 hive 中读取 avro 文件时,我的时间比“时区”提前 5:30 小时:“亚洲/加尔各答”