diff --git a/Examples/01-PublishSubscribe/01-PublishSubscribe.csproj b/Examples/01-PublishSubscribe/01-PublishSubscribe.csproj index a2d0d06..2b83fe4 100644 --- a/Examples/01-PublishSubscribe/01-PublishSubscribe.csproj +++ b/Examples/01-PublishSubscribe/01-PublishSubscribe.csproj @@ -7,11 +7,11 @@ - - + + - - + + diff --git a/Examples/01-PublishSubscribe/Program.cs b/Examples/01-PublishSubscribe/Program.cs index a53b65b..295de7b 100644 --- a/Examples/01-PublishSubscribe/Program.cs +++ b/Examples/01-PublishSubscribe/Program.cs @@ -17,6 +17,8 @@ using Tapeti.UnityContainer; using Unity; using Container = SimpleInjector.Container; +// ReSharper disable UnusedMember.Global + namespace _01_PublishSubscribe { public class Program diff --git a/Examples/02-DeclareDurableQueues/02-DeclareDurableQueues.csproj b/Examples/02-DeclareDurableQueues/02-DeclareDurableQueues.csproj index c16ddf6..8a580e7 100644 --- a/Examples/02-DeclareDurableQueues/02-DeclareDurableQueues.csproj +++ b/Examples/02-DeclareDurableQueues/02-DeclareDurableQueues.csproj @@ -7,7 +7,7 @@ - + diff --git a/Examples/03-FlowRequestResponse/03-FlowRequestResponse.csproj b/Examples/03-FlowRequestResponse/03-FlowRequestResponse.csproj index bfa9f7e..504511e 100644 --- a/Examples/03-FlowRequestResponse/03-FlowRequestResponse.csproj +++ b/Examples/03-FlowRequestResponse/03-FlowRequestResponse.csproj @@ -7,7 +7,7 @@ - + diff --git a/Examples/03-FlowRequestResponse/Program.cs b/Examples/03-FlowRequestResponse/Program.cs index edac429..50a361b 100644 --- a/Examples/03-FlowRequestResponse/Program.cs +++ b/Examples/03-FlowRequestResponse/Program.cs @@ -19,7 +19,7 @@ namespace _03_FlowRequestResponse container.Register(); - var helper = new ExampleConsoleApp(dependencyResolver); + var helper = new ExampleConsoleApp(dependencyResolver, 2); helper.Run(MainAsync); } diff --git a/Examples/03-FlowRequestResponse/SimpleFlowController.cs b/Examples/03-FlowRequestResponse/SimpleFlowController.cs index 1726e40..a5f972b 100644 --- a/Examples/03-FlowRequestResponse/SimpleFlowController.cs +++ b/Examples/03-FlowRequestResponse/SimpleFlowController.cs @@ -64,10 +64,31 @@ namespace _03_FlowRequestResponse Console.WriteLine("[SimpleFlowController] Response time: " + DateTime.Now.ToLongTimeString()); Console.WriteLine("[SimpleFlowController] Quote: " + message.Quote); + + // Test for issue #21: Same request/response twice in flow does not continue + return flowProvider.YieldWithRequestSync( + new QuoteRequestMessage + { + Amount = 42 + }, + HandleQuoteResponse2); + + + //exampleState.Done(); + //return flowProvider.End(); + } + + + + [Continuation] + public IYieldPoint HandleQuoteResponse2(QuoteResponseMessage message) + { + Console.WriteLine("[SimpleFlowController] Quote 2: " + message.Quote); exampleState.Done(); return flowProvider.End(); } + } } diff --git a/Examples/04-Transient/04-Transient.csproj b/Examples/04-Transient/04-Transient.csproj index bb077b6..93269e8 100644 --- a/Examples/04-Transient/04-Transient.csproj +++ b/Examples/04-Transient/04-Transient.csproj @@ -7,7 +7,7 @@ - + diff --git a/Examples/05-SpeedTest/05-SpeedTest.csproj b/Examples/05-SpeedTest/05-SpeedTest.csproj index f85333c..7ef9e09 100644 --- a/Examples/05-SpeedTest/05-SpeedTest.csproj +++ b/Examples/05-SpeedTest/05-SpeedTest.csproj @@ -7,7 +7,7 @@ - + diff --git a/Examples/06-StatelessRequestResponse/06-StatelessRequestResponse.csproj b/Examples/06-StatelessRequestResponse/06-StatelessRequestResponse.csproj index 7d6c898..62a3961 100644 --- a/Examples/06-StatelessRequestResponse/06-StatelessRequestResponse.csproj +++ b/Examples/06-StatelessRequestResponse/06-StatelessRequestResponse.csproj @@ -7,7 +7,7 @@ - + diff --git a/Examples/ExampleLib/ExampleConsoleApp.cs b/Examples/ExampleLib/ExampleConsoleApp.cs index f7f4d98..cc248be 100644 --- a/Examples/ExampleLib/ExampleConsoleApp.cs +++ b/Examples/ExampleLib/ExampleConsoleApp.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; using Tapeti; @@ -21,13 +22,18 @@ namespace ExampleLib public class ExampleConsoleApp { private readonly IDependencyContainer dependencyResolver; + private readonly int expectedDoneCount; + private int doneCount; private readonly TaskCompletionSource doneSignal = new TaskCompletionSource(); /// Uses Tapeti's IDependencyContainer interface so you can easily switch an example to your favourite IoC container - public ExampleConsoleApp(IDependencyContainer dependencyResolver) + /// + public ExampleConsoleApp(IDependencyContainer dependencyResolver, int expectedDoneCount = 1) { this.dependencyResolver = dependencyResolver; + this.expectedDoneCount = expectedDoneCount; + dependencyResolver.RegisterDefault(() => new ExampleState(this)); } @@ -85,7 +91,8 @@ namespace ExampleLib internal void Done() { - doneSignal.TrySetResult(true); + if (Interlocked.Increment(ref doneCount) == expectedDoneCount) + doneSignal.TrySetResult(true); } diff --git a/Examples/Messaging.TapetiExample/Messaging.TapetiExample.csproj b/Examples/Messaging.TapetiExample/Messaging.TapetiExample.csproj index cc9631d..055ea68 100644 --- a/Examples/Messaging.TapetiExample/Messaging.TapetiExample.csproj +++ b/Examples/Messaging.TapetiExample/Messaging.TapetiExample.csproj @@ -5,7 +5,7 @@ - + diff --git a/Examples/Messaging.TapetiExample/SpeedTestMessage.cs b/Examples/Messaging.TapetiExample/SpeedTestMessage.cs index 08e03de..f71e216 100644 --- a/Examples/Messaging.TapetiExample/SpeedTestMessage.cs +++ b/Examples/Messaging.TapetiExample/SpeedTestMessage.cs @@ -1,6 +1,4 @@ -using System.ComponentModel.DataAnnotations; - -namespace Messaging.TapetiExample +namespace Messaging.TapetiExample { public class SpeedTestMessage { diff --git a/Tapeti.Annotations/Tapeti.Annotations.csproj b/Tapeti.Annotations/Tapeti.Annotations.csproj index 5c1ef0d..11c27dc 100644 --- a/Tapeti.Annotations/Tapeti.Annotations.csproj +++ b/Tapeti.Annotations/Tapeti.Annotations.csproj @@ -3,6 +3,13 @@ netstandard2.0 true + Mark van Renswoude + + Annotations for Tapeti + rabbitmq tapeti + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.Annotations.png 2.0.0 @@ -10,4 +17,11 @@ 1701;1702 + + + True + + + + diff --git a/Tapeti.Annotations/Tapeti.Annotations.nuspec b/Tapeti.Annotations/Tapeti.Annotations.nuspec deleted file mode 100644 index 87e40c7..0000000 --- a/Tapeti.Annotations/Tapeti.Annotations.nuspec +++ /dev/null @@ -1,20 +0,0 @@ - - - - Tapeti.Annotations - $version$ - Tapeti Annotations - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.Annotations.png - false - Annotations for Tapeti - - rabbitmq tapeti - - - - - \ No newline at end of file diff --git a/Tapeti.Autofac/AutofacDependencyResolver.cs b/Tapeti.Autofac/AutofacDependencyResolver.cs index cf6cee8..74ac975 100644 --- a/Tapeti.Autofac/AutofacDependencyResolver.cs +++ b/Tapeti.Autofac/AutofacDependencyResolver.cs @@ -33,7 +33,8 @@ namespace Tapeti.Autofac } - /// + /// + /// public AutofacDependencyResolver(ContainerBuilder containerBuilder) { this.containerBuilder = containerBuilder; diff --git a/Tapeti.Autofac/Tapeti.Autofac.csproj b/Tapeti.Autofac/Tapeti.Autofac.csproj index 4aabb0c..dfc6146 100644 --- a/Tapeti.Autofac/Tapeti.Autofac.csproj +++ b/Tapeti.Autofac/Tapeti.Autofac.csproj @@ -3,15 +3,29 @@ netstandard2.0 true + Mark van Renswoude + + Autofac integration package for Tapeti + rabbitmq tapeti autofac + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.SimpleInjector.png 2.0.0 - + + + + True + + + + diff --git a/Tapeti.Autofac/Tapeti.Autofac.nuspec b/Tapeti.Autofac/Tapeti.Autofac.nuspec deleted file mode 100644 index d788f49..0000000 --- a/Tapeti.Autofac/Tapeti.Autofac.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tapeti.Autofac - $version$ - Tapeti Autofac - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.SimpleInjector.png - false - Autofac integration package for Tapeti - - rabbitmq tapeti autofac - - - - - - - - - \ No newline at end of file diff --git a/Tapeti.CastleWindsor/Tapeti.CastleWindsor.csproj b/Tapeti.CastleWindsor/Tapeti.CastleWindsor.csproj index 2c81fe5..b2623cf 100644 --- a/Tapeti.CastleWindsor/Tapeti.CastleWindsor.csproj +++ b/Tapeti.CastleWindsor/Tapeti.CastleWindsor.csproj @@ -3,15 +3,29 @@ netstandard2.0 true + Mark van Renswoude + + Castle.Windsor integration package for Tapeti + rabbitmq tapeti castle windsor + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.SimpleInjector.png 2.0.0 - + + + + True + + + + diff --git a/Tapeti.CastleWindsor/Tapeti.CastleWindsor.nuspec b/Tapeti.CastleWindsor/Tapeti.CastleWindsor.nuspec deleted file mode 100644 index ac652ed..0000000 --- a/Tapeti.CastleWindsor/Tapeti.CastleWindsor.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tapeti.CastleWindsor - $version$ - Tapeti Castle Windsor - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.SimpleInjector.png - false - Castle.Windsor integration package for Tapeti - - rabbitmq tapeti castle windsor - - - - - - - - - \ No newline at end of file diff --git a/Tapeti.CastleWindsor/WindsorDependencyResolver.cs b/Tapeti.CastleWindsor/WindsorDependencyResolver.cs index 419d115..e398157 100644 --- a/Tapeti.CastleWindsor/WindsorDependencyResolver.cs +++ b/Tapeti.CastleWindsor/WindsorDependencyResolver.cs @@ -13,7 +13,8 @@ namespace Tapeti.CastleWindsor private readonly IWindsorContainer container; - /// + /// + /// public WindsorDependencyResolver(IWindsorContainer container) { this.container = container; @@ -51,7 +52,7 @@ namespace Tapeti.CastleWindsor container.Register( Component .For() - .UsingFactoryMethod(() => factory()) + .UsingFactoryMethod(factory) ); } @@ -83,7 +84,7 @@ namespace Tapeti.CastleWindsor container.Register( Component .For() - .UsingFactoryMethod(() => factory()) + .UsingFactoryMethod(factory) .LifestyleSingleton() ); } diff --git a/Tapeti.Cmd/Commands/ExportCommand.cs b/Tapeti.Cmd/Commands/ExportCommand.cs index 2f69aa4..013a9bb 100644 --- a/Tapeti.Cmd/Commands/ExportCommand.cs +++ b/Tapeti.Cmd/Commands/ExportCommand.cs @@ -33,7 +33,7 @@ namespace Tapeti.Cmd.Commands RoutingKey = result.RoutingKey, Queue = QueueName, Properties = result.BasicProperties, - Body = result.Body + Body = result.Body.ToArray() }); if (RemoveMessages) diff --git a/Tapeti.Cmd/Commands/ImportCommand.cs b/Tapeti.Cmd/Commands/ImportCommand.cs index a981051..ecb3eb1 100644 --- a/Tapeti.Cmd/Commands/ImportCommand.cs +++ b/Tapeti.Cmd/Commands/ImportCommand.cs @@ -15,7 +15,7 @@ namespace Tapeti.Cmd.Commands { var messageCount = 0; - foreach (var message in MessageSerializer.Deserialize()) + foreach (var message in MessageSerializer.Deserialize(channel)) { rateLimiter.Execute(() => { diff --git a/Tapeti.Cmd/Mock/MockBasicProperties.cs b/Tapeti.Cmd/Mock/MockBasicProperties.cs new file mode 100644 index 0000000..f55e13c --- /dev/null +++ b/Tapeti.Cmd/Mock/MockBasicProperties.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using RabbitMQ.Client; + +namespace Tapeti.Cmd.Mock +{ + public class MockBasicProperties : IBasicProperties + { + public ushort ProtocolClassId { get; set; } + public string ProtocolClassName { get; set; } + + public void ClearAppId() + { + throw new NotImplementedException(); + } + + public void ClearClusterId() + { + throw new NotImplementedException(); + } + + public void ClearContentEncoding() + { + throw new NotImplementedException(); + } + + public void ClearContentType() + { + throw new NotImplementedException(); + } + + public void ClearCorrelationId() + { + throw new NotImplementedException(); + } + + public void ClearDeliveryMode() + { + throw new NotImplementedException(); + } + + public void ClearExpiration() + { + throw new NotImplementedException(); + } + + public void ClearHeaders() + { + throw new NotImplementedException(); + } + + public void ClearMessageId() + { + throw new NotImplementedException(); + } + + public void ClearPriority() + { + throw new NotImplementedException(); + } + + public void ClearReplyTo() + { + throw new NotImplementedException(); + } + + public void ClearTimestamp() + { + throw new NotImplementedException(); + } + + public void ClearType() + { + throw new NotImplementedException(); + } + + public void ClearUserId() + { + throw new NotImplementedException(); + } + + public bool IsAppIdPresent() + { + throw new NotImplementedException(); + } + + public bool IsClusterIdPresent() + { + throw new NotImplementedException(); + } + + public bool IsContentEncodingPresent() + { + throw new NotImplementedException(); + } + + public bool IsContentTypePresent() + { + throw new NotImplementedException(); + } + + public bool IsCorrelationIdPresent() + { + throw new NotImplementedException(); + } + + public bool IsDeliveryModePresent() + { + throw new NotImplementedException(); + } + + public bool IsExpirationPresent() + { + throw new NotImplementedException(); + } + + public bool IsHeadersPresent() + { + throw new NotImplementedException(); + } + + public bool IsMessageIdPresent() + { + throw new NotImplementedException(); + } + + public bool IsPriorityPresent() + { + throw new NotImplementedException(); + } + + public bool IsReplyToPresent() + { + throw new NotImplementedException(); + } + + public bool IsTimestampPresent() + { + throw new NotImplementedException(); + } + + public bool IsTypePresent() + { + throw new NotImplementedException(); + } + + public bool IsUserIdPresent() + { + throw new NotImplementedException(); + } + + public string AppId { get; set; } + public string ClusterId { get; set; } + public string ContentEncoding { get; set; } + public string ContentType { get; set; } + public string CorrelationId { get; set; } + public byte DeliveryMode { get; set; } + public string Expiration { get; set; } + public IDictionary Headers { get; set; } + public string MessageId { get; set; } + public bool Persistent { get; set; } + public byte Priority { get; set; } + public string ReplyTo { get; set; } + public PublicationAddress ReplyToAddress { get; set; } + public AmqpTimestamp Timestamp { get; set; } + public string Type { get; set; } + public string UserId { get; set; } + } +} diff --git a/Tapeti.Cmd/Program.cs b/Tapeti.Cmd/Program.cs index 6862f78..99c412d 100644 --- a/Tapeti.Cmd/Program.cs +++ b/Tapeti.Cmd/Program.cs @@ -5,8 +5,8 @@ using System.IO; using System.Text; using CommandLine; using RabbitMQ.Client; -using RabbitMQ.Client.Framing; using Tapeti.Cmd.Commands; +using Tapeti.Cmd.Mock; using Tapeti.Cmd.RateLimiter; using Tapeti.Cmd.Serialization; @@ -256,7 +256,7 @@ namespace Tapeti.Cmd private static IRateLimiter GetRateLimiter(int? maxRate) { - if (maxRate.GetValueOrDefault() <= 0) + if (!maxRate.HasValue || maxRate.Value <= 0) return new NoRateLimiter(); return new SpreadRateLimiter(maxRate.Value, TimeSpan.FromSeconds(1)); @@ -376,7 +376,7 @@ namespace Tapeti.Cmd Port = options.TargetPort ?? options.Port, VirtualHost = !string.IsNullOrEmpty(options.TargetVirtualHost) ? options.TargetVirtualHost : options.VirtualHost, UserName = !string.IsNullOrEmpty(options.TargetUsername) ? options.TargetUsername : options.Username, - Password = !string.IsNullOrEmpty(options.TargetPassword) ? options.TargetPassword : options.Password, + Password = !string.IsNullOrEmpty(options.TargetPassword) ? options.TargetPassword : options.Password }; return factory.CreateConnection(); @@ -417,7 +417,7 @@ namespace Tapeti.Cmd Queue = "example.queue", RoutingKey = "example.routing.key", DeliveryTag = 42, - Properties = new BasicProperties + Properties = new MockBasicProperties { ContentType = "application/json", DeliveryMode = 2, diff --git a/Tapeti.Cmd/Serialization/EasyNetQMessageSerializer.cs b/Tapeti.Cmd/Serialization/EasyNetQMessageSerializer.cs index db3f589..d0b99ee 100644 --- a/Tapeti.Cmd/Serialization/EasyNetQMessageSerializer.cs +++ b/Tapeti.Cmd/Serialization/EasyNetQMessageSerializer.cs @@ -6,7 +6,6 @@ using System.Text; using System.Text.RegularExpressions; using Newtonsoft.Json; using RabbitMQ.Client; -using RabbitMQ.Client.Framing; namespace Tapeti.Cmd.Serialization { @@ -61,7 +60,7 @@ namespace Tapeti.Cmd.Serialization } - public IEnumerable Deserialize() + public IEnumerable Deserialize(IModel channel) { foreach (var file in Directory.GetFiles(path, "*.*.message.txt")) { @@ -80,8 +79,13 @@ namespace Tapeti.Cmd.Serialization var infoJson = File.ReadAllText(infoFileName); var info = JsonConvert.DeserializeObject(infoJson); + if (info == null) + continue; + var message = info.ToMessage(); - message.Properties = properties.ToBasicProperties(); + if (properties != null) + message.Properties = properties.ToBasicProperties(channel); + message.Body = Encoding.UTF8.GetBytes(body); yield return message; @@ -117,13 +121,13 @@ namespace Tapeti.Cmd.Serialization if (!basicProperties.IsHeadersPresent()) return; - foreach (var header in basicProperties.Headers) - Headers.Add(header.Key, (byte[])header.Value); + foreach (var (key, value) in basicProperties.Headers) + Headers.Add(key, (byte[])value); } - public IBasicProperties ToBasicProperties() + public IBasicProperties ToBasicProperties(IModel channel) { - var basicProperties = new BasicProperties(); + var basicProperties = channel.CreateBasicProperties(); if (ContentTypePresent) basicProperties.ContentType = ContentType; if (ContentEncodingPresent) basicProperties.ContentEncoding = ContentEncoding; @@ -169,6 +173,7 @@ namespace Tapeti.Cmd.Serialization public IDictionary Headers { get => headers; + // ReSharper disable once UnusedMember.Local set { headers = value; HeadersPresent = true; } } @@ -268,6 +273,7 @@ namespace Tapeti.Cmd.Serialization private class EasyNetQMessageReceivedInfo { + // ReSharper disable once UnusedAutoPropertyAccessor.Local - used by JSON deserialization public string ConsumerTag { get; set; } public ulong DeliverTag { get; set; } public bool Redelivered { get; set; } diff --git a/Tapeti.Cmd/Serialization/IMessageSerializer.cs b/Tapeti.Cmd/Serialization/IMessageSerializer.cs index e8ce5a3..3aae717 100644 --- a/Tapeti.Cmd/Serialization/IMessageSerializer.cs +++ b/Tapeti.Cmd/Serialization/IMessageSerializer.cs @@ -19,6 +19,6 @@ namespace Tapeti.Cmd.Serialization public interface IMessageSerializer : IDisposable { void Serialize(Message message); - IEnumerable Deserialize(); + IEnumerable Deserialize(IModel channel); } } diff --git a/Tapeti.Cmd/Serialization/SingleFileJSONMessageSerializer.cs b/Tapeti.Cmd/Serialization/SingleFileJSONMessageSerializer.cs index f8210fc..05f2e88 100644 --- a/Tapeti.Cmd/Serialization/SingleFileJSONMessageSerializer.cs +++ b/Tapeti.Cmd/Serialization/SingleFileJSONMessageSerializer.cs @@ -5,7 +5,6 @@ using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RabbitMQ.Client; -using RabbitMQ.Client.Framing; namespace Tapeti.Cmd.Serialization { @@ -42,7 +41,7 @@ namespace Tapeti.Cmd.Serialization } - public IEnumerable Deserialize() + public IEnumerable Deserialize(IModel channel) { using (var reader = new StreamReader(stream, encoding)) { @@ -56,7 +55,7 @@ namespace Tapeti.Cmd.Serialization if (serializableMessage == null) continue; - yield return serializableMessage.ToMessage(); + yield return serializableMessage.ToMessage(channel); } } } @@ -134,7 +133,7 @@ namespace Tapeti.Cmd.Serialization } - public Message ToMessage() + public Message ToMessage(IModel channel) { return new Message { @@ -143,7 +142,7 @@ namespace Tapeti.Cmd.Serialization Exchange = Exchange, RoutingKey = RoutingKey, Queue = Queue, - Properties = Properties.ToBasicProperties(), + Properties = Properties.ToBasicProperties(channel), Body = Body != null ? Encoding.UTF8.GetBytes(Body.ToString(Formatting.None)) : RawBody @@ -198,17 +197,17 @@ namespace Tapeti.Cmd.Serialization Headers = new Dictionary(); // This assumes header values are UTF-8 encoded strings. This is true for Tapeti. - foreach (var pair in fromProperties.Headers) - Headers.Add(pair.Key, Encoding.UTF8.GetString((byte[])pair.Value)); + foreach (var (key, value) in fromProperties.Headers) + Headers.Add(key, Encoding.UTF8.GetString((byte[])value)); } else Headers = null; } - public IBasicProperties ToBasicProperties() + public IBasicProperties ToBasicProperties(IModel channel) { - var properties = new BasicProperties(); + var properties = channel.CreateBasicProperties(); if (!string.IsNullOrEmpty(AppId)) properties.AppId = AppId; if (!string.IsNullOrEmpty(ClusterId)) properties.ClusterId = ClusterId; @@ -228,8 +227,8 @@ namespace Tapeti.Cmd.Serialization { properties.Headers = new Dictionary(); - foreach (var pair in Headers) - properties.Headers.Add(pair.Key, Encoding.UTF8.GetBytes(pair.Value)); + foreach (var (key, value) in Headers) + properties.Headers.Add(key, Encoding.UTF8.GetBytes(value)); } return properties; diff --git a/Tapeti.Cmd/Tapeti.Cmd.csproj b/Tapeti.Cmd/Tapeti.Cmd.csproj index d224a94..388750a 100644 --- a/Tapeti.Cmd/Tapeti.Cmd.csproj +++ b/Tapeti.Cmd/Tapeti.Cmd.csproj @@ -5,14 +5,19 @@ netcoreapp2.1 2.0.0 Mark van Renswoude - Mark van Renswoude + + + rabbitmq tapeti + Unlicense + https://github.com/MvRens/Tapeti + 2.0.0 Tapeti Command-line Utility - - - + + + diff --git a/Tapeti.DataAnnotations.Extensions/Tapeti.DataAnnotations.Extensions.csproj b/Tapeti.DataAnnotations.Extensions/Tapeti.DataAnnotations.Extensions.csproj index 9fd102a..3de7536 100644 --- a/Tapeti.DataAnnotations.Extensions/Tapeti.DataAnnotations.Extensions.csproj +++ b/Tapeti.DataAnnotations.Extensions/Tapeti.DataAnnotations.Extensions.csproj @@ -3,6 +3,13 @@ netstandard2.0 true + Mark van Renswoude + + Additional DataAnnotations attributes. Not specific to Tapeti, but useful for annotating message classes. + rabbitmq tapeti dataannotations + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.DataAnnotations.png 2.0.0 @@ -11,7 +18,14 @@ - + + + + + + True + + diff --git a/Tapeti.DataAnnotations.Extensions/Tapeti.DataAnnotations.Extensions.nuspec b/Tapeti.DataAnnotations.Extensions/Tapeti.DataAnnotations.Extensions.nuspec deleted file mode 100644 index d1e1aa1..0000000 --- a/Tapeti.DataAnnotations.Extensions/Tapeti.DataAnnotations.Extensions.nuspec +++ /dev/null @@ -1,23 +0,0 @@ - - - - Tapeti.DataAnnotations.Extensions - $version$ - Tapeti DataAnnotations Extensions - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.DataAnnotations.png - false - Additional DataAnnotations attributes. Not specific to Tapeti, but useful for annotating message classes. - - rabbitmq tapeti dataannotations - - - - - - - - \ No newline at end of file diff --git a/Tapeti.DataAnnotations/Tapeti.DataAnnotations.csproj b/Tapeti.DataAnnotations/Tapeti.DataAnnotations.csproj index d0cac34..27bb111 100644 --- a/Tapeti.DataAnnotations/Tapeti.DataAnnotations.csproj +++ b/Tapeti.DataAnnotations/Tapeti.DataAnnotations.csproj @@ -3,6 +3,13 @@ netstandard2.0 true + Mark van Renswoude + + DataAnnotations validation extension for Tapeti + rabbitmq tapeti dataannotations + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.DataAnnotations.png 2.0.0 @@ -11,11 +18,18 @@ - + + + + True + + + + diff --git a/Tapeti.DataAnnotations/Tapeti.DataAnnotations.nuspec b/Tapeti.DataAnnotations/Tapeti.DataAnnotations.nuspec deleted file mode 100644 index 02b18c4..0000000 --- a/Tapeti.DataAnnotations/Tapeti.DataAnnotations.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tapeti.DataAnnotations - $version$ - Tapeti DataAnnotations - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.DataAnnotations.png - false - DataAnnotations validation extension for Tapeti - - rabbitmq tapeti dataannotations - - - - - - - - - \ No newline at end of file diff --git a/Tapeti.Flow.SQL/SqlConnectionFlowRepository.cs b/Tapeti.Flow.SQL/SqlConnectionFlowRepository.cs index bba7085..19f7a8b 100644 --- a/Tapeti.Flow.SQL/SqlConnectionFlowRepository.cs +++ b/Tapeti.Flow.SQL/SqlConnectionFlowRepository.cs @@ -27,7 +27,8 @@ namespace Tapeti.Flow.SQL private readonly string tableName; - /// + /// + /// public SqlConnectionFlowRepository(string connectionString, string tableName = "Flow") { this.connectionString = connectionString; diff --git a/Tapeti.Flow.SQL/SqlExceptionHelper.cs b/Tapeti.Flow.SQL/SqlExceptionHelper.cs index 5a596a1..e4d507e 100644 --- a/Tapeti.Flow.SQL/SqlExceptionHelper.cs +++ b/Tapeti.Flow.SQL/SqlExceptionHelper.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Data.SqlClient; -using System.Text; +using System.Linq; + +// ReSharper disable UnusedMember.Global namespace Tapeti.Flow.SQL { @@ -24,16 +26,8 @@ namespace Tapeti.Flow.SQL case Exception exception: { - var sqlExceptions = ExtractSqlExceptions(e); - foreach (var sqlException in sqlExceptions) - { - var sqlErrors = UnwrapSqlErrors(sqlException); - - if (IsRecoverableSQLError(sqlErrors)) - return true; - } - - return false; + var sqlExceptions = ExtractSqlExceptions(exception); + return sqlExceptions.Select(UnwrapSqlErrors).Any(IsRecoverableSQLError); } default: diff --git a/Tapeti.Flow.SQL/Tapeti.Flow.SQL.csproj b/Tapeti.Flow.SQL/Tapeti.Flow.SQL.csproj index 64e5907..c23f096 100644 --- a/Tapeti.Flow.SQL/Tapeti.Flow.SQL.csproj +++ b/Tapeti.Flow.SQL/Tapeti.Flow.SQL.csproj @@ -3,6 +3,13 @@ netstandard2.0 true + Mark van Renswoude + + SQL backing repository for the Tapeti Flow package + rabbitmq tapeti flow sql + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.Flow.SQL.png 2.0.0 @@ -19,7 +26,7 @@ - + @@ -27,4 +34,11 @@ + + + True + + + + diff --git a/Tapeti.Flow.SQL/Tapeti.Flow.SQL.nuspec b/Tapeti.Flow.SQL/Tapeti.Flow.SQL.nuspec deleted file mode 100644 index 15b5488..0000000 --- a/Tapeti.Flow.SQL/Tapeti.Flow.SQL.nuspec +++ /dev/null @@ -1,25 +0,0 @@ - - - - Tapeti.Flow.SQL - $version$ - Tapeti Flow SQL - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.Flow.SQL.png - false - SQL backing repository for the Tapeti Flow package - - rabbitmq tapeti sql - - - - - - - - - - \ No newline at end of file diff --git a/Tapeti.Flow/Default/FlowContinuationMiddleware.cs b/Tapeti.Flow/Default/FlowContinuationMiddleware.cs index f610d8b..b07c819 100644 --- a/Tapeti.Flow/Default/FlowContinuationMiddleware.cs +++ b/Tapeti.Flow/Default/FlowContinuationMiddleware.cs @@ -63,7 +63,7 @@ namespace Tapeti.Flow.Default // Do not call when the controller method was filtered, if the same message has two methods return; - if (flowContext?.FlowStateLock != null) + if (flowContext.FlowStateLock != null) { if (!flowContext.IsStoredOrDeleted()) // The exception strategy can set the consume result to Success. Instead, check if the yield point diff --git a/Tapeti.Flow/Default/FlowHandlerContext.cs b/Tapeti.Flow/Default/FlowHandlerContext.cs index fc35b68..6bcbab9 100644 --- a/Tapeti.Flow/Default/FlowHandlerContext.cs +++ b/Tapeti.Flow/Default/FlowHandlerContext.cs @@ -9,13 +9,15 @@ namespace Tapeti.Flow.Default /// internal class FlowHandlerContext : IFlowHandlerContext { - /// + /// + /// public FlowHandlerContext() { } - /// + /// + /// public FlowHandlerContext(IControllerMessageContext source) { if (source == null) diff --git a/Tapeti.Flow/Default/FlowProvider.cs b/Tapeti.Flow/Default/FlowProvider.cs index 123c80b..d7b28b4 100644 --- a/Tapeti.Flow/Default/FlowProvider.cs +++ b/Tapeti.Flow/Default/FlowProvider.cs @@ -22,7 +22,8 @@ namespace Tapeti.Flow.Default private readonly IInternalPublisher publisher; - /// + /// + /// public FlowProvider(ITapetiConfig config, IPublisher publisher) { this.config = config; diff --git a/Tapeti.Flow/Default/FlowStarter.cs b/Tapeti.Flow/Default/FlowStarter.cs index 68c8813..f391fe8 100644 --- a/Tapeti.Flow/Default/FlowStarter.cs +++ b/Tapeti.Flow/Default/FlowStarter.cs @@ -15,7 +15,8 @@ namespace Tapeti.Flow.Default private readonly ITapetiConfig config; - /// + /// + /// public FlowStarter(ITapetiConfig config) { this.config = config; diff --git a/Tapeti.Flow/Default/FlowStore.cs b/Tapeti.Flow/Default/FlowStore.cs index 3b0c9db..f380962 100644 --- a/Tapeti.Flow/Default/FlowStore.cs +++ b/Tapeti.Flow/Default/FlowStore.cs @@ -35,7 +35,8 @@ namespace Tapeti.Flow.Default private volatile bool loaded; - /// + /// + /// public FlowStore(IFlowRepository repository) { this.repository = repository; diff --git a/Tapeti.Flow/FlowExtension.cs b/Tapeti.Flow/FlowExtension.cs index 05a17d2..6c979e9 100644 --- a/Tapeti.Flow/FlowExtension.cs +++ b/Tapeti.Flow/FlowExtension.cs @@ -12,7 +12,8 @@ namespace Tapeti.Flow { private readonly IFlowRepository flowRepository; - /// + /// + /// public FlowExtension(IFlowRepository flowRepository) { this.flowRepository = flowRepository; diff --git a/Tapeti.Flow/FlowHelpers/LockCollection.cs b/Tapeti.Flow/FlowHelpers/LockCollection.cs index d7f929a..309e916 100644 --- a/Tapeti.Flow/FlowHelpers/LockCollection.cs +++ b/Tapeti.Flow/FlowHelpers/LockCollection.cs @@ -11,7 +11,8 @@ namespace Tapeti.Flow.FlowHelpers { private readonly Dictionary locks; - /// + /// + /// public LockCollection(IEqualityComparer comparer) { locks = new Dictionary(comparer); diff --git a/Tapeti.Flow/Tapeti.Flow.csproj b/Tapeti.Flow/Tapeti.Flow.csproj index d2939b4..40f2f79 100644 --- a/Tapeti.Flow/Tapeti.Flow.csproj +++ b/Tapeti.Flow/Tapeti.Flow.csproj @@ -3,6 +3,13 @@ netstandard2.0 true + Menno van Lavieren, Mark van Renswoude + + + rabbitmq tapeti flow + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.Flow.png 2.0.0 @@ -15,4 +22,11 @@ + + + True + + + + diff --git a/Tapeti.Flow/Tapeti.Flow.nuspec b/Tapeti.Flow/Tapeti.Flow.nuspec deleted file mode 100644 index 87504d0..0000000 --- a/Tapeti.Flow/Tapeti.Flow.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tapeti.Flow - $version$ - Tapeti Flow - Menno van Lavieren, Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.Flow.png - false - Flow extension for Tapeti - - rabbitmq tapeti flow - - - - - - - - - \ No newline at end of file diff --git a/Tapeti.Ninject/NinjectDependencyResolver.cs b/Tapeti.Ninject/NinjectDependencyResolver.cs index 7a2ac17..0e2fdcf 100644 --- a/Tapeti.Ninject/NinjectDependencyResolver.cs +++ b/Tapeti.Ninject/NinjectDependencyResolver.cs @@ -13,7 +13,8 @@ namespace Tapeti.Ninject private readonly IKernel kernel; - /// + /// + /// public NinjectDependencyResolver(IKernel kernel) { this.kernel = kernel; diff --git a/Tapeti.Ninject/Tapeti.Ninject.csproj b/Tapeti.Ninject/Tapeti.Ninject.csproj index 914e276..c16b08e 100644 --- a/Tapeti.Ninject/Tapeti.Ninject.csproj +++ b/Tapeti.Ninject/Tapeti.Ninject.csproj @@ -3,6 +3,13 @@ netstandard2.0 true + Mark van Renswoude + + Ninject integration package for Tapeti + rabbitmq tapeti ninject + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.SimpleInjector.png 2.0.0 @@ -14,4 +21,11 @@ + + + True + + + + diff --git a/Tapeti.Ninject/Tapeti.Ninject.nuspec b/Tapeti.Ninject/Tapeti.Ninject.nuspec deleted file mode 100644 index c0709e1..0000000 --- a/Tapeti.Ninject/Tapeti.Ninject.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tapeti.Ninject - $version$ - Tapeti Ninject - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.SimpleInjector.png - false - Ninject integration package for Tapeti - - rabbitmq tapeti ninject - - - - - - - - - \ No newline at end of file diff --git a/Tapeti.Serilog/Tapeti.Serilog.csproj b/Tapeti.Serilog/Tapeti.Serilog.csproj index 61b62da..25d7d29 100644 --- a/Tapeti.Serilog/Tapeti.Serilog.csproj +++ b/Tapeti.Serilog/Tapeti.Serilog.csproj @@ -3,6 +3,13 @@ netstandard2.0 true + Hans Mulder, Mark van Renswoude + + Serilog integration package for Tapeti + rabbitmq tapeti serilog + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.Serilog.png 2.0.0 @@ -11,11 +18,18 @@ - + + + + True + + + + diff --git a/Tapeti.Serilog/Tapeti.Serilog.nuspec b/Tapeti.Serilog/Tapeti.Serilog.nuspec deleted file mode 100644 index 451ec08..0000000 --- a/Tapeti.Serilog/Tapeti.Serilog.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tapeti.Serilog - $version$ - Tapeti Serilog - Hans Mulder - Hans Mulder - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.Serilog.png - false - Serilog integration package for Tapeti - - rabbitmq tapeti serilog - - - - - - - - - \ No newline at end of file diff --git a/Tapeti.SimpleInjector/SimpleInjectorDependencyResolver.cs b/Tapeti.SimpleInjector/SimpleInjectorDependencyResolver.cs index 1cfbaef..c8a189f 100644 --- a/Tapeti.SimpleInjector/SimpleInjectorDependencyResolver.cs +++ b/Tapeti.SimpleInjector/SimpleInjectorDependencyResolver.cs @@ -14,7 +14,8 @@ namespace Tapeti.SimpleInjector private readonly Lifestyle defaultsLifestyle; private readonly Lifestyle controllersLifestyle; - /// + /// + /// public SimpleInjectorDependencyResolver(Container container, Lifestyle defaultsLifestyle = null, Lifestyle controllersLifestyle = null) { this.container = container; diff --git a/Tapeti.SimpleInjector/Tapeti.SimpleInjector.csproj b/Tapeti.SimpleInjector/Tapeti.SimpleInjector.csproj index e9fa456..050dd5d 100644 --- a/Tapeti.SimpleInjector/Tapeti.SimpleInjector.csproj +++ b/Tapeti.SimpleInjector/Tapeti.SimpleInjector.csproj @@ -3,6 +3,14 @@ netstandard2.0 true + Mark van Renswoude + + SimpleInjector integration package for Tapeti + rabbitmq tapeti simpleinjector + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.SimpleInjector.png + 2.0.0 2.0.0 @@ -11,11 +19,18 @@ - + + + + True + + + + diff --git a/Tapeti.SimpleInjector/Tapeti.SimpleInjector.nuspec b/Tapeti.SimpleInjector/Tapeti.SimpleInjector.nuspec deleted file mode 100644 index 7005734..0000000 --- a/Tapeti.SimpleInjector/Tapeti.SimpleInjector.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tapeti.SimpleInjector - $version$ - Tapeti SimpleInjector - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.SimpleInjector.png - false - SimpleInjector integration package for Tapeti - - rabbitmq tapeti simpleinjector - - - - - - - - - \ No newline at end of file diff --git a/Tapeti.Tests/Default/TypeNameRoutingKeyStrategyTests.cs b/Tapeti.Tests/Default/TypeNameRoutingKeyStrategyTests.cs index d61f0b2..ed133fb 100644 --- a/Tapeti.Tests/Default/TypeNameRoutingKeyStrategyTests.cs +++ b/Tapeti.Tests/Default/TypeNameRoutingKeyStrategyTests.cs @@ -60,7 +60,8 @@ namespace Tapeti.Tests.Default AssertRoutingKey("acr.test.mixed.case", typeof(ACRTestMIXEDCaseMESSAGE)); } - private void AssertRoutingKey(string expected, Type messageType) + // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local + private static void AssertRoutingKey(string expected, Type messageType) { if (expected == null) throw new ArgumentNullException(nameof(expected)); if (messageType == null) throw new ArgumentNullException(nameof(messageType)); diff --git a/Tapeti.Tests/Tapeti.Tests.csproj b/Tapeti.Tests/Tapeti.Tests.csproj index f9fa098..cc4c3a6 100644 --- a/Tapeti.Tests/Tapeti.Tests.csproj +++ b/Tapeti.Tests/Tapeti.Tests.csproj @@ -9,9 +9,9 @@ - + - + all runtime; build; native; contentfiles; analyzers diff --git a/Tapeti.Transient/Tapeti.Transient.csproj b/Tapeti.Transient/Tapeti.Transient.csproj index 21f80d7..02df581 100644 --- a/Tapeti.Transient/Tapeti.Transient.csproj +++ b/Tapeti.Transient/Tapeti.Transient.csproj @@ -3,6 +3,13 @@ netstandard2.0 true + Menno van Lavieren, Mark van Renswoude + + Transient extension for Tapeti Flow + rabbitmq tapeti flow transient + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.Flow.png 2.0.0 @@ -14,4 +21,11 @@ + + + True + + + + diff --git a/Tapeti.Transient/Tapeti.Transient.nuspec b/Tapeti.Transient/Tapeti.Transient.nuspec deleted file mode 100644 index 41e1fa2..0000000 --- a/Tapeti.Transient/Tapeti.Transient.nuspec +++ /dev/null @@ -1,23 +0,0 @@ - - - - Tapeti.Transient - $version$ - Tapeti Transient - Menno van Lavieren, Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.Flow.png - false - Transient extension for Tapeti - - rabbitmq tapeti transient - - - - - - - - \ No newline at end of file diff --git a/Tapeti.Transient/TransientExtension.cs b/Tapeti.Transient/TransientExtension.cs index 2ce8477..ec642e5 100644 --- a/Tapeti.Transient/TransientExtension.cs +++ b/Tapeti.Transient/TransientExtension.cs @@ -11,7 +11,8 @@ namespace Tapeti.Transient private readonly TransientRouter router; - /// + /// + /// public TransientExtension(TimeSpan defaultTimeout, string dynamicQueuePrefix) { this.dynamicQueuePrefix = dynamicQueuePrefix; diff --git a/Tapeti.Transient/TransientGenericBinding.cs b/Tapeti.Transient/TransientGenericBinding.cs index 94c6e6b..f55bb45 100644 --- a/Tapeti.Transient/TransientGenericBinding.cs +++ b/Tapeti.Transient/TransientGenericBinding.cs @@ -21,7 +21,8 @@ namespace Tapeti.Transient public QueueType QueueType => QueueType.Dynamic; - /// + /// + /// public TransientGenericBinding(TransientRouter router, string dynamicQueuePrefix) { this.router = router; diff --git a/Tapeti.Transient/TransientPublisher.cs b/Tapeti.Transient/TransientPublisher.cs index 525e887..3092c86 100644 --- a/Tapeti.Transient/TransientPublisher.cs +++ b/Tapeti.Transient/TransientPublisher.cs @@ -12,7 +12,8 @@ namespace Tapeti.Transient private readonly IPublisher publisher; - /// + /// + /// public TransientPublisher(TransientRouter router, IPublisher publisher) { this.router = router; diff --git a/Tapeti.Transient/TransientRouter.cs b/Tapeti.Transient/TransientRouter.cs index 82e8eb3..c6a79d6 100644 --- a/Tapeti.Transient/TransientRouter.cs +++ b/Tapeti.Transient/TransientRouter.cs @@ -21,7 +21,8 @@ namespace Tapeti.Transient public string TransientResponseQueueName { get; set; } - /// + /// + /// public TransientRouter(TimeSpan defaultTimeout) { defaultTimeoutMs = (int)defaultTimeout.TotalMilliseconds; diff --git a/Tapeti.UnityContainer/Tapeti.UnityContainer.csproj b/Tapeti.UnityContainer/Tapeti.UnityContainer.csproj index fe9aab8..42399ca 100644 --- a/Tapeti.UnityContainer/Tapeti.UnityContainer.csproj +++ b/Tapeti.UnityContainer/Tapeti.UnityContainer.csproj @@ -3,15 +3,29 @@ netstandard2.0 true + Mark van Renswoude + + Unity container integration package for Tapeti + rabbitmq tapeti unity + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.SimpleInjector.png 2.0.0 - + + + + True + + + + diff --git a/Tapeti.UnityContainer/Tapeti.UnityContainer.nuspec b/Tapeti.UnityContainer/Tapeti.UnityContainer.nuspec deleted file mode 100644 index 356278a..0000000 --- a/Tapeti.UnityContainer/Tapeti.UnityContainer.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tapeti.UnityContainer - $version$ - Tapeti UnityContainer - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.SimpleInjector.png - false - Unity container integration package for Tapeti - - rabbitmq tapeti unity - - - - - - - - - \ No newline at end of file diff --git a/Tapeti.UnityContainer/UnityDependencyResolver.cs b/Tapeti.UnityContainer/UnityDependencyResolver.cs index 98db82b..a3ab84e 100644 --- a/Tapeti.UnityContainer/UnityDependencyResolver.cs +++ b/Tapeti.UnityContainer/UnityDependencyResolver.cs @@ -13,7 +13,8 @@ namespace Tapeti.UnityContainer private readonly IUnityContainer container; - /// + /// + /// public UnityDependencyResolver(IUnityContainer container) { this.container = container; diff --git a/Tapeti/Config/IBinding.cs b/Tapeti/Config/IBinding.cs index 7d924fa..8cbb45f 100644 --- a/Tapeti/Config/IBinding.cs +++ b/Tapeti/Config/IBinding.cs @@ -1,5 +1,4 @@ using System; -using System.Threading; using System.Threading.Tasks; namespace Tapeti.Config diff --git a/Tapeti/Config/IExceptionStrategyContext.cs b/Tapeti/Config/IExceptionStrategyContext.cs index e418a96..7945404 100644 --- a/Tapeti/Config/IExceptionStrategyContext.cs +++ b/Tapeti/Config/IExceptionStrategyContext.cs @@ -1,6 +1,7 @@ using System; // ReSharper disable UnusedMember.Global +// ReSharper disable UnusedMemberInSuper.Global namespace Tapeti.Config { diff --git a/Tapeti/Config/IPublishContext.cs b/Tapeti/Config/IPublishContext.cs index 30a51b6..a5fb435 100644 --- a/Tapeti/Config/IPublishContext.cs +++ b/Tapeti/Config/IPublishContext.cs @@ -1,4 +1,5 @@ // ReSharper disable UnusedMember.Global +// ReSharper disable UnusedMemberInSuper.Global namespace Tapeti.Config { diff --git a/Tapeti/Connection/ITapetiClient.cs b/Tapeti/Connection/ITapetiClient.cs index 4a9e4de..e8c7654 100644 --- a/Tapeti/Connection/ITapetiClient.cs +++ b/Tapeti/Connection/ITapetiClient.cs @@ -10,7 +10,7 @@ namespace Tapeti.Connection /// /// Defines a queue binding to an exchange using a routing key /// - public struct QueueBinding : IEquatable + public readonly struct QueueBinding : IEquatable { /// public readonly string Exchange; diff --git a/Tapeti/Connection/TapetiBasicConsumer.cs b/Tapeti/Connection/TapetiBasicConsumer.cs index 92fec5a..7dd969a 100644 --- a/Tapeti/Connection/TapetiBasicConsumer.cs +++ b/Tapeti/Connection/TapetiBasicConsumer.cs @@ -24,13 +24,19 @@ namespace Tapeti.Connection /// - public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, IBasicProperties properties, byte[] body) + public override void HandleBasicDeliver(string consumerTag, + ulong deliveryTag, + bool redelivered, + string exchange, + string routingKey, + IBasicProperties properties, + ReadOnlyMemory body) { Task.Run(async () => { try { - var response = await consumer.Consume(exchange, routingKey, new RabbitMQMessageProperties(properties), body); + var response = await consumer.Consume(exchange, routingKey, new RabbitMQMessageProperties(properties), body.ToArray()); await onRespond(deliveryTag, response); } catch diff --git a/Tapeti/Connection/TapetiClient.cs b/Tapeti/Connection/TapetiClient.cs index 71a49d1..c41e7b4 100644 --- a/Tapeti/Connection/TapetiClient.cs +++ b/Tapeti/Connection/TapetiClient.cs @@ -351,7 +351,7 @@ namespace Tapeti.Connection } catch (OperationInterruptedException e) { - if (e.ShutdownReason.ReplyCode == RabbitMQ.Client.Framing.Constants.PreconditionFailed) + if (e.ShutdownReason.ReplyCode == Constants.PreconditionFailed) retry = true; else throw; @@ -519,9 +519,10 @@ namespace Tapeti.Connection var bindings = JsonConvert.DeserializeObject>(content); // Filter out the binding to an empty source, which is always present for direct-to-queue routing - return bindings + return bindings? .Where(binding => !string.IsNullOrEmpty(binding.Source)) - .Select(binding => new QueueBinding(binding.Source, binding.RoutingKey)); + .Select(binding => new QueueBinding(binding.Source, binding.RoutingKey)) + ?? Enumerable.Empty(); }); } @@ -655,7 +656,7 @@ namespace Tapeti.Connection Password = connectionParams.Password, AutomaticRecoveryEnabled = false, TopologyRecoveryEnabled = false, - RequestedHeartbeat = 30 + RequestedHeartbeat = TimeSpan.FromSeconds(30) }; if (connectionParams.ClientProperties != null) diff --git a/Tapeti/Connection/TapetiSubscriber.cs b/Tapeti/Connection/TapetiSubscriber.cs index 34c08e1..3c207a7 100644 --- a/Tapeti/Connection/TapetiSubscriber.cs +++ b/Tapeti/Connection/TapetiSubscriber.cs @@ -18,7 +18,6 @@ namespace Tapeti.Connection private CancellationTokenSource initializeCancellationTokenSource; - /// public TapetiSubscriber(Func clientFactory, ITapetiConfig config) { this.clientFactory = clientFactory; diff --git a/Tapeti/Default/ControllerBindingContext.cs b/Tapeti/Default/ControllerBindingContext.cs index 8eb0150..9318c98 100644 --- a/Tapeti/Default/ControllerBindingContext.cs +++ b/Tapeti/Default/ControllerBindingContext.cs @@ -118,7 +118,10 @@ namespace Tapeti.Default public bool HasBinding => Binding != null; - /// + /// + /// Creates a new default implementation for IBindingParameter + /// + /// public ControllerBindingParameter(ParameterInfo info) { Info = info; @@ -155,6 +158,10 @@ namespace Tapeti.Default public bool HasHandler => Handler != null; + /// + /// Creates a new default implementation for IBindingResult + /// + /// public ControllerBindingResult(ParameterInfo info) { Info = info; diff --git a/Tapeti/Default/ControllerMessageContext.cs b/Tapeti/Default/ControllerMessageContext.cs index b5aa037..92ac61c 100644 --- a/Tapeti/Default/ControllerMessageContext.cs +++ b/Tapeti/Default/ControllerMessageContext.cs @@ -32,7 +32,6 @@ namespace Tapeti.Default IControllerMethodBinding IControllerMessageContext.Binding => decoratedContext.Binding as IControllerMethodBinding; - /// public ControllerMessageContext(IMessageContext decoratedContext) { this.decoratedContext = decoratedContext; diff --git a/Tapeti/Default/ExceptionStrategyContext.cs b/Tapeti/Default/ExceptionStrategyContext.cs index 56e2a8a..f61d41f 100644 --- a/Tapeti/Default/ExceptionStrategyContext.cs +++ b/Tapeti/Default/ExceptionStrategyContext.cs @@ -18,7 +18,6 @@ namespace Tapeti.Default public Exception Exception { get; } - /// public ExceptionStrategyContext(IMessageContext messageContext, Exception exception) { MessageContext = messageContext; diff --git a/Tapeti/Default/FallbackStringEnumConverter.cs b/Tapeti/Default/FallbackStringEnumConverter.cs index 9801f6c..8967c0e 100644 --- a/Tapeti/Default/FallbackStringEnumConverter.cs +++ b/Tapeti/Default/FallbackStringEnumConverter.cs @@ -60,7 +60,7 @@ namespace Tapeti.Default if (reader.TokenType != JsonToken.String) throw new JsonSerializationException($"Unexpected token {reader.TokenType} when parsing enum"); - var enumText = reader.Value.ToString(); + var enumText = reader.Value?.ToString() ?? ""; if (enumText == string.Empty && isNullable) return null; diff --git a/Tapeti/Default/JsonMessageSerializer.cs b/Tapeti/Default/JsonMessageSerializer.cs index e15a4d3..cebed7d 100644 --- a/Tapeti/Default/JsonMessageSerializer.cs +++ b/Tapeti/Default/JsonMessageSerializer.cs @@ -21,7 +21,8 @@ namespace Tapeti.Default private readonly JsonSerializerSettings serializerSettings; - /// + /// + /// public JsonMessageSerializer() { serializerSettings = new JsonSerializerSettings diff --git a/Tapeti/Default/MessageProperties.cs b/Tapeti/Default/MessageProperties.cs index 64b2eb2..3184da9 100644 --- a/Tapeti/Default/MessageProperties.cs +++ b/Tapeti/Default/MessageProperties.cs @@ -29,13 +29,15 @@ namespace Tapeti.Default public DateTime? Timestamp { get; set; } - /// + /// + /// public MessageProperties() { } - /// + /// + /// public MessageProperties(IMessageProperties source) { if (source == null) diff --git a/Tapeti/Default/PublishResultBinding.cs b/Tapeti/Default/PublishResultBinding.cs index 933302a..dd0bee9 100644 --- a/Tapeti/Default/PublishResultBinding.cs +++ b/Tapeti/Default/PublishResultBinding.cs @@ -30,6 +30,7 @@ namespace Tapeti.Default // Verify the return type matches with the Request attribute of the message class. This is a backwards incompatible change in // Tapeti 1.2: if you just want to publish another message as a result of the incoming message, explicitly call IPublisher.Publish. + // ReSharper disable once ConvertIfStatementToSwitchStatement if (!hasClassResult && expectedClassResult != null || hasClassResult && expectedClassResult != actualType) throw new ArgumentException($"Message handler must return type {expectedClassResult?.FullName ?? "void"} in controller {context.Method.DeclaringType?.FullName}, method {context.Method.Name}, found: {actualType?.FullName ?? "void"}"); diff --git a/Tapeti/Default/RabbitMQMessageProperties.cs b/Tapeti/Default/RabbitMQMessageProperties.cs index 3ddd967..0b524ae 100644 --- a/Tapeti/Default/RabbitMQMessageProperties.cs +++ b/Tapeti/Default/RabbitMQMessageProperties.cs @@ -56,14 +56,16 @@ namespace Tapeti.Default } - /// + /// + /// public RabbitMQMessageProperties(IBasicProperties basicProperties) { BasicProperties = basicProperties; } - /// + /// + /// public RabbitMQMessageProperties(IBasicProperties basicProperties, IMessageProperties source) { BasicProperties = basicProperties; diff --git a/Tapeti/IConnection.cs b/Tapeti/IConnection.cs index eedc765..4453362 100644 --- a/Tapeti/IConnection.cs +++ b/Tapeti/IConnection.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; // ReSharper disable UnusedMember.Global +// ReSharper disable UnusedMemberInSuper.Global namespace Tapeti { diff --git a/Tapeti/ILogger.cs b/Tapeti/ILogger.cs index 8fbabd8..c24a798 100644 --- a/Tapeti/ILogger.cs +++ b/Tapeti/ILogger.cs @@ -2,6 +2,7 @@ using Tapeti.Config; // ReSharper disable UnusedMember.Global +// ReSharper disable UnusedMemberInSuper.Global namespace Tapeti { diff --git a/Tapeti/IPublisher.cs b/Tapeti/IPublisher.cs index 417dc1a..70cb754 100644 --- a/Tapeti/IPublisher.cs +++ b/Tapeti/IPublisher.cs @@ -3,7 +3,7 @@ using System.Linq.Expressions; using System.Threading.Tasks; using Tapeti.Config; -// ReSharper disable once UnusedMember.Global +// ReSharper disable UnusedMember.Global namespace Tapeti { diff --git a/Tapeti/ISubscriber.cs b/Tapeti/ISubscriber.cs index 3110f65..1e7d864 100644 --- a/Tapeti/ISubscriber.cs +++ b/Tapeti/ISubscriber.cs @@ -1,6 +1,8 @@ using System; using System.Threading.Tasks; +// ReSharper disable UnusedMember.Global + namespace Tapeti { /// diff --git a/Tapeti/Tapeti.csproj b/Tapeti/Tapeti.csproj index a1cb606..3a6632e 100644 --- a/Tapeti/Tapeti.csproj +++ b/Tapeti/Tapeti.csproj @@ -4,6 +4,13 @@ netstandard2.0 true 2.0.0 + Mark van Renswoude + + Controller-based framework for RabbitMQ microservice architectures + rabbitmq tapeti + Unlicense + https://github.com/MvRens/Tapeti + Tapeti.png @@ -11,13 +18,20 @@ - - - + + + + + + True + + + + diff --git a/Tapeti/Tapeti.nuspec b/Tapeti/Tapeti.nuspec deleted file mode 100644 index 565e854..0000000 --- a/Tapeti/Tapeti.nuspec +++ /dev/null @@ -1,26 +0,0 @@ - - - - Tapeti - $version$ - Tapeti - Mark van Renswoude - Mark van Renswoude - Unlicense - https://github.com/MvRens/Tapeti - https://raw.githubusercontent.com/MvRens/Tapeti/master/resources/icons/Tapeti.png - false - Controller-based framework for RabbitMQ microservice architectures - - rabbitmq tapeti - - - - - - - - - - - \ No newline at end of file diff --git a/Tapeti/TapetiAppSettingsConnectionParams.cs b/Tapeti/TapetiAppSettingsConnectionParams.cs index a18285b..87138b7 100644 --- a/Tapeti/TapetiAppSettingsConnectionParams.cs +++ b/Tapeti/TapetiAppSettingsConnectionParams.cs @@ -1,6 +1,8 @@ using System.Configuration; using System.Linq; +// ReSharper disable UnusedMember.Global + namespace Tapeti { /// @@ -23,6 +25,7 @@ namespace Tapeti public class TapetiAppSettingsConnectionParams : TapetiConnectionParams { private const string DefaultPrefix = "rabbitmq:"; + // ReSharper disable InconsistentNaming private const string KeyHostname = "hostname"; private const string KeyPort = "port"; private const string KeyVirtualHost = "virtualhost"; @@ -31,9 +34,10 @@ namespace Tapeti private const string KeyPrefetchCount = "prefetchcount"; private const string KeyManagementPort = "managementport"; private const string KeyClientProperty = "clientproperty:"; + // ReSharper restore InconsistentNaming - private struct AppSettingsKey + private readonly struct AppSettingsKey { public readonly string Entry; public readonly string Parameter; diff --git a/Tapeti/TapetiConnectionParams.cs b/Tapeti/TapetiConnectionParams.cs index ac739b1..a3a6ea6 100644 --- a/Tapeti/TapetiConnectionParams.cs +++ b/Tapeti/TapetiConnectionParams.cs @@ -65,7 +65,8 @@ namespace Tapeti } - /// + /// + /// public TapetiConnectionParams() { } diff --git a/appveyor.yml b/appveyor.yml index f9ccb36..44dd9a5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -image: Visual Studio 2017 +image: Visual Studio 2019 install: @@ -11,45 +11,44 @@ before_build: after_build: # Tapeti - - cmd: ECHO nuget pack Tapeti\Tapeti.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: nuget pack Tapeti\Tapeti.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti\Tapeti.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.%GitVersion_NuGetVersion%.nupkg" # Tapeti.Annotations - - cmd: nuget pack Tapeti.Annotations\Tapeti.Annotations.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.Annotations.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.Annotations\Tapeti.Annotations.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.Annotations.%GitVersion_NuGetVersion%.nupkg" # Tapeti.DataAnnotations - - cmd: nuget pack Tapeti.DataAnnotations\Tapeti.DataAnnotations.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.DataAnnotations.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.DataAnnotations\Tapeti.DataAnnotations.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.DataAnnotations.%GitVersion_NuGetVersion%.nupkg" # Tapeti.DataAnnotations.Extensions - - cmd: nuget pack Tapeti.DataAnnotations.Extensions\Tapeti.DataAnnotations.Extensions.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.DataAnnotations.Extensions.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.DataAnnotations.Extensions\Tapeti.DataAnnotations.Extensions.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.DataAnnotations.Extensions.%GitVersion_NuGetVersion%.nupkg" # Tapeti.Flow - - cmd: nuget pack Tapeti.Flow\Tapeti.Flow.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.Flow.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.Flow\Tapeti.Flow.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.Flow.%GitVersion_NuGetVersion%.nupkg" # Tapeti.Flow.SQL - - cmd: nuget pack Tapeti.Flow.SQL\Tapeti.Flow.SQL.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.Flow.SQL.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.Flow.SQL\Tapeti.Flow.SQL.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.Flow.SQL.%GitVersion_NuGetVersion%.nupkg" # Tapeti.Transient - - cmd: nuget pack Tapeti.Transient\Tapeti.Transient.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.Transient.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.Transient\Tapeti.Transient.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.Transient.%GitVersion_NuGetVersion%.nupkg" # Tapeti.Serilog - - cmd: nuget pack Tapeti.Serilog\Tapeti.Serilog.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.Serilog.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.Serilog\Tapeti.Serilog.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.Serilog.%GitVersion_NuGetVersion%.nupkg" # Tapeti.SimpleInjector - - cmd: nuget pack Tapeti.SimpleInjector\Tapeti.SimpleInjector.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.SimpleInjector.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.SimpleInjector\Tapeti.SimpleInjector.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.SimpleInjector.%GitVersion_NuGetVersion%.nupkg" # Tapeti.Autofac - - cmd: nuget pack Tapeti.Autofac\Tapeti.Autofac.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.Autofac.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.Autofac\Tapeti.Autofac.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.Autofac.%GitVersion_NuGetVersion%.nupkg" # Tapeti.CastleWindsor - - cmd: nuget pack Tapeti.CastleWindsor\Tapeti.CastleWindsor.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.CastleWindsor.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.CastleWindsor\Tapeti.CastleWindsor.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.CastleWindsor.%GitVersion_NuGetVersion%.nupkg" # Tapeti.Ninject - - cmd: nuget pack Tapeti.Ninject\Tapeti.Ninject.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.Ninject.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.Ninject\Tapeti.Ninject.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.Ninject.%GitVersion_NuGetVersion%.nupkg" # Tapeti.UnityContainer - - cmd: nuget pack Tapeti.UnityContainer\Tapeti.UnityContainer.nuspec -version "%GitVersion_NuGetVersion%" -prop "target=%CONFIGURATION%" - - cmd: appveyor PushArtifact "Tapeti.UnityContainer.%GitVersion_NuGetVersion%.nupkg" + - cmd: dotnet pack --output output Tapeti.UnityContainer\Tapeti.UnityContainer.csproj /p:Configuration=Release /p:Version=%GitVersion_NuGetVersion% + - cmd: appveyor PushArtifact "output\Tapeti.UnityContainer.%GitVersion_NuGetVersion%.nupkg" build: project: Tapeti.sln