Quartz集群增强版_00.How to use?(如何利用)

打印 上一主题 下一主题

主题 870|帖子 870|积分 2610

Quartz集群增强版_00.How to use?(如何利用)

转载请著名出处 https://www.cnblogs.com/funnyzpc/p/18540378
开源地址 https://github.com/funnyzpc/quartz

表的基本结构



    总的来说任务的设置及开辟基本遵从上图的表的基本关系,除 app 以及 node 之外均需要手动手动设置,app 及 node 在执行端启动的时候会主动天生对应 app 以及 node 的数据 ~
后管设置

先看一下后管的基本页面~
由于 app 与 node 是一对多的关系,这里就放到一个page下:


  • 这里需要说明的是app与node一般无需新增,如果特殊情况下请参照下图:
app新增


node新增


由于node必须关联已有的app才可新增,新增入口在app列表中
另外,需要说明的是:

  • 如果执行端获取不到宿主机IP以及主机名称会随机天生一个同名的 主机IP以及主机名称,此时在管理端手动新增就毫无意义了
    删除

  • 删除应用必须先删除应用关联的节点(node),节点被删除则节点对应的执行端无法执行其任务,删除应用也是
  • 删除应用或节点不会变动任务及执行项的状态,也不会删除任务及执行项,没有节点的执行项不会执行也会定期被清算
    启用/关闭

启用与关闭只操作节点或应用,关闭节点则节点下的所有任务均不会执行,关闭应用则应用关联的所有结点都不会执行任务,同时这个操作也不会变动任务或执行项~
再看看节点任务及执行设置:


任务/执行设置是管理端重要任务,执行设置利用关联任务设置(PID)关联相应的任务(job),执行项(execute)是不可独立存在的!
新增任务设置


  • 应用名称/调理名称就是主动或手动设置的应用信息
    任务状态在设置时仅可有 初始化(INIT)/正常执行(EXECUTING) 这两种状态,如果只是设置不想立即执行就选 初始化(INIT)
    新增执行设置-CRON时间任务

  • 任务类型仅可为简单任务(SIMPLE)或表达式(CRON)的时间项的任务,两种类型的执行设置(execute)填写的字段会有区别
    CRON任务的CRON表达式是必填项,时区现阶段默认是Asia/Shanghai ,后续会改成从系统获取默认
    开始时间一般不填则默认就是-1,新增提交后是按当前时间补充
    结束时间也好坏必填的,结束时间默认也是-1,结束时间如果是-1则在执行完最后一次任务之后会补充为最后一次执行时间
    新增执行设置-SIMPLE时间任务

  • 图中圈出的为必填项,需要说明的是:如果执行结束时间与执行次数均设置,具体任务执行时会依限制范围最小的为现实执行,比如设置的结束时间较长但是执行次数只有几次,那最终大概率只会以执行次数为限制执行
    另外,对于执行设置,当执行完成后,对应的执行设置仅可删除不可 修改或启停,已经完成的对此类操作是没有意义的,不如新增一个执行设置
管理端开辟设置及集成

这里仅以springboot为例:

  • 添加依赖,如果有maven私服建议放到私服
  1.     <dependency>
  2.         <groupId>org.quartz-scheduler.internal</groupId>
  3.         <artifactId>quartz-client</artifactId>
  4.         <version>2.3.2</version>
  5.         
  6.         <scope>system</scope>
  7.         <systemPath>${pom.basedir}/src/main/resources/lib/quartz-client-2.3.2.jar</systemPath>
  8.     </dependency>
复制代码

  • 启动类需要清除主动装配
  1. // 这一行是重点!
  2. @SpringBootApplication(exclude = {QuartzAutoConfiguration.class})
  3. public class MeeAdminApplication {
  4.         /**
  5.          * 日志
  6.          */
  7.         private static final Logger LOG= LoggerFactory.getLogger(MeeAdminApplication.class);
  8.         public static void main(String[] args)throws Exception {
  9.                 ConfigurableApplicationContext application = SpringApplication.run(MeeAdminApplication.class, args);
  10.                 Environment env = application.getEnvironment();
  11.                 String ip = InetAddress.getLocalHost().getHostAddress();
  12.                 String port = env.getProperty("server.port");
  13.                 String path = env.getProperty("server.servlet.context-path");
  14.                 LOG.info("\n\t----------------------------------------------------------\n\t" +
  15.                                 "Application MeeAdminApplication is running!\n\t" +
  16.                                 "Local: \t\thttp://localhost:" + port + path + "/\n\t" +
  17.                                 "External: \thttp://" + ip + ":" + port + path + "/\n\t" +
  18.                                 "----------------------------------------------------------");
  19.         }
  20. }
复制代码

  • 需要设置一个实例以利用
  1. @Service
  2. public final class QrtzJobServiceImpl implements QrtzJobService {
  3.     /**
  4.      *   日志
  5.      */
  6.     private static final Logger LOG = LoggerFactory.getLogger(QrtzJobServiceImpl.class);
  7.    
  8.     /**
  9.      * quartz定时任务api
  10.      */
  11.     private final Scheduler scheduler;
  12.     public QrtzJobServiceImpl(DataSource dataSource) {
  13.         this.scheduler = new StdScheduler(dataSource);
  14.     }
  15. }
