diff --git a/src/EventBus.sln b/EventBus.sln similarity index 81% rename from src/EventBus.sln rename to EventBus.sln index d9319d4..2f33c0c 100644 --- a/src/EventBus.sln +++ b/EventBus.sln @@ -3,27 +3,27 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.2.32505.173 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus.Abstractions", "JKang.EventBus.Abstractions\JKang.EventBus.Abstractions.csproj", "{B32C9E22-C892-4F8C-8E49-30CBA5B971C1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus.Abstractions", "src\JKang.EventBus.Abstractions\JKang.EventBus.Abstractions.csproj", "{B32C9E22-C892-4F8C-8E49-30CBA5B971C1}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{8C1896E4-9A8F-4A76-B3D1-CCBB0A2F8037}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.EventBus.AspNetCore", "Samples.EventBus.AspNetCore\Samples.EventBus.AspNetCore.csproj", "{F0688B6D-EEE6-4AA3-BEC3-F73DD1FC0DA0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.EventBus.AspNetCore", "src\Samples.EventBus.AspNetCore\Samples.EventBus.AspNetCore.csproj", "{F0688B6D-EEE6-4AA3-BEC3-F73DD1FC0DA0}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C9D1DF75-9F6D-4201-AC2C-BA95E3A72C9A}" ProjectSection(SolutionItems) = preProject - Directory.Build.props = Directory.Build.props - ..\README.md = ..\README.md + src\Directory.Build.props = src\Directory.Build.props + README.md = README.md EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus.Core", "JKang.EventBus.Core\JKang.EventBus.Core.csproj", "{16EFDC3B-73CD-486C-9BD0-5700AFF8CCB4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus.Core", "src\JKang.EventBus.Core\JKang.EventBus.Core.csproj", "{16EFDC3B-73CD-486C-9BD0-5700AFF8CCB4}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus", "JKang.EventBus\JKang.EventBus.csproj", "{36024674-F10A-4A44-BC4E-24EBAA0D0CFC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus", "src\JKang.EventBus\JKang.EventBus.csproj", "{36024674-F10A-4A44-BC4E-24EBAA0D0CFC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus.AmazonSns", "JKang.EventBus.AmazonSns\JKang.EventBus.AmazonSns.csproj", "{C46D4B8E-4AAA-4889-A60A-89A9E9E10F50}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus.AmazonSns", "src\JKang.EventBus.AmazonSns\JKang.EventBus.AmazonSns.csproj", "{C46D4B8E-4AAA-4889-A60A-89A9E9E10F50}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.EventBus.ConsoleApp", "Samples.EventBus.Console\Samples.EventBus.ConsoleApp.csproj", "{CE18852E-385B-4C84-B023-F4135494BFDD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.EventBus.ConsoleApp", "src\Samples.EventBus.Console\Samples.EventBus.ConsoleApp.csproj", "{CE18852E-385B-4C84-B023-F4135494BFDD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus.AmazonSqs", "JKang.EventBus.AmazonSqs\JKang.EventBus.AmazonSqs.csproj", "{09867E42-1054-4651-A95E-B61B29ABE6EA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JKang.EventBus.AmazonSqs", "src\JKang.EventBus.AmazonSqs\JKang.EventBus.AmazonSqs.csproj", "{09867E42-1054-4651-A95E-B61B29ABE6EA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/README.md b/README.md index 505454b..afc26ce 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ * In-memory event dispatching (publishing and subscription) * publishing event to Amazon SNS * publishing event to Amazon SQS + * delayed execution of event handler ## NuGet packages @@ -61,11 +62,9 @@ ```csharp IServiceProvider serviceProvider = services.BuildServiceProvider(); - using (IServiceScope scope = serviceProvider.CreateScope()) - { - IEventPublisher eventPublisher = scope.ServiceProvider.GetRequiredService(); - eventPublisher.PublishEventAsync(new MyEvent { Message = "Hello, event bus!" }).Wait(); - } + using IServiceScope scope = serviceProvider.CreateScope(); + IEventPublisher eventPublisher = scope.ServiceProvider.GetRequiredService(); + await eventPublisher.PublishEventAsync(new MyEvent { Message = "Hello, event bus!" }, 3); ``` diff --git a/src/JKang.EventBus.Abstractions/IEventPublisher.cs b/src/JKang.EventBus.Abstractions/IEventPublisher.cs index 5148827..e397849 100644 --- a/src/JKang.EventBus.Abstractions/IEventPublisher.cs +++ b/src/JKang.EventBus.Abstractions/IEventPublisher.cs @@ -4,6 +4,6 @@ namespace JKang.EventBus { public interface IEventPublisher { - Task PublishEventAsync(TEvent @event); + Task PublishEventAsync(TEvent @event, int delaySeconds = 0); } } diff --git a/src/JKang.EventBus.AmazonSns/AmazonSnsEventPublisher.cs b/src/JKang.EventBus.AmazonSns/AmazonSnsEventPublisher.cs index cb65800..55c899b 100644 --- a/src/JKang.EventBus.AmazonSns/AmazonSnsEventPublisher.cs +++ b/src/JKang.EventBus.AmazonSns/AmazonSnsEventPublisher.cs @@ -21,7 +21,7 @@ public AmazonSnsEventPublisher( _options = options; } - public async Task PublishEventAsync(TEvent @event) + public async Task PublishEventAsync(TEvent @event, int delaySeconds = 0) { var endpoint = RegionEndpoint.GetBySystemName(_options.Value.Region); var client = new AmazonSimpleNotificationServiceClient(endpoint); @@ -40,6 +40,9 @@ public async Task PublishEventAsync(TEvent @event) string message = _eventSerializer.Serialize(@event); var publishRequest = new PublishRequest(topicArn, message); + + if(delaySeconds > 0) + await Task.Delay(delaySeconds * 1000); PublishResponse publishResponse = await client.PublishAsync(publishRequest); } } diff --git a/src/JKang.EventBus.AmazonSqs/AmazonSqsEventPublisher.cs b/src/JKang.EventBus.AmazonSqs/AmazonSqsEventPublisher.cs index ae8952a..085c624 100644 --- a/src/JKang.EventBus.AmazonSqs/AmazonSqsEventPublisher.cs +++ b/src/JKang.EventBus.AmazonSqs/AmazonSqsEventPublisher.cs @@ -20,7 +20,7 @@ public AmazonSqsEventPublisher( _options = options; } - public async Task PublishEventAsync(TEvent @event) + public async Task PublishEventAsync(TEvent @event, int delaySeconds = 0) { var regionEndpoint = RegionEndpoint.GetBySystemName(_options.Value.Region); var client = new AmazonSQSClient(_options.Value.AccessKeyId, _options.Value.SecretAccessKey, regionEndpoint); @@ -38,7 +38,9 @@ public async Task PublishEventAsync(TEvent @event) QueueUrl = queueUrl }; - var result = await client.SendMessageAsync(request); + if (delaySeconds > 0) + await Task.Delay(delaySeconds * 1000); + var sendMessageResponse = await client.SendMessageAsync(request); } } } diff --git a/src/JKang.EventBus.AmazonSqs/JKang.EventBus.AmazonSqs.csproj b/src/JKang.EventBus.AmazonSqs/JKang.EventBus.AmazonSqs.csproj index 955ac1d..6a7f49c 100644 --- a/src/JKang.EventBus.AmazonSqs/JKang.EventBus.AmazonSqs.csproj +++ b/src/JKang.EventBus.AmazonSqs/JKang.EventBus.AmazonSqs.csproj @@ -15,10 +15,10 @@ zh-Hans icon.png true - 1.0.0 + 1.0.1 LICENSE - Small trial ox knife + Delayed execution of event handler README.md @@ -27,12 +27,9 @@ - + - - - diff --git a/src/JKang.EventBus.Core/InMemory/InMemoryEventBus.cs b/src/JKang.EventBus.Core/InMemory/InMemoryEventBus.cs index b8ee06d..af4f1fa 100644 --- a/src/JKang.EventBus.Core/InMemory/InMemoryEventBus.cs +++ b/src/JKang.EventBus.Core/InMemory/InMemoryEventBus.cs @@ -15,7 +15,7 @@ public InMemoryEventBus(IServiceProvider serviceProvider) _serviceProvider = serviceProvider; } - public async Task PublishEventAsync(TEvent @event) + public async Task PublishEventAsync(TEvent @event, int delaySeconds = 0) { using (IServiceScope scope = _serviceProvider.CreateScope()) { @@ -23,6 +23,8 @@ public async Task PublishEventAsync(TEvent @event) Type openHandlerType = typeof(IEventHandler<>); Type handlerType = openHandlerType.MakeGenericType(eventType); IEnumerable handlers = scope.ServiceProvider.GetServices(handlerType); + if (delaySeconds > 0) + await Task.Delay(delaySeconds * 1000); foreach (object handler in handlers) { object result = handlerType diff --git a/src/JKang.EventBus.Core/Master/MasterEventBus.cs b/src/JKang.EventBus.Core/Master/MasterEventBus.cs index e6c5bc7..b985b33 100644 --- a/src/JKang.EventBus.Core/Master/MasterEventBus.cs +++ b/src/JKang.EventBus.Core/Master/MasterEventBus.cs @@ -14,11 +14,11 @@ public MasterEventBus( _eventPublishers = eventPublishers; } - public async Task PublishEventAsync(TEvent @event) + public async Task PublishEventAsync(TEvent @event, int delaySeconds = 0) { foreach (IEventPublisher publisher in _eventPublishers.GetEventPublishers()) { - await publisher.PublishEventAsync(@event); + await publisher.PublishEventAsync(@event, delaySeconds); } } } diff --git a/src/Samples.EventBus.Console/Program.cs b/src/Samples.EventBus.Console/Program.cs index 9f8dd22..b46a23d 100644 --- a/src/Samples.EventBus.Console/Program.cs +++ b/src/Samples.EventBus.Console/Program.cs @@ -1,12 +1,13 @@ using JKang.EventBus; using Microsoft.Extensions.DependencyInjection; using System; +using System.Threading.Tasks; namespace Samples.EventBus.ConsoleApp { class Program { - static void Main(string[] args) + static async Task Main(string[] args) { IServiceCollection services = new ServiceCollection(); @@ -18,16 +19,14 @@ static void Main(string[] args) subscriber.Subscribe(); //subscriber.SubscribeAllHandledEvents(); // other way }) - .PublishToAmazonSns(x => x.Region = "eu-west-3") + //.PublishToAmazonSns(x => x.Region = "eu-west-3") ; }); IServiceProvider serviceProvider = services.BuildServiceProvider(); - using (IServiceScope scope = serviceProvider.CreateScope()) - { - IEventPublisher eventPublisher = scope.ServiceProvider.GetRequiredService(); - eventPublisher.PublishEventAsync(new MyEvent { Message = "Hello, event bus!" }).Wait(); - } + using IServiceScope scope = serviceProvider.CreateScope(); + IEventPublisher eventPublisher = scope.ServiceProvider.GetRequiredService(); + await eventPublisher.PublishEventAsync(new MyEvent { Message = "Hello, event bus!" }, 3); } } }