diff --git a/Directory.Build.props b/Directory.Build.props index 0841373d3..f5e37e1f8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -60,6 +60,10 @@ cobertura,json [*.Benchmarks]*,[*Sample*]*,[*Test*]*,[xunit.*]* + + + 0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7 + diff --git a/Directory.Packages.props b/Directory.Packages.props index ee1f7015e..39d61c9b7 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,9 +1,9 @@ - + - + @@ -11,7 +11,7 @@ - + @@ -19,14 +19,14 @@ + - - + diff --git a/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs b/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs index d9a8e61ae..55d22fbf3 100644 --- a/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs +++ b/samples/src/JustSaying.Sample.Restaurant.KitchenConsole/Program.cs @@ -97,7 +97,7 @@ static async Task Run() config.Publications(x => { // Creates the following if they do not already exist - // - a SNS topic of name `orderreadyevent` with two tags: + // - an SNS topic of name `orderreadyevent` with two tags: // - "IsOrderEvent" with no value // - "Publisher" with the value "KitchenConsole" x.WithTopic(cfg => diff --git a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs index a9d7c5af0..81d4a5862 100644 --- a/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs +++ b/src/JustSaying.Extensions.DependencyInjection.Microsoft/IServiceCollectionExtensions.cs @@ -5,6 +5,7 @@ using JustSaying.Fluent; using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware.Logging; @@ -139,16 +140,11 @@ public static IServiceCollection AddJustSaying(this IServiceCollection services, services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService()); services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService()); - services.TryAddSingleton(); + services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); - services.TryAddSingleton( - (p) => - { - var config = p.GetRequiredService(); - var serializerFactory = p.GetRequiredService(); - return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory); - }); + services.TryAddEnumerable(ServiceDescriptor.Singleton()); + services.TryAddSingleton(); services.TryAddSingleton(); diff --git a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs index 59be6c2df..df909488e 100644 --- a/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs +++ b/src/JustSaying.Extensions.DependencyInjection.StructureMap/JustSayingRegistry.cs @@ -2,6 +2,7 @@ using JustSaying.AwsTools.QueueCreation; using JustSaying.Fluent; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware.Logging; @@ -9,6 +10,7 @@ using JustSaying.Messaging.Monitoring; using JustSaying.Naming; using StructureMap; +using StructureMap.Pipeline; namespace JustSaying; @@ -33,7 +35,7 @@ public JustSayingRegistry() For().Use(context => context.GetInstance()).Singleton(); For().Use(context => context.GetInstance()).Singleton(); For().Use().Singleton(); - For().Use().Singleton(); + For().Use().Singleton(); For().Use().Singleton(); For().Use().Singleton(); @@ -43,18 +45,8 @@ public JustSayingRegistry() For().Transient(); For().Transient(); - - For() - .Use( - nameof(IMessageSerializationRegister), - (p) => - { - var config = p.GetInstance(); - var serializerFactory = p.GetInstance(); - return new MessageSerializationRegister(config.MessageSubjectProvider, serializerFactory); - }) - .Singleton(); - + For().Add().Singleton(); + For().Singleton(); For().Use().Singleton(); For().Singleton(); diff --git a/src/JustSaying/AwsTools/MessageAttributeKeys.cs b/src/JustSaying/AwsTools/MessageAttributeKeys.cs new file mode 100644 index 000000000..1370f7218 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageAttributeKeys.cs @@ -0,0 +1,12 @@ +namespace JustSaying.AwsTools; + +/// +/// Contains constant key values for message attributes. +/// +internal static class MessageAttributeKeys +{ + /// + /// Represents the key for the Content-Encoding attribute. + /// + public const string ContentEncoding = "Content-Encoding"; +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs new file mode 100644 index 000000000..6b26914af --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/Compression/PublishCompressionOptions.cs @@ -0,0 +1,26 @@ +using JustSaying.Messaging.Compression; + +namespace JustSaying.AwsTools.MessageHandling; + +/// +/// Represents options for message compression during publishing. +/// +public sealed class PublishCompressionOptions +{ + /// + /// Gets or sets the message length threshold in bytes. + /// Messages larger than this threshold will be compressed. + /// + /// + /// The default value is 260,096 bytes (254 KB), 2KB less than the SNS and SQS limit. + /// + public int MessageLengthThreshold { get; set; } = 254 * 1024; + + /// + /// Gets or sets the compression encoding to be used. + /// + /// + /// This should correspond to a registered compression algorithm in the . + /// + public string CompressionEncoding { get; set; } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/IMessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/IMessageDispatcher.cs index bb48f7f1b..f4353e422 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/IMessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/IMessageDispatcher.cs @@ -5,7 +5,7 @@ namespace JustSaying.AwsTools.MessageHandling.Dispatch; /// /// Dispatches messages to the queue. /// -public interface IMessageDispatcher +internal interface IMessageDispatcher { /// /// Dispatches the message in to the queue in the context. @@ -14,4 +14,4 @@ public interface IMessageDispatcher /// A to stop processing the message dispatch. /// A that completes once the message has been dispatched. Task DispatchMessageAsync(IQueueMessageContext messageContext, CancellationToken cancellationToken); -} \ No newline at end of file +} diff --git a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs index 83b6f5c27..f7e96a919 100644 --- a/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/Dispatch/MessageDispatcher.cs @@ -8,21 +8,18 @@ namespace JustSaying.AwsTools.MessageHandling.Dispatch; -public class MessageDispatcher : IMessageDispatcher +internal sealed class MessageDispatcher : IMessageDispatcher { - private readonly IMessageSerializationRegister _serializationRegister; private readonly IMessageMonitor _messagingMonitor; private readonly MiddlewareMap _middlewareMap; - private static ILogger _logger; + private readonly ILogger _logger; public MessageDispatcher( - IMessageSerializationRegister serializationRegister, IMessageMonitor messagingMonitor, MiddlewareMap middlewareMap, ILoggerFactory loggerFactory) { - _serializationRegister = serializationRegister; _messagingMonitor = messagingMonitor; _middlewareMap = middlewareMap; _logger = loggerFactory.CreateLogger("JustSaying"); @@ -42,6 +39,7 @@ public async Task DispatchMessageAsync( if (!success) { + _logger.LogTrace("DeserializeMessage failed. Message will not be dispatched."); return; } @@ -68,7 +66,6 @@ public async Task DispatchMessageAsync( await middleware.RunAsync(handleContext, null, cancellationToken) .ConfigureAwait(false); - } private async Task<(bool success, Message typedMessage, MessageAttributes attributes)> @@ -76,10 +73,11 @@ await middleware.RunAsync(handleContext, null, cancellationToken) { try { - _logger.LogDebug("Attempting to deserialize message with serialization register {Type}", - _serializationRegister.GetType().FullName); - var messageWithAttributes = _serializationRegister.DeserializeMessage(messageContext.Message.Body); - return (true, messageWithAttributes.Message, messageWithAttributes.MessageAttributes); + _logger.LogDebug("Attempting to deserialize message."); + + var (message, attributes) = await messageContext.MessageConverter.ConvertToInboundMessageAsync(messageContext.Message, cancellationToken); + + return (true, message, attributes); } catch (MessageFormatNotSupportedException ex) { @@ -93,6 +91,11 @@ await middleware.RunAsync(handleContext, null, cancellationToken) return (false, null, null); } + catch (OperationCanceledException) + { + // Ignore cancellation + return (false, null, null); + } catch (Exception ex) { _logger.LogError( diff --git a/src/JustSaying/AwsTools/MessageHandling/ForeignTopicArnProvider.cs b/src/JustSaying/AwsTools/MessageHandling/ForeignTopicArnProvider.cs index 40afe039d..1a36f393f 100644 --- a/src/JustSaying/AwsTools/MessageHandling/ForeignTopicArnProvider.cs +++ b/src/JustSaying/AwsTools/MessageHandling/ForeignTopicArnProvider.cs @@ -2,17 +2,10 @@ namespace JustSaying.AwsTools.MessageHandling; -internal class ForeignTopicArnProvider(RegionEndpoint regionEndpoint, string accountId, string topicName) : ITopicArnProvider +internal class ForeignTopicArnProvider(RegionEndpoint regionEndpoint, string accountId, string topicName) { - private readonly string _arn = $"arn:aws:sns:{regionEndpoint.SystemName}:{accountId}:{topicName}"; - public Task ArnExistsAsync() - { - // Assume foreign topics exist, we actually find out when we attempt to subscribe - return Task.FromResult(true); - } - public Task GetArnAsync() { return Task.FromResult(_arn); diff --git a/src/JustSaying/AwsTools/MessageHandling/IInboundMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IInboundMessageConverter.cs new file mode 100644 index 000000000..c175fb443 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/IInboundMessageConverter.cs @@ -0,0 +1,18 @@ +using JustSaying.Messaging.MessageSerialization; + +namespace JustSaying.Messaging; + +public interface IInboundMessageConverter +{ + /// + /// Converts an Amazon SQS message to a object. + /// + /// The Amazon SQS message to convert. + /// A token to monitor for cancellation requests. + /// A object containing the deserialized message body and attributes. + /// + /// This method handles the conversion of both raw SQS messages and SNS-wrapped messages. + /// It also applies any necessary decompression to the message body. + /// + ValueTask ConvertToInboundMessageAsync(Amazon.SQS.Model.Message message, CancellationToken cancellationToken = default); +} diff --git a/src/JustSaying/AwsTools/MessageHandling/IOutboundMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/IOutboundMessageConverter.cs new file mode 100644 index 000000000..cc20d09aa --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/IOutboundMessageConverter.cs @@ -0,0 +1,27 @@ +using JustSaying.Messaging.MessageSerialization; +using JustSaying.Models; + +namespace JustSaying.Messaging; + +public interface IOutboundMessageConverter +{ + /// + /// Converts a message to a format suitable for publishing, applying necessary transformations and compression. + /// + /// The original message to be converted. + /// Metadata associated with the publish operation, including any custom message attributes. + /// A token to monitor for cancellation requests. + /// A object containing the converted message body, attributes, and any additional publishing information. + /// + /// This method handles the following operations: + ///
    + ///
  • Serializes the message body
  • + ///
  • Adds custom message attributes
  • + ///
  • Applies compression to the message body if it meets specified criteria
  • + ///
  • Adds compression-related attributes if compression is applied
  • + ///
  • Prepares the message for SNS (if applicable) by setting the subject
  • + ///
+ /// The exact behavior may vary based on the destination type and compression options. + ///
+ ValueTask ConvertToOutboundMessageAsync(Message message, PublishMetadata publishMetadata, CancellationToken cancellationToken = default); +} diff --git a/src/JustSaying/AwsTools/MessageHandling/ISqsQueue.cs b/src/JustSaying/AwsTools/MessageHandling/ISqsQueue.cs index 97bf4dc6d..01b033001 100644 --- a/src/JustSaying/AwsTools/MessageHandling/ISqsQueue.cs +++ b/src/JustSaying/AwsTools/MessageHandling/ISqsQueue.cs @@ -76,4 +76,4 @@ Task ChangeMessageVisibilityAsync( int visibilityTimeoutInSeconds, CancellationToken cancellationToken); -} \ No newline at end of file +} diff --git a/src/JustSaying/AwsTools/MessageHandling/ITopicArnProvider.cs b/src/JustSaying/AwsTools/MessageHandling/ITopicArnProvider.cs deleted file mode 100644 index c2b1a5cd8..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/ITopicArnProvider.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace JustSaying.AwsTools.MessageHandling; - -internal interface ITopicArnProvider -{ - Task ArnExistsAsync(); - Task GetArnAsync(); -} \ No newline at end of file diff --git a/src/JustSaying/AwsTools/MessageHandling/InboundMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/InboundMessageConverter.cs new file mode 100644 index 000000000..fe9844c70 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/InboundMessageConverter.cs @@ -0,0 +1,148 @@ +using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using JustSaying.AwsTools; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; + +namespace JustSaying.Messaging; + +internal sealed class InboundMessageConverter : IInboundMessageConverter +{ + private readonly IMessageBodySerializer _bodySerializer; + private readonly MessageCompressionRegistry _compressionRegistry; + private readonly bool _isRawMessage; + + public InboundMessageConverter(IMessageBodySerializer bodySerializer, MessageCompressionRegistry compressionRegistry, bool isRawMessage) + { + _bodySerializer = bodySerializer; + _compressionRegistry = compressionRegistry; + _isRawMessage = isRawMessage; + } + + public ValueTask ConvertToInboundMessageAsync(Amazon.SQS.Model.Message message, CancellationToken cancellationToken = default) + { + string body = message.Body; + var attributes = GetMessageAttributes(message, body); + + if (body is not null && !_isRawMessage) + { + var jsonNode = JsonNode.Parse(body); + if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) + { + body = messageNode?.GetValue(); + } + } + body = ApplyBodyDecompression(body, attributes); + var result = _bodySerializer.Deserialize(body); + return new ValueTask(new InboundMessage(result, attributes)); + } + + private string ApplyBodyDecompression(string body, MessageAttributes attributes) + { + var contentEncoding = attributes.Get(MessageAttributeKeys.ContentEncoding); + if (contentEncoding is not null) + { + var decompressor = _compressionRegistry.GetCompression(contentEncoding.StringValue); + if (decompressor is null) + { + throw new InvalidOperationException($"Compression encoding '{contentEncoding.StringValue}' is not registered."); + } + + body = decompressor.Decompress(body); + } + + return body; + } + + private static MessageAttributes GetMessageAttributes(Amazon.SQS.Model.Message message, string body) + { + return IsSnsPayload(body) ? GetMessageAttributes(body) : GetRawMessageAttributes(message); + } + + private static MessageAttributes GetMessageAttributes(string message) + { + using var jsonDocument = JsonDocument.Parse(message); + + if (!jsonDocument.RootElement.TryGetProperty("MessageAttributes", out var attributesElement)) + { + return new MessageAttributes(); + } + + Dictionary attributes = new(); + foreach (var property in attributesElement.EnumerateObject()) + { + var dataType = property.Value.GetProperty("Type").GetString(); + var dataValue = property.Value.GetProperty("Value").GetString(); + + attributes.Add(property.Name, ParseMessageAttribute(dataType, dataValue)); + } + + return new MessageAttributes(attributes); + } + + private static MessageAttributeValue ParseMessageAttribute(string dataType, string dataValue) + { + // Check for a prefix instead of an exact match as SQS supports custom-type labels, or example, "Binary.gif". + // See https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-metadata.html#sqs-message-attributes. + bool isBinary = dataType?.StartsWith("Binary", StringComparison.Ordinal) is true; + + return new() + { + DataType = dataType, + StringValue = !isBinary ? dataValue : null, + BinaryValue = isBinary ? Convert.FromBase64String(dataValue) : null + }; + } + + private static MessageAttributes GetRawMessageAttributes(Amazon.SQS.Model.Message message) + { + if (message.MessageAttributes is null) + { + return new MessageAttributes(); + } + + Dictionary rawAttributes = new (); + + foreach (var messageMessageAttribute in message.MessageAttributes) + { + var dataType = messageMessageAttribute.Value.DataType; + var dataValue = messageMessageAttribute.Value.StringValue; + rawAttributes.Add(messageMessageAttribute.Key, ParseMessageAttribute(dataType, dataValue)); + } + + return new MessageAttributes(rawAttributes); + } + + private static bool IsSnsPayload(string body) + { + if (body is null) + { + return false; + } + + try + { + var utf8JsonReader = new Utf8JsonReader(Encoding.UTF8.GetBytes(body)); + if (!JsonDocument.TryParseValue(ref utf8JsonReader, out var jsonDocument)) + { + return false; + } + + using (jsonDocument) + { + if (jsonDocument.RootElement.TryGetProperty("Type", out var typeElement)) + { + return typeElement.GetString() is "Notification"; + } + } + } + catch + { + // ignored + } + + return false; + } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/LocalTopicArnProvider.cs b/src/JustSaying/AwsTools/MessageHandling/LocalTopicArnProvider.cs deleted file mode 100644 index ffe5a49e5..000000000 --- a/src/JustSaying/AwsTools/MessageHandling/LocalTopicArnProvider.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Amazon.SimpleNotificationService; - -namespace JustSaying.AwsTools.MessageHandling; - -internal class LocalTopicArnProvider : ITopicArnProvider -{ - private readonly IAmazonSimpleNotificationService _client; - private readonly Lazy> _lazyGetArnAsync; - private bool _exists; - - public LocalTopicArnProvider(IAmazonSimpleNotificationService client, string topicName) - { - _client = client; - - _lazyGetArnAsync = new Lazy>(() => GetArnInternalAsync(topicName)); - } - - private async Task GetArnInternalAsync(string topicName) - { - try - { - var topic = await _client.FindTopicAsync(topicName).ConfigureAwait(false); - - _exists = true; - return topic.TopicArn; - } - catch (Exception) - { - // ignored - } - return null; - } - - public Task GetArnAsync() - { - return _lazyGetArnAsync.Value; - } - - public async Task ArnExistsAsync() - { - _ = await _lazyGetArnAsync.Value.ConfigureAwait(false); - return _exists; - } -} diff --git a/src/JustSaying/AwsTools/MessageHandling/OutboundMessageConverter.cs b/src/JustSaying/AwsTools/MessageHandling/OutboundMessageConverter.cs new file mode 100644 index 000000000..e991ec95b --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/OutboundMessageConverter.cs @@ -0,0 +1,163 @@ +using System.Text; +using System.Text.Json.Nodes; +using JustSaying.AwsTools; +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.Models; + +namespace JustSaying.Messaging; + +internal sealed class OutboundMessageConverter : IOutboundMessageConverter +{ + private readonly PublishDestinationType _destinationType; + private readonly IMessageBodySerializer _bodySerializer; + private readonly MessageCompressionRegistry _compressionRegistry; + private readonly PublishCompressionOptions _compressionOptions; + private readonly string _subject; + private readonly bool _isRawMessage; + + public OutboundMessageConverter( + PublishDestinationType destinationType, + IMessageBodySerializer bodySerializer, + MessageCompressionRegistry compressionRegistry, + PublishCompressionOptions compressionOptions, + string subject, + bool isRawMessage) + { + _destinationType = destinationType; + _bodySerializer = bodySerializer; + _compressionRegistry = compressionRegistry; + _compressionOptions = compressionOptions; + _subject = subject; + _isRawMessage = isRawMessage; + } + + public ValueTask ConvertToOutboundMessageAsync(Message message, PublishMetadata publishMetadata, CancellationToken cancellationToken = default) + { + var messageBody = _bodySerializer.Serialize(message); + + Dictionary attributeValues = new(); + AddMessageAttributes(attributeValues, publishMetadata); + + (string compressedMessage, string contentEncoding) = CompressMessageBody(messageBody, publishMetadata); + if (compressedMessage is not null) + { + messageBody = compressedMessage; + attributeValues.Add(MessageAttributeKeys.ContentEncoding, new MessageAttributeValue { DataType = "String", StringValue = contentEncoding }); + } + + if (_destinationType == PublishDestinationType.Queue && !_isRawMessage) + { + messageBody = new JsonObject + { + ["Message"] = messageBody, + ["Subject"] = _subject + }.ToJsonString(); + } + + return new ValueTask(new OutboundMessage(messageBody, attributeValues, _subject)); + } + + private static void AddMessageAttributes(Dictionary requestMessageAttributes, PublishMetadata metadata) + { + if (metadata?.MessageAttributes == null || metadata.MessageAttributes.Count == 0) + { + return; + } + + foreach (var attribute in metadata.MessageAttributes) + { + requestMessageAttributes.Add(attribute.Key, attribute.Value); + } + } + + /// + /// Compresses a message if it meets the specified compression criteria. + /// + /// The original message to potentially compress. + /// Metadata associated with the message. + /// A tuple containing the compressed message (or null if not compressed) and the content encoding used (or null if not compressed). + internal (string compressedMessage, string contentEncoding) CompressMessageBody(string message, PublishMetadata metadata) + { + string contentEncoding = null; + string compressedMessage = null; + + if (_compressionOptions?.CompressionEncoding is { } compressionEncoding && _compressionRegistry is not null) + { + var messageSize = CalculateTotalMessageSize(message, metadata); + if (messageSize >= _compressionOptions.MessageLengthThreshold) + { + var compression = _compressionRegistry.GetCompression(compressionEncoding); + if (compression is null) + { + throw new InvalidOperationException($"No compression algorithm registered for encoding '{compressionEncoding}'."); + } + + // For queue messages that aren't raw, we need to extract the inner message before compression + if (_destinationType == PublishDestinationType.Queue && !_isRawMessage) + { + var jsonNode = JsonNode.Parse(message); + if (jsonNode is JsonObject jsonObject && jsonObject.TryGetPropertyValue("Message", out var messageNode)) + { + message = messageNode?.GetValue(); + } + } + + compressedMessage = compression.Compress(message); + contentEncoding = compressionEncoding; + } + } + + return (compressedMessage, contentEncoding); + } + + /// + /// Calculates the total size of a message, including its metadata. + /// + /// The message content. + /// Metadata associated with the message. + /// The total size of the message in bytes. + private int CalculateTotalMessageSize(string message, PublishMetadata metadata) + { + int messageSize = 0; + + // For queue messages that aren't raw, we need to account for the wrapper structure + if (_destinationType == PublishDestinationType.Queue && !_isRawMessage) + { + // Calculate size of the wrapper object with escaped message + var wrappedMessage = new JsonObject + { + ["Message"] = message, + ["Subject"] = _subject + }.ToJsonString(); + + messageSize = Encoding.UTF8.GetByteCount(wrappedMessage); + } + else + { + // For non-queue or raw messages, just calculate the direct message size + messageSize = Encoding.UTF8.GetByteCount(message); + } + + if (metadata?.MessageAttributes != null) + { + foreach (var attribute in metadata.MessageAttributes) + { + messageSize += Encoding.UTF8.GetByteCount(attribute.Key); + messageSize += Encoding.UTF8.GetByteCount(attribute.Value.DataType); + if (attribute.Value.StringValue is not null) + { + messageSize += Encoding.UTF8.GetByteCount(attribute.Value.StringValue); + } + + if (attribute.Value.BinaryValue is not null) + { + messageSize += attribute.Value.BinaryValue.Count; + } + } + } + + return messageSize; + } +} diff --git a/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs b/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs new file mode 100644 index 000000000..40502f8c3 --- /dev/null +++ b/src/JustSaying/AwsTools/MessageHandling/PublishDestinationType.cs @@ -0,0 +1,7 @@ +namespace JustSaying.AwsTools.MessageHandling; + +internal enum PublishDestinationType +{ + Topic = 1, + Queue = 2 +} diff --git a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs index ad7624860..a67a7df36 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SnsMessagePublisher.cs @@ -3,50 +3,38 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.Messaging; using JustSaying.Messaging.Interrogation; -using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using Microsoft.Extensions.Logging; using MessageAttributeValue = Amazon.SimpleNotificationService.Model.MessageAttributeValue; namespace JustSaying.AwsTools.MessageHandling; -public class SnsMessagePublisher : IMessagePublisher, IMessageBatchPublisher, IInterrogable +internal sealed class SnsMessagePublisher( + IAmazonSimpleNotificationService client, + IOutboundMessageConverter messageConverter, + ILoggerFactory loggerFactory, + Func handleException, + Func, bool> handleBatchException) : IMessagePublisher, IMessageBatchPublisher, IInterrogable { - private readonly IMessageSerializationRegister _serializationRegister; - private readonly IMessageSubjectProvider _messageSubjectProvider; - private readonly Func _handleException; - private readonly ILogger _logger; - - public Func, bool> HandleBatchException { get; set; } + private readonly IOutboundMessageConverter _messageConverter = messageConverter; + private readonly Func _handleException = handleException; + private readonly Func, bool> _handleBatchException = handleBatchException; + private readonly IAmazonSimpleNotificationService _client = client; + private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); public Action MessageResponseLogger { get; set; } public Action> MessageBatchResponseLogger { get; set; } public string Arn { get; internal set; } - protected IAmazonSimpleNotificationService Client { get; } - - public SnsMessagePublisher( - IAmazonSimpleNotificationService client, - IMessageSerializationRegister serializationRegister, - ILoggerFactory loggerFactory, - IMessageSubjectProvider messageSubjectProvider, - Func handleException = null) - : this(null, client, serializationRegister, loggerFactory, messageSubjectProvider, handleException) - { - } public SnsMessagePublisher( string topicArn, IAmazonSimpleNotificationService client, - IMessageSerializationRegister serializationRegister, + IOutboundMessageConverter messageConverter, ILoggerFactory loggerFactory, - IMessageSubjectProvider messageSubjectProvider, - Func handleException = null) + Func handleException, + Func, bool> handleBatchException) + : this(client, messageConverter, loggerFactory, handleException, handleBatchException) { Arn = topicArn; - Client = client; - _serializationRegister = serializationRegister; - _logger = loggerFactory.CreateLogger("JustSaying.Publish"); - _handleException = handleException; - _messageSubjectProvider = messageSubjectProvider; } public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; @@ -56,11 +44,11 @@ public Task PublishAsync(Message message, CancellationToken cancellationToken) public async Task PublishAsync(Message message, PublishMetadata metadata, CancellationToken cancellationToken) { - var request = BuildPublishRequest(message, metadata); + var request = await BuildPublishRequestAsync(message, metadata); PublishResponse response = null; try { - response = await Client.PublishAsync(request, cancellationToken).ConfigureAwait(false); + response = await _client.PublishAsync(request, cancellationToken).ConfigureAwait(false); } catch (AmazonServiceException ex) { @@ -96,30 +84,33 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel private bool ClientExceptionHandler(Exception ex, Message message) => _handleException?.Invoke(ex, message) ?? false; - private PublishRequest BuildPublishRequest(Message message, PublishMetadata metadata) + private async Task BuildPublishRequestAsync(Message message, PublishMetadata metadata) { - string messageToSend = _serializationRegister.Serialize(message, serializeForSnsPublishing: true); - string messageType = _messageSubjectProvider.GetSubjectForType(message.GetType()); + var (messageToSend, attributes, subject) = await _messageConverter.ConvertToOutboundMessageAsync(message, metadata); - return new PublishRequest + var request = new PublishRequest { TopicArn = Arn, - Subject = messageType, + Subject = subject, Message = messageToSend, - MessageAttributes = BuildMessageAttributes(metadata) }; + + AddMessageAttributes(request.MessageAttributes, attributes); + + return request; } - private static Dictionary BuildMessageAttributes(PublishMetadata metadata) + private static void AddMessageAttributes(Dictionary requestMessageAttributes, Dictionary attributes) { - if (metadata?.MessageAttributes == null || metadata.MessageAttributes.Count == 0) + if (attributes == null || attributes.Count == 0) { - return null; + return; } - return metadata.MessageAttributes.ToDictionary( - source => source.Key, - source => BuildMessageAttributeValue(source.Value)); + foreach (var attribute in attributes) + { + requestMessageAttributes.Add(attribute.Key, BuildMessageAttributeValue(attribute.Value)); + } } private static MessageAttributeValue BuildMessageAttributeValue(Messaging.MessageAttributeValue value) @@ -142,7 +133,7 @@ private static MessageAttributeValue BuildMessageAttributeValue(Messaging.Messag } /// - public virtual InterrogationResult Interrogate() + public InterrogationResult Interrogate() { return new InterrogationResult(new { Arn }); } @@ -155,12 +146,12 @@ public async Task PublishAsync(IEnumerable messages, PublishBatchMetada foreach (var chunk in messages.Chunk(size)) { - var request = BuildPublishBatchRequest(chunk, metadata); + var request = await BuildPublishBatchRequestAsync(chunk, metadata); PublishBatchResponse response = null; try { - response = await Client.PublishBatchAsync(request, cancellationToken).ConfigureAwait(false); + response = await _client.PublishBatchAsync(request, cancellationToken).ConfigureAwait(false); } catch (AmazonServiceException ex) { @@ -232,25 +223,26 @@ public async Task PublishAsync(IEnumerable messages, PublishBatchMetada } private bool ClientExceptionHandler(Exception ex, IReadOnlyCollection messages) - => HandleBatchException?.Invoke(ex, messages) ?? false; + => _handleBatchException?.Invoke(ex, messages) ?? false; - private PublishBatchRequest BuildPublishBatchRequest(Message[] messages, PublishMetadata metadata) + private async Task BuildPublishBatchRequestAsync(Message[] messages, PublishMetadata metadata) { var entries = new List(messages.Length); foreach (var message in messages) { - string subject = _messageSubjectProvider.GetSubjectForType(message.GetType()); - string payload = _serializationRegister.Serialize(message, serializeForSnsPublishing: true); - var attributes = BuildMessageAttributes(metadata); + var (messageToSend, attributes, subject) = await _messageConverter.ConvertToOutboundMessageAsync(message, metadata); - entries.Add(new() + PublishBatchRequestEntry request = new() { Id = message.UniqueKey(), Subject = subject, - Message = payload, - MessageAttributes = attributes, - }); + Message = messageToSend, + }; + + AddMessageAttributes(request.MessageAttributes, attributes); + + entries.Add(request); } return new PublishBatchRequest diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs index 282094c62..be2832af9 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsMessagePublisher.cs @@ -3,15 +3,15 @@ using Amazon.SQS.Model; using JustSaying.Messaging; using JustSaying.Messaging.Interrogation; -using JustSaying.Messaging.MessageSerialization; using Microsoft.Extensions.Logging; using Message = JustSaying.Models.Message; +using MessageAttributeValue = Amazon.SQS.Model.MessageAttributeValue; namespace JustSaying.AwsTools.MessageHandling; -public class SqsMessagePublisher( +internal sealed class SqsMessagePublisher( IAmazonSQS client, - IMessageSerializationRegister serializationRegister, + OutboundMessageConverter messageConverter, ILoggerFactory loggerFactory) : IMessagePublisher, IMessageBatchPublisher { private readonly ILogger _logger = loggerFactory.CreateLogger("JustSaying.Publish"); @@ -23,8 +23,8 @@ public class SqsMessagePublisher( public SqsMessagePublisher( Uri queueUrl, IAmazonSQS client, - IMessageSerializationRegister serializationRegister, - ILoggerFactory loggerFactory) : this(client, serializationRegister, loggerFactory) + OutboundMessageConverter messageConverter, + ILoggerFactory loggerFactory) : this(client, messageConverter, loggerFactory) { QueueUrl = queueUrl; } @@ -41,7 +41,7 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel { EnsureQueueUrl(); - var request = BuildSendMessageRequest(message, metadata); + var request = await BuildSendMessageRequestAsync(message, metadata); SendMessageResponse response; try { @@ -76,14 +76,18 @@ public async Task PublishAsync(Message message, PublishMetadata metadata, Cancel } } - private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetadata metadata) + private async Task BuildSendMessageRequestAsync(Message message, PublishMetadata metadata) { + var (messageBody, attributes, _) = await messageConverter.ConvertToOutboundMessageAsync(message, metadata); + var request = new SendMessageRequest { - MessageBody = GetMessageInContext(message), - QueueUrl = QueueUrl.AbsoluteUri, + MessageBody = messageBody, + QueueUrl = QueueUrl.AbsoluteUri }; + AddMessageAttributes(request.MessageAttributes, attributes); + if (metadata?.Delay != null) { request.DelaySeconds = (int)metadata.Delay.Value.TotalSeconds; @@ -92,7 +96,37 @@ private SendMessageRequest BuildSendMessageRequest(Message message, PublishMetad return request; } - public string GetMessageInContext(Message message) => serializationRegister.Serialize(message, serializeForSnsPublishing: false); + private static void AddMessageAttributes(Dictionary requestMessageAttributes, Dictionary messageAttributes) + { + if (messageAttributes == null || messageAttributes.Count == 0) + { + return; + } + + foreach (var attribute in messageAttributes) + { + requestMessageAttributes.Add(attribute.Key, BuildMessageAttributeValue(attribute.Value)); + } + } + + private static MessageAttributeValue BuildMessageAttributeValue(Messaging.MessageAttributeValue value) + { + if (value == null) + { + return null; + } + + var binaryValueStream = value.BinaryValue != null + ? new MemoryStream([.. value.BinaryValue], false) + : null; + + return new MessageAttributeValue + { + StringValue = value.StringValue, + BinaryValue = binaryValueStream, + DataType = value.DataType + }; + } /// public InterrogationResult Interrogate() @@ -113,7 +147,7 @@ public async Task PublishAsync(IEnumerable messages, PublishBatchMetada foreach (var chunk in messages.Chunk(size)) { - var request = BuildSendMessageBatchRequest(chunk, metadata); + var request = await BuildSendMessageBatchRequestAsync(chunk, metadata); SendMessageBatchResponse response; try { @@ -184,19 +218,23 @@ public async Task PublishAsync(IEnumerable messages, PublishBatchMetada } } - private SendMessageBatchRequest BuildSendMessageBatchRequest(Message[] messages, PublishMetadata metadata) + private async Task BuildSendMessageBatchRequestAsync(Message[] messages, PublishMetadata metadata) { var entries = new List(messages.Length); int? delaySeconds = metadata?.Delay is { } delay ? (int)delay.TotalSeconds : null; foreach (var message in messages) { + var (messageBody, attributes, _) = await messageConverter.ConvertToOutboundMessageAsync(message, metadata); + var entry = new SendMessageBatchRequestEntry { Id = message.UniqueKey(), - MessageBody = GetMessageInContext(message), + MessageBody = messageBody }; + AddMessageAttributes(entry.MessageAttributes, attributes); + if (delaySeconds is { } value) { entry.DelaySeconds = value; diff --git a/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs b/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs index 0a33a5410..00e001868 100644 --- a/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs +++ b/src/JustSaying/AwsTools/MessageHandling/SqsQueueReader.cs @@ -1,4 +1,5 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Context; namespace JustSaying.AwsTools.MessageHandling; @@ -6,10 +7,12 @@ namespace JustSaying.AwsTools.MessageHandling; internal class SqsQueueReader { private readonly ISqsQueue _sqsQueue; + private readonly IInboundMessageConverter _messageConverter; - internal SqsQueueReader(ISqsQueue sqsQueue) + internal SqsQueueReader(ISqsQueue sqsQueue, IInboundMessageConverter messageConverter) { _sqsQueue = sqsQueue; + _messageConverter = messageConverter; } internal string QueueName => _sqsQueue.QueueName; @@ -20,7 +23,7 @@ internal SqsQueueReader(ISqsQueue sqsQueue) internal IQueueMessageContext ToMessageContext(Message message) { - return new QueueMessageContext(message, this); + return new QueueMessageContext(message, this, _messageConverter); } internal async Task> GetMessagesAsync( @@ -57,4 +60,4 @@ await _sqsQueue.ChangeMessageVisibilityAsync( (int)timeout.TotalSeconds, cancellationToken).ConfigureAwait(false); } -} \ No newline at end of file +} diff --git a/src/JustSaying/AwsTools/QueueCreation/AmazonQueueCreator.cs b/src/JustSaying/AwsTools/QueueCreation/AmazonQueueCreator.cs index 69c773c55..ce3ec74b1 100644 --- a/src/JustSaying/AwsTools/QueueCreation/AmazonQueueCreator.cs +++ b/src/JustSaying/AwsTools/QueueCreation/AmazonQueueCreator.cs @@ -33,7 +33,8 @@ await SubscribeQueueAndApplyFilterPolicyAsync(snsClient, topicArn, sqsClient, queue.Uri, - queueConfig.FilterPolicy).ConfigureAwait(false); + queueConfig.FilterPolicy, + queueConfig.RawMessageDelivery).ConfigureAwait(false); } else { @@ -46,7 +47,8 @@ await SubscribeQueueAndApplyFilterPolicyAsync(snsClient, eventTopic.Arn, sqsClient, queue.Uri, - queueConfig.FilterPolicy).ConfigureAwait(false); + queueConfig.FilterPolicy, + queueConfig.RawMessageDelivery).ConfigureAwait(false); var sqsDetails = new SqsPolicyDetails { @@ -94,7 +96,8 @@ private static async Task SubscribeQueueAndApplyFilterPolicyAsync( string topicArn, IAmazonSQS amazonSQS, Uri queueUrl, - string filterPolicy) + string filterPolicy, + bool rawMessageDelivery) { if (amazonSimpleNotificationService == null) throw new ArgumentNullException(nameof(amazonSimpleNotificationService)); if (amazonSQS == null) throw new ArgumentNullException(nameof(amazonSQS)); @@ -110,5 +113,8 @@ private static async Task SubscribeQueueAndApplyFilterPolicyAsync( await amazonSimpleNotificationService .SetSubscriptionAttributesAsync(subscriptionArn, "FilterPolicy", actualFilterPolicy) .ConfigureAwait(false); + await amazonSimpleNotificationService + .SetSubscriptionAttributesAsync(subscriptionArn, "RawMessageDelivery", rawMessageDelivery.ToString().ToLowerInvariant()) + .ConfigureAwait(false); } } diff --git a/src/JustSaying/AwsTools/QueueCreation/RedrivePolicy.cs b/src/JustSaying/AwsTools/QueueCreation/RedrivePolicy.cs index ea6b1af25..b43e9894a 100644 --- a/src/JustSaying/AwsTools/QueueCreation/RedrivePolicy.cs +++ b/src/JustSaying/AwsTools/QueueCreation/RedrivePolicy.cs @@ -1,15 +1,13 @@ +using System.Text.Json; using System.Text.Json.Serialization; -using Newtonsoft.Json; namespace JustSaying.AwsTools.QueueCreation; -public class RedrivePolicy +internal sealed class RedrivePolicy { - [JsonProperty("maxReceiveCount")] [JsonPropertyName("maxReceiveCount")] public int MaximumReceives { get; set; } - [JsonProperty("deadLetterTargetArn")] [JsonPropertyName("deadLetterTargetArn")] public string DeadLetterQueue { get; set; } @@ -19,15 +17,9 @@ public RedrivePolicy(int maximumReceives, string deadLetterQueue) DeadLetterQueue = deadLetterQueue; } - protected RedrivePolicy() - { - } - - // Cannot use System.Text.Json below as no public parameterless constructor. Change for v7? - public override string ToString() - => JsonConvert.SerializeObject(this); + => JsonSerializer.Serialize(this); public static RedrivePolicy ConvertFromString(string policy) - => JsonConvert.DeserializeObject(policy); -} \ No newline at end of file + => JsonSerializer.Deserialize(policy); +} diff --git a/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs index ffd472189..5cead5cb5 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SnsWriteConfiguration.cs @@ -1,14 +1,54 @@ +using JustSaying.AwsTools.MessageHandling; using JustSaying.Models; namespace JustSaying.AwsTools.QueueCreation; +/// +/// Represents the configuration for writing messages to Amazon SNS (Simple Notification Service). +/// public class SnsWriteConfiguration { + private string _subject; + + /// + /// Gets or sets the server-side encryption settings for the SNS topic. + /// public ServerSideEncryption Encryption { get; set; } /// - /// Extension point enabling custom error handling on a per notification basis, including ability handle raised exceptions. + /// Gets or sets the compression options for publishing messages. + /// + public PublishCompressionOptions CompressionOptions { get; set; } + + /// + /// Gets or sets a value indicating whether the message should be treated as a raw message. + /// + public bool IsRawMessage { get; set; } + + /// + /// Gets or sets the subject of the SNS message. + /// + public string Subject + { + get => _subject; + set + { + _subject = value; + SubjectSet = true; + } + } + + /// + /// Internal property to track whether the Subject has been set. + /// + internal bool SubjectSet { get; private set; } + + /// + /// Gets or sets a delegate for custom error handling on a per-notification basis. /// - /// Boolean indicating whether the exception has been handled + /// + /// This is an extension point enabling custom error handling, including the ability to handle raised exceptions. + /// + /// A function that takes an Exception and a Message as parameters and returns a boolean indicating whether the exception has been handled. public Func HandleException { get; set; } -} \ No newline at end of file +} diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs index 0e84aa3ec..c3b3c00ed 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsBasicConfiguration.cs @@ -1,16 +1,19 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Fluent; using JustSaying.Naming; namespace JustSaying.AwsTools.QueueCreation; public class SqsBasicConfiguration { - public TimeSpan MessageRetention { get; set; } - public TimeSpan ErrorQueueRetentionPeriod { get; set; } - public TimeSpan VisibilityTimeout { get; set; } - public TimeSpan DeliveryDelay { get; set; } - public int RetryCountBeforeSendingToErrorQueue { get; set; } + public TimeSpan MessageRetention { get; set; } = JustSayingConstants.DefaultRetentionPeriod; + public TimeSpan ErrorQueueRetentionPeriod { get; set; } = JustSayingConstants.MaximumRetentionPeriod; + public TimeSpan VisibilityTimeout { get; set; } = JustSayingConstants.DefaultVisibilityTimeout; + public TimeSpan DeliveryDelay { get; set; } = JustSayingConstants.MinimumDeliveryDelay; + public int RetryCountBeforeSendingToErrorQueue { get; set; } = JustSayingConstants.DefaultHandlerRetryCount; public bool ErrorQueueOptOut { get; set; } public ServerSideEncryption ServerSideEncryption { get; set; } + public bool IsRawMessage { get; set; } public string QueueName { get; set; } public void ApplyQueueNamingConvention(IQueueNamingConvention namingConvention) @@ -18,15 +21,6 @@ public void ApplyQueueNamingConvention(IQueueNamingConvention namingConventio QueueName = namingConvention.Apply(QueueName); } - public SqsBasicConfiguration() - { - MessageRetention = JustSayingConstants.DefaultRetentionPeriod; - ErrorQueueRetentionPeriod = JustSayingConstants.MaximumRetentionPeriod; - VisibilityTimeout = JustSayingConstants.DefaultVisibilityTimeout; - RetryCountBeforeSendingToErrorQueue = JustSayingConstants.DefaultHandlerRetryCount; - DeliveryDelay = JustSayingConstants.MinimumDeliveryDelay; - } - public void Validate() { if (MessageRetention < JustSayingConstants.MinimumRetentionPeriod || diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs index 67ccfe989..f3f3c9b66 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsReadConfiguration.cs @@ -1,3 +1,4 @@ +using JustSaying.Models; using JustSaying.Naming; namespace JustSaying.AwsTools.QueueCreation; @@ -20,9 +21,10 @@ public SqsReadConfiguration(SubscriptionType subscriptionType) public Dictionary Tags { get; set; } public string TopicSourceAccount { get; set; } public string FilterPolicy { get; set; } + public bool RawMessageDelivery { get; set; } public string SubscriptionGroupName { get; set; } - public void ApplyTopicNamingConvention(ITopicNamingConvention namingConvention) + public void ApplyTopicNamingConvention(ITopicNamingConvention namingConvention) where T: Message { TopicName = namingConvention.Apply(TopicName); } @@ -48,4 +50,4 @@ protected override void OnValidating() throw new ConfigurationErrorsException("You must provide a name for the subscription group"); } } -} \ No newline at end of file +} diff --git a/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs b/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs index d92be8c99..cfc4d0eef 100644 --- a/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs +++ b/src/JustSaying/AwsTools/QueueCreation/SqsWriteConfiguration.cs @@ -1,12 +1,8 @@ +using JustSaying.AwsTools.MessageHandling; + namespace JustSaying.AwsTools.QueueCreation; public class SqsWriteConfiguration : SqsBasicConfiguration { - public SqsWriteConfiguration() - { - MessageRetention = JustSayingConstants.DefaultRetentionPeriod; - ErrorQueueRetentionPeriod = JustSayingConstants.MaximumRetentionPeriod; - VisibilityTimeout = JustSayingConstants.DefaultVisibilityTimeout; - RetryCountBeforeSendingToErrorQueue = JustSayingConstants.DefaultHandlerRetryCount; - } -} \ No newline at end of file + public PublishCompressionOptions CompressionOptions { get; set; } +} diff --git a/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs b/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs index 12e92b775..0eba033bc 100644 --- a/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs +++ b/src/JustSaying/Extensions/AmazonSqsClientExtensions.cs @@ -25,7 +25,8 @@ public static async Task> ReceiveMessagesAsync(this IAmazonSQS cl { MessageSystemAttributeNames = [.. attributesToLoad], WaitTimeSeconds = secondsWaitTime, - MaxNumberOfMessages = maxNumOfMessages + MaxNumberOfMessages = maxNumOfMessages, + MessageAttributeNames = ["All"] }, cancellationToken).ConfigureAwait(false); diff --git a/src/JustSaying/Fluent/AccountAddressProvider.cs b/src/JustSaying/Fluent/AccountAddressProvider.cs index 8523ff2c5..165a04652 100644 --- a/src/JustSaying/Fluent/AccountAddressProvider.cs +++ b/src/JustSaying/Fluent/AccountAddressProvider.cs @@ -106,9 +106,7 @@ public Uri GetQueueUriByConvention() /// The for this queue. public Uri GetQueueUri(string queueName) { -#pragma warning disable CS0618 // Type or member is obsolete - var hostname = _regionEndpoint.GetEndpointForService("sqs").Hostname; -#pragma warning restore CS0618 // Type or member is obsolete + var hostname = SqsEndpointHelper.GetSqsHostname(_regionEndpoint.PartitionName, _regionEndpoint.SystemName); return new UriBuilder(Uri.UriSchemeHttps, hostname) { Path = $"{_accountId}/{queueName}" diff --git a/src/JustSaying/Fluent/CompressionEncodingValidator.cs b/src/JustSaying/Fluent/CompressionEncodingValidator.cs new file mode 100644 index 000000000..357852418 --- /dev/null +++ b/src/JustSaying/Fluent/CompressionEncodingValidator.cs @@ -0,0 +1,18 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Compression; + +namespace JustSaying.Fluent; + +internal static class CompressionEncodingValidator +{ + public static void ValidateEncoding(MessageCompressionRegistry compressionRegistry, PublishCompressionOptions compressionOptions) + { + if (compressionOptions?.CompressionEncoding is { } compressionEncoding) + { + if (compressionRegistry.GetCompression(compressionEncoding) is null) + { + throw new InvalidOperationException($"Compression encoding '{compressionEncoding}' is not registered with the bus."); + } + } + } +} diff --git a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs index cf62dcddd..7cf07cb07 100644 --- a/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs +++ b/src/JustSaying/Fluent/PublishConfig/StaticPublicationConfiguration.cs @@ -2,6 +2,8 @@ using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.QueueCreation; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Models; using Microsoft.Extensions.Logging; #pragma warning disable CS0618 @@ -23,7 +25,7 @@ public static StaticPublicationConfiguration Build( SnsWriteConfiguration writeConfiguration, IAmazonSimpleNotificationService snsClient, ILoggerFactory loggerFactory, - JustSayingBus bus) + JustSayingBus bus) where T : Message { var readConfiguration = new SqsReadConfiguration(SubscriptionType.ToTopic) { @@ -32,11 +34,17 @@ public static StaticPublicationConfiguration Build( readConfiguration.ApplyTopicNamingConvention(bus.Config.TopicNamingConvention); + var compressionOptions = writeConfiguration.CompressionOptions ?? bus.Config.DefaultCompressionOptions; + var serializer = bus.MessageBodySerializerFactory.GetSerializer(); + var subjectProvider = bus.Config.MessageSubjectProvider; + var subject = writeConfiguration.SubjectSet ? writeConfiguration.Subject : subjectProvider.GetSubjectForType(typeof(T)); + var eventPublisher = new SnsMessagePublisher( snsClient, - bus.SerializationRegister, + new OutboundMessageConverter(PublishDestinationType.Topic, serializer, new MessageCompressionRegistry([new GzipMessageBodyCompression()]), compressionOptions, subject, writeConfiguration.IsRawMessage), loggerFactory, - bus.Config.MessageSubjectProvider) + null, + null) { MessageResponseLogger = bus.Config.MessageResponseLogger, MessageBatchResponseLogger = bus.PublishBatchConfiguration?.MessageBatchResponseLogger diff --git a/src/JustSaying/Fluent/QueueAddress.cs b/src/JustSaying/Fluent/QueueAddress.cs index 8b3ab01e2..cceae0e79 100644 --- a/src/JustSaying/Fluent/QueueAddress.cs +++ b/src/JustSaying/Fluent/QueueAddress.cs @@ -1,5 +1,6 @@ using System.Text.RegularExpressions; using Amazon; +using Amazon.SQS; namespace JustSaying.Fluent; @@ -79,11 +80,7 @@ public static QueueAddress FromArn(string queueArn) if (!Arn.TryParse(queueArn, out var arn)) throw new ArgumentException("Must be a valid ARN.", nameof(queueArn)); if (!string.Equals(arn.Service, "sqs", StringComparison.OrdinalIgnoreCase)) throw new ArgumentException("Must be an ARN for an SQS queue.", nameof(queueArn)); -#pragma warning disable CS0618 // Type or member is obsolete - var hostname = RegionEndpoint.GetBySystemName(arn.Region) - .GetEndpointForService("sqs") - .Hostname; -#pragma warning restore CS0618 // Type or member is obsolete + var hostname = SqsEndpointHelper.GetSqsHostname(arn.Partition, arn.Region); var queueUrl = new UriBuilder("https", hostname) { diff --git a/src/JustSaying/Fluent/QueueAddressConfiguration.cs b/src/JustSaying/Fluent/QueueAddressConfiguration.cs index b0a4d28d7..94df7441d 100644 --- a/src/JustSaying/Fluent/QueueAddressConfiguration.cs +++ b/src/JustSaying/Fluent/QueueAddressConfiguration.cs @@ -1,11 +1,9 @@ -using JustSaying.Messaging.Middleware; - namespace JustSaying.Fluent; public sealed class QueueAddressConfiguration { public string SubscriptionGroupName { get; set; } - public Action MiddlewareConfiguration { get; set; } + public bool RawMessageDelivery { get; set; } public void Validate() { diff --git a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs index bbbb689a1..98c2b5446 100644 --- a/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressPublicationBuilder`1.cs @@ -1,6 +1,8 @@ using Amazon; using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -16,6 +18,10 @@ public sealed class QueueAddressPublicationBuilder : IPublicationBuilder where T : Message { private readonly QueueAddress _queueAddress; + private PublishCompressionOptions _compressionOptions; + private string _subject; + private bool _subjectSet; + private bool _isRawMessage; /// /// Initializes a new instance of the class. @@ -26,6 +32,40 @@ internal QueueAddressPublicationBuilder(QueueAddress queueAddress) _queueAddress = queueAddress; } + /// + /// Sets the compression options for publishing messages. + /// + /// The compression options to use when publishing messages. + /// The current instance of for method chaining. + /// Thrown when is null. + public QueueAddressPublicationBuilder WithCompression(PublishCompressionOptions compressionOptions) + { + _compressionOptions = compressionOptions ?? throw new ArgumentNullException(nameof(compressionOptions)); + return this; + } + + /// + /// Sets the subject for the message. + /// + /// The subject to set for the message. + /// The current instance of for method chaining. + public QueueAddressPublicationBuilder WithSubject(string subject) + { + _subject = subject; + _subjectSet = true; + return this; + } + + /// + /// Sets the message to be published as a raw message. + /// + /// The current instance of for method chaining. + public QueueAddressPublicationBuilder WithRawMessages() + { + _isRawMessage = true; + return this; + } + /// public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFactory loggerFactory) { @@ -33,13 +73,20 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa logger.LogInformation("Adding SQS publisher for message type '{MessageType}'", typeof(T)); - bus.SerializationRegister.AddSerializer(); + var config = bus.Config; + var compressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions; + var subjectProvider = bus.Config.MessageSubjectProvider; + var subject = _subjectSet ? _subject : subjectProvider.GetSubjectForType(typeof(T)); var eventPublisher = new SqsMessagePublisher( _queueAddress.QueueUrl, proxy.GetAwsClientFactory().GetSqsClient(RegionEndpoint.GetBySystemName(_queueAddress.RegionName)), - bus.SerializationRegister, - loggerFactory); + new OutboundMessageConverter(PublishDestinationType.Queue, bus.MessageBodySerializerFactory.GetSerializer(), new MessageCompressionRegistry([new GzipMessageBodyCompression()]), compressionOptions, subject, _isRawMessage), + loggerFactory) + { + MessageResponseLogger = config.MessageResponseLogger + }; + CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, compressionOptions); bus.AddMessagePublisher(eventPublisher); @@ -48,4 +95,4 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa _queueAddress.QueueUrl, typeof(T)); } -} \ No newline at end of file +} diff --git a/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs index 2e266accc..04f76cbbd 100644 --- a/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueAddressSubscriptionBuilder`1.cs @@ -2,6 +2,10 @@ using Amazon.SQS; using JustSaying.AwsTools; using JustSaying.AwsTools.QueueCreation; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -32,6 +36,7 @@ internal QueueAddressSubscriptionBuilder(QueueAddress queueAddress) private Action MiddlewareConfiguration { get; set; } + private IMessageBodySerializer MessageBodySerializer { get; set; } /// /// Configures the SQS read configuration. @@ -56,6 +61,12 @@ public ISubscriptionBuilder WithMiddlewareConfiguration(Action WithMessageBodySerializer(IMessageBodySerializer messageBodySerializer) + { + MessageBodySerializer = messageBodySerializer; + return this; + } + /// void ISubscriptionBuilder.Configure( JustSayingBus bus, @@ -80,7 +91,12 @@ void ISubscriptionBuilder.Configure( attachedQueueConfig.SubscriptionGroupName ??= queue.QueueName; attachedQueueConfig.Validate(); - bus.AddQueue(attachedQueueConfig.SubscriptionGroupName, queue); + var serializer = MessageBodySerializer ?? bus.MessageBodySerializerFactory.GetSerializer(); + var compressionRegistry = bus.CompressionRegistry; + var messageConverter = new InboundMessageConverter(serializer, compressionRegistry, attachedQueueConfig.RawMessageDelivery); + var sqsSource = new SqsSource { SqsQueue = queue, MessageConverter = messageConverter }; + + bus.AddQueue(attachedQueueConfig.SubscriptionGroupName, sqsSource); logger.LogInformation( "Created SQS queue subscription for '{MessageType}' on '{QueueName}'", diff --git a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs index 88b67771a..d8d5fc289 100644 --- a/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/QueuePublicationBuilder`1.cs @@ -2,6 +2,7 @@ using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.QueueCreation; +using JustSaying.Messaging; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -27,6 +28,8 @@ internal QueuePublicationBuilder() /// private Action ConfigureWrites { get; set; } + private string QueueName { get; set; } = string.Empty; + /// /// Configures the SQS write configuration. /// @@ -72,13 +75,14 @@ public QueuePublicationBuilder WithWriteConfiguration(Action /// Configures the SQS Queue name, rather than using the naming convention. /// - /// The name of the queue to subscribe to. + /// The name of the queue to subscribe to. /// /// The current . /// - public QueuePublicationBuilder WithName(string queueName) + public QueuePublicationBuilder WithQueueName(string name) { - return WithWriteConfiguration(r => r.WithQueueName(queueName)); + QueueName = name ?? throw new ArgumentNullException(nameof(name)); + return this; } /// @@ -95,18 +99,24 @@ void IPublicationBuilder.Configure( var config = bus.Config; var region = config.Region ?? throw new InvalidOperationException($"Config cannot have a blank entry for the {nameof(config.Region)} property."); - var writeConfiguration = new SqsWriteConfiguration(); + var writeConfiguration = new SqsWriteConfiguration + { + QueueName = QueueName + }; ConfigureWrites?.Invoke(writeConfiguration); writeConfiguration.ApplyQueueNamingConvention(config.QueueNamingConvention); - bus.SerializationRegister.AddSerializer(); - var regionEndpoint = RegionEndpoint.GetBySystemName(region); var sqsClient = proxy.GetAwsClientFactory().GetSqsClient(regionEndpoint); + var compressionRegistry = bus.CompressionRegistry; + var compressionOptions = writeConfiguration.CompressionOptions; + var subjectProvider = bus.Config.MessageSubjectProvider; + var subject = subjectProvider.GetSubjectForType(typeof(T)); + var eventPublisher = new SqsMessagePublisher( sqsClient, - bus.SerializationRegister, + new OutboundMessageConverter(PublishDestinationType.Queue, bus.MessageBodySerializerFactory.GetSerializer(), compressionRegistry, compressionOptions, subject, writeConfiguration.IsRawMessage), loggerFactory) { MessageResponseLogger = config.MessageResponseLogger, diff --git a/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs index 84cb978e6..0b8cc4622 100644 --- a/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/QueueSubscriptionBuilder`1.cs @@ -1,5 +1,8 @@ using JustSaying.AwsTools; using JustSaying.AwsTools.QueueCreation; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Models; using JustSaying.Naming; @@ -184,7 +187,9 @@ void ISubscriptionBuilder.Configure( var queue = creator.EnsureQueueExists(region, subscriptionConfig); bus.AddStartupTask(queue.StartupTask); - bus.AddQueue(subscriptionConfig.SubscriptionGroupName, queue.Queue); + var serializer = bus.MessageBodySerializerFactory.GetSerializer(); + var compressionRegistry = bus.CompressionRegistry; + bus.AddQueue(subscriptionConfig.SubscriptionGroupName, new SqsSource { MessageConverter = new InboundMessageConverter(serializer, compressionRegistry, subscriptionConfig.RawMessageDelivery), SqsQueue = queue.Queue }); logger.LogInformation( "Created SQS subscriber for message type '{MessageType}' on queue '{QueueName}'.", diff --git a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs index 9b03895f6..1f157f04a 100644 --- a/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/DefaultServiceResolver.cs @@ -1,4 +1,5 @@ using JustSaying.AwsTools; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using JustSaying.Naming; @@ -42,15 +43,13 @@ private object TryResolveService(Type desiredType) { return new NullOpMessageMonitor(); } - else if (desiredType == typeof(IMessageSerializationFactory)) + else if (desiredType == typeof(IMessageBodySerializationFactory)) { return new NewtonsoftSerializationFactory(); } - else if (desiredType == typeof(IMessageSerializationRegister)) + else if (desiredType == typeof(MessageCompressionRegistry)) { - return new MessageSerializationRegister( - ResolveService(), - ResolveService()); + return new MessageCompressionRegistry([new GzipMessageBodyCompression()]); } else if (desiredType == typeof(IMessageSubjectProvider)) { diff --git a/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs b/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs index 8d3db633a..91a17df25 100644 --- a/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs +++ b/src/JustSaying/Fluent/ServiceResolver/ServiceBuilderServiceResolver.cs @@ -1,7 +1,6 @@ using System.Collections.Concurrent; using JustSaying.AwsTools; using JustSaying.Messaging.MessageHandling; -using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using Microsoft.Extensions.Logging; @@ -42,11 +41,6 @@ private void Build() _serviceLookup[typeof(IMessageMonitor)] = builder.MessageMonitoring(); } - if (builder.SerializationRegister != null) - { - _serviceLookup[typeof(IMessageSerializationRegister)] = builder.SerializationRegister(); - } - if (builder.MessageContextAccessor != null) { _serviceLookup[typeof(IMessageContextAccessor)] = builder.MessageContextAccessor(); diff --git a/src/JustSaying/Fluent/ServicesBuilder.cs b/src/JustSaying/Fluent/ServicesBuilder.cs index 03bfc4cb2..49d85f110 100644 --- a/src/JustSaying/Fluent/ServicesBuilder.cs +++ b/src/JustSaying/Fluent/ServicesBuilder.cs @@ -36,11 +36,6 @@ internal ServicesBuilder(MessagingBusBuilder busBuilder) ///
internal Func MessageMonitoring { get; private set; } - /// - /// Gets or sets a delegate to a method to create the to use. - /// - internal Func SerializationRegister { get; private set; } - /// /// Gets or sets a delegate to a method to create the to use. /// @@ -149,4 +144,4 @@ public ServicesBuilder WithMessageContextAccessor(Func MessageContextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor)); return this; } -} \ No newline at end of file +} diff --git a/src/JustSaying/Fluent/SqsEndpointHelper.cs b/src/JustSaying/Fluent/SqsEndpointHelper.cs new file mode 100644 index 000000000..9b5d637a2 --- /dev/null +++ b/src/JustSaying/Fluent/SqsEndpointHelper.cs @@ -0,0 +1,15 @@ +namespace JustSaying.Fluent; + +internal static class SqsEndpointHelper +{ + public static string GetSqsHostname(string partition, string region) + { + return partition switch + { + "aws-cn" => $"sqs.{region}.amazonaws.com.cn", + "aws-us-gov" => $"sqs.{region}.amazonaws.com", + "aws" => $"sqs.{region}.amazonaws.com", + _ => throw new ArgumentException($"Unknown partition: {partition}", nameof(partition)) + }; + } +} diff --git a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs index 4c7f0ca94..28c1ce498 100644 --- a/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicAddressPublicationBuilder`1.cs @@ -1,6 +1,7 @@ using Amazon; using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; using JustSaying.Models; using Microsoft.Extensions.Logging; @@ -18,6 +19,9 @@ public sealed class TopicAddressPublicationBuilder : IPublicationBuilder private readonly TopicAddress _topicAddress; private Func _exceptionHandler; private Func, bool> _exceptionBatchHandler; + private PublishCompressionOptions _compressionOptions; + private string _subject; + private bool _subjectSet; /// /// Initializes a new instance of the class. @@ -60,6 +64,25 @@ public TopicAddressPublicationBuilder WithExceptionHandler(Func + /// Sets the compression options for publishing messages. + /// + /// The compression options to use when publishing messages. + /// The current instance of for method chaining. + /// Thrown when is null. + public TopicAddressPublicationBuilder WithCompression(PublishCompressionOptions compressionOptions) + { + _compressionOptions = compressionOptions ?? throw new ArgumentNullException(nameof(compressionOptions)); + return this; + } + + public TopicAddressPublicationBuilder WithSubject(string subject) + { + _subject = subject; + _subjectSet = true; + return this; + } + /// public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFactory loggerFactory) { @@ -67,21 +90,23 @@ public void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFa logger.LogInformation("Adding SNS publisher for message type '{MessageType}'", typeof(T)); - var config = bus.Config; var arn = Arn.Parse(_topicAddress.TopicArn); - bus.SerializationRegister.AddSerializer(); + var compressionRegistry = bus.CompressionRegistry; + var compressionOptions = _compressionOptions ?? bus.Config.DefaultCompressionOptions; + var serializer = bus.MessageBodySerializerFactory.GetSerializer(); + var subjectProvider = bus.Config.MessageSubjectProvider; + var subject = _subjectSet ? _subject : subjectProvider.GetSubjectForType(typeof(T)); var eventPublisher = new SnsMessagePublisher( _topicAddress.TopicArn, proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(arn.Region)), - bus.SerializationRegister, + new OutboundMessageConverter(PublishDestinationType.Topic, serializer, compressionRegistry, compressionOptions, subject, true), loggerFactory, - config.MessageSubjectProvider, - _exceptionHandler) - { - HandleBatchException = _exceptionBatchHandler, - }; + _exceptionHandler, + _exceptionBatchHandler); + + CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, compressionOptions); bus.AddMessagePublisher(eventPublisher); diff --git a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs index 4b473afc0..f89f7356d 100644 --- a/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicPublicationBuilder`1.cs @@ -171,6 +171,8 @@ void IPublicationBuilder.Configure( var writeConfiguration = new SnsWriteConfiguration(); ConfigureWrites?.Invoke(writeConfiguration); + writeConfiguration.CompressionOptions ??= bus.Config.DefaultCompressionOptions; + CompressionEncodingValidator.ValidateEncoding(bus.CompressionRegistry, writeConfiguration.CompressionOptions); var client = proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(region)); @@ -189,7 +191,5 @@ StaticPublicationConfiguration BuildConfiguration(string topicName) bus.AddStartupTask(config.StartupTask); bus.AddMessagePublisher(config.Publisher); bus.AddMessageBatchPublisher(config.BatchPublisher); - - bus.SerializationRegister.AddSerializer(); } } diff --git a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs index 977828070..15cc080c0 100644 --- a/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs +++ b/src/JustSaying/Fluent/TopicSubscriptionBuilder`1.cs @@ -1,5 +1,7 @@ using JustSaying.AwsTools; using JustSaying.AwsTools.QueueCreation; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.Middleware; using JustSaying.Models; using JustSaying.Naming; @@ -41,7 +43,6 @@ internal TopicSubscriptionBuilder() private Action MiddlewareConfiguration { get; set; } - /// /// Configures that the will create the topic name that should be used. /// @@ -203,7 +204,15 @@ void ISubscriptionBuilder.Configure( subscriptionConfig); bus.AddStartupTask(queueWithStartup.StartupTask); - bus.AddQueue(subscriptionConfig.SubscriptionGroupName, queueWithStartup.Queue); + var compressionRegistry = bus.CompressionRegistry; + var serializer = bus.MessageBodySerializerFactory.GetSerializer(); + + var sqsSource = new SqsSource + { + SqsQueue = queueWithStartup.Queue, + MessageConverter = new InboundMessageConverter(serializer, compressionRegistry, subscriptionConfig.RawMessageDelivery) + }; + bus.AddQueue(subscriptionConfig.SubscriptionGroupName, sqsSource); logger.LogInformation( "Created SQS topic subscription on topic '{TopicName}' and queue '{QueueName}'.", diff --git a/src/JustSaying/IMessagingConfig.cs b/src/JustSaying/IMessagingConfig.cs index ea029a05f..e6e559209 100644 --- a/src/JustSaying/IMessagingConfig.cs +++ b/src/JustSaying/IMessagingConfig.cs @@ -1,3 +1,4 @@ +using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Naming; @@ -9,5 +10,6 @@ public interface IMessagingConfig : IPublishConfiguration IMessageSubjectProvider MessageSubjectProvider { get; set; } ITopicNamingConvention TopicNamingConvention { get; set; } IQueueNamingConvention QueueNamingConvention { get; set; } + PublishCompressionOptions DefaultCompressionOptions { get; set; } void Validate(); } diff --git a/src/JustSaying/JustSaying.csproj b/src/JustSaying/JustSaying.csproj index edbd7e93b..11e263690 100644 --- a/src/JustSaying/JustSaying.csproj +++ b/src/JustSaying/JustSaying.csproj @@ -10,6 +10,8 @@ + +
@@ -23,4 +25,12 @@ + + + + + + + +
diff --git a/src/JustSaying/JustSayingBus.cs b/src/JustSaying/JustSayingBus.cs index 27de3d998..7a415a619 100644 --- a/src/JustSaying/JustSayingBus.cs +++ b/src/JustSaying/JustSayingBus.cs @@ -1,10 +1,10 @@ using System.Collections.Concurrent; -using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; using JustSaying.Extensions; using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.Interrogation; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; @@ -36,33 +36,25 @@ public sealed class JustSayingBus : IMessagingBus, IMessagePublisher, IMessageBa private readonly IMessageMonitor _monitor; private ISubscriptionGroup SubscriptionGroups { get; set; } - public IMessageSerializationRegister SerializationRegister { get; } internal MiddlewareMap MiddlewareMap { get; } + internal MessageCompressionRegistry CompressionRegistry { get; } + internal IMessageBodySerializationFactory MessageBodySerializerFactory { get; set; } public Task Completion { get; private set; } - public JustSayingBus( + internal JustSayingBus( IMessagingConfig config, - IMessageSerializationRegister serializationRegister, + IMessageBodySerializationFactory serializationFactory, ILoggerFactory loggerFactory, IMessageMonitor monitor) - : this(config, serializationRegister, null, loggerFactory, monitor, config as IPublishBatchConfiguration) + : this(config, serializationFactory, null, loggerFactory, monitor, config as IPublishBatchConfiguration) { } - public JustSayingBus( + internal JustSayingBus( IMessagingConfig config, - IMessageSerializationRegister serializationRegister, - IMessageReceivePauseSignal messageReceivePauseSignal, - ILoggerFactory loggerFactory, - IMessageMonitor monitor) : this(config, serializationRegister, messageReceivePauseSignal, loggerFactory, monitor, config as IPublishBatchConfiguration) - { - } - - public JustSayingBus( - IMessagingConfig config, - IMessageSerializationRegister serializationRegister, + IMessageBodySerializationFactory serializationFactory, IMessageReceivePauseSignal messageReceivePauseSignal, ILoggerFactory loggerFactory, IMessageMonitor monitor, @@ -89,8 +81,9 @@ public JustSayingBus( } } - SerializationRegister = serializationRegister; MiddlewareMap = new MiddlewareMap(); + CompressionRegistry = new MessageCompressionRegistry([new GzipMessageBodyCompression()]); + MessageBodySerializerFactory = serializationFactory; _publishersByType = []; _batchPublishersByType = []; @@ -98,7 +91,17 @@ public JustSayingBus( _defaultSubscriptionGroupSettings = new SubscriptionGroupSettingsBuilder(); } - public void AddQueue(string subscriptionGroup, ISqsQueue queue) + internal JustSayingBus( + IMessagingConfig config, + IMessageBodySerializationFactory serializationFactory, + IMessageReceivePauseSignal messageReceivePauseSignal, + ILoggerFactory loggerFactory, + IMessageMonitor monitor) : this(config, serializationFactory, loggerFactory, monitor) + { + _messageReceivePauseSignal = messageReceivePauseSignal; + } + + internal void AddQueue(string subscriptionGroup, SqsSource queue) { if (string.IsNullOrWhiteSpace(subscriptionGroup)) { @@ -134,7 +137,6 @@ public void SetGroupSettings( public void AddMessageMiddleware(string queueName, HandleMessageMiddleware middleware) where T : Message { - SerializationRegister.AddSerializer(); MiddlewareMap.Add(queueName, middleware); } @@ -206,7 +208,6 @@ public async Task StartAsync(CancellationToken stoppingToken) private async Task RunImplAsync(CancellationToken stoppingToken) { var dispatcher = new MessageDispatcher( - SerializationRegister, _monitor, MiddlewareMap, _loggerFactory); diff --git a/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs b/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs index 2a76eafc6..ccd728404 100644 --- a/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs +++ b/src/JustSaying/Messaging/Channels/Context/IQueueMessageContext.cs @@ -1,4 +1,5 @@ using Amazon.SQS.Model; +using JustSaying.Messaging.MessageSerialization; namespace JustSaying.Messaging.Channels.Context; @@ -22,4 +23,6 @@ public interface IQueueMessageContext : IMessageVisibilityUpdater, IMessageDelet /// Gets the name of the queue that this message was received from. /// string QueueName { get; } -} \ No newline at end of file + + IInboundMessageConverter MessageConverter { get; } +} diff --git a/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs b/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs index 71bfbdad3..3ebdcce11 100644 --- a/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs +++ b/src/JustSaying/Messaging/Channels/Context/QueueMessageContext.cs @@ -1,5 +1,6 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.MessageSerialization; namespace JustSaying.Messaging.Channels.Context; @@ -13,10 +14,12 @@ public sealed class QueueMessageContext : IQueueMessageContext /// /// The to be handled. /// The the message was read from. - internal QueueMessageContext(Message message, SqsQueueReader queueReader) + /// + internal QueueMessageContext(Message message, SqsQueueReader queueReader, IInboundMessageConverter messageConverter) { Message = message ?? throw new ArgumentNullException(nameof(message)); _queueReader = queueReader ?? throw new ArgumentNullException(nameof(queueReader)); + MessageConverter = messageConverter; } /// @@ -28,6 +31,8 @@ internal QueueMessageContext(Message message, SqsQueueReader queueReader) /// public string QueueName => _queueReader.QueueName; + public IInboundMessageConverter MessageConverter { get; } + /// public async Task UpdateMessageVisibilityTimeout(TimeSpan visibilityTimeout, CancellationToken cancellationToken) { @@ -39,4 +44,4 @@ public async Task DeleteMessage(CancellationToken cancellationToken) { await _queueReader.DeleteMessageAsync(Message.ReceiptHandle, cancellationToken).ConfigureAwait(false); } -} \ No newline at end of file +} diff --git a/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs b/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs index 5d53c24ea..eba4a9a62 100644 --- a/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs +++ b/src/JustSaying/Messaging/Channels/Receive/MessageReceiveBuffer.cs @@ -1,8 +1,10 @@ using System.Threading.Channels; using Amazon.SQS; using Amazon.SQS.Model; +using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging.Channels.Context; +using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.Interrogation; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; @@ -37,7 +39,7 @@ public MessageReceiveBuffer( int bufferSize, TimeSpan readTimeout, TimeSpan sqsWaitTime, - ISqsQueue sqsQueue, + SqsSource sqsSource, MiddlewareBase> sqsMiddleware, IMessageReceivePauseSignal messageReceivePauseSignal, IMessageMonitor monitor, @@ -47,8 +49,8 @@ public MessageReceiveBuffer( _bufferSize = bufferSize; _readTimeout = readTimeout; _sqsWaitTime = sqsWaitTime; - if (sqsQueue == null) throw new ArgumentNullException(nameof(sqsQueue)); - _sqsQueueReader = new SqsQueueReader(sqsQueue); + if (sqsSource == null) throw new ArgumentNullException(nameof(sqsSource)); + _sqsQueueReader = new SqsQueueReader(sqsSource.SqsQueue, sqsSource.MessageConverter); _sqsMiddleware = sqsMiddleware ?? throw new ArgumentNullException(nameof(sqsMiddleware)); _messageReceivePauseSignal = messageReceivePauseSignal; _monitor = monitor ?? throw new ArgumentNullException(nameof(monitor)); @@ -142,8 +144,6 @@ private async Task> GetMessagesAsync(int count, CancellationToken RegionName = _sqsQueueReader.RegionSystemName, }; - _requestMessageAttributeNames.Add("content"); - messages = await _sqsMiddleware.RunAsync(context, async ct => await _sqsQueueReader diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SqsSource.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SqsSource.cs new file mode 100644 index 000000000..9c3799a26 --- /dev/null +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SqsSource.cs @@ -0,0 +1,9 @@ +using JustSaying.AwsTools.MessageHandling; + +namespace JustSaying.Messaging.Channels.SubscriptionGroups; + +public sealed class SqsSource +{ + public ISqsQueue SqsQueue { get; set; } + public IInboundMessageConverter MessageConverter { get; set; } +} diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupConfigBuilder.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupConfigBuilder.cs index 0107620c4..b906288ee 100644 --- a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupConfigBuilder.cs +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupConfigBuilder.cs @@ -15,7 +15,7 @@ namespace JustSaying.Messaging.Channels.SubscriptionGroups; /// The name of the subscription group. public class SubscriptionGroupConfigBuilder(string groupName) { - private readonly List _sqsQueues = []; + private readonly List _sqsSources = []; private readonly string _groupName = groupName ?? throw new ArgumentNullException(nameof(groupName)); private int? _bufferSize; @@ -30,10 +30,10 @@ public class SubscriptionGroupConfigBuilder(string groupName) /// /// The queue to be consumed, assumed to already be created and ready. /// This builder object. - public SubscriptionGroupConfigBuilder AddQueue(ISqsQueue sqsQueue) + internal SubscriptionGroupConfigBuilder AddQueue(SqsSource sqsQueue) { if (sqsQueue == null) throw new ArgumentNullException(nameof(sqsQueue)); - _sqsQueues.Add(sqsQueue); + _sqsSources.Add(sqsQueue); return this; } @@ -42,10 +42,10 @@ public SubscriptionGroupConfigBuilder AddQueue(ISqsQueue sqsQueue) /// /// The queues to be consumed, assumed to already be created and ready. /// This builder object. - public SubscriptionGroupConfigBuilder AddQueues(IEnumerable sqsQueues) + internal SubscriptionGroupConfigBuilder AddQueues(IEnumerable sqsQueues) { if (sqsQueues == null) throw new ArgumentNullException(nameof(sqsQueues)); - _sqsQueues.AddRange(sqsQueues); + _sqsSources.AddRange(sqsQueues); return this; } @@ -138,7 +138,7 @@ public SubscriptionGroupSettings Build(SubscriptionGroupSettingsBuilder defaults _receiveMessagesWaitTime ?? defaults.ReceiveMessagesWaitTime, _multiplexerCapacity ?? defaults.MultiplexerCapacity, _prefetch ?? defaults.Prefetch, - _sqsQueues); + _sqsSources); settings.Validate(); diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs index bb3dcc5c3..88141aa3b 100644 --- a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupFactory.cs @@ -15,7 +15,7 @@ namespace JustSaying.Messaging.Channels.SubscriptionGroups; /// /// Builds 's from the various components required. /// -public class SubscriptionGroupFactory : ISubscriptionGroupFactory +internal sealed class SubscriptionGroupFactory : ISubscriptionGroupFactory { private readonly IMessageDispatcher _messageDispatcher; private readonly IMessageReceivePauseSignal _messageReceivePauseSignal; @@ -29,7 +29,7 @@ public class SubscriptionGroupFactory : ISubscriptionGroupFactory /// The to use to dispatch messages. /// The used by the . /// The to use. - public SubscriptionGroupFactory( + private SubscriptionGroupFactory( IMessageDispatcher messageDispatcher, IMessageMonitor monitor, ILoggerFactory loggerFactory) @@ -111,7 +111,7 @@ private List CreateBuffers( var logger = _loggerFactory.CreateLogger(); - foreach (ISqsQueue queue in subscriptionGroupSettings.Queues) + foreach (SqsSource queue in subscriptionGroupSettings.QueueSources) { var buffer = new MessageReceiveBuffer( subscriptionGroupSettings.Prefetch, diff --git a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs index 7e7bfc5cc..c6ab469a8 100644 --- a/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs +++ b/src/JustSaying/Messaging/Channels/SubscriptionGroups/SubscriptionGroupSettings.cs @@ -16,7 +16,7 @@ internal SubscriptionGroupSettings( TimeSpan receiveMessagesWaitTime, int multiplexerCapacity, int prefetch, - IReadOnlyCollection queues) + IReadOnlyCollection queueSources) { ConcurrencyLimit = concurrencyLimit; BufferSize = bufferSize; @@ -24,7 +24,7 @@ internal SubscriptionGroupSettings( ReceiveMessagesWaitTime = receiveMessagesWaitTime; MultiplexerCapacity = multiplexerCapacity; Prefetch = prefetch; - Queues = queues; + QueueSources = queueSources; Name = name; } @@ -67,5 +67,5 @@ internal SubscriptionGroupSettings( /// /// A collection of to read messages from. /// - public IReadOnlyCollection Queues { get; } + public IReadOnlyCollection QueueSources { get; } } diff --git a/src/JustSaying/Messaging/Compression/ContentEncodings.cs b/src/JustSaying/Messaging/Compression/ContentEncodings.cs new file mode 100644 index 000000000..075371799 --- /dev/null +++ b/src/JustSaying/Messaging/Compression/ContentEncodings.cs @@ -0,0 +1,17 @@ +namespace JustSaying.Messaging.Compression; + +/// +/// Provides constant values for various content encodings used in message body compression. +/// +/// +/// This class contains predefined string constants representing different content encoding schemes. +/// These constants can be used to ensure consistency and avoid typos when specifying +/// content encodings throughout the application. +/// +public static class ContentEncodings +{ + /// + /// Represents the gzip,base64 content encoding. + /// + public const string GzipBase64 = "gzip,base64"; +} diff --git a/src/JustSaying/Messaging/Compression/GzipMessageBodyCompression.cs b/src/JustSaying/Messaging/Compression/GzipMessageBodyCompression.cs new file mode 100644 index 000000000..de48bfb94 --- /dev/null +++ b/src/JustSaying/Messaging/Compression/GzipMessageBodyCompression.cs @@ -0,0 +1,48 @@ +using System.IO.Compression; +using System.Text; + +namespace JustSaying.Messaging.Compression; + +/// +/// Implements GZIP compression and Base64 encoding for message bodies. +/// +public sealed class GzipMessageBodyCompression : IMessageBodyCompression +{ + /// + /// Gets the content encoding identifier for GZIP compression with Base64 encoding. + /// + public string ContentEncoding => ContentEncodings.GzipBase64; + + /// + /// Gets the content encoding identifier for GZIP compression with Base64 encoding. + /// + public string Compress(string messageBody) + { + var contentBytes = Encoding.UTF8.GetBytes(messageBody); + using var compressedStream = new MemoryStream(); + using (var gZipStream = new GZipStream(compressedStream, CompressionMode.Compress)) + { + gZipStream.Write(contentBytes, 0, contentBytes.Length); + } + + return Convert.ToBase64String(compressedStream.ToArray()); + } + + /// + /// Decodes the Base64 string and decompresses the message body using GZIP. + /// + /// The Base64 encoded and compressed message body to decompress. + /// The decompressed message body as a string. + public string Decompress(string messageBody) + { + var compressedBytes = Convert.FromBase64String(messageBody); + using var inputStream = new MemoryStream(compressedBytes); + using var outputStream = new MemoryStream(); + using (var gZipStream = new GZipStream(inputStream, CompressionMode.Decompress)) + { + gZipStream.CopyTo(outputStream); + } + + return Encoding.UTF8.GetString(outputStream.ToArray()); + } +} diff --git a/src/JustSaying/Messaging/Compression/IMessageBodyCompression.cs b/src/JustSaying/Messaging/Compression/IMessageBodyCompression.cs new file mode 100644 index 000000000..c53b1840d --- /dev/null +++ b/src/JustSaying/Messaging/Compression/IMessageBodyCompression.cs @@ -0,0 +1,26 @@ +namespace JustSaying.Messaging.Compression; + +/// +/// Defines the contract for message body compression operations. +/// +public interface IMessageBodyCompression +{ + /// + /// Gets the content encoding identifier for this compression method. + /// + string ContentEncoding { get; } + + /// + /// Compresses the given message body. + /// + /// The message body to compress. + /// The compressed message body as a string. + string Compress(string messageBody); + + /// + /// Decompresses the given message body. + /// + /// The compressed message body to decompress. + /// The decompressed message body as a string. + string Decompress(string messageBody); +} diff --git a/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs new file mode 100644 index 000000000..1c200c7be --- /dev/null +++ b/src/JustSaying/Messaging/Compression/MessageCompressionRegistry.cs @@ -0,0 +1,28 @@ +namespace JustSaying.Messaging.Compression; + +/// +/// Implements a registry for message compression methods. +/// +public sealed class MessageCompressionRegistry +{ + private readonly IList _compressions; + + /// + /// Initializes a new instance of the class. + /// + /// A list of available compression methods. + public MessageCompressionRegistry(IList compressions = null) + { + _compressions = compressions ?? []; + } + + /// + /// Retrieves the appropriate compression method based on the content encoding. + /// + /// The content encoding identifier. + /// An instance for the specified encoding, or null if not found. + public IMessageBodyCompression GetCompression(string contentEncoding) + { + return _compressions.FirstOrDefault(x => string.Equals(x.ContentEncoding, contentEncoding, StringComparison.OrdinalIgnoreCase)); + } +} diff --git a/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs b/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs index aea001e35..15b6a6c66 100644 --- a/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs +++ b/src/JustSaying/Messaging/MessageHandling/MessageAttributes.cs @@ -16,4 +16,11 @@ public MessageAttributes() public MessageAttributeValue Get(string value) => _attributes.TryGetValue(value, out MessageAttributeValue result) ? result : null; + + /// + /// Gets all available attribute keys. + /// + /// An of strings representing all attribute keys. + public IReadOnlyCollection GetKeys() + => _attributes.Keys; } diff --git a/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs b/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs index 0be4d9174..b3e9e9b48 100644 --- a/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs +++ b/src/JustSaying/Messaging/MessageSerialization/GenericMessageSubjectProvider.cs @@ -1,4 +1,3 @@ -using System.Reflection; using System.Text.RegularExpressions; using JustSaying.Extensions; @@ -15,7 +14,7 @@ public class GenericMessageSubjectProvider : IMessageSubjectProvider private static IEnumerable Flatten(Type type) { yield return type; - foreach (var inner in type.GetTypeInfo().GetGenericArguments().SelectMany(Flatten)) + foreach (var inner in type.GetGenericArguments().SelectMany(Flatten)) { yield return inner; } diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs deleted file mode 100644 index f20f2dd7e..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialisationRegister.cs +++ /dev/null @@ -1,33 +0,0 @@ -using JustSaying.Messaging.MessageHandling; -using JustSaying.Models; - -namespace JustSaying.Messaging.MessageSerialization; - -public interface IMessageSerializationRegister -{ - /// - /// Deserializes a message. - /// - /// Message must always have Subject and Message properties - /// The and - /// returned from the body of the SQS message. - MessageWithAttributes DeserializeMessage(string body); - - /// - /// Serializes a message for publishing - /// - /// - /// If set to false, then message will be wrapped in extra object with Subject and Message fields, e.g.: - /// new { Subject = message.GetType().Name, Message = serializedMessage }; - /// - /// AWS SNS service adds these automatically, so for publishing to topics don't add these properties - /// - /// The serialized message for publishing. - string Serialize(Message message, bool serializeForSnsPublishing); - - /// - /// Register a serializer for the given type, if one does not already exist. - /// - /// The type to register a serializer for. - void AddSerializer() where T : Message; -} \ No newline at end of file diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs index d0f7b10a2..57ff5d149 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerialiser.cs @@ -1,25 +1,23 @@ -using JustSaying.Messaging.MessageHandling; using JustSaying.Models; namespace JustSaying.Messaging.MessageSerialization; -public interface IMessageSerializer +/// +/// Defines the contract for serializing and deserializing message bodies. +/// +public interface IMessageBodySerializer { - string GetMessageSubject(string sqsMessage); - - MessageAttributes GetMessageAttributes(string message); - - Message Deserialize(string message, Type type); + /// + /// Serializes a message into a string representation. + /// + /// The message to serialize. + /// A string representation of the serialized message. + string Serialize(Message message); /// - /// Serializes a message for publishing + /// Deserializes a string representation back into a message object. /// - /// - /// If set to false, then message will be wrapped in extra object with Subject and Message fields, e.g.: - /// new { Subject = subject, Message = serializedMessage }; - /// - /// AWS SNS service adds these automatically, so for publishing to topics don't add these properties - /// - /// - string Serialize(Message message, bool serializeForSnsPublishing, string subject); -} \ No newline at end of file + /// The string representation of the message to deserialize. + /// The deserialized message object. + Message Deserialize(string message); +} diff --git a/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs index cad232cea..6bcdbc314 100644 --- a/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/IMessageSerializationFactory.cs @@ -2,7 +2,15 @@ namespace JustSaying.Messaging.MessageSerialization; -public interface IMessageSerializationFactory +/// +/// Defines a factory for creating message body serializers. +/// +public interface IMessageBodySerializationFactory { - IMessageSerializer GetSerializer() where T : Message; -} \ No newline at end of file + /// + /// Gets a serializer for messages of type . + /// + /// The type of message for which to get a serializer. Must inherit from . + /// An capable of serializing and deserializing messages of type . + IMessageBodySerializer GetSerializer() where T : Message; +} diff --git a/src/JustSaying/Messaging/MessageSerialization/MessageWithAttributes.cs b/src/JustSaying/Messaging/MessageSerialization/InboundMessage.cs similarity index 71% rename from src/JustSaying/Messaging/MessageSerialization/MessageWithAttributes.cs rename to src/JustSaying/Messaging/MessageSerialization/InboundMessage.cs index d57fdaac1..19493fc45 100644 --- a/src/JustSaying/Messaging/MessageSerialization/MessageWithAttributes.cs +++ b/src/JustSaying/Messaging/MessageSerialization/InboundMessage.cs @@ -6,7 +6,7 @@ namespace JustSaying.Messaging.MessageSerialization; /// /// Represents a deserialized message with attributes. /// -public class MessageWithAttributes(Message message, MessageAttributes messageAttributes) +public sealed class InboundMessage(Message message, MessageAttributes messageAttributes) { /// /// Gets the message that was extracted from a message body. @@ -17,4 +17,10 @@ public class MessageWithAttributes(Message message, MessageAttributes messageAtt /// Gets the attributes that were extracted from a message body. /// public MessageAttributes MessageAttributes { get; } = messageAttributes; + + public void Deconstruct(out Message message, out MessageAttributes attributes) + { + message = Message; + attributes = MessageAttributes; + } } diff --git a/src/JustSaying/Messaging/MessageSerialization/MessageAttributeParser.cs b/src/JustSaying/Messaging/MessageSerialization/MessageAttributeParser.cs deleted file mode 100644 index c47cf9b94..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/MessageAttributeParser.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace JustSaying.Messaging.MessageSerialization; - -internal static class MessageAttributeParser -{ - public static MessageAttributeValue Parse(string dataType, string dataValue) - { - // Check for a prefix instead of an exact match as SQS supports custom-type labels, or example, "Binary.gif". - // See https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-metadata.html#sqs-message-attributes. - bool isBinary = dataType?.StartsWith("Binary", StringComparison.Ordinal) is true; - - return new() - { - DataType = dataType, - StringValue = !isBinary ? dataValue : null, - BinaryValue = isBinary ? Convert.FromBase64String(dataValue) : null - }; - } -} diff --git a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs b/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs deleted file mode 100644 index 3fa3fb4b9..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/MessageSerializationRegister.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.Collections.Concurrent; -using JustSaying.Models; - -namespace JustSaying.Messaging.MessageSerialization; - -public class MessageSerializationRegister( - IMessageSubjectProvider messageSubjectProvider, - IMessageSerializationFactory serializationFactory) : IMessageSerializationRegister -{ - private readonly IMessageSubjectProvider _messageSubjectProvider = messageSubjectProvider ?? throw new ArgumentNullException(nameof(messageSubjectProvider)); - private readonly IMessageSerializationFactory _serializationFactory = serializationFactory; - private readonly ConcurrentDictionary> _typeSerializersBySubject = new(StringComparer.OrdinalIgnoreCase); - private readonly HashSet _messageSerializers = new(); - - public void AddSerializer() where T : Message - { - string key = _messageSubjectProvider.GetSubjectForType(typeof(T)); - - var typeSerializer = _typeSerializersBySubject.GetOrAdd(key, - _ => new Lazy( - () => new TypeSerializer(typeof(T), _serializationFactory.GetSerializer()) - ) - ).Value; - - _messageSerializers.Add(typeSerializer.Serializer); - } - - public MessageWithAttributes DeserializeMessage(string body) - { - // TODO Can we remove this loop rather than try each serializer? - foreach (var messageSerializer in _messageSerializers) - { - string messageSubject = messageSerializer.GetMessageSubject(body); // Custom serializer pulls this from cloud event type - - if (string.IsNullOrWhiteSpace(messageSubject)) - { - continue; - } - - if (!_typeSerializersBySubject.TryGetValue(messageSubject, out var lazyTypeSerializer)) - { - continue; - } - - TypeSerializer typeSerializer = lazyTypeSerializer.Value; - var attributes = typeSerializer.Serializer.GetMessageAttributes(body); - var message = typeSerializer.Serializer.Deserialize(body, typeSerializer.Type); - return new MessageWithAttributes(message, attributes); - } - - var exception = new MessageFormatNotSupportedException("Message can not be handled - type undetermined."); - - // Put the message's body into the exception data so anyone catching - // it can inspect it for other purposes, such as for logging. - exception.Data["MessageBody"] = body; - - throw exception; - } - - public string Serialize(Message message, bool serializeForSnsPublishing) - { - var messageType = message.GetType(); - string subject = _messageSubjectProvider.GetSubjectForType(messageType); - - if (!_typeSerializersBySubject.TryGetValue(subject, out var lazyTypeSerializer)) - { - throw new MessageFormatNotSupportedException($"Failed to serialize message of type {messageType} because it is not registered for serialization."); - } - - var typeSerializer = lazyTypeSerializer.Value; - IMessageSerializer messageSerializer = typeSerializer.Serializer; - return messageSerializer.Serialize(message, serializeForSnsPublishing, subject); - } -} diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftMessageBodySerializer`1.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftMessageBodySerializer`1.cs new file mode 100644 index 000000000..53485b2fe --- /dev/null +++ b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftMessageBodySerializer`1.cs @@ -0,0 +1,61 @@ +using JustSaying.Models; +using Newtonsoft.Json; + +namespace JustSaying.Messaging.MessageSerialization; + +/// +/// Provides serialization and deserialization functionality for messages of type using Newtonsoft.Json. +/// +/// The type of message to be serialized or deserialized. Must inherit from . +public sealed class NewtonsoftMessageBodySerializer : IMessageBodySerializer where T: Message +{ + private readonly JsonSerializerSettings _settings; + + /// + /// Initializes a new instance of the class with default JSON serializer settings. + /// + /// + /// Default settings include: + /// + /// Ignoring null values when serializing. + /// Using a for enum serialization. + /// + /// + public NewtonsoftMessageBodySerializer() + { + _settings = new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + Converters = [new Newtonsoft.Json.Converters.StringEnumConverter()] + }; + } + + /// + /// Initializes a new instance of the class with custom JSON serializer settings. + /// + /// The custom to use for serialization and deserialization. + public NewtonsoftMessageBodySerializer(JsonSerializerSettings settings) + { + _settings = settings; + } + + /// + /// Serializes a message to its JSON string representation. + /// + /// The message to serialize. + /// A JSON string representation of the message. + public string Serialize(Message message) + { + return JsonConvert.SerializeObject(message, _settings); + } + + /// + /// Deserializes a JSON string to a message of type . + /// + /// The JSON string to deserialize. + /// A deserialized message of type . + public Message Deserialize(string message) + { + return JsonConvert.DeserializeObject(message, _settings); + } +} diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs index da7ebbe97..9c71b418a 100644 --- a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializationFactory.cs @@ -1,16 +1,12 @@ +using System.Collections.Concurrent; using JustSaying.Models; using Newtonsoft.Json; namespace JustSaying.Messaging.MessageSerialization; -public class NewtonsoftSerializationFactory(JsonSerializerSettings settings) : IMessageSerializationFactory +public sealed class NewtonsoftSerializationFactory(JsonSerializerSettings settings = null) : IMessageBodySerializationFactory { - private readonly NewtonsoftSerializer _serializer = new(settings); + private readonly ConcurrentDictionary _cache = new(); - public NewtonsoftSerializationFactory() - : this(null) - { - } - - public IMessageSerializer GetSerializer() where T : Message => _serializer; + public IMessageBodySerializer GetSerializer() where T : Message => _cache.GetOrAdd(typeof(T), _ => new NewtonsoftMessageBodySerializer(settings)); } diff --git a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs deleted file mode 100644 index 8ceeece1c..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/NewtonsoftSerializer.cs +++ /dev/null @@ -1,88 +0,0 @@ -using JustSaying.Messaging.MessageHandling; -using JustSaying.Models; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace JustSaying.Messaging.MessageSerialization; - -public class NewtonsoftSerializer : IMessageSerializer -{ - private readonly JsonSerializerSettings _settings; - - public NewtonsoftSerializer() - : this(null) - { - } - - public NewtonsoftSerializer(JsonSerializerSettings settings) - { - settings ??= new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Ignore, - Converters = [new Newtonsoft.Json.Converters.StringEnumConverter()] - }; - - _settings = settings; - } - - public Message Deserialize(string message, Type type) - { - var document = JObject.Parse(message); - string json = document["Message"].ToString(); - - return (Message)JsonConvert.DeserializeObject(json, type, _settings); - } - - public string Serialize(Message message, bool serializeForSnsPublishing, string subject) - { - var json = JsonConvert.SerializeObject(message, _settings); - - // AWS SNS service will add Subject and Message properties automatically, - // so just return plain message - if (serializeForSnsPublishing) - { - return json; - } - - // For direct publishing to SQS, add Subject and Message properties manually - var context = new { Subject = subject, Message = json }; - return JsonConvert.SerializeObject(context, _settings); - } - - public MessageAttributes GetMessageAttributes(string message) - { - var props = JObject.Parse(message).Value("MessageAttributes")?.Properties(); - if (props == null) - { - return new MessageAttributes(); - } - - var attributes = new Dictionary(); - - foreach (var property in props) - { - if (property.Value is not { } propertyValue) - { - continue; - } - - var dataType = propertyValue["Type"].ToString(); - var dataValue = propertyValue["Value"].ToString(); - - attributes.Add(property.Name, MessageAttributeParser.Parse(dataType, dataValue)); - } - - return new MessageAttributes(attributes); - } - - public string GetMessageSubject(string sqsMessage) - { - if (string.IsNullOrWhiteSpace(sqsMessage)) - { - return string.Empty; - } - - var body = JObject.Parse(sqsMessage); - return body.Value("Subject") ?? string.Empty; - } -} diff --git a/src/JustSaying/Messaging/MessageSerialization/OutboundMessage.cs b/src/JustSaying/Messaging/MessageSerialization/OutboundMessage.cs new file mode 100644 index 000000000..16f808c4a --- /dev/null +++ b/src/JustSaying/Messaging/MessageSerialization/OutboundMessage.cs @@ -0,0 +1,22 @@ +namespace JustSaying.Messaging.MessageSerialization; + +public sealed class OutboundMessage +{ + public OutboundMessage(string body, Dictionary messageAttributes, string subject) + { + Body = body; + MessageAttributes = messageAttributes; + Subject = subject; + } + + public string Body { get; } + public Dictionary MessageAttributes { get; } + public string Subject { get; } + + public void Deconstruct(out string body, out Dictionary attributes, out string subject) + { + body = Body; + attributes = MessageAttributes; + subject = Subject; + } +} diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs new file mode 100644 index 000000000..3d5505313 --- /dev/null +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer.cs @@ -0,0 +1,26 @@ +namespace JustSaying.Messaging.MessageSerialization; + +using System.Text.Json; +using System.Text.Json.Serialization; + +public static class SystemTextJsonMessageBodySerializer +{ + /// + /// Gets the default JSON serializer options used by derived serializers. + /// + /// + /// These options include: + /// + /// Ignoring null values when writing JSON. + /// Using a for enum serialization. + /// + /// + public static JsonSerializerOptions DefaultJsonSerializerOptions { get; } = new() + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + Converters = + { + new JsonStringEnumConverter(), + }, + }; +} diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer`1.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer`1.cs new file mode 100644 index 000000000..324fa772b --- /dev/null +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonMessageBodySerializer`1.cs @@ -0,0 +1,42 @@ +using System.Text.Json; +using JustSaying.Models; + +namespace JustSaying.Messaging.MessageSerialization; + +/// +/// Provides serialization and deserialization functionality for messages of type using System.Text.Json. +/// +/// The type of message to be serialized or deserialized. Must inherit from . +public sealed class SystemTextJsonMessageBodySerializer : IMessageBodySerializer where T: Message +{ + private readonly JsonSerializerOptions _options; + + /// + /// Initializes a new instance of the class with custom JSON serializer options. + /// + /// The custom to use for serialization and deserialization. + public SystemTextJsonMessageBodySerializer(JsonSerializerOptions options) + { + _options = options; + } + + /// + /// Serializes a message to its JSON string representation. + /// + /// The message to serialize. + /// A JSON string representation of the message. + public string Serialize(Message message) + { + return JsonSerializer.Serialize(message, message.GetType(), _options); + } + + /// + /// Deserializes a JSON string to a message of type . + /// + /// The JSON string to deserialize. + /// A deserialized message of type . + public Message Deserialize(string messageBody) + { + return JsonSerializer.Deserialize(messageBody, _options); + } +} diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs index 023957b78..090b4844d 100644 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs +++ b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializationFactory.cs @@ -1,16 +1,12 @@ +using System.Collections.Concurrent; using System.Text.Json; using JustSaying.Models; namespace JustSaying.Messaging.MessageSerialization; -public class SystemTextJsonSerializationFactory(JsonSerializerOptions options) : IMessageSerializationFactory +public sealed class SystemTextJsonSerializationFactory(JsonSerializerOptions options) : IMessageBodySerializationFactory { - private readonly SystemTextJsonSerializer _serializer = new(options); + private readonly ConcurrentDictionary _cache = new(); - public SystemTextJsonSerializationFactory() - : this(null) - { - } - - public IMessageSerializer GetSerializer() where T : Message => _serializer; + public IMessageBodySerializer GetSerializer() where T : Message => _cache.GetOrAdd(typeof(T), _ => new SystemTextJsonMessageBodySerializer(options)); } diff --git a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs deleted file mode 100644 index 7a2d04daa..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/SystemTextJsonSerializer.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System.Text.Json; -using System.Text.Json.Serialization; -using JustSaying.Messaging.MessageHandling; -using JustSaying.Models; - -namespace JustSaying.Messaging.MessageSerialization; - -/// -/// A class representing an implementation of for the System.Text.Json serializer. -/// -public class SystemTextJsonSerializer : IMessageSerializer -{ - private static readonly JsonSerializerOptions DefaultJsonSerializerOptions = new() - { -#if NET8_0_OR_GREATER - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, -#else - IgnoreNullValues = true, -#endif - Converters = - { - new JsonStringEnumConverter(), - }, - }; - - private readonly JsonSerializerOptions _options; - - /// - /// Initializes a new instance of the class. - /// - public SystemTextJsonSerializer() - : this(null) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The optional to use. - public SystemTextJsonSerializer(JsonSerializerOptions options) - { - _options = options ?? DefaultJsonSerializerOptions; - } - - /// - public string GetMessageSubject(string sqsMessage) - { - using var body = JsonDocument.Parse(sqsMessage); - string subject = string.Empty; - - if (body.RootElement.TryGetProperty("Subject", out var value)) - { - subject = value.GetString() ?? string.Empty; - } - - return subject; - } - - public MessageAttributes GetMessageAttributes(string message) - { - var jsonDocument = JsonDocument.Parse(message); - - if (!jsonDocument.RootElement.TryGetProperty("MessageAttributes", out var attributesElement)) - { - return new MessageAttributes(); - } - - var attributes = new Dictionary(); - foreach (var property in attributesElement.EnumerateObject()) - { - var dataType = property.Value.GetProperty("Type").GetString(); - var dataValue = property.Value.GetProperty("Value").GetString(); - - attributes.Add(property.Name, MessageAttributeParser.Parse(dataType, dataValue)); - } - - return new MessageAttributes(attributes); - } - - /// - public Message Deserialize(string message, Type type) - { - using var document = JsonDocument.Parse(message); - JsonElement element = document.RootElement.GetProperty("Message"); - string json = element.ToString(); - - return (Message)JsonSerializer.Deserialize(json, type, _options); - } - - /// - public string Serialize(Message message, bool serializeForSnsPublishing, string subject) - { - string json = JsonSerializer.Serialize(message, message.GetType(), _options); - - // AWS SNS service will add Subject and Message properties automatically, - // so just return plain message - if (serializeForSnsPublishing) - { - return json; - } - - // For direct publishing to SQS, add Subject and Message properties manually - var context = new { Subject = subject, Message = json }; - return JsonSerializer.Serialize(context, _options); - } -} diff --git a/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs b/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs deleted file mode 100644 index 6f116d7b9..000000000 --- a/src/JustSaying/Messaging/MessageSerialization/TypeSerializer.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace JustSaying.Messaging.MessageSerialization; - -public class TypeSerializer(Type type, IMessageSerializer serializer) -{ - public Type Type { get; private set; } = type; - public IMessageSerializer Serializer { get; private set; } = serializer; -} diff --git a/src/JustSaying/Messaging/Middleware/ErrorHandling/ErrorHandlerMiddleware.cs b/src/JustSaying/Messaging/Middleware/ErrorHandling/ErrorHandlerMiddleware.cs index 1970a07c1..44d5dc7df 100644 --- a/src/JustSaying/Messaging/Middleware/ErrorHandling/ErrorHandlerMiddleware.cs +++ b/src/JustSaying/Messaging/Middleware/ErrorHandling/ErrorHandlerMiddleware.cs @@ -22,6 +22,11 @@ protected override async Task RunInnerAsync(HandleMessageContext context, { return await func(stoppingToken).ConfigureAwait(false); } + catch (OperationCanceledException) + { + // Do not log OperationCanceledException + return false; + } catch (Exception e) { _monitor.HandleException(context.MessageType); diff --git a/src/JustSaying/Messaging/Middleware/Handle/HandlerMiddlewareBuilder.cs b/src/JustSaying/Messaging/Middleware/Handle/HandlerMiddlewareBuilder.cs index 77c07c11b..7cbaafe9d 100644 --- a/src/JustSaying/Messaging/Middleware/Handle/HandlerMiddlewareBuilder.cs +++ b/src/JustSaying/Messaging/Middleware/Handle/HandlerMiddlewareBuilder.cs @@ -108,7 +108,6 @@ public HandlerMiddlewareBuilder UseHandler() where TMessage : Message /// An that customises /// the pipeline. /// - public HandlerMiddlewareBuilder Configure( Action configure) { diff --git a/src/JustSaying/Messaging/PublishMetadata.cs b/src/JustSaying/Messaging/PublishMetadata.cs index cde53e33a..b1b499fbf 100644 --- a/src/JustSaying/Messaging/PublishMetadata.cs +++ b/src/JustSaying/Messaging/PublishMetadata.cs @@ -16,7 +16,7 @@ public PublishMetadata AddMessageAttribute(string key, IReadOnlyCollection DataType = "Binary" }; - MessageAttributes[key] = mav; + AddMessageAttribute(key, mav); return this; } diff --git a/src/JustSaying/MessagingBusBuilder.cs b/src/JustSaying/MessagingBusBuilder.cs index 138bbe85e..eb2c11c77 100644 --- a/src/JustSaying/MessagingBusBuilder.cs +++ b/src/JustSaying/MessagingBusBuilder.cs @@ -277,11 +277,11 @@ public IMessagingBus BuildSubscribers() private JustSayingBus CreateBus(IMessagingConfig config, ILoggerFactory loggerFactory, IPublishBatchConfiguration publishBatchConfiguration = null) { - IMessageSerializationRegister register = ServiceResolver.ResolveService(); + IMessageBodySerializationFactory serializationFactory = ServiceResolver.ResolveService(); IMessageReceivePauseSignal messageReceivePauseSignal = ServiceResolver.ResolveService(); IMessageMonitor monitor = ServiceResolver.ResolveOptionalService() ?? new NullOpMessageMonitor(); - return new JustSayingBus(config, register, messageReceivePauseSignal, loggerFactory, monitor, publishBatchConfiguration); + return new JustSayingBus(config, serializationFactory, messageReceivePauseSignal, loggerFactory, monitor, publishBatchConfiguration); } private IAwsClientFactoryProxy CreateFactoryProxy() diff --git a/src/JustSaying/MessagingConfig.cs b/src/JustSaying/MessagingConfig.cs index f7a1404b5..bec14ea19 100644 --- a/src/JustSaying/MessagingConfig.cs +++ b/src/JustSaying/MessagingConfig.cs @@ -16,6 +16,7 @@ public MessagingConfig() MessageSubjectProvider = new NonGenericMessageSubjectProvider(); TopicNamingConvention = new DefaultNamingConventions(); QueueNamingConvention = new DefaultNamingConventions(); + DefaultCompressionOptions = new PublishCompressionOptions(); } public int PublishFailureReAttempts { get; set; } @@ -27,6 +28,7 @@ public MessagingConfig() public IMessageSubjectProvider MessageSubjectProvider { get; set; } public ITopicNamingConvention TopicNamingConvention { get; set; } public IQueueNamingConvention QueueNamingConvention { get; set; } + public PublishCompressionOptions DefaultCompressionOptions { get; set; } public virtual void Validate() { diff --git a/src/JustSaying/Naming/DefaultNamingConventions.cs b/src/JustSaying/Naming/DefaultNamingConventions.cs index 8eb9fbd89..e89245021 100644 --- a/src/JustSaying/Naming/DefaultNamingConventions.cs +++ b/src/JustSaying/Naming/DefaultNamingConventions.cs @@ -51,7 +51,7 @@ private static string GetTypeFriendlyName(Type type) return friendlyName; } - if (type.GetTypeInfo().IsGenericType) + if (type.IsGenericType) { var indexOfBacktick = friendlyName.IndexOf('`'); diff --git a/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt new file mode 100644 index 000000000..329b99311 --- /dev/null +++ b/src/JustSaying/PublicAPI/PublicAPI.Shipped.txt @@ -0,0 +1,735 @@ +abstract JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary +abstract JustSaying.Messaging.Middleware.MiddlewareBase.RunInnerAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +const JustSaying.AwsTools.JustSayingConstants.AttributeArn = "QueueArn" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeDeliveryDelay = "DelaySeconds" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyId = "KmsMasterKeyId" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyReusePeriodSecondId = "KmsDataKeyReusePeriodSeconds" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributePolicy = "Policy" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeRedrivePolicy = "RedrivePolicy" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeRetentionPeriod = "MessageRetentionPeriod" -> string +const JustSaying.AwsTools.JustSayingConstants.AttributeVisibilityTimeout = "VisibilityTimeout" -> string +JustSaying.AwsTools.AwsClientFactoryProxy +JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy() -> void +JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Func awsClientFactoryFunc) -> void +JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Lazy factory) -> void +JustSaying.AwsTools.AwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory +JustSaying.AwsTools.AwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void +JustSaying.AwsTools.DefaultAwsClientFactory +JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory() -> void +JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory(Amazon.Runtime.AWSCredentials customCredentials) -> void +JustSaying.AwsTools.DefaultAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +JustSaying.AwsTools.DefaultAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS +JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.get -> System.Uri +JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.set -> void +JustSaying.AwsTools.ErrorQueue +JustSaying.AwsTools.ErrorQueue.ErrorQueue(Amazon.RegionEndpoint region, string sourceQueueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.IAwsClientFactory +JustSaying.AwsTools.IAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +JustSaying.AwsTools.IAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS +JustSaying.AwsTools.IAwsClientFactoryProxy +JustSaying.AwsTools.IAwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory +JustSaying.AwsTools.IAwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void +JustSaying.AwsTools.JustSayingConstants +JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher +JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Get(string queueName, System.Type messageType) -> JustSaying.Messaging.Middleware.MiddlewareBase +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.MiddlewareMap() -> void +JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Types.get -> System.Collections.Generic.IEnumerable +JustSaying.AwsTools.MessageHandling.ISqsQueue +JustSaying.AwsTools.MessageHandling.ISqsQueue.Arn.get -> string +JustSaying.AwsTools.MessageHandling.ISqsQueue.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.ISqsQueue.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.ISqsQueue.QueueName.get -> string +JustSaying.AwsTools.MessageHandling.ISqsQueue.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> +JustSaying.AwsTools.MessageHandling.ISqsQueue.RegionSystemName.get -> string +JustSaying.AwsTools.MessageHandling.ISqsQueue.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.ISqsQueue.Uri.get -> System.Uri +JustSaying.AwsTools.MessageHandling.MessageResponse +JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? +JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.set -> void +JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.get -> string +JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.set -> void +JustSaying.AwsTools.MessageHandling.MessageResponse.MessageResponse() -> void +JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata +JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.set -> void +JustSaying.AwsTools.MessageHandling.PublishException +JustSaying.AwsTools.MessageHandling.PublishException.PublishException() -> void +JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message) -> void +JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message, System.Exception inner) -> void +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.Queue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(System.Func startupTask, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.StartupTask.get -> System.Func +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName +JustSaying.AwsTools.MessageHandling.SnsTopicByName.ApplyTagsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.Arn.get -> string +JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateWithEncryptionAsync(JustSaying.AwsTools.QueueCreation.ServerSideEncryption config, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.EnsurePolicyIsUpdatedAsync(System.Collections.Generic.IReadOnlyCollection additionalSubscriberAccounts) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SnsTopicByName.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.AwsTools.MessageHandling.SnsTopicByName.SnsTopicByName(string topicName, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collections.Generic.IDictionary +JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void +JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByName +JustSaying.AwsTools.MessageHandling.SqsQueueByName.EnsureQueueAndErrorQueueExistAndAllAttributesAreUpdatedAsync(JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByName.SqsQueueByName(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, int retryCountBeforeSendingToErrorQueue, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Arn.get -> string +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Client.get -> Amazon.SQS.IAmazonSQS +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Logger.get -> Microsoft.Extensions.Logging.ILogger +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueName.get -> string +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.RegionSystemName.get -> string +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.SqsQueueByNameBase(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Uri.get -> System.Uri +JustSaying.AwsTools.QueueCreation.AmazonQueueCreator +JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.AmazonQueueCreator(JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactory, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException() -> void +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message) -> void +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message, System.Exception inner) -> void +JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues +JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup +JustSaying.AwsTools.QueueCreation.ServerSideEncryption +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.set -> void +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.get -> string +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.set -> void +JustSaying.AwsTools.QueueCreation.ServerSideEncryption.ServerSideEncryption() -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.get -> System.Func +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.SnsWriteConfiguration() -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ApplyQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.get -> bool +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.get -> string +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.get -> int +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.SqsBasicConfiguration() -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.Validate() -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.get -> System.TimeSpan +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.ApplyTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SqsReadConfiguration(JustSaying.AwsTools.QueueCreation.SubscriptionType subscriptionType) -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionType.get -> JustSaying.AwsTools.QueueCreation.SubscriptionType +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.get -> System.Collections.Generic.Dictionary +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.get -> string +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.set -> void +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.SqsWriteConfiguration() -> void +JustSaying.AwsTools.QueueCreation.SubscriptionType +JustSaying.AwsTools.QueueCreation.SubscriptionType.PointToPoint = 1 -> JustSaying.AwsTools.QueueCreation.SubscriptionType +JustSaying.AwsTools.QueueCreation.SubscriptionType.ToTopic = 0 -> JustSaying.AwsTools.QueueCreation.SubscriptionType +JustSaying.Extensions.ChannelExtensions +JustSaying.Fluent.AccountAddressProvider +JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint) -> void +JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void +JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName) -> void +JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void +JustSaying.Fluent.AccountAddressProvider.GetQueueUri(string queueName) -> System.Uri +JustSaying.Fluent.AccountAddressProvider.GetQueueUriByConvention() -> System.Uri +JustSaying.Fluent.AccountAddressProvider.GetTopicArn(string topicName) -> string +JustSaying.Fluent.AccountAddressProvider.GetTopicArnByConvention() -> string +JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.Build() -> JustSaying.AwsTools.IAwsClientFactory +JustSaying.Fluent.AwsClientFactoryBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithAnonymousCredentials() -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithBasicCredentials(string accessKey, string secretKey) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithClientFactory(System.Func clientFactory) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithCredentials(Amazon.Runtime.AWSCredentials credentials) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUri(System.Uri uri) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUrl(string url) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.AwsClientFactoryBuilder.WithSessionCredentials(string accessKeyId, string secretAccessKey, string token) -> JustSaying.Fluent.AwsClientFactoryBuilder +JustSaying.Fluent.IMessageBusConfigurationContributor +JustSaying.Fluent.IMessageBusConfigurationContributor.Configure(JustSaying.MessagingBusBuilder builder) -> void +JustSaying.Fluent.IServiceResolver +JustSaying.Fluent.IServiceResolver.ResolveOptionalService() -> T +JustSaying.Fluent.IServiceResolver.ResolveService() -> T +JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.ISubscriptionBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver, JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues creator, JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactoryProxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Fluent.ISubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.Build() -> JustSaying.IMessagingConfig +JustSaying.Fluent.MessagingConfigurationBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccount(string accountId) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(params string[] regions) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(System.Collections.Generic.IEnumerable accountIds) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action logger) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageSubjectProvider(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider subjectProvider) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoff(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattempts(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(Amazon.RegionEndpoint region) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(string region) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueue() -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueue(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueueArn(string queueArn) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueueUri(System.Uri queueUrl) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithQueueUrl(string queueUrl) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithTopic() -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithTopic(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.PublicationsBuilder.WithTopicArn(string topicArn, System.Action> configure = null) -> JustSaying.Fluent.PublicationsBuilder +JustSaying.Fluent.QueueAddressConfiguration +JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action +JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void +JustSaying.Fluent.QueueAddressConfiguration.QueueAddressConfiguration() -> void +JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.get -> string +JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.set -> void +JustSaying.Fluent.QueueAddressConfiguration.Validate() -> void +JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Fluent.QueueAddressSubscriptionBuilder +JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueAddressSubscriptionBuilder +JustSaying.Fluent.QueuePublicationBuilder +JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder +JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder +JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithDefaultQueue() -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.QueueSubscriptionBuilder +JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(JustSaying.IHandlerResolver handlerResolver) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(System.Func handlerResolver) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(System.Func loggerFactory) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithMessageContextAccessor(System.Func contextAccessor) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.ServicesBuilder.WithMessageMonitoring(System.Func monitoring) -> JustSaying.Fluent.ServicesBuilder +JustSaying.Fluent.SnsWriteConfigurationBuilder +JustSaying.Fluent.SnsWriteConfigurationBuilder.SnsWriteConfigurationBuilder() -> void +JustSaying.Fluent.SnsWriteConfigurationBuilder.WithErrorHandler(System.Func handler) -> JustSaying.Fluent.SnsWriteConfigurationBuilder +JustSaying.Fluent.SqsConfigurationBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(JustSaying.AwsTools.QueueCreation.ServerSideEncryption encryption) -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(string masterKeyId) -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueue() -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueueOptOut(bool value) -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithMessageRetention(System.TimeSpan value) -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithNoErrorQueue() -> TBuilder +JustSaying.Fluent.SqsConfigurationBuilder.WithVisibilityTimeout(System.TimeSpan value) -> TBuilder +JustSaying.Fluent.SqsReadConfigurationBuilder +JustSaying.Fluent.SqsReadConfigurationBuilder.SqsReadConfigurationBuilder() -> void +JustSaying.Fluent.SqsReadConfigurationBuilder.WithSubscriptionGroup(string subscriptionGroupName) -> JustSaying.Fluent.SqsReadConfigurationBuilder +JustSaying.Fluent.SqsReadConfigurationBuilder.WithTopicSourceAccount(string id) -> JustSaying.Fluent.SqsReadConfigurationBuilder +JustSaying.Fluent.SqsWriteConfigurationBuilder +JustSaying.Fluent.SqsWriteConfigurationBuilder.SqsWriteConfigurationBuilder() -> void +JustSaying.Fluent.SqsWriteConfigurationBuilder.WithQueueName(string name) -> JustSaying.Fluent.SqsWriteConfigurationBuilder +JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueue() -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueue(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueueArn(string queueArn, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueueUri(System.Uri queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForQueueUrl(string queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForTopic() -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForTopic(string topicNameOverride, System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.ForTopic(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.WithDefaults(System.Action configure) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.SubscriptionsBuilder.WithSubscriptionGroup(string groupName, System.Action action) -> JustSaying.Fluent.SubscriptionsBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func exceptionHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.get -> System.Func +JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.set -> void +JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(System.Func topicNameCustomizer) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder +JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.IntoDefaultTopic() -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.Fluent.TopicSubscriptionBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder +JustSaying.HandlerNotRegisteredWithContainerException +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException() -> void +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message) -> void +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message, System.Exception inner) -> void +JustSaying.HandlerResolutionContext +JustSaying.HandlerResolutionContext.HandlerResolutionContext(string queueName) -> void +JustSaying.HandlerResolutionContext.QueueName.get -> string +JustSaying.IHandlerResolver +JustSaying.IHandlerResolver.ResolveHandler(JustSaying.HandlerResolutionContext context) -> JustSaying.Messaging.MessageHandling.IHandlerAsync +JustSaying.IMessagingBus +JustSaying.IMessagingConfig +JustSaying.IMessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider +JustSaying.IMessagingConfig.MessageSubjectProvider.set -> void +JustSaying.IMessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention +JustSaying.IMessagingConfig.QueueNamingConvention.set -> void +JustSaying.IMessagingConfig.Region.get -> string +JustSaying.IMessagingConfig.Region.set -> void +JustSaying.IMessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention +JustSaying.IMessagingConfig.TopicNamingConvention.set -> void +JustSaying.IMessagingConfig.Validate() -> void +JustSaying.IPublishConfiguration +JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.set -> void +JustSaying.IPublishConfiguration.MessageResponseLogger.get -> System.Action +JustSaying.IPublishConfiguration.MessageResponseLogger.set -> void +JustSaying.IPublishConfiguration.PublishFailureBackoff.get -> System.TimeSpan +JustSaying.IPublishConfiguration.PublishFailureBackoff.set -> void +JustSaying.IPublishConfiguration.PublishFailureReAttempts.get -> int +JustSaying.IPublishConfiguration.PublishFailureReAttempts.set -> void +JustSaying.IStartable +JustSaying.IStartable.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.JustSayingBus +JustSaying.JustSayingBus.AddMessageMiddleware(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> void +JustSaying.JustSayingBus.AddMessagePublisher(JustSaying.Messaging.IMessagePublisher messagePublisher) -> void +JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +JustSaying.JustSayingBus.Completion.get -> System.Threading.Tasks.Task +JustSaying.JustSayingBus.Config.get -> JustSaying.IMessagingConfig +JustSaying.JustSayingBus.Dispose() -> void +JustSaying.JustSayingBus.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +JustSaying.JustSayingBus.SetGroupSettings(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary settings) -> void +JustSaying.JustSayingBus.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Context.IMessageDeleter +JustSaying.Messaging.Channels.Context.IMessageDeleter.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater +JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Context.IQueueMessageContext +JustSaying.Messaging.Channels.Context.IQueueMessageContext.Message.get -> Amazon.SQS.Model.Message +JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueName.get -> string +JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueUri.get -> System.Uri +JustSaying.Messaging.Channels.Context.QueueMessageContext +JustSaying.Messaging.Channels.Context.QueueMessageContext.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Context.QueueMessageContext.Message.get -> Amazon.SQS.Model.Message +JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueName.get -> string +JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueUri.get -> System.Uri +JustSaying.Messaging.Channels.Context.QueueMessageContext.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal +JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.IsPaused.get -> bool +JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Pause() -> void +JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Resume() -> void +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.IsPaused.get -> bool +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.MessageReceivePauseSignal() -> void +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Pause() -> void +JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Resume() -> void +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.BufferSize.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ConcurrencyLimit.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.MultiplexerCapacity.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.Prefetch.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.SubscriptionGroupCollection(System.Collections.Generic.IList subscriptionGroups, Microsoft.Extensions.Logging.ILogger logger) -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.Build(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.SubscriptionGroupConfigBuilder(string groupName) -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.BufferSize.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ConcurrencyLimit.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.MultiplexerCapacity.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Name.get -> string +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Prefetch.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.BufferSize.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ConcurrencyLimit.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.MultiplexerCapacity.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.Prefetch.get -> int +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveBufferReadTimeout.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveMessagesWaitTime.get -> System.TimeSpan +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SqsMiddleware.get -> JustSaying.Messaging.Middleware.MiddlewareBase> +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SubscriptionGroupSettingsBuilder() -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithCustomMiddleware(JustSaying.Messaging.Middleware.MiddlewareBase> middleware) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation +JustSaying.Messaging.IMessagePublisher +JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Interrogation.IInterrogable +JustSaying.Messaging.Interrogation.IInterrogable.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.Messaging.Interrogation.InterrogationResult +JustSaying.Messaging.Interrogation.InterrogationResult.Data.get -> object +JustSaying.Messaging.Interrogation.InterrogationResult.InterrogationResult(object data) -> void +JustSaying.Messaging.MessageAttributeValue +JustSaying.Messaging.MessageAttributeValue.BinaryValue.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.MessageAttributeValue.BinaryValue.set -> void +JustSaying.Messaging.MessageAttributeValue.DataType.get -> string +JustSaying.Messaging.MessageAttributeValue.DataType.set -> void +JustSaying.Messaging.MessageAttributeValue.MessageAttributeValue() -> void +JustSaying.Messaging.MessageAttributeValue.StringValue.get -> string +JustSaying.Messaging.MessageAttributeValue.StringValue.set -> void +JustSaying.Messaging.MessageHandling.IHandlerAsync +JustSaying.Messaging.MessageHandling.IHandlerAsync.Handle(T message) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.IMessageContextAccessor +JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext +JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.set -> void +JustSaying.Messaging.MessageHandling.IMessageContextReader +JustSaying.Messaging.MessageHandling.IMessageContextReader.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext +JustSaying.Messaging.MessageHandling.IMessageLockAsync +JustSaying.Messaging.MessageHandling.IMessageLockAsync.ReleaseLockAsync(string key) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockAsync(string key, System.TimeSpan howLong) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockPermanentlyAsync(string key) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.ListHandler +JustSaying.Messaging.MessageHandling.ListHandler.Handle(T message) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageHandling.ListHandler.ListHandler(System.Collections.Generic.IEnumerable> handlers) -> void +JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageHandling.MessageAttributes.Get(string value) -> JustSaying.Messaging.MessageAttributeValue +JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes() -> void +JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes(System.Collections.Generic.Dictionary attributes) -> void +JustSaying.Messaging.MessageHandling.MessageContext +JustSaying.Messaging.MessageHandling.MessageContext.Message.get -> Amazon.SQS.Model.Message +JustSaying.Messaging.MessageHandling.MessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageHandling.MessageContext.MessageContext(Amazon.SQS.Model.Message message, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageHandling.MessageContext.QueueUri.get -> System.Uri +JustSaying.Messaging.MessageHandling.MessageContextAccessor +JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext +JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.set -> void +JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContextAccessor() -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse +JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.get -> bool +JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.set -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.get -> System.DateTimeOffset +JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.set -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.get -> long +JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.set -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.get -> bool +JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.set -> void +JustSaying.Messaging.MessageHandling.MessageLockResponse.MessageLockResponse() -> void +JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy +JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy.GetBackoffDuration(JustSaying.Models.Message message, int approximateReceiveCount, System.Exception lastException = null) -> System.TimeSpan +JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults +JustSaying.Messaging.MessagePublisherExtensions +JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider +JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GenericMessageSubjectProvider() -> void +JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string +JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory +JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void +JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider +JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException() -> void +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message) -> void +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message, System.Exception innerException) -> void +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void +JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +JustSaying.Messaging.MessageSerialization.MessageWithAttributes +JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider +JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string +JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.NonGenericMessageSubjectProvider() -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void +JustSaying.Messaging.MessageSerialization.TypeSerializer +JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type +JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void +JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware +JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware.BackoffMiddleware(JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware +JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware.ErrorHandlerMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.ExactlyOnceMiddleware +JustSaying.Messaging.Middleware.ExactlyOnceMiddleware.ExactlyOnceMiddleware(JustSaying.Messaging.MessageHandling.IMessageLockAsync messageLock, System.TimeSpan timeout, string handlerName, Microsoft.Extensions.Logging.ILogger logger) -> void +JustSaying.Messaging.Middleware.HandleMessageContext +JustSaying.Messaging.Middleware.HandleMessageContext.HandledException.get -> System.Exception +JustSaying.Messaging.Middleware.HandleMessageContext.HandleMessageContext(string queueName, Amazon.SQS.Model.Message rawMessage, JustSaying.Models.Message message, System.Type messageType, JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater visibilityUpdater, JustSaying.Messaging.Channels.Context.IMessageDeleter messageDeleter, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.Middleware.HandleMessageContext.Message.get -> JustSaying.Models.Message +JustSaying.Messaging.Middleware.HandleMessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.Middleware.HandleMessageContext.MessageDeleter.get -> JustSaying.Messaging.Channels.Context.IMessageDeleter +JustSaying.Messaging.Middleware.HandleMessageContext.MessageType.get -> System.Type +JustSaying.Messaging.Middleware.HandleMessageContext.QueueName.get -> string +JustSaying.Messaging.Middleware.HandleMessageContext.QueueUri.get -> System.Uri +JustSaying.Messaging.Middleware.HandleMessageContext.RawMessage.get -> Amazon.SQS.Model.Message +JustSaying.Messaging.Middleware.HandleMessageContext.SetException(System.Exception e) -> void +JustSaying.Messaging.Middleware.HandleMessageContext.VisibilityUpdater.get -> JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater +JustSaying.Messaging.Middleware.HandleMessageContextExtensions +JustSaying.Messaging.Middleware.HandlerInvocationMiddleware +JustSaying.Messaging.Middleware.HandlerInvocationMiddleware.HandlerInvocationMiddleware(System.Func> handlerResolver) -> void +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Build() -> JustSaying.Messaging.Middleware.MiddlewareBase +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Configure(System.Action configure) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.HandlerMiddlewareBuilder(JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver) -> void +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(System.Func> middlewareFactory) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.UseHandler() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.Logging.LoggingMiddleware +JustSaying.Messaging.Middleware.Logging.LoggingMiddleware.LoggingMiddleware(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware +JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware.MessageContextAccessorMiddleware(JustSaying.Messaging.MessageHandling.IMessageContextAccessor messageContextAccessor) -> void +JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions +JustSaying.Messaging.Middleware.MiddlewareBase +JustSaying.Messaging.Middleware.MiddlewareBase.MiddlewareBase() -> void +JustSaying.Messaging.Middleware.MiddlewareBase.RunAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Middleware.MiddlewareBase.WithNext(JustSaying.Messaging.Middleware.MiddlewareBase next) -> JustSaying.Messaging.Middleware.MiddlewareBase +JustSaying.Messaging.Middleware.MiddlewareBuilder +JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware +JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.SqsPostProcessorMiddleware() -> void +JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware +JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.DefaultReceiveMessagesMiddleware(Microsoft.Extensions.Logging.ILogger logger) -> void +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.get -> int +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.set -> void +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.get -> string +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.set -> void +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.ReceiveMessagesContext() -> void +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.get -> string +JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.set -> void +JustSaying.Messaging.Middleware.StopwatchMiddleware +JustSaying.Messaging.Middleware.StopwatchMiddleware.StopwatchMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor, System.Type handlerType) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor +JustSaying.Messaging.Monitoring.IMessageMonitor.Handled(JustSaying.Models.Message message) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandleException(System.Type messageType) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.HandleTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.IncrementThrottlingStatistic() -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.IssuePublishingMessage() -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.IMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.Handled(JustSaying.Models.Message message) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleException(System.Type messageType) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IncrementThrottlingStatistic() -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IssuePublishingMessage() -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.NullOpMessageMonitor() -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void +JustSaying.Messaging.Monitoring.NullOpMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void +JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, double value) -> JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, JustSaying.Messaging.MessageAttributeValue value) -> JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, string value) -> JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, System.Collections.Generic.IReadOnlyCollection data) -> JustSaying.Messaging.PublishMetadata +JustSaying.Messaging.PublishMetadata.Delay.get -> System.TimeSpan? +JustSaying.Messaging.PublishMetadata.Delay.set -> void +JustSaying.Messaging.PublishMetadata.MessageAttributes.get -> System.Collections.Generic.IDictionary +JustSaying.Messaging.PublishMetadata.PublishMetadata() -> void +JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.BuildClientFactory() -> JustSaying.AwsTools.IAwsClientFactory +JustSaying.MessagingBusBuilder.BuildPublisher() -> JustSaying.Messaging.IMessagePublisher +JustSaying.MessagingBusBuilder.BuildSubscribers() -> JustSaying.IMessagingBus +JustSaying.MessagingBusBuilder.Client(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.Messaging(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.MessagingBusBuilder() -> void +JustSaying.MessagingBusBuilder.Publications(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.Services(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.Subscriptions(System.Action configure) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingBusBuilder.WithServiceResolver(JustSaying.Fluent.IServiceResolver serviceResolver) -> JustSaying.MessagingBusBuilder +JustSaying.MessagingConfig +JustSaying.MessagingConfig.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.MessagingConfig.AdditionalSubscriberAccounts.set -> void +JustSaying.MessagingConfig.MessageResponseLogger.get -> System.Action +JustSaying.MessagingConfig.MessageResponseLogger.set -> void +JustSaying.MessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider +JustSaying.MessagingConfig.MessageSubjectProvider.set -> void +JustSaying.MessagingConfig.MessagingConfig() -> void +JustSaying.MessagingConfig.PublishFailureBackoff.get -> System.TimeSpan +JustSaying.MessagingConfig.PublishFailureBackoff.set -> void +JustSaying.MessagingConfig.PublishFailureReAttempts.get -> int +JustSaying.MessagingConfig.PublishFailureReAttempts.set -> void +JustSaying.MessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention +JustSaying.MessagingConfig.QueueNamingConvention.set -> void +JustSaying.MessagingConfig.Region.get -> string +JustSaying.MessagingConfig.Region.set -> void +JustSaying.MessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention +JustSaying.MessagingConfig.TopicNamingConvention.set -> void +JustSaying.Naming.DefaultNamingConventions +JustSaying.Naming.DefaultNamingConventions.DefaultNamingConventions() -> void +JustSaying.Naming.IQueueNamingConvention +JustSaying.Naming.IQueueNamingConvention.QueueName() -> string +JustSaying.Naming.ITopicNamingConvention +JustSaying.Naming.ITopicNamingConvention.TopicName() -> string +JustSaying.Naming.NamingConventionExtensions +override JustSaying.AwsTools.ErrorQueue.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary +override JustSaying.AwsTools.ErrorQueue.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool +override JustSaying.AwsTools.ErrorQueue.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +override JustSaying.AwsTools.MessageHandling.SqsQueueByName.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task +override JustSaying.AwsTools.MessageHandling.SqsQueueByName.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +override JustSaying.AwsTools.MessageHandling.SqsQueueByName.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary +override JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.OnValidating() -> void +override JustSaying.Messaging.MessageHandling.MessageLockResponse.ToString() -> string +override JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.HandleMessageContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +override JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext context, System.Func>> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task> +static JustSaying.AwsTools.JustSayingConstants.DefaultAttributeEncryptionKeyReusePeriod.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.DefaultHandlerRetryCount.get -> int +static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryCount.get -> int +static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryInterval.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.DefaultRetentionPeriod.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.DefaultSnsAttributeEncryptionKeyId.get -> string +static JustSaying.AwsTools.JustSayingConstants.DefaultSqsAttributeEncryptionKeyId.get -> string +static JustSaying.AwsTools.JustSayingConstants.DefaultVisibilityTimeout.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.MaximumDeliveryDelay.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.MaximumRetentionPeriod.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.MinimumDeliveryDelay.get -> System.TimeSpan +static JustSaying.AwsTools.JustSayingConstants.MinimumRetentionPeriod.get -> System.TimeSpan +static JustSaying.Extensions.ChannelExtensions.MergeAsync(System.Collections.Generic.IEnumerable> inputs, System.Threading.Channels.ChannelWriter output, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task +static JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation.Validate(this JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings settings) -> void +static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.MaxAmazonMessageCap.get -> int +static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.ParallelHandlerExecutionPerCore.get -> int +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message) -> System.Threading.Tasks.Task +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata) -> System.Threading.Tasks.Task +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +static JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions.UseBackoff(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions.UseErrorHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions.UseExactlyOnce(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, string lockKey, System.TimeSpan? lockDuration = null) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.HandleMessageContextExtensions.MessageAs(this JustSaying.Messaging.Middleware.HandleMessageContext context) -> TMessage +static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseDefaults(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Func> handler) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions.UseMessageContextAccessor(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions.UseStopwatch(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder +static JustSaying.Messaging.Middleware.MiddlewareBuilder.BuildAsync(params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase +static JustSaying.Messaging.Middleware.MiddlewareBuilder.WithAsync(this JustSaying.Messaging.Middleware.MiddlewareBase inner, params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase +static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.IQueueNamingConvention namingConvention, string overrideQueueName) -> string +static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.ITopicNamingConvention namingConvention, string overrideTopicName) -> string +virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceConfig config) -> void +virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SQS.AmazonSQSConfig config) -> void +virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool +virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +virtual JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.OnValidating() -> void +virtual JustSaying.MessagingConfig.Validate() -> void +virtual JustSaying.Naming.DefaultNamingConventions.QueueName() -> string +virtual JustSaying.Naming.DefaultNamingConventions.TopicName() -> string +JustSaying.Fluent.QueuePublicationBuilder.WithQueueName(string name) -> JustSaying.Fluent.QueuePublicationBuilder diff --git a/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt new file mode 100644 index 000000000..dc42054fa --- /dev/null +++ b/src/JustSaying/PublicAPI/PublicAPI.Unshipped.txt @@ -0,0 +1,215 @@ +const JustSaying.Messaging.Compression.ContentEncodings.GzipBase64 = "gzip,base64" -> string +JustSaying.AwsTools.MessageHandling.MessageBatchResponse.FailedMessageIds.set -> void +JustSaying.AwsTools.MessageHandling.MessageBatchResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? +JustSaying.AwsTools.MessageHandling.MessageBatchResponse.MessageBatchResponse() -> void +JustSaying.AwsTools.MessageHandling.MessageBatchResponse.ResponseMetadata.set -> void +JustSaying.AwsTools.MessageHandling.MessageBatchResponse.SuccessfulMessageIds.set -> void +JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException() -> void +JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException(string message, System.Exception inner) -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.get -> string +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.CompressionEncoding.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.get -> int +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.MessageLengthThreshold.set -> void +JustSaying.AwsTools.MessageHandling.PublishCompressionOptions.PublishCompressionOptions() -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.CompressionOptions.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.IsRawMessage.get -> bool +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.IsRawMessage.set -> void +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Subject.get -> string +JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Subject.set -> void +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.IsRawMessage.get -> bool +JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.IsRawMessage.set -> void +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.get -> bool +JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.RawMessageDelivery.set -> void +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.CompressionOptions.set -> void +JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action> logger) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattemptsForBatch(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.get -> bool +JustSaying.Fluent.QueueAddressConfiguration.RawMessageDelivery.set -> void +JustSaying.Fluent.QueueAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMessageBodySerializer(JustSaying.Messaging.MessageSerialization.IMessageBodySerializer messageBodySerializer) -> JustSaying.Fluent.ISubscriptionBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithCompression(JustSaying.AwsTools.MessageHandling.PublishCompressionOptions compressionOptions) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func, bool> exceptionBatchHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.Fluent.TopicAddressPublicationBuilder.WithSubject(string subject) -> JustSaying.Fluent.TopicAddressPublicationBuilder +JustSaying.IMessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.IMessagingConfig.DefaultCompressionOptions.set -> void +JustSaying.IPublishBatchConfiguration +JustSaying.IPublishBatchConfiguration.MessageBatchResponseLogger.set -> void +JustSaying.IPublishBatchConfiguration.PublishFailureBackoff.set -> void +JustSaying.IPublishBatchConfiguration.PublishFailureReAttempts.set -> void +JustSaying.JustSayingBus.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.Channels.Context.IQueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IInboundMessageConverter +JustSaying.Messaging.Channels.Context.QueueMessageContext.MessageConverter.get -> JustSaying.Messaging.IInboundMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.get -> JustSaying.Messaging.IInboundMessageConverter +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.MessageConverter.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsQueue.set -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SqsSource.SqsSource() -> void +JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.QueueSources.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.Compression.ContentEncodings +JustSaying.Messaging.Compression.GzipMessageBodyCompression +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.GzipMessageBodyCompression.GzipMessageBodyCompression() -> void +JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.IMessageBodyCompression.Compress(string messageBody) -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.ContentEncoding.get -> string +JustSaying.Messaging.Compression.IMessageBodyCompression.Decompress(string messageBody) -> string +JustSaying.Messaging.Compression.MessageCompressionRegistry +JustSaying.Messaging.Compression.MessageCompressionRegistry.GetCompression(string contentEncoding) -> JustSaying.Messaging.Compression.IMessageBodyCompression +JustSaying.Messaging.Compression.MessageCompressionRegistry.MessageCompressionRegistry(System.Collections.Generic.IList compressions = null) -> void +JustSaying.Messaging.IMessageBatchPublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task +JustSaying.Messaging.IOutboundMessageConverter +JustSaying.Messaging.IOutboundMessageConverter.ConvertToOutboundMessageAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata publishMetadata, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +JustSaying.Messaging.IInboundMessageConverter +JustSaying.Messaging.IInboundMessageConverter.ConvertToInboundMessageAsync(Amazon.SQS.Model.Message message, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +JustSaying.Messaging.MessageHandling.MessageAttributes.GetKeys() -> System.Collections.Generic.IReadOnlyCollection +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory +JustSaying.Messaging.MessageSerialization.IMessageBodySerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.IMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Deserialize(string message) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer() -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.NewtonsoftMessageBodySerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +JustSaying.Messaging.MessageSerialization.NewtonsoftMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer +JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings = null) -> void +JustSaying.Messaging.MessageSerialization.OutboundMessage +JustSaying.Messaging.MessageSerialization.OutboundMessage.Body.get -> string +JustSaying.Messaging.MessageSerialization.OutboundMessage.Deconstruct(out string body, out System.Collections.Generic.Dictionary attributes, out string subject) -> void +JustSaying.Messaging.MessageSerialization.OutboundMessage.MessageAttributes.get -> System.Collections.Generic.Dictionary +JustSaying.Messaging.MessageSerialization.OutboundMessage.OutboundMessage(string body, System.Collections.Generic.Dictionary messageAttributes, string subject) -> void +JustSaying.Messaging.MessageSerialization.OutboundMessage.Subject.get -> string +JustSaying.Messaging.MessageSerialization.InboundMessage +JustSaying.Messaging.MessageSerialization.InboundMessage.Deconstruct(out JustSaying.Models.Message message, out JustSaying.Messaging.MessageHandling.MessageAttributes attributes) -> void +JustSaying.Messaging.MessageSerialization.InboundMessage.Message.get -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.InboundMessage.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +JustSaying.Messaging.MessageSerialization.InboundMessage.InboundMessage(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Deserialize(string messageBody) -> JustSaying.Models.Message +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.Serialize(JustSaying.Models.Message message) -> string +JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.SystemTextJsonMessageBodySerializer(System.Text.Json.JsonSerializerOptions options) -> void +JustSaying.Messaging.PublishBatchMetadata.BatchSize.set -> void +JustSaying.Messaging.PublishBatchMetadata.PublishBatchMetadata() -> void +JustSaying.MessagingBusBuilder.BuildBatchPublisher() -> JustSaying.Messaging.IMessageBatchPublisher +JustSaying.MessagingConfig.DefaultCompressionOptions.get -> JustSaying.AwsTools.MessageHandling.PublishCompressionOptions +JustSaying.MessagingConfig.DefaultCompressionOptions.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action +*REMOVED*JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void +*REMOVED*JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void +*REMOVED*JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void +*REMOVED*JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type +*REMOVED*JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void +*REMOVED*virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult +*REMOVED*JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher +JustSaying.MessagingConfig.MessageBatchResponseLogger.set -> void +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages) -> System.Threading.Tasks.Task +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata) -> System.Threading.Tasks.Task +static JustSaying.Messaging.MessageSerialization.SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions.get -> System.Text.Json.JsonSerializerOptions +JustSaying.Fluent.QueueAddressPublicationBuilder.WithRawMessages() -> JustSaying.Fluent.QueueAddressPublicationBuilder +JustSaying.AwsTools.MessageHandling.MessageBatchResponse +JustSaying.AwsTools.MessageHandling.MessageBatchResponse.FailedMessageIds.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.AwsTools.MessageHandling.MessageBatchResponse.HttpStatusCode.set -> void +JustSaying.AwsTools.MessageHandling.MessageBatchResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata +JustSaying.AwsTools.MessageHandling.MessageBatchResponse.SuccessfulMessageIds.get -> System.Collections.Generic.IReadOnlyCollection +JustSaying.AwsTools.MessageHandling.PublishBatchException +JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException(string message) -> void +JustSaying.Fluent.MessagingConfigurationBuilder.BuildPublishBatchConfiguration() -> JustSaying.IPublishBatchConfiguration +JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoffForBatch(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder +JustSaying.IPublishBatchConfiguration.MessageBatchResponseLogger.get -> System.Action> +JustSaying.IPublishBatchConfiguration.PublishFailureBackoff.get -> System.TimeSpan +JustSaying.IPublishBatchConfiguration.PublishFailureReAttempts.get -> int +JustSaying.JustSayingBus.AddMessageBatchPublisher(JustSaying.Messaging.IMessageBatchPublisher messageBatchPublisher) -> void +JustSaying.JustSayingBus.PublishBatchConfiguration.get -> JustSaying.IPublishBatchConfiguration +JustSaying.Messaging.IMessageBatchPublisher +JustSaying.Messaging.PublishBatchMetadata +JustSaying.Messaging.PublishBatchMetadata.BatchSize.get -> int +JustSaying.MessagingConfig.MessageBatchResponseLogger.get -> System.Action> +static JustSaying.AwsTools.JustSayingConstants.MaximumSnsBatchSize.get -> int +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessageBatchPublisher publisher, System.Collections.Generic.IEnumerable messages, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageBodySerializer diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt index ac3e28b2f..e69de29bb 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Shipped.txt @@ -1,749 +0,0 @@ -abstract JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -abstract JustSaying.Messaging.Middleware.MiddlewareBase.RunInnerAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -const JustSaying.AwsTools.JustSayingConstants.AttributeArn = "QueueArn" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeDeliveryDelay = "DelaySeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyId = "KmsMasterKeyId" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyReusePeriodSecondId = "KmsDataKeyReusePeriodSeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributePolicy = "Policy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRedrivePolicy = "RedrivePolicy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRetentionPeriod = "MessageRetentionPeriod" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeVisibilityTimeout = "VisibilityTimeout" -> string -JustSaying.AwsTools.AwsClientFactoryProxy -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy() -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Func awsClientFactoryFunc) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Lazy factory) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.AwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.DefaultAwsClientFactory -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory() -> void -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory(Amazon.Runtime.AWSCredentials customCredentials) -> void -JustSaying.AwsTools.DefaultAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.DefaultAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.get -> System.Uri -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.set -> void -JustSaying.AwsTools.ErrorQueue -JustSaying.AwsTools.ErrorQueue.ErrorQueue(Amazon.RegionEndpoint region, string sourceQueueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.IAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.IAwsClientFactoryProxy -JustSaying.AwsTools.IAwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.JustSayingConstants -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Get(string queueName, System.Type messageType) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.MiddlewareMap() -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Types.get -> System.Collections.Generic.IEnumerable -JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.ISqsQueue.Arn.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.ISqsQueue.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.Uri.get -> System.Uri -JustSaying.AwsTools.MessageHandling.MessageResponse -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.get -> string -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageResponse() -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.set -> void -JustSaying.AwsTools.MessageHandling.PublishException -JustSaying.AwsTools.MessageHandling.PublishException.PublishException() -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message, System.Exception inner) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.Queue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(System.Func startupTask, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.StartupTask.get -> System.Func -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ApplyTagsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateWithEncryptionAsync(JustSaying.AwsTools.QueueCreation.ServerSideEncryption config, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.EnsurePolicyIsUpdatedAsync(System.Collections.Generic.IReadOnlyCollection additionalSubscriberAccounts) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SnsTopicByName.SnsTopicByName(string topicName, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collections.Generic.IDictionary -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName -JustSaying.AwsTools.MessageHandling.SqsQueueByName.EnsureQueueAndErrorQueueExistAndAllAttributesAreUpdatedAsync(JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName.SqsQueueByName(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, int retryCountBeforeSendingToErrorQueue, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Client.get -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Logger.get -> Microsoft.Extensions.Logging.ILogger -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.SqsQueueByNameBase(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Uri.get -> System.Uri -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.AmazonQueueCreator(JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactory, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException() -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message, System.Exception inner) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.RedrivePolicy -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.get -> string -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.get -> int -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy() -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy(int maximumReceives, string deadLetterQueue) -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.get -> string -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.ServerSideEncryption() -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.get -> System.Func -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.SnsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ApplyQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.get -> bool -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.get -> string -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.get -> int -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.SqsBasicConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.Validate() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.ApplyTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SqsReadConfiguration(JustSaying.AwsTools.QueueCreation.SubscriptionType subscriptionType) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionType.get -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.get -> System.Collections.Generic.Dictionary -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.set -> void -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.SqsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.PointToPoint = 1 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.ToTopic = 0 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.Extensions.ChannelExtensions -JustSaying.Fluent.AccountAddressProvider -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.GetQueueUri(string queueName) -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetQueueUriByConvention() -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetTopicArn(string topicName) -> string -JustSaying.Fluent.AccountAddressProvider.GetTopicArnByConvention() -> string -JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.Build() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.Fluent.AwsClientFactoryBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithAnonymousCredentials() -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithBasicCredentials(string accessKey, string secretKey) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithClientFactory(System.Func clientFactory) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithCredentials(Amazon.Runtime.AWSCredentials credentials) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUri(System.Uri uri) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUrl(string url) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithSessionCredentials(string accessKeyId, string secretAccessKey, string token) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.IMessageBusConfigurationContributor -JustSaying.Fluent.IMessageBusConfigurationContributor.Configure(JustSaying.MessagingBusBuilder builder) -> void -JustSaying.Fluent.IServiceResolver -JustSaying.Fluent.IServiceResolver.ResolveOptionalService() -> T -JustSaying.Fluent.IServiceResolver.ResolveService() -> T -JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.ISubscriptionBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver, JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues creator, JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactoryProxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.ISubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.Build() -> JustSaying.IMessagingConfig -JustSaying.Fluent.MessagingConfigurationBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccount(string accountId) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(params string[] regions) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(System.Collections.Generic.IEnumerable accountIds) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action logger) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageSubjectProvider(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider subjectProvider) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoff(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattempts(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(Amazon.RegionEndpoint region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(string region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueArn(string queueArn) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUri(System.Uri queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUrl(string queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopicArn(string topicArn, System.Action> configure = null) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.QueueAddressConfiguration -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void -JustSaying.Fluent.QueueAddressConfiguration.QueueAddressConfiguration() -> void -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.get -> string -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.set -> void -JustSaying.Fluent.QueueAddressConfiguration.Validate() -> void -JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithName(string queueName) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithDefaultQueue() -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(JustSaying.IHandlerResolver handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(System.Func handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(System.Func loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageContextAccessor(System.Func contextAccessor) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageMonitoring(System.Func monitoring) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder.SnsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SnsWriteConfigurationBuilder.WithErrorHandler(System.Func handler) -> JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(JustSaying.AwsTools.QueueCreation.ServerSideEncryption encryption) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(string masterKeyId) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueueOptOut(bool value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithMessageRetention(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithNoErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithVisibilityTimeout(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.SqsReadConfigurationBuilder() -> void -JustSaying.Fluent.SqsReadConfigurationBuilder.WithSubscriptionGroup(string subscriptionGroupName) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.WithTopicSourceAccount(string id) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder.SqsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SqsWriteConfigurationBuilder.WithQueueName(string name) -> JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueArn(string queueArn, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUri(System.Uri queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUrl(string queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(string topicNameOverride, System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithDefaults(System.Action configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithSubscriptionGroup(string groupName, System.Action action) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func exceptionHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.get -> System.Func -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.set -> void -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(System.Func topicNameCustomizer) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.IntoDefaultTopic() -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.HandlerNotRegisteredWithContainerException -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException() -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message, System.Exception inner) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.HandlerResolutionContext -JustSaying.HandlerResolutionContext.HandlerResolutionContext(string queueName) -> void -JustSaying.HandlerResolutionContext.QueueName.get -> string -JustSaying.IHandlerResolver -JustSaying.IHandlerResolver.ResolveHandler(JustSaying.HandlerResolutionContext context) -> JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.IMessagingBus -JustSaying.IMessagingConfig -JustSaying.IMessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.IMessagingConfig.MessageSubjectProvider.set -> void -JustSaying.IMessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.IMessagingConfig.QueueNamingConvention.set -> void -JustSaying.IMessagingConfig.Region.get -> string -JustSaying.IMessagingConfig.Region.set -> void -JustSaying.IMessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.IMessagingConfig.TopicNamingConvention.set -> void -JustSaying.IMessagingConfig.Validate() -> void -JustSaying.IPublishConfiguration -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.set -> void -JustSaying.IPublishConfiguration.MessageResponseLogger.get -> System.Action -JustSaying.IPublishConfiguration.MessageResponseLogger.set -> void -JustSaying.IPublishConfiguration.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.IPublishConfiguration.PublishFailureBackoff.set -> void -JustSaying.IPublishConfiguration.PublishFailureReAttempts.get -> int -JustSaying.IPublishConfiguration.PublishFailureReAttempts.set -> void -JustSaying.IStartable -JustSaying.IStartable.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus -JustSaying.JustSayingBus.AddMessageMiddleware(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> void -JustSaying.JustSayingBus.AddMessagePublisher(JustSaying.Messaging.IMessagePublisher messagePublisher) -> void -JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.JustSayingBus.Completion.get -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.Config.get -> JustSaying.IMessagingConfig -JustSaying.JustSayingBus.Dispose() -> void -JustSaying.JustSayingBus.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.JustSayingBus.SetGroupSettings(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary settings) -> void -JustSaying.JustSayingBus.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Channels.Context.IMessageDeleter.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IQueueMessageContext -JustSaying.Messaging.Channels.Context.IQueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext -JustSaying.Messaging.Channels.Context.QueueMessageContext.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.QueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.MessageReceivePauseSignal() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.SubscriptionGroupCollection(System.Collections.Generic.IList subscriptionGroups, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.Build(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.SubscriptionGroupConfigBuilder(string groupName) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Name.get -> string -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SqsMiddleware.get -> JustSaying.Messaging.Middleware.MiddlewareBase> -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SubscriptionGroupSettingsBuilder() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithCustomMiddleware(JustSaying.Messaging.Middleware.MiddlewareBase> middleware) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation -JustSaying.Messaging.IMessagePublisher -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Interrogation.IInterrogable -JustSaying.Messaging.Interrogation.IInterrogable.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult.Data.get -> object -JustSaying.Messaging.Interrogation.InterrogationResult.InterrogationResult(object data) -> void -JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageAttributeValue.BinaryValue.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.MessageAttributeValue.BinaryValue.set -> void -JustSaying.Messaging.MessageAttributeValue.DataType.get -> string -JustSaying.Messaging.MessageAttributeValue.DataType.set -> void -JustSaying.Messaging.MessageAttributeValue.MessageAttributeValue() -> void -JustSaying.Messaging.MessageAttributeValue.StringValue.get -> string -JustSaying.Messaging.MessageAttributeValue.StringValue.set -> void -JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.Messaging.MessageHandling.IHandlerAsync.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageContextAccessor -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.IMessageContextReader -JustSaying.Messaging.MessageHandling.IMessageContextReader.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageLockAsync -JustSaying.Messaging.MessageHandling.IMessageLockAsync.ReleaseLockAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockAsync(string key, System.TimeSpan howLong) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockPermanentlyAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler -JustSaying.Messaging.MessageHandling.ListHandler.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler.ListHandler(System.Collections.Generic.IEnumerable> handlers) -> void -JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageAttributes.Get(string value) -> JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes() -> void -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes(System.Collections.Generic.Dictionary attributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.MessageHandling.MessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageContext.MessageContext(Amazon.SQS.Model.Message message, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.MessageHandling.MessageContextAccessor -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContextAccessor() -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.get -> System.DateTimeOffset -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.get -> long -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.MessageLockResponse() -> void -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy.GetBackoffDuration(JustSaying.Models.Message message, int approximateReceiveCount, System.Exception lastException = null) -> System.TimeSpan -JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults -JustSaying.Messaging.MessagePublisherExtensions -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException() -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message, System.Exception innerException) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.NonGenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.TypeSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type -JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware.BackoffMiddleware(JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware.ErrorHandlerMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware.ExactlyOnceMiddleware(JustSaying.Messaging.MessageHandling.IMessageLockAsync messageLock, System.TimeSpan timeout, string handlerName, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.HandleMessageContext -JustSaying.Messaging.Middleware.HandleMessageContext.HandledException.get -> System.Exception -JustSaying.Messaging.Middleware.HandleMessageContext.HandleMessageContext(string queueName, Amazon.SQS.Model.Message rawMessage, JustSaying.Models.Message message, System.Type messageType, JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater visibilityUpdater, JustSaying.Messaging.Channels.Context.IMessageDeleter messageDeleter, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.Middleware.HandleMessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.Middleware.HandleMessageContext.MessageDeleter.get -> JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Middleware.HandleMessageContext.MessageType.get -> System.Type -JustSaying.Messaging.Middleware.HandleMessageContext.QueueName.get -> string -JustSaying.Messaging.Middleware.HandleMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Middleware.HandleMessageContext.RawMessage.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Middleware.HandleMessageContext.SetException(System.Exception e) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.VisibilityUpdater.get -> JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Middleware.HandleMessageContextExtensions -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware.HandlerInvocationMiddleware(System.Func> handlerResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Build() -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Configure(System.Action configure) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.HandlerMiddlewareBuilder(JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(System.Func> middlewareFactory) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.UseHandler() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware.LoggingMiddleware(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware.MessageContextAccessorMiddleware(JustSaying.Messaging.MessageHandling.IMessageContextAccessor messageContextAccessor) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBase.MiddlewareBase() -> void -JustSaying.Messaging.Middleware.MiddlewareBase.RunAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Middleware.MiddlewareBase.WithNext(JustSaying.Messaging.Middleware.MiddlewareBase next) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBuilder -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.SqsPostProcessorMiddleware() -> void -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.DefaultReceiveMessagesMiddleware(Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.get -> int -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.ReceiveMessagesContext() -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.set -> void -JustSaying.Messaging.Middleware.StopwatchMiddleware -JustSaying.Messaging.Middleware.StopwatchMiddleware.StopwatchMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor, System.Type handlerType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor -JustSaying.Messaging.Monitoring.IMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.NullOpMessageMonitor() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, double value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, JustSaying.Messaging.MessageAttributeValue value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, string value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, System.Collections.Generic.IReadOnlyCollection data) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.Delay.get -> System.TimeSpan? -JustSaying.Messaging.PublishMetadata.Delay.set -> void -JustSaying.Messaging.PublishMetadata.MessageAttributes.get -> System.Collections.Generic.IDictionary -JustSaying.Messaging.PublishMetadata.PublishMetadata() -> void -JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.BuildClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.MessagingBusBuilder.BuildPublisher() -> JustSaying.Messaging.IMessagePublisher -JustSaying.MessagingBusBuilder.BuildSubscribers() -> JustSaying.IMessagingBus -JustSaying.MessagingBusBuilder.Client(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Messaging(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.MessagingBusBuilder() -> void -JustSaying.MessagingBusBuilder.Publications(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Services(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Subscriptions(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.WithServiceResolver(JustSaying.Fluent.IServiceResolver serviceResolver) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingConfig -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.set -> void -JustSaying.MessagingConfig.MessageResponseLogger.get -> System.Action -JustSaying.MessagingConfig.MessageResponseLogger.set -> void -JustSaying.MessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.MessagingConfig.MessageSubjectProvider.set -> void -JustSaying.MessagingConfig.MessagingConfig() -> void -JustSaying.MessagingConfig.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.MessagingConfig.PublishFailureBackoff.set -> void -JustSaying.MessagingConfig.PublishFailureReAttempts.get -> int -JustSaying.MessagingConfig.PublishFailureReAttempts.set -> void -JustSaying.MessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.MessagingConfig.QueueNamingConvention.set -> void -JustSaying.MessagingConfig.Region.get -> string -JustSaying.MessagingConfig.Region.set -> void -JustSaying.MessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.MessagingConfig.TopicNamingConvention.set -> void -JustSaying.Naming.DefaultNamingConventions -JustSaying.Naming.DefaultNamingConventions.DefaultNamingConventions() -> void -JustSaying.Naming.IQueueNamingConvention -JustSaying.Naming.IQueueNamingConvention.QueueName() -> string -JustSaying.Naming.ITopicNamingConvention -JustSaying.Naming.ITopicNamingConvention.TopicName() -> string -JustSaying.Naming.NamingConventionExtensions -override JustSaying.AwsTools.ErrorQueue.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.ErrorQueue.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -override JustSaying.AwsTools.ErrorQueue.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.QueueCreation.RedrivePolicy.ToString() -> string -override JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.OnValidating() -> void -override JustSaying.Messaging.MessageHandling.MessageLockResponse.ToString() -> string -override JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.HandleMessageContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -override JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext context, System.Func>> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task> -static JustSaying.AwsTools.JustSayingConstants.DefaultAttributeEncryptionKeyReusePeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultHandlerRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryInterval.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultSnsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultSqsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultVisibilityTimeout.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.QueueCreation.RedrivePolicy.ConvertFromString(string policy) -> JustSaying.AwsTools.QueueCreation.RedrivePolicy -static JustSaying.Extensions.ChannelExtensions.MergeAsync(System.Collections.Generic.IEnumerable> inputs, System.Threading.Channels.ChannelWriter output, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation.Validate(this JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings settings) -> void -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.MaxAmazonMessageCap.get -> int -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.ParallelHandlerExecutionPerCore.get -> int -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions.UseBackoff(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions.UseErrorHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions.UseExactlyOnce(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, string lockKey, System.TimeSpan? lockDuration = null) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandleMessageContextExtensions.MessageAs(this JustSaying.Messaging.Middleware.HandleMessageContext context) -> TMessage -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseDefaults(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Func> handler) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions.UseMessageContextAccessor(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions.UseStopwatch(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MiddlewareBuilder.BuildAsync(params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Messaging.Middleware.MiddlewareBuilder.WithAsync(this JustSaying.Messaging.Middleware.MiddlewareBase inner, params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.IQueueNamingConvention namingConvention, string overrideQueueName) -> string -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.ITopicNamingConvention namingConvention, string overrideTopicName) -> string -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceConfig config) -> void -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SQS.AmazonSQSConfig config) -> void -virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.OnValidating() -> void -virtual JustSaying.MessagingConfig.Validate() -> void -virtual JustSaying.Naming.DefaultNamingConventions.QueueName() -> string -virtual JustSaying.Naming.DefaultNamingConventions.TopicName() -> string diff --git a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt index 20d8e368b..8b3026f3b 100644 --- a/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net461/PublicAPI.Unshipped.txt @@ -1,54 +1,5 @@ -JustSaying.AwsTools.MessageHandling.MessageBatchResponse -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.FailedMessageIds.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.FailedMessageIds.set -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.HttpStatusCode.set -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.MessageBatchResponse() -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.ResponseMetadata.set -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.SuccessfulMessageIds.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.SuccessfulMessageIds.set -> void -JustSaying.AwsTools.MessageHandling.PublishBatchException -JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException() -> void -JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException(string message) -> void -JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException(string message, System.Exception inner) -> void +JustSaying.AwsTools.MessageHandling.PublishException.PublishException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.HandleBatchException.get -> System.Func, bool> -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.HandleBatchException.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageBatchResponseLogger.get -> System.Action> -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageBatchResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageBatchResponseLogger.get -> System.Action> -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageBatchResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Fluent.MessagingConfigurationBuilder.BuildPublishBatchConfiguration() -> JustSaying.IPublishBatchConfiguration -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action> logger) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoffForBatch(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattemptsForBatch(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func, bool> exceptionBatchHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.IPublishBatchConfiguration -JustSaying.IPublishBatchConfiguration.MessageBatchResponseLogger.get -> System.Action> -JustSaying.IPublishBatchConfiguration.MessageBatchResponseLogger.set -> void -JustSaying.IPublishBatchConfiguration.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.IPublishBatchConfiguration.PublishFailureBackoff.set -> void -JustSaying.IPublishBatchConfiguration.PublishFailureReAttempts.get -> int -JustSaying.IPublishBatchConfiguration.PublishFailureReAttempts.set -> void -JustSaying.JustSayingBus.AddMessageBatchPublisher(JustSaying.Messaging.IMessageBatchPublisher messageBatchPublisher) -> void -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, JustSaying.IPublishBatchConfiguration publishBatchConfiguration) -> void -JustSaying.JustSayingBus.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.PublishBatchConfiguration.get -> JustSaying.IPublishBatchConfiguration -JustSaying.Messaging.IMessageBatchPublisher -JustSaying.Messaging.IMessageBatchPublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -JustSaying.Messaging.PublishBatchMetadata -JustSaying.Messaging.PublishBatchMetadata.BatchSize.get -> int -JustSaying.Messaging.PublishBatchMetadata.BatchSize.set -> void -JustSaying.Messaging.PublishBatchMetadata.PublishBatchMetadata() -> void -JustSaying.MessagingBusBuilder.BuildBatchPublisher() -> JustSaying.Messaging.IMessageBatchPublisher -JustSaying.MessagingConfig.MessageBatchResponseLogger.get -> System.Action> -JustSaying.MessagingConfig.MessageBatchResponseLogger.set -> void -static JustSaying.AwsTools.JustSayingConstants.MaximumSnsBatchSize.get -> int -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessageBatchPublisher publisher, System.Collections.Generic.IEnumerable messages, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task \ No newline at end of file diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt index a1c0546c3..e69de29bb 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Shipped.txt @@ -1,745 +0,0 @@ -abstract JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -abstract JustSaying.Messaging.Middleware.MiddlewareBase.RunInnerAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -const JustSaying.AwsTools.JustSayingConstants.AttributeArn = "QueueArn" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeDeliveryDelay = "DelaySeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyId = "KmsMasterKeyId" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyReusePeriodSecondId = "KmsDataKeyReusePeriodSeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributePolicy = "Policy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRedrivePolicy = "RedrivePolicy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRetentionPeriod = "MessageRetentionPeriod" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeVisibilityTimeout = "VisibilityTimeout" -> string -JustSaying.AwsTools.AwsClientFactoryProxy -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy() -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Func awsClientFactoryFunc) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Lazy factory) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.AwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.DefaultAwsClientFactory -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory() -> void -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory(Amazon.Runtime.AWSCredentials customCredentials) -> void -JustSaying.AwsTools.DefaultAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.DefaultAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.get -> System.Uri -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.set -> void -JustSaying.AwsTools.ErrorQueue -JustSaying.AwsTools.ErrorQueue.ErrorQueue(Amazon.RegionEndpoint region, string sourceQueueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.IAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.IAwsClientFactoryProxy -JustSaying.AwsTools.IAwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.JustSayingConstants -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Get(string queueName, System.Type messageType) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.MiddlewareMap() -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Types.get -> System.Collections.Generic.IEnumerable -JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.ISqsQueue.Arn.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.ISqsQueue.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.Uri.get -> System.Uri -JustSaying.AwsTools.MessageHandling.MessageResponse -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.get -> string -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageResponse() -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.set -> void -JustSaying.AwsTools.MessageHandling.PublishException -JustSaying.AwsTools.MessageHandling.PublishException.PublishException() -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message, System.Exception inner) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.Queue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(System.Func startupTask, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.StartupTask.get -> System.Func -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ApplyTagsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateWithEncryptionAsync(JustSaying.AwsTools.QueueCreation.ServerSideEncryption config, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.EnsurePolicyIsUpdatedAsync(System.Collections.Generic.IReadOnlyCollection additionalSubscriberAccounts) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SnsTopicByName.SnsTopicByName(string topicName, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collections.Generic.IDictionary -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName -JustSaying.AwsTools.MessageHandling.SqsQueueByName.EnsureQueueAndErrorQueueExistAndAllAttributesAreUpdatedAsync(JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName.SqsQueueByName(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, int retryCountBeforeSendingToErrorQueue, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Client.get -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Logger.get -> Microsoft.Extensions.Logging.ILogger -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.SqsQueueByNameBase(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Uri.get -> System.Uri -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.AmazonQueueCreator(JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactory, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException() -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message, System.Exception inner) -> void -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.RedrivePolicy -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.get -> string -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.get -> int -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy() -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy(int maximumReceives, string deadLetterQueue) -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.get -> string -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.ServerSideEncryption() -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.get -> System.Func -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.SnsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ApplyQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.get -> bool -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.get -> string -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.get -> int -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.SqsBasicConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.Validate() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.ApplyTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SqsReadConfiguration(JustSaying.AwsTools.QueueCreation.SubscriptionType subscriptionType) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionType.get -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.get -> System.Collections.Generic.Dictionary -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.set -> void -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.SqsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.PointToPoint = 1 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.ToTopic = 0 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.Extensions.ChannelExtensions -JustSaying.Fluent.AccountAddressProvider -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.GetQueueUri(string queueName) -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetQueueUriByConvention() -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetTopicArn(string topicName) -> string -JustSaying.Fluent.AccountAddressProvider.GetTopicArnByConvention() -> string -JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.Build() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.Fluent.AwsClientFactoryBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithAnonymousCredentials() -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithBasicCredentials(string accessKey, string secretKey) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithClientFactory(System.Func clientFactory) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithCredentials(Amazon.Runtime.AWSCredentials credentials) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUri(System.Uri uri) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUrl(string url) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithSessionCredentials(string accessKeyId, string secretAccessKey, string token) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.IMessageBusConfigurationContributor -JustSaying.Fluent.IMessageBusConfigurationContributor.Configure(JustSaying.MessagingBusBuilder builder) -> void -JustSaying.Fluent.IServiceResolver -JustSaying.Fluent.IServiceResolver.ResolveOptionalService() -> T -JustSaying.Fluent.IServiceResolver.ResolveService() -> T -JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.ISubscriptionBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver, JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues creator, JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactoryProxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.ISubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.Build() -> JustSaying.IMessagingConfig -JustSaying.Fluent.MessagingConfigurationBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccount(string accountId) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(params string[] regions) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(System.Collections.Generic.IEnumerable accountIds) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action logger) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageSubjectProvider(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider subjectProvider) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoff(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattempts(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(Amazon.RegionEndpoint region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(string region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueArn(string queueArn) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUri(System.Uri queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUrl(string queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopicArn(string topicArn, System.Action> configure = null) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.QueueAddressConfiguration -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void -JustSaying.Fluent.QueueAddressConfiguration.QueueAddressConfiguration() -> void -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.get -> string -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.set -> void -JustSaying.Fluent.QueueAddressConfiguration.Validate() -> void -JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithName(string queueName) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithDefaultQueue() -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(JustSaying.IHandlerResolver handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(System.Func handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(System.Func loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageContextAccessor(System.Func contextAccessor) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageMonitoring(System.Func monitoring) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder.SnsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SnsWriteConfigurationBuilder.WithErrorHandler(System.Func handler) -> JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(JustSaying.AwsTools.QueueCreation.ServerSideEncryption encryption) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(string masterKeyId) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueueOptOut(bool value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithMessageRetention(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithNoErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithVisibilityTimeout(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.SqsReadConfigurationBuilder() -> void -JustSaying.Fluent.SqsReadConfigurationBuilder.WithSubscriptionGroup(string subscriptionGroupName) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.WithTopicSourceAccount(string id) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder.SqsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SqsWriteConfigurationBuilder.WithQueueName(string name) -> JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueArn(string queueArn, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUri(System.Uri queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUrl(string queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(string topicNameOverride, System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithDefaults(System.Action configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithSubscriptionGroup(string groupName, System.Action action) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func exceptionHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.get -> System.Func -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.set -> void -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(System.Func topicNameCustomizer) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.IntoDefaultTopic() -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.HandlerNotRegisteredWithContainerException -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException() -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message, System.Exception inner) -> void -JustSaying.HandlerResolutionContext -JustSaying.HandlerResolutionContext.HandlerResolutionContext(string queueName) -> void -JustSaying.HandlerResolutionContext.QueueName.get -> string -JustSaying.IHandlerResolver -JustSaying.IHandlerResolver.ResolveHandler(JustSaying.HandlerResolutionContext context) -> JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.IMessagingBus -JustSaying.IMessagingConfig -JustSaying.IMessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.IMessagingConfig.MessageSubjectProvider.set -> void -JustSaying.IMessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.IMessagingConfig.QueueNamingConvention.set -> void -JustSaying.IMessagingConfig.Region.get -> string -JustSaying.IMessagingConfig.Region.set -> void -JustSaying.IMessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.IMessagingConfig.TopicNamingConvention.set -> void -JustSaying.IMessagingConfig.Validate() -> void -JustSaying.IPublishConfiguration -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.set -> void -JustSaying.IPublishConfiguration.MessageResponseLogger.get -> System.Action -JustSaying.IPublishConfiguration.MessageResponseLogger.set -> void -JustSaying.IPublishConfiguration.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.IPublishConfiguration.PublishFailureBackoff.set -> void -JustSaying.IPublishConfiguration.PublishFailureReAttempts.get -> int -JustSaying.IPublishConfiguration.PublishFailureReAttempts.set -> void -JustSaying.IStartable -JustSaying.IStartable.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus -JustSaying.JustSayingBus.AddMessageMiddleware(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> void -JustSaying.JustSayingBus.AddMessagePublisher(JustSaying.Messaging.IMessagePublisher messagePublisher) -> void -JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.JustSayingBus.Completion.get -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.Config.get -> JustSaying.IMessagingConfig -JustSaying.JustSayingBus.Dispose() -> void -JustSaying.JustSayingBus.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.JustSayingBus.SetGroupSettings(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary settings) -> void -JustSaying.JustSayingBus.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Channels.Context.IMessageDeleter.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IQueueMessageContext -JustSaying.Messaging.Channels.Context.IQueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext -JustSaying.Messaging.Channels.Context.QueueMessageContext.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.QueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.MessageReceivePauseSignal() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.SubscriptionGroupCollection(System.Collections.Generic.IList subscriptionGroups, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.Build(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.SubscriptionGroupConfigBuilder(string groupName) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Name.get -> string -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SqsMiddleware.get -> JustSaying.Messaging.Middleware.MiddlewareBase> -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SubscriptionGroupSettingsBuilder() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithCustomMiddleware(JustSaying.Messaging.Middleware.MiddlewareBase> middleware) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation -JustSaying.Messaging.IMessagePublisher -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Interrogation.IInterrogable -JustSaying.Messaging.Interrogation.IInterrogable.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult.Data.get -> object -JustSaying.Messaging.Interrogation.InterrogationResult.InterrogationResult(object data) -> void -JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageAttributeValue.BinaryValue.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.MessageAttributeValue.BinaryValue.set -> void -JustSaying.Messaging.MessageAttributeValue.DataType.get -> string -JustSaying.Messaging.MessageAttributeValue.DataType.set -> void -JustSaying.Messaging.MessageAttributeValue.MessageAttributeValue() -> void -JustSaying.Messaging.MessageAttributeValue.StringValue.get -> string -JustSaying.Messaging.MessageAttributeValue.StringValue.set -> void -JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.Messaging.MessageHandling.IHandlerAsync.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageContextAccessor -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.IMessageContextReader -JustSaying.Messaging.MessageHandling.IMessageContextReader.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageLockAsync -JustSaying.Messaging.MessageHandling.IMessageLockAsync.ReleaseLockAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockAsync(string key, System.TimeSpan howLong) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockPermanentlyAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler -JustSaying.Messaging.MessageHandling.ListHandler.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler.ListHandler(System.Collections.Generic.IEnumerable> handlers) -> void -JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageAttributes.Get(string value) -> JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes() -> void -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes(System.Collections.Generic.Dictionary attributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.MessageHandling.MessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageContext.MessageContext(Amazon.SQS.Model.Message message, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.MessageHandling.MessageContextAccessor -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContextAccessor() -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.get -> System.DateTimeOffset -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.get -> long -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.MessageLockResponse() -> void -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy.GetBackoffDuration(JustSaying.Models.Message message, int approximateReceiveCount, System.Exception lastException = null) -> System.TimeSpan -JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults -JustSaying.Messaging.MessagePublisherExtensions -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException() -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message, System.Exception innerException) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.NonGenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.TypeSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type -JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware.BackoffMiddleware(JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware.ErrorHandlerMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware.ExactlyOnceMiddleware(JustSaying.Messaging.MessageHandling.IMessageLockAsync messageLock, System.TimeSpan timeout, string handlerName, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.HandleMessageContext -JustSaying.Messaging.Middleware.HandleMessageContext.HandledException.get -> System.Exception -JustSaying.Messaging.Middleware.HandleMessageContext.HandleMessageContext(string queueName, Amazon.SQS.Model.Message rawMessage, JustSaying.Models.Message message, System.Type messageType, JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater visibilityUpdater, JustSaying.Messaging.Channels.Context.IMessageDeleter messageDeleter, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.Middleware.HandleMessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.Middleware.HandleMessageContext.MessageDeleter.get -> JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Middleware.HandleMessageContext.MessageType.get -> System.Type -JustSaying.Messaging.Middleware.HandleMessageContext.QueueName.get -> string -JustSaying.Messaging.Middleware.HandleMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Middleware.HandleMessageContext.RawMessage.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Middleware.HandleMessageContext.SetException(System.Exception e) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.VisibilityUpdater.get -> JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Middleware.HandleMessageContextExtensions -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware.HandlerInvocationMiddleware(System.Func> handlerResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Build() -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Configure(System.Action configure) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.HandlerMiddlewareBuilder(JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(System.Func> middlewareFactory) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.UseHandler() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware.LoggingMiddleware(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware.MessageContextAccessorMiddleware(JustSaying.Messaging.MessageHandling.IMessageContextAccessor messageContextAccessor) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBase.MiddlewareBase() -> void -JustSaying.Messaging.Middleware.MiddlewareBase.RunAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Middleware.MiddlewareBase.WithNext(JustSaying.Messaging.Middleware.MiddlewareBase next) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBuilder -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.SqsPostProcessorMiddleware() -> void -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.DefaultReceiveMessagesMiddleware(Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.get -> int -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.ReceiveMessagesContext() -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.set -> void -JustSaying.Messaging.Middleware.StopwatchMiddleware -JustSaying.Messaging.Middleware.StopwatchMiddleware.StopwatchMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor, System.Type handlerType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor -JustSaying.Messaging.Monitoring.IMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.NullOpMessageMonitor() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, double value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, JustSaying.Messaging.MessageAttributeValue value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, string value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, System.Collections.Generic.IReadOnlyCollection data) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.Delay.get -> System.TimeSpan? -JustSaying.Messaging.PublishMetadata.Delay.set -> void -JustSaying.Messaging.PublishMetadata.MessageAttributes.get -> System.Collections.Generic.IDictionary -JustSaying.Messaging.PublishMetadata.PublishMetadata() -> void -JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.BuildClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.MessagingBusBuilder.BuildPublisher() -> JustSaying.Messaging.IMessagePublisher -JustSaying.MessagingBusBuilder.BuildSubscribers() -> JustSaying.IMessagingBus -JustSaying.MessagingBusBuilder.Client(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Messaging(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.MessagingBusBuilder() -> void -JustSaying.MessagingBusBuilder.Publications(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Services(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Subscriptions(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.WithServiceResolver(JustSaying.Fluent.IServiceResolver serviceResolver) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingConfig -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.set -> void -JustSaying.MessagingConfig.MessageResponseLogger.get -> System.Action -JustSaying.MessagingConfig.MessageResponseLogger.set -> void -JustSaying.MessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.MessagingConfig.MessageSubjectProvider.set -> void -JustSaying.MessagingConfig.MessagingConfig() -> void -JustSaying.MessagingConfig.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.MessagingConfig.PublishFailureBackoff.set -> void -JustSaying.MessagingConfig.PublishFailureReAttempts.get -> int -JustSaying.MessagingConfig.PublishFailureReAttempts.set -> void -JustSaying.MessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.MessagingConfig.QueueNamingConvention.set -> void -JustSaying.MessagingConfig.Region.get -> string -JustSaying.MessagingConfig.Region.set -> void -JustSaying.MessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.MessagingConfig.TopicNamingConvention.set -> void -JustSaying.Naming.DefaultNamingConventions -JustSaying.Naming.DefaultNamingConventions.DefaultNamingConventions() -> void -JustSaying.Naming.IQueueNamingConvention -JustSaying.Naming.IQueueNamingConvention.QueueName() -> string -JustSaying.Naming.ITopicNamingConvention -JustSaying.Naming.ITopicNamingConvention.TopicName() -> string -JustSaying.Naming.NamingConventionExtensions -override JustSaying.AwsTools.ErrorQueue.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.ErrorQueue.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -override JustSaying.AwsTools.ErrorQueue.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.QueueCreation.RedrivePolicy.ToString() -> string -override JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.OnValidating() -> void -override JustSaying.Messaging.MessageHandling.MessageLockResponse.ToString() -> string -override JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.HandleMessageContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -override JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext context, System.Func>> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task> -static JustSaying.AwsTools.JustSayingConstants.DefaultAttributeEncryptionKeyReusePeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultHandlerRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryInterval.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultSnsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultSqsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultVisibilityTimeout.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.QueueCreation.RedrivePolicy.ConvertFromString(string policy) -> JustSaying.AwsTools.QueueCreation.RedrivePolicy -static JustSaying.Extensions.ChannelExtensions.MergeAsync(System.Collections.Generic.IEnumerable> inputs, System.Threading.Channels.ChannelWriter output, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation.Validate(this JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings settings) -> void -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.MaxAmazonMessageCap.get -> int -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.ParallelHandlerExecutionPerCore.get -> int -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions.UseBackoff(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions.UseErrorHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions.UseExactlyOnce(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, string lockKey, System.TimeSpan? lockDuration = null) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandleMessageContextExtensions.MessageAs(this JustSaying.Messaging.Middleware.HandleMessageContext context) -> TMessage -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseDefaults(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Func> handler) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions.UseMessageContextAccessor(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions.UseStopwatch(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MiddlewareBuilder.BuildAsync(params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Messaging.Middleware.MiddlewareBuilder.WithAsync(this JustSaying.Messaging.Middleware.MiddlewareBase inner, params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.IQueueNamingConvention namingConvention, string overrideQueueName) -> string -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.ITopicNamingConvention namingConvention, string overrideTopicName) -> string -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceConfig config) -> void -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SQS.AmazonSQSConfig config) -> void -virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.OnValidating() -> void -virtual JustSaying.MessagingConfig.Validate() -> void -virtual JustSaying.Naming.DefaultNamingConventions.QueueName() -> string -virtual JustSaying.Naming.DefaultNamingConventions.TopicName() -> string diff --git a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt index dc8321353..e69de29bb 100644 --- a/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -1,53 +0,0 @@ -JustSaying.AwsTools.MessageHandling.MessageBatchResponse -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.FailedMessageIds.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.FailedMessageIds.set -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.HttpStatusCode.set -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.MessageBatchResponse() -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.ResponseMetadata.set -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.SuccessfulMessageIds.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.SuccessfulMessageIds.set -> void -JustSaying.AwsTools.MessageHandling.PublishBatchException -JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException() -> void -JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException(string message) -> void -JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException(string message, System.Exception inner) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.HandleBatchException.get -> System.Func, bool> -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.HandleBatchException.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageBatchResponseLogger.get -> System.Action> -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageBatchResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageBatchResponseLogger.get -> System.Action> -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageBatchResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Fluent.MessagingConfigurationBuilder.BuildPublishBatchConfiguration() -> JustSaying.IPublishBatchConfiguration -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action> logger) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoffForBatch(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattemptsForBatch(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func, bool> exceptionBatchHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.IPublishBatchConfiguration -JustSaying.IPublishBatchConfiguration.MessageBatchResponseLogger.get -> System.Action> -JustSaying.IPublishBatchConfiguration.MessageBatchResponseLogger.set -> void -JustSaying.IPublishBatchConfiguration.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.IPublishBatchConfiguration.PublishFailureBackoff.set -> void -JustSaying.IPublishBatchConfiguration.PublishFailureReAttempts.get -> int -JustSaying.IPublishBatchConfiguration.PublishFailureReAttempts.set -> void -JustSaying.JustSayingBus.AddMessageBatchPublisher(JustSaying.Messaging.IMessageBatchPublisher messageBatchPublisher) -> void -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, JustSaying.IPublishBatchConfiguration publishBatchConfiguration) -> void -JustSaying.JustSayingBus.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.PublishBatchConfiguration.get -> JustSaying.IPublishBatchConfiguration -JustSaying.Messaging.IMessageBatchPublisher -JustSaying.Messaging.IMessageBatchPublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -JustSaying.Messaging.PublishBatchMetadata -JustSaying.Messaging.PublishBatchMetadata.BatchSize.get -> int -JustSaying.Messaging.PublishBatchMetadata.BatchSize.set -> void -JustSaying.Messaging.PublishBatchMetadata.PublishBatchMetadata() -> void -JustSaying.MessagingBusBuilder.BuildBatchPublisher() -> JustSaying.Messaging.IMessageBatchPublisher -JustSaying.MessagingConfig.MessageBatchResponseLogger.get -> System.Action> -JustSaying.MessagingConfig.MessageBatchResponseLogger.set -> void -static JustSaying.AwsTools.JustSayingConstants.MaximumSnsBatchSize.get -> int -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessageBatchPublisher publisher, System.Collections.Generic.IEnumerable messages, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt index ac3e28b2f..e69de29bb 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt @@ -1,749 +0,0 @@ -abstract JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -abstract JustSaying.Messaging.Middleware.MiddlewareBase.RunInnerAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -const JustSaying.AwsTools.JustSayingConstants.AttributeArn = "QueueArn" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeDeliveryDelay = "DelaySeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyId = "KmsMasterKeyId" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeEncryptionKeyReusePeriodSecondId = "KmsDataKeyReusePeriodSeconds" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributePolicy = "Policy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRedrivePolicy = "RedrivePolicy" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeRetentionPeriod = "MessageRetentionPeriod" -> string -const JustSaying.AwsTools.JustSayingConstants.AttributeVisibilityTimeout = "VisibilityTimeout" -> string -JustSaying.AwsTools.AwsClientFactoryProxy -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy() -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Func awsClientFactoryFunc) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.AwsClientFactoryProxy(System.Lazy factory) -> void -JustSaying.AwsTools.AwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.AwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.DefaultAwsClientFactory -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory() -> void -JustSaying.AwsTools.DefaultAwsClientFactory.DefaultAwsClientFactory(Amazon.Runtime.AWSCredentials customCredentials) -> void -JustSaying.AwsTools.DefaultAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.DefaultAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.get -> System.Uri -JustSaying.AwsTools.DefaultAwsClientFactory.ServiceUri.set -> void -JustSaying.AwsTools.ErrorQueue -JustSaying.AwsTools.ErrorQueue.ErrorQueue(Amazon.RegionEndpoint region, string sourceQueueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactory.GetSnsClient(Amazon.RegionEndpoint region) -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.IAwsClientFactory.GetSqsClient(Amazon.RegionEndpoint region) -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.IAwsClientFactoryProxy -JustSaying.AwsTools.IAwsClientFactoryProxy.GetAwsClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.AwsTools.IAwsClientFactoryProxy.SetAwsClientFactory(System.Func func) -> void -JustSaying.AwsTools.JustSayingConstants -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.DispatchMessageAsync(JustSaying.Messaging.Channels.Context.IQueueMessageContext messageContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.Dispatch.MessageDispatcher.MessageDispatcher(JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Monitoring.IMessageMonitor messagingMonitor, JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap middlewareMap, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Add(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Contains(string queueName, System.Type messageType) -> bool -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Get(string queueName, System.Type messageType) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.MiddlewareMap() -> void -JustSaying.AwsTools.MessageHandling.Dispatch.MiddlewareMap.Types.get -> System.Collections.Generic.IEnumerable -JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.ISqsQueue.Arn.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.ISqsQueue.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.ISqsQueue.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.ISqsQueue.Uri.get -> System.Uri -JustSaying.AwsTools.MessageHandling.MessageResponse -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? -JustSaying.AwsTools.MessageHandling.MessageResponse.HttpStatusCode.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.get -> string -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageId.set -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.MessageResponse() -> void -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata -JustSaying.AwsTools.MessageHandling.MessageResponse.ResponseMetadata.set -> void -JustSaying.AwsTools.MessageHandling.PublishException -JustSaying.AwsTools.MessageHandling.PublishException.PublishException() -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(string message, System.Exception inner) -> void -JustSaying.AwsTools.MessageHandling.PublishException.PublishException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.Queue.get -> JustSaying.AwsTools.MessageHandling.ISqsQueue -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.QueueWithAsyncStartup(System.Func startupTask, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup.StartupTask.get -> System.Func -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Client.get -> Amazon.SimpleNotificationService.IAmazonSimpleNotificationService -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.SnsMessagePublisher(string topicArn, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, System.Func handleException = null) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ApplyTagsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.CreateWithEncryptionAsync(JustSaying.AwsTools.QueueCreation.ServerSideEncryption config, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.EnsurePolicyIsUpdatedAsync(System.Collections.Generic.IReadOnlyCollection additionalSubscriberAccounts) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SnsTopicByName.SnsTopicByName(string topicName, Amazon.SimpleNotificationService.IAmazonSimpleNotificationService client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.get -> System.Collections.Generic.IDictionary -JustSaying.AwsTools.MessageHandling.SnsTopicByName.Tags.set -> void -JustSaying.AwsTools.MessageHandling.SnsTopicByName.TopicName.get -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.GetMessageInContext(JustSaying.Models.Message message) -> string -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.get -> System.Action -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.QueueUrl.get -> System.Uri -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.SqsMessagePublisher(System.Uri queueUrl, Amazon.SQS.IAmazonSQS client, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.StartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName -JustSaying.AwsTools.MessageHandling.SqsQueueByName.EnsureQueueAndErrorQueueExistAndAllAttributesAreUpdatedAsync(JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByName.SqsQueueByName(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, int retryCountBeforeSendingToErrorQueue, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Arn.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Client.get -> Amazon.SQS.IAmazonSQS -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteMessageAsync(string queueUrl, string receiptHandle, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Logger.get -> Microsoft.Extensions.Logging.ILogger -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, System.Collections.Generic.IList attributesToLoad, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task> -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.RegionSystemName.get -> string -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.SqsQueueByNameBase(Amazon.RegionEndpoint region, string queueName, Amazon.SQS.IAmazonSQS client, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.TagQueueAsync(string queueUrl, System.Collections.Generic.Dictionary tags, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Uri.get -> System.Uri -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.AmazonQueueCreator(JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactory, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.AmazonQueueCreator.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException() -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(string message, System.Exception inner) -> void -JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureQueueExists(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues.EnsureTopicExistsWithQueueSubscribed(string region, JustSaying.AwsTools.QueueCreation.SqsReadConfiguration queueConfig) -> JustSaying.AwsTools.MessageHandling.QueueWithAsyncStartup -JustSaying.AwsTools.QueueCreation.RedrivePolicy -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.get -> string -JustSaying.AwsTools.QueueCreation.RedrivePolicy.DeadLetterQueue.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.get -> int -JustSaying.AwsTools.QueueCreation.RedrivePolicy.MaximumReceives.set -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy() -> void -JustSaying.AwsTools.QueueCreation.RedrivePolicy.RedrivePolicy(int maximumReceives, string deadLetterQueue) -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsDataKeyReusePeriod.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.get -> string -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.KmsMasterKeyId.set -> void -JustSaying.AwsTools.QueueCreation.ServerSideEncryption.ServerSideEncryption() -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.Encryption.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.get -> System.Func -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.HandleException.set -> void -JustSaying.AwsTools.QueueCreation.SnsWriteConfiguration.SnsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ApplyQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.DeliveryDelay.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.get -> bool -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueOptOut.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ErrorQueueRetentionPeriod.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.MessageRetention.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.get -> string -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.QueueName.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.get -> int -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.RetryCountBeforeSendingToErrorQueue.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.get -> JustSaying.AwsTools.QueueCreation.ServerSideEncryption -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.ServerSideEncryption.set -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.SqsBasicConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.Validate() -> void -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.get -> System.TimeSpan -JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.VisibilityTimeout.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.ApplyTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.FilterPolicy.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.PublishEndpoint.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SqsReadConfiguration(JustSaying.AwsTools.QueueCreation.SubscriptionType subscriptionType) -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionGroupName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.SubscriptionType.get -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.get -> System.Collections.Generic.Dictionary -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.Tags.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicName.set -> void -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.get -> string -JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.TopicSourceAccount.set -> void -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration -JustSaying.AwsTools.QueueCreation.SqsWriteConfiguration.SqsWriteConfiguration() -> void -JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.PointToPoint = 1 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.AwsTools.QueueCreation.SubscriptionType.ToTopic = 0 -> JustSaying.AwsTools.QueueCreation.SubscriptionType -JustSaying.Extensions.ChannelExtensions -JustSaying.Fluent.AccountAddressProvider -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, Amazon.RegionEndpoint regionEndpoint, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName) -> void -JustSaying.Fluent.AccountAddressProvider.AccountAddressProvider(string accountId, string regionName, JustSaying.Naming.IQueueNamingConvention queueNamingConvention, JustSaying.Naming.ITopicNamingConvention topicNamingConvention) -> void -JustSaying.Fluent.AccountAddressProvider.GetQueueUri(string queueName) -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetQueueUriByConvention() -> System.Uri -JustSaying.Fluent.AccountAddressProvider.GetTopicArn(string topicName) -> string -JustSaying.Fluent.AccountAddressProvider.GetTopicArnByConvention() -> string -JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.Build() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.Fluent.AwsClientFactoryBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithAnonymousCredentials() -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithBasicCredentials(string accessKey, string secretKey) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithClientFactory(System.Func clientFactory) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithCredentials(Amazon.Runtime.AWSCredentials credentials) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUri(System.Uri uri) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithServiceUrl(string url) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.AwsClientFactoryBuilder.WithSessionCredentials(string accessKeyId, string secretAccessKey, string token) -> JustSaying.Fluent.AwsClientFactoryBuilder -JustSaying.Fluent.IMessageBusConfigurationContributor -JustSaying.Fluent.IMessageBusConfigurationContributor.Configure(JustSaying.MessagingBusBuilder builder) -> void -JustSaying.Fluent.IServiceResolver -JustSaying.Fluent.IServiceResolver.ResolveOptionalService() -> T -JustSaying.Fluent.IServiceResolver.ResolveService() -> T -JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.ISubscriptionBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver, JustSaying.AwsTools.QueueCreation.IVerifyAmazonQueues creator, JustSaying.AwsTools.IAwsClientFactoryProxy awsClientFactoryProxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.ISubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.Build() -> JustSaying.IMessagingConfig -JustSaying.Fluent.MessagingConfigurationBuilder.BusBuilder.get -> JustSaying.MessagingBusBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccount(string accountId) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(params string[] regions) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithAdditionalSubscriberAccounts(System.Collections.Generic.IEnumerable accountIds) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action logger) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageSubjectProvider(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider subjectProvider) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoff(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattempts(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention(JustSaying.Naming.IQueueNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithQueueNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(Amazon.RegionEndpoint region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithRegion(string region) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention(JustSaying.Naming.ITopicNamingConvention namingConvention) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithTopicNamingConvention() -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueue(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueArn(string queueArn) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUri(System.Uri queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithQueueUrl(string queueUrl) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic() -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopic(System.Action> configure) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.PublicationsBuilder.WithTopicArn(string topicArn, System.Action> configure = null) -> JustSaying.Fluent.PublicationsBuilder -JustSaying.Fluent.QueueAddressConfiguration -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.get -> System.Action -JustSaying.Fluent.QueueAddressConfiguration.MiddlewareConfiguration.set -> void -JustSaying.Fluent.QueueAddressConfiguration.QueueAddressConfiguration() -> void -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.get -> string -JustSaying.Fluent.QueueAddressConfiguration.SubscriptionGroupName.set -> void -JustSaying.Fluent.QueueAddressConfiguration.Validate() -> void -JustSaying.Fluent.QueueAddressPublicationBuilder -JustSaying.Fluent.QueueAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueAddressSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueAddressSubscriptionBuilder -JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithName(string queueName) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueuePublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.QueuePublicationBuilder -JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithDefaultQueue() -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.QueueSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.QueueSubscriptionBuilder -JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(JustSaying.IHandlerResolver handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithHandlerResolver(System.Func handlerResolver) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithLoggerFactory(System.Func loggerFactory) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageContextAccessor(System.Func contextAccessor) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.ServicesBuilder.WithMessageMonitoring(System.Func monitoring) -> JustSaying.Fluent.ServicesBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SnsWriteConfigurationBuilder.SnsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SnsWriteConfigurationBuilder.WithErrorHandler(System.Func handler) -> JustSaying.Fluent.SnsWriteConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(JustSaying.AwsTools.QueueCreation.ServerSideEncryption encryption) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithEncryption(string masterKeyId) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithErrorQueueOptOut(bool value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithMessageRetention(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithNoErrorQueue() -> TBuilder -JustSaying.Fluent.SqsConfigurationBuilder.WithVisibilityTimeout(System.TimeSpan value) -> TBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.SqsReadConfigurationBuilder() -> void -JustSaying.Fluent.SqsReadConfigurationBuilder.WithSubscriptionGroup(string subscriptionGroupName) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsReadConfigurationBuilder.WithTopicSourceAccount(string id) -> JustSaying.Fluent.SqsReadConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SqsWriteConfigurationBuilder.SqsWriteConfigurationBuilder() -> void -JustSaying.Fluent.SqsWriteConfigurationBuilder.WithQueueName(string name) -> JustSaying.Fluent.SqsWriteConfigurationBuilder -JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueue(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueArn(string queueArn, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUri(System.Uri queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForQueueUrl(string queueUrl, string regionName = null, System.Action> configure = null) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic() -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(string topicNameOverride, System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.ForTopic(System.Action> configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithDefaults(System.Action configure) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.SubscriptionsBuilder.WithSubscriptionGroup(string groupName, System.Action action) -> JustSaying.Fluent.SubscriptionsBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.Configure(JustSaying.JustSayingBus bus, JustSaying.AwsTools.IAwsClientFactoryProxy proxy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func exceptionHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.get -> System.Func -JustSaying.Fluent.TopicPublicationBuilder.TopicNameCustomizer.set -> void -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithTopicName(System.Func topicNameCustomizer) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicPublicationBuilder.WithWriteConfiguration(System.Action configure) -> JustSaying.Fluent.TopicPublicationBuilder -JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.IntoDefaultTopic() -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithMiddlewareConfiguration(System.Action middlewareConfiguration) -> JustSaying.Fluent.ISubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithQueueName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithReadConfiguration(System.Action configure) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTag(string key, string value) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.Fluent.TopicSubscriptionBuilder.WithTopicName(string name) -> JustSaying.Fluent.TopicSubscriptionBuilder -JustSaying.HandlerNotRegisteredWithContainerException -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException() -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(string message, System.Exception inner) -> void -JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.HandlerResolutionContext -JustSaying.HandlerResolutionContext.HandlerResolutionContext(string queueName) -> void -JustSaying.HandlerResolutionContext.QueueName.get -> string -JustSaying.IHandlerResolver -JustSaying.IHandlerResolver.ResolveHandler(JustSaying.HandlerResolutionContext context) -> JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.IMessagingBus -JustSaying.IMessagingConfig -JustSaying.IMessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.IMessagingConfig.MessageSubjectProvider.set -> void -JustSaying.IMessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.IMessagingConfig.QueueNamingConvention.set -> void -JustSaying.IMessagingConfig.Region.get -> string -JustSaying.IMessagingConfig.Region.set -> void -JustSaying.IMessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.IMessagingConfig.TopicNamingConvention.set -> void -JustSaying.IMessagingConfig.Validate() -> void -JustSaying.IPublishConfiguration -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.IPublishConfiguration.AdditionalSubscriberAccounts.set -> void -JustSaying.IPublishConfiguration.MessageResponseLogger.get -> System.Action -JustSaying.IPublishConfiguration.MessageResponseLogger.set -> void -JustSaying.IPublishConfiguration.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.IPublishConfiguration.PublishFailureBackoff.set -> void -JustSaying.IPublishConfiguration.PublishFailureReAttempts.get -> int -JustSaying.IPublishConfiguration.PublishFailureReAttempts.set -> void -JustSaying.IStartable -JustSaying.IStartable.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus -JustSaying.JustSayingBus.AddMessageMiddleware(string queueName, JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> void -JustSaying.JustSayingBus.AddMessagePublisher(JustSaying.Messaging.IMessagePublisher messagePublisher) -> void -JustSaying.JustSayingBus.AddQueue(string subscriptionGroup, JustSaying.AwsTools.MessageHandling.ISqsQueue queue) -> void -JustSaying.JustSayingBus.Completion.get -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.Config.get -> JustSaying.IMessagingConfig -JustSaying.JustSayingBus.Dispose() -> void -JustSaying.JustSayingBus.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.SerializationRegister.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.JustSayingBus.SetGroupSettings(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary settings) -> void -JustSaying.JustSayingBus.StartAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Channels.Context.IMessageDeleter.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.IQueueMessageContext -JustSaying.Messaging.Channels.Context.IQueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.IQueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext -JustSaying.Messaging.Channels.Context.QueueMessageContext.DeleteMessage(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Context.QueueMessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueName.get -> string -JustSaying.Messaging.Channels.Context.QueueMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Channels.Context.QueueMessageContext.UpdateMessageVisibilityTimeout(System.TimeSpan visibilityTimeout, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.IsPaused.get -> bool -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.MessageReceivePauseSignal() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Pause() -> void -JustSaying.Messaging.Channels.Receive.MessageReceivePauseSignal.Resume() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.RunAsync(System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupCollection.SubscriptionGroupCollection(System.Collections.Generic.IList subscriptionGroups, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueue(JustSaying.AwsTools.MessageHandling.ISqsQueue sqsQueue) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.AddQueues(System.Collections.Generic.IEnumerable sqsQueues) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.Build(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.SubscriptionGroupConfigBuilder(string groupName) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder.WithReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupConfigBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.Create(JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder defaults, System.Collections.Generic.IDictionary subscriptionGroupSettings) -> JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroup -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupFactory.SubscriptionGroupFactory(JustSaying.AwsTools.MessageHandling.Dispatch.IMessageDispatcher messageDispatcher, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Name.get -> string -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.Queues.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettings.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.BufferSize.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ConcurrencyLimit.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.MultiplexerCapacity.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.Prefetch.get -> int -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveBufferReadTimeout.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.ReceiveMessagesWaitTime.get -> System.TimeSpan -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SqsMiddleware.get -> JustSaying.Messaging.Middleware.MiddlewareBase> -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.SubscriptionGroupSettingsBuilder() -> void -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithCustomMiddleware(JustSaying.Messaging.Middleware.MiddlewareBase> middleware) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultBufferSize(int bufferSize) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultConcurrencyLimit(int concurrencyLimit) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultMultiplexerCapacity(int multiplexerCapacity) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultPrefetch(int prefetch) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveBufferReadTimeout(System.TimeSpan receiveBufferReadTimeout) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder.WithDefaultReceiveMessagesWaitTime(System.TimeSpan waitTime) -> JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsBuilder -JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation -JustSaying.Messaging.IMessagePublisher -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.IMessagePublisher.PublishAsync(JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Interrogation.IInterrogable -JustSaying.Messaging.Interrogation.IInterrogable.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult -JustSaying.Messaging.Interrogation.InterrogationResult.Data.get -> object -JustSaying.Messaging.Interrogation.InterrogationResult.InterrogationResult(object data) -> void -JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageAttributeValue.BinaryValue.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.Messaging.MessageAttributeValue.BinaryValue.set -> void -JustSaying.Messaging.MessageAttributeValue.DataType.get -> string -JustSaying.Messaging.MessageAttributeValue.DataType.set -> void -JustSaying.Messaging.MessageAttributeValue.MessageAttributeValue() -> void -JustSaying.Messaging.MessageAttributeValue.StringValue.get -> string -JustSaying.Messaging.MessageAttributeValue.StringValue.set -> void -JustSaying.Messaging.MessageHandling.IHandlerAsync -JustSaying.Messaging.MessageHandling.IHandlerAsync.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageContextAccessor -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.IMessageContextReader -JustSaying.Messaging.MessageHandling.IMessageContextReader.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.IMessageLockAsync -JustSaying.Messaging.MessageHandling.IMessageLockAsync.ReleaseLockAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockAsync(string key, System.TimeSpan howLong) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.IMessageLockAsync.TryAcquireLockPermanentlyAsync(string key) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler -JustSaying.Messaging.MessageHandling.ListHandler.Handle(T message) -> System.Threading.Tasks.Task -JustSaying.Messaging.MessageHandling.ListHandler.ListHandler(System.Collections.Generic.IEnumerable> handlers) -> void -JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageAttributes.Get(string value) -> JustSaying.Messaging.MessageAttributeValue -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes() -> void -JustSaying.Messaging.MessageHandling.MessageAttributes.MessageAttributes(System.Collections.Generic.Dictionary attributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContext.Message.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.MessageHandling.MessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageHandling.MessageContext.MessageContext(Amazon.SQS.Model.Message message, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageHandling.MessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.MessageHandling.MessageContextAccessor -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.get -> JustSaying.Messaging.MessageHandling.MessageContext -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContext.set -> void -JustSaying.Messaging.MessageHandling.MessageContextAccessor.MessageContextAccessor() -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.DoIHaveExclusiveLock.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.get -> System.DateTimeOffset -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAt.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.get -> long -JustSaying.Messaging.MessageHandling.MessageLockResponse.ExpiryAtTicks.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.get -> bool -JustSaying.Messaging.MessageHandling.MessageLockResponse.IsMessagePermanentlyLocked.set -> void -JustSaying.Messaging.MessageHandling.MessageLockResponse.MessageLockResponse() -> void -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy -JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy.GetBackoffDuration(JustSaying.Models.Message message, int approximateReceiveCount, System.Exception lastException = null) -> System.TimeSpan -JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults -JustSaying.Messaging.MessagePublisherExtensions -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.GenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory -JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.IMessageSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.IMessageSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException() -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(string message, System.Exception innerException) -> void -JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.AddSerializer() -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.DeserializeMessage(string body) -> JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.MessageSerializationRegister(JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider messageSubjectProvider, JustSaying.Messaging.MessageSerialization.IMessageSerializationFactory serializationFactory) -> void -JustSaying.Messaging.MessageSerialization.MessageSerializationRegister.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing) -> string -JustSaying.Messaging.MessageSerialization.MessageWithAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.MessageWithAttributes.MessageWithAttributes(JustSaying.Models.Message message, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializationFactory.NewtonsoftSerializationFactory(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer() -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.NewtonsoftSerializer(Newtonsoft.Json.JsonSerializerSettings settings) -> void -JustSaying.Messaging.MessageSerialization.NewtonsoftSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.GetSubjectForType(System.Type messageType) -> string -JustSaying.Messaging.MessageSerialization.NonGenericMessageSubjectProvider.NonGenericMessageSubjectProvider() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.GetSerializer() -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializationFactory.SystemTextJsonSerializationFactory(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Deserialize(string message, System.Type type) -> JustSaying.Models.Message -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageAttributes(string message) -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.GetMessageSubject(string sqsMessage) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.Serialize(JustSaying.Models.Message message, bool serializeForSnsPublishing, string subject) -> string -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer() -> void -JustSaying.Messaging.MessageSerialization.SystemTextJsonSerializer.SystemTextJsonSerializer(System.Text.Json.JsonSerializerOptions options) -> void -JustSaying.Messaging.MessageSerialization.TypeSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Serializer.get -> JustSaying.Messaging.MessageSerialization.IMessageSerializer -JustSaying.Messaging.MessageSerialization.TypeSerializer.Type.get -> System.Type -JustSaying.Messaging.MessageSerialization.TypeSerializer.TypeSerializer(System.Type type, JustSaying.Messaging.MessageSerialization.IMessageSerializer serializer) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware -JustSaying.Messaging.Middleware.Backoff.BackoffMiddleware.BackoffMiddleware(JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddleware.ErrorHandlerMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor) -> void -JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware -JustSaying.Messaging.Middleware.ExactlyOnceMiddleware.ExactlyOnceMiddleware(JustSaying.Messaging.MessageHandling.IMessageLockAsync messageLock, System.TimeSpan timeout, string handlerName, Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.HandleMessageContext -JustSaying.Messaging.Middleware.HandleMessageContext.HandledException.get -> System.Exception -JustSaying.Messaging.Middleware.HandleMessageContext.HandleMessageContext(string queueName, Amazon.SQS.Model.Message rawMessage, JustSaying.Models.Message message, System.Type messageType, JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater visibilityUpdater, JustSaying.Messaging.Channels.Context.IMessageDeleter messageDeleter, System.Uri queueUri, JustSaying.Messaging.MessageHandling.MessageAttributes messageAttributes) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.Message.get -> JustSaying.Models.Message -JustSaying.Messaging.Middleware.HandleMessageContext.MessageAttributes.get -> JustSaying.Messaging.MessageHandling.MessageAttributes -JustSaying.Messaging.Middleware.HandleMessageContext.MessageDeleter.get -> JustSaying.Messaging.Channels.Context.IMessageDeleter -JustSaying.Messaging.Middleware.HandleMessageContext.MessageType.get -> System.Type -JustSaying.Messaging.Middleware.HandleMessageContext.QueueName.get -> string -JustSaying.Messaging.Middleware.HandleMessageContext.QueueUri.get -> System.Uri -JustSaying.Messaging.Middleware.HandleMessageContext.RawMessage.get -> Amazon.SQS.Model.Message -JustSaying.Messaging.Middleware.HandleMessageContext.SetException(System.Exception e) -> void -JustSaying.Messaging.Middleware.HandleMessageContext.VisibilityUpdater.get -> JustSaying.Messaging.Channels.Context.IMessageVisibilityUpdater -JustSaying.Messaging.Middleware.HandleMessageContextExtensions -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware -JustSaying.Messaging.Middleware.HandlerInvocationMiddleware.HandlerInvocationMiddleware(System.Func> handlerResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Build() -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Configure(System.Action configure) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.HandlerMiddlewareBuilder(JustSaying.IHandlerResolver handlerResolver, JustSaying.Fluent.IServiceResolver serviceResolver) -> void -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(JustSaying.Messaging.Middleware.MiddlewareBase middleware) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use(System.Func> middlewareFactory) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.Use() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder.UseHandler() -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware -JustSaying.Messaging.Middleware.Logging.LoggingMiddleware.LoggingMiddleware(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware -JustSaying.Messaging.Middleware.MessageContext.MessageContextAccessorMiddleware.MessageContextAccessorMiddleware(JustSaying.Messaging.MessageHandling.IMessageContextAccessor messageContextAccessor) -> void -JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions -JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBase.MiddlewareBase() -> void -JustSaying.Messaging.Middleware.MiddlewareBase.RunAsync(TContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -JustSaying.Messaging.Middleware.MiddlewareBase.WithNext(JustSaying.Messaging.Middleware.MiddlewareBase next) -> JustSaying.Messaging.Middleware.MiddlewareBase -JustSaying.Messaging.Middleware.MiddlewareBuilder -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware -JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.SqsPostProcessorMiddleware() -> void -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware -JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.DefaultReceiveMessagesMiddleware(Microsoft.Extensions.Logging.ILogger logger) -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.get -> int -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.Count.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.QueueName.set -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.ReceiveMessagesContext() -> void -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.get -> string -JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext.RegionName.set -> void -JustSaying.Messaging.Middleware.StopwatchMiddleware -JustSaying.Messaging.Middleware.StopwatchMiddleware.StopwatchMiddleware(JustSaying.Messaging.Monitoring.IMessageMonitor monitor, System.Type handlerType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor -JustSaying.Messaging.Monitoring.IMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.IMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.Handled(JustSaying.Models.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleError(System.Exception ex, Amazon.SQS.Model.Message message) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleException(System.Type messageType) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandlerExecutionTime(System.Type handlerType, System.Type messageType, System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleThrottlingTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.HandleTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IncrementThrottlingStatistic() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.IssuePublishingMessage() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.NullOpMessageMonitor() -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.PublishMessageTime(System.TimeSpan duration) -> void -JustSaying.Messaging.Monitoring.NullOpMessageMonitor.ReceiveMessageTime(System.TimeSpan duration, string queueName, string region) -> void -JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, double value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, JustSaying.Messaging.MessageAttributeValue value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, string value) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.AddMessageAttribute(string key, System.Collections.Generic.IReadOnlyCollection data) -> JustSaying.Messaging.PublishMetadata -JustSaying.Messaging.PublishMetadata.Delay.get -> System.TimeSpan? -JustSaying.Messaging.PublishMetadata.Delay.set -> void -JustSaying.Messaging.PublishMetadata.MessageAttributes.get -> System.Collections.Generic.IDictionary -JustSaying.Messaging.PublishMetadata.PublishMetadata() -> void -JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.BuildClientFactory() -> JustSaying.AwsTools.IAwsClientFactory -JustSaying.MessagingBusBuilder.BuildPublisher() -> JustSaying.Messaging.IMessagePublisher -JustSaying.MessagingBusBuilder.BuildSubscribers() -> JustSaying.IMessagingBus -JustSaying.MessagingBusBuilder.Client(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Messaging(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.MessagingBusBuilder() -> void -JustSaying.MessagingBusBuilder.Publications(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Services(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.Subscriptions(System.Action configure) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingBusBuilder.WithServiceResolver(JustSaying.Fluent.IServiceResolver serviceResolver) -> JustSaying.MessagingBusBuilder -JustSaying.MessagingConfig -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.MessagingConfig.AdditionalSubscriberAccounts.set -> void -JustSaying.MessagingConfig.MessageResponseLogger.get -> System.Action -JustSaying.MessagingConfig.MessageResponseLogger.set -> void -JustSaying.MessagingConfig.MessageSubjectProvider.get -> JustSaying.Messaging.MessageSerialization.IMessageSubjectProvider -JustSaying.MessagingConfig.MessageSubjectProvider.set -> void -JustSaying.MessagingConfig.MessagingConfig() -> void -JustSaying.MessagingConfig.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.MessagingConfig.PublishFailureBackoff.set -> void -JustSaying.MessagingConfig.PublishFailureReAttempts.get -> int -JustSaying.MessagingConfig.PublishFailureReAttempts.set -> void -JustSaying.MessagingConfig.QueueNamingConvention.get -> JustSaying.Naming.IQueueNamingConvention -JustSaying.MessagingConfig.QueueNamingConvention.set -> void -JustSaying.MessagingConfig.Region.get -> string -JustSaying.MessagingConfig.Region.set -> void -JustSaying.MessagingConfig.TopicNamingConvention.get -> JustSaying.Naming.ITopicNamingConvention -JustSaying.MessagingConfig.TopicNamingConvention.set -> void -JustSaying.Naming.DefaultNamingConventions -JustSaying.Naming.DefaultNamingConventions.DefaultNamingConventions() -> void -JustSaying.Naming.IQueueNamingConvention -JustSaying.Naming.IQueueNamingConvention.QueueName() -> string -JustSaying.Naming.ITopicNamingConvention -JustSaying.Naming.ITopicNamingConvention.TopicName() -> string -JustSaying.Naming.NamingConventionExtensions -override JustSaying.AwsTools.ErrorQueue.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.ErrorQueue.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -override JustSaying.AwsTools.ErrorQueue.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -override JustSaying.AwsTools.MessageHandling.SqsQueueByName.GetCreateQueueAttributes(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> System.Collections.Generic.Dictionary -override JustSaying.AwsTools.QueueCreation.RedrivePolicy.ToString() -> string -override JustSaying.AwsTools.QueueCreation.SqsReadConfiguration.OnValidating() -> void -override JustSaying.Messaging.MessageHandling.MessageLockResponse.ToString() -> string -override JustSaying.Messaging.Middleware.PostProcessing.SqsPostProcessorMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.HandleMessageContext context, System.Func> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -override JustSaying.Messaging.Middleware.Receive.DefaultReceiveMessagesMiddleware.RunInnerAsync(JustSaying.Messaging.Middleware.Receive.ReceiveMessagesContext context, System.Func>> func, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task> -static JustSaying.AwsTools.JustSayingConstants.DefaultAttributeEncryptionKeyReusePeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultHandlerRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryCount.get -> int -static JustSaying.AwsTools.JustSayingConstants.DefaultPublisherRetryInterval.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.DefaultSnsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultSqsAttributeEncryptionKeyId.get -> string -static JustSaying.AwsTools.JustSayingConstants.DefaultVisibilityTimeout.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MaximumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumDeliveryDelay.get -> System.TimeSpan -static JustSaying.AwsTools.JustSayingConstants.MinimumRetentionPeriod.get -> System.TimeSpan -static JustSaying.AwsTools.QueueCreation.RedrivePolicy.ConvertFromString(string policy) -> JustSaying.AwsTools.QueueCreation.RedrivePolicy -static JustSaying.Extensions.ChannelExtensions.MergeAsync(System.Collections.Generic.IEnumerable> inputs, System.Threading.Channels.ChannelWriter output, System.Threading.CancellationToken stoppingToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Channels.SubscriptionGroups.SubscriptionGroupSettingsValidation.Validate(this JustSaying.Messaging.Channels.SubscriptionGroups.ISubscriptionGroupSettings settings) -> void -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.MaxAmazonMessageCap.get -> int -static JustSaying.Messaging.MessageProcessingStrategies.MessageDefaults.ParallelHandlerExecutionPerCore.get -> int -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, JustSaying.Messaging.PublishMetadata metadata) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, JustSaying.Models.Message message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.Middleware.Backoff.BackoffMiddlewareBuilderExtensions.UseBackoff(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, JustSaying.Messaging.MessageProcessingStrategies.IMessageBackoffStrategy backoffStrategy) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ErrorHandling.ErrorHandlerMiddlewareBuilderExtensions.UseErrorHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.ExactlyOnceHandlerMiddlewareBuilderExtensions.UseExactlyOnce(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, string lockKey, System.TimeSpan? lockDuration = null) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandleMessageContextExtensions.MessageAs(this JustSaying.Messaging.Middleware.HandleMessageContext context) -> TMessage -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseDefaults(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.HandlerMiddlewareBuilderExtensions.UseHandler(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Func> handler) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MessageContext.MessageContextMiddlewareBuilderExtensions.UseMessageContextAccessor(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MetricsMiddlewareBuilderExtensions.UseStopwatch(this JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder builder, System.Type handlerType) -> JustSaying.Messaging.Middleware.HandlerMiddlewareBuilder -static JustSaying.Messaging.Middleware.MiddlewareBuilder.BuildAsync(params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Messaging.Middleware.MiddlewareBuilder.WithAsync(this JustSaying.Messaging.Middleware.MiddlewareBase inner, params JustSaying.Messaging.Middleware.MiddlewareBase[] middleware) -> JustSaying.Messaging.Middleware.MiddlewareBase -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.IQueueNamingConvention namingConvention, string overrideQueueName) -> string -static JustSaying.Naming.NamingConventionExtensions.Apply(this JustSaying.Naming.ITopicNamingConvention namingConvention, string overrideTopicName) -> string -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceConfig config) -> void -virtual JustSaying.AwsTools.DefaultAwsClientFactory.Configure(Amazon.SQS.AmazonSQSConfig config) -> void -virtual JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.CreateAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, int attempt = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.DeleteAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.ExistsAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.Interrogate() -> JustSaying.Messaging.Interrogation.InterrogationResult -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.QueueNeedsUpdating(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig) -> bool -virtual JustSaying.AwsTools.MessageHandling.SqsQueueByNameBase.UpdateQueueAttributeAsync(JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration queueConfig, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -virtual JustSaying.AwsTools.QueueCreation.SqsBasicConfiguration.OnValidating() -> void -virtual JustSaying.MessagingConfig.Validate() -> void -virtual JustSaying.Naming.DefaultNamingConventions.QueueName() -> string -virtual JustSaying.Naming.DefaultNamingConventions.TopicName() -> string diff --git a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index 000ed64b8..ec6ede7fa 100644 --- a/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/JustSaying/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,53 +1,4 @@ -JustSaying.AwsTools.MessageHandling.MessageBatchResponse -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.FailedMessageIds.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.FailedMessageIds.set -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.HttpStatusCode.get -> System.Net.HttpStatusCode? -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.HttpStatusCode.set -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.MessageBatchResponse() -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.ResponseMetadata.get -> Amazon.Runtime.ResponseMetadata -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.ResponseMetadata.set -> void -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.SuccessfulMessageIds.get -> System.Collections.Generic.IReadOnlyCollection -JustSaying.AwsTools.MessageHandling.MessageBatchResponse.SuccessfulMessageIds.set -> void -JustSaying.AwsTools.MessageHandling.PublishBatchException -JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException() -> void -JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException(string message) -> void -JustSaying.AwsTools.MessageHandling.PublishBatchException.PublishBatchException(string message, System.Exception inner) -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.HandleBatchException.get -> System.Func, bool> -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.HandleBatchException.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageBatchResponseLogger.get -> System.Action> -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.MessageBatchResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SnsMessagePublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageBatchResponseLogger.get -> System.Action> -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.MessageBatchResponseLogger.set -> void -JustSaying.AwsTools.MessageHandling.SqsMessagePublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.Fluent.MessagingConfigurationBuilder.BuildPublishBatchConfiguration() -> JustSaying.IPublishBatchConfiguration -JustSaying.Fluent.MessagingConfigurationBuilder.WithMessageResponseLogger(System.Action> logger) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureBackoffForBatch(System.TimeSpan value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.MessagingConfigurationBuilder.WithPublishFailureReattemptsForBatch(int value) -> JustSaying.Fluent.MessagingConfigurationBuilder -JustSaying.Fluent.TopicAddressPublicationBuilder.WithExceptionHandler(System.Func, bool> exceptionBatchHandler) -> JustSaying.Fluent.TopicAddressPublicationBuilder -JustSaying.IPublishBatchConfiguration -JustSaying.IPublishBatchConfiguration.MessageBatchResponseLogger.get -> System.Action> -JustSaying.IPublishBatchConfiguration.MessageBatchResponseLogger.set -> void -JustSaying.IPublishBatchConfiguration.PublishFailureBackoff.get -> System.TimeSpan -JustSaying.IPublishBatchConfiguration.PublishFailureBackoff.set -> void -JustSaying.IPublishBatchConfiguration.PublishFailureReAttempts.get -> int -JustSaying.IPublishBatchConfiguration.PublishFailureReAttempts.set -> void -JustSaying.JustSayingBus.AddMessageBatchPublisher(JustSaying.Messaging.IMessageBatchPublisher messageBatchPublisher) -> void -JustSaying.JustSayingBus.JustSayingBus(JustSaying.IMessagingConfig config, JustSaying.Messaging.MessageSerialization.IMessageSerializationRegister serializationRegister, JustSaying.Messaging.Channels.Receive.IMessageReceivePauseSignal messageReceivePauseSignal, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, JustSaying.Messaging.Monitoring.IMessageMonitor monitor, JustSaying.IPublishBatchConfiguration publishBatchConfiguration) -> void -JustSaying.JustSayingBus.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -JustSaying.JustSayingBus.PublishBatchConfiguration.get -> JustSaying.IPublishBatchConfiguration -JustSaying.Messaging.IMessageBatchPublisher -JustSaying.Messaging.IMessageBatchPublisher.PublishAsync(System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -JustSaying.Messaging.PublishBatchMetadata -JustSaying.Messaging.PublishBatchMetadata.BatchSize.get -> int -JustSaying.Messaging.PublishBatchMetadata.BatchSize.set -> void -JustSaying.Messaging.PublishBatchMetadata.PublishBatchMetadata() -> void -JustSaying.MessagingBusBuilder.BuildBatchPublisher() -> JustSaying.Messaging.IMessageBatchPublisher -JustSaying.MessagingConfig.MessageBatchResponseLogger.get -> System.Action> -JustSaying.MessagingConfig.MessageBatchResponseLogger.set -> void -static JustSaying.AwsTools.JustSayingConstants.MaximumSnsBatchSize.get -> int -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessageBatchPublisher publisher, System.Collections.Generic.IEnumerable messages, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, JustSaying.Messaging.PublishBatchMetadata metadata, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -static JustSaying.Messaging.MessagePublisherExtensions.PublishAsync(this JustSaying.Messaging.IMessagePublisher publisher, System.Collections.Generic.IEnumerable messages, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task \ No newline at end of file +JustSaying.AwsTools.MessageHandling.PublishException.PublishException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.AwsTools.QueueCreation.ConfigurationErrorsException.ConfigurationErrorsException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.HandlerNotRegisteredWithContainerException.HandlerNotRegisteredWithContainerException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +JustSaying.Messaging.MessageSerialization.MessageFormatNotSupportedException.MessageFormatNotSupportedException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void diff --git a/tests/JustSaying.Extensions.DependencyInjection.StructureMap.Tests/StructureMapTests.cs b/tests/JustSaying.Extensions.DependencyInjection.StructureMap.Tests/StructureMapTests.cs index 4fc4130d8..83cabb5fd 100644 --- a/tests/JustSaying.Extensions.DependencyInjection.StructureMap.Tests/StructureMapTests.cs +++ b/tests/JustSaying.Extensions.DependencyInjection.StructureMap.Tests/StructureMapTests.cs @@ -1,6 +1,7 @@ using JustSaying.Messaging; using JustSaying.Messaging.MessageHandling; using JustSaying.TestingFramework; +using LocalSqsSnsMessaging; using Microsoft.Extensions.Logging; using Shouldly; using StructureMap; @@ -11,6 +12,7 @@ namespace JustSaying; public class WhenUsingStructureMap(ITestOutputHelper outputHelper) { private ITestOutputHelper OutputHelper { get; } = outputHelper; + private InMemoryAwsBus InMemoryAwsBus { get; } = new(); [AwsFact] public async Task Can_Create_Messaging_Bus_Fluently_For_A_Queue() @@ -32,8 +34,11 @@ public async Task Can_Create_Messaging_Bus_Fluently_For_A_Queue() (builder) => { builder.Client((options) => - options.WithBasicCredentials("accessKey", "secretKey") - .WithServiceUri(TestEnvironment.SimulatorUrl)) + options.WithClientFactory(() => new LocalAwsClientFactory(InMemoryAwsBus)) + // TODO Add back LocalStack config for running in CI + // options.WithBasicCredentials("accessKey", "secretKey") + // .WithServiceUri(TestEnvironment.SimulatorUrl) + ) .Messaging((options) => options.WithRegion("eu-west-1")) .Publications((options) => options.WithQueue()) .Subscriptions((options) => options.ForQueue()); diff --git a/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs b/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs deleted file mode 100644 index 71456f9e1..000000000 --- a/tests/JustSaying.IntegrationTests/Fluent/ActionRunnerTest.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace JustSaying.IntegrationTests.Fluent; - -public class ActionRunnerTest(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) -{ - protected override TimeSpan Timeout => TimeSpan.FromSeconds(2); - - [Fact] - public async Task TestRunnerWillSucceedOnSuccessfulTask() - { - static async Task SuccessTask(CancellationToken ctx) => - await Task.Delay(100, ctx); - - await RunActionWithTimeout(SuccessTask); - } - - [Fact] - public async Task TestRunnerWillThrowOnTimeout() - { - async Task TimeoutTask(CancellationToken ctx) => - await Task.Delay(Timeout.Add(Timeout), ctx); - - await Assert.ThrowsAsync( - () => RunActionWithTimeout(TimeoutTask)); - } - - [Fact] - public async Task TestRunnerWillThrowOnFailure() - { - static async Task ThrowingTask(CancellationToken ctx) - { - await Task.Delay(100, ctx); - throw new InvalidOperationException(); - } - - await Assert.ThrowsAsync( - () => RunActionWithTimeout(ThrowingTask)); - } -} diff --git a/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs b/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs index bec28a9b3..ce951afb0 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/AwsTools/WhenUsingABasicThrottle.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Text.Json; using Amazon.SQS.Model; using JustSaying.AwsTools; using JustSaying.AwsTools.MessageHandling; @@ -40,7 +41,7 @@ public async Task Messages_Are_Throttled_But_Still_Delivered(int throttleMessage { await queue.CreateAsync(new SqsBasicConfiguration()); - if (!IsSimulator) + if (ServiceUri is not null) { // Wait for up to 60 secs for queue creation to be guaranteed completed by AWS using var cts = new CancellationTokenSource(TimeSpan.FromMinutes(1)); @@ -72,7 +73,7 @@ public async Task Messages_Are_Throttled_But_Still_Delivered(int throttleMessage { var batchEntry = new SendMessageBatchRequestEntry { - MessageBody = $$"""{"Subject":"SimpleMessage", "Message": { "Content": "{{entriesAdded}}"} }""", + MessageBody = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode($$"""{ "Content": "{{entriesAdded}}" }""")}}" }""", Id = Guid.NewGuid().ToString() }; @@ -105,7 +106,7 @@ await WhenAsync( async (publisher, listener, cancellationToken) => { var stopwatch = Stopwatch.StartNew(); - var delay = IsSimulator ? TimeSpan.FromMilliseconds(100) : TimeSpan.FromSeconds(5); + var delay = (ServiceUri is null) ? TimeSpan.FromMilliseconds(100) : TimeSpan.FromSeconds(5); await listener.StartAsync(cancellationToken); diff --git a/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs b/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs index f6170ee57..a3605ff89 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/IntegrationTestBase.cs @@ -5,6 +5,7 @@ using JustSaying.Messaging.MessageHandling; using JustSaying.Models; using JustSaying.TestingFramework; +using LocalSqsSnsMessaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NSubstitute; @@ -31,7 +32,9 @@ public abstract class IntegrationTestBase(ITestOutputHelper outputHelper) protected virtual bool IsSimulator => TestEnvironment.IsSimulatorConfigured; - protected virtual TimeSpan Timeout => TimeSpan.FromSeconds(Debugger.IsAttached ? 60 : 20); + protected virtual InMemoryAwsBus Bus { get; } = new InMemoryAwsBus(); + + protected virtual TimeSpan Timeout => TimeSpan.FromSeconds(Debugger.IsAttached ? 300 : 10); protected virtual string UniqueName { get; } = $"{Guid.NewGuid():N}-integration-tests"; @@ -50,7 +53,7 @@ protected IServiceCollection Given( LogLevel logLevel = levelOverride ?? LogLevel.Debug; return new ServiceCollection() .AddLogging((p) => p - .AddTest() + .AddFakeLogging() .AddXUnit(OutputHelper, o => { o.IncludeScopes = true; @@ -62,8 +65,9 @@ protected IServiceCollection Given( builder.Messaging((options) => options.WithRegion(RegionName)) .Client((options) => { - options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) - .WithServiceUri(ServiceUri); + options.WithClientFactory(() => new LocalAwsClientFactory(Bus)); + // options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) + // .WithServiceUri(ServiceUri); }); builder.Subscriptions(sub => sub.WithDefaults(x => x.WithDefaultConcurrencyLimit(10))); @@ -73,8 +77,9 @@ protected IServiceCollection Given( protected virtual IAwsClientFactory CreateClientFactory() { - var credentials = new SessionAWSCredentials(AccessKeyId, SecretAccessKey, SessionToken); - return new DefaultAwsClientFactory(credentials) { ServiceUri = ServiceUri }; + return new LocalAwsClientFactory(Bus); + // var credentials = new SessionAWSCredentials(AccessKeyId, SecretAccessKey, SessionToken); + // return new DefaultAwsClientFactory(credentials) { ServiceUri = ServiceUri }; } protected IHandlerAsync CreateHandler(TaskCompletionSource completionSource, int expectedMessageCount = 1) diff --git a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs index 9363a4b85..3ead6ed76 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTestExtensions.cs @@ -10,7 +10,7 @@ public static MessagingBusBuilder WithLoopbackQueue(this MessagingBusBuilder where T : Message { return builder - .Publications((options) => options.WithQueue(o => o.WithName(name))) + .Publications((options) => options.WithQueue(o => o.WithQueueName(name))) .Subscriptions((options) => options.ForQueue(subscriptionBuilder => { subscriptionBuilder.WithQueueName(name); @@ -30,4 +30,33 @@ public static MessagingBusBuilder WithLoopbackTopic(this MessagingBusBuilder configure?.Invoke(subscriptionBuilder); })); } -} \ No newline at end of file + + public static MessagingBusBuilder WithLoopbackQueueAndPublicationOptions(this MessagingBusBuilder builder, string name, + Action> configurePublisher = null, Action> configureSubscriber = null) + where T : Message + { + return builder + .Publications((options) => options.WithQueue(publicationBuilder => + { + publicationBuilder.WithQueueName(name); + configurePublisher?.Invoke(publicationBuilder); + })) + .Subscriptions((options) => options.ForQueue(subscriptionBuilder => + { + subscriptionBuilder.WithQueueName(name); + configureSubscriber?.Invoke(subscriptionBuilder); + })); + } + + public static MessagingBusBuilder WithLoopbackTopicAndPublicationOptions(this MessagingBusBuilder builder, string name, + Action> configure) + where T : Message + { + return builder + .Publications((options) => options.WithTopic(configure)) + .Subscriptions((options) => options.ForTopic(subscriptionBuilder => + { + subscriptionBuilder.WithQueueName(name); + })); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs index f75649baa..c1f17f9a4 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/MessagingBusBuilderTests.cs @@ -1,8 +1,10 @@ using JustSaying.Fluent; +using JustSaying.IntegrationTests.Fluent; using JustSaying.Messaging; using JustSaying.Messaging.Monitoring; using JustSaying.Models; using JustSaying.TestingFramework; +using LocalSqsSnsMessaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -22,16 +24,20 @@ public async Task Can_Create_Messaging_Bus_Fluently_For_A_Queue() var queueName = Guid.NewGuid().ToString(); // Arrange + var bus = new InMemoryAwsBus(); var services = new ServiceCollection() .AddLogging((p) => p.AddXUnit(OutputHelper)) .AddJustSaying( (builder) => { builder.Client((options) => - options.WithBasicCredentials("accessKey", "secretKey") - .WithServiceUri(TestEnvironment.SimulatorUrl)) + options.WithClientFactory(() => new LocalAwsClientFactory(bus)) + // TODO Add back LocalStack config for running in CI + // options.WithBasicCredentials("accessKey", "secretKey") + // .WithServiceUri(TestEnvironment.SimulatorUrl) + ) .Messaging((options) => options.WithRegion("eu-west-1")) - .Publications((options) => options.WithQueue(o => o.WithName(queueName))) + .Publications((options) => options.WithQueue(o => o.WithQueueName(queueName))) .Subscriptions((options) => options.ForQueue(o => o.WithQueueName(queueName))) .Services((options) => options.WithMessageMonitoring(() => new MyMonitor())); }) @@ -66,6 +72,7 @@ public async Task Can_Create_Messaging_Bus_Fluently_For_A_Topic() var topicName = Guid.NewGuid().ToString(); // Arrange + var bus = new InMemoryAwsBus(); var services = new ServiceCollection() .AddLogging((p) => p.AddXUnit(OutputHelper)) .AddJustSaying( @@ -73,8 +80,11 @@ public async Task Can_Create_Messaging_Bus_Fluently_For_A_Topic() { builder .Client((options) => - options.WithBasicCredentials("accessKey", "secretKey") - .WithServiceUri(TestEnvironment.SimulatorUrl)) + options.WithClientFactory(() => new LocalAwsClientFactory(bus)) + // TODO Add back LocalStack config for running in CI + // options.WithBasicCredentials("accessKey", "secretKey") + // .WithServiceUri(TestEnvironment.SimulatorUrl) + ) .Messaging((options) => options.WithRegion("eu-west-1")) .Publications((options) => options.WithTopic()) .Subscriptions((options) => options.ForTopic(cfg => cfg.WithQueueName(topicName))); @@ -169,9 +179,14 @@ private sealed class AwsContributor : IMessageBusConfigurationContributor { public void Configure(MessagingBusBuilder builder) { + var bus = new InMemoryAwsBus(); builder.Client( - (options) => options.WithSessionCredentials("accessKeyId", "secretKeyId", "token") - .WithServiceUri(TestEnvironment.SimulatorUrl)); + (options) => + options.WithClientFactory(() => new LocalAwsClientFactory(bus)) + // TODO Add back LocalStack config for running in CI + // options.WithSessionCredentials("accessKeyId", "secretKeyId", "token") + // .WithServiceUri(TestEnvironment.SimulatorUrl) + ); } } @@ -192,7 +207,7 @@ private sealed class QueueContributor : IMessageBusConfigurationContributor public void Configure(MessagingBusBuilder builder) { - builder.Publications((p) => p.WithQueue(options => options.WithName(QueueName))) + builder.Publications((p) => p.WithQueue(options => options.WithQueueName(QueueName))) .Subscriptions((p) => p.ForQueue(cfg => cfg.WithQueueName(QueueName))); } } diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs new file mode 100644 index 000000000..df3e28e67 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithAttributes.cs @@ -0,0 +1,65 @@ +using JustSaying.AwsTools.QueueCreation; +using JustSaying.Fluent.Subscribing.Newtonsoft; +using JustSaying.Messaging; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedToAQueueWithAttribute(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + public class SimpleMessageWithStringAttributesHandler(IMessageContextAccessor contextAccessor) : IHandlerAsync + { + private readonly IMessageContextAccessor _contextAccessor = contextAccessor; + + public Task Handle(SimpleMessage message) + { + HandledMessages.Add((_contextAccessor.MessageContext, message)); + return Task.FromResult(true); + } + + public List<(MessageContext context, SimpleMessage message)> HandledMessages { get; } = new List<(MessageContext, SimpleMessage)>(); + } + + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new SimpleMessageWithStringAttributesHandler(new MessageContextAccessor()); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => builder.WithLoopbackQueueAndPublicationOptions(UniqueName)) + .AddSingleton>(handler); + + var message = new SimpleMessage + { + // Content longer than 100 bytes + Content = Guid.NewGuid().ToString() + }; + var publishMetadata = new PublishMetadata(); + publishMetadata.AddMessageAttribute("Hello", "World"); + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, publishMetadata, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + var (actualMessageContext, actualMessage) = handler.HandledMessages.ShouldHaveSingleItem(); + actualMessage.Content.ShouldBe(message.Content); + actualMessageContext.MessageAttributes.GetKeys().ShouldContain("Hello"); + }); + }); + } + +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs new file mode 100644 index 000000000..09cae0554 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithCompression.cs @@ -0,0 +1,59 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageHandling; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedToAQueueWithCompression(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new InspectableHandler(); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => builder.WithLoopbackQueueAndPublicationOptions(UniqueName, + c => + { + c.WithWriteConfiguration(writeConfiguration => + { + writeConfiguration.CompressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 100 + }; + }); + })) + .AddSingleton>(handler); + + var message = new SimpleMessage + { + // Content longer than 100 bytes + Content = new string('a', 500) + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + var publishMetadata = new PublishMetadata(); + publishMetadata.AddMessageAttribute("Hello", "World"); + + // Act + await publisher.PublishAsync(message, publishMetadata, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(message.Content); + }); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs index 8c00e3d34..66fe06bad 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToAQueueWithSystemTextJson.cs @@ -17,7 +17,6 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying( (builder) => builder.WithLoopbackQueue(UniqueName)) - .AddSingleton() .AddSingleton(handler); string content = Guid.NewGuid().ToString(); @@ -43,4 +42,4 @@ await WhenAsync( await handler.Received().Handle(Arg.Is((m) => m.Content == content)); }); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATenantedTopic.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATenantedTopic.cs index 8122e998b..b38c4d11e 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATenantedTopic.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATenantedTopic.cs @@ -43,6 +43,8 @@ await WhenAsync( services, async (publisher, listener, cancellationToken) => { + var waitForSixMessages = handler.WaitForMessageCountAsync(6, cancellationToken); + await listener.StartAsync(cancellationToken); await publisher.StartAsync(cancellationToken); @@ -58,11 +60,14 @@ await WhenAsync( json = publisherJson.Replace(UniqueName, "integrationTestQueueName", StringComparison.Ordinal); + await waitForSixMessages; + // Assert await Patiently.AssertThatAsync(OutputHelper, () => { var received = handler.ReceivedMessages; + received.Count.ShouldBe(6); received.ShouldContain(x => x.Content == testId && x.Tenant == "uk", 2); received.ShouldContain(x => x.Content == testId && x.Tenant == "it", 2); received.ShouldContain(x => x.Content == testId && x.Tenant == "es", 2); diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs new file mode 100644 index 000000000..bdd64fdd7 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithAttributes.cs @@ -0,0 +1,49 @@ +using JustSaying.Messaging; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedToATopicWithAttributes(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new InspectableHandler(); + + var services = GivenJustSaying() + .ConfigureJustSaying( + (builder) => builder.WithLoopbackTopic(UniqueName)) + .AddSingleton>(handler); + + string content = Guid.NewGuid().ToString(); + + var message = new SimpleMessage() + { + Content = content + }; + var publishMetadata = new PublishMetadata(); + publishMetadata.AddMessageAttribute("Hello", "World"); + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, publishMetadata, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(content); + }); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithCustomSubject.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithCustomSubject.cs new file mode 100644 index 000000000..7c34f9184 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithCustomSubject.cs @@ -0,0 +1,58 @@ +using System.Text.Json.Nodes; +using JustSaying.Messaging.MessageHandling; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedToATopicWithCustomSubject(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new InspectableHandler(); + var awsClientFactory = new InspectableClientFactory(new LocalAwsClientFactory(Bus)); + + var services = GivenJustSaying() + .ConfigureJustSaying( + (builder) => + { + builder.Client((options) => options.WithClientFactory(() => awsClientFactory)); + builder.WithLoopbackTopicAndPublicationOptions(UniqueName, configure => configure.WithWriteConfiguration(wc => wc.Subject = "RandomSubject")); + }) + .AddSingleton>(handler); + + string content = Guid.NewGuid().ToString(); + + var message = new SimpleMessage + { + Content = content + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(content); + }); + + var response = awsClientFactory.InspectableSqsClient.ReceiveMessageResponses.Where(r => r.Messages.Count > 0).ShouldHaveSingleItem(); + var responseMessage = response.Messages.ShouldHaveSingleItem(); + string messageBody = responseMessage.Body; + var bodyJson = JsonNode.Parse(messageBody); + bodyJson.ShouldNotBeNull(); + bodyJson["Subject"].ShouldNotBeNull().GetValue().ShouldBe("RandomSubject"); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithRemovedSubject.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithRemovedSubject.cs new file mode 100644 index 000000000..86a8e46f1 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithRemovedSubject.cs @@ -0,0 +1,58 @@ +using System.Text.Json.Nodes; +using JustSaying.Messaging.MessageHandling; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedToATopicWithRemovedSubject(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new InspectableHandler(); + var awsClientFactory = new InspectableClientFactory(new LocalAwsClientFactory(Bus)); + + var services = GivenJustSaying() + .ConfigureJustSaying( + (builder) => + { + builder.Client((options) => options.WithClientFactory(() => awsClientFactory)); + builder.WithLoopbackTopicAndPublicationOptions(UniqueName, configure => configure.WithWriteConfiguration(wc => wc.Subject = null)); + }) + .AddSingleton>(handler); + + string content = Guid.NewGuid().ToString(); + + var message = new SimpleMessage + { + Content = content + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(content); + }); + + var response = awsClientFactory.InspectableSqsClient.ReceiveMessageResponses.Where(r => r.Messages.Count > 0).ShouldHaveSingleItem(); + var responseMessage = response.Messages.ShouldHaveSingleItem(); + string messageBody = responseMessage.Body; + var bodyJson = JsonNode.Parse(messageBody); + bodyJson.ShouldNotBeNull(); + bodyJson.AsObject().ContainsKey("Subject").ShouldBeFalse(); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs index 6e4e2aeb0..9817fd951 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedToATopicWithSystemTextJson.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; @@ -16,7 +17,7 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying( (builder) => builder.WithLoopbackTopic(UniqueName)) - .AddSingleton() + .AddSingleton(x => new SystemTextJsonSerializationFactory(new JsonSerializerOptions())) .AddSingleton>(handler); string content = Guid.NewGuid().ToString(); @@ -44,4 +45,4 @@ await Patiently.AssertThatAsync(OutputHelper, }); }); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs new file mode 100644 index 000000000..ac1169d8d --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenAMessageIsPublishedWithCompression.cs @@ -0,0 +1,57 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.IntegrationTests.Fluent.Publishing; + +public class WhenAMessageIsPublishedWithCompression(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Handled() + { + // Arrange + var handler = new InspectableHandler(); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => builder.WithLoopbackTopicAndPublicationOptions(UniqueName, + c => + { + c.WithWriteConfiguration(writeConfiguration => + { + writeConfiguration.CompressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 100 + }; + }); + })) + .AddSingleton>(handler); + + var message = new SimpleMessage + { + // Content longer than 100 bytes + Content = new string('a', 500) + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(OutputHelper, + () => + { + handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(message.Content); + }); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenCreatingAMessagePublisher.cs b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenCreatingAMessagePublisher.cs index 9d7151191..f14a5dc70 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenCreatingAMessagePublisher.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Publishing/WhenCreatingAMessagePublisher.cs @@ -12,7 +12,7 @@ public async Task Then_The_Queues_Exist() // Arrange var serviceProvider = GivenJustSaying() .ConfigureJustSaying((builder) => builder.Publications((options) => - options.WithQueue(qo => qo.WithName(UniqueName)))) + options.WithQueue(qo => qo.WithQueueName(UniqueName)))) .BuildServiceProvider(); // Act - Force queue creation @@ -27,4 +27,4 @@ public async Task Then_The_Queues_Exist() queues.QueueUrls.ShouldAllBe((url) => url.Contains(UniqueName, StringComparison.Ordinal), "The queue URL is not for the expected queue."); queues.QueueUrls.Count((url) => url.Contains("_error", StringComparison.Ordinal)).ShouldBe(1, "The error queue was not created."); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenPublishingToAQueueWithRawMessages.cs b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenPublishingToAQueueWithRawMessages.cs new file mode 100644 index 000000000..ea25d813e --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenPublishingToAQueueWithRawMessages.cs @@ -0,0 +1,57 @@ +using JustSaying.IntegrationTests.Fluent; +using JustSaying.Messaging.MessageHandling; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.Fluent.RawDelivery; + +public class WhenPublishingToAQueueWithRawMessages(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Published() + { + // Arrange + var handler = new InspectableHandler(); + var awsClientFactory = new InspectableClientFactory(new LocalAwsClientFactory(Bus)); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => + { + builder.Client((options) => options.WithClientFactory(() => awsClientFactory)); + builder.WithLoopbackQueueAndPublicationOptions(UniqueName, + c => { c.WithWriteConfiguration(rc => rc.IsRawMessage = true); }, + c => { c.WithReadConfiguration(rc => rc.RawMessageDelivery = true); }); + }) + .AddSingleton>(handler); + + string content = Guid.NewGuid().ToString(); + + var message = new SimpleMessage + { + Content = content + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(() => + { + var handledMessage = handler.ReceivedMessages.Where(m => m.Id.ToString() == message.UniqueKey()).ShouldHaveSingleItem(); + handledMessage.Content.ShouldBe(content); + var response = awsClientFactory.InspectableSqsClient.ReceiveMessageResponses.Where(r => r.Messages.Count > 0).ShouldHaveSingleItem(); + var responseMessage = response.Messages.ShouldHaveSingleItem(); + var messageBody = responseMessage.Body; + messageBody.ShouldNotContain("Message"); + messageBody.ShouldNotContain("Subject"); + }); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs new file mode 100644 index 000000000..bcd86f265 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/RawDelivery/WhenUsingRawDelivery.cs @@ -0,0 +1,57 @@ +using JustSaying.IntegrationTests.Fluent; +using JustSaying.Messaging.MessageHandling; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.Fluent.RawDelivery; + +public class WhenUsingRawDelivery(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + [AwsFact] + public async Task Then_The_Message_Is_Published() + { + // Arrange + var handler = new InspectableHandler(); + var awsClientFactory = new InspectableClientFactory(new LocalAwsClientFactory(Bus)); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => + { + builder.Client((options) => options.WithClientFactory(() => awsClientFactory)); + builder.WithLoopbackTopic(UniqueName, + c => { c.WithReadConfiguration(rc => rc.RawMessageDelivery = true); }); + }) + .AddSingleton>(handler); + + string content = Guid.NewGuid().ToString(); + + var message = new SimpleMessage + { + Content = content + }; + + await WhenAsync( + services, + async (publisher, listener, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + await publisher.PublishAsync(message, cancellationToken); + + // Assert + await Patiently.AssertThatAsync(() => + { + var handledMessage = handler.ReceivedMessages.Where(m => m.Id.ToString() == message.UniqueKey()).ShouldHaveSingleItem(); + handledMessage.Content.ShouldBe(content); + }); + + var response = awsClientFactory.InspectableSqsClient.ReceiveMessageResponses.Where(r => r.Messages.Count > 0).ShouldHaveSingleItem(); + var responseMessage = response.Messages.ShouldHaveSingleItem(); + string messageBody = responseMessage.Body; + messageBody.ShouldNotContain("Message"); + messageBody.ShouldNotContain("Subject"); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs deleted file mode 100644 index 79f41b583..000000000 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithBinaryAttributes.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Text; -using JustSaying.IntegrationTests.Fluent; -using JustSaying.Messaging; -using JustSaying.Messaging.MessageHandling; -using JustSaying.Messaging.MessageSerialization; -using JustSaying.TestingFramework; -using Microsoft.Extensions.DependencyInjection; - -namespace JustSaying.Fluent.Subscribing.SystemTextJson; - -public class WhenHandlingAMessageWithBinaryAttributes(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) -{ - public class SimpleMessageWithBinaryAttributesHandler(IMessageContextAccessor contextAccessor) : IHandlerAsync - { - private readonly IMessageContextAccessor _contextAccessor = contextAccessor; - - public Task Handle(SimpleMessage message) - { - HandledMessages.Add((_contextAccessor.MessageContext, message)); - return Task.FromResult(true); - } - - public List<(MessageContext context, SimpleMessage message)> HandledMessages { get; } = new List<(MessageContext, SimpleMessage)>(); - } - - [AwsFact] - public async Task Then_The_Attributes_Are_Returned() - { - OutputHelper.WriteLine($"Running {nameof(Then_The_Attributes_Are_Returned)} test"); - - // Arrange - var handler = new SimpleMessageWithBinaryAttributesHandler(new MessageContextAccessor()); - - var services = GivenJustSaying() - .ConfigureJustSaying((builder) => builder - .WithLoopbackTopic(UniqueName)) - .AddSingleton() - .AddSingleton>(handler); - - await WhenAsync( - services, - async (publisher, listener, serviceProvider, cancellationToken) => - { - await listener.StartAsync(cancellationToken); - await publisher.StartAsync(cancellationToken); - - // Act - var metadata = new PublishMetadata() - .AddMessageAttribute("content", "somecontent") - .AddMessageAttribute("binarycontent", Encoding.UTF8.GetBytes("somebinarydata")); - await publisher.PublishAsync(new SimpleMessage(), metadata, cancellationToken); - - await Patiently.AssertThatAsync(OutputHelper, () => handler.HandledMessages.Count > 0); - - handler.HandledMessages.Count.ShouldBe(1); - handler.HandledMessages[0].context.MessageAttributes.Get("content").StringValue.ShouldBe("somecontent"); - - var binaryData = handler.HandledMessages[0].context.MessageAttributes.Get("binarycontent").ShouldNotBeNull().BinaryValue; - Encoding.UTF8.GetString(binaryData.ToArray()).ShouldBe("somebinarydata"); - }); - } -} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithMixedAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithMixedAttributes.cs new file mode 100644 index 000000000..860f6bfd2 --- /dev/null +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithMixedAttributes.cs @@ -0,0 +1,77 @@ +using JustSaying.IntegrationTests.Fluent; +using JustSaying.Messaging; +using JustSaying.Messaging.MessageHandling; +using JustSaying.TestingFramework; +using Microsoft.Extensions.DependencyInjection; + +namespace JustSaying.Fluent.Subscribing.SystemTextJson; + +public class WhenHandlingAMessageWithMixedAttributes(ITestOutputHelper outputHelper) : IntegrationTestBase(outputHelper) +{ + public class SimpleMessageWithMixedAttributesHandler(IMessageContextAccessor contextAccessor) : IHandlerAsync + { + private readonly IMessageContextAccessor _contextAccessor = contextAccessor; + + public Task Handle(SimpleMessage message) + { + HandledMessages.Add((_contextAccessor.MessageContext, message)); + return Task.FromResult(true); + } + + public List<(MessageContext context, SimpleMessage message)> HandledMessages { get; } = []; + } + + [AwsFact] + public async Task Then_The_Attributes_Are_Returned() + { + OutputHelper.WriteLine($"Running {nameof(Then_The_Attributes_Are_Returned)} test"); + + // Arrange + var handler = new SimpleMessageWithMixedAttributesHandler(new MessageContextAccessor()); + + var services = GivenJustSaying() + .ConfigureJustSaying((builder) => builder + .WithLoopbackTopic(UniqueName)) + .AddSingleton>(handler); + + await WhenAsync( + services, + async (publisher, listener, serviceProvider, cancellationToken) => + { + await listener.StartAsync(cancellationToken); + await publisher.StartAsync(cancellationToken); + + // Act + var metadata = new PublishMetadata() + .AddMessageAttribute("Text", "foo") + .AddMessageAttribute("Integer", 42) + .AddMessageAttribute("BinaryData", [.. "SnVzdCBFYXQgVGFrZWF3YXkuY29t"u8]) + .AddMessageAttribute("CustomBinaryData", new MessageAttributeValue + { + DataType = "Binary.jet", + BinaryValue = [ .."SnVzdFNheWluZw=="u8] + }); + await publisher.PublishAsync(new SimpleMessage(), metadata, cancellationToken); + + await Patiently.AssertThatAsync(OutputHelper, () => handler.HandledMessages.Count > 0); + + handler.HandledMessages.Count.ShouldBe(1); + var textAttribute = handler.HandledMessages[0].context.MessageAttributes.Get("Text"); + textAttribute.DataType.ShouldBe("String"); + textAttribute.StringValue.ShouldBe("foo"); + + var integerAttribute = handler.HandledMessages[0].context.MessageAttributes.Get("Integer"); + integerAttribute.DataType.ShouldBe("Number"); + integerAttribute.StringValue.ShouldBe("42"); + + var binaryDataAttribute = handler.HandledMessages[0].context.MessageAttributes.Get("BinaryData"); + binaryDataAttribute.DataType.ShouldBe("Binary"); + binaryDataAttribute.BinaryValue.ShouldBe([.. "SnVzdCBFYXQgVGFrZWF3YXkuY29t"u8]); + + var customBinaryDataAttribute = handler.HandledMessages[0].context.MessageAttributes.Get("CustomBinaryData"); + customBinaryDataAttribute.DataType.ShouldBe("Binary.jet"); + customBinaryDataAttribute.StringValue.ShouldBe(null); + customBinaryDataAttribute.BinaryValue.ShouldBe([.. "SnVzdFNheWluZw=="u8]); + }); + } +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs index d03cc8762..6db1a520f 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/SystemTextJson/WhenHandlingAMessageWithStringAttributes.cs @@ -33,7 +33,6 @@ public async Task Then_The_Attributes_Are_Returned() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder .WithLoopbackTopic(UniqueName)) - .AddSingleton() .AddSingleton>(handler); await WhenAsync( diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenAHandlerThrowsAnExceptionWithNoMonitor.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenAHandlerThrowsAnExceptionWithNoMonitor.cs index 1c730d4c1..9491263b8 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenAHandlerThrowsAnExceptionWithNoMonitor.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenAHandlerThrowsAnExceptionWithNoMonitor.cs @@ -18,7 +18,7 @@ public async Task Then_The_Message_Is_Handled() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder.Publications((options) => - options.WithQueue(qo => qo.WithName(UniqueName)))) + options.WithQueue(qo => qo.WithQueueName(UniqueName)))) .ConfigureJustSaying( (builder) => builder.Subscriptions( (options) => options.ForQueue( @@ -47,4 +47,4 @@ await Patiently.AssertThatAsync(() => }); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenApplyingDefaultMiddlewares.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenApplyingDefaultMiddlewares.cs index b12c0efea..075d50b8a 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenApplyingDefaultMiddlewares.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenApplyingDefaultMiddlewares.cs @@ -25,7 +25,7 @@ public async Task Then_The_Defaults_Are_The_Defaults_For_Sure() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder.WithLoopbackTopic(UniqueName)) - .AddJustSayingHandlers(new[] { handler }); + .AddJustSayingHandlers([handler]); string json = ""; await WhenAsync( @@ -81,4 +81,4 @@ await WhenAsync( json.ShouldMatchApproved(c => c.SubFolder($"Approvals")); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenReceivingIsThrottled.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenReceivingIsThrottled.cs index 2f49d461e..17dbcb311 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenReceivingIsThrottled.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenReceivingIsThrottled.cs @@ -16,8 +16,8 @@ public sealed class WhenReceivingIsThrottled(ITestOutputHelper outputHelper) : I [AwsFact] public async Task Then_The_Messages_Are_Handled_With_Throttle() { - // First handler takes ages all the others take 50 ms - int waitOthers = 50; + // First handler takes ages all the others take 10 ms + int waitOthers = 10; int waitOne = 3_600_000; var messagesToSend = Enumerable.Range(0, 30) @@ -30,7 +30,7 @@ public async Task Then_The_Messages_Are_Handled_With_Throttle() var services = GivenJustSaying() .ConfigureJustSaying((builder) => builder.Client((client) => client.WithAnonymousCredentials())) .ConfigureJustSaying((builder) => builder.Messaging((options) => options.WithPublishFailureBackoff(TimeSpan.FromMilliseconds(1)))) - .ConfigureJustSaying((builder) => builder.Publications((options) => options.WithQueue(o => o.WithName(UniqueName)))) + .ConfigureJustSaying((builder) => builder.Publications((options) => options.WithQueue(o => o.WithQueueName(UniqueName)))) .ConfigureJustSaying( (builder) => builder.Subscriptions( (options) => options @@ -41,19 +41,21 @@ public async Task Then_The_Messages_Are_Handled_With_Throttle() c.WithSubscriptionGroup("group"))))) .AddSingleton>(handler); - var baseSleep = TimeSpan.FromMilliseconds(500); + var baseSleep = TimeSpan.FromMilliseconds(50); await WhenAsync( services, async (publisher, listener, cancellationToken) => { + var waitForElevenMessages = handler.WaitForMessageCountAsync(11, cancellationToken); + await listener.StartAsync(cancellationToken); await publisher.StartAsync(cancellationToken); - // Publish the message with a long running handler + // Publish the message with a long-running handler await publisher.PublishAsync(messagesToSend.First(), cancellationToken); - // Give some time to AWS to schedule the first long running message + // Give some time to AWS to schedule the first long-running message await Task.Delay(baseSleep, cancellationToken); foreach (var msg in messagesToSend.Skip(1).SkipLast(1)) @@ -65,8 +67,8 @@ await WhenAsync( await Task.Delay(baseSleep, cancellationToken); await publisher.PublishAsync(messagesToSend.Last(), cancellationToken); - // Wait for a reasonble time before asserting whether the last message has been scheduled. - await Task.Delay(baseSleep * 2, cancellationToken); + // Wait for more than 10 messages. + await waitForElevenMessages; handler.ReceivedMessages.Count.ShouldBeGreaterThan(10); handler.ReceivedMessages.ShouldBeInOrder(SortDirection.Ascending); diff --git a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenUsingResourceAddresses.cs b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenUsingResourceAddresses.cs index e6272516a..719c1de23 100644 --- a/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenUsingResourceAddresses.cs +++ b/tests/JustSaying.IntegrationTests/Fluent/Subscribing/WhenUsingResourceAddresses.cs @@ -168,8 +168,9 @@ public async Task CanPublishUsingTopicArnWithoutStartingBusAndWithNoRegion() { builder.Client((options) => { - options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) - .WithServiceUri(ServiceUri); + options.WithClientFactory(() => clientFactory); + // options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) + // .WithServiceUri(ServiceUri); }); }) .ConfigureJustSaying(builder => @@ -219,8 +220,9 @@ public async Task CanPublishUsingTopicArnWithoutStartingBusAndWithNoRegionWithPu { builder.Client((options) => { - options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) - .WithServiceUri(ServiceUri); + options.WithClientFactory(() => new LocalAwsClientFactory(Bus)); + // options.WithSessionCredentials(AccessKeyId, SecretAccessKey, SessionToken) + // .WithServiceUri(ServiceUri); }); }) .ConfigureJustSaying(builder => diff --git a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj index a644901b2..af962fad4 100644 --- a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj +++ b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.csproj @@ -12,14 +12,14 @@ - - + + - + - + diff --git a/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.sln b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.sln new file mode 100644 index 000000000..5181f1dca --- /dev/null +++ b/tests/JustSaying.IntegrationTests/JustSaying.IntegrationTests.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JustSaying.IntegrationTests", "JustSaying.IntegrationTests.csproj", "{7B078B88-5CAE-423B-B6BB-18392F7C54BD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7B078B88-5CAE-423B-B6BB-18392F7C54BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B078B88-5CAE-423B-B6BB-18392F7C54BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B078B88-5CAE-423B-B6BB-18392F7C54BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B078B88-5CAE-423B-B6BB-18392F7C54BD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E3F85F97-D917-4B57-9EC0-DB84F3917969} + EndGlobalSection +EndGlobal diff --git a/tests/JustSaying.IntegrationTests/Logging/LogContextTests.cs b/tests/JustSaying.IntegrationTests/Logging/LogContextTests.cs index 75a56205c..e04b01ee4 100644 --- a/tests/JustSaying.IntegrationTests/Logging/LogContextTests.cs +++ b/tests/JustSaying.IntegrationTests/Logging/LogContextTests.cs @@ -1,8 +1,8 @@ +using System.Text.RegularExpressions; using JustSaying.IntegrationTests.Fluent; using JustSaying.Messaging; using JustSaying.Messaging.MessageHandling; using JustSaying.TestingFramework; -using MELT; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -27,13 +27,14 @@ public async Task PublishToTopicLogsShouldHaveContext() var message = new SimpleMessage(); await publisher.PublishAsync(message, cts.Token); - var testLogger = sp.GetRequiredService(); + var testLogger = sp.GetFakeLogCollector(); + var messageMatcher = new Regex(@"Published message ([a-zA-Z0-9\-]+) of type ([\w\.]+) to ([\w\s]+) '(.+?)'."); - var handleMessage = testLogger.LogEntries - .Single(le => le.OriginalFormat == "Published message {MessageId} of type {MessageType} to {DestinationType} '{MessageDestination}'."); + var handleMessage = testLogger.GetSnapshot() + .Single(le => messageMatcher.IsMatch(le.Message)); - var propertyMap = new Dictionary(handleMessage.Properties); - propertyMap.ShouldContainKeyAndValue("MessageId", message.Id); + var propertyMap = handleMessage.StructuredState.ShouldNotBeNull().ToDictionary(); + propertyMap.ShouldContainKeyAndValue("MessageId", message.Id.ToString()); propertyMap.ShouldContainKeyAndValue("MessageType", message.GetType().FullName); propertyMap.ShouldContainKeyAndValue("DestinationType", "Topic"); propertyMap.ShouldContainKey("MessageDestination"); @@ -58,13 +59,14 @@ public async Task PublishToQueueLogsShouldHaveContext() var message = new SimpleMessage(); await publisher.PublishAsync(message, cts.Token); - var testLogger = sp.GetRequiredService(); + var testLogger = sp.GetFakeLogCollector(); + var messageMatcher = new Regex(@"Published message ([a-zA-Z0-9\-]+) of type ([\w\.]+) to Queue '(.+?)'."); - var handleMessage = testLogger.LogEntries - .Single(le => le.OriginalFormat == "Published message {MessageId} of type {MessageType} to {DestinationType} '{MessageDestination}'."); + var handleMessage = testLogger.GetSnapshot() + .Single(le => messageMatcher.IsMatch(le.Message)); - var propertyMap = new Dictionary(handleMessage.Properties); - propertyMap.ShouldContainKeyAndValue("MessageId", message.Id); + var propertyMap = handleMessage.StructuredState.ShouldNotBeNull().ToDictionary(); + propertyMap.ShouldContainKeyAndValue("MessageId", message.Id.ToString()); propertyMap.ShouldContainKeyAndValue("MessageType", message.GetType().FullName); propertyMap.ShouldContainKeyAndValue("DestinationType", "Queue"); propertyMap.ShouldContainKey("MessageDestination"); @@ -107,16 +109,17 @@ await Patiently.AssertThatAsync(() => handler.ReceivedMessages .ShouldHaveSingleItem() .Id.ShouldBe(message.Id)); - var testLogger = sp.GetRequiredService(); + var testLogger = sp.GetFakeLogCollector(); + var messageMatcher = new Regex(@"\w handling message with Id '([a-zA-Z0-9\-]+)' of type ([\w\.]+) in \d*ms."); await Patiently.AssertThatAsync(() => { - var handleMessage = testLogger.LogEntries - .SingleOrDefault(le => le.OriginalFormat == "{Status} handling message with Id '{MessageId}' of type {MessageType} in {TimeToHandle}ms."); + var handleMessage = testLogger.GetSnapshot() + .SingleOrDefault(le => messageMatcher.IsMatch(le.Message)); handleMessage.ShouldNotBeNull(); - handleMessage.LogLevel.ShouldBe(level); + handleMessage.Level.ShouldBe(level); if (exceptionMessage != null) { @@ -124,9 +127,9 @@ await Patiently.AssertThatAsync(() => handleMessage.Exception.Message.ShouldBe(exceptionMessage); } - var propertyMap = new Dictionary(handleMessage.Properties); + var propertyMap = handleMessage.StructuredState.ShouldNotBeNull().ToDictionary(); propertyMap.ShouldContainKeyAndValue("Status", status); - propertyMap.ShouldContainKeyAndValue("MessageId", message.Id); + propertyMap.ShouldContainKeyAndValue("MessageId", message.Id.ToString()); propertyMap.ShouldContainKeyAndValue("MessageType", message.GetType().FullName); propertyMap.ShouldContainKey("TimeToHandle"); }); diff --git a/tests/JustSaying.IntegrationTests/TestSettings.cs b/tests/JustSaying.IntegrationTests/TestSettings.cs deleted file mode 100644 index e5cc5d402..000000000 --- a/tests/JustSaying.IntegrationTests/TestSettings.cs +++ /dev/null @@ -1 +0,0 @@ -[assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/tests/JustSaying.IntegrationTests/docker-compose.yml b/tests/JustSaying.IntegrationTests/docker-compose.yml index de650be7f..b833b24a4 100644 --- a/tests/JustSaying.IntegrationTests/docker-compose.yml +++ b/tests/JustSaying.IntegrationTests/docker-compose.yml @@ -1,10 +1,9 @@ -version: "2" services: localstack: container_name: localstack restart: unless-stopped - image: localstack/localstack:3.5.0 + image: localstack/localstack:3.7 ports: - - 4566:4566 + - "4566:4566" environment: LS_LOG: debug diff --git a/tests/JustSaying.IntegrationTests/xunit.runner.json b/tests/JustSaying.IntegrationTests/xunit.runner.json index b1988f269..96581b86d 100644 --- a/tests/JustSaying.IntegrationTests/xunit.runner.json +++ b/tests/JustSaying.IntegrationTests/xunit.runner.json @@ -1,6 +1,4 @@ { "methodDisplay": "classAndMethod", - "methodDisplayOptions": "replaceUnderscoreWithSpace", - "parallelizeTestCollections": false, - "maxParallelThreads": 1 + "methodDisplayOptions": "replaceUnderscoreWithSpace" } diff --git a/tests/JustSaying.TestingFramework/AwaitableMiddleware.cs b/tests/JustSaying.TestingFramework/AwaitableMiddleware.cs index c1aa3e1b7..f31f4356e 100644 --- a/tests/JustSaying.TestingFramework/AwaitableMiddleware.cs +++ b/tests/JustSaying.TestingFramework/AwaitableMiddleware.cs @@ -3,23 +3,27 @@ namespace JustSaying.TestingFramework; -public class AwaitableMiddleware(ITestOutputHelper outputHelper) : MiddlewareBase +public class AwaitableMiddleware(ITestOutputHelper outputHelper, int runCountToAwait = 1) : MiddlewareBase { private readonly ITestOutputHelper _outputHelper = outputHelper; - public Task Complete { get; private set; } + private int _runCountToAwait = runCountToAwait; + private readonly TaskCompletionSource _tcs = new (TaskCreationOptions.RunContinuationsAsynchronously); + public Task Complete => _tcs.Task; protected override async Task RunInnerAsync(HandleMessageContext context, Func> func, CancellationToken stoppingToken) { - var tcs = new TaskCompletionSource(); - Complete = tcs.Task; try { return await func(stoppingToken); } finally { - _outputHelper.WriteLine("Completing AwaitableMiddleware - the job is done."); - tcs.SetResult(); + Interlocked.Decrement(ref _runCountToAwait); + if (_runCountToAwait == 0) + { + _outputHelper.WriteLine("Completing AwaitableMiddleware - the job is done."); + _tcs.SetResult(); + } } } } diff --git a/tests/JustSaying.TestingFramework/AwsFactAttribute.cs b/tests/JustSaying.TestingFramework/AwsFactAttribute.cs index 6d3646f0a..928be3c9b 100644 --- a/tests/JustSaying.TestingFramework/AwsFactAttribute.cs +++ b/tests/JustSaying.TestingFramework/AwsFactAttribute.cs @@ -6,11 +6,8 @@ namespace JustSaying.TestingFramework; public sealed class AwsFactAttribute : FactAttribute { public AwsFactAttribute() - : base() { - if (!TestEnvironment.IsSimulatorConfigured && !TestEnvironment.HasCredentials) - { - Skip = "This test requires either an AWS simulator URL or AWS credentials to be configured."; - } + // TODO Add back logic to check if AWS credentials are available when running with LocalStack + // at the moment we are not using LocalStack so we can skip this check } -} \ No newline at end of file +} diff --git a/tests/JustSaying.TestingFramework/AwsTheoryAttribute.cs b/tests/JustSaying.TestingFramework/AwsTheoryAttribute.cs index b6ca18d36..666ef3e15 100644 --- a/tests/JustSaying.TestingFramework/AwsTheoryAttribute.cs +++ b/tests/JustSaying.TestingFramework/AwsTheoryAttribute.cs @@ -8,9 +8,7 @@ public sealed class AwsTheoryAttribute : TheoryAttribute public AwsTheoryAttribute() : base() { - if (!TestEnvironment.IsSimulatorConfigured && !TestEnvironment.HasCredentials) - { - Skip = "This test requires either an AWS simulator URL or AWS credentials to be configured."; - } + // TODO Add back logic to check if AWS credentials are available when running with LocalStack + // at the moment we are not using LocalStack so we can skip this check } -} \ No newline at end of file +} diff --git a/tests/JustSaying.TestingFramework/InspectableHandler.cs b/tests/JustSaying.TestingFramework/InspectableHandler.cs index 76e16884a..0bafa1cbf 100644 --- a/tests/JustSaying.TestingFramework/InspectableHandler.cs +++ b/tests/JustSaying.TestingFramework/InspectableHandler.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using JustSaying.Messaging.MessageHandling; namespace JustSaying.TestingFramework; @@ -6,21 +7,21 @@ public class InspectableHandler : IHandlerAsync { public InspectableHandler() { - ReceivedMessages = new List(); + ReceivedMessages = []; ShouldSucceed = true; } public Action OnHandle { get; set; } - public IList ReceivedMessages { get; } + public ConcurrentQueue ReceivedMessages { get; } public bool ShouldSucceed { get; set; } public virtual Task Handle(T message) { - ReceivedMessages.Add(message); + ReceivedMessages.Enqueue(message); OnHandle?.Invoke(message); return Task.FromResult(ShouldSucceed); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.TestingFramework/InspectableHandlerExtensions.cs b/tests/JustSaying.TestingFramework/InspectableHandlerExtensions.cs new file mode 100644 index 000000000..89931cc6f --- /dev/null +++ b/tests/JustSaying.TestingFramework/InspectableHandlerExtensions.cs @@ -0,0 +1,32 @@ +namespace JustSaying.TestingFramework; + +public static class InspectableHandlerExtensions +{ + public static async Task WaitForMessageCountAsync(this InspectableHandler handler, int count, CancellationToken cancellationToken = default) + { + var tcs = new TaskCompletionSource(); + var messageCount = 0; + + handler.OnHandle += Handler; + + await tcs.Task; + + handler.OnHandle -= Handler; + return; + + void Handler(T _) + { + if (cancellationToken.IsCancellationRequested) + { + tcs.SetCanceled(cancellationToken); + return; + } + + Interlocked.Increment(ref messageCount); + if (messageCount >= count) + { + tcs.SetResult(true); + } + } + } +} diff --git a/tests/JustSaying.TestingFramework/InspectableSqsClient.cs b/tests/JustSaying.TestingFramework/InspectableSqsClient.cs new file mode 100644 index 000000000..7e794a83d --- /dev/null +++ b/tests/JustSaying.TestingFramework/InspectableSqsClient.cs @@ -0,0 +1,84 @@ +using Amazon; +using Amazon.Runtime; +using Amazon.Runtime.Endpoints; +using Amazon.Runtime.SharedInterfaces; +using Amazon.SimpleNotificationService; +using Amazon.SQS; +using Amazon.SQS.Model; +using JustSaying.AwsTools; + +namespace JustSaying.TestingFramework; + +public sealed class InspectableSqsClient(IAmazonSQS innerAmazonSqsClient) : IAmazonSQS +{ + public List ReceiveMessageResponses { get; } = []; + + async Task IAmazonSQS.ReceiveMessageAsync(ReceiveMessageRequest request, CancellationToken cancellationToken) + { + var response = await innerAmazonSqsClient.ReceiveMessageAsync(request, cancellationToken); + ReceiveMessageResponses.Add(response); + return response; + } + + // Proxied implementations + void IDisposable.Dispose() => innerAmazonSqsClient.Dispose(); + Task> ICoreAmazonSQS.GetAttributesAsync(string queueUrl) => innerAmazonSqsClient.GetAttributesAsync(queueUrl); + Task ICoreAmazonSQS.SetAttributesAsync(string queueUrl, Dictionary attributes) => innerAmazonSqsClient.SetAttributesAsync(queueUrl, attributes); + IClientConfig IAmazonService.Config => innerAmazonSqsClient.Config; + Task IAmazonSQS.AuthorizeS3ToSendMessageAsync(string queueUrl, string bucket) => innerAmazonSqsClient.AuthorizeS3ToSendMessageAsync(queueUrl, bucket); + Task IAmazonSQS.AddPermissionAsync(string queueUrl, string label, List awsAccountIds, List actions, CancellationToken cancellationToken) => innerAmazonSqsClient.AddPermissionAsync(queueUrl, label, awsAccountIds, actions, cancellationToken); + Task IAmazonSQS.AddPermissionAsync(AddPermissionRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.AddPermissionAsync(request, cancellationToken); + Task IAmazonSQS.CancelMessageMoveTaskAsync(CancelMessageMoveTaskRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.CancelMessageMoveTaskAsync(request, cancellationToken); + Task IAmazonSQS.ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeout, CancellationToken cancellationToken) => innerAmazonSqsClient.ChangeMessageVisibilityAsync(queueUrl, receiptHandle, visibilityTimeout, cancellationToken); + Task IAmazonSQS.ChangeMessageVisibilityAsync(ChangeMessageVisibilityRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ChangeMessageVisibilityAsync(request, cancellationToken); + Task IAmazonSQS.ChangeMessageVisibilityBatchAsync(string queueUrl, List entries, CancellationToken cancellationToken) => innerAmazonSqsClient.ChangeMessageVisibilityBatchAsync(queueUrl, entries, cancellationToken); + Task IAmazonSQS.ChangeMessageVisibilityBatchAsync(ChangeMessageVisibilityBatchRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ChangeMessageVisibilityBatchAsync(request, cancellationToken); + Task IAmazonSQS.CreateQueueAsync(string queueName, CancellationToken cancellationToken) => innerAmazonSqsClient.CreateQueueAsync(queueName, cancellationToken); + Task IAmazonSQS.CreateQueueAsync(CreateQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.CreateQueueAsync(request, cancellationToken); + Task IAmazonSQS.DeleteMessageAsync(string queueUrl, string receiptHandle, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteMessageAsync(queueUrl, receiptHandle, cancellationToken); + Task IAmazonSQS.DeleteMessageAsync(DeleteMessageRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteMessageAsync(request, cancellationToken); + Task IAmazonSQS.DeleteMessageBatchAsync(string queueUrl, List entries, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteMessageBatchAsync(queueUrl, entries, cancellationToken); + Task IAmazonSQS.DeleteMessageBatchAsync(DeleteMessageBatchRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteMessageBatchAsync(request, cancellationToken); + Task IAmazonSQS.DeleteQueueAsync(string queueUrl, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteQueueAsync(queueUrl, cancellationToken); + Task IAmazonSQS.DeleteQueueAsync(DeleteQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.DeleteQueueAsync(request, cancellationToken); + Task IAmazonSQS.GetQueueAttributesAsync(string queueUrl, List attributeNames, CancellationToken cancellationToken) => innerAmazonSqsClient.GetQueueAttributesAsync(queueUrl, attributeNames, cancellationToken); + Task IAmazonSQS.GetQueueAttributesAsync(GetQueueAttributesRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.GetQueueAttributesAsync(request, cancellationToken); + Task IAmazonSQS.GetQueueUrlAsync(string queueName, CancellationToken cancellationToken) => innerAmazonSqsClient.GetQueueUrlAsync(queueName, cancellationToken); + Task IAmazonSQS.GetQueueUrlAsync(GetQueueUrlRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.GetQueueUrlAsync(request, cancellationToken); + Task IAmazonSQS.ListDeadLetterSourceQueuesAsync(ListDeadLetterSourceQueuesRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ListDeadLetterSourceQueuesAsync(request, cancellationToken); + Task IAmazonSQS.ListMessageMoveTasksAsync(ListMessageMoveTasksRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ListMessageMoveTasksAsync(request, cancellationToken); + Task IAmazonSQS.ListQueuesAsync(string queueNamePrefix, CancellationToken cancellationToken) => innerAmazonSqsClient.ListQueuesAsync(queueNamePrefix, cancellationToken); + Task IAmazonSQS.ListQueuesAsync(ListQueuesRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ListQueuesAsync(request, cancellationToken); + Task IAmazonSQS.ListQueueTagsAsync(ListQueueTagsRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.ListQueueTagsAsync(request, cancellationToken); + Task IAmazonSQS.PurgeQueueAsync(string queueUrl, CancellationToken cancellationToken) => innerAmazonSqsClient.PurgeQueueAsync(queueUrl, cancellationToken); + Task IAmazonSQS.PurgeQueueAsync(PurgeQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.PurgeQueueAsync(request, cancellationToken); + Task IAmazonSQS.ReceiveMessageAsync(string queueUrl, CancellationToken cancellationToken) => innerAmazonSqsClient.ReceiveMessageAsync(queueUrl, cancellationToken); + Task IAmazonSQS.RemovePermissionAsync(string queueUrl, string label, CancellationToken cancellationToken) => innerAmazonSqsClient.RemovePermissionAsync(queueUrl, label, cancellationToken); + Task IAmazonSQS.RemovePermissionAsync(RemovePermissionRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.RemovePermissionAsync(request, cancellationToken); + Task IAmazonSQS.SendMessageAsync(string queueUrl, string messageBody, CancellationToken cancellationToken) => innerAmazonSqsClient.SendMessageAsync(queueUrl, messageBody, cancellationToken); + Task IAmazonSQS.SendMessageAsync(SendMessageRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.SendMessageAsync(request, cancellationToken); + Task IAmazonSQS.SendMessageBatchAsync(string queueUrl, List entries, CancellationToken cancellationToken) => innerAmazonSqsClient.SendMessageBatchAsync(queueUrl, entries, cancellationToken); + Task IAmazonSQS.SendMessageBatchAsync(SendMessageBatchRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.SendMessageBatchAsync(request, cancellationToken); + Task IAmazonSQS.SetQueueAttributesAsync(string queueUrl, Dictionary attributes, CancellationToken cancellationToken) => innerAmazonSqsClient.SetQueueAttributesAsync(queueUrl, attributes, cancellationToken); + Task IAmazonSQS.SetQueueAttributesAsync(SetQueueAttributesRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.SetQueueAttributesAsync(request, cancellationToken); + Task IAmazonSQS.StartMessageMoveTaskAsync(StartMessageMoveTaskRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.StartMessageMoveTaskAsync(request, cancellationToken); + Task IAmazonSQS.TagQueueAsync(TagQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.TagQueueAsync(request, cancellationToken); + Task IAmazonSQS.UntagQueueAsync(UntagQueueRequest request, CancellationToken cancellationToken) => innerAmazonSqsClient.UntagQueueAsync(request, cancellationToken); + Endpoint IAmazonSQS.DetermineServiceOperationEndpoint(AmazonWebServiceRequest request) => innerAmazonSqsClient.DetermineServiceOperationEndpoint(request); + ISQSPaginatorFactory IAmazonSQS.Paginators => innerAmazonSqsClient.Paginators; +} + +public sealed class InspectableClientFactory(IAwsClientFactory innerClientFactory) : IAwsClientFactory +{ + public InspectableSqsClient InspectableSqsClient { get; } = new(innerClientFactory.GetSqsClient(TestEnvironment.Region)); + + public IAmazonSimpleNotificationService GetSnsClient(RegionEndpoint region) + { + return innerClientFactory.GetSnsClient(region); + } + + public IAmazonSQS GetSqsClient(RegionEndpoint region) + { + return InspectableSqsClient; + } +} diff --git a/tests/JustSaying.TestingFramework/JustSaying.TestingFramework.csproj b/tests/JustSaying.TestingFramework/JustSaying.TestingFramework.csproj index 2eb504355..f24d52a10 100644 --- a/tests/JustSaying.TestingFramework/JustSaying.TestingFramework.csproj +++ b/tests/JustSaying.TestingFramework/JustSaying.TestingFramework.csproj @@ -8,6 +8,7 @@ + diff --git a/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs b/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs index a400a192b..b0b085d64 100644 --- a/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs +++ b/tests/JustSaying.TestingFramework/LocalAwsClientFactory.cs @@ -1,36 +1,26 @@ using Amazon; -using Amazon.Runtime; using Amazon.SimpleNotificationService; using Amazon.SQS; using JustSaying.AwsTools; +using LocalSqsSnsMessaging; namespace JustSaying.TestingFramework; -public class LocalAwsClientFactory(Uri serviceUrl) : IAwsClientFactory +public sealed class LocalAwsClientFactory : IAwsClientFactory { - private Uri ServiceUrl { get; } = serviceUrl; + private readonly InMemoryAwsBus _bus; + public LocalAwsClientFactory(InMemoryAwsBus bus) + { + _bus = bus; + } public IAmazonSimpleNotificationService GetSnsClient(RegionEndpoint region) { - var credentials = new AnonymousAWSCredentials(); - var clientConfig = new AmazonSimpleNotificationServiceConfig - { - RegionEndpoint = region, - ServiceURL = ServiceUrl.ToString() - }; - - return new AmazonSimpleNotificationServiceClient(credentials, clientConfig); + return _bus.CreateSnsClient(); } public IAmazonSQS GetSqsClient(RegionEndpoint region) { - var credentials = new AnonymousAWSCredentials(); - var clientConfig = new AmazonSQSConfig - { - RegionEndpoint = region, - ServiceURL = ServiceUrl.ToString() - }; - - return new AmazonSQSClient(credentials, clientConfig); + return _bus.CreateSqsClient(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.TestingFramework/MessageStubs.cs b/tests/JustSaying.TestingFramework/MessageStubs.cs index 5ff0c69a9..d2401711b 100644 --- a/tests/JustSaying.TestingFramework/MessageStubs.cs +++ b/tests/JustSaying.TestingFramework/MessageStubs.cs @@ -1,3 +1,4 @@ +using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; namespace JustSaying.TestingFramework; @@ -17,6 +18,8 @@ public class OrderRejected : Message public class SimpleMessage : Message { public string Content { get; set; } + + public static IMessageBodySerializer Serializer { get; } = new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions); } public class AnotherSimpleMessage : Message @@ -44,6 +47,4 @@ public class GenericMessage : Message public T Contents { get; set; } } -public class MyMessage -{ -} \ No newline at end of file +public class MyMessage; diff --git a/tests/JustSaying.TestingFramework/TaskHelpers.cs b/tests/JustSaying.TestingFramework/TaskHelpers.cs index e7a8b6e30..a2d779a9b 100644 --- a/tests/JustSaying.TestingFramework/TaskHelpers.cs +++ b/tests/JustSaying.TestingFramework/TaskHelpers.cs @@ -2,24 +2,11 @@ namespace JustSaying.TestingFramework; public static class TaskHelpers { - public static async Task WaitWithTimeoutAsync(Task task) - => await WaitWithTimeoutAsync(task, TimeSpan.FromMilliseconds(10000)) - .ConfigureAwait(false); - - public static async Task WaitWithTimeoutAsync(Task task, TimeSpan timeoutDuration) - { - var timeoutTask = Task.Delay(timeoutDuration); - var firstToComplete = await Task.WhenAny(task, timeoutTask).ConfigureAwait(false); - - if (firstToComplete != timeoutTask) return true; - return false; - } - public static void DelaySendDone(TaskCompletionSource doneSignal) { Task.Run(async () => { - await Task.Delay(200).ConfigureAwait(false); + await Task.Delay(10).ConfigureAwait(false); doneSignal.SetResult(null); }); } diff --git a/tests/JustSaying.TestingFramework/TrackingLoggingMonitor.cs b/tests/JustSaying.TestingFramework/TrackingLoggingMonitor.cs index 9ab6d46bd..49392c802 100644 --- a/tests/JustSaying.TestingFramework/TrackingLoggingMonitor.cs +++ b/tests/JustSaying.TestingFramework/TrackingLoggingMonitor.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using Amazon.SQS.Model; using JustSaying.Messaging.Monitoring; using Microsoft.Extensions.Logging; @@ -6,32 +7,42 @@ namespace JustSaying.TestingFramework; public class TrackingLoggingMonitor(ILogger logger) : IMessageMonitor { - public List<(Type handlerType, Type messageType, TimeSpan duration)> HandlerExecutionTimes { get; } = []; - public IList HandledExceptions { get; } = new List(); - public IList<(Exception exception, Message message)> HandledErrors { get; } = new List<(Exception exception, Message message)>(); - public IList HandledTimes { get; } = new List(); - public IList HandledThrottlingTime { get; } = new List(); - public IList PublishMessageTimes { get; } = new List(); - public IList HandledMessages { get; } = new List(); - public IList<(TimeSpan duration, string queue, string region)> ReceiveMessageTimes { get; } = new List<(TimeSpan duration, string queue, string region)>(); + private readonly ConcurrentBag<(Type handlerType, Type messageType, TimeSpan duration)> _handlerExecutionTimes = []; + private readonly ConcurrentBag _handledExceptions = []; + private readonly ConcurrentBag<(Exception exception, Message message)> _handledErrors = []; + private readonly ConcurrentBag _handledTimes = []; + private readonly ConcurrentBag _handledThrottlingTime = []; + private readonly ConcurrentBag _publishMessageTimes = []; + private readonly ConcurrentBag _handledMessages = []; + private readonly ConcurrentBag<(TimeSpan duration, string queue, string region)> _receiveMessageTimes = []; + + public IReadOnlyCollection<(Type handlerType, Type messageType, TimeSpan duration)> HandlerExecutionTimes => _handlerExecutionTimes; + public IReadOnlyCollection HandledExceptions => _handledExceptions; + public IReadOnlyCollection<(Exception exception, Message message)> HandledErrors => _handledErrors; + public IReadOnlyCollection HandledTimes => _handledTimes; + public IReadOnlyCollection HandledThrottlingTime => _handledThrottlingTime; + public IReadOnlyCollection PublishMessageTimes => _publishMessageTimes; + public IReadOnlyCollection HandledMessages => _handledMessages; + public IReadOnlyCollection<(TimeSpan duration, string queue, string region)> ReceiveMessageTimes => _receiveMessageTimes; + public int IssuesPublishingMessage { get; private set; } public int ThrottlingStatisticIncrements { get; private set; } public void HandleException(Type messageType) { - HandledExceptions.Add(messageType); + _handledExceptions.Add(messageType); logger.LogInformation("Exception occurred when handling message of type {MessageType}", messageType.FullName); } public void HandleError(Exception ex, Message message) { - HandledErrors.Add((ex, message)); + _handledErrors.Add((ex, message)); logger.LogInformation("Handled Error for message type {MessageType}", message.GetType().FullName); } public void HandleTime(TimeSpan duration) { - HandledTimes.Add(duration); + _handledTimes.Add(duration); logger.LogInformation("Message handled in {Duration}", duration); } @@ -43,7 +54,7 @@ public void IssuePublishingMessage() public void Handled(Models.Message message) { - HandledMessages.Add(message); + _handledMessages.Add(message); logger.LogInformation("Handled message of type {MessageType}", message.GetType()); } @@ -54,19 +65,19 @@ public void IncrementThrottlingStatistic() public void HandleThrottlingTime(TimeSpan duration) { - HandledThrottlingTime.Add(duration); + _handledThrottlingTime.Add(duration); logger.LogInformation("MessageReceiveBuffer throttled for {Duration}", duration); } public void PublishMessageTime(TimeSpan duration) { - PublishMessageTimes.Add(duration); + _publishMessageTimes.Add(duration); logger.LogInformation("Message was published in {Duration}", duration); } public void ReceiveMessageTime(TimeSpan duration, string queueName, string region) { - ReceiveMessageTimes.Add((duration, queueName, region)); + _receiveMessageTimes.Add((duration, queueName, region)); logger.LogInformation( "MessageReceiveBuffer spent {Duration} receiving messages from {QueueName} in region {Region}", duration, @@ -76,7 +87,7 @@ public void ReceiveMessageTime(TimeSpan duration, string queueName, string regio public void HandlerExecutionTime(Type handlerType, Type messageType, TimeSpan duration) { - HandlerExecutionTimes.Add((handlerType, messageType, duration)); + _handlerExecutionTimes.Add((handlerType, messageType, duration)); logger.LogInformation("Handler type {HandlerType} spent {Duration} handling message of type {MessageType}", handlerType, duration, diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionRegistryTests.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionRegistryTests.cs new file mode 100644 index 000000000..2f0a97352 --- /dev/null +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageCompressionRegistryTests.cs @@ -0,0 +1,132 @@ +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; + +namespace JustSaying.UnitTests.AwsTools.MessageHandling; + +public class MessageCompressionRegistryTests +{ + private readonly MessageCompressionRegistry _compressionRegistry = new([new GzipMessageBodyCompression()]); + private readonly SystemTextJsonMessageBodySerializer _bodySerializer = new(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions); + + [Fact] + public void CompressMessageIfNeeded_NoCompression_ReturnsOriginalMessage() + { + // Arrange + var message = "Test message"; + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions(); + var messageConverter = new OutboundMessageConverter(PublishDestinationType.Topic, _bodySerializer, _compressionRegistry, compressionOptions, "TestSubject", false); + + // Act + var result = messageConverter.CompressMessageBody(message, metadata); + + // Assert + Assert.Null(result.compressedMessage); + Assert.Null(result.contentEncoding); + } + + [Fact] + public void CompressMessageIfNeeded_CompressionThresholdNotMet_ReturnsOriginalMessage() + { + // Arrange + var message = "Short message"; + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 1000 + }; + var messageConverter = new OutboundMessageConverter(PublishDestinationType.Topic, _bodySerializer, _compressionRegistry, compressionOptions, "TestSubject", false); + + // Act + var result = messageConverter.CompressMessageBody(message, metadata); + + // Assert + Assert.Null(result.compressedMessage); + Assert.Null(result.contentEncoding); + } + + [Fact] + public void CompressMessageIfNeeded_CompressionThresholdMet_ReturnsCompressedMessage() + { + // Arrange + var message = new string('a', 1000); + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 500 + }; + var messageConverter = new OutboundMessageConverter(PublishDestinationType.Topic, _bodySerializer, _compressionRegistry, compressionOptions, "TestSubject", false); + + // Act + var result = messageConverter.CompressMessageBody(message, metadata); + + // Assert + Assert.NotNull(result.compressedMessage); + Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); + + // Verify that the compressed message can be decompressed + var gzipCompression = new GzipMessageBodyCompression(); + var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); + Assert.Equal(message, decompressedMessage); + } + + [Fact] + public void CompressMessageIfNeeded_WithRawMessage_CompressionThresholdMet_ReturnsCompressedMessage() + { + // Arrange + var message = new string('a', 1000); + var metadata = new PublishMetadata(); + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 500 + }; + var messageConverter = new OutboundMessageConverter(PublishDestinationType.Queue, _bodySerializer, _compressionRegistry, compressionOptions, "TestSubject", true); + + // Act + var result = messageConverter.CompressMessageBody(message, metadata); + + // Assert + Assert.NotNull(result.compressedMessage); + Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); + + // Verify that the compressed message can be decompressed + var gzipCompression = new GzipMessageBodyCompression(); + var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); + Assert.Equal(message, decompressedMessage); + } + + [Fact] + public void CompressMessageIfNeeded_WithMessageAttributes_CalculatesTotalSize() + { + // Arrange + var message = "Test message"; + var metadata = new PublishMetadata(); + metadata.AddMessageAttribute("Key1", new MessageAttributeValue { StringValue = "Value1", DataType = "String" }); + metadata.AddMessageAttribute("Key2", new MessageAttributeValue { BinaryValue = new byte[100], DataType = "Binary" }); + + var compressionOptions = new PublishCompressionOptions + { + CompressionEncoding = ContentEncodings.GzipBase64, + MessageLengthThreshold = 50 + }; + var messageConverter = new OutboundMessageConverter(PublishDestinationType.Topic, _bodySerializer, _compressionRegistry, compressionOptions, "TestSubject", false); + + // Act + var result = messageConverter.CompressMessageBody(message, metadata); + + // Assert + Assert.NotNull(result.compressedMessage); + Assert.Equal(ContentEncodings.GzipBase64, result.contentEncoding); + + // Verify that the compressed message can be decompressed + var gzipCompression = new GzipMessageBodyCompression(); + var decompressedMessage = gzipCompression.Decompress(result.compressedMessage); + Assert.Equal(message, decompressedMessage); + } +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageContextAccessorTests.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageContextAccessorTests.cs index 6152da7e8..e7664a024 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageContextAccessorTests.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageContextAccessorTests.cs @@ -32,7 +32,7 @@ public async Task CanStoreAndRetrieveAsync() var accessor = MakeAccessor(); accessor.MessageContext = data; - await Task.Delay(250); + await Task.Delay(50); AssertSame(data, accessor.MessageContext); } @@ -86,8 +86,7 @@ private static async Task ThreadLocalDataRemainsTheSame(MessageContext data) for (int i = 0; i < 5; i++) { - await Task.Delay(100 + i) - .ConfigureAwait(false); + await Task.Yield(); AssertSame(data, accessor.MessageContext); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs new file mode 100644 index 000000000..09f308fcf --- /dev/null +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingCompressedMessage.cs @@ -0,0 +1,72 @@ +using System.IO.Compression; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using Amazon.SQS.Model; +using JustSaying.AwsTools.MessageHandling; +using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.Messaging.Monitoring; +using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; +using Microsoft.Extensions.Logging; +using MessageAttributeValue = Amazon.SQS.Model.MessageAttributeValue; + +namespace JustSaying.UnitTests.AwsTools.MessageHandling.MessageDispatcherTests; + +public class WhenDispatchingCompressedMessage +{ + [Fact] + public async Task ShouldDecompressMessage() + { + // Arrange + var originalMessage = new SimpleMessage { Id = Guid.NewGuid() }; + var decompressorRegistry = + new MessageCompressionRegistry([new GzipMessageBodyCompression()]); + var messageConverter = new InboundMessageConverter(SimpleMessage.Serializer, decompressorRegistry, false); + + string payload = JsonSerializer.Serialize(originalMessage, originalMessage.GetType(), new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + Converters = + { + new JsonStringEnumConverter(), + }, + }); + + var memoryStream = new MemoryStream(); + await using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress)) + { + gzipStream.Write(Encoding.UTF8.GetBytes(payload)); + } + + var compressedPayload = Convert.ToBase64String(memoryStream.ToArray()); + var fullMessagePayload = JsonSerializer.Serialize(new { Subject = nameof(SimpleMessage), Message = compressedPayload }); + + var sqsMessage = new Message + { + Body = fullMessagePayload, + MessageAttributes = + { + ["Content-Encoding"] = new MessageAttributeValue { DataType = "String", StringValue = ContentEncodings.GzipBase64 } + } + }; + + var queue = new FakeSqsQueue(ct => Task.FromResult(Enumerable.Empty())); + var queueReader = new SqsQueueReader(queue, messageConverter); + var messageContext = queueReader.ToMessageContext(sqsMessage); + var middlewareMap = new MiddlewareMap(); + var inspectableMiddleware = new InspectableMiddleware(); + middlewareMap.Add("fake-queue-name", inspectableMiddleware); + var messageDispatcher = new MessageDispatcher(new NullOpMessageMonitor(), middlewareMap, new LoggerFactory()); + + // Act + await messageDispatcher.DispatchMessageAsync(messageContext, CancellationToken.None); + + // Assert + var handledDecompressedMessage = inspectableMiddleware.Handler.ReceivedMessages.ShouldHaveSingleItem(); + handledDecompressedMessage.Id.ShouldBe(originalMessage.Id); + } +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs index b478a4b66..264074e23 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/MessageDispatcherTests/WhenDispatchingMessage.cs @@ -2,6 +2,8 @@ using Amazon.SQS; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageProcessingStrategies; using JustSaying.Messaging.MessageSerialization; @@ -11,9 +13,9 @@ using JustSaying.TestingFramework; using JustSaying.UnitTests.Messaging.Channels.Fakes; using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; -using MELT; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Testing; using Newtonsoft.Json; using NSubstitute; using SQSMessage = Amazon.SQS.Model.Message; @@ -24,7 +26,6 @@ public class WhenDispatchingMessage : IAsyncLifetime { private const string ExpectedQueueUrl = "http://testurl.com/queue"; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private readonly TrackingLoggingMonitor _messageMonitor; private readonly MiddlewareMap _middlewareMap; private readonly ILoggerFactory _loggerFactory; @@ -36,14 +37,26 @@ public class WhenDispatchingMessage : IAsyncLifetime internal MessageDispatcher SystemUnderTest { get; private set; } - protected readonly IMessageBackoffStrategy MessageBackoffStrategy = Substitute.For(); + private readonly IMessageBackoffStrategy _messageBackoffStrategy = Substitute.For(); + private readonly IMessageBodySerializer _messageBodySerializer = Substitute.For(); + private readonly InboundMessageConverter _messageConverter; + private readonly FakeLogCollector _fakeLogCollector; public WhenDispatchingMessage(ITestOutputHelper outputHelper) { _outputHelper = outputHelper; - _loggerFactory = TestLoggerFactory.Create(lb => lb.AddXUnit(outputHelper)); + var services = + new ServiceCollection().AddLogging(lb => + { + lb.SetMinimumLevel(LogLevel.Information); + lb.AddFakeLogging().AddXUnit(outputHelper); + }); + var sp = services.BuildServiceProvider(); + _fakeLogCollector = sp.GetFakeLogCollector(); + _loggerFactory = sp.GetService(); _messageMonitor = new TrackingLoggingMonitor(_loggerFactory.CreateLogger()); _middlewareMap = new MiddlewareMap(); + _messageConverter = new InboundMessageConverter(_messageBodySerializer, new MessageCompressionRegistry(), true); } public virtual async Task InitializeAsync() @@ -52,7 +65,7 @@ public virtual async Task InitializeAsync() SystemUnderTest = CreateSystemUnderTestAsync(); - await When().ConfigureAwait(false); + await When(); } public virtual Task DisposeAsync() @@ -62,7 +75,7 @@ public virtual Task DisposeAsync() protected virtual void Given() { - _typedMessage = new OrderAccepted(); + _typedMessage = new SimpleMessage(); _sqsMessage = new SQSMessage { @@ -77,22 +90,22 @@ IEnumerable GetMessages() _queue = new FakeSqsQueue(ct => Task.FromResult(GetMessages())) { - Uri = new Uri(ExpectedQueueUrl) + Uri = new Uri(ExpectedQueueUrl), + MaxNumberOfMessagesToReceive = 1 }; - _serializationRegister.DeserializeMessage(Arg.Any()) - .Returns(new MessageWithAttributes(_typedMessage, new MessageAttributes())); + + _messageBodySerializer.Deserialize(Arg.Any()).Returns(_typedMessage); } private async Task When() { - var queueReader = new SqsQueueReader(_queue); + var queueReader = new SqsQueueReader(_queue, _messageConverter); await SystemUnderTest.DispatchMessageAsync(queueReader.ToMessageContext(_sqsMessage), CancellationToken.None); } private MessageDispatcher CreateSystemUnderTestAsync() { var dispatcher = new MessageDispatcher( - _serializationRegister, _messageMonitor, _middlewareMap, _loggerFactory); @@ -100,6 +113,12 @@ private MessageDispatcher CreateSystemUnderTestAsync() return dispatcher; } + [Fact] + public void ShouldDeserializeMessage() + { + _messageBodySerializer.Received(1).Deserialize(Arg.Is(x => x == _sqsMessage.Body)); + } + public class AndHandlerMapDoesNotHaveMatchingHandler(ITestOutputHelper outputHelper) : WhenDispatchingMessage(outputHelper) { private const int ExpectedReceiveCount = 1; @@ -112,16 +131,15 @@ protected override void Given() } [Fact] - public void ShouldDeserializeMessage() - { - _serializationRegister.Received(1).DeserializeMessage(Arg.Is(x => x == _sqsMessage.Body)); - } - - [Fact] - public void ShouldNotHandleMessage() + public async Task ShouldNotHandleMessage() { - var testLogger = _loggerFactory.GetTestLoggerSink(); - testLogger.LogEntries.ShouldContain(le => le.OriginalFormat == "Failed to dispatch. Middleware for message of type '{MessageTypeName}' not found in middleware map."); + _messageBodySerializer.Received(1).Deserialize(Arg.Is(x => x == _sqsMessage.Body)); + _messageMonitor.HandledMessages.ShouldBeEmpty(); + await Patiently.AssertThatAsync(_outputHelper, () => + { + var logs = _fakeLogCollector.GetSnapshot(); + logs.ShouldContain(le => le.Message == "Failed to dispatch. Middleware for message of type 'JustSaying.TestingFramework.SimpleMessage' not found in middleware map."); + }); } } @@ -138,17 +156,11 @@ protected override void Given() sc => sc.AddSingleton>(handler)); var middleware = new HandlerMiddlewareBuilder(testResolver, testResolver) - .UseBackoff(MessageBackoffStrategy) + .UseBackoff(_messageBackoffStrategy) .UseDefaults(handler.GetType()) .Build(); - _middlewareMap.Add(_queue.QueueName, middleware); - } - - [Fact] - public void ShouldDeserializeMessage() - { - _serializationRegister.Received(1).DeserializeMessage(Arg.Is(x => x == _sqsMessage.Body)); + _middlewareMap.Add(_queue.QueueName, middleware); } [Fact] @@ -180,26 +192,26 @@ protected override void Given() sc => sc.AddSingleton>(handler)); var middleware = new HandlerMiddlewareBuilder(testResolver, testResolver) - .UseBackoff(MessageBackoffStrategy) + .UseBackoff(_messageBackoffStrategy) .UseDefaults(handler.GetType()) .Build(); - _middlewareMap.Add(_queue.QueueName, middleware); + _middlewareMap.Add(_queue.QueueName, middleware); - MessageBackoffStrategy.GetBackoffDuration(_typedMessage, 1, _expectedException).Returns(_expectedBackoffTimeSpan); + _messageBackoffStrategy.GetBackoffDuration(_typedMessage, 1, _expectedException).Returns(_expectedBackoffTimeSpan); _sqsMessage.Attributes.Add(MessageSystemAttributeName.ApproximateReceiveCount, ExpectedReceiveCount.ToString(CultureInfo.InvariantCulture)); } [Fact] public void ShouldInvokeMessageBackoffStrategyWithNumberOfReceives() { - MessageBackoffStrategy.Received(1).GetBackoffDuration(Arg.Is(_typedMessage), Arg.Is(ExpectedReceiveCount), Arg.Is(_expectedException)); + _messageBackoffStrategy.Received(1).GetBackoffDuration(Arg.Is(_typedMessage), Arg.Is(ExpectedReceiveCount), Arg.Is(_expectedException)); } [Fact] public void ShouldUpdateMessageVisibility() { - var request = _queue.ChangeMessageVisbilityRequests.ShouldHaveSingleItem(); + var request = _queue.ChangeMessageVisibilityRequests.ShouldHaveSingleItem(); request.QueueUrl.ShouldBe(ExpectedQueueUrl); request.ReceiptHandle.ShouldBe(_sqsMessage.ReceiptHandle); request.VisibilityTimeoutInSeconds.ShouldBe((int)_expectedBackoffTimeSpan.TotalSeconds); diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs index df73de4f3..f8e607aba 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishing.cs @@ -1,9 +1,9 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; -using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; +using JustSaying.Messaging.Compression; using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; @@ -12,18 +12,17 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishing : WhenPublishingTestBase { private const string Message = "the_message_in_json"; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); + var messageConverter = CreateConverter(new FakeBodySerializer(Message)); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, null, null); return Task.FromResult(topic); } protected override void Given() { - _serializationRegister.Serialize(Arg.Any(), Arg.Is(true)).Returns(Message); Sns.FindTopicAsync("TopicName") .Returns(new Topic { TopicArn = TopicArn }); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs index 6c2d3fbd7..7833c24dc 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsync.cs @@ -1,9 +1,9 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; -using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; +using JustSaying.Messaging.Compression; using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; @@ -15,19 +15,17 @@ public class WhenPublishingAsync : WhenPublishingTestBase private const string MessageAttributeKey = "StringAttribute"; private const string MessageAttributeValue = "StringValue"; private const string MessageAttributeDataType = "String"; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); + var messageConverter = CreateConverter(new FakeBodySerializer(Message)); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, null, null); return Task.FromResult(topic); } protected override void Given() { - _serializationRegister.Serialize(Arg.Any(), Arg.Is(true)).Returns(Message); - Sns.FindTopicAsync("TopicName") .Returns(new Topic { TopicArn = TopicArn }); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs index 364bf605b..52e3f68b8 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeHandled.cs @@ -1,6 +1,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging.Abstractions; @@ -11,12 +12,12 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingAsyncExceptionCanBeHandled : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, Substitute.For(), (_, _) => true); + var messageConverter = CreateConverter(); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, (_, _) => true, null); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs index e557dbfc9..09f6fa056 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncExceptionCanBeThrown.cs @@ -2,6 +2,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging.Abstractions; @@ -12,12 +13,12 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingAsyncExceptionCanBeThrown : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, Substitute.For(), (_, _) => false); + var messageConverter = CreateConverter(); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, (_, _) => false, null); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs index bfd59a2c2..2f95590a8 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncResponseLoggerIsCalled.cs @@ -3,6 +3,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using JustSaying.TestingFramework; @@ -14,7 +15,6 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingAsyncResultLoggerIsCalled : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private const string MessageId = "TestMessage12345"; @@ -25,7 +25,8 @@ public class WhenPublishingAsyncResultLoggerIsCalled : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, Substitute.For()) + var messageConverter = CreateConverter(); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, null, null) { MessageResponseLogger = (r, m) => { diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs index 98806ebe2..75b7d3d93 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingAsyncWithGenericMessageSubjectProvider.cs @@ -1,8 +1,10 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; @@ -10,23 +12,21 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingAsyncWithGenericMessageSubjectProvider : WhenPublishingTestBase { - public class MessageWithTypeParameters : Message - { - } + public class MessageWithTypeParameters : Message; private const string Message = "the_message_in_json"; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, new GenericMessageSubjectProvider()); + var subject = new GenericMessageSubjectProvider().GetSubjectForType(typeof(MessageWithTypeParameters)); + var messageConverter = CreateConverter(new FakeBodySerializer(Message), subject); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, null, null); return Task.FromResult(topic); } protected override void Given() { - _serializationRegister.Serialize(Arg.Any(), Arg.Is(true)).Returns(Message); Sns.FindTopicAsync("TopicName") .Returns(new Topic { TopicArn = TopicArn }); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatch.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatch.cs index 1e26b0690..86fbea921 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatch.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatch.cs @@ -1,9 +1,10 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; -using JustSaying.Messaging.MessageSerialization; +using JustSaying.Messaging.Compression; using JustSaying.Models; using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; @@ -15,17 +16,16 @@ public class WhenPublishingInBatch : WhenPublishingTestBase { private const string Message = "the_message_in_json"; private const string TopicArn = "topicarn"; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, new NonGenericMessageSubjectProvider()); + var messageConverter = CreateConverter(new FakeBodySerializer(Message)); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, null, null); return Task.FromResult(topic); } protected override void Given() { - _serializationRegister.Serialize(Arg.Any(), Arg.Is(true)).Returns(Message); Sns.FindTopicAsync("TopicName") .Returns(new Topic { TopicArn = TopicArn }); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncExceptionCanBeHandled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncExceptionCanBeHandled.cs index 7c64cdae2..5cf181b04 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncExceptionCanBeHandled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncExceptionCanBeHandled.cs @@ -1,6 +1,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using JustSaying.TestingFramework; @@ -14,21 +15,12 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingInBatchAsyncExceptionCanBeHandled : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher( - TopicArn, - Sns, - _serializationRegister, - NullLoggerFactory.Instance, - Substitute.For()) - { - HandleBatchException = (_, _) => true, - }; - + var messageConverter = CreateConverter(); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, null, (_, _) => true); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncExceptionCanBeThrown.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncExceptionCanBeThrown.cs index ff72e734d..ffef6e827 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncExceptionCanBeThrown.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncExceptionCanBeThrown.cs @@ -2,6 +2,7 @@ using Amazon.SimpleNotificationService.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using JustSaying.TestingFramework; @@ -15,21 +16,12 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingInBatchAsyncExceptionCanBeThrown : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private const string TopicArn = "topicarn"; private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher( - TopicArn, - Sns, - _serializationRegister, - NullLoggerFactory.Instance, - Substitute.For()) - { - HandleBatchException = (_, _) => false, - }; - + var messageConverter = CreateConverter(); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, (_, _) => false, null); return Task.FromResult(topic); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncResponseLoggerIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncResponseLoggerIsCalled.cs index c7fbfae2e..3a18be435 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncResponseLoggerIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncResponseLoggerIsCalled.cs @@ -4,6 +4,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging.Abstractions; @@ -17,7 +18,6 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; public class WhenPublishingInBatchAsyncResultLoggerIsCalled : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); private readonly List _testMessages = new(); private readonly List _messageIds = new(); private const string TopicArn = "topicarn"; @@ -29,7 +29,8 @@ public class WhenPublishingInBatchAsyncResultLoggerIsCalled : WhenPublishingTest private protected override Task CreateSystemUnderTestAsync() { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, Substitute.For()) + var messageConverter = CreateConverter(); + var topic = new SnsMessagePublisher(TopicArn, Sns, messageConverter, NullLoggerFactory.Instance, null, null) { MessageBatchResponseLogger = (r, m) => { diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncWithGenericMessageSubjectProvider.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncWithGenericMessageSubjectProvider.cs deleted file mode 100644 index e1c14d8e5..000000000 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingInBatchAsyncWithGenericMessageSubjectProvider.cs +++ /dev/null @@ -1,83 +0,0 @@ -using Amazon.SimpleNotificationService.Model; -using JustSaying.AwsTools.MessageHandling; -using JustSaying.Messaging; -using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; -using Microsoft.Extensions.Logging.Abstractions; -using NSubstitute; - -#pragma warning disable 618 - -namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; - -public class WhenPublishingInBatchAsyncWithGenericMessageSubjectProvider : WhenPublishingTestBase -{ - public class MessageWithTypeParameters : Message - { - } - - private readonly List _messages = []; - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); - private const string TopicArn = "topicarn"; - - private protected override Task CreateSystemUnderTestAsync() - { - var topic = new SnsMessagePublisher(TopicArn, Sns, _serializationRegister, NullLoggerFactory.Instance, new GenericMessageSubjectProvider()); - return Task.FromResult(topic); - } - - protected override void Given() - { - for (int i = 0; i < 10; i++) - { - var message = new MessageWithTypeParameters(); - _messages.Add(message); - _serializationRegister.Serialize(message, true).Returns("json_message_" + i); - } - - Sns.FindTopicAsync("TopicName") - .Returns(new Topic { TopicArn = TopicArn }); - } - - protected override async Task WhenAsync() - { - await SystemUnderTest.PublishAsync(_messages); - } - - [Fact] - public void MessageIsPublishedToSnsTopic() - { - Sns.Received().PublishBatchAsync(Arg.Is(x => AssertMessageIsPublishedToSnsTopic(x))); - } - - private static bool AssertMessageIsPublishedToSnsTopic(PublishBatchRequest request) - { - if (request.PublishBatchRequestEntries.Count != 10) - { - return false; - } - - for (int i = 0; i < 10; i++) - { - if (request.PublishBatchRequestEntries[i].Message != "json_message_" + i) - { - return false; - } - } - - return true; - } - - [Fact] - public void MessageSubjectIsObjectType() - { - string subject = new GenericMessageSubjectProvider().GetSubjectForType(typeof(MessageWithTypeParameters)); - Sns.Received().PublishBatchAsync(Arg.Is(x => x.PublishBatchRequestEntries.All(y => y.Subject == subject))); - } - - [Fact] - public void MessageIsPublishedToCorrectLocation() - { - Sns.Received().PublishBatchAsync(Arg.Is(x => x.TopicArn == TopicArn)); - } -} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingTestBase.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingTestBase.cs index 72cede2c6..f5fc353e1 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingTestBase.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sns/TopicByName/WhenPublishingTestBase.cs @@ -1,5 +1,9 @@ using Amazon.SimpleNotificationService; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; using NSubstitute; namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sns.TopicByName; @@ -28,5 +32,15 @@ public virtual Task DisposeAsync() protected abstract void Given(); private protected abstract Task CreateSystemUnderTestAsync(); + internal static OutboundMessageConverter CreateConverter(IMessageBodySerializer serializer = null, string subject = null) + { + return new OutboundMessageConverter(PublishDestinationType.Topic, + serializer ?? new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions), + new MessageCompressionRegistry(), + new PublishCompressionOptions(), + subject ?? nameof(SimpleMessage), + false); + } + protected abstract Task WhenAsync(); -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs index 73fa15b6a..89b4eb77b 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishing.cs @@ -1,6 +1,8 @@ +using System.Text.Json.Nodes; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,14 +12,15 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishing : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly OutboundMessageConverter _outboundMessageConverter = CreateConverter(); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; private const string QueueName = "queuename"; + private string _capturedMessageBody; private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _outboundMessageConverter, Substitute.For()); return Task.FromResult(sqs); } @@ -29,8 +32,7 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - _serializationRegister.Serialize(_message, false) - .Returns("serialized_contents"); + Sqs.SendMessageAsync(Arg.Do(x => _capturedMessageBody = x.MessageBody)); } protected override async Task WhenAsync() @@ -41,8 +43,12 @@ protected override async Task WhenAsync() [Fact] public void MessageIsPublishedToQueue() { - Sqs.Received().SendMessageAsync(Arg.Is( - x => x.MessageBody.Equals("serialized_contents", StringComparison.OrdinalIgnoreCase))); + _capturedMessageBody.ShouldNotBeNull(); + var jsonNode = JsonNode.Parse(_capturedMessageBody).ShouldNotBeNull(); + var messageBody = jsonNode["Message"]!.GetValue(); + var message = JsonNode.Parse(messageBody).ShouldNotBeNull(); + var content = message["Content"].ShouldNotBeNull().GetValue(); + content.ShouldBe("Hello"); } [Fact] diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs index 74bff9492..c623cc72a 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsync.cs @@ -1,6 +1,8 @@ +using System.Text.Json.Nodes; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,14 +12,15 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsync : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly OutboundMessageConverter _outboundMessageConverter = CreateConverter(); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new() { Content = "Hello" }; + private string _capturedMessageBody; private const string QueueName = "queuename"; private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _outboundMessageConverter, Substitute.For()); return Task.FromResult(sqs); } @@ -29,8 +32,7 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - _serializationRegister.Serialize(_message, false) - .Returns("serialized_contents"); + Sqs.SendMessageAsync(Arg.Do(x => _capturedMessageBody = x.MessageBody)); } protected override async Task WhenAsync() @@ -41,8 +43,12 @@ protected override async Task WhenAsync() [Fact] public void MessageIsPublishedToQueue() { - Sqs.Received().SendMessageAsync(Arg.Is( - x => x.MessageBody.Equals("serialized_contents", StringComparison.OrdinalIgnoreCase))); + _capturedMessageBody.ShouldNotBeNull(); + var jsonNode = JsonNode.Parse(_capturedMessageBody).ShouldNotBeNull(); + var messageBody = jsonNode["Message"]!.GetValue(); + var message = JsonNode.Parse(messageBody).ShouldNotBeNull(); + var content = message["Content"].ShouldNotBeNull().GetValue(); + content.ShouldBe("Hello"); } [Fact] diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs index 87faa815e..3fbf37297 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingAsyncResponseLoggerAsyncIsCalled.cs @@ -3,6 +3,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -14,7 +15,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingAsyncResponseLoggerAsyncIsCalled : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly OutboundMessageConverter _outboundMessageConverter = CreateConverter(); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _testMessage = new() { Content = "Hello" }; private const string QueueName = "queuename"; @@ -27,7 +28,7 @@ public class WhenPublishingAsyncResponseLoggerAsyncIsCalled : WhenPublishingTest private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()) + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _outboundMessageConverter, Substitute.For()) { MessageResponseLogger = (r, m) => { @@ -46,9 +47,6 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - _serializationRegister.Serialize(_testMessage, false) - .Returns("serialized_contents"); - Sqs.SendMessageAsync(Arg.Any()) .Returns(PublishResult); } @@ -99,4 +97,4 @@ public void MessageIsForwardedToResponseLogger() { _message.ShouldNotBeNull(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs index d4719cac6..44f6b4306 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessage.cs @@ -1,6 +1,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessage : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly OutboundMessageConverter _outboundMessageConverter = CreateConverter(); private const string Url = "https://testurl.com/" + QueueName; private readonly SimpleMessage _message = new(); @@ -23,7 +24,7 @@ public class WhenPublishingDelayedMessage : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _outboundMessageConverter, Substitute.For()); return Task.FromResult(sqs); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs index fbb28a4d0..ed3ba562f 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingDelayedMessageAsync.cs @@ -1,6 +1,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingDelayedMessageAsync : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly OutboundMessageConverter _outboundMessageConverter = CreateConverter(); private const string Url = "https://blablabla/" + QueueName; private readonly SimpleMessage _message = new(); private readonly PublishMetadata _metadata = new() @@ -21,7 +22,7 @@ public class WhenPublishingDelayedMessageAsync : WhenPublishingTestBase private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _outboundMessageConverter, Substitute.For()); return Task.FromResult(sqs); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatch.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatch.cs index 4ef4083b7..e26f708f2 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatch.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatch.cs @@ -1,6 +1,8 @@ +using System.Text.Json; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,14 +12,14 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingInBatch : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly OutboundMessageConverter _outboundMessageConverter = CreateConverter(); private const string Url = "https://blablabla/" + QueueName; private readonly List _messages = new(); private const string QueueName = "queuename"; private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _outboundMessageConverter, Substitute.For()); return Task.FromResult(sqs); } @@ -33,9 +35,6 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - - _serializationRegister.Serialize(Arg.Any(), false) - .Returns(x => $"serialized_contents_{((SimpleMessage)x.Args()[0]).Content}" ); } protected override async Task WhenAsync() @@ -65,7 +64,10 @@ private static bool AssertMessageIsPublishedToQueue(SendMessageBatchRequest requ for (var i = 0; i < 10; i++) { var entry = request.Entries[i]; - if (!entry.MessageBody.Equals($"serialized_contents_Message_{i}")) + if (!entry.MessageBody.Contains(JsonEncodedText.Encode( + $""" + "Content":"Message_{i} + """).Value, StringComparison.Ordinal)) { return false; } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatchAsyncResponseLoggerAsyncIsCalled.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatchAsyncResponseLoggerAsyncIsCalled.cs index ee7fa6b81..60f5cec29 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatchAsyncResponseLoggerAsyncIsCalled.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatchAsyncResponseLoggerAsyncIsCalled.cs @@ -3,6 +3,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -16,7 +17,7 @@ public class WhenPublishingInBatchAsyncResponseLoggerAsyncIsCalled : WhenPublish { private readonly List _testMessages = new(); private readonly List _messageIds = new(); - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly OutboundMessageConverter _outboundMessageConverter = CreateConverter(); private const string Url = "https://blablabla/" + QueueName; private const string QueueName = "queuename"; @@ -27,7 +28,7 @@ public class WhenPublishingInBatchAsyncResponseLoggerAsyncIsCalled : WhenPublish private protected override Task CreateSystemUnderTestAsync() { - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()) + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _outboundMessageConverter, Substitute.For()) { MessageBatchResponseLogger = (r, m) => { @@ -52,9 +53,6 @@ protected override void Given() Sqs.GetQueueAttributesAsync(Arg.Any()) .Returns(new GetQueueAttributesResponse()); - _serializationRegister.Serialize(Arg.Any(), false) - .Returns("serialized_contents"); - Sqs.SendMessageBatchAsync(Arg.Any()) .Returns(PublishResult); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatchDelayedMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatchDelayedMessage.cs index 48a12b152..aa2ef75c3 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatchDelayedMessage.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingInBatchDelayedMessage.cs @@ -1,6 +1,7 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; @@ -10,7 +11,7 @@ namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; public class WhenPublishingInBatchDelayedMessage : WhenPublishingTestBase { - private readonly IMessageSerializationRegister _serializationRegister = Substitute.For(); + private readonly OutboundMessageConverter _outboundMessageConverter = CreateConverter(); private const string Url = "https://testurl.com/" + QueueName; private readonly List _messages = new(); @@ -28,7 +29,7 @@ private protected override Task CreateSystemUnderTestAsync( _messages.Add(new SimpleMessage{ Content = $"Message {i}" }); } - var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _serializationRegister, Substitute.For()); + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _outboundMessageConverter, Substitute.For()); return Task.FromResult(sqs); } diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingRawMessage.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingRawMessage.cs new file mode 100644 index 000000000..2125fdeb5 --- /dev/null +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingRawMessage.cs @@ -0,0 +1,57 @@ +using System.Text.Json.Nodes; +using Amazon.SQS.Model; +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; +using Microsoft.Extensions.Logging; +using NSubstitute; + +namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; + +public class WhenPublishingRawMessage : WhenPublishingTestBase +{ + private readonly OutboundMessageConverter _outboundMessageConverter = CreateConverter(isRawMessage: true); + private const string Url = "https://blablabla/" + QueueName; + private readonly SimpleMessage _message = new() { Content = "Hello" }; + private const string QueueName = "queuename"; + private string _capturedMessageBody; + + private protected override Task CreateSystemUnderTestAsync() + { + var sqs = new SqsMessagePublisher(new Uri(Url), Sqs, _outboundMessageConverter, Substitute.For()); + return Task.FromResult(sqs); + } + + protected override void Given() + { + Sqs.GetQueueUrlAsync(Arg.Any()) + .Returns(new GetQueueUrlResponse { QueueUrl = Url }); + + Sqs.GetQueueAttributesAsync(Arg.Any()) + .Returns(new GetQueueAttributesResponse()); + + Sqs.SendMessageAsync(Arg.Do(x => _capturedMessageBody = x.MessageBody)); + } + + protected override async Task WhenAsync() + { + await SystemUnderTest.PublishAsync(_message); + } + + [Fact] + public void MessageIsPublishedToQueue() + { + _capturedMessageBody.ShouldNotBeNull(); + var jsonNode = JsonNode.Parse(_capturedMessageBody).ShouldNotBeNull(); + var content = jsonNode["Content"].ShouldNotBeNull().GetValue(); + content.ShouldBe("Hello"); + } + + [Fact] + public void MessageIsPublishedToCorrectLocation() + { + Sqs.Received().SendMessageAsync(Arg.Is(x => x.QueueUrl == Url)); + } +} diff --git a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingTestBase.cs b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingTestBase.cs index 73046bc7d..b9eb67026 100644 --- a/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingTestBase.cs +++ b/tests/JustSaying.UnitTests/AwsTools/MessageHandling/Sqs/WhenPublishingTestBase.cs @@ -1,5 +1,9 @@ using Amazon.SQS; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; using NSubstitute; namespace JustSaying.UnitTests.AwsTools.MessageHandling.Sqs; @@ -27,5 +31,15 @@ public virtual Task DisposeAsync() protected abstract void Given(); private protected abstract Task CreateSystemUnderTestAsync(); + internal static OutboundMessageConverter CreateConverter(bool isRawMessage = false) + { + return new OutboundMessageConverter(PublishDestinationType.Queue, + SimpleMessage.Serializer, + new MessageCompressionRegistry(), + new PublishCompressionOptions(), + nameof(SimpleMessage), + isRawMessage); + } + protected abstract Task WhenAsync(); -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/AwsTools/SqsQueueConfiguration/Validation/WhenPublishEndpointIsNotProvided.cs b/tests/JustSaying.UnitTests/AwsTools/SqsQueueConfiguration/Validation/WhenPublishEndpointIsNotProvided.cs index e06e196b3..842f0e088 100644 --- a/tests/JustSaying.UnitTests/AwsTools/SqsQueueConfiguration/Validation/WhenPublishEndpointIsNotProvided.cs +++ b/tests/JustSaying.UnitTests/AwsTools/SqsQueueConfiguration/Validation/WhenPublishEndpointIsNotProvided.cs @@ -30,4 +30,4 @@ protected override SqsReadConfiguration CreateSystemUnderTest() PublishEndpoint = null }; } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs b/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs new file mode 100644 index 000000000..d15c5dd36 --- /dev/null +++ b/tests/JustSaying.UnitTests/Fluent/CompressionEncodingValidatorTests.cs @@ -0,0 +1,55 @@ +using JustSaying.AwsTools.MessageHandling; +using JustSaying.Fluent; +using JustSaying.Messaging.Compression; + +namespace JustSaying.UnitTests.Fluent; + +public class CompressionEncodingValidatorTests +{ + [Fact] + public void ValidateEncoding_WithNullCompressionOptions_DoesNotThrow() + { + // Arrange + var registry = new MessageCompressionRegistry(); + + // Act & Assert + CompressionEncodingValidator.ValidateEncoding(registry, null); + } + + [Fact] + public void ValidateEncoding_WithNullCompressionEncoding_DoesNotThrow() + { + // Arrange + var registry = new MessageCompressionRegistry(); + var options = new PublishCompressionOptions { CompressionEncoding = null }; + + // Act & Assert + CompressionEncodingValidator.ValidateEncoding(registry, options); + } + + [Fact] + public void ValidateEncoding_WithRegisteredEncoding_DoesNotThrow() + { + // Arrange + var gzipCompression = new GzipMessageBodyCompression(); + var registry = new MessageCompressionRegistry([gzipCompression]); + var options = new PublishCompressionOptions { CompressionEncoding = ContentEncodings.GzipBase64 }; + + // Act & Assert + CompressionEncodingValidator.ValidateEncoding(registry, options); + } + + [Fact] + public void ValidateEncoding_WithUnregisteredEncoding_ThrowsInvalidOperationException() + { + // Arrange + var registry = new MessageCompressionRegistry(); + var options = new PublishCompressionOptions { CompressionEncoding = "unknown" }; + + // Act & Assert + var exception = Assert.Throws(() => + CompressionEncodingValidator.ValidateEncoding(registry, options)); + + Assert.Equal("Compression encoding 'unknown' is not registered with the bus.", exception.Message); + } +} diff --git a/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs b/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs index aea392fd2..5bb32006b 100644 --- a/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs +++ b/tests/JustSaying.UnitTests/Fluent/WhenUsingDefaultServiceResolver.cs @@ -38,13 +38,7 @@ public void ShouldResolveIMessagingConfigToMessagingConfig() [Fact] public void ShouldResolveIMessageSerializationFactoryToNewtonsoftSerializationFactory() { - _sut.ResolveService().ShouldBeOfType(); - } - - [Fact] - public void ShouldResolveIMessageSerializationRegisterToMessageSerializationRegister() - { - _sut.ResolveService().ShouldBeOfType(); + _sut.ResolveService().ShouldBeOfType(); } [Fact] diff --git a/tests/JustSaying.UnitTests/JustSaying.UnitTests.csproj b/tests/JustSaying.UnitTests/JustSaying.UnitTests.csproj index 99c92460a..b25a0b85b 100644 --- a/tests/JustSaying.UnitTests/JustSaying.UnitTests.csproj +++ b/tests/JustSaying.UnitTests/JustSaying.UnitTests.csproj @@ -11,10 +11,10 @@ - - + + - + diff --git a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs index e23cee990..eb460287b 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBus.cs @@ -1,5 +1,6 @@ using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using JustSaying.UnitTests.Messaging.Channels.TestHelpers; using Microsoft.Extensions.Logging; @@ -51,10 +52,9 @@ protected virtual void Given() private JustSaying.JustSayingBus CreateSystemUnderTest() { - var serializerRegister = new FakeSerializationRegister(); var messageReceivePauseSignal = new MessageReceivePauseSignal(); var bus = new JustSaying.JustSayingBus(Config, - serializerRegister, + new NewtonsoftSerializationFactory(), messageReceivePauseSignal, LoggerFactory, Monitor); diff --git a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs index d89376f0a..fffdff054 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/GivenAServiceBusWithoutMonitoring.cs @@ -1,4 +1,5 @@ using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.MessageSerialization; using Microsoft.Extensions.Logging; using NSubstitute; @@ -35,6 +36,6 @@ protected virtual void Given() private JustSaying.JustSayingBus CreateSystemUnderTest() { - return new JustSaying.JustSayingBus(Config, null, new MessageReceivePauseSignal(), LoggerFactory, null); + return new JustSaying.JustSayingBus(Config, new NewtonsoftSerializationFactory(), new MessageReceivePauseSignal(), LoggerFactory, null); } } diff --git a/tests/JustSaying.UnitTests/JustSayingBus/WhenPublishingMessages.cs b/tests/JustSaying.UnitTests/JustSayingBus/WhenPublishingMessages.cs index 1ae0e0b1a..7d9deea82 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/WhenPublishingMessages.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/WhenPublishingMessages.cs @@ -30,4 +30,4 @@ public void PublishMessageTimeStatsSent() { Monitor.PublishMessageTimes.ShouldHaveSingleItem(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs index 124af09fc..7c51e7892 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringMessageHandlers.cs @@ -1,5 +1,9 @@ using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; using JustSaying.UnitTests.AwsTools.MessageHandling; using NSubstitute; @@ -30,7 +34,11 @@ protected override void Given() protected override async Task WhenAsync() { - SystemUnderTest.AddQueue(typeof(Message).FullName, _queue); + SystemUnderTest.AddQueue(typeof(Message).FullName, new SqsSource + { + SqsQueue = _queue, + MessageConverter = new InboundMessageConverter(new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions), new MessageCompressionRegistry(), false) + }); SystemUnderTest.AddMessageMiddleware(_queue.QueueName, _futureHandler1); SystemUnderTest.AddMessageMiddleware(_queue.QueueName, _futureHandler2); @@ -46,4 +54,4 @@ public void HandlersAreAdded() } public class Message2 : Message { } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs index ce6ae44a2..49842e53c 100644 --- a/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs +++ b/tests/JustSaying.UnitTests/JustSayingBus/WhenRegisteringSubscribers.cs @@ -1,4 +1,8 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; using Newtonsoft.Json; @@ -36,8 +40,18 @@ protected override async Task WhenAsync() SystemUnderTest.AddMessageMiddleware(_queue1.QueueName, new InspectableMiddleware()); - SystemUnderTest.AddQueue("groupA", _queue1); - SystemUnderTest.AddQueue("groupB", _queue2); + var messageConverter1 = new InboundMessageConverter(new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions), new MessageCompressionRegistry(), false); + var messageConverter2 = new InboundMessageConverter(new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions), new MessageCompressionRegistry(), false); + SystemUnderTest.AddQueue("groupA", new SqsSource + { + SqsQueue = _queue1, + MessageConverter = messageConverter1 + }); + SystemUnderTest.AddQueue("groupB", new SqsSource + { + SqsQueue = _queue2, + MessageConverter = messageConverter2 + }); _cts = new CancellationTokenSource(); _cts.CancelAfter(TimeSpan.FromSeconds(5)); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs index 0e0766d7d..1aba7b8e6 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/ChannelsTests.cs @@ -1,10 +1,13 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Dispatch; using JustSaying.Messaging.Channels.Multiplexer; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.Messaging.Monitoring; @@ -24,18 +27,16 @@ public class ChannelsTests private ILoggerFactory LoggerFactory { get; } private IMessageMonitor MessageMonitor { get; } private ITestOutputHelper OutputHelper { get; } - private readonly TimeSpan _timeoutPeriod = TimeSpan.FromSeconds(1); + private readonly TimeSpan _timeoutPeriod = TimeSpan.FromMilliseconds(50); public ChannelsTests(ITestOutputHelper testOutputHelper) { MessageReceivePauseSignal = new MessageReceivePauseSignal(); OutputHelper = testOutputHelper; - LoggerFactory = new LoggerFactory().AddXUnit(testOutputHelper, LogLevel.Trace); + LoggerFactory = new LoggerFactory().AddXUnit(testOutputHelper, LogLevel.Information); MessageMonitor = new TrackingLoggingMonitor(LoggerFactory.CreateLogger()); } - - [Fact] public async Task QueueCanBeAssignedToOnePump() { @@ -180,8 +181,9 @@ public async Task MultipleQueuesCanBeAssignedToMultiplePumps() [InlineData(10, 20, 20, 50)] public async Task WhenSubscriberNotStarted_BufferShouldFillUp_AndStopDownloading(int receivePrefetch, int receiveBufferSize, int multiplexerCapacity, int expectedDownloadCount) { - var sqsQueue = TestQueue(); - IMessageReceiveBuffer buffer = CreateMessageReceiveBuffer(sqsQueue, receivePrefetch, receiveBufferSize); + var sqsSource = TestQueue(); + var sqsQueue = sqsSource.SqsQueue as FakeSqsQueue; + IMessageReceiveBuffer buffer = CreateMessageReceiveBuffer(sqsSource, receivePrefetch, receiveBufferSize); FakeDispatcher dispatcher = new FakeDispatcher(); IMultiplexerSubscriber consumer1 = CreateSubscriber(dispatcher); IMultiplexer multiplexer = CreateMultiplexer(multiplexerCapacity); @@ -198,7 +200,7 @@ public async Task WhenSubscriberNotStarted_BufferShouldFillUp_AndStopDownloading var multiplexerCompletion = multiplexer.RunAsync(cts.Token); var bufferCompletion = buffer.RunAsync(cts.Token); - cts.CancelAfter(3.Seconds()); + cts.CancelAfter(TimeSpan.FromMilliseconds(150)); await multiplexerCompletion.HandleCancellation(); await bufferCompletion.HandleCancellation(); @@ -224,7 +226,7 @@ public async Task Can_Be_Set_Up_Using_SubscriptionBus() var sqsQueue2 = TestQueue(); var sqsQueue3 = TestQueue(); - var queues = new List { sqsQueue1, sqsQueue2, sqsQueue3 }; + var queues = new List { sqsQueue1, sqsQueue2, sqsQueue3 }; IMessageDispatcher dispatcher = new FakeDispatcher(); var bus = CreateSubscriptionGroup(queues, dispatcher); @@ -242,7 +244,7 @@ public async Task Sqs_Queue_Is_Not_Polled_After_Cancellation() int callCountBeforeCancelled = 0; int callCountAfterCancelled = 0; - ISqsQueue sqsQueue = TestQueue(() => + var sqsQueue = TestQueue(() => { if (cts.Token.IsCancellationRequested) { @@ -275,7 +277,7 @@ public async Task Messages_Not_Dispatched_After_Cancellation() int dispatchedBeforeCancelled = 0; int dispatchedAfterCancelled = 0; - ISqsQueue sqsQueue = TestQueue(); + var sqsQueue = TestQueue(); IMessageDispatcher dispatcher = new FakeDispatcher(() => { if (cts.Token.IsCancellationRequested) @@ -305,7 +307,7 @@ public void SubscriptionGroup_StartingTwice_ShouldReturnSameCompletionTask() { var queue = TestQueue(); var dispatcher = new FakeDispatcher(); - var group = CreateSubscriptionGroup(new[] { queue }, dispatcher); + var group = CreateSubscriptionGroup([queue], dispatcher); var cts = new CancellationTokenSource(); @@ -317,7 +319,7 @@ public void SubscriptionGroup_StartingTwice_ShouldReturnSameCompletionTask() cts.Cancel(); } - private static FakeSqsQueue TestQueue(Action spy = null) + private static SqsSource TestQueue(Action spy = null) { IEnumerable GetMessages(CancellationToken cancellationToken) { @@ -329,11 +331,17 @@ IEnumerable GetMessages(CancellationToken cancellationToken) } } - return new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct))); + var source = new SqsSource + { + SqsQueue = new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct))), + MessageConverter = new InboundMessageConverter(SimpleMessage.Serializer, new MessageCompressionRegistry(), false) + }; + + return source; } private MessageReceiveBuffer CreateMessageReceiveBuffer( - ISqsQueue sqsQueue, + SqsSource sqsQueue, int prefetch = 10, int receiveBufferSize = 10) { @@ -356,7 +364,7 @@ private MultiplexerSubscriber CreateSubscriber(IMessageDispatcher dispatcher) } private ISubscriptionGroup CreateSubscriptionGroup( - IList queues, + IList queues, IMessageDispatcher dispatcher) { var defaults = new SubscriptionGroupSettingsBuilder(); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs index 594f4944a..ecbb09527 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/ErrorHandlingTests.cs @@ -1,8 +1,11 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using JustSaying.TestingFramework; using JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; @@ -40,8 +43,6 @@ IEnumerable GetMessages() } var queue = new FakeSqsQueue(ct => Task.FromResult(GetMessages())); - - var queues = new List { queue }; IMessageDispatcher dispatcher = new FakeDispatcher(() => { @@ -52,7 +53,13 @@ IEnumerable GetMessages() .WithDefaultConcurrencyLimit(8); var settings = new Dictionary { - { "test", new SubscriptionGroupConfigBuilder("test").AddQueues(queues) }, + { + "test", new SubscriptionGroupConfigBuilder("test").AddQueue(new SqsSource + { + SqsQueue = queue, + MessageConverter = new InboundMessageConverter(SimpleMessage.Serializer, new MessageCompressionRegistry(), false) + }) + } }; var subscriptionGroupFactory = new SubscriptionGroupFactory( @@ -93,7 +100,6 @@ IEnumerable GetMessages() } var queue = new FakeSqsQueue(ct => Task.FromResult(GetMessages())); - var queues = new List { queue }; IMessageDispatcher dispatcher = new FakeDispatcher(() => Interlocked.Increment(ref messagesDispatched)); @@ -101,7 +107,11 @@ IEnumerable GetMessages() .WithDefaultConcurrencyLimit(1); var settings = new Dictionary { - { "test", new SubscriptionGroupConfigBuilder("test").AddQueues(queues) }, + { "test", new SubscriptionGroupConfigBuilder("test").AddQueue(new SqsSource + { + SqsQueue = queue, + MessageConverter = new InboundMessageConverter(SimpleMessage.Serializer, new MessageCompressionRegistry(), false) + }) }, }; var subscriptionGroupFactory = new SubscriptionGroupFactory( diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeAmazonSqs.cs b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeAmazonSqs.cs index 76b278f10..22029fcb7 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeAmazonSqs.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeAmazonSqs.cs @@ -237,7 +237,7 @@ public async Task ReceiveMessageAsync( ReceiveMessageRequest request, CancellationToken cancellationToken = default) { - await Task.Delay(50, cancellationToken); + await Task.Yield(); ReceiveMessageRequests.Add(request); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeDispatcher.cs b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeDispatcher.cs index 3b879f6cd..730a9c129 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeDispatcher.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeDispatcher.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using JustSaying.AwsTools.MessageHandling.Dispatch; using JustSaying.Messaging.Channels.Context; @@ -5,12 +6,14 @@ namespace JustSaying.UnitTests.Messaging.Channels.TestHelpers; internal class FakeDispatcher(Action spy = null) : IMessageDispatcher { + private readonly ConcurrentBag _dispatchedMessages = []; + public Task DispatchMessageAsync(IQueueMessageContext messageContext, CancellationToken cancellationToken) { spy?.Invoke(); - DispatchedMessages.Add(messageContext); + _dispatchedMessages.Add(messageContext); return Task.CompletedTask; } - public IList DispatchedMessages { get; } = new List(); + public IReadOnlyCollection DispatchedMessages => _dispatchedMessages; } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeMessageLock.cs b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeMessageLock.cs index b8dad88ea..acb3c8772 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeMessageLock.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeMessageLock.cs @@ -1,14 +1,17 @@ +using System.Collections.Concurrent; using JustSaying.Messaging.MessageHandling; namespace JustSaying.UnitTests.Messaging.Channels.TestHelpers; public class FakeMessageLock(bool exclusive = true) : IMessageLockAsync { - public IList<(string key, TimeSpan howLong, bool isPermanent)> MessageLockRequests { get; } = new List<(string key, TimeSpan howLong, bool isPermanent)>(); + private readonly ConcurrentBag<(string key, TimeSpan howLong, bool isPermanent)> _messageLockRequests = []; + + public IReadOnlyCollection<(string key, TimeSpan howLong, bool isPermanent)> MessageLockRequests => _messageLockRequests; public Task TryAcquireLockPermanentlyAsync(string key) { - MessageLockRequests.Add((key, TimeSpan.MaxValue, true)); + _messageLockRequests.Add((key, TimeSpan.MaxValue, true)); return Task.FromResult(new MessageLockResponse { DoIHaveExclusiveLock = exclusive @@ -17,7 +20,7 @@ public Task TryAcquireLockPermanentlyAsync(string key) public Task TryAcquireLockAsync(string key, TimeSpan howLong) { - MessageLockRequests.Add((key, howLong, false)); + _messageLockRequests.Add((key, howLong, false)); return Task.FromResult(new MessageLockResponse { DoIHaveExclusiveLock = exclusive diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs index 99f1a8b12..47fa591c1 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSerializationRegister.cs @@ -1,38 +1,16 @@ -using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.MessageSerialization; using JustSaying.Models; -using JustSaying.TestingFramework; namespace JustSaying.UnitTests.Messaging.Channels.TestHelpers; -public class FakeSerializationRegister : IMessageSerializationRegister +internal class FakeBodySerializer(string messageBody) : IMessageBodySerializer { - public Func DefaultDeserializedMessage { get; set; } + public string Serialize(Message message) => messageBody; + Message IMessageBodySerializer.Deserialize(string message) => throw new NotImplementedException(); +} - public IList ReceivedDeserializationRequests { get; } - - public FakeSerializationRegister() - { - var defaultMessage = new SimpleMessage - { - RaisingComponent = "Component", - Id = Guid.NewGuid() - }; - DefaultDeserializedMessage = () => defaultMessage; - ReceivedDeserializationRequests = new List(); - } - - public MessageWithAttributes DeserializeMessage(string body) - { - ReceivedDeserializationRequests.Add(body); - return new MessageWithAttributes(DefaultDeserializedMessage(), new MessageAttributes()); - } - - public string Serialize(Message message, bool serializeForSnsPublishing) - { - return ""; - } - - public void AddSerializer() where T : Message - { } -} \ No newline at end of file +internal class FakeBodyDeserializer(Message messageToReturn) : IMessageBodySerializer +{ + string IMessageBodySerializer.Serialize(Message message) => throw new NotImplementedException(); + public Message Deserialize(string message) => messageToReturn; +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSqsQueue.cs b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSqsQueue.cs index 7df6a0375..afbbd3009 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSqsQueue.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/FakeSqsQueue.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.Messaging.Interrogation; @@ -7,6 +8,13 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class FakeSqsQueue(Func>> messageProducer, string queueName = "fake-queue-name") : ISqsQueue { private readonly Func>> _messageProducer = messageProducer; + private readonly TaskCompletionSource _receivedAllMessages = new(TaskCreationOptions.RunContinuationsAsynchronously); + private int _messageReceived; + private readonly ConcurrentBag _deleteMessageRequests = []; + private readonly ConcurrentBag _changeMessageVisibilityRequests = []; + private readonly ConcurrentBag _tagQueueRequests = []; + private readonly ConcurrentBag _receiveMessageRequests = []; + private readonly object _messageLock = new(); public InterrogationResult Interrogate() { @@ -17,38 +25,58 @@ public InterrogationResult Interrogate() public string RegionSystemName { get; } = "fake-region"; public Uri Uri { get; set; } = new Uri("http://test.com"); public string Arn { get; } = $"arn:aws:fake-region:123456789012:{queueName}"; + public int? MaxNumberOfMessagesToReceive { get; set; } = 100; + public Task ReceivedAllMessages => _receivedAllMessages.Task; - public List DeleteMessageRequests { get; } = new(); - public List ChangeMessageVisbilityRequests { get; } = new(); - public List TagQueueRequests { get; } = new(); - public List ReceiveMessageRequests { get; } = new(); + public IReadOnlyCollection DeleteMessageRequests => _deleteMessageRequests; + public IReadOnlyCollection ChangeMessageVisibilityRequests => _changeMessageVisibilityRequests; + public IReadOnlyCollection TagQueueRequests => _tagQueueRequests; + public IReadOnlyCollection ReceiveMessageRequests => _receiveMessageRequests; public Task DeleteMessageAsync(string queueUrl, string receiptHandle, CancellationToken cancellationToken) { - DeleteMessageRequests.Add(new FakeDeleteMessageRequest(queueUrl, receiptHandle)); + _deleteMessageRequests.Add(new FakeDeleteMessageRequest(queueUrl, receiptHandle)); return Task.CompletedTask; } public Task TagQueueAsync(string queueUrl, Dictionary tags, CancellationToken cancellationToken) { - TagQueueRequests.Add(new FakeTagQueueRequest(queueUrl, tags)); + _tagQueueRequests.Add(new FakeTagQueueRequest(queueUrl, tags)); return Task.CompletedTask; } public async Task> ReceiveMessagesAsync(string queueUrl, int maxNumOfMessages, int secondsWaitTime, IList attributesToLoad, CancellationToken cancellationToken) { - await Task.Delay(50, cancellationToken); + await Task.Yield(); var messages = await _messageProducer(cancellationToken); - var result = messages.Take(maxNumOfMessages).ToList(); + List result; - ReceiveMessageRequests.Add(new FakeReceiveMessagesRequest(queueUrl, maxNumOfMessages, secondsWaitTime, attributesToLoad, result.Count)); + lock (_messageLock) + { + var countToTake = MaxNumberOfMessagesToReceive is null ? maxNumOfMessages : Math.Min(maxNumOfMessages, MaxNumberOfMessagesToReceive.Value - _messageReceived); + result = messages.Take(countToTake).ToList(); + _messageReceived += result.Count; + + _receiveMessageRequests.Add(new FakeReceiveMessagesRequest(queueUrl, maxNumOfMessages, secondsWaitTime, attributesToLoad, result.Count)); + + if (_messageReceived >= MaxNumberOfMessagesToReceive) + { + _receivedAllMessages.TrySetResult(); + } + } + + // If empty, wait for a bit to avoid spinning in a tight loop + if (result.Count == 0) + { + await Task.Delay(TimeSpan.FromMilliseconds(20), cancellationToken); + } return result; } public Task ChangeMessageVisibilityAsync(string queueUrl, string receiptHandle, int visibilityTimeoutInSeconds, CancellationToken cancellationToken) { - ChangeMessageVisbilityRequests.Add(new FakeChangeMessageVisibilityRequest(queueUrl, receiptHandle, visibilityTimeoutInSeconds)); + _changeMessageVisibilityRequests.Add(new FakeChangeMessageVisibilityRequest(queueUrl, receiptHandle, visibilityTimeoutInSeconds)); return Task.CompletedTask; } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/InMemoryServiceResolver.cs b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/InMemoryServiceResolver.cs index 346b4037a..7b724676d 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/InMemoryServiceResolver.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/Fakes/InMemoryServiceResolver.cs @@ -13,7 +13,7 @@ public class InMemoryServiceResolver : IServiceResolver, IHandlerResolver private readonly IServiceProvider _provider; private static readonly Action Configure = (sc, outputHelper, monitor) => - sc.AddLogging(l => l.AddXUnit(outputHelper)) + sc.AddLogging(l => l.AddXUnit(outputHelper).SetMinimumLevel(LogLevel.Information)) .AddSingleton(monitor) .AddSingleton() .AddSingleton() diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs index 94889eefa..87b94d4df 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenReceivingShouldStop.cs @@ -1,5 +1,9 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.TestingFramework; @@ -12,9 +16,9 @@ public class WhenReceivingShouldStop { private class TestMessage : Message { } - private int _callCount; private readonly MessageReceivePauseSignal _messageReceivePauseSignal; private readonly MessageReceiveBuffer _messageReceiveBuffer; + private readonly FakeSqsQueue _queue; public WhenReceivingShouldStop(ITestOutputHelper testOutputHelper) { @@ -24,11 +28,16 @@ public WhenReceivingShouldStop(ITestOutputHelper testOutputHelper) new DelegateMiddleware>(); var messages = new List { new TestMessage() }; - var queue = new FakeSqsQueue(ct => + _queue = new FakeSqsQueue(ct => Task.FromResult(messages.AsEnumerable())) { - Interlocked.Increment(ref _callCount); - return Task.FromResult(messages.AsEnumerable()); - }); + MaxNumberOfMessagesToReceive = 10 + }; + + var source = new SqsSource + { + SqsQueue = _queue, + MessageConverter = new InboundMessageConverter(SimpleMessage.Serializer, new MessageCompressionRegistry(), false) + }; _messageReceivePauseSignal = new MessageReceivePauseSignal(); @@ -40,7 +49,7 @@ public WhenReceivingShouldStop(ITestOutputHelper testOutputHelper) 10, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1), - queue, + source, sqsMiddleware, _messageReceivePauseSignal, monitor, @@ -72,14 +81,14 @@ public async Task No_Messages_Are_Processed() _messageReceivePauseSignal.Pause(); using var cts = new CancellationTokenSource(); - var _ = _messageReceiveBuffer.RunAsync(cts.Token); + _ = _messageReceiveBuffer.RunAsync(cts.Token); var readTask = Messages(); // Check if we can start receiving for a while - await Task.Delay(TimeSpan.FromSeconds(2)); + await Task.Delay(TimeSpan.FromMilliseconds(150), cts.Token); // Cancel token - cts.Cancel(); + await cts.CancelAsync(); // Ensure buffer completes await _messageReceiveBuffer.Reader.Completion; @@ -98,20 +107,20 @@ public async Task All_Messages_Are_Processed_After_Starting() _messageReceivePauseSignal.Pause(); using var cts = new CancellationTokenSource(); - var _ = _messageReceiveBuffer.RunAsync(cts.Token); + _ = _messageReceiveBuffer.RunAsync(cts.Token); var readTask = Messages(); // Check if we can start receiving for a while - await Task.Delay(TimeSpan.FromSeconds(1)); + await Task.Delay(TimeSpan.FromMilliseconds(50), cts.Token); // Signal start receiving messages _messageReceivePauseSignal.Resume(); // Read messages for a while - await Task.Delay(TimeSpan.FromSeconds(1)); + await _queue.ReceivedAllMessages.WaitAsync(TimeSpan.FromSeconds(5), cts.Token); // Cancel token - cts.Cancel(); + await cts.CancelAsync(); // Ensure buffer completes await _messageReceiveBuffer.Reader.Completion; @@ -121,6 +130,6 @@ public async Task All_Messages_Are_Processed_After_Starting() // Make sure that number makes sense messagesRead.ShouldBeGreaterThan(0); - messagesRead.ShouldBeLessThanOrEqualTo(_callCount); + messagesRead.ShouldBeLessThanOrEqualTo(10); } } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs index c6ff0bd17..6643b3001 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSqsIsSlow.cs @@ -1,5 +1,9 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.TestingFramework; @@ -12,8 +16,8 @@ public class WhenSqsIsSlow { protected class TestMessage : Message { } - private int _callCount; private readonly MessageReceiveBuffer _messageReceiveBuffer; + private readonly FakeSqsQueue _queue; public WhenSqsIsSlow(ITestOutputHelper testOutputHelper) { @@ -23,12 +27,20 @@ public WhenSqsIsSlow(ITestOutputHelper testOutputHelper) new DelegateMiddleware>(); var messages = new List { new TestMessage() }; - var queue = new FakeSqsQueue(async ct => + _queue = new FakeSqsQueue(async ct => { - await Task.Delay(100, ct); - Interlocked.Increment(ref _callCount); + await Task.Delay(20, ct); return messages; - }); + }) + { + MaxNumberOfMessagesToReceive = 10 + }; + + var source = new SqsSource + { + SqsQueue = _queue, + MessageConverter = new InboundMessageConverter(SimpleMessage.Serializer, new MessageCompressionRegistry(), false) + }; var monitor = new TrackingLoggingMonitor( loggerFactory.CreateLogger()); @@ -38,7 +50,7 @@ public WhenSqsIsSlow(ITestOutputHelper testOutputHelper) 10, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1), - queue, + source, sqsMiddleware, null, monitor, @@ -67,14 +79,13 @@ protected async Task Messages() public async Task All_Messages_Are_Processed() { using var cts = new CancellationTokenSource(); - var _ = _messageReceiveBuffer.RunAsync(cts.Token); + _ = _messageReceiveBuffer.RunAsync(cts.Token); var readTask = Messages(); - // Read messages for a while - await Task.Delay(TimeSpan.FromSeconds(2)); + await _queue.ReceivedAllMessages.WaitAsync(TimeSpan.FromSeconds(5), cts.Token); // Cancel token - cts.Cancel(); + await cts.CancelAsync(); // Ensure buffer completes await _messageReceiveBuffer.Reader.Completion; @@ -84,6 +95,6 @@ public async Task All_Messages_Are_Processed() // Make sure that number makes sense messagesRead.ShouldBeGreaterThan(0); - messagesRead.ShouldBeLessThanOrEqualTo(_callCount); + messagesRead.ShouldBeLessThanOrEqualTo(10); } } diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs index 6e939f963..f290904d3 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenSubscriberIsSlow.cs @@ -1,5 +1,9 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.TestingFramework; @@ -23,11 +27,15 @@ public WhenSubscriberIsSlow(ITestOutputHelper testOutputHelper) new DelegateMiddleware>(); var messages = new List { new TestMessage() }; - var queue = new FakeSqsQueue(ct => + var queue = new SqsSource { - Interlocked.Increment(ref _callCount); - return Task.FromResult(messages.AsEnumerable()); - }); + SqsQueue = new FakeSqsQueue(ct => + { + Interlocked.Increment(ref _callCount); + return Task.FromResult(messages.AsEnumerable()); + }), + MessageConverter = new InboundMessageConverter(SimpleMessage.Serializer, new MessageCompressionRegistry(), false) + }; var monitor = new TrackingLoggingMonitor( loggerFactory.CreateLogger()); @@ -50,7 +58,6 @@ protected async Task Messages() while (true) { - await Task.Delay(100); var couldRead = await _messageReceiveBuffer.Reader.WaitToReadAsync(); if (!couldRead) break; @@ -67,14 +74,14 @@ protected async Task Messages() public async Task All_Messages_Are_Processed() { using var cts = new CancellationTokenSource(); - var _ = _messageReceiveBuffer.RunAsync(cts.Token); + _ = _messageReceiveBuffer.RunAsync(cts.Token); var readTask = Messages(); // Read messages for a while - await Task.Delay(TimeSpan.FromSeconds(2)); + await Task.Delay(TimeSpan.FromMilliseconds(150), cts.Token); // Cancel token - cts.Cancel(); + await cts.CancelAsync(); // Ensure buffer completes await _messageReceiveBuffer.Reader.Completion; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs index 857deb687..6c3aea7a8 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MessageReceiveBufferTests/WhenThereAreNoSubscribers.cs @@ -1,5 +1,9 @@ using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware; using JustSaying.Messaging.Middleware.Receive; using JustSaying.TestingFramework; @@ -26,11 +30,15 @@ public WhenThereAreNoSubscribers(ITestOutputHelper testOutputHelper) new DelegateMiddleware>(); var messages = new List { new TestMessage() }; - var queue = new FakeSqsQueue(ct => + var queue = new SqsSource { - Interlocked.Increment(ref _callCount); - return Task.FromResult(messages.AsEnumerable()); - }); + SqsQueue = new FakeSqsQueue(ct => + { + Interlocked.Increment(ref _callCount); + return Task.FromResult(messages.AsEnumerable()); + }), + MessageConverter = new InboundMessageConverter(SimpleMessage.Serializer, new MessageCompressionRegistry(), false) + }; var monitor = new TrackingLoggingMonitor( loggerFactory.CreateLogger()); @@ -51,7 +59,7 @@ public WhenThereAreNoSubscribers(ITestOutputHelper testOutputHelper) public async Task Buffer_Is_Filled() { using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1)); - var _ = _messageReceiveBuffer.RunAsync(cts.Token); + _ = _messageReceiveBuffer.RunAsync(cts.Token); await Patiently.AssertThatAsync(_outputHelper, () => _callCount > 0); diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/MultiplexerTests/MergingMultiplexerTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/MultiplexerTests/MergingMultiplexerTests.cs index 5ba60039c..50c327fad 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/MultiplexerTests/MergingMultiplexerTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/MultiplexerTests/MergingMultiplexerTests.cs @@ -7,7 +7,7 @@ namespace JustSaying.UnitTests.Messaging.Channels.MultiplexerTests; public class MergingMultiplexerTests(ITestOutputHelper outputHelper) { - private static readonly TimeSpan TimeoutPeriod = TimeSpan.FromSeconds(1); + private static readonly TimeSpan TimeoutPeriod = TimeSpan.FromMilliseconds(50); [Fact] public async Task Starting_Twice_Returns_Same_Task() diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs index 764dc8228..c5bf2bc70 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupCollectionTests.cs @@ -1,7 +1,9 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Monitoring; using JustSaying.TestingFramework; @@ -40,15 +42,24 @@ public async Task Add_Different_Handler_Per_Queue() var middleware1 = new InspectableMiddleware(); var middleware2 = new InspectableMiddleware(); + var messageConverter = new InboundMessageConverter(TestJustSayingMessage.Serializer, new MessageCompressionRegistry(), false); bus.AddMessageMiddleware(queueName1, middleware1); bus.AddMessageMiddleware(queueName2, middleware2); - ISqsQueue queue1 = TestQueue(bus.SerializationRegister, queueName1); - ISqsQueue queue2 = TestQueue(bus.SerializationRegister, queueName2); + ISqsQueue queue1 = await TestQueue(queueName1); + ISqsQueue queue2 = await TestQueue(queueName2); - bus.AddQueue(group1, queue1); - bus.AddQueue(group2, queue2); + bus.AddQueue(group1, new SqsSource + { + SqsQueue = queue1, + MessageConverter = messageConverter + }); + bus.AddQueue(group2, new SqsSource + { + SqsQueue = queue2, + MessageConverter = messageConverter + }); using var cts = new CancellationTokenSource(); @@ -81,11 +92,8 @@ await Patiently.AssertThatAsync(_outputHelper, private JustSaying.JustSayingBus CreateBus() { var config = Substitute.For(); - var serializationRegister = new MessageSerializationRegister( - new NonGenericMessageSubjectProvider(), - new NewtonsoftSerializationFactory()); - var bus = new JustSaying.JustSayingBus(config, serializationRegister, MessageReceivePauseSignal, LoggerFactory, MessageMonitor); + var bus = new JustSaying.JustSayingBus(config, new NewtonsoftSerializationFactory(), MessageReceivePauseSignal, LoggerFactory, MessageMonitor); var defaultSubscriptionSettings = new SubscriptionGroupSettingsBuilder() .WithDefaultMultiplexerCapacity(1) @@ -98,8 +106,7 @@ private JustSaying.JustSayingBus CreateBus() return bus; } - private static FakeSqsQueue TestQueue( - IMessageSerializationRegister messageSerializationRegister, + private static async Task TestQueue( string queueName, Action spy = null) { @@ -108,10 +115,15 @@ private static FakeSqsQueue TestQueue( QueueName = queueName, }; - var messages = new List - { - new TestMessage { Body = messageSerializationRegister.Serialize(message, false) }, - }; + var messageConverter = new OutboundMessageConverter( + PublishDestinationType.Queue, + new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions), + new MessageCompressionRegistry(), + new PublishCompressionOptions(), + "TestJustSayingMessage", + false); + + List messages = [new TestMessage { Body = (await messageConverter.ConvertToOutboundMessageAsync(message, null)).Body }]; var queue = new FakeSqsQueue(async ct => { @@ -135,6 +147,8 @@ private class TestJustSayingMessage : JustSaying.Models.Message { public string QueueName { get; set; } + public static IMessageBodySerializer Serializer => new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions); + public override string ToString() { return QueueName; diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs index 85c2af5d4..41e43bef7 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/BaseSubscriptionGroupTests.cs @@ -1,8 +1,9 @@ using Amazon.SQS.Model; -using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.Middleware; using JustSaying.TestingFramework; @@ -16,10 +17,9 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public abstract class BaseSubscriptionGroupTests : IAsyncLifetime { - protected IList Queues; + protected IList Queues; protected MiddlewareMap MiddlewareMap; protected TrackingLoggingMonitor Monitor; - protected FakeSerializationRegister SerializationRegister; protected int ConcurrencyLimit = 8; protected ITestOutputHelper OutputHelper { get; } @@ -28,6 +28,7 @@ public abstract class BaseSubscriptionGroupTests : IAsyncLifetime protected ISubscriptionGroup SystemUnderTest { get; private set; } protected ILoggerFactory LoggerFactory { get; } protected ILogger Logger { get; } + protected CancellationTokenSource CancellationTokenSource { get; } = new(); private readonly IMessageReceivePauseSignal _messageReceivePauseSignal; @@ -50,12 +51,16 @@ public async Task InitializeAsync() private void GivenInternal() { - Queues = new List(); + Queues = []; Handler = new InspectableHandler(); Monitor = new TrackingLoggingMonitor(LoggerFactory.CreateLogger()); - SerializationRegister = new FakeSerializationRegister(); MiddlewareMap = new MiddlewareMap(); - CompletionMiddleware = new AwaitableMiddleware(OutputHelper); + CompletionMiddleware = new AwaitableMiddleware(OutputHelper, MessagesToWaitFor); + SetupMessage = new SimpleMessage + { + RaisingComponent = "Component", + Id = Guid.NewGuid() + }; var testResolver = new InMemoryServiceResolver(OutputHelper, Monitor, sc => sc.AddSingleton>(Handler)); @@ -68,6 +73,8 @@ private void GivenInternal() Given(); } + public SimpleMessage SetupMessage { get; private set; } + public int MessagesToWaitFor { get; protected set; } = 1; public AwaitableMiddleware CompletionMiddleware { get; set; } protected abstract void Given(); @@ -75,34 +82,34 @@ private void GivenInternal() // Default implementation protected virtual async Task WhenAsync() { - foreach (ISqsQueue queue in Queues) + foreach (SqsSource queue in Queues) { - MiddlewareMap.Add(queue.QueueName, Middleware); + MiddlewareMap.Add(queue.SqsQueue.QueueName, Middleware); } var cts = new CancellationTokenSource(TimeSpan.FromSeconds(20)); - var completion = SystemUnderTest.RunAsync(cts.Token); + using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, CancellationTokenSource.Token); + var completion = SystemUnderTest.RunAsync(linkedCts.Token); await Patiently.AssertThatAsync(OutputHelper, - () => Until() || cts.IsCancellationRequested); + async () => cts.IsCancellationRequested || await UntilAsync()); - cts.Cancel(); + await cts.CancelAsync(); await completion.HandleCancellation(); } - protected virtual bool Until() + protected virtual async Task UntilAsync() { OutputHelper.WriteLine("Checking if middleware chain has completed"); - return CompletionMiddleware.Complete?.IsCompleted ?? false; + await (CompletionMiddleware.Complete ?? Task.CompletedTask).WaitAsync(TimeSpan.FromSeconds(5)).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing); + return CompletionMiddleware.Complete is not null; } private ISubscriptionGroup CreateSystemUnderTest() { - Logger.LogInformation("Creating MessageDispatcher with serialization register type {Type}", - SerializationRegister.GetType().FullName); + Logger.LogInformation("Creating MessageDispatcher"); var dispatcher = new MessageDispatcher( - SerializationRegister, Monitor, MiddlewareMap, LoggerFactory); @@ -125,28 +132,33 @@ protected virtual Dictionary SetupBusCon { return new Dictionary { - { "test", new SubscriptionGroupConfigBuilder("test").AddQueues(Queues) }, + ["test"] = new SubscriptionGroupConfigBuilder("test").AddQueues(Queues) }; } - protected static FakeSqsQueue CreateSuccessfulTestQueue(string queueName, params Message[] messages) + protected SqsSource CreateSuccessfulTestQueue(string queueName, params Message[] messages) { return CreateSuccessfulTestQueue(queueName, messages.AsEnumerable()); } - protected static FakeSqsQueue CreateSuccessfulTestQueue(string queueName, IEnumerable messages) + protected SqsSource CreateSuccessfulTestQueue(string queueName, IEnumerable messages) { return CreateSuccessfulTestQueue(queueName, ct => Task.FromResult(messages)); } - protected static FakeSqsQueue CreateSuccessfulTestQueue( + protected SqsSource CreateSuccessfulTestQueue( string queueName, Func>> messageProducer) { - var sqsQueue = new FakeSqsQueue( messageProducer, - queueName); + var sqsQueue = new FakeSqsQueue(messageProducer, queueName); - return sqsQueue; + return new SqsSource + { + SqsQueue = sqsQueue, + MessageConverter = new InboundMessageConverter(new FakeBodyDeserializer( + SetupMessage), + new MessageCompressionRegistry(), false) + }; } public Task DisposeAsync() diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs index 5565d62c6..beae753b6 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandler.cs @@ -1,4 +1,6 @@ +using System.Text.Json; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.Middleware; using JustSaying.TestingFramework; @@ -11,13 +13,17 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenExactlyOnceIsAppliedToHandler(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) { - private ISqsQueue _queue; + private SqsSource _queue; private readonly int _expectedTimeout = 5; private FakeMessageLock _messageLock; protected override void Given() { - _queue = CreateSuccessfulTestQueue("TestQueue", new TestMessage()); + _queue = CreateSuccessfulTestQueue("TestQueue", + new TestMessage + { + Body = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode("""{ "Content": "Hi"} }""")}}"}""" + }); Queues.Add(_queue); @@ -26,7 +32,7 @@ protected override void Given() var serviceResolver = new InMemoryServiceResolver(sc => sc.AddSingleton(_messageLock) .AddSingleton>(Handler) - .AddLogging(x => x.AddXUnit(OutputHelper))); + .AddLogging(x => x.AddXUnit(OutputHelper).SetMinimumLevel(LogLevel.Information))); var middlewareBuilder = new HandlerMiddlewareBuilder(serviceResolver, serviceResolver); @@ -41,17 +47,16 @@ protected override void Given() protected override async Task WhenAsync() { - MiddlewareMap.Add(_queue.QueueName, Middleware); + MiddlewareMap.Add(_queue.SqsQueue.QueueName, Middleware); using var cts = new CancellationTokenSource(); var completion = SystemUnderTest.RunAsync(cts.Token); // wait until it's done - await Patiently.AssertThatAsync(OutputHelper, - () => Handler.ReceivedMessages.Any()); + await Patiently.AssertThatAsync(OutputHelper, () => !Handler.ReceivedMessages.IsEmpty); - cts.Cancel(); + await cts.CancelAsync(); await Assert.ThrowsAnyAsync(() => completion); } @@ -65,12 +70,13 @@ public void ProcessingIsPassedToTheHandler() [Fact] public void MessageIsLocked() { - var messageId = SerializationRegister.DefaultDeserializedMessage().Id.ToString(); + // this should be part of setup to make work + var messageId = SetupMessage.Id.ToString(); - var tempLockRequests = _messageLock.MessageLockRequests.Where(lr => !lr.isPermanent); - tempLockRequests.Count().ShouldBeGreaterThan(0); + var tempLockRequests = _messageLock.MessageLockRequests.Where(lr => !lr.isPermanent).ToList(); + tempLockRequests.Count.ShouldBeGreaterThan(0); tempLockRequests.ShouldAllBe(pair => pair.key.Contains(messageId, StringComparison.OrdinalIgnoreCase) && pair.howLong == TimeSpan.FromSeconds(_expectedTimeout)); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs index 603fd35f1..35fc0bcd3 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenExactlyOnceIsAppliedToHandlerWithoutExplicitTimeout.cs @@ -1,4 +1,6 @@ +using System.Text.Json; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging.Channels.SubscriptionGroups; using JustSaying.Messaging.MessageHandling; using JustSaying.Messaging.Middleware; using JustSaying.TestingFramework; @@ -11,20 +13,24 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenExactlyOnceIsAppliedWithoutSpecificTimeout(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) { - private ISqsQueue _queue; + private SqsSource _queue; private readonly int _maximumTimeout = (int)TimeSpan.MaxValue.TotalSeconds; private FakeMessageLock _messageLock; protected override void Given() { - _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage()); + _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), + new TestMessage + { + Body = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode("""{ "Content": "Hi" }""")}}"}""" + }); Queues.Add(_queue); _messageLock = new FakeMessageLock(); var serviceResolver = new InMemoryServiceResolver(sc => sc.AddSingleton(_messageLock) .AddSingleton>(Handler) - .AddLogging(x => x.AddXUnit(OutputHelper))); + .AddLogging(x => x.AddXUnit(OutputHelper).SetMinimumLevel(LogLevel.Information))); var middlewareBuilder = new HandlerMiddlewareBuilder(serviceResolver, serviceResolver); @@ -39,16 +45,16 @@ protected override void Given() protected override async Task WhenAsync() { - MiddlewareMap.Add(_queue.QueueName, Middleware); + MiddlewareMap.Add(_queue.SqsQueue.QueueName, Middleware); var cts = new CancellationTokenSource(); var completion = SystemUnderTest.RunAsync(cts.Token); await Patiently.AssertThatAsync(OutputHelper, - () => Handler.ReceivedMessages.Any()); + () => !Handler.ReceivedMessages.IsEmpty); - cts.Cancel(); + await cts.CancelAsync(); await Assert.ThrowsAnyAsync(() => completion); } @@ -56,9 +62,9 @@ await Patiently.AssertThatAsync(OutputHelper, [Fact] public void MessageIsLocked() { - var messageId = SerializationRegister.DefaultDeserializedMessage().Id.ToString(); + var messageId = SetupMessage.Id.ToString(); - var tempLockRequests = _messageLock.MessageLockRequests.Where(lr => !lr.isPermanent); + var tempLockRequests = _messageLock.MessageLockRequests.Where(lr => !lr.isPermanent).ToList(); tempLockRequests.ShouldNotBeEmpty(); foreach(var lockRequest in tempLockRequests) @@ -67,4 +73,4 @@ public void MessageIsLocked() ((int)lockRequest.howLong.TotalSeconds).ShouldBe(_maximumTimeout); } } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs index f28137d11..21b086f7e 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningStartsAndStops.cs @@ -1,14 +1,17 @@ +using System.Text.Json; using Amazon.SQS.Model; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; using JustSaying.Messaging.MessageProcessingStrategies; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; using Microsoft.Extensions.Logging; namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenListeningStartsAndStops(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) { - private const string AttributeMessageContentsRunning = @"Message Contents Running"; - private const string AttributeMessageContentsAfterStop = @"Message Contents After Stop"; - private int _expectedMaxMessageCount; private bool _running; private FakeSqsQueue _queue; @@ -20,8 +23,8 @@ protected override void Given() Logger.LogInformation("Expected max message count is {MaxMessageCount}", _expectedMaxMessageCount); - var response1 = new Message { Body = AttributeMessageContentsRunning }; - var response2 = new Message { Body = AttributeMessageContentsAfterStop } ; + var response1 = new Message { Body = $$"""{ "Subject": "SimpleMessage", "Message": "{{JsonEncodedText.Encode(JsonSerializer.Serialize(new SimpleMessage { Content = "Message Contents Running" }))}}" }""" }; + var response2 = new Message { Body = $$"""{ "Subject": "SimpleMessage", "Message": "{{JsonEncodedText.Encode(JsonSerializer.Serialize(new SimpleMessage { Content = "Message Contents After Stop" }))}}" }""" }; IEnumerable GetMessages(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) @@ -31,9 +34,17 @@ IEnumerable GetMessages(CancellationToken cancellationToken) } } - _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), ct => Task.FromResult(GetMessages(ct))); + var sqsQueue = new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct)), Guid.NewGuid().ToString()); + + var sqsSource = new SqsSource + { + SqsQueue = sqsQueue, + MessageConverter = new InboundMessageConverter(new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions), new MessageCompressionRegistry(), false) + }; + + _queue = sqsSource.SqsQueue as FakeSqsQueue; - Queues.Add(_queue); + Queues.Add(sqsSource); } protected override async Task WhenAsync() @@ -60,7 +71,7 @@ public void TheMaxMessageAllowanceIsGrabbed() [Fact] public void MessageIsProcessed() { - SerializationRegister.ReceivedDeserializationRequests.ShouldContain(AttributeMessageContentsRunning); - SerializationRegister.ReceivedDeserializationRequests.ShouldNotContain(AttributeMessageContentsAfterStop); + Handler.ReceivedMessages.ShouldContain(m => m.Content.Equals("Message Contents Running")); + Handler.ReceivedMessages.ShouldNotContain(m => m.Content.Equals("Message Contents After Stop")); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs index daf449cc4..9bd570de7 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenListeningWithMultipleGroups.cs @@ -1,13 +1,53 @@ -using JustSaying.AwsTools.MessageHandling; +using System.Text.Json; +using Amazon.SQS.Model; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; +using JustSaying.TestingFramework; using Newtonsoft.Json; +using JsonSerializer = System.Text.Json.JsonSerializer; namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; -public class WhenListeningWithMultipleGroups(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) +public class WhenListeningWithMultipleGroups : BaseSubscriptionGroupTests { - private readonly ISqsQueue _queueB = CreateSuccessfulTestQueue("C7506B3F-81DA-4898-82A5-C0293523592A", new TestMessage()); - private readonly ISqsQueue _queueA = CreateSuccessfulTestQueue("EC159934-A30E-45B0-9186-78853F7D3BED", new TestMessage()); + private readonly SqsSource _queueA; + private readonly SqsSource _queueB; + + public WhenListeningWithMultipleGroups(ITestOutputHelper testOutputHelper) : base(testOutputHelper) + { + var queueA = new FakeSqsQueue(ct => + Task.FromResult(new List + { + new TestMessage + { + Body = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode(JsonSerializer.Serialize(new SimpleMessage { Content = "Hi" }))}}" }""" + } + }.AsEnumerable()), + "EC159934-A30E-45B0-9186-78853F7D3BED"); + var queueB = new FakeSqsQueue(ct => + Task.FromResult(new List + { + new TestMessage + { + Body = $$"""{"Subject":"SimpleMessage", "Message": "{{JsonEncodedText.Encode(JsonSerializer.Serialize(new SimpleMessage { Content = "Hi again" }))}}" }""" + } + }.AsEnumerable()), + "C7506B3F-81DA-4898-82A5-C0293523592A"); + + var messageConverter = new InboundMessageConverter(new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions), new MessageCompressionRegistry(), false); + _queueA = new SqsSource + { + SqsQueue = queueA, + MessageConverter = messageConverter + }; + _queueB = new SqsSource + { + SqsQueue = queueB, + MessageConverter = messageConverter + }; + } protected override Dictionary SetupBusConfig() { @@ -40,4 +80,4 @@ public void SubscriptionGroups_OverridesDefaultSettingsCorrectly() json.ShouldMatchApproved(c => c.SubFolder("Approvals")); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingFails.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingFails.cs index b0453430c..d5e3bca7f 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingFails.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingFails.cs @@ -1,3 +1,6 @@ +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.TestingFramework; + namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; public class WhenMessageHandlingFails(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) @@ -6,9 +9,10 @@ public class WhenMessageHandlingFails(ITestOutputHelper testOutputHelper) : Base protected override void Given() { - _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage()); + var sqsSource = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage()); + _queue = sqsSource.SqsQueue as FakeSqsQueue; - Queues.Add(_queue); + Queues.Add(sqsSource); Handler.ShouldSucceed = false; } @@ -29,4 +33,4 @@ public void ExceptionIsNotLoggedToMonitor() { Monitor.HandledExceptions.ShouldBeEmpty(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs index b7b466c35..6fe1d90da 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingSucceeds.cs @@ -1,37 +1,48 @@ +using System.Diagnostics.CodeAnalysis; using Amazon.SQS.Model; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.TestingFramework; namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; -public class WhenMessageHandlingSucceeds(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) +public class WhenMessageHandlingSucceeds : BaseSubscriptionGroupTests { - private const string MessageBody = "Expected Message Body"; + [StringSyntax(StringSyntaxAttribute.Json)] + private const string MessageBody = """ + { + "Subject": "TestMessage", + "Message": "Expected Message Body" + } + """; private FakeSqsQueue _queue; - protected override void Given() + public WhenMessageHandlingSucceeds(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { - _queue = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), - ct => Task.FromResult(new List { new TestMessage { Body = MessageBody } }.AsEnumerable())); - - Queues.Add(_queue); + MessagesToWaitFor = 10; } - [Fact] - public void MessagesGetDeserializedByCorrectHandler() + protected override void Given() { - SerializationRegister.ReceivedDeserializationRequests.ShouldAllBe( - msg => msg == MessageBody); + var sqsSource = CreateSuccessfulTestQueue(Guid.NewGuid().ToString(), new TestMessage { Body = MessageBody }); + _queue = sqsSource.SqsQueue as FakeSqsQueue; + _queue!.MaxNumberOfMessagesToReceive = MessagesToWaitFor; + + Queues.Add(sqsSource); } [Fact] public void ProcessingIsPassedToTheHandlerForCorrectMessage() { - Handler.ReceivedMessages.ShouldContain(SerializationRegister.DefaultDeserializedMessage()); + Handler.ReceivedMessages.ShouldContain(SetupMessage); } [Fact] - public void AllMessagesAreClearedFromQueue() + public async Task AllMessagesAreClearedFromQueue() { - _queue.DeleteMessageRequests.Count.ShouldBe(Handler.ReceivedMessages.Count); + await _queue.ReceivedAllMessages.WaitAsync(TimeSpan.FromSeconds(5)); + await CompletionMiddleware.Complete.WaitAsync(TimeSpan.FromSeconds(5)); + + await Patiently.AssertThatAsync(OutputHelper, () => _queue.DeleteMessageRequests.Count.ShouldBe(Handler.ReceivedMessages.Count)); } [Fact] diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingThrows.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingThrows.cs index 16654bf4a..707967c2e 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingThrows.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenMessageHandlingThrows.cs @@ -2,26 +2,46 @@ namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; -public class WhenMessageHandlingThrows(ITestOutputHelper testOutputHelper) : BaseSubscriptionGroupTests(testOutputHelper) +public class WhenMessageHandlingThrows : BaseSubscriptionGroupTests { private bool _firstTime = true; + private readonly object _firstTimeLock = new(); private FakeSqsQueue _queue; + public WhenMessageHandlingThrows(ITestOutputHelper testOutputHelper) : base(testOutputHelper) + { + MessagesToWaitFor = 10; + } + protected override void Given() { - _queue = CreateSuccessfulTestQueue("TestQueue", new TestMessage()); + var sqsSource = CreateSuccessfulTestQueue("TestQueue", new TestMessage()); + _queue = (FakeSqsQueue)sqsSource.SqsQueue; + _queue.MaxNumberOfMessagesToReceive = MessagesToWaitFor; - Queues.Add(_queue); + Queues.Add(sqsSource); Handler.OnHandle = (msg) => { if (!_firstTime) return; - _firstTime = false; - throw new TestException("Thrown by test handler"); + lock (_firstTimeLock) + { + if (!_firstTime) return; + + _firstTime = false; + throw new TestException("Thrown by test handler"); + } }; } + protected override async Task UntilAsync() + { + await _queue.ReceivedAllMessages.WaitAsync(TimeSpan.FromSeconds(5)); + await CompletionMiddleware.Complete.WaitAsync(TimeSpan.FromSeconds(5)); + return await base.UntilAsync(); + } + [Fact] public void MessageHandlerWasCalled() { @@ -29,11 +49,18 @@ public void MessageHandlerWasCalled() } [Fact] - public void FailedMessageIsNotRemovedFromQueue() + public async Task FailedMessageIsNotRemovedFromQueue() { - var numberHandled = Handler.ReceivedMessages.Count; + await Patiently.AssertThatAsync(() => + { + OutputHelper.WriteLine($"HandledErrors: {Monitor.HandledErrors.Count}"); + OutputHelper.WriteLine($"ReceivedMessages: {Handler.ReceivedMessages.Count}"); + OutputHelper.WriteLine($"DeleteMessageRequests: {_queue.DeleteMessageRequests.Count}"); - _queue.DeleteMessageRequests.Count.ShouldBe(numberHandled - 1); + Monitor.HandledErrors.Count.ShouldBe(1); + Handler.ReceivedMessages.Count.ShouldBe(10); + _queue.DeleteMessageRequests.Count.ShouldBe(9); + }); } [Fact] @@ -41,4 +68,4 @@ public void ExceptionIsLoggedToMonitor() { Monitor.HandledExceptions.ShouldNotBeEmpty(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs index d17b64fca..7c3fedd86 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInMessageProcessing.cs @@ -1,5 +1,9 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; namespace JustSaying.UnitTests.Messaging.Channels.SubscriptionGroupTests; @@ -22,23 +26,30 @@ IEnumerable GetMessages(CancellationToken cancellationToken) } } - _queue = CreateSuccessfulTestQueue("TestQueue", ct => Task.FromResult(GetMessages(ct))); - - Queues.Add(_queue); + _queue = new FakeSqsQueue(ct => Task.FromResult(GetMessages(ct))); + var sqsSource = new SqsSource + { + SqsQueue = _queue, + MessageConverter = new InboundMessageConverter(new ThrowingMessageBodySerializer(), new MessageCompressionRegistry(), false) + }; - SerializationRegister.DefaultDeserializedMessage = () => - throw new TestException("Test from WhenThereAreExceptionsInMessageProcessing"); + Queues.Add(sqsSource); } - protected override bool Until() + protected override Task UntilAsync() { - return _callCount > 1; + return Task.FromResult(_callCount > 1); } [Fact] - public async Task TheListenerDoesNotDie() + public void TheListenerDoesNotDie() + { + _callCount.ShouldBeGreaterThan(1); + } + + private sealed class ThrowingMessageBodySerializer : IMessageBodySerializer { - await Patiently.AssertThatAsync(OutputHelper, - () => _callCount.ShouldBeGreaterThan(1)); + public string Serialize(Models.Message message) => throw new TestException("Test from WhenThereAreExceptionsInMessageProcessing"); + public Models.Message Deserialize(string message) => throw new TestException("Test from WhenThereAreExceptionsInMessageProcessing"); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs index 22c59d168..f13663790 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenThereAreExceptionsInSqsCalling.cs @@ -11,11 +11,11 @@ public class WhenThereAreExceptionsInSqsCalling(ITestOutputHelper testOutputHelp protected override void Given() { - _queue = CreateSuccessfulTestQueue("TestQueue", ExceptionOnFirstCall()); - Queues.Add(_queue); + var sqsSource = CreateSuccessfulTestQueue("TestQueue", ExceptionOnFirstCall()); + _queue = sqsSource.SqsQueue as FakeSqsQueue; + Queues.Add(sqsSource); - SerializationRegister.DefaultDeserializedMessage = - () => throw new TestException("Test from WhenThereAreExceptionsInMessageProcessing"); + // setup deserializer failure } private IEnumerable ExceptionOnFirstCall() @@ -29,9 +29,9 @@ private IEnumerable ExceptionOnFirstCall() yield break; } - protected override bool Until() + protected override Task UntilAsync() { - return _callCount > 1; + return Task.FromResult(_callCount > 1); } [Fact] @@ -39,4 +39,4 @@ public void QueueIsPolledMoreThanOnce() { _callCount.ShouldBeGreaterThan(1); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs index 093955b68..6dbc478b7 100644 --- a/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs +++ b/tests/JustSaying.UnitTests/Messaging/Channels/SubscriptionGroupTests/WhenUsingSqsQueueByName.cs @@ -1,7 +1,12 @@ using Amazon; using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; +using JustSaying.Messaging; +using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.TestingFramework; +using JustSaying.UnitTests.Messaging.Channels.TestHelpers; #pragma warning disable 618 @@ -14,6 +19,12 @@ public sealed class WhenUsingSqsQueueByName(ITestOutputHelper testOutputHelper) readonly string MessageTypeString = nameof(SimpleMessage); const string MessageBody = "object"; + private readonly SimpleMessage _message = new() + { + RaisingComponent = "Component", + Id = Guid.NewGuid() + }; + protected override void Given() { int retryCount = 1; @@ -33,13 +44,17 @@ protected override void Given() _queue = queue; - Queues.Add(_queue); + Queues.Add(new SqsSource + { + SqsQueue = queue, + MessageConverter = new InboundMessageConverter(new FakeBodyDeserializer(_message), new MessageCompressionRegistry(), false) + }); } [Fact] public void HandlerReceivesMessage() { - Handler.ReceivedMessages.Contains(SerializationRegister.DefaultDeserializedMessage()) + Handler.ReceivedMessages.Contains(_message) .ShouldBeTrue(); } @@ -49,26 +64,25 @@ private static ReceiveMessageResponse GenerateResponseMessages( { return new ReceiveMessageResponse { - Messages = new List - { - new() + Messages = + [ + new Message { MessageId = messageId.ToString(), Body = SqsMessageBody(messageType) }, - new() + new Message { MessageId = messageId.ToString(), - Body = "{\"Subject\":\"SOME_UNKNOWN_MESSAGE\"," + - "\"Message\":\"SOME_RANDOM_MESSAGE\"}" + Body = """{"Subject":"SOME_UNKNOWN_MESSAGE","Message":"SOME_RANDOM_MESSAGE"}""" } - } + ] }; } private static string SqsMessageBody(string messageType) { - return "{\"Subject\":\"" + messageType + "\"," + "\"Message\":\"" + MessageBody + "\"}"; + return $$"""{"Subject":"{{messageType}}","Message":"{{MessageBody}}"}"""; } public void Dispose() diff --git a/tests/JustSaying.UnitTests/Messaging/Compression/GzipMessageBodyCompressionTests.cs b/tests/JustSaying.UnitTests/Messaging/Compression/GzipMessageBodyCompressionTests.cs new file mode 100644 index 000000000..14cdb18d0 --- /dev/null +++ b/tests/JustSaying.UnitTests/Messaging/Compression/GzipMessageBodyCompressionTests.cs @@ -0,0 +1,74 @@ +using JustSaying.Messaging.Compression; + +namespace JustSaying.UnitTests.Messaging.Compression +{ + public class GzipMessageBodyCompressionTests + { + private readonly GzipMessageBodyCompression _compression = new(); + + [Fact] + public void ContentEncoding_ShouldReturnGzipBase64() + { + Assert.Equal(ContentEncodings.GzipBase64, _compression.ContentEncoding); + } + + [Theory] + [InlineData("")] + [InlineData("Hello, World!")] + [InlineData("This is a longer string with some special characters: !@#$%^&*()_+")] + public void Compress_ThenDecompress_ShouldReturnOriginalString(string original) + { + // Arrange + + // Act + string compressed = _compression.Compress(original); + string decompressed = _compression.Decompress(compressed); + + // Assert + Assert.Equal(original, decompressed); + } + + [Fact] + public void Compress_ShouldReturnBase64EncodedString() + { + // Arrange + string input = "Test string"; + + // Act + string compressed = _compression.Compress(input); + + // Assert + Assert.True(IsBase64String(compressed)); + } + + [Fact] + public void Decompress_WithInvalidBase64_ShouldThrowFormatException() + { + // Arrange + string invalidBase64 = "This is not a valid Base64 string"; + + // Act & Assert + Assert.Throws(() => _compression.Decompress(invalidBase64)); + } + + [Fact] + public void Compress_WithLargeString_ShouldCompressSuccessfully() + { + // Arrange + string largeString = new string('A', 1_000_000); + + // Act + string compressed = _compression.Compress(largeString); + string decompressed = _compression.Decompress(compressed); + + // Assert + Assert.Equal(largeString, decompressed); + } + + private bool IsBase64String(string base64) + { + Span buffer = new Span(new byte[base64.Length]); + return Convert.TryFromBase64String(base64, buffer, out int _); + } + } +} diff --git a/tests/JustSaying.UnitTests/Messaging/MessageHandling/WhenEnsuringMessageIsOnlyHandledExactlyOnce.cs b/tests/JustSaying.UnitTests/Messaging/MessageHandling/WhenEnsuringMessageIsOnlyHandledExactlyOnce.cs index d70b6a764..558fe4c58 100644 --- a/tests/JustSaying.UnitTests/Messaging/MessageHandling/WhenEnsuringMessageIsOnlyHandledExactlyOnce.cs +++ b/tests/JustSaying.UnitTests/Messaging/MessageHandling/WhenEnsuringMessageIsOnlyHandledExactlyOnce.cs @@ -21,7 +21,7 @@ public async Task WhenMessageIsLockedByAnotherHandler_MessageWillBeLeftInTheQueu l.AddXUnit(outputHelper)) .AddSingleton(messageLock)); - var monitor = new TrackingLoggingMonitor(LoggerFactory.Create(lf => lf.AddXUnit()).CreateLogger()); + var monitor = new TrackingLoggingMonitor(LoggerFactory.Create(lf => lf.AddXUnit().SetMinimumLevel(LogLevel.Information)).CreateLogger()); var handler = new InspectableHandler(); var middleware = new HandlerMiddlewareBuilder(testResolver, testResolver) diff --git a/tests/JustSaying.UnitTests/Messaging/Middleware/StopwatchMiddlewareTests.cs b/tests/JustSaying.UnitTests/Messaging/Middleware/StopwatchMiddlewareTests.cs index 23df9fbab..b823d625c 100644 --- a/tests/JustSaying.UnitTests/Messaging/Middleware/StopwatchMiddlewareTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Middleware/StopwatchMiddlewareTests.cs @@ -16,7 +16,7 @@ public class StopwatchMiddlewareTests public StopwatchMiddlewareTests(ITestOutputHelper outputHelper) { - var loggerFactory = LoggerFactory.Create(lf => lf.AddXUnit(outputHelper)); + var loggerFactory = LoggerFactory.Create(lf => lf.AddXUnit(outputHelper).SetMinimumLevel(LogLevel.Information)); _handler = new InspectableHandler(); _monitor = new TrackingLoggingMonitor(loggerFactory.CreateLogger()); @@ -55,4 +55,4 @@ public async Task WhenMiddlewareIsWrappedinStopWatch_MonitoringIsCalled() handled.handlerType.ShouldBe(typeof(InspectableHandler)); handled.messageType.ShouldBe(typeof(OrderAccepted)); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs b/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs index ef933f15b..416892f2a 100644 --- a/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs +++ b/tests/JustSaying.UnitTests/Messaging/Policies/ChannelPolicyTests.cs @@ -1,8 +1,11 @@ using Amazon.SQS.Model; using JustSaying.AwsTools.MessageHandling; using JustSaying.AwsTools.MessageHandling.Dispatch; +using JustSaying.Messaging; using JustSaying.Messaging.Channels.Receive; using JustSaying.Messaging.Channels.SubscriptionGroups; +using JustSaying.Messaging.Compression; +using JustSaying.Messaging.MessageSerialization; using JustSaying.Messaging.Middleware.Receive; using JustSaying.Messaging.Monitoring; using JustSaying.TestingFramework; @@ -36,8 +39,6 @@ public async Task ErrorHandlingAroundSqs_WithCustomPolicy_CanSwallowExceptions() int dispatchedMessageCount = 0; var sqsQueue = TestQueue(() => Interlocked.Increment(ref queueCalledCount)); - var queues = new List { sqsQueue }; - var config = new SubscriptionGroupSettingsBuilder() .WithDefaultConcurrencyLimit(8); config.WithCustomMiddleware( @@ -45,7 +46,13 @@ public async Task ErrorHandlingAroundSqs_WithCustomPolicy_CanSwallowExceptions() var settings = new Dictionary { - { "test", new SubscriptionGroupConfigBuilder("test").AddQueues(queues) }, + { + "test", new SubscriptionGroupConfigBuilder("test").AddQueue(new SqsSource + { + SqsQueue = sqsQueue, + MessageConverter = new InboundMessageConverter(SimpleMessage.Serializer, new MessageCompressionRegistry(), false) + }) + } }; IMessageDispatcher dispatcher = new FakeDispatcher(() => Interlocked.Increment(ref dispatchedMessageCount)); diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs index aee4bebfe..976dd227e 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/DealingWithPotentiallyMissingConversation.cs @@ -3,23 +3,23 @@ namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; -public class DealingWithPotentiallyMissingConversation : XBehaviourTest +public class DealingWithPotentiallyMissingConversation : XBehaviourTest> { private MessageWithEnum _messageOut; private MessageWithEnum _messageIn; private string _jsonMessage; protected override void Given() { - _messageOut = new MessageWithEnum() { EnumVal = Value.Two }; + _messageOut = new MessageWithEnum { EnumVal = Value.Two }; } protected override void WhenAction() { - _jsonMessage = SystemUnderTest.Serialize(_messageOut, false, _messageOut.GetType().Name); + _jsonMessage = SystemUnderTest.Serialize(_messageOut); //add extra property to see what happens: - _jsonMessage = _jsonMessage.Replace("{__", "{\"New\":\"Property\",__", StringComparison.OrdinalIgnoreCase); - _messageIn = SystemUnderTest.Deserialize(_jsonMessage, typeof(MessageWithEnum)) as MessageWithEnum; + _jsonMessage = _jsonMessage.Replace("{__", """{"New":"Property",__""", StringComparison.OrdinalIgnoreCase); + _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } [Fact] @@ -33,4 +33,4 @@ public void DeserializedMessageHasEmptyConversation_ThisIsForBackwardsCompatibil { _messageIn.Conversation.ShouldBeNull(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs deleted file mode 100644 index 508ef31be..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenAskingForANewSerializer.cs +++ /dev/null @@ -1,25 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; -using JustSaying.TestingFramework; - -namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; - -public class WhenAskingForANewSerializer : XBehaviourTest -{ - private IMessageSerializer _result; - - protected override void Given() - { - - } - - protected override void WhenAction() - { - _result = SystemUnderTest.GetSerializer(); - } - - [Fact] - public void OneIsProvided() - { - _result.ShouldNotBeNull(); - } -} \ No newline at end of file diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenDeserializingMessage.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenDeserializingMessage.cs deleted file mode 100644 index c1a7b0339..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenDeserializingMessage.cs +++ /dev/null @@ -1,123 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; - -namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; - -public class WhenDeserializingMessage : XBehaviourTest -{ - protected override MessageSerializationRegister CreateSystemUnderTest() => - new( - new NonGenericMessageSubjectProvider(), - new NewtonsoftSerializationFactory()); - - protected override void Given() - { - RecordAnyExceptionsThrown(); - } - - protected override void WhenAction() - { - SystemUnderTest.AddSerializer(); - } - - [Fact] - public void DeserializesMessage() - { - // Arrange - var body = - """ - { - "Subject": "CustomMessage", - "Message":"{\"Custom\":\"Text\"}" - } - """; - - // Act - var actual = SystemUnderTest.DeserializeMessage(body); - - // Assert - actual.ShouldNotBeNull(); - actual.Message.ShouldNotBeNull(); - actual.MessageAttributes.ShouldNotBeNull(); - - var message = actual.Message.ShouldBeOfType(); - - message.Custom.ShouldBe("Text"); - } - - [Fact] - public void DeserializesMessageWithMessageAttributes() - { - // Arrange - var body = - """ - { - "Subject": "CustomMessage", - "Message":"{\"Custom\":\"Text\"}", - "MessageAttributes": { - "Text": { - "Type": "String", - "Value": "foo" - }, - "Integer": { - "Type": "Number", - "Value": "42" - }, - "BinaryData": { - "Type": "Binary", - "Value": "SnVzdCBFYXQgVGFrZWF3YXkuY29t" - }, - "CustomBinaryData": { - "Type": "Binary.jet", - "Value": "SnVzdFNheWluZw==" - } - } - } - """; - - // Act - var actual = SystemUnderTest.DeserializeMessage(body); - - // Assert - actual.ShouldNotBeNull(); - actual.Message.ShouldNotBeNull(); - - var message = actual.Message.ShouldBeOfType(); - message.Custom.ShouldBe("Text"); - - actual.MessageAttributes.ShouldNotBeNull(); - - var attribute = actual.MessageAttributes.Get("Text"); - - attribute.ShouldNotBeNull(); - attribute.DataType.ShouldBe("String"); - attribute.StringValue.ShouldBe("foo"); - attribute.BinaryValue.ShouldBeNull(); - - attribute = actual.MessageAttributes.Get("Integer"); - - attribute.ShouldNotBeNull(); - attribute.DataType.ShouldBe("Number"); - attribute.StringValue.ShouldBe("42"); - attribute.BinaryValue.ShouldBeNull(); - - attribute = actual.MessageAttributes.Get("BinaryData"); - - attribute.ShouldNotBeNull(); - attribute.DataType.ShouldBe("Binary"); - attribute.StringValue.ShouldBeNull(); - attribute.BinaryValue.ShouldBe([.. "Just Eat Takeaway.com"u8]); - - attribute = actual.MessageAttributes.Get("CustomBinaryData"); - - attribute.ShouldNotBeNull(); - attribute.DataType.ShouldBe("Binary.jet"); - attribute.StringValue.ShouldBeNull(); - attribute.BinaryValue.ShouldBe([.. "JustSaying"u8]); - } - - private sealed class CustomMessage : Message - { - public string Custom { get; set; } - } -} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenSerializingAndDeserializing.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenSerializingAndDeserializing.cs index 519e72884..631c91739 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenSerializingAndDeserializing.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenSerializingAndDeserializing.cs @@ -3,20 +3,20 @@ namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; -public class WhenSerializingAndDeserializing : XBehaviourTest +public class WhenSerializingAndDeserializing : XBehaviourTest> { private MessageWithEnum _messageOut; private MessageWithEnum _messageIn; private string _jsonMessage; protected override void Given() { - _messageOut = new MessageWithEnum() { EnumVal = Value.Two }; + _messageOut = new MessageWithEnum { EnumVal = Value.Two }; } protected override void WhenAction() { - _jsonMessage = SystemUnderTest.Serialize(_messageOut, false, _messageOut.GetType().Name); - _messageIn = SystemUnderTest.Deserialize(_jsonMessage, typeof(MessageWithEnum)) as MessageWithEnum; + _jsonMessage = SystemUnderTest.Serialize(_messageOut); + _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } [Fact] @@ -39,4 +39,4 @@ public void EnumsAreRepresentedAsStrings() _jsonMessage.ShouldContain("EnumVal"); _jsonMessage.ShouldContain("Two"); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenUsingCustomSettings.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenUsingCustomSettings.cs index 5ceea37a0..d767ea914 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenUsingCustomSettings.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/Newtonsoft/WhenUsingCustomSettings.cs @@ -4,14 +4,14 @@ namespace JustSaying.UnitTests.Messaging.Serialization.Newtonsoft; -public class WhenUsingCustomSettings : XBehaviourTest +public class WhenUsingCustomSettings : XBehaviourTest> { private MessageWithEnum _messageOut; private string _jsonMessage; - protected override NewtonsoftSerializer CreateSystemUnderTest() + protected override NewtonsoftMessageBodySerializer CreateSystemUnderTest() { - return new NewtonsoftSerializer(new JsonSerializerSettings()); + return new NewtonsoftMessageBodySerializer(new JsonSerializerSettings()); } protected override void Given() @@ -21,7 +21,7 @@ protected override void Given() public string GetMessageInContext(MessageWithEnum message) { - var context = new { Subject = message.GetType().Name, Message = SystemUnderTest.Serialize(message, false, message.GetType().Name) }; + var context = new { Subject = message.GetType().Name, Message = SystemUnderTest.Serialize(message) }; return JsonConvert.SerializeObject(context); } @@ -42,4 +42,4 @@ public void EnumsAreNotRepresentedAsStrings() _jsonMessage.ShouldContain("EnumVal"); _jsonMessage.ShouldNotContain("Two"); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/CustomMessage.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/CustomMessage.cs deleted file mode 100644 index a135206bb..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/CustomMessage.cs +++ /dev/null @@ -1,7 +0,0 @@ -using JustSaying.Models; - -namespace JustSaying.UnitTests.Messaging.Serialization.SerializationRegister; - -public class CustomMessage : Message -{ -} \ No newline at end of file diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenAddingASerializerTwice.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenAddingASerializerTwice.cs deleted file mode 100644 index 71266c68b..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenAddingASerializerTwice.cs +++ /dev/null @@ -1,29 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; - -namespace JustSaying.UnitTests.Messaging.Serialization.SerializationRegister; - -public class WhenAddingASerializerTwice : XBehaviourTest -{ - protected override MessageSerializationRegister CreateSystemUnderTest() => - new( - new NonGenericMessageSubjectProvider(), - new NewtonsoftSerializationFactory()); - - protected override void Given() - { - RecordAnyExceptionsThrown(); - } - - protected override void WhenAction() - { - SystemUnderTest.AddSerializer(); - SystemUnderTest.AddSerializer(); - } - - [Fact] - public void ExceptionIsNotThrown() - { - ThrownException.ShouldBeNull(); - } -} \ No newline at end of file diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenDeserializingMessage.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenDeserializingMessage.cs deleted file mode 100644 index 9a46693a6..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SerializationRegister/WhenDeserializingMessage.cs +++ /dev/null @@ -1,28 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; - -namespace JustSaying.UnitTests.Messaging.Serialization.SerializationRegister; - -public class WhenDeserializingMessage : XBehaviourTest -{ - protected override MessageSerializationRegister CreateSystemUnderTest() => - new( - new NonGenericMessageSubjectProvider(), - new NewtonsoftSerializationFactory()); - - private string messageBody = "{'Subject':'nonexistent'}"; - protected override void Given() - { - RecordAnyExceptionsThrown(); - } - - protected override void WhenAction() - { - SystemUnderTest.AddSerializer(); - } - - [Fact] - public void ThrowsMessageFormatNotSupportedWhenMessabeBodyIsUnserializable() - { - Assert.Throws(() => SystemUnderTest.DeserializeMessage(messageBody)); - } -} \ No newline at end of file diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs index 596dda031..9088836af 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/DealingWithPotentiallyMissingConversation.cs @@ -3,24 +3,29 @@ namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; -public class DealingWithPotentiallyMissingConversation : XBehaviourTest +public class DealingWithPotentiallyMissingConversation : XBehaviourTest> { private MessageWithEnum _messageOut; private MessageWithEnum _messageIn; private string _jsonMessage; + protected override SystemTextJsonMessageBodySerializer CreateSystemUnderTest() + { + return new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions); + } + protected override void Given() { - _messageOut = new MessageWithEnum() { EnumVal = Value.Two }; + _messageOut = new MessageWithEnum { EnumVal = Value.Two }; } protected override void WhenAction() { - _jsonMessage = SystemUnderTest.Serialize(_messageOut, false, _messageOut.GetType().Name); + _jsonMessage = SystemUnderTest.Serialize(_messageOut); // Add extra property to see what happens: - _jsonMessage = _jsonMessage.Replace("{__", "{\"New\":\"Property\",__", StringComparison.OrdinalIgnoreCase); - _messageIn = SystemUnderTest.Deserialize(_jsonMessage, typeof(MessageWithEnum)) as MessageWithEnum; + _jsonMessage = _jsonMessage.Replace("{__", """{"New":"Property",__""", StringComparison.OrdinalIgnoreCase); + _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } [Fact] @@ -34,4 +39,4 @@ public void DeserializedMessageHasEmptyConversation_ThisIsForBackwardsCompatibil { _messageIn.Conversation.ShouldBeNull(); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs deleted file mode 100644 index 0acc316cf..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenAskingForANewSerializer.cs +++ /dev/null @@ -1,24 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; -using JustSaying.TestingFramework; - -namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; - -public class WhenAskingForANewSerializer : XBehaviourTest -{ - private IMessageSerializer _result; - - protected override void Given() - { - } - - protected override void WhenAction() - { - _result = SystemUnderTest.GetSerializer(); - } - - [Fact] - public void OneIsProvided() - { - _result.ShouldNotBeNull(); - } -} \ No newline at end of file diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenDeserializingMessage.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenDeserializingMessage.cs deleted file mode 100644 index b7258a55c..000000000 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenDeserializingMessage.cs +++ /dev/null @@ -1,123 +0,0 @@ -using JustSaying.Messaging.MessageSerialization; -using JustSaying.Models; - -namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; - -public class WhenDeserializingMessage : XBehaviourTest -{ - protected override MessageSerializationRegister CreateSystemUnderTest() => - new( - new NonGenericMessageSubjectProvider(), - new SystemTextJsonSerializationFactory()); - - protected override void Given() - { - RecordAnyExceptionsThrown(); - } - - protected override void WhenAction() - { - SystemUnderTest.AddSerializer(); - } - - [Fact] - public void DeserializesMessage() - { - // Arrange - var body = - """ - { - "Subject": "CustomMessage", - "Message":"{\"Custom\":\"Text\"}" - } - """; - - // Act - var actual = SystemUnderTest.DeserializeMessage(body); - - // Assert - actual.ShouldNotBeNull(); - actual.Message.ShouldNotBeNull(); - actual.MessageAttributes.ShouldNotBeNull(); - - var message = actual.Message.ShouldBeOfType(); - - message.Custom.ShouldBe("Text"); - } - - [Fact] - public void DeserializesMessageWithMessageAttributes() - { - // Arrange - var body = - """ - { - "Subject": "CustomMessage", - "Message":"{\"Custom\":\"Text\"}", - "MessageAttributes": { - "Text": { - "Type": "String", - "Value": "foo" - }, - "Integer": { - "Type": "Number", - "Value": "42" - }, - "BinaryData": { - "Type": "Binary", - "Value": "SnVzdCBFYXQgVGFrZWF3YXkuY29t" - }, - "CustomBinaryData": { - "Type": "Binary.jet", - "Value": "SnVzdFNheWluZw==" - } - } - } - """; - - // Act - var actual = SystemUnderTest.DeserializeMessage(body); - - // Assert - actual.ShouldNotBeNull(); - actual.Message.ShouldNotBeNull(); - - var message = actual.Message.ShouldBeOfType(); - message.Custom.ShouldBe("Text"); - - actual.MessageAttributes.ShouldNotBeNull(); - - var attribute = actual.MessageAttributes.Get("Text"); - - attribute.ShouldNotBeNull(); - attribute.DataType.ShouldBe("String"); - attribute.StringValue.ShouldBe("foo"); - attribute.BinaryValue.ShouldBeNull(); - - attribute = actual.MessageAttributes.Get("Integer"); - - attribute.ShouldNotBeNull(); - attribute.DataType.ShouldBe("Number"); - attribute.StringValue.ShouldBe("42"); - attribute.BinaryValue.ShouldBeNull(); - - attribute = actual.MessageAttributes.Get("BinaryData"); - - attribute.ShouldNotBeNull(); - attribute.DataType.ShouldBe("Binary"); - attribute.StringValue.ShouldBeNull(); - attribute.BinaryValue.ShouldBe([.. "Just Eat Takeaway.com"u8]); - - attribute = actual.MessageAttributes.Get("CustomBinaryData"); - - attribute.ShouldNotBeNull(); - attribute.DataType.ShouldBe("Binary.jet"); - attribute.StringValue.ShouldBeNull(); - attribute.BinaryValue.ShouldBe([.. "JustSaying"u8]); - } - - private sealed class CustomMessage : Message - { - public string Custom { get; set; } - } -} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs index ed36f2232..62f2903e4 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenSerializingAndDeserializing.cs @@ -3,21 +3,26 @@ namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; -public class WhenSerializingAndDeserializing : XBehaviourTest +public class WhenSerializingAndDeserializing : XBehaviourTest> { private MessageWithEnum _messageOut; private MessageWithEnum _messageIn; private string _jsonMessage; + protected override SystemTextJsonMessageBodySerializer CreateSystemUnderTest() + { + return new SystemTextJsonMessageBodySerializer(SystemTextJsonMessageBodySerializer.DefaultJsonSerializerOptions); + } + protected override void Given() { - _messageOut = new MessageWithEnum() { EnumVal = Value.Two }; + _messageOut = new MessageWithEnum { EnumVal = Value.Two }; } protected override void WhenAction() { - _jsonMessage = SystemUnderTest.Serialize(_messageOut, false, _messageOut.GetType().Name); - _messageIn = SystemUnderTest.Deserialize(_jsonMessage, typeof(MessageWithEnum)) as MessageWithEnum; + _jsonMessage = SystemUnderTest.Serialize(_messageOut); + _messageIn = SystemUnderTest.Deserialize(_jsonMessage) as MessageWithEnum; } [Fact] @@ -40,4 +45,4 @@ public void EnumsAreRepresentedAsStrings() _jsonMessage.ShouldContain("EnumVal"); _jsonMessage.ShouldContain("Two"); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenUsingCustomSettings.cs b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenUsingCustomSettings.cs index 7523c64e1..fbb017f7b 100644 --- a/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenUsingCustomSettings.cs +++ b/tests/JustSaying.UnitTests/Messaging/Serialization/SystemTextJson/WhenUsingCustomSettings.cs @@ -5,14 +5,14 @@ namespace JustSaying.UnitTests.Messaging.Serialization.SystemTextJson; -public class WhenUsingCustomSettings : XBehaviourTest +public class WhenUsingCustomSettings : XBehaviourTest> { private MessageWithEnum _messageOut; private string _jsonMessage; - protected override SystemTextJsonSerializer CreateSystemUnderTest() + protected override SystemTextJsonMessageBodySerializer CreateSystemUnderTest() { - return new SystemTextJsonSerializer(new JsonSerializerOptions()); + return new SystemTextJsonMessageBodySerializer(new JsonSerializerOptions()); } protected override void Given() @@ -22,7 +22,7 @@ protected override void Given() public string GetMessageInContext(MessageWithEnum message) { - var context = new { Subject = message.GetType().Name, Message = SystemUnderTest.Serialize(message, false, message.GetType().Name) }; + var context = new { Subject = message.GetType().Name, Message = SystemUnderTest.Serialize(message) }; return JsonConvert.SerializeObject(context); } @@ -43,4 +43,4 @@ public void EnumsAreNotRepresentedAsStrings() _jsonMessage.ShouldContain("EnumVal"); _jsonMessage.ShouldNotContain("Two"); } -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/TestSettings.cs b/tests/JustSaying.UnitTests/TestSettings.cs index e5cc5d402..8e9bac4d6 100644 --- a/tests/JustSaying.UnitTests/TestSettings.cs +++ b/tests/JustSaying.UnitTests/TestSettings.cs @@ -1 +1 @@ -[assembly: CollectionBehavior(DisableTestParallelization = true)] +[assembly: CollectionBehavior(DisableTestParallelization = false)] diff --git a/tests/JustSaying.UnitTests/XBehaviourTest.cs b/tests/JustSaying.UnitTests/XBehaviourTest.cs index 42d8273aa..0b166f6e5 100644 --- a/tests/JustSaying.UnitTests/XBehaviourTest.cs +++ b/tests/JustSaying.UnitTests/XBehaviourTest.cs @@ -43,4 +43,4 @@ protected void RecordAnyExceptionsThrown() } protected abstract void WhenAction(); -} \ No newline at end of file +} diff --git a/tests/JustSaying.UnitTests/xunit.runner.json b/tests/JustSaying.UnitTests/xunit.runner.json index 96581b86d..d4d814f76 100644 --- a/tests/JustSaying.UnitTests/xunit.runner.json +++ b/tests/JustSaying.UnitTests/xunit.runner.json @@ -1,4 +1,5 @@ { "methodDisplay": "classAndMethod", - "methodDisplayOptions": "replaceUnderscoreWithSpace" + "methodDisplayOptions": "replaceUnderscoreWithSpace", + "parallelAlgorithm": "conservative" }