解决向集群部署 Workshop 应用程序时产生 RuntimeExceptions 的问题


问题描述
可以向一个集群部署所有 WebLogic Workshop 应用程序。在向集群部署包含 JWS 或 JPD 文件的 Workshop 应用程序时,某些情况下会产生下列异常:

java.lang.RuntimeException: frontEndHost is not configured for the cluster and hostname is not set in wlw-config or wlw-runtime-config

java.lang.RuntimeException: Server <ServerName> in cluster <ClusterName> does not have a configured cluster address

本模式将讨论这些异常的产生原因,并将详细给出防止产生这些异常的措施。

故障排除
请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。

快速链接

为什么发生此问题?


SOAP endpoint 不负责代理服务器或负载平衡
要了解此问题,先要了解 Web Service 的基础知识。所有 Web Service 都以 SOAP endpoint 作为唯一标识。SOAP endpoint 是下面这种格式的 URL:http://workshop.bea.com:7001/web/Hello.jws?WSDL
 
此 URL 包含访问 Web Service 所使用的协议的相关信息,还包含服务器运行时所在的主机名及服务器监听 HTTP 连接所使用的端口号的相关信息。

WebLogic Workshop 在单服务器模式下运行时会用当前部署了应用程序的服务器中的信息替换 SOAP endpoint。

在需要向集群部署 Web Service 时,这就会引发问题。

假定有以下配置:

集群配置

返回页首

在这种情况下,如果客户端访问被管服务器 1 且按照单服务器行为用 host2 填充了 SOAP endpoint,则客户端下次尝试访问服务时,将尝试直接访问 host2,而不通过代理访问。如果 host2 不可用或有防火墙阻止外部客户端直接访问 host2,客户端将无法再访问服务。

通过 wlw-runtime-config.xml 文件解决问题

为防止出现此类情况,Workshop 运行时提供了一种解决办法来解决此问题。该解决办法是创建一个名为 wlw-runtime-config.xml 的文件。
如果配置得正确,该文件可使 Workshop 运行时使用该文件中的值替换 SOAP endpoint 中的主机名、HTTP 端口及协议值。

该文件的格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<wlw-runtime-config xmlns="http://www.bea.com/2003/03/wlw/config/">
    <wlw-config application-name="TestApp" context-path="/web">
    <hostname>myhost</hostname>
    <protocol>http</protocol>
    <http-port>7001</http-port>
    </wlw-config>
</wlw-runtime-config>


其中,
application-name 是在服务器上部署的应用程序的名称
context-path 是作为应用程序的一部分部署的 Web 项目的 contextpath 值
hostname 是代理服务器的主机名
protocol 是代理服务器接受请求时所使用的协议
http-port 是代理服务器监听传入请求所使用的端口号

当集群前有多个层 (layer) 时,必须在此文件中指定入口点服务器的信息。

假定有以下这种情况,有一个硬件负载平衡器,它将请求负载平衡到两个代理服务器,而这两个代理服务器又将请求代理给集群。在这种情况下,必须在文件中将硬件负载平衡器指定为所有客户端的入口点。

如果此文件不存在或配置得不正确,将产生下列异常:

java.lang.RuntimeException: frontEndHost is not configured for the cluster and hostname is not set in wlw-config or wlw-runtime-config

返回页首


产生这种异常时需要做的第一件事是确保已创建此文件且集群中每个被管服务器的域目录中均有此文件。如果此文件存在,但仍然产生了异常,请检查应用程序中包含 JWS 或 JPD 的所有项目在 wlw-runtime-config.xml 文件中是否都有相应的条目。请注意,更改此文件后,必须重新启动被管服务器才能使更改生效。

JPD 文件需要此文件的原因是所有 JPD 都是以 Web Service 形式体现的。

如果应用程序中有不止一个 Web 项目,则需要像下面这样在 wlw-runtime-config.xml 中指定多个 wlw-config 条目:

<?xml version="1.0" encoding="UTF-8"?>
<wlw-runtime-config xmlns="http://www.bea.com/2003/03/wlw/config/">
    <wlw-config application-name="TestApp" context-path="/web">
    <hostname>myhost</hostname>
    <protocol>http</protocol>
    <http-port>7001</http-port>
    </wlw-config>
<wlw-config application-name="TestApp" context-path="/webapp">
    <hostname>myhost</hostname>
    <protocol>http</protocol>
    <http-port>7001</http-port>
    </wlw-config>
</wlw-runtime-config>


解决此问题还有另外两种方法,下面就介绍它们。

方案 1 - wlw-config.xml 文件
所有 Web、Web Service 及进程项目的 WEB-INF 目录中都有一个名为 wlw-config.xml 的文件。该文件的格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<wlw-config xmlns="http://www.bea.com/2003/03/wlw/config/">

    <!-- <hostname>production_host</hostname> -->
    <!-- <protocol>http</protocol> -->
    <!-- <http-port>8000</http-port> -->
    <!-- <https-port>8003</https-port> -->
    <!--
    <service>
        <class-name>com.myco.MyWebService</class-name>
        <protocol>https</protocol>
    </service>
    -->
