2014-09-17 2 views
11

작업은 프로그래밍 방식으로 예약 된 것이 아니라 프로그래밍 방식으로 실행해야합니다. API 문서를 읽었지만 실행중인 작업 취소에 대해서는 실제로 찾지 못했습니다. sidekiq이 가능합니까?Sidekiq 단일 작업 실행 중지

직접적으로 가능하지 않을 때, 신호를 호출 할 때 작업에서 예외를 발생시킨 다음 재 시도에서 작업을 삭제하여이 문제를 피하는 것이 좋습니다. 이것은 분명히 최적이 아닙니다. 작업 자체를 중지하는

+0

어떻게이 문제를 해결 했습니까? 해결 방법을 공유 할 수 있습니까? – lazywei

+0

첫 번째 대답에서 FAQ를 보면 아이디어가 정말 잘 설명되어 있습니다. 수행 작업 (즉, 각 블록의 시작 부분)에 여러 개의 중단 점을 추가하여 비슷한 작업을 수행했습니다. Thats는 유스 케이스에 크게 의존합니다. 수행 방법의 실행을 중단하려는 경우/어디 – Figedi

답변

7

올바른 사전에

덕분에 작업을 중지 할 수있는 유일한 방법입니다. 응용 프로그램에서 해당 논리를 구현해야합니다.

https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job

+0

좀 더 자세히 설명해 주시겠습니까? 나는 그 자체로 일을 멈출 수있는 방법을 모른다. – lazywei

+0

faq –

+0

와우에 대한 링크를 추가했다. 와우, 나는 Redis를 사용하고 해시에 모든 jid를 저장하고, 매번 수행 방법에 중단 점을 추가 할 때마다이 버전과 비슷한 것을 실제로 암시했다. 현재의 jid가 redis로 설정되었는지 여부 – Figedi

2

당신이 장기 실행 작업의 스레드 ID를 알고있는 경우, 그 수는 다른 작업에서 종료하기 :

class ThreadLightly 
    include Sidekiq::Worker 

    def perform(tid) 
    puts "I'm %s, and I'll be terminating TID: %s..." % [self.class, tid] 
    Thread.list.each {|t| 
     if t.object_id.to_s == tid 
     puts "Goodbye %s!" % t 
     t.exit 
     end 
    } 
    end 
end 

당신은 sidekiq_pusher에서 트리거 할 수 있습니다

bundle exec ./pusher.rb ThreadLightly $YOURJOBSTHREADID 

UI가 보이지 않기 때문에 각 작업에서 Thread.current.object_id를 로깅해야합니다. 또한 배포 된 사이드 키를 실행하는 경우 동일한 인스턴스에서 실행될 때까지이 작업을 실행해야합니다.

+0

정확히 무엇을 찾고 있어요!. 약간의 수정 :이 순간 (2017)에는'object_id.to_s (36)'을 사용해야합니다. – sigra