Use Mutex to synchronize access to Job's log

This commit is contained in:
Dzmitry Plashchynski
2015-03-07 16:35:53 +02:00
parent 5652d19e62
commit b3920fa2ee
2 changed files with 19 additions and 3 deletions

View File

@@ -15,6 +15,7 @@ module Crono
self.performer, self.period = performer, period self.performer, self.period = performer, period
self.job_log = StringIO.new self.job_log = StringIO.new
self.job_logger = Logger.new(job_log) self.job_logger = Logger.new(job_log)
@log_semaphore = Mutex.new
end end
def next def next
@@ -41,7 +42,12 @@ module Crono
end end
def save def save
model.update(last_performed_at: last_performed_at) log = model.reload.log || ""
@log_semaphore.synchronize do
log << job_log.string
job_log.truncate(job_log.rewind)
end
model.update(last_performed_at: last_performed_at, log: log)
end end
def load def load
@@ -50,8 +56,10 @@ module Crono
private private
def log(message) def log(message)
logger.info message @log_semaphore.synchronize do
job_logger.info message logger.info message
job_logger.info message
end
end end
def model def model

View File

@@ -45,6 +45,14 @@ describe Crono::Job do
@crono_job = Crono::CronoJob.find_by(job_id: job.job_id) @crono_job = Crono::CronoJob.find_by(job_id: job.job_id)
expect(@crono_job.last_performed_at.utc).to be_eql job.last_performed_at.utc expect(@crono_job.last_performed_at.utc).to be_eql job.last_performed_at.utc
end end
it "should save and truncate job log" do
message = "test message"
job.send(:log, message)
job.save
expect(job.send(:model).reload.log).to include message
expect(job.job_log.string).to be_empty
end
end end
describe "#load" do describe "#load" do