2017-09-21 2 views
0

Nous travaillons sur un planificateur pour planifier les travaux pour notre application rails. Nous voulons réduire l'empreinte de la mémoire et l'utilisation du processeur que ce script ruby ​​prend lorsqu'il planifie donc nous le construisons en tant que projet séparé. Les éléments sont ajoutés à la file d'attente sans problème, mais lorsqu'ils sont exécutés par sidekiq, ils provoquent l'erreur suivante.méthode non définie désérialiser, pour travail ajouté en dehors de mon projet rails

undefined method `deserialize' for #<SummarizationStartAllJob:0x007f7fc4183080> 

Le code pour le projet est le suivant:

require_relative 'sidekiq_redis_jobs' 
require 'redis' 
require 'json' 

redis = Redis.new(:url => "redis://127.0.0.1:6379/0") 
msg = SidekiqjJobMessage.generate(class_name: "SummarizationStartAllJob", arguments: [], queue: 'summarization') 
redis.sadd("queue", "summarization") 
redis.lpush("queue:summarization", JSON.dump(msg)) 

SidekiqjJobMessage

require 'securerandom' 

module SidekiqjJobMessage 
    def self.generate(class_name:, arguments: [], queue: 'default') 
    queue_name = "queue:#{queue}" 
    msg = { 
     "class" => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper', 
     "wrapped" => class_name, 
     "queue" => queue_name, 
     "args" => [{ 
      'job_class' => class_name, 
      'job_id' => SecureRandom.hex(), 
      'queue_name' => queue_name, 
      'arguments' => arguments, 
      'locale'=>'en'}], 
     'retry' => false, 
     'jid' => SecureRandom.hex(12), 
     'created_at' => Time.now.to_f, 
     'enqueued_at' => Time.now.to_f 
    } 
    end 
end 

Le message qui est généré et ajouté à la file d'attente (Redis)

{ 
    "class"  => "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper", 
    "wrapped"  => "SummarizationStartAllJob", "queue" => "queue:summarization", 
    "args"  => [{ "job_class" => "SummarizationStartAllJob", 
         "job_id"  => "f9fc7143bacd638d61938fcd74a81f21", 
         "queue_name" => "queue:summarization", 
         "arguments" => [], 
         "locale"  => "en" }], 
    "retry"  => false, 
    "jid"   => "58565f2cf407de4fbc6d5013", 
    "created_at" => 1505988923.1029198, 
    "enqueued_at" => 1505988923.102925 
} 

Message déposé par SummarizationStartAllJob.perform_async (analysé comme JSON, pour une meilleure lisibilité)

{ 
    "class":"SummarizationStartAllJob", 
    "args":[ 

    ], 
    "retry":true, 
    "queue":"summarization", 
    "backtrace":true, 
    "jid":"d5b9d38f39bff95acee0dc61", 
    "created_at":1505989631.233542, 
    "enqueued_at":1505989631.242933 
} 
+0

Votre 'SummarizationStartAllJob' n'a pas la méthode' deserialize'. Est-ce un travail actif? –

+0

'SidekiqWorker' devrais-je en faire un' travail actif? '. Il fonctionne correctement lorsque je fais 'SummarizationStartAllJob.perform_async' dans ma console rails. – coderhs

+0

alors, je suppose, votre code de construction de métadonnées manuelles manque quelque chose. Pouvez-vous le comparer à ce que 'perform_async' produit? –

Répondre

1

Je pense que votre code de génération de métadonnées de mise en attente ne reflète pas exactement ce qui se passe quand vous faites MyJob.perform_async. Vous devriez comparer les deux sorties et trouver où le vôtre est différent.