Ответ 1
Ответ 1
Я ожидаю, что проблема заключается в следующем запросе, который должен пройти до завершения соединения, а затем before_filter перезаписывает соединение для продолжающегося соединения. Я постараюсь держаться подальше от тем. Это проще для fork_off, но есть и некоторые предостережения, особенно в отношении производительности.
Я пытаюсь переместить логику, подобную этой, на какую-то фоновое задание. Общим решением является отложенная работа https://github.com/collectiveidea/delayed_job, так что вам не нужно возиться с потоками, и она более надежна и легко отлаживается. Затем вы можете запускать фоновые задания для асинхронной синхронизации службы, когда кто-то входит в систему.
@account.delay.optin_via_email(email,user)
Это приведет к сериализации учетной записи, сохранит ее в очереди заданий, где ее подхватит отложенная работа, неэтериализованная, и будет вызван метод после задержки. У вас может быть любое количество фоновых заданий и даже некоторые очереди заданий, предназначенные для определенных типов действий (с использованием приоритетов работы - скажем, два bj для высокоприоритетных заданий и один посвященный заданиям низкого prio)
Ответ 2
Просто сделайте это как объект вместо
def before_filter
@api_connection = ApiConnection.new(url, key)
end
то вы можете использовать это соединение в своих методах управления
def show
#just use it straight off
@api_connection.api_perform('APIEmailService', 'optIn', email, reason)
# or send the connection as a parameter to some other class
ApiService.do_stuff(@api_connection)
end
Ответ 3
Самым простым решением может быть просто создание соединения api, когда вам это нужно
class User < ActiveRecord::Base
def api_connection
# added caching of the the connection in object
# doing this makes taking a block a little pointless but making methods take blocks
# makes the scope of incoming variables more explicit and looks better imho
# might be just as good to not keep @conn as an instance variable
@conn = ApiConnection.new(url, key) unless @conn
if block_given?
yield(@conn)
else
@conn
end
end
end
таким образом вы легко можете просто забыть о создании соединения и иметь новую удобную. Там могут быть нарушения производительности, но я подозреваю, что они незначительны, если нет дополнительного запроса на вход
@user.api_connection do { |conn| conn.optin_via_email(email,user) }