>  기사  >  Java  >  봄 예정 작업에 대한 자세한 설명 @Scheduled

봄 예정 작업에 대한 자세한 설명 @Scheduled

高洛峰
高洛峰원래의
2017-02-07 15:39:052654검색

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.定时任务");
  }
spring 定时任务@Scheduled详解

에서 다음 오류를 보고합니다

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 &#39;giftReceiveRecordServiceImp&#39; 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 &#39;testTaskWithDate&#39;: 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 &#39;testTaskWithDate&#39;: 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中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.