Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7850e7a

Browse files
authored
[ServiceBus] await error handler in session receiver (Azure#27716)
Currently in session receiver, we fire-and-forget user's error handler instead of awaiting it. This is causing problems when customer want to modify state in message handler, and want to roll back in case of error as currently we would carry on to abandon the message when error happens, then add credit. The same message could arrive and processed, while the error handling is still going on. This PR changes it to wait for user error handler before proceeding. This behavior of awaiting user error handler is in line with our streaming receiver and other languages.
1 parent 6704eff commit 7850e7a

File tree

4 files changed

+13
-11
lines changed

4 files changed

+13
-11
lines changed

sdk/servicebus/service-bus/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
### Bugs Fixed
1010

11+
- Wait for user error handler to finish when possible in session receivers. [PR #27716](https://github.com/Azure/azure-sdk-for-js/pull/27716)
12+
1113
### Other Changes
1214

1315
## 7.9.3 (2023-11-07)

sdk/servicebus/service-bus/src/core/messageReceiver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ export interface OnError {
9090
* NOTE: if this signature changes make sure you reflect those same changes in the
9191
* `OnErrorNoContext` definition below.
9292
*/
93-
(args: ProcessErrorArgs): void;
93+
(args: ProcessErrorArgs): Promise<void>;
9494
}
9595

9696
/**

sdk/servicebus/service-bus/src/session/messageSession.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ export class MessageSession extends LinkEntity<Receiver> {
444444
onMessageSettled(this.logPrefix, delivery, this._deliveryDispositionMap);
445445
};
446446

447-
this._notifyError = (args: ProcessErrorArgs) => {
447+
this._notifyError = async (args: ProcessErrorArgs) => {
448448
if (this._onError) {
449449
this._onError(args);
450450
logger.verbose(
@@ -691,7 +691,7 @@ export class MessageSession extends LinkEntity<Receiver> {
691691
this.logPrefix,
692692
bMessage.messageId
693693
);
694-
this._onError!({
694+
await this._onError!({
695695
error: err,
696696
errorSource: "processMessageCallback",
697697
entityPath: this.entityPath,
@@ -730,7 +730,7 @@ export class MessageSession extends LinkEntity<Receiver> {
730730
bMessage.messageId,
731731
translatedError
732732
);
733-
this._notifyError({
733+
await this._notifyError({
734734
error: translatedError,
735735
errorSource: "abandon",
736736
entityPath: this.entityPath,
@@ -772,7 +772,7 @@ export class MessageSession extends LinkEntity<Receiver> {
772772
this.logPrefix,
773773
bMessage.messageId
774774
);
775-
this._notifyError({
775+
await this._notifyError({
776776
error: translatedError,
777777
errorSource: "complete",
778778
entityPath: this.entityPath,
@@ -816,7 +816,7 @@ export class MessageSession extends LinkEntity<Receiver> {
816816
}
817817
}
818818

819-
private processCreditError(err: any): void {
819+
private async processCreditError(err: any): Promise<void> {
820820
if (err.name === "AbortError") {
821821
// if we fail to add credits because the user has asked us to stop
822822
// then this isn't an error - it's normal.
@@ -830,7 +830,7 @@ export class MessageSession extends LinkEntity<Receiver> {
830830

831831
// from the user's perspective this is a fatal link error and they should retry
832832
// opening the link.
833-
this._onError!({
833+
await this._onError!({
834834
error,
835835
errorSource: "processMessageCallback",
836836
entityPath: this.entityPath,
@@ -878,7 +878,7 @@ export class MessageSession extends LinkEntity<Receiver> {
878878
);
879879
try {
880880
// Notifying so that the streaming receiver knows about the error
881-
this._notifyError({
881+
await this._notifyError({
882882
entityPath: this.entityPath,
883883
fullyQualifiedNamespace: this._context.config.host,
884884
error: translateServiceBusError(connectionError),

sdk/servicebus/service-bus/test/internal/unit/messageSession.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ describe("Message session unit tests", () => {
509509
async (_message) => {
510510
/* empty body */
511511
},
512-
(errorArgs) => {
512+
async (errorArgs) => {
513513
errors.push({
514514
message: errorArgs.error.message,
515515
code: (errorArgs.error as ServiceBusError).code,
@@ -530,7 +530,7 @@ describe("Message session unit tests", () => {
530530

531531
it("processCreditError doesn't log or forward AbortError's", () => {
532532
let onErrorCalled = false;
533-
messageSession["_onError"] = (_err) => {
533+
messageSession["_onError"] = async (_err) => {
534534
onErrorCalled = true;
535535
};
536536

@@ -542,7 +542,7 @@ describe("Message session unit tests", () => {
542542

543543
it("processCreditError forwards non-retryable errors", () => {
544544
let err: ServiceBusError | Error | undefined;
545-
messageSession["_onError"] = (errArgs) => {
545+
messageSession["_onError"] = async (errArgs) => {
546546
err = errArgs.error;
547547
};
548548

0 commit comments

Comments
 (0)