1、ylb
1.1 application.yml
在task模块下的resources/application.yml,添加配置信息(spring和dubbo):
spring:
application:
name: micr-task
dubbo:
scan:
base-packages: com.bjpowernode.task
registry:
address: zookeeper://localhost:2181
consumer:
timeout: 50000
check: false
retries: 0
1.2 @EnableScheduling
在task模块下的启动类上添加注解(@EnableScheduling),启动定时任务:
package com.bjpowernode;
import com.bjpowernode.task.TaskManager;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableDubbo
//启用定时任务
@EnableScheduling
@SpringBootApplication
public class MicrTaskApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(MicrTaskApplication.class, args);
TaskManager tm = (TaskManager) ctx.getBean("taskManager");
//tm.invokeGenerateIncomePlan();
//tm.invokeGenerateIncomeBack();
tm.invokeKuaiQianQuery();
}
}
1.3 TaskManager类
在task模块task包,创建TaskManager类:
package com.bjpowernode.task;
import com.bjpowernode.api.service.IncomeService;
import com.bjpowernode.common.util.HttpClientUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component("taskManager")
public class TaskManager {
/**
* 定义方法,表示要执行的定时任务功能
* 方法定义的要求:
* 1.public 公共方法
* 2.方法没有参数
* 3.方法没有返回值
* 4.方法的上面加入@Scheduled,设置cron属性,指定时间
*/
/* @Scheduled(cron = "30 37 10 * * ?")
public void testCron(){
System.out.println("执行了定时任务的方法:"+ new Date());
}*/
// @Scheduled(cron = "*/5 * * * * ?")
/* public void testCron(){
System.out.println("执行了定时任务的方法:"+ new Date());
}
*/
@DubboReference(interfaceClass = IncomeService.class, version = "1.0")
private IncomeService incomeService;
/*生成收益计划*/
@Scheduled(cron = "0 0 1 * * ?")
public void invokeGenerateIncomePlan() {
incomeService.generateIncomePlan();
}
/*生成收益返还*/
@Scheduled(cron = "0 0 2 * * ?")
public void invokeGenerateIncomeBack() {
incomeService.generateIncomeBack();
}
/**补单接口*/
// @Scheduled(cron = "0 0/20 * * * ?")
public void invokeKuaiQianQuery(){
try{
String url = "http://localhost:9000/pay/kq/rece/query";
HttpClientUtils.doGet(url);
}catch (Exception e){
e.printStackTrace();
}
}
}
2、ruoyi
2.1 定时配置类
package com.ruoyi.quartz.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import javax.sql.DataSource;
import java.util.Properties;
/**
* 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效)
*
* @author ruoyi
*/
@Configuration
public class ScheduleConfig
{
@Bean
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource)
{
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setDataSource(dataSource);
// quartz参数
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler");
prop.put("org.quartz.scheduler.instanceId", "AUTO");
// 线程池配置
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount", "20");
prop.put("org.quartz.threadPool.threadPriority", "5");
// JobStore配置
prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
// 集群配置
prop.put("org.quartz.jobStore.isClustered", "true");
prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
// sqlserver 启用
// prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
factory.setQuartzProperties(prop);
factory.setSchedulerName("RuoyiScheduler");
// 延时启动
factory.setStartupDelay(1);
factory.setApplicationContextSchedulerContextKey("applicationContextKey");
// 可选,QuartzScheduler
// 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
factory.setOverwriteExistingJobs(true);
// 设置自动启动,默认为true
factory.setAutoStartup(true);
return factory;
}
}
2.2 线程池配置
package com.ruoyi.framework.config;
import com.ruoyi.common.utils.Threads;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 线程池配置
*
* @author ruoyi
**/
@Configuration
public class ThreadPoolConfig
{
// 核心线程池大小
private int corePoolSize = 50;
// 最大可创建的线程数
private int maxPoolSize = 200;
// 队列最大长度
private int queueCapacity = 1000;
// 线程池维护线程所允许的空闲时间
private int keepAliveSeconds = 300;
@Bean(name = "threadPoolTaskExecutor")
public ThreadPoolTaskExecutor threadPoolTaskExecutor()
{
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(maxPoolSize);
executor.setCorePoolSize(corePoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(keepAliveSeconds);
// 线程池对拒绝任务(无线程可用)的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
/**
* 执行周期性或定时任务
*/
@Bean(name = "scheduledExecutorService")
protected ScheduledExecutorService scheduledExecutorService()
{
return new ScheduledThreadPoolExecutor(corePoolSize,
new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
new ThreadPoolExecutor.CallerRunsPolicy())
{
@Override
protected void afterExecute(Runnable r, Throwable t)
{
super.afterExecute(r, t);
Threads.printException(r, t);
}
};
}
}