Я разработал приложение, которое позволяет нашим клиентам создавать свои собственные сайты, защищенные членством. Затем мое приложение подключается к внешней службе API (специфичной для клиента api_key / api_url) для синхронизации / обновления / добавления данных в эту другую службу. Ну, у меня есть API-оболочка, написанная для этого другого сервиса, которая работала до этого момента. Тем не менее, сейчас я вижу очень случайные падения, где связь равна нулю. Вот как я сейчас использую соединение:
У меня есть класс подключения xml / rpc
class ApiConnection
attr_accessor :api_url, :api_key, :retry_count
def initialize(url, key)
@api_url = url
@api_key = key
@retry_count = 1
end
def api_perform(class_type, method, *args)
server = XMLRPC::Client.new3({'host' => @api_url, 'path' => "/api/xmlrpc", 'port' => 443, 'use_ssl' => true})
result = server.call("#{class_type}.#{method}", @api_key, *args)
return result
end
end
У меня также есть модуль, который я могу включить в свои модели для доступа и вызова методов API
module ApiService
# Set account specific ApiConnection obj
def self.set_account_api_conn(url, key)
if ac = Thread.current[:api_conn]
ac.api_url, ac.api_key = url, key
else
Thread.current[:api_conn] = ApiConnection.new(url, key)
end
end
########################
### Email Service ###
########################
def api_email_optin(email, reason)
# Enables you to opt contacts in
Thread.current[:api_conn].api_perform('APIEmailService', 'optIn', email, reason)
end
### more methods here ###
end
Затем в контроллере приложения я создаю новый объект ApIConnection для каждого запроса, используя фильтр before, который устанавливает Thread.current [: api_conn]. Это потому, что у меня есть сотни клиентов, каждый со своими собственными api_key и api_url, которые используют приложение одновременно.
# In before_filter of application controller
def set_api_connection
Thread.current[:api_conn] = ApiService.set_account_api_conn(url, key)
end
Что ж, мой вопрос в том, что я читал, что использование Thread.current
не самый идеальный способ справиться с этим, и мне интересно, является ли это причиной того, что ApiConnection будет нулевым при случайных запросах. Поэтому я хотел бы знать, как мне лучше настроить эту оболочку.