编写好的资源DLL的诫条
只要仔细注意几条规则和指引,编写好的资源DLL其实相当简单。大部分上文已经讨论过。本节是对编写资源DLL要牢记的关键事情的总结。
使用Visual C++ 4.2b或以上(确保从www.microsoft.com安装了最新更新)和平台SDK来编写资源DLL和群集管理扩展DLL。高度整合的开发环境使得工作相当轻松。同样地,使用Visual C++调试器或WinDbg来调试DLL。
在资源DLL的Startup例程中初始化全局数据,在Open中初始化资源特定的数据。
在资源DLL中,确保使用分离的线程来执行耗时比较长的操作,比如打开资源,联机,脱机,等等。分离线程的创建使与资源监视器(以及其上的群集服务)的通信流程更加高效。假如,举例来说,资源要花费超过300毫秒的时间来联机,派生一个分离的线程来完成这个操作,可以使得入口能够立即返回。
如果不想让资源DLL被群集服务的状态查询打断,返回一个事件句柄以通知群集服务不要调用LooksAlive。然后,使用该事件句柄向群集服务发送状态信息。
在任何可能的情况下使用回调函数。回调函数允许资源DLL和资源监视器进行异步通信。典型情况下,一般资源DLL使用LogEvent和SetResourceStatus函数向群集服务记录资源事件日志和进行调试。调用 SetResourceStatus向资源监视器发送状态信息。
如果要求群集事件、节点事件、组状态改变、群集数据库改变或更新事件通知到资源,创建一个群集通知端口(使用CreateClusterNotifyPort)来处理事件通知。注意,如果在多线程中使用通知端口,要小心竞争条件。例如,一个线程可能调用CloseClusterNotifyPort关闭通知商品,而另一个线程则调用了GetClusterNotify,正等待着从同一端口获取信息。要防止这种情况,可以在调用GetClusternotify的线程加入对CLUSTER_CHANGE_HANDLE_CLOSE的检查。关于更多关于事件通知和产生通知的事件,请参考平台SDK。
支持CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTIES控制功能以便于诸如Cluster.Exe之类的管理工具能够设置那些仍没有被设置的属性。
支持CLUSCTL_RESOURCE_VALIDATE_PRIVATE_PROPERTIES和CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES控制功能以便于资源DLL能够在属性被存储之前进行校验。
支持CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES、CLUSCTL_RESOURCE_TYPE_VALIDATE_PRIVATE_PROPERTIES以及CLUSCTL_RESOURCE_TYPE_SET_PRIVATE_PROPERTIES控制功能,如果资源类型具有私有属性。
支持CLUSCTL_RESOURCE_GET_REQUIRED_DEPENDENCIES和CLUSCTL_RESOURCE_TYPE_GET_REQUIRED_DEPENDENCIES控制功能,如果资源需要依赖于另一资源。
如果可能,应该在在Open函数中读取属性。如果不可能,则应该在Online函数中读取。