2010-10-30 30 views
12

Tôi đang sử dụng @Scheduled và đã hoạt động tốt nhưng không thể thực hiện @Async. Tôi đã thử nghiệm nó nhiều lần, và có vẻ như nó làm cho phương pháp của tôi không đồng bộ. Có điều gì khác, cấu hình, hoặc tham số tôi đang thiếu? Tôi có một lớp có hai phương thức một, phương thức được đánh dấu bằng @Scheduled, thực hiện và gọi phương thức thứ hai đã được đánh dấu bằng @Async.@Async không hoạt động cho tôi

Dưới đây là cấu hình của tôi:

<!-- 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" /> 

Cảm ơn.

+0

vấn đề là? – Bozho

+0

bạn nên cung cấp thêm một số thông tin. (đoạn mã vv) – onigunn

+0

không có bất kỳ ngoại lệ nào, nó không làm cho phương thức không đồng bộ. Bất kỳ cấu hình đặc biệt nào để nó hoạt động? đó là câu hỏi của tôi, sẽ đăng cấu hình của tôi để nói thêm về env của tôi. Tôi đã có @Scheduled của tôi làm việc tốt. – Thiago

Trả lời

32

Khi bạn đang gọi phương thức @Async từ một phương thức khác trong cùng một đối tượng, có thể bạn đang bỏ qua mã proxy không đồng bộ và chỉ cần gọi phương thức đơn giản của bạn, tức là trong cùng một chuỗi.

Một cách để giải quyết vấn đề này là đảm bảo cuộc gọi của bạn đến phương thức @Async từ một đối tượng khác. Xem nhận xét ở cuối bài viết này: http://groovyjavathoughts.blogspot.com/2010/01/asynchronous-code-with-spring-3-simple.html

Nhưng thực hiện những việc như thế, bạn có thể tự động chạy TaskScheduler, kết thúc phương thức của mình trong Runnable và tự thực thi nó.

+0

Chắc chắn là một điều dễ dàng để bỏ lỡ. –

3

Tôi gặp sự cố tương tự như vậy. Và tôi đã dành rất nhiều thời gian để sửa nó.

Nếu bạn sử dụng lò xo bối cảnh 3.2, bạn cũng cần phải thêm @EnableAsync trên lớp học nơi bạn gọi cho dịch vụ phương pháp chú thích @Async

Hãy xem http://spring.io/guides/gs/async-method/#initial

Tôi hy vọng rằng nó sẽ giúp bạn.

3

Đây là câu trả lời bổ sung cho câu trả lời được chấp nhận. Bạn có thể gọi một phương thức async trong lớp của riêng bạn, nhưng bạn phải tạo một bean tự tham chiếu.

Tác dụng phụ duy nhất ở đây là bạn không thể gọi bất kỳ mã async nào bên trong hàm tạo. Đó là cách hay để giữ mã của bạn ở cùng một nơi.

@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... 
} 
0

Bạn có thể sử dụng @EnableAsync trong dịch vụ của bạn ...

+0

Bạn có thể vui lòng xây dựng thêm câu trả lời của bạn thêm một số chi tiết cho giải pháp bạn cung cấp không? – abarisone

+0

@alireza alallah: Vui lòng thêm một số chi tiết vào câu trả lời – Jayan

+0

vui lòng xem http://www.baeldung.com/spring-async –

Các vấn đề liên quan