Решение проблем масштабируемости, производительности и оптимизации в приложении RMI? - PullRequest
1 голос
/ 18 октября 2010

моя проблема: этот дизайн работает нормально для одного шара, но я не могу заставить его работать для нескольких шаров, у меня в принципе проблема с заменой "this" ключевое слово в 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 Ответ

1 голос
/ 18 октября 2010

Отделите логику RMI от логики Ball.

Вы должны иметь возможность запускать симуляцию мяча без использования каких-либо модулей RMI.Просто чтобы запустить его локально, чтобы проверить это.Затем вы должны найти способ обернуть этот процесс в RMI, чтобы вы могли запустить его локально, чтобы протестировать его без какого-либо интерфейса RMI.Этот блок кода является движком, и очень важно иметь возможность проверить его в атомарной форме, насколько это возможно.Наличие дополнительных частей, интегрированных с ним, только увеличивает сложность того, что, несомненно, будет одним из самых сложных кодов.

Не допускайте дополнительных интерфейсов в вашем движке.Это должно быть очень конкретным и несколько пакетов, необходимых для использования вашего двигателя.Любая новая функциональность, необходимая вашему программному обеспечению, должна быть реализована соответствующим образом в движке для поддержки общего дизайна.Оберните это, чтобы обеспечить определенную функциональность вне ядра двигателя.Это защищает конструкцию двигателя от изменений окружающей среды.Это также позволяет проводить более полное тестирование двигателя.

Иногда мы делаем исключения в тех случаях, когда что-то будет использоваться только одним способом.Но в этом случае тестирование без RMI может показаться критическим для правильной работы вашего двигателя.Если ваш движок работает быстрее, чем может поддерживать сеть из-за большого числа подключающихся клиентов, хотите ли вы, чтобы игра замедлялась, или клиенты отстают?Я говорю, вы хотите иметь возможность сделать этот выбор.

...