В настоящее время мы используем HTTParty gem для нашего класса RestClient в нашем Rails Engine. Недавно мы использовали оболочку persistent_httparty , чтобы добавить возможность устанавливать тайм-ауты чтения и тайм-ауты открытия. Это позволяет нам затем реализовать нашу собственную пользовательскую обработку для длинных вызовов API.
Наш код выглядит следующим образом для класса RestClient:
require 'httparty'
require 'persistent_httparty'
module ScheduleEngine
class RestClient
include HTTParty
pool_size = 10
idle_timeout = 10
keep_alive = 10
read_timeout = 3
open_timeout = 3
persistent_connection_adapter(pool_size: pool_size, idle_timeout: idle_timeout, keep_alive: keep_alive,
read_timeout: read_timeout, open_timeout: open_timeout)
class << self
# other stuff
end
# other code omitted for brevity
end
end
Затем, чтобы использовать этот RestClient, мы просто создаем экземплярRestClient, где когда-либо нам нужно сделать вызов API.
client = RestClient.new(user, params)
data = client.callAPI()
Теперь мы хотим, чтобы некоторые конкретные вызовы API не имели тайм-аута чтения или открытого тайм-аута.
Я не эксперт по Rubyно моя первоначальная идея заключается в создании нового класса, который наследуется от класса RestClient. Но этот просто перезапишет некоторые из базовых значений. Ниже приведен пример:
module ScheduleEngine
class SpecialRestClient < RestClient
pool_size = 10
idle_timeout = 10
keep_alive = 10
# Note that I'm no longer providing read_timout or open_timeout
persistent_connection_adapter(pool_size: pool_size, idle_timeout: idle_timeout, keep_alive: keep_alive)
end
end
С помощью этого нового класса я могу просто создать его экземпляр в тех местах, где я не хочу, чтобы тайм-аут чтения или открытый тайм-аут.
Мой вопрос таков:это хороший подход? Или есть еще лучший подход?
Обновление: вот моя вторая попытка. Просмотр документации для persistent_httparty, особенно в отношении класса ConnectionAdapter , показывает, что я могу передать ключ с именем timeout и, если я это укажу, он перезапишет существующие значения для read_timeout и open_timeout. Мой новый код выглядит так:
module ScheduleEngine
class SpecialRestClient < RestClient
persistent_connection_adapter(timeout: 90)
end
end
Я попробовал это, и это не сработало. Это заставляет меня думать, что метод persistent_connection_adapter должен вызываться только один раз в начале, и как только он установлен, вы не можете изменять какие-либо настройки.