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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top