Springboot配置多线程定时任务Schedule

Springboot配置多线程定时任务Schedule

2023年7月21日发(作者:)

Springboot配置多线程定时任务Schedule⼀.为什么需要配置多线程定时任务& 多线程定时任务的配置使⽤场景springboot中通过注解 @Scheduled 注解的⽅法都是⼀个定时执⾏的任务, 默认都是单线程的,就算是多个定时任务也是在同⼀个单线程(scheduled-1)中运⾏, 如果其中某⼀个定时任务产⽣了阻塞,那么会导致项⽬中其他所有的定时任务线程都不执⾏。后果⾮常严重,故⽽需要配置多线程定时任务。⼆. 多线程定时任务配置类package uration;import uration;import Scheduling;import lingConfigurer;import PoolTaskExecutor;import ledTaskRegistrar;import ors;@Configuration@EnableScheduling // 开启定时任务public class ScheduledConfiguration implements SchedulingConfigurer{ @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); eadNamePrefix("scheduled@");// 设置定时任务线程名称的前缀 int corePoolSize = 10; // 设置定时任务的核⼼线程数 eduler(eduledThreadPool(corePoolSize,executor)); }}三. 多线程定时器的案例package ;import alkClientFactory;import uration;import ;import sumer;import 4j;import red;import ier;import ;import emplate;import led;import ent;import ption;import ;import s;import it;@Component@Slf4j@Lazy(false)public class CrontabTask { @Autowired SmtpSendMailer smtpSendMailer; // 线程池对象 // 定时任务1,⽤于测试 @Scheduled(fixedDelay = 3000) public void test1() throws IOException { Thread thread = tThread(); ("test定时任务处理线程 : "+e()); } // 定时任务2,⽤于测试 @Scheduled(fixedDelay = 5000) public void test2() throws IOException { Thread thread = tThread(); ("test1定时任务处理线程 : "+e()); } // 定时任务3,监听beanstalk @Scheduled(fixedDelay = 1) public void beanstalk() { Thread thread = tThread(); ("BeanstalkListenerTask处理线程 : "+e()); Configuration config = new Configuration(); viceHost("8.129.0.115"); vicePort(11300); BeanstalkClientFactory factory = new BeanstalkClientFactory(config); JobConsumer consumer = JobConsumer("smtp-mail"); Job job = null; while(true){ try{ job = eJob(30); }catch(Throwable e){ continue; } if ((job)) continue; String jobString = new String(a()); ("beanstalk处理任务的线程名称:"+e() + ";线程id是:"+()); // if(!d(jobString)) continue;// 由于客户端是其他语⾔编写,故要求是json数据格式 n(jobString); iler(); Job(()); // 删除任务 } } @Autowired @Qualifier("default") RedisTemplate redisTemplate; // 定时任务4监听redis list 实现的消息队列 @Scheduled(fixedDelay = 2) public void redisList(){ n("redis list 监听消息队列"); Thread thread = tThread(); Map obj = null; while(true){ try{ obj = (Map) List().rightPop("list",3, S); }catch(Throwable e){ // 要求客户端发送的数据必须是 合法的json字符串. n("redis list数据⾮法"); continue; } if((obj)) continue; n(obj); ("redis list执⾏的线程名称:"+e()); } }}

发布者:admin,转转请注明出处:http://www.yc00.com/news/1689929611a295187.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信