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. C# .net ACCESS 网页增删改查 --留言板

    话不多说,上代码 http://yunpan.cn/QaQs5Dzz8ZIxK  访问密码 041b

  2. web form 控件

    webform的简单控件1.Label:文本显示,编译后是span属性:颜色,样式,边线宽度2.Literal:纯文本显示,编译后是text 3.TextBox:文本框TextMode-密码框.文本域 ...

  3. ios category,protocol理解

    category: 向现有的类中增加方法,同时提供方法的实现,现有类不需要做任何改动. protocol:(相当于Java或C#中的接口interface,当很多类都要需要类似的方法,但是方法具体实现 ...

  4. win7的svchost.exe占用内存过高如何解决

    方法/步骤 1 在我的电脑上点击鼠标右键,选择[管理] 步骤阅读 2 选择右侧[服务和应用程序]下的[服务]选项 步骤阅读 3 找到名称我Superfetch的服务,双击鼠标左键. 步骤阅读 4 选择 ...

  5. CentOS 安装 chrome 浏览器

    安装 google-chrome 浏览器,由于众所周知的原因,一直安装不了,下面介绍一种新方法. cd 到 /etc/yum.repos.d 创建一个yum新源 vi chromium-el6.rep ...

  6. codevs1230 元素查找

    1230 元素查找  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 给出n个正整数,然后有m个询问,每 ...

  7. css属性word-spacing和letter-spacing的区别

    word-spacing和letter-spacing用来定义单词或者字母之间的水平空白间隔.顾名思义,word-spacing定义了单词之间的空白,例如: <div style="w ...

  8. php protobuff 使用

    http://hi.baidu.com/sing520/item/a6e98a3545fe1ef2e6bb7ad0 php 不支持uint32 不支持空结构 不支持package

  9. sendEmail的使用

    坑!坑!坑!今天又弄了一天如何发送邮件,首先用sendmail,postfix.....等,都试过了,各种报错,然后就从早上弄到现在,在群里问问题的时候,一位好心的大哥说了他用的是sendEmail, ...

  10. DNS解析过程

    参考: http://www.maixj.net/ict/dns-chaxun-9208 http://blog.it985.com/8389.html DNS(Domain Name System) ...