AffinityToken.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System.Text;
  2. namespace Quadarax.Foundation.Core.Business.Processor.Task;
  3. public class AffinityToken : IAffinityToken
  4. {
  5. #region *** Constants ***
  6. // ReSharper disable once InconsistentNaming
  7. public const char CCH_AT_SEP = '#';
  8. #endregion
  9. #region *** Public properties ***
  10. public string QueueIdentifier {get; private set;}
  11. public int? WorkerOrdinal {get; private set;}
  12. #endregion
  13. #region *** Constructor ***
  14. public AffinityToken()
  15. {
  16. QueueIdentifier = string.Empty;
  17. }
  18. public AffinityToken(string queueIdentifier, int workerOrdinal) : this()
  19. {
  20. Set(queueIdentifier, workerOrdinal);
  21. }
  22. public AffinityToken(string affinityTokenComplex) : this()
  23. {
  24. FromComplex(affinityTokenComplex);
  25. }
  26. public AffinityToken(AffinityToken affinityToken)
  27. {
  28. if (affinityToken == null) throw new ArgumentNullException(nameof(affinityToken));
  29. QueueIdentifier = affinityToken.QueueIdentifier;
  30. WorkerOrdinal = affinityToken.WorkerOrdinal;
  31. }
  32. #endregion
  33. #region *** Public Operations ***
  34. public void FromComplex(string affinityTokenComplex)
  35. {
  36. if (string.IsNullOrEmpty(affinityTokenComplex)) throw new ArgumentNullException(nameof(affinityTokenComplex));;
  37. var parts = affinityTokenComplex.Split(CCH_AT_SEP, StringSplitOptions.RemoveEmptyEntries);
  38. if (parts.Length!=2) throw new ArgumentOutOfRangeException(nameof(affinityTokenComplex),$"Invalid format of affinity complex token value '{affinityTokenComplex}'.");
  39. QueueIdentifier = parts[0];
  40. WorkerOrdinal = int.Parse(parts[1]);
  41. }
  42. public void Set(string? queueIdentifier, int workerOrdinal)
  43. {
  44. if (string.IsNullOrEmpty(queueIdentifier)) throw new ArgumentNullException(nameof(queueIdentifier));
  45. QueueIdentifier = queueIdentifier;
  46. WorkerOrdinal = workerOrdinal;
  47. }
  48. public override string ToString()
  49. {
  50. var sb = new StringBuilder();
  51. if (!(string.IsNullOrEmpty(QueueIdentifier) || WorkerOrdinal == null))
  52. {
  53. sb.Append(QueueIdentifier).Append(CCH_AT_SEP).Append(WorkerOrdinal.Value);
  54. }
  55. return sb.ToString();
  56. }
  57. public bool Equals (AffinityToken? other)
  58. {
  59. if (other == null) return false;
  60. return string.Equals(ToString(), other.ToString());
  61. }
  62. #endregion
  63. }