Commit 81171e00 authored by Savorboard's avatar Savorboard

refactor

parent bb124384
using System; using System.Threading.Tasks;
using System.Collections.Generic; using DotNetCore.CAP.Models;
using System.Text;
using System.Threading.Tasks;
namespace DotNetCore.CAP namespace DotNetCore.CAP
{ {
public interface ICallbackPublisher public interface ICallbackPublisher
{ {
Task PublishAsync(string name, object obj); Task PublishAsync(CapPublishedMessage obj);
} }
} }
...@@ -23,16 +23,14 @@ namespace DotNetCore.CAP.Internal ...@@ -23,16 +23,14 @@ namespace DotNetCore.CAP.Internal
{ {
_modelBinderFactory = modelBinderFactory; _modelBinderFactory = modelBinderFactory;
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); _logger = logger;
_consumerContext = consumerContext;
_consumerContext = consumerContext ?? throw new ArgumentNullException(nameof(consumerContext));
_executor = ObjectMethodExecutor.Create(_consumerContext.ConsumerDescriptor.MethodInfo, _executor = ObjectMethodExecutor.Create(_consumerContext.ConsumerDescriptor.MethodInfo,
_consumerContext.ConsumerDescriptor.ImplTypeInfo); _consumerContext.ConsumerDescriptor.ImplTypeInfo);
} }
public async Task InvokeAsync() public async Task InvokeAsync()
{
using (_logger.BeginScope("consumer invoker begin"))
{ {
_logger.LogDebug("Executing consumer Topic: {0}", _consumerContext.ConsumerDescriptor.MethodInfo.Name); _logger.LogDebug("Executing consumer Topic: {0}", _consumerContext.ConsumerDescriptor.MethodInfo.Name);
...@@ -40,47 +38,86 @@ namespace DotNetCore.CAP.Internal ...@@ -40,47 +38,86 @@ namespace DotNetCore.CAP.Internal
_consumerContext.ConsumerDescriptor.ImplTypeInfo.AsType()); _consumerContext.ConsumerDescriptor.ImplTypeInfo.AsType());
var jsonConent = _consumerContext.DeliverMessage.Content; var jsonConent = _consumerContext.DeliverMessage.Content;
var message = Helper.FromJson<Message>(jsonConent); var message = Helper.FromJson<Message>(jsonConent);
object returnObj = null; object result = null;
if (_executor.MethodParameters.Length > 0) if (_executor.MethodParameters.Length > 0)
{
result = await ExecuteWithParameterAsync(obj, message.Content.ToString());
}
else
{
result = await ExecuteAsync(obj);
}
if (!string.IsNullOrEmpty(message.CallbackName))
{
await SentCallbackMessage(message.Id, message.CallbackName, result);
}
}
private async Task<object> ExecuteAsync(object @class)
{
if (_executor.IsMethodAsync)
{
return await _executor.ExecuteAsync(@class);
}
else
{
return _executor.Execute(@class);
}
}
private async Task<object> ExecuteWithParameterAsync(object @class, string parameterString)
{ {
var firstParameter = _executor.MethodParameters[0]; var firstParameter = _executor.MethodParameters[0];
try try
{ {
var binder = _modelBinderFactory.CreateBinder(firstParameter); var binder = _modelBinderFactory.CreateBinder(firstParameter);
var result = await binder.BindModelAsync(message.Content.ToString()); var bindResult = await binder.BindModelAsync(parameterString);
if (result.IsSuccess) if (bindResult.IsSuccess)
{ {
returnObj = _executor.Execute(obj, result.Model); if (_executor.IsMethodAsync)
{
return await _executor.ExecuteAsync(@class, bindResult.Model);
} }
else else
{ {
_logger.LogWarning($"Parameters:{firstParameter.Name} bind failed! the content is:" + jsonConent); return _executor.Execute(@class, bindResult.Model);
} }
} }
catch (FormatException ex) else
{ {
_logger.ModelBinderFormattingException(_executor.MethodInfo?.Name, firstParameter.Name, jsonConent, ex); throw new MethodBindException($"Parameters:{firstParameter.Name} bind failed! ParameterString is: {parameterString} ");
} }
} }
else catch (FormatException ex)
{ {
returnObj = _executor.Execute(obj); _logger.ModelBinderFormattingException(_executor.MethodInfo?.Name, firstParameter.Name, parameterString, ex);
return null;
}
} }
//TODO :refactor private async Task SentCallbackMessage(string messageId, string topicName, object bodyObj)
if (returnObj != null && !string.IsNullOrEmpty(message.CallbackName))
{ {
var publisher = _serviceProvider.GetRequiredService<ICallbackPublisher>(); var callbackMessage = new Message
var callbackMessage = new Message(returnObj)
{ {
Id = message.Id, Id = messageId,
Timestamp = DateTime.Now Content = bodyObj
}; };
await publisher.PublishAsync(message.CallbackName, callbackMessage);
} using (var scope = _serviceProvider.CreateScope())
{
var provider = scope.ServiceProvider;
var publisher = provider.GetRequiredService<ICallbackPublisher>();
var publishedMessage = new CapPublishedMessage
{
Name = topicName,
Content = Helper.ToJson(callbackMessage),
StatusName = StatusName.Scheduled
};
await publisher.PublishAsync(publishedMessage);
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment