Timers and Reminder 定时器和提醒器

Orleans runtime 允许开发人员通过一种叫做timer和另一种叫做reminder的机制为grain添加周期性行为。接下来我分别为大家介绍Timer和Reminder

Timers 定时器

   Timer用于创建grain的定时任务,但这个定时任务并非跨实例的(StateLessWorker允许多个实例)周期性任务,类似于System.Threading.Timer,但不同的是,它需要它依赖的grain实例来保证单线程执行模式

使用方式

RegisterTimer会返回一个IDisposable引用,你可以通过调用dispose来取消这个timer

protected IDisposable RegisterTimer(Func<object, Task> asyncCallback, object state, TimeSpan dueTime, TimeSpan period)

几个注意事项

  1.    Timer定时调用不会改变当前grain实例的状态(grain实例状态:空闲 idle、使用中use),如果你通过Timer来延迟grian因为空闲太久而被回收 (从idle到use状态装换),是行不通的。也就是说即使有timer,如果这个grain一直没有被调用过,这个grain可能会因为空闲太久而被转为非激活状态,timer就不在继续运行
  2. Timer的周期,指的是从上一次的调用成功后,到下次调用开始前的一段时间,Orleans的Timer不仅不会发生类似于System.Theading.Timer的重叠调用,而且延长调用周期为【固定的周期+上一次调用的时间】
  3. Timer的调用,不会和这个grain上的其它调用并行执行。而且asyncCallback不会想其它调用一样做为消息传递

Reminders 提醒器

Reminder和Timer有几个不同之处:

  1. Reminder会持久化存储自身,也就是重启Orleans,不会导致Reminder失效,它会持续运行
  2. Reminder是针对Grain,而不是Grain的特定实例
  3. 如果在Reminder到期提醒时,没有任何这个Grain的激活实例,它会创建一个新的激活实例
  4. Reminder的调用时通过消息,在调用方式上,和grain的其它方法调用相同
  5. Reminder不要使用在高频率的调用上,调用周期应该是分钟、小时、或者日级别的,高频率、短周期的调用,应优先考虑Timer

Reminder的配置

Reminder是一个持久化的提醒,需要后端的存储支持,这个存储支持,是Orleans 服务器端的配置文件中的SystemStore配置节点中配置决定的,目前支持AzureTable和SQl SERVER。Orleans官方博客介绍说,会在2015年初开源,等开源了,我想各种第三方的SystemStoreProvider也就不是什么问题了,只要你原因,你可以写出任何Provider。

如果在开发环境使用,只需要暂时的保留在内存中,可以配置

<ReminderService ReminderServiceType="ReminderTableGrain"/>

使用方式 

要使用reminder,必须让你的grain继承IRemindable,并实现它的IRemindable.RecieveReminder 方法

Task IRemindable.ReceiveReminder(string reminderName, TickStatus status)
{
Console.WriteLine("Thanks for reminding me-- I almost forgot!");
return TaskDone.Done;
}

然后在Grain内部 需要建立提醒(Reminder)的地方,使用调用grain父类的方法

protected Task<IOrleansReminder> RegisterOrUpdateReminder(string reminderName, TimeSpan dueTime, TimeSpan period)

参数说明:

reminderName reminder名称,在这个grain内部,需要是唯一的

duetime         第一次调用提醒的时间间隔(从建立到第一次调用)

period           每次调用的周期

取消提醒 cancel reminder

你可以通过调用父类的UnregisterReminder方法来完成.那么在取消之前如何得到这个reminder呢?

①RegisterOrUpdateReminder会返回Reminder的引用 ②通过reminderName,通过父类的GetReminder方法

protected Task UnregisterReminder(IOrleansReminder reminder)
protected Task<IOrleansReminder> GetReminder(string reminderName)

PS:Reminder是一个非常不错的东西,稍后我会在之后的博文中,介绍如何使用Reminder来保证非持久化消息分布式系统的可靠性

