springboot 통합 정시 프레임 워 크-lastic-job-lite
본문 Github 주소
홈 페이지 주소
네트워크 장 량 이 주도 적 으로 개발 한 분포 식 임무 스케줄 링 프레임 워 크 는 zookeeper 기술 과 결합 하여 quartz 프레임 워 크 가 분포 식 시스템 에서 중복 되 는 정시 임무 로 인 한 예측 할 수 없 는 오 류 를 해결 합 니 다!
Elastic-Job , Elastic-Job-Lite Elastic-Job-Cloud 。
Elastic-Job-Lite , jar ;Elastic-Job-Cloud Mesos Framework , 、 。
2.SpringBoot 통합
홈 페이지 에서 보 여 준 예 는 spring xml 를 기반 으로 한 것 입 니 다.관심 있 는 것 은 가 볼 수 있 습 니 다.저희 프로젝트 는 spring boot 프레임 워 크 를 사용 하기 때문에 일부 것 을 수정 해 야 합 니 다.예 를 들 어@Bean 을 사용 하 는 방식 으로 설정 을 시작 하 는 것 입 니 다.
1.pom 설정
<dependency>
<groupId>com.github.kuhn-hegroupId>
<artifactId>elastic-job-lite-spring-boot-starterartifactId>
<version>2.1.5version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
2,application.properties 설정
# zookeeper
elaticjob.zookeeper.server-lists=127.0.0.1:2181
elaticjob.zookeeper.namespace=my-project
#
spring.datasource.druid.log.url=jdbc:mysql://localhost:3306/event_log
spring.datasource.druid.log.username=root
spring.datasource.druid.log.password=root
spring.datasource.druid.log.driver-class-name=com.mysql.jdbc.Driver
#
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=mysql
spring.jpa.show-sql=true
3.bean 방식 으로 항목 설정
package cn.buildworld.elasticjob.config;
import cn.buildworld.elasticjob.listener.ElasticJobListener;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author MiChong
* @Email: 1564666023@qq.com
* @Create 2018-05-07 18:16
* @Version: V1.0
*/
@Configuration
@ConditionalOnExpression("'${elastic.zookeeper.server-lists}'.length() >0")
public class ElasticConfig {
/**
*
* @param serverList
* @param namespace
* @return
*/
@Bean(initMethod = "init")
public ZookeeperRegistryCenter regCenter(@Value("${elaticjob.zookeeper.server-lists}") String serverList
, @Value("${elaticjob.zookeeper.namespace}") String namespace) {
return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));
}
/**
* , ,
* @return
*/
@Bean
public ElasticJobListener elasticJobListener() {
return new ElasticJobListener(100, 100);
}
}
4.퀘 스 트 모니터
@Component
public class ElasticJobListener extends AbstractDistributeOnceElasticJobListener {
/**
*
* @param startedTimeoutMilliseconds
* @param completedTimeoutMilliseconds
*/
public ElasticJobListener(long startedTimeoutMilliseconds, long completedTimeoutMilliseconds) {
super(startedTimeoutMilliseconds, completedTimeoutMilliseconds);
}
/**
*
* @param shardingContexts
*/
@Override
public void doBeforeJobExecutedAtLastStarted(ShardingContexts shardingContexts) {
System.out.println(" ");
}
/**
*
* @param shardingContexts
*/
@Override
public void doAfterJobExecutedAtLastCompleted(ShardingContexts shardingContexts) {
System.err.println(" ");
}
}
5.데이터베이스 설정(퀘 스 트 첫 번 째 방법 사용)
@Configuration
public class DataSourceConfig {
@Bean("datasource")
@ConfigurationProperties("spring.datasource.druid.log")
public DataSource dataSourceTow(){
return DruidDataSourceBuilder.create().build();
}
}
6.퀘 스 트 설정(세 가지 방식)
Part 1 주석 위 에 작업 을 설정 하 는 cron,name 등 을 통 해
@ElasticSimpleJob(cron = "0/2 * * * * ?",
jobName = "firstJob",
shardingTotalCount = 2,
jobParameter = " ",
shardingItemParameters = "0=A,1=B",
dataSource = "datasource")
@Component
public class MyJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
System.out.println(String.format("------Thread ID: %s, : %s, " +
" : %s, : %s," +
" : %s, : %s,"+
" id: %s"
,
// id
Thread.currentThread().getId(),
//
shardingContext.getShardingTotalCount(),
//
shardingContext.getShardingItem(),
//
shardingContext.getShardingParameter(),
//
shardingContext.getJobName(),
//
shardingContext.getJobParameter(),
// id
shardingContext.getTaskId()
));
}
}
Part 2 컨트롤 러 동적 으로 작업 추가
@RestController
public class TestController {
@Autowired
private ZookeeperRegistryCenter zookeeperRegistryCenter;
/**
*
*/
@RequestMapping("/test")
public void test() {
int shardingTotalCount = 2;
String jobName = UUID.randomUUID().toString() + "-test123";
JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration
.newBuilder(jobName, "* * * * * ?", shardingTotalCount)
.shardingItemParameters("0=A,1=B")
.build();
SimpleJobConfiguration simpleJobConfiguration =
new SimpleJobConfiguration(jobCoreConfiguration, MyJob2.class.getCanonicalName());
JobScheduler jobScheduler = new JobScheduler(zookeeperRegistryCenter, LiteJobConfiguration.newBuilder(simpleJobConfiguration).build());
try {
jobScheduler.init();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(" ");
}
}
}
Part 3 handler 포장 을 통 해 작업 을 생 성 하 는 방법 으로 컨트롤 러 의 코드 량 을 간소화 합 니 다.
ElasticJobHandler.java
@Component
public class ElasticJobHandler {
@Autowired
private ZookeeperRegistryCenter zookeeperRegistryCenter;
@Autowired
private DataSourceConfig dataSourceConfig;
@Autowired
private ElasticJobListener elasticJobListener;
/**
* @param jobName
* @param jobClass
* @param shardingTotalCount
* @param cron
* @param id ID
* @return
*/
private static LiteJobConfiguration.Builder simpleJobConfigBuilder(String jobName,
Class extends SimpleJob> jobClass,
int shardingTotalCount,
String cron,
String id,String parameters) {
return LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(
JobCoreConfiguration
.newBuilder(jobName, cron, shardingTotalCount)
.shardingItemParameters(parameters)
.jobParameter(id).
build(),
jobClass.getCanonicalName()));
}
/**
*
*
* @param jobName
* @param cron
* @param shardingTotalCount
* @param parameters
*/
public void addJob(String jobName, String cron, Integer shardingTotalCount, String id,String parameters) {
LiteJobConfiguration jobConfig = simpleJobConfigBuilder(jobName, MyJob2.class, shardingTotalCount, cron, id,parameters)
.overwrite(true).build();
new SpringJobScheduler(new MyJob2(), zookeeperRegistryCenter, jobConfig, elasticJobListener).init();
}
}
컨트롤 러
@ResponseBody
@RequestMapping("/add")
public Object add(){
Date startTime = new Date();
startTime.setTime(startTime.getTime()+3000);
String cron = DateUtil.getCron(startTime);
try {
elasticJobHandler.addJob("myjob:"+cron,cron,2,"66666","0=A,1=B");
} catch (Exception e) {
e.printStackTrace();
return "false";
}
return "success";
}
시간 도구 클래스(주로 date 에서 cron 표현 식 으로 변환)
public class DateUtil {
/**
* cron
* @param date
* @return
*/
public static String getCron(Date date){
String dateFormat="ss mm HH dd MM ? yyyy";
return DateUtil.fmtDateToStr(date, dateFormat);
}
/**
* cron
* @param cron
* @return
*/
public static Date getCronToDate(String cron) {
String dateFormat="ss mm HH dd MM ? yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
Date date = null;
try {
date = sdf.parse(cron);
} catch (ParseException e) {
return null;
}
return date;
}
/**
* Description: ,String Date
*
* @param date
* @param dtFormat
* :yyyy-MM-dd HH:mm:ss yyyyMMdd
* @return
*/
public static String fmtDateToStr(Date date, String dtFormat) {
if (date == null)
return "";
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(dtFormat);
return dateFormat.format(date);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.