Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der im Frühjahr geplanten Aufgabe @Scheduled

Detaillierte Erläuterung der im Frühjahr geplanten Aufgabe @Scheduled

高洛峰
高洛峰Original
2017-02-07 15:39:052658Durchsuche

1. Konfigurationsdatei

<?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. Es gibt zwei Möglichkeiten,

1) aufzurufen eine feste Rate, ändern Sie einfach den in der Anmerkung angegebenen Attributnamen in „fixedRate“. Die folgende Methode wird mit einer festen Rate von 5 Sekunden aufgerufen und ausgeführt. Dieser Zyklus basiert auf der Startzeit der vorherigen Aufgabe und wird erneut aufgerufen 5 Sekunden nach dem Start der vorherigen Aufgabe:

@Scheduled(fixedDelay = 5000)
 public void testTask() {
  logger.info("测试定时任务");
 }

2) Mithilfe von Cron-Ausdrücken können Sie geplante Aufrufe implementieren, z. B.: Aufrufe jeden frühen Morgen. Detaillierte Cron-bezogene Parameter später eingeführt

@Scheduled(cron = "cron = "0 0 2 * * ?"")
 public void testTaskWithDate() {
  logger.info("测试2016.定时任务");
 }

3. Bedeutung von Cron-bezogenen Parametern

Ein Cron-Ausdruck hat mindestens 6 (vielleicht 7) Zeitelemente, die durch Leerzeichen getrennt sind.

In der Reihenfolge:

Sekunden (0~59)

Minuten (0~59)

Stunden (0~23)

Tag (Monat) (0~31, aber Sie müssen die Anzahl der Tage in Ihrem Monat berücksichtigen)

Monat (0~11)

Tag (Woche) (1~7 1 =SONNE oder SO, MO, DIE, MI, DO, FREI, SA)

Jahr (1970-2099) – @Scheduled wird nicht unterstützt, Frühlingsquarz unterstützt jedes von

Das Element kann ein Wert (z. B. 6), ein kontinuierliches Intervall (9-12), ein Intervall (8-18/4) (/ bedeutet alle 4 Stunden), eine Liste (1, 3, 5) oder Platzhalter sein . Da sich die beiden Elemente „Tag des Monats“ und „Tag der Woche“ gegenseitig ausschließen, muss eines davon festgelegt werden?.

 0 0 10,14,16 * * ? Jeden Tag um 10 Uhr, 14 Uhr , 16 Uhr

 0 0/30 9-17 * * ? Jede halbe Stunde während der Arbeitszeit von 9 bis 17 Uhr

  0 0 12 ? * MI bedeutet jeden Mittwoch mittags 12 Uhr

 "0 0 12 * * ?" Wird jeden Tag um 12 Uhr mittags ausgelöst

 "0 15 10 ? * *" Wird jeden Tag um 10:15 Uhr ausgelöst

 "0 15 10 *** Auslöser jeden Tag um 10:15 Uhr

 "0 * 14 * * ?" Auslöser alle 1 Minute von 14:00 bis 14:59 Uhr jeden Tag

 "0 0/5 14 * * ?" Wird jeden Tag von 14:00 bis 14:55 Uhr alle 5 Minuten ausgelöst

 "0 0/5 14,18 * * ?" Wird jeden Tag von 14:00 bis 14:55 Uhr und 18:00 Uhr ausgelöst. Wird alle 5 Minuten ausgelöst von 14:00 bis 14:05 Uhr

 "0 0-5 14 * * ?" Auslösung alle 1 Minute von 14:00 bis 14:05 Uhr jeden Tag

 "0 10, 44 14 ? 🎜> "0 15 10 15 * ?" Wird am 15. eines jeden Monats um 10:15 Uhr ausgelöst

 "0 15 10 L * ?" Wird am letzten Tag eines jeden Monats um 10:15 Uhr ausgelöst

 "0 15 10 ? * 6L" Wird am letzten Freitag jedes Monats um 10:15 Uhr ausgelöst

  "0 15 10 ? * 6L 2002-2005" Der letzte Tag jedes Monats von 2002 bis 2005 Wird am Freitag um 10:15 Uhr ausgelöst

 "0 15 10 ? * 6#3" Wird am dritten Freitag jedes Monats um 10:15 Uhr ausgelöst

Einige Unterausdrücke können enthalten einige Bereiche oder Listen

Zum Beispiel: Der Unterausdruck (Tag (Woche)) kann „MON-FRI“, „MON, WED, FRI“, „MON-WED,SAT“ sein

„*“-Zeichen Stellt alle möglichen Werte dar

Daher stellt „*“ im Unterausdruck (Monat) die Bedeutung jedes Monats dar und „*“ im Unterausdruck (Tag ( Woche)) stellt jeden Tag der Woche dar

Das Zeichen „/“ wird verwendet, um die Schrittweite des Werts anzugeben

Zum Beispiel: „0/15“ in Der Unterausdruck (Minuten) bedeutet ab der 0. Minute alle 15 Minuten

Das „3/20“ im Unterausdruck (Minuten) bedeutet, dass ab der 3. Minute alle 20 Minuten begonnen wird (es hat die gleiche Bedeutung). als „3, 23, 43“)

 “? „Das Zeichen wird nur in den beiden Unterausdrücken Tag (Monat) und Tag (Woche) verwendet und zeigt an, dass kein Wert angegeben ist.

Wenn einer der beiden Unterausdrücke mit einem Wert angegeben wird, in dieser Reihenfolge Um Konflikte zu vermeiden, muss der Wert eines anderen Unterausdrucks auf „?“ gesetzt werden. "

Das Zeichen „L“ wird nur in den beiden Unterausdrücken Tag (Monat) und Tag (Woche) verwendet. Es ist die Abkürzung des Wortes „letzter“


Aber seine Bedeutung in den beiden Unterausdrücken ist unterschiedlich. Im Unterausdruck „Tag“ (Monat) steht „L“ für den letzten Tag des Monats

Im Unterausdruck „Tag“ (Woche). Ausdruck. Im Ausdruck stellt „L“ den letzten Tag der Woche dar, also SAT

Wenn vor „L“ ein bestimmter Inhalt steht, hat er andere Bedeutungen

Zum Beispiel: „ 6L“ bedeutet den sechstletzten Tag dieses Monats, „FRIL“ bedeutet den letzten Freitag dieses Monats

HINWEIS: Geben Sie bei Verwendung des Parameters „L“ keine Liste oder keinen Bereich an, da dies zu Problemen führt Probleme

4. Einschränkungen – @Scheduleds Cron kann das Jahr der Ausführung nicht angeben

Das heißt, wenn wir die folgende geplante Aufgabe verwenden

spring 定时任务@Scheduled详解

Der folgende Fehler wird gemeldet

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中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn