11# type: ignore
2-
3-
4- import time
5- from dataclasses import dataclass
6- from typing import Optional
7-
82from rabbitmq_amqp_python_client import (
93 AddressHelper ,
104 AMQPMessagingHandler ,
115 Connection ,
126 ConnectionClosed ,
13- Consumer ,
147 Environment ,
158 Event ,
169 ExchangeSpecification ,
1710 ExchangeToQueueBindingSpecification ,
18- Management ,
1911 Message ,
20- Publisher ,
2112 QuorumQueueSpecification ,
2213)
2314
24-
2515# 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-
16+ MESSAGES_TO_PUBLISH = 50000
3317
34- connection_configuration = ConnectionConfiguration ()
35- MESSAGES_TO_PUBLSH = 50000
3618
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- )
69-
70-
71- environment = Environment (
72- uri = "amqp://guest:guest@localhost:5672/" , on_disconnection_handler = on_disconnection
73- )
19+ environment = Environment (uri = "amqp://guest:guest@localhost:5672/" , reconnect = True )
7420
7521
7622class MyMessageHandler (AMQPMessagingHandler ):
@@ -102,7 +48,7 @@ def on_message(self, event: Event):
10248
10349 self ._count = self ._count + 1
10450
105- if self ._count == MESSAGES_TO_PUBLSH :
51+ if self ._count == MESSAGES_TO_PUBLISH :
10652 print ("closing receiver" )
10753 # if you want you can add cleanup operations here
10854
@@ -136,29 +82,22 @@ def main() -> None:
13682 queue_name = "example-queue"
13783 routing_key = "routing-key"
13884
139- global connection_configuration
140-
14185 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- )
86+ connection = create_connection ()
87+ management = connection .management ()
88+ publisher = None
89+ consumer = None
14990
15091 print ("declaring exchange and queue" )
151- connection_configuration .management .declare_exchange (
152- ExchangeSpecification (name = exchange_name )
153- )
92+ management .declare_exchange (ExchangeSpecification (name = exchange_name ))
15493
155- connection_configuration . management .declare_queue (
94+ management .declare_queue (
15695 QuorumQueueSpecification (name = queue_name )
15796 # QuorumQueueSpecification(name=queue_name, dead_letter_exchange="dead-letter")
15897 )
15998
16099 print ("binding queue to exchange" )
161- bind_name = connection_configuration . management .bind (
100+ bind_name = management .bind (
162101 ExchangeToQueueBindingSpecification (
163102 source_exchange = exchange_name ,
164103 destination_queue = queue_name ,
@@ -171,34 +110,32 @@ def main() -> None:
171110 addr_queue = AddressHelper .queue_address (queue_name )
172111
173112 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- )
113+ if publisher is None :
114+ publisher = connection .publisher (addr )
178115
179116 print ("purging the queue" )
180- messages_purged = connection_configuration . management .purge_queue (queue_name )
117+ messages_purged = management .purge_queue (queue_name )
181118
182119 print ("messages purged: " + str (messages_purged ))
183- # management.close()
184120
185121 # publishing messages
186122 while True :
187- for i in range (MESSAGES_TO_PUBLSH ):
123+ for i in range (MESSAGES_TO_PUBLISH ):
188124
189125 if i % 1000 == 0 :
190126 print ("published 1000 messages..." )
191127 try :
192- if connection_configuration . publisher is not None :
193- connection_configuration . publisher .publish (Message (body = "test" ))
128+ if publisher is not None :
129+ publisher .publish (Message (body = "test" ))
194130 except ConnectionClosed :
195131 print ("publisher closing exception, resubmitting" )
132+ publisher = connection .publisher (addr )
196133 continue
197134
198135 print ("closing publisher" )
199136 try :
200- if connection_configuration . publisher is not None :
201- connection_configuration . publisher .close ()
137+ if publisher is not None :
138+ publisher .close ()
202139 except ConnectionClosed :
203140 print ("publisher closing exception, resubmitting" )
204141 continue
@@ -207,43 +144,39 @@ def main() -> None:
207144 print (
208145 "create a consumer and consume the test message - press control + c to terminate to consume"
209146 )
210- if connection_configuration .consumer is None :
211- connection_configuration .consumer = (
212- connection_configuration .connection .consumer (
213- addr_queue , message_handler = MyMessageHandler ()
214- )
215- )
147+ if consumer is None :
148+ consumer = connection .consumer (addr_queue , message_handler = MyMessageHandler ())
216149
217150 while True :
218151 try :
219- connection_configuration . consumer .run ()
152+ consumer .run ()
220153 except KeyboardInterrupt :
221154 pass
222155 except ConnectionClosed :
223- time .sleep (1 )
156+ consumer = connection .consumer (
157+ addr_queue , message_handler = MyMessageHandler ()
158+ )
224159 continue
225160 except Exception as e :
226161 print ("consumer exited for exception " + str (e ))
227162
228163 break
229164
230165 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()
166+ consumer .close ()
235167
168+ management = connection .management ()
236169 print ("unbind" )
237- connection_configuration . management .unbind (bind_name )
170+ management .unbind (bind_name )
238171
239172 print ("delete queue" )
240- connection_configuration . management .delete_queue (queue_name )
173+ management .delete_queue (queue_name )
241174
242175 print ("delete exchange" )
243- connection_configuration . management .delete_exchange (exchange_name )
176+ management .delete_exchange (exchange_name )
244177
245178 print ("closing connections" )
246- connection_configuration . management .close ()
179+ management .close ()
247180 print ("after management closing" )
248181 environment .close ()
249182 print ("after connection closing" )
0 commit comments