diff --git a/src/ServiceAnt/IServiceBus.cs b/src/ServiceAnt/IServiceBus.cs index b899d49..3292c24 100644 --- a/src/ServiceAnt/IServiceBus.cs +++ b/src/ServiceAnt/IServiceBus.cs @@ -34,6 +34,25 @@ public enum LogLevel /// if happended exception, it will return it public delegate void LogBusMessage(LogLevel msgLevel, string message, Exception ex); + /// + /// TriggerOpion + /// + public class TriggerOption + { + /// + /// this value indicate whether ignore exception when triggering + /// + public bool IsIgnoreException { get; set; } + + /// + /// ctor + /// + public TriggerOption(bool isIgnoreException = true) + { + IsIgnoreException = isIgnoreException; + } + } + /// /// It used to publish event or send a request /// @@ -51,6 +70,14 @@ public interface IServiceBus : IAddSubscription, IAddRequestHandler /// Task Publish(IEventTrigger @event); + /// + /// Publish a event + /// + /// + /// + /// + Task Publish(IEventTrigger @event, TriggerOption triggerOption); + /// /// Send a request sync /// @@ -59,6 +86,15 @@ public interface IServiceBus : IAddSubscription, IAddRequestHandler /// T Send(IRequestTrigger @event); + /// + /// Send a request sync + /// + /// + /// + /// + /// + T Send(IRequestTrigger @event, TriggerOption triggerOption); + /// /// Send a request async /// @@ -66,5 +102,14 @@ public interface IServiceBus : IAddSubscription, IAddRequestHandler /// /// Task SendAsync(IRequestTrigger @event); + + /// + /// Send a request async + /// + /// + /// + /// + /// + Task SendAsync(IRequestTrigger @event, TriggerOption triggerOption); } } diff --git a/src/ServiceAnt/InProcessServiceBus.cs b/src/ServiceAnt/InProcessServiceBus.cs index c066455..ce277c8 100644 --- a/src/ServiceAnt/InProcessServiceBus.cs +++ b/src/ServiceAnt/InProcessServiceBus.cs @@ -122,8 +122,18 @@ public void RemoveDynamicSubscription(string eventName, Func acti /// public Task Publish(IEventTrigger @event) { - var asyncTask = ProcessEvent(_subcriptionManager.GetEventName(@event.GetType()), JsonConvert.SerializeObject(@event)); - return asyncTask; + return Publish(@event, new TriggerOption()); + } + + /// + /// Publish a event + /// + /// + /// + /// + public Task Publish(IEventTrigger @event, TriggerOption triggerOption) + { + return ProcessEvent(_subcriptionManager.GetEventName(@event.GetType()), JsonConvert.SerializeObject(@event), triggerOption); } /// @@ -132,11 +142,11 @@ public Task Publish(IEventTrigger @event) /// public void PublishSync(IEventTrigger @event) { - var asyncTask = ProcessEvent(_subcriptionManager.GetEventName(@event.GetType()), JsonConvert.SerializeObject(@event)); + var asyncTask = Publish(@event, new TriggerOption()); asyncTask.Wait(); } - private async Task ProcessEvent(string eventName, string message) + private async Task ProcessEvent(string eventName, string message, TriggerOption triggerOption) { var handlerFactories = _subcriptionManager.GetHandlerFactoriesForEvent(eventName); foreach (var aHandlerFactory in handlerFactories) @@ -165,6 +175,8 @@ private async Task ProcessEvent(string eventName, string message) catch (Exception ex) { LogMessage( LogLevel.ERROR, "There has caught a error when publishing event.", ex); + if (!triggerOption.IsIgnoreException) + throw ex; } } } @@ -244,7 +256,19 @@ public void RemoveDynamicRequestHandler(string eventName, Func public T Send(IRequestTrigger @event) { - var asyncTask = ProcessRequest(_requestHandlerManager.GetRequestName(@event.GetType()), JsonConvert.SerializeObject(@event)); + return Send(@event, new TriggerOption()); + } + + /// + /// Send a request sync + /// + /// + /// + /// + /// + public T Send(IRequestTrigger @event, TriggerOption triggerOption) + { + var asyncTask = SendAsync(@event, triggerOption); asyncTask.ConfigureAwait(false); return asyncTask.Result; } @@ -255,12 +279,24 @@ public T Send(IRequestTrigger @event) /// /// /// - public async Task SendAsync(IRequestTrigger @event) + public Task SendAsync(IRequestTrigger @event) + { + return SendAsync(@event, new TriggerOption(false)); + } + + /// + /// Send a request async + /// + /// + /// + /// + /// + public Task SendAsync(IRequestTrigger @event, TriggerOption triggerOption) { - return await ProcessRequest(_requestHandlerManager.GetRequestName(@event.GetType()), JsonConvert.SerializeObject(@event)); + return ProcessRequest(_requestHandlerManager.GetRequestName(@event.GetType()), JsonConvert.SerializeObject(@event), triggerOption); } - private async Task ProcessRequest(string eventName, string message) + private async Task ProcessRequest(string eventName, string message, TriggerOption triggerOption) { var handlerFactories = _requestHandlerManager.GetHandlerFactoriesForRequest(eventName); var requestContext = new RequestHandlerContext(); @@ -296,6 +332,8 @@ private async Task ProcessRequest(string eventName, string message) catch (Exception ex) { LogMessage(LogLevel.ERROR, "There has raised a error when send request.", ex); + if (!triggerOption.IsIgnoreException) + throw ex; } } @@ -306,10 +344,7 @@ private async Task ProcessRequest(string eventName, string message) private void LogMessage(LogLevel type, string value, Exception ex) { - if (OnLogBusMessage != null) - OnLogBusMessage(type, value, ex); - else - throw ex; + OnLogBusMessage?.Invoke(type, value, ex); } } } diff --git a/test/ServiceAnt.test/InProcessEventBus_Test.cs b/test/ServiceAnt.test/InProcessEventBus_Test.cs index 8c9e5c5..e2850a8 100644 --- a/test/ServiceAnt.test/InProcessEventBus_Test.cs +++ b/test/ServiceAnt.test/InProcessEventBus_Test.cs @@ -463,7 +463,7 @@ public void MutipleGenericRequestHandler_ByDifferentNameSpace_ShouldResponse() [TestMethod] [ExpectedException(typeof(Exception))] - public async Task ShouldRaiseException_WhenNoLogDelate() + public async Task ShouldRaiseException_WhenPublishSetOption() { var eventBus = new InProcessServiceBus(); @@ -476,7 +476,25 @@ public async Task ShouldRaiseException_WhenNoLogDelate() }); var testEventData = new TestEventData() { Msg = "success" }; - await eventBus.Publish(testEventData); + await eventBus.Publish(testEventData, new TriggerOption(false)); + } + + [TestMethod] + [ExpectedException(typeof(Exception))] + public async Task ShouldRaiseException_WhenSendSetOption() + { + var eventBus = new InProcessServiceBus(); + + eventBus.AddDynamicRequestHandler(typeof(TestRequestData).Name, (requestData, requetContext) => + { + return Task.Run(() => + { + throw new Exception("Test Exception"); + }); + }); + + var testRequestData = new TestRequestData() { Msg = "success" }; + await eventBus.SendAsync(testRequestData, new TriggerOption(false)); } [TestMethod]