обработка данных с помощью rails runner: первое сообщение обрабатывается нормально, но все остальные не работают - PullRequest
0 голосов
/ 01 декабря 2018

Я использую командную строку rails runner для запуска скрипта, который читает сообщения json из aws sqs.Общий рабочий процесс состоит в том, чтобы читать сообщения 5 за раз, читать, что это за тип сообщения, отправлять сообщение желаемому рабочему модулю.Рабочий модуль затем проверяет сообщение, проверяя запись в отправляющей базе данных (DB-1), затем проверяет несколько частей сообщения во второй базе данных (DB-2).Первое сообщение пройдет нормально, но все остальные сообщения потерпят неудачу, когда скрипт попытается выполнить начальный поиск в DB-1.

Я могу добавить несколько примеров кода немного, но подумал, был ли у кого-нибудь начальныймысли?

require 'json'
require 'logger'
require 'aws-sdk-sqs'

require_relative './process_message'
include ProcessMessage

queue = ENV["Qu"]
poller = [Aws STUFF]

poller.poll(skip_delete: true, max_number_of_messages: 2) do |msgs|

   msgs.each do |msg|

    jsonMessage = JSON.parse(msg.body)
    message_type = jsonMessage['message_type']
    jsonData = jsonMessage['record']

    case message_type

      when "visit"
        begin
          ProcessVisitMessage.process_visit_message( jsonData, logger )
        rescue Exception => e
          logger.info("Processing failed")
        else
          logger.info("Processing complete")          
        end

  end 

end 

Вот код для обработчика сообщений:

require_relative '../validators/visit_validator'
module ProcessVisitMessage

  include VisitValidator
  def self.process_visit_message( jsonMessage, logger )
    status = VisitValidator.visit_validations(jsonMessage)
    raise ArgumentError.new(status) unless status == "pass"

    #get or craete a subject
    @subject = handle_subject(jsonMessage, logger )

        if @subject.save
          logger.info("Exiting Visit - Processing message succesfull")
        else
          status = "Exiting Visit - Processing message failed"
          raise ArgumentError.new(status)
        end

      end 

    end

Вот код для валидатора:

module VisitValidator

  def self.visit_validations( visit_id )

    visit = Visit.find( visit_id )

    validation = "pass"
    if(validation == "pass")
      validation = protocol_eval( visit.study_protocol_id )
    end

    return validation

  end


  def protocol_eval( study_protocol_id )
    status = "pass"

    if( study_protocol_id.empty? ) #check protocol is not null
      status = "ERROR: study protocol is NULL"
    elsif( !Study.where( :name => study_protocol_id).exists? ) 
      status = "ERROR: study protocol does not exist in Studies table"
    end

    return status
  end

Опять первыйзавершается просто отлично, но когда вторая попытка запускается, она не сможет сказать, что не смогла найти идентификатор посещения в первой базе данных.Я попытался отредактировать код для краткости, поэтому могут быть небольшие вещи, которые не совпадают.Я в основном думаю, что я каким-то образом правильно использую модули ruby ​​или неправильно определяю область видимости, и данные не перезагружаются правильно между сообщениями.Заранее спасибо, что нашли время прочитать это.

...