Laufen Hintergrund geplanten Aufgaben in Spring MVC

View more categories:

1- Spring @Scheduled Annotation

Manchmal brauchen Sie in der Applikation eine Aufgabe, die implizit in der Applikation nach der vorhandenen Prozesse läuft, erstellen. Zum Beispiel die Erstellung der Datei sitemap, die email period schicken,...
@Scheduled ist eine Annotation zur Konfiguration eines Zeitplan (schedule). Sie wird in einer Methode verbindet und diese Methode läuft nach der Zeitplan, die durch  @Scheduled konfiguriert wird
@Scheduled
public @interface Scheduled {
 
    String cron() default "";
 
    String zone() default "";
 
    long fixedDelay() default -1;
 
    String fixedDelayString() default "";
 
    long fixedRate() default -1;
 
    String fixedRateString() default "";
 
    long initialDelay() default -1;
 
    String initialDelayString() default "";

}
Das Attribut Die Bezeichnung
cron Ist ein cron Ausdruck, aus der üblichen Ausdruck UN*X verlängert und es enthaltet 6 Felder  "die Sekunde, Die Minute, die Stunde, Tag am Monat, der Monat, der Tag der Woche". es hilft bei der Bestimmung eines komplizierten Prozessp. (am Ende des Unterlagen mehr lesen).
  • @return gibt eine cron Ausdruck rück und enthaltet die Zeitplan
zone Eine Zeit-zone benutzt die cron Ausdruck. Nach der Standard ist das Attribut ein leerer String (d.h die lokale Zeit-zone vom Server wird benutzt).
fixedDelay Die Implementation der Ausdrücke wird annotiert (annotated). Nach der Erledigung haltet es in einem nach der Milisekunden bestimmten Zeitraum und dann implementiert es die nächsten Aufgabe.
  • @return die Delay-Zeit nach der Milisekunde.
fixedDelayString Die Implementation der Ausdrücke wird annotiert (annotated). Nach der Erledigung haltet es in einem nach der Milisekunde bestimmten Zeitraum und dann implementiert es die nächste Aufgabe.
  • @return die Delay-zeit nach der Milisekunde
fixedRate Die Implementation der Ausdrücke wird annotiert (annotated), mit einem bestimmten Zeitraum zwischen die Aufrufe.
  • @return das bestimmte Zeitraum zwischen die Aufrufe nach der Milisekunde
​​​​​​​fixedRateString Die Implementation der Ausdrücke wird annotiert (annotated), mit einem bestimmten Zeitraum zwischen die Aufrufe.
  • @return das bestimmte Zeitraum zwischen die Aufrufe nach der Milisekundeals eine String Wert
initialDelay Das Zeitraum nach der Milisekunde haltet vor der ersten Implementation, mit fixedRate() oder fixedDelay() benutzen.
  • @return gibt die initalDelay für die erste Aufruf
initialDelayString Das Zeitraum nach der Milisekunde haltet vor der ersten Implementation, mit fixedRate() oder fixedDelay() benutzen.
  • @return gibt die initalDelay für die erste Aufruf als eine String Wert

2- Maven & web.xml konfigurieren

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.o7planning</groupId>
  <artifactId>SpringMVCSchedule</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>SpringMVCSchedule Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
   
            <!-- Servlet Library -->
        <!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- Spring dependencies -->
        <!-- http://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>

        <!-- http://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>

        <!-- http://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
       
  </dependencies>
 
 
    <build>
      <finalName>SpringMVCSchedule</finalName>
      <plugins>
    
          <!-- Config: Maven Tomcat Plugin -->
          <!-- http://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
          <plugin>
              <groupId>org.apache.tomcat.maven</groupId>
              <artifactId>tomcat7-maven-plugin</artifactId>
              <version>2.2</version>
              <!-- Config: contextPath and Port (Default: /SpringMVCSchedule : 8080) -->
              <!--
              <configuration>
                  <path>/</path>
                  <port>8899</port>
              </configuration>
              -->   
          </plugin>
      </plugins>
  </build>    
 
</project>

 
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 id="WebApp_ID" version="3.0">

 <display-name>Spring MVC Schedule</display-name>
 
 
   
</web-app>

3- Spring MVC konfigurieren

ApplicationContextConfig.java
package org.o7planning.springmvcschedule.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@ComponentScan("org.o7planning.springmvcschedule.*")
public class ApplicationContextConfig {

    @Bean(name = "viewResolver")
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

}
SpringWebAppInitializer.java
package org.o7planning.springmvcschedule.config;


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class SpringWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
        appContext.register(ApplicationContextConfig.class);

        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("SpringDispatcher",
                new DispatcherServlet(appContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }

}
WebMvcConfig.java
package org.o7planning.springmvcschedule.config;


