在Windows 2008/2008 R2 上配置IIS 7.0/7.5 故障转移集群
本文主要是从:http://support.microsoft.com/kb/970759/zh-cn,直接转载,稍作修改裁剪而来,其中红色粗体部分,是我特别要说明的
若要配置 IIS 7.0 和 7.5 Web 服务器使用故障转移群集的高可用性,请按照下列步骤。下面更详细地介绍步骤 3 到步骤 7。本文内下文中的示例脚本可以用作任务的示例 IIS 7.0、 IIS 7.5 和 IIS 8.0。 其实应该还有DNS,AD,iscsi target 服务配置
- 在所有群集节点上安装 Web 服务器角色。有关详细信息,请访问下面的 Microsoft 网站:
http://technet.microsoft.com/en-us/library/cc771752.aspx() http://technet.microsoft.com/en-us/library/cc771752.aspx
- 在所有群集节点上安装的故障转移群集功能,并创建群集。有关详细信息,请访问下面的 Microsoft 网站:
http://technet.microsoft.com/en-us/library/dd197477.aspx() http://technet.microsoft.com/en-us/library/dd197477.aspx
- 设置将用于 IIS 共享配置文件共享。
- 在所有群集节点上配置 IIS 共享的配置。
- 在所有群集节点上配置 IIS 脱机配置文件的共享。 这一步可以不做,我就没做
- 配置 Web 站点 (包括关联的应用程序池),并且一个群集节点上指定其内容的位置。
- 通过创建一个通用脚本,在故障转移群集中配置您的 Web 站点的高可用性。
设置将用于 IIS 共享配置文件共享
- 创建一个将访问 IIS 共享的配置将使用该共享的用户。
- 创建文件共享。此共享将用于存储 IIS 共享的配置将所有群集节点上的 IIS 之间共享。有多个选项(选择其中之一即可):
- 在独立服务器上,不是任何故障转移群集的一部分,创建一个文件共享。
- 在另一台 Windows 服务器故障转移群集中,创建一个高可用性的文件共享。有关详细信息,请访问下面的 Microsoft 网站:
http://technet.microsoft.com/en-us/library/cc731844.aspx() http://technet.microsoft.com/en-us/library/cc731844.aspx
- 在承载高可用性 Web 站点相同的故障转移群集,创建高可用性的文件共享。有关详细信息,请访问下面的 Microsoft 网站:
- 在您在步骤 2 中创建的共享上设置的权限。为您在步骤 1 的文件共享的完全控制权限和 NTFS 权限的用户。
- 请确认所有群集节点都都可以浏览到该文件共享。文件共享的路径 \\ < 文件服务器 > \ < 共享 >。
在所有群集节点上配置 IIS 共享的配置
注意:没有与 IIS 共享服务器上配置 Windows 2008 因为缺少权限应用程序主机帮助器服务的问题。为共享配置工作,您必须执行以下步骤,Windows 2008 服务器上的 IIS 共享配置设置时。
- 打开管理的命令提示符。
- 运行以下命令:
net stop apphostsvc
- 运行以下命令:
sc privs apphostsvc SeImpersonatePrivilege/SeChangeNotifyPrivilege/SeTcbPrivilege 这一行命令,原始的中文文档有问题,我改过
- 运行以下命令:
net start apphostsvc 这一行命令,原始的中文文档有问题,我改过
完成这些步骤在群集中的每个 Windows 2008 服务器后,请在本节中继续设置 IIS 共享的配置,如所述。
在其中一个群集节点上的文件共享导出共享的配置:
- 导航到管理工具,然后单击Internet Information Services (IIS) 管理器。
- 在左窗格中,单击服务器名称节点。
- 双击共享配置图标。
- 在共享配置页中,单击导出配置导出配置文件操作窗格 (右窗格) 中从本地计算机到另一个位置。
- 在将配置导出对话框中,键入文件共享的路径 (\\ < 文件服务器 > \ < 共享 >) 中的物理路径框。
- 单击连接,然后键入用户名和密码的用户帐户具有访问该共享的共享的配置存储,然后单击确定。此帐户将用于访问共享资源。您应使用受限的 Active Directory 帐户不是域管理员。
- 在将配置导出对话框中,键入一个密码,用以保护加密密钥,然后单击确定。
- 在共享配置页中,单击以选中启用共享的配置复选框。
- 键入物理路径、 用户帐户,以及以前,您输入的密码,然后单击操作窗格中的应用。
- 在加密密钥密码对话框中,键入加密密钥密码的更早版本,将设置,然后单击确定。
- 在共享配置对话框中,单击确定。
- 单击确定。
在每个其他群集节点,请使用您刚导出的文件共享的共享的配置:
假如你这个共享存储是同一个故障转移集群中做的,必须要将相关的资源,切换到这台机器上,才能做
- 导航到管理工具,然后单击Internet Information Services (IIS) 管理器。
- 单击服务器名称节点。
- 双击共享配置图标。
- 在共享配置页中,单击以选中启用共享的配置复选框。
- 键入该文件共享的物理路径 (\\ < 文件服务器 > \ < 共享 >),该用户帐户,并且密码之前,输入然后在操作窗格中单击应用。
- 在加密密钥密码对话框中,键入加密密钥密码的更早版本,将设置,然后单击确定。
- 在共享配置对话框中,单击确定。
- 单击确定。
注意:有关如何设置共享配置 IIS 中的详细信息,请访问下面的 Microsoft 网站:
在所有群集节点上配置 IIS 脱机文件共享配置(似乎这一步不做也是可以的,我就没做)
在每个群集节点上,启用脱机文件:
- 安装桌面体验
- 导航到管理工具,然后单击服务器管理器。
- 在左窗格中,单击功能。
- 在右窗格中,单击添加功能。
- 单击以选中桌面体验复选框。
- 单击安装以安装桌面体验。
- 重新启动计算机。
- 在控制面板中,打开脱机文件。
- 单击启用脱机文件。不要不重新启动计算机,请稍后。
- 确保将高速缓存设置为只读。若要执行此操作,可提升的cmd窗口中运行以下命令:
REG ADD "HKLM\System\CurrentControlSet\Services\CSC\Parameters" /v ReadOnlyCache /t REG_DWORD /d 1 /f
- 重新启动计算机。
- 从该计算机浏览到文件服务器。用鼠标右键单击包含 IIS 共享的配置中,该共享,然后单击始终脱机可用。
注意如果要将相同的故障转移群集上具有高可用性的文件共享设置时,它承载 IIS 节点,始终脱机可用选项时不会出现您,请右键单击该共享上承载高可用文件服务器所使用的群集节点。您需要移动到另一个节点的高可用文件服务器应用程序。
- 在控制面板中,打开脱机文件。单击打开同步中心,然后单击日程安排。
- 对每一天或根据要求安排在脱机文件同步。您还可以配置脱机同步运行每隔几分钟。.即使您未设置上一个计划程序,Applicationhost.config 文件中的某些内容更改时,更改将会反映在 Web 服务器上。
注意:有关如何在 IIS 中配置共享配置为脱机文件的详细信息,请访问下面的 Microsoft 网站:
配置 Web 站点 (包括关联的应用程序池),并且一个群集节点上指定其内容的位置
查找拥有群集磁盘资源的群集节点的 Web 站点的内容文件所在的位置:
- 导航到管理工具,然后单击故障转移群集管理器。
- 连接到群集。如果您是在一个群集节点上,群集将自动显示在列表中。
- 在存储下查找网页内容将驻留在其的磁盘资源。若要执行此操作,展开存储树中的磁盘资源。请确保存储未由任何其他高可用性应用程序在群集上。您会发现在可用存储下的存储。
- 注意群集节点的该资源处于联机状态。您将在该群集节点上配置 IIS。
- 注意群集磁盘资源名称。您将使用此内容的文件。
在群集节点上的资源处于联机状态,Web 服务器配置为使用 Web 站点的内容的共享的磁盘:
- 导航到管理工具,然后单击Internet Information Services (IIS) 管理器。
- 在左窗格中,展开服务器节点。
- 展开网站,然后单击站点下的正在配置的站点。
- 在右窗格中,选择管理 Web 站点下的高级设置。
- 找到的物理路径属性在常规设置,然后键入在 Web 站点的内容文件的位置的位置。这是您在前一过程的第 5 步中记下的群集磁盘资源的位置。♢其实这个群集磁盘资源,有安全方面的要求,域账号有读写权限,包括以后新建的虚拟应用程序,使用新的群集磁盘资源,也要设置域账号有读写权限。♢ 对于ASP.NET 应用程序,还要设置该域账号对C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files 有读写的权限 ♢ 应用程序的物理路径凭据,也要设置为该域账号
- 单击确定。
创建故障转移群集管理器中的一个通用脚本来配置您的 Web 站点的高可用性
若要配置高可用性的 IIS Web 服务器中的最后一步,设置可用于监视的 Web 站点和网站应用程序池通用脚本资源:
- 在每个群集节点上,Windows\System32\inetsrv\Clusweb7.vbs 将这篇文章的末尾此脚本。 注意这个脚本不能保存带有编码格式的
- 默认情况下,脚本监视网站名为"默认 Web 站点"和名为"默认应用程序池"应用程序池。如果这不是正确的 Web 站点和应用程序池,更改网站名称和APP_POOL_NAME变量。请确保所有群集节点上存在相同的 Web 站点和应用程序池脚本中。请注意名称区分大小写。
- 导航到管理工具,然后单击故障转移群集管理器。
- 连接到群集。如果您是在一个群集节点上,群集将自动显示在列表中。
- 用鼠标右键单击该群集,然后单击配置服务或应用程序。向导将创建高可用性的工作负荷。
- 单击通用脚本。
- 从以下路径中选择脚本文件: %systemroot%\System32\Inetsrv\clusweb7.vbs
- 客户端将用于连接到高可用性的 Web 站点的 Web 站点名称设置的客户端访问点 (CAP) 的名称。指定静态的 Ip 用于首字下沉的网站。如果您使用的 DHCP,则将不显示此选项。
- 在选择存储步骤中,选择 Web 站点内容文件驻留在其的群集共享的磁盘。存储类型应为未使用任何其他高可用性应用程序在群集上。请注意是否用于 IIS 共享配置文件共享同一个群集上,此处应能使用不同的磁盘资源。
- 确认这些设置后,该向导将创建群集组,群集资源和资源之间的依赖关系,然后使资源联机。
注意:若要承载相同的故障转移群集上的多个高可用性的 Web 站点,请按照与上述相同的步骤。但是,为每个 Web 站点和其他群集的共享的存储使用一个不同的脚本文件。例如,%systemroot%\system32\inetsrv 中使用的第一个网站的第三个,第二,clweb7 3.vbs clweb7-2.vbs clusweb7.vbs 等。每个脚本文件用于监测站点不同的站点和应用程序池。
重要:下面的脚本仅用于示例并不显式支持通过 Microsoft。使用此脚本在群集环境中的 IIS 7.0,IIS 7.5 或 IIS 8.0 是需要您自担风险。
'<begin script sample> 'This script provides high availability for IIS websites
'By default, it monitors the "Default Web Site" and "DefaultAppPool"
'To monitor another web site, change the SITE_NAME below
'To monitor another application pool, change the APP_POOL_NAME below
'More thorough and application-specific health monitoring logic can be added to the script if needed Option Explicit DIM SITE_NAME
DIM APP_POOL_NAME
Dim START_WEB_SITE
Dim START_APP_POOL
Dim SITES_SECTION_NAME
Dim APPLICATION_POOLS_SECTION_NAME
Dim CONFIG_APPHOST_ROOT
Dim STOP_WEB_SITE 'Note:
'Replace this with the site and application pool you want to configure high availability for
'Make sure that the same web site and application pool in the script exist on all cluster nodes. Note that the names are case-sensitive.
SITE_NAME = "Default Web Site"
APP_POOL_NAME = "DefaultAppPool" START_WEB_SITE = 0
START_APP_POOL = 0
STOP_WEB_SITE = 1
SITES_SECTION_NAME = "system.applicationHost/sites"
APPLICATION_POOLS_SECTION_NAME = "system.applicationHost/applicationPools"
CONFIG_APPHOST_ROOT = "MACHINE/WEBROOT/APPHOST" 'Helper script functions 'Find the index of the website on this node
Function FindSiteIndex(collection, siteName) Dim i FindSiteIndex = -1 For i = 0 To (CInt(collection.Count) - 1)
If collection.Item(i).GetPropertyByName("name").Value = siteName Then
FindSiteIndex = i
Exit For
End If
Next End Function 'Find the index of the application pool on this node
Function FindAppPoolIndex(collection, appPoolName) Dim i FindAppPoolIndex = -1 For i = 0 To (CInt(collection.Count) - 1)
If collection.Item(i).GetPropertyByName("name").Value = appPoolName Then
FindAppPoolIndex = i
Exit For
End If
Next End Function 'Get the state of the website
Function GetWebSiteState(adminManager, siteName) Dim sitesSection, sitesSectionCollection, siteSection, index, siteMethods, startMethod, executeMethod
Set sitesSection = adminManager.GetAdminSection(SITES_SECTION_NAME, CONFIG_APPHOST_ROOT)
Set sitesSectionCollection = sitesSection.Collection index = FindSiteIndex(sitesSectionCollection, siteName)
If index = -1 Then
GetWebSiteState = -1
End If Set siteSection = sitesSectionCollection(index) GetWebSiteState = siteSection.GetPropertyByName("state").Value End Function 'Get the state of the ApplicationPool
Function GetAppPoolState(adminManager, appPool) Dim configSection, index, appPoolState set configSection = adminManager.GetAdminSection(APPLICATION_POOLS_SECTION_NAME, CONFIG_APPHOST_ROOT)
index = FindAppPoolIndex(configSection.Collection, appPool) If index = -1 Then
GetAppPoolState = -1
End If GetAppPoolState = configSection.Collection.Item(index).GetPropertyByName("state").Value
End Function 'Start the w3svc service on this node
Function StartW3SVC() Dim objWmiProvider
Dim objService
Dim strServiceState
Dim response 'Check to see if the service is running
set objWmiProvider = GetObject("winmgmts:/root/cimv2")
set objService = objWmiProvider.get("win32_service='w3svc'")
strServiceState = objService.state If ucase(strServiceState) = "RUNNING" Then
StartW3SVC = True
Else
'If the service is not running, try to start it
response = objService.StartService() 'response = 0 or 10 indicates that the request to start was accepted
If ( response <> 0 ) and ( response <> 10 ) Then
StartW3SVC = False
Else
StartW3SVC = True
End If
End If End Function 'Start the application pool for the website
Function StartAppPool() Dim ahwriter, appPoolsSection, appPoolsCollection, index, appPool, appPoolMethods, startMethod, callStartMethod
Set ahwriter = CreateObject("Microsoft.ApplicationHost.WritableAdminManager") Set appPoolsSection = ahwriter.GetAdminSection(APPLICATION_POOLS_SECTION_NAME, CONFIG_APPHOST_ROOT)
Set appPoolsCollection = appPoolsSection.Collection index = FindAppPoolIndex(appPoolsCollection, APP_POOL_NAME)
Set appPool = appPoolsCollection.Item(index) 'See if it is already started
If appPool.GetPropertyByName("state").Value = 1 Then
StartAppPool = True
Exit Function
End If 'Try To start the application pool
Set appPoolMethods = appPool.Methods
Set startMethod = appPoolMethods.Item(START_APP_POOL)
Set callStartMethod = startMethod.CreateInstance()
callStartMethod.Execute() 'If started return true, otherwise return false
If appPool.GetPropertyByName("state").Value = 1 Then
StartAppPool = True
Else
StartAppPool = False
End If End Function 'Start the website
Function StartWebSite() Dim ahwriter, sitesSection, sitesSectionCollection, siteSection, index, siteMethods, startMethod, executeMethod
Set ahwriter = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
Set sitesSection = ahwriter.GetAdminSection(SITES_SECTION_NAME, CONFIG_APPHOST_ROOT)
Set sitesSectionCollection = sitesSection.Collection index = FindSiteIndex(sitesSectionCollection, SITE_NAME)
Set siteSection = sitesSectionCollection(index) if siteSection.GetPropertyByName("state").Value = 1 Then
'Site is already started
StartWebSite = True
Exit Function
End If 'Try to start site
Set siteMethods = siteSection.Methods
Set startMethod = siteMethods.Item(START_WEB_SITE)
Set executeMethod = startMethod.CreateInstance()
executeMethod.Execute() 'Check to see if the site started, if not return false
If siteSection.GetPropertyByName("state").Value = 1 Then
StartWebSite = True
Else
StartWebSite = False
End If End Function 'Stop the website
Function StopWebSite() Dim ahwriter, sitesSection, sitesSectionCollection, siteSection, index, siteMethods, startMethod, executeMethod, autoStartProperty
Set ahwriter = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
Set sitesSection = ahwriter.GetAdminSection(SITES_SECTION_NAME, CONFIG_APPHOST_ROOT)
Set sitesSectionCollection = sitesSection.Collection index = FindSiteIndex(sitesSectionCollection, SITE_NAME)
Set siteSection = sitesSectionCollection(index) 'Stop the site
Set siteMethods = siteSection.Methods
Set startMethod = siteMethods.Item(STOP_WEB_SITE)
Set executeMethod = startMethod.CreateInstance()
executeMethod.Execute() End Function 'Cluster resource entry points. More details here:
'http://msdn.microsoft.com/en-us/library/aa372846(VS.85).aspx 'Cluster resource Online entry point
'Make sure the website and the application pool are started
Function Online( ) Dim bOnline
'Make sure w3svc is started
bOnline = StartW3SVC() If bOnline <> True Then
Resource.LogInformation "The resource failed to come online because w3svc could not be started."
Online = False
Exit Function
End If 'Make sure the application pool is started
bOnline = StartAppPool()
If bOnline <> True Then
Resource.LogInformation "The resource failed to come online because the application pool could not be started."
Online = False
Exit Function
End If 'Make sure the website is started
bOnline = StartWebSite()
If bOnline <> True Then
Resource.LogInformation "The resource failed to come online because the web site could not be started."
Online = False
Exit Function
End If Online = true End Function 'Cluster resource offline entry point
'Stop the website
Function Offline( ) StopWebSite()
Offline = true End Function 'Cluster resource LooksAlive entry point
'Check for the health of the website and the application pool
Function LooksAlive( ) Dim adminManager, appPoolState, configSection, i, appPoolName, appPool, index i = 0
Set adminManager = CreateObject("Microsoft.ApplicationHost.AdminManager")
appPoolState = -1 'Get the state of the website
if GetWebSiteState(adminManager, SITE_NAME) <> 1 Then
Resource.LogInformation "The resource failed because the " & SITE_NAME & " web site is not started."
LooksAlive = false
Exit Function
End If 'Get the state of the Application Pool
if GetAppPoolState(adminManager, APP_POOL_NAME) <> 1 Then
Resource.LogInformation "The resource failed because Application Pool " & APP_POOL_NAME & " is not started."
LooksAlive = false
Exit Function
end if ' Web site and Application Pool state are valid return true
LooksAlive = true
End Function 'Cluster resource IsAlive entry point
'Do the same health checks as LooksAlive
'If a more thorough than what we do in LooksAlive is required, this should be performed here
Function IsAlive() IsAlive = LooksAlive End Function 'Cluster resource Open entry point
Function Open() Open = true End Function 'Cluster resource Close entry point
Function Close() Close = true End Function 'Cluster resource Terminate entry point
Function Terminate() Terminate = true End Function
'<end script sample>
在Windows 2008/2008 R2 上配置IIS 7.0/7.5 故障转移集群的更多相关文章
- 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...
- windows server 2012R2 故障转移集群配置
配置说明: AD:10.10.1.10/24 Node-2:10.10.1.20/24 Node-3:10.10.1.30/24 zhangsan-PC:10.10.1.50/24 VIP1:10 ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
原文地址: http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...
- (转载) 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集群,因为AlwaysOn是基于Windows的故障转移集群的 在讲解步骤之前需要了解一下故障转移集群仲裁 ...
- 部署AlwaysOn第一步:搭建Windows服务器故障转移集群
在Windows Server 2012 R2 DataCenter 环境中搭建集群之前,首先要对Windows服务器故障转移集群(Windows Server Failover Cluster,简称 ...
- 从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)
本篇主要讲配置Windows 故障转移集群及遇到的相关问题(坑),因为AlwaysOn是基于Windows的故障转移集群的 在讲解步骤之前需要了解一下故障转移集群仲裁配置 四种集群的仲裁配置: 1.多 ...
- Windows Server2012 故障转移集群之动态仲裁(Dynamic Quorum)
本篇文章主要介绍Windows2012的故障转移集群一个新功能“动态仲裁”,默认该功能是开启的: 动态仲裁能在当前群集投票出现分歧的情况下取消某些节点的投票权限,比如偶数个节点的群集环境.仲裁见证和动 ...
- 在Windows Server 2012中搭建SQL Server 2012故障转移集群
OK~ WSFC 2012 R2 年度盛宴开始~ 在本文中,老王将用一系列的场景,把动态仲裁,动态见证,票数调整,LowerQuorumPriorityNodeID,阻止仲裁等群集仲裁技术串起来,完成 ...
随机推荐
- [Leetcode][JAVA] Pascal's Triangle I, II
Pascal's Triangle: Given numRows, generate the first numRows of Pascal's triangle. For example, give ...
- struts2的运行原理及配置文件
struts2官方运行原理图: 1,客户发送请求(url地址就是请求),tomcat接到请求会找到相应的应用web.xml配置文件. 2,web.xml中filter拦截器把你的请求接收到,并进入Fi ...
- 理解assign,copy,retain变strong
举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一 ...
- [Java Web] 6、Tomcat服务器的安装及配置以及JSP技术笔记
目录 1.Web容器简介 2.Tomcat粗介及配置粗讲 3.Tomcat服务器配置 3-1.修改端口号 3-2.配置虚拟目录 3-3.配置首页 4.JSP执行流程 5.JSP粗略了解 1 ...
- [ACM_水题] UVA 11729 Commando War [不可同时交代任务 可同时执行 最短完成全部时间 贪心]
There is a war and it doesn't look very promising for your country. Now it's time to act. You have a ...
- 更新日志 - BugHD 与你的应用一起成长
上周 BugHD Android客户端上线了,下载地址在此,欢迎大家体验并提出反馈.本周增加 BugHD 和 fir.im 的新功能,同时也做出一些体验优化. BugHD 新增功能 1.新增安装量.启 ...
- Abstract Server模式,Adapter模式和Bridge模式
简易的台灯 Abstract Server模式 谁拥有接口. 接口属于它的客户,而不是它的派生类. 接口和客户之间的逻辑关系,强于接口和其派生类的逻辑关系. 逻辑关系和实体关系的强度是不一致的.在实体 ...
- Leetcode-203 Remove Linked List Elements
#203. Remove Linked List Elements Remove all elements from a linked list of integers that have val ...
- Log4cpp介绍及使用
Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能.使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流.内存字符串队列.文件.回滚文件.调试器.Wind ...
- Java注释Override、Deprecated、SuppressWarnings详解
一.什么是注释 说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J2SE5 ...