Преглед изворни кода

新稱AddServiceBus DI與擴充方法

JAELYS пре 4 година
родитељ
комит
ae300b34fd

+ 104 - 0
TEAMModelOS.SDK/DI/AzureServiceBus/AzureServiceBusExtensions.cs

@@ -0,0 +1,104 @@
+using Microsoft.Azure.Cosmos.Table;
+using Microsoft.Azure.Cosmos.Table.Queryable;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Linq;
+using Azure.Messaging.ServiceBus;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+
+namespace TEAMModelOS.SDK.DI
+{
+    public static class AzureServiceBusExtensions
+    {
+        /// <summary>
+        /// 發送信息至對列或主題
+        /// </summary>       
+        /// <param name="pathName">QueueName or TopicName</param>
+        /// <param name="message">訊息</param>
+        /// <returns></returns>
+        public static async Task SendMessageAsync(this ServiceBusClient client, string pathName, string message)
+        {
+            try
+            {
+                ServiceBusSender sender = client.CreateSender(pathName);
+                await sender.SendMessageAsync(new ServiceBusMessage(Encoding.UTF8.GetBytes(message)));
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        /// <summary>
+        /// 批量發送訊息至對列或主題,如果批量失敗返回False
+        /// </summary>       
+        /// <param name="pathName">QueueName or TopicName</param>
+        /// <param name="messages">批量訊息</param>
+        /// <returns></returns>
+        public static async Task<bool> SendBatchMessageAsync(this ServiceBusClient client, string pathName, IList<string> messages)
+        {
+            try
+            {
+                ServiceBusSender sender = client.CreateSender(pathName);
+                ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
+                foreach (var msg in messages)
+                {
+                    if (!messageBatch.TryAddMessage(new ServiceBusMessage(Encoding.UTF8.GetBytes(msg)))) return false;
+                }
+                await sender.SendMessagesAsync(messageBatch);
+                return true;
+            }
+            catch
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 發送信息至對列或主題(指定時間排程)
+        /// </summary>       
+        /// <param name="pathName">QueueName or TopicName</param>
+        /// <param name="message">訊息</param>
+        /// <returns>排程訊息的序列號。</returns>
+        public static async Task<long> SendScheduleMessageAsync(this ServiceBusClient client, string pathName, string message, DateTimeOffset scheduleTime)
+        {
+            try
+            {
+                ServiceBusSender sender = client.CreateSender(pathName);
+                return await sender.ScheduleMessageAsync(new ServiceBusMessage(Encoding.UTF8.GetBytes(message)), scheduleTime);
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        /// <summary>
+        /// 批量發送訊息至對列或主題(指定時間排程),如果批量失敗返回False
+        /// </summary>       
+        /// <param name="pathName">QueueName or TopicName</param>
+        /// <param name="messages">批量訊息</param>
+        /// <returns>排程訊息的序列號</returns>
+        public static async Task<long[]> SendScheduleMessagesAsync(this ServiceBusClient client, string pathName, IList<string> messages, DateTimeOffset scheduleTime)
+        {
+            try
+            {
+                ServiceBusSender sender = client.CreateSender(pathName);
+                List<ServiceBusMessage> msgs = new List<ServiceBusMessage>() { };
+                foreach (var msg in messages)
+                {
+                    msgs.Add(new ServiceBusMessage(Encoding.UTF8.GetBytes(msg)));
+                }
+                return await sender.ScheduleMessagesAsync(msgs, scheduleTime);
+            }
+            catch
+            {
+                return null;
+            }
+        }
+    }
+}

+ 63 - 0
TEAMModelOS.SDK/DI/AzureServiceBus/AzureServiceBusFactory.cs

@@ -0,0 +1,63 @@
+
+using Microsoft.Azure.Cosmos.Table;
+using Microsoft.Extensions.Options;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Microsoft.Extensions.DependencyInjection;
+using Azure.Storage.Blobs;
+using Azure.Storage.Blobs.Models;
+using Azure.Storage.Blobs.Specialized;
+using StackExchange.Redis;
+using System.Collections.Concurrent;
+using Azure.Messaging.ServiceBus;
+
+namespace TEAMModelOS.SDK.DI
+{
+    public class AzureServiceBusFactory
+    {
+        private readonly IServiceProvider _services;
+        private readonly IOptionsMonitor<AzureServiceBusFactoryOptions> _optionsMonitor;
+        private readonly ILogger _logger;
+        private ConcurrentDictionary<string, ServiceBusClient> ServiceBusClients { get; } = new ConcurrentDictionary<string, ServiceBusClient>();
+        public AzureServiceBusFactory(IServiceProvider services, IOptionsMonitor<AzureServiceBusFactoryOptions> optionsMonitor, ILogger<AzureServiceBusFactory> logger)
+        {
+            if (services == null) throw new ArgumentNullException(nameof(services));
+            if (optionsMonitor == null) throw new ArgumentNullException(nameof(optionsMonitor));
+
+            _services = services;
+            _optionsMonitor = optionsMonitor;
+            _logger = logger;            
+        }
+
+        public ServiceBusClient GetServiceBusClient(string name = "Default")
+        {           
+            try
+            {
+                var client = ServiceBusClients.GetOrAdd(name, x => new ServiceBusClient(_optionsMonitor.Get(name).ServiceBusConnectionString));               
+                return client;
+            }
+            catch (OptionsValidationException e)
+            {
+                _logger?.LogWarning(e, e.Message);
+                return null;
+            }
+        }
+
+        public TopicClient GetTopicClient(ReceiveMode receiveMode, string name = "Default")
+        {
+            try
+            {
+                ServiceBusConnectionStringBuilder builder = new ServiceBusConnectionStringBuilder(_optionsMonitor.Get(name).ServiceBusConnectionString);
+                TopicClient client = new TopicClient(builder, receiveMode);
+                return client;
+            }
+            catch (OptionsValidationException e)
+            {
+                _logger?.LogWarning(e, e.Message);
+                return null;
+            }
+        }
+    }
+}

+ 22 - 0
TEAMModelOS.SDK/DI/AzureServiceBus/AzureServiceBusFactoryExtensions.cs

@@ -0,0 +1,22 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.DI
+{
+    public static class AzureServiceBusFactoryExtensions
+    {
+        public static IServiceCollection AddAzureServiceBus(this IServiceCollection services, string connectionString, string name = "Default")
+        {
+            if (services == null) throw new ArgumentNullException(nameof(services));            
+            if (connectionString == null) throw new ArgumentNullException(nameof(connectionString));
+
+            services.TryAddSingleton<AzureServiceBusFactory>();
+            services.Configure<AzureServiceBusFactoryOptions>(name, o => { o.Name = name; o.ServiceBusConnectionString = connectionString; });
+
+            return services;
+        }
+    }
+}

+ 14 - 0
TEAMModelOS.SDK/DI/AzureServiceBus/AzureServiceBusFactoryOptions.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.DI
+{
+    public class AzureServiceBusFactoryOptions
+    {
+        public string Name { get; set; }
+        public string ServiceBusConnectionString { get; set; }
+    }
+
+   
+}

+ 1 - 1
TEAMModelOS.SDK/TEAMModelOS.SDK.csproj

@@ -20,6 +20,7 @@
   <ItemGroup>
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.1.0" />
     <PackageReference Include="Azure.Cosmos" Version="4.0.0-preview3" />
+    <PackageReference Include="Azure.Messaging.ServiceBus" Version="7.0.0-preview.4" />
     <PackageReference Include="Azure.Storage.Blobs.Batch" Version="12.2.1" />
     <PackageReference Include="Azure.Storage.Queues" Version="12.3.2" />
     <PackageReference Include="ClouDASLibx" Version="1.1.4" />
@@ -37,7 +38,6 @@
     <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
     <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="3.1.6" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.6" />
-    <PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.1.3" />
     <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
     <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.6" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.6" />