AffinityToken.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. }
  17. public AffinityToken(string queueIdentifier, int workerOrdinal)
  18. {
  19. Set(QueueIdentifier, workerOrdinal);
  20. }
  21. public AffinityToken(string affinityTokenComplex)
  22. {
  23. FromComplex(affinityTokenComplex);
  24. }
  25. public AffinityToken(AffinityToken affinityToken)
  26. {
  27. if (affinityToken == null) throw new ArgumentNullException(nameof(affinityToken));
  28. QueueIdentifier = affinityToken.QueueIdentifier;
  29. WorkerOrdinal = affinityToken.WorkerOrdinal;
  30. }
  31. #endregion
  32. #region *** Public Operations ***
  33. public void FromComplex(string affinityTokenComplex)
  34. {
  35. if (string.IsNullOrEmpty(affinityTokenComplex)) throw new ArgumentNullException(nameof(affinityTokenComplex));;
  36. var parts = affinityTokenComplex.Split(CCH_AT_SEP, StringSplitOptions.RemoveEmptyEntries);
  37. if (parts.Length!=2) throw new ArgumentOutOfRangeException(nameof(affinityTokenComplex),$"Invalid format of affinity complex token value '{affinityTokenComplex}'.");
  38. QueueIdentifier = parts[0];
  39. WorkerOrdinal = int.Parse(parts[1]);
  40. }
  41. public void Set(string queueIdentifier, int workerOrdinal)
  42. {
  43. if (string.IsNullOrEmpty(queueIdentifier)) throw new ArgumentNullException(nameof(queueIdentifier));
  44. QueueIdentifier = queueIdentifier;
  45. WorkerOrdinal = workerOrdinal;
  46. }
  47. public override string ToString()
  48. {
  49. var sb = new StringBuilder();
  50. if (!(string.IsNullOrEmpty(QueueIdentifier) || WorkerOrdinal == null))
  51. {
  52. sb.Append(QueueIdentifier).Append(CCH_AT_SEP).Append(WorkerOrdinal.Value);
  53. }
  54. return sb.ToString();
  55. }
  56. public bool Equals (AffinityToken other)
  57. {
  58. if (other == null) return false;
  59. return string.Equals(ToString(), other.ToString());
  60. }
  61. #endregion
  62. }