복붙노트

[SPRING] 스프링 / 자바 스케줄링 태스크

SPRING

스프링 / 자바 스케줄링 태스크

데이터베이스에서 레코드 묶음을 계속 가져 와서 큐에 넣을 스레드를 생성합니다. 이 스레드는 서버로드시 시작됩니다. 이 스레드가 항상 활성화되어 있어야합니다. 데이터베이스에 레코드가 없으면 잠시 기다린 후 다시 확인해야합니다. 나는 스프링 태스크 스케줄러를 사용하여이 스케줄을 잡으려고 생각 했었지만 그 일이 옳은지 확실하지 않은 것은 내 태스크가 한 번만 시작되기를 원하기 때문이다. Spring에서 이것을 구현하는 좋은 방법은 무엇입니까?

또한, 내 스레드가 (어떤 오류 또는 예외 조건으로 인해) 아래로 간다면 그것은 어떤 시간 후에 다시 인스턴스화되어야한다 경계 검사가 필요합니다.

스레드 통신 방법을 사용하여 java에서이 모든 작업을 수행 할 수 있지만 이러한 시나리오에 대해 Spring 또는 Java에서 사용할 수있는 것이 있으면 시도해보십시오.

모든 제안이나 포인터가 도움이 될 것입니다.

해결법

  1. ==============================

    1.@Scheduled 주석을 사용하여 작업을 실행할 수 있습니다. 먼저 @Scheduled 주석이 달린 메소드로 클래스를 작성하십시오.

    @Scheduled 주석을 사용하여 작업을 실행할 수 있습니다. 먼저 @Scheduled 주석이 달린 메소드로 클래스를 작성하십시오.

    수업

    public class GitHubJob {
    
       @Scheduled(fixedDelay = 604800000)
       public void perform() {
          //do Something
        }
    }
    

    그런 다음이 클래스를 구성 파일에 등록하십시오.

    spring-context.xml

    <?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:tx="http://www.springframework.org/schema/tx"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    
    <tx:annotation-driven/>
    <task:annotation-driven scheduler="myScheduler"/>
    
    <task:scheduler id="myScheduler" pool-size="10"/>
    <bean id="gitHubJob" class="org.tothought.spring.jobs.GitHubJob"/>
    
    </beans>
    

    스케줄링에 대한 더 많은 정보는 Spring Docs를 방문하십시오.

  2. ==============================

    2.

    @Scheduled(fixedDelay=3600000)
    private void refreshValues() {
       [...]
    }
    

    매 시간마다 한 번씩 작업이 실행됩니다. 무효 여야하며 인수를 받아 들일 필요가 없습니다. Spring의 자바 설정을 사용한다면 @EnableScheduling 주석을 @Configuration 클래스 중 하나에 추가해야한다.

  3. ==============================

    3.쿼츠 스케쥴러를 사용해보십시오. http://quartz-scheduler.org/ 그러면 작업 실행 사이의 지속 시간을 지정할 수 있습니다. '처음'시간 만 실행하려는 코드 복제를 피하기 위해 클래스가 이전에 실행 된 경우 플래그 (부울 값)를 설정할 수 있습니다.

    쿼츠 스케쥴러를 사용해보십시오. http://quartz-scheduler.org/ 그러면 작업 실행 사이의 지속 시간을 지정할 수 있습니다. '처음'시간 만 실행하려는 코드 복제를 피하기 위해 클래스가 이전에 실행 된 경우 플래그 (부울 값)를 설정할 수 있습니다.

  4. ==============================

    4.Spring은 스케줄링 작업에 대한 out-ot-the-box 지원을 가지고있다. 다음은 최신 3.2.x 버전의 Spring 용 문서이지만 사용중인 버전에 대한 문서를 확인하십시오. 스케쥴링 작업을 위해 Quartz를 사용하는 것처럼 보입니다.

    Spring은 스케줄링 작업에 대한 out-ot-the-box 지원을 가지고있다. 다음은 최신 3.2.x 버전의 Spring 용 문서이지만 사용중인 버전에 대한 문서를 확인하십시오. 스케쥴링 작업을 위해 Quartz를 사용하는 것처럼 보입니다.

  5. ==============================

    5.귀하의 요구 사항은 쿼츠 또는 스프링 스케줄링 프레임 워크가 아주 잘 지원하는 정규 senario라고 생각합니다. 하지만 당신은 그것을 구체화하기위한 특정 접근법을 만들고 싶습니다. 내 제안은 그것을 간단하고 바보로 유지하는 것입니다. 스프링 scheudling은 항상 그것을 실행하는 대신 풀링하여 작업자 스레드를 활용할 것입니다.

    귀하의 요구 사항은 쿼츠 또는 스프링 스케줄링 프레임 워크가 아주 잘 지원하는 정규 senario라고 생각합니다. 하지만 당신은 그것을 구체화하기위한 특정 접근법을 만들고 싶습니다. 내 제안은 그것을 간단하고 바보로 유지하는 것입니다. 스프링 scheudling은 항상 그것을 실행하는 대신 풀링하여 작업자 스레드를 활용할 것입니다.

    통계에서는 작업자 클래스의 로그를 확인하기 쉽습니다. 웹 콘솔에서 통계를 보려면 작업자의 로그인을 데이터베이스에 기록해야합니다. 정상적인 방법으로 쉽게 만들 수 있다고 확신합니다.

  6. from https://stackoverflow.com/questions/15511965/scheduling-task-in-spring-java by cc-by-sa and MIT license