jCOM 问题故障排除


问题描述
WebLogic jCOM 是一种软件桥,它允许部署在 WebLogic Server 上的 Java/J2EE 对象与 Microsoft ActiveX 组件、Visual Basic 和 C++ 对象以及其它 COM/DCOM 环境之间的双向访问。此模式提供了可能因不当配置、许可、升级和注册表问题而引起的一些常见异常和错误,以及解决方法的信息。还提供了关于 COM、DCOM 和 jCOM 的背景信息,以及使“WLS 访问 COM”工作和获得调试信息的步骤。

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

快速链接

返回页首

为什么发生此问题?

下面是使用 jCOM 遇到的一些常见问题和可采取的解决问题措施。

许可证 (license) 错误
在 Windows NT 上,许可为获得 beahomelist 检查 C:\bea 以查找有效的 6.1 条目,然后检查许可证 (license) 的目录。在将 WLS 安装到 D:\ 上时,会发生一些 jCOM 引起的许可证 (license) 错误。变通方法是在 C:\ 上创建一个目录。

对于 Unix,许可为获得有效条目检查 /usr/local/bea$HOME/bea。下列内容被视为 license.bea 中的有效许可证 (license) 条目:
<license-group format="1.0" product="WebLogic Server" release="6.1">

无法对 Com 运行独立 java 客户端
WLS 7.0 和 WLS 8.1 不支持对 Com 运行独立 java 客户端。请参阅 http://edocs.bea.com/wls/docs70/jcom/overview.html#1114453

AutomationException:0x80040154 - Class Not Registered
此异常通常由未正确注册的 COM 对象引起。
如果 COM 组件是 DLL,运行您的 COM 组件上的 regsvr32 以确保其使用 Windows 注册。
如果尝试使用 jCOM 与 DLL 形式的 COM 组件对话,您将得到 AutomationException:0x80040154 - Class Not Registered 错误。由于您通过 DCOM 进行访问,所以要访问该 DLL,您需要使用 Setdllhost 配置一个 Surrogate EXE。

COM2EJB 导致 socket 保持在 CLOSE_WAIT 状态
此问题 CR095485 已在 WLS 7.0 SP5 和 WLS 8.1 SP3 中解决。

JAVA2COM 应用程序在 WLS 6.1 升级到 WLS 7.0 后不再工作
从 WLS 6.1 升级到 7.0 之后,出现下列错误:

java.rmi.RemoteException:EJB Exception:; nested exception is:
        java.lang.NoSuchMethodError:com.bea.jcom.AuthInfo.d()Ljava/lang/String


上述问题是由 WLS 6.1 和 WLS 7.0 之间 package 名称的更改引起的。
  1. 确保包名称 com.bea.jcom.NTLMAuthenticate 被更改为调用 java 代码中的 com.linar.jintegra.NTLMAuthenticate。 
  2. 在 CLASSPATH 中不包括 jcom.jar 再次进行编译。

COM2JAVA 错误
COM2JAVA 出现以下错误:
  • 对于 Early 或 Late 绑定:
“No Object for Moniker”

备注:如果您没有创建 weblogic.jndi.Environment 对象(在获得身份验证的连接时要创建的第一个对象)的权限,您将看到“No object for moniker”消息。此处错误由权限配置(在 WLS 端)引起,并非由失败的 jCOM jvm 注册表或有故障的 ORM 引起。
  • 对于 Zero 客户端安装:
“Run-time error '70':Permission Denied”
两种错误都可能由使用 Microsoft MS04-011 Security Patch (835732) 所遇到的问题引起。此问题 CR182512 已在 WLS 8.1 SP3 中解决。

DCOM socket 由于 java.net.SocketException 而关闭:socket 关闭
可能出现下列错误:

java.net.SocketException:Socket closed at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99) at java.net.SocketOutputStream.write(SocketOutputStream.java:124) at com.linar.jintegra.RpcConnectionHandler.send(RpcConnectionHandler.java:272)

此问题 CR187469 已在 WLS 8.1 SP4 中解决。
如果 COM 和 WLS 在同一个 Window 计算机中运行,一个升级到此 Service Pack 的替代方案是使用进程中本地模式 (native-mode) 以获得更佳性能。

Early Bound 方法调用的问题
请切记,COM 在很大程度上取决于 MS Windows 注册表和全局标识符。例如,封装器 (wrappers) 包含每个生成对象的全球唯一标识符 ( Global Unique Identifiers, GUID)。这些 GUID 轮流被复制到生成的 *.idl 文件、*.tlb,并最终在客户端的 Windows 注册表中注册。如果您遇到了 Early Bound 方法调用方面的故障,请通过将封装器 (wrappers) 中的 GUID 与在客户端的 Windows 注册表中注册的 GUID 相匹配来启动。

