2013-04-15 14 views
12

Tôi có một số công việc theo lịch trình chạy như thế này:sidekiq để hủy bỏ danh sách để việc theo lịch trình

MyWorker.perform_at(3.hours.from_now, 'mike', 1) 

tôi tự hỏi, nếu sau này, nói một tiếng đồng hồ sau, tôi cảm thấy như tôi muốn hủy bỏ việc này, sẽ như thế nào Tôi đi về điều đó?

Trả lời

3

Theo như tôi biết Sidekiq không có cách nào để hủy công việc lịch biểu ngay bây giờ. Tôi đã viết một dịch vụ cho phép tôi hủy các thư đã lên lịch của mình vì điều đó. Nhưng bạn hủy công việc khá dễ dàng với các lệnh redis:

Bạn nhận được lịch trình công việc như thế này:

schedules_jobs = $redis.zrange "schedule", 0, -1, {withscores: true} 

Sau đó, bạn nhận được một mảng công việc và bạn chọn một công việc và và hủy bỏ nó như thế này:

$redis.zrem "schedule", schedules_jobs[0] 
15

Gần đây tôi đã viết một chút mã để xử lý điều này, nó có sẵn trong nhánh của tôi về đá quý sidekiq-status. Bạn có thể xem nó, hoặc sử dụng nó ở đây: https://github.com/Robinson7D/sidekiq-status

(Bạn sẽ phải sử dụng như là thông tin git: trong gemfile, hiện nay, cho đến ngã ba chính của dự án thực hiện điều này)

Để sử dụng nó , trước tiên bạn lưu trữ các job_identifier:

job_identifier = MyWorker.perform_at(3.hours.from_now, 'mike', 1) 

Và khi bạn muốn để tiêu diệt nó, bạn gọi phương thức Sidekiq :: Status.cancel:

Sidekiq::Status.cancel job_identifier 

Chỉnh sửa: kể từ khi viết bài đăng này, mã của tôi đã được chấp nhận vào ngã ba chính của Sidekiq :: Trạng thái - https://github.com/utgarda/sidekiq-status. Bạn không còn phải dùng nĩa của tôi nữa. Trên ngã ba Utgarda của bạn sẽ kích hoạt nó bằng cách gọi unschedule, thay vì hủy:

Sidekiq::Status.unschedule job_identifier 

Tiếp tục: bạn cũng có thể xóa công việc bằng cách sử dụng đá quý Sidekiq tiêu chuẩn như đã giải thích ở đây: https://github.com/mperham/sidekiq/wiki/API (mặc dù các phương pháp của họ, bạn yêu cầu unix-timestamp khi công việc được lên lịch - bạn không thể xóa chỉ với id của công việc; nếu bạn muốn xóa công việc không có dấu thời gian, phương thức Sidekiq :: Status có thể phù hợp với bạn).

Tuy nhiên, thay vì cách chúng phác thảo trong wiki, tôi khuyên bạn nên làm gì đó dọc theo các dòng Sidekiq::ScheduledSet.new().delete(unix_timestamp, jid) nếu bạn chỉ muốn xóa một công việc.)

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