Web Service 客户机运行时故障诊断技巧
使用这些技巧对 Web Service 客户机进行故障诊断。
本主题中每个部分描述一个问题,这些问题在 Web Service 客户机运行时期间可能遇到。还提供了有助于对问题进行故障诊断的解决方案。
使用 ASYNC_TIMEOUT_MILLISECONDS 属性来避免接收 JAX-WS 同步客户机的超时异常
((BindingProvider) port).getRequestContext().put(com.ibm.websphere.webservices.jaxws.Constants.ASYNC_TIMEOUT_MILLISECONDS, 30000);
与远程主机的连接失败
- 如果该错误消息中列出的主机名是正确的主机名,那么需要验证具有该 Web Service 的应用程序是否正在运行以及是否可用。
- 如果该错误消息中列出的主机名是不正确的主机名,那么可能需要更新该 Web Service 的 WSDL 文件,或者覆盖该主机名需要使用的端点 URL。要覆盖 Web Service 端点 URL,请参阅“配置 Web Service 客户机绑定”信息,以了解如何配置端口信息。
在 Solaris 环境中运行带有 ibm-jaxrpc-client.jar 文件的 Web Service 客户机可导致异常
java -jar <your_client_application>.jar, <main_class_file>
因为 Sun JDK 类装入规范比 IBM® JDK 规范更严格,所以会出现该问题。
- 使用 -classpath 选项取代 -jar 选项,例如:
java -jar <java_application>.jar, <main_class_file >
- 将 -Djava.ext.dirs 选项与 -jar 选项配合使用,例如,
export WAS_HOME=/opt/IBM/WebSphere/AppServer ${WAS_HOME}/java/jre/bin/java -Djava.ext.dirs=${WAS_HOME}/runtimes -jar <your_client_application>.jar, <your_client_application>.args
- 修改 Manifest.MF 中的类路径以包括需要的 Java 归档 (JAR) 文件,例如,
Class Path: /opt/IBM/WebSphere/AppServer/runtimes/ibm-jaxrpc-client.jar
当使用 HTTP 来连接不基于专用 IP 地址的服务端点接口时,解析 DNS 会导致性能问题
当使用 HTTP 来连接基于专用 IP 地址的服务端点接口时,DNS 服务经常不可用。因此,在 DNS 解析期间,性能会降低。
在 Web Service 引擎中的出站 HTTP 连接程序尝试解析主机地址名称和超时的情况下,会出现此问题。
可以修改目标 IP 地址的 HOSTS 文件以避免解析 DNS。
运行时迁移错误
WSWS3701E: Error: An exception was encountered. Use wsdeploy to deploy your application.
This might correct the problem. The exception is <exception data>.
此异常表明在运行使用 V6 之前版本支持的工具开发的应用程序时,发生了问题。该问题的解决方案是卸载该应用程序,然后运行 wsdeploy 命令并重新部署该应用程序。
Java API for XML-based RPC (JAX-RPC) 应用程序支持 wsdeploy 命令。由应用程序服务器实现的 Java API for XML-Based Web Services (JAX-WS) 编程模型不支持 wsdeploy 命令。如果 Web Service 应用程序仅包含 JAX-WS 端点,那么您不需要运行 wsdeploy 命令,这是因为此命令仅用来处理 JAX-RPC 端点。
某些 Web 服务描述语言 (WSDL) 文件的应用程序服务器运行时期间显示了 WebServicesFault 异常
某些 WSDL 文件的应用程序服务器运行时期间显示了 WebServicesFault 异常,因为这些文件定义了带有 document style 和 literal use 的操作,并且使用 SOAP 头来传递输入数据。
如果 WSDL 文件定义了带有 document style 和 literal use 的操作,并且此操作将输入映射到 SOAP 头,那么 Web Service 运行时找不到目标服务的正确操作,并显示 WebServicesFault 异常。
要解决该问题,更改 WSDL 文件,使操作不使用 SOAP 头来传递输入数据。
增加 ConnectionIOTimeOut 参数的值以避免在托管 Web Service 时收到异常
当在 WebSphere Application Server 上托管 Web Service 时,将显示以下异常:java.net.SocketTimeOutException: 读超时。
客户机和 Web Service 之间的低速网络连接导致此问题。在这些情况下,Web Service 引擎读完 SOAP 请求之前 HTTP 套接字可能会超时。在大多数情况下,整个网络中活动突然增加会导致此问题。如果客户机通过低速网络连接访问 Web Service,且 SOAP 请求拥有大量的数据,那么也会发生此问题。
- 名称:ConnectionIOTimeOut
- 值:30
增加 syncTimeout 参数的值以避免在主管 Web Service 客户机时收到异常
如果未正确设置 Web Service 客户机所使用的 syncTimeout 参数,您也会接收到 java.net.SocketTimeOutException: 读超时错误。必须了解这一点,因为如果您将 ConnectionIOTimeout 参数设为零并希望可以像“HTTP 传输定制属性”中说明的那样防止超时,那么仅连接超时被阻止。确保来自 HTTP 客户机(可以是 Web Service 客户机)的请求不超时的唯一方法是增加 syncTimeout 参数设置的值。
syncTimeout 参数仅供 Web Service 客户机使用。可在 Web Service 存根(它是 Web Service 调用的超时)中设置此参数。
要解决该问题,请增加 Web Service 客户机的 syncTimeout 参数的值。要了解如何设置此参数,请参阅“ibm-webservicesclient-bnd.xmi 部署描述符”信息中的“配置 JAX-RPC Web Service 客户机绑定”。
在会话持久性打开的情况下或在集群环境中执行 Web Service 客户机应用程序可导致 WebServicesFault 错误
[mm/dd/yy hh:mm:ss:ttt EST] 0000006e SystemErr R WebServicesFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
faultString: java.io.IOException: Connection close: Read failed.Possible end of
stream encountered.
faultActor: null
faultDetail:
可以通过遵循下列两种方法之一来避免此错误:- 将 com.ibm.websphere.webservices.http.requestResendEnabled 属性设为 true,例如,com.ibm.websphere.webservices.http.requestResendEnabled=true。当此属性设为 true 时,如果请求已失败,那么会对
Web Service 客户机进行编程以重新发送该请求。如果更改了属性值,那么监视客户机运行时,因为该请求可能被发送两次。
例如,如果客户机是银行应用程序并且已将 com.ibm.websphere.webservices.http.requestResendEnabled 属性设为 true,那么一次交易可能会被记录到一个帐户中两次。请参阅“在管理控制台中使用 JVM 定制属性面板来配置其他 HTTP 传输属性”,以配置 com.ibm.websphere.webservices.http.requestResendEnabled 属性。
如果在 AIX® 或 Linux 操作系统上使用 IBM HTTP Server,那么可以将 MaxSpareThreads 属性与 httpd.conf 文件中的 MaxClients 属性设为同一值。例如,如果 MaxClients=600,那么将 MaxSpareThreads 的值更改为 600 (MaxSpareThreads=600)。
选择此方法来避免该错误的优点是,IBM HTTP Server 不会关闭空闲或接近空闲的连接。选择此方法的缺点是,哪怕是在活动很少的时间段期间,IBM HTTP Server 都会使用过多资源来使额外的线程保持为可用状态。只能在 AIX 或 Linux 操作系统上选择此方法。