44
55module Kafka
66 class Broker
7- def initialize ( connection :, node_id : nil , logger :)
8- @connection = connection
7+ def initialize ( connection_builder :, host :, port :, node_id : nil , logger :)
8+ @connection_builder = connection_builder
9+ @connection = nil
10+ @host = host
11+ @port = port
912 @node_id = node_id
1013 @logger = logger
1114 end
1215
1316 def address_match? ( host , port )
14- @connection . address_match? ( host , port )
17+ host == @ host && port == @port
1518 end
1619
1720 # @return [String]
1821 def to_s
19- "#{ @ connection} (node_id=#{ @node_id . inspect } )"
22+ "#{ connection } (node_id=#{ @node_id . inspect } )"
2023 end
2124
2225 # @return [nil]
2326 def disconnect
24- @ connection. close
27+ connection . close
2528 end
2629
2730 # Fetches cluster metadata from the broker.
@@ -31,7 +34,7 @@ def disconnect
3134 def fetch_metadata ( **options )
3235 request = Protocol ::TopicMetadataRequest . new ( **options )
3336
34- @connection . send_request ( request )
37+ send_request ( request )
3538 end
3639
3740 # Fetches messages from a specified topic and partition.
@@ -41,7 +44,7 @@ def fetch_metadata(**options)
4144 def fetch_messages ( **options )
4245 request = Protocol ::FetchRequest . new ( **options )
4346
44- @connection . send_request ( request )
47+ send_request ( request )
4548 end
4649
4750 # Lists the offset of the specified topics and partitions.
@@ -51,7 +54,7 @@ def fetch_messages(**options)
5154 def list_offsets ( **options )
5255 request = Protocol ::ListOffsetRequest . new ( **options )
5356
54- @connection . send_request ( request )
57+ send_request ( request )
5558 end
5659
5760 # Produces a set of messages to the broker.
@@ -61,61 +64,81 @@ def list_offsets(**options)
6164 def produce ( **options )
6265 request = Protocol ::ProduceRequest . new ( **options )
6366
64- @connection . send_request ( request )
67+ send_request ( request )
6568 end
6669
6770 def fetch_offsets ( **options )
6871 request = Protocol ::OffsetFetchRequest . new ( **options )
6972
70- @connection . send_request ( request )
73+ send_request ( request )
7174 end
7275
7376 def commit_offsets ( **options )
7477 request = Protocol ::OffsetCommitRequest . new ( **options )
7578
76- @connection . send_request ( request )
79+ send_request ( request )
7780 end
7881
7982 def join_group ( **options )
8083 request = Protocol ::JoinGroupRequest . new ( **options )
8184
82- @connection . send_request ( request )
85+ send_request ( request )
8386 end
8487
8588 def sync_group ( **options )
8689 request = Protocol ::SyncGroupRequest . new ( **options )
8790
88- @connection . send_request ( request )
91+ send_request ( request )
8992 end
9093
9194 def leave_group ( **options )
9295 request = Protocol ::LeaveGroupRequest . new ( **options )
9396
94- @connection . send_request ( request )
97+ send_request ( request )
9598 end
9699
97100 def find_group_coordinator ( **options )
98101 request = Protocol ::GroupCoordinatorRequest . new ( **options )
99102
100- @connection . send_request ( request )
103+ send_request ( request )
101104 end
102105
103106 def heartbeat ( **options )
104107 request = Protocol ::HeartbeatRequest . new ( **options )
105108
106- @connection . send_request ( request )
109+ send_request ( request )
107110 end
108111
109112 def create_topics ( **options )
110113 request = Protocol ::CreateTopicsRequest . new ( **options )
111114
112- @connection . send_request ( request )
115+ send_request ( request )
113116 end
114117
115118 def api_versions
116119 request = Protocol ::ApiVersionsRequest . new
117120
118- @connection . send_request ( request )
121+ send_request ( request )
122+ end
123+
124+ private
125+
126+ def send_request ( request )
127+ connection . send_request ( request )
128+ rescue IdleConnection
129+ @logger . warn "Connection has been unused for too long, re-connecting..."
130+ @connection . close rescue nil
131+ @connection = nil
132+ retry
133+ rescue ConnectionError
134+ @connection . close rescue nil
135+ @connection = nil
136+
137+ raise
138+ end
139+
140+ def connection
141+ @connection ||= @connection_builder . build_connection ( @host , @port )
119142 end
120143 end
121144end
0 commit comments