|
6 | 6 | using System.Linq;
|
7 | 7 | using System.Threading.Tasks;
|
8 | 8 | using System.Windows.Input;
|
| 9 | + using Anotar.Serilog; |
9 | 10 | using Autofac;
|
10 | 11 | using Caliburn.Micro;
|
11 | 12 | using Mindscape.WpfDiagramming;
|
@@ -259,18 +260,44 @@ void LinkConversationNodes(IEnumerable<MessageNode> relatedMessagesTask)
|
259 | 260 | {
|
260 | 261 | foreach (var msg in relatedMessagesTask)
|
261 | 262 | {
|
262 |
| - if (msg.Message.RelatedToMessageId == null && |
263 |
| - msg.Message.RelatedToMessageId != msg.Message.MessageId) |
| 263 | + if (string.IsNullOrEmpty(msg.Message.RelatedToMessageId) && msg.Message.RelatedToMessageId != msg.Message.MessageId) |
264 | 264 | {
|
265 | 265 | continue;
|
266 | 266 | }
|
267 | 267 |
|
268 |
| - // [CM] I don't know how it's happening, but a user reported an |
269 |
| - // error where multiple results were returned from this query. |
270 | 268 | var parentMessages = nodeMap.Values.Where(m =>
|
271 |
| - m.Message != null && m.Message.ReceivingEndpoint != null && m.Message.SendingEndpoint != null && |
272 |
| - m.Message.MessageId == msg.Message.RelatedToMessageId && |
273 |
| - m.Message.ReceivingEndpoint.Name == msg.Message.SendingEndpoint.Name); |
| 269 | + m.Message != null && m.Message.ReceivingEndpoint != null && m.Message.SendingEndpoint != null |
| 270 | + && m.Message.MessageId == msg.Message.RelatedToMessageId |
| 271 | + && m.Message.ReceivingEndpoint.Name == msg.Message.SendingEndpoint.Name // Needed with publishes as identical events can be consumed by multiple endpoints |
| 272 | + ) |
| 273 | + .ToArray(); |
| 274 | + |
| 275 | + // Fallback, get "parent" when originating message is not an event (publish) |
| 276 | + if (!parentMessages.Any()) |
| 277 | + { |
| 278 | + parentMessages = nodeMap.Values.Where(m => |
| 279 | + m.Message != null && m.Message.ReceivingEndpoint != null && m.Message.SendingEndpoint != null && |
| 280 | + m.Message.MessageId == msg.Message.RelatedToMessageId && m.Message.MessageIntent != MessageIntent.Publish |
| 281 | + ).ToArray(); |
| 282 | + |
| 283 | + if (parentMessages.Any()) |
| 284 | + { |
| 285 | + LogTo.Warning("Fall back to match only on RelatedToMessageId for message with Id '{MessageId}' matched but link could be invalid.", msg.Message.MessageId); |
| 286 | + } |
| 287 | + } |
| 288 | + |
| 289 | + switch (parentMessages.Length) |
| 290 | + { |
| 291 | + case 0: |
| 292 | + LogTo.Information("No parent could be resolved for the message with Id '{MessageId}' which has RelatedToMessageId set. This can happen if the parent has been purged due to retention expiration, an ServiceControl node to be unavailable, or because the parent message not been stored (yet).", msg.Message.MessageId); |
| 293 | + break; |
| 294 | + case 1: |
| 295 | + // Log nothing, this is what it should be |
| 296 | + break; |
| 297 | + default: |
| 298 | + LogTo.Error("Multiple parents matched for message id '{MessageId}' possibly due to more-than-once processing, linking to all as it is unknown which processing attempt generated the message.", msg.Message.MessageId); |
| 299 | + break; |
| 300 | + } |
274 | 301 |
|
275 | 302 | foreach (var parentMessage in parentMessages)
|
276 | 303 | {
|
|
0 commit comments