async-job 0.0.0 → 0.2.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: 2fa7b9ed6bf57940243caa6fae0e8d72a9e5c6eaf38f13311b800abb80850c09
4
- data.tar.gz: 9dce5abfa5b06e6e00592e6ca474241ab92806d65b70c94aab0d0763e5196a19
3
+ metadata.gz: 9a816771aa488ab674c70776181481a1de707a9e6eb4c8520325b62049015a89
4
+ data.tar.gz: d15d2f5f2276d96da9c91a7badf33b6bb86b9159de1839b25b8b77fc666166af
5
5
  SHA512:
6
- metadata.gz: 79557b886d6fadc8ae47644c36916c556091f4eac1c78f5d4b3271163a00fa08d5e68931d867fe7ea1871f6257cbd9b00fd413561ecd6a3a244e101a2d2685bf
7
- data.tar.gz: 0cbce58e990cff1881f29c4c91f7db93aae228d44d85ecde799b22d88ab5824df5dbabd5c11045dddba01c37d0b644914169adc8c6ed86b38fa7b353492763a7
6
+ metadata.gz: 0d47ff44888af2ce4ca369e2d1644e4d99f0dd179ca73f1f50d2362154087560031d11490f5b3887f4f1303e8eaaf4d597d8de66804b3b5f38d19d1a4ab29b03
7
+ data.tar.gz: e8f8c0a81b6980aacc5f46a5fa53de95d74ffe190af12a06542b14599d32331e941d39b44d60b80a00eff88fbb78605303dd58dc73be0b98ec42351becc49365
checksums.yaml.gz.sig CHANGED
Binary file
@@ -19,6 +19,7 @@ module Async
19
19
  if #jobs > 0 then
20
20
  redis.call('LPUSH', KEYS[2], unpack(jobs))
21
21
  end
22
+ return #jobs
22
23
  LUA
23
24
 
24
25
  def initialize(client, key)
@@ -30,9 +31,16 @@ module Async
30
31
  end
31
32
 
32
33
  def start(ready_queue, resolution: 10, parent: Async::Task.current)
34
+ Console.info(self, "Starting delayed queue...")
33
35
  parent.async do
34
36
  while true
35
- move(destination: ready_queue.key)
37
+ Console.debug(self, "Checking for delayed jobs...")
38
+ count = move(destination: ready_queue.key)
39
+
40
+ if count > 0
41
+ Console.info(self, "Moved #{count} delayed jobs to ready queue.")
42
+ end
43
+
36
44
  sleep(resolution)
37
45
  end
38
46
  end
@@ -40,8 +48,12 @@ module Async
40
48
 
41
49
  attr :key
42
50
 
43
- def add(job, job_store)
44
- @client.evalsha(@add, 2, job_store.key, @key, job.id, job.serialize, job.perform_at.to_f)
51
+ def add(job, timestamp, job_store)
52
+ id = SecureRandom.uuid
53
+
54
+ @client.evalsha(@add, 2, job_store.key, @key, id, job, timestamp.to_f)
55
+
56
+ return id
45
57
  end
46
58
 
47
59
  def move(destination:, now: Time.now.to_i)
@@ -69,10 +69,7 @@ module Async
69
69
  attr :key
70
70
 
71
71
  def fetch
72
- Console.info(self, "Fetching job...")
73
- id = @client.brpoplpush(@ready_queue.key, @pending_key, 0)
74
- Console.info(self, "Fetching job: #{id}")
75
- return id
72
+ @client.brpoplpush(@ready_queue.key, @pending_key, 0)
76
73
  end
77
74
 
78
75
  def complete(id)
@@ -87,9 +84,10 @@ module Async
87
84
 
88
85
  def start(delay: 5, factor: 2, parent: Async::Task.current)
89
86
  heartbeat_key = "#{@key}:#{@id}"
90
-
91
87
  start_time = Time.now.to_f
92
88
 
89
+ Console.info(self, "Starting processing queue...", key: @key, id: @id, heartbeat_key: heartbeat_key, delay: delay, factor: factor)
90
+
93
91
  parent.async do
94
92
  while true
95
93
  uptime = (Time.now.to_f - start_time).round(2)
@@ -23,7 +23,11 @@ module Async
23
23
  attr :key
24
24
 
25
25
  def add(job, job_store)
26
- @client.evalsha(@add, 2, job_store.key, @key, job.id, job.serialize)
26
+ id = SecureRandom.uuid
27
+
28
+ @client.evalsha(@add, 2, job_store.key, @key, id, job)
29
+
30
+ return id
27
31
  end
28
32
  end
29
33
  end
@@ -29,6 +29,7 @@ module Async
29
29
  end
30
30
 
31
31
  def start