import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

   private static final Charset UTF8 = Charset.forName("UTF-8");

   // Config UTF-8 Encoding.
   @Override
   public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
       StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
       stringConverter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", UTF8)));
       converters.add(stringConverter);

       // Add other converters ...
   }

   // Static Resource Config
   // equivalents for <mvc:resources/> tags
   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
       registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
       registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
   }

   // Equivalent for <mvc:default-servlet-handler/> tag
   @Override
   public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
       configurer.enable();
   }

}
Die Konfiguration genehmigt die Zeitplan (Schedule) zu benutzen:
SchedulerConfig.java
package org.o7planning.springmvcschedule.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
public class SchedulerConfig {
 
    // Declaring the beans are related to the schedule here if necessary.
   
}

 

4- fixedDelay & fixedRate

Das ist das einfachste Beispiel, das benutzt   @Schedule mit dem Attribute von  fixedDelay. Im Beispiel drück die Aufgabe auf dem Bildschirm Console die Zeit aus. Nach der Ende der Aufgabe stoppt sie fixedDelay Sekunde bevor sie die Aufgabe implementiert
WriteCurrentTimeSchedule.java
package org.o7planning.springmvcschedule.schedule;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class WriteCurrentTimeSchedule {

  private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss sss");


  // 2 second.
  @Scheduled(fixedDelay = 2 * 1000)
  public void writeCurrentTime() {
   
      Date now = new Date();
   
      String nowString = df.format(now);
   
      System.out.println("Now is: "+ nowString);
   
  }

}
Sie können die Delay-Zeit für die erste Implementation konfigurieren ( initialDelay), Nachdem die Applikation startet ( start), wird die Aufgabe auf dem Ende der Delay-Zeit vor der ersten Implementation.
// miliseconds.
@Scheduled(fixedDelay = 2 * 1000, initialDelay = 30 * 1000)
public void writeCurrentTime() {
 
   // Do something ..

}

Das Vergleich zwischen fixedDelay mit fixedRate

Sie können nur entweder  fixedDelay oder  fixedRate im  @Schedule annotation benutzen, Sie können nicht gleichzeitig die beide benutzen.
  • fixedDelay ist die Zeitraum nach der Erledigung von der früheren Aufgabe, danach die Implementation der nächsten Aufgabe.
  • fixedRate ist die die Zeitraum zwischen der Implementation der früheren Aufgabe und der Beginn der Implementation der nächsten Aufgabe. Es hängt nicht von der Erledigung der früheren Aufgabe ab

5- Die Ausdrücke von cron und zone

@Schedule erlaubt Sie bei der Einstellung der komplizierten Zeitplan, zum Beispiel: die Erledigung der Aufgabe in allen Montag um 12 Uhr. Um die komplizierten Zeitplan zu erledigen sollen Sie das Attribut cron.
Die Ausdrück cron ist die Vertretung von 6 Felder:
second, minute, hour, day of month, month, day(s) of week
Zum Beispiel
"0 0 * * * *" // the top of every hour of every day.

"*/10 * * * * *" // every ten seconds.

"0 0 8-10 * * *" // 8, 9 and 10 o'clock of every day.

"0 0/30 8-10 * * *" // 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.

"0 0 9-17 * * MON-FRI" // on the hour nine-to-seventeen, and monday to friday

"0 0 0 25 12 ?" // every Christmas Day at midnight
Davon
Das Zeichen Die Bedeutung
* irgendwelcher entspechen
*/X alle X
? ("keine bestimmte Wert") - es ist nutzlich wenn Sie etwas in einem der 2 Felder (field) bestimmen, davon ein Feld erlaubt und der andere nicht. Zum Beispiel, wenn ich den 10.Tag im Monat, aber sorge nicht welches Tag in der Woche es ist, soll ich  "10" im Feld  day-of-month setzen und das Zeichen "?" im Feld day-of-week.setzen

"0 0 0 25 12 ?":

Um 12h Mittelnacht (0 Uhr) am  Weihnachten (25th Dezember) sorgen Sie welches Tag es ist
Das zone Attribut bestimmt die Time-Zone. die standardmäßige Wert vom zone ist leer, d.h die Zeit-zone vom Server benutzen.
@Scheduled(cron="0 1 1 * * *", zone="Europe/Istanbul")

