2013-06-18 61 views
18

Tôi muốn biết trường hợp sử dụng chung của việc sử dụng yêu cầu không đồng bộ @Async và Servlet 3 trong Mùa xuân bằng cách sử dụng Có thể gọi.Khi nào sử dụng bộ điều khiển Bộ điều khiển không dây (Bộ điều khiển không đồng bộ, servlet 3)

Như tôi đã biết, @Async là để thực hiện bất kỳ phương thức nào (cụ thể, bất kỳ phương thức dịch vụ nào) thực thi không đồng bộ.

@Async 
void doSomething(String s) { 
// this will be executed asynchronously 
} 

và bất kỳ điều khiển trả về Callable

@RequestMapping("/view") 
public Callable<String> callableWithView(final Model model) { 
    return new Callable<String>() { 
     @Override 
     public String call() throws Exception { 
      Thread.sleep(2000); 
      model.addAttribute("foo", "bar"); 
      model.addAttribute("fruit", "apple"); 
      return "views/html"; 
     } 
    }; 
} 

Tôi đang bối rối về whento sử dụng những gì. Điều gì sẽ là ảnh hưởng của việc sử dụng servlet/controller không đồng bộ và với spring @Async cùng nhau?

Trả lời

15

This bài có lời giải thích cho những gì bạn đang tìm kiếm

Trích:

Trong một số trường hợp, bạn có thể trả lại cho khách hàng ngay lập tức trong khi một công việc nền hoàn xử lý. Ví dụ gửi một email, đá ra khỏi một công việc cơ sở dữ liệu, và những người khác đại diện cho lửa và quên kịch bản có thể được xử lý với sự hỗ trợ @Async Spring hoặc bằng đăng một sự kiện vào một kênh tích hợp mùa xuân và sau đó trả lại một xác nhận id khách hàng có thể sử dụng để truy vấn kết quả.

Loại trả về có thể gọi làm cho phương thức điều khiển không đồng bộ. Điều này thường được sử dụng trong các tình huống như bỏ phiếu dài. Đọc this bài đăng của cùng một tác giả để biết thêm thông tin.

Cũng có thể gọi là một thay thế cho Runnable, theo nghĩa, Nó có thể trả lại kết quả và ném ngoại lệ đã kiểm tra.

Giả sử bạn có một phương pháp

public String aMethod(){ 

} 

Điều này có thể được thực hiện không đồng bộ bằng cách đơn giản trả lại một giao diện Callable.

public Callable<String> aMethod(){ 

} 
+0

liên kết đến bài đăng đầu tiên bị hỏng – Chris

+0

Xin cảm ơn vì đã cho tôi biết. Tôi đã cập nhật liên kết. Hy vọng nó giúp. – shazinltc

+0

@shazinltc nếu tôi cần thực thi tác vụ không đồng bộ và cần phải nhận 'taskId' ngay lập tức (một chuỗi' đại diện cho việc đăng ký nhiệm vụ, một thứ gì đó để giúp người dùng theo dõi tiến trình của công việc), làm cách nào tôi có thể đạt được điều này cho rằng 'taskId' phải được tạo ra trong phương thức được chú thích bằng' @ Async' chứ không phải bởi người invoker? –

0

bạn không thể cải thiện hiệu suất yêu cầu duy nhất bằng cách sử dụng Giao diện có thể gọi, nó giúp nhận thêm yêu cầu trong một số trường hợp. Nếu kiểu phản hồi của bạn sẽ bị vô hiệu, bạn có thể sử dụng runnable thay vì có thể gọi được, do đó, với việc sử dụng runnable, bạn có thể cải thiện thời gian phản hồi yêu cầu duy nhất.

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