async_request_reply 1.3.0 → 1.4.1

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: 82844bb3ba5b9fd8531eaa9d2d4c7423dc75fc05328231f3453312e40c969874
4
- data.tar.gz: fcf69875b436ac90400db0fea59d1f014930735cc3aa83595f671156b8802977
3
+ metadata.gz: 76681dd52c436222c0ca38ba86179cf5bc9fa1a232ac097c8ea3dad34bc68d33
4
+ data.tar.gz: 598e2cb8b5b0728d19383e26d63cb584745098845c1870b6b72414f7da286c54
5
5
  SHA512:
6
- metadata.gz: 32b54b50cb07199f46c6ec62dc65975eb672aee8c18810f8378eaa4c588c337904a3469342580c097089ecb3a493bffa690fb0d5eec037a8da511565fbe1d1cc
7
- data.tar.gz: 77f45585605802ed482bc32a3a1aa3d681825e7d96d58ebaa7f0cdf85dd2d9cc5ca544f10a0a57c1f1cf13bcd8d7969426a1600b21ef5a0e991055ed62014265
6
+ metadata.gz: 9aaf158788a79b642a1037efa86138139eef5e796afa9216b6aede8389f512d011519a8bf989379a0c537cd5969e0e6c27cb1782684b957f4e4a92f98c97cd9a
7
+ data.tar.gz: 388627cec6f69ac491427dc5723acd1848badd49a3164a83db0f149b79d7a6add5447d6b11adfb9eedd64b2d9d4b2c0398c35021f61f80f6b53ba9fae0fe5a81
@@ -5,9 +5,9 @@ require 'logger'
5
5
  module AsyncRequestReply
6
6
  class Config
7
7
  DEFAULTS = {
8
- repository_adapter: :redis,
8
+ repository_adapter: :io,
9
9
  redis_url_conection: 'redis://localhost:6379',
10
- async_engine: :sidekiq,
10
+ async_engine: :simple_thread_pool,
11
11
  logger: Logger.new(STDOUT)
12
12
  }
13
13
 
@@ -34,6 +34,7 @@ module AsyncRequestReply
34
34
 
35
35
  def repository_adapter
36
36
  return AsyncRequestReply::RepositoryAdapters::RedisRepositoryAdapter if config.repository_adapter == :redis
37
+ return AsyncRequestReply::RepositoryAdapters::IORepositoryAdapter if config.repository_adapter == :io
37
38
  config.repository_adapter
38
39
  end
39
40
 
@@ -42,7 +43,7 @@ module AsyncRequestReply
42
43
  end
43
44
 
44
45
  def async_engine
45
- return AsyncRequestReply::WorkersEngine::Async if config.async_engine == :async
46
+ return AsyncRequestReply::WorkersEngine::SimpleThreadPool if config.async_engine == :simple_thread_pool
46
47
  return AsyncRequestReply::WorkersEngine::Sidekiq if config.async_engine == :sidekiq
47
48
 
48
49
  config.async_engine
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ require_relative '../config'
3
+ require_relative 'abstract_repository_adapter'
4
+ require 'tmpdir'
5
+
6
+ module AsyncRequestReply
7
+ module RepositoryAdapters
8
+ class IORepositoryAdapter < AbstractRepositoryAdapter
9
+ @@prefix = ".async_request_reply".freeze
10
+ class << self
11
+ def get(uuid)
12
+ begin
13
+ IO.binread("#{@@prefix}/#{uuid}")
14
+ rescue StandardError => e
15
+ return nil if e.is_a?(Errno::ENOENT)
16
+ raise e
17
+ end
18
+ end
19
+
20
+ def del(uuid)
21
+ File.delete("#{@@prefix}/#{uuid}")
22
+ end
23
+
24
+ def setex(uuid, ttl = nil, payload)
25
+ Dir.mkdir(@@prefix) unless Dir.exist?(@@prefix)
26
+ IO.binwrite("#{@@prefix}/#{uuid}", payload)
27
+ self.get(uuid)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -14,7 +14,7 @@ module AsyncRequestReply
14
14
 
