Pergunta

Agora estou lutando com um problema com o ActiveResource agora: quando um nome de host é resolvido para uma solicitação do ActiveSource, mas não há nenhum servidor do outro lado para retornar as informações, o valor do tempo limite do ActiveResource não funciona. O pedido apenas está pendurado.

Depois de revisar o código ActiveSource, percebi que isso ocorre porque a rede subjacente: o objeto HTTP possui apenas um tempo de tempo limite definido: read_timeout. A biblioteca da rede: HTTP define isso como "segundos para esperar até a leitura de um bloco (por uma leitura (2) chamada)". A rede: HTTP LIB também define outro valor de tempo limite, open_timeout, que é definido como "segundos para esperar até que a conexão seja aberta".

Não sei por que o Open_Timeout não está definido por padrão com o valor do tempo limite definido em uma classe ActiveSource, mas depois de modificar a classe ActiveSource :: Connection para incluir o Open_timeout nos objetos HTTP, meu problema foi resolvido!

Sou novo no Rails, por isso não tenho certeza da melhor maneira de realmente fazer essa modificação no meu projeto; Não quero apenas alterar o código no meu diretório GEM. Existe uma maneira adequada de fazer essas modificações em um projeto Rails? Vi que é possível carregar aulas de trilhos da pasta /fornecedor, mas todos precisam estar lá para que funcione? Comecei a fazer subclasses do ActiveResource :: Base e ActiveSource :: Conexão aulas, mas parecia que talvez houvesse uma maneira mais fácil de fazer isso, como a função que cria a rede: a instância http é privada ... algum pensamento?

Foi útil?

Solução

Primeiro de tudo, este é um problema que você deve reportar ao Bugtracker do Rails:https://rails.lighthouseapp.com/projects/8994-ruby-on-lails/

Quando tenho que hotfix pequenas coisas como essas, geralmente crio um arquivo inicializador no Rails_root/config/Initializers e reabro a classe que pretendo corrigir.

class ActiveResource::Base
  # your fix goes here
end

Isso é chamado de remendo de macaco e é um tanto controverso. Mas eu pessoalmente considero brutal introduzir um novo nível na hierarquia de herança que não tem significado semântico ao meu código.

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