Skip to content

Commit 2f885ce

Browse files
Ensure RabbitMQ WithDataVolume/WithDataBindMount methods actually enable persistent storage (#3152) (#3186)
* Use stable node name for RabbitMQ resources * Update TestShop to use durable messages Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
1 parent 60dcf90 commit 2f885ce

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

playground/TestShop/AppHost/Program.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
.WithReference(catalogDb)
1313
.WithReplicas(2);
1414

15-
var messaging = builder.AddRabbitMQ("messaging").PublishAsContainer();
15+
var rabbitMqPassword = builder.AddParameter("rabbitmq-password", secret: true);
16+
var messaging = builder.AddRabbitMQ("messaging", password: rabbitMqPassword)
17+
.WithDataVolume()
18+
.PublishAsContainer();
1619

1720
var basketService = builder.AddProject("basketservice", @"..\BasketService\BasketService.csproj")
1821
.WithReference(basketCache)

playground/TestShop/BasketService/BasketService.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,14 @@ public override async Task<CheckoutCustomerBasketResponse> CheckoutBasket(Checko
7676
}
7777

7878
using var channel = _messageConnection.CreateModel();
79-
channel.QueueDeclare(queueName, exclusive: false);
79+
channel.QueueDeclare(queueName, durable: true, exclusive: false);
80+
81+
var props = channel.CreateBasicProperties();
82+
props.Persistent = true; // or props.DeliveryMode = 2;
8083
channel.BasicPublish(
8184
exchange: "",
8285
routingKey: queueName,
83-
basicProperties: null,
86+
basicProperties: props,
8487
body: JsonSerializer.SerializeToUtf8Bytes(order));
8588
}
8689

playground/TestShop/OrderProcessor/OrderProcessingWorker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ protected override Task ExecuteAsync(CancellationToken stoppingToken)
3131
_messageConnection = _serviceProvider.GetRequiredService<IConnection>();
3232

3333
_messageChannel = _messageConnection.CreateModel();
34-
_messageChannel.QueueDeclare(queueName, exclusive: false);
34+
_messageChannel.QueueDeclare(queueName, durable: true, exclusive: false);
3535

3636
var consumer = new EventingBasicConsumer(_messageChannel);
3737
consumer.Received += ProcessMessageAsync;

src/Aspire.Hosting.RabbitMQ/RabbitMQBuilderExtensions.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ public static IResourceBuilder<RabbitMQServerResource> AddRabbitMQ(this IDistrib
4848
/// <param name="isReadOnly">A flag that indicates if this is a read-only volume.</param>
4949
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
5050
public static IResourceBuilder<RabbitMQServerResource> WithDataVolume(this IResourceBuilder<RabbitMQServerResource> builder, string? name = null, bool isReadOnly = false)
51-
=> builder.WithVolume(name ?? VolumeNameGenerator.CreateVolumeName(builder, "data"), "/var/lib/rabbitmq", isReadOnly);
51+
=> builder
52+
.WithVolume(name ?? VolumeNameGenerator.CreateVolumeName(builder, "data"), "/var/lib/rabbitmq", isReadOnly)
53+
.RunWithStableNodeName();
5254

5355
/// <summary>
5456
/// Adds a bind mount for the data folder to a RabbitMQ container resource.
@@ -58,5 +60,21 @@ public static IResourceBuilder<RabbitMQServerResource> WithDataVolume(this IReso
5860
/// <param name="isReadOnly">A flag that indicates if this is a read-only mount.</param>
5961
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
6062
public static IResourceBuilder<RabbitMQServerResource> WithDataBindMount(this IResourceBuilder<RabbitMQServerResource> builder, string source, bool isReadOnly = false)
61-
=> builder.WithBindMount(source, "/var/lib/rabbitmq", isReadOnly);
63+
=> builder.WithBindMount(source, "/var/lib/rabbitmq", isReadOnly)
64+
.RunWithStableNodeName();
65+
66+
private static IResourceBuilder<RabbitMQServerResource> RunWithStableNodeName(this IResourceBuilder<RabbitMQServerResource> builder)
67+
{
68+
if (builder.ApplicationBuilder.ExecutionContext.IsRunMode)
69+
{
70+
builder.WithEnvironment(context =>
71+
{
72+
// Set a stable node name so queue storage is consistent between sessions
73+
var nodeName = $"{builder.Resource.Name}@localhost";
74+
context.EnvironmentVariables["RABBITMQ_NODENAME"] = nodeName;
75+
});
76+
}
77+
78+
return builder;
79+
}
6280
}

0 commit comments

Comments
 (0)