2012-05-01 3 views
10

Tomcat 서버 시작시 데몬 메일 서비스 스레드를 시작하고 싶습니다. 그래서 @Async 주석을 사용하는 메소드에 주석을 달았습니다.봄에 서버 시작시 데몬을 시작하는 방법

저는 ApplicationListener 인터페이스를 구현하는 클래스가 있습니다. 이 클래스에서 비동기 메서드를 호출하면 결코 비동기 적으로 시작되지 않고 현재 스레드를 차단합니다. 그리고 스프링 컨트롤러 클래스에서 비동기 메서드를 호출하면 결코 블록화되지 않고 비동기 적으로 시작됩니다.

비동기 메서드가 다른 클래스가 아닌 한 클래스에서 성공적으로 실행되는 이유는 무엇입니까?

내가 뭘 잘못하고 있고 어떻게 서버 시작시 비동기 메서드를 실행할 수 있습니까 ??

미리 감사드립니다.

편집 : 안녕 얘들 아, 내 비동기 메서드를 호출하는 초기화 메소드 접근 방식 @PostConstruct InitializingBean 인터페이스를 사용해 보았지만 결코 실행되지 않았다. 그런 다음, 기본 lazy-init이 true라는 것을 알았습니다. 그래서 InitializingBean에 대해 lazy-init을 false로 만듭니다. 이제는 내 asnyc 메서드를 실행하지만 현재 스레드를 차단하고 이제는 한 가지 문제가 있습니다. 내 서버가 정상적으로 중지되지 않았지만 강제로 서버를 중지해야합니다.

+2

코드를 표시하십시오. –

답변

12

우선 당신은 ApplicationListener 인터페이스를 구현할 필요가 없습니다. Spring으로 작업하고 있습니다 - 응용 프로그램 컨텍스트이면 충분합니다.

둘째로 Spring @Async에 대해 이야기하고 있습니다. 이는 응용 프로그램 컨텍스트에서 작업을 시작해야한다는 것을 의미하며 컨트롤러 빈은 그 일부입니다.

스프링 XML 파일에 <annotation-driven>이 있는지 확인해야합니다.

당신은 @PostConstruct 기능에 작업을 시작할 수 있습니다

@Component 
public class SampleBeanImpl implements SampleBean { 

    @Async 
    void doSomething() { … } 
} 


@Component 
public class SampleBeanInititalizer { 

    @Autowired 
    private final SampleBean bean; 

    @PostConstruct 
    public void initialize() { 
    bean.doSomething(); 
    } 
} 
+0

안녕하세요 대니, 고마워요. 질문이 하나 더 있습니다. ApplicationListener 인터페이스를 구현하지 않으면 어떻게 서버 시작시 일부 메소드를 실행할 수 있습니까? –

+0

업데이트 된 답변보기 –

+1

허용 된 솔루션은 다음 버그에 설명 된대로 작동하지 않습니다. https://jira.spring.io/browse/SPR-7560 –

0

@asyn은 스프링 프레임 워크의 일부입니다. 리스너가 스프링 컨텍스트를 사용합니까? 그렇지 않은 경우, 비동기 메소드에서 새 스레드를 시작하도록 제안합니다.

4

을 봄의 reference, @Async의 사용은 응용 프로그램의 시작시 제한이 기준 자료 :

@Async을 사용할 수 없습니다 @PostConstruct과 같은 라이프 사이클 콜백과 함께 사용합니다. 비동기식으로 Spring Bean을 초기화하려면 현재 은 @Async 주석이 달린 메소드를 대상에 호출하는 별도의 초기화 Spring bean을 사용해야한다.

따라서, 아마도 귀하의 대상 빈과 InitializingBean 구현을 가지고 그것을 통해 데몬을 시작하는 것이 좋을 것입니다.

2

응용 프로그램 컨텍스트에 <annotation-driven> 태그를 추가 했습니까? Spring reference doc에서 :

는 @Scheduled와 @Async 모두 주석을 사용하려면 단순히 구성 작업 공간에서 '주석 중심의'요소를 포함한다.

실행자 인스턴스를 구성하는 것도 고려해야합니다. task schema definition에서 :

구성 할 풀 크기, 큐 용량위한 ThreadPoolTaskExecutor 인스턴스를 정의 살아-유지하고 거부 정책 값. 이 XML 요소에 대한 코드 기반 대안에 대한 정보는 org.springframework.scheduling.annotation.EnableAsync 어노테이션에 대한 Javadoc을 참조하십시오.

그래서 5 개 스레드와 스레드 풀에 의해 지원을 받고 있습니다 집행자를 만들 수는 다음을 수행해야합니다 :

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

더 많은 구성 옵션의 경우, 위에서 언급 한 같은 @EnableAsync javadoc를 참조하십시오.

1

영어가 수영장입니다. 서비스 클래스를 @Lazy (false)로 설정해야합니다.

관련 문제