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

Skip to content

Commit daad896

Browse files
authored
[Service Bus] add an option to omit message body when peeking messages (Azure#21002)
Add an optional `omitMessageBody` option in `PeekMessagesOptions` allowing omitting message body when peeking messages. By default, message body is not omitted.
1 parent 6259284 commit daad896

File tree

7 files changed

+107
-2
lines changed

7 files changed

+107
-2
lines changed

sdk/servicebus/service-bus/CHANGELOG.md

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

55
### Features Added
66

7+
- Add an option `omitMessageBody` in `PeekMessagesOptions` allowing omitting message body when peeking messages using `receiver.peekMessages()`
8+
79
### Breaking Changes
810

911
### Bugs Fixed

sdk/servicebus/service-bus/review/service-bus.api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@ export function parseServiceBusConnectionString(connectionString: string): Servi
207207
// @public
208208
export interface PeekMessagesOptions extends OperationOptionsBase {
209209
fromSequenceNumber?: Long_2;
210+
// @beta
211+
omitMessageBody?: boolean;
210212
}
211213

212214
// @public

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,16 +393,19 @@ export class ManagementClient extends LinkEntity<RequestResponseLink> {
393393
* also fetch even Deferred messages (but not Deadlettered message).
394394
*
395395
* @param messageCount - The number of messages to retrieve. Default value `1`.
396+
* @param omitMessageBody - Whether to omit message body when peeking. Default value `false`.
396397
*/
397398
async peek(
398399
messageCount: number,
400+
omitMessageBody?: boolean,
399401
options?: OperationOptionsBase & SendManagementRequestOptions
400402
): Promise<ServiceBusReceivedMessage[]> {
401403
throwErrorIfConnectionClosed(this._context);
402404
return this.peekBySequenceNumber(
403405
this._lastPeekedSequenceNumber.add(1),
404406
messageCount,
405407
undefined,
408+
omitMessageBody,
406409
options
407410
);
408411
}
@@ -418,17 +421,20 @@ export class ManagementClient extends LinkEntity<RequestResponseLink> {
418421
*
419422
* @param sessionId - The sessionId from which messages need to be peeked.
420423
* @param messageCount - The number of messages to retrieve. Default value `1`.
424+
* @param omitMessageBody - Whether to omit message body when peeking Default value `false`.
421425
*/
422426
async peekMessagesBySession(
423427
sessionId: string,
424428
messageCount: number,
429+
omitMessageBody?: boolean,
425430
options?: OperationOptionsBase & SendManagementRequestOptions
426431
): Promise<ServiceBusReceivedMessage[]> {
427432
throwErrorIfConnectionClosed(this._context);
428433
return this.peekBySequenceNumber(
429434
this._lastPeekedSequenceNumber.add(1),
430435
messageCount,
431436
sessionId,
437+
omitMessageBody,
432438
options
433439
);
434440
}
@@ -439,11 +445,13 @@ export class ManagementClient extends LinkEntity<RequestResponseLink> {
439445
* @param fromSequenceNumber - The sequence number from where to read the message.
440446
* @param messageCount - The number of messages to retrieve. Default value `1`.
441447
* @param sessionId - The sessionId from which messages need to be peeked.
448+
* @param omitMessageBody - Whether to omit message body when peeking. Default value `false`.
442449
*/
443450
async peekBySequenceNumber(
444451
fromSequenceNumber: Long,
445452
maxMessageCount: number,
446453
sessionId?: string,
454+
omitMessageBody?: boolean,
447455
options?: OperationOptionsBase & SendManagementRequestOptions
448456
): Promise<ServiceBusReceivedMessage[]> {
449457
throwErrorIfConnectionClosed(this._context);
@@ -480,6 +488,10 @@ export class ManagementClient extends LinkEntity<RequestResponseLink> {
480488
if (isDefined(sessionId)) {
481489
messageBody[Constants.sessionIdMapKey] = sessionId;
482490
}
491+
if (isDefined(omitMessageBody)) {
492+
const omitMessageBodyKey = "omit-message-body"; // TODO: Service Bus specific. Put it somewhere
493+
messageBody[omitMessageBodyKey] = types.wrap_boolean(omitMessageBody);
494+
}
483495
const request: RheaMessage = {
484496
body: messageBody,
485497
reply_to: this.replyTo,

sdk/servicebus/service-bus/src/models.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,9 @@ export interface PeekMessagesOptions extends OperationOptionsBase {
267267
* The sequence number to start peeking messages from (inclusive).
268268
*/
269269
fromSequenceNumber?: Long;
270+
/**
271+
* @beta
272+
* (Experimental for diagnostic purpose) Specifies whether to omit the body when peeking messages. Default value `false`.
273+
*/
274+
omitMessageBody?: boolean;
270275
}

sdk/servicebus/service-bus/src/receivers/receiver.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,12 +459,13 @@ export class ServiceBusReceiverImpl implements ServiceBusReceiver {
459459
options.fromSequenceNumber,
460460
maxMessageCount,
461461
undefined,
462+
options.omitMessageBody,
462463
managementRequestOptions
463464
);
464465
} else {
465466
return this._context
466467
.getManagementClient(this.entityPath)
467-
.peek(maxMessageCount, managementRequestOptions);
468+
.peek(maxMessageCount, options.omitMessageBody, managementRequestOptions);
468469
}
469470
};
470471

sdk/servicebus/service-bus/src/receivers/sessionReceiver.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,18 @@ export class ServiceBusSessionReceiverImpl implements ServiceBusSessionReceiver
310310
options.fromSequenceNumber,
311311
maxMessageCount,
312312
this.sessionId,
313+
options.omitMessageBody,
313314
managementRequestOptions
314315
);
315316
} else {
316317
return this._context
317318
.getManagementClient(this.entityPath)
318-
.peekMessagesBySession(this.sessionId, maxMessageCount, managementRequestOptions);
319+
.peekMessagesBySession(
320+
this.sessionId,
321+
maxMessageCount,
322+
options.omitMessageBody,
323+
managementRequestOptions
324+
);
319325
}
320326
};
321327

sdk/servicebus/service-bus/test/internal/serviceBusClient.spec.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,83 @@ describe("ServiceBusClient live tests", () => {
9797
await receiver.close();
9898
await sbClientWithRelaxedEndPoint.close();
9999
});
100+
101+
it.skip(
102+
noSessionTestClientType + ":can omit message body when peeking",
103+
async function (): Promise<void> {
104+
// Create a test client to get the entity types
105+
const sbClient = createServiceBusClientForTests();
106+
const entities = await sbClient.test.createTestEntities(noSessionTestClientType);
107+
await sbClient.close();
108+
109+
// Create a sb client, sender, receiver with relaxed endpoint
110+
const sbClientWithRelaxedEndPoint = new ServiceBusClient(
111+
getEnvVars().SERVICEBUS_CONNECTION_STRING.replace("sb://", "CheeseBurger://")
112+
);
113+
const sender = sbClientWithRelaxedEndPoint.createSender(entities.queue || entities.topic!);
114+
const receiver = entities.queue
115+
? sbClientWithRelaxedEndPoint.createReceiver(entities.queue)
116+
: sbClientWithRelaxedEndPoint.createReceiver(entities.topic!, entities.subscription!);
117+
try {
118+
// Send and receive messages
119+
const testMessages = entities.usesSessions
120+
? TestMessage.getSessionSample()
121+
: TestMessage.getSample();
122+
await sender.sendMessages(testMessages);
123+
124+
let peekedMsgs = await receiver.peekMessages(2, {
125+
omitMessageBody: true,
126+
fromSequenceNumber: Long.ZERO,
127+
});
128+
should.equal(peekedMsgs.length, 1, "expecting one peeked message 1");
129+
should.not.exist(peekedMsgs[0].body);
130+
should.exist(
131+
peekedMsgs[0]._rawAmqpMessage.deliveryAnnotations,
132+
"expecting deliveryAnnotations"
133+
);
134+
const omittedSize = Number(
135+
peekedMsgs[0]._rawAmqpMessage.deliveryAnnotations!["omitted-message-body-size"]
136+
);
137+
should.equal(omittedSize > 0, true);
138+
139+
peekedMsgs = await receiver.peekMessages(2, {
140+
omitMessageBody: false,
141+
fromSequenceNumber: Long.ZERO,
142+
});
143+
should.equal(peekedMsgs.length, 1, "expecting one peeked message 2");
144+
should.exist(peekedMsgs[0].body);
145+
should.exist(
146+
peekedMsgs[0]._rawAmqpMessage.deliveryAnnotations,
147+
"expecting deliveryAnnotations"
148+
);
149+
should.not.exist(
150+
peekedMsgs[0]._rawAmqpMessage.deliveryAnnotations!["omitted-message-body-size"],
151+
"Not expecting omitted-message-body-size"
152+
);
153+
154+
peekedMsgs = await receiver.peekMessages(2, { fromSequenceNumber: Long.ZERO });
155+
should.equal(peekedMsgs.length, 1, "expecting one peeked message 3");
156+
should.exist(peekedMsgs[0].body);
157+
should.exist(
158+
peekedMsgs[0]._rawAmqpMessage.deliveryAnnotations,
159+
"expecting deliveryAnnotations"
160+
);
161+
should.not.exist(
162+
peekedMsgs[0]._rawAmqpMessage.deliveryAnnotations!["omitted-message-body-size"],
163+
"Not expecting omitted-message-body-size"
164+
);
165+
166+
await receiver.receiveMessages(2);
167+
await testPeekMsgsLength(receiver, 0);
168+
} finally {
169+
// Clean up
170+
await sbClient.test.after();
171+
await sender.close();
172+
await receiver.close();
173+
await sbClientWithRelaxedEndPoint.close();
174+
}
175+
}
176+
);
100177
});
101178

102179
describe("Errors with non existing Namespace", function (): void {

0 commit comments

Comments
 (0)