Один из быстрых способов сделать это - использовать Spring. Это не обязательно означает использование множества конфигураций XML: классы поддержки RMI в Spring можно использовать программно.
Два ключевых класса:
Преимущество такого способа состоит в том, что вам нужно только написать реализацию вашего интерфейса, и это можно сделать доступным с помощью RmiServiceExporter
. Между тем, на стороне клиента использование RmiProxyFactoryBean
дает вам прокси-объект, который реализует интерфейс. Что касается кода на стороне клиента, он работает с «реальной» реализацией интерфейса, но прокси-сервер выполняет для вас вызовы RMI. Использование RMI прозрачно.
В качестве примера того, как быстро это может быть, я только что написал сервер и клиент, используя ваш интерфейс.
Моя реализация интерфейса:
public class ApplicationImpl implements Application {
private boolean enable;
@Override
public void setLoggingEnabled(boolean enable) {
this.enable = enable;
}
@Override
public boolean isLoggingEnabled() {
return enable;
}
}
Код на стороне сервера:
RmiServiceExporter exporter = new RmiServiceExporter();
exporter.setService(new ApplicationImpl());
exporter.setServiceInterface(Application.class);
exporter.setServiceName("application");
exporter.afterPropertiesSet();
Код на стороне клиента:
RmiProxyFactoryBean pfb = new RmiProxyFactoryBean();
pfb.setServiceInterface(Application.class);
pfb.setServiceUrl("rmi://localhost/application");
pfb.afterPropertiesSet();
Application app = (Application) pfb.getObject();
System.out.println(app.isLoggingEnabled());
app.setLoggingEnabled(true);
System.out.println(app.isLoggingEnabled());
который в качестве ожидаемых результатов:
false
true