1
+ import collections
1
2
import copy
3
+ import functools
4
+ import itertools
2
5
import logging
3
- import collections
4
-
6
+ import time
5
7
import kafka .common
6
8
7
- from functools import partial
8
- from itertools import count
9
9
from kafka .common import (TopicAndPartition ,
10
10
ConnectionError , FailedPayloadsError ,
11
11
PartitionUnavailableError ,
21
21
class KafkaClient (object ):
22
22
23
23
CLIENT_ID = "kafka-python"
24
- ID_GEN = count ()
24
+ ID_GEN = itertools . count ()
25
25
26
26
# NOTE: The timeout given to the client should always be greater than the
27
27
# one passed to SimpleConsumer.get_message(), otherwise you can get a
@@ -213,6 +213,16 @@ def reset_all_metadata(self):
213
213
def has_metadata_for_topic (self , topic ):
214
214
return topic in self .topic_partitions
215
215
216
+ def ensure_topic_exists (self , topic , timeout = 30 ):
217
+ start_time = time .time ()
218
+
219
+ self .load_metadata_for_topics (topic )
220
+ while not self .has_metadata_for_topic (topic ):
221
+ if time .time () > start_time + timeout :
222
+ raise KafkaTimeoutError ("Unable to create topic {}" .format (topic ))
223
+ self .load_metadata_for_topics (topic )
224
+ time .sleep (.5 )
225
+
216
226
def close (self ):
217
227
for conn in self .conns .values ():
218
228
conn .close ()
@@ -289,7 +299,7 @@ def send_produce_request(self, payloads=[], acks=1, timeout=1000,
289
299
order of input payloads
290
300
"""
291
301
292
- encoder = partial (
302
+ encoder = functools . partial (
293
303
KafkaProtocol .encode_produce_request ,
294
304
acks = acks ,
295
305
timeout = timeout )
@@ -321,7 +331,7 @@ def send_fetch_request(self, payloads=[], fail_on_error=True,
321
331
to the same brokers.
322
332
"""
323
333
324
- encoder = partial (KafkaProtocol .encode_fetch_request ,
334
+ encoder = functools . partial (KafkaProtocol .encode_fetch_request ,
325
335
max_wait_time = max_wait_time ,
326
336
min_bytes = min_bytes )
327
337
@@ -359,7 +369,7 @@ def send_offset_request(self, payloads=[], fail_on_error=True,
359
369
360
370
def send_offset_commit_request (self , group , payloads = [],
361
371
fail_on_error = True , callback = None ):
362
- encoder = partial (KafkaProtocol .encode_offset_commit_request ,
372
+ encoder = functools . partial (KafkaProtocol .encode_offset_commit_request ,
363
373
group = group )
364
374
decoder = KafkaProtocol .decode_offset_commit_response
365
375
resps = self ._send_broker_aware_request (payloads , encoder , decoder )
@@ -378,7 +388,7 @@ def send_offset_commit_request(self, group, payloads=[],
378
388
def send_offset_fetch_request (self , group , payloads = [],
379
389
fail_on_error = True , callback = None ):
380
390
381
- encoder = partial (KafkaProtocol .encode_offset_fetch_request ,
391
+ encoder = functools . partial (KafkaProtocol .encode_offset_fetch_request ,
382
392
group = group )
383
393
decoder = KafkaProtocol .decode_offset_fetch_response
384
394
resps = self ._send_broker_aware_request (payloads , encoder , decoder )
0 commit comments