Compare commits

...

2 Commits

Author SHA1 Message Date
小肥羊 a2c9831a0a 优化 重试流程 2024-11-26 15:57:12 +08:00
小肥羊 90cf56efec 优化 任务异常后重试机制 2024-11-26 14:47:23 +08:00
7 changed files with 91 additions and 38 deletions

View File

@ -5,7 +5,7 @@
@using SqlSugar @using SqlSugar
@using VideoAnalysisCore.Model @using VideoAnalysisCore.Model
<Table @ref="_table" Loading="tableLoading" TItem="CourseGradingCriteria" PageSize="15" Total="_total" DataSource="_dataSource" @bind-SelectedRows="_selectedRows" OnChange="OnChange"> <Table @ref="_table" Loading="tableLoading" TItem="CourseGradingCriteria" ScrollY="600px" PageSize="15" Total="_total" DataSource="_dataSource" @bind-SelectedRows="_selectedRows" OnChange="OnChange">
<TitleTemplate> <TitleTemplate>
<Flex Justify="end" Gap="10"> <Flex Justify="end" Gap="10">
<Button Type="primary" @onclick="()=> StartEdit(default)">新增</Button> <Button Type="primary" @onclick="()=> StartEdit(default)">新增</Button>

View File

@ -2,12 +2,13 @@
@using AntDesign @using AntDesign
@using AntDesign.TableModels @using AntDesign.TableModels
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@using Learn.VideoAnalysis.Controllers.Dto
@using SqlSugar @using SqlSugar
@using VideoAnalysisCore.Model @using VideoAnalysisCore.Model
@using VideoAnalysisCore.Model.Dto @using VideoAnalysisCore.Model.Dto
@using VideoAnalysisCore.Enum @using VideoAnalysisCore.Enum
<Table @ref="_table" Loading="tableLoading" TItem="VideoTaskDto" PageSize="15" Total="_total" DataSource="_dataSource" @bind-SelectedRows="_selectedRows" OnChange="OnChange" <Table @ref="_table" Loading="tableLoading" TItem="VideoTaskDto" ScrollY="600px" PageSize="10" Total="_total" DataSource="_dataSource" @bind-SelectedRows="_selectedRows" OnChange="OnChange"
OnExpand="OnExpand"> OnExpand="OnExpand">
<TitleTemplate> <TitleTemplate>
<Flex Justify="end" Gap="10"> <Flex Justify="end" Gap="10">
@ -16,13 +17,13 @@
</TitleTemplate> </TitleTemplate>
<ColumnDefinitions Context="row"> <ColumnDefinitions Context="row">
<Selection /> <Selection />
<PropertyColumn Property="c=>c.Id" Width="100" Filterable="true" Sortable="true"/> <PropertyColumn Property="c=>c.Id" Width="130px" Filterable="true" Sortable="true" />
<PropertyColumn Property="c=>c.TagId" Width="100" /> <PropertyColumn Property="c=>c.TagId" Width="160px" />
<PropertyColumn Property="c=>c.LastEnum" Width="120" /> <PropertyColumn Property="c=>c.LastEnum" Width="150px" />
<PropertyColumn Property="c=>c.ApiToken" Width="120" /> <PropertyColumn Property="c=>c.ApiToken" Width="150px" />
<PropertyColumn Property="c=>c.ComeFrom" Width="120" /> <PropertyColumn Property="c=>c.ComeFrom" Width="100px" />
<PropertyColumn Property="c=>c.MediaUrl" Width="300" /> <PropertyColumn Property="c=>c.MediaUrl" Width="320px" />
<PropertyColumn Property="c=>c.TotalTokens" Width="100" /> <PropertyColumn Property="c=>c.TotalTokens" Width="100px" />
<PropertyColumn Property="c=>c.CreateTime" /> <PropertyColumn Property="c=>c.CreateTime" />
</ColumnDefinitions> </ColumnDefinitions>
<ExpandTemplate Context="rowData"> <ExpandTemplate Context="rowData">
@ -38,7 +39,7 @@
OnClick="()=>RowRestart(rowData)"> OnClick="()=>RowRestart(rowData)">
刷新数据 刷新数据
</Button> </Button>
<Button Type="@ButtonType.Primary" Danger @onclick="() => ReStart(rowData.Data)"> <Button Type="@ButtonType.Primary" Danger @onclick="() => ReStartClick(rowData.Data)">
重试 重试
</Button> </Button>
</DescriptionsItem> </DescriptionsItem>
@ -76,3 +77,22 @@
</ExpandTemplate> </ExpandTemplate>
</Table> </Table>
<Modal Title="重试任务"
Width="400"
OnOk="ReStart"
@bind-Visible="@modalShow">
<Title Level="3">ID : @reStartTask.Id</Title>
<p></p>
<p>将从哪个步骤重试?</p>
<Select Style="width:220px;"
DataSource="SelectDataSource"
LabelName="@nameof(TextValue.Text)"
ValueName="@nameof(TextValue.Value)"
@bind-Value="@selectEnum">
</Select>
<br />
<br />
</Modal>

View File

