Commit dc62bcb8 by dingsongjie

完成所有逻辑

parent 7ef7a1a7
using Grpc.Core; using Grpc.Core;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Pole.Core.Serialization; using Pole.Core.Serialization;
using Pole.Core.Utils.Abstraction; using Pole.Core.Utils.Abstraction;
...@@ -21,11 +22,15 @@ namespace Pole.Sagas.Client ...@@ -21,11 +22,15 @@ namespace Pole.Sagas.Client
private readonly PoleSagasOption options; private readonly PoleSagasOption options;
private readonly SagaClient sagaClient; private readonly SagaClient sagaClient;
private readonly SagaRestorer sagaRestorer; private readonly SagaRestorer sagaRestorer;
public NotEndedSagasCompensateRetryBackgroundService(IOptions<PoleSagasOption> options, SagaClient sagaClient, IServiceProvider serviceProvider) private readonly IEventSender eventSender;
private readonly ILogger logger;
public NotEndedSagasCompensateRetryBackgroundService(IOptions<PoleSagasOption> options, SagaClient sagaClient, IServiceProvider serviceProvider, IEventSender eventSender, ILogger logger)
{ {
this.options = options.Value; this.options = options.Value;
this.sagaClient = sagaClient; this.sagaClient = sagaClient;
sagaRestorer = new SagaRestorer(serviceProvider.GetRequiredService<ISnowflakeIdGenerator>(), serviceProvider, serviceProvider.GetRequiredService<IEventSender>(), this.options, serviceProvider.GetRequiredService<ISerializer>(), serviceProvider.GetRequiredService<IActivityFinder>()); sagaRestorer = new SagaRestorer(serviceProvider.GetRequiredService<ISnowflakeIdGenerator>(), serviceProvider, serviceProvider.GetRequiredService<IEventSender>(), this.options, serviceProvider.GetRequiredService<ISerializer>(), serviceProvider.GetRequiredService<IActivityFinder>());
this.eventSender = eventSender;
this.logger = logger;
} }
public async Task StartAsync(CancellationToken cancellationToken) public async Task StartAsync(CancellationToken cancellationToken)
...@@ -36,30 +41,43 @@ namespace Pole.Sagas.Client ...@@ -36,30 +41,43 @@ namespace Pole.Sagas.Client
{ {
if (stream.ResponseStream.Current.IsSuccess) if (stream.ResponseStream.Current.IsSuccess)
{ {
var sagas = stream.ResponseStream.Current.Sagas.Select(m => try
{ {
var result = new SagaEntity var sagas = stream.ResponseStream.Current.Sagas.Select(m =>
{ {
Id = m.Id, var result = new SagaEntity
}; {
result.ActivityEntities = m.Activities.Select(n => new ActivityEntity Id = m.Id,
{ };
CompensateTimes = n.CompensateTimes, result.ActivityEntities = m.Activities.Select(n => new ActivityEntity
ExecuteTimes = n.ExecuteTimes, {
Id = n.Id, CompensateTimes = n.CompensateTimes,
Name = n.Id, ExecuteTimes = n.ExecuteTimes,
Order = n.Order, Id = n.Id,
ParameterData = n.ParameterData.ToByteArray(), Name = n.Id,
SagaId = n.SagaId, Order = n.Order,
Status = n.Status ParameterData = n.ParameterData.ToByteArray(),
SagaId = n.SagaId,
Status = n.Status
}).ToList();
return result;
}).ToList(); }).ToList();
return result; sagas.ForEach(async sagaEntity =>
}).ToList(); {
sagas.ForEach(async sagaEntity => var saga = sagaRestorer.CreateSaga(sagaEntity);
{ var compensateResult = await saga.CompensateWhenRetry();
var saga = sagaRestorer.CreateSaga(sagaEntity); if (compensateResult)
await saga.CompensateWhenRetry(); {
}); var expiresAt = DateTime.UtcNow.AddSeconds(options.CompeletedSagaExpiredAfterSeconds);
await eventSender.SagaEnded(sagaEntity.Id, expiresAt);
}
});
}
catch(Exception ex)
{
logger.LogError(ex, "Errors in NotEndedSagasCompensateRetryBackgroundService CompensateRetry");
}
} }
} }
//await foreach (var getSagasResponse in stream.ResponseStream.ReadAllAsync(cancellationToken)) //await foreach (var getSagasResponse in stream.ResponseStream.ReadAllAsync(cancellationToken))
......
...@@ -131,6 +131,10 @@ namespace Pole.Sagas.Client ...@@ -131,6 +131,10 @@ namespace Pole.Sagas.Client
return true; return true;
} }
await RecursiveCompensateActivity(compensateActivity); await RecursiveCompensateActivity(compensateActivity);
if (activities.Any(m => m.ActivityStatus != ActivityStatus.Compensated|| m.ActivityStatus != ActivityStatus.CompensateAborted))
{
return false;
}
return true; return true;
} }
......
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 sign in to comment