workhorse 1.2.13 → 1.2.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c528399ac973ce36bd6bdb993ac2d234eddf8836b8fc997031dd4009487ed252
4
- data.tar.gz: 8482be9f53a1c8b5eb238784a6f350f79a0bf7b5c2c42a3921667ef2a82340d6
3
+ metadata.gz: 0a1665e70227e5e6fad1115523a94c7457a9b9b7216e10d2092c0326817bfd44
4
+ data.tar.gz: f6a1d79bf0f55a8f2756934bb58ab3aefb83ef6369ffec7c783ef8cd6dfa50b0
5
5
  SHA512:
6
- metadata.gz: 83b44c60c1789755e2d09a2f32ea71728287d54ab1904bf5a6f9e88f225d02da0280d784e56d3352c336efb292aa864f841b85d1c085df7425878551bdec27ed
7
- data.tar.gz: a554b93bc1c0c18bd1472981e2a84e80f79dfc0561f03c89839cc9e4f32d6480cb4fa327cd046cc8d9582a142af1092a4ffb1c5c492cb79fbb5af2fb3ebef725
6
+ metadata.gz: 8dde03d8f2a8f5c05307787433ef308c99c34ad2ab59d7c2edcc352c0428241a48ee5d0356f4a9a35a0de7dac876d60e1c09cd3c016915929f786a387a9e75e6
7
+ data.tar.gz: b380dff403c8c10df7c2472422e462d66d40bff3796cbee09e81c63c11eafe4ba4a0d0dd361828f5a984f738fe30744b6fcea3616b6a54a9d1f7df016b21219f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Workhorse Changelog
2
2
 
3
+ ## 1.2.14 - 2023-08-23
4
+
5
+ * Add documentation for transaction handling.
6
+
7
+ * Add support for skipping transactions on a per-job basis
8
+
3
9
  ## 1.2.13 - 2023-02-20
4
10
 
5
11
  * Add the `config.max_global_lock_fails` setting (defaults to 10). If a
data/README.md CHANGED
@@ -278,6 +278,57 @@ polling interval.
278
278
  This setting is recommended for all setups and may eventually be enabled by
279
279
  default.
280
280
 
281
+ ## Transactions
282
+
283
+ By default, each job is run in an individual database transaction. An exception
284
+ to this is when performing ActiveJob jobs using `perform_now`, where no
285
+ transaction is created.
286
+
287
+ ### Transaction callback
288
+
289
+ By default, transactions are created using `ActiveRecord::Base.transaction { ...
290
+ }`. You can customize this using the setting `config.tx_callback` in your
291
+ `config/initializers/workhorse.rb` (see commented out section in the generated
292
+ configuration file).
293
+
294
+ ### Turning off transactions
295
+
296
+ You can turn off transaction wrapping in the following ways:
297
+
298
+ - Globally using the setting `config.perform_jobs_in_tx = false` in your
299
+ `config/initializers/workhorse.rb`. This is not recommended as running jobs
300
+ without transactions can potentially be harmful.
301
+
302
+ - On a per-job basis. This is the recommended approach for jobs that either open
303
+ up their own transaction(s) or jobs that explicitly do not need a transaction
304
+ for whatever reason.
305
+
306
+ Usage of this feature depends on whether you are dealing with an ActiveJob job
307
+ or a plain Workhorse job class.
308
+
309
+ For ActiveJob:
310
+
311
+ 1. Add the following mixin to your job class (usually `ApplicationJob`):
312
+
313
+ ```ruby
314
+ class ApplicationJob
315
+ include Workhorse::ActiveJobExtension
316
+ end
317
+ ```
318
+
319
+ 2. Use the DSL-method `skip_tx` inside the job classes where you want to
320
+ disable transaction wrapping, e.g.:
321
+
322
+ ```ruby
323
+ class MyJob < ApplicationJob
324
+ skip_tx
325
+
326
+ def perform
327
+ # Something without transaction
328
+ end
329
+ end
330
+ ```
331
+
281
332
  ## Exception handling
282
333
 
283
334
  Per default, exceptions occurring in a worker thread will only be visible in the
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.13
1
+ 1.2.14
@@ -0,0 +1,20 @@
1
+ module Workhorse
2
+ module ActiveJobExtension
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ class_attribute :_skip_tx
7
+ self._skip_tx = false
8
+ end
9
+
10
+ module ClassMethods
11
+ def skip_tx
12
+ self._skip_tx = true
13
+ end
14
+
15
+ def skip_tx?
16
+ _skip_tx
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,9 +1,15 @@
1
1
  module Workhorse::Jobs
2
2
  class RunActiveJob
3
+ attr_reader :job_data
4
+
3
5
  def initialize(job_data)
4
6
  @job_data = job_data
5
7
  end
6
8
 
9
+ def job_class
10
+ @job_data['job_class'].safe_constantize
11
+ end
12
+
7
13
  def perform
8
14
  ActiveJob::Base.execute(@job_data)
9
15
  end
@@ -61,7 +61,11 @@ module Workhorse
61
61
  log 'Performing', :info
62
62
  log "Description: #{@db_job.description}", :info unless @db_job.description.blank?
63
63
 
64
- if Workhorse.perform_jobs_in_tx
64
+ inner_job_class = deserialized_job.try(:job_class) || deserialized_job.class
65
+ skip_tx = inner_job_class.try(:skip_tx?)
66
+ log "SKIP TX: #{skip_tx.inspect}".red, :error
67
+
68
+ if Workhorse.perform_jobs_in_tx && !skip_tx
65
69
  Workhorse.tx_callback.call do
