当前位置: 首页 > news >正文

免费下载ppt模板网站推荐知名网站建设怎么样

免费下载ppt模板网站推荐,知名网站建设怎么样,wordpress动态默认参数,建设电影网站的教程EventBus/EventQueue 再思考Intro之前写过两篇文章#xff0c;造轮子系列的 EventBus/ EventQueue#xff0c;回想起来觉得当前的想法有点问题#xff0c;当时对 EvenStore 可能有点误解#xff0c;有兴趣可以参考 动手造轮子#xff1a;实现一个简单的 EventBus动手造轮子… EventBus/EventQueue 再思考Intro之前写过两篇文章造轮子系列的 EventBus/ EventQueue回想起来觉得当前的想法有点问题当时对 EvenStore 可能有点误解有兴趣可以参考 动手造轮子实现一个简单的 EventBus动手造轮子实现简单的 EventQueue最近把 Event 相关的逻辑做了一个重构修改 EventStore重新设计了 Event 相关的组件重构后的 EventEvent: 事件的抽象定义EventHandler事件处理器抽象定义EventHandlerFactory事件处理器工厂用来根据事件类型获取事件处理器新增EventPublisher事件发布器用于事件发布EventSubscriber事件订阅器用于管理事件的订阅EventSubscriptionManager事件订阅管理器在 EventSubscriber 的基础上增加了一个根据事件类型获取事件订阅器类型的方法EventBus事件总线由 EventPubliser 和 EventSubscriber 组合而成用来比较方便的做事件发布和订阅EventQueue事件队列希望某些消息顺序处理的时候可以考虑用 EventQueue 的模式EventStore事件存储事件的持久化存储在之前的版本里EventStore 实际作用是一个 EventSubscriptionManager在最近的版本更新中已修改)以上 EventSubscriber 和 EventSubscriptionManager 一般不直接用一般用 EventBus 来处理即可EventHandlerFactory这次引入了 EventHandlerFactory 用来抽象获取 EventHandler 的逻辑原来的设计里是在处理 Event 的时候获取 EventHandler 的类型然后从依赖注入框架中获取或创建新的 event handler 实例之后再调用 EventHandler 的 Handle 方法处理事件有一些冗余使用 EventHandlerFactory 之后就可以直接获取一个 EventHandler 实例集合具体是实例化还是从依赖注入中获取就由 EventHandlerFactory 来决定了这样就可以对依赖注入很友好对于基于内存的简单 EventBus 来说在服务注册之后就不需要再调用 Subscribe 去显式订阅了因为再注册服务的时候就已经隐式实现了订阅的逻辑这样实际就不需要 EventSubscriptionManager 来管理订阅了订阅信息都在依赖注入框架内部比如说 CounterEvent要获取它的订阅信息我只需要从依赖注入框架中获取 IEventHandlerCounterEvent 的实例即可实际就代替了原先 “EventStoreInMemory”现在的 EventSubscriptionManagerInMemory基于依赖注入的 EventHandlerFactory 定义public sealed class DependencyInjectionEventHandlerFactory : IEventHandlerFactory {private readonly IServiceProvider _serviceProvider;public DependencyInjectionEventHandlerFactory(IServiceProvider serviceProvider null){_serviceProvider serviceProvider ?? DependencyResolver.Current;}public ICollectionIEventHandler GetHandlers(Type eventType){var eventHandlerType typeof(IEventHandler).MakeGenericType(eventType);return _serviceProvider.GetServices(eventHandlerType).CastIEventHandler().ToArray();} } 如果不使用依赖注入也可以根据 IEventSubscriptionManager 订阅信息来实现public sealed class DefaultEventHandlerFactory : IEventHandlerFactory {private readonly IEventSubscriptionManager _subscriptionManager;private readonly ConcurrentDictionaryType, ICollectionIEventHandler _eventHandlers new ConcurrentDictionaryType, ICollectionIEventHandler();private readonly IServiceProvider _serviceProvider;public DefaultEventHandlerFactory(IEventSubscriptionManager subscriptionManager, IServiceProvider serviceProvider null){_subscriptionManager subscriptionManager;_serviceProvider serviceProvider ?? DependencyResolver.Current;}public ICollectionIEventHandler GetHandlers(Type eventType){var eventHandlers _eventHandlers.GetOrAdd(eventType, type {var handlerTypes _subscriptionManager.GetEventHandlerTypes(type);var handlers handlerTypes.Select(t (IEventHandler)_serviceProvider.GetServiceOrCreateInstance(t)).ToArray();return handlers;});return eventHandlers;} } EventQueue Demo来看一下 EventQueue 的示例示例基于 asp.net core 的定义了一个 HostedService 来实现一个 EventConsumer 来消费 EventQueue 中的事件信息EventConsumer 定义如下public class EventConsumer : BackgroundService {private readonly IEventQueue _eventQueue;private readonly IEventHandlerFactory _eventHandlerFactory;public EventConsumer(IEventQueue eventQueue, IEventHandlerFactory eventHandlerFactory){_eventQueue eventQueue;_eventHandlerFactory eventHandlerFactory;}protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){var queues await _eventQueue.GetQueuesAsync();if (queues.Count 0){await queues.Select(async q {var event await _eventQueue.DequeueAsync(q);if (null ! event){var handlers _eventHandlerFactory.GetHandlers(event.GetType());if (handlers.Count 0){await handlers.Select(h h.Handle(event)).WhenAll();}}}).WhenAll();}await Task.Delay(1000, stoppingToken);}} } 定义 PageViewEvent 和 PageViewEventHandler用来记录和处理请求访问记录public class PageViewEvent : EventBase { } public class PageViewEventHandler : EventHandlerBasePageViewEvent {public static int Count;public override Task Handle(PageViewEvent event){Interlocked.Increment(ref Count);return Task.CompletedTask;} } 事件很简单事件处理也只是增加了 PageViewEventHandler 内定义的 Count。服务注册// 注册事件核心组件 // 会注册 EventBus、EventHandlerFactory、EventQueue 等 services.AddEvents()// 注册 EventHanlder.AddEventHandlerPageViewEvent, PageViewEventHandler(); // 注册 EventQueuePubliser默认注册的 IEventPublisher 是 EventBus services.AddSingletonIEventPublisher, EventQueuePublisher(); // 注册 EventConsumer services.AddHostedServiceEventConsumer(); 事件发布定义了一个中间件来发布 PageViewEvent定义如下// pageView middleware app.Use((context, next) {var eventPublisher context.RequestServices.GetRequiredServiceIEventPublisher();eventPublisher.Publish(new PageViewEvent());return next();}); 然后定义一个接口来获取上面定义的 PageViewEventHandler 中的 Count[Route(api/[controller])] public class EventsController : ControllerBase {[HttpGet(pageViewCount)]public IActionResult Count(){return Ok(new { Count PageViewEventHandler.Count });} } 运行起来之后访问几次接口看上面的接口返回 Count 是否会增加正常的话每访问一次接口就会增加 1并发访问问题也不大因为每个事件都是顺序处理的即使并发访问也没有关系事件发布之后在队列里都是顺序处理的这也就是引入事件队列的目的好像上面的原子递增没什么用了...) 如果没看到了增加稍等一会儿再访问试试事件处理会迟到但总会处理毕竟是异步处理的有些延迟很正常而且上面我们还有一个 1s 的延迟More作者水平有限如果上述有哪些不对的地方还望指出万分感谢Referencehttps://github.com/WeihanLi/WeihanLi.Common/tree/dev/src/WeihanLi.Common/Eventhttps://github.com/WeihanLi/WeihanLi.Common/blob/dev/samples/AspNetCoreSample/Startup.cshttps://www.cnblogs.com/weihanli/p/implement-a-simple-event-bus.htmlhttps://www.cnblogs.com/weihanli/p/implement-event-queue.html
http://www.zqtcl.cn/news/700857/

