자바 학습 튜 토리 얼 정시 퀘 스 트 온 가족 통

14371 단어 자바정시과업
정시 작업 의 응용 이 매우 광범 위 하고 자바 가 제공 하 는 기 존 해결 방안 이 매우 많다.
이번 에는 schedule,quartz,xx-job,shedlock 등 관련 코드 실천 을 다룬다.
1.SpringBoot 사용 일정
핵심 코드:

@Component
public class ScheduleTask {

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

 @Scheduled(cron = "0/1 * * * * ? ")
 public void one() {

 logger.info("one:" + new Date());
 }

 @Scheduled(cron = "0/1 * * * * ? ")
 public void two() {

 logger.info("two:" + new Date());
 }


 @Scheduled(cron = "0/1 * * * * ? ")
 public void three() {

 logger.info("three:" + new Date());
 }
}
실행 효 과 는 다음 과 같 습 니 다:

그 밖 에 이렇게 실현 할 수 있 습 니 다.핵심 코드:

@PropertySource(value = {
 "classpath:task.properties",
}, encoding = "utf-8")
@Component("scheduleTask")
public class ScheduleTask implements SchedulingConfigurer {


 @Value("${TEST_JOB_TASK_CRON}")
 private String cron;

 @Override
 public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

 scheduledTaskRegistrar.addTriggerTask(new Runnable() {

  @Override
  public void run() {
  System.out.println("    :" + DateUtil.date());


  }

 }, new Trigger() {
  @Override
  public Date nextExecutionTime(TriggerContext triggerContext) {
  return new CronTrigger(cron).nextExecutionTime(triggerContext);
  }
 });
 }

 public void setCron(String cron) {
 this.cron = cron;
 }
}
어떤 친구 가 궁금 할 지도 모 르 지만,왜 이렇게 많은 글 을 써 야 하 는 지,이것 은 앞의 코드 와 어떤 차이 가 있 습 니까?
다 중 스 레 드 병행 입 니 다.사실 다 중 스 레 드 병행 도 이렇게 쓰 지 않 아 도 되 고 핵심 설정 코드 만 쓰 면 됩 니 다.
정시 작업 다 중 스 레 드 설정 클래스:

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {

 public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
 scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
 }
}
다시 시작,효 과 를 보 려 면 다음 과 같 습 니 다.

이 를 통 해 알 수 있 듯 이 서로 다른 스 레 드 를 실행 하 는 장점 은 특정한 스 레 드 가 끊 긴 후에 다른 정시 임 무 를 수행 하지 못 하 게 하 는 것 이다.
또한 동시 실행 하려 면 앞의 설정 을 사용 하지 않 고 SpringBoot 가 제공 하 는 기 존 주 해 를 사용 하면 됩 니 다.핵심 코드 는 다음 과 같 습 니 다.

@Component
@EnableAsync
public class ScheduleAsyncTask {

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

 @Scheduled(cron = "0/1 * * * * ? ")
 @Async
 public void one() {

 logger.info("one Async:" + new Date());
 }

 @Scheduled(cron = "0/1 * * * * ? ")
 @Async
 public void two() {

 logger.info("two Async:" + new Date());
 }


 @Scheduled(cron = "0/1 * * * * ? ")
 @Async
 public void three() {

 logger.info("three Async:" + new Date());
 }
}
그 밖 에 schedule 동적 정시 작업(동적 이란 cron 표현 식 이 대응 하 는 데이터 시트 에 놓 여 있 는 것 을 말 합 니 다)도 있 습 니 다.간단 한 예제 코드:

@Configuration
public class DynamicScheduleTask implements SchedulingConfigurer {

 @Autowired
 @SuppressWarnings("all")
 CronMapper cronMapper;

 @Mapper
 public interface CronMapper {
 @Select("select cron from cron limit 1")
 public String getCron();
 }

 /**
 *       .
 */
 public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

