[CHANGE] Service extended and events
This commit is contained in:
@@ -6,6 +6,7 @@ public class CircularBuffer <T>
|
||||
{
|
||||
private readonly T[] _buffer;
|
||||
private readonly Channel<T> _channel;
|
||||
private readonly object _lock = new();
|
||||
|
||||
public int Capacity { get; }
|
||||
public int Head { get; private set; }
|
||||
@@ -30,14 +31,17 @@ public class CircularBuffer <T>
|
||||
|
||||
public void Add(T item)
|
||||
{
|
||||
_buffer[Head] = item;
|
||||
Head = (Head + 1) % _buffer.Length;
|
||||
|
||||
if (Count < _buffer.Length)
|
||||
lock (_lock)
|
||||
{
|
||||
Count++;
|
||||
_buffer[Head] = item;
|
||||
Head = (Head + 1) % _buffer.Length;
|
||||
|
||||
if (Count < _buffer.Length)
|
||||
{
|
||||
Count++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
_channel.Writer.TryWrite(item);
|
||||
}
|
||||
|
||||
@@ -47,7 +51,10 @@ public class CircularBuffer <T>
|
||||
{
|
||||
for (var i = 0; i < Count; i++)
|
||||
{
|
||||
yield return _buffer[(Head - Count + i + _buffer.Length) % _buffer.Length];
|
||||
lock (_lock)
|
||||
{
|
||||
yield return _buffer[(Head - Count + i + _buffer.Length) % _buffer.Length];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -9,16 +9,18 @@ public abstract class ExtendedBackgroundService : BackgroundService
|
||||
private TaskCompletionSource _resumeSignal = new(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||
private readonly ILogger _logger;
|
||||
public ServiceState State { get; private set; } = ServiceState.Stopped;
|
||||
public CircularBuffer<ServiceProgress> ProgressLog { get; } = new(500);
|
||||
public CircularBuffer<ServiceEvent> ProgressEvents { get; } = new(500);
|
||||
public string Name { get; }
|
||||
public string Description { get; set; }
|
||||
public TimeSpan ExecuteInterval { get; set; }
|
||||
|
||||
public ExtendedBackgroundService(string name, ILogger logger, BackgroundServiceManager manager, TimeSpan? executeInterval = null)
|
||||
public ExtendedBackgroundService(string name, string description, ILogger logger, BackgroundServiceManager manager, TimeSpan? executeInterval = null)
|
||||
{
|
||||
Name = name;
|
||||
Description = description;
|
||||
_logger = logger;
|
||||
manager.RegisterService(this);
|
||||
ExecuteInterval = executeInterval ?? TimeSpan.Zero;
|
||||
ExecuteInterval = executeInterval ?? TimeSpan.FromMinutes(1);
|
||||
}
|
||||
|
||||
protected sealed override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
@@ -58,7 +60,7 @@ public abstract class ExtendedBackgroundService : BackgroundService
|
||||
}
|
||||
}
|
||||
|
||||
protected void LogProgress(string message, LogSeverity severity = LogSeverity.Info) => ProgressLog.Add(new ServiceProgress(message, DateTime.UtcNow, severity));
|
||||
protected void LogEvent(string message, LogSeverity severity = LogSeverity.Info) => ProgressEvents.Add(new ServiceEvent(Name, message, DateTime.UtcNow, severity));
|
||||
|
||||
public void Pause()
|
||||
{
|
||||
@@ -101,4 +103,4 @@ public enum ServiceState
|
||||
Paused
|
||||
}
|
||||
|
||||
public record ServiceProgress(string Message, DateTime StartTime, LogSeverity Severity);
|
||||
public record ServiceEvent(string Source, string Message, DateTime Date, LogSeverity Severity);
|
@@ -1,4 +1,5 @@
|
||||
using System.Net;
|
||||
using DotBased.Logging;
|
||||
using DotBased.Monads;
|
||||
using Manager.App.Models.Library;
|
||||
using Manager.Data.Entities.LibraryContext;
|
||||
@@ -6,7 +7,8 @@ using Manager.YouTube;
|
||||
|
||||
namespace Manager.App.Services.System;
|
||||
|
||||
public class ClientService(IServiceScopeFactory scopeFactory, ILogger<ClientService> logger, BackgroundServiceManager serviceManager) : ExtendedBackgroundService("ClientService", logger, serviceManager)
|
||||
public class ClientService(IServiceScopeFactory scopeFactory, ILogger<ClientService> logger, BackgroundServiceManager serviceManager)
|
||||
: ExtendedBackgroundService("ClientService", "Managing YouTube clients", logger, serviceManager, TimeSpan.FromMilliseconds(100))
|
||||
{
|
||||
private readonly List<YouTubeClient> _clients = [];
|
||||
private CancellationToken _cancellationToken;
|
||||
@@ -18,13 +20,15 @@ public class ClientService(IServiceScopeFactory scopeFactory, ILogger<ClientServ
|
||||
stoppingToken.Register(CancellationRequested);
|
||||
using var scope = scopeFactory.CreateScope();
|
||||
_libraryService = scope.ServiceProvider.GetRequiredService<ILibraryService>();
|
||||
LogProgress("Initializing service...");
|
||||
LogEvent("Initializing service...");
|
||||
Pause();
|
||||
}
|
||||
|
||||
protected override async Task ExecuteServiceAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
|
||||
LogEvent("Sending event...");
|
||||
LogEvent("Sending warning event...", LogSeverity.Warning);
|
||||
LogEvent("Sending error event...", LogSeverity.Error);
|
||||
}
|
||||
|
||||
private void CancellationRequested()
|
||||
|
Reference in New Issue
Block a user