0

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.

Répondre

0

Vous pouvez surveiller le fichier sidekiq.log en utilisant la commande suivante pour voir les erreurs. Mais vous devez utiliser la méthode perform_now dans ce cas.

tail -f log/sidekiq.log

+0

Pardonne-moi, mais pourquoi devrais-je vérifier le journal des sidekiq quand je suis à l'aide resque_scheduler –