Служба RMI работает аналогично сокетам

Итак, если у меня есть сервер сокетов, я могу принять каждый сокет и передать его исполняющему

while(true){
            Socket conn = socketServ.accept();
            Runnable task = new Runnable() {
                @Override
                public void run() {
                    try{
                        server.executor(conn);
                    } catch(IOException e){

                    }
                }
            };
            exec1.execute(task);
        }

Это позволяет моему серверу работать с моими потоками и не блокирует один и тот же поток. Поскольку у меня также есть ссылка на этот сокет... называемый "conn", я также могу успешно возвращать сообщения.

Теперь у меня есть интерфейс RMI, который позволяет мне вызывать методы туда и обратно.

например, если бы у меня был этот метод:

public MusicServerResponseImpl CreatePlayerlist(String Name, UserObjectImpl uo) throws RemoteException {
        MusicServerResponseImpl res = new MusicServerResponseImpl();



        return res;
    }

Который возвращает сериализуемый объект. Меня беспокоит то, что когда это сообщение будет вызвано, я думаю, что оно будет вызвано в основном потоке сервера и, таким образом, заблокирует этот поток и замедлит параллелизм.

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

Имеет ли это смысл? В основном я спрашиваю, как я могу выполнять параллельно с методами RMI, но при этом иметь возможность возвращать результаты!

Спасибо за помощь!


person billybob2    schedule 01.05.2019    source источник


Ответы (1)


Имеет ли это смысл?

Нет. Одновременные вызовы изначально поддерживаются.

См. эту страницу документации и найдите свойство с именем maxConnectionThreads.

Вы также могли бы проверить свои предположения, например, распечатав имя текущего потока в коде вашего сервера и попытавшись выполнить параллельные вызовы и посмотреть, что произойдет.

person JB Nizet    schedule 01.05.2019
comment
Ладно.. не понял. Думаю, это сильно облегчает мне жизнь. Итак, вы говорите, что изначально он будет работать в многопоточном режиме - person billybob2; 01.05.2019