2016-06-18 7 views
2

Ich habe mehrere sidekiq Arbeiter in meiner Rails 4 App und kann nicht herausfinden, warum die Prozesse fehlschlagen. Ich übergebe die User_id an den Worker als String, aber es scheint nicht den Benutzer zu finden. Aber wenn ich dieselbe ID in meiner Konsole suche, findet sie den Benutzer. Was mache ich falsch? Hier ist mein Code.Rails Sidekiq FEHLER: Objekt kann nicht gefunden werden

Controller.rb

def update 
    @user = current_user 
    if @user.bill.update_attributes(bill_params) 
     RandomWorker.perform_async(@user.id.to_s) 
     redirect_to users_dashboard_path, :notice => "Payment Informaton Updated" 
    else 
     ... 
    end 
    end 

Randomworker.rb

def perform(user_id) 
    user_id = user_id["$oid"] unless user_id.is_a?(String) 
    user = User.find(user_id) 
    user.process.update_report 
    user.process.save 
    end 

Mein Fehler kommt zurück als

RandomWorker "575a..." Mongoid::Errors::DocumentNotFound: message: Document(s) not found for class User with id(s) 575a.... summary: When calling User.find with an id or array of ids, each parameter... 

--EDIT--

Meine db-Konfigurationsdatei ist wie gezeigt:

development: 
adapter: sqlite3 
database: db/development.sqlite3 
pool: 5 
timeout: 5000 

production: 
adapter: sqlite3 
database: db/production.sqlite3 
pool: 25 
timeout: 5000 

Und mein mongoid.yml

development: 
    # Configure available database clients. (required) 
    clients: 
    # Defines the default client. (required) 
     default: 
    # Defines the name of the default database that Mongoid can connect to. 
    # (required). 
     database: development_db 
    # Provides the hosts the default client can connect to. Must be an array 
    # of host:port pairs. (required) 
     hosts: 
      - localhost:27017 
     options: 
+0

Die Fehler Problem behoben haben zu sagen, dass 'User.find' finden, ist nicht das, was er sucht. Vermutlich ist 'user_id' korrekt, da sie (AFAIK) vom 'perform_async'-Aufruf kommt und nichts auf der Strecke Benutzer löscht (richtig?). Spricht sidekiq mit der gleichen Datenbank wie Ihre App? –

+0

@muistooshort Nichts löscht den Benutzer und ich glaube, es ist mit der richtigen db sprechen, also wie bestätige ich, dass es mit der gleichen db spricht? – SupremeA

+0

Ich weiß nichts über sidekiq, also weiß ich nicht, woher es seine Konfiguration bekommen würde. Sie könnten sich '' Mongoid.default_session' 'im sidekiq-Job ansehen und sehen, ob es die richtigen Einstellungen hat.Sie können sich auch die 'user_id' anschauen und sicherstellen, dass es so ist, wie Sie es erwarten. –

Antwort

2

fand ich eine Lösung. Ich musste ein Monkeypatch in den Sidekiq Initialisierer setzen, um die user.id als json zu behandeln. Anscheinend kämpft Mongoid mit Sidekiq damit, und obwohl ich Mühe hatte, eine Dokumentation darüber zu finden, stolperte ich über die Antwort in einer anderen, nicht verwandten Frage. Have to_json return a mongoid as a string

Ich habe diese in der initalizer und es scheint, die

class BSON::ObjectId 
    def as_json 
    self.to_s 
    end 
end 
1

Ich würde empfehlen, dass Sie die Sidekiq::Web umfassen die Warteschlange eingereiht Jobs auf einer Web-Oberfläche zu sehen, so dass Sie die Parameter sehen können und möglicherweise die Fehler ausgelöst.

Dies ist jedoch ein Fehler, dem ich auch vor einiger Zeit begegnet bin, was mich wegen der Anzahl der E-Mails, die ich von meinem Bugsnag erhalten habe, ziemlich frustriert hat.

Ich habe die beste Lösung noch nicht gefunden, aber ich stelle mir vor, dass die Datenbank für das Lesen gesperrt wurde oder einige Datensätze nicht festgeschrieben wurden, bevor Sie versuchen, sie zu verwenden.

Sidekiqs Dokumentation sagt in Ihrem Modell, after_commit :perform_sidekiq_job, on: :create.

Allerdings habe ich das nicht wirklich versucht, weil ich einen anderen Ansatz gefunden habe, die Kehrseite meines neuen Ansatzes ist, dass meine Jobs viel später ausgeführt werden, manchmal etwa 10 Minuten später.

RandomWorker.perform_in(5.seconds, user_id) 

ist dies weniger wahrscheinlich mit der Sidekiq::retry Option zum Scheitern verurteilt.

Read more here

+0

Ich habe das schon und kann sehen, dass die Arbeiter versagen – SupremeA

Verwandte Themen