java/배치 & Scheduling

ScheduledFuture 사용

내가 만드는게 길이 된다 2023. 10. 18. 16:05
package com.twokimss.config;

import javax.annotation.PostConstruct;

import org.apache.ibatis.javassist.bytecode.stackmap.TypeData.ClassName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

import com.twokimss.web.batch.service.SchedulerFutureService;
import com.twokimss.web.batch.service.SchedulerService;

//스케쥴 테스트하고 싶을때 아래 3개 주석 풀어서 사용하기
@Configuration
@EnableScheduling
@EnableAsync
public class ScheduledConfig {
	// 스프링 부트에서 스케줄러 기능을 사용하기 위해 @EnableScheduling 설정

	private Logger logger = LoggerFactory.getLogger(ClassName.class);

	@Autowired
	private SchedulerService schedulerService;

	@Autowired
	private SchedulerFutureService schedulerFutureService;

//	1. Component는 class level에 선언,
//	   Bean은 메소드 레벨에 선언
//	2. Bean을 사용시 Configuration 어노테이션을 꼭 사용
//	   또는 @SpringBootApplication 어노테이션이 들어간 스프링 실행부에 사용
//	3. Bean은 외부 라이브러리가 제공하는 객체를 사용할 때
//	   Component는 내부에서 직접 접근 가능한 클래스에 사용
//	4. Bean은 유연한 빈 등록이 필요할때 사용(환경파일읽어서 동적생성)
	
	
	//순서: 생성자, @PostConstruct, @Bean

	public ScheduledConfig() {
		logger.debug("ScheduledConfig=================>생성자");
	}

	@PostConstruct
	public void init() {
		logger.debug("ScheduledConfig=================>init");

		schedulerFutureService.start();

//      Thread.sleep(10000);
//      schedulerFutureService.changeCron("*/3 * * * * *");
//      Thread.sleep(20000);	    

	}

//	@Bean
//	public TaskScheduler scheduler() {
//		logger.debug("ScheduledConfig=================>TaskScheduler Bean 등록");
//		
//		ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
//		scheduler.setPoolSize(4);
//		scheduler.setThreadNamePrefix("threadBiz-");//threadNamePrefix
//		scheduler.setBeanName("threadPoolTaskScheduler");
//		scheduler.initialize();
//
//		
//		return scheduler;
//	}

}

 

package com.twokimss.web.batch.service;

import java.util.concurrent.ScheduledFuture;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;

@Service
public class SchedulerFutureService {
	
	private TaskScheduler scheduler;
	private String cron = "*/10 * * * * *"; //10초마다실행
	private ScheduledFuture<?> future;

	@Autowired
	private SchedulerBiz003 schedulerBiz003;

	public SchedulerFutureService(TaskScheduler scheduler) {

		this.scheduler = scheduler;

	}

	public void start() {

//		ScheduledFuture<?> future = this.scheduler.schedule(() -> {
//			System.out.println("run at " + LocalDateTime.now());
//		},
//				new CronTrigger(cron));

		ScheduledFuture<?> future = this.scheduler.schedule(schedulerBiz003, new CronTrigger(cron));

		this.future = future;

	}

	public void changeCron(String cron) {

		if (future != null) {
			future.cancel(true);
		}

		this.future = null;
		this.cron = cron;
		
		this.start();

	}
}

 

package com.twokimss.web.batch.service;

import java.util.TimerTask;

import org.apache.ibatis.javassist.bytecode.stackmap.TypeData.ClassName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service("schedulerBiz003")
public class SchedulerBiz003 extends TimerTask {

	private Logger logger = LoggerFactory.getLogger(ClassName.class);

	@Override
	public void run() {
		logger.info("[003===>실행 시작] : {}", MyDateUtil.getDateTime());

		try {
			Thread.sleep(1000 * 2); //2초 걸리는 업무
		} catch (InterruptedException e) {
			e.printStackTrace();
		}		
		
		logger.info("[003===>실행 종료] : {}", MyDateUtil.getDateTime());

	}
}

 

package com.twokimss.web.login.controller;

import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.ibatis.javassist.bytecode.stackmap.TypeData.ClassName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.twokimss.web.batch.service.SchedulerFutureService;

@Controller
public class MyAjaxController {
	private static final Logger LOGGER = LoggerFactory.getLogger(ClassName.class);
	
    @Autowired
    private SchedulerFutureService schedulerFutureService;  
	
	@RequestMapping(value="/changeCron.do")
	public void changeCron() {
		trace("[changeCron]=====================start");	
		
		try {
			Thread.sleep(10000);
			schedulerFutureService.changeCron("*/5 * * * * *"); //5초 주기로 변경
			Thread.sleep(20000);
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	
	}
		

	// 출력을 어떤 스레드에서 하고 있는지 확인
	private static void trace(String strLog) {
		System.out.println(Thread.currentThread().getName() + ">>>>" + strLog);
	}
}