phobos 1.8.3.pre.beta1 → 1.8.3.pre.beta2

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: 94cb69f1956951dadecde1cfee5acf2eba368fcba756658242f9d3578a38bd5b
4
- data.tar.gz: 9ad68c2dde68e2360d0cd4ab9882795c5d900c99e56a94c527880ec826c26ff3
3
+ metadata.gz: 0d9c3d6d826d8865116eeeef7183e1d3eb60862d4673fb10c0464577707e1a8a
4
+ data.tar.gz: 7317cdfb2c8516cfa837f52c41d14181987ccdd12698eccfb8119def24c24ab1
5
5
  SHA512:
6
- metadata.gz: 0eb8e4ff3dcc452312d45c5fd674c296efe89bbe3b74bf6e31c8e57795e21277e922daab460db01207ea9ba6b6517c2ea5328bd249b5221e4ccaa236bb7a0868
7
- data.tar.gz: 2373edf0b9da8f3136dab604f0fe8a1705bb9fd1a2c649a32f19e1f278e593b1c97ead5d1f5468e8e99e8c29c90432826cd013c9e20599deba430c14fc0c9601
6
+ metadata.gz: 8f4eb5b010f7c628db69ddbf4c5cc4237d1afff4f8a42b462e9e47cf835a2bbf2950c827865640bb3456009a7fcdd2b900df3d1d758206e82ddb774ffef5c202
7
+ data.tar.gz: 5b3a4b2ac5755a296097c52ded7e5ead4fc866250ff24c16ca75e620dd056c315dbeba1055fee1c4f509d88619b1bb0aaea7c8b6cf61861ac72ed1fab6aa1ad7
data/CHANGELOG.md CHANGED
@@ -3,9 +3,13 @@ All notable changes to this project will be documented in this file.
3
3
 
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/).
6
-
6
+ ``
7
7
  ## UNRELEASED
8
8
 
9
+ ## [1.8.3-beta2] - 2019-11-15
10
+ - Add support for message headers in both produced and consumed
11
+ messages and batches.
12
+
9
13
  ## [1.8.3-beta1] - 2019-11-11
10
14
  - Automatically heartbeat after every message if necessary in batch
11
15
  mode.
data/README.md CHANGED
@@ -139,6 +139,8 @@ A handler is required to implement the method `#consume(payload, metadata)`.
139
139
 
140
140
  Instances of your handler will be created for every message, so keep a constructor without arguments. If `consume` raises an exception, Phobos will retry the message indefinitely, applying the back off configuration presented in the configuration file. The `metadata` hash will contain a key called `retry_count` with the current number of retries for this message. To skip a message, simply return from `#consume`.
141
141
 
142
+ The `metadata` hash will also contain a key called `headers` with the headers of the consumed message.
143
+
142
144
  When the listener starts, the class method `.start` will be called with the `kafka_client` used by the listener. Use this hook as a chance to setup necessary code for your handler. The class method `.stop` will be called during listener shutdown.
143
145
 
144
146
  ```ruby
@@ -233,6 +235,9 @@ and your handler must include `BatchHandler`. Using a delivery method of `batch`
233
235
  assumes that you are still processing the messages one at a time and should
234
236
  use `Handler`.
235
237
 
238
+ When using `inline_batch`, each instance of `Phobos::BatchMessage` will contain an
239
+ instance method `headers` with the headers for that message.
240
+
236
241
  ```ruby
237
242
  class MyBatchHandler
238
243
  include Phobos::BatchHandler
@@ -282,6 +287,19 @@ my.producer.publish('topic', 'message-payload', 'partition and message key')
282
287
  MyProducer.producer.publish('topic', 'message-payload', 'partition and message key')
283
288
  ```
284
289
 
290
+ The signature for the `publish` method is as follows:
291
+
292
+ ```ruby
293
+ def publish(topic, payload, key = nil, partition_key = nil, headers = nil)
294
+ ```
295
+
296
+ To produce messages with headers, 5 arguments will have to be passed to `publish`:
297
+
298
+ ```ruby
299
+ my = MyProducer.new
300
+ my.producer.publish('topic', 'message-payload', 'partition and message key', nil, { header_1: 'value 1' })
301
+ ```
302
+
285
303
  It is also possible to publish several messages at once:
286
304
 
287
305
  ```ruby
@@ -290,7 +308,7 @@ MyProducer
290
308
  .publish_list([
291
309
  { topic: 'A', payload: 'message-1', key: '1' },
292
310
  { topic: 'B', payload: 'message-2', key: '2' },
293
- { topic: 'B', payload: 'message-3', key: '3' }
311
+ { topic: 'B', payload: 'message-3', key: '3', headers: { header_1: 'value 1', header_2: 'value 2' } }
294
312
  ])
