C# 捕获服务结构事件
我有一个处理下载请求的无状态服务结构。每个请求在数据库中持久化,并具有一个状态(输入、完成、待创建、错误) 我想在以下时间将所有请求状态从“输入”更新为“待创建”:C# 捕获服务结构事件,c#,azure-service-fabric,C#,Azure Service Fabric,我有一个处理下载请求的无状态服务结构。每个请求在数据库中持久化,并具有一个状态(输入、完成、待创建、错误) 我想在以下时间将所有请求状态从“输入”更新为“待创建”: -重新启动服务或特定节点。 -发布/升级服务 当服务重新启动时,我重写了OnCloseAsync方法,但我不知道在特定节点重新启动或服务发布时触发了哪个事件 using Abp.Boilerplate.Dependency; using Abp.Boilerplate.Events.Bus; using Boilerplate.Se
-重新启动服务或特定节点。
-发布/升级服务 当服务重新启动时,我重写了OnCloseAsync方法,但我不知道在特定节点重新启动或服务发布时触发了哪个事件
using Abp.Boilerplate.Dependency;
using Abp.Boilerplate.Events.Bus;
using Boilerplate.ServiceFabric.Common;
using Microsoft.ServiceFabric.Services.Runtime;
using Microsoft.ServiceFabric.Services.Communication.Runtime;
using System.Collections.Generic;
using System.Fabric;
using System.Threading;
using System.Threading.Tasks;
using System;
using FM.ReportingService.Api.Application.Shared.Contracts.Repositories;
using System.Runtime.Remoting.Contexts;
namespace FM.ReportingService.Api
{
/// <summary>
/// The FabricRuntime creates an instance of this class for each service type instance.
/// </summary>
internal sealed class ReportingService : StatelessService
{
public ReportingService(StatelessServiceContext context) : base(context)
{
IocManager.Instance.IsRegistered<IEventBus>(); // /!\ Hack to initialize IocManager.Instance first
}
/// <summary>
/// Optional override to create listeners (like tcp, http) for this service instance.
/// </summary>
/// <returns>The collection of listeners.</returns>
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
// Create aspnet core listner
yield return ServiceInstanceListenerFactory.CreateExternalListener(
typeof(Startup),
(serviceContext, message) => ServiceEventSource.Current.ServiceMessage(serviceContext, message));
}
protected override void OnAbort()
{
RenewPendingRequests().Wait();
}
protected override async Task OnCloseAsync(CancellationToken cancellationToken)
{
await RenewPendingRequests();
}
/// <inheritdoc />
private async Task RenewPendingRequests()
{
//var exportRepo = IocManager.Instance.IocContainer.Resolve<IExportRepository>();
//await exportRepo.RenewPendingRequests();
await EventBus.Default.TriggerAsync(new Application.Shared.Models.CloseAppEventData { TaskId = 42 });
}
protected override async Task RunAsync(CancellationToken cancellationToken)
{
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
await RenewPendingRequests();
return;
}
}
}
}
}
您是否需要知道停机背后的原因,或者有一个公共场所来处理服务停机是否足够?如果您仍然需要答案,您能否回答上述问题?
public async Task RenewPendingRequests()
{
async Task process()
{
var pendingRequests = _exportDbContext.Exports.Where(exportEntity => exportEntity.Status == ExportStatus.InProgress && exportEntity.SfInstanceId == _serviceFabricConfig.SfInstanceId)?.ToList();
pendingRequests.ForEach(req =>
{
req.Status = ExportStatus.New;
req.LastModificationTime = Clock.Now;
_exportDbContext.Update(req);
});
await _exportDbContext.SaveChangesAsync();
};
await TryCatchHelper.TrackTryCatchFinally(process, Wellknown.AppInsights.DependencyTypes.Sql, AppConsts.AppInsights.SqlServerFMReportingServicesDbDependency, nameof(GetNotTreateds), _ai);
}