15
15
  attr_accessor :status, :uuid, :status_url, :redirect_url,
16
16
  :class_instance, :methods_chain, :success,
17
- :redirect_url, :failure, :_ttl
17
+ :redirect_url, :failure, :_ttl, :raise_error
18
18
  attr_reader :new_record, :errors, :start_time, :end_time, :handle_async_engine
19
19
 
20
20
  def initialize(attrs = {})
@@ -49,12 +49,14 @@ module AsyncRequestReply
49
49
  'class_instance' => class_instance,
50
50
  'redirect_url' => redirect_url,
51
51
  'start_time' => start_time,
52
- 'end_time' => end_time
52
+ 'end_time' => end_time,
53
+ 'raise_error' => raise_error
53
54
  }
54
55
  end
55
56
 
56
57
  def default_attributes
57
58
  {
59
+ raise_error: true,
58
60
  methods_chain: [],
59
61
  'status' => :waiting,
60
62
  success: {
@@ -221,6 +223,7 @@ module AsyncRequestReply
221
223
  @@config.logger.fatal("Fatal perform worker #{self.uuid} with fails #{formated_erros_to_json(e.message)}")
222
224
  @end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
223
225
  update(status: :internal_server_error, errors: formated_erros_to_json(e.message))
226
+ raise e if @raise_error
224
227
  nil
225
228
  end
226
229
  end
@@ -159,6 +159,7 @@ module AsyncRequestReply
159
159
  save
160
160
  worker_id = @processing.last
161
161
  worker = AsyncRequestReply::Worker.find(worker_id)
162
+ worker.raise_error = false
162
163
  worker.perform
163
164
  worker.reload!
164
165
  if %w[unprocessable_entity internal_server_error].include?(worker.status)
@@ -0,0 +1,20 @@
1
+ module AsyncRequestReply
2
+ module WorkersEngine
3
+ class SimpleThreadPool
4
+ MAX_THREADS = 2
5
+ @@jobs = Queue.new
6
+ @@workers = Array.new(MAX_THREADS) do
7
+ Thread.new do
8
+ loop do
9
+ job = @@jobs.pop
10
+ job.perform
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.perform_async(async_request_id)
16
+ @@jobs.push(::AsyncRequestReply::Worker.find(async_request_id))
17
+ end
18
+ end
19
+ end
20
+ end
@@ -9,7 +9,9 @@ module AsyncRequestReply
9
9
  autoload :Worker, "async_request_reply/worker"
10
10
  autoload :WorkerInBatch, "async_request_reply/worker_in_batch"
11
11
  require "async_request_reply/repository_adapters/redis_repository_adapter"
12
+ require "async_request_reply/repository_adapters/i_o_repository_adapter"
12
13
  require "async_request_reply/workers_engine/sidekiq"
14
+ require "async_request_reply/workers_engine/simple_thread_pool"
13
15
 
14
16
  # Load default configs
15
17
  AsyncRequestReply::Config.instance
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async_request_reply
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luiz Filipe Neves Costa, Rafael Pinheiro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-04-25 00:00:00.000000000 Z
11
+ date: 2025-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -107,10 +107,12 @@ files:
107
107
  - lib/async_request_reply/config.rb
108
108
  - lib/async_request_reply/methods_chain.rb
109
109
  - lib/async_request_reply/repository_adapters/abstract_repository_adapter.rb
110
+ - lib/async_request_reply/repository_adapters/i_o_repository_adapter.rb
110
111
  - lib/async_request_reply/repository_adapters/redis_repository_adapter.rb
111
112
  - lib/async_request_reply/worker.rb
112
113
  - lib/async_request_reply/worker_in_batch.rb
113
114
  - lib/async_request_reply/workers_engine/sidekiq.rb
115
+ - lib/async_request_reply/workers_engine/simple_thread_pool.rb
114
116
  homepage: https://github.com/prosas/async_request_reply
115
117
  licenses:
116
118
  - MIT