queues-rabbit 0.1.0.beta
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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +175 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +201 -0
- data/LICENSE.txt +21 -0
- data/README.md +456 -0
- data/Rakefile +12 -0
- data/lib/generators/queues_rabbit_generator.rb +26 -0
- data/lib/generators/templates/exchange.rb +13 -0
- data/lib/generators/templates/queue.rb +21 -0
- data/lib/generators/templates/schema.rb +8 -0
- data/lib/queues/rabbit/client.rb +7 -0
- data/lib/queues/rabbit/exchange.rb +88 -0
- data/lib/queues/rabbit/logger.rb +25 -0
- data/lib/queues/rabbit/message.rb +13 -0
- data/lib/queues/rabbit/queue.rb +117 -0
- data/lib/queues/rabbit/schema.rb +28 -0
- data/lib/queues/rabbit/version.rb +7 -0
- data/lib/queues/rabbit.rb +31 -0
- data/sig/queues/rabbit.rbs +6 -0
- metadata +95 -0
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Queues
|
4
|
+
module Rabbit
|
5
|
+
class Queue
|
6
|
+
class << self
|
7
|
+
attr_accessor :arguments, :auto_delete, :durable, :name, :no_ack, :prefetch, :schema
|
8
|
+
|
9
|
+
def bind(exchange, binding_key, arguments: {})
|
10
|
+
exchange = exchange < Queues::Rabbit::Exchange ? exchange.name : exchange
|
11
|
+
queue_instance.bind(exchange, binding_key, arguments: arguments)
|
12
|
+
true
|
13
|
+
rescue Exception => e
|
14
|
+
logger.error_with_report "Unable to bind '#{name}' to '#{exchange}' with key '#{binding_key}' and arguments: '#{arguments}': #{e.message}."
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete
|
19
|
+
queue_instance.delete
|
20
|
+
true
|
21
|
+
rescue Exception => e
|
22
|
+
logger.error_with_report "Unable to delete #{name}: #{e.message}."
|
23
|
+
false
|
24
|
+
end
|
25
|
+
|
26
|
+
def logger
|
27
|
+
@@logger ||= Queues::Rabbit::Logger.new(name, Queues::Rabbit.log_level)
|
28
|
+
end
|
29
|
+
|
30
|
+
def queue(name, arguments: {}, auto_ack: true, auto_delete: false, durable: true, prefetch: 1)
|
31
|
+
self.arguments = arguments
|
32
|
+
self.auto_delete = auto_delete
|
33
|
+
self.durable = durable
|
34
|
+
self.name = name
|
35
|
+
self.no_ack = auto_ack
|
36
|
+
self.prefetch = prefetch
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def queue_instance
|
41
|
+
@@queue_instance ||= schema.client_instance.queue(name, arguments: arguments, auto_delete: auto_delete, durable: durable)
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# <Description>
|
46
|
+
#
|
47
|
+
# @param [String] body The message body, can be a string or either a byte array
|
48
|
+
# @param [Hash] properties Request properties
|
49
|
+
# @option properties [String] :app_id Used to identify the app that generated the message
|
50
|
+
# @option properties [String] :content_encoding Content encoding of the body
|
51
|
+
# @option properties [String] :content_type Content type of the body
|
52
|
+
# @option properties [Integer] :correlation_id The correlation id, mostly used used for RPC communication
|
53
|
+
# @option properties [Integer] :delivery_mode 2 for persistent messages, all other values are for transient messages
|
54
|
+
# @option properties [Integer, String] :expiration Number of seconds the message will stay in the queue
|
55
|
+
# @option properties [Hash<String, Object>] :headers Custom headers
|
56
|
+
# @option properties [Boolean] :mandatory The message will be returned if the message can't be routed to a queue
|
57
|
+
# @option properties [String] :message_id Can be used to uniquely identify the message, e.g. for deduplication
|
58
|
+
# @option properties [Boolean] :persistent Same as delivery_mode: 2
|
59
|
+
# @option properties [Integer] :priority The message priority (between 0 and 255)
|
60
|
+
# @option properties [String] :reply_to Queue to reply RPC responses to
|
61
|
+
# @option properties [Date] :timestamp Often used for the time the message was originally generated
|
62
|
+
# @option properties [String] :type Can indicate what kind of message this is
|
63
|
+
# @option properties [String] :user_id Used to identify the user that published the message
|
64
|
+
#
|
65
|
+
# @return [Boolean] true if published, false otherwise
|
66
|
+
#
|
67
|
+
def publish(body, **properties)
|
68
|
+
queue_instance.publish(body, **properties)
|
69
|
+
true
|
70
|
+
rescue Exception => e
|
71
|
+
logger.error_with_report "Unable to publish to #{name}: #{e.message}."
|
72
|
+
false
|
73
|
+
end
|
74
|
+
|
75
|
+
def purge
|
76
|
+
queue_instance.purge
|
77
|
+
true
|
78
|
+
rescue Exception => e
|
79
|
+
logger.error_with_report "Unable to purge #{name}: #{e.message}."
|
80
|
+
false
|
81
|
+
end
|
82
|
+
|
83
|
+
def subscribe
|
84
|
+
logger.info { "Subscribing to queue #{name}" }
|
85
|
+
consumer = new
|
86
|
+
queue_instance.subscribe(no_ack: no_ack, prefetch: prefetch) do |message|
|
87
|
+
consumer.consume(Queues::Rabbit::Message.new(message))
|
88
|
+
rescue Exception => e
|
89
|
+
logger.error { e.message }
|
90
|
+
logger.stdout e.message, :error
|
91
|
+
end
|
92
|
+
|
93
|
+
loop do
|
94
|
+
logger.stdout "Connection to #{name} alive."
|
95
|
+
sleep 10
|
96
|
+
end
|
97
|
+
rescue Exception => e
|
98
|
+
logger.error_with_report "Unable to connect to #{name}: #{e.message}."
|
99
|
+
false
|
100
|
+
end
|
101
|
+
|
102
|
+
def unbind(exchange, binding_key, arguments: {})
|
103
|
+
exchange = exchange < Queues::Rabbit::Exchange ? exchange.name : exchange
|
104
|
+
queue_instance.unbind(exhange, binding_key, arguments: arguments)
|
105
|
+
true
|
106
|
+
rescue Exception => e
|
107
|
+
logger.error_with_report "Unable to unbind '#{name}' to '#{exchange}' with key '#{binding_key}' and arguments: '#{arguments}': #{e.message}."
|
108
|
+
false
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def consume(_message)
|
113
|
+
raise NoMethodError.new("Method #{__method__} must be defined to subscribe a queue!")
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Queues
|
4
|
+
module Rabbit
|
5
|
+
class Schema
|
6
|
+
include ActiveModel::Model
|
7
|
+
class << self
|
8
|
+
attr_accessor :client, :exchanges, :queues
|
9
|
+
|
10
|
+
def client_instance
|
11
|
+
@@client_instance ||= client.start
|
12
|
+
end
|
13
|
+
|
14
|
+
def exchange(klass)
|
15
|
+
self.exchanges ||= []
|
16
|
+
self.exchanges << klass
|
17
|
+
klass.schema = self
|
18
|
+
end
|
19
|
+
|
20
|
+
def queue(klass)
|
21
|
+
self.queues ||= []
|
22
|
+
self.queues << klass
|
23
|
+
klass.schema = self
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_model'
|
4
|
+
require 'active_support'
|
5
|
+
require 'amqp-client'
|
6
|
+
require 'logger'
|
7
|
+
|
8
|
+
require_relative 'rabbit/client'
|
9
|
+
require_relative 'rabbit/exchange'
|
10
|
+
require_relative 'rabbit/logger'
|
11
|
+
require_relative 'rabbit/message'
|
12
|
+
require_relative 'rabbit/queue'
|
13
|
+
require_relative 'rabbit/schema'
|
14
|
+
require_relative 'rabbit/version'
|
15
|
+
|
16
|
+
module Queues
|
17
|
+
module Rabbit
|
18
|
+
class Error < StandardError; end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
attr_accessor :client, :logger, :log_level, :schema
|
22
|
+
|
23
|
+
def configure(schema_klass, host, log_level: ::Logger::INFO)
|
24
|
+
self.log_level = log_level
|
25
|
+
self.schema = schema_klass
|
26
|
+
schema.client = Queues::Rabbit::Client.new(host)
|
27
|
+
self
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: queues-rabbit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0.beta
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lapo
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-03-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: amqp-client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: queues
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.1.0.beta
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.1.0.beta
|
41
|
+
description: ''
|
42
|
+
email:
|
43
|
+
- lapoelisacci@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".rspec"
|
49
|
+
- ".rubocop.yml"
|
50
|
+
- CHANGELOG.md
|
51
|
+
- Gemfile
|
52
|
+
- Gemfile.lock
|
53
|
+
- LICENSE.txt
|
54
|
+
- README.md
|
55
|
+
- Rakefile
|
56
|
+
- lib/generators/queues_rabbit_generator.rb
|
57
|
+
- lib/generators/templates/exchange.rb
|
58
|
+
- lib/generators/templates/queue.rb
|
59
|
+
- lib/generators/templates/schema.rb
|
60
|
+
- lib/queues/rabbit.rb
|
61
|
+
- lib/queues/rabbit/client.rb
|
62
|
+
- lib/queues/rabbit/exchange.rb
|
63
|
+
- lib/queues/rabbit/logger.rb
|
64
|
+
- lib/queues/rabbit/message.rb
|
65
|
+
- lib/queues/rabbit/queue.rb
|
66
|
+
- lib/queues/rabbit/schema.rb
|
67
|
+
- lib/queues/rabbit/version.rb
|
68
|
+
- sig/queues/rabbit.rbs
|
69
|
+
homepage: https://github.com/LapoElisacci/queues.git
|
70
|
+
licenses:
|
71
|
+
- MIT
|
72
|
+
metadata:
|
73
|
+
homepage_uri: https://github.com/LapoElisacci/queues.git
|
74
|
+
source_code_uri: https://github.com/LapoElisacci/queues-rabbit.git
|
75
|
+
changelog_uri: https://github.com/LapoElisacci/queues-rabbit/blob/main/CHANGELOG.md
|
76
|
+
post_install_message:
|
77
|
+
rdoc_options: []
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 2.6.0
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.3.1
|
90
|
+
requirements: []
|
91
|
+
rubygems_version: 3.2.22
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: RabbitMQ Driver for Rails Queues
|
95
|
+
test_files: []
|