oxen_job 0.0.3 → 0.0.4
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/.gitignore +1 -0
- data/app/controllers/oxen/background_jobs_controller.rb +18 -0
- data/app/helpers/oxen/background_jobs_helpers.rb +7 -0
- data/app/models/ox_background_job.rb +17 -0
- data/app/policies/oxen/background_job_policy.rb +51 -0
- data/app/views/oxen/background_jobs/_background_job.html.haml +8 -0
- data/app/views/oxen/background_jobs/_background_jobs.html.haml +22 -0
- data/bin/delayed_job +5 -0
- data/config/routes.rb +6 -0
- data/lib/generators/oxen_job/job_generator.rb +29 -0
- data/lib/generators/oxen_job/templates/create_jobs.rb +19 -0
- data/lib/ox_job.rb +107 -0
- data/lib/oxen_job/engine.rb +7 -0
- data/lib/oxen_job/version.rb +1 -1
- metadata +16 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57f22bd37f191f701b19c5bbf295b46b46abd67d
|
4
|
+
data.tar.gz: 28753d1c88cda11bac57327d9dd16f41fb08fa3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e432e3bd1378466bc883431ffb080017d63d611fbbf573540664fce3e7a4271e19a61feb9fc0d735f7b26f9c160671f82de78265211a9a7adbd23bfb5f41dfa
|
7
|
+
data.tar.gz: 4401bf23360e20c0271cd4ff1c50127613af6c5ce9f53fc7a61db0d196b8e24b86c879ba9d7382f1373222ec7ebcac29937970cefda235150d9064eee5595ec6
|
data/.gitignore
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
class Oxen::BackgroundJobsController < AbstractResourcesController
|
2
|
+
|
3
|
+
private
|
4
|
+
# Use callbacks to share common setup or constraints between actions.
|
5
|
+
# def set_account
|
6
|
+
# @account = Account.find(params[:id])
|
7
|
+
# end
|
8
|
+
|
9
|
+
# Never trust parameters from the scary internet, only allow the white list through.
|
10
|
+
# def account_params
|
11
|
+
# params.require(:account).permit(:name)
|
12
|
+
# end
|
13
|
+
|
14
|
+
def resource_params
|
15
|
+
params.require(:account).permit(:name, :active, :default_url, :chargeable, :last_charged_at, :free_users )
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class OxBackgroundJob < AbstractResource
|
2
|
+
self.table_name = 'delayed_jobs'
|
3
|
+
establish_connection ((Rails.env=="development") ? :dev_oxen_tables : :oxen_tables )
|
4
|
+
|
5
|
+
belongs_to :account
|
6
|
+
|
7
|
+
# to make show_resource_delete_icon happy
|
8
|
+
def name
|
9
|
+
'dj'
|
10
|
+
end
|
11
|
+
|
12
|
+
def show_handler
|
13
|
+
parms = YAML::load( handler).job_data["arguments"][0]['_aj_globalid']
|
14
|
+
[parms.gsub(/^.*mgmt/,''), parms.split("/")[-2].constantize.find(parms.split("/")[-1])]
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Oxen
|
2
|
+
class BackgroundJobPolicy < AbstractResourcePolicy
|
3
|
+
|
4
|
+
class Scope < Scope
|
5
|
+
def resolve
|
6
|
+
if current_user.nil?
|
7
|
+
super
|
8
|
+
elsif current_user.admin?
|
9
|
+
scope.all
|
10
|
+
else
|
11
|
+
scope.where(id: current_user.account.id)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
def new?
|
19
|
+
current_user.admin?
|
20
|
+
end
|
21
|
+
|
22
|
+
def index?
|
23
|
+
@current_user.admin? || @current_user.account_admin?
|
24
|
+
end
|
25
|
+
|
26
|
+
def create?
|
27
|
+
@current_user.admin?
|
28
|
+
end
|
29
|
+
|
30
|
+
def show?
|
31
|
+
@current_user.admin? or @current_user.account==@model
|
32
|
+
end
|
33
|
+
|
34
|
+
def edit?
|
35
|
+
@current_user.admin? or @current_user.account==@model
|
36
|
+
end
|
37
|
+
|
38
|
+
def update?
|
39
|
+
@current_user.admin? or @current_user.account==@model
|
40
|
+
end
|
41
|
+
|
42
|
+
def destroy?
|
43
|
+
@current_user.admin?
|
44
|
+
end
|
45
|
+
|
46
|
+
def print?
|
47
|
+
@current_user.admin? || @current_user.account_admin?
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
%tr{ id: "tr-#{resource.id}"}
|
2
|
+
- if current_user.admin?
|
3
|
+
%td= link_to resource.account.name, resource.account
|
4
|
+
%td= resource.queue
|
5
|
+
%td= resource.attempts
|
6
|
+
%td= build_link_from_array resource.show_handler
|
7
|
+
%td= resource.run_at
|
8
|
+
%td= show_resource_delete_icon resource, '/admin/background_job'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
:css
|
2
|
+
a.dropdown-button {
|
3
|
+
padding-left: 1em;
|
4
|
+
padding-right: 1em;
|
5
|
+
}
|
6
|
+
|
7
|
+
- unless params[:action] == 'print'
|
8
|
+
= paginate resources
|
9
|
+
|
10
|
+
%thead
|
11
|
+
%tr
|
12
|
+
- if current_user.admin?
|
13
|
+
%th= t('.system')
|
14
|
+
%th= t('.queue')
|
15
|
+
%th= t('.attempts')
|
16
|
+
%th= t('.job_handler')
|
17
|
+
%th= t('.next_run')
|
18
|
+
%th= t(:delete)
|
19
|
+
|
20
|
+
%tbody.bordered.responsive-table.striped.hoverable.page.resources_list
|
21
|
+
- resources.each do |background_job|
|
22
|
+
= render partial: 'background_job', locals: { resource: background_job }
|
data/bin/delayed_job
ADDED
data/config/routes.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
module OxenJob
|
5
|
+
module Generators
|
6
|
+
class JobGenerator < Rails::Generators::Base
|
7
|
+
include Rails::Generators::Migration
|
8
|
+
def self.source_root
|
9
|
+
@source_root ||= File.join(File.dirname(__FILE__), 'templates')
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.next_migration_number(dirname)
|
13
|
+
if ActiveRecord::Base.timestamped_migrations
|
14
|
+
Time.new.utc.strftime("%Y%m%d%H%M%S")
|
15
|
+
else
|
16
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def create_migration_file
|
22
|
+
migration_template 'create_jobs.rb', 'db/migrate/create_jobs.rb'
|
23
|
+
# allow the clock to advance 1sec
|
24
|
+
# sleep 1
|
25
|
+
# migration_template 'user_permission.rb', 'db/migrate/create_user_permissions.rb'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class CreateJobs < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :delayed_jobs, force: true do |table|
|
4
|
+
table.references :account, null: false, index: true
|
5
|
+
table.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue
|
6
|
+
table.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually.
|
7
|
+
table.text :handler, null: false # YAML-encoded string of the object that will do work
|
8
|
+
table.text :last_error # reason for last failure (See Note below)
|
9
|
+
table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
|
10
|
+
table.datetime :locked_at # Set when a client is working on this object
|
11
|
+
table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
|
12
|
+
table.string :locked_by # Who is working on this object (if locked)
|
13
|
+
table.string :queue # The name of the queue this job is in
|
14
|
+
table.timestamps null: true
|
15
|
+
end
|
16
|
+
|
17
|
+
add_index :delayed_jobs, [:priority, :run_at], name: "delayed_jobs_priority"
|
18
|
+
end
|
19
|
+
end
|
data/lib/ox_job.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'delayed_job'
|
2
|
+
require 'delayed_job_active_record'
|
3
|
+
#
|
4
|
+
# defining a hook on the enqueue
|
5
|
+
module ActiveJob
|
6
|
+
module QueueAdapters
|
7
|
+
class DelayedJobAdapter
|
8
|
+
class JobWrapper
|
9
|
+
|
10
|
+
def max_attempts
|
11
|
+
3
|
12
|
+
end
|
13
|
+
|
14
|
+
def enqueue args
|
15
|
+
args.account_id = YAML::load( args.handler).job_data["arguments"][1]["account_id"]
|
16
|
+
end
|
17
|
+
|
18
|
+
# def before(job)
|
19
|
+
# Rails.logger.info "-------------> before"
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# def after(job)
|
23
|
+
# Rails.logger.info "-------------> after"
|
24
|
+
# end
|
25
|
+
|
26
|
+
def success(job)
|
27
|
+
jd = YAML::load( job.handler).job_data
|
28
|
+
Rails.logger.info "OXEN (%s) executed successfully by DelayedJobAdapter on ActiveJob! Job was %s" % [jd['job_class'], jd['arguments'][0]["_aj_globalid"]]
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
# If delayed_job runs into errors or exceptions it will hook/callback to the error method.
|
33
|
+
# cycle_error will be called and the state of the PrintJob will be changed.
|
34
|
+
def error(job, exception)
|
35
|
+
begin
|
36
|
+
jd = YAML::load( job.handler).job_data
|
37
|
+
Rails.logger.error "OXEN ERROR (%s) executed unsuccessfully by DelayedJobAdapter on ActiveJob! Message is: #{exception.message}" % jd['job_class']
|
38
|
+
parms=jd['arguments'][0]['_aj_globalid'].split("/")
|
39
|
+
parms[-2].constantize.find(parms[-1]).update_column( :state, "job encounters an exception - #{exception.message}")
|
40
|
+
rescue
|
41
|
+
# logger.error("[OXEN] #{Time.now} [error] %s %s" % [I18n.oxt('print_job_error'),exception.message])
|
42
|
+
Rails.logger.error "OXEN ERROR (unknown) executed unsuccessfully by DelayedJobAdapter on ActiveJob! Message is: #{exception.message}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
# If delayed_job has used up all its attempts and is unable to render and print the job, the PrintJob will fail and delayed_job will hook/callback to the method failure
|
48
|
+
# Look also in delayed_job_config.rb to see the configuration for delayed_job.
|
49
|
+
# Failed jobs will not be deleted, which is normally the default configuration.
|
50
|
+
def failure(job)
|
51
|
+
begin
|
52
|
+
jd = YAML::load( job.handler).job_data
|
53
|
+
Rails.logger.error "OXEN ERROR FAILURE (%s) executed unsuccessfully by DelayedJobAdapter on ActiveJob and gave up! Message is: #{exception.message}" % jd['job_class']
|
54
|
+
parms=jd['arguments'][0]['_aj_globalid'].split("/")
|
55
|
+
parms[-2].constantize.find(parms[-1]).update_column( :state, "job encounters an exception - #{exception.message}")
|
56
|
+
rescue
|
57
|
+
# logger.error("[OXEN] #{Time.now} [error] %s %s" % [I18n.oxt('print_job_error'),exception.message])
|
58
|
+
Rails.logger.error "OXEN ERROR FAILURE (unknown) executed unsuccessfully by DelayedJobAdapter on ActiveJob and gave up! Message is: #{exception.message}"
|
59
|
+
end
|
60
|
+
|
61
|
+
#Airbrake.notify(exception)
|
62
|
+
# cycle_error
|
63
|
+
#logger.debug "Printeren svarer ikke!"
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
#
|
73
|
+
#
|
74
|
+
class OxJob < ActiveJob::Base
|
75
|
+
queue_as :default
|
76
|
+
|
77
|
+
# at least implement this method on your job classes inherited from OxJob
|
78
|
+
#
|
79
|
+
def perform
|
80
|
+
raise "You need to implement perform on your job class!"
|
81
|
+
end
|
82
|
+
|
83
|
+
# hooks
|
84
|
+
#
|
85
|
+
before_enqueue do |job|
|
86
|
+
job.arguments.first.update_column :state, I18n.t( "#{job.arguments.first.class.to_s.underscore.pluralize}.enqueueing")
|
87
|
+
job.arguments << {account_id: job.arguments.first.account_id}
|
88
|
+
end
|
89
|
+
#
|
90
|
+
# around_enqueue
|
91
|
+
after_enqueue do |job|
|
92
|
+
job.arguments.first.update_column :state, I18n.t( "#{job.arguments.first.class.to_s.underscore.pluralize}.enqueued")
|
93
|
+
end
|
94
|
+
#
|
95
|
+
before_perform do |job|
|
96
|
+
job.arguments.first.update_column :state, I18n.t( "#{job.arguments.first.class.to_s.underscore.pluralize}.prepare_to_perform")
|
97
|
+
end
|
98
|
+
#
|
99
|
+
# around_perform do |job|
|
100
|
+
#
|
101
|
+
# end
|
102
|
+
after_perform do |job|
|
103
|
+
job.arguments.first.update_column :state, I18n.t( "#{job.arguments.first.class.to_s.underscore.pluralize}.done_performing")
|
104
|
+
end
|
105
|
+
#
|
106
|
+
|
107
|
+
end
|
data/lib/oxen_job/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oxen_job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Walther H Diechmann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: delayed_job
|
@@ -69,7 +69,8 @@ dependencies:
|
|
69
69
|
description: 'Provides interfaces to DelayedJob via the ActiveJob '
|
70
70
|
email:
|
71
71
|
- walther@diechmann.net
|
72
|
-
executables:
|
72
|
+
executables:
|
73
|
+
- delayed_job
|
73
74
|
extensions: []
|
74
75
|
extra_rdoc_files: []
|
75
76
|
files:
|
@@ -78,7 +79,19 @@ files:
|
|
78
79
|
- LICENSE.txt
|
79
80
|
- README.md
|
80
81
|
- Rakefile
|
82
|
+
- app/controllers/oxen/background_jobs_controller.rb
|
83
|
+
- app/helpers/oxen/background_jobs_helpers.rb
|
84
|
+
- app/models/ox_background_job.rb
|
85
|
+
- app/policies/oxen/background_job_policy.rb
|
86
|
+
- app/views/oxen/background_jobs/_background_job.html.haml
|
87
|
+
- app/views/oxen/background_jobs/_background_jobs.html.haml
|
88
|
+
- bin/delayed_job
|
89
|
+
- config/routes.rb
|
90
|
+
- lib/generators/oxen_job/job_generator.rb
|
91
|
+
- lib/generators/oxen_job/templates/create_jobs.rb
|
92
|
+
- lib/ox_job.rb
|
81
93
|
- lib/oxen_job.rb
|
94
|
+
- lib/oxen_job/engine.rb
|
82
95
|
- lib/oxen_job/version.rb
|
83
96
|
- oxen_job.gemspec
|
84
97
|
homepage: ''
|