Skip to content

Commit 25a3e7d

Browse files
committed
Fix: handle the loop with try,except
1 parent 8576b84 commit 25a3e7d

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

examples/mysql_to_kafka.py

+28-23
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
# Output Kafka events to the console from MySQL replication stream
55
#
66

7+
import time
8+
79
from pymysqlreplication import BinLogStreamReader
810
from pymysqlreplication.row_event import (
911
DeleteRowsEvent,
@@ -12,6 +14,7 @@
1214
)
1315

1416
from kafka.admin import KafkaAdminClient, NewTopic
17+
from kafka.errors import TopicAlreadyExistsError
1518
from kafka import KafkaConsumer, KafkaProducer
1619

1720
MYSQL_SETTINGS = {"host": "127.0.0.1", "port": 3306, "user": "root", "passwd": ""}
@@ -25,12 +28,11 @@ def create_kafka_topic(topic_name, num_partitions=1, replication_factor=1):
2528
num_partitions=num_partitions,
2629
replication_factor=replication_factor,
2730
)
28-
2931
admin_client.create_topics(new_topics=[topic])
3032

3133

3234
def main():
33-
global message_body
35+
global message_body, topic
3436
producer = KafkaProducer(
3537
bootstrap_servers="127.0.0.1:9092",
3638
value_serializer=lambda v: str(v).encode("utf-8"),
@@ -42,22 +44,6 @@ def main():
4244
only_events=[DeleteRowsEvent, UpdateRowsEvent, WriteRowsEvent],
4345
)
4446

45-
for binlogevent in stream:
46-
for row in binlogevent.rows:
47-
if isinstance(binlogevent, DeleteRowsEvent):
48-
topic = "deleted"
49-
message_body = row["values"].items()
50-
51-
elif isinstance(binlogevent, UpdateRowsEvent):
52-
topic = "updated"
53-
message_body = row["after_values"].items()
54-
55-
elif isinstance(binlogevent, WriteRowsEvent):
56-
topic = "created"
57-
message_body = row["values"].items()
58-
59-
producer.send(topic, key=None, value=dict(message_body))
60-
6147
consumer = KafkaConsumer(
6248
"deleted",
6349
"updated",
@@ -68,12 +54,31 @@ def main():
6854
group_id="1",
6955
)
7056

71-
for message in consumer:
72-
print(f'Topic: "{message.topic}", Value: "{message.value}"')
57+
try:
58+
for binlogevent in stream:
59+
for row in binlogevent.rows:
60+
if isinstance(binlogevent, DeleteRowsEvent):
61+
topic = "deleted"
62+
message_body = row["values"].items()
63+
64+
elif isinstance(binlogevent, UpdateRowsEvent):
65+
topic = "updated"
66+
message_body = row["after_values"].items()
67+
68+
elif isinstance(binlogevent, WriteRowsEvent):
69+
topic = "created"
70+
message_body = row["values"].items()
71+
72+
producer.send(topic, key=None, value=dict(message_body))
73+
74+
for message in consumer:
75+
print(f'Topic: "{message.topic}", Value: "{message.value}"')
7376

74-
stream.close()
75-
producer.close()
76-
consumer.close()
77+
except KeyboardInterrupt:
78+
stream.close()
79+
producer.close()
80+
time.sleep(1)
81+
consumer.close()
7782

7883

7984
if __name__ == "__main__":

0 commit comments

Comments
 (0)