Orleans中的Timer和Reminder的更多相关文章

  1. iOS中的NSTimer 和 Android 中的Timer

    首先看iOS的, Scheduling Timers in Run Loops A timer object can be registered in only one run loop at a t ...

  2. .NET中的Timer类型用法详解

    这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下   在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行 ...

  3. 【JavaScript】JavaScript中的Timer是怎么工作的( setTimeout,setInterval)

    原文(http://www.yeeyan.org/articles/view/luosheng/24380) 作为入门者来说,了解JavaScript中timer的工作方式是很重要的.通常它们的表现行 ...

  4. ASP.NET AJAX入门系列(11):在多个UpdatePanle中使用Timer控件

    本文将使用Timer控件更新两个UpdatePanel控件,Timer控件将放在UpdatePanel控件的外面,并将它配置为UpdatePanel的触发器,翻译自官方文档. 主要内容 在多个Upda ...

  5. C# windows服务:C#windows服务中的Timer控件的使用

    C# windows服务程序中的Timer控件的使用问题是如何解决的呢? 今天和同事一起研究了下C# windows服务程序中的Timer控件的使用的写法. 我们在建立一个C# windows服务程序 ...

  6. Boost中的Timer的使用——计算时间流逝

    使用Boost中的Timer库计算程序的运行时间 程序开发人员都会面临一个共同的问题,即写出高质量的代码完毕特定的功能.评价代码质量的一个重要标准就是算法的运行效率,也就是算法的运行时间.为了可靠的提 ...

  7. Orleans 知多少 | Orleans 中文文档上线

    Orleans 简介 Orleans是一个跨平台框架,用于构建健壮,可扩展的分布式应用程序 Orleans建立在.NET开发人员生产力的基础上,并将其带入了分布式应用程序的世界,例如云服务. Orle ...

  8. Java中定时器Timer致命缺点(附学习方法)

    简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...

  9. JDK中的Timer和TimerTask详解(zhuan)

    http://www.cnblogs.com/lingiu/p/3782813.html ************************************************** 目录结构 ...

随机推荐

  1. MVC 為頁面的list資料重新命名

    function ReBookFileName() {                              $("#div_sortable").find("li[ ...

  2. Attribute "resource" must be declared for element type "mapper".

    今天在玩mybatis的时候,遇到这个奇葩问题. 最后发现,原因是 dtd文件配置错误了.错把Mapper的直接copy过来 把DOCTYPE mapper改成configuration,Mapper ...

  3. Windows程序设计(第五版)学习:第一章 起步

    第一章 起步 1,windows主要的三个动态库: kernel32.dll负责操作系统的传统工作,包括内存管理.文件输入以及任务管理等. user32.dll负责用户界面的操作,即所有窗口的管理 g ...

  4. Oracle优化查询技巧

    1. WHERE子句中的连接顺序:Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的 ...

  5. CSS3常用选择器(一)

    在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素.比如最常用到的#id,.class,标签选择器. 随着CSS3到来,增加了很多新型选择器,这里就常用的做一个总结. 1.属性选择器. 在c ...

  6. 三级联动---DropDownList控件

    AutoPostBack属性:意思是自动回传,也就是说此控件值更改后是否和服务器进行交互比如Dropdownlist控件,若设置为True,则你更换下拉列表值时会刷新页面(如果是网页的话),设置为fl ...

  7. 搭建java,oracle,plsql开发环境

    一:安装jdk和jre; (1)有两种方法:1,从官网网址上安装:2,安装绿色版 (2)配置环境变量 在"系统变量"下进行如下配置: (1)新建->变量名:JAVA_HOME ...

  8. SQL Server SELECT逻辑处理顺序

    SQL Server SELECT语句,逻辑处理顺序,虽然SELECT位于语句最前面,它在逻辑处理中,基本上是最后一个被执行的部分. 下面列出查询子句在逻辑上处理顺序: 1.  FROM 2.  WH ...

  9. laravel 表单验证

    $this->validate($request, [ 'sn' =>['regex:/^\d{6}$/','required'], 'user' => ['numeric','mi ...

  10. MySQL里的wait_timeout

    如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800. wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能, ...