1.定义任务
/**
* 表示一个任务
*
*/
public interface Task {
/**
* 运行实际的任务内容
*
* @throws Exception
*/
public void runTask() throws Exception;
/**
* 返回Task的信息
* @return
*/
public TaskInfo getTaskInfo();
/**
* 准备参数信息
* @param args
* @throws Exception
*/
void initTaskInfo(String[] args);
}
2.任务信息
/**
* 表示一个任务的信息
*
*/
public class TaskInfo {
private String taskName;
// 参数列表
private Map<String, String> arguments = new HashMap<String, String>();
public TaskInfo() {
}
public TaskInfo(String taskName) {
this.taskName = taskName;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public void addArgument(String argName, String argValue) {
arguments.put(argName, argValue);
}
public String getArgument(String argName) {
return arguments.get(argName);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(taskName);
if (arguments.size() > 0) {
for (Entry<String, String> arg : arguments.entrySet()) {
sb.append('[').append(arg.getKey()).append('=').append(arg.getValue()).append(']');
}
}
return sb.toString();
}
}
3.任务实现support类。
/**
* 任务support
*
*/
public abstract class TaskSupport implements Task {
protected TaskInfo taskInfo;
@Override
public void initTaskInfo(String[] args) {
if (args.length == 0) {
return;
}
taskInfo = new TaskInfo(args[0]);
// 初如化参数列表
for (int i = 1; i < args.length; i++) {
String[] argPair = args[i].split("=");
if (initArg(argPair[0], argPair[1])) {
taskInfo.addArgument(argPair[0], argPair[1]);
} else {
Log.warn("Argument ignored: " + args[i]);
}
}
}
protected boolean initArg(String name, String value) {
return false;
}
@Override
public TaskInfo getTaskInfo() {
return taskInfo;
}
@Override
final public void runTask() throws Exception {
initTask();
try {
doRunTask();
} finally {
afterRunTask();
}
}
/**
* 真正处理task的
*/
abstract protected void doRunTask() throws Exception;
/**
* 用于收尾工作,如资源的释放等等
*/
protected void afterRunTask() throws Exception {
}
/**
* 初始化task中的一些信息
*/
protected void initTask() throws Exception {
}
}
4.任务运行入口
/**
* 所有task的启动类
*
*
*/
public class TaskRunner {
private static final Log log = LogFactory.getLog(TaskRunner.class);
public static void main(String[] args) {
Task task = prepareTask(args);
if (task == null) {
return;
}
try {
log.info("Start running task: " + task.getTaskInfo());
task.runTask();
log.info("Finish running task: " + task.getTaskInfo());
} catch (Exception e) {
log.error("Error running Task: " + task.getTaskInfo(), e);
}
}
public static Task prepareTask(String[] args) {
String[] beanFiles = new String[] { "*.xml", "*.xml","*.xml"};
ApplicationContext context = new ClassPathXmlApplicationContext(beanFiles);
Map<String, Task> tasks = context.getBeansOfType(Task.class);
if (args.length < 1 || !tasks.containsKey(args[0])) {
log.error("No such task: " + args[0]);
log.info(getTaskListStr(tasks));
return null;
}
Task task = tasks.get(args[0]);
task.initTaskInfo(args);
return task;
}
private static String getTaskListStr(Map<String, Task> tasks) {
StringBuilder sb = new StringBuilder("All available tasks: ");
for (String taskName : tasks.keySet()) {
sb.append(taskName).append(',');
}
return sb.toString();
}
}
分享到:
相关推荐
### Java定时任务实现方法:Quartz API 的应用与实践 #### 一、Quartz API简介 Quartz 是一个开源项目,提供了丰富的调度功能,适用于各种Java应用中的定时任务需求。它由Michael Lipton(mwlipton@us.ibm.com)等...
课程设计报告的编写需遵循特定的格式,包括封面、目录、设计任务概述、个人任务描述、程序功能介绍、设计分析、程序结构、模块功能说明、源代码、操作指南、实验结果和设计心得等内容,旨在全面反映设计过程和成果。
JAVA 代码书写规范 JAVA 代码书写规范是软件工程领域的一项重要组成部分,旨在提高程序的可靠性、可读性、可修改性、可维护性和一致性。以下是 JAVA 代码书写规范的详细介绍: 一、目的 JAVA 代码书写规范的...
【Java试验及实验报告书写】 Java语言的学习不仅仅是理论上的研究,更重要的是通过实践来加深理解。实验是检验和巩固编程技能的重要环节。本实验报告主要围绕两个实验展开,分别是Java开发环境J2SE的配置与使用,...
"java for 循环的几种写法" 在 Java 编程语言中,for 循环是一种非常常用的循环语句,用于遍历数组、Collection 等类型的对象。在 J2SE 1.5 中,Java 引入了一种新的 for 循环语法,称为“增强的 for 循环”或...
较高级的断开比较低级的断开更好,新行应与同级上一行的开头对齐。缩进的单位应使用 4 个空格,不使用制表符而尽量使用空格。通常语句使用 8 个空格缩进,就要折行,由于传统的(4 个空格)缩进使观察程序体比较难。...
【Java代码书写规范】 在Java编程中,代码的书写规范是非常重要的,它有助于提高代码的可读性,便于团队协作和后期维护。以下是一些关键的命名规则和书写规范: 1. **命名规则**: - **通用规则**:所有命名应该...
java代码-使用java解决mybatis模糊匹配写法的源代码 ——学习参考资料:仅用于个人学习使用!
关于Java中素数的概念,及Java代码的写法,写了几种方法
关于动态规划求最大子段和的Java代码写法 本文主要讲述了使用 Java 语言实现动态规划算法来求最大子段和的代码写法。动态规划是一种非常重要的算法设计技术,它可以解决许多复杂的问题。 首先,我们需要了解什么是...
Java日历类是Java编程语言中处理日期和时间的核心组件,它提供了丰富的API来操作日期,包括获取、设置、比较和格式化等。在Java中,`java.util.Calendar`是抽象基类,而`java.util.GregorianCalendar`是其最常见的...
北京动力节点-Java编程零基础教程-097-Java基本语法-控制语句-for语句-for语句的其它写法.avi 北京动力节点-Java编程零基础教程-098-Java基本语法-控制语句-while语句-基本语法.avi 北京动力节点-Java编程零基础...
Quartz 是一个强大的开源作业调度框架,用于在 Java 应用程序中实现复杂的时间调度任务。它允许开发者创建、调度和执行周期性任务,而无需直接处理线程或时间触发器。在这个“quartz 实现按天、按周、按月定时任务的...
java JDBC连接不同的数据库写法sql,oracle,mysql 的很好例子
一个java 面向对象字符串写法的判断回文数 假如输入非数字 会提示输入数字 利用循环写的 大家多多支持
Java代码书写规范是编程实践中的一项重要指导原则,它旨在提高代码的可读性、可维护性和团队协作效率。以下是一份详细的Java代码规范总结: 1. **命名规范**: - **项目命名**:项目名应全部为小写单词,具有代表...
以下是两种常见的Java输入输出流的写法及其详细解释: 1. 字节流: - **FileInputStream** 和 **FileOutputStream**:这是处理文件输入输出的基本字节流类。`FileInputStream` 用于从文件读取字节,而 `...
在Java编程中,将图片导出到Word文档是一项常见的任务,尤其在生成报告或文档时。这个简易写法主要是利用Apache POI库来实现的,Apache POI是一个强大的API,用于处理Microsoft Office格式的文件,如Word(.doc/....
在Java编程中,配置文件是用于存储应用程序的配置信息,如数据库连接参数,这使得代码与配置分离,便于管理和维护。下面将详细讲解如何在Java中编写配置文件以实现数据库连接。 1. 配置文件格式 最常见的配置文件...