Downgraded language version to 8
Hasn't seem to cause any issues in older .NET versions yet (only used new syntax features), but this will prevent using most unsupported new features for .NET Standard 2.0
This commit is contained in:
parent
927485f1cd
commit
d6138e2cfa
@ -20,7 +20,7 @@ namespace Tapeti.Connection
|
|||||||
internal class TapetiChannel
|
internal class TapetiChannel
|
||||||
{
|
{
|
||||||
private readonly Func<IModel> modelFactory;
|
private readonly Func<IModel> modelFactory;
|
||||||
private readonly object taskQueueLock = new();
|
private readonly object taskQueueLock = new object();
|
||||||
private SingleThreadTaskQueue taskQueue;
|
private SingleThreadTaskQueue taskQueue;
|
||||||
private readonly ModelProvider modelProvider;
|
private readonly ModelProvider modelProvider;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
@ -50,7 +50,7 @@ namespace Tapeti.Connection
|
|||||||
private readonly HttpClient managementClient;
|
private readonly HttpClient managementClient;
|
||||||
|
|
||||||
// These fields must be locked using connectionLock
|
// These fields must be locked using connectionLock
|
||||||
private readonly object connectionLock = new();
|
private readonly object connectionLock = new object();
|
||||||
private long connectionReference;
|
private long connectionReference;
|
||||||
private RabbitMQ.Client.IConnection connection;
|
private RabbitMQ.Client.IConnection connection;
|
||||||
private IModel consumeChannelModel;
|
private IModel consumeChannelModel;
|
||||||
@ -61,12 +61,12 @@ namespace Tapeti.Connection
|
|||||||
|
|
||||||
// These fields are for use in a single TapetiChannel's queue only!
|
// These fields are for use in a single TapetiChannel's queue only!
|
||||||
private ulong lastDeliveryTag;
|
private ulong lastDeliveryTag;
|
||||||
private readonly HashSet<string> deletedQueues = new();
|
private readonly HashSet<string> deletedQueues = new HashSet<string>();
|
||||||
|
|
||||||
// These fields must be locked using confirmLock, since the callbacks for BasicAck/BasicReturn can run in a different thread
|
// These fields must be locked using confirmLock, since the callbacks for BasicAck/BasicReturn can run in a different thread
|
||||||
private readonly object confirmLock = new();
|
private readonly object confirmLock = new object();
|
||||||
private readonly Dictionary<ulong, ConfirmMessageInfo> confirmMessages = new();
|
private readonly Dictionary<ulong, ConfirmMessageInfo> confirmMessages = new Dictionary<ulong, ConfirmMessageInfo>();
|
||||||
private readonly Dictionary<string, ReturnInfo> returnRoutingKeys = new();
|
private readonly Dictionary<string, ReturnInfo> returnRoutingKeys = new Dictionary<string, ReturnInfo>();
|
||||||
|
|
||||||
|
|
||||||
private class ConfirmMessageInfo
|
private class ConfirmMessageInfo
|
||||||
@ -184,18 +184,15 @@ namespace Tapeti.Connection
|
|||||||
|
|
||||||
var replyCode = publishResultTask.Result;
|
var replyCode = publishResultTask.Result;
|
||||||
|
|
||||||
switch (replyCode)
|
// There is no RabbitMQ.Client.Framing.Constants value for this "No route" reply code
|
||||||
{
|
// at the time of writing...
|
||||||
// There is no RabbitMQ.Client.Framing.Constants value for this "No route" reply code
|
if (replyCode == 312)
|
||||||
// at the time of writing...
|
throw new NoRouteException(
|
||||||
case 312:
|
$"Mandatory message with exchange '{exchange}' and routing key '{routingKey}' does not have a route");
|
||||||
throw new NoRouteException(
|
|
||||||
$"Mandatory message with exchange '{exchange}' and routing key '{routingKey}' does not have a route");
|
if (replyCode > 0)
|
||||||
|
throw new NoRouteException(
|
||||||
case > 0:
|
$"Mandatory message with exchange '{exchange}' and routing key '{routingKey}' could not be delivered, reply code: {replyCode}");
|
||||||
throw new NoRouteException(
|
|
||||||
$"Mandatory message with exchange '{exchange}' and routing key '{routingKey}' could not be delivered, reply code: {replyCode}");
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,7 +523,7 @@ namespace Tapeti.Connection
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static readonly List<HttpStatusCode> TransientStatusCodes = new()
|
private static readonly List<HttpStatusCode> TransientStatusCodes = new List<HttpStatusCode>()
|
||||||
{
|
{
|
||||||
HttpStatusCode.GatewayTimeout,
|
HttpStatusCode.GatewayTimeout,
|
||||||
HttpStatusCode.RequestTimeout,
|
HttpStatusCode.RequestTimeout,
|
||||||
@ -663,7 +660,7 @@ namespace Tapeti.Connection
|
|||||||
}
|
}
|
||||||
catch (WebException e)
|
catch (WebException e)
|
||||||
{
|
{
|
||||||
if (e.Response is not HttpWebResponse response)
|
if (!(e.Response is HttpWebResponse response))
|
||||||
throw;
|
throw;
|
||||||
|
|
||||||
if (!TransientStatusCodes.Contains(response.StatusCode))
|
if (!TransientStatusCodes.Contains(response.StatusCode))
|
||||||
@ -678,7 +675,7 @@ namespace Tapeti.Connection
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private readonly HashSet<string> declaredExchanges = new();
|
private readonly HashSet<string> declaredExchanges = new HashSet<string>();
|
||||||
|
|
||||||
private void DeclareExchange(IModel channel, string exchange)
|
private void DeclareExchange(IModel channel, string exchange)
|
||||||
{
|
{
|
||||||
@ -845,7 +842,7 @@ namespace Tapeti.Connection
|
|||||||
GetTapetiChannel(TapetiChannelType.Consume).QueueRetryable(_ => { });
|
GetTapetiChannel(TapetiChannelType.Consume).QueueRetryable(_ => { });
|
||||||
};
|
};
|
||||||
|
|
||||||
capturedPublishChannelModel.ModelShutdown += (_, _) =>
|
capturedPublishChannelModel.ModelShutdown += (sender, args) =>
|
||||||
{
|
{
|
||||||
lock (connectionLock)
|
lock (connectionLock)
|
||||||
{
|
{
|
||||||
|
@ -172,7 +172,8 @@ namespace Tapeti.Connection
|
|||||||
return e switch
|
return e switch
|
||||||
{
|
{
|
||||||
AggregateException aggregateException => aggregateException.InnerExceptions.Any(IgnoreExceptionDuringShutdown),
|
AggregateException aggregateException => aggregateException.InnerExceptions.Any(IgnoreExceptionDuringShutdown),
|
||||||
TaskCanceledException or OperationCanceledException => true,
|
TaskCanceledException _ => true,
|
||||||
|
OperationCanceledException _ => true,
|
||||||
_ => e.InnerException != null && IgnoreExceptionDuringShutdown(e.InnerException)
|
_ => e.InnerException != null && IgnoreExceptionDuringShutdown(e.InnerException)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ namespace Tapeti.Connection
|
|||||||
private readonly Func<ITapetiClient> clientFactory;
|
private readonly Func<ITapetiClient> clientFactory;
|
||||||
private readonly ITapetiConfig config;
|
private readonly ITapetiConfig config;
|
||||||
private bool consuming;
|
private bool consuming;
|
||||||
private readonly List<TapetiConsumerTag> consumerTags = new();
|
private readonly List<TapetiConsumerTag> consumerTags = new List<TapetiConsumerTag>();
|
||||||
|
|
||||||
private CancellationTokenSource initializeCancellationTokenSource;
|
private CancellationTokenSource initializeCancellationTokenSource;
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ namespace Tapeti.Connection
|
|||||||
public List<Type> MessageClasses;
|
public List<Type> MessageClasses;
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly Dictionary<string, List<DynamicQueueInfo>> dynamicQueues = new();
|
private readonly Dictionary<string, List<DynamicQueueInfo>> dynamicQueues = new Dictionary<string, List<DynamicQueueInfo>>();
|
||||||
|
|
||||||
|
|
||||||
protected CustomBindingTarget(Func<ITapetiClient> clientFactory, IRoutingKeyStrategy routingKeyStrategy, IExchangeStrategy exchangeStrategy, CancellationToken cancellationToken)
|
protected CustomBindingTarget(Func<ITapetiClient> clientFactory, IRoutingKeyStrategy routingKeyStrategy, IExchangeStrategy exchangeStrategy, CancellationToken cancellationToken)
|
||||||
@ -278,8 +278,8 @@ namespace Tapeti.Connection
|
|||||||
|
|
||||||
private class DeclareDurableQueuesBindingTarget : CustomBindingTarget
|
private class DeclareDurableQueuesBindingTarget : CustomBindingTarget
|
||||||
{
|
{
|
||||||
private readonly Dictionary<string, List<Type>> durableQueues = new();
|
private readonly Dictionary<string, List<Type>> durableQueues = new Dictionary<string, List<Type>>();
|
||||||
private readonly HashSet<string> obsoleteDurableQueues = new();
|
private readonly HashSet<string> obsoleteDurableQueues = new HashSet<string>();
|
||||||
|
|
||||||
|
|
||||||
public DeclareDurableQueuesBindingTarget(Func<ITapetiClient> clientFactory, IRoutingKeyStrategy routingKeyStrategy, IExchangeStrategy exchangeStrategy, CancellationToken cancellationToken) : base(clientFactory, routingKeyStrategy, exchangeStrategy, cancellationToken)
|
public DeclareDurableQueuesBindingTarget(Func<ITapetiClient> clientFactory, IRoutingKeyStrategy routingKeyStrategy, IExchangeStrategy exchangeStrategy, CancellationToken cancellationToken) : base(clientFactory, routingKeyStrategy, exchangeStrategy, cancellationToken)
|
||||||
@ -359,7 +359,7 @@ namespace Tapeti.Connection
|
|||||||
|
|
||||||
private class PassiveDurableQueuesBindingTarget : CustomBindingTarget
|
private class PassiveDurableQueuesBindingTarget : CustomBindingTarget
|
||||||
{
|
{
|
||||||
private readonly HashSet<string> durableQueues = new();
|
private readonly HashSet<string> durableQueues = new HashSet<string>();
|
||||||
|
|
||||||
|
|
||||||
public PassiveDurableQueuesBindingTarget(Func<ITapetiClient> clientFactory, IRoutingKeyStrategy routingKeyStrategy, IExchangeStrategy exchangeStrategy, CancellationToken cancellationToken) : base(clientFactory, routingKeyStrategy, exchangeStrategy, cancellationToken)
|
public PassiveDurableQueuesBindingTarget(Func<ITapetiClient> clientFactory, IRoutingKeyStrategy routingKeyStrategy, IExchangeStrategy exchangeStrategy, CancellationToken cancellationToken) : base(clientFactory, routingKeyStrategy, exchangeStrategy, cancellationToken)
|
||||||
|
@ -9,7 +9,7 @@ namespace Tapeti.Default
|
|||||||
internal class ControllerBindingContext : IControllerBindingContext
|
internal class ControllerBindingContext : IControllerBindingContext
|
||||||
{
|
{
|
||||||
private BindingTargetMode? bindingTargetMode;
|
private BindingTargetMode? bindingTargetMode;
|
||||||
private readonly List<IControllerMiddlewareBase> middleware = new();
|
private readonly List<IControllerMiddlewareBase> middleware = new List<IControllerMiddlewareBase>();
|
||||||
private readonly List<ControllerBindingParameter> parameters;
|
private readonly List<ControllerBindingParameter> parameters;
|
||||||
private readonly ControllerBindingResult result;
|
private readonly ControllerBindingResult result;
|
||||||
|
|
||||||
|
@ -16,8 +16,8 @@ namespace Tapeti.Default
|
|||||||
private const string ClassTypeHeader = "classType";
|
private const string ClassTypeHeader = "classType";
|
||||||
|
|
||||||
|
|
||||||
private readonly ConcurrentDictionary<string, Type> deserializedTypeNames = new();
|
private readonly ConcurrentDictionary<string, Type> deserializedTypeNames = new ConcurrentDictionary<string, Type>();
|
||||||
private readonly ConcurrentDictionary<Type, string> serializedTypeNames = new();
|
private readonly ConcurrentDictionary<Type, string> serializedTypeNames = new ConcurrentDictionary<Type, string>();
|
||||||
private readonly JsonSerializerSettings serializerSettings;
|
private readonly JsonSerializerSettings serializerSettings;
|
||||||
|
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ namespace Tapeti.Default
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public object Deserialize(byte[] body, IMessageProperties properties)
|
public object Deserialize(byte[] body, IMessageProperties properties)
|
||||||
{
|
{
|
||||||
if (properties.ContentType is not ContentType)
|
if (!(properties.ContentType is ContentType))
|
||||||
throw new ArgumentException($"content_type must be {ContentType}");
|
throw new ArgumentException($"content_type must be {ContentType}");
|
||||||
|
|
||||||
var typeName = properties.GetHeader(ClassTypeHeader);
|
var typeName = properties.GetHeader(ClassTypeHeader);
|
||||||
|
@ -8,7 +8,7 @@ namespace Tapeti.Default
|
|||||||
{
|
{
|
||||||
internal class MessageContext : IMessageContext
|
internal class MessageContext : IMessageContext
|
||||||
{
|
{
|
||||||
private readonly Dictionary<Type, IMessageContextPayload> payloads = new();
|
private readonly Dictionary<Type, IMessageContextPayload> payloads = new Dictionary<Type, IMessageContextPayload>();
|
||||||
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@ -117,7 +117,7 @@ namespace Tapeti.Default
|
|||||||
// ReSharper disable once InconsistentNaming
|
// ReSharper disable once InconsistentNaming
|
||||||
public class KeyValuePayload : IMessageContextPayload, IDisposable, IAsyncDisposable
|
public class KeyValuePayload : IMessageContextPayload, IDisposable, IAsyncDisposable
|
||||||
{
|
{
|
||||||
private readonly Dictionary<string, object> items = new();
|
private readonly Dictionary<string, object> items = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
|
||||||
public KeyValuePayload(string key, object value)
|
public KeyValuePayload(string key, object value)
|
||||||
|
@ -10,7 +10,7 @@ namespace Tapeti.Default
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class MessageProperties : IMessageProperties
|
public class MessageProperties : IMessageProperties
|
||||||
{
|
{
|
||||||
private readonly Dictionary<string, string> headers = new();
|
private readonly Dictionary<string, string> headers = new Dictionary<string, string>();
|
||||||
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -13,7 +13,7 @@ namespace Tapeti.Default
|
|||||||
/// </example>
|
/// </example>
|
||||||
public class NamespaceMatchExchangeStrategy : IExchangeStrategy
|
public class NamespaceMatchExchangeStrategy : IExchangeStrategy
|
||||||
{
|
{
|
||||||
private static readonly Regex NamespaceRegex = new("^(Messaging\\.)?(?<exchange>[^\\.]+)", RegexOptions.Compiled | RegexOptions.Singleline);
|
private static readonly Regex NamespaceRegex = new Regex("^(Messaging\\.)?(?<exchange>[^\\.]+)", RegexOptions.Compiled | RegexOptions.Singleline);
|
||||||
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -28,9 +28,9 @@ namespace Tapeti.Default
|
|||||||
(?(?<=[A-Z])[A-Z](?=[a-z])|[A-Z])
|
(?(?<=[A-Z])[A-Z](?=[a-z])|[A-Z])
|
||||||
)";
|
)";
|
||||||
|
|
||||||
private static readonly Regex SeparatorRegex = new(SeparatorPattern, RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);
|
private static readonly Regex SeparatorRegex = new Regex(SeparatorPattern, RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);
|
||||||
|
|
||||||
private static readonly ConcurrentDictionary<Type, string> RoutingKeyCache = new();
|
private static readonly ConcurrentDictionary<Type, string> RoutingKeyCache = new ConcurrentDictionary<Type, string>();
|
||||||
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -10,7 +10,7 @@ namespace Tapeti.Helpers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ConnectionStringParser
|
public class ConnectionStringParser
|
||||||
{
|
{
|
||||||
private readonly TapetiConnectionParams result = new();
|
private readonly TapetiConnectionParams result = new TapetiAppSettingsConnectionParams();
|
||||||
|
|
||||||
private readonly string connectionstring;
|
private readonly string connectionstring;
|
||||||
private int pos = -1;
|
private int pos = -1;
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<PackageLicenseExpression>Unlicense</PackageLicenseExpression>
|
<PackageLicenseExpression>Unlicense</PackageLicenseExpression>
|
||||||
<PackageProjectUrl>https://github.com/MvRens/Tapeti</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/MvRens/Tapeti</PackageProjectUrl>
|
||||||
<PackageIcon>Tapeti.png</PackageIcon>
|
<PackageIcon>Tapeti.png</PackageIcon>
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>8</LangVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
@ -18,7 +18,7 @@ namespace Tapeti
|
|||||||
public class TapetiConfig : ITapetiConfigBuilder, ITapetiConfigBuilderAccess
|
public class TapetiConfig : ITapetiConfigBuilder, ITapetiConfigBuilderAccess
|
||||||
{
|
{
|
||||||
private Config config;
|
private Config config;
|
||||||
private readonly List<IControllerBindingMiddleware> bindingMiddleware = new();
|
private readonly List<IControllerBindingMiddleware> bindingMiddleware = new List<IControllerBindingMiddleware>();
|
||||||
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@ -189,7 +189,7 @@ namespace Tapeti
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected void RegisterDefaults()
|
protected void RegisterDefaults()
|
||||||
{
|
{
|
||||||
if (DependencyResolver is not IDependencyContainer container)
|
if (!(DependencyResolver is IDependencyContainer container))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (ConsoleHelper.IsAvailable())
|
if (ConsoleHelper.IsAvailable())
|
||||||
@ -225,9 +225,9 @@ namespace Tapeti
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
internal class Config : ITapetiConfig
|
internal class Config : ITapetiConfig
|
||||||
{
|
{
|
||||||
private readonly ConfigFeatures features = new();
|
private readonly ConfigFeatures features = new ConfigFeatures();
|
||||||
private readonly ConfigMiddleware middleware = new();
|
private readonly ConfigMiddleware middleware = new ConfigMiddleware();
|
||||||
private readonly ConfigBindings bindings = new();
|
private readonly ConfigBindings bindings = new ConfigBindings();
|
||||||
|
|
||||||
public IDependencyResolver DependencyResolver { get; }
|
public IDependencyResolver DependencyResolver { get; }
|
||||||
public ITapetiConfigFeatues Features => features;
|
public ITapetiConfigFeatues Features => features;
|
||||||
@ -291,8 +291,8 @@ namespace Tapeti
|
|||||||
|
|
||||||
internal class ConfigMiddleware : ITapetiConfigMiddleware
|
internal class ConfigMiddleware : ITapetiConfigMiddleware
|
||||||
{
|
{
|
||||||
private readonly List<IMessageMiddleware> messageMiddleware = new();
|
private readonly List<IMessageMiddleware> messageMiddleware = new List<IMessageMiddleware>();
|
||||||
private readonly List<IPublishMiddleware> publishMiddleware = new();
|
private readonly List<IPublishMiddleware> publishMiddleware = new List<IPublishMiddleware>();
|
||||||
|
|
||||||
|
|
||||||
public IReadOnlyList<IMessageMiddleware> Message => messageMiddleware;
|
public IReadOnlyList<IMessageMiddleware> Message => messageMiddleware;
|
||||||
|
@ -79,7 +79,7 @@ namespace Tapeti
|
|||||||
}
|
}
|
||||||
|
|
||||||
var methodQueueInfo = GetQueueInfo(method) ?? controllerQueueInfo;
|
var methodQueueInfo = GetQueueInfo(method) ?? controllerQueueInfo;
|
||||||
if (methodQueueInfo is not { IsValid: true })
|
if (!(methodQueueInfo is { IsValid: true }))
|
||||||
throw new TopologyConfigurationException(
|
throw new TopologyConfigurationException(
|
||||||
$"Method {method.Name} or controller {controller.Name} requires a queue attribute");
|
$"Method {method.Name} or controller {controller.Name} requires a queue attribute");
|
||||||
|
|
||||||
|
@ -12,10 +12,10 @@ namespace Tapeti.Tasks
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class SingleThreadTaskQueue : IDisposable
|
public class SingleThreadTaskQueue : IDisposable
|
||||||
{
|
{
|
||||||
private readonly object previousTaskLock = new();
|
private readonly object previousTaskLock = new object();
|
||||||
private Task previousTask = Task.CompletedTask;
|
private Task previousTask = Task.CompletedTask;
|
||||||
|
|
||||||
private readonly Lazy<SingleThreadTaskScheduler> singleThreadScheduler = new();
|
private readonly Lazy<SingleThreadTaskScheduler> singleThreadScheduler = new Lazy<SingleThreadTaskScheduler>();
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -70,7 +70,7 @@ namespace Tapeti.Tasks
|
|||||||
public override int MaximumConcurrencyLevel => 1;
|
public override int MaximumConcurrencyLevel => 1;
|
||||||
|
|
||||||
|
|
||||||
private readonly Queue<Task> scheduledTasks = new();
|
private readonly Queue<Task> scheduledTasks = new Queue<Task>();
|
||||||
private bool disposed;
|
private bool disposed;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user