crono_trigger 0.6.0 → 0.6.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a9b3bad7ab74a886398bcffaa3f2d935ec35dcd83819abe6b24c0453771a4d1
4
- data.tar.gz: 4afa776cb8305b9a95b92c180a3c6da86f0ed205e32a93f3887084b3f498e980
3
+ metadata.gz: e08f955458cc12b3cd3f3aab84e0f662d760c7a72872c655708e70aa4d4d0ac3
4
+ data.tar.gz: de4c5fdd13008080291d3adf542e05a9fb5e233f423a8d83ea8bc0bc70a09cde
5
5
  SHA512:
6
- metadata.gz: 7e42ef78268d05a3add743f0616fbaa0ea69dba395328a1304fd1a7b18450777ce9c97ccd7be58f59a47d5f5b7c0854098ca74f5756d1b07470b91d42305ba29
7
- data.tar.gz: 1ae81221b5251c7ede8d204385910930162bebba7d74ed743fd5978461c9a9d008b9ede5e3c8890ab02b2867030d088032e5776441e073f26a080b8b53410b5b
6
+ metadata.gz: ff4f9d234a111fe0d6815e8d6e4d60a003bfc1891a299b808ac89bfc62ef05f4f0146b770ea924c5a7c592852bfb613053ea41ae51344fcc86c2ed4b00c0ea6f
7
+ data.tar.gz: eed66811d98184c25ecaa8c8fcecc9a44b4dcf46f8cff4bd469af2131ce948c9eca1f0dfa3185d6e3f42f1411322934d74ba666daa0b014d2092cff0cb46a0c1
@@ -0,0 +1,27 @@
1
+ name: RSpec
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby-version: ['2.7', '3.0', '3.1']
15
+
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - name: Set up Ruby
19
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
20
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
21
+ # uses: ruby/setup-ruby@v1
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby-version }}
25
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
26
+ - name: Run tests
27
+ run: bundle exec rake
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CronoTrigger
2
2
  [![Gem Version](https://badge.fury.io/rb/crono_trigger.svg)](https://badge.fury.io/rb/crono_trigger)
3
- [![Build Status](https://travis-ci.org/joker1007/crono_trigger.svg?branch=master)](https://travis-ci.org/joker1007/crono_trigger)
3
+ ![rspec](https://github.com/joker1007/crono_trigger/actions/workflows/rspec.yml/badge.svg)
4
4
  [![codecov](https://codecov.io/gh/joker1007/crono_trigger/branch/master/graph/badge.svg)](https://codecov.io/gh/joker1007/crono_trigger)
5
5
 
6
6
  Asynchronous Job Scheduler for Rails.
@@ -137,10 +137,17 @@ mail.next_execute_at # => next 13:00 with Asia/Japan
137
137
 
138
138
  #### Run Worker
139
139
 
140
+ ues `crono_trigger` command.
141
+ `crono_trigger` command accepts model class names.
142
+
143
+ For example,
144
+
140
145
  ```
141
146
  $ crono_trigger MailNotification
142
147
  ```
143
148
 
149
+ And other options is following.
150
+
144
151
  ```
145
152
  $ crono_trigger --help
146
153
  Usage: crono_trigger [options] MODEL [MODEL..]
@@ -31,7 +31,7 @@ opt_parser = OptionParser.new do |opts|
31
31
  end
32
32
 
33
33
  opts.on("-c", "--concurrency=SIZE", Integer, "Execute thread size (Default: 25)") do |i|
34
- options[:execute_thread] = i
34
+ options[:executor_thread] = i
35
35
  end
36
36
 
37
37
  opts.on("-l", "--log=LOGFILE", "Set log output destination (Default: STDOUT or ./crono_trigger.log if daemonize is true)") do |log|
@@ -67,7 +67,7 @@ end
67
67
 
68
68
  CronoTrigger.load_config(options[:config], options[:env]) if options[:config]
69
69
 
70
- %i(polling_thread polling_interval execute_thread).each do |name|
70
+ %i(worker_id polling_thread polling_interval executor_thread).each do |name|
71
71
  CronoTrigger.config[name] = options[name] if options[name]
72
72
  end
73
73
 
@@ -5,6 +5,9 @@ module CronoTrigger
5
5
  @stop_flag = stop_flag
6
6
  @logger = logger
7
7
  @executor = executor
8
+ if @executor.fallback_policy != :caller_runs
9
+ raise ArgumentError, "executor's fallback policies except for :caller_runs are not supported"
10
+ end
8
11
  @execution_counter = execution_counter
9
12
  @quiet = Concurrent::AtomicBoolean.new(false)
10
13
  end
@@ -50,34 +53,28 @@ module CronoTrigger
50
53
  end
51
54
 
52
55
  def poll(model)
53
- @logger.debug "(polling-thread-#{Thread.current.object_id}) Poll #{model}"
54
- records = []
55
- overflowed_record_ids = []
56
+ @logger.info "(polling-thread-#{Thread.current.object_id}) Poll #{model}"
56
57
 
57
- begin
58
- model.connection_pool.with_connection do
59
- records = model.executables_with_lock
58
+ maybe_has_next = true
59
+ while maybe_has_next
60
+ records, maybe_has_next = model.connection_pool.with_connection do
61
+ model.executables_with_lock
60
62
  end
61
63
 
62
64
  records.each do |record|
63
- begin
64
- @executor.post do
65
- @execution_counter.increment
66
- begin
67
- process_record(record)
68
- ensure
69
- @execution_counter.decrement
70
- end
65
+ @executor.post do
66
+ @execution_counter.increment
67
+ begin
68
+ process_record(record)
69
+ ensure
70
+ @execution_counter.decrement
71
71
  end
72
- rescue Concurrent::RejectedExecutionError
73
- overflowed_record_ids << record.id
74
72
  end
75
73
  end
76
- unlock_overflowed_records(model, overflowed_record_ids)
77
- end while overflowed_record_ids.empty? && records.any?
74
+ end
78
75
  end
79
76
 
80
- private
77
+ private
81
78
 
82
79
  def process_record(record)
83
80
  record.class.connection_pool.with_connection do
@@ -88,16 +85,5 @@ module CronoTrigger
88
85
  @logger.error(ex)
89
86
  CronoTrigger::GlobalExceptionHandler.handle_global_exception(ex)
90
87
  end
91
-
92
- def unlock_overflowed_records(model, overflowed_record_ids)
93
- model.connection_pool.with_connection do
94
- unless overflowed_record_ids.empty?
95
- model.where(id: overflowed_record_ids).crono_trigger_unlock_all!
96
- end
97
- end
98
- rescue ActiveRecord::ConnectionNotEstablished, ActiveRecord::LockWaitTimeout, ActiveRecord::StatementTimeout, ActiveRecord::Deadlocked
99
- sleep 1
100
- retry
101
- end
102
88
  end
103
89
  end
@@ -34,7 +34,7 @@ module CronoTrigger
34
34
 
35
35
  define_model_callbacks :execute, :retry
36
36
 
37
- scope :executables, ->(from: Time.current, limit: CronoTrigger.config.executor_thread * 3 || 100, including_locked: false) do
37
+ scope :executables, ->(from: Time.current, limit: CronoTrigger.config.executor_thread * 3, including_locked: false) do
38
38
  t = arel_table
39
39
 
40
40
  rel = where(t[crono_trigger_column_name(:next_execute_at)].lteq(from))
@@ -56,15 +56,16 @@ module CronoTrigger
56
56
  rel
57
57
  end
58
58
 
59
- before_create :set_current_cyctle_id
59
+ before_create :set_current_cycle_id
60
60
  before_update :update_next_execute_at_if_update_cron
61
61
 
62
62
  validate :validate_cron_format
63
63
  end
64
64
 
65
65
  module ClassMethods
66
- def executables_with_lock(limit: CronoTrigger.config.executor_thread * 3 || 100)
66
+ def executables_with_lock(limit: CronoTrigger.config.executor_thread * 3)
67
67
  ids = executables(limit: limit).pluck(:id)
68
+ maybe_has_next = !ids.empty?
68
69
  records = []
69
70
  ids.each do |id|
70
71
  transaction do
@@ -75,7 +76,7 @@ module CronoTrigger
75
76
  end
76
77
  end
77
78
  end
78
- records
79
+ [records, maybe_has_next]
79
80
  end
80
81
 
81
82
  def crono_trigger_column_name(name)
@@ -305,7 +306,7 @@ module CronoTrigger
305
306
  end
306
307
  end
307
308
 
308
- def set_current_cyctle_id
309
+ def set_current_cycle_id
309
310
  if self.class.column_names.include?(crono_trigger_column_name(:current_cycle_id)) &&
310
311
  self[crono_trigger_column_name(:current_cycle_id)].nil?
311
312
  self[crono_trigger_column_name(:current_cycle_id)] = SecureRandom.uuid
@@ -1,3 +1,3 @@
1
1
  module CronoTrigger
2
- VERSION = "0.6.0"
2
+ VERSION = "0.6.3"
3
3
  end
@@ -24,6 +24,7 @@ module CronoTrigger
24
24
  min_threads: 1,
25
25
  max_threads: CronoTrigger.config.executor_thread,
26
26
  max_queue: CronoTrigger.config.executor_thread * 2,
27
+ fallback_policy: :caller_runs,
27
28
  )
28
29
  @execution_counter = Concurrent::AtomicFixnum.new
29
30
  @logger = Logger.new(STDOUT) unless @logger
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crono_trigger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - joker1007
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-21 00:00:00.000000000 Z
11
+ date: 2022-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chrono
@@ -244,6 +244,7 @@ executables:
244
244
  extensions: []
245
245
  extra_rdoc_files: []
246
246
  files:
247
+ - ".github/workflows/rspec.yml"
247
248
  - ".gitignore"
248
249
  - ".rspec"
249
250
  - ".travis.yml"
@@ -324,7 +325,7 @@ homepage: https://github.com/joker1007/crono_trigger
324
325
  licenses:
325
326
  - MIT
326
327
  metadata: {}
327
- post_install_message:
328
+ post_install_message:
328
329
  rdoc_options: []
329
330
  require_paths:
330
331
  - lib
@@ -339,8 +340,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
339
340
  - !ruby/object:Gem::Version
340
341
  version: '0'
341
342
  requirements: []
342
- rubygems_version: 3.1.2
343
- signing_key:
343
+ rubygems_version: 3.3.3
344
+ signing_key:
344
345
  specification_version: 4
345
346
  summary: In Service Asynchronous Job Scheduler for Rails
346
347
  test_files: []