spring - 중복 - 스프링 스케줄러 예제




Spring이 @Scheduled 메소드를 실행하지 않는 이유는 무엇입니까? (5)

@Scheduled 주석을 사용하여 사용하려고하기 때문에 조금 어리둥절 해 보이지만 Spring은 내 방법을 찾는 것처럼 보이지 않습니다. 최종 결과는 @Scheduled 주석이 달린 내 메소드가 실행되고 @Scheduled 것입니다.

나는 다음과 같은 선언으로 Spring의 작업 마술을 호출했다.

<beans> <!-- XMLNS, XSD declarations omitted for brevity -->

  <context:component-scan base-package="com.mypackage"/>

  <task:executor id="executor" pool-size="5"/>
  <task:scheduler id="scheduler" pool-size="5"/>
  <task:annotation-driven scheduler="scheduler" executor="executor"/>

</beans>

그리고 다음과 같은 인터페이스가 있습니다.

package com.mypackage;

public interface MyInterface {

    public void executePeriodically();
}

이와 같은 impl을 사용하면 다음과 같습니다.

package com.mypackage.impl;
// imports omitted for brevity

@Service
public class MyInterfaceImpl implements MyInterface {

    @Scheduled(cron = "0/5 * * * * ?")
    public void executePeriodically() {
        System.out.println("The time is now : " + new Date());
    }
}

이제 예상 된 결과는 매 5 초가 몇시에되는지 매우 시끄러운 작은 사람이 있다는 것입니다. 그러나 실제로는 아무 것도 얻지 못합니다. 필자는 인터페이스 메소드와 impl 메소드에서 어노테이션을 시도했지만 아무 것도 변경하지 않는 것 같습니다.

내 로그에 다음이 있기 때문에 executor와 scheduler가 초기화되고 있음을 알았다.

INFO  - ThreadPoolTaskExecutor     - Initializing ExecutorService 
INFO  - XmlWebApplicationContext   - Bean 'executor' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO  - XmlWebApplicationContext   - Bean 'executor' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO  - ThreadPoolTaskScheduler    - Initializing ExecutorService  'scheduler'
INFO  - XmlWebApplicationContext   - Bean 'scheduler' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

적법성이 없다는 것에 관한 라인이 관련성이 있는지 아니면 청어인지 여부는 확실하지 않습니다.

현재로서는 다음과 같이 예약 된 작업을 선언하여 작업하고 있습니다.

<task:scheduled-tasks>
  <task:scheduled ref="sourceDocumentManagerImpl" method="deleteOldDocuments" cron="0 0 * * * ?"/>
</task:scheduled-tasks>

이것은 완벽하게 잘 작동하지만 주석을 사용하는 편이 낫습니다. 코드에서 직접 그 메소드에 대한 기대가 무엇인지 직접 보는 것이 편리하기 때문입니다. 누구든지 내가 뭘 잘못하고 있는지 알아? 기록을 위해, 나는 Spring 3.0.4를 사용하고있다.

무리 감사!


"task : annotation-driven"을 추가 하시겠습니까?

<beans> <!-- XMLNS, XSD declarations omitted for brevity -->

  <context:component-scan base-package="com.mypackage"/>
  <task:annotation-driven/>
  <task:executor id="executor" pool-size="5"/>
  <task:scheduler id="scheduler" pool-size="5"/>
  <task:annotation-driven scheduler="scheduler" executor="executor"/>

</beans>

reference http://howtodoinjava.com/2013/04/23/4-ways-to-schedule-tasks-in-spring-3-scheduled-example/

또는

주석 중심 작업을위한 Spring @Configuration (비 xml 구성)

WebMvcConfig 클래스에 @EnableScheduling을 추가하기 만하면됩니다.

@Configuration
@EnableWebMvc
@EnableAsync
@EnableScheduling
public class WebMvcConfig extends WebMvcConfigurerAdapter {
   /** Annotations config Stuff ... **/
}

참조 스프링 스케줄러가 작동하지 않음


그래서 ... AOP 프록시에서 @Scheduled 주석을 발견하는 @Scheduled 하여 Spring 3.0.x (최소한 3.0.4 및 3.0.5)에 문제가있는 것처럼 보입니다. 트랜잭션 조언과 함께 @Scheduled 메서드를 래핑하는 pointcut 선언 있어요 및 문제의 루트 것 같습니다. 조언을 삭제하면 작업이 실행됩니다. 다시 추가하면 Spring은 주석이 달린 메서드에 대한 작업을 찾아서 만들지 못합니다.

그래서 Spring 사용자들과 버그를 제출할 것이며, 그 동안에는 수동으로 작업을 선언해야합니다.


나는 그것을 제거하여 해결할 수 있습니다 : use-default-filters = "false"컨텍스트 : component-scan my old config is

 <context:component-scan base-package="com.XXXx" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

내 봄 버전 3.2.3


나는 둘 다 추가하여 해결 :

xmlns:task="http://www.springframework.org/schema/task"
xmlns:tx="http://www.springframework.org/schema/tx"

그때:

<!-- TASK -->
    <task:scheduler id="searchScheduler" pool-size="1"/>
    <task:executor id="searchExecutor" pool-size="1"/>
    <task:annotation-driven executor="searchExecutor"  scheduler="searchScheduler"/>

내 applicationContext.xml의 부트 옴에서 :

<tx:annotation-driven/>

내 설치 (작동)에서 볼 수있는 유일한 차이점은 내 수업에 @Service 대신 @Component 가 주석으로 추가된다는 것입니다. 확인해야 할 기타 사항 :

  • 당신이 classpath (봄 - 문맥, 나는 생각한다)에 적당한 단지가 있는지,
  • 중단 점을 넣고 실제로 실행되지 않는지 확인하십시오.
  • cron 표현식을 다시 확인하십시오 (필자는 항상 그 문서를 참조하십시오). 또는 고정 지연을 사용하여 작동하는지 확인하십시오.
  • 3.0.5 또는 최신 3.1 스냅 샷으로 업그레이드하십시오.




scheduler