您当前所在位置:首页攻略Quartz集群增强版_00.How to use?(如何使用)

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

更新:2024-11-12 09:48:31编辑:游戏资讯归类:攻略

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私服建议放到私服
    <dependency>
        <groupId>org.quartz-scheduler.internal</groupId>
        <artifactId>quartz-client</artifactId>
        <version>2.3.2</version>
        <!-- 这是本地引入,建议放到私服-->
        <scope>system</scope>
        <systemPath>${pom.basedir}/src/main/resources/lib/quartz-client-2.3.2.jar</systemPath>
    </dependency>
  • 启动类需要排除自动装配
// 这一行是重点!
@SpringBootApplication(exclude = {QuartzAutoConfiguration.class})
public class MeeAdminApplication {
	/**
	 * 日志
	 */
	private static final Logger LOG= LoggerFactory.getLogger(MeeAdminApplication.class);

	public static void main(String[] args)throws Exception {
		ConfigurableApplicationContext application = SpringApplication.run(MeeAdminApplication.class, args);
		Environment env = application.getEnvironment();
		String ip = InetAddress.getLocalHost().getHostAddress();
		String port = env.getProperty("server.port");
		String path = env.getProperty("server.servlet.context-path");
		LOG.info("\n\t----------------------------------------------------------\n\t" +
				"Application MeeAdminApplication is running!\n\t" +
				"Local: \t\thttp://localhost:" + port + path + "/\n\t" +
				"External: \thttp://" + ip + ":" + port + path + "/\n\t" +
				"----------------------------------------------------------");
	}

}
  • 需要配置一个实例以使用
@Service
public final class QrtzJobServiceImpl implements QrtzJobService {

    /**
     *   日志
     */
    private static final Logger LOG = LoggerFactory.getLogger(QrtzJobServiceImpl.class);
    
    /**
     * quartz定时任务api
     */
    private final Scheduler scheduler;

    public QrtzJobServiceImpl(DataSource dataSource) {
        this.scheduler = new StdScheduler(dataSource);
    }
}
  • 调用sdk
    @Override
    public MeeResult<Integer> updateJobState(String job_id,String state) {
        Object[] result = scheduler.updateJobStateInAll(job_id,state);
        int updateCount = (int)result[0];
        if(updateCount>0){
            return ResultBuild.build(updateCount);
        }else{
            return ResultBuild.fail((String)result[1]);
        }
    }

Scheduler 提供了多种多样的api,注意部分接口的区别:

如果 管理端 执行端 一体 则无需引入client依赖( quartz-client ),也无需在启动类中排除自动装配( QuartzAutoConfiguration ),使用sdk也无需使用构造方式传入database,仅此即可:

    @Autowired
    private Scheduler scheduler;

执行端开发配置及集成

  • 引入依赖同时排除原生Quartz
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
            <version>${spring-boot-current.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.quartz-scheduler</groupId>
                    <artifactId>quartz</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler.internal</groupId>
            <artifactId>quartz-core</artifactId>
            <version>2.3.2</version>
            <!-- 这是本地引入,建议放到私服-->
            <scope>system</scope>
            <systemPath>${pom.basedir}/src/main/resources/lib/quartz-core-2.3.2.jar</systemPath>
        </dependency>
  • 添加依赖配置项
### ----------- quartz ------------------
spring.quartz.job-store-type=jdbc
spring.quartz.properties.org.quartz.jobStore.class=org.springframework.scheduling.quartz.LocalDataSourceJobStore
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=6000
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.jdbcjobstore.impl.org.quartz.StdJDBCDelegate
spring.quartz.properties.org.quartz.jobStore.isClustered=true
# 表名前缀
spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
spring.quartz.properties.org.quartz.scheduler.instanceName=${spring.application.name}
#spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.impl.MeeThreadPool
# 线程数配置
spring.quartz.properties.org.quartz.threadPool.threadCount=10
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
# 綫程继承初始化线程的上下文类加载器
spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
#Whether to enable pessimistic lock to control trigger concurrency in the cluster 是否启用悲观锁来控制集群中的触发并发
spring.quartz.properties.org.quartz.jobStore.acquireTriggersWithinLock=true

配置项里面 要注意线程数的配置,如果使用的 MeeThreadPool threadCount 为最大线程数,核心线程数 threadCount-2 ,最少为2,具体多少按实际CPU核心个数以及是否是IO密集型还是CPU密集型来配置即可~
其次要注意 tablePrefix 如果表名有变更则按照变更后的表名 前缀 配置即可

  • 定义一个任务
    • 如果使用的是 spring 提供的 QuartzJobBean 来开发:
      import com.mee.quartz.util.DateUtil;
      import org.quartz.JobExecutionContext;
      import org.quartz.JobExecutionException;
      import org.quartz.impl.QrtzExecute;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.scheduling.quartz.QuartzJobBean;
      
      import javax.sql.DataSource;
      
      
        public class ATestJob extends QuartzJobBean {
      
        private static final Logger log = LoggerFactory.getLogger(ATestJob.class);
      
          @Override
          protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
              try {
                  log.info("===>ATestJob::executeInternal {}-{} : {}-{}<===" ,context.getJobId(),context.getExecuteId(),context.getJobType(),context.getJobClassName());
              } catch (Exception e) {
                  throw new JobExecutionException(e);
              }
          }
      
      }
    
    • 如果使用的是 Quartz 提供的 Job接口 来开发,也可:
      import org.quartz.Job;
      import org.quartz.JobExecutionContext;
      import org.quartz.JobExecutionException;
      import org.quartz.impl.QrtzExecute;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      
      import java.util.concurrent.TimeUnit;
      
      public class Job01TestService  implements Job {
      
      private static final Logger LOGGER = LoggerFactory.getLogger(Job01TestService.class);
      
      @Override
      public void execute(JobExecutionContext context) throws JobExecutionException {
          LOGGER.info("=>>{}-{}.{}-{}",context.getJobId(),context.getExecuteId(),context.getJobType(),context.getJobClassName());
      }
    }
    
    

以上两种方式皆可,需要注意的是,不管是继承 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 字段
  • 实际任务如有日志出现 任务延迟,建议排查宿 主机资源 是否占满,或者 线程数 配置是否合理

以上就是电脑114游戏给大家带来的关于Quartz集群增强版_00.How to use?(如何使用)全部内容,更多攻略请关注电脑114游戏。

电脑114游戏-好玩游戏攻略集合版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

创造厨房 不破不立的《天下4》,点出了天下IP经久不衰的秘诀