2013-06-07 9 views
9

Ich muss auf den aktuellen Celluloid-Schauspieler innerhalb meiner Sidekiq Arbeiter zugreifen, aber ich sehe keinen Weg, das zu tun.Sidekiq aktuelle Celluloid Actor

Immer wenn ich versuche zu nennen:

Celluloid::Actor.current 

Ich erhalte eine Fehlermeldung: not in actor scope

Ich habe versucht, um zu bekommen, die aktuellen Schauspieler zu finden, durch einen neuen mit jedes Mal zu schaffen:

Celluloid::Actor.new(SecureRandom.hex) 

Aber aus irgendeinem Grund gab es mir einen Fehler von attempted to call dead actor.

Was sollte ich anders machen, um den aktuellen Schauspieler in einem Sidekiq-Arbeiter zu bekommen?

Background Info ich zu einem websocket in meinem Arbeiter anschließe und Nachrichten an sie zu senden.

Celluloid::WebSocket::Client.new('ws://my-uri', Celluloid::Actor.current)

+0

Warum wollen Sie das tun müssen? –

+0

Gute Frage, ich dachte nicht, dass es relevant für die Frage war. Aber ich verbinde mich mit einem Websocket in meinem Arbeiter und sende Nachrichten an ihn. '@websocket_client || = Zelluloid :: WebSocket :: Client.new ('ws: // mein-uri', Celluloid :: Actor.current)' – ardavis

+0

Sind Sie sicher, dass Sie Arbeiter benutzen wollen? Vielleicht brauchst du nur einen einfachen Daemon? –

Antwort

1

Raten Sie eine eigene Klasse einschließlich Celluloid definieren sollte, hier ist ein Beispiel, basierend auf one of those from Sidekiq repo

class MyWebSocketWhatever 
    include Celluloid 

    def initialize(url) 
    @ws_client = Celluloid::WebSocket::Client.new url, Celluloid::Actor.current 
    end 

    def send_message(msg) 
    @ws_client.text msg 
    end 

    def on_message(msg) 
    $redis.lpush 'sinkiq-example-messages', "RESPONSE: #{msg}" 
    end 
end 

class SinatraWorker 
    include Sidekiq::Worker 

    def perform(msg='lulz you forgot a msg!') 
    $redis.lpush 'sinkiq-example-messages', "SENT: #{msg}" 
    MyWebSocketWhatever.new('ws://echo.websocket.org').send_message msg 
    end 
end  

wirkt wie ein Zauber, mit ihm spielen gerade fertig. Holen the full updated example, installieren erforderlichen Edelsteine, beginnen dann beide Sinatra und Sidekiq

sidekiq -r ./sinkiq.rb 
ruby ./sinkiq.rb 

Sie dann zu http://localhost:4567