que 2.2.1 → 2.4.0

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: 0ab8266596317c607383b8041784ef57580260a1823ff62f7e25da2171eda072
4
- data.tar.gz: 7af7354cb7d22d69c97070c7ef4fd075adb23af081ab75f56d587e73a940e208
3
+ metadata.gz: 37c1d6014ec840c445c2142cdd46646409b21d1513bcd1a6d6cea125afe714fb
4
+ data.tar.gz: bf5215a463ca64b5acee7a6a080296e9dcb39b9fea8399576ad758e63e424edd
5
5
  SHA512:
6
- metadata.gz: 37cbca060d09e4925d6869bee31365c315e274e7d02f9c6bfe6d866082bda4265c890785e04ed740a1d969e282b44dc38bde0accfe7c033ac170ddb136573c91
7
- data.tar.gz: addec5796eedda7f4dd6561445b387f9066cb2096d583d33f562fb7768af15705384677ca7401086a99c012deb432cdbf138c4ca4e81b09bcbf1f010fa1924ce
6
+ metadata.gz: 32845cf47073ed8bda56f7bd4594dbd65cceb48324460436437251049fda2548bda517db107034733c5dbbf15edba403111afaf41526ae6a09356aee5b9b93e9
7
+ data.tar.gz: 791a05612735d7b7480557039001c9d11946b6bffca4f895d44b6a9d58e6c2b78eebb8e20b8440076832e4333e77196f2bb60849fb0f51861ba6572f202d4da7
@@ -8,16 +8,16 @@ jobs:
8
8
  strategy:
9
9
  matrix:
10
10
  ruby_version: ['2.7', '3.0', '3.1', '3.2']
11
- rails_gemfile: ['6.0', '6.1', '7.0']
11
+ rails_gemfile: ['6.0', '6.1', '7.0', '7.1']
12
12
  postgres_version: ['14']
13
13
  include:
14
14
  # Postgres versions
15
- - { ruby_version: '3.2', rails_gemfile: '7.0', postgres_version: '9' }
16
- - { ruby_version: '3.2', rails_gemfile: '7.0', postgres_version: '10' }
17
- - { ruby_version: '3.2', rails_gemfile: '7.0', postgres_version: '11' }
18
- - { ruby_version: '3.2', rails_gemfile: '7.0', postgres_version: '12' }
19
- - { ruby_version: '3.2', rails_gemfile: '7.0', postgres_version: '13' }
20
- - { ruby_version: '3.2', rails_gemfile: '7.0', postgres_version: '14' }
15
+ - { ruby_version: '3.2', rails_gemfile: '7.1', postgres_version: '9' }
16
+ - { ruby_version: '3.2', rails_gemfile: '7.1', postgres_version: '10' }
17
+ - { ruby_version: '3.2', rails_gemfile: '7.1', postgres_version: '11' }
18
+ - { ruby_version: '3.2', rails_gemfile: '7.1', postgres_version: '12' }
19
+ - { ruby_version: '3.2', rails_gemfile: '7.1', postgres_version: '13' }
20
+ - { ruby_version: '3.2', rails_gemfile: '7.1', postgres_version: '14' }
21
21
  exclude: []
22
22
  name: "Test: Ruby ${{ matrix.ruby_version }}, Rails ${{ matrix.rails_gemfile }}, PostgreSQL ${{ matrix.postgres_version }}"
23
23
  services:
@@ -45,7 +45,7 @@ jobs:
45
45
  run: |
46
46
  sudo apt-get -yqq install libpq-dev postgresql-client
47
47
  createdb que-test
48
- gem install bundler
48
+ gem install bundler --version '~> 2.4.22'
49
49
  bundle install --jobs 4 --retry 3
50
50
  USE_RAILS=true bundle exec rake test
51
51
  bundle exec rake test
data/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  <!-- MarkdownTOC autolink=true -->
4
4
 
