当前位置:
首页
文章
后端
详情

以单个数字开头的 Java 字符串属性值被截断

以单个数字开头的 Java 字符串属性值(例如,像“0 30 */1 * * ?”这样的 CRON 计划)被截断为第一个数字。Java 将截断任何以数字开头、后跟空格的属性值字符串。这个技巧有一个带有 Spring Scheduled 任务的小项目,它使用 CRON 计划来演示问题和解决方案。

简介

当尝试使用环境变量参数化 Spring 任务的 CRON 计划时,我遇到了一个问题,即未从属性接收完整计划,而仅在第一个值为数字的情况下。搜索谷歌给了我零个我的问题类型的例子,所以我是靠自己的。

我找到的解决方案涉及为计划的每个部分使用单独的环境变量。

使用代码

附加的基于 Maven 的项目是一个简单的项目,其中 Spring 任务会将当前时间打印到控制台。我使用 Intellij 的 IDEA,但您应该能够将其调整到 Eclipse 或您喜欢的任何其他 IDE。

任务类是:

public class ScheduledTasks {

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(cron ="${cron.schedule}")
    public void reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }
}

在我的 中application.properties,我最初从单个环境变量设置时间表:

cron.schedule = ${test_cron}

如果我使用*/5 * * * * ?环境变量“ test_cron”中设置的“ ”(每 5 秒)的CRON 计划运行此程序,我会得到预期的结果:

2021-04-29 12:17:50.437  INFO 22420 --- [           main] o.s.s.c.ThreadPoolTaskScheduler
          : Initializing ExecutorService 'taskScheduler'
2021-04-29 12:17:50.480  INFO 22420 --- [           main] c.e.s.SchedulingTasksApplication
         : Started SchedulingTasksApplication in 2.441 seconds (JVM running for 3.931)
2021-04-29 12:17:55.008  INFO 22420 --- [   scheduling-1] c.e.schedulingtasks.ScheduledTasks
       : The time is now 12:17:55
2021-04-29 12:18:00.014  INFO 22420 --- [   scheduling-1] c.e.schedulingtasks.ScheduledTasks
       : The time is now 12:18:00
2021-04-29 12:18:05.005  INFO 22420 --- [   scheduling-1] c.e.schedulingtasks.ScheduledTasks
       : The time is now 12:18:05

但是,如果我以​“ 0 25 * * * ?”​(在过去 25 分钟)的时间表运行它,我会收到错误消息,指出我的时间表无效并且其中只有零:

Encountered invalid @Scheduled method 'reportCurrentTime': For input string: ""0"

为了解决这个问题,我更改了应用程序属性,以便在​Environment​每个计划部分使用一个变量,中间有一个空格:

cron.schedule = ${cron_sec} ${cron_min} ${cron_hr} ${cron_day} ${cron_mth} ${cron_wk}

并在每个环境变量设置为所需值的情况下运行它。类似于上面失败的例子:

cron_sec=0
cron_min=30
cron_hr=*
cron_day=*
cron_mth=*
cron_wk=*

我得到了预期的输出:

2021-04-29 12:29:25.539  INFO 22896 --- [           main] c.e.s.SchedulingTasksApplication
         : Started SchedulingTasksApplication in 3.677 seconds (JVM running for 5.441)
2021-04-29 12:30:00.003  INFO 22896 --- [   scheduling-1] c.e.schedulingtasks.ScheduledTasks
       : The time is now 12:30:00

如果这篇文章可以帮助其他人解决此类问题,那么我的工作就完成了!

免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统