测试 CultureInfoFilter
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
ed61419a6a
commit
79fd83449a
|
@ -35,6 +35,7 @@ using IRaCIS.Core.Application.MassTransit.Command;
|
||||||
using IRaCIS.Core.Application.MassTransit.Consumer;
|
using IRaCIS.Core.Application.MassTransit.Consumer;
|
||||||
using DocumentFormat.OpenXml.InkML;
|
using DocumentFormat.OpenXml.InkML;
|
||||||
using IRaCIS.Core.Domain;
|
using IRaCIS.Core.Domain;
|
||||||
|
using MassTransit.Internals;
|
||||||
|
|
||||||
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
|
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
|
||||||
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
|
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
|
||||||
|
@ -182,6 +183,10 @@ builder.Services.AddMassTransit(cfg =>
|
||||||
//使用 Hangfire 进行消息调度
|
//使用 Hangfire 进行消息调度
|
||||||
cfg.UseHangfireScheduler();
|
cfg.UseHangfireScheduler();
|
||||||
|
|
||||||
|
cfg.UseConsumeFilter(typeof(CultureInfoFilter<>), context,
|
||||||
|
x => x.Include(type => type.HasInterface(typeof(IConsumer<>))));
|
||||||
|
|
||||||
|
|
||||||
// 这里可以进行额外的配置
|
// 这里可以进行额外的配置
|
||||||
cfg.ConfigureEndpoints(context); // 自动配置所有消费者的端点
|
cfg.ConfigureEndpoints(context); // 自动配置所有消费者的端点
|
||||||
|
|
||||||
|
|
|
@ -937,6 +937,13 @@
|
||||||
<param name="childCode"></param>
|
<param name="childCode"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.EventStoreRecordService.RePublishEvent(System.Guid)">
|
||||||
|
<summary>
|
||||||
|
重新发布失败的事件消息
|
||||||
|
</summary>
|
||||||
|
<param name="eventId"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="T:IRaCIS.Core.Application.Service.ExploreRecommendService">
|
<member name="T:IRaCIS.Core.Application.Service.ExploreRecommendService">
|
||||||
<summary>
|
<summary>
|
||||||
ExploreRecommendService
|
ExploreRecommendService
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using IRaCIS.Core.Domain.BaseModel;
|
||||||
|
using MassTransit;
|
||||||
|
|
||||||
|
public class CultureInfoFilter<T> : IFilter<ConsumeContext<T>> where T : DomainEvent
|
||||||
|
{
|
||||||
|
public async Task Send(ConsumeContext<T> context, IPipe<ConsumeContext<T>> next)
|
||||||
|
{
|
||||||
|
var cultureInfoName = context.Message.CultureInfoName;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(cultureInfoName))
|
||||||
|
{
|
||||||
|
// 设置线程的文化信息
|
||||||
|
Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureInfoName);
|
||||||
|
Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureInfoName);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 继续处理消息
|
||||||
|
await next.Send(context);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
// 还原文化信息(可选)
|
||||||
|
// Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; // 或者之前的文化
|
||||||
|
// Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Probe(ProbeContext context) { }
|
||||||
|
}
|
|
@ -15,10 +15,12 @@ using MassTransit.Mediator;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using IRaCIS.Core.Domain;
|
using IRaCIS.Core.Domain;
|
||||||
|
using IRaCIS.Core.Domain.Share;
|
||||||
|
using System.Globalization;
|
||||||
namespace IRaCIS.Core.Application.Service;
|
namespace IRaCIS.Core.Application.Service;
|
||||||
|
|
||||||
[ApiExplorerSettings(GroupName = "Common")]
|
[ApiExplorerSettings(GroupName = "Common")]
|
||||||
public class EventStoreRecordService(IRepository<EventStoreRecord> _eventStoreRecordRepository, IMediator _mediator) : BaseService
|
public class EventStoreRecordService(IRepository<EventStoreRecord> _eventStoreRecordRepository, IMediator _mediator,IPublishEndpoint _publishEndpoint) : BaseService
|
||||||
{
|
{
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
|
@ -33,20 +35,26 @@ public class EventStoreRecordService(IRepository<EventStoreRecord> _eventStoreRe
|
||||||
return pageList;
|
return pageList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重新发布失败的事件消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eventId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
public async Task<IResponseOutput> RePublishEvent(Guid eventId)
|
public async Task<IResponseOutput> RePublishEvent(Guid eventId)
|
||||||
{
|
{
|
||||||
var storedEvent = await _eventStoreRecordRepository.FirstOrDefaultAsync(t => t.Id == eventId);
|
var storedEvent = await _eventStoreRecordRepository.FirstOrDefaultAsync(t => t.Id == eventId);
|
||||||
|
|
||||||
var domainEvent = storedEvent.EventData.JsonStrToObject(Type.GetType(storedEvent.EventType));
|
var domainEvent = storedEvent.EventData.JsonStrToObject(Type.GetType(storedEvent.EventType));
|
||||||
|
|
||||||
Console.WriteLine(Type.GetType(storedEvent.EventType));
|
CultureInfo.CurrentCulture = new CultureInfo(StaticData.CultureInfo.en_US);
|
||||||
|
|
||||||
Console.WriteLine(domainEvent.GetType());
|
|
||||||
|
|
||||||
Console.WriteLine(new UserSiteSurveySubmitedEvent().GetType().AssemblyQualifiedName);
|
var tt = (UserSiteSurveySubmitedEvent)domainEvent;
|
||||||
|
|
||||||
await _mediator.Publish(domainEvent.GetType(), domainEvent);
|
tt.CultureInfoName = CultureInfo.CurrentCulture.Name;
|
||||||
|
|
||||||
|
//IMediator 发布的时候,设置当前线程的CultureInfo 消费者会与发布线程CultureInfo 一致 分布式的话 _publishEndpoint 会不一致,需要手动设置
|
||||||
|
|
||||||
|
await _publishEndpoint.Publish(domainEvent.GetType(), tt);
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue