/src/MassTransit.RabbitMqTransport/Configuration/RabbitMqReceiveEndpointConfigurator.cs

http://github.com/phatboyg/MassTransit · C# · 235 lines · 176 code · 47 blank · 12 comment · 10 complexity · 3ef0493350e9c6d0a52a49841c518122 MD5 · raw file

  1. // Copyright 2007-2015 Chris Patterson, Dru Sellers, Travis Smith, et. al.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License"); you may not use
  4. // this file except in compliance with the License. You may obtain a copy of the
  5. // License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software distributed
  10. // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  11. // CONDITIONS OF ANY KIND, either express or implied. See the License for the
  12. // specific language governing permissions and limitations under the License.
  13. namespace MassTransit.RabbitMqTransport.Configuration
  14. {
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Linq;
  18. using Builders;
  19. using EndpointConfigurators;
  20. using Management;
  21. using MassTransit.Builders;
  22. using MassTransit.Configurators;
  23. using MassTransit.Pipeline;
  24. using MassTransit.Pipeline.Pipes;
  25. using Topology;
  26. using Transports;
  27. using Util;
  28. public class RabbitMqReceiveEndpointConfigurator :
  29. ReceiveEndpointConfigurator,
  30. IRabbitMqReceiveEndpointConfigurator,
  31. IBusFactorySpecification
  32. {
  33. readonly IRabbitMqHost _host;
  34. readonly IManagementPipe _managementPipe;
  35. readonly RabbitMqReceiveSettings _settings;
  36. readonly List<ExchangeBindingSettings> _exchangeBindings;
  37. bool _bindMessageExchanges;
  38. public RabbitMqReceiveEndpointConfigurator(IRabbitMqHost host, string queueName = null, IConsumePipe consumePipe = null)
  39. : base(consumePipe)
  40. {
  41. _host = host;
  42. _bindMessageExchanges = true;
  43. _settings = new RabbitMqReceiveSettings
  44. {
  45. QueueName = queueName,
  46. };
  47. _managementPipe = new ManagementPipe();
  48. _exchangeBindings = new List<ExchangeBindingSettings>();
  49. }
  50. public RabbitMqReceiveEndpointConfigurator(IRabbitMqHost host, RabbitMqReceiveSettings settings, IConsumePipe consumePipe)
  51. : base(consumePipe)
  52. {
  53. _host = host;
  54. _settings = settings;
  55. _managementPipe = new ManagementPipe();
  56. _exchangeBindings = new List<ExchangeBindingSettings>();
  57. }
  58. public override IEnumerable<ValidationResult> Validate()
  59. {
  60. foreach (ValidationResult result in base.Validate())
  61. yield return result.WithParentKey($"{_settings.QueueName}");
  62. if (!RabbitMqAddressExtensions.IsValidQueueName(_settings.QueueName))
  63. yield return this.Failure($"{_settings.QueueName}", "Is not a valid queue name");
  64. if (_settings.PurgeOnStartup)
  65. yield return this.Warning($"{_settings.QueueName}", "Existing messages in the queue will be purged on service start");
  66. }
  67. public void Apply(IBusBuilder builder)
  68. {
  69. RabbitMqReceiveEndpointBuilder endpointBuilder = null;
  70. var receivePipe = CreateReceivePipe(builder, consumePipe =>
  71. {
  72. endpointBuilder = new RabbitMqReceiveEndpointBuilder(consumePipe, _host.Settings.MessageNameFormatter, _bindMessageExchanges);
  73. endpointBuilder.AddExchangeBindings(_exchangeBindings.ToArray());
  74. return endpointBuilder;
  75. });
  76. if (endpointBuilder == null)
  77. throw new InvalidOperationException("The endpoint builder was not initialized");
  78. var transport = new RabbitMqReceiveTransport(_host, _settings, _managementPipe, endpointBuilder.GetExchangeBindings().ToArray());
  79. builder.AddReceiveEndpoint(_settings.QueueName ?? NewId.Next().ToString(), new ReceiveEndpoint(transport, receivePipe));
  80. }
  81. public bool Durable
  82. {
  83. set
  84. {
  85. _settings.Durable = value;
  86. Changed("Durable");
  87. }
  88. }
  89. public bool Exclusive
  90. {
  91. set
  92. {
  93. _settings.Exclusive = value;
  94. Changed("Exclusive");
  95. }
  96. }
  97. public bool AutoDelete
  98. {
  99. set
  100. {
  101. _settings.AutoDelete = value;
  102. Changed("AutoDelete");
  103. }
  104. }
  105. public string ExchangeType
  106. {
  107. set { _settings.ExchangeType = value; }
  108. }
  109. public bool PurgeOnStartup
  110. {
  111. set { _settings.PurgeOnStartup = value; }
  112. }
  113. public ushort PrefetchCount
  114. {
  115. set
  116. {
  117. _settings.PrefetchCount = value;
  118. Changed("PrefetchCount");
  119. }
  120. }
  121. public bool Lazy
  122. {
  123. set { SetQueueArgument("x-queue-mode", value ? "lazy" : "default"); }
  124. }
  125. public bool BindMessageExchanges
  126. {
  127. set { _bindMessageExchanges = value; }
  128. }
  129. public void SetQueueArgument(string key, object value)
  130. {
  131. _settings.SetQueueArgument(key, value);
  132. }
  133. public void SetExchangeArgument(string key, object value)
  134. {
  135. _settings.SetExchangeArgument(key, value);
  136. }
  137. public void EnablePriority(byte maxPriority)
  138. {
  139. _settings.EnablePriority(maxPriority);
  140. }
  141. public void ConnectManagementEndpoint(IManagementEndpointConfigurator management)
  142. {
  143. var consumer = new SetPrefetchCountManagementConsumer(_managementPipe, _settings.QueueName);
  144. management.Instance(consumer);
  145. }
  146. public void Bind(string exchangeName)
  147. {
  148. if (exchangeName == null)
  149. throw new ArgumentNullException(nameof(exchangeName));
  150. _exchangeBindings.AddRange(_settings.GetExchangeBindings(exchangeName));
  151. }
  152. public void Bind<T>()
  153. where T : class
  154. {
  155. _exchangeBindings.AddRange(typeof(T).GetExchangeBindings(_host.Settings.MessageNameFormatter));
  156. }
  157. public void Bind(string exchangeName, Action<IExchangeBindingConfigurator> callback)
  158. {
  159. if (exchangeName == null)
  160. throw new ArgumentNullException(nameof(exchangeName));
  161. if (callback == null)
  162. throw new ArgumentNullException(nameof(callback));
  163. var exchangeSettings = new RabbitMqReceiveSettings(_settings);
  164. callback(exchangeSettings);
  165. _exchangeBindings.AddRange(exchangeSettings.GetExchangeBindings(exchangeName));
  166. }
  167. protected override Uri GetInputAddress()
  168. {
  169. return _host.Settings.GetInputAddress(_settings);
  170. }
  171. protected override Uri GetErrorAddress()
  172. {
  173. string errorQueueName = _settings.QueueName + "_error";
  174. var sendSettings = new RabbitMqSendSettings(errorQueueName, RabbitMQ.Client.ExchangeType.Fanout, _settings.Durable,
  175. _settings.AutoDelete);
  176. sendSettings.BindToQueue(errorQueueName);
  177. return _host.Settings.GetSendAddress(sendSettings);
  178. }
  179. protected override Uri GetDeadLetterAddress()
  180. {
  181. string errorQueueName = _settings.QueueName + "_skipped";
  182. var sendSettings = new RabbitMqSendSettings(errorQueueName, RabbitMQ.Client.ExchangeType.Fanout, _settings.Durable,
  183. _settings.AutoDelete);
  184. sendSettings.BindToQueue(errorQueueName);
  185. return _host.Settings.GetSendAddress(sendSettings);
  186. }
  187. }
  188. }