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. 学习java第7天

    关于继承还需要留意的是,子类中的所有构造方法都默认访问父类的无参构造,注意是无参,而且是必须的,如果父类没有无参子类就会报错.如果你不想给父类无参构造,那么在子类中加上super(),显式的调用有参构 ...

  2. ComboBox的数据绑定

    这里的ComboBox指System.Windows.Forms中的ComboBox. 使用对象数据源 IList<Model> models = ModelService.GetAllM ...

  3. ---Under Ubuntu 14.04

    Thinprint provides driver-free printing. Do you wish to enable this feature? [yes] Disabling timer-b ...

  4. knockoutJS+knockout.multimodels使用记录

    可以多次绑定,但不能嵌套绑定 错误示例: <div class="con_c" data-model="viewModel"> <div da ...

  5. 关于read only file system问题解决方案

    切换到超级用户sudo -sadb kill-serveradb rebootadb remount

  6. 基于HOG-3D的时空描述子

    作者提出一种新的基于局部描述子的行为识别算法.

  7. CUnit的用法

    转自:http://blog.csdn.net/scucj/article/details/4385630/ CUnit下载地址: http://sourceforge.net/projects/cu ...

  8. switch(面试)

    public static void Output() { ; ) { i--; switch (i) { : Console.WriteLine(i.ToString()); break; : Co ...

  9. 【MVC】 非常简单的页面导出 WORD, EXCEL方法

    [MVC] 页面导出 WORD, EXCEL 前端 js function output() { var para = new Object(); para.html = getHtml(" ...

  10. 奇怪的margin,padding,table

    为什么有的时候margin,padding不管用?写了float以后就管用了? 为什么table 不给width,就默认是100%,里面的td会平均分配teble的宽度,若你想给其中一些td宽度,剩下 ...