</wlw-config>


请注意,在此文件中指定值与使用 wlw-runtime-config.xml 的作用相同,且实际上比较起来此方案更受约束。此文件的作用是将值作为生成过程的一部分硬编码到 EAR 文件中。对此文件做任何更改都必须再次生成应用程序。

使用此文件设置值后,即无法再使用 wlw-runtime-config.xml 文件进行覆盖。
文件范围是 Web 项目。因此,如果应用程序中有多个项目,则必须修改每个文件。

方案 2 - FrontendHost
另一个方案是在服务器控制台中指定 FrontendHost 值。这样将使 WSDL 具有正确的值。请注意,这会影响在服务器上部署的所有应用程序。

考虑到各种方案所提供的功能,BEA 建议使用 wlw-runtime-config.xml 文件方案,因为它只影响特定 Workshop 应用程序,而且允许用户在运行时对其进行更改而不需要重新生成应用程序。请注意,在使用 wlw-runtime-config.xml 文件指定主机名时,对此文件做任何更改都必须重新启动服务器。

其它成因
如果项目中没有可用的 Web Service,却仍然产生异常,请检查 Service Pack 版本。在 WLW 8.1.4 之前的版本中存在一种限制,也就是即使将 service 控件作为项目的一部分使用,仍会要求此文件存在。  

此问题的变通方法是创建一个虚拟 wlw-runtime-config.xml 文件,其中为每个使用 service 控件的项目都提供了一个 wlw-config 条目。文件中指定的值不必为有效值,实际上永远不会使用这些值。BEA 建议使用类似“DummyNameNoWebService”的名称,这样可以确保在您决定将某个 Web Service 作为同一项目的一部分实现时,该值具有足够的描述性,能够让管理员知道需要修改它。

如果应用程序不包含任何可通过 HTTP 访问的 Web Service,且 JMS 是访问服务时唯一可以使用的协议,则不需要此文件。不过,WLW 8.1.4 中当前有一个限制,要求此文件必须存在。此问题的变通方法与上一个相同,也是使用虚拟 wlw-runtime-config.xml 文件。 

返回页首


集群地址问题
向集群部署 Workshop 应用程序时出现的另一个常见问题是下列异常:

java.lang.RuntimeException: Server <ServerName> in cluster <ClusterName> does not have a configured cluster address

出现此异常的原因是一项要求,即部署 Workshop 应用程序的集群必须配置集群地址值。

可以在控制台或 config.xml 中像下面这样配置此值:

<Cluster Name="myclust" ClusterAddress="host:7001,host:7003" MulticastAddress="237.0.0.1"/>

快速参考

返回页首

已知问题
您可以定期查看您的 Workshop 版本的“发行说明”以获得 Service Pack 中的“已知问题”或“已解决问题”的详细信息,而且还可浏览集群和 RuntimeException 方面的问题。  方便起见,下面提供了这些发行说明的链接:
搜索还将返回“发行说明”,以及其它“支持解决方法”和与 CR 相关的信息(在需要更多帮助?中说明)。如果客户签订了技术支持合同,则可以登录 http://support.bea.com/,登录后会看到为 Solutions 和 Bug Central 提供的 Browse portlet,可在其中按产品版本浏览最新提供的 CR。

需要更多帮助?
如果您已经理解这个模式,但仍需要其它帮助,您可以:
  1. http://support.bea.com/ 上查询 AskBEA(例如,使用“RuntimeException deploy workshop application”),以查找其它已发布的解决办法。技术支持合同客户:确保已经登录,可以访问提供的与 CR 有关的信息。
  2. http://newsgroups.bea.com/ 上,向 BEA 的某个新闻组提出更详细具体的问题。
如果这还不能解决您的问题,并且您拥有有效的技术支持合同,您可以通过登录以下网站来打开支持案例:http://support.bea.com/

反馈

请给我们提供您的意见,说明此支持诊断模式“解决向集群部署 Workshop 应用程序时产生 RuntimeExceptions 的问题”一文是否有所帮助、您需要的任何解释,以及对支持诊断模式的新主题的任何要求。


免责声明:

依据 BEA 与您签署的维护和支持协议条款,BEA Systems, Inc. 在本网站上提供技术技巧和补丁供您使用。虽然您可以将这些信息和代码与您获得 BEA 授权的软件一起使用,但 BEA 并不对所提供的技术技巧和修补程序做任何形式的担保,无论是明确的还是隐含的。

本文档中引用的任何商标是其各自所有者的财产。有关完整的商标信息,请参考您的产品手册。