O atraso no trabalho trabalha em desenvolvimento, mas não na produção
-
20-09-2019 - |
Pergunta
Meu aplicativo usa o Ideia coletiva forca de trabalho atrasado Para enviar e -mail de forma assíncrona. O problema é que isso funciona bem no ambiente de desenvolvimento, mas não na produção. Os empregos não estão falhando (eu verifiquei o delayed_jobs
tabela), eles não estão sendo consumidos. Não há nada de nota no log de produção.
Este é o conteúdo do handler
coluna dentro do delayed_jobs
tabela:
--- !ruby/struct:Delayed::PerformableMethod \
object: CLASS:FeedbackMailer\
method: :deliver_message\
args: \
- AR:Message:6\
—Eu não vejo nada de errado lá. Este é meu FeedbackMailer
classe:
class FeedbackMailer < ActionMailer::Base
def message(message, sent_at = Time.now)
subject = 'New Feedback Message'
subject = "#{subject}: #{message.subject}" if message.subject.present?
subject subject
recipients 'me@example.org'
from 'feedback@example.org'
sent_on sent_at
body :message => message
end
end
Finalmente, este é o método relevante no meu Message
classe:
def send_email
FeedbackMailer.send_later(:deliver_message, self)
end
Sei que o código do ActionMailer funciona corretamente na produção, porque eu o testei de forma síncrona antes de mudar para um trabalho atrasado. Como eu disse, também o executei até o trabalho com sucesso, usando um trabalho atrasado no desenvolvimento.
Se eu executar o top
Comando no servidor, então eu posso ver o processo de retardado Ruby Process ganhando vida a cada cinco segundos. Como posso depurar isso?
Solução
John,
Enquanto eu também usei o garfo de ideia coletiva, descobri que o script de Tobi também funciona. Eu só preciso de um diretório TMP/PID (que você pode ter) e você obtém o arquivo de log e pode cruzar esse arquivo com o que sua coluna de erro diz em seu atraso :: job. primeiro registro (ou qualquer trabalho que seja, é claro) . Script para correr como daemon da Tobi Fork
Ah, e você reiniciou, se fizesse mudanças, certo? Tive que perguntar.
Outras dicas
Você corre ./script/delayed_job com o -e production
Conjunto de bandeira?
Qualquer coisa aparece em log/touched_job.log? Você mencionou o registro de produção, mas o trabalho atrasado tem seu próprio log.
- Job] adquirindo bloqueio no VisuewImageJob
Você pode tentar fazer uma classe separada em vez de usar o método _later ().
class PreviewImageJob < Struct.new(:item_id)
def perform
item = Item.find(item_id)
item.generate_interior_images!
end
end