chronofage 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -12
- data/db/migrate/1_create_job_table.rb +13 -8
- data/lib/chronofage.rb +0 -1
- data/lib/chronofage/job.rb +30 -3
- data/lib/chronofage/version.rb +1 -1
- data/lib/tasks/chronofage.rake +3 -11
- metadata +2 -4
- data/db/migrate/2_create_runner_table.rb +0 -10
- data/lib/chronofage/runner.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 498b0dbe5d30b21f61a61378999edeb50f9cabc6
|
4
|
+
data.tar.gz: 424313e1ee691839fdf396d649b1e8698e767cc6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35f775eba0d751a1bc759b36e329ac96db33e9b3bd09f36fa57f2fa7fabbd3551c5907ae0d24e952389e2f7c38fd8c90324d82e9dd88218e14ba54778fbb4ef7
|
7
|
+
data.tar.gz: 41c3823387b3f5da300959c5b7b03ef51e3c1d7e82e057925ac68efffe440231cd8034373689911de8f4af812e61cbd0d8900330358235af90393b5addfaccdb
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ is run in its own process and you can spread the work on multiple hosts.
|
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
|
-
Copy the migration file and run it to create the `chronofage_jobs`
|
9
|
+
Copy the migration file and run it to create the `chronofage_jobs` table.
|
10
10
|
|
11
11
|
```
|
12
12
|
rake chronofage_engine:install:migrations db:migrate
|
@@ -29,17 +29,6 @@ create_table "chronofage_jobs", force: :cascade do |t|
|
|
29
29
|
end
|
30
30
|
```
|
31
31
|
|
32
|
-
The `chronofage_runners` table hold informations about the process currently running.
|
33
|
-
|
34
|
-
```
|
35
|
-
create_table "chronofage_runners", force: :cascade do |t|
|
36
|
-
t.string "queue_name"
|
37
|
-
t.string "host"
|
38
|
-
t.datetime "created_at", null: false
|
39
|
-
t.datetime "updated_at", null: false
|
40
|
-
end
|
41
|
-
```
|
42
|
-
|
43
32
|
## Usage
|
44
33
|
|
45
34
|
You can selectively override the ActiveJob backend for your very long-runny task.
|
@@ -1,15 +1,20 @@
|
|
1
1
|
class CreateJobTable < ActiveRecord::Migration[5.0]
|
2
2
|
def change
|
3
3
|
create_table :chronofage_jobs do |t|
|
4
|
-
t.string
|
5
|
-
t.string
|
6
|
-
t.string
|
7
|
-
t.text
|
8
|
-
t.integer
|
4
|
+
t.string :job_class
|
5
|
+
t.string :job_id
|
6
|
+
t.string :queue_name
|
7
|
+
t.text :arguments
|
8
|
+
t.integer :priority
|
9
|
+
|
10
|
+
t.string :host
|
11
|
+
t.text :stdout
|
12
|
+
t.text :stderr
|
13
|
+
|
14
|
+
t.datetime :started_at
|
15
|
+
t.datetime :completed_at
|
16
|
+
t.datetime :failed_at
|
9
17
|
|
10
|
-
t.datetime :started_at
|
11
|
-
t.datetime :completed_at
|
12
|
-
t.datetime :failed_at
|
13
18
|
t.timestamps
|
14
19
|
end
|
15
20
|
end
|
data/lib/chronofage.rb
CHANGED
data/lib/chronofage/job.rb
CHANGED
@@ -3,6 +3,11 @@ module Chronofage
|
|
3
3
|
self.table_name = "chronofage_jobs"
|
4
4
|
|
5
5
|
scope :ready, -> { where(started_at: nil) }
|
6
|
+
scope :started, -> { where.not(started_at: nil).where(failed_at: nil, completed_at: nil) }
|
7
|
+
|
8
|
+
def self.next(queue_name)
|
9
|
+
ready.where(queue_name: queue_name).order(priority: :asc).first
|
10
|
+
end
|
6
11
|
|
7
12
|
def execute!
|
8
13
|
start!
|
@@ -14,20 +19,42 @@ module Chronofage
|
|
14
19
|
end
|
15
20
|
|
16
21
|
def start!
|
17
|
-
update(started_at: Time.now)
|
22
|
+
update!(started_at: Time.now, host: Chronofage::Job.host)
|
18
23
|
end
|
19
24
|
|
20
25
|
def done!
|
21
|
-
update(completed_at: Time.now)
|
26
|
+
update!(completed_at: Time.now)
|
22
27
|
end
|
23
28
|
|
24
29
|
def failed!
|
25
|
-
update(failed_at: Time.now)
|
30
|
+
update!(failed_at: Time.now)
|
26
31
|
end
|
27
32
|
|
28
33
|
def deserialized_arguments
|
29
34
|
ActiveJob::Arguments.deserialize(JSON.parse(arguments))
|
30
35
|
end
|
31
36
|
|
37
|
+
def concurrents
|
38
|
+
Chronofage::Job.started.where(queue_name: queue_name, host: Chronofage::Job.host)
|
39
|
+
end
|
40
|
+
|
41
|
+
def state
|
42
|
+
if started_at.present? && completed_at.present?
|
43
|
+
:completed
|
44
|
+
elsif started_at.present? && failed_at.present?
|
45
|
+
:failed
|
46
|
+
elsif started_at.present?
|
47
|
+
:running
|
48
|
+
else
|
49
|
+
:ready
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def self.host
|
56
|
+
Socket.gethostname
|
57
|
+
end
|
58
|
+
|
32
59
|
end
|
33
60
|
end
|
data/lib/chronofage/version.rb
CHANGED
data/lib/tasks/chronofage.rake
CHANGED
@@ -1,17 +1,9 @@
|
|
1
1
|
namespace :chronofage_engine do
|
2
2
|
namespace :jobs do
|
3
3
|
task :execute, [:queue_name, :concurrency] => :environment do |t, args|
|
4
|
-
job = Chronofage::Job.
|
5
|
-
|
6
|
-
|
7
|
-
Rails.logger.info "chronofage[#{args.queue_name}]: no job to execute."
|
8
|
-
else
|
9
|
-
runner = Chronofage::Runner.register!(args.queue_name, args.concurrency.to_i)
|
10
|
-
begin
|
11
|
-
job.execute!
|
12
|
-
ensure
|
13
|
-
runner.unregister!
|
14
|
-
end
|
4
|
+
job = Chronofage::Job.next(args.queue_name)
|
5
|
+
if job.present? && job.concurrents.count < args.concurrency.to_i
|
6
|
+
job.execute!
|
15
7
|
end
|
16
8
|
end
|
17
9
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chronofage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Goya
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-11-
|
12
|
+
date: 2017-11-29 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Cron based job scheduler
|
15
15
|
email:
|
@@ -25,12 +25,10 @@ files:
|
|
25
25
|
- Rakefile
|
26
26
|
- chronofage.gemspec
|
27
27
|
- db/migrate/1_create_job_table.rb
|
28
|
-
- db/migrate/2_create_runner_table.rb
|
29
28
|
- lib/active_job/queue_adapters/chronofage_adapter.rb
|
30
29
|
- lib/chronofage.rb
|
31
30
|
- lib/chronofage/engine.rb
|
32
31
|
- lib/chronofage/job.rb
|
33
|
-
- lib/chronofage/runner.rb
|
34
32
|
- lib/chronofage/version.rb
|
35
33
|
- lib/tasks/chronofage.rake
|
36
34
|
homepage: https://www.amusenetwork.com/
|
data/lib/chronofage/runner.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'socket'
|
2
|
-
|
3
|
-
module Chronofage
|
4
|
-
class Runner < ::ActiveRecord::Base
|
5
|
-
self.table_name = "chronofage_runners"
|
6
|
-
|
7
|
-
class MaxConcurrencyReached < StandardError
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.register!(queue_name, concurrency)
|
11
|
-
if concurrent_runnners(queue_name).count >= concurrency
|
12
|
-
raise MaxConcurrencyReached
|
13
|
-
else
|
14
|
-
create!(queue_name: queue_name, host: host)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.concurrent_runnners(queue_name)
|
19
|
-
where(queue_name: queue_name, host: host)
|
20
|
-
end
|
21
|
-
|
22
|
-
def unregister!
|
23
|
-
destroy!
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def self.host
|
29
|
-
Socket.gethostname
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|