java中基于线程池和反射机制实现定时任务

11 篇文章 0 订阅
5 篇文章 0 订阅

文章标题:java中基于线程池和反射机制实现定时任务

文章地址: http://blog.csdn.net/5iasp/article/details/10949925

作者: javaboy2012
Email:yanek@163.com
qq:    1046011462

 

 

 

直接上代码:

 

主要包括如下实现类:

1. Main类:


任务执行的入口:

调用main方法,开始加载任务配置并执行任务

 

package com.yanek.task;

import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		
		ScheduledExecutorService scheduExec = Executors.newScheduledThreadPool(1); 
		/*
		TaskModel tm=new TaskModel();
		tm.setClassName("com.yanek.task.TaskA");
		tm.setMethodName("testA");
		tm.setInitialDelay(3);
		tm.setPeriod(5);
		*/
		List tasks=XmlReader.getTasks();
		for (int i=0;i<tasks.size();i++)
		{
			TaskModel tm=(TaskModel)tasks.get(i);
			scheduExec.scheduleAtFixedRate(new MyTask(tm),tm.getInitialDelay(), tm.getPeriod(), TimeUnit.SECONDS); 
		}
		
		

	}

}


2. MyTask 类 实现Runnable接口,在main类中调用

 

package com.yanek.task;



import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

public class MyTask implements Runnable {

	private TaskModel taskModel;
	public MyTask() {}
	
	public MyTask(TaskModel tm) {
		this.taskModel = tm;
	}
	  
	public void run() {
	     System.out.println("call at " + (new Date()));
	     try {
				Class<?> classType = Class.forName(taskModel.getClassName());
				Method getMethod = classType.getMethod(taskModel.getMethodName());
				getMethod.invoke(classType);
				
	     } catch (SecurityException e) {
				e.printStackTrace();
		 } catch (IllegalArgumentException e) {
				e.printStackTrace();
		 } catch (ClassNotFoundException e) {
				e.printStackTrace();
		 } catch (NoSuchMethodException e) {
				e.printStackTrace();
		 } catch (IllegalAccessException e) {
				e.printStackTrace();
		 } catch (InvocationTargetException e) {
				e.printStackTrace();
		 }
		
	}

}

 3. TaskModel: 对任务类的封装

 

package com.yanek.task;

public class TaskModel {
	
	
	public String getClassName() {
		return className;
	}
	public void setClassName(String className) {
		this.className = className;
	}
	public String getMethodName() {
		return methodName;
	}
	public void setMethodName(String methodName) {
		this.methodName = methodName;
	}
	public long getInitialDelay() {
		return initialDelay;
	}
	public void setInitialDelay(long initialDelay) {
		this.initialDelay = initialDelay;
	}
	public long getPeriod() {
		return period;
	}
	public void setPeriod(long period) {
		this.period = period;
	}
	private String className;
	private String methodName;
	private long initialDelay;
	private long period;

}


4. XmlReader 任务配置解析类

 

package com.yanek.task;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class XmlReader {


	public static void main(String[] args) {

		XmlReader.getTasks();
	}

	public static List getTasks() {

		List tasks = new ArrayList();
		
		System.out.println("load task config start...");
		
		String path = "/work/TaskManager/conf/taskconfig.xml";
		File file = new File(path);

		if (file.exists() && !file.isDirectory()) {

			try {
				SAXBuilder sx = new SAXBuilder();
				Document doc = sx.build(file);
				Element rootelement = doc.getRootElement();
				
				
					List<Element> childs = rootelement.getChildren();
					for (int i = 0; i < childs.size(); i++) {
						TaskModel tModel = new TaskModel();
						tModel.setClassName(childs.get(i).getChildText("class"));
						System.out.println(childs.get(i).getChildText("class"));
						tModel.setMethodName(childs.get(i).getChildText("method"));
						System.out.println(childs.get(i).getChildText("method"));

						String initialDelay = childs.get(i).getChildText("initialDelay");
						
						tModel.setInitialDelay((Long.valueOf(initialDelay)));
						System.out.println("距离首次运行还差" + initialDelay + "秒!");
						tModel.setPeriod(Integer.valueOf(childs.get(i).getChildText("period")));
						System.out.println(childs.get(i).getChildText("period"));
						tasks.add(tModel);
					
				}
			} catch (NumberFormatException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (JDOMException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		} else {
			System.out.println("file no exist!");

		}
		System.out.println("load task config end !");
		return tasks;

	}

}


5. 配置文件:

 

<?xml version="1.0" encoding="UTF-8"?>
<taskconfig>
    	<task>
    			<class>com.yanek.task.TaskA</class>
	    		<method>testA</method>
	       		<initialDelay>5</initialDelay>
	       		<period>2</period>
    	</task>

    	<task>
    			<class>com.yanek.task.TaskB</class>
	    		<method>testB</method>
	       		<initialDelay>5</initialDelay>
	       		<period>3</period>
    	</task>

		<task>
    			<class>com.yanek.task.TaskC</class>
	    		<method>testC</method>
	       		<initialDelay>5</initialDelay>
	       		<period>3</period>
    	</task>

</taskconfig>


5. 测试任务类:

 

TaskA TaskB TaskC其中定义静态方法 ,这些类的静态方法配置在 xml文件中,被调用。

 

package com.yanek.task;

public class TaskA {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
		System.out.println("task a test");

	}
	
	
	public static void testA()
	{
		
		System.out.println("taska testA method call!");
		
	}

}


 

package com.yanek.task;

public class TaskB {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
		System.out.println("task b test");

	}
	
	public static void testB()
	{
		
		System.out.println("TaskB testB method call!");
		
	}

}


 

package com.yanek.task;

public class TaskC {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
		System.out.println("task c test");

	}
	
	public static void testC()
	{
		
		System.out.println("Taskc testC method call!");
		
	}

}


 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值