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 ...
随机推荐
- [译]Pandas常用命令对照清单
我们在内容中使用以下简写: df pandas的DataFrame对象 s pandas的Series对象 导入以下包开始 import pandas as pd import numpy as np ...
- [转]python执行bash指令,如果指令返回错误,如何优雅的结束python程序
如果是有返回值的可执行文件可以直接获取return code, 如果error code 直接退出. import os ret = os.system("COMMAND LINE" ...
- 定义一个数,它可能为正 也可能为负 var num = Math.pow(-1,parseInt(Math.random() * 2) + 1);
// 定义一个随机数范围从0 ~页面宽度 var x = parseInt(Math.random() * myCanvas.width); // 定义一个随机数 范围从0 ~页面高度 var y = ...
- 进行app性能和安全性测试的重要性
如何让用户感觉App运行速度更快呢,这需要对App进行性能测试.限制App性能的因素按照App的系统结构分为App自身和App需要用到的后台服务. 测试App连接网络的速度 一般采用在模拟Mock环境 ...
- java保留两位小数(不四舍五入)
import java.text.DecimalFormat; import java.math.RoundingMode; class Text{ public static void main(S ...
- JAXB应用实例
过往的项目中数据存储都离不开数据库,不过最近做的一个项目的某些数据(比如人员信息.菜单.权限等等)却完全没有涉及任何数据库操作,直接XML搞定.这里无意比较优劣,因为数据库存储和XML存储本就有不同的 ...
- [bzoj3233] [Ahoi2013]找硬币
一开始没什么思路...后来想到确定最大硬币面值就知道其他面值能取多少了..而且结果是可以由较小的面值转移过来的. f[i]表示最大面值为i时的最小硬币数.a[i]表示第i个物品的价钱. f[i]=mi ...
- c语言实现封装、继承和多态
1. 概述 C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是 ...
- 将简单的lambda表达式树转为对应的sqlwhere条件
1.Lambda的介绍 园中已经有很多关于lambda的介绍了.简单来讲就是vs编译器给我带来的语法糖,本质来讲还是匿名函数.在开发中,lambda给我们带来了很多的简便.关于lambda的演变过程可 ...
- angular1项目打包app及logo和启动图片的设置
打包思想:ionic和angular混合开发app,那么纯angular1的项目也是可以打包出来. 技术需要:安装一个新的ionic2的项目,环境配置成功,这里打包的配置需要 http://www.c ...