0.源代码
注:本篇博客知识来自于网课。
1.问题来源以及w
对于一个题库系统。考试组要有批量的离线文档要生成。题库组批量的题目要进行排重,且要根据条件批量修改题目内容。对于
痛点:
- 批量任务完成缓慢
- 所有的问题都围绕着“查询”,即查询进度影响总体性能
- 我们希望尽量使用友好(如果用多线程来提高性能,我们希望能屏蔽细节)
因此我们需要一个可以提供查询进度通用的框架。
2.我们该怎么做?
这里先要明确“任务”(Task)和“工作”(Job)的关系。对于一个工作,他内部可能须有许多的任务,任务是他的子元素(属性、字段)。
- 用并发安全的类确保每个工作的属性和工作下的每个任务信息,也意味着工作和任务的注册机制。
- 需要并发安全的类保存每个任务的处理结果(TaskResult)。
- 需要提供查询接口,供外部的使用。
这里我们不处理对于工作的检查。有兴趣的可以实现。
3.总体流程
这里不按照流程讲解,而是按照类关系从下而上讲解。
4.目录结构
5.TaskResultType
package me.hcFramework.pool.vo;
//这个类只是用来作为标志的信息。
public enum TaskResultType {
SUCCESS, //表示任务成功
FAILSURE, //表示任务失败
EXCEPTION; //表示发生了异常,这里我们不去详尽判断,只用这个标示来笼统表示
}
6.TaskResult
package me.hcFramework.pool.vo;
/**
*
* @param <R> 业务方法处理后的业务结果数据的类型
*
* 对属性使用final修饰是为了使其不可改
*/
public class TaskResult<R> {
//用户业务是否成功完成
private final TaskResultType resultType;
//业务方法处理后的业务结果数据
private final R returnType;
//如果失败,则失败原因
private final String reason;
//针对任务失败的构造方法
public TaskResult(TaskResultType resultType , R returnType , String reason) {
this.resultType = resultType;
this.returnType = returnType;
this.reason = reason;
}
//针对任务成功的构造方法
public TaskResult(TaskResultType resultType , R returnType) {
this.resultType = resultType;
this.returnType = returnType;
this.reason =