package com.github.ltsopensource.core.support;
import com.github.ltsopensource.core.commons.utils.BeanUtils;
import com.github.ltsopensource.core.commons.utils.StringUtils;
import com.github.ltsopensource.core.constant.Constants;
import com.github.ltsopensource.core.domain.Job;
import com.github.ltsopensource.core.support.bean.BeanCopier;
import com.github.ltsopensource.core.support.bean.BeanCopierFactory;
import com.github.ltsopensource.core.support.bean.PropConverter;
import com.github.ltsopensource.queue.domain.JobPo;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author Robert HG (254963746@qq.com) on 3/26/16.
*/
public class JobUtils {
private static final BeanCopier<Job, Job> JOB_BEAN_COPIER;
private static final BeanCopier<JobPo, JobPo> JOB_PO_BEAN_COPIER;
static {
Map<String, PropConverter<?, ?>> jobPoConverterMap = new ConcurrentHashMap<String, PropConverter<?, ?>>(1);
// 目前只有这个 extParams和 internalExtParams 不是基本类型, 为了不采用流的方式, 从而提升性能
jobPoConverterMap.put("extParams", new PropConverter<JobPo, Map<String, String>>() {
@Override
public Map<String, String> convert(JobPo jobPo) {
return BeanUtils.copyMap(jobPo.getExtParams());
}
});
jobPoConverterMap.put("internalExtParams", new PropConverter<JobPo, Map<String, String>>() {
@Override
public Map<String, String> convert(JobPo jobPo) {
return BeanUtils.copyMap(jobPo.getInternalExtParams());
}
});
JOB_PO_BEAN_COPIER = BeanCopierFactory.createCopier(JobPo.class, JobPo.class, jobPoConverterMap);
Map<String, PropConverter<?, ?>> jobConverterMap = new ConcurrentHashMap<String, PropConverter<?, ?>>(1);
// 目前只有这个 extParams不是基本类型, 为了不采用流的方式, 从而提升性能
jobConverterMap.put("extParams", new PropConverter<Job, Map<String, String>>() {
@Override
public Map<String, String> convert(Job job) {
return BeanUtils.copyMap(job.getExtParams());
}
});
JOB_BEAN_COPIER = BeanCopierFactory.createCopier(Job.class, Job.class, jobConverterMap);
}
public static long getRepeatNextTriggerTime(JobPo jobPo) {
long firstTriggerTime = Long.valueOf(jobPo.getInternalExtParam(Constants.FIRST_FIRE_TIME));
long now = SystemClock.now();
long remainder = (now - firstTriggerTime) % jobPo.getRepeatInterval();
if (remainder == 0) {
return now;
}
return now + (jobPo.getRepeatInterval() - remainder);
}
public static boolean isRelyOnPrevCycle(JobPo jobPo) {
return jobPo.getRelyOnPrevCycle() == null || jobPo.getRelyOnPrevCycle();
}
public static String generateJobId() {
return StringUtils.generateUUID();
}
public static String generateExeSeqId(JobPo jobPo){
return String.valueOf(jobPo.getTriggerTime());
}
public static Job copy(Job source) {
Job job = new Job();
JOB_BEAN_COPIER.copyProps(source, job);
return job;
}
public static JobPo copy(JobPo source) {
JobPo jobPo = new JobPo();
JOB_PO_BEAN_COPIER.copyProps(source, jobPo);
return jobPo;
}
}