应用程序的暂停
应用程序的暂停和中止是相似的,但应用程序的暂停可以用来禁止一个正在运行的进程,应用程序的中止会结束被暂停的状态。如果要暂停一个进程,可以打开“运行的进程”文件夹,从应用程序的弹出式快捷菜单中选择“暂停”选项。选择“重新开始”选项则能够恢复一个被暂停进程的运行。
COM+分区
在Windows XP中,COM+ 1.5引入了COM+分区的概念,即在同一台计算机中能够安装和配置一个COM+应用软件的多个版本,这一功能将使我们在需要运行多个不同版本的COM+应用程序时,节约大量的成本和时间。当然了,计算机的每一个分区的功能都相当于一台虚拟的计算机。
在每个分区上安装应用软件时,就会生成分区集,将用户映射到逻辑服务器上。开发人员能够通过编程的方式生成和配置COM+分区,每个生成和配置任务都可以通过使用COM+集、对象、接口或活动目录系统界面(ADSI)完成。
应用程序分区和别名组件
在企业级环境中,COM+1.5使用应用程序分区服务提供、强化了对应用程序的处理、管理。每个应用程序分区服务都是由一系列COM+ 1.5应用程序生成的。通过让每个客户使用一组已经在客户的计算机上存在的应用程序和组件,分区提供了一种高效的管理手段。
在XP和COM+1.5之前,一个组件只能属于一台计算机上的一个COM+应用程序,这就会存在一个问题,当需要在多个应用程序中安装包括相同CLSID的同一个组件时,就需要使用多台计算机了。有了分区功能,我们就可以在同一台计算机上不同分区的应用程序中安装同一个组件。也就是说,每台计算机能够包含几个分区,每个分区都独立处理自己的应用程序和组件集。
在COM+1.5之前,一个组件只能有一个配置集。在COM+1.5中,我们可以对一个现有的配置过的组件命名一个新的别名,而且可以在该别名中使用一个新的CLSID。于是我们可以象在新组件上那样在原来的组件上使用许多配置。对一个组件命名别名是XP和Com+1.5带给我们的一项重要的功能。因此,我们能够设计和开发一个或一部分企业级的应用程序,然后在需要的时候可以通过指定别名的方法给它指定许多配置。客户端能够决定使用哪种配置、哪些组件和应用程序。一旦对一个组件指定了别名,COM+服务就将它们认为是二个不同的组件,可以分别对它们进行配置。下面这一点非常重要:分区通常都是在活动目录中配置的,因此,应该将用户指定给活动目录中的分区。
应用程序的再生
再生是COM+中应用程序的一项最重要的功能之一,它在相当程度上强化了应用程序的可靠性。内存泄漏、对第三方代码的依赖和资源利用的不可伸缩性都可能随着应用程序运行时间的延长而影响它的正常执行。为解决这类问题,COM+应用程序再生功能能够使与该应用程序相关的进程被关闭和再启动。
我们可以在应用程序的属性页上的“缓冲池&再生”标签中对应用程序的再生功能进行配置。只有服务器应用程序才能享有再生功能,库应用程序则不能使用再生功能,因为它们没有自己的主进程。
应用程序的再生能够弥补代码的缺陷。内存溢出是最常见的代码缺陷之一,一些软件缺乏足够的软件质量保证措施,发布时就会存在内存溢出缺陷,甚至一个很小的内存溢出缺陷会导致严重的问题,甚至会对项目造成长期的影响。
我们可以通过一个例子来看一个内存溢出的例子。如果一个大规模的软件每次溢出10个字节的数据,进程每秒执行25次调用,一天溢出的内存容量就会高达25MB,这将严重地影响系统的性能。在前一个版本中,对于这类问题,开发人员只能采用中止主进程,然后再手动地启动它的方法来解决。幸运的是,结合COM+ 1.5,XP提供了自动再生功能。需要使用这一功能时,只要在“缓冲池&再生”标签中对自动再生功能进行配置即可。
我们可以通过指定Lifetime Limit值,让COM+在经过预先设定好的时间后关闭应用程序。对于内存而言,缺省的值是0。如果在设置过程中发现有问题,可以点击“恢复缺省值”按钮将值设置为缺省的值。在应用程序的高级选项上,注意lifetime limit与空闲时间管理选项是有区别的。
“高级”按钮上“服务器进程关闭”值表示在经过多长时间空闲后服务器应该关闭,持续时间这个值表示应用程序在关闭之前经历的时间(以分钟为单位)。
COM+提供的再生触发器有二种。第一种,如果在调用限制编辑框中指定一个数,则在对你的应用程序的调用超过这个限制数字后,COM+就会使应用程序再生。指定的数字是指对应用程序内所有对象的调用,其缺省的数字是0。第二,在生成指定数量的对象表示后,应用程序就会再生。对象表示在这里指COM+ 1.5在应用程序中生成的对象的总和,对象表示限制的设定在“对象表示限制”编辑框中设定,其缺省值也是0。
一旦触发了再生服务,COM+ 1.5将激活请求引导给一个主进程,等待客户端计算机发布被再生进程中对象的引用。在“等待时间”编辑框中,我们可以设定在对进程进行两重前COM+ 1.5应该等待的时间。“等待时间”结束后,COM+ 1.5就会中止应用程序的执行。“等待时间”的缺省时间是15分钟。
最后,需要注意的是,如果将一个COM+应用程序配置成系统服务,就不能再使用再生功能了。此外,我们不能对一个暂停的应用程序使用再生功能。另一方面,我们可以通过编程的方式对再生参数进行配置。要配置与时间和内存有关的再生功能,可以使用该应用程序的Catalog对象的RecycleMemoryLimit和RecycleLifetimeLimit属性。如果要对暂停时间进行配置,可以使用RecycleExpirationTimeout属性。
//在激活250个对象后,FirstApp将被再生
//hres = SetRecycleByActivations("FirstApp",250);
HRESULT SetRecycleByActivations(LPCSTR lpcszAppName,DWORD dwActivations)
{
//检查应用程序名是否有效
if(_bstr_t(lpcszAppName) == _bstr_t(""))
{
return E_INVALIDARG;
}
HRESULT hres = S_OK;
ICOMAdminCatalog2* pCatalog = NULL;
hres = ::CoCreateInstance(CLSID_COMAdminCatalog, NULL,CLSCTX_SERVER,
IID_ICOMAdminCatalog2,(void**)&pCatalog);
ICatalogObject* pApplication = NULL;
ICatalogCollection* pApplicationCollection = NULL;
long nCountofApp = 0;
int index = 0;//应用程序的索引
//获取应用程序集
hres = pCatalog-GetCollection(_bstr_t("Applications"),
(IDispatch**)&pApplicationCollection);
pCatalog-Release();
hres = pApplicationCollection-Populate();
hres = pApplicationCollection-get_Count(&nCountofApp);
hres = COMADMIN_E_OBJECT_DOES_NOT_EXIST;
for(index=0; index
{
//获取当前的应用程序
hres = pApplicationCollection-get_Item
(index,(IDispatch**)&pApplication);
_variant_t varName;
pApplication-get_Name(&varName);
_bstr_t bstrName(varName);
if(bstrName == _bstr_t(lpcszAppName))
{
long ret = 0;
_variant_t varActivationLimit((long)dwActivations);
hres = pApplication-put_Value(_bstr_t("RecycleActivationLimit"),
varActivationLimit);
hres = pApplicationCollection-SaveChanges(&ret);
}
pApplication-Release();
}
pApplicationCollection-Release();
return hres;
}
如果要通过编程的方式配置调用或激活的次数限制,可以设置RecycleCallLimit或RecycleActivationLimit属性。
应用程序缓冲池
应用程序缓冲池是COM+ 1.5提供的“应用程序再生服务”的又一重要功能,与再生功能一样,它也通过应用程序属性页上的“缓冲池&再生”标签进行配置。只有服务器应用程序才能使用缓冲池服务,由于库应用程序没有自己的主进程,就此不能使用缓冲池服务。库应用程序的缓冲池参数与加载它们的服务器应用程序相同。
这一特性使得我们能够配置一些表示托管应用程序的组件的替换进程。在以前版本的COM+中,应用程序中所有的组件实例都被分配给同一个主进程。尽管这是标准COM的缺省设置,普通的COM本地服务器开发人员仍然能够为每一个对象指定一个进程。通过配置进程缓冲池,COM+ 1.5使我们能够精确地控制启动的进程数量。缓冲池大小编辑框用来配置缓冲池中进程的数量,缺省的值是1,这意味着与在COM+ 1.0中一样,一个进程托管着应用程序中所有组件的实例。如果将该值设定为大于1的一个数,在进程数量没有达到缓冲区大小之前,COM+ 1.5为每一个新的组件实例建立一个进程。此后,COM+则开始将新的组件实例以循环的方式分配给现有的进程。缓冲池极限的最大值是999999,这一数字已经适合所有种类的应用程序使用。
应用程序缓冲池作为一种错误解决技术非常有用。如果一个进程因错误和异常需要关闭,其他的进程以及它们的客户端不会有什么问题。应用程序缓冲池技术也使我们具有了有效的负载平衡能力,使我们无需借助单独的负载平衡和多台计算机,就能够通过COM+ 1.5将不同的实例分配给不同的进程。