BSTEK Development Framework2(BDF2) : 4.BDF2-JOB

      BDF2中的JOB是指在应用服务端定义一些可以周期性执行的动作,这就是JOB。BDF2中的JOB是在扩展QUARTZ的基础之上实现,但在编写及管理JOB时并不需要我们具备QUARTZ的相关知识,BDF2-JOB模块提供了完备的JOB编写、配置及运行控制功能,可最大限度降低JOB编写、配置及管理的复杂度。

      要使用BDF2-JOB模块,如果您采用的是Dynamic Web Project这种传统类型的Web应用项目,那就比较费劲了,我们需要自己到http://nexus.bsdn.org上找到BDF2-JOB模块需要jar,再下载相关依赖的jar,再放置到我们的Dynamic Web Project类型的项目当中;或者您可以到我们提供的在线项目创建向导当中,选择项目类型为Dynamic Web Project,再勾选我们需要的BDF2-JOB模块,最后点击下载,这样创建的项目中既包含BDF2-JOB模块的jar也包含这个模块在运行是所需要的第三方jar。但如果您是采用Maven来管理我们的项目,那么添加BDF2-JOB模块就非常简单,我们需要做的就是打开pom.xml文件,在其中添加下面的dependency。

BDF2-JOB模块的dependency
<dependency>
  <groupId>com.bstek.bdf2</groupId>
  <artifactId>bdf2-job</artifactId>
  <version>2.0.0</version>
</dependency>

      当前是2.0.0版本,后续随着功能的增加,版本号应该就会大于2.0.0。

      项目配置好之后,接下就可以在eclipse中运行项目,启动项目时,可以看到在控制台会出现下面的异常:

Job模块运行时抛出的异常
Caused by: java.lang.RuntimeException: Job module need a [com.bstek.bdf2.job.service.IJobDataService] interface implementation
	at com.bstek.bdf2.job.view.calendar.CalendarMaintain.afterPropertiesSet(CalendarMaintain.java:102)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
	... 23 more

      从异常的提示消息可以看出,使用BDF2-JOB模块,我们需要编写一个com.bstek.bdf2.job.service.IJobDataService接口的实现类,并将其配置到Spring当中,这个接口类的源码如下:

IJobDataService接口源码
package com.bstek.bdf2.job.service;
import java.util.List;
import com.bstek.bdf2.job.model.JobDefinition;
/**
 * @author Jacky.gao
 * @since 2013-3-10
 */
public interface IJobDataService {
	String getCompanyId();
	List<JobDefinition> filterJobs(List<JobDefinition> jobs);
}

      可以看到这个接口有两个方法:第一个getCompanyId方法需要我们返回当前采用的公司ID,同样这个是为基于SAAS模式的应用服务的,如果您的应用采用的是非SAAS模式,那么在这个方法里返回一个固定的字符串即可;第二个方法是filterJobs,它的作用是根据系统信息对当前要加载的Job进行过滤,当然如果您没什么需要过滤的,那么直接返回系统给出的job就行。下面是这个接口的简单实现:

IJobDataService实现类示例
package test;
import java.util.List;
import com.bstek.bdf2.job.model.JobDefinition;
import com.bstek.bdf2.job.service.IJobDataService;
public class TestJobDataService implements IJobDataService {
	@Override
	public List<JobDefinition> filterJobs(List<JobDefinition> jobs) {
		return jobs;
	}
	@Override
	public String getCompanyId() {
		return "bstek";
	}
}

      IJobDataService接口的实现类编写好之后,需要将其配置到Spring环境当中,让其成为一个标准的Spring Bean,在配置时不需要为这个Bean指定ID。

      再次启动我们的项目,可以发现项目已经可以正常启动了。

      在BDF2-JOB模块当中,提供了针对JOB定义与管理,JOB运行服务监控等相关功能,这些功能都是通过可视化页面来实现的,所以如果您在使用BDF2-JOB模块时,又使用了BDF2-CORE模块,那么可以在登录之后访问generate.system.menu.action这个用于初始化菜单的URL,因为我们加入了BDF2-JOB模块,所以这个模块下包含的URL会自动创建出来,创建好的导航菜单如下图所示:

      到这里,JOB模块的安装与配置就完成了,下面我们来看看JOB模块提供了哪些属性允许我们覆盖:

属性名类型默认值描述
bdf2.scanJobCronExpressionString0 0/10 * * * ?利用JOB模块管理JOB时,系统每隔多长时间对调整的JOB进行扫描加载,这里默认是每天从第0分钟开始,每隔10分钟扫锚一次变更信息,也就是第0分钟扫描、第10分钟扫描、第20分钟扫描、第30分钟扫描、第40分钟扫描第50分钟扫描、第0分钟扫描......
bdf2.jobDataSourceNameStringJob模块采用的数据源名称,默认为空,表示采用默认数据源。
bdf2.schedulerConfigPropertiesFileStringclasspath:com/bstek/bdf2/job/config/bdf2.quartz.propertiesQuartz启动时相关配置参数文件所在位置,一般情况我们是不需要覆盖这个属性,额外定义属性文件的。
bdf2.jobApplicationNameStringJob模块所在应用的名称,该属性主要为用于JOB集群模块(bdf2-job-daemon)服务。
bdf2.runJobInCurrentInstancebooleantrue当前项目是否运行JOB,默认值为true,表示运行JOB,否则则不运行,这个属性同样是为JOB集群模块(bdf2-job-daemon)服务。单实例意义不大。
bdf2.jobThreadCountint10JOB服务在运行时准备多少个线程来运行用户配置的JOB,默认值为10,差不多可以运行100个JOB左右,按这个标准,您可以根据自己项目中JOB的数量来灵活修改这个属性值,一般情况下,可以满足多数JOB需求,不用修改。

Attachments:

job-menu.png (image/png)