SpringMVC Cron 타이머 데모 흔 한 문제 해결 방안

10006 단어 SpringMVCCron타이머
이 기술 의 적용 되 지 않 는 장면
클 러 스 터 환경 에서 여러 서버 에서 한 대 만 실행 하 기 를 원한 다 면,Spring 이 자체 적 으로 가지 고 있 는 이 타이머 방식 은 당신 의 요구 에 부합 되 지 않 을 것 입 니 다.
그러나 모든 서버 가 이 타이머 작업 을 독립 적 으로 수행 해 야 하고 서로 동기 화가 존재 하지 않 는 다 면 고려 할 수 있다.
SpringMVC 타이머
본 고 는 스프링 부 트 가 타 이 머 를 설정 하 는 방식 이 아니 라 스프링 부 트 가 타 이 머 를 설정 하 는 방식 을 중점적으로 소개 한다.
주해 방식
우선,Clock 클래스 에@Component 를 추가 한 다음,정시 에 실행 해 야 하 는 방법 에@Scheduled 를 추가 하고 마지막 으로 cron 표현 식 을 지정 합 니 다.
프로젝트 구성:

Clock.java

package coderead.spring.scheduled;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class Clock {
  //  5      
  @Scheduled(cron = "*/5 * * * * ?")
  public void testTime() {
    System.out.println(new Date());
  }
}
spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/task
      http://www.springframework.org/schema/task/spring-task.xsd">

  <mvc:annotation-driven />

  <context:component-scan base-package="coderead.spring.*" />
  
  <!--          -->
  <task:annotation-driven />
</beans>
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
     version="3.1">
  <!--              -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/spring-mvc.xml</param-value>
  </context-param>

  <!-- ================================== listener ================================== -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>


  <!-- ================================== servlet ================================== -->
  <!--       -->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>coderead.spring</groupId>
  <artifactId>spring-scheduled-test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>


  <properties>
    <spring.version>5.1.6.RELEASE</spring.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>9.4.33.v20201020</version>
      </plugin>
    </plugins>
  </build>

</project>
jetty 로 프로젝트 를 시작 하 는 방법 을 모 르 면 maven-Jetty 9-plugin 플러그 인 을 사용 하여 첫 번 째 Servlet 을 실행 하 는 것 을 참고 하 십시오.
xml 설정 방식
xml 설정 을 사용 해 야 한다 면@Scheduled 주석 과가 같은 속성 을 가지 고 있 음 을 발견 할 수 있 습 니 다.그래서 우 리 는 지난 절의 코드 를 약간 바 꾸 었 다.
Clock.java 주석 제거

package coderead.spring.scheduled;
import java.util.Date;
public class Clock {
  public void testTime() {
    System.out.println(new Date());
  }
}
spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/task
      http://www.springframework.org/schema/task/spring-task.xsd">

  <mvc:annotation-driven />

  <context:component-scan base-package="coderead.spring.*" />

  <!--  xml      Clock Bean-->
  <bean id="clock" class="coderead.spring.scheduled.Clock" />
  <!--  xml        -->
  <task:scheduled-tasks>
    <task:scheduled ref="clock" method="testTime" cron="*/5 * * * * ?"/>
  </task:scheduled-tasks>

</beans>
흔 한 문제
@Scheduled 정시 퀘 스 트 가 유효 하지 않 습 니 다
@Scheduled 정시 미 션 이 적용 되 지 않 습 니까??
  • 이 방법 은 매개 변수 가 있 으 면 안 됩 니 다
  • 이 방법 은 반환 값 이 있 을 수 없습니다4.567917.이런 것 에는 다른 어떠한 주해 도 포함 할 수 없 는 방법(신대륙 발견)
    또 하 나 는 spring-mvc.xml 파일 에을 추가 하지 않 았 을 수도 있 습 니 다.만 추가 하 는 것 이 아 닙 니 다.
    @Scheduled 정시 미 션 두 번 수행
    @Scheduled Spring 정시 작업 은 매번 두 번 씩 해결 방안 을 수행 합 니 다.
    주요 원인 은 웹.xml 가을 동시에 설정 하여 contextConfigLocation 를 설정 하고 설정 파일 을 두 번 불 러 옵 니 다.
    
    <web-app ....>
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-mvc.xml</param-value>
      </context-param>
      ...
      <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring/spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      ...
    </web-app>
    cron 표현 식
    cron 표현 식 은 코드 실행 주 기 를 규정 하 는 표현 식 입 니 다.cron 표현 식 은 이 글 에서 cron 표현 식 의 사용 세부 사항 을 상세 하 게 설명 합 니 다.
    나의 천박한 경험 으로,나의 cron 표현 식 에 대한 기억 은:
    자주 사용 하 는 cron 표현 식 은 6 개의 도 메 인 으로 구성 되 어 있 으 며,도 메 인과 도 메 인 사 이 는 빈 칸 으로 나 뉜 다.
    도 메 인 은 왼쪽 에서 오른쪽으로 시간 단 위 는 초 부터 점점 커진다.그들 은 각각'초 분 시 날짜 월 주'이다.
    날짜 와 주 는 서로 영향 을 미 치기 때문에,보통 그 중 하 나 를 사용 하지 않 는 다 면?임 의 를 표시 하면 다른 하 나 는 반드시 써 야 합 니까?임 의
    원인:보통 날짜 조건 을 지정 한 후에 우 리 는'임의의 요일'을 원 하지만 사실은 이때 주 는 날짜 의 변화 에 따라 상응하는 변 화 를 해 야 하기 때문에 완전히 임의로 할 수 없다.
    또한 온라인 Cron 표현 식 을 통 해 이전 코드 의 cron 표현 식 의 의 미 를 이해 하거나 필요 에 따라 새로운 cron 표현 식 을 만 들 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기