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编写的更多相关文章

  1. Ray-基础部分目录

    基础部分: 引言 Actor编写-ESGrain与ESRepGrain 消息发布器与消息存储器 Event编写 Handler之CoreHandler编写 Handler之ToReadHandler编 ...

  2. R自动数据收集第二章HTML笔记1(主要关于handler处理器函数和帮助文档所有示例)

    本文知识点:     1潜在畸形页面使用htmlTreeParse函数 2startElement的用法 3闭包 4handler函数的命令和函数体主要写法 5节点的丢弃,取出,取出标签名称.属性.属 ...

  3. nginx -- handler模块(100%)

    handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...

  4. Android(java)学习笔记202:Handler消息机制的原理和实现

     联合学习 Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系   1. 首先我们通过一个实例案例来引出一个异常: (1)布局文件activity_m ...

  5. Android基础夯实--你了解Handler有多少?

    概述 对于刚入门的同学来说,往往都会对Handler比较迷茫,到底Handler是个什么样的东西.当然,可能对于一些有工作经验的工程师来说,他们也不一定能很准确地描述,我们来看下API的介绍. Han ...

  6. 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录

    在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...

  7. Android(java)学习笔记145:Handler消息机制的原理和实现

     联合学习 Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系   1. 首先我们通过一个实例案例来引出一个异常: (1)布局文件activity_m ...

  8. R自动数据收集第二章HTML笔记2(主要关于htmlTreeParse函数)

    包含以下几个小的知识点 1htmlTreeParse函数源码和一些参数 2hander的写法 3关于missing函数 4关于if-else语句中else语句的花括号问题 5关于checkHandle ...

  9. ExtJS笔记5 Components

    参考 :http://blog.csdn.net/zhangxin09/article/details/6914882 An Ext JS application's UI is made up of ...

随机推荐

  1. es6的常用语法

    最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...

  2. js和native交互方法浅析

    一.背景 最近接触公司项目,需要和原生app做交互,由此业务需求,开始了学习探索之路. 二.解决方案之WebViewJavascriptBridge 想要和app交互,必须在app上先把bridge进 ...

  3. junit测试模板 unit-test

    一个项目能否发布上线,重要的环节就是测试.经过集成测试.性能测试.压力测试等不断循环的测试过后依据测试报告来确定上线.这些由专业的测试人员来完成,因此会导致程序开发者对自身的单元测试的弱化.若在代码中 ...

  4. vue.js之数据传递和数据分发slot

    一.组件间的数据传递 1.父组件获取子组件的数据 *子组件把自己的数据,发送到父级 *vm.$emit(事件名,数据); *v-on: @ 示例用法:当点击send按钮的时候,"111&qu ...

  5. SpringBoot(一)走进Springboot的世界

    什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...

  6. HDU_4883

    TIANKENG's restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/O ...

  7. angular2 表单验证

    模版式表单 (1) angular遇到form自动接管,不想自动接管,添加ngNoForm,当标签为div时,但想被表单接管,添加ngForm; (2) ngForm可以被模版本地变量引用,以便在模版 ...

  8. 常用Windows DOS命令项目部署经常用到

    img { max-width: 100% } 前两天部署.netcore项目,首先是生产环境域名访问不了,再到.netcore项目IIS部署502.5,在到莫名其妙的500,在排查项目部署问题的时候 ...

  9. UserView--第一种方式set去重,基于Spark算子的java代码实现

    UserView--第一种方式set去重,基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import java.util.Ha ...

  10. ThinkPHP3.2 实现Mysql数据库备份

    <?php header("Content-type:text/html;charset=utf-8"); //配置信息 $cfg_dbhost = 'localhost'; ...