32
+ Console.info(self, "Starting server...")
32
33
  # Start the delayed queue, which will move jobs to the ready queue when they are ready:
33
34
  @delayed_queue.start(@ready_queue)
34
35
 
@@ -37,25 +38,28 @@ module Async
37
38
  end
38
39
 
39
40
  def enqueue(job)
40
- if perform_at = job.perform_at and perform_at > Time.now.to_f
41
- # If the job is delayed, add it to the delayed queue:
42
- @delayed_queue.add(job, @job_store)
43
- else
44
- # If the job is ready to be processed now, add it to the ready queue:
45
- @ready_queue.add(job, @job_store)
41
+ @ready_queue.add(job, @job_store)
42
+ end
43
+
44
+ def schedule(job, timestamp)
45
+ @delayed_queue.add(job, timestamp, @job_store)
46
+ end
47
+
48
+ def process(&block)
49
+ id = @processing_queue.fetch
50
+ begin
51
+ job = @job_store.get(id)
52
+ yield id, job
53
+ @processing_queue.complete(id)
54
+ rescue => error
55
+ @processing_queue.retry(id)
56
+ raise
46
57
  end
47
58
  end
48
59
 
49
60
  def each(&block)
50
- while id = @processing_queue.fetch
51
- begin
52
- job = @job_store.get(id)
53
- yield id, job
54
- @processing_queue.complete(id)
55
- rescue => error
56
- @processing_queue.retry(id)
57
- raise
58
- end
61
+ while true
62
+ process(&block)
59
63
  end
60
64
  end
61
65
  end
@@ -0,0 +1,18 @@
1
+ require_relative 'redis/server'
2
+
3
+ module Async
4
+ module Job
5
+ module Backend
6
+ module Redis
7
+ def self.new(**options)
8
+ endpoint = options.fetch(:endpoint) {Async::Redis.local_endpoint}
9
+ prefix = options.fetch(:prefix) {"async:job"}
10
+
11
+ client = Async::Redis::Client.new(endpoint)
12
+
13
+ return Async::Job::Backend::Redis::Server.new(client, prefix)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'backend/redis'
2
+
3
+ module Async
4
+ module Job
5
+ module Backend
6
+ def self.new(backend: Async::Job::Backend::Redis, **options)
7
+ backend.new(**options)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,8 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2024, by Samuel Williams.
5
+
1
6
  module Async
2
7
  module Job
3
8
  class Generic
4
9
  def self.enqueue(...)
5
10
  self.new(...).enqueue
11
+ end
6
12
 
7
13
  def initialize(id, perform_at: nil)
8
14
  @id = id
@@ -22,9 +28,3 @@ module Async
22
28
  end
23
29
  end
24
30
  end
25
-
26
-
27
- server.enqueue(job)
28
- -> job.serialize
29
-
30
- Server.enqueue(job)
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Async
7
7
  module Job
8
- VERSION = "0.0.0"
8
+ VERSION = "0.2.0"
9
9
  end
10
10
  end
data/lib/async/job.rb CHANGED
@@ -4,4 +4,4 @@
4
4
  # Copyright, 2024, by Samuel Williams.
5
5
 
6
6
  require_relative 'job/version'
7
- require_relative 'job/backend/redis/server'
7
+ require_relative 'job/backend'
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-job
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -37,7 +37,7 @@ cert_chain:
37
37
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
38
38
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
39
39
  -----END CERTIFICATE-----
40
- date: 2024-02-14 00:00:00.000000000 Z
40
+ date: 2024-02-24 00:00:00.000000000 Z
41
41
  dependencies:
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: async
@@ -74,6 +74,8 @@ extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
76
  - lib/async/job.rb
77
+ - lib/async/job/backend.rb
78
+ - lib/async/job/backend/redis.rb
77
79
  - lib/async/job/backend/redis/delayed_queue.rb
78
80
  - lib/async/job/backend/redis/job_store.rb
79
81
  - lib/async/job/backend/redis/processing_queue.rb
metadata.gz.sig CHANGED
@@ -1,3 +1 @@
1
- m�� A������>������4̌E�<k��J�V]�];hy%�]��;/Xևu1����@����Y������^A��
2
- ?~�G���&8���Zw2k�^�74��3 �r(�)���A��}L�Uߺ��$��E�Z�� ;�HO�#X�Q�������D�R�=������ f����M�Nxe�� HT�Ҥ�:�@_����@S5��>��ކ���{�� b>Ph0h]�}�ᑻ��]b鈆��2}̅�� �/h��TXJ���
3
- |Zt��,l�$t�V��� ���8��&�)�d�38�pPS�U�Xp���^��5�l�b9,JOj�*�j6D�'
1
+ �;���9�4