相关文章:

  • 做汽车保养的网站上商业招商网站
  • 如何进网站帝国cms调用网站名称
  • 瑞金网站建设推广合肥瑶海区地图
  • 静态网站建设国内免费域名
  • 网站建设设计公司电子商务网站开发与管理
  • 手机网站制作设计做国际网站有什么需要注意的
  • 机构网站源码如何分析一个网站
  • 免费营销软件网站网站建设与规划实训总结
  • 网站深度功能建筑人才网市场
  • 学校网站建设的意义和应用服务平台管理系统
  • 网站内容规划要包括什么内容wordpress5.2 php版本
  • 山西建设部网站超值的镇江网站建设
  • 做淘宝要网站网站推广外链怎么做
  • 深圳做网站推广哪家好自建网站优缺点
  • 网站建设询价函什么网站可以做会计题目
  • 电脑网站视频怎么下载珠海免费网站制作
  • wordpress menu icon咸阳seo
  • php制作网站网站开发与客户沟通
  • 百度网站建设平台微盟微商城官网
  • 三明网站seo上海中学分数线
  • 青岛谷歌网站建设网站建站公司排名
  • 成都旅游网站建设规划windows优化大师官方
  • 福永网站建设公司哪家好财务公司承兑汇票
  • 青岛快速建站模板制作公司网页什么价位
  • 网站建设公司的经营范围wordpress设置文本编辑器
  • 做网站用微软雅黑侵权吗wordpress 同类文章
  • 免费下载建设银行官方网站自己做网站犯法吗
  • 手机网站html代码附近做广告牌的店
  • 建设和优化网站的步骤wordpress 模板 含数据库
  • 太原制作网站的工作室wordpress弹幕播放器