Faye e alterando modelos em seu aplicativo Rails
-
11-12-2019 - |
Pergunta
Estou usando o aplicativo Faye e Rails e a única coisa que me irrita muito é que não posso criar ou alterar modelos na mensagem recebida.
Parece que deveria ser algo como https://github.com/jamesotron/faye-railsmas é meio incômodo.
Existe alguma maneira de atualizar modelos através de extensões?talvez algo assim:
require 'faye'
require './app/models/message.rb'
Faye::WebSocket.load_adapter('thin')
require File.expand_path('../config/initializers/faye_token.rb', __FILE__)
class MsgMonitor
def incoming(message, callback)
Message.create(:name=>message.to_s)
callback.call(message)
end
end
faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 45)
faye_server.add_extension(ServerAuth.new)
faye_server.add_extension(MsgMonitor.new)
run faye_server
mas dá um erro.Definitivamente, ele deve de alguma forma carregar todo o ambiente Rails (e isso é realmente necessário).
Qualquer ajuda será muito apreciada....
PS Tentei me inscrever no canal usando o artigo do Grupo Google http://groups.google.com/group/faye-users/browse_thread/thread/620ee6440422687a?pli=1mas ainda não consigo fazê-lo funcionar.Publica, mas não recebe retorno por assinatura.
Solução
O que tem funcionado para mim é ter o servidor faye responsável apenas por passar e validar mensagens.Se isso der certo, eu os salvo no redis da mesma forma que o resque faz para poder finalizar o processamento.
Os benefícios são que tarefas de longa duração não retardam suas conexões faye e você sempre pode adicionar mais trabalhadores se precisar de processamento adicional.
no topo do método de entrada da minha primeira extensão, crio uma nova conexão em-redis
$redis ||= EM::Hiredis.connect @options[:redis]
então, se passar nos meus testes, eu o armazeno em redis no formato que o resque usa.
m = {'class' => "Message", 'args' => ['handle_message', {name: message.to_s}.to_json]}
$redis.rpush("resque:queue:faye", m.to_json )
$redis.sadd("resque:queues","faye")
para transmitir do meu aplicativo Rails para usuários eu uso o seguinte código em um script/faye_worker
https://github.com/SponsorPay/em-resque#in-a-rails-3-app-as-a-gem
Eu envolvo o acima com EM.synchrony para que eu possa iniciar faye antes do trabalhador
para enviar mensagens do seu modelo, basta enviá-las para a fila de resque assíncrona.