1.Quartzプロフィール
クォーツは、スケジューラのコアフレームワークです。クォーツスケジューラは、アプリケーションの実行環境を管理する責任があります。スケジューラは、枠組みの中でいくつかの非常に重要な要素に頼っ、自分ですべての作業を行っていません。クォーツはちょうどスレッドとスレッド管理ではありません。スケーラビリティを確保するために、石英ベースのアーキテクチャは、マルチスレッドを使用します。起動時に、フレームワーカースレッドの初期化は、このスレッドスケジューラは、所定の作業を実行します。これは、クォーツは、同時に、原則として複数のジョブを実行することができる方法です。環境を管理するための疎結合スレッドプール管理スレッドのクォーツ依存メンバー。
2.プロジェクト関連
デモは、開発パスの定期的な実装の下のjarパッケージをコンパイルするのに使用されるタイマーは、クリアランスオン、オフすることができ、ファイルのリスト全体がjarファイルを変更するために開始します管理するために、タスクのクエリの変更を削除することにより、一般的なタスクスケジューリングのためにも使用することができます実行状態(あなたが停止またはシャットダウン、サーバーを再起動する必要がある場合にのみオープンした後、具体的な解決策はまだ改善されている)。UIインターフェイスのセットに関連したシンプルで、可能な第2の開発、JPAクエリのメインページの統合あなたは、関連するコードセクションを表示することができます。
3.テストパス
//主页路径:
http://localhost:9090/
//启动jar的路径(这里的我只是建了一个简单的springboot的helloword的Jar包,相关jar包在项目中可以找到)
http://localhost:8088/sayHello
4.コード関連
QuartzServiceImpl:
@Service
public class QuartzServiceImpl implements QuartzService {
@Autowired
private JobEntityRepository repository;
@Override
public JobEntity getById(int id) {
return repository.getById(id);
}
//通过Id获取Job
public JobEntity getJobEntityById(Integer id) {
return repository.getById(id);
}
//从数据库中加载获取到所有Job
public List<JobEntity> loadJobs() {
List<JobEntity> list = new ArrayList<>();
repository.findAll().forEach(list::add);
return list;
}
//获取JobDataMap.(Job参数对象)
public JobDataMap getJobDataMap(JobEntity job) {
JobDataMap map = new JobDataMap();
map.put("name", job.getName());
map.put("group", job.getGroup());
map.put("cronExpression", job.getCron());
map.put("parameter", job.getParameter());
map.put("JobDescription", job.getDescription());
map.put("vmParam", job.getVmParam());
map.put("jarPath", job.getJarPath());
map.put("status", job.getStatus());
return map;
}
//获取JobDetail,JobDetail是任务的定义,而Job是任务的执行逻辑,JobDetail里会引用一个Job Class来定义
public JobDetail geJobDetail(JobKey jobKey, String description, JobDataMap map) {
return JobBuilder.newJob(DynamicJob.class)
.withIdentity(jobKey)
.withDescription(description)
.setJobData(map)
.storeDurably()
.build();
}
//获取Trigger (Job的触发器,执行规则)
public Trigger getTrigger(JobEntity job) {
return TriggerBuilder.newTrigger()
.withIdentity(job.getName(), job.getGroup())
.withSchedule(CronScheduleBuilder.cronSchedule(job.getCron()))
.build();
}
//获取JobKey,包含Name和Group
public JobKey getJobKey(JobEntity job) {
return JobKey.jobKey(job.getName(), job.getGroup());
}
}
DynamicJob:
/**
* :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行.
* :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效
* :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行,否则会在3秒时再启用新的线程执行
*/
@DisallowConcurrentExecution
@PersistJobDataAfterExecution //没有异常就更新数据 可用?
@Component
@Slf4j
public class DynamicJob implements Job {
private Logger logger = LoggerFactory.getLogger(DynamicJob.class);
/**
* 核心方法,Quartz Job真正的执行逻辑.
* executorContext JobExecutionContext中封装有Quartz运行所需要的所有信息
* @throws JobExecutionException execute()方法只允许抛出JobExecutionException异常
*/
@Override
public void execute(JobExecutionContext executionContext) throws JobExecutionException {
JobDataMap map = executionContext.getMergedJobDataMap();
String jarPath = map.getString("jarPath");
String parameter = map.getString("parameter");
String vmParam = map.getString("vmParam");
logger.info("Running Job name : {} ", map.getString("name"));
logger.info("Running Job description : " + map.getString("JobDescription"));
logger.info("Running Job group: {} ", map.getString("group"));
logger.info("Running Job cron : " + map.getString("cronExpression"));
logger.info("Running Job jar path : {} ", jarPath);
logger.info("Running Job parameter : {} ", parameter);
logger.info("Running Job vmParam : {} ", vmParam);
long startTime = System.currentTimeMillis();
if (!StringUtils.getStringUtil.isEmpty(jarPath)) {
File jar = new File(jarPath);
if (jar.exists()) {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.directory(jar.getParentFile());
/**
* 这个是java的执行命令
* java -jar
*/
List<String> commands = new ArrayList<>();
commands.add("java");
if (!StringUtils.getStringUtil.isEmpty(vmParam)) {
commands.add(vmParam);
}
commands.add("-jar");
commands.add(jarPath);
commands.add(" &");
System.out.println("commands->\n"+commands);
if (!StringUtils.getStringUtil.isEmpty(parameter)) {
commands.add(parameter);
processBuilder.command(commands);
logger.info("Running Job details as follows >>>>>>>>>>>>>>>>>>>>: ");
logger.info("Running Job commands : {} ", StringUtils.getStringUtil.getListString(commands));
try {
Process process = processBuilder.start();
logProcess(process.getInputStream(), process.getErrorStream());
} catch (Exception e) {
e.printStackTrace();
}
} else {
throw new JobExecutionException("Job Jar not found >> " + jarPath);
}
long endTime = System.currentTimeMillis();
logger.info(">>>>>>>>>>>>> Running Job has been completed , cost time : " + (endTime - startTime) + "ms\n");
}
}
}
//打印Job执行内容的日志
private void logProcess(InputStream inputStream, InputStream errorStream) throws IOException {
String inputLine;
String errorLine;
BufferedReader inputReader = new BufferedReader(new InputStreamReader(inputStream));
BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream));
while ((inputLine = inputReader.readLine()) != null){
logger.info(inputLine);
}
while ((errorLine = errorReader.readLine()) != null) {
logger.error(errorLine);
}
}
}
5.プロジェクトgitのアドレス
(ありがとう、ああのサポートのようなポイントの星を忘れないでください!)