最近在做oa項目中寫到一個功能,就是員工每天的簽到和簽退.當時想了很久都沒有想出來,后來自己上網查了一下spring的定時器,然后就有了思路.
下面我貼上自己用到的這個定時器的配置.希望能夠和大家一起學習.
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:task="http://www.springframework.org/schema/task" 3 http://www.springframework.org/schema/task 4 http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 5 6 <!-- spring觸發器定時器開關 --> 7 <task:annotation-driven /> 8 <task:scheduled-tasks> 9 <!--這里設置每天的8:30點鍾,執行考勤方法,檢查每個員工誰沒有簽到 --> 10 <task:scheduled ref="taskManual" method="autoManual" cron="0 30 8 * * ?" /> 11 </task:scheduled-tasks> 12 </beans>
這個是我的實體類:
1 public class AutoManual { 2 /** 3 * 自動檢測考勤方法 4 * @author 呂兵陽 5 * @return 6 */ 7 public void autoManual(){ 8 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:config/applicationContext.xml"); 9 ManualsignService manualsignService = (ManualsignService) applicationContext.getBean("manualsignService"); 10 EmployeeService employeeService = (EmployeeService) applicationContext.getBean("employeeService"); 11 List<Manualsign>manuals = manualsignService.findManualignsByToday();//獲取所有的今天簽到的考勤 12 List<Employee> employees = employeeService.findEmployees();//獲取所有的員工 13 System.out.println("總共的員工數:"+employees.size()); 14 List<Employee> temp = new ArrayList<Employee>(); 15 for (Manualsign manual : manuals) { 16 for (Employee employee : employees) { 17 if(manual.getEmployee().getEmpId().equals(employee.getEmpId())){ 18 temp.add(employee); 19 } 20 } 21 } 22 employees.removeAll(temp); 23 for (Employee employee : employees) { 24 if(employee!=null){ 25 Manualsign manual = new Manualsign(); 26 manual.setEmployee(employee); 27 manual.setEndTime(null); 28 Calendar cal = Calendar.getInstance(); 29 manual.setStartTime(cal.getTime()); 30 manual.setManOffStatus(null); 31 manual.setManStatus(2); 32 manualsignService.addManualsign(manual); 33 } 34 } 35 System.out.println("今天沒有簽到的員工數:"+employees.size()); 36 } 37 }
這個是我的spring里面配置的bean:
1 <bean id="taskManual" class="com.accp.office.util.AutoManual"></bean>
首先要引入spring定時器這個命名空間,然后我們只需要簡單的配置.ref是我們在spring里面配置的一個pojo類,也就是一個普通的 bean,method方法,指向我們需要調用的那個方法,如果有多個可以用","號隔開,cron的配置大家可以看這方面的文檔,當然我給大家提供一 份:
其中時間的定義按以下例子模仿
表達式
Java代碼
意義
1 "0/10 * * * * ?" 每十秒觸發 2 "0 0/1 * * * ?" 每一分鍾觸發 3 4 "0 0 12 * * ?" 每天中午12點觸發 5 "0 15 10 ? * *" 每天上午10:15觸發 6 "0 15 10 * * ?" 每天上午10:15觸發 7 "0 15 10 * * ? *" 每天上午10:15觸發 8 "0 15 10 * * ? 2005" 2005年的每天上午10:15觸發 9 "0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鍾觸發 10 "0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鍾觸發 11 "0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鍾觸發 12 "0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鍾觸發 13 "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發 14 "0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發 15 "0 15 10 15 * ?" 每月15日上午10:15觸發 16 "0 15 10 L * ?" 每月最后一日的上午10:15觸發 17 "0 15 10 ? * 6L" 每月的最后一個星期五上午10:15觸發 18 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個星期五上午10:15觸發 19 "0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發
關於spring3定時器cron參數設置每月最后一天不支持L
<!-- spring定時器 --> <bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="taskCount"/> </property> <property name="targetMethod"> <value>autoCountTimes</value> </property> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="methodInvokingJobDetail"/> </property> <!-- 配置每個月的最后一天的23點59分,調用修改用戶月登陸次數的方法 --> <property name="cronExpression"> <value>0 59 23 L * ?</value> </property> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list><ref local="cronTrigger"/></list> </property> </bean>
我采用了和quartz方式的.其中里面的taskCount是我在bean里面配置的要執行定時任務的那個bean的id,
autoCountTimes指的是要執行的那個方法.這樣就可以用帶L那個corn表達式了.