async-job 0.0.0 → 0.1.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: af9713d27f0673152bf48d491b2af0d1191c5c2a51c280568b62d2c1b3aab41e
4
+ data.tar.gz: bebd84bc0e6511bf1b380573944a3c7707792650d6befde35ec43a4818081c0f
5
5
  SHA512:
6
- metadata.gz: 79557b886d6fadc8ae47644c36916c556091f4eac1c78f5d4b3271163a00fa08d5e68931d867fe7ea1871f6257cbd9b00fd413561ecd6a3a244e101a2d2685bf
7
- data.tar.gz: 0cbce58e990cff1881f29c4c91f7db93aae228d44d85ecde799b22d88ab5824df5dbabd5c11045dddba01c37d0b644914169adc8c6ed86b38fa7b353492763a7
6
+ metadata.gz: 2f8d9b3fd19bd05edc9d6e2707604a8092a1d32076d0d04a77985373a80f517917b03d92070910e858c4ca41b1fec06f83dc0b2fa17746165e269562fc1d5ba6
7
+ data.tar.gz: 9454114d0dad1a26fb1e8f9b586bc971b1c0e0e1e0a02ce0cc30987530d54361d73fdcf4562927fc38d8129151d746049f1a6b695924d990641982a06a57c275
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
@@ -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.1.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/redis/server'
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.1.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
metadata.gz.sig CHANGED
Binary file