2012-06-19 29 views
5

Cách tốt nhất để thực hiện một số loại chỉ báo tiến trình trong Play là gì?Chỉ báo tiến trình trong khung chơi

Tôi có trang nhập đơn giản nơi người dùng có thể tải lên tệp csv. Máy chủ sau đó sẽ thực hiện một số xử lý kéo dài cho đến khi quá trình nhập hoàn tất. Tôi muốn chuyển hướng người dùng đến một trang riêng biệt sau khi tải lên và cung cấp cho anh ấy một số phản hồi liên tục trên trang này là "150 trong số 856 bộ dữ liệu được nhập".

Hành động tải lên kích hoạt một phương thức điều khiển có thể bắt đầu nhiệm vụ tốn thời gian trong chuỗi của riêng nó, nhưng làm cách nào để nhận trạng thái công việc bằng cuộc gọi ajax từ trang khác (vì chơi không có bất kỳ loại nào trạng thái giữa các yêu cầu)?

Trả lời

3

Điều bạn có thể làm là tạo Công việc từ bộ điều khiển của mình. Trên thực tế, nếu bạn đọc tài liệu Play, bạn được khuyến khích thực hiện quá trình xử lý đang chạy trong Công việc lâu dài để chúng không hog chuỗi yêu cầu HTTP.

Vì vậy, công việc của bạn đang chạy, bằng cách xử lý tệp CSV của bạn. Bước tiếp theo là ghi lại khi mỗi tập dữ liệu đã được xử lý. Vì vậy, giả sử bạn vượt qua công việc của bạn một tài liệu tham khảo, giống như một uid hoặc một số số duy nhất, mà bạn quay trở lại khách hàng của bạn. Sau đó bạn chỉ cần ghi lại (có thể trong cơ sở dữ liệu nếu bạn muốn phù hợp với tình trạng không quốc tịch và quy mô dễ dàng) mỗi lần tăng số lượng bộ dữ liệu được xử lý dựa vào id duy nhất của bạn.

ví dụ

@Entity 
public class DatasetProgress extends Model { 

    public Long uid; 
    public Long datasetsDone; 
    public Long datasetsTotal; 

} 

Sau đó bạn có thể tạo ra một hành động điều khiển trả về đối tượng DatasetProgress dựa trên uid của bạn, mà bạn có thể sử dụng để hiển thị một thanh tiến trình.

1

Một điều bạn có thể làm là có một số thông báo tập trung. Bạn có thể cung cấp cho việc nhập khẩu một số định danh duy nhất và viết tin nhắn cập nhật được khóa bằng id này. Sau đó, để lấy trạng thái, bạn chỉ cần sử dụng phím đó.

Một tùy chọn khác là sử dụng ổ cắm web và về cơ bản đẩy thông báo lại cho máy khách (mặc dù chúng chưa được hỗ trợ rộng rãi).

+1

Tôi muốn sử dụng cả hai câu trả lời của John và @Codemwnci để thực hiện tác vụ này đặc biệt nếu bạn chắc chắn rằng bạn sẽ sử dụng các trình duyệt hỗ trợ WebSockets hoặc ít nhất Comet. Trong trường hợp đó, bạn có thể xây dựng thanh tiến trình thực sự giống như thật. – biesior

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