瀏覽代碼

加入分布式job

wangliang 4 年之前
父節點
當前提交
3eaf1b6275
共有 20 個文件被更改,包括 1082 次插入230 次删除
  1. 3 0
      README.md
  2. 340 6
      distributed-print-business/src/main/resources/db/init-table.sql
  3. 33 0
      distributed-print-task/.gitignore
  4. 117 0
      distributed-print-task/.mvn/wrapper/MavenWrapperDownloader.java
  5. 二進制
      distributed-print-task/.mvn/wrapper/maven-wrapper.jar
  6. 2 0
      distributed-print-task/.mvn/wrapper/maven-wrapper.properties
  7. 27 0
      distributed-print-task/pom.xml
  8. 42 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/enums/JobEnum.java
  9. 26 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/TestJob.java
  10. 13 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/JobService.java
  11. 30 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/impl/JobServiceImpl.java
  12. 95 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/service/QuartzService.java
  13. 254 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/service/impl/QuartzServiceImpl.java
  14. 51 0
      distributed-print-task/src/main/resources/application-task.properties
  15. 13 0
      distributed-print-task/src/test/java/com/qmth/distributed/print/task/DistributedPrintTaskApplicationTests.java
  16. 4 5
      distributed-print/pom.xml
  17. 18 0
      distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java
  18. 2 0
      distributed-print/src/main/resources/application.properties
  19. 0 219
      distributed-print/src/test/java/com/qmth/distributed/print/MyBatisGeneratorRun.java
  20. 12 0
      pom.xml

+ 3 - 0
README.md

@@ -10,6 +10,9 @@
 3.distributed-print-common
 项目公用
 
+4.distributed-print-task
+分布式job
+
 项目框架:
 java8,spring boot2.3.0
 

文件差異過大導致無法顯示
+ 340 - 6
distributed-print-business/src/main/resources/db/init-table.sql


+ 33 - 0
distributed-print-task/.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 117 - 0
distributed-print-task/.mvn/wrapper/MavenWrapperDownloader.java

@@ -0,0 +1,117 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.6";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+        + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if(mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if(mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if(!outputFile.getParentFile().exists()) {
+            if(!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}

二進制
distributed-print-task/.mvn/wrapper/maven-wrapper.jar


+ 2 - 0
distributed-print-task/.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

+ 27 - 0
distributed-print-task/pom.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.qmth.distributed.print.task</groupId>
+	<artifactId>distributed-print-task</artifactId>
+	<version>1.0.0</version>
+	<packaging>jar</packaging>
+
+	<parent>
+		<groupId>com.qmth.distributed.print.service</groupId>
+		<artifactId>distributed-print-service</artifactId>
+		<version>1.0.0</version>
+	</parent>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.qmth.distributed.print.business</groupId>
+			<artifactId>distributed-print-business</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-quartz</artifactId>
+		</dependency>
+	</dependencies>
+
+</project>

+ 42 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/enums/JobEnum.java

