Orleans中的Timer和Reminder
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)
几个注意事项
- Timer定时调用不会改变当前grain实例的状态(grain实例状态:空闲 idle、使用中use),如果你通过Timer来延迟grian因为空闲太久而被回收 (从idle到use状态装换),是行不通的。也就是说即使有timer,如果这个grain一直没有被调用过,这个grain可能会因为空闲太久而被转为非激活状态,timer就不在继续运行
- Timer的周期,指的是从上一次的调用成功后,到下次调用开始前的一段时间,Orleans的Timer不仅不会发生类似于System.Theading.Timer的重叠调用,而且延长调用周期为【固定的周期+上一次调用的时间】
- Timer的调用,不会和这个grain上的其它调用并行执行。而且asyncCallback不会想其它调用一样做为消息传递
Reminders 提醒器
Reminder和Timer有几个不同之处:
- Reminder会持久化存储自身,也就是重启Orleans,不会导致Reminder失效,它会持续运行
- Reminder是针对Grain,而不是Grain的特定实例
- 如果在Reminder到期提醒时,没有任何这个Grain的激活实例,它会创建一个新的激活实例
- Reminder的调用时通过消息,在调用方式上,和grain的其它方法调用相同
- 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的更多相关文章
- iOS中的NSTimer 和 Android 中的Timer
首先看iOS的, Scheduling Timers in Run Loops A timer object can be registered in only one run loop at a t ...
- .NET中的Timer类型用法详解
这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下 在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行 ...
- 【JavaScript】JavaScript中的Timer是怎么工作的( setTimeout,setInterval)
原文(http://www.yeeyan.org/articles/view/luosheng/24380) 作为入门者来说,了解JavaScript中timer的工作方式是很重要的.通常它们的表现行 ...
- ASP.NET AJAX入门系列(11):在多个UpdatePanle中使用Timer控件
本文将使用Timer控件更新两个UpdatePanel控件,Timer控件将放在UpdatePanel控件的外面,并将它配置为UpdatePanel的触发器,翻译自官方文档. 主要内容 在多个Upda ...
- C# windows服务:C#windows服务中的Timer控件的使用
C# windows服务程序中的Timer控件的使用问题是如何解决的呢? 今天和同事一起研究了下C# windows服务程序中的Timer控件的使用的写法. 我们在建立一个C# windows服务程序 ...
- Boost中的Timer的使用——计算时间流逝
使用Boost中的Timer库计算程序的运行时间 程序开发人员都会面临一个共同的问题,即写出高质量的代码完毕特定的功能.评价代码质量的一个重要标准就是算法的运行效率,也就是算法的运行时间.为了可靠的提 ...
- Orleans 知多少 | Orleans 中文文档上线
Orleans 简介 Orleans是一个跨平台框架,用于构建健壮,可扩展的分布式应用程序 Orleans建立在.NET开发人员生产力的基础上,并将其带入了分布式应用程序的世界,例如云服务. Orle ...
- Java中定时器Timer致命缺点(附学习方法)
简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...
- JDK中的Timer和TimerTask详解(zhuan)
http://www.cnblogs.com/lingiu/p/3782813.html ************************************************** 目录结构 ...
随机推荐
- SPI线协议详解
更多的内容可以参考 https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus SPI的工作模式: CPOL.CPHA的搭配可以有四种工 ...
- centos6.5环境源码编译安装mysql5.6.34
centos6.5环境源码编译安装mysql5.6.34 源码下载地址http://dev.mysql.com/downloads/mysql/5.6.html#downloads 选择Generic ...
- ---Under Ubuntu 14.04
Thinprint provides driver-free printing. Do you wish to enable this feature? [yes] Disabling timer-b ...
- python面向对象个人总结
基础概念:面向对象其实就是类与对象的使用. 类是模板,对象是实例.模板创建实例,实例去类里面去执行类的方法.类的例子: class Foo: def Bar(self): ...
- Brn系列网上商城发布指南
以BrnMall为例: 第一步:将vs的编译方式改为Release,如下图: 第二步:打开BrnMall.Web项目下的Web.config文件,将compilation节点的debug值改为&quo ...
- props
// 这里是导入的包 import React, { Component } from 'react'; // 导入需要用到的组件 import { AppRegistry, Text, View } ...
- js中的单体对象
- 自定义底部tab
public class MainActivity extends TabActivity implements OnCheckedChangeListener { private RadioGrou ...
- C# 生成条形码
原文地址:http://www.cnblogs.com/xcsn/p/4514759.html 引用BarcodeLib.dll(百度云中有)生成条形 protected void Button2_C ...
- C# 程序间通信的各种途径及解析
一.开篇 程序间通信的主要目的是实现多台计算机(也可以是同一台)中应用程序之间的数据共享与信息交换.在不同的计算机系统中,它们之间要通过网络之间的协议才能 实现数据共享与信息交换:在同一台计算机系统中 ...