2016-08-29 2 views
0

У меня есть веб-приложение, которое предполагается запустить запланированный код:Java Spring Запланированное задание не работает

package com.myproject.daemon.jobs; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.scheduling.annotation.Scheduled; 
import org.springframework.stereotype.Component; 

@Component 
public class MyDaemonJob { 

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

    @PostConstruct 
    public void init() { 
     log.info("MyDaemonJob is intialized "); 
    } 

    @Scheduled(fixedDelay = 1000) 
    public void startDaemon() { 
     try { 
      log.info("MyDaemonJob is running ..."); 
     } catch (Exception e) { 
      log.error("Encountered error running scheduled job: " + e.getMessage()); 
     } 
    } 
} 

Это, безусловно, отражается как Spring бина и инициализирован, как я могу видеть из журнала PostConstruct. Однако метод с аннотацией @Scheduled никогда не работает, хотя он должен запускаться каждые 1 секунду.

Вот приложение контекст XML

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

<context:component-scan base-package=" 
    com.myproject.daemon.jobs, 
    com.myproject.product" /> 

</beans> 
+2

ли это весне Ботинок? У вас есть аннотация @EnableScheduling в любом классе конфигурации? –

+0

Нет, это не приложение загрузки весны. Это веб-приложение, развернутое как файл войны в tomcat. – user1493140

+0

. Покажите нам код spring.xml – CrazyJavaLearner

ответ

2

Спасибо всем за быструю помощь. Это действительно полезно.

код начал работать после того, как я добавил класс конфигурации с аннотациями, как показано ниже -

package com.myproject; 

import org.springframework.context.annotation.Configuration; 
import org.springframework.scheduling.annotation.EnableScheduling; 

@Configuration 
@EnableScheduling 
public class AppConfig { 
    // various @Bean definitions 
} 
+0

Взять в счет, что @Scheduled процессор примечаний (ScheduledAnnotationBeanPostProcessor) разбит весной 4.1.9. Он обнаруживает аннотированные методы, но не запускает задачи. Обходным путем является запуск метода onApplicationEvent, который правильно запускает задачи: applicationContext.getBean (ScheduledAnnotationBeanPostProcessor.class) .onApplicationEvent (новый ContextRefreshedEvent (applicationContext)). Он исправлен с весны 4.2+ – antgar9

0

Чтобы использовать @scheduled аннотацию необходимо включить пружинный имя задачи в пространство весной боба файла конфигурации XML. Вы можете обновить следующие именаpac e в файле конфигурации xml.

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:task="http://www.springframework.org/schema/task" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-4.0.xsd 
         http://www.springframework.org/schema/task 
         http://www.springframework.org/schema/task/spring-task-4.1.xsd"> 

В противном случае, если вы используете приложение пружинной загрузки вы можете включить в вашем конфигурационном файле @EnableScheduling