@@ -0,0 +1,42 @@
+package com.qmth.distributed.print.task.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: job enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/31
+ */
+public enum JobEnum {
+
+    TEST_JOB("测试job"),
+
+    TEST_JOB_GROUP("测试job组");
+
+    private String title;
+
+    private JobEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToName(String value) {
+        for (JobEnum e : JobEnum.values()) {
+            if (Objects.equals(value.trim(), e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

+ 26 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/TestJob.java

@@ -0,0 +1,26 @@
+package com.qmth.distributed.print.task.job;
+
+import com.qmth.distributed.print.task.job.service.JobService;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 测试job
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/31
+ */
+public class TestJob extends QuartzJobBean {
+
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
+        jobService.testJob();
+    }
+}

+ 13 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/JobService.java

@@ -0,0 +1,13 @@
+package com.qmth.distributed.print.task.job.service;
+
+/** 
+* @Description: job service
+* @Param:  
+* @return:  
+* @Author: wangliang
+* @Date: 2021/3/31 
+*/ 
+public interface JobService {
+
+    public void testJob();
+}

+ 30 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/impl/JobServiceImpl.java

@@ -0,0 +1,30 @@
+package com.qmth.distributed.print.task.job.service.impl;
+
+import com.qmth.distributed.print.business.service.CacheService;
+import com.qmth.distributed.print.common.util.JacksonUtil;
+import com.qmth.distributed.print.task.job.service.JobService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: job service impl
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/31
+ */
+@Service
+public class JobServiceImpl implements JobService {
+    private final static Logger log = LoggerFactory.getLogger(JobServiceImpl.class);
+
+    @Resource
+    CacheService cacheService;
+
+    @Override
+    public void testJob() {
+        log.info("testJob user info:{}", JacksonUtil.parseJson(cacheService.userCache(1L)));
+    }
+}

+ 95 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/service/QuartzService.java

@@ -0,0 +1,95 @@
+package com.qmth.distributed.print.task.service;
+
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: quartz 服务类
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/1
+ */
+public interface QuartzService {
+
+    /**
+     * 增加一个job
+     *
+     * @param jobClass
+     * @param jobName
+     * @param jobGroupName
+     * @param jobTime
+     * @param jobTimes
+     * @param jobData
+     */
+    public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, int jobTime,
+                       int jobTimes, Map jobData);
+
+    /**
+     * 增加一个job
+     *
+     * @param jobClass
+     * @param jobName
+     * @param jobGroupName
+     * @param jobTime
+     * @param jobData
+     */
+    public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, String jobTime, Map jobData);
+
+    /**
+     * 修改一个job的 时间表达式
+     *
+     * @param jobName
+     * @param jobGroupName
+     * @param jobTime
+     */
+    public void updateJob(String jobName, String jobGroupName, String jobTime);
+
+    /**
+     * 删除任务一个job
+     *
+     * @param jobName
+     * @param jobGroupName
+     */
+    public void deleteJob(String jobName, String jobGroupName);
+
+    /**
+     * 暂停一个job
+     *
+     * @param jobName
+     * @param jobGroupName
+     */
+    public void pauseJob(String jobName, String jobGroupName);
+
+    /**
+     * 恢复一个job
+     *
+     * @param jobName
+     * @param jobGroupName
+     */
+    public void resumeJob(String jobName, String jobGroupName);
+
+    /**
+     * 立即执行一个job
+     *
+     * @param jobName
+     * @param jobGroupName
+     */
+    public void runAJobNow(String jobName, String jobGroupName);
+
+    /**
+     * 获取所有job
+     *
+     * @return
+     */
+    public List<Map<String, Object>> queryAllJob();
+
+    /**
+     * 查询正在运行的job
+     *
+     * @return
+     */
+    public List<Map<String, Object>> queryRunJob();
+}

+ 254 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/service/impl/QuartzServiceImpl.java

@@ -0,0 +1,254 @@
+package com.qmth.distributed.print.task.service.impl;
+
+import com.qmth.distributed.print.task.service.QuartzService;
+import org.quartz.*;
+import org.quartz.impl.matchers.GroupMatcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @Description: quartz 服务实现类
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/1
+ */
+@Service
+public class QuartzServiceImpl implements QuartzService {
+    private final static Logger log = LoggerFactory.getLogger(QuartzServiceImpl.class);
+
+    @Resource
+    private Scheduler scheduler;
+
+    /**
+     * 增加一个job
+     *
+     * @param jobClass     任务实现类
+     * @param jobName      任务名称
+     * @param jobGroupName 任务组名
+     * @param jobTime      时间表达式 (这是每隔多少秒为一次任务)
+     * @param jobTimes     运行的次数 (<0:表示不限次数)
+     * @param jobData      参数
+     */
+    @Override
+    public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, int jobTime,
+                       int jobTimes, Map jobData) {
+        try {
+            // 任务名称和组构成任务key
+            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName)
+                    .build();
+            // 设置job参数
+            if (jobData != null && jobData.size() > 0) {
+                jobDetail.getJobDataMap().putAll(jobData);
+            }
+            // 使用simpleTrigger规则
+            Trigger trigger = null;
+            if (jobTimes < 0) {
+                trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)
+                        .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withIntervalInSeconds(jobTime))
+                        .startNow().build();
+            } else {
+                trigger = TriggerBuilder
+                        .newTrigger().withIdentity(jobName, jobGroupName).withSchedule(SimpleScheduleBuilder
+                                .repeatSecondlyForever(1).withIntervalInSeconds(jobTime).withRepeatCount(jobTimes))
+                        .startNow().build();
+            }
+            scheduler.scheduleJob(jobDetail, trigger);
+        } catch (SchedulerException e) {
+            log.error("请求出错", e);
+        }
+    }
+
+    /**
+     * 增加一个job
+     *
+     * @param jobClass     任务实现类
+     * @param jobName      任务名称(建议唯一)
+     * @param jobGroupName 任务组名
+     * @param jobTime      时间表达式 (如:0/5 * * * * ? )
+     * @param jobData      参数
+     */
+    @Override
+    public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, String jobTime, Map jobData) {
+        try {
+            // 创建jobDetail实例,绑定Job实现类
+            // 指明job的名称,所在组的名称,以及绑定job类
+            // 任务名称和组构成任务key
+            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName)
+                    .build();
+            // 设置job参数
+            if (jobData != null && jobData.size() > 0) {
+                jobDetail.getJobDataMap().putAll(jobData);
+            }
+            // 定义调度触发规则
+            // 使用cornTrigger规则
+            // 触发器key
+            Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)
+                    .startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.SECOND))
+                    .withSchedule(CronScheduleBuilder.cronSchedule(jobTime)).startNow().build();
+            // 把作业和触发器注册到任务调度中
+            scheduler.scheduleJob(jobDetail, trigger);
+        } catch (Exception e) {
+            log.error("请求出错", e);
+        }
+    }
+
+    /**
+     * 修改一个job的 时间表达式
+     *
+     * @param jobName
+     * @param jobGroupName
+     * @param jobTime
+     */
+    @Override
+    public void updateJob(String jobName, String jobGroupName, String jobTime) {
+        try {
+            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
+            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
+            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
+                    .withSchedule(CronScheduleBuilder.cronSchedule(jobTime)).build();
+            // 重启触发器
+            scheduler.rescheduleJob(triggerKey, trigger);
+        } catch (SchedulerException e) {
+            log.error("请求出错", e);
+        }
+    }
+
+    /**
+     * 删除任务一个job
+     *
+     * @param jobName      任务名称
+     * @param jobGroupName 任务组名
+     */
+    @Override
+    public void deleteJob(String jobName, String jobGroupName) {
+        try {
+            scheduler.deleteJob(new JobKey(jobName, jobGroupName));
+        } catch (Exception e) {
+            log.error("请求出错", e);
+        }
+    }
+
+    /**
+     * 暂停一个job
+     *
+     * @param jobName
+     * @param jobGroupName
+     */
+    @Override
+    public void pauseJob(String jobName, String jobGroupName) {
+        try {
+            JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
+            scheduler.pauseJob(jobKey);
+        } catch (SchedulerException e) {
+            log.error("请求出错", e);
+        }
+    }
+
+    /**
+     * 恢复一个job
+     *
+     * @param jobName
+     * @param jobGroupName
+     */
+    @Override
+    public void resumeJob(String jobName, String jobGroupName) {
+        try {
+            JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
+            scheduler.resumeJob(jobKey);
+        } catch (SchedulerException e) {
+            log.error("请求出错", e);
+        }
+    }
+
+    /**
+     * 立即执行一个job
+     *
+     * @param jobName
+     * @param jobGroupName
+     */
+    @Override
+    public void runAJobNow(String jobName, String jobGroupName) {
+        try {
+            JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
+            scheduler.triggerJob(jobKey);
+        } catch (SchedulerException e) {
+            log.error("请求出错", e);
+        }
+    }
+
+    /**
+     * 获取所有job
+     *
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryAllJob() {
+        List<Map<String, Object>> jobList = null;
+        try {
+            GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
+            Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
+            jobList = new ArrayList<Map<String, Object>>();
+            for (JobKey jobKey : jobKeys) {
+                List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
+                for (Trigger trigger : triggers) {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("jobName", jobKey.getName());
+                    map.put("jobGroupName", jobKey.getGroup());
+                    map.put("description", "触发器:" + trigger.getKey());
+                    Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
+                    map.put("jobStatus", triggerState.name());
+                    if (trigger instanceof org.springframework.scheduling.support.CronTrigger) {
+                        CronTrigger cronTrigger = (CronTrigger) trigger;
+                        String cronExpression = cronTrigger.getCronExpression();
+                        map.put("jobTime", cronExpression);
+                    }
+                    jobList.add(map);
+                }
+            }
+        } catch (SchedulerException e) {
+            log.error("请求出错", e);
+        }
+        return jobList;
+    }
+
+    /**
+     * 获取所有正在运行的job
+     *
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryRunJob() {
+        List<Map<String, Object>> jobList = null;
+        try {
+            List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
+            jobList = new ArrayList<Map<String, Object>>(executingJobs.size());
+            for (JobExecutionContext executingJob : executingJobs) {
+                Map<String, Object> map = new HashMap<String, Object>();
+                JobDetail jobDetail = executingJob.getJobDetail();
+                JobKey jobKey = jobDetail.getKey();
+                Trigger trigger = executingJob.getTrigger();
+                map.put("jobName", jobKey.getName());
+                map.put("jobGroupName", jobKey.getGroup());
+                map.put("description", "触发器:" + trigger.getKey());
+                Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
+                map.put("jobStatus", triggerState.name());
+                if (trigger instanceof org.springframework.scheduling.support.CronTrigger) {
+                    CronTrigger cronTrigger = (CronTrigger) trigger;
+                    String cronExpression = cronTrigger.getCronExpression();
+                    map.put("jobTime", cronExpression);
+                }
+                jobList.add(map);
+            }
+        } catch (SchedulerException e) {
+            log.error("请求出错", e);
+        }
+        return jobList;
+    }
+}
+

+ 51 - 0
distributed-print-task/src/main/resources/application-task.properties

@@ -0,0 +1,51 @@
+##\u7AEF\u53E3\u914D\u7F6E
+#server.port=7002
+##tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+#server.tomcat.threads.max=2500
+##tomcat\u6700\u5927\u8FDE\u63A5\u6570
+#server.tomcat.max-connections=2500
+##tomcat\u7684URI\u7F16\u7801
+#server.tomcat.uri-encoding=UTF-8
+#
+##\u9879\u76EE\u540D\u79F0
+#spring.application.name=themis-task
+
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+
+#\u914D\u7F6E\u6587\u4EF6
+spring.profiles=task

+ 13 - 0
distributed-print-task/src/test/java/com/qmth/distributed/print/task/DistributedPrintTaskApplicationTests.java

@@ -0,0 +1,13 @@
+package com.qmth.distributed.print.task;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DistributedPrintTaskApplicationTests {
+
+	@Test
+	void contextLoads() {
+	}
+
+}

+ 4 - 5
distributed-print/pom.xml

@@ -18,16 +18,15 @@
 			<groupId>com.qmth.distributed.print.business</groupId>
 			<artifactId>distributed-print-business</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>com.qmth.distributed.print.task</groupId>
+			<artifactId>distributed-print-task</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
 			<version>${spring-boot.version}</version>
 		</dependency>
-		<dependency>
-			<groupId>com.baomidou</groupId>
-			<artifactId>mybatis-plus-generate</artifactId>
-			<version>2.3</version>
-		</dependency>
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>

+ 18 - 0
distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java

@@ -1,12 +1,18 @@
 package com.qmth.distributed.print.start;
 
 import com.qmth.distributed.print.business.service.OrgCenterDataDisposeService;
+import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.task.enums.JobEnum;
+import com.qmth.distributed.print.task.job.TestJob;
+import com.qmth.distributed.print.task.service.QuartzService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
@@ -19,13 +25,25 @@ import javax.annotation.Resource;
 public class StartRunning implements CommandLineRunner {
     private final static Logger log = LoggerFactory.getLogger(StartRunning.class);
 
+//    @Resource
+//    QuartzService quartzService;
+
     @Resource
     private OrgCenterDataDisposeService orgCenterDataDisposeService;
 
     @Override
     public void run(String... args) throws Exception {
         log.info("服务器启动时执行 start");
+        SystemConstant.initTempFiles();
         orgCenterDataDisposeService.updateSchoolInfo();
+
+//        log.info("增加test job start");
+//        Map testJobMap = new HashMap();
+//        testJobMap.computeIfAbsent("name", v -> TestJob.class.getName());
+//        quartzService.deleteJob(JobEnum.TEST_JOB.name(), JobEnum.TEST_JOB_GROUP.name());
+//        quartzService.addJob(TestJob.class, JobEnum.TEST_JOB.name(), JobEnum.TEST_JOB_GROUP.name(), "0/10 * * * * ?", testJobMap);
+//        log.info("增加test job end");
+
         log.info("服务器启动时执行 end");
     }
 }

+ 2 - 0
distributed-print/src/main/resources/application.properties

@@ -80,6 +80,8 @@ prefix.url.exam=admin/exam
 com.qmth.logging.root-level=info
 com.qmth.logging.file-path=/Users/king/Downloads/distributed-print.log
 
+#\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
+spring.profiles.include=task
 
 #\u0368\uFFFD\u00F6\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u05A4\uFFFD\uFFFD
 sms.config.smsNormalCode=qmth

+ 0 - 219
distributed-print/src/test/java/com/qmth/distributed/print/MyBatisGeneratorRun.java

@@ -1,219 +0,0 @@
-package com.qmth.distributed.print;
-
-
-import com.baomidou.mybatisplus.generator.AutoGenerator;
-import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
-import com.baomidou.mybatisplus.generator.config.GlobalConfig;
-import com.baomidou.mybatisplus.generator.config.PackageConfig;
-import com.baomidou.mybatisplus.generator.config.StrategyConfig;
-import com.baomidou.mybatisplus.generator.config.rules.DbType;
-import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
-import org.junit.Test;
-
-/**
- * @Date: 2021/3/23.
- */
-public class MyBatisGeneratorRun {
-    //数据库类型
-    private final DbType dbType = DbType.MYSQL;
-    //数据库连结信息
-    private final String dbUrl = "jdbc:mysql://127.0.0.1:3306/tc_print_2?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&autoReconnectForPools=true&allowMultiQueries=true";
-    private final String driver = "com.mysql.cj.jdbc.Driver";
-    private final String userName = "root";
-    private final String password = "root";
-
-    //项目名
-    private final String projectName = "distributed-print-business";
-    //指定包名
-    private final String packageName = "com.qmth.distributed.print.business";
-    //controller基础类
-//    private final String superControllerClass = packageName + ".common.BaseController";
-    //entity基础类
-//    private final String superEntityClass = packageName + ".common.BaseEntity";
-    //模块名 如果有模块名,则需在模块名前加. 例:.log
-    private final String moduleName = "";
-    //作者名
-    private final String author = "xf";
-    //指定生成的表名
-    private final String[] tableNames = new String[]{"basic_attachment",
-            "basic_card_rule",
-            "basic_course",
-            "basic_exam_rule",
-            "basic_school",
-            "basic_template",
-            "basic_template_org",
-            "basic_user_course",
-            "basic_verify_code",
-            "exam_card",
-            "exam_card_detail",
-            "exam_detail",
-            "exam_detail_course",
-            "exam_print_plan",
-            "exam_student",
-            "exam_task",
-            "exam_task_detail",
-            "exam_task_review_log",
-            "exam_task_temp",
-            "sys_org",
-            "sys_privilege",
-            "sys_role",
-            "sys_role_course",
-            "sys_role_privilege",
-            "sys_user",
-            "sys_user_role"};
-
-
-    @Test
-    public void generateCode() {
-        //serviceNameStartWithI:user -> UserService, 设置成true: user -> IUserService
-        generateByTables(false, packageName, tableNames);
-    }
-
-    /**
-     * 根据表自动生成
-     *
-     * @param serviceNameStartWithI 默认为false
-     * @param packageName           包名
-     * @param tableNames            表名
-     * @author Terry
-     */
-    private void generateByTables(boolean serviceNameStartWithI, String packageName, String... tableNames) {
-        //配置数据源
-        DataSourceConfig dataSourceConfig = getDataSourceConfig();
-        // 策略配置
-        StrategyConfig strategyConfig = getStrategyConfig(tableNames);
-        //全局变量配置
-        GlobalConfig globalConfig = getGlobalConfig(serviceNameStartWithI);
-        //包名配置
-        PackageConfig packageConfig = getPackageConfig(packageName);
-        //自动生成
-        atuoGenerator(dataSourceConfig, strategyConfig, globalConfig, packageConfig);
-    }
-
-    /**
-     * 集成
-     *
-     * @param dataSourceConfig 配置数据源
-     * @param strategyConfig   策略配置
-     * @param config           全局变量配置
-     * @param packageConfig    包名配置
-     * @author Terry
-     */
-    private void atuoGenerator(DataSourceConfig dataSourceConfig, StrategyConfig strategyConfig, GlobalConfig config, PackageConfig packageConfig) {
-        new AutoGenerator()
-                .setGlobalConfig(config)
-                .setDataSource(dataSourceConfig)
-                .setStrategy(strategyConfig)
-                .setPackageInfo(packageConfig)
-//                .setTemplateEngine(new FreemarkerTemplateEngine())
-                .execute();
-    }
-
-    /**
-     * 设置包名
-     *
-     * @param packageName 父路径包名
-     * @param packageName 模块名
-     * @return PackageConfig 包名配置
-     * @author Terry
-     */
-    private PackageConfig getPackageConfig(String packageName) {
-        return new PackageConfig()
-                .setParent(packageName)
-                .setXml("mapper.xml" + moduleName)
-                .setMapper("mapper" + moduleName)
-                .setController("controller" + moduleName)
-                .setEntity("entity" + moduleName);
-    }
-
-    /**
-     * 全局配置
-     *
-     * @param serviceNameStartWithI false
-     * @return GlobalConfig
-     * @author Terry
-     */
-    private GlobalConfig getGlobalConfig(boolean serviceNameStartWithI) {
-        GlobalConfig globalConfig = new GlobalConfig();
-        globalConfig
-                .setBaseColumnList(true)
-                .setBaseResultMap(true)
-                .setActiveRecord(false)
-                //作者
-                .setAuthor(author)
-                //设置输出路径
-                .setOutputDir(getOutputDir(projectName))
-                .setFileOverride(true);
-        if (!serviceNameStartWithI) {
-            //设置service名
-            globalConfig.setServiceName("%sService");
-        }
-        return globalConfig;
-    }
-
-    /**
-     * 返回项目路径
-     *
-     * @param projectName 项目名
-     * @return 项目路径
-     * @author Terry
-     */
-    private String getOutputDir(String projectName) {
-        //        String path = this.getClass().getClassLoader().getResource("").getPath();
-        //        int index = path.indexOf(projectName);
-        return "D:\\my_workspaces\\ide_workspace_qmth\\idea_workspace\\distributed-print/" + projectName + "/src/main/java/";
-    }
-
-    /**
-     * 策略配置
-     *
-     * @param tableNames 表名
-     * @return StrategyConfig
-     * @author Terry
-     */
-    private StrategyConfig getStrategyConfig(String... tableNames) {
-        return new StrategyConfig()
-                // 全局大写命名 ORACLE 注意
-                .setCapitalMode(true)
-                //从数据库表到文件的命名策略
-                .setNaming(NamingStrategy.underline_to_camel)
-                //需要生成的的表名,多个表名传数组
-                .setInclude(tableNames)
-                //公共父类
-//                .setSuperControllerClass(superControllerClass)
-//                .setSuperEntityClass(superEntityClass)
-                // 写于父类中的公共字段
-                .setSuperEntityColumns("id")
-                //使用lombok
-                .setEntityLombokModel(true)
-                //rest风格
-                .setRestControllerStyle(true);
-    }
-
-    /**
-     * 配置数据源
-     *
-     * @return 数据源配置 DataSourceConfig
-     * @author Terry
-     */
-    private DataSourceConfig getDataSourceConfig() {
-        return new DataSourceConfig().setDbType(dbType)
-                .setUrl(dbUrl)
-                .setUsername(userName)
-                .setPassword(password)
-                .setDriverName(driver);
-    }
-
-    /**
-     * 根据表自动生成
-     *
-     * @param packageName 包名
-     * @param tableNames  表名
-     * @author Terry
-     */
-    @SuppressWarnings("unused")
-    private void generateByTables(String packageName, String... tableNames) {
-        generateByTables(true, packageName, tableNames);
-    }
-}
-

+ 12 - 0
pom.xml

@@ -11,6 +11,7 @@
         <module>distributed-print</module>
         <module>distributed-print-business</module>
         <module>distributed-print-common</module>
+        <module>distributed-print-task</module>
     </modules>
 
     <properties>
@@ -58,6 +59,11 @@
                 <artifactId>distributed-print-business</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.qmth.distributed.print.task</groupId>
+                <artifactId>distributed-print-task</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>com.qmth.boot</groupId>
                 <artifactId>starter-api</artifactId>
@@ -195,6 +201,12 @@
                 <artifactId>netty-all</artifactId>
                 <version>${netty-all.version}</version>
             </dependency>
+            <!--quartz-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-quartz</artifactId>
+                <version>${spring-boot.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

部分文件因文件數量過多而無法顯示