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);
}
}