Skip to content

Commit 51578dc

Browse files
authored
[ServiceBus] Fix bug in converting ServiceBusMessage to RheaMessage (Azure#22665)
when the `ServiceBusMessage` has `timeToLive` property set. The problem is that we are adding a number to a `Date` object, resulting in an invalid date value for `absolute_expiry_time`. This PR corrects it by calling `getTime()` on the `Date` object first before adding the ttl number. A unit test is added and the sendMessages sample is updated to show how to set `timeToLive`.
1 parent 2712ac2 commit 51578dc

File tree

6 files changed

+51
-3
lines changed

6 files changed

+51
-3
lines changed

sdk/servicebus/service-bus/CHANGELOG.md

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

1111
### Bugs Fixed
1212

13+
- Fix an invalid date issue when converting a `ServiceBusMessage` with `timeToLive` property set to a `RheaMessage`.
14+
1315
### Other Changes
1416

1517
- Updated our `@azure/core-tracing` dependency to the latest version (v1.0.0)

sdk/servicebus/service-bus/samples-dev/sendMessages.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ export async function main() {
7070
console.log(`Sending the last 5 scientists (as a ServiceBusMessageBatch)`);
7171
await sender.sendMessages(batch);
7272

73+
// Send a single message
74+
console.log(`Sending one scientists`);
75+
const message: ServiceBusMessage = {
76+
contentType: "application/json",
77+
subject: "Scientist",
78+
body: { firstName: "Albert", lastName: "Einstein" },
79+
timeToLive: 2 * 60 * 1000, // message expires in 2 minutes
80+
};
81+
await sender.sendMessages(message);
82+
7383
// Close the sender
7484
console.log(`Done sending, closing...`);
7585
await sender.close();

sdk/servicebus/service-bus/samples/v7/javascript/sendMessages.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
const { ServiceBusClient } = require("@azure/service-bus");
1717

1818
// Load the .env file if it exists
19-
const dotenv = require("dotenv");
20-
dotenv.config();
19+
require("dotenv").config();
2120

2221
// Define connection string and related Service Bus entity names here
2322
const connectionString = process.env.SERVICEBUS_CONNECTION_STRING || "<connection string>";
@@ -69,6 +68,16 @@ async function main() {
6968
console.log(`Sending the last 5 scientists (as a ServiceBusMessageBatch)`);
7069
await sender.sendMessages(batch);
7170

71+
// Send a single message
72+
console.log(`Sending one scientists`);
73+
const message = {
74+
contentType: "application/json",
75+
subject: "Scientist",
76+
body: { firstName: "Albert", lastName: "Einstein" },
77+
timeToLive: 2 * 60 * 1000, // message expires in 2 minutes
78+
};
79+
await sender.sendMessages(message);
80+
7281
// Close the sender
7382
console.log(`Done sending, closing...`);
7483
await sender.close();
@@ -81,3 +90,5 @@ main().catch((err) => {
8190
console.log("sendMessages Sample: Error occurred: ", err);
8291
process.exit(1);
8392
});
93+
94+
module.exports = { main };

sdk/servicebus/service-bus/samples/v7/typescript/src/sendMessages.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ export async function main() {
6969
console.log(`Sending the last 5 scientists (as a ServiceBusMessageBatch)`);
7070
await sender.sendMessages(batch);
7171

72+
// Send a single message
73+
console.log(`Sending one scientists`);
74+
const message: ServiceBusMessage = {
75+
contentType: "application/json",
76+
subject: "Scientist",
77+
body: { firstName: "Albert", lastName: "Einstein" },
78+
timeToLive: 2 * 60 * 1000, // message expires in 2 minutes
79+
};
80+
await sender.sendMessages(message);
81+
7282
// Close the sender
7383
console.log(`Done sending, closing...`);
7484
await sender.close();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ export function toRheaMessage(
327327
if (amqpMsg.ttl != null && amqpMsg.ttl !== Constants.maxDurationValue) {
328328
amqpMsg.creation_time = new Date();
329329
amqpMsg.absolute_expiry_time = new Date(
330-
Math.min(Constants.maxAbsoluteExpiryTime, (amqpMsg.creation_time as any) + amqpMsg.ttl)
330+
Math.min(Constants.maxAbsoluteExpiryTime, amqpMsg.creation_time.getTime() + amqpMsg.ttl)
331331
);
332332
}
333333

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,5 +174,20 @@ describe("AMQP message encoding", () => {
174174

175175
assert.equal(rheaMessage.body.typecode, valueSectionTypeCode);
176176
});
177+
178+
it("sets absolute_expiry_time when timeToLive is passed", () => {
179+
const ttl = 2 * 60 * 1000;
180+
const sbMessage: ServiceBusMessage = {
181+
body: "hello",
182+
timeToLive: ttl,
183+
};
184+
185+
const rheaMessage = toRheaMessage(sbMessage, defaultDataTransformer);
186+
assert.equal(rheaMessage.ttl, ttl);
187+
assert.ok(
188+
rheaMessage.absolute_expiry_time instanceof Date &&
189+
!isNaN(rheaMessage.absolute_expiry_time.getTime())
190+
);
191+
});
177192
});
178193
});

0 commit comments

Comments
 (0)