0
点赞
收藏
分享

微信扫一扫

延时任务是什么

延时任务怎么做: 生成订单30分钟未支付,则自动取消 生成订单10分组后,给用户发短信,发邮箱

定时任务和延时任务的区别: 定时任务可以明确确定在某个时间发生,例如每天凌晨2点数据备份,每隔10分钟查询新消息。 具有周期性,重复性。一般是同时处理多个任务,例如,每天晚上12点,你可能需要执行一系列的任务,如备份数据、清理日志、更新系统等。这些任务通常会被打包在一起,作为一个定时任务在指定的时间点执行。 延时任务依赖于某个事件发生后,再延迟一段时间完成某些操作,而这个事件的发生具体时间是不确定的。 不具有周期、规律性。 一般是同时处理单个任务,例如,用户在网页上点击了一个按钮,你可能需要在3秒后显示一个提示框。这个提示框的显示就是一个延时任务,它只包含一个任务,即显示提示框。这个任务在用户点击按钮的事件发生后,经过一段延迟时间后执行。

1.数据库轮询: 通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作。 实现方式:有许多种 例如使用quartz dependency 或者基于spring框架 下面是demo

quartz quartz 1.5.2

public void executeJob(JobExecutionContext context) throws JobExecutionException { System.out.println("去数据库轮询"); }

public static void main(String[] args) throws Exception {
    // 创建任务
    JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
            .withIdentity("job1", "group1").build();
    // 创建触发器 每100秒钟执行一次
    Trigger trigger = TriggerBuilder
            .newTrigger()
            .withIdentity("trigger1", "group3")
            .withSchedule(
                    SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(100).repeatForever())
            .build();
    Scheduler scheduler = new StdSchedulerFactory().getScheduler();
    // 将任务及其触发器放入调度器
    scheduler.scheduleJob(jobDetail, trigger);
    // 调度器开始调度任务
    scheduler.start();
}

首先,你需要在Spring Boot的主配置类中启用定时任务: java Copy code import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement;

@Service public class DatabasePollingService { @Autowired private DataSource dataSource;

@Scheduled(fixedRate = 5000) // 每5秒执行一次
public void pollDatabase() {
    try (Connection connection = dataSource.getConnection();
         Statement statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery("SELECT * FROM student")) {

        while (resultSet.next()) {
            // 处理结果集
            System.out.println(resultSet.getString("name"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

} 这里也可以使用各种如:mybatis等等 方法和写service是一样的 只需要加@Scheduled(fixedRate = 5000)这样一个配置即可生效 数据库轮询是一种常见的数据同步策略,它有以下的优缺点:

优点:

简单易实现:轮询是一种简单的策略,只需要定期查询数据库即可,不需要复杂的事件处理或消息队列。

可控性强:你可以自由地控制轮询的频率和时间,以满足你的具体需求。

兼容性好:轮询不依赖于数据库的特定特性或版本,因此可以在任何支持SQL查询的数据库上使用。

缺点:

效率低:轮询需要定期查询数据库,即使没有新的数据。这可能会浪费资源,并可能对数据库性能产生影响。

延迟高:轮询的频率决定了数据更新的延迟。如果轮询的频率低,那么新的数据可能需要等待一段时间才能被检测到。具体来说,刚有一条数据更新,这时候你刚轮寻完,那么就必须等到下次轮询才能查到该数据。也就是最大的延迟时长就是你轮询的间隔。

可能会错过数据:如果两次轮询之间,数据发生了变化并又恢复到原来的状态,那么这个变化可能会被错过。

并发问题:如果有多个进程或线程同时轮询数据库,可能会出现并发问题。 总结来说:容易实现,要求快速开发并且项目小时,直接采用该方案。项目大不会用这种方案。

举报

相关推荐

0 条评论