![]() |
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 名称的更改引起的。
COM2JAVA 错误 COM2JAVA 出现以下错误:
“No Object for Moniker”
备注:如果您没有创建 weblogic.jndi.Environment 对象(在获得身份验证的连接时要创建的第一个对象)的权限,您将看到“No object for moniker”消息。此处错误由权限配置(在 WLS 端)引起,并非由失败的 jCOM jvm 注册表或有故障的 ORM 引起。
“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 配置 COM 服务器有四项基本配置:
进程中服务器是作为动态链接库 (Dynamic Link Libraries, DLL) 来实现的。这就意味着服务器是在运行时动态加载到进程中的。(例如,WLS 进程中本地模式 (native-mode)) 为使用 COM 服务器,必须在注册表中进行注册:
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 功能
有关 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 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 端:
COM2Java 用于主要从 COM 对象创建 java 类
使用 setdllhost
Dcomcnfg 用于配置 COM 对象的安全性
??? 在 WLS 端:
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 |
| 已知问题 您可以定期查看您的 |
| 需要更多帮助? 如果您已经理解这个模式,但仍需要其它帮助,您可以:
|
|
反馈 请给我们提供您的意见,说明此支持诊断模式“jCOM 问题故障排除”一文是否有所帮助、您需要的任何解释,以及对支持诊断模式的新主题的任何要求。 |
|
免责声明: 依据 BEA 与您签署的维护和支持协议条款,BEA Systems, Inc. 在本网站上提供技术技巧和补丁供您使用。虽然您可以将这些信息和代码与您获得 BEA 授权的软件一起使用,但 BEA 并不对所提供的技术技巧和修补程序做任何形式的担保,无论是明确的还是隐含的。 本文档中引用的任何商标是其各自所有者的财产。有关完整的商标信息,请参考您的产品手册。 |