Ⅲ1024 2024-03-11 16:07 采纳率: 68.4%
浏览 8
已结题

Java后端定时任务

Java定时任务
最近在开发中需要做一个功能 就是定时任务 比如 设置一个活动 开始时间是 2024-03-11 16:00:00 活动结束时间是2024-03-11 17:00:00
目前实际企业开发中大家是怎么做的呢 本人是用rabbitMQ消息队列完成 总感觉有点不靠谱 而且时间计算不太精确 因为需要整点开始 还要考虑到活动是否延长等一系列问题 用消息队列 是接受到消息 判断当前任务是否有延长 如果活动延长了 计算出延长值 再次将消息投递 这里用的都是时间戳进行计算 会有误差
想请教一下 大家实际开发中怎么完成这类需求的

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-11 16:08
    关注

    引自免费微信小程序:皆我百晓生

    在实际的企业级Java后端开发中,处理定时任务通常有多种实现方式。针对您的需求(活动定时开始、可能的延期以及对时间精确度的要求),推荐使用更稳定且精准的定时任务调度库Quartz Scheduler或Spring框架自带的Task Scheduling。

    使用Quartz Scheduler

    Quartz是广泛应用于Java应用中的一个强大、灵活的开源作业调度框架。它可以精确地按需执行任务,并支持复杂的调度需求,如cron表达式。

    以下是一个使用Quartz的基本示例:

    // 引入相关依赖
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>最新版本号</version>
    </dependency>
    
    // 创建Job类,用于封装任务逻辑
    public class MyEventJob implements Job {
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            // 这里编写活动开始和结束的具体业务逻辑
            // 可以从数据库或其他持久化层获取活动状态及延长时间等信息
        }
    }
    
    // 在启动时配置调度器
    public class QuartzInitializer {
    
        public static void setupScheduler() {
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            try {
                Scheduler scheduler = schedulerFactory.getScheduler();
                scheduler.start();
    
                // 创建Trigger,指定开始时间和结束时间
                JobDetail job = JobBuilder.newJob(MyEventJob.class)
                        .withIdentity("myEventJob", "group1")
                        .build();
    
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 0 16 * * ? 2024"); // 按照你的需求调整cron表达式,此处表示每天16点开始
                Trigger trigger = TriggerBuilder.newTrigger()
                        .forJob(job)
                        .withIdentity("eventStartTrigger", "group1")
                        .withSchedule(scheduleBuilder)
                        .startAt(Date.from(LocalDateTime.of(2024, 3, 11, 16, 0).toInstant(ZoneOffset.UTC))) // 设置活动开始时间
                        .build();
    
                // 如果需要考虑活动延长的情况,可以在execute方法中动态修改trigger的下次执行时间,或者创建新的trigger来替代旧的
    
                scheduler.scheduleJob(job, trigger);
            } catch (SchedulerException e) {
                // 处理异常
            }
        }
    }
    
    // 应用启动时调用setupScheduler初始化调度器
    

    使用Spring Task Scheduling

    如果你的应用基于Spring框架,可以利用其内置的Task Execution and Scheduling模块:

    // 引入Spring框架并启用@EnableScheduling注解
    @Configuration
    @EnableScheduling
    public class AppConfig {
        // ...
    }
    
    // 创建一个带有@Scheduled注解的任务类
    @Service
    public class EventService {
    
        @Scheduled(cron = "0 0 16 * * ? 2024") // 根据需求调整cron表达式
        public void startEvent() {
            // 活动开始时的业务逻辑
            // 同样在此处检查活动是否延期,若延期则可调用其他方法进行处理
        }
    
        // 假设有一个根据活动状态延长的方法
        public void extendEventDuration() {
            // 更新活动结束时间逻辑...
        }
    }
    

    以上两种方案都可以满足您对于定时任务的需求,并且在企业级应用中被广泛应用。对于时间精度问题,Java本身提供了足够精确的时间计算能力,通过使用java.time包下的类,如LocalDateTimeZonedDateTime,可以有效地避免时间戳转换带来的误差。同时,在设计活动延期逻辑时,确保将更新后的结束时间正确设置到任务调度系统中即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 已采纳回答 3月11日
  • 创建了问题 3月11日