Queue.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Quadarax.Foundation.Core.Data.Extensions;
  5. using Quadarax.Foundation.Core.Logging;
  6. using Quadarax.Foundation.Core.Object;
  7. using Quadarax.Foundation.Core.Value.Extensions;
  8. namespace Quadarax.Foundation.Core.Business.ProcessQueue
  9. {
  10. public class Queue<TProvider> : DisposableObject where TProvider : IQueueProvider
  11. {
  12. private TProvider _provider;
  13. private IQLogger _logger;
  14. private IQLog _log;
  15. private string _queueName;
  16. private TimeSpan? _timeout;
  17. protected TProvider Provider => _provider;
  18. protected IQLogger Logger => _logger;
  19. public string Name => _queueName;
  20. protected IQLog Log => _log;
  21. public Queue(TProvider provider,string queueName, TimeSpan? initialTimeout, IQLogger logger)
  22. {
  23. _provider = provider ?? throw new ArgumentNullException(nameof(provider));
  24. if (string.IsNullOrEmpty(queueName)) throw new ArgumentNullException(nameof(queueName));
  25. _queueName = queueName;
  26. _timeout = initialTimeout;
  27. if (logger != null)
  28. {
  29. _logger = logger;
  30. _log = logger.GetLogger(GetType());
  31. }
  32. }
  33. public IEnumerable<IQueueItem> Fetch(int itemsCount)
  34. {
  35. if (!Provider.IsOpen)
  36. Provider.Open();
  37. var items = BuildFetchOrder(BuildFetchQuery(Provider.Query())).FirstPage(itemsCount).ToArray();
  38. foreach (var item in items) item.Assign(Name);
  39. Provider.UpdateAndCommit(items);
  40. return items;
  41. }
  42. protected virtual IQueryable<IQueueItem> BuildFetchQuery(IQueryable<IQueueItem> query)
  43. {
  44. var now = DateTime.Now;
  45. return query.Where(x => x.State.In(QueueItemStateEnum.New, QueueItemStateEnum.Pending) &&
  46. x.StartFrom > now &&
  47. x.StartTo.GetValueOrDefault(now.AddHours(1)) < now && x.Affinity == null);
  48. }
  49. protected virtual IQueryable<IQueueItem> BuildFetchOrder(IQueryable<IQueueItem> query)
  50. {
  51. return query.OrderBy(x => x.Priority).ThenBy(x => x.StartFrom);
  52. }
  53. protected override void OnDisposing()
  54. {
  55. }
  56. }
  57. }