feat: explicit queue client, resolve handler avoiding type registry
This commit is contained in:
@@ -7,7 +7,9 @@ namespace InServiceQue.InMemory;
|
||||
|
||||
public class TaskRepositoryInMemory: ITaskRepository
|
||||
{
|
||||
private static ConcurrentQueue<QueueTask> _que = new();
|
||||
//todo: concurrent access here
|
||||
private static int _currentShard;
|
||||
private static ConcurrentDictionary<string, ConcurrentQueue<QueueTask>> _quesByType = new();
|
||||
public void Dispose()
|
||||
{
|
||||
// TODO release managed resources here
|
||||
@@ -15,11 +17,22 @@ public class TaskRepositoryInMemory: ITaskRepository
|
||||
|
||||
public void Insert(QueueTask task)
|
||||
{
|
||||
_que.Enqueue(task);
|
||||
if (_quesByType.ContainsKey(task.TaskType))
|
||||
{
|
||||
_quesByType.AddOrUpdate(task.TaskType,
|
||||
(t) => new ConcurrentQueue<QueueTask>(new[] { task }),
|
||||
(t, queue) =>
|
||||
{
|
||||
queue.Enqueue(task);
|
||||
return queue;
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task InsertAsync(QueueTask task)
|
||||
{
|
||||
|
||||
Insert(task);
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
@@ -54,19 +67,60 @@ public class TaskRepositoryInMemory: ITaskRepository
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
public QueueTask? GetNextTask(IDbTransaction tx)
|
||||
public QueueTask? GetNextTask(IDbTransaction tx, string? taskType = null)
|
||||
{
|
||||
QueueTask? task;
|
||||
_que.TryDequeue(out task);
|
||||
if (taskType == null)
|
||||
return GetNextTaskRolling();
|
||||
|
||||
QueueTask? task = null;
|
||||
if (_quesByType.TryGetValue(taskType, out var que))
|
||||
{
|
||||
que.TryDequeue(out task);
|
||||
}
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
public async Task<QueueTask?> GetNextTaskAsync(IDbTransaction tx)
|
||||
public QueueTask? GetNextTaskRolling()
|
||||
{
|
||||
QueueTask? task = null;
|
||||
_que.TryDequeue(out task);
|
||||
var topicsCount = _quesByType.Count;
|
||||
for (int i = 0; i < topicsCount; i++)
|
||||
{
|
||||
//todo: concurrent access
|
||||
if (i == _currentShard)
|
||||
{
|
||||
var keyValuePair = _quesByType.ToArray()[i];
|
||||
var que = keyValuePair.Value;
|
||||
que.TryDequeue(out task);
|
||||
|
||||
if (que.IsEmpty)
|
||||
{
|
||||
_quesByType.TryRemove(keyValuePair);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
//todo: concurrent access
|
||||
_currentShard = _currentShard == topicsCount - 1 ? 0 : _currentShard + 1;
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public async Task<QueueTask?> GetNextTaskAsync(IDbTransaction tx, string? taskType = null)
|
||||
{
|
||||
if (taskType == null)
|
||||
return await Task.FromResult(GetNextTaskRolling());
|
||||
|
||||
QueueTask? task = null;
|
||||
if (_quesByType.TryGetValue(taskType, out var que))
|
||||
{
|
||||
que.TryDequeue(out task);
|
||||
}
|
||||
|
||||
return await Task.FromResult(task);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user