1
1
# type: ignore
2
-
3
-
4
- import time
5
- from dataclasses import dataclass
6
- from typing import Optional
7
-
8
2
from rabbitmq_amqp_python_client import (
9
3
AddressHelper ,
10
4
AMQPMessagingHandler ,
11
5
Connection ,
12
6
ConnectionClosed ,
13
- Consumer ,
14
7
Environment ,
15
8
Event ,
16
9
ExchangeSpecification ,
17
10
ExchangeToQueueBindingSpecification ,
18
- Management ,
19
11
Message ,
20
- Publisher ,
21
12
QuorumQueueSpecification ,
22
13
)
23
14
24
-
25
15
# here we keep track of the objects we need to reconnect
26
- @dataclass
27
- class ConnectionConfiguration :
28
- connection : Optional [Connection ] = None
29
- management : Optional [Management ] = None
30
- publisher : Optional [Publisher ] = None
31
- consumer : Optional [Consumer ] = None
32
-
33
-
34
- connection_configuration = ConnectionConfiguration ()
35
- MESSAGES_TO_PUBLSH = 50000
36
-
37
-
38
- # disconnection callback
39
- # here you can cleanup or reconnect
40
- def on_disconnection ():
41
-
42
- print ("disconnected" )
43
- global environment
44
- exchange_name = "test-exchange"
45
- queue_name = "example-queue"
46
- routing_key = "routing-key"
47
-
48
- global connection_configuration
49
-
50
- addr = AddressHelper .exchange_address (exchange_name , routing_key )
51
- addr_queue = AddressHelper .queue_address (queue_name )
52
-
53
- if connection_configuration .connection is not None :
54
- connection_configuration .connection = create_connection ()
55
- if connection_configuration .management is not None :
56
- connection_configuration .management = (
57
- connection_configuration .connection .management ()
58
- )
59
- if connection_configuration .publisher is not None :
60
- connection_configuration .publisher = (
61
- connection_configuration .connection .publisher (addr )
62
- )
63
- if connection_configuration .consumer is not None :
64
- connection_configuration .consumer = (
65
- connection_configuration .connection .consumer (
66
- addr_queue , message_handler = MyMessageHandler ()
67
- )
68
- )
16
+ MESSAGES_TO_PUBLISH = 50000
69
17
70
18
71
19
environment = Environment (
72
- uri = "amqp://guest:guest@localhost:5672/" , on_disconnection_handler = on_disconnection
20
+ uri = "amqp://guest:guest@localhost:5672/" ,
73
21
)
74
22
75
23
@@ -102,7 +50,7 @@ def on_message(self, event: Event):
102
50
103
51
self ._count = self ._count + 1
104
52
105
- if self ._count == MESSAGES_TO_PUBLSH :
53
+ if self ._count == MESSAGES_TO_PUBLISH :
106
54
print ("closing receiver" )
107
55
# if you want you can add cleanup operations here
108
56
@@ -136,29 +84,22 @@ def main() -> None:
136
84
queue_name = "example-queue"
137
85
routing_key = "routing-key"
138
86
139
- global connection_configuration
140
-
141
87
print ("connection to amqp server" )
142
- if connection_configuration .connection is None :
143
- connection_configuration .connection = create_connection ()
144
-
145
- if connection_configuration .management is None :
146
- connection_configuration .management = (
147
- connection_configuration .connection .management ()
148
- )
88
+ connection = create_connection ()
89
+ management = connection .management ()
90
+ publisher = None
91
+ consumer = None
149
92
150
93
print ("declaring exchange and queue" )
151
- connection_configuration .management .declare_exchange (
152
- ExchangeSpecification (name = exchange_name )
153
- )
94
+ management .declare_exchange (ExchangeSpecification (name = exchange_name ))
154
95
155
- connection_configuration . management .declare_queue (
96
+ management .declare_queue (
156
97
QuorumQueueSpecification (name = queue_name )
157
98
# QuorumQueueSpecification(name=queue_name, dead_letter_exchange="dead-letter")
158
99
)
159
100
160
101
print ("binding queue to exchange" )
161
- bind_name = connection_configuration . management .bind (
102
+ bind_name = management .bind (
162
103
ExchangeToQueueBindingSpecification (
163
104
source_exchange = exchange_name ,
164
105
destination_queue = queue_name ,
@@ -171,34 +112,32 @@ def main() -> None:
171
112
addr_queue = AddressHelper .queue_address (queue_name )
172
113
173
114
print ("create a publisher and publish a test message" )
174
- if connection_configuration .publisher is None :
175
- connection_configuration .publisher = (
176
- connection_configuration .connection .publisher (addr )
177
- )
115
+ if publisher is None :
116
+ publisher = connection .publisher (addr )
178
117
179
118
print ("purging the queue" )
180
- messages_purged = connection_configuration . management .purge_queue (queue_name )
119
+ messages_purged = management .purge_queue (queue_name )
181
120
182
121
print ("messages purged: " + str (messages_purged ))
183
- # management.close()
184
122
185
123
# publishing messages
186
124
while True :
187
- for i in range (MESSAGES_TO_PUBLSH ):
125
+ for i in range (MESSAGES_TO_PUBLISH ):
188
126
189
127
if i % 1000 == 0 :
190
128
print ("published 1000 messages..." )
191
129
try :
192
- if connection_configuration . publisher is not None :
193
- connection_configuration . publisher .publish (Message (body = "test" ))
130
+ if publisher is not None :
131
+ publisher .publish (Message (body = "test" ))
194
132
except ConnectionClosed :
195
133
print ("publisher closing exception, resubmitting" )
134
+ # publisher = connection.publisher(addr)
196
135
continue
197
136
198
137
print ("closing publisher" )
199
138
try :
200
- if connection_configuration . publisher is not None :
201
- connection_configuration . publisher .close ()
139
+ if publisher is not None :
140
+ publisher .close ()
202
141
except ConnectionClosed :
203
142
print ("publisher closing exception, resubmitting" )
204
143
continue
@@ -207,43 +146,35 @@ def main() -> None:
207
146
print (
208
147
"create a consumer and consume the test message - press control + c to terminate to consume"
209
148
)
210
- if connection_configuration .consumer is None :
211
- connection_configuration .consumer = (
212
- connection_configuration .connection .consumer (
213
- addr_queue , message_handler = MyMessageHandler ()
214
- )
215
- )
149
+ if consumer is None :
150
+ consumer = connection .consumer (addr_queue , message_handler = MyMessageHandler ())
216
151
217
152
while True :
218
153
try :
219
- connection_configuration . consumer .run ()
154
+ consumer .run ()
220
155
except KeyboardInterrupt :
221
156
pass
222
157
except ConnectionClosed :
223
- time .sleep (1 )
224
158
continue
225
159
except Exception as e :
226
160
print ("consumer exited for exception " + str (e ))
227
161
228
162
break
229
163
230
164
print ("cleanup" )
231
- connection_configuration .consumer .close ()
232
- # once we finish consuming if we close the connection we need to create a new one
233
- # connection = create_connection()
234
- # management = connection.management()
165
+ consumer .close ()
235
166
236
167
print ("unbind" )
237
- connection_configuration . management .unbind (bind_name )
168
+ management .unbind (bind_name )
238
169
239
170
print ("delete queue" )
240
- connection_configuration . management .delete_queue (queue_name )
171
+ management .delete_queue (queue_name )
241
172
242
173
print ("delete exchange" )
243
- connection_configuration . management .delete_exchange (exchange_name )
174
+ management .delete_exchange (exchange_name )
244
175
245
176
print ("closing connections" )
246
- connection_configuration . management .close ()
177
+ management .close ()
247
178
print ("after management closing" )
248
179
environment .close ()
249
180
print ("after connection closing" )
0 commit comments