1. 功能介绍

    后台任务为需要在后台执行的任务,不是前台手工触发,而是通过配置的时间点或定时方式通过JMS方式异步执行任务,主要应用在后台工单,大批量执行数据、定时执行或循环定时执行等,后台任务需要部署单独的timer应用,并且每个应用需要配置JMS供timer调用触发相应的任务,定时工单通过任务注册方式实现,循环定时执行的任务不需要注册,直接在TD_M_PLAN配置即可。

  2. 主要特性

    1. 定时触发需要执行的任务,通过JMS方式异步跨主机调用,这样可以将timer部署在一台服务器,将后台任务的执行和后台任务解耦。
    2. 对于例行任务配置表记录即能支持调用指定的后台任务。
    3. 对于工单任务实时注册,按时执行。
    4. 对于大批量数据处理任务,后台执行能够提供更好的客户易用性,而不用用户提交请求等待响应,任务提交后,只需到任务列表中查看即可。
  3. 开发步骤

    1. 编写任务类,必须继承AppTask,实现execute方法。
    2. 注册后台任务,指定运行时间,通过addBatchTask方法注册,对于例行定时任务,直接配置TD_M_PLAN表即可。
    3. timer应用扫描到当前时间要执行的任务,调用任务类的exeucte执行任务。
  4. 方法说明

    类路径 com.linkage.component.AppTask
    类描述 后台任务执行基类
    方法名称 public String getPageData() throws Exception
    方法描述 获取上下文对象,类似于AppPage中使用
    方法名称 public IData execute(IData param) throws Exception
    方法描述 后台timer会传入参数到param中,执行execute方法,每个后台任务必须实现这个方法
    类路径 com.linkage.appframework.timer.Util
    类描述 后台任务注册工具类
    方法名称 public static void addBatchTask(PageData pd, String connName, IData taskClass, IData taskParam, Date executeTime) throws Exception
    方法描述 注册后台任务,传入上下文对象,需连接的数据库(填null按默认方式获取),任务类路径,任务参数,执行时间
  5. 注意事项

    1. 任务必须要继承AppTask。
    2. 任务不要自己构造PageData,通过getPageData()获取,不要自己控制连接.
    3. 需要配置timer才能后台执行,前台执行时,可以手工通过测试代码测试任务编写是否正确。
  6. 代码片段

    1. 任务注册代码(定时执行的任务不需要注册,直接在td_m_plan表中配置)

      IData taskParam = new DataMap();
      taskParam.put("VIP_ID", "1234565");
      Util.addBatchTask(pd, BaseFactory.CENTER_CONNECTION_NAME, ExamplesTask.class, taskParam, common.getCurrentTime());
      @pd 上下文对象
      @connName 需要指向的连接,为null表示取默认连接
      @taskclass 需要执行的Task类
      @taskparam 需要传递的参数
      @exectime 指定定时执行的时间
      
    2. 任务执行代码

      public class ExampleTask extends AppTask {
      	public IData execute(IData param) throws Exception {
      		//构造上下文对象
      		PageData pd = getPageData();
      		
      		//获取VIP_ID参数,param由配置任务时传入
      		String vip_id = param.getString("VIP_ID");
      		
      		//根据vip_id删除vip资料
      		ExamplesBean bean = new ExamplesBean();
      		bean.deleteVipcust(pd, vip_id);
      		
      		//返回执行编码和执行提示,编码由业务定制、方便查询
      		return makeResult("VIP_TASK_ID_" + vip_id, "流程执行成功");
      	}
      }
      
    3. 测试代码(如果配置了timer则不需要执行)

      IData param = new DataMap();
      param.put("VIP_ID", "1234565");
      ExampleTask task = new ExampleTask ();
      task.execute(param); 
      
    4. 应用配置(web.xml配置JMS相关信息)

      <servlet>
      	<servlet-name>message</servlet-name>
      	<servlet-class>com.linkage.component.util.timer.MessageServlet</servlet-class>
      	<init-param>
      		<param-name>connection-factory-jndi</param-name>
      		<param-value>jms_cf_quickstart_1</param-value>
      	</init-param>
      	<init-param>
      		<param-name>queue-jndi</param-name>
      		<param-value>jms_queue_quickstart_1</param-value>
      	</init-param>
      	<init-param>
      		<param-name>threadpool-size</param-name>
      		<param-value>50</param-value>
      	</init-param>
      	<init-param>
      		<param-name>thread-priority</param-name>
      		<param-value>5</param-value>
      	</init-param>
      	<load-on-startup>1</load-on-startup>
      </servlet>
      

      说明:
      1. jms_cf_quickstart_1表示JMS连接,jms_queue_quickstart_1表示JMS队列名
      2. JMS配置及timerapp需要参看timer定时器配置
    5. 定时配置

      1. 每天定时指定时间执行

        D/9:52:00/2006-6-5
        
      2. 每天定时执行并指定执行次数和执行频率

        D/9:52:00/2006-6-5/3,1
        

        说明:3表示执行三次,1表示一分钟执行一次
      3. 每天定时执行,一分钟执行一次

        可以这样,配48条记录

        D/00:00:00/2006-6-5/59,1
        D/01:00:00/2006-6-5/59,1
        D/02:00:00/2006-6-5/59,1
        ...
        D/23:00:00/2006-6-5/59,1
        
      4. 每周定时执行

        W/9:52:00/2006-6-5/1,3,4,5,6/3,1
        

        说明:1,3,4,5,6表示要执行的星期几
      5. 每月定时执行

        M/9:52:00/2006-6-5/1,17,21:1,2,3/3,1
        

        说明:
        M是每月
        限制在1,17,21号执行
        只有1,2,3月执行
    6. 定时任务表配置

      1. 定时任务表

        TD_M_TASK:(定时任务表)
        TASK_ID		1(任务标识)
        TASK_KIND		1(任务分类)
        TASK_TYPE		0(任务类型)
        CLASS_NAME	com.linkage.sale.timer.HAIN.birthday.VipBirthdaySms
        USE_TAG		1(可用标记)
        EXPIRED_TAG	0(过期标记)
        PARAMS		staffId=SUPERUSR;staffName=超级工号;deptId=36601;deptCode=HNSJ0000;deptName=移动省公司;cityId=HNSJ;cityName=省局;epachyId=0898;epachyName=海南地州;loginEpachyId=0898;provinceId=HAIN
        SUBSYS_CODE	sale(子系统)
        
      2. 定时任务执行计划表

        TD_M_TASK_PLAN:(定时任务执行计划表)
        TASK_ID		1(任务标识)
        PLAN_INDEX	1(计划索引)
        PLAN		D/17:05:00/2009-9-18/18,60
        PARAMS		staffId=SUPERUSR;staffName=超级工号;deptId=36601;deptCode=HNSJ0000;deptName=移动省公司;cityId=HNSJ;cityName=省局;epachyId=0898;epachyName=海南地州;loginEpachyId=0898;provinceId=HAIN
        USE_TAG		1(可用标记)
        EXPIRED_TAG	0(过期标记)
        LAST_EXEC_TIME	2009/9/25 0:05:00(记录最后处理时间,不用填,自动生成)
        LAST_FINISH_TIME	2009/9/25 0:05:00(记录最后完成时间,不用填,自动生成)
        EXCEPTION_TAG	0(异常标记)
        RESULT_CODE	
        RESULT_INFO	
        EXCEPTION_INFO