Module: Lab::Lims::Worker
- Defined in:
- app/services/lab/lims/worker.rb
Overview
Pull/Push orders from/to the LIMS queue (Oops meant CouchDB).
Constant Summary collapse
- LOG_FILES_TO_KEEP =
5- LOG_FILE_SIZE =
500.megabytes
Class Method Summary collapse
- .file_logger(worker_name) ⇒ Object
- .lims_api ⇒ Object
- .log_path(filename) ⇒ Object
- .realtime_updates_enabled? ⇒ Boolean
- .start(start_date: nil) ⇒ Object
- .start_acknowledgement_worker(start_date: nil) ⇒ Object
- .start_pull_worker(start_date: nil) ⇒ Object
- .start_push_worker(start_date: nil) ⇒ Object
- .start_realtime_pull_worker(start_date: nil) ⇒ Object
- .start_worker(worker_name) ⇒ Object
Class Method Details
.file_logger(worker_name) ⇒ Object
77 78 79 |
# File 'app/services/lab/lims/worker.rb', line 77 def self.file_logger(worker_name) Logger.new(log_path("#{worker_name}.log"), LOG_FILES_TO_KEEP, LOG_FILE_SIZE) end |
.lims_api ⇒ Object
92 93 94 |
# File 'app/services/lab/lims/worker.rb', line 92 def self.lims_api Lab::Lims::ApiFactory.create_api end |
.log_path(filename) ⇒ Object
81 82 83 |
# File 'app/services/lab/lims/worker.rb', line 81 def self.log_path(filename) Lab::Lims::Utils::LIMS_LOG_PATH.join(filename) end |
.realtime_updates_enabled? ⇒ Boolean
85 86 87 88 89 90 |
# File 'app/services/lab/lims/worker.rb', line 85 def self.realtime_updates_enabled? Lims::Config.updates_socket.key?('url') rescue Lab::Lims::Config::ConfigNotFound => e Rails.logger.warn("Check for realtime updates failed: #{e.}") false end |
.start(start_date: nil) ⇒ Object
12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'app/services/lab/lims/worker.rb', line 12 def self.start(start_date: nil) User.current = Utils.lab_user # Eager load classes before forking to avoid autoloading issues in child processes Rails.application.eager_load! if defined?(Rails) && Rails.env.development? fork { start_push_worker(start_date: start_date) } fork { start_pull_worker(start_date: start_date) } fork { start_acknowledgement_worker(start_date: start_date) } fork { start_realtime_pull_worker(start_date: start_date) } if realtime_updates_enabled? Process.waitall end |
.start_acknowledgement_worker(start_date: nil) ⇒ Object
34 35 36 37 38 39 |
# File 'app/services/lab/lims/worker.rb', line 34 def self.start_acknowledgement_worker(start_date: nil) start_worker('acknowledgement_worker') do worker = AcknowledgementWorker.new(lims_api, start_date: start_date) worker.push_acknowledgement end end |
.start_pull_worker(start_date: nil) ⇒ Object
41 42 43 44 45 46 47 |
# File 'app/services/lab/lims/worker.rb', line 41 def self.start_pull_worker(start_date: nil) start_worker('pull_worker') do worker = PullWorker.new(lims_api, start_date: start_date) worker.pull_orders end end |
.start_push_worker(start_date: nil) ⇒ Object
26 27 28 29 30 31 32 |
# File 'app/services/lab/lims/worker.rb', line 26 def self.start_push_worker(start_date: nil) start_worker('push_worker') do worker = PushWorker.new(lims_api, start_date: start_date) worker.push_orders # (wait: true) end end |
.start_realtime_pull_worker(start_date: nil) ⇒ Object
49 50 51 52 53 54 55 |
# File 'app/services/lab/lims/worker.rb', line 49 def self.start_realtime_pull_worker(start_date: nil) start_worker('realtime_pull_worker') do worker = PullWorker.new(Lims::Api::WsApi.new(Lab::Lims::Config.updates_socket), start_date: start_date) worker.pull_orders end end |
.start_worker(worker_name) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'app/services/lab/lims/worker.rb', line 60 def self.start_worker(worker_name) Rails.logger = LoggerMultiplexor.new(file_logger(worker_name), $stdout) ActiveRecord::Base.logger = Rails.logger Rails.logger.level = :debug File.open(log_path("#{worker_name}.lock"), File::RDWR | File::CREAT, 0o644) do |fout| unless fout.flock(File::LOCK_EX | File::LOCK_NB) Rails.logger.warn("Another process already holds lock #{worker_name} (#{fout.read}), exiting...") break end fout.write("Locked by process ##{Process.pid} under process group ##{Process.ppid} at #{Time.now}") fout.flush yield end end |