2012-05-01 40 views
9

Trong ứng dụng của tôi, tôi đang sử dụng Resque để thay đổi kích thước hình ảnh. Nếu hình ảnh nằm trong hàng đợi thay đổi kích thước, tôi muốn hiển thị biểu tượng "thay đổi kích thước hình ảnh".Tìm công việc cụ thể trong hàng chờ lại

Điều này có nghĩa là tôi cần có khả năng tìm tất cả các công việc hiện tại liên quan đến một ID mẫu cụ thể trong hàng đợi. Ngay bây giờ tôi làm như sau:

Resque.peek(:resize, 0, 100).find_all { |job| /#{model.id}/.match(job["args"][0]) } 

Điều này thật ngu ngốc. Nhưng có cách nào để truy vấn hàng đợi Resque để tìm tất cả các công việc mà đối số đầu tiên bằng [id]?

Xin cảm ơn trước.

+0

Tôi tin rằng bạn có thể nắm bắt job_id khi công việc được đặt hàng, sau đó kiểm tra trạng thái công việc bằng cách tìm công việc với id đó. Bạn sẽ phải lưu trữ ID ở đâu đó để tái sử dụng, rõ ràng. – d11wtq

+0

Thực ra, bạn có thể cần một viên ngọc khác để làm điều đó. Chỉ cần thử nghiệm ngay bây giờ. – d11wtq

+1

Điều này có thể khiến bạn thích https: // github.com/quirkey/resque-status – d11wtq

Trả lời

5

Thay vì truy vấn hàng chờ, bạn nên lưu trữ siêu dữ liệu hình ảnh cùng với mô hình của mình.

Giả sử bạn đang lưu trữ hình ảnh sản phẩm. Bạn có thể sử dụng băm Redis để lưu trữ chi tiết sản phẩm. Chỉ cần thêm lá cờ khác như thế này -

hset product:123 is_resizing true

Bạn họ có thể thực hiện một tra cứu đơn giản để hiển thị các biểu tượng hình ảnh thay đổi kích thước. Khi kết thúc công việc khôi phục của bạn, hãy xóa khóa is_resizing và thêm khóa resized_image_url.

+1

Cảm ơn vì điều đó. Tuy nhiên, cấu trúc ứng dụng của tôi làm cho việc này khó thực hiện vì tôi không lưu trữ bất kỳ hình ảnh nào trong số các hình ảnh này trong DB. Đó là yêu cầu của ứng dụng của tôi. Nhưng tôi có thể cần một số loại bảng cho tôi biết những gì hiện đang thay đổi kích thước. Có vẻ như dữ liệu chính xác đó nằm trong hàng đợi Resque. – Ronze

9

Tặng resque-status một lần thử. Nó là một phần mở rộng để Resque thêm công việc theo dõi.

trạng thái phục hồi cung cấp một tập hợp các lớp đơn giản mở rộng chức năng mặc định của resque (với bản vá khỉ 0%) để cung cấp cho ứng dụng cách theo dõi các trường hợp công việc cụ thể và trạng thái của chúng. Nó đạt được điều này bằng cách cung cấp cho các cá thể công việc của UUID và cho phép các cá thể công việc báo cáo trạng thái của họ từ trong vòng lặp của họ.

Lưu ý: d11wtq đề cập ở trên này như một bình luận, nhưng thực sự là tốt nhất câu trả lời cho đến nay.

+0

resque-status là thiên tài, vô giá. Đặc biệt là khi bạn muốn theo dõi việc hoàn thành% của một công việc dài hạn. – nessur

0

Tôi nghĩ cách dễ nhất có thể là sử dụng tập hợp lại để lưu thông tin này.

Khi bạn thêm hình ảnh vào hàng đợi 'thay đổi kích thước', cũng thêm id hình ảnh vào tập hợp 'resize_in_progress' bằng SADD. (Tôi giả sử bạn có một số loại khóa hoặc tên duy nhất để tham chiếu đến hình ảnh, ngay cả khi không được lưu trữ trong db. Có thể đường dẫn đầy đủ đến tên tệp.)

Trong quá trình 'thay đổi kích thước', là một trong hành động cuối cùng sau khi thay đổi kích thước hình ảnh thành công, xóa nó khỏi tập hợp bằng lệnh SREM.

Khi bạn muốn danh sách tất cả hình ảnh, bạn có thể tìm nạp bằng SMEMBERS. Nếu bạn chỉ muốn các thành viên cho một id mô hình cụ thể, bạn có thể cần phải lưu trữ một bộ riêng biệt cho mỗi mô hình, đặt tên là 'resize_in_progress_3451' trong đó 3451 là id của mô hình có hình ảnh được thay đổi kích thước.

Xem http://redis.io/commands#set để biết thêm các lệnh được đặt.

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