其它问题/技巧
Applet 无法进行直接 COM 调用,除非在下载 Applet 的计算机上安装了 WLS 许可证 (license)。
您应使用直接下载并调用 COM 对象的本地插件。或者,也可将 Applet 编码以调用 WLS 端对象,该对象进行 Applet 客户端的 COM 调用。

有关 COM、DCOM 和 jCOM 背景的详细信息,请参阅以下部分。还包括使“WLS 访问 COM”工作的步骤以及获取调试信息的步骤。同时还提供了我们的产品文档。有关 WLS 8.1 的信息,请参阅:http://e-docs.bea.com/wls/docs81/jcom/index.html

返回页首

什么是 COM?

组件对象模型 (Component Object Model , COM) 是一种软件体系结构,允许从二进制软件组件创建应用程序。COM 是底层体系结构,构成更高级别软件服务的基础,类似于 OLE 提供的服务。OLE 服务范围包括通常所需系统功能的各个方面,包括复合文档、自定义控件、应用程序间脚本、数据传输和其它的软件交互。

COM 功能
九十年代中期逐渐发展的 Microsoft 的“组件对象模型”具有以下功能:
  • 易于创建可重用的对象
  • COM 对象需要唯一 ID
    • 128 位数字全球唯一标识符 (GUID)
    • 使用 regedit 查看 CLSID
  • 与 JAVA 接口类似的 COM 接口
  • 未知接口
    • QueryInterface()
    • AddRef()
    • Release()

COM 配置
COM 服务器有四项基本配置:
  • 进程中或 DLL 服务器
  • Stand-alone EXE 服务器
  • 基于 Windows NT 的服务
  • “surrogate”服务器
进程中或 DLL 服务器
进程中服务器是作为动态链接库 (Dynamic Link Libraries, DLL) 来实现的。这就意味着服务器是在运行时动态加载到进程中的。(例如,WLS 进程中本地模式 (native-mode))

为使用 COM 服务器,必须在注册表中进行注册:
  • DLLs:Regsvr32 MyDll.dll    regsvr32 MyDll.dll /unregister
  • EXEs:Myexe.exe /regserver   Myexe.exe /unregister

Stand-alone EXE 服务器

进程外服务器无论在本地计算机上还是在远程计算机上均作为独立进程中的可执行 (EXE) 程序运行。当 COM 服务器在远程计算机上运行时,我们将其称为分布式 COM (Distributed COM, DCOM)。

基于 Windows NT 的服务
服务是由 Windows NT 自动管理的程序。这意味着即使无人登录,服务也可运行。

“surrogate”服务器
surrogate 服务器是使进程中服务器可以远程运行的程序。它们通过网络提供基于 DLL 的 COM 服务器。

有关 COM 的详细信息,请参阅以下内容:
http://www.microsoft.com/com/wpaper/default.asp#COMPapers

返回页首

什么是 DCOM?

分布式组件对象模型 (Distributed Component Object Model, DCOM) 是一种协议,使软件组件以可靠、安全和有效的方式通过网络直接通信。先前被称作“网络 OLE”的 DCOM 是为多个网络传输的使用而设计的,包括 Internet 协议,如 HTTP。DCOM 基于“开放软件基金会”的 DCE-RPC 规范,并通过使用组件对象模型 (COM) 与 Java Applet 和 ActiveX(r) 组件共同工作。

DCOM 功能

  • 网络上的 COM - 用于在网络上传输数据的“远程过程调用”
  • TCP/IP 是 jCOM 所支持的协议
  • DCOM 的安全性 - dcomcnfg - 访问和启动权限
  • 身份验证 - 使用 NT 局域网管理器 (NT Lan Manager, NTLM)
  • 身份 - 您可以作为某个用户运行 COM 对象(控制访问)
  • 断开连接 (Dcom Ping) - 用于 COM 服务器查找不再使用的对象
    • 将每隔 2 分钟向客户端发送一个 ping
    • 如果有 3 个 ping 失败,则断开与客户端的连接

有关 DCOM 的详细信息,请参阅以下内容:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndcom/html/msdn_dcomarch.asp

返回页首

jCOM 概述

什么是 jCOM?
WebLogic jCOM 用于利用现有 COM 对象。它在 COM 组件和 Java 之间提供一个双向桥。可从 COM 客户端访问 Enterprise Java Beans (EJB) 和 Java 对象;也可从 Java 客户端访问 COM 组件。



