创建任务处理类
在创建schedule配置文件前,我们先完成任务处理类的编写,该类是业务系统进行数据处理的实现类。要求实现Schedule的接口IScheduleTaskDealMulti或者IScheduleTaskDealSingle。
接口主要包括三个方法。一个是根据调度器分配到的队列查询数据的接口,一个是进行数据处理的接口,一个是NOTSLEEP模式下需要实现的比较接口(用于判断重复的任务)。该类里还有一个init方法在spring加载此类时启动该任务的执行操作。
public class TaskSingle implements IScheduleTaskDealSingle<Long> {
protected static transient Log log = LogFactory.getLog(TaskSingle.class);
protected DataSource dataSource;
protected String taskType;
protected String ownSign;
public void setOwnSign(String ownSign) {
this.ownSign = ownSign;
}
public void setTaskType(String taskType) {
this.taskType = taskType;
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public boolean execute(Long task, String ownSign) throws Exception {
Connection conn = null;
Long id = (Long) task;
try {
conn = dataSource.getConnection();
String sql = "update SCHEDULE_TEST SET STS ='Y' ,DEAL_COUNT = DEAL_COUNT + 1 WHERE ID = ? and STS ='N' ";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setLong(1, id);
statement.executeUpdate();
statement.close();
conn.commit();
log.debug("处理任务:" + id + " 成功!");
return true;
} catch (Exception e) {
log.error("执行任务:" + task + "失败:" + e.getMessage(), e);
if (conn != null) {
conn.rollback();
}
return false;
} finally {
if (conn != null) {
conn.close();
}
}
}
public Comparator<Long> getComparator() {
return new Comparator<Long>() {
public int compare(Long o1, Long o2) {
return o1.compareTo(o2);
}
};
}
public List<Long> selectTasks(String ownSign, int queueNum,
List<String> queryCondition, int fetchNum) throws Exception {
List<Long> result = new ArrayList<Long>();
if (queryCondition.size() == 0) {
return result;
}
StringBuffer condition = new StringBuffer();
for (int i = 0; i < queryCondition.size(); i++) {
if (i > 0) {
condition.append(",");
}
condition.append(queryCondition.get(i));
}
Connection conn = null;
try {
conn = dataSource.getConnection();
String sql = null;
sql = "select ID from SCHEDULE_TEST where OWN_SIGN = '" + ownSign
+ "' and mod(id," + queueNum + ") in ("
+ condition.toString() + ") and sts ='N' LIMIT " + fetchNum;
PreparedStatement statement = conn.prepareStatement(sql);
ResultSet set = statement.executeQuery();
while (set.next()) {
result.add(set.getLong("ID"));
}
set.close();
statement.close();
return result;
} finally {
if (conn != null)
conn.close();
}
}
public void init() throws Exception {
TBScheduleManagerFactory.createTBScheduleManager(taskType,
ownSign);
}
}
配置数据库连接
db4MySql.xml文件中配置连接schedule数据源
<bean id="schedule_source" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="defaultAutoCommit"> <value>false</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/schedule?characterEncoding=utf-8</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>root</value> </property> </bean>
配置schedule mbean文件
Schedule可通过JMX控制调度服务的创建和停止,mbean-config.xml文件其相关配置JMX配置,HtmlAdaptor暴露端口号为5168
<beans default-autowire="byName"> <bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"> <property name="port" value="1522" /> </bean> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> <property name="autodetectModeName" value="AUTODETECT_MBEAN" /> <property name="namingStrategy" ref="namingStrategy" /> </bean> <bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy"> <property name="attributeSource" ref="jmxAttributeSource" /> </bean> <bean id="jmxAttributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" /> <bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean"> <property name="objectName" value="connector:name=rmi" /> <property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:1522/jmxconnector" /> </bean> <bean id="htmlAdaptor" class="com.sun.jdmk.comm.HtmlAdaptorServer" init-method="start"> <property name="port" value="5168"></property> </bean> </beans>