Skip to content

Commit b949521

Browse files
committed
Add MessageEditedAndRetried event
1 parent d769155 commit b949521

File tree

5 files changed

+50
-15
lines changed

5 files changed

+50
-15
lines changed

src/ServiceControl.AcceptanceTests/Recoverability/ExternalIntegration/When_a_failed_msg_is_resolved_by_edit.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public async Task Should_publish_notification()
2626
.WithEndpoint<MessageReceiver>(b => b.When(async (bus, c) =>
2727
{
2828
await bus.Subscribe<MessageFailureResolvedByRetry>();
29+
await bus.Subscribe<MessageEditedAndRetried>();
2930

3031
if (c.HasNativePubSubSupport)
3132
{
@@ -77,7 +78,7 @@ public async Task Should_publish_notification()
7778
return false;
7879
}
7980

80-
if (!ctx.MessageResolved)
81+
if (!ctx.MessageResolved || !ctx.MessageEdited)
8182
{
8283
return false;
8384
}
@@ -103,15 +104,17 @@ class EditMessageResolutionContext : ScenarioContext
103104
public bool MessageResolved { get; set; }
104105
public string EditedMessageEditOf { get; set; }
105106
public bool ExternalProcessorSubscribed { get; set; }
106-
107+
public string EditId { get; set; }
108+
public bool MessageEdited { get; set; }
107109
}
108110

109111
class MessageReceiver : EndpointConfigurationBuilder
110112
{
111113
public MessageReceiver() => EndpointSetup<DefaultServerWithoutAudit>(c => c.NoRetries());
112114

113-
class EditMessageResolutionHandler(EditMessageResolutionContext testContext)
114-
: IHandleMessages<EditResolutionMessage>, IHandleMessages<MessageFailureResolvedByRetry>
115+
class EditMessageResolutionHandler(EditMessageResolutionContext testContext) : IHandleMessages<EditResolutionMessage>,
116+
IHandleMessages<MessageFailureResolvedByRetry>,
117+
IHandleMessages<MessageEditedAndRetried>
115118
{
116119
public Task Handle(EditResolutionMessage message, IMessageHandlerContext context)
117120
{
@@ -132,6 +135,14 @@ public Task Handle(MessageFailureResolvedByRetry message, IMessageHandlerContext
132135
testContext.MessageResolved = true;
133136
return Task.CompletedTask;
134137
}
138+
139+
public Task Handle(MessageEditedAndRetried message, IMessageHandlerContext context)
140+
{
141+
testContext.ResolvedMessageId = message.FailedMessageId;
142+
testContext.EditId = message.EditId;
143+
testContext.MessageEdited = true;
144+
return Task.CompletedTask;
145+
}
135146
}
136147
}
137148

src/ServiceControl/Contracts/MessageFailures/MessageEditedAndRetried.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ public class MessageEditedAndRetried : IDomainEvent
1313
//TODO: Move this to ServiceControl.Contracts package
1414
namespace ServiceControl.Contracts
1515
{
16-
public class MessageEditedAndRetried
16+
using NServiceBus;
17+
18+
public class MessageEditedAndRetried : IEvent //TODO: Remove interface when moving to contracts package. Needed for conventions
1719
{
1820
public string FailedMessageId { get; set; }
1921
public string RetriedMessageId { get; set; }

src/ServiceControl/Recoverability/Editing/EditHandler.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using System;
44
using System.Linq;
55
using System.Threading.Tasks;
6+
using Contracts.MessageFailures;
7+
using Infrastructure.DomainEvents;
68
using MessageFailures;
79
using Microsoft.Extensions.Logging;
810
using NServiceBus;
@@ -14,12 +16,13 @@
1416

1517
class EditHandler : IHandleMessages<EditAndSend>
1618
{
17-
public EditHandler(IErrorMessageDataStore store, IMessageRedirectsDataStore redirectsStore, IMessageDispatcher dispatcher, ErrorQueueNameCache errorQueueNameCache, ILogger<EditHandler> logger)
19+
public EditHandler(IErrorMessageDataStore store, IMessageRedirectsDataStore redirectsStore, IMessageDispatcher dispatcher, ErrorQueueNameCache errorQueueNameCache, IDomainEvents domainEvents, ILogger<EditHandler> logger)
1820
{
1921
this.store = store;
2022
this.redirectsStore = redirectsStore;
2123
this.dispatcher = dispatcher;
2224
this.errorQueueNameCache = errorQueueNameCache;
25+
this.domainEvents = domainEvents;
2326
this.logger = logger;
2427
corruptedReplyToHeaderStrategy = new CorruptedReplyToHeaderStrategy(RuntimeEnvironment.MachineName, logger);
2528

@@ -29,6 +32,7 @@ public async Task Handle(EditAndSend message, IMessageHandlerContext context)
2932
{
3033
string editRequestIdentifier = context.MessageId;
3134
FailedMessage failedMessage;
35+
string editId;
3236
using (var session = await store.CreateEditFailedMessageManager())
3337
{
3438
failedMessage = await session.GetFailedMessage(message.FailedMessageId);
@@ -39,7 +43,7 @@ public async Task Handle(EditAndSend message, IMessageHandlerContext context)
3943
return;
4044
}
4145

42-
var editId = await session.GetCurrentEditingRequestId(message.FailedMessageId);
46+
editId = await session.GetCurrentEditingRequestId(message.FailedMessageId);
4347
if (editId == null)
4448
{
4549
if (failedMessage.Status != FailedMessageStatus.Unresolved)
@@ -64,6 +68,8 @@ public async Task Handle(EditAndSend message, IMessageHandlerContext context)
6468
await session.SaveChanges();
6569
}
6670

71+
72+
6773
var redirects = await redirectsStore.GetOrCreate();
6874

6975
var attempt = failedMessage.ProcessingAttempts.Last();
@@ -82,6 +88,13 @@ public async Task Handle(EditAndSend message, IMessageHandlerContext context)
8288
address = retryTo;
8389
}
8490
await DispatchEditedMessage(outgoingMessage, address, context);
91+
92+
await domainEvents.Raise(new MessageEditedAndRetried
93+
{
94+
EditId = editId,
95+
FailedMessageId = message.FailedMessageId,
96+
RetriedMessageId = outgoingMessage.MessageId
97+
}, context.CancellationToken);
8598
}
8699

87100
OutgoingMessage BuildMessage(EditAndSend message)
@@ -123,6 +136,7 @@ Task DispatchEditedMessage(OutgoingMessage editedMessage, string address, IMessa
123136
readonly IMessageRedirectsDataStore redirectsStore;
124137
readonly IMessageDispatcher dispatcher;
125138
readonly ErrorQueueNameCache errorQueueNameCache;
139+
readonly IDomainEvents domainEvents;
126140
readonly ILogger<EditHandler> logger;
127141
}
128142
}

src/ServiceControl/Recoverability/ExternalIntegration/MessageEditedAndRetriedPublisher.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
namespace ServiceControl.Recoverability.ExternalIntegration;
22

33
using System.Collections.Generic;
4+
using System.Linq;
45
using System.Threading.Tasks;
56
using Contracts.MessageFailures;
67
using ExternalIntegrations;
78

89
class MessageEditedAndRetriedPublisher : EventPublisher<MessageEditedAndRetried,
910
MessageEditedAndRetriedPublisher.DispatchContext>
1011
{
11-
protected override DispatchContext CreateDispatchRequest(MessageEditedAndRetried @event)
12-
{
13-
throw new System.NotImplementedException();
14-
}
12+
protected override DispatchContext CreateDispatchRequest(MessageEditedAndRetried @event) =>
13+
new()
14+
{
15+
EditId = @event.EditId,
16+
FailedMessageId = @event.FailedMessageId,
17+
RetriedMessageId = @event.FailedMessageId
18+
};
1519

16-
protected override Task<IEnumerable<object>> PublishEvents(IEnumerable<DispatchContext> contexts)
17-
{
18-
throw new System.NotImplementedException();
19-
}
20+
protected override Task<IEnumerable<object>> PublishEvents(IEnumerable<DispatchContext> contexts) =>
21+
Task.FromResult(contexts.Select(x => (object)new Contracts.MessageEditedAndRetried
22+
{
23+
EditId = x.EditId,
24+
FailedMessageId = x.FailedMessageId,
25+
RetriedMessageId = x.RetriedMessageId
26+
}));
2027

2128
public class DispatchContext
2229
{

src/ServiceControl/Recoverability/RecoverabilityComponent.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public override void Configure(Settings settings, ITransportCustomization transp
8787
services.AddIntegrationEventPublisher<MessageFailedPublisher>();
8888
services.AddIntegrationEventPublisher<MessageFailureResolvedByRetryPublisher>();
8989
services.AddIntegrationEventPublisher<MessageFailureResolvedManuallyPublisher>();
90+
services.AddIntegrationEventPublisher<MessageEditedAndRetriedPublisher>();
9091

9192
//Event log
9293
services.AddEventLogMapping<FailedMessageArchivedDefinition>();

0 commit comments

Comments
 (0)