【问题标题】:Design of Java RMI-ApplicationJava RMI-Application的设计
【发布时间】:2017-11-06 20:17:18
【问题描述】:

我有一个关于 java RMI 应用程序的具体设计的问题。我刚开始学习如何使用 rmi。我有一个小应用程序:一个小型证券交易所应用程序。所以有证券交易所类,每个人都有一个仓库类。 depot 类对市场有参考。市场类具有创建仓库的功能(它返回一个新仓库)。我想以这种方式设计应用程序,远程客户端可以获得他自己的仓库的引用,并且所有客户端共享股票市场类(因此运行时应该只有一个对象)。

我需要设计一个扩展接口“远程”的接口。该接口描述了客户端可以调用的函数。但是类证券交易所和仓库呢?他们是否需要实现或扩展一个类才能使 rmi 工作?

在我的界面中有一个函数,它打开一个新的 depot 并返回一个 depot 对象。但是当我调用那个函数时,有一个例外:

线程“main”java.lang.ClassCastException 中的异常:com.sun.proxy.$Proxy1 无法转换为软件仓库

【问题讨论】:

    标签: java rmi


    【解决方案1】:

    使用 RMI 远程对象,您不能转换为具体类 Depot。您必须投射到远程接口。

    【讨论】:

    • 是的,完全正确。但是远程接口中有一个函数,我想在其中返回对个人仓库的引用。还有一个例外,我不知道如何处理。
    • 所以是的,你正在犯这个答案中描述的Depot对象的错误。因为它显然是一个导出的远程对象,所以它作为自己的存根提供。
    【解决方案2】:

    您需要两个接口,StockExchangeDepot。这些接口中的每一个都应该扩展Remote。但是只有实现StockExchange 的类的实例才会绑定在RMI 注册表中。客户端将首先使用其名称在 RMI 注册表中查找StockExchange。从中,他们将调用一个合适的远程方法来获取对他们自己的Depot的引用。

    【讨论】:

    • 只有实现与实现类相同的远程接口的 stub 实例才绑定在注册表中。实现类对象永远不会离开它导出的 JVNM。
    • @EJB 我从来没有说过。
    • '但只有实现 StockExchange 的类的实例才会绑定在 RMI 注册表中。'。这是错误的,除非该实例离开 JVM 并进入 Registry,否则这是不可能的,而事实并非如此。
    • @EJP 我明白了。我并不是说远程对象确实以某种方式迁移到了注册表,我只是在区分他的哪些远程对象应该传递给Registry.bind()。关于您的第一条评论,我猜想存根是使用注册表中的元数据在客户端上动态生成的。注册表中实际上是否存在存根实例?它有什么用途?
    猜你喜欢
    • 2015-08-28
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多