指定时间执行任务

指定时间执行任务

说明:

	不想通过定时任务来扫码的前提下,要在指定时间执行对应任务。可以通过本文的这种方式来实现。

上代码:

AsyncTaskHandler – 本文核心类:对于要执行任务的处理器


import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;

public class AsyncTaskHandler {

    private ThreadPoolTaskScheduler scheduler;

    public void setScheduler(ThreadPoolTaskScheduler scheduler) {
        this.scheduler = scheduler;
    }

    private final Map<Long, ScheduledFuture<?>> futures = new HashMap<>();

    public void addTask(Runnable task, Date date, Long businessId) {
        // 移除已取消或已完成的任务
        futures.entrySet().removeIf(entry -> entry.getValue().isDone() || entry.getValue().isCancelled());

        ScheduledFuture<?> future = futures.get(businessId);
        if (future != null) {
            future.cancel(true);
        }
        future = this.scheduler.schedule(task, date);
        futures.put(businessId, future);
    }

    public void delTask(Integer taskType, Long businessId) {
        final ScheduledFuture<?> future = futures.get(businessId);
        if (future != null) {
            final boolean canceled = future.cancel(true);
            if (canceled) {
                futures.remove(businessId);
            }
        }
    }

}

MyTestScheduleTask 自定义的任务类

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: wumiao
 * @Description: 自定义的任务
 * @Create: 2021-10-19 17:26
 **/
public class MyTestScheduleTask implements Runnable{

    private Long businessId;
    private Date excuteTime;

    public MyTestScheduleTask(Long businessId, Date excuteTime) {
        this.businessId = businessId;
        this.excuteTime = excuteTime;
    }

    @Override
    public void run() {
        //这里放置要执行的任务代码
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("任务执行了 执行时间:" + sdf.format(date));
    }
}

task-beans.xml 添加配置文件,给AsyncTaskHandler设置属性

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="threadPoolTaskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
        <property name="poolSize" value="5"/>
    </bean>
    <bean id="asyncTaskHandler" class="com.wu.springbootfileupload.handler.AsyncTaskHandler" >
        <property name="scheduler" ref="threadPoolTaskScheduler"/>
    </bean>
</beans>

实验

    @RequestMapping("/scheduler/add")
    public String scheduler(@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date date) {
        Long businessId = 1L;
        MyTestScheduleTask task = new MyTestScheduleTask(businessId, date);
        asyncTaskHandler.addTask(task, date, businessId);
        return "ok";
    }

进行接口调用
在这里插入图片描述
查看控制台:
在这里插入图片描述

搞定!

好的,我理解了你的问题。你想知道如何在C# Furion中指定一个特定的时间执行任务。 在C# Furion中,你可以使用.NET Framework中的`System.Timers.Timer`类来实现定任务。你可以创建一个`Timer`对象,并设置它的`Interval`属性为`0`,然后在`Elapsed`事件中检查当前时间是否等于或超过指定时间,如果是,则执行任务。 以下是一个示例代码,展示如何在C# Furion中指定时间执行任务: ``` csharp using System; using System.Timers; class Program { static void Main() { // 创建一个 Timer 对象 Timer timer = new Timer(); // 设置 Timer 的间隔为 0 毫秒 timer.Interval = 0; // 设置 Timer 的 AutoReset 属性为 false,以便 Timer 只触发一次 timer.AutoReset = false; // 设置要执行任务时间 DateTime taskTime = new DateTime(2022, 12, 31, 23, 59, 59); // 添加 Timer 的 Elapsed 事件处理程序 timer.Elapsed += (sender, e) => { // 检查当前时间是否等于或超过任务时间 if (DateTime.Now >= taskTime) { // 到达任务时间执行任务 Console.WriteLine("任务已经开始执行!"); } else { // 如果当前时间还没到达任务时间,重新启动 Timer timer.Start(); } }; // 启动 Timer timer.Start(); // 阻塞主线程,以便 Timer 有足够时间触发 Elapsed 事件 Console.ReadLine(); } } ``` 在这个示例代码中,我们首先创建了一个`Timer`对象,并将它的`Interval`属性设置为`0`,表示让`Timer`立即触发`Elapsed`事件。然后,我们设置了要执行任务时间,并添加了`Elapsed`事件的处理程序。在`Elapsed`事件中,我们检查当前时间是否等于或超过指定时间。如果是,我们就执行任务。如果还没有到达任务时间,我们就重新启动`Timer`,以便在到达任务时间再次触发`Elapsed`事件。 当然,这只是一个简单的示例,你可以根据你的具体需求来修改代码。但这个示例将会给你提供一个基本的思路,来在C# Furion中指定时间执行任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值