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-
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
6917
7018
7119environment = Environment (
72- uri = "amqp://guest:guest@localhost:5672/" , on_disconnection_handler = on_disconnection
20+ uri = "amqp://guest:guest@localhost:5672/" ,
7321)
7422
7523
@@ -102,7 +50,7 @@ def on_message(self, event: Event):
10250
10351 self ._count = self ._count + 1
10452
105- if self ._count == MESSAGES_TO_PUBLSH :
53+ if self ._count == MESSAGES_TO_PUBLISH :
10654 print ("closing receiver" )
10755 # if you want you can add cleanup operations here
10856
@@ -136,29 +84,22 @@ def main() -> None:
13684 queue_name = "example-queue"
13785 routing_key = "routing-key"
13886
139- global connection_configuration
140-
14187 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
14992
15093 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 ))
15495
155- connection_configuration . management .declare_queue (
96+ management .declare_queue (
15697 QuorumQueueSpecification (name = queue_name )
15798 # QuorumQueueSpecification(name=queue_name, dead_letter_exchange="dead-letter")
15899 )
159100
160101 print ("binding queue to exchange" )
161- bind_name = connection_configuration . management .bind (
102+ bind_name = management .bind (
162103 ExchangeToQueueBindingSpecification (
163104 source_exchange = exchange_name ,
164105 destination_queue = queue_name ,
@@ -171,34 +112,32 @@ def main() -> None:
171112 addr_queue = AddressHelper .queue_address (queue_name )
172113
173114 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 )
178117
179118 print ("purging the queue" )
180- messages_purged = connection_configuration . management .purge_queue (queue_name )
119+ messages_purged = management .purge_queue (queue_name )
181120
182121 print ("messages purged: " + str (messages_purged ))
183- # management.close()
184122
185123 # publishing messages
186124 while True :
187- for i in range (MESSAGES_TO_PUBLSH ):
125+ for i in range (MESSAGES_TO_PUBLISH ):
188126
189127 if i % 1000 == 0 :
190128 print ("published 1000 messages..." )
191129 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" ))
194132 except ConnectionClosed :
195133 print ("publisher closing exception, resubmitting" )
134+ # publisher = connection.publisher(addr)
196135 continue
197136
198137 print ("closing publisher" )
199138 try :
200- if connection_configuration . publisher is not None :
201- connection_configuration . publisher .close ()
139+ if publisher is not None :
140+ publisher .close ()
202141 except ConnectionClosed :
203142 print ("publisher closing exception, resubmitting" )
204143 continue
@@ -207,43 +146,35 @@ def main() -> None:
207146 print (
208147 "create a consumer and consume the test message - press control + c to terminate to consume"
209148 )
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 ())
216151
217152 while True :
218153 try :
219- connection_configuration . consumer .run ()
154+ consumer .run ()
220155 except KeyboardInterrupt :
221156 pass
222157 except ConnectionClosed :
223- time .sleep (1 )
224158 continue
225159 except Exception as e :
226160 print ("consumer exited for exception " + str (e ))
227161
228162 break
229163
230164 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 ()
235166
236167 print ("unbind" )
237- connection_configuration . management .unbind (bind_name )
168+ management .unbind (bind_name )
238169
239170 print ("delete queue" )
240- connection_configuration . management .delete_queue (queue_name )
171+ management .delete_queue (queue_name )
241172
242173 print ("delete exchange" )
243- connection_configuration . management .delete_exchange (exchange_name )
174+ management .delete_exchange (exchange_name )
244175
245176 print ("closing connections" )
246- connection_configuration . management .close ()
177+ management .close ()
247178 print ("after management closing" )
248179 environment .close ()
249180 print ("after connection closing" )
0 commit comments