j'ai une application rails où un ordre est attribué à un fournisseur et le vendeur doit accepter l'ordre dans les 15 minutes (à des fins de test, je garde à deux minutes). Une fois la commande affectée à un fournisseur, l'attribut status_id de la table d'attribution des commandes est mis à jour à '1'. Maintenant, le fournisseur doit accepter ou rejeter la commande sur la base de laquelle le status_id est mis à jour à 2 et 3 respectivement. Si le vendeur n'accepte/rejette pas l'ordre dans les 15 prochaines minutes à partir du moment de la cession, le status_id est mis à jour automatiquement à 3 dans le tableau d'affectation des commandes. Voici les extraitsplanificateur Resque travail actif sur Redis serveur en file d'attente, mais pas en cours d'exécution
modèle de commande:
has_many :order_assignments
belongs_to :vendor
Modèle du vendeur:
has_many :order_assignments
has_many :orders
modèle OrderAssignment:
class Estamps::OrderAssignment < ActiveRecord::Base
after_save :enqueue_check_status
belongs_to :vendor, class_name: 'Estamps::Vendor'
belongs_to :order, class_name: 'Estamps::Order'
belongs_to :status, class_name: 'Estamps::OrderAssignments::Status'
def enqueue_check_status
AutoRejectionJob.set(wait: 2.minutes).perform_later(self.id)
end
end
Auto_rejection_job
class AutoRejectionJob < ActiveJob::Base
queue_as :default
def perform(*args)
order_assignment_id = args[0]
order_assignment = Estamps::OrderAssignment.find(order_assignment_id)
if order_assignment.status_id == 1
order_assignment.update(status_id: 3)
order_assignment.save!
end
end
end
schéma OrderAssignment:
create_table "estamps_order_assignments", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "vendor_id"
t.integer "order_id"
t.integer "status_id"
end
Ici, le status_id vient d'une autre table qui contient différents statuts.
J'utilise bijou resque-planificateur
serveur Mon Redis est en cours d'exécution.
Sur le journal du serveur de développement, le travail de rejet automatique est montré à et qui doit en file d'attente se resqued après deux minutes de la création du dossier d'attribution de la commande.
C'est ce que le journal du serveur indique:
[ActiveJob] Enqueued AutoRejectionJob (Job ID: 7faa9e74-5151-4b9f-9f13-
0d90c9a68825) to Resque(auto_rejection_job) at 2017-03-07 11:55:44 UTC with
arguments: 77
Quand je cours avec ps aux | grep resque ce que je reçois
maheshmesta 7667 0.0 0.0 2423392 536 s004 R+ 5:27PM
0:00.00 grep resque
maheshmesta 7474 0.0 1.7 2615936 145100 s002 S 5:21PM
0:06.53 resque-1.26.0:
Waiting forauto_rejection_job,default,estamp_orde RBENV_VERSION=2.2.2
maheshmesta 7473 0.0 1.7 2613884 144508 s002 S 5:21PM
0:06.52 resque-1.26.0: Waiting for
auto_rejection_job,default,estamp_orde RBENV_VERSION=2.2.2
Mais quand je vérifie au bout de deux minutes (converti l'UTC à IST) l'affectation pour le status_id de dossier n'est pas le fuseau horaire updated.My application est « Mumbai » (si cela est de tout importance).
Si je retire simplement la partie d'attente définie dans le code, le status_id est mis à jour à savoir si je lance ce
def enqueue_check_status
AutoRejectionJob.perform_later(self.id)
end
Le code fonctionne, mais avec l'ensemble (attente: 2.minutes) le travail est juste en file d'attente mais ne fonctionne pas.
Mon resque_stdout dans les journaux ne montre pas de données relatives à l'emploi de rejet automatique, mais montre les sorties nécessaires pour d'autres emplois ou emailers sms.
J'ai essayé de tester le travail manuellement en exécutant sur la console
AutoRejectionJob.set(wait: 2.minutes).**perform_now**(an id)
alors le status_id est mis à jour et le code fonctionne parfaitement, mais ne fonctionne pas pour l'heure prévue spécifiée. Où vais-je mal? Je me bats avec près d'une semaine. Comment puis-je atteindre cet objectif? Débutant aux rails, alors aidez s'il vous plaît.
Pardonne-moi, mais pourquoi devrais-je vérifier le journal des sidekiq quand je suis à l'aide resque_scheduler –