2016-05-03 5 views
0

Ich habe einen Sidekiq-Worker, der eine Verbindung zu einer Remote-ODBC-Datenbank herstellt, die Daten abruft und dann die lokale Datenbank aktualisiert. Jetzt spalte ich den Arbeiter in zwei Arbeiter. Einer wird verbinden und holen Sie die Daten und ein anderer wird die Datensätze aktualisieren.Sidekiq: übergeben Sie ein Objekt als Parameter

Die Verbindung gibt ein Objekt #<OCI8::Cursor:0x00000007703f30> zurück, das ich Parameter an den zweiten Arbeiter übergebe.

SecondWorker.perform_async({:odbc => connection}) 

Im zweiten Arbeiter habe ich versucht, es zu benutzen:

def perform(options) 
    order_odbc = options['odbc'] 
end 

Aber es behandelt das Objekt als String

"#<OCI8::Cursor:0x00000006bddf48>":String 

Gibt es eine andere Möglichkeit, die Objekte in Parameter zu übergeben?

Antwort

2

Sidekiq recommends dass Argumente an Jobs als einfache Datentypen übergeben werden (string, integer, usw.).

Meine Frage für Sie - und ich weiß, dass dies keine Option in Ihren Geschäftsregeln und Einschränkungen sein kann - ist "Brauchen Sie wirklich einen zweiten Arbeiter"?

Ich könnte eine Option mit einem Service oder einer anderen Klasse suchen, die die Arbeit erledigt; anstatt einen anderen Arbeiter loszutreten.

# Inside First Worker 
SomeCoolClass.delay.method(params) 

Mit delay wird das Verfahren asynchron verarbeitet und in meinen Erfahrungen, ich habe kein Problem mit komplexen Objekten in solchen Szenarien hat (im Vergleich zu Fragen, die ich hatte, als ich komplexe Objekte/Daten an einen Arbeiter übergeben) .

Wie ich bereits erwähnt habe, funktioniert möglicherweise nicht für Ihre Anwendung, aber ich wollte den Vorschlag anbieten, wie es für mich in meinen Anwendungsfällen funktioniert hat.

+0

Danke. Das Ziel besteht darin, die Arbeitslast des ersten Arbeiters zu minimieren, wenn er sich zum ersten Mal mit dem Server verbindet, die Daten abruft und dann die Datensätze aktualisiert. Also dachte ich mir, einen neuen Arbeiter zu beginnen. – Arif

+0

Da Sie die andere Methode (d. H. Den Code, der den "zweiten Worker" darstellen würde) als asynchrone Methode starten würden, wird der Worker selbst freigegeben. Ich bin mir nicht sicher - aber vielleicht falsch - dass Sie irgendwelche "Gewinne" bekommen würden, wenn Sie diesen Code in einen zweiten Arbeiter umwandeln würden. Durch Verwendung des asynchronen "Verzögerungs" -Aufrufs bewegt sich der Arbeiter weiter usw. –

0

Sie können Ihr Objekt in Hash transformieren. Dies ist nicht der beste Weg, aber es funktioniert.

Weitere Informationen here um Objekt in Hash zu transformieren.