Problem mit Resque, Rails 3 und Active-recored
-
08-10-2019 - |
Frage
Ich habe diese Klasse, die Antwort von „Resque“ ausgeführt werden sollte auszuführen, habe ich einen Fehler
Weichen an dieser Linie recipient.response = response.body
ist undefined method response=' for #<Hash:0x00000003969da0>
denke ich, dass, weil die Arbeiter und Active nicht zusammenarbeiten können.
P. S Ich lud bereits meine Umgebung und diese Klasse in lib-Verzeichnis platziert
Mit: Ruby 1.9.2 Rails 3 Resque 1.10.0
class Msg
def self.perform(message,sender,host, path, recipient)
message_logger ||= Logger.new("#{Rails.root}/log/message.log")
response = Net::HTTP.get_response(host, path)
begin
recipient.response = response.body
recipient.sent_at = Time.zone.now
recipient.save
# Logging
log = "Message #{
message.sent_at}\n\tRespone:\n\t\tBody: #{response.body}\n\t\tCode: #{response.code}\n"
message_logger.info(log)
rescue Exception => e
message_logger.error(e.message + '/n' + e.backtrace.inspect)
end
end
end
Lösung
Resque verwendet Json Serialisierung. JSON Serialisierung würde nicht zulassen, dass Sie ein Objekt mit der Methode intakt deserialisieren.
Wenn Sie eine Instanz des Empfängers haben (mit dem Namen „Empfänger“) und will, dass es in dem Verfahren verwenden, um eine Reaktion auszuführen / anhält, dann sollten Sie die ID des Empfängers einreihen und holt es aus Ihrer Persistenz-Schicht, wenn perform aufgerufen .
https://github.com/defunkt/resque (Kasse Abschnitt über die Persistenz)
ist Resque unterscheidet sich von DelayedJob / Background Job und andere auf diese Weise. (Weshalb ich mag es. Die gleiche Warteschlange kann von mehreren Rubin Implementierungen geteilt werden, jruby, mri, ...)
Andere Tipps
Das klingt nicht wie ein Problem mit resque und Activerecord überhaupt. Es sagt der Parameter recipient
, dass Sie übergeben war ein Hash. Wo ist der Code, der den Job eingereiht? Sie können auch einen Blick eine die Protokollausgabe von dem Arbeiter, wo Sie die Fehlermeldung sah, um zu sehen, was die Parameter in den Job übergeben wurden.