5
+ - [2.4.0 \(2024-08-21\)](#240-2024-08-21)
6
+ - [2.3.0 \(2023-10-16\)](#230-2023-10-16)
5
7
  - [2.2.1 \(2023-04-28\)](#221-2023-04-28)
6
8
  - [2.2.0 \(2022-08-29\)](#220-2022-08-29)
7
9
  - [2.1.0 \(2022-08-25\)](#210-2022-08-25)
@@ -57,6 +59,28 @@
57
59
 
58
60
  <!-- /MarkdownTOC -->
59
61
 
62
+ ## 2.4.0 (2024-08-21)
63
+
64
+ - **Fixed**:
65
+ + Fixed `Que.server?` method returning the inverse of what was intended. This method can be used to determine whether Que is running as a server process (run from the Que CLI). [#426](https://github.com/que-rb/que/pull/426), context in [#382](https://github.com/que-rb/que/pull/382)
66
+ - **Added**:
67
+ + Added logging of full job details rather than just `job_id`. Note that the hash `Que.log_formatter` is called with no longer contains `:job_id`; instead it now has a `:job` hash including `:id`. [#428](https://github.com/que-rb/que/pull/428)
68
+ - **Documentation**:
69
+ + Improved wording of transaction recommendation in the readme for destroying a job. [#417](https://github.com/que-rb/que/pull/417)
70
+ + Added [que-view](https://github.com/kortirso/que-view) to the list of Que-compatible projects in the readme: "A Rails engine-based UI for inspecting your job queue". [#418](https://github.com/que-rb/que/pull/418)
71
+
72
+ ## 2.3.0 (2023-10-16)
73
+
74
+ - **Fixed**:
75
+ + Don't clear `ActiveRecord` connections when `run_synchronously` is enabled [#393](https://github.com/que-rb/que/pull/393)
76
+
77
+ - **Changed**
78
+ + Improve performance of query used by `QueJob#by_job_class` for jobs wrapped by `ActiveJob` [#394](https://github.com/que-rb/que/pull/394)
79
+
80
+ - **Added**
81
+ + Allow `que` to be started without listen/notify [#395](https://github.com/que-rb/que/pull/395)
82
+ + Support Rails 7.1+ [#403](https://github.com/que-rb/que/pull/403)
83
+
60
84
  ## 2.2.1 (2023-04-28)
61
85
 
62
86
  - **Fixed**:
data/Dockerfile CHANGED
@@ -5,7 +5,7 @@ RUN apt-get update \
5
5
  && apt-get install -y libpq-dev \
6
6
  && rm -rf /var/lib/apt/lists/*
7
7
 
8
- ENV RUBY_BUNDLER_VERSION 2.3.7
8
+ ENV RUBY_BUNDLER_VERSION 2.4.22
9
9
  RUN gem install bundler -v $RUBY_BUNDLER_VERSION
10
10
 
11
11
  ENV BUNDLE_PATH /usr/local/bundle
data/README.md CHANGED
@@ -92,7 +92,7 @@ class ChargeCreditCard < Que::Job
92
92
 
93
93
  # It's best to destroy the job in the same transaction as any other
94
94
  # changes you make. Que will mark the job as destroyed for you after the
95
- # run method if you don't do it yourself, but if your job writes to the DB
95
+ # run method if you don't do it yourself; however if your job writes to the DB
96
96
  # but doesn't destroy the job in the same transaction, it's possible that
97
97
  # the job could be repeated in the event of a crash.
98
98
  destroy
@@ -189,9 +189,11 @@ There are a couple ways to do testing. You may want to set `Que::Job.run_synchro
189
189
  These projects are tested to be compatible with Que 1.x:
190
190
 
191
191
  - [que-web](https://github.com/statianzo/que-web) is a Sinatra-based UI for inspecting your job queue.
192
+ - [que-view](https://github.com/kortirso/que-view) is a Rails engine-based UI for inspecting your job queue.
192
193
  - [que-scheduler](https://github.com/hlascelles/que-scheduler) lets you schedule tasks using a cron style config file.
193
194
  - [que-locks](https://github.com/airhorns/que-locks) lets you lock around job execution for so only one job runs at once for a set of arguments.
194
195
  - [que-unique](https://github.com/bambooengineering/que-unique) provides fast in-memory `enqueue` deduping.
196
+ - [que-prometheus](https://github.com/mnbbrown/que-prometheus) exposes Prometheus API endpoints for job, worker, and queue metrics
195
197
 
196
198
  If you have a project that uses or relates to Que, feel free to submit a PR adding it to the list!
197
199
 
data/docs/README.md CHANGED
@@ -349,7 +349,7 @@ que --worker-count 1
349
349
  By default, Que logs important information in JSON to either Rails' logger (when running in a Rails web process) or STDOUT (when running via the `que` executable). So, your logs will look something like:
350
350
 
351
351
  ```
352
- I, [2017-08-12T05:07:31.094201 #4687] INFO -- : {"lib":"que","hostname":"lovelace","pid":21626,"thread":21471100,"event":"job_worked","job_id":6157665,"elapsed":0.531411}
352
+ I, [2017-08-12T05:07:31.094201 #4687] INFO -- : {"lib":"que","hostname":"lovelace","pid":98240,"thread":42660,"event":"job_worked","job":{"priority":1,"run_at":"2024-07-24T11:07:10.056514Z","id":2869885284504751564,"job_class":"WorkerJob","error_count":0,"last_error_message":null,"queue":"default","last_error_backtrace":null,"finished_at":null,"expired_at":null,"args":[1],"data":{},"job_schema_version":2,"kwargs":{}},"elapsed":0.001356}
353
353
  ```
354
354
 
355
355
  Of course you can have it log wherever you like:
@@ -108,6 +108,41 @@ module Que
108
108
  end
109
109
  end
110
110
 
111
+ # This is the ActiveJob Que adapter for Rails 7.1+, given ActiveJob::QueueAdapters::QueAdapter has been removed from ActiveJob.
112
+ # For backwards compatibility, the class name of ActiveJob::QueueAdapters::QueAdapter::JobWrapper must remain the same, given this string would be in old job records in the database
113
+ if ActiveJob.gem_version >= Gem::Version.new('7.1')
114
+ module ActiveJob
115
+ module QueueAdapters
116
+ # Work around `autoload QueAdapter` being left over in ActiveJob after the adapter was removed
117
+ remove_const(:QueAdapter) if const_defined?(:QueAdapter)
118
+
119
+ class QueAdapter
120
+ def enqueue(job)
121
+ job_options = { priority: job.priority, queue: job.queue_name }
122
+ que_job = JobWrapper.enqueue job.serialize, **job_options
123
+ job.provider_job_id = que_job.attrs["job_id"]
124
+ que_job
125
+ end
126
+
127
+ def enqueue_at(job, timestamp)
128
+ job_options = { priority: job.priority, queue: job.queue_name, run_at: Time.at(timestamp) }
129
+ que_job = JobWrapper.enqueue job.serialize, **job_options
130
+ job.provider_job_id = que_job.attrs["job_id"]
131
+ que_job
132
+ end
133
+
134
+ private
135
+
136
+ class JobWrapper < Que::Job
137
+ def run(job_data)
138
+ Base.execute job_data
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+
111
146
  class ActiveJob::QueueAdapters::QueAdapter
112
147
  class JobWrapper < Que::Job
113
148
  extend Que::ActiveJob::WrapperExtensions::ClassMethods
@@ -42,7 +42,7 @@ module Que
42
42
  # feature to unknowingly leak connections to other databases. So,
43
43
  # take the additional step of telling ActiveRecord to check in all
44
44
  # of the current thread's connections after each job is run.
45
- ::ActiveRecord::Base.clear_active_connections!
45
+ ::ActiveRecord::Base.clear_active_connections! unless job.class.resolve_que_setting(:run_synchronously)
46
46
  end
47
47
  end
48
48
  end
@@ -25,9 +25,10 @@ module Que
25
25
  class << self
26
26
  def by_job_class(job_class)
27
27
  job_class = job_class.name if job_class.is_a?(Class)
28
+ job_class_doc = "[{\"job_class\": \"#{job_class}\"}]"
28
29
  where(
29
- "que_jobs.job_class = ? OR (que_jobs.job_class = 'ActiveJob::QueueAdapters::QueAdapter::JobWrapper' AND que_jobs.args->0->>'job_class' = ?)",
30
- job_class, job_class,
30
+ "que_jobs.job_class = ? OR (que_jobs.job_class = 'ActiveJob::QueueAdapters::QueAdapter::JobWrapper' AND que_jobs.args @> ?)",
31
+ job_class, job_class_doc,
31
32
  )
32
33
  end
33
34
 
@@ -50,6 +50,14 @@ module Que
50
50
  poll_interval = i
51
51
  end
52
52
 
53
+ opts.on(
54
+ '--listen [LISTEN]',
55
+ String,
56
+ "Set to false to disable listen mode (default: true)"
57
+ ) do |listen|
58
+ options[:listen] = listen != "false"
59
+ end
60
+
53
61
  opts.on(
54
62
  '-l',
55
63
  '--log-level [LEVEL]',
@@ -151,6 +159,14 @@ module Que
151
159
  ) do |p|
152
160
  options[:wait_period] = p
153
161
  end
162
+
163
+ opts.on(
164
+ '--pidfile [PATH]',
165
+ String,
166
+ "Write the PID of this process to the specified file.",
167
+ ) do |p|
168
+ options[:pidfile] = File.expand_path(p)
169
+ end
154
170
  end
155
171
 
156
172
  parser.parse!(args)
data/lib/que/locker.rb CHANGED
@@ -61,7 +61,8 @@ module Que
61
61
  wait_period: DEFAULT_WAIT_PERIOD,
62
62
  maximum_buffer_size: DEFAULT_MAXIMUM_BUFFER_SIZE,
63
63
  worker_priorities: DEFAULT_WORKER_PRIORITIES,
64
- on_worker_start: nil
64
+ on_worker_start: nil,
65
+ pidfile: nil
65
66
  )
66
67
 
67
68
  # Sanity-check all our arguments, since some users may instantiate Locker
@@ -215,10 +216,16 @@ module Que
215
216
  @connection.wrapped_connection.close
216
217
  end
217
218
  end
219
+
220
+ @pidfile = pidfile
221
+ at_exit { delete_pid }
222
+ write_pid
218
223
  end
219
224
 
220
225
  def stop!
221
- stop; wait_for_stop
226
+ stop
227
+ wait_for_stop
228
+ delete_pid
222
229
  end
223
230
 
224
231
  def stop
@@ -512,5 +519,19 @@ module Que
512
519
  "Tried to lock a job that was already locked: #{id}"
513
520
  end
514
521
  end
522
+
523
+ def write_pid
524
+ return unless @pidfile
525
+
526
+ File.open(@pidfile, "w+") do |f|
527
+ f.write(Process.pid.to_s)
528
+ end
529
+ end
530
+
531
+ def delete_pid
532
+ return unless @pidfile
533
+
534
+ File.delete(@pidfile) if File.exist?(@pidfile)
535
+ end
515
536
  end
516
537
  end
data/lib/que/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Que
4
- VERSION = '2.2.1'
4
+ VERSION = '2.4.0'
5
5
 
6
6
  def self.job_schema_version
7
7
  2
data/lib/que/worker.rb CHANGED
@@ -114,7 +114,7 @@ module Que
114
114
  if VALID_LOG_LEVELS.include?(log_level)
115
115
  log_message = {
116
116
  level: log_level,
117
- job_id: metajob.id,
117
+ job: metajob.job,
118
118
  elapsed: elapsed,
119
119
  }
120
120
 
@@ -133,7 +133,7 @@ module Que
133
133
  Que.log(
134
134
  level: :debug,
135
135
  event: :job_errored,
136
- job_id: metajob.id,
136
+ job: metajob.job,
137
137
  error: {
138
138
  class: error.class.to_s,
139
139
  message: error.message,
data/lib/que.rb CHANGED
@@ -80,7 +80,7 @@ module Que
80
80
  end
81
81
 
82
82
  def server?
83
- defined?(Que::CommandLineInterface).nil?
83
+ !defined?(Que::CommandLineInterface).nil?
84
84
  end
85
85
 
86
86
  # Support simple integration with many common connection pools.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: que
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Hanks
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-28 00:00:00.000000000 Z
11
+ date: 2024-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -115,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
115
  - !ruby/object:Gem::Version
116
116
  version: '0'
117
117
  requirements: []
118
- rubygems_version: 3.4.10
118
+ rubygems_version: 3.5.7
119
119
  signing_key:
120
120
  specification_version: 4
121
121
  summary: A PostgreSQL-based Job Queue