2013-03-26 36 views
5

Tôi có thể tìm thấy nhiều thông tin về cách hoạt động của Cuộc thăm dò dài (Ví dụ, điều này và điều này), nhưng không có ví dụ đơn giản về cách triển khai mã này. Về cơ bản, làm thế nào tôi có thể sử dụng Apache Tomcat để phục vụ các yêu cầu, và làm thế nào tôi sẽ viết một ứng dụng đơn giản (mùa xuân) mà sẽ "thăm dò ý kiến" máy chủ cho các tin nhắn mới?mã ví dụ về kéo dài mùa xuân?

Ví dụ này không cần phải mở rộng, an toàn hoặc đầy đủ, nó chỉ cần hoạt động! Tôi sẽ đánh giá cao nếu bất cứ ai có thể cho tôi một hướng dẫn như vậy hoặc tham khảo bất kỳ hướng dẫn nào khác.

Trả lời

3

Dưới đây là ví dụ đơn giản nhất tôi có thể nghĩ ra ...

Trong bộ điều khiển:

@RequestMapping("/longPolling") 
public String longPolling(Model model) { 
    while(true) { 
    // .. Do something, break when done... 
    if(somethingIsDone) { 
     break; 
    } 
    } 
    return "someResponse"; 
} 

Trong Xem kêu gọi này, bạn sẽ thiết lập một cuộc gọi ajax, và trên một thời gian chờ đơn giản gọi lại lần nữa. Ý tưởng bỏ phiếu dài là máy chủ không phản hồi cho đến khi nó có phản hồi.

Cách tiếp cận tốt hơn, nếu bạn đang sử dụng Spring 3.2, hãy sử dụng DeferredResult hoặc trả lại một cuộc gọi từ phương thức xử lý của bạn. Nếu bạn là trước mùa xuân 3.2, thì có một số khung công tác mà bạn có thể sử dụng để trợ giúp, như Khí quyển, hoạt động tốt với Spring. Một số thậm chí còn có các phần JavaScript để dễ dàng mã hóa phía máy khách.

+1

DeferredResult là bổ sung Spring 3.2 và cho phép bạn bỏ qua DeferredResult đã tạo thành một quy trình riêng biệt. Có thể gọi là một lớp Java, tương tự như Runnable. Khó thực hiện Callable theo cách để cho phép một quy trình riêng biệt xử lý phản hồi, mặc dù không phải là không thể. Dưới đây là một blog khá phong nha về cách để có được DeferredResult làm việc: http://blog.springsource.org/2012/05/13/spring-mvc-3-2-preview-adding-long-polling-to-an-existing -web-application / – CodeChimp

0

Dựa trên anwser đã tồn tại, một effecient hơn "bỏ phiếu dài" biến thể sử dụng các công cụ mới đến với Servlet 3 API (Tomcat 7) và mùa xuân 3,2

@RequestMapping("/longPolling") 
public Future<String> longPolling(Model model) { 
    return callSomethingWhereAFutureReturns(); 
} 

Vấn đề là: Tương lai chỉ là "một con trỏ" (không nhận được nó theo nghĩa đen) cho một kết quả trong tương lai. Vì vậy, chuỗi gửi cho yêu cầu này sẽ bị tạm ngưng/thoát sau khi xử lý mã ở trên bất kể khi nào tương lai sẽ được giải quyết. KHI tương lai được giải quyết,/a thread sẽ được đính kèm lại và trả về kết quả thực sự (trong trường hợp này là một chuỗi). Nhưng hãy nghĩ "Mùa xuân", đây cũng có thể là một POJO được chuyển thành JSON.

Điều này chỉ có ý nghĩa nếu kết quả trong tương lai sẽ được giải quyết bởi một chuỗi khác. Trong một ứng dụng trò chuyện, đây sẽ là một chuỗi yêu cầu khác với thông điệp mới (không được khuyến nghị) hoặc một chuỗi điều phối chuyên dụng (tốt hơn).

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