2010-02-22 37 views
6

Tôi đã thiết lập một ứng dụng Web Wicket + Hibernate + Spring bao gồm thu thập một số dữ liệu (có một số tệp được tạo và trả về), lưu trữ trong cơ sở dữ liệu, tạo một số hình ảnh và hiển thị tất cả trên trang web.Wicket: cách xử lý các tác vụ chạy dài

Tất cả đều hoạt động tốt trong thời gian ngắn, nhưng đôi khi thu thập dữ liệu (liên quan đến một số crunching từ xa) mất quá nhiều thời gian (20 phút) và hết giờ. Tôi đã cố gắng giải quyết vấn đề này bằng hai cách tiếp cận, nhưng cả hai đều cho thấy một số vấn đề.

Cách tiếp cận đầu tiên là sử dụng AjaxLazyLoadPanel và chỉ thực hiện mọi thứ trong getLazyLoadComponent. Điều này làm việc tốt cho các thời gian ngắn, nhưng trong 20 phút chạy các LazyLoadComponents sẽ không tải (đẹp oxymoron có) do timeouts.

Cách tiếp cận thứ hai liên quan đến việc tạo phân đoạn trung gian với AjaxSelfUpdatingTimerBehavior được thêm vào với thời lượng được đặt là 10 giây, được thăm dò cho các tệp được tạo trong số crunching. Điều này dường như làm cho các tác vụ chạy trong nền mà không có vấn đề, nhưng không thành công khi dữ liệu trả về cần được lưu trữ trong cơ sở dữ liệu. Tôi đang sử dụng phiên mở trong dạng xem, nhưng có thể điều này không thành công khi cố gắng lưu trữ dữ liệu sau 20 phút ?? (Giải pháp có thể nằm trong việc giải quyết điều này ..).

Do những vấn đề trên bây giờ tôi đang đọc lên trên cách tiếp cận thay thế để xử lý các nhiệm vụ dài chạy và đi qua:

bây giờ tôi đang tự hỏi nếu một trong hai cách này có thể phù hợp hơn để giải quyết các vấn đề về thời gian chờ mà tôi có trong cả việc chạy các tác vụ và lưu trữ dữ liệu trong cơ sở dữ liệu sau đó hoặc nếu có bất kỳ giải pháp nào khác có thể trợ giúp trong tình huống này.

Tôi thực sự muốn biết liệu một phương pháp tiếp cận mới có khả thi hay không trước khi tôi dành một ngày khác để thực hiện điều gì đó có thể không hoạt động sau khi tất cả.

Trân trọng,
Tim

Trả lời

3

Tôi biết chúng tôi đã thành công trong việc sử dụng một Panel với một AjaxSelfUpdatingTimerBehavior đính kèm. Nhiệm vụ và phần kết quả được tách ra khỏi logic xem, nhưng có thể truy cập được cho khung nhìn thông qua một dịch vụ mà bạn tạo ra. Việc triển khai dịch vụ mà chúng tôi đã sử dụng sau đó chịu trách nhiệm khởi động TheadPool hoặc ExectutorService để chạy các tác vụ riêng lẻ. Dịch vụ có thể cung cấp một cách để theo dõi tiến độ/trạng thái của công việc/cuộc gọi cụ thể đang diễn ra. Sau khi hoàn thành, nó cũng sẽ làm cho dữ liệu có sẵn cho xem. Việc tiêm một SessionFactory vào việc triển khai dịch vụ (hoặc tiêm DAO) phải đủ để tạo ra HibernateSession bên ngoài một WebSession.

+0

Cảm ơn, đó là điều mà tôi đã nghĩ đến sau khi đăng câu hỏi này (xây dựng câu hỏi giống như vịt cao su theo cách đó). Tôi vẫn sẽ phải tìm hiểu xem điều này có thực sự giải quyết được vấn đề hay không, vì các bản ghi không ghi lại bất cứ điều gì về các phiên đã hết thời gian chờ đợi .. Chỉ cần thiếu các kết quả trong cơ sở dữ liệu là có ích. Sẽ cập nhật nếu tôi tìm hiểu thêm. – Tim

+1

Đã kết thúc theo cách tiếp cận này và chưa gặp bất kỳ sự cố nào từ .. Cảm ơn! – Tim

+0

Rất vui được nghe Tim! – Matt

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