【问题标题】:Addressing Scalability,Performance and Optimization issues in RMI Application?解决 RMI 应用程序中的可扩展性、性能和优化问题?
【发布时间】:2011-04-26 17:00:33
【问题描述】:

我的问题是: 这个设计适用于一个球,但我无法让它适用于多个球,我在更换 “this”时基本上有问题updateClients () 中的 /strong> 关键字。

我认为我需要做这样的事情,但我失败了:

System.out.println("in ballimpl" + j.size());
            for (ICallback aClient : j) {
                aClient.updateClients(BallImpl[i]);
            }

目前的代码情况是:

模型远程对象,正在迭代客户端列表并调用它们的更新方法,

public class BallImpl extends UnicastRemoteObject implements Ball,Runnable {


    private List<ICallback> clients = new ArrayList<ICallback>();


    protected static ServerServices chatServer;
    static ServerServices si;

    BallImpl() throws RemoteException {
        super();
}
 ....

    public  synchronized void move() throws RemoteException {
        loc.translate((int) changeInX, (int) changeInY);
    }

    public void start() throws RemoteException {
        if (gameThread.isAlive()==false )
            if (run==false){
                  gameThread.start();

            }
    }
    /** Start the ball bouncing. */

        // Run the game logic in its own thread.

            public void run() {

                while (true) {
                    run=true;
                    // Execute one game step
                    try {
                        updateClients();
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }

                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException ex) {
                    }
                }
            }
     public void updateClients() throws RemoteException {

        si = new ServerServicesImpl();
        List<ICallback> j = si.getClientNames();
        System.out.println("in messimpl " + j.size());
        if (j != null) {
            System.out.println("in ballimpl" + j.size());
            for (ICallback aClient : j) {
                aClient.updateClients(this);
            }

        } else
            System.err.println("Clientlist is empty");
       } 
    }

正在实现回调接口并有更新方法实现的客户端:

public final class thenewBallWhatIwant implements Runnable, ICallback {

.....

@Override
public void updateClients(final Ball ball) throws RemoteException {

    try {
        ball.move();
        try {
            Thread.sleep(50);
        } catch (Exception e) {
            System.exit(0);
        }
    } catch (Exception e) {
        System.out.println("Exception: " + e);
    }
}
 .....
}

感谢您的任何反馈。

吉比拉拉

【问题讨论】:

  • 线程... rmi... 同步... 我觉得恶心:/希望我能帮忙,但我不能。考虑发布BallICallback 的接口定义

标签: performance optimization jakarta-ee scalability rmi


【解决方案1】:

将 RMI 逻辑与 Ball 逻辑分开。

您应该能够在不需要任何 RMI 模块的情况下运行您的球模拟。只是在本地运行它,测试它。然后,您应该找到一种方法将该进程包装在 RMI 中,以便您仍然可以在本地运行它以在没有任何类型的 RMI 接口的情况下对其进行测试。这段代码就是引擎,能够以尽可能原子的形式对其进行测试非常重要。与它集成额外的部分只会增加一些毫无疑问的最复杂代码的复杂性。

不要让任何额外的接口进入您的引擎。它应该非常具体,并且使用引擎所需的软件包很少。您的软件需要的任何新功能,在引擎中适当地实现它以支持通用设计。包装它以提供引擎核心之外的特定功能。这可以保护发动机设计免受环境变化的影响。它还允许对引擎进行更完整的测试。

我们有时会在某些东西只能以一种方式使用的情况下进行例外处理。但在这种情况下,没有 RMI 的测试似乎对于让您的引擎正常工作至关重要。如果您的引擎由于大量客户端连接而运行速度超过网络可以跟上的速度,您希望整个游戏变慢,还是希望客户端落后?我说,你希望能够做出这样的选择。

【讨论】:

  • 完全在一个单独的问题上,我不相信 RMI 是适合您项目的解决方案。但是,当这两个项目是不同的代码包时,这一点会变得很明显。
  • 谢谢!,我想你勾勒出一张通用图片,但就其实现而言仍然很模糊(RMI 逻辑?),我谈到了我遇到并正在寻找的具体问题对于它的解耦解决方案,我已经考虑过了;球是远程对象,因此多个客户端可以调用它的函数,如 move() 和其他函数,如果你可以在代码中实现你的想法,我在我的不同问题中展示了这将是很棒的。
  • 没有ball 扩展RemoteUnicastObject。不要抛出RemoteException,也不要担心通知客户。只需担心创建球并让它们移动。你可以做很多事情来测试它,但要确保代码存在于引擎之外以移动你的球。完成后,围绕它构建您的客户端-服务器通信。
  • 好的,我已经这样做了,我为此创建了一个序列化类 =),你期望它有什么变化以及你为什么要这样做。它会优化该设计吗?而我这样做是出于另一个原因……我正在拼命寻找此设计中的优化和可扩展性
  • 如果我有 100 个球和其他像球这样的对象,您将如何管理我现在关心的那些...因为您必须将它们全部注册为远程对象并在 RMI 注册表中查找它们我对此不满意......
猜你喜欢
  • 2010-10-09
  • 2014-09-13
  • 2011-07-09
  • 2015-07-09
  • 2010-09-30
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多