1. 구성 파일
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd" default-autowire="byName" default-lazy-init="false"> <!-- 定时任务相关配置 --> <task:executor id="executor" pool-size="10" queue-capacity="128"/> <task:scheduler id="scheduler" pool-size="10"/> <task:annotation-driven executor="executor" scheduler="scheduler" proxy-target-class="true"/> </beans>
2.
호출하는 방법은 두 가지가 있습니다. 1) 고정된 위치에서 실행해야 하는 경우 rate, just 어노테이션에 지정된 속성 이름을fixedRate로 변경하면 됩니다. 이 주기는 이전 작업의 시작 시간을 기준으로 하여 다시 호출됩니다. 이전 작업 시작 후 초:
@Scheduled(fixedDelay = 5000) public void testTask() { logger.info("测试定时任务"); }
2) cron 표현식을 사용하면 매일 아침 호출하는 등 예약된 호출을 구현할 수 있습니다. 자세한 cron 관련 매개변수는 나중에 소개됩니다
@Scheduled(cron = "cron = "0 0 2 * * ?"") public void testTaskWithDate() { logger.info("测试2016.定时任务"); }
3 , cron 관련 매개변수의 의미
cron 표현식에는 공백으로 구분된 최소 6개(아마도 7개)의 시간 요소가 있습니다.
순서 :
초(0~59)
분(0~59)
시간(0~23)
일(월) (0~31, 단, 월의 일수를 고려해야 함)
월(0~11)
일(주)(1~7 1 =SUN 또는 SUN, MON, TUE, WED, THU, FRI, SAT)
연도(1970-2099) - @Scheduled는 지원되지 않으며, spring quartz는
각각 지원합니다. 요소는 값(예: 6), 연속 간격(9-12), 간격(8-18/4)(/는 4시간마다를 의미), 목록(1, 3, 5) 또는 와일드카드. "월"과 "요일" 두 요소는 상호 배타적이므로 둘 중 하나만 설정해야 하나요?.
0 0 10,14,16 * * 매일 오전 10시 , 오후 2시 ? , 오후 4시
0 0/30 9-17 * * ? 9~5시 근무 중 30분마다
0 0 12 ? * WED는 매주 수요일 정오 12시를 의미합니다
"0 0 12 * * ?" 매일 정오 12시에 발생
"0 15 10 ? * *" 매일 오전 10시 15분에 발생
"0 15 10 *** 매일 오전 10시 15분에 트리거
"0 * 14 * * ?" 매일 오후 2시부터 오후 2시 59분까지 1분마다 트리거
"0 0/5 14 * * ?" 매일 오후 2시부터 오후 2시 55분까지 5분마다 트리거
"0 0/5 14,18 * * ?" 매일 오후 2시부터 오후 2시 55분과 오후 6시까지 5분마다 트리거 오후 2시부터 오후 2시 5분까지
"0 0-5 14 * * ?" 매일 오후 2시부터 오후 2시 5분까지 1분 간격으로 트리거
"0 10, 44 14 ? 3 WED" 3월 매주 수요일 오후 2시 10분과 2시 44분에 트리거됩니다
"0 15 10 ? * MON-FRI" 월요일부터 금요일까지 오전 10시 15분에 트리거됩니다
"0 15 10 15 * ?" 매월 15일 오전 10시 15분에 발생
"0 15 10 L * ?" 매월 말일 오전 10시 15분에 발생
"0 15 10 ? * 6L" 매월 마지막 금요일 오전 10시 15분에 트리거
"0 15 10 ? * 6L 2002-2005" 매월 마지막 날 2002~2005 금요일 오전 10시 15분에 트리거
"0 15 10 ? * 6#3" 매월 세 번째 금요일 오전 10시 15분에 트리거
일부 하위 표현식에는 다음을 포함할 수 있습니다. 일부 범위 또는 목록
예: 하위 표현식(일(주))은 "MON-FRI", "MON, WED, FRI", "MON-WED,SAT"일 수 있습니다.
"*" 문자는 가능한 모든 값을 나타냅니다.
따라서 하위 표현(월)의 "*"는 각 달의 의미를 나타내고, 하위 표현(일( 주))는 각 요일을 나타냅니다.
"/" 문자는 값의 증분을 지정하는 데 사용됩니다.
예: "0/15" 하위 표현식(분)은 0분부터 시작하여 15분마다를 의미합니다
하위 표현식(분)의 "3/20"은 3분부터 시작하여 20분마다라는 의미입니다(동일한 의미) "3, 23, 43")
“? " 문자는 일(월), 일(주) 두 하위 표현식에만 사용되어 값이 지정되지 않았음을 나타냅니다. 두 하위 표현식 중 하나에 값이 지정된 경우 순서대로 충돌을 피하려면 다음과 같이 해야 합니다. 다른 하위 표현식의 값은 "? "
"L" 문자는 일(월)과 일(주)의 두 하위 표현에만 사용됩니다. "last"라는 단어의 약어입니다
하지만 두 하위 표현의 의미는 다릅니다. 일(월) 하위 표현에서는 "L"이 해당 달의 마지막 날을 나타냅니다.
일(주) 하위 표현에서는 표현식에서 "L"은 한 주의 마지막 날인 SAT를 나타냅니다
"L" 앞에 특정 내용이 있으면 다른 의미를 갖습니다
예: " 6L"은 이번 달의 6일부터 마지막 날까지를 의미하고, "FRIL"은 이번 달의 마지막 금요일을 의미합니다.
참고: "L" 매개변수를 사용할 때 목록이나 범위를 지정하지 마십시오. 문제
4. 제한 사항 - @Scheduled의 cron은 실행 연도를 지정할 수 없습니다. 즉, 다음 예약 작업을 사용하는 경우@Scheduled(cron = "0 18 10 * * ? 2016-2016") public void testTaskWithDate() { logger.info("测试2016.定时任务"); }
에서 다음 오류를 보고합니다
Cron expression must consist of 6 fields (found 7 in "0 18 10 * * ? 2016-2016")
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'giftReceiveRecordServiceImp' defined in URL [jar:file:/Users/zhengcanrui/WORK/git/seewoedu-train-server/train-web/target/train/WEB-INF/lib/train-server-2.0-SNAPSHOT.jar!/com/seewoedu/train/service/impl/GiftReceiveRecordServiceImp.class]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: Encountered invalid @Scheduled method 'testTaskWithDate': Cron expression must consist of 6 fields (found 7 in "0 18 10 * * ? 2016-2016") at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4842) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5303) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1696) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:484) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:433) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1487) at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:97) at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1328) at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1420) at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:848) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) at sun.rmi.transport.Transport$2.run(Transport.java:202) at sun.rmi.transport.Transport$2.run(Transport.java:199) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:198) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:567) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.access$400(TCPTransport.java:619) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(TCPTransport.java:684) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(TCPTransport.java:681) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:681) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'testTaskWithDate': Cron expression must consist of 6 fields (found 7 in "0 18 10 * * ? 2016-2016") at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.processScheduled(ScheduledAnnotationBeanPostProcessor.java:405) at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.postProcessAfterInitialization(ScheduledAnnotationBeanPostProcessor.java:258) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ... 58 more
错误原因:
/** * Parse the given pattern expression. */ private void parse(String expression) throws IllegalArgumentException { String[] fields = StringUtils.tokenizeToStringArray(expression, " "); if (fields.length != 6) { throw new IllegalArgumentException(String.format("" + "cron expression must consist of 6 fields (found %d in %s)", fields.length, expression)); }
spring taks 不支持年位定时,它毕竟不是quartz,只是简单的定时框架,比起jdk Timer就加入了线程池而以.
但是制定到年份,会存在一个问题,就是在你在过了这个时间后再启动项目的时候,他会一直报一个memory leak的错误,大概的意思是你的定时任务将永远不会被执行,导致项目一直启动不了。
源码里的注释:
*The pattern is a list of six single space-separated fields: representing
* second, minute, hour, day, month, weekday. Month and weekday names can be
* given as the first three letters of the English names.
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
更多spring 定时任务@Scheduled详解相关文章请关注PHP中文网!