public void doScheduledWork() {
    // Do something here
}
Die folgende Tabelle bezeichnet die Liste der Zeit-Zone (Time zones), die durch  Oracle Real-Time Collaboration unterstützt wird.
Internal Name External User Visible Name
Pacific/Pago_Pago (-11:00) Pago Pago
Pacific/Honolulu (-10:00) Hawaii
America/Anchorage (-09:00) Alaska
America/Vancouver (-08:00) Canada Pacific Time
America/Los_Angeles (-08:00) US Pacific Time
America/Tijuana (-08:00) Tijuana
America/Edmonton (-07:00) Canada Mountain Time
America/Denver (-07:00) US Mountain Time
America/Phoenix (-07:00) Arizona
America/Mazatlan (-07:00) Mazatlan
America/Winnipeg (-06:00) Canada Central Time
America/Regina (-06:00) Saskatchewan
America/Chicago (-06:00) US Central Time
America/Mexico_City (-06:00) Mexico City
America/Guatemala (-06:00) Guatemala
America/El_Salvador (-06:00) El Salvador
America/Managua (-06:00) Managua
America/Costa_Rica (-06:00) Costa Rica
America/Montreal (-05:00) Canada Eastern Time
America/New_York (-05:00) US Eastern Time
America/Indianapolis (-05:00) East Indiana
America/Panama (-05:00) Panama
America/Bogota (-05:00) Bogota
America/Lima (-05:00) Lima
America/Halifax (-04:00) Canada Atlantic Time
America/Puerto_Rico (-04:00) Puerto Rico
America/Caracas (-04:00) Caracas
America/Santiago (-04:00) Santiago
America/St_Johns (-03:30) Newfoundland
America/Sao_Paulo (-03:00) Sao Paulo
Atlantic/Azores (-01:00) Azores
Etc./UTC (00:00) Universal Time
UTC (00:00) Universal Time
Atlantic/Reykjavik (00:00) Reykjavik
Europe/Dublin (00:00) Dublin
Europe/London (00:00) London
Europe/Lisbon (00:00) Lisbon
Africa/Casablanca (00:00) Casablanca
Africa/Nouakchott (00:00) Nouakchott
Europe/Oslo (+01:00) Oslo
Europe/Stockholm (+01:00) Stockholm
Europe/Copenhagen (+01:00) Copenhagen
Europe/Berlin (+01:00) Berlin
Europe/Amsterdam (+01:00) Amsterdam
Europe/Brussels (+01:00) Brussels
Europe/Luxembourg (+01:00) Luxembourg
Europe/Paris (+01:00) Paris
Europe/Zurich (+01:00) Zurich
Europe/Madrid (+01:00) Madrid
Europe/Rome (+01:00) Rome
Africa/Algiers (+01:00) Algiers
Africa/Tunis (+01:00) Tunis
Europe/Warsaw (+01:00) Warsaw
Europe/Prague (+01:00) Prague Bratislava
Europe/Vienna (+01:00) Vienna
Europe/Budapest (+01:00) Budapest
Europe/Sofia (+02:00) Sofia
Europe/Istanbul (+02:00) Istanbul
Europe/Athens (+02:00) Athens
Asia/Nicosia (+02:00) Nicosia
Asia/Beirut (+02:00) Beirut
Asia/Damascus (+02:00) Damascus
Asia/Jerusalem (+02:00) Jerusalem
Asia/Amman (+02:00) Amman
Africa/Tripoli (+02:00) Tripoli
Africa/Cairo (+02:00) Cairo
Africa/Johannesburg (+02:00) Johannesburg
Europe/Moscow (+03:00) Moscow
Asia/Baghdad (+03:00) Baghdad
Asia/Kuwait (+03:00) Kuwait
Asia/Riyadh (+03:00) Riyadh
Asia/Bahrain (+03:00) Bahrain
Asia/Qatar (+03:00) Qatar
Asia/Aden (+03:00) Aden
Africa/Khartoum (+03:00) Khartoum
Africa/Djibouti (+03:00) Djibouti
Africa/Mogadishu (+03:00) Mogadishu
Asia/Dubai (+04:00) Dubai
Asia/Muscat (+04:00) Muscat
Asia/Yekaterinburg (+05:00) Yekaterinburg
Asia/Tashkent (+05:00) Tashkent
Asia/Calcutta (+05:30) India
Asia/Novosibirsk (+06:00) Novosibirsk
Asia/Almaty (+06:00) Almaty
Asia/Dacca (+06:00) Dacca
Asia/Krasnoyarsk (+07:00) Krasnoyarsk
Asia/Bangkok (+07:00) Bangkok
Asia/Saigon (+07:00) Vietnam
Asia/Jakarta (+07:00) Jakarta
Asia/Irkutsk (+08:00) Irkutsk
Asia/Shanghai (+08:00) Beijing, Shanghai
Asia/Hong_Kong (+08:00) Hong Kong
Asia/Taipei (+08:00) Taipei
Asia/Kuala_Lumpur (+08:00) Kuala Lumpur
Asia/Singapore (+08:00) Singapore
Australia/Perth (+08:00) Perth
Asia/Yakutsk (+09:00) Yakutsk
Asia/Seoul (+09:00) Seoul
Asia/Tokyo (+09:00) Tokyo
Australia/Darwin (+09:30) Darwin
Australia/Adelaide (+09:30) Adelaide
Asia/Vladivostok (+10:00) Vladivostok
Australia/Brisbane (+10:00) Brisbane
Australia/Sydney (+10:00) Sydney Canberra
Australia/Hobart (+10:00) Hobart
Asia/Magadan (+11:00) Magadan
Asia/Kamchatka (+12:00) Kamchatka
Pacific/Auckland (+12:00) Auckland
Das Beispiel unten: die Aufgabe wird um 1h 20 am Montag, Dienstag, Wochentag und Donnerstag
"0 20 1 * * MON-THU"
CronSchedule.java
package org.o7planning.springmvcschedule.schedule;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class CronSchedule {

    @Scheduled(cron = "0 20 1 * * MON-THU")
    public void doSomething() {

        System.out.println("Do some thing");

    }

}

View more categories: