Достъп до планирани задачи през пролетта

Имам няколко планирани задачи в програмата за планиране на задачи на 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?

person achingfingers    schedule 29.07.2014    source източник


Отговори (2)


В Spring няма публичен API, който да направи това.

Свързани:

person Sotirios Delimanolis    schedule 29.07.2014

Току що разбрах това

започнете с това, за да получите планираното.

    ThreadPoolTaskScheduler xScheduler = (ThreadPoolTaskScheduler)this.taskScheduler;

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

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

Ако този масив погледнете екземпляра в програмата за отстраняване на грешки, за да намерите какво ви трябва.

След това напишете код за отразяване като този, за да стигнете до скритите API в Spring и Java. Вижте комплекта Достъпно, това е единственият начин да стигнете до тези лични предмети. Може да се наложи да използвате различни публични класове, за да стигнете до определени частни полета, да разгледате 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 } );

Тригерът и root runnable са в полето за извикване на този обект, екземпляр на ReschedulingRunnable, който не е публичен клас, попитайте Spring защо са направили това. Можете да получите делегата от DelegatingErrorHandlingRunnable с отражение.

person Randy Poznan    schedule 20.11.2015