@ -1,6 +1,7 @@
using AntDesign; using AntDesign;
using AntDesign.TableModels; using AntDesign.TableModels;
using FFmpeg.NET.Services; using FFmpeg.NET.Services;
using Learn.VideoAnalysis.Controllers.Dto;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.DataProtection.KeyManagement; using Microsoft.AspNetCore.DataProtection.KeyManagement;
@ -28,19 +29,41 @@ namespace Learn.VideoAnalysis.Components.Pages
List<VideoTaskDto> _dataSource = null; List<VideoTaskDto> _dataSource = null;
RefAsync<int> _total = 0; RefAsync<int> _total = 0;
bool modalShow = false;
bool tableLoading = false; bool tableLoading = false;
private VideoTaskDto selectData; private VideoTaskDto selectData;
private bool rowRestartLoading = false; private bool rowRestartLoading = false;
private VideoTaskDto reStartTask ;
TextValue[] SelectDataSource = Enum.GetValues(typeof(RedisChannelEnum))
.Cast<RedisChannelEnum>()
.Select(s => new TextValue(s.ToString(), (int)s))
.ToArray();
int selectEnum = 1;
int selectDefaultValue =1;
/// <summary>
/// 点击重试
/// </summary>
/// <param name="query"></param>
async void ReStartClick(VideoTaskDto query)
{
selectDefaultValue =
(await RedisExpand.Redis.HMGetAsync<int>(RedisExpandKey.Task(query.Id), "LastEnum")).FirstOrDefault();
selectEnum = selectDefaultValue;
reStartTask = query;
modalShow = true;
}
/// <summary> /// <summary>
/// 重试 /// 重试
/// </summary> /// </summary>
/// <param name="query"></param> /// <param name="query"></param>
async void ReStart(VideoTaskDto query) async void ReStart()
{ {
var lastEnum = (await RedisExpand.Redis.HMGetAsync<RedisChannelEnum>(RedisExpandKey.Task(query.Id), "LastEnum")).FirstOrDefault() ; await RedisExpand.SetTaskErrorMessage(reStartTask.Id, null);
await RedisExpand.SetTaskErrorMessage(query.Id, null); RedisExpand.InsertChannel((RedisChannelEnum)selectEnum, reStartTask.Id);
RedisExpand.InsertChannel(lastEnum, query.Id); modalShow = false;
} }
private QueryModel<VideoTaskDto> lastQuery = null; private QueryModel<VideoTaskDto> lastQuery = null;
/// <summary> /// <summary>
@ -76,6 +99,7 @@ namespace Learn.VideoAnalysis.Components.Pages
_dataSource = await taskDB.AsQueryable() _dataSource = await taskDB.AsQueryable()
.Where(where) .Where(where)
.Select<VideoTaskDto>() .Select<VideoTaskDto>()
.OrderByDescending(s => s.Id)
.ToPageListAsync(query.PageIndex - 1, query.PageSize, _total); .ToPageListAsync(query.PageIndex - 1, query.PageSize, _total);
tableLoading = false; tableLoading = false;

View File

@ -157,6 +157,8 @@ namespace Learn.VideoAnalysis.Controllers
{ {
if (!ModelState.IsValid) return BadRequest(ModelState); if (!ModelState.IsValid) return BadRequest(ModelState);
if(await videoTaskDB.IsAnyAsync(s=>s.TagId == req.TagId) )
return BadRequest("重复添加");
// 自动映射属性到哈希 // 自动映射属性到哈希
var task = new VideoTask() var task = new VideoTask()
{ {

View File

@ -49,7 +49,8 @@ namespace Learn.VideoAnalysis.Controllers.Dto
} }
public TextValue(string t,object v) public TextValue(string t,object v)
{ {
Text = t;
Value = v;
} }
public TextValue() public TextValue()
{ {

View File

@ -183,15 +183,15 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
private async Task<HttpResponseMessage> PostJsonStreamAsync(string path, string json) private async Task<HttpResponseMessage> PostJsonStreamAsync(string path, string json)
{ {
var client = _httpClientFactory.CreateClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ApiKey);
var request = ToHttpRequest(path);
var maxRestart = 4; var maxRestart = 4;
var errorMSG = new Exception[maxRestart]; var errorMSG = new Exception[maxRestart];
for (int i = 0; i < maxRestart; i++) for (int i = 0; i < maxRestart; i++)
{ {
try try
{ {
var client = _httpClientFactory.CreateClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ApiKey);
var request = ToHttpRequest(path);
request.Content = new StringContent(json, Encoding.UTF8, "application/json"); request.Content = new StringContent(json, Encoding.UTF8, "application/json");
return await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); return await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
} }

View File

@ -283,6 +283,7 @@ namespace VideoAnalysisCore.Common
var tID = long.Parse(taskId); var tID = long.Parse(taskId);
if (action is not null) if (action is not null)
{ {
var errArr = new Exception[3];
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
{ {
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "-> 开始执行 " + key + " " + taskId); Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "-> 开始执行 " + key + " " + taskId);
@ -299,11 +300,16 @@ namespace VideoAnalysisCore.Common
} }
catch (Exception ex) catch (Exception ex)
{ {
errArr[i] = ex;
Console.WriteLine("====================[出现异常]====================");
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
Console.WriteLine("==============================================");
Thread.Sleep(1000); Thread.Sleep(1000);
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "-> 稍后后重试." + key + " " + taskId ); Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "-> 稍后后重试." + key + " " + taskId );
await SetTaskErrorMessage(tID, ex);
} }
} }
await SetTaskErrorMessage(tID, errArr.First());
} }
else else
{ {