Безопасные переменные потока Rails - PullRequest
0 голосов
/ 05 июля 2018

У меня проблема с безопасными переменными потока. У меня есть метод контроллера, который отправляет смс на указанные номера. Но если пользователь делает запрос одновременно, переменные перезаписываются.
Я знаю, что RoR не является потокобезопасным, и я должен сделать это, но я не мог сделать это с живым ответом. Если бы я взял все данные от пользователя и сделал это в фоновом режиме, это было бы проще.

Например, допустим, первый пользователь пытается отправить смс на номер x с содержимым a, а второй пользователь пытается отправить номер sms с содержимым b. Если они делают запросы в один и тот же момент, то x число получит две смс с содержанием a и b.

def create
  success = false
  message = nil
  status  = 422
  if params[:receivers].present? && params[:title].present? && params[:content].present?
    if params[:is_future_sms].present? && params[:is_future_sms].to_s == 'true' && !params[:send_date].present?
      render json: {success: false, message: 'Insufficient Parameter'}
    else
      sms = @account.sms_objects.new(sms_object_params)
      sms.sms_title_id = set_sms_title_id
      sms.receivers = sms.receivers.to_s
      receivers = NumberOperations.sanitize_receivers_with_hash(sms.receivers)
      if receivers.count > 0
        total_count = sms.credit(sms.content)
        sms_balance = sms.balance(sms.content)
        receivers.map{|r| r[:balance] = sms_balance}
        sms_balance = receivers.count * total_count

        if @account.can_afford_sms?(sms_balance)
          if sms.save
            SendSmsJob.perform_later(sms.id, receivers)
            success = true
            message = 'Messages created successfully'
            status  = 201
          else
            success = false
            message = sms.errors.full_messages.to_sentence
            status  = 422
          end
        else
          success = false
          message = 'Insufficient Credit'
          status  = 422
        end
      else
        success = false
        message = 'No valid number'
        status  = 422
      end
    end
  else
    success = false
    message = 'Insufficient Parameter'
    status  = 422
  end
  render json: { success: success, message: message }, status: status
end

Полагаю, я могу решить проблему с мьютексом и Thread.new, но когда я его использую, он не дает ответа пользователю.

def create
  th = Thread.new do
    # all code here
  end
  th.join
end

это работает хорошо, но не отвечает в конце.

1 Ответ

0 голосов
/ 06 июля 2018

Yeyyy! Я нашел решение. Я изменил свой сервер с пумы на единорога. И теперь он работает правильно.

...