2013-06-07 10 views
9

Ho bisogno di accedere all'attuale attore di celluloide all'interno del mio lavoratore Sidekiq, ma non vedo un modo per farlo.Cellulaid corrente Sidekiq Attore

ogni volta che provo a chiamare:

Celluloid::Actor.current 

ottengo un errore: not in actor scope

ho cercato di andare in giro a trovare l'attore corrente con la creazione di uno nuovo ogni volta con:

Celluloid::Actor.new(SecureRandom.hex) 

Ma per qualche motivo mi stava dando un errore di attempted to call dead actor.

Cosa dovrei fare in modo diverso per ottenere l'attore corrente all'interno di un lavoratore Sidekiq?

Informazione Sto collegando ad un websocket nel mio lavoratore e l'invio di messaggi ad esso.

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

+0

Perché avete bisogno di farlo? –

+0

Buona domanda, non pensavo fosse pertinente alla domanda. Ma mi sto collegando a un websocket nel mio lavoratore e invio messaggi ad esso. '@websocket_client || = Celluloid :: WebSocket :: Client.new ('ws: // my-uri', Celluloid :: Actor.current)' – ardavis

+0

Sei sicuro di voler usare i lavoratori? Forse tutto ciò di cui hai bisogno è un semplice demone? –

risposta

1

che si dovrebbe definire una classe separata compreso celluloide, ecco un esempio sulla base di 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  

funziona come un fascino, appena finito di giocare con esso. Get the full updated example, installare gemme necessarie, quindi avviare sia Sinatra e Sidekiq

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

poi passare alla http://localhost:4567