295
313
  ```
296
314
 
@@ -24,17 +24,10 @@ module Phobos
24
24
  end
25
25
 
26
26
  def execute
27
- payloads = @batch.messages.map do |message|
28
- Phobos::BatchMessage.new(
29
- key: message.key,
30
- partition: message.partition,
31
- offset: message.offset,
32
- payload: force_encoding(message.value)
33
- )
34
- end
27
+ batch = @batch.messages.map { |message| instantiate_batch_message(message) }
35
28
 
36
29
  begin
37
- process_batch(payloads)
30
+ process_batch(batch)
38
31
  rescue StandardError => e
39
32
  handle_error(e, 'listener.retry_handler_error_batch',
40
33
  "error processing inline batch, waiting #{backoff_interval}s")
@@ -44,14 +37,24 @@ module Phobos
44
37
 
45
38
  private
46
39
 
47
- def process_batch(payloads)
40
+ def instantiate_batch_message(message)
41
+ Phobos::BatchMessage.new(
42
+ key: message.key,
43
+ partition: message.partition,
44
+ offset: message.offset,
45
+ payload: force_encoding(message.value),
46
+ headers: message.headers
47
+ )
48
+ end
49
+
50
+ def process_batch(batch)
48
51
  instrument('listener.process_batch_inline', @metadata) do |_metadata|
49
52
  handler = @listener.handler_class.new
50
53
 
51
- preprocessed_payloads = handler.before_consume_batch(payloads, @metadata)
52
- consume_block = proc { handler.consume_batch(preprocessed_payloads, @metadata) }
54
+ preprocessed_batch = handler.before_consume_batch(batch, @metadata)
55
+ consume_block = proc { handler.consume_batch(preprocessed_batch, @metadata) }
53
56
 
54
- handler.around_consume_batch(preprocessed_payloads, @metadata, &consume_block)
57
+ handler.around_consume_batch(preprocessed_batch, @metadata, &consume_block)
55
58
  end
56
59
  end
57
60
  end
@@ -16,7 +16,8 @@ module Phobos
16
16
  key: message.key,
17
17
  partition: message.partition,
18
18
  offset: message.offset,
19
- retry_count: 0
19
+ retry_count: 0,
20
+ headers: message.headers
20
21
  )
21
22
  end
22
23
 
@@ -2,17 +2,18 @@
2
2
 
3
3
  module Phobos
4
4
  class BatchMessage
5
- attr_accessor :key, :partition, :offset, :payload
5
+ attr_accessor :key, :partition, :offset, :payload, :headers
6
6
 
7
- def initialize(key:, partition:, offset:, payload:)
7
+ def initialize(key:, partition:, offset:, payload:, headers:)
8
8
  @key = key
9
9
  @partition = partition
10
10
  @offset = offset
11
11
  @payload = payload
12
+ @headers = headers
12
13
  end
13
14
 
14
15
  def ==(other)
15
- [:key, :partition, :offset, :payload].all? do |s|
16
+ [:key, :partition, :offset, :payload, :headers].all? do |s|
16
17
  public_send(s) == other.public_send(s)
17
18
  end
18
19
  end
@@ -15,18 +15,18 @@ module Phobos
15
15
  @host_obj = host_obj
16
16
  end
17
17
 
18
- def publish(topic, payload, key = nil, partition_key = nil)
19
- class_producer.publish(topic, payload, key, partition_key)
18
+ def publish(topic, payload, key = nil, partition_key = nil, headers = nil)
19
+ class_producer.publish(topic, payload, key, partition_key, headers)
20
20
  end
21
21
 
22
- def async_publish(topic, payload, key = nil, partition_key = nil)
23
- class_producer.async_publish(topic, payload, key, partition_key)
22
+ def async_publish(topic, payload, key = nil, partition_key = nil, headers = nil)
23
+ class_producer.async_publish(topic, payload, key, partition_key, headers)
24
24
  end
25
25
 
26
- # @param messages [Array(Hash(:topic, :payload, :key))]
26
+ # @param messages [Array(Hash(:topic, :payload, :key, :headers))]
27
27
  # e.g.: [
28
- # { topic: 'A', payload: 'message-1', key: '1' },
29
- # { topic: 'B', payload: 'message-2', key: '2' }
28
+ # { topic: 'A', payload: 'message-1', key: '1', headers: { foo: 'bar' } },
29
+ # { topic: 'B', payload: 'message-2', key: '2', headers: { foo: 'bar' } }
30
30
  # ]
31
31
  #
32
32
  def publish_list(messages)
@@ -86,9 +86,9 @@ module Phobos
86
86
  producer_store[:sync_producer] = nil
87
87
  end
88
88
 
89
- def publish(topic, payload, key = nil, partition_key = nil)
89
+ def publish(topic, payload, key = nil, partition_key = nil, headers = nil)
90
90
  publish_list([{ topic: topic, payload: payload, key: key,
91
- partition_key: partition_key }])
91
+ partition_key: partition_key, headers: headers }])
92
92
  end
93
93
 
94
94
  def publish_list(messages)
@@ -109,9 +109,9 @@ module Phobos
109
109
  producer_store[:async_producer]
110
110
  end
111
111
 
112
- def async_publish(topic, payload, key = nil, partition_key = nil)
112
+ def async_publish(topic, payload, key = nil, partition_key = nil, headers = nil)
113
113
  async_publish_list([{ topic: topic, payload: payload, key: key,
114
- partition_key: partition_key }])
114
+ partition_key: partition_key, headers: headers }])
115
115
  end
116
116
 
117
117
  def async_publish_list(messages)
@@ -144,6 +144,7 @@ module Phobos
144
144
  partition_key = message[:partition_key] || message[:key]
145
145
  producer.produce(message[:payload], topic: message[:topic],
146
146
  key: message[:key],
147
+ headers: message[:headers],
147
148
  partition_key: partition_key)
148
149
  end
149
150
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Phobos
4
- VERSION = '1.8.3-beta1'
4
+ VERSION = '1.8.3-beta2'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phobos
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.3.pre.beta1
4
+ version: 1.8.3.pre.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Túlio Ornelas
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2019-11-12 00:00:00.000000000 Z
18
+ date: 2019-11-15 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: bundler