♻️ Refactor NATS message handling
This commit is contained in:
		@@ -3,6 +3,7 @@ using DysonNetwork.Pusher.Email;
 | 
				
			|||||||
using DysonNetwork.Pusher.Notification;
 | 
					using DysonNetwork.Pusher.Notification;
 | 
				
			||||||
using DysonNetwork.Shared.Proto;
 | 
					using DysonNetwork.Shared.Proto;
 | 
				
			||||||
using DysonNetwork.Shared.Registry;
 | 
					using DysonNetwork.Shared.Registry;
 | 
				
			||||||
 | 
					using Google.Protobuf;
 | 
				
			||||||
using NATS.Client.Core;
 | 
					using NATS.Client.Core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace DysonNetwork.Pusher.Services;
 | 
					namespace DysonNetwork.Pusher.Services;
 | 
				
			||||||
@@ -36,14 +37,23 @@ public class QueueBackgroundService(
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        logger.LogInformation("Queue consumer started");
 | 
					        logger.LogInformation("Queue consumer started");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        await foreach (var msg in nats.SubscribeAsync<QueueMessage>(
 | 
					        await foreach (var msg in nats.SubscribeAsync<byte[]>(
 | 
				
			||||||
                           QueueName,
 | 
					                           QueueName,
 | 
				
			||||||
                           queueGroup: QueueGroup,
 | 
					                           queueGroup: QueueGroup,
 | 
				
			||||||
                           cancellationToken: stoppingToken))
 | 
					                           cancellationToken: stoppingToken))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                await ProcessMessageAsync(msg, stoppingToken);
 | 
					                var message = GrpcTypeHelper.ConvertByteStringToObject<QueueMessage>(ByteString.CopyFrom(msg.Data));
 | 
				
			||||||
 | 
					                if (message is not null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    await ProcessMessageAsync(msg, message, stoppingToken);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    await msg.ReplyAsync(cancellationToken: stoppingToken);
 | 
				
			||||||
 | 
					                    logger.LogWarning($"Invalid message format for {msg.Subject}");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
 | 
					            catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -59,10 +69,10 @@ public class QueueBackgroundService(
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private async ValueTask ProcessMessageAsync(NatsMsg<QueueMessage> msg, CancellationToken cancellationToken)
 | 
					    private async ValueTask ProcessMessageAsync(NatsMsg<byte[]> rawMsg, QueueMessage message,
 | 
				
			||||||
 | 
					        CancellationToken cancellationToken)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        using var scope = serviceProvider.CreateScope();
 | 
					        using var scope = serviceProvider.CreateScope();
 | 
				
			||||||
        var message = msg.Data;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        logger.LogDebug("Processing message of type {MessageType}", message.Type);
 | 
					        logger.LogDebug("Processing message of type {MessageType}", message.Type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -83,7 +93,7 @@ public class QueueBackgroundService(
 | 
				
			|||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            await msg.ReplyAsync();
 | 
					            await rawMsg.ReplyAsync(cancellationToken: cancellationToken);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        catch (Exception ex)
 | 
					        catch (Exception ex)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
using System.Text.Json;
 | 
					using System.Text.Json;
 | 
				
			||||||
 | 
					using DysonNetwork.Shared.Proto;
 | 
				
			||||||
using NATS.Client.Core;
 | 
					using NATS.Client.Core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace DysonNetwork.Pusher.Services;
 | 
					namespace DysonNetwork.Pusher.Services;
 | 
				
			||||||
@@ -20,7 +21,8 @@ public class QueueService(INatsConnection nats)
 | 
				
			|||||||
                Body = body
 | 
					                Body = body
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        await nats.PublishAsync(QueueName, message);
 | 
					        var rawMessage = GrpcTypeHelper.ConvertObjectToByteString(message).ToByteArray();
 | 
				
			||||||
 | 
					        await nats.PublishAsync(QueueName, rawMessage);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public async Task EnqueuePushNotification(Notification.Notification notification, Guid userId, bool isSavable = false)
 | 
					    public async Task EnqueuePushNotification(Notification.Notification notification, Guid userId, bool isSavable = false)
 | 
				
			||||||
@@ -34,8 +36,8 @@ public class QueueService(INatsConnection nats)
 | 
				
			|||||||
            TargetId = userId.ToString(),
 | 
					            TargetId = userId.ToString(),
 | 
				
			||||||
            Data = JsonSerializer.Serialize(notification)
 | 
					            Data = JsonSerializer.Serialize(notification)
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        
 | 
					        var rawMessage = GrpcTypeHelper.ConvertObjectToByteString(message).ToByteArray();
 | 
				
			||||||
        await nats.PublishAsync(QueueName, message);
 | 
					        await nats.PublishAsync(QueueName, rawMessage);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user