创建任务处理类
在创建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>