복붙노트

[SPRING] @Async가 나를 위해 작동하지 않습니다.

SPRING

@Async가 나를 위해 작동하지 않습니다.

@Scheduled를 사용하고 있으며 잘 작동하지만 @Async가 작동하지 않습니다. 여러 번 테스트 해 보았는데 비동기 방식으로 만들고있는 것 같습니다. 다른 것, 구성 또는 매개 변수가 누락 되었습니까? 하나의 클래스에는 두 개의 메서드 하나가 있습니다. @Scheduled로 표시된 메서드는 @Async로 표시된 두 번째 메서드를 실행하고 호출합니다.

여기 내 설정입니다 :

<!-- Scans within the base package of the application for @Components to configure as beans -->
<context:component-scan base-package="com.socialmeety" />
<context:annotation-config />
<tx:annotation-driven transaction-manager="transactionManager" />
<task:annotation-driven/>

<!-- Configures support for @Controllers -->
<mvc:annotation-driven />

<!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<dwr:configuration />
<dwr:annotation-config />
<dwr:url-mapping />
<dwr:controller id="dwrController" debug="true" />

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

감사.

해결법

  1. ==============================

    1.동일한 객체의 다른 메소드에서 @Async 메소드를 호출 할 때 비동기 프록시 코드를 무시하고 일반 메소드 (즉, 동일한 스레드 내)를 호출하는 것일 수 있습니다.

    동일한 객체의 다른 메소드에서 @Async 메소드를 호출 할 때 비동기 프록시 코드를 무시하고 일반 메소드 (즉, 동일한 스레드 내)를 호출하는 것일 수 있습니다.

    이 문제를 해결하는 한 가지 방법은 @Async 메서드에 대한 호출이 다른 개체에서 발생했는지 확인하는 것입니다. 이 기사 끝 부분의 주석보기 : http://groovyjavathoughts.blogspot.com/2010/01/asynchronous-code-with-spring-3-simple.html

    하지만 이런 일을 지저분 해지면 TaskScheduler를 자동으로 실행하고 메서드를 Runnable에 래핑하여 직접 실행할 수 있습니다.

  2. ==============================

    2.이것은 받아 들여진 것에 대한 보완적인 대답입니다. 자신의 클래스에서 async 메서드를 호출 할 수 있지만 자체 참조 빈을 만들어야합니다.

    이것은 받아 들여진 것에 대한 보완적인 대답입니다. 자신의 클래스에서 async 메서드를 호출 할 수 있지만 자체 참조 빈을 만들어야합니다.

    유일한 부작용은 생성자 내부에서 비동기 코드를 호출 할 수 없다는 것입니다. 코드를 모두 같은 위치에 유지하는 좋은 방법입니다.

    @Autowired ApplicationContext appContext;
    private MyAutowiredService self;
    
    @PostConstruct
    private void init() {
        self = appContext.getBean(MyAutowiredService.class);
    }
    
    public void doService() {
        //This will invoke the async proxy code
        self.doAsync();
    }
    
    @Async 
    public void doAsync() {
        //Async logic here...
    }
    
  3. ==============================

    3.나는 이것과 비슷한 문제가 있었다. 그리고 그것을 고칠 시간을 많이 보냈습니다.

    나는 이것과 비슷한 문제가 있었다. 그리고 그것을 고칠 시간을 많이 보냈습니다.

    스프링 컨텍스트 3.2를 사용하는 경우 @Async가 주석 된 메서드 서비스를 호출하는 클래스에 @EnableAsync도 추가해야합니다.

    http://spring.io/guides/gs/async-method/#initial을 살펴보십시오.

    나는 그것이 당신을 도울 것이기를 바랍니다.

  4. ==============================

    4.귀하의 서비스에서 @EnableAsync를 사용할 수 있습니다 ...

    귀하의 서비스에서 @EnableAsync를 사용할 수 있습니다 ...

  5. from https://stackoverflow.com/questions/4060718/async-not-working-for-me by cc-by-sa and MIT license