twingly-amqp 5.2.0 → 6.1.0

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: 9addd8c457e9a56236f8e77d5c8a695859b39c8e2f77660e5cea41d66b515095
4
- data.tar.gz: e9c37097b065eeb9a60f25f659597975452a7b26c643d8fd81bd165bf2b6fa0a
3
+ metadata.gz: 72327e797eeb0baacb83fa4a8680f6108a2cacdc6aa1185bbd3dfd855a1738c9
4
+ data.tar.gz: a0fee780601c0d0bed3afa6f4a70e99fe775c09c3f72b8674f5ac840103252c5
5
5
  SHA512:
6
- metadata.gz: eebc4870eeca8f9c58298b5f839569338da8e1e862b785512babd5f7fa28492a40a069762c136d65d4c31142d1360b27cf23e5b1044dc3b4f9feac8b1ace623e
7
- data.tar.gz: bfbd5d0598e5ba0abbf2d292ef4bee8847ee67dfd1e2d67f9a5c4b8a64a2e2131aa73c91267b9088ee5fa36162f3e7138be0b22c8c081205f290ca8de68cb035
6
+ metadata.gz: 3d7692b89922e73d8c9056a863f5039371c4ac1962d2419fe5144d00f553ad343b989d3dcc70e727902f3a3c3dc6ad981a6de0cdacd9cb189295413a5b7428ca
7
+ data.tar.gz: d50510058e01960b482712b3719182ca32a88854c0ded35c967b91cca087cd083f37ac67e892c9f960ca0fc6d00da73ab3792cc9f38bf5d0347db91ffe7d3f41
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Twingly::AMQP
2
2
 
