2016-07-14 23 views
11

Tôi đã thực hiện một lớp @Service trong ứng dụng Khởi động mùa xuân bằng một trong các phương pháp sẽ chạy không đồng bộ. Như tôi đã đọc phương pháp nên được @Async chú thích và tôi cũng phải chạy một hạt đậu TaskExecutor. Nhưng trong Cẩm nang mùa xuân http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html Tôi không tìm thấy bất kỳ thông tin hoặc ví dụ nào về cách chạy TaskExecutor với chú thích, không có cấu hình XML. Có thể tạo hạt TaskExecutor trong Khởi động mùa xuân không có XML, chỉ với chú thích không? Dưới đây lớp dịch vụ của tôi:Khởi động mùa xuân. Làm thế nào để tạo TaskExecutor với chú thích?

@Service 
public class CatalogPageServiceImpl implements CatalogPageService { 

    @Override 
    public void processPagesList(List<CatalogPage> catalogPageList) { 
     for (CatalogPage catalogPage:catalogPageList){ 
      processPage(catalogPage); 
     } 
    } 

    @Override 
    @Async("locationPageExecutor") 
    public void processPage(CatalogPage catalogPage) { 
     System.out.println("print from Async method "+catalogPage.getUrl()); 
    } 
} 

Trả lời

20

Thêm một phương pháp @Bean Spring lớp ứng dụng Boot của bạn:

@SpringBootApplication 
@EnableAsync 
public class MySpringBootApp { 

    @Bean 
    public TaskExecutor taskExecutor() { 
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(5); 
     executor.setMaxPoolSize(10); 
     executor.setQueueCapacity(25); 
     return executor; 
    } 

    public static void main(String[] args) { 
     // ... 
    } 
} 

Xem Java-based container configuration trong tài liệu tham khảo Spring Framework về cách cấu hình mùa xuân sử dụng Java cấu hình thay vì XML.

(Lưu ý: Bạn không cần phải thêm @Configuration vào lớp học vì @SpringBootApplication đã bao gồm @Configuration).

+0

tôi tạo như bạn đề cập và nó làm cho một bean (tôi có thể '@Autowire' nó trong jus lớp thử nghiệm của tôi để biết nó tồn tại), nhưng phương thức dịch vụ của tôi không chạy không đồng bộ. Ở đây mô tả phương pháp của tôi: "@Bean public TaskExecutor locationPageExecutor()". Bạn có thể bình luận? – Pavlo

+0

Bất kỳ cách nào giống như bạn đã trả lời câu hỏi ban đầu của tôi, vì vậy tôi sẽ xem xét cách giải quyết vấn đề mới. Cảm ơn. – Pavlo

+0

@Pavlo Bạn cũng phải thêm '@ EnableAsync' vào lớp ứng dụng khởi động mùa xuân của mình, xem: [Bật chú thích lập lịch biểu] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html /scheduling.html#scheduling-enable-annotation-support) – Jesper

2

đầu tiên - chúng ta hãy đi qua các quy tắc - @Async có hai hạn chế:

  • nó phải được áp dụng cho phương pháp nào chỉ
  • tự gọi - cách gọi phương thức async từ bên trong cùng lớp - won 't làm việc

vì vậy, phương pháp processPage của bạn() phải ở trong lớp học riêng biệt

+0

@Async không cần phải công khai (ít nhất không còn cần phải) –

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