 taskRegistrar.addTriggerTask(
  //1.      (Runnable)
  () -> System.out.println("        : " + LocalDateTime.now().toLocalTime()),
  //2.      (Trigger)
  triggerContext -> {
   //2.1           
   String cron = cronMapper.getCron();
   //2.2      .
   if (StringUtils.isEmpty(cron)) {
   // Omitted Code ..
   }
   //2.3       (Date)
   return new CronTrigger(cron).nextExecutionTime(triggerContext);
  }
 );
 }



}
핵심 프로필(application.yml):

spring:
 datasource:
 url: jdbc:mysql://127.0.0.1:3306/test
 username: root
 password: 1234
SQL 스 크 립 트:

DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test`;
USE `test`;
DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron` (
 `cron_id` varchar(30) NOT NULL PRIMARY KEY,
 `cron` varchar(30) NOT NULL 
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');
실행 효 과 는 다음 과 같 습 니 다:

2.SpringBoot 사용 Quartz
1.Maven 의존

<!--  quartz    -->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.프로필

spring:
 quartz:
 #      
 properties:
  org:
  quartz:
   scheduler:
   instanceName: clusteredScheduler
   instanceId: AUTO
   jobStore:
   class: org.quartz.impl.jdbcjobstore.JobStoreTX
   driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
   tablePrefix: QRTZ_
   isClustered: true
   clusterCheckinInterval: 10000
   useProperties: false
   threadPool:
   class: org.quartz.simpl.SimpleThreadPool
   threadCount: 10
   threadPriority: 5
   threadsInheritContextClassLoaderOfInitializingThread: true
 #     
 job-store-type: jdbc
 #      
 jdbc:
  initialize-schema: always
 datasource:
 url: jdbc:mysql://127.0.0.1:3306/test
 username: root
 password: 1234
3.시작 클래스

@SpringBootApplication
@EnableScheduling
public class BlogQuartzApplication {

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


}
4.설정 클래스

@Configuration
public class QuartzConfiguration {
 //   jobDetail  job
 @Bean
 public JobDetail myCronJobDetail() {
  return JobBuilder.newJob(CouponTimeOutJob.class).withIdentity("couponTimeOutJob").storeDurably().build();
 }

 //  jobDetail   Cron    trigger  
 @Bean
 public Trigger CronJobTrigger() {
  CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ?");

  return TriggerBuilder.newTrigger()
    .forJob(myCronJobDetail())
    .withIdentity("CouponTimeOutJobTrigger")
    .withSchedule(cronScheduleBuilder)
    .build();
 }
}
5.정시 퀘 스 트 클래스

public class CouponTimeOutJob extends QuartzJobBean {
 @Override
 protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  System.out.println("      ");
 }
}
6.시작 성공 시 오류 가 발생 하지 않 음
(1)대응 하 는 데이터 베 이 스 는 정시 작업 과 관련 된 데이터 시트 를 생 성 합 니 다.

(2)콘 솔 에서 정시 작업 수행 로 그 를 계속 출력 합 니 다.

3.SpringBoot 는 xx-job 를 사용 합 니 다.
이전에 같은 예 를 썼 는데,지금 은 간소화 하 였 다.
xx-job 사용 에 관 한 상세 한 정 보 는 나의 이 글 을 참고 할 수 있다.
SpringBoot 통합 Xxl-Job
1.Maven 의존

<dependency>
 <groupId>com.xuxueli</groupId>
 <artifactId>xxl-job-core</artifactId>
 <version>2.2.0</version>
</dependency>
2.설정 클래스

@Configuration
public class XxlJobConfig {
 private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

 @Value("${xxl.job.admin.addresses}")
 private String adminAddresses;

 @Value("${xxl.job.executor.appname}")
 private String appName;

 @Value("${xxl.job.executor.ip}")
 private String ip;

 @Value("${xxl.job.executor.port}")
 private int port;

 @Value("${xxl.job.accessToken}")
 private String accessToken;

 @Value("${xxl.job.executor.logpath}")
 private String logPath;

 @Value("${xxl.job.executor.logretentiondays}")
 private int logRetentionDays;