WebLogic jCOM 的纯 Java 运行时使用分层在远程过程调用 (Remote Procedure Calls, RPC) 上的分布式 COM 与 COM 组件对话,远程过程调用 (RPC) 本身分层在 TCP/IP 上。因此在最低级别,WebLogic jCOM 使用完全标准的 Java 网络类。

在 WLS 6.1 中,jCOM 作为独立于 WLS 进程的 JVM 进程运行。它在 jcom.jar 中单独打包。

在 WLS 7.0 和 WLS 8.1 中,jCOM 作为 WLS JVM 进程的一部分被集成并在 weblogic.jar 中打包。

COM 调用 Java
COM 调用 Java -- 通过 Visual Basic 调用 EJB
在全部实现中,COM 客户端在 Microsoft Windows 平台上运行。Java 组件在 Unix 或 Windows 平台上运行。“COM 调用 Java”有三种编程模型:
  • Early 绑定
  • Late 绑定
  • Zero 客户端

Early Bound 访问

Early Bound 访问使您可在编译时访问对象。可从您的 VB 客户端查看有关的方法。

优点:它比晚绑定更快,但是需要生成一个类型库。类型库提供生成时 Visual Basic 的类型信息。“早绑定访问”使调试更方便,并使运行时性能得以改进。

缺点:“早绑定访问”实现起来较复杂(需要类型库)。“类型库”必须位于“客户端”。如果 EJB 更改,则需重新生成类型库,因此适应性较差。

Late Bound 访问
对于晚绑定,编译时不提供有关访问对象的信息。在运行时对访问的对象进行动态评估。

优点:晚绑定访问在实现上方便且灵活,并且快于早绑定的运行时初始化。
       
缺点:晚绑定可能易于出错,原因在于编译时不进行类型检查。运行时事务性能不如早绑定良好。

Zero 客户端部署
客户端不需要 jCOM 特定的软件。使用名字对象参考将对象桥位置编码到 Com 客户端。

优点:注册表中不需要 WLS 特定的软件。在其它方面,Zero 客户端部署与晚绑定的优点相同。

缺点:必须将 jCOM 桥位置硬编码。在其它方面,其与晚绑定的缺点类似。

创建名字对象的方法如下:
java com.bea.jcom.GetJvmMoniker mymachine.mycompany.com 7050

在 WLS 6.1 中,主机/端口组合将是 jCOM 桥进程运行所在的位置。
在 WLS 7.0 和 8.1 中,主机/端口组合将是启用了 jCOM 的 Weblogic Server 的位置。

返回页首

使 WLS-to-COM 运行的步骤

所有 WLS 版本
在 COM 端:
  1. 生成您要使用的 COM 对象代理。
COM2Java 用于主要从 COM 对象创建 java 类
  1. 配置通过 DCOM 访问的 COM 对象
使用 setdllhost
  1. 启用 DCOM 通信
Dcomcnfg 用于配置 COM 对象的安全性
???
在 WLS 端:
  1. 将从 COM2Java 创建的类安装到类路径中
  1. 创建 JSP 以访问 COM 对象
com.bea.jcom.AuthInfo.setDefault("localhost", "username", "passwd);   
用于将通行认证设置到 dll

备注:如果您的 COM 应用程序是 DLL,则必须首先使用 SetDllHost 工具为其创建一个 surrogate EXE。创建 surrogate EXE 后,surrogate 名称即会出现在应用程序列表中。

WLS 6.1 中的 jCOM
在 WLS 6.1 中,jCOM 作为独立的 JVM 进程运行。
通过您的“技术支持”合同登录下列站点,可根据所使用的是 Windows 还是 Unix 来选择要下载的 jcom.jar
http://commerce.bea.com/support/supportversions.jsp?file=/products/weblogicserver/support/support.html#jcom 



返回页首

获取调试信息

WLS 6.1

在 JCOM 桥上:
com.bea.jcom.Log.logImmediately(3, "C:\\jcom.log");

在 java 客户端上:
java -DJCOM_LOG_LEVEL=3 htest

WLS 7.0 / WLS 8.1
在 config.xml 中:
<COM Name="myserver" VerboseLoggingEnabled="true"/>

将调试信息写入 WLS 服务器日志

备注:WLS 7.0 和 WLS 8.1 的 Xml 元素位置可能不同

外部资源

请参阅:http://e-docs.bea.com/wls/docs81/jcom/index.html

返回页首

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

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

反馈

请给我们提供您的意见,说明此支持诊断模式“jCOM 问题故障排除”一文是否有所帮助、您需要的任何解释,以及对支持诊断模式的新主题的任何要求。


免责声明:

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

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