• Quartz一次配置


    1. 配置执行器的线程池

    public ThreadPoolTaskExecutor defaultThreadPool() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            //核心线程数目 目前支付服务不需要太多的核心线程
            executor.setCorePoolSize(12);
            //指定最大线程数
            executor.setMaxPoolSize(32);
            //队列中最大的数目
            executor.setQueueCapacity(16);
            //线程名称前缀
            executor.setThreadNamePrefix("payServiceThreadPool_");
            //对拒绝task的处理策略(当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略)
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            //线程空闲后的最大存活时间
            executor.setKeepAliveSeconds(60);
            //当调度器shutdown被调用时等待当前被调度的任务完成 setAwaitTerminationSeconds(3) 则是3s后强制关闭
            executor.setWaitForTasksToCompleteOnShutdown(Boolean.TRUE);
            //核心线程保持存活状态(减少newThread的消耗)
            executor.setAllowCoreThreadTimeOut(Boolean.FALSE);
            //线程所使用的缓冲队列
            executor.setQueueCapacity(80);
            //加载
            executor.initialize();
            return executor;
        }

    2.配置Properties文件

    private Properties quartzProperties() {
            Properties prop = new Properties();
            // 调度器实例的名字
            prop.put("quartz.scheduler.instanceName", "PailieWalletScheduler");
            // 调度器实例的ID
            prop.put("org.quartz.scheduler.instanceId", "AUTO");
            // 跳过更新检查
            prop.put("org.quartz.scheduler.skipUpdateCheck", "true");
            prop.put("org.quartz.scheduler.jmx.export", "true");
    
            // org.quartz.jobStore.class属性为JobStoreTX,将任务持久化到数据中。因为集群中节点依赖于数据库来传播Scheduler实例的状态,
            // 你只能在使用JDBC JobStore时应用Quartz集群
            prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
            prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
            // 选择对应的数据库版本,将数据库创建出来 quartz数据表的前缀
            prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
            // 是否支持集群
            prop.put("org.quartz.jobStore.isClustered", "true");
    
            // Scheduler实例检入到数据库中的频率(单位:毫秒)。Scheduler检查是否其他的实例到了它们应当检入的时候未检入;
            // 这能指出一个失败的Scheduler实例,且当前 Scheduler会以此来接管任何执行失败并可恢复的Job。通过检入操作,
            // Scheduler 也会更新自身的状态记录。clusterChedkinInterval越小,Scheduler节点检查失败的Scheduler实例就越频繁。
            // 默认值是 15000 (即15 秒)
            prop.put("org.quartz.jobStore.clusterCheckinInterval", "20000");
            // 这是 JobStore 能处理的错过触发的 Trigger 的最大数量。
            // 处理太多(超过两打) 很快会导致数据库表被锁定够长的时间,这样就妨碍了触发别的(还未错过触发) trigger 执行的性能。
            prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
            // 在Trigger被认为是错过触发之前,Scheduler 还容许 Trigger 通过它的下次触发时间的毫秒数(默认60000毫秒)
            prop.put("org.quartz.jobStore.misfireThreshold", "120000");
            // 值为 true 时告知 Quartz(当使用 JobStoreTX 或 CMT) 调用 JDBC 连接的
            // setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE) 方法。
            // 这有助于阻止某些数据库在高负载和长时间事物时锁的超时
            prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
            // 这必须是一个从 LOCKS 表查询一行并对这行记录加锁的 SQL 语句。
            // 假如未设置,默认值就是 SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE,这能在大部分数据库上工作。
            // {0} 会在运行期间被前面你配置的 TABLE_PREFIX 所替换。
            prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE");
            // quartz的日志插件 打印scheduler容器的运行日志 (可以关闭)
            // prop.put("org.quartz.plugin.triggHistory.class", "org.quartz.plugins.history.LoggingJobHistoryPlugin");
            // 捕获JVM终止的事件,并在调度程序上调用shutdown
            prop.put("org.quartz.plugin.shutdownhook.class", "org.quartz.plugins.management.ShutdownHookPlugin");
            prop.put("org.quartz.plugin.shutdownhook.cleanShutdown", "true");
    
            return prop;
        }

    3.配置执行器

     @Bean(name = "scheduler")
        public SchedulerFactoryBean schedulerFactory(DataSource dataSource, ThreadPoolTaskExecutor defaultThreadPool) {
    
            SchedulerFactoryBean factory = new SchedulerFactoryBean();
            factory.setDataSource(dataSource);
    
            factory.setQuartzProperties(quartzProperties());
    
            factory.setSchedulerName("XpqbScheduler");
    
            factory.setTaskExecutor(defaultThreadPool);
            // 在SchedulerFactoryBean初始化完成后,延迟多少秒启动Scheduler,默认为0,表示马上启动。
            factory.setStartupDelay(1);
            factory.setApplicationContextSchedulerContextKey("applicationContextKey");
            // 可选,QuartzScheduler
            // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
            factory.setOverwriteExistingJobs(true);
            // SchedulerFactoryBean在初始化后是否马上启动Scheduler,默认为true。如果设置为false,需要手工启动Scheduler
            factory.setAutoStartup(true);
    
            return factory;
        }
  • 相关阅读:
    【博客申明】
    OAF客制化代码导出页面数据到Excel文件
    OAF调用JS代码
    Java冒泡排序
    Java二分查找代码
    Java 在某一个时间点定时执行任务(转载)
    Oracle 常用SQL
    Oracle数据字典
    spring3.0事务管理配置
    由override 和 overload 引发的学习感悟
  • 原文地址:https://www.cnblogs.com/mlfz/p/10592879.html
Copyright © 2020-2023  润新知