 @Bean(initMethod = "start", destroyMethod = "destroy")
 public XxlJobSpringExecutor xxlJobExecutor() {
  logger.info(">>>>>>>>>>> xxl-job config init.");
  XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
  xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
  xxlJobSpringExecutor.setAppname(appName);
  xxlJobSpringExecutor.setIp(ip);
  xxlJobSpringExecutor.setPort(port);
  xxlJobSpringExecutor.setAccessToken(accessToken);
  xxlJobSpringExecutor.setLogPath(logPath);
  xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

  return xxlJobSpringExecutor;
 }

}
3.파일 내용 설정

# web port
server.port=8081
# no web
#spring.main.web-environment=false
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=
### xxl-job executor appname
xxl.job.executor.appname=blog-job-xxl-job
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=8888
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30
4.정시 퀘 스 트 클래스

@Component
public class XxlJobTaskExample {


 @XxlJob("blogJobHandler")
 public ReturnT<String> blogJobHandler(String param) throws Exception {
  System.out.println("  ");
  XxlJobLogger.log("XXL-JOB, Hello World.");

  for (int i = 0; i < 5; i++) {
   XxlJobLogger.log("beat at:" + i);
   TimeUnit.SECONDS.sleep(2);
  }
  return ReturnT.SUCCESS;
 }

}
5.실행 효과
각각 다음 과 같다.


4.SpringBoot 는 ShedLock 을 사용 합 니 다.
1.Maven 의존 도입

<!--          -->
 <!-- https://mvnrepository.com/artifact/net.javacrumbs.shedlock/shedlock-spring -->
 <dependency>
  <groupId>net.javacrumbs.shedlock</groupId>
  <artifactId>shedlock-spring</artifactId>
  <version>4.0.4</version>
 </dependency>
 <!--   redis       -->
 <dependency>
  <groupId>net.javacrumbs.shedlock</groupId>
  <artifactId>shedlock-provider-redis-spring</artifactId>
  <version>2.5.0</version>
 </dependency>
 <!-- redis   -->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
2.설정 클래스 작성

@Configuration
@EnableSchedulerLock(defaultLockAtMostFor = "PT30M")
public class ShedLockConfig {

 @Bean
 public LockProvider lockProvider(RedisTemplate redisTemplate) {
  return new RedisLockProvider(redisTemplate.getConnectionFactory());

 }

}
3.구체 적 인 정시 작업 작성

@Component
public class TaskSchedule {

 /**
  *        
  * [ ] [ ] [  ] [ ] [ ] [ ] [ ]
  */
 @Scheduled(cron = "1 * * * * ?")
 @SchedulerLock(name = "synchronousSchedule")
 public void SynchronousSchedule() {
  
  System.out.println("Start run schedule to synchronous data:" + new Date());

 }
}
4.시작 클래스 작성

@SpringBootApplication
@EnableScheduling
public class ShedLockRedisApplication {
 public static void main(String[] args) {
  SpringApplication.run(ShedLockRedisApplication.class);
 }
}
5.프로필

server:
 tomcat:
 uri-encoding: UTF-8
 max-threads: 1000
 min-spare-threads: 30
 port: 8083

spring:
 redis:
 database: 0
 host: localhost
 port: 6379
 password:  #   (    )
 timeout: 6000ms #       (  )
 jedis:
  pool:
  max-active: 1000 #         (          )
  max-wait: -1ms  #            (          )
  max-idle: 10  #            
  min-idle: 5  #            
6.테스트
내 가 shedlock 을 사용 하 는 이 유 는 클 러 스 터 환경 에서 각 마이크로 서비스의 정시 임 무 를 모두 같은 시간 임 무 를 수행 하 는 것 이 아니 라 하나만 수행 하도록 확보 하기 때문이다.
이번 테스트 효 과 는 다음 과 같 습 니 다:

이번 코드 예 는 GitHub 에 넣 었 습 니 다https://github.com/developers-youcong/blog-job
자바 학습 튜 토리 얼 의 정시 미 션 온 가족 통 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 정시 미 션 온 가족 통 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기