66
70
  deserialized_job.perform
67
71
  end
data/lib/workhorse.rb CHANGED
@@ -6,6 +6,7 @@ require 'uri'
6
6
 
7
7
  require 'workhorse/enqueuer'
8
8
  require 'workhorse/scoped_env'
9
+ require 'workhorse/active_job_extension'
9
10
 
10
11
  module Workhorse
11
12
  # Check if the available Arel version is greater or equal than 7.0.0
data/workhorse.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: workhorse 1.2.13 ruby lib
2
+ # stub: workhorse 1.2.14 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "workhorse".freeze
6
- s.version = "1.2.13"
6
+ s.version = "1.2.14"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2023-02-20"
12
- s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "CHANGELOG.md".freeze, "FAQ.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/rubocop".freeze, "lib/active_job/queue_adapters/workhorse_adapter.rb".freeze, "lib/generators/workhorse/install_generator.rb".freeze, "lib/generators/workhorse/templates/bin/workhorse.rb".freeze, "lib/generators/workhorse/templates/config/initializers/workhorse.rb".freeze, "lib/generators/workhorse/templates/create_table_jobs.rb".freeze, "lib/workhorse.rb".freeze, "lib/workhorse/daemon.rb".freeze, "lib/workhorse/daemon/shell_handler.rb".freeze, "lib/workhorse/db_job.rb".freeze, "lib/workhorse/enqueuer.rb".freeze, "lib/workhorse/jobs/cleanup_succeeded_jobs.rb".freeze, "lib/workhorse/jobs/detect_stale_jobs_job.rb".freeze, "lib/workhorse/jobs/run_active_job.rb".freeze, "lib/workhorse/jobs/run_rails_op.rb".freeze, "lib/workhorse/performer.rb".freeze, "lib/workhorse/poller.rb".freeze, "lib/workhorse/pool.rb".freeze, "lib/workhorse/scoped_env.rb".freeze, "lib/workhorse/worker.rb".freeze, "test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze, "workhorse.gemspec".freeze]
11
+ s.date = "2023-08-23"
12
+ s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "CHANGELOG.md".freeze, "FAQ.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/rubocop".freeze, "lib/active_job/queue_adapters/workhorse_adapter.rb".freeze, "lib/generators/workhorse/install_generator.rb".freeze, "lib/generators/workhorse/templates/bin/workhorse.rb".freeze, "lib/generators/workhorse/templates/config/initializers/workhorse.rb".freeze, "lib/generators/workhorse/templates/create_table_jobs.rb".freeze, "lib/workhorse.rb".freeze, "lib/workhorse/active_job_extension.rb".freeze, "lib/workhorse/daemon.rb".freeze, "lib/workhorse/daemon/shell_handler.rb".freeze, "lib/workhorse/db_job.rb".freeze, "lib/workhorse/enqueuer.rb".freeze, "lib/workhorse/jobs/cleanup_succeeded_jobs.rb".freeze, "lib/workhorse/jobs/detect_stale_jobs_job.rb".freeze, "lib/workhorse/jobs/run_active_job.rb".freeze, "lib/workhorse/jobs/run_rails_op.rb".freeze, "lib/workhorse/performer.rb".freeze, "lib/workhorse/poller.rb".freeze, "lib/workhorse/pool.rb".freeze, "lib/workhorse/scoped_env.rb".freeze, "lib/workhorse/worker.rb".freeze, "test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze, "workhorse.gemspec".freeze]
13
13
  s.rubygems_version = "3.0.3".freeze
14
14
  s.summary = "Multi-threaded job backend with database queuing for ruby.".freeze
15
15
  s.test_files = ["test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workhorse
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.13
4
+ version: 1.2.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-20 00:00:00.000000000 Z
11
+ date: 2023-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -178,8 +178,8 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
- description:
182
- email:
181
+ description:
182
+ email:
183
183
  executables: []
184
184
  extensions: []
185
185
  extra_rdoc_files: []
@@ -203,6 +203,7 @@ files:
203
203
  - lib/generators/workhorse/templates/config/initializers/workhorse.rb
204
204
  - lib/generators/workhorse/templates/create_table_jobs.rb
205
205
  - lib/workhorse.rb
206
+ - lib/workhorse/active_job_extension.rb
206
207
  - lib/workhorse/daemon.rb
207
208
  - lib/workhorse/daemon/shell_handler.rb
208
209
  - lib/workhorse/db_job.rb
@@ -227,10 +228,10 @@ files:
227
228
  - test/workhorse/pool_test.rb
228
229
  - test/workhorse/worker_test.rb
229
230
  - workhorse.gemspec
230
- homepage:
231
+ homepage:
231
232
  licenses: []
232
233
  metadata: {}
233
- post_install_message:
234
+ post_install_message:
234
235
  rdoc_options: []
235
236
  require_paths:
236
237
  - lib
@@ -245,8 +246,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
246
  - !ruby/object:Gem::Version
246
247
  version: '0'
247
248
  requirements: []
248
- rubygems_version: 3.0.3.1
249
- signing_key:
249
+ rubygems_version: 3.4.10
250
+ signing_key:
250
251
  specification_version: 4
251
252
  summary: Multi-threaded job backend with database queuing for ruby.
252
253
  test_files: