Spring Scheduling Task 예제

■ Spring에서 지원하는 Scheduling 작업예제를 Eclipse에서 실행했다. 작업은 Scheculing Tasks를 참조했다. JDK버전은 1.8, Maven버전은 3.3.9이다. Eclipse에서 Maven Project를 아래와 같이 생성한다. 여기서 Packaging는 jar를 선택한다.

Scheduling Task 프로젝트 생성

■ 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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.iotinfra</groupId>
<artifactId>pilot.scheduling</artifactId>
<version>0.0.1-SNAPSHOT</version>


<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

</project>

■ ScheduledTasks.java 실제 스케줄 작업을 할 클래스 파일을 생성한다. 작업내용은 5초마다 현재시간을 출력해주는 작업이다.

Scheduled 어노테이션은 특정 메소드가 실행되는시기를 정의한다. 참고 :이 예제에서는 각 호출의 시작 시간에서 측정 된 메서드 호출 간격을 지정하는 fixedRate를 사용한다. fixedDelay와 같은 다른 옵션이 있다. 이 옵션은 작업 완료시 측정 된 호출 간격을 지정한다. 더 정교한 작업 스케줄링을 위해 @Scheduled (cron = “..”) 표현식을 사용할 수도 있다.

package hello;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

	private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }
    
}

■ Application.java의 main() 메소드는 Spring Boot의 SpringApplication.run () 메소드를 사용하여 애플리케이션을 시작한다.

@SpringBootApplication은 다음을 모두 추가하는 편리한 어노테이션이다.

  • @Configuration은 클래스를 애플리케이션 컨텍스트의 Bean 정의 소스로 태그한다.
  • @EnableAutoConfiguration은 Spring Boot에게 클래스 패스 설정, 다른 bean 및 다양한 속성 설정을 기반으로 bean 추가를 시작하도록 지시합니다.
  • 일반적으로 @EnableWebMvc를 Spring MVC app에 추가하지만, Spring Boot는 classpath에서 spring-webmvc를 볼 때 자동으로 추가한다. 이것은 응용 프로그램에 웹 응용 프로그램으로 플래그를 지정하고 DispatcherServlet 설정과 같은 주요 동작을 활성화한다.
  • @ComponentScan은 Spring에게 hello 패키지의 다른 구성 요소, 구성 및 서비스를 찾아서 컨트롤러를 찾을 수 있게 한다.
  • @EnableScheduling은 백그라운드 태스크 실행 프로그램이 작성되도록한다. 이것이 없으면 아무 것도 예정되지 않습니다.
package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling

public class Application {
	public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

■ 완성된 프로그램 구조 – Maven Goal을 clean install로 주고 빌드를 하면 아래와 같이 pilot.scheduling-0.0.1-SNAPSHOT.jar파일이 생성된다.

Scheduling Task 구조

■ Eclipse 메뉴 > Run > Run Configurations…를 선택한다.

Scheduling Task Run Configuration 메뉴 선택

■ Main class에 Application클래스 파일을 입력 후 Run 버튼을 클릭해서 실행한다.

Scheduling Task 실행

■ Eclipse Console에서 프로그램이 실행되고 있다. 5초마다 현재 시간을 출력하고 있다.