不重启项目,动态改变cron定时器的执行时间

在OA项目中,实现了用户通过前端自由修改钉钉推送的定时任务时间。无需重启项目,通过停止原有定时器,注册新定时器来实现动态变更。代码逻辑包括查询数据库初始化定时器,使用Map记录定时器状态,修改时间时调用特定方法更新定时器并在Map中覆盖旧记录。已知问题包括服务器上有时执行几次后停止,后续会更新解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在做oa项目的钉钉推送功能的时候,组长让我增加一个定时推送的功能,最好能实现用户在前端能自由修改时间。但是网上查了发现很多方法都需要重启项目才实现,后来从一篇博客上翻到说可以换一种思路,并不是去修改定时器时间,可以通过将之前的定时器停止注销,然后重新开启一个新的定时器来实现。

先上代码吧,基本上除了去掉了部分注入和方法参数的处理过程,整体逻辑都还是在的

/**
 * 钉钉消息推送定时器Controller
 *
 * @author zjs
 * @since 2019-03-21
 */
@Controller
@EnableScheduling
public class DingdingTimingController implements SchedulingConfigurer {
    private final static Logger logger = LoggerFactory.getLogger(DingdingTimingController.class);
    /**
     * (安装维护)信息
     */
    @Transactional(readOnly = false)
    public String timerOfOptRepair(DingdingTimer dingdingTimer) {
        try {
            //处理变量参数
            List<Object> result = dealResult();
            //处理文本整体
            String content = dealContent();
            dingdingService.sendMsg();
            logger.info("安装维护信息,钉钉定时推送成功);
            return Constants.SYSDIC_COMMON_SUCCESS;
        } catch (Exception e) {
    
### 设置和使用 Cron 定时器 #### 配置 Linux 中的 Cron 定时器 在 Linux 系统中,`cron` 是一个常用的守护进程,负责管理周期性的任务调度。通过 `crontab` 命令可以编辑用户的定时任务列表[^2]。 以下是配置 Cron 定时器的具体方式: 1. **查看当前用户的 Cron 任务** 使用以下命令查看当前用户已有的 Cron 任务: ```bash crontab -l ``` 2. **编辑 Cron 任务** 编辑当前用户的 Cron 任务列表: ```bash crontab -e ``` 这会打开默认的文本编辑器,在其中添加新的定时任务条目。 3. **Cron 表达式的格式** Cron 表达式由六个字段组成(如果包含年份则为七个),各字段含义如下: | 字段位置 | 含义 | 可选范围 | |----------|--------------|----------------| | 1 | 秒 | 0-59 | | 2 | 分钟 | 0-59 | | 3 | 小时 | 0-23 | | 4 | 日 | 1-31 | | 5 | 月 | 1-12 | | 6 | 星期几 | 0-7 (0 和 7 都表示星期日) | 示例表达式解释: - `"* * * * *"`:每分钟执行一次。 - `"0 0 * * *"}`:每天凌晨执行一次。 - `"0 0 * * 0"`:每周日凌晨执行一次。 4. **保存并退出** 在编辑完成后保存文件,系统会自动加载新配置。 --- #### Golang 中的 Ticker 和 Timer 实现定时功能 除了系统的 Cron 工具外,Golang 提供了内置的时间工具包 `time` 来实现简单的定时任务。该包中的两个核心组件分别是 `timer` 和 `ticker`[^1]。 - **Timer**:用于单次延迟操作。 ```go package main import ( "fmt" "time" ) func main() { timer := time.NewTimer(2 * time.Second) <-timer.C fmt.Println("Timer expired after 2 seconds.") } ``` - **Ticker**:用于定期触发事件。 ```go package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(1 * time.Second) done := make(chan bool) go func() { for t := range ticker.C { fmt.Println("Tick at", t) } }() time.Sleep(5 * time.Second) ticker.Stop() fmt.Println("Ticker stopped.") } ``` 尽管 Go 的标准库提供了上述两种机制,但对于更复杂的定时任务需求(如支持 Cron 表达式),通常需要引入第三方库,例如 `robfig/cron`。 --- #### 动态调整 Cron 定时器执行时间 当需要动态更改定时器执行时间重启整个应用程序时,可以通过销毁旧的定时器实例并创建一个新的实例来实现这一目标[^4]。 示例代码展示如何动态更新定时器: ```go package main import ( "fmt" "sync" "time" "github.com/robfig/cron/v3" ) var mu sync.Mutex var c *cron.Cron func initCron(spec string) { mu.Lock() defer mu.Unlock() if c != nil { c.Stop() } c = cron.New() _, err := c.AddFunc(spec, func() { fmt.Println("Task executed!") }) if err != nil { panic(err) } c.Start() } func main() { initCron("*/5 * * * *") // 每五分钟运行一次 time.Sleep(10 * time.Second) initCron("*/10 * * * *") // 修改为每十分钟运行一次 } ``` --- #### Spring Framework 中的 Cron 注解 在 Java 开发领域,Spring 提供了便捷的方式来定义基于 Cron 表达式的定时任务。开发者只需在方法上加上 `@Scheduled(cron="...")` 即可完成配置[^5]。 示例代码: ```java @Component public class ScheduledTasks { @Scheduled(cron = "0 0 2 * * ?") public void scheduledTask() { System.out.println("This task runs every day at 2 AM."); } } ``` 需要注意的是,Spring 的 Cron 支持六位表达式,包括年份字段。 --- ### 总结 无论是操作系统层面还是编程语言内部,Cron 定时器都提供了一种灵活的方式来进行任务调度。具体选择取决于实际应用场景以及技术栈的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值