2
2
# Copyright (c) Microsoft Corporation. All rights reserved.
3
3
# Licensed under the MIT License. See License.txt in the project root for license information.
4
4
# --------------------------------------------------------------------------------------------
5
- from typing import Any , TYPE_CHECKING
5
+ from typing import Any , List , TYPE_CHECKING
6
+ import logging
6
7
7
8
import uamqp
8
9
9
- from ._base_handler import _parse_conn_str , ServiceBusSharedKeyCredential
10
+ from ._base_handler import _parse_conn_str , ServiceBusSharedKeyCredential , BaseHandler
10
11
from ._servicebus_sender import ServiceBusSender
11
12
from ._servicebus_receiver import ServiceBusReceiver
12
13
from ._servicebus_session_receiver import ServiceBusSessionReceiver
16
17
if TYPE_CHECKING :
17
18
from azure .core .credentials import TokenCredential
18
19
20
+ _LOGGER = logging .getLogger (__name__ )
21
+
19
22
20
23
class ServiceBusClient (object ):
21
24
"""The ServiceBusClient class defines a high level interface for
@@ -69,6 +72,7 @@ def __init__(
69
72
self ._auth_uri = "{}/{}" .format (self ._auth_uri , self ._entity_name )
70
73
# Internal flag for switching whether to apply connection sharing, pending fix in uamqp library
71
74
self ._connection_sharing = False
75
+ self ._handlers = [] # type: List[BaseHandler]
72
76
73
77
def __enter__ (self ):
74
78
if self ._connection_sharing :
@@ -89,10 +93,22 @@ def _create_uamqp_connection(self):
89
93
def close (self ):
90
94
# type: () -> None
91
95
"""
92
- Close down the ServiceBus client and the underlying connection.
96
+ Close down the ServiceBus client.
97
+ All spawned senders, receivers and underlying connection will be shutdown.
93
98
94
99
:return: None
95
100
"""
101
+ for handler in self ._handlers :
102
+ try :
103
+ handler .close ()
104
+ except Exception as exception : # pylint: disable=broad-except
105
+ _LOGGER .error (
106
+ "Client has met an exception when closing the handler: %r. Exception: %r." ,
107
+ handler ._container_id , # pylint: disable=protected-access
108
+ exception ,
109
+ )
110
+ del self ._handlers [:]
111
+
96
112
if self ._connection_sharing and self ._connection :
97
113
self ._connection .destroy ()
98
114
@@ -157,7 +173,7 @@ def get_queue_sender(self, queue_name, **kwargs):
157
173
158
174
"""
159
175
# pylint: disable=protected-access
160
- return ServiceBusSender (
176
+ handler = ServiceBusSender (
161
177
fully_qualified_namespace = self .fully_qualified_namespace ,
162
178
queue_name = queue_name ,
163
179
credential = self ._credential ,
@@ -168,6 +184,8 @@ def get_queue_sender(self, queue_name, **kwargs):
168
184
user_agent = self ._config .user_agent ,
169
185
** kwargs
170
186
)
187
+ self ._handlers .append (handler )
188
+ return handler
171
189
172
190
def get_queue_receiver (self , queue_name , ** kwargs ):
173
191
# type: (str, Any) -> ServiceBusReceiver
@@ -205,7 +223,7 @@ def get_queue_receiver(self, queue_name, **kwargs):
205
223
206
224
"""
207
225
# pylint: disable=protected-access
208
- return ServiceBusReceiver (
226
+ handler = ServiceBusReceiver (
209
227
fully_qualified_namespace = self .fully_qualified_namespace ,
210
228
queue_name = queue_name ,
211
229
credential = self ._credential ,
@@ -216,6 +234,8 @@ def get_queue_receiver(self, queue_name, **kwargs):
216
234
user_agent = self ._config .user_agent ,
217
235
** kwargs
218
236
)
237
+ self ._handlers .append (handler )
238
+ return handler
219
239
220
240
def get_queue_deadletter_receiver (self , queue_name , ** kwargs ):
221
241
# type: (str, Any) -> ServiceBusReceiver
@@ -265,7 +285,7 @@ def get_queue_deadletter_receiver(self, queue_name, **kwargs):
265
285
queue_name = queue_name ,
266
286
transfer_deadletter = kwargs .get ('transfer_deadletter' , False )
267
287
)
268
- return ServiceBusReceiver (
288
+ handler = ServiceBusReceiver (
269
289
fully_qualified_namespace = self .fully_qualified_namespace ,
270
290
entity_name = entity_name ,
271
291
credential = self ._credential ,
@@ -277,6 +297,8 @@ def get_queue_deadletter_receiver(self, queue_name, **kwargs):
277
297
user_agent = self ._config .user_agent ,
278
298
** kwargs
279
299
)
300
+ self ._handlers .append (handler )
301
+ return handler
280
302
281
303
def get_topic_sender (self , topic_name , ** kwargs ):
282
304
# type: (str, Any) -> ServiceBusSender
@@ -300,7 +322,7 @@ def get_topic_sender(self, topic_name, **kwargs):
300
322
:caption: Create a new instance of the ServiceBusSender from ServiceBusClient.
301
323
302
324
"""
303
- return ServiceBusSender (
325
+ handler = ServiceBusSender (
304
326
fully_qualified_namespace = self .fully_qualified_namespace ,
305
327
topic_name = topic_name ,
306
328
credential = self ._credential ,
@@ -311,6 +333,8 @@ def get_topic_sender(self, topic_name, **kwargs):
311
333
user_agent = self ._config .user_agent ,
312
334
** kwargs
313
335
)
336
+ self ._handlers .append (handler )
337
+ return handler
314
338
315
339
def get_subscription_receiver (self , topic_name , subscription_name , ** kwargs ):
316
340
# type: (str, str, Any) -> ServiceBusReceiver
@@ -353,7 +377,7 @@ def get_subscription_receiver(self, topic_name, subscription_name, **kwargs):
353
377
354
378
"""
355
379
# pylint: disable=protected-access
356
- return ServiceBusReceiver (
380
+ handler = ServiceBusReceiver (
357
381
fully_qualified_namespace = self .fully_qualified_namespace ,
358
382
topic_name = topic_name ,
359
383
subscription_name = subscription_name ,
@@ -365,6 +389,8 @@ def get_subscription_receiver(self, topic_name, subscription_name, **kwargs):
365
389
user_agent = self ._config .user_agent ,
366
390
** kwargs
367
391
)
392
+ self ._handlers .append (handler )
393
+ return handler
368
394
369
395
def get_subscription_deadletter_receiver (self , topic_name , subscription_name , ** kwargs ):
370
396
# type: (str, str, Any) -> ServiceBusReceiver
@@ -416,7 +442,7 @@ def get_subscription_deadletter_receiver(self, topic_name, subscription_name, **
416
442
subscription_name = subscription_name ,
417
443
transfer_deadletter = kwargs .get ('transfer_deadletter' , False )
418
444
)
419
- return ServiceBusReceiver (
445
+ handler = ServiceBusReceiver (
420
446
fully_qualified_namespace = self .fully_qualified_namespace ,
421
447
entity_name = entity_name ,
422
448
credential = self ._credential ,
@@ -428,6 +454,8 @@ def get_subscription_deadletter_receiver(self, topic_name, subscription_name, **
428
454
user_agent = self ._config .user_agent ,
429
455
** kwargs
430
456
)
457
+ self ._handlers .append (handler )
458
+ return handler
431
459
432
460
def get_subscription_session_receiver (self , topic_name , subscription_name , session_id = None , ** kwargs ):
433
461
# type: (str, str, str, Any) -> ServiceBusSessionReceiver
@@ -473,7 +501,7 @@ def get_subscription_session_receiver(self, topic_name, subscription_name, sessi
473
501
474
502
"""
475
503
# pylint: disable=protected-access
476
- return ServiceBusSessionReceiver (
504
+ handler = ServiceBusSessionReceiver (
477
505
fully_qualified_namespace = self .fully_qualified_namespace ,
478
506
topic_name = topic_name ,
479
507
subscription_name = subscription_name ,
@@ -486,6 +514,8 @@ def get_subscription_session_receiver(self, topic_name, subscription_name, sessi
486
514
user_agent = self ._config .user_agent ,
487
515
** kwargs
488
516
)
517
+ self ._handlers .append (handler )
518
+ return handler
489
519
490
520
def get_queue_session_receiver (self , queue_name , session_id = None , ** kwargs ):
491
521
# type: (str, str, Any) -> ServiceBusSessionReceiver
@@ -526,7 +556,7 @@ def get_queue_session_receiver(self, queue_name, session_id=None, **kwargs):
526
556
527
557
"""
528
558
# pylint: disable=protected-access
529
- return ServiceBusSessionReceiver (
559
+ handler = ServiceBusSessionReceiver (
530
560
fully_qualified_namespace = self .fully_qualified_namespace ,
531
561
queue_name = queue_name ,
532
562
credential = self ._credential ,
@@ -538,3 +568,5 @@ def get_queue_session_receiver(self, queue_name, session_id=None, **kwargs):
538
568
user_agent = self ._config .user_agent ,
539
569
** kwargs
540
570
)
571
+ self ._handlers .append (handler )
572
+ return handler
0 commit comments