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]