在春季访问计划任务

2022-09-02 22:26:29

我在Spring的任务调度程序中安排了几项任务:

<task:scheduled-tasks>
    <task:scheduled ref="task1" method="run"
        cron="0 0 */0 * * *" />
    <task:scheduled ref="task2" method="run"
        cron="0 0 */30 * * *" />
</task:scheduled-tasks>

<task:scheduler id="scheduler" pool-size="10" />

如何访问计划任务列表并从应用程序上下文中检索元信息(例如下一个执行时间)?

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
ThreadPoolTaskScheduler scheduler = (ThreadPoolTaskScheduler)context.getBean("scheduler");
//... how to continue from here?

答案 1

春季没有公共API可以做到这一点。

相关:


答案 2

我刚刚想通了这一点

从这里开始,获取计划的内容。

    ThreadPoolTaskScheduler xScheduler = (ThreadPoolTaskScheduler)this.taskScheduler;

    ScheduledThreadPoolExecutor xService = (ScheduledThreadPoolExecutor)xScheduler.getScheduledExecutor();

    BlockingQueue<Runnable> queue = xService.getQueue();
    Object[] scheduledJobs = queue.toArray();

如果此数组在调试器中查看实例以找到所需的内容。

然后编写这样的反射代码,以获得Spring和Java中隐藏的API。请参阅设置 可访问 这是获得这些私人物品的唯一方法。您可能需要使用不同的公共类来获取某些私有字段,查看api文档并在eclipse中查看这些类的源代码。

            Method delayM = obj.getClass().getDeclaredMethod("getDelay", TimeUnit.class);
            delayM.setAccessible(true);
            // delayM = obj.getClass().getDeclaredMethod("getDelay", TimeUnit.class);
            Long delay = (Long)delayM.invoke(obj, new Object[] { tu } );

触发器和根可运行位于此对象的可调用字段中,ReschedulingRunnable的实例不是公共类,询问Spring他们为什么这样做。您可以从委托错误处理中取出委托可通过反射运行。


推荐