解决RMI应用程序中的可伸缩性,性能和优化问题?

时间:2010-10-17 21:48:59

标签: performance optimization java-ee scalability rmi

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

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

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);
    }
}
 .....
}

感谢任何反馈。

jibbylala

1 个答案:

答案 0 :(得分:1)

将您的RMI逻辑与Ball逻辑分开。

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

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

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