Skip to content

Commit 1dad954

Browse files
authored
[ServiceBus] ServiceBusClient close spawned children (#13077)
* close spawned children * fix mypy * update according to comments * python27 compatible
1 parent 4f859ec commit 1dad954

File tree

5 files changed

+192
-22
lines changed

5 files changed

+192
-22
lines changed

sdk/servicebus/azure-servicebus/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## 7.0.0b6 (Unreleased)
44

5+
**Breaking Changes**
6+
7+
* `ServiceBusClient.close()` now closes spawned senders and receivers.
58

69
## 7.0.0b5 (2020-08-10)
710

sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_client.py

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
# Copyright (c) Microsoft Corporation. All rights reserved.
33
# Licensed under the MIT License. See License.txt in the project root for license information.
44
# --------------------------------------------------------------------------------------------
5-
from typing import Any, TYPE_CHECKING
5+
from typing import Any, List, TYPE_CHECKING
6+
import logging
67

78
import uamqp
89

9-
from ._base_handler import _parse_conn_str, ServiceBusSharedKeyCredential
10+
from ._base_handler import _parse_conn_str, ServiceBusSharedKeyCredential, BaseHandler
1011
from ._servicebus_sender import ServiceBusSender
1112
from ._servicebus_receiver import ServiceBusReceiver
1213
from ._servicebus_session_receiver import ServiceBusSessionReceiver
@@ -16,6 +17,8 @@
1617
if TYPE_CHECKING:
1718
from azure.core.credentials import TokenCredential
1819

20+
_LOGGER = logging.getLogger(__name__)
21+
1922

2023
class ServiceBusClient(object):
2124
"""The ServiceBusClient class defines a high level interface for
@@ -69,6 +72,7 @@ def __init__(
6972
self._auth_uri = "{}/{}".format(self._auth_uri, self._entity_name)
7073
# Internal flag for switching whether to apply connection sharing, pending fix in uamqp library
7174
self._connection_sharing = False
75+
self._handlers = [] # type: List[BaseHandler]
7276

7377
def __enter__(self):
7478
if self._connection_sharing:
@@ -89,10 +93,22 @@ def _create_uamqp_connection(self):
8993
def close(self):
9094
# type: () -> None
9195
"""
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.
9398
9499
:return: None
95100
"""
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+
96112
if self._connection_sharing and self._connection:
97113
self._connection.destroy()
98114

@@ -157,7 +173,7 @@ def get_queue_sender(self, queue_name, **kwargs):
157173
158174
"""
159175
# pylint: disable=protected-access
160-
return ServiceBusSender(
176+
handler = ServiceBusSender(
161177
fully_qualified_namespace=self.fully_qualified_namespace,
162178
queue_name=queue_name,
163179
credential=self._credential,
@@ -168,6 +184,8 @@ def get_queue_sender(self, queue_name, **kwargs):
168184
user_agent=self._config.user_agent,
169185
**kwargs
170186
)
187+
self._handlers.append(handler)
188+
return handler
171189

172190
def get_queue_receiver(self, queue_name, **kwargs):
173191
# type: (str, Any) -> ServiceBusReceiver
@@ -205,7 +223,7 @@ def get_queue_receiver(self, queue_name, **kwargs):
205223
206224
"""
207225
# pylint: disable=protected-access
208-
return ServiceBusReceiver(
226+
handler = ServiceBusReceiver(
209227
fully_qualified_namespace=self.fully_qualified_namespace,
210228
queue_name=queue_name,
211229
credential=self._credential,
@@ -216,6 +234,8 @@ def get_queue_receiver(self, queue_name, **kwargs):
216234
user_agent=self._config.user_agent,
217235
**kwargs
218236
)
237+
self._handlers.append(handler)
238+
return handler
219239

220240
def get_queue_deadletter_receiver(self, queue_name, **kwargs):
221241
# type: (str, Any) -> ServiceBusReceiver
@@ -265,7 +285,7 @@ def get_queue_deadletter_receiver(self, queue_name, **kwargs):
265285
queue_name=queue_name,
266286
transfer_deadletter=kwargs.get('transfer_deadletter', False)
267287
)
268-
return ServiceBusReceiver(
288+
handler = ServiceBusReceiver(
269289
fully_qualified_namespace=self.fully_qualified_namespace,
270290
entity_name=entity_name,
271291
credential=self._credential,
@@ -277,6 +297,8 @@ def get_queue_deadletter_receiver(self, queue_name, **kwargs):
277297
user_agent=self._config.user_agent,
278298
**kwargs
279299
)
300+
self._handlers.append(handler)
301+
return handler
280302

281303
def get_topic_sender(self, topic_name, **kwargs):
282304
# type: (str, Any) -> ServiceBusSender
@@ -300,7 +322,7 @@ def get_topic_sender(self, topic_name, **kwargs):
300322
:caption: Create a new instance of the ServiceBusSender from ServiceBusClient.
301323
302324
"""
303-
return ServiceBusSender(
325+
handler = ServiceBusSender(
304326
fully_qualified_namespace=self.fully_qualified_namespace,
305327
topic_name=topic_name,
306328
credential=self._credential,
@@ -311,6 +333,8 @@ def get_topic_sender(self, topic_name, **kwargs):
311333
user_agent=self._config.user_agent,
312334
**kwargs
313335
)
336+
self._handlers.append(handler)
337+
return handler
314338

315339
def get_subscription_receiver(self, topic_name, subscription_name, **kwargs):
316340
# type: (str, str, Any) -> ServiceBusReceiver
@@ -353,7 +377,7 @@ def get_subscription_receiver(self, topic_name, subscription_name, **kwargs):
353377
354378
"""
355379
# pylint: disable=protected-access
356-
return ServiceBusReceiver(
380+
handler = ServiceBusReceiver(
357381
fully_qualified_namespace=self.fully_qualified_namespace,
358382
topic_name=topic_name,
359383
subscription_name=subscription_name,
@@ -365,6 +389,8 @@ def get_subscription_receiver(self, topic_name, subscription_name, **kwargs):
365389
user_agent=self._config.user_agent,
366390
**kwargs
367391
)
392+
self._handlers.append(handler)
393+
return handler
368394

369395
def get_subscription_deadletter_receiver(self, topic_name, subscription_name, **kwargs):
370396
# type: (str, str, Any) -> ServiceBusReceiver
@@ -416,7 +442,7 @@ def get_subscription_deadletter_receiver(self, topic_name, subscription_name, **
416442
subscription_name=subscription_name,
417443
transfer_deadletter=kwargs.get('transfer_deadletter', False)
418444
)
419-
return ServiceBusReceiver(
445+
handler = ServiceBusReceiver(
420446
fully_qualified_namespace=self.fully_qualified_namespace,
421447
entity_name=entity_name,
422448
credential=self._credential,
@@ -428,6 +454,8 @@ def get_subscription_deadletter_receiver(self, topic_name, subscription_name, **
428454
user_agent=self._config.user_agent,
429455
**kwargs
430456
)
457+
self._handlers.append(handler)
458+
return handler
431459

432460
def get_subscription_session_receiver(self, topic_name, subscription_name, session_id=None, **kwargs):
433461
# type: (str, str, str, Any) -> ServiceBusSessionReceiver
@@ -473,7 +501,7 @@ def get_subscription_session_receiver(self, topic_name, subscription_name, sessi
473501
474502
"""
475503
# pylint: disable=protected-access
476-
return ServiceBusSessionReceiver(
504+
handler = ServiceBusSessionReceiver(
477505
fully_qualified_namespace=self.fully_qualified_namespace,
478506
topic_name=topic_name,
479507
subscription_name=subscription_name,
@@ -486,6 +514,8 @@ def get_subscription_session_receiver(self, topic_name, subscription_name, sessi
486514
user_agent=self._config.user_agent,
487515
**kwargs
488516
)
517+
self._handlers.append(handler)
518+
return handler
489519

490520
def get_queue_session_receiver(self, queue_name, session_id=None, **kwargs):
491521
# type: (str, str, Any) -> ServiceBusSessionReceiver
@@ -526,7 +556,7 @@ def get_queue_session_receiver(self, queue_name, session_id=None, **kwargs):
526556
527557
"""
528558
# pylint: disable=protected-access
529-
return ServiceBusSessionReceiver(
559+
handler = ServiceBusSessionReceiver(
530560
fully_qualified_namespace=self.fully_qualified_namespace,
531561
queue_name=queue_name,
532562
credential=self._credential,
@@ -538,3 +568,5 @@ def get_queue_session_receiver(self, queue_name, session_id=None, **kwargs):
538568
user_agent=self._config.user_agent,
539569
**kwargs
540570
)
571+
self._handlers.append(handler)
572+
return handler

0 commit comments

Comments
 (0)