复制代码

  • 调用sdk
  1.     @Override
  2.     public MeeResult<Integer> updateJobState(String job_id,String state) {
  3.         Object[] result = scheduler.updateJobStateInAll(job_id,state);
  4.         int updateCount = (int)result[0];
  5.         if(updateCount>0){
  6.             return ResultBuild.build(updateCount);
  7.         }else{
  8.             return ResultBuild.fail((String)result[1]);
  9.         }
  10.     }
复制代码
Scheduler 提供了多种多样的api,留意部分接口的区别:

    如果管理端与执行端一体 则无需引入client依赖(quartz-client),也无需在启动类中清除主动装配(QuartzAutoConfiguration),利用sdk也无需利用构造方式传入database,仅此即可:
  1.     @Autowired
  2.     private Scheduler scheduler;
复制代码
执行端开辟设置及集成


  • 引入依赖同时清除原生Quartz
  1.         <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             <artifactId>spring-boot-starter-quartz</artifactId>
  4.             <version>${spring-boot-current.version}</version>
  5.             <exclusions>
  6.                 <exclusion>
  7.                     <groupId>org.quartz-scheduler</groupId>
  8.                     <artifactId>quartz</artifactId>
  9.                 </exclusion>
  10.             </exclusions>
  11.         </dependency>
  12.         <dependency>
  13.             <groupId>org.quartz-scheduler.internal</groupId>
  14.             <artifactId>quartz-core</artifactId>
  15.             <version>2.3.2</version>
  16.             
  17.             <scope>system</scope>
  18.             <systemPath>${pom.basedir}/src/main/resources/lib/quartz-core-2.3.2.jar</systemPath>
  19.         </dependency>
复制代码

  • 添加依赖设置项
  1. ### ----------- quartz ------------------
  2. spring.quartz.job-store-type=jdbc
  3. spring.quartz.properties.org.quartz.jobStore.class=org.springframework.scheduling.quartz.LocalDataSourceJobStore
  4. spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=6000
  5. spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.jdbcjobstore.impl.org.quartz.StdJDBCDelegate
  6. spring.quartz.properties.org.quartz.jobStore.isClustered=true
  7. # 表名前缀
  8. spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
  9. spring.quartz.properties.org.quartz.scheduler.instanceName=${spring.application.name}
  10. #spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
  11. spring.quartz.properties.org.quartz.threadPool.class=org.quartz.impl.MeeThreadPool
  12. # 线程数配置
  13. spring.quartz.properties.org.quartz.threadPool.threadCount=10
  14. spring.quartz.properties.org.quartz.threadPool.threadPriority=5
  15. # 綫程继承初始化线程的上下文类加载器
  16. spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
  17. #Whether to enable pessimistic lock to control trigger concurrency in the cluster 是否启用悲观锁来控制集群中的触发并发
  18. spring.quartz.properties.org.quartz.jobStore.acquireTriggersWithinLock=true
复制代码
    设置项内里 要留意线程数的设置,如果利用的 MeeThreadPool 则threadCount为最大线程数,核心线程数 threadCount-2 ,最少为2,具体多少按现实CPU核心个数以及是否是IO密集型还是CPU密集型来设置即可~
其次要留意 tablePrefix 如果表名有变动则按照变动后的表名前缀设置即可

  • 定义一个任务

    • 如果利用的是spring提供的QuartzJobBean来开辟:
    1.   import com.mee.quartz.util.DateUtil;
    2.   import org.quartz.JobExecutionContext;
    3.   import org.quartz.JobExecutionException;
    4.   import org.quartz.impl.QrtzExecute;
    5.   import org.slf4j.Logger;
    6.   import org.slf4j.LoggerFactory;
    7.   import org.springframework.beans.factory.annotation.Autowired;
    8.   import org.springframework.scheduling.quartz.QuartzJobBean;
    9.   
    10.   import javax.sql.DataSource;
    11.   
    12.   
    13.     public class ATestJob extends QuartzJobBean {
    14.   
    15.     private static final Logger log = LoggerFactory.getLogger(ATestJob.class);
    16.   
    17.       @Override
    18.       protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
    19.           try {
    20.               log.info("===>ATestJob::executeInternal {}-{} : {}-{}<===" ,context.getJobId(),context.getExecuteId(),context.getJobType(),context.getJobClassName());
    21.           } catch (Exception e) {
    22.               throw new JobExecutionException(e);
    23.           }
    24.       }
    25.   
    26.   }
    复制代码
以上两种方式皆可,需要留意的是,不管是继承 QuartzJobBean 还是实现的 ``Job,均无需将类著名为spring  bean类(@Service or @Component),Quartz内部自会创建任务类为spring bean ~
开辟留意事项


  • 利用 quartz-client 添加的任务一般最晚会在 5秒 之后执行,由于任务轮询是 5秒 一轮询
  • 执行端执行非常(Quartz内的非业务的)的任务最晚在15S之后恢复任务执行,由于集群/缺火处理惩罚是 15秒 一轮询
  • 添加的任务如果不执行首先则要留意 spring.quartz.properties.org.quartz.scheduler.instanceName 设置项是否有设置,这个设置项对应 app 表中的 application 字段
  • 现实任务如有日记出现 任务延长,建议排查宿主机资源是否占满,大概线程数设置是否公道


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表