提交.Net6版本
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Yi.Framework.Common.IOCOptions;
|
||||
using Yi.Framework.Common.Models;
|
||||
using Yi.Framework.Common.QueueModel;
|
||||
using Yi.Framework.Core;
|
||||
using Yi.Framework.Core.ConsulExtend;
|
||||
|
||||
namespace Yi.Framework.StaticPageProcessor
|
||||
{
|
||||
public class InitPageWorker : BackgroundService
|
||||
{
|
||||
private readonly IConfiguration _configuration;
|
||||
private readonly ILogger<InitPageWorker> _logger;
|
||||
private readonly RabbitMQInvoker _RabbitMQInvoker;
|
||||
private readonly AbstractConsulDispatcher _AbstractConsulDispatcher = null;
|
||||
|
||||
public InitPageWorker(ILogger<InitPageWorker> logger, RabbitMQInvoker rabbitMQInvoker, IConfiguration configuration, AbstractConsulDispatcher abstractConsulDispatcher)
|
||||
{
|
||||
this._logger = logger;
|
||||
this._RabbitMQInvoker = rabbitMQInvoker;
|
||||
this._configuration = configuration;
|
||||
this._AbstractConsulDispatcher = abstractConsulDispatcher;
|
||||
|
||||
}
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
RabbitMQConsumerModel rabbitMQConsumerModel = new RabbitMQConsumerModel()
|
||||
{
|
||||
ExchangeName = RabbitMQExchangeQueueName.SKUCQRS_Exchange,
|
||||
QueueName = RabbitMQExchangeQueueName.SKUCQRS_Queue_StaticPage
|
||||
};
|
||||
HttpClient _HttpClient = new HttpClient();
|
||||
this._RabbitMQInvoker.RegistReciveAction(rabbitMQConsumerModel, message =>
|
||||
{
|
||||
SPUCQRSQueueModel skuCQRSQueueModel = JsonConvert.DeserializeObject<SPUCQRSQueueModel>(message);
|
||||
|
||||
string detailUrl = this._AbstractConsulDispatcher.GetAddress(this._configuration["DetailPageUrl"]);
|
||||
string totalUrl = null;
|
||||
switch (skuCQRSQueueModel.CQRSType)
|
||||
{
|
||||
case (int)SPUCQRSQueueModelType.Insert:
|
||||
totalUrl = $"{detailUrl}{skuCQRSQueueModel.SpuId}.html";
|
||||
break;
|
||||
case (int)SPUCQRSQueueModelType.Update:
|
||||
totalUrl = $"{detailUrl}{skuCQRSQueueModel.SpuId}.html";
|
||||
break;
|
||||
case (int)SPUCQRSQueueModelType.Delete:
|
||||
totalUrl = $"{detailUrl}{skuCQRSQueueModel.SpuId}.html?ActionHeader=Delete";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var result = _HttpClient.GetAsync(totalUrl).Result;
|
||||
if (result.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
this._logger.LogInformation($"{nameof(WarmupPageWorker)}.Init succeed {totalUrl}");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
this._logger.LogWarning($"{nameof(WarmupPageWorker)}.Init succeed {totalUrl}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var logModel = new LogModel()
|
||||
{
|
||||
OriginalClassName = this.GetType().FullName,
|
||||
OriginalMethodName = nameof(ExecuteAsync),
|
||||
Remark = "<22><>ʱ<EFBFBD><CAB1>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־"
|
||||
};
|
||||
this._logger.LogError(ex, $"{nameof(WarmupPageWorker)}.Init failed {totalUrl}, Exception:{ex.Message}", JsonConvert.SerializeObject(logModel));
|
||||
return false;
|
||||
}
|
||||
});
|
||||
await Task.CompletedTask;
|
||||
//while (!stoppingToken.IsCancellationRequested)
|
||||
//{
|
||||
// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
|
||||
// await Task.Delay(1000, stoppingToken);
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<log4net>
|
||||
<!-- 将日志以回滚文件的形式写到文件中 -->
|
||||
<!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
|
||||
<!--Error-->
|
||||
<appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
|
||||
<!--不加utf-8编码格式,中文字符将显示成乱码-->
|
||||
<param name="Encoding" value="utf-8" />
|
||||
<file value="log/"/>
|
||||
<appendToFile value="true" />
|
||||
<rollingStyle value="Date" />
|
||||
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
|
||||
<datePattern value=""GlobalExceptionLogs_"yyyyMMdd".log"" />
|
||||
<!--日志文件名是否为静态-->
|
||||
<StaticLogFileName value="false"/>
|
||||
<!--多线程时采用最小锁定-->
|
||||
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
|
||||
<!--布局(向用户显示最后经过格式化的输出信息)-->
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="%date| %-5level %newline%message%newline--------------------------------%newline" />
|
||||
</layout>
|
||||
<filter type="log4net.Filter.LevelRangeFilter">
|
||||
<levelMin value="ERROR" />
|
||||
<levelMax value="FATAL" />
|
||||
</filter>
|
||||
</appender>
|
||||
<!--Error-->
|
||||
|
||||
|
||||
|
||||
<!--Info-->
|
||||
<appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
|
||||
<!--不加utf-8编码格式,中文字符将显示成乱码-->
|
||||
<param name="Encoding" value="utf-8" />
|
||||
<!--定义文件存放位置-->
|
||||
<file value="log/"/>
|
||||
<appendToFile value="true" />
|
||||
<rollingStyle value="Date" />
|
||||
<!--日志文件名是否为静态-->
|
||||
<StaticLogFileName value="false"/>
|
||||
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
|
||||
<datePattern value=""GlobalInfoLogs_"yyyyMMdd".log"" />
|
||||
<!--多线程时采用最小锁定-->
|
||||
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
|
||||
<!--布局(向用户显示最后经过格式化的输出信息)-->
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="%date| %-5level%c %newline%message%newline--------------------------------%newline" />
|
||||
</layout>
|
||||
<filter type="log4net.Filter.LevelRangeFilter">
|
||||
<levelMin value="DEBUG" />
|
||||
<levelMax value="WARN" />
|
||||
</filter>
|
||||
</appender>
|
||||
<!--Info-->
|
||||
|
||||
<root>
|
||||
<!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
|
||||
<!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 -->
|
||||
<!-- 如果没有定义LEVEL的值,则缺省为DEBUG -->
|
||||
<level value="ALL" />
|
||||
<!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
|
||||
<appender-ref ref="ErrorLog" />
|
||||
<appender-ref ref="InfoLog" />
|
||||
</root>
|
||||
</log4net>
|
||||
@@ -0,0 +1,67 @@
|
||||
using Com.Ctrip.Framework.Apollo;
|
||||
using Com.Ctrip.Framework.Apollo.Core;
|
||||
using Com.Ctrip.Framework.Apollo.Enums;
|
||||
using Com.Ctrip.Framework.Apollo.Logging;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using Yi.Framework.Common.IOCOptions;
|
||||
using Yi.Framework.Core;
|
||||
using Yi.Framework.Core.ConsulExtend;
|
||||
|
||||
namespace Yi.Framework.StaticPageProcessor
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
CreateHostBuilder(args).Build().Run();
|
||||
}
|
||||
|
||||
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||
Host.CreateDefaultBuilder(args)
|
||||
.ConfigureAppConfiguration((hostBuilderContext, configurationBuilder) =>
|
||||
{
|
||||
configurationBuilder.AddCommandLine(args);
|
||||
configurationBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false);
|
||||
configurationBuilder.AddJsonFile("configuration.json", optional: false, reloadOnChange: true);
|
||||
#region
|
||||
//Apollo配置
|
||||
#endregion
|
||||
//configurationBuilder.AddApolloService("Yi");
|
||||
})
|
||||
.ConfigureLogging(loggingBuilder =>
|
||||
{
|
||||
loggingBuilder.AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Warning);
|
||||
loggingBuilder.AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Warning);
|
||||
loggingBuilder.AddLog4Net();
|
||||
})
|
||||
.ConfigureServices((hostContext, services) =>
|
||||
{
|
||||
|
||||
IConfiguration configuration = services.BuildServiceProvider().GetRequiredService<IConfiguration>();
|
||||
|
||||
services.AddHostedService<Worker>();
|
||||
services.AddHostedService<InitPageWorker>();
|
||||
|
||||
#region 服务注入
|
||||
//services.Configure<MySqlConnOptions>(configuration.GetSection("MysqlConn"));
|
||||
|
||||
services.AddTransient<CacheClientDB, CacheClientDB>();
|
||||
services.Configure<RedisConnOptions>(configuration.GetSection("RedisConn"));
|
||||
|
||||
services.AddSingleton<RabbitMQInvoker>();
|
||||
services.Configure<RabbitMQOptions>(configuration.GetSection("RabbitMQOptions"));
|
||||
#endregion
|
||||
|
||||
#region Consul
|
||||
services.Configure<ConsulClientOption>(configuration.GetSection("ConsulClientOption"));
|
||||
services.AddTransient<AbstractConsulDispatcher, PollingDispatcher>();
|
||||
#endregion
|
||||
|
||||
services.AddHostedService<WarmupPageWorker>();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Yi.Framework.Common.IOCOptions;
|
||||
using Yi.Framework.Common.Models;
|
||||
using Yi.Framework.Common.QueueModel;
|
||||
using Yi.Framework.Core;
|
||||
using Yi.Framework.Core.ConsulExtend;
|
||||
|
||||
namespace Yi.Framework.StaticPageProcessor
|
||||
{
|
||||
public class WarmupPageWorker : BackgroundService
|
||||
{
|
||||
private readonly IConfiguration _configuration;
|
||||
private readonly ILogger<WarmupPageWorker> _logger;
|
||||
private readonly RabbitMQInvoker _RabbitMQInvoker;
|
||||
private readonly AbstractConsulDispatcher _IConsulDispatcher = null;
|
||||
|
||||
public WarmupPageWorker(ILogger<WarmupPageWorker> logger, RabbitMQInvoker rabbitMQInvoker, IConfiguration configuration, AbstractConsulDispatcher consulDispatcher)
|
||||
{
|
||||
this._logger = logger;
|
||||
this._RabbitMQInvoker = rabbitMQInvoker;
|
||||
this._configuration = configuration;
|
||||
this._IConsulDispatcher = consulDispatcher;
|
||||
}
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
RabbitMQConsumerModel rabbitMQConsumerModel = new RabbitMQConsumerModel()
|
||||
{
|
||||
ExchangeName = RabbitMQExchangeQueueName.SKUWarmup_Exchange,
|
||||
QueueName = RabbitMQExchangeQueueName.SKUWarmup_Queue_StaticPage
|
||||
};
|
||||
HttpClient _HttpClient = new HttpClient();
|
||||
this._RabbitMQInvoker.RegistReciveAction(rabbitMQConsumerModel, message =>
|
||||
{
|
||||
string realUrl= this._IConsulDispatcher.GetAddress(this._configuration["DetailPageUrl"]);
|
||||
|
||||
SKUWarmupQueueModel skuWarmupQueueModel = JsonConvert.DeserializeObject<SKUWarmupQueueModel>(message);
|
||||
#region <EFBFBD><EFBFBD>ClearAll
|
||||
{
|
||||
string totalUrl = $"{realUrl}{0}.html?ActionHeader=ClearAll";
|
||||
try
|
||||
{
|
||||
var result = _HttpClient.GetAsync(totalUrl).Result;
|
||||
if (result.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
this._logger.LogInformation($"{nameof(WarmupPageWorker)}.ClearAll succeed {totalUrl}");
|
||||
//return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
this._logger.LogWarning($"{nameof(WarmupPageWorker)}.ClearAll failed {totalUrl}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
this._logger.LogError($"{nameof(WarmupPageWorker)}.ClearAll failed {totalUrl}, Exception:{ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Ȼ<EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Warmup
|
||||
{
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>----<2D><><EFBFBD><EFBFBD>---<2D><>¼<EFBFBD><C2BC><EFBFBD>µ<EFBFBD>
|
||||
|
||||
int count = 100;//<2F><><EFBFBD>β<EFBFBD>ѯ
|
||||
int pageIndex = 1;//<2F><>ҳ<EFBFBD><D2B3>ҳ<EFBFBD><D2B3><EFBFBD>ߵ<EFBFBD>
|
||||
while (count == 100)
|
||||
{
|
||||
|
||||
|
||||
// -------------------> <20>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>ɾ<EFBFBD>̬ҳ<CCAC><D2B3><EFBFBD>ƣ<EFBFBD>ͨ<EFBFBD><CDA8>ʹ<EFBFBD><CAB9>id<69><64>ʶ,<2C><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>service<63>IJ<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>id
|
||||
List<long> ids = new List<long>{ 1,2,3,4,5,6,7,8,9};
|
||||
// -------------------> <20>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>ɾ<EFBFBD>̬ҳ<CCAC><D2B3><EFBFBD>ƣ<EFBFBD>ͨ<EFBFBD><CDA8>ʹ<EFBFBD><CAB9>id<69><64>ʶ,<2C><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>service<63>IJ<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>id
|
||||
|
||||
|
||||
foreach (var id in ids)
|
||||
{
|
||||
string totalUrl = $"{realUrl}{id}.html";
|
||||
try
|
||||
{
|
||||
var result = _HttpClient.GetAsync(totalUrl).Result;
|
||||
if (result.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
this._logger.LogInformation($"{nameof(WarmupPageWorker)}.Warmup succeed {totalUrl}");
|
||||
//return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
this._logger.LogWarning($"{nameof(WarmupPageWorker)}.Warmup failed {totalUrl}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var logModel = new LogModel()
|
||||
{
|
||||
OriginalClassName = this.GetType().FullName,
|
||||
OriginalMethodName = nameof(ExecuteAsync),
|
||||
Remark = "<22><>ʱ<EFBFBD><CAB1>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־"
|
||||
};
|
||||
this._logger.LogError(ex, $"{nameof(WarmupPageWorker)}.Warmup failed {totalUrl}, Exception:{ex.Message}", JsonConvert.SerializeObject(logModel));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
pageIndex++;
|
||||
count = ids.Count;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
return true;
|
||||
});
|
||||
await Task.CompletedTask;
|
||||
//while (!stoppingToken.IsCancellationRequested)
|
||||
//{
|
||||
// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
|
||||
// await Task.Delay(1000, stoppingToken);
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
32
Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Worker.cs
Normal file
32
Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Worker.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Yi.Framework.StaticPageProcessor
|
||||
{
|
||||
public class Worker : BackgroundService
|
||||
{
|
||||
private readonly ILogger<Worker> _logger;
|
||||
private readonly IConfiguration _IConfiguration;
|
||||
public Worker(ILogger<Worker> logger, IConfiguration configuration)
|
||||
{
|
||||
this._logger = logger;
|
||||
this._IConfiguration = configuration;
|
||||
}
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
while (!stoppingToken.IsCancellationRequested)
|
||||
{
|
||||
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
|
||||
_logger.LogInformation($"Worker appsetting ConsulClientOption:Ip={this._IConfiguration["ConsulClientOption:Ip"]}");
|
||||
await Task.Delay(1000, stoppingToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
<OutputType>Exe</OutputType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="Log4net.config" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="Log4net.config">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Yi.Framework.WebCore\Yi.Framework.WebCore.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user