3
- [![GitHub Build Status](https://github.com/twingly/twingly-amqp/workflows/CI/badge.svg?branch=master)](https://github.com/twingly/twingly-amqp/actions)
3
+ [![GitHub Build Status](https://github.com/twingly/twingly-amqp/workflows/CI/badge.svg)](https://github.com/twingly/twingly-amqp/actions)
4
4
 
5
5
  A gem for subscribing and publishing messages via RabbitMQ.
6
6
 
@@ -59,6 +59,8 @@ subscription = Twingly::AMQP::Subscription.new(
59
59
  consumer_threads: 4, # Optional
60
60
  prefetch: 20, # Optional
61
61
  max_length: 10_000, # Optional
62
+ queue_type: :quorum, # Optional, which type of queue to create,
63
+ # possible values are :quorum (default) or :classic
62
64
  )
63
65
 
64
66
  subscription.on_exception { |exception| puts "Oh noes! #{exception.message}" }
@@ -130,6 +132,9 @@ publisher.configure_publish_options do |options|
130
132
  end
131
133
 
132
134
  publisher.publish({ my: "data" })
135
+
136
+ publisher.publish({ my: "other_data" }, routing_key: "my_other_key") # Override routing_key or other publishing options
137
+ # accepted by Bunny::Exchange#publish
133
138
  ```
134
139
 
135
140
  ### Publish delayed messages
@@ -141,6 +146,8 @@ publisher = Twingly::AMQP::DefaultExchangePublisher.delayed(
141
146
  target_queue_name: "my_queue", # Queue which delayed messages will be
142
147
  # published to after the delay has elapsed
143
148
  delay_ms: 60_000,
149
+ delay_queue_type: :quorum, # Optional. Which type of queue to define the delay queue
150
+ # as. Possible values are :quorum (default) or :classic
144
151
  )
145
152
 
146
153
  # Publishes message to the delay queue. After delay_ms has passed,
@@ -11,12 +11,14 @@ module Twingly
11
11
  @exchange = connection.create_channel.default_exchange
12
12
  end
13
13
 
14
- def self.delayed(delay_queue_name:, target_queue_name:, delay_ms:, connection: Connection.instance)
14
+ def self.delayed(delay_queue_name:, target_queue_name:, delay_ms:, delay_queue_type: :quorum,
15
+ connection: Connection.instance)
15
16
  Utilities.create_queue(delay_queue_name,
16
17
  arguments: {
17
18
  "x-dead-letter-exchange": DEFAULT_EXCHANGE,
18
19
  "x-dead-letter-routing-key": target_queue_name,
19
- })
20
+ },
21
+ queue_type: delay_queue_type)
20
22
 
21
23
  new(queue_name: delay_queue_name, connection: connection).tap do |publisher|
22
24
  publisher.configure_publish_options do |options|
@@ -1,7 +1,7 @@
1
1
  module Twingly
2
2
  module AMQP
3
3
  module Publisher
4
- def publish(message)
4
+ def publish(message, opts = {})
5
5
  payload =
6
6
  if message.kind_of?(Array)
7
7
  message
@@ -11,17 +11,17 @@ module Twingly
11
11
  raise ArgumentError
12
12
  end
13
13
 
14
- json_payload = payload.to_json
15
- opts = options.to_h
16
- @exchange.publish(json_payload, opts)
14
+ json_payload = payload.to_json
15
+ publishing_options = options.to_h.merge(opts)
16
+ @exchange.publish(json_payload, publishing_options)
17
17
  end
18
18
 
19
- # only used by tests to avoid sleeping
20
- def publish_with_confirm(message)
19
+ # Only used by tests to lessen the time we need to sleep
20
+ def publish_with_confirm(message, opts = {})
21
21
  channel = @exchange.channel
22
22
  channel.confirm_select unless channel.using_publisher_confirmations?
23
23
 
24
- publish(message)
24
+ publish(message, opts)
25
25
 
26
26
  @exchange.wait_for_confirms
27
27
  end
@@ -3,14 +3,18 @@ module Twingly
3
3
  class Subscription
4
4
  def initialize(queue_name:, exchange_topic: nil, routing_key: nil,
5
5
  routing_keys: nil, consumer_threads: 1, prefetch: 20,
6
- connection: Connection.instance, max_length: nil)
6
+ connection: Connection.instance, max_length: nil,
7
+ queue_type: :quorum)
7
8
  @queue_name = queue_name
8
9
  @exchange_topic = exchange_topic
9
10
  @routing_keys = Array(routing_keys || routing_key)
10
11
  @consumer_threads = consumer_threads
11
12
  @prefetch = prefetch
12
13
  @max_length = max_length
14
+ @queue_type = queue_type
13
15
  @cancel = false
16
+ @consumer = nil
17
+ @blocking = false
14
18
 
15
19
  if routing_key
16
20
  warn "[DEPRECATION] `routing_key` is deprecated. "\
@@ -18,7 +22,7 @@ module Twingly
18
22
  end
19
23
 
20
24
  @channel = create_channel(connection)
21
- @queue = @channel.queue(@queue_name, queue_options)
25
+ @queue = create_queue
22
26
 
23
27
  if @exchange_topic && @routing_keys.any?
24
28
  exchange = @channel.topic(@exchange_topic, durable: true)
@@ -33,12 +37,13 @@ module Twingly
33
37
  end
34
38
 
35
39
  def each_message(blocking: true, &block)
36
- consumer = create_consumer(&block)
40
+ @blocking = blocking
41
+ @consumer = create_consumer(&block)
37
42
 
38
- if blocking
43
+ if @blocking
39
44
  sleep 0.01 until cancel?
40
45
 
41
- consumer.cancel
46
+ @consumer.cancel
42
47
  end
43
48
  end
44
49
 
@@ -63,6 +68,7 @@ module Twingly
63
68
  end
64
69
 
65
70
  def cancel!
71
+ @consumer.cancel unless @blocking
66
72
  @cancel = true
67
73
  end
68
74
 
@@ -93,6 +99,17 @@ module Twingly
93
99
  channel
94
100
  end
95
101
 
102
+ def create_queue
103
+ case @queue_type
104
+ when :quorum
105
+ @channel.quorum_queue(@queue_name, queue_options)
106
+ when :classic
107
+ @channel.queue(@queue_name, queue_options)
108
+ else
109
+ raise ArgumentError, "Unknown queue type #{@queue_type}"
110
+ end
111
+ end
112
+
96
113
  def queue_options
97
114
  {
98
115
  durable: true,
@@ -1,13 +1,19 @@
1
1
  module Twingly
2
2
  module AMQP
3
3
  module Utilities
4
- def self.create_queue(queue_name, durable: true, arguments: {}, connection: Connection.instance)
4
+ def self.create_queue(queue_name, durable: true, arguments: {}, queue_type: :quorum, connection: Connection.instance)
5
5
  connection.with_channel do |channel|
6
- return channel.queue(
7
- queue_name,
8
- durable: durable,
9
- arguments: arguments,
10
- )
6
+ case queue_type
7
+ when :quorum
8
+ # Quorum queues are always durable, see https://www.rabbitmq.com/quorum-queues.html#feature-matrix
9
+ raise ArgumentError, "durable: false is not supported by quorum queues" unless durable
10
+
11
+ return channel.quorum_queue(queue_name, arguments: arguments)
12
+ when :classic
13
+ return channel.queue(queue_name, durable: durable, arguments: arguments)
14
+ else
15
+ raise ArgumentError, "Unknown queue type '#{queue_type}'"
16
+ end
11
17
  end
12
18
  end
13
19
  end
@@ -1,5 +1,5 @@
1
1
  module Twingly
2
2
  module Amqp
3
- VERSION = "5.2.0".freeze
3
+ VERSION = "6.1.0".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twingly-amqp
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0
4
+ version: 6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Twingly AB
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-02 00:00:00.000000000 Z
11
+ date: 2023-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 2.7.3
19
+ version: 2.20.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 2.7.3
26
+ version: 2.20.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
91
  - !ruby/object:Gem::Version
92
92
  version: '0'
93
93
  requirements: []
94
- rubygems_version: 3.1.2
94
+ rubygems_version: 3.4.4
95
95
  signing_key:
96
96
  specification_version: 4
97
97
  summary: Ruby library for talking to RabbitMQ