4.Handler之CoreHandler编写
4.Ray-Handler之CoreHandler编写
如图右上角所示,Ray中有两类Handler(SubHandler和PartSubHandler),在使用中,SubHandler派生Actor的CoreHandler,PartSubHandler派生SQLToReadHandler,SQLToReadHandler派生Actor的ToReadHandler,使用Ray主要写Actor的CoreHandler和ToReadHandler。
CoreHandler是复合消息路由器,包含的功能有:消息路由器、消息处理器、消息分离器、消息聚合器、消息过滤器、消息丰富器、副本同步协调器。
消息路由器:
Tell方法中的Switch块,针对不同的Event类型,将Event事件中的数据分发给不同的事件处理方法CoreHandler承担的是消息路由器的作用。如下代码:
public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg)
{
switch (data)
{
case CoinAddressGeneratingResponse value: return AcceptCoinAddressAsync(value);
case CoinWithdrawWithholdingFailedMsg value: return RollbackWithholdingAsync(value);
case CoinWithdrawWithheldEvent value: return CreateWithdrawAsync(value);
case CoinOrderCreatedEvent value: return CreateOrderAsync(value);
case CoinOrderCreatedEventV1 value: return CreateOrderAsyncV1(value);
case CoinPlanOrderCreatedEvent value: return CreatePlanOrderAsync(value);
case CoinDepositIncreasedEvent value: return CoinDepositIncreased(value);
case CoinIcoEvent value: return CoinIcoEventHandle(value);
default: return Task.CompletedTask;
}
}
消息处理器:
针对不同的Event类型,在该Actor的CoreHandler里处理该事件,CoreHandler承担的是消息处理器的作用。如下代码中,AmountAddEventHandler方法处理AmountTransferEvent事件。
在事件处理代码中,可编写的代码如下:
- 可以只针对当前事件处理。
- 可以获得其他actor引用,调用其他actor的方法(包括actor的只读方法和写操作方法)。
- 可以调用数据访问层进行数据库读写。(写方法建议在ToReadHandler中进行)。
public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg)
{
switch (data)
{
case AmountTransferEvent value: return AmountAddEventHandler(value);
default: return Task.CompletedTask;
}
}
public Task AmountAddEventHandler(AmountTransferEvent value)
{
var toActor = HandlerStart.Client.GetGrain<IAccount>(value.ToAccountId);
return toActor.AddAmount(value.Amount, value.Id);
}
消息分离器:
当需要将较大的消息分割成多个独立的部分,并将这些独立的部分作为其他actor处理的参数时,CoreHandler承担的是分离器的作用。
消息聚合器:
当需要对不同类型消息中的数据进行聚合统计时,CoreHandler承担的是消息聚合器的作用。
例如:在加密货币交易的场景中,有ETH、BTC、USDT不同的市场,EOS在三个市场中都有交易,现在要统计本周内每个用户EOS的交易量,可以如下操作:
public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg)
{
switch (data)
{
case CoinTradeSoldEvent value: return ActivitySellStatistic(value);
case CoinTradeBoughtEvent value: return ActivityBuyStatistic(value);
default: return Task.CompletedTask;
}
}
消息过滤器:
CoreHandler有可能收到它不感兴趣额的消息,并且需要丢弃这些无用消息时,CoreHandler可以承担消息过滤器的作用。
public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg)
{
switch (data)
{
case AmountTransferEvent value: return AmountAddEventHandler(value);
default: return Task.CompletedTask;//消息过滤
}
}
消息丰富器:
当需要将收到的消息分进一步丰富,并将丰富后的消息作为其他actor处理的参数时,CoreHandler承担的是消息丰富器的作用。
副本同步协调器:
Ray中有主actor和副本actor两类actor,副本actor用于分担主actor的压力,执行一些异步操作。当使用副本actor,需要主actor与副本actor保持同步时,需要CoreHandler将关注的事件交给副本actor,此时CoreHandler承担的是副本同步协调器的作用。
public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg)
{
var replicatedRef = HandlerStart.Client.GetGrain<IAccountRep>(data.StateId);//获得副本actor
var task = replicatedRef.Tell(bytes);//通知副本同步
switch (data)
{
case AmountTransferEvent value: return Task.WhenAll(task, AmountAddEventHandler(value));
default: return task;
}
}
示例
参考Example中,Ray.Handler项目内的AccountCoreHandler。
总结
CoreHandler实际编写中很简单,主要承担消息路由和消息处理器的作用,其他功能为特殊场景提供了切入点。
4.Handler之CoreHandler编写的更多相关文章
- Ray-基础部分目录
基础部分: 引言 Actor编写-ESGrain与ESRepGrain 消息发布器与消息存储器 Event编写 Handler之CoreHandler编写 Handler之ToReadHandler编 ...
- R自动数据收集第二章HTML笔记1(主要关于handler处理器函数和帮助文档所有示例)
本文知识点: 1潜在畸形页面使用htmlTreeParse函数 2startElement的用法 3闭包 4handler函数的命令和函数体主要写法 5节点的丢弃,取出,取出标签名称.属性.属 ...
- nginx -- handler模块(100%)
handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...
- Android(java)学习笔记202:Handler消息机制的原理和实现
联合学习 Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 1. 首先我们通过一个实例案例来引出一个异常: (1)布局文件activity_m ...
- Android基础夯实--你了解Handler有多少?
概述 对于刚入门的同学来说,往往都会对Handler比较迷茫,到底Handler是个什么样的东西.当然,可能对于一些有工作经验的工程师来说,他们也不一定能很准确地描述,我们来看下API的介绍. Han ...
- 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录
在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...
- Android(java)学习笔记145:Handler消息机制的原理和实现
联合学习 Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 1. 首先我们通过一个实例案例来引出一个异常: (1)布局文件activity_m ...
- R自动数据收集第二章HTML笔记2(主要关于htmlTreeParse函数)
包含以下几个小的知识点 1htmlTreeParse函数源码和一些参数 2hander的写法 3关于missing函数 4关于if-else语句中else语句的花括号问题 5关于checkHandle ...
- ExtJS笔记5 Components
参考 :http://blog.csdn.net/zhangxin09/article/details/6914882 An Ext JS application's UI is made up of ...
随机推荐
- es6的常用语法
最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...
- js和native交互方法浅析
一.背景 最近接触公司项目,需要和原生app做交互,由此业务需求,开始了学习探索之路. 二.解决方案之WebViewJavascriptBridge 想要和app交互,必须在app上先把bridge进 ...
- junit测试模板 unit-test
一个项目能否发布上线,重要的环节就是测试.经过集成测试.性能测试.压力测试等不断循环的测试过后依据测试报告来确定上线.这些由专业的测试人员来完成,因此会导致程序开发者对自身的单元测试的弱化.若在代码中 ...
- vue.js之数据传递和数据分发slot
一.组件间的数据传递 1.父组件获取子组件的数据 *子组件把自己的数据,发送到父级 *vm.$emit(事件名,数据); *v-on: @ 示例用法:当点击send按钮的时候,"111&qu ...
- SpringBoot(一)走进Springboot的世界
什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...
- HDU_4883
TIANKENG's restaurant Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/O ...
- angular2 表单验证
模版式表单 (1) angular遇到form自动接管,不想自动接管,添加ngNoForm,当标签为div时,但想被表单接管,添加ngForm; (2) ngForm可以被模版本地变量引用,以便在模版 ...
- 常用Windows DOS命令项目部署经常用到
img { max-width: 100% } 前两天部署.netcore项目,首先是生产环境域名访问不了,再到.netcore项目IIS部署502.5,在到莫名其妙的500,在排查项目部署问题的时候 ...
- UserView--第一种方式set去重,基于Spark算子的java代码实现
UserView--第一种方式set去重,基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import java.util.Ha ...
- ThinkPHP3.2 实现Mysql数据库备份
<?php header("Content-type:text/html;charset=utf-8"); //配置信息 $cfg_dbhost = 'localhost'; ...